tx · 5K7YBBJB538Ra3ayki3hxRNj6FnXkw4KpTTNBM4Y1uWh

3MptKi7f3jwXjzqhHpvLLzsSpEQdZiwAo5c:  -0.04000000 Waves

2024.01.15 15:58 [2932668] smart account 3MptKi7f3jwXjzqhHpvLLzsSpEQdZiwAo5c > SELF 0.00000000 Waves

{ "type": 13, "id": "5K7YBBJB538Ra3ayki3hxRNj6FnXkw4KpTTNBM4Y1uWh", "fee": 4000000, "feeAssetId": null, "timestamp": 1705323531411, "version": 2, "chainId": 84, "sender": "3MptKi7f3jwXjzqhHpvLLzsSpEQdZiwAo5c", "senderPublicKey": "44kjsoExo76qSrM51NMhbG8FtdLkcPtyJxEDrwDyT8kz", "proofs": [ "5M1o5p7PcoRtoDpJJupULYUM6VsA65YMkiBgxUB6LpjUGTqYe368pkv9eztXVbWY4UWexiRX2DPWUSTrLE8qksPe" ], "script": "base64:BgIrCAISCQoHAQEBAQEIARIAEgQKAggIEgMKAQgSAwoBCBIECgIICBIECgIICEYBD2dldFN0cmluZ09yRmFpbAEDa2V5CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKIIAQUDa2V5CQCsAgIJAKwCAgIPbWFuZGF0b3J5IHRoaXMuBQNrZXkCDyBpcyBub3QgZGVmaW5lZAADU0VQAgJfXwAIQlVGU0NBTEUJALYCAQCAgJC7utat8A0ABnNjYWxlOACAwtcvAQh0aHJvd0VycgEDbXNnCQACAQkAuQkCCQDMCAICCWlkby5yaWRlOgkAzAgCBQNtc2cFA25pbAIBIAEIYXNTdHJpbmcBA3ZhbAQHJG1hdGNoMAUDdmFsAwkAAQIFByRtYXRjaDACBlN0cmluZwQGdmFsU3RyBQckbWF0Y2gwBQZ2YWxTdHIJAAIBAhhmYWlsIHRvIGNhc3QgaW50byBTdHJpbmcBHWNvbnZlcnRQcmljZUFzc2V0SW50b0lkb0Fzc2V0BRBwcmljZUFzc2V0QW1vdW50DnByaWNlQXNzZXRNVUxUBXByaWNlCXByaWNlTVVMVAxpZG9Bc3NldE1VTFQED2JQcmljZUFzc2V0TVVMVAkAtgIBBQ5wcmljZUFzc2V0TVVMVAQNYklkb0Fzc2V0TVVMVAkAtgIBBQxpZG9Bc3NldE1VTFQEDmJQcmljZUFzc2V0QlVGCQC8AgMJALYCAQUQcHJpY2VBc3NldEFtb3VudAUIQlVGU0NBTEUFD2JQcmljZUFzc2V0TVVMVAQPYkFtb3VudEFzc2V0QlVGCQC8AgMFDmJQcmljZUFzc2V0QlVGCQC2AgEFCXByaWNlTVVMVAkAtgIBBQVwcmljZQkAoAMBCQC8AgMFD2JBbW91bnRBc3NldEJVRgkAtgIBBQxpZG9Bc3NldE1VTFQFCEJVRlNDQUxFAA5JZHhDZmdJZG9TdGFydAABABFJZHhDZmdJZG9EdXJhdGlvbgACABBJZHhDZmdDbGFpbVN0YXJ0AAMAE0lkeENmZ0NsYWltRHVyYXRpb24ABAALSWR4Q2ZnUHJpY2UABQAPSWR4Q2ZnUHJpY2VNdWx0AAYAEElkeENmZ0lkb0Fzc2V0SWQABwASSWR4Q2ZnSWRvQXNzZXRNdWx0AAgAEklkeENmZ1ByaWNlQXNzZXRJZAAJABRJZHhDZmdQcmljZUFzc2V0TXVsdAAKABVJZHhDZmdNaW5JbnZlc3RBbW91bnQACwENZnJvbWF0Q29uZmlnUwwIaWRvU3RhcnQLaWRvRHVyYXRpb24KY2xhaW1TdGFydA1jbGFpbUR1cmF0aW9uBXByaWNlCXByaWNlTXVsdAxpZG9Bc3NldElkNTgMaWRvQXNzZXRNdWx0DnByaWNlQXNzZXRJZDU4DnByaWNlQXNzZXRNdWx0D21pbkludmVzdEFtb3VudBN0b3RhbElkb0Fzc2V0VG9TZWxsCQC5CQIJAMwIAgIYJWQlZCVkJWQlZCVkJXMlZCVzJWQlZCVkCQDMCAIFCGlkb1N0YXJ0CQDMCAIFC2lkb0R1cmF0aW9uCQDMCAIFCmNsYWltU3RhcnQJAMwIAgUNY2xhaW1EdXJhdGlvbgkAzAgCBQVwcmljZQkAzAgCBQlwcmljZU11bHQJAMwIAgUMaWRvQXNzZXRJZDU4CQDMCAIFDGlkb0Fzc2V0TXVsdAkAzAgCBQ5wcmljZUFzc2V0SWQ1OAkAzAgCBQ5wcmljZUFzc2V0TXVsdAkAzAgCBQ9taW5JbnZlc3RBbW91bnQJAMwIAgUTdG90YWxJZG9Bc3NldFRvU2VsbAUDbmlsBQNTRVABDGZyb21hdENvbmZpZwwIaWRvU3RhcnQLaWRvRHVyYXRpb24KY2xhaW1TdGFydA1jbGFpbUR1cmF0aW9uBXByaWNlCXByaWNlTXVsdAxpZG9Bc3NldElkNTgMaWRvQXNzZXRNdWx0DnByaWNlQXNzZXRJZDU4DnByaWNlQXNzZXRNdWx0D21pbkludmVzdEFtb3VudBN0b3RhbElkb0Fzc2V0VG9TZWxsCQENZnJvbWF0Q29uZmlnUwwJAKQDAQUIaWRvU3RhcnQJAKQDAQULaWRvRHVyYXRpb24JAKQDAQUKY2xhaW1TdGFydAkApAMBBQ1jbGFpbUR1cmF0aW9uCQCkAwEFBXByaWNlCQCkAwEFCXByaWNlTXVsdAUMaWRvQXNzZXRJZDU4CQCkAwEFDGlkb0Fzc2V0TXVsdAUOcHJpY2VBc3NldElkNTgJAKQDAQUOcHJpY2VBc3NldE11bHQJAKQDAQUPbWluSW52ZXN0QW1vdW50CQCkAwEFE3RvdGFsSWRvQXNzZXRUb1NlbGwAEUlkeEludlRvdGFsQW1vdW50AAEAFUlkeEludlJlbWFpbmluZ0Ftb3VudAACAB1JZHhJbnZDbGFpbWVkUHJpY2VBc3NldEFtb3VudAADABtJZHhJbnZDbGFpbWVkSWRvQXNzZXRBbW91bnQABAAXSWR4SW52TGFzdENsYWltZWRIZWlnaHQABQEPZm9ybWF0SW52ZXN0b3JTBQt0b3RhbEFtb3VudA9yZW1haW5pbmdBbW91bnQXY2xhaW1lZFByaWNlQXNzZXRBbW91bnQVY2xhaW1lZElkb0Fzc2V0QW1vdW50EWxhc3RDbGFpbWVkSGVpZ2h0CQC5CQIJAMwIAgIKJWQlZCVkJWQlZAkAzAgCBQt0b3RhbEFtb3VudAkAzAgCBQ9yZW1haW5pbmdBbW91bnQJAMwIAgUXY2xhaW1lZFByaWNlQXNzZXRBbW91bnQJAMwIAgUVY2xhaW1lZElkb0Fzc2V0QW1vdW50CQDMCAIFEWxhc3RDbGFpbWVkSGVpZ2h0BQNuaWwFA1NFUAEOZm9ybWF0SW52ZXN0b3IFC3RvdGFsQW1vdW50D3JlbWFpbmluZ0Ftb3VudBdjbGFpbWVkUHJpY2VBc3NldEFtb3VudBVjbGFpbWVkSWRvQXNzZXRBbW91bnQRbGFzdENsYWltZWRIZWlnaHQJAQ9mb3JtYXRJbnZlc3RvclMFCQCkAwEFC3RvdGFsQW1vdW50CQCkAwEFD3JlbWFpbmluZ0Ftb3VudAkApAMBBRdjbGFpbWVkUHJpY2VBc3NldEFtb3VudAkApAMBBRVjbGFpbWVkSWRvQXNzZXRBbW91bnQJAKQDAQURbGFzdENsYWltZWRIZWlnaHQBE2Zvcm1hdEhpc3RvcnlSZWNvcmQCEHByaWNlQXNzZXRBbW91bnQOaWRvQXNzZXRBbW91bnQJALkJAgkAzAgCAgglZCVkJWQlZAkAzAgCCQCkAwEFBmhlaWdodAkAzAgCCQCkAwEIBQlsYXN0QmxvY2sJdGltZXN0YW1wCQDMCAIJAKQDAQUQcHJpY2VBc3NldEFtb3VudAkAzAgCCQCkAwEFDmlkb0Fzc2V0QW1vdW50BQNuaWwFA1NFUAEJa2V5Q29uZmlnAAIKJXNfX2NvbmZpZwELa2V5SW52ZXN0b3IBC3VzZXJBZGRyZXNzCQCsAgICBCVzX18FC3VzZXJBZGRyZXNzAQlrZXlUb3RhbHMAAgolc19fdG90YWxzARlrZXlPcGVyYXRpb25IaXN0b3J5UmVjb3JkAwR0eXBlC3VzZXJBZGRyZXNzBnR4SWQ1OAkAuQkCCQDMCAICESVzJXMlcyVzX19oaXN0b3J5CQDMCAIFBHR5cGUJAMwIAgULdXNlckFkZHJlc3MJAMwIAgUGdHhJZDU4BQNuaWwFA1NFUAEUa2V5VVNETkNsYWltRGlzYWJsZWQAAhUlc19fdXNkbkNsYWltRGlzYWJsZWQBFWtleVVTRE5DbGFpbUVuZEhlaWdodAACFiVzX191c2RuQ2xhaW1FbmRIZWlnaHQBD2tleVBlcmlvZExlbmd0aAAJALkJAgkAzAgCAgIlcwkAzAgCAgxwZXJpb2RMZW5ndGgFA25pbAUDU0VQARBrZXlDdXJyZW50UGVyaW9kAAkAuQkCCQDMCAICAiVzCQDMCAICDWN1cnJlbnRQZXJpb2QFA25pbAUDU0VQARRrZXlQZXJpb2RTdGFydEhlaWdodAEJcGVyaW9kTnVtCQC5CQIJAMwIAgIEJXMlcwkAzAgCAhFwZXJpb2RTdGFydEhlaWdodAkAzAgCCQCkAwEFCXBlcmlvZE51bQUDbmlsBQNTRVABEmtleVBlcmlvZEVuZEhlaWdodAEJcGVyaW9kTnVtCQC5CQIJAMwIAgIEJXMlcwkAzAgCAg9wZXJpb2RFbmRIZWlnaHQJAMwIAgkApAMBBQlwZXJpb2ROdW0FA25pbAUDU0VQAR9rZXlVc2R0UHJpY2VBc3NldEFsbG93YWJsZVJhdGlvAAkAuQkCCQDMCAICAiVzCQDMCAICHHVzZHRQcmljZUFzc2V0QWxsb3dhYmxlUmF0aW8FA25pbAUDU0VQARdrZXlUb3RhbFBlcmlvZEFsbG93YW5jZQEHYXNzZXRJZAkAuQkCCQDMCAICBCVzJXMJAMwIAgIUdG90YWxQZXJpb2RBbGxvd2FuY2UJAMwIAgUHYXNzZXRJZAUDbmlsBQNTRVABFmtleVVzZXJQZXJpb2RBbGxvd2FuY2UBB2Fzc2V0SWQJALkJAgkAzAgCAgQlcyVzCQDMCAICE3VzZXJQZXJpb2RBbGxvd2FuY2UJAMwIAgUHYXNzZXRJZAUDbmlsBQNTRVABHmtleVBlcmlvZFRvdGFsQXZhaWxhYmxlVG9DbGFpbQIHYXNzZXRJZAlwZXJpb2ROdW0JALkJAgkAzAgCAgYlcyVzJXMJAMwIAgIbcGVyaW9kVG90YWxBdmFpbGFibGVUb0NsYWltCQDMCAIFB2Fzc2V0SWQJAMwIAgkApAMBBQlwZXJpb2ROdW0FA25pbAUDU0VQAR1rZXlQZXJpb2RVc2VyQXZhaWxhYmxlVG9DbGFpbQMHYXNzZXRJZAlwZXJpb2ROdW0LdXNlckFkZHJlc3MJALkJAgkAzAgCAgglcyVzJXMlcwkAzAgCAhpwZXJpb2RVc2VyQXZhaWxhYmxlVG9DbGFpbQkAzAgCBQdhc3NldElkCQDMCAIJAKQDAQUJcGVyaW9kTnVtCQDMCAIFC3VzZXJBZGRyZXNzBQNuaWwFA1NFUAEba2V5VXNkdFByaWNlQXNzZXRTdGFibGVQb29sAAkAuQkCCQDMCAICAiVzCQDMCAICGHVzZHRQcmljZUFzc2V0U3RhYmxlUG9vbAUDbmlsBQNTRVABDmtleVVzZHRBc3NldElkAAkAuQkCCQDMCAICAiVzCQDMCAICC3VzZHRBc3NldElkBQNuaWwFA1NFUAEUa2V5UHJpY2VBc3NldEJhbGFuY2UBB2FkZHJlc3MJALkJAgkAzAgCAgQlcyVzCQDMCAICEXByaWNlQXNzZXRCYWxhbmNlCQDMCAIFB2FkZHJlc3MFA25pbAUDU0VQARprZXlJbnZlc3RvclJlbWFpbmluZ0Ftb3VudAEHYWRkcmVzcwkAuQkCCQDMCAICBCVzJXMJAMwIAgIXaW52ZXN0b3JSZW1haW5pbmdBbW91bnQJAMwIAgUHYWRkcmVzcwUDbmlsBQNTRVABF2tleVRvdGFsUmVtYWluaW5nQW1vdW50AAkAuQkCCQDMCAICAiVzCQDMCAICFHRvdGFsUmVtYWluaW5nQW1vdW50BQNuaWwFA1NFUAETa2V5TWFuYWdlclB1YmxpY0tleQACFCVzX19tYW5hZ2VyUHVibGljS2V5ARZrZXlNYW5hZ2VyVmF1bHRBZGRyZXNzAAIXJXNfX21hbmFnZXJWYXVsdEFkZHJlc3MBFWtleUNsYWltQ2xvc2luZ0hlaWdodAACFiVzX19jbGFpbUNsb3NpbmdIZWlnaHQAEmNsYWltQ2xvc2luZ0hlaWdodAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEVa2V5Q2xhaW1DbG9zaW5nSGVpZ2h0AAAAAQ9yZWFkQ29uZmlnQXJyYXkACQC1CQIJAQ9nZXRTdHJpbmdPckZhaWwBCQEJa2V5Q29uZmlnAAUDU0VQASNyZWFkVG90YWxzQXJyYXlPckRlZmF1bHRCeUN1c3RvbUtleQEJY3VzdG9tS2V5CQC1CQIJAQt2YWx1ZU9yRWxzZQIJAKIIAQUJY3VzdG9tS2V5CQEPZm9ybWF0SW52ZXN0b3JTBQIBMAIBMAIBMAIBMAIBMAUDU0VQARhyZWFkVG90YWxzQXJyYXlPckRlZmF1bHQACQEjcmVhZFRvdGFsc0FycmF5T3JEZWZhdWx0QnlDdXN0b21LZXkBCQEJa2V5VG90YWxzAAEacmVhZEludmVzdG9yQXJyYXlPckRlZmF1bHQBC3VzZXJBZGRyZXNzCQEjcmVhZFRvdGFsc0FycmF5T3JEZWZhdWx0QnlDdXN0b21LZXkBCQELa2V5SW52ZXN0b3IBBQt1c2VyQWRkcmVzcwEXcmVhZEludmVzdG9yQXJyYXlPckZhaWwBC3VzZXJBZGRyZXNzCQC1CQIJAQ9nZXRTdHJpbmdPckZhaWwBCQELa2V5SW52ZXN0b3IBBQt1c2VyQWRkcmVzcwUDU0VQARxnZXRNYW5hZ2VyVmF1bHRBZGRyZXNzT3JUaGlzAAQHJG1hdGNoMAkAoggBCQEWa2V5TWFuYWdlclZhdWx0QWRkcmVzcwADCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFzBQckbWF0Y2gwCQERQGV4dHJOYXRpdmUoMTA2MikBBQFzBQR0aGlzABVJZHhEaWZmVG90YWxJbmNyZW1lbnQAAAAkSWR4RGlmZlJlbWFpbmluZ1ByaWNlQW1vdW50SW5jcmVtZW50AAEAIklkeERpZmZDbGFpbWVkUHJpY2VBbW91bnRJbmNyZW1lbnQAAgAlSWR4RGlmZkNsYWltZWRJZG9Bc3NldEFtb3VudEluY3JlbWVudAADAQtUb3RhbHNFbnRyeQUDa2V5CW9yaWdBcnJheQ1pbmNyZW1lbnREaWZmFG5ld0xhc3RDbGFpbWVkSGVpZ2h0EXByaWNlQXNzZXRCYWxhbmNlBAt0b3RhbEFtb3VudAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCW9yaWdBcnJheQURSWR4SW52VG90YWxBbW91bnQED3JlbWFpbmluZ0Ftb3VudAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCW9yaWdBcnJheQUVSWR4SW52UmVtYWluaW5nQW1vdW50BBdjbGFpbWVkUHJpY2VBc3NldEFtb3VudAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCW9yaWdBcnJheQUdSWR4SW52Q2xhaW1lZFByaWNlQXNzZXRBbW91bnQEFWNsYWltZWRJZG9Bc3NldEFtb3VudAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCW9yaWdBcnJheQUbSWR4SW52Q2xhaW1lZElkb0Fzc2V0QW1vdW50BBFsYXN0Q2xhaW1lZEhlaWdodAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCW9yaWdBcnJheQUXSWR4SW52TGFzdENsYWltZWRIZWlnaHQEDm5ld1RvdGFsQW1vdW50CQBkAgULdG90YWxBbW91bnQJAJEDAgUNaW5jcmVtZW50RGlmZgUVSWR4RGlmZlRvdGFsSW5jcmVtZW50BBJuZXdSZW1haW5pbmdBbW91bnQJAGQCBQ9yZW1haW5pbmdBbW91bnQJAJEDAgUNaW5jcmVtZW50RGlmZgUkSWR4RGlmZlJlbWFpbmluZ1ByaWNlQW1vdW50SW5jcmVtZW50BAhjZmdBcnJheQkBD3JlYWRDb25maWdBcnJheQAEDnByaWNlQXNzZXRJZDU4CQCRAwIFCGNmZ0FycmF5BRJJZHhDZmdQcmljZUFzc2V0SWQEEnByaWNlQXNzZXREZWNpbWFscwgJAQV2YWx1ZQEJAOwHAQkA2QQBBQ5wcmljZUFzc2V0SWQ1OAhkZWNpbWFscwQjcHJpY2VBc3NldEJhbGFuY2VQcmljZUFzc2V0RGVjaW1hbHMJAGsDBRFwcmljZUFzc2V0QmFsYW5jZQUGc2NhbGU4CQBsBgAKAAAFEnByaWNlQXNzZXREZWNpbWFscwAAAAAFBERPV04EGm5ld0NsYWltZWRQcmljZUFzc2V0QW1vdW50CQBlAgkAZAIFF2NsYWltZWRQcmljZUFzc2V0QW1vdW50CQCRAwIFDWluY3JlbWVudERpZmYFIklkeERpZmZDbGFpbWVkUHJpY2VBbW91bnRJbmNyZW1lbnQFEXByaWNlQXNzZXRCYWxhbmNlBBhuZXdDbGFpbWVkSWRvQXNzZXRBbW91bnQJAGQCCQBkAgUVY2xhaW1lZElkb0Fzc2V0QW1vdW50CQCRAwIFDWluY3JlbWVudERpZmYFJUlkeERpZmZDbGFpbWVkSWRvQXNzZXRBbW91bnRJbmNyZW1lbnQFI3ByaWNlQXNzZXRCYWxhbmNlUHJpY2VBc3NldERlY2ltYWxzBAdlbnRyaWVzAwkAZgIAAAUSbmV3UmVtYWluaW5nQW1vdW50BARkaWZmCQBlAgkAZQIFDm5ld1RvdGFsQW1vdW50BRpuZXdDbGFpbWVkUHJpY2VBc3NldEFtb3VudAUYbmV3Q2xhaW1lZElkb0Fzc2V0QW1vdW50BBduZXdMb2dpY1JlbWFpbmluZ0Ftb3VudAMJAGYCAAAFBGRpZmYAAAUEZGlmZgkBC1N0cmluZ0VudHJ5AgUDa2V5CQEOZm9ybWF0SW52ZXN0b3IFBQ5uZXdUb3RhbEFtb3VudAUXbmV3TG9naWNSZW1haW5pbmdBbW91bnQFGm5ld0NsYWltZWRQcmljZUFzc2V0QW1vdW50BRhuZXdDbGFpbWVkSWRvQXNzZXRBbW91bnQFFG5ld0xhc3RDbGFpbWVkSGVpZ2h0CQELU3RyaW5nRW50cnkCBQNrZXkJAQ5mb3JtYXRJbnZlc3RvcgUFDm5ld1RvdGFsQW1vdW50BRJuZXdSZW1haW5pbmdBbW91bnQFGm5ld0NsYWltZWRQcmljZUFzc2V0QW1vdW50BRhuZXdDbGFpbWVkSWRvQXNzZXRBbW91bnQFFG5ld0xhc3RDbGFpbWVkSGVpZ2h0BQdlbnRyaWVzARtJbnZlc3RPcGVyYXRpb25IaXN0b3J5RW50cnkEC3VzZXJBZGRyZXNzEHByaWNlQXNzZXRBbW91bnQOaWRvQXNzZXRBbW91bnQEdHhJZAkBC1N0cmluZ0VudHJ5AgkBGWtleU9wZXJhdGlvbkhpc3RvcnlSZWNvcmQDAgZpbnZlc3QFC3VzZXJBZGRyZXNzCQDYBAEFBHR4SWQJARNmb3JtYXRIaXN0b3J5UmVjb3JkAgUQcHJpY2VBc3NldEFtb3VudAUOaWRvQXNzZXRBbW91bnQBGkNsYWltT3BlcmF0aW9uSGlzdG9yeUVudHJ5BAt1c2VyQWRkcmVzcxBwcmljZUFzc2V0QW1vdW50Dmlkb0Fzc2V0QW1vdW50BHR4SWQJAQtTdHJpbmdFbnRyeQIJARlrZXlPcGVyYXRpb25IaXN0b3J5UmVjb3JkAwIFY2xhaW0FC3VzZXJBZGRyZXNzCQDYBAEFBHR4SWQJARNmb3JtYXRIaXN0b3J5UmVjb3JkAgUQcHJpY2VBc3NldEFtb3VudAUOaWRvQXNzZXRBbW91bnQBDWludGVybmFsQ2xhaW0DEGNsYWltZWRBc3NldElkNTgLdXNlckFkZHJlc3MEdHhJZAQIY2ZnQXJyYXkJAQ9yZWFkQ29uZmlnQXJyYXkABApjbGFpbVN0YXJ0CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUIY2ZnQXJyYXkFEElkeENmZ0NsYWltU3RhcnQEDWNsYWltRHVyYXRpb24JAQ1wYXJzZUludFZhbHVlAQkAkQMCBQhjZmdBcnJheQUTSWR4Q2ZnQ2xhaW1EdXJhdGlvbgQIY2xhaW1FbmQJAGQCBQpjbGFpbVN0YXJ0BQ1jbGFpbUR1cmF0aW9uBAVwcmljZQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCGNmZ0FycmF5BQtJZHhDZmdQcmljZQQJcHJpY2VNdWx0CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUIY2ZnQXJyYXkFD0lkeENmZ1ByaWNlTXVsdAQMaWRvQXNzZXRJZDU4CQCRAwIFCGNmZ0FycmF5BRBJZHhDZmdJZG9Bc3NldElkBAppZG9Bc3NldElkCQDZBAEFDGlkb0Fzc2V0SWQ1OAQMaWRvQXNzZXRNdWx0CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUIY2ZnQXJyYXkFEklkeENmZ0lkb0Fzc2V0TXVsdAQOcHJpY2VBc3NldElkNTgJAJEDAgUIY2ZnQXJyYXkFEklkeENmZ1ByaWNlQXNzZXRJZAQMcHJpY2VBc3NldElkCQDZBAEFDnByaWNlQXNzZXRJZDU4BA5wcmljZUFzc2V0TXVsdAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCGNmZ0FycmF5BRRJZHhDZmdQcmljZUFzc2V0TXVsdAQNdXNlckFkZHJlc3M1OAkApQgBBQt1c2VyQWRkcmVzcwQPb3JpZ0ludmVzdEFycmF5CQEXcmVhZEludmVzdG9yQXJyYXlPckZhaWwBBQ11c2VyQWRkcmVzczU4BBFpbnZlc3RUb3RhbEFtb3VudAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFD29yaWdJbnZlc3RBcnJheQURSWR4SW52VG90YWxBbW91bnQEGmludmVzdExhc3RDbGFpbWVkSGVpZ2h0VE1QCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUPb3JpZ0ludmVzdEFycmF5BRdJZHhJbnZMYXN0Q2xhaW1lZEhlaWdodAQXaW52ZXN0TGFzdENsYWltZWRIZWlnaHQDCQBnAgUKY2xhaW1TdGFydAUaaW52ZXN0TGFzdENsYWltZWRIZWlnaHRUTVAFCmNsYWltU3RhcnQFGmludmVzdExhc3RDbGFpbWVkSGVpZ2h0VE1QBBRuZXdDbGFpbVBlcmlvZEhlaWdodAMJAGYCBQZoZWlnaHQFCGNsYWltRW5kBQhjbGFpbUVuZAMJAGYCBQpjbGFpbVN0YXJ0BQZoZWlnaHQFCmNsYWltU3RhcnQFBmhlaWdodAQOY2xhaW1pbmdCbG9ja3MJAGUCBRRuZXdDbGFpbVBlcmlvZEhlaWdodAUXaW52ZXN0TGFzdENsYWltZWRIZWlnaHQEGGNsYWltaW5nUHJpY2VBc3NldEFtb3VudAkAawMFEWludmVzdFRvdGFsQW1vdW50BQ5jbGFpbWluZ0Jsb2NrcwUNY2xhaW1EdXJhdGlvbgQWY2xhaW1pbmdJZG9Bc3NldEFtb3VudAkBHWNvbnZlcnRQcmljZUFzc2V0SW50b0lkb0Fzc2V0BQUYY2xhaW1pbmdQcmljZUFzc2V0QW1vdW50BQ5wcmljZUFzc2V0TXVsdAUFcHJpY2UFCXByaWNlTXVsdAUMaWRvQXNzZXRNdWx0BAZpc1VTRE4JAAACBRBjbGFpbWVkQXNzZXRJZDU4BQ5wcmljZUFzc2V0SWQ1OAQTaXNVU0ROQ2xhaW1EaXNhYmxlZAkBC3ZhbHVlT3JFbHNlAgkAoAgBCQEUa2V5VVNETkNsYWltRGlzYWJsZWQABwQGY2hlY2tzCQDMCAIDCQEBIQEDBQZpc1VTRE4FE2lzVVNETkNsYWltRGlzYWJsZWQHBgkAAgECFlVTRE4gY2xhaW0gaXMgZGlzYWJsZWQFA25pbAMJAAACBQZjaGVja3MFBmNoZWNrcwMJAAACBRBjbGFpbWVkQXNzZXRJZDU4BQ5wcmljZUFzc2V0SWQ1OAkAmAoGCQDMCAIAAAkAzAgCCQEBLQEFGGNsYWltaW5nUHJpY2VBc3NldEFtb3VudAkAzAgCBRhjbGFpbWluZ1ByaWNlQXNzZXRBbW91bnQJAMwIAgAABQNuaWwFGGNsYWltaW5nUHJpY2VBc3NldEFtb3VudAUMcHJpY2VBc3NldElkBQ9vcmlnSW52ZXN0QXJyYXkFFG5ld0NsYWltUGVyaW9kSGVpZ2h0CQDMCAIFGGNsYWltaW5nUHJpY2VBc3NldEFtb3VudAkAzAgCBRZjbGFpbWluZ0lkb0Fzc2V0QW1vdW50BQNuaWwDCQAAAgUQY2xhaW1lZEFzc2V0SWQ1OAUMaWRvQXNzZXRJZDU4CQCYCgYJAMwIAgAACQDMCAIJAQEtAQUYY2xhaW1pbmdQcmljZUFzc2V0QW1vdW50CQDMCAIAAAkAzAgCBRZjbGFpbWluZ0lkb0Fzc2V0QW1vdW50BQNuaWwFFmNsYWltaW5nSWRvQXNzZXRBbW91bnQFCmlkb0Fzc2V0SWQFD29yaWdJbnZlc3RBcnJheQUUbmV3Q2xhaW1QZXJpb2RIZWlnaHQJAMwIAgUYY2xhaW1pbmdQcmljZUFzc2V0QW1vdW50CQDMCAIFFmNsYWltaW5nSWRvQXNzZXRBbW91bnQFA25pbAkAAgEJAKwCAgIVdW5zdXBwb3J0ZWQgYXNzZXRJZDogBRBjbGFpbWVkQXNzZXRJZDU4CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQ9pbnRlcm5hbENsYWltVjIEDnByaWNlQXNzZXRJZDU4DXVzZXJBZGRyZXNzNTgJb3V0QW1vdW50GXRvdGFsVXNlckF2YWlsYWJsZVRvQ2xhaW0EHnRvdGFsUGVyaW9kUHJpY2VBc3NldEFsbG93YW5jZQkBBXZhbHVlAQkAnwgBCQEXa2V5VG90YWxQZXJpb2RBbGxvd2FuY2UBBQ5wcmljZUFzc2V0SWQ1OAQddXNlclBlcmlvZFByaWNlQXNzZXRBbGxvd2FuY2UJAQV2YWx1ZQEJAJ8IAQkBFmtleVVzZXJQZXJpb2RBbGxvd2FuY2UBBQ5wcmljZUFzc2V0SWQ1OAQMcGVyaW9kTGVuZ3RoCQEFdmFsdWUBCQCfCAEJAQ9rZXlQZXJpb2RMZW5ndGgABA1jdXJyZW50UGVyaW9kCQELdmFsdWVPckVsc2UCCQCfCAEJARBrZXlDdXJyZW50UGVyaW9kAAAABBt6ZXJvUGVyaW9kRW5kSGVpZ2hJc0RlZmluZWQJAQlpc0RlZmluZWQBCQCfCAEJARJrZXlQZXJpb2RFbmRIZWlnaHQBAAAEDSR0MDEzMjc0MTUxNDQDCQBmAgUNY3VycmVudFBlcmlvZAAABBVsYXN0UGVyaW9kU3RhcnRIZWlnaHQJAQV2YWx1ZQEJAJ8IAQkBFGtleVBlcmlvZFN0YXJ0SGVpZ2h0AQUNY3VycmVudFBlcmlvZAQTbGFzdFBlcmlvZEVuZEhlaWdodAkBBXZhbHVlAQkAnwgBCQESa2V5UGVyaW9kRW5kSGVpZ2h0AQUNY3VycmVudFBlcmlvZAQNJHQwMTM1MzQxNDIzOQMJAGYCBQZoZWlnaHQFE2xhc3RQZXJpb2RFbmRIZWlnaHQEFHVwZGF0ZWRDdXJyZW50UGVyaW9kCQBkAgUNY3VycmVudFBlcmlvZAABBAtwZXJpb2RTdGFydAMJAGYCBQZoZWlnaHQJAGQCBRNsYXN0UGVyaW9kRW5kSGVpZ2h0BQxwZXJpb2RMZW5ndGgEF2Jsb2Nrc1RvTGFzdFBlcmlvZFN0YXJ0CQBqAgkAZQIFBmhlaWdodAUTbGFzdFBlcmlvZEVuZEhlaWdodAUMcGVyaW9kTGVuZ3RoAwkAAAIFF2Jsb2Nrc1RvTGFzdFBlcmlvZFN0YXJ0AAAJAGQCCQBlAgUGaGVpZ2h0BQxwZXJpb2RMZW5ndGgAAQkAZQIFBmhlaWdodAUXYmxvY2tzVG9MYXN0UGVyaW9kU3RhcnQJAGQCBRNsYXN0UGVyaW9kRW5kSGVpZ2h0AAEECXBlcmlvZEVuZAkAZQIJAGQCBQtwZXJpb2RTdGFydAUMcGVyaW9kTGVuZ3RoAAEJAJUKAwUUdXBkYXRlZEN1cnJlbnRQZXJpb2QFC3BlcmlvZFN0YXJ0BQlwZXJpb2RFbmQJAJUKAwUNY3VycmVudFBlcmlvZAUVbGFzdFBlcmlvZFN0YXJ0SGVpZ2h0BRNsYXN0UGVyaW9kRW5kSGVpZ2h0BBR1cGRhdGVkQ3VycmVudFBlcmlvZAgFDSR0MDEzNTM0MTQyMzkCXzEEC3BlcmlvZFN0YXJ0CAUNJHQwMTM1MzQxNDIzOQJfMgQJcGVyaW9kRW5kCAUNJHQwMTM1MzQxNDIzOQJfMwkAlQoDBRR1cGRhdGVkQ3VycmVudFBlcmlvZAULcGVyaW9kU3RhcnQFCXBlcmlvZEVuZAMFG3plcm9QZXJpb2RFbmRIZWlnaElzRGVmaW5lZAQVemVyb1BlcmlvZFN0YXJ0SGVpZ2h0CQEFdmFsdWUBCQCfCAEJARRrZXlQZXJpb2RTdGFydEhlaWdodAEAAAQTemVyb1BlcmlvZEVuZEhlaWdodAkBBXZhbHVlAQkAnwgBCQESa2V5UGVyaW9kRW5kSGVpZ2h0AQAABA0kdDAxNDQ5NDE0ODc2AwkAZgIFBmhlaWdodAUTemVyb1BlcmlvZEVuZEhlaWdodAQUdXBkYXRlZEN1cnJlbnRQZXJpb2QJAGQCBQ1jdXJyZW50UGVyaW9kAAEEC3BlcmlvZFN0YXJ0CQBkAgUTemVyb1BlcmlvZEVuZEhlaWdodAABBAlwZXJpb2RFbmQJAGUCCQBkAgULcGVyaW9kU3RhcnQFDHBlcmlvZExlbmd0aAABCQCVCgMFFHVwZGF0ZWRDdXJyZW50UGVyaW9kBQtwZXJpb2RTdGFydAUJcGVyaW9kRW5kCQCVCgMFDWN1cnJlbnRQZXJpb2QFFXplcm9QZXJpb2RTdGFydEhlaWdodAUTemVyb1BlcmlvZEVuZEhlaWdodAQUdXBkYXRlZEN1cnJlbnRQZXJpb2QIBQ0kdDAxNDQ5NDE0ODc2Al8xBAtwZXJpb2RTdGFydAgFDSR0MDE0NDk0MTQ4NzYCXzIECXBlcmlvZEVuZAgFDSR0MDE0NDk0MTQ4NzYCXzMJAJUKAwUUdXBkYXRlZEN1cnJlbnRQZXJpb2QFC3BlcmlvZFN0YXJ0BQlwZXJpb2RFbmQJAJUKAwUNY3VycmVudFBlcmlvZAkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEUa2V5UGVyaW9kU3RhcnRIZWlnaHQBBQ1jdXJyZW50UGVyaW9kBQZoZWlnaHQJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBEmtleVBlcmlvZEVuZEhlaWdodAEFDWN1cnJlbnRQZXJpb2QJAGUCCQBkAgUGaGVpZ2h0BQxwZXJpb2RMZW5ndGgAAQQUdXBkYXRlZEN1cnJlbnRQZXJpb2QIBQ0kdDAxMzI3NDE1MTQ0Al8xBAtwZXJpb2RTdGFydAgFDSR0MDEzMjc0MTUxNDQCXzIECXBlcmlvZEVuZAgFDSR0MDEzMjc0MTUxNDQCXzMEG3BlcmlvZFRvdGFsQXZhaWxhYmxlVG9DbGFpbQkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEea2V5UGVyaW9kVG90YWxBdmFpbGFibGVUb0NsYWltAgUOcHJpY2VBc3NldElkNTgFFHVwZGF0ZWRDdXJyZW50UGVyaW9kBR50b3RhbFBlcmlvZFByaWNlQXNzZXRBbGxvd2FuY2UEGnBlcmlvZFVzZXJBdmFpbGFibGVUb0NsYWltCQELdmFsdWVPckVsc2UCCQCfCAEJAR1rZXlQZXJpb2RVc2VyQXZhaWxhYmxlVG9DbGFpbQMFDnByaWNlQXNzZXRJZDU4BRR1cGRhdGVkQ3VycmVudFBlcmlvZAUNdXNlckFkZHJlc3M1OAUddXNlclBlcmlvZFByaWNlQXNzZXRBbGxvd2FuY2UEEXByaWNlQXNzZXRCYWxhbmNlCQELdmFsdWVPckVsc2UCCQCfCAEJARRrZXlQcmljZUFzc2V0QmFsYW5jZQEFDXVzZXJBZGRyZXNzNTgAAAQZcGVyaW9kTWluQXZhaWxhYmxlVG9DbGFpbQkAlwMBCQDMCAIJAGQCBQlvdXRBbW91bnQFEXByaWNlQXNzZXRCYWxhbmNlCQDMCAIFG3BlcmlvZFRvdGFsQXZhaWxhYmxlVG9DbGFpbQkAzAgCBRpwZXJpb2RVc2VyQXZhaWxhYmxlVG9DbGFpbQUDbmlsBBx1c2R0UHJpY2VBc3NldEFsbG93YWJsZVJhdGlvCQEFdmFsdWUBCQCfCAEJAR9rZXlVc2R0UHJpY2VBc3NldEFsbG93YWJsZVJhdGlvAAQbcHV0T25lVGtuVjJQcmljZUFzc2V0QW1vdW50BQZzY2FsZTgEDSR0MDE1ODk5MTYxNTIKAAFACQD8BwQJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQV2YWx1ZQEJAKIIAQkBG2tleVVzZHRQcmljZUFzc2V0U3RhYmxlUG9vbAACIXB1dE9uZVRrblYyV2l0aG91dFRha2VGZWVSRUFET05MWQkAzAgCBRtwdXRPbmVUa25WMlByaWNlQXNzZXRBbW91bnQJAMwIAgUOcHJpY2VBc3NldElkNTgFA25pbAUDbmlsAwkAAQIFAUACDyhJbnQsIEludCwgSW50KQUBQAkAAgEJAKwCAgkAAwEFAUACJCBjb3VsZG4ndCBiZSBjYXN0IHRvIChJbnQsIEludCwgSW50KQMJAAACBQ0kdDAxNTg5OTE2MTUyBQ0kdDAxNTg5OTE2MTUyBAVib251cwgFDSR0MDE1ODk5MTYxNTICXzMECWZlZUFtb3VudAgFDSR0MDE1ODk5MTYxNTICXzIECGxwQW1vdW50CAUNJHQwMTU4OTkxNjE1MgJfMQQLdXNkdEFzc2V0SWQJAQV2YWx1ZQEJAKIIAQkBDmtleVVzZHRBc3NldElkAAQNJHQwMTYyMTQxNjQzMgoAAUAJAPwHBAkBEUBleHRyTmF0aXZlKDEwNjIpAQkBBXZhbHVlAQkAoggBCQEba2V5VXNkdFByaWNlQXNzZXRTdGFibGVQb29sAAITZ2V0T25lVGtuVjJSRUFET05MWQkAzAgCBQt1c2R0QXNzZXRJZAkAzAgCBQhscEFtb3VudAUDbmlsBQNuaWwDCQABAgUBQAIKKEludCwgSW50KQUBQAkAAgEJAKwCAgkAAwEFAUACHyBjb3VsZG4ndCBiZSBjYXN0IHRvIChJbnQsIEludCkDCQAAAgUNJHQwMTYyMTQxNjQzMgUNJHQwMTYyMTQxNjQzMgQUZ2V0T25lVGtuVjJGZWVBbW91bnQIBQ0kdDAxNjIxNDE2NDMyAl8yBAp1c2R0QW1vdW50CAUNJHQwMTYyMTQxNjQzMgJfMQQaY3VycmVudFVzZHRQcmljZUFzc2V0UmF0aW8JAGsDBRtwdXRPbmVUa25WMlByaWNlQXNzZXRBbW91bnQFBnNjYWxlOAUKdXNkdEFtb3VudAQTZW5kUGVyaW9kQmxvY2tzTGVmdAkAZQIFCXBlcmlvZEVuZAUGaGVpZ2h0CQCcCgoFGXBlcmlvZE1pbkF2YWlsYWJsZVRvQ2xhaW0FG3BlcmlvZFRvdGFsQXZhaWxhYmxlVG9DbGFpbQUacGVyaW9kVXNlckF2YWlsYWJsZVRvQ2xhaW0FGXRvdGFsVXNlckF2YWlsYWJsZVRvQ2xhaW0FHHVzZHRQcmljZUFzc2V0QWxsb3dhYmxlUmF0aW8FGmN1cnJlbnRVc2R0UHJpY2VBc3NldFJhdGlvBRNlbmRQZXJpb2RCbG9ja3NMZWZ0BRR1cGRhdGVkQ3VycmVudFBlcmlvZAULcGVyaW9kU3RhcnQFCXBlcmlvZEVuZAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEWbWFuYWdlclB1YmxpY0tleU9yVW5pdAAEE21hbmFnZXJWYXVsdEFkZHJlc3MJARxnZXRNYW5hZ2VyVmF1bHRBZGRyZXNzT3JUaGlzAAQHJG1hdGNoMAkAnQgCBRNtYW5hZ2VyVmF1bHRBZGRyZXNzCQETa2V5TWFuYWdlclB1YmxpY0tleQADCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFzBQckbWF0Y2gwCQDZBAEFAXMDCQABAgUHJG1hdGNoMAIEVW5pdAUEdW5pdAkAAgECC01hdGNoIGVycm9yAQttdXN0TWFuYWdlcgEBaQQCcGQJAAIBAhFQZXJtaXNzaW9uIGRlbmllZAQHJG1hdGNoMAkBFm1hbmFnZXJQdWJsaWNLZXlPclVuaXQAAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAnBrBQckbWF0Y2gwAwkAAAIIBQFpD2NhbGxlclB1YmxpY0tleQUCcGsGBQJwZAMJAAECBQckbWF0Y2gwAgRVbml0AwkAAAIIBQFpBmNhbGxlcgUEdGhpcwYFAnBkCQACAQILTWF0Y2ggZXJyb3IBEGdldENsYWltRm9yU3RhdGUCDXVzZXJBZGRyZXNzNTgEdHhJZAQMaWRvQXNzZXRJZDU4CQCRAwIJAQ9yZWFkQ29uZmlnQXJyYXkABRBJZHhDZmdJZG9Bc3NldElkBAhpbnZlc3RvcgkAtQkCCQEFdmFsdWUBCQCiCAEJAQtrZXlJbnZlc3RvcgEFDXVzZXJBZGRyZXNzNTgFA1NFUAQTaW52ZXN0b3JUb3RhbEFtb3VudAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCGludmVzdG9yBRFJZHhJbnZUb3RhbEFtb3VudAQXaW52ZXN0b3JSZW1haW5pbmdBbW91bnQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQhpbnZlc3RvcgUVSWR4SW52UmVtYWluaW5nQW1vdW50BBlpbnZlc3RvclByaWNlQXNzZXRCYWxhbmNlCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUIaW52ZXN0b3IFHUlkeEludkNsYWltZWRQcmljZUFzc2V0QW1vdW50BBdpbnZlc3Rvcklkb0Fzc2V0QmFsYW5jZQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCGludmVzdG9yBRtJZHhJbnZDbGFpbWVkSWRvQXNzZXRBbW91bnQEGWludmVzdG9yTGFzdENsYWltZWRIZWlnaHQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQhpbnZlc3RvcgUXSWR4SW52TGFzdENsYWltZWRIZWlnaHQEDSR0MDE3OTM0MTgxNDYEByRtYXRjaDAJAJ8IAQkBFGtleVByaWNlQXNzZXRCYWxhbmNlAQUNdXNlckFkZHJlc3M1OAMJAAECBQckbWF0Y2gwAgNJbnQEAXQFByRtYXRjaDAJAJQKAgUBdAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBFGtleVByaWNlQXNzZXRCYWxhbmNlAQUNdXNlckFkZHJlc3M1OAAABQNuaWwJAJQKAgAABQNuaWwEEHByaWNlQXNzZXRBbW91bnQIBQ0kdDAxNzkzNDE4MTQ2Al8xBBFwcmljZUFzc2V0QWN0aW9ucwgFDSR0MDE3OTM0MTgxNDYCXzIEDSR0MDE4MTUwMTg0MTMEByRtYXRjaDAJAKIIAQkBGmtleUludmVzdG9yUmVtYWluaW5nQW1vdW50AQUNdXNlckFkZHJlc3M1OAMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXQFByRtYXRjaDAJAJQKAgkBDXBhcnNlSW50VmFsdWUBBQF0CQDMCAIJAQtTdHJpbmdFbnRyeQIJARprZXlJbnZlc3RvclJlbWFpbmluZ0Ftb3VudAEFDXVzZXJBZGRyZXNzNTgCATAFA25pbAkAlAoCAAAFA25pbAQaaW52ZXN0b3JLZXlSZW1haW5pbmdBbW91bnQIBQ0kdDAxODE1MDE4NDEzAl8xBBtpbnZlc3RvcktleVJlbWFpbmluZ0FjdGlvbnMIBQ0kdDAxODE1MDE4NDEzAl8yBBd0b3RhbElkb0Fzc2V0U2VuZEFtb3VudAkAaAIJAGQCCQBkAgUXaW52ZXN0b3JSZW1haW5pbmdBbW91bnQFEHByaWNlQXNzZXRBbW91bnQFGmludmVzdG9yS2V5UmVtYWluaW5nQW1vdW50AGQEHHRvdGFsSWRvQXNzZXRGb3JJbnZlc3RvckRhdGEJAGgCCQBkAgUXaW52ZXN0b3JSZW1haW5pbmdBbW91bnQFGmludmVzdG9yS2V5UmVtYWluaW5nQW1vdW50AGQEC25ld0ludmVzdG9yCQC5CQIJAMwIAgIKJWQlZCVkJWQlZAkAzAgCCQCkAwEFE2ludmVzdG9yVG90YWxBbW91bnQJAMwIAgIBMAkAzAgCCQCkAwEFGWludmVzdG9yUHJpY2VBc3NldEJhbGFuY2UJAMwIAgkApAMBCQBkAgUXaW52ZXN0b3JJZG9Bc3NldEJhbGFuY2UFHHRvdGFsSWRvQXNzZXRGb3JJbnZlc3RvckRhdGEJAMwIAgkApAMBBQZoZWlnaHQFA25pbAUDU0VQBBNpbnZlc3RvckRhdGFBY3Rpb25zAwkBAiE9AgUcdG90YWxJZG9Bc3NldEZvckludmVzdG9yRGF0YQAACQDMCAIJAQtTdHJpbmdFbnRyeQIJAQtrZXlJbnZlc3RvcgEFDXVzZXJBZGRyZXNzNTgFC25ld0ludmVzdG9yBQNuaWwFA25pbAQTc2VuZElkb0Fzc2V0QWN0aW9ucwMJAQIhPQIFF3RvdGFsSWRvQXNzZXRTZW5kQW1vdW50AAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQUNdXNlckFkZHJlc3M1OAUXdG90YWxJZG9Bc3NldFNlbmRBbW91bnQJANkEAQUMaWRvQXNzZXRJZDU4BQNuaWwFA25pbAQOaGlzdG9yeUFjdGlvbnMJARpDbGFpbU9wZXJhdGlvbkhpc3RvcnlFbnRyeQQFDXVzZXJBZGRyZXNzNTgAAAUXdG90YWxJZG9Bc3NldFNlbmRBbW91bnQFBHR4SWQJAJYKBAUXaW52ZXN0b3JSZW1haW5pbmdBbW91bnQFEHByaWNlQXNzZXRBbW91bnQFGmludmVzdG9yS2V5UmVtYWluaW5nQW1vdW50CQDNCAIJAM0IAgkAzQgCCQDNCAIFE3NlbmRJZG9Bc3NldEFjdGlvbnMFE2ludmVzdG9yRGF0YUFjdGlvbnMFHHRvdGFsSWRvQXNzZXRGb3JJbnZlc3RvckRhdGEFEXByaWNlQXNzZXRBY3Rpb25zBQ5oaXN0b3J5QWN0aW9ucwcBaQELY29uc3RydWN0b3IHCGlkb1N0YXJ0C2lkb0R1cmF0aW9uCmNsYWltU3RhcnQNY2xhaW1EdXJhdGlvbgVwcmljZQ5wcmljZUFzc2V0SWQ1OA9taW5JbnZlc3RBbW91bnQECXByaWNlTXVsdAkAaAIJAGgCAGQA6AcA6AcEBmlkb0VuZAkAZAIFCGlkb1N0YXJ0BQtpZG9EdXJhdGlvbgMJAQlpc0RlZmluZWQBCQCiCAEJAQlrZXlDb25maWcACQACAQITYWxyZWFkeSBpbml0aWFsaXplZAMJAQIhPQICIzNQTUVITHgxajZ6ZXJhclpUWWZzR3FEZWVacVFvTXB4cTVTCQClCAEIBQFpBmNhbGxlcgkAAgECDm5vdCBhdXRob3JpemVkAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwABCQACAQIiZXhhY3RseSAxIHBheW1lbnQgbXVzdCBiZSBhdHRhY2hlZAMJAGcCBQZpZG9FbmQFCmNsYWltU3RhcnQJAAIBAiZjbGFpbVN0YXJ0IG11c3QgYmUgZ3JlYXRlciB0aGFuIGlkb0VuZAQDcG10CQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAAECmlkb0Fzc2V0SWQJAQV2YWx1ZQEIBQNwbXQHYXNzZXRJZAQMaWRvQXNzZXRJbmZvCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAOwHAQUKaWRvQXNzZXRJZAIbZmFpbCB0byBsb2FkIGlkbyBhc3NldCBpbmZvBAxpZG9Bc3NldElkNTgJANgEAQUKaWRvQXNzZXRJZAQMaWRvQXNzZXRNdWx0CQBsBgAKAAAIBQxpZG9Bc3NldEluZm8IZGVjaW1hbHMAAAAABQRET1dOBAxwcmljZUFzc2V0SWQJANkEAQUOcHJpY2VBc3NldElkNTgEDnByaWNlQXNzZXRJbmZvCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAOwHAQUMcHJpY2VBc3NldElkAh1mYWlsIHRvIGxvYWQgcHJpY2UgYXNzZXQgaW5mbwQOcHJpY2VBc3NldE11bHQJAGwGAAoAAAgFDnByaWNlQXNzZXRJbmZvCGRlY2ltYWxzAAAAAAUERE9XTgQPb3JpZ1RvdGFsc0FycmF5CQEYcmVhZFRvdGFsc0FycmF5T3JEZWZhdWx0AAQKdG90YWxzRGlmZgkAzAgCAAAJAMwIAgAACQDMCAIAAAkAzAgCAAAFA25pbAkAzAgCCQELU3RyaW5nRW50cnkCCQEJa2V5Q29uZmlnAAkBDGZyb21hdENvbmZpZwwFCGlkb1N0YXJ0BQtpZG9EdXJhdGlvbgUKY2xhaW1TdGFydAUNY2xhaW1EdXJhdGlvbgUFcHJpY2UFCXByaWNlTXVsdAUMaWRvQXNzZXRJZDU4BQxpZG9Bc3NldE11bHQFDnByaWNlQXNzZXRJZDU4BQ5wcmljZUFzc2V0TXVsdAUPbWluSW52ZXN0QW1vdW50CAUDcG10BmFtb3VudAkAzAgCCQELVG90YWxzRW50cnkFCQEJa2V5VG90YWxzAAUPb3JpZ1RvdGFsc0FycmF5BQp0b3RhbHNEaWZmBQpjbGFpbVN0YXJ0AAAFA25pbAFpAQZpbnZlc3QABAhjZmdBcnJheQkBD3JlYWRDb25maWdBcnJheQAECGlkb1N0YXJ0CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUIY2ZnQXJyYXkFDklkeENmZ0lkb1N0YXJ0BAtpZG9EdXJhdGlvbgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCGNmZ0FycmF5BRFJZHhDZmdJZG9EdXJhdGlvbgQGaWRvRW5kCQBkAgUIaWRvU3RhcnQFC2lkb0R1cmF0aW9uBApjbGFpbVN0YXJ0CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUIY2ZnQXJyYXkFEElkeENmZ0NsYWltU3RhcnQEDWNsYWltRHVyYXRpb24JAQ1wYXJzZUludFZhbHVlAQkAkQMCBQhjZmdBcnJheQUTSWR4Q2ZnQ2xhaW1EdXJhdGlvbgQFcHJpY2UJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQhjZmdBcnJheQULSWR4Q2ZnUHJpY2UECXByaWNlTXVsdAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCGNmZ0FycmF5BQ9JZHhDZmdQcmljZU11bHQEDGlkb0Fzc2V0SWQ1OAkAkQMCBQhjZmdBcnJheQUQSWR4Q2ZnSWRvQXNzZXRJZAQKaWRvQXNzZXRJZAkA2QQBBQxpZG9Bc3NldElkNTgEDGlkb0Fzc2V0TXVsdAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCGNmZ0FycmF5BRJJZHhDZmdJZG9Bc3NldE11bHQEDnByaWNlQXNzZXRJZDU4CQCRAwIFCGNmZ0FycmF5BRJJZHhDZmdQcmljZUFzc2V0SWQEDHByaWNlQXNzZXRJZAkA2QQBBQ5wcmljZUFzc2V0SWQ1OAQOcHJpY2VBc3NldE11bHQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQhjZmdBcnJheQUUSWR4Q2ZnUHJpY2VBc3NldE11bHQEDm1pbkl2ZXN0QW1vdW50CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUIY2ZnQXJyYXkFFUlkeENmZ01pbkludmVzdEFtb3VudAQLdXNlckFkZHJlc3MJAKUIAQgFAWkGY2FsbGVyAwkAZgIFCGlkb1N0YXJ0BQZoZWlnaHQJAAIBAhxpZG8gaGFzIG5vdCBiZWVuIHN0YXJ0ZWQgeWV0AwkAZgIFBmhlaWdodAUGaWRvRW5kCQACAQIaaWRvIGhhcyBiZWVuIGFscmVhZHkgZW5kZWQDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEJAAIBAh1leGFjdGx5IDEgcGF5bWVudCBpcyBleHBlY3RlZAQDcG10CQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAAECnBtdEFzc2V0SWQJAQV2YWx1ZQEIBQNwbXQHYXNzZXRJZAQJcG10QW1vdW50CAUDcG10BmFtb3VudAMJAQIhPQIFCnBtdEFzc2V0SWQFDHByaWNlQXNzZXRJZAkAAgEJAKwCAgkArAICAhppbnZhbGlkIHBheW1lbnQgYXNzZXQgaWQ6IAkA2AQBBQpwbXRBc3NldElkAgwgaXMgZXhwZWN0ZWQEEW9yaWdJbnZlc3RvckFycmF5CQEacmVhZEludmVzdG9yQXJyYXlPckRlZmF1bHQBBQt1c2VyQWRkcmVzcwQPb3JpZ1RvdGFsc0FycmF5CQEYcmVhZFRvdGFsc0FycmF5T3JEZWZhdWx0AAQTbmV3UHJpY2VUb3RhbEFtb3VudAkAZAIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQ9vcmlnVG90YWxzQXJyYXkFEUlkeEludlRvdGFsQW1vdW50BQlwbXRBbW91bnQEFnJlcXVpcmVkSWRvQXNzZXRBbW91bnQJAGgCBRNuZXdQcmljZVRvdGFsQW1vdW50AGQDCQBmAgUWcmVxdWlyZWRJZG9Bc3NldEFtb3VudAkA8AcCBQR0aGlzBQppZG9Bc3NldElkCQACAQI5SURPIGFzc2V0IGhhcyBiZWVuIC0gc29sZCBjb25zaWRlciB0byB1c2Ugc21hbGxlciBwYXltZW50BAp0b3RhbHNEaWZmCQDMCAIFCXBtdEFtb3VudAkAzAgCBQlwbXRBbW91bnQJAMwIAgAACQDMCAIAAAUDbmlsCQDMCAIJAQtUb3RhbHNFbnRyeQUJAQtrZXlJbnZlc3RvcgEFC3VzZXJBZGRyZXNzBRFvcmlnSW52ZXN0b3JBcnJheQUKdG90YWxzRGlmZgUKY2xhaW1TdGFydAAACQDMCAIJAQtUb3RhbHNFbnRyeQUJAQlrZXlUb3RhbHMABQ9vcmlnVG90YWxzQXJyYXkFCnRvdGFsc0RpZmYFCmNsYWltU3RhcnQAAAkAzAgCCQEbSW52ZXN0T3BlcmF0aW9uSGlzdG9yeUVudHJ5BAULdXNlckFkZHJlc3MFCXBtdEFtb3VudAAACAUBaQ10cmFuc2FjdGlvbklkBQNuaWwBaQEFY2xhaW0CEGNsYWltZWRBc3NldElkNTgNdXNlckFkZHJlc3M1OAQPY2FsbGVyQWRkcmVzczU4CQClCAEIBQFpBmNhbGxlcgMJAQIhPQIFDXVzZXJBZGRyZXNzNTgFD2NhbGxlckFkZHJlc3M1OAkAAgECDm5vdCBhdXRob3JpemVkBAhjZmdBcnJheQkBD3JlYWRDb25maWdBcnJheQAEDnByaWNlQXNzZXRJZDU4CQCRAwIFCGNmZ0FycmF5BRJJZHhDZmdQcmljZUFzc2V0SWQEEGNsYWltUmVzdWx0VHVwbGUJAQ1pbnRlcm5hbENsYWltAwUQY2xhaW1lZEFzc2V0SWQ1OAgFAWkGY2FsbGVyCAUBaQ10cmFuc2FjdGlvbklkBAp0b3RhbHNEaWZmCAUQY2xhaW1SZXN1bHRUdXBsZQJfMQQJb3V0QW1vdW50CAUQY2xhaW1SZXN1bHRUdXBsZQJfMgQKb3V0QXNzZXRJZAgFEGNsYWltUmVzdWx0VHVwbGUCXzMED29yaWdJbnZlc3RBcnJheQgFEGNsYWltUmVzdWx0VHVwbGUCXzQEFG5ld0NsYWltUGVyaW9kSGVpZ2h0CAUQY2xhaW1SZXN1bHRUdXBsZQJfNQQaY2xhaW1lZFByaWNlQW1vdW50RnJvbURpZmYJAJEDAgUKdG90YWxzRGlmZgUiSWR4RGlmZkNsYWltZWRQcmljZUFtb3VudEluY3JlbWVudAQdY2xhaW1lZElkb0Fzc2V0QW1vdW50RnJvbURpZmYJAJEDAgUKdG90YWxzRGlmZgUlSWR4RGlmZkNsYWltZWRJZG9Bc3NldEFtb3VudEluY3JlbWVudAQRcHJpY2VBc3NldEJhbGFuY2UJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBFGtleVByaWNlQXNzZXRCYWxhbmNlAQUNdXNlckFkZHJlc3M1OAAABBJwcmljZUFzc2V0RGVjaW1hbHMICQEFdmFsdWUBCQDsBwEJANkEAQUOcHJpY2VBc3NldElkNTgIZGVjaW1hbHMEB2VudHJpZXMDCQAAAgUQY2xhaW1lZEFzc2V0SWQ1OAUOcHJpY2VBc3NldElkNTgEDSR0MDI0NDgzMjQ5MjcJAQ9pbnRlcm5hbENsYWltVjIEBQ5wcmljZUFzc2V0SWQ1OAUNdXNlckFkZHJlc3M1OAUJb3V0QW1vdW50CQCRAwIFCnRvdGFsc0RpZmYFIklkeERpZmZDbGFpbWVkUHJpY2VBbW91bnRJbmNyZW1lbnQEGXBlcmlvZE1pbkF2YWlsYWJsZVRvQ2xhaW0IBQ0kdDAyNDQ4MzI0OTI3Al8xBBtwZXJpb2RUb3RhbEF2YWlsYWJsZVRvQ2xhaW0IBQ0kdDAyNDQ4MzI0OTI3Al8yBBpwZXJpb2RVc2VyQXZhaWxhYmxlVG9DbGFpbQgFDSR0MDI0NDgzMjQ5MjcCXzMEGXRvdGFsVXNlckF2YWlsYWJsZVRvQ2xhaW0IBQ0kdDAyNDQ4MzI0OTI3Al80BBx1c2R0UHJpY2VBc3NldEFsbG93YWJsZVJhdGlvCAUNJHQwMjQ0ODMyNDkyNwJfNQQaY3VycmVudFVzZHRQcmljZUFzc2V0UmF0aW8IBQ0kdDAyNDQ4MzI0OTI3Al82BBNlbmRQZXJpb2RCbG9ja3NMZWZ0CAUNJHQwMjQ0ODMyNDkyNwJfNwQUdXBkYXRlZEN1cnJlbnRQZXJpb2QIBQ0kdDAyNDQ4MzI0OTI3Al84BAtwZXJpb2RTdGFydAgFDSR0MDI0NDgzMjQ5MjcCXzkECXBlcmlvZEVuZAgFDSR0MDI0NDgzMjQ5MjcDXzEwBAZjaGVja3MJAMwIAgMJAGYCBRpwZXJpb2RVc2VyQXZhaWxhYmxlVG9DbGFpbQAABgkBCHRocm93RXJyAQI6dW5hdmFpbGFibGUgdG8gY2xhaW0gYmVjYXVzZSB1c2VyIHBlcmlvZCBhbGxvd2FuY2UgcmVhY2hlZAkAzAgCAwkAZgIFG3BlcmlvZFRvdGFsQXZhaWxhYmxlVG9DbGFpbQAABgkBCHRocm93RXJyAQI7dW5hdmFpbGFibGUgdG8gY2xhaW0gYmVjYXVzZSB0b3RhbCBwZXJpb2QgYWxsb3dhbmNlIHJlYWNoZWQJAMwIAgMJAGYCBRlwZXJpb2RNaW5BdmFpbGFibGVUb0NsYWltAAAGCQEIdGhyb3dFcnIBAhBub3RoaW5nIHRvIGNsYWltCQDMCAIDCQBmAgUcdXNkdFByaWNlQXNzZXRBbGxvd2FibGVSYXRpbwUaY3VycmVudFVzZHRQcmljZUFzc2V0UmF0aW8GCQEIdGhyb3dFcnIBAk91bmF2YWlsYWJsZSB0byBjbGFpbSBiZWNhdXNlIHVzZG4gcHJpY2UgbG93ZXIgdGhhbiB1c2R0UHJpY2VBc3NldEFsbG93YWJsZVJhdGlvCQDMCAIDAwMJAQIhPQIFEGNsYWltZWRBc3NldElkNTgFDnByaWNlQXNzZXRJZDU4BgkAAAIFEmNsYWltQ2xvc2luZ0hlaWdodAAABgkAZgIFEmNsYWltQ2xvc2luZ0hlaWdodAUGaGVpZ2h0BgkBCHRocm93RXJyAQIRQ2xhaW0gaXMgZGlzYWJsZWQFA25pbAMJAAACBQZjaGVja3MFBmNoZWNrcwQidXBkYXRlZFBlcmlvZFRvdGFsQXZhaWxhYmxlVG9DbGFpbQkAZQIFG3BlcmlvZFRvdGFsQXZhaWxhYmxlVG9DbGFpbQUZcGVyaW9kTWluQXZhaWxhYmxlVG9DbGFpbQQhdXBkYXRlZFBlcmlvZFVzZXJBdmFpbGFibGVUb0NsYWltCQBlAgUacGVyaW9kVXNlckF2YWlsYWJsZVRvQ2xhaW0FGXBlcmlvZE1pbkF2YWlsYWJsZVRvQ2xhaW0EB2VudHJpZXMDCQBmAgURcHJpY2VBc3NldEJhbGFuY2UFGXBlcmlvZE1pbkF2YWlsYWJsZVRvQ2xhaW0JAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBRlwZXJpb2RNaW5BdmFpbGFibGVUb0NsYWltBQpvdXRBc3NldElkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEUa2V5UHJpY2VBc3NldEJhbGFuY2UBBQ11c2VyQWRkcmVzczU4CQBlAgURcHJpY2VBc3NldEJhbGFuY2UFGXBlcmlvZE1pbkF2YWlsYWJsZVRvQ2xhaW0FA25pbAQOZXZhbHVhdGVSZXN1bHQJALUJAgkBCGFzU3RyaW5nAQkA/AcEBQR0aGlzAg1jbGFpbVJFQURPTkxZCQDMCAIFDnByaWNlQXNzZXRJZDU4CQDMCAIFDXVzZXJBZGRyZXNzNTgFA25pbAUDbmlsBQNTRVADCQAAAgUOZXZhbHVhdGVSZXN1bHQFDmV2YWx1YXRlUmVzdWx0BBthdmFpbGFibGVQcmljZUFtb3VudFRvQ2xhaW0JAQ1wYXJzZUludFZhbHVlAQkAkQMCBQ5ldmFsdWF0ZVJlc3VsdAADBBBsYXN0Q2xhaW1FbnRyaWVzAwkAAAIFG2F2YWlsYWJsZVByaWNlQW1vdW50VG9DbGFpbQUZcGVyaW9kTWluQXZhaWxhYmxlVG9DbGFpbQQTaW52ZXN0b3JUb3RhbEFtb3VudAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFD29yaWdJbnZlc3RBcnJheQURSWR4SW52VG90YWxBbW91bnQEF2ludmVzdG9yUmVtYWluaW5nQW1vdW50CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUPb3JpZ0ludmVzdEFycmF5BRVJZHhJbnZSZW1haW5pbmdBbW91bnQEGWludmVzdG9yUHJpY2VBc3NldEJhbGFuY2UJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQ9vcmlnSW52ZXN0QXJyYXkFHUlkeEludkNsYWltZWRQcmljZUFzc2V0QW1vdW50BBdpbnZlc3Rvcklkb0Fzc2V0QmFsYW5jZQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFD29yaWdJbnZlc3RBcnJheQUbSWR4SW52Q2xhaW1lZElkb0Fzc2V0QW1vdW50BBlpbnZlc3Rvckxhc3RDbGFpbWVkSGVpZ2h0CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUPb3JpZ0ludmVzdEFycmF5BRdJZHhJbnZMYXN0Q2xhaW1lZEhlaWdodAQObmV3SW52ZXN0QXJyYXkJAMwIAgkApAMBBRNpbnZlc3RvclRvdGFsQW1vdW50CQDMCAICATAJAMwIAgkApAMBBRlpbnZlc3RvclByaWNlQXNzZXRCYWxhbmNlCQDMCAIJAKQDAQUXaW52ZXN0b3JJZG9Bc3NldEJhbGFuY2UJAMwIAgkApAMBBRlpbnZlc3Rvckxhc3RDbGFpbWVkSGVpZ2h0BQNuaWwEBnRvdGFscwkBGHJlYWRUb3RhbHNBcnJheU9yRGVmYXVsdAAEEXRvdGFsc1RvdGFsQW1vdW50CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUGdG90YWxzBRFJZHhJbnZUb3RhbEFtb3VudAQVdG90YWxzUmVtYWluaW5nQW1vdW50CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUGdG90YWxzBRVJZHhJbnZSZW1haW5pbmdBbW91bnQEHXRvdGFsc0NsYWltZWRQcmljZUFzc2V0QW1vdW50CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUGdG90YWxzBR1JZHhJbnZDbGFpbWVkUHJpY2VBc3NldEFtb3VudAQbdG90YWxzQ2xhaW1lZElkb0Fzc2V0QW1vdW50CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUGdG90YWxzBRtJZHhJbnZDbGFpbWVkSWRvQXNzZXRBbW91bnQEF3RvdGFsc0xhc3RDbGFpbWVkSGVpZ2h0CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUGdG90YWxzBRdJZHhJbnZMYXN0Q2xhaW1lZEhlaWdodAQYbmV3VG90YWxzUmVtYWluaW5nQW1vdW50CQBlAgUVdG90YWxzUmVtYWluaW5nQW1vdW50BRdpbnZlc3RvclJlbWFpbmluZ0Ftb3VudAQNbmV3VG90YWxBcnJheQkAzAgCCQCkAwEFEXRvdGFsc1RvdGFsQW1vdW50CQDMCAIJAKQDAQUYbmV3VG90YWxzUmVtYWluaW5nQW1vdW50CQDMCAIJAKQDAQUddG90YWxzQ2xhaW1lZFByaWNlQXNzZXRBbW91bnQJAMwIAgkApAMBBRt0b3RhbHNDbGFpbWVkSWRvQXNzZXRBbW91bnQJAMwIAgkApAMBBRd0b3RhbHNMYXN0Q2xhaW1lZEhlaWdodAUDbmlsBBduZXdUb3RhbFJlbWFpbmluZ0Ftb3VudAkAZAIJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBF2tleVRvdGFsUmVtYWluaW5nQW1vdW50AAAABRdpbnZlc3RvclJlbWFpbmluZ0Ftb3VudAkAzAgCCQELU3RyaW5nRW50cnkCCQEaa2V5SW52ZXN0b3JSZW1haW5pbmdBbW91bnQBBQ11c2VyQWRkcmVzczU4CQCkAwEFF2ludmVzdG9yUmVtYWluaW5nQW1vdW50CQDMCAIJAQtTdHJpbmdFbnRyeQIJARdrZXlUb3RhbFJlbWFpbmluZ0Ftb3VudAAJAKQDAQUXbmV3VG90YWxSZW1haW5pbmdBbW91bnQJAMwIAgkBC1RvdGFsc0VudHJ5BQkBC2tleUludmVzdG9yAQUNdXNlckFkZHJlc3M1OAUObmV3SW52ZXN0QXJyYXkFCnRvdGFsc0RpZmYFFG5ld0NsYWltUGVyaW9kSGVpZ2h0AAAJAMwIAgkBC1RvdGFsc0VudHJ5BQkBCWtleVRvdGFscwAFDW5ld1RvdGFsQXJyYXkFCnRvdGFsc0RpZmYFFG5ld0NsYWltUGVyaW9kSGVpZ2h0AAAFA25pbAkAzAgCCQELVG90YWxzRW50cnkFCQELa2V5SW52ZXN0b3IBBQ11c2VyQWRkcmVzczU4BQ9vcmlnSW52ZXN0QXJyYXkFCnRvdGFsc0RpZmYFFG5ld0NsYWltUGVyaW9kSGVpZ2h0AAAJAMwIAgkBC1RvdGFsc0VudHJ5BQkBCWtleVRvdGFscwAJARhyZWFkVG90YWxzQXJyYXlPckRlZmF1bHQABQp0b3RhbHNEaWZmBRRuZXdDbGFpbVBlcmlvZEhlaWdodAAABQNuaWwEGHVwZGF0ZWRQcmljZUFzc2V0QmFsYW5jZQkAZQIJAGQCBRFwcmljZUFzc2V0QmFsYW5jZQUJb3V0QW1vdW50BRlwZXJpb2RNaW5BdmFpbGFibGVUb0NsYWltCQDOCAIJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBRlwZXJpb2RNaW5BdmFpbGFibGVUb0NsYWltBQpvdXRBc3NldElkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEUa2V5UHJpY2VBc3NldEJhbGFuY2UBBQ11c2VyQWRkcmVzczU4BRh1cGRhdGVkUHJpY2VBc3NldEJhbGFuY2UFA25pbAUQbGFzdENsYWltRW50cmllcwkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAlAoCCQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIJARBrZXlDdXJyZW50UGVyaW9kAAUUdXBkYXRlZEN1cnJlbnRQZXJpb2QJAMwIAgkBDEludGVnZXJFbnRyeQIJARRrZXlQZXJpb2RTdGFydEhlaWdodAEFFHVwZGF0ZWRDdXJyZW50UGVyaW9kBQtwZXJpb2RTdGFydAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBEmtleVBlcmlvZEVuZEhlaWdodAEFFHVwZGF0ZWRDdXJyZW50UGVyaW9kBQlwZXJpb2RFbmQJAMwIAgkBDEludGVnZXJFbnRyeQIJAR5rZXlQZXJpb2RUb3RhbEF2YWlsYWJsZVRvQ2xhaW0CBQ5wcmljZUFzc2V0SWQ1OAUUdXBkYXRlZEN1cnJlbnRQZXJpb2QFInVwZGF0ZWRQZXJpb2RUb3RhbEF2YWlsYWJsZVRvQ2xhaW0JAMwIAgkBDEludGVnZXJFbnRyeQIJAR1rZXlQZXJpb2RVc2VyQXZhaWxhYmxlVG9DbGFpbQMFDnByaWNlQXNzZXRJZDU4BRR1cGRhdGVkQ3VycmVudFBlcmlvZAUNdXNlckFkZHJlc3M1OAUhdXBkYXRlZFBlcmlvZFVzZXJBdmFpbGFibGVUb0NsYWltCQDMCAIJARpDbGFpbU9wZXJhdGlvbkhpc3RvcnlFbnRyeQQFDXVzZXJBZGRyZXNzNTgFGXBlcmlvZE1pbkF2YWlsYWJsZVRvQ2xhaW0FHWNsYWltZWRJZG9Bc3NldEFtb3VudEZyb21EaWZmCAUBaQ10cmFuc2FjdGlvbklkBQNuaWwFB2VudHJpZXMFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4EHHByaWNlQXNzZXRCYWxhbmNlSWRvRGVjaW1hbHMJAGsDBRFwcmljZUFzc2V0QmFsYW5jZQUGc2NhbGU4CQBsBgAKAAAFEnByaWNlQXNzZXREZWNpbWFscwAAAAAFBERPV04JAJQKAgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIJAGQCBQlvdXRBbW91bnQFHHByaWNlQXNzZXRCYWxhbmNlSWRvRGVjaW1hbHMFCm91dEFzc2V0SWQJAMwIAgkBDEludGVnZXJFbnRyeQIJARRrZXlQcmljZUFzc2V0QmFsYW5jZQEFDXVzZXJBZGRyZXNzNTgAAAkAzAgCCQELVG90YWxzRW50cnkFCQELa2V5SW52ZXN0b3IBBQ11c2VyQWRkcmVzczU4BQ9vcmlnSW52ZXN0QXJyYXkFCnRvdGFsc0RpZmYFFG5ld0NsYWltUGVyaW9kSGVpZ2h0BRFwcmljZUFzc2V0QmFsYW5jZQkAzAgCCQELVG90YWxzRW50cnkFCQEJa2V5VG90YWxzAAkBGHJlYWRUb3RhbHNBcnJheU9yRGVmYXVsdAAFCnRvdGFsc0RpZmYFFG5ld0NsYWltUGVyaW9kSGVpZ2h0BRFwcmljZUFzc2V0QmFsYW5jZQkAzAgCCQEaQ2xhaW1PcGVyYXRpb25IaXN0b3J5RW50cnkEBQ11c2VyQWRkcmVzczU4BRpjbGFpbWVkUHJpY2VBbW91bnRGcm9tRGlmZgkAZAIFHWNsYWltZWRJZG9Bc3NldEFtb3VudEZyb21EaWZmBRxwcmljZUFzc2V0QmFsYW5jZUlkb0RlY2ltYWxzCAUBaQ10cmFuc2FjdGlvbklkBQNuaWwFBHVuaXQFB2VudHJpZXMBaQESY2xlYW5SZW1haW5nQW1vdW50AQ11c2VyQWRkcmVzczU4BA5wcmljZUFzc2V0SWQ1OAkAkQMCCQEPcmVhZENvbmZpZ0FycmF5AAUSSWR4Q2ZnUHJpY2VBc3NldElkBA5ldmFsdWF0ZVJlc3VsdAkAtQkCCQEIYXNTdHJpbmcBCQD8BwQFBHRoaXMCDWNsYWltUkVBRE9OTFkJAMwIAgUOcHJpY2VBc3NldElkNTgJAMwIAgUNdXNlckFkZHJlc3M1OAUDbmlsBQNuaWwFA1NFUAMJAAACBQ5ldmFsdWF0ZVJlc3VsdAUOZXZhbHVhdGVSZXN1bHQEG2F2YWlsYWJsZVByaWNlQW1vdW50VG9DbGFpbQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDmV2YWx1YXRlUmVzdWx0AAIEFGNoZWNrVW5jbGFpbWVkQXNzZXRzAwkAAAIFG2F2YWlsYWJsZVByaWNlQW1vdW50VG9DbGFpbQAABgkBCHRocm93RXJyAQIadXNlciBoYXZlIHVuY2xhaW1lZCBhc3NldHMDCQAAAgUUY2hlY2tVbmNsYWltZWRBc3NldHMFFGNoZWNrVW5jbGFpbWVkQXNzZXRzBAhpbnZlc3RvcgkAtQkCCQEFdmFsdWUBCQCiCAEJAQtrZXlJbnZlc3RvcgEFDXVzZXJBZGRyZXNzNTgFA1NFUAQTaW52ZXN0b3JUb3RhbEFtb3VudAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCGludmVzdG9yBRFJZHhJbnZUb3RhbEFtb3VudAQXaW52ZXN0b3JSZW1haW5pbmdBbW91bnQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQhpbnZlc3RvcgUVSWR4SW52UmVtYWluaW5nQW1vdW50BBlpbnZlc3RvclByaWNlQXNzZXRCYWxhbmNlCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUIaW52ZXN0b3IFHUlkeEludkNsYWltZWRQcmljZUFzc2V0QW1vdW50BBdpbnZlc3Rvcklkb0Fzc2V0QmFsYW5jZQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCGludmVzdG9yBRtJZHhJbnZDbGFpbWVkSWRvQXNzZXRBbW91bnQEGWludmVzdG9yTGFzdENsYWltZWRIZWlnaHQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQhpbnZlc3RvcgUXSWR4SW52TGFzdENsYWltZWRIZWlnaHQEHGludmVzdG9yUmVtYWluaW5nQW1vdW50Q2hlY2sDCQECIT0CBRdpbnZlc3RvclJlbWFpbmluZ0Ftb3VudAAABgkBCHRocm93RXJyAQIkaW52ZXN0b3JSZW1haW5pbmdBbW91bnQgYWxyZWFkeSB6ZXJvAwkAAAIFHGludmVzdG9yUmVtYWluaW5nQW1vdW50Q2hlY2sFHGludmVzdG9yUmVtYWluaW5nQW1vdW50Q2hlY2sEC25ld0ludmVzdG9yCQC5CQIJAMwIAgIKJWQlZCVkJWQlZAkAzAgCCQCkAwEFE2ludmVzdG9yVG90YWxBbW91bnQJAMwIAgIBMAkAzAgCCQCkAwEFGWludmVzdG9yUHJpY2VBc3NldEJhbGFuY2UJAMwIAgkApAMBBRdpbnZlc3Rvcklkb0Fzc2V0QmFsYW5jZQkAzAgCCQCkAwEFGWludmVzdG9yTGFzdENsYWltZWRIZWlnaHQFA25pbAUDU0VQBAZ0b3RhbHMJALUJAgkBBXZhbHVlAQkAoggBCQEJa2V5VG90YWxzAAUDU0VQBBF0b3RhbHNUb3RhbEFtb3VudAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBnRvdGFscwURSWR4SW52VG90YWxBbW91bnQEFXRvdGFsc1JlbWFpbmluZ0Ftb3VudAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBnRvdGFscwUVSWR4SW52UmVtYWluaW5nQW1vdW50BB10b3RhbHNDbGFpbWVkUHJpY2VBc3NldEFtb3VudAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBnRvdGFscwUdSWR4SW52Q2xhaW1lZFByaWNlQXNzZXRBbW91bnQEG3RvdGFsc0NsYWltZWRJZG9Bc3NldEFtb3VudAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBnRvdGFscwUbSWR4SW52Q2xhaW1lZElkb0Fzc2V0QW1vdW50BBd0b3RhbHNMYXN0Q2xhaW1lZEhlaWdodAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBnRvdGFscwUXSWR4SW52TGFzdENsYWltZWRIZWlnaHQECW5ld1RvdGFscwkAuQkCCQDMCAICCiVkJWQlZCVkJWQJAMwIAgkApAMBBRF0b3RhbHNUb3RhbEFtb3VudAkAzAgCCQCkAwEJAGUCBRV0b3RhbHNSZW1haW5pbmdBbW91bnQFF2ludmVzdG9yUmVtYWluaW5nQW1vdW50CQDMCAIJAKQDAQUddG90YWxzQ2xhaW1lZFByaWNlQXNzZXRBbW91bnQJAMwIAgkApAMBBRt0b3RhbHNDbGFpbWVkSWRvQXNzZXRBbW91bnQJAMwIAgkApAMBBRd0b3RhbHNMYXN0Q2xhaW1lZEhlaWdodAUDbmlsBQNTRVAEF25ld1RvdGFsUmVtYWluaW5nQW1vdW50CQBkAgkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEXa2V5VG90YWxSZW1haW5pbmdBbW91bnQAAAAFF2ludmVzdG9yUmVtYWluaW5nQW1vdW50CQDMCAIJAQtTdHJpbmdFbnRyeQIJARprZXlJbnZlc3RvclJlbWFpbmluZ0Ftb3VudAEFDXVzZXJBZGRyZXNzNTgJAKQDAQUXaW52ZXN0b3JSZW1haW5pbmdBbW91bnQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBF2tleVRvdGFsUmVtYWluaW5nQW1vdW50AAkApAMBBRduZXdUb3RhbFJlbWFpbmluZ0Ftb3VudAkAzAgCCQELU3RyaW5nRW50cnkCCQELa2V5SW52ZXN0b3IBBQ11c2VyQWRkcmVzczU4BQtuZXdJbnZlc3RvcgkAzAgCCQELU3RyaW5nRW50cnkCCQEJa2V5VG90YWxzAAUJbmV3VG90YWxzBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEIY2xhaW1Gb3IBDXVzZXJBZGRyZXNzNTgFA25pbAFpAQ1jbGFpbVJFQURPTkxZAhBjbGFpbWVkQXNzZXRJZDU4DXVzZXJBZGRyZXNzNTgEEGNsYWltUmVzdWx0VHVwbGUJAQ1pbnRlcm5hbENsYWltAwUQY2xhaW1lZEFzc2V0SWQ1OAkBEUBleHRyTmF0aXZlKDEwNjIpAQUNdXNlckFkZHJlc3M1OAkA2QQBAgAECnRvdGFsc0RpZmYIBRBjbGFpbVJlc3VsdFR1cGxlAl8xBAlvdXRBbW91bnQIBRBjbGFpbVJlc3VsdFR1cGxlAl8yBApvdXRBc3NldElkCAUQY2xhaW1SZXN1bHRUdXBsZQJfMwQPb3JpZ0ludmVzdEFycmF5CAUQY2xhaW1SZXN1bHRUdXBsZQJfNAQUbmV3Q2xhaW1QZXJpb2RIZWlnaHQIBRBjbGFpbVJlc3VsdFR1cGxlAl81BBVhdmFpbGFibGVUb0NsYWltQXJyYXkIBRBjbGFpbVJlc3VsdFR1cGxlAl82BBthdmFpbGFibGVQcmljZUFtb3VudFRvQ2xhaW0JAJEDAgUVYXZhaWxhYmxlVG9DbGFpbUFycmF5AAAEGWF2YWlsYWJsZUlkb0Ftb3VudFRvQ2xhaW0JAJEDAgUVYXZhaWxhYmxlVG9DbGFpbUFycmF5AAEJAJQKAgUDbmlsCQC5CQIJAMwIAgIGJXMlZCVkCQDMCAIFDXVzZXJBZGRyZXNzNTgJAMwIAgkApAMBBRthdmFpbGFibGVQcmljZUFtb3VudFRvQ2xhaW0JAMwIAgkApAMBBRlhdmFpbGFibGVJZG9BbW91bnRUb0NsYWltBQNuaWwFA1NFUAFpAQ9jbGFpbVYyUkVBRE9OTFkCEGNsYWltZWRBc3NldElkNTgNdXNlckFkZHJlc3M1OAQQY2xhaW1SZXN1bHRUdXBsZQkBDWludGVybmFsQ2xhaW0DBRBjbGFpbWVkQXNzZXRJZDU4CQERQGV4dHJOYXRpdmUoMTA2MikBBQ11c2VyQWRkcmVzczU4CQDZBAECAAQKdG90YWxzRGlmZggFEGNsYWltUmVzdWx0VHVwbGUCXzEECW91dEFtb3VudAgFEGNsYWltUmVzdWx0VHVwbGUCXzIECm91dEFzc2V0SWQIBRBjbGFpbVJlc3VsdFR1cGxlAl8zBA9vcmlnSW52ZXN0QXJyYXkIBRBjbGFpbVJlc3VsdFR1cGxlAl80BBRuZXdDbGFpbVBlcmlvZEhlaWdodAgFEGNsYWltUmVzdWx0VHVwbGUCXzUEFWF2YWlsYWJsZVRvQ2xhaW1BcnJheQgFEGNsYWltUmVzdWx0VHVwbGUCXzYEG2F2YWlsYWJsZVByaWNlQW1vdW50VG9DbGFpbQkAkQMCBRVhdmFpbGFibGVUb0NsYWltQXJyYXkAAAQZYXZhaWxhYmxlSWRvQW1vdW50VG9DbGFpbQkAkQMCBRVhdmFpbGFibGVUb0NsYWltQXJyYXkAAQQIY2ZnQXJyYXkJAQ9yZWFkQ29uZmlnQXJyYXkABA5wcmljZUFzc2V0SWQ1OAkAkQMCBQhjZmdBcnJheQUSSWR4Q2ZnUHJpY2VBc3NldElkBBFwcmljZUFzc2V0QmFsYW5jZQkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEUa2V5UHJpY2VBc3NldEJhbGFuY2UBBQ11c2VyQWRkcmVzczU4AAAEHHByaWNlQXNzZXRCYWxhbmNlSWRvRGVjaW1hbHMJAGgCBRFwcmljZUFzc2V0QmFsYW5jZQBkBC5hdmFpbGFibGVJZG9BbW91bnRUb0NsYWltV2l0aFByaWNlQXNzZXRCYWxhbmNlCQBkAgUZYXZhaWxhYmxlSWRvQW1vdW50VG9DbGFpbQUccHJpY2VBc3NldEJhbGFuY2VJZG9EZWNpbWFscwQNJHQwMzYzNzQzNjc4NgkBD2ludGVybmFsQ2xhaW1WMgQFDnByaWNlQXNzZXRJZDU4BQ11c2VyQWRkcmVzczU4BQlvdXRBbW91bnQJAJEDAgUKdG90YWxzRGlmZgUiSWR4RGlmZkNsYWltZWRQcmljZUFtb3VudEluY3JlbWVudAQZcGVyaW9kTWluQXZhaWxhYmxlVG9DbGFpbQgFDSR0MDM2Mzc0MzY3ODYCXzEEG3BlcmlvZFRvdGFsQXZhaWxhYmxlVG9DbGFpbQgFDSR0MDM2Mzc0MzY3ODYCXzIEGnBlcmlvZFVzZXJBdmFpbGFibGVUb0NsYWltCAUNJHQwMzYzNzQzNjc4NgJfMwQZdG90YWxVc2VyQXZhaWxhYmxlVG9DbGFpbQgFDSR0MDM2Mzc0MzY3ODYCXzQEHHVzZHRQcmljZUFzc2V0QWxsb3dhYmxlUmF0aW8IBQ0kdDAzNjM3NDM2Nzg2Al81BBpjdXJyZW50VXNkdFByaWNlQXNzZXRSYXRpbwgFDSR0MDM2Mzc0MzY3ODYCXzYEE2VuZFBlcmlvZEJsb2Nrc0xlZnQIBQ0kdDAzNjM3NDM2Nzg2Al83BBR1cGRhdGVkQ3VycmVudFBlcmlvZAgFDSR0MDM2Mzc0MzY3ODYCXzgEC3BlcmlvZFN0YXJ0CAUNJHQwMzYzNzQzNjc4NgJfOQQJcGVyaW9kRW5kCAUNJHQwMzYzNzQzNjc4NgNfMTAEFmN1cnJlbnRQZXJpb2RFbmRIZWlnaHQJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBEmtleVBlcmlvZEVuZEhlaWdodAEFFHVwZGF0ZWRDdXJyZW50UGVyaW9kAAAEGnVzZXJUb3RhbFByaWNlQXNzZXRDbGFpbWVkCQBlAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIJARdyZWFkSW52ZXN0b3JBcnJheU9yRmFpbAEFDXVzZXJBZGRyZXNzNTgFHUlkeEludkNsYWltZWRQcmljZUFzc2V0QW1vdW50BRFwcmljZUFzc2V0QmFsYW5jZQQMcmVzdWx0U3RyaW5nAwkAZgIFBmhlaWdodAUWY3VycmVudFBlcmlvZEVuZEhlaWdodAQMcGVyaW9kTGVuZ2h0CQEFdmFsdWUBCQCfCAEJAQ9rZXlQZXJpb2RMZW5ndGgABBN1c2VyUGVyaW9kQWxsb3dhbmNlCQEFdmFsdWUBCQCfCAEJARZrZXlVc2VyUGVyaW9kQWxsb3dhbmNlAQUOcHJpY2VBc3NldElkNTgEFHRvdGFsUGVyaW9kQWxsb3dhbmNlCQEFdmFsdWUBCQCfCAEJARdrZXlUb3RhbFBlcmlvZEFsbG93YW5jZQEFDnByaWNlQXNzZXRJZDU4CQC5CQIJAMwIAgIMJWQlZCVkJWQlZCVkCQDMCAIJAKQDAQUuYXZhaWxhYmxlSWRvQW1vdW50VG9DbGFpbVdpdGhQcmljZUFzc2V0QmFsYW5jZQkAzAgCCQCkAwEFE3VzZXJQZXJpb2RBbGxvd2FuY2UJAMwIAgkApAMBBRR0b3RhbFBlcmlvZEFsbG93YW5jZQkAzAgCCQCkAwEFHHVzZHRQcmljZUFzc2V0QWxsb3dhYmxlUmF0aW8JAMwIAgkApAMBBRpjdXJyZW50VXNkdFByaWNlQXNzZXRSYXRpbwkAzAgCCQCkAwEFDHBlcmlvZExlbmdodAkAzAgCCQCkAwEFGnVzZXJUb3RhbFByaWNlQXNzZXRDbGFpbWVkBQNuaWwFA1NFUAkAuQkCCQDMCAICDCVkJWQlZCVkJWQlZAkAzAgCCQCkAwEFLmF2YWlsYWJsZUlkb0Ftb3VudFRvQ2xhaW1XaXRoUHJpY2VBc3NldEJhbGFuY2UJAMwIAgkApAMBBRlwZXJpb2RNaW5BdmFpbGFibGVUb0NsYWltCQDMCAIJAKQDAQUbcGVyaW9kVG90YWxBdmFpbGFibGVUb0NsYWltCQDMCAIJAKQDAQUcdXNkdFByaWNlQXNzZXRBbGxvd2FibGVSYXRpbwkAzAgCCQCkAwEFGmN1cnJlbnRVc2R0UHJpY2VBc3NldFJhdGlvCQDMCAIJAKQDAQUTZW5kUGVyaW9kQmxvY2tzTGVmdAkAzAgCCQCkAwEFGnVzZXJUb3RhbFByaWNlQXNzZXRDbGFpbWVkBQNuaWwFA1NFUAkAlAoCBQNuaWwFDHJlc3VsdFN0cmluZwECdHgBBnZlcmlmeQAED3RhcmdldFB1YmxpY0tleQQHJG1hdGNoMAkBFm1hbmFnZXJQdWJsaWNLZXlPclVuaXQAAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAnBrBQckbWF0Y2gwBQJwawMJAAECBQckbWF0Y2gwAgRVbml0CAUCdHgPc2VuZGVyUHVibGljS2V5CQACAQILTWF0Y2ggZXJyb3IJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAFD3RhcmdldFB1YmxpY0tleWfQ6JA=", "height": 2932668, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 6wXwheUY3rpdrUDcVj4odsPa7cnjXsvPJCCmWXt3xo91 Next: GErWcMS4rUkmR8JXvMYfHgBSDNYMqgBPAKixYt9kNH1M Diff:
OldNewDifferences
384384 let investorPriceAssetBalance = parseIntValue(investor[IdxInvClaimedPriceAssetAmount])
385385 let investorIdoAssetBalance = parseIntValue(investor[IdxInvClaimedIdoAssetAmount])
386386 let investorLastClaimedHeight = parseIntValue(investor[IdxInvLastClaimedHeight])
387- let priceAssetAmount = valueOrElse(getInteger(keyPriceAssetBalance(userAddress58)), 0)
388- let investorKeyRemainingAmount = parseIntValue(valueOrElse(getString(keyInvestorRemainingAmount(userAddress58)), "0"))
387+ let $t01793418146 = match getInteger(keyPriceAssetBalance(userAddress58)) {
388+ case t: Int =>
389+ $Tuple2(t, [IntegerEntry(keyPriceAssetBalance(userAddress58), 0)])
390+ case _ =>
391+ $Tuple2(0, nil)
392+ }
393+ let priceAssetAmount = $t01793418146._1
394+ let priceAssetActions = $t01793418146._2
395+ let $t01815018413 = match getString(keyInvestorRemainingAmount(userAddress58)) {
396+ case t: String =>
397+ $Tuple2(parseIntValue(t), [StringEntry(keyInvestorRemainingAmount(userAddress58), "0")])
398+ case _ =>
399+ $Tuple2(0, nil)
400+ }
401+ let investorKeyRemainingAmount = $t01815018413._1
402+ let investorKeyRemainingActions = $t01815018413._2
389403 let totalIdoAssetSendAmount = (((investorRemainingAmount + priceAssetAmount) + investorKeyRemainingAmount) * 100)
390404 let totalIdoAssetForInvestorData = ((investorRemainingAmount + investorKeyRemainingAmount) * 100)
391405 let newInvestor = makeString(["%d%d%d%d%d", toString(investorTotalAmount), "0", toString(investorPriceAssetBalance), toString((investorIdoAssetBalance + totalIdoAssetForInvestorData)), toString(height)], SEP)
406+ let investorDataActions = if ((totalIdoAssetForInvestorData != 0))
407+ then [StringEntry(keyInvestor(userAddress58), newInvestor)]
408+ else nil
409+ let sendIdoAssetActions = if ((totalIdoAssetSendAmount != 0))
410+ then [ScriptTransfer(addressFromStringValue(userAddress58), totalIdoAssetSendAmount, fromBase58String(idoAssetId58))]
411+ else nil
392412 let historyActions = ClaimOperationHistoryEntry(userAddress58, 0, totalIdoAssetSendAmount, txId)
393- $Tuple4(investorRemainingAmount, priceAssetAmount, investorKeyRemainingAmount, ([StringEntry(keyInvestor(userAddress58), newInvestor), StringEntry(keyInvestorRemainingAmount(userAddress58), "0"), IntegerEntry(keyPriceAssetBalance(userAddress58), 0), ScriptTransfer(addressFromStringValue(userAddress58), totalIdoAssetSendAmount, fromBase58String(idoAssetId58))] :+ historyActions))
413+ $Tuple4(investorRemainingAmount, priceAssetAmount, investorKeyRemainingAmount, ((((sendIdoAssetActions :+ investorDataActions) :+ totalIdoAssetForInvestorData) :+ priceAssetActions) :+ historyActions))
394414 }
395415
396416
490510 let priceAssetDecimals = value(assetInfo(fromBase58String(priceAssetId58))).decimals
491511 let entries = if ((claimedAssetId58 == priceAssetId58))
492512 then {
493- let $t02408524529 = internalClaimV2(priceAssetId58, userAddress58, outAmount, totalsDiff[IdxDiffClaimedPriceAmountIncrement])
494- let periodMinAvailableToClaim = $t02408524529._1
495- let periodTotalAvailableToClaim = $t02408524529._2
496- let periodUserAvailableToClaim = $t02408524529._3
497- let totalUserAvailableToClaim = $t02408524529._4
498- let usdtPriceAssetAllowableRatio = $t02408524529._5
499- let currentUsdtPriceAssetRatio = $t02408524529._6
500- let endPeriodBlocksLeft = $t02408524529._7
501- let updatedCurrentPeriod = $t02408524529._8
502- let periodStart = $t02408524529._9
503- let periodEnd = $t02408524529._10
513+ let $t02448324927 = internalClaimV2(priceAssetId58, userAddress58, outAmount, totalsDiff[IdxDiffClaimedPriceAmountIncrement])
514+ let periodMinAvailableToClaim = $t02448324927._1
515+ let periodTotalAvailableToClaim = $t02448324927._2
516+ let periodUserAvailableToClaim = $t02448324927._3
517+ let totalUserAvailableToClaim = $t02448324927._4
518+ let usdtPriceAssetAllowableRatio = $t02448324927._5
519+ let currentUsdtPriceAssetRatio = $t02448324927._6
520+ let endPeriodBlocksLeft = $t02448324927._7
521+ let updatedCurrentPeriod = $t02448324927._8
522+ let periodStart = $t02448324927._9
523+ let periodEnd = $t02448324927._10
504524 let checks = [if ((periodUserAvailableToClaim > 0))
505525 then true
506526 else throwErr("unavailable to claim because user period allowance reached"), if ((periodTotalAvailableToClaim > 0))
646666 let priceAssetBalance = valueOrElse(getInteger(keyPriceAssetBalance(userAddress58)), 0)
647667 let priceAssetBalanceIdoDecimals = (priceAssetBalance * 100)
648668 let availableIdoAmountToClaimWithPriceAssetBalance = (availableIdoAmountToClaim + priceAssetBalanceIdoDecimals)
649- let $t03597636388 = internalClaimV2(priceAssetId58, userAddress58, outAmount, totalsDiff[IdxDiffClaimedPriceAmountIncrement])
650- let periodMinAvailableToClaim = $t03597636388._1
651- let periodTotalAvailableToClaim = $t03597636388._2
652- let periodUserAvailableToClaim = $t03597636388._3
653- let totalUserAvailableToClaim = $t03597636388._4
654- let usdtPriceAssetAllowableRatio = $t03597636388._5
655- let currentUsdtPriceAssetRatio = $t03597636388._6
656- let endPeriodBlocksLeft = $t03597636388._7
657- let updatedCurrentPeriod = $t03597636388._8
658- let periodStart = $t03597636388._9
659- let periodEnd = $t03597636388._10
669+ let $t03637436786 = internalClaimV2(priceAssetId58, userAddress58, outAmount, totalsDiff[IdxDiffClaimedPriceAmountIncrement])
670+ let periodMinAvailableToClaim = $t03637436786._1
671+ let periodTotalAvailableToClaim = $t03637436786._2
672+ let periodUserAvailableToClaim = $t03637436786._3
673+ let totalUserAvailableToClaim = $t03637436786._4
674+ let usdtPriceAssetAllowableRatio = $t03637436786._5
675+ let currentUsdtPriceAssetRatio = $t03637436786._6
676+ let endPeriodBlocksLeft = $t03637436786._7
677+ let updatedCurrentPeriod = $t03637436786._8
678+ let periodStart = $t03637436786._9
679+ let periodEnd = $t03637436786._10
660680 let currentPeriodEndHeight = valueOrElse(getInteger(keyPeriodEndHeight(updatedCurrentPeriod)), 0)
661681 let userTotalPriceAssetClaimed = (parseIntValue(readInvestorArrayOrFail(userAddress58)[IdxInvClaimedPriceAssetAmount]) - priceAssetBalance)
662682 let resultString = if ((height > currentPeriodEndHeight))
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 func getStringOrFail (key) = valueOrErrorMessage(getString(key), (("mandatory this." + key) + " is not defined"))
55
66
77 let SEP = "__"
88
99 let BUFSCALE = toBigInt(1000000000000000000)
1010
1111 let scale8 = 100000000
1212
1313 func throwErr (msg) = throw(makeString(["ido.ride:", msg], " "))
1414
1515
1616 func asString (val) = match val {
1717 case valStr: String =>
1818 valStr
1919 case _ =>
2020 throw("fail to cast into String")
2121 }
2222
2323
2424 func convertPriceAssetIntoIdoAsset (priceAssetAmount,priceAssetMULT,price,priceMULT,idoAssetMULT) = {
2525 let bPriceAssetMULT = toBigInt(priceAssetMULT)
2626 let bIdoAssetMULT = toBigInt(idoAssetMULT)
2727 let bPriceAssetBUF = fraction(toBigInt(priceAssetAmount), BUFSCALE, bPriceAssetMULT)
2828 let bAmountAssetBUF = fraction(bPriceAssetBUF, toBigInt(priceMULT), toBigInt(price))
2929 toInt(fraction(bAmountAssetBUF, toBigInt(idoAssetMULT), BUFSCALE))
3030 }
3131
3232
3333 let IdxCfgIdoStart = 1
3434
3535 let IdxCfgIdoDuration = 2
3636
3737 let IdxCfgClaimStart = 3
3838
3939 let IdxCfgClaimDuration = 4
4040
4141 let IdxCfgPrice = 5
4242
4343 let IdxCfgPriceMult = 6
4444
4545 let IdxCfgIdoAssetId = 7
4646
4747 let IdxCfgIdoAssetMult = 8
4848
4949 let IdxCfgPriceAssetId = 9
5050
5151 let IdxCfgPriceAssetMult = 10
5252
5353 let IdxCfgMinInvestAmount = 11
5454
5555 func fromatConfigS (idoStart,idoDuration,claimStart,claimDuration,price,priceMult,idoAssetId58,idoAssetMult,priceAssetId58,priceAssetMult,minInvestAmount,totalIdoAssetToSell) = makeString(["%d%d%d%d%d%d%s%d%s%d%d%d", idoStart, idoDuration, claimStart, claimDuration, price, priceMult, idoAssetId58, idoAssetMult, priceAssetId58, priceAssetMult, minInvestAmount, totalIdoAssetToSell], SEP)
5656
5757
5858 func fromatConfig (idoStart,idoDuration,claimStart,claimDuration,price,priceMult,idoAssetId58,idoAssetMult,priceAssetId58,priceAssetMult,minInvestAmount,totalIdoAssetToSell) = fromatConfigS(toString(idoStart), toString(idoDuration), toString(claimStart), toString(claimDuration), toString(price), toString(priceMult), idoAssetId58, toString(idoAssetMult), priceAssetId58, toString(priceAssetMult), toString(minInvestAmount), toString(totalIdoAssetToSell))
5959
6060
6161 let IdxInvTotalAmount = 1
6262
6363 let IdxInvRemainingAmount = 2
6464
6565 let IdxInvClaimedPriceAssetAmount = 3
6666
6767 let IdxInvClaimedIdoAssetAmount = 4
6868
6969 let IdxInvLastClaimedHeight = 5
7070
7171 func formatInvestorS (totalAmount,remainingAmount,claimedPriceAssetAmount,claimedIdoAssetAmount,lastClaimedHeight) = makeString(["%d%d%d%d%d", totalAmount, remainingAmount, claimedPriceAssetAmount, claimedIdoAssetAmount, lastClaimedHeight], SEP)
7272
7373
7474 func formatInvestor (totalAmount,remainingAmount,claimedPriceAssetAmount,claimedIdoAssetAmount,lastClaimedHeight) = formatInvestorS(toString(totalAmount), toString(remainingAmount), toString(claimedPriceAssetAmount), toString(claimedIdoAssetAmount), toString(lastClaimedHeight))
7575
7676
7777 func formatHistoryRecord (priceAssetAmount,idoAssetAmount) = makeString(["%d%d%d%d", toString(height), toString(lastBlock.timestamp), toString(priceAssetAmount), toString(idoAssetAmount)], SEP)
7878
7979
8080 func keyConfig () = "%s__config"
8181
8282
8383 func keyInvestor (userAddress) = ("%s__" + userAddress)
8484
8585
8686 func keyTotals () = "%s__totals"
8787
8888
8989 func keyOperationHistoryRecord (type,userAddress,txId58) = makeString(["%s%s%s%s__history", type, userAddress, txId58], SEP)
9090
9191
9292 func keyUSDNClaimDisabled () = "%s__usdnClaimDisabled"
9393
9494
9595 func keyUSDNClaimEndHeight () = "%s__usdnClaimEndHeight"
9696
9797
9898 func keyPeriodLength () = makeString(["%s", "periodLength"], SEP)
9999
100100
101101 func keyCurrentPeriod () = makeString(["%s", "currentPeriod"], SEP)
102102
103103
104104 func keyPeriodStartHeight (periodNum) = makeString(["%s%s", "periodStartHeight", toString(periodNum)], SEP)
105105
106106
107107 func keyPeriodEndHeight (periodNum) = makeString(["%s%s", "periodEndHeight", toString(periodNum)], SEP)
108108
109109
110110 func keyUsdtPriceAssetAllowableRatio () = makeString(["%s", "usdtPriceAssetAllowableRatio"], SEP)
111111
112112
113113 func keyTotalPeriodAllowance (assetId) = makeString(["%s%s", "totalPeriodAllowance", assetId], SEP)
114114
115115
116116 func keyUserPeriodAllowance (assetId) = makeString(["%s%s", "userPeriodAllowance", assetId], SEP)
117117
118118
119119 func keyPeriodTotalAvailableToClaim (assetId,periodNum) = makeString(["%s%s%s", "periodTotalAvailableToClaim", assetId, toString(periodNum)], SEP)
120120
121121
122122 func keyPeriodUserAvailableToClaim (assetId,periodNum,userAddress) = makeString(["%s%s%s%s", "periodUserAvailableToClaim", assetId, toString(periodNum), userAddress], SEP)
123123
124124
125125 func keyUsdtPriceAssetStablePool () = makeString(["%s", "usdtPriceAssetStablePool"], SEP)
126126
127127
128128 func keyUsdtAssetId () = makeString(["%s", "usdtAssetId"], SEP)
129129
130130
131131 func keyPriceAssetBalance (address) = makeString(["%s%s", "priceAssetBalance", address], SEP)
132132
133133
134134 func keyInvestorRemainingAmount (address) = makeString(["%s%s", "investorRemainingAmount", address], SEP)
135135
136136
137137 func keyTotalRemainingAmount () = makeString(["%s", "totalRemainingAmount"], SEP)
138138
139139
140140 func keyManagerPublicKey () = "%s__managerPublicKey"
141141
142142
143143 func keyManagerVaultAddress () = "%s__managerVaultAddress"
144144
145145
146146 func keyClaimClosingHeight () = "%s__claimClosingHeight"
147147
148148
149149 let claimClosingHeight = valueOrElse(getInteger(this, keyClaimClosingHeight()), 0)
150150
151151 func readConfigArray () = split(getStringOrFail(keyConfig()), SEP)
152152
153153
154154 func readTotalsArrayOrDefaultByCustomKey (customKey) = split(valueOrElse(getString(customKey), formatInvestorS("0", "0", "0", "0", "0")), SEP)
155155
156156
157157 func readTotalsArrayOrDefault () = readTotalsArrayOrDefaultByCustomKey(keyTotals())
158158
159159
160160 func readInvestorArrayOrDefault (userAddress) = readTotalsArrayOrDefaultByCustomKey(keyInvestor(userAddress))
161161
162162
163163 func readInvestorArrayOrFail (userAddress) = split(getStringOrFail(keyInvestor(userAddress)), SEP)
164164
165165
166166 func getManagerVaultAddressOrThis () = match getString(keyManagerVaultAddress()) {
167167 case s: String =>
168168 addressFromStringValue(s)
169169 case _ =>
170170 this
171171 }
172172
173173
174174 let IdxDiffTotalIncrement = 0
175175
176176 let IdxDiffRemainingPriceAmountIncrement = 1
177177
178178 let IdxDiffClaimedPriceAmountIncrement = 2
179179
180180 let IdxDiffClaimedIdoAssetAmountIncrement = 3
181181
182182 func TotalsEntry (key,origArray,incrementDiff,newLastClaimedHeight,priceAssetBalance) = {
183183 let totalAmount = parseIntValue(origArray[IdxInvTotalAmount])
184184 let remainingAmount = parseIntValue(origArray[IdxInvRemainingAmount])
185185 let claimedPriceAssetAmount = parseIntValue(origArray[IdxInvClaimedPriceAssetAmount])
186186 let claimedIdoAssetAmount = parseIntValue(origArray[IdxInvClaimedIdoAssetAmount])
187187 let lastClaimedHeight = parseIntValue(origArray[IdxInvLastClaimedHeight])
188188 let newTotalAmount = (totalAmount + incrementDiff[IdxDiffTotalIncrement])
189189 let newRemainingAmount = (remainingAmount + incrementDiff[IdxDiffRemainingPriceAmountIncrement])
190190 let cfgArray = readConfigArray()
191191 let priceAssetId58 = cfgArray[IdxCfgPriceAssetId]
192192 let priceAssetDecimals = value(assetInfo(fromBase58String(priceAssetId58))).decimals
193193 let priceAssetBalancePriceAssetDecimals = fraction(priceAssetBalance, scale8, pow(10, 0, priceAssetDecimals, 0, 0, DOWN))
194194 let newClaimedPriceAssetAmount = ((claimedPriceAssetAmount + incrementDiff[IdxDiffClaimedPriceAmountIncrement]) - priceAssetBalance)
195195 let newClaimedIdoAssetAmount = ((claimedIdoAssetAmount + incrementDiff[IdxDiffClaimedIdoAssetAmountIncrement]) + priceAssetBalancePriceAssetDecimals)
196196 let entries = if ((0 > newRemainingAmount))
197197 then {
198198 let diff = ((newTotalAmount - newClaimedPriceAssetAmount) - newClaimedIdoAssetAmount)
199199 let newLogicRemainingAmount = if ((0 > diff))
200200 then 0
201201 else diff
202202 StringEntry(key, formatInvestor(newTotalAmount, newLogicRemainingAmount, newClaimedPriceAssetAmount, newClaimedIdoAssetAmount, newLastClaimedHeight))
203203 }
204204 else StringEntry(key, formatInvestor(newTotalAmount, newRemainingAmount, newClaimedPriceAssetAmount, newClaimedIdoAssetAmount, newLastClaimedHeight))
205205 entries
206206 }
207207
208208
209209 func InvestOperationHistoryEntry (userAddress,priceAssetAmount,idoAssetAmount,txId) = StringEntry(keyOperationHistoryRecord("invest", userAddress, toBase58String(txId)), formatHistoryRecord(priceAssetAmount, idoAssetAmount))
210210
211211
212212 func ClaimOperationHistoryEntry (userAddress,priceAssetAmount,idoAssetAmount,txId) = StringEntry(keyOperationHistoryRecord("claim", userAddress, toBase58String(txId)), formatHistoryRecord(priceAssetAmount, idoAssetAmount))
213213
214214
215215 func internalClaim (claimedAssetId58,userAddress,txId) = {
216216 let cfgArray = readConfigArray()
217217 let claimStart = parseIntValue(cfgArray[IdxCfgClaimStart])
218218 let claimDuration = parseIntValue(cfgArray[IdxCfgClaimDuration])
219219 let claimEnd = (claimStart + claimDuration)
220220 let price = parseIntValue(cfgArray[IdxCfgPrice])
221221 let priceMult = parseIntValue(cfgArray[IdxCfgPriceMult])
222222 let idoAssetId58 = cfgArray[IdxCfgIdoAssetId]
223223 let idoAssetId = fromBase58String(idoAssetId58)
224224 let idoAssetMult = parseIntValue(cfgArray[IdxCfgIdoAssetMult])
225225 let priceAssetId58 = cfgArray[IdxCfgPriceAssetId]
226226 let priceAssetId = fromBase58String(priceAssetId58)
227227 let priceAssetMult = parseIntValue(cfgArray[IdxCfgPriceAssetMult])
228228 let userAddress58 = toString(userAddress)
229229 let origInvestArray = readInvestorArrayOrFail(userAddress58)
230230 let investTotalAmount = parseIntValue(origInvestArray[IdxInvTotalAmount])
231231 let investLastClaimedHeightTMP = parseIntValue(origInvestArray[IdxInvLastClaimedHeight])
232232 let investLastClaimedHeight = if ((claimStart >= investLastClaimedHeightTMP))
233233 then claimStart
234234 else investLastClaimedHeightTMP
235235 let newClaimPeriodHeight = if ((height > claimEnd))
236236 then claimEnd
237237 else if ((claimStart > height))
238238 then claimStart
239239 else height
240240 let claimingBlocks = (newClaimPeriodHeight - investLastClaimedHeight)
241241 let claimingPriceAssetAmount = fraction(investTotalAmount, claimingBlocks, claimDuration)
242242 let claimingIdoAssetAmount = convertPriceAssetIntoIdoAsset(claimingPriceAssetAmount, priceAssetMult, price, priceMult, idoAssetMult)
243243 let isUSDN = (claimedAssetId58 == priceAssetId58)
244244 let isUSDNClaimDisabled = valueOrElse(getBoolean(keyUSDNClaimDisabled()), false)
245245 let checks = [if (!(if (isUSDN)
246246 then isUSDNClaimDisabled
247247 else false))
248248 then true
249249 else throw("USDN claim is disabled")]
250250 if ((checks == checks))
251251 then if ((claimedAssetId58 == priceAssetId58))
252252 then $Tuple6([0, -(claimingPriceAssetAmount), claimingPriceAssetAmount, 0], claimingPriceAssetAmount, priceAssetId, origInvestArray, newClaimPeriodHeight, [claimingPriceAssetAmount, claimingIdoAssetAmount])
253253 else if ((claimedAssetId58 == idoAssetId58))
254254 then $Tuple6([0, -(claimingPriceAssetAmount), 0, claimingIdoAssetAmount], claimingIdoAssetAmount, idoAssetId, origInvestArray, newClaimPeriodHeight, [claimingPriceAssetAmount, claimingIdoAssetAmount])
255255 else throw(("unsupported assetId: " + claimedAssetId58))
256256 else throw("Strict value is not equal to itself.")
257257 }
258258
259259
260260 func internalClaimV2 (priceAssetId58,userAddress58,outAmount,totalUserAvailableToClaim) = {
261261 let totalPeriodPriceAssetAllowance = value(getInteger(keyTotalPeriodAllowance(priceAssetId58)))
262262 let userPeriodPriceAssetAllowance = value(getInteger(keyUserPeriodAllowance(priceAssetId58)))
263263 let periodLength = value(getInteger(keyPeriodLength()))
264264 let currentPeriod = valueOrElse(getInteger(keyCurrentPeriod()), 0)
265265 let zeroPeriodEndHeighIsDefined = isDefined(getInteger(keyPeriodEndHeight(0)))
266266 let $t01327415144 = if ((currentPeriod > 0))
267267 then {
268268 let lastPeriodStartHeight = value(getInteger(keyPeriodStartHeight(currentPeriod)))
269269 let lastPeriodEndHeight = value(getInteger(keyPeriodEndHeight(currentPeriod)))
270270 let $t01353414239 = if ((height > lastPeriodEndHeight))
271271 then {
272272 let updatedCurrentPeriod = (currentPeriod + 1)
273273 let periodStart = if ((height > (lastPeriodEndHeight + periodLength)))
274274 then {
275275 let blocksToLastPeriodStart = ((height - lastPeriodEndHeight) % periodLength)
276276 if ((blocksToLastPeriodStart == 0))
277277 then ((height - periodLength) + 1)
278278 else (height - blocksToLastPeriodStart)
279279 }
280280 else (lastPeriodEndHeight + 1)
281281 let periodEnd = ((periodStart + periodLength) - 1)
282282 $Tuple3(updatedCurrentPeriod, periodStart, periodEnd)
283283 }
284284 else $Tuple3(currentPeriod, lastPeriodStartHeight, lastPeriodEndHeight)
285285 let updatedCurrentPeriod = $t01353414239._1
286286 let periodStart = $t01353414239._2
287287 let periodEnd = $t01353414239._3
288288 $Tuple3(updatedCurrentPeriod, periodStart, periodEnd)
289289 }
290290 else if (zeroPeriodEndHeighIsDefined)
291291 then {
292292 let zeroPeriodStartHeight = value(getInteger(keyPeriodStartHeight(0)))
293293 let zeroPeriodEndHeight = value(getInteger(keyPeriodEndHeight(0)))
294294 let $t01449414876 = if ((height > zeroPeriodEndHeight))
295295 then {
296296 let updatedCurrentPeriod = (currentPeriod + 1)
297297 let periodStart = (zeroPeriodEndHeight + 1)
298298 let periodEnd = ((periodStart + periodLength) - 1)
299299 $Tuple3(updatedCurrentPeriod, periodStart, periodEnd)
300300 }
301301 else $Tuple3(currentPeriod, zeroPeriodStartHeight, zeroPeriodEndHeight)
302302 let updatedCurrentPeriod = $t01449414876._1
303303 let periodStart = $t01449414876._2
304304 let periodEnd = $t01449414876._3
305305 $Tuple3(updatedCurrentPeriod, periodStart, periodEnd)
306306 }
307307 else $Tuple3(currentPeriod, valueOrElse(getInteger(keyPeriodStartHeight(currentPeriod)), height), valueOrElse(getInteger(keyPeriodEndHeight(currentPeriod)), ((height + periodLength) - 1)))
308308 let updatedCurrentPeriod = $t01327415144._1
309309 let periodStart = $t01327415144._2
310310 let periodEnd = $t01327415144._3
311311 let periodTotalAvailableToClaim = valueOrElse(getInteger(keyPeriodTotalAvailableToClaim(priceAssetId58, updatedCurrentPeriod)), totalPeriodPriceAssetAllowance)
312312 let periodUserAvailableToClaim = valueOrElse(getInteger(keyPeriodUserAvailableToClaim(priceAssetId58, updatedCurrentPeriod, userAddress58)), userPeriodPriceAssetAllowance)
313313 let priceAssetBalance = valueOrElse(getInteger(keyPriceAssetBalance(userAddress58)), 0)
314314 let periodMinAvailableToClaim = min([(outAmount + priceAssetBalance), periodTotalAvailableToClaim, periodUserAvailableToClaim])
315315 let usdtPriceAssetAllowableRatio = value(getInteger(keyUsdtPriceAssetAllowableRatio()))
316316 let putOneTknV2PriceAssetAmount = scale8
317317 let $t01589916152 = {
318318 let @ = invoke(addressFromStringValue(value(getString(keyUsdtPriceAssetStablePool()))), "putOneTknV2WithoutTakeFeeREADONLY", [putOneTknV2PriceAssetAmount, priceAssetId58], nil)
319319 if ($isInstanceOf(@, "(Int, Int, Int)"))
320320 then @
321321 else throw(($getType(@) + " couldn't be cast to (Int, Int, Int)"))
322322 }
323323 if (($t01589916152 == $t01589916152))
324324 then {
325325 let bonus = $t01589916152._3
326326 let feeAmount = $t01589916152._2
327327 let lpAmount = $t01589916152._1
328328 let usdtAssetId = value(getString(keyUsdtAssetId()))
329329 let $t01621416432 = {
330330 let @ = invoke(addressFromStringValue(value(getString(keyUsdtPriceAssetStablePool()))), "getOneTknV2READONLY", [usdtAssetId, lpAmount], nil)
331331 if ($isInstanceOf(@, "(Int, Int)"))
332332 then @
333333 else throw(($getType(@) + " couldn't be cast to (Int, Int)"))
334334 }
335335 if (($t01621416432 == $t01621416432))
336336 then {
337337 let getOneTknV2FeeAmount = $t01621416432._2
338338 let usdtAmount = $t01621416432._1
339339 let currentUsdtPriceAssetRatio = fraction(putOneTknV2PriceAssetAmount, scale8, usdtAmount)
340340 let endPeriodBlocksLeft = (periodEnd - height)
341341 $Tuple10(periodMinAvailableToClaim, periodTotalAvailableToClaim, periodUserAvailableToClaim, totalUserAvailableToClaim, usdtPriceAssetAllowableRatio, currentUsdtPriceAssetRatio, endPeriodBlocksLeft, updatedCurrentPeriod, periodStart, periodEnd)
342342 }
343343 else throw("Strict value is not equal to itself.")
344344 }
345345 else throw("Strict value is not equal to itself.")
346346 }
347347
348348
349349 func managerPublicKeyOrUnit () = {
350350 let managerVaultAddress = getManagerVaultAddressOrThis()
351351 match getString(managerVaultAddress, keyManagerPublicKey()) {
352352 case s: String =>
353353 fromBase58String(s)
354354 case _: Unit =>
355355 unit
356356 case _ =>
357357 throw("Match error")
358358 }
359359 }
360360
361361
362362 func mustManager (i) = {
363363 let pd = throw("Permission denied")
364364 match managerPublicKeyOrUnit() {
365365 case pk: ByteVector =>
366366 if ((i.callerPublicKey == pk))
367367 then true
368368 else pd
369369 case _: Unit =>
370370 if ((i.caller == this))
371371 then true
372372 else pd
373373 case _ =>
374374 throw("Match error")
375375 }
376376 }
377377
378378
379379 func getClaimForState (userAddress58,txId) = {
380380 let idoAssetId58 = readConfigArray()[IdxCfgIdoAssetId]
381381 let investor = split(value(getString(keyInvestor(userAddress58))), SEP)
382382 let investorTotalAmount = parseIntValue(investor[IdxInvTotalAmount])
383383 let investorRemainingAmount = parseIntValue(investor[IdxInvRemainingAmount])
384384 let investorPriceAssetBalance = parseIntValue(investor[IdxInvClaimedPriceAssetAmount])
385385 let investorIdoAssetBalance = parseIntValue(investor[IdxInvClaimedIdoAssetAmount])
386386 let investorLastClaimedHeight = parseIntValue(investor[IdxInvLastClaimedHeight])
387- let priceAssetAmount = valueOrElse(getInteger(keyPriceAssetBalance(userAddress58)), 0)
388- let investorKeyRemainingAmount = parseIntValue(valueOrElse(getString(keyInvestorRemainingAmount(userAddress58)), "0"))
387+ let $t01793418146 = match getInteger(keyPriceAssetBalance(userAddress58)) {
388+ case t: Int =>
389+ $Tuple2(t, [IntegerEntry(keyPriceAssetBalance(userAddress58), 0)])
390+ case _ =>
391+ $Tuple2(0, nil)
392+ }
393+ let priceAssetAmount = $t01793418146._1
394+ let priceAssetActions = $t01793418146._2
395+ let $t01815018413 = match getString(keyInvestorRemainingAmount(userAddress58)) {
396+ case t: String =>
397+ $Tuple2(parseIntValue(t), [StringEntry(keyInvestorRemainingAmount(userAddress58), "0")])
398+ case _ =>
399+ $Tuple2(0, nil)
400+ }
401+ let investorKeyRemainingAmount = $t01815018413._1
402+ let investorKeyRemainingActions = $t01815018413._2
389403 let totalIdoAssetSendAmount = (((investorRemainingAmount + priceAssetAmount) + investorKeyRemainingAmount) * 100)
390404 let totalIdoAssetForInvestorData = ((investorRemainingAmount + investorKeyRemainingAmount) * 100)
391405 let newInvestor = makeString(["%d%d%d%d%d", toString(investorTotalAmount), "0", toString(investorPriceAssetBalance), toString((investorIdoAssetBalance + totalIdoAssetForInvestorData)), toString(height)], SEP)
406+ let investorDataActions = if ((totalIdoAssetForInvestorData != 0))
407+ then [StringEntry(keyInvestor(userAddress58), newInvestor)]
408+ else nil
409+ let sendIdoAssetActions = if ((totalIdoAssetSendAmount != 0))
410+ then [ScriptTransfer(addressFromStringValue(userAddress58), totalIdoAssetSendAmount, fromBase58String(idoAssetId58))]
411+ else nil
392412 let historyActions = ClaimOperationHistoryEntry(userAddress58, 0, totalIdoAssetSendAmount, txId)
393- $Tuple4(investorRemainingAmount, priceAssetAmount, investorKeyRemainingAmount, ([StringEntry(keyInvestor(userAddress58), newInvestor), StringEntry(keyInvestorRemainingAmount(userAddress58), "0"), IntegerEntry(keyPriceAssetBalance(userAddress58), 0), ScriptTransfer(addressFromStringValue(userAddress58), totalIdoAssetSendAmount, fromBase58String(idoAssetId58))] :+ historyActions))
413+ $Tuple4(investorRemainingAmount, priceAssetAmount, investorKeyRemainingAmount, ((((sendIdoAssetActions :+ investorDataActions) :+ totalIdoAssetForInvestorData) :+ priceAssetActions) :+ historyActions))
394414 }
395415
396416
397417 @Callable(i)
398418 func constructor (idoStart,idoDuration,claimStart,claimDuration,price,priceAssetId58,minInvestAmount) = {
399419 let priceMult = ((100 * 1000) * 1000)
400420 let idoEnd = (idoStart + idoDuration)
401421 if (isDefined(getString(keyConfig())))
402422 then throw("already initialized")
403423 else if (("3PMEHLx1j6zerarZTYfsGqDeeZqQoMpxq5S" != toString(i.caller)))
404424 then throw("not authorized")
405425 else if ((size(i.payments) != 1))
406426 then throw("exactly 1 payment must be attached")
407427 else if ((idoEnd >= claimStart))
408428 then throw("claimStart must be greater than idoEnd")
409429 else {
410430 let pmt = value(i.payments[0])
411431 let idoAssetId = value(pmt.assetId)
412432 let idoAssetInfo = valueOrErrorMessage(assetInfo(idoAssetId), "fail to load ido asset info")
413433 let idoAssetId58 = toBase58String(idoAssetId)
414434 let idoAssetMult = pow(10, 0, idoAssetInfo.decimals, 0, 0, DOWN)
415435 let priceAssetId = fromBase58String(priceAssetId58)
416436 let priceAssetInfo = valueOrErrorMessage(assetInfo(priceAssetId), "fail to load price asset info")
417437 let priceAssetMult = pow(10, 0, priceAssetInfo.decimals, 0, 0, DOWN)
418438 let origTotalsArray = readTotalsArrayOrDefault()
419439 let totalsDiff = [0, 0, 0, 0]
420440 [StringEntry(keyConfig(), fromatConfig(idoStart, idoDuration, claimStart, claimDuration, price, priceMult, idoAssetId58, idoAssetMult, priceAssetId58, priceAssetMult, minInvestAmount, pmt.amount)), TotalsEntry(keyTotals(), origTotalsArray, totalsDiff, claimStart, 0)]
421441 }
422442 }
423443
424444
425445
426446 @Callable(i)
427447 func invest () = {
428448 let cfgArray = readConfigArray()
429449 let idoStart = parseIntValue(cfgArray[IdxCfgIdoStart])
430450 let idoDuration = parseIntValue(cfgArray[IdxCfgIdoDuration])
431451 let idoEnd = (idoStart + idoDuration)
432452 let claimStart = parseIntValue(cfgArray[IdxCfgClaimStart])
433453 let claimDuration = parseIntValue(cfgArray[IdxCfgClaimDuration])
434454 let price = parseIntValue(cfgArray[IdxCfgPrice])
435455 let priceMult = parseIntValue(cfgArray[IdxCfgPriceMult])
436456 let idoAssetId58 = cfgArray[IdxCfgIdoAssetId]
437457 let idoAssetId = fromBase58String(idoAssetId58)
438458 let idoAssetMult = parseIntValue(cfgArray[IdxCfgIdoAssetMult])
439459 let priceAssetId58 = cfgArray[IdxCfgPriceAssetId]
440460 let priceAssetId = fromBase58String(priceAssetId58)
441461 let priceAssetMult = parseIntValue(cfgArray[IdxCfgPriceAssetMult])
442462 let minIvestAmount = parseIntValue(cfgArray[IdxCfgMinInvestAmount])
443463 let userAddress = toString(i.caller)
444464 if ((idoStart > height))
445465 then throw("ido has not been started yet")
446466 else if ((height > idoEnd))
447467 then throw("ido has been already ended")
448468 else if ((size(i.payments) != 1))
449469 then throw("exactly 1 payment is expected")
450470 else {
451471 let pmt = value(i.payments[0])
452472 let pmtAssetId = value(pmt.assetId)
453473 let pmtAmount = pmt.amount
454474 if ((pmtAssetId != priceAssetId))
455475 then throw((("invalid payment asset id: " + toBase58String(pmtAssetId)) + " is expected"))
456476 else {
457477 let origInvestorArray = readInvestorArrayOrDefault(userAddress)
458478 let origTotalsArray = readTotalsArrayOrDefault()
459479 let newPriceTotalAmount = (parseIntValue(origTotalsArray[IdxInvTotalAmount]) + pmtAmount)
460480 let requiredIdoAssetAmount = (newPriceTotalAmount * 100)
461481 if ((requiredIdoAssetAmount > assetBalance(this, idoAssetId)))
462482 then throw("IDO asset has been - sold consider to use smaller payment")
463483 else {
464484 let totalsDiff = [pmtAmount, pmtAmount, 0, 0]
465485 [TotalsEntry(keyInvestor(userAddress), origInvestorArray, totalsDiff, claimStart, 0), TotalsEntry(keyTotals(), origTotalsArray, totalsDiff, claimStart, 0), InvestOperationHistoryEntry(userAddress, pmtAmount, 0, i.transactionId)]
466486 }
467487 }
468488 }
469489 }
470490
471491
472492
473493 @Callable(i)
474494 func claim (claimedAssetId58,userAddress58) = {
475495 let callerAddress58 = toString(i.caller)
476496 if ((userAddress58 != callerAddress58))
477497 then throw("not authorized")
478498 else {
479499 let cfgArray = readConfigArray()
480500 let priceAssetId58 = cfgArray[IdxCfgPriceAssetId]
481501 let claimResultTuple = internalClaim(claimedAssetId58, i.caller, i.transactionId)
482502 let totalsDiff = claimResultTuple._1
483503 let outAmount = claimResultTuple._2
484504 let outAssetId = claimResultTuple._3
485505 let origInvestArray = claimResultTuple._4
486506 let newClaimPeriodHeight = claimResultTuple._5
487507 let claimedPriceAmountFromDiff = totalsDiff[IdxDiffClaimedPriceAmountIncrement]
488508 let claimedIdoAssetAmountFromDiff = totalsDiff[IdxDiffClaimedIdoAssetAmountIncrement]
489509 let priceAssetBalance = valueOrElse(getInteger(keyPriceAssetBalance(userAddress58)), 0)
490510 let priceAssetDecimals = value(assetInfo(fromBase58String(priceAssetId58))).decimals
491511 let entries = if ((claimedAssetId58 == priceAssetId58))
492512 then {
493- let $t02408524529 = internalClaimV2(priceAssetId58, userAddress58, outAmount, totalsDiff[IdxDiffClaimedPriceAmountIncrement])
494- let periodMinAvailableToClaim = $t02408524529._1
495- let periodTotalAvailableToClaim = $t02408524529._2
496- let periodUserAvailableToClaim = $t02408524529._3
497- let totalUserAvailableToClaim = $t02408524529._4
498- let usdtPriceAssetAllowableRatio = $t02408524529._5
499- let currentUsdtPriceAssetRatio = $t02408524529._6
500- let endPeriodBlocksLeft = $t02408524529._7
501- let updatedCurrentPeriod = $t02408524529._8
502- let periodStart = $t02408524529._9
503- let periodEnd = $t02408524529._10
513+ let $t02448324927 = internalClaimV2(priceAssetId58, userAddress58, outAmount, totalsDiff[IdxDiffClaimedPriceAmountIncrement])
514+ let periodMinAvailableToClaim = $t02448324927._1
515+ let periodTotalAvailableToClaim = $t02448324927._2
516+ let periodUserAvailableToClaim = $t02448324927._3
517+ let totalUserAvailableToClaim = $t02448324927._4
518+ let usdtPriceAssetAllowableRatio = $t02448324927._5
519+ let currentUsdtPriceAssetRatio = $t02448324927._6
520+ let endPeriodBlocksLeft = $t02448324927._7
521+ let updatedCurrentPeriod = $t02448324927._8
522+ let periodStart = $t02448324927._9
523+ let periodEnd = $t02448324927._10
504524 let checks = [if ((periodUserAvailableToClaim > 0))
505525 then true
506526 else throwErr("unavailable to claim because user period allowance reached"), if ((periodTotalAvailableToClaim > 0))
507527 then true
508528 else throwErr("unavailable to claim because total period allowance reached"), if ((periodMinAvailableToClaim > 0))
509529 then true
510530 else throwErr("nothing to claim"), if ((usdtPriceAssetAllowableRatio > currentUsdtPriceAssetRatio))
511531 then true
512532 else throwErr("unavailable to claim because usdn price lower than usdtPriceAssetAllowableRatio"), if (if (if ((claimedAssetId58 != priceAssetId58))
513533 then true
514534 else (claimClosingHeight == 0))
515535 then true
516536 else (claimClosingHeight > height))
517537 then true
518538 else throwErr("Claim is disabled")]
519539 if ((checks == checks))
520540 then {
521541 let updatedPeriodTotalAvailableToClaim = (periodTotalAvailableToClaim - periodMinAvailableToClaim)
522542 let updatedPeriodUserAvailableToClaim = (periodUserAvailableToClaim - periodMinAvailableToClaim)
523543 let entries = if ((priceAssetBalance > periodMinAvailableToClaim))
524544 then [ScriptTransfer(i.caller, periodMinAvailableToClaim, outAssetId), IntegerEntry(keyPriceAssetBalance(userAddress58), (priceAssetBalance - periodMinAvailableToClaim))]
525545 else {
526546 let evaluateResult = split(asString(invoke(this, "claimREADONLY", [priceAssetId58, userAddress58], nil)), SEP)
527547 if ((evaluateResult == evaluateResult))
528548 then {
529549 let availablePriceAmountToClaim = parseIntValue(evaluateResult[3])
530550 let lastClaimEntries = if ((availablePriceAmountToClaim == periodMinAvailableToClaim))
531551 then {
532552 let investorTotalAmount = parseIntValue(origInvestArray[IdxInvTotalAmount])
533553 let investorRemainingAmount = parseIntValue(origInvestArray[IdxInvRemainingAmount])
534554 let investorPriceAssetBalance = parseIntValue(origInvestArray[IdxInvClaimedPriceAssetAmount])
535555 let investorIdoAssetBalance = parseIntValue(origInvestArray[IdxInvClaimedIdoAssetAmount])
536556 let investorLastClaimedHeight = parseIntValue(origInvestArray[IdxInvLastClaimedHeight])
537557 let newInvestArray = [toString(investorTotalAmount), "0", toString(investorPriceAssetBalance), toString(investorIdoAssetBalance), toString(investorLastClaimedHeight)]
538558 let totals = readTotalsArrayOrDefault()
539559 let totalsTotalAmount = parseIntValue(totals[IdxInvTotalAmount])
540560 let totalsRemainingAmount = parseIntValue(totals[IdxInvRemainingAmount])
541561 let totalsClaimedPriceAssetAmount = parseIntValue(totals[IdxInvClaimedPriceAssetAmount])
542562 let totalsClaimedIdoAssetAmount = parseIntValue(totals[IdxInvClaimedIdoAssetAmount])
543563 let totalsLastClaimedHeight = parseIntValue(totals[IdxInvLastClaimedHeight])
544564 let newTotalsRemainingAmount = (totalsRemainingAmount - investorRemainingAmount)
545565 let newTotalArray = [toString(totalsTotalAmount), toString(newTotalsRemainingAmount), toString(totalsClaimedPriceAssetAmount), toString(totalsClaimedIdoAssetAmount), toString(totalsLastClaimedHeight)]
546566 let newTotalRemainingAmount = (valueOrElse(getInteger(keyTotalRemainingAmount()), 0) + investorRemainingAmount)
547567 [StringEntry(keyInvestorRemainingAmount(userAddress58), toString(investorRemainingAmount)), StringEntry(keyTotalRemainingAmount(), toString(newTotalRemainingAmount)), TotalsEntry(keyInvestor(userAddress58), newInvestArray, totalsDiff, newClaimPeriodHeight, 0), TotalsEntry(keyTotals(), newTotalArray, totalsDiff, newClaimPeriodHeight, 0)]
548568 }
549569 else [TotalsEntry(keyInvestor(userAddress58), origInvestArray, totalsDiff, newClaimPeriodHeight, 0), TotalsEntry(keyTotals(), readTotalsArrayOrDefault(), totalsDiff, newClaimPeriodHeight, 0)]
550570 let updatedPriceAssetBalance = ((priceAssetBalance + outAmount) - periodMinAvailableToClaim)
551571 ([ScriptTransfer(i.caller, periodMinAvailableToClaim, outAssetId), IntegerEntry(keyPriceAssetBalance(userAddress58), updatedPriceAssetBalance)] ++ lastClaimEntries)
552572 }
553573 else throw("Strict value is not equal to itself.")
554574 }
555575 $Tuple2(([IntegerEntry(keyCurrentPeriod(), updatedCurrentPeriod), IntegerEntry(keyPeriodStartHeight(updatedCurrentPeriod), periodStart), IntegerEntry(keyPeriodEndHeight(updatedCurrentPeriod), periodEnd), IntegerEntry(keyPeriodTotalAvailableToClaim(priceAssetId58, updatedCurrentPeriod), updatedPeriodTotalAvailableToClaim), IntegerEntry(keyPeriodUserAvailableToClaim(priceAssetId58, updatedCurrentPeriod, userAddress58), updatedPeriodUserAvailableToClaim), ClaimOperationHistoryEntry(userAddress58, periodMinAvailableToClaim, claimedIdoAssetAmountFromDiff, i.transactionId)] ++ entries), unit)
556576 }
557577 else throw("Strict value is not equal to itself.")
558578 }
559579 else {
560580 let priceAssetBalanceIdoDecimals = fraction(priceAssetBalance, scale8, pow(10, 0, priceAssetDecimals, 0, 0, DOWN))
561581 $Tuple2([ScriptTransfer(i.caller, (outAmount + priceAssetBalanceIdoDecimals), outAssetId), IntegerEntry(keyPriceAssetBalance(userAddress58), 0), TotalsEntry(keyInvestor(userAddress58), origInvestArray, totalsDiff, newClaimPeriodHeight, priceAssetBalance), TotalsEntry(keyTotals(), readTotalsArrayOrDefault(), totalsDiff, newClaimPeriodHeight, priceAssetBalance), ClaimOperationHistoryEntry(userAddress58, claimedPriceAmountFromDiff, (claimedIdoAssetAmountFromDiff + priceAssetBalanceIdoDecimals), i.transactionId)], unit)
562582 }
563583 entries
564584 }
565585 }
566586
567587
568588
569589 @Callable(i)
570590 func cleanRemaingAmount (userAddress58) = {
571591 let priceAssetId58 = readConfigArray()[IdxCfgPriceAssetId]
572592 let evaluateResult = split(asString(invoke(this, "claimREADONLY", [priceAssetId58, userAddress58], nil)), SEP)
573593 if ((evaluateResult == evaluateResult))
574594 then {
575595 let availablePriceAmountToClaim = parseIntValue(evaluateResult[2])
576596 let checkUnclaimedAssets = if ((availablePriceAmountToClaim == 0))
577597 then true
578598 else throwErr("user have unclaimed assets")
579599 if ((checkUnclaimedAssets == checkUnclaimedAssets))
580600 then {
581601 let investor = split(value(getString(keyInvestor(userAddress58))), SEP)
582602 let investorTotalAmount = parseIntValue(investor[IdxInvTotalAmount])
583603 let investorRemainingAmount = parseIntValue(investor[IdxInvRemainingAmount])
584604 let investorPriceAssetBalance = parseIntValue(investor[IdxInvClaimedPriceAssetAmount])
585605 let investorIdoAssetBalance = parseIntValue(investor[IdxInvClaimedIdoAssetAmount])
586606 let investorLastClaimedHeight = parseIntValue(investor[IdxInvLastClaimedHeight])
587607 let investorRemainingAmountCheck = if ((investorRemainingAmount != 0))
588608 then true
589609 else throwErr("investorRemainingAmount already zero")
590610 if ((investorRemainingAmountCheck == investorRemainingAmountCheck))
591611 then {
592612 let newInvestor = makeString(["%d%d%d%d%d", toString(investorTotalAmount), "0", toString(investorPriceAssetBalance), toString(investorIdoAssetBalance), toString(investorLastClaimedHeight)], SEP)
593613 let totals = split(value(getString(keyTotals())), SEP)
594614 let totalsTotalAmount = parseIntValue(totals[IdxInvTotalAmount])
595615 let totalsRemainingAmount = parseIntValue(totals[IdxInvRemainingAmount])
596616 let totalsClaimedPriceAssetAmount = parseIntValue(totals[IdxInvClaimedPriceAssetAmount])
597617 let totalsClaimedIdoAssetAmount = parseIntValue(totals[IdxInvClaimedIdoAssetAmount])
598618 let totalsLastClaimedHeight = parseIntValue(totals[IdxInvLastClaimedHeight])
599619 let newTotals = makeString(["%d%d%d%d%d", toString(totalsTotalAmount), toString((totalsRemainingAmount - investorRemainingAmount)), toString(totalsClaimedPriceAssetAmount), toString(totalsClaimedIdoAssetAmount), toString(totalsLastClaimedHeight)], SEP)
600620 let newTotalRemainingAmount = (valueOrElse(getInteger(keyTotalRemainingAmount()), 0) + investorRemainingAmount)
601621 [StringEntry(keyInvestorRemainingAmount(userAddress58), toString(investorRemainingAmount)), StringEntry(keyTotalRemainingAmount(), toString(newTotalRemainingAmount)), StringEntry(keyInvestor(userAddress58), newInvestor), StringEntry(keyTotals(), newTotals)]
602622 }
603623 else throw("Strict value is not equal to itself.")
604624 }
605625 else throw("Strict value is not equal to itself.")
606626 }
607627 else throw("Strict value is not equal to itself.")
608628 }
609629
610630
611631
612632 @Callable(i)
613633 func claimFor (userAddress58) = nil
614634
615635
616636
617637 @Callable(i)
618638 func claimREADONLY (claimedAssetId58,userAddress58) = {
619639 let claimResultTuple = internalClaim(claimedAssetId58, addressFromStringValue(userAddress58), fromBase58String(""))
620640 let totalsDiff = claimResultTuple._1
621641 let outAmount = claimResultTuple._2
622642 let outAssetId = claimResultTuple._3
623643 let origInvestArray = claimResultTuple._4
624644 let newClaimPeriodHeight = claimResultTuple._5
625645 let availableToClaimArray = claimResultTuple._6
626646 let availablePriceAmountToClaim = availableToClaimArray[0]
627647 let availableIdoAmountToClaim = availableToClaimArray[1]
628648 $Tuple2(nil, makeString(["%s%d%d", userAddress58, toString(availablePriceAmountToClaim), toString(availableIdoAmountToClaim)], SEP))
629649 }
630650
631651
632652
633653 @Callable(i)
634654 func claimV2READONLY (claimedAssetId58,userAddress58) = {
635655 let claimResultTuple = internalClaim(claimedAssetId58, addressFromStringValue(userAddress58), fromBase58String(""))
636656 let totalsDiff = claimResultTuple._1
637657 let outAmount = claimResultTuple._2
638658 let outAssetId = claimResultTuple._3
639659 let origInvestArray = claimResultTuple._4
640660 let newClaimPeriodHeight = claimResultTuple._5
641661 let availableToClaimArray = claimResultTuple._6
642662 let availablePriceAmountToClaim = availableToClaimArray[0]
643663 let availableIdoAmountToClaim = availableToClaimArray[1]
644664 let cfgArray = readConfigArray()
645665 let priceAssetId58 = cfgArray[IdxCfgPriceAssetId]
646666 let priceAssetBalance = valueOrElse(getInteger(keyPriceAssetBalance(userAddress58)), 0)
647667 let priceAssetBalanceIdoDecimals = (priceAssetBalance * 100)
648668 let availableIdoAmountToClaimWithPriceAssetBalance = (availableIdoAmountToClaim + priceAssetBalanceIdoDecimals)
649- let $t03597636388 = internalClaimV2(priceAssetId58, userAddress58, outAmount, totalsDiff[IdxDiffClaimedPriceAmountIncrement])
650- let periodMinAvailableToClaim = $t03597636388._1
651- let periodTotalAvailableToClaim = $t03597636388._2
652- let periodUserAvailableToClaim = $t03597636388._3
653- let totalUserAvailableToClaim = $t03597636388._4
654- let usdtPriceAssetAllowableRatio = $t03597636388._5
655- let currentUsdtPriceAssetRatio = $t03597636388._6
656- let endPeriodBlocksLeft = $t03597636388._7
657- let updatedCurrentPeriod = $t03597636388._8
658- let periodStart = $t03597636388._9
659- let periodEnd = $t03597636388._10
669+ let $t03637436786 = internalClaimV2(priceAssetId58, userAddress58, outAmount, totalsDiff[IdxDiffClaimedPriceAmountIncrement])
670+ let periodMinAvailableToClaim = $t03637436786._1
671+ let periodTotalAvailableToClaim = $t03637436786._2
672+ let periodUserAvailableToClaim = $t03637436786._3
673+ let totalUserAvailableToClaim = $t03637436786._4
674+ let usdtPriceAssetAllowableRatio = $t03637436786._5
675+ let currentUsdtPriceAssetRatio = $t03637436786._6
676+ let endPeriodBlocksLeft = $t03637436786._7
677+ let updatedCurrentPeriod = $t03637436786._8
678+ let periodStart = $t03637436786._9
679+ let periodEnd = $t03637436786._10
660680 let currentPeriodEndHeight = valueOrElse(getInteger(keyPeriodEndHeight(updatedCurrentPeriod)), 0)
661681 let userTotalPriceAssetClaimed = (parseIntValue(readInvestorArrayOrFail(userAddress58)[IdxInvClaimedPriceAssetAmount]) - priceAssetBalance)
662682 let resultString = if ((height > currentPeriodEndHeight))
663683 then {
664684 let periodLenght = value(getInteger(keyPeriodLength()))
665685 let userPeriodAllowance = value(getInteger(keyUserPeriodAllowance(priceAssetId58)))
666686 let totalPeriodAllowance = value(getInteger(keyTotalPeriodAllowance(priceAssetId58)))
667687 makeString(["%d%d%d%d%d%d", toString(availableIdoAmountToClaimWithPriceAssetBalance), toString(userPeriodAllowance), toString(totalPeriodAllowance), toString(usdtPriceAssetAllowableRatio), toString(currentUsdtPriceAssetRatio), toString(periodLenght), toString(userTotalPriceAssetClaimed)], SEP)
668688 }
669689 else makeString(["%d%d%d%d%d%d", toString(availableIdoAmountToClaimWithPriceAssetBalance), toString(periodMinAvailableToClaim), toString(periodTotalAvailableToClaim), toString(usdtPriceAssetAllowableRatio), toString(currentUsdtPriceAssetRatio), toString(endPeriodBlocksLeft), toString(userTotalPriceAssetClaimed)], SEP)
670690 $Tuple2(nil, resultString)
671691 }
672692
673693
674694 @Verifier(tx)
675695 func verify () = {
676696 let targetPublicKey = match managerPublicKeyOrUnit() {
677697 case pk: ByteVector =>
678698 pk
679699 case _: Unit =>
680700 tx.senderPublicKey
681701 case _ =>
682702 throw("Match error")
683703 }
684704 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
685705 }
686706

github/deemru/w8io/169f3d6 
208.34 ms