tx · EoH2FG9DC8Jo3McV9Mkgus5USkCvr58XNywYxDqkX27a

3P5fnEVxY8DFCNqfigRqFJRCjBAUbpP6Rr4:  -0.01400000 Waves

2020.12.09 19:53 [2365098] smart account 3P5fnEVxY8DFCNqfigRqFJRCjBAUbpP6Rr4 > SELF 0.00000000 Waves

{ "type": 13, "id": "EoH2FG9DC8Jo3McV9Mkgus5USkCvr58XNywYxDqkX27a", "fee": 1400000, "feeAssetId": null, "timestamp": 1607532844790, "version": 1, "sender": "3P5fnEVxY8DFCNqfigRqFJRCjBAUbpP6Rr4", "senderPublicKey": "3Bb6XrvrXqjKXcBrLrLXbbA95A1voNpDuejTkSrYGuQs", "proofs": [ "GAjn2KWEdx2i3PheNq1Lakjprot8P4ZC2yGszD9JqMiTvNDfC6Y7QvWjbqJsXsmwgfp4aospH4jbKmMPMUa8557" ], "script": "base64:AAIEAAAAAAAAABMIAhIAEgASBAoCCAgSABIDCgEIAAAAbgEAAAARa2V5QWNjdW11bGF0ZWRGZWUAAAAAAgAAABIlc19fYWNjdW11bGF0ZWRGZWUBAAAADmtleVVjb2xsYXRlcmFsAAAAAAIAAAAPJXNfX3Vjb2xsYXRlcmFsAQAAABlrZXlUb3RhbExlbmRlZEF0T3RoZXJBY2NzAAAAAAIAAAAaJXNfX3RvdGFsTGVuZGVkQXRPdGhlckFjY3MBAAAAE2tleUFzc2V0TG9ja2VkVG90YWwAAAABAAAAB2Fzc2V0SWQJAAEsAAAAAgIAAAAYJXMlc19fYXNzZXRMb2NrZWRUb3RhbF9fBQAAAAdhc3NldElkAQAAABNrZXlBY2NvdW50T3BlcmF0aW9uAAAAAwAAAAx1bmxvY2tIZWlnaHQAAAAHYWRkcmVzcwAAAAZzdGF0dXMJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAB4lcyVzJWQlc19fZGVmb0Fzc2V0T3BlcmF0aW9uX18FAAAAB2FkZHJlc3MCAAAAAl9fCQABpAAAAAEFAAAADHVubG9ja0hlaWdodAIAAAACX18FAAAABnN0YXR1cwEAAAAKa2V5RmFjdG9yeQAAAAACAAAACyVzX19mYWN0b3J5AQAAABprZXlMZW5kZWRBbW91bnRCeUFzc2V0Q29kZQAAAAEAAAAJYXNzZXRDb2RlCQABLAAAAAICAAAAHSVzJXNfX2xlbmRlZEJhc2VBc3NldEFtb3VudF9fBQAAAAlhc3NldENvZGUBAAAACGtleVByaWNlAAAAAQAAAAlhc3NldENvZGUJAAEsAAAAAgIAAAANJXMlc19fcHJpY2VfXwUAAAAJYXNzZXRDb2RlAQAAABRrZXlDb250cm9sTGFzdEhlaWdodAAAAAEAAAAJYXNzZXRDb2RlCQABLAAAAAICAAAAEiVzJXNfX2xhc3RIZWlnaHRfXwUAAAAJYXNzZXRDb2RlAAAAABRJZHhPcGVyYXRpb25BbW91bnRJbgAAAAAAAAAAAQAAAAATSWR4T3BlcmF0aW9uQXNzZXRJbgAAAAAAAAAAAgAAAAARSWR4T3BlcmF0aW9uUHJpY2UAAAAAAAAAAAMAAAAAFUlkeE9wZXJhdGlvbkFtb3VudE91dAAAAAAAAAAABAAAAAAUSWR4T3BlcmF0aW9uQXNzZXRPdXQAAAAAAAAAAAUBAAAAFmFzc2V0RGF0YVN3YXBPcGVyYXRpb24AAAAHAAAACGFtb3VudEluAAAAB2Fzc2V0SW4AAAAFcHJpY2UAAAAJYW1vdW50T3V0AAAACGFzc2V0T3V0AAAADGJydXR0b0Ftb3VudAAAAAlmZWVBbW91bnQJAAS5AAAAAgkABEwAAAACAgAAAA4lZCVzJWQlcyVkJWQlZAkABEwAAAACCQABpAAAAAEFAAAACGFtb3VudEluCQAETAAAAAIFAAAAB2Fzc2V0SW4JAARMAAAAAgkAAaQAAAABBQAAAAlhbW91bnRPdXQJAARMAAAAAgUAAAAIYXNzZXRPdXQJAARMAAAAAgkAAaQAAAABBQAAAAVwcmljZQkABEwAAAACCQABpAAAAAEFAAAADGJydXR0b0Ftb3VudAkABEwAAAACCQABpAAAAAEFAAAACWZlZUFtb3VudAUAAAADbmlsAgAAAAJfXwEAAAAXYXNzZXREYXRhUmViYWxhbmNlVHJhY2UAAAAFAAAAD2RlYnRvckFzc2V0Q29kZQAAAAdkZWJ0UG10AAAAB2Jhc2VQbXQAAAAPbGVuZGVkQW10QmVmb3JlAAAADmxlbmRlZEFtdEFmdGVyCQAEuQAAAAIJAARMAAAAAgIAAAAOJXMlcyVkJXMlZCVkJWQJAARMAAAAAgUAAAAPZGVidG9yQXNzZXRDb2RlCQAETAAAAAIJAAJYAAAAAQkBAAAABXZhbHVlAAAAAQgFAAAAB2RlYnRQbXQAAAAHYXNzZXRJZAkABEwAAAACCQABpAAAAAEIBQAAAAdkZWJ0UG10AAAABmFtb3VudAkABEwAAAACCQACWAAAAAEJAQAAAAV2YWx1ZQAAAAEIBQAAAAdiYXNlUG10AAAAB2Fzc2V0SWQJAARMAAAAAgkAAaQAAAABCAUAAAAHYmFzZVBtdAAAAAZhbW91bnQJAARMAAAAAgkAAaQAAAABBQAAAA9sZW5kZWRBbXRCZWZvcmUJAARMAAAAAgkAAaQAAAABBQAAAA5sZW5kZWRBbXRBZnRlcgUAAAADbmlsAgAAAAJfXwEAAAAcYXNzZXRSZWFkU3dhcERhdGFBcnJheU9yRmFpbAAAAAEAAAAPYWNjT3BlcmF0aW9uS2V5BAAAABNhY2NPcGVyYXRpb25EYXRhU3RyCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQdAAAAAgUAAAAEdGhpcwUAAAAPYWNjT3BlcmF0aW9uS2V5CQABLAAAAAICAAAAKlRoZXJlIGlzIG5vIHJlcXVlc3QgZm9yIHBhc3NlZCBhcmd1bWVudHM6IAUAAAAPYWNjT3BlcmF0aW9uS2V5CQAEtQAAAAIFAAAAE2FjY09wZXJhdGlvbkRhdGFTdHICAAAAAl9fAAAAAAdudWxsSW50AP//////////AAAAAAdudWxsU3RyAgAAAAROVUxMAAAAAApmYWN0b3J5QWNjCQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQdAAAAAgUAAAAEdGhpcwkBAAAACmtleUZhY3RvcnkAAAAACQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAABJObyBjb25maWcgYXQgdGhpcz0JAAQlAAAAAQUAAAAEdGhpcwIAAAAJIGZvciBrZXk9CQEAAAAKa2V5RmFjdG9yeQAAAAABAAAAFWtleUZhY3RvcnlEZWJ0QXNzZXRJZAAAAAACAAAAHyVzJXNfX2NvbW1vbkNvbmZpZ19fZGVidEFzc2V0SWQBAAAAIGtleUZhY3RvcnlEZWJ0QXNzZXRFdGFsb25CYWxhbmNlAAAAAAIAAAAqJXMlc19fY29tbW9uQ29uZmlnX19kZWJ0QXNzZXRFdGFsb25CYWxhbmNlAQAAABJrZXlGYWN0b3J5QXNzZXRDZmcAAAABAAAAD2Fzc2V0QWRkcmVzc1N0cgkAASwAAAACCQABLAAAAAICAAAAEyVzJXMlc19fZGVmb0Fzc2V0X18FAAAAD2Fzc2V0QWRkcmVzc1N0cgIAAAAIX19jb25maWcBAAAAGmtleUZhY3RvcnlBc3NldEN1cnJlbnRQb29sAAAAAQAAAA9hc3NldEFjY0FkZHJlc3MJAAEsAAAAAgkAASwAAAACAgAAABMlcyVzJXNfX2RlZm9Bc3NldF9fCQAEJQAAAAEFAAAAD2Fzc2V0QWNjQWRkcmVzcwIAAAANX19jdXJyZW50UG9vbAEAAAAga2V5RmFjdG9yeURlZm9BZGRyZXNzQnlBc3NldENvZGUAAAABAAAACWFzc2V0Q29kZQkAASwAAAACCQABLAAAAAICAAAAEyVzJXMlc19fZGVmb0Fzc2V0X18FAAAACWFzc2V0Q29kZQIAAAAUX19hZGRyZXNzQnlBc3NldENvZGUBAAAAGWtleUZhY3RvcnlBc3NldFBvb2xNYWtlcnMAAAABAAAADGFzc2V0QWRkcmVzcwkAASwAAAACCQABLAAAAAICAAAAEyVzJXMlc19fZGVmb0Fzc2V0X18FAAAADGFzc2V0QWRkcmVzcwIAAAAMX19wb29sTWFrZXJzAQAAACFrZXlGYWN0b3J5RGVmb1N0YWtpbmdQYWNlbWFrZXJQdWIAAAAAAgAAACslcyVzX19jb21tb25Db25maWdfX2RlZm9TdGFraW5nUGFjZW1ha2VyUHViAQAAACNrZXlGYWN0b3J5UG9vbE1ha2VyTGlxdWlkaXR5UmVxdWVzdAAAAAMAAAAMYXNzZXRBZGRyZXNzAAAAEHBvb2xNYWtlckFkZHJlc3MAAAABaAkABLkAAAACCQAETAAAAAICAAAAECVzJXMlcyVkJXNfX3Bvb2wJAARMAAAAAgUAAAAMYXNzZXRBZGRyZXNzCQAETAAAAAIFAAAAEHBvb2xNYWtlckFkZHJlc3MJAARMAAAAAgkAAaQAAAABBQAAAAFoCQAETAAAAAICAAAAEGxpcXVpZGl0eVJlcXVlc3QFAAAAA25pbAIAAAACX18BAAAAH2tleUZhY3RvcnlQb29sTWFrZXJVbmxvY2tIZWlnaHQAAAACAAAADGFzc2V0QWRkcmVzcwAAABBwb29sTWFrZXJBZGRyZXNzCQAEuQAAAAIJAARMAAAAAgIAAAAOJXMlcyVzJXNfX3Bvb2wJAARMAAAAAgUAAAAMYXNzZXRBZGRyZXNzCQAETAAAAAIFAAAAEHBvb2xNYWtlckFkZHJlc3MJAARMAAAAAgIAAAAMdW5sb2NrSGVpZ2h0BQAAAANuaWwCAAAAAl9fAQAAABZmYWN0b3J5UmVhZERlYnRBc3NldElkAAAAAAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEHQAAAAIFAAAACmZhY3RvcnlBY2MJAQAAABVrZXlGYWN0b3J5RGVidEFzc2V0SWQAAAAACQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAABVObyBjb25maWcgYXQgZmFjdG9yeT0JAAQlAAAAAQUAAAAKZmFjdG9yeUFjYwIAAAAJIGZvciBrZXk9CQEAAAAVa2V5RmFjdG9yeURlYnRBc3NldElkAAAAAAEAAAAcZmFjdG9yeVJlYWRBc3NldENmZ0J5QWRkcmVzcwAAAAEAAAAPYXNzZXRBZGRyZXNzU3RyCQAEtQAAAAIJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABB0AAAACBQAAAApmYWN0b3J5QWNjCQEAAAASa2V5RmFjdG9yeUFzc2V0Q2ZnAAAAAQUAAAAPYXNzZXRBZGRyZXNzU3RyCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAABVObyBjb25maWcgYXQgZmFjdG9yeT0JAAQlAAAAAQUAAAAKZmFjdG9yeUFjYwIAAAAJIGZvciBrZXk9CQEAAAASa2V5RmFjdG9yeUFzc2V0Q2ZnAAAAAQUAAAAPYXNzZXRBZGRyZXNzU3RyAgAAAAJfXwEAAAAZZmFjdG9yeVJlYWRBc3NldENmZ0J5Q29kZQAAAAEAAAAJYXNzZXRDb2RlBAAAAA9hc3NldEFkZHJlc3NTdHIJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABB0AAAACBQAAAApmYWN0b3J5QWNjCQEAAAAga2V5RmFjdG9yeURlZm9BZGRyZXNzQnlBc3NldENvZGUAAAABBQAAAAlhc3NldENvZGUJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAFU5vIGNvbmZpZyBhdCBmYWN0b3J5PQkABCUAAAABBQAAAApmYWN0b3J5QWNjAgAAAAkgZm9yIGtleT0JAQAAACBrZXlGYWN0b3J5RGVmb0FkZHJlc3NCeUFzc2V0Q29kZQAAAAEFAAAACWFzc2V0Q29kZQkABRQAAAACBQAAAA9hc3NldEFkZHJlc3NTdHIJAQAAABxmYWN0b3J5UmVhZEFzc2V0Q2ZnQnlBZGRyZXNzAAAAAQUAAAAPYXNzZXRBZGRyZXNzU3RyAQAAACdmYWN0b3J5UmVhZE5leHRQb29sTWFrZXJUb0Rpc3RyaWJ1dGVGZWUAAAABAAAAD2Fzc2V0QWRkcmVzc1N0cgkBAAAAEUBleHRyTmF0aXZlKDEwNjIpAAAAAQIAAAAjM1BFczE5YnY0cVQ0R3o1aWRqY1d5bmtReXJIOXBzR2lwbXcBAAAAImZhY3RvcnlSZWFkRGVmb1N0YWtpbmdQYWNlbWFrZXJQdWIAAAAACQACWQAAAAEJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABB0AAAACBQAAAApmYWN0b3J5QWNjCQEAAAAha2V5RmFjdG9yeURlZm9TdGFraW5nUGFjZW1ha2VyUHViAAAAAAkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAVTm8gY29uZmlnIGF0IGZhY3Rvcnk9CQAEJQAAAAEFAAAACmZhY3RvcnlBY2MCAAAACSBmb3Iga2V5PQkBAAAAIWtleUZhY3RvcnlEZWZvU3Rha2luZ1BhY2VtYWtlclB1YgAAAAAAAAAAEElkeERlZm9Bc3NldENvZGUAAAAAAAAAAAEAAAAADklkeERlZm9Bc3NldElkAAAAAAAAAAACAAAAABJJZHhEZWZvQXNzZXRTdGF0dXMAAAAAAAAAAAMAAAAAEElkeFByaWNlRGVjaW1hbHMAAAAAAAAAAAQAAAAADklkeEJhc2VBc3NldElkAAAAAAAAAAAFAAAAABhJZHhPdmVyQ29sbGF0ZXJhbFBlcmNlbnQAAAAAAAAAAAYAAAAADklkeE1pbkluaXRQb29sAAAAAAAAAAAHAAAAABVJZHhQcmljZU9yYWNsZUFkZHJlc3MAAAAAAAAAAAgAAAAAEElkeE1pbkJ1eVBheW1lbnQAAAAAAAAAAAkAAAAAEUlkeE1pblNlbGxQYXltZW50AAAAAAAAAAAKAAAAABJJZHhCdXlMb2NrSW50ZXJ2YWwAAAAAAAAAAAsAAAAAE0lkeFNlbGxMb2NrSW50ZXJ2YWwAAAAAAAAAAAwAAAAAEElkeEJ1eUZlZVBlcmNlbnQAAAAAAAAAAA0AAAAAEUlkeFNlbGxGZWVQZXJjZW50AAAAAAAAAAAOAAAAABhJZHhQb29sUmVkZW1wdGlvblRpbWVvdXQAAAAAAAAAAA8AAAAAIUlkeFdlZWtlbmRzUHJpY2VDaGFuZ2VDb2VmZmljaWVudAAAAAAAAAAAEAAAAAAYSWR4QXNzZXRBY2NvdW50UHVibGljU3RyAAAAAAAAAAARAAAAACBJZHhBc3NldFN0YWtpbmdSZWZlcnJhbFB1YmxpY1N0cgAAAAAAAAAAEgAAAAAbSWR4Q3Jvc3NFeGNoYW5nZUNvZWZmaWNpZW50AAAAAAAAAAATAAAAACNJZHhTdGFraW5nTWluQW10RnJvbVNlbGxDb2VmZmljaWVudAAAAAAAAAAAFAAAAAAXSWR4UG9vbFN0YWJpbGl0eUZlZVBhcnQAAAAAAAAAABUAAAAADHRoaXNDZmdBcnJheQkBAAAAHGZhY3RvcnlSZWFkQXNzZXRDZmdCeUFkZHJlc3MAAAABCQAEJQAAAAEFAAAABHRoaXMAAAAADWRlZm9Bc3NldENvZGUJAAGRAAAAAgUAAAAMdGhpc0NmZ0FycmF5BQAAABBJZHhEZWZvQXNzZXRDb2RlAAAAAA5kZWZvQXNzZXRJZFN0cgkAAZEAAAACBQAAAAx0aGlzQ2ZnQXJyYXkFAAAADklkeERlZm9Bc3NldElkAAAAAAtkZWZvQXNzZXRJZAkAAlkAAAABBQAAAA5kZWZvQXNzZXRJZFN0cgAAAAAOcHJpY2VPcmFjbGVBY2MJAQAAABFAZXh0ck5hdGl2ZSgxMDYyKQAAAAEJAAGRAAAAAgUAAAAMdGhpc0NmZ0FycmF5BQAAABVJZHhQcmljZU9yYWNsZUFkZHJlc3MAAAAAFW92ZXJDb2xsYXRlcmFsUGVyY2VudAkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAADHRoaXNDZmdBcnJheQUAAAAYSWR4T3ZlckNvbGxhdGVyYWxQZXJjZW50AAAAAA5iYXNlQXNzZXRJZFN0cgkAAZEAAAACBQAAAAx0aGlzQ2ZnQXJyYXkFAAAADklkeEJhc2VBc3NldElkAAAAAAtiYXNlQXNzZXRJZAkAAlkAAAABBQAAAA5iYXNlQXNzZXRJZFN0cgAAAAANcHJpY2VEZWNpbWFscwkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAADHRoaXNDZmdBcnJheQUAAAAQSWR4UHJpY2VEZWNpbWFscwAAAAARbWluQmFzaWNCdXlBbW91bnQJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAAx0aGlzQ2ZnQXJyYXkFAAAAEElkeE1pbkJ1eVBheW1lbnQAAAAAEm1pblN5bnRoU2VsbEFtb3VudAkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAADHRoaXNDZmdBcnJheQUAAAARSWR4TWluU2VsbFBheW1lbnQAAAAAD2J1eUxvY2tJbnRlcnZhbAkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAADHRoaXNDZmdBcnJheQUAAAASSWR4QnV5TG9ja0ludGVydmFsAAAAABBzZWxsTG9ja0ludGVydmFsCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAMdGhpc0NmZ0FycmF5BQAAABNJZHhTZWxsTG9ja0ludGVydmFsAAAAAA1idXlGZWVQZXJjZW50CQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAMdGhpc0NmZ0FycmF5BQAAABBJZHhCdXlGZWVQZXJjZW50AAAAAA5zZWxsRmVlUGVyY2VudAkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAADHRoaXNDZmdBcnJheQUAAAARSWR4U2VsbEZlZVBlcmNlbnQAAAAAHndlZWtlbmRzUHJpY2VDaGFuZ2VDb2VmZmljaWVudAkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAADHRoaXNDZmdBcnJheQUAAAAhSWR4V2Vla2VuZHNQcmljZUNoYW5nZUNvZWZmaWNpZW50AAAAABVhc3NldEFjY291bnRQdWJsaWNTdHIJAAGRAAAAAgUAAAAMdGhpc0NmZ0FycmF5BQAAABhJZHhBc3NldEFjY291bnRQdWJsaWNTdHIAAAAAHWFzc2V0U3Rha2luZ1JlZmVycmFsUHVibGljU3RyCQABkQAAAAIFAAAADHRoaXNDZmdBcnJheQUAAAAgSWR4QXNzZXRTdGFraW5nUmVmZXJyYWxQdWJsaWNTdHIAAAAAGGNyb3NzRXhjaGFuZ2VDb2VmZmljaWVudAkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAADHRoaXNDZmdBcnJheQUAAAAbSWR4Q3Jvc3NFeGNoYW5nZUNvZWZmaWNpZW50AAAAACBzdGFraW5nTWluQW10RnJvbVNlbGxDb2VmZmljaWVudAkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAADHRoaXNDZmdBcnJheQUAAAAjSWR4U3Rha2luZ01pbkFtdEZyb21TZWxsQ29lZmZpY2llbnQAAAAAFHBvb2xTdGFiaWxpdHlGZWVQYXJ0CQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAMdGhpc0NmZ0FycmF5BQAAABdJZHhQb29sU3RhYmlsaXR5RmVlUGFydAEAAAAMa2V5SXNCbG9ja2VkAAAAAAIAAAANJXNfX2lzQmxvY2tlZAEAAAARa2V5SXNNYXJrZXRPcGVuZWQAAAABAAAACWFzc2V0Q29kZQkAASwAAAACAgAAABYlcyVzX19pc01hcmtldE9wZW5lZF9fBQAAAAlhc3NldENvZGUAAAAACWlzQmxvY2tlZAkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBsAAAACBQAAAA5wcmljZU9yYWNsZUFjYwkBAAAADGtleUlzQmxvY2tlZAAAAAAHAAAAAA5pc01hcmtldE9wZW5lZAkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBsAAAACBQAAAA5wcmljZU9yYWNsZUFjYwkBAAAAEWtleUlzTWFya2V0T3BlbmVkAAAAAQUAAAANZGVmb0Fzc2V0Q29kZQcBAAAAE2NvbnRyb2xBY2NSZWFkUHJpY2UAAAABAAAACWFzc2V0Q29kZQkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAADnByaWNlT3JhY2xlQWNjCQEAAAAIa2V5UHJpY2UAAAABBQAAAAlhc3NldENvZGUJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAGE5vIHByaWNlIGF0IHByaWNlT3JhY2xlPQkABCUAAAABBQAAAA5wcmljZU9yYWNsZUFjYwIAAAAJIGZvciBrZXk9CQEAAAAIa2V5UHJpY2UAAAABBQAAAAlhc3NldENvZGUBAAAAGGNvbnRyb2xBY2NSZWFkTGFzdEhlaWdodAAAAAEAAAAJYXNzZXRDb2RlCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAAOcHJpY2VPcmFjbGVBY2MJAQAAABRrZXlDb250cm9sTGFzdEhlaWdodAAAAAEFAAAACWFzc2V0Q29kZQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAdTm8gbGFzdEhlaWdodCBhdCBwcmljZU9yYWNsZT0JAAQlAAAAAQUAAAAOcHJpY2VPcmFjbGVBY2MCAAAACSBmb3Iga2V5PQkBAAAAFGtleUNvbnRyb2xMYXN0SGVpZ2h0AAAAAQUAAAAJYXNzZXRDb2RlAQAAABtjb250cm9sQWNjUmVhZEN1cnJJZHhPckZhaWwAAAAACQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAAOcHJpY2VPcmFjbGVBY2MCAAAAB2N1cnJJZHgJAAEsAAAAAgIAAAAZTm8gY3VycklkeCBhdCBjb250cm9sQWNjPQkABCUAAAABBQAAAA5wcmljZU9yYWNsZUFjYwEAAAAXY29udHJvbEFjY1JlYWRJZHhIZWlnaHQAAAABAAAAA2lkeAQAAAAMaWR4SGVpZ2h0S2V5CQABLAAAAAICAAAACmlkeEhlaWdodF8JAAGkAAAAAQUAAAADaWR4CQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAADnByaWNlT3JhY2xlQWNjBQAAAAxpZHhIZWlnaHRLZXkAAAAAAAAAAAABAAAAG2NvbnRyb2xBY2NSZWFkUHJpY2VCeUhlaWdodAAAAAEAAAALcHJpY2VIZWlnaHQEAAAAEHByaWNlQnlIZWlnaHRLZXkJAAEsAAAAAgIAAAAGcHJpY2VfCQABpAAAAAEFAAAAC3ByaWNlSGVpZ2h0CQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAAOcHJpY2VPcmFjbGVBY2MFAAAAEHByaWNlQnlIZWlnaHRLZXkJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAA05vIAUAAAAQcHJpY2VCeUhlaWdodEtleQIAAAAPIGF0IGNvbnRyb2xBY2M9CQAEJQAAAAEFAAAADnByaWNlT3JhY2xlQWNjAAAAAA9wcmljZUxhc3RIZWlnaHQJAQAAABhjb250cm9sQWNjUmVhZExhc3RIZWlnaHQAAAABBQAAAA1kZWZvQXNzZXRDb2RlAAAAABVpc0Jsb2NrZWRCeUxhc3RIZWlnaHQJAABmAAAAAgkAAGUAAAACBQAAAAZoZWlnaHQFAAAAD3ByaWNlTGFzdEhlaWdodAAAAAAAAAAABQAAAAAVa2V5RGVmb1N0YWtpbmdBZGRyZXNzAgAAACYlcyVzX19jb21tb25Db25maWdfX2RlZm9TdGFraW5nQWRkcmVzcwAAAAAZa2V5TmV1dHJpbm9TdGFraW5nQWRkcmVzcwIAAAAqJXMlc19fY29tbW9uQ29uZmlnX19uZXV0cmlub1N0YWtpbmdBZGRyZXNzAQAAABprZXlEZWZvU3Rha2luZ0Fzc2V0QmFsYW5jZQAAAAEAAAAHYXNzZXRJZAkAASwAAAACAgAAABYlcyVzX19zdGFraW5nQmFsYW5jZV9fBQAAAAdhc3NldElkAQAAABlrZXlOZXV0cmlub1N0YWtpbmdCYWxhbmNlAAAAAAkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAMcnBkX2JhbGFuY2VfBQAAAA5iYXNlQXNzZXRJZFN0cgIAAAABXwkABCUAAAABBQAAAAR0aGlzAAAAAA5kZWZvU3Rha2luZ0FjYwkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEJgAAAAEJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABB0AAAACBQAAAApmYWN0b3J5QWNjBQAAABVrZXlEZWZvU3Rha2luZ0FkZHJlc3MJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAF05vIGNvbmZpZyBhdCBmYWN0b3J5QWNjCQAEJQAAAAEFAAAACmZhY3RvcnlBY2MCAAAACSBmb3Iga2V5PQUAAAAVa2V5RGVmb1N0YWtpbmdBZGRyZXNzCQABLAAAAAICAAAAIWFkZHJlc3MgZXh0cmFjdGlvbiBlcnJvciBmb3Iga2V5PQUAAAAVa2V5RGVmb1N0YWtpbmdBZGRyZXNzAAAAABJuZXV0cmlub1N0YWtpbmdBY2MJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABCYAAAABCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQdAAAAAgUAAAAKZmFjdG9yeUFjYwUAAAAZa2V5TmV1dHJpbm9TdGFraW5nQWRkcmVzcwkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAXTm8gY29uZmlnIGF0IGZhY3RvcnlBY2MJAAQlAAAAAQUAAAAKZmFjdG9yeUFjYwIAAAAJIGZvciBrZXk9BQAAABlrZXlOZXV0cmlub1N0YWtpbmdBZGRyZXNzCQABLAAAAAICAAAAIWFkZHJlc3MgZXh0cmFjdGlvbiBlcnJvciBmb3Iga2V5PQUAAAAZa2V5TmV1dHJpbm9TdGFraW5nQWRkcmVzcwEAAAAZZ2V0VGhpc0RlZm9TdGFraW5nQmFsYW5jZQAAAAAJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAOZGVmb1N0YWtpbmdBY2MJAQAAABprZXlEZWZvU3Rha2luZ0Fzc2V0QmFsYW5jZQAAAAEFAAAADmRlZm9Bc3NldElkU3RyAAAAAAAAAAAAAQAAAB1nZXRUaGlzTmV1dHJpbm9TdGFraW5nQmFsYW5jZQAAAAAJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAASbmV1dHJpbm9TdGFraW5nQWNjCQEAAAAZa2V5TmV1dHJpbm9TdGFraW5nQmFsYW5jZQAAAAAAAAAAAAAAAAAAAAAAC3Vjb2xsYXRlcmFsCQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAABHRoaXMJAQAAAA5rZXlVY29sbGF0ZXJhbAAAAAAAAAAAAAAAAAAAAAAADmFjY3VtdWxhdGVkRmVlCQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAABHRoaXMJAQAAABFrZXlBY2N1bXVsYXRlZEZlZQAAAAAAAAAAAAAAAAAAAAAADmN1cnJQb29sQW1vdW50CQEAAAARQGV4dHJOYXRpdmUoMTA1MCkAAAACBQAAAApmYWN0b3J5QWNjCQEAAAAaa2V5RmFjdG9yeUFzc2V0Q3VycmVudFBvb2wAAAABBQAAAAR0aGlzAAAAAAtkZWJ0QXNzZXRJZAkAAlkAAAABCQEAAAAWZmFjdG9yeVJlYWREZWJ0QXNzZXRJZAAAAAAAAAAAFmRlYnRBc3NldEV0YWxvbkJhbGFuY2UJAQAAABFAZXh0ck5hdGl2ZSgxMDUwKQAAAAIFAAAACmZhY3RvcnlBY2MJAQAAACBrZXlGYWN0b3J5RGVidEFzc2V0RXRhbG9uQmFsYW5jZQAAAAAAAAAAEmxlbmRlZE9yRGVidEFtb3VudAkAAGUAAAACBQAAABZkZWJ0QXNzZXRFdGFsb25CYWxhbmNlCQAD8AAAAAIFAAAABHRoaXMFAAAAC2RlYnRBc3NldElkAAAAABdjdXJyZW50QmFzZUFzc2V0QmFsYW5jZQkAAGQAAAACCQAAZAAAAAIJAAPwAAAAAgUAAAAEdGhpcwUAAAALYmFzZUFzc2V0SWQJAQAAAB1nZXRUaGlzTmV1dHJpbm9TdGFraW5nQmFsYW5jZQAAAAAFAAAAEmxlbmRlZE9yRGVidEFtb3VudAAAAAAMY29udHJvbFByaWNlCQEAAAATY29udHJvbEFjY1JlYWRQcmljZQAAAAEJAAGRAAAAAgUAAAAMdGhpc0NmZ0FycmF5BQAAABBJZHhEZWZvQXNzZXRDb2RlAAAAAAhlbWlzc2lvbgkAAGUAAAACCAkBAAAABXZhbHVlAAAAAQkAA+wAAAABBQAAAAtkZWZvQXNzZXRJZAAAAAhxdWFudGl0eQkAA/AAAAACBQAAAAR0aGlzBQAAAAtkZWZvQXNzZXRJZAEAAAALZ2V0QnV5UHJpY2UAAAABAAAAC2NoYW5nZUNvZWZmAwUAAAAOaXNNYXJrZXRPcGVuZWQFAAAADGNvbnRyb2xQcmljZQkAAGsAAAADCQAAZQAAAAIFAAAADXByaWNlRGVjaW1hbHMFAAAAC2NoYW5nZUNvZWZmBQAAAAxjb250cm9sUHJpY2UFAAAADXByaWNlRGVjaW1hbHMBAAAAI2dldEJ1eUZlZUNvbnNpZGVyaW5nU3Rha2luZ1JlZmVycmFsAAAAAQAAAA5jYWxsZXJQdWI1OFN0cgMJAAAAAAAAAgUAAAAdYXNzZXRTdGFraW5nUmVmZXJyYWxQdWJsaWNTdHIFAAAADmNhbGxlclB1YjU4U3RyAAAAAAAAAAAABQAAAA1idXlGZWVQZXJjZW50AQAAACVnZXRCdXlQcmljZUNvbnNpZGVyaW5nU3Rha2luZ1JlZmVycmFsAAAAAgAAAAtjaGFuZ2VDb2VmZgAAAA5jYWxsZXJQdWI1OFN0cgMJAAAAAAAAAgUAAAAdYXNzZXRTdGFraW5nUmVmZXJyYWxQdWJsaWNTdHIFAAAADmNhbGxlclB1YjU4U3RyBQAAAAxjb250cm9sUHJpY2UJAQAAAAtnZXRCdXlQcmljZQAAAAEFAAAAC2NoYW5nZUNvZWZmAQAAAAxnZXRTZWxsUHJpY2UAAAABAAAAC2NoYW5nZUNvZWZmAwUAAAAOaXNNYXJrZXRPcGVuZWQFAAAADGNvbnRyb2xQcmljZQkAAGsAAAADCQAAZAAAAAIFAAAADXByaWNlRGVjaW1hbHMFAAAAC2NoYW5nZUNvZWZmBQAAAAxjb250cm9sUHJpY2UFAAAADXByaWNlRGVjaW1hbHMBAAAAEGdldFNlbGxQcmljZUZyb20AAAACAAAACWZyb21QcmljZQAAAAtjaGFuZ2VDb2VmZgMFAAAADmlzTWFya2V0T3BlbmVkBQAAAAlmcm9tUHJpY2UJAABrAAAAAwkAAGQAAAACBQAAAA1wcmljZURlY2ltYWxzBQAAAAtjaGFuZ2VDb2VmZgUAAAAJZnJvbVByaWNlBQAAAA1wcmljZURlY2ltYWxzAQAAABBpbnRlcm5hbEJ1eUFzc2V0AAAABgAAAApzZWxsZXJBZGRyAAAAB3NlbGxBbXQAAAALc2VsbEFzc2V0SWQAAAAKbWluU2VsbEFtdAAAAA1idXkyc2VsbFByaWNlAAAAEXBvb2xNYWtlcnNGZWVQYXJ0BAAAABRkZWZvQXNzZXRBbW91bnRHcm9zcwkAAGsAAAADBQAAAAdzZWxsQW10BQAAAA1idXkyc2VsbFByaWNlBQAAAA1wcmljZURlY2ltYWxzBAAAABZzdGFiaWxpdHlGZWVEZWZvQW1vdW50CQAAawAAAAMFAAAAFHBvb2xTdGFiaWxpdHlGZWVQYXJ0BQAAABRkZWZvQXNzZXRBbW91bnRHcm9zcwUAAAANcHJpY2VEZWNpbWFscwQAAAAXcG9vbE1ha2Vyc0ZlZURlZm9BbW91bnQJAABrAAAAAwUAAAARcG9vbE1ha2Vyc0ZlZVBhcnQFAAAAFGRlZm9Bc3NldEFtb3VudEdyb3NzBQAAAA1wcmljZURlY2ltYWxzBAAAAA9kZWZvQXNzZXRBbW91bnQJAABlAAAAAgkAAGUAAAACBQAAABRkZWZvQXNzZXRBbW91bnRHcm9zcwUAAAAWc3RhYmlsaXR5RmVlRGVmb0Ftb3VudAUAAAAXcG9vbE1ha2Vyc0ZlZURlZm9BbW91bnQEAAAAGHJlcXVpcmVkQmFzaWNBc3NldEFtb3VudAkAAGsAAAADBQAAABRkZWZvQXNzZXRBbW91bnRHcm9zcwUAAAANcHJpY2VEZWNpbWFscwUAAAANYnV5MnNlbGxQcmljZQQAAAAGY2hhbmdlCQAAZQAAAAIFAAAAB3NlbGxBbXQFAAAAGHJlcXVpcmVkQmFzaWNBc3NldEFtb3VudAMDCQAAZgAAAAIFAAAACm1pblNlbGxBbXQFAAAAB3NlbGxBbXQJAQAAAAIhPQAAAAIJAAQlAAAAAQUAAAAKc2VsbGVyQWRkcgkABCUAAAABBQAAAA5kZWZvU3Rha2luZ0FjYwcJAAACAAAAAQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAGGltcG9zc2libGUgdG8gaXNzdWUgbmV3IAUAAAANZGVmb0Fzc2V0Q29kZQIAAAAKOiBwYXltZW50PQkAAaQAAAABBQAAAAdzZWxsQW10AgAAABhpcyBsZXNzIHRoZW4gbWluIGFtb3VudD0JAAGkAAAAAQUAAAAKbWluU2VsbEFtdAkABRQAAAACCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAOa2V5VWNvbGxhdGVyYWwAAAAACQAAZAAAAAIFAAAAC3Vjb2xsYXRlcmFsBQAAABhyZXF1aXJlZEJhc2ljQXNzZXRBbW91bnQJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAE2tleUFjY291bnRPcGVyYXRpb24AAAADBQAAAAZoZWlnaHQJAAQlAAAAAQUAAAAKc2VsbGVyQWRkcgIAAAAIRklOSVNIRUQJAQAAABZhc3NldERhdGFTd2FwT3BlcmF0aW9uAAAABwUAAAAHc2VsbEFtdAkAAlgAAAABBQAAAAtzZWxsQXNzZXRJZAUAAAAMY29udHJvbFByaWNlBQAAAA9kZWZvQXNzZXRBbW91bnQJAAJYAAAAAQUAAAALZGVmb0Fzc2V0SWQFAAAAFGRlZm9Bc3NldEFtb3VudEdyb3NzBQAAABdwb29sTWFrZXJzRmVlRGVmb0Ftb3VudAkABEwAAAACCQEAAAAHUmVpc3N1ZQAAAAMFAAAAC2RlZm9Bc3NldElkCQAAZAAAAAIFAAAAD2RlZm9Bc3NldEFtb3VudAUAAAAXcG9vbE1ha2Vyc0ZlZURlZm9BbW91bnQGCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMFAAAACnNlbGxlckFkZHIFAAAAD2RlZm9Bc3NldEFtb3VudAUAAAALZGVmb0Fzc2V0SWQJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwUAAAAKc2VsbGVyQWRkcgUAAAAGY2hhbmdlBQAAAAtzZWxsQXNzZXRJZAkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCQEAAAAnZmFjdG9yeVJlYWROZXh0UG9vbE1ha2VyVG9EaXN0cmlidXRlRmVlAAAAAQkABCUAAAABBQAAAAR0aGlzBQAAABdwb29sTWFrZXJzRmVlRGVmb0Ftb3VudAUAAAALZGVmb0Fzc2V0SWQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAABFrZXlBY2N1bXVsYXRlZEZlZQAAAAAJAABkAAAAAgUAAAAOYWNjdW11bGF0ZWRGZWUFAAAAF3Bvb2xNYWtlcnNGZWVEZWZvQW1vdW50BQAAAANuaWwFAAAABmNoYW5nZQAAAAUAAAABaQEAAAAIYnV5QXNzZXQAAAAABAAAAANwbXQJAQAAAAV2YWx1ZQAAAAEJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAEAAAACnBtdEFzc2V0SWQJAQAAAAV2YWx1ZQAAAAEIBQAAAANwbXQAAAAHYXNzZXRJZAQAAAAOY2FsbGVyUHViNThTdHIJAAJYAAAAAQgFAAAAAWkAAAAPY2FsbGVyUHVibGljS2V5AwUAAAAJaXNCbG9ja2VkCQAAAgAAAAECAAAAWmNvbnRyYWN0IGlzIGJsb2NrZWQgYnkgRU1FUkdFTkNZIFNIVVRET1dOIGFjdGlvbnMgdW50aWxsIHJlYWN0aXZhdGlvbiBieSBlbWVyZ2VuY3kgb3JhY2xlcwMFAAAAFWlzQmxvY2tlZEJ5TGFzdEhlaWdodAkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAElsYXN0IHByaWNlIGZpbmFsaXphdGlvbiBoYXMgYmVlbiBtb3JlIHRoZW4gNSBibG9ja3MgYWdvOiBwcmljZUxhc3RIZWlnaHQ9CQABpAAAAAEFAAAAD3ByaWNlTGFzdEhlaWdodAIAAAAMIGN1cnJIZWlnaHQ9CQABpAAAAAEFAAAABmhlaWdodAMJAQAAAAIhPQAAAAIFAAAACnBtdEFzc2V0SWQFAAAAC2Jhc2VBc3NldElkCQAAAgAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAANVBheW1lbnQgYXNzZXQgaWQgZG9lc24ndCBtYXRjaCBiYXNpYyBhc3NldDogZXhwZWN0ZWQ9CQACWAAAAAEFAAAAC2Jhc2VBc3NldElkAgAAAAggYWN0dWFsPQkAAlgAAAABBQAAAApwbXRBc3NldElkCAkBAAAAEGludGVybmFsQnV5QXNzZXQAAAAGCAUAAAABaQAAAAZjYWxsZXIIBQAAAANwbXQAAAAGYW1vdW50BQAAAApwbXRBc3NldElkBQAAABFtaW5CYXNpY0J1eUFtb3VudAkBAAAAJWdldEJ1eVByaWNlQ29uc2lkZXJpbmdTdGFraW5nUmVmZXJyYWwAAAACBQAAAB53ZWVrZW5kc1ByaWNlQ2hhbmdlQ29lZmZpY2llbnQFAAAADmNhbGxlclB1YjU4U3RyCQEAAAAjZ2V0QnV5RmVlQ29uc2lkZXJpbmdTdGFraW5nUmVmZXJyYWwAAAABBQAAAA5jYWxsZXJQdWI1OFN0cgAAAAJfMQAAAAFpAQAAAAlzZWxsQXNzZXQAAAAABAAAAANwbXQJAQAAAAV2YWx1ZQAAAAEJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAEAAAACHBtdEFzc2V0CQEAAAAFdmFsdWUAAAABCAUAAAADcG10AAAAB2Fzc2V0SWQEAAAADWNhbGxlckFkZHJlc3MJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyBAAAAAlzZWxsUHJpY2UJAQAAAAxnZXRTZWxsUHJpY2UAAAABBQAAAB53ZWVrZW5kc1ByaWNlQ2hhbmdlQ29lZmZpY2llbnQDBQAAAAlpc0Jsb2NrZWQJAAACAAAAAQIAAABaY29udHJhY3QgaXMgYmxvY2tlZCBieSBFTUVSR0VOQ1kgU0hVVERPV04gYWN0aW9ucyB1bnRpbGwgcmVhY3RpdmF0aW9uIGJ5IGVtZXJnZW5jeSBvcmFjbGVzAwUAAAAVaXNCbG9ja2VkQnlMYXN0SGVpZ2h0CQAAAgAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAASWxhc3QgcHJpY2UgZmluYWxpemF0aW9uIGhhcyBiZWVuIG1vcmUgdGhlbiA1IGJsb2NrcyBhZ286IHByaWNlTGFzdEhlaWdodD0JAAGkAAAAAQUAAAAPcHJpY2VMYXN0SGVpZ2h0AgAAAAwgY3VyckhlaWdodD0JAAGkAAAAAQUAAAAGaGVpZ2h0AwkBAAAAAiE9AAAAAgUAAAAIcG10QXNzZXQFAAAAC2RlZm9Bc3NldElkCQAAAgAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAI0ludmFsaWQgcGF5bWVudCBhc3NldCBpZDogZXhwZWN0ZWQ9CQACWAAAAAEFAAAAC2RlZm9Bc3NldElkAgAAAAggYWN0dWFsPQkAAlgAAAABBQAAAAhwbXRBc3NldAMJAABmAAAAAgUAAAASbWluU3ludGhTZWxsQW1vdW50CAUAAAADcG10AAAABmFtb3VudAkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAADpQYXltZW50IGFtb3VudCBsZXNzIHRoZW4gbWluaW5pbWFsIGFsbG93ZWQ6IHBheW1lbnRBbW91bnQ9CQABpAAAAAEIBQAAAANwbXQAAAAGYW1vdW50AgAAAAsgbWluQW1vdW50PQkAAaQAAAABBQAAABJtaW5TeW50aFNlbGxBbW91bnQEAAAAHWJhc2VBc3NldEFtb3VudE5vQmFsYW5jZUxpbWl0CQAAawAAAAMIBQAAAANwbXQAAAAGYW1vdW50BQAAAA1wcmljZURlY2ltYWxzBQAAAAlzZWxsUHJpY2UEAAAAGGJhc2VBc3NldEFtb3VudEF2YWlsYWJsZQMJAABmAAAAAgUAAAAdYmFzZUFzc2V0QW1vdW50Tm9CYWxhbmNlTGltaXQFAAAAF2N1cnJlbnRCYXNlQXNzZXRCYWxhbmNlBQAAABdjdXJyZW50QmFzZUFzc2V0QmFsYW5jZQUAAAAdYmFzZUFzc2V0QW1vdW50Tm9CYWxhbmNlTGltaXQEAAAAGHNvbGREZWZvQXNzZXRBbW91bnRHcm9zcwkAAGsAAAADBQAAABhiYXNlQXNzZXRBbW91bnRBdmFpbGFibGUFAAAACXNlbGxQcmljZQUAAAANcHJpY2VEZWNpbWFscwQAAAAGY2hhbmdlCQAAZQAAAAIIBQAAAANwbXQAAAAGYW1vdW50BQAAABhzb2xkRGVmb0Fzc2V0QW1vdW50R3Jvc3MEAAAAFnN0YWJpbGl0eUZlZURlZm9BbW91bnQJAABrAAAAAwUAAAAUcG9vbFN0YWJpbGl0eUZlZVBhcnQFAAAAGHNvbGREZWZvQXNzZXRBbW91bnRHcm9zcwUAAAANcHJpY2VEZWNpbWFscwQAAAAXcG9vbE1ha2Vyc0ZlZURlZm9BbW91bnQJAABrAAAAAwUAAAAOc2VsbEZlZVBlcmNlbnQFAAAAGHNvbGREZWZvQXNzZXRBbW91bnRHcm9zcwUAAAANcHJpY2VEZWNpbWFscwQAAAATc29sZERlZm9Bc3NldEFtb3VudAkAAGUAAAACCQAAZQAAAAIFAAAAGHNvbGREZWZvQXNzZXRBbW91bnRHcm9zcwUAAAAWc3RhYmlsaXR5RmVlRGVmb0Ftb3VudAUAAAAXcG9vbE1ha2Vyc0ZlZURlZm9BbW91bnQEAAAAFWJhc2VBc3NldEFtb3VudFRvU2VuZAkAAGsAAAADBQAAABNzb2xkRGVmb0Fzc2V0QW1vdW50BQAAAA1wcmljZURlY2ltYWxzBQAAAAlzZWxsUHJpY2UJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAAA5rZXlVY29sbGF0ZXJhbAAAAAAJAABlAAAAAgUAAAALdWNvbGxhdGVyYWwFAAAAFWJhc2VBc3NldEFtb3VudFRvU2VuZAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAATa2V5QWNjb3VudE9wZXJhdGlvbgAAAAMFAAAABmhlaWdodAUAAAANY2FsbGVyQWRkcmVzcwIAAAAIRklOSVNIRUQJAQAAABZhc3NldERhdGFTd2FwT3BlcmF0aW9uAAAABwgFAAAAA3BtdAAAAAZhbW91bnQJAAJYAAAAAQUAAAAIcG10QXNzZXQFAAAACXNlbGxQcmljZQUAAAAVYmFzZUFzc2V0QW1vdW50VG9TZW5kBQAAAA5iYXNlQXNzZXRJZFN0cgUAAAAYc29sZERlZm9Bc3NldEFtb3VudEdyb3NzBQAAABdwb29sTWFrZXJzRmVlRGVmb0Ftb3VudAkABEwAAAACCQEAAAAEQnVybgAAAAIFAAAAC2RlZm9Bc3NldElkCQAAZAAAAAIFAAAAE3NvbGREZWZvQXNzZXRBbW91bnQFAAAAFnN0YWJpbGl0eUZlZURlZm9BbW91bnQJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAABViYXNlQXNzZXRBbW91bnRUb1NlbmQFAAAAC2Jhc2VBc3NldElkCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgUAAAAGY2hhbmdlBQAAAAtkZWZvQXNzZXRJZAkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCQEAAAAnZmFjdG9yeVJlYWROZXh0UG9vbE1ha2VyVG9EaXN0cmlidXRlRmVlAAAAAQkABCUAAAABBQAAAAR0aGlzBQAAABdwb29sTWFrZXJzRmVlRGVmb0Ftb3VudAUAAAALZGVmb0Fzc2V0SWQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAABFrZXlBY2N1bXVsYXRlZEZlZQAAAAAJAABkAAAAAgUAAAAOYWNjdW11bGF0ZWRGZWUFAAAAF3Bvb2xNYWtlcnNGZWVEZWZvQW1vdW50BQAAAANuaWwAAAABaQEAAAANY3Jvc3NFeGNoYW5nZQAAAAIAAAATYnV5QXNzZXRDb2RlQ29uZmlybQAAABRzZWxsQXNzZXRDb2RlQ29uZmlybQQAAAADcG10CQEAAAAFdmFsdWUAAAABCQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAABAAAAAhwbXRBc3NldAkBAAAABXZhbHVlAAAAAQgFAAAAA3BtdAAAAAdhc3NldElkBAAAAAtwbXRBc3NldFN0cgkAAlgAAAABBQAAAAhwbXRBc3NldAQAAAAJcG10QW1vdW50CAUAAAADcG10AAAABmFtb3VudAQAAAANY2FsbGVyQWRkcmVzcwkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIEAAAAC2J1eUFzc2V0Q2ZnBQAAAAx0aGlzQ2ZnQXJyYXkEAAAADnNlbGxBc3NldFR1cGxlCQEAAAAZZmFjdG9yeVJlYWRBc3NldENmZ0J5Q29kZQAAAAEFAAAAFHNlbGxBc3NldENvZGVDb25maXJtBAAAAAxzZWxsQXNzZXRDZmcIBQAAAA5zZWxsQXNzZXRUdXBsZQAAAAJfMgQAAAATc2VsbEFzc2V0QWNjQWRkcmVzcwkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEJgAAAAEIBQAAAA5zZWxsQXNzZXRUdXBsZQAAAAJfMQkAASwAAAACAgAAADFjb3VsZG4ndCBwYXJzZSBhZGRyZXNzIGZyb20gc3RyaW5nIGZvciBhc3NldENvZGU9BQAAABRzZWxsQXNzZXRDb2RlQ29uZmlybQQAAAAKbWluU2VsbFBtdAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEtgAAAAEJAAGRAAAAAgUAAAAMc2VsbEFzc2V0Q2ZnBQAAABFJZHhNaW5TZWxsUGF5bWVudAkAASwAAAACAgAAACFtaW5TZWxsUG10IHBhcnNpbmcgZXJyb3I6IHJhd1ZhbD0JAAGRAAAAAgUAAAAMc2VsbEFzc2V0Q2ZnBQAAABFJZHhNaW5TZWxsUGF5bWVudAQAAAATc2VsbFByaWNlTGFzdEhlaWdodAkBAAAAGGNvbnRyb2xBY2NSZWFkTGFzdEhlaWdodAAAAAEFAAAAFHNlbGxBc3NldENvZGVDb25maXJtBAAAABlpc1NlbGxCbG9ja2VkQnlMYXN0SGVpZ2h0CQAAZgAAAAIJAABlAAAAAgUAAAAGaGVpZ2h0BQAAABNzZWxsUHJpY2VMYXN0SGVpZ2h0AAAAAAAAAAAFAwUAAAAJaXNCbG9ja2VkCQAAAgAAAAECAAAAWmNvbnRyYWN0IGlzIGJsb2NrZWQgYnkgRU1FUkdFTkNZIFNIVVRET1dOIGFjdGlvbnMgdW50aWxsIHJlYWN0aXZhdGlvbiBieSBlbWVyZ2VuY3kgb3JhY2xlcwMJAQAAAAIhPQAAAAIJAAGRAAAAAgUAAAAMdGhpc0NmZ0FycmF5BQAAABBJZHhEZWZvQXNzZXRDb2RlBQAAABNidXlBc3NldENvZGVDb25maXJtCQAAAgAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAMGJ1eUFzc2V0IGNvbmZpcm1hdGlvbiBmYWlsZWQ6IGJ1eUFzc2V0SWRDb25maXJtPQkAAZEAAAACBQAAAAx0aGlzQ2ZnQXJyYXkFAAAAEElkeERlZm9Bc3NldENvZGUCAAAAECBCVVQgYnV5QXNzZXRJZD0FAAAAE2J1eUFzc2V0Q29kZUNvbmZpcm0DCQEAAAACIT0AAAACCQABkQAAAAIFAAAADHNlbGxBc3NldENmZwUAAAAOSWR4RGVmb0Fzc2V0SWQFAAAAC3BtdEFzc2V0U3RyCQAAAgAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAMnNlbGxBc3NldCBjb25maXJtYXRpb24gZmFpbGVkOiBzZWxsQXNzZXRJZENvbmZpcm09CQABkQAAAAIFAAAADHNlbGxBc3NldENmZwUAAAAOSWR4RGVmb0Fzc2V0SWQCAAAADUJVVCBwbXRBc3NldD0FAAAAC3BtdEFzc2V0U3RyAwkBAAAAAiE9AAAAAgkAAZEAAAACBQAAAAx0aGlzQ2ZnQXJyYXkFAAAAEklkeERlZm9Bc3NldFN0YXR1cwIAAAAGSVNTVUVECQAAAgAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAALHRvQXNzZXQgaGFzIG5vdCBiZWVuIGlzc3VlZCB5ZXQ6IGJ1eUFzc2V0SWQ9BQAAABNidXlBc3NldENvZGVDb25maXJtAgAAAAwgQlVUIHN0YXR1cz0JAAGRAAAAAgUAAAAMdGhpc0NmZ0FycmF5BQAAABJJZHhEZWZvQXNzZXRTdGF0dXMDCQEAAAACIT0AAAACCQABkQAAAAIFAAAADHNlbGxBc3NldENmZwUAAAASSWR4RGVmb0Fzc2V0U3RhdHVzAgAAAAZJU1NVRUQJAAACAAAAAQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAyZnJvbUFzc2V0Q2ZnIGhhcyBub3QgYmVlbiBpc3N1ZWQgeWV0OiBzZWxsQXNzZXRJZD0FAAAAC3BtdEFzc2V0U3RyAgAAAAwgQlVUIHN0YXR1cz0JAAGRAAAAAgUAAAAMc2VsbEFzc2V0Q2ZnBQAAABJJZHhEZWZvQXNzZXRTdGF0dXMDBQAAABVpc0Jsb2NrZWRCeUxhc3RIZWlnaHQJAAACAAAAAQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAATWJ1eSBsYXN0IHByaWNlIGZpbmFsaXphdGlvbiBoYXMgYmVlbiBtb3JlIHRoZW4gNSBibG9ja3MgYWdvOiBwcmljZUxhc3RIZWlnaHQ9CQABpAAAAAEFAAAAD3ByaWNlTGFzdEhlaWdodAIAAAAMIGN1cnJIZWlnaHQ9CQABpAAAAAEFAAAABmhlaWdodAIAAAAJIGJ1eUNvZGU9BQAAABNidXlBc3NldENvZGVDb25maXJtAwUAAAAZaXNTZWxsQmxvY2tlZEJ5TGFzdEhlaWdodAkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAABOc2VsbCBsYXN0IHByaWNlIGZpbmFsaXphdGlvbiBoYXMgYmVlbiBtb3JlIHRoZW4gNSBibG9ja3MgYWdvOiBwcmljZUxhc3RIZWlnaHQ9CQABpAAAAAEFAAAAD3ByaWNlTGFzdEhlaWdodAIAAAAMIGN1cnJIZWlnaHQ9CQABpAAAAAEFAAAABmhlaWdodAIAAAAKIHNlbGxDb2RlPQUAAAAUc2VsbEFzc2V0Q29kZUNvbmZpcm0EAAAAEGJ1eUFzc2V0VXNkUHJpY2UJAQAAAAtnZXRCdXlQcmljZQAAAAEJAABpAAAAAgUAAAAed2Vla2VuZHNQcmljZUNoYW5nZUNvZWZmaWNpZW50AAAAAAAAAAACBAAAABFzZWxsQXNzZXRVc2RQcmljZQkBAAAAEGdldFNlbGxQcmljZUZyb20AAAACCQEAAAATY29udHJvbEFjY1JlYWRQcmljZQAAAAEFAAAAFHNlbGxBc3NldENvZGVDb25maXJtCQAAaQAAAAIFAAAAHndlZWtlbmRzUHJpY2VDaGFuZ2VDb2VmZmljaWVudAAAAAAAAAAAAgQAAAANYnV5MnNlbGxQcmljZQkAAGsAAAADBQAAABBidXlBc3NldFVzZFByaWNlBQAAAA1wcmljZURlY2ltYWxzBQAAABFzZWxsQXNzZXRVc2RQcmljZQQAAAAIdXNkbkRlYnQJAABrAAAAAwUAAAAJcG10QW1vdW50BQAAAA1wcmljZURlY2ltYWxzBQAAABFzZWxsQXNzZXRVc2RQcmljZQQAAAAWdG90YWxMZW5kZWRBdE90aGVyQWNjcwkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAR0aGlzCQEAAAAZa2V5VG90YWxMZW5kZWRBdE90aGVyQWNjcwAAAAAAAAAAAAAAAAAEAAAAGmxlbmRlZEFtb3VudEJ5QXNzZXRDb2RlS2V5CQEAAAAaa2V5TGVuZGVkQW1vdW50QnlBc3NldENvZGUAAAABBQAAABRzZWxsQXNzZXRDb2RlQ29uZmlybQQAAAAUbGVuZGVkQW10QnlBc3NldENvZGUJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwUAAAAabGVuZGVkQW1vdW50QnlBc3NldENvZGVLZXkAAAAAAAAAAAAEAAAAF3NlbGxBc3NldFNlbGxGZWVQZXJjZW50CQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAMc2VsbEFzc2V0Q2ZnBQAAABFJZHhTZWxsRmVlUGVyY2VudAQAAAAPY3Jvc3NGZWVQZXJjZW50CQAAawAAAAMJAABkAAAAAgUAAAANYnV5RmVlUGVyY2VudAUAAAAXc2VsbEFzc2V0U2VsbEZlZVBlcmNlbnQFAAAAGGNyb3NzRXhjaGFuZ2VDb2VmZmljaWVudAUAAAANcHJpY2VEZWNpbWFscwQAAAAOYnV5QXNzZXRSZXN1bHQJAQAAABBpbnRlcm5hbEJ1eUFzc2V0AAAABggFAAAAAWkAAAAGY2FsbGVyBQAAAAlwbXRBbW91bnQFAAAACHBtdEFzc2V0BQAAAAptaW5TZWxsUG10BQAAAA1idXkyc2VsbFByaWNlBQAAAA9jcm9zc0ZlZVBlcmNlbnQJAARNAAAAAgkABE0AAAACCQAETQAAAAIJAARNAAAAAggFAAAADmJ1eUFzc2V0UmVzdWx0AAAAAl8xCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADBQAAABNzZWxsQXNzZXRBY2NBZGRyZXNzBQAAAAh1c2RuRGVidAUAAAALZGVidEFzc2V0SWQJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMFAAAAE3NlbGxBc3NldEFjY0FkZHJlc3MJAABlAAAAAgUAAAAJcG10QW1vdW50CAUAAAAOYnV5QXNzZXRSZXN1bHQAAAACXzIFAAAACHBtdEFzc2V0CQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAabGVuZGVkQW1vdW50QnlBc3NldENvZGVLZXkJAABkAAAAAgUAAAAUbGVuZGVkQW10QnlBc3NldENvZGUFAAAACHVzZG5EZWJ0CQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAAGWtleVRvdGFsTGVuZGVkQXRPdGhlckFjY3MAAAAACQAAZAAAAAIFAAAAFnRvdGFsTGVuZGVkQXRPdGhlckFjY3MFAAAACHVzZG5EZWJ0AAAAAWkBAAAADnJlYmFsYW5jZURlYnRzAAAAAAQAAAAIZGVidFBtdDAJAQAAAAV2YWx1ZQAAAAEJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAEAAAADWRlYnRQbXRBc3NldDAJAQAAAAV2YWx1ZQAAAAEIBQAAAAhkZWJ0UG10MAAAAAdhc3NldElkBAAAAAhiYXNlUG10MQkBAAAABXZhbHVlAAAAAQkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAQQAAAANYmFzZVBtdEFzc2V0MQkBAAAABXZhbHVlAAAAAQgFAAAACGJhc2VQbXQxAAAAB2Fzc2V0SWQEAAAADWRlYnRvckFkZHJlc3MJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyBAAAAA5kZWJ0b3JBc3NldENmZwkBAAAAHGZhY3RvcnlSZWFkQXNzZXRDZmdCeUFkZHJlc3MAAAABBQAAAA1kZWJ0b3JBZGRyZXNzBAAAAA9kZWJ0b3JBc3NldENvZGUJAAGRAAAAAgUAAAAOZGVidG9yQXNzZXRDZmcFAAAAEElkeERlZm9Bc3NldENvZGUEAAAAGmxlbmRlZEFtb3VudEJ5QXNzZXRDb2RlS2V5CQEAAAAaa2V5TGVuZGVkQW1vdW50QnlBc3NldENvZGUAAAABBQAAAA9kZWJ0b3JBc3NldENvZGUEAAAACWxlbmRlZEFtdAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAABHRoaXMFAAAAGmxlbmRlZEFtb3VudEJ5QXNzZXRDb2RlS2V5CQABLAAAAAICAAAADU5vIGRlYnRzIGZvciAFAAAAD2RlYnRvckFzc2V0Q29kZQMFAAAACWlzQmxvY2tlZAkAAAIAAAABAgAAAFpjb250cmFjdCBpcyBibG9ja2VkIGJ5IEVNRVJHRU5DWSBTSFVURE9XTiBhY3Rpb25zIHVudGlsbCByZWFjdGl2YXRpb24gYnkgZW1lcmdlbmN5IG9yYWNsZXMDCQEAAAACIT0AAAACBQAAAAtkZWJ0QXNzZXRJZAUAAAANZGVidFBtdEFzc2V0MAkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAADRpbnZhbGlkIGRlYnQgYXNzZXQgaWQgaW4gdGhlIGZpcnN0IHBheW1ldDogZXhwZWN0ZWQ9CQACWAAAAAEFAAAAC2RlYnRBc3NldElkAgAAAAggYWN0dWFsPQkAAlgAAAABBQAAAA1kZWJ0UG10QXNzZXQwAwkBAAAAAiE9AAAAAgUAAAALYmFzZUFzc2V0SWQFAAAADWJhc2VQbXRBc3NldDEJAAACAAAAAQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAA2aW52YWxpZCBiYXNlIGFzc2V0IGlkIGluIHRoZSBzZWNvbmQgcGF5bWVudDogZXhwZWN0ZWQ9CQACWAAAAAEFAAAAC2Jhc2VBc3NldElkAgAAAAggYWN0dWFsPQkAAlgAAAABBQAAAA1iYXNlUG10QXNzZXQxAwkBAAAAAiE9AAAAAggFAAAACGRlYnRQbXQwAAAABmFtb3VudAgFAAAACGJhc2VQbXQxAAAABmFtb3VudAkAAAIAAAABAgAAAD9maXJzdCBwYXltZW50IGFtb3VudCBkb2Vzbid0IG1hdGNoIHRvIHRoZSBzZWNvbmQgcGF5bWVudCBhbW91bnQDCQAAZwAAAAIAAAAAAAAAAAAFAAAACWxlbmRlZEFtdAkAAAIAAAABCQABLAAAAAICAAAAJ2xlbmRlZEFtdCBpcyBsZXNzIHRoZW4gemVybzogbGVuZGVkQW10PQkAAaQAAAABBQAAAAlsZW5kZWRBbXQDCQAAZwAAAAIJAABoAAAAAgAAAAAAAAAAZAUAAAANcHJpY2VEZWNpbWFscwgFAAAACGRlYnRQbXQwAAAABmFtb3VudAkAAAIAAAABCQABLAAAAAICAAAAN2F0dGFjaGVkIHBheW1lbnQgbXVzdCBiZSBncmVhdGVyIHRoZW4gMTAwOiBwbXQwLmFtb3VudD0JAAGkAAAAAQgFAAAACGRlYnRQbXQwAAAABmFtb3VudAMJAABmAAAAAggFAAAACGRlYnRQbXQwAAAABmFtb3VudAUAAAAJbGVuZGVkQW10CQAAAgAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAANGF0dGFjaGVkIHBheW1lbnQgaXMgZ3JhdGVyIHRoYW4gcmVxdWlyZWQ6IHBtdEFtb3VudD0JAAGkAAAAAQgFAAAACGRlYnRQbXQwAAAABmFtb3VudAIAAAALIGxlbmRlZEFtdD0JAAGkAAAAAQUAAAAJbGVuZGVkQW10BAAAABZ0b3RhbExlbmRlZEF0T3RoZXJBY2NzCQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAABHRoaXMJAQAAABlrZXlUb3RhbExlbmRlZEF0T3RoZXJBY2NzAAAAAAAAAAAAAAAAAAQAAAAObGVuZGVkQW10QWZ0ZXIJAABlAAAAAgUAAAAJbGVuZGVkQW10CAUAAAAIZGVidFBtdDAAAAAGYW1vdW50CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABpsZW5kZWRBbW91bnRCeUFzc2V0Q29kZUtleQUAAAAObGVuZGVkQW10QWZ0ZXIJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAABlrZXlUb3RhbExlbmRlZEF0T3RoZXJBY2NzAAAAAAkAAGUAAAACBQAAABZ0b3RhbExlbmRlZEF0T3RoZXJBY2NzCAUAAAAIZGVidFBtdDAAAAAGYW1vdW50CQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAAEsAAAAAgIAAAAWJXMlc19fcmViYWxhbmNlVHJhY2VfXwkAAlgAAAABCAUAAAABaQAAAA10cmFuc2FjdGlvbklkCQEAAAAXYXNzZXREYXRhUmViYWxhbmNlVHJhY2UAAAAFBQAAAA9kZWJ0b3JBc3NldENvZGUFAAAACGRlYnRQbXQwBQAAAAhiYXNlUG10MQUAAAAJbGVuZGVkQW10BQAAAA5sZW5kZWRBbXRBZnRlcgUAAAADbmlsAAAAAWkBAAAAFGZ1bGZpbGxSZWRlZW1SZXF1ZXN0AAAAAQAAABBwb29sTWFrZXJBZGRyZXNzBAAAAA50aGlzQWRkcmVzc1N0cgkABCUAAAABBQAAAAR0aGlzBAAAABhwb29sTWFrZXJVbmxvY2tIZWlnaHRLZXkJAQAAAB9rZXlGYWN0b3J5UG9vbE1ha2VyVW5sb2NrSGVpZ2h0AAAAAgUAAAAOdGhpc0FkZHJlc3NTdHIFAAAAEHBvb2xNYWtlckFkZHJlc3MEAAAAFXBvb2xNYWtlclVubG9ja0hlaWdodAkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAApmYWN0b3J5QWNjBQAAABhwb29sTWFrZXJVbmxvY2tIZWlnaHRLZXkAAAAAAAAAAAADCQAAZwAAAAIAAAAAAAAAAAAFAAAAFXBvb2xNYWtlclVubG9ja0hlaWdodAkAAAIAAAABAgAAAB9BbGwgbGlxdWlkaXR5IHJlcXVlc3QgZnVsZmlsbGVkBAAAABxwb29sTWFrZXJMaXF1aWRpdHlSZXF1ZXN0S2V5CQEAAAAja2V5RmFjdG9yeVBvb2xNYWtlckxpcXVpZGl0eVJlcXVlc3QAAAADBQAAAA50aGlzQWRkcmVzc1N0cgUAAAAQcG9vbE1ha2VyQWRkcmVzcwUAAAAVcG9vbE1ha2VyVW5sb2NrSGVpZ2h0BAAAAB9wb29sTWFrZXJMaXF1aWRpdHlSZXF1ZXN0QW1vdW50CQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAAKZmFjdG9yeUFjYwUAAAAccG9vbE1ha2VyTGlxdWlkaXR5UmVxdWVzdEtleQIAAAAxRW1wdHkgcG9vbE1ha2VyTGlxdWlkaXR5UmVxdWVzdEtleSBhdCBmYWN0b3J5IGFjYwMJAQAAAAlpc0RlZmluZWQAAAABCQAEGgAAAAIFAAAABHRoaXMFAAAAHHBvb2xNYWtlckxpcXVpZGl0eVJlcXVlc3RLZXkJAAACAAAAAQIAAAAsTGlxdWlkaXR5IHJlcXVlc3QgaGFzIGJlZW4gYWxyZWFkeSBmdWxmaWxsZWQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAHHBvb2xNYWtlckxpcXVpZGl0eVJlcXVlc3RLZXkFAAAAH3Bvb2xNYWtlckxpcXVpZGl0eVJlcXVlc3RBbW91bnQJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwUAAAAKZmFjdG9yeUFjYwUAAAAfcG9vbE1ha2VyTGlxdWlkaXR5UmVxdWVzdEFtb3VudAUAAAALYmFzZUFzc2V0SWQFAAAAA25pbAAAAAEAAAACdHgBAAAABnZlcmlmeQAAAAAEAAAAByRtYXRjaDAFAAAAAnR4AwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAABdJbnZva2VTY3JpcHRUcmFuc2FjdGlvbgQAAAADaW52BQAAAAckbWF0Y2gwAwkAAGYAAAACCAUAAAADaW52AAAAA2ZlZQkAAGgAAAACAAAAAAAAAAOEAAAAAAAAAAPoCQAAAgAAAAEJAAEsAAAAAgIAAAAoZmVlIGFtb3VudCBpcyBncmVhdGVyIHRoYW4gbWF4IGFsbG93ZWQ6IAkAAaQAAAABCAUAAAADaW52AAAAA2ZlZQMJAQAAAAlpc0RlZmluZWQAAAABCAUAAAADaW52AAAACmZlZUFzc2V0SWQJAAACAAAAAQIAAAAjb25seSBXYXZlcyBpcyBhbGxvd2VkIGFzIGZlZUFzc2V0SWQDCQAAAAAAAAIIBQAAAANpbnYAAAAIZnVuY3Rpb24CAAAADnJlYmFsYW5jZURlYnRzBAAAAA5pbnZEYXBwQWRkcmVzcwkABCUAAAABCQAEJAAAAAEIBQAAAANpbnYAAAAEZEFwcAMJAQAAAAIhPQAAAAIJAAGRAAAAAgkBAAAAHGZhY3RvcnlSZWFkQXNzZXRDZmdCeUFkZHJlc3MAAAABBQAAAA5pbnZEYXBwQWRkcmVzcwUAAAASSWR4RGVmb0Fzc2V0U3RhdHVzAgAAAAZJU1NVRUQJAAACAAAAAQIAAAAZb25seSBkZWZvIGRhcHAgaXMgYWxsb3dlZAMJAAAAAAAAAgUAAAAOaW52RGFwcEFkZHJlc3MJAAQlAAAAAQUAAAAEdGhpcwkAAAIAAAABAgAAACVpbXBvc3NpYmxlIHRvIGNhbGwgc2VsZiByZWJlYWxuY2VEZWJ0BgMDAwkAAAAAAAACCAUAAAADaW52AAAACGZ1bmN0aW9uAgAAAAxsb2NrTmV1dHJpbm8GCQAAAAAAAAIIBQAAAANpbnYAAAAIZnVuY3Rpb24CAAAADmxvY2tOZXV0cmlub1NQBgkAAAAAAAACCAUAAAADaW52AAAACGZ1bmN0aW9uAgAAAA51bmxvY2tOZXV0cmlubwMJAQAAAAIhPQAAAAIJAAQlAAAAAQUAAAASbmV1dHJpbm9TdGFraW5nQWNjCQAEJQAAAAEJAAQkAAAAAQgFAAAAA2ludgAAAARkQXBwCQAAAgAAAAECAAAAJWludmFsaWQgbmV1dHJpbm8gc3Rha2luZyBkYXBwIGFkZHJlc3MJAAH0AAAAAwgFAAAAAnR4AAAACWJvZHlCeXRlcwkAAZEAAAACCAUAAAACdHgAAAAGcHJvb2ZzAAAAAAAAAAAACQEAAAAiZmFjdG9yeVJlYWREZWZvU3Rha2luZ1BhY2VtYWtlclB1YgAAAAAJAAACAAAAAQIAAAAjTm90IGFsbG93ZWQgaW52b2NhdGlvbiBtZXRob2QgY2FsbHMJAAH0AAAAAwgFAAAAAnR4AAAACWJvZHlCeXRlcwkAAZEAAAACCAUAAAACdHgAAAAGcHJvb2ZzAAAAAAAAAAAACAUAAAACdHgAAAAPc2VuZGVyUHVibGljS2V5yAPGwA==", "chainId": 87, "height": 2365098, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: APGAwAvEtdygvSgwBRgbBCzw42KYDU3XzL8ucrzha9N7 Next: CR7HYJ2SYBv3L3H1UrJryGEYv4bsidURs2RcTwyud9yL Diff:
OldNewDifferences
133133
134134 let av = 16
135135
136-let aw = ac(toString(this))
136+let aw = 17
137137
138-let ax = aw[ag]
138+let ax = 18
139139
140-let ay = aw[ah]
140+let ay = 19
141141
142-let az = fromBase58String(ay)
142+let az = 20
143143
144-let aA = addressFromStringValue(aw[an])
144+let aA = 21
145145
146-let aB = parseIntValue(aw[al])
146+let aB = ac(toString(this))
147147
148-let aC = aw[ak]
148+let aC = aB[ag]
149149
150-let aD = fromBase58String(aC)
150+let aD = aB[ah]
151151
152-let aE = parseIntValue(aw[aj])
152+let aE = fromBase58String(aD)
153153
154-let aF = parseIntValue(aw[ao])
154+let aF = addressFromStringValue(aB[an])
155155
156-let aG = parseIntValue(aw[ap])
156+let aG = parseIntValue(aB[al])
157157
158-let aH = parseIntValue(aw[aq])
158+let aH = aB[ak]
159159
160-let aI = parseIntValue(aw[ar])
160+let aI = fromBase58String(aH)
161161
162-let aJ = parseIntValue(aw[as])
162+let aJ = parseIntValue(aB[aj])
163163
164-let aK = parseIntValue(aw[at])
164+let aK = parseIntValue(aB[ao])
165165
166-let aL = parseIntValue(aw[av])
166+let aL = parseIntValue(aB[ap])
167167
168-func aM () = "%s__isBlocked"
168+let aM = parseIntValue(aB[aq])
169+
170+let aN = parseIntValue(aB[ar])
171+
172+let aO = parseIntValue(aB[as])
173+
174+let aP = parseIntValue(aB[at])
175+
176+let aQ = parseIntValue(aB[av])
177+
178+let aR = aB[aw]
179+
180+let aS = aB[ax]
181+
182+let aT = parseIntValue(aB[ay])
183+
184+let aU = parseIntValue(aB[az])
185+
186+let aV = parseIntValue(aB[aA])
187+
188+func aW () = "%s__isBlocked"
169189
170190
171-func aN (l) = ("%s%s__isMarketOpened__" + l)
191+func aX (l) = ("%s%s__isMarketOpened__" + l)
172192
173193
174-let aO = valueOrElse(getBoolean(aA, aM()), false)
194+let aY = valueOrElse(getBoolean(aF, aW()), false)
175195
176-let aP = valueOrElse(getBoolean(aA, aN(ax)), false)
196+let aZ = valueOrElse(getBoolean(aF, aX(aC)), false)
177197
178-func aQ (l) = valueOrErrorMessage(getInteger(aA, m(l)), ((("No price at priceOracle=" + toString(aA)) + " for key=") + m(l)))
198+func ba (l) = valueOrErrorMessage(getInteger(aF, m(l)), ((("No price at priceOracle=" + toString(aF)) + " for key=") + m(l)))
179199
180200
181-func aR (l) = valueOrErrorMessage(getInteger(aA, n(l)), ((("No lastHeight at priceOracle=" + toString(aA)) + " for key=") + n(l)))
201+func bb (l) = valueOrErrorMessage(getInteger(aF, n(l)), ((("No lastHeight at priceOracle=" + toString(aF)) + " for key=") + n(l)))
182202
183203
184-func aS () = valueOrErrorMessage(getInteger(aA, "currIdx"), ("No currIdx at controlAcc=" + toString(aA)))
204+func bc () = valueOrErrorMessage(getInteger(aF, "currIdx"), ("No currIdx at controlAcc=" + toString(aF)))
185205
186206
187-func aT (aU) = {
188- let aV = ("idxHeight_" + toString(aU))
189- valueOrElse(getInteger(aA, aV), 0)
207+func bd (be) = {
208+ let bf = ("idxHeight_" + toString(be))
209+ valueOrElse(getInteger(aF, bf), 0)
190210 }
191211
192212
193-func aW (aX) = {
194- let aY = ("price_" + toString(aX))
195- valueOrErrorMessage(getInteger(aA, aY), ((("No " + aY) + " at controlAcc=") + toString(aA)))
213+func bg (bh) = {
214+ let bi = ("price_" + toString(bh))
215+ valueOrErrorMessage(getInteger(aF, bi), ((("No " + bi) + " at controlAcc=") + toString(aF)))
196216 }
197217
198218
199-let aZ = aR(ax)
219+let bj = bb(aC)
200220
201-let ba = ((height - aZ) > 5)
221+let bk = ((height - bj) > 5)
202222
203-let bb = "%s%s__commonConfig__defoStakingAddress"
223+let bl = "%s%s__commonConfig__defoStakingAddress"
204224
205-let bc = "%s%s__commonConfig__neutrinoStakingAddress"
225+let bm = "%s%s__commonConfig__neutrinoStakingAddress"
206226
207-func bd (e) = ("%s%s__stakingBalance__" + e)
227+func bn (e) = ("%s%s__stakingBalance__" + e)
208228
209229
210-func be () = ((("rpd_balance_" + aC) + "_") + toString(this))
230+func bo () = ((("rpd_balance_" + aH) + "_") + toString(this))
211231
212232
213-let bf = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(M, bb), ((("No config at factoryAcc" + toString(M)) + " for key=") + bb))), ("address extraction error for key=" + bb))
233+let bp = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(M, bl), ((("No config at factoryAcc" + toString(M)) + " for key=") + bl))), ("address extraction error for key=" + bl))
214234
215-let bg = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(M, bc), ((("No config at factoryAcc" + toString(M)) + " for key=") + bc))), ("address extraction error for key=" + bc))
235+let bq = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(M, bm), ((("No config at factoryAcc" + toString(M)) + " for key=") + bm))), ("address extraction error for key=" + bm))
216236
217-func bh () = valueOrElse(getInteger(bf, bd(ay)), 0)
237+func br () = valueOrElse(getInteger(bp, bn(aD)), 0)
218238
219239
220-func bi () = valueOrElse(getInteger(bg, be()), 0)
240+func bs () = valueOrElse(getInteger(bq, bo()), 0)
221241
222242
223-let bj = valueOrElse(getInteger(this, b()), 0)
243+let bt = valueOrElse(getInteger(this, b()), 0)
224244
225-let bk = valueOrElse(getInteger(this, a()), 0)
245+let bu = valueOrElse(getInteger(this, a()), 0)
226246
227-let bl = getIntegerValue(M, R(this))
247+let bv = getIntegerValue(M, R(this))
228248
229-let bm = fromBase58String(ab())
249+let bw = fromBase58String(ab())
230250
231-let bn = getIntegerValue(M, O())
251+let bx = getIntegerValue(M, O())
232252
233-let bo = (bn - assetBalance(this, bm))
253+let by = (bx - assetBalance(this, bw))
234254
235-let bp = ((assetBalance(this, aD) + bi()) + bo)
255+let bz = ((assetBalance(this, aI) + bs()) + by)
236256
237-let bq = aQ(aw[ag])
257+let bA = ba(aB[ag])
238258
239-let br = (value(assetInfo(az)).quantity - assetBalance(this, az))
259+let bB = (value(assetInfo(aE)).quantity - assetBalance(this, aE))
240260
241-func bs (bt) = if (aP)
242- then bq
243- else fraction((aE - bt), bq, aE)
261+func bC (bD) = if (aZ)
262+ then bA
263+ else fraction((aJ - bD), bA, aJ)
244264
245265
246-func bu (bt) = if (aP)
247- then bq
248- else fraction((aE + bt), bq, aE)
266+func bE (bF) = if ((aS == bF))
267+ then 0
268+ else aO
249269
250270
251-func bv (bw,bt) = if (aP)
252- then bw
253- else fraction((aE + bt), bw, aE)
271+func bG (bD,bF) = if ((aS == bF))
272+ then bA
273+ else bC(bD)
254274
255275
256-func bx (by,bz,bA,bB,bC,bD) = {
257- let bE = fraction(bz, bC, aE)
258- let bF = fraction((aE - bD), bE, aE)
259- let A = (bE - bF)
260- let bG = fraction(bE, aE, bC)
261- let bH = (bz - bG)
262- if (if ((bB > bz))
263- then (toString(by) != toString(bf))
276+func bH (bD) = if (aZ)
277+ then bA
278+ else fraction((aJ + bD), bA, aJ)
279+
280+
281+func bI (bJ,bD) = if (aZ)
282+ then bJ
283+ else fraction((aJ + bD), bJ, aJ)
284+
285+
286+func bK (bL,bM,bN,bO,bP,bQ) = {
287+ let bR = fraction(bM, bP, aJ)
288+ let bS = fraction(aV, bR, aJ)
289+ let bT = fraction(bQ, bR, aJ)
290+ let bU = ((bR - bS) - bT)
291+ let bV = fraction(bR, aJ, bP)
292+ let bW = (bM - bV)
293+ if (if ((bO > bM))
294+ then (toString(bL) != toString(bp))
264295 else false)
265- then throw(((((("impossible to issue new " + ax) + ": payment=") + toString(bz)) + "is less then min amount=") + toString(bB)))
266- else $Tuple2([IntegerEntry(b(), (bj + bG)), StringEntry(f(height, toString(by), "FINISHED"), t(bz, toBase58String(bA), bq, bF, toBase58String(az), bE, A)), Reissue(az, (bF + A), true), ScriptTransfer(by, bF, az), ScriptTransfer(by, bH, bA), ScriptTransfer(ae(toString(this)), A, az), IntegerEntry(a(), (bk + A))], bH)
296+ then throw(((((("impossible to issue new " + aC) + ": payment=") + toString(bM)) + "is less then min amount=") + toString(bO)))
297+ else $Tuple2([IntegerEntry(b(), (bt + bV)), StringEntry(f(height, toString(bL), "FINISHED"), t(bM, toBase58String(bN), bA, bU, toBase58String(aE), bR, bT)), Reissue(aE, (bU + bT), true), ScriptTransfer(bL, bU, aE), ScriptTransfer(bL, bW, bN), ScriptTransfer(ae(toString(this)), bT, aE), IntegerEntry(a(), (bu + bT))], bW)
267298 }
268299
269300
270-@Callable(bI)
301+@Callable(bX)
271302 func buyAsset () = {
272- let bJ = value(bI.payments[0])
273- let bK = value(bJ.assetId)
274- if (aO)
303+ let bY = value(bX.payments[0])
304+ let bZ = value(bY.assetId)
305+ let bF = toBase58String(bX.callerPublicKey)
306+ if (aY)
275307 then throw("contract is blocked by EMERGENCY SHUTDOWN actions untill reactivation by emergency oracles")
276- else if (ba)
277- then throw(((("last price finalization has been more then 5 blocks ago: priceLastHeight=" + toString(aZ)) + " currHeight=") + toString(height)))
278- else if ((bK != aD))
279- then throw(((("Payment asset id doesn't match basic asset: expected=" + toBase58String(aD)) + " actual=") + toBase58String(bK)))
280- else bx(bI.caller, bJ.amount, bK, aF, bs(aL), aJ)._1
308+ else if (bk)
309+ then throw(((("last price finalization has been more then 5 blocks ago: priceLastHeight=" + toString(bj)) + " currHeight=") + toString(height)))
310+ else if ((bZ != aI))
311+ then throw(((("Payment asset id doesn't match basic asset: expected=" + toBase58String(aI)) + " actual=") + toBase58String(bZ)))
312+ else bK(bX.caller, bY.amount, bZ, aK, bG(aQ, bF), bE(bF))._1
281313 }
282314
283315
284316
285-@Callable(bI)
317+@Callable(bX)
286318 func sellAsset () = {
287- let bJ = value(bI.payments[0])
288- let bL = value(bJ.assetId)
289- let bM = toString(bI.caller)
290- let bN = bu(aL)
291- if (aO)
319+ let bY = value(bX.payments[0])
320+ let ca = value(bY.assetId)
321+ let cb = toString(bX.caller)
322+ let cc = bH(aQ)
323+ if (aY)
292324 then throw("contract is blocked by EMERGENCY SHUTDOWN actions untill reactivation by emergency oracles")
293- else if (ba)
294- then throw(((("last price finalization has been more then 5 blocks ago: priceLastHeight=" + toString(aZ)) + " currHeight=") + toString(height)))
295- else if ((bL != az))
296- then throw(((("Invalid payment asset id: expected=" + toBase58String(az)) + " actual=") + toBase58String(bL)))
297- else if ((aG > bJ.amount))
298- then throw(((("Payment amount less then mininimal allowed: paymentAmount=" + toString(bJ.amount)) + " minAmount=") + toString(aG)))
325+ else if (bk)
326+ then throw(((("last price finalization has been more then 5 blocks ago: priceLastHeight=" + toString(bj)) + " currHeight=") + toString(height)))
327+ else if ((ca != aE))
328+ then throw(((("Invalid payment asset id: expected=" + toBase58String(aE)) + " actual=") + toBase58String(ca)))
329+ else if ((aL > bY.amount))
330+ then throw(((("Payment amount less then mininimal allowed: paymentAmount=" + toString(bY.amount)) + " minAmount=") + toString(aL)))
299331 else {
300- let bO = fraction(bJ.amount, aE, bN)
301- let bP = if ((bO > bp))
302- then bp
303- else bO
304- let bQ = fraction(bP, bN, aE)
305- let bH = (bJ.amount - bQ)
306- let bR = fraction(aK, bQ, aE)
307- let bS = (bQ - bR)
308- let bT = fraction(bS, aE, bN)
309-[IntegerEntry(b(), (bj - bT)), StringEntry(f(height, bM, "FINISHED"), t(bJ.amount, toBase58String(bL), bN, bT, aC, bQ, bR)), Burn(az, bS), ScriptTransfer(bI.caller, bT, aD), ScriptTransfer(bI.caller, bH, az), ScriptTransfer(ae(toString(this)), bR, az), IntegerEntry(a(), (bk + bR))]
332+ let cd = fraction(bY.amount, aJ, cc)
333+ let ce = if ((cd > bz))
334+ then bz
335+ else cd
336+ let cf = fraction(ce, cc, aJ)
337+ let bW = (bY.amount - cf)
338+ let bS = fraction(aV, cf, aJ)
339+ let bT = fraction(aP, cf, aJ)
340+ let cg = ((cf - bS) - bT)
341+ let ch = fraction(cg, aJ, cc)
342+[IntegerEntry(b(), (bt - ch)), StringEntry(f(height, cb, "FINISHED"), t(bY.amount, toBase58String(ca), cc, ch, aH, cf, bT)), Burn(aE, (cg + bS)), ScriptTransfer(bX.caller, ch, aI), ScriptTransfer(bX.caller, bW, aE), ScriptTransfer(ae(toString(this)), bT, aE), IntegerEntry(a(), (bu + bT))]
310343 }
311344 }
312345
313346
314347
315-@Callable(bI)
316-func crossExchange (bU,bV) = {
317- let bJ = value(bI.payments[0])
318- let bL = value(bJ.assetId)
319- let bW = toBase58String(bL)
320- let bX = bJ.amount
321- let bM = toString(bI.caller)
322- let bY = aw
323- let bZ = ad(bV)
324- let ca = bZ._2
325- let cb = valueOrErrorMessage(addressFromString(bZ._1), ("couldn't parse address from string for assetCode=" + bV))
326- let cc = valueOrErrorMessage(parseInt(ca[ap]), ("minSellPmt parsing error: rawVal=" + ca[ap]))
327- let cd = aR(bV)
328- let ce = ((height - cd) > 5)
329- if (aO)
348+@Callable(bX)
349+func crossExchange (ci,cj) = {
350+ let bY = value(bX.payments[0])
351+ let ca = value(bY.assetId)
352+ let ck = toBase58String(ca)
353+ let cl = bY.amount
354+ let cb = toString(bX.caller)
355+ let cm = aB
356+ let cn = ad(cj)
357+ let co = cn._2
358+ let cp = valueOrErrorMessage(addressFromString(cn._1), ("couldn't parse address from string for assetCode=" + cj))
359+ let cq = valueOrErrorMessage(parseInt(co[ap]), ("minSellPmt parsing error: rawVal=" + co[ap]))
360+ let cr = bb(cj)
361+ let cs = ((height - cr) > 5)
362+ if (aY)
330363 then throw("contract is blocked by EMERGENCY SHUTDOWN actions untill reactivation by emergency oracles")
331- else if ((aw[ag] != bU))
332- then throw(((("buyAsset confirmation failed: buyAssetIdConfirm=" + aw[ag]) + " BUT buyAssetId=") + bU))
333- else if ((ca[ah] != bW))
334- then throw(((("sellAsset confirmation failed: sellAssetIdConfirm=" + ca[ah]) + "BUT pmtAsset=") + bW))
335- else if ((aw[ai] != "ISSUED"))
336- then throw(((("toAsset has not been issued yet: buyAssetId=" + bU) + " BUT status=") + aw[ai]))
337- else if ((ca[ai] != "ISSUED"))
338- then throw(((("fromAssetCfg has not been issued yet: sellAssetId=" + bW) + " BUT status=") + ca[ai]))
339- else if (ba)
340- then throw(((((("buy last price finalization has been more then 5 blocks ago: priceLastHeight=" + toString(aZ)) + " currHeight=") + toString(height)) + " buyCode=") + bU))
341- else if (ce)
342- then throw(((((("sell last price finalization has been more then 5 blocks ago: priceLastHeight=" + toString(aZ)) + " currHeight=") + toString(height)) + " sellCode=") + bV))
364+ else if ((aB[ag] != ci))
365+ then throw(((("buyAsset confirmation failed: buyAssetIdConfirm=" + aB[ag]) + " BUT buyAssetId=") + ci))
366+ else if ((co[ah] != ck))
367+ then throw(((("sellAsset confirmation failed: sellAssetIdConfirm=" + co[ah]) + "BUT pmtAsset=") + ck))
368+ else if ((aB[ai] != "ISSUED"))
369+ then throw(((("toAsset has not been issued yet: buyAssetId=" + ci) + " BUT status=") + aB[ai]))
370+ else if ((co[ai] != "ISSUED"))
371+ then throw(((("fromAssetCfg has not been issued yet: sellAssetId=" + ck) + " BUT status=") + co[ai]))
372+ else if (bk)
373+ then throw(((((("buy last price finalization has been more then 5 blocks ago: priceLastHeight=" + toString(bj)) + " currHeight=") + toString(height)) + " buyCode=") + ci))
374+ else if (cs)
375+ then throw(((((("sell last price finalization has been more then 5 blocks ago: priceLastHeight=" + toString(bj)) + " currHeight=") + toString(height)) + " sellCode=") + cj))
343376 else {
344- let cf = bs((aL / 2))
345- let cg = bv(aQ(bV), (aL / 2))
346- let bC = fraction(cf, aE, cg)
347- let ch = fraction(bX, aE, cg)
348- let ci = valueOrElse(getInteger(this, c()), 0)
349- let cj = k(bV)
350- let ck = valueOrElse(getInteger(this, cj), 0)
351- let cl = parseIntValue(ca[at])
352- let cm = bx(bI.caller, bX, bL, cc, bC, fraction((aJ + cl), 50, 100))
353- ((((cm._1 :+ ScriptTransfer(cb, ch, bm)) :+ ScriptTransfer(cb, (bX - cm._2), bL)) :+ IntegerEntry(cj, (ck + ch))) :+ IntegerEntry(c(), (ci + ch)))
377+ let ct = bC((aQ / 2))
378+ let cu = bI(ba(cj), (aQ / 2))
379+ let bP = fraction(ct, aJ, cu)
380+ let cv = fraction(cl, aJ, cu)
381+ let cw = valueOrElse(getInteger(this, c()), 0)
382+ let cx = k(cj)
383+ let cy = valueOrElse(getInteger(this, cx), 0)
384+ let cz = parseIntValue(co[at])
385+ let cA = fraction((aO + cz), aT, aJ)
386+ let cB = bK(bX.caller, cl, ca, cq, bP, cA)
387+ ((((cB._1 :+ ScriptTransfer(cp, cv, bw)) :+ ScriptTransfer(cp, (cl - cB._2), ca)) :+ IntegerEntry(cx, (cy + cv))) :+ IntegerEntry(c(), (cw + cv)))
354388 }
355389 }
356390
357391
358392
359-@Callable(bI)
393+@Callable(bX)
360394 func rebalanceDebts () = {
361- let cn = value(bI.payments[0])
362- let co = value(cn.assetId)
363- let cp = value(bI.payments[1])
364- let cq = value(cp.assetId)
365- let cr = toString(bI.caller)
366- let cs = ac(cr)
367- let C = cs[ag]
368- let cj = k(C)
369- let ct = valueOrErrorMessage(getInteger(this, cj), ("No debts for " + C))
370- if (aO)
395+ let cC = value(bX.payments[0])
396+ let cD = value(cC.assetId)
397+ let cE = value(bX.payments[1])
398+ let cF = value(cE.assetId)
399+ let cG = toString(bX.caller)
400+ let cH = ac(cG)
401+ let C = cH[ag]
402+ let cx = k(C)
403+ let cI = valueOrErrorMessage(getInteger(this, cx), ("No debts for " + C))
404+ if (aY)
371405 then throw("contract is blocked by EMERGENCY SHUTDOWN actions untill reactivation by emergency oracles")
372- else if ((bm != co))
373- then throw(((("invalid debt asset id in the first paymet: expected=" + toBase58String(bm)) + " actual=") + toBase58String(co)))
374- else if ((aD != cq))
375- then throw(((("invalid base asset id in the second payment: expected=" + toBase58String(aD)) + " actual=") + toBase58String(cq)))
376- else if ((cn.amount != cp.amount))
406+ else if ((bw != cD))
407+ then throw(((("invalid debt asset id in the first paymet: expected=" + toBase58String(bw)) + " actual=") + toBase58String(cD)))
408+ else if ((aI != cF))
409+ then throw(((("invalid base asset id in the second payment: expected=" + toBase58String(aI)) + " actual=") + toBase58String(cF)))
410+ else if ((cC.amount != cE.amount))
377411 then throw("first payment amount doesn't match to the second payment amount")
378- else if ((0 >= ct))
379- then throw(("lendedAmt is less then zero: lendedAmt=" + toString(ct)))
380- else if (((100 * aE) >= cn.amount))
381- then throw(("attached payment must be greater then 100: pmt0.amount=" + toString(cn.amount)))
382- else if ((cn.amount > ct))
383- then throw(((("attached payment is grater than required: pmtAmount=" + toString(cn.amount)) + " lendedAmt=") + toString(ct)))
412+ else if ((0 >= cI))
413+ then throw(("lendedAmt is less then zero: lendedAmt=" + toString(cI)))
414+ else if (((100 * aJ) >= cC.amount))
415+ then throw(("attached payment must be greater then 100: pmt0.amount=" + toString(cC.amount)))
416+ else if ((cC.amount > cI))
417+ then throw(((("attached payment is grater than required: pmtAmount=" + toString(cC.amount)) + " lendedAmt=") + toString(cI)))
384418 else {
385- let ci = valueOrElse(getInteger(this, c()), 0)
386- let G = (ct - cn.amount)
387-[IntegerEntry(cj, G), IntegerEntry(c(), (ci - cn.amount)), StringEntry(("%s%s__rebalanceTrace__" + toBase58String(bI.transactionId)), B(C, cn, cp, ct, G))]
419+ let cw = valueOrElse(getInteger(this, c()), 0)
420+ let G = (cI - cC.amount)
421+[IntegerEntry(cx, G), IntegerEntry(c(), (cw - cC.amount)), StringEntry(("%s%s__rebalanceTrace__" + toBase58String(bX.transactionId)), B(C, cC, cE, cI, G))]
388422 }
389423 }
390424
391425
392426
393-@Callable(bI)
427+@Callable(bX)
394428 func fulfillRedeemRequest (Y) = {
395- let cu = toString(this)
396- let cv = aa(cu, Y)
397- let cw = valueOrElse(getInteger(M, cv), 0)
398- if ((0 >= cw))
429+ let cJ = toString(this)
430+ let cK = aa(cJ, Y)
431+ let cL = valueOrElse(getInteger(M, cK), 0)
432+ if ((0 >= cL))
399433 then throw("All liquidity request fulfilled")
400434 else {
401- let cx = X(cu, Y, cw)
402- let cy = valueOrErrorMessage(getInteger(M, cx), "Empty poolMakerLiquidityRequestKey at factory acc")
403- if (isDefined(getInteger(this, cx)))
435+ let cM = X(cJ, Y, cL)
436+ let cN = valueOrErrorMessage(getInteger(M, cM), "Empty poolMakerLiquidityRequestKey at factory acc")
437+ if (isDefined(getInteger(this, cM)))
404438 then throw("Liquidity request has been already fulfilled")
405- else [IntegerEntry(cx, cy), ScriptTransfer(M, cy, aD)]
439+ else [IntegerEntry(cM, cN), ScriptTransfer(M, cN, aI)]
406440 }
407441 }
408442
409443
410-@Verifier(cz)
411-func cA () = {
412- let cB = cz
413- if ($isInstanceOf(cB, "InvokeScriptTransaction"))
444+@Verifier(cO)
445+func cP () = {
446+ let cQ = cO
447+ if ($isInstanceOf(cQ, "InvokeScriptTransaction"))
414448 then {
415- let cC = cB
416- if ((cC.fee > (900 * 1000)))
417- then throw(("fee amount is greater than max allowed: " + toString(cC.fee)))
418- else if (isDefined(cC.feeAssetId))
449+ let cR = cQ
450+ if ((cR.fee > (900 * 1000)))
451+ then throw(("fee amount is greater than max allowed: " + toString(cR.fee)))
452+ else if (isDefined(cR.feeAssetId))
419453 then throw("only Waves is allowed as feeAssetId")
420- else if ((cC.function == "rebalanceDebts"))
454+ else if ((cR.function == "rebalanceDebts"))
421455 then {
422- let cD = toString(addressFromRecipient(cC.dApp))
423- if ((ac(cD)[ai] != "ISSUED"))
456+ let cS = toString(addressFromRecipient(cR.dApp))
457+ if ((ac(cS)[ai] != "ISSUED"))
424458 then throw("only defo dapp is allowed")
425- else if ((cD == toString(this)))
459+ else if ((cS == toString(this)))
426460 then throw("impossible to call self rebealnceDebt")
427461 else true
428462 }
429- else if (if (if ((cC.function == "lockNeutrino"))
463+ else if (if (if ((cR.function == "lockNeutrino"))
430464 then true
431- else (cC.function == "lockNeutrinoSP"))
465+ else (cR.function == "lockNeutrinoSP"))
432466 then true
433- else (cC.function == "unlockNeutrino"))
434- then if ((toString(bg) != toString(addressFromRecipient(cC.dApp))))
467+ else (cR.function == "unlockNeutrino"))
468+ then if ((toString(bq) != toString(addressFromRecipient(cR.dApp))))
435469 then throw("invalid neutrino staking dapp address")
436- else sigVerify(cz.bodyBytes, cz.proofs[0], af())
470+ else sigVerify(cO.bodyBytes, cO.proofs[0], af())
437471 else throw("Not allowed invocation method calls")
438472 }
439- else sigVerify(cz.bodyBytes, cz.proofs[0], cz.senderPublicKey)
473+ else sigVerify(cO.bodyBytes, cO.proofs[0], cO.senderPublicKey)
440474 }
441475
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 4 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 func a () = "%s__accumulatedFee"
55
66
77 func b () = "%s__ucollateral"
88
99
1010 func c () = "%s__totalLendedAtOtherAccs"
1111
1212
1313 func d (e) = ("%s%s__assetLockedTotal__" + e)
1414
1515
1616 func f (g,h,i) = ((((("%s%s%d%s__defoAssetOperation__" + h) + "__") + toString(g)) + "__") + i)
1717
1818
1919 func j () = "%s__factory"
2020
2121
2222 func k (l) = ("%s%s__lendedBaseAssetAmount__" + l)
2323
2424
2525 func m (l) = ("%s%s__price__" + l)
2626
2727
2828 func n (l) = ("%s%s__lastHeight__" + l)
2929
3030
3131 let o = 1
3232
3333 let p = 2
3434
3535 let q = 3
3636
3737 let r = 4
3838
3939 let s = 5
4040
4141 func t (u,v,w,x,y,z,A) = makeString(["%d%s%d%s%d%d%d", toString(u), v, toString(x), y, toString(w), toString(z), toString(A)], "__")
4242
4343
4444 func B (C,D,E,F,G) = makeString(["%s%s%d%s%d%d%d", C, toBase58String(value(D.assetId)), toString(D.amount), toBase58String(value(E.assetId)), toString(E.amount), toString(F), toString(G)], "__")
4545
4646
4747 func H (I) = {
4848 let J = valueOrErrorMessage(getString(this, I), ("There is no request for passed arguments: " + I))
4949 split(J, "__")
5050 }
5151
5252
5353 let K = -1
5454
5555 let L = "NULL"
5656
5757 let M = addressFromStringValue(valueOrErrorMessage(getString(this, j()), ((("No config at this=" + toString(this)) + " for key=") + j())))
5858
5959 func N () = "%s%s__commonConfig__debtAssetId"
6060
6161
6262 func O () = "%s%s__commonConfig__debtAssetEtalonBalance"
6363
6464
6565 func P (Q) = (("%s%s%s__defoAsset__" + Q) + "__config")
6666
6767
6868 func R (S) = (("%s%s%s__defoAsset__" + toString(S)) + "__currentPool")
6969
7070
7171 func T (l) = (("%s%s%s__defoAsset__" + l) + "__addressByAssetCode")
7272
7373
7474 func U (V) = (("%s%s%s__defoAsset__" + V) + "__poolMakers")
7575
7676
7777 func W () = "%s%s__commonConfig__defoStakingPacemakerPub"
7878
7979
8080 func X (V,Y,Z) = makeString(["%s%s%s%d%s__pool", V, Y, toString(Z), "liquidityRequest"], "__")
8181
8282
8383 func aa (V,Y) = makeString(["%s%s%s%s__pool", V, Y, "unlockHeight"], "__")
8484
8585
8686 func ab () = valueOrErrorMessage(getString(M, N()), ((("No config at factory=" + toString(M)) + " for key=") + N()))
8787
8888
8989 func ac (Q) = split(valueOrErrorMessage(getString(M, P(Q)), ((("No config at factory=" + toString(M)) + " for key=") + P(Q))), "__")
9090
9191
9292 func ad (l) = {
9393 let Q = valueOrErrorMessage(getString(M, T(l)), ((("No config at factory=" + toString(M)) + " for key=") + T(l)))
9494 $Tuple2(Q, ac(Q))
9595 }
9696
9797
9898 func ae (Q) = addressFromStringValue("3PEs19bv4qT4Gz5idjcWynkQyrH9psGipmw")
9999
100100
101101 func af () = fromBase58String(valueOrErrorMessage(getString(M, W()), ((("No config at factory=" + toString(M)) + " for key=") + W())))
102102
103103
104104 let ag = 1
105105
106106 let ah = 2
107107
108108 let ai = 3
109109
110110 let aj = 4
111111
112112 let ak = 5
113113
114114 let al = 6
115115
116116 let am = 7
117117
118118 let an = 8
119119
120120 let ao = 9
121121
122122 let ap = 10
123123
124124 let aq = 11
125125
126126 let ar = 12
127127
128128 let as = 13
129129
130130 let at = 14
131131
132132 let au = 15
133133
134134 let av = 16
135135
136-let aw = ac(toString(this))
136+let aw = 17
137137
138-let ax = aw[ag]
138+let ax = 18
139139
140-let ay = aw[ah]
140+let ay = 19
141141
142-let az = fromBase58String(ay)
142+let az = 20
143143
144-let aA = addressFromStringValue(aw[an])
144+let aA = 21
145145
146-let aB = parseIntValue(aw[al])
146+let aB = ac(toString(this))
147147
148-let aC = aw[ak]
148+let aC = aB[ag]
149149
150-let aD = fromBase58String(aC)
150+let aD = aB[ah]
151151
152-let aE = parseIntValue(aw[aj])
152+let aE = fromBase58String(aD)
153153
154-let aF = parseIntValue(aw[ao])
154+let aF = addressFromStringValue(aB[an])
155155
156-let aG = parseIntValue(aw[ap])
156+let aG = parseIntValue(aB[al])
157157
158-let aH = parseIntValue(aw[aq])
158+let aH = aB[ak]
159159
160-let aI = parseIntValue(aw[ar])
160+let aI = fromBase58String(aH)
161161
162-let aJ = parseIntValue(aw[as])
162+let aJ = parseIntValue(aB[aj])
163163
164-let aK = parseIntValue(aw[at])
164+let aK = parseIntValue(aB[ao])
165165
166-let aL = parseIntValue(aw[av])
166+let aL = parseIntValue(aB[ap])
167167
168-func aM () = "%s__isBlocked"
168+let aM = parseIntValue(aB[aq])
169+
170+let aN = parseIntValue(aB[ar])
171+
172+let aO = parseIntValue(aB[as])
173+
174+let aP = parseIntValue(aB[at])
175+
176+let aQ = parseIntValue(aB[av])
177+
178+let aR = aB[aw]
179+
180+let aS = aB[ax]
181+
182+let aT = parseIntValue(aB[ay])
183+
184+let aU = parseIntValue(aB[az])
185+
186+let aV = parseIntValue(aB[aA])
187+
188+func aW () = "%s__isBlocked"
169189
170190
171-func aN (l) = ("%s%s__isMarketOpened__" + l)
191+func aX (l) = ("%s%s__isMarketOpened__" + l)
172192
173193
174-let aO = valueOrElse(getBoolean(aA, aM()), false)
194+let aY = valueOrElse(getBoolean(aF, aW()), false)
175195
176-let aP = valueOrElse(getBoolean(aA, aN(ax)), false)
196+let aZ = valueOrElse(getBoolean(aF, aX(aC)), false)
177197
178-func aQ (l) = valueOrErrorMessage(getInteger(aA, m(l)), ((("No price at priceOracle=" + toString(aA)) + " for key=") + m(l)))
198+func ba (l) = valueOrErrorMessage(getInteger(aF, m(l)), ((("No price at priceOracle=" + toString(aF)) + " for key=") + m(l)))
179199
180200
181-func aR (l) = valueOrErrorMessage(getInteger(aA, n(l)), ((("No lastHeight at priceOracle=" + toString(aA)) + " for key=") + n(l)))
201+func bb (l) = valueOrErrorMessage(getInteger(aF, n(l)), ((("No lastHeight at priceOracle=" + toString(aF)) + " for key=") + n(l)))
182202
183203
184-func aS () = valueOrErrorMessage(getInteger(aA, "currIdx"), ("No currIdx at controlAcc=" + toString(aA)))
204+func bc () = valueOrErrorMessage(getInteger(aF, "currIdx"), ("No currIdx at controlAcc=" + toString(aF)))
185205
186206
187-func aT (aU) = {
188- let aV = ("idxHeight_" + toString(aU))
189- valueOrElse(getInteger(aA, aV), 0)
207+func bd (be) = {
208+ let bf = ("idxHeight_" + toString(be))
209+ valueOrElse(getInteger(aF, bf), 0)
190210 }
191211
192212
193-func aW (aX) = {
194- let aY = ("price_" + toString(aX))
195- valueOrErrorMessage(getInteger(aA, aY), ((("No " + aY) + " at controlAcc=") + toString(aA)))
213+func bg (bh) = {
214+ let bi = ("price_" + toString(bh))
215+ valueOrErrorMessage(getInteger(aF, bi), ((("No " + bi) + " at controlAcc=") + toString(aF)))
196216 }
197217
198218
199-let aZ = aR(ax)
219+let bj = bb(aC)
200220
201-let ba = ((height - aZ) > 5)
221+let bk = ((height - bj) > 5)
202222
203-let bb = "%s%s__commonConfig__defoStakingAddress"
223+let bl = "%s%s__commonConfig__defoStakingAddress"
204224
205-let bc = "%s%s__commonConfig__neutrinoStakingAddress"
225+let bm = "%s%s__commonConfig__neutrinoStakingAddress"
206226
207-func bd (e) = ("%s%s__stakingBalance__" + e)
227+func bn (e) = ("%s%s__stakingBalance__" + e)
208228
209229
210-func be () = ((("rpd_balance_" + aC) + "_") + toString(this))
230+func bo () = ((("rpd_balance_" + aH) + "_") + toString(this))
211231
212232
213-let bf = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(M, bb), ((("No config at factoryAcc" + toString(M)) + " for key=") + bb))), ("address extraction error for key=" + bb))
233+let bp = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(M, bl), ((("No config at factoryAcc" + toString(M)) + " for key=") + bl))), ("address extraction error for key=" + bl))
214234
215-let bg = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(M, bc), ((("No config at factoryAcc" + toString(M)) + " for key=") + bc))), ("address extraction error for key=" + bc))
235+let bq = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(M, bm), ((("No config at factoryAcc" + toString(M)) + " for key=") + bm))), ("address extraction error for key=" + bm))
216236
217-func bh () = valueOrElse(getInteger(bf, bd(ay)), 0)
237+func br () = valueOrElse(getInteger(bp, bn(aD)), 0)
218238
219239
220-func bi () = valueOrElse(getInteger(bg, be()), 0)
240+func bs () = valueOrElse(getInteger(bq, bo()), 0)
221241
222242
223-let bj = valueOrElse(getInteger(this, b()), 0)
243+let bt = valueOrElse(getInteger(this, b()), 0)
224244
225-let bk = valueOrElse(getInteger(this, a()), 0)
245+let bu = valueOrElse(getInteger(this, a()), 0)
226246
227-let bl = getIntegerValue(M, R(this))
247+let bv = getIntegerValue(M, R(this))
228248
229-let bm = fromBase58String(ab())
249+let bw = fromBase58String(ab())
230250
231-let bn = getIntegerValue(M, O())
251+let bx = getIntegerValue(M, O())
232252
233-let bo = (bn - assetBalance(this, bm))
253+let by = (bx - assetBalance(this, bw))
234254
235-let bp = ((assetBalance(this, aD) + bi()) + bo)
255+let bz = ((assetBalance(this, aI) + bs()) + by)
236256
237-let bq = aQ(aw[ag])
257+let bA = ba(aB[ag])
238258
239-let br = (value(assetInfo(az)).quantity - assetBalance(this, az))
259+let bB = (value(assetInfo(aE)).quantity - assetBalance(this, aE))
240260
241-func bs (bt) = if (aP)
242- then bq
243- else fraction((aE - bt), bq, aE)
261+func bC (bD) = if (aZ)
262+ then bA
263+ else fraction((aJ - bD), bA, aJ)
244264
245265
246-func bu (bt) = if (aP)
247- then bq
248- else fraction((aE + bt), bq, aE)
266+func bE (bF) = if ((aS == bF))
267+ then 0
268+ else aO
249269
250270
251-func bv (bw,bt) = if (aP)
252- then bw
253- else fraction((aE + bt), bw, aE)
271+func bG (bD,bF) = if ((aS == bF))
272+ then bA
273+ else bC(bD)
254274
255275
256-func bx (by,bz,bA,bB,bC,bD) = {
257- let bE = fraction(bz, bC, aE)
258- let bF = fraction((aE - bD), bE, aE)
259- let A = (bE - bF)
260- let bG = fraction(bE, aE, bC)
261- let bH = (bz - bG)
262- if (if ((bB > bz))
263- then (toString(by) != toString(bf))
276+func bH (bD) = if (aZ)
277+ then bA
278+ else fraction((aJ + bD), bA, aJ)
279+
280+
281+func bI (bJ,bD) = if (aZ)
282+ then bJ
283+ else fraction((aJ + bD), bJ, aJ)
284+
285+
286+func bK (bL,bM,bN,bO,bP,bQ) = {
287+ let bR = fraction(bM, bP, aJ)
288+ let bS = fraction(aV, bR, aJ)
289+ let bT = fraction(bQ, bR, aJ)
290+ let bU = ((bR - bS) - bT)
291+ let bV = fraction(bR, aJ, bP)
292+ let bW = (bM - bV)
293+ if (if ((bO > bM))
294+ then (toString(bL) != toString(bp))
264295 else false)
265- then throw(((((("impossible to issue new " + ax) + ": payment=") + toString(bz)) + "is less then min amount=") + toString(bB)))
266- else $Tuple2([IntegerEntry(b(), (bj + bG)), StringEntry(f(height, toString(by), "FINISHED"), t(bz, toBase58String(bA), bq, bF, toBase58String(az), bE, A)), Reissue(az, (bF + A), true), ScriptTransfer(by, bF, az), ScriptTransfer(by, bH, bA), ScriptTransfer(ae(toString(this)), A, az), IntegerEntry(a(), (bk + A))], bH)
296+ then throw(((((("impossible to issue new " + aC) + ": payment=") + toString(bM)) + "is less then min amount=") + toString(bO)))
297+ else $Tuple2([IntegerEntry(b(), (bt + bV)), StringEntry(f(height, toString(bL), "FINISHED"), t(bM, toBase58String(bN), bA, bU, toBase58String(aE), bR, bT)), Reissue(aE, (bU + bT), true), ScriptTransfer(bL, bU, aE), ScriptTransfer(bL, bW, bN), ScriptTransfer(ae(toString(this)), bT, aE), IntegerEntry(a(), (bu + bT))], bW)
267298 }
268299
269300
270-@Callable(bI)
301+@Callable(bX)
271302 func buyAsset () = {
272- let bJ = value(bI.payments[0])
273- let bK = value(bJ.assetId)
274- if (aO)
303+ let bY = value(bX.payments[0])
304+ let bZ = value(bY.assetId)
305+ let bF = toBase58String(bX.callerPublicKey)
306+ if (aY)
275307 then throw("contract is blocked by EMERGENCY SHUTDOWN actions untill reactivation by emergency oracles")
276- else if (ba)
277- then throw(((("last price finalization has been more then 5 blocks ago: priceLastHeight=" + toString(aZ)) + " currHeight=") + toString(height)))
278- else if ((bK != aD))
279- then throw(((("Payment asset id doesn't match basic asset: expected=" + toBase58String(aD)) + " actual=") + toBase58String(bK)))
280- else bx(bI.caller, bJ.amount, bK, aF, bs(aL), aJ)._1
308+ else if (bk)
309+ then throw(((("last price finalization has been more then 5 blocks ago: priceLastHeight=" + toString(bj)) + " currHeight=") + toString(height)))
310+ else if ((bZ != aI))
311+ then throw(((("Payment asset id doesn't match basic asset: expected=" + toBase58String(aI)) + " actual=") + toBase58String(bZ)))
312+ else bK(bX.caller, bY.amount, bZ, aK, bG(aQ, bF), bE(bF))._1
281313 }
282314
283315
284316
285-@Callable(bI)
317+@Callable(bX)
286318 func sellAsset () = {
287- let bJ = value(bI.payments[0])
288- let bL = value(bJ.assetId)
289- let bM = toString(bI.caller)
290- let bN = bu(aL)
291- if (aO)
319+ let bY = value(bX.payments[0])
320+ let ca = value(bY.assetId)
321+ let cb = toString(bX.caller)
322+ let cc = bH(aQ)
323+ if (aY)
292324 then throw("contract is blocked by EMERGENCY SHUTDOWN actions untill reactivation by emergency oracles")
293- else if (ba)
294- then throw(((("last price finalization has been more then 5 blocks ago: priceLastHeight=" + toString(aZ)) + " currHeight=") + toString(height)))
295- else if ((bL != az))
296- then throw(((("Invalid payment asset id: expected=" + toBase58String(az)) + " actual=") + toBase58String(bL)))
297- else if ((aG > bJ.amount))
298- then throw(((("Payment amount less then mininimal allowed: paymentAmount=" + toString(bJ.amount)) + " minAmount=") + toString(aG)))
325+ else if (bk)
326+ then throw(((("last price finalization has been more then 5 blocks ago: priceLastHeight=" + toString(bj)) + " currHeight=") + toString(height)))
327+ else if ((ca != aE))
328+ then throw(((("Invalid payment asset id: expected=" + toBase58String(aE)) + " actual=") + toBase58String(ca)))
329+ else if ((aL > bY.amount))
330+ then throw(((("Payment amount less then mininimal allowed: paymentAmount=" + toString(bY.amount)) + " minAmount=") + toString(aL)))
299331 else {
300- let bO = fraction(bJ.amount, aE, bN)
301- let bP = if ((bO > bp))
302- then bp
303- else bO
304- let bQ = fraction(bP, bN, aE)
305- let bH = (bJ.amount - bQ)
306- let bR = fraction(aK, bQ, aE)
307- let bS = (bQ - bR)
308- let bT = fraction(bS, aE, bN)
309-[IntegerEntry(b(), (bj - bT)), StringEntry(f(height, bM, "FINISHED"), t(bJ.amount, toBase58String(bL), bN, bT, aC, bQ, bR)), Burn(az, bS), ScriptTransfer(bI.caller, bT, aD), ScriptTransfer(bI.caller, bH, az), ScriptTransfer(ae(toString(this)), bR, az), IntegerEntry(a(), (bk + bR))]
332+ let cd = fraction(bY.amount, aJ, cc)
333+ let ce = if ((cd > bz))
334+ then bz
335+ else cd
336+ let cf = fraction(ce, cc, aJ)
337+ let bW = (bY.amount - cf)
338+ let bS = fraction(aV, cf, aJ)
339+ let bT = fraction(aP, cf, aJ)
340+ let cg = ((cf - bS) - bT)
341+ let ch = fraction(cg, aJ, cc)
342+[IntegerEntry(b(), (bt - ch)), StringEntry(f(height, cb, "FINISHED"), t(bY.amount, toBase58String(ca), cc, ch, aH, cf, bT)), Burn(aE, (cg + bS)), ScriptTransfer(bX.caller, ch, aI), ScriptTransfer(bX.caller, bW, aE), ScriptTransfer(ae(toString(this)), bT, aE), IntegerEntry(a(), (bu + bT))]
310343 }
311344 }
312345
313346
314347
315-@Callable(bI)
316-func crossExchange (bU,bV) = {
317- let bJ = value(bI.payments[0])
318- let bL = value(bJ.assetId)
319- let bW = toBase58String(bL)
320- let bX = bJ.amount
321- let bM = toString(bI.caller)
322- let bY = aw
323- let bZ = ad(bV)
324- let ca = bZ._2
325- let cb = valueOrErrorMessage(addressFromString(bZ._1), ("couldn't parse address from string for assetCode=" + bV))
326- let cc = valueOrErrorMessage(parseInt(ca[ap]), ("minSellPmt parsing error: rawVal=" + ca[ap]))
327- let cd = aR(bV)
328- let ce = ((height - cd) > 5)
329- if (aO)
348+@Callable(bX)
349+func crossExchange (ci,cj) = {
350+ let bY = value(bX.payments[0])
351+ let ca = value(bY.assetId)
352+ let ck = toBase58String(ca)
353+ let cl = bY.amount
354+ let cb = toString(bX.caller)
355+ let cm = aB
356+ let cn = ad(cj)
357+ let co = cn._2
358+ let cp = valueOrErrorMessage(addressFromString(cn._1), ("couldn't parse address from string for assetCode=" + cj))
359+ let cq = valueOrErrorMessage(parseInt(co[ap]), ("minSellPmt parsing error: rawVal=" + co[ap]))
360+ let cr = bb(cj)
361+ let cs = ((height - cr) > 5)
362+ if (aY)
330363 then throw("contract is blocked by EMERGENCY SHUTDOWN actions untill reactivation by emergency oracles")
331- else if ((aw[ag] != bU))
332- then throw(((("buyAsset confirmation failed: buyAssetIdConfirm=" + aw[ag]) + " BUT buyAssetId=") + bU))
333- else if ((ca[ah] != bW))
334- then throw(((("sellAsset confirmation failed: sellAssetIdConfirm=" + ca[ah]) + "BUT pmtAsset=") + bW))
335- else if ((aw[ai] != "ISSUED"))
336- then throw(((("toAsset has not been issued yet: buyAssetId=" + bU) + " BUT status=") + aw[ai]))
337- else if ((ca[ai] != "ISSUED"))
338- then throw(((("fromAssetCfg has not been issued yet: sellAssetId=" + bW) + " BUT status=") + ca[ai]))
339- else if (ba)
340- then throw(((((("buy last price finalization has been more then 5 blocks ago: priceLastHeight=" + toString(aZ)) + " currHeight=") + toString(height)) + " buyCode=") + bU))
341- else if (ce)
342- then throw(((((("sell last price finalization has been more then 5 blocks ago: priceLastHeight=" + toString(aZ)) + " currHeight=") + toString(height)) + " sellCode=") + bV))
364+ else if ((aB[ag] != ci))
365+ then throw(((("buyAsset confirmation failed: buyAssetIdConfirm=" + aB[ag]) + " BUT buyAssetId=") + ci))
366+ else if ((co[ah] != ck))
367+ then throw(((("sellAsset confirmation failed: sellAssetIdConfirm=" + co[ah]) + "BUT pmtAsset=") + ck))
368+ else if ((aB[ai] != "ISSUED"))
369+ then throw(((("toAsset has not been issued yet: buyAssetId=" + ci) + " BUT status=") + aB[ai]))
370+ else if ((co[ai] != "ISSUED"))
371+ then throw(((("fromAssetCfg has not been issued yet: sellAssetId=" + ck) + " BUT status=") + co[ai]))
372+ else if (bk)
373+ then throw(((((("buy last price finalization has been more then 5 blocks ago: priceLastHeight=" + toString(bj)) + " currHeight=") + toString(height)) + " buyCode=") + ci))
374+ else if (cs)
375+ then throw(((((("sell last price finalization has been more then 5 blocks ago: priceLastHeight=" + toString(bj)) + " currHeight=") + toString(height)) + " sellCode=") + cj))
343376 else {
344- let cf = bs((aL / 2))
345- let cg = bv(aQ(bV), (aL / 2))
346- let bC = fraction(cf, aE, cg)
347- let ch = fraction(bX, aE, cg)
348- let ci = valueOrElse(getInteger(this, c()), 0)
349- let cj = k(bV)
350- let ck = valueOrElse(getInteger(this, cj), 0)
351- let cl = parseIntValue(ca[at])
352- let cm = bx(bI.caller, bX, bL, cc, bC, fraction((aJ + cl), 50, 100))
353- ((((cm._1 :+ ScriptTransfer(cb, ch, bm)) :+ ScriptTransfer(cb, (bX - cm._2), bL)) :+ IntegerEntry(cj, (ck + ch))) :+ IntegerEntry(c(), (ci + ch)))
377+ let ct = bC((aQ / 2))
378+ let cu = bI(ba(cj), (aQ / 2))
379+ let bP = fraction(ct, aJ, cu)
380+ let cv = fraction(cl, aJ, cu)
381+ let cw = valueOrElse(getInteger(this, c()), 0)
382+ let cx = k(cj)
383+ let cy = valueOrElse(getInteger(this, cx), 0)
384+ let cz = parseIntValue(co[at])
385+ let cA = fraction((aO + cz), aT, aJ)
386+ let cB = bK(bX.caller, cl, ca, cq, bP, cA)
387+ ((((cB._1 :+ ScriptTransfer(cp, cv, bw)) :+ ScriptTransfer(cp, (cl - cB._2), ca)) :+ IntegerEntry(cx, (cy + cv))) :+ IntegerEntry(c(), (cw + cv)))
354388 }
355389 }
356390
357391
358392
359-@Callable(bI)
393+@Callable(bX)
360394 func rebalanceDebts () = {
361- let cn = value(bI.payments[0])
362- let co = value(cn.assetId)
363- let cp = value(bI.payments[1])
364- let cq = value(cp.assetId)
365- let cr = toString(bI.caller)
366- let cs = ac(cr)
367- let C = cs[ag]
368- let cj = k(C)
369- let ct = valueOrErrorMessage(getInteger(this, cj), ("No debts for " + C))
370- if (aO)
395+ let cC = value(bX.payments[0])
396+ let cD = value(cC.assetId)
397+ let cE = value(bX.payments[1])
398+ let cF = value(cE.assetId)
399+ let cG = toString(bX.caller)
400+ let cH = ac(cG)
401+ let C = cH[ag]
402+ let cx = k(C)
403+ let cI = valueOrErrorMessage(getInteger(this, cx), ("No debts for " + C))
404+ if (aY)
371405 then throw("contract is blocked by EMERGENCY SHUTDOWN actions untill reactivation by emergency oracles")
372- else if ((bm != co))
373- then throw(((("invalid debt asset id in the first paymet: expected=" + toBase58String(bm)) + " actual=") + toBase58String(co)))
374- else if ((aD != cq))
375- then throw(((("invalid base asset id in the second payment: expected=" + toBase58String(aD)) + " actual=") + toBase58String(cq)))
376- else if ((cn.amount != cp.amount))
406+ else if ((bw != cD))
407+ then throw(((("invalid debt asset id in the first paymet: expected=" + toBase58String(bw)) + " actual=") + toBase58String(cD)))
408+ else if ((aI != cF))
409+ then throw(((("invalid base asset id in the second payment: expected=" + toBase58String(aI)) + " actual=") + toBase58String(cF)))
410+ else if ((cC.amount != cE.amount))
377411 then throw("first payment amount doesn't match to the second payment amount")
378- else if ((0 >= ct))
379- then throw(("lendedAmt is less then zero: lendedAmt=" + toString(ct)))
380- else if (((100 * aE) >= cn.amount))
381- then throw(("attached payment must be greater then 100: pmt0.amount=" + toString(cn.amount)))
382- else if ((cn.amount > ct))
383- then throw(((("attached payment is grater than required: pmtAmount=" + toString(cn.amount)) + " lendedAmt=") + toString(ct)))
412+ else if ((0 >= cI))
413+ then throw(("lendedAmt is less then zero: lendedAmt=" + toString(cI)))
414+ else if (((100 * aJ) >= cC.amount))
415+ then throw(("attached payment must be greater then 100: pmt0.amount=" + toString(cC.amount)))
416+ else if ((cC.amount > cI))
417+ then throw(((("attached payment is grater than required: pmtAmount=" + toString(cC.amount)) + " lendedAmt=") + toString(cI)))
384418 else {
385- let ci = valueOrElse(getInteger(this, c()), 0)
386- let G = (ct - cn.amount)
387-[IntegerEntry(cj, G), IntegerEntry(c(), (ci - cn.amount)), StringEntry(("%s%s__rebalanceTrace__" + toBase58String(bI.transactionId)), B(C, cn, cp, ct, G))]
419+ let cw = valueOrElse(getInteger(this, c()), 0)
420+ let G = (cI - cC.amount)
421+[IntegerEntry(cx, G), IntegerEntry(c(), (cw - cC.amount)), StringEntry(("%s%s__rebalanceTrace__" + toBase58String(bX.transactionId)), B(C, cC, cE, cI, G))]
388422 }
389423 }
390424
391425
392426
393-@Callable(bI)
427+@Callable(bX)
394428 func fulfillRedeemRequest (Y) = {
395- let cu = toString(this)
396- let cv = aa(cu, Y)
397- let cw = valueOrElse(getInteger(M, cv), 0)
398- if ((0 >= cw))
429+ let cJ = toString(this)
430+ let cK = aa(cJ, Y)
431+ let cL = valueOrElse(getInteger(M, cK), 0)
432+ if ((0 >= cL))
399433 then throw("All liquidity request fulfilled")
400434 else {
401- let cx = X(cu, Y, cw)
402- let cy = valueOrErrorMessage(getInteger(M, cx), "Empty poolMakerLiquidityRequestKey at factory acc")
403- if (isDefined(getInteger(this, cx)))
435+ let cM = X(cJ, Y, cL)
436+ let cN = valueOrErrorMessage(getInteger(M, cM), "Empty poolMakerLiquidityRequestKey at factory acc")
437+ if (isDefined(getInteger(this, cM)))
404438 then throw("Liquidity request has been already fulfilled")
405- else [IntegerEntry(cx, cy), ScriptTransfer(M, cy, aD)]
439+ else [IntegerEntry(cM, cN), ScriptTransfer(M, cN, aI)]
406440 }
407441 }
408442
409443
410-@Verifier(cz)
411-func cA () = {
412- let cB = cz
413- if ($isInstanceOf(cB, "InvokeScriptTransaction"))
444+@Verifier(cO)
445+func cP () = {
446+ let cQ = cO
447+ if ($isInstanceOf(cQ, "InvokeScriptTransaction"))
414448 then {
415- let cC = cB
416- if ((cC.fee > (900 * 1000)))
417- then throw(("fee amount is greater than max allowed: " + toString(cC.fee)))
418- else if (isDefined(cC.feeAssetId))
449+ let cR = cQ
450+ if ((cR.fee > (900 * 1000)))
451+ then throw(("fee amount is greater than max allowed: " + toString(cR.fee)))
452+ else if (isDefined(cR.feeAssetId))
419453 then throw("only Waves is allowed as feeAssetId")
420- else if ((cC.function == "rebalanceDebts"))
454+ else if ((cR.function == "rebalanceDebts"))
421455 then {
422- let cD = toString(addressFromRecipient(cC.dApp))
423- if ((ac(cD)[ai] != "ISSUED"))
456+ let cS = toString(addressFromRecipient(cR.dApp))
457+ if ((ac(cS)[ai] != "ISSUED"))
424458 then throw("only defo dapp is allowed")
425- else if ((cD == toString(this)))
459+ else if ((cS == toString(this)))
426460 then throw("impossible to call self rebealnceDebt")
427461 else true
428462 }
429- else if (if (if ((cC.function == "lockNeutrino"))
463+ else if (if (if ((cR.function == "lockNeutrino"))
430464 then true
431- else (cC.function == "lockNeutrinoSP"))
465+ else (cR.function == "lockNeutrinoSP"))
432466 then true
433- else (cC.function == "unlockNeutrino"))
434- then if ((toString(bg) != toString(addressFromRecipient(cC.dApp))))
467+ else (cR.function == "unlockNeutrino"))
468+ then if ((toString(bq) != toString(addressFromRecipient(cR.dApp))))
435469 then throw("invalid neutrino staking dapp address")
436- else sigVerify(cz.bodyBytes, cz.proofs[0], af())
470+ else sigVerify(cO.bodyBytes, cO.proofs[0], af())
437471 else throw("Not allowed invocation method calls")
438472 }
439- else sigVerify(cz.bodyBytes, cz.proofs[0], cz.senderPublicKey)
473+ else sigVerify(cO.bodyBytes, cO.proofs[0], cO.senderPublicKey)
440474 }
441475

github/deemru/w8io/3ef1775 
170.14 ms