tx · 9auSb7mq1i7KcWQ95rZhZbh39kdENqw3ofeUsHtcH5dm

3N6HSS7Toat1RhyEsyqVGgVSRzH19W1FTbP:  -0.03700000 Waves

2025.01.10 16:48 [3453142] smart account 3N6HSS7Toat1RhyEsyqVGgVSRzH19W1FTbP > SELF 0.00000000 Waves

{ "type": 13, "id": "9auSb7mq1i7KcWQ95rZhZbh39kdENqw3ofeUsHtcH5dm", "fee": 3700000, "feeAssetId": null, "timestamp": 1736516949242, "version": 2, "chainId": 84, "sender": "3N6HSS7Toat1RhyEsyqVGgVSRzH19W1FTbP", "senderPublicKey": "AoKo4segKHU4DeJnxXQYJj2u7J6XJeux6r8KLW52cd2Q", "proofs": [ "BQmKP74zo6jNF4tTGhPVXkkjQ22xxT86Qe72zC8gCxnCwFCXrFQzL4Hs3YNB34MeyMpao3nCmGuPsFJzzjzzSj8" ], "script": "base64:BwJHCAISABIDCgECEgcKBQIBAQEBEgYKBAEBAQESAwoBAhIDCgECEgQKAgICEgQKAgIIEgQKAgIYEgQKAgIIEgQKAgIYEgMKAQJIAANTRVACAl9fAA1DT05UUkFDVF9OQU1FAg9jYWxjdWxhdG9yLnJpZGUABlNDQUxFOACAwtcvAAdQRU5ESU5HAgdQRU5ESU5HAAVXQVZFUwIFV0FWRVMAHGJsb2Nrc1Byb2Nlc3NpbmdCYXRjaFNpemVNYXgACgEHd3JhcEVycgEBcwkArAICCQCsAgIFDUNPTlRSQUNUX05BTUUCAjogBQFzAQh0aHJvd0VycgEBcwkAAgEJAQd3cmFwRXJyAQUBcwEPYXNzZXRJZFRvU3RyaW5nAQdhc3NldElkBAckbWF0Y2gwBQdhc3NldElkAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAWIFByRtYXRjaDAJANgEAQUBYgMJAAECBQckbWF0Y2gwAgRVbml0BQVXQVZFUwkAAgECC01hdGNoIGVycm9yAQ9zdHJpbmdUb0Fzc2V0SWQBAXMDCQAAAgUBcwUFV0FWRVMFBHVuaXQJANkEAQUBcwEDYWJzAQFuAwkAZgIAAAUBbgkBAS0BBQFuBQFuARFrZXlGYWN0b3J5QWRkcmVzcwAJALkJAgkAzAgCAgIlcwkAzAgCAgdmYWN0b3J5BQNuaWwFA1NFUAETa2V5TWFuYWdlclB1YmxpY0tleQAJALkJAgkAzAgCAgIlcwkAzAgCAhBtYW5hZ2VyUHVibGljS2V5BQNuaWwFA1NFUAEMa2V5THBBc3NldElkAAkAuQkCCQDMCAICAiVzCQDMCAICCWxwQXNzZXRJZAUDbmlsBQNTRVABF2tleVByb3h5VHJlYXN1cnlBZGRyZXNzAAkAuQkCCQDMCAICAiVzCQDMCAICDXByb3h5VHJlYXN1cnkFA25pbAUDU0VQARZrZXlNYWluVHJlYXN1cnlBZGRyZXNzAAkAuQkCCQDMCAICAiVzCQDMCAICDG1haW5UcmVhc3VyeQUDbmlsBQNTRVABGmtleUJ1c2luZXNzVHJlYXN1cnlBZGRyZXNzAAkAuQkCCQDMCAICAiVzCQDMCAICEGJ1c2luZXNzVHJlYXN1cnkFA25pbAUDU0VQAR1rZXlUcnVzdGVkRmluYWxpemVBZGRyZXNzTGlzdAAJALkJAgkAzAgCAgIlcwkAzAgCAhJ0cnVzdGVkQWRkcmVzc0xpc3QFA25pbAUDU0VQARdrZXlCdXNpbmVzc1RyZWFzdXJ5UGFydAAJALkJAgkAzAgCAgIlcwkAzAgCAhRidXNpbmVzc1RyZWFzdXJ5UGFydAUDbmlsBQNTRVABF2tleVBvd2VyQ29udHJhY3RBZGRyZXNzAAkAuQkCCQDMCAICAiVzCQDMCAICDXBvd2VyQ29udHJhY3QFA25pbAUDU0VQARJrZXlQb3dlclNoYXJlUmF0aW8ACQC5CQIJAMwIAgICJXMJAMwIAgIPcG93ZXJTaGFyZVJhdGlvBQNuaWwFA1NFUAEPa2V5UG93ZXJBc3NldElkAAkAuQkCCQDMCAICAiVzCQDMCAICDHBvd2VyQXNzZXRJZAUDbmlsBQNTRVABDmtleUwybXBBc3NldElkAAkAuQkCCQDMCAICAiVzCQDMCAICC2wybXBBc3NldElkBQNuaWwFA1NFUAETa2V5TDJtcFByb3h5QWRkcmVzcwAJALkJAgkAzAgCAgIlcwkAzAgCAglsMm1wUHJveHkFA25pbAUDU0VQAQtrZXlJbnZlc3RlZAEHYXNzZXRJZAkAuQkCCQDMCAICBCVzJXMJAMwIAgIIaW52ZXN0ZWQJAMwIAgkBD2Fzc2V0SWRUb1N0cmluZwEFB2Fzc2V0SWQFA25pbAUDU0VQAQprZXlEb25hdGVkAQdhc3NldElkCQC5CQIJAMwIAgIEJXMlcwkAzAgCAgdkb25hdGVkCQDMCAIJAQ9hc3NldElkVG9TdHJpbmcBBQdhc3NldElkBQNuaWwFA1NFUAEMa2V5QXZhaWxhYmxlAQt1c2VyQWRkcmVzcwkAuQkCCQDMCAICBCVzJXMJAMwIAgIJYXZhaWxhYmxlCQDMCAIJAKUIAQULdXNlckFkZHJlc3MFA25pbAUDU0VQAQprZXlDbGFpbWVkAQt1c2VyQWRkcmVzcwkAuQkCCQDMCAICBCVzJXMJAMwIAgIHY2xhaW1lZAkAzAgCCQClCAEFC3VzZXJBZGRyZXNzBQNuaWwFA1NFUAEQa2V5Q3VycmVudFBlcmlvZAAJALkJAgkAzAgCAgIlcwkAzAgCAg1jdXJyZW50UGVyaW9kBQNuaWwFA1NFUAERa2V5UHJpY2VGb3JQZXJpb2QBBnBlcmlvZAkAuQkCCQDMCAICBCVzJWQJAMwIAgIFcHJpY2UJAMwIAgkApAMBBQZwZXJpb2QFA25pbAUDU0VQAQ5rZXlTdGFydEhlaWdodAEGcGVyaW9kCQC5CQIJAMwIAgIEJXMlZAkAzAgCAgtzdGFydEhlaWdodAkAzAgCCQCkAwEFBnBlcmlvZAUDbmlsBQNTRVABFGtleVBvd2VyTWFuYWdlckJvbnVzAQZwZXJpb2QJALkJAgkAzAgCAgQlcyVkCQDMCAICEXBvd2VyTWFuYWdlckJvbnVzCQDMCAIJAKQDAQUGcGVyaW9kBQNuaWwFA1NFUAETa2V5Q2xhaW1XYXZlc0Ftb3VudAEGcGVyaW9kCQC5CQIJAMwIAgIEJXMlZAkAzAgCAhBjbGFpbVdhdmVzQW1vdW50CQDMCAIJAKQDAQUGcGVyaW9kBQNuaWwFA1NFUAEPa2V5UGVyaW9kTGVuZ3RoAAIQJXNfX3BlcmlvZExlbmd0aAEVa2V5SW52ZXN0UGVyaW9kTGVuZ3RoAAIWJXNfX2ludmVzdFBlcmlvZExlbmd0aAEYa2V5QmxvY2tQcm9jZXNzaW5nUmV3YXJkAAIZJXNfX2Jsb2NrUHJvY2Vzc2luZ1Jld2FyZAEVa2V5TmV4dEJsb2NrVG9Qcm9jZXNzAAIWJXNfX25leHRCbG9ja1RvUHJvY2VzcwERa2V5QmxvY2tQcm9jZXNzZWQBBmhlaWdodAkAuQkCCQDMCAICBCVzJWQJAMwIAgIOYmxvY2tQcm9jZXNzZWQJAMwIAgkApAMBBQZoZWlnaHQFA25pbAUDU0VQAQ1rZXlXaXRoZHJhd2FsAAIOJXNfX3dpdGhkcmF3YWwBE2tleVdpdGhkcmF3YWxQZXJpb2QBBnBlcmlvZAkAuQkCCQDMCAICBCVzJWQJAMwIAgIQd2l0aGRyYXdhbFBlcmlvZAkAzAgCCQCkAwEFBnBlcmlvZAUDbmlsBQNTRVABFGtleVdpdGhkcmF3YWxSZXF1ZXN0Agt1c2VyQWRkcmVzcwR0eElkCQC5CQIJAMwIAgIGJXMlcyVzCQDMCAICCndpdGhkcmF3YWwJAMwIAgkApQgBBQt1c2VyQWRkcmVzcwkAzAgCCQDYBAEFBHR4SWQFA25pbAUDU0VQARZ2YWx1ZVdpdGhkcmF3YWxSZXF1ZXN0BAZzdGF0dXMNbHBBc3NldEFtb3VudAx0YXJnZXRQZXJpb2QJY2xhaW1UeElkBAxjbGFpbVR4SWRTdHIEByRtYXRjaDAFCWNsYWltVHhJZAMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAFiBQckbWF0Y2gwCQDYBAEFAWIDCQABAgUHJG1hdGNoMAIEVW5pdAIEU09PTgkAAgECC01hdGNoIGVycm9yCQC5CQIJAMwIAgIIJXMlZCVkJXMJAMwIAgUGc3RhdHVzCQDMCAIJAKQDAQUNbHBBc3NldEFtb3VudAkAzAgCCQCkAwEFDHRhcmdldFBlcmlvZAkAzAgCBQxjbGFpbVR4SWRTdHIFA25pbAUDU0VQARRrZXlXaXRoZHJhd2FsSGlzdG9yeQILdXNlckFkZHJlc3MEdHhJZAkAuQkCCQDMCAICBiVzJXMlcwkAzAgCAhF3aXRoZHJhd2FsSGlzdG9yeQkAzAgCCQClCAEFC3VzZXJBZGRyZXNzCQDMCAIJANgEAQUEdHhJZAUDbmlsBQNTRVABG2tleVBlcmlvZFdpdGhkcmF3YWxBc3NldElkcwEGcGVyaW9kCQC5CQIJAMwIAgIEJXMlZAkAzAgCAgxwZXJpb2RSZXdhcmQJAMwIAgkApAMBBQZwZXJpb2QFA25pbAUDU0VQARprZXlQZXJpb2RXaXRoZHJhd2FsQW1vdW50cwEGcGVyaW9kCQC5CQIJAMwIAgIEJXMlZAkAzAgCAhJwZXJpb2RSZXdhcmRBbW91bnQJAMwIAgkApAMBBQZwZXJpb2QFA25pbAUDU0VQASFwYXJzZVdpdGhkcmF3YWxSZXF1ZXN0VmFsdWVPckZhaWwBAXMEBXBhcnRzCQC1CQIFAXMFA1NFUAMJAAACCQCQAwEFBXBhcnRzAAUEBnN0YXR1cwkAkQMCBQVwYXJ0cwABBA1scEFzc2V0QW1vdW50CQETdmFsdWVPckVycm9yTWVzc2FnZQIJALYJAQkAkQMCBQVwYXJ0cwACCQEHd3JhcEVycgECFWludmFsaWQgbHBBc3NldEFtb3VudAQMdGFyZ2V0UGVyaW9kCQETdmFsdWVPckVycm9yTWVzc2FnZQIJALYJAQkAkQMCBQVwYXJ0cwADCQEHd3JhcEVycgECFGludmFsaWQgdGFyZ2V0UGVyaW9kBAljbGFpbVR4SWQJAJEDAgUFcGFydHMABAkAlgoEBQZzdGF0dXMFDWxwQXNzZXRBbW91bnQFDHRhcmdldFBlcmlvZAUJY2xhaW1UeElkCQEIdGhyb3dFcnIBAiBpbnZhbGlkIHdpdGhkcmF3YWwgcmVxdWVzdCB2YWx1ZQAUZmFjdG9yeUFkZHJlc3NPcHRpb24EByRtYXRjaDAJAJ0IAgUEdGhpcwkBEWtleUZhY3RvcnlBZGRyZXNzAAMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXMFByRtYXRjaDAJAKYIAQUBcwMJAAECBQckbWF0Y2gwAgRVbml0BQR1bml0CQACAQILTWF0Y2ggZXJyb3IAFGZhY3RvcnlBZGRyZXNzT3JGYWlsCQETdmFsdWVPckVycm9yTWVzc2FnZQIFFGZhY3RvcnlBZGRyZXNzT3B0aW9uCQEHd3JhcEVycgECF2ludmFsaWQgZmFjdG9yeSBhZGRyZXNzAA9scEFzc2V0SWRPcHRpb24EByRtYXRjaDAFFGZhY3RvcnlBZGRyZXNzT3B0aW9uAwkAAQIFByRtYXRjaDACB0FkZHJlc3MEAWEFByRtYXRjaDAEByRtYXRjaDEJAJ0IAgUBYQkBDGtleUxwQXNzZXRJZAADCQABAgUHJG1hdGNoMQIGU3RyaW5nBAFzBQckbWF0Y2gxCQDZBAEFAXMDCQABAgUHJG1hdGNoMQIEVW5pdAUEdW5pdAkAAgECC01hdGNoIGVycm9yAwkAAQIFByRtYXRjaDACBFVuaXQFBHVuaXQJAAIBAgtNYXRjaCBlcnJvcgAPbHBBc3NldElkT3JGYWlsCQETdmFsdWVPckVycm9yTWVzc2FnZQIFD2xwQXNzZXRJZE9wdGlvbgkBB3dyYXBFcnIBAhFpbnZhbGlkIGxwQXNzZXRJZAAacHJveHlUcmVhc3VyeUFkZHJlc3NPcHRpb24EByRtYXRjaDAFFGZhY3RvcnlBZGRyZXNzT3B0aW9uAwkAAQIFByRtYXRjaDACB0FkZHJlc3MEAWEFByRtYXRjaDAEByRtYXRjaDEJAJ0IAgUBYQkBF2tleVByb3h5VHJlYXN1cnlBZGRyZXNzAAMJAAECBQckbWF0Y2gxAgZTdHJpbmcEAXMFByRtYXRjaDEJAKYIAQUBcwMJAAECBQckbWF0Y2gxAgRVbml0BQR1bml0CQACAQILTWF0Y2ggZXJyb3IDCQABAgUHJG1hdGNoMAIEVW5pdAUEdW5pdAkAAgECC01hdGNoIGVycm9yABpwcm94eVRyZWFzdXJ5QWRkcmVzc09yRmFpbAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCBRpwcm94eVRyZWFzdXJ5QWRkcmVzc09wdGlvbgkBB3dyYXBFcnIBAh5pbnZhbGlkIHByb3h5IHRyZWFzdXJ5IGFkZHJlc3MAGW1haW5UcmVhc3VyeUFkZHJlc3NPcHRpb24EByRtYXRjaDAFFGZhY3RvcnlBZGRyZXNzT3B0aW9uAwkAAQIFByRtYXRjaDACB0FkZHJlc3MEAWEFByRtYXRjaDAEByRtYXRjaDEJAJ0IAgUBYQkBFmtleU1haW5UcmVhc3VyeUFkZHJlc3MAAwkAAQIFByRtYXRjaDECBlN0cmluZwQBcwUHJG1hdGNoMQkApggBBQFzAwkAAQIFByRtYXRjaDECBFVuaXQFBHVuaXQJAAIBAgtNYXRjaCBlcnJvcgMJAAECBQckbWF0Y2gwAgRVbml0BQR1bml0CQACAQILTWF0Y2ggZXJyb3IAHWJ1c2luZXNzVHJlYXN1cnlBZGRyZXNzT3B0aW9uBAckbWF0Y2gwBRRmYWN0b3J5QWRkcmVzc09wdGlvbgMJAAECBQckbWF0Y2gwAgdBZGRyZXNzBAFhBQckbWF0Y2gwBAckbWF0Y2gxCQCdCAIFAWEJARprZXlCdXNpbmVzc1RyZWFzdXJ5QWRkcmVzcwADCQABAgUHJG1hdGNoMQIGU3RyaW5nBAFzBQckbWF0Y2gxCQCmCAEFAXMDCQABAgUHJG1hdGNoMQIEVW5pdAUEdW5pdAkAAgECC01hdGNoIGVycm9yAwkAAQIFByRtYXRjaDACBFVuaXQFBHVuaXQJAAIBAgtNYXRjaCBlcnJvcgAZbWFpblRyZWFzdXJ5QWRkcmVzc09yRmFpbAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCBRltYWluVHJlYXN1cnlBZGRyZXNzT3B0aW9uCQEHd3JhcEVycgECHWludmFsaWQgbWFpbiB0cmVhc3VyeSBhZGRyZXNzAB1idXNpbmVzc1RyZWFzdXJ5QWRkcmVzc09yRmFpbAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCBR1idXNpbmVzc1RyZWFzdXJ5QWRkcmVzc09wdGlvbgkBB3dyYXBFcnIBAiFpbnZhbGlkIGJ1c2luZXNzIHRyZWFzdXJ5IGFkZHJlc3MAGnBvd2VyQ29udHJhY3RBZGRyZXNzT3B0aW9uBAckbWF0Y2gwBRRmYWN0b3J5QWRkcmVzc09wdGlvbgMJAAECBQckbWF0Y2gwAgdBZGRyZXNzBAFhBQckbWF0Y2gwBAckbWF0Y2gxCQCdCAIFAWEJARdrZXlQb3dlckNvbnRyYWN0QWRkcmVzcwADCQABAgUHJG1hdGNoMQIGU3RyaW5nBAFzBQckbWF0Y2gxCQCmCAEFAXMDCQABAgUHJG1hdGNoMQIEVW5pdAUEdW5pdAkAAgECC01hdGNoIGVycm9yAwkAAQIFByRtYXRjaDACBFVuaXQFBHVuaXQJAAIBAgtNYXRjaCBlcnJvcgAacG93ZXJDb250cmFjdEFkZHJlc3NPckZhaWwJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgUacG93ZXJDb250cmFjdEFkZHJlc3NPcHRpb24JAQd3cmFwRXJyAQIeaW52YWxpZCBwb3dlciBjb250cmFjdCBhZGRyZXNzABhwb3dlckFzc2V0SWRTdHJpbmdPckZhaWwJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBRRmYWN0b3J5QWRkcmVzc09yRmFpbAkBD2tleVBvd2VyQXNzZXRJZAAJAQd3cmFwRXJyAQIYcG93ZXIgYXNzZXQgaWQgbm90IGZvdW5kABZsMm1wUHJveHlBZGRyZXNzT3B0aW9uBAckbWF0Y2gwBRRmYWN0b3J5QWRkcmVzc09wdGlvbgMJAAECBQckbWF0Y2gwAgdBZGRyZXNzBAFhBQckbWF0Y2gwBAckbWF0Y2gxCQCdCAIFAWEJARNrZXlMMm1wUHJveHlBZGRyZXNzAAMJAAECBQckbWF0Y2gxAgZTdHJpbmcEAXMFByRtYXRjaDEJAKYIAQUBcwMJAAECBQckbWF0Y2gxAgRVbml0BQR1bml0CQACAQILTWF0Y2ggZXJyb3IDCQABAgUHJG1hdGNoMAIEVW5pdAUEdW5pdAkAAgECC01hdGNoIGVycm9yABZsMm1wUHJveHlBZGRyZXNzT3JGYWlsCQETdmFsdWVPckVycm9yTWVzc2FnZQIFFmwybXBQcm94eUFkZHJlc3NPcHRpb24JAQd3cmFwRXJyAQIaaW52YWxpZCBsMm1wIHByb3h5IGFkZHJlc3MAF2wybXBBc3NldElkU3RyaW5nT3JGYWlsCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUUZmFjdG9yeUFkZHJlc3NPckZhaWwJAQ5rZXlMMm1wQXNzZXRJZAAJAQd3cmFwRXJyAQIXbDJtcCBhc3NldCBpZCBub3QgZm91bmQBGWdldE1hbmFnZXJQdWJsaWNLZXlPclVuaXQABAckbWF0Y2gwBRRmYWN0b3J5QWRkcmVzc09wdGlvbgMJAAECBQckbWF0Y2gwAgdBZGRyZXNzBAJmYQUHJG1hdGNoMAQHJG1hdGNoMQkAnQgCBQJmYQkBE2tleU1hbmFnZXJQdWJsaWNLZXkAAwkAAQIFByRtYXRjaDECBlN0cmluZwQDcHViBQckbWF0Y2gxCQDZBAEFA3B1YgUEdW5pdAUEdW5pdAELb25seUFkZHJlc3MCAWkHYWRkcmVzcwMJAAACCAUBaQZjYWxsZXIFB2FkZHJlc3MGCQEIdGhyb3dFcnIBAhFwZXJtaXNzaW9uIGRlbmllZAELb25seUZhY3RvcnkBAWkJAQtvbmx5QWRkcmVzcwIFAWkFFGZhY3RvcnlBZGRyZXNzT3JGYWlsARBpc1RydXN0ZWRBZGRyZXNzAQFpBApsaXN0U3RyaW5nCQELdmFsdWVPckVsc2UCCQCdCAIFFGZhY3RvcnlBZGRyZXNzT3JGYWlsCQEda2V5VHJ1c3RlZEZpbmFsaXplQWRkcmVzc0xpc3QAAgAEC2FkZHJlc3NMaXN0CQC1CQIFCmxpc3RTdHJpbmcFA1NFUAkBD2NvbnRhaW5zRWxlbWVudAIFC2FkZHJlc3NMaXN0CQClCAEIBQFpDG9yaWdpbkNhbGxlcgEPcmV3YXJkRm9yT3B0aW9uAgdyZXdhcmRzBnRhcmdldAQBcwkAkAMBBQdyZXdhcmRzBAskdDA3NzAwNzcyNQkAkQMCBQdyZXdhcmRzAAAEAmEwCAULJHQwNzcwMDc3MjUCXzEEAnIwCAULJHQwNzcwMDc3MjUCXzIECyR0MDc3Mjg3NzUzCQCRAwIFB3Jld2FyZHMAAQQCYTEIBQskdDA3NzI4Nzc1MwJfMQQCcjEIBQskdDA3NzI4Nzc1MwJfMgQLJHQwNzc1Njc3ODEJAJEDAgUHcmV3YXJkcwACBAJhMggFCyR0MDc3NTY3NzgxAl8xBAJyMggFCyR0MDc3NTY3NzgxAl8yAwMJAGYCBQFzAAAJAAACBQJhMAUGdGFyZ2V0BwUCcjADAwkAZgIFAXMAAQkAAAIFAmExBQZ0YXJnZXQHBQJyMQMDCQBmAgUBcwACCQAAAgUCYTIFBnRhcmdldAcFAnIyBQR1bml0AQ5jYWxjdWxhdGVQcmljZQENbHBQYXJ0SW5XYXZlcwQTbHBBc3NldEFtb3VudFRvQnVybgkBC3ZhbHVlT3JFbHNlAgkAmggCBRRmYWN0b3J5QWRkcmVzc09yRmFpbAkBDWtleVdpdGhkcmF3YWwAAAAED2xwQXNzZXRRdWFudGl0eQgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkA7AcBBQ9scEFzc2V0SWRPckZhaWwJAQd3cmFwRXJyAQIUaW52YWxpZCBscEFzc2V0IGluZm8IcXVhbnRpdHkECG5ld1ByaWNlCQBrAwUNbHBQYXJ0SW5XYXZlcwUGU0NBTEU4CQBlAgUPbHBBc3NldFF1YW50aXR5BRNscEFzc2V0QW1vdW50VG9CdXJuBBNjaGVja0lmUHJpY2VOb3RaZXJvAwkBAiE9AgUIbmV3UHJpY2UAAAYJAQh0aHJvd0VycgECFExQIHByaWNlIGNhbm5vdCBiZSAwAwkAAAIFE2NoZWNrSWZQcmljZU5vdFplcm8FE2NoZWNrSWZQcmljZU5vdFplcm8EFGxwQXNzZXRGaW5hbFF1YW50aXR5CQBlAgUPbHBBc3NldFF1YW50aXR5BRNscEFzc2V0QW1vdW50VG9CdXJuCQCVCgMFCG5ld1ByaWNlBRNscEFzc2V0QW1vdW50VG9CdXJuBRRscEFzc2V0RmluYWxRdWFudGl0eQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEXY2xhaW1Db2xsYXRlcmFsSU5URVJOQUwCEHVzZXJBZGRyZXNzQnl0ZXMEdHhJZAQLdXNlckFkZHJlc3MJAQdBZGRyZXNzAQUQdXNlckFkZHJlc3NCeXRlcwQTY3VycmVudFBlcmlvZE9yRmFpbAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFFGZhY3RvcnlBZGRyZXNzT3JGYWlsCQEQa2V5Q3VycmVudFBlcmlvZAAJAQd3cmFwRXJyAQIOaW52YWxpZCBwZXJpb2QEF3dpdGhkcmF3YWxSZXF1ZXN0T3B0aW9uCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUUZmFjdG9yeUFkZHJlc3NPckZhaWwJARRrZXlXaXRoZHJhd2FsUmVxdWVzdAIFC3VzZXJBZGRyZXNzBQR0eElkCQEHd3JhcEVycgECGmludmFsaWQgd2l0aGRyYXdhbCByZXF1ZXN0BAskdDA4OTQ4OTA2MQkBIXBhcnNlV2l0aGRyYXdhbFJlcXVlc3RWYWx1ZU9yRmFpbAEFF3dpdGhkcmF3YWxSZXF1ZXN0T3B0aW9uBAZzdGF0dXMIBQskdDA4OTQ4OTA2MQJfMQQNbHBBc3NldEFtb3VudAgFCyR0MDg5NDg5MDYxAl8yBAx1bmxvY2tQZXJpb2QIBQskdDA4OTQ4OTA2MQJfMwQJY2xhaW1UeElkCAULJHQwODk0ODkwNjECXzQDCQBmAgUMdW5sb2NrUGVyaW9kBRNjdXJyZW50UGVyaW9kT3JGYWlsCQEIdGhyb3dFcnIBAiFpbnZhbGlkIHdpdGhkcmF3YWwgcmVxdWVzdCBwZXJpb2QEC3ByaWNlT3JGYWlsCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUUZmFjdG9yeUFkZHJlc3NPckZhaWwJARFrZXlQcmljZUZvclBlcmlvZAEFDHVubG9ja1BlcmlvZAkBB3dyYXBFcnIBAg1pbnZhbGlkIHByaWNlBAt3YXZlc0Ftb3VudAMJAGYCBQtwcmljZU9yRmFpbAAACQBrAwUNbHBBc3NldEFtb3VudAULcHJpY2VPckZhaWwFBlNDQUxFOAAABAx0YXJnZXRQZXJpb2QJAGUCBQx1bmxvY2tQZXJpb2QAAQQMYXNzZXRzU3RyaW5nCQERQGV4dHJOYXRpdmUoMTA1MykCBRRmYWN0b3J5QWRkcmVzc09yRmFpbAkBG2tleVBlcmlvZFdpdGhkcmF3YWxBc3NldElkcwEFDHRhcmdldFBlcmlvZAQNYW1vdW50c1N0cmluZwkBEUBleHRyTmF0aXZlKDEwNTMpAgUUZmFjdG9yeUFkZHJlc3NPckZhaWwJARprZXlQZXJpb2RXaXRoZHJhd2FsQW1vdW50cwEFDHRhcmdldFBlcmlvZAQVdG90YWxMcEFtb3VudEluUGVyaW9kCQELdmFsdWVPckVsc2UCCQCaCAIFFGZhY3RvcnlBZGRyZXNzT3JGYWlsCQETa2V5V2l0aGRyYXdhbFBlcmlvZAEFDHRhcmdldFBlcmlvZAAABA51c2VyUGFydFNDQUxFOAMJAAACBRV0b3RhbExwQW1vdW50SW5QZXJpb2QAAAAACQBrAwUNbHBBc3NldEFtb3VudAUGU0NBTEU4BRV0b3RhbExwQW1vdW50SW5QZXJpb2QKARJnZXRVc2VyUGFydEFtb3VudHMCDGN1cnJlbnRTdGF0ZQZhbW91bnQEDnVzZXJQYXJ0QW1vdW50CQBrAwkBDXBhcnNlSW50VmFsdWUBBQZhbW91bnQFDnVzZXJQYXJ0U0NBTEU4BQZTQ0FMRTgJAM0IAgUMY3VycmVudFN0YXRlCQCkAwEFDnVzZXJQYXJ0QW1vdW50BAthbW91bnRzTGlzdAkAvQkCBQ1hbW91bnRzU3RyaW5nBQNTRVAEDWFtb3VudHNQcmVmaXgJAQV2YWx1ZQEJAJEDAgULYW1vdW50c0xpc3QAAAQYYW1vdW50c0xpc3RXaXRob3V0UHJlZml4CQDRCAIJAL0JAgUNYW1vdW50c1N0cmluZwUDU0VQAAAED3VzZXJQYXJ0QW1vdW50cwoAAiRsBRhhbW91bnRzTGlzdFdpdGhvdXRQcmVmaXgKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBEmdldFVzZXJQYXJ0QW1vdW50cwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgQVdXNlclBhcnRBbW91bnRzU3RyaW5nCQC5CQIJAMwIAgUNYW1vdW50c1ByZWZpeAkAzAgCCQC5CQIFD3VzZXJQYXJ0QW1vdW50cwUDU0VQBQNuaWwFA1NFUAkAmAoGBQt1c2VyQWRkcmVzcwUNbHBBc3NldEFtb3VudAUMdGFyZ2V0UGVyaW9kBQt3YXZlc0Ftb3VudAUMYXNzZXRzU3RyaW5nBRV1c2VyUGFydEFtb3VudHNTdHJpbmcBJWNsYWltQ29sbGF0ZXJhbFJFQURPTkxZU3RyaW5nUmVzcG9uc2UCEHVzZXJBZGRyZXNzQnl0ZXMEdHhJZAQNJHQwMTA3NTAxMDkxNgkBF2NsYWltQ29sbGF0ZXJhbElOVEVSTkFMAgUQdXNlckFkZHJlc3NCeXRlcwUEdHhJZAQLdXNlckFkZHJlc3MIBQ0kdDAxMDc1MDEwOTE2Al8xBA1scEFzc2V0QW1vdW50CAUNJHQwMTA3NTAxMDkxNgJfMgQMdGFyZ2V0UGVyaW9kCAUNJHQwMTA3NTAxMDkxNgJfMwQLd2F2ZXNBbW91bnQIBQ0kdDAxMDc1MDEwOTE2Al80BAxhc3NldHNTdHJpbmcIBQ0kdDAxMDc1MDEwOTE2Al81BA1hbW91bnRzU3RyaW5nCAUNJHQwMTA3NTAxMDkxNgJfNgQGYXNzZXRzCQC5CQIJANEIAgkAvQkCBQxhc3NldHNTdHJpbmcFA1NFUAAAAgE6BAdhbW91bnRzCQC5CQIJANEIAgkAvQkCBQ1hbW91bnRzU3RyaW5nBQNTRVAAAAIBOgkAuQkCCQDMCAICBiVkJXMlcwkAzAgCCQCkAwEFC3dhdmVzQW1vdW50CQDMCAIFBmFzc2V0cwkAzAgCBQdhbW91bnRzBQNuaWwFA1NFUAEOZ2V0UmV3YXJkU3BsaXQBFWdlbmVyYXRvclJld2FyZEFtb3VudAQPcG93ZXJTaGFyZVJhdGlvCQCWAwEJAMwIAgAACQDMCAIJAJcDAQkAzAgCCQELdmFsdWVPckVsc2UCCQCaCAIFFGZhY3RvcnlBZGRyZXNzT3JGYWlsCQESa2V5UG93ZXJTaGFyZVJhdGlvAAAACQDMCAIFBlNDQUxFOAUDbmlsBQNuaWwEEWJ1c2luZXNzUGFydFJhdGlvCQCWAwEJAMwIAgAACQDMCAIJAJcDAQkAzAgCCQELdmFsdWVPckVsc2UCCQCaCAIFFGZhY3RvcnlBZGRyZXNzT3JGYWlsCQEXa2V5QnVzaW5lc3NUcmVhc3VyeVBhcnQAAAAJAMwIAgUGU0NBTEU4BQNuaWwFA25pbAQRYW1vdW50VG9Qb3dlclBhcnQJAGsDBRVnZW5lcmF0b3JSZXdhcmRBbW91bnQFD3Bvd2VyU2hhcmVSYXRpbwUGU0NBTEU4BBpidXNpbmVzc1RyZWFzdXJ5QW1vdW50UGFydAkAawMFFWdlbmVyYXRvclJld2FyZEFtb3VudAURYnVzaW5lc3NQYXJ0UmF0aW8FBlNDQUxFOAQPcmV3YXJkUmVtYWluZGVyCQBlAgkAZQIFFWdlbmVyYXRvclJld2FyZEFtb3VudAURYW1vdW50VG9Qb3dlclBhcnQFGmJ1c2luZXNzVHJlYXN1cnlBbW91bnRQYXJ0AwkAZgIFD3Jld2FyZFJlbWFpbmRlcgAACQCVCgMFEWFtb3VudFRvUG93ZXJQYXJ0BRpidXNpbmVzc1RyZWFzdXJ5QW1vdW50UGFydAUPcmV3YXJkUmVtYWluZGVyCQEIdGhyb3dFcnIBAiphbW91bnQgdG8gbWFpbiB0cmVhc3VyeSBjYW5ub3QgYmUgbmVnYXRpdmUBGGNhbGNSZXdhcmRTcGxpdEZvckFtb3VudAEGYW1vdW50BA0kdDAxMjAxNTEyMTA4CQEOZ2V0UmV3YXJkU3BsaXQBBQZhbW91bnQEEWFtb3VudFRvUG93ZXJQYXJ0CAUNJHQwMTIwMTUxMjEwOAJfMQQaYnVzaW5lc3NUcmVhc3VyeUFtb3VudFBhcnQIBQ0kdDAxMjAxNTEyMTA4Al8yBA9yZXdhcmRSZW1haW5kZXIIBQ0kdDAxMjAxNTEyMTA4Al8zBBVibG9ja1Byb2Nlc3NpbmdSZXdhcmQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBRRmYWN0b3J5QWRkcmVzc09yRmFpbAkBGGtleUJsb2NrUHJvY2Vzc2luZ1Jld2FyZAAJAQd3cmFwRXJyAQIfaW52YWxpZCBibG9jayBwcm9jZXNzaW5nIHJld2FyZAQgYmxvY2tQcm9jZXNzaW5nUmV3YXJkQnlHZW5lcmF0b3IJAGkCBRVibG9ja1Byb2Nlc3NpbmdSZXdhcmQFHGJsb2Nrc1Byb2Nlc3NpbmdCYXRjaFNpemVNYXgECnRvTHBBbW91bnQJAGUCBQ9yZXdhcmRSZW1haW5kZXIFFWJsb2NrUHJvY2Vzc2luZ1Jld2FyZAkAlwoFBRFhbW91bnRUb1Bvd2VyUGFydAUaYnVzaW5lc3NUcmVhc3VyeUFtb3VudFBhcnQFFWJsb2NrUHJvY2Vzc2luZ1Jld2FyZAUKdG9McEFtb3VudAUGYW1vdW50DAFpARNyZXdhcmRTcGxpdFJFQURPTkxZAAQRdGFyZ2V0QmxvY2tIZWlnaHQJAGUCBQZoZWlnaHQAAQQPdGFyZ2V0QmxvY2tJbmZvCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAO0HAQURdGFyZ2V0QmxvY2tIZWlnaHQJAQd3cmFwRXJyAQISaW52YWxpZCBibG9jayBpbmZvBBR0cmVhc3VyeVJld2FyZE9yRmFpbAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQEPcmV3YXJkRm9yT3B0aW9uAggFD3RhcmdldEJsb2NrSW5mbwdyZXdhcmRzBRpwcm94eVRyZWFzdXJ5QWRkcmVzc09yRmFpbAkBB3dyYXBFcnIBCQCsAgICI2ludmFsaWQgdHJlYXN1cnkgcmV3YXJkIGZvciBoZWlnaHQgCQCkAwEFEXRhcmdldEJsb2NrSGVpZ2h0CQCUCgIFA25pbAkBGGNhbGNSZXdhcmRTcGxpdEZvckFtb3VudAEFFHRyZWFzdXJ5UmV3YXJkT3JGYWlsAWkBB2NsYWltTFABEHVzZXJBZGRyZXNzQnl0ZXMEC2NoZWNrQ2FsbGVyCQELb25seUZhY3RvcnkBBQFpAwkAAAIFC2NoZWNrQ2FsbGVyBQtjaGVja0NhbGxlcgQLdXNlckFkZHJlc3MJAQdBZGRyZXNzAQUQdXNlckFkZHJlc3NCeXRlcwQJYXZhaWxhYmxlCQELdmFsdWVPckVsc2UCCQCaCAIFFGZhY3RvcnlBZGRyZXNzT3JGYWlsCQEMa2V5QXZhaWxhYmxlAQULdXNlckFkZHJlc3MAAAQHY2xhaW1lZAkBC3ZhbHVlT3JFbHNlAgkAmggCBRRmYWN0b3J5QWRkcmVzc09yRmFpbAkBCmtleUNsYWltZWQBBQt1c2VyQWRkcmVzcwAABA5mYWN0b3J5QWN0aW9ucwMJAGYCBQlhdmFpbGFibGUAAAkAzAgCCQD8BwQFFGZhY3RvcnlBZGRyZXNzT3JGYWlsAg10cmFuc2ZlckFzc2V0CQDMCAIFEHVzZXJBZGRyZXNzQnl0ZXMJAMwIAgUJYXZhaWxhYmxlCQDMCAIFD2xwQXNzZXRJZE9yRmFpbAUDbmlsBQNuaWwJAMwIAgkA/AcEBRRmYWN0b3J5QWRkcmVzc09yRmFpbAIMaW50ZWdlckVudHJ5CQDMCAIJAQxrZXlBdmFpbGFibGUBBQt1c2VyQWRkcmVzcwkAzAgCAAAFA25pbAUDbmlsCQDMCAIJAPwHBAUUZmFjdG9yeUFkZHJlc3NPckZhaWwCDGludGVnZXJFbnRyeQkAzAgCCQEKa2V5Q2xhaW1lZAEFC3VzZXJBZGRyZXNzCQDMCAIJAGQCBQdjbGFpbWVkBQlhdmFpbGFibGUFA25pbAUDbmlsBQNuaWwJAQh0aHJvd0VycgECEG5vdGhpbmcgdG8gY2xhaW0JAJQKAgUDbmlsBQ5mYWN0b3J5QWN0aW9ucwkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQhmaW5hbGl6ZQUQdXNlckFkZHJlc3NCeXRlcxNkb25hdGlvblBhcnRJbldhdmVzDWxwUGFydEluV2F2ZXMQY2xhaW1QYXJ0SW5XYXZlcxVwb3dlclN0YWtlUGFydEluV2F2ZXMEC2NoZWNrQ2FsbGVyCQELb25seUZhY3RvcnkBBQFpAwkAAAIFC2NoZWNrQ2FsbGVyBQtjaGVja0NhbGxlcgQTY3VycmVudFBlcmlvZE9yRmFpbAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFFGZhY3RvcnlBZGRyZXNzT3JGYWlsCQEQa2V5Q3VycmVudFBlcmlvZAAJAQd3cmFwRXJyAQIOaW52YWxpZCBwZXJpb2QEDHBlcmlvZExlbmd0aAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFFGZhY3RvcnlBZGRyZXNzT3JGYWlsCQEPa2V5UGVyaW9kTGVuZ3RoAAkBB3dyYXBFcnIBAhVpbnZhbGlkIHBlcmlvZCBsZW5ndGgEEmN1cnJlbnRTdGFydEhlaWdodAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFFGZhY3RvcnlBZGRyZXNzT3JGYWlsCQEOa2V5U3RhcnRIZWlnaHQBBRNjdXJyZW50UGVyaW9kT3JGYWlsCQEHd3JhcEVycgECFGludmFsaWQgc3RhcnQgaGVpZ2h0BBJjdXJyZW50UHJpY2VPckZhaWwJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBRRmYWN0b3J5QWRkcmVzc09yRmFpbAkBEWtleVByaWNlRm9yUGVyaW9kAQUTY3VycmVudFBlcmlvZE9yRmFpbAkBB3dyYXBFcnIBAg1pbnZhbGlkIHByaWNlBBJuZXh0QmxvY2tUb1Byb2Nlc3MJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBRRmYWN0b3J5QWRkcmVzc09yRmFpbAkBFWtleU5leHRCbG9ja1RvUHJvY2VzcwAJAQd3cmFwRXJyAQIdaW52YWxpZCBuZXh0IGJsb2NrIHRvIHByb2Nlc3MED3BlcmlvZEVuZEhlaWdodAkAZQIJAGQCBRJjdXJyZW50U3RhcnRIZWlnaHQFDHBlcmlvZExlbmd0aAABBAZjaGVja3MJAMwIAgMDCQEQaXNUcnVzdGVkQWRkcmVzcwEFAWkGCQAAAggFAWkMb3JpZ2luQ2FsbGVyBRltYWluVHJlYXN1cnlBZGRyZXNzT3JGYWlsBgkBCHRocm93RXJyAQIccGVybWlzc2lvbiBkZW5pZWQgKGZpbmFsaXplKQkAzAgCAwkAZgIFEm5leHRCbG9ja1RvUHJvY2VzcwUPcGVyaW9kRW5kSGVpZ2h0BgkBCHRocm93RXJyAQISdW5wcm9jZXNzZWQgYmxvY2tzCQDMCAIDCQBnAgUTZG9uYXRpb25QYXJ0SW5XYXZlcwAABgkBCHRocm93RXJyAQIVaW52YWxpZCBkb25hdGlvbiBwYXJ0CQDMCAIDCQBnAgUNbHBQYXJ0SW5XYXZlcwAABgkBCHRocm93RXJyAQIPaW52YWxpZCBscCBwYXJ0CQDMCAIDCQBnAgUQY2xhaW1QYXJ0SW5XYXZlcwAABgkBCHRocm93RXJyAQISaW52YWxpZCBjbGFpbSBwYXJ0CQDMCAIDCQBnAgUVcG93ZXJTdGFrZVBhcnRJbldhdmVzAAAGCQEIdGhyb3dFcnIBAhZpbnZhbGlkIFBXUiBzdGFrZSBwYXJ0BQNuaWwDCQAAAgUGY2hlY2tzBQZjaGVja3MEDSR0MDE1NDgxMTU1ODYJAQ5jYWxjdWxhdGVQcmljZQEFDWxwUGFydEluV2F2ZXMECG5ld1ByaWNlCAUNJHQwMTU0ODExNTU4NgJfMQQTbHBBc3NldEFtb3VudFRvQnVybggFDSR0MDE1NDgxMTU1ODYCXzIEFGxwQXNzZXRGaW5hbFF1YW50aXR5CAUNJHQwMTU0ODExNTU4NgJfMwQJbmV3UGVyaW9kCQBkAgUTY3VycmVudFBlcmlvZE9yRmFpbAABCgEMYWRkTmV3QWN0aW9uAgdhY3Rpb25zB3BheW1lbnQEDSR0MDE1NzM0MTU3OTYFB2FjdGlvbnMED3NjcmlwdFRyYW5zZmVycwgFDSR0MDE1NzM0MTU3OTYCXzEEDmFzc2V0SWRzU3RyaW5nCAUNJHQwMTU3MzQxNTc5NgJfMgQNYW1vdW50c1N0cmluZwgFDSR0MDE1NzM0MTU3OTYCXzMEDXBheW1lbnRBbW91bnQIBQdwYXltZW50BmFtb3VudAQOcGF5bWVudEFzc2V0SWQIBQdwYXltZW50B2Fzc2V0SWQDCQAAAgkBD2Fzc2V0SWRUb1N0cmluZwEFDnBheW1lbnRBc3NldElkBRdsMm1wQXNzZXRJZFN0cmluZ09yRmFpbAQTdHJhbnNmZXJUb0wybXBQcm94eQkBDlNjcmlwdFRyYW5zZmVyAwUWbDJtcFByb3h5QWRkcmVzc09yRmFpbAUNcGF5bWVudEFtb3VudAUOcGF5bWVudEFzc2V0SWQJAJUKAwkAzQgCBQ9zY3JpcHRUcmFuc2ZlcnMFE3RyYW5zZmVyVG9MMm1wUHJveHkFDmFzc2V0SWRzU3RyaW5nBQ1hbW91bnRzU3RyaW5nBBFuZXdBc3NldElkc1N0cmluZwkArAICAgIlcwkAuQkCCQDMCAIFDmFzc2V0SWRzU3RyaW5nCQDMCAIJAQ9hc3NldElkVG9TdHJpbmcBBQ5wYXltZW50QXNzZXRJZAUDbmlsBQNTRVAEEG5ld0Ftb3VudHNTdHJpbmcJAKwCAgICJWQJALkJAgkAzAgCBQ1hbW91bnRzU3RyaW5nCQDMCAIJAKQDAQUNcGF5bWVudEFtb3VudAUDbmlsBQNTRVAEEW5ld1NjcmlwdFRyYW5zZmVyCQEOU2NyaXB0VHJhbnNmZXIDBRRmYWN0b3J5QWRkcmVzc09yRmFpbAUNcGF5bWVudEFtb3VudAUOcGF5bWVudEFzc2V0SWQJAJUKAwkAzQgCBQ9zY3JpcHRUcmFuc2ZlcnMFEW5ld1NjcmlwdFRyYW5zZmVyBRFuZXdBc3NldElkc1N0cmluZwUQbmV3QW1vdW50c1N0cmluZwQNJHQwMTY1OTAxNjY4MQoAAiRsCAUBaQhwYXltZW50cwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJUKAwUDbmlsAgACAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEMYWRkTmV3QWN0aW9uAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKBA9zY3JpcHRUcmFuc2ZlcnMIBQ0kdDAxNjU5MDE2NjgxAl8xBAhBc3NldElkcwgFDSR0MDE2NTkwMTY2ODECXzIEB0Ftb3VudHMIBQ0kdDAxNjU5MDE2NjgxAl8zBA5mYWN0b3J5QWN0aW9ucwkAzAgCCQD8BwQFFGZhY3RvcnlBZGRyZXNzT3JGYWlsAgxpbnRlZ2VyRW50cnkJAMwIAgkBFGtleVBvd2VyTWFuYWdlckJvbnVzAQUTY3VycmVudFBlcmlvZE9yRmFpbAkAzAgCBRVwb3dlclN0YWtlUGFydEluV2F2ZXMFA25pbAUDbmlsCQDMCAIJAPwHBAUUZmFjdG9yeUFkZHJlc3NPckZhaWwCDGludGVnZXJFbnRyeQkAzAgCCQETa2V5Q2xhaW1XYXZlc0Ftb3VudAEFE2N1cnJlbnRQZXJpb2RPckZhaWwJAMwIAgUQY2xhaW1QYXJ0SW5XYXZlcwUDbmlsBQNuaWwJAMwIAgkA/AcEBRRmYWN0b3J5QWRkcmVzc09yRmFpbAIMaW50ZWdlckVudHJ5CQDMCAIJARBrZXlDdXJyZW50UGVyaW9kAAkAzAgCBQluZXdQZXJpb2QFA25pbAUDbmlsCQDMCAIJAPwHBAUUZmFjdG9yeUFkZHJlc3NPckZhaWwCDGludGVnZXJFbnRyeQkAzAgCCQERa2V5UHJpY2VGb3JQZXJpb2QBBQluZXdQZXJpb2QJAMwIAgUIbmV3UHJpY2UFA25pbAUDbmlsCQDMCAIJAPwHBAUUZmFjdG9yeUFkZHJlc3NPckZhaWwCDGludGVnZXJFbnRyeQkAzAgCCQEOa2V5U3RhcnRIZWlnaHQBBQluZXdQZXJpb2QJAMwIAgkAZAIFD3BlcmlvZEVuZEhlaWdodAABBQNuaWwFA25pbAkAzAgCCQD8BwQFFGZhY3RvcnlBZGRyZXNzT3JGYWlsAgRidXJuCQDMCAIFE2xwQXNzZXRBbW91bnRUb0J1cm4FA25pbAUDbmlsCQDMCAIJAPwHBAUUZmFjdG9yeUFkZHJlc3NPckZhaWwCDGludGVnZXJFbnRyeQkAzAgCCQENa2V5V2l0aGRyYXdhbAAJAMwIAgAABQNuaWwFA25pbAkAzAgCCQD8BwQFFGZhY3RvcnlBZGRyZXNzT3JGYWlsAgxpbnRlZ2VyRW50cnkJAMwIAgkBE2tleVdpdGhkcmF3YWxQZXJpb2QBBRNjdXJyZW50UGVyaW9kT3JGYWlsCQDMCAIFE2xwQXNzZXRBbW91bnRUb0J1cm4FA25pbAUDbmlsCQDMCAIJAPwHBAUUZmFjdG9yeUFkZHJlc3NPckZhaWwCDGludGVnZXJFbnRyeQkAzAgCCQELa2V5SW52ZXN0ZWQBBQR1bml0CQDMCAIFDWxwUGFydEluV2F2ZXMFA25pbAUDbmlsCQDMCAIJAPwHBAUUZmFjdG9yeUFkZHJlc3NPckZhaWwCDGludGVnZXJFbnRyeQkAzAgCCQEKa2V5RG9uYXRlZAEFBHVuaXQJAMwIAgUTZG9uYXRpb25QYXJ0SW5XYXZlcwUDbmlsBQNuaWwJAMwIAgkA/AcEBRRmYWN0b3J5QWRkcmVzc09yRmFpbAILc3RyaW5nRW50cnkJAMwIAgkBG2tleVBlcmlvZFdpdGhkcmF3YWxBc3NldElkcwEFE2N1cnJlbnRQZXJpb2RPckZhaWwJAMwIAgUIQXNzZXRJZHMFA25pbAUDbmlsCQDMCAIJAPwHBAUUZmFjdG9yeUFkZHJlc3NPckZhaWwCC3N0cmluZ0VudHJ5CQDMCAIJARprZXlQZXJpb2RXaXRoZHJhd2FsQW1vdW50cwEFE2N1cnJlbnRQZXJpb2RPckZhaWwJAMwIAgUHQW1vdW50cwUDbmlsBQNuaWwFA25pbAkAlAoCBQ9zY3JpcHRUcmFuc2ZlcnMFDmZhY3RvcnlBY3Rpb25zCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBEGZpbmFsaXplUkVBRE9OTFkEE2RvbmF0aW9uUGFydEluV2F2ZXMNbHBQYXJ0SW5XYXZlcxBjbGFpbVBhcnRJbldhdmVzFXBvd2VyU3Rha2VQYXJ0SW5XYXZlcwQTY3VycmVudFBlcmlvZE9yRmFpbAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFFGZhY3RvcnlBZGRyZXNzT3JGYWlsCQEQa2V5Q3VycmVudFBlcmlvZAAJAQd3cmFwRXJyAQIOaW52YWxpZCBwZXJpb2QEDHBlcmlvZExlbmd0aAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFFGZhY3RvcnlBZGRyZXNzT3JGYWlsCQEPa2V5UGVyaW9kTGVuZ3RoAAkBB3dyYXBFcnIBAhVpbnZhbGlkIHBlcmlvZCBsZW5ndGgEEmN1cnJlbnRTdGFydEhlaWdodAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFFGZhY3RvcnlBZGRyZXNzT3JGYWlsCQEOa2V5U3RhcnRIZWlnaHQBBRNjdXJyZW50UGVyaW9kT3JGYWlsCQEHd3JhcEVycgECFGludmFsaWQgc3RhcnQgaGVpZ2h0BBJjdXJyZW50UHJpY2VPckZhaWwJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBRRmYWN0b3J5QWRkcmVzc09yRmFpbAkBEWtleVByaWNlRm9yUGVyaW9kAQUTY3VycmVudFBlcmlvZE9yRmFpbAkBB3dyYXBFcnIBAg1pbnZhbGlkIHByaWNlBBJuZXh0QmxvY2tUb1Byb2Nlc3MJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBRRmYWN0b3J5QWRkcmVzc09yRmFpbAkBFWtleU5leHRCbG9ja1RvUHJvY2VzcwAJAQd3cmFwRXJyAQIdaW52YWxpZCBuZXh0IGJsb2NrIHRvIHByb2Nlc3MED3BlcmlvZEVuZEhlaWdodAkAZQIJAGQCBRJjdXJyZW50U3RhcnRIZWlnaHQFDHBlcmlvZExlbmd0aAABBAZjaGVja3MJAMwIAgMJAGYCBRJuZXh0QmxvY2tUb1Byb2Nlc3MFD3BlcmlvZEVuZEhlaWdodAYJAQh0aHJvd0VycgECEnVucHJvY2Vzc2VkIGJsb2NrcwkAzAgCAwkAZwIFE2RvbmF0aW9uUGFydEluV2F2ZXMAAAYJAQh0aHJvd0VycgECFWludmFsaWQgZG9uYXRpb24gcGFydAkAzAgCAwkAZwIFDWxwUGFydEluV2F2ZXMAAAYJAQh0aHJvd0VycgECD2ludmFsaWQgbHAgcGFydAkAzAgCAwkAZwIFEGNsYWltUGFydEluV2F2ZXMAAAYJAQh0aHJvd0VycgECEmludmFsaWQgY2xhaW0gcGFydAkAzAgCAwkAZwIFFXBvd2VyU3Rha2VQYXJ0SW5XYXZlcwAABgkBCHRocm93RXJyAQIWaW52YWxpZCBQV1Igc3Rha2UgcGFydAUDbmlsAwkAAAIFBmNoZWNrcwUGY2hlY2tzBA0kdDAxOTY5ODE5ODAzCQEOY2FsY3VsYXRlUHJpY2UBBQ1scFBhcnRJbldhdmVzBAhuZXdQcmljZQgFDSR0MDE5Njk4MTk4MDMCXzEEE2xwQXNzZXRBbW91bnRUb0J1cm4IBQ0kdDAxOTY5ODE5ODAzAl8yBBRscEFzc2V0RmluYWxRdWFudGl0eQgFDSR0MDE5Njk4MTk4MDMCXzMJAJQKAgUDbmlsCQCYCgYFEGNsYWltUGFydEluV2F2ZXMFDWxwUGFydEluV2F2ZXMFE2RvbmF0aW9uUGFydEluV2F2ZXMFCG5ld1ByaWNlBRNscEFzc2V0QW1vdW50VG9CdXJuBRRscEFzc2V0RmluYWxRdWFudGl0eQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQZpbnZlc3QBEHVzZXJBZGRyZXNzQnl0ZXMEC2NoZWNrQ2FsbGVyCQELb25seUZhY3RvcnkBBQFpAwkAAAIFC2NoZWNrQ2FsbGVyBQtjaGVja0NhbGxlcgQLdXNlckFkZHJlc3MJAQdBZGRyZXNzAQUQdXNlckFkZHJlc3NCeXRlcwQTY3VycmVudFBlcmlvZE9yRmFpbAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFFGZhY3RvcnlBZGRyZXNzT3JGYWlsCQEQa2V5Q3VycmVudFBlcmlvZAAJAQd3cmFwRXJyAQIOaW52YWxpZCBwZXJpb2QEEmN1cnJlbnRTdGFydEhlaWdodAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFFGZhY3RvcnlBZGRyZXNzT3JGYWlsCQEOa2V5U3RhcnRIZWlnaHQBBRNjdXJyZW50UGVyaW9kT3JGYWlsCQEHd3JhcEVycgECFGludmFsaWQgc3RhcnQgaGVpZ2h0BBJpbnZlc3RQZXJpb2RMZW5ndGgJARFAZXh0ck5hdGl2ZSgxMDUwKQIFFGZhY3RvcnlBZGRyZXNzT3JGYWlsCQEVa2V5SW52ZXN0UGVyaW9kTGVuZ3RoAAQLaGVpZ2h0Q2hlY2sDCQBmAgkAZAIFEmN1cnJlbnRTdGFydEhlaWdodAUSaW52ZXN0UGVyaW9kTGVuZ3RoBQZoZWlnaHQGCQEIdGhyb3dFcnIBAiF0b28gbGF0ZSB0byBpbnZlc3QgaW4gdGhpcyBwZXJpb2QDCQAAAgULaGVpZ2h0Q2hlY2sFC2hlaWdodENoZWNrBBJjdXJyZW50UHJpY2VPckZhaWwJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBRRmYWN0b3J5QWRkcmVzc09yRmFpbAkBEWtleVByaWNlRm9yUGVyaW9kAQUTY3VycmVudFBlcmlvZE9yRmFpbAkBB3dyYXBFcnIBAg1pbnZhbGlkIHByaWNlBAdwYXltZW50AwkAAAIJAJADAQgFAWkIcGF5bWVudHMAAQkAkQMCCAUBaQhwYXltZW50cwAACQEIdGhyb3dFcnIBAhBpbnZhbGlkIHBheW1lbnRzBA0kdDAyMDkxMjIxMDg5AwMJAAACCAUHcGF5bWVudAdhc3NldElkBQR1bml0CQBmAggFB3BheW1lbnQGYW1vdW50AAAHCQCUCgIIBQdwYXltZW50BmFtb3VudAgFB3BheW1lbnQHYXNzZXRJZAkBCHRocm93RXJyAQIWaW52YWxpZCBwYXltZW50IGFtb3VudAQNcGF5bWVudEFtb3VudAgFDSR0MDIwOTEyMjEwODkCXzEEDnBheW1lbnRBc3NldElkCAUNJHQwMjA5MTIyMTA4OQJfMgQMdHJlYXN1cnlQYXJ0CQELdmFsdWVPckVsc2UCCQCaCAIFFGZhY3RvcnlBZGRyZXNzT3JGYWlsCQEXa2V5QnVzaW5lc3NUcmVhc3VyeVBhcnQAAAAEG3BheW1lbnRzV2l0aG91dFRyZWFzdXJ5UGFydAkAawMFDXBheW1lbnRBbW91bnQJAGUCBQZTQ0FMRTgFDHRyZWFzdXJ5UGFydAUGU0NBTEU4BA1scEFzc2V0QW1vdW50AwkAZgIFEmN1cnJlbnRQcmljZU9yRmFpbAAACQBrAwUbcGF5bWVudHNXaXRob3V0VHJlYXN1cnlQYXJ0BQZTQ0FMRTgFEmN1cnJlbnRQcmljZU9yRmFpbAAABAhpbnZlc3RlZAkBC3ZhbHVlT3JFbHNlAgkAmggCBRRmYWN0b3J5QWRkcmVzc09yRmFpbAkBC2tleUludmVzdGVkAQUEdW5pdAAABAdhY3Rpb25zCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFGW1haW5UcmVhc3VyeUFkZHJlc3NPckZhaWwFG3BheW1lbnRzV2l0aG91dFRyZWFzdXJ5UGFydAUOcGF5bWVudEFzc2V0SWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUdYnVzaW5lc3NUcmVhc3VyeUFkZHJlc3NPckZhaWwFDHRyZWFzdXJ5UGFydAUOcGF5bWVudEFzc2V0SWQFA25pbAQOZmFjdG9yeUFjdGlvbnMJAMwIAgkA/AcEBRRmYWN0b3J5QWRkcmVzc09yRmFpbAIMaW50ZWdlckVudHJ5CQDMCAIJAQtrZXlJbnZlc3RlZAEFBHVuaXQJAMwIAgkAZAIFCGludmVzdGVkBRtwYXltZW50c1dpdGhvdXRUcmVhc3VyeVBhcnQFA25pbAUDbmlsCQDMCAIJAPwHBAUUZmFjdG9yeUFkZHJlc3NPckZhaWwCB3JlaXNzdWUJAMwIAgUNbHBBc3NldEFtb3VudAUDbmlsBQNuaWwJAMwIAgkA/AcEBRRmYWN0b3J5QWRkcmVzc09yRmFpbAINdHJhbnNmZXJBc3NldAkAzAgCBRB1c2VyQWRkcmVzc0J5dGVzCQDMCAIFDWxwQXNzZXRBbW91bnQJAMwIAgUPbHBBc3NldElkT3JGYWlsBQNuaWwFA25pbAUDbmlsCQCUCgIFB2FjdGlvbnMFDmZhY3RvcnlBY3Rpb25zCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCHdpdGhkcmF3ARB1c2VyQWRkcmVzc0J5dGVzBAtjaGVja0NhbGxlcgkBC29ubHlGYWN0b3J5AQUBaQMJAAACBQtjaGVja0NhbGxlcgULY2hlY2tDYWxsZXIEC3VzZXJBZGRyZXNzCQEHQWRkcmVzcwEFEHVzZXJBZGRyZXNzQnl0ZXMEE2N1cnJlbnRQZXJpb2RPckZhaWwJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBRRmYWN0b3J5QWRkcmVzc09yRmFpbAkBEGtleUN1cnJlbnRQZXJpb2QACQEHd3JhcEVycgECDmludmFsaWQgcGVyaW9kBAxwZXJpb2RMZW5ndGgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBRRmYWN0b3J5QWRkcmVzc09yRmFpbAkBD2tleVBlcmlvZExlbmd0aAAJAQd3cmFwRXJyAQIVaW52YWxpZCBwZXJpb2QgbGVuZ3RoBBJjdXJyZW50U3RhcnRIZWlnaHQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBRRmYWN0b3J5QWRkcmVzc09yRmFpbAkBDmtleVN0YXJ0SGVpZ2h0AQUTY3VycmVudFBlcmlvZE9yRmFpbAkBB3dyYXBFcnIBAhRpbnZhbGlkIHN0YXJ0IGhlaWdodAQLaGVpZ2h0Q2hlY2sDCQBmAgkAZAIFEmN1cnJlbnRTdGFydEhlaWdodAUMcGVyaW9kTGVuZ3RoBQZoZWlnaHQGCQEIdGhyb3dFcnIBAiN0b28gbGF0ZSB0byB3aXRoZHJhdyBpbiB0aGlzIHBlcmlvZAMJAAACBQtoZWlnaHRDaGVjawULaGVpZ2h0Q2hlY2sEB3BheW1lbnQDCQAAAgkAkAMBCAUBaQhwYXltZW50cwABCQCRAwIIBQFpCHBheW1lbnRzAAAJAQh0aHJvd0VycgEJAQd3cmFwRXJyAQIQaW52YWxpZCBwYXltZW50cwQOcGF5bWVudEFzc2V0SWQDCQAAAggFB3BheW1lbnQHYXNzZXRJZAUPbHBBc3NldElkT3JGYWlsBQ9scEFzc2V0SWRPckZhaWwJAQh0aHJvd0VycgECFWludmFsaWQgcGF5bWVudCBhc3NldAQNcGF5bWVudEFtb3VudAMJAGYCCAUHcGF5bWVudAZhbW91bnQAAAgFB3BheW1lbnQGYW1vdW50CQEIdGhyb3dFcnIBAhZpbnZhbGlkIHBheW1lbnQgYW1vdW50BAp3aXRoZHJhd2FsCQELdmFsdWVPckVsc2UCCQCaCAIFFGZhY3RvcnlBZGRyZXNzT3JGYWlsCQENa2V5V2l0aGRyYXdhbAAAAAQHYWN0aW9ucwkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBRRmYWN0b3J5QWRkcmVzc09yRmFpbAUNcGF5bWVudEFtb3VudAUOcGF5bWVudEFzc2V0SWQFA25pbAQOZmFjdG9yeUFjdGlvbnMJAMwIAgkA/AcEBRRmYWN0b3J5QWRkcmVzc09yRmFpbAIMaW50ZWdlckVudHJ5CQDMCAIJAQ1rZXlXaXRoZHJhd2FsAAkAzAgCCQBkAgUKd2l0aGRyYXdhbAUNcGF5bWVudEFtb3VudAUDbmlsBQNuaWwJAMwIAgkA/AcEBRRmYWN0b3J5QWRkcmVzc09yRmFpbAILc3RyaW5nRW50cnkJAMwIAgkBFGtleVdpdGhkcmF3YWxSZXF1ZXN0AgULdXNlckFkZHJlc3MIBQFpDXRyYW5zYWN0aW9uSWQJAMwIAgkBFnZhbHVlV2l0aGRyYXdhbFJlcXVlc3QEBQdQRU5ESU5HBQ1wYXltZW50QW1vdW50CQBkAgUTY3VycmVudFBlcmlvZE9yRmFpbAABBQR1bml0BQNuaWwFA25pbAUDbmlsAwkAAAIFDmZhY3RvcnlBY3Rpb25zBQ5mYWN0b3J5QWN0aW9ucwkAlAoCBQdhY3Rpb25zBQ5mYWN0b3J5QWN0aW9ucwkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQ5jYW5jZWxXaXRoZHJhdwIQdXNlckFkZHJlc3NCeXRlcwR0eElkBAtjaGVja0NhbGxlcgkBC29ubHlGYWN0b3J5AQUBaQMJAAACBQtjaGVja0NhbGxlcgULY2hlY2tDYWxsZXIJAQh0aHJvd0VycgECHGNhbmNlbFdpdGhkcmF3IGlzIGRlcHJlY2F0ZWQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEPY2xhaW1Db2xsYXRlcmFsAhB1c2VyQWRkcmVzc0J5dGVzBHR4SWQEC2NoZWNrQ2FsbGVyCQELb25seUZhY3RvcnkBBQFpAwkAAAIFC2NoZWNrQ2FsbGVyBQtjaGVja0NhbGxlcgQNJHQwMjQwNTYyNDI0MQkBF2NsYWltQ29sbGF0ZXJhbElOVEVSTkFMAgUQdXNlckFkZHJlc3NCeXRlcwkA2QQBBQR0eElkBAt1c2VyQWRkcmVzcwgFDSR0MDI0MDU2MjQyNDECXzEEDWxwQXNzZXRBbW91bnQIBQ0kdDAyNDA1NjI0MjQxAl8yBAx0YXJnZXRQZXJpb2QIBQ0kdDAyNDA1NjI0MjQxAl8zBAt3YXZlc0Ftb3VudAgFDSR0MDI0MDU2MjQyNDECXzQEDGFzc2V0c1N0cmluZwgFDSR0MDI0MDU2MjQyNDECXzUEDWFtb3VudHNTdHJpbmcIBQ0kdDAyNDA1NjI0MjQxAl82BAphc3NldHNMaXN0CQDRCAIJAL0JAgUMYXNzZXRzU3RyaW5nBQNTRVAAAAQLYW1vdW50c0xpc3QJANEIAgkAvQkCBQ1hbW91bnRzU3RyaW5nBQNTRVAAAAQOZmFjdG9yeUFjdGlvbnMJAMwIAgkA/AcEBRRmYWN0b3J5QWRkcmVzc09yRmFpbAILZGVsZXRlRW50cnkJAMwIAgkBFGtleVdpdGhkcmF3YWxSZXF1ZXN0AgULdXNlckFkZHJlc3MJANkEAQUEdHhJZAUDbmlsBQNuaWwJAMwIAgkA/AcEBRRmYWN0b3J5QWRkcmVzc09yRmFpbAIMaW50ZWdlckVudHJ5CQDMCAIJARRrZXlXaXRoZHJhd2FsSGlzdG9yeQIFC3VzZXJBZGRyZXNzCQDZBAEFBHR4SWQJAMwIAgUNbHBBc3NldEFtb3VudAUDbmlsBQNuaWwJAMwIAgkA/AcEBRRmYWN0b3J5QWRkcmVzc09yRmFpbAIOdHJhbnNmZXJBc3NldHMJAMwIAgUQdXNlckFkZHJlc3NCeXRlcwkAzAgCBQphc3NldHNMaXN0CQDMCAIFC2Ftb3VudHNMaXN0BQNuaWwFA25pbAUDbmlsCQCUCgIFA25pbAUOZmFjdG9yeUFjdGlvbnMJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQETY2xhaW1Db2xsYXRlcmFsQnVsawIQdXNlckFkZHJlc3NCeXRlcwV0eElkcwQLY2hlY2tDYWxsZXIJAQtvbmx5RmFjdG9yeQEFAWkDCQAAAgULY2hlY2tDYWxsZXIFC2NoZWNrQ2FsbGVyCgEMYWRkTmV3QWN0aW9uAgVzdGF0ZQR0eElkBA0kdDAyNDk5NzI1MTk2CQEXY2xhaW1Db2xsYXRlcmFsSU5URVJOQUwCBRB1c2VyQWRkcmVzc0J5dGVzCQDZBAEFBHR4SWQEC3VzZXJBZGRyZXNzCAUNJHQwMjQ5OTcyNTE5NgJfMQQNbHBBc3NldEFtb3VudAgFDSR0MDI0OTk3MjUxOTYCXzIEDHRhcmdldFBlcmlvZAgFDSR0MDI0OTk3MjUxOTYCXzMEC3dhdmVzQW1vdW50CAUNJHQwMjQ5OTcyNTE5NgJfNAQMYXNzZXRzU3RyaW5nCAUNJHQwMjQ5OTcyNTE5NgJfNQQNYW1vdW50c1N0cmluZwgFDSR0MDI0OTk3MjUxOTYCXzYECmFzc2V0c0xpc3QJANEIAgkAvQkCBQxhc3NldHNTdHJpbmcFA1NFUAAABAthbW91bnRzTGlzdAkA0QgCCQC9CQIFDWFtb3VudHNTdHJpbmcFA1NFUAAABApuZXdBY3Rpb25zCQDMCAIJAPwHBAUUZmFjdG9yeUFkZHJlc3NPckZhaWwCC2RlbGV0ZUVudHJ5CQDMCAIJARRrZXlXaXRoZHJhd2FsUmVxdWVzdAIFC3VzZXJBZGRyZXNzCQDZBAEFBHR4SWQFA25pbAUDbmlsCQDMCAIJAPwHBAUUZmFjdG9yeUFkZHJlc3NPckZhaWwCDGludGVnZXJFbnRyeQkAzAgCCQEUa2V5V2l0aGRyYXdhbEhpc3RvcnkCBQt1c2VyQWRkcmVzcwkA2QQBBQR0eElkCQDMCAIFDWxwQXNzZXRBbW91bnQFA25pbAUDbmlsCQDMCAIJAPwHBAUUZmFjdG9yeUFkZHJlc3NPckZhaWwCDnRyYW5zZmVyQXNzZXRzCQDMCAIFEHVzZXJBZGRyZXNzQnl0ZXMJAMwIAgUKYXNzZXRzTGlzdAkAzAgCBQthbW91bnRzTGlzdAUDbmlsBQNuaWwFA25pbAkAzggCBQVzdGF0ZQUKbmV3QWN0aW9ucwQRYWxsRmFjdG9yeUFjdGlvbnMKAAIkbAUFdHhJZHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBDGFkZE5ld0FjdGlvbgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgkAlAoCBQNuaWwFEWFsbEZhY3RvcnlBY3Rpb25zCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBF2NsYWltQ29sbGF0ZXJhbFJFQURPTkxZAhB1c2VyQWRkcmVzc0J5dGVzBHR4SWQECHJlc3BvbnNlCQElY2xhaW1Db2xsYXRlcmFsUkVBRE9OTFlTdHJpbmdSZXNwb25zZQIFEHVzZXJBZGRyZXNzQnl0ZXMJANkEAQUEdHhJZAkAlAoCBQNuaWwFCHJlc3BvbnNlAWkBG2NsYWltQ29sbGF0ZXJhbEJ1bGtSRUFET05MWQIQdXNlckFkZHJlc3NCeXRlcwV0eElkcwoBC3Byb2Nlc3NUeElkAgVzdGF0ZQR0eElkBAhyZXNwb25zZQkBJWNsYWltQ29sbGF0ZXJhbFJFQURPTkxZU3RyaW5nUmVzcG9uc2UCBRB1c2VyQWRkcmVzc0J5dGVzCQDZBAEFBHR4SWQJAM0IAgUFc3RhdGUFCHJlc3BvbnNlBAxhbGxSZXNwb25zZXMKAAIkbAUFdHhJZHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBC3Byb2Nlc3NUeElkAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKCQCUCgIFA25pbAUMYWxsUmVzcG9uc2VzAWkBDXByb2Nlc3NCbG9ja3MBEHVzZXJBZGRyZXNzQnl0ZXMEC2NoZWNrQ2FsbGVyCQELb25seUZhY3RvcnkBBQFpAwkAAAIFC2NoZWNrQ2FsbGVyBQtjaGVja0NhbGxlcgQLdXNlckFkZHJlc3MJAQdBZGRyZXNzAQUQdXNlckFkZHJlc3NCeXRlcwQTY3VycmVudFBlcmlvZE9yRmFpbAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFFGZhY3RvcnlBZGRyZXNzT3JGYWlsCQEQa2V5Q3VycmVudFBlcmlvZAAJAQd3cmFwRXJyAQIOaW52YWxpZCBwZXJpb2QEDHBlcmlvZExlbmd0aAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFFGZhY3RvcnlBZGRyZXNzT3JGYWlsCQEPa2V5UGVyaW9kTGVuZ3RoAAkBB3dyYXBFcnIBAhVpbnZhbGlkIHBlcmlvZCBsZW5ndGgEEmN1cnJlbnRTdGFydEhlaWdodAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFFGZhY3RvcnlBZGRyZXNzT3JGYWlsCQEOa2V5U3RhcnRIZWlnaHQBBRNjdXJyZW50UGVyaW9kT3JGYWlsCQEHd3JhcEVycgECFGludmFsaWQgc3RhcnQgaGVpZ2h0BBJjdXJyZW50UHJpY2VPckZhaWwJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBRRmYWN0b3J5QWRkcmVzc09yRmFpbAkBEWtleVByaWNlRm9yUGVyaW9kAQUTY3VycmVudFBlcmlvZE9yRmFpbAkBB3dyYXBFcnIBAg1pbnZhbGlkIHByaWNlBBJuZXh0QmxvY2tUb1Byb2Nlc3MJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBRRmYWN0b3J5QWRkcmVzc09yRmFpbAkBFWtleU5leHRCbG9ja1RvUHJvY2VzcwAJAQd3cmFwRXJyAQIdaW52YWxpZCBuZXh0IGJsb2NrIHRvIHByb2Nlc3MED3BlcmlvZEVuZEhlaWdodAkAZQIJAGQCBRJjdXJyZW50U3RhcnRIZWlnaHQFDHBlcmlvZExlbmd0aAABBBlibG9ja3NQcm9jZXNzaW5nQmF0Y2hTaXplAwMDCQBnAgUGaGVpZ2h0BRJuZXh0QmxvY2tUb1Byb2Nlc3MDCQBnAgUSbmV4dEJsb2NrVG9Qcm9jZXNzBRJjdXJyZW50U3RhcnRIZWlnaHQGCQAAAgUTY3VycmVudFBlcmlvZE9yRmFpbAAABwkAZwIFD3BlcmlvZEVuZEhlaWdodAUSbmV4dEJsb2NrVG9Qcm9jZXNzBwkAlwMBCQDMCAIJAGQCCQBlAgUPcGVyaW9kRW5kSGVpZ2h0BRJuZXh0QmxvY2tUb1Byb2Nlc3MAAQkAzAgCBRxibG9ja3NQcm9jZXNzaW5nQmF0Y2hTaXplTWF4BQNuaWwJAQh0aHJvd0VycgEJAQd3cmFwRXJyAQIUaW52YWxpZCB0YXJnZXQgYmxvY2sEFWJsb2NrUHJvY2Vzc2luZ1Jld2FyZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFFGZhY3RvcnlBZGRyZXNzT3JGYWlsCQEYa2V5QmxvY2tQcm9jZXNzaW5nUmV3YXJkAAkBB3dyYXBFcnIBAh9pbnZhbGlkIGJsb2NrIHByb2Nlc3NpbmcgcmV3YXJkBCBibG9ja1Byb2Nlc3NpbmdSZXdhcmRCeUdlbmVyYXRvcgkAaQIFFWJsb2NrUHJvY2Vzc2luZ1Jld2FyZAUZYmxvY2tzUHJvY2Vzc2luZ0JhdGNoU2l6ZQQpYmxvY2tQcm9jZXNzaW5nUmV3YXJkQnlHZW5lcmF0b3JSZW1haW5kZXIJAGUCBRVibG9ja1Byb2Nlc3NpbmdSZXdhcmQJAGgCBSBibG9ja1Byb2Nlc3NpbmdSZXdhcmRCeUdlbmVyYXRvcgUZYmxvY2tzUHJvY2Vzc2luZ0JhdGNoU2l6ZQoBA21hcAIDYWNjA2luYwMJAGcCBQNpbmMFGWJsb2Nrc1Byb2Nlc3NpbmdCYXRjaFNpemUFA2FjYwQRdGFyZ2V0QmxvY2tIZWlnaHQJAGQCBRJuZXh0QmxvY2tUb1Byb2Nlc3MFA2luYwQPdGFyZ2V0QmxvY2tJbmZvCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAO0HAQURdGFyZ2V0QmxvY2tIZWlnaHQJAQd3cmFwRXJyAQISaW52YWxpZCBibG9jayBpbmZvBBR0cmVhc3VyeVJld2FyZE9yRmFpbAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQEPcmV3YXJkRm9yT3B0aW9uAggFD3RhcmdldEJsb2NrSW5mbwdyZXdhcmRzBRpwcm94eVRyZWFzdXJ5QWRkcmVzc09yRmFpbAkBB3dyYXBFcnIBCQCsAgICI2ludmFsaWQgdHJlYXN1cnkgcmV3YXJkIGZvciBoZWlnaHQgCQCkAwEFEXRhcmdldEJsb2NrSGVpZ2h0BAlnZW5lcmF0b3IIBQ90YXJnZXRCbG9ja0luZm8JZ2VuZXJhdG9yBAlhdmFpbGFibGUJAQt2YWx1ZU9yRWxzZQIJAJoIAgUUZmFjdG9yeUFkZHJlc3NPckZhaWwJAQxrZXlBdmFpbGFibGUBBQlnZW5lcmF0b3IAAAQMY2FsbGVyUmV3YXJkAwkAAAIFA2luYwkAZQIFGWJsb2Nrc1Byb2Nlc3NpbmdCYXRjaFNpemUAAQkAZAIFIGJsb2NrUHJvY2Vzc2luZ1Jld2FyZEJ5R2VuZXJhdG9yBSlibG9ja1Byb2Nlc3NpbmdSZXdhcmRCeUdlbmVyYXRvclJlbWFpbmRlcgUgYmxvY2tQcm9jZXNzaW5nUmV3YXJkQnlHZW5lcmF0b3IEDSR0MDI5MDk2MjkyMDQJAQ5nZXRSZXdhcmRTcGxpdAEFFHRyZWFzdXJ5UmV3YXJkT3JGYWlsBBJzaGFyZUFtb3VudFRvUG93ZXIIBQ0kdDAyOTA5NjI5MjA0Al8xBBpidXNpbmVzc1RyZWFzdXJ5QW1vdW50UGFydAgFDSR0MDI5MDk2MjkyMDQCXzIED3Jld2FyZFJlbWFpbmRlcggFDSR0MDI5MDk2MjkyMDQCXzMEDWxwQXNzZXRBbW91bnQDCQBmAgUSY3VycmVudFByaWNlT3JGYWlsAAAJAGsDCQBlAgUPcmV3YXJkUmVtYWluZGVyBQxjYWxsZXJSZXdhcmQFBlNDQUxFOAUSY3VycmVudFByaWNlT3JGYWlsAAAEFGZhY3RvcnlBY3Rpb25zU2luZ2xlCQDMCAIJAPwHBAUUZmFjdG9yeUFkZHJlc3NPckZhaWwCC3N0cmluZ0VudHJ5CQDMCAIJARFrZXlCbG9ja1Byb2Nlc3NlZAEFEXRhcmdldEJsb2NrSGVpZ2h0CQDMCAIJALkJAgkAzAgCCQDYBAEIBQFpDXRyYW5zYWN0aW9uSWQJAMwIAgkApAMBBRNjdXJyZW50UGVyaW9kT3JGYWlsCQDMCAIJAKUIAQUJZ2VuZXJhdG9yCQDMCAIJANgEAQUQdXNlckFkZHJlc3NCeXRlcwkAzAgCCQCkAwEFFHRyZWFzdXJ5UmV3YXJkT3JGYWlsCQDMCAIJAKQDAQUMY2FsbGVyUmV3YXJkCQDMCAIJAKQDAQUNbHBBc3NldEFtb3VudAkAzAgCCQCkAwEFEnNoYXJlQW1vdW50VG9Qb3dlcgUDbmlsBQNTRVAFA25pbAUDbmlsCQDMCAIJAPwHBAUUZmFjdG9yeUFkZHJlc3NPckZhaWwCDGludGVnZXJFbnRyeQkAzAgCCQEMa2V5QXZhaWxhYmxlAQUJZ2VuZXJhdG9yCQDMCAIJAGQCBQlhdmFpbGFibGUFDWxwQXNzZXRBbW91bnQFA25pbAUDbmlsBQNuaWwDCQAAAgUUZmFjdG9yeUFjdGlvbnNTaW5nbGUFFGZhY3RvcnlBY3Rpb25zU2luZ2xlBA0kdDAzMDA1MjMwMTI3BQNhY2MECmxwQXNzZXRBY2MIBQ0kdDAzMDA1MjMwMTI3Al8xBAlyZXdhcmRBY2MIBQ0kdDAzMDA1MjMwMTI3Al8yBBNidXNpbmVzc1RyZWFzdXJ5QWNjCAUNJHQwMzAwNTIzMDEyNwJfMwQTcG93ZXJTaGFyZURhdGFUdXBsZQgFDSR0MDMwMDUyMzAxMjcCXzQEDSR0MDMwMTM0MzAyMDAFE3Bvd2VyU2hhcmVEYXRhVHVwbGUEDXBvd2VyU2hhcmVBY2MIBQ0kdDAzMDEzNDMwMjAwAl8xBBdnZW5lcmF0b3JQb3dlclNoYXJlTGlzdAgFDSR0MDMwMTM0MzAyMDACXzIEGm5ld0dlbmVyYXRvclBvd2VyU2hhcmVMaXN0CQDNCAIFF2dlbmVyYXRvclBvd2VyU2hhcmVMaXN0CQCUCgIJAKUIAQUJZ2VuZXJhdG9yBRJzaGFyZUFtb3VudFRvUG93ZXIJAJYKBAkAZAIFCmxwQXNzZXRBY2MFDWxwQXNzZXRBbW91bnQJAGQCBQlyZXdhcmRBY2MFFHRyZWFzdXJ5UmV3YXJkT3JGYWlsCQBkAgUTYnVzaW5lc3NUcmVhc3VyeUFjYwUaYnVzaW5lc3NUcmVhc3VyeUFtb3VudFBhcnQJAJQKAgkAZAIFDXBvd2VyU2hhcmVBY2MFEnNoYXJlQW1vdW50VG9Qb3dlcgUabmV3R2VuZXJhdG9yUG93ZXJTaGFyZUxpc3QJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4EBGxpc3QJAMwIAgAACQDMCAIAAQkAzAgCAAIJAMwIAgADCQDMCAIABAkAzAgCAAUJAMwIAgAGCQDMCAIABwkAzAgCAAgJAMwIAgAJCQDMCAIACgkAzAgCAAsJAMwIAgAMCQDMCAIADQkAzAgCAA4JAMwIAgAPCQDMCAIAEAkAzAgCABEJAMwIAgASCQDMCAIAEwUDbmlsBA0kdDAzMDY0ODMwODEwCgACJGwFBGxpc3QKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCWCgQAAAAAAAAJAJQKAgAABQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBA21hcAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMjAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUAwkAAAIFDSR0MDMwNjQ4MzA4MTAFDSR0MDMwNjQ4MzA4MTAEE3Bvd2VyU2hhcmVEYXRhVHVwbGUIBQ0kdDAzMDY0ODMwODEwAl80BB5yZXdhcmRUb0J1c2luZXNzVHJlYXN1cnlBbW91bnQIBQ0kdDAzMDY0ODMwODEwAl8zBBFyZXdhcmRBbW91bnRUb3RhbAgFDSR0MDMwNjQ4MzA4MTACXzIEEmxwQXNzZXRBbW91bnRUb3RhbAgFDSR0MDMwNjQ4MzA4MTACXzEEDSR0MDMwODE0MzA4ODMFE3Bvd2VyU2hhcmVEYXRhVHVwbGUEEmFtb3VudFRvUG93ZXJUb3RhbAgFDSR0MDMwODE0MzA4ODMCXzEEFXBvd2VyU2hhcmVBbW91bnRzTGlzdAgFDSR0MDMwODE0MzA4ODMCXzIEGnJld2FyZFRvTWFpblRyZWFzdXJ5QW1vdW50CQBlAgkAZQIJAGUCBRFyZXdhcmRBbW91bnRUb3RhbAUecmV3YXJkVG9CdXNpbmVzc1RyZWFzdXJ5QW1vdW50BRVibG9ja1Byb2Nlc3NpbmdSZXdhcmQFEmFtb3VudFRvUG93ZXJUb3RhbAQIaW52ZXN0ZWQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUUZmFjdG9yeUFkZHJlc3NPckZhaWwJAQtrZXlJbnZlc3RlZAEFBHVuaXQAAAQRcG93ZXJTaGFyZUFjdGlvbnMDCQBmAgUSYW1vdW50VG9Qb3dlclRvdGFsAAAEDnRyYW5zZmVyQWN0aW9uCQDMCAIJAPwHBAUUZmFjdG9yeUFkZHJlc3NPckZhaWwCGXRyYW5zZmVyRnJvbVByb3h5VHJlYXN1cnkJAMwIAggFFGZhY3RvcnlBZGRyZXNzT3JGYWlsBWJ5dGVzCQDMCAIFEmFtb3VudFRvUG93ZXJUb3RhbAUDbmlsBQNuaWwFA25pbAMJAAACBQ50cmFuc2ZlckFjdGlvbgUOdHJhbnNmZXJBY3Rpb24EEHRvdGFsUG93ZXJBbW91bnQJAPwHBAUUZmFjdG9yeUFkZHJlc3NPckZhaWwCBHN3YXAJAMwIAgUYcG93ZXJBc3NldElkU3RyaW5nT3JGYWlsCQDMCAIFBVdBVkVTCQDMCAIFEmFtb3VudFRvUG93ZXJUb3RhbAUDbmlsBQNuaWwDCQAAAgUQdG90YWxQb3dlckFtb3VudAUQdG90YWxQb3dlckFtb3VudAQTdG90YWxQb3dlckFtb3VudEludAQHJG1hdGNoMAUQdG90YWxQb3dlckFtb3VudAMJAAECBQckbWF0Y2gwAgNJbnQEB3BBbW91bnQFByRtYXRjaDAFB3BBbW91bnQAAAoBEHN0YWtlUG93ZXJJbnZva2UCA2FjYwRuZXh0BA0kdDAzMTc1NzMxNzkyBQRuZXh0BAlnZW5lcmF0b3IIBQ0kdDAzMTc1NzMxNzkyAl8xBAtzaGFyZUFtb3VudAgFDSR0MDMxNzU3MzE3OTICXzIDCQBmAgUSYW1vdW50VG9Qb3dlclRvdGFsAAAEC3Bvd2VyQW1vdW50CQBrAwULc2hhcmVBbW91bnQFE3RvdGFsUG93ZXJBbW91bnRJbnQFEmFtb3VudFRvUG93ZXJUb3RhbAQDaW52CQD8BwQFFGZhY3RvcnlBZGRyZXNzT3JGYWlsAgpwb3dlclN0YWtlCQDMCAIJANkEAQUJZ2VuZXJhdG9yCQDMCAIJANkEAQUYcG93ZXJBc3NldElkU3RyaW5nT3JGYWlsCQDMCAIFC3Bvd2VyQW1vdW50BQNuaWwFA25pbAMJAAACBQNpbnYFA2ludgUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBQNuaWwEEnBvd2VyU3Rha2VzQWN0aW9ucwoAAiRsBRVwb3dlclNoYXJlQW1vdW50c0xpc3QKAAIkcwkAkAMBBQIkbAoABSRhY2MwAAAKAQUkZjFfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBEHN0YWtlUG93ZXJJbnZva2UCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjFfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDIwCQEFJGYxXzICCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAMJAAACBRJwb3dlclN0YWtlc0FjdGlvbnMFEnBvd2VyU3Rha2VzQWN0aW9ucwUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBQNuaWwDCQAAAgURcG93ZXJTaGFyZUFjdGlvbnMFEXBvd2VyU2hhcmVBY3Rpb25zBAdhY3Rpb25zCQDMCAIJAPwHBAUUZmFjdG9yeUFkZHJlc3NPckZhaWwCB3JlaXNzdWUJAMwIAgUSbHBBc3NldEFtb3VudFRvdGFsBQNuaWwFA25pbAkAzAgCCQD8BwQFFGZhY3RvcnlBZGRyZXNzT3JGYWlsAgxpbnRlZ2VyRW50cnkJAMwIAgkBFWtleU5leHRCbG9ja1RvUHJvY2VzcwAJAMwIAgkAZAIFEm5leHRCbG9ja1RvUHJvY2VzcwUZYmxvY2tzUHJvY2Vzc2luZ0JhdGNoU2l6ZQUDbmlsBQNuaWwJAMwIAgkA/AcEBRRmYWN0b3J5QWRkcmVzc09yRmFpbAIZdHJhbnNmZXJGcm9tUHJveHlUcmVhc3VyeQkAzAgCCAUZbWFpblRyZWFzdXJ5QWRkcmVzc09yRmFpbAVieXRlcwkAzAgCBRpyZXdhcmRUb01haW5UcmVhc3VyeUFtb3VudAUDbmlsBQNuaWwJAMwIAgkA/AcEBRRmYWN0b3J5QWRkcmVzc09yRmFpbAIZdHJhbnNmZXJGcm9tUHJveHlUcmVhc3VyeQkAzAgCBRB1c2VyQWRkcmVzc0J5dGVzCQDMCAIFFWJsb2NrUHJvY2Vzc2luZ1Jld2FyZAUDbmlsBQNuaWwJAMwIAgkA/AcEBRRmYWN0b3J5QWRkcmVzc09yRmFpbAIZdHJhbnNmZXJGcm9tUHJveHlUcmVhc3VyeQkAzAgCCAUdYnVzaW5lc3NUcmVhc3VyeUFkZHJlc3NPckZhaWwFYnl0ZXMJAMwIAgUecmV3YXJkVG9CdXNpbmVzc1RyZWFzdXJ5QW1vdW50BQNuaWwFA25pbAkAzAgCCQD8BwQFFGZhY3RvcnlBZGRyZXNzT3JGYWlsAgxpbnRlZ2VyRW50cnkJAMwIAgkBC2tleUludmVzdGVkAQUEdW5pdAkAzAgCCQBkAgUIaW52ZXN0ZWQFGnJld2FyZFRvTWFpblRyZWFzdXJ5QW1vdW50BQNuaWwFA25pbAUDbmlsAwkAAAIFB2FjdGlvbnMFB2FjdGlvbnMJAJQKAgUDbmlsBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQJ0eAEGdmVyaWZ5AAQJcHVibGljS2V5BAckbWF0Y2gwCQEZZ2V0TWFuYWdlclB1YmxpY0tleU9yVW5pdAADCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQDcHViBQckbWF0Y2gwBQNwdWIIBQJ0eA9zZW5kZXJQdWJsaWNLZXkJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAFCXB1YmxpY0tledgJ0HQ=", "height": 3453142, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: ELMGPbmq8Bk27E9DeTv38ndrSBJVdWMZ8Qp54rm374WL Next: E4WgVHUj1Dz2VTcm3YVhgTPDpa54V3htkWGSyk6HC8u4 Diff:
OldNewDifferences
491491 then true
492492 else (i.originCaller == mainTreasuryAddressOrFail))
493493 then true
494- else throwErr("permission denied"), if ((nextBlockToProcess > periodEndHeight))
494+ else throwErr("permission denied (finalize)"), if ((nextBlockToProcess > periodEndHeight))
495495 then true
496496 else throwErr("unprocessed blocks"), if ((donationPartInWaves >= 0))
497497 then true
504504 else throwErr("invalid PWR stake part")]
505505 if ((checks == checks))
506506 then {
507- let $t01547015575 = calculatePrice(lpPartInWaves)
508- let newPrice = $t01547015575._1
509- let lpAssetAmountToBurn = $t01547015575._2
510- let lpAssetFinalQuantity = $t01547015575._3
507+ let $t01548115586 = calculatePrice(lpPartInWaves)
508+ let newPrice = $t01548115586._1
509+ let lpAssetAmountToBurn = $t01548115586._2
510+ let lpAssetFinalQuantity = $t01548115586._3
511511 let newPeriod = (currentPeriodOrFail + 1)
512512 func addNewAction (actions,payment) = {
513- let $t01572315785 = actions
514- let scriptTransfers = $t01572315785._1
515- let assetIdsString = $t01572315785._2
516- let amountsString = $t01572315785._3
513+ let $t01573415796 = actions
514+ let scriptTransfers = $t01573415796._1
515+ let assetIdsString = $t01573415796._2
516+ let amountsString = $t01573415796._3
517517 let paymentAmount = payment.amount
518518 let paymentAssetId = payment.assetId
519519 if ((assetIdToString(paymentAssetId) == l2mpAssetIdStringOrFail))
529529 }
530530 }
531531
532- let $t01657916670 = {
532+ let $t01659016681 = {
533533 let $l = i.payments
534534 let $s = size($l)
535535 let $acc0 = $Tuple3(nil, "", "")
543543
544544 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
545545 }
546- let scriptTransfers = $t01657916670._1
547- let AssetIds = $t01657916670._2
548- let Amounts = $t01657916670._3
546+ let scriptTransfers = $t01659016681._1
547+ let AssetIds = $t01659016681._2
548+ let Amounts = $t01659016681._3
549549 let factoryActions = [invoke(factoryAddressOrFail, "integerEntry", [keyPowerManagerBonus(currentPeriodOrFail), powerStakePartInWaves], nil), invoke(factoryAddressOrFail, "integerEntry", [keyClaimWavesAmount(currentPeriodOrFail), claimPartInWaves], nil), invoke(factoryAddressOrFail, "integerEntry", [keyCurrentPeriod(), newPeriod], nil), invoke(factoryAddressOrFail, "integerEntry", [keyPriceForPeriod(newPeriod), newPrice], nil), invoke(factoryAddressOrFail, "integerEntry", [keyStartHeight(newPeriod), (periodEndHeight + 1)], nil), invoke(factoryAddressOrFail, "burn", [lpAssetAmountToBurn], nil), invoke(factoryAddressOrFail, "integerEntry", [keyWithdrawal(), 0], nil), invoke(factoryAddressOrFail, "integerEntry", [keyWithdrawalPeriod(currentPeriodOrFail), lpAssetAmountToBurn], nil), invoke(factoryAddressOrFail, "integerEntry", [keyInvested(unit), lpPartInWaves], nil), invoke(factoryAddressOrFail, "integerEntry", [keyDonated(unit), donationPartInWaves], nil), invoke(factoryAddressOrFail, "stringEntry", [keyPeriodWithdrawalAssetIds(currentPeriodOrFail), AssetIds], nil), invoke(factoryAddressOrFail, "stringEntry", [keyPeriodWithdrawalAmounts(currentPeriodOrFail), Amounts], nil)]
550550 $Tuple2(scriptTransfers, factoryActions)
551551 }
577577 else throwErr("invalid PWR stake part")]
578578 if ((checks == checks))
579579 then {
580- let $t01968719792 = calculatePrice(lpPartInWaves)
581- let newPrice = $t01968719792._1
582- let lpAssetAmountToBurn = $t01968719792._2
583- let lpAssetFinalQuantity = $t01968719792._3
580+ let $t01969819803 = calculatePrice(lpPartInWaves)
581+ let newPrice = $t01969819803._1
582+ let lpAssetAmountToBurn = $t01969819803._2
583+ let lpAssetFinalQuantity = $t01969819803._3
584584 $Tuple2(nil, $Tuple6(claimPartInWaves, lpPartInWaves, donationPartInWaves, newPrice, lpAssetAmountToBurn, lpAssetFinalQuantity))
585585 }
586586 else throw("Strict value is not equal to itself.")
606606 let payment = if ((size(i.payments) == 1))
607607 then i.payments[0]
608608 else throwErr("invalid payments")
609- let $t02090121078 = if (if ((payment.assetId == unit))
609+ let $t02091221089 = if (if ((payment.assetId == unit))
610610 then (payment.amount > 0)
611611 else false)
612612 then $Tuple2(payment.amount, payment.assetId)
613613 else throwErr("invalid payment amount")
614- let paymentAmount = $t02090121078._1
615- let paymentAssetId = $t02090121078._2
614+ let paymentAmount = $t02091221089._1
615+ let paymentAssetId = $t02091221089._2
616616 let treasuryPart = valueOrElse(getInteger(factoryAddressOrFail, keyBusinessTreasuryPart()), 0)
617617 let paymentsWithoutTreasuryPart = fraction(paymentAmount, (SCALE8 - treasuryPart), SCALE8)
618618 let lpAssetAmount = if ((currentPriceOrFail > 0))
682682 let checkCaller = onlyFactory(i)
683683 if ((checkCaller == checkCaller))
684684 then {
685- let $t02404524230 = claimCollateralINTERNAL(userAddressBytes, fromBase58String(txId))
686- let userAddress = $t02404524230._1
687- let lpAssetAmount = $t02404524230._2
688- let targetPeriod = $t02404524230._3
689- let wavesAmount = $t02404524230._4
690- let assetsString = $t02404524230._5
691- let amountsString = $t02404524230._6
685+ let $t02405624241 = claimCollateralINTERNAL(userAddressBytes, fromBase58String(txId))
686+ let userAddress = $t02405624241._1
687+ let lpAssetAmount = $t02405624241._2
688+ let targetPeriod = $t02405624241._3
689+ let wavesAmount = $t02405624241._4
690+ let assetsString = $t02405624241._5
691+ let amountsString = $t02405624241._6
692692 let assetsList = removeByIndex(split_51C(assetsString, SEP), 0)
693693 let amountsList = removeByIndex(split_51C(amountsString, SEP), 0)
694694 let factoryActions = [invoke(factoryAddressOrFail, "deleteEntry", [keyWithdrawalRequest(userAddress, fromBase58String(txId))], nil), invoke(factoryAddressOrFail, "integerEntry", [keyWithdrawalHistory(userAddress, fromBase58String(txId)), lpAssetAmount], nil), invoke(factoryAddressOrFail, "transferAssets", [userAddressBytes, assetsList, amountsList], nil)]
705705 if ((checkCaller == checkCaller))
706706 then {
707707 func addNewAction (state,txId) = {
708- let $t02498625185 = claimCollateralINTERNAL(userAddressBytes, fromBase58String(txId))
709- let userAddress = $t02498625185._1
710- let lpAssetAmount = $t02498625185._2
711- let targetPeriod = $t02498625185._3
712- let wavesAmount = $t02498625185._4
713- let assetsString = $t02498625185._5
714- let amountsString = $t02498625185._6
708+ let $t02499725196 = claimCollateralINTERNAL(userAddressBytes, fromBase58String(txId))
709+ let userAddress = $t02499725196._1
710+ let lpAssetAmount = $t02499725196._2
711+ let targetPeriod = $t02499725196._3
712+ let wavesAmount = $t02499725196._4
713+ let assetsString = $t02499725196._5
714+ let amountsString = $t02499725196._6
715715 let assetsList = removeByIndex(split_51C(assetsString, SEP), 0)
716716 let amountsList = removeByIndex(split_51C(amountsString, SEP), 0)
717717 let newActions = [invoke(factoryAddressOrFail, "deleteEntry", [keyWithdrawalRequest(userAddress, fromBase58String(txId))], nil), invoke(factoryAddressOrFail, "integerEntry", [keyWithdrawalHistory(userAddress, fromBase58String(txId)), lpAssetAmount], nil), invoke(factoryAddressOrFail, "transferAssets", [userAddressBytes, assetsList, amountsList], nil)]
808808 let callerReward = if ((inc == (blocksProcessingBatchSize - 1)))
809809 then (blockProcessingRewardByGenerator + blockProcessingRewardByGeneratorRemainder)
810810 else blockProcessingRewardByGenerator
811- let $t02908529193 = getRewardSplit(treasuryRewardOrFail)
812- let shareAmountToPower = $t02908529193._1
813- let businessTreasuryAmountPart = $t02908529193._2
814- let rewardRemainder = $t02908529193._3
811+ let $t02909629204 = getRewardSplit(treasuryRewardOrFail)
812+ let shareAmountToPower = $t02909629204._1
813+ let businessTreasuryAmountPart = $t02909629204._2
814+ let rewardRemainder = $t02909629204._3
815815 let lpAssetAmount = if ((currentPriceOrFail > 0))
816816 then fraction((rewardRemainder - callerReward), SCALE8, currentPriceOrFail)
817817 else 0
818818 let factoryActionsSingle = [invoke(factoryAddressOrFail, "stringEntry", [keyBlockProcessed(targetBlockHeight), makeString([toBase58String(i.transactionId), toString(currentPeriodOrFail), toString(generator), toBase58String(userAddressBytes), toString(treasuryRewardOrFail), toString(callerReward), toString(lpAssetAmount), toString(shareAmountToPower)], SEP)], nil), invoke(factoryAddressOrFail, "integerEntry", [keyAvailable(generator), (available + lpAssetAmount)], nil)]
819819 if ((factoryActionsSingle == factoryActionsSingle))
820820 then {
821- let $t03004130116 = acc
822- let lpAssetAcc = $t03004130116._1
823- let rewardAcc = $t03004130116._2
824- let businessTreasuryAcc = $t03004130116._3
825- let powerShareDataTuple = $t03004130116._4
826- let $t03012330189 = powerShareDataTuple
827- let powerShareAcc = $t03012330189._1
828- let generatorPowerShareList = $t03012330189._2
821+ let $t03005230127 = acc
822+ let lpAssetAcc = $t03005230127._1
823+ let rewardAcc = $t03005230127._2
824+ let businessTreasuryAcc = $t03005230127._3
825+ let powerShareDataTuple = $t03005230127._4
826+ let $t03013430200 = powerShareDataTuple
827+ let powerShareAcc = $t03013430200._1
828+ let generatorPowerShareList = $t03013430200._2
829829 let newGeneratorPowerShareList = (generatorPowerShareList :+ $Tuple2(toString(generator), shareAmountToPower))
830830 $Tuple4((lpAssetAcc + lpAssetAmount), (rewardAcc + treasuryRewardOrFail), (businessTreasuryAcc + businessTreasuryAmountPart), $Tuple2((powerShareAcc + shareAmountToPower), newGeneratorPowerShareList))
831831 }
833833 }
834834
835835 let list = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
836- let $t03063730799 = {
836+ let $t03064830810 = {
837837 let $l = list
838838 let $s = size($l)
839839 let $acc0 = $Tuple4(0, 0, 0, $Tuple2(0, nil))
847847
848848 $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($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
849849 }
850- if (($t03063730799 == $t03063730799))
850+ if (($t03064830810 == $t03064830810))
851851 then {
852- let powerShareDataTuple = $t03063730799._4
853- let rewardToBusinessTreasuryAmount = $t03063730799._3
854- let rewardAmountTotal = $t03063730799._2
855- let lpAssetAmountTotal = $t03063730799._1
856- let $t03080330872 = powerShareDataTuple
857- let amountToPowerTotal = $t03080330872._1
858- let powerShareAmountsList = $t03080330872._2
852+ let powerShareDataTuple = $t03064830810._4
853+ let rewardToBusinessTreasuryAmount = $t03064830810._3
854+ let rewardAmountTotal = $t03064830810._2
855+ let lpAssetAmountTotal = $t03064830810._1
856+ let $t03081430883 = powerShareDataTuple
857+ let amountToPowerTotal = $t03081430883._1
858+ let powerShareAmountsList = $t03081430883._2
859859 let rewardToMainTreasuryAmount = (((rewardAmountTotal - rewardToBusinessTreasuryAmount) - blockProcessingReward) - amountToPowerTotal)
860860 let invested = valueOrElse(getInteger(factoryAddressOrFail, keyInvested(unit)), 0)
861861 let powerShareActions = if ((amountToPowerTotal > 0))
873873 0
874874 }
875875 func stakePowerInvoke (acc,next) = {
876- let $t03174631781 = next
877- let generator = $t03174631781._1
878- let shareAmount = $t03174631781._2
876+ let $t03175731792 = next
877+ let generator = $t03175731792._1
878+ let shareAmount = $t03175731792._2
879879 if ((amountToPowerTotal > 0))
880880 then {
881881 let powerAmount = fraction(shareAmount, totalPowerAmountInt, amountToPowerTotal)
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 7 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let SEP = "__"
55
66 let CONTRACT_NAME = "calculator.ride"
77
88 let SCALE8 = 100000000
99
1010 let PENDING = "PENDING"
1111
1212 let WAVES = "WAVES"
1313
1414 let blocksProcessingBatchSizeMax = 10
1515
1616 func wrapErr (s) = ((CONTRACT_NAME + ": ") + s)
1717
1818
1919 func throwErr (s) = throw(wrapErr(s))
2020
2121
2222 func assetIdToString (assetId) = match assetId {
2323 case b: ByteVector =>
2424 toBase58String(b)
2525 case _: Unit =>
2626 WAVES
2727 case _ =>
2828 throw("Match error")
2929 }
3030
3131
3232 func stringToAssetId (s) = if ((s == WAVES))
3333 then unit
3434 else fromBase58String(s)
3535
3636
3737 func abs (n) = if ((0 > n))
3838 then -(n)
3939 else n
4040
4141
4242 func keyFactoryAddress () = makeString(["%s", "factory"], SEP)
4343
4444
4545 func keyManagerPublicKey () = makeString(["%s", "managerPublicKey"], SEP)
4646
4747
4848 func keyLpAssetId () = makeString(["%s", "lpAssetId"], SEP)
4949
5050
5151 func keyProxyTreasuryAddress () = makeString(["%s", "proxyTreasury"], SEP)
5252
5353
5454 func keyMainTreasuryAddress () = makeString(["%s", "mainTreasury"], SEP)
5555
5656
5757 func keyBusinessTreasuryAddress () = makeString(["%s", "businessTreasury"], SEP)
5858
5959
6060 func keyTrustedFinalizeAddressList () = makeString(["%s", "trustedAddressList"], SEP)
6161
6262
6363 func keyBusinessTreasuryPart () = makeString(["%s", "businessTreasuryPart"], SEP)
6464
6565
6666 func keyPowerContractAddress () = makeString(["%s", "powerContract"], SEP)
6767
6868
6969 func keyPowerShareRatio () = makeString(["%s", "powerShareRatio"], SEP)
7070
7171
7272 func keyPowerAssetId () = makeString(["%s", "powerAssetId"], SEP)
7373
7474
7575 func keyL2mpAssetId () = makeString(["%s", "l2mpAssetId"], SEP)
7676
7777
7878 func keyL2mpProxyAddress () = makeString(["%s", "l2mpProxy"], SEP)
7979
8080
8181 func keyInvested (assetId) = makeString(["%s%s", "invested", assetIdToString(assetId)], SEP)
8282
8383
8484 func keyDonated (assetId) = makeString(["%s%s", "donated", assetIdToString(assetId)], SEP)
8585
8686
8787 func keyAvailable (userAddress) = makeString(["%s%s", "available", toString(userAddress)], SEP)
8888
8989
9090 func keyClaimed (userAddress) = makeString(["%s%s", "claimed", toString(userAddress)], SEP)
9191
9292
9393 func keyCurrentPeriod () = makeString(["%s", "currentPeriod"], SEP)
9494
9595
9696 func keyPriceForPeriod (period) = makeString(["%s%d", "price", toString(period)], SEP)
9797
9898
9999 func keyStartHeight (period) = makeString(["%s%d", "startHeight", toString(period)], SEP)
100100
101101
102102 func keyPowerManagerBonus (period) = makeString(["%s%d", "powerManagerBonus", toString(period)], SEP)
103103
104104
105105 func keyClaimWavesAmount (period) = makeString(["%s%d", "claimWavesAmount", toString(period)], SEP)
106106
107107
108108 func keyPeriodLength () = "%s__periodLength"
109109
110110
111111 func keyInvestPeriodLength () = "%s__investPeriodLength"
112112
113113
114114 func keyBlockProcessingReward () = "%s__blockProcessingReward"
115115
116116
117117 func keyNextBlockToProcess () = "%s__nextBlockToProcess"
118118
119119
120120 func keyBlockProcessed (height) = makeString(["%s%d", "blockProcessed", toString(height)], SEP)
121121
122122
123123 func keyWithdrawal () = "%s__withdrawal"
124124
125125
126126 func keyWithdrawalPeriod (period) = makeString(["%s%d", "withdrawalPeriod", toString(period)], SEP)
127127
128128
129129 func keyWithdrawalRequest (userAddress,txId) = makeString(["%s%s%s", "withdrawal", toString(userAddress), toBase58String(txId)], SEP)
130130
131131
132132 func valueWithdrawalRequest (status,lpAssetAmount,targetPeriod,claimTxId) = {
133133 let claimTxIdStr = match claimTxId {
134134 case b: ByteVector =>
135135 toBase58String(b)
136136 case _: Unit =>
137137 "SOON"
138138 case _ =>
139139 throw("Match error")
140140 }
141141 makeString(["%s%d%d%s", status, toString(lpAssetAmount), toString(targetPeriod), claimTxIdStr], SEP)
142142 }
143143
144144
145145 func keyWithdrawalHistory (userAddress,txId) = makeString(["%s%s%s", "withdrawalHistory", toString(userAddress), toBase58String(txId)], SEP)
146146
147147
148148 func keyPeriodWithdrawalAssetIds (period) = makeString(["%s%d", "periodReward", toString(period)], SEP)
149149
150150
151151 func keyPeriodWithdrawalAmounts (period) = makeString(["%s%d", "periodRewardAmount", toString(period)], SEP)
152152
153153
154154 func parseWithdrawalRequestValueOrFail (s) = {
155155 let parts = split(s, SEP)
156156 if ((size(parts) == 5))
157157 then {
158158 let status = parts[1]
159159 let lpAssetAmount = valueOrErrorMessage(parseInt(parts[2]), wrapErr("invalid lpAssetAmount"))
160160 let targetPeriod = valueOrErrorMessage(parseInt(parts[3]), wrapErr("invalid targetPeriod"))
161161 let claimTxId = parts[4]
162162 $Tuple4(status, lpAssetAmount, targetPeriod, claimTxId)
163163 }
164164 else throwErr("invalid withdrawal request value")
165165 }
166166
167167
168168 let factoryAddressOption = match getString(this, keyFactoryAddress()) {
169169 case s: String =>
170170 addressFromString(s)
171171 case _: Unit =>
172172 unit
173173 case _ =>
174174 throw("Match error")
175175 }
176176
177177 let factoryAddressOrFail = valueOrErrorMessage(factoryAddressOption, wrapErr("invalid factory address"))
178178
179179 let lpAssetIdOption = match factoryAddressOption {
180180 case a: Address =>
181181 match getString(a, keyLpAssetId()) {
182182 case s: String =>
183183 fromBase58String(s)
184184 case _: Unit =>
185185 unit
186186 case _ =>
187187 throw("Match error")
188188 }
189189 case _: Unit =>
190190 unit
191191 case _ =>
192192 throw("Match error")
193193 }
194194
195195 let lpAssetIdOrFail = valueOrErrorMessage(lpAssetIdOption, wrapErr("invalid lpAssetId"))
196196
197197 let proxyTreasuryAddressOption = match factoryAddressOption {
198198 case a: Address =>
199199 match getString(a, keyProxyTreasuryAddress()) {
200200 case s: String =>
201201 addressFromString(s)
202202 case _: Unit =>
203203 unit
204204 case _ =>
205205 throw("Match error")
206206 }
207207 case _: Unit =>
208208 unit
209209 case _ =>
210210 throw("Match error")
211211 }
212212
213213 let proxyTreasuryAddressOrFail = valueOrErrorMessage(proxyTreasuryAddressOption, wrapErr("invalid proxy treasury address"))
214214
215215 let mainTreasuryAddressOption = match factoryAddressOption {
216216 case a: Address =>
217217 match getString(a, keyMainTreasuryAddress()) {
218218 case s: String =>
219219 addressFromString(s)
220220 case _: Unit =>
221221 unit
222222 case _ =>
223223 throw("Match error")
224224 }
225225 case _: Unit =>
226226 unit
227227 case _ =>
228228 throw("Match error")
229229 }
230230
231231 let businessTreasuryAddressOption = match factoryAddressOption {
232232 case a: Address =>
233233 match getString(a, keyBusinessTreasuryAddress()) {
234234 case s: String =>
235235 addressFromString(s)
236236 case _: Unit =>
237237 unit
238238 case _ =>
239239 throw("Match error")
240240 }
241241 case _: Unit =>
242242 unit
243243 case _ =>
244244 throw("Match error")
245245 }
246246
247247 let mainTreasuryAddressOrFail = valueOrErrorMessage(mainTreasuryAddressOption, wrapErr("invalid main treasury address"))
248248
249249 let businessTreasuryAddressOrFail = valueOrErrorMessage(businessTreasuryAddressOption, wrapErr("invalid business treasury address"))
250250
251251 let powerContractAddressOption = match factoryAddressOption {
252252 case a: Address =>
253253 match getString(a, keyPowerContractAddress()) {
254254 case s: String =>
255255 addressFromString(s)
256256 case _: Unit =>
257257 unit
258258 case _ =>
259259 throw("Match error")
260260 }
261261 case _: Unit =>
262262 unit
263263 case _ =>
264264 throw("Match error")
265265 }
266266
267267 let powerContractAddressOrFail = valueOrErrorMessage(powerContractAddressOption, wrapErr("invalid power contract address"))
268268
269269 let powerAssetIdStringOrFail = valueOrErrorMessage(getString(factoryAddressOrFail, keyPowerAssetId()), wrapErr("power asset id not found"))
270270
271271 let l2mpProxyAddressOption = match factoryAddressOption {
272272 case a: Address =>
273273 match getString(a, keyL2mpProxyAddress()) {
274274 case s: String =>
275275 addressFromString(s)
276276 case _: Unit =>
277277 unit
278278 case _ =>
279279 throw("Match error")
280280 }
281281 case _: Unit =>
282282 unit
283283 case _ =>
284284 throw("Match error")
285285 }
286286
287287 let l2mpProxyAddressOrFail = valueOrErrorMessage(l2mpProxyAddressOption, wrapErr("invalid l2mp proxy address"))
288288
289289 let l2mpAssetIdStringOrFail = valueOrErrorMessage(getString(factoryAddressOrFail, keyL2mpAssetId()), wrapErr("l2mp asset id not found"))
290290
291291 func getManagerPublicKeyOrUnit () = match factoryAddressOption {
292292 case fa: Address =>
293293 match getString(fa, keyManagerPublicKey()) {
294294 case pub: String =>
295295 fromBase58String(pub)
296296 case _ =>
297297 unit
298298 }
299299 case _ =>
300300 unit
301301 }
302302
303303
304304 func onlyAddress (i,address) = if ((i.caller == address))
305305 then true
306306 else throwErr("permission denied")
307307
308308
309309 func onlyFactory (i) = onlyAddress(i, factoryAddressOrFail)
310310
311311
312312 func isTrustedAddress (i) = {
313313 let listString = valueOrElse(getString(factoryAddressOrFail, keyTrustedFinalizeAddressList()), "")
314314 let addressList = split(listString, SEP)
315315 containsElement(addressList, toString(i.originCaller))
316316 }
317317
318318
319319 func rewardForOption (rewards,target) = {
320320 let s = size(rewards)
321321 let $t077007725 = rewards[0]
322322 let a0 = $t077007725._1
323323 let r0 = $t077007725._2
324324 let $t077287753 = rewards[1]
325325 let a1 = $t077287753._1
326326 let r1 = $t077287753._2
327327 let $t077567781 = rewards[2]
328328 let a2 = $t077567781._1
329329 let r2 = $t077567781._2
330330 if (if ((s > 0))
331331 then (a0 == target)
332332 else false)
333333 then r0
334334 else if (if ((s > 1))
335335 then (a1 == target)
336336 else false)
337337 then r1
338338 else if (if ((s > 2))
339339 then (a2 == target)
340340 else false)
341341 then r2
342342 else unit
343343 }
344344
345345
346346 func calculatePrice (lpPartInWaves) = {
347347 let lpAssetAmountToBurn = valueOrElse(getInteger(factoryAddressOrFail, keyWithdrawal()), 0)
348348 let lpAssetQuantity = valueOrErrorMessage(assetInfo(lpAssetIdOrFail), wrapErr("invalid lpAsset info")).quantity
349349 let newPrice = fraction(lpPartInWaves, SCALE8, (lpAssetQuantity - lpAssetAmountToBurn))
350350 let checkIfPriceNotZero = if ((newPrice != 0))
351351 then true
352352 else throwErr("LP price cannot be 0")
353353 if ((checkIfPriceNotZero == checkIfPriceNotZero))
354354 then {
355355 let lpAssetFinalQuantity = (lpAssetQuantity - lpAssetAmountToBurn)
356356 $Tuple3(newPrice, lpAssetAmountToBurn, lpAssetFinalQuantity)
357357 }
358358 else throw("Strict value is not equal to itself.")
359359 }
360360
361361
362362 func claimCollateralINTERNAL (userAddressBytes,txId) = {
363363 let userAddress = Address(userAddressBytes)
364364 let currentPeriodOrFail = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyCurrentPeriod()), wrapErr("invalid period"))
365365 let withdrawalRequestOption = valueOrErrorMessage(getString(factoryAddressOrFail, keyWithdrawalRequest(userAddress, txId)), wrapErr("invalid withdrawal request"))
366366 let $t089489061 = parseWithdrawalRequestValueOrFail(withdrawalRequestOption)
367367 let status = $t089489061._1
368368 let lpAssetAmount = $t089489061._2
369369 let unlockPeriod = $t089489061._3
370370 let claimTxId = $t089489061._4
371371 if ((unlockPeriod > currentPeriodOrFail))
372372 then throwErr("invalid withdrawal request period")
373373 else {
374374 let priceOrFail = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyPriceForPeriod(unlockPeriod)), wrapErr("invalid price"))
375375 let wavesAmount = if ((priceOrFail > 0))
376376 then fraction(lpAssetAmount, priceOrFail, SCALE8)
377377 else 0
378378 let targetPeriod = (unlockPeriod - 1)
379379 let assetsString = getStringValue(factoryAddressOrFail, keyPeriodWithdrawalAssetIds(targetPeriod))
380380 let amountsString = getStringValue(factoryAddressOrFail, keyPeriodWithdrawalAmounts(targetPeriod))
381381 let totalLpAmountInPeriod = valueOrElse(getInteger(factoryAddressOrFail, keyWithdrawalPeriod(targetPeriod)), 0)
382382 let userPartSCALE8 = if ((totalLpAmountInPeriod == 0))
383383 then 0
384384 else fraction(lpAssetAmount, SCALE8, totalLpAmountInPeriod)
385385 func getUserPartAmounts (currentState,amount) = {
386386 let userPartAmount = fraction(parseIntValue(amount), userPartSCALE8, SCALE8)
387387 (currentState :+ toString(userPartAmount))
388388 }
389389
390390 let amountsList = split_51C(amountsString, SEP)
391391 let amountsPrefix = value(amountsList[0])
392392 let amountsListWithoutPrefix = removeByIndex(split_51C(amountsString, SEP), 0)
393393 let userPartAmounts = {
394394 let $l = amountsListWithoutPrefix
395395 let $s = size($l)
396396 let $acc0 = nil
397397 func $f0_1 ($a,$i) = if (($i >= $s))
398398 then $a
399399 else getUserPartAmounts($a, $l[$i])
400400
401401 func $f0_2 ($a,$i) = if (($i >= $s))
402402 then $a
403403 else throw("List size exceeds 10")
404404
405405 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
406406 }
407407 let userPartAmountsString = makeString([amountsPrefix, makeString(userPartAmounts, SEP)], SEP)
408408 $Tuple6(userAddress, lpAssetAmount, targetPeriod, wavesAmount, assetsString, userPartAmountsString)
409409 }
410410 }
411411
412412
413413 func claimCollateralREADONLYStringResponse (userAddressBytes,txId) = {
414414 let $t01075010916 = claimCollateralINTERNAL(userAddressBytes, txId)
415415 let userAddress = $t01075010916._1
416416 let lpAssetAmount = $t01075010916._2
417417 let targetPeriod = $t01075010916._3
418418 let wavesAmount = $t01075010916._4
419419 let assetsString = $t01075010916._5
420420 let amountsString = $t01075010916._6
421421 let assets = makeString(removeByIndex(split_51C(assetsString, SEP), 0), ":")
422422 let amounts = makeString(removeByIndex(split_51C(amountsString, SEP), 0), ":")
423423 makeString(["%d%s%s", toString(wavesAmount), assets, amounts], SEP)
424424 }
425425
426426
427427 func getRewardSplit (generatorRewardAmount) = {
428428 let powerShareRatio = max([0, min([valueOrElse(getInteger(factoryAddressOrFail, keyPowerShareRatio()), 0), SCALE8])])
429429 let businessPartRatio = max([0, min([valueOrElse(getInteger(factoryAddressOrFail, keyBusinessTreasuryPart()), 0), SCALE8])])
430430 let amountToPowerPart = fraction(generatorRewardAmount, powerShareRatio, SCALE8)
431431 let businessTreasuryAmountPart = fraction(generatorRewardAmount, businessPartRatio, SCALE8)
432432 let rewardRemainder = ((generatorRewardAmount - amountToPowerPart) - businessTreasuryAmountPart)
433433 if ((rewardRemainder > 0))
434434 then $Tuple3(amountToPowerPart, businessTreasuryAmountPart, rewardRemainder)
435435 else throwErr("amount to main treasury cannot be negative")
436436 }
437437
438438
439439 func calcRewardSplitForAmount (amount) = {
440440 let $t01201512108 = getRewardSplit(amount)
441441 let amountToPowerPart = $t01201512108._1
442442 let businessTreasuryAmountPart = $t01201512108._2
443443 let rewardRemainder = $t01201512108._3
444444 let blockProcessingReward = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyBlockProcessingReward()), wrapErr("invalid block processing reward"))
445445 let blockProcessingRewardByGenerator = (blockProcessingReward / blocksProcessingBatchSizeMax)
446446 let toLpAmount = (rewardRemainder - blockProcessingReward)
447447 $Tuple5(amountToPowerPart, businessTreasuryAmountPart, blockProcessingReward, toLpAmount, amount)
448448 }
449449
450450
451451 @Callable(i)
452452 func rewardSplitREADONLY () = {
453453 let targetBlockHeight = (height - 1)
454454 let targetBlockInfo = valueOrErrorMessage(blockInfoByHeight(targetBlockHeight), wrapErr("invalid block info"))
455455 let treasuryRewardOrFail = valueOrErrorMessage(rewardForOption(targetBlockInfo.rewards, proxyTreasuryAddressOrFail), wrapErr(("invalid treasury reward for height " + toString(targetBlockHeight))))
456456 $Tuple2(nil, calcRewardSplitForAmount(treasuryRewardOrFail))
457457 }
458458
459459
460460
461461 @Callable(i)
462462 func claimLP (userAddressBytes) = {
463463 let checkCaller = onlyFactory(i)
464464 if ((checkCaller == checkCaller))
465465 then {
466466 let userAddress = Address(userAddressBytes)
467467 let available = valueOrElse(getInteger(factoryAddressOrFail, keyAvailable(userAddress)), 0)
468468 let claimed = valueOrElse(getInteger(factoryAddressOrFail, keyClaimed(userAddress)), 0)
469469 let factoryActions = if ((available > 0))
470470 then [invoke(factoryAddressOrFail, "transferAsset", [userAddressBytes, available, lpAssetIdOrFail], nil), invoke(factoryAddressOrFail, "integerEntry", [keyAvailable(userAddress), 0], nil), invoke(factoryAddressOrFail, "integerEntry", [keyClaimed(userAddress), (claimed + available)], nil)]
471471 else throwErr("nothing to claim")
472472 $Tuple2(nil, factoryActions)
473473 }
474474 else throw("Strict value is not equal to itself.")
475475 }
476476
477477
478478
479479 @Callable(i)
480480 func finalize (userAddressBytes,donationPartInWaves,lpPartInWaves,claimPartInWaves,powerStakePartInWaves) = {
481481 let checkCaller = onlyFactory(i)
482482 if ((checkCaller == checkCaller))
483483 then {
484484 let currentPeriodOrFail = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyCurrentPeriod()), wrapErr("invalid period"))
485485 let periodLength = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyPeriodLength()), wrapErr("invalid period length"))
486486 let currentStartHeight = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyStartHeight(currentPeriodOrFail)), wrapErr("invalid start height"))
487487 let currentPriceOrFail = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyPriceForPeriod(currentPeriodOrFail)), wrapErr("invalid price"))
488488 let nextBlockToProcess = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyNextBlockToProcess()), wrapErr("invalid next block to process"))
489489 let periodEndHeight = ((currentStartHeight + periodLength) - 1)
490490 let checks = [if (if (isTrustedAddress(i))
491491 then true
492492 else (i.originCaller == mainTreasuryAddressOrFail))
493493 then true
494- else throwErr("permission denied"), if ((nextBlockToProcess > periodEndHeight))
494+ else throwErr("permission denied (finalize)"), if ((nextBlockToProcess > periodEndHeight))
495495 then true
496496 else throwErr("unprocessed blocks"), if ((donationPartInWaves >= 0))
497497 then true
498498 else throwErr("invalid donation part"), if ((lpPartInWaves >= 0))
499499 then true
500500 else throwErr("invalid lp part"), if ((claimPartInWaves >= 0))
501501 then true
502502 else throwErr("invalid claim part"), if ((powerStakePartInWaves >= 0))
503503 then true
504504 else throwErr("invalid PWR stake part")]
505505 if ((checks == checks))
506506 then {
507- let $t01547015575 = calculatePrice(lpPartInWaves)
508- let newPrice = $t01547015575._1
509- let lpAssetAmountToBurn = $t01547015575._2
510- let lpAssetFinalQuantity = $t01547015575._3
507+ let $t01548115586 = calculatePrice(lpPartInWaves)
508+ let newPrice = $t01548115586._1
509+ let lpAssetAmountToBurn = $t01548115586._2
510+ let lpAssetFinalQuantity = $t01548115586._3
511511 let newPeriod = (currentPeriodOrFail + 1)
512512 func addNewAction (actions,payment) = {
513- let $t01572315785 = actions
514- let scriptTransfers = $t01572315785._1
515- let assetIdsString = $t01572315785._2
516- let amountsString = $t01572315785._3
513+ let $t01573415796 = actions
514+ let scriptTransfers = $t01573415796._1
515+ let assetIdsString = $t01573415796._2
516+ let amountsString = $t01573415796._3
517517 let paymentAmount = payment.amount
518518 let paymentAssetId = payment.assetId
519519 if ((assetIdToString(paymentAssetId) == l2mpAssetIdStringOrFail))
520520 then {
521521 let transferToL2mpProxy = ScriptTransfer(l2mpProxyAddressOrFail, paymentAmount, paymentAssetId)
522522 $Tuple3((scriptTransfers :+ transferToL2mpProxy), assetIdsString, amountsString)
523523 }
524524 else {
525525 let newAssetIdsString = ("%s" + makeString([assetIdsString, assetIdToString(paymentAssetId)], SEP))
526526 let newAmountsString = ("%d" + makeString([amountsString, toString(paymentAmount)], SEP))
527527 let newScriptTransfer = ScriptTransfer(factoryAddressOrFail, paymentAmount, paymentAssetId)
528528 $Tuple3((scriptTransfers :+ newScriptTransfer), newAssetIdsString, newAmountsString)
529529 }
530530 }
531531
532- let $t01657916670 = {
532+ let $t01659016681 = {
533533 let $l = i.payments
534534 let $s = size($l)
535535 let $acc0 = $Tuple3(nil, "", "")
536536 func $f0_1 ($a,$i) = if (($i >= $s))
537537 then $a
538538 else addNewAction($a, $l[$i])
539539
540540 func $f0_2 ($a,$i) = if (($i >= $s))
541541 then $a
542542 else throw("List size exceeds 10")
543543
544544 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
545545 }
546- let scriptTransfers = $t01657916670._1
547- let AssetIds = $t01657916670._2
548- let Amounts = $t01657916670._3
546+ let scriptTransfers = $t01659016681._1
547+ let AssetIds = $t01659016681._2
548+ let Amounts = $t01659016681._3
549549 let factoryActions = [invoke(factoryAddressOrFail, "integerEntry", [keyPowerManagerBonus(currentPeriodOrFail), powerStakePartInWaves], nil), invoke(factoryAddressOrFail, "integerEntry", [keyClaimWavesAmount(currentPeriodOrFail), claimPartInWaves], nil), invoke(factoryAddressOrFail, "integerEntry", [keyCurrentPeriod(), newPeriod], nil), invoke(factoryAddressOrFail, "integerEntry", [keyPriceForPeriod(newPeriod), newPrice], nil), invoke(factoryAddressOrFail, "integerEntry", [keyStartHeight(newPeriod), (periodEndHeight + 1)], nil), invoke(factoryAddressOrFail, "burn", [lpAssetAmountToBurn], nil), invoke(factoryAddressOrFail, "integerEntry", [keyWithdrawal(), 0], nil), invoke(factoryAddressOrFail, "integerEntry", [keyWithdrawalPeriod(currentPeriodOrFail), lpAssetAmountToBurn], nil), invoke(factoryAddressOrFail, "integerEntry", [keyInvested(unit), lpPartInWaves], nil), invoke(factoryAddressOrFail, "integerEntry", [keyDonated(unit), donationPartInWaves], nil), invoke(factoryAddressOrFail, "stringEntry", [keyPeriodWithdrawalAssetIds(currentPeriodOrFail), AssetIds], nil), invoke(factoryAddressOrFail, "stringEntry", [keyPeriodWithdrawalAmounts(currentPeriodOrFail), Amounts], nil)]
550550 $Tuple2(scriptTransfers, factoryActions)
551551 }
552552 else throw("Strict value is not equal to itself.")
553553 }
554554 else throw("Strict value is not equal to itself.")
555555 }
556556
557557
558558
559559 @Callable(i)
560560 func finalizeREADONLY (donationPartInWaves,lpPartInWaves,claimPartInWaves,powerStakePartInWaves) = {
561561 let currentPeriodOrFail = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyCurrentPeriod()), wrapErr("invalid period"))
562562 let periodLength = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyPeriodLength()), wrapErr("invalid period length"))
563563 let currentStartHeight = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyStartHeight(currentPeriodOrFail)), wrapErr("invalid start height"))
564564 let currentPriceOrFail = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyPriceForPeriod(currentPeriodOrFail)), wrapErr("invalid price"))
565565 let nextBlockToProcess = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyNextBlockToProcess()), wrapErr("invalid next block to process"))
566566 let periodEndHeight = ((currentStartHeight + periodLength) - 1)
567567 let checks = [if ((nextBlockToProcess > periodEndHeight))
568568 then true
569569 else throwErr("unprocessed blocks"), if ((donationPartInWaves >= 0))
570570 then true
571571 else throwErr("invalid donation part"), if ((lpPartInWaves >= 0))
572572 then true
573573 else throwErr("invalid lp part"), if ((claimPartInWaves >= 0))
574574 then true
575575 else throwErr("invalid claim part"), if ((powerStakePartInWaves >= 0))
576576 then true
577577 else throwErr("invalid PWR stake part")]
578578 if ((checks == checks))
579579 then {
580- let $t01968719792 = calculatePrice(lpPartInWaves)
581- let newPrice = $t01968719792._1
582- let lpAssetAmountToBurn = $t01968719792._2
583- let lpAssetFinalQuantity = $t01968719792._3
580+ let $t01969819803 = calculatePrice(lpPartInWaves)
581+ let newPrice = $t01969819803._1
582+ let lpAssetAmountToBurn = $t01969819803._2
583+ let lpAssetFinalQuantity = $t01969819803._3
584584 $Tuple2(nil, $Tuple6(claimPartInWaves, lpPartInWaves, donationPartInWaves, newPrice, lpAssetAmountToBurn, lpAssetFinalQuantity))
585585 }
586586 else throw("Strict value is not equal to itself.")
587587 }
588588
589589
590590
591591 @Callable(i)
592592 func invest (userAddressBytes) = {
593593 let checkCaller = onlyFactory(i)
594594 if ((checkCaller == checkCaller))
595595 then {
596596 let userAddress = Address(userAddressBytes)
597597 let currentPeriodOrFail = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyCurrentPeriod()), wrapErr("invalid period"))
598598 let currentStartHeight = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyStartHeight(currentPeriodOrFail)), wrapErr("invalid start height"))
599599 let investPeriodLength = getIntegerValue(factoryAddressOrFail, keyInvestPeriodLength())
600600 let heightCheck = if (((currentStartHeight + investPeriodLength) > height))
601601 then true
602602 else throwErr("too late to invest in this period")
603603 if ((heightCheck == heightCheck))
604604 then {
605605 let currentPriceOrFail = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyPriceForPeriod(currentPeriodOrFail)), wrapErr("invalid price"))
606606 let payment = if ((size(i.payments) == 1))
607607 then i.payments[0]
608608 else throwErr("invalid payments")
609- let $t02090121078 = if (if ((payment.assetId == unit))
609+ let $t02091221089 = if (if ((payment.assetId == unit))
610610 then (payment.amount > 0)
611611 else false)
612612 then $Tuple2(payment.amount, payment.assetId)
613613 else throwErr("invalid payment amount")
614- let paymentAmount = $t02090121078._1
615- let paymentAssetId = $t02090121078._2
614+ let paymentAmount = $t02091221089._1
615+ let paymentAssetId = $t02091221089._2
616616 let treasuryPart = valueOrElse(getInteger(factoryAddressOrFail, keyBusinessTreasuryPart()), 0)
617617 let paymentsWithoutTreasuryPart = fraction(paymentAmount, (SCALE8 - treasuryPart), SCALE8)
618618 let lpAssetAmount = if ((currentPriceOrFail > 0))
619619 then fraction(paymentsWithoutTreasuryPart, SCALE8, currentPriceOrFail)
620620 else 0
621621 let invested = valueOrElse(getInteger(factoryAddressOrFail, keyInvested(unit)), 0)
622622 let actions = [ScriptTransfer(mainTreasuryAddressOrFail, paymentsWithoutTreasuryPart, paymentAssetId), ScriptTransfer(businessTreasuryAddressOrFail, treasuryPart, paymentAssetId)]
623623 let factoryActions = [invoke(factoryAddressOrFail, "integerEntry", [keyInvested(unit), (invested + paymentsWithoutTreasuryPart)], nil), invoke(factoryAddressOrFail, "reissue", [lpAssetAmount], nil), invoke(factoryAddressOrFail, "transferAsset", [userAddressBytes, lpAssetAmount, lpAssetIdOrFail], nil)]
624624 $Tuple2(actions, factoryActions)
625625 }
626626 else throw("Strict value is not equal to itself.")
627627 }
628628 else throw("Strict value is not equal to itself.")
629629 }
630630
631631
632632
633633 @Callable(i)
634634 func withdraw (userAddressBytes) = {
635635 let checkCaller = onlyFactory(i)
636636 if ((checkCaller == checkCaller))
637637 then {
638638 let userAddress = Address(userAddressBytes)
639639 let currentPeriodOrFail = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyCurrentPeriod()), wrapErr("invalid period"))
640640 let periodLength = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyPeriodLength()), wrapErr("invalid period length"))
641641 let currentStartHeight = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyStartHeight(currentPeriodOrFail)), wrapErr("invalid start height"))
642642 let heightCheck = if (((currentStartHeight + periodLength) > height))
643643 then true
644644 else throwErr("too late to withdraw in this period")
645645 if ((heightCheck == heightCheck))
646646 then {
647647 let payment = if ((size(i.payments) == 1))
648648 then i.payments[0]
649649 else throwErr(wrapErr("invalid payments"))
650650 let paymentAssetId = if ((payment.assetId == lpAssetIdOrFail))
651651 then lpAssetIdOrFail
652652 else throwErr("invalid payment asset")
653653 let paymentAmount = if ((payment.amount > 0))
654654 then payment.amount
655655 else throwErr("invalid payment amount")
656656 let withdrawal = valueOrElse(getInteger(factoryAddressOrFail, keyWithdrawal()), 0)
657657 let actions = [ScriptTransfer(factoryAddressOrFail, paymentAmount, paymentAssetId)]
658658 let factoryActions = [invoke(factoryAddressOrFail, "integerEntry", [keyWithdrawal(), (withdrawal + paymentAmount)], nil), invoke(factoryAddressOrFail, "stringEntry", [keyWithdrawalRequest(userAddress, i.transactionId), valueWithdrawalRequest(PENDING, paymentAmount, (currentPeriodOrFail + 1), unit)], nil)]
659659 if ((factoryActions == factoryActions))
660660 then $Tuple2(actions, factoryActions)
661661 else throw("Strict value is not equal to itself.")
662662 }
663663 else throw("Strict value is not equal to itself.")
664664 }
665665 else throw("Strict value is not equal to itself.")
666666 }
667667
668668
669669
670670 @Callable(i)
671671 func cancelWithdraw (userAddressBytes,txId) = {
672672 let checkCaller = onlyFactory(i)
673673 if ((checkCaller == checkCaller))
674674 then throwErr("cancelWithdraw is deprecated")
675675 else throw("Strict value is not equal to itself.")
676676 }
677677
678678
679679
680680 @Callable(i)
681681 func claimCollateral (userAddressBytes,txId) = {
682682 let checkCaller = onlyFactory(i)
683683 if ((checkCaller == checkCaller))
684684 then {
685- let $t02404524230 = claimCollateralINTERNAL(userAddressBytes, fromBase58String(txId))
686- let userAddress = $t02404524230._1
687- let lpAssetAmount = $t02404524230._2
688- let targetPeriod = $t02404524230._3
689- let wavesAmount = $t02404524230._4
690- let assetsString = $t02404524230._5
691- let amountsString = $t02404524230._6
685+ let $t02405624241 = claimCollateralINTERNAL(userAddressBytes, fromBase58String(txId))
686+ let userAddress = $t02405624241._1
687+ let lpAssetAmount = $t02405624241._2
688+ let targetPeriod = $t02405624241._3
689+ let wavesAmount = $t02405624241._4
690+ let assetsString = $t02405624241._5
691+ let amountsString = $t02405624241._6
692692 let assetsList = removeByIndex(split_51C(assetsString, SEP), 0)
693693 let amountsList = removeByIndex(split_51C(amountsString, SEP), 0)
694694 let factoryActions = [invoke(factoryAddressOrFail, "deleteEntry", [keyWithdrawalRequest(userAddress, fromBase58String(txId))], nil), invoke(factoryAddressOrFail, "integerEntry", [keyWithdrawalHistory(userAddress, fromBase58String(txId)), lpAssetAmount], nil), invoke(factoryAddressOrFail, "transferAssets", [userAddressBytes, assetsList, amountsList], nil)]
695695 $Tuple2(nil, factoryActions)
696696 }
697697 else throw("Strict value is not equal to itself.")
698698 }
699699
700700
701701
702702 @Callable(i)
703703 func claimCollateralBulk (userAddressBytes,txIds) = {
704704 let checkCaller = onlyFactory(i)
705705 if ((checkCaller == checkCaller))
706706 then {
707707 func addNewAction (state,txId) = {
708- let $t02498625185 = claimCollateralINTERNAL(userAddressBytes, fromBase58String(txId))
709- let userAddress = $t02498625185._1
710- let lpAssetAmount = $t02498625185._2
711- let targetPeriod = $t02498625185._3
712- let wavesAmount = $t02498625185._4
713- let assetsString = $t02498625185._5
714- let amountsString = $t02498625185._6
708+ let $t02499725196 = claimCollateralINTERNAL(userAddressBytes, fromBase58String(txId))
709+ let userAddress = $t02499725196._1
710+ let lpAssetAmount = $t02499725196._2
711+ let targetPeriod = $t02499725196._3
712+ let wavesAmount = $t02499725196._4
713+ let assetsString = $t02499725196._5
714+ let amountsString = $t02499725196._6
715715 let assetsList = removeByIndex(split_51C(assetsString, SEP), 0)
716716 let amountsList = removeByIndex(split_51C(amountsString, SEP), 0)
717717 let newActions = [invoke(factoryAddressOrFail, "deleteEntry", [keyWithdrawalRequest(userAddress, fromBase58String(txId))], nil), invoke(factoryAddressOrFail, "integerEntry", [keyWithdrawalHistory(userAddress, fromBase58String(txId)), lpAssetAmount], nil), invoke(factoryAddressOrFail, "transferAssets", [userAddressBytes, assetsList, amountsList], nil)]
718718 (state ++ newActions)
719719 }
720720
721721 let allFactoryActions = {
722722 let $l = txIds
723723 let $s = size($l)
724724 let $acc0 = nil
725725 func $f0_1 ($a,$i) = if (($i >= $s))
726726 then $a
727727 else addNewAction($a, $l[$i])
728728
729729 func $f0_2 ($a,$i) = if (($i >= $s))
730730 then $a
731731 else throw("List size exceeds 10")
732732
733733 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
734734 }
735735 $Tuple2(nil, allFactoryActions)
736736 }
737737 else throw("Strict value is not equal to itself.")
738738 }
739739
740740
741741
742742 @Callable(i)
743743 func claimCollateralREADONLY (userAddressBytes,txId) = {
744744 let response = claimCollateralREADONLYStringResponse(userAddressBytes, fromBase58String(txId))
745745 $Tuple2(nil, response)
746746 }
747747
748748
749749
750750 @Callable(i)
751751 func claimCollateralBulkREADONLY (userAddressBytes,txIds) = {
752752 func processTxId (state,txId) = {
753753 let response = claimCollateralREADONLYStringResponse(userAddressBytes, fromBase58String(txId))
754754 (state :+ response)
755755 }
756756
757757 let allResponses = {
758758 let $l = txIds
759759 let $s = size($l)
760760 let $acc0 = nil
761761 func $f0_1 ($a,$i) = if (($i >= $s))
762762 then $a
763763 else processTxId($a, $l[$i])
764764
765765 func $f0_2 ($a,$i) = if (($i >= $s))
766766 then $a
767767 else throw("List size exceeds 10")
768768
769769 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
770770 }
771771 $Tuple2(nil, allResponses)
772772 }
773773
774774
775775
776776 @Callable(i)
777777 func processBlocks (userAddressBytes) = {
778778 let checkCaller = onlyFactory(i)
779779 if ((checkCaller == checkCaller))
780780 then {
781781 let userAddress = Address(userAddressBytes)
782782 let currentPeriodOrFail = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyCurrentPeriod()), wrapErr("invalid period"))
783783 let periodLength = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyPeriodLength()), wrapErr("invalid period length"))
784784 let currentStartHeight = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyStartHeight(currentPeriodOrFail)), wrapErr("invalid start height"))
785785 let currentPriceOrFail = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyPriceForPeriod(currentPeriodOrFail)), wrapErr("invalid price"))
786786 let nextBlockToProcess = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyNextBlockToProcess()), wrapErr("invalid next block to process"))
787787 let periodEndHeight = ((currentStartHeight + periodLength) - 1)
788788 let blocksProcessingBatchSize = if (if (if ((height >= nextBlockToProcess))
789789 then if ((nextBlockToProcess >= currentStartHeight))
790790 then true
791791 else (currentPeriodOrFail == 0)
792792 else false)
793793 then (periodEndHeight >= nextBlockToProcess)
794794 else false)
795795 then min([((periodEndHeight - nextBlockToProcess) + 1), blocksProcessingBatchSizeMax])
796796 else throwErr(wrapErr("invalid target block"))
797797 let blockProcessingReward = valueOrErrorMessage(getInteger(factoryAddressOrFail, keyBlockProcessingReward()), wrapErr("invalid block processing reward"))
798798 let blockProcessingRewardByGenerator = (blockProcessingReward / blocksProcessingBatchSize)
799799 let blockProcessingRewardByGeneratorRemainder = (blockProcessingReward - (blockProcessingRewardByGenerator * blocksProcessingBatchSize))
800800 func map (acc,inc) = if ((inc >= blocksProcessingBatchSize))
801801 then acc
802802 else {
803803 let targetBlockHeight = (nextBlockToProcess + inc)
804804 let targetBlockInfo = valueOrErrorMessage(blockInfoByHeight(targetBlockHeight), wrapErr("invalid block info"))
805805 let treasuryRewardOrFail = valueOrErrorMessage(rewardForOption(targetBlockInfo.rewards, proxyTreasuryAddressOrFail), wrapErr(("invalid treasury reward for height " + toString(targetBlockHeight))))
806806 let generator = targetBlockInfo.generator
807807 let available = valueOrElse(getInteger(factoryAddressOrFail, keyAvailable(generator)), 0)
808808 let callerReward = if ((inc == (blocksProcessingBatchSize - 1)))
809809 then (blockProcessingRewardByGenerator + blockProcessingRewardByGeneratorRemainder)
810810 else blockProcessingRewardByGenerator
811- let $t02908529193 = getRewardSplit(treasuryRewardOrFail)
812- let shareAmountToPower = $t02908529193._1
813- let businessTreasuryAmountPart = $t02908529193._2
814- let rewardRemainder = $t02908529193._3
811+ let $t02909629204 = getRewardSplit(treasuryRewardOrFail)
812+ let shareAmountToPower = $t02909629204._1
813+ let businessTreasuryAmountPart = $t02909629204._2
814+ let rewardRemainder = $t02909629204._3
815815 let lpAssetAmount = if ((currentPriceOrFail > 0))
816816 then fraction((rewardRemainder - callerReward), SCALE8, currentPriceOrFail)
817817 else 0
818818 let factoryActionsSingle = [invoke(factoryAddressOrFail, "stringEntry", [keyBlockProcessed(targetBlockHeight), makeString([toBase58String(i.transactionId), toString(currentPeriodOrFail), toString(generator), toBase58String(userAddressBytes), toString(treasuryRewardOrFail), toString(callerReward), toString(lpAssetAmount), toString(shareAmountToPower)], SEP)], nil), invoke(factoryAddressOrFail, "integerEntry", [keyAvailable(generator), (available + lpAssetAmount)], nil)]
819819 if ((factoryActionsSingle == factoryActionsSingle))
820820 then {
821- let $t03004130116 = acc
822- let lpAssetAcc = $t03004130116._1
823- let rewardAcc = $t03004130116._2
824- let businessTreasuryAcc = $t03004130116._3
825- let powerShareDataTuple = $t03004130116._4
826- let $t03012330189 = powerShareDataTuple
827- let powerShareAcc = $t03012330189._1
828- let generatorPowerShareList = $t03012330189._2
821+ let $t03005230127 = acc
822+ let lpAssetAcc = $t03005230127._1
823+ let rewardAcc = $t03005230127._2
824+ let businessTreasuryAcc = $t03005230127._3
825+ let powerShareDataTuple = $t03005230127._4
826+ let $t03013430200 = powerShareDataTuple
827+ let powerShareAcc = $t03013430200._1
828+ let generatorPowerShareList = $t03013430200._2
829829 let newGeneratorPowerShareList = (generatorPowerShareList :+ $Tuple2(toString(generator), shareAmountToPower))
830830 $Tuple4((lpAssetAcc + lpAssetAmount), (rewardAcc + treasuryRewardOrFail), (businessTreasuryAcc + businessTreasuryAmountPart), $Tuple2((powerShareAcc + shareAmountToPower), newGeneratorPowerShareList))
831831 }
832832 else throw("Strict value is not equal to itself.")
833833 }
834834
835835 let list = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
836- let $t03063730799 = {
836+ let $t03064830810 = {
837837 let $l = list
838838 let $s = size($l)
839839 let $acc0 = $Tuple4(0, 0, 0, $Tuple2(0, nil))
840840 func $f0_1 ($a,$i) = if (($i >= $s))
841841 then $a
842842 else map($a, $l[$i])
843843
844844 func $f0_2 ($a,$i) = if (($i >= $s))
845845 then $a
846846 else throw("List size exceeds 20")
847847
848848 $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($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
849849 }
850- if (($t03063730799 == $t03063730799))
850+ if (($t03064830810 == $t03064830810))
851851 then {
852- let powerShareDataTuple = $t03063730799._4
853- let rewardToBusinessTreasuryAmount = $t03063730799._3
854- let rewardAmountTotal = $t03063730799._2
855- let lpAssetAmountTotal = $t03063730799._1
856- let $t03080330872 = powerShareDataTuple
857- let amountToPowerTotal = $t03080330872._1
858- let powerShareAmountsList = $t03080330872._2
852+ let powerShareDataTuple = $t03064830810._4
853+ let rewardToBusinessTreasuryAmount = $t03064830810._3
854+ let rewardAmountTotal = $t03064830810._2
855+ let lpAssetAmountTotal = $t03064830810._1
856+ let $t03081430883 = powerShareDataTuple
857+ let amountToPowerTotal = $t03081430883._1
858+ let powerShareAmountsList = $t03081430883._2
859859 let rewardToMainTreasuryAmount = (((rewardAmountTotal - rewardToBusinessTreasuryAmount) - blockProcessingReward) - amountToPowerTotal)
860860 let invested = valueOrElse(getInteger(factoryAddressOrFail, keyInvested(unit)), 0)
861861 let powerShareActions = if ((amountToPowerTotal > 0))
862862 then {
863863 let transferAction = [invoke(factoryAddressOrFail, "transferFromProxyTreasury", [factoryAddressOrFail.bytes, amountToPowerTotal], nil)]
864864 if ((transferAction == transferAction))
865865 then {
866866 let totalPowerAmount = invoke(factoryAddressOrFail, "swap", [powerAssetIdStringOrFail, WAVES, amountToPowerTotal], nil)
867867 if ((totalPowerAmount == totalPowerAmount))
868868 then {
869869 let totalPowerAmountInt = match totalPowerAmount {
870870 case pAmount: Int =>
871871 pAmount
872872 case _ =>
873873 0
874874 }
875875 func stakePowerInvoke (acc,next) = {
876- let $t03174631781 = next
877- let generator = $t03174631781._1
878- let shareAmount = $t03174631781._2
876+ let $t03175731792 = next
877+ let generator = $t03175731792._1
878+ let shareAmount = $t03175731792._2
879879 if ((amountToPowerTotal > 0))
880880 then {
881881 let powerAmount = fraction(shareAmount, totalPowerAmountInt, amountToPowerTotal)
882882 let inv = invoke(factoryAddressOrFail, "powerStake", [fromBase58String(generator), fromBase58String(powerAssetIdStringOrFail), powerAmount], nil)
883883 if ((inv == inv))
884884 then nil
885885 else throw("Strict value is not equal to itself.")
886886 }
887887 else nil
888888 }
889889
890890 let powerStakesActions = {
891891 let $l = powerShareAmountsList
892892 let $s = size($l)
893893 let $acc0 = 0
894894 func $f1_1 ($a,$i) = if (($i >= $s))
895895 then $a
896896 else stakePowerInvoke($a, $l[$i])
897897
898898 func $f1_2 ($a,$i) = if (($i >= $s))
899899 then $a
900900 else throw("List size exceeds 20")
901901
902902 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
903903 }
904904 if ((powerStakesActions == powerStakesActions))
905905 then nil
906906 else throw("Strict value is not equal to itself.")
907907 }
908908 else throw("Strict value is not equal to itself.")
909909 }
910910 else throw("Strict value is not equal to itself.")
911911 }
912912 else nil
913913 if ((powerShareActions == powerShareActions))
914914 then {
915915 let actions = [invoke(factoryAddressOrFail, "reissue", [lpAssetAmountTotal], nil), invoke(factoryAddressOrFail, "integerEntry", [keyNextBlockToProcess(), (nextBlockToProcess + blocksProcessingBatchSize)], nil), invoke(factoryAddressOrFail, "transferFromProxyTreasury", [mainTreasuryAddressOrFail.bytes, rewardToMainTreasuryAmount], nil), invoke(factoryAddressOrFail, "transferFromProxyTreasury", [userAddressBytes, blockProcessingReward], nil), invoke(factoryAddressOrFail, "transferFromProxyTreasury", [businessTreasuryAddressOrFail.bytes, rewardToBusinessTreasuryAmount], nil), invoke(factoryAddressOrFail, "integerEntry", [keyInvested(unit), (invested + rewardToMainTreasuryAmount)], nil)]
916916 if ((actions == actions))
917917 then $Tuple2(nil, unit)
918918 else throw("Strict value is not equal to itself.")
919919 }
920920 else throw("Strict value is not equal to itself.")
921921 }
922922 else throw("Strict value is not equal to itself.")
923923 }
924924 else throw("Strict value is not equal to itself.")
925925 }
926926
927927
928928 @Verifier(tx)
929929 func verify () = {
930930 let publicKey = match getManagerPublicKeyOrUnit() {
931931 case pub: ByteVector =>
932932 pub
933933 case _ =>
934934 tx.senderPublicKey
935935 }
936936 sigVerify(tx.bodyBytes, tx.proofs[0], publicKey)
937937 }
938938

github/deemru/w8io/169f3d6 
270.27 ms