tx · CgW8Kzru4Cuxd1d4czQtFpBfKjvcedupZSWrk92HDaWi

3MsXpzisJAwnzUr7XrEoW1BZo4U6rw4tsYK:  -0.14000000 Waves

2022.11.15 09:49 [2317901] smart account 3MsXpzisJAwnzUr7XrEoW1BZo4U6rw4tsYK > SELF 0.00000000 Waves

{ "type": 13, "id": "CgW8Kzru4Cuxd1d4czQtFpBfKjvcedupZSWrk92HDaWi", "fee": 14000000, "feeAssetId": null, "timestamp": 1668495004515, "version": 2, "chainId": 84, "sender": "3MsXpzisJAwnzUr7XrEoW1BZo4U6rw4tsYK", "senderPublicKey": "FFdBua5rzzMkZebvsvmN7sAdU7XhFK8QNJ3hiwwxAYRA", "proofs": [ "2VAo86bYhGsJ1bQCY7rrx4NJPCVwwLbFQZUkGQDVtpTMmhCRv5JgCbDhaxwWsjUtgA1LY27HbPXaosYYE7vPWM3v", "4n5cCz4TMiogLegq9i6CP2PQzhVdk8mxv13icpz7yDwHBptNsth5ks9UWnttkeH1CjVAcDDQs6KLDzsWC1QAz3LM" ], "script": "base64:BgJcCAISAwoBCBIDCgEIEgMKAQgSBAoCCAESBQoDAggBEgUKAwgBARIECgIICBIECgIIARIFCgMCCAESAwoBCBIECgIIAhIDCgEIEgMKARgSAwoBGBIECgIICBIAEgBaAAdrQWN0aXZlAgZhY3RpdmUAC2tBY3RpdmVHbG9iAhRhY3RpdmVfYWxsX2NvbnRyYWN0cwAGa0NhdXNlAg5zaHV0ZG93bl9jYXVzZQAaa1Jld2FyZFBvb2xGcmFjdGlvbkN1cnJlbnQCHV9jdXJyZW50X3Bvb2xfZnJhY3Rpb25fcmV3YXJkABtrUmV3YXJkUG9vbEZyYWN0aW9uUHJldmlvdXMCHl9wcmV2aW91c19wb29sX2ZyYWN0aW9uX3Jld2FyZAATa0hlaWdodFBvb2xGcmFjdGlvbgIaX3Bvb2xfcmV3YXJkX3VwZGF0ZV9oZWlnaHQAG2tUb3RhbFJld2FyZFBlckJsb2NrQ3VycmVudAIedG90YWxfcmV3YXJkX3Blcl9ibG9ja19jdXJyZW50ABxrVG90YWxSZXdhcmRQZXJCbG9ja1ByZXZpb3VzAh90b3RhbF9yZXdhcmRfcGVyX2Jsb2NrX3ByZXZpb3VzABNrUmV3YXJkVXBkYXRlSGVpZ2h0AhRyZXdhcmRfdXBkYXRlX2hlaWdodAAWa1VzZXJTaGFyZVRva2Vuc1N0YWtlZAIUX3NoYXJlX3Rva2Vuc19sb2NrZWQAFmtVc2VyU2hhcmVUb2tlbnNMb2NrZWQCFV9zaGFyZV90b2tlbnNfYmxvY2tlZAAaa1VzZXJTaGFyZVRva2Vuc0xvY2tlZFR5cGUCGl9zaGFyZV90b2tlbnNfYmxvY2tlZF90eXBlABxrVXNlclNoYXJlVG9rZW5zTG9ja2VkSGVpZ2h0Ahxfc2hhcmVfdG9rZW5zX2Jsb2NrZWRfaGVpZ2h0ABdrVXNlclNoYXJlVG9rZW5zVmlydHVhbAIVX3NoYXJlX3Rva2Vuc192aXJ0dWFsABZrU2hhcmVUb3RhbFNoYXJlVG9rZW5zAhpfdG90YWxfc2hhcmVfdG9rZW5zX2xvY2tlZAATa1NoYXJlVG9rZW5zVmlydHVhbAIbX3RvdGFsX3NoYXJlX3Rva2Vuc192aXJ0dWFsAAtrTG9ja1BhcmFtcwIMX2xvY2tfcGFyYW1zAA1rTG9ja1dhdmVzRmVlAg5sb2NrX3dhdmVzX2ZlZQAOa1Bvb2xCb29zdENvZWYCC19ib29zdF9jb2VmABFrRmFybUxhc3RJbnRlcmVzdAIOX2xhc3RfaW50ZXJlc3QAFWtGYXJtVXNlckxhc3RJbnRlcmVzdAIOX2xhc3RfaW50ZXJlc3QAEmtCb29zdExhc3RJbnRlcmVzdAIQX2xhc3RfaW50ZXJlc3RfYgAWa0Jvb3N0VXNlckxhc3RJbnRlcmVzdAISX2xhc3RfaW50ZXJlc3RfdV9iABRrQm9vc3RMUExhc3RJbnRlcmVzdAISX2xhc3RfaW50ZXJlc3RfbHBiABhrQm9vc3RMUFVzZXJMYXN0SW50ZXJlc3QCFF9sYXN0X2ludGVyZXN0X3VfbHBiABNrTGFzdEludGVyZXN0SGVpZ2h0AhVfbGFzdF9pbnRlcmVzdF9oZWlnaHQAB2tTV09QaWQCB1NXT1BfaWQADmtBdmFpbGFibGVTV09QAg9fYXZhaWxhYmxlX1NXT1AAEWtTd29wWWVhckVtaXNzaW9uAhJzd29wX3llYXJfZW1pc3Npb24AEGtIYXJ2ZXN0UG9vbFZvdGUCGF9oYXJ2ZXN0X3Bvb2xfdm90ZV9nU1dPUAAJa1Bvb2xWb3RlAhBfcG9vbF92b3RlX2dTV09QAA1rVXNlclBvb2xWb3RlAhBfdXNlcl92b3RlX2dTV09QABRrSGFydmVzdFVzZXJQb29sVm90ZQIdX2hhcnZlc3RfdXNlcl9wb29sX3ZvdGVfZ1NXT1AAE2tGaXJzdEhhcnZlc3RIZWlnaHQCFGZpcnN0X2hhcnZlc3RfaGVpZ2h0AA1rU2hhcmVMaW1pdEZIAhxzaGFyZV9saW1pdF9vbl9maXJzdF9oYXJ2ZXN0AA1rQ3BtbUNvbnRyYWN0Ag1jcG1tX2NvbnRyYWN0AA1rQWRtaW5QdWJLZXkxAgthZG1pbl9wdWJfMQANa0FkbWluUHViS2V5MgILYWRtaW5fcHViXzIADWtBZG1pblB1YktleTMCC2FkbWluX3B1Yl8zABJrQWRtaW5JbnZva2VQdWJLZXkCEGFkbWluX2ludm9rZV9wdWIAEGtNb25leUJveEFkZHJlc3MCEW1vbmV5X2JveF9hZGRyZXNzAA5rVm90aW5nQWRkcmVzcwIOdm90aW5nX2FkZHJlc3MAC2tHb3ZBZGRyZXNzAhJnb3Zlcm5hbmNlX2FkZHJlc3MAEWtMUEZhcm1pbmdBZGRyZXNzAgpscF9mYXJtaW5nABRrRmFybWluZ1RyZWFzdXJlQWRkcgIQZmFybWluZ190cmVhc3VyZQAGb3JhY2xlCQEHQWRkcmVzcwEBGgFUSBOXDMDTM8wlMoC2KfenZGiAq+PMe0uZAA50b3RhbFZvdGVTaGFyZQCAyK+gJQALc2NhbGVWYWx1ZTgAgMLXLwASbG9ja0Jvb3N0Q29lZlNjYWxlAOgHABBkZWZQb29sQm9vc3RDb2VmAPQDARNnZXRCYXNlNThGcm9tT3JhY2xlAQNrZXkEByRtYXRjaDAJAJ0IAgUGb3JhY2xlBQNrZXkDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAZzdHJpbmcFByRtYXRjaDAJANkEAQUGc3RyaW5nBAdub3RoaW5nBQckbWF0Y2gwCQACAQkArAICBQNrZXkCCGlzIGVtcHR5AAxhZG1pblB1YktleTEJARNnZXRCYXNlNThGcm9tT3JhY2xlAQUNa0FkbWluUHViS2V5MQAMYWRtaW5QdWJLZXkyCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFDWtBZG1pblB1YktleTIADGFkbWluUHViS2V5MwkBE2dldEJhc2U1OEZyb21PcmFjbGUBBQ1rQWRtaW5QdWJLZXkzAA9tb25leUJveEFkZHJlc3MJAQdBZGRyZXNzAQkBE2dldEJhc2U1OEZyb21PcmFjbGUBBRBrTW9uZXlCb3hBZGRyZXNzAA12b3RpbmdBZGRyZXNzCQEHQWRkcmVzcwEJARNnZXRCYXNlNThGcm9tT3JhY2xlAQUOa1ZvdGluZ0FkZHJlc3MACmdvdkFkZHJlc3MJAQdBZGRyZXNzAQkBE2dldEJhc2U1OEZyb21PcmFjbGUBBQtrR292QWRkcmVzcwARYWRtaW5JbnZva2VQdWJLZXkJARNnZXRCYXNlNThGcm9tT3JhY2xlAQUSa0FkbWluSW52b2tlUHViS2V5ABBscEZhcm1pbmdBZGRyZXNzCQEHQWRkcmVzcwEJARNnZXRCYXNlNThGcm9tT3JhY2xlAQURa0xQRmFybWluZ0FkZHJlc3MAE2Zhcm1pbmdUcmVhc3VyZUFkZHIJAQdBZGRyZXNzAQkBE2dldEJhc2U1OEZyb21PcmFjbGUBBRRrRmFybWluZ1RyZWFzdXJlQWRkcgAMY3BtbUNvbnRyYWN0CQEHQWRkcmVzcwEJARNnZXRCYXNlNThGcm9tT3JhY2xlAQUNa0NwbW1Db250cmFjdAAGYWN0aXZlCQERQGV4dHJOYXRpdmUoMTA1MSkCBQR0aGlzBQdrQWN0aXZlAAphY3RpdmVHbG9iCQELdmFsdWVPckVsc2UCCQCbCAIFBm9yYWNsZQULa0FjdGl2ZUdsb2IGAARTV09QCQDZBAEJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMFB2tTV09QaWQBFWdldEhlaWdodEZpcnN0SGFydmVzdAEEcG9vbAkBC3ZhbHVlT3JFbHNlAgkAmggCCQEHQWRkcmVzcwEJANkEAQUEcG9vbAUTa0ZpcnN0SGFydmVzdEhlaWdodAAAARRnZXRGSFNoYXJlTGltaXRUb2tlbgEEcG9vbAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFBHBvb2wFDWtTaGFyZUxpbWl0RkgJAKwCAgIUTm8gZGF0YSBvbiB0aGUga2V5OiAFDWtTaGFyZUxpbWl0RkgBEmdldFRvdGFsU2hhcmVUb2tlbgEEcG9vbAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAUWa1NoYXJlVG90YWxTaGFyZVRva2VucwkArAICCQCsAgICFE5vIGRhdGEgb24gdGhlIGtleTogBQRwb29sBRZrU2hhcmVUb3RhbFNoYXJlVG9rZW5zAQxnZXRQb29sVm90ZWQBBHBvb2wJAQt2YWx1ZU9yRWxzZQIJAJoIAgUNdm90aW5nQWRkcmVzcwkArAICBQRwb29sBQlrUG9vbFZvdGUAAAEQZ2V0VXNlclBvb2xWb3RlZAIEcG9vbAR1c2VyCQELdmFsdWVPckVsc2UCCQCaCAIFDXZvdGluZ0FkZHJlc3MJAKwCAgkArAICCQCsAgIFBHVzZXICAV8FBHBvb2wFDWtVc2VyUG9vbFZvdGUAAAEPZ2V0U2hhcmVBc3NldElkAQRwb29sCQDZBAEJARFAZXh0ck5hdGl2ZSgxMDUzKQIJAQV2YWx1ZQEJAKYIAQUEcG9vbAIOc2hhcmVfYXNzZXRfaWQBDmFjY291bnRCYWxhbmNlAQdhc3NldElkBAckbWF0Y2gwBQdhc3NldElkAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAmlkBQckbWF0Y2gwCQDwBwIFBHRoaXMFAmlkAwkAAQIFByRtYXRjaDACBFVuaXQEBXdhdmVzBQckbWF0Y2gwCAkA7wcBBQR0aGlzCWF2YWlsYWJsZQkAAgECC01hdGNoIGVycm9yAQ5jYWxjU2NhbGVWYWx1ZQIIYXNzZXRJZDEIYXNzZXRJZDIEEGFzc2V0SWQxRGVjaW1hbHMICQEFdmFsdWUBCQDsBwEFCGFzc2V0SWQxCGRlY2ltYWxzBBBhc3NldElkMkRlY2ltYWxzCAkBBXZhbHVlAQkA7AcBBQhhc3NldElkMghkZWNpbWFscwQLc2NhbGVEaWdpdHMJAGQCCQBlAgUQYXNzZXRJZDJEZWNpbWFscwUQYXNzZXRJZDFEZWNpbWFscwAICQBsBgAKAAAFC3NjYWxlRGlnaXRzAAAAAAUERE9XTgERdXNlckF2YWlsYWJsZVNXT1ACBHBvb2wEdXNlcgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyBQ5rQXZhaWxhYmxlU1dPUAAAAQpyZXdhcmRJbmZvAQRwb29sBBp0b3RhbFJld2FyZFBlckJsb2NrQ3VycmVudAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFCmdvdkFkZHJlc3MFG2tUb3RhbFJld2FyZFBlckJsb2NrQ3VycmVudAkArAICCQCsAgIJAKwCAgIUTm8gZGF0YSBvbiB0aGUga2V5OiAFG2tUb3RhbFJld2FyZFBlckJsb2NrQ3VycmVudAIMIGF0IGFkZHJlc3MgCQClCAEFCmdvdkFkZHJlc3MEG3RvdGFsUmV3YXJkUGVyQmxvY2tQcmV2aW91cwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFCmdvdkFkZHJlc3MFHGtUb3RhbFJld2FyZFBlckJsb2NrUHJldmlvdXMJAKwCAgkArAICCQCsAgICFE5vIGRhdGEgb24gdGhlIGtleTogBRxrVG90YWxSZXdhcmRQZXJCbG9ja1ByZXZpb3VzAgwgYXQgYWRkcmVzcyAJAKUIAQUKZ292QWRkcmVzcwQZcmV3YXJkUG9vbEZyYWN0aW9uQ3VycmVudAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFCmdvdkFkZHJlc3MJAKwCAgUEcG9vbAUaa1Jld2FyZFBvb2xGcmFjdGlvbkN1cnJlbnQJAKwCAgkArAICCQCsAgIJAKwCAgIUTm8gZGF0YSBvbiB0aGUga2V5OiAFBHBvb2wFGmtSZXdhcmRQb29sRnJhY3Rpb25DdXJyZW50AgwgYXQgYWRkcmVzcyAJAKUIAQUKZ292QWRkcmVzcwQScmV3YXJkVXBkYXRlSGVpZ2h0CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUKZ292QWRkcmVzcwUTa1Jld2FyZFVwZGF0ZUhlaWdodAkArAICCQCsAgIJAKwCAgIUTm8gZGF0YSBvbiB0aGUga2V5OiAFE2tSZXdhcmRVcGRhdGVIZWlnaHQCDCBhdCBhZGRyZXNzIAkApQgBBQpnb3ZBZGRyZXNzBBZwb29sUmV3YXJkVXBkYXRlSGVpZ2h0CQELdmFsdWVPckVsc2UCCQCaCAIFCmdvdkFkZHJlc3MJAKwCAgUEcG9vbAUTa0hlaWdodFBvb2xGcmFjdGlvbgUScmV3YXJkVXBkYXRlSGVpZ2h0BBpyZXdhcmRQb29sRnJhY3Rpb25QcmV2aW91cwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFCmdvdkFkZHJlc3MJAKwCAgUEcG9vbAUba1Jld2FyZFBvb2xGcmFjdGlvblByZXZpb3VzCQCsAgIJAKwCAgkArAICCQCsAgICFE5vIGRhdGEgb24gdGhlIGtleTogBQRwb29sBRtrUmV3YXJkUG9vbEZyYWN0aW9uUHJldmlvdXMCDCBhdCBhZGRyZXNzIAkApQgBBQpnb3ZBZGRyZXNzBBFyZXdhcmRQb29sQ3VycmVudAkAawMFGnRvdGFsUmV3YXJkUGVyQmxvY2tDdXJyZW50BRlyZXdhcmRQb29sRnJhY3Rpb25DdXJyZW50BQ50b3RhbFZvdGVTaGFyZQQScmV3YXJkUG9vbFByZXZpb3VzCQBrAwUadG90YWxSZXdhcmRQZXJCbG9ja0N1cnJlbnQFGnJld2FyZFBvb2xGcmFjdGlvblByZXZpb3VzBQ50b3RhbFZvdGVTaGFyZQMDCQBmAgURcmV3YXJkUG9vbEN1cnJlbnQFGnRvdGFsUmV3YXJkUGVyQmxvY2tDdXJyZW50BgkAZgIFEnJld2FyZFBvb2xQcmV2aW91cwUbdG90YWxSZXdhcmRQZXJCbG9ja1ByZXZpb3VzCQACAQJicmV3YXJkUG9vbEN1cnJlbnQgPiB0b3RhbFJld2FyZFBlckJsb2NrQ3VycmVudCBvciByZXdhcmRQb29sUHJldmlvdXMgPiB0b3RhbFJld2FyZFBlckJsb2NrUHJldmlvdXMJAJYKBAURcmV3YXJkUG9vbEN1cnJlbnQFEnJld2FyZFVwZGF0ZUhlaWdodAUScmV3YXJkUG9vbFByZXZpb3VzBRZwb29sUmV3YXJkVXBkYXRlSGVpZ2h0ARNnZXRMYXN0SW50ZXJlc3RJbmZvAQRwb29sBAxmYXJtSW50ZXJlc3QJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQR0aGlzCQCsAgIFBHBvb2wFEWtGYXJtTGFzdEludGVyZXN0CQCsAgIJAKwCAgIUTm8gZGF0YSBvbiB0aGUga2V5OiAFBHBvb2wFEWtGYXJtTGFzdEludGVyZXN0BA1ib29zdEludGVyZXN0CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBRJrQm9vc3RMYXN0SW50ZXJlc3QJAKwCAgkArAICAhRObyBkYXRhIG9uIHRoZSBrZXk6IAUEcG9vbAUSa0Jvb3N0TGFzdEludGVyZXN0BA9ib29zdExQSW50ZXJlc3QJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQR0aGlzCQCsAgIFBHBvb2wFFGtCb29zdExQTGFzdEludGVyZXN0CQCsAgIJAKwCAgIUTm8gZGF0YSBvbiB0aGUga2V5OiAFBHBvb2wFFGtCb29zdExQTGFzdEludGVyZXN0BBJsYXN0SW50ZXJlc3RIZWlnaHQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBRNrTGFzdEludGVyZXN0SGVpZ2h0BQZoZWlnaHQJAJYKBAUSbGFzdEludGVyZXN0SGVpZ2h0BQxmYXJtSW50ZXJlc3QFDWJvb3N0SW50ZXJlc3QFD2Jvb3N0TFBJbnRlcmVzdAELY2FsY0Zhcm1Sd2QCBHBvb2wOY3VyVG90YWxSZXdhcmQEDXBvb2xCb29zdENvZWYJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBQ5rUG9vbEJvb3N0Q29lZgUQZGVmUG9vbEJvb3N0Q29lZgkAawMFDmN1clRvdGFsUmV3YXJkBRJsb2NrQm9vc3RDb2VmU2NhbGUJAGQCBQ1wb29sQm9vc3RDb2VmBRJsb2NrQm9vc3RDb2VmU2NhbGUBDGNhbGNCb29zdFJ3ZAIEcG9vbA5jdXJUb3RhbFJld2FyZAQNcG9vbEJvb3N0Q29lZgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHBvb2wFDmtQb29sQm9vc3RDb2VmBRBkZWZQb29sQm9vc3RDb2VmCQBrAwUOY3VyVG90YWxSZXdhcmQFDXBvb2xCb29zdENvZWYJAGQCBQ1wb29sQm9vc3RDb2VmBRJsb2NrQm9vc3RDb2VmU2NhbGUBDGNhbGNJbnRlcmVzdAwEcG9vbBJsYXN0SW50ZXJlc3RIZWlnaHQScmV3YXJkVXBkYXRlSGVpZ2h0FnBvb2xSZXdhcmRVcGRhdGVIZWlnaHQMZmFybUludGVyZXN0DWJvb3N0SW50ZXJlc3QJcG9vbFZvdGVkD2Jvb3N0THBJbnRlcmVzdBVjdXJyZW50UmV3YXJkUGVyQmxvY2sQc2hhcmVUb2tlbkxvY2tlZBZwcmV2aW91c1Jld2FyZFBlckJsb2NrCnNjYWxlVmFsdWUDCQAAAgUQc2hhcmVUb2tlbkxvY2tlZAAACQCVCgMFDGZhcm1JbnRlcmVzdAUNYm9vc3RJbnRlcmVzdAUPYm9vc3RMcEludGVyZXN0BAwkdDA5Njk3MTExMTADAwMJAGYCBRJyZXdhcmRVcGRhdGVIZWlnaHQFBmhlaWdodAkAAAIFEnJld2FyZFVwZGF0ZUhlaWdodAUWcG9vbFJld2FyZFVwZGF0ZUhlaWdodAcGAwkAZgIFBmhlaWdodAUScmV3YXJkVXBkYXRlSGVpZ2h0CQECIT0CBRJyZXdhcmRVcGRhdGVIZWlnaHQFFnBvb2xSZXdhcmRVcGRhdGVIZWlnaHQHBAFyCQBoAgUWcHJldmlvdXNSZXdhcmRQZXJCbG9jawkAZQIFBmhlaWdodAUSbGFzdEludGVyZXN0SGVpZ2h0CQCWCgQFAXIFDGZhcm1JbnRlcmVzdAUNYm9vc3RJbnRlcmVzdAUPYm9vc3RMcEludGVyZXN0AwMDCQBmAgUGaGVpZ2h0BRJyZXdhcmRVcGRhdGVIZWlnaHQJAAACBRJyZXdhcmRVcGRhdGVIZWlnaHQFFnBvb2xSZXdhcmRVcGRhdGVIZWlnaHQHCQBmAgUSbGFzdEludGVyZXN0SGVpZ2h0BRJyZXdhcmRVcGRhdGVIZWlnaHQHBAFyCQBoAgUVY3VycmVudFJld2FyZFBlckJsb2NrCQBlAgUGaGVpZ2h0BRJsYXN0SW50ZXJlc3RIZWlnaHQJAJYKBAUBcgUMZmFybUludGVyZXN0BQ1ib29zdEludGVyZXN0BQ9ib29zdExwSW50ZXJlc3QECXJ3ZEJmclVwZAkAaAIFFnByZXZpb3VzUmV3YXJkUGVyQmxvY2sJAGUCBRJyZXdhcmRVcGRhdGVIZWlnaHQFEmxhc3RJbnRlcmVzdEhlaWdodAQGZkJmclVwCQBkAgUMZmFybUludGVyZXN0CQBrAwkBC2NhbGNGYXJtUndkAgUEcG9vbAUJcndkQmZyVXBkBQpzY2FsZVZhbHVlBRBzaGFyZVRva2VuTG9ja2VkBAZiQmZyVXAJAGQCBQ1ib29zdEludGVyZXN0AwkAZgIFCXBvb2xWb3RlZAAACQBrAwkBDGNhbGNCb29zdFJ3ZAIFBHBvb2wFCXJ3ZEJmclVwZAULc2NhbGVWYWx1ZTgFCXBvb2xWb3RlZAAABAhiTFBCZnJVcAkAZAIFD2Jvb3N0THBJbnRlcmVzdAMJAGYCBQlwb29sVm90ZWQAAAkAawMJAGsDCQEMY2FsY0Jvb3N0UndkAgUEcG9vbAUJcndkQmZyVXBkBQtzY2FsZVZhbHVlOAUQc2hhcmVUb2tlbkxvY2tlZAULc2NhbGVWYWx1ZTgFCXBvb2xWb3RlZAAABANyd2QJAGgCBRVjdXJyZW50UmV3YXJkUGVyQmxvY2sJAGUCBQZoZWlnaHQFEnJld2FyZFVwZGF0ZUhlaWdodAkAlgoEBQNyd2QFBmZCZnJVcAUGYkJmclVwBQhiTFBCZnJVcAQGcmV3YXJkCAUMJHQwOTY5NzExMTEwAl8xBA5mYXJtSW50ckJlZm9yZQgFDCR0MDk2OTcxMTExMAJfMgQPYm9vc3RJbnRyQmVmb3JlCAUMJHQwOTY5NzExMTEwAl8zBBFib29zdExQSW50ckJlZm9yZQgFDCR0MDk2OTcxMTExMAJfNAQPbmV3RmFybUludGVyZXN0CQBkAgUOZmFybUludHJCZWZvcmUJAGsDCQELY2FsY0Zhcm1Sd2QCBQRwb29sBQZyZXdhcmQFCnNjYWxlVmFsdWUFEHNoYXJlVG9rZW5Mb2NrZWQEEG5ld0Jvb3N0SW50ZXJlc3QJAGQCBQ9ib29zdEludHJCZWZvcmUDCQBmAgUJcG9vbFZvdGVkAAAJAGsDCQEMY2FsY0Jvb3N0UndkAgUEcG9vbAUGcmV3YXJkBQtzY2FsZVZhbHVlOAUJcG9vbFZvdGVkAAAEEm5ld0Jvb3N0TFBJbnRlcmVzdAkAZAIFEWJvb3N0TFBJbnRyQmVmb3JlAwkAZgIFCXBvb2xWb3RlZAAACQBrAwkAawMJAQxjYWxjQm9vc3RSd2QCBQRwb29sBQZyZXdhcmQFC3NjYWxlVmFsdWU4BRBzaGFyZVRva2VuTG9ja2VkBQtzY2FsZVZhbHVlOAUJcG9vbFZvdGVkAAAJAJUKAwUPbmV3RmFybUludGVyZXN0BRBuZXdCb29zdEludGVyZXN0BRJuZXdCb29zdExQSW50ZXJlc3QBCWNsYWltQ2FsYwIEcG9vbAR1c2VyBApzY2FsZVZhbHVlCQEOY2FsY1NjYWxlVmFsdWUCBQRTV09QCQEPZ2V0U2hhcmVBc3NldElkAQUEcG9vbAQJcG9vbFZvdGVkCQEMZ2V0UG9vbFZvdGVkAQUEcG9vbAQKdVBvb2xWb3RlZAkBEGdldFVzZXJQb29sVm90ZWQCBQRwb29sBQR1c2VyBApzaGFyZVRva2VuCQESZ2V0VG90YWxTaGFyZVRva2VuAQUEcG9vbAQRdG90YWxTaGFyZVZpcnR1YWwJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBRNrU2hhcmVUb2tlbnNWaXJ0dWFsBQpzaGFyZVRva2VuBA0kdDAxMjA1OTEyMTU3CQETZ2V0TGFzdEludGVyZXN0SW5mbwEFBHBvb2wEEmxhc3RJbnRlcmVzdEhlaWdodAgFDSR0MDEyMDU5MTIxNTcCXzEEDGZhcm1JbnRlcmVzdAgFDSR0MDEyMDU5MTIxNTcCXzIEDWJvb3N0SW50ZXJlc3QIBQ0kdDAxMjA1OTEyMTU3Al8zBA9ib29zdExQSW50ZXJlc3QIBQ0kdDAxMjA1OTEyMTU3Al80BA0kdDAxMjE2MjEyMjc2CQEKcmV3YXJkSW5mbwEFBHBvb2wEFWN1cnJlbnRSZXdhcmRQZXJCbG9jawgFDSR0MDEyMTYyMTIyNzYCXzEEEnJld2FyZFVwZGF0ZUhlaWdodAgFDSR0MDEyMTYyMTIyNzYCXzIEFnByZXZpb3VzUmV3YXJkUGVyQmxvY2sIBQ0kdDAxMjE2MjEyMjc2Al8zBBZwb29sUmV3YXJkVXBkYXRlSGVpZ2h0CAUNJHQwMTIxNjIxMjI3NgJfNAQNdUZhcm1JbnRlcmVzdAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyBRVrRmFybVVzZXJMYXN0SW50ZXJlc3QFDGZhcm1JbnRlcmVzdAQOdUJvb3N0SW50ZXJlc3QJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgUWa0Jvb3N0VXNlckxhc3RJbnRlcmVzdAUNYm9vc3RJbnRlcmVzdAQQdUJvb3N0TFBJbnRlcmVzdAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyBRhrQm9vc3RMUFVzZXJMYXN0SW50ZXJlc3QFD2Jvb3N0TFBJbnRlcmVzdAQSdVNoYXJlVG9rZW5zU3Rha2VkCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXIFFmtVc2VyU2hhcmVUb2tlbnNTdGFrZWQAAAQQdVNoYXJlVG9rZW5zVmlydAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyBRdrVXNlclNoYXJlVG9rZW5zVmlydHVhbAUSdVNoYXJlVG9rZW5zU3Rha2VkBA0kdDAxMjg0NDEzMjM3CQEMY2FsY0ludGVyZXN0DAUEcG9vbAUSbGFzdEludGVyZXN0SGVpZ2h0BRJyZXdhcmRVcGRhdGVIZWlnaHQFFnBvb2xSZXdhcmRVcGRhdGVIZWlnaHQFDGZhcm1JbnRlcmVzdAUNYm9vc3RJbnRlcmVzdAUJcG9vbFZvdGVkBQ9ib29zdExQSW50ZXJlc3QFFWN1cnJlbnRSZXdhcmRQZXJCbG9jawURdG90YWxTaGFyZVZpcnR1YWwFFnByZXZpb3VzUmV3YXJkUGVyQmxvY2sFCnNjYWxlVmFsdWUED25ld0Zhcm1JbnRlcmVzdAgFDSR0MDEyODQ0MTMyMzcCXzEEEG5ld0Jvb3N0SW50ZXJlc3QIBQ0kdDAxMjg0NDEzMjM3Al8yBBJuZXdCb29zdExQSW50ZXJlc3QIBQ0kdDAxMjg0NDEzMjM3Al8zBAxjbGFpbUZhcm1pbmcJAGsDBRB1U2hhcmVUb2tlbnNWaXJ0CQBlAgUPbmV3RmFybUludGVyZXN0BQ11RmFybUludGVyZXN0BQpzY2FsZVZhbHVlBBBjbGFpbUJvb3N0aW5nTWF4CQBrAwUKdVBvb2xWb3RlZAkAZQIFEG5ld0Jvb3N0SW50ZXJlc3QFDnVCb29zdEludGVyZXN0BQtzY2FsZVZhbHVlOAQDbXVsCQC8AgMJALYCAQUQdVNoYXJlVG9rZW5zVmlydAkAtgIBBQp1UG9vbFZvdGVkCQC2AgEAAQQNY2xhaW1Cb29zdGluZwkAoAMBCQC8AgMJALwCAwUDbXVsCQC2AgEJAGUCBRJuZXdCb29zdExQSW50ZXJlc3QFEHVCb29zdExQSW50ZXJlc3QJALYCAQULc2NhbGVWYWx1ZTgJALYCAQABCQC2AgEFC3NjYWxlVmFsdWU4BAp0b1RyZWFzdXJ5CQBlAgUQY2xhaW1Cb29zdGluZ01heAUNY2xhaW1Cb29zdGluZwMJAGYCAAAFCnRvVHJlYXN1cnkJAAIBAg50b1RyZWFzdXJ5IDwgMAkAlwoFBQ9uZXdGYXJtSW50ZXJlc3QFEG5ld0Jvb3N0SW50ZXJlc3QFEm5ld0Jvb3N0TFBJbnRlcmVzdAkAZAIFDGNsYWltRmFybWluZwUNY2xhaW1Cb29zdGluZwUKdG9UcmVhc3VyeQEbYXZhaWxhYmxlQ2xhaW1DYWxjQWxsQnlVc2VyAgVwb29scwR1c2VyCgENY2FsY0F2YWlsYWJsZQIDYWNjBHBvb2wEDSR0MDE0MDcwMTQwOTkFA2FjYwQIbmV3UG9vbHMIBQ0kdDAxNDA3MDE0MDk5Al8xBAdhbW91bnRzCAUNJHQwMTQwNzAxNDA5OQJfMgQNJHQwMTQxMDgxNDE2NwkBCWNsYWltQ2FsYwIFBHBvb2wFBHVzZXIEAmZpCAUNJHQwMTQxMDgxNDE2NwJfMQQCYmkIBQ0kdDAxNDEwODE0MTY3Al8yBARibHBpCAUNJHQwMTQxMDgxNDE2NwJfMwQLY2xhaW1BbW91bnQIBQ0kdDAxNDEwODE0MTY3Al80BAJ0dAgFDSR0MDE0MTA4MTQxNjcCXzUEDWF2YWlsYWJsZUZ1bmQJAGQCCQERdXNlckF2YWlsYWJsZVNXT1ACBQRwb29sBQR1c2VyBQtjbGFpbUFtb3VudAkAlAoCCQDNCAIFCG5ld1Bvb2xzBQRwb29sCQDNCAIFB2Ftb3VudHMFDWF2YWlsYWJsZUZ1bmQKAAIkbAUFcG9vbHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIFA25pbAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQ1jYWxjQXZhaWxhYmxlAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyA2MAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQAFQAWABcAGAAZABoAGwAcAB0AHgAfACAAIQAiACMAJAAlACYAJwAoACkAKgArACwALQAuAC8AMAAxADIAMwA0ADUANgA3ADgAOQA6ADsAPAEVY2FuTG9ja0luRmlyc3RIYXJ2ZXN0BQRwb29sBHVzZXIVdXNlclNoYXJlVG9rZW5zU3Rha2VkCXBtdEFtb3VudAhsb2NrVHlwZQMJAGYCCQEVZ2V0SGVpZ2h0Rmlyc3RIYXJ2ZXN0AQUEcG9vbAUGaGVpZ2h0BA90b3RhbFZvdGVBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUNdm90aW5nQWRkcmVzcwkArAICBQRwb29sBRBrSGFydmVzdFBvb2xWb3RlAAAEDnVzZXJWb3RlQW1vdW50CQELdmFsdWVPckVsc2UCCQCaCAIFDXZvdGluZ0FkZHJlc3MJAKwCAgkArAICCQCsAgIFBHVzZXICAV8FBHBvb2wFFGtIYXJ2ZXN0VXNlclBvb2xWb3RlAAAEEUZIU2hhcmVUb2tlbkxpbWl0CQEUZ2V0RkhTaGFyZUxpbWl0VG9rZW4BCQERQGV4dHJOYXRpdmUoMTA2MikBBQRwb29sBBVGSFNoYXJlVG9rZW5Vc2VyTGltaXQJAGUCCQBrAwURRkhTaGFyZVRva2VuTGltaXQFDnVzZXJWb3RlQW1vdW50BQ90b3RhbFZvdGVBbW91bnQFFXVzZXJTaGFyZVRva2Vuc1N0YWtlZAMJAGYCBQhsb2NrVHlwZQAACQACAQIyWW91IGNhbid0IGxvY2sgc2hhcmVUb2tlbnMgdGlsbCBmaXJzdCBoYXJ2ZXN0IGVuZC4DCQAAAgUOdXNlclZvdGVBbW91bnQAAAAAAwkAZwIFCXBtdEFtb3VudAUVRkhTaGFyZVRva2VuVXNlckxpbWl0CQBlAgUJcG10QW1vdW50BRVGSFNoYXJlVG9rZW5Vc2VyTGltaXQAAAAAAQ1nZXRMb2NrUGFyYW1zAQR0eXBlBApsb2NrUGFyYW1zCQC1CQIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzCQCsAgIJAKQDAQUEdHlwZQULa0xvY2tQYXJhbXMJAKwCAgIeVGhlcmUgYXJlIG5vIGtleSBmb3IgbG9jayB0eXBlCQCkAwEFBHR5cGUCAV8JAJQKAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCmxvY2tQYXJhbXMAAAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCmxvY2tQYXJhbXMAAQEHc3VzcGVuZAEFY2F1c2UJAMwIAgkBDEJvb2xlYW5FbnRyeQIFB2tBY3RpdmUHCQDMCAIJAQtTdHJpbmdFbnRyeQIFBmtDYXVzZQUFY2F1c2UFA25pbAEIaXNBY3RpdmUAAwMFBmFjdGl2ZQUKYWN0aXZlR2xvYgcFBHVuaXQJAAIBAh9EQXBwIGlzIGluYWN0aXZlIGF0IHRoaXMgbW9tZW50AQtpc0FkbWluQ2FsbAEBaQMJAQ9jb250YWluc0VsZW1lbnQCCQDMCAIFDGFkbWluUHViS2V5MQkAzAgCBQxhZG1pblB1YktleTIJAMwIAgUMYWRtaW5QdWJLZXkzBQNuaWwIBQFpD2NhbGxlclB1YmxpY0tleQUEdW5pdAkAAgECIU9ubHkgYWRtaW4gY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgEKaXNQb29sQ2FsbAIBaQRwb29sAwMJAAACCQClCAEIBQFpBmNhbGxlcgUEcG9vbAYJAAACCAUBaQZjYWxsZXIFDGNwbW1Db250cmFjdAUEdW5pdAkAAgECIE9ubHkgcG9vbCBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uAQppc1NlbGZDYWxsAQFpAwkAAAIIBQFpBmNhbGxlcgUEdGhpcwUEdW5pdAkAAgECK09ubHkgY29udHJhY3QgaXRzZWxmIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24BE2NhbGNMb2NrU2hhcmVUb2tlbnMEAWkGY2FsbGVyBHBvb2wIbG9ja1R5cGUEDHNoYXJlQXNzZXRJZAkBD2dldFNoYXJlQXNzZXRJZAEFBHBvb2wEBHVzZXIJAKUIAQUGY2FsbGVyBAp0b3RhbFNoYXJlCQESZ2V0VG90YWxTaGFyZVRva2VuAQUEcG9vbAQRdG90YWxTaGFyZVZpcnR1YWwJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBRNrU2hhcmVUb2tlbnNWaXJ0dWFsBQp0b3RhbFNoYXJlBBB1c2VyU3Rha2VkQW1vdW50CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXIFFmtVc2VyU2hhcmVUb2tlbnNTdGFrZWQAAAQPdXNlckxvY2tlZEhlaWd0CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXIFHGtVc2VyU2hhcmVUb2tlbnNMb2NrZWRIZWlnaHQAAAQQdXNlckxvY2tlZEFtb3VudAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyBRZrVXNlclNoYXJlVG9rZW5zTG9ja2VkAAAEEXVzZXJBbW91bnRWaXJ0dWFsCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXIFF2tVc2VyU2hhcmVUb2tlbnNWaXJ0dWFsBRB1c2VyU3Rha2VkQW1vdW50BBR0b3RhbFVzZXJTaGFyZVRva2VucwkAZAIJAGQCBRB1c2VyU3Rha2VkQW1vdW50BRB1c2VyTG9ja2VkQW1vdW50CAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAQNJHQwMTY5NjgxNzAyMAkBDWdldExvY2tQYXJhbXMBBQhsb2NrVHlwZQQKbG9ja1BlcmlvZAgFDSR0MDE2OTY4MTcwMjACXzEECGxvY2tDb2VmCAUNJHQwMTY5NjgxNzAyMAJfMgQMbG9ja1dhdmVzRmVlCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzBQ1rTG9ja1dhdmVzRmVlAwkBAiE9AggJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBQxzaGFyZUFzc2V0SWQJAAIBAhtXcm9uZyBzaGFyZXRva2VuIGluIHBheW1lbnQDCQBnAgAACAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAkAAgECJVBheW1lbnQgYW1vdW50IG11c3QgYmUgZ3JlYXRlciB0aGFuIDADCQBmAgAABQhsb2NrVHlwZQkAAgECFWxvY2tUeXBlIG11c3QgYmUgPj0gMAQVc2hhcmVUb2tlbnNDaGFuZ2VPbkZICQEVY2FuTG9ja0luRmlyc3RIYXJ2ZXN0BQUEcG9vbAUEdXNlcgUQdXNlclN0YWtlZEFtb3VudAgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQFCGxvY2tUeXBlAwkAAAIFFXNoYXJlVG9rZW5zQ2hhbmdlT25GSAUVc2hhcmVUb2tlbnNDaGFuZ2VPbkZIBA0kdDAxNzQ0NzE5MzgxAwkAAAIFCGxvY2tUeXBlAAAEFHVzZXJBbW91bnRWaXJ0dWFsTmV3CQBlAgkAZAIFEXVzZXJBbW91bnRWaXJ0dWFsCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAUVc2hhcmVUb2tlbnNDaGFuZ2VPbkZICQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXIFFmtVc2VyU2hhcmVUb2tlbnNTdGFrZWQJAGUCCQBkAgUQdXNlclN0YWtlZEFtb3VudAgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQFFXNoYXJlVG9rZW5zQ2hhbmdlT25GSAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgUXa1VzZXJTaGFyZVRva2Vuc1ZpcnR1YWwFFHVzZXJBbW91bnRWaXJ0dWFsTmV3CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFE2tTaGFyZVRva2Vuc1ZpcnR1YWwJAGUCCQBkAgURdG90YWxTaGFyZVZpcnR1YWwICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BRVzaGFyZVRva2Vuc0NoYW5nZU9uRkgJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUGY2FsbGVyBRVzaGFyZVRva2Vuc0NoYW5nZU9uRkgICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAUDbmlsCQBlAgkAZAIFCnRvdGFsU2hhcmUICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BRVzaGFyZVRva2Vuc0NoYW5nZU9uRkgDAwkAAAIFD3VzZXJMb2NrZWRIZWlndAAAAwMJAGYCAAIJAJADAQgFAWkIcGF5bWVudHMGCQECIT0CCAkAkQMCCAUBaQhwYXltZW50cwABB2Fzc2V0SWQFBHVuaXQGCQBmAgUMbG9ja1dhdmVzRmVlCAkAkQMCCAUBaQhwYXltZW50cwABBmFtb3VudAcJAAIBCQCsAgIJAKwCAgIrWW91IG5lZWQgdG8gcGF5IGFkZGl0aW9uYWwgd2F2ZXMgY29taXNzaW9uIAkApAMBBQxsb2NrV2F2ZXNGZWUCBVdBVkVTAwkAZgIFD3VzZXJMb2NrZWRIZWlndAkAZAIFBmhlaWdodAUKbG9ja1BlcmlvZAkAAgECT1lvdSBjYW5ub3QgbG9jayBzaGFyZXRva2VucyBmb3IgYSBwZXJpb2QgbGVzcyB0aGFuIHdoYXQgeW91IGhhdmUgYWxyZWFkeSBsb2NrZWQEE3VzZXJMb2NrZWRBbW91bnROZXcJAGQCBRB1c2VyTG9ja2VkQW1vdW50CAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAQSdXNlckxvY2tlZEhlaWd0TmV3CQBkAgUGaGVpZ2h0BQpsb2NrUGVyaW9kBBR1c2VyQW1vdW50VmlydHVhbE5ldwkAZAIJAGsDBRN1c2VyTG9ja2VkQW1vdW50TmV3BQhsb2NrQ29lZgUSbG9ja0Jvb3N0Q29lZlNjYWxlBRB1c2VyU3Rha2VkQW1vdW50CQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXIFFmtVc2VyU2hhcmVUb2tlbnNMb2NrZWQFE3VzZXJMb2NrZWRBbW91bnROZXcJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXIFHGtVc2VyU2hhcmVUb2tlbnNMb2NrZWRIZWlnaHQFEnVzZXJMb2NrZWRIZWlndE5ldwkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgUaa1VzZXJTaGFyZVRva2Vuc0xvY2tlZFR5cGUFCGxvY2tUeXBlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyBRdrVXNlclNoYXJlVG9rZW5zVmlydHVhbAUUdXNlckFtb3VudFZpcnR1YWxOZXcJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUTa1NoYXJlVG9rZW5zVmlydHVhbAkAZAIJAGUCBRF0b3RhbFNoYXJlVmlydHVhbAURdXNlckFtb3VudFZpcnR1YWwFFHVzZXJBbW91bnRWaXJ0dWFsTmV3BQNuaWwJAGQCBQp0b3RhbFNoYXJlCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAQLbG9ja0VudHJpZXMIBQ0kdDAxNzQ0NzE5MzgxAl8xBA10b3RhbFNoYXJlTmV3CAUNJHQwMTc0NDcxOTM4MQJfMgMJAGYCCQEOYWNjb3VudEJhbGFuY2UBBQxzaGFyZUFzc2V0SWQFDXRvdGFsU2hhcmVOZXcJAAIBAjBCYWxhbmNlIG9mIHNoYXJlLXRva2VuIGlzIGxvd2VyIHRoYW4gdG90YWxBbW91bnQEDSR0MDE5NTA2MTk2MDUJAQljbGFpbUNhbGMCBQRwb29sBQR1c2VyBAxmYXJtSW50ZXJlc3QIBQ0kdDAxOTUwNjE5NjA1Al8xBA1ib29zdEludGVyZXN0CAUNJHQwMTk1MDYxOTYwNQJfMgQPYm9vc3RMUGludGVyZXN0CAUNJHQwMTk1MDYxOTYwNQJfMwQLY2xhaW1BbW91bnQIBQ0kdDAxOTUwNjE5NjA1Al80BAp0b1RyZWFzdXJlCAUNJHQwMTk1MDYxOTYwNQJfNQQRYXZhaWxhYmxlRnVuZHNOZXcJAGQCCQERdXNlckF2YWlsYWJsZVNXT1ACBQRwb29sBQR1c2VyBQtjbGFpbUFtb3VudAQEdXBscAMJAAACCQCdCAIJAQdBZGRyZXNzAQkA2QQBBQRwb29sAgd2ZXJzaW9uAgUzLjAuMAkA/AcEBRBscEZhcm1pbmdBZGRyZXNzAhJ1cGRhdGVVc2VySW50ZXJlc3QJAMwIAgUEdXNlcgkAzAgCBQRwb29sCQDMCAIFFHRvdGFsVXNlclNoYXJlVG9rZW5zBQNuaWwFA25pbAAAAwkAAAIFBHVwbHAFBHVwbHAJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgUVa0Zhcm1Vc2VyTGFzdEludGVyZXN0BQxmYXJtSW50ZXJlc3QJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXIFFmtCb29zdFVzZXJMYXN0SW50ZXJlc3QFDWJvb3N0SW50ZXJlc3QJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXIFGGtCb29zdExQVXNlckxhc3RJbnRlcmVzdAUPYm9vc3RMUGludGVyZXN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFEWtGYXJtTGFzdEludGVyZXN0BQxmYXJtSW50ZXJlc3QJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUSa0Jvb3N0TGFzdEludGVyZXN0BQ1ib29zdEludGVyZXN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFFGtCb29zdExQTGFzdEludGVyZXN0BQ9ib29zdExQaW50ZXJlc3QJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUTa0xhc3RJbnRlcmVzdEhlaWdodAUGaGVpZ2h0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFFmtTaGFyZVRvdGFsU2hhcmVUb2tlbnMFDXRvdGFsU2hhcmVOZXcJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXIFDmtBdmFpbGFibGVTV09QBRFhdmFpbGFibGVGdW5kc05ldwkAzAgCCQEHUmVpc3N1ZQMFBFNXT1AFCnRvVHJlYXN1cmUGCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFE2Zhcm1pbmdUcmVhc3VyZUFkZHIFCnRvVHJlYXN1cmUFBFNXT1AFA25pbAULbG9ja0VudHJpZXMJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BF2NhbGNXaXRoZHJhd1NoYXJlVG9rZW5zBAFpBmNhbGxlcgRwb29sGXNoYXJlVG9rZW5zV2l0aGRyYXdBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAEDXNoYXJlVG9rZW5zSWQJANkEAQkBEUBleHRyTmF0aXZlKDEwNTMpAgkBBXZhbHVlAQkApggBBQRwb29sAg5zaGFyZV9hc3NldF9pZAQEdXNlcgkApQgBBQZjYWxsZXIEDSR0MDIwOTUwMjEwNDkJAQljbGFpbUNhbGMCBQRwb29sBQR1c2VyBAxmYXJtSW50ZXJlc3QIBQ0kdDAyMDk1MDIxMDQ5Al8xBA1ib29zdEludGVyZXN0CAUNJHQwMjA5NTAyMTA0OQJfMgQPYm9vc3RMUGludGVyZXN0CAUNJHQwMjA5NTAyMTA0OQJfMwQLY2xhaW1BbW91bnQIBQ0kdDAyMDk1MDIxMDQ5Al80BAp0b1RyZWFzdXJlCAUNJHQwMjA5NTAyMTA0OQJfNQQQdXNlclN0YWtlZEFtb3VudAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyBRZrVXNlclNoYXJlVG9rZW5zU3Rha2VkAAAEEHVzZXJMb2NrZWRBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgUWa1VzZXJTaGFyZVRva2Vuc0xvY2tlZAAABBF1c2VyQW1vdW50VmlydHVhbAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyBRdrVXNlclNoYXJlVG9rZW5zVmlydHVhbAUQdXNlclN0YWtlZEFtb3VudAQTdXNlclN0YWtlZEFtb3VudE5ldwkAZQIFEHVzZXJTdGFrZWRBbW91bnQFGXNoYXJlVG9rZW5zV2l0aGRyYXdBbW91bnQEEWF2YWlsYWJsZUZ1bmRzTmV3CQBkAgkBEXVzZXJBdmFpbGFibGVTV09QAgUEcG9vbAUEdXNlcgULY2xhaW1BbW91bnQEEHRvdGFsU2hhcmVBbW91bnQJARJnZXRUb3RhbFNoYXJlVG9rZW4BBQRwb29sBBF0b3RhbFNoYXJlVmlydHVhbAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHBvb2wFE2tTaGFyZVRva2Vuc1ZpcnR1YWwFEHRvdGFsU2hhcmVBbW91bnQEE3RvdGFsU2hhcmVBbW91bnROZXcJAGUCBRB0b3RhbFNoYXJlQW1vdW50BRlzaGFyZVRva2Vuc1dpdGhkcmF3QW1vdW50BBR0b3RhbFNoYXJlVmlydHVhbE5ldwkAZQIFEXRvdGFsU2hhcmVWaXJ0dWFsBRlzaGFyZVRva2Vuc1dpdGhkcmF3QW1vdW50BBR1c2VyQW1vdW50VmlydHVhbE5ldwkAZQIFEXVzZXJBbW91bnRWaXJ0dWFsBRlzaGFyZVRva2Vuc1dpdGhkcmF3QW1vdW50AwkAZgIFGXNoYXJlVG9rZW5zV2l0aGRyYXdBbW91bnQFEHVzZXJTdGFrZWRBbW91bnQJAAIBAixXaXRoZHJhdyBhbW91bnQgbW9yZSB0aGVuIHVzZXIgbG9ja2VkIGFtb3VudAMJAGYCCQEOYWNjb3VudEJhbGFuY2UBBQ1zaGFyZVRva2Vuc0lkBRB0b3RhbFNoYXJlQW1vdW50CQACAQIwQmFsYW5jZSBvZiBzaGFyZS10b2tlbiBpcyBsb3dlciB0aGFuIHRvdGFsQW1vdW50BAR1cGxwAwkAAAIJAJ0IAgkBB0FkZHJlc3MBCQDZBAEFBHBvb2wCB3ZlcnNpb24CBTMuMC4wCQD8BwQFEGxwRmFybWluZ0FkZHJlc3MCEnVwZGF0ZVVzZXJJbnRlcmVzdAkAzAgCBQR1c2VyCQDMCAIFBHBvb2wJAMwIAgkAZAIFEHVzZXJTdGFrZWRBbW91bnQFEHVzZXJMb2NrZWRBbW91bnQFA25pbAUDbmlsAAADCQAAAgUEdXBscAUEdXBscAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgUVa0Zhcm1Vc2VyTGFzdEludGVyZXN0BQxmYXJtSW50ZXJlc3QJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXIFFmtCb29zdFVzZXJMYXN0SW50ZXJlc3QFDWJvb3N0SW50ZXJlc3QJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXIFGGtCb29zdExQVXNlckxhc3RJbnRlcmVzdAUPYm9vc3RMUGludGVyZXN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFEWtGYXJtTGFzdEludGVyZXN0BQxmYXJtSW50ZXJlc3QJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUSa0Jvb3N0TGFzdEludGVyZXN0BQ1ib29zdEludGVyZXN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFFGtCb29zdExQTGFzdEludGVyZXN0BQ9ib29zdExQaW50ZXJlc3QJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUTa0xhc3RJbnRlcmVzdEhlaWdodAUGaGVpZ2h0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyBRZrVXNlclNoYXJlVG9rZW5zU3Rha2VkBRN1c2VyU3Rha2VkQW1vdW50TmV3CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyBRdrVXNlclNoYXJlVG9rZW5zVmlydHVhbAUUdXNlckFtb3VudFZpcnR1YWxOZXcJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUWa1NoYXJlVG90YWxTaGFyZVRva2VucwUTdG90YWxTaGFyZUFtb3VudE5ldwkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBRNrU2hhcmVUb2tlbnNWaXJ0dWFsBRR0b3RhbFNoYXJlVmlydHVhbE5ldwkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgUOa0F2YWlsYWJsZVNXT1AFEWF2YWlsYWJsZUZ1bmRzTmV3CQDMCAIJAQdSZWlzc3VlAwUEU1dPUAUKdG9UcmVhc3VyZQYJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUTZmFybWluZ1RyZWFzdXJlQWRkcgUKdG9UcmVhc3VyZQUEU1dPUAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFGXNoYXJlVG9rZW5zV2l0aGRyYXdBbW91bnQFDXNoYXJlVG9rZW5zSWQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEJY2FsY0NsYWltAwFpBHBvb2wGY2FsbGVyBA1zaGFyZVRva2Vuc0lkCQDZBAEJARFAZXh0ck5hdGl2ZSgxMDUzKQIJAQV2YWx1ZQEJAKYIAQUEcG9vbAIOc2hhcmVfYXNzZXRfaWQEBHVzZXIJAKUIAQUGY2FsbGVyBBBzaGFyZVRva2VuTG9ja2VkCQESZ2V0VG90YWxTaGFyZVRva2VuAQUEcG9vbAQNJHQwMjM3MTUyMzgxNAkBCWNsYWltQ2FsYwIFBHBvb2wFBHVzZXIEDGZhcm1JbnRlcmVzdAgFDSR0MDIzNzE1MjM4MTQCXzEEDWJvb3N0SW50ZXJlc3QIBQ0kdDAyMzcxNTIzODE0Al8yBA9ib29zdExQaW50ZXJlc3QIBQ0kdDAyMzcxNTIzODE0Al8zBAtjbGFpbUFtb3VudAgFDSR0MDIzNzE1MjM4MTQCXzQECnRvVHJlYXN1cmUIBQ0kdDAyMzcxNTIzODE0Al81BA1hdmFpbGFibGVGdW5kCQBkAgkBEXVzZXJBdmFpbGFibGVTV09QAgUEcG9vbAUEdXNlcgULY2xhaW1BbW91bnQDCQAAAgUNYXZhaWxhYmxlRnVuZAAACQACAQIZWW91IGhhdmUgMCBhdmFpbGFibGUgU1dPUAMJAGYCCQEOYWNjb3VudEJhbGFuY2UBBQ1zaGFyZVRva2Vuc0lkBRBzaGFyZVRva2VuTG9ja2VkCQACAQIwQmFsYW5jZSBvZiBzaGFyZS10b2tlbiBpcyBsb3dlciB0aGFuIHRvdGFsQW1vdW50BAZ1VHJhbnMDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQ1hdmFpbGFibGVGdW5kBQRTV09QBQNuaWwFA25pbAkAlAoCCQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXIFFWtGYXJtVXNlckxhc3RJbnRlcmVzdAUMZmFybUludGVyZXN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyBRZrQm9vc3RVc2VyTGFzdEludGVyZXN0BQ1ib29zdEludGVyZXN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyBRhrQm9vc3RMUFVzZXJMYXN0SW50ZXJlc3QFD2Jvb3N0TFBpbnRlcmVzdAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBRFrRmFybUxhc3RJbnRlcmVzdAUMZmFybUludGVyZXN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFEmtCb29zdExhc3RJbnRlcmVzdAUNYm9vc3RJbnRlcmVzdAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBRRrQm9vc3RMUExhc3RJbnRlcmVzdAUPYm9vc3RMUGludGVyZXN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFE2tMYXN0SW50ZXJlc3RIZWlnaHQFBmhlaWdodAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgUOa0F2YWlsYWJsZVNXT1AAAAkAzAgCCQEHUmVpc3N1ZQMFBFNXT1AJAGQCBQp0b1RyZWFzdXJlBQ1hdmFpbGFibGVGdW5kBgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBRNmYXJtaW5nVHJlYXN1cmVBZGRyBQp0b1RyZWFzdXJlBQRTV09QBQNuaWwFBnVUcmFucwUNYXZhaWxhYmxlRnVuZBEBaQEEaW5pdAEHZWFybHlMUAMJAQlpc0RlZmluZWQBCQCdCAIFBHRoaXMFB2tTV09QaWQJAAIBAhhTV09QIGFscmVhZHkgaW5pdGlhbGl6ZWQECmluaXRBbW91bnQAgIDpg7HeFgQJU1dPUGlzc3VlCQDCCAUCBFNXT1ACE1NXT1AgcHJvdG9jb2wgdG9rZW4FCmluaXRBbW91bnQACAYEBlNXT1BpZAkAuAgBBQlTV09QaXNzdWUJAMwIAgkBDEJvb2xlYW5FbnRyeQIFB2tBY3RpdmUGCQDMCAIJAMIIBQIEU1dPUAITU1dPUCBwcm90b2NvbCB0b2tlbgUKaW5pdEFtb3VudAAIBgkAzAgCCQELU3RyaW5nRW50cnkCBQdrU1dPUGlkCQDYBAEFBlNXT1BpZAUDbmlsAWkBFGluaXRQb29sU2hhcmVGYXJtaW5nAQRwb29sCQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFFmtTaGFyZVRvdGFsU2hhcmVUb2tlbnMAAAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBRFrRmFybUxhc3RJbnRlcmVzdAAACQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFEmtCb29zdExhc3RJbnRlcmVzdAAACQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFFGtCb29zdExQTGFzdEludGVyZXN0AAAJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUTa0xhc3RJbnRlcmVzdEhlaWdodAUGaGVpZ2h0BQNuaWwBaQESdXBkYXRlUG9vbEludGVyZXN0AQRwb29sCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUAAwkBAiE9AggFAWkGY2FsbGVyBQpnb3ZBZGRyZXNzCQACAQImT25seSBHb3Zlcm5hbmNlIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24EBHVzZXIJAKUIAQkApwgBBRFhZG1pbkludm9rZVB1YktleQQNJHQwMjU5NjkyNjA0MwkBCWNsYWltQ2FsYwIFBHBvb2wFBHVzZXIEDGZhcm1JbnRlcmVzdAgFDSR0MDI1OTY5MjYwNDMCXzEEDWJvb3N0SW50ZXJlc3QIBQ0kdDAyNTk2OTI2MDQzAl8yBA9ib29zdExQaW50ZXJlc3QIBQ0kdDAyNTk2OTI2MDQzAl8zCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFEWtGYXJtTGFzdEludGVyZXN0BQxmYXJtSW50ZXJlc3QJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUSa0Jvb3N0TGFzdEludGVyZXN0BQ1ib29zdEludGVyZXN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFFGtCb29zdExQTGFzdEludGVyZXN0BQ9ib29zdExQaW50ZXJlc3QJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUTa0xhc3RJbnRlcmVzdEhlaWdodAUGaGVpZ2h0BQNuaWwBaQEPbG9ja1NoYXJlVG9rZW5zAgRwb29sCGxvY2tUeXBlCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUACQETY2FsY0xvY2tTaGFyZVRva2VucwQFAWkIBQFpBmNhbGxlcgUEcG9vbAUIbG9ja1R5cGUBaQEXbG9ja1NoYXJlVG9rZW5zRnJvbVBvb2wDC2NhbGxlckJ5dGVzBHBvb2wIbG9ja1R5cGUJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAJAQt2YWx1ZU9yRWxzZQIJAQppc1Bvb2xDYWxsAgUBaQUEcG9vbAkBE2NhbGNMb2NrU2hhcmVUb2tlbnMEBQFpCQEHQWRkcmVzcwEFC2NhbGxlckJ5dGVzBQRwb29sBQhsb2NrVHlwZQFpARVsb2NrU3Rha2VkU2hhcmVUb2tlbnMDBHBvb2wIbG9ja1R5cGUKbG9ja0Ftb3VudAkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAQMc2hhcmVBc3NldElkCQEPZ2V0U2hhcmVBc3NldElkAQUEcG9vbAQEdXNlcgkApQgBCAUBaQZjYWxsZXIECnRvdGFsU2hhcmUJARJnZXRUb3RhbFNoYXJlVG9rZW4BBQRwb29sBBF0b3RhbFNoYXJlVmlydHVhbAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHBvb2wFE2tTaGFyZVRva2Vuc1ZpcnR1YWwFCnRvdGFsU2hhcmUEEHVzZXJTdGFrZWRBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgUWa1VzZXJTaGFyZVRva2Vuc1N0YWtlZAAABA91c2VyTG9ja2VkSGVpZ3QJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgUca1VzZXJTaGFyZVRva2Vuc0xvY2tlZEhlaWdodAAABBB1c2VyTG9ja2VkQW1vdW50CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXIFFmtVc2VyU2hhcmVUb2tlbnNMb2NrZWQAAAQRdXNlckFtb3VudFZpcnR1YWwJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgUXa1VzZXJTaGFyZVRva2Vuc1ZpcnR1YWwFEHVzZXJTdGFrZWRBbW91bnQEFHRvdGFsVXNlclNoYXJlVG9rZW5zCQBkAgUQdXNlclN0YWtlZEFtb3VudAUQdXNlckxvY2tlZEFtb3VudAQNJHQwMjc1MzAyNzU4MgkBDWdldExvY2tQYXJhbXMBBQhsb2NrVHlwZQQKbG9ja1BlcmlvZAgFDSR0MDI3NTMwMjc1ODICXzEECGxvY2tDb2VmCAUNJHQwMjc1MzAyNzU4MgJfMgQMbG9ja1dhdmVzRmVlCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzBQ1rTG9ja1dhdmVzRmVlAwkAZgIJARVnZXRIZWlnaHRGaXJzdEhhcnZlc3QBBQRwb29sBQZoZWlnaHQJAAIBAjJZb3UgY2FuJ3QgbG9jayBzaGFyZVRva2VucyB0aWxsIGZpcnN0IGhhcnZlc3QgZW5kLgMJAGcCAAAFCGxvY2tUeXBlCQACAQIUbG9ja1R5cGUgbXVzdCBiZSA+IDADCQBmAgUKbG9ja0Ftb3VudAUQdXNlclN0YWtlZEFtb3VudAkAAgEJAKwCAgIZWW91IGNhbid0IGxvY2sgbW9yZSB0aGFuIAkApAMBBRB1c2VyU3Rha2VkQW1vdW50AwkAZgIJAQ5hY2NvdW50QmFsYW5jZQEFDHNoYXJlQXNzZXRJZAUKdG90YWxTaGFyZQkAAgECMEJhbGFuY2Ugb2Ygc2hhcmUtdG9rZW4gaXMgbG93ZXIgdGhhbiB0b3RhbEFtb3VudAMDCQAAAgUPdXNlckxvY2tlZEhlaWd0AAADAwkAZgIAAQkAkAMBCAUBaQhwYXltZW50cwYJAQIhPQIICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAUEdW5pdAYJAGYCBQxsb2NrV2F2ZXNGZWUICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BwkAAgEJAKwCAgkArAICAitZb3UgbmVlZCB0byBwYXkgYWRkaXRpb25hbCB3YXZlcyBjb21pc3Npb24gCQCkAwEFDGxvY2tXYXZlc0ZlZQIFV0FWRVMDAwkAAAIFD3VzZXJMb2NrZWRIZWlndAAACQBnAgAABQpsb2NrQW1vdW50BwkAAgECIWxvY2tBbW91bnQgbXVzdCBiZSBncmVhdGVyIHRoYW4gMAMJAGYCAAAFCmxvY2tBbW91bnQJAAIBAhtsb2NrQW1vdW50IG11c3QgYmUgcG9zaXRpdmUDCQBmAgUPdXNlckxvY2tlZEhlaWd0CQBkAgUGaGVpZ2h0BQpsb2NrUGVyaW9kCQACAQJPWW91IGNhbm5vdCBsb2NrIHNoYXJldG9rZW5zIGZvciBhIHBlcmlvZCBsZXNzIHRoYW4gd2hhdCB5b3UgaGF2ZSBhbHJlYWR5IGxvY2tlZAQTdXNlckxvY2tlZEFtb3VudE5ldwkAZAIFEHVzZXJMb2NrZWRBbW91bnQFCmxvY2tBbW91bnQEE3VzZXJTdGFrZWRBbW91bnROZXcJAGUCBRB1c2VyU3Rha2VkQW1vdW50BQpsb2NrQW1vdW50BBJ1c2VyTG9ja2VkSGVpZ3ROZXcJAGQCBQZoZWlnaHQFCmxvY2tQZXJpb2QEFHVzZXJBbW91bnRWaXJ0dWFsTmV3CQBkAgkAawMFE3VzZXJMb2NrZWRBbW91bnROZXcFCGxvY2tDb2VmBRJsb2NrQm9vc3RDb2VmU2NhbGUFE3VzZXJTdGFrZWRBbW91bnROZXcEDSR0MDI4ODcyMjg5NzEJAQljbGFpbUNhbGMCBQRwb29sBQR1c2VyBAxmYXJtSW50ZXJlc3QIBQ0kdDAyODg3MjI4OTcxAl8xBA1ib29zdEludGVyZXN0CAUNJHQwMjg4NzIyODk3MQJfMgQPYm9vc3RMUGludGVyZXN0CAUNJHQwMjg4NzIyODk3MQJfMwQLY2xhaW1BbW91bnQIBQ0kdDAyODg3MjI4OTcxAl80BAp0b1RyZWFzdXJlCAUNJHQwMjg4NzIyODk3MQJfNQQRYXZhaWxhYmxlRnVuZHNOZXcJAGQCCQERdXNlckF2YWlsYWJsZVNXT1ACBQRwb29sBQR1c2VyBQtjbGFpbUFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgUWa1VzZXJTaGFyZVRva2Vuc1N0YWtlZAUTdXNlclN0YWtlZEFtb3VudE5ldwkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgUWa1VzZXJTaGFyZVRva2Vuc0xvY2tlZAUTdXNlckxvY2tlZEFtb3VudE5ldwkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgUca1VzZXJTaGFyZVRva2Vuc0xvY2tlZEhlaWdodAUSdXNlckxvY2tlZEhlaWd0TmV3CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyBRprVXNlclNoYXJlVG9rZW5zTG9ja2VkVHlwZQUIbG9ja1R5cGUJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXIFF2tVc2VyU2hhcmVUb2tlbnNWaXJ0dWFsBRR1c2VyQW1vdW50VmlydHVhbE5ldwkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBRNrU2hhcmVUb2tlbnNWaXJ0dWFsCQBkAgkAZQIFEXRvdGFsU2hhcmVWaXJ0dWFsBRF1c2VyQW1vdW50VmlydHVhbAUUdXNlckFtb3VudFZpcnR1YWxOZXcJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXIFFWtGYXJtVXNlckxhc3RJbnRlcmVzdAUMZmFybUludGVyZXN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyBRZrQm9vc3RVc2VyTGFzdEludGVyZXN0BQ1ib29zdEludGVyZXN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyBRhrQm9vc3RMUFVzZXJMYXN0SW50ZXJlc3QFD2Jvb3N0TFBpbnRlcmVzdAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBRFrRmFybUxhc3RJbnRlcmVzdAUMZmFybUludGVyZXN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFEmtCb29zdExhc3RJbnRlcmVzdAUNYm9vc3RJbnRlcmVzdAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBRRrQm9vc3RMUExhc3RJbnRlcmVzdAUPYm9vc3RMUGludGVyZXN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFE2tMYXN0SW50ZXJlc3RIZWlnaHQFBmhlaWdodAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgUOa0F2YWlsYWJsZVNXT1AFEWF2YWlsYWJsZUZ1bmRzTmV3CQDMCAIJAQdSZWlzc3VlAwUEU1dPUAUKdG9UcmVhc3VyZQYJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUTZmFybWluZ1RyZWFzdXJlQWRkcgUKdG9UcmVhc3VyZQUEU1dPUAUDbmlsAWkBDnVubG9ja1VzZXJMb2NrAgRwb29sBHVzZXIJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAEDGxvY2tXYXZlc0ZlZQkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwUNa0xvY2tXYXZlc0ZlZQQPdXNlckxvY2tlZEhlaWd0CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgUca1VzZXJTaGFyZVRva2Vuc0xvY2tlZEhlaWdodAkArAICCQCsAgIJAKwCAgkArAICAhFUaGVyZSBpcyBubyBwb29sIAUEcG9vbAIJIG9yIHVzZXIgBQR1c2VyAgl3aXRoIGxvY2sEEXRvdGFsU2hhcmVWaXJ0dWFsCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIFBHBvb2wFE2tTaGFyZVRva2Vuc1ZpcnR1YWwEEHVzZXJTdGFrZWRBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgUWa1VzZXJTaGFyZVRva2Vuc1N0YWtlZAAABBB1c2VyTG9ja2VkQW1vdW50CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXIFFmtVc2VyU2hhcmVUb2tlbnNMb2NrZWQAAAQRdXNlckFtb3VudFZpcnR1YWwJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgUXa1VzZXJTaGFyZVRva2Vuc1ZpcnR1YWwFEHVzZXJTdGFrZWRBbW91bnQDCQBmAgUPdXNlckxvY2tlZEhlaWd0BQZoZWlnaHQJAAIBCQCsAgICIllvdSBjYW4ndCB1bmxvY2sgc2hhcmV0b2tlbnMgdGlsbCAJAKQDAQUPdXNlckxvY2tlZEhlaWd0BBN1c2VyU3Rha2VkQW1vdW50TmV3CQBkAgUQdXNlclN0YWtlZEFtb3VudAUQdXNlckxvY2tlZEFtb3VudAQNJHQwMzEyMDEzMTMwMAkBCWNsYWltQ2FsYwIFBHBvb2wFBHVzZXIEDGZhcm1JbnRlcmVzdAgFDSR0MDMxMjAxMzEzMDACXzEEDWJvb3N0SW50ZXJlc3QIBQ0kdDAzMTIwMTMxMzAwAl8yBA9ib29zdExQaW50ZXJlc3QIBQ0kdDAzMTIwMTMxMzAwAl8zBAtjbGFpbUFtb3VudAgFDSR0MDMxMjAxMzEzMDACXzQECnRvVHJlYXN1cmUIBQ0kdDAzMTIwMTMxMzAwAl81BBFhdmFpbGFibGVGdW5kc05ldwkAZAIJARF1c2VyQXZhaWxhYmxlU1dPUAIFBHBvb2wFBHVzZXIFC2NsYWltQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyBRVrRmFybVVzZXJMYXN0SW50ZXJlc3QFDGZhcm1JbnRlcmVzdAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgUWa0Jvb3N0VXNlckxhc3RJbnRlcmVzdAUNYm9vc3RJbnRlcmVzdAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgUYa0Jvb3N0TFBVc2VyTGFzdEludGVyZXN0BQ9ib29zdExQaW50ZXJlc3QJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAURa0Zhcm1MYXN0SW50ZXJlc3QFDGZhcm1JbnRlcmVzdAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBRJrQm9vc3RMYXN0SW50ZXJlc3QFDWJvb3N0SW50ZXJlc3QJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUUa0Jvb3N0TFBMYXN0SW50ZXJlc3QFD2Jvb3N0TFBpbnRlcmVzdAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBRNrTGFzdEludGVyZXN0SGVpZ2h0BQZoZWlnaHQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXIFFmtVc2VyU2hhcmVUb2tlbnNTdGFrZWQFE3VzZXJTdGFrZWRBbW91bnROZXcJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXIFF2tVc2VyU2hhcmVUb2tlbnNWaXJ0dWFsBRN1c2VyU3Rha2VkQW1vdW50TmV3CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFE2tTaGFyZVRva2Vuc1ZpcnR1YWwJAGQCCQBlAgURdG90YWxTaGFyZVZpcnR1YWwFEXVzZXJBbW91bnRWaXJ0dWFsBRN1c2VyU3Rha2VkQW1vdW50TmV3CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyBQ5rQXZhaWxhYmxlU1dPUAURYXZhaWxhYmxlRnVuZHNOZXcJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgUWa1VzZXJTaGFyZVRva2Vuc0xvY2tlZAkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyBRxrVXNlclNoYXJlVG9rZW5zTG9ja2VkSGVpZ2h0CQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXIFGmtVc2VyU2hhcmVUb2tlbnNMb2NrZWRUeXBlCQDMCAIJAQdSZWlzc3VlAwUEU1dPUAUKdG9UcmVhc3VyZQYJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUTZmFybWluZ1RyZWFzdXJlQWRkcgUKdG9UcmVhc3VyZQUEU1dPUAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFDGxvY2tXYXZlc0ZlZQUEdW5pdAUDbmlsAWkBE3dpdGhkcmF3U2hhcmVUb2tlbnMCBHBvb2wZc2hhcmVUb2tlbnNXaXRoZHJhd0Ftb3VudAkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAkBF2NhbGNXaXRoZHJhd1NoYXJlVG9rZW5zBAUBaQgFAWkGY2FsbGVyBQRwb29sBRlzaGFyZVRva2Vuc1dpdGhkcmF3QW1vdW50AWkBG3dpdGhkcmF3U2hhcmVUb2tlbnNGcm9tUG9vbAMLY2FsbGVyQnl0ZXMEcG9vbBlzaGFyZVRva2Vuc1dpdGhkcmF3QW1vdW50CQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUACQELdmFsdWVPckVsc2UCCQEKaXNQb29sQ2FsbAIFAWkFBHBvb2wJARdjYWxjV2l0aGRyYXdTaGFyZVRva2VucwQFAWkJAQdBZGRyZXNzAQULY2FsbGVyQnl0ZXMFBHBvb2wFGXNoYXJlVG9rZW5zV2l0aGRyYXdBbW91bnQBaQEFY2xhaW0BBHBvb2wJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAJAQljYWxjQ2xhaW0DBQFpBQRwb29sCAUBaQZjYWxsZXIBaQENY2xhaW1JbnRlcm5hbAIEcG9vbAZjYWxsZXIJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAJAQt2YWx1ZU9yRWxzZQIJAQppc1NlbGZDYWxsAQUBaQkBCWNhbGNDbGFpbQMFAWkFBHBvb2wJAQdBZGRyZXNzAQUGY2FsbGVyAWkBDWNsYWltQW5kU3Rha2UBBHBvb2wJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAEC2NsYWltQW1vdW50CgABQAkA/AcEBQR0aGlzAg1jbGFpbUludGVybmFsCQDMCAIFBHBvb2wJAMwIAggIBQFpBmNhbGxlcgVieXRlcwUDbmlsBQNuaWwDCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50AwkAAAIFC2NsYWltQW1vdW50BQtjbGFpbUFtb3VudAQKc3Rha2VUb0dvdgkA/AcEBQpnb3ZBZGRyZXNzAhNsb2NrU1dPUEZyb21GYXJtaW5nBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFBFNXT1AFC2NsYWltQW1vdW50BQNuaWwDCQAAAgUKc3Rha2VUb0dvdgUKc3Rha2VUb0dvdgUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCGNsYWltQWxsAQVwb29scwkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAoBCGNsYWltSW52AgpjbGFpbVRvdGFsBHBvb2wEC2NsYWltQW1vdW50CgABQAkA/AcEBQR0aGlzAg1jbGFpbUludGVybmFsCQDMCAIFBHBvb2wJAMwIAggIBQFpBmNhbGxlcgVieXRlcwUDbmlsBQNuaWwDCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50AwkAAAIFC2NsYWltQW1vdW50BQtjbGFpbUFtb3VudAkAZAIFCmNsYWltVG90YWwFC2NsYWltQW1vdW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBApjbGFpbVRvdGFsCgACJGwFBXBvb2xzCgACJHMJAJADAQUCJGwKAAUkYWNjMAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQhjbGFpbUludgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgNjAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUABUAFgAXABgAGQAaABsAHAAdAB4AHwAgACEAIgAjACQAJQAmACcAKAApACoAKwAsAC0ALgAvADAAMQAyADMANAA1ADYANwA4ADkAOgA7ADwDCQAAAgUKY2xhaW1Ub3RhbAAACQACAQIZWW91IGhhdmUgMCBhdmFpbGFibGUgU1dPUAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFCmNsYWltVG90YWwFBFNXT1AFA25pbAFpARBjbGFpbUFsbEFuZFN0YWtlAQVwb29scwkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAoBCGNsYWltSW52AgpjbGFpbVRvdGFsBHBvb2wEC2NsYWltQW1vdW50CgABQAkA/AcEBQR0aGlzAg1jbGFpbUludGVybmFsCQDMCAIFBHBvb2wJAMwIAggIBQFpBmNhbGxlcgVieXRlcwUDbmlsBQNuaWwDCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50AwkAAAIFC2NsYWltQW1vdW50BQtjbGFpbUFtb3VudAkAZAIFCmNsYWltVG90YWwFC2NsYWltQW1vdW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBApjbGFpbVRvdGFsCgACJGwFBXBvb2xzCgACJHMJAJADAQUCJGwKAAUkYWNjMAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQhjbGFpbUludgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgNjAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUABUAFgAXABgAGQAaABsAHAAdAB4AHwAgACEAIgAjACQAJQAmACcAKAApACoAKwAsAC0ALgAvADAAMQAyADMANAA1ADYANwA4ADkAOgA7ADwDCQAAAgUKY2xhaW1Ub3RhbAAACQACAQIZWW91IGhhdmUgMCBhdmFpbGFibGUgU1dPUAQKc3Rha2VUb0dvdgkA/AcEBQpnb3ZBZGRyZXNzAhNsb2NrU1dPUEZyb21GYXJtaW5nBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFBFNXT1AFCmNsYWltVG90YWwFA25pbAMJAAACBQpzdGFrZVRvR292BQpzdGFrZVRvR292BQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEXdXBkYXRlVXNlckJvb3N0SW50ZXJlc3QCBHBvb2wEdXNlcgkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAMJAQIhPQIIBQFpBmNhbGxlcgUNdm90aW5nQWRkcmVzcwkAAgECI09ubHkgdm9pdGluZyBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uBA0kdDAzNDc4MjM0ODgxCQEJY2xhaW1DYWxjAgUEcG9vbAUEdXNlcgQMZmFybUludGVyZXN0CAUNJHQwMzQ3ODIzNDg4MQJfMQQNYm9vc3RJbnRlcmVzdAgFDSR0MDM0NzgyMzQ4ODECXzIED2Jvb3N0TFBpbnRlcmVzdAgFDSR0MDM0NzgyMzQ4ODECXzMEC2NsYWltQW1vdW50CAUNJHQwMzQ3ODIzNDg4MQJfNAQKdG9UcmVhc3VyZQgFDSR0MDM0NzgyMzQ4ODECXzUEEWF2YWlsYWJsZUZ1bmRzTmV3CQBkAgkBEXVzZXJBdmFpbGFibGVTV09QAgUEcG9vbAUEdXNlcgULY2xhaW1BbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXIFFWtGYXJtVXNlckxhc3RJbnRlcmVzdAUMZmFybUludGVyZXN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyBRZrQm9vc3RVc2VyTGFzdEludGVyZXN0BQ1ib29zdEludGVyZXN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyBRhrQm9vc3RMUFVzZXJMYXN0SW50ZXJlc3QFD2Jvb3N0TFBpbnRlcmVzdAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBRFrRmFybUxhc3RJbnRlcmVzdAUMZmFybUludGVyZXN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFEmtCb29zdExhc3RJbnRlcmVzdAUNYm9vc3RJbnRlcmVzdAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBRRrQm9vc3RMUExhc3RJbnRlcmVzdAUPYm9vc3RMUGludGVyZXN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFE2tMYXN0SW50ZXJlc3RIZWlnaHQFBmhlaWdodAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgUOa0F2YWlsYWJsZVNXT1AFEWF2YWlsYWJsZUZ1bmRzTmV3CQDMCAIJAQdSZWlzc3VlAwUEU1dPUAUKdG9UcmVhc3VyZQYJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUTZmFybWluZ1RyZWFzdXJlQWRkcgUKdG9UcmVhc3VyZQUEU1dPUAUDbmlsAWkBCHNodXRkb3duAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQMJAQEhAQUGYWN0aXZlCQACAQkArAICAiJEQXBwIGlzIGFscmVhZHkgc3VzcGVuZGVkLiBDYXVzZTogCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMFBmtDYXVzZQIadGhlIGNhdXNlIHdhc24ndCBzcGVjaWZpZWQJAQdzdXNwZW5kAQIPUGF1c2VkIGJ5IGFkbWluAWkBCGFjdGl2YXRlAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQMFBmFjdGl2ZQkAAgECFkRBcHAgaXMgYWxyZWFkeSBhY3RpdmUJAMwIAgkBDEJvb2xlYW5FbnRyeQIFB2tBY3RpdmUGCQDMCAIJAQtEZWxldGVFbnRyeQEFBmtDYXVzZQUDbmlsAQJ0eAEGdmVyaWZ5AAQHJG1hdGNoMAUCdHgEEmFkbWluUHViS2V5MVNpZ25lZAMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAFDGFkbWluUHViS2V5MQABAAAEEmFkbWluUHViS2V5MlNpZ25lZAMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAEFDGFkbWluUHViS2V5MgABAAAEEmFkbWluUHViS2V5M1NpZ25lZAMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAIFDGFkbWluUHViS2V5MwABAAAJAGcCCQBkAgkAZAIFEmFkbWluUHViS2V5MVNpZ25lZAUSYWRtaW5QdWJLZXkyU2lnbmVkBRJhZG1pblB1YktleTNTaWduZWQAAgTiMBg=", "height": 2317901, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: GbotN5FiRVpLN44N6iBGD1kPERA9VAy8XwheBCenhrXo Next: 8twS7zvqugChLtVgFiBJ7SQcooSJNne1f97CvNwgjexG Diff:
OldNewDifferences
7171
7272 let kShareLimitFH = "share_limit_on_first_harvest"
7373
74+let kCpmmContract = "cpmm_contract"
75+
7476 let kAdminPubKey1 = "admin_pub_1"
7577
7678 let kAdminPubKey2 = "admin_pub_2"
124126 let lpFarmingAddress = Address(getBase58FromOracle(kLPFarmingAddress))
125127
126128 let farmingTreasureAddr = Address(getBase58FromOracle(kFarmingTreasureAddr))
129+
130+let cpmmContract = Address(getBase58FromOracle(kCpmmContract))
127131
128132 let active = getBooleanValue(this, kActive)
129133
211215 func calcInterest (pool,lastInterestHeight,rewardUpdateHeight,poolRewardUpdateHeight,farmInterest,boostInterest,poolVoted,boostLpInterest,currentRewardPerBlock,shareTokenLocked,previousRewardPerBlock,scaleValue) = if ((shareTokenLocked == 0))
212216 then $Tuple3(farmInterest, boostInterest, boostLpInterest)
213217 else {
214- let $t0959811011 = if (if (if ((rewardUpdateHeight > height))
218+ let $t0969711110 = if (if (if ((rewardUpdateHeight > height))
215219 then (rewardUpdateHeight == poolRewardUpdateHeight)
216220 else false)
217221 then true
243247 let rwd = (currentRewardPerBlock * (height - rewardUpdateHeight))
244248 $Tuple4(rwd, fBfrUp, bBfrUp, bLPBfrUp)
245249 }
246- let reward = $t0959811011._1
247- let farmIntrBefore = $t0959811011._2
248- let boostIntrBefore = $t0959811011._3
249- let boostLPIntrBefore = $t0959811011._4
250+ let reward = $t0969711110._1
251+ let farmIntrBefore = $t0969711110._2
252+ let boostIntrBefore = $t0969711110._3
253+ let boostLPIntrBefore = $t0969711110._4
250254 let newFarmInterest = (farmIntrBefore + fraction(calcFarmRwd(pool, reward), scaleValue, shareTokenLocked))
251255 let newBoostInterest = (boostIntrBefore + (if ((poolVoted > 0))
252256 then fraction(calcBoostRwd(pool, reward), scaleValue8, poolVoted)
264268 let uPoolVoted = getUserPoolVoted(pool, user)
265269 let shareToken = getTotalShareToken(pool)
266270 let totalShareVirtual = valueOrElse(getInteger(this, (pool + kShareTokensVirtual)), shareToken)
267- let $t01196012058 = getLastInterestInfo(pool)
268- let lastInterestHeight = $t01196012058._1
269- let farmInterest = $t01196012058._2
270- let boostInterest = $t01196012058._3
271- let boostLPInterest = $t01196012058._4
272- let $t01206312177 = rewardInfo(pool)
273- let currentRewardPerBlock = $t01206312177._1
274- let rewardUpdateHeight = $t01206312177._2
275- let previousRewardPerBlock = $t01206312177._3
276- let poolRewardUpdateHeight = $t01206312177._4
271+ let $t01205912157 = getLastInterestInfo(pool)
272+ let lastInterestHeight = $t01205912157._1
273+ let farmInterest = $t01205912157._2
274+ let boostInterest = $t01205912157._3
275+ let boostLPInterest = $t01205912157._4
276+ let $t01216212276 = rewardInfo(pool)
277+ let currentRewardPerBlock = $t01216212276._1
278+ let rewardUpdateHeight = $t01216212276._2
279+ let previousRewardPerBlock = $t01216212276._3
280+ let poolRewardUpdateHeight = $t01216212276._4
277281 let uFarmInterest = valueOrElse(getInteger(this, (((pool + "_") + user) + kFarmUserLastInterest)), farmInterest)
278282 let uBoostInterest = valueOrElse(getInteger(this, (((pool + "_") + user) + kBoostUserLastInterest)), boostInterest)
279283 let uBoostLPInterest = valueOrElse(getInteger(this, (((pool + "_") + user) + kBoostLPUserLastInterest)), boostLPInterest)
280284 let uShareTokensStaked = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensStaked)), 0)
281285 let uShareTokensVirt = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensVirtual)), uShareTokensStaked)
282- let $t01274513138 = calcInterest(pool, lastInterestHeight, rewardUpdateHeight, poolRewardUpdateHeight, farmInterest, boostInterest, poolVoted, boostLPInterest, currentRewardPerBlock, totalShareVirtual, previousRewardPerBlock, scaleValue)
283- let newFarmInterest = $t01274513138._1
284- let newBoostInterest = $t01274513138._2
285- let newBoostLPInterest = $t01274513138._3
286+ let $t01284413237 = calcInterest(pool, lastInterestHeight, rewardUpdateHeight, poolRewardUpdateHeight, farmInterest, boostInterest, poolVoted, boostLPInterest, currentRewardPerBlock, totalShareVirtual, previousRewardPerBlock, scaleValue)
287+ let newFarmInterest = $t01284413237._1
288+ let newBoostInterest = $t01284413237._2
289+ let newBoostLPInterest = $t01284413237._3
286290 let claimFarming = fraction(uShareTokensVirt, (newFarmInterest - uFarmInterest), scaleValue)
287291 let claimBoostingMax = fraction(uPoolVoted, (newBoostInterest - uBoostInterest), scaleValue8)
288292 let mul = fraction(toBigInt(uShareTokensVirt), toBigInt(uPoolVoted), toBigInt(1))
296300
297301 func availableClaimCalcAllByUser (pools,user) = {
298302 func calcAvailable (acc,pool) = {
299- let $t01397114000 = acc
300- let newPools = $t01397114000._1
301- let amounts = $t01397114000._2
302- let $t01400914068 = claimCalc(pool, user)
303- let fi = $t01400914068._1
304- let bi = $t01400914068._2
305- let blpi = $t01400914068._3
306- let claimAmount = $t01400914068._4
307- let tt = $t01400914068._5
303+ let $t01407014099 = acc
304+ let newPools = $t01407014099._1
305+ let amounts = $t01407014099._2
306+ let $t01410814167 = claimCalc(pool, user)
307+ let fi = $t01410814167._1
308+ let bi = $t01410814167._2
309+ let blpi = $t01410814167._3
310+ let claimAmount = $t01410814167._4
311+ let tt = $t01410814167._5
308312 let availableFund = (userAvailableSWOP(pool, user) + claimAmount)
309313 $Tuple2((newPools :+ pool), (amounts :+ availableFund))
310314 }
362366 else throw("Only admin can call this function")
363367
364368
365-func isPoolCall (i,pool) = if ((toString(i.caller) == pool))
369+func isPoolCall (i,pool) = if (if ((toString(i.caller) == pool))
370+ then true
371+ else (i.caller == cpmmContract))
366372 then unit
367373 else throw("Only pool can call this function")
368374
382388 let userLockedAmount = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensLocked)), 0)
383389 let userAmountVirtual = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensVirtual)), userStakedAmount)
384390 let totalUserShareTokens = ((userStakedAmount + userLockedAmount) + i.payments[0].amount)
385- let $t01684116893 = getLockParams(lockType)
386- let lockPeriod = $t01684116893._1
387- let lockCoef = $t01684116893._2
391+ let $t01696817020 = getLockParams(lockType)
392+ let lockPeriod = $t01696817020._1
393+ let lockCoef = $t01696817020._2
388394 let lockWavesFee = getIntegerValue(this, kLockWavesFee)
389395 if ((i.payments[0].assetId != shareAssetId))
390396 then throw("Wrong sharetoken in payment")
396402 let shareTokensChangeOnFH = canLockInFirstHarvest(pool, user, userStakedAmount, i.payments[0].amount, lockType)
397403 if ((shareTokensChangeOnFH == shareTokensChangeOnFH))
398404 then {
399- let $t01732019254 = if ((lockType == 0))
405+ let $t01744719381 = if ((lockType == 0))
400406 then {
401407 let userAmountVirtualNew = ((userAmountVirtual + i.payments[0].amount) - shareTokensChangeOnFH)
402408 $Tuple2([IntegerEntry((((pool + "_") + user) + kUserShareTokensStaked), ((userStakedAmount + i.payments[0].amount) - shareTokensChangeOnFH)), IntegerEntry((((pool + "_") + user) + kUserShareTokensVirtual), userAmountVirtualNew), IntegerEntry((pool + kShareTokensVirtual), ((totalShareVirtual + i.payments[0].amount) - shareTokensChangeOnFH)), ScriptTransfer(caller, shareTokensChangeOnFH, i.payments[0].assetId)], ((totalShare + i.payments[0].amount) - shareTokensChangeOnFH))
417423 let userAmountVirtualNew = (fraction(userLockedAmountNew, lockCoef, lockBoostCoefScale) + userStakedAmount)
418424 $Tuple2([IntegerEntry((((pool + "_") + user) + kUserShareTokensLocked), userLockedAmountNew), IntegerEntry((((pool + "_") + user) + kUserShareTokensLockedHeight), userLockedHeigtNew), IntegerEntry((((pool + "_") + user) + kUserShareTokensLockedType), lockType), IntegerEntry((((pool + "_") + user) + kUserShareTokensVirtual), userAmountVirtualNew), IntegerEntry((pool + kShareTokensVirtual), ((totalShareVirtual - userAmountVirtual) + userAmountVirtualNew))], (totalShare + i.payments[0].amount))
419425 }
420- let lockEntries = $t01732019254._1
421- let totalShareNew = $t01732019254._2
426+ let lockEntries = $t01744719381._1
427+ let totalShareNew = $t01744719381._2
422428 if ((accountBalance(shareAssetId) > totalShareNew))
423429 then throw("Balance of share-token is lower than totalAmount")
424430 else {
425- let $t01937919478 = claimCalc(pool, user)
426- let farmInterest = $t01937919478._1
427- let boostInterest = $t01937919478._2
428- let boostLPinterest = $t01937919478._3
429- let claimAmount = $t01937919478._4
430- let toTreasure = $t01937919478._5
431+ let $t01950619605 = claimCalc(pool, user)
432+ let farmInterest = $t01950619605._1
433+ let boostInterest = $t01950619605._2
434+ let boostLPinterest = $t01950619605._3
435+ let claimAmount = $t01950619605._4
436+ let toTreasure = $t01950619605._5
431437 let availableFundsNew = (userAvailableSWOP(pool, user) + claimAmount)
432438 let uplp = if ((getString(Address(fromBase58String(pool)), "version") == "3.0.0"))
433439 then invoke(lpFarmingAddress, "updateUserInterest", [user, pool, totalUserShareTokens], nil)
445451 func calcWithdrawShareTokens (i,caller,pool,shareTokensWithdrawAmount) = valueOrElse(isActive(), {
446452 let shareTokensId = fromBase58String(getStringValue(value(addressFromString(pool)), "share_asset_id"))
447453 let user = toString(caller)
448- let $t02082320922 = claimCalc(pool, user)
449- let farmInterest = $t02082320922._1
450- let boostInterest = $t02082320922._2
451- let boostLPinterest = $t02082320922._3
452- let claimAmount = $t02082320922._4
453- let toTreasure = $t02082320922._5
454+ let $t02095021049 = claimCalc(pool, user)
455+ let farmInterest = $t02095021049._1
456+ let boostInterest = $t02095021049._2
457+ let boostLPinterest = $t02095021049._3
458+ let claimAmount = $t02095021049._4
459+ let toTreasure = $t02095021049._5
454460 let userStakedAmount = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensStaked)), 0)
455461 let userLockedAmount = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensLocked)), 0)
456462 let userAmountVirtual = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensVirtual)), userStakedAmount)
480486 let shareTokensId = fromBase58String(getStringValue(value(addressFromString(pool)), "share_asset_id"))
481487 let user = toString(caller)
482488 let shareTokenLocked = getTotalShareToken(pool)
483- let $t02358823687 = claimCalc(pool, user)
484- let farmInterest = $t02358823687._1
485- let boostInterest = $t02358823687._2
486- let boostLPinterest = $t02358823687._3
487- let claimAmount = $t02358823687._4
488- let toTreasure = $t02358823687._5
489+ let $t02371523814 = claimCalc(pool, user)
490+ let farmInterest = $t02371523814._1
491+ let boostInterest = $t02371523814._2
492+ let boostLPinterest = $t02371523814._3
493+ let claimAmount = $t02371523814._4
494+ let toTreasure = $t02371523814._5
489495 let availableFund = (userAvailableSWOP(pool, user) + claimAmount)
490496 if ((availableFund == 0))
491497 then throw("You have 0 available SWOP")
522528 then throw("Only Governance can call this function")
523529 else {
524530 let user = toString(addressFromPublicKey(adminInvokePubKey))
525- let $t02584225916 = claimCalc(pool, user)
526- let farmInterest = $t02584225916._1
527- let boostInterest = $t02584225916._2
528- let boostLPinterest = $t02584225916._3
531+ let $t02596926043 = claimCalc(pool, user)
532+ let farmInterest = $t02596926043._1
533+ let boostInterest = $t02596926043._2
534+ let boostLPinterest = $t02596926043._3
529535 [IntegerEntry((pool + kFarmLastInterest), farmInterest), IntegerEntry((pool + kBoostLastInterest), boostInterest), IntegerEntry((pool + kBoostLPLastInterest), boostLPinterest), IntegerEntry((pool + kLastInterestHeight), height)]
530536 })
531537
552558 let userLockedAmount = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensLocked)), 0)
553559 let userAmountVirtual = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensVirtual)), userStakedAmount)
554560 let totalUserShareTokens = (userStakedAmount + userLockedAmount)
555- let $t02740327455 = getLockParams(lockType)
556- let lockPeriod = $t02740327455._1
557- let lockCoef = $t02740327455._2
561+ let $t02753027582 = getLockParams(lockType)
562+ let lockPeriod = $t02753027582._1
563+ let lockCoef = $t02753027582._2
558564 let lockWavesFee = getIntegerValue(this, kLockWavesFee)
559565 if ((getHeightFirstHarvest(pool) > height))
560566 then throw("You can't lock shareTokens till first harvest end.")
585591 let userStakedAmountNew = (userStakedAmount - lockAmount)
586592 let userLockedHeigtNew = (height + lockPeriod)
587593 let userAmountVirtualNew = (fraction(userLockedAmountNew, lockCoef, lockBoostCoefScale) + userStakedAmountNew)
588- let $t02874528844 = claimCalc(pool, user)
589- let farmInterest = $t02874528844._1
590- let boostInterest = $t02874528844._2
591- let boostLPinterest = $t02874528844._3
592- let claimAmount = $t02874528844._4
593- let toTreasure = $t02874528844._5
594+ let $t02887228971 = claimCalc(pool, user)
595+ let farmInterest = $t02887228971._1
596+ let boostInterest = $t02887228971._2
597+ let boostLPinterest = $t02887228971._3
598+ let claimAmount = $t02887228971._4
599+ let toTreasure = $t02887228971._5
594600 let availableFundsNew = (userAvailableSWOP(pool, user) + claimAmount)
595601 [IntegerEntry((((pool + "_") + user) + kUserShareTokensStaked), userStakedAmountNew), IntegerEntry((((pool + "_") + user) + kUserShareTokensLocked), userLockedAmountNew), IntegerEntry((((pool + "_") + user) + kUserShareTokensLockedHeight), userLockedHeigtNew), IntegerEntry((((pool + "_") + user) + kUserShareTokensLockedType), lockType), IntegerEntry((((pool + "_") + user) + kUserShareTokensVirtual), userAmountVirtualNew), IntegerEntry((pool + kShareTokensVirtual), ((totalShareVirtual - userAmountVirtual) + userAmountVirtualNew)), IntegerEntry((((pool + "_") + user) + kFarmUserLastInterest), farmInterest), IntegerEntry((((pool + "_") + user) + kBoostUserLastInterest), boostInterest), IntegerEntry((((pool + "_") + user) + kBoostLPUserLastInterest), boostLPinterest), IntegerEntry((pool + kFarmLastInterest), farmInterest), IntegerEntry((pool + kBoostLastInterest), boostInterest), IntegerEntry((pool + kBoostLPLastInterest), boostLPinterest), IntegerEntry((pool + kLastInterestHeight), height), IntegerEntry((((pool + "_") + user) + kAvailableSWOP), availableFundsNew), Reissue(SWOP, toTreasure, true), ScriptTransfer(farmingTreasureAddr, toTreasure, SWOP)]
596602 }
610616 then throw(("You can't unlock sharetokens till " + toString(userLockedHeigt)))
611617 else {
612618 let userStakedAmountNew = (userStakedAmount + userLockedAmount)
613- let $t03107431173 = claimCalc(pool, user)
614- let farmInterest = $t03107431173._1
615- let boostInterest = $t03107431173._2
616- let boostLPinterest = $t03107431173._3
617- let claimAmount = $t03107431173._4
618- let toTreasure = $t03107431173._5
619+ let $t03120131300 = claimCalc(pool, user)
620+ let farmInterest = $t03120131300._1
621+ let boostInterest = $t03120131300._2
622+ let boostLPinterest = $t03120131300._3
623+ let claimAmount = $t03120131300._4
624+ let toTreasure = $t03120131300._5
619625 let availableFundsNew = (userAvailableSWOP(pool, user) + claimAmount)
620626 [IntegerEntry((((pool + "_") + user) + kFarmUserLastInterest), farmInterest), IntegerEntry((((pool + "_") + user) + kBoostUserLastInterest), boostInterest), IntegerEntry((((pool + "_") + user) + kBoostLPUserLastInterest), boostLPinterest), IntegerEntry((pool + kFarmLastInterest), farmInterest), IntegerEntry((pool + kBoostLastInterest), boostInterest), IntegerEntry((pool + kBoostLPLastInterest), boostLPinterest), IntegerEntry((pool + kLastInterestHeight), height), IntegerEntry((((pool + "_") + user) + kUserShareTokensStaked), userStakedAmountNew), IntegerEntry((((pool + "_") + user) + kUserShareTokensVirtual), userStakedAmountNew), IntegerEntry((pool + kShareTokensVirtual), ((totalShareVirtual - userAmountVirtual) + userStakedAmountNew)), IntegerEntry((((pool + "_") + user) + kAvailableSWOP), availableFundsNew), DeleteEntry((((pool + "_") + user) + kUserShareTokensLocked)), DeleteEntry((((pool + "_") + user) + kUserShareTokensLockedHeight)), DeleteEntry((((pool + "_") + user) + kUserShareTokensLockedType)), Reissue(SWOP, toTreasure, true), ScriptTransfer(farmingTreasureAddr, toTreasure, SWOP), ScriptTransfer(i.caller, lockWavesFee, unit)]
621627 }
742748 func updateUserBoostInterest (pool,user) = valueOrElse(isActive(), if ((i.caller != votingAddress))
743749 then throw("Only voiting can call this function")
744750 else {
745- let $t03465534754 = claimCalc(pool, user)
746- let farmInterest = $t03465534754._1
747- let boostInterest = $t03465534754._2
748- let boostLPinterest = $t03465534754._3
749- let claimAmount = $t03465534754._4
750- let toTreasure = $t03465534754._5
751+ let $t03478234881 = claimCalc(pool, user)
752+ let farmInterest = $t03478234881._1
753+ let boostInterest = $t03478234881._2
754+ let boostLPinterest = $t03478234881._3
755+ let claimAmount = $t03478234881._4
756+ let toTreasure = $t03478234881._5
751757 let availableFundsNew = (userAvailableSWOP(pool, user) + claimAmount)
752758 [IntegerEntry((((pool + "_") + user) + kFarmUserLastInterest), farmInterest), IntegerEntry((((pool + "_") + user) + kBoostUserLastInterest), boostInterest), IntegerEntry((((pool + "_") + user) + kBoostLPUserLastInterest), boostLPinterest), IntegerEntry((pool + kFarmLastInterest), farmInterest), IntegerEntry((pool + kBoostLastInterest), boostInterest), IntegerEntry((pool + kBoostLPLastInterest), boostLPinterest), IntegerEntry((pool + kLastInterestHeight), height), IntegerEntry((((pool + "_") + user) + kAvailableSWOP), availableFundsNew), Reissue(SWOP, toTreasure, true), ScriptTransfer(farmingTreasureAddr, toTreasure, SWOP)]
753759 })
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let kActive = "active"
55
66 let kActiveGlob = "active_all_contracts"
77
88 let kCause = "shutdown_cause"
99
1010 let kRewardPoolFractionCurrent = "_current_pool_fraction_reward"
1111
1212 let kRewardPoolFractionPrevious = "_previous_pool_fraction_reward"
1313
1414 let kHeightPoolFraction = "_pool_reward_update_height"
1515
1616 let kTotalRewardPerBlockCurrent = "total_reward_per_block_current"
1717
1818 let kTotalRewardPerBlockPrevious = "total_reward_per_block_previous"
1919
2020 let kRewardUpdateHeight = "reward_update_height"
2121
2222 let kUserShareTokensStaked = "_share_tokens_locked"
2323
2424 let kUserShareTokensLocked = "_share_tokens_blocked"
2525
2626 let kUserShareTokensLockedType = "_share_tokens_blocked_type"
2727
2828 let kUserShareTokensLockedHeight = "_share_tokens_blocked_height"
2929
3030 let kUserShareTokensVirtual = "_share_tokens_virtual"
3131
3232 let kShareTotalShareTokens = "_total_share_tokens_locked"
3333
3434 let kShareTokensVirtual = "_total_share_tokens_virtual"
3535
3636 let kLockParams = "_lock_params"
3737
3838 let kLockWavesFee = "lock_waves_fee"
3939
4040 let kPoolBoostCoef = "_boost_coef"
4141
4242 let kFarmLastInterest = "_last_interest"
4343
4444 let kFarmUserLastInterest = "_last_interest"
4545
4646 let kBoostLastInterest = "_last_interest_b"
4747
4848 let kBoostUserLastInterest = "_last_interest_u_b"
4949
5050 let kBoostLPLastInterest = "_last_interest_lpb"
5151
5252 let kBoostLPUserLastInterest = "_last_interest_u_lpb"
5353
5454 let kLastInterestHeight = "_last_interest_height"
5555
5656 let kSWOPid = "SWOP_id"
5757
5858 let kAvailableSWOP = "_available_SWOP"
5959
6060 let kSwopYearEmission = "swop_year_emission"
6161
6262 let kHarvestPoolVote = "_harvest_pool_vote_gSWOP"
6363
6464 let kPoolVote = "_pool_vote_gSWOP"
6565
6666 let kUserPoolVote = "_user_vote_gSWOP"
6767
6868 let kHarvestUserPoolVote = "_harvest_user_pool_vote_gSWOP"
6969
7070 let kFirstHarvestHeight = "first_harvest_height"
7171
7272 let kShareLimitFH = "share_limit_on_first_harvest"
7373
74+let kCpmmContract = "cpmm_contract"
75+
7476 let kAdminPubKey1 = "admin_pub_1"
7577
7678 let kAdminPubKey2 = "admin_pub_2"
7779
7880 let kAdminPubKey3 = "admin_pub_3"
7981
8082 let kAdminInvokePubKey = "admin_invoke_pub"
8183
8284 let kMoneyBoxAddress = "money_box_address"
8385
8486 let kVotingAddress = "voting_address"
8587
8688 let kGovAddress = "governance_address"
8789
8890 let kLPFarmingAddress = "lp_farming"
8991
9092 let kFarmingTreasureAddr = "farming_treasure"
9193
9294 let oracle = Address(base58'3MvVBtsXroQpy1tsPw21TU2ET9A8WfmrNjz')
9395
9496 let totalVoteShare = 10000000000
9597
9698 let scaleValue8 = 100000000
9799
98100 let lockBoostCoefScale = 1000
99101
100102 let defPoolBoostCoef = 500
101103
102104 func getBase58FromOracle (key) = match getString(oracle, key) {
103105 case string: String =>
104106 fromBase58String(string)
105107 case nothing =>
106108 throw((key + "is empty"))
107109 }
108110
109111
110112 let adminPubKey1 = getBase58FromOracle(kAdminPubKey1)
111113
112114 let adminPubKey2 = getBase58FromOracle(kAdminPubKey2)
113115
114116 let adminPubKey3 = getBase58FromOracle(kAdminPubKey3)
115117
116118 let moneyBoxAddress = Address(getBase58FromOracle(kMoneyBoxAddress))
117119
118120 let votingAddress = Address(getBase58FromOracle(kVotingAddress))
119121
120122 let govAddress = Address(getBase58FromOracle(kGovAddress))
121123
122124 let adminInvokePubKey = getBase58FromOracle(kAdminInvokePubKey)
123125
124126 let lpFarmingAddress = Address(getBase58FromOracle(kLPFarmingAddress))
125127
126128 let farmingTreasureAddr = Address(getBase58FromOracle(kFarmingTreasureAddr))
129+
130+let cpmmContract = Address(getBase58FromOracle(kCpmmContract))
127131
128132 let active = getBooleanValue(this, kActive)
129133
130134 let activeGlob = valueOrElse(getBoolean(oracle, kActiveGlob), true)
131135
132136 let SWOP = fromBase58String(getStringValue(this, kSWOPid))
133137
134138 func getHeightFirstHarvest (pool) = valueOrElse(getInteger(Address(fromBase58String(pool)), kFirstHarvestHeight), 0)
135139
136140
137141 func getFHShareLimitToken (pool) = valueOrErrorMessage(getInteger(pool, kShareLimitFH), ("No data on the key: " + kShareLimitFH))
138142
139143
140144 func getTotalShareToken (pool) = valueOrErrorMessage(getInteger(this, (pool + kShareTotalShareTokens)), (("No data on the key: " + pool) + kShareTotalShareTokens))
141145
142146
143147 func getPoolVoted (pool) = valueOrElse(getInteger(votingAddress, (pool + kPoolVote)), 0)
144148
145149
146150 func getUserPoolVoted (pool,user) = valueOrElse(getInteger(votingAddress, (((user + "_") + pool) + kUserPoolVote)), 0)
147151
148152
149153 func getShareAssetId (pool) = fromBase58String(getStringValue(value(addressFromString(pool)), "share_asset_id"))
150154
151155
152156 func accountBalance (assetId) = match assetId {
153157 case id: ByteVector =>
154158 assetBalance(this, id)
155159 case waves: Unit =>
156160 wavesBalance(this).available
157161 case _ =>
158162 throw("Match error")
159163 }
160164
161165
162166 func calcScaleValue (assetId1,assetId2) = {
163167 let assetId1Decimals = value(assetInfo(assetId1)).decimals
164168 let assetId2Decimals = value(assetInfo(assetId2)).decimals
165169 let scaleDigits = ((assetId2Decimals - assetId1Decimals) + 8)
166170 pow(10, 0, scaleDigits, 0, 0, DOWN)
167171 }
168172
169173
170174 func userAvailableSWOP (pool,user) = valueOrElse(getInteger(this, (((pool + "_") + user) + kAvailableSWOP)), 0)
171175
172176
173177 func rewardInfo (pool) = {
174178 let totalRewardPerBlockCurrent = valueOrErrorMessage(getInteger(govAddress, kTotalRewardPerBlockCurrent), ((("No data on the key: " + kTotalRewardPerBlockCurrent) + " at address ") + toString(govAddress)))
175179 let totalRewardPerBlockPrevious = valueOrErrorMessage(getInteger(govAddress, kTotalRewardPerBlockPrevious), ((("No data on the key: " + kTotalRewardPerBlockPrevious) + " at address ") + toString(govAddress)))
176180 let rewardPoolFractionCurrent = valueOrErrorMessage(getInteger(govAddress, (pool + kRewardPoolFractionCurrent)), (((("No data on the key: " + pool) + kRewardPoolFractionCurrent) + " at address ") + toString(govAddress)))
177181 let rewardUpdateHeight = valueOrErrorMessage(getInteger(govAddress, kRewardUpdateHeight), ((("No data on the key: " + kRewardUpdateHeight) + " at address ") + toString(govAddress)))
178182 let poolRewardUpdateHeight = valueOrElse(getInteger(govAddress, (pool + kHeightPoolFraction)), rewardUpdateHeight)
179183 let rewardPoolFractionPrevious = valueOrErrorMessage(getInteger(govAddress, (pool + kRewardPoolFractionPrevious)), (((("No data on the key: " + pool) + kRewardPoolFractionPrevious) + " at address ") + toString(govAddress)))
180184 let rewardPoolCurrent = fraction(totalRewardPerBlockCurrent, rewardPoolFractionCurrent, totalVoteShare)
181185 let rewardPoolPrevious = fraction(totalRewardPerBlockCurrent, rewardPoolFractionPrevious, totalVoteShare)
182186 if (if ((rewardPoolCurrent > totalRewardPerBlockCurrent))
183187 then true
184188 else (rewardPoolPrevious > totalRewardPerBlockPrevious))
185189 then throw("rewardPoolCurrent > totalRewardPerBlockCurrent or rewardPoolPrevious > totalRewardPerBlockPrevious")
186190 else $Tuple4(rewardPoolCurrent, rewardUpdateHeight, rewardPoolPrevious, poolRewardUpdateHeight)
187191 }
188192
189193
190194 func getLastInterestInfo (pool) = {
191195 let farmInterest = valueOrErrorMessage(getInteger(this, (pool + kFarmLastInterest)), (("No data on the key: " + pool) + kFarmLastInterest))
192196 let boostInterest = valueOrErrorMessage(getInteger(this, (pool + kBoostLastInterest)), (("No data on the key: " + pool) + kBoostLastInterest))
193197 let boostLPInterest = valueOrErrorMessage(getInteger(this, (pool + kBoostLPLastInterest)), (("No data on the key: " + pool) + kBoostLPLastInterest))
194198 let lastInterestHeight = valueOrElse(getInteger(this, (pool + kLastInterestHeight)), height)
195199 $Tuple4(lastInterestHeight, farmInterest, boostInterest, boostLPInterest)
196200 }
197201
198202
199203 func calcFarmRwd (pool,curTotalReward) = {
200204 let poolBoostCoef = valueOrElse(getInteger(this, (pool + kPoolBoostCoef)), defPoolBoostCoef)
201205 fraction(curTotalReward, lockBoostCoefScale, (poolBoostCoef + lockBoostCoefScale))
202206 }
203207
204208
205209 func calcBoostRwd (pool,curTotalReward) = {
206210 let poolBoostCoef = valueOrElse(getInteger(this, (pool + kPoolBoostCoef)), defPoolBoostCoef)
207211 fraction(curTotalReward, poolBoostCoef, (poolBoostCoef + lockBoostCoefScale))
208212 }
209213
210214
211215 func calcInterest (pool,lastInterestHeight,rewardUpdateHeight,poolRewardUpdateHeight,farmInterest,boostInterest,poolVoted,boostLpInterest,currentRewardPerBlock,shareTokenLocked,previousRewardPerBlock,scaleValue) = if ((shareTokenLocked == 0))
212216 then $Tuple3(farmInterest, boostInterest, boostLpInterest)
213217 else {
214- let $t0959811011 = if (if (if ((rewardUpdateHeight > height))
218+ let $t0969711110 = if (if (if ((rewardUpdateHeight > height))
215219 then (rewardUpdateHeight == poolRewardUpdateHeight)
216220 else false)
217221 then true
218222 else if ((height > rewardUpdateHeight))
219223 then (rewardUpdateHeight != poolRewardUpdateHeight)
220224 else false)
221225 then {
222226 let r = (previousRewardPerBlock * (height - lastInterestHeight))
223227 $Tuple4(r, farmInterest, boostInterest, boostLpInterest)
224228 }
225229 else if (if (if ((height > rewardUpdateHeight))
226230 then (rewardUpdateHeight == poolRewardUpdateHeight)
227231 else false)
228232 then (lastInterestHeight > rewardUpdateHeight)
229233 else false)
230234 then {
231235 let r = (currentRewardPerBlock * (height - lastInterestHeight))
232236 $Tuple4(r, farmInterest, boostInterest, boostLpInterest)
233237 }
234238 else {
235239 let rwdBfrUpd = (previousRewardPerBlock * (rewardUpdateHeight - lastInterestHeight))
236240 let fBfrUp = (farmInterest + fraction(calcFarmRwd(pool, rwdBfrUpd), scaleValue, shareTokenLocked))
237241 let bBfrUp = (boostInterest + (if ((poolVoted > 0))
238242 then fraction(calcBoostRwd(pool, rwdBfrUpd), scaleValue8, poolVoted)
239243 else 0))
240244 let bLPBfrUp = (boostLpInterest + (if ((poolVoted > 0))
241245 then fraction(fraction(calcBoostRwd(pool, rwdBfrUpd), scaleValue8, shareTokenLocked), scaleValue8, poolVoted)
242246 else 0))
243247 let rwd = (currentRewardPerBlock * (height - rewardUpdateHeight))
244248 $Tuple4(rwd, fBfrUp, bBfrUp, bLPBfrUp)
245249 }
246- let reward = $t0959811011._1
247- let farmIntrBefore = $t0959811011._2
248- let boostIntrBefore = $t0959811011._3
249- let boostLPIntrBefore = $t0959811011._4
250+ let reward = $t0969711110._1
251+ let farmIntrBefore = $t0969711110._2
252+ let boostIntrBefore = $t0969711110._3
253+ let boostLPIntrBefore = $t0969711110._4
250254 let newFarmInterest = (farmIntrBefore + fraction(calcFarmRwd(pool, reward), scaleValue, shareTokenLocked))
251255 let newBoostInterest = (boostIntrBefore + (if ((poolVoted > 0))
252256 then fraction(calcBoostRwd(pool, reward), scaleValue8, poolVoted)
253257 else 0))
254258 let newBoostLPInterest = (boostLPIntrBefore + (if ((poolVoted > 0))
255259 then fraction(fraction(calcBoostRwd(pool, reward), scaleValue8, shareTokenLocked), scaleValue8, poolVoted)
256260 else 0))
257261 $Tuple3(newFarmInterest, newBoostInterest, newBoostLPInterest)
258262 }
259263
260264
261265 func claimCalc (pool,user) = {
262266 let scaleValue = calcScaleValue(SWOP, getShareAssetId(pool))
263267 let poolVoted = getPoolVoted(pool)
264268 let uPoolVoted = getUserPoolVoted(pool, user)
265269 let shareToken = getTotalShareToken(pool)
266270 let totalShareVirtual = valueOrElse(getInteger(this, (pool + kShareTokensVirtual)), shareToken)
267- let $t01196012058 = getLastInterestInfo(pool)
268- let lastInterestHeight = $t01196012058._1
269- let farmInterest = $t01196012058._2
270- let boostInterest = $t01196012058._3
271- let boostLPInterest = $t01196012058._4
272- let $t01206312177 = rewardInfo(pool)
273- let currentRewardPerBlock = $t01206312177._1
274- let rewardUpdateHeight = $t01206312177._2
275- let previousRewardPerBlock = $t01206312177._3
276- let poolRewardUpdateHeight = $t01206312177._4
271+ let $t01205912157 = getLastInterestInfo(pool)
272+ let lastInterestHeight = $t01205912157._1
273+ let farmInterest = $t01205912157._2
274+ let boostInterest = $t01205912157._3
275+ let boostLPInterest = $t01205912157._4
276+ let $t01216212276 = rewardInfo(pool)
277+ let currentRewardPerBlock = $t01216212276._1
278+ let rewardUpdateHeight = $t01216212276._2
279+ let previousRewardPerBlock = $t01216212276._3
280+ let poolRewardUpdateHeight = $t01216212276._4
277281 let uFarmInterest = valueOrElse(getInteger(this, (((pool + "_") + user) + kFarmUserLastInterest)), farmInterest)
278282 let uBoostInterest = valueOrElse(getInteger(this, (((pool + "_") + user) + kBoostUserLastInterest)), boostInterest)
279283 let uBoostLPInterest = valueOrElse(getInteger(this, (((pool + "_") + user) + kBoostLPUserLastInterest)), boostLPInterest)
280284 let uShareTokensStaked = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensStaked)), 0)
281285 let uShareTokensVirt = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensVirtual)), uShareTokensStaked)
282- let $t01274513138 = calcInterest(pool, lastInterestHeight, rewardUpdateHeight, poolRewardUpdateHeight, farmInterest, boostInterest, poolVoted, boostLPInterest, currentRewardPerBlock, totalShareVirtual, previousRewardPerBlock, scaleValue)
283- let newFarmInterest = $t01274513138._1
284- let newBoostInterest = $t01274513138._2
285- let newBoostLPInterest = $t01274513138._3
286+ let $t01284413237 = calcInterest(pool, lastInterestHeight, rewardUpdateHeight, poolRewardUpdateHeight, farmInterest, boostInterest, poolVoted, boostLPInterest, currentRewardPerBlock, totalShareVirtual, previousRewardPerBlock, scaleValue)
287+ let newFarmInterest = $t01284413237._1
288+ let newBoostInterest = $t01284413237._2
289+ let newBoostLPInterest = $t01284413237._3
286290 let claimFarming = fraction(uShareTokensVirt, (newFarmInterest - uFarmInterest), scaleValue)
287291 let claimBoostingMax = fraction(uPoolVoted, (newBoostInterest - uBoostInterest), scaleValue8)
288292 let mul = fraction(toBigInt(uShareTokensVirt), toBigInt(uPoolVoted), toBigInt(1))
289293 let claimBoosting = toInt(fraction(fraction(mul, toBigInt((newBoostLPInterest - uBoostLPInterest)), toBigInt(scaleValue8)), toBigInt(1), toBigInt(scaleValue8)))
290294 let toTreasury = (claimBoostingMax - claimBoosting)
291295 if ((0 > toTreasury))
292296 then throw("toTreasury < 0")
293297 else $Tuple5(newFarmInterest, newBoostInterest, newBoostLPInterest, (claimFarming + claimBoosting), toTreasury)
294298 }
295299
296300
297301 func availableClaimCalcAllByUser (pools,user) = {
298302 func calcAvailable (acc,pool) = {
299- let $t01397114000 = acc
300- let newPools = $t01397114000._1
301- let amounts = $t01397114000._2
302- let $t01400914068 = claimCalc(pool, user)
303- let fi = $t01400914068._1
304- let bi = $t01400914068._2
305- let blpi = $t01400914068._3
306- let claimAmount = $t01400914068._4
307- let tt = $t01400914068._5
303+ let $t01407014099 = acc
304+ let newPools = $t01407014099._1
305+ let amounts = $t01407014099._2
306+ let $t01410814167 = claimCalc(pool, user)
307+ let fi = $t01410814167._1
308+ let bi = $t01410814167._2
309+ let blpi = $t01410814167._3
310+ let claimAmount = $t01410814167._4
311+ let tt = $t01410814167._5
308312 let availableFund = (userAvailableSWOP(pool, user) + claimAmount)
309313 $Tuple2((newPools :+ pool), (amounts :+ availableFund))
310314 }
311315
312316 let $l = pools
313317 let $s = size($l)
314318 let $acc0 = $Tuple2(nil, nil)
315319 func $f0_1 ($a,$i) = if (($i >= $s))
316320 then $a
317321 else calcAvailable($a, $l[$i])
318322
319323 func $f0_2 ($a,$i) = if (($i >= $s))
320324 then $a
321325 else throw("List size exceeds 60")
322326
323327 $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($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)
324328 }
325329
326330
327331 func canLockInFirstHarvest (pool,user,userShareTokensStaked,pmtAmount,lockType) = if ((getHeightFirstHarvest(pool) > height))
328332 then {
329333 let totalVoteAmount = valueOrElse(getInteger(votingAddress, (pool + kHarvestPoolVote)), 0)
330334 let userVoteAmount = valueOrElse(getInteger(votingAddress, (((user + "_") + pool) + kHarvestUserPoolVote)), 0)
331335 let FHShareTokenLimit = getFHShareLimitToken(addressFromStringValue(pool))
332336 let FHShareTokenUserLimit = (fraction(FHShareTokenLimit, userVoteAmount, totalVoteAmount) - userShareTokensStaked)
333337 if ((lockType > 0))
334338 then throw("You can't lock shareTokens till first harvest end.")
335339 else if ((userVoteAmount == 0))
336340 then 0
337341 else if ((pmtAmount >= FHShareTokenUserLimit))
338342 then (pmtAmount - FHShareTokenUserLimit)
339343 else 0
340344 }
341345 else 0
342346
343347
344348 func getLockParams (type) = {
345349 let lockParams = split(valueOrErrorMessage(getString(this, (toString(type) + kLockParams)), ("There are no key for lock type" + toString(type))), "_")
346350 $Tuple2(parseIntValue(lockParams[0]), parseIntValue(lockParams[1]))
347351 }
348352
349353
350354 func suspend (cause) = [BooleanEntry(kActive, false), StringEntry(kCause, cause)]
351355
352356
353357 func isActive () = if (if (active)
354358 then activeGlob
355359 else false)
356360 then unit
357361 else throw("DApp is inactive at this moment")
358362
359363
360364 func isAdminCall (i) = if (containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey))
361365 then unit
362366 else throw("Only admin can call this function")
363367
364368
365-func isPoolCall (i,pool) = if ((toString(i.caller) == pool))
369+func isPoolCall (i,pool) = if (if ((toString(i.caller) == pool))
370+ then true
371+ else (i.caller == cpmmContract))
366372 then unit
367373 else throw("Only pool can call this function")
368374
369375
370376 func isSelfCall (i) = if ((i.caller == this))
371377 then unit
372378 else throw("Only contract itself can call this function")
373379
374380
375381 func calcLockShareTokens (i,caller,pool,lockType) = {
376382 let shareAssetId = getShareAssetId(pool)
377383 let user = toString(caller)
378384 let totalShare = getTotalShareToken(pool)
379385 let totalShareVirtual = valueOrElse(getInteger(this, (pool + kShareTokensVirtual)), totalShare)
380386 let userStakedAmount = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensStaked)), 0)
381387 let userLockedHeigt = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensLockedHeight)), 0)
382388 let userLockedAmount = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensLocked)), 0)
383389 let userAmountVirtual = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensVirtual)), userStakedAmount)
384390 let totalUserShareTokens = ((userStakedAmount + userLockedAmount) + i.payments[0].amount)
385- let $t01684116893 = getLockParams(lockType)
386- let lockPeriod = $t01684116893._1
387- let lockCoef = $t01684116893._2
391+ let $t01696817020 = getLockParams(lockType)
392+ let lockPeriod = $t01696817020._1
393+ let lockCoef = $t01696817020._2
388394 let lockWavesFee = getIntegerValue(this, kLockWavesFee)
389395 if ((i.payments[0].assetId != shareAssetId))
390396 then throw("Wrong sharetoken in payment")
391397 else if ((0 >= i.payments[0].amount))
392398 then throw("Payment amount must be greater than 0")
393399 else if ((0 > lockType))
394400 then throw("lockType must be >= 0")
395401 else {
396402 let shareTokensChangeOnFH = canLockInFirstHarvest(pool, user, userStakedAmount, i.payments[0].amount, lockType)
397403 if ((shareTokensChangeOnFH == shareTokensChangeOnFH))
398404 then {
399- let $t01732019254 = if ((lockType == 0))
405+ let $t01744719381 = if ((lockType == 0))
400406 then {
401407 let userAmountVirtualNew = ((userAmountVirtual + i.payments[0].amount) - shareTokensChangeOnFH)
402408 $Tuple2([IntegerEntry((((pool + "_") + user) + kUserShareTokensStaked), ((userStakedAmount + i.payments[0].amount) - shareTokensChangeOnFH)), IntegerEntry((((pool + "_") + user) + kUserShareTokensVirtual), userAmountVirtualNew), IntegerEntry((pool + kShareTokensVirtual), ((totalShareVirtual + i.payments[0].amount) - shareTokensChangeOnFH)), ScriptTransfer(caller, shareTokensChangeOnFH, i.payments[0].assetId)], ((totalShare + i.payments[0].amount) - shareTokensChangeOnFH))
403409 }
404410 else if (if ((userLockedHeigt == 0))
405411 then if (if ((2 > size(i.payments)))
406412 then true
407413 else (i.payments[1].assetId != unit))
408414 then true
409415 else (lockWavesFee > i.payments[1].amount)
410416 else false)
411417 then throw((("You need to pay additional waves comission " + toString(lockWavesFee)) + "WAVES"))
412418 else if ((userLockedHeigt > (height + lockPeriod)))
413419 then throw("You cannot lock sharetokens for a period less than what you have already locked")
414420 else {
415421 let userLockedAmountNew = (userLockedAmount + i.payments[0].amount)
416422 let userLockedHeigtNew = (height + lockPeriod)
417423 let userAmountVirtualNew = (fraction(userLockedAmountNew, lockCoef, lockBoostCoefScale) + userStakedAmount)
418424 $Tuple2([IntegerEntry((((pool + "_") + user) + kUserShareTokensLocked), userLockedAmountNew), IntegerEntry((((pool + "_") + user) + kUserShareTokensLockedHeight), userLockedHeigtNew), IntegerEntry((((pool + "_") + user) + kUserShareTokensLockedType), lockType), IntegerEntry((((pool + "_") + user) + kUserShareTokensVirtual), userAmountVirtualNew), IntegerEntry((pool + kShareTokensVirtual), ((totalShareVirtual - userAmountVirtual) + userAmountVirtualNew))], (totalShare + i.payments[0].amount))
419425 }
420- let lockEntries = $t01732019254._1
421- let totalShareNew = $t01732019254._2
426+ let lockEntries = $t01744719381._1
427+ let totalShareNew = $t01744719381._2
422428 if ((accountBalance(shareAssetId) > totalShareNew))
423429 then throw("Balance of share-token is lower than totalAmount")
424430 else {
425- let $t01937919478 = claimCalc(pool, user)
426- let farmInterest = $t01937919478._1
427- let boostInterest = $t01937919478._2
428- let boostLPinterest = $t01937919478._3
429- let claimAmount = $t01937919478._4
430- let toTreasure = $t01937919478._5
431+ let $t01950619605 = claimCalc(pool, user)
432+ let farmInterest = $t01950619605._1
433+ let boostInterest = $t01950619605._2
434+ let boostLPinterest = $t01950619605._3
435+ let claimAmount = $t01950619605._4
436+ let toTreasure = $t01950619605._5
431437 let availableFundsNew = (userAvailableSWOP(pool, user) + claimAmount)
432438 let uplp = if ((getString(Address(fromBase58String(pool)), "version") == "3.0.0"))
433439 then invoke(lpFarmingAddress, "updateUserInterest", [user, pool, totalUserShareTokens], nil)
434440 else 0
435441 if ((uplp == uplp))
436442 then ([IntegerEntry((((pool + "_") + user) + kFarmUserLastInterest), farmInterest), IntegerEntry((((pool + "_") + user) + kBoostUserLastInterest), boostInterest), IntegerEntry((((pool + "_") + user) + kBoostLPUserLastInterest), boostLPinterest), IntegerEntry((pool + kFarmLastInterest), farmInterest), IntegerEntry((pool + kBoostLastInterest), boostInterest), IntegerEntry((pool + kBoostLPLastInterest), boostLPinterest), IntegerEntry((pool + kLastInterestHeight), height), IntegerEntry((pool + kShareTotalShareTokens), totalShareNew), IntegerEntry((((pool + "_") + user) + kAvailableSWOP), availableFundsNew), Reissue(SWOP, toTreasure, true), ScriptTransfer(farmingTreasureAddr, toTreasure, SWOP)] ++ lockEntries)
437443 else throw("Strict value is not equal to itself.")
438444 }
439445 }
440446 else throw("Strict value is not equal to itself.")
441447 }
442448 }
443449
444450
445451 func calcWithdrawShareTokens (i,caller,pool,shareTokensWithdrawAmount) = valueOrElse(isActive(), {
446452 let shareTokensId = fromBase58String(getStringValue(value(addressFromString(pool)), "share_asset_id"))
447453 let user = toString(caller)
448- let $t02082320922 = claimCalc(pool, user)
449- let farmInterest = $t02082320922._1
450- let boostInterest = $t02082320922._2
451- let boostLPinterest = $t02082320922._3
452- let claimAmount = $t02082320922._4
453- let toTreasure = $t02082320922._5
454+ let $t02095021049 = claimCalc(pool, user)
455+ let farmInterest = $t02095021049._1
456+ let boostInterest = $t02095021049._2
457+ let boostLPinterest = $t02095021049._3
458+ let claimAmount = $t02095021049._4
459+ let toTreasure = $t02095021049._5
454460 let userStakedAmount = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensStaked)), 0)
455461 let userLockedAmount = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensLocked)), 0)
456462 let userAmountVirtual = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensVirtual)), userStakedAmount)
457463 let userStakedAmountNew = (userStakedAmount - shareTokensWithdrawAmount)
458464 let availableFundsNew = (userAvailableSWOP(pool, user) + claimAmount)
459465 let totalShareAmount = getTotalShareToken(pool)
460466 let totalShareVirtual = valueOrElse(getInteger(this, (pool + kShareTokensVirtual)), totalShareAmount)
461467 let totalShareAmountNew = (totalShareAmount - shareTokensWithdrawAmount)
462468 let totalShareVirtualNew = (totalShareVirtual - shareTokensWithdrawAmount)
463469 let userAmountVirtualNew = (userAmountVirtual - shareTokensWithdrawAmount)
464470 if ((shareTokensWithdrawAmount > userStakedAmount))
465471 then throw("Withdraw amount more then user locked amount")
466472 else if ((accountBalance(shareTokensId) > totalShareAmount))
467473 then throw("Balance of share-token is lower than totalAmount")
468474 else {
469475 let uplp = if ((getString(Address(fromBase58String(pool)), "version") == "3.0.0"))
470476 then invoke(lpFarmingAddress, "updateUserInterest", [user, pool, (userStakedAmount + userLockedAmount)], nil)
471477 else 0
472478 if ((uplp == uplp))
473479 then [IntegerEntry((((pool + "_") + user) + kFarmUserLastInterest), farmInterest), IntegerEntry((((pool + "_") + user) + kBoostUserLastInterest), boostInterest), IntegerEntry((((pool + "_") + user) + kBoostLPUserLastInterest), boostLPinterest), IntegerEntry((pool + kFarmLastInterest), farmInterest), IntegerEntry((pool + kBoostLastInterest), boostInterest), IntegerEntry((pool + kBoostLPLastInterest), boostLPinterest), IntegerEntry((pool + kLastInterestHeight), height), IntegerEntry((((pool + "_") + user) + kUserShareTokensStaked), userStakedAmountNew), IntegerEntry((((pool + "_") + user) + kUserShareTokensVirtual), userAmountVirtualNew), IntegerEntry((pool + kShareTotalShareTokens), totalShareAmountNew), IntegerEntry((pool + kShareTokensVirtual), totalShareVirtualNew), IntegerEntry((((pool + "_") + user) + kAvailableSWOP), availableFundsNew), Reissue(SWOP, toTreasure, true), ScriptTransfer(farmingTreasureAddr, toTreasure, SWOP), ScriptTransfer(i.caller, shareTokensWithdrawAmount, shareTokensId)]
474480 else throw("Strict value is not equal to itself.")
475481 }
476482 })
477483
478484
479485 func calcClaim (i,pool,caller) = {
480486 let shareTokensId = fromBase58String(getStringValue(value(addressFromString(pool)), "share_asset_id"))
481487 let user = toString(caller)
482488 let shareTokenLocked = getTotalShareToken(pool)
483- let $t02358823687 = claimCalc(pool, user)
484- let farmInterest = $t02358823687._1
485- let boostInterest = $t02358823687._2
486- let boostLPinterest = $t02358823687._3
487- let claimAmount = $t02358823687._4
488- let toTreasure = $t02358823687._5
489+ let $t02371523814 = claimCalc(pool, user)
490+ let farmInterest = $t02371523814._1
491+ let boostInterest = $t02371523814._2
492+ let boostLPinterest = $t02371523814._3
493+ let claimAmount = $t02371523814._4
494+ let toTreasure = $t02371523814._5
489495 let availableFund = (userAvailableSWOP(pool, user) + claimAmount)
490496 if ((availableFund == 0))
491497 then throw("You have 0 available SWOP")
492498 else if ((accountBalance(shareTokensId) > shareTokenLocked))
493499 then throw("Balance of share-token is lower than totalAmount")
494500 else {
495501 let uTrans = if ((i.caller != this))
496502 then [ScriptTransfer(i.caller, availableFund, SWOP)]
497503 else nil
498504 $Tuple2(([IntegerEntry((((pool + "_") + user) + kFarmUserLastInterest), farmInterest), IntegerEntry((((pool + "_") + user) + kBoostUserLastInterest), boostInterest), IntegerEntry((((pool + "_") + user) + kBoostLPUserLastInterest), boostLPinterest), IntegerEntry((pool + kFarmLastInterest), farmInterest), IntegerEntry((pool + kBoostLastInterest), boostInterest), IntegerEntry((pool + kBoostLPLastInterest), boostLPinterest), IntegerEntry((pool + kLastInterestHeight), height), IntegerEntry((((pool + "_") + user) + kAvailableSWOP), 0), Reissue(SWOP, (toTreasure + availableFund), true), ScriptTransfer(farmingTreasureAddr, toTreasure, SWOP)] ++ uTrans), availableFund)
499505 }
500506 }
501507
502508
503509 @Callable(i)
504510 func init (earlyLP) = if (isDefined(getString(this, kSWOPid)))
505511 then throw("SWOP already initialized")
506512 else {
507513 let initAmount = 100000000000000
508514 let SWOPissue = Issue("SWOP", "SWOP protocol token", initAmount, 8, true)
509515 let SWOPid = calculateAssetId(SWOPissue)
510516 [BooleanEntry(kActive, true), Issue("SWOP", "SWOP protocol token", initAmount, 8, true), StringEntry(kSWOPid, toBase58String(SWOPid))]
511517 }
512518
513519
514520
515521 @Callable(i)
516522 func initPoolShareFarming (pool) = valueOrElse(isAdminCall(i), [IntegerEntry((pool + kShareTotalShareTokens), 0), IntegerEntry((pool + kFarmLastInterest), 0), IntegerEntry((pool + kBoostLastInterest), 0), IntegerEntry((pool + kBoostLPLastInterest), 0), IntegerEntry((pool + kLastInterestHeight), height)])
517523
518524
519525
520526 @Callable(i)
521527 func updatePoolInterest (pool) = valueOrElse(isActive(), if ((i.caller != govAddress))
522528 then throw("Only Governance can call this function")
523529 else {
524530 let user = toString(addressFromPublicKey(adminInvokePubKey))
525- let $t02584225916 = claimCalc(pool, user)
526- let farmInterest = $t02584225916._1
527- let boostInterest = $t02584225916._2
528- let boostLPinterest = $t02584225916._3
531+ let $t02596926043 = claimCalc(pool, user)
532+ let farmInterest = $t02596926043._1
533+ let boostInterest = $t02596926043._2
534+ let boostLPinterest = $t02596926043._3
529535 [IntegerEntry((pool + kFarmLastInterest), farmInterest), IntegerEntry((pool + kBoostLastInterest), boostInterest), IntegerEntry((pool + kBoostLPLastInterest), boostLPinterest), IntegerEntry((pool + kLastInterestHeight), height)]
530536 })
531537
532538
533539
534540 @Callable(i)
535541 func lockShareTokens (pool,lockType) = valueOrElse(isActive(), calcLockShareTokens(i, i.caller, pool, lockType))
536542
537543
538544
539545 @Callable(i)
540546 func lockShareTokensFromPool (callerBytes,pool,lockType) = valueOrElse(isActive(), valueOrElse(isPoolCall(i, pool), calcLockShareTokens(i, Address(callerBytes), pool, lockType)))
541547
542548
543549
544550 @Callable(i)
545551 func lockStakedShareTokens (pool,lockType,lockAmount) = valueOrElse(isActive(), {
546552 let shareAssetId = getShareAssetId(pool)
547553 let user = toString(i.caller)
548554 let totalShare = getTotalShareToken(pool)
549555 let totalShareVirtual = valueOrElse(getInteger(this, (pool + kShareTokensVirtual)), totalShare)
550556 let userStakedAmount = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensStaked)), 0)
551557 let userLockedHeigt = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensLockedHeight)), 0)
552558 let userLockedAmount = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensLocked)), 0)
553559 let userAmountVirtual = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensVirtual)), userStakedAmount)
554560 let totalUserShareTokens = (userStakedAmount + userLockedAmount)
555- let $t02740327455 = getLockParams(lockType)
556- let lockPeriod = $t02740327455._1
557- let lockCoef = $t02740327455._2
561+ let $t02753027582 = getLockParams(lockType)
562+ let lockPeriod = $t02753027582._1
563+ let lockCoef = $t02753027582._2
558564 let lockWavesFee = getIntegerValue(this, kLockWavesFee)
559565 if ((getHeightFirstHarvest(pool) > height))
560566 then throw("You can't lock shareTokens till first harvest end.")
561567 else if ((0 >= lockType))
562568 then throw("lockType must be > 0")
563569 else if ((lockAmount > userStakedAmount))
564570 then throw(("You can't lock more than " + toString(userStakedAmount)))
565571 else if ((accountBalance(shareAssetId) > totalShare))
566572 then throw("Balance of share-token is lower than totalAmount")
567573 else if (if ((userLockedHeigt == 0))
568574 then if (if ((1 > size(i.payments)))
569575 then true
570576 else (i.payments[0].assetId != unit))
571577 then true
572578 else (lockWavesFee > i.payments[0].amount)
573579 else false)
574580 then throw((("You need to pay additional waves comission " + toString(lockWavesFee)) + "WAVES"))
575581 else if (if ((userLockedHeigt == 0))
576582 then (0 >= lockAmount)
577583 else false)
578584 then throw("lockAmount must be greater than 0")
579585 else if ((0 > lockAmount))
580586 then throw("lockAmount must be positive")
581587 else if ((userLockedHeigt > (height + lockPeriod)))
582588 then throw("You cannot lock sharetokens for a period less than what you have already locked")
583589 else {
584590 let userLockedAmountNew = (userLockedAmount + lockAmount)
585591 let userStakedAmountNew = (userStakedAmount - lockAmount)
586592 let userLockedHeigtNew = (height + lockPeriod)
587593 let userAmountVirtualNew = (fraction(userLockedAmountNew, lockCoef, lockBoostCoefScale) + userStakedAmountNew)
588- let $t02874528844 = claimCalc(pool, user)
589- let farmInterest = $t02874528844._1
590- let boostInterest = $t02874528844._2
591- let boostLPinterest = $t02874528844._3
592- let claimAmount = $t02874528844._4
593- let toTreasure = $t02874528844._5
594+ let $t02887228971 = claimCalc(pool, user)
595+ let farmInterest = $t02887228971._1
596+ let boostInterest = $t02887228971._2
597+ let boostLPinterest = $t02887228971._3
598+ let claimAmount = $t02887228971._4
599+ let toTreasure = $t02887228971._5
594600 let availableFundsNew = (userAvailableSWOP(pool, user) + claimAmount)
595601 [IntegerEntry((((pool + "_") + user) + kUserShareTokensStaked), userStakedAmountNew), IntegerEntry((((pool + "_") + user) + kUserShareTokensLocked), userLockedAmountNew), IntegerEntry((((pool + "_") + user) + kUserShareTokensLockedHeight), userLockedHeigtNew), IntegerEntry((((pool + "_") + user) + kUserShareTokensLockedType), lockType), IntegerEntry((((pool + "_") + user) + kUserShareTokensVirtual), userAmountVirtualNew), IntegerEntry((pool + kShareTokensVirtual), ((totalShareVirtual - userAmountVirtual) + userAmountVirtualNew)), IntegerEntry((((pool + "_") + user) + kFarmUserLastInterest), farmInterest), IntegerEntry((((pool + "_") + user) + kBoostUserLastInterest), boostInterest), IntegerEntry((((pool + "_") + user) + kBoostLPUserLastInterest), boostLPinterest), IntegerEntry((pool + kFarmLastInterest), farmInterest), IntegerEntry((pool + kBoostLastInterest), boostInterest), IntegerEntry((pool + kBoostLPLastInterest), boostLPinterest), IntegerEntry((pool + kLastInterestHeight), height), IntegerEntry((((pool + "_") + user) + kAvailableSWOP), availableFundsNew), Reissue(SWOP, toTreasure, true), ScriptTransfer(farmingTreasureAddr, toTreasure, SWOP)]
596602 }
597603 })
598604
599605
600606
601607 @Callable(i)
602608 func unlockUserLock (pool,user) = valueOrElse(isActive(), {
603609 let lockWavesFee = getIntegerValue(this, kLockWavesFee)
604610 let userLockedHeigt = valueOrErrorMessage(getInteger(this, (((pool + "_") + user) + kUserShareTokensLockedHeight)), (((("There is no pool " + pool) + " or user ") + user) + "with lock"))
605611 let totalShareVirtual = getIntegerValue(this, (pool + kShareTokensVirtual))
606612 let userStakedAmount = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensStaked)), 0)
607613 let userLockedAmount = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensLocked)), 0)
608614 let userAmountVirtual = valueOrElse(getInteger(this, (((pool + "_") + user) + kUserShareTokensVirtual)), userStakedAmount)
609615 if ((userLockedHeigt > height))
610616 then throw(("You can't unlock sharetokens till " + toString(userLockedHeigt)))
611617 else {
612618 let userStakedAmountNew = (userStakedAmount + userLockedAmount)
613- let $t03107431173 = claimCalc(pool, user)
614- let farmInterest = $t03107431173._1
615- let boostInterest = $t03107431173._2
616- let boostLPinterest = $t03107431173._3
617- let claimAmount = $t03107431173._4
618- let toTreasure = $t03107431173._5
619+ let $t03120131300 = claimCalc(pool, user)
620+ let farmInterest = $t03120131300._1
621+ let boostInterest = $t03120131300._2
622+ let boostLPinterest = $t03120131300._3
623+ let claimAmount = $t03120131300._4
624+ let toTreasure = $t03120131300._5
619625 let availableFundsNew = (userAvailableSWOP(pool, user) + claimAmount)
620626 [IntegerEntry((((pool + "_") + user) + kFarmUserLastInterest), farmInterest), IntegerEntry((((pool + "_") + user) + kBoostUserLastInterest), boostInterest), IntegerEntry((((pool + "_") + user) + kBoostLPUserLastInterest), boostLPinterest), IntegerEntry((pool + kFarmLastInterest), farmInterest), IntegerEntry((pool + kBoostLastInterest), boostInterest), IntegerEntry((pool + kBoostLPLastInterest), boostLPinterest), IntegerEntry((pool + kLastInterestHeight), height), IntegerEntry((((pool + "_") + user) + kUserShareTokensStaked), userStakedAmountNew), IntegerEntry((((pool + "_") + user) + kUserShareTokensVirtual), userStakedAmountNew), IntegerEntry((pool + kShareTokensVirtual), ((totalShareVirtual - userAmountVirtual) + userStakedAmountNew)), IntegerEntry((((pool + "_") + user) + kAvailableSWOP), availableFundsNew), DeleteEntry((((pool + "_") + user) + kUserShareTokensLocked)), DeleteEntry((((pool + "_") + user) + kUserShareTokensLockedHeight)), DeleteEntry((((pool + "_") + user) + kUserShareTokensLockedType)), Reissue(SWOP, toTreasure, true), ScriptTransfer(farmingTreasureAddr, toTreasure, SWOP), ScriptTransfer(i.caller, lockWavesFee, unit)]
621627 }
622628 })
623629
624630
625631
626632 @Callable(i)
627633 func withdrawShareTokens (pool,shareTokensWithdrawAmount) = valueOrElse(isActive(), calcWithdrawShareTokens(i, i.caller, pool, shareTokensWithdrawAmount))
628634
629635
630636
631637 @Callable(i)
632638 func withdrawShareTokensFromPool (callerBytes,pool,shareTokensWithdrawAmount) = valueOrElse(isActive(), valueOrElse(isPoolCall(i, pool), calcWithdrawShareTokens(i, Address(callerBytes), pool, shareTokensWithdrawAmount)))
633639
634640
635641
636642 @Callable(i)
637643 func claim (pool) = valueOrElse(isActive(), calcClaim(i, pool, i.caller))
638644
639645
640646
641647 @Callable(i)
642648 func claimInternal (pool,caller) = valueOrElse(isActive(), valueOrElse(isSelfCall(i), calcClaim(i, pool, Address(caller))))
643649
644650
645651
646652 @Callable(i)
647653 func claimAndStake (pool) = valueOrElse(isActive(), {
648654 let claimAmount = {
649655 let @ = invoke(this, "claimInternal", [pool, i.caller.bytes], nil)
650656 if ($isInstanceOf(@, "Int"))
651657 then @
652658 else throw(($getType(@) + " couldn't be cast to Int"))
653659 }
654660 if ((claimAmount == claimAmount))
655661 then {
656662 let stakeToGov = invoke(govAddress, "lockSWOPFromFarming", nil, [AttachedPayment(SWOP, claimAmount)])
657663 if ((stakeToGov == stakeToGov))
658664 then nil
659665 else throw("Strict value is not equal to itself.")
660666 }
661667 else throw("Strict value is not equal to itself.")
662668 })
663669
664670
665671
666672 @Callable(i)
667673 func claimAll (pools) = valueOrElse(isActive(), {
668674 func claimInv (claimTotal,pool) = {
669675 let claimAmount = {
670676 let @ = invoke(this, "claimInternal", [pool, i.caller.bytes], nil)
671677 if ($isInstanceOf(@, "Int"))
672678 then @
673679 else throw(($getType(@) + " couldn't be cast to Int"))
674680 }
675681 if ((claimAmount == claimAmount))
676682 then (claimTotal + claimAmount)
677683 else throw("Strict value is not equal to itself.")
678684 }
679685
680686 let claimTotal = {
681687 let $l = pools
682688 let $s = size($l)
683689 let $acc0 = 0
684690 func $f0_1 ($a,$i) = if (($i >= $s))
685691 then $a
686692 else claimInv($a, $l[$i])
687693
688694 func $f0_2 ($a,$i) = if (($i >= $s))
689695 then $a
690696 else throw("List size exceeds 60")
691697
692698 $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($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)
693699 }
694700 if ((claimTotal == 0))
695701 then throw("You have 0 available SWOP")
696702 else [ScriptTransfer(i.caller, claimTotal, SWOP)]
697703 })
698704
699705
700706
701707 @Callable(i)
702708 func claimAllAndStake (pools) = valueOrElse(isActive(), {
703709 func claimInv (claimTotal,pool) = {
704710 let claimAmount = {
705711 let @ = invoke(this, "claimInternal", [pool, i.caller.bytes], nil)
706712 if ($isInstanceOf(@, "Int"))
707713 then @
708714 else throw(($getType(@) + " couldn't be cast to Int"))
709715 }
710716 if ((claimAmount == claimAmount))
711717 then (claimTotal + claimAmount)
712718 else throw("Strict value is not equal to itself.")
713719 }
714720
715721 let claimTotal = {
716722 let $l = pools
717723 let $s = size($l)
718724 let $acc0 = 0
719725 func $f0_1 ($a,$i) = if (($i >= $s))
720726 then $a
721727 else claimInv($a, $l[$i])
722728
723729 func $f0_2 ($a,$i) = if (($i >= $s))
724730 then $a
725731 else throw("List size exceeds 60")
726732
727733 $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($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)
728734 }
729735 if ((claimTotal == 0))
730736 then throw("You have 0 available SWOP")
731737 else {
732738 let stakeToGov = invoke(govAddress, "lockSWOPFromFarming", nil, [AttachedPayment(SWOP, claimTotal)])
733739 if ((stakeToGov == stakeToGov))
734740 then nil
735741 else throw("Strict value is not equal to itself.")
736742 }
737743 })
738744
739745
740746
741747 @Callable(i)
742748 func updateUserBoostInterest (pool,user) = valueOrElse(isActive(), if ((i.caller != votingAddress))
743749 then throw("Only voiting can call this function")
744750 else {
745- let $t03465534754 = claimCalc(pool, user)
746- let farmInterest = $t03465534754._1
747- let boostInterest = $t03465534754._2
748- let boostLPinterest = $t03465534754._3
749- let claimAmount = $t03465534754._4
750- let toTreasure = $t03465534754._5
751+ let $t03478234881 = claimCalc(pool, user)
752+ let farmInterest = $t03478234881._1
753+ let boostInterest = $t03478234881._2
754+ let boostLPinterest = $t03478234881._3
755+ let claimAmount = $t03478234881._4
756+ let toTreasure = $t03478234881._5
751757 let availableFundsNew = (userAvailableSWOP(pool, user) + claimAmount)
752758 [IntegerEntry((((pool + "_") + user) + kFarmUserLastInterest), farmInterest), IntegerEntry((((pool + "_") + user) + kBoostUserLastInterest), boostInterest), IntegerEntry((((pool + "_") + user) + kBoostLPUserLastInterest), boostLPinterest), IntegerEntry((pool + kFarmLastInterest), farmInterest), IntegerEntry((pool + kBoostLastInterest), boostInterest), IntegerEntry((pool + kBoostLPLastInterest), boostLPinterest), IntegerEntry((pool + kLastInterestHeight), height), IntegerEntry((((pool + "_") + user) + kAvailableSWOP), availableFundsNew), Reissue(SWOP, toTreasure, true), ScriptTransfer(farmingTreasureAddr, toTreasure, SWOP)]
753759 })
754760
755761
756762
757763 @Callable(i)
758764 func shutdown () = valueOrElse(isAdminCall(i), if (!(active))
759765 then throw(("DApp is already suspended. Cause: " + valueOrElse(getString(this, kCause), "the cause wasn't specified")))
760766 else suspend("Paused by admin"))
761767
762768
763769
764770 @Callable(i)
765771 func activate () = valueOrElse(isAdminCall(i), if (active)
766772 then throw("DApp is already active")
767773 else [BooleanEntry(kActive, true), DeleteEntry(kCause)])
768774
769775
770776 @Verifier(tx)
771777 func verify () = match tx {
772778 case _ =>
773779 let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
774780 then 1
775781 else 0
776782 let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], adminPubKey2))
777783 then 1
778784 else 0
779785 let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], adminPubKey3))
780786 then 1
781787 else 0
782788 (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
783789 }
784790

github/deemru/w8io/026f985 
129.02 ms