tx · CeftPtPctkMfhkkuebUVxHcircebAfkRrZyWUfHJVLKQ 3N2rcyriCEdhEj4exvjYdSW3afoRPa54PJL: -0.01000000 Waves 2021.09.29 14:47 [1724207] smart account 3N2rcyriCEdhEj4exvjYdSW3afoRPa54PJL > SELF 0.00000000 Waves
{ "type": 13, "id": "CeftPtPctkMfhkkuebUVxHcircebAfkRrZyWUfHJVLKQ", "fee": 1000000, "feeAssetId": null, "timestamp": 1632916025516, "version": 1, "sender": "3N2rcyriCEdhEj4exvjYdSW3afoRPa54PJL", "senderPublicKey": "HcYUcARjSQ9s6sNtiBY85skwJEowirwR4zUZmdVFtQq3", "proofs": [ "zngaSN46Kk7MqMDDiHYiYzX2TRSpC3dACckZ8PzZ46he6Ka5UjGLLPwaJbU4SeF2jTKRRJrHxQD5FGu7X2chKsU" ], "script": "base64:AAIFAAAAAAAAAC4IAhIDCgEIEgQKAgEEEgASBAoCCAgSABIFCgMBAQgSBQoDAQEIEgUKAwgBCBIAAAAAOwAAAAAKbFBkZWNpbWFscwAAAAAAAAAACAAAAAAGc2NhbGU4AAAAAAAF9eEAAAAAAAxzY2FsZThCaWdJbnQJAAE2AAAAAQAAAAAABfXhAAAAAAAHc2NhbGUxOAkAATYAAAABAA3gtrOnZAAAAAAAAANTRVACAAAAAl9fAAAAAApQb29sQWN0aXZlAAAAAAAAAAABAAAAAA9Qb29sUHV0RGlzYWJsZWQAAAAAAAAAAAIAAAAAE1Bvb2xNYXRjaGVyRGlzYWJsZWQAAAAAAAAAAAMAAAAADFBvb2xTaHV0ZG93bgAAAAAAAAAABAAAAAAOaWR4UG9vbEFkZHJlc3MAAAAAAAAAAAEAAAAADWlkeFBvb2xTdGF0dXMAAAAAAAAAAAIAAAAAEGlkeFBvb2xMUEFzc2V0SWQAAAAAAAAAAAMAAAAAEGlkeEFtb3VudEFzc2V0SWQAAAAAAAAAAAQAAAAAD2lkeFByaWNlQXNzZXRJZAAAAAAAAAAABQAAAAAWaWR4QW1vdW50QXNzZXREZWNpbWFscwAAAAAAAAAABgAAAAAVaWR4UHJpY2VBc3NldERlY2ltYWxzAAAAAAAAAAAHAAAAABhpZHhBbW91bnRBc3NldEludGVybmFsSWQAAAAAAAAAAAgAAAAAF2lkeFByaWNlQXNzZXRJbnRlcm5hbElkAAAAAAAAAAAJAAAAABJpZHhMUEFzc2V0RGVjaW1hbHMAAAAAAAAAAAoAAAAAE2lkeE1hdGNoZXJQdWJsaWNLZXkAAAAAAAAAAAsAAAAAFWlkeFBvb2xBbW91bnRBc3NldEFtdAAAAAAAAAAAAQAAAAAUaWR4UG9vbFByaWNlQXNzZXRBbXQAAAAAAAAAAAIAAAAAEWlkeFBvb2xMUEFzc2V0QW10AAAAAAAAAAADAAAAABlpZHhGYWN0b3J5U3Rha2luZ0NvbnRyYWN0AAAAAAAAAAABAAAAABhpZHhGYWN0b3J5Qm9vc3RpbmdDb25maWcAAAAAAAAAAAIBAAAAEmtleUZhY3RvcnlDb250cmFjdAAAAAACAAAAEyVzX19mYWN0b3J5Q29udHJhY3QBAAAADGtleVByaWNlTGFzdAAAAAACAAAAESVzJXNfX3ByaWNlX19sYXN0AQAAAA9rZXlQcmljZUhpc3RvcnkAAAACAAAAAWgAAAAJdGltZXN0YW1wCQAEuQAAAAIJAARMAAAAAgIAAAAYJXMlcyVkJWRfX3ByaWNlX19oaXN0b3J5CQAETAAAAAIJAAGkAAAAAQUAAAABaAkABEwAAAACCQABpAAAAAEFAAAACXRpbWVzdGFtcAUAAAADbmlsBQAAAANTRVABAAAAEGtleVBvb2xMaXF1aWRpdHkAAAACAAAAE2ludGVybmFsQW1vdW50QXNzZXQAAAASaW50ZXJuYWxQcmljZUFzc2V0CQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAACCVkJWQlc19fBQAAABNpbnRlcm5hbEFtb3VudEFzc2V0AgAAAAJfXwUAAAASaW50ZXJuYWxQcmljZUFzc2V0AgAAAAhfX2xvY2tlZAEAAAASa2V5UHV0QWN0aW9uQnlVc2VyAAAAAgAAAAt1c2VyQWRkcmVzcwAAAAR0eElkCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAslcyVzJXNfX1BfXwUAAAALdXNlckFkZHJlc3MCAAAAAl9fBQAAAAR0eElkAQAAABJrZXlHZXRBY3Rpb25CeVVzZXIAAAACAAAAC3VzZXJBZGRyZXNzAAAABHR4SWQJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAACyVzJXMlc19fR19fBQAAAAt1c2VyQWRkcmVzcwIAAAACX18FAAAABHR4SWQBAAAADmtleUFtb3VudEFzc2V0AAAAAAIAAAAPJXNfX2Ftb3VudEFzc2V0AQAAAA1rZXlQcmljZUFzc2V0AAAAAAIAAAAOJXNfX3ByaWNlQXNzZXQBAAAAC2tleUtDdXJyZW50AAAAAAIAAAAPJXMlc19fS19jdXJyZW50AQAAAAxrZXlLSGlzdG9yaWMAAAACAAAAAWgAAAAJdGltZXN0YW1wCQAEuQAAAAIJAARMAAAAAgIAAAATJXMlcyVkJWRfX0tfaGlzdG9yeQkABEwAAAACCQABpAAAAAEFAAAAAWgJAARMAAAAAgkAAaQAAAABBQAAAAl0aW1lc3RhbXAFAAAAA25pbAUAAAADU0VQAQAAABBrZXlGYWN0b3J5Q29uZmlnAAAAAAIAAAARJXNfX2ZhY3RvcnlDb25maWcBAAAAKWtleU1hcHBpbmdQb29sQ29udHJhY3RBZGRyZXNzVG9Qb29sQXNzZXRzAAAAAQAAABNwb29sQ29udHJhY3RBZGRyZXNzCQABLAAAAAIJAAEsAAAAAgIAAAAIJXMlcyVzX18FAAAAE3Bvb2xDb250cmFjdEFkZHJlc3MCAAAAIF9fbWFwcGluZ3NfX3Bvb2xDb250cmFjdDJMcEFzc2V0AQAAAA1rZXlQb29sQ29uZmlnAAAAAgAAABNhbW91bnRBc3NldEludGVybmFsAAAAEnByaWNlQXNzZXRJbnRlcm5hbAkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAglZCVkJXNfXwUAAAATYW1vdW50QXNzZXRJbnRlcm5hbAIAAAACX18FAAAAEnByaWNlQXNzZXRJbnRlcm5hbAIAAAAIX19jb25maWcBAAAAH2tleU1hcHBpbmdzQmFzZUFzc2V0MmludGVybmFsSWQAAAABAAAADGJhc2VBc3NldFN0cgkAASwAAAACAgAAACglcyVzJXNfX21hcHBpbmdzX19iYXNlQXNzZXQyaW50ZXJuYWxJZF9fBQAAAAxiYXNlQXNzZXRTdHIBAAAAE2tleUFsbFBvb2xzU2h1dGRvd24AAAAAAgAAAAwlc19fc2h1dGRvd24BAAAADWtleVBvb2xXZWlnaHQAAAABAAAAD2NvbnRyYWN0QWRkcmVzcwkAASwAAAACAgAAABIlcyVzX19wb29sV2VpZ2h0X18FAAAAD2NvbnRyYWN0QWRkcmVzcwAAAAAPZmFjdG9yeUNvbnRyYWN0CQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQdAAAAAgUAAAAEdGhpcwkBAAAAEmtleUZhY3RvcnlDb250cmFjdAAAAAACAAAAGU5vIEZhY3RvcnkgQWNjb3VudCBmb3VuZC4BAAAAEGlzR2xvYmFsU2h1dGRvd24AAAAACQEAAAALdmFsdWVPckVsc2UAAAACCQAEGwAAAAIFAAAAD2ZhY3RvcnlDb250cmFjdAkBAAAAE2tleUFsbFBvb2xzU2h1dGRvd24AAAAABwEAAAANZ2V0UG9vbENvbmZpZwAAAAAEAAAAD3Bvb2xBbW91bnRBc3NldAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEHQAAAAIFAAAABHRoaXMJAQAAAA5rZXlBbW91bnRBc3NldAAAAAACAAAAIE5vIGNvbmZpZyBmb3IgYW1vdW50IGFzc2V0IGZvdW5kBAAAAA5wb29sUHJpY2VBc3NldAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEHQAAAAIFAAAABHRoaXMJAQAAAA1rZXlQcmljZUFzc2V0AAAAAAIAAAAfTm8gY29uZmlnIGZvciBwcmljZSBhc3NldCBmb3VuZAQAAAAWcG9vbFByaWNlQXNzZXRJbnRlcm5hbAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAAD2ZhY3RvcnlDb250cmFjdAkBAAAAH2tleU1hcHBpbmdzQmFzZUFzc2V0MmludGVybmFsSWQAAAABBQAAAA5wb29sUHJpY2VBc3NldAIAAAAoTm8gY29uZmlnIGZvciBpbnRlcm5hbCBwcmljZSBhc3NldCBmb3VuZAQAAAAXcG9vbEFtb3VudEFzc2V0SW50ZXJuYWwJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAA9mYWN0b3J5Q29udHJhY3QJAQAAAB9rZXlNYXBwaW5nc0Jhc2VBc3NldDJpbnRlcm5hbElkAAAAAQUAAAAPcG9vbEFtb3VudEFzc2V0AgAAAClObyBjb25maWcgZm9yIGludGVybmFsIGFtb3VudCBhc3NldCBmb3VuZAkABLUAAAACCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQdAAAAAgUAAAAPZmFjdG9yeUNvbnRyYWN0CQEAAAANa2V5UG9vbENvbmZpZwAAAAIJAAGkAAAAAQUAAAAXcG9vbEFtb3VudEFzc2V0SW50ZXJuYWwJAAGkAAAAAQUAAAAWcG9vbFByaWNlQXNzZXRJbnRlcm5hbAIAAAAoTm8gZmFjdG9yeSBjb25maWcgZm91bmQgZm9yIHBvb2wgYXNzZXRzLgUAAAADU0VQAQAAABBnZXRGYWN0b3J5Q29uZmlnAAAAAAkABLUAAAACCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQdAAAAAgUAAAAPZmFjdG9yeUNvbnRyYWN0CQEAAAAQa2V5RmFjdG9yeUNvbmZpZwAAAAACAAAAGE5vIGZhY3RvcnkgY29uZmlnIGZvdW5kLgUAAAADU0VQAQAAABBnZXRQb29sTGlxdWlkaXR5AAAAAgAAABVhbW91bnRBc3NldEludGVybmFsSWQAAAAUcHJpY2VBc3NldEludGVybmFsSWQEAAAAGWN1cnJlbnRQb29sTGlxdWlkaXR5VmFsdWUJAAQdAAAAAgUAAAAEdGhpcwkBAAAAEGtleVBvb2xMaXF1aWRpdHkAAAACBQAAABVhbW91bnRBc3NldEludGVybmFsSWQFAAAAFHByaWNlQXNzZXRJbnRlcm5hbElkAwkBAAAACWlzRGVmaW5lZAAAAAEFAAAAGWN1cnJlbnRQb29sTGlxdWlkaXR5VmFsdWUJAAS1AAAAAgkBAAAABXZhbHVlAAAAAQUAAAAZY3VycmVudFBvb2xMaXF1aWRpdHlWYWx1ZQUAAAADU0VQCQAETAAAAAICAAAAAAkABEwAAAACAgAAAAEwCQAETAAAAAICAAAAATAJAARMAAAAAgIAAAABMAUAAAADbmlsAQAAABFkYXRhUG9vbExpcXVpZGl0eQAAAAMAAAARYW1vdW50QXNzZXRMb2NrZWQAAAAQcHJpY2VBc3NldExvY2tlZAAAAA1scFRva2VuTG9ja2VkCQAEuQAAAAIJAARMAAAAAgIAAAAGJWQlZCVkCQAETAAAAAIJAAGkAAAAAQUAAAARYW1vdW50QXNzZXRMb2NrZWQJAARMAAAAAgkAAaQAAAABBQAAABBwcmljZUFzc2V0TG9ja2VkCQAETAAAAAIJAAGkAAAAAQUAAAANbHBUb2tlbkxvY2tlZAUAAAADbmlsBQAAAANTRVABAAAAEWRhdGFQdXRBY3Rpb25JbmZvAAAACAAAABBpbkFtb3VudEFzc2V0QW10AAAAD2luUHJpY2VBc3NldEFtdAAAAAhvdXRMcEFtdAAAAAVwcmljZQAAAB1zbGlwcGFnZVRvbGVyYW5jZVBhc3NlZEJ5VXNlcgAAABVzbGlwcGFnZVRvbGVyYW5jZVJlYWwAAAAIdHhIZWlnaHQAAAALdHhUaW1lc3RhbXAJAAS5AAAAAgkABEwAAAACAgAAAA4lZCVkJWQlZCVkJWQlZAkABEwAAAACCQABpAAAAAEFAAAAEGluQW1vdW50QXNzZXRBbXQJAARMAAAAAgkAAaQAAAABBQAAAA9pblByaWNlQXNzZXRBbXQJAARMAAAAAgkAAaQAAAABBQAAAAhvdXRMcEFtdAkABEwAAAACCQABpAAAAAEFAAAABXByaWNlCQAETAAAAAIJAAGkAAAAAQUAAAAdc2xpcHBhZ2VUb2xlcmFuY2VQYXNzZWRCeVVzZXIJAARMAAAAAgkAAaQAAAABBQAAABVzbGlwcGFnZVRvbGVyYW5jZVJlYWwJAARMAAAAAgkAAaQAAAABBQAAAAh0eEhlaWdodAkABEwAAAACCQABpAAAAAEFAAAAC3R4VGltZXN0YW1wBQAAAANuaWwFAAAAA1NFUAEAAAARZGF0YUdldEFjdGlvbkluZm8AAAAGAAAAEW91dEFtb3VudEFzc2V0QW10AAAAEG91dFByaWNlQXNzZXRBbXQAAAAHaW5McEFtdAAAAAVwcmljZQAAAAh0eEhlaWdodAAAAAt0eFRpbWVzdGFtcAkABLkAAAACCQAETAAAAAICAAAADCVkJWQlZCVkJWQlZAkABEwAAAACCQABpAAAAAEFAAAAEW91dEFtb3VudEFzc2V0QW10CQAETAAAAAIJAAGkAAAAAQUAAAAQb3V0UHJpY2VBc3NldEFtdAkABEwAAAACCQABpAAAAAEFAAAAB2luTHBBbXQJAARMAAAAAgkAAaQAAAABBQAAAAVwcmljZQkABEwAAAACCQABpAAAAAEFAAAACHR4SGVpZ2h0CQAETAAAAAIJAAGkAAAAAQUAAAALdHhUaW1lc3RhbXAFAAAAA25pbAUAAAADU0VQAQAAABRwcml2YXRlQ2FzdFRvU2NhbGVPZgAAAAMAAAAGYW1vdW50AAAAC3Jlc3VsdFNjYWxlAAAADGN1cnJlbnRTY2FsZQkAAGsAAAADBQAAAAZhbW91bnQFAAAAC3Jlc3VsdFNjYWxlBQAAAAxjdXJyZW50U2NhbGUBAAAAGnByaXZhdGVCaWdJbnRDYXN0VG9TY2FsZU9mAAAAAwAAAAZhbW91bnQAAAALcmVzdWx0U2NhbGUAAAAMY3VycmVudFNjYWxlCQABPAAAAAMFAAAABmFtb3VudAUAAAALcmVzdWx0U2NhbGUFAAAADGN1cnJlbnRTY2FsZQEAAAAOY2FsY3VsYXRlUHJpY2UAAAACAAAAE3ByaWNlQXNzZXRMb2NrZWRBbXQAAAAVYW1vdW50QXNzZXRsTG9ja2VkQW10CQAAawAAAAMFAAAAE3ByaWNlQXNzZXRMb2NrZWRBbXQFAAAABnNjYWxlOAUAAAAVYW1vdW50QXNzZXRsTG9ja2VkQW10AQAAABRjYWxjdWxhdGVQcmljZUJpZ0ludAAAAAIAAAATcHJpY2VBc3NldExvY2tlZEFtdAAAABVhbW91bnRBc3NldGxMb2NrZWRBbXQJAAGgAAAAAQkAATwAAAADBQAAABNwcmljZUFzc2V0TG9ja2VkQW10BQAAAAxzY2FsZThCaWdJbnQFAAAAFWFtb3VudEFzc2V0bExvY2tlZEFtdAEAAAAVcHJpdmF0ZUNhbGN1bGF0ZVByaWNlAAAABAAAABJhbW91dEFzc2V0RGVjaW1hbHMAAAAScHJpY2VBc3NldERlY2ltYWxzAAAADmFtb3VudEFzc2V0QW10AAAADXByaWNlQXNzZXRBbXQEAAAAFGFtb3VudEFzc2V0QW10Q2FzdGVkCQEAAAAUcHJpdmF0ZUNhc3RUb1NjYWxlT2YAAAADBQAAAA5hbW91bnRBc3NldEFtdAUAAAAGc2NhbGU4BQAAABJhbW91dEFzc2V0RGVjaW1hbHMEAAAAE3ByaWNlQXNzZXRBbXRDYXN0ZWQJAQAAABRwcml2YXRlQ2FzdFRvU2NhbGVPZgAAAAMFAAAADXByaWNlQXNzZXRBbXQFAAAABnNjYWxlOAUAAAAScHJpY2VBc3NldERlY2ltYWxzCQEAAAAOY2FsY3VsYXRlUHJpY2UAAAACBQAAABNwcmljZUFzc2V0QW10Q2FzdGVkBQAAABRhbW91bnRBc3NldEFtdENhc3RlZAEAAAAYcHJpdmF0ZUdldEFjY291bnRCYWxhbmNlAAAAAQAAAAdhc3NldElkAwkAAAAAAAACBQAAAAdhc3NldElkAgAAAAVXQVZFUwgJAAPvAAAAAQUAAAAEdGhpcwAAAAlhdmFpbGFibGUJAAPwAAAAAgUAAAAEdGhpcwkAAlkAAAABBQAAAAdhc3NldElkAQAAAA9jYWxjdWxhdGVQcmljZXMAAAADAAAADmFtb3VudEFzc2V0QW10AAAADXByaWNlQXNzZXRBbXQAAAAIbHBBbW91bnQEAAAAEnBvb2xDb25maWdEYXRhTGlzdAkBAAAADWdldFBvb2xDb25maWcAAAAABAAAABJhbW91dEFzc2V0RGVjaW1hbHMJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAABJwb29sQ29uZmlnRGF0YUxpc3QFAAAAFmlkeEFtb3VudEFzc2V0RGVjaW1hbHMEAAAAEnByaWNlQXNzZXREZWNpbWFscwkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAEnBvb2xDb25maWdEYXRhTGlzdAUAAAAVaWR4UHJpY2VBc3NldERlY2ltYWxzBAAAAAlwb29sUHJpY2UJAQAAABVwcml2YXRlQ2FsY3VsYXRlUHJpY2UAAAAEBQAAABJhbW91dEFzc2V0RGVjaW1hbHMFAAAAEnByaWNlQXNzZXREZWNpbWFscwUAAAAOYW1vdW50QXNzZXRBbXQFAAAADXByaWNlQXNzZXRBbXQEAAAAGGFtb3VudEFzc2V0UG9vbExvY2tlZEFtdAkBAAAAFHByaXZhdGVDYXN0VG9TY2FsZU9mAAAAAwUAAAAOYW1vdW50QXNzZXRBbXQFAAAABnNjYWxlOAUAAAASYW1vdXRBc3NldERlY2ltYWxzBAAAABdwcmljZUFzc2V0UG9vbExvY2tlZEFtdAkBAAAAFHByaXZhdGVDYXN0VG9TY2FsZU9mAAAAAwUAAAANcHJpY2VBc3NldEFtdAUAAAAGc2NhbGU4BQAAABJwcmljZUFzc2V0RGVjaW1hbHMEAAAAFGxwUHJpY2VJbkFtb3VudEFzc2V0CQEAAAAOY2FsY3VsYXRlUHJpY2UAAAACBQAAABhhbW91bnRBc3NldFBvb2xMb2NrZWRBbXQFAAAACGxwQW1vdW50BAAAABNscFByaWNlSW5QcmljZUFzc2V0CQEAAAAOY2FsY3VsYXRlUHJpY2UAAAACBQAAABdwcmljZUFzc2V0UG9vbExvY2tlZEFtdAUAAAAIbHBBbW91bnQJAARMAAAAAgUAAAAJcG9vbFByaWNlCQAETAAAAAIFAAAAFGxwUHJpY2VJbkFtb3VudEFzc2V0CQAETAAAAAIFAAAAE2xwUHJpY2VJblByaWNlQXNzZXQFAAAAA25pbAEAAAAbcHJpdmF0ZUVzdGltYXRlR2V0T3BlcmF0aW9uAAAAAwAAABBwYXltZW50THBBc3NldElkAAAAD3BheW1lbnRMcEFtb3VudAAAAAt1c2VyQWRkcmVzcwQAAAAOcG9vbENvbmZpZ0xpc3QJAQAAAA1nZXRQb29sQ29uZmlnAAAAAAQAAAAJbHBBc3NldElkCQABkQAAAAIFAAAADnBvb2xDb25maWdMaXN0BQAAABBpZHhQb29sTFBBc3NldElkBAAAAA1hbW91bnRBc3NldElkCQABkQAAAAIFAAAADnBvb2xDb25maWdMaXN0BQAAABBpZHhBbW91bnRBc3NldElkBAAAAAxwcmljZUFzc2V0SWQJAAGRAAAAAgUAAAAOcG9vbENvbmZpZ0xpc3QFAAAAD2lkeFByaWNlQXNzZXRJZAQAAAAVYW1vdW50QXNzZXRJbnRlcm5hbElkCQABkQAAAAIFAAAADnBvb2xDb25maWdMaXN0BQAAABhpZHhBbW91bnRBc3NldEludGVybmFsSWQEAAAAFHByaWNlQXNzZXRJbnRlcm5hbElkCQABkQAAAAIFAAAADnBvb2xDb25maWdMaXN0BQAAABdpZHhQcmljZUFzc2V0SW50ZXJuYWxJZAQAAAASYW1vdXRBc3NldERlY2ltYWxzCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAOcG9vbENvbmZpZ0xpc3QFAAAAFmlkeEFtb3VudEFzc2V0RGVjaW1hbHMEAAAAEnByaWNlQXNzZXREZWNpbWFscwkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAADnBvb2xDb25maWdMaXN0BQAAABVpZHhQcmljZUFzc2V0RGVjaW1hbHMEAAAACnBvb2xTdGF0dXMJAAGRAAAAAgUAAAAOcG9vbENvbmZpZ0xpc3QFAAAADWlkeFBvb2xTdGF0dXMEAAAAEXBvb2xMaXF1aWRpdHlMaXN0CQEAAAAQZ2V0UG9vbExpcXVpZGl0eQAAAAIFAAAAFWFtb3VudEFzc2V0SW50ZXJuYWxJZAUAAAAUcHJpY2VBc3NldEludGVybmFsSWQEAAAADXBvb2xMUEJhbGFuY2UJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAABFwb29sTGlxdWlkaXR5TGlzdAUAAAARaWR4UG9vbExQQXNzZXRBbXQEAAAAFnBvb2xBbW91bnRBc3NldEJhbGFuY2UJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAABFwb29sTGlxdWlkaXR5TGlzdAUAAAAVaWR4UG9vbEFtb3VudEFzc2V0QW10BAAAABVwb29sUHJpY2VBc3NldEJhbGFuY2UJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAABFwb29sTGlxdWlkaXR5TGlzdAUAAAAUaWR4UG9vbFByaWNlQXNzZXRBbXQDCQEAAAACIT0AAAACBQAAAAlscEFzc2V0SWQFAAAAEHBheW1lbnRMcEFzc2V0SWQJAAACAAAAAQIAAAAVSW52YWxpZCBhc3NldCBwYXNzZWQuBAAAABhhbW91bnRBc3NldFBvb2xMb2NrZWRBbXQJAQAAABpwcml2YXRlQmlnSW50Q2FzdFRvU2NhbGVPZgAAAAMJAAE2AAAAAQkBAAAAGHByaXZhdGVHZXRBY2NvdW50QmFsYW5jZQAAAAEFAAAADWFtb3VudEFzc2V0SWQFAAAAB3NjYWxlMTgJAAE2AAAAAQUAAAASYW1vdXRBc3NldERlY2ltYWxzBAAAABdwcmljZUFzc2V0UG9vbExvY2tlZEFtdAkBAAAAGnByaXZhdGVCaWdJbnRDYXN0VG9TY2FsZU9mAAAAAwkAATYAAAABCQEAAAAYcHJpdmF0ZUdldEFjY291bnRCYWxhbmNlAAAAAQUAAAAMcHJpY2VBc3NldElkBQAAAAdzY2FsZTE4CQABNgAAAAEFAAAAEnByaWNlQXNzZXREZWNpbWFscwQAAAAMY3VycmVudFByaWNlCQEAAAAUY2FsY3VsYXRlUHJpY2VCaWdJbnQAAAACBQAAABdwcmljZUFzc2V0UG9vbExvY2tlZEFtdAUAAAAYYW1vdW50QXNzZXRQb29sTG9ja2VkQW10BAAAABJwYXltZW50THBBbW91bnRCdWYJAQAAABpwcml2YXRlQmlnSW50Q2FzdFRvU2NhbGVPZgAAAAMJAAE2AAAAAQUAAAAPcGF5bWVudExwQW1vdW50BQAAAAdzY2FsZTE4BQAAAAxzY2FsZThCaWdJbnQEAAAAEHBvb2xMUEJhbGFuY2VCdWYJAQAAABpwcml2YXRlQmlnSW50Q2FzdFRvU2NhbGVPZgAAAAMJAAE2AAAAAQUAAAANcG9vbExQQmFsYW5jZQUAAAAHc2NhbGUxOAUAAAAMc2NhbGU4QmlnSW50BAAAABFvdXRBbW91bnRBc3NldEFtdAkAATwAAAADBQAAABhhbW91bnRBc3NldFBvb2xMb2NrZWRBbXQFAAAAEnBheW1lbnRMcEFtb3VudEJ1ZgUAAAAQcG9vbExQQmFsYW5jZUJ1ZgQAAAAQb3V0UHJpY2VBc3NldEFtdAkAATwAAAADBQAAABdwcmljZUFzc2V0UG9vbExvY2tlZEFtdAUAAAAScGF5bWVudExwQW1vdW50QnVmBQAAABBwb29sTFBCYWxhbmNlQnVmBAAAABZvdXRBbW91bnRBc3NldEFtdEZpbmFsCQABoAAAAAEJAQAAABpwcml2YXRlQmlnSW50Q2FzdFRvU2NhbGVPZgAAAAMFAAAAEW91dEFtb3VudEFzc2V0QW10CQABNgAAAAEFAAAAEmFtb3V0QXNzZXREZWNpbWFscwUAAAAHc2NhbGUxOAQAAAAVb3V0UHJpY2VBc3NldEFtdEZpbmFsCQABoAAAAAEJAQAAABpwcml2YXRlQmlnSW50Q2FzdFRvU2NhbGVPZgAAAAMFAAAAEG91dFByaWNlQXNzZXRBbXQJAAE2AAAAAQUAAAAScHJpY2VBc3NldERlY2ltYWxzBQAAAAdzY2FsZTE4CQAFHQAAAAsFAAAAFm91dEFtb3VudEFzc2V0QW10RmluYWwFAAAAFW91dFByaWNlQXNzZXRBbXRGaW5hbAUAAAAVYW1vdW50QXNzZXRJbnRlcm5hbElkBQAAABRwcmljZUFzc2V0SW50ZXJuYWxJZAUAAAANYW1vdW50QXNzZXRJZAUAAAAMcHJpY2VBc3NldElkBQAAABZwb29sQW1vdW50QXNzZXRCYWxhbmNlBQAAABVwb29sUHJpY2VBc3NldEJhbGFuY2UFAAAADXBvb2xMUEJhbGFuY2UFAAAADGN1cnJlbnRQcmljZQUAAAAKcG9vbFN0YXR1cwEAAAAbcHJpdmF0ZUVzdGltYXRlUHV0T3BlcmF0aW9uAAAABwAAABFzbGlwcGFnZVRvbGVyYW5jZQAAABBpbkFtb3VudEFzc2V0QW10AAAAD2luQW1vdW50QXNzZXRJZAAAAA9pblByaWNlQXNzZXRBbXQAAAAOaW5QcmljZUFzc2V0SWQAAAALdXNlckFkZHJlc3MAAAAKaXNFdmFsdWF0ZQQAAAAScG9vbENvbmZpZ0RhdGFMaXN0CQEAAAANZ2V0UG9vbENvbmZpZwAAAAAEAAAACWxwQXNzZXRJZAkAAlkAAAABCQABkQAAAAIFAAAAEnBvb2xDb25maWdEYXRhTGlzdAUAAAAQaWR4UG9vbExQQXNzZXRJZAQAAAANYW1vdW50QXNzZXRJZAkAAZEAAAACBQAAABJwb29sQ29uZmlnRGF0YUxpc3QFAAAAEGlkeEFtb3VudEFzc2V0SWQEAAAADHByaWNlQXNzZXRJZAkAAZEAAAACBQAAABJwb29sQ29uZmlnRGF0YUxpc3QFAAAAD2lkeFByaWNlQXNzZXRJZAQAAAAVYW1vdW50QXNzZXRJbnRlcm5hbElkCQABkQAAAAIFAAAAEnBvb2xDb25maWdEYXRhTGlzdAUAAAAYaWR4QW1vdW50QXNzZXRJbnRlcm5hbElkBAAAABRwcmljZUFzc2V0SW50ZXJuYWxJZAkAAZEAAAACBQAAABJwb29sQ29uZmlnRGF0YUxpc3QFAAAAF2lkeFByaWNlQXNzZXRJbnRlcm5hbElkBAAAABJhbW91dEFzc2V0RGVjaW1hbHMJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAABJwb29sQ29uZmlnRGF0YUxpc3QFAAAAFmlkeEFtb3VudEFzc2V0RGVjaW1hbHMEAAAAEnByaWNlQXNzZXREZWNpbWFscwkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAEnBvb2xDb25maWdEYXRhTGlzdAUAAAAVaWR4UHJpY2VBc3NldERlY2ltYWxzBAAAAApwb29sU3RhdHVzCQABkQAAAAIFAAAAEnBvb2xDb25maWdEYXRhTGlzdAUAAAANaWR4UG9vbFN0YXR1cwQAAAAVcG9vbExpcXVpZGl0eURhdGFMaXN0CQEAAAAQZ2V0UG9vbExpcXVpZGl0eQAAAAIFAAAAFWFtb3VudEFzc2V0SW50ZXJuYWxJZAUAAAAUcHJpY2VBc3NldEludGVybmFsSWQEAAAAFnBvb2xBbW91bnRBc3NldEJhbGFuY2UJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAABVwb29sTGlxdWlkaXR5RGF0YUxpc3QFAAAAFWlkeFBvb2xBbW91bnRBc3NldEFtdAQAAAAVcG9vbFByaWNlQXNzZXRCYWxhbmNlCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAVcG9vbExpcXVpZGl0eURhdGFMaXN0BQAAABRpZHhQb29sUHJpY2VBc3NldEFtdAQAAAANcG9vbExQQmFsYW5jZQkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAFXBvb2xMaXF1aWRpdHlEYXRhTGlzdAUAAAARaWR4UG9vbExQQXNzZXRBbXQDAwkBAAAAAiE9AAAAAgUAAAANYW1vdW50QXNzZXRJZAUAAAAPaW5BbW91bnRBc3NldElkBgkBAAAAAiE9AAAAAgUAAAAMcHJpY2VBc3NldElkBQAAAA5pblByaWNlQXNzZXRJZAkAAAIAAAABAgAAACVJbnZhbGlkIGFtb3VudCBvciBwcmljZSBhc3NldCBwYXNzZWQuBAAAABlhY2NvdW50QW1vdW50QXNzZXRCYWxhbmNlAwUAAAAKaXNFdmFsdWF0ZQkBAAAAGHByaXZhdGVHZXRBY2NvdW50QmFsYW5jZQAAAAEFAAAADWFtb3VudEFzc2V0SWQJAABlAAAAAgkBAAAAGHByaXZhdGVHZXRBY2NvdW50QmFsYW5jZQAAAAEFAAAADWFtb3VudEFzc2V0SWQFAAAAEGluQW1vdW50QXNzZXRBbXQEAAAAGGFjY291bnRQcmljZUFzc2V0QmFsYW5jZQMFAAAACmlzRXZhbHVhdGUJAQAAABhwcml2YXRlR2V0QWNjb3VudEJhbGFuY2UAAAABBQAAAAxwcmljZUFzc2V0SWQJAABlAAAAAgkBAAAAGHByaXZhdGVHZXRBY2NvdW50QmFsYW5jZQAAAAEFAAAADHByaWNlQXNzZXRJZAUAAAAPaW5QcmljZUFzc2V0QW10BAAAABhhbW91dEFzc2V0RGVjaW1hbHNCaWdJbnQJAAE2AAAAAQUAAAASYW1vdXRBc3NldERlY2ltYWxzBAAAABhwcmljZUFzc2V0RGVjaW1hbHNCaWdJbnQJAAE2AAAAAQUAAAAScHJpY2VBc3NldERlY2ltYWxzBAAAABppbkFtb3VudEFzc2V0QW10Q2FsY3VsYXRlZAkBAAAAGnByaXZhdGVCaWdJbnRDYXN0VG9TY2FsZU9mAAAAAwkAATYAAAABBQAAABBpbkFtb3VudEFzc2V0QW10BQAAAAdzY2FsZTE4BQAAABhhbW91dEFzc2V0RGVjaW1hbHNCaWdJbnQEAAAAGWluUHJpY2VBc3NldEFtdENhbGN1bGF0ZWQJAQAAABpwcml2YXRlQmlnSW50Q2FzdFRvU2NhbGVPZgAAAAMJAAE2AAAAAQUAAAAPaW5QcmljZUFzc2V0QW10BQAAAAdzY2FsZTE4BQAAABhwcmljZUFzc2V0RGVjaW1hbHNCaWdJbnQEAAAACXVzZXJQcmljZQkBAAAAFGNhbGN1bGF0ZVByaWNlQmlnSW50AAAAAgUAAAAZaW5QcmljZUFzc2V0QW10Q2FsY3VsYXRlZAUAAAAaaW5BbW91bnRBc3NldEFtdENhbGN1bGF0ZWQEAAAAGGFtb3VudEFzc2V0UG9vbExvY2tlZEFtdAkBAAAAGnByaXZhdGVCaWdJbnRDYXN0VG9TY2FsZU9mAAAAAwkAATYAAAABBQAAABlhY2NvdW50QW1vdW50QXNzZXRCYWxhbmNlBQAAAAdzY2FsZTE4BQAAABhhbW91dEFzc2V0RGVjaW1hbHNCaWdJbnQEAAAAF3ByaWNlQXNzZXRQb29sTG9ja2VkQW10CQEAAAAacHJpdmF0ZUJpZ0ludENhc3RUb1NjYWxlT2YAAAADCQABNgAAAAEFAAAAGGFjY291bnRQcmljZUFzc2V0QmFsYW5jZQUAAAAHc2NhbGUxOAUAAAAYcHJpY2VBc3NldERlY2ltYWxzQmlnSW50BAAAAAtjdXJlbnRQcmljZQMJAAAAAAAAAgUAAAANcG9vbExQQmFsYW5jZQAAAAAAAAAAAAAAAAAAAAAAAAkBAAAAFGNhbGN1bGF0ZVByaWNlQmlnSW50AAAAAgUAAAAXcHJpY2VBc3NldFBvb2xMb2NrZWRBbXQFAAAAGGFtb3VudEFzc2V0UG9vbExvY2tlZEFtdAQAAAAIc2xpcHBhZ2UDCQAAAAAAAAIFAAAAC2N1cmVudFByaWNlAAAAAAAAAAAAAAAAAAAAAAAAAwkAAGYAAAACBQAAAAtjdXJlbnRQcmljZQUAAAAJdXNlclByaWNlCQAAawAAAAMJAABlAAAAAgUAAAALY3VyZW50UHJpY2UFAAAACXVzZXJQcmljZQAAAAAAAAAAZAUAAAALY3VyZW50UHJpY2UJAABrAAAAAwkAAGUAAAACBQAAAAl1c2VyUHJpY2UFAAAAC2N1cmVudFByaWNlAAAAAAAAAABkBQAAAAtjdXJlbnRQcmljZQMDCQEAAAACIT0AAAACBQAAAAtjdXJlbnRQcmljZQAAAAAAAAAAAAkAAGYAAAACCQAAaAAAAAIFAAAACHNsaXBwYWdlBQAAAAZzY2FsZTgFAAAAEXNsaXBwYWdlVG9sZXJhbmNlBwkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAA9QcmljZSBzbGlwcGFnZSAJAAGkAAAAAQkAAGgAAAACBQAAAAhzbGlwcGFnZQUAAAAGc2NhbGU4AgAAAB4gZXhjZWVkZWQgdGhlIHBhc3NlZCBsaW1pdCBvZiAJAAGkAAAAAQUAAAARc2xpcHBhZ2VUb2xlcmFuY2UEAAAACmZpbmFsUHJpY2UJAQAAABRjYWxjdWxhdGVQcmljZUJpZ0ludAAAAAIJAAE3AAAAAgUAAAAXcHJpY2VBc3NldFBvb2xMb2NrZWRBbXQFAAAAGWluUHJpY2VBc3NldEFtdENhbGN1bGF0ZWQJAAE3AAAAAgUAAAAYYW1vdW50QXNzZXRQb29sTG9ja2VkQW10BQAAABppbkFtb3VudEFzc2V0QW10Q2FsY3VsYXRlZAQAAAALb3V0THBBbW91bnQDCQAAAAAAAAIFAAAADXBvb2xMUEJhbGFuY2UAAAAAAAAAAAAEAAAAC2xwUmVzdWx0QnVmCQAAdgAAAAYJAAE5AAAAAgUAAAAaaW5BbW91bnRBc3NldEFtdENhbGN1bGF0ZWQFAAAAGWluUHJpY2VBc3NldEFtdENhbGN1bGF0ZWQAAAAAAAAAAAAJAAE2AAAAAQAAAAAAAAAABQAAAAAAAAAAAQAAAAAAAAAAAAUAAAAERE9XTgkAAaAAAAABCQEAAAAacHJpdmF0ZUJpZ0ludENhc3RUb1NjYWxlT2YAAAADBQAAAAtscFJlc3VsdEJ1ZgUAAAAMc2NhbGU4QmlnSW50BQAAAAdzY2FsZTE4BAAAABBwb29sTFBCYWxhbmNlQnVmCQEAAAAacHJpdmF0ZUJpZ0ludENhc3RUb1NjYWxlT2YAAAADCQABNgAAAAEFAAAADXBvb2xMUEJhbGFuY2UFAAAAB3NjYWxlMTgFAAAADHNjYWxlOEJpZ0ludAQAAAASbHBBbXRCeUFtb3VudEFzc2V0CQABoAAAAAEJAQAAABpwcml2YXRlQmlnSW50Q2FzdFRvU2NhbGVPZgAAAAMJAAE8AAAAAwUAAAAQcG9vbExQQmFsYW5jZUJ1ZgUAAAAaaW5BbW91bnRBc3NldEFtdENhbGN1bGF0ZWQFAAAAGGFtb3VudEFzc2V0UG9vbExvY2tlZEFtdAUAAAAMc2NhbGU4QmlnSW50BQAAAAdzY2FsZTE4BAAAABFscEFtdEJ5UHJpY2VBc3NldAkAAaAAAAABCQEAAAAacHJpdmF0ZUJpZ0ludENhc3RUb1NjYWxlT2YAAAADCQABPAAAAAMFAAAAEHBvb2xMUEJhbGFuY2VCdWYFAAAAGWluUHJpY2VBc3NldEFtdENhbGN1bGF0ZWQFAAAAF3ByaWNlQXNzZXRQb29sTG9ja2VkQW10BQAAAAxzY2FsZThCaWdJbnQFAAAAB3NjYWxlMTgDCQAAZgAAAAIFAAAAEWxwQW10QnlQcmljZUFzc2V0BQAAABJscEFtdEJ5QW1vdW50QXNzZXQFAAAAEmxwQW10QnlBbW91bnRBc3NldAUAAAARbHBBbXRCeVByaWNlQXNzZXQDCQAAZwAAAAIAAAAAAAAAAAAFAAAAC291dExwQW1vdW50CQAAAgAAAAECAAAANkludmFsaWQgY2FsY3VsYXRpb25zLiBMUCBjYWxjdWxhdGVkIGlzIGxlc3MgdGhhbiB6ZXJvLgkABRwAAAAKBQAAAAtvdXRMcEFtb3VudAUAAAAKZmluYWxQcmljZQUAAAAWcG9vbEFtb3VudEFzc2V0QmFsYW5jZQUAAAAVcG9vbFByaWNlQXNzZXRCYWxhbmNlBQAAAA1wb29sTFBCYWxhbmNlBQAAABVhbW91bnRBc3NldEludGVybmFsSWQFAAAAFHByaWNlQXNzZXRJbnRlcm5hbElkBQAAAAlscEFzc2V0SWQFAAAACHNsaXBwYWdlBQAAAApwb29sU3RhdHVzAQAAABt2YWxpZGF0ZU1hdGNoZXJPcmRlckFsbG93ZWQAAAABAAAABW9yZGVyBAAAABJwb29sQ29uZmlnRGF0YUxpc3QJAQAAAA1nZXRQb29sQ29uZmlnAAAAAAQAAAANYW1vdW50QXNzZXRJZAkAAZEAAAACBQAAABJwb29sQ29uZmlnRGF0YUxpc3QFAAAAEGlkeEFtb3VudEFzc2V0SWQEAAAADHByaWNlQXNzZXRJZAkAAZEAAAACBQAAABJwb29sQ29uZmlnRGF0YUxpc3QFAAAAD2lkeFByaWNlQXNzZXRJZAQAAAAKcG9vbFN0YXR1cwkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAEnBvb2xDb25maWdEYXRhTGlzdAUAAAANaWR4UG9vbFN0YXR1cwQAAAATbWF0Y2hlclB1YmxpY0tleVN0cgkAAZEAAAACBQAAABJwb29sQ29uZmlnRGF0YUxpc3QFAAAAE2lkeE1hdGNoZXJQdWJsaWNLZXkEAAAAE2Ftb3VudEFzc2V0RGVjaW1hbHMJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAABJwb29sQ29uZmlnRGF0YUxpc3QFAAAAFmlkeEFtb3VudEFzc2V0RGVjaW1hbHMEAAAAEnByaWNlQXNzZXREZWNpbWFscwkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAEnBvb2xDb25maWdEYXRhTGlzdAUAAAAVaWR4UHJpY2VBc3NldERlY2ltYWxzBAAAABlhY2NvdW50QW1vdW50QXNzZXRCYWxhbmNlCQEAAAAYcHJpdmF0ZUdldEFjY291bnRCYWxhbmNlAAAAAQUAAAANYW1vdW50QXNzZXRJZAQAAAAYYWNjb3VudFByaWNlQXNzZXRCYWxhbmNlCQEAAAAYcHJpdmF0ZUdldEFjY291bnRCYWxhbmNlAAAAAQUAAAAMcHJpY2VBc3NldElkBAAAAAxjdXJyZW50UHJpY2UDCQAAAAAAAAIIBQAAAAVvcmRlcgAAAAlvcmRlclR5cGUFAAAAA0J1eQkBAAAAFXByaXZhdGVDYWxjdWxhdGVQcmljZQAAAAQFAAAAE2Ftb3VudEFzc2V0RGVjaW1hbHMFAAAAEnByaWNlQXNzZXREZWNpbWFscwkAAGQAAAACBQAAABlhY2NvdW50QW1vdW50QXNzZXRCYWxhbmNlCAUAAAAFb3JkZXIAAAAGYW1vdW50BQAAABhhY2NvdW50UHJpY2VBc3NldEJhbGFuY2UJAQAAABVwcml2YXRlQ2FsY3VsYXRlUHJpY2UAAAAEBQAAABNhbW91bnRBc3NldERlY2ltYWxzBQAAABJwcmljZUFzc2V0RGVjaW1hbHMJAABkAAAAAgUAAAAZYWNjb3VudEFtb3VudEFzc2V0QmFsYW5jZQgFAAAABW9yZGVyAAAABmFtb3VudAUAAAAYYWNjb3VudFByaWNlQXNzZXRCYWxhbmNlBAAAABFpc1Bvb2xTdGF0dXNWYWxpZAMDAwkBAAAAEGlzR2xvYmFsU2h1dGRvd24AAAAABgkAAAAAAAACBQAAAApwb29sU3RhdHVzBQAAABNQb29sTWF0Y2hlckRpc2FibGVkBgkAAAAAAAACBQAAAApwb29sU3RhdHVzBQAAAAxQb29sU2h1dGRvd24HBgQAAAASaXNWYWxpZE1hdGNoZXJTaWduBgQAAAAQb3JkZXJBbW91bnRBc3NldAgIBQAAAAVvcmRlcgAAAAlhc3NldFBhaXIAAAALYW1vdW50QXNzZXQEAAAAE29yZGVyQW1vdW50QXNzZXRTdHIDCQAAAAAAAAIFAAAAEG9yZGVyQW1vdW50QXNzZXQFAAAABHVuaXQCAAAABVdBVkVTCQACWAAAAAEJAQAAAAV2YWx1ZQAAAAEFAAAAEG9yZGVyQW1vdW50QXNzZXQEAAAAD29yZGVyUHJpY2VBc3NldAgIBQAAAAVvcmRlcgAAAAlhc3NldFBhaXIAAAAKcHJpY2VBc3NldAQAAAASb3JkZXJQcmljZUFzc2V0U3RyAwkAAAAAAAACBQAAAA9vcmRlclByaWNlQXNzZXQFAAAABHVuaXQCAAAABVdBVkVTCQACWAAAAAEJAQAAAAV2YWx1ZQAAAAEFAAAAD29yZGVyUHJpY2VBc3NldAQAAAAQaXNWYWxpZEFzc2V0UGFpcgMDCQEAAAACIT0AAAACBQAAABNvcmRlckFtb3VudEFzc2V0U3RyBQAAAA1hbW91bnRBc3NldElkBgkBAAAAAiE9AAAAAgUAAAASb3JkZXJQcmljZUFzc2V0U3RyBQAAAAxwcmljZUFzc2V0SWQHBgQAAAAKb3JkZXJQcmljZQgFAAAABW9yZGVyAAAABXByaWNlBAAAAA1wcmljZURlY2ltYWxzCQAAawAAAAMFAAAABnNjYWxlOAUAAAAScHJpY2VBc3NldERlY2ltYWxzBQAAABNhbW91bnRBc3NldERlY2ltYWxzBAAAABBjYXN0ZWRPcmRlclByaWNlCQEAAAAUcHJpdmF0ZUNhc3RUb1NjYWxlT2YAAAADBQAAAApvcmRlclByaWNlBQAAAAZzY2FsZTgFAAAADXByaWNlRGVjaW1hbHMEAAAAEWlzT3JkZXJQcmljZVZhbGlkAwkAAAAAAAACCAUAAAAFb3JkZXIAAAAJb3JkZXJUeXBlBQAAAANCdXkJAABnAAAAAgUAAAAMY3VycmVudFByaWNlBQAAABBjYXN0ZWRPcmRlclByaWNlCQAAZwAAAAIFAAAAEGNhc3RlZE9yZGVyUHJpY2UFAAAADGN1cnJlbnRQcmljZQMDAwUAAAAQaXNWYWxpZEFzc2V0UGFpcgUAAAASaXNWYWxpZE1hdGNoZXJTaWduBwUAAAARaXNQb29sU3RhdHVzVmFsaWQHBQAAABFpc09yZGVyUHJpY2VWYWxpZAcAAAAJAAAAAWkBAAAAC2NvbnN0cnVjdG9yAAAAAQAAAA9mYWN0b3J5Q29udHJhY3QDCQEAAAACIT0AAAACCAUAAAABaQAAAAZjYWxsZXIFAAAABHRoaXMJAAACAAAAAQIAAAAScGVybWlzc2lvbnMgZGVuaWVkCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAABJrZXlGYWN0b3J5Q29udHJhY3QAAAAABQAAAA9mYWN0b3J5Q29udHJhY3QFAAAAA25pbAAAAAFpAQAAAANwdXQAAAACAAAAEXNsaXBwYWdlVG9sZXJhbmNlAAAAD3Nob3VsZEF1dG9TdGFrZQQAAAARZmFjdG9yeUNvbmZpZ0xpc3QJAQAAABBnZXRGYWN0b3J5Q29uZmlnAAAAAAQAAAAPc3Rha2luZ0NvbnRyYWN0CQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQmAAAAAQkAAZEAAAACBQAAABFmYWN0b3J5Q29uZmlnTGlzdAUAAAAZaWR4RmFjdG9yeVN0YWtpbmdDb250cmFjdAIAAAAhRXJyb3IuIEluY29ycmVjdCBzdGFraW5nIGFkZHJlc3MuBAAAAA5wbXRBbW91bnRBc3NldAkBAAAABXZhbHVlAAAAAQkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAQAAAAQaW5BbW91bnRBc3NldEFtdAgFAAAADnBtdEFtb3VudEFzc2V0AAAABmFtb3VudAQAAAAPaW5BbW91bnRBc3NldElkAwkBAAAAASEAAAABCQEAAAAJaXNEZWZpbmVkAAAAAQgFAAAADnBtdEFtb3VudEFzc2V0AAAAB2Fzc2V0SWQJAAJZAAAAAQIAAAAFV0FWRVMJAQAAAAV2YWx1ZQAAAAEIBQAAAA5wbXRBbW91bnRBc3NldAAAAAdhc3NldElkBAAAAA1wbXRQcmljZUFzc2V0CQEAAAAFdmFsdWUAAAABCQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAABBAAAAA9pblByaWNlQXNzZXRBbXQIBQAAAA1wbXRQcmljZUFzc2V0AAAABmFtb3VudAQAAAAOaW5QcmljZUFzc2V0SWQDCQEAAAABIQAAAAEJAQAAAAlpc0RlZmluZWQAAAABCAUAAAANcG10UHJpY2VBc3NldAAAAAdhc3NldElkCQACWQAAAAECAAAABVdBVkVTCQEAAAAFdmFsdWUAAAABCAUAAAANcG10UHJpY2VBc3NldAAAAAdhc3NldElkBAAAABNlc3RpbWF0ZWRQdXRSZXN1bHRzCQEAAAAbcHJpdmF0ZUVzdGltYXRlUHV0T3BlcmF0aW9uAAAABwUAAAARc2xpcHBhZ2VUb2xlcmFuY2UFAAAAEGluQW1vdW50QXNzZXRBbXQJAAJYAAAAAQUAAAAPaW5BbW91bnRBc3NldElkBQAAAA9pblByaWNlQXNzZXRBbXQJAAJYAAAAAQUAAAAOaW5QcmljZUFzc2V0SWQJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyBwQAAAALb3V0THBBbW91bnQIBQAAABNlc3RpbWF0ZWRQdXRSZXN1bHRzAAAAAl8xBAAAAAtjdXJlbnRQcmljZQgFAAAAE2VzdGltYXRlZFB1dFJlc3VsdHMAAAACXzIEAAAAFnBvb2xBbW91bnRBc3NldEJhbGFuY2UIBQAAABNlc3RpbWF0ZWRQdXRSZXN1bHRzAAAAAl8zBAAAABVwb29sUHJpY2VBc3NldEJhbGFuY2UIBQAAABNlc3RpbWF0ZWRQdXRSZXN1bHRzAAAAAl80BAAAAA1wb29sTFBCYWxhbmNlCAUAAAATZXN0aW1hdGVkUHV0UmVzdWx0cwAAAAJfNQQAAAAVYW1vdW50QXNzZXRJbnRlcm5hbElkCAUAAAATZXN0aW1hdGVkUHV0UmVzdWx0cwAAAAJfNgQAAAAUcHJpY2VBc3NldEludGVybmFsSWQIBQAAABNlc3RpbWF0ZWRQdXRSZXN1bHRzAAAAAl83BAAAAAlscEFzc2V0SWQIBQAAABNlc3RpbWF0ZWRQdXRSZXN1bHRzAAAAAl84BAAAABJzbGlwcGFnZUNhbGN1bGF0ZWQIBQAAABNlc3RpbWF0ZWRQdXRSZXN1bHRzAAAAAl85BAAAAApwb29sU3RhdHVzCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEIBQAAABNlc3RpbWF0ZWRQdXRSZXN1bHRzAAAAA18xMAMDAwkBAAAAEGlzR2xvYmFsU2h1dGRvd24AAAAABgkAAAAAAAACBQAAAApwb29sU3RhdHVzBQAAAA9Qb29sUHV0RGlzYWJsZWQGCQAAAAAAAAIFAAAACnBvb2xTdGF0dXMFAAAADFBvb2xTaHV0ZG93bgkAAAIAAAABCQABLAAAAAICAAAALFB1dCBvcGVyYXRpb24gaXMgYmxvY2tlZCBieSBhZG1pbi4gU3RhdHVzID0gCQABpAAAAAEFAAAACnBvb2xTdGF0dXMEAAAAFGVtaXRMUEFzc2V0T25GYWN0b3J5CQAD/AAAAAQFAAAAD2ZhY3RvcnlDb250cmFjdAIAAAAEZW1pdAkABEwAAAACBQAAAAtvdXRMcEFtb3VudAUAAAADbmlsBQAAAANuaWwDCQAAAAAAAAIFAAAAFGVtaXRMUEFzc2V0T25GYWN0b3J5BQAAABRlbWl0TFBBc3NldE9uRmFjdG9yeQMJAQAAAAIhPQAAAAIFAAAAFGVtaXRMUEFzc2V0T25GYWN0b3J5AgAAAAdzdWNjZXNzCQAAAgAAAAECAAAANExQIGFzc2V0IHJlaXNzdWUgZmFpbGVkIGR1cmluZyBlbWl0IGNhbGwgb24gZmFjdG9yeS4EAAAAB3Jlc3VsdHMJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAADGtleVByaWNlTGFzdAAAAAAJAAEsAAAAAgIAAAAEJXNfXwkAAaQAAAABBQAAAAtjdXJlbnRQcmljZQkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAPa2V5UHJpY2VIaXN0b3J5AAAAAgUAAAAGaGVpZ2h0CAUAAAAJbGFzdEJsb2NrAAAACXRpbWVzdGFtcAkAASwAAAACAgAAAAQlc19fCQABpAAAAAEFAAAAC2N1cmVudFByaWNlCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAABJrZXlQdXRBY3Rpb25CeVVzZXIAAAACCQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgkAAlgAAAABCAUAAAABaQAAAA10cmFuc2FjdGlvbklkCQEAAAARZGF0YVB1dEFjdGlvbkluZm8AAAAIBQAAABBpbkFtb3VudEFzc2V0QW10BQAAAA9pblByaWNlQXNzZXRBbXQFAAAAC291dExwQW1vdW50BQAAAAtjdXJlbnRQcmljZQUAAAARc2xpcHBhZ2VUb2xlcmFuY2UFAAAAEnNsaXBwYWdlQ2FsY3VsYXRlZAUAAAAGaGVpZ2h0CAUAAAAJbGFzdEJsb2NrAAAACXRpbWVzdGFtcAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAQa2V5UG9vbExpcXVpZGl0eQAAAAIFAAAAFWFtb3VudEFzc2V0SW50ZXJuYWxJZAUAAAAUcHJpY2VBc3NldEludGVybmFsSWQJAQAAABFkYXRhUG9vbExpcXVpZGl0eQAAAAMJAABkAAAAAgUAAAAWcG9vbEFtb3VudEFzc2V0QmFsYW5jZQUAAAAQaW5BbW91bnRBc3NldEFtdAkAAGQAAAACBQAAABVwb29sUHJpY2VBc3NldEJhbGFuY2UFAAAAD2luUHJpY2VBc3NldEFtdAkAAGQAAAACBQAAAA1wb29sTFBCYWxhbmNlBQAAAAtvdXRMcEFtb3VudAUAAAADbmlsAwUAAAAPc2hvdWxkQXV0b1N0YWtlBAAAAAVzdGFrZQkAA/wAAAAEBQAAAA9zdGFraW5nQ29udHJhY3QCAAAABXN0YWtlBQAAAANuaWwJAARMAAAAAgkBAAAAD0F0dGFjaGVkUGF5bWVudAAAAAIFAAAACWxwQXNzZXRJZAUAAAALb3V0THBBbW91bnQFAAAAA25pbAMJAAAAAAAAAgUAAAAFc3Rha2UFAAAABXN0YWtlBQAAAAdyZXN1bHRzCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkABE0AAAACBQAAAAdyZXN1bHRzCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAZjYWxsZXIFAAAAC291dExwQW1vdW50BQAAAAlscEFzc2V0SWQJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAAWkBAAAAA2dldAAAAAAEAAAADnBtdEFtb3VudEFzc2V0CQEAAAAFdmFsdWUAAAABCQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAABAAAAApwbXRBc3NldElkCQEAAAAFdmFsdWUAAAABCAUAAAAOcG10QW1vdW50QXNzZXQAAAAHYXNzZXRJZAQAAAAOcG10QXNzZXRBbW91bnQIBQAAAA5wbXRBbW91bnRBc3NldAAAAAZhbW91bnQEAAAAB3Jlc3VsdHMJAQAAABtwcml2YXRlRXN0aW1hdGVHZXRPcGVyYXRpb24AAAADCQACWAAAAAEFAAAACnBtdEFzc2V0SWQFAAAADnBtdEFzc2V0QW1vdW50CQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgQAAAARb3V0QW1vdW50QXNzZXRBbXQIBQAAAAdyZXN1bHRzAAAAAl8xBAAAABBvdXRQcmljZUFzc2V0QW10CAUAAAAHcmVzdWx0cwAAAAJfMgQAAAAVYW1vdW50QXNzZXRJbnRlcm5hbElkCAUAAAAHcmVzdWx0cwAAAAJfMwQAAAAUcHJpY2VBc3NldEludGVybmFsSWQIBQAAAAdyZXN1bHRzAAAAAl80BAAAAA1hbW91bnRBc3NldElkCAUAAAAHcmVzdWx0cwAAAAJfNQQAAAAMcHJpY2VBc3NldElkCAUAAAAHcmVzdWx0cwAAAAJfNgQAAAAWcG9vbEFtb3VudEFzc2V0QmFsYW5jZQgFAAAAB3Jlc3VsdHMAAAACXzcEAAAAFXBvb2xQcmljZUFzc2V0QmFsYW5jZQgFAAAAB3Jlc3VsdHMAAAACXzgEAAAADXBvb2xMUEJhbGFuY2UIBQAAAAdyZXN1bHRzAAAAAl85BAAAAAxjdXJyZW50UHJpY2UIBQAAAAdyZXN1bHRzAAAAA18xMAQAAAAKcG9vbFN0YXR1cwkBAAAADXBhcnNlSW50VmFsdWUAAAABCAUAAAAHcmVzdWx0cwAAAANfMTEDAwkBAAAAEGlzR2xvYmFsU2h1dGRvd24AAAAABgkAAAAAAAACBQAAAApwb29sU3RhdHVzBQAAAAxQb29sU2h1dGRvd24JAAACAAAAAQkAASwAAAACAgAAACxHZXQgb3BlcmF0aW9uIGlzIGJsb2NrZWQgYnkgYWRtaW4uIFN0YXR1cyA9IAkAAaQAAAABBQAAAApwb29sU3RhdHVzBAAAABRidXJuTFBBc3NldE9uRmFjdG9yeQkAA/wAAAAEBQAAAA9mYWN0b3J5Q29udHJhY3QCAAAABGJ1cm4JAARMAAAAAgUAAAAOcG10QXNzZXRBbW91bnQFAAAAA25pbAkABEwAAAACCQEAAAAPQXR0YWNoZWRQYXltZW50AAAAAgUAAAAKcG10QXNzZXRJZAUAAAAOcG10QXNzZXRBbW91bnQFAAAAA25pbAMJAAAAAAAAAgUAAAAUYnVybkxQQXNzZXRPbkZhY3RvcnkFAAAAFGJ1cm5MUEFzc2V0T25GYWN0b3J5AwkBAAAAAiE9AAAAAgUAAAAUYnVybkxQQXNzZXRPbkZhY3RvcnkCAAAAB3N1Y2Nlc3MJAAACAAAAAQIAAAAxTFAgYXNzZXQgYnVybiBmYWlsZWQgZHVyaW5nIGVtaXQgY2FsbCBvbiBmYWN0b3J5LgkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAZjYWxsZXIFAAAAEW91dEFtb3VudEFzc2V0QW10AwkAAAAAAAACBQAAAA1hbW91bnRBc3NldElkAgAAAAVXQVZFUwUAAAAEdW5pdAkAAlkAAAABBQAAAA1hbW91bnRBc3NldElkCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgUAAAAQb3V0UHJpY2VBc3NldEFtdAkAAlkAAAABBQAAAAxwcmljZUFzc2V0SWQJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAEGtleVBvb2xMaXF1aWRpdHkAAAACBQAAABVhbW91bnRBc3NldEludGVybmFsSWQFAAAAFHByaWNlQXNzZXRJbnRlcm5hbElkCQEAAAARZGF0YVBvb2xMaXF1aWRpdHkAAAADCQAAZQAAAAIFAAAAFnBvb2xBbW91bnRBc3NldEJhbGFuY2UFAAAAEW91dEFtb3VudEFzc2V0QW10CQAAZQAAAAIFAAAAFXBvb2xQcmljZUFzc2V0QmFsYW5jZQUAAAAQb3V0UHJpY2VBc3NldEFtdAkAAGUAAAACBQAAAA1wb29sTFBCYWxhbmNlBQAAAA5wbXRBc3NldEFtb3VudAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAASa2V5R2V0QWN0aW9uQnlVc2VyAAAAAgkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIJAAJYAAAAAQgFAAAAAWkAAAANdHJhbnNhY3Rpb25JZAkBAAAAEWRhdGFHZXRBY3Rpb25JbmZvAAAABgUAAAARb3V0QW1vdW50QXNzZXRBbXQFAAAAEG91dFByaWNlQXNzZXRBbXQFAAAADnBtdEFzc2V0QW1vdW50BQAAAAxjdXJyZW50UHJpY2UFAAAABmhlaWdodAgFAAAACWxhc3RCbG9jawAAAAl0aW1lc3RhbXAJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAADGtleVByaWNlTGFzdAAAAAAJAAEsAAAAAgIAAAAEJXNfXwkAAaQAAAABBQAAAAxjdXJyZW50UHJpY2UJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAD2tleVByaWNlSGlzdG9yeQAAAAIFAAAABmhlaWdodAgFAAAACWxhc3RCbG9jawAAAAl0aW1lc3RhbXAJAAEsAAAAAgIAAAAEJXNfXwkAAaQAAAABBQAAAAxjdXJyZW50UHJpY2UFAAAAA25pbAkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4AAAABaQEAAAAIYWN0aXZhdGUAAAACAAAADmFtb3VudEFzc2V0U3RyAAAADXByaWNlQXNzZXRTdHIDCQEAAAACIT0AAAACCQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgkABCUAAAABBQAAAA9mYWN0b3J5Q29udHJhY3QJAAACAAAAAQIAAAAScGVybWlzc2lvbnMgZGVuaWVkCQAFFAAAAAIJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAADmtleUFtb3VudEFzc2V0AAAAAAUAAAAOYW1vdW50QXNzZXRTdHIJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAADWtleVByaWNlQXNzZXQAAAAABQAAAA1wcmljZUFzc2V0U3RyBQAAAANuaWwCAAAAB3N1Y2Nlc3MAAAABaQEAAAANc3RhdHNSRUFET05MWQAAAAAEAAAAEnBvb2xDb25maWdEYXRhTGlzdAkBAAAADWdldFBvb2xDb25maWcAAAAABAAAAAlscEFzc2V0SWQJAAJZAAAAAQkAAZEAAAACBQAAABJwb29sQ29uZmlnRGF0YUxpc3QFAAAAEGlkeFBvb2xMUEFzc2V0SWQEAAAADWFtb3VudEFzc2V0SWQJAAGRAAAAAgUAAAAScG9vbENvbmZpZ0RhdGFMaXN0BQAAABBpZHhBbW91bnRBc3NldElkBAAAAAxwcmljZUFzc2V0SWQJAAGRAAAAAgUAAAAScG9vbENvbmZpZ0RhdGFMaXN0BQAAAA9pZHhQcmljZUFzc2V0SWQEAAAAFWFtb3VudEFzc2V0SW50ZXJuYWxJZAkAAZEAAAACBQAAABJwb29sQ29uZmlnRGF0YUxpc3QFAAAAGGlkeEFtb3VudEFzc2V0SW50ZXJuYWxJZAQAAAAUcHJpY2VBc3NldEludGVybmFsSWQJAAGRAAAAAgUAAAAScG9vbENvbmZpZ0RhdGFMaXN0BQAAABdpZHhQcmljZUFzc2V0SW50ZXJuYWxJZAQAAAASYW1vdXRBc3NldERlY2ltYWxzCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAScG9vbENvbmZpZ0RhdGFMaXN0BQAAABZpZHhBbW91bnRBc3NldERlY2ltYWxzBAAAABJwcmljZUFzc2V0RGVjaW1hbHMJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAABJwb29sQ29uZmlnRGF0YUxpc3QFAAAAFWlkeFByaWNlQXNzZXREZWNpbWFscwQAAAAVcG9vbExpcXVpZGl0eURhdGFMaXN0CQEAAAAQZ2V0UG9vbExpcXVpZGl0eQAAAAIFAAAAFWFtb3VudEFzc2V0SW50ZXJuYWxJZAUAAAAUcHJpY2VBc3NldEludGVybmFsSWQEAAAADXBvb2xMUEJhbGFuY2UJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAABVwb29sTGlxdWlkaXR5RGF0YUxpc3QFAAAAEWlkeFBvb2xMUEFzc2V0QW10BAAAABlhY2NvdW50QW1vdW50QXNzZXRCYWxhbmNlCQEAAAAYcHJpdmF0ZUdldEFjY291bnRCYWxhbmNlAAAAAQUAAAANYW1vdW50QXNzZXRJZAQAAAAYYWNjb3VudFByaWNlQXNzZXRCYWxhbmNlCQEAAAAYcHJpdmF0ZUdldEFjY291bnRCYWxhbmNlAAAAAQUAAAAMcHJpY2VBc3NldElkBAAAAApwcmljZXNMaXN0CQEAAAAPY2FsY3VsYXRlUHJpY2VzAAAAAwUAAAAZYWNjb3VudEFtb3VudEFzc2V0QmFsYW5jZQUAAAAYYWNjb3VudFByaWNlQXNzZXRCYWxhbmNlBQAAAA1wb29sTFBCYWxhbmNlBAAAAAxjdXJyZW50UHJpY2UJAAGRAAAAAgUAAAAKcHJpY2VzTGlzdAAAAAAAAAAAAAQAAAASbHBBbW91bnRBc3NldFNoYXJlCQABkQAAAAIFAAAACnByaWNlc0xpc3QAAAAAAAAAAAEEAAAAEWxwUHJpY2VBc3NldFNoYXJlCQABkQAAAAIFAAAACnByaWNlc0xpc3QAAAAAAAAAAAIEAAAACnBvb2xXZWlnaHQJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAA9mYWN0b3J5Q29udHJhY3QJAQAAAA1rZXlQb29sV2VpZ2h0AAAAAQkABCUAAAABBQAAAAR0aGlzAgAAABlQb29sIGRvZXNuJ3QgaGF2ZSB3ZWlnaHQuCQAFFAAAAAIFAAAAA25pbAkABLkAAAACCQAETAAAAAICAAAADiVkJWQlZCVkJWQlZCVkCQAETAAAAAIJAAGkAAAAAQUAAAAZYWNjb3VudEFtb3VudEFzc2V0QmFsYW5jZQkABEwAAAACCQABpAAAAAEFAAAAGGFjY291bnRQcmljZUFzc2V0QmFsYW5jZQkABEwAAAACCQABpAAAAAEFAAAADXBvb2xMUEJhbGFuY2UJAARMAAAAAgkAAaQAAAABBQAAAAxjdXJyZW50UHJpY2UJAARMAAAAAgkAAaQAAAABBQAAABJscEFtb3VudEFzc2V0U2hhcmUJAARMAAAAAgkAAaQAAAABBQAAABFscFByaWNlQXNzZXRTaGFyZQkABEwAAAACCQABpAAAAAEFAAAACnBvb2xXZWlnaHQFAAAAA25pbAUAAAADU0VQAAAAAWkBAAAAIGV2YWx1YXRlUHV0QnlBbW91bnRBc3NldFJFQURPTkxZAAAAAwAAABFzbGlwcGFnZVRvbGVyYW5jZQAAABBpbkFtb3VudEFzc2V0QW10AAAAC3VzZXJBZGRyZXNzBAAAABJwb29sQ29uZmlnRGF0YUxpc3QJAQAAAA1nZXRQb29sQ29uZmlnAAAAAAQAAAAJbHBBc3NldElkCQACWQAAAAEJAAGRAAAAAgUAAAAScG9vbENvbmZpZ0RhdGFMaXN0BQAAABBpZHhQb29sTFBBc3NldElkBAAAAA1hbW91bnRBc3NldElkCQABkQAAAAIFAAAAEnBvb2xDb25maWdEYXRhTGlzdAUAAAAQaWR4QW1vdW50QXNzZXRJZAQAAAAMcHJpY2VBc3NldElkCQABkQAAAAIFAAAAEnBvb2xDb25maWdEYXRhTGlzdAUAAAAPaWR4UHJpY2VBc3NldElkBAAAABVhbW91bnRBc3NldEludGVybmFsSWQJAAGRAAAAAgUAAAAScG9vbENvbmZpZ0RhdGFMaXN0BQAAABhpZHhBbW91bnRBc3NldEludGVybmFsSWQEAAAAFHByaWNlQXNzZXRJbnRlcm5hbElkCQABkQAAAAIFAAAAEnBvb2xDb25maWdEYXRhTGlzdAUAAAAXaWR4UHJpY2VBc3NldEludGVybmFsSWQEAAAAEmFtb3V0QXNzZXREZWNpbWFscwkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAEnBvb2xDb25maWdEYXRhTGlzdAUAAAAWaWR4QW1vdW50QXNzZXREZWNpbWFscwQAAAAScHJpY2VBc3NldERlY2ltYWxzCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAScG9vbENvbmZpZ0RhdGFMaXN0BQAAABVpZHhQcmljZUFzc2V0RGVjaW1hbHMEAAAACnBvb2xTdGF0dXMJAAGRAAAAAgUAAAAScG9vbENvbmZpZ0RhdGFMaXN0BQAAAA1pZHhQb29sU3RhdHVzBAAAABVwb29sTGlxdWlkaXR5RGF0YUxpc3QJAQAAABBnZXRQb29sTGlxdWlkaXR5AAAAAgUAAAAVYW1vdW50QXNzZXRJbnRlcm5hbElkBQAAABRwcmljZUFzc2V0SW50ZXJuYWxJZAQAAAANcG9vbExQQmFsYW5jZQkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAFXBvb2xMaXF1aWRpdHlEYXRhTGlzdAUAAAARaWR4UG9vbExQQXNzZXRBbXQEAAAAGWFjY291bnRBbW91bnRBc3NldEJhbGFuY2UJAQAAABhwcml2YXRlR2V0QWNjb3VudEJhbGFuY2UAAAABBQAAAA1hbW91bnRBc3NldElkBAAAABhhY2NvdW50UHJpY2VBc3NldEJhbGFuY2UJAQAAABhwcml2YXRlR2V0QWNjb3VudEJhbGFuY2UAAAABBQAAAAxwcmljZUFzc2V0SWQEAAAAH2FjY291bnRBbW91bnRBc3NldEJhbGFuY2VDYXN0ZWQJAQAAABRwcml2YXRlQ2FzdFRvU2NhbGVPZgAAAAMFAAAAGWFjY291bnRBbW91bnRBc3NldEJhbGFuY2UFAAAABnNjYWxlOAUAAAASYW1vdXRBc3NldERlY2ltYWxzBAAAAB5hY2NvdW50UHJpY2VBc3NldEJhbGFuY2VDYXN0ZWQJAQAAABRwcml2YXRlQ2FzdFRvU2NhbGVPZgAAAAMFAAAAGGFjY291bnRQcmljZUFzc2V0QmFsYW5jZQUAAAAGc2NhbGU4BQAAABJwcmljZUFzc2V0RGVjaW1hbHMEAAAAC2N1cmVudFByaWNlAwkAAAAAAAACBQAAAA1wb29sTFBCYWxhbmNlAAAAAAAAAAAAAAAAAAAAAAAACQEAAAAOY2FsY3VsYXRlUHJpY2UAAAACBQAAAB5hY2NvdW50UHJpY2VBc3NldEJhbGFuY2VDYXN0ZWQFAAAAH2FjY291bnRBbW91bnRBc3NldEJhbGFuY2VDYXN0ZWQEAAAAGWluUHJpY2VBc3NldEFtdENhbGN1bGF0ZWQJAABrAAAAAwUAAAAQaW5BbW91bnRBc3NldEFtdAUAAAALY3VyZW50UHJpY2UFAAAABnNjYWxlOAQAAAAPaW5QcmljZUFzc2V0QW10CQEAAAAUcHJpdmF0ZUNhc3RUb1NjYWxlT2YAAAADBQAAABlpblByaWNlQXNzZXRBbXRDYWxjdWxhdGVkBQAAABJwcmljZUFzc2V0RGVjaW1hbHMFAAAABnNjYWxlOAQAAAATZXN0aW1hdGVkUHV0UmVzdWx0cwkBAAAAG3ByaXZhdGVFc3RpbWF0ZVB1dE9wZXJhdGlvbgAAAAcFAAAAEXNsaXBwYWdlVG9sZXJhbmNlBQAAABBpbkFtb3VudEFzc2V0QW10BQAAAA1hbW91bnRBc3NldElkBQAAAA9pblByaWNlQXNzZXRBbXQFAAAADHByaWNlQXNzZXRJZAUAAAALdXNlckFkZHJlc3MGBAAAAA9vdXRMcEFtb3VudENhbGMIBQAAABNlc3RpbWF0ZWRQdXRSZXN1bHRzAAAAAl8xBAAAAA9jdXJlbnRQcmljZUNhbGMIBQAAABNlc3RpbWF0ZWRQdXRSZXN1bHRzAAAAAl8yBAAAABpwb29sQW1vdW50QXNzZXRCYWxhbmNlQ2FsYwgFAAAAE2VzdGltYXRlZFB1dFJlc3VsdHMAAAACXzMEAAAAGXBvb2xQcmljZUFzc2V0QmFsYW5jZUNBbGMIBQAAABNlc3RpbWF0ZWRQdXRSZXN1bHRzAAAAAl80BAAAABFwb29sTFBCYWxhbmNlQ2FsYwgFAAAAE2VzdGltYXRlZFB1dFJlc3VsdHMAAAACXzUEAAAADnBvb2xTdGF0dXNDYWxjCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEIBQAAABNlc3RpbWF0ZWRQdXRSZXN1bHRzAAAAA18xMAkABRQAAAACBQAAAANuaWwJAAS5AAAAAgkABEwAAAACAgAAAAwlZCVkJWQlZCVkJWQJAARMAAAAAgkAAaQAAAABBQAAAA9vdXRMcEFtb3VudENhbGMJAARMAAAAAgkAAaQAAAABBQAAAAtjdXJlbnRQcmljZQkABEwAAAACCQABpAAAAAEFAAAAGnBvb2xBbW91bnRBc3NldEJhbGFuY2VDYWxjCQAETAAAAAIJAAGkAAAAAQUAAAAZcG9vbFByaWNlQXNzZXRCYWxhbmNlQ0FsYwkABEwAAAACCQABpAAAAAEFAAAAEXBvb2xMUEJhbGFuY2VDYWxjCQAETAAAAAIJAAGkAAAAAQUAAAAOcG9vbFN0YXR1c0NhbGMFAAAAA25pbAUAAAADU0VQAAAAAWkBAAAAH2V2YWx1YXRlUHV0QnlQcmljZUFzc2V0UkVBRE9OTFkAAAADAAAAEXNsaXBwYWdlVG9sZXJhbmNlAAAAD2luUHJpY2VBc3NldEFtdAAAAAt1c2VyQWRkcmVzcwQAAAAScG9vbENvbmZpZ0RhdGFMaXN0CQEAAAANZ2V0UG9vbENvbmZpZwAAAAAEAAAACWxwQXNzZXRJZAkAAlkAAAABCQABkQAAAAIFAAAAEnBvb2xDb25maWdEYXRhTGlzdAUAAAAQaWR4UG9vbExQQXNzZXRJZAQAAAANYW1vdW50QXNzZXRJZAkAAZEAAAACBQAAABJwb29sQ29uZmlnRGF0YUxpc3QFAAAAEGlkeEFtb3VudEFzc2V0SWQEAAAADHByaWNlQXNzZXRJZAkAAZEAAAACBQAAABJwb29sQ29uZmlnRGF0YUxpc3QFAAAAD2lkeFByaWNlQXNzZXRJZAQAAAAVYW1vdW50QXNzZXRJbnRlcm5hbElkCQABkQAAAAIFAAAAEnBvb2xDb25maWdEYXRhTGlzdAUAAAAYaWR4QW1vdW50QXNzZXRJbnRlcm5hbElkBAAAABRwcmljZUFzc2V0SW50ZXJuYWxJZAkAAZEAAAACBQAAABJwb29sQ29uZmlnRGF0YUxpc3QFAAAAF2lkeFByaWNlQXNzZXRJbnRlcm5hbElkBAAAABJhbW91dEFzc2V0RGVjaW1hbHMJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAABJwb29sQ29uZmlnRGF0YUxpc3QFAAAAFmlkeEFtb3VudEFzc2V0RGVjaW1hbHMEAAAAEnByaWNlQXNzZXREZWNpbWFscwkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAEnBvb2xDb25maWdEYXRhTGlzdAUAAAAVaWR4UHJpY2VBc3NldERlY2ltYWxzBAAAAApwb29sU3RhdHVzCQABkQAAAAIFAAAAEnBvb2xDb25maWdEYXRhTGlzdAUAAAANaWR4UG9vbFN0YXR1cwQAAAAVcG9vbExpcXVpZGl0eURhdGFMaXN0CQEAAAAQZ2V0UG9vbExpcXVpZGl0eQAAAAIFAAAAFWFtb3VudEFzc2V0SW50ZXJuYWxJZAUAAAAUcHJpY2VBc3NldEludGVybmFsSWQEAAAADXBvb2xMUEJhbGFuY2UJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAABVwb29sTGlxdWlkaXR5RGF0YUxpc3QFAAAAEWlkeFBvb2xMUEFzc2V0QW10BAAAABlhY2NvdW50QW1vdW50QXNzZXRCYWxhbmNlCQEAAAAYcHJpdmF0ZUdldEFjY291bnRCYWxhbmNlAAAAAQUAAAANYW1vdW50QXNzZXRJZAQAAAAYYWNjb3VudFByaWNlQXNzZXRCYWxhbmNlCQEAAAAYcHJpdmF0ZUdldEFjY291bnRCYWxhbmNlAAAAAQUAAAAMcHJpY2VBc3NldElkBAAAAB9hY2NvdW50QW1vdW50QXNzZXRCYWxhbmNlQ2FzdGVkCQEAAAAUcHJpdmF0ZUNhc3RUb1NjYWxlT2YAAAADBQAAABlhY2NvdW50QW1vdW50QXNzZXRCYWxhbmNlBQAAAAZzY2FsZTgFAAAAEmFtb3V0QXNzZXREZWNpbWFscwQAAAAeYWNjb3VudFByaWNlQXNzZXRCYWxhbmNlQ2FzdGVkCQEAAAAUcHJpdmF0ZUNhc3RUb1NjYWxlT2YAAAADBQAAABhhY2NvdW50UHJpY2VBc3NldEJhbGFuY2UFAAAABnNjYWxlOAUAAAAScHJpY2VBc3NldERlY2ltYWxzBAAAAB5pblByaWNlQXNzZXRBbXRDYWxjdWxhdGVkVHVwbGUJAQAAABRwcml2YXRlQ2FzdFRvU2NhbGVPZgAAAAMFAAAAD2luUHJpY2VBc3NldEFtdAUAAAAGc2NhbGU4BQAAABJwcmljZUFzc2V0RGVjaW1hbHMEAAAAC2N1cmVudFByaWNlAwkAAAAAAAACBQAAAA1wb29sTFBCYWxhbmNlAAAAAAAAAAAAAAAAAAAAAAAACQEAAAAOY2FsY3VsYXRlUHJpY2UAAAACBQAAAB5hY2NvdW50UHJpY2VBc3NldEJhbGFuY2VDYXN0ZWQFAAAAH2FjY291bnRBbW91bnRBc3NldEJhbGFuY2VDYXN0ZWQEAAAAGmluQW1vdW50QXNzZXRBbXRDYWxjdWxhdGVkCQAAawAAAAMFAAAAHmluUHJpY2VBc3NldEFtdENhbGN1bGF0ZWRUdXBsZQUAAAAGc2NhbGU4BQAAAAtjdXJlbnRQcmljZQQAAAAQaW5BbW91bnRBc3NldEFtdAkBAAAAFHByaXZhdGVDYXN0VG9TY2FsZU9mAAAAAwUAAAAaaW5BbW91bnRBc3NldEFtdENhbGN1bGF0ZWQFAAAAEmFtb3V0QXNzZXREZWNpbWFscwUAAAAGc2NhbGU4BAAAABNlc3RpbWF0ZWRQdXRSZXN1bHRzCQEAAAAbcHJpdmF0ZUVzdGltYXRlUHV0T3BlcmF0aW9uAAAABwUAAAARc2xpcHBhZ2VUb2xlcmFuY2UFAAAAEGluQW1vdW50QXNzZXRBbXQFAAAADWFtb3VudEFzc2V0SWQFAAAAD2luUHJpY2VBc3NldEFtdAUAAAAMcHJpY2VBc3NldElkBQAAAAt1c2VyQWRkcmVzcwYEAAAAD291dExwQW1vdW50Q2FsYwgFAAAAE2VzdGltYXRlZFB1dFJlc3VsdHMAAAACXzEEAAAAD2N1cmVudFByaWNlQ2FsYwgFAAAAE2VzdGltYXRlZFB1dFJlc3VsdHMAAAACXzIEAAAAGnBvb2xBbW91bnRBc3NldEJhbGFuY2VDYWxjCAUAAAATZXN0aW1hdGVkUHV0UmVzdWx0cwAAAAJfMwQAAAAZcG9vbFByaWNlQXNzZXRCYWxhbmNlQ0FsYwgFAAAAE2VzdGltYXRlZFB1dFJlc3VsdHMAAAACXzQEAAAAEXBvb2xMUEJhbGFuY2VDYWxjCAUAAAATZXN0aW1hdGVkUHV0UmVzdWx0cwAAAAJfNQQAAAAOcG9vbFN0YXR1c0NhbGMJAQAAAA1wYXJzZUludFZhbHVlAAAAAQgFAAAAE2VzdGltYXRlZFB1dFJlc3VsdHMAAAADXzEwCQAFFAAAAAIFAAAAA25pbAkABLkAAAACCQAETAAAAAICAAAADCVkJWQlZCVkJWQlZAkABEwAAAACCQABpAAAAAEFAAAAD291dExwQW1vdW50Q2FsYwkABEwAAAACCQABpAAAAAEFAAAAC2N1cmVudFByaWNlCQAETAAAAAIJAAGkAAAAAQUAAAAacG9vbEFtb3VudEFzc2V0QmFsYW5jZUNhbGMJAARMAAAAAgkAAaQAAAABBQAAABlwb29sUHJpY2VBc3NldEJhbGFuY2VDQWxjCQAETAAAAAIJAAGkAAAAAQUAAAARcG9vbExQQmFsYW5jZUNhbGMJAARMAAAAAgkAAaQAAAABBQAAAA5wb29sU3RhdHVzQ2FsYwUAAAADbmlsBQAAAANTRVAAAAABaQEAAAATZXZhbHVhdGVHZXRSRUFET05MWQAAAAMAAAAQcGF5bWVudExwQXNzZXRJZAAAAA9wYXltZW50THBBbW91bnQAAAALdXNlckFkZHJlc3MEAAAAB3Jlc3VsdHMJAQAAABtwcml2YXRlRXN0aW1hdGVHZXRPcGVyYXRpb24AAAADBQAAABBwYXltZW50THBBc3NldElkBQAAAA9wYXltZW50THBBbW91bnQFAAAAC3VzZXJBZGRyZXNzBAAAABFvdXRBbW91bnRBc3NldEFtdAgFAAAAB3Jlc3VsdHMAAAACXzEEAAAAEG91dFByaWNlQXNzZXRBbXQIBQAAAAdyZXN1bHRzAAAAAl8yBAAAABZwb29sQW1vdW50QXNzZXRCYWxhbmNlCAUAAAAHcmVzdWx0cwAAAAJfNwQAAAAVcG9vbFByaWNlQXNzZXRCYWxhbmNlCAUAAAAHcmVzdWx0cwAAAAJfOAQAAAANcG9vbExQQmFsYW5jZQgFAAAAB3Jlc3VsdHMAAAACXzkEAAAADGN1cnJlbnRQcmljZQgFAAAAB3Jlc3VsdHMAAAADXzEwBAAAAApwb29sU3RhdHVzCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEIBQAAAAdyZXN1bHRzAAAAA18xMQkABRQAAAACBQAAAANuaWwJAAS5AAAAAgkABEwAAAACAgAAAA4lZCVkJWQlZCVkJWQlZAkABEwAAAACCQABpAAAAAEFAAAAEW91dEFtb3VudEFzc2V0QW10CQAETAAAAAIJAAGkAAAAAQUAAAAQb3V0UHJpY2VBc3NldEFtdAkABEwAAAACCQABpAAAAAEFAAAAFnBvb2xBbW91bnRBc3NldEJhbGFuY2UJAARMAAAAAgkAAaQAAAABBQAAABVwb29sUHJpY2VBc3NldEJhbGFuY2UJAARMAAAAAgkAAaQAAAABBQAAAA1wb29sTFBCYWxhbmNlCQAETAAAAAIJAAGkAAAAAQUAAAAMY3VycmVudFByaWNlCQAETAAAAAIJAAGkAAAAAQUAAAAKcG9vbFN0YXR1cwUAAAADbmlsBQAAAANTRVAAAAABaQEAAAAMaGFzaFJFQURPTkxZAAAAAAkABRQAAAACBQAAAANuaWwJAAJaAAAAAQkBAAAABXZhbHVlAAAAAQkAA/EAAAABBQAAAAR0aGlzAAAAAQAAAAJ0eAEAAAAGdmVyaWZ5AAAAAAQAAAAHJG1hdGNoMAUAAAACdHgDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAABU9yZGVyBAAAAAVvcmRlcgUAAAAHJG1hdGNoMAkAAfQAAAADCAUAAAACdHgAAAAJYm9keUJ5dGVzCQABkQAAAAIIBQAAAAJ0eAAAAAZwcm9vZnMAAAAAAAAAAAAIBQAAAAJ0eAAAAA9zZW5kZXJQdWJsaWNLZXkJAAH0AAAAAwgFAAAAAnR4AAAACWJvZHlCeXRlcwkAAZEAAAACCAUAAAACdHgAAAAGcHJvb2ZzAAAAAAAAAAAACAUAAAACdHgAAAAPc2VuZGVyUHVibGljS2V5Qsj0HQ==", "chainId": 84, "height": 1724207, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: none Next: 5yztQop6MHd879EdnPTmsMAy4dSVWYuuAiroMT8kVFYd Full:
Old | New | Differences | |
---|---|---|---|
1 | - | # no script | |
1 | + | {-# STDLIB_VERSION 5 #-} | |
2 | + | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | + | {-# CONTENT_TYPE DAPP #-} | |
4 | + | let lPdecimals = 8 | |
5 | + | ||
6 | + | let scale8 = 100000000 | |
7 | + | ||
8 | + | let scale8BigInt = toBigInt(100000000) | |
9 | + | ||
10 | + | let scale18 = toBigInt(1000000000000000000) | |
11 | + | ||
12 | + | let SEP = "__" | |
13 | + | ||
14 | + | let PoolActive = 1 | |
15 | + | ||
16 | + | let PoolPutDisabled = 2 | |
17 | + | ||
18 | + | let PoolMatcherDisabled = 3 | |
19 | + | ||
20 | + | let PoolShutdown = 4 | |
21 | + | ||
22 | + | let idxPoolAddress = 1 | |
23 | + | ||
24 | + | let idxPoolStatus = 2 | |
25 | + | ||
26 | + | let idxPoolLPAssetId = 3 | |
27 | + | ||
28 | + | let idxAmountAssetId = 4 | |
29 | + | ||
30 | + | let idxPriceAssetId = 5 | |
31 | + | ||
32 | + | let idxAmountAssetDecimals = 6 | |
33 | + | ||
34 | + | let idxPriceAssetDecimals = 7 | |
35 | + | ||
36 | + | let idxAmountAssetInternalId = 8 | |
37 | + | ||
38 | + | let idxPriceAssetInternalId = 9 | |
39 | + | ||
40 | + | let idxLPAssetDecimals = 10 | |
41 | + | ||
42 | + | let idxMatcherPublicKey = 11 | |
43 | + | ||
44 | + | let idxPoolAmountAssetAmt = 1 | |
45 | + | ||
46 | + | let idxPoolPriceAssetAmt = 2 | |
47 | + | ||
48 | + | let idxPoolLPAssetAmt = 3 | |
49 | + | ||
50 | + | let idxFactoryStakingContract = 1 | |
51 | + | ||
52 | + | let idxFactoryBoostingConfig = 2 | |
53 | + | ||
54 | + | func keyFactoryContract () = "%s__factoryContract" | |
55 | + | ||
56 | + | ||
57 | + | func keyPriceLast () = "%s%s__price__last" | |
58 | + | ||
59 | + | ||
60 | + | func keyPriceHistory (h,timestamp) = makeString(["%s%s%d%d__price__history", toString(h), toString(timestamp)], SEP) | |
61 | + | ||
62 | + | ||
63 | + | func keyPoolLiquidity (internalAmountAsset,internalPriceAsset) = (((("%d%d%s__" + internalAmountAsset) + "__") + internalPriceAsset) + "__locked") | |
64 | + | ||
65 | + | ||
66 | + | func keyPutActionByUser (userAddress,txId) = ((("%s%s%s__P__" + userAddress) + "__") + txId) | |
67 | + | ||
68 | + | ||
69 | + | func keyGetActionByUser (userAddress,txId) = ((("%s%s%s__G__" + userAddress) + "__") + txId) | |
70 | + | ||
71 | + | ||
72 | + | func keyAmountAsset () = "%s__amountAsset" | |
73 | + | ||
74 | + | ||
75 | + | func keyPriceAsset () = "%s__priceAsset" | |
76 | + | ||
77 | + | ||
78 | + | func keyKCurrent () = "%s%s__K_current" | |
79 | + | ||
80 | + | ||
81 | + | func keyKHistoric (h,timestamp) = makeString(["%s%s%d%d__K_history", toString(h), toString(timestamp)], SEP) | |
82 | + | ||
83 | + | ||
84 | + | func keyFactoryConfig () = "%s__factoryConfig" | |
85 | + | ||
86 | + | ||
87 | + | func keyMappingPoolContractAddressToPoolAssets (poolContractAddress) = (("%s%s%s__" + poolContractAddress) + "__mappings__poolContract2LpAsset") | |
88 | + | ||
89 | + | ||
90 | + | func keyPoolConfig (amountAssetInternal,priceAssetInternal) = (((("%d%d%s__" + amountAssetInternal) + "__") + priceAssetInternal) + "__config") | |
91 | + | ||
92 | + | ||
93 | + | func keyMappingsBaseAsset2internalId (baseAssetStr) = ("%s%s%s__mappings__baseAsset2internalId__" + baseAssetStr) | |
94 | + | ||
95 | + | ||
96 | + | func keyAllPoolsShutdown () = "%s__shutdown" | |
97 | + | ||
98 | + | ||
99 | + | func keyPoolWeight (contractAddress) = ("%s%s__poolWeight__" + contractAddress) | |
100 | + | ||
101 | + | ||
102 | + | let factoryContract = addressFromStringValue(valueOrErrorMessage(getString(this, keyFactoryContract()), "No Factory Account found.")) | |
103 | + | ||
104 | + | func isGlobalShutdown () = valueOrElse(getBoolean(factoryContract, keyAllPoolsShutdown()), false) | |
105 | + | ||
106 | + | ||
107 | + | func getPoolConfig () = { | |
108 | + | let poolAmountAsset = valueOrErrorMessage(getString(this, keyAmountAsset()), "No config for amount asset found") | |
109 | + | let poolPriceAsset = valueOrErrorMessage(getString(this, keyPriceAsset()), "No config for price asset found") | |
110 | + | let poolPriceAssetInternal = valueOrErrorMessage(getInteger(factoryContract, keyMappingsBaseAsset2internalId(poolPriceAsset)), "No config for internal price asset found") | |
111 | + | let poolAmountAssetInternal = valueOrErrorMessage(getInteger(factoryContract, keyMappingsBaseAsset2internalId(poolAmountAsset)), "No config for internal amount asset found") | |
112 | + | split(valueOrErrorMessage(getString(factoryContract, keyPoolConfig(toString(poolAmountAssetInternal), toString(poolPriceAssetInternal))), "No factory config found for pool assets."), SEP) | |
113 | + | } | |
114 | + | ||
115 | + | ||
116 | + | func getFactoryConfig () = split(valueOrErrorMessage(getString(factoryContract, keyFactoryConfig()), "No factory config found."), SEP) | |
117 | + | ||
118 | + | ||
119 | + | func getPoolLiquidity (amountAssetInternalId,priceAssetInternalId) = { | |
120 | + | let currentPoolLiquidityValue = getString(this, keyPoolLiquidity(amountAssetInternalId, priceAssetInternalId)) | |
121 | + | if (isDefined(currentPoolLiquidityValue)) | |
122 | + | then split(value(currentPoolLiquidityValue), SEP) | |
123 | + | else ["", "0", "0", "0"] | |
124 | + | } | |
125 | + | ||
126 | + | ||
127 | + | func dataPoolLiquidity (amountAssetLocked,priceAssetLocked,lpTokenLocked) = makeString(["%d%d%d", toString(amountAssetLocked), toString(priceAssetLocked), toString(lpTokenLocked)], SEP) | |
128 | + | ||
129 | + | ||
130 | + | func dataPutActionInfo (inAmountAssetAmt,inPriceAssetAmt,outLpAmt,price,slippageTolerancePassedByUser,slippageToleranceReal,txHeight,txTimestamp) = makeString(["%d%d%d%d%d%d%d", toString(inAmountAssetAmt), toString(inPriceAssetAmt), toString(outLpAmt), toString(price), toString(slippageTolerancePassedByUser), toString(slippageToleranceReal), toString(txHeight), toString(txTimestamp)], SEP) | |
131 | + | ||
132 | + | ||
133 | + | func dataGetActionInfo (outAmountAssetAmt,outPriceAssetAmt,inLpAmt,price,txHeight,txTimestamp) = makeString(["%d%d%d%d%d%d", toString(outAmountAssetAmt), toString(outPriceAssetAmt), toString(inLpAmt), toString(price), toString(txHeight), toString(txTimestamp)], SEP) | |
134 | + | ||
135 | + | ||
136 | + | func privateCastToScaleOf (amount,resultScale,currentScale) = fraction(amount, resultScale, currentScale) | |
137 | + | ||
138 | + | ||
139 | + | func privateBigIntCastToScaleOf (amount,resultScale,currentScale) = fraction(amount, resultScale, currentScale) | |
140 | + | ||
141 | + | ||
142 | + | func calculatePrice (priceAssetLockedAmt,amountAssetlLockedAmt) = fraction(priceAssetLockedAmt, scale8, amountAssetlLockedAmt) | |
143 | + | ||
144 | + | ||
145 | + | func calculatePriceBigInt (priceAssetLockedAmt,amountAssetlLockedAmt) = toInt(fraction(priceAssetLockedAmt, scale8BigInt, amountAssetlLockedAmt)) | |
146 | + | ||
147 | + | ||
148 | + | func privateCalculatePrice (amoutAssetDecimals,priceAssetDecimals,amountAssetAmt,priceAssetAmt) = { | |
149 | + | let amountAssetAmtCasted = privateCastToScaleOf(amountAssetAmt, scale8, amoutAssetDecimals) | |
150 | + | let priceAssetAmtCasted = privateCastToScaleOf(priceAssetAmt, scale8, priceAssetDecimals) | |
151 | + | calculatePrice(priceAssetAmtCasted, amountAssetAmtCasted) | |
152 | + | } | |
153 | + | ||
154 | + | ||
155 | + | func privateGetAccountBalance (assetId) = if ((assetId == "WAVES")) | |
156 | + | then wavesBalance(this).available | |
157 | + | else assetBalance(this, fromBase58String(assetId)) | |
158 | + | ||
159 | + | ||
160 | + | func calculatePrices (amountAssetAmt,priceAssetAmt,lpAmount) = { | |
161 | + | let poolConfigDataList = getPoolConfig() | |
162 | + | let amoutAssetDecimals = parseIntValue(poolConfigDataList[idxAmountAssetDecimals]) | |
163 | + | let priceAssetDecimals = parseIntValue(poolConfigDataList[idxPriceAssetDecimals]) | |
164 | + | let poolPrice = privateCalculatePrice(amoutAssetDecimals, priceAssetDecimals, amountAssetAmt, priceAssetAmt) | |
165 | + | let amountAssetPoolLockedAmt = privateCastToScaleOf(amountAssetAmt, scale8, amoutAssetDecimals) | |
166 | + | let priceAssetPoolLockedAmt = privateCastToScaleOf(priceAssetAmt, scale8, priceAssetDecimals) | |
167 | + | let lpPriceInAmountAsset = calculatePrice(amountAssetPoolLockedAmt, lpAmount) | |
168 | + | let lpPriceInPriceAsset = calculatePrice(priceAssetPoolLockedAmt, lpAmount) | |
169 | + | [poolPrice, lpPriceInAmountAsset, lpPriceInPriceAsset] | |
170 | + | } | |
171 | + | ||
172 | + | ||
173 | + | func privateEstimateGetOperation (paymentLpAssetId,paymentLpAmount,userAddress) = { | |
174 | + | let poolConfigList = getPoolConfig() | |
175 | + | let lpAssetId = poolConfigList[idxPoolLPAssetId] | |
176 | + | let amountAssetId = poolConfigList[idxAmountAssetId] | |
177 | + | let priceAssetId = poolConfigList[idxPriceAssetId] | |
178 | + | let amountAssetInternalId = poolConfigList[idxAmountAssetInternalId] | |
179 | + | let priceAssetInternalId = poolConfigList[idxPriceAssetInternalId] | |
180 | + | let amoutAssetDecimals = parseIntValue(poolConfigList[idxAmountAssetDecimals]) | |
181 | + | let priceAssetDecimals = parseIntValue(poolConfigList[idxPriceAssetDecimals]) | |
182 | + | let poolStatus = poolConfigList[idxPoolStatus] | |
183 | + | let poolLiquidityList = getPoolLiquidity(amountAssetInternalId, priceAssetInternalId) | |
184 | + | let poolLPBalance = parseIntValue(poolLiquidityList[idxPoolLPAssetAmt]) | |
185 | + | let poolAmountAssetBalance = parseIntValue(poolLiquidityList[idxPoolAmountAssetAmt]) | |
186 | + | let poolPriceAssetBalance = parseIntValue(poolLiquidityList[idxPoolPriceAssetAmt]) | |
187 | + | if ((lpAssetId != paymentLpAssetId)) | |
188 | + | then throw("Invalid asset passed.") | |
189 | + | else { | |
190 | + | let amountAssetPoolLockedAmt = privateBigIntCastToScaleOf(toBigInt(privateGetAccountBalance(amountAssetId)), scale18, toBigInt(amoutAssetDecimals)) | |
191 | + | let priceAssetPoolLockedAmt = privateBigIntCastToScaleOf(toBigInt(privateGetAccountBalance(priceAssetId)), scale18, toBigInt(priceAssetDecimals)) | |
192 | + | let currentPrice = calculatePriceBigInt(priceAssetPoolLockedAmt, amountAssetPoolLockedAmt) | |
193 | + | let paymentLpAmountBuf = privateBigIntCastToScaleOf(toBigInt(paymentLpAmount), scale18, scale8BigInt) | |
194 | + | let poolLPBalanceBuf = privateBigIntCastToScaleOf(toBigInt(poolLPBalance), scale18, scale8BigInt) | |
195 | + | let outAmountAssetAmt = fraction(amountAssetPoolLockedAmt, paymentLpAmountBuf, poolLPBalanceBuf) | |
196 | + | let outPriceAssetAmt = fraction(priceAssetPoolLockedAmt, paymentLpAmountBuf, poolLPBalanceBuf) | |
197 | + | let outAmountAssetAmtFinal = toInt(privateBigIntCastToScaleOf(outAmountAssetAmt, toBigInt(amoutAssetDecimals), scale18)) | |
198 | + | let outPriceAssetAmtFinal = toInt(privateBigIntCastToScaleOf(outPriceAssetAmt, toBigInt(priceAssetDecimals), scale18)) | |
199 | + | $Tuple11(outAmountAssetAmtFinal, outPriceAssetAmtFinal, amountAssetInternalId, priceAssetInternalId, amountAssetId, priceAssetId, poolAmountAssetBalance, poolPriceAssetBalance, poolLPBalance, currentPrice, poolStatus) | |
200 | + | } | |
201 | + | } | |
202 | + | ||
203 | + | ||
204 | + | func privateEstimatePutOperation (slippageTolerance,inAmountAssetAmt,inAmountAssetId,inPriceAssetAmt,inPriceAssetId,userAddress,isEvaluate) = { | |
205 | + | let poolConfigDataList = getPoolConfig() | |
206 | + | let lpAssetId = fromBase58String(poolConfigDataList[idxPoolLPAssetId]) | |
207 | + | let amountAssetId = poolConfigDataList[idxAmountAssetId] | |
208 | + | let priceAssetId = poolConfigDataList[idxPriceAssetId] | |
209 | + | let amountAssetInternalId = poolConfigDataList[idxAmountAssetInternalId] | |
210 | + | let priceAssetInternalId = poolConfigDataList[idxPriceAssetInternalId] | |
211 | + | let amoutAssetDecimals = parseIntValue(poolConfigDataList[idxAmountAssetDecimals]) | |
212 | + | let priceAssetDecimals = parseIntValue(poolConfigDataList[idxPriceAssetDecimals]) | |
213 | + | let poolStatus = poolConfigDataList[idxPoolStatus] | |
214 | + | let poolLiquidityDataList = getPoolLiquidity(amountAssetInternalId, priceAssetInternalId) | |
215 | + | let poolAmountAssetBalance = parseIntValue(poolLiquidityDataList[idxPoolAmountAssetAmt]) | |
216 | + | let poolPriceAssetBalance = parseIntValue(poolLiquidityDataList[idxPoolPriceAssetAmt]) | |
217 | + | let poolLPBalance = parseIntValue(poolLiquidityDataList[idxPoolLPAssetAmt]) | |
218 | + | if (if ((amountAssetId != inAmountAssetId)) | |
219 | + | then true | |
220 | + | else (priceAssetId != inPriceAssetId)) | |
221 | + | then throw("Invalid amount or price asset passed.") | |
222 | + | else { | |
223 | + | let accountAmountAssetBalance = if (isEvaluate) | |
224 | + | then privateGetAccountBalance(amountAssetId) | |
225 | + | else (privateGetAccountBalance(amountAssetId) - inAmountAssetAmt) | |
226 | + | let accountPriceAssetBalance = if (isEvaluate) | |
227 | + | then privateGetAccountBalance(priceAssetId) | |
228 | + | else (privateGetAccountBalance(priceAssetId) - inPriceAssetAmt) | |
229 | + | let amoutAssetDecimalsBigInt = toBigInt(amoutAssetDecimals) | |
230 | + | let priceAssetDecimalsBigInt = toBigInt(priceAssetDecimals) | |
231 | + | let inAmountAssetAmtCalculated = privateBigIntCastToScaleOf(toBigInt(inAmountAssetAmt), scale18, amoutAssetDecimalsBigInt) | |
232 | + | let inPriceAssetAmtCalculated = privateBigIntCastToScaleOf(toBigInt(inPriceAssetAmt), scale18, priceAssetDecimalsBigInt) | |
233 | + | let userPrice = calculatePriceBigInt(inPriceAssetAmtCalculated, inAmountAssetAmtCalculated) | |
234 | + | let amountAssetPoolLockedAmt = privateBigIntCastToScaleOf(toBigInt(accountAmountAssetBalance), scale18, amoutAssetDecimalsBigInt) | |
235 | + | let priceAssetPoolLockedAmt = privateBigIntCastToScaleOf(toBigInt(accountPriceAssetBalance), scale18, priceAssetDecimalsBigInt) | |
236 | + | let curentPrice = if ((poolLPBalance == 0)) | |
237 | + | then 0 | |
238 | + | else calculatePriceBigInt(priceAssetPoolLockedAmt, amountAssetPoolLockedAmt) | |
239 | + | let slippage = if ((curentPrice == 0)) | |
240 | + | then 0 | |
241 | + | else if ((curentPrice > userPrice)) | |
242 | + | then fraction((curentPrice - userPrice), 100, curentPrice) | |
243 | + | else fraction((userPrice - curentPrice), 100, curentPrice) | |
244 | + | if (if ((curentPrice != 0)) | |
245 | + | then ((slippage * scale8) > slippageTolerance) | |
246 | + | else false) | |
247 | + | then throw(((("Price slippage " + toString((slippage * scale8))) + " exceeded the passed limit of ") + toString(slippageTolerance))) | |
248 | + | else { | |
249 | + | let finalPrice = calculatePriceBigInt((priceAssetPoolLockedAmt + inPriceAssetAmtCalculated), (amountAssetPoolLockedAmt + inAmountAssetAmtCalculated)) | |
250 | + | let outLpAmount = if ((poolLPBalance == 0)) | |
251 | + | then { | |
252 | + | let lpResultBuf = pow((inAmountAssetAmtCalculated * inPriceAssetAmtCalculated), 0, toBigInt(5), 1, 0, DOWN) | |
253 | + | toInt(privateBigIntCastToScaleOf(lpResultBuf, scale8BigInt, scale18)) | |
254 | + | } | |
255 | + | else { | |
256 | + | let poolLPBalanceBuf = privateBigIntCastToScaleOf(toBigInt(poolLPBalance), scale18, scale8BigInt) | |
257 | + | let lpAmtByAmountAsset = toInt(privateBigIntCastToScaleOf(fraction(poolLPBalanceBuf, inAmountAssetAmtCalculated, amountAssetPoolLockedAmt), scale8BigInt, scale18)) | |
258 | + | let lpAmtByPriceAsset = toInt(privateBigIntCastToScaleOf(fraction(poolLPBalanceBuf, inPriceAssetAmtCalculated, priceAssetPoolLockedAmt), scale8BigInt, scale18)) | |
259 | + | if ((lpAmtByPriceAsset > lpAmtByAmountAsset)) | |
260 | + | then lpAmtByAmountAsset | |
261 | + | else lpAmtByPriceAsset | |
262 | + | } | |
263 | + | if ((0 >= outLpAmount)) | |
264 | + | then throw("Invalid calculations. LP calculated is less than zero.") | |
265 | + | else $Tuple10(outLpAmount, finalPrice, poolAmountAssetBalance, poolPriceAssetBalance, poolLPBalance, amountAssetInternalId, priceAssetInternalId, lpAssetId, slippage, poolStatus) | |
266 | + | } | |
267 | + | } | |
268 | + | } | |
269 | + | ||
270 | + | ||
271 | + | func validateMatcherOrderAllowed (order) = { | |
272 | + | let poolConfigDataList = getPoolConfig() | |
273 | + | let amountAssetId = poolConfigDataList[idxAmountAssetId] | |
274 | + | let priceAssetId = poolConfigDataList[idxPriceAssetId] | |
275 | + | let poolStatus = parseIntValue(poolConfigDataList[idxPoolStatus]) | |
276 | + | let matcherPublicKeyStr = poolConfigDataList[idxMatcherPublicKey] | |
277 | + | let amountAssetDecimals = parseIntValue(poolConfigDataList[idxAmountAssetDecimals]) | |
278 | + | let priceAssetDecimals = parseIntValue(poolConfigDataList[idxPriceAssetDecimals]) | |
279 | + | let accountAmountAssetBalance = privateGetAccountBalance(amountAssetId) | |
280 | + | let accountPriceAssetBalance = privateGetAccountBalance(priceAssetId) | |
281 | + | let currentPrice = if ((order.orderType == Buy)) | |
282 | + | then privateCalculatePrice(amountAssetDecimals, priceAssetDecimals, (accountAmountAssetBalance + order.amount), accountPriceAssetBalance) | |
283 | + | else privateCalculatePrice(amountAssetDecimals, priceAssetDecimals, (accountAmountAssetBalance + order.amount), accountPriceAssetBalance) | |
284 | + | let isPoolStatusValid = if (if (if (isGlobalShutdown()) | |
285 | + | then true | |
286 | + | else (poolStatus == PoolMatcherDisabled)) | |
287 | + | then true | |
288 | + | else (poolStatus == PoolShutdown)) | |
289 | + | then false | |
290 | + | else true | |
291 | + | let isValidMatcherSign = true | |
292 | + | let orderAmountAsset = order.assetPair.amountAsset | |
293 | + | let orderAmountAssetStr = if ((orderAmountAsset == unit)) | |
294 | + | then "WAVES" | |
295 | + | else toBase58String(value(orderAmountAsset)) | |
296 | + | let orderPriceAsset = order.assetPair.priceAsset | |
297 | + | let orderPriceAssetStr = if ((orderPriceAsset == unit)) | |
298 | + | then "WAVES" | |
299 | + | else toBase58String(value(orderPriceAsset)) | |
300 | + | let isValidAssetPair = if (if ((orderAmountAssetStr != amountAssetId)) | |
301 | + | then true | |
302 | + | else (orderPriceAssetStr != priceAssetId)) | |
303 | + | then false | |
304 | + | else true | |
305 | + | let orderPrice = order.price | |
306 | + | let priceDecimals = fraction(scale8, priceAssetDecimals, amountAssetDecimals) | |
307 | + | let castedOrderPrice = privateCastToScaleOf(orderPrice, scale8, priceDecimals) | |
308 | + | let isOrderPriceValid = if ((order.orderType == Buy)) | |
309 | + | then (currentPrice >= castedOrderPrice) | |
310 | + | else (castedOrderPrice >= currentPrice) | |
311 | + | if (if (if (isValidAssetPair) | |
312 | + | then isValidMatcherSign | |
313 | + | else false) | |
314 | + | then isPoolStatusValid | |
315 | + | else false) | |
316 | + | then isOrderPriceValid | |
317 | + | else false | |
318 | + | } | |
319 | + | ||
320 | + | ||
321 | + | @Callable(i) | |
322 | + | func constructor (factoryContract) = if ((i.caller != this)) | |
323 | + | then throw("permissions denied") | |
324 | + | else [StringEntry(keyFactoryContract(), factoryContract)] | |
325 | + | ||
326 | + | ||
327 | + | ||
328 | + | @Callable(i) | |
329 | + | func put (slippageTolerance,shouldAutoStake) = { | |
330 | + | let factoryConfigList = getFactoryConfig() | |
331 | + | let stakingContract = valueOrErrorMessage(addressFromString(factoryConfigList[idxFactoryStakingContract]), "Error. Incorrect staking address.") | |
332 | + | let pmtAmountAsset = value(i.payments[0]) | |
333 | + | let inAmountAssetAmt = pmtAmountAsset.amount | |
334 | + | let inAmountAssetId = if (!(isDefined(pmtAmountAsset.assetId))) | |
335 | + | then fromBase58String("WAVES") | |
336 | + | else value(pmtAmountAsset.assetId) | |
337 | + | let pmtPriceAsset = value(i.payments[1]) | |
338 | + | let inPriceAssetAmt = pmtPriceAsset.amount | |
339 | + | let inPriceAssetId = if (!(isDefined(pmtPriceAsset.assetId))) | |
340 | + | then fromBase58String("WAVES") | |
341 | + | else value(pmtPriceAsset.assetId) | |
342 | + | let estimatedPutResults = privateEstimatePutOperation(slippageTolerance, inAmountAssetAmt, toBase58String(inAmountAssetId), inPriceAssetAmt, toBase58String(inPriceAssetId), toString(i.caller), false) | |
343 | + | let outLpAmount = estimatedPutResults._1 | |
344 | + | let curentPrice = estimatedPutResults._2 | |
345 | + | let poolAmountAssetBalance = estimatedPutResults._3 | |
346 | + | let poolPriceAssetBalance = estimatedPutResults._4 | |
347 | + | let poolLPBalance = estimatedPutResults._5 | |
348 | + | let amountAssetInternalId = estimatedPutResults._6 | |
349 | + | let priceAssetInternalId = estimatedPutResults._7 | |
350 | + | let lpAssetId = estimatedPutResults._8 | |
351 | + | let slippageCalculated = estimatedPutResults._9 | |
352 | + | let poolStatus = parseIntValue(estimatedPutResults._10) | |
353 | + | if (if (if (isGlobalShutdown()) | |
354 | + | then true | |
355 | + | else (poolStatus == PoolPutDisabled)) | |
356 | + | then true | |
357 | + | else (poolStatus == PoolShutdown)) | |
358 | + | then throw(("Put operation is blocked by admin. Status = " + toString(poolStatus))) | |
359 | + | else { | |
360 | + | let emitLPAssetOnFactory = invoke(factoryContract, "emit", [outLpAmount], nil) | |
361 | + | if ((emitLPAssetOnFactory == emitLPAssetOnFactory)) | |
362 | + | then if ((emitLPAssetOnFactory != "success")) | |
363 | + | then throw("LP asset reissue failed during emit call on factory.") | |
364 | + | else { | |
365 | + | let results = [StringEntry(keyPriceLast(), ("%s__" + toString(curentPrice))), StringEntry(keyPriceHistory(height, lastBlock.timestamp), ("%s__" + toString(curentPrice))), StringEntry(keyPutActionByUser(toString(i.caller), toBase58String(i.transactionId)), dataPutActionInfo(inAmountAssetAmt, inPriceAssetAmt, outLpAmount, curentPrice, slippageTolerance, slippageCalculated, height, lastBlock.timestamp)), StringEntry(keyPoolLiquidity(amountAssetInternalId, priceAssetInternalId), dataPoolLiquidity((poolAmountAssetBalance + inAmountAssetAmt), (poolPriceAssetBalance + inPriceAssetAmt), (poolLPBalance + outLpAmount)))] | |
366 | + | if (shouldAutoStake) | |
367 | + | then { | |
368 | + | let stake = invoke(stakingContract, "stake", nil, [AttachedPayment(lpAssetId, outLpAmount)]) | |
369 | + | if ((stake == stake)) | |
370 | + | then results | |
371 | + | else throw("Strict value is not equal to itself.") | |
372 | + | } | |
373 | + | else (results :+ ScriptTransfer(i.caller, outLpAmount, lpAssetId)) | |
374 | + | } | |
375 | + | else throw("Strict value is not equal to itself.") | |
376 | + | } | |
377 | + | } | |
378 | + | ||
379 | + | ||
380 | + | ||
381 | + | @Callable(i) | |
382 | + | func get () = { | |
383 | + | let pmtAmountAsset = value(i.payments[0]) | |
384 | + | let pmtAssetId = value(pmtAmountAsset.assetId) | |
385 | + | let pmtAssetAmount = pmtAmountAsset.amount | |
386 | + | let results = privateEstimateGetOperation(toBase58String(pmtAssetId), pmtAssetAmount, toString(i.caller)) | |
387 | + | let outAmountAssetAmt = results._1 | |
388 | + | let outPriceAssetAmt = results._2 | |
389 | + | let amountAssetInternalId = results._3 | |
390 | + | let priceAssetInternalId = results._4 | |
391 | + | let amountAssetId = results._5 | |
392 | + | let priceAssetId = results._6 | |
393 | + | let poolAmountAssetBalance = results._7 | |
394 | + | let poolPriceAssetBalance = results._8 | |
395 | + | let poolLPBalance = results._9 | |
396 | + | let currentPrice = results._10 | |
397 | + | let poolStatus = parseIntValue(results._11) | |
398 | + | if (if (isGlobalShutdown()) | |
399 | + | then true | |
400 | + | else (poolStatus == PoolShutdown)) | |
401 | + | then throw(("Get operation is blocked by admin. Status = " + toString(poolStatus))) | |
402 | + | else { | |
403 | + | let burnLPAssetOnFactory = invoke(factoryContract, "burn", [pmtAssetAmount], [AttachedPayment(pmtAssetId, pmtAssetAmount)]) | |
404 | + | if ((burnLPAssetOnFactory == burnLPAssetOnFactory)) | |
405 | + | then if ((burnLPAssetOnFactory != "success")) | |
406 | + | then throw("LP asset burn failed during emit call on factory.") | |
407 | + | else [ScriptTransfer(i.caller, outAmountAssetAmt, if ((amountAssetId == "WAVES")) | |
408 | + | then unit | |
409 | + | else fromBase58String(amountAssetId)), ScriptTransfer(i.caller, outPriceAssetAmt, fromBase58String(priceAssetId)), StringEntry(keyPoolLiquidity(amountAssetInternalId, priceAssetInternalId), dataPoolLiquidity((poolAmountAssetBalance - outAmountAssetAmt), (poolPriceAssetBalance - outPriceAssetAmt), (poolLPBalance - pmtAssetAmount))), StringEntry(keyGetActionByUser(toString(i.caller), toBase58String(i.transactionId)), dataGetActionInfo(outAmountAssetAmt, outPriceAssetAmt, pmtAssetAmount, currentPrice, height, lastBlock.timestamp)), StringEntry(keyPriceLast(), ("%s__" + toString(currentPrice))), StringEntry(keyPriceHistory(height, lastBlock.timestamp), ("%s__" + toString(currentPrice)))] | |
410 | + | else throw("Strict value is not equal to itself.") | |
411 | + | } | |
412 | + | } | |
413 | + | ||
414 | + | ||
415 | + | ||
416 | + | @Callable(i) | |
417 | + | func activate (amountAssetStr,priceAssetStr) = if ((toString(i.caller) != toString(factoryContract))) | |
418 | + | then throw("permissions denied") | |
419 | + | else $Tuple2([StringEntry(keyAmountAsset(), amountAssetStr), StringEntry(keyPriceAsset(), priceAssetStr)], "success") | |
420 | + | ||
421 | + | ||
422 | + | ||
423 | + | @Callable(i) | |
424 | + | func statsREADONLY () = { | |
425 | + | let poolConfigDataList = getPoolConfig() | |
426 | + | let lpAssetId = fromBase58String(poolConfigDataList[idxPoolLPAssetId]) | |
427 | + | let amountAssetId = poolConfigDataList[idxAmountAssetId] | |
428 | + | let priceAssetId = poolConfigDataList[idxPriceAssetId] | |
429 | + | let amountAssetInternalId = poolConfigDataList[idxAmountAssetInternalId] | |
430 | + | let priceAssetInternalId = poolConfigDataList[idxPriceAssetInternalId] | |
431 | + | let amoutAssetDecimals = parseIntValue(poolConfigDataList[idxAmountAssetDecimals]) | |
432 | + | let priceAssetDecimals = parseIntValue(poolConfigDataList[idxPriceAssetDecimals]) | |
433 | + | let poolLiquidityDataList = getPoolLiquidity(amountAssetInternalId, priceAssetInternalId) | |
434 | + | let poolLPBalance = parseIntValue(poolLiquidityDataList[idxPoolLPAssetAmt]) | |
435 | + | let accountAmountAssetBalance = privateGetAccountBalance(amountAssetId) | |
436 | + | let accountPriceAssetBalance = privateGetAccountBalance(priceAssetId) | |
437 | + | let pricesList = calculatePrices(accountAmountAssetBalance, accountPriceAssetBalance, poolLPBalance) | |
438 | + | let currentPrice = pricesList[0] | |
439 | + | let lpAmountAssetShare = pricesList[1] | |
440 | + | let lpPriceAssetShare = pricesList[2] | |
441 | + | let poolWeight = valueOrErrorMessage(getInteger(factoryContract, keyPoolWeight(toString(this))), "Pool doesn't have weight.") | |
442 | + | $Tuple2(nil, makeString(["%d%d%d%d%d%d%d", toString(accountAmountAssetBalance), toString(accountPriceAssetBalance), toString(poolLPBalance), toString(currentPrice), toString(lpAmountAssetShare), toString(lpPriceAssetShare), toString(poolWeight)], SEP)) | |
443 | + | } | |
444 | + | ||
445 | + | ||
446 | + | ||
447 | + | @Callable(i) | |
448 | + | func evaluatePutByAmountAssetREADONLY (slippageTolerance,inAmountAssetAmt,userAddress) = { | |
449 | + | let poolConfigDataList = getPoolConfig() | |
450 | + | let lpAssetId = fromBase58String(poolConfigDataList[idxPoolLPAssetId]) | |
451 | + | let amountAssetId = poolConfigDataList[idxAmountAssetId] | |
452 | + | let priceAssetId = poolConfigDataList[idxPriceAssetId] | |
453 | + | let amountAssetInternalId = poolConfigDataList[idxAmountAssetInternalId] | |
454 | + | let priceAssetInternalId = poolConfigDataList[idxPriceAssetInternalId] | |
455 | + | let amoutAssetDecimals = parseIntValue(poolConfigDataList[idxAmountAssetDecimals]) | |
456 | + | let priceAssetDecimals = parseIntValue(poolConfigDataList[idxPriceAssetDecimals]) | |
457 | + | let poolStatus = poolConfigDataList[idxPoolStatus] | |
458 | + | let poolLiquidityDataList = getPoolLiquidity(amountAssetInternalId, priceAssetInternalId) | |
459 | + | let poolLPBalance = parseIntValue(poolLiquidityDataList[idxPoolLPAssetAmt]) | |
460 | + | let accountAmountAssetBalance = privateGetAccountBalance(amountAssetId) | |
461 | + | let accountPriceAssetBalance = privateGetAccountBalance(priceAssetId) | |
462 | + | let accountAmountAssetBalanceCasted = privateCastToScaleOf(accountAmountAssetBalance, scale8, amoutAssetDecimals) | |
463 | + | let accountPriceAssetBalanceCasted = privateCastToScaleOf(accountPriceAssetBalance, scale8, priceAssetDecimals) | |
464 | + | let curentPrice = if ((poolLPBalance == 0)) | |
465 | + | then 0 | |
466 | + | else calculatePrice(accountPriceAssetBalanceCasted, accountAmountAssetBalanceCasted) | |
467 | + | let inPriceAssetAmtCalculated = fraction(inAmountAssetAmt, curentPrice, scale8) | |
468 | + | let inPriceAssetAmt = privateCastToScaleOf(inPriceAssetAmtCalculated, priceAssetDecimals, scale8) | |
469 | + | let estimatedPutResults = privateEstimatePutOperation(slippageTolerance, inAmountAssetAmt, amountAssetId, inPriceAssetAmt, priceAssetId, userAddress, true) | |
470 | + | let outLpAmountCalc = estimatedPutResults._1 | |
471 | + | let curentPriceCalc = estimatedPutResults._2 | |
472 | + | let poolAmountAssetBalanceCalc = estimatedPutResults._3 | |
473 | + | let poolPriceAssetBalanceCAlc = estimatedPutResults._4 | |
474 | + | let poolLPBalanceCalc = estimatedPutResults._5 | |
475 | + | let poolStatusCalc = parseIntValue(estimatedPutResults._10) | |
476 | + | $Tuple2(nil, makeString(["%d%d%d%d%d%d", toString(outLpAmountCalc), toString(curentPrice), toString(poolAmountAssetBalanceCalc), toString(poolPriceAssetBalanceCAlc), toString(poolLPBalanceCalc), toString(poolStatusCalc)], SEP)) | |
477 | + | } | |
478 | + | ||
479 | + | ||
480 | + | ||
481 | + | @Callable(i) | |
482 | + | func evaluatePutByPriceAssetREADONLY (slippageTolerance,inPriceAssetAmt,userAddress) = { | |
483 | + | let poolConfigDataList = getPoolConfig() | |
484 | + | let lpAssetId = fromBase58String(poolConfigDataList[idxPoolLPAssetId]) | |
485 | + | let amountAssetId = poolConfigDataList[idxAmountAssetId] | |
486 | + | let priceAssetId = poolConfigDataList[idxPriceAssetId] | |
487 | + | let amountAssetInternalId = poolConfigDataList[idxAmountAssetInternalId] | |
488 | + | let priceAssetInternalId = poolConfigDataList[idxPriceAssetInternalId] | |
489 | + | let amoutAssetDecimals = parseIntValue(poolConfigDataList[idxAmountAssetDecimals]) | |
490 | + | let priceAssetDecimals = parseIntValue(poolConfigDataList[idxPriceAssetDecimals]) | |
491 | + | let poolStatus = poolConfigDataList[idxPoolStatus] | |
492 | + | let poolLiquidityDataList = getPoolLiquidity(amountAssetInternalId, priceAssetInternalId) | |
493 | + | let poolLPBalance = parseIntValue(poolLiquidityDataList[idxPoolLPAssetAmt]) | |
494 | + | let accountAmountAssetBalance = privateGetAccountBalance(amountAssetId) | |
495 | + | let accountPriceAssetBalance = privateGetAccountBalance(priceAssetId) | |
496 | + | let accountAmountAssetBalanceCasted = privateCastToScaleOf(accountAmountAssetBalance, scale8, amoutAssetDecimals) | |
497 | + | let accountPriceAssetBalanceCasted = privateCastToScaleOf(accountPriceAssetBalance, scale8, priceAssetDecimals) | |
498 | + | let inPriceAssetAmtCalculatedTuple = privateCastToScaleOf(inPriceAssetAmt, scale8, priceAssetDecimals) | |
499 | + | let curentPrice = if ((poolLPBalance == 0)) | |
500 | + | then 0 | |
501 | + | else calculatePrice(accountPriceAssetBalanceCasted, accountAmountAssetBalanceCasted) | |
502 | + | let inAmountAssetAmtCalculated = fraction(inPriceAssetAmtCalculatedTuple, scale8, curentPrice) | |
503 | + | let inAmountAssetAmt = privateCastToScaleOf(inAmountAssetAmtCalculated, amoutAssetDecimals, scale8) | |
504 | + | let estimatedPutResults = privateEstimatePutOperation(slippageTolerance, inAmountAssetAmt, amountAssetId, inPriceAssetAmt, priceAssetId, userAddress, true) | |
505 | + | let outLpAmountCalc = estimatedPutResults._1 | |
506 | + | let curentPriceCalc = estimatedPutResults._2 | |
507 | + | let poolAmountAssetBalanceCalc = estimatedPutResults._3 | |
508 | + | let poolPriceAssetBalanceCAlc = estimatedPutResults._4 | |
509 | + | let poolLPBalanceCalc = estimatedPutResults._5 | |
510 | + | let poolStatusCalc = parseIntValue(estimatedPutResults._10) | |
511 | + | $Tuple2(nil, makeString(["%d%d%d%d%d%d", toString(outLpAmountCalc), toString(curentPrice), toString(poolAmountAssetBalanceCalc), toString(poolPriceAssetBalanceCAlc), toString(poolLPBalanceCalc), toString(poolStatusCalc)], SEP)) | |
512 | + | } | |
513 | + | ||
514 | + | ||
515 | + | ||
516 | + | @Callable(i) | |
517 | + | func evaluateGetREADONLY (paymentLpAssetId,paymentLpAmount,userAddress) = { | |
518 | + | let results = privateEstimateGetOperation(paymentLpAssetId, paymentLpAmount, userAddress) | |
519 | + | let outAmountAssetAmt = results._1 | |
520 | + | let outPriceAssetAmt = results._2 | |
521 | + | let poolAmountAssetBalance = results._7 | |
522 | + | let poolPriceAssetBalance = results._8 | |
523 | + | let poolLPBalance = results._9 | |
524 | + | let currentPrice = results._10 | |
525 | + | let poolStatus = parseIntValue(results._11) | |
526 | + | $Tuple2(nil, makeString(["%d%d%d%d%d%d%d", toString(outAmountAssetAmt), toString(outPriceAssetAmt), toString(poolAmountAssetBalance), toString(poolPriceAssetBalance), toString(poolLPBalance), toString(currentPrice), toString(poolStatus)], SEP)) | |
527 | + | } | |
528 | + | ||
529 | + | ||
530 | + | ||
531 | + | @Callable(i) | |
532 | + | func hashREADONLY () = $Tuple2(nil, toBase64String(value(scriptHash(this)))) | |
533 | + | ||
534 | + | ||
535 | + | @Verifier(tx) | |
536 | + | func verify () = match tx { | |
537 | + | case order: Order => | |
538 | + | sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey) | |
539 | + | case _ => | |
540 | + | sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey) | |
541 | + | } | |
542 | + |
github/deemru/w8io/169f3d6 42.56 ms ◑