tx · D8UgC2wdNZzaYcHUd3GyamxS1Ri4DMEKwuQR2LFP8inf

3NAefciWv6f9fWvEXdGgpHfanJFG8HqfjuT:  -0.03700000 Waves

2023.01.19 13:26 [2411690] smart account 3NAefciWv6f9fWvEXdGgpHfanJFG8HqfjuT > SELF 0.00000000 Waves

{ "type": 13, "id": "D8UgC2wdNZzaYcHUd3GyamxS1Ri4DMEKwuQR2LFP8inf", "fee": 3700000, "feeAssetId": null, "timestamp": 1674123999671, "version": 1, "sender": "3NAefciWv6f9fWvEXdGgpHfanJFG8HqfjuT", "senderPublicKey": "D1BL65meykxFZTCuq7jq9HSGLLnWvQamQPUNrguW5w39", "proofs": [ "WJk66Rmsx25poj2g8kyiJjgzxJXRtB6Vxd6c8TBB1j8UbRLrH4pZ2J82s9TUswfsiFv9KEKHQBSFDBT81bgibCb" ], "script": "base64:BgKwKQgCEgMKAQgSAwoBCBIAEgQKAgEEEgQKAgEEEgMKAQESABIECgIIARIAEgQKAggBEgQKAggBEgQKAgEBEgMKAQESBQoDAQEBEgUKAwEIARIECgIBCBIECgIBCBIECgIICBIECgIICBIECgIIARIAEgMKAQgSBQoDAQEBEgQKAggBEgQKAgEBEgQKAggIEgsKCQgBAQIBAggEBBIGCgQICAEIIgZzY2FsZTgiDHNjYWxlOEJpZ0ludCIHc2NhbGUxOCIKemVyb0JpZ0ludCIEYmlnMCIEYmlnMSIEYmlnMiIEYmlnMyIEYmlnNCIKc2xpcHBhZ2U0RCILd2F2ZXNTdHJpbmciBUFtdWx0IgVEY29udiIDU0VQIgVFTVBUWSIKUG9vbEFjdGl2ZSIKUG9vbFB1dERpcyIOUG9vbE1hdGNoZXJEaXMiDFBvb2xTaHV0ZG93biIOaWR4UG9vbEFkZHJlc3MiCWlkeFBvb2xTdCIJaWR4TFBBc0lkIglpZHhBbUFzSWQiCWlkeFByQXNJZCILaWR4QW10QXNEY20iDWlkeFByaWNlQXNEY20iC2lkeElBbXRBc0lkIg1pZHhJUHJpY2VBc0lkIg9pZHhGYWN0U3Rha0NudHIiEmlkeEZhY3RvcnlSZXN0Q250ciIQaWR4RmFjdFNsaXBwQ250ciIRaWR4RmFjdEd3eFJld0NudHIiCmZlZURlZmF1bHQiAnQxIgdvcmlnVmFsIg1vcmlnU2NhbGVNdWx0IgJmMSIDdmFsIg9yZXN1bHRTY2FsZU11bHQiDGZyb21YMThSb3VuZCIFcm91bmQiAnQyIgJmMiICdHMiA2FtdCIIcmVzU2NhbGUiCGN1clNjYWxlIgNhYnMiCWFic0JpZ0ludCICZmMiA21wayIEcG1wayICcGwiAnBoIgFoIgF0IgNwYXUiAnVhIgR0eElkIgNnYXUiAmFhIgJwYSIDYW1wIgNhZGEiBmtleUZlZSIDZmVlIgZrZXlETHAiFWtleURMcFJlZnJlc2hlZEhlaWdodCISa2V5RExwUmVmcmVzaERlbGF5IhZkTHBSZWZyZXNoRGVsYXlEZWZhdWx0Ig9kTHBSZWZyZXNoRGVsYXkiBGZjZmciBG10cGsiAnBjIgZpQW10QXMiBWlQckFzIgNtYmEiBWJBU3RyIgNhcHMiHGtleUFsbG93ZWRMcFN0YWJsZVNjcmlwdEhhc2giFmtleUZlZUNvbGxlY3RvckFkZHJlc3MiA3RvZSIDb3JWIgZzZW5kclYiBm1hdGNoViIEc3RyZiIEYWRkciIDa2V5IgRpbnRmIgh0aHJvd0VyciIDbXNnIgZmbXRFcnIiA2ZjYSIFaW5GZWUiAUAiBm91dEZlZSIBQSIDaWdzIgJtcCITZmVlQ29sbGVjdG9yQWRkcmVzcyIDZ3BjIgVhbXRBcyIHcHJpY2VBcyIIaVByaWNlQXMiDHBhcnNlQXNzZXRJZCIFaW5wdXQiD2Fzc2V0SWRUb1N0cmluZyIPcGFyc2VQb29sQ29uZmlnIgpwb29sQ29uZmlnIhBwb29sQ29uZmlnUGFyc2VkIgskdDA3NzQyNzk3MSIOY2ZnUG9vbEFkZHJlc3MiDWNmZ1Bvb2xTdGF0dXMiDGNmZ0xwQXNzZXRJZCIQY2ZnQW1vdW50QXNzZXRJZCIPY2ZnUHJpY2VBc3NldElkIhZjZmdBbW91bnRBc3NldERlY2ltYWxzIhVjZmdQcmljZUFzc2V0RGVjaW1hbHMiEmNmZ0luQW1vdW50QXNzZWRJZCIRY2ZnSW5QcmljZUFzc2V0SWQiA2dmYyINZmFjdG9yeUNvbmZpZyIPc3Rha2luZ0NvbnRyYWN0Ig9zbGlwYWdlQ29udHJhY3QiC2d3eENvbnRyYWN0IgxyZXN0Q29udHJhY3QiEWRhdGFQdXRBY3Rpb25JbmZvIg1pbkFtdEFzc2V0QW10Ig9pblByaWNlQXNzZXRBbXQiCG91dExwQW10IgVwcmljZSIKc2xpcEJ5VXNlciIMc2xpcHBhZ2VSZWFsIgh0eEhlaWdodCILdHhUaW1lc3RhbXAiDHNsaXBhZ2VBbUFtdCIMc2xpcGFnZVByQW10IhFkYXRhR2V0QWN0aW9uSW5mbyIOb3V0QW10QXNzZXRBbXQiEG91dFByaWNlQXNzZXRBbXQiB2luTHBBbXQiDWdldEFjY0JhbGFuY2UiB2Fzc2V0SWQiBGNwYmkiCHByQW10WDE4IghhbUFtdFgxOCIFY3BiaXIiA3ZhZCICQTEiAkEyIghzbGlwcGFnZSIEZGlmZiIEcGFzcyICdmQiAkQxIgJEMCIEc2xwZyIEZmFpbCIDcGNwIgphbUFzc2V0RGNtIgpwckFzc2V0RGNtIgVhbUFtdCIFcHJBbXQiC2FtdEFzQW10WDE4IgpwckFzQW10WDE4IgpjYWxjUHJpY2VzIgVscEFtdCIIYW10QXNEY20iB3ByQXNEY20iCHByaWNlWDE4IghscEFtdFgxOCINbHBQckluQW1Bc1gxOCINbHBQckluUHJBc1gxOCIPY2FsY3VsYXRlUHJpY2VzIgFwIgd0YWtlRmVlIgZhbW91bnQiCWZlZUFtb3VudCIDZWdvIgZ0eElkNTgiCnBtdEFzc2V0SWQiCHBtdExwQW10Igt1c2VyQWRkcmVzcyIEbHBJZCIEYW1JZCIEcHJJZCIFYW1EY20iBXByRGNtIgNzdHMiB2xwRW1pc3MiCWFtQmFsYW5jZSIMYW1CYWxhbmNlWDE4IglwckJhbGFuY2UiDHByQmFsYW5jZVgxOCILY3VyUHJpY2VYMTgiCGN1clByaWNlIgtwbXRMcEFtdFgxOCIKbHBFbWlzc1gxOCILb3V0QW1BbXRYMTgiC291dFByQW10WDE4IghvdXRBbUFtdCIIb3V0UHJBbXQiBXN0YXRlIgNlcG8iB2luQW1BbXQiBmluQW1JZCIHaW5QckFtdCIGaW5QcklkIgZpc0V2YWwiBmVtaXRMcCIKaXNPbmVBc3NldCIQdmFsaWRhdGVTbGlwcGFnZSIGcG10QW10IgVwbXRJZCIHYW1JZFN0ciIHcHJJZFN0ciIJaW5BbUlkU3RyIglpblBySWRTdHIiBmFtdERjbSIIcHJpY2VEY20iBGxwRW0iD2luQW1Bc3NldEFtdFgxOCIPaW5QckFzc2V0QW10WDE4Igx1c2VyUHJpY2VYMTgiAXIiC3NsaXBwYWdlWDE4Ig9zbGlwcGFnZVJlYWxYMTgiDWxwRW1pc3Npb25YMTgiCnByVmlhQW1YMTgiCmFtVmlhUHJYMTgiDGV4cGVjdGVkQW10cyIRZXhwQW10QXNzZXRBbXRYMTgiE2V4cFByaWNlQXNzZXRBbXRYMTgiCWNhbGNMcEFtdCIOY2FsY0FtQXNzZXRQbXQiDmNhbGNQckFzc2V0UG10IgxzbGlwcGFnZUNhbGMiCWVtaXRMcEFtdCIGYW1EaWZmIgZwckRpZmYiDSR0MDE4NjIxMTg5NjYiCndyaXRlQW1BbXQiCndyaXRlUHJBbXQiC2NvbW1vblN0YXRlIgRnZXREIgJ4cCIDeHAwIgN4cDEiAXMiAWEiA2FubiILeHAwX3hwMV9uX24iBWFubl9zIgVhbm5fMSIJY2FsY0ROZXh0IgFkIgJkZCIDZGRkIgJkcCIEY2FsYyIDYWNjIgFpIgVkTmV4dCIIZERpZmZSYXciBWREaWZmIgNhcnIiDSR0MDIwODkwMjA5MzgiAiRsIgIkcyIFJGFjYzAiBSRmMF8xIgIkYSICJGkiBSRmMF8yIgVmb3VuZCIHZ2V0RE9sZCIBbiIKYVByZWNpc2lvbiIQYW5uX3NfYVByZWNpc2lvbiIOYW5uX2FQcmVjaXNpb24iAm4xIgNjdXIiDSR0MDIxNTY3MjE1ODciDSR0MDIyMDA4MjIwNTUiBWdldFlEIgFEIgF4IgFjIgFiIg0kdDAyMjU1NTIyNTc1IgF5IgV5TmV4dCIFeURpZmYiDSR0MDIyODgyMjI5MjkiB2NhbGNETHAiDWFtb3VudEJhbGFuY2UiDHByaWNlQmFsYW5jZSIKbHBFbWlzc2lvbiIKdXBkYXRlZERMcCIOY2FsY0N1cnJlbnRETHAiEGFtb3VudEFzc2V0RGVsdGEiD3ByaWNlQXNzZXREZWx0YSIUbHBBc3NldEVtaXNzaW9uRGVsdGEiEmFtb3VudEFzc2V0QmFsYW5jZSIRcHJpY2VBc3NldEJhbGFuY2UiD2xwQXNzZXRFbWlzc2lvbiIKY3VycmVudERMcCIScmVmcmVzaERMcEludGVybmFsIhdhbW91bnRBc3NldEJhbGFuY2VEZWx0YSIWcHJpY2VBc3NldEJhbGFuY2VEZWx0YSIHYWN0aW9ucyISdmFsaWRhdGVVcGRhdGVkRExwIgZvbGRETHAiG3ZhbGlkYXRlTWF0Y2hlck9yZGVyQWxsb3dlZCIFb3JkZXIiEWFtb3VudEFzc2V0QW1vdW50IhBwcmljZUFzc2V0QW1vdW50Ig0kdDAyNDk1MjI1MTY0IgNkTHAiDSR0MDI1NDk0MjU1OTQiDXVudXNlZEFjdGlvbnMiBmRMcE5ldyIMaXNPcmRlclZhbGlkIgJjZyIDcG10IgJjcCIGY2FsbGVyIgdhbUFzUG10IgdwckFzUG10Ig1jYWxjUHV0T25lVGtuIglwbXRBbXRSYXciC3dpdGhUYWtlRmVlIg1jaGVjaEVtaXNzaW9uIg0kdDAyNzg2MDI4MzIyIgxhbUJhbGFuY2VPbGQiDHByQmFsYW5jZU9sZCINJHQwMjgzMjgyODUwNCILYW1BbW91bnRSYXciC3ByQW1vdW50UmF3Ig0kdDAyODUwODI4NzYyIghhbUFtb3VudCIIcHJBbW91bnQiDGFtQmFsYW5jZU5ldyIMcHJCYWxhbmNlTmV3IgZjaGVja0QiCGxwQW1vdW50Ig5wb29sUHJvcG9ydGlvbiIPYW1vdW50QXNzZXRQYXJ0Ig5wcmljZUFzc2V0UGFydCIJbHBBbXRCb3RoIgVib251cyITZ2V0T25lVGtuVjJJbnRlcm5hbCIKb3V0QXNzZXRJZCIMbWluT3V0QW1vdW50IghwYXltZW50cyIMb3JpZ2luQ2FsbGVyIg10cmFuc2FjdGlvbklkIgphbURlY2ltYWxzIgpwckRlY2ltYWxzIgpwb29sU3RhdHVzIg0kdDAzMDgxMjMwOTIzIgh0b3RhbEdldCILdG90YWxBbW91bnQiDSR0MDMxMTEzMzE0MjAiBW91dEFtIgVvdXRQciIIY3VyUHJYMTgiBWN1clByIhFvdXRBc3NldElkT3JXYXZlcyIQc2VuZEZlZVRvTWF0Y2hlciIEYnVybiINJHQwMzIyMDUzMjU1NSIQZmVlQW1vdW50Rm9yQ2FsYyIQb3V0SW5BbW91bnRBc3NldCINJHQwMzI1NTgzMjY2NiIRcmVmcmVzaERMcEFjdGlvbnMiEWlzVXBkYXRlZERMcFZhbGlkIgFtIgckbWF0Y2gwIgJwbSICcGQiCWlzTWFuYWdlciICcGsiAm1tIhdwZW5kaW5nTWFuYWdlclB1YmxpY0tleSICY20iA2hwbSIDY3BtIgRzbGlwIglhdXRvU3Rha2UiB2ZhY3RDZmciC3N0YWtpbmdDbnRyIghzbGlwQ250ciIKYW1Bc3NldFBtdCIKcHJBc3NldFBtdCIBZSIJbHBBc3NldElkIgJlbCIGbGVnYWN5IgJzYSICc3AiCGxwVHJuc2ZyIgJzcyINJHQwMzY4MTUzNjk1NyIFY2hlY2siFGxwQXNzZXRFbWlzc2lvbkFmdGVyIiBpc1Bvb2xPbmVUb2tlbk9wZXJhdGlvbnNEaXNhYmxlZCINaXNQdXREaXNhYmxlZCIGY2hlY2tzIg0kdDAzODU5ODM4NzU2Igdlc3RpbUxQIg0kdDAzOTU3MTM5OTIwIhRwYXltZW50SW5BbW91bnRBc3NldCINJHQwMzk5MjM0MDAzMSIHbWF4U2xwZyIGZXN0UHV0Ig0kdDA0MTA2MTQxMTI2IglvdXRBbXRBbXQiDSR0MDQyMjk5NDIzODEiDWlzR2V0RGlzYWJsZWQiDSR0MDQyOTk5NDMxNTQiGGxhc3RSZWZyZXNoZWRCbG9ja0hlaWdodCIdY2hlY2tMYXN0UmVmcmVzaGVkQmxvY2tIZWlnaHQiDSR0MDQzNjc4NDM3NDIiEGRMcFVwZGF0ZUFjdGlvbnMiDWxwQXNzZXRBbW91bnQiBWluZGV4IgRuZXdZIgJkeSILdG90YWxHZXRSYXciDSR0MDQ0NjcyNDQ3MjciDSR0MDQ1MTAyNDUyMTciDnN1bU9mR2V0QXNzZXRzIhJub0xlc3NUaGVuQW10QXNzZXQiFG5vTGVzc1RoZW5QcmljZUFzc2V0IhRidXJuTFBBc3NldE9uRmFjdG9yeSINJHQwNDYzODM0NjQ2NCINY2hlY2tQYXltZW50cyIKZmFjdG9yeUNmZyIHc3Rha2luZyIKdW5zdGFrZUludiIBdiIFYnVybkEiDSR0MDQ3NDkxNDc1NzIiDXVuc3Rha2VBbW91bnQiFW5vTGVzc1RoZW5BbW91bnRBc3NldCIDcmVzIgxjaGVja0Ftb3VudHMiDSR0MDQ4ODIzNDg5MDQiDSR0MDQ5Nzk5NDk5ODciEHBheW1lbnRBbW91bnRSYXciDnBheW1lbnRBc3NldElkIg0kdDA1MDExNTUwMjE4Ig0kdDA1MDM2NjUwNDcwIghhbXRBc1N0ciIHcHJBc1N0ciIBayICcHIiDHJlc1NjYWxlTXVsdCIHdXNyQWRkciIHcG10QXNJZCICdHgiBnZlcmlmeSIPdGFyZ2V0UHVibGljS2V5IgptYXRjaGVyUHViIgpvcmRlclZhbGlkIgtzZW5kZXJWYWxpZCIMbWF0Y2hlclZhbGlkIgduZXdIYXNoIgthbGxvd2VkSGFzaCILY3VycmVudEhhc2iBAQABYQCAwtcvAAFiCQC2AgEAgMLXLwABYwkAtgIBAICAkLu61q3wDQABZAkAtgIBAAAAAWUJALYCAQAAAAFmCQC2AgEAAQABZwkAtgIBAAIAAWgJALYCAQADAAFpCQC2AgEABAABagkAtgIBCQBlAgUBYQkAaQIJAGgCBQFhAAEFAWEAAWsCBVdBVkVTAAFsAgMxMDAAAW0CATEAAW4CAl9fAAFvAgAAAXAAAQABcQACAAFyAAMAAXMABAABdAABAAF1AAIAAXYAAwABdwAEAAF4AAUAAXkABgABegAHAAFBAAgAAUIACQABQwABAAFEAAYAAUUABwABRgAKAAFHCQBrAwAKBQFhAJBOAQFIAgFJAUoJALwCAwkAtgIBBQFJBQFjCQC2AgEFAUoBAUsCAUwBTQkAoAMBCQC8AgMFAUwJALYCAQUBTQUBYwEBTgMBTAFNAU8JAKADAQkAvQIEBQFMCQC2AgEFAU0FAWMFAU8BAVACAUkBSgkAvAIDBQFJBQFjCQC2AgEFAUoBAVECAUwBTQkAvAIDBQFMCQC2AgEFAU0FAWMBAVIDAVMBVAFVCQBrAwUBUwUBVAUBVQEBVgEBTAMJAL8CAgUBZAUBTAkAvgIBBQFMBQFMAQFXAQFMAwkAvwICBQFkBQFMCQC+AgEFAUwFAUwBAVgAAhMlc19fZmFjdG9yeUNvbnRyYWN0AQFZAAIUJXNfX21hbmFnZXJQdWJsaWNLZXkBAVoAAhslc19fcGVuZGluZ01hbmFnZXJQdWJsaWNLZXkBAmFhAAIRJXMlc19fcHJpY2VfX2xhc3QBAmFiAgJhYwJhZAkAuQkCCQDMCAICGCVzJXMlZCVkX19wcmljZV9faGlzdG9yeQkAzAgCCQCkAwEFAmFjCQDMCAIJAKQDAQUCYWQFA25pbAUBbgECYWUCAmFmAmFnCQCsAgIJAKwCAgkArAICAgslcyVzJXNfX1BfXwUCYWYCAl9fBQJhZwECYWgCAmFmAmFnCQCsAgIJAKwCAgkArAICAgslcyVzJXNfX0dfXwUCYWYCAl9fBQJhZwECYWkAAg8lc19fYW1vdW50QXNzZXQBAmFqAAIOJXNfX3ByaWNlQXNzZXQBAmFrAAIHJXNfX2FtcAECYWwAAg0lc19fYWRkb25BZGRyAAJhbQIHJXNfX2ZlZQACYW4JAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUCYW0FAUcAAmFvCQC5CQIJAMwIAgICJXMJAMwIAgIDZExwBQNuaWwFAW4AAmFwCQC5CQIJAMwIAgICJXMJAMwIAgISZExwUmVmcmVzaGVkSGVpZ2h0BQNuaWwFAW4AAmFxCQC5CQIJAMwIAgICJXMJAMwIAgIPcmVmcmVzaERMcERlbGF5BQNuaWwFAW4AAmFyAAEAAmFzCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFAmFxBQJhcgECYXQAAhElc19fZmFjdG9yeUNvbmZpZwECYXUAAhglcyVzX19tYXRjaGVyX19wdWJsaWNLZXkBAmF2AgJhdwJheAkArAICCQCsAgIJAKwCAgkArAICAgglZCVkJXNfXwUCYXcCAl9fBQJheAIIX19jb25maWcBAmF5AQJhegkArAICAiglcyVzJXNfX21hcHBpbmdzX19iYXNlQXNzZXQyaW50ZXJuYWxJZF9fBQJhegECYUEAAgwlc19fc2h1dGRvd24BAmFCAAIdJXNfX2FsbG93ZWRMcFN0YWJsZVNjcmlwdEhhc2gBAmFDAAIXJXNfX2ZlZUNvbGxlY3RvckFkZHJlc3MBAmFEAwJhRQJhRgJhRwkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAhFGYWlsZWQ6IG9yZFZhbGlkPQkApQMBBQJhRQILIHNuZHJWYWxpZD0JAKUDAQUCYUYCDCBtdGNoclZhbGlkPQkApQMBBQJhRwECYUgCAmFJAmFKCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUCYUkFAmFKCQC5CQIJAMwIAgIKbWFuZGF0b3J5IAkAzAgCCQClCAEFAmFJCQDMCAICAS4JAMwIAgUCYUoJAMwIAgIMIG5vdCBkZWZpbmVkBQNuaWwCAAECYUsCAmFJAmFKCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUCYUkFAmFKCQC5CQIJAMwIAgIKbWFuZGF0b3J5IAkAzAgCCQClCAEFAmFJCQDMCAICAS4JAMwIAgUCYUoJAMwIAgIMIG5vdCBkZWZpbmVkBQNuaWwCAAECYUwBAmFNCQACAQkAuQkCCQDMCAICD2xwX3N0YWJsZS5yaWRlOgkAzAgCBQJhTQUDbmlsAgEgAQJhTgECYU0JALkJAgkAzAgCAg9scF9zdGFibGUucmlkZToJAMwIAgUCYU0FA25pbAIBIAACYU8JARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQJhSAIFBHRoaXMJAQFYAAACYVAKAAJhUQkA/AcEBQJhTwIQZ2V0SW5GZWVSRUFET05MWQkAzAgCCQClCAEFBHRoaXMFA25pbAUDbmlsAwkAAQIFAmFRAgNJbnQFAmFRCQACAQkArAICCQADAQUCYVECGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAACYVIKAAJhUQkA/AcEBQJhTwIRZ2V0T3V0RmVlUkVBRE9OTFkJAMwIAgkApQgBBQR0aGlzBQNuaWwFA25pbAMJAAECBQJhUQIDSW50BQJhUQkAAgEJAKwCAgkAAwEFAmFRAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQAAmFTCQECYUgCBQR0aGlzCQECYWsAAQJhVAAJAQt2YWx1ZU9yRWxzZQIJAJsIAgUCYU8JAQJhQQAHAQJhVQAJANkEAQkBAmFIAgUCYU8JAQJhdQAAAmFWCQERQGV4dHJOYXRpdmUoMTA2MikBCQECYUgCBQJhTwkBAmFDAAECYVcABAJhWAkBAmFIAgUEdGhpcwkBAmFpAAQCYVkJAQJhSAIFBHRoaXMJAQJhagAEAmFaCQECYUsCBQJhTwkBAmF5AQUCYVkEAmF3CQECYUsCBQJhTwkBAmF5AQUCYVgJALUJAgkBAmFIAgUCYU8JAQJhdgIJAKQDAQUCYXcJAKQDAQUCYVoFAW4BAmJhAQJiYgMJAAACBQJiYgUBawUEdW5pdAkA2QQBBQJiYgECYmMBAmJiAwkAAAIFAmJiBQR1bml0BQFrCQDYBAEJAQV2YWx1ZQEFAmJiAQJiZAECYmUJAJsKCQkBEUBleHRyTmF0aXZlKDEwNjIpAQkAkQMCBQJiZQUBdAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmJlBQF1CQDZBAEJAJEDAgUCYmUFAXYJAQJiYQEJAJEDAgUCYmUFAXcJAQJiYQEJAJEDAgUCYmUFAXgJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJiZQUBeQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmJlBQF6CQDZBAEJAJEDAgUCYmUFAUEJANkEAQkAkQMCBQJiZQUBQgACYmYJAQJiZAEJAQJhVwAAAmJnBQJiZgACYmgIBQJiZwJfMQACYmkIBQJiZwJfMgACYmoIBQJiZwJfMwACYmsIBQJiZwJfNAACYmwIBQJiZwJfNQACYm0IBQJiZwJfNgACYm4IBQJiZwJfNwACYm8IBQJiZwJfOAACYnAIBQJiZwJfOQECYnEACQC1CQIJAQJhSAIFAmFPCQECYXQABQFuAAJicgkBAmJxAAACYnMJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIFAmJyBQFDAiBJbnZhbGlkIHN0YWtpbmcgY29udHJhY3QgYWRkcmVzcwACYnQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIFAmJyBQFFAiBJbnZhbGlkIHNsaXBhZ2UgY29udHJhY3QgYWRkcmVzcwACYnUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIFAmJyBQFGAhxJbnZhbGlkIGd3eCBjb250cmFjdCBhZGRyZXNzAAJidgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUCYnIFAUQCHEludmFsaWQgZ3d4IGNvbnRyYWN0IGFkZHJlc3MBAmJ3CgJieAJieQJiegJiQQJiQgJiQwJiRAJiRQJiRgJiRwkAuQkCCQDMCAICFCVkJWQlZCVkJWQlZCVkJWQlZCVkCQDMCAIJAKQDAQUCYngJAMwIAgkApAMBBQJieQkAzAgCCQCkAwEFAmJ6CQDMCAIJAKQDAQUCYkEJAMwIAgkApAMBBQJiQgkAzAgCCQCkAwEFAmJDCQDMCAIJAKQDAQUCYkQJAMwIAgkApAMBBQJiRQkAzAgCCQCkAwEFAmJGCQDMCAIJAKQDAQUCYkcFA25pbAUBbgECYkgGAmJJAmJKAmJLAmJBAmJEAmJFCQC5CQIJAMwIAgIMJWQlZCVkJWQlZCVkCQDMCAIJAKQDAQUCYkkJAMwIAgkApAMBBQJiSgkAzAgCCQCkAwEFAmJLCQDMCAIJAKQDAQUCYkEJAMwIAgkApAMBBQJiRAkAzAgCCQCkAwEFAmJFBQNuaWwFAW4BAmJMAQJiTQMJAAACBQJiTQIFV0FWRVMICQDvBwEFBHRoaXMJYXZhaWxhYmxlCQDwBwIFBHRoaXMJANkEAQUCYk0BAmJOAgJiTwJiUAkAvAIDBQJiTwUBYwUCYlABAmJRAwJiTwJiUAFPCQC9AgQFAmJPBQFjBQJiUAUBTwECYlIDAmJTAmJUAmJVBAJiVgkAvAIDCQC4AgIFAmJTBQJiVAUBYgUCYlQEAmJXCQC/AgIJALgCAgUCYlUJAQFWAQUCYlYFAWQDCQEBIQEFAmJXCQACAQkArAICAgpCaWcgc2xwZzogCQCmAwEFAmJWCQCUCgIFAmJXCQCZAwEJAMwIAgUCYlMJAMwIAgUCYlQFA25pbAECYlgDAmJZAmJaAmNhBAJiVgkAvAIDBQJiWgUBYgUCYlkEAmNiCQC/AgIFAmNhBQJiVgMDBQJjYgYJAL8CAgUCYloFAmJZCQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkApgMBBQJiWgIBIAkApgMBBQJiWQIBIAkApgMBBQJiVgIBIAkApgMBBQJjYQUCY2IBAmNjBAJjZAJjZQJjZgJjZwQCY2gJAQFIAgUCY2YFAmNkBAJjaQkBAUgCBQJjZwUCY2UJAQJiTgIFAmNpBQJjaAECY2oDAmNmAmNnAmNrBAJjbAUCYm0EAmNtBQJibgQCY24JAQJjYwQFAmNsBQJjbQUCY2YFAmNnBAJiUAkBAUgCBQJjZgUCY2wEAmJPCQEBSAIFAmNnBQJjbQQCY28JAQFIAgUCY2sFAWEEAmNwCQECYk4CBQJiUAUCY28EAmNxCQECYk4CBQJiTwUCY28JAMwIAgUCY24JAMwIAgUCY3AJAMwIAgUCY3EFA25pbAECY3IDAmNmAmNnAmNrBAJjcwkBAmNqAwUCY2YFAmNnBQJjawkAzAgCCQEBSwIJAJEDAgUCY3MAAAUBYQkAzAgCCQEBSwIJAJEDAgUCY3MAAQUBYQkAzAgCCQEBSwIJAJEDAgUCY3MAAgUBYQUDbmlsAQJjdAICY3UCYW4EAmN2AwkAAAIFAmFuAAAAAAkAawMFAmN1BQJhbgUBYQkAlAoCCQBlAgUCY3UFAmN2BQJjdgECY3cEAmN4AmN5AmN6AmNBBAJjQgUCYmoEAmNDCQDYBAEJAQV2YWx1ZQEFAmJrBAJjRAkA2AQBCQEFdmFsdWUBBQJibAQCY0UFAmJtBAJjRgUCYm4EAmNHCQCkAwEFAmJpBAJjSAgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkA7AcBBQJjQgILV3JvbmcgTFAgaWQIcXVhbnRpdHkDCQECIT0CCQDYBAEFAmNCBQJjeQkAAgECD1dyb25nIHBtdCBhc3NldAQCY0kJAQJiTAEFAmNDBAJjSgkBAUgCBQJjSQUCY0UEAmNLCQECYkwBBQJjRAQCY0wJAQFIAgUCY0sFAmNGBAJjTQkBAmJOAgUCY0wFAmNKBAJjTgkBAUsCBQJjTQUBYQQCY08JAQFIAgUCY3oFAWEEAmNQCQEBSAIFAmNIBQFhBAJjUQkAvAIDBQJjSgUCY08FAmNQBAJjUgkAvAIDBQJjTAUCY08FAmNQBAJjUwkBAU4DBQJjUQUCY0UFBUZMT09SBAJjVAkBAU4DBQJjUgUCY0YFBUZMT09SBAJjVQMJAAACBQJjeAIABQNuaWwJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUCY0EFAmNTAwkAAAIFAmNDAgVXQVZFUwUEdW5pdAkA2QQBBQJjQwkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQJjQQUCY1QDCQAAAgUCY0QCBVdBVkVTBQR1bml0CQDZBAEFAmNECQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhaAIJAKUIAQUCY0EFAmN4CQECYkgGBQJjUwUCY1QFAmN6BQJjTgUGaGVpZ2h0CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAmFhAAUCY04JAMwIAgkBDEludGVnZXJFbnRyeQIJAQJhYgIFBmhlaWdodAgFCWxhc3RCbG9jawl0aW1lc3RhbXAFAmNOBQNuaWwJAJwKCgUCY1MFAmNUBQJjQwUCY0QFAmNJBQJjSwUCY0gFAmNNBQJjRwUCY1UBAmNWDQJjeAJiVQJjVwJjWAJjWQJjWgJjQQJkYQJkYgJkYwJkZAJkZQJkZgQCY0IFAmJqBAJkZwkA2AQBCQEFdmFsdWUBBQJiawQCZGgJANgEAQkBBXZhbHVlAQUCYmwEAmRpBQJibwQCZGoFAmJwBAJkawUCYm0EAmRsBQJibgQCY0cJAKQDAQUCYmkEAmRtCAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDsBwEFAmNCAghXciBscCBhcwhxdWFudGl0eQQCY0kDBQJkYQkBAmJMAQUCZGcDAwUCZGMJAAACBQJkZgUCZGcHCQBlAgkBAmJMAQUCZGcFAmRlAwUCZGMJAQJiTAEFAmRnCQBlAgkBAmJMAQUCZGcFAmNXBAJjSwMFAmRhCQECYkwBBQJkaAMDBQJkYwkAAAIFAmRmBQJkaAcJAGUCCQECYkwBBQJkaAUCZGUDBQJkYwkBAmJMAQUCZGgJAGUCCQECYkwBBQJkaAUCY1kEAmRuCQEBSAIFAmNXBQJkawQCZG8JAQFIAgUCY1kFAmRsBAJkcAkBAmJOAgUCZG8FAmRuBAJjSgkBAUgCBQJjSQUCZGsEAmNMCQEBSAIFAmNLBQJkbAQCZHEDCQAAAgUCZG0AAAQCY00FAWQEAmRyBQFkBAJjbwkAdgYJALkCAgUCZG4FAmRvAAAJALYCAQAFAAEAAAUERE9XTgkAlwoFCQEBSwIFAmNvBQFhCQEBSwIFAmRuBQJkawkBAUsCBQJkbwUCZGwJAQJiTgIJALcCAgUCY0wFAmRvCQC3AgIFAmNKBQJkbgUCZHIEAmNNCQECYk4CBQJjTAUCY0oEAmRzCQC8AgMJAQFWAQkAuAICBQJjTQUCZHAFAWMFAmNNBAJkcgkBAUgCBQJiVQUBYQMDAwUCZGQJAQIhPQIFAmNNBQFkBwkAvwICBQJkcwUCZHIHCQACAQkArAICCQCsAgIJAKwCAgIPUHJpY2Ugc2xpcHBhZ2UgCQCmAwEFAmRzAgMgPiAJAKYDAQUCZHIEAmR0CQEBSAIFAmRtBQFhBAJkdQkAvQIEBQJkbgkBAmJRAwUCY0wFAmNKBQdDRUlMSU5HBQFjBQdDRUlMSU5HBAJkdgkAvQIEBQJkbwUBYwkBAmJRAwUCY0wFAmNKBQVGTE9PUgUHQ0VJTElORwQCZHcDCQC/AgIFAmR1BQJkbwkAlAoCBQJkdgUCZG8JAJQKAgUCZG4FAmR1BAJkeAgFAmR3Al8xBAJkeQgFAmR3Al8yBAJjbwkAvQIEBQJkdAUCZHkFAmNMBQVGTE9PUgkAlwoFCQEBTgMFAmNvBQFhBQVGTE9PUgkBAU4DBQJkeAUCZGsFB0NFSUxJTkcJAQFOAwUCZHkFAmRsBQdDRUlMSU5HBQJjTQUCZHIEAmR6CAUCZHECXzEEAmRBCAUCZHECXzIEAmRCCAUCZHECXzMEAmNOCQEBSwIIBQJkcQJfNAUBYQQCZEMJAQFLAggFAmRxAl81BQFhAwkAZwIAAAUCZHoJAAIBAgdMUCA8PSAwBAJkRAMJAQEhAQUCZGIAAAUCZHoEAmRFCQBlAgUCY1cFAmRBBAJkRgkAZQIFAmNZBQJkQgQCZEcDAwUCZGMJAAACBQJkZgUCZGcHCQCUCgIFAmRlAAADAwUCZGMJAAACBQJkZgUCZGgHCQCUCgIAAAUCZGUJAJQKAgUCZEEFAmRCBAJkSAgFAmRHAl8xBAJkSQgFAmRHAl8yBAJkSgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAmFhAAUCY04JAMwIAgkBDEludGVnZXJFbnRyeQIJAQJhYgIFBmhlaWdodAgFCWxhc3RCbG9jawl0aW1lc3RhbXAFAmNOCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhZQIFAmNBBQJjeAkBAmJ3CgUCZEgFAmRJBQJkRAUCY04FAmJVBQJkQwUGaGVpZ2h0CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAUCZEUFAmRGBQNuaWwJAJ8KDQUCZHoFAmREBQJjTgUCY0kFAmNLBQJkbQUCY0IFAmNHBQJkSgUCZEUFAmRGBQJjWAUCY1oBAmRLAQJkTAQCZE0JAJEDAgUCZEwAAAQCZE4JAJEDAgUCZEwAAQQCZE8JALcCAgUCZE0FAmROAwkAAAIFAmRPBQFlBQFlBAJkUAkBDXBhcnNlSW50VmFsdWUBBQJhUwQCZFEJAGgCBQJkUAACBAJjcwkAvAIDBQJkTQUCZE4FAWYEAmRSCQC8AgMFAmNzBQFpBQFmBAJkUwkAvAIDCQC2AgEFAmRRBQJkTwUBZgQCZFQJALYCAQkAZQIFAmRRAAEKAQJkVQECZFYEAmRXCQC8AgMFAmRWBQJkVgUBZgQCZFgJALwCAwUCZFcFAmRWBQFmBAJkWQkAvAIDBQJkWAUBZgUCZFIJAL0CBAkAtwICBQJkUwkAvAIDBQJkWQUBZwUBZgUCZFYJALcCAgkAvAIDBQJkVAUCZFYFAWYJALwCAwUBaAUCZFkFAWYFB0NFSUxJTkcKAQJkWgICZWECZWIDCAUCZWECXzIFAmVhBAJkVggFAmVhAl8xBAJlYwkBAmRVAQUCZFYEAmVkCQC4AgIFAmVjCQEFdmFsdWUBBQJkVgQCZWUDCQC/AgIFAWUFAmVkCQC+AgEFAmVkBQJlZAMJAMACAgUBZgUCZWUJAJQKAgUCZWMGCQCUCgIFAmVjBwQCZWYJAMwIAgAACQDMCAIAAQkAzAgCAAIJAMwIAgADCQDMCAIABAkAzAgCAAUJAMwIAgAGCQDMCAIABwkAzAgCAAgJAMwIAgAJCQDMCAIACgkAzAgCAAsJAMwIAgAMCQDMCAIADQkAzAgCAA4FA25pbAQCZWcKAAJlaAUCZWYKAAJlaQkAkAMBBQJlaAoAAmVqCQCUCgIFAmRPBwoBAmVrAgJlbAJlbQMJAGcCBQJlbQUCZWkFAmVsCQECZFoCBQJlbAkAkQMCBQJlaAUCZW0KAQJlbgICZWwCZW0DCQBnAgUCZW0FAmVpBQJlbAkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDE1CQECZW4CCQECZWsCCQECZWsCCQECZWsCCQECZWsCCQECZWsCCQECZWsCCQECZWsCCQECZWsCCQECZWsCCQECZWsCCQECZWsCCQECZWsCCQECZWsCCQECZWsCCQECZWsCBQJlagAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPBAJkVggFAmVnAl8xBAJlbwgFAmVnAl8yAwUCZW8FAmRWCQACAQkArAICAhlEIGNhbGN1bGF0aW9uIGVycm9yLCBEID0gCQCmAwEFAmRWAQJlcAECZEwEAmVxBQFnBAJkTQkAkQMCBQJkTAAABAJkTgkAkQMCBQJkTAABBAJlcgkApwMBBQFsBAJkUAkAuQICCQCnAwEFAmFTBQJlcgQCZE8JALcCAgUCZE0FAmROAwkAAAIFAmRPBQFlBQFlBAJkUQkAuQICBQJkUAUCZXEEAmRSCQC5AgIJALkCAgkAuQICBQJkTQUCZE4FAmVxBQJlcQQCZXMJALoCAgkAuQICBQJkUQUCZE8FAmVyBAJldAkAuAICBQJkUQUCZXIEAmV1CQC3AgIFAmVxBQFmCgECZFoCAmVhAmV2BAJldwUCZWEEAmRWCAUCZXcCXzEEAmVvCAUCZXcCXzIDCQECIT0CBQJlbwUEdW5pdAUCZWEEAmRZCQC6AgIJALkCAgkAuQICBQJkVgUCZFYFAmRWBQJkUgQCZWMJALoCAgkAuQICCQC3AgIFAmVzCQC5AgIFAmRZBQJlcQUCZFYJALcCAgkAugICCQC5AgIFAmV0BQJkVgUCZXIJALkCAgUCZXUFAmRZBAJlZQkBAVcBCQC4AgIFAmVjCQEFdmFsdWUBBQJkVgMJAMACAgUBZgUCZWUJAJQKAgUCZWMFAmV2CQCUCgIFAmVjBQR1bml0BAJlZgkAzAgCAAAJAMwIAgABCQDMCAIAAgkAzAgCAAMJAMwIAgAECQDMCAIABQkAzAgCAAYJAMwIAgAHCQDMCAIACAkAzAgCAAkJAMwIAgAKCQDMCAIACwkAzAgCAAwJAMwIAgANCQDMCAIADgUDbmlsBAJleAoAAmVoBQJlZgoAAmVpCQCQAwEFAmVoCgACZWoJAJQKAgUCZE8FBHVuaXQKAQJlawICZWwCZW0DCQBnAgUCZW0FAmVpBQJlbAkBAmRaAgUCZWwJAJEDAgUCZWgFAmVtCgECZW4CAmVsAmVtAwkAZwIFAmVtBQJlaQUCZWwJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxNQkBAmVuAgkBAmVrAgkBAmVrAgkBAmVrAgkBAmVrAgkBAmVrAgkBAmVrAgkBAmVrAgkBAmVrAgkBAmVrAgkBAmVrAgkBAmVrAgkBAmVrAgkBAmVrAgkBAmVrAgkBAmVrAgUCZWoAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwQCZFYIBQJleAJfMQQCZW8IBQJleAJfMgMJAQIhPQIFAmVvBQR1bml0BQJkVgkAAgEJAKwCAgIZRCBjYWxjdWxhdGlvbiBlcnJvciwgRCA9IAkApgMBBQJkVgECZXkDAmRMAmViAmV6BAJlcQUBZwQCZUEJAJEDAgUCZEwDCQAAAgUCZWIAAAABAAAEAmVyCQCnAwEFAWwEAmRQCQC5AgIJAKcDAQUCYVMFAmVyBAJkTwUCZUEEAmRRCQC5AgIFAmRQBQJlcQQCZUIJALoCAgkAuQICCQC5AgIJALoCAgkAuQICBQJlegUCZXoJALkCAgUCZUEFAmVxBQJlegUCZXIJALkCAgUCZFEFAmVxBAJlQwkAuAICCQC3AgIFAmRPCQC6AgIJALkCAgUCZXoFAmVyBQJkUQUCZXoKAQJkWgICZWECZXYEAmVEBQJlYQQCZUUIBQJlRAJfMQQCZW8IBQJlRAJfMgMJAQIhPQIFAmVvBQR1bml0BQJlYQQCZUYJALoCAgkAtwICCQC5AgIFAmVFBQJlRQUCZUIJALcCAgkAuQICBQFnBQJlRQUCZUMEAmVHCQEBVwEJALgCAgUCZUYJAQV2YWx1ZQEFAmVFAwkAwAICBQFmBQJlRwkAlAoCBQJlRgUCZXYJAJQKAgUCZUYFBHVuaXQEAmVmCQDMCAIAAAkAzAgCAAEJAMwIAgACCQDMCAIAAwkAzAgCAAQJAMwIAgAFCQDMCAIABgkAzAgCAAcJAMwIAgAICQDMCAIACQkAzAgCAAoJAMwIAgALCQDMCAIADAkAzAgCAA0JAMwIAgAOBQNuaWwEAmVICgACZWgFAmVmCgACZWkJAJADAQUCZWgKAAJlagkAlAoCBQJlegUEdW5pdAoBAmVrAgJlbAJlbQMJAGcCBQJlbQUCZWkFAmVsCQECZFoCBQJlbAkAkQMCBQJlaAUCZW0KAQJlbgICZWwCZW0DCQBnAgUCZW0FAmVpBQJlbAkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDE1CQECZW4CCQECZWsCCQECZWsCCQECZWsCCQECZWsCCQECZWsCCQECZWsCCQECZWsCCQECZWsCCQECZWsCCQECZWsCCQECZWsCCQECZWsCCQECZWsCCQECZWsCCQECZWsCBQJlagAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPBAJlRQgFAmVIAl8xBAJlbwgFAmVIAl8yAwkBAiE9AgUCZW8FBHVuaXQFAmVFCQACAQkArAICAhlZIGNhbGN1bGF0aW9uIGVycm9yLCBZID0gCQCmAwEFAmVFAQJlSQMCZUoCZUsCZUwEAmVNCQC8AgMJAQJkSwEJAMwIAgkBAUgCCQCgAwEFAmVKBQJibQkAzAgCCQEBSAIJAKADAQUCZUsFAmJuBQNuaWwFAWYFAmVMAwkAAAIFAmVMBQFlBQFlBQJlTQECZU4DAmVPAmVQAmVRBAJlUgkAuAICCQC2AgEJAQJiTAEJAQJiYwEFAmJrBQJlTwQCZVMJALgCAgkAtgIBCQECYkwBCQECYmMBBQJibAUCZVAEAmVUCQC4AgIJALYCAQgJAQV2YWx1ZQEJAOwHAQUCYmoIcXVhbnRpdHkFAmVRBAJlVQkBAmVJAwUCZVIFAmVTBQJlVAUCZVUBAmVWAwJlVwJlWAJlUQQCZVIJAGQCCQECYkwBCQECYmMBBQJiawUCZVcEAmVTCQBkAgkBAmJMAQkBAmJjAQUCYmwFAmVYBAJlVAkAZAIICQEFdmFsdWUBCQDsBwEFAmJqCHF1YW50aXR5BQJlUQQCZU0JAQJlSQMJALYCAQUCZVIJALYCAQUCZVMJALYCAQUCZVQEAmVZCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQJhcAUGaGVpZ2h0CQDMCAIJAQtTdHJpbmdFbnRyeQIFAmFvCQCmAwEFAmVNBQNuaWwJAJQKAgUCZVkFAmVNAQJlWgICZmECZU0DCQDAAgIFAmVNBQJmYQYJAQJhTAECInVwZGF0ZWQgRExwIGxvd2VyIHRoYW4gY3VycmVudCBETHABAmZiAQJmYwQCZmQIBQJmYwZhbW91bnQEAmZlCQBuBAgFAmZjBmFtb3VudAgFAmZjBXByaWNlBQFhBQVGTE9PUgQCZmYDCQAAAggFAmZjCW9yZGVyVHlwZQUDQnV5CQCUCgIFAmZkCQEBLQEFAmZlCQCUCgIJAQEtAQUCZmQFAmZlBAJlVwgFAmZmAl8xBAJlWAgFAmZmAl8yAwMDCQECYVQABgkAAAIFAmJpBQFyBgkAAAIFAmJpBQFzCQACAQINQWRtaW4gYmxvY2tlZAMDCQECIT0CCAgFAmZjCWFzc2V0UGFpcgthbW91bnRBc3NldAUCYmsGCQECIT0CCAgFAmZjCWFzc2V0UGFpcgpwcmljZUFzc2V0BQJibAkAAgECCVdyIGFzc2V0cwQCZmcJAKcDAQkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwUCYW8EAmZoCQECZVYDBQJlVwUCZVgAAAQCZmkIBQJmaAJfMQQCZmoIBQJmaAJfMgQCZmsJAMACAgUCZmoFAmZnBQJmawECZmwBAmViAwkBAiE9AgkAkAMBCAUCZWIIcGF5bWVudHMAAQkAAgECCjEgcG1udCBleHAEAmZtCQEFdmFsdWUBCQCRAwIIBQJlYghwYXltZW50cwAABAJjeQkBBXZhbHVlAQgFAmZtB2Fzc2V0SWQEAmRlCAUCZm0GYW1vdW50BAJkcQkBAmN3BAkA2AQBCAUCZWINdHJhbnNhY3Rpb25JZAkA2AQBBQJjeQUCZGUIBQJlYgZjYWxsZXIEAmNTCAUCZHECXzEEAmNUCAUCZHECXzIEAmNHCQENcGFyc2VJbnRWYWx1ZQEIBQJkcQJfOQQCY1UIBQJkcQNfMTADAwkBAmFUAAYJAAACBQJjRwUBcwkAAgEJAKwCAgIPQWRtaW4gYmxvY2tlZDogCQCkAwEFAmNHCQCXCgUFAmNTBQJjVAUCZGUFAmN5BQJjVQECZm4KAmZvAmFnAmZwAmZxAmJVAmRiAmRjAmRkAmRlAmRmBAJkcQkBAmNWDQUCYWcFAmJVCAkBBXZhbHVlAQUCZnAGYW1vdW50CAkBBXZhbHVlAQUCZnAHYXNzZXRJZAgJAQV2YWx1ZQEFAmZxBmFtb3VudAgJAQV2YWx1ZQEFAmZxB2Fzc2V0SWQFAmZvCQAAAgUCYWcCAAUCZGIFAmRjBQJkZAUCZGUFAmRmBAJjRwkBDXBhcnNlSW50VmFsdWUBCAUCZHECXzgDAwMJAQJhVAAGCQAAAgUCY0cFAXEGCQAAAgUCY0cFAXMJAAIBCQCsAgICCEJsb2NrZWQ6CQCkAwEFAmNHBQJkcQECZnIFAmZzAmN5AmNBAmFnAmZ0BAJjQwkA2AQBCQEFdmFsdWUBBQJiawQCY0QJANgEAQkBBXZhbHVlAQUCYmwEAmNCBQJiagQCZGsFAmJtBAJkbAUCYm4EAmVUCQC2AgEICQETdmFsdWVPckVycm9yTWVzc2FnZQIJAOwHAQUCY0ICEGludmFsaWQgbHAgYXNzZXQIcXVhbnRpdHkEAmZ1AwkAvwICBQJlVAUBZQYJAAIBAiJpbml0aWFsIGRlcG9zaXQgcmVxdWlyZXMgYWxsIGNvaW5zAwkAAAIFAmZ1BQJmdQQCY0kJAQJiTAEFAmNDBAJjSwkBAmJMAQUCY0QEAmZ2AwkAAAIFAmFnAgAJAJQKAgUCY0kFAmNLAwkAAAIFAmN5BQJjQwMJAGYCBQJmcwUCY0kJAAIBAhZpbnZhbGlkIHBheW1lbnQgYW1vdW50CQCUCgIJAGUCBQJjSQUCZnMFAmNLAwkAAAIFAmN5BQJjRAMJAGYCBQJmcwUCY0sJAAIBAhZpbnZhbGlkIHBheW1lbnQgYW1vdW50CQCUCgIFAmNJCQBlAgUCY0sFAmZzCQACAQIQd3JvbmcgcG10QXNzZXRJZAQCZncIBQJmdgJfMQQCZngIBQJmdgJfMgQCZnkDCQAAAgUCY3kFAmNDCQCUCgIFAmZzAAADCQAAAgUCY3kFAmNECQCUCgIAAAUCZnMJAAIBAg9pbnZhbGlkIHBheW1lbnQEAmZ6CAUCZnkCXzEEAmZBCAUCZnkCXzIEAmZCAwUCZnQJAJUKAwgJAQJjdAIFAmZ6BQJhUAJfMQgJAQJjdAIFAmZBBQJhUAJfMQgJAQJjdAIFAmZzBQJhUAJfMgkAlQoDBQJmegUCZkEAAAQCZkMIBQJmQgJfMQQCZkQIBQJmQgJfMgQCY3YIBQJmQgJfMwQCZkUJAGQCBQJmdwUCZkMEAmZGCQBkAgUCZngFAmZEBAJiWgkBAmRLAQkAzAgCCQC2AgEFAmZ3CQDMCAIJALYCAQUCZngFA25pbAQCYlkJAQJkSwEJAMwIAgkAtgIBBQJmRQkAzAgCCQC2AgEFAmZGBQNuaWwEAmZHAwkAvwICBQJiWQUCYloGCQEFdGhyb3cAAwkAAAIFAmZHBQJmRwQCZkgJAL0CBAUCZVQJALgCAgUCYlkFAmJaBQJiWgUFRkxPT1IEAmNOCQEBSwIJAQJiTgIJAQFIAgUCZkYFAmRsCQEBSAIFAmZFBQJkawUBYQQCZEoJAMwIAgkBDEludGVnZXJFbnRyeQIJAQJhYQAFAmNOCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECYWICBQZoZWlnaHQIBQlsYXN0QmxvY2sJdGltZXN0YW1wBQJjTgkAzAgCCQELU3RyaW5nRW50cnkCCQECYWUCBQJjQQUCYWcJAQJidwoFAmZ6BQJmQQkAoAMBBQJmSAUCY04AAAAABQZoZWlnaHQIBQlsYXN0QmxvY2sJdGltZXN0YW1wAAAAAAUDbmlsBAJmSQkAawMFAmZ4BQFhBQJmdwQCZkoJAGsDBQJmcwUBYQkAZAIFAmZJBQFhBAJmSwkAZQIFAmZzBQJmSgQCZkwJALwCAwUCZVQJALYCAQUCZksJALYCAQUCZngEAmZNCQCgAwEJALwCAwkAuAICBQJmSAUCZkwFAWIFAmZMCQCWCgQJAKADAQUCZkgFAmRKBQJjdgUCZk0JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BAmZOBgJmTwJmUAJmUQJmbwJmUgJmUwQCY0IJANgEAQkBBXZhbHVlAQUCYmoEAmNDCQDYBAEJAQV2YWx1ZQEFAmJrBAJjRAkA2AQBCQEFdmFsdWUBBQJibAQCZlQFAmJtBAJmVQUCYm4EAmZWBQJiaQQCY0EDCQAAAgUCZm8FAmJ2BQJmUgUCZm8EAmZtCQEFdmFsdWUBCQCRAwIFAmZRAAAEAmN5CQEFdmFsdWUBCAUCZm0HYXNzZXRJZAQCZGUIBQJmbQZhbW91bnQEAmVVCQECZU4DBQFlBQFlBQFlAwkAAAIFAmVVBQJlVQQCY3gJANgEAQUCZlMDCQECIT0CBQJjQgkA2AQBBQJjeQkAAgECCFdyb25nIExQBAJjSQkBAmJMAQUCY0MEAmNLCQECYkwBBQJjRAQCZlcKAAJhUQkA/AcEBQR0aGlzAhNnZXRPbmVUa25WMlJFQURPTkxZCQDMCAIFAmZPCQDMCAIFAmRlBQNuaWwFA25pbAMJAAECBQJhUQIKKEludCwgSW50KQUCYVEJAAIBCQCsAgIJAAMBBQJhUQIfIGNvdWxkbid0IGJlIGNhc3QgdG8gKEludCwgSW50KQMJAAACBQJmVwUCZlcEAmN2CAUCZlcCXzIEAmZYCAUCZlcCXzEEAmZZAwMJAGYCBQJmUAAACQBmAgUCZlAFAmZYBwkBAmFMAQkAuQkCCQDMCAICH2Ftb3VudCB0byByZWNlaXZlIGlzIGxlc3MgdGhhbiAJAMwIAgkApAMBBQJmUAUDbmlsAgAFAmZYBAJmWgMJAAACBQJmTwUCY0MJAJYKBAUCZlkAAAkAZQIJAGUCBQJjSQUCZlkFAmN2BQJjSwMJAAACBQJmTwUCY0QJAJYKBAAABQJmWQUCY0kJAGUCCQBlAgUCY0sFAmZZBQJjdgkAAgECFGludmFsaWQgb3V0IGFzc2V0IGlkBAJnYQgFAmZaAl8xBAJnYggFAmZaAl8yBAJmRQgFAmZaAl8zBAJmRggFAmZaAl80BAJnYwkBAmJOAgkBAUgCBQJmRgUCZlUJAQFIAgUCZkUFAmZUBAJnZAkBAUsCBQJnYwUBYQQCZ2UDCQAAAgUCZk8CBVdBVkVTBQR1bml0CQDZBAEFAmZPBAJnZgMJAGYCBQJjdgAACQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFAmFWBQJjdgUCZ2UFA25pbAUDbmlsBAJjVQkAzggCCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFAmNBBQJmWQUCZ2UJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFoAgkApQgBBQJjQQUCY3gJAQJiSAYFAmdhBQJnYgUCZGUFAmdkBQZoZWlnaHQIBQlsYXN0QmxvY2sJdGltZXN0YW1wCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECYWEABQJnZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAmFiAgUGaGVpZ2h0CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAUCZ2QFA25pbAUCZ2YDCQAAAgUCY1UFAmNVBAJnZwkA/AcEBQJhTwIEYnVybgkAzAgCBQJkZQUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQJjeQUCZGUFA25pbAMJAAACBQJnZwUCZ2cEAmdoBAJnaQMJAAACBQR0aGlzBQJhVgAABQJjdgQCZ2oDCQAAAgkBAmJhAQUCZk8FAmJrBgcDBQJnagkAlAoCCQEBLQEJAGQCBQJmWAUCZ2kAAAkAlAoCAAAJAQEtAQkAZAIFAmZYBQJnaQQCZVcIBQJnaAJfMQQCZVgIBQJnaAJfMgQCZ2sJAQJlVgMFAmVXBQJlWAAABAJnbAgFAmdrAl8xBAJlTQgFAmdrAl8yBAJnbQkBAmVaAgUCZVUFAmVNAwkAAAIFAmdtBQJnbQkAlAoCCQDOCAIFAmNVBQJnbAUCZlkJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BAmduAAQCZ28JAKIIAQkBAVkAAwkAAQIFAmdvAgZTdHJpbmcEAmRPBQJnbwkA2QQBBQJkTwMJAAECBQJnbwIEVW5pdAUEdW5pdAkAAgECC01hdGNoIGVycm9yAQJncAAEAmdvCQCiCAEJAQFaAAMJAAECBQJnbwIGU3RyaW5nBAJkTwUCZ28JANkEAQUCZE8DCQABAgUCZ28CBFVuaXQFBHVuaXQJAAIBAgtNYXRjaCBlcnJvcgACZ3EJAAIBAhFQZXJtaXNzaW9uIGRlbmllZAECZ3IBAmViBAJnbwkBAmduAAMJAAECBQJnbwIKQnl0ZVZlY3RvcgQCZ3MFAmdvCQAAAggFAmViD2NhbGxlclB1YmxpY0tleQUCZ3MDCQABAgUCZ28CBFVuaXQJAAACCAUCZWIGY2FsbGVyBQR0aGlzCQACAQILTWF0Y2ggZXJyb3IBAmd0AQJlYgQCZ28JAQJnbgADCQABAgUCZ28CCkJ5dGVWZWN0b3IEAmdzBQJnbwMJAAACCAUCZWIPY2FsbGVyUHVibGljS2V5BQJncwYFAmdxAwkAAQIFAmdvAgRVbml0AwkAAAIIBQJlYgZjYWxsZXIFBHRoaXMGBQJncQkAAgECC01hdGNoIGVycm9yHAJlYgELY29uc3RydWN0b3IBAVgEAmVCCQECZ3QBBQJlYgMJAAACBQJlQgUCZUIJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVgABQFYBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CZWIBCnNldE1hbmFnZXIBAmd1BAJlQgkBAmd0AQUCZWIDCQAAAgUCZUIFAmVCBAJndgkA2QQBBQJndQMJAAACBQJndgUCZ3YJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVoABQJndQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmViAQ5jb25maXJtTWFuYWdlcgAEAmNzCQECZ3AABAJndwMJAQlpc0RlZmluZWQBBQJjcwYJAAIBAhJObyBwZW5kaW5nIG1hbmFnZXIDCQAAAgUCZ3cFAmd3BAJneAMJAAACCAUCZWIPY2FsbGVyUHVibGljS2V5CQEFdmFsdWUBBQJjcwYJAAIBAhtZb3UgYXJlIG5vdCBwZW5kaW5nIG1hbmFnZXIDCQAAAgUCZ3gFAmd4CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFZAAkA2AQBCQEFdmFsdWUBBQJjcwkAzAgCCQELRGVsZXRlRW50cnkBCQEBWgAFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJlYgEDcHV0AgJneQJnegQCZ0EJAQJicQAEAmdCCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkAkQMCBQJnQQUBQwIKV3Igc3QgYWRkcgQCZ0MJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIFAmdBBQFFAgpXciBzbCBhZGRyAwkAZgIAAAUCZ3kJAAIBAg5Xcm9uZyBzbGlwcGFnZQMJAQIhPQIJAJADAQgFAmViCHBheW1lbnRzAAIJAAIBAgwyIHBtbnRzIGV4cGQEAmdECQC2AgEICQEFdmFsdWUBCQCRAwIIBQJlYghwYXltZW50cwAABmFtb3VudAQCZ0UJALYCAQgJAQV2YWx1ZQEJAJEDAggFAmViCHBheW1lbnRzAAEGYW1vdW50BAJlUgkAuAICCQC2AgEJAQJiTAEJAQJiYwEFAmJrBQJnRAMJAAACBQJlUgUCZVIEAmVTCQC4AgIJALYCAQkBAmJMAQkBAmJjAQUCYmwFAmdFAwkAAAIFAmVTBQJlUwQCZVQJALYCAQgJAQV2YWx1ZQEJAOwHAQUCYmoIcXVhbnRpdHkDCQAAAgUCZVQFAmVUBAJlVQkBAmVOAwUCZ0QFAmdFCQC2AgEAAAMJAAACBQJlVQUCZVUEAmdGCQECZm4KCQClCAEIBQJlYgZjYWxsZXIJANgEAQgFAmViDXRyYW5zYWN0aW9uSWQJAQ9BdHRhY2hlZFBheW1lbnQCCAkBBXZhbHVlAQkAkQMCCAUCZWIIcGF5bWVudHMAAAdhc3NldElkCAkBBXZhbHVlAQkAkQMCCAUCZWIIcGF5bWVudHMAAAZhbW91bnQJAJEDAggFAmViCHBheW1lbnRzAAEFAmd5BgcGAAACAAQCZEQIBQJnRgJfMgQCZ0cIBQJnRgJfNwQCY1UIBQJnRgJfOQQCZEUIBQJnRgNfMTAEAmRGCAUCZ0YDXzExBAJjQwgFAmdGA18xMgQCY0QIBQJnRgNfMTMEAmRxCQD8BwQFAmFPAgRlbWl0CQDMCAIFAmREBQNuaWwFA25pbAMJAAACBQJkcQUCZHEEAmdIBAJnbwUCZHEDCQABAgUCZ28CB0FkZHJlc3MEAmdJBQJnbwkA/AcEBQJnSQIEZW1pdAkAzAgCBQJkRAUDbmlsBQNuaWwFBHVuaXQDCQAAAgUCZ0gFAmdIBAJnSgMJAGYCBQJkRQAACQD8BwQFAmdDAgNwdXQFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUCY0MFAmRFBQNuaWwFA25pbAMJAAACBQJnSgUCZ0oEAmdLAwkAZgIFAmRGAAAJAPwHBAUCZ0MCA3B1dAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQJjRAUCZEYFA25pbAUDbmlsAwkAAAIFAmdLBQJnSwQCZ0wDBQJnegQCZ00JAPwHBAUCZ0ICBXN0YWtlBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFAmdHBQJkRAUDbmlsAwkAAAIFAmdNBQJnTQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQJlYgZjYWxsZXIFAmREBQJnRwUDbmlsBAJnTgkBAmVWAwAAAAAAAAQCZ2wIBQJnTgJfMQQCZU0IBQJnTgJfMgQCZ08DCQDAAgIFAmVNBQJlVQYJAQJhTAEJALkJAgkAzAgCAiJ1cGRhdGVkIERMcCBsb3dlciB0aGFuIGN1cnJlbnQgRExwCQDMCAIJAKYDAQUCZVIJAMwIAgkApgMBBQJlUwkAzAgCCQCmAwEFAmVUCQDMCAIJAKYDAQUCZVUJAMwIAgkApgMBBQJlTQkAzAgCCQCkAwEFAmRFCQDMCAIJAKQDAQUCZEYFA25pbAIBIAMJAAACBQJnTwUCZ08EAmdQCAkBBXZhbHVlAQkA7AcBBQJiaghxdWFudGl0eQMJAAACBQJnUAUCZ1AJAM4IAgkAzggCBQJjVQUCZ0wFAmdsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmViAQtwdXRPbmVUa25WMgICZlACZ3oEAmdRCgACYVEJAPwHBAUCYU8CKGlzUG9vbE9uZVRva2VuT3BlcmF0aW9uc0Rpc2FibGVkUkVBRE9OTFkJAMwIAgkApQgBBQR0aGlzBQNuaWwFA25pbAMJAAECBQJhUQIHQm9vbGVhbgUCYVEJAAIBCQCsAgIJAAMBBQJhUQIcIGNvdWxkbid0IGJlIGNhc3QgdG8gQm9vbGVhbgQCZ1IDAwMJAQJhVAAGCQAAAgUCYmkFAXEGCQAAAgUCYmkFAXMGBQJnUQQCZ1MJAMwIAgMDCQEBIQEFAmdSBgkBAmdyAQUCZWIGCQECYUwBAiFwdXQgb3BlcmF0aW9uIGlzIGJsb2NrZWQgYnkgYWRtaW4JAMwIAgMJAAACCQCQAwEIBQJlYghwYXltZW50cwABBgkBAmFMAQIeZXhhY3RseSAxIHBheW1lbnQgYXJlIGV4cGVjdGVkBQNuaWwDCQAAAgUCZ1MFAmdTBAJjQwkA2AQBCQEFdmFsdWUBBQJiawQCY0QJANgEAQkBBXZhbHVlAQUCYmwEAmNCBQJiagQCZlQFAmJtBAJmVQUCYm4EAmNBAwkAAAIIBQJlYgZjYWxsZXIFBHRoaXMIBQJlYgxvcmlnaW5DYWxsZXIIBQJlYgZjYWxsZXIEAmZtCQEFdmFsdWUBCQCRAwIIBQJlYghwYXltZW50cwAABAJjeQkA2AQBCQEFdmFsdWUBCAUCZm0HYXNzZXRJZAQCZGUIBQJmbQZhbW91bnQEAmVVAwkAAAIIBQJmbQdhc3NldElkBQJiawkBAmVOAwkAtgIBBQJkZQkAtgIBAAAJALYCAQAACQECZU4DCQC2AgEAAAkAtgIBBQJkZQkAtgIBAAADCQAAAgUCZVUFAmVVBAJnVAkBAmZyBQUCZGUFAmN5CQClCAEFAmNBCQDYBAEIBQJlYg10cmFuc2FjdGlvbklkBgMJAAACBQJnVAUCZ1QEAmN2CAUCZ1QCXzMEAmNVCAUCZ1QCXzIEAmdVCAUCZ1QCXzEEAmREAwMJAGYCBQJmUAAACQBmAgUCZlAFAmdVBwkBAmFMAQkAuQkCCQDMCAICH2Ftb3VudCB0byByZWNlaXZlIGlzIGxlc3MgdGhhbiAJAMwIAgkApAMBBQJmUAUDbmlsAgAFAmdVBAJnRgkA/AcEBQJhTwIEZW1pdAkAzAgCBQJkRAUDbmlsBQNuaWwDCQAAAgUCZ0YFAmdGBAJnSAQCZ28FAmdGAwkAAQIFAmdvAgdBZGRyZXNzBAJnSQUCZ28JAPwHBAUCZ0kCBGVtaXQJAMwIAgUCZEQFA25pbAUDbmlsBQR1bml0AwkAAAIFAmdIBQJnSAQCZ0wDBQJnegQCZ00JAPwHBAUCYnMCBXN0YWtlBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFAmNCBQJkRAUDbmlsAwkAAAIFAmdNBQJnTQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQJlYgZjYWxsZXIFAmREBQJjQgUDbmlsBAJnZgMJAGYCBQJjdgAACQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFAmFWBQJjdgkA2QQBBQJjeQUDbmlsBQNuaWwEAmdWAwkAAAIFBHRoaXMFAmFWCQCUCgIAAAAABAJnVwMJAAACCAUCZm0HYXNzZXRJZAUCYmsGBwMFAmdXCQCUCgIJAQEtAQUCY3YAAAkAlAoCAAAJAQEtAQUCY3YEAmVXCAUCZ1YCXzEEAmVYCAUCZ1YCXzIEAmdYCQECZVYDBQJlVwUCZVgAAAQCZ2wIBQJnWAJfMQQCZU0IBQJnWAJfMgQCZ20JAQJlWgIFAmVVBQJlTQMJAAACBQJnbQUCZ20JAJQKAgkAzggCCQDOCAIJAM4IAgUCY1UFAmdMBQJnZgUCZ2wFAmRECQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmViAQpwdXRGb3JGcmVlAQJnWQMJAGYCAAAFAmdZCQACAQIKV3Jvbmcgc2xwZwMJAQIhPQIJAJADAQgFAmViCHBheW1lbnRzAAIJAAIBAgwyIHBtbnRzIGV4cGQEAmdaCQECZm4KCQClCAEIBQJlYgZjYWxsZXIJANgEAQgFAmViDXRyYW5zYWN0aW9uSWQJAQ9BdHRhY2hlZFBheW1lbnQCCAkBBXZhbHVlAQkAkQMCCAUCZWIIcGF5bWVudHMAAAdhc3NldElkCAkBBXZhbHVlAQkAkQMCCAUCZWIIcGF5bWVudHMAAAZhbW91bnQJAJEDAggFAmViCHBheW1lbnRzAAEFAmdZBwcGAAACAAQCY1UIBQJnWgJfOQQCZ0QJALYCAQgJAQV2YWx1ZQEJAJEDAggFAmViCHBheW1lbnRzAAAGYW1vdW50BAJnRQkAtgIBCAkBBXZhbHVlAQkAkQMCCAUCZWIIcGF5bWVudHMAAQZhbW91bnQEAmVVCQECZU4DBQJnRAUCZ0UJALYCAQAAAwkAAAIFAmVVBQJlVQQCaGEJAQJlVgMAAAAAAAAEAmdsCAUCaGECXzEEAmVNCAUCaGECXzIEAmdtCQECZVoCBQJlVQUCZU0DCQAAAgUCZ20FAmdtCQDOCAIFAmNVBQJnbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJlYgEDZ2V0AAQCZVUJAQJlTgMJALYCAQAACQC2AgEAAAkAtgIBAAADCQAAAgUCZVUFAmVVBAJkcQkBAmZsAQUCZWIEAmhiCAUCZHECXzEEAmNUCAUCZHECXzIEAmRlCAUCZHECXzMEAmN5CAUCZHECXzQEAmNVCAUCZHECXzUEAmVDCQD8BwQFAmFPAgRidXJuCQDMCAIFAmRlBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFAmN5BQJkZQUDbmlsAwkAAAIFAmVDBQJlQwQCaGMJAQJlVgMJAQEtAQUCaGIJAQEtAQUCY1QAAAQCZ2wIBQJoYwJfMQQCZU0IBQJoYwJfMgQCZ20JAQJlWgIFAmVVBQJlTQMJAAACBQJnbQUCZ20JAM4IAgUCY1UFAmdsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmViAQtnZXRPbmVUa25WMgICZk8CZlAEAmdRCgACYVEJAPwHBAUCYU8CKGlzUG9vbE9uZVRva2VuT3BlcmF0aW9uc0Rpc2FibGVkUkVBRE9OTFkJAMwIAgkApQgBBQR0aGlzBQNuaWwFA25pbAMJAAECBQJhUQIHQm9vbGVhbgUCYVEJAAIBCQCsAgIJAAMBBQJhUQIcIGNvdWxkbid0IGJlIGNhc3QgdG8gQm9vbGVhbgQCaGQDAwkBAmFUAAYJAAACBQJiaQUBcwYFAmdRBAJnUwkAzAgCAwMJAQEhAQUCaGQGCQECZ3IBBQJlYgYJAQJhTAECIWdldCBvcGVyYXRpb24gaXMgYmxvY2tlZCBieSBhZG1pbgkAzAgCAwkAAAIJAJADAQgFAmViCHBheW1lbnRzAAEGCQECYUwBAh5leGFjdGx5IDEgcGF5bWVudCBhcmUgZXhwZWN0ZWQFA25pbAMJAAACBQJnUwUCZ1MEAmhlCQECZk4GBQJmTwUCZlAIBQJlYghwYXltZW50cwgFAmViBmNhbGxlcggFAmViDG9yaWdpbkNhbGxlcggFAmViDXRyYW5zYWN0aW9uSWQEAmNVCAUCaGUCXzEEAmZZCAUCaGUCXzIJAJQKAgUCY1UFAmZZCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmViAQpyZWZyZXNoRExwAAQCaGYJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUCYXAAAAQCaGcDCQBnAgkAZQIFBmhlaWdodAUCaGYFAmFzBQR1bml0CQECYUwBCQC5CQIJAMwIAgkApAMBBQJhcwkAzAgCAi8gYmxvY2tzIGhhdmUgbm90IHBhc3NlZCBzaW5jZSB0aGUgcHJldmlvdXMgY2FsbAUDbmlsAgADCQAAAgUCaGcFAmhnBAJmZwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCoAwEJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwUCYW8CATAJAQJhTgECC2ludmFsaWQgZExwBAJoaAkBAmVWAwAAAAAAAAQCaGkIBQJoaAJfMQQCZU0IBQJoaAJfMgQCZVkDCQECIT0CBQJmZwUCZU0FAmhpCQECYUwBAhJub3RoaW5nIHRvIHJlZnJlc2gJAJQKAgUCZVkJAKYDAQUCZU0JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CZWIBE2dldE9uZVRrblYyUkVBRE9OTFkCAmZPAmhqBAJjQwkA2AQBCQEFdmFsdWUBBQJiawQCY0QJANgEAQkBBXZhbHVlAQUCYmwEAmNCCQDYBAEJAQV2YWx1ZQEFAmJqBAJkTAkAzAgCCQC2AgEJAQJiTAEFAmNDCQDMCAIJALYCAQkBAmJMAQUCY0QFA25pbAQCZUwJALYCAQgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkA7AcBCQDZBAEFAmNCAhBpbnZhbGlkIGxwIGFzc2V0CHF1YW50aXR5BAJiWgkBAmRLAQUCZEwEAmJZCQC4AgIFAmJaCQC8AgMJALYCAQUCaGoFAmJaBQJlTAQCaGsDCQAAAgUCZk8FAmNDAAADCQAAAgUCZk8FAmNEAAEJAAIBAhRpbnZhbGlkIG91dCBhc3NldCBpZAQCaGwJAQJleQMFAmRMBQJoawUCYlkEAmhtCQC4AgIJAJEDAgUCZEwFAmhrBQJobAQCaG4JAJYDAQkAzAgCAAAJAMwIAgkAoAMBCQC4AgIFAmhtBQFmBQNuaWwEAmhvCQECY3QCBQJobgUCYVIEAmZYCAUCaG8CXzEEAmN2CAUCaG8CXzIJAJQKAgUDbmlsCQCUCgIFAmZYBQJjdgJlYgEcZ2V0T25lVGtuVjJXaXRoQm9udXNSRUFET05MWQICZk8CaGoEAmNDCQDYBAEJAQV2YWx1ZQEFAmJrBAJjRAkA2AQBCQEFdmFsdWUBBQJibAQCY0IJANgEAQkBBXZhbHVlAQUCYmoEAmNJCQECYkwBBQJjQwQCY0sJAQJiTAEFAmNEBAJocAoAAmFRCQD8BwQFBHRoaXMCE2dldE9uZVRrblYyUkVBRE9OTFkJAMwIAgUCZk8JAMwIAgUCaGoFA25pbAUDbmlsAwkAAQIFAmFRAgooSW50LCBJbnQpBQJhUQkAAgEJAKwCAgkAAwEFAmFRAh8gY291bGRuJ3QgYmUgY2FzdCB0byAoSW50LCBJbnQpBAJmWAgFAmhwAl8xBAJjdggFAmhwAl8yBAJkcQkBAmN3BAIABQJjQgUCaGoFBHRoaXMEAmNTCAUCZHECXzEEAmNUCAUCZHECXzIEAmhxCQBkAgUCY1MFAmNUBAJmTQMJAAACBQJocQAAAwkAAAIFAmZYAAAAAAkAAgECF2JvbnVzIGNhbGN1bGF0aW9uIGVycm9yCQBrAwkAZQIFAmZYBQJocQUBYQUCaHEJAJQKAgUDbmlsCQCVCgMFAmZYBQJjdgUCZk0CZWIBCWdldE5vTGVzcwICaHICaHMEAmRxCQECZmwBBQJlYgQCY1MIBQJkcQJfMQQCY1QIBQJkcQJfMgQCZGUIBQJkcQJfMwQCY3kIBQJkcQJfNAQCY1UIBQJkcQJfNQMJAGYCBQJocgUCY1MJAAIBCQCsAgIJAKwCAgkArAICAglGYWlsZWQ6ICAJAKQDAQUCY1MCAyA8IAkApAMBBQJocgMJAGYCBQJocwUCY1QJAAIBCQCsAgIJAKwCAgkArAICAghGYWlsZWQ6IAkApAMBBQJjVAIDIDwgCQCkAwEFAmhzBAJlVQkBAmVOAwkAtgIBAAAJALYCAQAACQC2AgEAAAMJAAACBQJlVQUCZVUEAmh0CQD8BwQFAmFPAgRidXJuCQDMCAIFAmRlBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFAmN5BQJkZQUDbmlsAwkAAAIFAmh0BQJodAQCaHUJAQJlVgMJAQEtAQUCY1MJAQEtAQUCY1QAAAQCZ2wIBQJodQJfMQQCZU0IBQJodQJfMgQCZ20JAQJlWgIFAmVVBQJlTQMJAAACBQJnbQUCZ20JAM4IAgUCY1UFAmdsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmViAQ11bnN0YWtlQW5kR2V0AQJjdQQCaHYDCQECIT0CCQCQAwEIBQJlYghwYXltZW50cwAACQACAQINTm8gcG1udHMgZXhwZAYDCQAAAgUCaHYFAmh2BAJodwkBAmJxAAQCZ0cFAmJqBAJoeAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUCaHcFAUMCCldyIHN0IGFkZHIEAmVVCQECZU4DCQC2AgEAAAkAtgIBAAAJALYCAQAAAwkAAAIFAmVVBQJlVQQCaHkJAPwHBAUCaHgCB3Vuc3Rha2UJAMwIAgkA2AQBBQJnRwkAzAgCBQJjdQUDbmlsBQNuaWwDCQAAAgUCaHkFAmh5BAJkcQkBAmN3BAkA2AQBCAUCZWINdHJhbnNhY3Rpb25JZAkA2AQBBQJnRwUCY3UIBQJlYgZjYWxsZXIEAmNTCAUCZHECXzEEAmNUCAUCZHECXzIEAmNHCQENcGFyc2VJbnRWYWx1ZQEIBQJkcQJfOQQCY1UIBQJkcQNfMTAEAmh6AwMJAQJhVAAGCQAAAgUCY0cFAXMJAAIBCQCsAgICCUJsb2NrZWQ6IAkApAMBBQJjRwYDCQAAAgUCaHoFAmh6BAJoQQkA/AcEBQJhTwIEYnVybgkAzAgCBQJjdQUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQJnRwUCY3UFA25pbAMJAAACBQJoQQUCaEEEAmhCCQECZVYDCQEBLQEFAmNTCQEBLQEFAmNUAAAEAmdsCAUCaEICXzEEAmVNCAUCaEICXzIEAmdtCQECZVoCBQJlVQUCZU0DCQAAAgUCZ20FAmdtCQDOCAIFAmNVBQJnbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJlYgETdW5zdGFrZUFuZEdldE5vTGVzcwMCaEMCaEQCaHMEAmhkAwkBAmFUAAYJAAACBQJiaQUBcwQCZ1MJAMwIAgMJAQEhAQUCaGQGCQACAQIhZ2V0IG9wZXJhdGlvbiBpcyBibG9ja2VkIGJ5IGFkbWluCQDMCAIDCQAAAgkAkAMBCAUCZWIIcGF5bWVudHMAAAYJAAIBAhhubyBwYXltZW50cyBhcmUgZXhwZWN0ZWQFA25pbAMJAAACBQJnUwUCZ1MEAmVVCQECZU4DCQC2AgEAAAkAtgIBAAAJALYCAQAAAwkAAAIFAmVVBQJlVQQCaHkJAPwHBAUCYnMCB3Vuc3Rha2UJAMwIAgkA2AQBBQJiagkAzAgCBQJoQwUDbmlsBQNuaWwDCQAAAgUCaHkFAmh5BAJoRQkBAmN3BAkA2AQBCAUCZWINdHJhbnNhY3Rpb25JZAkA2AQBBQJiagUCaEMIBQJlYgZjYWxsZXIEAmNTCAUCaEUCXzEEAmNUCAUCaEUCXzIEAmNVCAUCaEUDXzEwBAJoRgkAzAgCAwkAZwIFAmNTBQJoRAYJAAIBCQC5CQIJAMwIAgIsYW1vdW50IGFzc2V0IGFtb3VudCB0byByZWNlaXZlIGlzIGxlc3MgdGhhbiAJAMwIAgkApAMBBQJoRAUDbmlsAgAJAMwIAgMJAGcCBQJjVAUCaHMGCQACAQkAuQkCCQDMCAICK3ByaWNlIGFzc2V0IGFtb3VudCB0byByZWNlaXZlIGlzIGxlc3MgdGhhbiAJAMwIAgkApAMBBQJocwUDbmlsAgAFA25pbAMJAAACBQJoRgUCaEYEAmh0CQD8BwQFAmFPAgRidXJuCQDMCAIFAmhDBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFAmJqBQJoQwUDbmlsAwkAAAIFAmh0BQJodAQCaEcJAQJlVgMJAQEtAQUCY1MJAQEtAQUCY1QAAAQCZ2wIBQJoRwJfMQQCZU0IBQJoRwJfMgQCZ20JAQJlWgIFAmVVBQJlTQMJAAACBQJnbQUCZ20JAM4IAgUCY1UFAmdsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmViARV1bnN0YWtlQW5kR2V0T25lVGtuVjIDAmhDAmZPAmZQBAJnUQoAAmFRCQD8BwQFAmFPAihpc1Bvb2xPbmVUb2tlbk9wZXJhdGlvbnNEaXNhYmxlZFJFQURPTkxZCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQNuaWwDCQABAgUCYVECB0Jvb2xlYW4FAmFRCQACAQkArAICCQADAQUCYVECHCBjb3VsZG4ndCBiZSBjYXN0IHRvIEJvb2xlYW4EAmhkAwMJAQJhVAAGCQAAAgUCYmkFAXMGBQJnUQQCZ1MJAMwIAgMDCQEBIQEFAmhkBgkBAmdyAQUCZWIGCQECYUwBAiFnZXQgb3BlcmF0aW9uIGlzIGJsb2NrZWQgYnkgYWRtaW4JAMwIAgMJAAACCQCQAwEIBQJlYghwYXltZW50cwAABgkBAmFMAQIYbm8gcGF5bWVudHMgYXJlIGV4cGVjdGVkBQNuaWwDCQAAAgUCZ1MFAmdTBAJodwkBAmJxAAQCZ0cFAmJqBAJoeAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUCaHcFAUMCCldyIHN0IGFkZHIEAmh5CQD8BwQFAmh4Agd1bnN0YWtlCQDMCAIJANgEAQUCZ0cJAMwIAgUCaEMFA25pbAUDbmlsAwkAAAIFAmh5BQJoeQQCaEgJAQJmTgYFAmZPBQJmUAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUCZ0cFAmhDBQNuaWwIBQJlYgZjYWxsZXIIBQJlYgxvcmlnaW5DYWxsZXIIBQJlYg10cmFuc2FjdGlvbklkBAJjVQgFAmhIAl8xBAJmWQgFAmhIAl8yCQCUCgIFAmNVBQJmWQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJlYgEccHV0T25lVGtuVjJXaXRoQm9udXNSRUFET05MWQICaEkCaEoEAmhLCQECZnIFBQJoSQUCaEoCAAIABgQCZkgIBQJoSwJfMQQCY1UIBQJoSwJfMgQCY3YIBQJoSwJfMwQCZk0IBQJoSwJfNAkAlAoCBQNuaWwJAJUKAwUCZkgFAmN2BQJmTQJlYgEhcHV0T25lVGtuVjJXaXRob3V0VGFrZUZlZVJFQURPTkxZAgJoSQJoSgQCaEwJAQJmcgUFAmhJBQJoSgIAAgAHBAJmSAgFAmhMAl8xBAJjVQgFAmhMAl8yBAJjdggFAmhMAl8zBAJmTQgFAmhMAl80CQCUCgIFA25pbAkAlQoDBQJmSAUCY3YFAmZNAmViAQhhY3RpdmF0ZQICaE0CaE4DCQECIT0CCQClCAEIBQJlYgZjYWxsZXIJAKUIAQUCYU8JAAIBAgZkZW5pZWQJAJQKAgkAzAgCCQELU3RyaW5nRW50cnkCCQECYWkABQJoTQkAzAgCCQELU3RyaW5nRW50cnkCCQECYWoABQJoTgUDbmlsAgdzdWNjZXNzAmViAQRzZXRTAgJoTwJoegMJAQIhPQIJAKUIAQgFAmViBmNhbGxlcgkBAmFIAgUEdGhpcwkBAmFsAAUCZ3EJAMwIAgkBC1N0cmluZ0VudHJ5AgUCaE8FAmh6BQNuaWwCZWIBBHNldEkCAmhPAmh6AwkBAiE9AgkApQgBCAUCZWIGY2FsbGVyCQECYUgCBQR0aGlzCQECYWwABQJncQkAzAgCCQEMSW50ZWdlckVudHJ5AgUCaE8FAmh6BQNuaWwCZWIBHGdldFBvb2xDb25maWdXcmFwcGVyUkVBRE9OTFkACQCUCgIFA25pbAkBAmFXAAJlYgEcZ2V0QWNjQmFsYW5jZVdyYXBwZXJSRUFET05MWQECYk0JAJQKAgUDbmlsCQECYkwBBQJiTQJlYgEZY2FsY1ByaWNlc1dyYXBwZXJSRUFET05MWQMCY2YCY2cCY2sEAmhQCQECY2oDBQJjZgUCY2cFAmNrCQCUCgIFA25pbAkAzAgCCQCmAwEJAJEDAgUCaFAAAAkAzAgCCQCmAwEJAJEDAgUCaFAAAQkAzAgCCQCmAwEJAJEDAgUCaFAAAgUDbmlsAmViARZmcm9tWDE4V3JhcHBlclJFQURPTkxZAgFMAmhRCQCUCgIFA25pbAkBAUsCCQCnAwEFAUwFAmhRAmViARR0b1gxOFdyYXBwZXJSRUFET05MWQIBSQFKCQCUCgIFA25pbAkApgMBCQEBSAIFAUkFAUoCZWIBHmNhbGNQcmljZUJpZ0ludFdyYXBwZXJSRUFET05MWQICYk8CYlAJAJQKAgUDbmlsCQCmAwEJAQJiTgIJAKcDAQUCYk8JAKcDAQUCYlACZWIBI2VzdGltYXRlUHV0T3BlcmF0aW9uV3JhcHBlclJFQURPTkxZCQJjeAJiVQJjVwJjWAJjWQJjWgJoUgJkYQJkYgkAlAoCBQNuaWwJAQJjVg0FAmN4BQJiVQUCY1cFAmNYBQJjWQUCY1oFAmhSBQJkYQUCZGIGBwAAAgACZWIBI2VzdGltYXRlR2V0T3BlcmF0aW9uV3JhcHBlclJFQURPTkxZBAJjeAJoUwJjegJoUgQCZHEJAQJjdwQFAmN4BQJoUwUCY3oJARFAZXh0ck5hdGl2ZSgxMDYyKQEFAmhSCQCUCgIFA25pbAkAnAoKCAUCZHECXzEIBQJkcQJfMggFAmRxAl8zCAUCZHECXzQIBQJkcQJfNQgFAmRxAl82CAUCZHECXzcJAKYDAQgFAmRxAl84CAUCZHECXzkIBQJkcQNfMTABAmhUAQJoVQAEAmhWBAJnbwkBAmduAAMJAAECBQJnbwIKQnl0ZVZlY3RvcgQCZ3MFAmdvBQJncwMJAAECBQJnbwIEVW5pdAgFAmhUD3NlbmRlclB1YmxpY0tleQkAAgECC01hdGNoIGVycm9yBAJnbwUCaFQDCQABAgUCZ28CBU9yZGVyBAJmYwUCZ28EAmhXCQECYVUABAJoWAkBAmZiAQUCZmMEAmhZCQD0AwMIBQJmYwlib2R5Qnl0ZXMJAJEDAggFAmZjBnByb29mcwAACAUCZmMPc2VuZGVyUHVibGljS2V5BAJoWgkA9AMDCAUCZmMJYm9keUJ5dGVzCQCRAwIIBQJmYwZwcm9vZnMAAQUCaFcDAwMFAmhYBQJoWQcFAmhaBwYJAQJhRAMFAmhYBQJoWQUCaFoDCQABAgUCZ28CFFNldFNjcmlwdFRyYW5zYWN0aW9uBAJkTwUCZ28DCQD0AwMIBQJoVAlib2R5Qnl0ZXMJAJEDAggFAmhUBnByb29mcwAABQJoVgYEAmlhCQD2AwEJAQV2YWx1ZQEIBQJkTwZzY3JpcHQEAmliCQDbBAEJAQV2YWx1ZQEJAJ0IAgUCYU8JAQJhQgAEAmljCQDxBwEFBHRoaXMDCQAAAgUCaWIFAmlhCQECIT0CBQJpYwUCaWEHCQD0AwMIBQJoVAlib2R5Qnl0ZXMJAJEDAggFAmhUBnByb29mcwAABQJoVsBgp8s=", "chainId": 84, "height": 2411690, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: BLr6KWC37tFJvyDYyrG5feHE1ZuPkYQE6qsVmFvbHA5q Next: GrB9HF4txtnu48nFnuU4TLCy7xeHrCwsGSmznH85Rc3i Diff:
OldNewDifferences
13741374 let lpAssetId = cfgLpAssetId
13751375 let staking = valueOrErrorMessage(addressFromString(factoryCfg[idxFactStakCntr]), "Wr st addr")
13761376 let currentDLp = calcCurrentDLp(toBigInt(0), toBigInt(0), toBigInt(0))
1377- let unstakeInv = invoke(staking, "unstake", [toBase58String(lpAssetId), amount], nil)
1378- if ((unstakeInv == unstakeInv))
1377+ if ((currentDLp == currentDLp))
13791378 then {
1380- let r = ego(toBase58String(i.transactionId), toBase58String(lpAssetId), amount, i.caller)
1381- let outAmAmt = r._1
1382- let outPrAmt = r._2
1383- let sts = parseIntValue(r._9)
1384- let state = r._10
1385- let v = if (if (igs())
1386- then true
1387- else (sts == PoolShutdown))
1388- then throw(("Blocked: " + toString(sts)))
1389- else true
1390- if ((v == v))
1379+ let unstakeInv = invoke(staking, "unstake", [toBase58String(lpAssetId), amount], nil)
1380+ if ((unstakeInv == unstakeInv))
13911381 then {
1392- let burnA = invoke(fca, "burn", [amount], [AttachedPayment(lpAssetId, amount)])
1393- if ((burnA == burnA))
1382+ let r = ego(toBase58String(i.transactionId), toBase58String(lpAssetId), amount, i.caller)
1383+ let outAmAmt = r._1
1384+ let outPrAmt = r._2
1385+ let sts = parseIntValue(r._9)
1386+ let state = r._10
1387+ let v = if (if (igs())
1388+ then true
1389+ else (sts == PoolShutdown))
1390+ then throw(("Blocked: " + toString(sts)))
1391+ else true
1392+ if ((v == v))
13941393 then {
1395- let $t04748847569 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1396- let refreshDLpActions = $t04748847569._1
1397- let updatedDLp = $t04748847569._2
1398- let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
1399- if ((isUpdatedDLpValid == isUpdatedDLpValid))
1400- then (state ++ refreshDLpActions)
1394+ let burnA = invoke(fca, "burn", [amount], [AttachedPayment(lpAssetId, amount)])
1395+ if ((burnA == burnA))
1396+ then {
1397+ let $t04749147572 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1398+ let refreshDLpActions = $t04749147572._1
1399+ let updatedDLp = $t04749147572._2
1400+ let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
1401+ if ((isUpdatedDLpValid == isUpdatedDLpValid))
1402+ then (state ++ refreshDLpActions)
1403+ else throw("Strict value is not equal to itself.")
1404+ }
14011405 else throw("Strict value is not equal to itself.")
14021406 }
14031407 else throw("Strict value is not equal to itself.")
14241428 if ((checks == checks))
14251429 then {
14261430 let currentDLp = calcCurrentDLp(toBigInt(0), toBigInt(0), toBigInt(0))
1427- let unstakeInv = invoke(stakingContract, "unstake", [toBase58String(cfgLpAssetId), unstakeAmount], nil)
1428- if ((unstakeInv == unstakeInv))
1431+ if ((currentDLp == currentDLp))
14291432 then {
1430- let res = ego(toBase58String(i.transactionId), toBase58String(cfgLpAssetId), unstakeAmount, i.caller)
1431- let outAmAmt = res._1
1432- let outPrAmt = res._2
1433- let state = res._10
1434- let checkAmounts = [if ((outAmAmt >= noLessThenAmountAsset))
1435- then true
1436- else throw(makeString(["amount asset amount to receive is less than ", toString(noLessThenAmountAsset)], "")), if ((outPrAmt >= noLessThenPriceAsset))
1437- then true
1438- else throw(makeString(["price asset amount to receive is less than ", toString(noLessThenPriceAsset)], ""))]
1439- if ((checkAmounts == checkAmounts))
1433+ let unstakeInv = invoke(stakingContract, "unstake", [toBase58String(cfgLpAssetId), unstakeAmount], nil)
1434+ if ((unstakeInv == unstakeInv))
14401435 then {
1441- let burnLPAssetOnFactory = invoke(fca, "burn", [unstakeAmount], [AttachedPayment(cfgLpAssetId, unstakeAmount)])
1442- if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
1436+ let res = ego(toBase58String(i.transactionId), toBase58String(cfgLpAssetId), unstakeAmount, i.caller)
1437+ let outAmAmt = res._1
1438+ let outPrAmt = res._2
1439+ let state = res._10
1440+ let checkAmounts = [if ((outAmAmt >= noLessThenAmountAsset))
1441+ then true
1442+ else throw(makeString(["amount asset amount to receive is less than ", toString(noLessThenAmountAsset)], "")), if ((outPrAmt >= noLessThenPriceAsset))
1443+ then true
1444+ else throw(makeString(["price asset amount to receive is less than ", toString(noLessThenPriceAsset)], ""))]
1445+ if ((checkAmounts == checkAmounts))
14431446 then {
1444- let $t04881748898 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1445- let refreshDLpActions = $t04881748898._1
1446- let updatedDLp = $t04881748898._2
1447- let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
1448- if ((isUpdatedDLpValid == isUpdatedDLpValid))
1449- then (state ++ refreshDLpActions)
1447+ let burnLPAssetOnFactory = invoke(fca, "burn", [unstakeAmount], [AttachedPayment(cfgLpAssetId, unstakeAmount)])
1448+ if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
1449+ then {
1450+ let $t04882348904 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1451+ let refreshDLpActions = $t04882348904._1
1452+ let updatedDLp = $t04882348904._2
1453+ let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
1454+ if ((isUpdatedDLpValid == isUpdatedDLpValid))
1455+ then (state ++ refreshDLpActions)
1456+ else throw("Strict value is not equal to itself.")
1457+ }
14501458 else throw("Strict value is not equal to itself.")
14511459 }
14521460 else throw("Strict value is not equal to itself.")
14881496 let unstakeInv = invoke(staking, "unstake", [toBase58String(lpAssetId), unstakeAmount], nil)
14891497 if ((unstakeInv == unstakeInv))
14901498 then {
1491- let $t04979349981 = getOneTknV2Internal(outAssetId, minOutAmount, [AttachedPayment(lpAssetId, unstakeAmount)], i.caller, i.originCaller, i.transactionId)
1492- let state = $t04979349981._1
1493- let totalAmount = $t04979349981._2
1499+ let $t04979949987 = getOneTknV2Internal(outAssetId, minOutAmount, [AttachedPayment(lpAssetId, unstakeAmount)], i.caller, i.originCaller, i.transactionId)
1500+ let state = $t04979949987._1
1501+ let totalAmount = $t04979949987._2
14941502 $Tuple2(state, totalAmount)
14951503 }
14961504 else throw("Strict value is not equal to itself.")
15021510
15031511 @Callable(i)
15041512 func putOneTknV2WithBonusREADONLY (paymentAmountRaw,paymentAssetId) = {
1505- let $t05010950212 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "", true)
1506- let lpAmount = $t05010950212._1
1507- let state = $t05010950212._2
1508- let feeAmount = $t05010950212._3
1509- let bonus = $t05010950212._4
1513+ let $t05011550218 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "", true)
1514+ let lpAmount = $t05011550218._1
1515+ let state = $t05011550218._2
1516+ let feeAmount = $t05011550218._3
1517+ let bonus = $t05011550218._4
15101518 $Tuple2(nil, $Tuple3(lpAmount, feeAmount, bonus))
15111519 }
15121520
15141522
15151523 @Callable(i)
15161524 func putOneTknV2WithoutTakeFeeREADONLY (paymentAmountRaw,paymentAssetId) = {
1517- let $t05036050464 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "", false)
1518- let lpAmount = $t05036050464._1
1519- let state = $t05036050464._2
1520- let feeAmount = $t05036050464._3
1521- let bonus = $t05036050464._4
1525+ let $t05036650470 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "", false)
1526+ let lpAmount = $t05036650470._1
1527+ let state = $t05036650470._2
1528+ let feeAmount = $t05036650470._3
1529+ let bonus = $t05036650470._4
15221530 $Tuple2(nil, $Tuple3(lpAmount, feeAmount, bonus))
15231531 }
15241532
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let scale8 = 100000000
55
66 let scale8BigInt = toBigInt(100000000)
77
88 let scale18 = toBigInt(1000000000000000000)
99
1010 let zeroBigInt = toBigInt(0)
1111
1212 let big0 = toBigInt(0)
1313
1414 let big1 = toBigInt(1)
1515
1616 let big2 = toBigInt(2)
1717
1818 let big3 = toBigInt(3)
1919
2020 let big4 = toBigInt(4)
2121
2222 let slippage4D = toBigInt((scale8 - ((scale8 * 1) / scale8)))
2323
2424 let wavesString = "WAVES"
2525
2626 let Amult = "100"
2727
2828 let Dconv = "1"
2929
3030 let SEP = "__"
3131
3232 let EMPTY = ""
3333
3434 let PoolActive = 1
3535
3636 let PoolPutDis = 2
3737
3838 let PoolMatcherDis = 3
3939
4040 let PoolShutdown = 4
4141
4242 let idxPoolAddress = 1
4343
4444 let idxPoolSt = 2
4545
4646 let idxLPAsId = 3
4747
4848 let idxAmAsId = 4
4949
5050 let idxPrAsId = 5
5151
5252 let idxAmtAsDcm = 6
5353
5454 let idxPriceAsDcm = 7
5555
5656 let idxIAmtAsId = 8
5757
5858 let idxIPriceAsId = 9
5959
6060 let idxFactStakCntr = 1
6161
6262 let idxFactoryRestCntr = 6
6363
6464 let idxFactSlippCntr = 7
6565
6666 let idxFactGwxRewCntr = 10
6767
6868 let feeDefault = fraction(10, scale8, 10000)
6969
7070 func t1 (origVal,origScaleMult) = fraction(toBigInt(origVal), scale18, toBigInt(origScaleMult))
7171
7272
7373 func f1 (val,resultScaleMult) = toInt(fraction(val, toBigInt(resultScaleMult), scale18))
7474
7575
7676 func fromX18Round (val,resultScaleMult,round) = toInt(fraction(val, toBigInt(resultScaleMult), scale18, round))
7777
7878
7979 func t2 (origVal,origScaleMult) = fraction(origVal, scale18, toBigInt(origScaleMult))
8080
8181
8282 func f2 (val,resultScaleMult) = fraction(val, toBigInt(resultScaleMult), scale18)
8383
8484
8585 func ts (amt,resScale,curScale) = fraction(amt, resScale, curScale)
8686
8787
8888 func abs (val) = if ((zeroBigInt > val))
8989 then -(val)
9090 else val
9191
9292
9393 func absBigInt (val) = if ((zeroBigInt > val))
9494 then -(val)
9595 else val
9696
9797
9898 func fc () = "%s__factoryContract"
9999
100100
101101 func mpk () = "%s__managerPublicKey"
102102
103103
104104 func pmpk () = "%s__pendingManagerPublicKey"
105105
106106
107107 func pl () = "%s%s__price__last"
108108
109109
110110 func ph (h,t) = makeString(["%s%s%d%d__price__history", toString(h), toString(t)], SEP)
111111
112112
113113 func pau (ua,txId) = ((("%s%s%s__P__" + ua) + "__") + txId)
114114
115115
116116 func gau (ua,txId) = ((("%s%s%s__G__" + ua) + "__") + txId)
117117
118118
119119 func aa () = "%s__amountAsset"
120120
121121
122122 func pa () = "%s__priceAsset"
123123
124124
125125 func amp () = "%s__amp"
126126
127127
128128 func ada () = "%s__addonAddr"
129129
130130
131131 let keyFee = "%s__fee"
132132
133133 let fee = valueOrElse(getInteger(this, keyFee), feeDefault)
134134
135135 let keyDLp = makeString(["%s", "dLp"], SEP)
136136
137137 let keyDLpRefreshedHeight = makeString(["%s", "dLpRefreshedHeight"], SEP)
138138
139139 let keyDLpRefreshDelay = makeString(["%s", "refreshDLpDelay"], SEP)
140140
141141 let dLpRefreshDelayDefault = 1
142142
143143 let dLpRefreshDelay = valueOrElse(getInteger(this, keyDLpRefreshDelay), dLpRefreshDelayDefault)
144144
145145 func fcfg () = "%s__factoryConfig"
146146
147147
148148 func mtpk () = "%s%s__matcher__publicKey"
149149
150150
151151 func pc (iAmtAs,iPrAs) = (((("%d%d%s__" + iAmtAs) + "__") + iPrAs) + "__config")
152152
153153
154154 func mba (bAStr) = ("%s%s%s__mappings__baseAsset2internalId__" + bAStr)
155155
156156
157157 func aps () = "%s__shutdown"
158158
159159
160160 func keyAllowedLpStableScriptHash () = "%s__allowedLpStableScriptHash"
161161
162162
163163 func keyFeeCollectorAddress () = "%s__feeCollectorAddress"
164164
165165
166166 func toe (orV,sendrV,matchV) = throw(((((("Failed: ordValid=" + toString(orV)) + " sndrValid=") + toString(sendrV)) + " mtchrValid=") + toString(matchV)))
167167
168168
169169 func strf (addr,key) = valueOrErrorMessage(getString(addr, key), makeString(["mandatory ", toString(addr), ".", key, " not defined"], ""))
170170
171171
172172 func intf (addr,key) = valueOrErrorMessage(getInteger(addr, key), makeString(["mandatory ", toString(addr), ".", key, " not defined"], ""))
173173
174174
175175 func throwErr (msg) = throw(makeString(["lp_stable.ride:", msg], " "))
176176
177177
178178 func fmtErr (msg) = makeString(["lp_stable.ride:", msg], " ")
179179
180180
181181 let fca = addressFromStringValue(strf(this, fc()))
182182
183183 let inFee = {
184184 let @ = invoke(fca, "getInFeeREADONLY", [toString(this)], nil)
185185 if ($isInstanceOf(@, "Int"))
186186 then @
187187 else throw(($getType(@) + " couldn't be cast to Int"))
188188 }
189189
190190 let outFee = {
191191 let @ = invoke(fca, "getOutFeeREADONLY", [toString(this)], nil)
192192 if ($isInstanceOf(@, "Int"))
193193 then @
194194 else throw(($getType(@) + " couldn't be cast to Int"))
195195 }
196196
197197 let A = strf(this, amp())
198198
199199 func igs () = valueOrElse(getBoolean(fca, aps()), false)
200200
201201
202202 func mp () = fromBase58String(strf(fca, mtpk()))
203203
204204
205205 let feeCollectorAddress = addressFromStringValue(strf(fca, keyFeeCollectorAddress()))
206206
207207 func gpc () = {
208208 let amtAs = strf(this, aa())
209209 let priceAs = strf(this, pa())
210210 let iPriceAs = intf(fca, mba(priceAs))
211211 let iAmtAs = intf(fca, mba(amtAs))
212212 split(strf(fca, pc(toString(iAmtAs), toString(iPriceAs))), SEP)
213213 }
214214
215215
216216 func parseAssetId (input) = if ((input == wavesString))
217217 then unit
218218 else fromBase58String(input)
219219
220220
221221 func assetIdToString (input) = if ((input == unit))
222222 then wavesString
223223 else toBase58String(value(input))
224224
225225
226226 func parsePoolConfig (poolConfig) = $Tuple9(addressFromStringValue(poolConfig[idxPoolAddress]), parseIntValue(poolConfig[idxPoolSt]), fromBase58String(poolConfig[idxLPAsId]), parseAssetId(poolConfig[idxAmAsId]), parseAssetId(poolConfig[idxPrAsId]), parseIntValue(poolConfig[idxAmtAsDcm]), parseIntValue(poolConfig[idxPriceAsDcm]), fromBase58String(poolConfig[idxIAmtAsId]), fromBase58String(poolConfig[idxIPriceAsId]))
227227
228228
229229 let poolConfigParsed = parsePoolConfig(gpc())
230230
231231 let $t077427971 = poolConfigParsed
232232
233233 let cfgPoolAddress = $t077427971._1
234234
235235 let cfgPoolStatus = $t077427971._2
236236
237237 let cfgLpAssetId = $t077427971._3
238238
239239 let cfgAmountAssetId = $t077427971._4
240240
241241 let cfgPriceAssetId = $t077427971._5
242242
243243 let cfgAmountAssetDecimals = $t077427971._6
244244
245245 let cfgPriceAssetDecimals = $t077427971._7
246246
247247 let cfgInAmountAssedId = $t077427971._8
248248
249249 let cfgInPriceAssetId = $t077427971._9
250250
251251 func gfc () = split(strf(fca, fcfg()), SEP)
252252
253253
254254 let factoryConfig = gfc()
255255
256256 let stakingContract = valueOrErrorMessage(addressFromString(factoryConfig[idxFactStakCntr]), "Invalid staking contract address")
257257
258258 let slipageContract = valueOrErrorMessage(addressFromString(factoryConfig[idxFactSlippCntr]), "Invalid slipage contract address")
259259
260260 let gwxContract = valueOrErrorMessage(addressFromString(factoryConfig[idxFactGwxRewCntr]), "Invalid gwx contract address")
261261
262262 let restContract = valueOrErrorMessage(addressFromString(factoryConfig[idxFactoryRestCntr]), "Invalid gwx contract address")
263263
264264 func dataPutActionInfo (inAmtAssetAmt,inPriceAssetAmt,outLpAmt,price,slipByUser,slippageReal,txHeight,txTimestamp,slipageAmAmt,slipagePrAmt) = makeString(["%d%d%d%d%d%d%d%d%d%d", toString(inAmtAssetAmt), toString(inPriceAssetAmt), toString(outLpAmt), toString(price), toString(slipByUser), toString(slippageReal), toString(txHeight), toString(txTimestamp), toString(slipageAmAmt), toString(slipagePrAmt)], SEP)
265265
266266
267267 func dataGetActionInfo (outAmtAssetAmt,outPriceAssetAmt,inLpAmt,price,txHeight,txTimestamp) = makeString(["%d%d%d%d%d%d", toString(outAmtAssetAmt), toString(outPriceAssetAmt), toString(inLpAmt), toString(price), toString(txHeight), toString(txTimestamp)], SEP)
268268
269269
270270 func getAccBalance (assetId) = if ((assetId == "WAVES"))
271271 then wavesBalance(this).available
272272 else assetBalance(this, fromBase58String(assetId))
273273
274274
275275 func cpbi (prAmtX18,amAmtX18) = fraction(prAmtX18, scale18, amAmtX18)
276276
277277
278278 func cpbir (prAmtX18,amAmtX18,round) = fraction(prAmtX18, scale18, amAmtX18, round)
279279
280280
281281 func vad (A1,A2,slippage) = {
282282 let diff = fraction((A1 - A2), scale8BigInt, A2)
283283 let pass = ((slippage - abs(diff)) > zeroBigInt)
284284 if (!(pass))
285285 then throw(("Big slpg: " + toString(diff)))
286286 else $Tuple2(pass, min([A1, A2]))
287287 }
288288
289289
290290 func vd (D1,D0,slpg) = {
291291 let diff = fraction(D0, scale8BigInt, D1)
292292 let fail = (slpg > diff)
293293 if (if (fail)
294294 then true
295295 else (D0 > D1))
296296 then throw(((((((toString(D0) + " ") + toString(D1)) + " ") + toString(diff)) + " ") + toString(slpg)))
297297 else fail
298298 }
299299
300300
301301 func pcp (amAssetDcm,prAssetDcm,amAmt,prAmt) = {
302302 let amtAsAmtX18 = t1(amAmt, amAssetDcm)
303303 let prAsAmtX18 = t1(prAmt, prAssetDcm)
304304 cpbi(prAsAmtX18, amtAsAmtX18)
305305 }
306306
307307
308308 func calcPrices (amAmt,prAmt,lpAmt) = {
309309 let amtAsDcm = cfgAmountAssetDecimals
310310 let prAsDcm = cfgPriceAssetDecimals
311311 let priceX18 = pcp(amtAsDcm, prAsDcm, amAmt, prAmt)
312312 let amAmtX18 = t1(amAmt, amtAsDcm)
313313 let prAmtX18 = t1(prAmt, prAsDcm)
314314 let lpAmtX18 = t1(lpAmt, scale8)
315315 let lpPrInAmAsX18 = cpbi(amAmtX18, lpAmtX18)
316316 let lpPrInPrAsX18 = cpbi(prAmtX18, lpAmtX18)
317317 [priceX18, lpPrInAmAsX18, lpPrInPrAsX18]
318318 }
319319
320320
321321 func calculatePrices (amAmt,prAmt,lpAmt) = {
322322 let p = calcPrices(amAmt, prAmt, lpAmt)
323323 [f1(p[0], scale8), f1(p[1], scale8), f1(p[2], scale8)]
324324 }
325325
326326
327327 func takeFee (amount,fee) = {
328328 let feeAmount = if ((fee == 0))
329329 then 0
330330 else fraction(amount, fee, scale8)
331331 $Tuple2((amount - feeAmount), feeAmount)
332332 }
333333
334334
335335 func ego (txId58,pmtAssetId,pmtLpAmt,userAddress) = {
336336 let lpId = cfgLpAssetId
337337 let amId = toBase58String(value(cfgAmountAssetId))
338338 let prId = toBase58String(value(cfgPriceAssetId))
339339 let amDcm = cfgAmountAssetDecimals
340340 let prDcm = cfgPriceAssetDecimals
341341 let sts = toString(cfgPoolStatus)
342342 let lpEmiss = valueOrErrorMessage(assetInfo(lpId), "Wrong LP id").quantity
343343 if ((toBase58String(lpId) != pmtAssetId))
344344 then throw("Wrong pmt asset")
345345 else {
346346 let amBalance = getAccBalance(amId)
347347 let amBalanceX18 = t1(amBalance, amDcm)
348348 let prBalance = getAccBalance(prId)
349349 let prBalanceX18 = t1(prBalance, prDcm)
350350 let curPriceX18 = cpbi(prBalanceX18, amBalanceX18)
351351 let curPrice = f1(curPriceX18, scale8)
352352 let pmtLpAmtX18 = t1(pmtLpAmt, scale8)
353353 let lpEmissX18 = t1(lpEmiss, scale8)
354354 let outAmAmtX18 = fraction(amBalanceX18, pmtLpAmtX18, lpEmissX18)
355355 let outPrAmtX18 = fraction(prBalanceX18, pmtLpAmtX18, lpEmissX18)
356356 let outAmAmt = fromX18Round(outAmAmtX18, amDcm, FLOOR)
357357 let outPrAmt = fromX18Round(outPrAmtX18, prDcm, FLOOR)
358358 let state = if ((txId58 == ""))
359359 then nil
360360 else [ScriptTransfer(userAddress, outAmAmt, if ((amId == "WAVES"))
361361 then unit
362362 else fromBase58String(amId)), ScriptTransfer(userAddress, outPrAmt, if ((prId == "WAVES"))
363363 then unit
364364 else fromBase58String(prId)), StringEntry(gau(toString(userAddress), txId58), dataGetActionInfo(outAmAmt, outPrAmt, pmtLpAmt, curPrice, height, lastBlock.timestamp)), IntegerEntry(pl(), curPrice), IntegerEntry(ph(height, lastBlock.timestamp), curPrice)]
365365 $Tuple10(outAmAmt, outPrAmt, amId, prId, amBalance, prBalance, lpEmiss, curPriceX18, sts, state)
366366 }
367367 }
368368
369369
370370 func epo (txId58,slippage,inAmAmt,inAmId,inPrAmt,inPrId,userAddress,isEval,emitLp,isOneAsset,validateSlippage,pmtAmt,pmtId) = {
371371 let lpId = cfgLpAssetId
372372 let amIdStr = toBase58String(value(cfgAmountAssetId))
373373 let prIdStr = toBase58String(value(cfgPriceAssetId))
374374 let inAmIdStr = cfgInAmountAssedId
375375 let inPrIdStr = cfgInPriceAssetId
376376 let amtDcm = cfgAmountAssetDecimals
377377 let priceDcm = cfgPriceAssetDecimals
378378 let sts = toString(cfgPoolStatus)
379379 let lpEm = valueOrErrorMessage(assetInfo(lpId), "Wr lp as").quantity
380380 let amBalance = if (isEval)
381381 then getAccBalance(amIdStr)
382382 else if (if (isOneAsset)
383383 then (pmtId == amIdStr)
384384 else false)
385385 then (getAccBalance(amIdStr) - pmtAmt)
386386 else if (isOneAsset)
387387 then getAccBalance(amIdStr)
388388 else (getAccBalance(amIdStr) - inAmAmt)
389389 let prBalance = if (isEval)
390390 then getAccBalance(prIdStr)
391391 else if (if (isOneAsset)
392392 then (pmtId == prIdStr)
393393 else false)
394394 then (getAccBalance(prIdStr) - pmtAmt)
395395 else if (isOneAsset)
396396 then getAccBalance(prIdStr)
397397 else (getAccBalance(prIdStr) - inPrAmt)
398398 let inAmAssetAmtX18 = t1(inAmAmt, amtDcm)
399399 let inPrAssetAmtX18 = t1(inPrAmt, priceDcm)
400400 let userPriceX18 = cpbi(inPrAssetAmtX18, inAmAssetAmtX18)
401401 let amBalanceX18 = t1(amBalance, amtDcm)
402402 let prBalanceX18 = t1(prBalance, priceDcm)
403403 let r = if ((lpEm == 0))
404404 then {
405405 let curPriceX18 = zeroBigInt
406406 let slippageX18 = zeroBigInt
407407 let lpAmtX18 = pow((inAmAssetAmtX18 * inPrAssetAmtX18), 0, toBigInt(5), 1, 0, DOWN)
408408 $Tuple5(f1(lpAmtX18, scale8), f1(inAmAssetAmtX18, amtDcm), f1(inPrAssetAmtX18, priceDcm), cpbi((prBalanceX18 + inPrAssetAmtX18), (amBalanceX18 + inAmAssetAmtX18)), slippageX18)
409409 }
410410 else {
411411 let curPriceX18 = cpbi(prBalanceX18, amBalanceX18)
412412 let slippageRealX18 = fraction(abs((curPriceX18 - userPriceX18)), scale18, curPriceX18)
413413 let slippageX18 = t1(slippage, scale8)
414414 if (if (if (validateSlippage)
415415 then (curPriceX18 != zeroBigInt)
416416 else false)
417417 then (slippageRealX18 > slippageX18)
418418 else false)
419419 then throw(((("Price slippage " + toString(slippageRealX18)) + " > ") + toString(slippageX18)))
420420 else {
421421 let lpEmissionX18 = t1(lpEm, scale8)
422422 let prViaAmX18 = fraction(inAmAssetAmtX18, cpbir(prBalanceX18, amBalanceX18, CEILING), scale18, CEILING)
423423 let amViaPrX18 = fraction(inPrAssetAmtX18, scale18, cpbir(prBalanceX18, amBalanceX18, FLOOR), CEILING)
424424 let expectedAmts = if ((prViaAmX18 > inPrAssetAmtX18))
425425 then $Tuple2(amViaPrX18, inPrAssetAmtX18)
426426 else $Tuple2(inAmAssetAmtX18, prViaAmX18)
427427 let expAmtAssetAmtX18 = expectedAmts._1
428428 let expPriceAssetAmtX18 = expectedAmts._2
429429 let lpAmtX18 = fraction(lpEmissionX18, expPriceAssetAmtX18, prBalanceX18, FLOOR)
430430 $Tuple5(fromX18Round(lpAmtX18, scale8, FLOOR), fromX18Round(expAmtAssetAmtX18, amtDcm, CEILING), fromX18Round(expPriceAssetAmtX18, priceDcm, CEILING), curPriceX18, slippageX18)
431431 }
432432 }
433433 let calcLpAmt = r._1
434434 let calcAmAssetPmt = r._2
435435 let calcPrAssetPmt = r._3
436436 let curPrice = f1(r._4, scale8)
437437 let slippageCalc = f1(r._5, scale8)
438438 if ((0 >= calcLpAmt))
439439 then throw("LP <= 0")
440440 else {
441441 let emitLpAmt = if (!(emitLp))
442442 then 0
443443 else calcLpAmt
444444 let amDiff = (inAmAmt - calcAmAssetPmt)
445445 let prDiff = (inPrAmt - calcPrAssetPmt)
446446 let $t01862118966 = if (if (isOneAsset)
447447 then (pmtId == amIdStr)
448448 else false)
449449 then $Tuple2(pmtAmt, 0)
450450 else if (if (isOneAsset)
451451 then (pmtId == prIdStr)
452452 else false)
453453 then $Tuple2(0, pmtAmt)
454454 else $Tuple2(calcAmAssetPmt, calcPrAssetPmt)
455455 let writeAmAmt = $t01862118966._1
456456 let writePrAmt = $t01862118966._2
457457 let commonState = [IntegerEntry(pl(), curPrice), IntegerEntry(ph(height, lastBlock.timestamp), curPrice), StringEntry(pau(userAddress, txId58), dataPutActionInfo(writeAmAmt, writePrAmt, emitLpAmt, curPrice, slippage, slippageCalc, height, lastBlock.timestamp, amDiff, prDiff))]
458458 $Tuple13(calcLpAmt, emitLpAmt, curPrice, amBalance, prBalance, lpEm, lpId, sts, commonState, amDiff, prDiff, inAmId, inPrId)
459459 }
460460 }
461461
462462
463463 func getD (xp) = {
464464 let xp0 = xp[0]
465465 let xp1 = xp[1]
466466 let s = (xp0 + xp1)
467467 if ((s == big0))
468468 then big0
469469 else {
470470 let a = parseIntValue(A)
471471 let ann = (a * 2)
472472 let p = fraction(xp0, xp1, big1)
473473 let xp0_xp1_n_n = fraction(p, big4, big1)
474474 let ann_s = fraction(toBigInt(ann), s, big1)
475475 let ann_1 = toBigInt((ann - 1))
476476 func calcDNext (d) = {
477477 let dd = fraction(d, d, big1)
478478 let ddd = fraction(dd, d, big1)
479479 let dp = fraction(ddd, big1, xp0_xp1_n_n)
480480 fraction((ann_s + fraction(dp, big2, big1)), d, (fraction(ann_1, d, big1) + fraction(big3, dp, big1)), CEILING)
481481 }
482482
483483 func calc (acc,i) = if (acc._2)
484484 then acc
485485 else {
486486 let d = acc._1
487487 let dNext = calcDNext(d)
488488 let dDiffRaw = (dNext - value(d))
489489 let dDiff = if ((big0 > dDiffRaw))
490490 then -(dDiffRaw)
491491 else dDiffRaw
492492 if ((big1 >= dDiff))
493493 then $Tuple2(dNext, true)
494494 else $Tuple2(dNext, false)
495495 }
496496
497497 let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
498498 let $t02089020938 = {
499499 let $l = arr
500500 let $s = size($l)
501501 let $acc0 = $Tuple2(s, false)
502502 func $f0_1 ($a,$i) = if (($i >= $s))
503503 then $a
504504 else calc($a, $l[$i])
505505
506506 func $f0_2 ($a,$i) = if (($i >= $s))
507507 then $a
508508 else throw("List size exceeds 15")
509509
510510 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
511511 }
512512 let d = $t02089020938._1
513513 let found = $t02089020938._2
514514 if (found)
515515 then d
516516 else throw(("D calculation error, D = " + toString(d)))
517517 }
518518 }
519519
520520
521521 func getDOld (xp) = {
522522 let n = big2
523523 let xp0 = xp[0]
524524 let xp1 = xp[1]
525525 let aPrecision = parseBigIntValue(Amult)
526526 let a = (parseBigIntValue(A) * aPrecision)
527527 let s = (xp0 + xp1)
528528 if ((s == big0))
529529 then big0
530530 else {
531531 let ann = (a * n)
532532 let xp0_xp1_n_n = (((xp0 * xp1) * n) * n)
533533 let ann_s_aPrecision = ((ann * s) / aPrecision)
534534 let ann_aPrecision = (ann - aPrecision)
535535 let n1 = (n + big1)
536536 func calc (acc,cur) = {
537537 let $t02156721587 = acc
538538 let d = $t02156721587._1
539539 let found = $t02156721587._2
540540 if ((found != unit))
541541 then acc
542542 else {
543543 let dp = (((d * d) * d) / xp0_xp1_n_n)
544544 let dNext = (((ann_s_aPrecision + (dp * n)) * d) / (((ann_aPrecision * d) / aPrecision) + (n1 * dp)))
545545 let dDiff = absBigInt((dNext - value(d)))
546546 if ((big1 >= dDiff))
547547 then $Tuple2(dNext, cur)
548548 else $Tuple2(dNext, unit)
549549 }
550550 }
551551
552552 let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
553553 let $t02200822055 = {
554554 let $l = arr
555555 let $s = size($l)
556556 let $acc0 = $Tuple2(s, unit)
557557 func $f0_1 ($a,$i) = if (($i >= $s))
558558 then $a
559559 else calc($a, $l[$i])
560560
561561 func $f0_2 ($a,$i) = if (($i >= $s))
562562 then $a
563563 else throw("List size exceeds 15")
564564
565565 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
566566 }
567567 let d = $t02200822055._1
568568 let found = $t02200822055._2
569569 if ((found != unit))
570570 then d
571571 else throw(("D calculation error, D = " + toString(d)))
572572 }
573573 }
574574
575575
576576 func getYD (xp,i,D) = {
577577 let n = big2
578578 let x = xp[if ((i == 0))
579579 then 1
580580 else 0]
581581 let aPrecision = parseBigIntValue(Amult)
582582 let a = (parseBigIntValue(A) * aPrecision)
583583 let s = x
584584 let ann = (a * n)
585585 let c = (((((D * D) / (x * n)) * D) * aPrecision) / (ann * n))
586586 let b = ((s + ((D * aPrecision) / ann)) - D)
587587 func calc (acc,cur) = {
588588 let $t02255522575 = acc
589589 let y = $t02255522575._1
590590 let found = $t02255522575._2
591591 if ((found != unit))
592592 then acc
593593 else {
594594 let yNext = (((y * y) + c) / ((big2 * y) + b))
595595 let yDiff = absBigInt((yNext - value(y)))
596596 if ((big1 >= yDiff))
597597 then $Tuple2(yNext, cur)
598598 else $Tuple2(yNext, unit)
599599 }
600600 }
601601
602602 let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
603603 let $t02288222929 = {
604604 let $l = arr
605605 let $s = size($l)
606606 let $acc0 = $Tuple2(D, unit)
607607 func $f0_1 ($a,$i) = if (($i >= $s))
608608 then $a
609609 else calc($a, $l[$i])
610610
611611 func $f0_2 ($a,$i) = if (($i >= $s))
612612 then $a
613613 else throw("List size exceeds 15")
614614
615615 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
616616 }
617617 let y = $t02288222929._1
618618 let found = $t02288222929._2
619619 if ((found != unit))
620620 then y
621621 else throw(("Y calculation error, Y = " + toString(y)))
622622 }
623623
624624
625625 func calcDLp (amountBalance,priceBalance,lpEmission) = {
626626 let updatedDLp = fraction(getD([t1(toInt(amountBalance), cfgAmountAssetDecimals), t1(toInt(priceBalance), cfgPriceAssetDecimals)]), big1, lpEmission)
627627 if ((lpEmission == big0))
628628 then big0
629629 else updatedDLp
630630 }
631631
632632
633633 func calcCurrentDLp (amountAssetDelta,priceAssetDelta,lpAssetEmissionDelta) = {
634634 let amountAssetBalance = (toBigInt(getAccBalance(assetIdToString(cfgAmountAssetId))) - amountAssetDelta)
635635 let priceAssetBalance = (toBigInt(getAccBalance(assetIdToString(cfgPriceAssetId))) - priceAssetDelta)
636636 let lpAssetEmission = (toBigInt(value(assetInfo(cfgLpAssetId)).quantity) - lpAssetEmissionDelta)
637637 let currentDLp = calcDLp(amountAssetBalance, priceAssetBalance, lpAssetEmission)
638638 currentDLp
639639 }
640640
641641
642642 func refreshDLpInternal (amountAssetBalanceDelta,priceAssetBalanceDelta,lpAssetEmissionDelta) = {
643643 let amountAssetBalance = (getAccBalance(assetIdToString(cfgAmountAssetId)) + amountAssetBalanceDelta)
644644 let priceAssetBalance = (getAccBalance(assetIdToString(cfgPriceAssetId)) + priceAssetBalanceDelta)
645645 let lpAssetEmission = (value(assetInfo(cfgLpAssetId)).quantity + lpAssetEmissionDelta)
646646 let updatedDLp = calcDLp(toBigInt(amountAssetBalance), toBigInt(priceAssetBalance), toBigInt(lpAssetEmission))
647647 let actions = [IntegerEntry(keyDLpRefreshedHeight, height), StringEntry(keyDLp, toString(updatedDLp))]
648648 $Tuple2(actions, updatedDLp)
649649 }
650650
651651
652652 func validateUpdatedDLp (oldDLp,updatedDLp) = if ((updatedDLp >= oldDLp))
653653 then true
654654 else throwErr("updated DLp lower than current DLp")
655655
656656
657657 func validateMatcherOrderAllowed (order) = {
658658 let amountAssetAmount = order.amount
659659 let priceAssetAmount = fraction(order.amount, order.price, scale8, FLOOR)
660660 let $t02495225164 = if ((order.orderType == Buy))
661661 then $Tuple2(amountAssetAmount, -(priceAssetAmount))
662662 else $Tuple2(-(amountAssetAmount), priceAssetAmount)
663663 let amountAssetBalanceDelta = $t02495225164._1
664664 let priceAssetBalanceDelta = $t02495225164._2
665665 if (if (if (igs())
666666 then true
667667 else (cfgPoolStatus == PoolMatcherDis))
668668 then true
669669 else (cfgPoolStatus == PoolShutdown))
670670 then throw("Admin blocked")
671671 else if (if ((order.assetPair.amountAsset != cfgAmountAssetId))
672672 then true
673673 else (order.assetPair.priceAsset != cfgPriceAssetId))
674674 then throw("Wr assets")
675675 else {
676676 let dLp = parseBigIntValue(getStringValue(this, keyDLp))
677677 let $t02549425594 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
678678 let unusedActions = $t02549425594._1
679679 let dLpNew = $t02549425594._2
680680 let isOrderValid = (dLpNew >= dLp)
681681 isOrderValid
682682 }
683683 }
684684
685685
686686 func cg (i) = if ((size(i.payments) != 1))
687687 then throw("1 pmnt exp")
688688 else {
689689 let pmt = value(i.payments[0])
690690 let pmtAssetId = value(pmt.assetId)
691691 let pmtAmt = pmt.amount
692692 let r = ego(toBase58String(i.transactionId), toBase58String(pmtAssetId), pmtAmt, i.caller)
693693 let outAmAmt = r._1
694694 let outPrAmt = r._2
695695 let sts = parseIntValue(r._9)
696696 let state = r._10
697697 if (if (igs())
698698 then true
699699 else (sts == PoolShutdown))
700700 then throw(("Admin blocked: " + toString(sts)))
701701 else $Tuple5(outAmAmt, outPrAmt, pmtAmt, pmtAssetId, state)
702702 }
703703
704704
705705 func cp (caller,txId,amAsPmt,prAsPmt,slippage,emitLp,isOneAsset,validateSlippage,pmtAmt,pmtId) = {
706706 let r = epo(txId, slippage, value(amAsPmt).amount, value(amAsPmt).assetId, value(prAsPmt).amount, value(prAsPmt).assetId, caller, (txId == ""), emitLp, isOneAsset, validateSlippage, pmtAmt, pmtId)
707707 let sts = parseIntValue(r._8)
708708 if (if (if (igs())
709709 then true
710710 else (sts == PoolPutDis))
711711 then true
712712 else (sts == PoolShutdown))
713713 then throw(("Blocked:" + toString(sts)))
714714 else r
715715 }
716716
717717
718718 func calcPutOneTkn (pmtAmtRaw,pmtAssetId,userAddress,txId,withTakeFee) = {
719719 let amId = toBase58String(value(cfgAmountAssetId))
720720 let prId = toBase58String(value(cfgPriceAssetId))
721721 let lpId = cfgLpAssetId
722722 let amtDcm = cfgAmountAssetDecimals
723723 let priceDcm = cfgPriceAssetDecimals
724724 let lpAssetEmission = toBigInt(valueOrErrorMessage(assetInfo(lpId), "invalid lp asset").quantity)
725725 let chechEmission = if ((lpAssetEmission > big0))
726726 then true
727727 else throw("initial deposit requires all coins")
728728 if ((chechEmission == chechEmission))
729729 then {
730730 let amBalance = getAccBalance(amId)
731731 let prBalance = getAccBalance(prId)
732732 let $t02786028322 = if ((txId == ""))
733733 then $Tuple2(amBalance, prBalance)
734734 else if ((pmtAssetId == amId))
735735 then if ((pmtAmtRaw > amBalance))
736736 then throw("invalid payment amount")
737737 else $Tuple2((amBalance - pmtAmtRaw), prBalance)
738738 else if ((pmtAssetId == prId))
739739 then if ((pmtAmtRaw > prBalance))
740740 then throw("invalid payment amount")
741741 else $Tuple2(amBalance, (prBalance - pmtAmtRaw))
742742 else throw("wrong pmtAssetId")
743743 let amBalanceOld = $t02786028322._1
744744 let prBalanceOld = $t02786028322._2
745745 let $t02832828504 = if ((pmtAssetId == amId))
746746 then $Tuple2(pmtAmtRaw, 0)
747747 else if ((pmtAssetId == prId))
748748 then $Tuple2(0, pmtAmtRaw)
749749 else throw("invalid payment")
750750 let amAmountRaw = $t02832828504._1
751751 let prAmountRaw = $t02832828504._2
752752 let $t02850828762 = if (withTakeFee)
753753 then $Tuple3(takeFee(amAmountRaw, inFee)._1, takeFee(prAmountRaw, inFee)._1, takeFee(pmtAmtRaw, inFee)._2)
754754 else $Tuple3(amAmountRaw, prAmountRaw, 0)
755755 let amAmount = $t02850828762._1
756756 let prAmount = $t02850828762._2
757757 let feeAmount = $t02850828762._3
758758 let amBalanceNew = (amBalanceOld + amAmount)
759759 let prBalanceNew = (prBalanceOld + prAmount)
760760 let D0 = getD([toBigInt(amBalanceOld), toBigInt(prBalanceOld)])
761761 let D1 = getD([toBigInt(amBalanceNew), toBigInt(prBalanceNew)])
762762 let checkD = if ((D1 > D0))
763763 then true
764764 else throw()
765765 if ((checkD == checkD))
766766 then {
767767 let lpAmount = fraction(lpAssetEmission, (D1 - D0), D0, FLOOR)
768768 let curPrice = f1(cpbi(t1(prBalanceNew, priceDcm), t1(amBalanceNew, amtDcm)), scale8)
769769 let commonState = [IntegerEntry(pl(), curPrice), IntegerEntry(ph(height, lastBlock.timestamp), curPrice), StringEntry(pau(userAddress, txId), dataPutActionInfo(amAmountRaw, prAmountRaw, toInt(lpAmount), curPrice, 0, 0, height, lastBlock.timestamp, 0, 0))]
770770 let poolProportion = fraction(prBalanceOld, scale8, amBalanceOld)
771771 let amountAssetPart = fraction(pmtAmtRaw, scale8, (poolProportion + scale8))
772772 let priceAssetPart = (pmtAmtRaw - amountAssetPart)
773773 let lpAmtBoth = fraction(lpAssetEmission, toBigInt(priceAssetPart), toBigInt(prBalanceOld))
774774 let bonus = toInt(fraction((lpAmount - lpAmtBoth), scale8BigInt, lpAmtBoth))
775775 $Tuple4(toInt(lpAmount), commonState, feeAmount, bonus)
776776 }
777777 else throw("Strict value is not equal to itself.")
778778 }
779779 else throw("Strict value is not equal to itself.")
780780 }
781781
782782
783783 func getOneTknV2Internal (outAssetId,minOutAmount,payments,caller,originCaller,transactionId) = {
784784 let lpId = toBase58String(value(cfgLpAssetId))
785785 let amId = toBase58String(value(cfgAmountAssetId))
786786 let prId = toBase58String(value(cfgPriceAssetId))
787787 let amDecimals = cfgAmountAssetDecimals
788788 let prDecimals = cfgPriceAssetDecimals
789789 let poolStatus = cfgPoolStatus
790790 let userAddress = if ((caller == restContract))
791791 then originCaller
792792 else caller
793793 let pmt = value(payments[0])
794794 let pmtAssetId = value(pmt.assetId)
795795 let pmtAmt = pmt.amount
796796 let currentDLp = calcCurrentDLp(big0, big0, big0)
797797 if ((currentDLp == currentDLp))
798798 then {
799799 let txId58 = toBase58String(transactionId)
800800 if ((lpId != toBase58String(pmtAssetId)))
801801 then throw("Wrong LP")
802802 else {
803803 let amBalance = getAccBalance(amId)
804804 let prBalance = getAccBalance(prId)
805805 let $t03081230923 = {
806806 let @ = invoke(this, "getOneTknV2READONLY", [outAssetId, pmtAmt], nil)
807807 if ($isInstanceOf(@, "(Int, Int)"))
808808 then @
809809 else throw(($getType(@) + " couldn't be cast to (Int, Int)"))
810810 }
811811 if (($t03081230923 == $t03081230923))
812812 then {
813813 let feeAmount = $t03081230923._2
814814 let totalGet = $t03081230923._1
815815 let totalAmount = if (if ((minOutAmount > 0))
816816 then (minOutAmount > totalGet)
817817 else false)
818818 then throwErr(makeString(["amount to receive is less than ", toString(minOutAmount)], ""))
819819 else totalGet
820820 let $t03111331420 = if ((outAssetId == amId))
821821 then $Tuple4(totalAmount, 0, ((amBalance - totalAmount) - feeAmount), prBalance)
822822 else if ((outAssetId == prId))
823823 then $Tuple4(0, totalAmount, amBalance, ((prBalance - totalAmount) - feeAmount))
824824 else throw("invalid out asset id")
825825 let outAm = $t03111331420._1
826826 let outPr = $t03111331420._2
827827 let amBalanceNew = $t03111331420._3
828828 let prBalanceNew = $t03111331420._4
829829 let curPrX18 = cpbi(t1(prBalanceNew, prDecimals), t1(amBalanceNew, amDecimals))
830830 let curPr = f1(curPrX18, scale8)
831831 let outAssetIdOrWaves = if ((outAssetId == "WAVES"))
832832 then unit
833833 else fromBase58String(outAssetId)
834834 let sendFeeToMatcher = if ((feeAmount > 0))
835835 then [ScriptTransfer(feeCollectorAddress, feeAmount, outAssetIdOrWaves)]
836836 else nil
837837 let state = ([ScriptTransfer(userAddress, totalAmount, outAssetIdOrWaves), StringEntry(gau(toString(userAddress), txId58), dataGetActionInfo(outAm, outPr, pmtAmt, curPr, height, lastBlock.timestamp)), IntegerEntry(pl(), curPr), IntegerEntry(ph(height, lastBlock.timestamp), curPr)] ++ sendFeeToMatcher)
838838 if ((state == state))
839839 then {
840840 let burn = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
841841 if ((burn == burn))
842842 then {
843843 let $t03220532555 = {
844844 let feeAmountForCalc = if ((this == feeCollectorAddress))
845845 then 0
846846 else feeAmount
847847 let outInAmountAsset = if ((parseAssetId(outAssetId) == cfgAmountAssetId))
848848 then true
849849 else false
850850 if (outInAmountAsset)
851851 then $Tuple2(-((totalGet + feeAmountForCalc)), 0)
852852 else $Tuple2(0, -((totalGet + feeAmountForCalc)))
853853 }
854854 let amountAssetBalanceDelta = $t03220532555._1
855855 let priceAssetBalanceDelta = $t03220532555._2
856856 let $t03255832666 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
857857 let refreshDLpActions = $t03255832666._1
858858 let updatedDLp = $t03255832666._2
859859 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
860860 if ((isUpdatedDLpValid == isUpdatedDLpValid))
861861 then $Tuple2((state ++ refreshDLpActions), totalAmount)
862862 else throw("Strict value is not equal to itself.")
863863 }
864864 else throw("Strict value is not equal to itself.")
865865 }
866866 else throw("Strict value is not equal to itself.")
867867 }
868868 else throw("Strict value is not equal to itself.")
869869 }
870870 }
871871 else throw("Strict value is not equal to itself.")
872872 }
873873
874874
875875 func m () = match getString(mpk()) {
876876 case s: String =>
877877 fromBase58String(s)
878878 case _: Unit =>
879879 unit
880880 case _ =>
881881 throw("Match error")
882882 }
883883
884884
885885 func pm () = match getString(pmpk()) {
886886 case s: String =>
887887 fromBase58String(s)
888888 case _: Unit =>
889889 unit
890890 case _ =>
891891 throw("Match error")
892892 }
893893
894894
895895 let pd = throw("Permission denied")
896896
897897 func isManager (i) = match m() {
898898 case pk: ByteVector =>
899899 (i.callerPublicKey == pk)
900900 case _: Unit =>
901901 (i.caller == this)
902902 case _ =>
903903 throw("Match error")
904904 }
905905
906906
907907 func mm (i) = match m() {
908908 case pk: ByteVector =>
909909 if ((i.callerPublicKey == pk))
910910 then true
911911 else pd
912912 case _: Unit =>
913913 if ((i.caller == this))
914914 then true
915915 else pd
916916 case _ =>
917917 throw("Match error")
918918 }
919919
920920
921921 @Callable(i)
922922 func constructor (fc) = {
923923 let c = mm(i)
924924 if ((c == c))
925925 then [StringEntry(fc(), fc)]
926926 else throw("Strict value is not equal to itself.")
927927 }
928928
929929
930930
931931 @Callable(i)
932932 func setManager (pendingManagerPublicKey) = {
933933 let c = mm(i)
934934 if ((c == c))
935935 then {
936936 let cm = fromBase58String(pendingManagerPublicKey)
937937 if ((cm == cm))
938938 then [StringEntry(pmpk(), pendingManagerPublicKey)]
939939 else throw("Strict value is not equal to itself.")
940940 }
941941 else throw("Strict value is not equal to itself.")
942942 }
943943
944944
945945
946946 @Callable(i)
947947 func confirmManager () = {
948948 let p = pm()
949949 let hpm = if (isDefined(p))
950950 then true
951951 else throw("No pending manager")
952952 if ((hpm == hpm))
953953 then {
954954 let cpm = if ((i.callerPublicKey == value(p)))
955955 then true
956956 else throw("You are not pending manager")
957957 if ((cpm == cpm))
958958 then [StringEntry(mpk(), toBase58String(value(p))), DeleteEntry(pmpk())]
959959 else throw("Strict value is not equal to itself.")
960960 }
961961 else throw("Strict value is not equal to itself.")
962962 }
963963
964964
965965
966966 @Callable(i)
967967 func put (slip,autoStake) = {
968968 let factCfg = gfc()
969969 let stakingCntr = valueOrErrorMessage(addressFromString(factCfg[idxFactStakCntr]), "Wr st addr")
970970 let slipCntr = valueOrErrorMessage(addressFromString(factCfg[idxFactSlippCntr]), "Wr sl addr")
971971 if ((0 > slip))
972972 then throw("Wrong slippage")
973973 else if ((size(i.payments) != 2))
974974 then throw("2 pmnts expd")
975975 else {
976976 let amAssetPmt = toBigInt(value(i.payments[0]).amount)
977977 let prAssetPmt = toBigInt(value(i.payments[1]).amount)
978978 let amountAssetBalance = (toBigInt(getAccBalance(assetIdToString(cfgAmountAssetId))) - amAssetPmt)
979979 if ((amountAssetBalance == amountAssetBalance))
980980 then {
981981 let priceAssetBalance = (toBigInt(getAccBalance(assetIdToString(cfgPriceAssetId))) - prAssetPmt)
982982 if ((priceAssetBalance == priceAssetBalance))
983983 then {
984984 let lpAssetEmission = toBigInt(value(assetInfo(cfgLpAssetId)).quantity)
985985 if ((lpAssetEmission == lpAssetEmission))
986986 then {
987987 let currentDLp = calcCurrentDLp(amAssetPmt, prAssetPmt, toBigInt(0))
988988 if ((currentDLp == currentDLp))
989989 then {
990990 let e = cp(toString(i.caller), toBase58String(i.transactionId), AttachedPayment(value(i.payments[0]).assetId, value(i.payments[0]).amount), i.payments[1], slip, true, false, true, 0, "")
991991 let emitLpAmt = e._2
992992 let lpAssetId = e._7
993993 let state = e._9
994994 let amDiff = e._10
995995 let prDiff = e._11
996996 let amId = e._12
997997 let prId = e._13
998998 let r = invoke(fca, "emit", [emitLpAmt], nil)
999999 if ((r == r))
10001000 then {
10011001 let el = match r {
10021002 case legacy: Address =>
10031003 invoke(legacy, "emit", [emitLpAmt], nil)
10041004 case _ =>
10051005 unit
10061006 }
10071007 if ((el == el))
10081008 then {
10091009 let sa = if ((amDiff > 0))
10101010 then invoke(slipCntr, "put", nil, [AttachedPayment(amId, amDiff)])
10111011 else nil
10121012 if ((sa == sa))
10131013 then {
10141014 let sp = if ((prDiff > 0))
10151015 then invoke(slipCntr, "put", nil, [AttachedPayment(prId, prDiff)])
10161016 else nil
10171017 if ((sp == sp))
10181018 then {
10191019 let lpTrnsfr = if (autoStake)
10201020 then {
10211021 let ss = invoke(stakingCntr, "stake", nil, [AttachedPayment(lpAssetId, emitLpAmt)])
10221022 if ((ss == ss))
10231023 then nil
10241024 else throw("Strict value is not equal to itself.")
10251025 }
10261026 else [ScriptTransfer(i.caller, emitLpAmt, lpAssetId)]
10271027 let $t03681536957 = refreshDLpInternal(0, 0, 0)
10281028 let refreshDLpActions = $t03681536957._1
10291029 let updatedDLp = $t03681536957._2
10301030 let check = if ((updatedDLp >= currentDLp))
10311031 then true
10321032 else throwErr(makeString(["updated DLp lower than current DLp", toString(amountAssetBalance), toString(priceAssetBalance), toString(lpAssetEmission), toString(currentDLp), toString(updatedDLp), toString(amDiff), toString(prDiff)], " "))
10331033 if ((check == check))
10341034 then {
10351035 let lpAssetEmissionAfter = value(assetInfo(cfgLpAssetId)).quantity
10361036 if ((lpAssetEmissionAfter == lpAssetEmissionAfter))
10371037 then ((state ++ lpTrnsfr) ++ refreshDLpActions)
10381038 else throw("Strict value is not equal to itself.")
10391039 }
10401040 else throw("Strict value is not equal to itself.")
10411041 }
10421042 else throw("Strict value is not equal to itself.")
10431043 }
10441044 else throw("Strict value is not equal to itself.")
10451045 }
10461046 else throw("Strict value is not equal to itself.")
10471047 }
10481048 else throw("Strict value is not equal to itself.")
10491049 }
10501050 else throw("Strict value is not equal to itself.")
10511051 }
10521052 else throw("Strict value is not equal to itself.")
10531053 }
10541054 else throw("Strict value is not equal to itself.")
10551055 }
10561056 else throw("Strict value is not equal to itself.")
10571057 }
10581058 }
10591059
10601060
10611061
10621062 @Callable(i)
10631063 func putOneTknV2 (minOutAmount,autoStake) = {
10641064 let isPoolOneTokenOperationsDisabled = {
10651065 let @ = invoke(fca, "isPoolOneTokenOperationsDisabledREADONLY", [toString(this)], nil)
10661066 if ($isInstanceOf(@, "Boolean"))
10671067 then @
10681068 else throw(($getType(@) + " couldn't be cast to Boolean"))
10691069 }
10701070 let isPutDisabled = if (if (if (igs())
10711071 then true
10721072 else (cfgPoolStatus == PoolPutDis))
10731073 then true
10741074 else (cfgPoolStatus == PoolShutdown))
10751075 then true
10761076 else isPoolOneTokenOperationsDisabled
10771077 let checks = [if (if (!(isPutDisabled))
10781078 then true
10791079 else isManager(i))
10801080 then true
10811081 else throwErr("put operation is blocked by admin"), if ((size(i.payments) == 1))
10821082 then true
10831083 else throwErr("exactly 1 payment are expected")]
10841084 if ((checks == checks))
10851085 then {
10861086 let amId = toBase58String(value(cfgAmountAssetId))
10871087 let prId = toBase58String(value(cfgPriceAssetId))
10881088 let lpId = cfgLpAssetId
10891089 let amDecimals = cfgAmountAssetDecimals
10901090 let prDecimals = cfgPriceAssetDecimals
10911091 let userAddress = if ((i.caller == this))
10921092 then i.originCaller
10931093 else i.caller
10941094 let pmt = value(i.payments[0])
10951095 let pmtAssetId = toBase58String(value(pmt.assetId))
10961096 let pmtAmt = pmt.amount
10971097 let currentDLp = if ((pmt.assetId == cfgAmountAssetId))
10981098 then calcCurrentDLp(toBigInt(pmtAmt), toBigInt(0), toBigInt(0))
10991099 else calcCurrentDLp(toBigInt(0), toBigInt(pmtAmt), toBigInt(0))
11001100 if ((currentDLp == currentDLp))
11011101 then {
11021102 let $t03859838756 = calcPutOneTkn(pmtAmt, pmtAssetId, toString(userAddress), toBase58String(i.transactionId), true)
11031103 if (($t03859838756 == $t03859838756))
11041104 then {
11051105 let feeAmount = $t03859838756._3
11061106 let state = $t03859838756._2
11071107 let estimLP = $t03859838756._1
11081108 let emitLpAmt = if (if ((minOutAmount > 0))
11091109 then (minOutAmount > estimLP)
11101110 else false)
11111111 then throwErr(makeString(["amount to receive is less than ", toString(minOutAmount)], ""))
11121112 else estimLP
11131113 let e = invoke(fca, "emit", [emitLpAmt], nil)
11141114 if ((e == e))
11151115 then {
11161116 let el = match e {
11171117 case legacy: Address =>
11181118 invoke(legacy, "emit", [emitLpAmt], nil)
11191119 case _ =>
11201120 unit
11211121 }
11221122 if ((el == el))
11231123 then {
11241124 let lpTrnsfr = if (autoStake)
11251125 then {
11261126 let ss = invoke(stakingContract, "stake", nil, [AttachedPayment(lpId, emitLpAmt)])
11271127 if ((ss == ss))
11281128 then nil
11291129 else throw("Strict value is not equal to itself.")
11301130 }
11311131 else [ScriptTransfer(i.caller, emitLpAmt, lpId)]
11321132 let sendFeeToMatcher = if ((feeAmount > 0))
11331133 then [ScriptTransfer(feeCollectorAddress, feeAmount, fromBase58String(pmtAssetId))]
11341134 else nil
11351135 let $t03957139920 = if ((this == feeCollectorAddress))
11361136 then $Tuple2(0, 0)
11371137 else {
11381138 let paymentInAmountAsset = if ((pmt.assetId == cfgAmountAssetId))
11391139 then true
11401140 else false
11411141 if (paymentInAmountAsset)
11421142 then $Tuple2(-(feeAmount), 0)
11431143 else $Tuple2(0, -(feeAmount))
11441144 }
11451145 let amountAssetBalanceDelta = $t03957139920._1
11461146 let priceAssetBalanceDelta = $t03957139920._2
11471147 let $t03992340031 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
11481148 let refreshDLpActions = $t03992340031._1
11491149 let updatedDLp = $t03992340031._2
11501150 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
11511151 if ((isUpdatedDLpValid == isUpdatedDLpValid))
11521152 then $Tuple2((((state ++ lpTrnsfr) ++ sendFeeToMatcher) ++ refreshDLpActions), emitLpAmt)
11531153 else throw("Strict value is not equal to itself.")
11541154 }
11551155 else throw("Strict value is not equal to itself.")
11561156 }
11571157 else throw("Strict value is not equal to itself.")
11581158 }
11591159 else throw("Strict value is not equal to itself.")
11601160 }
11611161 else throw("Strict value is not equal to itself.")
11621162 }
11631163 else throw("Strict value is not equal to itself.")
11641164 }
11651165
11661166
11671167
11681168 @Callable(i)
11691169 func putForFree (maxSlpg) = if ((0 > maxSlpg))
11701170 then throw("Wrong slpg")
11711171 else if ((size(i.payments) != 2))
11721172 then throw("2 pmnts expd")
11731173 else {
11741174 let estPut = cp(toString(i.caller), toBase58String(i.transactionId), AttachedPayment(value(i.payments[0]).assetId, value(i.payments[0]).amount), i.payments[1], maxSlpg, false, false, true, 0, "")
11751175 let state = estPut._9
11761176 let amAssetPmt = toBigInt(value(i.payments[0]).amount)
11771177 let prAssetPmt = toBigInt(value(i.payments[1]).amount)
11781178 let currentDLp = calcCurrentDLp(amAssetPmt, prAssetPmt, toBigInt(0))
11791179 if ((currentDLp == currentDLp))
11801180 then {
11811181 let $t04106141126 = refreshDLpInternal(0, 0, 0)
11821182 let refreshDLpActions = $t04106141126._1
11831183 let updatedDLp = $t04106141126._2
11841184 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
11851185 if ((isUpdatedDLpValid == isUpdatedDLpValid))
11861186 then (state ++ refreshDLpActions)
11871187 else throw("Strict value is not equal to itself.")
11881188 }
11891189 else throw("Strict value is not equal to itself.")
11901190 }
11911191
11921192
11931193
11941194 @Callable(i)
11951195 func get () = {
11961196 let currentDLp = calcCurrentDLp(toBigInt(0), toBigInt(0), toBigInt(0))
11971197 if ((currentDLp == currentDLp))
11981198 then {
11991199 let r = cg(i)
12001200 let outAmtAmt = r._1
12011201 let outPrAmt = r._2
12021202 let pmtAmt = r._3
12031203 let pmtAssetId = r._4
12041204 let state = r._5
12051205 let b = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
12061206 if ((b == b))
12071207 then {
12081208 let $t04229942381 = refreshDLpInternal(-(outAmtAmt), -(outPrAmt), 0)
12091209 let refreshDLpActions = $t04229942381._1
12101210 let updatedDLp = $t04229942381._2
12111211 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
12121212 if ((isUpdatedDLpValid == isUpdatedDLpValid))
12131213 then (state ++ refreshDLpActions)
12141214 else throw("Strict value is not equal to itself.")
12151215 }
12161216 else throw("Strict value is not equal to itself.")
12171217 }
12181218 else throw("Strict value is not equal to itself.")
12191219 }
12201220
12211221
12221222
12231223 @Callable(i)
12241224 func getOneTknV2 (outAssetId,minOutAmount) = {
12251225 let isPoolOneTokenOperationsDisabled = {
12261226 let @ = invoke(fca, "isPoolOneTokenOperationsDisabledREADONLY", [toString(this)], nil)
12271227 if ($isInstanceOf(@, "Boolean"))
12281228 then @
12291229 else throw(($getType(@) + " couldn't be cast to Boolean"))
12301230 }
12311231 let isGetDisabled = if (if (igs())
12321232 then true
12331233 else (cfgPoolStatus == PoolShutdown))
12341234 then true
12351235 else isPoolOneTokenOperationsDisabled
12361236 let checks = [if (if (!(isGetDisabled))
12371237 then true
12381238 else isManager(i))
12391239 then true
12401240 else throwErr("get operation is blocked by admin"), if ((size(i.payments) == 1))
12411241 then true
12421242 else throwErr("exactly 1 payment are expected")]
12431243 if ((checks == checks))
12441244 then {
12451245 let $t04299943154 = getOneTknV2Internal(outAssetId, minOutAmount, i.payments, i.caller, i.originCaller, i.transactionId)
12461246 let state = $t04299943154._1
12471247 let totalAmount = $t04299943154._2
12481248 $Tuple2(state, totalAmount)
12491249 }
12501250 else throw("Strict value is not equal to itself.")
12511251 }
12521252
12531253
12541254
12551255 @Callable(i)
12561256 func refreshDLp () = {
12571257 let lastRefreshedBlockHeight = valueOrElse(getInteger(keyDLpRefreshedHeight), 0)
12581258 let checkLastRefreshedBlockHeight = if (((height - lastRefreshedBlockHeight) >= dLpRefreshDelay))
12591259 then unit
12601260 else throwErr(makeString([toString(dLpRefreshDelay), " blocks have not passed since the previous call"], ""))
12611261 if ((checkLastRefreshedBlockHeight == checkLastRefreshedBlockHeight))
12621262 then {
12631263 let dLp = valueOrErrorMessage(parseBigInt(valueOrElse(getString(this, keyDLp), "0")), fmtErr("invalid dLp"))
12641264 let $t04367843742 = refreshDLpInternal(0, 0, 0)
12651265 let dLpUpdateActions = $t04367843742._1
12661266 let updatedDLp = $t04367843742._2
12671267 let actions = if ((dLp != updatedDLp))
12681268 then dLpUpdateActions
12691269 else throwErr("nothing to refresh")
12701270 $Tuple2(actions, toString(updatedDLp))
12711271 }
12721272 else throw("Strict value is not equal to itself.")
12731273 }
12741274
12751275
12761276
12771277 @Callable(i)
12781278 func getOneTknV2READONLY (outAssetId,lpAssetAmount) = {
12791279 let amId = toBase58String(value(cfgAmountAssetId))
12801280 let prId = toBase58String(value(cfgPriceAssetId))
12811281 let lpId = toBase58String(value(cfgLpAssetId))
12821282 let xp = [toBigInt(getAccBalance(amId)), toBigInt(getAccBalance(prId))]
12831283 let lpEmission = toBigInt(valueOrErrorMessage(assetInfo(fromBase58String(lpId)), "invalid lp asset").quantity)
12841284 let D0 = getD(xp)
12851285 let D1 = (D0 - fraction(toBigInt(lpAssetAmount), D0, lpEmission))
12861286 let index = if ((outAssetId == amId))
12871287 then 0
12881288 else if ((outAssetId == prId))
12891289 then 1
12901290 else throw("invalid out asset id")
12911291 let newY = getYD(xp, index, D1)
12921292 let dy = (xp[index] - newY)
12931293 let totalGetRaw = max([0, toInt((dy - big1))])
12941294 let $t04467244727 = takeFee(totalGetRaw, outFee)
12951295 let totalGet = $t04467244727._1
12961296 let feeAmount = $t04467244727._2
12971297 $Tuple2(nil, $Tuple2(totalGet, feeAmount))
12981298 }
12991299
13001300
13011301
13021302 @Callable(i)
13031303 func getOneTknV2WithBonusREADONLY (outAssetId,lpAssetAmount) = {
13041304 let amId = toBase58String(value(cfgAmountAssetId))
13051305 let prId = toBase58String(value(cfgPriceAssetId))
13061306 let lpId = toBase58String(value(cfgLpAssetId))
13071307 let amBalance = getAccBalance(amId)
13081308 let prBalance = getAccBalance(prId)
13091309 let $t04510245217 = {
13101310 let @ = invoke(this, "getOneTknV2READONLY", [outAssetId, lpAssetAmount], nil)
13111311 if ($isInstanceOf(@, "(Int, Int)"))
13121312 then @
13131313 else throw(($getType(@) + " couldn't be cast to (Int, Int)"))
13141314 }
13151315 let totalGet = $t04510245217._1
13161316 let feeAmount = $t04510245217._2
13171317 let r = ego("", lpId, lpAssetAmount, this)
13181318 let outAmAmt = r._1
13191319 let outPrAmt = r._2
13201320 let sumOfGetAssets = (outAmAmt + outPrAmt)
13211321 let bonus = if ((sumOfGetAssets == 0))
13221322 then if ((totalGet == 0))
13231323 then 0
13241324 else throw("bonus calculation error")
13251325 else fraction((totalGet - sumOfGetAssets), scale8, sumOfGetAssets)
13261326 $Tuple2(nil, $Tuple3(totalGet, feeAmount, bonus))
13271327 }
13281328
13291329
13301330
13311331 @Callable(i)
13321332 func getNoLess (noLessThenAmtAsset,noLessThenPriceAsset) = {
13331333 let r = cg(i)
13341334 let outAmAmt = r._1
13351335 let outPrAmt = r._2
13361336 let pmtAmt = r._3
13371337 let pmtAssetId = r._4
13381338 let state = r._5
13391339 if ((noLessThenAmtAsset > outAmAmt))
13401340 then throw(((("Failed: " + toString(outAmAmt)) + " < ") + toString(noLessThenAmtAsset)))
13411341 else if ((noLessThenPriceAsset > outPrAmt))
13421342 then throw(((("Failed: " + toString(outPrAmt)) + " < ") + toString(noLessThenPriceAsset)))
13431343 else {
13441344 let currentDLp = calcCurrentDLp(toBigInt(0), toBigInt(0), toBigInt(0))
13451345 if ((currentDLp == currentDLp))
13461346 then {
13471347 let burnLPAssetOnFactory = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
13481348 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
13491349 then {
13501350 let $t04638346464 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
13511351 let refreshDLpActions = $t04638346464._1
13521352 let updatedDLp = $t04638346464._2
13531353 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
13541354 if ((isUpdatedDLpValid == isUpdatedDLpValid))
13551355 then (state ++ refreshDLpActions)
13561356 else throw("Strict value is not equal to itself.")
13571357 }
13581358 else throw("Strict value is not equal to itself.")
13591359 }
13601360 else throw("Strict value is not equal to itself.")
13611361 }
13621362 }
13631363
13641364
13651365
13661366 @Callable(i)
13671367 func unstakeAndGet (amount) = {
13681368 let checkPayments = if ((size(i.payments) != 0))
13691369 then throw("No pmnts expd")
13701370 else true
13711371 if ((checkPayments == checkPayments))
13721372 then {
13731373 let factoryCfg = gfc()
13741374 let lpAssetId = cfgLpAssetId
13751375 let staking = valueOrErrorMessage(addressFromString(factoryCfg[idxFactStakCntr]), "Wr st addr")
13761376 let currentDLp = calcCurrentDLp(toBigInt(0), toBigInt(0), toBigInt(0))
1377- let unstakeInv = invoke(staking, "unstake", [toBase58String(lpAssetId), amount], nil)
1378- if ((unstakeInv == unstakeInv))
1377+ if ((currentDLp == currentDLp))
13791378 then {
1380- let r = ego(toBase58String(i.transactionId), toBase58String(lpAssetId), amount, i.caller)
1381- let outAmAmt = r._1
1382- let outPrAmt = r._2
1383- let sts = parseIntValue(r._9)
1384- let state = r._10
1385- let v = if (if (igs())
1386- then true
1387- else (sts == PoolShutdown))
1388- then throw(("Blocked: " + toString(sts)))
1389- else true
1390- if ((v == v))
1379+ let unstakeInv = invoke(staking, "unstake", [toBase58String(lpAssetId), amount], nil)
1380+ if ((unstakeInv == unstakeInv))
13911381 then {
1392- let burnA = invoke(fca, "burn", [amount], [AttachedPayment(lpAssetId, amount)])
1393- if ((burnA == burnA))
1382+ let r = ego(toBase58String(i.transactionId), toBase58String(lpAssetId), amount, i.caller)
1383+ let outAmAmt = r._1
1384+ let outPrAmt = r._2
1385+ let sts = parseIntValue(r._9)
1386+ let state = r._10
1387+ let v = if (if (igs())
1388+ then true
1389+ else (sts == PoolShutdown))
1390+ then throw(("Blocked: " + toString(sts)))
1391+ else true
1392+ if ((v == v))
13941393 then {
1395- let $t04748847569 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1396- let refreshDLpActions = $t04748847569._1
1397- let updatedDLp = $t04748847569._2
1398- let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
1399- if ((isUpdatedDLpValid == isUpdatedDLpValid))
1400- then (state ++ refreshDLpActions)
1394+ let burnA = invoke(fca, "burn", [amount], [AttachedPayment(lpAssetId, amount)])
1395+ if ((burnA == burnA))
1396+ then {
1397+ let $t04749147572 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1398+ let refreshDLpActions = $t04749147572._1
1399+ let updatedDLp = $t04749147572._2
1400+ let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
1401+ if ((isUpdatedDLpValid == isUpdatedDLpValid))
1402+ then (state ++ refreshDLpActions)
1403+ else throw("Strict value is not equal to itself.")
1404+ }
14011405 else throw("Strict value is not equal to itself.")
14021406 }
14031407 else throw("Strict value is not equal to itself.")
14041408 }
14051409 else throw("Strict value is not equal to itself.")
14061410 }
14071411 else throw("Strict value is not equal to itself.")
14081412 }
14091413 else throw("Strict value is not equal to itself.")
14101414 }
14111415
14121416
14131417
14141418 @Callable(i)
14151419 func unstakeAndGetNoLess (unstakeAmount,noLessThenAmountAsset,noLessThenPriceAsset) = {
14161420 let isGetDisabled = if (igs())
14171421 then true
14181422 else (cfgPoolStatus == PoolShutdown)
14191423 let checks = [if (!(isGetDisabled))
14201424 then true
14211425 else throw("get operation is blocked by admin"), if ((size(i.payments) == 0))
14221426 then true
14231427 else throw("no payments are expected")]
14241428 if ((checks == checks))
14251429 then {
14261430 let currentDLp = calcCurrentDLp(toBigInt(0), toBigInt(0), toBigInt(0))
1427- let unstakeInv = invoke(stakingContract, "unstake", [toBase58String(cfgLpAssetId), unstakeAmount], nil)
1428- if ((unstakeInv == unstakeInv))
1431+ if ((currentDLp == currentDLp))
14291432 then {
1430- let res = ego(toBase58String(i.transactionId), toBase58String(cfgLpAssetId), unstakeAmount, i.caller)
1431- let outAmAmt = res._1
1432- let outPrAmt = res._2
1433- let state = res._10
1434- let checkAmounts = [if ((outAmAmt >= noLessThenAmountAsset))
1435- then true
1436- else throw(makeString(["amount asset amount to receive is less than ", toString(noLessThenAmountAsset)], "")), if ((outPrAmt >= noLessThenPriceAsset))
1437- then true
1438- else throw(makeString(["price asset amount to receive is less than ", toString(noLessThenPriceAsset)], ""))]
1439- if ((checkAmounts == checkAmounts))
1433+ let unstakeInv = invoke(stakingContract, "unstake", [toBase58String(cfgLpAssetId), unstakeAmount], nil)
1434+ if ((unstakeInv == unstakeInv))
14401435 then {
1441- let burnLPAssetOnFactory = invoke(fca, "burn", [unstakeAmount], [AttachedPayment(cfgLpAssetId, unstakeAmount)])
1442- if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
1436+ let res = ego(toBase58String(i.transactionId), toBase58String(cfgLpAssetId), unstakeAmount, i.caller)
1437+ let outAmAmt = res._1
1438+ let outPrAmt = res._2
1439+ let state = res._10
1440+ let checkAmounts = [if ((outAmAmt >= noLessThenAmountAsset))
1441+ then true
1442+ else throw(makeString(["amount asset amount to receive is less than ", toString(noLessThenAmountAsset)], "")), if ((outPrAmt >= noLessThenPriceAsset))
1443+ then true
1444+ else throw(makeString(["price asset amount to receive is less than ", toString(noLessThenPriceAsset)], ""))]
1445+ if ((checkAmounts == checkAmounts))
14431446 then {
1444- let $t04881748898 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1445- let refreshDLpActions = $t04881748898._1
1446- let updatedDLp = $t04881748898._2
1447- let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
1448- if ((isUpdatedDLpValid == isUpdatedDLpValid))
1449- then (state ++ refreshDLpActions)
1447+ let burnLPAssetOnFactory = invoke(fca, "burn", [unstakeAmount], [AttachedPayment(cfgLpAssetId, unstakeAmount)])
1448+ if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
1449+ then {
1450+ let $t04882348904 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1451+ let refreshDLpActions = $t04882348904._1
1452+ let updatedDLp = $t04882348904._2
1453+ let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
1454+ if ((isUpdatedDLpValid == isUpdatedDLpValid))
1455+ then (state ++ refreshDLpActions)
1456+ else throw("Strict value is not equal to itself.")
1457+ }
14501458 else throw("Strict value is not equal to itself.")
14511459 }
14521460 else throw("Strict value is not equal to itself.")
14531461 }
14541462 else throw("Strict value is not equal to itself.")
14551463 }
14561464 else throw("Strict value is not equal to itself.")
14571465 }
14581466 else throw("Strict value is not equal to itself.")
14591467 }
14601468
14611469
14621470
14631471 @Callable(i)
14641472 func unstakeAndGetOneTknV2 (unstakeAmount,outAssetId,minOutAmount) = {
14651473 let isPoolOneTokenOperationsDisabled = {
14661474 let @ = invoke(fca, "isPoolOneTokenOperationsDisabledREADONLY", [toString(this)], nil)
14671475 if ($isInstanceOf(@, "Boolean"))
14681476 then @
14691477 else throw(($getType(@) + " couldn't be cast to Boolean"))
14701478 }
14711479 let isGetDisabled = if (if (igs())
14721480 then true
14731481 else (cfgPoolStatus == PoolShutdown))
14741482 then true
14751483 else isPoolOneTokenOperationsDisabled
14761484 let checks = [if (if (!(isGetDisabled))
14771485 then true
14781486 else isManager(i))
14791487 then true
14801488 else throwErr("get operation is blocked by admin"), if ((size(i.payments) == 0))
14811489 then true
14821490 else throwErr("no payments are expected")]
14831491 if ((checks == checks))
14841492 then {
14851493 let factoryCfg = gfc()
14861494 let lpAssetId = cfgLpAssetId
14871495 let staking = valueOrErrorMessage(addressFromString(factoryCfg[idxFactStakCntr]), "Wr st addr")
14881496 let unstakeInv = invoke(staking, "unstake", [toBase58String(lpAssetId), unstakeAmount], nil)
14891497 if ((unstakeInv == unstakeInv))
14901498 then {
1491- let $t04979349981 = getOneTknV2Internal(outAssetId, minOutAmount, [AttachedPayment(lpAssetId, unstakeAmount)], i.caller, i.originCaller, i.transactionId)
1492- let state = $t04979349981._1
1493- let totalAmount = $t04979349981._2
1499+ let $t04979949987 = getOneTknV2Internal(outAssetId, minOutAmount, [AttachedPayment(lpAssetId, unstakeAmount)], i.caller, i.originCaller, i.transactionId)
1500+ let state = $t04979949987._1
1501+ let totalAmount = $t04979949987._2
14941502 $Tuple2(state, totalAmount)
14951503 }
14961504 else throw("Strict value is not equal to itself.")
14971505 }
14981506 else throw("Strict value is not equal to itself.")
14991507 }
15001508
15011509
15021510
15031511 @Callable(i)
15041512 func putOneTknV2WithBonusREADONLY (paymentAmountRaw,paymentAssetId) = {
1505- let $t05010950212 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "", true)
1506- let lpAmount = $t05010950212._1
1507- let state = $t05010950212._2
1508- let feeAmount = $t05010950212._3
1509- let bonus = $t05010950212._4
1513+ let $t05011550218 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "", true)
1514+ let lpAmount = $t05011550218._1
1515+ let state = $t05011550218._2
1516+ let feeAmount = $t05011550218._3
1517+ let bonus = $t05011550218._4
15101518 $Tuple2(nil, $Tuple3(lpAmount, feeAmount, bonus))
15111519 }
15121520
15131521
15141522
15151523 @Callable(i)
15161524 func putOneTknV2WithoutTakeFeeREADONLY (paymentAmountRaw,paymentAssetId) = {
1517- let $t05036050464 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "", false)
1518- let lpAmount = $t05036050464._1
1519- let state = $t05036050464._2
1520- let feeAmount = $t05036050464._3
1521- let bonus = $t05036050464._4
1525+ let $t05036650470 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "", false)
1526+ let lpAmount = $t05036650470._1
1527+ let state = $t05036650470._2
1528+ let feeAmount = $t05036650470._3
1529+ let bonus = $t05036650470._4
15221530 $Tuple2(nil, $Tuple3(lpAmount, feeAmount, bonus))
15231531 }
15241532
15251533
15261534
15271535 @Callable(i)
15281536 func activate (amtAsStr,prAsStr) = if ((toString(i.caller) != toString(fca)))
15291537 then throw("denied")
15301538 else $Tuple2([StringEntry(aa(), amtAsStr), StringEntry(pa(), prAsStr)], "success")
15311539
15321540
15331541
15341542 @Callable(i)
15351543 func setS (k,v) = if ((toString(i.caller) != strf(this, ada())))
15361544 then pd
15371545 else [StringEntry(k, v)]
15381546
15391547
15401548
15411549 @Callable(i)
15421550 func setI (k,v) = if ((toString(i.caller) != strf(this, ada())))
15431551 then pd
15441552 else [IntegerEntry(k, v)]
15451553
15461554
15471555
15481556 @Callable(i)
15491557 func getPoolConfigWrapperREADONLY () = $Tuple2(nil, gpc())
15501558
15511559
15521560
15531561 @Callable(i)
15541562 func getAccBalanceWrapperREADONLY (assetId) = $Tuple2(nil, getAccBalance(assetId))
15551563
15561564
15571565
15581566 @Callable(i)
15591567 func calcPricesWrapperREADONLY (amAmt,prAmt,lpAmt) = {
15601568 let pr = calcPrices(amAmt, prAmt, lpAmt)
15611569 $Tuple2(nil, [toString(pr[0]), toString(pr[1]), toString(pr[2])])
15621570 }
15631571
15641572
15651573
15661574 @Callable(i)
15671575 func fromX18WrapperREADONLY (val,resScaleMult) = $Tuple2(nil, f1(parseBigIntValue(val), resScaleMult))
15681576
15691577
15701578
15711579 @Callable(i)
15721580 func toX18WrapperREADONLY (origVal,origScaleMult) = $Tuple2(nil, toString(t1(origVal, origScaleMult)))
15731581
15741582
15751583
15761584 @Callable(i)
15771585 func calcPriceBigIntWrapperREADONLY (prAmtX18,amAmtX18) = $Tuple2(nil, toString(cpbi(parseBigIntValue(prAmtX18), parseBigIntValue(amAmtX18))))
15781586
15791587
15801588
15811589 @Callable(i)
15821590 func estimatePutOperationWrapperREADONLY (txId58,slippage,inAmAmt,inAmId,inPrAmt,inPrId,usrAddr,isEval,emitLp) = $Tuple2(nil, epo(txId58, slippage, inAmAmt, inAmId, inPrAmt, inPrId, usrAddr, isEval, emitLp, true, false, 0, ""))
15831591
15841592
15851593
15861594 @Callable(i)
15871595 func estimateGetOperationWrapperREADONLY (txId58,pmtAsId,pmtLpAmt,usrAddr) = {
15881596 let r = ego(txId58, pmtAsId, pmtLpAmt, addressFromStringValue(usrAddr))
15891597 $Tuple2(nil, $Tuple10(r._1, r._2, r._3, r._4, r._5, r._6, r._7, toString(r._8), r._9, r._10))
15901598 }
15911599
15921600
15931601 @Verifier(tx)
15941602 func verify () = {
15951603 let targetPublicKey = match m() {
15961604 case pk: ByteVector =>
15971605 pk
15981606 case _: Unit =>
15991607 tx.senderPublicKey
16001608 case _ =>
16011609 throw("Match error")
16021610 }
16031611 match tx {
16041612 case order: Order =>
16051613 let matcherPub = mp()
16061614 let orderValid = validateMatcherOrderAllowed(order)
16071615 let senderValid = sigVerify(order.bodyBytes, order.proofs[0], order.senderPublicKey)
16081616 let matcherValid = sigVerify(order.bodyBytes, order.proofs[1], matcherPub)
16091617 if (if (if (orderValid)
16101618 then senderValid
16111619 else false)
16121620 then matcherValid
16131621 else false)
16141622 then true
16151623 else toe(orderValid, senderValid, matcherValid)
16161624 case s: SetScriptTransaction =>
16171625 if (sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey))
16181626 then true
16191627 else {
16201628 let newHash = blake2b256(value(s.script))
16211629 let allowedHash = fromBase64String(value(getString(fca, keyAllowedLpStableScriptHash())))
16221630 let currentHash = scriptHash(this)
16231631 if ((allowedHash == newHash))
16241632 then (currentHash != newHash)
16251633 else false
16261634 }
16271635 case _ =>
16281636 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
16291637 }
16301638 }
16311639

github/deemru/w8io/026f985 
141.86 ms