tx · 2BUa59N1xymvWugFTNK63gGktUHJTXA2R8eyakw4THF9

3PAd9Aqg3cQSzu26MFYWQYcjSXPVCJtuf5V:  -0.03800000 Waves

2024.02.28 12:12 [4061685] smart account 3PAd9Aqg3cQSzu26MFYWQYcjSXPVCJtuf5V > SELF 0.00000000 Waves

{ "type": 13, "id": "2BUa59N1xymvWugFTNK63gGktUHJTXA2R8eyakw4THF9", "fee": 3800000, "feeAssetId": null, "timestamp": 1709111551953, "version": 2, "chainId": 87, "sender": "3PAd9Aqg3cQSzu26MFYWQYcjSXPVCJtuf5V", "senderPublicKey": "Ajf56x532JLzVoourPv9FW75kYsvScNxztPnt1enhNkS", "proofs": [ "x14viC21J2iF1PAzSr3BgSCJZFphY86wnko6bTsC69LC878zVdf6ZtSS9CQf9RG5jmHteQvhUK3Nad65aA2ZWza", "2ghW9qPt4nq5YdtwuGCNosysLfbJaHJuQsUmH8PAbFyvhfVq33Xxvihw8UEDz3gb7kWuTJ9amWYcZwSwqbpnTzdb" ], "script": "base64:BgKBAQgCEgkKBwgICAEICAgSABIECgIIARIECgIICBIAEgYKBAgICAgSBwoFCAgICAQSBAoCCAgSBAoCCAgSAwoBBBIDCgEEEgcKBQQICAgBEgYKBAQIBAgSCAoGBAgICAQIEgUKAwQICBIDCgEEEgQKAggEEgQKAggEEgMKAQQSAwoBBCMAB2tBeGx5THACB19heGx5TFAAC2F4bHlBZGRyZXNzCQEHQWRkcmVzcwEBGgFXz8h13gt2/Imb93uvCUhEZwkqUEc/D0ItABJheGx5RmFybWluZ0FkZHJlc3MJAQdBZGRyZXNzAQEaAVcNAVmWNRRwmeZc3T47J10TWKW5zTVd5cIAEnJlc2VydmVGdW5kQWRkcmVzcwkBB0FkZHJlc3MBARoBVx7h+0Axa4Hm7EtWGwUsUaGTbt8JsTzSwQALcmVzZXJ2ZUZ1bmQAFAARYWdncmVnYXRvckFkZHJlc3MJAQdBZGRyZXNzAQEaAVedDKrGE1GpbsuA92N9wWR44u9yTagMutMAEXNodXRkb3duV2hpdGVsaXN0CQDMCAIBGgFX1+EjUY58q4ha1dcol3XYiHXTj64jBabhCQDMCAIBGgFXYw0DgaZ/W1TSHLnkKCrzp4A08Ni1jdVlCQDMCAIBGgFXs9WSVEkJmioQ+8b4nxB2q+8/D3KliRWMCQDMCAIBGgFX+Pr6AibAUYvsajtGM0nSHHGwdYv5pMqaCQDMCAIBGgFXq92qIvOYuR9F2CzUp+r5EmKviTZqUDtyCQDMCAIBGgFXMDkc0aRmGDt+f+PY3qL9uGeY/1dNESadBQNuaWwBFnZlcmlmeUxpcXVpZGF0b3JSaWdodHMBB2FkZHJlc3MJAQEhAQMDAwkBAiE9AgUHYWRkcmVzcwkBB0FkZHJlc3MBARoBV5J5PbeylvNhRAX0FRG0E1OUhcEttcf3swkBAiE9AgUHYWRkcmVzcwkBB0FkZHJlc3MBARoBV3eqztF4Vuipnl6rle+/6eFxWHVeMppxgQcJAQIhPQIFB2FkZHJlc3MJAQdBZGRyZXNzAQEaAVfX4SNRjnyriFrV1yiXddiIddOPriMFpuEHCQECIT0CBQdhZGRyZXNzCQEHQWRkcmVzcwEBGgFXq92qIvOYuR9F2CzUp+r5EmKviTZqUDtyBwEUdmVyaWZ5U2VudGluZWxSaWdodHMBB2FkZHJlc3MJAQEhAQMJAQIhPQIFB2FkZHJlc3MFEnJlc2VydmVGdW5kQWRkcmVzcwkBAiE9AgUHYWRkcmVzcwULYXhseUFkZHJlc3MHAQxnZXRSYXRlQ3VydmUBCmFzc2V0SWRTdHIEByRtYXRjaDAFCmFzc2V0SWRTdHIDCQAAAgIsOXdjM0xYTkE0VEVCc1h5S3RvTEU5bXJiREQ3V01IWHZYckNqWnZhYkxBc2kFByRtYXRjaDAJAJYKBACAiXoAwPD1CwCA6JImAIDC1y8DCQAAAgIsSEdnYWJUcVVTOFd0VkZVSnpmbXJURE1nRWNjSnVaTEJQaEZnUUZ4dm5zb1cFByRtYXRjaDAJAJYKBACAiXoAwPD1CwCA6JImAIDC1y8DCQAAAgIsMzROOVljRUVUTFduOTNxWVE2NEVzUDF4ODl0U3J1SlU0NFJyRU1TWFhFUEoFByRtYXRjaDAJAJYKBACAiXoAwPD1CwCA6JImAIDC1y8DCQAAAgIsNlh0SGpwWGJzOVJSSlAyU3I5R1V5VnF6QUNjYnk5VGtUaEhYbmpWQzVDREoFByRtYXRjaDAJAJYKBACAiXoAwPD1CwCA6JImAIDC1y8DCQAAAgIsREcyeEZrUGREd0tVb0JrekdBaFF0THBTR3pmWExpQ1lQRXplS0gyQWQyNHAFByRtYXRjaDAJAJYKBACAiXoAwPD1CwCA6JImAIDC1y8DCQAAAgIsQWpzbzZuVFRqcHR1MlVITHg2aGZTWFZ0SEZ0UkJKQ2tLWWQ1U0F5ajd6ZjUFByRtYXRjaDAJAJYKBACAiXoAgLSJEwCA6JImAICjw0cDCQAAAgIsSEVCOFFhdzl4cldwV3M4dEhzaUFUWUdCV0RCdFAyUzdrY1BBTHJNdTQzQVMFByRtYXRjaDAJAJYKBAAAAIDaxAkAgOiSJgCAtIkTAwkAAAICBVdBVkVTBQckbWF0Y2gwCQCWCgQAgIl6AICHpw4AgOiSJgCA4esXAwkAAAICLEF0cXY1OUVZempGR3VpdEtWbk1SazZIOEZ1a2pvVjNrdFBvcmJFeXMyNW9uBQckbWF0Y2gwCQCWCgQAAACA2sQJAIDokiYAgLSJEwMJAAACAixEU2JiaExzU1RlRGc1THNpdWZrMkFuZWgzRGpWcUp1UHIyTTl1VTFnd3k1cAUHJG1hdGNoMAkAlgoEAAAAgNrECQCA6JImAIDC1y8DCQAAAgIsOHQ0RFBXVHdQenBhdEhBOUFrVHhXQUI0N1RIbll6QnNEbm9ZN2ZRcWJHOTEFByRtYXRjaDAJAJYKBAAAAICHpw4AgOiSJgCAtIkTAwkAAAICLEF0OEQ2TkZGcGhlQ2J2S1ZualZvZUxMODRFbzhOWm42b3ZNYW54ZkxhRldMBQckbWF0Y2gwCQCWCgQAAADA8PULAIDokiYAgLSJEwMJAAACAiw4TFFXOGY3UDVkNVBaTTdHdFpFQmdhcVJQR1N6UzNEZlB1aVhyVVJKNEFKUwUHJG1hdGNoMAkAlgoEAICJegCAh6cOAIDokiYAgOHrFwMJAAACAiw0NzRqVGVZeDJyMlZhMzU3OTR0Q1NjQVhXSkc5aFUySGNneHpNb3dhWlVudQUHJG1hdGNoMAkAlgoEAICJegCAh6cOAIDokiYAgOHrFwMJAAACAiw1VVlCUHBxNFdvVTVuNE13cEZrZ0puVzNGcTRCMXUzdWtwSzMzaWs0UWVyUgUHJG1hdGNoMAkAlgoEAICJegCAh6cOAIDokiYAgOHrFwMJAAACAiwydGhzQUN1SG16RE11TmV6UE0zMndnOWEzQndVekJXRGVTS2FrZ3ozY3cyMQUHJG1hdGNoMAkAlgoEAICJegCAtIkTAIDokiYAgMLXLwMJAAACAitZaU5ib2ZGekMxN2pFSEhDTXdyUmNweTlNcnJqYWJNTUxaeGc4ZzV4bWY3BQckbWF0Y2gwCQCWCgQAgIl6AICHpw4AgOiSJgCA6JImCQCWCgQAAACA2sQJAIDokiYAgOiSJgAGU2NhbGU4AIDC1y8AB1NjYWxlMTAAgMivoCUAB1NjYWxlMTYJAGgCBQZTY2FsZTgFBlNjYWxlOAAJZGF5QmxvY2tzAKALAQpsaUludFRvU3RyAQJsaQoBAWYCBWFjY3VtBG5leHQJAKwCAgkArAICBQVhY2N1bQkApAMBBQRuZXh0AgEsCgACJGwFAmxpCgACJHMJAJADAQUCJGwKAAUkYWNjMAIACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQFmAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhVMaXN0IHNpemUgZXhjZWVkcyAxMDAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUABUAFgAXABgAGQAaABsAHAAdAB4AHwAgACEAIgAjACQAJQAmACcAKAApACoAKwAsAC0ALgAvADAAMQAyADMANAA1ADYANwA4ADkAOgA7ADwAPQA+AD8AQABBAEIAQwBEAEUARgBHAEgASQBKAEsATABNAE4ATwBQAFEAUgBTAFQAVQBWAFcAWABZAFoAWwBcAF0AXgBfAGAAYQBiAGMAZAENdHJ5R2V0SW50ZWdlcgEDa2V5BAckbWF0Y2gwCQCaCAIFBHRoaXMFA2tleQMJAAECBQckbWF0Y2gwAgNJbnQEAWIFByRtYXRjaDAFAWIAAAENdHJ5R2V0Qm9vbGVhbgEDa2V5BAckbWF0Y2gwCQCbCAIFBHRoaXMFA2tleQMJAAECBQckbWF0Y2gwAgdCb29sZWFuBAFiBQckbWF0Y2gwBQFiBwEMdHJ5R2V0U3RyaW5nAQNrZXkEByRtYXRjaDAJAJ0IAgUEdGhpcwUDa2V5AwkAAQIFByRtYXRjaDACBlN0cmluZwQBYgUHJG1hdGNoMAUBYgIAAQx0cnlHZXRCaW5hcnkBA2tleQQHJG1hdGNoMAkAnAgCBQR0aGlzBQNrZXkDCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQBYgUHJG1hdGNoMAUBYgEAAQ5nZXRBc3NldFN0cmluZwEHYXNzZXRJZAQHJG1hdGNoMAUHYXNzZXRJZAMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAFiBQckbWF0Y2gwCQDYBAEFAWICBVdBVkVTAQ1nZXRBc3NldEJ5dGVzAQphc3NldElkU3RyAwkAAAIFCmFzc2V0SWRTdHICBVdBVkVTBQR1bml0CQDZBAEFCmFzc2V0SWRTdHIBCmdldEJhbGFuY2UBCmFzc2V0SWRTdHIDCQAAAgUKYXNzZXRJZFN0cgIFV0FWRVMICQDvBwEFBHRoaXMJYXZhaWxhYmxlCQDwBwIFBHRoaXMJANkEAQUKYXNzZXRJZFN0cgEPZ2V0TWFya2V0QXNzZXRzAAkAtQkCCQEMdHJ5R2V0U3RyaW5nAQIMc2V0dXBfdG9rZW5zAgEsARJnZXRBc3NldHNNYXhTdXBwbHkABAFzCQEMdHJ5R2V0U3RyaW5nAQIPc2V0dXBfbWF4c3VwcGx5AwkAAAIFAXMCAAkAzAgCAP///////////wEJAMwIAgD///////////8BCQDMCAIA////////////AQkAzAgCAP///////////wEJAMwIAgD///////////8BCQDMCAIA////////////AQkAzAgCAP///////////wEFA25pbAkAtQkCBQFzAgEsAQ1nZXRPdXRkYXRlZFVyAQphc3NldElkU3RyBARkb3duCQBrAwkBDXRyeUdldEludGVnZXIBCQCsAgICD3RvdGFsX3N1cHBsaWVkXwUKYXNzZXRJZFN0cgkBDXRyeUdldEludGVnZXIBCQCsAgIFCmFzc2V0SWRTdHICBl9zUmF0ZQUHU2NhbGUxNgMJAAACBQRkb3duAAAAAAkAawMFBlNjYWxlOAkAawMJAQ10cnlHZXRJbnRlZ2VyAQkArAICAg90b3RhbF9ib3Jyb3dlZF8FCmFzc2V0SWRTdHIJAQ10cnlHZXRJbnRlZ2VyAQkArAICBQphc3NldElkU3RyAgZfYlJhdGUFB1NjYWxlMTYFBGRvd24BC2dldEludGVyZXN0AQphc3NldElkU3RyBAJ1cgkBDWdldE91dGRhdGVkVXIBBQphc3NldElkU3RyBAVjdXJ2ZQkBDGdldFJhdGVDdXJ2ZQEFCmFzc2V0SWRTdHIEBHJhdGUJAGQCCAUFY3VydmUCXzEDCQBnAggFBWN1cnZlAl8zBQJ1cgkAawMFAnVyCAUFY3VydmUCXzIIBQVjdXJ2ZQJfMwkAZAIIBQVjdXJ2ZQJfMgkAawMJAGUCBQJ1cggFBWN1cnZlAl8zCAUFY3VydmUCXzQJAGUCAIDC1y8IBQVjdXJ2ZQJfMwkAlgMBCQDMCAIJAGsDBQRyYXRlBQZTY2FsZTgJAGgCBQlkYXlCbG9ja3MA7QIJAMwIAgABBQNuaWwBEHRva2VuUmF0ZXNSZWNhbGMBCmFzc2V0SWRTdHIDCQENdHJ5R2V0Qm9vbGVhbgEJAKwCAgUKYXNzZXRJZFN0cgUHa0F4bHlMcAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQphc3NldElkU3RyAgZfc1JhdGUFB1NjYWxlMTYJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUKYXNzZXRJZFN0cgIGX2JSYXRlBQdTY2FsZTE2CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCmFzc2V0SWRTdHICD19sYXN0UmF0ZUhlaWdodAUGaGVpZ2h0BQNuaWwECGludGVyZXN0CQELZ2V0SW50ZXJlc3QBBQphc3NldElkU3RyBAJ1cgkBDWdldE91dGRhdGVkVXIBBQphc3NldElkU3RyBBBsYXN0UmVjYWxjSGVpZ2h0CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUKYXNzZXRJZFN0cgIPX2xhc3RSYXRlSGVpZ2h0CQENdHJ5R2V0SW50ZWdlcgECDmxhc3RSYXRlSGVpZ2h0BAlsYXN0QlJhdGUJAJYDAQkAzAgCCQENdHJ5R2V0SW50ZWdlcgEJAKwCAgUKYXNzZXRJZFN0cgIGX2JSYXRlCQDMCAIFB1NjYWxlMTYFA25pbAQIbmV3QlJhdGUJAGQCBQlsYXN0QlJhdGUJAGgCCQBlAgUGaGVpZ2h0BRBsYXN0UmVjYWxjSGVpZ2h0BQhpbnRlcmVzdAQJbGFzdFNSYXRlCQCWAwEJAMwIAgkBDXRyeUdldEludGVnZXIBCQCsAgIFCmFzc2V0SWRTdHICBl9zUmF0ZQkAzAgCBQdTY2FsZTE2BQNuaWwECG5ld1NSYXRlCQBkAgUJbGFzdFNSYXRlCQBpAgkAaAIJAGgCCQBlAgUGaGVpZ2h0BRBsYXN0UmVjYWxjSGVpZ2h0CQBrAwUIaW50ZXJlc3QFAnVyBQZTY2FsZTgJAGUCAGQFC3Jlc2VydmVGdW5kAGQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUKYXNzZXRJZFN0cgIGX3NSYXRlBQhuZXdTUmF0ZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQphc3NldElkU3RyAgZfYlJhdGUFCG5ld0JSYXRlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCmFzc2V0SWRTdHICD19sYXN0UmF0ZUhlaWdodAUGaGVpZ2h0BQNuaWwBDWdldEFjdHVhbFJhdGUCCmFzc2V0SWRTdHIIcmF0ZVR5cGUKAQFmAgVhY2N1bQV0b2tlbgQGcmVjYWxjCQEQdG9rZW5SYXRlc1JlY2FsYwEFBXRva2VuCQCUCgID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BQVyYXRlcwABBXZhbHVlBQdTY2FsZTE2BQRkb3duARVnZXRUb2tlblByaWNlV2l0aFJpc2sCCmFzc2V0SWRTdHIMcmlza0F2ZXJzaXR5AwMJAAACBQphc3NldElkU3RyAiw5d2MzTFhOQTRURUJzWHlLdG9MRTltcmJERDdXTUhYdlhyQ2padmFiTEFzaQYJAAACBQphc3NldElkU3RyAixIR2dhYlRxVVM4V3RWRlVKemZtclRETWdFY2NKdVpMQlBoRmdRRnh2bnNvVwkAlAoCAMCEPQDAhD0EBXByaWNlCQERQGV4dHJOYXRpdmUoMTA1MCkCCQEHQWRkcmVzcwEBGgFXSWbQy/OK9Vd6rfwhb3HFW4mIK9CBs7F/CQCsAgIFCmFzc2V0SWRTdHICB190d2FwNUIECXJpc2tMZXZlbAkBEUBleHRyTmF0aXZlKDEwNTApAgkBB0FkZHJlc3MBARoBV0lm0MvzivVXeq38IW9xxVuJiCvQgbOxfwkArAICBQphc3NldElkU3RyAgpfcmlza0xldmVsAwkBDXRyeUdldEJvb2xlYW4BCQCsAgIFCmFzc2V0SWRTdHIFB2tBeGx5THAEAXAKAAFACQD9BwQFC2F4bHlBZGRyZXNzAhpnZXRTaGFyZUFzc2V0UHJpY2VSRUFET05MWQkAzAgCBQphc3NldElkU3RyBQNuaWwFA25pbAMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQDCQAAAgUBcAUBcAkAlAoCBQFwBQFwCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAwkAZwIFDHJpc2tBdmVyc2l0eQUJcmlza0xldmVsCQCUCgIFBXByaWNlBQVwcmljZQkAAgEJAKwCAgkArAICAhtvcmFjbGUgcHJpY2VzIGRvbid0IG1hdGNoOiAJAKQDAQUFcHJpY2UCIyBpcyB0aGUgcHJpY2UsIGJ1dCByaXNrIGlzIHRvbyBoaWdoAQ1nZXRUb2tlblByaWNlAQphc3NldElkU3RyCQEVZ2V0VG9rZW5QcmljZVdpdGhSaXNrAgUKYXNzZXRJZFN0cgABAQ5jYWxjQXNzZXRTY2FsZQEKYXNzZXRJZFN0cgQIZGVjaW1hbHMDCQAAAgUKYXNzZXRJZFN0cgIFV0FWRVMACAgJAQV2YWx1ZQEJAOwHAQkA2QQBBQphc3NldElkU3RyCGRlY2ltYWxzCQBsBgAKAAAFCGRlY2ltYWxzAAAAAAUERE9XTgEOc3VwcGx5SW50ZXJuYWwDCmFzc2V0SWRTdHILYXNzZXRBbW91bnQHYWRkcmVzcwMJAQEhAQkBDXRyeUdldEJvb2xlYW4BAgxzZXR1cF9hY3RpdmUJAAIBAhFtYXJrZXQgaXMgc3RvcHBlZAQLJHQwODUzNzg2MTIJARVnZXRBY3R1YWxSYXRlT25lVG9rZW4CBQphc3NldElkU3RyAgVzUmF0ZQQFc1JhdGUIBQskdDA4NTM3ODYxMgJfMQQRcmF0ZXNSZWNhbGNSZXN1bHQIBQskdDA4NTM3ODYxMgJfMgQGYW1vdW50CQBuBAULYXNzZXRBbW91bnQFB1NjYWxlMTYFBXNSYXRlBQRET1dOBAltYXhTdXBwbHkEByRtYXRjaDAJAKIIAQkArAICAhBzZXR1cF9tYXhTdXBwbHlfBQphc3NldElkU3RyAwkAAQIFByRtYXRjaDACBlN0cmluZwQBeAUHJG1hdGNoMAkBDXBhcnNlSW50VmFsdWUBBQF4AAAECmFzc2V0UHJpY2UJAQ1nZXRUb2tlblByaWNlAQUKYXNzZXRJZFN0cgQQbmV3VG90YWxTdXBwbGllZAkAZAIJAQ10cnlHZXRJbnRlZ2VyAQkArAICCQCsAgIFB2FkZHJlc3MCCl9zdXBwbGllZF8FCmFzc2V0SWRTdHIFBmFtb3VudAQEcmF0ZQUFc1JhdGUECmFzc2V0U2NhbGUJAQ5jYWxjQXNzZXRTY2FsZQEFCmFzc2V0SWRTdHIEE25ld1RvdGFsU3VwcGxpZWRVc2QJAGsDCQBrAwUQbmV3VG90YWxTdXBwbGllZAUEcmF0ZQUHU2NhbGUxNggFCmFzc2V0UHJpY2UCXzEFCmFzc2V0U2NhbGUDCQAAAgkAswkCCQEMdHJ5R2V0U3RyaW5nAQIMc2V0dXBfdG9rZW5zBQphc3NldElkU3RyBQR1bml0CQACAQIpdGhpcyBhc3NldCBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBtYXJrZXQDAwkBAiE9AgUJbWF4U3VwcGx5AAAJAGYCBRNuZXdUb3RhbFN1cHBsaWVkVXNkBQltYXhTdXBwbHkHCQACAQIzbWF4IHRvdGFsIHN1cHBseSBmb3IgdGhpcyB0b2tlbiByZWFjaGVkIGluIHRoZSBwb29sBAhhc3NldE51bQkBBXZhbHVlAQkAzwgCCQEPZ2V0TWFya2V0QXNzZXRzAAUKYXNzZXRJZFN0cgkAlAoCCQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICBQdhZGRyZXNzAgpfc3VwcGxpZWRfBQphc3NldElkU3RyBRBuZXdUb3RhbFN1cHBsaWVkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgICD3RvdGFsX3N1cHBsaWVkXwUKYXNzZXRJZFN0cgkAZAIJAQ10cnlHZXRJbnRlZ2VyAQkArAICAg90b3RhbF9zdXBwbGllZF8FCmFzc2V0SWRTdHIFBmFtb3VudAUDbmlsCQDMCAIJAJEDAgURcmF0ZXNSZWNhbGNSZXN1bHQAAAkAzAgCCQCRAwIFEXJhdGVzUmVjYWxjUmVzdWx0AAEJAMwIAgkAkQMCBRFyYXRlc1JlY2FsY1Jlc3VsdAACBQNuaWwJAJQKAgULYXNzZXRBbW91bnQFE25ld1RvdGFsU3VwcGxpZWRVc2QBDmJvcnJvd0ludGVybmFsAwphc3NldElkU3RyC2Fzc2V0QW1vdW50B2FkZHJlc3MECyR0MDk5MjA5OTk1CQEVZ2V0QWN0dWFsUmF0ZU9uZVRva2VuAgUKYXNzZXRJZFN0cgIFYlJhdGUEBWJSYXRlCAULJHQwOTkyMDk5OTUCXzEEEXJhdGVzUmVjYWxjUmVzdWx0CAULJHQwOTkyMDk5OTUCXzIEBmFtb3VudAkAbgQFC2Fzc2V0QW1vdW50BQdTY2FsZTE2BQViUmF0ZQUHQ0VJTElORwMJAQEhAQkBDXRyeUdldEJvb2xlYW4BAgxzZXR1cF9hY3RpdmUJAAIBAhFtYXJrZXQgaXMgc3RvcHBlZAMJAQ10cnlHZXRCb29sZWFuAQkArAICBQphc3NldElkU3RyBQdrQXhseUxwCQACAQIddGhpcyB0b2tlbiBjYW5ub3QgYmUgYm9ycm93ZWQEDWFzc2V0U3VwcGxpZWQJAQ10cnlHZXRJbnRlZ2VyAQkArAICAg90b3RhbF9zdXBwbGllZF8FCmFzc2V0SWRTdHIEDWFzc2V0Qm9ycm93ZWQJAQ10cnlHZXRJbnRlZ2VyAQkArAICAg90b3RhbF9ib3Jyb3dlZF8FCmFzc2V0SWRTdHIEEXVzZXJBc3NldEJvcnJvd2VkCQENdHJ5R2V0SW50ZWdlcgEJAKwCAgkArAICBQdhZGRyZXNzAgpfYm9ycm93ZWRfBQphc3NldElkU3RyBAphc3NldFNjYWxlCQEOY2FsY0Fzc2V0U2NhbGUBBQphc3NldElkU3RyBAphc3NldFByaWNlCQENZ2V0VG9rZW5QcmljZQEFCmFzc2V0SWRTdHIEDmFzc2V0QW1vdW50VXNkCQBrAwUGYW1vdW50CAUKYXNzZXRQcmljZQJfMQUKYXNzZXRTY2FsZQMJAGYCBQZhbW91bnQJAGUCBQ1hc3NldFN1cHBsaWVkBQ1hc3NldEJvcnJvd2VkCQACAQIcdGhpcyBhbW91bnQgaXMgbm90IGF2YWlsYWJsZQQIYXNzZXROdW0JAQV2YWx1ZQEJAM8IAgkBD2dldE1hcmtldEFzc2V0cwAFCmFzc2V0SWRTdHIJAJQKAgkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgUHYWRkcmVzcwIKX2JvcnJvd2VkXwUKYXNzZXRJZFN0cgkAZAIFEXVzZXJBc3NldEJvcnJvd2VkBQZhbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgIPdG90YWxfYm9ycm93ZWRfBQphc3NldElkU3RyCQBkAgUNYXNzZXRCb3Jyb3dlZAUGYW1vdW50BQNuaWwJAMwIAgkAkQMCBRFyYXRlc1JlY2FsY1Jlc3VsdAAACQDMCAIJAJEDAgURcmF0ZXNSZWNhbGNSZXN1bHQAAQkAzAgCCQCRAwIFEXJhdGVzUmVjYWxjUmVzdWx0AAIFA25pbAkAlAoCBQthc3NldEFtb3VudAUOYXNzZXRBbW91bnRVc2QUAWkBDWZsYXNoUG9zaXRpb24HBHVzZXILc0Fzc2V0SWRTdHILYkFzc2V0SWRTdHIHYkFtb3VudA9jYWxsYmFja0FkZHJlc3MQY2FsbGJhY2tGdW5jdGlvbgxjYWxsYmFja0FyZ3MDCQECIT0CCAUBaQZjYWxsZXIFC2F4bHlBZGRyZXNzCQACAQIgYXZhaWxhYmxlIG9ubHkgZm9yIEF4bHkgcHJvdG9jb2wECWJvcnJvd1JlcwkBDmJvcnJvd0ludGVybmFsAwULYkFzc2V0SWRTdHIFB2JBbW91bnQFBHVzZXIECGJBc3NldElkCQENZ2V0QXNzZXRCeXRlcwEFC2JBc3NldElkU3RyBAhjYWxsYmFjawkA/QcECQERQGV4dHJOYXRpdmUoMTA2MikBBQ9jYWxsYmFja0FkZHJlc3MFEGNhbGxiYWNrRnVuY3Rpb24JALUJAgUMY2FsbGJhY2tBcmdzAgEsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQhiQXNzZXRJZAUHYkFtb3VudAUDbmlsAwkAAAIFCGNhbGxiYWNrBQhjYWxsYmFjawQHc0Ftb3VudAoAAUAFCGNhbGxiYWNrAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAMJAAACBQdzQW1vdW50BQdzQW1vdW50BAlzdXBwbHlSZXMJAQ5zdXBwbHlJbnRlcm5hbAMFC3NBc3NldElkU3RyBQdzQW1vdW50BQR1c2VyAwkAZgIICAUJYm9ycm93UmVzAl8yAl8yCAgFCXN1cHBseVJlcwJfMgJfMgkAAgECHm5vdCBlbm91Z2ggY29sbGF0ZXJhbCBwcm92aWRlZAkAzggCCAUJYm9ycm93UmVzAl8xCAUJc3VwcGx5UmVzAl8xCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBBnN1cHBseQADAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwABBgkAAAIICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50AAAJAAIBAhwxIHBheW1lbnQgaGFzIHRvIGJlIGF0dGFjaGVkBAphc3NldElkU3RyCQEOZ2V0QXNzZXRTdHJpbmcBCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQEC2Fzc2V0QW1vdW50CAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAMJAQ10cnlHZXRCb29sZWFuAQkArAICBQphc3NldElkU3RyBQdrQXhseUxwCQACAQITWW91IGNhbid0IHN1cHBseSBscAQKYXhseU5vdGlmeQkA/AcEBRJheGx5RmFybWluZ0FkZHJlc3MCCmxlbmRBY3Rpb24JAMwIAgkApQgBCAUBaQZjYWxsZXIJAMwIAgUKYXNzZXRJZFN0cgUDbmlsBQNuaWwDCQAAAgUKYXhseU5vdGlmeQUKYXhseU5vdGlmeQkBDnN1cHBseUludGVybmFsAwUKYXNzZXRJZFN0cgULYXNzZXRBbW91bnQJAKUIAQgFAWkGY2FsbGVyCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCHdpdGhkcmF3Agphc3NldElkU3RyC2Fzc2V0QW1vdW50BA0kdDAxMjYwNDEyNjc5CQEVZ2V0QWN0dWFsUmF0ZU9uZVRva2VuAgUKYXNzZXRJZFN0cgIFc1JhdGUEBXNSYXRlCAUNJHQwMTI2MDQxMjY3OQJfMQQRcmF0ZXNSZWNhbGNSZXN1bHQIBQ0kdDAxMjYwNDEyNjc5Al8yBAZhbW91bnQJAG4EBQthc3NldEFtb3VudAUHU2NhbGUxNgUFc1JhdGUFB0NFSUxJTkcEB2FkZHJlc3MJAKUIAQgFAWkGY2FsbGVyBA1hc3NldFN1cHBsaWVkCQENdHJ5R2V0SW50ZWdlcgEJAKwCAgIPdG90YWxfc3VwcGxpZWRfBQphc3NldElkU3RyBA1hc3NldEJvcnJvd2VkCQENdHJ5R2V0SW50ZWdlcgEJAKwCAgIPdG90YWxfYm9ycm93ZWRfBQphc3NldElkU3RyBBF1c2VyQXNzZXRTdXBwbGllZAkBDXRyeUdldEludGVnZXIBCQCsAgIJAKwCAgUHYWRkcmVzcwIKX3N1cHBsaWVkXwUKYXNzZXRJZFN0cgQKYXhseU5vdGlmeQkA/AcEBRJheGx5RmFybWluZ0FkZHJlc3MCCmxlbmRBY3Rpb24JAMwIAgkApQgBCAUBaQZjYWxsZXIJAMwIAgUKYXNzZXRJZFN0cgUDbmlsBQNuaWwDCQAAAgUKYXhseU5vdGlmeQUKYXhseU5vdGlmeQQSY29sbGF0ZXJhbFZhbHVlSW52CQD8BwQFBHRoaXMCE2dldFVzZXJDb2xsYXRlcmFsVjIJAMwIAgcJAMwIAgUHYWRkcmVzcwkAzAgCBQphc3NldElkU3RyCQDMCAICAAkAzAgCBwkAzAgCCQCsAgICCXN1cHBsaWVkLAkApAMBCQEBLQEFBmFtb3VudAUDbmlsBQNuaWwDCQAAAgUSY29sbGF0ZXJhbFZhbHVlSW52BRJjb2xsYXRlcmFsVmFsdWVJbnYED2NvbGxhdGVyYWxWYWx1ZQQHJG1hdGNoMAUSY29sbGF0ZXJhbFZhbHVlSW52AwkAAQIFByRtYXRjaDACA0ludAQBeAUHJG1hdGNoMAUBeAkAAgECH2Nhbid0IGdldCB1c2VyIGNvbGxhdGVyYWwgdmFsdWUDCQEBIQEJAQ10cnlHZXRCb29sZWFuAQIMc2V0dXBfYWN0aXZlCQACAQIRbWFya2V0IGlzIHN0b3BwZWQDCQBmAgAABQ9jb2xsYXRlcmFsVmFsdWUJAAIBAjJ5b3UgZG9udCBoYXZlIGVub3VnaCBjb2xsYXRlcmFsIGZvciB0aGlzIG9wZXJhdGlvbgMJAGYCBQZhbW91bnQJAGUCBQ1hc3NldFN1cHBsaWVkBQ1hc3NldEJvcnJvd2VkCQACAQIqdGhpcyBhbW91bnQgaXMgbm90IGF2YWlsYWJsZSBvbiB0aGUgbWFya2V0AwkAZgIFBmFtb3VudAURdXNlckFzc2V0U3VwcGxpZWQJAAIBAip0aGlzIGFtb3VudCBpcyBub3QgYXZhaWxhYmxlIG9uIHRoZSBtYXJrZXQJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIFB2FkZHJlc3MCCl9zdXBwbGllZF8FCmFzc2V0SWRTdHIJAGUCCQENdHJ5R2V0SW50ZWdlcgEJAKwCAgkArAICBQdhZGRyZXNzAgpfc3VwcGxpZWRfBQphc3NldElkU3RyBQZhbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgIPdG90YWxfc3VwcGxpZWRfBQphc3NldElkU3RyCQBlAgkBDXRyeUdldEludGVnZXIBCQCsAgICD3RvdGFsX3N1cHBsaWVkXwUKYXNzZXRJZFN0cgUGYW1vdW50CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgULYXNzZXRBbW91bnQJAQ1nZXRBc3NldEJ5dGVzAQUKYXNzZXRJZFN0cgUDbmlsBRFyYXRlc1JlY2FsY1Jlc3VsdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQhyZXBheUZvcgIHYWRkcmVzcwRscElkAwkBASEBCQENdHJ5R2V0Qm9vbGVhbgECDHNldHVwX2FjdGl2ZQkAAgECEW1hcmtldCBpcyBzdG9wcGVkAwkBASEBCQEUdmVyaWZ5U2VudGluZWxSaWdodHMBCAUBaQZjYWxsZXIJAAIBAhxhdmFpbGFibGUgb25seSBmb3Igd2hpdGVsaXN0AwkAAAIFB2FkZHJlc3MCBmdsb2JhbAkAAgECIHlvdSBjYW4ndCByZXBheSBmb3IgZXZlcnlvbmUgOl8pAwMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQYJAAACCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAAACQACAQIcMSBwYXltZW50IGhhcyB0byBiZSBhdHRhY2hlZAMJAQEhAQkBDXRyeUdldEJvb2xlYW4BCQCsAgIFBGxwSWQFB2tBeGx5THAJAAIBAgtXcm9uZyBscCBpZAQKYXNzZXRJZFN0cgkBDmdldEFzc2V0U3RyaW5nAQgJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBAthc3NldEFtb3VudAgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQEDSR0MDE0NzE5MTQ3OTQJARVnZXRBY3R1YWxSYXRlT25lVG9rZW4CBQphc3NldElkU3RyAgViUmF0ZQQFYlJhdGUIBQ0kdDAxNDcxOTE0Nzk0Al8xBBFyYXRlc1JlY2FsY1Jlc3VsdAgFDSR0MDE0NzE5MTQ3OTQCXzIEBmFtb3VudAkAbgQFC2Fzc2V0QW1vdW50BQdTY2FsZTE2BQViUmF0ZQUHQ0VJTElORwQNYXNzZXRTdXBwbGllZAkBDXRyeUdldEludGVnZXIBCQCsAgICD3RvdGFsX3N1cHBsaWVkXwUKYXNzZXRJZFN0cgQNYXNzZXRCb3Jyb3dlZAkBDXRyeUdldEludGVnZXIBCQCsAgICD3RvdGFsX2JvcnJvd2VkXwUKYXNzZXRJZFN0cgQRdXNlckFzc2V0Qm9ycm93ZWQJAQ10cnlHZXRJbnRlZ2VyAQkArAICCQCsAgIFB2FkZHJlc3MCCl9ib3Jyb3dlZF8FCmFzc2V0SWRTdHIECmFtb3VudExlZnQJAGUCBRF1c2VyQXNzZXRCb3Jyb3dlZAUGYW1vdW50BAtyZXBheUFtb3VudAMJAGcCBQphbW91bnRMZWZ0AAAFBmFtb3VudAURdXNlckFzc2V0Qm9ycm93ZWQEEWV4dHJhQW1vdW50UmVzdWx0AwkAZwIFCmFtb3VudExlZnQAAAUDbmlsCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgkBAS0BBQphbW91bnRMZWZ0CAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQFA25pbAQOd2l0aGRyYXdSZXN1bHQDCQAAAggFAWkGY2FsbGVyBQtheGx5QWRkcmVzcwQMdXNlclN1cHBsaWVkCQENdHJ5R2V0SW50ZWdlcgEJAKwCAgkArAICBQdhZGRyZXNzAgpfc3VwcGxpZWRfBQRscElkAwkAZgIFDHVzZXJTdXBwbGllZAAACQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgUHYWRkcmVzcwIKX3N1cHBsaWVkXwUEbHBJZAAACQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgICD3RvdGFsX3N1cHBsaWVkXwUEbHBJZAkAZQIJAQ10cnlHZXRJbnRlZ2VyAQkArAICAg90b3RhbF9zdXBwbGllZF8FBGxwSWQFDHVzZXJTdXBwbGllZAUDbmlsBQNuaWwFA25pbAMJAAACCQCzCQIJAQx0cnlHZXRTdHJpbmcBAgxzZXR1cF90b2tlbnMFCmFzc2V0SWRTdHIFBHVuaXQJAAIBAil0aGlzIGFzc2V0IGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIG1hcmtldAkAzggCCQDOCAIJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIFB2FkZHJlc3MCCl9ib3Jyb3dlZF8FCmFzc2V0SWRTdHIJAGUCBRF1c2VyQXNzZXRCb3Jyb3dlZAULcmVwYXlBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgIPdG90YWxfYm9ycm93ZWRfBQphc3NldElkU3RyCQBlAgUNYXNzZXRCb3Jyb3dlZAULcmVwYXlBbW91bnQFA25pbAURcmF0ZXNSZWNhbGNSZXN1bHQFEWV4dHJhQW1vdW50UmVzdWx0BQ53aXRoZHJhd1Jlc3VsdAFpARNhZGRJbnRlcmVzdEVYVEVSTkFMAAQGYW1vdW50CQBrAwgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQAUABkBAdhc3NldElkCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQECmFzc2V0SWRTdHIJAQ5nZXRBc3NldFN0cmluZwEFB2Fzc2V0SWQEBmVhcm5lZAkBDXRyeUdldEludGVnZXIBCQCsAgICFWF1dG9zdGFrZV9sYXN0RWFybmVkXwUKYXNzZXRJZFN0cgQKbGFzdEhlaWdodAkBDXRyeUdldEludGVnZXIBCQCsAgICFGF1dG9zdGFrZV9sYXN0QmxvY2tfBQphc3NldElkU3RyBAxzdGF0ZUNoYW5nZXMDAwkAAAIFCmxhc3RIZWlnaHQFBmhlaWdodAYJAAACBQZhbW91bnQAAAUDbmlsCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgICGGF1dG9zdGFrZV9wcmVMYXN0RWFybmVkXwUKYXNzZXRJZFN0cgUGZWFybmVkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgICF2F1dG9zdGFrZV9wcmVMYXN0QmxvY2tfBQphc3NldElkU3RyBQpsYXN0SGVpZ2h0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgICFWF1dG9zdGFrZV9sYXN0RWFybmVkXwUKYXNzZXRJZFN0cgkAZAIFBmVhcm5lZAUGYW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgICFGF1dG9zdGFrZV9sYXN0QmxvY2tfBQphc3NldElkU3RyBQZoZWlnaHQFA25pbAkAzggCBQxzdGF0ZUNoYW5nZXMJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUKYXNzZXRJZFN0cgIGX3NSYXRlCQBkAgkBDXRyeUdldEludGVnZXIBCQCsAgIFCmFzc2V0SWRTdHICBl9zUmF0ZQkAawMFB1NjYWxlMTYFBmFtb3VudAkBDXRyeUdldEludGVnZXIBCQCsAgICD3RvdGFsX3N1cHBsaWVkXwUKYXNzZXRJZFN0cgUDbmlsAWkBB3ByZUluaXQEBnRva2VucwRsdHZzA2x0cwlwZW5hbHRpZXMKAQFmAgVhY2N1bQV0b2tlbgkAzggCBQVhY2N1bQkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQV0b2tlbgIGX2JSYXRlBQdTY2FsZTE2CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBXRva2VuAgZfc1JhdGUFB1NjYWxlMTYFA25pbAMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECCmFkbWluIG9ubHkEBXJhdGVzCgACJGwJALUJAgUGdG9rZW5zAgEsCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQFmAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMgkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAkAzggCCQDMCAIJAQtTdHJpbmdFbnRyeQICDHNldHVwX3Rva2VucwUGdG9rZW5zCQDMCAIJAQtTdHJpbmdFbnRyeQICCnNldHVwX2x0dnMFBGx0dnMJAMwIAgkBC1N0cmluZ0VudHJ5AgIJc2V0dXBfbHRzBQNsdHMJAMwIAgkBC1N0cmluZ0VudHJ5AgIPc2V0dXBfcGVuYWx0aWVzBQlwZW5hbHRpZXMJAMwIAgkBDEJvb2xlYW5FbnRyeQICDHNldHVwX2FjdGl2ZQYFA25pbAUFcmF0ZXMBaQEMaW5pdE5ld1Rva2VuBQV0b2tlbgNsdHYCbHQHcGVuYWx0eQlpc0xwVG9rZW4DAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQECIT0CCAUBaQZjYWxsZXIJAQdBZGRyZXNzAQEaAVcUeViFwPoaZ+cUNI0M98TwbUXt9hz5PUEHCQACAQIKYWRtaW4gb25seQQHbHBFbnRyeQMFCWlzTHBUb2tlbgkAzAgCCQEMQm9vbGVhbkVudHJ5AgkArAICBQV0b2tlbgIHX2F4bHlMcAYFA25pbAUDbmlsCQDOCAIJAMwIAgkBC1N0cmluZ0VudHJ5AgIMc2V0dXBfdG9rZW5zCQCsAgIJAKwCAgkBDHRyeUdldFN0cmluZwECDHNldHVwX3Rva2VucwIBLAUFdG9rZW4JAMwIAgkBC1N0cmluZ0VudHJ5AgIKc2V0dXBfbHR2cwkArAICCQCsAgIJAQx0cnlHZXRTdHJpbmcBAgpzZXR1cF9sdHZzAgEsBQNsdHYJAMwIAgkBC1N0cmluZ0VudHJ5AgIJc2V0dXBfbHRzCQCsAgIJAKwCAgkBDHRyeUdldFN0cmluZwECCXNldHVwX2x0cwIBLAUCbHQJAMwIAgkBC1N0cmluZ0VudHJ5AgIPc2V0dXBfcGVuYWx0aWVzCQCsAgIJAKwCAgkBDHRyeUdldFN0cmluZwECD3NldHVwX3BlbmFsdGllcwIBLAUHcGVuYWx0eQkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQV0b2tlbgIGX2JSYXRlBQdTY2FsZTE2CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBXRva2VuAgZfc1JhdGUFB1NjYWxlMTYJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUFdG9rZW4CD19sYXN0UmF0ZUhlaWdodAUGaGVpZ2h0BQNuaWwFB2xwRW50cnkBaQEPdXBkYXRlUGFyYW1ldGVyAgNrZXkDdmFsAwMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkBAiE9AggFAWkGY2FsbGVyCQEHQWRkcmVzcwEBGgFXFHlYhcD6GmfnFDSNDPfE8G1F7fYc+T1BBwkAAgECCmFkbWluIG9ubHkJAMwIAgkBDEludGVnZXJFbnRyeQIFA2tleQkBDXBhcnNlSW50VmFsdWUBBQN2YWwFA25pbAFpAQx1cGRhdGVTdHJpbmcCA2tleQN2YWwDAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQECIT0CCAUBaQZjYWxsZXIJAQdBZGRyZXNzAQEaAVcUeViFwPoaZ+cUNI0M98TwbUXt9hz5PUEHCQACAQIKYWRtaW4gb25seQkAzAgCCQELU3RyaW5nRW50cnkCBQNrZXkFA3ZhbAUDbmlsAWkBEmNsYWltVG9SZXNlcnZlRnVuZAEFZGVidWcEBmFzc2V0cwkBD2dldE1hcmtldEFzc2V0cwAEBXJhdGVzCAkBDWdldEFjdHVhbFJhdGUCCQCRAwIFBmFzc2V0cwAAAgVzUmF0ZQJfMgoBAWYCAWEKYXNzZXRJZFN0cgQNJHQwMTkxNDUxOTE5NQUBYQQFYWNjdW0IBQ0kdDAxOTE0NTE5MTk1Al8xBAFuCAUNJHQwMTkxNDUxOTE5NQJfMgQPYXV0b3N0YWtlQW1vdW50CQEMdHJ5R2V0U3RyaW5nAQkArAICAhFhdXRvc3Rha2VfYW1vdW50XwUKYXNzZXRJZFN0cgQGYW1vdW50CQBlAgkAZAIJAGQCCQBkAgkBCmdldEJhbGFuY2UBBQphc3NldElkU3RyCQENdHJ5R2V0SW50ZWdlcgEJAKwCAgIRYXV0b3N0YWtlX2Ftb3VudF8FCmFzc2V0SWRTdHIDCQECIT0CBQ9hdXRvc3Rha2VBbW91bnQCAAkBDXBhcnNlSW50VmFsdWUBBQ9hdXRvc3Rha2VBbW91bnQAAAkAawMJAQ10cnlHZXRJbnRlZ2VyAQkArAICAg90b3RhbF9ib3Jyb3dlZF8FCmFzc2V0SWRTdHIICQCRAwIFBXJhdGVzCQBkAgkAaAIFAW4AAwABBXZhbHVlBQdTY2FsZTE2CQBrAwkBDXRyeUdldEludGVnZXIBCQCsAgICD3RvdGFsX3N1cHBsaWVkXwUKYXNzZXRJZFN0cggJAJEDAgUFcmF0ZXMJAGgCBQFuAAMFdmFsdWUFB1NjYWxlMTYEA2ludgMJAGYCCQENdHJ5R2V0SW50ZWdlcgEJAKwCAgIRYXV0b3N0YWtlX2Ftb3VudF8FCmFzc2V0SWRTdHIAAAkA/AcEBQR0aGlzAgx1bnN0YWtlVG9rZW4JAMwIAgUKYXNzZXRJZFN0cgkAzAgCCQCWAwEJAMwIAgUGYW1vdW50CQDMCAIAAAUDbmlsBQNuaWwFA25pbAAAAwkAAAIFA2ludgUDaW52CQCUCgIJAM4IAgUFYWNjdW0JAMwIAgUGYW1vdW50BQNuaWwJAGQCBQFuAAEJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4ECXBhcmFtZXRlcggKAAIkbAUGYXNzZXRz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CQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAAVABYAFwAYABkAGgAbABwAHQAeAB8AIAAhACIAIwAkACUAJgAnACgAKQAqACsALAAtAC4ALwAwADEAMgAzADQANQA2ADcAOAA5ADoAOwA8AD0APgA/AEAAQQBCAEMARABFAEYARwBIAEkASgBLAEwATQBOAE8AUABRAFIAUwBUAFUAVgBXAFgAWQBaAFsAXABdAF4AXwBgAGEAYgBjAGQFCXBhcmFtZXRlcgJfMQFpAQhzaHV0ZG93bgEIc2h1dGRvd24DCQAAAgkAzwgCBRFzaHV0ZG93bldoaXRlbGlzdAgIBQFpBmNhbGxlcgVieXRlcwUEdW5pdAkAAgECF3VzZXIgbm90IGluIGEgd2hpdGVsaXN0CQDMCAIJAQxCb29sZWFuRW50cnkCAgxzZXR1cF9hY3RpdmUJAQEhAQUIc2h1dGRvd24FA25pbAFpAQtsaXF1aWRhdGVWMgUFZGVidWcHYWRkcmVzcwtzQXNzZXRJZFN0cgtiQXNzZXRJZFN0chBsaXF1aWRhdGVQZXJjZW50AwkBASEBCQEWdmVyaWZ5TGlxdWlkYXRvclJpZ2h0cwEIBQFpBmNhbGxlcgkAAgECHGF2YWlsYWJsZSBmb3Igd2hpdGVsaXN0IG9ubHkDCQEBIQEJAQ10cnlHZXRCb29sZWFuAQIMc2V0dXBfYWN0aXZlCQACAQIRbWFya2V0IGlzIHN0b3BwZWQEEmNvbGxhdGVyYWxWYWx1ZUludgkA/AcEBQR0aGlzAhNnZXRVc2VyQ29sbGF0ZXJhbFYyCQDMCAIHCQDMCAIFB2FkZHJlc3MJAMwIAgULc0Fzc2V0SWRTdHIJAMwIAgULYkFzc2V0SWRTdHIJAMwIAgYJAMwIAgIABQNuaWwFA25pbAMJAAACBRJjb2xsYXRlcmFsVmFsdWVJbnYFEmNvbGxhdGVyYWxWYWx1ZUludgQOdXNlckNvbGxhdGVyYWwEByRtYXRjaDAFEmNvbGxhdGVyYWxWYWx1ZUludgMJAAECBQckbWF0Y2gwAgNJbnQEAXgFByRtYXRjaDAFAXgJAAIBAh9jYW4ndCBnZXQgdXNlciBjb2xsYXRlcmFsIHZhbHVlBBBjdXJyZW50U1Bvc2l0aW9uCQENdHJ5R2V0SW50ZWdlcgEJAKwCAgkArAICBQdhZGRyZXNzAgpfc3VwcGxpZWRfBQtzQXNzZXRJZFN0cgQQY3VycmVudEJQb3NpdGlvbgkBDXRyeUdldEludGVnZXIBCQCsAgIJAKwCAgUHYWRkcmVzcwIKX2JvcnJvd2VkXwULYkFzc2V0SWRTdHIDCQEBIQEJAQ10cnlHZXRCb29sZWFuAQkArAICBQtzQXNzZXRJZFN0cgUHa0F4bHlMcAkAAgECDndyb25nIGxwIGFzc2V0AwkAZwIAAAUQY3VycmVudEJQb3NpdGlvbgkAAgECIHVzZXIgaGFzIG5vIGJvcnJvdyBpbiB0aGlzIHRva2VuAwMJAGYCBQ51c2VyQ29sbGF0ZXJhbAAABgkAAAIFEGN1cnJlbnRCUG9zaXRpb24AAAkAAgECGHVzZXIgY2FuJ3QgYmUgbGlxdWlkYXRlZAQIYkFzc2V0SWQJAQ1nZXRBc3NldEJ5dGVzAQULYkFzc2V0SWRTdHIEDG1hcmtldEFzc2V0cwkBD2dldE1hcmtldEFzc2V0cwAECWFzc2V0MU51bQkBBXZhbHVlAQkAzwgCBQxtYXJrZXRBc3NldHMFC2JBc3NldElkU3RyBAlhc3NldDBOdW0JAQV2YWx1ZQEJAM8IAgUMbWFya2V0QXNzZXRzBQtzQXNzZXRJZFN0cgQHcGVuYWx0eQkBDXBhcnNlSW50VmFsdWUBCQEFdmFsdWUBCQCRAwIJALUJAgkBDHRyeUdldFN0cmluZwECD3NldHVwX3BlbmFsdGllcwIBLAUJYXNzZXQxTnVtBA0kdDAyMTc2MzIxODMzCQEVZ2V0QWN0dWFsUmF0ZU9uZVRva2VuAgULYkFzc2V0SWRTdHICBWJSYXRlBAViUmF0ZQgFDSR0MDIxNzYzMjE4MzMCXzEEC3JhdGVzUmVzdWx0CAUNJHQwMjE3NjMyMTgzMwJfMgQHYkFtb3VudAkAawMFEGN1cnJlbnRCUG9zaXRpb24FBWJSYXRlBQdTY2FsZTE2BAdsQW1vdW50CQBrAwUHYkFtb3VudAUQbGlxdWlkYXRlUGVyY2VudABkBBJsQW1vdW50V2l0aFBlbmFsdHkJAGsDBQdsQW1vdW50CQBkAgUGU2NhbGU4BQdwZW5hbHR5BQZTY2FsZTgECGxiQW1vdW50CQBrAwUHbEFtb3VudAUHU2NhbGUxNgUFYlJhdGUEBXBvc0lkCQCRAwIJALUJAgUHYWRkcmVzcwIBXwABBAlhZGRyZXNzSWQJAJEDAgkAtQkCBQdhZGRyZXNzAgFfAAAECXNBbW91bnRMcAoAAUAJAP0HBAULYXhseUFkZHJlc3MCCWxpcXVpZGF0ZQkAzAgCBQlhZGRyZXNzSWQJAMwIAgUFcG9zSWQJAMwIAgUSbEFtb3VudFdpdGhQZW5hbHR5BQNuaWwFA25pbAMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQDCQAAAgUJc0Ftb3VudExwBQlzQW1vdW50THAEB3NBbW91bnQJAGsDBQlzQW1vdW50THAFB1NjYWxlMTYICQCRAwIFC3JhdGVzUmVzdWx0AAEFdmFsdWUDBQVkZWJ1ZwkAAgECFWxpcXVpZGF0aW9uIHdpbGwgcGFzcwkAzggCCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgkAZQIFEmxBbW91bnRXaXRoUGVuYWx0eQUHbEFtb3VudAUIYkFzc2V0SWQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICBQdhZGRyZXNzAgpfc3VwcGxpZWRfBQtzQXNzZXRJZFN0cgkAZQIFEGN1cnJlbnRTUG9zaXRpb24FB3NBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICBQdhZGRyZXNzAgpfYm9ycm93ZWRfBQtiQXNzZXRJZFN0cgkAZQIFEGN1cnJlbnRCUG9zaXRpb24FCGxiQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgICD3RvdGFsX3N1cHBsaWVkXwULc0Fzc2V0SWRTdHIJAGUCCQENdHJ5R2V0SW50ZWdlcgEJAKwCAgIPdG90YWxfc3VwcGxpZWRfBQtzQXNzZXRJZFN0cgUHc0Ftb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICAg90b3RhbF9ib3Jyb3dlZF8FC2JBc3NldElkU3RyCQBlAgkBDXRyeUdldEludGVnZXIBCQCsAgICD3RvdGFsX2JvcnJvd2VkXwULYkFzc2V0SWRTdHIFCGxiQW1vdW50BQNuaWwFC3JhdGVzUmVzdWx0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBEWdldFVzZXJDb2xsYXRlcmFsBAVkZWJ1ZwdhZGRyZXNzDW1pbnVzQm9ycm93ZWQLYWZ0ZXJDaGFuZ2UEBmFzc2V0cwkBD2dldE1hcmtldEFzc2V0cwAEBGx0dnMJALUJAgkBDHRyeUdldFN0cmluZwECCnNldHVwX2x0dnMCASwEA2x0cwkAtQkCCQEMdHJ5R2V0U3RyaW5nAQIJc2V0dXBfbHRzAgEsBAVyYXRlcwgJAQ1nZXRBY3R1YWxSYXRlAgkAkQMCBQZhc3NldHMAAAIFc1JhdGUCXzIEDWNoYW5nZUhhbmRsZXIJALUJAgULYWZ0ZXJDaGFuZ2UCASwKAQFmAgVhY2N1bQRuZXh0AwkAZwIFBG5leHQJAJADAQUGYXNzZXRzBQVhY2N1bQQMdXNlclN1cHBsaWVkCQENdHJ5R2V0SW50ZWdlcgEJAKwCAgkArAICBQdhZGRyZXNzAgpfc3VwcGxpZWRfCQCRAwIFBmFzc2V0cwUEbmV4dAQMdXNlckJvcnJvd2VkCQENdHJ5R2V0SW50ZWdlcgEJAKwCAgkArAICBQdhZGRyZXNzAgpfYm9ycm93ZWRfCQCRAwIFBmFzc2V0cwUEbmV4dAQTbmVlZFRva2VuQWNjb3VudGluZwMJAAACBQthZnRlckNoYW5nZQIAAwMJAQIhPQIFDHVzZXJCb3Jyb3dlZAAABgkBAiE9AgUMdXNlclN1cHBsaWVkAAAGBwYDBRNuZWVkVG9rZW5BY2NvdW50aW5nBAphc3NldFNjYWxlCQEOY2FsY0Fzc2V0U2NhbGUBCQCRAwIFBmFzc2V0cwUEbmV4dAQKYXNzZXRQcmljZQkBDWdldFRva2VuUHJpY2UBCQCRAwIFBmFzc2V0cwUEbmV4dAkAZQIJAGQCBQVhY2N1bQkAawMJAGsDCQBrAwkAZAIFDHVzZXJTdXBwbGllZAMDAwkBAiE9AgULYWZ0ZXJDaGFuZ2UCAAkAAAIJAJEDAgUNY2hhbmdlSGFuZGxlcgAACQCRAwIFBmFzc2V0cwUEbmV4dAcJAAACCQCRAwIFDWNoYW5nZUhhbmRsZXIAAQIIc3VwcGxpZWQHCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUNY2hhbmdlSGFuZGxlcgACAAAICQCRAwIFBXJhdGVzCQBoAgUEbmV4dAADBXZhbHVlBQdTY2FsZTE2CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUEbHR2cwUEbmV4dAUGU2NhbGU4CAUKYXNzZXRQcmljZQJfMQUKYXNzZXRTY2FsZQMFDW1pbnVzQm9ycm93ZWQJAGsDCQBrAwkAawMJAGQCBQx1c2VyQm9ycm93ZWQDAwMJAQIhPQIFC2FmdGVyQ2hhbmdlAgAJAAACCQCRAwIFDWNoYW5nZUhhbmRsZXIAAAkAkQMCBQZhc3NldHMFBG5leHQHCQAAAgkAkQMCBQ1jaGFuZ2VIYW5kbGVyAAECCGJvcnJvd2VkBwkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDWNoYW5nZUhhbmRsZXIAAgAACAkAkQMCBQVyYXRlcwkAZAIJAGgCBQRuZXh0AAMAAQV2YWx1ZQUHU2NhbGUxNgUGU2NhbGU4CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUDbHRzBQRuZXh0CAUKYXNzZXRQcmljZQJfMgUKYXNzZXRTY2FsZQAABQVhY2N1bQQGcmVzdWx0CgACJGwJAMwIAgAACQDMCAIAAQkAzAgCAAIJAMwIAgADCQDMCAIABAkAzAgCAAUJAMwIAgAGCQDMCAIABwkAzAgCAAgJAMwIAgAJCQDMCAIACgkAzAgCAAsFA25pbAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEBZgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTIJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwDBQVkZWJ1ZwkAAgEJAKQDAQUGcmVzdWx0CQCUCgIFA25pbAUGcmVzdWx0AWkBE2dldFVzZXJDb2xsYXRlcmFsVjIGBWRlYnVnB2FkZHJlc3MIc0Fzc2V0SWQIYkFzc2V0SWQNbWludXNCb3Jyb3dlZAthZnRlckNoYW5nZQQGYXNzZXRzCQEPZ2V0TWFya2V0QXNzZXRzAAQGc0luZGV4CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAM8IAgUGYXNzZXRzBQhzQXNzZXRJZAIOV3Jvbmcgc0Fzc2V0SWQEBGx0dnMJALUJAgkBDHRyeUdldFN0cmluZwECCnNldHVwX2x0dnMCASwEA2x0cwkAtQkCCQEMdHJ5R2V0U3RyaW5nAQIJc2V0dXBfbHRzAgEsBApzQXNzZXRSYXRlCQEVZ2V0QWN0dWFsUmF0ZU9uZVRva2VuAgUIc0Fzc2V0SWQCBXNSYXRlBA1jaGFuZ2VIYW5kbGVyCQC1CQIFC2FmdGVyQ2hhbmdlAgEsBAx1c2VyU3VwcGxpZWQJAQ10cnlHZXRJbnRlZ2VyAQkArAICCQCsAgIFB2FkZHJlc3MCCl9zdXBwbGllZF8FCHNBc3NldElkBAx1c2VyQm9ycm93ZWQJAQ10cnlHZXRJbnRlZ2VyAQkArAICCQCsAgIFB2FkZHJlc3MCCl9ib3Jyb3dlZF8FCGJBc3NldElkBA5zdXBwbGllZENoYW5nZQMDCQECIT0CBQthZnRlckNoYW5nZQIACQAAAgkAkQMCBQ1jaGFuZ2VIYW5kbGVyAAACCHN1cHBsaWVkBwkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDWNoYW5nZUhhbmRsZXIAAQAABAtzQXNzZXRTY2FsZQkBDmNhbGNBc3NldFNjYWxlAQUIc0Fzc2V0SWQEC3NBc3NldFByaWNlCQENZ2V0VG9rZW5QcmljZQEFCHNBc3NldElkBAZyZXN1bHQJAGUCCQBrAwkAawMJAGsDCQBkAgUMdXNlclN1cHBsaWVkBQ5zdXBwbGllZENoYW5nZQgFCnNBc3NldFJhdGUCXzEFB1NjYWxlMTYJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQRsdHZzBQZzSW5kZXgFBlNjYWxlOAgFC3NBc3NldFByaWNlAl8xBQtzQXNzZXRTY2FsZQMFDW1pbnVzQm9ycm93ZWQEBmJJbmRleAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDPCAIFBmFzc2V0cwUIYkFzc2V0SWQCDldyb25nIGJBc3NldElkBApiQXNzZXRSYXRlCQEVZ2V0QWN0dWFsUmF0ZU9uZVRva2VuAgUIYkFzc2V0SWQCBWJSYXRlBA5ib3Jyb3dlZENoYW5nZQMDCQECIT0CBQthZnRlckNoYW5nZQIACQAAAgkAkQMCBQ1jaGFuZ2VIYW5kbGVyAAACCGJvcnJvd2VkBwkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDWNoYW5nZUhhbmRsZXIAAQAABAtiQXNzZXRTY2FsZQkBDmNhbGNBc3NldFNjYWxlAQUIYkFzc2V0SWQEC2JBc3NldFByaWNlCQENZ2V0VG9rZW5QcmljZQEFCGJBc3NldElkCQBrAwkAawMJAGsDCQBkAgUMdXNlckJvcnJvd2VkBQ5ib3Jyb3dlZENoYW5nZQgFCmJBc3NldFJhdGUCXzEFB1NjYWxlMTYFBlNjYWxlOAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFA2x0cwUGYkluZGV4CAULYkFzc2V0UHJpY2UCXzIFC2JBc3NldFNjYWxlAAADBQVkZWJ1ZwkAAgEJAKQDAQUGcmVzdWx0CQCUCgIFA25pbAUGcmVzdWx0AWkBDGdldEFzc2V0RGVidAMFZGVidWcHYWRkcmVzcwphc3NldElkU3RyBAx1c2VyQm9ycm93ZWQJAQ10cnlHZXRJbnRlZ2VyAQkArAICCQCsAgIFB2FkZHJlc3MCCl9ib3Jyb3dlZF8FCmFzc2V0SWRTdHIECmFzc2V0U2NhbGUJAQ5jYWxjQXNzZXRTY2FsZQEFCmFzc2V0SWRTdHIEBHJhdGUICQEVZ2V0QWN0dWFsUmF0ZU9uZVRva2VuAgUKYXNzZXRJZFN0cgIFYlJhdGUCXzEEBnJlc3VsdAkAawMFDHVzZXJCb3Jyb3dlZAUEcmF0ZQUHU2NhbGUxNgMFBWRlYnVnCQACAQkApAMBBQZyZXN1bHQJAJQKAgUDbmlsBQZyZXN1bHQBaQEJZ2V0UHJpY2VzAQVkZWJ1ZwQGYXNzZXRzCQEPZ2V0TWFya2V0QXNzZXRzAAoBAWYCBWFjY3VtCmFzc2V0SWRTdHIECmFzc2V0UHJpY2UJARVnZXRUb2tlblByaWNlV2l0aFJpc2sCBQphc3NldElkU3RyAAMJAKwCAgkArAICCQCsAgIJAKwCAgUFYWNjdW0JAKQDAQgFCmFzc2V0UHJpY2UCXzECASwJAKQDAQgFCmFzc2V0UHJp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", "height": 4061685, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: GXeptUFu1Z2v2tiQG2CLhDiLhBuNaMHpozfgmTtBhqUk Next: FB9z3RPa1gDKFCzW8SFHVx4WZQoheL5n9j6CLuSUJEeJ Diff:
OldNewDifferences
499499
500500
501501 @Callable(i)
502-func initNewToken (token,ltv,lt,penalty) = if (if ((i.caller != this))
502+func initNewToken (token,ltv,lt,penalty,isLpToken) = if (if ((i.caller != this))
503503 then (i.caller != Address(base58'3P3o9cLTV2u9N4nYNKRYL6gy6cUEU9DwXW8'))
504504 else false)
505505 then throw("admin only")
506- else [StringEntry("setup_tokens", ((tryGetString("setup_tokens") + ",") + token)), StringEntry("setup_ltvs", ((tryGetString("setup_ltvs") + ",") + ltv)), StringEntry("setup_lts", ((tryGetString("setup_lts") + ",") + lt)), StringEntry("setup_penalties", ((tryGetString("setup_penalties") + ",") + penalty)), IntegerEntry((token + "_bRate"), Scale16), IntegerEntry((token + "_sRate"), Scale16), IntegerEntry((token + "_lastRateHeight"), height)]
507-
508-
509-
510-@Callable(i)
511-func initNewLPToken (token) = if (if ((i.caller != this))
512- then (i.caller != Address(base58'3P3o9cLTV2u9N4nYNKRYL6gy6cUEU9DwXW8'))
513- else false)
514- then throw("admin only")
515- else [BooleanEntry((token + "_axlyLp"), true)]
506+ else {
507+ let lpEntry = if (isLpToken)
508+ then [BooleanEntry((token + "_axlyLp"), true)]
509+ else nil
510+ ([StringEntry("setup_tokens", ((tryGetString("setup_tokens") + ",") + token)), StringEntry("setup_ltvs", ((tryGetString("setup_ltvs") + ",") + ltv)), StringEntry("setup_lts", ((tryGetString("setup_lts") + ",") + lt)), StringEntry("setup_penalties", ((tryGetString("setup_penalties") + ",") + penalty)), IntegerEntry((token + "_bRate"), Scale16), IntegerEntry((token + "_sRate"), Scale16), IntegerEntry((token + "_lastRateHeight"), height)] ++ lpEntry)
511+ }
516512
517513
518514
539535 let assets = getMarketAssets()
540536 let rates = getActualRate(assets[0], "sRate")._2
541537 func f (a,assetIdStr) = {
542- let $t01927319323 = a
543- let accum = $t01927319323._1
544- let n = $t01927319323._2
538+ let $t01914519195 = a
539+ let accum = $t01914519195._1
540+ let n = $t01914519195._2
545541 let autostakeAmount = tryGetString(("autostake_amount_" + assetIdStr))
546542 let amount = ((((getBalance(assetIdStr) + tryGetInteger(("autostake_amount_" + assetIdStr))) + (if ((autostakeAmount != ""))
547543 then parseIntValue(autostakeAmount)
567563
568564 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63), 64), 65), 66), 67), 68), 69), 70), 71), 72), 73), 74), 75), 76), 77), 78), 79), 80), 81), 82), 83), 84), 85), 86), 87), 88), 89), 90), 91), 92), 93), 94), 95), 96), 97), 98), 99), 100))._1
569565 func f2 (a,assetIdStr) = {
570- let $t02007520093 = a
571- let accum = $t02007520093._1
572- let n = $t02007520093._2
566+ let $t01994719965 = a
567+ let accum = $t01994719965._1
568+ let n = $t01994719965._2
573569 $Tuple2((accum ++ [ScriptTransfer(reserveFundAddress, max([parameter[n], 0]), getAssetBytes(assetIdStr))]), (n + 1))
574570 }
575571
631627 let asset1Num = value(indexOf(marketAssets, bAssetIdStr))
632628 let asset0Num = value(indexOf(marketAssets, sAssetIdStr))
633629 let penalty = parseIntValue(value(split(tryGetString("setup_penalties"), ",")[asset1Num]))
634- let $t02189121961 = getActualRateOneToken(bAssetIdStr, "bRate")
635- let bRate = $t02189121961._1
636- let ratesResult = $t02189121961._2
630+ let $t02176321833 = getActualRateOneToken(bAssetIdStr, "bRate")
631+ let bRate = $t02176321833._1
632+ let ratesResult = $t02176321833._2
637633 let bAmount = fraction(currentBPosition, bRate, Scale16)
638634 let lAmount = fraction(bAmount, liquidatePercent, 100)
639635 let lAmountWithPenalty = fraction(lAmount, (Scale8 + penalty), Scale8)
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let kAxlyLp = "_axlyLP"
55
66 let axlyAddress = Address(base58'3PLsYkBw7taejV1J3qWPCN2yeyVRu31d5HW')
77
88 let axlyFarmingAddress = Address(base58'3P37f8Y3rNpKzSkHNVZMAStXdpmNBgftHN9')
99
1010 let reserveFundAddress = Address(base58'3P4kBiU4wr2yV1S5gMfu3MdkVvy7kxXHsKe')
1111
1212 let reserveFund = 20
1313
1414 let aggregatorAddress = Address(base58'3PGFHzVGT4NTigwCKP1NcwoXkodVZwvBuuU')
1515
1616 let shutdownWhitelist = [base58'3PMcMiMEs6w56NRGacksXtFG5zS7doE9fpL', base58'3PAxdDSmN758L5SHSGRC5apEtQE2aApZotG', base58'3PJKmXoHJvVeQXjSJdhtkUcFDtdiQqMbUTD', base58'3PQdNxynJy5mche2kxMVc5shXWzK8Gstq3o', base58'3PHbdpaKzz8EiAngGHaFu2hVuNCdsC67qh3', base58'3P6Ksahs71SiKQgQ4qaZuFAVhqncdi2nvJQ']
1717
1818 func verifyLiquidatorRights (address) = !(if (if (if ((address != Address(base58'3PFHNdEPu71QwBAnc2HZPcrbxoseNfUvHEA')))
1919 then (address != Address(base58'3PCqdm1mAoQqR46oZotFanmqb5CLUvrKEo2'))
2020 else false)
2121 then (address != Address(base58'3PMcMiMEs6w56NRGacksXtFG5zS7doE9fpL'))
2222 else false)
2323 then (address != Address(base58'3PHbdpaKzz8EiAngGHaFu2hVuNCdsC67qh3'))
2424 else false)
2525
2626
2727 func verifySentinelRights (address) = !(if ((address != reserveFundAddress))
2828 then (address != axlyAddress)
2929 else false)
3030
3131
3232 func getRateCurve (assetIdStr) = match assetIdStr {
3333 case _ =>
3434 if (("9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi" == $match0))
3535 then $Tuple4(2000000, 25000000, 80000000, 100000000)
3636 else if (("HGgabTqUS8WtVFUJzfmrTDMgEccJuZLBPhFgQFxvnsoW" == $match0))
3737 then $Tuple4(2000000, 25000000, 80000000, 100000000)
3838 else if (("34N9YcEETLWn93qYQ64EsP1x89tSruJU44RrEMSXXEPJ" == $match0))
3939 then $Tuple4(2000000, 25000000, 80000000, 100000000)
4040 else if (("6XtHjpXbs9RRJP2Sr9GUyVqzACcby9TkThHXnjVC5CDJ" == $match0))
4141 then $Tuple4(2000000, 25000000, 80000000, 100000000)
4242 else if (("DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p" == $match0))
4343 then $Tuple4(2000000, 25000000, 80000000, 100000000)
4444 else if (("Ajso6nTTjptu2UHLx6hfSXVtHFtRBJCkKYd5SAyj7zf5" == $match0))
4545 then $Tuple4(2000000, 40000000, 80000000, 150000000)
4646 else if (("HEB8Qaw9xrWpWs8tHsiATYGBWDBtP2S7kcPALrMu43AS" == $match0))
4747 then $Tuple4(0, 20000000, 80000000, 40000000)
4848 else if (("WAVES" == $match0))
4949 then $Tuple4(2000000, 30000000, 80000000, 50000000)
5050 else if (("Atqv59EYzjFGuitKVnMRk6H8FukjoV3ktPorbEys25on" == $match0))
5151 then $Tuple4(0, 20000000, 80000000, 40000000)
5252 else if (("DSbbhLsSTeDg5Lsiufk2Aneh3DjVqJuPr2M9uU1gwy5p" == $match0))
5353 then $Tuple4(0, 20000000, 80000000, 100000000)
5454 else if (("8t4DPWTwPzpatHA9AkTxWAB47THnYzBsDnoY7fQqbG91" == $match0))
5555 then $Tuple4(0, 30000000, 80000000, 40000000)
5656 else if (("At8D6NFFpheCbvKVnjVoeLL84Eo8NZn6ovManxfLaFWL" == $match0))
5757 then $Tuple4(0, 25000000, 80000000, 40000000)
5858 else if (("8LQW8f7P5d5PZM7GtZEBgaqRPGSzS3DfPuiXrURJ4AJS" == $match0))
5959 then $Tuple4(2000000, 30000000, 80000000, 50000000)
6060 else if (("474jTeYx2r2Va35794tCScAXWJG9hU2HcgxzMowaZUnu" == $match0))
6161 then $Tuple4(2000000, 30000000, 80000000, 50000000)
6262 else if (("5UYBPpq4WoU5n4MwpFkgJnW3Fq4B1u3ukpK33ik4QerR" == $match0))
6363 then $Tuple4(2000000, 30000000, 80000000, 50000000)
6464 else if (("2thsACuHmzDMuNezPM32wg9a3BwUzBWDeSKakgz3cw21" == $match0))
6565 then $Tuple4(2000000, 40000000, 80000000, 100000000)
6666 else if (("YiNbofFzC17jEHHCMwrRcpy9MrrjabMMLZxg8g5xmf7" == $match0))
6767 then $Tuple4(2000000, 30000000, 80000000, 80000000)
6868 else $Tuple4(0, 20000000, 80000000, 80000000)
6969 }
7070
7171
7272 let Scale8 = 100000000
7373
7474 let Scale10 = 10000000000
7575
7676 let Scale16 = (Scale8 * Scale8)
7777
7878 let dayBlocks = 1440
7979
8080 func liIntToStr (li) = {
8181 func f (accum,next) = ((accum + toString(next)) + ",")
8282
8383 let $l = li
8484 let $s = size($l)
8585 let $acc0 = ""
8686 func $f0_1 ($a,$i) = if (($i >= $s))
8787 then $a
8888 else f($a, $l[$i])
8989
9090 func $f0_2 ($a,$i) = if (($i >= $s))
9191 then $a
9292 else throw("List size exceeds 100")
9393
9494 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63), 64), 65), 66), 67), 68), 69), 70), 71), 72), 73), 74), 75), 76), 77), 78), 79), 80), 81), 82), 83), 84), 85), 86), 87), 88), 89), 90), 91), 92), 93), 94), 95), 96), 97), 98), 99), 100)
9595 }
9696
9797
9898 func tryGetInteger (key) = match getInteger(this, key) {
9999 case b: Int =>
100100 b
101101 case _ =>
102102 0
103103 }
104104
105105
106106 func tryGetBoolean (key) = match getBoolean(this, key) {
107107 case b: Boolean =>
108108 b
109109 case _ =>
110110 false
111111 }
112112
113113
114114 func tryGetString (key) = match getString(this, key) {
115115 case b: String =>
116116 b
117117 case _ =>
118118 ""
119119 }
120120
121121
122122 func tryGetBinary (key) = match getBinary(this, key) {
123123 case b: ByteVector =>
124124 b
125125 case _ =>
126126 base58''
127127 }
128128
129129
130130 func getAssetString (assetId) = match assetId {
131131 case b: ByteVector =>
132132 toBase58String(b)
133133 case _ =>
134134 "WAVES"
135135 }
136136
137137
138138 func getAssetBytes (assetIdStr) = if ((assetIdStr == "WAVES"))
139139 then unit
140140 else fromBase58String(assetIdStr)
141141
142142
143143 func getBalance (assetIdStr) = if ((assetIdStr == "WAVES"))
144144 then wavesBalance(this).available
145145 else assetBalance(this, fromBase58String(assetIdStr))
146146
147147
148148 func getMarketAssets () = split(tryGetString("setup_tokens"), ",")
149149
150150
151151 func getAssetsMaxSupply () = {
152152 let s = tryGetString("setup_maxsupply")
153153 if ((s == ""))
154154 then [-1, -1, -1, -1, -1, -1, -1]
155155 else split(s, ",")
156156 }
157157
158158
159159 func getOutdatedUr (assetIdStr) = {
160160 let down = fraction(tryGetInteger(("total_supplied_" + assetIdStr)), tryGetInteger((assetIdStr + "_sRate")), Scale16)
161161 if ((down == 0))
162162 then 0
163163 else fraction(Scale8, fraction(tryGetInteger(("total_borrowed_" + assetIdStr)), tryGetInteger((assetIdStr + "_bRate")), Scale16), down)
164164 }
165165
166166
167167 func getInterest (assetIdStr) = {
168168 let ur = getOutdatedUr(assetIdStr)
169169 let curve = getRateCurve(assetIdStr)
170170 let rate = (curve._1 + (if ((curve._3 >= ur))
171171 then fraction(ur, curve._2, curve._3)
172172 else (curve._2 + fraction((ur - curve._3), curve._4, (100000000 - curve._3)))))
173173 max([fraction(rate, Scale8, (dayBlocks * 365)), 1])
174174 }
175175
176176
177177 func tokenRatesRecalc (assetIdStr) = if (tryGetBoolean((assetIdStr + kAxlyLp)))
178178 then [IntegerEntry((assetIdStr + "_sRate"), Scale16), IntegerEntry((assetIdStr + "_bRate"), Scale16), IntegerEntry((assetIdStr + "_lastRateHeight"), height)]
179179 else {
180180 let interest = getInterest(assetIdStr)
181181 let ur = getOutdatedUr(assetIdStr)
182182 let lastRecalcHeight = valueOrElse(getInteger(this, (assetIdStr + "_lastRateHeight")), tryGetInteger("lastRateHeight"))
183183 let lastBRate = max([tryGetInteger((assetIdStr + "_bRate")), Scale16])
184184 let newBRate = (lastBRate + ((height - lastRecalcHeight) * interest))
185185 let lastSRate = max([tryGetInteger((assetIdStr + "_sRate")), Scale16])
186186 let newSRate = (lastSRate + ((((height - lastRecalcHeight) * fraction(interest, ur, Scale8)) * (100 - reserveFund)) / 100))
187187 [IntegerEntry((assetIdStr + "_sRate"), newSRate), IntegerEntry((assetIdStr + "_bRate"), newBRate), IntegerEntry((assetIdStr + "_lastRateHeight"), height)]
188188 }
189189
190190
191191 func getActualRate (assetIdStr,rateType) = {
192192 func f (accum,token) = {
193193 let recalc = tokenRatesRecalc(token)
194194 $Tuple2(if ((token != assetIdStr))
195195 then accum._1
196196 else if ((rateType == "sRate"))
197197 then recalc[0].value
198198 else recalc[1].value, (accum._2 ++ recalc))
199199 }
200200
201201 let $l = getMarketAssets()
202202 let $s = size($l)
203203 let $acc0 = $Tuple2(0, nil)
204204 func $f0_1 ($a,$i) = if (($i >= $s))
205205 then $a
206206 else f($a, $l[$i])
207207
208208 func $f0_2 ($a,$i) = if (($i >= $s))
209209 then $a
210210 else throw("List size exceeds 100")
211211
212212 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63), 64), 65), 66), 67), 68), 69), 70), 71), 72), 73), 74), 75), 76), 77), 78), 79), 80), 81), 82), 83), 84), 85), 86), 87), 88), 89), 90), 91), 92), 93), 94), 95), 96), 97), 98), 99), 100)
213213 }
214214
215215
216216 func getActualRateOneToken (assetIdStr,rateType) = {
217217 let recalc = tokenRatesRecalc(assetIdStr)
218218 $Tuple2(if ((rateType == "sRate"))
219219 then recalc[0].value
220220 else recalc[1].value, recalc)
221221 }
222222
223223
224224 func getUr (assetIdStr) = {
225225 let rates = tokenRatesRecalc(assetIdStr)
226226 let down = fraction(tryGetInteger(("total_supplied_" + assetIdStr)), rates[0].value, Scale16)
227227 fraction(Scale8, fraction(tryGetInteger(("total_borrowed_" + assetIdStr)), rates[1].value, Scale16), down)
228228 }
229229
230230
231231 func getTokenPriceWithRisk (assetIdStr,riskAversity) = if (if ((assetIdStr == "9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi"))
232232 then true
233233 else (assetIdStr == "HGgabTqUS8WtVFUJzfmrTDMgEccJuZLBPhFgQFxvnsoW"))
234234 then $Tuple2(1000000, 1000000)
235235 else {
236236 let price = getIntegerValue(Address(base58'3P8d1E1BLKoD52y3bQJ1bDTd2TD1gpaLn9t'), (assetIdStr + "_twap5B"))
237237 let riskLevel = getIntegerValue(Address(base58'3P8d1E1BLKoD52y3bQJ1bDTd2TD1gpaLn9t'), (assetIdStr + "_riskLevel"))
238238 if (tryGetBoolean((assetIdStr + kAxlyLp)))
239239 then {
240240 let p = {
241241 let @ = reentrantInvoke(axlyAddress, "getShareAssetPriceREADONLY", [assetIdStr], nil)
242242 if ($isInstanceOf(@, "Int"))
243243 then @
244244 else throw(($getType(@) + " couldn't be cast to Int"))
245245 }
246246 if ((p == p))
247247 then $Tuple2(p, p)
248248 else throw("Strict value is not equal to itself.")
249249 }
250250 else if ((riskAversity >= riskLevel))
251251 then $Tuple2(price, price)
252252 else throw((("oracle prices don't match: " + toString(price)) + " is the price, but risk is too high"))
253253 }
254254
255255
256256 func getTokenPrice (assetIdStr) = getTokenPriceWithRisk(assetIdStr, 1)
257257
258258
259259 func calcAssetScale (assetIdStr) = {
260260 let decimals = if ((assetIdStr == "WAVES"))
261261 then 8
262262 else value(assetInfo(fromBase58String(assetIdStr))).decimals
263263 pow(10, 0, decimals, 0, 0, DOWN)
264264 }
265265
266266
267267 func supplyInternal (assetIdStr,assetAmount,address) = if (!(tryGetBoolean("setup_active")))
268268 then throw("market is stopped")
269269 else {
270270 let $t085378612 = getActualRateOneToken(assetIdStr, "sRate")
271271 let sRate = $t085378612._1
272272 let ratesRecalcResult = $t085378612._2
273273 let amount = fraction(assetAmount, Scale16, sRate, DOWN)
274274 let maxSupply = match getString(("setup_maxSupply_" + assetIdStr)) {
275275 case x: String =>
276276 parseIntValue(x)
277277 case _ =>
278278 0
279279 }
280280 let assetPrice = getTokenPrice(assetIdStr)
281281 let newTotalSupplied = (tryGetInteger(((address + "_supplied_") + assetIdStr)) + amount)
282282 let rate = sRate
283283 let assetScale = calcAssetScale(assetIdStr)
284284 let newTotalSuppliedUsd = fraction(fraction(newTotalSupplied, rate, Scale16), assetPrice._1, assetScale)
285285 if ((indexOf(tryGetString("setup_tokens"), assetIdStr) == unit))
286286 then throw("this asset is not supported by the market")
287287 else if (if ((maxSupply != 0))
288288 then (newTotalSuppliedUsd > maxSupply)
289289 else false)
290290 then throw("max total supply for this token reached in the pool")
291291 else {
292292 let assetNum = value(indexOf(getMarketAssets(), assetIdStr))
293293 $Tuple2(([IntegerEntry(((address + "_supplied_") + assetIdStr), newTotalSupplied), IntegerEntry(("total_supplied_" + assetIdStr), (tryGetInteger(("total_supplied_" + assetIdStr)) + amount))] ++ [ratesRecalcResult[0], ratesRecalcResult[1], ratesRecalcResult[2]]), $Tuple2(assetAmount, newTotalSuppliedUsd))
294294 }
295295 }
296296
297297
298298 func borrowInternal (assetIdStr,assetAmount,address) = {
299299 let $t099209995 = getActualRateOneToken(assetIdStr, "bRate")
300300 let bRate = $t099209995._1
301301 let ratesRecalcResult = $t099209995._2
302302 let amount = fraction(assetAmount, Scale16, bRate, CEILING)
303303 if (!(tryGetBoolean("setup_active")))
304304 then throw("market is stopped")
305305 else if (tryGetBoolean((assetIdStr + kAxlyLp)))
306306 then throw("this token cannot be borrowed")
307307 else {
308308 let assetSupplied = tryGetInteger(("total_supplied_" + assetIdStr))
309309 let assetBorrowed = tryGetInteger(("total_borrowed_" + assetIdStr))
310310 let userAssetBorrowed = tryGetInteger(((address + "_borrowed_") + assetIdStr))
311311 let assetScale = calcAssetScale(assetIdStr)
312312 let assetPrice = getTokenPrice(assetIdStr)
313313 let assetAmountUsd = fraction(amount, assetPrice._1, assetScale)
314314 if ((amount > (assetSupplied - assetBorrowed)))
315315 then throw("this amount is not available")
316316 else {
317317 let assetNum = value(indexOf(getMarketAssets(), assetIdStr))
318318 $Tuple2(([IntegerEntry(((address + "_borrowed_") + assetIdStr), (userAssetBorrowed + amount)), IntegerEntry(("total_borrowed_" + assetIdStr), (assetBorrowed + amount))] ++ [ratesRecalcResult[0], ratesRecalcResult[1], ratesRecalcResult[2]]), $Tuple2(assetAmount, assetAmountUsd))
319319 }
320320 }
321321 }
322322
323323
324324 @Callable(i)
325325 func flashPosition (user,sAssetIdStr,bAssetIdStr,bAmount,callbackAddress,callbackFunction,callbackArgs) = if ((i.caller != axlyAddress))
326326 then throw("available only for Axly protocol")
327327 else {
328328 let borrowRes = borrowInternal(bAssetIdStr, bAmount, user)
329329 let bAssetId = getAssetBytes(bAssetIdStr)
330330 let callback = reentrantInvoke(addressFromStringValue(callbackAddress), callbackFunction, split(callbackArgs, ","), [AttachedPayment(bAssetId, bAmount)])
331331 if ((callback == callback))
332332 then {
333333 let sAmount = {
334334 let @ = callback
335335 if ($isInstanceOf(@, "Int"))
336336 then @
337337 else throw(($getType(@) + " couldn't be cast to Int"))
338338 }
339339 if ((sAmount == sAmount))
340340 then {
341341 let supplyRes = supplyInternal(sAssetIdStr, sAmount, user)
342342 if ((borrowRes._2._2 > supplyRes._2._2))
343343 then throw("not enough collateral provided")
344344 else (borrowRes._1 ++ supplyRes._1)
345345 }
346346 else throw("Strict value is not equal to itself.")
347347 }
348348 else throw("Strict value is not equal to itself.")
349349 }
350350
351351
352352
353353 @Callable(i)
354354 func supply () = if (if ((size(i.payments) != 1))
355355 then true
356356 else (i.payments[0].amount == 0))
357357 then throw("1 payment has to be attached")
358358 else {
359359 let assetIdStr = getAssetString(i.payments[0].assetId)
360360 let assetAmount = i.payments[0].amount
361361 if (tryGetBoolean((assetIdStr + kAxlyLp)))
362362 then throw("You can't supply lp")
363363 else {
364364 let axlyNotify = invoke(axlyFarmingAddress, "lendAction", [toString(i.caller), assetIdStr], nil)
365365 if ((axlyNotify == axlyNotify))
366366 then supplyInternal(assetIdStr, assetAmount, toString(i.caller))
367367 else throw("Strict value is not equal to itself.")
368368 }
369369 }
370370
371371
372372
373373 @Callable(i)
374374 func withdraw (assetIdStr,assetAmount) = {
375375 let $t01260412679 = getActualRateOneToken(assetIdStr, "sRate")
376376 let sRate = $t01260412679._1
377377 let ratesRecalcResult = $t01260412679._2
378378 let amount = fraction(assetAmount, Scale16, sRate, CEILING)
379379 let address = toString(i.caller)
380380 let assetSupplied = tryGetInteger(("total_supplied_" + assetIdStr))
381381 let assetBorrowed = tryGetInteger(("total_borrowed_" + assetIdStr))
382382 let userAssetSupplied = tryGetInteger(((address + "_supplied_") + assetIdStr))
383383 let axlyNotify = invoke(axlyFarmingAddress, "lendAction", [toString(i.caller), assetIdStr], nil)
384384 if ((axlyNotify == axlyNotify))
385385 then {
386386 let collateralValueInv = invoke(this, "getUserCollateralV2", [false, address, assetIdStr, "", false, ("supplied," + toString(-(amount)))], nil)
387387 if ((collateralValueInv == collateralValueInv))
388388 then {
389389 let collateralValue = match collateralValueInv {
390390 case x: Int =>
391391 x
392392 case _ =>
393393 throw("can't get user collateral value")
394394 }
395395 if (!(tryGetBoolean("setup_active")))
396396 then throw("market is stopped")
397397 else if ((0 > collateralValue))
398398 then throw("you dont have enough collateral for this operation")
399399 else if ((amount > (assetSupplied - assetBorrowed)))
400400 then throw("this amount is not available on the market")
401401 else if ((amount > userAssetSupplied))
402402 then throw("this amount is not available on the market")
403403 else ([IntegerEntry(((address + "_supplied_") + assetIdStr), (tryGetInteger(((address + "_supplied_") + assetIdStr)) - amount)), IntegerEntry(("total_supplied_" + assetIdStr), (tryGetInteger(("total_supplied_" + assetIdStr)) - amount)), ScriptTransfer(i.caller, assetAmount, getAssetBytes(assetIdStr))] ++ ratesRecalcResult)
404404 }
405405 else throw("Strict value is not equal to itself.")
406406 }
407407 else throw("Strict value is not equal to itself.")
408408 }
409409
410410
411411
412412 @Callable(i)
413413 func repayFor (address,lpId) = if (!(tryGetBoolean("setup_active")))
414414 then throw("market is stopped")
415415 else if (!(verifySentinelRights(i.caller)))
416416 then throw("available only for whitelist")
417417 else if ((address == "global"))
418418 then throw("you can't repay for everyone :_)")
419419 else if (if ((size(i.payments) != 1))
420420 then true
421421 else (i.payments[0].amount == 0))
422422 then throw("1 payment has to be attached")
423423 else if (!(tryGetBoolean((lpId + kAxlyLp))))
424424 then throw("Wrong lp id")
425425 else {
426426 let assetIdStr = getAssetString(i.payments[0].assetId)
427427 let assetAmount = i.payments[0].amount
428428 let $t01471914794 = getActualRateOneToken(assetIdStr, "bRate")
429429 let bRate = $t01471914794._1
430430 let ratesRecalcResult = $t01471914794._2
431431 let amount = fraction(assetAmount, Scale16, bRate, CEILING)
432432 let assetSupplied = tryGetInteger(("total_supplied_" + assetIdStr))
433433 let assetBorrowed = tryGetInteger(("total_borrowed_" + assetIdStr))
434434 let userAssetBorrowed = tryGetInteger(((address + "_borrowed_") + assetIdStr))
435435 let amountLeft = (userAssetBorrowed - amount)
436436 let repayAmount = if ((amountLeft >= 0))
437437 then amount
438438 else userAssetBorrowed
439439 let extraAmountResult = if ((amountLeft >= 0))
440440 then nil
441441 else [ScriptTransfer(i.caller, -(amountLeft), i.payments[0].assetId)]
442442 let withdrawResult = if ((i.caller == axlyAddress))
443443 then {
444444 let userSupplied = tryGetInteger(((address + "_supplied_") + lpId))
445445 if ((userSupplied > 0))
446446 then [IntegerEntry(((address + "_supplied_") + lpId), 0), IntegerEntry(("total_supplied_" + lpId), (tryGetInteger(("total_supplied_" + lpId)) - userSupplied))]
447447 else nil
448448 }
449449 else nil
450450 if ((indexOf(tryGetString("setup_tokens"), assetIdStr) == unit))
451451 then throw("this asset is not supported by the market")
452452 else ((([IntegerEntry(((address + "_borrowed_") + assetIdStr), (userAssetBorrowed - repayAmount)), IntegerEntry(("total_borrowed_" + assetIdStr), (assetBorrowed - repayAmount))] ++ ratesRecalcResult) ++ extraAmountResult) ++ withdrawResult)
453453 }
454454
455455
456456
457457 @Callable(i)
458458 func addInterestEXTERNAL () = {
459459 let amount = fraction(i.payments[0].amount, 80, 100)
460460 let assetId = i.payments[0].assetId
461461 let assetIdStr = getAssetString(assetId)
462462 let earned = tryGetInteger(("autostake_lastEarned_" + assetIdStr))
463463 let lastHeight = tryGetInteger(("autostake_lastBlock_" + assetIdStr))
464464 let stateChanges = if (if ((lastHeight == height))
465465 then true
466466 else (amount == 0))
467467 then nil
468468 else [IntegerEntry(("autostake_preLastEarned_" + assetIdStr), earned), IntegerEntry(("autostake_preLastBlock_" + assetIdStr), lastHeight), IntegerEntry(("autostake_lastEarned_" + assetIdStr), (earned + amount)), IntegerEntry(("autostake_lastBlock_" + assetIdStr), height)]
469469 (stateChanges ++ [IntegerEntry((assetIdStr + "_sRate"), (tryGetInteger((assetIdStr + "_sRate")) + fraction(Scale16, amount, tryGetInteger(("total_supplied_" + assetIdStr)))))])
470470 }
471471
472472
473473
474474 @Callable(i)
475475 func preInit (tokens,ltvs,lts,penalties) = {
476476 func f (accum,token) = (accum ++ [IntegerEntry((token + "_bRate"), Scale16), IntegerEntry((token + "_sRate"), Scale16)])
477477
478478 if ((i.caller != this))
479479 then throw("admin only")
480480 else {
481481 let rates = {
482482 let $l = split(tokens, ",")
483483 let $s = size($l)
484484 let $acc0 = nil
485485 func $f0_1 ($a,$i) = if (($i >= $s))
486486 then $a
487487 else f($a, $l[$i])
488488
489489 func $f0_2 ($a,$i) = if (($i >= $s))
490490 then $a
491491 else throw("List size exceeds 12")
492492
493493 $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($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12)
494494 }
495495 ([StringEntry("setup_tokens", tokens), StringEntry("setup_ltvs", ltvs), StringEntry("setup_lts", lts), StringEntry("setup_penalties", penalties), BooleanEntry("setup_active", true)] ++ rates)
496496 }
497497 }
498498
499499
500500
501501 @Callable(i)
502-func initNewToken (token,ltv,lt,penalty) = if (if ((i.caller != this))
502+func initNewToken (token,ltv,lt,penalty,isLpToken) = if (if ((i.caller != this))
503503 then (i.caller != Address(base58'3P3o9cLTV2u9N4nYNKRYL6gy6cUEU9DwXW8'))
504504 else false)
505505 then throw("admin only")
506- else [StringEntry("setup_tokens", ((tryGetString("setup_tokens") + ",") + token)), StringEntry("setup_ltvs", ((tryGetString("setup_ltvs") + ",") + ltv)), StringEntry("setup_lts", ((tryGetString("setup_lts") + ",") + lt)), StringEntry("setup_penalties", ((tryGetString("setup_penalties") + ",") + penalty)), IntegerEntry((token + "_bRate"), Scale16), IntegerEntry((token + "_sRate"), Scale16), IntegerEntry((token + "_lastRateHeight"), height)]
507-
508-
509-
510-@Callable(i)
511-func initNewLPToken (token) = if (if ((i.caller != this))
512- then (i.caller != Address(base58'3P3o9cLTV2u9N4nYNKRYL6gy6cUEU9DwXW8'))
513- else false)
514- then throw("admin only")
515- else [BooleanEntry((token + "_axlyLp"), true)]
506+ else {
507+ let lpEntry = if (isLpToken)
508+ then [BooleanEntry((token + "_axlyLp"), true)]
509+ else nil
510+ ([StringEntry("setup_tokens", ((tryGetString("setup_tokens") + ",") + token)), StringEntry("setup_ltvs", ((tryGetString("setup_ltvs") + ",") + ltv)), StringEntry("setup_lts", ((tryGetString("setup_lts") + ",") + lt)), StringEntry("setup_penalties", ((tryGetString("setup_penalties") + ",") + penalty)), IntegerEntry((token + "_bRate"), Scale16), IntegerEntry((token + "_sRate"), Scale16), IntegerEntry((token + "_lastRateHeight"), height)] ++ lpEntry)
511+ }
516512
517513
518514
519515 @Callable(i)
520516 func updateParameter (key,val) = if (if ((i.caller != this))
521517 then (i.caller != Address(base58'3P3o9cLTV2u9N4nYNKRYL6gy6cUEU9DwXW8'))
522518 else false)
523519 then throw("admin only")
524520 else [IntegerEntry(key, parseIntValue(val))]
525521
526522
527523
528524 @Callable(i)
529525 func updateString (key,val) = if (if ((i.caller != this))
530526 then (i.caller != Address(base58'3P3o9cLTV2u9N4nYNKRYL6gy6cUEU9DwXW8'))
531527 else false)
532528 then throw("admin only")
533529 else [StringEntry(key, val)]
534530
535531
536532
537533 @Callable(i)
538534 func claimToReserveFund (debug) = {
539535 let assets = getMarketAssets()
540536 let rates = getActualRate(assets[0], "sRate")._2
541537 func f (a,assetIdStr) = {
542- let $t01927319323 = a
543- let accum = $t01927319323._1
544- let n = $t01927319323._2
538+ let $t01914519195 = a
539+ let accum = $t01914519195._1
540+ let n = $t01914519195._2
545541 let autostakeAmount = tryGetString(("autostake_amount_" + assetIdStr))
546542 let amount = ((((getBalance(assetIdStr) + tryGetInteger(("autostake_amount_" + assetIdStr))) + (if ((autostakeAmount != ""))
547543 then parseIntValue(autostakeAmount)
548544 else 0)) + fraction(tryGetInteger(("total_borrowed_" + assetIdStr)), rates[((n * 3) + 1)].value, Scale16)) - fraction(tryGetInteger(("total_supplied_" + assetIdStr)), rates[(n * 3)].value, Scale16))
549545 let inv = if ((tryGetInteger(("autostake_amount_" + assetIdStr)) > 0))
550546 then invoke(this, "unstakeToken", [assetIdStr, max([amount, 0])], nil)
551547 else 0
552548 if ((inv == inv))
553549 then $Tuple2((accum ++ [amount]), (n + 1))
554550 else throw("Strict value is not equal to itself.")
555551 }
556552
557553 let parameter = ( let $l = assets
558554 let $s = size($l)
559555 let $acc0 = $Tuple2(nil, 0)
560556 func $f0_1 ($a,$i) = if (($i >= $s))
561557 then $a
562558 else f($a, $l[$i])
563559
564560 func $f0_2 ($a,$i) = if (($i >= $s))
565561 then $a
566562 else throw("List size exceeds 100")
567563
568564 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63), 64), 65), 66), 67), 68), 69), 70), 71), 72), 73), 74), 75), 76), 77), 78), 79), 80), 81), 82), 83), 84), 85), 86), 87), 88), 89), 90), 91), 92), 93), 94), 95), 96), 97), 98), 99), 100))._1
569565 func f2 (a,assetIdStr) = {
570- let $t02007520093 = a
571- let accum = $t02007520093._1
572- let n = $t02007520093._2
566+ let $t01994719965 = a
567+ let accum = $t01994719965._1
568+ let n = $t01994719965._2
573569 $Tuple2((accum ++ [ScriptTransfer(reserveFundAddress, max([parameter[n], 0]), getAssetBytes(assetIdStr))]), (n + 1))
574570 }
575571
576572 if (debug)
577573 then throw(liIntToStr(parameter))
578574 else $Tuple2({
579575 let $l = assets
580576 let $s = size($l)
581577 let $acc0 = $Tuple2(nil, 0)
582578 func $f1_1 ($a,$i) = if (($i >= $s))
583579 then $a
584580 else f2($a, $l[$i])
585581
586582 func $f1_2 ($a,$i) = if (($i >= $s))
587583 then $a
588584 else throw("List size exceeds 100")
589585
590586 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63), 64), 65), 66), 67), 68), 69), 70), 71), 72), 73), 74), 75), 76), 77), 78), 79), 80), 81), 82), 83), 84), 85), 86), 87), 88), 89), 90), 91), 92), 93), 94), 95), 96), 97), 98), 99), 100)
591587 }, parameter)._1
592588 }
593589
594590
595591
596592 @Callable(i)
597593 func shutdown (shutdown) = if ((indexOf(shutdownWhitelist, i.caller.bytes) == unit))
598594 then throw("user not in a whitelist")
599595 else [BooleanEntry("setup_active", !(shutdown))]
600596
601597
602598
603599 @Callable(i)
604600 func liquidateV2 (debug,address,sAssetIdStr,bAssetIdStr,liquidatePercent) = if (!(verifyLiquidatorRights(i.caller)))
605601 then throw("available for whitelist only")
606602 else if (!(tryGetBoolean("setup_active")))
607603 then throw("market is stopped")
608604 else {
609605 let collateralValueInv = invoke(this, "getUserCollateralV2", [false, address, sAssetIdStr, bAssetIdStr, true, ""], nil)
610606 if ((collateralValueInv == collateralValueInv))
611607 then {
612608 let userCollateral = match collateralValueInv {
613609 case x: Int =>
614610 x
615611 case _ =>
616612 throw("can't get user collateral value")
617613 }
618614 let currentSPosition = tryGetInteger(((address + "_supplied_") + sAssetIdStr))
619615 let currentBPosition = tryGetInteger(((address + "_borrowed_") + bAssetIdStr))
620616 if (!(tryGetBoolean((sAssetIdStr + kAxlyLp))))
621617 then throw("wrong lp asset")
622618 else if ((0 >= currentBPosition))
623619 then throw("user has no borrow in this token")
624620 else if (if ((userCollateral > 0))
625621 then true
626622 else (currentBPosition == 0))
627623 then throw("user can't be liquidated")
628624 else {
629625 let bAssetId = getAssetBytes(bAssetIdStr)
630626 let marketAssets = getMarketAssets()
631627 let asset1Num = value(indexOf(marketAssets, bAssetIdStr))
632628 let asset0Num = value(indexOf(marketAssets, sAssetIdStr))
633629 let penalty = parseIntValue(value(split(tryGetString("setup_penalties"), ",")[asset1Num]))
634- let $t02189121961 = getActualRateOneToken(bAssetIdStr, "bRate")
635- let bRate = $t02189121961._1
636- let ratesResult = $t02189121961._2
630+ let $t02176321833 = getActualRateOneToken(bAssetIdStr, "bRate")
631+ let bRate = $t02176321833._1
632+ let ratesResult = $t02176321833._2
637633 let bAmount = fraction(currentBPosition, bRate, Scale16)
638634 let lAmount = fraction(bAmount, liquidatePercent, 100)
639635 let lAmountWithPenalty = fraction(lAmount, (Scale8 + penalty), Scale8)
640636 let lbAmount = fraction(lAmount, Scale16, bRate)
641637 let posId = split(address, "_")[1]
642638 let addressId = split(address, "_")[0]
643639 let sAmountLp = {
644640 let @ = reentrantInvoke(axlyAddress, "liquidate", [addressId, posId, lAmountWithPenalty], nil)
645641 if ($isInstanceOf(@, "Int"))
646642 then @
647643 else throw(($getType(@) + " couldn't be cast to Int"))
648644 }
649645 if ((sAmountLp == sAmountLp))
650646 then {
651647 let sAmount = fraction(sAmountLp, Scale16, ratesResult[1].value)
652648 if (debug)
653649 then throw("liquidation will pass")
654650 else ([ScriptTransfer(i.caller, (lAmountWithPenalty - lAmount), bAssetId), IntegerEntry(((address + "_supplied_") + sAssetIdStr), (currentSPosition - sAmount)), IntegerEntry(((address + "_borrowed_") + bAssetIdStr), (currentBPosition - lbAmount)), IntegerEntry(("total_supplied_" + sAssetIdStr), (tryGetInteger(("total_supplied_" + sAssetIdStr)) - sAmount)), IntegerEntry(("total_borrowed_" + bAssetIdStr), (tryGetInteger(("total_borrowed_" + bAssetIdStr)) - lbAmount))] ++ ratesResult)
655651 }
656652 else throw("Strict value is not equal to itself.")
657653 }
658654 }
659655 else throw("Strict value is not equal to itself.")
660656 }
661657
662658
663659
664660 @Callable(i)
665661 func getUserCollateral (debug,address,minusBorrowed,afterChange) = {
666662 let assets = getMarketAssets()
667663 let ltvs = split(tryGetString("setup_ltvs"), ",")
668664 let lts = split(tryGetString("setup_lts"), ",")
669665 let rates = getActualRate(assets[0], "sRate")._2
670666 let changeHandler = split(afterChange, ",")
671667 func f (accum,next) = if ((next >= size(assets)))
672668 then accum
673669 else {
674670 let userSupplied = tryGetInteger(((address + "_supplied_") + assets[next]))
675671 let userBorrowed = tryGetInteger(((address + "_borrowed_") + assets[next]))
676672 let needTokenAccounting = if ((afterChange == ""))
677673 then if (if ((userBorrowed != 0))
678674 then true
679675 else (userSupplied != 0))
680676 then true
681677 else false
682678 else true
683679 if (needTokenAccounting)
684680 then {
685681 let assetScale = calcAssetScale(assets[next])
686682 let assetPrice = getTokenPrice(assets[next])
687683 ((accum + fraction(fraction(fraction((userSupplied + (if (if (if ((afterChange != ""))
688684 then (changeHandler[0] == assets[next])
689685 else false)
690686 then (changeHandler[1] == "supplied")
691687 else false)
692688 then parseIntValue(changeHandler[2])
693689 else 0)), rates[(next * 3)].value, Scale16), parseIntValue(ltvs[next]), Scale8), assetPrice._1, assetScale)) - (if (minusBorrowed)
694690 then fraction(fraction(fraction((userBorrowed + (if (if (if ((afterChange != ""))
695691 then (changeHandler[0] == assets[next])
696692 else false)
697693 then (changeHandler[1] == "borrowed")
698694 else false)
699695 then parseIntValue(changeHandler[2])
700696 else 0)), rates[((next * 3) + 1)].value, Scale16), Scale8, parseIntValue(lts[next])), assetPrice._2, assetScale)
701697 else 0))
702698 }
703699 else accum
704700 }
705701
706702 let result = {
707703 let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
708704 let $s = size($l)
709705 let $acc0 = 0
710706 func $f0_1 ($a,$i) = if (($i >= $s))
711707 then $a
712708 else f($a, $l[$i])
713709
714710 func $f0_2 ($a,$i) = if (($i >= $s))
715711 then $a
716712 else throw("List size exceeds 12")
717713
718714 $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($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12)
719715 }
720716 if (debug)
721717 then throw(toString(result))
722718 else $Tuple2(nil, result)
723719 }
724720
725721
726722
727723 @Callable(i)
728724 func getUserCollateralV2 (debug,address,sAssetId,bAssetId,minusBorrowed,afterChange) = {
729725 let assets = getMarketAssets()
730726 let sIndex = valueOrErrorMessage(indexOf(assets, sAssetId), "Wrong sAssetId")
731727 let ltvs = split(tryGetString("setup_ltvs"), ",")
732728 let lts = split(tryGetString("setup_lts"), ",")
733729 let sAssetRate = getActualRateOneToken(sAssetId, "sRate")
734730 let changeHandler = split(afterChange, ",")
735731 let userSupplied = tryGetInteger(((address + "_supplied_") + sAssetId))
736732 let userBorrowed = tryGetInteger(((address + "_borrowed_") + bAssetId))
737733 let suppliedChange = if (if ((afterChange != ""))
738734 then (changeHandler[0] == "supplied")
739735 else false)
740736 then parseIntValue(changeHandler[1])
741737 else 0
742738 let sAssetScale = calcAssetScale(sAssetId)
743739 let sAssetPrice = getTokenPrice(sAssetId)
744740 let result = (fraction(fraction(fraction((userSupplied + suppliedChange), sAssetRate._1, Scale16), parseIntValue(ltvs[sIndex]), Scale8), sAssetPrice._1, sAssetScale) - (if (minusBorrowed)
745741 then {
746742 let bIndex = valueOrErrorMessage(indexOf(assets, bAssetId), "Wrong bAssetId")
747743 let bAssetRate = getActualRateOneToken(bAssetId, "bRate")
748744 let borrowedChange = if (if ((afterChange != ""))
749745 then (changeHandler[0] == "borrowed")
750746 else false)
751747 then parseIntValue(changeHandler[1])
752748 else 0
753749 let bAssetScale = calcAssetScale(bAssetId)
754750 let bAssetPrice = getTokenPrice(bAssetId)
755751 fraction(fraction(fraction((userBorrowed + borrowedChange), bAssetRate._1, Scale16), Scale8, parseIntValue(lts[bIndex])), bAssetPrice._2, bAssetScale)
756752 }
757753 else 0))
758754 if (debug)
759755 then throw(toString(result))
760756 else $Tuple2(nil, result)
761757 }
762758
763759
764760
765761 @Callable(i)
766762 func getAssetDebt (debug,address,assetIdStr) = {
767763 let userBorrowed = tryGetInteger(((address + "_borrowed_") + assetIdStr))
768764 let assetScale = calcAssetScale(assetIdStr)
769765 let rate = getActualRateOneToken(assetIdStr, "bRate")._1
770766 let result = fraction(userBorrowed, rate, Scale16)
771767 if (debug)
772768 then throw(toString(result))
773769 else $Tuple2(nil, result)
774770 }
775771
776772
777773
778774 @Callable(i)
779775 func getPrices (debug) = {
780776 let assets = getMarketAssets()
781777 func f (accum,assetIdStr) = {
782778 let assetPrice = getTokenPriceWithRisk(assetIdStr, 3)
783779 ((((accum + toString(assetPrice._1)) + ",") + toString(assetPrice._2)) + "|")
784780 }
785781
786782 let result = {
787783 let $l = assets
788784 let $s = size($l)
789785 let $acc0 = ""
790786 func $f0_1 ($a,$i) = if (($i >= $s))
791787 then $a
792788 else f($a, $l[$i])
793789
794790 func $f0_2 ($a,$i) = if (($i >= $s))
795791 then $a
796792 else throw("List size exceeds 100")
797793
798794 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63), 64), 65), 66), 67), 68), 69), 70), 71), 72), 73), 74), 75), 76), 77), 78), 79), 80), 81), 82), 83), 84), 85), 86), 87), 88), 89), 90), 91), 92), 93), 94), 95), 96), 97), 98), 99), 100)
799795 }
800796 if (debug)
801797 then throw(result)
802798 else $Tuple2(nil, result)
803799 }
804800
805801
806802
807803 @Callable(i)
808804 func calculateUtilizationRatio (assetIdStr,debug) = if (debug)
809805 then throw(toString(getUr(assetIdStr)))
810806 else $Tuple2(nil, getUr(assetIdStr))
811807
812808
813809
814810 @Callable(i)
815811 func calculateOutdatedUR (assetIdStr,debug) = if (debug)
816812 then throw(toString(getOutdatedUr(assetIdStr)))
817813 else $Tuple2(nil, getOutdatedUr(assetIdStr))
818814
819815
820816
821817 @Callable(i)
822818 func calculateTokenRates (debug) = {
823819 func f (accum,assetIdStr) = {
824820 let rates = tokenRatesRecalc(assetIdStr)
825821 $Tuple2(((((accum._1 + toString(rates[1].value)) + "|") + toString(rates[0].value)) + ","), (accum._2 ++ rates))
826822 }
827823
828824 let parameter = {
829825 let $l = getMarketAssets()
830826 let $s = size($l)
831827 let $acc0 = $Tuple2("", nil)
832828 func $f0_1 ($a,$i) = if (($i >= $s))
833829 then $a
834830 else f($a, $l[$i])
835831
836832 func $f0_2 ($a,$i) = if (($i >= $s))
837833 then $a
838834 else throw("List size exceeds 100")
839835
840836 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63), 64), 65), 66), 67), 68), 69), 70), 71), 72), 73), 74), 75), 76), 77), 78), 79), 80), 81), 82), 83), 84), 85), 86), 87), 88), 89), 90), 91), 92), 93), 94), 95), 96), 97), 98), 99), 100)
841837 }
842838 if (debug)
843839 then throw(parameter._1)
844840 else $Tuple2(parameter._2, parameter._1)
845841 }
846842
847843
848844
849845 @Callable(i)
850846 func calculateTokensInterest (debug) = {
851847 func f (accum,assetIdStr) = {
852848 let rate = fraction(getInterest(assetIdStr), dayBlocks, Scale8)
853849 ((accum + toString(rate)) + ",")
854850 }
855851
856852 let parameter = {
857853 let $l = getMarketAssets()
858854 let $s = size($l)
859855 let $acc0 = ""
860856 func $f0_1 ($a,$i) = if (($i >= $s))
861857 then $a
862858 else f($a, $l[$i])
863859
864860 func $f0_2 ($a,$i) = if (($i >= $s))
865861 then $a
866862 else throw("List size exceeds 100")
867863
868864 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63), 64), 65), 66), 67), 68), 69), 70), 71), 72), 73), 74), 75), 76), 77), 78), 79), 80), 81), 82), 83), 84), 85), 86), 87), 88), 89), 90), 91), 92), 93), 94), 95), 96), 97), 98), 99), 100)
869865 }
870866 if (debug)
871867 then throw(parameter)
872868 else $Tuple2(nil, parameter)
873869 }
874870
875871
876872 @Verifier(tx)
877873 func verify () = if (if (if (if (sigVerify(tx.bodyBytes, tx.proofs[0], base58'J4QQBsh6FGgZbijQPMDZ7GtNALx2N15K3eHvGhjq43Lt'))
878874 then true
879875 else sigVerify(tx.bodyBytes, tx.proofs[0], base58'Ajf56x532JLzVoourPv9FW75kYsvScNxztPnt1enhNkS'))
880876 then true
881877 else sigVerify(tx.bodyBytes, tx.proofs[0], base58'CYCxuKusNeomQkH9wbcEd4rRP1mDYMc7bw8pr82Agi4N'))
882878 then true
883879 else sigVerify(tx.bodyBytes, tx.proofs[0], base58'D2QvCRmindBLJfAb2GWftPgjkLUZFsoCiYxJFDisaKqN'))
884880 then if (sigVerify(tx.bodyBytes, tx.proofs[1], base58'3oqguA2LUTZFFjJCJ62UybbXFTLwv88tSJ3oMrNSGhiA'))
885881 then true
886882 else sigVerify(tx.bodyBytes, tx.proofs[1], base58'9t2BGHP6EddYu5xvArqDkhHPGbf8ZiYUaWgFcEPtRZhE')
887883 else false
888884

github/deemru/w8io/3ef1775 
128.89 ms