tx · 28aSmpGDfKD9GV8CHW9zg3RFD3scEZibnKivKdKXpU85

3P2mUshsGaj2B5A9rSD4wwXk47fHB16Sidk:  -0.04200000 Waves

2024.03.01 22:42 [4065215] smart account 3P2mUshsGaj2B5A9rSD4wwXk47fHB16Sidk > SELF 0.00000000 Waves

{ "type": 13, "id": "28aSmpGDfKD9GV8CHW9zg3RFD3scEZibnKivKdKXpU85", "fee": 4200000, "feeAssetId": null, "timestamp": 1709322107951, "version": 2, "chainId": 87, "sender": "3P2mUshsGaj2B5A9rSD4wwXk47fHB16Sidk", "senderPublicKey": "46pxd1r6gmScNqdp82uEJMs2AZ1F9q2z1VtXZPFAtHYy", "proofs": [ "3Y9skCB3QTCg8uNjxt29RMpY4xgGrsd2nNVgmSkvd3gLyF2QnXonQWZiZ7it1mZA2KeY2v1HP4G3AJiduYrVB5bE" ], "script": "base64:BgICCAI2AAVXYXZlcwIFV0FWRVMABlNjYWxlNgDAhD0ABlNjYWxlOACAwtcvAAlTY2FsZThCaWcJALYCAQCAwtcvAAdTY2FsZTEwAIDIr6AlAAdTY2FsZTE2AICAhP6m3uERAApTY2FsZTE2QmlnCQC2AgEAgICE/qbe4REACWRheUJsb2NrcwCgCwAKeWVhckJsb2NrcwCgiiAADXllYXJCbG9ja3NCaWcJALYCAQCgiiAAC3Jlc2VydmVGdW5kABQABWFycjEyCQDMCAIAAAkAzAgCAAEJAMwIAgACCQDMCAIAAwkAzAgCAAQJAMwIAgAFCQDMCAIABgkAzAgCAAcJAMwIAgAICQDMCAIACQkAzAgCAAoJAMwIAgALBQNuaWwACXVzZHRJZFN0cgIsOXdjM0xYTkE0VEVCc1h5S3RvTEU5bXJiREQ3V01IWHZYckNqWnZhYkxBc2kACXVzZGNJZFN0cgIsSEdnYWJUcVVTOFd0VkZVSnpmbXJURE1nRWNjSnVaTEJQaEZnUUZ4dm5zb1cACXJvbWVJZFN0cgIsQVA0Q2I1eExZR0g2WmlnSHJlQ1pIb1hwUVRXRGtQc0cyQkhxZkRVeDZ0YUoAEG9yYWNsZUFkZHJlc3NTdHICIzNQOGQxRTFCTEtvRDUyeTNiUUoxYkRUZDJURDFncGFMbjl0AAtheGx5QWRkcmVzcwkBB0FkZHJlc3MBARoBV8/Idd4LdvyJm/d7rwlIRGcJKlBHPw9CLQAHYXhseUxQcwkAzAgCAiw3S1piSnJWb3B3SmhrZHdiZTFlRkRCYmV4NGRrWTYzTXhqVE5qcVh0cnpqMQkAzAgCAixCdHczRzFqNHdRZ2RwNDlQVHhhRmtOdm43NWRRdHFHRE03ZWpRcHBIbldDMQkAzAgCAixCaVN6RmU4blNMNzhvWmFlYmZvaW41dkJaNVB6ZTZkN2thZWlqTHFyNXhaZQkAzAgCAixGMkFLa0E1MTNrNXlIRUprTHNVNnZXeENZWWs4MTFHcGpMaHdFdjJXR3daOQkAzAgCAiw0Q1E1Q1BHTFhMYldCVXMySkJqS1VhUnFGNDlDbUtIa3d6dlBnU3ZRcEFRVgkAzAgCAiw2aU1CNkxLU3Jndjl3YUV2RW5ONllkeXg3ZGZ4UG5HY1R3ODMxOFdWbTViUgUDbmlsAQxnZXRSYXRlQ3VydmUCCmFzc2V0SWRTdHIJbWFya2V0U3RyBA1tYXJrZXRBZGRyZXNzCQERQGV4dHJOYXRpdmUoMTA2MikBBQltYXJrZXRTdHIEDnNldHVwUmF0ZUN1cnZlCQCdCAIFDW1hcmtldEFkZHJlc3MJAKwCAgIQc2V0dXBfcmF0ZUN1cnZlXwUKYXNzZXRJZFN0cgMJAQlpc0RlZmluZWQBBQ5zZXR1cFJhdGVDdXJ2ZQQIY3VydmVBcnIJALwJAgkBBXZhbHVlAQUOc2V0dXBSYXRlQ3VydmUCASwJAJYKBAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCGN1cnZlQXJyAAAJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQhjdXJ2ZUFycgABCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUIY3VydmVBcnIAAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCGN1cnZlQXJyAAMEByRtYXRjaDAFCW1hcmtldFN0cgMJAAACAiMzUDR1QTVldG5aaTRBbUJhYktpbnEyYk1pV1U4S2NuSFpkSAUHJG1hdGNoMAQHJG1hdGNoMQUKYXNzZXRJZFN0cgMJAAACAiw5d2MzTFhOQTRURUJzWHlLdG9MRTltcmJERDdXTUhYdlhyQ2padmFiTEFzaQUHJG1hdGNoMQkAlgoEAICJegDA8PULAIDokiYAgMLXLwMJAAACAixIR2dhYlRxVVM4V3RWRlVKemZtclRETWdFY2NKdVpMQlBoRmdRRnh2bnNvVwUHJG1hdGNoMQkAlgoEAICJegDA8PULAIDokiYAgMLXLwMJAAACAiwzNE45WWNFRVRMV245M3FZUTY0RXNQMXg4OXRTcnVKVTQ0UnJFTVNYWEVQSgUHJG1hdGNoMQkAlgoEAICJegDA8PULAIDokiYAgMLXLwMJAAACAiw2WHRIanBYYnM5UlJKUDJTcjlHVXlWcXpBQ2NieTlUa1RoSFhualZDNUNESgUHJG1hdGNoMQkAlgoEAICJegDA8PULAIDokiYAgMLXLwMJAAACAixERzJ4RmtQZER3S1VvQmt6R0FoUXRMcFNHemZYTGlDWVBFemVLSDJBZDI0cAUHJG1hdGNoMQkAlgoEAICJegDA8PULAIDokiYAgMLXLwMJAAACAixBanNvNm5UVGpwdHUyVUhMeDZoZlNYVnRIRnRSQkpDa0tZZDVTQXlqN3pmNQUHJG1hdGNoMQkAlgoEAICJegCAtIkTAIDokiYAgKPDRwMJAAACAixIRUI4UWF3OXhyV3BXczh0SHNpQVRZR0JXREJ0UDJTN2tjUEFMck11NDNBUwUHJG1hdGNoMQkAlgoEAAAAgMLXLwCA6JImAICI3r4BAwkAAAICBVdBVkVTBQckbWF0Y2gxCQCWCgQAgIl6AICHpw4AgOiSJgCAlfUqAwkAAAICLEF0cXY1OUVZempGR3VpdEtWbk1SazZIOEZ1a2pvVjNrdFBvcmJFeXMyNW9uBQckbWF0Y2gxCQCWCgQAAACA2sQJAIDokiYAgLSJEwMJAAACAixEU2JiaExzU1RlRGc1THNpdWZrMkFuZWgzRGpWcUp1UHIyTTl1VTFnd3k1cAUHJG1hdGNoMQkAlgoEAAAAgNrECQCA6JImAIDC1y8DCQAAAgIsOHQ0RFBXVHdQenBhdEhBOUFrVHhXQUI0N1RIbll6QnNEbm9ZN2ZRcWJHOTEFByRtYXRjaDEJAJYKBAAAAICHpw4AgOiSJgCAtIkTAwkAAAICLEF0OEQ2TkZGcGhlQ2J2S1ZualZvZUxMODRFbzhOWm42b3ZNYW54ZkxhRldMBQckbWF0Y2gxCQCWCgQAAADA8PULAIDokiYAgLSJEwMJAAACAiw4TFFXOGY3UDVkNVBaTTdHdFpFQmdhcVJQR1N6UzNEZlB1aVhyVVJKNEFKUwUHJG1hdGNoMQkAlgoEAICJegCAh6cOAIDokiYAgOHrFwMJAAACAiw0NzRqVGVZeDJyMlZhMzU3OTR0Q1NjQVhXSkc5aFUySGNneHpNb3dhWlVudQUHJG1hdGNoMQkAlgoEAICJegCAh6cOAIDokiYAgOHrFwMJAAACAiw1VVlCUHBxNFdvVTVuNE13cEZrZ0puVzNGcTRCMXUzdWtwSzMzaWs0UWVyUgUHJG1hdGNoMQkAlgoEAICJegCAh6cOAIDokiYAgOHrFwMJAAACAiwydGhzQUN1SG16RE11TmV6UE0zMndnOWEzQndVekJXRGVTS2FrZ3ozY3cyMQUHJG1hdGNoMQkAlgoEAICJegCAtIkTAIDokiYAgMLXLwMJAAACAitZaU5ib2ZGekMxN2pFSEhDTXdyUmNweTlNcnJqYWJNTUxaeGc4ZzV4bWY3BQckbWF0Y2gxCQCWCgQAgIl6AICHpw4AgOiSJgCA6JImAwkAAAICLDl3YzNMWE5BNFRFQnNYeUt0b0xFOW1yYkREN1dNSFh2WHJDalp2YWJMQXNpBQckbWF0Y2gxCQCWCgQAAACA4esXAIDokiYAgISvXwMJAAACAiwzVnVWNVdUbUR6NDdEbWRuM1FwY1lqemJTZGlwalFFNEpNZE5lMXhacFgxMwUHJG1hdGNoMQkAlgoEAAAAgMLXLwCA6JImAICI3r4BCQCWCgQAAACA2sQJAIDokiYAgOiSJgMJAAACAiMzUDhEZjJiN3l3SHRMQkhCZThQQlZRWWQzQTVNZEVFSkFvdQUHJG1hdGNoMAkAlgoEAIDaxAkAgMLXLwCAjs4cAICI3r4BAwkAAAICIzNQNERLNVZ6RHdMM3ZmYzVhaFVFaHRvZTVCeVpOeWFjSjNYBQckbWF0Y2gwBAckbWF0Y2gxBQphc3NldElkU3RyAwkAAAICLDl3YzNMWE5BNFRFQnNYeUt0b0xFOW1yYkREN1dNSFh2WHJDalp2YWJMQXNpBQckbWF0Y2gxCQCWCgQAgIl6AMDw9QsAgOiSJgCAwtcvAwkAAAICLEhHZ2FiVHFVUzhXdFZGVUp6Zm1yVERNZ0VjY0p1WkxCUGhGZ1FGeHZuc29XBQckbWF0Y2gxCQCWCgQAgIl6AMDw9QsAgOiSJgCAwtcvAwkAAAICLDM0TjlZY0VFVExXbjkzcVlRNjRFc1AxeDg5dFNydUpVNDRSckVNU1hYRVBKBQckbWF0Y2gxCQCWCgQAgIl6AMDw9QsAgOiSJgCAwtcvAwkAAAICLDZYdEhqcFhiczlSUkpQMlNyOUdVeVZxekFDY2J5OVRrVGhIWG5qVkM1Q0RKBQckbWF0Y2gxCQCWCgQAgIl6AMDw9QsAgOiSJgCAwtcvAwkAAAICLERHMnhGa1BkRHdLVW9Ca3pHQWhRdExwU0d6ZlhMaUNZUEV6ZUtIMkFkMjRwBQckbWF0Y2gxCQCWCgQAgIl6AMDw9QsAgOiSJgCAwtcvAwkAAAICLEFqc282blRUanB0dTJVSEx4NmhmU1hWdEhGdFJCSkNrS1lkNVNBeWo3emY1BQckbWF0Y2gxCQCWCgQAgIl6AIC0iRMAgOiSJgCAo8NHAwkAAAICLEhFQjhRYXc5eHJXcFdzOHRIc2lBVFlHQldEQnRQMlM3a2NQQUxyTXU0M0FTBQckbWF0Y2gxCQCWCgQAAACA4esXAIDokiYAgIjevgEDCQAAAgIFV0FWRVMFByRtYXRjaDEJAJYKBACAiXoAgIenDgCA6JImAIDokiYDCQAAAgIsQXRxdjU5RVl6akZHdWl0S1ZuTVJrNkg4RnVram9WM2t0UG9yYkV5czI1b24FByRtYXRjaDEJAJYKBAAAAIDaxAkAgOiSJgCAtIkTAwkAAAICLERTYmJoTHNTVGVEZzVMc2l1ZmsyQW5laDNEalZxSnVQcjJNOXVVMWd3eTVwBQckbWF0Y2gxCQCWCgQAAACA2sQJAIDokiYAgMLXLwMJAAACAiw4dDREUFdUd1B6cGF0SEE5QWtUeFdBQjQ3VEhuWXpCc0Rub1k3ZlFxYkc5MQUHJG1hdGNoMQkAlgoEAAAAgIenDgCA6JImAIC0iRMDCQAAAgIsQXQ4RDZORkZwaGVDYnZLVm5qVm9lTEw4NEVvOE5abjZvdk1hbnhmTGFGV0wFByRtYXRjaDEJAJYKBAAAAMDw9QsAgOiSJgCAtIkTAwkAAAICLDhMUVc4ZjdQNWQ1UFpNN0d0WkVCZ2FxUlBHU3pTM0RmUHVpWHJVUko0QUpTBQckbWF0Y2gxCQCWCgQAgIl6AICHpw4AgOiSJgCA4esXAwkAAAICLDQ3NGpUZVl4MnIyVmEzNTc5NHRDU2NBWFdKRzloVTJIY2d4ek1vd2FaVW51BQckbWF0Y2gxCQCWCgQAgIl6AICHpw4AgOiSJgCA4esXAwkAAAICLDVVWUJQcHE0V29VNW40TXdwRmtnSm5XM0ZxNEIxdTN1a3BLMzNpazRRZXJSBQckbWF0Y2gxCQCWCgQAgIl6AICHpw4AgOiSJgCA4esXAwkAAAICLDJ0aHNBQ3VIbXpETXVOZXpQTTMyd2c5YTNCd1V6QldEZVNLYWtnejNjdzIxBQckbWF0Y2gxCQCWCgQAgIl6AIC0iRMAgOiSJgCAwtcvAwkAAAICK1lpTmJvZkZ6QzE3akVISENNd3JSY3B5OU1ycmphYk1NTFp4ZzhnNXhtZjcFByRtYXRjaDEJAJYKBACAiXoAgIenDgCA6JImAIDokiYDCQAAAgIsOXdjM0xYTkE0VEVCc1h5S3RvTEU5bXJiREQ3V01IWHZYckNqWnZhYkxBc2kFByRtYXRjaDEJAJYKBAAAAIDh6xcAgOiSJgCAhK9fAwkAAAICLDNWdVY1V1RtRHo0N0RtZG4zUXBjWWp6YlNkaXBqUUU0Sk1kTmUxeFpwWDEzBQckbWF0Y2gxCQCWCgQAAACAwtcvAIDokiYAgIjevgEJAJYKBAAAAIDaxAkAgOiSJgCA6JImAwkAAAICIzNQSHB1UVVQVlVvUjNBWXpGZUp6ZVdKZllMc0xUbVdzc1ZIBQckbWF0Y2gwCQCWCgQAgNrECQCAwtcvAICOzhwAgIjevgEDCQAAAgIjM1BBZDlBcWczY1FTenUyNk1GWVdRWWNqU1hQVkNKdHVmNVYFByRtYXRjaDAEByRtYXRjaDEFCmFzc2V0SWRTdHIDCQAAAgIsOXdjM0xYTkE0VEVCc1h5S3RvTEU5bXJiREQ3V01IWHZYckNqWnZhYkxBc2kFByRtYXRjaDEJAJYKBACAiXoAwPD1CwCA6JImAIDC1y8DCQAAAgIsSEdnYWJUcVVTOFd0VkZVSnpmbXJURE1nRWNjSnVaTEJQaEZnUUZ4dm5zb1cFByRtYXRjaDEJAJYKBACAiXoAwPD1CwCA6JImAIDC1y8DCQAAAgIsMzROOVljRUVUTFduOTNxWVE2NEVzUDF4ODl0U3J1SlU0NFJyRU1TWFhFUEoFByRtYXRjaDEJAJYKBACAiXoAwPD1CwCA6JImAIDC1y8DCQAAAgIsNlh0SGpwWGJzOVJSSlAyU3I5R1V5VnF6QUNjYnk5VGtUaEhYbmpWQzVDREoFByRtYXRjaDEJAJYKBACAiXoAwPD1CwCA6JImAIDC1y8DCQAAAgIsREcyeEZrUGREd0tVb0JrekdBaFF0THBTR3pmWExpQ1lQRXplS0gyQWQyNHAFByRtYXRjaDEJAJYKBACAiXoAwPD1CwCA6JImAIDC1y8DCQAAAgIsQWpzbzZuVFRqcHR1MlVITHg2aGZTWFZ0SEZ0UkJKQ2tLWWQ1U0F5ajd6ZjUFByRtYXRjaDEJAJYKBACAiXoAgLSJEwCA6JImAICjw0cDCQAAAgIsSEVCOFFhdzl4cldwV3M4dEhzaUFUWUdCV0RCdFAyUzdrY1BBTHJNdTQzQVMFByRtYXRjaDEJAJYKBAAAAIDaxAkAgOiSJgCAtIkTAwkAAAICBVdBVkVTBQckbWF0Y2gxCQCWCgQAgIl6AICHpw4AgOiSJgCA4esXAwkAAAICLEF0cXY1OUVZempGR3VpdEtWbk1SazZIOEZ1a2pvVjNrdFBvcmJFeXMyNW9uBQckbWF0Y2gxCQCWCgQAAACA2sQJAIDokiYAgLSJEwMJAAACAixEU2JiaExzU1RlRGc1THNpdWZrMkFuZWgzRGpWcUp1UHIyTTl1VTFnd3k1cAUHJG1hdGNoMQkAlgoEAAAAgNrECQCA6JImAIDC1y8DCQAAAgIsOHQ0RFBXVHdQenBhdEhBOUFrVHhXQUI0N1RIbll6QnNEbm9ZN2ZRcWJHOTEFByRtYXRjaDEJAJYKBAAAAICHpw4AgOiSJgCAtIkTAwkAAAICLEF0OEQ2TkZGcGhlQ2J2S1ZualZvZUxMODRFbzhOWm42b3ZNYW54ZkxhRldMBQckbWF0Y2gxCQCWCgQAAADA8PULAIDokiYAgLSJEwMJAAACAiw4TFFXOGY3UDVkNVBaTTdHdFpFQmdhcVJQR1N6UzNEZlB1aVhyVVJKNEFKUwUHJG1hdGNoMQkAlgoEAICJegCAh6cOAIDokiYAgOHrFwMJAAACAiw0NzRqVGVZeDJyMlZhMzU3OTR0Q1NjQVhXSkc5aFUySGNneHpNb3dhWlVudQUHJG1hdGNoMQkAlgoEAICJegCAh6cOAIDokiYAgOHrFwMJAAACAiw1VVlCUHBxNFdvVTVuNE13cEZrZ0puVzNGcTRCMXUzdWtwSzMzaWs0UWVyUgUHJG1hdGNoMQkAlgoEAICJegCAh6cOAIDokiYAgOHrFwMJAAACAiwydGhzQUN1SG16RE11TmV6UE0zMndnOWEzQndVekJXRGVTS2FrZ3ozY3cyMQUHJG1hdGNoMQkAlgoEAICJegCAtIkTAIDokiYAgMLXLwMJAAACAitZaU5ib2ZGekMxN2pFSEhDTXdyUmNweTlNcnJqYWJNTUxaeGc4ZzV4bWY3BQckbWF0Y2gxCQCWCgQAgIl6AICHpw4AgOiSJgCA6JImCQCWCgQAAACA2sQJAIDokiYAgOiSJgkAAgECDlVua25vd24gbWFya2V0AQNzdW0CBHNpemUEZGF0YQoBBGZvbGQCBWFjY3VtBG5leHQDCQBnAgUEbmV4dAUEc2l6ZQUFYWNjdW0JAGQCBQVhY2N1bQkAkQMCBQRkYXRhBQRuZXh0CgACJGwFBWFycjEyCgACJHMJAJADAQUCJGwKAAUkYWNjMAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQRmb2xkAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMgkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAEOZ2V0U2V0dXBUb2tlbnMBDW1hcmtldEFkZHJlc3MJALwJAgkBEUBleHRyTmF0aXZlKDEwNTMpAgUNbWFya2V0QWRkcmVzcwIMc2V0dXBfdG9rZW5zAgEsAQ1nZXRUb2tlblByaWNlAg1tYXJrZXRBZGRyZXNzCmFzc2V0SWRTdHIECW9yYWNsZVN0cgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQ1tYXJrZXRBZGRyZXNzAgZvcmFjbGUFEG9yYWNsZUFkZHJlc3NTdHIEDW9yYWNsZUFkZHJlc3MJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCW9yYWNsZVN0cgQHc3RhYmxlcwkAvAkCCQELdmFsdWVPckVsc2UCCQCdCAIFDW1hcmtldEFkZHJlc3MCEHNldHVwX3N0YWJsZXNJZHMCWTl3YzNMWE5BNFRFQnNYeUt0b0xFOW1yYkREN1dNSFh2WHJDalp2YWJMQXNpLEhHZ2FiVHFVUzhXdFZGVUp6Zm1yVERNZ0VjY0p1WkxCUGhGZ1FGeHZuc29XAgEsAwkBAiE9AgkAzwgCBQdzdGFibGVzBQphc3NldElkU3RyBQR1bml0AMCEPQMDAwkAAAIFCmFzc2V0SWRTdHIFCXVzZHRJZFN0cgYJAAACBQphc3NldElkU3RyBQl1c2RjSWRTdHIGCQAAAgUKYXNzZXRJZFN0cgUJcm9tZUlkU3RyAMCEPQMJAQ9jb250YWluc0VsZW1lbnQCBQdheGx5TFBzBQphc3NldElkU3RyCgABQAkA/AcEBQtheGx5QWRkcmVzcwIaZ2V0U2hhcmVBc3NldFByaWNlUkVBRE9OTFkJAMwIAgUKYXNzZXRJZFN0cgUDbmlsBQNuaWwDCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50BAVwcmljZQkBEUBleHRyTmF0aXZlKDEwNTApAgUNb3JhY2xlQWRkcmVzcwkArAICBQphc3NldElkU3RyAgdfdHdhcDVCBQVwcmljZQENZ2V0QXNzZXRTY2FsZQEKYXNzZXRJZFN0cgQIZGVjaW1hbHMDCQAAAgUKYXNzZXRJZFN0cgIFV0FWRVMACAgJAQV2YWx1ZQEJAOwHAQkA2QQBBQphc3NldElkU3RyCGRlY2ltYWxzCQBsBgAKAAAFCGRlY2ltYWxzAAAAAAUERE9XTgERZ2V0TGFzdFJhdGVIZWlnaHQBDW1hcmtldEFkZHJlc3MJAQt2YWx1ZU9yRWxzZQIJAJoIAgUNbWFya2V0QWRkcmVzcwIObGFzdFJhdGVIZWlnaHQAAAEWZ2V0T3V0ZGF0ZWRUb3RhbFN1cHBseQINbWFya2V0QWRkcmVzcwphc3NldElkU3RyCQELdmFsdWVPckVsc2UCCQCaCAIFDW1hcmtldEFkZHJlc3MJAKwCAgIPdG90YWxfc3VwcGxpZWRfBQphc3NldElkU3RyAAABFmdldE91dGRhdGVkVG90YWxCb3Jyb3cCDW1hcmtldEFkZHJlc3MKYXNzZXRJZFN0cgkBC3ZhbHVlT3JFbHNlAgkAmggCBQ1tYXJrZXRBZGRyZXNzCQCsAgICD3RvdGFsX2JvcnJvd2VkXwUKYXNzZXRJZFN0cgAAARBnZXRPdXRkYXRlZFNSYXRlAg1tYXJrZXRBZGRyZXNzCmFzc2V0SWRTdHIJAQt2YWx1ZU9yRWxzZQIJAJoIAgUNbWFya2V0QWRkcmVzcwkArAICBQphc3NldElkU3RyAgZfc1JhdGUAAAEQZ2V0T3V0ZGF0ZWRCUmF0ZQINbWFya2V0QWRkcmVzcwphc3NldElkU3RyCQELdmFsdWVPckVsc2UCCQCaCAIFDW1hcmtldEFkZHJlc3MJAKwCAgUKYXNzZXRJZFN0cgIGX2JSYXRlAAABDWdldE91dGRhdGVkVXIEE291dGRhdGVkVG90YWxTdXBwbHkTb3V0ZGF0ZWRUb3RhbEJvcnJvdw1vdXRkYXRlZFNSYXRlDW91dGRhdGVkQlJhdGUEBGRvd24JAGsDBRNvdXRkYXRlZFRvdGFsU3VwcGx5BQ1vdXRkYXRlZFNSYXRlBQdTY2FsZTE2AwkAAAIFBGRvd24AAAAACQBrAwUGU2NhbGU4CQBrAwUTb3V0ZGF0ZWRUb3RhbEJvcnJvdwUNb3V0ZGF0ZWRCUmF0ZQUHU2NhbGUxNgUEZG93bgEHZ2V0UmF0ZQMKb3V0ZGF0ZWRVcgphc3NldElkU3RyCW1hcmtldFN0cgQFY3VydmUJAQxnZXRSYXRlQ3VydmUCBQphc3NldElkU3RyBQltYXJrZXRTdHIJAGQCCAUFY3VydmUCXzEDCQBnAggFBWN1cnZlAl8zBQpvdXRkYXRlZFVyCQBrAwUKb3V0ZGF0ZWRVcggFBWN1cnZlAl8yCAUFY3VydmUCXzMJAGQCCAUFY3VydmUCXzIJAGsDCQBlAgUKb3V0ZGF0ZWRVcggFBWN1cnZlAl8zCAUFY3VydmUCXzQJAGUCAIDC1y8IBQVjdXJ2ZQJfMwELZ2V0SW50ZXJlc3QBBHJhdGUJAJYDAQkAzAgCCQBrAwUEcmF0ZQUGU2NhbGU4BQp5ZWFyQmxvY2tzCQDMCAIAAQUDbmlsAQ1nZXRBc3NldEluZGV4AgtzZXR1cFRva2Vucwphc3NldElkU3RyCQEFdmFsdWUBCQDPCAIFC3NldHVwVG9rZW5zBQphc3NldElkU3RyARFnZXRBc3NldFBhcmFtdGVycwIQbWFya2V0UGFyYW1ldGVycwphc3NldEluZGV4CQCVCgMJAJEDAggFEG1hcmtldFBhcmFtZXRlcnMCXzEFCmFzc2V0SW5kZXgJAJEDAggFEG1hcmtldFBhcmFtZXRlcnMCXzIFCmFzc2V0SW5kZXgJAJEDAggFEG1hcmtldFBhcmFtZXRlcnMCXzMFCmFzc2V0SW5kZXgBE2dldE1hcmtldFBhcmFtZXRlcnMCDW1hcmtldEFkZHJlc3MLc2V0dXBUb2tlbnMEB3NldHVwQ2YJALwJAgkBEUBleHRyTmF0aXZlKDEwNTMpAgUNbWFya2V0QWRkcmVzcwIKc2V0dXBfbHR2cwIBLAQHc2V0dXBMdAkAvAkCCQERQGV4dHJOYXRpdmUoMTA1MykCBQ1tYXJrZXRBZGRyZXNzAglzZXR1cF9sdHMCASwEDHNldHVwUGVuYWx0eQkAvAkCCQERQGV4dHJOYXRpdmUoMTA1MykCBQ1tYXJrZXRBZGRyZXNzAg9zZXR1cF9wZW5hbHRpZXMCASwECnRva2Vuc1NpemUJAJADAQULc2V0dXBUb2tlbnMKAQRmb2xkAgVhY2N1bQRuZXh0AwkAZwIFBG5leHQFCnRva2Vuc1NpemUFBWFjY3VtCQCVCgMJAM0IAggFBWFjY3VtAl8xCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHc2V0dXBDZgUEbmV4dAkAzQgCCAUFYWNjdW0CXzIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdzZXR1cEx0BQRuZXh0CQDNCAIIBQVhY2N1bQJfMwkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDHNldHVwUGVuYWx0eQUEbmV4dAoAAiRsBQVhcnIxMgoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJUKAwUDbmlsBQNuaWwFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEEZm9sZAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTIJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwBDGdldE1heFN1cHBseQINbWFya2V0QWRkcmVzcwphc3NldElkU3RyCQENcGFyc2VJbnRWYWx1ZQEJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUNbWFya2V0QWRkcmVzcwkArAICAhBzZXR1cF9tYXhTdXBwbHlfBQphc3NldElkU3RyAgEwAQ5nZXRBY3R1YWxTUmF0ZQQObGFzdFJhdGVIZWlnaHQIaW50ZXJlc3QKb3V0ZGF0ZWRVcg1vdXRkYXRlZFNSYXRlBAlsYXN0U1JhdGUJAJYDAQkAzAgCBQ1vdXRkYXRlZFNSYXRlCQDMCAIFB1NjYWxlMTYFA25pbAQIbmV3U1JhdGUJAGQCBQlsYXN0U1JhdGUJAGkCCQBoAgkAaAIJAGUCBQZoZWlnaHQFDmxhc3RSYXRlSGVpZ2h0CQBrAwUIaW50ZXJlc3QFCm91dGRhdGVkVXIFBlNjYWxlOAkAZQIAZAULcmVzZXJ2ZUZ1bmQAZAUIbmV3U1JhdGUBDmdldEFjdHVhbEJSYXRlAw5sYXN0UmF0ZUhlaWdodAhpbnRlcmVzdA1vdXRkYXRlZEJSYXRlBAlsYXN0QlJhdGUJAJYDAQkAzAgCBQ1vdXRkYXRlZEJSYXRlCQDMCAIFB1NjYWxlMTYFA25pbAQIbmV3QlJhdGUJAGQCBQlsYXN0QlJhdGUJAGgCCQBlAgUGaGVpZ2h0BQ5sYXN0UmF0ZUhlaWdodAUIaW50ZXJlc3QFCG5ld0JSYXRlAQtnZXRBY3R1YWxVcgIMYWN0dWFsU3VwcGx5DGFjdHVhbEJvcnJvdwMJAAACBQxhY3R1YWxTdXBwbHkAAAAACQBrAwUMYWN0dWFsQm9ycm93BQZTY2FsZTgFDGFjdHVhbFN1cHBseQEPZ2V0QWN0dWFsQW1vdW50Ag5vdXRkYXRlZEFtb3VudAphY3R1YWxSYXRlCQBrAwUOb3V0ZGF0ZWRBbW91bnQFCmFjdHVhbFJhdGUFB1NjYWxlMTYBCGdldEluVXNkAwxhY3R1YWxBbW91bnQKYXNzZXRTY2FsZQVwcmljZQkAawMFDGFjdHVhbEFtb3VudAUFcHJpY2UFCmFzc2V0U2NhbGUBDGdldFN1cHBseUFweQIEcmF0ZQhhY3R1YWxVcgQKc3VwcGx5UmF0ZQkAawMJAGsDBQRyYXRlAFAAZAUIYWN0dWFsVXIFBlNjYWxlOAkAZQIJAKADAQkAdgYJALcCAgUKU2NhbGUxNkJpZwkAvAIDCQC2AgEFCnN1cHBseVJhdGUFCVNjYWxlOEJpZwUNeWVhckJsb2Nrc0JpZwAQBQ15ZWFyQmxvY2tzQmlnAAAACAUERE9XTgUGU2NhbGU4AQxnZXRCb3Jyb3dBcHkBBHJhdGUJAGUCCQCgAwEJAHYGCQC3AgIFClNjYWxlMTZCaWcJALwCAwkAtgIBBQRyYXRlBQlTY2FsZThCaWcFDXllYXJCbG9ja3NCaWcAEAUNeWVhckJsb2Nrc0JpZwAAAAgFBERPV04FBlNjYWxlOAEPZ2V0V2FsbGV0U3VwcGx5BA1tYXJrZXRBZGRyZXNzCmFzc2V0SWRTdHIGd2FsbGV0C2FjdHVhbFNSYXRlBBRvdXRkYXRlZFdhbGxldFN1cHBseQkBC3ZhbHVlT3JFbHNlAgkAmggCBQ1tYXJrZXRBZGRyZXNzCQCsAgIJAKwCAgUGd2FsbGV0Agpfc3VwcGxpZWRfBQphc3NldElkU3RyAAAJAQ9nZXRBY3R1YWxBbW91bnQCBRRvdXRkYXRlZFdhbGxldFN1cHBseQULYWN0dWFsU1JhdGUBD2dldFdhbGxldEJvcnJvdwQNbWFya2V0QWRkcmVzcwphc3NldElkU3RyBndhbGxldAthY3R1YWxCUmF0ZQQUb3V0ZGF0ZWRXYWxsZXRCb3Jyb3cJAQt2YWx1ZU9yRWxzZQIJAJoIAgUNbWFya2V0QWRkcmVzcwkArAICCQCsAgIFBndhbGxldAIKX2JvcnJvd2VkXwUKYXNzZXRJZFN0cgAACQEPZ2V0QWN0dWFsQW1vdW50AgUUb3V0ZGF0ZWRXYWxsZXRCb3Jyb3cFC2FjdHVhbEJSYXRlARBnZXREYWlseVBlcmNlbnRzAgNhcHkIcXVhbnRpdHkJAGsDCQBrAwkAZQIJAKADAQkAdgYJALcCAgUJU2NhbGU4QmlnCQC2AgEFA2FweQAICQC6AgIFClNjYWxlMTZCaWcFDXllYXJCbG9ja3NCaWcAEAAQBQRET1dOBQdTY2FsZTE2BQlkYXlCbG9ja3MFBlNjYWxlOAUIcXVhbnRpdHkFBlNjYWxlOAEQZ2V0QWNjb3VudEhlYWx0aAIbdG90YWxXYWxsZXRCb3Jyb3dMaW1pdEluVXNkG3RvdGFsV2FsbGV0Qm9ycm93VXNhZ2VJblVzZAMJAAACBRt0b3RhbFdhbGxldEJvcnJvd0xpbWl0SW5Vc2QAAAUGU2NhbGU4CQBlAgUGU2NhbGU4CQBrAwUbdG90YWxXYWxsZXRCb3Jyb3dVc2FnZUluVXNkBQZTY2FsZTgFG3RvdGFsV2FsbGV0Qm9ycm93TGltaXRJblVzZAEJZ2V0TmV0QXB5AxZ0b3RhbFdhbGxldFN1cHBseUluVXNkFnRvdGFsV2FsbGV0Qm9ycm93SW5Vc2QWdG90YWxXYWxsZXRNYXJnaW5JblVzZAMJAAACBRZ0b3RhbFdhbGxldE1hcmdpbkluVXNkAAAAAAMJAGYCBRZ0b3RhbFdhbGxldE1hcmdpbkluVXNkAAAJAGsDBRZ0b3RhbFdhbGxldE1hcmdpbkluVXNkBQZTY2FsZTgFFnRvdGFsV2FsbGV0U3VwcGx5SW5Vc2QJAGsDBRZ0b3RhbFdhbGxldE1hcmdpbkluVXNkBQZTY2FsZTgFFnRvdGFsV2FsbGV0Qm9ycm93SW5Vc2QBC2Fzc2V0VG9Kc29uAgphc3NldElkU3RyCHF1YW50aXR5BA0kdDAxNTM0MzE1NTM4AwkAAAIFCmFzc2V0SWRTdHIFBVdhdmVzCQCUCgIACAIFV0FWRVMEBWFzc2V0CQEFdmFsdWUBCQDsBwEJANkEAQUKYXNzZXRJZFN0cgkAlAoCCAUFYXNzZXQIZGVjaW1hbHMIBQVhc3NldARuYW1lBAhkZWNpbWFscwgFDSR0MDE1MzQzMTU1MzgCXzEEBG5hbWUIBQ0kdDAxNTM0MzE1NTM4Al8yCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIMeyJxdWFudGl0eSI6CQCkAwEFCHF1YW50aXR5AgwsImRlY2ltYWxzIjoJAKQDAQUIZGVjaW1hbHMCCSwibmFtZSI6IgUEbmFtZQIIIiwiaWQiOiIFCmFzc2V0SWRTdHICAiJ9AQ9hbW91bnRUb0RlY2ltYWwCBmFtb3VudAhkZWNpbWFscwkArAICCQCsAgIJAKwCAgkArAICAgx7InF1YW50aXR5IjoJAKQDAQUGYW1vdW50AgwsImRlY2ltYWxzIjoJAKQDAQUIZGVjaW1hbHMCEywibmFtZSI6IiIsImlkIjoiIn0BDWdldE1hcmtldEpzb24DC21hcmtldEluZGV4BndhbGxldAVkZWJ1ZwQJbWFya2V0U3RyCQERQGV4dHJOYXRpdmUoMTA1OCkBCQCsAgICB21hcmtldF8JAKQDAQULbWFya2V0SW5kZXgEDW1hcmtldEFkZHJlc3MJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCW1hcmtldFN0cgQKbWFya2V0TmFtZQkBEUBleHRyTmF0aXZlKDEwNTgpAQkArAICAgxtYXJrZXRfbmFtZV8FCW1hcmtldFN0cgQGYWN0aXZlCQELdmFsdWVPckVsc2UCCQCbCAIFDW1hcmtldEFkZHJlc3MCDHNldHVwX2FjdGl2ZQYEC3NldHVwVG9rZW5zCQEOZ2V0U2V0dXBUb2tlbnMBBQ1tYXJrZXRBZGRyZXNzBAthc3NldHNDb3VudAkAkAMBBQtzZXR1cFRva2VucwQObGFzdFJhdGVIZWlnaHQJARFnZXRMYXN0UmF0ZUhlaWdodAEFDW1hcmtldEFkZHJlc3MKAQphc3NldHNGb2xkAgVhY2N1bQRuZXh0AwkAZwIFBG5leHQFC2Fzc2V0c0NvdW50BQVhY2N1bQQKYXNzZXRJZFN0cgkAkQMCBQtzZXR1cFRva2VucwUEbmV4dAQFcHJpY2UJAQ1nZXRUb2tlblByaWNlAgUNbWFya2V0QWRkcmVzcwUKYXNzZXRJZFN0cgQKYXNzZXRTY2FsZQkBDWdldEFzc2V0U2NhbGUBBQphc3NldElkU3RyBBNvdXRkYXRlZFRvdGFsU3VwcGx5CQEWZ2V0T3V0ZGF0ZWRUb3RhbFN1cHBseQIFDW1hcmtldEFkZHJlc3MFCmFzc2V0SWRTdHIEE291dGRhdGVkVG90YWxCb3Jyb3cJARZnZXRPdXRkYXRlZFRvdGFsQm9ycm93AgUNbWFya2V0QWRkcmVzcwUKYXNzZXRJZFN0cgQNb3V0ZGF0ZWRTUmF0ZQkBEGdldE91dGRhdGVkU1JhdGUCBQ1tYXJrZXRBZGRyZXNzBQphc3NldElkU3RyBA1vdXRkYXRlZEJSYXRlCQEQZ2V0T3V0ZGF0ZWRCUmF0ZQIFDW1hcmtldEFkZHJlc3MFCmFzc2V0SWRTdHIECm91dGRhdGVkVXIJAQ1nZXRPdXRkYXRlZFVyBAUTb3V0ZGF0ZWRUb3RhbFN1cHBseQUTb3V0ZGF0ZWRUb3RhbEJvcnJvdwUNb3V0ZGF0ZWRTUmF0ZQUNb3V0ZGF0ZWRCUmF0ZQQEcmF0ZQkBB2dldFJhdGUDBQpvdXRkYXRlZFVyBQphc3NldElkU3RyBQltYXJrZXRTdHIECGludGVyZXN0CQELZ2V0SW50ZXJlc3QBBQRyYXRlBAVzUmF0ZQkBDmdldEFjdHVhbFNSYXRlBAUObGFzdFJhdGVIZWlnaHQFCGludGVyZXN0BQpvdXRkYXRlZFVyBQ1vdXRkYXRlZFNSYXRlBAViUmF0ZQkBDmdldEFjdHVhbEJSYXRlAwUObGFzdFJhdGVIZWlnaHQFCGludGVyZXN0BQ1vdXRkYXRlZEJSYXRlBAZzdXBwbHkJAQ9nZXRBY3R1YWxBbW91bnQCBRNvdXRkYXRlZFRvdGFsU3VwcGx5BQVzUmF0ZQQGYm9ycm93CQEPZ2V0QWN0dWFsQW1vdW50AgUTb3V0ZGF0ZWRUb3RhbEJvcnJvdwUFYlJhdGUEC3N1cHBseUluVXNkCQEIZ2V0SW5Vc2QDBQZzdXBwbHkFCmFzc2V0U2NhbGUFBXByaWNlBAtib3Jyb3dJblVzZAkBCGdldEluVXNkAwUGYm9ycm93BQphc3NldFNjYWxlBQVwcmljZQQIcmVzZXJ2ZXMJAGUCBQZzdXBwbHkFBmJvcnJvdwQNcmVzZXJ2ZXNJblVzZAkBCGdldEluVXNkAwUIcmVzZXJ2ZXMFCmFzc2V0U2NhbGUFBXByaWNlBAJ1cgkBC2dldEFjdHVhbFVyAgUGc3VwcGx5BQZib3Jyb3cECXN1cHBseUFweQkBDGdldFN1cHBseUFweQIFBHJhdGUFAnVyBAlib3Jyb3dBcHkJAQxnZXRCb3Jyb3dBcHkBBQRyYXRlBA9tYXJrZXRBc3NldEpzb24JAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIBewIJInN1cHBseSI6CQELYXNzZXRUb0pzb24CBQphc3NldElkU3RyBQZzdXBwbHkCDywic3VwcGx5SW5Vc2QiOgkBC2Fzc2V0VG9Kc29uAgUJdXNkdElkU3RyBQtzdXBwbHlJblVzZAIKLCJib3Jyb3ciOgkBC2Fzc2V0VG9Kc29uAgUKYXNzZXRJZFN0cgUGYm9ycm93Ag8sImJvcnJvd0luVXNkIjoJAQthc3NldFRvSnNvbgIFCXVzZHRJZFN0cgULYm9ycm93SW5Vc2QCDCwicmVzZXJ2ZXMiOgkBC2Fzc2V0VG9Kc29uAgUKYXNzZXRJZFN0cgUIcmVzZXJ2ZXMCESwicmVzZXJ2ZXNJblVzZCI6CQELYXNzZXRUb0pzb24CBQl1c2R0SWRTdHIFDXJlc2VydmVzSW5Vc2QCCSwicHJpY2UiOgkBC2Fzc2V0VG9Kc29uAgUJdXNkdElkU3RyBQVwcmljZQINLCJzdXBwbHlBcHkiOgkBD2Ftb3VudFRvRGVjaW1hbAIFCXN1cHBseUFweQAIAg0sImJvcnJvd0FweSI6CQEPYW1vdW50VG9EZWNpbWFsAgUJYm9ycm93QXB5AAgCFCwidXRpbGl6YXRpb25SYXRpbyI6CQEPYW1vdW50VG9EZWNpbWFsAgUCdXIACAIJLCJzUmF0ZSI6CQEPYW1vdW50VG9EZWNpbWFsAgUFc1JhdGUAEAIJLCJiUmF0ZSI6CQEPYW1vdW50VG9EZWNpbWFsAgUFYlJhdGUAEAIBfQkAlgoECQBkAggFBWFjY3VtAl8xBQtzdXBwbHlJblVzZAkAZAIIBQVhY2N1bQJfMgULYm9ycm93SW5Vc2QJAGQCCAUFYWNjdW0CXzMFDXJlc2VydmVzSW5Vc2QJAM0IAggFBWFjY3VtAl80BQ9tYXJrZXRBc3NldEpzb24EDSR0MDE4OTUxMTkwNTkKAAIkbAUFYXJyMTIKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCWCgQAAAAAAAAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEKYXNzZXRzRm9sZAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTIJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwEC3N1cHBseUluVXNkCAUNJHQwMTg5NTExOTA1OQJfMQQLYm9ycm93SW5Vc2QIBQ0kdDAxODk1MTE5MDU5Al8yBA1yZXNlcnZlc0luVXNkCAUNJHQwMTg5NTExOTA1OQJfMwQQbWFya2V0QXNzZXRzSnNvbggFDSR0MDE4OTUxMTkwNTkCXzQEDG1hcmtldHNDb3VudAkBEUBleHRyTmF0aXZlKDEwNTUpAQIHbWFya2V0cwoBC21hcmtldHNGb2xkAgVhY2N1bQRuZXh0AwkAZwIFBG5leHQFDG1hcmtldHNDb3VudAUFYWNjdW0EF2N1cnJlbnRNYXJrZXRBZGRyZXNzU3RyCQERQGV4dHJOYXRpdmUoMTA1OCkBCQCsAgICB21hcmtldF8JAKQDAQUEbmV4dAQRY3VycmVudE1hcmtldE5hbWUJARFAZXh0ck5hdGl2ZSgxMDU4KQEJAKwCAgIMbWFya2V0X25hbWVfBRdjdXJyZW50TWFya2V0QWRkcmVzc1N0cgQKc2ltcGxlSnNvbgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAgF7AggiaW5kZXgiOgkApAMBBQRuZXh0AgksIm5hbWUiOiIFEWN1cnJlbnRNYXJrZXROYW1lAgEiAg8sInN1cHBseUluVXNkIjoJAQthc3NldFRvSnNvbgIFCXVzZHRJZFN0cgAAAhEsImFjY291bnRIZWFsdGgiOgkBD2Ftb3VudFRvRGVjaW1hbAIAAAAIAgF9AwkAAAIFBndhbGxldAIACQDNCAIFBWFjY3VtBQpzaW1wbGVKc29uBBRjdXJyZW50TWFya2V0QWRkcmVzcwkBEUBleHRyTmF0aXZlKDEwNjIpAQUXY3VycmVudE1hcmtldEFkZHJlc3NTdHIEEmN1cnJlbnRTZXR1cFRva2VucwkBDmdldFNldHVwVG9rZW5zAQUUY3VycmVudE1hcmtldEFkZHJlc3MEEmN1cnJlbnRBc3NldHNDb3VudAkAkAMBBRJjdXJyZW50U2V0dXBUb2tlbnMEFmN1cnJlbnRNYXJrZXRTaG9ydE5hbWUJARFAZXh0ck5hdGl2ZSgxMDU4KQEJAKwCAgIRbWFya2V0X3Nob3J0bmFtZV8FF2N1cnJlbnRNYXJrZXRBZGRyZXNzU3RyBAdzZXR1cENmCQC8CQIJARFAZXh0ck5hdGl2ZSgxMDUzKQIFFGN1cnJlbnRNYXJrZXRBZGRyZXNzAgpzZXR1cF9sdHZzAgEsBAdzZXR1cEx0CQC8CQIJARFAZXh0ck5hdGl2ZSgxMDUzKQIFFGN1cnJlbnRNYXJrZXRBZGRyZXNzAglzZXR1cF9sdHMCASwEFWN1cnJlbnRMYXN0UmF0ZUhlaWdodAkBEWdldExhc3RSYXRlSGVpZ2h0AQUUY3VycmVudE1hcmtldEFkZHJlc3MKARBtYXJrZXRBc3NldHNGb2xkAgVhY2N1bQRuZXh0AwkAZwIFBG5leHQFEmN1cnJlbnRBc3NldHNDb3VudAUFYWNjdW0ECmFzc2V0SWRTdHIJAJEDAgUSY3VycmVudFNldHVwVG9rZW5zBQRuZXh0BAJjZgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFB3NldHVwQ2YFBG5leHQEAmx0CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHc2V0dXBMdAUEbmV4dAQFcHJpY2UJAQ1nZXRUb2tlblByaWNlAgUNbWFya2V0QWRkcmVzcwUKYXNzZXRJZFN0cgQKYXNzZXRTY2FsZQkBDWdldEFzc2V0U2NhbGUBBQphc3NldElkU3RyBBNvdXRkYXRlZFRvdGFsU3VwcGx5CQEWZ2V0T3V0ZGF0ZWRUb3RhbFN1cHBseQIFFGN1cnJlbnRNYXJrZXRBZGRyZXNzBQphc3NldElkU3RyBBNvdXRkYXRlZFRvdGFsQm9ycm93CQEWZ2V0T3V0ZGF0ZWRUb3RhbEJvcnJvdwIFFGN1cnJlbnRNYXJrZXRBZGRyZXNzBQphc3NldElkU3RyBA1vdXRkYXRlZFNSYXRlCQEQZ2V0T3V0ZGF0ZWRTUmF0ZQIFFGN1cnJlbnRNYXJrZXRBZGRyZXNzBQphc3NldElkU3RyBA1vdXRkYXRlZEJSYXRlCQEQZ2V0T3V0ZGF0ZWRCUmF0ZQIFFGN1cnJlbnRNYXJrZXRBZGRyZXNzBQphc3NldElkU3RyBApvdXRkYXRlZFVyCQENZ2V0T3V0ZGF0ZWRVcgQFE291dGRhdGVkVG90YWxTdXBwbHkFE291dGRhdGVkVG90YWxCb3Jyb3cFDW91dGRhdGVkU1JhdGUFDW91dGRhdGVkQlJhdGUEBHJhdGUJAQdnZXRSYXRlAwUKb3V0ZGF0ZWRVcgUKYXNzZXRJZFN0cgUJbWFya2V0U3RyBAhpbnRlcmVzdAkBC2dldEludGVyZXN0AQUEcmF0ZQQFc1JhdGUJAQ5nZXRBY3R1YWxTUmF0ZQQFFWN1cnJlbnRMYXN0UmF0ZUhlaWdodAUIaW50ZXJlc3QFCm91dGRhdGVkVXIFDW91dGRhdGVkU1JhdGUEBWJSYXRlCQEOZ2V0QWN0dWFsQlJhdGUDBRVjdXJyZW50TGFzdFJhdGVIZWlnaHQFCGludGVyZXN0BQ1vdXRkYXRlZEJSYXRlBAx3YWxsZXRTdXBwbHkJAQ9nZXRXYWxsZXRTdXBwbHkEBRRjdXJyZW50TWFya2V0QWRkcmVzcwUKYXNzZXRJZFN0cgUGd2FsbGV0BQVzUmF0ZQQRd2FsbGV0U3VwcGx5SW5Vc2QJAQhnZXRJblVzZAMFDHdhbGxldFN1cHBseQUKYXNzZXRTY2FsZQUFcHJpY2UEDHdhbGxldEJvcnJvdwkBD2dldFdhbGxldEJvcnJvdwQFFGN1cnJlbnRNYXJrZXRBZGRyZXNzBQphc3NldElkU3RyBQZ3YWxsZXQFBWJSYXRlBBF3YWxsZXRCb3Jyb3dJblVzZAkBCGdldEluVXNkAwUMd2FsbGV0Qm9ycm93BQphc3NldFNjYWxlBQVwcmljZQQWd2FsbGV0Qm9ycm93TGltaXRJblVzZAkAawMFEXdhbGxldFN1cHBseUluVXNkBQJjZgUGU2NhbGU4BBZ3YWxsZXRCb3Jyb3dVc2FnZUluVXNkCQBrAwURd2FsbGV0Qm9ycm93SW5Vc2QFBlNjYWxlOAUCbHQJAJYKBAkAZAIIBQVhY2N1bQJfMQURd2FsbGV0U3VwcGx5SW5Vc2QJAGQCCAUFYWNjdW0CXzIFEXdhbGxldEJvcnJvd0luVXNkCQBkAggFBWFjY3VtAl8zBRZ3YWxsZXRCb3Jyb3dMaW1pdEluVXNkCQBkAggFBWFjY3VtAl80BRZ3YWxsZXRCb3Jyb3dVc2FnZUluVXNkBA0kdDAyMjYzNjIyNzk2CgACJGwFBWFycjEyCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlgoEAAAAAAAAAAAKAQUkZjFfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBEG1hcmtldEFzc2V0c0ZvbGQCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjFfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEyCQEFJGYxXzICCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMBBZ0b3RhbFdhbGxldFN1cHBseUluVXNkCAUNJHQwMjI2MzYyMjc5NgJfMQQWdG90YWxXYWxsZXRCb3Jyb3dJblVzZAgFDSR0MDIyNjM2MjI3OTYCXzIEG3RvdGFsV2FsbGV0Qm9ycm93TGltaXRJblVzZAgFDSR0MDIyNjM2MjI3OTYCXzMEG3RvdGFsV2FsbGV0Qm9ycm93VXNhZ2VJblVzZAgFDSR0MDIyNjM2MjI3OTYCXzQEDWFjY291bnRIZWFsdGgJARBnZXRBY2NvdW50SGVhbHRoAgUbdG90YWxXYWxsZXRCb3Jyb3dMaW1pdEluVXNkBRt0b3RhbFdhbGxldEJvcnJvd1VzYWdlSW5Vc2QECGZ1bGxKc29uCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAgF7AggiaW5kZXgiOgkApAMBBQRuZXh0AgksIm5hbWUiOiIFFmN1cnJlbnRNYXJrZXRTaG9ydE5hbWUCASICDywic3VwcGx5SW5Vc2QiOgkBC2Fzc2V0VG9Kc29uAgUJdXNkdElkU3RyBRZ0b3RhbFdhbGxldFN1cHBseUluVXNkAg8sImJvcnJvd0luVXNkIjoJAQthc3NldFRvSnNvbgIFCXVzZHRJZFN0cgUWdG90YWxXYWxsZXRCb3Jyb3dJblVzZAIRLCJhY2NvdW50SGVhbHRoIjoJAQ9hbW91bnRUb0RlY2ltYWwCBQ1hY2NvdW50SGVhbHRoAAgCAX0JAM0IAgUFYWNjdW0FCGZ1bGxKc29uBAttYXJrZXRzSnNvbgoAAiRsBQVhcnIxMgoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMV8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQELbWFya2V0c0ZvbGQCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjFfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEyCQEFJGYxXzICCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMBARqc29uCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIBewIIImluZGV4IjoJAKQDAQULbWFya2V0SW5kZXgCCSwibmFtZSI6IgUKbWFya2V0TmFtZQIBIgIMLCJhZGRyZXNzIjoiBQltYXJrZXRTdHICASICCiwiYWN0aXZlIjoJAKUDAQUGYWN0aXZlAg8sInN1cHBseUluVXNkIjoJAQthc3NldFRvSnNvbgIFCXVzZHRJZFN0cgULc3VwcGx5SW5Vc2QCDywiYm9ycm93SW5Vc2QiOgkBC2Fzc2V0VG9Kc29uAgUJdXNkdElkU3RyBQtib3Jyb3dJblVzZAIRLCJyZXNlcnZlc0luVXNkIjoJAQthc3NldFRvSnNvbgIFCXVzZHRJZFN0cgUNcmVzZXJ2ZXNJblVzZAILLCJhc3NldHMiOlsJALsJAgUQbWFya2V0QXNzZXRzSnNvbgIBLAIBXQIMLCJtYXJrZXRzIjpbCQC7CQIFC21hcmtldHNKc29uAgEsAgFdAgF9AwUFZGVidWcJAAIBBQRqc29uBQRqc29uAQtnZXRNZW51SnNvbgEFZGVidWcEDG1hcmtldHNDb3VudAkBEUBleHRyTmF0aXZlKDEwNTUpAQIHbWFya2V0cwoBC21hcmtldHNGb2xkAgVhY2N1bQRuZXh0AwkAZwIFBG5leHQFDG1hcmtldHNDb3VudAUFYWNjdW0ECW1hcmtldFN0cgkBEUBleHRyTmF0aXZlKDEwNTgpAQkArAICAgdtYXJrZXRfCQCkAwEFBG5leHQEDW1hcmtldEFkZHJlc3MJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCW1hcmtldFN0cgQLc2V0dXBUb2tlbnMJAQ5nZXRTZXR1cFRva2VucwEFDW1hcmtldEFkZHJlc3MEC2Fzc2V0c0NvdW50CQCQAwEFC3NldHVwVG9rZW5zBA5sYXN0UmF0ZUhlaWdodAkBEWdldExhc3RSYXRlSGVpZ2h0AQUNbWFya2V0QWRkcmVzcwoBCmFzc2V0c0ZvbGQCBWFjY3VtBG5leHQDCQBnAgUEbmV4dAULYXNzZXRzQ291bnQFBWFjY3VtBAphc3NldElkU3RyCQCRAwIFC3NldHVwVG9rZW5zBQRuZXh0BAVwcmljZQkBDWdldFRva2VuUHJpY2UCBQ1tYXJrZXRBZGRyZXNzBQphc3NldElkU3RyBAphc3NldFNjYWxlCQENZ2V0QXNzZXRTY2FsZQEFCmFzc2V0SWRTdHIEE291dGRhdGVkVG90YWxTdXBwbHkJARZnZXRPdXRkYXRlZFRvdGFsU3VwcGx5AgUNbWFya2V0QWRkcmVzcwUKYXNzZXRJZFN0cgQTb3V0ZGF0ZWRUb3RhbEJvcnJvdwkBFmdldE91dGRhdGVkVG90YWxCb3Jyb3cCBQ1tYXJrZXRBZGRyZXNzBQphc3NldElkU3RyBA1vdXRkYXRlZFNSYXRlCQEQZ2V0T3V0ZGF0ZWRTUmF0ZQIFDW1hcmtldEFkZHJlc3MFCmFzc2V0SWRTdHIEDW91dGRhdGVkQlJhdGUJARBnZXRPdXRkYXRlZEJSYXRlAgUNbWFya2V0QWRkcmVzcwUKYXNzZXRJZFN0cgQKb3V0ZGF0ZWRVcgkBDWdldE91dGRhdGVkVXIEBRNvdXRkYXRlZFRvdGFsU3VwcGx5BRNvdXRkYXRlZFRvdGFsQm9ycm93BQ1vdXRkYXRlZFNSYXRlBQ1vdXRkYXRlZEJSYXRlBARyYXRlCQEHZ2V0UmF0ZQMFCm91dGRhdGVkVXIFCmFzc2V0SWRTdHIFCW1hcmtldFN0cgQIaW50ZXJlc3QJAQtnZXRJbnRlcmVzdAEFBHJhdGUEBXNSYXRlCQEOZ2V0QWN0dWFsU1JhdGUEBQ5sYXN0UmF0ZUhlaWdodAUIaW50ZXJlc3QFCm91dGRhdGVkVXIFDW91dGRhdGVkU1JhdGUEBWJSYXRlCQEOZ2V0QWN0dWFsQlJhdGUDBQ5sYXN0UmF0ZUhlaWdodAUIaW50ZXJlc3QFDW91dGRhdGVkQlJhdGUEBnN1cHBseQkBD2dldEFjdHVhbEFtb3VudAIFE291dGRhdGVkVG90YWxTdXBwbHkFBXNSYXRlBAZib3Jyb3cJAQ9nZXRBY3R1YWxBbW91bnQCBRNvdXRkYXRlZFRvdGFsQm9ycm93BQViUmF0ZQQLc3VwcGx5SW5Vc2QJAQhnZXRJblVzZAMFBnN1cHBseQUKYXNzZXRTY2FsZQUFcHJpY2UEC2JvcnJvd0luVXNkCQEIZ2V0SW5Vc2QDBQZib3Jyb3cFCmFzc2V0U2NhbGUFBXByaWNlBAhyZXNlcnZlcwkAZQIFBnN1cHBseQUGYm9ycm93BA1yZXNlcnZlc0luVXNkCQEIZ2V0SW5Vc2QDBQhyZXNlcnZlcwUKYXNzZXRTY2FsZQUFcHJpY2UED21hcmtldEFzc2V0SnNvbgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIBewIIImFzc2V0IjoJAQthc3NldFRvSnNvbgIFCmFzc2V0SWRTdHIAAAIJLCJwcmljZSI6CQELYXNzZXRUb0pzb24CBQl1c2R0SWRTdHIFBXByaWNlAgksInNSYXRlIjoJAQ9hbW91bnRUb0RlY2ltYWwCBQVzUmF0ZQAQAgksImJSYXRlIjoJAQ9hbW91bnRUb0RlY2ltYWwCBQViUmF0ZQAQAgF9CQCWCgQJAGQCCAUFYWNjdW0CXzEFC3N1cHBseUluVXNkCQBkAggFBWFjY3VtAl8yBQtib3Jyb3dJblVzZAkAZAIIBQVhY2N1bQJfMwUNcmVzZXJ2ZXNJblVzZAkAzQgCCAUFYWNjdW0CXzQFD21hcmtldEFzc2V0SnNvbgQNJHQwMjY3MzAyNjgzOAoAAiRsBQVhcnIxMgoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJYKBAAAAAAAAAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQphc3NldHNGb2xkAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMgkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAQLc3VwcGx5SW5Vc2QIBQ0kdDAyNjczMDI2ODM4Al8xBAtib3Jyb3dJblVzZAgFDSR0MDI2NzMwMjY4MzgCXzIEDXJlc2VydmVzSW5Vc2QIBQ0kdDAyNjczMDI2ODM4Al8zBBBtYXJrZXRBc3NldHNKc29uCAUNJHQwMjY3MzAyNjgzOAJfNAQKbWFya2V0SnNvbgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAgF7AgsiYWRkcmVzcyI6IgUJbWFya2V0U3RyAgEiAgssImFzc2V0cyI6WwkAuwkCBRBtYXJrZXRBc3NldHNKc29uAgEsAgFdAgF9CQCWCgQJAGQCCAUFYWNjdW0CXzEFC3N1cHBseUluVXNkCQBkAggFBWFjY3VtAl8yBQtib3Jyb3dJblVzZAkAZAIIBQVhY2N1bQJfMwUNcmVzZXJ2ZXNJblVzZAkAzQgCCAUFYWNjdW0CXzQFCm1hcmtldEpzb24EDSR0MDI3MjI5MjczNDgKAAIkbAUFYXJyMTIKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCWCgQAAAAAAAAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQELbWFya2V0c0ZvbGQCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEyCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMBBB0b3RhbFN1cHBseUluVXNkCAUNJHQwMjcyMjkyNzM0OAJfMQQQdG90YWxCb3Jyb3dJblVzZAgFDSR0MDI3MjI5MjczNDgCXzIEEnRvdGFsUmVzZXJ2ZXNJblVzZAgFDSR0MDI3MjI5MjczNDgCXzMEC21hcmtldHNKc29uCAUNJHQwMjcyMjkyNzM0OAJfNAQEanNvbgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAgF7Ag4ic3VwcGx5SW5Vc2QiOgkBC2Fzc2V0VG9Kc29uAgUJdXNkdElkU3RyBRB0b3RhbFN1cHBseUluVXNkAg8sImJvcnJvd0luVXNkIjoJAQthc3NldFRvSnNvbgIFCXVzZHRJZFN0cgUQdG90YWxCb3Jyb3dJblVzZAIRLCJyZXNlcnZlc0luVXNkIjoJAQthc3NldFRvSnNvbgIFCXVzZHRJZFN0cgUSdG90YWxSZXNlcnZlc0luVXNkAgwsIm1hcmtldHMiOlsJALsJAgULbWFya2V0c0pzb24CASwCAV0CAX0DBQVkZWJ1ZwkAAgEFBGpzb24FBGpzb24BDWdldFdhbGxldEpzb24DC21hcmtldEluZGV4BndhbGxldAVkZWJ1ZwQJbWFya2V0U3RyCQERQGV4dHJOYXRpdmUoMTA1OCkBCQCsAgICB21hcmtldF8JAKQDAQULbWFya2V0SW5kZXgEDW1hcmtldEFkZHJlc3MJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCW1hcmtldFN0cgQKbWFya2V0TmFtZQkBEUBleHRyTmF0aXZlKDEwNTgpAQkArAICAgxtYXJrZXRfbmFtZV8FCW1hcmtldFN0cgQMbWFya2V0c0NvdW50CQERQGV4dHJOYXRpdmUoMTA1NSkBAgdtYXJrZXRzCgELbWFya2V0c0ZvbGQCBWFjY3VtBG5leHQDCQBnAgUEbmV4dAUMbWFya2V0c0NvdW50BQVhY2N1bQQXY3VycmVudE1hcmtldEFkZHJlc3NTdHIJARFAZXh0ck5hdGl2ZSgxMDU4KQEJAKwCAgIHbWFya2V0XwkApAMBBQRuZXh0BBFjdXJyZW50TWFya2V0TmFtZQkBEUBleHRyTmF0aXZlKDEwNTgpAQkArAICAgxtYXJrZXRfbmFtZV8FF2N1cnJlbnRNYXJrZXRBZGRyZXNzU3RyBBRjdXJyZW50TWFya2V0QWRkcmVzcwkBEUBleHRyTmF0aXZlKDEwNjIpAQUXY3VycmVudE1hcmtldEFkZHJlc3NTdHIEEmN1cnJlbnRTZXR1cFRva2VucwkBDmdldFNldHVwVG9rZW5zAQUUY3VycmVudE1hcmtldEFkZHJlc3MEEmN1cnJlbnRBc3NldHNDb3VudAkAkAMBBRJjdXJyZW50U2V0dXBUb2tlbnMEFmN1cnJlbnRNYXJrZXRTaG9ydE5hbWUJARFAZXh0ck5hdGl2ZSgxMDU4KQEJAKwCAgIRbWFya2V0X3Nob3J0bmFtZV8FF2N1cnJlbnRNYXJrZXRBZGRyZXNzU3RyBAdzZXR1cENmCQC8CQIJARFAZXh0ck5hdGl2ZSgxMDUzKQIFFGN1cnJlbnRNYXJrZXRBZGRyZXNzAgpzZXR1cF9sdHZzAgEsBAdzZXR1cEx0CQC8CQIJARFAZXh0ck5hdGl2ZSgxMDUzKQIFFGN1cnJlbnRNYXJrZXRBZGRyZXNzAglzZXR1cF9sdHMCASwEFWN1cnJlbnRMYXN0UmF0ZUhlaWdodAkBEWdldExhc3RSYXRlSGVpZ2h0AQUUY3VycmVudE1hcmtldEFkZHJlc3MKARBtYXJrZXRBc3NldHNGb2xkAgVhY2N1bQRuZXh0AwkAZwIFBG5leHQFEmN1cnJlbnRBc3NldHNDb3VudAUFYWNjdW0ECmFzc2V0SWRTdHIJAJEDAgUSY3VycmVudFNldHVwVG9rZW5zBQRuZXh0BAJjZgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFB3NldHVwQ2YFBG5leHQEAmx0CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHc2V0dXBMdAUEbmV4dAQFcHJpY2UJAQ1nZXRUb2tlblByaWNlAgUNbWFya2V0QWRkcmVzcwUKYXNzZXRJZFN0cgQKYXNzZXRTY2FsZQkBDWdldEFzc2V0U2NhbGUBBQphc3NldElkU3RyBBNvdXRkYXRlZFRvdGFsU3VwcGx5CQEWZ2V0T3V0ZGF0ZWRUb3RhbFN1cHBseQIFFGN1cnJlbnRNYXJrZXRBZGRyZXNzBQphc3NldElkU3RyBBNvdXRkYXRlZFRvdGFsQm9ycm93CQEWZ2V0T3V0ZGF0ZWRUb3RhbEJvcnJvdwIFFGN1cnJlbnRNYXJrZXRBZGRyZXNzBQphc3NldElkU3RyBA1vdXRkYXRlZFNSYXRlCQEQZ2V0T3V0ZGF0ZWRTUmF0ZQIFFGN1cnJlbnRNYXJrZXRBZGRyZXNzBQphc3NldElkU3RyBA1vdXRkYXRlZEJSYXRlCQEQZ2V0T3V0ZGF0ZWRCUmF0ZQIFFGN1cnJlbnRNYXJrZXRBZGRyZXNzBQphc3NldElkU3RyBApvdXRkYXRlZFVyCQENZ2V0T3V0ZGF0ZWRVcgQFE291dGRhdGVkVG90YWxTdXBwbHkFE291dGRhdGVkVG90YWxCb3Jyb3cFDW91dGRhdGVkU1JhdGUFDW91dGRhdGVkQlJhdGUEBHJhdGUJAQdnZXRSYXRlAwUKb3V0ZGF0ZWRVcgUKYXNzZXRJZFN0cgUJbWFya2V0U3RyBAhpbnRlcmVzdAkBC2dldEludGVyZXN0AQUEcmF0ZQQFc1JhdGUJAQ5nZXRBY3R1YWxTUmF0ZQQFFWN1cnJlbnRMYXN0UmF0ZUhlaWdodAUIaW50ZXJlc3QFCm91dGRhdGVkVXIFDW91dGRhdGVkU1JhdGUEBWJSYXRlCQEOZ2V0QWN0dWFsQlJhdGUDBRVjdXJyZW50TGFzdFJhdGVIZWlnaHQFCGludGVyZXN0BQ1vdXRkYXRlZEJSYXRlBAZzdXBwbHkJAQ9nZXRBY3R1YWxBbW91bnQCBRNvdXRkYXRlZFRvdGFsU3VwcGx5BQVzUmF0ZQQGYm9ycm93CQEPZ2V0QWN0dWFsQW1vdW50AgUTb3V0ZGF0ZWRUb3RhbEJvcnJvdwUFYlJhdGUEAnVyCQELZ2V0QWN0dWFsVXICBQZzdXBwbHkFBmJvcnJvdwQJc3VwcGx5QXB5CQEMZ2V0U3VwcGx5QXB5AgUEcmF0ZQUCdXIECWJvcnJvd0FweQkBDGdldEJvcnJvd0FweQEFBHJhdGUEDHdhbGxldFN1cHBseQkBD2dldFdhbGxldFN1cHBseQQFFGN1cnJlbnRNYXJrZXRBZGRyZXNzBQphc3NldElkU3RyBQZ3YWxsZXQFBXNSYXRlBBF3YWxsZXRTdXBwbHlJblVzZAkBCGdldEluVXNkAwUMd2FsbGV0U3VwcGx5BQphc3NldFNjYWxlBQVwcmljZQQMd2FsbGV0Qm9ycm93CQEPZ2V0V2FsbGV0Qm9ycm93BAUUY3VycmVudE1hcmtldEFkZHJlc3MFCmFzc2V0SWRTdHIFBndhbGxldAUFYlJhdGUEEXdhbGxldEJvcnJvd0luVXNkCQEIZ2V0SW5Vc2QDBQx3YWxsZXRCb3Jyb3cFCmFzc2V0U2NhbGUFBXByaWNlBBZ3YWxsZXRCb3Jyb3dMaW1pdEluVXNkCQBrAwURd2FsbGV0U3VwcGx5SW5Vc2QFAmNmBQZTY2FsZTgEFndhbGxldEJvcnJvd1VzYWdlSW5Vc2QJAGsDBRF3YWxsZXRCb3Jyb3dJblVzZAUGU2NhbGU4BQJsdAQRd2FsbGV0RGFpbHlJbmNvbWUJARBnZXREYWlseVBlcmNlbnRzAgUJc3VwcGx5QXB5BQx3YWxsZXRTdXBwbHkEFndhbGxldERhaWx5SW5jb21lSW5Vc2QJAQhnZXRJblVzZAMFEXdhbGxldERhaWx5SW5jb21lBQphc3NldFNjYWxlBQVwcmljZQQXd2FsbGV0RGFpbHlMb2FuSW50ZXJlc3QJARBnZXREYWlseVBlcmNlbnRzAgUJYm9ycm93QXB5BQx3YWxsZXRCb3Jyb3cEHHdhbGxldERhaWx5TG9hbkludGVyZXN0SW5Vc2QJAQhnZXRJblVzZAMFF3dhbGxldERhaWx5TG9hbkludGVyZXN0BQphc3NldFNjYWxlBQVwcmljZQQRd2FsbGV0TWFyZ2luSW5Vc2QJAGUCCQBrAwURd2FsbGV0U3VwcGx5SW5Vc2QFCXN1cHBseUFweQUGU2NhbGU4CQBrAwURd2FsbGV0Qm9ycm93SW5Vc2QFCWJvcnJvd0FweQUGU2NhbGU4CQCZCgcJAGQCCAUFYWNjdW0CXzEFEXdhbGxldFN1cHBseUluVXNkCQBkAggFBWFjY3VtAl8yBRF3YWxsZXRCb3Jyb3dJblVzZAkAZAIIBQVhY2N1bQJfMwUWd2FsbGV0Qm9ycm93TGltaXRJblVzZAkAZAIIBQVhY2N1bQJfNAUWd2FsbGV0Qm9ycm93VXNhZ2VJblVzZAkAZAIIBQVhY2N1bQJfNQUWd2FsbGV0RGFpbHlJbmNvbWVJblVzZAkAZAIIBQVhY2N1bQJfNgUcd2FsbGV0RGFpbHlMb2FuSW50ZXJlc3RJblVzZAkAZAIIBQVhY2N1bQJfNwURd2FsbGV0TWFyZ2luSW5Vc2QEDSR0MDMyMTc4MzI1MzMKAAIkbAUFYXJyMTIKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCZCgcAAAAAAAAAAAAAAAAAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEQbWFya2V0QXNzZXRzRm9sZAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTIJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwEFnRvdGFsV2FsbGV0U3VwcGx5SW5Vc2QIBQ0kdDAzMjE3ODMyNTMzAl8xBBZ0b3RhbFdhbGxldEJvcnJvd0luVXNkCAUNJHQwMzIxNzgzMjUzMwJfMgQbdG90YWxXYWxsZXRCb3Jyb3dMaW1pdEluVXNkCAUNJHQwMzIxNzgzMjUzMwJfMwQbdG90YWxXYWxsZXRCb3Jyb3dVc2FnZUluVXNkCAUNJHQwMzIxNzgzMjUzMwJfNAQbdG90YWxXYWxsZXREYWlseUluY29tZUluVXNkCAUNJHQwMzIxNzgzMjUzMwJfNQQhdG90YWxXYWxsZXREYWlseUxvYW5JbnRlcmVzdEluVXNkCAUNJHQwMzIxNzgzMjUzMwJfNgQWdG90YWxXYWxsZXRNYXJnaW5JblVzZAgFDSR0MDMyMTc4MzI1MzMCXzcEF3RvdGFsV2FsbGV0QmFkRGVidEluVXNkAwkAZgIFFnRvdGFsV2FsbGV0Qm9ycm93SW5Vc2QFFnRvdGFsV2FsbGV0U3VwcGx5SW5Vc2QJAGUCBRZ0b3RhbFdhbGxldEJvcnJvd0luVXNkBRZ0b3RhbFdhbGxldFN1cHBseUluVXNkAAAEDWFjY291bnRIZWFsdGgJARBnZXRBY2NvdW50SGVhbHRoAgUbdG90YWxXYWxsZXRCb3Jyb3dMaW1pdEluVXNkBRt0b3RhbFdhbGxldEJvcnJvd1VzYWdlSW5Vc2QEBm5ldEFweQkBCWdldE5ldEFweQMFFnRvdGFsV2FsbGV0U3VwcGx5SW5Vc2QFFnRvdGFsV2FsbGV0Qm9ycm93SW5Vc2QFFnRvdGFsV2FsbGV0TWFyZ2luSW5Vc2QEC21hcmtldHNKc29uCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAgF7AggiaW5kZXgiOgkApAMBBQRuZXh0AgksIm5hbWUiOiIFFmN1cnJlbnRNYXJrZXRTaG9ydE5hbWUCASICDywic3VwcGx5SW5Vc2QiOgkBC2Fzc2V0VG9Kc29uAgUJdXNkdElkU3RyBRZ0b3RhbFdhbGxldFN1cHBseUluVXNkAg8sImJvcnJvd0luVXNkIjoJAQthc3NldFRvSnNvbgIFCXVzZHRJZFN0cgUWdG90YWxXYWxsZXRCb3Jyb3dJblVzZAIRLCJhY2NvdW50SGVhbHRoIjoJAQ9hbW91bnRUb0RlY2ltYWwCBQ1hY2NvdW50SGVhbHRoAAgCAX0KARB3YWxsZXRBc3NldHNGb2xkAgVhY2N1bQRuZXh0AwkAZwIFBG5leHQFEmN1cnJlbnRBc3NldHNDb3VudAUFYWNjdW0ECmFzc2V0SWRTdHIJAJEDAgUSY3VycmVudFNldHVwVG9rZW5zBQRuZXh0BAVwcmljZQkBDWdldFRva2VuUHJpY2UCBQ1tYXJrZXRBZGRyZXNzBQphc3NldElkU3RyBAphc3NldFNjYWxlCQENZ2V0QXNzZXRTY2FsZQEFCmFzc2V0SWRTdHIEE291dGRhdGVkVG90YWxTdXBwbHkJARZnZXRPdXRkYXRlZFRvdGFsU3VwcGx5AgUUY3VycmVudE1hcmtldEFkZHJlc3MFCmFzc2V0SWRTdHIEE291dGRhdGVkVG90YWxCb3Jyb3cJARZnZXRPdXRkYXRlZFRvdGFsQm9ycm93AgUUY3VycmVudE1hcmtldEFkZHJlc3MFCmFzc2V0SWRTdHIEDW91dGRhdGVkU1JhdGUJARBnZXRPdXRkYXRlZFNSYXRlAgUUY3VycmVudE1hcmtldEFkZHJlc3MFCmFzc2V0SWRTdHIEDW91dGRhdGVkQlJhdGUJARBnZXRPdXRkYXRlZEJSYXRlAgUUY3VycmVudE1hcmtldEFkZHJlc3MFCmFzc2V0SWRTdHIECm91dGRhdGVkVXIJAQ1nZXRPdXRkYXRlZFVyBAUTb3V0ZGF0ZWRUb3RhbFN1cHBseQUTb3V0ZGF0ZWRUb3RhbEJvcnJvdwUNb3V0ZGF0ZWRTUmF0ZQUNb3V0ZGF0ZWRCUmF0ZQQEcmF0ZQkBB2dldFJhdGUDBQpvdXRkYXRlZFVyBQphc3NldElkU3RyBQltYXJrZXRTdHIECGludGVyZXN0CQELZ2V0SW50ZXJlc3QBBQRyYXRlBAVzUmF0ZQkBDmdldEFjdHVhbFNSYXRlBAUVY3VycmVudExhc3RSYXRlSGVpZ2h0BQhpbnRlcmVzdAUKb3V0ZGF0ZWRVcgUNb3V0ZGF0ZWRTUmF0ZQQFYlJhdGUJAQ5nZXRBY3R1YWxCUmF0ZQMFFWN1cnJlbnRMYXN0UmF0ZUhlaWdodAUIaW50ZXJlc3QFDW91dGRhdGVkQlJhdGUEBnN1cHBseQkBD2dldEFjdHVhbEFtb3VudAIFE291dGRhdGVkVG90YWxTdXBwbHkFBXNSYXRlBAZib3Jyb3cJAQ9nZXRBY3R1YWxBbW91bnQCBRNvdXRkYXRlZFRvdGFsQm9ycm93BQViUmF0ZQQCdXIJAQtnZXRBY3R1YWxVcgIFBnN1cHBseQUGYm9ycm93BAlzdXBwbHlBcHkJAQxnZXRTdXBwbHlBcHkCBQRyYXRlBQJ1cgQJYm9ycm93QXB5CQEMZ2V0Qm9ycm93QXB5AQUEcmF0ZQQMd2FsbGV0U3VwcGx5CQEPZ2V0V2FsbGV0U3VwcGx5BAUUY3VycmVudE1hcmtldEFkZHJlc3MFCmFzc2V0SWRTdHIFBndhbGxldAUFc1JhdGUEEXdhbGxldFN1cHBseUluVXNkCQEIZ2V0SW5Vc2QDBQx3YWxsZXRTdXBwbHkFCmFzc2V0U2NhbGUFBXByaWNlBAx3YWxsZXRCb3Jyb3cJAQ9nZXRXYWxsZXRCb3Jyb3cEBRRjdXJyZW50TWFya2V0QWRkcmVzcwUKYXNzZXRJZFN0cgUGd2FsbGV0BQViUmF0ZQQRd2FsbGV0Qm9ycm93SW5Vc2QJAQhnZXRJblVzZAMFDHdhbGxldEJvcnJvdwUKYXNzZXRTY2FsZQUFcHJpY2UEEXdhbGxldERhaWx5SW5jb21lCQEQZ2V0RGFpbHlQZXJjZW50cwIFCXN1cHBseUFweQUMd2FsbGV0U3VwcGx5BBZ3YWxsZXREYWlseUluY29tZUluVXNkCQEIZ2V0SW5Vc2QDBRF3YWxsZXREYWlseUluY29tZQUKYXNzZXRTY2FsZQUFcHJpY2UEF3dhbGxldERhaWx5TG9hbkludGVyZXN0CQEQZ2V0RGFpbHlQZXJjZW50cwIFCWJvcnJvd0FweQUMd2FsbGV0Qm9ycm93BBx3YWxsZXREYWlseUxvYW5JbnRlcmVzdEluVXNkCQEIZ2V0SW5Vc2QDBRd3YWxsZXREYWlseUxvYW5JbnRlcmVzdAUKYXNzZXRTY2FsZQUFcHJpY2UEEHN1cHBseUFzc2V0c0pzb24JAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIBewIJImFtb3VudCI6CQELYXNzZXRUb0pzb24CBQphc3NldElkU3RyBQx3YWxsZXRTdXBwbHkCDywiYW1vdW50SW5Vc2QiOgkBC2Fzc2V0VG9Kc29uAgUJdXNkdElkU3RyBRF3YWxsZXRTdXBwbHlJblVzZAIJLCJwcmljZSI6CQELYXNzZXRUb0pzb24CBQl1c2R0SWRTdHIFBXByaWNlAgcsImFweSI6CQEPYW1vdW50VG9EZWNpbWFsAgUJc3VwcGx5QXB5AAgCESwiZGFpbHlQZXJjZW50cyI6CQELYXNzZXRUb0pzb24CBQphc3NldElkU3RyBRF3YWxsZXREYWlseUluY29tZQIWLCJkYWlseVBlcmNlbnRzSW5Vc2QiOgkBC2Fzc2V0VG9Kc29uAgUJdXNkdElkU3RyBRZ3YWxsZXREYWlseUluY29tZUluVXNkAgF9BBBib3Jyb3dBc3NldHNKc29uCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICAXsCCSJhbW91bnQiOgkBC2Fzc2V0VG9Kc29uAgUKYXNzZXRJZFN0cgUMd2FsbGV0Qm9ycm93Ag8sImFtb3VudEluVXNkIjoJAQthc3NldFRvSnNvbgIFCXVzZHRJZFN0cgURd2FsbGV0Qm9ycm93SW5Vc2QCCSwicHJpY2UiOgkBC2Fzc2V0VG9Kc29uAgUJdXNkdElkU3RyBQVwcmljZQIHLCJhcHkiOgkBD2Ftb3VudFRvRGVjaW1hbAIFCWJvcnJvd0FweQAIAhEsImRhaWx5UGVyY2VudHMiOgkBC2Fzc2V0VG9Kc29uAgUKYXNzZXRJZFN0cgUXd2FsbGV0RGFpbHlMb2FuSW50ZXJlc3QCFiwiZGFpbHlQZXJjZW50c0luVXNkIjoJAQthc3NldFRvSnNvbgIFCXVzZHRJZFN0cgUcd2FsbGV0RGFpbHlMb2FuSW50ZXJlc3RJblVzZAIBfQkAlAoCCQDNCAIIBQVhY2N1bQJfMQUQc3VwcGx5QXNzZXRzSnNvbgkAzQgCCAUFYWNjdW0CXzIFEGJvcnJvd0Fzc2V0c0pzb24EDSR0MDM2OTM1MzcwMjEKAAIkbAUFYXJyMTIKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIFA25pbAUDbmlsCgEFJGYxXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJARB3YWxsZXRBc3NldHNGb2xkAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYxXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMgkBBSRmMV8yAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAQQc3VwcGx5QXNzZXRzSnNvbggFDSR0MDM2OTM1MzcwMjECXzEEEGJvcnJvd0Fzc2V0c0pzb24IBQ0kdDAzNjkzNTM3MDIxAl8yAwkAAAIFC21hcmtldEluZGV4BQRuZXh0CQChCg8JAGQCCAUFYWNjdW0CXzEFFnRvdGFsV2FsbGV0U3VwcGx5SW5Vc2QJAGQCCAUFYWNjdW0CXzIFFnRvdGFsV2FsbGV0Qm9ycm93SW5Vc2QJAGQCCAUFYWNjdW0CXzMFF3RvdGFsV2FsbGV0QmFkRGVidEluVXNkCQBkAggFBWFjY3VtAl80BRt0b3RhbFdhbGxldERhaWx5SW5jb21lSW5Vc2QJAGQCCAUFYWNjdW0CXzUFIXRvdGFsV2FsbGV0RGFpbHlMb2FuSW50ZXJlc3RJblVzZAUWdG90YWxXYWxsZXRTdXBwbHlJblVzZAUWdG90YWxXYWxsZXRCb3Jyb3dJblVzZAUXdG90YWxXYWxsZXRCYWREZWJ0SW5Vc2QFG3RvdGFsV2FsbGV0RGFpbHlJbmNvbWVJblVzZAUhdG90YWxXYWxsZXREYWlseUxvYW5JbnRlcmVzdEluVXNkBQ1hY2NvdW50SGVhbHRoBQZuZXRBcHkJAM0IAggFBWFjY3VtA18xMwULbWFya2V0c0pzb24FEHN1cHBseUFzc2V0c0pzb24FEGJvcnJvd0Fzc2V0c0pzb24JAKEKDwkAZAIIBQVhY2N1bQJfMQUWdG90YWxXYWxsZXRTdXBwbHlJblVzZAkAZAIIBQVhY2N1bQJfMgUWdG90YWxXYWxsZXRCb3Jyb3dJblVzZAkAZAIIBQVhY2N1bQJfMwUXdG90YWxXYWxsZXRCYWREZWJ0SW5Vc2QJAGQCCAUFYWNjdW0CXzQFG3RvdGFsV2FsbGV0RGFpbHlJbmNvbWVJblVzZAkAZAIIBQVhY2N1bQJfNQUhdG90YWxXYWxsZXREYWlseUxvYW5JbnRlcmVzdEluVXNkCAUFYWNjdW0CXzYIBQVhY2N1bQJfNwgFBWFjY3VtAl84CAUFYWNjdW0CXzkIBQVhY2N1bQNfMTAIBQVhY2N1bQNfMTEIBQVhY2N1bQNfMTIJAM0IAggFBWFjY3VtA18xMwULbWFya2V0c0pzb24IBQVhY2N1bQNfMTQIBQVhY2N1bQNfMTUEDSR0MDM4NDc4Mzg5NjIKAAIkbAUFYXJyMTIKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQChCg8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFA25pbAUDbmlsBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBC21hcmtldHNGb2xkAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMgkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAQWdG90YWxXYWxsZXRTdXBwbHlJblVzZAgFDSR0MDM4NDc4Mzg5NjICXzEEFnRvdGFsV2FsbGV0Qm9ycm93SW5Vc2QIBQ0kdDAzODQ3ODM4OTYyAl8yBBd0b3RhbFdhbGxldEJhZERlYnRJblVzZAgFDSR0MDM4NDc4Mzg5NjICXzMEG3RvdGFsV2FsbGV0RGFpbHlJbmNvbWVJblVzZAgFDSR0MDM4NDc4Mzg5NjICXzQEIXRvdGFsV2FsbGV0RGFpbHlMb2FuSW50ZXJlc3RJblVzZAgFDSR0MDM4NDc4Mzg5NjICXzUEEXdhbGxldFN1cHBseUluVXNkCAUNJHQwMzg0NzgzODk2MgJfNgQRd2FsbGV0Qm9ycm93SW5Vc2QIBQ0kdDAzODQ3ODM4OTYyAl83BBJ3YWxsZXRCYWREZWJ0SW5Vc2QIBQ0kdDAzODQ3ODM4OTYyAl84BBZ3YWxsZXREYWlseUluY29tZUluVXNkCAUNJHQwMzg0NzgzODk2MgJfOQQcd2FsbGV0RGFpbHlMb2FuSW50ZXJlc3RJblVzZAgFDSR0MDM4NDc4Mzg5NjIDXzEwBBN3YWxsZXRBY2NvdW50SGVhbHRoCAUNJHQwMzg0NzgzODk2MgNfMTEEDHdhbGxldE5ldEFweQgFDSR0MDM4NDc4Mzg5NjIDXzEyBAttYXJrZXRzSnNvbggFDSR0MDM4NDc4Mzg5NjIDXzEzBBBzdXBwbHlBc3NldHNKc29uCAUNJHQwMzg0NzgzODk2MgNfMTQEEGJvcnJvd0Fzc2V0c0pzb24IBQ0kdDAzODQ3ODM4OTYyA18xNQQEanNvbgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIBewIOIm1hcmtldEluZGV4IjoJAKQDAQULbWFya2V0SW5kZXgCCSwibmFtZSI6IgUKbWFya2V0TmFtZQIBIgIULCJ0b3RhbFN1cHBseUluVXNkIjoJAQthc3NldFRvSnNvbgIFCXVzZHRJZFN0cgUWdG90YWxXYWxsZXRTdXBwbHlJblVzZAIULCJ0b3RhbEJvcnJvd0luVXNkIjoJAQthc3NldFRvSnNvbgIFCXVzZHRJZFN0cgUWdG90YWxXYWxsZXRCb3Jyb3dJblVzZAIVLCJ0b3RhbEJhZERlYnRJblVzZCI6CQELYXNzZXRUb0pzb24CBQl1c2R0SWRTdHIFF3RvdGFsV2FsbGV0QmFkRGVidEluVXNkAhksInRvdGFsRGFpbHlJbmNvbWVJblVzZCI6CQELYXNzZXRUb0pzb24CBQl1c2R0SWRTdHIFG3RvdGFsV2FsbGV0RGFpbHlJbmNvbWVJblVzZAIfLCJ0b3RhbERhaWx5TG9hbkludGVyZXN0SW5Vc2QiOgkBC2Fzc2V0VG9Kc29uAgUJdXNkdElkU3RyBSF0b3RhbFdhbGxldERhaWx5TG9hbkludGVyZXN0SW5Vc2QCDywic3VwcGx5SW5Vc2QiOgkBC2Fzc2V0VG9Kc29uAgUJdXNkdElkU3RyBRF3YWxsZXRTdXBwbHlJblVzZAIPLCJib3Jyb3dJblVzZCI6CQELYXNzZXRUb0pzb24CBQl1c2R0SWRTdHIFEXdhbGxldEJvcnJvd0luVXNkAhAsImJhZERlYnRJblVzZCI6CQELYXNzZXRUb0pzb24CBQl1c2R0SWRTdHIFEndhbGxldEJhZERlYnRJblVzZAIULCJkYWlseUluY29tZUluVXNkIjoJAQthc3NldFRvSnNvbgIFCXVzZHRJZFN0cgUWd2FsbGV0RGFpbHlJbmNvbWVJblVzZAIaLCJkYWlseUxvYW5JbnRlcmVzdEluVXNkIjoJAQthc3NldFRvSnNvbgIFCXVzZHRJZFN0cgUcd2FsbGV0RGFpbHlMb2FuSW50ZXJlc3RJblVzZAIRLCJhY2NvdW50SGVhbHRoIjoJAQ9hbW91bnRUb0RlY2ltYWwCBRN3YWxsZXRBY2NvdW50SGVhbHRoAAgCCiwibmV0QXB5IjoJAQ9hbW91bnRUb0RlY2ltYWwCBQx3YWxsZXROZXRBcHkACAIRLCJzdXBwbHlBc3NldHMiOlsJALsJAgUQc3VwcGx5QXNzZXRzSnNvbgIBLAIBXQIRLCJib3Jyb3dBc3NldHMiOlsJALsJAgUQYm9ycm93QXNzZXRzSnNvbgIBLAIBXQIMLCJtYXJrZXRzIjpbCQC7CQIFC21hcmtldHNKc29uAgEsAgFdAgF9AwUFZGVidWcJAAIBBQRqc29uBQRqc29uARdnZXRXYWxsZXRPcGVyYXRpb25zSnNvbgQLbWFya2V0SW5kZXgKYXNzZXRJZFN0cgZ3YWxsZXQFZGVidWcECW1hcmtldFN0cgkBEUBleHRyTmF0aXZlKDEwNTgpAQkArAICAgdtYXJrZXRfCQCkAwEFC21hcmtldEluZGV4BA1tYXJrZXRBZGRyZXNzCQERQGV4dHJOYXRpdmUoMTA2MikBBQltYXJrZXRTdHIECm1hcmtldE5hbWUJARFAZXh0ck5hdGl2ZSgxMDU4KQEJAKwCAgIMbWFya2V0X25hbWVfBQltYXJrZXRTdHIEBmFjdGl2ZQkBC3ZhbHVlT3JFbHNlAgkAmwgCBQ1tYXJrZXRBZGRyZXNzAgxzZXR1cF9hY3RpdmUGBAtzZXR1cFRva2VucwkBDmdldFNldHVwVG9rZW5zAQUNbWFya2V0QWRkcmVzcwQHc2V0dXBDZgkAvAkCCQERQGV4dHJOYXRpdmUoMTA1MykCBQ1tYXJrZXRBZGRyZXNzAgpzZXR1cF9sdHZzAgEsBAdzZXR1cEx0CQC8CQIJARFAZXh0ck5hdGl2ZSgxMDUzKQIFDW1hcmtldEFkZHJlc3MCCXNldHVwX2x0cwIBLAQMc2V0dXBQZW5hbHR5CQC8CQIJARFAZXh0ck5hdGl2ZSgxMDUzKQIFDW1hcmtldEFkZHJlc3MCD3NldHVwX3BlbmFsdGllcwIBLAQKYXNzZXRJbmRleAkBDWdldEFzc2V0SW5kZXgCBQtzZXR1cFRva2VucwUKYXNzZXRJZFN0cgQCY2YJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdzZXR1cENmBQphc3NldEluZGV4BAJsdAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFB3NldHVwTHQFCmFzc2V0SW5kZXgEB3BlbmFsdHkJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQxzZXR1cFBlbmFsdHkFCmFzc2V0SW5kZXgEC2Fzc2V0c0NvdW50CQCQAwEFC3NldHVwVG9rZW5zBA5sYXN0UmF0ZUhlaWdodAkBEWdldExhc3RSYXRlSGVpZ2h0AQUNbWFya2V0QWRkcmVzcwQFcHJpY2UJAQ1nZXRUb2tlblByaWNlAgUNbWFya2V0QWRkcmVzcwUKYXNzZXRJZFN0cgQKYXNzZXRTY2FsZQkBDWdldEFzc2V0U2NhbGUBBQphc3NldElkU3RyBBNvdXRkYXRlZFRvdGFsU3VwcGx5CQEWZ2V0T3V0ZGF0ZWRUb3RhbFN1cHBseQIFDW1hcmtldEFkZHJlc3MFCmFzc2V0SWRTdHIEE291dGRhdGVkVG90YWxCb3Jyb3cJARZnZXRPdXRkYXRlZFRvdGFsQm9ycm93AgUNbWFya2V0QWRkcmVzcwUKYXNzZXRJZFN0cgQNb3V0ZGF0ZWRTUmF0ZQkBEGdldE91dGRhdGVkU1JhdGUCBQ1tYXJrZXRBZGRyZXNzBQphc3NldElkU3RyBA1vdXRkYXRlZEJSYXRlCQEQZ2V0T3V0ZGF0ZWRCUmF0ZQIFDW1hcmtldEFkZHJlc3MFCmFzc2V0SWRTdHIECm91dGRhdGVkVXIJAQ1nZXRPdXRkYXRlZFVyBAUTb3V0ZGF0ZWRUb3RhbFN1cHBseQUTb3V0ZGF0ZWRUb3RhbEJvcnJvdwUNb3V0ZGF0ZWRTUmF0ZQUNb3V0ZGF0ZWRCUmF0ZQQEcmF0ZQkBB2dldFJhdGUDBQpvdXRkYXRlZFVyBQphc3NldElkU3RyBQltYXJrZXRTdHIECGludGVyZXN0CQELZ2V0SW50ZXJlc3QBBQRyYXRlBAVzUmF0ZQkBDmdldEFjdHVhbFNSYXRlBAUObGFzdFJhdGVIZWlnaHQFCGludGVyZXN0BQpvdXRkYXRlZFVyBQ1vdXRkYXRlZFNSYXRlBAViUmF0ZQkBDmdldEFjdHVhbEJSYXRlAwUObGFzdFJhdGVIZWlnaHQFCGludGVyZXN0BQ1vdXRkYXRlZEJSYXRlBAZzdXBwbHkJAQ9nZXRBY3R1YWxBbW91bnQCBRNvdXRkYXRlZFRvdGFsU3VwcGx5BQVzUmF0ZQQGYm9ycm93CQEPZ2V0QWN0dWFsQW1vdW50AgUTb3V0ZGF0ZWRUb3RhbEJvcnJvdwUFYlJhdGUEC3N1cHBseUluVXNkCQEIZ2V0SW5Vc2QDBQZzdXBwbHkFCmFzc2V0U2NhbGUFBXByaWNlBAtib3Jyb3dJblVzZAkBCGdldEluVXNkAwUGYm9ycm93BQphc3NldFNjYWxlBQVwcmljZQQIcmVzZXJ2ZXMJAGUCBQZzdXBwbHkFBmJvcnJvdwQNcmVzZXJ2ZXNJblVzZAkBCGdldEluVXNkAwUIcmVzZXJ2ZXMFCmFzc2V0U2NhbGUFBXByaWNlBAJ1cgkBC2dldEFjdHVhbFVyAgUGc3VwcGx5BQZib3Jyb3cECXN1cHBseUFweQkBDGdldFN1cHBseUFweQIFBHJhdGUFAnVyBAlib3Jyb3dBcHkJAQxnZXRCb3Jyb3dBcHkBBQRyYXRlBAltYXhTdXBwbHkJAQxnZXRNYXhTdXBwbHkCBQ1tYXJrZXRBZGRyZXNzBQphc3NldElkU3RyBAx3YWxsZXRTdXBwbHkJAQ9nZXRXYWxsZXRTdXBwbHkEBQ1tYXJrZXRBZGRyZXNzBQphc3NldElkU3RyBQZ3YWxsZXQFBXNSYXRlBBF3YWxsZXRTdXBwbHlJblVzZAkBCGdldEluVXNkAwUMd2FsbGV0U3VwcGx5BQphc3NldFNjYWxlBQVwcmljZQQRd2FsbGV0RGFpbHlJbmNvbWUJARBnZXREYWlseVBlcmNlbnRzAgUJc3VwcGx5QXB5BQx3YWxsZXRTdXBwbHkEFndhbGxldERhaWx5SW5jb21lSW5Vc2QJAQhnZXRJblVzZAMFEXdhbGxldERhaWx5SW5jb21lBQphc3NldFNjYWxlBQVwcmljZQQMd2FsbGV0Qm9ycm93CQEPZ2V0V2FsbGV0Qm9ycm93BAUNbWFya2V0QWRkcmVzcwUKYXNzZXRJZFN0cgUGd2FsbGV0BQViUmF0ZQQRd2FsbGV0Qm9ycm93SW5Vc2QJAQhnZXRJblVzZAMFDHdhbGxldEJvcnJvdwUKYXNzZXRTY2FsZQUFcHJpY2UEF3dhbGxldERhaWx5TG9hblBlcmNlbnRzCQEQZ2V0RGFpbHlQZXJjZW50cwIFCWJvcnJvd0FweQUMd2FsbGV0Qm9ycm93BBx3YWxsZXREYWlseUxvYW5QZXJjZW50c0luVXNkCQEIZ2V0SW5Vc2QDBRd3YWxsZXREYWlseUxvYW5QZXJjZW50cwUKYXNzZXRTY2FsZQUFcHJpY2UKAQphc3NldHNGb2xkAgVhY2N1bQRuZXh0AwkAZwIFBG5leHQFC2Fzc2V0c0NvdW50BQVhY2N1bQQRY3VycmVudEFzc2V0SWRTdHIJAJEDAgULc2V0dXBUb2tlbnMFBG5leHQECWN1cnJlbnRDZgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFB3NldHVwQ2YFBG5leHQECWN1cnJlbnRMdAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFB3NldHVwTHQFBG5leHQEDGN1cnJlbnRQcmljZQkBDWdldFRva2VuUHJpY2UCBQ1tYXJrZXRBZGRyZXNzBRFjdXJyZW50QXNzZXRJZFN0cgQRY3VycmVudEFzc2V0U2NhbGUJAQ1nZXRBc3NldFNjYWxlAQURY3VycmVudEFzc2V0SWRTdHIEGmN1cnJlbnRPdXRkYXRlZFRvdGFsU3VwcGx5CQEWZ2V0T3V0ZGF0ZWRUb3RhbFN1cHBseQIFDW1hcmtldEFkZHJlc3MFEWN1cnJlbnRBc3NldElkU3RyBBpjdXJyZW50T3V0ZGF0ZWRUb3RhbEJvcnJvdwkBFmdldE91dGRhdGVkVG90YWxCb3Jyb3cCBQ1tYXJrZXRBZGRyZXNzBRFjdXJyZW50QXNzZXRJZFN0cgQUY3VycmVudE91dGRhdGVkU1JhdGUJARBnZXRPdXRkYXRlZFNSYXRlAgUNbWFya2V0QWRkcmVzcwURY3VycmVudEFzc2V0SWRTdHIEFGN1cnJlbnRPdXRkYXRlZEJSYXRlCQEQZ2V0T3V0ZGF0ZWRCUmF0ZQIFDW1hcmtldEFkZHJlc3MFEWN1cnJlbnRBc3NldElkU3RyBBFjdXJyZW50T3V0ZGF0ZWRVcgkBDWdldE91dGRhdGVkVXIEBRpjdXJyZW50T3V0ZGF0ZWRUb3RhbFN1cHBseQUaY3VycmVudE91dGRhdGVkVG90YWxCb3Jyb3cFFGN1cnJlbnRPdXRkYXRlZFNSYXRlBRRjdXJyZW50T3V0ZGF0ZWRCUmF0ZQQLY3VycmVudFJhdGUJAQdnZXRSYXRlAwURY3VycmVudE91dGRhdGVkVXIFEWN1cnJlbnRBc3NldElkU3RyBQltYXJrZXRTdHIED2N1cnJlbnRJbnRlcmVzdAkBC2dldEludGVyZXN0AQULY3VycmVudFJhdGUEDGN1cnJlbnRTUmF0ZQkBDmdldEFjdHVhbFNSYXRlBAUObGFzdFJhdGVIZWlnaHQFD2N1cnJlbnRJbnRlcmVzdAURY3VycmVudE91dGRhdGVkVXIFFGN1cnJlbnRPdXRkYXRlZFNSYXRlBAxjdXJyZW50QlJhdGUJAQ5nZXRBY3R1YWxCUmF0ZQMFDmxhc3RSYXRlSGVpZ2h0BQ9jdXJyZW50SW50ZXJlc3QFFGN1cnJlbnRPdXRkYXRlZEJSYXRlBA1jdXJyZW50U3VwcGx5CQEPZ2V0QWN0dWFsQW1vdW50AgUaY3VycmVudE91dGRhdGVkVG90YWxTdXBwbHkFBXNSYXRlBA1jdXJyZW50Qm9ycm93CQEPZ2V0QWN0dWFsQW1vdW50AgUaY3VycmVudE91dGRhdGVkVG90YWxCb3Jyb3cFBWJSYXRlBAljdXJyZW50VXIJAQtnZXRBY3R1YWxVcgIFDWN1cnJlbnRTdXBwbHkFDWN1cnJlbnRCb3Jyb3cEEGN1cnJlbnRTdXBwbHlBcHkJAQxnZXRTdXBwbHlBcHkCBQtjdXJyZW50UmF0ZQUJY3VycmVudFVyBBBjdXJyZW50Qm9ycm93QXB5CQEMZ2V0Qm9ycm93QXB5AQULY3VycmVudFJhdGUEE2N1cnJlbnRXYWxsZXRTdXBwbHkJAQ9nZXRXYWxsZXRTdXBwbHkEBQ1tYXJrZXRBZGRyZXNzBRFjdXJyZW50QXNzZXRJZFN0cgUGd2FsbGV0BQxjdXJyZW50U1JhdGUEGGN1cnJlbnRXYWxsZXRTdXBwbHlJblVzZAkBCGdldEluVXNkAwUTY3VycmVudFdhbGxldFN1cHBseQURY3VycmVudEFzc2V0U2NhbGUFDGN1cnJlbnRQcmljZQQTY3VycmVudFdhbGxldEJvcnJvdwkBD2dldFdhbGxldEJvcnJvdwQFDW1hcmtldEFkZHJlc3MFEWN1cnJlbnRBc3NldElkU3RyBQZ3YWxsZXQFDGN1cnJlbnRCUmF0ZQQYY3VycmVudFdhbGxldEJvcnJvd0luVXNkCQEIZ2V0SW5Vc2QDBRNjdXJyZW50V2FsbGV0Qm9ycm93BRFjdXJyZW50QXNzZXRTY2FsZQUMY3VycmVudFByaWNlBB1jdXJyZW50V2FsbGV0Qm9ycm93TGltaXRJblVzZAkAawMFGGN1cnJlbnRXYWxsZXRTdXBwbHlJblVzZAUJY3VycmVudENmBQZTY2FsZTgEHWN1cnJlbnRXYWxsZXRCb3Jyb3dVc2FnZUluVXNkCQBrAwUYY3VycmVudFdhbGxldEJvcnJvd0luVXNkBQZTY2FsZTgFCWN1cnJlbnRMdAQRd2FsbGV0TWFyZ2luSW5Vc2QJAGUCCQBrAwUYY3VycmVudFdhbGxldFN1cHBseUluVXNkBRBjdXJyZW50U3VwcGx5QXB5BQZTY2FsZTgJAGsDBRhjdXJyZW50V2FsbGV0Qm9ycm93SW5Vc2QFEGN1cnJlbnRCb3Jyb3dBcHkFBlNjYWxlOAkAlwoFCQBkAggFBWFjY3VtAl8xBRhjdXJyZW50V2FsbGV0U3VwcGx5SW5Vc2QJAGQCCAUFYWNjdW0CXzIFGGN1cnJlbnRXYWxsZXRCb3Jyb3dJblVzZAkAZAIIBQVhY2N1bQJfMwUdY3VycmVudFdhbGxldEJvcnJvd0xpbWl0SW5Vc2QJAGQCCAUFYWNjdW0CXzQFHWN1cnJlbnRXYWxsZXRCb3Jyb3dVc2FnZUluVXNkCQBkAggFBWFjY3VtAl81BRF3YWxsZXRNYXJnaW5JblVzZAQNJHQwNDU5NzM0NjE1NAoAAiRsBQVhcnIxMgoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJcKBQAAAAAAAAAAAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCmFzc2V0c0ZvbGQCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEyCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMBBZ0b3RhbFdhbGxldFN1cHBseUluVXNkCAUNJHQwNDU5NzM0NjE1NAJfMQQWdG90YWxXYWxsZXRCb3Jyb3dJblVzZAgFDSR0MDQ1OTczNDYxNTQCXzIEG3RvdGFsV2FsbGV0Qm9ycm93TGltaXRJblVzZAgFDSR0MDQ1OTczNDYxNTQCXzMEG3RvdGFsV2FsbGV0Qm9ycm93VXNhZ2VJblVzZAgFDSR0MDQ1OTczNDYxNTQCXzQEFnRvdGFsV2FsbGV0TWFyZ2luSW5Vc2QIBQ0kdDA0NTk3MzQ2MTU0Al81BA1hY2NvdW50SGVhbHRoCQEQZ2V0QWNjb3VudEhlYWx0aAIFG3RvdGFsV2FsbGV0Qm9ycm93TGltaXRJblVzZAUbdG90YWxXYWxsZXRCb3Jyb3dVc2FnZUluVXNkBAZuZXRBcHkJAQlnZXROZXRBcHkDBRZ0b3RhbFdhbGxldFN1cHBseUluVXNkBRZ0b3RhbFdhbGxldEJvcnJvd0luVXNkBRZ0b3RhbFdhbGxldE1hcmdpbkluVXNkBARqc29uCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAgF7Ag4ibWFya2V0SW5kZXgiOgkApAMBBQttYXJrZXRJbmRleAIPLCJtYXJrZXROYW1lIjoiBQptYXJrZXROYW1lAgEiAgwsImFkZHJlc3MiOiIFCW1hcmtldFN0cgIBIgIOLCJhc3NldFByaWNlIjoJAQthc3NldFRvSnNvbgIFCXVzZHRJZFN0cgUFcHJpY2UCCiwic3VwcGx5IjoJAQthc3NldFRvSnNvbgIFCmFzc2V0SWRTdHIFBnN1cHBseQIPLCJzdXBwbHlJblVzZCI6CQELYXNzZXRUb0pzb24CBQl1c2R0SWRTdHIFC3N1cHBseUluVXNkAg0sInN1cHBseUFweSI6CQEPYW1vdW50VG9EZWNpbWFsAgUJc3VwcGx5QXB5AAgCCiwiYm9ycm93IjoJAQthc3NldFRvSnNvbgIFCmFzc2V0SWRTdHIFBmJvcnJvdwIPLCJib3Jyb3dJblVzZCI6CQELYXNzZXRUb0pzb24CBQl1c2R0SWRTdHIFC2JvcnJvd0luVXNkAg0sImJvcnJvd0FweSI6CQEPYW1vdW50VG9EZWNpbWFsAgUJYm9ycm93QXB5AAgCDCwicmVzZXJ2ZXMiOgkBC2Fzc2V0VG9Kc29uAgUKYXNzZXRJZFN0cgUIcmVzZXJ2ZXMCESwicmVzZXJ2ZXNJblVzZCI6CQELYXNzZXRUb0pzb24CBQl1c2R0SWRTdHIFDXJlc2VydmVzSW5Vc2QCFCwidXRpbGl6YXRpb25SYXRpbyI6CQEPYW1vdW50VG9EZWNpbWFsAgUCdXIACAIULCJjb2xsYXRlcmFsRmFjdG9yIjoJAQ9hbW91bnRUb0RlY2ltYWwCBQJjZgAIAhgsImxpcXVpZGF0aW9uVGhyZXNob2xkIjoJAQ9hbW91bnRUb0RlY2ltYWwCBQJsdAAIAhYsImxpcXVpZGF0aW9uUGVuYWx0eSI6CQEPYW1vdW50VG9EZWNpbWFsAgUHcGVuYWx0eQAIAg0sIm1heFN1cHBseSI6CQELYXNzZXRUb0pzb24CBQl1c2R0SWRTdHIFCW1heFN1cHBseQIQLCJ3YWxsZXRTdXBwbHkiOgkBC2Fzc2V0VG9Kc29uAgUKYXNzZXRJZFN0cgUMd2FsbGV0U3VwcGx5AhUsIndhbGxldFN1cHBseUluVXNkIjoJAQthc3NldFRvSnNvbgIFCXVzZHRJZFN0cgURd2FsbGV0U3VwcGx5SW5Vc2QCFSwid2FsbGV0RGFpbHlJbmNvbWUiOgkBC2Fzc2V0VG9Kc29uAgUKYXNzZXRJZFN0cgURd2FsbGV0RGFpbHlJbmNvbWUCGiwid2FsbGV0RGFpbHlJbmNvbWVJblVzZCI6CQELYXNzZXRUb0pzb24CBQl1c2R0SWRTdHIFFndhbGxldERhaWx5SW5jb21lSW5Vc2QCECwid2FsbGV0Qm9ycm93IjoJAQthc3NldFRvSnNvbgIFCmFzc2V0SWRTdHIFDHdhbGxldEJvcnJvdwIVLCJ3YWxsZXRCb3Jyb3dJblVzZCI6CQELYXNzZXRUb0pzb24CBQl1c2R0SWRTdHIFEXdhbGxldEJvcnJvd0luVXNkAhssIndhbGxldERhaWx5TG9hbkludGVyZXN0IjoJAQthc3NldFRvSnNvbgIFCmFzc2V0SWRTdHIFF3dhbGxldERhaWx5TG9hblBlcmNlbnRzAiAsIndhbGxldERhaWx5TG9hbkludGVyZXN0SW5Vc2QiOgkBC2Fzc2V0VG9Kc29uAgUJdXNkdElkU3RyBRx3YWxsZXREYWlseUxvYW5QZXJjZW50c0luVXNkAhEsImFjY291bnRIZWFsdGgiOgkBD2Ftb3VudFRvRGVjaW1hbAIFDWFjY291bnRIZWFsdGgACAIKLCJuZXRBcHkiOgkBD2Ftb3VudFRvRGVjaW1hbAIFBm5ldEFweQAIAgF9AwUFZGVidWcJAAIBBQRqc29uBQRqc29uARdnZXRNYXJrZXRQYXJhbWV0ZXJzSnNvbgILbWFya2V0SW5kZXgFZGVidWcECW1hcmtldFN0cgkBEUBleHRyTmF0aXZlKDEwNTgpAQkArAICAgdtYXJrZXRfCQCkAwEFC21hcmtldEluZGV4BA1tYXJrZXRBZGRyZXNzCQERQGV4dHJOYXRpdmUoMTA2MikBBQltYXJrZXRTdHIECm1hcmtldE5hbWUJARFAZXh0ck5hdGl2ZSgxMDU4KQEJAKwCAgIMbWFya2V0X25hbWVfBQltYXJrZXRTdHIEC3NldHVwVG9rZW5zCQEOZ2V0U2V0dXBUb2tlbnMBBQ1tYXJrZXRBZGRyZXNzBAdzZXR1cENmCQC8CQIJARFAZXh0ck5hdGl2ZSgxMDUzKQIFDW1hcmtldEFkZHJlc3MCCnNldHVwX2x0dnMCASwEB3NldHVwTHQJALwJAgkBEUBleHRyTmF0aXZlKDEwNTMpAgUNbWFya2V0QWRkcmVzcwIJc2V0dXBfbHRzAgEsBAxzZXR1cFBlbmFsdHkJALwJAgkBEUBleHRyTmF0aXZlKDEwNTMpAgUNbWFya2V0QWRkcmVzcwIPc2V0dXBfcGVuYWx0aWVzAgEsBAthc3NldHNDb3VudAkAkAMBBQtzZXR1cFRva2VucwoBCmFzc2V0c0ZvbGQCBWFjY3VtBG5leHQDCQBnAgUEbmV4dAULYXNzZXRzQ291bnQFBWFjY3VtBAphc3NldElkU3RyCQCRAwIFC3NldHVwVG9rZW5zBQRuZXh0BAltYXhTdXBwbHkJAQxnZXRNYXhTdXBwbHkCBQ1tYXJrZXRBZGRyZXNzBQphc3NldElkU3RyBAJjZgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFB3NldHVwQ2YFBG5leHQEAmx0CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHc2V0dXBMdAUEbmV4dAQHcGVuYWx0eQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDHNldHVwUGVuYWx0eQUEbmV4dAQEanNvbgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICAXsCCCJhc3NldCI6CQELYXNzZXRUb0pzb24CBQphc3NldElkU3RyAAACDSwibWF4U3VwcGx5IjoJAQthc3NldFRvSnNvbgIFCXVzZHRJZFN0cgUJbWF4U3VwcGx5AhQsImNvbGxhdGVyYWxGYWN0b3IiOgkBD2Ftb3VudFRvRGVjaW1hbAIFAmNmAAgCGCwibGlxdWlkYXRpb25UaHJlc2hvbGQiOgkBD2Ftb3VudFRvRGVjaW1hbAIFAmx0AAgCFiwibGlxdWlkYXRpb25QZW5hbHR5IjoJAQ9hbW91bnRUb0RlY2ltYWwCBQdwZW5hbHR5AAgCAX0JAM0IAgUFYWNjdW0FBGpzb24ECmFzc2V0c0pzb24KAAIkbAUFYXJyMTIKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCmFzc2V0c0ZvbGQCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEyCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMBARqc29uCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICAXsCCCJuYW1lIjoiBQptYXJrZXROYW1lAgEiAgssImFzc2V0cyI6WwkAuwkCBQphc3NldHNKc29uAgEsAgFdAgF9AwUFZGVidWcJAAIBBQRqc29uBQRqc29uAABBiZFj", "height": 4065215, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 46WCUsxY7VmzqMVhosH867sMxK7cj8PfsFcyrK9vVE3E Next: none Diff:
OldNewDifferences
4242 let setupRateCurve = getString(marketAddress, ("setup_rateCurve_" + assetIdStr))
4343 if (isDefined(setupRateCurve))
4444 then {
45- let curveArr = split(value(setupRateCurve), ",")
45+ let curveArr = split_4C(value(setupRateCurve), ",")
4646 $Tuple4(parseIntValue(curveArr[0]), parseIntValue(curveArr[1]), parseIntValue(curveArr[2]), parseIntValue(curveArr[3]))
4747 }
4848 else match marketStr {
201201 }
202202
203203
204-func getSetupTokens (marketAddress) = split(getStringValue(marketAddress, "setup_tokens"), ",")
204+func getSetupTokens (marketAddress) = split_4C(getStringValue(marketAddress, "setup_tokens"), ",")
205205
206206
207207 func getTokenPrice (marketAddress,assetIdStr) = {
208208 let oracleStr = valueOrElse(getString(marketAddress, "oracle"), oracleAddressStr)
209209 let oracleAddress = addressFromStringValue(oracleStr)
210- let stables = split(valueOrElse(getString(marketAddress, "setup_stablesIds"), "9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi,HGgabTqUS8WtVFUJzfmrTDMgEccJuZLBPhFgQFxvnsoW"), ",")
210+ let stables = split_4C(valueOrElse(getString(marketAddress, "setup_stablesIds"), "9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi,HGgabTqUS8WtVFUJzfmrTDMgEccJuZLBPhFgQFxvnsoW"), ",")
211211 if ((indexOf(stables, assetIdStr) != unit))
212212 then 1000000
213213 else if (if (if ((assetIdStr == usdtIdStr))
279279
280280
281281 func getMarketParameters (marketAddress,setupTokens) = {
282- let setupCf = split(getStringValue(marketAddress, "setup_ltvs"), ",")
283- let setupLt = split(getStringValue(marketAddress, "setup_lts"), ",")
284- let setupPenalty = split(getStringValue(marketAddress, "setup_penalties"), ",")
282+ let setupCf = split_4C(getStringValue(marketAddress, "setup_ltvs"), ",")
283+ let setupLt = split_4C(getStringValue(marketAddress, "setup_lts"), ",")
284+ let setupPenalty = split_4C(getStringValue(marketAddress, "setup_penalties"), ",")
285285 let tokensSize = size(setupTokens)
286286 func fold (accum,next) = if ((next >= tokensSize))
287287 then accum
367367
368368
369369 func assetToJson (assetIdStr,quantity) = {
370- let $t01532515520 = if ((assetIdStr == Waves))
370+ let $t01534315538 = if ((assetIdStr == Waves))
371371 then $Tuple2(8, "WAVES")
372372 else {
373373 let asset = value(assetInfo(fromBase58String(assetIdStr)))
374374 $Tuple2(asset.decimals, asset.name)
375375 }
376- let decimals = $t01532515520._1
377- let name = $t01532515520._2
376+ let decimals = $t01534315538._1
377+ let name = $t01534315538._2
378378 (((((((("{\"quantity\":" + toString(quantity)) + ",\"decimals\":") + toString(decimals)) + ",\"name\":\"") + name) + "\",\"id\":\"") + assetIdStr) + "\"}")
379379 }
380380
418418 $Tuple4((accum._1 + supplyInUsd), (accum._2 + borrowInUsd), (accum._3 + reservesInUsd), (accum._4 :+ marketAssetJson))
419419 }
420420
421- let $t01893319041 = {
421+ let $t01895119059 = {
422422 let $l = arr12
423423 let $s = size($l)
424424 let $acc0 = $Tuple4(0, 0, 0, nil)
432432
433433 $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)
434434 }
435- let supplyInUsd = $t01893319041._1
436- let borrowInUsd = $t01893319041._2
437- let reservesInUsd = $t01893319041._3
438- let marketAssetsJson = $t01893319041._4
435+ let supplyInUsd = $t01895119059._1
436+ let borrowInUsd = $t01895119059._2
437+ let reservesInUsd = $t01895119059._3
438+ let marketAssetsJson = $t01895119059._4
439439 let marketsCount = getIntegerValue("markets")
440440 func marketsFold (accum,next) = if ((next >= marketsCount))
441441 then accum
450450 let currentSetupTokens = getSetupTokens(currentMarketAddress)
451451 let currentAssetsCount = size(currentSetupTokens)
452452 let currentMarketShortName = getStringValue(("market_shortname_" + currentMarketAddressStr))
453- let setupCf = split(getStringValue(currentMarketAddress, "setup_ltvs"), ",")
454- let setupLt = split(getStringValue(currentMarketAddress, "setup_lts"), ",")
453+ let setupCf = split_4C(getStringValue(currentMarketAddress, "setup_ltvs"), ",")
454+ let setupLt = split_4C(getStringValue(currentMarketAddress, "setup_lts"), ",")
455455 let currentLastRateHeight = getLastRateHeight(currentMarketAddress)
456456 func marketAssetsFold (accum,next) = if ((next >= currentAssetsCount))
457457 then accum
479479 $Tuple4((accum._1 + walletSupplyInUsd), (accum._2 + walletBorrowInUsd), (accum._3 + walletBorrowLimitInUsd), (accum._4 + walletBorrowUsageInUsd))
480480 }
481481
482- let $t02261222772 = {
482+ let $t02263622796 = {
483483 let $l = arr12
484484 let $s = size($l)
485485 let $acc0 = $Tuple4(0, 0, 0, 0)
493493
494494 $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($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12)
495495 }
496- let totalWalletSupplyInUsd = $t02261222772._1
497- let totalWalletBorrowInUsd = $t02261222772._2
498- let totalWalletBorrowLimitInUsd = $t02261222772._3
499- let totalWalletBorrowUsageInUsd = $t02261222772._4
496+ let totalWalletSupplyInUsd = $t02263622796._1
497+ let totalWalletBorrowInUsd = $t02263622796._2
498+ let totalWalletBorrowLimitInUsd = $t02263622796._3
499+ let totalWalletBorrowUsageInUsd = $t02263622796._4
500500 let accountHealth = getAccountHealth(totalWalletBorrowLimitInUsd, totalWalletBorrowUsageInUsd)
501501 let fullJson = (((((((((((("{" + "\"index\":") + toString(next)) + ",\"name\":\"") + currentMarketShortName) + "\"") + ",\"supplyInUsd\":") + assetToJson(usdtIdStr, totalWalletSupplyInUsd)) + ",\"borrowInUsd\":") + assetToJson(usdtIdStr, totalWalletBorrowInUsd)) + ",\"accountHealth\":") + amountToDecimal(accountHealth, 8)) + "}")
502502 (accum :+ fullJson)
559559 $Tuple4((accum._1 + supplyInUsd), (accum._2 + borrowInUsd), (accum._3 + reservesInUsd), (accum._4 :+ marketAssetJson))
560560 }
561561
562- let $t02670626814 = {
562+ let $t02673026838 = {
563563 let $l = arr12
564564 let $s = size($l)
565565 let $acc0 = $Tuple4(0, 0, 0, nil)
573573
574574 $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)
575575 }
576- let supplyInUsd = $t02670626814._1
577- let borrowInUsd = $t02670626814._2
578- let reservesInUsd = $t02670626814._3
579- let marketAssetsJson = $t02670626814._4
576+ let supplyInUsd = $t02673026838._1
577+ let borrowInUsd = $t02673026838._2
578+ let reservesInUsd = $t02673026838._3
579+ let marketAssetsJson = $t02673026838._4
580580 let marketJson = ((((((("{" + "\"address\":\"") + marketStr) + "\"") + ",\"assets\":[") + makeString_11C(marketAssetsJson, ",")) + "]") + "}")
581581 $Tuple4((accum._1 + supplyInUsd), (accum._2 + borrowInUsd), (accum._3 + reservesInUsd), (accum._4 :+ marketJson))
582582 }
583583
584- let $t02720527324 = {
584+ let $t02722927348 = {
585585 let $l = arr12
586586 let $s = size($l)
587587 let $acc0 = $Tuple4(0, 0, 0, nil)
595595
596596 $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)
597597 }
598- let totalSupplyInUsd = $t02720527324._1
599- let totalBorrowInUsd = $t02720527324._2
600- let totalReservesInUsd = $t02720527324._3
601- let marketsJson = $t02720527324._4
598+ let totalSupplyInUsd = $t02722927348._1
599+ let totalBorrowInUsd = $t02722927348._2
600+ let totalReservesInUsd = $t02722927348._3
601+ let marketsJson = $t02722927348._4
602602 let json = (((((((((("{" + "\"supplyInUsd\":") + assetToJson(usdtIdStr, totalSupplyInUsd)) + ",\"borrowInUsd\":") + assetToJson(usdtIdStr, totalBorrowInUsd)) + ",\"reservesInUsd\":") + assetToJson(usdtIdStr, totalReservesInUsd)) + ",\"markets\":[") + makeString_11C(marketsJson, ",")) + "]") + "}")
603603 if (debug)
604604 then throw(json)
620620 let currentSetupTokens = getSetupTokens(currentMarketAddress)
621621 let currentAssetsCount = size(currentSetupTokens)
622622 let currentMarketShortName = getStringValue(("market_shortname_" + currentMarketAddressStr))
623- let setupCf = split(getStringValue(currentMarketAddress, "setup_ltvs"), ",")
624- let setupLt = split(getStringValue(currentMarketAddress, "setup_lts"), ",")
623+ let setupCf = split_4C(getStringValue(currentMarketAddress, "setup_ltvs"), ",")
624+ let setupLt = split_4C(getStringValue(currentMarketAddress, "setup_lts"), ",")
625625 let currentLastRateHeight = getLastRateHeight(currentMarketAddress)
626626 func marketAssetsFold (accum,next) = if ((next >= currentAssetsCount))
627627 then accum
659659 $Tuple7((accum._1 + walletSupplyInUsd), (accum._2 + walletBorrowInUsd), (accum._3 + walletBorrowLimitInUsd), (accum._4 + walletBorrowUsageInUsd), (accum._5 + walletDailyIncomeInUsd), (accum._6 + walletDailyLoanInterestInUsd), (accum._7 + walletMarginInUsd))
660660 }
661661
662- let $t03214832503 = {
662+ let $t03217832533 = {
663663 let $l = arr12
664664 let $s = size($l)
665665 let $acc0 = $Tuple7(0, 0, 0, 0, 0, 0, 0)
673673
674674 $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)
675675 }
676- let totalWalletSupplyInUsd = $t03214832503._1
677- let totalWalletBorrowInUsd = $t03214832503._2
678- let totalWalletBorrowLimitInUsd = $t03214832503._3
679- let totalWalletBorrowUsageInUsd = $t03214832503._4
680- let totalWalletDailyIncomeInUsd = $t03214832503._5
681- let totalWalletDailyLoanInterestInUsd = $t03214832503._6
682- let totalWalletMarginInUsd = $t03214832503._7
676+ let totalWalletSupplyInUsd = $t03217832533._1
677+ let totalWalletBorrowInUsd = $t03217832533._2
678+ let totalWalletBorrowLimitInUsd = $t03217832533._3
679+ let totalWalletBorrowUsageInUsd = $t03217832533._4
680+ let totalWalletDailyIncomeInUsd = $t03217832533._5
681+ let totalWalletDailyLoanInterestInUsd = $t03217832533._6
682+ let totalWalletMarginInUsd = $t03217832533._7
683683 let totalWalletBadDebtInUsd = if ((totalWalletBorrowInUsd > totalWalletSupplyInUsd))
684684 then (totalWalletBorrowInUsd - totalWalletSupplyInUsd)
685685 else 0
719719 $Tuple2((accum._1 :+ supplyAssetsJson), (accum._2 :+ borrowAssetsJson))
720720 }
721721
722- let $t03690536991 = {
722+ let $t03693537021 = {
723723 let $l = arr12
724724 let $s = size($l)
725725 let $acc0 = $Tuple2(nil, nil)
733733
734734 $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($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12)
735735 }
736- let supplyAssetsJson = $t03690536991._1
737- let borrowAssetsJson = $t03690536991._2
736+ let supplyAssetsJson = $t03693537021._1
737+ let borrowAssetsJson = $t03693537021._2
738738 if ((marketIndex == next))
739739 then $Tuple15((accum._1 + totalWalletSupplyInUsd), (accum._2 + totalWalletBorrowInUsd), (accum._3 + totalWalletBadDebtInUsd), (accum._4 + totalWalletDailyIncomeInUsd), (accum._5 + totalWalletDailyLoanInterestInUsd), totalWalletSupplyInUsd, totalWalletBorrowInUsd, totalWalletBadDebtInUsd, totalWalletDailyIncomeInUsd, totalWalletDailyLoanInterestInUsd, accountHealth, netApy, (accum._13 :+ marketsJson), supplyAssetsJson, borrowAssetsJson)
740740 else $Tuple15((accum._1 + totalWalletSupplyInUsd), (accum._2 + totalWalletBorrowInUsd), (accum._3 + totalWalletBadDebtInUsd), (accum._4 + totalWalletDailyIncomeInUsd), (accum._5 + totalWalletDailyLoanInterestInUsd), accum._6, accum._7, accum._8, accum._9, accum._10, accum._11, accum._12, (accum._13 :+ marketsJson), accum._14, accum._15)
741741 }
742742
743- let $t03844838932 = {
743+ let $t03847838962 = {
744744 let $l = arr12
745745 let $s = size($l)
746746 let $acc0 = $Tuple15(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, nil, nil, nil)
754754
755755 $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)
756756 }
757- let totalWalletSupplyInUsd = $t03844838932._1
758- let totalWalletBorrowInUsd = $t03844838932._2
759- let totalWalletBadDebtInUsd = $t03844838932._3
760- let totalWalletDailyIncomeInUsd = $t03844838932._4
761- let totalWalletDailyLoanInterestInUsd = $t03844838932._5
762- let walletSupplyInUsd = $t03844838932._6
763- let walletBorrowInUsd = $t03844838932._7
764- let walletBadDebtInUsd = $t03844838932._8
765- let walletDailyIncomeInUsd = $t03844838932._9
766- let walletDailyLoanInterestInUsd = $t03844838932._10
767- let walletAccountHealth = $t03844838932._11
768- let walletNetApy = $t03844838932._12
769- let marketsJson = $t03844838932._13
770- let supplyAssetsJson = $t03844838932._14
771- let borrowAssetsJson = $t03844838932._15
757+ let totalWalletSupplyInUsd = $t03847838962._1
758+ let totalWalletBorrowInUsd = $t03847838962._2
759+ let totalWalletBadDebtInUsd = $t03847838962._3
760+ let totalWalletDailyIncomeInUsd = $t03847838962._4
761+ let totalWalletDailyLoanInterestInUsd = $t03847838962._5
762+ let walletSupplyInUsd = $t03847838962._6
763+ let walletBorrowInUsd = $t03847838962._7
764+ let walletBadDebtInUsd = $t03847838962._8
765+ let walletDailyIncomeInUsd = $t03847838962._9
766+ let walletDailyLoanInterestInUsd = $t03847838962._10
767+ let walletAccountHealth = $t03847838962._11
768+ let walletNetApy = $t03847838962._12
769+ let marketsJson = $t03847838962._13
770+ let supplyAssetsJson = $t03847838962._14
771+ let borrowAssetsJson = $t03847838962._15
772772 let json = ((((((((((((((((((((((((((((((((((((((("{" + "\"marketIndex\":") + toString(marketIndex)) + ",\"name\":\"") + marketName) + "\"") + ",\"totalSupplyInUsd\":") + assetToJson(usdtIdStr, totalWalletSupplyInUsd)) + ",\"totalBorrowInUsd\":") + assetToJson(usdtIdStr, totalWalletBorrowInUsd)) + ",\"totalBadDebtInUsd\":") + assetToJson(usdtIdStr, totalWalletBadDebtInUsd)) + ",\"totalDailyIncomeInUsd\":") + assetToJson(usdtIdStr, totalWalletDailyIncomeInUsd)) + ",\"totalDailyLoanInterestInUsd\":") + assetToJson(usdtIdStr, totalWalletDailyLoanInterestInUsd)) + ",\"supplyInUsd\":") + assetToJson(usdtIdStr, walletSupplyInUsd)) + ",\"borrowInUsd\":") + assetToJson(usdtIdStr, walletBorrowInUsd)) + ",\"badDebtInUsd\":") + assetToJson(usdtIdStr, walletBadDebtInUsd)) + ",\"dailyIncomeInUsd\":") + assetToJson(usdtIdStr, walletDailyIncomeInUsd)) + ",\"dailyLoanInterestInUsd\":") + assetToJson(usdtIdStr, walletDailyLoanInterestInUsd)) + ",\"accountHealth\":") + amountToDecimal(walletAccountHealth, 8)) + ",\"netApy\":") + amountToDecimal(walletNetApy, 8)) + ",\"supplyAssets\":[") + makeString_11C(supplyAssetsJson, ",")) + "]") + ",\"borrowAssets\":[") + makeString_11C(borrowAssetsJson, ",")) + "]") + ",\"markets\":[") + makeString_11C(marketsJson, ",")) + "]") + "}")
773773 if (debug)
774774 then throw(json)
782782 let marketName = getStringValue(("market_name_" + marketStr))
783783 let active = valueOrElse(getBoolean(marketAddress, "setup_active"), true)
784784 let setupTokens = getSetupTokens(marketAddress)
785- let setupCf = split(getStringValue(marketAddress, "setup_ltvs"), ",")
786- let setupLt = split(getStringValue(marketAddress, "setup_lts"), ",")
787- let setupPenalty = split(getStringValue(marketAddress, "setup_penalties"), ",")
785+ let setupCf = split_4C(getStringValue(marketAddress, "setup_ltvs"), ",")
786+ let setupLt = split_4C(getStringValue(marketAddress, "setup_lts"), ",")
787+ let setupPenalty = split_4C(getStringValue(marketAddress, "setup_penalties"), ",")
788788 let assetIndex = getAssetIndex(setupTokens, assetIdStr)
789789 let cf = parseIntValue(setupCf[assetIndex])
790790 let lt = parseIntValue(setupLt[assetIndex])
852852 $Tuple5((accum._1 + currentWalletSupplyInUsd), (accum._2 + currentWalletBorrowInUsd), (accum._3 + currentWalletBorrowLimitInUsd), (accum._4 + currentWalletBorrowUsageInUsd), (accum._5 + walletMarginInUsd))
853853 }
854854
855- let $t04593446115 = {
855+ let $t04597346154 = {
856856 let $l = arr12
857857 let $s = size($l)
858858 let $acc0 = $Tuple5(0, 0, 0, 0, 0)
866866
867867 $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)
868868 }
869- let totalWalletSupplyInUsd = $t04593446115._1
870- let totalWalletBorrowInUsd = $t04593446115._2
871- let totalWalletBorrowLimitInUsd = $t04593446115._3
872- let totalWalletBorrowUsageInUsd = $t04593446115._4
873- let totalWalletMarginInUsd = $t04593446115._5
869+ let totalWalletSupplyInUsd = $t04597346154._1
870+ let totalWalletBorrowInUsd = $t04597346154._2
871+ let totalWalletBorrowLimitInUsd = $t04597346154._3
872+ let totalWalletBorrowUsageInUsd = $t04597346154._4
873+ let totalWalletMarginInUsd = $t04597346154._5
874874 let accountHealth = getAccountHealth(totalWalletBorrowLimitInUsd, totalWalletBorrowUsageInUsd)
875875 let netApy = getNetApy(totalWalletSupplyInUsd, totalWalletBorrowInUsd, totalWalletMarginInUsd)
876876 let json = ((((((((((((((((((((((((((((((((((((((((((((((((((((((((("{" + "\"marketIndex\":") + toString(marketIndex)) + ",\"marketName\":\"") + marketName) + "\"") + ",\"address\":\"") + marketStr) + "\"") + ",\"assetPrice\":") + assetToJson(usdtIdStr, price)) + ",\"supply\":") + assetToJson(assetIdStr, supply)) + ",\"supplyInUsd\":") + assetToJson(usdtIdStr, supplyInUsd)) + ",\"supplyApy\":") + amountToDecimal(supplyApy, 8)) + ",\"borrow\":") + assetToJson(assetIdStr, borrow)) + ",\"borrowInUsd\":") + assetToJson(usdtIdStr, borrowInUsd)) + ",\"borrowApy\":") + amountToDecimal(borrowApy, 8)) + ",\"reserves\":") + assetToJson(assetIdStr, reserves)) + ",\"reservesInUsd\":") + assetToJson(usdtIdStr, reservesInUsd)) + ",\"utilizationRatio\":") + amountToDecimal(ur, 8)) + ",\"collateralFactor\":") + amountToDecimal(cf, 8)) + ",\"liquidationThreshold\":") + amountToDecimal(lt, 8)) + ",\"liquidationPenalty\":") + amountToDecimal(penalty, 8)) + ",\"maxSupply\":") + assetToJson(usdtIdStr, maxSupply)) + ",\"walletSupply\":") + assetToJson(assetIdStr, walletSupply)) + ",\"walletSupplyInUsd\":") + assetToJson(usdtIdStr, walletSupplyInUsd)) + ",\"walletDailyIncome\":") + assetToJson(assetIdStr, walletDailyIncome)) + ",\"walletDailyIncomeInUsd\":") + assetToJson(usdtIdStr, walletDailyIncomeInUsd)) + ",\"walletBorrow\":") + assetToJson(assetIdStr, walletBorrow)) + ",\"walletBorrowInUsd\":") + assetToJson(usdtIdStr, walletBorrowInUsd)) + ",\"walletDailyLoanInterest\":") + assetToJson(assetIdStr, walletDailyLoanPercents)) + ",\"walletDailyLoanInterestInUsd\":") + assetToJson(usdtIdStr, walletDailyLoanPercentsInUsd)) + ",\"accountHealth\":") + amountToDecimal(accountHealth, 8)) + ",\"netApy\":") + amountToDecimal(netApy, 8)) + "}")
885885 let marketAddress = addressFromStringValue(marketStr)
886886 let marketName = getStringValue(("market_name_" + marketStr))
887887 let setupTokens = getSetupTokens(marketAddress)
888- let setupCf = split(getStringValue(marketAddress, "setup_ltvs"), ",")
889- let setupLt = split(getStringValue(marketAddress, "setup_lts"), ",")
890- let setupPenalty = split(getStringValue(marketAddress, "setup_penalties"), ",")
888+ let setupCf = split_4C(getStringValue(marketAddress, "setup_ltvs"), ",")
889+ let setupLt = split_4C(getStringValue(marketAddress, "setup_lts"), ",")
890+ let setupPenalty = split_4C(getStringValue(marketAddress, "setup_penalties"), ",")
891891 let assetsCount = size(setupTokens)
892892 func assetsFold (accum,next) = if ((next >= assetsCount))
893893 then accum
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let Waves = "WAVES"
55
66 let Scale6 = 1000000
77
88 let Scale8 = 100000000
99
1010 let Scale8Big = toBigInt(100000000)
1111
1212 let Scale10 = 10000000000
1313
1414 let Scale16 = 10000000000000000
1515
1616 let Scale16Big = toBigInt(10000000000000000)
1717
1818 let dayBlocks = 1440
1919
2020 let yearBlocks = 525600
2121
2222 let yearBlocksBig = toBigInt(525600)
2323
2424 let reserveFund = 20
2525
2626 let arr12 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
2727
2828 let usdtIdStr = "9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi"
2929
3030 let usdcIdStr = "HGgabTqUS8WtVFUJzfmrTDMgEccJuZLBPhFgQFxvnsoW"
3131
3232 let romeIdStr = "AP4Cb5xLYGH6ZigHreCZHoXpQTWDkPsG2BHqfDUx6taJ"
3333
3434 let oracleAddressStr = "3P8d1E1BLKoD52y3bQJ1bDTd2TD1gpaLn9t"
3535
3636 let axlyAddress = Address(base58'3PLsYkBw7taejV1J3qWPCN2yeyVRu31d5HW')
3737
3838 let axlyLPs = ["7KZbJrVopwJhkdwbe1eFDBbex4dkY63MxjTNjqXtrzj1", "Btw3G1j4wQgdp49PTxaFkNvn75dQtqGDM7ejQppHnWC1", "BiSzFe8nSL78oZaebfoin5vBZ5Pze6d7kaeijLqr5xZe", "F2AKkA513k5yHEJkLsU6vWxCYYk811GpjLhwEv2WGwZ9", "4CQ5CPGLXLbWBUs2JBjKUaRqF49CmKHkwzvPgSvQpAQV", "6iMB6LKSrgv9waEvEnN6Ydyx7dfxPnGcTw8318WVm5bR"]
3939
4040 func getRateCurve (assetIdStr,marketStr) = {
4141 let marketAddress = addressFromStringValue(marketStr)
4242 let setupRateCurve = getString(marketAddress, ("setup_rateCurve_" + assetIdStr))
4343 if (isDefined(setupRateCurve))
4444 then {
45- let curveArr = split(value(setupRateCurve), ",")
45+ let curveArr = split_4C(value(setupRateCurve), ",")
4646 $Tuple4(parseIntValue(curveArr[0]), parseIntValue(curveArr[1]), parseIntValue(curveArr[2]), parseIntValue(curveArr[3]))
4747 }
4848 else match marketStr {
4949 case _ =>
5050 if (("3P4uA5etnZi4AmBabKinq2bMiWU8KcnHZdH" == $match0))
5151 then match assetIdStr {
5252 case _ =>
5353 if (("9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi" == $match1))
5454 then $Tuple4(2000000, 25000000, 80000000, 100000000)
5555 else if (("HGgabTqUS8WtVFUJzfmrTDMgEccJuZLBPhFgQFxvnsoW" == $match1))
5656 then $Tuple4(2000000, 25000000, 80000000, 100000000)
5757 else if (("34N9YcEETLWn93qYQ64EsP1x89tSruJU44RrEMSXXEPJ" == $match1))
5858 then $Tuple4(2000000, 25000000, 80000000, 100000000)
5959 else if (("6XtHjpXbs9RRJP2Sr9GUyVqzACcby9TkThHXnjVC5CDJ" == $match1))
6060 then $Tuple4(2000000, 25000000, 80000000, 100000000)
6161 else if (("DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p" == $match1))
6262 then $Tuple4(2000000, 25000000, 80000000, 100000000)
6363 else if (("Ajso6nTTjptu2UHLx6hfSXVtHFtRBJCkKYd5SAyj7zf5" == $match1))
6464 then $Tuple4(2000000, 40000000, 80000000, 150000000)
6565 else if (("HEB8Qaw9xrWpWs8tHsiATYGBWDBtP2S7kcPALrMu43AS" == $match1))
6666 then $Tuple4(0, 100000000, 80000000, 400000000)
6767 else if (("WAVES" == $match1))
6868 then $Tuple4(2000000, 30000000, 80000000, 90000000)
6969 else if (("Atqv59EYzjFGuitKVnMRk6H8FukjoV3ktPorbEys25on" == $match1))
7070 then $Tuple4(0, 20000000, 80000000, 40000000)
7171 else if (("DSbbhLsSTeDg5Lsiufk2Aneh3DjVqJuPr2M9uU1gwy5p" == $match1))
7272 then $Tuple4(0, 20000000, 80000000, 100000000)
7373 else if (("8t4DPWTwPzpatHA9AkTxWAB47THnYzBsDnoY7fQqbG91" == $match1))
7474 then $Tuple4(0, 30000000, 80000000, 40000000)
7575 else if (("At8D6NFFpheCbvKVnjVoeLL84Eo8NZn6ovManxfLaFWL" == $match1))
7676 then $Tuple4(0, 25000000, 80000000, 40000000)
7777 else if (("8LQW8f7P5d5PZM7GtZEBgaqRPGSzS3DfPuiXrURJ4AJS" == $match1))
7878 then $Tuple4(2000000, 30000000, 80000000, 50000000)
7979 else if (("474jTeYx2r2Va35794tCScAXWJG9hU2HcgxzMowaZUnu" == $match1))
8080 then $Tuple4(2000000, 30000000, 80000000, 50000000)
8181 else if (("5UYBPpq4WoU5n4MwpFkgJnW3Fq4B1u3ukpK33ik4QerR" == $match1))
8282 then $Tuple4(2000000, 30000000, 80000000, 50000000)
8383 else if (("2thsACuHmzDMuNezPM32wg9a3BwUzBWDeSKakgz3cw21" == $match1))
8484 then $Tuple4(2000000, 40000000, 80000000, 100000000)
8585 else if (("YiNbofFzC17jEHHCMwrRcpy9MrrjabMMLZxg8g5xmf7" == $match1))
8686 then $Tuple4(2000000, 30000000, 80000000, 80000000)
8787 else if (("9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi" == $match1))
8888 then $Tuple4(0, 50000000, 80000000, 200000000)
8989 else if (("3VuV5WTmDz47Dmdn3QpcYjzbSdipjQE4JMdNe1xZpX13" == $match1))
9090 then $Tuple4(0, 100000000, 80000000, 400000000)
9191 else $Tuple4(0, 20000000, 80000000, 80000000)
9292 }
9393 else if (("3P8Df2b7ywHtLBHBe8PBVQYd3A5MdEEJAou" == $match0))
9494 then $Tuple4(20000000, 100000000, 60000000, 400000000)
9595 else if (("3P4DK5VzDwL3vfc5ahUEhtoe5ByZNyacJ3X" == $match0))
9696 then match assetIdStr {
9797 case _ =>
9898 if (("9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi" == $match1))
9999 then $Tuple4(2000000, 25000000, 80000000, 100000000)
100100 else if (("HGgabTqUS8WtVFUJzfmrTDMgEccJuZLBPhFgQFxvnsoW" == $match1))
101101 then $Tuple4(2000000, 25000000, 80000000, 100000000)
102102 else if (("34N9YcEETLWn93qYQ64EsP1x89tSruJU44RrEMSXXEPJ" == $match1))
103103 then $Tuple4(2000000, 25000000, 80000000, 100000000)
104104 else if (("6XtHjpXbs9RRJP2Sr9GUyVqzACcby9TkThHXnjVC5CDJ" == $match1))
105105 then $Tuple4(2000000, 25000000, 80000000, 100000000)
106106 else if (("DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p" == $match1))
107107 then $Tuple4(2000000, 25000000, 80000000, 100000000)
108108 else if (("Ajso6nTTjptu2UHLx6hfSXVtHFtRBJCkKYd5SAyj7zf5" == $match1))
109109 then $Tuple4(2000000, 40000000, 80000000, 150000000)
110110 else if (("HEB8Qaw9xrWpWs8tHsiATYGBWDBtP2S7kcPALrMu43AS" == $match1))
111111 then $Tuple4(0, 50000000, 80000000, 400000000)
112112 else if (("WAVES" == $match1))
113113 then $Tuple4(2000000, 30000000, 80000000, 80000000)
114114 else if (("Atqv59EYzjFGuitKVnMRk6H8FukjoV3ktPorbEys25on" == $match1))
115115 then $Tuple4(0, 20000000, 80000000, 40000000)
116116 else if (("DSbbhLsSTeDg5Lsiufk2Aneh3DjVqJuPr2M9uU1gwy5p" == $match1))
117117 then $Tuple4(0, 20000000, 80000000, 100000000)
118118 else if (("8t4DPWTwPzpatHA9AkTxWAB47THnYzBsDnoY7fQqbG91" == $match1))
119119 then $Tuple4(0, 30000000, 80000000, 40000000)
120120 else if (("At8D6NFFpheCbvKVnjVoeLL84Eo8NZn6ovManxfLaFWL" == $match1))
121121 then $Tuple4(0, 25000000, 80000000, 40000000)
122122 else if (("8LQW8f7P5d5PZM7GtZEBgaqRPGSzS3DfPuiXrURJ4AJS" == $match1))
123123 then $Tuple4(2000000, 30000000, 80000000, 50000000)
124124 else if (("474jTeYx2r2Va35794tCScAXWJG9hU2HcgxzMowaZUnu" == $match1))
125125 then $Tuple4(2000000, 30000000, 80000000, 50000000)
126126 else if (("5UYBPpq4WoU5n4MwpFkgJnW3Fq4B1u3ukpK33ik4QerR" == $match1))
127127 then $Tuple4(2000000, 30000000, 80000000, 50000000)
128128 else if (("2thsACuHmzDMuNezPM32wg9a3BwUzBWDeSKakgz3cw21" == $match1))
129129 then $Tuple4(2000000, 40000000, 80000000, 100000000)
130130 else if (("YiNbofFzC17jEHHCMwrRcpy9MrrjabMMLZxg8g5xmf7" == $match1))
131131 then $Tuple4(2000000, 30000000, 80000000, 80000000)
132132 else if (("9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi" == $match1))
133133 then $Tuple4(0, 50000000, 80000000, 200000000)
134134 else if (("3VuV5WTmDz47Dmdn3QpcYjzbSdipjQE4JMdNe1xZpX13" == $match1))
135135 then $Tuple4(0, 100000000, 80000000, 400000000)
136136 else $Tuple4(0, 20000000, 80000000, 80000000)
137137 }
138138 else if (("3PHpuQUPVUoR3AYzFeJzeWJfYLsLTmWssVH" == $match0))
139139 then $Tuple4(20000000, 100000000, 60000000, 400000000)
140140 else if (("3PAd9Aqg3cQSzu26MFYWQYcjSXPVCJtuf5V" == $match0))
141141 then match assetIdStr {
142142 case _ =>
143143 if (("9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi" == $match1))
144144 then $Tuple4(2000000, 25000000, 80000000, 100000000)
145145 else if (("HGgabTqUS8WtVFUJzfmrTDMgEccJuZLBPhFgQFxvnsoW" == $match1))
146146 then $Tuple4(2000000, 25000000, 80000000, 100000000)
147147 else if (("34N9YcEETLWn93qYQ64EsP1x89tSruJU44RrEMSXXEPJ" == $match1))
148148 then $Tuple4(2000000, 25000000, 80000000, 100000000)
149149 else if (("6XtHjpXbs9RRJP2Sr9GUyVqzACcby9TkThHXnjVC5CDJ" == $match1))
150150 then $Tuple4(2000000, 25000000, 80000000, 100000000)
151151 else if (("DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p" == $match1))
152152 then $Tuple4(2000000, 25000000, 80000000, 100000000)
153153 else if (("Ajso6nTTjptu2UHLx6hfSXVtHFtRBJCkKYd5SAyj7zf5" == $match1))
154154 then $Tuple4(2000000, 40000000, 80000000, 150000000)
155155 else if (("HEB8Qaw9xrWpWs8tHsiATYGBWDBtP2S7kcPALrMu43AS" == $match1))
156156 then $Tuple4(0, 20000000, 80000000, 40000000)
157157 else if (("WAVES" == $match1))
158158 then $Tuple4(2000000, 30000000, 80000000, 50000000)
159159 else if (("Atqv59EYzjFGuitKVnMRk6H8FukjoV3ktPorbEys25on" == $match1))
160160 then $Tuple4(0, 20000000, 80000000, 40000000)
161161 else if (("DSbbhLsSTeDg5Lsiufk2Aneh3DjVqJuPr2M9uU1gwy5p" == $match1))
162162 then $Tuple4(0, 20000000, 80000000, 100000000)
163163 else if (("8t4DPWTwPzpatHA9AkTxWAB47THnYzBsDnoY7fQqbG91" == $match1))
164164 then $Tuple4(0, 30000000, 80000000, 40000000)
165165 else if (("At8D6NFFpheCbvKVnjVoeLL84Eo8NZn6ovManxfLaFWL" == $match1))
166166 then $Tuple4(0, 25000000, 80000000, 40000000)
167167 else if (("8LQW8f7P5d5PZM7GtZEBgaqRPGSzS3DfPuiXrURJ4AJS" == $match1))
168168 then $Tuple4(2000000, 30000000, 80000000, 50000000)
169169 else if (("474jTeYx2r2Va35794tCScAXWJG9hU2HcgxzMowaZUnu" == $match1))
170170 then $Tuple4(2000000, 30000000, 80000000, 50000000)
171171 else if (("5UYBPpq4WoU5n4MwpFkgJnW3Fq4B1u3ukpK33ik4QerR" == $match1))
172172 then $Tuple4(2000000, 30000000, 80000000, 50000000)
173173 else if (("2thsACuHmzDMuNezPM32wg9a3BwUzBWDeSKakgz3cw21" == $match1))
174174 then $Tuple4(2000000, 40000000, 80000000, 100000000)
175175 else if (("YiNbofFzC17jEHHCMwrRcpy9MrrjabMMLZxg8g5xmf7" == $match1))
176176 then $Tuple4(2000000, 30000000, 80000000, 80000000)
177177 else $Tuple4(0, 20000000, 80000000, 80000000)
178178 }
179179 else throw("Unknown market")
180180 }
181181 }
182182
183183
184184 func sum (size,data) = {
185185 func fold (accum,next) = if ((next >= size))
186186 then accum
187187 else (accum + data[next])
188188
189189 let $l = arr12
190190 let $s = size($l)
191191 let $acc0 = 0
192192 func $f0_1 ($a,$i) = if (($i >= $s))
193193 then $a
194194 else fold($a, $l[$i])
195195
196196 func $f0_2 ($a,$i) = if (($i >= $s))
197197 then $a
198198 else throw("List size exceeds 12")
199199
200200 $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)
201201 }
202202
203203
204-func getSetupTokens (marketAddress) = split(getStringValue(marketAddress, "setup_tokens"), ",")
204+func getSetupTokens (marketAddress) = split_4C(getStringValue(marketAddress, "setup_tokens"), ",")
205205
206206
207207 func getTokenPrice (marketAddress,assetIdStr) = {
208208 let oracleStr = valueOrElse(getString(marketAddress, "oracle"), oracleAddressStr)
209209 let oracleAddress = addressFromStringValue(oracleStr)
210- let stables = split(valueOrElse(getString(marketAddress, "setup_stablesIds"), "9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi,HGgabTqUS8WtVFUJzfmrTDMgEccJuZLBPhFgQFxvnsoW"), ",")
210+ let stables = split_4C(valueOrElse(getString(marketAddress, "setup_stablesIds"), "9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi,HGgabTqUS8WtVFUJzfmrTDMgEccJuZLBPhFgQFxvnsoW"), ",")
211211 if ((indexOf(stables, assetIdStr) != unit))
212212 then 1000000
213213 else if (if (if ((assetIdStr == usdtIdStr))
214214 then true
215215 else (assetIdStr == usdcIdStr))
216216 then true
217217 else (assetIdStr == romeIdStr))
218218 then 1000000
219219 else if (containsElement(axlyLPs, assetIdStr))
220220 then {
221221 let @ = invoke(axlyAddress, "getShareAssetPriceREADONLY", [assetIdStr], nil)
222222 if ($isInstanceOf(@, "Int"))
223223 then @
224224 else throw(($getType(@) + " couldn't be cast to Int"))
225225 }
226226 else {
227227 let price = getIntegerValue(oracleAddress, (assetIdStr + "_twap5B"))
228228 price
229229 }
230230 }
231231
232232
233233 func getAssetScale (assetIdStr) = {
234234 let decimals = if ((assetIdStr == "WAVES"))
235235 then 8
236236 else value(assetInfo(fromBase58String(assetIdStr))).decimals
237237 pow(10, 0, decimals, 0, 0, DOWN)
238238 }
239239
240240
241241 func getLastRateHeight (marketAddress) = valueOrElse(getInteger(marketAddress, "lastRateHeight"), 0)
242242
243243
244244 func getOutdatedTotalSupply (marketAddress,assetIdStr) = valueOrElse(getInteger(marketAddress, ("total_supplied_" + assetIdStr)), 0)
245245
246246
247247 func getOutdatedTotalBorrow (marketAddress,assetIdStr) = valueOrElse(getInteger(marketAddress, ("total_borrowed_" + assetIdStr)), 0)
248248
249249
250250 func getOutdatedSRate (marketAddress,assetIdStr) = valueOrElse(getInteger(marketAddress, (assetIdStr + "_sRate")), 0)
251251
252252
253253 func getOutdatedBRate (marketAddress,assetIdStr) = valueOrElse(getInteger(marketAddress, (assetIdStr + "_bRate")), 0)
254254
255255
256256 func getOutdatedUr (outdatedTotalSupply,outdatedTotalBorrow,outdatedSRate,outdatedBRate) = {
257257 let down = fraction(outdatedTotalSupply, outdatedSRate, Scale16)
258258 if ((down == 0))
259259 then 0
260260 else fraction(Scale8, fraction(outdatedTotalBorrow, outdatedBRate, Scale16), down)
261261 }
262262
263263
264264 func getRate (outdatedUr,assetIdStr,marketStr) = {
265265 let curve = getRateCurve(assetIdStr, marketStr)
266266 (curve._1 + (if ((curve._3 >= outdatedUr))
267267 then fraction(outdatedUr, curve._2, curve._3)
268268 else (curve._2 + fraction((outdatedUr - curve._3), curve._4, (100000000 - curve._3)))))
269269 }
270270
271271
272272 func getInterest (rate) = max([fraction(rate, Scale8, yearBlocks), 1])
273273
274274
275275 func getAssetIndex (setupTokens,assetIdStr) = value(indexOf(setupTokens, assetIdStr))
276276
277277
278278 func getAssetParamters (marketParameters,assetIndex) = $Tuple3(marketParameters._1[assetIndex], marketParameters._2[assetIndex], marketParameters._3[assetIndex])
279279
280280
281281 func getMarketParameters (marketAddress,setupTokens) = {
282- let setupCf = split(getStringValue(marketAddress, "setup_ltvs"), ",")
283- let setupLt = split(getStringValue(marketAddress, "setup_lts"), ",")
284- let setupPenalty = split(getStringValue(marketAddress, "setup_penalties"), ",")
282+ let setupCf = split_4C(getStringValue(marketAddress, "setup_ltvs"), ",")
283+ let setupLt = split_4C(getStringValue(marketAddress, "setup_lts"), ",")
284+ let setupPenalty = split_4C(getStringValue(marketAddress, "setup_penalties"), ",")
285285 let tokensSize = size(setupTokens)
286286 func fold (accum,next) = if ((next >= tokensSize))
287287 then accum
288288 else $Tuple3((accum._1 :+ parseIntValue(setupCf[next])), (accum._2 :+ parseIntValue(setupLt[next])), (accum._3 :+ parseIntValue(setupPenalty[next])))
289289
290290 let $l = arr12
291291 let $s = size($l)
292292 let $acc0 = $Tuple3(nil, nil, nil)
293293 func $f0_1 ($a,$i) = if (($i >= $s))
294294 then $a
295295 else fold($a, $l[$i])
296296
297297 func $f0_2 ($a,$i) = if (($i >= $s))
298298 then $a
299299 else throw("List size exceeds 12")
300300
301301 $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)
302302 }
303303
304304
305305 func getMaxSupply (marketAddress,assetIdStr) = parseIntValue(valueOrElse(getString(marketAddress, ("setup_maxSupply_" + assetIdStr)), "0"))
306306
307307
308308 func getActualSRate (lastRateHeight,interest,outdatedUr,outdatedSRate) = {
309309 let lastSRate = max([outdatedSRate, Scale16])
310310 let newSRate = (lastSRate + ((((height - lastRateHeight) * fraction(interest, outdatedUr, Scale8)) * (100 - reserveFund)) / 100))
311311 newSRate
312312 }
313313
314314
315315 func getActualBRate (lastRateHeight,interest,outdatedBRate) = {
316316 let lastBRate = max([outdatedBRate, Scale16])
317317 let newBRate = (lastBRate + ((height - lastRateHeight) * interest))
318318 newBRate
319319 }
320320
321321
322322 func getActualUr (actualSupply,actualBorrow) = if ((actualSupply == 0))
323323 then 0
324324 else fraction(actualBorrow, Scale8, actualSupply)
325325
326326
327327 func getActualAmount (outdatedAmount,actualRate) = fraction(outdatedAmount, actualRate, Scale16)
328328
329329
330330 func getInUsd (actualAmount,assetScale,price) = fraction(actualAmount, price, assetScale)
331331
332332
333333 func getSupplyApy (rate,actualUr) = {
334334 let supplyRate = fraction(fraction(rate, 80, 100), actualUr, Scale8)
335335 (toInt(pow((Scale16Big + fraction(toBigInt(supplyRate), Scale8Big, yearBlocksBig)), 16, yearBlocksBig, 0, 8, DOWN)) - Scale8)
336336 }
337337
338338
339339 func getBorrowApy (rate) = (toInt(pow((Scale16Big + fraction(toBigInt(rate), Scale8Big, yearBlocksBig)), 16, yearBlocksBig, 0, 8, DOWN)) - Scale8)
340340
341341
342342 func getWalletSupply (marketAddress,assetIdStr,wallet,actualSRate) = {
343343 let outdatedWalletSupply = valueOrElse(getInteger(marketAddress, ((wallet + "_supplied_") + assetIdStr)), 0)
344344 getActualAmount(outdatedWalletSupply, actualSRate)
345345 }
346346
347347
348348 func getWalletBorrow (marketAddress,assetIdStr,wallet,actualBRate) = {
349349 let outdatedWalletBorrow = valueOrElse(getInteger(marketAddress, ((wallet + "_borrowed_") + assetIdStr)), 0)
350350 getActualAmount(outdatedWalletBorrow, actualBRate)
351351 }
352352
353353
354354 func getDailyPercents (apy,quantity) = fraction(fraction((toInt(pow((Scale8Big + toBigInt(apy)), 8, (Scale16Big / yearBlocksBig), 16, 16, DOWN)) - Scale16), dayBlocks, Scale8), quantity, Scale8)
355355
356356
357357 func getAccountHealth (totalWalletBorrowLimitInUsd,totalWalletBorrowUsageInUsd) = if ((totalWalletBorrowLimitInUsd == 0))
358358 then Scale8
359359 else (Scale8 - fraction(totalWalletBorrowUsageInUsd, Scale8, totalWalletBorrowLimitInUsd))
360360
361361
362362 func getNetApy (totalWalletSupplyInUsd,totalWalletBorrowInUsd,totalWalletMarginInUsd) = if ((totalWalletMarginInUsd == 0))
363363 then 0
364364 else if ((totalWalletMarginInUsd > 0))
365365 then fraction(totalWalletMarginInUsd, Scale8, totalWalletSupplyInUsd)
366366 else fraction(totalWalletMarginInUsd, Scale8, totalWalletBorrowInUsd)
367367
368368
369369 func assetToJson (assetIdStr,quantity) = {
370- let $t01532515520 = if ((assetIdStr == Waves))
370+ let $t01534315538 = if ((assetIdStr == Waves))
371371 then $Tuple2(8, "WAVES")
372372 else {
373373 let asset = value(assetInfo(fromBase58String(assetIdStr)))
374374 $Tuple2(asset.decimals, asset.name)
375375 }
376- let decimals = $t01532515520._1
377- let name = $t01532515520._2
376+ let decimals = $t01534315538._1
377+ let name = $t01534315538._2
378378 (((((((("{\"quantity\":" + toString(quantity)) + ",\"decimals\":") + toString(decimals)) + ",\"name\":\"") + name) + "\",\"id\":\"") + assetIdStr) + "\"}")
379379 }
380380
381381
382382 func amountToDecimal (amount,decimals) = (((("{\"quantity\":" + toString(amount)) + ",\"decimals\":") + toString(decimals)) + ",\"name\":\"\",\"id\":\"\"}")
383383
384384
385385 func getMarketJson (marketIndex,wallet,debug) = {
386386 let marketStr = getStringValue(("market_" + toString(marketIndex)))
387387 let marketAddress = addressFromStringValue(marketStr)
388388 let marketName = getStringValue(("market_name_" + marketStr))
389389 let active = valueOrElse(getBoolean(marketAddress, "setup_active"), true)
390390 let setupTokens = getSetupTokens(marketAddress)
391391 let assetsCount = size(setupTokens)
392392 let lastRateHeight = getLastRateHeight(marketAddress)
393393 func assetsFold (accum,next) = if ((next >= assetsCount))
394394 then accum
395395 else {
396396 let assetIdStr = setupTokens[next]
397397 let price = getTokenPrice(marketAddress, assetIdStr)
398398 let assetScale = getAssetScale(assetIdStr)
399399 let outdatedTotalSupply = getOutdatedTotalSupply(marketAddress, assetIdStr)
400400 let outdatedTotalBorrow = getOutdatedTotalBorrow(marketAddress, assetIdStr)
401401 let outdatedSRate = getOutdatedSRate(marketAddress, assetIdStr)
402402 let outdatedBRate = getOutdatedBRate(marketAddress, assetIdStr)
403403 let outdatedUr = getOutdatedUr(outdatedTotalSupply, outdatedTotalBorrow, outdatedSRate, outdatedBRate)
404404 let rate = getRate(outdatedUr, assetIdStr, marketStr)
405405 let interest = getInterest(rate)
406406 let sRate = getActualSRate(lastRateHeight, interest, outdatedUr, outdatedSRate)
407407 let bRate = getActualBRate(lastRateHeight, interest, outdatedBRate)
408408 let supply = getActualAmount(outdatedTotalSupply, sRate)
409409 let borrow = getActualAmount(outdatedTotalBorrow, bRate)
410410 let supplyInUsd = getInUsd(supply, assetScale, price)
411411 let borrowInUsd = getInUsd(borrow, assetScale, price)
412412 let reserves = (supply - borrow)
413413 let reservesInUsd = getInUsd(reserves, assetScale, price)
414414 let ur = getActualUr(supply, borrow)
415415 let supplyApy = getSupplyApy(rate, ur)
416416 let borrowApy = getBorrowApy(rate)
417417 let marketAssetJson = ((((((((((((((((((((((((("{" + "\"supply\":") + assetToJson(assetIdStr, supply)) + ",\"supplyInUsd\":") + assetToJson(usdtIdStr, supplyInUsd)) + ",\"borrow\":") + assetToJson(assetIdStr, borrow)) + ",\"borrowInUsd\":") + assetToJson(usdtIdStr, borrowInUsd)) + ",\"reserves\":") + assetToJson(assetIdStr, reserves)) + ",\"reservesInUsd\":") + assetToJson(usdtIdStr, reservesInUsd)) + ",\"price\":") + assetToJson(usdtIdStr, price)) + ",\"supplyApy\":") + amountToDecimal(supplyApy, 8)) + ",\"borrowApy\":") + amountToDecimal(borrowApy, 8)) + ",\"utilizationRatio\":") + amountToDecimal(ur, 8)) + ",\"sRate\":") + amountToDecimal(sRate, 16)) + ",\"bRate\":") + amountToDecimal(bRate, 16)) + "}")
418418 $Tuple4((accum._1 + supplyInUsd), (accum._2 + borrowInUsd), (accum._3 + reservesInUsd), (accum._4 :+ marketAssetJson))
419419 }
420420
421- let $t01893319041 = {
421+ let $t01895119059 = {
422422 let $l = arr12
423423 let $s = size($l)
424424 let $acc0 = $Tuple4(0, 0, 0, nil)
425425 func $f0_1 ($a,$i) = if (($i >= $s))
426426 then $a
427427 else assetsFold($a, $l[$i])
428428
429429 func $f0_2 ($a,$i) = if (($i >= $s))
430430 then $a
431431 else throw("List size exceeds 12")
432432
433433 $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)
434434 }
435- let supplyInUsd = $t01893319041._1
436- let borrowInUsd = $t01893319041._2
437- let reservesInUsd = $t01893319041._3
438- let marketAssetsJson = $t01893319041._4
435+ let supplyInUsd = $t01895119059._1
436+ let borrowInUsd = $t01895119059._2
437+ let reservesInUsd = $t01895119059._3
438+ let marketAssetsJson = $t01895119059._4
439439 let marketsCount = getIntegerValue("markets")
440440 func marketsFold (accum,next) = if ((next >= marketsCount))
441441 then accum
442442 else {
443443 let currentMarketAddressStr = getStringValue(("market_" + toString(next)))
444444 let currentMarketName = getStringValue(("market_name_" + currentMarketAddressStr))
445445 let simpleJson = (((((((((("{" + "\"index\":") + toString(next)) + ",\"name\":\"") + currentMarketName) + "\"") + ",\"supplyInUsd\":") + assetToJson(usdtIdStr, 0)) + ",\"accountHealth\":") + amountToDecimal(0, 8)) + "}")
446446 if ((wallet == ""))
447447 then (accum :+ simpleJson)
448448 else {
449449 let currentMarketAddress = addressFromStringValue(currentMarketAddressStr)
450450 let currentSetupTokens = getSetupTokens(currentMarketAddress)
451451 let currentAssetsCount = size(currentSetupTokens)
452452 let currentMarketShortName = getStringValue(("market_shortname_" + currentMarketAddressStr))
453- let setupCf = split(getStringValue(currentMarketAddress, "setup_ltvs"), ",")
454- let setupLt = split(getStringValue(currentMarketAddress, "setup_lts"), ",")
453+ let setupCf = split_4C(getStringValue(currentMarketAddress, "setup_ltvs"), ",")
454+ let setupLt = split_4C(getStringValue(currentMarketAddress, "setup_lts"), ",")
455455 let currentLastRateHeight = getLastRateHeight(currentMarketAddress)
456456 func marketAssetsFold (accum,next) = if ((next >= currentAssetsCount))
457457 then accum
458458 else {
459459 let assetIdStr = currentSetupTokens[next]
460460 let cf = parseIntValue(setupCf[next])
461461 let lt = parseIntValue(setupLt[next])
462462 let price = getTokenPrice(marketAddress, assetIdStr)
463463 let assetScale = getAssetScale(assetIdStr)
464464 let outdatedTotalSupply = getOutdatedTotalSupply(currentMarketAddress, assetIdStr)
465465 let outdatedTotalBorrow = getOutdatedTotalBorrow(currentMarketAddress, assetIdStr)
466466 let outdatedSRate = getOutdatedSRate(currentMarketAddress, assetIdStr)
467467 let outdatedBRate = getOutdatedBRate(currentMarketAddress, assetIdStr)
468468 let outdatedUr = getOutdatedUr(outdatedTotalSupply, outdatedTotalBorrow, outdatedSRate, outdatedBRate)
469469 let rate = getRate(outdatedUr, assetIdStr, marketStr)
470470 let interest = getInterest(rate)
471471 let sRate = getActualSRate(currentLastRateHeight, interest, outdatedUr, outdatedSRate)
472472 let bRate = getActualBRate(currentLastRateHeight, interest, outdatedBRate)
473473 let walletSupply = getWalletSupply(currentMarketAddress, assetIdStr, wallet, sRate)
474474 let walletSupplyInUsd = getInUsd(walletSupply, assetScale, price)
475475 let walletBorrow = getWalletBorrow(currentMarketAddress, assetIdStr, wallet, bRate)
476476 let walletBorrowInUsd = getInUsd(walletBorrow, assetScale, price)
477477 let walletBorrowLimitInUsd = fraction(walletSupplyInUsd, cf, Scale8)
478478 let walletBorrowUsageInUsd = fraction(walletBorrowInUsd, Scale8, lt)
479479 $Tuple4((accum._1 + walletSupplyInUsd), (accum._2 + walletBorrowInUsd), (accum._3 + walletBorrowLimitInUsd), (accum._4 + walletBorrowUsageInUsd))
480480 }
481481
482- let $t02261222772 = {
482+ let $t02263622796 = {
483483 let $l = arr12
484484 let $s = size($l)
485485 let $acc0 = $Tuple4(0, 0, 0, 0)
486486 func $f1_1 ($a,$i) = if (($i >= $s))
487487 then $a
488488 else marketAssetsFold($a, $l[$i])
489489
490490 func $f1_2 ($a,$i) = if (($i >= $s))
491491 then $a
492492 else throw("List size exceeds 12")
493493
494494 $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($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12)
495495 }
496- let totalWalletSupplyInUsd = $t02261222772._1
497- let totalWalletBorrowInUsd = $t02261222772._2
498- let totalWalletBorrowLimitInUsd = $t02261222772._3
499- let totalWalletBorrowUsageInUsd = $t02261222772._4
496+ let totalWalletSupplyInUsd = $t02263622796._1
497+ let totalWalletBorrowInUsd = $t02263622796._2
498+ let totalWalletBorrowLimitInUsd = $t02263622796._3
499+ let totalWalletBorrowUsageInUsd = $t02263622796._4
500500 let accountHealth = getAccountHealth(totalWalletBorrowLimitInUsd, totalWalletBorrowUsageInUsd)
501501 let fullJson = (((((((((((("{" + "\"index\":") + toString(next)) + ",\"name\":\"") + currentMarketShortName) + "\"") + ",\"supplyInUsd\":") + assetToJson(usdtIdStr, totalWalletSupplyInUsd)) + ",\"borrowInUsd\":") + assetToJson(usdtIdStr, totalWalletBorrowInUsd)) + ",\"accountHealth\":") + amountToDecimal(accountHealth, 8)) + "}")
502502 (accum :+ fullJson)
503503 }
504504 }
505505
506506 let marketsJson = {
507507 let $l = arr12
508508 let $s = size($l)
509509 let $acc0 = nil
510510 func $f1_1 ($a,$i) = if (($i >= $s))
511511 then $a
512512 else marketsFold($a, $l[$i])
513513
514514 func $f1_2 ($a,$i) = if (($i >= $s))
515515 then $a
516516 else throw("List size exceeds 12")
517517
518518 $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($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12)
519519 }
520520 let json = ((((((((((((((((((((((("{" + "\"index\":") + toString(marketIndex)) + ",\"name\":\"") + marketName) + "\"") + ",\"address\":\"") + marketStr) + "\"") + ",\"active\":") + toString(active)) + ",\"supplyInUsd\":") + assetToJson(usdtIdStr, supplyInUsd)) + ",\"borrowInUsd\":") + assetToJson(usdtIdStr, borrowInUsd)) + ",\"reservesInUsd\":") + assetToJson(usdtIdStr, reservesInUsd)) + ",\"assets\":[") + makeString_11C(marketAssetsJson, ",")) + "]") + ",\"markets\":[") + makeString_11C(marketsJson, ",")) + "]") + "}")
521521 if (debug)
522522 then throw(json)
523523 else json
524524 }
525525
526526
527527 func getMenuJson (debug) = {
528528 let marketsCount = getIntegerValue("markets")
529529 func marketsFold (accum,next) = if ((next >= marketsCount))
530530 then accum
531531 else {
532532 let marketStr = getStringValue(("market_" + toString(next)))
533533 let marketAddress = addressFromStringValue(marketStr)
534534 let setupTokens = getSetupTokens(marketAddress)
535535 let assetsCount = size(setupTokens)
536536 let lastRateHeight = getLastRateHeight(marketAddress)
537537 func assetsFold (accum,next) = if ((next >= assetsCount))
538538 then accum
539539 else {
540540 let assetIdStr = setupTokens[next]
541541 let price = getTokenPrice(marketAddress, assetIdStr)
542542 let assetScale = getAssetScale(assetIdStr)
543543 let outdatedTotalSupply = getOutdatedTotalSupply(marketAddress, assetIdStr)
544544 let outdatedTotalBorrow = getOutdatedTotalBorrow(marketAddress, assetIdStr)
545545 let outdatedSRate = getOutdatedSRate(marketAddress, assetIdStr)
546546 let outdatedBRate = getOutdatedBRate(marketAddress, assetIdStr)
547547 let outdatedUr = getOutdatedUr(outdatedTotalSupply, outdatedTotalBorrow, outdatedSRate, outdatedBRate)
548548 let rate = getRate(outdatedUr, assetIdStr, marketStr)
549549 let interest = getInterest(rate)
550550 let sRate = getActualSRate(lastRateHeight, interest, outdatedUr, outdatedSRate)
551551 let bRate = getActualBRate(lastRateHeight, interest, outdatedBRate)
552552 let supply = getActualAmount(outdatedTotalSupply, sRate)
553553 let borrow = getActualAmount(outdatedTotalBorrow, bRate)
554554 let supplyInUsd = getInUsd(supply, assetScale, price)
555555 let borrowInUsd = getInUsd(borrow, assetScale, price)
556556 let reserves = (supply - borrow)
557557 let reservesInUsd = getInUsd(reserves, assetScale, price)
558558 let marketAssetJson = ((((((((("{" + "\"asset\":") + assetToJson(assetIdStr, 0)) + ",\"price\":") + assetToJson(usdtIdStr, price)) + ",\"sRate\":") + amountToDecimal(sRate, 16)) + ",\"bRate\":") + amountToDecimal(bRate, 16)) + "}")
559559 $Tuple4((accum._1 + supplyInUsd), (accum._2 + borrowInUsd), (accum._3 + reservesInUsd), (accum._4 :+ marketAssetJson))
560560 }
561561
562- let $t02670626814 = {
562+ let $t02673026838 = {
563563 let $l = arr12
564564 let $s = size($l)
565565 let $acc0 = $Tuple4(0, 0, 0, nil)
566566 func $f0_1 ($a,$i) = if (($i >= $s))
567567 then $a
568568 else assetsFold($a, $l[$i])
569569
570570 func $f0_2 ($a,$i) = if (($i >= $s))
571571 then $a
572572 else throw("List size exceeds 12")
573573
574574 $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)
575575 }
576- let supplyInUsd = $t02670626814._1
577- let borrowInUsd = $t02670626814._2
578- let reservesInUsd = $t02670626814._3
579- let marketAssetsJson = $t02670626814._4
576+ let supplyInUsd = $t02673026838._1
577+ let borrowInUsd = $t02673026838._2
578+ let reservesInUsd = $t02673026838._3
579+ let marketAssetsJson = $t02673026838._4
580580 let marketJson = ((((((("{" + "\"address\":\"") + marketStr) + "\"") + ",\"assets\":[") + makeString_11C(marketAssetsJson, ",")) + "]") + "}")
581581 $Tuple4((accum._1 + supplyInUsd), (accum._2 + borrowInUsd), (accum._3 + reservesInUsd), (accum._4 :+ marketJson))
582582 }
583583
584- let $t02720527324 = {
584+ let $t02722927348 = {
585585 let $l = arr12
586586 let $s = size($l)
587587 let $acc0 = $Tuple4(0, 0, 0, nil)
588588 func $f0_1 ($a,$i) = if (($i >= $s))
589589 then $a
590590 else marketsFold($a, $l[$i])
591591
592592 func $f0_2 ($a,$i) = if (($i >= $s))
593593 then $a
594594 else throw("List size exceeds 12")
595595
596596 $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)
597597 }
598- let totalSupplyInUsd = $t02720527324._1
599- let totalBorrowInUsd = $t02720527324._2
600- let totalReservesInUsd = $t02720527324._3
601- let marketsJson = $t02720527324._4
598+ let totalSupplyInUsd = $t02722927348._1
599+ let totalBorrowInUsd = $t02722927348._2
600+ let totalReservesInUsd = $t02722927348._3
601+ let marketsJson = $t02722927348._4
602602 let json = (((((((((("{" + "\"supplyInUsd\":") + assetToJson(usdtIdStr, totalSupplyInUsd)) + ",\"borrowInUsd\":") + assetToJson(usdtIdStr, totalBorrowInUsd)) + ",\"reservesInUsd\":") + assetToJson(usdtIdStr, totalReservesInUsd)) + ",\"markets\":[") + makeString_11C(marketsJson, ",")) + "]") + "}")
603603 if (debug)
604604 then throw(json)
605605 else json
606606 }
607607
608608
609609 func getWalletJson (marketIndex,wallet,debug) = {
610610 let marketStr = getStringValue(("market_" + toString(marketIndex)))
611611 let marketAddress = addressFromStringValue(marketStr)
612612 let marketName = getStringValue(("market_name_" + marketStr))
613613 let marketsCount = getIntegerValue("markets")
614614 func marketsFold (accum,next) = if ((next >= marketsCount))
615615 then accum
616616 else {
617617 let currentMarketAddressStr = getStringValue(("market_" + toString(next)))
618618 let currentMarketName = getStringValue(("market_name_" + currentMarketAddressStr))
619619 let currentMarketAddress = addressFromStringValue(currentMarketAddressStr)
620620 let currentSetupTokens = getSetupTokens(currentMarketAddress)
621621 let currentAssetsCount = size(currentSetupTokens)
622622 let currentMarketShortName = getStringValue(("market_shortname_" + currentMarketAddressStr))
623- let setupCf = split(getStringValue(currentMarketAddress, "setup_ltvs"), ",")
624- let setupLt = split(getStringValue(currentMarketAddress, "setup_lts"), ",")
623+ let setupCf = split_4C(getStringValue(currentMarketAddress, "setup_ltvs"), ",")
624+ let setupLt = split_4C(getStringValue(currentMarketAddress, "setup_lts"), ",")
625625 let currentLastRateHeight = getLastRateHeight(currentMarketAddress)
626626 func marketAssetsFold (accum,next) = if ((next >= currentAssetsCount))
627627 then accum
628628 else {
629629 let assetIdStr = currentSetupTokens[next]
630630 let cf = parseIntValue(setupCf[next])
631631 let lt = parseIntValue(setupLt[next])
632632 let price = getTokenPrice(marketAddress, assetIdStr)
633633 let assetScale = getAssetScale(assetIdStr)
634634 let outdatedTotalSupply = getOutdatedTotalSupply(currentMarketAddress, assetIdStr)
635635 let outdatedTotalBorrow = getOutdatedTotalBorrow(currentMarketAddress, assetIdStr)
636636 let outdatedSRate = getOutdatedSRate(currentMarketAddress, assetIdStr)
637637 let outdatedBRate = getOutdatedBRate(currentMarketAddress, assetIdStr)
638638 let outdatedUr = getOutdatedUr(outdatedTotalSupply, outdatedTotalBorrow, outdatedSRate, outdatedBRate)
639639 let rate = getRate(outdatedUr, assetIdStr, marketStr)
640640 let interest = getInterest(rate)
641641 let sRate = getActualSRate(currentLastRateHeight, interest, outdatedUr, outdatedSRate)
642642 let bRate = getActualBRate(currentLastRateHeight, interest, outdatedBRate)
643643 let supply = getActualAmount(outdatedTotalSupply, sRate)
644644 let borrow = getActualAmount(outdatedTotalBorrow, bRate)
645645 let ur = getActualUr(supply, borrow)
646646 let supplyApy = getSupplyApy(rate, ur)
647647 let borrowApy = getBorrowApy(rate)
648648 let walletSupply = getWalletSupply(currentMarketAddress, assetIdStr, wallet, sRate)
649649 let walletSupplyInUsd = getInUsd(walletSupply, assetScale, price)
650650 let walletBorrow = getWalletBorrow(currentMarketAddress, assetIdStr, wallet, bRate)
651651 let walletBorrowInUsd = getInUsd(walletBorrow, assetScale, price)
652652 let walletBorrowLimitInUsd = fraction(walletSupplyInUsd, cf, Scale8)
653653 let walletBorrowUsageInUsd = fraction(walletBorrowInUsd, Scale8, lt)
654654 let walletDailyIncome = getDailyPercents(supplyApy, walletSupply)
655655 let walletDailyIncomeInUsd = getInUsd(walletDailyIncome, assetScale, price)
656656 let walletDailyLoanInterest = getDailyPercents(borrowApy, walletBorrow)
657657 let walletDailyLoanInterestInUsd = getInUsd(walletDailyLoanInterest, assetScale, price)
658658 let walletMarginInUsd = (fraction(walletSupplyInUsd, supplyApy, Scale8) - fraction(walletBorrowInUsd, borrowApy, Scale8))
659659 $Tuple7((accum._1 + walletSupplyInUsd), (accum._2 + walletBorrowInUsd), (accum._3 + walletBorrowLimitInUsd), (accum._4 + walletBorrowUsageInUsd), (accum._5 + walletDailyIncomeInUsd), (accum._6 + walletDailyLoanInterestInUsd), (accum._7 + walletMarginInUsd))
660660 }
661661
662- let $t03214832503 = {
662+ let $t03217832533 = {
663663 let $l = arr12
664664 let $s = size($l)
665665 let $acc0 = $Tuple7(0, 0, 0, 0, 0, 0, 0)
666666 func $f0_1 ($a,$i) = if (($i >= $s))
667667 then $a
668668 else marketAssetsFold($a, $l[$i])
669669
670670 func $f0_2 ($a,$i) = if (($i >= $s))
671671 then $a
672672 else throw("List size exceeds 12")
673673
674674 $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)
675675 }
676- let totalWalletSupplyInUsd = $t03214832503._1
677- let totalWalletBorrowInUsd = $t03214832503._2
678- let totalWalletBorrowLimitInUsd = $t03214832503._3
679- let totalWalletBorrowUsageInUsd = $t03214832503._4
680- let totalWalletDailyIncomeInUsd = $t03214832503._5
681- let totalWalletDailyLoanInterestInUsd = $t03214832503._6
682- let totalWalletMarginInUsd = $t03214832503._7
676+ let totalWalletSupplyInUsd = $t03217832533._1
677+ let totalWalletBorrowInUsd = $t03217832533._2
678+ let totalWalletBorrowLimitInUsd = $t03217832533._3
679+ let totalWalletBorrowUsageInUsd = $t03217832533._4
680+ let totalWalletDailyIncomeInUsd = $t03217832533._5
681+ let totalWalletDailyLoanInterestInUsd = $t03217832533._6
682+ let totalWalletMarginInUsd = $t03217832533._7
683683 let totalWalletBadDebtInUsd = if ((totalWalletBorrowInUsd > totalWalletSupplyInUsd))
684684 then (totalWalletBorrowInUsd - totalWalletSupplyInUsd)
685685 else 0
686686 let accountHealth = getAccountHealth(totalWalletBorrowLimitInUsd, totalWalletBorrowUsageInUsd)
687687 let netApy = getNetApy(totalWalletSupplyInUsd, totalWalletBorrowInUsd, totalWalletMarginInUsd)
688688 let marketsJson = (((((((((((("{" + "\"index\":") + toString(next)) + ",\"name\":\"") + currentMarketShortName) + "\"") + ",\"supplyInUsd\":") + assetToJson(usdtIdStr, totalWalletSupplyInUsd)) + ",\"borrowInUsd\":") + assetToJson(usdtIdStr, totalWalletBorrowInUsd)) + ",\"accountHealth\":") + amountToDecimal(accountHealth, 8)) + "}")
689689 func walletAssetsFold (accum,next) = if ((next >= currentAssetsCount))
690690 then accum
691691 else {
692692 let assetIdStr = currentSetupTokens[next]
693693 let price = getTokenPrice(marketAddress, assetIdStr)
694694 let assetScale = getAssetScale(assetIdStr)
695695 let outdatedTotalSupply = getOutdatedTotalSupply(currentMarketAddress, assetIdStr)
696696 let outdatedTotalBorrow = getOutdatedTotalBorrow(currentMarketAddress, assetIdStr)
697697 let outdatedSRate = getOutdatedSRate(currentMarketAddress, assetIdStr)
698698 let outdatedBRate = getOutdatedBRate(currentMarketAddress, assetIdStr)
699699 let outdatedUr = getOutdatedUr(outdatedTotalSupply, outdatedTotalBorrow, outdatedSRate, outdatedBRate)
700700 let rate = getRate(outdatedUr, assetIdStr, marketStr)
701701 let interest = getInterest(rate)
702702 let sRate = getActualSRate(currentLastRateHeight, interest, outdatedUr, outdatedSRate)
703703 let bRate = getActualBRate(currentLastRateHeight, interest, outdatedBRate)
704704 let supply = getActualAmount(outdatedTotalSupply, sRate)
705705 let borrow = getActualAmount(outdatedTotalBorrow, bRate)
706706 let ur = getActualUr(supply, borrow)
707707 let supplyApy = getSupplyApy(rate, ur)
708708 let borrowApy = getBorrowApy(rate)
709709 let walletSupply = getWalletSupply(currentMarketAddress, assetIdStr, wallet, sRate)
710710 let walletSupplyInUsd = getInUsd(walletSupply, assetScale, price)
711711 let walletBorrow = getWalletBorrow(currentMarketAddress, assetIdStr, wallet, bRate)
712712 let walletBorrowInUsd = getInUsd(walletBorrow, assetScale, price)
713713 let walletDailyIncome = getDailyPercents(supplyApy, walletSupply)
714714 let walletDailyIncomeInUsd = getInUsd(walletDailyIncome, assetScale, price)
715715 let walletDailyLoanInterest = getDailyPercents(borrowApy, walletBorrow)
716716 let walletDailyLoanInterestInUsd = getInUsd(walletDailyLoanInterest, assetScale, price)
717717 let supplyAssetsJson = ((((((((((((("{" + "\"amount\":") + assetToJson(assetIdStr, walletSupply)) + ",\"amountInUsd\":") + assetToJson(usdtIdStr, walletSupplyInUsd)) + ",\"price\":") + assetToJson(usdtIdStr, price)) + ",\"apy\":") + amountToDecimal(supplyApy, 8)) + ",\"dailyPercents\":") + assetToJson(assetIdStr, walletDailyIncome)) + ",\"dailyPercentsInUsd\":") + assetToJson(usdtIdStr, walletDailyIncomeInUsd)) + "}")
718718 let borrowAssetsJson = ((((((((((((("{" + "\"amount\":") + assetToJson(assetIdStr, walletBorrow)) + ",\"amountInUsd\":") + assetToJson(usdtIdStr, walletBorrowInUsd)) + ",\"price\":") + assetToJson(usdtIdStr, price)) + ",\"apy\":") + amountToDecimal(borrowApy, 8)) + ",\"dailyPercents\":") + assetToJson(assetIdStr, walletDailyLoanInterest)) + ",\"dailyPercentsInUsd\":") + assetToJson(usdtIdStr, walletDailyLoanInterestInUsd)) + "}")
719719 $Tuple2((accum._1 :+ supplyAssetsJson), (accum._2 :+ borrowAssetsJson))
720720 }
721721
722- let $t03690536991 = {
722+ let $t03693537021 = {
723723 let $l = arr12
724724 let $s = size($l)
725725 let $acc0 = $Tuple2(nil, nil)
726726 func $f1_1 ($a,$i) = if (($i >= $s))
727727 then $a
728728 else walletAssetsFold($a, $l[$i])
729729
730730 func $f1_2 ($a,$i) = if (($i >= $s))
731731 then $a
732732 else throw("List size exceeds 12")
733733
734734 $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($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12)
735735 }
736- let supplyAssetsJson = $t03690536991._1
737- let borrowAssetsJson = $t03690536991._2
736+ let supplyAssetsJson = $t03693537021._1
737+ let borrowAssetsJson = $t03693537021._2
738738 if ((marketIndex == next))
739739 then $Tuple15((accum._1 + totalWalletSupplyInUsd), (accum._2 + totalWalletBorrowInUsd), (accum._3 + totalWalletBadDebtInUsd), (accum._4 + totalWalletDailyIncomeInUsd), (accum._5 + totalWalletDailyLoanInterestInUsd), totalWalletSupplyInUsd, totalWalletBorrowInUsd, totalWalletBadDebtInUsd, totalWalletDailyIncomeInUsd, totalWalletDailyLoanInterestInUsd, accountHealth, netApy, (accum._13 :+ marketsJson), supplyAssetsJson, borrowAssetsJson)
740740 else $Tuple15((accum._1 + totalWalletSupplyInUsd), (accum._2 + totalWalletBorrowInUsd), (accum._3 + totalWalletBadDebtInUsd), (accum._4 + totalWalletDailyIncomeInUsd), (accum._5 + totalWalletDailyLoanInterestInUsd), accum._6, accum._7, accum._8, accum._9, accum._10, accum._11, accum._12, (accum._13 :+ marketsJson), accum._14, accum._15)
741741 }
742742
743- let $t03844838932 = {
743+ let $t03847838962 = {
744744 let $l = arr12
745745 let $s = size($l)
746746 let $acc0 = $Tuple15(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, nil, nil, nil)
747747 func $f0_1 ($a,$i) = if (($i >= $s))
748748 then $a
749749 else marketsFold($a, $l[$i])
750750
751751 func $f0_2 ($a,$i) = if (($i >= $s))
752752 then $a
753753 else throw("List size exceeds 12")
754754
755755 $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)
756756 }
757- let totalWalletSupplyInUsd = $t03844838932._1
758- let totalWalletBorrowInUsd = $t03844838932._2
759- let totalWalletBadDebtInUsd = $t03844838932._3
760- let totalWalletDailyIncomeInUsd = $t03844838932._4
761- let totalWalletDailyLoanInterestInUsd = $t03844838932._5
762- let walletSupplyInUsd = $t03844838932._6
763- let walletBorrowInUsd = $t03844838932._7
764- let walletBadDebtInUsd = $t03844838932._8
765- let walletDailyIncomeInUsd = $t03844838932._9
766- let walletDailyLoanInterestInUsd = $t03844838932._10
767- let walletAccountHealth = $t03844838932._11
768- let walletNetApy = $t03844838932._12
769- let marketsJson = $t03844838932._13
770- let supplyAssetsJson = $t03844838932._14
771- let borrowAssetsJson = $t03844838932._15
757+ let totalWalletSupplyInUsd = $t03847838962._1
758+ let totalWalletBorrowInUsd = $t03847838962._2
759+ let totalWalletBadDebtInUsd = $t03847838962._3
760+ let totalWalletDailyIncomeInUsd = $t03847838962._4
761+ let totalWalletDailyLoanInterestInUsd = $t03847838962._5
762+ let walletSupplyInUsd = $t03847838962._6
763+ let walletBorrowInUsd = $t03847838962._7
764+ let walletBadDebtInUsd = $t03847838962._8
765+ let walletDailyIncomeInUsd = $t03847838962._9
766+ let walletDailyLoanInterestInUsd = $t03847838962._10
767+ let walletAccountHealth = $t03847838962._11
768+ let walletNetApy = $t03847838962._12
769+ let marketsJson = $t03847838962._13
770+ let supplyAssetsJson = $t03847838962._14
771+ let borrowAssetsJson = $t03847838962._15
772772 let json = ((((((((((((((((((((((((((((((((((((((("{" + "\"marketIndex\":") + toString(marketIndex)) + ",\"name\":\"") + marketName) + "\"") + ",\"totalSupplyInUsd\":") + assetToJson(usdtIdStr, totalWalletSupplyInUsd)) + ",\"totalBorrowInUsd\":") + assetToJson(usdtIdStr, totalWalletBorrowInUsd)) + ",\"totalBadDebtInUsd\":") + assetToJson(usdtIdStr, totalWalletBadDebtInUsd)) + ",\"totalDailyIncomeInUsd\":") + assetToJson(usdtIdStr, totalWalletDailyIncomeInUsd)) + ",\"totalDailyLoanInterestInUsd\":") + assetToJson(usdtIdStr, totalWalletDailyLoanInterestInUsd)) + ",\"supplyInUsd\":") + assetToJson(usdtIdStr, walletSupplyInUsd)) + ",\"borrowInUsd\":") + assetToJson(usdtIdStr, walletBorrowInUsd)) + ",\"badDebtInUsd\":") + assetToJson(usdtIdStr, walletBadDebtInUsd)) + ",\"dailyIncomeInUsd\":") + assetToJson(usdtIdStr, walletDailyIncomeInUsd)) + ",\"dailyLoanInterestInUsd\":") + assetToJson(usdtIdStr, walletDailyLoanInterestInUsd)) + ",\"accountHealth\":") + amountToDecimal(walletAccountHealth, 8)) + ",\"netApy\":") + amountToDecimal(walletNetApy, 8)) + ",\"supplyAssets\":[") + makeString_11C(supplyAssetsJson, ",")) + "]") + ",\"borrowAssets\":[") + makeString_11C(borrowAssetsJson, ",")) + "]") + ",\"markets\":[") + makeString_11C(marketsJson, ",")) + "]") + "}")
773773 if (debug)
774774 then throw(json)
775775 else json
776776 }
777777
778778
779779 func getWalletOperationsJson (marketIndex,assetIdStr,wallet,debug) = {
780780 let marketStr = getStringValue(("market_" + toString(marketIndex)))
781781 let marketAddress = addressFromStringValue(marketStr)
782782 let marketName = getStringValue(("market_name_" + marketStr))
783783 let active = valueOrElse(getBoolean(marketAddress, "setup_active"), true)
784784 let setupTokens = getSetupTokens(marketAddress)
785- let setupCf = split(getStringValue(marketAddress, "setup_ltvs"), ",")
786- let setupLt = split(getStringValue(marketAddress, "setup_lts"), ",")
787- let setupPenalty = split(getStringValue(marketAddress, "setup_penalties"), ",")
785+ let setupCf = split_4C(getStringValue(marketAddress, "setup_ltvs"), ",")
786+ let setupLt = split_4C(getStringValue(marketAddress, "setup_lts"), ",")
787+ let setupPenalty = split_4C(getStringValue(marketAddress, "setup_penalties"), ",")
788788 let assetIndex = getAssetIndex(setupTokens, assetIdStr)
789789 let cf = parseIntValue(setupCf[assetIndex])
790790 let lt = parseIntValue(setupLt[assetIndex])
791791 let penalty = parseIntValue(setupPenalty[assetIndex])
792792 let assetsCount = size(setupTokens)
793793 let lastRateHeight = getLastRateHeight(marketAddress)
794794 let price = getTokenPrice(marketAddress, assetIdStr)
795795 let assetScale = getAssetScale(assetIdStr)
796796 let outdatedTotalSupply = getOutdatedTotalSupply(marketAddress, assetIdStr)
797797 let outdatedTotalBorrow = getOutdatedTotalBorrow(marketAddress, assetIdStr)
798798 let outdatedSRate = getOutdatedSRate(marketAddress, assetIdStr)
799799 let outdatedBRate = getOutdatedBRate(marketAddress, assetIdStr)
800800 let outdatedUr = getOutdatedUr(outdatedTotalSupply, outdatedTotalBorrow, outdatedSRate, outdatedBRate)
801801 let rate = getRate(outdatedUr, assetIdStr, marketStr)
802802 let interest = getInterest(rate)
803803 let sRate = getActualSRate(lastRateHeight, interest, outdatedUr, outdatedSRate)
804804 let bRate = getActualBRate(lastRateHeight, interest, outdatedBRate)
805805 let supply = getActualAmount(outdatedTotalSupply, sRate)
806806 let borrow = getActualAmount(outdatedTotalBorrow, bRate)
807807 let supplyInUsd = getInUsd(supply, assetScale, price)
808808 let borrowInUsd = getInUsd(borrow, assetScale, price)
809809 let reserves = (supply - borrow)
810810 let reservesInUsd = getInUsd(reserves, assetScale, price)
811811 let ur = getActualUr(supply, borrow)
812812 let supplyApy = getSupplyApy(rate, ur)
813813 let borrowApy = getBorrowApy(rate)
814814 let maxSupply = getMaxSupply(marketAddress, assetIdStr)
815815 let walletSupply = getWalletSupply(marketAddress, assetIdStr, wallet, sRate)
816816 let walletSupplyInUsd = getInUsd(walletSupply, assetScale, price)
817817 let walletDailyIncome = getDailyPercents(supplyApy, walletSupply)
818818 let walletDailyIncomeInUsd = getInUsd(walletDailyIncome, assetScale, price)
819819 let walletBorrow = getWalletBorrow(marketAddress, assetIdStr, wallet, bRate)
820820 let walletBorrowInUsd = getInUsd(walletBorrow, assetScale, price)
821821 let walletDailyLoanPercents = getDailyPercents(borrowApy, walletBorrow)
822822 let walletDailyLoanPercentsInUsd = getInUsd(walletDailyLoanPercents, assetScale, price)
823823 func assetsFold (accum,next) = if ((next >= assetsCount))
824824 then accum
825825 else {
826826 let currentAssetIdStr = setupTokens[next]
827827 let currentCf = parseIntValue(setupCf[next])
828828 let currentLt = parseIntValue(setupLt[next])
829829 let currentPrice = getTokenPrice(marketAddress, currentAssetIdStr)
830830 let currentAssetScale = getAssetScale(currentAssetIdStr)
831831 let currentOutdatedTotalSupply = getOutdatedTotalSupply(marketAddress, currentAssetIdStr)
832832 let currentOutdatedTotalBorrow = getOutdatedTotalBorrow(marketAddress, currentAssetIdStr)
833833 let currentOutdatedSRate = getOutdatedSRate(marketAddress, currentAssetIdStr)
834834 let currentOutdatedBRate = getOutdatedBRate(marketAddress, currentAssetIdStr)
835835 let currentOutdatedUr = getOutdatedUr(currentOutdatedTotalSupply, currentOutdatedTotalBorrow, currentOutdatedSRate, currentOutdatedBRate)
836836 let currentRate = getRate(currentOutdatedUr, currentAssetIdStr, marketStr)
837837 let currentInterest = getInterest(currentRate)
838838 let currentSRate = getActualSRate(lastRateHeight, currentInterest, currentOutdatedUr, currentOutdatedSRate)
839839 let currentBRate = getActualBRate(lastRateHeight, currentInterest, currentOutdatedBRate)
840840 let currentSupply = getActualAmount(currentOutdatedTotalSupply, sRate)
841841 let currentBorrow = getActualAmount(currentOutdatedTotalBorrow, bRate)
842842 let currentUr = getActualUr(currentSupply, currentBorrow)
843843 let currentSupplyApy = getSupplyApy(currentRate, currentUr)
844844 let currentBorrowApy = getBorrowApy(currentRate)
845845 let currentWalletSupply = getWalletSupply(marketAddress, currentAssetIdStr, wallet, currentSRate)
846846 let currentWalletSupplyInUsd = getInUsd(currentWalletSupply, currentAssetScale, currentPrice)
847847 let currentWalletBorrow = getWalletBorrow(marketAddress, currentAssetIdStr, wallet, currentBRate)
848848 let currentWalletBorrowInUsd = getInUsd(currentWalletBorrow, currentAssetScale, currentPrice)
849849 let currentWalletBorrowLimitInUsd = fraction(currentWalletSupplyInUsd, currentCf, Scale8)
850850 let currentWalletBorrowUsageInUsd = fraction(currentWalletBorrowInUsd, Scale8, currentLt)
851851 let walletMarginInUsd = (fraction(currentWalletSupplyInUsd, currentSupplyApy, Scale8) - fraction(currentWalletBorrowInUsd, currentBorrowApy, Scale8))
852852 $Tuple5((accum._1 + currentWalletSupplyInUsd), (accum._2 + currentWalletBorrowInUsd), (accum._3 + currentWalletBorrowLimitInUsd), (accum._4 + currentWalletBorrowUsageInUsd), (accum._5 + walletMarginInUsd))
853853 }
854854
855- let $t04593446115 = {
855+ let $t04597346154 = {
856856 let $l = arr12
857857 let $s = size($l)
858858 let $acc0 = $Tuple5(0, 0, 0, 0, 0)
859859 func $f0_1 ($a,$i) = if (($i >= $s))
860860 then $a
861861 else assetsFold($a, $l[$i])
862862
863863 func $f0_2 ($a,$i) = if (($i >= $s))
864864 then $a
865865 else throw("List size exceeds 12")
866866
867867 $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)
868868 }
869- let totalWalletSupplyInUsd = $t04593446115._1
870- let totalWalletBorrowInUsd = $t04593446115._2
871- let totalWalletBorrowLimitInUsd = $t04593446115._3
872- let totalWalletBorrowUsageInUsd = $t04593446115._4
873- let totalWalletMarginInUsd = $t04593446115._5
869+ let totalWalletSupplyInUsd = $t04597346154._1
870+ let totalWalletBorrowInUsd = $t04597346154._2
871+ let totalWalletBorrowLimitInUsd = $t04597346154._3
872+ let totalWalletBorrowUsageInUsd = $t04597346154._4
873+ let totalWalletMarginInUsd = $t04597346154._5
874874 let accountHealth = getAccountHealth(totalWalletBorrowLimitInUsd, totalWalletBorrowUsageInUsd)
875875 let netApy = getNetApy(totalWalletSupplyInUsd, totalWalletBorrowInUsd, totalWalletMarginInUsd)
876876 let json = ((((((((((((((((((((((((((((((((((((((((((((((((((((((((("{" + "\"marketIndex\":") + toString(marketIndex)) + ",\"marketName\":\"") + marketName) + "\"") + ",\"address\":\"") + marketStr) + "\"") + ",\"assetPrice\":") + assetToJson(usdtIdStr, price)) + ",\"supply\":") + assetToJson(assetIdStr, supply)) + ",\"supplyInUsd\":") + assetToJson(usdtIdStr, supplyInUsd)) + ",\"supplyApy\":") + amountToDecimal(supplyApy, 8)) + ",\"borrow\":") + assetToJson(assetIdStr, borrow)) + ",\"borrowInUsd\":") + assetToJson(usdtIdStr, borrowInUsd)) + ",\"borrowApy\":") + amountToDecimal(borrowApy, 8)) + ",\"reserves\":") + assetToJson(assetIdStr, reserves)) + ",\"reservesInUsd\":") + assetToJson(usdtIdStr, reservesInUsd)) + ",\"utilizationRatio\":") + amountToDecimal(ur, 8)) + ",\"collateralFactor\":") + amountToDecimal(cf, 8)) + ",\"liquidationThreshold\":") + amountToDecimal(lt, 8)) + ",\"liquidationPenalty\":") + amountToDecimal(penalty, 8)) + ",\"maxSupply\":") + assetToJson(usdtIdStr, maxSupply)) + ",\"walletSupply\":") + assetToJson(assetIdStr, walletSupply)) + ",\"walletSupplyInUsd\":") + assetToJson(usdtIdStr, walletSupplyInUsd)) + ",\"walletDailyIncome\":") + assetToJson(assetIdStr, walletDailyIncome)) + ",\"walletDailyIncomeInUsd\":") + assetToJson(usdtIdStr, walletDailyIncomeInUsd)) + ",\"walletBorrow\":") + assetToJson(assetIdStr, walletBorrow)) + ",\"walletBorrowInUsd\":") + assetToJson(usdtIdStr, walletBorrowInUsd)) + ",\"walletDailyLoanInterest\":") + assetToJson(assetIdStr, walletDailyLoanPercents)) + ",\"walletDailyLoanInterestInUsd\":") + assetToJson(usdtIdStr, walletDailyLoanPercentsInUsd)) + ",\"accountHealth\":") + amountToDecimal(accountHealth, 8)) + ",\"netApy\":") + amountToDecimal(netApy, 8)) + "}")
877877 if (debug)
878878 then throw(json)
879879 else json
880880 }
881881
882882
883883 func getMarketParametersJson (marketIndex,debug) = {
884884 let marketStr = getStringValue(("market_" + toString(marketIndex)))
885885 let marketAddress = addressFromStringValue(marketStr)
886886 let marketName = getStringValue(("market_name_" + marketStr))
887887 let setupTokens = getSetupTokens(marketAddress)
888- let setupCf = split(getStringValue(marketAddress, "setup_ltvs"), ",")
889- let setupLt = split(getStringValue(marketAddress, "setup_lts"), ",")
890- let setupPenalty = split(getStringValue(marketAddress, "setup_penalties"), ",")
888+ let setupCf = split_4C(getStringValue(marketAddress, "setup_ltvs"), ",")
889+ let setupLt = split_4C(getStringValue(marketAddress, "setup_lts"), ",")
890+ let setupPenalty = split_4C(getStringValue(marketAddress, "setup_penalties"), ",")
891891 let assetsCount = size(setupTokens)
892892 func assetsFold (accum,next) = if ((next >= assetsCount))
893893 then accum
894894 else {
895895 let assetIdStr = setupTokens[next]
896896 let maxSupply = getMaxSupply(marketAddress, assetIdStr)
897897 let cf = parseIntValue(setupCf[next])
898898 let lt = parseIntValue(setupLt[next])
899899 let penalty = parseIntValue(setupPenalty[next])
900900 let json = ((((((((((("{" + "\"asset\":") + assetToJson(assetIdStr, 0)) + ",\"maxSupply\":") + assetToJson(usdtIdStr, maxSupply)) + ",\"collateralFactor\":") + amountToDecimal(cf, 8)) + ",\"liquidationThreshold\":") + amountToDecimal(lt, 8)) + ",\"liquidationPenalty\":") + amountToDecimal(penalty, 8)) + "}")
901901 (accum :+ json)
902902 }
903903
904904 let assetsJson = {
905905 let $l = arr12
906906 let $s = size($l)
907907 let $acc0 = nil
908908 func $f0_1 ($a,$i) = if (($i >= $s))
909909 then $a
910910 else assetsFold($a, $l[$i])
911911
912912 func $f0_2 ($a,$i) = if (($i >= $s))
913913 then $a
914914 else throw("List size exceeds 12")
915915
916916 $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)
917917 }
918918 let json = ((((((("{" + "\"name\":\"") + marketName) + "\"") + ",\"assets\":[") + makeString_11C(assetsJson, ",")) + "]") + "}")
919919 if (debug)
920920 then throw(json)
921921 else json
922922 }
923923
924924
925925

github/deemru/w8io/3ef1775 
142.28 ms