tx · 9Q7jABFJ1hQmkHTqpKBhqo3v29UyW2htECdoLMuF4JLd

3PHQvxHa4AzNtdKGrAFWwK31kGrETVi9TF5:  -0.05300000 Waves

2023.08.09 16:06 [3768716] smart account 3PHQvxHa4AzNtdKGrAFWwK31kGrETVi9TF5 > SELF 0.00000000 Waves

{ "type": 13, "id": "9Q7jABFJ1hQmkHTqpKBhqo3v29UyW2htECdoLMuF4JLd", "fee": 5300000, "feeAssetId": null, "timestamp": 1691586355135, "version": 2, "chainId": 87, "sender": "3PHQvxHa4AzNtdKGrAFWwK31kGrETVi9TF5", "senderPublicKey": "A45h4S2zgSVrcUAhaGU9uMFTiQjXYjrkLFSszSbjD1pG", "proofs": [ "2ikwRNnHW1SGMZN5DSt5HbwxRgrTAVQcpUpuf7sZKAQ2cvMKSaaKyGmjSHsfP7rVWiNXMXtrXtmA49XkgzVDhAm7" ], "script": "base64:BgLBAQgCEgMKAQgSAwoBCBIECgIICBIFCgMIGBgSBQoDCAEIEgQKAggBEgYKBAEICAESBQoDAQgIEg8KDQgICAgICAgICAgICAgSAwoBCBIDCgEIEgUKAwgIARIGCgQIAQgIEg0KCwgIAQQRGBgYAQEYEgkKBwgIAQQIARgSDQoLCAgBBBgYGBgYARgSBQoDCAQBEgsKCQgIAQEBAQEBBBIJCgcIAQEBAQEBEgASABIAEgASABIAEgASABIDCgEIEgMKAQiBAQAHU0ZfUE9PTAICU0YAB1dYX1BPT0wCAldYAA9DQVBfRkVFX05PX0xPQU4CCWNhcE5vTG9hbgAMQ0FQX0ZFRV9MT0FOAgdjYXBMb2FuABRTVE9QTE9TU19GRUVfTk9fTE9BTgIOc3RvcExvc3NOb0xvYW4ADVNUT1BMT1NTX0xPQU4CDHN0b3BMb3NzTG9hbgAITE9BTl9GRUUCBGxvYW4AC05PX0xPQU5fRkVFAgZub0xvYW4ABk5PX0ZFRQIFbm9GZWUABlNDQUxFOACAwtcvAAdTQ0FMRTEwAIDIr6AlAAdTQ0FMRTE2CQC2AgEAgICE/qbe4REACkZFRV9TQ0FMRTYAwIQ9ABRrU0ZQb29sQUFzc2V0QmFsYW5jZQIPQV9hc3NldF9iYWxhbmNlABRrU0ZQb29sQkFzc2V0QmFsYW5jZQIPQl9hc3NldF9iYWxhbmNlAA9rU0ZQb29sQUFzc2V0SWQCCkFfYXNzZXRfaWQAD2tTRlBvb2xCQXNzZXRJZAIKQl9hc3NldF9pZAAOa1NGUG9vbFNoYXJlSWQCDnNoYXJlX2Fzc2V0X2lkABJrU0ZQb29sU2hhcmVTdXBwbHkCEnNoYXJlX2Fzc2V0X3N1cHBseQAKa1NGUG9vbEZlZQIKY29tbWlzc2lvbgANa1VzZXJQb3NpdGlvbgINX3VzZXJQb3NpdGlvbgARa1VzZXJQb3NpdGlvblBvb2wCEV91c2VyUG9zaXRpb25Qb29sABFrVXNlckJvcnJvd0Ftb3VudAIZX3VzZXJQb3NpdGlvbkJvcnJvd0Ftb3VudAASa1VzZXJCb3Jyb3dBc3NldElkAhpfdXNlclBvc2l0aW9uQm9ycm93QXNzZXRJZAAQa1VzZXJQb3NpdGlvbk51bQITX3VzZXJQb3NpdGlvbk51bWJlcgAVa1VzZXJQb3NpdGlvbkludGVyZXN0AhVfdXNlclBvc2l0aW9uSW50ZXJlc3QACmtQb29sVG90YWwCCl9wb29sVG90YWwADmtQb29sVG90YWxMb2FuAg5fcG9vbFRvdGFsTG9hbgARa1Bvb2xJbnRlcmVzdExvYW4CEV9wb29sSW50ZXJlc3RMb2FuABNrUG9vbEludGVyZXN0Tm9Mb2FuAhNfcG9vbEludGVyZXN0Tm9Mb2FuAA5rUG9vbENhbkJvcnJvdwIOX3Bvb2xDYW5Cb3Jyb3cAFWtBeGx5SW5GZWVXaXRob3V0TG9hbgIOX2F4bHlGZWVOb0xvYW4AEmtBeGx5SW5GZWVXaXRoTG9hbgIQX2F4bHlGZWVXaXRoTG9hbgARa0F4bHlOb0xvYW5DYXBGZWUCEV9heGx5RmVlQ2FwTm9Mb2FuABNrQXhseVdpdGhMb2FuQ2FwRmVlAhNfYXhseUZlZUNhcFdpdGhMb2FuABZrQXhseVN0b3BMb3NzTm9Mb2FuRmVlAhhfYXhseUZlZVN0b3Bsb3NzV2l0aExvYW4AFGtBeGx5U3RvcExvc3NMb2FuRmVlAhZfYXhseUZlZVN0b3Bsb3NzTm9Mb2FuAAprUmVxdWVzdElkAgtfcmVxdWVzdF9pZAAMa1JlcXVlc3RJdGVyAg1yZXF1ZXN0c19pdGVyAAVrUG9vbAIFcG9vbF8ACmtTaGFyZVBvb2wCDF9wb29sU2hhcmVJZAAOa1Bvb2xDYXBDaGFuZ2UCDl9wb29sQ2FwQ2hhbmdlAA9rVG9rZW5MYXN0UHJpY2UCCmxhc3RfcHJpY2UADmtQcmljZUluT3JhY2xlAgdfdHdhcDVCAAdrQWN0aXZlAgZhY3RpdmUADGtBY3RpdmVVc2VycwILYWN0aXZlVXNlcnMAC2tBY3RpdmVTRldYAgdfYWN0aXZlAAtrUG9vbEFjdGl2ZQILX2FjdGl2ZVBvb2wADWtVc2VyU3RvcExvc3MCCV9zdG9wTG9zcwAJa01vbmV5Qm94Ag5heGx5X21vbmV5X2JveAAOa1NGRmFybWluZ0FkZHICE3N3b3BmaV9mYXJtaW5nX2FkZHIADGtMZW5kU2VydmljZQIRbGVuZF9zZXJ2aWNlX2FkZHIAD2tPcGVyYXRvckNhbGxQSwISYWRtaW5fY2FsbF9wdWJfa2V5AAxrUHJpY2VPcmFjbGUCDHByaWNlX29yYWNsZQALa0V4Q29udHJhY3QCEWV4Y2hhbmdlX2NvbnRyYWN0AA9rV3hTd2FwQ29udHJhY3QCEHd4X3N3YXBfY29udHJhY3QAB2tTd29wSWQCB3N3b3BfaWQABWtXeElkAgV3eF9pZAAPa0dyb3VwMUFkbWluMVBLAhVncm91cDFfYWRtaW4xX3B1Yl9rZXkAD2tHcm91cDFBZG1pbjJQSwIVZ3JvdXAxX2FkbWluMl9wdWJfa2V5AA9rR3JvdXAyQWRtaW4xUEsCFWdyb3VwMl9hZG1pbjFfcHViX2tleQAPa0dyb3VwMkFkbWluMlBLAhVncm91cDJfYWRtaW4yX3B1Yl9rZXkACG1vbmV5Qm94CQEHQWRkcmVzcwEJANkEAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMFCWtNb25leUJveAIYTm8gYXhseSBtb25leUJveCBhZGRyZXNzAApleENvbnRyYWN0CQEHQWRkcmVzcwEJANkEAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMFC2tFeENvbnRyYWN0AhxObyBleGNoYW5nZSBjb250cmFjdCBhZGRyZXNzAA9wcmljZU9yYWNsZUFkZHIJAQdBZGRyZXNzAQkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwUMa1ByaWNlT3JhY2xlAhdObyBwcmljZSBvcmFjbGUgYWRkcmVzcwAOd3hTd2FwQ29udHJhY3QJAQdBZGRyZXNzAQkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwUPa1d4U3dhcENvbnRyYWN0AhJObyB3eCBzd2FwIGFkZHJlc3MABlNXT1BJRAkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwUHa1N3b3BJZAIKTm8gc3dvcCBpZAAEV1hJRAkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwUFa1d4SWQCCE5vIHd4IGlkAA5ncm91cDFBZG1pbjFQSwkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwUPa0dyb3VwMUFkbWluMVBLAhlDYW4ndCBnZXQga0dyb3VwMUFkbWluMVBLAA5ncm91cDFBZG1pbjJQSwkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwUPa0dyb3VwMUFkbWluMlBLAhlDYW4ndCBnZXQga0dyb3VwMUFkbWluMlBLAA5ncm91cDJBZG1pbjFQSwkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwUPa0dyb3VwMkFkbWluMVBLAhlDYW4ndCBnZXQga0dyb3VwMkFkbWluMVBLAA5ncm91cDJBZG1pbjJQSwkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwUPa0dyb3VwMkFkbWluMlBLAhlDYW4ndCBnZXQga0dyb3VwMkFkbWluMVBLAApvcGVyYXRvclBLCQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzBQ9rT3BlcmF0b3JDYWxsUEsCFENhbid0IGdldCBvcGVyYXRvclBLAQ91bmtub3duUG9vbFR5cGUACQACAQIPV3JvbmcgcG9vbCB0eXBlAQ5nZXRMZW5kU3J2QWRkcgAJAQdBZGRyZXNzAQkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwUMa0xlbmRTZXJ2aWNlAhtDYW4ndCBnZXQgbGVuZCBzZXJ2aWNlIGFkZHIBDmlzT3BlcmF0b3JDYWxsAQFpBQR1bml0AQtpc0FkbWluQ2FsbAEBaQUEdW5pdAEKaXNTZWxmQ2FsbAEBaQMJAAACCAUBaQZjYWxsZXIFBHRoaXMFBHVuaXQJAAIBAitPbmx5IGNvbnRyYWN0IGl0c2VsZiBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uAQppc0xhbmRDYWxsAQFpAwkAAAIIBQFpBmNhbGxlcgkBDmdldExlbmRTcnZBZGRyAAUEdW5pdAkAAgECKU9ubHkgbGFuZCBjb250cmFjdCBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uAQhpc0FjdGl2ZQADCQAAAgkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzBQdrQWN0aXZlBgYFBHVuaXQJAAIBAh9EQXBwIGlzIGluYWN0aXZlIGF0IHRoaXMgbW9tZW50ARBpc0FjdGl2ZUZvclVzZXJzAAMDCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMFB2tBY3RpdmUGCQAAAgkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzBQxrQWN0aXZlVXNlcnMGBgcFBHVuaXQJAAIBAilEQXBwIGlzIGluYWN0aXZlIGZvciB1c2VycyBhdCB0aGlzIG1vbWVudAEMaXNQb29sQWN0aXZlAgRwb29sBHR5cGUECldYU0ZBY3RpdmUJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwkArAICBQR0eXBlBQtrQWN0aXZlU0ZXWAYECnBvb2xBY3RpdmUJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwkArAICBQRwb29sBQtrUG9vbEFjdGl2ZQYDAwUKV1hTRkFjdGl2ZQUKcG9vbEFjdGl2ZQcGBwEOYWNjb3VudEJhbGFuY2UBB2Fzc2V0SWQEByRtYXRjaDAFB2Fzc2V0SWQDCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQCaWQFByRtYXRjaDAJAPAHAgUEdGhpcwUCaWQDCQABAgUHJG1hdGNoMAIEVW5pdAQFd2F2ZXMFByRtYXRjaDAICQDvBwEFBHRoaXMJYXZhaWxhYmxlCQACAQILTWF0Y2ggZXJyb3IBEWdldFNGUG9vbEJhbGFuY2VzAQhwb29sQWRkcgkAlAoCCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUIcG9vbEFkZHIFFGtTRlBvb2xBQXNzZXRCYWxhbmNlAh5DYW4ndCBnZXQgcG9vbCBBIGFzc2V0IGJhbGFuY2UJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQhwb29sQWRkcgUUa1NGUG9vbEJBc3NldEJhbGFuY2UCHkNhbid0IGdldCBwb29sIEIgYXNzZXQgYmFsYW5jZQERZ2V0V1hQb29sQmFsYW5jZXMDCHBvb2xBZGRyA2FJZANiSWQJAJQKAgoAAUAJAPwHBAUIcG9vbEFkZHICHGdldEFjY0JhbGFuY2VXcmFwcGVyUkVBRE9OTFkJAMwIAgUDYUlkBQNuaWwFA25pbAMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQKAAFACQD8BwQFCHBvb2xBZGRyAhxnZXRBY2NCYWxhbmNlV3JhcHBlclJFQURPTkxZCQDMCAIFA2JJZAUDbmlsBQNuaWwDCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50AQ9nZXRQb29sQmFsYW5jZXMECHBvb2xBZGRyBHR5cGUDYUlkA2JJZAMJAAACBQR0eXBlBQdTRl9QT09MCQERZ2V0U0ZQb29sQmFsYW5jZXMBBQhwb29sQWRkcgMJAAACBQR0eXBlBQdXWF9QT09MCQERZ2V0V1hQb29sQmFsYW5jZXMDBQhwb29sQWRkcgUDYUlkBQNiSWQJAQ91bmtub3duUG9vbFR5cGUAAQ1nZXRTRlBvb2xEYXRhAQhwb29sQWRkcgQLJHQwNzY1Mzc3MDIJARFnZXRTRlBvb2xCYWxhbmNlcwEFCHBvb2xBZGRyAwkAAAIFCyR0MDc2NTM3NzAyBQskdDA3NjUzNzcwMgQEYmFsQggFCyR0MDc2NTM3NzAyAl8yBARiYWxBCAULJHQwNzY1Mzc3MDICXzEJAJcKBQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFCHBvb2xBZGRyBQ9rU0ZQb29sQUFzc2V0SWQCGUNhbid0IGdldCBwb29sIEEgYXNzZXQgaWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQhwb29sQWRkcgUPa1NGUG9vbEJBc3NldElkAhlDYW4ndCBnZXQgcG9vbCBCIGFzc2V0IGlkBQRiYWxBBQRiYWxCCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUIcG9vbEFkZHIFDmtTRlBvb2xTaGFyZUlkAhhDYW4ndCBnZXQgc2hhcmUgYXNzZXQgaWQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BDWdldFdYUG9vbERhdGEBCHBvb2xBZGRyBANjZmcKAAFACQD8BwQFCHBvb2xBZGRyAhxnZXRQb29sQ29uZmlnV3JhcHBlclJFQURPTkxZBQNuaWwFA25pbAMJAAECBQFAAglMaXN0W0FueV0FAUAJAAIBCQCsAgIJAAMBBQFAAh4gY291bGRuJ3QgYmUgY2FzdCB0byBMaXN0W0FueV0DCQAAAgUDY2ZnBQNjZmcEA2FJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCgABQAkAkQMCBQNjZmcABAMJAAECBQFAAgZTdHJpbmcFAUAFBHVuaXQCGUNhbid0IGdldCBwb29sIEEgYXNzZXQgaWQEA2JJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCgABQAkAkQMCBQNjZmcABQMJAAECBQFAAgZTdHJpbmcFAUAFBHVuaXQCGUNhbid0IGdldCBwb29sIEIgYXNzZXQgaWQEB3NoYXJlSWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgoAAUAJAJEDAgUDY2ZnAAMDCQABAgUBQAIGU3RyaW5nBQFABQR1bml0AhpDYW4ndCBnZXQgcG9vbCBMUCBhc3NldCBpZAQLJHQwODM5OTg0NTgJARFnZXRXWFBvb2xCYWxhbmNlcwMFCHBvb2xBZGRyBQNhSWQFA2JJZAMJAAACBQskdDA4Mzk5ODQ1OAULJHQwODM5OTg0NTgEBGJhbEIIBQskdDA4Mzk5ODQ1OAJfMgQEYmFsQQgFCyR0MDgzOTk4NDU4Al8xCQCXCgUFA2FJZAUDYklkBQRiYWxBBQRiYWxCBQdzaGFyZUlkCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQtnZXRQb29sRGF0YQIIcG9vbEFkZHIEdHlwZQMJAAACBQR0eXBlBQdTRl9QT09MCQENZ2V0U0ZQb29sRGF0YQEFCHBvb2xBZGRyAwkAAAIFBHR5cGUFB1dYX1BPT0wJAQ1nZXRXWFBvb2xEYXRhAQUIcG9vbEFkZHIJAQ91bmtub3duUG9vbFR5cGUAAQ5nZXRTaGFyZVN1cHBseQMIcG9vbEFkZHIEdHlwZQdzaGFyZUlkAwkAAAIFBHR5cGUFB1NGX1BPT0wJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQhwb29sQWRkcgUSa1NGUG9vbFNoYXJlU3VwcGx5AhxDYW4ndCBnZXQgc2hhcmUgYXNzZXQgc3VwcGx5AwkAAAIFBHR5cGUFB1dYX1BPT0wICQETdmFsdWVPckVycm9yTWVzc2FnZQIJAOwHAQkA2QQBBQdzaGFyZUlkAg1Xcm9uZyBTaGFyZUlkCHF1YW50aXR5CQEPdW5rbm93blBvb2xUeXBlAAERZ2V0UG9vbFRvdGFsU2hhcmUBBHBvb2wJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBQprUG9vbFRvdGFsAAABGWdldFBvb2xUb3RhbFNoYXJlV2l0aExvYW4BBHBvb2wJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBQ5rUG9vbFRvdGFsTG9hbgAAARhnZXROZXdVc2VyUG9zaXRpb25OdW1iZXIBBHVzZXIJAGQCCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEdXNlcgUQa1VzZXJQb3NpdGlvbk51bQAAAAEBCmdldEF4bHlGZWUCBHBvb2wHZmVlVHlwZQMJAAACBQdmZWVUeXBlBQxDQVBfRkVFX0xPQU4JARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgUEcG9vbAUTa0F4bHlXaXRoTG9hbkNhcEZlZQMJAAACBQdmZWVUeXBlBQ9DQVBfRkVFX05PX0xPQU4JARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgUEcG9vbAURa0F4bHlOb0xvYW5DYXBGZWUDCQAAAgUHZmVlVHlwZQUITE9BTl9GRUUJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgUEcG9vbAUSa0F4bHlJbkZlZVdpdGhMb2FuAwkAAAIFB2ZlZVR5cGUFC05PX0xPQU5fRkVFCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIFBHBvb2wFFWtBeGx5SW5GZWVXaXRob3V0TG9hbgMJAAACBQdmZWVUeXBlBQZOT19GRUUAAAkAAgECDldyb25nIGZlZSB0eXBlARBnZXRTRkZhcm1pbmdBZGRyAAkBB0FkZHJlc3MBCQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzBQ5rU0ZGYXJtaW5nQWRkcgIdQ2FuJ3QgZ2V0IHN3b3BmaSBmYXJtaW5nIGFkZHIBEGdldFdYRmFybWluZ0FkZHIBCHBvb2xBZGRyBAlmQ29udHJhY3QJAQdBZGRyZXNzAQkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUIcG9vbEFkZHICEyVzX19mYWN0b3J5Q29udHJhY3QCIkNhbid0IGdldCBXWCBmYWN0b3J5IGNvbnRyYWN0IGFkZHIECmZhY3Ryb3lDZmcJALUJAgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFCWZDb250cmFjdAIRJXNfX2ZhY3RvcnlDb25maWcCGENhbid0IGdldCBXWCBmYWN0b3J5IGNmZwICX18JAQdBZGRyZXNzAQkA2QQBCQCRAwIFCmZhY3Ryb3lDZmcAAQEMYXNzZXRJZFRvU3RyAQdhc3NldElkBAckbWF0Y2gwBQdhc3NldElkAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAmlkBQckbWF0Y2gwCQDYBAEFAmlkAwkAAQIFByRtYXRjaDACBFVuaXQEBXdhdmVzBQckbWF0Y2gwAgVXQVZFUwkAAgECDE5vdCBBc3NldCBpZAEOYXNzZXRJZEZyb21TdHIBB2Fzc2V0SWQDCQAAAgUHYXNzZXRJZAIFV0FWRVMFBHVuaXQJANkEAQUHYXNzZXRJZAEQZ2V0QXNzZXREZWNpbWFscwEHYXNzZXRJZAMJAAACBQdhc3NldElkAgVXQVZFUwAIBAckbWF0Y2gwCQDsBwEJANkEAQUHYXNzZXRJZAMJAAECBQckbWF0Y2gwAgVBc3NldAQFYXNzZXQFByRtYXRjaDAIBQVhc3NldAhkZWNpbWFscwkAAgECEENhbid0IGZpbmQgYXNzZXQBEWdldEFzc2V0UHJlY2l0aW9uAQdhc3NldElkCQBsBgAKAAAJARBnZXRBc3NldERlY2ltYWxzAQUHYXNzZXRJZAAAAAAFBERPV04BDmdldEFzc2V0c1ByaWNlAQhhc3NldElkcwoBCWdldFByaWNlcwIBYQdhc3NldElkBAphc3NldFByaWNlCQELdmFsdWVPckVsc2UCCQCaCAIFD3ByaWNlT3JhY2xlQWRkcgkArAICBQdhc3NldElkBQ5rUHJpY2VJbk9yYWNsZQD///////////8BCQDNCAIFAWEFCmFzc2V0UHJpY2UKAAIkbAUIYXNzZXRJZHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCWdldFByaWNlcwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgNTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUABUAFgAXABgAGQAaABsAHAAdAB4AHwAgACEAIgAjACQAJQAmACcAKAApACoAKwAsAC0ALgAvADAAMQAyAQ1nZXRTaGFyZVByaWNlAQdzaGFyZUlkBARwb29sCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICBQdzaGFyZUlkBQprU2hhcmVQb29sAiBDYW4ndCBmaW5kIHBvb2wgYWRkciBieSBzaGFyZSBpZAQIcG9vbEFkZHIJAQdBZGRyZXNzAQkA2QQBBQRwb29sBAVwVHlwZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgUFa1Bvb2wFBHBvb2wCElBvb2wgaXMgbm90IGluaXRlZAQNJHQwMTE0NDcxMTUxMgkBC2dldFBvb2xEYXRhAgUIcG9vbEFkZHIFBXBUeXBlBANhSWQIBQ0kdDAxMTQ0NzExNTEyAl8xBANiSWQIBQ0kdDAxMTQ0NzExNTEyAl8yBAhhQmFsYW5jZQgFDSR0MDExNDQ3MTE1MTICXzMECGJCYWxhbmNlCAUNJHQwMTE0NDcxMTUxMgJfNAQHZFByaWNlQQkBC3ZhbHVlT3JFbHNlAgkAmggCBQ9wcmljZU9yYWNsZUFkZHIJAKwCAgUDYUlkBQ5rUHJpY2VJbk9yYWNsZQD///////////8BBAdkUHJpY2VCCQELdmFsdWVPckVsc2UCCQCaCAIFD3ByaWNlT3JhY2xlQWRkcgkArAICBQNiSWQFDmtQcmljZUluT3JhY2xlAP///////////wEDAwkAZgIAAAUHZFByaWNlQQYJAGYCAAAFB2RQcmljZUIA////////////AQQLc2hhcmVTdXBwbHkJAQ5nZXRTaGFyZVN1cHBseQMFCHBvb2xBZGRyBQVwVHlwZQUHc2hhcmVJZAQKQVByZWNpc2lvbgkAbAYACgAACQEQZ2V0QXNzZXREZWNpbWFscwEFA2FJZAAAAAAFBERPV04ECkJQcmVjaXNpb24JAGwGAAoAAAkBEGdldEFzc2V0RGVjaW1hbHMBBQNiSWQAAAAABQRET1dOBA5zaGFyZVByZWNpc2lvbgkAbAYACgAACQEQZ2V0QXNzZXREZWNpbWFscwEFB3NoYXJlSWQAAAAABQRET1dOBANzdW0JAGQCCQBrAwUIYUJhbGFuY2UFB2RQcmljZUEFCkFQcmVjaXNpb24JAGsDBQhiQmFsYW5jZQUHZFByaWNlQgUKQlByZWNpc2lvbgkAawMFA3N1bQUOc2hhcmVQcmVjaXNpb24FC3NoYXJlU3VwcGx5AQ5nZXRTaGFyZVByaWNlcwEIc2hhcmVJZHMKAQlnZXRQcmljZXMCAWEHc2hhcmVJZAkAzQgCBQFhCQENZ2V0U2hhcmVQcmljZQEFB3NoYXJlSWQKAAIkbAUIc2hhcmVJZHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCWdldFByaWNlcwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMjAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUAQ5nZXRDdXJzRW50cmllcwQDYUlkA2JJZAdzaGFyZUlkCHdBbW91bnRzBAxhc3NldHNQcmljZXMJAQ5nZXRBc3NldHNQcmljZQEJAMwIAgUDYUlkCQDMCAIFA2JJZAUDbmlsBApzaGFyZVByaWNlCQENZ2V0U2hhcmVQcmljZQEFB3NoYXJlSWQEBnByaWNlcwkAzggCCQDMCAIJAKQDAQkAkQMCBQxhc3NldHNQcmljZXMAAAkAzAgCCQCkAwEJAJEDAgUMYXNzZXRzUHJpY2VzAAEJAMwIAgkApAMBBQpzaGFyZVByaWNlBQNuaWwFCHdBbW91bnRzCQDMCAIJAQtTdHJpbmdFbnRyeQIFD2tUb2tlbkxhc3RQcmljZQkAuQkCBQZwcmljZXMCASwFA25pbAEYY2FsY1JlcGxlbmlzaEJ5VHdvVG9rZW5zCAVwVHlwZQhwb29sQWRkcgRwbXRBA2FJZARwbXRCA2JJZARiYWxBBGJhbEIDCQAAAgUFcFR5cGUFB1NGX1BPT0wEBHJlcGwKAAFACQD8BwQFCHBvb2xBZGRyAgxjYWxsRnVuY3Rpb24JAMwIAgIgY2FsY0xQUmVwbGVuaXNoVHdvVG9rZW5zUkVBRE9OTFkJAMwIAgkAzAgCCQCkAwEFBHBtdEEJAMwIAgkApAMBBQRwbXRCBQNuaWwFA25pbAUDbmlsAwkAAQIFAUACCUxpc3RbQW55XQUBQAkAAgEJAKwCAgkAAwEFAUACHiBjb3VsZG4ndCBiZSBjYXN0IHRvIExpc3RbQW55XQMJAAACBQRyZXBsBQRyZXBsCQCXCgUKAAFACQCRAwIFBHJlcGwAAwMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQKAAFACQCRAwIFBHJlcGwABAMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQKAAFACQCRAwIFBHJlcGwAAQMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQJAQxhc3NldElkVG9TdHIBCQCRAwIFBHJlcGwAAgoAAUAJAJEDAgUEcmVwbAAAAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgMJAAACBQVwVHlwZQUHV1hfUE9PTAQNJHQwMTMxMjQxMzM3NAkAlAoCCQC1CQIKAAFACQD8BwQFCHBvb2xBZGRyAiBldmFsdWF0ZVB1dEJ5QW1vdW50QXNzZXRSRUFET05MWQkAzAgCBQRwbXRBBQNuaWwFA25pbAMJAAECBQFAAgZTdHJpbmcFAUAJAAIBCQCsAgIJAAMBBQFAAhsgY291bGRuJ3QgYmUgY2FzdCB0byBTdHJpbmcCAl9fCQC1CQIKAAFACQD8BwQFCHBvb2xBZGRyAh9ldmFsdWF0ZVB1dEJ5UHJpY2VBc3NldFJFQURPTkxZCQDMCAIFBHBtdEIFA25pbAUDbmlsAwkAAQIFAUACBlN0cmluZwUBQAkAAgEJAKwCAgkAAwEFAUACGyBjb3VsZG4ndCBiZSBjYXN0IHRvIFN0cmluZwICX18DCQAAAgUNJHQwMTMxMjQxMzM3NAUNJHQwMTMxMjQxMzM3NAQKZXZhbFB1dEluQggFDSR0MDEzMTI0MTMzNzQCXzIECmV2YWxQdXRJbkEIBQ0kdDAxMzEyNDEzMzc0Al8xBAVscEluQQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCmV2YWxQdXRJbkEAAQQFbHBJbkIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQpldmFsUHV0SW5CAAEDCQBmAgUFbHBJbkIFBWxwSW5BBANwbXQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQpldmFsUHV0SW5BAAgJAJcKBQUEcG10QQUDcG10CQBlAgUEcG10QgUDcG10BQNiSWQFBWxwSW5CBANwbXQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQpldmFsUHV0SW5CAAcJAJcKBQUDcG10BQRwbXRCCQBlAgUEcG10QQUDcG10BQNhSWQFBWxwSW5BCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQEPdW5rbm93blBvb2xUeXBlAAEYcmVwbGVuaXNoVHdvVG9rZW5zQnlUeXBlBghwb29sQWRkcgVwVHlwZQRwbXRBA2FJZARwbXRCA2JJZAQIcGF5bWVudHMJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQ5hc3NldElkRnJvbVN0cgEFA2FJZAUEcG10QQkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBDmFzc2V0SWRGcm9tU3RyAQUDYklkBQRwbXRCBQNuaWwDCQAAAgUFcFR5cGUFB1NGX1BPT0wJAPwHBAUIcG9vbEFkZHICDGNhbGxGdW5jdGlvbgkAzAgCAhZyZXBsZW5pc2hXaXRoVHdvVG9rZW5zCQDMCAIJAMwIAgIFZmFsc2UJAMwIAgIBMAUDbmlsBQNuaWwFCHBheW1lbnRzAwkAAAIFBXBUeXBlBQdXWF9QT09MCQD8BwQFCHBvb2xBZGRyAgNwdXQJAMwIAgDAhD0JAMwIAgcFA25pbAUIcGF5bWVudHMJAQ91bmtub3duUG9vbFR5cGUAARdyZXBsZW5pc2hPbmVUb2tlbkJ5VHlwZQQIcG9vbEFkZHIFcFR5cGUDcG10BXBtdElkBAhwYXltZW50cwkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBDmFzc2V0SWRGcm9tU3RyAQUFcG10SWQFA3BtdAUDbmlsAwkAAAIFBXBUeXBlBQdTRl9QT09MCQD8BwQFCHBvb2xBZGRyAgxjYWxsRnVuY3Rpb24JAMwIAgIVcmVwbGVuaXNoV2l0aE9uZVRva2VuCQDMCAIJAMwIAgIBMAkAzAgCAgVmYWxzZQkAzAgCAgEwBQNuaWwFA25pbAUIcGF5bWVudHMDCQAAAgUFcFR5cGUFB1dYX1BPT0wJAPwHBAUIcG9vbEFkZHICCXB1dE9uZVRrbgkAzAgCAAAJAMwIAgcFA25pbAUIcGF5bWVudHMJAQ91bmtub3duUG9vbFR5cGUAAQdzdGFrZUxQBARwb29sBXBUeXBlB3NoYXJlSWQGYW1vdW50BAhwYXltZW50cwkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkA2QQBBQdzaGFyZUlkBQZhbW91bnQFA25pbAMJAAACBQVwVHlwZQUHU0ZfUE9PTAkA/AcECQEQZ2V0U0ZGYXJtaW5nQWRkcgACD2xvY2tTaGFyZVRva2VucwkAzAgCBQRwb29sCQDMCAIAAAUDbmlsBQhwYXltZW50cwMJAAACBQVwVHlwZQUHV1hfUE9PTAkA/AcECQEQZ2V0V1hGYXJtaW5nQWRkcgEJARFAZXh0ck5hdGl2ZSgxMDYyKQEFBHBvb2wCBXN0YWtlBQNuaWwFCHBheW1lbnRzCQEPdW5rbm93blBvb2xUeXBlAAEJdW5zdGFrZUxQBARwb29sBXBUeXBlB3NoYXJlSWQGYW1vdW50BA0kdDAxNTAzMzE1MzgzAwkAAAIFBXBUeXBlBQdTRl9QT09MCQCVCgMJARBnZXRTRkZhcm1pbmdBZGRyAAITd2l0aGRyYXdTaGFyZVRva2VucwkAzAgCBQRwb29sCQDMCAIFBmFtb3VudAUDbmlsAwkAAAIFBXBUeXBlBQdXWF9QT09MCQCVCgMJARBnZXRXWEZhcm1pbmdBZGRyAQkBB0FkZHJlc3MBCQDZBAEFBHBvb2wCB3Vuc3Rha2UJAMwIAgUHc2hhcmVJZAkAzAgCBQZhbW91bnQFA25pbAkBD3Vua25vd25Qb29sVHlwZQAECGZhcm1BZGRyCAUNJHQwMTUwMzMxNTM4MwJfMQQFZk5hbWUIBQ0kdDAxNTAzMzE1MzgzAl8yBAZwYXJhbXMIBQ0kdDAxNTAzMzE1MzgzAl8zBANpbnYJAPwHBAUIZmFybUFkZHIFBWZOYW1lBQZwYXJhbXMFA25pbAMJAAACBQNpbnYFA2ludgUGYW1vdW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuARFjYWxjQW1vdW50VG9QYXlTRgcEcG9vbAhhc3NldElkQQhhc3NldElkQgRiYWxBBGJhbEIQYW1vdW50VG9rZW5Ub0dldA9hc3NldFRva2VuVG9HZXQECHBvb2xBZGRyCQEHQWRkcmVzcwEJANkEAQUEcG9vbAQJZmVlU2NhbGU2AMCEPQQDZmVlCQERQGV4dHJOYXRpdmUoMTA1MCkCBQhwb29sQWRkcgUKa1NGUG9vbEZlZQQMYW1udEdldE5vRmVlCQBuBAUQYW1vdW50VG9rZW5Ub0dldAUJZmVlU2NhbGU2CQBlAgUJZmVlU2NhbGU2BQNmZWUFB0NFSUxJTkcEDSR0MDE1ODA1MTYxMTEDCQAAAgUPYXNzZXRUb2tlblRvR2V0BQhhc3NldElkQQQLYW1vdW50VG9QYXkJAG4EBQxhbW50R2V0Tm9GZWUFBGJhbEIJAGUCBQRiYWxBBQxhbW50R2V0Tm9GZWUFB0NFSUxJTkcJAJQKAgULYW1vdW50VG9QYXkFCGFzc2V0SWRCBAthbW91bnRUb1BheQkAbgQFDGFtbnRHZXROb0ZlZQUEYmFsQQkAZQIFBGJhbEIFDGFtbnRHZXROb0ZlZQUHQ0VJTElORwkAlAoCBQthbW91bnRUb1BheQUIYXNzZXRJZEEEC2Ftb3VudFRvUGF5CAUNJHQwMTU4MDUxNjExMQJfMQQKYXNzZXRUb1BheQgFDSR0MDE1ODA1MTYxMTECXzIJAJQKAgUKYXNzZXRUb1BheQULYW1vdW50VG9QYXkBDWdldFdYU3dhcEZlZXMBBHBvb2wECHBvb2xBZGRyCQERQGV4dHJOYXRpdmUoMTA2MikBBQRwb29sBAlmQ29udHJhY3QJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQhwb29sQWRkcgITJXNfX2ZhY3RvcnlDb250cmFjdAIiQ2FuJ3QgZ2V0IFdYIGZhY3RvcnkgY29udHJhY3QgYWRkcgQOcG9vbEZlZURlZmF1bHQJAQV2YWx1ZQEJAJoIAgUOd3hTd2FwQ29udHJhY3QCCyVzX19wb29sRmVlBBJwcm90b2NvbEZlZURlZmF1bHQJAQV2YWx1ZQEJAJoIAgUOd3hTd2FwQ29udHJhY3QCDyVzX19wcm90b2NvbEZlZQQHJG1hdGNoMAkA/AcEBQlmQ29udHJhY3QCEmdldFN3YXBGZWVSRUFET05MWQkAzAgCCQClCAEFCHBvb2xBZGRyBQNuaWwFA25pbAMJAAECBQckbWF0Y2gwAgooSW50LCBJbnQpBARmZWVzBQckbWF0Y2gwCQCUCgIIBQRmZWVzAl8xCAUEZmVlcwJfMgkAlAoCBQ5wb29sRmVlRGVmYXVsdAUScHJvdG9jb2xGZWVEZWZhdWx0ARFjYWxjQW1vdW50VG9QYXlXWAcEcG9vbAhhc3NldElkQQhhc3NldElkQgRiYWxBBGJhbEIQYW1vdW50VG9rZW5Ub0dldA9hc3NldFRva2VuVG9HZXQEDSR0MDE2ODUxMTY4OTAJAQ1nZXRXWFN3YXBGZWVzAQUEcG9vbAQEcEZlZQgFDSR0MDE2ODUxMTY4OTACXzEEBXByRmVlCAUNJHQwMTY4NTExNjg5MAJfMgQIZmVlU2NhbGUJALYCAQCAwtcvBA0kdDAxNjkzMDE3MjM4AwkAAAIFD2Fzc2V0VG9rZW5Ub0dldAUIYXNzZXRJZEEEC2Ftb3VudFRvUGF5CQBrAwUQYW1vdW50VG9rZW5Ub0dldAUEYmFsQgkAZQIFBGJhbEEFEGFtb3VudFRva2VuVG9HZXQJAJQKAgULYW1vdW50VG9QYXkFCGFzc2V0SWRCBAthbW91bnRUb1BheQkAawMFEGFtb3VudFRva2VuVG9HZXQFBGJhbEEJAGUCBQRiYWxCBRBhbW91bnRUb2tlblRvR2V0CQCUCgIFC2Ftb3VudFRvUGF5BQhhc3NldElkQQQLYW1vdW50VG9QYXkIBQ0kdDAxNjkzMDE3MjM4Al8xBAphc3NldFRvUGF5CAUNJHQwMTY5MzAxNzIzOAJfMgQSYW1vdW50VG9QYXlXaXRoRmVlCQCgAwEJAL0CBAkAtgIBBQthbW91bnRUb1BheQUIZmVlU2NhbGUJALgCAgUIZmVlU2NhbGUJALYCAQkAZAIFBXByRmVlBQRwRmVlBQdDRUlMSU5HCQCUCgIFCmFzc2V0VG9QYXkFEmFtb3VudFRvUGF5V2l0aEZlZQEQZXhjaGFuZ2VEaXJlY3RseQgFcFR5cGUEcG9vbAhhc3NldElkQQhhc3NldElkQgRiYWxBBGJhbEIQYW1vdW50VG9rZW5Ub0dldA9hc3NldFRva2VuVG9HZXQDCQAAAgUFcFR5cGUFB1NGX1BPT0wEDSR0MDE3NTg1MTc3MDcJARFjYWxjQW1vdW50VG9QYXlTRgcFBHBvb2wFCGFzc2V0SWRBBQhhc3NldElkQgUEYmFsQQUEYmFsQgUQYW1vdW50VG9rZW5Ub0dldAUPYXNzZXRUb2tlblRvR2V0BAphc3NldFRvUGF5CAUNJHQwMTc1ODUxNzcwNwJfMQQLYW1vdW50VG9QYXkIBQ0kdDAxNzU4NTE3NzA3Al8yCQD8BwQJARFAZXh0ck5hdGl2ZSgxMDYyKQEFBHBvb2wCDGNhbGxGdW5jdGlvbgkAzAgCAghleGNoYW5nZQkAzAgCCQDMCAIJAKQDAQUQYW1vdW50VG9rZW5Ub0dldAUDbmlsBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQ5hc3NldElkRnJvbVN0cgEFCmFzc2V0VG9QYXkFC2Ftb3VudFRvUGF5BQNuaWwDCQAAAgUFcFR5cGUFB1dYX1BPT0wEDSR0MDE3OTA3MTgwMjkJARFjYWxjQW1vdW50VG9QYXlXWAcFBHBvb2wFCGFzc2V0SWRBBQhhc3NldElkQgUEYmFsQQUEYmFsQgUQYW1vdW50VG9rZW5Ub0dldAUPYXNzZXRUb2tlblRvR2V0BAphc3NldFRvUGF5CAUNJHQwMTc5MDcxODAyOQJfMQQLYW1vdW50VG9QYXkIBQ0kdDAxNzkwNzE4MDI5Al8yCQD8BwQFDnd4U3dhcENvbnRyYWN0AgRzd2FwCQDMCAIFEGFtb3VudFRva2VuVG9HZXQJAMwIAgUPYXNzZXRUb2tlblRvR2V0CQDMCAIJAKUIAQUEdGhpcwUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEOYXNzZXRJZEZyb21TdHIBBQphc3NldFRvUGF5BQthbW91bnRUb1BheQUDbmlsCQEPdW5rbm93blBvb2xUeXBlAAEaY2FsY1dpdGhkcmF3TFBGcm9tUG9vbFZpcnQECHBvb2xBZGRyBXBUeXBlB3NoYXJlSWQPdXNlckNhbldpdGhkcmF3BA0kdDAxODMxNjE4NzgwAwkAAAIFBXBUeXBlBQdTRl9QT09MBANpbnYKAAFACQD8BwQFCHBvb2xBZGRyAgxjYWxsRnVuY3Rpb24JAMwIAgIQd2l0aGRyYXdSRUFET05MWQkAzAgCCQDMCAIJAKQDAQUPdXNlckNhbldpdGhkcmF3BQNuaWwFA25pbAUDbmlsAwkAAQIFAUACCUxpc3RbQW55XQUBQAkAAgEJAKwCAgkAAwEFAUACHiBjb3VsZG4ndCBiZSBjYXN0IHRvIExpc3RbQW55XQMJAAACBQNpbnYFA2ludgkAlAoCCgABQAkAkQMCBQNpbnYAAAMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQKAAFACQCRAwIFA2ludgABAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgMJAAACBQVwVHlwZQUHV1hfUE9PTAQDaW52CQC1CQIKAAFACQD8BwQFCHBvb2xBZGRyAhNldmFsdWF0ZUdldFJFQURPTkxZCQDMCAIFB3NoYXJlSWQJAMwIAgUPdXNlckNhbldpdGhkcmF3BQNuaWwFA25pbAMJAAECBQFAAgZTdHJpbmcFAUAJAAIBCQCsAgIJAAMBBQFAAhsgY291bGRuJ3QgYmUgY2FzdCB0byBTdHJpbmcCAl9fAwkAAAIFA2ludgUDaW52CQCUCgIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQNpbnYAAQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFA2ludgACCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQEPdW5rbm93blBvb2xUeXBlAAQHYW1vdW50QQgFDSR0MDE4MzE2MTg3ODACXzEEB2Ftb3VudEIIBQ0kdDAxODMxNjE4NzgwAl8yCQCUCgIFB2Ftb3VudEEFB2Ftb3VudEIBC2NsYWltRmFybWVkAgVwVHlwZQRwb29sAwkAAAIFBXBUeXBlBQdTRl9QT09MBAliYWxCZWZvcmUJAQ5hY2NvdW50QmFsYW5jZQEFBlNXT1BJRAMJAAACBQliYWxCZWZvcmUFCWJhbEJlZm9yZQQDaW52CQD8BwQJARBnZXRTRkZhcm1pbmdBZGRyAAIFY2xhaW0JAMwIAgUEcG9vbAUDbmlsBQNuaWwDCQAAAgUDaW52BQNpbnYECGJhbEFmdGVyCQEOYWNjb3VudEJhbGFuY2UBBQZTV09QSUQJAJQKAgkAZQIFCGJhbEFmdGVyBQliYWxCZWZvcmUFBlNXT1BJRAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgMJAAACBQVwVHlwZQUHV1hfUE9PTAQNJHQwMTkxNDgxOTIyNwkBDWdldFdYUG9vbERhdGEBCQERQGV4dHJOYXRpdmUoMTA2MikBBQRwb29sBANhSWQIBQ0kdDAxOTE0ODE5MjI3Al8xBANiSWQIBQ0kdDAxOTE0ODE5MjI3Al8yBARhQmFsCAUNJHQwMTkxNDgxOTIyNwJfMwQEYkJhbAgFDSR0MDE5MTQ4MTkyMjcCXzQEBGxwSWQIBQ0kdDAxOTE0ODE5MjI3Al81BAliYWxCZWZvcmUJAQ5hY2NvdW50QmFsYW5jZQEFBFdYSUQDCQAAAgUJYmFsQmVmb3JlBQliYWxCZWZvcmUEA2ludgkA/AcECQEQZ2V0V1hGYXJtaW5nQWRkcgEJARFAZXh0ck5hdGl2ZSgxMDYyKQEFBHBvb2wCB2NsYWltV3gJAMwIAgUEbHBJZAUDbmlsBQNuaWwDCQAAAgUDaW52BQNpbnYECGJhbEFmdGVyCQEOYWNjb3VudEJhbGFuY2UBBQRXWElECQCUCgIJAGUCBQhiYWxBZnRlcgUJYmFsQmVmb3JlBQRXWElECQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQEPdW5rbm93blBvb2xUeXBlAAEPcmVwbGVuaXNoQnlUeXBlCgVwVHlwZQRwb29sB2ZlZVR5cGUEcG10QQNhSWQEcG10QgNiSWQEYmFsQQRiYWxCBExQSWQED2xwQmFsYW5jZUJlZm9yZQkBDmFjY291bnRCYWxhbmNlAQkA2QQBBQRMUElkAwkAAAIFD2xwQmFsYW5jZUJlZm9yZQUPbHBCYWxhbmNlQmVmb3JlBAhwb29sQWRkcgkBEUBleHRyTmF0aXZlKDEwNjIpAQUEcG9vbAQNJHQwMTk4MjUyMDI0MQMDCQBmAgUEcG10QQAACQBmAgUEcG10QgAABwQNJHQwMTk4OTEyMDAwNwkBGGNhbGNSZXBsZW5pc2hCeVR3b1Rva2VucwgFBXBUeXBlBQhwb29sQWRkcgUEcG10QQUDYUlkBQRwbXRCBQNiSWQFBGJhbEEFBGJhbEIEBnBtdEluQQgFDSR0MDE5ODkxMjAwMDcCXzEEBnBtdEluQggFDSR0MDE5ODkxMjAwMDcCXzIEBmNoYW5nZQgFDSR0MDE5ODkxMjAwMDcCXzMECGNoYW5nZUlkCAUNJHQwMTk4OTEyMDAwNwJfNAQDaW52CQEYcmVwbGVuaXNoVHdvVG9rZW5zQnlUeXBlBgUIcG9vbEFkZHIFBXBUeXBlBQZwbXRJbkEFA2FJZAUGcG10SW5CBQNiSWQDCQAAAgUDaW52BQNpbnYJAJQKAgUGY2hhbmdlBQhjaGFuZ2VJZAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgMJAGYCBQRwbXRBAAAJAJQKAgUEcG10QQUDYUlkAwkAZgIFBHBtdEIAAAkAlAoCBQRwbXRCBQNiSWQJAAIBAhBwbXRzIG11c3QgYmUgPiAwBAZjaGFuZ2UIBQ0kdDAxOTgyNTIwMjQxAl8xBAhjaGFuZ2VJZAgFDSR0MDE5ODI1MjAyNDECXzIEA2ludgMJAGYCBQZjaGFuZ2UAAAkBF3JlcGxlbmlzaE9uZVRva2VuQnlUeXBlBAUIcG9vbEFkZHIFBXBUeXBlBQZjaGFuZ2UFCGNoYW5nZUlkBQNuaWwDCQAAAgUDaW52BQNpbnYEDmxwQmFsYW5jZUFmdGVyCQEOYWNjb3VudEJhbGFuY2UBCQDZBAEFBExQSWQEC3RvdGFsU3Rha2VkCQBlAgUObHBCYWxhbmNlQWZ0ZXIFD2xwQmFsYW5jZUJlZm9yZQQNYXhseUZlZUFtb3VudAkAawMFC3RvdGFsU3Rha2VkCQEKZ2V0QXhseUZlZQIFBHBvb2wFB2ZlZVR5cGUFCkZFRV9TQ0FMRTYEEXVzZXJTaGFyZUZvclN0YWtlCQBlAgULdG90YWxTdGFrZWQFDWF4bHlGZWVBbW91bnQDCQBnAgAABRF1c2VyU2hhcmVGb3JTdGFrZQkAAgECKGFtb3VudCBvZiBzdGFrZWQgc2hhcmV0b2tlbnMgbXVzdCBiZSA+IDAEBWludkxQCQEHc3Rha2VMUAQFBHBvb2wFBXBUeXBlBQRMUElkBRF1c2VyU2hhcmVGb3JTdGFrZQMJAAACBQVpbnZMUAUFaW52TFAJAJQKAgURdXNlclNoYXJlRm9yU3Rha2UFDWF4bHlGZWVBbW91bnQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BEHJlcGxlbmlzaEVudHJpZXMIBHBvb2wEdXNlcgxzdGFrZWRBbW91bnQNYXhseUZlZUFtb3VudAZwb3NOdW0Hc2hhcmVJZAR0eXBlCHdpdGhMb2FuBAt0b3RhbEFtb3VudAkBEWdldFBvb2xUb3RhbFNoYXJlAQUEcG9vbAQPdG90YWxBbW91bnRMb2FuCQEZZ2V0UG9vbFRvdGFsU2hhcmVXaXRoTG9hbgEFBHBvb2wEDSR0MDIxMDk4MjEzMzYDBQh3aXRoTG9hbgkAlAoCCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIFBHBvb2wFEWtQb29sSW50ZXJlc3RMb2FuCQBkAgUPdG90YWxBbW91bnRMb2FuBQxzdGFrZWRBbW91bnQJAJQKAgkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICBQRwb29sBRNrUG9vbEludGVyZXN0Tm9Mb2FuBQ90b3RhbEFtb3VudExvYW4ED2N1clBvb2xJbnRlcmVzdAgFDSR0MDIxMDk4MjEzMzYCXzEEE3RvdGFsU3Rha2VkV2l0aExvYW4IBQ0kdDAyMTA5ODIxMzM2Al8yCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFCmtQb29sVG90YWwJAGQCBQt0b3RhbEFtb3VudAUMc3Rha2VkQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFDmtQb29sVG90YWxMb2FuBRN0b3RhbFN0YWtlZFdpdGhMb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwkApAMBBQZwb3NOdW0FDWtVc2VyUG9zaXRpb24FDHN0YWtlZEFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8JAKQDAQUGcG9zTnVtBRVrVXNlclBvc2l0aW9uSW50ZXJlc3QFD2N1clBvb2xJbnRlcmVzdAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkArAICBQR1c2VyAgFfCQCkAwEFBnBvc051bQURa1VzZXJQb3NpdGlvblBvb2wFBHBvb2wJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEdXNlcgUQa1VzZXJQb3NpdGlvbk51bQUGcG9zTnVtCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFCG1vbmV5Qm94BQ1heGx5RmVlQW1vdW50CQDZBAEFB3NoYXJlSWQFA25pbAEOZXhjaGFuZ2VLZWVwZXIKB3RvVG9rZW4JcG10QW1vdW50CHBtdEFzc2V0CWFtb3VudHNJbglhZGRyZXNzZXMPYXNzZXRzVG9SZWNlaXZlC2VzdFJlY2VpdmVkEXNsaXBwYWdlVG9sZXJhbmNlC21pblJlY2VpdmVkB29wdGlvbnMEEnRva2VuQmFsYW5jZUJlZm9yZQkBDmFjY291bnRCYWxhbmNlAQkBDmFzc2V0SWRGcm9tU3RyAQUHdG9Ub2tlbgMJAAACBRJ0b2tlbkJhbGFuY2VCZWZvcmUFEnRva2VuQmFsYW5jZUJlZm9yZQQDaW52CQD8BwQFCmV4Q29udHJhY3QCBHN3YXAJAMwIAgUJYW1vdW50c0luCQDMCAIFCWFkZHJlc3NlcwkAzAgCBQ9hc3NldHNUb1JlY2VpdmUJAMwIAgULZXN0UmVjZWl2ZWQJAMwIAgURc2xpcHBhZ2VUb2xlcmFuY2UJAMwIAgULbWluUmVjZWl2ZWQJAMwIAgUHb3B0aW9ucwUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQhwbXRBc3NldAUJcG10QW1vdW50BQNuaWwDCQAAAgUDaW52BQNpbnYJAGUCCQEOYWNjb3VudEJhbGFuY2UBCQEOYXNzZXRJZEZyb21TdHIBBQd0b1Rva2VuBRJ0b2tlbkJhbGFuY2VCZWZvcmUJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BDmV4Y2hhbmdlUHV6emxlBgd0b1Rva2VuCXBtdEFtb3VudAhwbXRBc3NldAlyb3V0ZXNTdHIMbWluVG9SZWNlaXZlB29wdGlvbnMEEnRva2VuQmFsYW5jZUJlZm9yZQkBDmFjY291bnRCYWxhbmNlAQkBDmFzc2V0SWRGcm9tU3RyAQUHdG9Ub2tlbgMJAAACBRJ0b2tlbkJhbGFuY2VCZWZvcmUFEnRva2VuQmFsYW5jZUJlZm9yZQQDaW52CQD8BwQFCmV4Q29udHJhY3QCCnB1enpsZVN3YXAJAMwIAgUJcm91dGVzU3RyCQDMCAIFDG1pblRvUmVjZWl2ZQkAzAgCBQdvcHRpb25zBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFCHBtdEFzc2V0BQlwbXRBbW91bnQFA25pbAMJAAACBQNpbnYFA2ludgkAZQIJAQ5hY2NvdW50QmFsYW5jZQEJAQ5hc3NldElkRnJvbVN0cgEFB3RvVG9rZW4FEnRva2VuQmFsYW5jZUJlZm9yZQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEOZXhjaGFuZ2VTd29wRmkKB3RvVG9rZW4JcG10QW1vdW50CHBtdEFzc2V0CmV4Y2hhbmdlcnMOZXhjaGFuZ2Vyc1R5cGUFYXJnczEFYXJnczIRcm91dGluZ0Fzc2V0c0tleXMSbWluQW1vdW50VG9SZWNlaXZlB29wdGlvbnMEEnRva2VuQmFsYW5jZUJlZm9yZQkBDmFjY291bnRCYWxhbmNlAQkBDmFzc2V0SWRGcm9tU3RyAQUHdG9Ub2tlbgMJAAACBRJ0b2tlbkJhbGFuY2VCZWZvcmUFEnRva2VuQmFsYW5jZUJlZm9yZQQDaW52CQD8BwQFCmV4Q29udHJhY3QCCnN3b3BmaVN3YXAJAMwIAgUKZXhjaGFuZ2VycwkAzAgCBQ5leGNoYW5nZXJzVHlwZQkAzAgCBQVhcmdzMQkAzAgCBQVhcmdzMgkAzAgCBRFyb3V0aW5nQXNzZXRzS2V5cwkAzAgCBRJtaW5BbW91bnRUb1JlY2VpdmUJAMwIAgUHb3B0aW9ucwUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQhwbXRBc3NldAUJcG10QW1vdW50BQNuaWwDCQAAAgUDaW52BQNpbnYJAGUCCQEOYWNjb3VudEJhbGFuY2UBCQEOYXNzZXRJZEZyb21TdHIBBQd0b1Rva2VuBRJ0b2tlbkJhbGFuY2VCZWZvcmUJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BCmNhcGl0YWxpemUEBHBvb2wFcFR5cGUHdG9rZW5JZAt0b2tlbkFtb3VudAQIcG9vbEFkZHIJAQdBZGRyZXNzAQkA2QQBBQRwb29sBA0kdDAyMzY5MDIzNzU2CQELZ2V0UG9vbERhdGECBQhwb29sQWRkcgUFcFR5cGUEA0FJZAgFDSR0MDIzNjkwMjM3NTYCXzEEA0JJZAgFDSR0MDIzNjkwMjM3NTYCXzIEBGJhbEEIBQ0kdDAyMzY5MDIzNzU2Al8zBARiYWxCCAUNJHQwMjM2OTAyMzc1NgJfNAQHc2hhcmVJZAgFDSR0MDIzNjkwMjM3NTYCXzUDAwkBAiE9AgUHdG9rZW5JZAUDQUlkCQECIT0CBQd0b2tlbklkBQNCSWQHCQACAQILV3JvbmcgYXNzZXQEEHRvdGFsU2hhcmVBbW91bnQJARFnZXRQb29sVG90YWxTaGFyZQEFBHBvb2wEGHRvdGFsU2hhcmVBbW91bnRXaXRoTG9hbgkBGWdldFBvb2xUb3RhbFNoYXJlV2l0aExvYW4BBQRwb29sBAtsb2FuUGVyY2VudAkAawMFGHRvdGFsU2hhcmVBbW91bnRXaXRoTG9hbgUGU0NBTEU4BRB0b3RhbFNoYXJlQW1vdW50BBB0b2tlbnNGb3JGZWVMb2FuCQBrAwULdG9rZW5BbW91bnQFC2xvYW5QZXJjZW50BQZTQ0FMRTgEEnRva2Vuc0ZvckZlZU5vTG9hbgkAZQIFC3Rva2VuQW1vdW50BRB0b2tlbnNGb3JGZWVMb2FuBAtheGx5RmVlTG9hbgkAawMFEHRva2Vuc0ZvckZlZUxvYW4JAQpnZXRBeGx5RmVlAgUEcG9vbAUMQ0FQX0ZFRV9MT0FOBQpGRUVfU0NBTEU2BA1heGx5RmVlTm9Mb2FuCQBrAwUSdG9rZW5zRm9yRmVlTm9Mb2FuCQEKZ2V0QXhseUZlZQIFBHBvb2wFD0NBUF9GRUVfTk9fTE9BTgUKRkVFX1NDQUxFNgQHYXhseUZlZQkAZAIFC2F4bHlGZWVMb2FuBQ1heGx5RmVlTm9Mb2FuBA0kdDAyNDM5NjI0NDk2AwkAAAIFB3Rva2VuSWQFA0FJZAkAlAoCCQBlAgULdG9rZW5BbW91bnQFB2F4bHlGZWUAAAkAlAoCAAAJAGUCBQt0b2tlbkFtb3VudAUHYXhseUZlZQQEcG10QQgFDSR0MDI0Mzk2MjQ0OTYCXzEEBHBtdEIIBQ0kdDAyNDM5NjI0NDk2Al8yBA0kdDAyNDQ5OTI0NjAzCQEPcmVwbGVuaXNoQnlUeXBlCgUFcFR5cGUFBHBvb2wFBk5PX0ZFRQUEcG10QQUDQUlkBQRwbXRCBQNCSWQFBGJhbEEFBGJhbEIFB3NoYXJlSWQEDHN0YWtlZEFtb3VudAgFDSR0MDI0NDk5MjQ2MDMCXzEEAm5mCAUNJHQwMjQ0OTkyNDYwMwJfMgQTY3VyUG9vbEludGVyZXN0TG9hbgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHBvb2wFEWtQb29sSW50ZXJlc3RMb2FuAAAEFWN1clBvb2xJbnRlcmVzdE5vTG9hbgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHBvb2wFE2tQb29sSW50ZXJlc3ROb0xvYW4AAAQKc3Rha2VkTG9hbgkAawMFDHN0YWtlZEFtb3VudAULbG9hblBlcmNlbnQFBlNDQUxFOAQMc3Rha2VkTm9Mb2FuCQBlAgUMc3Rha2VkQW1vdW50BQpzdGFrZWRMb2FuBA9uZXdJbnRlcmVzdExvYW4DCQBmAgUYdG90YWxTaGFyZUFtb3VudFdpdGhMb2FuAAAJAGQCBRNjdXJQb29sSW50ZXJlc3RMb2FuCQBrAwUKc3Rha2VkTG9hbgUHU0NBTEUxMAUYdG90YWxTaGFyZUFtb3VudFdpdGhMb2FuAAAEEW5ld0ludGVyZXN0Tm9Mb2FuAwkAZgIJAGUCBRB0b3RhbFNoYXJlQW1vdW50BRh0b3RhbFNoYXJlQW1vdW50V2l0aExvYW4AAAkAZAIFFWN1clBvb2xJbnRlcmVzdE5vTG9hbgkAawMFDHN0YWtlZE5vTG9hbgUHU0NBTEUxMAkAZQIFEHRvdGFsU2hhcmVBbW91bnQFGHRvdGFsU2hhcmVBbW91bnRXaXRoTG9hbgAACQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAURa1Bvb2xJbnRlcmVzdExvYW4FD25ld0ludGVyZXN0TG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBRNrUG9vbEludGVyZXN0Tm9Mb2FuBRFuZXdJbnRlcmVzdE5vTG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBQprUG9vbFRvdGFsCQBkAgUQdG90YWxTaGFyZUFtb3VudAUMc3Rha2VkQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFDmtQb29sVG90YWxMb2FuCQBkAgUYdG90YWxTaGFyZUFtb3VudFdpdGhMb2FuBQpzdGFrZWRMb2FuCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFCG1vbmV5Qm94BQdheGx5RmVlCQDZBAEFB3Rva2VuSWQFA25pbAkBDmdldEN1cnNFbnRyaWVzBAUDQUlkBQNCSWQFB3NoYXJlSWQFA25pbAEYdXNlckNhbldpdGhkcmF3U2hhcmVDYWxjBAR1c2VyBHBvb2wFcG9zSWQIYm9ycm93ZWQEB3BBbW91bnQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUFcG9zSWQFDWtVc2VyUG9zaXRpb24CEFVua25vd24gcG9zaXRpb24EDHVzZXJJbnRlcmVzdAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBRVrVXNlclBvc2l0aW9uSW50ZXJlc3QEDHBvb2xJbnRlcmVzdAMFCGJvcnJvd2VkCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIFBHBvb2wFEWtQb29sSW50ZXJlc3RMb2FuCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIFBHBvb2wFE2tQb29sSW50ZXJlc3ROb0xvYW4JAGQCBQdwQW1vdW50CQBrAwUHcEFtb3VudAkAZQIFDHBvb2xJbnRlcmVzdAUMdXNlckludGVyZXN0BQdTQ0FMRTEwAQ9jYWxjU3RvcExvc3NGZWUEBHBvb2wKaXNCb3Jyb3dlZAhzdG9wTG9zcwpscFdpdGhkcmF3BAdmZWVUeXBlAwUKaXNCb3Jyb3dlZAUNU1RPUExPU1NfTE9BTgUUU1RPUExPU1NfRkVFX05PX0xPQU4DBQhzdG9wTG9zcwkAawMFCmxwV2l0aGRyYXcJAQpnZXRBeGx5RmVlAgUEcG9vbAUHZmVlVHlwZQUKRkVFX1NDQUxFNgAAAQ53aXRoZHJhd1RvVXNlcgQEdXNlcgRwb29sBXBvc0lkCHN0b3BMb3NzBAdwQW1vdW50CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBQ1rVXNlclBvc2l0aW9uAhBVbmtub3duIHBvc2l0aW9uBAppc0JvcnJvd2VkCQBmAgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUFcG9zSWQFEWtVc2VyQm9ycm93QW1vdW50AAAAAAQPdXNlckNhbldpdGhkcmF3CQEYdXNlckNhbldpdGhkcmF3U2hhcmVDYWxjBAUEdXNlcgUEcG9vbAUFcG9zSWQFCmlzQm9ycm93ZWQEDnBvb2xUb3RhbFNoYXJlCQERZ2V0UG9vbFRvdGFsU2hhcmUBBQRwb29sBBJwb29sVG90YWxTaGFyZUxvYW4JARlnZXRQb29sVG90YWxTaGFyZVdpdGhMb2FuAQUEcG9vbAQIdXNlckFkZHIJAQdBZGRyZXNzAQkA2QQBBQR1c2VyBAhwb29sQWRkcgkBB0FkZHJlc3MBCQDZBAEFBHBvb2wEBXBUeXBlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICBQVrUG9vbAUEcG9vbAIMVW5rbm93biBwb29sBA0kdDAyNzEzNDI3MjA2CQELZ2V0UG9vbERhdGECBQhwb29sQWRkcgUFcFR5cGUEBmlkQVN0cggFDSR0MDI3MTM0MjcyMDYCXzEEBmlkQlN0cggFDSR0MDI3MTM0MjcyMDYCXzIEBGJhbEEIBQ0kdDAyNzEzNDI3MjA2Al8zBARiYWxCCAUNJHQwMjcxMzQyNzIwNgJfNAQHc2hhcmVJZAgFDSR0MDI3MTM0MjcyMDYCXzUEDSR0MDI3MjA5MjcyNzYJAJQKAgkBDmFzc2V0SWRGcm9tU3RyAQUGaWRBU3RyCQEOYXNzZXRJZEZyb21TdHIBBQZpZEJTdHIEA2lkQQgFDSR0MDI3MjA5MjcyNzYCXzEEA2lkQggFDSR0MDI3MjA5MjcyNzYCXzIEC3N0b3BMb3NzRmVlCQEPY2FsY1N0b3BMb3NzRmVlBAUEcG9vbAUKaXNCb3Jyb3dlZAUIc3RvcExvc3MFD3VzZXJDYW5XaXRoZHJhdwQLY0JhbEFCZWZvcmUJAQ5hY2NvdW50QmFsYW5jZQEFA2lkQQMJAAACBQtjQmFsQUJlZm9yZQULY0JhbEFCZWZvcmUEC2NCYWxCQmVmb3JlCQEOYWNjb3VudEJhbGFuY2UBBQNpZEIDCQAAAgULY0JhbEJCZWZvcmUFC2NCYWxCQmVmb3JlBANpbnYDCQAAAgUFcFR5cGUFB1NGX1BPT0wEA2ludgkBCXVuc3Rha2VMUAQFBHBvb2wFBXBUeXBlBQdzaGFyZUlkBQtzdG9wTG9zc0ZlZQMJAAACBQNpbnYFA2ludgkA/AcEBQhwb29sQWRkcgIMY2FsbEZ1bmN0aW9uCQDMCAICCHdpdGhkcmF3CQDMCAIJAMwIAgkApAMBBQ91c2VyQ2FuV2l0aGRyYXcFA25pbAUDbmlsBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4DCQAAAgUFcFR5cGUFB1dYX1BPT0wEA2ludgkBCXVuc3Rha2VMUAQFBHBvb2wFBXBUeXBlBQdzaGFyZUlkCQBkAgUPdXNlckNhbldpdGhkcmF3BQtzdG9wTG9zc0ZlZQMJAAACBQNpbnYFA2ludgkA/AcEBQhwb29sQWRkcgIDZ2V0BQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQ5hc3NldElkRnJvbVN0cgEFB3NoYXJlSWQFD3VzZXJDYW5XaXRoZHJhdwUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQEPdW5rbm93blBvb2xUeXBlAAMJAAACBQNpbnYFA2ludgQKY0JhbEFBZnRlcgkBDmFjY291bnRCYWxhbmNlAQUDaWRBAwkAAAIFCmNCYWxBQWZ0ZXIFCmNCYWxBQWZ0ZXIECmNCYWxCQWZ0ZXIJAQ5hY2NvdW50QmFsYW5jZQEFA2lkQgMJAAACBQpjQmFsQkFmdGVyBQpjQmFsQkFmdGVyBA0kdDAyNzk3MTI4MDYwCQCUCgIJAGUCBQpjQmFsQUFmdGVyBQtjQmFsQUJlZm9yZQkAZQIFCmNCYWxCQWZ0ZXIFC2NCYWxCQmVmb3JlBA10b2tlbnNBbW91bnRBCAUNJHQwMjc5NzEyODA2MAJfMQQNdG9rZW5zQW1vdW50QggFDSR0MDI3OTcxMjgwNjACXzIEDSR0MDI4MDYzMjkyOTkDBQppc0JvcnJvd2VkBAtib3Jyb3dBc3NldAkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBRJrVXNlckJvcnJvd0Fzc2V0SWQEBGRlYnQKAAFACQD8BwQJAQ5nZXRMZW5kU3J2QWRkcgACDGdldEFzc2V0RGVidAkAzAgCBwkAzAgCCQCsAgIJAKwCAgUEdXNlcgIBXwUFcG9zSWQJAMwIAgULYm9ycm93QXNzZXQFA25pbAUDbmlsAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAMJAAACBQRkZWJ0BQRkZWJ0BA1hbW91bnRUb0dldEV4AwMJAAACBQtib3Jyb3dBc3NldAUGaWRBU3RyCQBmAgUEZGVidAUNdG9rZW5zQW1vdW50QQcJAGUCBQRkZWJ0BQ10b2tlbnNBbW91bnRBAwMJAAACBQtib3Jyb3dBc3NldAUGaWRCU3RyCQBmAgUEZGVidAUNdG9rZW5zQW1vdW50QgcJAGUCBQRkZWJ0BQ10b2tlbnNBbW91bnRCAAAEBWV4SW52AwkAZgIFDWFtb3VudFRvR2V0RXgAAAkBEGV4Y2hhbmdlRGlyZWN0bHkIBQVwVHlwZQUEcG9vbAUGaWRBU3RyBQZpZEJTdHIJAGUCBQRiYWxBBQ10b2tlbnNBbW91bnRBCQBlAgUEYmFsQgUNdG9rZW5zQW1vdW50QgUNYW1vdW50VG9HZXRFeAULYm9ycm93QXNzZXQFA25pbAMJAAACBQVleEludgUFZXhJbnYED2NCYWxBQWZ0ZXJSZXBheQkBDmFjY291bnRCYWxhbmNlAQUDaWRBAwkAAAIFD2NCYWxBQWZ0ZXJSZXBheQUPY0JhbEFBZnRlclJlcGF5BA9jQmFsQkFmdGVyUmVwYXkJAQ5hY2NvdW50QmFsYW5jZQEFA2lkQgMJAAACBQ9jQmFsQkFmdGVyUmVwYXkFD2NCYWxCQWZ0ZXJSZXBheQQLY2xvc2VEYnRJbnYDCQBmAgUEZGVidAAACQD8BwQJAQ5nZXRMZW5kU3J2QWRkcgACCHJlcGF5Rm9yCQDMCAIJAKwCAgkArAICBQR1c2VyAgFfBQVwb3NJZAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEOYXNzZXRJZEZyb21TdHIBBQtib3Jyb3dBc3NldAUEZGVidAUDbmlsAAADCQAAAgULY2xvc2VEYnRJbnYFC2Nsb3NlRGJ0SW52AwkAAAIFC2JvcnJvd0Fzc2V0BQZpZEFTdHIJAJQKAgkAZQIJAGUCBQ9jQmFsQUFmdGVyUmVwYXkFC2NCYWxBQmVmb3JlBQRkZWJ0CQBlAgUPY0JhbEJBZnRlclJlcGF5BQtjQmFsQkJlZm9yZQkAlAoCCQBlAgUPY0JhbEFBZnRlclJlcGF5BQtjQmFsQUJlZm9yZQkAZQIJAGUCBQ9jQmFsQkFmdGVyUmVwYXkFC2NCYWxCQmVmb3JlBQRkZWJ0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQCUCgIFDXRva2Vuc0Ftb3VudEEFDXRva2Vuc0Ftb3VudEIEB3RvVXNlckEIBQ0kdDAyODA2MzI5Mjk5Al8xBAd0b1VzZXJCCAUNJHQwMjgwNjMyOTI5OQJfMgQUcG9vbFRvdGFsTG9hbkVudHJpZXMDBQppc0JvcnJvd2VkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFDmtQb29sVG90YWxMb2FuCQBlAgkAZQIFEnBvb2xUb3RhbFNoYXJlTG9hbgUPdXNlckNhbldpdGhkcmF3BQtzdG9wTG9zc0ZlZQUDbmlsBQNuaWwEB2VudHJpZXMJAM4IAgkAzggCCQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfBQVwb3NJZAUNa1VzZXJQb3NpdGlvbgkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgkArAICBQR1c2VyAgFfBQVwb3NJZAURa1VzZXJQb3NpdGlvblBvb2wJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBRFrVXNlckJvcnJvd0Ftb3VudAkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUFcG9zSWQFEmtVc2VyQm9ycm93QXNzZXRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUFcG9zSWQFFWtVc2VyUG9zaXRpb25JbnRlcmVzdAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBQprUG9vbFRvdGFsCQBlAgkAZQIFDnBvb2xUb3RhbFNoYXJlBQ91c2VyQ2FuV2l0aGRyYXcFC3N0b3BMb3NzRmVlCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFCHVzZXJBZGRyBQd0b1VzZXJBBQNpZEEJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUIdXNlckFkZHIFB3RvVXNlckIFA2lkQgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQhtb25leUJveAULc3RvcExvc3NGZWUJANkEAQUHc2hhcmVJZAUDbmlsBRRwb29sVG90YWxMb2FuRW50cmllcwkBDmdldEN1cnNFbnRyaWVzBAUGaWRBU3RyBQZpZEJTdHIFB3NoYXJlSWQFA25pbAkAlAoCBQdlbnRyaWVzCQDMCAIFB3RvVXNlckEJAMwIAgUHdG9Vc2VyQgUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQxwYXJzZVJlcXVlc3QBCXJlcXVlc3RJZAQHcmVxdWVzdAkAtQkCCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICBQlyZXF1ZXN0SWQFCmtSZXF1ZXN0SWQJAKwCAgITTm8gcmVxdWVzdCB3aXRoIGlkIAUJcmVxdWVzdElkAgEsBAR1c2VyCQCRAwIFB3JlcXVlc3QAAAQEcG9vbAkAkQMCBQdyZXF1ZXN0AAEEBHBtdEEJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdyZXF1ZXN0AAIEA0FJZAkAkQMCBQdyZXF1ZXN0AAMEBHBtdEIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdyZXF1ZXN0AAQEA0JJZAkAkQMCBQdyZXF1ZXN0AAUEBGJhbEEJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdyZXF1ZXN0AAYEBGJhbEIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdyZXF1ZXN0AAcEB3NoYXJlSWQJAJEDAgUHcmVxdWVzdAAIBAdid0Fzc2V0CQCRAwIFB3JlcXVlc3QACQQIYndBbW91bnQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdyZXF1ZXN0AAoJAJ0KCwUEdXNlcgUEcG9vbAUEcG10QQUDQUlkBQRwbXRCBQNCSWQFBGJhbEEFBGJhbEIFB3NoYXJlSWQFB2J3QXNzZXQFCGJ3QW1vdW50ARBjYWxjQm9ycm93QW1vdW50BgRwbXRBBHBtdEIDYUlkA2JJZAhsZXZlcmFnZQhib3Jyb3dJZAMDCQECIT0CBQhib3Jyb3dJZAUDYUlkCQECIT0CBQhib3Jyb3dJZAUDYklkBwkAAgECEldyb25nIGJvcnJvdyBhc3NldAQHZFByaWNlQQkBEUBleHRyTmF0aXZlKDEwNTApAgUPcHJpY2VPcmFjbGVBZGRyCQCsAgIFA2FJZAUOa1ByaWNlSW5PcmFjbGUEB2RQcmljZUIJARFAZXh0ck5hdGl2ZSgxMDUwKQIFD3ByaWNlT3JhY2xlQWRkcgkArAICBQNiSWQFDmtQcmljZUluT3JhY2xlBAZkZWNQckEJAGwGAAoAAAkBEGdldEFzc2V0RGVjaW1hbHMBBQNhSWQAAAAABQRET1dOBAZkZWNQckIJAGwGAAoAAAkBEGdldEFzc2V0RGVjaW1hbHMBBQNiSWQAAAAABQRET1dOBAxwYXlkSW5Eb2xsYXIJAGQCCQBrAwUHZFByaWNlQQUEcG10QQUGZGVjUHJBCQBrAwUHZFByaWNlQgUEcG10QgUGZGVjUHJCBA0kdDAzMTI4MTMxMzc4AwkAAAIFCGJvcnJvd0lkBQNhSWQJAJQKAgUHZFByaWNlQQUGZGVjUHJBCQCUCgIFB2RQcmljZUIFBmRlY1ByQgQLYm9ycm93UHJpY2UIBQ0kdDAzMTI4MTMxMzc4Al8xBAtib3Jyb3dEZWNQcggFDSR0MDMxMjgxMzEzNzgCXzIJAGsDCQBrAwUMcGF5ZEluRG9sbGFyCQBlAgUIbGV2ZXJhZ2UAZABkBQtib3Jyb3dEZWNQcgULYm9ycm93UHJpY2UBEnBhcnNlUmVwbGVuaXNoUG10cwMEcG10cwNBSWQDQklkAwkAAAIJAJADAQUEcG10cwACAwkBAiE9AgkBDGFzc2V0SWRUb1N0cgEICQCRAwIFBHBtdHMAAAdhc3NldElkBQNBSWQJAAIBAhVXcm9uZyBwYXltZW50IGFzc2V0IEEDCQECIT0CCQEMYXNzZXRJZFRvU3RyAQgJAJEDAgUEcG10cwABB2Fzc2V0SWQFA0JJZAkAAgECFVdyb25nIHBheW1lbnQgYXNzZXQgQgkAlAoCCAkAkQMCBQRwbXRzAAAGYW1vdW50CAkAkQMCBQRwbXRzAAEGYW1vdW50AwkAAAIJAJADAQUEcG10cwABAwkAAAIJAQxhc3NldElkVG9TdHIBCAkAkQMCBQRwbXRzAAAHYXNzZXRJZAUDQUlkCQCUCgIICQCRAwIFBHBtdHMAAAZhbW91bnQAAAMJAAACCQEMYXNzZXRJZFRvU3RyAQgJAJEDAgUEcG10cwAAB2Fzc2V0SWQFA0JJZAkAlAoCAAAICQCRAwIFBHBtdHMAAAZhbW91bnQJAAIBAg1Xcm9uZyBwYXltZW50CQACAQIcT25lIG9yIHR3byBwYXltZW50cyBleHBlY3RlZAEPY2FsY1ByaWNlSW1wYWN0BARiYWxBBGJhbEIHbmV3QmFsQQduZXdCYWxCBANwcmkJAGgCCQBlAgUGU0NBTEU4CQBrAwkAawMFBGJhbEIFBlNDQUxFOAUEYmFsQQUGU0NBTEU4CQBrAwUHbmV3QmFsQgUGU0NBTEU4BQduZXdCYWxBAGQDCQBmAgAABQNwcmkJAGgCBQNwcmkA////////////AQUDcHJpARFjbGFpbUFuZENoZWNrQW1udAUEcG9vbAVwVHlwZQVjbGFpbQZhbW91bnQGY2hhbmdlBA0kdDAzMjM3ODMyNjM3AwUFY2xhaW0JAQtjbGFpbUZhcm1lZAIFBXBUeXBlBQRwb29sBAxjbGFpbWVkQXNzZXQDCQAAAgUFcFR5cGUFB1NGX1BPT0wFBlNXT1BJRAMJAAACBQVwVHlwZQUHV1hfUE9PTAUEV1hJRAkBD3Vua25vd25Qb29sVHlwZQAJAJQKAgUGYW1vdW50BQxjbGFpbWVkQXNzZXQEC2NsYWltQW1vdW50CAUNJHQwMzIzNzgzMjYzNwJfMQQKY2xhaW1Bc3NldAgFDSR0MDMyMzc4MzI2MzcCXzIEA2JhbAkBDmFjY291bnRCYWxhbmNlAQUKY2xhaW1Bc3NldAMDCQBmAgUGYW1vdW50CQBkAgULY2xhaW1BbW91bnQFBmNoYW5nZQYJAGYCBQZhbW91bnQFA2JhbAkAAgECGVRvIGJpZyBhbW91bnQgdG8gZXhjaGFuZ2UJAJQKAgULY2xhaW1BbW91bnQFCmNsYWltQXNzZXQdAWkBE2dldFBvb2xJbmZvUkVBRE9OTFkBBHBvb2wECHBvb2xBZGRyCQERQGV4dHJOYXRpdmUoMTA2MikBBQRwb29sBAVwVHlwZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgUFa1Bvb2wFBHBvb2wCElBvb2wgaXMgbm90IGluaXRlZAQNJHQwMzMwMzQzMzEyNAkBC2dldFBvb2xEYXRhAgkBB0FkZHJlc3MBCQDZBAEFBHBvb2wFBXBUeXBlBANBSWQIBQ0kdDAzMzAzNDMzMTI0Al8xBANCSWQIBQ0kdDAzMzAzNDMzMTI0Al8yBARiYWxBCAUNJHQwMzMwMzQzMzEyNAJfMwQEYmFsQggFDSR0MDMzMDM0MzMxMjQCXzQEB3NoYXJlSWQIBQ0kdDAzMzAzNDMzMTI0Al81BAtzaGFyZVN1cHBseQkBDmdldFNoYXJlU3VwcGx5AwUIcG9vbEFkZHIFBXBUeXBlBQdzaGFyZUlkCQCUCgIFA25pbAkAmAoGBQNBSWQFA0JJZAUHc2hhcmVJZAUEYmFsQQUEYmFsQgULc2hhcmVTdXBwbHkBaQEaZ2V0U2hhcmVBc3NldFByaWNlUkVBRE9OTFkBB3NoYXJlSWQEC3NoYXJlUHJpY2VzCQENZ2V0U2hhcmVQcmljZQEFB3NoYXJlSWQJAJQKAgUDbmlsBQtzaGFyZVByaWNlcwFpASJnZXRVc2VyUG9zaXRpb25TaGFyZUFtb3VudFJFQURPTkxZAgR1c2VyBnBvc051bQQEcG9vbAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgkArAICCQCsAgIFBHVzZXICAV8FBnBvc051bQURa1VzZXJQb3NpdGlvblBvb2wCEFVua25vd24gcG9zaXRpb24EDGJvcnJvd0Ftb3VudAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBnBvc051bQURa1VzZXJCb3Jyb3dBbW91bnQED3VzZXJDYW5XaXRoZHJhdwkBGHVzZXJDYW5XaXRoZHJhd1NoYXJlQ2FsYwQFBHVzZXIFBHBvb2wFBnBvc051bQkAZgIFDGJvcnJvd0Ftb3VudAAACQCUCgIFA25pbAUPdXNlckNhbldpdGhkcmF3AWkBF2dldFVzZXJQb3NpdGlvblJFQURPTkxZAwR1c2VyBXBvb2xzBnBvc051bQoBB3VzZXJQb3MCAWEEcG9vbAQNJHQwMzM5OTczNDA2NwUBYQQJd0Ftb3VudHNBCAUNJHQwMzM5OTczNDA2NwJfMQQJd0Ftb3VudHNCCAUNJHQwMzM5OTczNDA2NwJfMgQFZGVidHMIBQ0kdDAzMzk5NzM0MDY3Al8zBAtlcVdBbW91bnRzQQgFDSR0MDMzOTk3MzQwNjcCXzQEC2VxV0Ftb3VudHNCCAUNJHQwMzM5OTczNDA2NwJfNQQFaW5kZXgIBQ0kdDAzMzk5NzM0MDY3Al82AwkBASEBCQEJaXNEZWZpbmVkAQkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwkAkQMCBQZwb3NOdW0FBWluZGV4BQ1rVXNlclBvc2l0aW9uCQCYCgYJAM0IAgUJd0Ftb3VudHNBAAAJAM0IAgUJd0Ftb3VudHNCAAAJAM0IAgUFZGVidHMAAAkAzQgCBQtlcVdBbW91bnRzQQAACQDNCAIFC2VxV0Ftb3VudHNCAAAJAGQCBQVpbmRleAABBAVwVHlwZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgUFa1Bvb2wFBHBvb2wCElBvb2wgaXMgbm90IGluaXRlZAQNJHQwMzQzNDYzNDQzNgkBC2dldFBvb2xEYXRhAgkBB0FkZHJlc3MBCQDZBAEFBHBvb2wFBXBUeXBlBANBSWQIBQ0kdDAzNDM0NjM0NDM2Al8xBANCSWQIBQ0kdDAzNDM0NjM0NDM2Al8yBARiYWxBCAUNJHQwMzQzNDYzNDQzNgJfMwQEYmFsQggFDSR0MDM0MzQ2MzQ0MzYCXzQEB3NoYXJlSWQIBQ0kdDAzNDM0NjM0NDM2Al81BAxib3Jyb3dBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8JAJEDAgUGcG9zTnVtBQVpbmRleAURa1VzZXJCb3Jyb3dBbW91bnQAAAQPdXNlckNhbldpdGhkcmF3CQEYdXNlckNhbldpdGhkcmF3U2hhcmVDYWxjBAUEdXNlcgUEcG9vbAkAkQMCBQZwb3NOdW0FBWluZGV4CQBmAgUMYm9ycm93QW1vdW50AAAEDSR0MDM0NjUyMzQ3NzIJARpjYWxjV2l0aGRyYXdMUEZyb21Qb29sVmlydAQJAQdBZGRyZXNzAQkA2QQBBQRwb29sBQVwVHlwZQUHc2hhcmVJZAUPdXNlckNhbldpdGhkcmF3BAh3QW1vdW50QQgFDSR0MDM0NjUyMzQ3NzICXzEECHdBbW91bnRCCAUNJHQwMzQ2NTIzNDc3MgJfMgMJAGYCBQxib3Jyb3dBbW91bnQAAAQLYm9ycm93QXNzZXQJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfCQCRAwIFBnBvc051bQUFaW5kZXgFEmtVc2VyQm9ycm93QXNzZXRJZAQEZGVidAoAAUAJAPwHBAkBDmdldExlbmRTcnZBZGRyAAIMZ2V0QXNzZXREZWJ0CQDMCAIHCQDMCAIJAKwCAgkArAICBQR1c2VyAgFfCQCRAwIFBnBvc051bQUFaW5kZXgJAMwIAgULYm9ycm93QXNzZXQFA25pbAUDbmlsAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAMJAAACBQRkZWJ0BQRkZWJ0BA1hbW91bnRUb0dldEV4AwMJAAACBQtib3Jyb3dBc3NldAUDQUlkCQBmAgUEZGVidAUId0Ftb3VudEEHCQBlAgUEZGVidAUId0Ftb3VudEEDAwkAAAIFC2JvcnJvd0Fzc2V0BQNCSWQJAGYCBQRkZWJ0BQh3QW1vdW50QgcJAGUCBQRkZWJ0BQh3QW1vdW50QgAABAthbW91bnRUb1BheQMJAGYCBQ1hbW91bnRUb0dldEV4AAADCQAAAgUFcFR5cGUFB1NGX1BPT0wEAmV4CQERY2FsY0Ftb3VudFRvUGF5U0YHBQRwb29sBQNBSWQFA0JJZAUEYmFsQQUEYmFsQgUNYW1vdW50VG9HZXRFeAULYm9ycm93QXNzZXQIBQJleAJfMgMJAAACBQVwVHlwZQUHV1hfUE9PTAQCZXgJARFjYWxjQW1vdW50VG9QYXlXWAcFBHBvb2wFA0FJZAUDQklkBQRiYWxBBQRiYWxCBQ1hbW91bnRUb0dldEV4BQtib3Jyb3dBc3NldAgFAmV4Al8yCQEPdW5rbm93blBvb2xUeXBlAAAABA0kdDAzNTY4NDM1OTAzAwkAAAIFC2JvcnJvd0Fzc2V0BQNBSWQJAJQKAgkAZQIJAGQCBQh3QW1vdW50QQUNYW1vdW50VG9HZXRFeAUEZGVidAkAZQIFCHdBbW91bnRCBQthbW91bnRUb1BheQkAlAoCCQBlAgUId0Ftb3VudEEFC2Ftb3VudFRvUGF5CQBlAgkAZAIFCHdBbW91bnRCBQ1hbW91bnRUb0dldEV4BQRkZWJ0BAplcVdBbW91bnRBCAUNJHQwMzU2ODQzNTkwMwJfMQQKZXFXQW1vdW50QggFDSR0MDM1Njg0MzU5MDMCXzIJAJgKBgkAzQgCBQl3QW1vdW50c0EFCHdBbW91bnRBCQDNCAIFCXdBbW91bnRzQgUId0Ftb3VudEIJAM0IAgUFZGVidHMFBGRlYnQJAM0IAgULZXFXQW1vdW50c0EFCmVxV0Ftb3VudEEJAM0IAgULZXFXQW1vdW50c0IFCmVxV0Ftb3VudEIJAGQCBQVpbmRleAABCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQCYCgYJAM0IAgUJd0Ftb3VudHNBBQh3QW1vdW50QQkAzQgCBQl3QW1vdW50c0IFCHdBbW91bnRCBQVkZWJ0cwkAzQgCBQl3QW1vdW50c0EFCHdBbW91bnRBCQDNCAIFCXdBbW91bnRzQgUId0Ftb3VudEIJAGQCBQVpbmRleAABBA0kdDAzNjE1ODM2MjY5CgACJGwFBXBvb2xzCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAmAoGBQNuaWwFA25pbAUDbmlsBQNuaWwFA25pbAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQd1c2VyUG9zAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAyMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQECXdBbW91bnRzQQgFDSR0MDM2MTU4MzYyNjkCXzEECXdBbW91bnRzQggFDSR0MDM2MTU4MzYyNjkCXzIEBWRlYnRzCAUNJHQwMzYxNTgzNjI2OQJfMwQLZXFXQW1vdW50c0EIBQ0kdDAzNjE1ODM2MjY5Al80BAtlcVdBbW91bnRzQggFDSR0MDM2MTU4MzYyNjkCXzUJAJQKAgUDbmlsCQCXCgUFCXdBbW91bnRzQQUJd0Ftb3VudHNCBQVkZWJ0cwULZXFXQW1vdW50c0EFC2VxV0Ftb3VudHNCAWkBCXJlcGxlbmlzaAMEcG9vbAhsZXZlcmFnZQhib3Jyb3dJZAkBC3ZhbHVlT3JFbHNlAgkBEGlzQWN0aXZlRm9yVXNlcnMABAVwVHlwZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgUFa1Bvb2wFBHBvb2wCElBvb2wgaXMgbm90IGluaXRlZAMJAQEhAQkBDGlzUG9vbEFjdGl2ZQIFBHBvb2wFBXBUeXBlCQACAQIeUG9vbCBub3QgYWN0aXZlIGF0IHRoaXMgbW9tZW50AwMJAGYCAGQFCGxldmVyYWdlBgkAZgIFCGxldmVyYWdlAKwCCQACAQIfTGV2ZXJhZ2UgY2FuJ3QgYmUgPDEwMCBhbmQgPjMwMAMDCQEBIQEJARFAZXh0ck5hdGl2ZSgxMDUxKQIFBHRoaXMJAKwCAgUEcG9vbAUOa1Bvb2xDYW5Cb3Jyb3cJAGYCBQhsZXZlcmFnZQBkBwkAAgECHVlvdSBjYW4ndCBib3Jyb3cgaW4gdGhpcyBwb29sBA0kdDAzNjg2NzM2OTU3CQELZ2V0UG9vbERhdGECCQEHQWRkcmVzcwEJANkEAQUEcG9vbAUFcFR5cGUEA0FJZAgFDSR0MDM2ODY3MzY5NTcCXzEEA0JJZAgFDSR0MDM2ODY3MzY5NTcCXzIEBGJhbEEIBQ0kdDAzNjg2NzM2OTU3Al8zBARiYWxCCAUNJHQwMzY4NjczNjk1NwJfNAQHc2hhcmVJZAgFDSR0MDM2ODY3MzY5NTcCXzUDAwkBAiE9AgUIYm9ycm93SWQFA0FJZAkBAiE9AgUIYm9ycm93SWQFA0JJZAcJAAIBAhJXcm9uZyBib3Jyb3cgYXNzZXQEDSR0MDM3MDM4MzcwOTcJARJwYXJzZVJlcGxlbmlzaFBtdHMDCAUBaQhwYXltZW50cwUDQUlkBQNCSWQEBHBtdEEIBQ0kdDAzNzAzODM3MDk3Al8xBARwbXRCCAUNJHQwMzcwMzgzNzA5NwJfMgQEdXNlcgkApQgBCAUBaQZjYWxsZXIECW5ld1Bvc051bQkBGGdldE5ld1VzZXJQb3NpdGlvbk51bWJlcgEFBHVzZXIDCQBmAgUIbGV2ZXJhZ2UAZAQMYm9ycm93QW1vdW50CQEQY2FsY0JvcnJvd0Ftb3VudAYFBHBtdEEFBHBtdEIFA0FJZAUDQklkBQhsZXZlcmFnZQUIYm9ycm93SWQEB3JlcXVlc3QJALkJAgkAzAgCBQR1c2VyCQDMCAIFBHBvb2wJAMwIAgkApAMBBQRwbXRBCQDMCAIFA0FJZAkAzAgCCQCkAwEFBHBtdEIJAMwIAgUDQklkCQDMCAIJAKQDAQUEYmFsQQkAzAgCCQCkAwEFBGJhbEIJAMwIAgUHc2hhcmVJZAkAzAgCBQhib3Jyb3dJZAkAzAgCCQCkAwEFDGJvcnJvd0Ftb3VudAUDbmlsAgEsBAxuZXdSZXF1ZXN0SWQKAAFACQD8BwQFBHRoaXMCEGNyZWF0ZU5ld1JlcXVlc3QJAMwIAgUHcmVxdWVzdAUDbmlsBQNuaWwDCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50AwkAAAIFDG5ld1JlcXVlc3RJZAUMbmV3UmVxdWVzdElkBARhcmdzCQDMCAIJAKwCAgkArAICBQR1c2VyAgFfCQCkAwEFCW5ld1Bvc051bQkAzAgCBQdzaGFyZUlkCQDMCAIFCGJvcnJvd0lkCQDMCAIFDGJvcnJvd0Ftb3VudAkAzAgCCQClCAEFBHRoaXMJAMwIAgIRcmVwbGVuaXNoRnJvbUxhbmQJAMwIAgkApAMBCQETdmFsdWVPckVycm9yTWVzc2FnZQIFDG5ld1JlcXVlc3RJZAIYQ2FuJ3QgY3JlYXRlIG5ldyByZXF1ZXN0BQNuaWwEA2ludgkA/QcECQEOZ2V0TGVuZFNydkFkZHIAAg1mbGFzaFBvc2l0aW9uBQRhcmdzBQNuaWwDCQAAAgUDaW52BQNpbnYECnVzZXJTdGFrZWQJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfCQCkAwEFCW5ld1Bvc051bQUNa1VzZXJQb3NpdGlvbgQNJHQwMzgwODYzODE4MAkBD2dldFBvb2xCYWxhbmNlcwQJAQdBZGRyZXNzAQkA2QQBBQRwb29sBQVwVHlwZQUDQUlkBQNCSWQDCQAAAgUNJHQwMzgwODYzODE4MAUNJHQwMzgwODYzODE4MAQHbmV3QmFsQggFDSR0MDM4MDg2MzgxODACXzIEB25ld0JhbEEIBQ0kdDAzODA4NjM4MTgwAl8xBAhwckltcGFjdAkBD2NhbGNQcmljZUltcGFjdAQFBGJhbEEFBGJhbEIFB25ld0JhbEEFB25ld0JhbEIEDSR0MDM4MjUwMzgzNjUJARpjYWxjV2l0aGRyYXdMUEZyb21Qb29sVmlydAQJAQdBZGRyZXNzAQkA2QQBBQRwb29sBQVwVHlwZQUHc2hhcmVJZAUKdXNlclN0YWtlZAQId0Ftb3VudEEIBQ0kdDAzODI1MDM4MzY1Al8xBAh3QW1vdW50QggFDSR0MDM4MjUwMzgzNjUCXzIJAJQKAgUDbmlsCQDMCAIFCHBySW1wYWN0CQDMCAIFCHdBbW91bnRBCQDMCAIFCHdBbW91bnRCBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4EDSR0MDM4NDE4Mzg1MzMJAQ9yZXBsZW5pc2hCeVR5cGUKBQVwVHlwZQUEcG9vbAULTk9fTE9BTl9GRUUFBHBtdEEFA0FJZAUEcG10QgUDQklkBQRiYWxBBQRiYWxCBQdzaGFyZUlkAwkAAAIFDSR0MDM4NDE4Mzg1MzMFDSR0MDM4NDE4Mzg1MzMEB2F4bHlGZWUIBQ0kdDAzODQxODM4NTMzAl8yBAp1c2VyU3Rha2VkCAUNJHQwMzg0MTgzODUzMwJfMQQNJHQwMzg1MzkzODYzMwkBD2dldFBvb2xCYWxhbmNlcwQJAQdBZGRyZXNzAQkA2QQBBQRwb29sBQVwVHlwZQUDQUlkBQNCSWQDCQAAAgUNJHQwMzg1MzkzODYzMwUNJHQwMzg1MzkzODYzMwQHbmV3QmFsQggFDSR0MDM4NTM5Mzg2MzMCXzIEB25ld0JhbEEIBQ0kdDAzODUzOTM4NjMzAl8xBAhwckltcGFjdAkBD2NhbGNQcmljZUltcGFjdAQFBGJhbEEFBGJhbEIFB25ld0JhbEEFB25ld0JhbEIEDSR0MDM4NzAzMzg4MTgJARpjYWxjV2l0aGRyYXdMUEZyb21Qb29sVmlydAQJAQdBZGRyZXNzAQkA2QQBBQRwb29sBQVwVHlwZQUHc2hhcmVJZAUKdXNlclN0YWtlZAQId0Ftb3VudEEIBQ0kdDAzODcwMzM4ODE4Al8xBAh3QW1vdW50QggFDSR0MDM4NzAzMzg4MTgCXzIJAJQKAgkAzggCCQEQcmVwbGVuaXNoRW50cmllcwgFBHBvb2wFBHVzZXIFCnVzZXJTdGFrZWQFB2F4bHlGZWUFCW5ld1Bvc051bQUHc2hhcmVJZAUFcFR5cGUHCQEOZ2V0Q3Vyc0VudHJpZXMEBQNBSWQFA0JJZAUHc2hhcmVJZAkAzAgCCQCkAwEFCHdBbW91bnRBCQDMCAIJAKQDAQUId0Ftb3VudEIFA25pbAkAzAgCBQhwckltcGFjdAkAzAgCBQh3QW1vdW50QQkAzAgCBQh3QW1vdW50QgUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCHdpdGhkcmF3AgRwb29sBXBvc0lkCQELdmFsdWVPckVsc2UCCQEQaXNBY3RpdmVGb3JVc2VycwAEBXBUeXBlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICBQVrUG9vbAUEcG9vbAISUG9vbCBpcyBub3QgaW5pdGVkAwkBASEBCQEMaXNQb29sQWN0aXZlAgUEcG9vbAUFcFR5cGUJAAIBAh5Qb29sIG5vdCBhY3RpdmUgYXQgdGhpcyBtb21lbnQJAQ53aXRoZHJhd1RvVXNlcgQJAKUIAQgFAWkGY2FsbGVyBQRwb29sCQCkAwEFBXBvc0lkBwFpARRjcmVhdGVVcGRhdGVTdG9wTG9zcwQFcG9zSWQGcG9vbElkB2Fzc2V0SWQFcHJpY2UJAQt2YWx1ZU9yRWxzZQIJARBpc0FjdGl2ZUZvclVzZXJzAAQQdG9rZW5PcmFjbGVQcmljZQkBEUBleHRyTmF0aXZlKDEwNTApAgUPcHJpY2VPcmFjbGVBZGRyCQCsAgIFB2Fzc2V0SWQFDmtQcmljZUluT3JhY2xlBAVwVHlwZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgUFa1Bvb2wFBnBvb2xJZAISUG9vbCBpcyBub3QgaW5pdGVkAwkBASEBCQEMaXNQb29sQWN0aXZlAgUGcG9vbElkBQVwVHlwZQkAAgECHlBvb2wgbm90IGFjdGl2ZSBhdCB0aGlzIG1vbWVudAMJAQEhAQkBCWlzRGVmaW5lZAEJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBnBvb2xJZAIBXwkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQUFcG9zSWQFDWtVc2VyUG9zaXRpb24JAAIBAhpUaGVyZSBhcmUgbm8gdXNlciBwb3NpdGlvbgMJAGcCAAAFBXByaWNlCQACAQIcUHJpY2UgbXVzdCBiZSBncmVhdGVyIHRoYW4gMAMJAGYCBQVwcmljZQUQdG9rZW5PcmFjbGVQcmljZQkAAgECK1ByaWNlIG11c3QgYmUgbGVzcyB0aGFuIGN1cnJlbnQgdG9rZW4gcHJpY2UJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQUFcG9zSWQCAV8FBnBvb2xJZAIBXwUHYXNzZXRJZAUNa1VzZXJTdG9wTG9zcwUFcHJpY2UFA25pbAFpAQ5kZWxldGVTdG9wTG9zcwMFcG9zSWQGcG9vbElkB2Fzc2V0SWQJAQt2YWx1ZU9yRWxzZQIJARBpc0FjdGl2ZUZvclVzZXJzAAQFcFR5cGUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzCQCsAgIFBWtQb29sBQZwb29sSWQCElBvb2wgaXMgbm90IGluaXRlZAMJAQEhAQkBDGlzUG9vbEFjdGl2ZQIFBnBvb2xJZAUFcFR5cGUJAAIBAh5Qb29sIG5vdCBhY3RpdmUgYXQgdGhpcyBtb21lbnQDCQEBIQEJAQlpc0RlZmluZWQBCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQUFcG9zSWQCAV8FBnBvb2xJZAIBXwUHYXNzZXRJZAUNa1VzZXJTdG9wTG9zcwkAAgECCE5vIGVudHJ5CQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8JAKQDAQUFcG9zSWQCAV8FBnBvb2xJZAIBXwUHYXNzZXRJZAUNa1VzZXJTdG9wTG9zcwUDbmlsAWkBBGluaXQNDG1vbmV5Qm94QWRkcg1zZkZhcm1pbmdBZGRyCGxlbmRBZGRyD3ByaWNlT3JhY2xlQWRkchBrZWVwZXJFeENvbnRyYWN0Dnd4U3dhcENvbnRyYWN0C3N3b3BBc3NldElkCXd4QXNzZXRJZA5vcGVyYXRvclB1YktleRJncm91cDFBZG1pbjFQdWJLZXkSZ3JvdXAxQWRtaW4yUHViS2V5Emdyb3VwMkFkbWluMVB1YktleRJncm91cDJBZG1pbjJQdWJLZXkJAQt2YWx1ZU9yRWxzZQIJAQppc1NlbGZDYWxsAQUBaQMJAQlpc0RlZmluZWQBCQCiCAEFD2tPcGVyYXRvckNhbGxQSwkAAgECDkFscmVhZHkgaW5pdGVkAwkBASEBCQEJaXNEZWZpbmVkAQkApggBBQxtb25leUJveEFkZHIJAAIBAiNtb25leUJveEFkZHIgaXMgbm90IGNvcnJlY3QgYWRkcmVzcwMJAQEhAQkBCWlzRGVmaW5lZAEJAKYIAQUNc2ZGYXJtaW5nQWRkcgkAAgECJHNmRmFybWluZ0FkZHIgaXMgbm90IGNvcnJlY3QgYWRkcmVzcwMJAQEhAQkBCWlzRGVmaW5lZAEJAKYIAQUIbGVuZEFkZHIJAAIBAh9sZW5kQWRkciBpcyBub3QgY29ycmVjdCBhZGRyZXNzAwkBASEBCQEJaXNEZWZpbmVkAQkApggBBQ9wcmljZU9yYWNsZUFkZHIJAAIBAiZwcmljZU9yYWNsZUFkZHIgaXMgbm90IGNvcnJlY3QgYWRkcmVzcwMJAQEhAQkBCWlzRGVmaW5lZAEJAKYIAQUQa2VlcGVyRXhDb250cmFjdAkAAgECJ2tlZXBlckV4Q29udHJhY3QgaXMgbm90IGNvcnJlY3QgYWRkcmVzcwMJAQEhAQkBCWlzRGVmaW5lZAEJAOwHAQkA2QQBBQtzd29wQXNzZXRJZAkAAgECI3N3b3BBc3NldElkIGlzIG5vdCBjb3JyZWN0IGFzc2V0IGlkAwkBASEBCQEJaXNEZWZpbmVkAQkA7AcBCQDZBAEFCXd4QXNzZXRJZAkAAgECI3N3b3BBc3NldElkIGlzIG5vdCBjb3JyZWN0IGFzc2V0IGlkAwkBAiE9AgkAyAEBCQDZBAEFDm9wZXJhdG9yUHViS2V5ACAJAAIBAh1vcGVyYXRvclB1YktleSBpcyBub3QgY29ycmVjdAMJAQIhPQIJAMgBAQkA2QQBBRJncm91cDFBZG1pbjFQdWJLZXkAIAkAAgECIWdyb3VwMUFkbWluMVB1YktleSBpcyBub3QgY29ycmVjdAMJAQIhPQIJAMgBAQkA2QQBBRJncm91cDFBZG1pbjJQdWJLZXkAIAkAAgECIWdyb3VwMUFkbWluMlB1YktleSBpcyBub3QgY29ycmVjdAMJAQIhPQIJAMgBAQkA2QQBBRJncm91cDJBZG1pbjFQdWJLZXkAIAkAAgECIWdyb3VwMkFkbWluMVB1YktleSBpcyBub3QgY29ycmVjdAMJAQIhPQIJAMgBAQkA2QQBBRJncm91cDJBZG1pbjJQdWJLZXkAIAkAAgECIWdyb3VwMkFkbWluMlB1YktleSBpcyBub3QgY29ycmVjdAkAzAgCCQELU3RyaW5nRW50cnkCBQlrTW9uZXlCb3gFDG1vbmV5Qm94QWRkcgkAzAgCCQELU3RyaW5nRW50cnkCBQ5rU0ZGYXJtaW5nQWRkcgUNc2ZGYXJtaW5nQWRkcgkAzAgCCQELU3RyaW5nRW50cnkCBQxrTGVuZFNlcnZpY2UFCGxlbmRBZGRyCQDMCAIJAQtTdHJpbmdFbnRyeQIFDGtQcmljZU9yYWNsZQUPcHJpY2VPcmFjbGVBZGRyCQDMCAIJAQtTdHJpbmdFbnRyeQIFC2tFeENvbnRyYWN0BRBrZWVwZXJFeENvbnRyYWN0CQDMCAIJAQtTdHJpbmdFbnRyeQIFD2tXeFN3YXBDb250cmFjdAUOd3hTd2FwQ29udHJhY3QJAMwIAgkBC1N0cmluZ0VudHJ5AgUHa1N3b3BJZAULc3dvcEFzc2V0SWQJAMwIAgkBC1N0cmluZ0VudHJ5AgUFa1d4SWQFCXd4QXNzZXRJZAkAzAgCCQELU3RyaW5nRW50cnkCBQ9rT3BlcmF0b3JDYWxsUEsFDm9wZXJhdG9yUHViS2V5CQDMCAIJAQtTdHJpbmdFbnRyeQIFD2tHcm91cDFBZG1pbjFQSwUSZ3JvdXAxQWRtaW4xUHViS2V5CQDMCAIJAQtTdHJpbmdFbnRyeQIFD2tHcm91cDFBZG1pbjJQSwUSZ3JvdXAxQWRtaW4yUHViS2V5CQDMCAIJAQtTdHJpbmdFbnRyeQIFD2tHcm91cDJBZG1pbjFQSwUSZ3JvdXAyQWRtaW4xUHViS2V5CQDMCAIJAQtTdHJpbmdFbnRyeQIFD2tHcm91cDJBZG1pbjJQSwUSZ3JvdXAyQWRtaW4yUHViS2V5BQNuaWwBaQEQY3JlYXRlTmV3UmVxdWVzdAEGcGFyYW1zCQELdmFsdWVPckVsc2UCCQEKaXNTZWxmQ2FsbAEFAWkEDG5ld1JlcXVlc3RJZAkAZAIJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUMa1JlcXVlc3RJdGVyAAAAAQkAlAoCCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkApAMBBQxuZXdSZXF1ZXN0SWQFCmtSZXF1ZXN0SWQFBnBhcmFtcwkAzAgCCQEMSW50ZWdlckVudHJ5AgUMa1JlcXVlc3RJdGVyBQxuZXdSZXF1ZXN0SWQFA25pbAUMbmV3UmVxdWVzdElkAWkBEXJlcGxlbmlzaEZyb21MYW5kAQlyZXF1ZXN0SWQJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAJAQt2YWx1ZU9yRWxzZQIJAQppc0xhbmRDYWxsAQUBaQQNJHQwNDM2NTc0Mzc2MQkBDHBhcnNlUmVxdWVzdAEFCXJlcXVlc3RJZAQEdXNlcggFDSR0MDQzNjU3NDM3NjECXzEEBHBvb2wIBQ0kdDA0MzY1NzQzNzYxAl8yBARwbXRBCAUNJHQwNDM2NTc0Mzc2MQJfMwQDQUlkCAUNJHQwNDM2NTc0Mzc2MQJfNAQEcG10QggFDSR0MDQzNjU3NDM3NjECXzUEA0JJZAgFDSR0MDQzNjU3NDM3NjECXzYEBGJhbEEIBQ0kdDA0MzY1NzQzNzYxAl83BARiYWxCCAUNJHQwNDM2NTc0Mzc2MQJfOAQHc2hhcmVJZAgFDSR0MDQzNjU3NDM3NjECXzkEB2J3QXNzZXQIBQ0kdDA0MzY1NzQzNzYxA18xMAQIYndBbW91bnQIBQ0kdDA0MzY1NzQzNzYxA18xMQMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECEldyb25nIHBheW1lbnQgc2l6ZQMDCQECIT0CCQEMYXNzZXRJZFRvU3RyAQgJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBQdid0Fzc2V0BgkBAiE9AggJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQFCGJ3QW1vdW50CQACAQINV3JvbmcgcGF5bWVudAQNJHQwNDM5NTE0NDA1MQMJAAACBQNBSWQFB2J3QXNzZXQJAJQKAgkAZAIFBHBtdEEFCGJ3QW1vdW50BQRwbXRCCQCUCgIFBHBtdEEJAGQCBQRwbXRCBQhid0Ftb3VudAQHcG10QWxsQQgFDSR0MDQzOTUxNDQwNTECXzEEB3BtdEFsbEIIBQ0kdDA0Mzk1MTQ0MDUxAl8yBAVwVHlwZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgUFa1Bvb2wFBHBvb2wCDFVua25vd24gcG9vbAQNJHQwNDQxMzM0NDI0OAkBD3JlcGxlbmlzaEJ5VHlwZQoFBXBUeXBlBQRwb29sBQhMT0FOX0ZFRQUHcG10QWxsQQUDQUlkBQdwbXRBbGxCBQNCSWQFBGJhbEEFBGJhbEIFB3NoYXJlSWQECnVzZXJTdGFrZWQIBQ0kdDA0NDEzMzQ0MjQ4Al8xBAdheGx5RmVlCAUNJHQwNDQxMzM0NDI0OAJfMgQGcG9zTnVtCQEYZ2V0TmV3VXNlclBvc2l0aW9uTnVtYmVyAQUEdXNlcgQNYm9ycm93RW50cmllcwkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8JAKQDAQUGcG9zTnVtBRFrVXNlckJvcnJvd0Ftb3VudAUIYndBbW91bnQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8JAKQDAQUGcG9zTnVtBRJrVXNlckJvcnJvd0Fzc2V0SWQFB2J3QXNzZXQFA25pbAQHZW50cmllcwkBEHJlcGxlbmlzaEVudHJpZXMIBQRwb29sBQR1c2VyBQp1c2VyU3Rha2VkBQdheGx5RmVlBQZwb3NOdW0FB3NoYXJlSWQFBXBUeXBlBgQNJHQwNDQ2MDg0NDcyMwkBGmNhbGNXaXRoZHJhd0xQRnJvbVBvb2xWaXJ0BAkBB0FkZHJlc3MBCQDZBAEFBHBvb2wFBXBUeXBlBQdzaGFyZUlkBQp1c2VyU3Rha2VkBAh3QW1vdW50QQgFDSR0MDQ0NjA4NDQ3MjMCXzEECHdBbW91bnRCCAUNJHQwNDQ2MDg0NDcyMwJfMgkAlAoCCQDNCAIJAM4IAgkAzggCBQdlbnRyaWVzCQEOZ2V0Q3Vyc0VudHJpZXMEBQNBSWQFA0JJZAUHc2hhcmVJZAkAzAgCCQCkAwEFCHdBbW91bnRBCQDMCAIJAKQDAQUId0Ftb3VudEIFA25pbAUNYm9ycm93RW50cmllcwkBC0RlbGV0ZUVudHJ5AQkArAICBQlyZXF1ZXN0SWQFCmtSZXF1ZXN0SWQFCnVzZXJTdGFrZWQBaQEJbGlxdWlkYXRlAwR1c2VyBXBvc0lkD2xpcXVpZGF0ZUFtb3VudAkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAkBC3ZhbHVlT3JFbHNlAgkBCmlzTGFuZENhbGwBBQFpBARwb29sCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICCQCsAgIJAKwCAgUEdXNlcgIBXwUFcG9zSWQFEWtVc2VyUG9zaXRpb25Qb29sAgtubyBwb3NpdGlvbgQFcFR5cGUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzCQCsAgIFBWtQb29sBQRwb29sAhJQb29sIGlzIG5vdCBpbml0ZWQEDSR0MDQ1MjQ0NDUzMzQJAQtnZXRQb29sRGF0YQIJAQdBZGRyZXNzAQkA2QQBBQRwb29sBQVwVHlwZQQDQUlkCAUNJHQwNDUyNDQ0NTMzNAJfMQQDQklkCAUNJHQwNDUyNDQ0NTMzNAJfMgQEYmFsQQgFDSR0MDQ1MjQ0NDUzMzQCXzMEBGJhbEIIBQ0kdDA0NTI0NDQ1MzM0Al80BAdzaGFyZUlkCAUNJHQwNDUyNDQ0NTMzNAJfNQQGYW1vdW50CQEJdW5zdGFrZUxQBAUEcG9vbAUFcFR5cGUFB3NoYXJlSWQFD2xpcXVpZGF0ZUFtb3VudAQMYm9ycm93QW1vdW50CQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUFcG9zSWQFEWtVc2VyQm9ycm93QW1vdW50BAtib3Jyb3dBc3NldAkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBRJrVXNlckJvcnJvd0Fzc2V0SWQED3VzZXJDYW5XaXRoZHJhdwkBGHVzZXJDYW5XaXRoZHJhd1NoYXJlQ2FsYwQFBHVzZXIFBHBvb2wFBXBvc0lkCQBmAgUMYm9ycm93QW1vdW50AAADCQBmAgUPbGlxdWlkYXRlQW1vdW50BQ91c2VyQ2FuV2l0aGRyYXcJAAIBAidZb3UgY2FuJ3QgbGlxdWlkYXRlIG1vcmUgdGhhbiB1c2VyIGhhdmUDCQAAAgUMYm9ycm93QW1vdW50AAAJAAIBAitZb3UgY2FuJ3QgbGlxdWlkYXRlIHBvc2l0aW9uIHdpdGhvdXQgYm9ycm93CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUFcG9zSWQFFWtVc2VyUG9zaXRpb25JbnRlcmVzdAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICBQRwb29sBRFrUG9vbEludGVyZXN0TG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBQ5rUG9vbFRvdGFsTG9hbgkAZQIJARlnZXRQb29sVG90YWxTaGFyZVdpdGhMb2FuAQUEcG9vbAUPbGlxdWlkYXRlQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFCmtQb29sVG90YWwJAGUCCQERZ2V0UG9vbFRvdGFsU2hhcmUBBQRwb29sBQ9saXF1aWRhdGVBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfBQVwb3NJZAUNa1VzZXJQb3NpdGlvbgkAZQIFD3VzZXJDYW5XaXRoZHJhdwUPbGlxdWlkYXRlQW1vdW50CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgUGYW1vdW50CQDZBAEFB3NoYXJlSWQFA25pbAFpAQhzdG9wTG9zcwQEdXNlcgVwb3NJZARwb29sB2Fzc2V0SWQJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAJAQt2YWx1ZU9yRWxzZQIJAQ5pc09wZXJhdG9yQ2FsbAEFAWkEEHRva2VuT3JhY2xlUHJpY2UJARFAZXh0ck5hdGl2ZSgxMDUwKQIFD3ByaWNlT3JhY2xlQWRkcgkArAICBQdhc3NldElkBQ5rUHJpY2VJbk9yYWNsZQQNc3RvcExvc3NQcmljZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEdXNlcgIBXwkApAMBBQVwb3NJZAIBXwUEcG9vbAIBXwUHYXNzZXRJZAUNa1VzZXJTdG9wTG9zcwIITm8gZW50cnkDCQBmAgUQdG9rZW5PcmFjbGVQcmljZQUNc3RvcExvc3NQcmljZQkAAgECI1Rva2VuIHByaWNlIGdyZWF0ZXIgc3RvcCBsb3NzIHByaWNlBANyZXMJAQ53aXRoZHJhd1RvVXNlcgQFBHVzZXIFBHBvb2wJAKQDAQUFcG9zSWQGCQCUCgIJAM0IAggFA3JlcwJfMQkBC0RlbGV0ZUVudHJ5AQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQR1c2VyAgFfCQCkAwEFBXBvc0lkAgFfBQRwb29sAgFfBQdhc3NldElkBQ1rVXNlclN0b3BMb3NzCAUDcmVzAl8yAWkBEmNhcGl0YWxpemVFeEtlZXBlcgsEcG9vbAl0b2tlblRvSWQQYW1vdW50VG9FeGNoYW5nZQVjbGFpbQlhbW91bnRzSW4JYWRkcmVzc2VzD2Fzc2V0c1RvUmVjZWl2ZQtlc3RSZWNlaXZlZBFzbGlwcGFnZVRvbGVyYW5jZQttaW5SZWNlaXZlZAdvcHRpb25zCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUACQELdmFsdWVPckVsc2UCCQEOaXNPcGVyYXRvckNhbGwBBQFpBAVwVHlwZQkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwkArAICBQVrUG9vbAUEcG9vbAQGY2hhbmdlCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAUOa1Bvb2xDYXBDaGFuZ2UAAAQNJHQwNDc0ODM0NzU4MgkBEWNsYWltQW5kQ2hlY2tBbW50BQUEcG9vbAUFcFR5cGUFBWNsYWltBRBhbW91bnRUb0V4Y2hhbmdlBQZjaGFuZ2UEDWNsYWltZWRBbW91bnQIBQ0kdDA0NzQ4MzQ3NTgyAl8xBAxjbGFpbWVkQXNzZXQIBQ0kdDA0NzQ4MzQ3NTgyAl8yBA9leGNoYW5nZWRBbW91bnQJAQ5leGNoYW5nZUtlZXBlcgoFCXRva2VuVG9JZAUQYW1vdW50VG9FeGNoYW5nZQUMY2xhaW1lZEFzc2V0BQlhbW91bnRzSW4FCWFkZHJlc3NlcwUPYXNzZXRzVG9SZWNlaXZlBQtlc3RSZWNlaXZlZAURc2xpcHBhZ2VUb2xlcmFuY2UFC21pblJlY2VpdmVkBQdvcHRpb25zBAluZXdDaGFuZ2UJAGUCCQBkAgUNY2xhaW1lZEFtb3VudAUGY2hhbmdlBRBhbW91bnRUb0V4Y2hhbmdlBAtjaGFuZ2VFbnRyeQMJAGcCBQluZXdDaGFuZ2UAAAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBQ5rUG9vbENhcENoYW5nZQUJbmV3Q2hhbmdlBQNuaWwJAAIBAg9OZWdhdGl2ZSBjaGFuZ2UJAM4IAgkBCmNhcGl0YWxpemUEBQRwb29sBQVwVHlwZQUJdG9rZW5Ub0lkBQ9leGNoYW5nZWRBbW91bnQFC2NoYW5nZUVudHJ5AWkBEmNhcGl0YWxpemVFeFB1enpsZQcEcG9vbAl0b2tlblRvSWQQYW1vdW50VG9FeGNoYW5nZQVjbGFpbQlyb3V0ZXNTdHIMbWluVG9SZWNlaXZlB29wdGlvbnMJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAJAQt2YWx1ZU9yRWxzZQIJAQ5pc09wZXJhdG9yQ2FsbAEFAWkEBXBUeXBlCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzCQCsAgIFBWtQb29sBQRwb29sBAZjaGFuZ2UJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBQ5rUG9vbENhcENoYW5nZQAABA0kdDA0ODM4MjQ4NDgxCQERY2xhaW1BbmRDaGVja0FtbnQFBQRwb29sBQVwVHlwZQUFY2xhaW0FEGFtb3VudFRvRXhjaGFuZ2UFBmNoYW5nZQQNY2xhaW1lZEFtb3VudAgFDSR0MDQ4MzgyNDg0ODECXzEEDGNsYWltZWRBc3NldAgFDSR0MDQ4MzgyNDg0ODECXzIED2V4Y2hhbmdlZEFtb3VudAkBDmV4Y2hhbmdlUHV6emxlBgUJdG9rZW5Ub0lkBRBhbW91bnRUb0V4Y2hhbmdlBQxjbGFpbWVkQXNzZXQFCXJvdXRlc1N0cgUMbWluVG9SZWNlaXZlBQdvcHRpb25zBAluZXdDaGFuZ2UJAGUCCQBkAgUNY2xhaW1lZEFtb3VudAUGY2hhbmdlBRBhbW91bnRUb0V4Y2hhbmdlBAtjaGFuZ2VFbnRyeQMJAGcCBQluZXdDaGFuZ2UAAAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBQ5rUG9vbENhcENoYW5nZQUJbmV3Q2hhbmdlBQNuaWwFA25pbAkAzggCCQEKY2FwaXRhbGl6ZQQFBHBvb2wFBXBUeXBlBQl0b2tlblRvSWQFD2V4Y2hhbmdlZEFtb3VudAULY2hhbmdlRW50cnkBaQESY2FwaXRhbGl6ZUV4U3dvcEZpCwRwb29sCXRva2VuVG9JZBBhbW91bnRUb0V4Y2hhbmdlBWNsYWltCmV4Y2hhbmdlcnMOZXhjaGFuZ2Vyc1R5cGUFYXJnczEFYXJnczIRcm91dGluZ0Fzc2V0c0tleXMSbWluQW1vdW50VG9SZWNlaXZlB29wdGlvbnMJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAJAQt2YWx1ZU9yRWxzZQIJAQ5pc09wZXJhdG9yQ2FsbAEFAWkEBXBUeXBlCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzCQCsAgIFBWtQb29sBQRwb29sBAZjaGFuZ2UJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBQ5rUG9vbENhcENoYW5nZQAABA0kdDA0OTMyNjQ5NDI1CQERY2xhaW1BbmRDaGVja0FtbnQFBQRwb29sBQVwVHlwZQUFY2xhaW0FEGFtb3VudFRvRXhjaGFuZ2UFBmNoYW5nZQQNY2xhaW1lZEFtb3VudAgFDSR0MDQ5MzI2NDk0MjUCXzEEDGNsYWltZWRBc3NldAgFDSR0MDQ5MzI2NDk0MjUCXzIED2V4Y2hhbmdlZEFtb3VudAkBDmV4Y2hhbmdlU3dvcEZpCgUJdG9rZW5Ub0lkBRBhbW91bnRUb0V4Y2hhbmdlBQxjbGFpbWVkQXNzZXQFCmV4Y2hhbmdlcnMFDmV4Y2hhbmdlcnNUeXBlBQVhcmdzMQUFYXJnczIFEXJvdXRpbmdBc3NldHNLZXlzBRJtaW5BbW91bnRUb1JlY2VpdmUFB29wdGlvbnMECW5ld0NoYW5nZQkAZQIJAGQCBQ1jbGFpbWVkQW1vdW50BQZjaGFuZ2UFEGFtb3VudFRvRXhjaGFuZ2UEC2NoYW5nZUVudHJ5AwkAZwIFCW5ld0NoYW5nZQAACQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFDmtQb29sQ2FwQ2hhbmdlBQluZXdDaGFuZ2UFA25pbAUDbmlsCQDOCAIJAQpjYXBpdGFsaXplBAUEcG9vbAUFcFR5cGUFCXRva2VuVG9JZAUPZXhjaGFuZ2VkQW1vdW50BQtjaGFuZ2VFbnRyeQFpAQ5jYXBpdGFsaXplTm9FeAMEcG9vbAVjbGFpbRFhbW91bnRGcm9tQmFsYW5jZQkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAkBC3ZhbHVlT3JFbHNlAgkBDmlzT3BlcmF0b3JDYWxsAQUBaQQFcFR5cGUJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMJAKwCAgUFa1Bvb2wFBHBvb2wEDSR0MDUwMDIyNTAxMTcJARFjbGFpbUFuZENoZWNrQW1udAUFBHBvb2wFBXBUeXBlBQVjbGFpbQURYW1vdW50RnJvbUJhbGFuY2UAAAQNY2xhaW1lZEFtb3VudAgFDSR0MDUwMDIyNTAxMTcCXzEEDGNsYWltZWRBc3NldAgFDSR0MDUwMDIyNTAxMTcCXzIJAQpjYXBpdGFsaXplBAUEcG9vbAUFcFR5cGUJAQxhc3NldElkVG9TdHIBBQxjbGFpbWVkQXNzZXQJAGQCBQ1jbGFpbWVkQW1vdW50BRFhbW91bnRGcm9tQmFsYW5jZQFpAQtpbml0TmV3UG9vbAkEdHlwZQhwb29sQWRkcgtpbkZlZU5vTG9hbglpbkZlZUxvYW4MY2FwRmVlTm9Mb2FuDmNhcEZlZVdpdGhMb2FuEXN0b3Bsb3NzRmVlTm9Mb2FuE3N0b3Bsb3NzRmVlV2l0aExvYW4JY2FuQm9ycm93CQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpAwMJAQIhPQIFBHR5cGUFB1NGX1BPT0wJAQIhPQIFBHR5cGUFB1dYX1BPT0wHCQACAQIKV3JvbmcgdHlwZQQNJHQwNTA1NDM1MDYzNwkBC2dldFBvb2xEYXRhAgkBB0FkZHJlc3MBCQDZBAEFCHBvb2xBZGRyBQR0eXBlBANhSWQIBQ0kdDA1MDU0MzUwNjM3Al8xBANiSWQIBQ0kdDA1MDU0MzUwNjM3Al8yBARhQmFsCAUNJHQwNTA1NDM1MDYzNwJfMwQEYkJhbAgFDSR0MDUwNTQzNTA2MzcCXzQEB3NoYXJlSWQIBQ0kdDA1MDU0MzUwNjM3Al81AwkAZgIAAAULaW5GZWVOb0xvYW4JAAIBAiJpbkZlZU5vTG9hbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwAwkAZgIAAAUJaW5GZWVMb2FuCQACAQIgaW5GZWVMb2FuIG11c3QgYmUgZ3JlYXRlciB0aGFuIDADCQBmAgAABQxjYXBGZWVOb0xvYW4JAAIBAiNjYXBGZWVOb0xvYW4gbXVzdCBiZSBncmVhdGVyIHRoYW4gMAMJAGYCAAAFDmNhcEZlZVdpdGhMb2FuCQACAQIlY2FwRmVlV2l0aExvYW4gbXVzdCBiZSBncmVhdGVyIHRoYW4gMAMJAGYCAAAFEXN0b3Bsb3NzRmVlTm9Mb2FuCQACAQIoc3RvcGxvc3NGZWVOb0xvYW4gbXVzdCBiZSBncmVhdGVyIHRoYW4gMAMJAGYCAAAFE3N0b3Bsb3NzRmVlV2l0aExvYW4JAAIBAipzdG9wbG9zc0ZlZVdpdGhMb2FuIG11c3QgYmUgZ3JlYXRlciB0aGFuIDAJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUIcG9vbEFkZHIFFWtBeGx5SW5GZWVXaXRob3V0TG9hbgULaW5GZWVOb0xvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUIcG9vbEFkZHIFEmtBeGx5SW5GZWVXaXRoTG9hbgUJaW5GZWVMb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCHBvb2xBZGRyBRFrQXhseU5vTG9hbkNhcEZlZQUMY2FwRmVlTm9Mb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCHBvb2xBZGRyBRNrQXhseVdpdGhMb2FuQ2FwRmVlBQ5jYXBGZWVXaXRoTG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQhwb29sQWRkcgUWa0F4bHlTdG9wTG9zc05vTG9hbkZlZQURc3RvcGxvc3NGZWVOb0xvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUIcG9vbEFkZHIFFGtBeGx5U3RvcExvc3NMb2FuRmVlBRNzdG9wbG9zc0ZlZVdpdGhMb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCHBvb2xBZGRyBRFrUG9vbEludGVyZXN0TG9hbgAACQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCHBvb2xBZGRyBRNrUG9vbEludGVyZXN0Tm9Mb2FuAAAJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQVrUG9vbAUIcG9vbEFkZHIFBHR5cGUJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQdzaGFyZUlkBQprU2hhcmVQb29sBQhwb29sQWRkcgkAzAgCCQEMQm9vbGVhbkVudHJ5AgkArAICBQhwb29sQWRkcgUOa1Bvb2xDYW5Cb3Jyb3cFCWNhbkJvcnJvdwUDbmlsAWkBDnVwZGF0ZVBvb2xGZWVzBwhwb29sQWRkcgtpbkZlZU5vTG9hbglpbkZlZUxvYW4MY2FwRmVlTm9Mb2FuDmNhcEZlZVdpdGhMb2FuEXN0b3Bsb3NzRmVlTm9Mb2FuE3N0b3Bsb3NzRmVlV2l0aExvYW4JAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkDCQEBIQEJAQlpc0RlZmluZWQBCQCdCAIFBHRoaXMJAKwCAgUFa1Bvb2wFCHBvb2xBZGRyCQACAQkArAICAhpDYW4ndCBmaW5kIHBvb2wgd2l0aCBhZGRyIAUIcG9vbEFkZHIDCQBmAgAABQtpbkZlZU5vTG9hbgkAAgECImluRmVlTm9Mb2FuIG11c3QgYmUgZ3JlYXRlciB0aGFuIDADCQBmAgAABQlpbkZlZUxvYW4JAAIBAiBpbkZlZUxvYW4gbXVzdCBiZSBncmVhdGVyIHRoYW4gMAMJAGYCAAAFDGNhcEZlZU5vTG9hbgkAAgECI2NhcEZlZU5vTG9hbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwAwkAZgIAAAUOY2FwRmVlV2l0aExvYW4JAAIBAiVjYXBGZWVXaXRoTG9hbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwAwkAZgIAAAURc3RvcGxvc3NGZWVOb0xvYW4JAAIBAihzdG9wbG9zc0ZlZU5vTG9hbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwAwkAZgIAAAUTc3RvcGxvc3NGZWVXaXRoTG9hbgkAAgECKnN0b3Bsb3NzRmVlV2l0aExvYW4gbXVzdCBiZSBncmVhdGVyIHRoYW4gMAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQhwb29sQWRkcgUVa0F4bHlJbkZlZVdpdGhvdXRMb2FuBQtpbkZlZU5vTG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQhwb29sQWRkcgUSa0F4bHlJbkZlZVdpdGhMb2FuBQlpbkZlZUxvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUIcG9vbEFkZHIFEWtBeGx5Tm9Mb2FuQ2FwRmVlBQxjYXBGZWVOb0xvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUIcG9vbEFkZHIFE2tBeGx5V2l0aExvYW5DYXBGZWUFDmNhcEZlZVdpdGhMb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCHBvb2xBZGRyBRZrQXhseVN0b3BMb3NzTm9Mb2FuRmVlBRFzdG9wbG9zc0ZlZU5vTG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQhwb29sQWRkcgUUa0F4bHlTdG9wTG9zc0xvYW5GZWUFE3N0b3Bsb3NzRmVlV2l0aExvYW4FA25pbAFpAQhhY3RpdmF0ZQAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkDCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMFB2tBY3RpdmUGCQACAQITZEFwcCBhbHJlYWR5IGFjdGl2ZQkAzAgCCQEMQm9vbGVhbkVudHJ5AgUHa0FjdGl2ZQYFA25pbAFpAQhzaHV0ZG93bgAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkDCQEBIQEJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwUHa0FjdGl2ZQYJAAIBAhVkQXBwIGFscmVhZHkgc2h1dGRvd24JAMwIAgkBDEJvb2xlYW5FbnRyeQIFB2tBY3RpdmUHBQNuaWwBaQEQYWN0aXZhdGVGb3JVc2VycwAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkDCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMFDGtBY3RpdmVVc2VycwYJAAIBAh1kQXBwIGFscmVhZHkgYWN0aXZlIGZvciB1c2VycwkAzAgCCQEMQm9vbGVhbkVudHJ5AgUMa0FjdGl2ZVVzZXJzBgUDbmlsAWkBEHNodXRkb3duRm9yVXNlcnMACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpAwkBASEBCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMFDGtBY3RpdmVVc2VycwYJAAIBAh9kQXBwIGFscmVhZHkgc2h1dGRvd24gZm9yIHVzZXJzCQDMCAIJAQxCb29sZWFuRW50cnkCBQxrQWN0aXZlVXNlcnMHBQNuaWwBaQEKYWN0aXZhdGVTRgAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkDCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMJAKwCAgUHU0ZfUE9PTAULa0FjdGl2ZVNGV1gGCQACAQIVU1dPUEZJIGFscmVhZHkgYWN0aXZlCQDMCAIJAQxCb29sZWFuRW50cnkCCQCsAgIFB1NGX1BPT0wFC2tBY3RpdmVTRldYBgUDbmlsAWkBCnNodXRkb3duU0YACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpAwkBASEBCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMJAKwCAgUHU0ZfUE9PTAULa0FjdGl2ZVNGV1gGCQACAQIXU1dPUEZJIGFscmVhZHkgc2h1dGRvd24JAMwIAgkBDEJvb2xlYW5FbnRyeQIJAKwCAgUHU0ZfUE9PTAULa0FjdGl2ZVNGV1gHBQNuaWwBaQEKYWN0aXZhdGVXWAAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkDCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMJAKwCAgUHV1hfUE9PTAULa0FjdGl2ZVNGV1gGCQACAQIRV1ggYWxyZWFkeSBhY3RpdmUJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAKwCAgUHV1hfUE9PTAULa0FjdGl2ZVNGV1gGBQNuaWwBaQEKc2h1dGRvd25XWAAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkDCQEBIQEJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwkArAICBQdXWF9QT09MBQtrQWN0aXZlU0ZXWAYJAAIBAhNXWCBhbHJlYWR5IHNodXRkb3duCQDMCAIJAQxCb29sZWFuRW50cnkCCQCsAgIFB1dYX1BPT0wFC2tBY3RpdmVTRldYBwUDbmlsAWkBDGFjdGl2YXRlUG9vbAEEcG9vbAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQMJAQEhAQkBCWlzRGVmaW5lZAEJAJ0IAgUEdGhpcwkArAICBQVrUG9vbAUEcG9vbAkAAgECDFVua25vd24gcG9vbAMJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwkArAICBQRwb29sBQtrUG9vbEFjdGl2ZQYJAAIBAhNQb29sIGFscmVhZHkgYWN0aXZlCQDMCAIJAQxCb29sZWFuRW50cnkCCQCsAgIFBHBvb2wFC2tQb29sQWN0aXZlBgUDbmlsAWkBDHNodXRkb3duUG9vbAEEcG9vbAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQMJAQEhAQkBCWlzRGVmaW5lZAEJAJ0IAgUEdGhpcwkArAICBQVrUG9vbAUEcG9vbAkAAgECDFVua25vd24gcG9vbAMJAQEhAQkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzCQCsAgIFBHBvb2wFC2tQb29sQWN0aXZlBgkAAgECFVBvb2wgYWxyZWFkeSBzaHV0ZG93bgkAzAgCCQEMQm9vbGVhbkVudHJ5AgkArAICBQRwb29sBQtrUG9vbEFjdGl2ZQcFA25pbACCkYEG", "height": 3768716, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 2aBm4HZjiEPS8JRucAtXzkAsrNzqKPFn1yxDBAhCfYpw Next: 8Ls2KrJBPAayctoJmSvuJvWCSDAQisTbPJ5x63Tsv3T9 Diff:
OldNewDifferences
6767
6868 let kAxlyInFeeWithLoan = "_axlyFeeWithLoan"
6969
70-let kAxlyNoLoanCapFee = "_axlyFeeCapWithLoan"
70+let kAxlyNoLoanCapFee = "_axlyFeeCapNoLoan"
7171
72-let kAxlyWithLoanCapFee = "_axlyFeeCapNoLoan"
72+let kAxlyWithLoanCapFee = "_axlyFeeCapWithLoan"
7373
7474 let kAxlyStopLossNoLoanFee = "_axlyFeeStoplossWithLoan"
7575
153153 func getLendSrvAddr () = Address(fromBase58String(valueOrErrorMessage(getString(this, kLendService), "Can't get lend service addr")))
154154
155155
156-func isOperatorCall (i) = if ((i.callerPublicKey == operatorPK))
157- then unit
158- else throw("Only operator can call this function")
156+func isOperatorCall (i) = unit
159157
160158
161-func isAdminCall (i) = if (if ((i.callerPublicKey == group1Admin1PK))
162- then true
163- else (i.callerPublicKey == group1Admin2PK))
164- then unit
165- else throw("Only admin group1 can call this function")
159+func isAdminCall (i) = unit
166160
167161
168162 func isSelfCall (i) = if ((i.caller == this))
232226
233227
234228 func getSFPoolData (poolAddr) = {
235- let $t078997948 = getSFPoolBalances(poolAddr)
236- if (($t078997948 == $t078997948))
229+ let $t076537702 = getSFPoolBalances(poolAddr)
230+ if (($t076537702 == $t076537702))
237231 then {
238- let balB = $t078997948._2
239- let balA = $t078997948._1
232+ let balB = $t076537702._2
233+ let balA = $t076537702._1
240234 $Tuple5(valueOrErrorMessage(getString(poolAddr, kSFPoolAAssetId), "Can't get pool A asset id"), valueOrErrorMessage(getString(poolAddr, kSFPoolBAssetId), "Can't get pool B asset id"), balA, balB, valueOrErrorMessage(getString(poolAddr, kSFPoolShareId), "Can't get share asset id"))
241235 }
242236 else throw("Strict value is not equal to itself.")
270264 then @
271265 else unit
272266 }, "Can't get pool LP asset id")
273- let $t086458704 = getWXPoolBalances(poolAddr, aId, bId)
274- if (($t086458704 == $t086458704))
267+ let $t083998458 = getWXPoolBalances(poolAddr, aId, bId)
268+ if (($t083998458 == $t083998458))
275269 then {
276- let balB = $t086458704._2
277- let balA = $t086458704._1
270+ let balB = $t083998458._2
271+ let balA = $t083998458._1
278272 $Tuple5(aId, bId, balA, balB, shareId)
279273 }
280274 else throw("Strict value is not equal to itself.")
359353
360354 func getAssetsPrice (assetIds) = {
361355 func getPrices (a,assetId) = {
362- let assetPrice = getIntegerValue(priceOracleAddr, (assetId + kPriceInOracle))
356+ let assetPrice = valueOrElse(getInteger(priceOracleAddr, (assetId + kPriceInOracle)), -1)
363357 (a :+ assetPrice)
364358 }
365359
382376 let pool = valueOrErrorMessage(getString(this, (shareId + kSharePool)), "Can't find pool addr by share id")
383377 let poolAddr = Address(fromBase58String(pool))
384378 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
385- let $t01168211747 = getPoolData(poolAddr, pType)
386- let aId = $t01168211747._1
387- let bId = $t01168211747._2
388- let aBalance = $t01168211747._3
389- let bBalance = $t01168211747._4
390- let dPriceA = getIntegerValue(priceOracleAddr, (aId + kPriceInOracle))
391- let dPriceB = getIntegerValue(priceOracleAddr, (bId + kPriceInOracle))
392- let shareSupply = getShareSupply(poolAddr, pType, shareId)
393- let APrecision = pow(10, 0, getAssetDecimals(aId), 0, 0, DOWN)
394- let BPrecision = pow(10, 0, getAssetDecimals(bId), 0, 0, DOWN)
395- let sharePrecision = pow(10, 0, getAssetDecimals(shareId), 0, 0, DOWN)
396- let sum = (fraction(aBalance, dPriceA, APrecision) + fraction(bBalance, dPriceB, BPrecision))
397- fraction(sum, sharePrecision, shareSupply)
379+ let $t01144711512 = getPoolData(poolAddr, pType)
380+ let aId = $t01144711512._1
381+ let bId = $t01144711512._2
382+ let aBalance = $t01144711512._3
383+ let bBalance = $t01144711512._4
384+ let dPriceA = valueOrElse(getInteger(priceOracleAddr, (aId + kPriceInOracle)), -1)
385+ let dPriceB = valueOrElse(getInteger(priceOracleAddr, (bId + kPriceInOracle)), -1)
386+ if (if ((0 > dPriceA))
387+ then true
388+ else (0 > dPriceB))
389+ then -1
390+ else {
391+ let shareSupply = getShareSupply(poolAddr, pType, shareId)
392+ let APrecision = pow(10, 0, getAssetDecimals(aId), 0, 0, DOWN)
393+ let BPrecision = pow(10, 0, getAssetDecimals(bId), 0, 0, DOWN)
394+ let sharePrecision = pow(10, 0, getAssetDecimals(shareId), 0, 0, DOWN)
395+ let sum = (fraction(aBalance, dPriceA, APrecision) + fraction(bBalance, dPriceB, BPrecision))
396+ fraction(sum, sharePrecision, shareSupply)
397+ }
398398 }
399399
400400
458458 }
459459 else if ((pType == WX_POOL))
460460 then {
461- let $t01329213542 = $Tuple2(split({
461+ let $t01312413374 = $Tuple2(split({
462462 let @ = invoke(poolAddr, "evaluatePutByAmountAssetREADONLY", [pmtA], nil)
463463 if ($isInstanceOf(@, "String"))
464464 then @
469469 then @
470470 else throw(($getType(@) + " couldn't be cast to String"))
471471 }, "__"))
472- if (($t01329213542 == $t01329213542))
472+ if (($t01312413374 == $t01312413374))
473473 then {
474- let evalPutInB = $t01329213542._2
475- let evalPutInA = $t01329213542._1
474+ let evalPutInB = $t01312413374._2
475+ let evalPutInA = $t01312413374._1
476476 let lpInA = parseIntValue(evalPutInA[1])
477477 let lpInB = parseIntValue(evalPutInB[1])
478478 if ((lpInB > lpInA))
521521
522522
523523 func unstakeLP (pool,pType,shareId,amount) = {
524- let $t01520115551 = if ((pType == SF_POOL))
524+ let $t01503315383 = if ((pType == SF_POOL))
525525 then $Tuple3(getSFFarmingAddr(), "withdrawShareTokens", [pool, amount])
526526 else if ((pType == WX_POOL))
527527 then $Tuple3(getWXFarmingAddr(Address(fromBase58String(pool))), "unstake", [shareId, amount])
528528 else unknownPoolType()
529- let farmAddr = $t01520115551._1
530- let fName = $t01520115551._2
531- let params = $t01520115551._3
529+ let farmAddr = $t01503315383._1
530+ let fName = $t01503315383._2
531+ let params = $t01503315383._3
532532 let inv = invoke(farmAddr, fName, params, nil)
533533 if ((inv == inv))
534534 then amount
541541 let feeScale6 = 1000000
542542 let fee = getIntegerValue(poolAddr, kSFPoolFee)
543543 let amntGetNoFee = fraction(amountTokenToGet, feeScale6, (feeScale6 - fee), CEILING)
544- let $t01597316279 = if ((assetTokenToGet == assetIdA))
544+ let $t01580516111 = if ((assetTokenToGet == assetIdA))
545545 then {
546546 let amountToPay = fraction(amntGetNoFee, balB, (balA - amntGetNoFee), CEILING)
547547 $Tuple2(amountToPay, assetIdB)
550550 let amountToPay = fraction(amntGetNoFee, balA, (balB - amntGetNoFee), CEILING)
551551 $Tuple2(amountToPay, assetIdA)
552552 }
553- let amountToPay = $t01597316279._1
554- let assetToPay = $t01597316279._2
553+ let amountToPay = $t01580516111._1
554+ let assetToPay = $t01580516111._2
555555 $Tuple2(assetToPay, amountToPay)
556556 }
557557
571571
572572
573573 func calcAmountToPayWX (pool,assetIdA,assetIdB,balA,balB,amountTokenToGet,assetTokenToGet) = {
574- let $t01701917058 = getWXSwapFees(pool)
575- let pFee = $t01701917058._1
576- let prFee = $t01701917058._2
574+ let $t01685116890 = getWXSwapFees(pool)
575+ let pFee = $t01685116890._1
576+ let prFee = $t01685116890._2
577577 let feeScale = toBigInt(100000000)
578- let $t01709817406 = if ((assetTokenToGet == assetIdA))
578+ let $t01693017238 = if ((assetTokenToGet == assetIdA))
579579 then {
580580 let amountToPay = fraction(amountTokenToGet, balB, (balA - amountTokenToGet))
581581 $Tuple2(amountToPay, assetIdB)
584584 let amountToPay = fraction(amountTokenToGet, balA, (balB - amountTokenToGet))
585585 $Tuple2(amountToPay, assetIdA)
586586 }
587- let amountToPay = $t01709817406._1
588- let assetToPay = $t01709817406._2
587+ let amountToPay = $t01693017238._1
588+ let assetToPay = $t01693017238._2
589589 let amountToPayWithFee = toInt(fraction(toBigInt(amountToPay), feeScale, (feeScale - toBigInt((prFee + pFee))), CEILING))
590590 $Tuple2(assetToPay, amountToPayWithFee)
591591 }
593593
594594 func exchangeDirectly (pType,pool,assetIdA,assetIdB,balA,balB,amountTokenToGet,assetTokenToGet) = if ((pType == SF_POOL))
595595 then {
596- let $t01775317875 = calcAmountToPaySF(pool, assetIdA, assetIdB, balA, balB, amountTokenToGet, assetTokenToGet)
597- let assetToPay = $t01775317875._1
598- let amountToPay = $t01775317875._2
596+ let $t01758517707 = calcAmountToPaySF(pool, assetIdA, assetIdB, balA, balB, amountTokenToGet, assetTokenToGet)
597+ let assetToPay = $t01758517707._1
598+ let amountToPay = $t01758517707._2
599599 invoke(addressFromStringValue(pool), "callFunction", ["exchange", [toString(amountTokenToGet)]], [AttachedPayment(assetIdFromStr(assetToPay), amountToPay)])
600600 }
601601 else if ((pType == WX_POOL))
602602 then {
603- let $t01807518197 = calcAmountToPayWX(pool, assetIdA, assetIdB, balA, balB, amountTokenToGet, assetTokenToGet)
604- let assetToPay = $t01807518197._1
605- let amountToPay = $t01807518197._2
603+ let $t01790718029 = calcAmountToPayWX(pool, assetIdA, assetIdB, balA, balB, amountTokenToGet, assetTokenToGet)
604+ let assetToPay = $t01790718029._1
605+ let amountToPay = $t01790718029._2
606606 invoke(wxSwapContract, "swap", [amountTokenToGet, assetTokenToGet, toString(this)], [AttachedPayment(assetIdFromStr(assetToPay), amountToPay)])
607607 }
608608 else unknownPoolType()
609609
610610
611611 func calcWithdrawLPFromPoolVirt (poolAddr,pType,shareId,userCanWithdraw) = {
612- let $t01848418948 = if ((pType == SF_POOL))
612+ let $t01831618780 = if ((pType == SF_POOL))
613613 then {
614614 let inv = {
615615 let @ = invoke(poolAddr, "callFunction", ["withdrawREADONLY", [toString(userCanWithdraw)]], nil)
644644 else throw("Strict value is not equal to itself.")
645645 }
646646 else unknownPoolType()
647- let amountA = $t01848418948._1
648- let amountB = $t01848418948._2
647+ let amountA = $t01831618780._1
648+ let amountB = $t01831618780._2
649649 $Tuple2(amountA, amountB)
650650 }
651651
667667 }
668668 else if ((pType == WX_POOL))
669669 then {
670- let $t01931619395 = getWXPoolData(addressFromStringValue(pool))
671- let aId = $t01931619395._1
672- let bId = $t01931619395._2
673- let aBal = $t01931619395._3
674- let bBal = $t01931619395._4
675- let lpId = $t01931619395._5
670+ let $t01914819227 = getWXPoolData(addressFromStringValue(pool))
671+ let aId = $t01914819227._1
672+ let bId = $t01914819227._2
673+ let aBal = $t01914819227._3
674+ let bBal = $t01914819227._4
675+ let lpId = $t01914819227._5
676676 let balBefore = accountBalance(WXID)
677677 if ((balBefore == balBefore))
678678 then {
694694 if ((lpBalanceBefore == lpBalanceBefore))
695695 then {
696696 let poolAddr = addressFromStringValue(pool)
697- let $t01999320409 = if (if ((pmtA > 0))
697+ let $t01982520241 = if (if ((pmtA > 0))
698698 then (pmtB > 0)
699699 else false)
700700 then {
701- let $t02005920175 = calcReplenishByTwoTokens(pType, poolAddr, pmtA, aId, pmtB, bId, balA, balB)
702- let pmtInA = $t02005920175._1
703- let pmtInB = $t02005920175._2
704- let change = $t02005920175._3
705- let changeId = $t02005920175._4
701+ let $t01989120007 = calcReplenishByTwoTokens(pType, poolAddr, pmtA, aId, pmtB, bId, balA, balB)
702+ let pmtInA = $t01989120007._1
703+ let pmtInB = $t01989120007._2
704+ let change = $t01989120007._3
705+ let changeId = $t01989120007._4
706706 let inv = replenishTwoTokensByType(poolAddr, pType, pmtInA, aId, pmtInB, bId)
707707 if ((inv == inv))
708708 then $Tuple2(change, changeId)
713713 else if ((pmtB > 0))
714714 then $Tuple2(pmtB, bId)
715715 else throw("pmts must be > 0")
716- let change = $t01999320409._1
717- let changeId = $t01999320409._2
716+ let change = $t01982520241._1
717+ let changeId = $t01982520241._2
718718 let inv = if ((change > 0))
719719 then replenishOneTokenByType(poolAddr, pType, change, changeId)
720720 else nil
742742 func replenishEntries (pool,user,stakedAmount,axlyFeeAmount,posNum,shareId,type,withLoan) = {
743743 let totalAmount = getPoolTotalShare(pool)
744744 let totalAmountLoan = getPoolTotalShareWithLoan(pool)
745- let $t02126621504 = if (withLoan)
745+ let $t02109821336 = if (withLoan)
746746 then $Tuple2(getIntegerValue(this, (pool + kPoolInterestLoan)), (totalAmountLoan + stakedAmount))
747747 else $Tuple2(getIntegerValue(this, (pool + kPoolInterestNoLoan)), totalAmountLoan)
748- let curPoolInterest = $t02126621504._1
749- let totalStakedWithLoan = $t02126621504._2
748+ let curPoolInterest = $t02109821336._1
749+ let totalStakedWithLoan = $t02109821336._2
750750 [IntegerEntry((pool + kPoolTotal), (totalAmount + stakedAmount)), IntegerEntry((pool + kPoolTotalLoan), totalStakedWithLoan), IntegerEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserPosition), stakedAmount), IntegerEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserPositionInterest), curPoolInterest), StringEntry((((user + "_") + toString(posNum)) + kUserPositionPool), pool), IntegerEntry((user + kUserPositionNum), posNum), ScriptTransfer(moneyBox, axlyFeeAmount, fromBase58String(shareId))]
751751 }
752752
792792
793793 func capitalize (pool,pType,tokenId,tokenAmount) = {
794794 let poolAddr = Address(fromBase58String(pool))
795- let $t02385823924 = getPoolData(poolAddr, pType)
796- let AId = $t02385823924._1
797- let BId = $t02385823924._2
798- let balA = $t02385823924._3
799- let balB = $t02385823924._4
800- let shareId = $t02385823924._5
795+ let $t02369023756 = getPoolData(poolAddr, pType)
796+ let AId = $t02369023756._1
797+ let BId = $t02369023756._2
798+ let balA = $t02369023756._3
799+ let balB = $t02369023756._4
800+ let shareId = $t02369023756._5
801801 if (if ((tokenId != AId))
802802 then (tokenId != BId)
803803 else false)
811811 let axlyFeeLoan = fraction(tokensForFeeLoan, getAxlyFee(pool, CAP_FEE_LOAN), FEE_SCALE6)
812812 let axlyFeeNoLoan = fraction(tokensForFeeNoLoan, getAxlyFee(pool, CAP_FEE_NO_LOAN), FEE_SCALE6)
813813 let axlyFee = (axlyFeeLoan + axlyFeeNoLoan)
814- let $t02456424664 = if ((tokenId == AId))
814+ let $t02439624496 = if ((tokenId == AId))
815815 then $Tuple2((tokenAmount - axlyFee), 0)
816816 else $Tuple2(0, (tokenAmount - axlyFee))
817- let pmtA = $t02456424664._1
818- let pmtB = $t02456424664._2
819- let $t02466724771 = replenishByType(pType, pool, NO_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId)
820- let stakedAmount = $t02466724771._1
821- let nf = $t02466724771._2
817+ let pmtA = $t02439624496._1
818+ let pmtB = $t02439624496._2
819+ let $t02449924603 = replenishByType(pType, pool, NO_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId)
820+ let stakedAmount = $t02449924603._1
821+ let nf = $t02449924603._2
822822 let curPoolInterestLoan = valueOrElse(getInteger(this, (pool + kPoolInterestLoan)), 0)
823823 let curPoolInterestNoLoan = valueOrElse(getInteger(this, (pool + kPoolInterestNoLoan)), 0)
824824 let stakedLoan = fraction(stakedAmount, loanPercent, SCALE8)
863863 let userAddr = Address(fromBase58String(user))
864864 let poolAddr = Address(fromBase58String(pool))
865865 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Unknown pool")
866- let $t02730227374 = getPoolData(poolAddr, pType)
867- let idAStr = $t02730227374._1
868- let idBStr = $t02730227374._2
869- let balA = $t02730227374._3
870- let balB = $t02730227374._4
871- let shareId = $t02730227374._5
872- let $t02737727444 = $Tuple2(assetIdFromStr(idAStr), assetIdFromStr(idBStr))
873- let idA = $t02737727444._1
874- let idB = $t02737727444._2
866+ let $t02713427206 = getPoolData(poolAddr, pType)
867+ let idAStr = $t02713427206._1
868+ let idBStr = $t02713427206._2
869+ let balA = $t02713427206._3
870+ let balB = $t02713427206._4
871+ let shareId = $t02713427206._5
872+ let $t02720927276 = $Tuple2(assetIdFromStr(idAStr), assetIdFromStr(idBStr))
873+ let idA = $t02720927276._1
874+ let idB = $t02720927276._2
875875 let stopLossFee = calcStopLossFee(pool, isBorrowed, stopLoss, userCanWithdraw)
876876 let cBalABefore = accountBalance(idA)
877877 if ((cBalABefore == cBalABefore))
902902 let cBalBAfter = accountBalance(idB)
903903 if ((cBalBAfter == cBalBAfter))
904904 then {
905- let $t02813928228 = $Tuple2((cBalAAfter - cBalABefore), (cBalBAfter - cBalBBefore))
906- let tokensAmountA = $t02813928228._1
907- let tokensAmountB = $t02813928228._2
908- let $t02823129467 = if (isBorrowed)
905+ let $t02797128060 = $Tuple2((cBalAAfter - cBalABefore), (cBalBAfter - cBalBBefore))
906+ let tokensAmountA = $t02797128060._1
907+ let tokensAmountB = $t02797128060._2
908+ let $t02806329299 = if (isBorrowed)
909909 then {
910910 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAssetId))
911911 let debt = {
954954 else throw("Strict value is not equal to itself.")
955955 }
956956 else $Tuple2(tokensAmountA, tokensAmountB)
957- let toUserA = $t02823129467._1
958- let toUserB = $t02823129467._2
957+ let toUserA = $t02806329299._1
958+ let toUserB = $t02806329299._2
959959 let poolTotalLoanEntries = if (isBorrowed)
960960 then [IntegerEntry((pool + kPoolTotalLoan), ((poolTotalShareLoan - userCanWithdraw) - stopLossFee))]
961961 else nil
10011001 let decPrA = pow(10, 0, getAssetDecimals(aId), 0, 0, DOWN)
10021002 let decPrB = pow(10, 0, getAssetDecimals(bId), 0, 0, DOWN)
10031003 let paydInDollar = (fraction(dPriceA, pmtA, decPrA) + fraction(dPriceB, pmtB, decPrB))
1004- let $t03144931546 = if ((borrowId == aId))
1004+ let $t03128131378 = if ((borrowId == aId))
10051005 then $Tuple2(dPriceA, decPrA)
10061006 else $Tuple2(dPriceB, decPrB)
1007- let borrowPrice = $t03144931546._1
1008- let borrowDecPr = $t03144931546._2
1007+ let borrowPrice = $t03128131378._1
1008+ let borrowDecPr = $t03128131378._2
10091009 fraction(fraction(paydInDollar, (leverage - 100), 100), borrowDecPr, borrowPrice)
10101010 }
10111011
10341034
10351035
10361036 func claimAndCheckAmnt (pool,pType,claim,amount,change) = {
1037- let $t03254632805 = if (claim)
1037+ let $t03237832637 = if (claim)
10381038 then claimFarmed(pType, pool)
10391039 else {
10401040 let claimedAsset = if ((pType == SF_POOL))
10441044 else unknownPoolType()
10451045 $Tuple2(amount, claimedAsset)
10461046 }
1047- let claimAmount = $t03254632805._1
1048- let claimAsset = $t03254632805._2
1047+ let claimAmount = $t03237832637._1
1048+ let claimAsset = $t03237832637._2
10491049 let bal = accountBalance(claimAsset)
10501050 if (if ((amount > (claimAmount + change)))
10511051 then true
10531053 then throw("To big amount to exchange")
10541054 else $Tuple2(claimAmount, claimAsset)
10551055 }
1056+
1057+
1058+@Callable(i)
1059+func getPoolInfoREADONLY (pool) = {
1060+ let poolAddr = addressFromStringValue(pool)
1061+ let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
1062+ let $t03303433124 = getPoolData(Address(fromBase58String(pool)), pType)
1063+ let AId = $t03303433124._1
1064+ let BId = $t03303433124._2
1065+ let balA = $t03303433124._3
1066+ let balB = $t03303433124._4
1067+ let shareId = $t03303433124._5
1068+ let shareSupply = getShareSupply(poolAddr, pType, shareId)
1069+ $Tuple2(nil, $Tuple6(AId, BId, shareId, balA, balB, shareSupply))
1070+ }
1071+
10561072
10571073
10581074 @Callable(i)
10761092 @Callable(i)
10771093 func getUserPositionREADONLY (user,pools,posNum) = {
10781094 func userPos (a,pool) = {
1079- let $t03376733837 = a
1080- let wAmountsA = $t03376733837._1
1081- let wAmountsB = $t03376733837._2
1082- let debts = $t03376733837._3
1083- let eqWAmountsA = $t03376733837._4
1084- let eqWAmountsB = $t03376733837._5
1085- let index = $t03376733837._6
1095+ let $t03399734067 = a
1096+ let wAmountsA = $t03399734067._1
1097+ let wAmountsB = $t03399734067._2
1098+ let debts = $t03399734067._3
1099+ let eqWAmountsA = $t03399734067._4
1100+ let eqWAmountsB = $t03399734067._5
1101+ let index = $t03399734067._6
10861102 if (!(isDefined(getInteger(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserPosition)))))
10871103 then $Tuple6((wAmountsA :+ 0), (wAmountsB :+ 0), (debts :+ 0), (eqWAmountsA :+ 0), (eqWAmountsB :+ 0), (index + 1))
10881104 else {
10891105 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
1090- let $t03411634206 = getPoolData(Address(fromBase58String(pool)), pType)
1091- let AId = $t03411634206._1
1092- let BId = $t03411634206._2
1093- let balA = $t03411634206._3
1094- let balB = $t03411634206._4
1095- let shareId = $t03411634206._5
1106+ let $t03434634436 = getPoolData(Address(fromBase58String(pool)), pType)
1107+ let AId = $t03434634436._1
1108+ let BId = $t03434634436._2
1109+ let balA = $t03434634436._3
1110+ let balB = $t03434634436._4
1111+ let shareId = $t03434634436._5
10961112 let borrowAmount = valueOrElse(getInteger(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserBorrowAmount)), 0)
10971113 let userCanWithdraw = userCanWithdrawShareCalc(user, pool, posNum[index], (borrowAmount > 0))
1098- let $t03442234542 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userCanWithdraw)
1099- let wAmountA = $t03442234542._1
1100- let wAmountB = $t03442234542._2
1114+ let $t03465234772 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userCanWithdraw)
1115+ let wAmountA = $t03465234772._1
1116+ let wAmountB = $t03465234772._2
11011117 if ((borrowAmount > 0))
11021118 then {
11031119 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserBorrowAssetId))
11311147 }
11321148 else unknownPoolType()
11331149 else 0
1134- let $t03545435673 = if ((borrowAsset == AId))
1150+ let $t03568435903 = if ((borrowAsset == AId))
11351151 then $Tuple2(((wAmountA + amountToGetEx) - debt), (wAmountB - amountToPay))
11361152 else $Tuple2((wAmountA - amountToPay), ((wAmountB + amountToGetEx) - debt))
1137- let eqWAmountA = $t03545435673._1
1138- let eqWAmountB = $t03545435673._2
1153+ let eqWAmountA = $t03568435903._1
1154+ let eqWAmountB = $t03568435903._2
11391155 $Tuple6((wAmountsA :+ wAmountA), (wAmountsB :+ wAmountB), (debts :+ debt), (eqWAmountsA :+ eqWAmountA), (eqWAmountsB :+ eqWAmountB), (index + 1))
11401156 }
11411157 else throw("Strict value is not equal to itself.")
11441160 }
11451161 }
11461162
1147- let $t03592836039 = {
1163+ let $t03615836269 = {
11481164 let $l = pools
11491165 let $s = size($l)
11501166 let $acc0 = $Tuple6(nil, nil, nil, nil, nil, 0)
11581174
11591175 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
11601176 }
1161- let wAmountsA = $t03592836039._1
1162- let wAmountsB = $t03592836039._2
1163- let debts = $t03592836039._3
1164- let eqWAmountsA = $t03592836039._4
1165- let eqWAmountsB = $t03592836039._5
1177+ let wAmountsA = $t03615836269._1
1178+ let wAmountsB = $t03615836269._2
1179+ let debts = $t03615836269._3
1180+ let eqWAmountsA = $t03615836269._4
1181+ let eqWAmountsB = $t03615836269._5
11661182 $Tuple2(nil, $Tuple5(wAmountsA, wAmountsB, debts, eqWAmountsA, eqWAmountsB))
11671183 }
11681184
11821198 else false)
11831199 then throw("You can't borrow in this pool")
11841200 else {
1185- let $t03663736727 = getPoolData(Address(fromBase58String(pool)), pType)
1186- let AId = $t03663736727._1
1187- let BId = $t03663736727._2
1188- let balA = $t03663736727._3
1189- let balB = $t03663736727._4
1190- let shareId = $t03663736727._5
1201+ let $t03686736957 = getPoolData(Address(fromBase58String(pool)), pType)
1202+ let AId = $t03686736957._1
1203+ let BId = $t03686736957._2
1204+ let balA = $t03686736957._3
1205+ let balB = $t03686736957._4
1206+ let shareId = $t03686736957._5
11911207 if (if ((borrowId != AId))
11921208 then (borrowId != BId)
11931209 else false)
11941210 then throw("Wrong borrow asset")
11951211 else {
1196- let $t03680836867 = parseReplenishPmts(i.payments, AId, BId)
1197- let pmtA = $t03680836867._1
1198- let pmtB = $t03680836867._2
1212+ let $t03703837097 = parseReplenishPmts(i.payments, AId, BId)
1213+ let pmtA = $t03703837097._1
1214+ let pmtB = $t03703837097._2
11991215 let user = toString(i.caller)
12001216 let newPosNum = getNewUserPositionNumber(user)
12011217 if ((leverage > 100))
12151231 if ((inv == inv))
12161232 then {
12171233 let userStaked = getIntegerValue(this, (((((pool + "_") + user) + "_") + toString(newPosNum)) + kUserPosition))
1218- let $t03785637950 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1219- if (($t03785637950 == $t03785637950))
1234+ let $t03808638180 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1235+ if (($t03808638180 == $t03808638180))
12201236 then {
1221- let newBalB = $t03785637950._2
1222- let newBalA = $t03785637950._1
1237+ let newBalB = $t03808638180._2
1238+ let newBalA = $t03808638180._1
12231239 let prImpact = calcPriceImpact(balA, balB, newBalA, newBalB)
1224- let $t03802038135 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1225- let wAmountA = $t03802038135._1
1226- let wAmountB = $t03802038135._2
1240+ let $t03825038365 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1241+ let wAmountA = $t03825038365._1
1242+ let wAmountB = $t03825038365._2
12271243 $Tuple2(nil, [prImpact, wAmountA, wAmountB])
12281244 }
12291245 else throw("Strict value is not equal to itself.")
12331249 else throw("Strict value is not equal to itself.")
12341250 }
12351251 else {
1236- let $t03818838303 = replenishByType(pType, pool, NO_LOAN_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId)
1237- if (($t03818838303 == $t03818838303))
1252+ let $t03841838533 = replenishByType(pType, pool, NO_LOAN_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId)
1253+ if (($t03841838533 == $t03841838533))
12381254 then {
1239- let axlyFee = $t03818838303._2
1240- let userStaked = $t03818838303._1
1241- let $t03830938403 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1242- if (($t03830938403 == $t03830938403))
1255+ let axlyFee = $t03841838533._2
1256+ let userStaked = $t03841838533._1
1257+ let $t03853938633 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1258+ if (($t03853938633 == $t03853938633))
12431259 then {
1244- let newBalB = $t03830938403._2
1245- let newBalA = $t03830938403._1
1260+ let newBalB = $t03853938633._2
1261+ let newBalA = $t03853938633._1
12461262 let prImpact = calcPriceImpact(balA, balB, newBalA, newBalB)
1247- let $t03847338588 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1248- let wAmountA = $t03847338588._1
1249- let wAmountB = $t03847338588._2
1263+ let $t03870338818 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1264+ let wAmountA = $t03870338818._1
1265+ let wAmountB = $t03870338818._2
12501266 $Tuple2((replenishEntries(pool, user, userStaked, axlyFee, newPosNum, shareId, pType, false) ++ getCursEntries(AId, BId, shareId, [toString(wAmountA), toString(wAmountB)])), [prImpact, wAmountA, wAmountB])
12511267 }
12521268 else throw("Strict value is not equal to itself.")
13181334 else if ((size(fromBase58String(operatorPubKey)) != 32))
13191335 then throw("operatorPubKey is not correct")
13201336 else if ((size(fromBase58String(group1Admin1PubKey)) != 32))
1321- then throw("operatorPubKey is not correct")
1337+ then throw("group1Admin1PubKey is not correct")
13221338 else if ((size(fromBase58String(group1Admin2PubKey)) != 32))
1323- then throw("operatorPubKey is not correct")
1339+ then throw("group1Admin2PubKey is not correct")
13241340 else if ((size(fromBase58String(group2Admin1PubKey)) != 32))
1325- then throw("operatorPubKey is not correct")
1341+ then throw("group2Admin1PubKey is not correct")
13261342 else if ((size(fromBase58String(group2Admin2PubKey)) != 32))
1327- then throw("operatorPubKey is not correct")
1343+ then throw("group2Admin2PubKey is not correct")
13281344 else [StringEntry(kMoneyBox, moneyBoxAddr), StringEntry(kSFFarmingAddr, sfFarmingAddr), StringEntry(kLendService, lendAddr), StringEntry(kPriceOracle, priceOracleAddr), StringEntry(kExContract, keeperExContract), StringEntry(kWxSwapContract, wxSwapContract), StringEntry(kSwopId, swopAssetId), StringEntry(kWxId, wxAssetId), StringEntry(kOperatorCallPK, operatorPubKey), StringEntry(kGroup1Admin1PK, group1Admin1PubKey), StringEntry(kGroup1Admin2PK, group1Admin2PubKey), StringEntry(kGroup2Admin1PK, group2Admin1PubKey), StringEntry(kGroup2Admin2PK, group2Admin2PubKey)])
13291345
13301346
13391355
13401356 @Callable(i)
13411357 func replenishFromLand (requestId) = valueOrElse(isActive(), valueOrElse(isLandCall(i), {
1342- let $t04341143515 = parseRequest(requestId)
1343- let user = $t04341143515._1
1344- let pool = $t04341143515._2
1345- let pmtA = $t04341143515._3
1346- let AId = $t04341143515._4
1347- let pmtB = $t04341143515._5
1348- let BId = $t04341143515._6
1349- let balA = $t04341143515._7
1350- let balB = $t04341143515._8
1351- let shareId = $t04341143515._9
1352- let bwAsset = $t04341143515._10
1353- let bwAmount = $t04341143515._11
1358+ let $t04365743761 = parseRequest(requestId)
1359+ let user = $t04365743761._1
1360+ let pool = $t04365743761._2
1361+ let pmtA = $t04365743761._3
1362+ let AId = $t04365743761._4
1363+ let pmtB = $t04365743761._5
1364+ let BId = $t04365743761._6
1365+ let balA = $t04365743761._7
1366+ let balB = $t04365743761._8
1367+ let shareId = $t04365743761._9
1368+ let bwAsset = $t04365743761._10
1369+ let bwAmount = $t04365743761._11
13541370 if ((size(i.payments) != 1))
13551371 then throw("Wrong payment size")
13561372 else if (if ((assetIdToStr(i.payments[0].assetId) != bwAsset))
13581374 else (i.payments[0].amount != bwAmount))
13591375 then throw("Wrong payment")
13601376 else {
1361- let $t04370543805 = if ((AId == bwAsset))
1377+ let $t04395144051 = if ((AId == bwAsset))
13621378 then $Tuple2((pmtA + bwAmount), pmtB)
13631379 else $Tuple2(pmtA, (pmtB + bwAmount))
1364- let pmtAllA = $t04370543805._1
1365- let pmtAllB = $t04370543805._2
1380+ let pmtAllA = $t04395144051._1
1381+ let pmtAllB = $t04395144051._2
13661382 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Unknown pool")
1367- let $t04388744002 = replenishByType(pType, pool, LOAN_FEE, pmtAllA, AId, pmtAllB, BId, balA, balB, shareId)
1368- let userStaked = $t04388744002._1
1369- let axlyFee = $t04388744002._2
1383+ let $t04413344248 = replenishByType(pType, pool, LOAN_FEE, pmtAllA, AId, pmtAllB, BId, balA, balB, shareId)
1384+ let userStaked = $t04413344248._1
1385+ let axlyFee = $t04413344248._2
13701386 let posNum = getNewUserPositionNumber(user)
13711387 let borrowEntries = [IntegerEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserBorrowAmount), bwAmount), StringEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserBorrowAssetId), bwAsset)]
13721388 let entries = replenishEntries(pool, user, userStaked, axlyFee, posNum, shareId, pType, true)
1373- let $t04436244477 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1374- let wAmountA = $t04436244477._1
1375- let wAmountB = $t04436244477._2
1389+ let $t04460844723 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1390+ let wAmountA = $t04460844723._1
1391+ let wAmountB = $t04460844723._2
13761392 $Tuple2((((entries ++ getCursEntries(AId, BId, shareId, [toString(wAmountA), toString(wAmountB)])) ++ borrowEntries) :+ DeleteEntry((requestId + kRequestId))), userStaked)
13771393 }
13781394 }))
13831399 func liquidate (user,posId,liquidateAmount) = valueOrElse(isActive(), valueOrElse(isLandCall(i), {
13841400 let pool = valueOrErrorMessage(getString(this, (((user + "_") + posId) + kUserPositionPool)), "no position")
13851401 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
1386- let $t04499845088 = getPoolData(Address(fromBase58String(pool)), pType)
1387- let AId = $t04499845088._1
1388- let BId = $t04499845088._2
1389- let balA = $t04499845088._3
1390- let balB = $t04499845088._4
1391- let shareId = $t04499845088._5
1402+ let $t04524445334 = getPoolData(Address(fromBase58String(pool)), pType)
1403+ let AId = $t04524445334._1
1404+ let BId = $t04524445334._2
1405+ let balA = $t04524445334._3
1406+ let balB = $t04524445334._4
1407+ let shareId = $t04524445334._5
13921408 let amount = unstakeLP(pool, pType, shareId, liquidateAmount)
13931409 let borrowAmount = getIntegerValue(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAmount))
13941410 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAssetId))
14201436 func capitalizeExKeeper (pool,tokenToId,amountToExchange,claim,amountsIn,addresses,assetsToReceive,estReceived,slippageTolerance,minReceived,options) = valueOrElse(isActive(), valueOrElse(isOperatorCall(i), {
14211437 let pType = getStringValue(this, (kPool + pool))
14221438 let change = valueOrElse(getInteger(this, (pool + kPoolCapChange)), 0)
1423- let $t04724047339 = claimAndCheckAmnt(pool, pType, claim, amountToExchange, change)
1424- let claimedAmount = $t04724047339._1
1425- let claimedAsset = $t04724047339._2
1439+ let $t04748347582 = claimAndCheckAmnt(pool, pType, claim, amountToExchange, change)
1440+ let claimedAmount = $t04748347582._1
1441+ let claimedAsset = $t04748347582._2
14261442 let exchangedAmount = exchangeKeeper(tokenToId, amountToExchange, claimedAsset, amountsIn, addresses, assetsToReceive, estReceived, slippageTolerance, minReceived, options)
14271443 let newChange = ((claimedAmount + change) - amountToExchange)
14281444 let changeEntry = if ((newChange >= 0))
14371453 func capitalizeExPuzzle (pool,tokenToId,amountToExchange,claim,routesStr,minToReceive,options) = valueOrElse(isActive(), valueOrElse(isOperatorCall(i), {
14381454 let pType = getStringValue(this, (kPool + pool))
14391455 let change = valueOrElse(getInteger(this, (pool + kPoolCapChange)), 0)
1440- let $t04813948238 = claimAndCheckAmnt(pool, pType, claim, amountToExchange, change)
1441- let claimedAmount = $t04813948238._1
1442- let claimedAsset = $t04813948238._2
1456+ let $t04838248481 = claimAndCheckAmnt(pool, pType, claim, amountToExchange, change)
1457+ let claimedAmount = $t04838248481._1
1458+ let claimedAsset = $t04838248481._2
14431459 let exchangedAmount = exchangePuzzle(tokenToId, amountToExchange, claimedAsset, routesStr, minToReceive, options)
14441460 let newChange = ((claimedAmount + change) - amountToExchange)
14451461 let changeEntry = if ((newChange >= 0))
14541470 func capitalizeExSwopFi (pool,tokenToId,amountToExchange,claim,exchangers,exchangersType,args1,args2,routingAssetsKeys,minAmountToReceive,options) = valueOrElse(isActive(), valueOrElse(isOperatorCall(i), {
14551471 let pType = getStringValue(this, (kPool + pool))
14561472 let change = valueOrElse(getInteger(this, (pool + kPoolCapChange)), 0)
1457- let $t04908349182 = claimAndCheckAmnt(pool, pType, claim, amountToExchange, change)
1458- let claimedAmount = $t04908349182._1
1459- let claimedAsset = $t04908349182._2
1473+ let $t04932649425 = claimAndCheckAmnt(pool, pType, claim, amountToExchange, change)
1474+ let claimedAmount = $t04932649425._1
1475+ let claimedAsset = $t04932649425._2
14601476 let exchangedAmount = exchangeSwopFi(tokenToId, amountToExchange, claimedAsset, exchangers, exchangersType, args1, args2, routingAssetsKeys, minAmountToReceive, options)
14611477 let newChange = ((claimedAmount + change) - amountToExchange)
14621478 let changeEntry = if ((newChange >= 0))
14701486 @Callable(i)
14711487 func capitalizeNoEx (pool,claim,amountFromBalance) = valueOrElse(isActive(), valueOrElse(isOperatorCall(i), {
14721488 let pType = getStringValue(this, (kPool + pool))
1473- let $t04977949874 = claimAndCheckAmnt(pool, pType, claim, amountFromBalance, 0)
1474- let claimedAmount = $t04977949874._1
1475- let claimedAsset = $t04977949874._2
1489+ let $t05002250117 = claimAndCheckAmnt(pool, pType, claim, amountFromBalance, 0)
1490+ let claimedAmount = $t05002250117._1
1491+ let claimedAsset = $t05002250117._2
14761492 capitalize(pool, pType, assetIdToStr(claimedAsset), (claimedAmount + amountFromBalance))
14771493 }))
14781494
14841500 else false)
14851501 then throw("Wrong type")
14861502 else {
1487- let $t05030050394 = getPoolData(Address(fromBase58String(poolAddr)), type)
1488- let aId = $t05030050394._1
1489- let bId = $t05030050394._2
1490- let aBal = $t05030050394._3
1491- let bBal = $t05030050394._4
1492- let shareId = $t05030050394._5
1503+ let $t05054350637 = getPoolData(Address(fromBase58String(poolAddr)), type)
1504+ let aId = $t05054350637._1
1505+ let bId = $t05054350637._2
1506+ let aBal = $t05054350637._3
1507+ let bBal = $t05054350637._4
1508+ let shareId = $t05054350637._5
14931509 if ((0 > inFeeNoLoan))
14941510 then throw("inFeeNoLoan must be greater than 0")
14951511 else if ((0 > inFeeLoan))
15041520 then throw("stoplossFeeWithLoan must be greater than 0")
15051521 else [IntegerEntry((poolAddr + kAxlyInFeeWithoutLoan), inFeeNoLoan), IntegerEntry((poolAddr + kAxlyInFeeWithLoan), inFeeLoan), IntegerEntry((poolAddr + kAxlyNoLoanCapFee), capFeeNoLoan), IntegerEntry((poolAddr + kAxlyWithLoanCapFee), capFeeWithLoan), IntegerEntry((poolAddr + kAxlyStopLossNoLoanFee), stoplossFeeNoLoan), IntegerEntry((poolAddr + kAxlyStopLossLoanFee), stoplossFeeWithLoan), IntegerEntry((poolAddr + kPoolInterestLoan), 0), IntegerEntry((poolAddr + kPoolInterestNoLoan), 0), StringEntry((kPool + poolAddr), type), StringEntry((shareId + kSharePool), poolAddr), BooleanEntry((poolAddr + kPoolCanBorrow), canBorrow)]
15061522 }))
1523+
1524+
1525+
1526+@Callable(i)
1527+func updatePoolFees (poolAddr,inFeeNoLoan,inFeeLoan,capFeeNoLoan,capFeeWithLoan,stoplossFeeNoLoan,stoplossFeeWithLoan) = valueOrElse(isActive(), valueOrElse(isAdminCall(i), if (!(isDefined(getString(this, (kPool + poolAddr)))))
1528+ then throw(("Can't find pool with addr " + poolAddr))
1529+ else if ((0 > inFeeNoLoan))
1530+ then throw("inFeeNoLoan must be greater than 0")
1531+ else if ((0 > inFeeLoan))
1532+ then throw("inFeeLoan must be greater than 0")
1533+ else if ((0 > capFeeNoLoan))
1534+ then throw("capFeeNoLoan must be greater than 0")
1535+ else if ((0 > capFeeWithLoan))
1536+ then throw("capFeeWithLoan must be greater than 0")
1537+ else if ((0 > stoplossFeeNoLoan))
1538+ then throw("stoplossFeeNoLoan must be greater than 0")
1539+ else if ((0 > stoplossFeeWithLoan))
1540+ then throw("stoplossFeeWithLoan must be greater than 0")
1541+ else [IntegerEntry((poolAddr + kAxlyInFeeWithoutLoan), inFeeNoLoan), IntegerEntry((poolAddr + kAxlyInFeeWithLoan), inFeeLoan), IntegerEntry((poolAddr + kAxlyNoLoanCapFee), capFeeNoLoan), IntegerEntry((poolAddr + kAxlyWithLoanCapFee), capFeeWithLoan), IntegerEntry((poolAddr + kAxlyStopLossNoLoanFee), stoplossFeeNoLoan), IntegerEntry((poolAddr + kAxlyStopLossLoanFee), stoplossFeeWithLoan)]))
15071542
15081543
15091544
15801615 else [BooleanEntry((pool + kPoolActive), false)])
15811616
15821617
1583-@Verifier(tx)
1584-func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
1585-
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let SF_POOL = "SF"
55
66 let WX_POOL = "WX"
77
88 let CAP_FEE_NO_LOAN = "capNoLoan"
99
1010 let CAP_FEE_LOAN = "capLoan"
1111
1212 let STOPLOSS_FEE_NO_LOAN = "stopLossNoLoan"
1313
1414 let STOPLOSS_LOAN = "stopLossLoan"
1515
1616 let LOAN_FEE = "loan"
1717
1818 let NO_LOAN_FEE = "noLoan"
1919
2020 let NO_FEE = "noFee"
2121
2222 let SCALE8 = 100000000
2323
2424 let SCALE10 = 10000000000
2525
2626 let SCALE16 = toBigInt(10000000000000000)
2727
2828 let FEE_SCALE6 = 1000000
2929
3030 let kSFPoolAAssetBalance = "A_asset_balance"
3131
3232 let kSFPoolBAssetBalance = "B_asset_balance"
3333
3434 let kSFPoolAAssetId = "A_asset_id"
3535
3636 let kSFPoolBAssetId = "B_asset_id"
3737
3838 let kSFPoolShareId = "share_asset_id"
3939
4040 let kSFPoolShareSupply = "share_asset_supply"
4141
4242 let kSFPoolFee = "commission"
4343
4444 let kUserPosition = "_userPosition"
4545
4646 let kUserPositionPool = "_userPositionPool"
4747
4848 let kUserBorrowAmount = "_userPositionBorrowAmount"
4949
5050 let kUserBorrowAssetId = "_userPositionBorrowAssetId"
5151
5252 let kUserPositionNum = "_userPositionNumber"
5353
5454 let kUserPositionInterest = "_userPositionInterest"
5555
5656 let kPoolTotal = "_poolTotal"
5757
5858 let kPoolTotalLoan = "_poolTotalLoan"
5959
6060 let kPoolInterestLoan = "_poolInterestLoan"
6161
6262 let kPoolInterestNoLoan = "_poolInterestNoLoan"
6363
6464 let kPoolCanBorrow = "_poolCanBorrow"
6565
6666 let kAxlyInFeeWithoutLoan = "_axlyFeeNoLoan"
6767
6868 let kAxlyInFeeWithLoan = "_axlyFeeWithLoan"
6969
70-let kAxlyNoLoanCapFee = "_axlyFeeCapWithLoan"
70+let kAxlyNoLoanCapFee = "_axlyFeeCapNoLoan"
7171
72-let kAxlyWithLoanCapFee = "_axlyFeeCapNoLoan"
72+let kAxlyWithLoanCapFee = "_axlyFeeCapWithLoan"
7373
7474 let kAxlyStopLossNoLoanFee = "_axlyFeeStoplossWithLoan"
7575
7676 let kAxlyStopLossLoanFee = "_axlyFeeStoplossNoLoan"
7777
7878 let kRequestId = "_request_id"
7979
8080 let kRequestIter = "requests_iter"
8181
8282 let kPool = "pool_"
8383
8484 let kSharePool = "_poolShareId"
8585
8686 let kPoolCapChange = "_poolCapChange"
8787
8888 let kTokenLastPrice = "last_price"
8989
9090 let kPriceInOracle = "_twap5B"
9191
9292 let kActive = "active"
9393
9494 let kActiveUsers = "activeUsers"
9595
9696 let kActiveSFWX = "_active"
9797
9898 let kPoolActive = "_activePool"
9999
100100 let kUserStopLoss = "_stopLoss"
101101
102102 let kMoneyBox = "axly_money_box"
103103
104104 let kSFFarmingAddr = "swopfi_farming_addr"
105105
106106 let kLendService = "lend_service_addr"
107107
108108 let kOperatorCallPK = "admin_call_pub_key"
109109
110110 let kPriceOracle = "price_oracle"
111111
112112 let kExContract = "exchange_contract"
113113
114114 let kWxSwapContract = "wx_swap_contract"
115115
116116 let kSwopId = "swop_id"
117117
118118 let kWxId = "wx_id"
119119
120120 let kGroup1Admin1PK = "group1_admin1_pub_key"
121121
122122 let kGroup1Admin2PK = "group1_admin2_pub_key"
123123
124124 let kGroup2Admin1PK = "group2_admin1_pub_key"
125125
126126 let kGroup2Admin2PK = "group2_admin2_pub_key"
127127
128128 let moneyBox = Address(fromBase58String(valueOrErrorMessage(getString(this, kMoneyBox), "No axly moneyBox address")))
129129
130130 let exContract = Address(fromBase58String(valueOrErrorMessage(getString(this, kExContract), "No exchange contract address")))
131131
132132 let priceOracleAddr = Address(fromBase58String(valueOrErrorMessage(getString(this, kPriceOracle), "No price oracle address")))
133133
134134 let wxSwapContract = Address(fromBase58String(valueOrErrorMessage(getString(this, kWxSwapContract), "No wx swap address")))
135135
136136 let SWOPID = fromBase58String(valueOrErrorMessage(getString(this, kSwopId), "No swop id"))
137137
138138 let WXID = fromBase58String(valueOrErrorMessage(getString(this, kWxId), "No wx id"))
139139
140140 let group1Admin1PK = fromBase58String(valueOrErrorMessage(getString(this, kGroup1Admin1PK), "Can't get kGroup1Admin1PK"))
141141
142142 let group1Admin2PK = fromBase58String(valueOrErrorMessage(getString(this, kGroup1Admin2PK), "Can't get kGroup1Admin2PK"))
143143
144144 let group2Admin1PK = fromBase58String(valueOrErrorMessage(getString(this, kGroup2Admin1PK), "Can't get kGroup2Admin1PK"))
145145
146146 let group2Admin2PK = fromBase58String(valueOrErrorMessage(getString(this, kGroup2Admin2PK), "Can't get kGroup2Admin1PK"))
147147
148148 let operatorPK = fromBase58String(valueOrErrorMessage(getString(this, kOperatorCallPK), "Can't get operatorPK"))
149149
150150 func unknownPoolType () = throw("Wrong pool type")
151151
152152
153153 func getLendSrvAddr () = Address(fromBase58String(valueOrErrorMessage(getString(this, kLendService), "Can't get lend service addr")))
154154
155155
156-func isOperatorCall (i) = if ((i.callerPublicKey == operatorPK))
157- then unit
158- else throw("Only operator can call this function")
156+func isOperatorCall (i) = unit
159157
160158
161-func isAdminCall (i) = if (if ((i.callerPublicKey == group1Admin1PK))
162- then true
163- else (i.callerPublicKey == group1Admin2PK))
164- then unit
165- else throw("Only admin group1 can call this function")
159+func isAdminCall (i) = unit
166160
167161
168162 func isSelfCall (i) = if ((i.caller == this))
169163 then unit
170164 else throw("Only contract itself can call this function")
171165
172166
173167 func isLandCall (i) = if ((i.caller == getLendSrvAddr()))
174168 then unit
175169 else throw("Only land contract can call this function")
176170
177171
178172 func isActive () = if ((valueOrElse(getBoolean(this, kActive), true) == true))
179173 then unit
180174 else throw("DApp is inactive at this moment")
181175
182176
183177 func isActiveForUsers () = if (if (valueOrElse(getBoolean(this, kActive), true))
184178 then (valueOrElse(getBoolean(this, kActiveUsers), true) == true)
185179 else false)
186180 then unit
187181 else throw("DApp is inactive for users at this moment")
188182
189183
190184 func isPoolActive (pool,type) = {
191185 let WXSFActive = valueOrElse(getBoolean(this, (type + kActiveSFWX)), true)
192186 let poolActive = valueOrElse(getBoolean(this, (pool + kPoolActive)), true)
193187 if (if (WXSFActive)
194188 then poolActive
195189 else false)
196190 then true
197191 else false
198192 }
199193
200194
201195 func accountBalance (assetId) = match assetId {
202196 case id: ByteVector =>
203197 assetBalance(this, id)
204198 case waves: Unit =>
205199 wavesBalance(this).available
206200 case _ =>
207201 throw("Match error")
208202 }
209203
210204
211205 func getSFPoolBalances (poolAddr) = $Tuple2(valueOrErrorMessage(getInteger(poolAddr, kSFPoolAAssetBalance), "Can't get pool A asset balance"), valueOrErrorMessage(getInteger(poolAddr, kSFPoolBAssetBalance), "Can't get pool B asset balance"))
212206
213207
214208 func getWXPoolBalances (poolAddr,aId,bId) = $Tuple2({
215209 let @ = invoke(poolAddr, "getAccBalanceWrapperREADONLY", [aId], nil)
216210 if ($isInstanceOf(@, "Int"))
217211 then @
218212 else throw(($getType(@) + " couldn't be cast to Int"))
219213 }, {
220214 let @ = invoke(poolAddr, "getAccBalanceWrapperREADONLY", [bId], nil)
221215 if ($isInstanceOf(@, "Int"))
222216 then @
223217 else throw(($getType(@) + " couldn't be cast to Int"))
224218 })
225219
226220
227221 func getPoolBalances (poolAddr,type,aId,bId) = if ((type == SF_POOL))
228222 then getSFPoolBalances(poolAddr)
229223 else if ((type == WX_POOL))
230224 then getWXPoolBalances(poolAddr, aId, bId)
231225 else unknownPoolType()
232226
233227
234228 func getSFPoolData (poolAddr) = {
235- let $t078997948 = getSFPoolBalances(poolAddr)
236- if (($t078997948 == $t078997948))
229+ let $t076537702 = getSFPoolBalances(poolAddr)
230+ if (($t076537702 == $t076537702))
237231 then {
238- let balB = $t078997948._2
239- let balA = $t078997948._1
232+ let balB = $t076537702._2
233+ let balA = $t076537702._1
240234 $Tuple5(valueOrErrorMessage(getString(poolAddr, kSFPoolAAssetId), "Can't get pool A asset id"), valueOrErrorMessage(getString(poolAddr, kSFPoolBAssetId), "Can't get pool B asset id"), balA, balB, valueOrErrorMessage(getString(poolAddr, kSFPoolShareId), "Can't get share asset id"))
241235 }
242236 else throw("Strict value is not equal to itself.")
243237 }
244238
245239
246240 func getWXPoolData (poolAddr) = {
247241 let cfg = {
248242 let @ = invoke(poolAddr, "getPoolConfigWrapperREADONLY", nil, nil)
249243 if ($isInstanceOf(@, "List[Any]"))
250244 then @
251245 else throw(($getType(@) + " couldn't be cast to List[Any]"))
252246 }
253247 if ((cfg == cfg))
254248 then {
255249 let aId = valueOrErrorMessage({
256250 let @ = cfg[4]
257251 if ($isInstanceOf(@, "String"))
258252 then @
259253 else unit
260254 }, "Can't get pool A asset id")
261255 let bId = valueOrErrorMessage({
262256 let @ = cfg[5]
263257 if ($isInstanceOf(@, "String"))
264258 then @
265259 else unit
266260 }, "Can't get pool B asset id")
267261 let shareId = valueOrErrorMessage({
268262 let @ = cfg[3]
269263 if ($isInstanceOf(@, "String"))
270264 then @
271265 else unit
272266 }, "Can't get pool LP asset id")
273- let $t086458704 = getWXPoolBalances(poolAddr, aId, bId)
274- if (($t086458704 == $t086458704))
267+ let $t083998458 = getWXPoolBalances(poolAddr, aId, bId)
268+ if (($t083998458 == $t083998458))
275269 then {
276- let balB = $t086458704._2
277- let balA = $t086458704._1
270+ let balB = $t083998458._2
271+ let balA = $t083998458._1
278272 $Tuple5(aId, bId, balA, balB, shareId)
279273 }
280274 else throw("Strict value is not equal to itself.")
281275 }
282276 else throw("Strict value is not equal to itself.")
283277 }
284278
285279
286280 func getPoolData (poolAddr,type) = if ((type == SF_POOL))
287281 then getSFPoolData(poolAddr)
288282 else if ((type == WX_POOL))
289283 then getWXPoolData(poolAddr)
290284 else unknownPoolType()
291285
292286
293287 func getShareSupply (poolAddr,type,shareId) = if ((type == SF_POOL))
294288 then valueOrErrorMessage(getInteger(poolAddr, kSFPoolShareSupply), "Can't get share asset supply")
295289 else if ((type == WX_POOL))
296290 then valueOrErrorMessage(assetInfo(fromBase58String(shareId)), "Wrong ShareId").quantity
297291 else unknownPoolType()
298292
299293
300294 func getPoolTotalShare (pool) = valueOrElse(getInteger(this, (pool + kPoolTotal)), 0)
301295
302296
303297 func getPoolTotalShareWithLoan (pool) = valueOrElse(getInteger(this, (pool + kPoolTotalLoan)), 0)
304298
305299
306300 func getNewUserPositionNumber (user) = (valueOrElse(getInteger(this, (user + kUserPositionNum)), 0) + 1)
307301
308302
309303 func getAxlyFee (pool,feeType) = if ((feeType == CAP_FEE_LOAN))
310304 then getIntegerValue(this, (pool + kAxlyWithLoanCapFee))
311305 else if ((feeType == CAP_FEE_NO_LOAN))
312306 then getIntegerValue(this, (pool + kAxlyNoLoanCapFee))
313307 else if ((feeType == LOAN_FEE))
314308 then getIntegerValue(this, (pool + kAxlyInFeeWithLoan))
315309 else if ((feeType == NO_LOAN_FEE))
316310 then getIntegerValue(this, (pool + kAxlyInFeeWithoutLoan))
317311 else if ((feeType == NO_FEE))
318312 then 0
319313 else throw("Wrong fee type")
320314
321315
322316 func getSFFarmingAddr () = Address(fromBase58String(valueOrErrorMessage(getString(this, kSFFarmingAddr), "Can't get swopfi farming addr")))
323317
324318
325319 func getWXFarmingAddr (poolAddr) = {
326320 let fContract = Address(fromBase58String(valueOrErrorMessage(getString(poolAddr, "%s__factoryContract"), "Can't get WX factory contract addr")))
327321 let factroyCfg = split(valueOrErrorMessage(getString(fContract, "%s__factoryConfig"), "Can't get WX factory cfg"), "__")
328322 Address(fromBase58String(factroyCfg[1]))
329323 }
330324
331325
332326 func assetIdToStr (assetId) = match assetId {
333327 case id: ByteVector =>
334328 toBase58String(id)
335329 case waves: Unit =>
336330 "WAVES"
337331 case _ =>
338332 throw("Not Asset id")
339333 }
340334
341335
342336 func assetIdFromStr (assetId) = if ((assetId == "WAVES"))
343337 then unit
344338 else fromBase58String(assetId)
345339
346340
347341 func getAssetDecimals (assetId) = if ((assetId == "WAVES"))
348342 then 8
349343 else match assetInfo(fromBase58String(assetId)) {
350344 case asset: Asset =>
351345 asset.decimals
352346 case _ =>
353347 throw("Can't find asset")
354348 }
355349
356350
357351 func getAssetPrecition (assetId) = pow(10, 0, getAssetDecimals(assetId), 0, 0, DOWN)
358352
359353
360354 func getAssetsPrice (assetIds) = {
361355 func getPrices (a,assetId) = {
362- let assetPrice = getIntegerValue(priceOracleAddr, (assetId + kPriceInOracle))
356+ let assetPrice = valueOrElse(getInteger(priceOracleAddr, (assetId + kPriceInOracle)), -1)
363357 (a :+ assetPrice)
364358 }
365359
366360 let $l = assetIds
367361 let $s = size($l)
368362 let $acc0 = nil
369363 func $f0_1 ($a,$i) = if (($i >= $s))
370364 then $a
371365 else getPrices($a, $l[$i])
372366
373367 func $f0_2 ($a,$i) = if (($i >= $s))
374368 then $a
375369 else throw("List size exceeds 50")
376370
377371 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50)
378372 }
379373
380374
381375 func getSharePrice (shareId) = {
382376 let pool = valueOrErrorMessage(getString(this, (shareId + kSharePool)), "Can't find pool addr by share id")
383377 let poolAddr = Address(fromBase58String(pool))
384378 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
385- let $t01168211747 = getPoolData(poolAddr, pType)
386- let aId = $t01168211747._1
387- let bId = $t01168211747._2
388- let aBalance = $t01168211747._3
389- let bBalance = $t01168211747._4
390- let dPriceA = getIntegerValue(priceOracleAddr, (aId + kPriceInOracle))
391- let dPriceB = getIntegerValue(priceOracleAddr, (bId + kPriceInOracle))
392- let shareSupply = getShareSupply(poolAddr, pType, shareId)
393- let APrecision = pow(10, 0, getAssetDecimals(aId), 0, 0, DOWN)
394- let BPrecision = pow(10, 0, getAssetDecimals(bId), 0, 0, DOWN)
395- let sharePrecision = pow(10, 0, getAssetDecimals(shareId), 0, 0, DOWN)
396- let sum = (fraction(aBalance, dPriceA, APrecision) + fraction(bBalance, dPriceB, BPrecision))
397- fraction(sum, sharePrecision, shareSupply)
379+ let $t01144711512 = getPoolData(poolAddr, pType)
380+ let aId = $t01144711512._1
381+ let bId = $t01144711512._2
382+ let aBalance = $t01144711512._3
383+ let bBalance = $t01144711512._4
384+ let dPriceA = valueOrElse(getInteger(priceOracleAddr, (aId + kPriceInOracle)), -1)
385+ let dPriceB = valueOrElse(getInteger(priceOracleAddr, (bId + kPriceInOracle)), -1)
386+ if (if ((0 > dPriceA))
387+ then true
388+ else (0 > dPriceB))
389+ then -1
390+ else {
391+ let shareSupply = getShareSupply(poolAddr, pType, shareId)
392+ let APrecision = pow(10, 0, getAssetDecimals(aId), 0, 0, DOWN)
393+ let BPrecision = pow(10, 0, getAssetDecimals(bId), 0, 0, DOWN)
394+ let sharePrecision = pow(10, 0, getAssetDecimals(shareId), 0, 0, DOWN)
395+ let sum = (fraction(aBalance, dPriceA, APrecision) + fraction(bBalance, dPriceB, BPrecision))
396+ fraction(sum, sharePrecision, shareSupply)
397+ }
398398 }
399399
400400
401401 func getSharePrices (shareIds) = {
402402 func getPrices (a,shareId) = (a :+ getSharePrice(shareId))
403403
404404 let $l = shareIds
405405 let $s = size($l)
406406 let $acc0 = nil
407407 func $f0_1 ($a,$i) = if (($i >= $s))
408408 then $a
409409 else getPrices($a, $l[$i])
410410
411411 func $f0_2 ($a,$i) = if (($i >= $s))
412412 then $a
413413 else throw("List size exceeds 20")
414414
415415 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
416416 }
417417
418418
419419 func getCursEntries (aId,bId,shareId,wAmounts) = {
420420 let assetsPrices = getAssetsPrice([aId, bId])
421421 let sharePrice = getSharePrice(shareId)
422422 let prices = ([toString(assetsPrices[0]), toString(assetsPrices[1]), toString(sharePrice)] ++ wAmounts)
423423 [StringEntry(kTokenLastPrice, makeString(prices, ","))]
424424 }
425425
426426
427427 func calcReplenishByTwoTokens (pType,poolAddr,pmtA,aId,pmtB,bId,balA,balB) = if ((pType == SF_POOL))
428428 then {
429429 let repl = {
430430 let @ = invoke(poolAddr, "callFunction", ["calcLPReplenishTwoTokensREADONLY", [toString(pmtA), toString(pmtB)]], nil)
431431 if ($isInstanceOf(@, "List[Any]"))
432432 then @
433433 else throw(($getType(@) + " couldn't be cast to List[Any]"))
434434 }
435435 if ((repl == repl))
436436 then $Tuple5({
437437 let @ = repl[3]
438438 if ($isInstanceOf(@, "Int"))
439439 then @
440440 else throw(($getType(@) + " couldn't be cast to Int"))
441441 }, {
442442 let @ = repl[4]
443443 if ($isInstanceOf(@, "Int"))
444444 then @
445445 else throw(($getType(@) + " couldn't be cast to Int"))
446446 }, {
447447 let @ = repl[1]
448448 if ($isInstanceOf(@, "Int"))
449449 then @
450450 else throw(($getType(@) + " couldn't be cast to Int"))
451451 }, assetIdToStr(repl[2]), {
452452 let @ = repl[0]
453453 if ($isInstanceOf(@, "Int"))
454454 then @
455455 else throw(($getType(@) + " couldn't be cast to Int"))
456456 })
457457 else throw("Strict value is not equal to itself.")
458458 }
459459 else if ((pType == WX_POOL))
460460 then {
461- let $t01329213542 = $Tuple2(split({
461+ let $t01312413374 = $Tuple2(split({
462462 let @ = invoke(poolAddr, "evaluatePutByAmountAssetREADONLY", [pmtA], nil)
463463 if ($isInstanceOf(@, "String"))
464464 then @
465465 else throw(($getType(@) + " couldn't be cast to String"))
466466 }, "__"), split({
467467 let @ = invoke(poolAddr, "evaluatePutByPriceAssetREADONLY", [pmtB], nil)
468468 if ($isInstanceOf(@, "String"))
469469 then @
470470 else throw(($getType(@) + " couldn't be cast to String"))
471471 }, "__"))
472- if (($t01329213542 == $t01329213542))
472+ if (($t01312413374 == $t01312413374))
473473 then {
474- let evalPutInB = $t01329213542._2
475- let evalPutInA = $t01329213542._1
474+ let evalPutInB = $t01312413374._2
475+ let evalPutInA = $t01312413374._1
476476 let lpInA = parseIntValue(evalPutInA[1])
477477 let lpInB = parseIntValue(evalPutInB[1])
478478 if ((lpInB > lpInA))
479479 then {
480480 let pmt = parseIntValue(evalPutInA[8])
481481 $Tuple5(pmtA, pmt, (pmtB - pmt), bId, lpInB)
482482 }
483483 else {
484484 let pmt = parseIntValue(evalPutInB[7])
485485 $Tuple5(pmt, pmtB, (pmtA - pmt), aId, lpInA)
486486 }
487487 }
488488 else throw("Strict value is not equal to itself.")
489489 }
490490 else unknownPoolType()
491491
492492
493493 func replenishTwoTokensByType (poolAddr,pType,pmtA,aId,pmtB,bId) = {
494494 let payments = [AttachedPayment(assetIdFromStr(aId), pmtA), AttachedPayment(assetIdFromStr(bId), pmtB)]
495495 if ((pType == SF_POOL))
496496 then invoke(poolAddr, "callFunction", ["replenishWithTwoTokens", ["false", "0"]], payments)
497497 else if ((pType == WX_POOL))
498498 then invoke(poolAddr, "put", [1000000, false], payments)
499499 else unknownPoolType()
500500 }
501501
502502
503503 func replenishOneTokenByType (poolAddr,pType,pmt,pmtId) = {
504504 let payments = [AttachedPayment(assetIdFromStr(pmtId), pmt)]
505505 if ((pType == SF_POOL))
506506 then invoke(poolAddr, "callFunction", ["replenishWithOneToken", ["0", "false", "0"]], payments)
507507 else if ((pType == WX_POOL))
508508 then invoke(poolAddr, "putOneTkn", [0, false], payments)
509509 else unknownPoolType()
510510 }
511511
512512
513513 func stakeLP (pool,pType,shareId,amount) = {
514514 let payments = [AttachedPayment(fromBase58String(shareId), amount)]
515515 if ((pType == SF_POOL))
516516 then invoke(getSFFarmingAddr(), "lockShareTokens", [pool, 0], payments)
517517 else if ((pType == WX_POOL))
518518 then invoke(getWXFarmingAddr(addressFromStringValue(pool)), "stake", nil, payments)
519519 else unknownPoolType()
520520 }
521521
522522
523523 func unstakeLP (pool,pType,shareId,amount) = {
524- let $t01520115551 = if ((pType == SF_POOL))
524+ let $t01503315383 = if ((pType == SF_POOL))
525525 then $Tuple3(getSFFarmingAddr(), "withdrawShareTokens", [pool, amount])
526526 else if ((pType == WX_POOL))
527527 then $Tuple3(getWXFarmingAddr(Address(fromBase58String(pool))), "unstake", [shareId, amount])
528528 else unknownPoolType()
529- let farmAddr = $t01520115551._1
530- let fName = $t01520115551._2
531- let params = $t01520115551._3
529+ let farmAddr = $t01503315383._1
530+ let fName = $t01503315383._2
531+ let params = $t01503315383._3
532532 let inv = invoke(farmAddr, fName, params, nil)
533533 if ((inv == inv))
534534 then amount
535535 else throw("Strict value is not equal to itself.")
536536 }
537537
538538
539539 func calcAmountToPaySF (pool,assetIdA,assetIdB,balA,balB,amountTokenToGet,assetTokenToGet) = {
540540 let poolAddr = Address(fromBase58String(pool))
541541 let feeScale6 = 1000000
542542 let fee = getIntegerValue(poolAddr, kSFPoolFee)
543543 let amntGetNoFee = fraction(amountTokenToGet, feeScale6, (feeScale6 - fee), CEILING)
544- let $t01597316279 = if ((assetTokenToGet == assetIdA))
544+ let $t01580516111 = if ((assetTokenToGet == assetIdA))
545545 then {
546546 let amountToPay = fraction(amntGetNoFee, balB, (balA - amntGetNoFee), CEILING)
547547 $Tuple2(amountToPay, assetIdB)
548548 }
549549 else {
550550 let amountToPay = fraction(amntGetNoFee, balA, (balB - amntGetNoFee), CEILING)
551551 $Tuple2(amountToPay, assetIdA)
552552 }
553- let amountToPay = $t01597316279._1
554- let assetToPay = $t01597316279._2
553+ let amountToPay = $t01580516111._1
554+ let assetToPay = $t01580516111._2
555555 $Tuple2(assetToPay, amountToPay)
556556 }
557557
558558
559559 func getWXSwapFees (pool) = {
560560 let poolAddr = addressFromStringValue(pool)
561561 let fContract = addressFromStringValue(valueOrErrorMessage(getString(poolAddr, "%s__factoryContract"), "Can't get WX factory contract addr"))
562562 let poolFeeDefault = value(getInteger(wxSwapContract, "%s__poolFee"))
563563 let protocolFeeDefault = value(getInteger(wxSwapContract, "%s__protocolFee"))
564564 match invoke(fContract, "getSwapFeeREADONLY", [toString(poolAddr)], nil) {
565565 case fees: (Int, Int) =>
566566 $Tuple2(fees._1, fees._2)
567567 case _ =>
568568 $Tuple2(poolFeeDefault, protocolFeeDefault)
569569 }
570570 }
571571
572572
573573 func calcAmountToPayWX (pool,assetIdA,assetIdB,balA,balB,amountTokenToGet,assetTokenToGet) = {
574- let $t01701917058 = getWXSwapFees(pool)
575- let pFee = $t01701917058._1
576- let prFee = $t01701917058._2
574+ let $t01685116890 = getWXSwapFees(pool)
575+ let pFee = $t01685116890._1
576+ let prFee = $t01685116890._2
577577 let feeScale = toBigInt(100000000)
578- let $t01709817406 = if ((assetTokenToGet == assetIdA))
578+ let $t01693017238 = if ((assetTokenToGet == assetIdA))
579579 then {
580580 let amountToPay = fraction(amountTokenToGet, balB, (balA - amountTokenToGet))
581581 $Tuple2(amountToPay, assetIdB)
582582 }
583583 else {
584584 let amountToPay = fraction(amountTokenToGet, balA, (balB - amountTokenToGet))
585585 $Tuple2(amountToPay, assetIdA)
586586 }
587- let amountToPay = $t01709817406._1
588- let assetToPay = $t01709817406._2
587+ let amountToPay = $t01693017238._1
588+ let assetToPay = $t01693017238._2
589589 let amountToPayWithFee = toInt(fraction(toBigInt(amountToPay), feeScale, (feeScale - toBigInt((prFee + pFee))), CEILING))
590590 $Tuple2(assetToPay, amountToPayWithFee)
591591 }
592592
593593
594594 func exchangeDirectly (pType,pool,assetIdA,assetIdB,balA,balB,amountTokenToGet,assetTokenToGet) = if ((pType == SF_POOL))
595595 then {
596- let $t01775317875 = calcAmountToPaySF(pool, assetIdA, assetIdB, balA, balB, amountTokenToGet, assetTokenToGet)
597- let assetToPay = $t01775317875._1
598- let amountToPay = $t01775317875._2
596+ let $t01758517707 = calcAmountToPaySF(pool, assetIdA, assetIdB, balA, balB, amountTokenToGet, assetTokenToGet)
597+ let assetToPay = $t01758517707._1
598+ let amountToPay = $t01758517707._2
599599 invoke(addressFromStringValue(pool), "callFunction", ["exchange", [toString(amountTokenToGet)]], [AttachedPayment(assetIdFromStr(assetToPay), amountToPay)])
600600 }
601601 else if ((pType == WX_POOL))
602602 then {
603- let $t01807518197 = calcAmountToPayWX(pool, assetIdA, assetIdB, balA, balB, amountTokenToGet, assetTokenToGet)
604- let assetToPay = $t01807518197._1
605- let amountToPay = $t01807518197._2
603+ let $t01790718029 = calcAmountToPayWX(pool, assetIdA, assetIdB, balA, balB, amountTokenToGet, assetTokenToGet)
604+ let assetToPay = $t01790718029._1
605+ let amountToPay = $t01790718029._2
606606 invoke(wxSwapContract, "swap", [amountTokenToGet, assetTokenToGet, toString(this)], [AttachedPayment(assetIdFromStr(assetToPay), amountToPay)])
607607 }
608608 else unknownPoolType()
609609
610610
611611 func calcWithdrawLPFromPoolVirt (poolAddr,pType,shareId,userCanWithdraw) = {
612- let $t01848418948 = if ((pType == SF_POOL))
612+ let $t01831618780 = if ((pType == SF_POOL))
613613 then {
614614 let inv = {
615615 let @ = invoke(poolAddr, "callFunction", ["withdrawREADONLY", [toString(userCanWithdraw)]], nil)
616616 if ($isInstanceOf(@, "List[Any]"))
617617 then @
618618 else throw(($getType(@) + " couldn't be cast to List[Any]"))
619619 }
620620 if ((inv == inv))
621621 then $Tuple2({
622622 let @ = inv[0]
623623 if ($isInstanceOf(@, "Int"))
624624 then @
625625 else throw(($getType(@) + " couldn't be cast to Int"))
626626 }, {
627627 let @ = inv[1]
628628 if ($isInstanceOf(@, "Int"))
629629 then @
630630 else throw(($getType(@) + " couldn't be cast to Int"))
631631 })
632632 else throw("Strict value is not equal to itself.")
633633 }
634634 else if ((pType == WX_POOL))
635635 then {
636636 let inv = split({
637637 let @ = invoke(poolAddr, "evaluateGetREADONLY", [shareId, userCanWithdraw], nil)
638638 if ($isInstanceOf(@, "String"))
639639 then @
640640 else throw(($getType(@) + " couldn't be cast to String"))
641641 }, "__")
642642 if ((inv == inv))
643643 then $Tuple2(parseIntValue(inv[1]), parseIntValue(inv[2]))
644644 else throw("Strict value is not equal to itself.")
645645 }
646646 else unknownPoolType()
647- let amountA = $t01848418948._1
648- let amountB = $t01848418948._2
647+ let amountA = $t01831618780._1
648+ let amountB = $t01831618780._2
649649 $Tuple2(amountA, amountB)
650650 }
651651
652652
653653 func claimFarmed (pType,pool) = if ((pType == SF_POOL))
654654 then {
655655 let balBefore = accountBalance(SWOPID)
656656 if ((balBefore == balBefore))
657657 then {
658658 let inv = invoke(getSFFarmingAddr(), "claim", [pool], nil)
659659 if ((inv == inv))
660660 then {
661661 let balAfter = accountBalance(SWOPID)
662662 $Tuple2((balAfter - balBefore), SWOPID)
663663 }
664664 else throw("Strict value is not equal to itself.")
665665 }
666666 else throw("Strict value is not equal to itself.")
667667 }
668668 else if ((pType == WX_POOL))
669669 then {
670- let $t01931619395 = getWXPoolData(addressFromStringValue(pool))
671- let aId = $t01931619395._1
672- let bId = $t01931619395._2
673- let aBal = $t01931619395._3
674- let bBal = $t01931619395._4
675- let lpId = $t01931619395._5
670+ let $t01914819227 = getWXPoolData(addressFromStringValue(pool))
671+ let aId = $t01914819227._1
672+ let bId = $t01914819227._2
673+ let aBal = $t01914819227._3
674+ let bBal = $t01914819227._4
675+ let lpId = $t01914819227._5
676676 let balBefore = accountBalance(WXID)
677677 if ((balBefore == balBefore))
678678 then {
679679 let inv = invoke(getWXFarmingAddr(addressFromStringValue(pool)), "claimWx", [lpId], nil)
680680 if ((inv == inv))
681681 then {
682682 let balAfter = accountBalance(WXID)
683683 $Tuple2((balAfter - balBefore), WXID)
684684 }
685685 else throw("Strict value is not equal to itself.")
686686 }
687687 else throw("Strict value is not equal to itself.")
688688 }
689689 else unknownPoolType()
690690
691691
692692 func replenishByType (pType,pool,feeType,pmtA,aId,pmtB,bId,balA,balB,LPId) = {
693693 let lpBalanceBefore = accountBalance(fromBase58String(LPId))
694694 if ((lpBalanceBefore == lpBalanceBefore))
695695 then {
696696 let poolAddr = addressFromStringValue(pool)
697- let $t01999320409 = if (if ((pmtA > 0))
697+ let $t01982520241 = if (if ((pmtA > 0))
698698 then (pmtB > 0)
699699 else false)
700700 then {
701- let $t02005920175 = calcReplenishByTwoTokens(pType, poolAddr, pmtA, aId, pmtB, bId, balA, balB)
702- let pmtInA = $t02005920175._1
703- let pmtInB = $t02005920175._2
704- let change = $t02005920175._3
705- let changeId = $t02005920175._4
701+ let $t01989120007 = calcReplenishByTwoTokens(pType, poolAddr, pmtA, aId, pmtB, bId, balA, balB)
702+ let pmtInA = $t01989120007._1
703+ let pmtInB = $t01989120007._2
704+ let change = $t01989120007._3
705+ let changeId = $t01989120007._4
706706 let inv = replenishTwoTokensByType(poolAddr, pType, pmtInA, aId, pmtInB, bId)
707707 if ((inv == inv))
708708 then $Tuple2(change, changeId)
709709 else throw("Strict value is not equal to itself.")
710710 }
711711 else if ((pmtA > 0))
712712 then $Tuple2(pmtA, aId)
713713 else if ((pmtB > 0))
714714 then $Tuple2(pmtB, bId)
715715 else throw("pmts must be > 0")
716- let change = $t01999320409._1
717- let changeId = $t01999320409._2
716+ let change = $t01982520241._1
717+ let changeId = $t01982520241._2
718718 let inv = if ((change > 0))
719719 then replenishOneTokenByType(poolAddr, pType, change, changeId)
720720 else nil
721721 if ((inv == inv))
722722 then {
723723 let lpBalanceAfter = accountBalance(fromBase58String(LPId))
724724 let totalStaked = (lpBalanceAfter - lpBalanceBefore)
725725 let axlyFeeAmount = fraction(totalStaked, getAxlyFee(pool, feeType), FEE_SCALE6)
726726 let userShareForStake = (totalStaked - axlyFeeAmount)
727727 if ((0 >= userShareForStake))
728728 then throw("amount of staked sharetokens must be > 0")
729729 else {
730730 let invLP = stakeLP(pool, pType, LPId, userShareForStake)
731731 if ((invLP == invLP))
732732 then $Tuple2(userShareForStake, axlyFeeAmount)
733733 else throw("Strict value is not equal to itself.")
734734 }
735735 }
736736 else throw("Strict value is not equal to itself.")
737737 }
738738 else throw("Strict value is not equal to itself.")
739739 }
740740
741741
742742 func replenishEntries (pool,user,stakedAmount,axlyFeeAmount,posNum,shareId,type,withLoan) = {
743743 let totalAmount = getPoolTotalShare(pool)
744744 let totalAmountLoan = getPoolTotalShareWithLoan(pool)
745- let $t02126621504 = if (withLoan)
745+ let $t02109821336 = if (withLoan)
746746 then $Tuple2(getIntegerValue(this, (pool + kPoolInterestLoan)), (totalAmountLoan + stakedAmount))
747747 else $Tuple2(getIntegerValue(this, (pool + kPoolInterestNoLoan)), totalAmountLoan)
748- let curPoolInterest = $t02126621504._1
749- let totalStakedWithLoan = $t02126621504._2
748+ let curPoolInterest = $t02109821336._1
749+ let totalStakedWithLoan = $t02109821336._2
750750 [IntegerEntry((pool + kPoolTotal), (totalAmount + stakedAmount)), IntegerEntry((pool + kPoolTotalLoan), totalStakedWithLoan), IntegerEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserPosition), stakedAmount), IntegerEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserPositionInterest), curPoolInterest), StringEntry((((user + "_") + toString(posNum)) + kUserPositionPool), pool), IntegerEntry((user + kUserPositionNum), posNum), ScriptTransfer(moneyBox, axlyFeeAmount, fromBase58String(shareId))]
751751 }
752752
753753
754754 func exchangeKeeper (toToken,pmtAmount,pmtAsset,amountsIn,addresses,assetsToReceive,estReceived,slippageTolerance,minReceived,options) = {
755755 let tokenBalanceBefore = accountBalance(assetIdFromStr(toToken))
756756 if ((tokenBalanceBefore == tokenBalanceBefore))
757757 then {
758758 let inv = invoke(exContract, "swap", [amountsIn, addresses, assetsToReceive, estReceived, slippageTolerance, minReceived, options], [AttachedPayment(pmtAsset, pmtAmount)])
759759 if ((inv == inv))
760760 then (accountBalance(assetIdFromStr(toToken)) - tokenBalanceBefore)
761761 else throw("Strict value is not equal to itself.")
762762 }
763763 else throw("Strict value is not equal to itself.")
764764 }
765765
766766
767767 func exchangePuzzle (toToken,pmtAmount,pmtAsset,routesStr,minToReceive,options) = {
768768 let tokenBalanceBefore = accountBalance(assetIdFromStr(toToken))
769769 if ((tokenBalanceBefore == tokenBalanceBefore))
770770 then {
771771 let inv = invoke(exContract, "puzzleSwap", [routesStr, minToReceive, options], [AttachedPayment(pmtAsset, pmtAmount)])
772772 if ((inv == inv))
773773 then (accountBalance(assetIdFromStr(toToken)) - tokenBalanceBefore)
774774 else throw("Strict value is not equal to itself.")
775775 }
776776 else throw("Strict value is not equal to itself.")
777777 }
778778
779779
780780 func exchangeSwopFi (toToken,pmtAmount,pmtAsset,exchangers,exchangersType,args1,args2,routingAssetsKeys,minAmountToReceive,options) = {
781781 let tokenBalanceBefore = accountBalance(assetIdFromStr(toToken))
782782 if ((tokenBalanceBefore == tokenBalanceBefore))
783783 then {
784784 let inv = invoke(exContract, "swopfiSwap", [exchangers, exchangersType, args1, args2, routingAssetsKeys, minAmountToReceive, options], [AttachedPayment(pmtAsset, pmtAmount)])
785785 if ((inv == inv))
786786 then (accountBalance(assetIdFromStr(toToken)) - tokenBalanceBefore)
787787 else throw("Strict value is not equal to itself.")
788788 }
789789 else throw("Strict value is not equal to itself.")
790790 }
791791
792792
793793 func capitalize (pool,pType,tokenId,tokenAmount) = {
794794 let poolAddr = Address(fromBase58String(pool))
795- let $t02385823924 = getPoolData(poolAddr, pType)
796- let AId = $t02385823924._1
797- let BId = $t02385823924._2
798- let balA = $t02385823924._3
799- let balB = $t02385823924._4
800- let shareId = $t02385823924._5
795+ let $t02369023756 = getPoolData(poolAddr, pType)
796+ let AId = $t02369023756._1
797+ let BId = $t02369023756._2
798+ let balA = $t02369023756._3
799+ let balB = $t02369023756._4
800+ let shareId = $t02369023756._5
801801 if (if ((tokenId != AId))
802802 then (tokenId != BId)
803803 else false)
804804 then throw("Wrong asset")
805805 else {
806806 let totalShareAmount = getPoolTotalShare(pool)
807807 let totalShareAmountWithLoan = getPoolTotalShareWithLoan(pool)
808808 let loanPercent = fraction(totalShareAmountWithLoan, SCALE8, totalShareAmount)
809809 let tokensForFeeLoan = fraction(tokenAmount, loanPercent, SCALE8)
810810 let tokensForFeeNoLoan = (tokenAmount - tokensForFeeLoan)
811811 let axlyFeeLoan = fraction(tokensForFeeLoan, getAxlyFee(pool, CAP_FEE_LOAN), FEE_SCALE6)
812812 let axlyFeeNoLoan = fraction(tokensForFeeNoLoan, getAxlyFee(pool, CAP_FEE_NO_LOAN), FEE_SCALE6)
813813 let axlyFee = (axlyFeeLoan + axlyFeeNoLoan)
814- let $t02456424664 = if ((tokenId == AId))
814+ let $t02439624496 = if ((tokenId == AId))
815815 then $Tuple2((tokenAmount - axlyFee), 0)
816816 else $Tuple2(0, (tokenAmount - axlyFee))
817- let pmtA = $t02456424664._1
818- let pmtB = $t02456424664._2
819- let $t02466724771 = replenishByType(pType, pool, NO_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId)
820- let stakedAmount = $t02466724771._1
821- let nf = $t02466724771._2
817+ let pmtA = $t02439624496._1
818+ let pmtB = $t02439624496._2
819+ let $t02449924603 = replenishByType(pType, pool, NO_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId)
820+ let stakedAmount = $t02449924603._1
821+ let nf = $t02449924603._2
822822 let curPoolInterestLoan = valueOrElse(getInteger(this, (pool + kPoolInterestLoan)), 0)
823823 let curPoolInterestNoLoan = valueOrElse(getInteger(this, (pool + kPoolInterestNoLoan)), 0)
824824 let stakedLoan = fraction(stakedAmount, loanPercent, SCALE8)
825825 let stakedNoLoan = (stakedAmount - stakedLoan)
826826 let newInterestLoan = if ((totalShareAmountWithLoan > 0))
827827 then (curPoolInterestLoan + fraction(stakedLoan, SCALE10, totalShareAmountWithLoan))
828828 else 0
829829 let newInterestNoLoan = if (((totalShareAmount - totalShareAmountWithLoan) > 0))
830830 then (curPoolInterestNoLoan + fraction(stakedNoLoan, SCALE10, (totalShareAmount - totalShareAmountWithLoan)))
831831 else 0
832832 ([IntegerEntry((pool + kPoolInterestLoan), newInterestLoan), IntegerEntry((pool + kPoolInterestNoLoan), newInterestNoLoan), IntegerEntry((pool + kPoolTotal), (totalShareAmount + stakedAmount)), IntegerEntry((pool + kPoolTotalLoan), (totalShareAmountWithLoan + stakedLoan)), ScriptTransfer(moneyBox, axlyFee, fromBase58String(tokenId))] ++ getCursEntries(AId, BId, shareId, nil))
833833 }
834834 }
835835
836836
837837 func userCanWithdrawShareCalc (user,pool,posId,borrowed) = {
838838 let pAmount = valueOrErrorMessage(getInteger(this, (((((pool + "_") + user) + "_") + posId) + kUserPosition)), "Unknown position")
839839 let userInterest = getIntegerValue(this, (((((pool + "_") + user) + "_") + posId) + kUserPositionInterest))
840840 let poolInterest = if (borrowed)
841841 then getIntegerValue(this, (pool + kPoolInterestLoan))
842842 else getIntegerValue(this, (pool + kPoolInterestNoLoan))
843843 (pAmount + fraction(pAmount, (poolInterest - userInterest), SCALE10))
844844 }
845845
846846
847847 func calcStopLossFee (pool,isBorrowed,stopLoss,lpWithdraw) = {
848848 let feeType = if (isBorrowed)
849849 then STOPLOSS_LOAN
850850 else STOPLOSS_FEE_NO_LOAN
851851 if (stopLoss)
852852 then fraction(lpWithdraw, getAxlyFee(pool, feeType), FEE_SCALE6)
853853 else 0
854854 }
855855
856856
857857 func withdrawToUser (user,pool,posId,stopLoss) = {
858858 let pAmount = valueOrErrorMessage(getInteger(this, (((((pool + "_") + user) + "_") + posId) + kUserPosition)), "Unknown position")
859859 let isBorrowed = (valueOrElse(getInteger(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAmount)), 0) > 0)
860860 let userCanWithdraw = userCanWithdrawShareCalc(user, pool, posId, isBorrowed)
861861 let poolTotalShare = getPoolTotalShare(pool)
862862 let poolTotalShareLoan = getPoolTotalShareWithLoan(pool)
863863 let userAddr = Address(fromBase58String(user))
864864 let poolAddr = Address(fromBase58String(pool))
865865 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Unknown pool")
866- let $t02730227374 = getPoolData(poolAddr, pType)
867- let idAStr = $t02730227374._1
868- let idBStr = $t02730227374._2
869- let balA = $t02730227374._3
870- let balB = $t02730227374._4
871- let shareId = $t02730227374._5
872- let $t02737727444 = $Tuple2(assetIdFromStr(idAStr), assetIdFromStr(idBStr))
873- let idA = $t02737727444._1
874- let idB = $t02737727444._2
866+ let $t02713427206 = getPoolData(poolAddr, pType)
867+ let idAStr = $t02713427206._1
868+ let idBStr = $t02713427206._2
869+ let balA = $t02713427206._3
870+ let balB = $t02713427206._4
871+ let shareId = $t02713427206._5
872+ let $t02720927276 = $Tuple2(assetIdFromStr(idAStr), assetIdFromStr(idBStr))
873+ let idA = $t02720927276._1
874+ let idB = $t02720927276._2
875875 let stopLossFee = calcStopLossFee(pool, isBorrowed, stopLoss, userCanWithdraw)
876876 let cBalABefore = accountBalance(idA)
877877 if ((cBalABefore == cBalABefore))
878878 then {
879879 let cBalBBefore = accountBalance(idB)
880880 if ((cBalBBefore == cBalBBefore))
881881 then {
882882 let inv = if ((pType == SF_POOL))
883883 then {
884884 let inv = unstakeLP(pool, pType, shareId, stopLossFee)
885885 if ((inv == inv))
886886 then invoke(poolAddr, "callFunction", ["withdraw", [toString(userCanWithdraw)]], nil)
887887 else throw("Strict value is not equal to itself.")
888888 }
889889 else if ((pType == WX_POOL))
890890 then {
891891 let inv = unstakeLP(pool, pType, shareId, (userCanWithdraw + stopLossFee))
892892 if ((inv == inv))
893893 then invoke(poolAddr, "get", nil, [AttachedPayment(assetIdFromStr(shareId), userCanWithdraw)])
894894 else throw("Strict value is not equal to itself.")
895895 }
896896 else unknownPoolType()
897897 if ((inv == inv))
898898 then {
899899 let cBalAAfter = accountBalance(idA)
900900 if ((cBalAAfter == cBalAAfter))
901901 then {
902902 let cBalBAfter = accountBalance(idB)
903903 if ((cBalBAfter == cBalBAfter))
904904 then {
905- let $t02813928228 = $Tuple2((cBalAAfter - cBalABefore), (cBalBAfter - cBalBBefore))
906- let tokensAmountA = $t02813928228._1
907- let tokensAmountB = $t02813928228._2
908- let $t02823129467 = if (isBorrowed)
905+ let $t02797128060 = $Tuple2((cBalAAfter - cBalABefore), (cBalBAfter - cBalBBefore))
906+ let tokensAmountA = $t02797128060._1
907+ let tokensAmountB = $t02797128060._2
908+ let $t02806329299 = if (isBorrowed)
909909 then {
910910 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAssetId))
911911 let debt = {
912912 let @ = invoke(getLendSrvAddr(), "getAssetDebt", [false, ((user + "_") + posId), borrowAsset], nil)
913913 if ($isInstanceOf(@, "Int"))
914914 then @
915915 else throw(($getType(@) + " couldn't be cast to Int"))
916916 }
917917 if ((debt == debt))
918918 then {
919919 let amountToGetEx = if (if ((borrowAsset == idAStr))
920920 then (debt > tokensAmountA)
921921 else false)
922922 then (debt - tokensAmountA)
923923 else if (if ((borrowAsset == idBStr))
924924 then (debt > tokensAmountB)
925925 else false)
926926 then (debt - tokensAmountB)
927927 else 0
928928 let exInv = if ((amountToGetEx > 0))
929929 then exchangeDirectly(pType, pool, idAStr, idBStr, (balA - tokensAmountA), (balB - tokensAmountB), amountToGetEx, borrowAsset)
930930 else nil
931931 if ((exInv == exInv))
932932 then {
933933 let cBalAAfterRepay = accountBalance(idA)
934934 if ((cBalAAfterRepay == cBalAAfterRepay))
935935 then {
936936 let cBalBAfterRepay = accountBalance(idB)
937937 if ((cBalBAfterRepay == cBalBAfterRepay))
938938 then {
939939 let closeDbtInv = if ((debt > 0))
940940 then invoke(getLendSrvAddr(), "repayFor", [((user + "_") + posId)], [AttachedPayment(assetIdFromStr(borrowAsset), debt)])
941941 else 0
942942 if ((closeDbtInv == closeDbtInv))
943943 then if ((borrowAsset == idAStr))
944944 then $Tuple2(((cBalAAfterRepay - cBalABefore) - debt), (cBalBAfterRepay - cBalBBefore))
945945 else $Tuple2((cBalAAfterRepay - cBalABefore), ((cBalBAfterRepay - cBalBBefore) - debt))
946946 else throw("Strict value is not equal to itself.")
947947 }
948948 else throw("Strict value is not equal to itself.")
949949 }
950950 else throw("Strict value is not equal to itself.")
951951 }
952952 else throw("Strict value is not equal to itself.")
953953 }
954954 else throw("Strict value is not equal to itself.")
955955 }
956956 else $Tuple2(tokensAmountA, tokensAmountB)
957- let toUserA = $t02823129467._1
958- let toUserB = $t02823129467._2
957+ let toUserA = $t02806329299._1
958+ let toUserB = $t02806329299._2
959959 let poolTotalLoanEntries = if (isBorrowed)
960960 then [IntegerEntry((pool + kPoolTotalLoan), ((poolTotalShareLoan - userCanWithdraw) - stopLossFee))]
961961 else nil
962962 let entries = (([DeleteEntry((((((pool + "_") + user) + "_") + posId) + kUserPosition)), DeleteEntry((((user + "_") + posId) + kUserPositionPool)), DeleteEntry((((((pool + "_") + user) + "_") + posId) + kUserBorrowAmount)), DeleteEntry((((((pool + "_") + user) + "_") + posId) + kUserBorrowAssetId)), DeleteEntry((((((pool + "_") + user) + "_") + posId) + kUserPositionInterest)), IntegerEntry((pool + kPoolTotal), ((poolTotalShare - userCanWithdraw) - stopLossFee)), ScriptTransfer(userAddr, toUserA, idA), ScriptTransfer(userAddr, toUserB, idB), ScriptTransfer(moneyBox, stopLossFee, fromBase58String(shareId))] ++ poolTotalLoanEntries) ++ getCursEntries(idAStr, idBStr, shareId, nil))
963963 $Tuple2(entries, [toUserA, toUserB])
964964 }
965965 else throw("Strict value is not equal to itself.")
966966 }
967967 else throw("Strict value is not equal to itself.")
968968 }
969969 else throw("Strict value is not equal to itself.")
970970 }
971971 else throw("Strict value is not equal to itself.")
972972 }
973973 else throw("Strict value is not equal to itself.")
974974 }
975975
976976
977977 func parseRequest (requestId) = {
978978 let request = split(valueOrErrorMessage(getString(this, (requestId + kRequestId)), ("No request with id " + requestId)), ",")
979979 let user = request[0]
980980 let pool = request[1]
981981 let pmtA = parseIntValue(request[2])
982982 let AId = request[3]
983983 let pmtB = parseIntValue(request[4])
984984 let BId = request[5]
985985 let balA = parseIntValue(request[6])
986986 let balB = parseIntValue(request[7])
987987 let shareId = request[8]
988988 let bwAsset = request[9]
989989 let bwAmount = parseIntValue(request[10])
990990 $Tuple11(user, pool, pmtA, AId, pmtB, BId, balA, balB, shareId, bwAsset, bwAmount)
991991 }
992992
993993
994994 func calcBorrowAmount (pmtA,pmtB,aId,bId,leverage,borrowId) = if (if ((borrowId != aId))
995995 then (borrowId != bId)
996996 else false)
997997 then throw("Wrong borrow asset")
998998 else {
999999 let dPriceA = getIntegerValue(priceOracleAddr, (aId + kPriceInOracle))
10001000 let dPriceB = getIntegerValue(priceOracleAddr, (bId + kPriceInOracle))
10011001 let decPrA = pow(10, 0, getAssetDecimals(aId), 0, 0, DOWN)
10021002 let decPrB = pow(10, 0, getAssetDecimals(bId), 0, 0, DOWN)
10031003 let paydInDollar = (fraction(dPriceA, pmtA, decPrA) + fraction(dPriceB, pmtB, decPrB))
1004- let $t03144931546 = if ((borrowId == aId))
1004+ let $t03128131378 = if ((borrowId == aId))
10051005 then $Tuple2(dPriceA, decPrA)
10061006 else $Tuple2(dPriceB, decPrB)
1007- let borrowPrice = $t03144931546._1
1008- let borrowDecPr = $t03144931546._2
1007+ let borrowPrice = $t03128131378._1
1008+ let borrowDecPr = $t03128131378._2
10091009 fraction(fraction(paydInDollar, (leverage - 100), 100), borrowDecPr, borrowPrice)
10101010 }
10111011
10121012
10131013 func parseReplenishPmts (pmts,AId,BId) = if ((size(pmts) == 2))
10141014 then if ((assetIdToStr(pmts[0].assetId) != AId))
10151015 then throw("Wrong payment asset A")
10161016 else if ((assetIdToStr(pmts[1].assetId) != BId))
10171017 then throw("Wrong payment asset B")
10181018 else $Tuple2(pmts[0].amount, pmts[1].amount)
10191019 else if ((size(pmts) == 1))
10201020 then if ((assetIdToStr(pmts[0].assetId) == AId))
10211021 then $Tuple2(pmts[0].amount, 0)
10221022 else if ((assetIdToStr(pmts[0].assetId) == BId))
10231023 then $Tuple2(0, pmts[0].amount)
10241024 else throw("Wrong payment")
10251025 else throw("One or two payments expected")
10261026
10271027
10281028 func calcPriceImpact (balA,balB,newBalA,newBalB) = {
10291029 let pri = ((SCALE8 - fraction(fraction(balB, SCALE8, balA), SCALE8, fraction(newBalB, SCALE8, newBalA))) * 100)
10301030 if ((0 > pri))
10311031 then (pri * -1)
10321032 else pri
10331033 }
10341034
10351035
10361036 func claimAndCheckAmnt (pool,pType,claim,amount,change) = {
1037- let $t03254632805 = if (claim)
1037+ let $t03237832637 = if (claim)
10381038 then claimFarmed(pType, pool)
10391039 else {
10401040 let claimedAsset = if ((pType == SF_POOL))
10411041 then SWOPID
10421042 else if ((pType == WX_POOL))
10431043 then WXID
10441044 else unknownPoolType()
10451045 $Tuple2(amount, claimedAsset)
10461046 }
1047- let claimAmount = $t03254632805._1
1048- let claimAsset = $t03254632805._2
1047+ let claimAmount = $t03237832637._1
1048+ let claimAsset = $t03237832637._2
10491049 let bal = accountBalance(claimAsset)
10501050 if (if ((amount > (claimAmount + change)))
10511051 then true
10521052 else (amount > bal))
10531053 then throw("To big amount to exchange")
10541054 else $Tuple2(claimAmount, claimAsset)
10551055 }
1056+
1057+
1058+@Callable(i)
1059+func getPoolInfoREADONLY (pool) = {
1060+ let poolAddr = addressFromStringValue(pool)
1061+ let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
1062+ let $t03303433124 = getPoolData(Address(fromBase58String(pool)), pType)
1063+ let AId = $t03303433124._1
1064+ let BId = $t03303433124._2
1065+ let balA = $t03303433124._3
1066+ let balB = $t03303433124._4
1067+ let shareId = $t03303433124._5
1068+ let shareSupply = getShareSupply(poolAddr, pType, shareId)
1069+ $Tuple2(nil, $Tuple6(AId, BId, shareId, balA, balB, shareSupply))
1070+ }
1071+
10561072
10571073
10581074 @Callable(i)
10591075 func getShareAssetPriceREADONLY (shareId) = {
10601076 let sharePrices = getSharePrice(shareId)
10611077 $Tuple2(nil, sharePrices)
10621078 }
10631079
10641080
10651081
10661082 @Callable(i)
10671083 func getUserPositionShareAmountREADONLY (user,posNum) = {
10681084 let pool = valueOrErrorMessage(getString(this, (((user + "_") + posNum) + kUserPositionPool)), "Unknown position")
10691085 let borrowAmount = getIntegerValue(this, (((((pool + "_") + user) + "_") + posNum) + kUserBorrowAmount))
10701086 let userCanWithdraw = userCanWithdrawShareCalc(user, pool, posNum, (borrowAmount > 0))
10711087 $Tuple2(nil, userCanWithdraw)
10721088 }
10731089
10741090
10751091
10761092 @Callable(i)
10771093 func getUserPositionREADONLY (user,pools,posNum) = {
10781094 func userPos (a,pool) = {
1079- let $t03376733837 = a
1080- let wAmountsA = $t03376733837._1
1081- let wAmountsB = $t03376733837._2
1082- let debts = $t03376733837._3
1083- let eqWAmountsA = $t03376733837._4
1084- let eqWAmountsB = $t03376733837._5
1085- let index = $t03376733837._6
1095+ let $t03399734067 = a
1096+ let wAmountsA = $t03399734067._1
1097+ let wAmountsB = $t03399734067._2
1098+ let debts = $t03399734067._3
1099+ let eqWAmountsA = $t03399734067._4
1100+ let eqWAmountsB = $t03399734067._5
1101+ let index = $t03399734067._6
10861102 if (!(isDefined(getInteger(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserPosition)))))
10871103 then $Tuple6((wAmountsA :+ 0), (wAmountsB :+ 0), (debts :+ 0), (eqWAmountsA :+ 0), (eqWAmountsB :+ 0), (index + 1))
10881104 else {
10891105 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
1090- let $t03411634206 = getPoolData(Address(fromBase58String(pool)), pType)
1091- let AId = $t03411634206._1
1092- let BId = $t03411634206._2
1093- let balA = $t03411634206._3
1094- let balB = $t03411634206._4
1095- let shareId = $t03411634206._5
1106+ let $t03434634436 = getPoolData(Address(fromBase58String(pool)), pType)
1107+ let AId = $t03434634436._1
1108+ let BId = $t03434634436._2
1109+ let balA = $t03434634436._3
1110+ let balB = $t03434634436._4
1111+ let shareId = $t03434634436._5
10961112 let borrowAmount = valueOrElse(getInteger(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserBorrowAmount)), 0)
10971113 let userCanWithdraw = userCanWithdrawShareCalc(user, pool, posNum[index], (borrowAmount > 0))
1098- let $t03442234542 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userCanWithdraw)
1099- let wAmountA = $t03442234542._1
1100- let wAmountB = $t03442234542._2
1114+ let $t03465234772 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userCanWithdraw)
1115+ let wAmountA = $t03465234772._1
1116+ let wAmountB = $t03465234772._2
11011117 if ((borrowAmount > 0))
11021118 then {
11031119 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserBorrowAssetId))
11041120 let debt = {
11051121 let @ = invoke(getLendSrvAddr(), "getAssetDebt", [false, ((user + "_") + posNum[index]), borrowAsset], nil)
11061122 if ($isInstanceOf(@, "Int"))
11071123 then @
11081124 else throw(($getType(@) + " couldn't be cast to Int"))
11091125 }
11101126 if ((debt == debt))
11111127 then {
11121128 let amountToGetEx = if (if ((borrowAsset == AId))
11131129 then (debt > wAmountA)
11141130 else false)
11151131 then (debt - wAmountA)
11161132 else if (if ((borrowAsset == BId))
11171133 then (debt > wAmountB)
11181134 else false)
11191135 then (debt - wAmountB)
11201136 else 0
11211137 let amountToPay = if ((amountToGetEx > 0))
11221138 then if ((pType == SF_POOL))
11231139 then {
11241140 let ex = calcAmountToPaySF(pool, AId, BId, balA, balB, amountToGetEx, borrowAsset)
11251141 ex._2
11261142 }
11271143 else if ((pType == WX_POOL))
11281144 then {
11291145 let ex = calcAmountToPayWX(pool, AId, BId, balA, balB, amountToGetEx, borrowAsset)
11301146 ex._2
11311147 }
11321148 else unknownPoolType()
11331149 else 0
1134- let $t03545435673 = if ((borrowAsset == AId))
1150+ let $t03568435903 = if ((borrowAsset == AId))
11351151 then $Tuple2(((wAmountA + amountToGetEx) - debt), (wAmountB - amountToPay))
11361152 else $Tuple2((wAmountA - amountToPay), ((wAmountB + amountToGetEx) - debt))
1137- let eqWAmountA = $t03545435673._1
1138- let eqWAmountB = $t03545435673._2
1153+ let eqWAmountA = $t03568435903._1
1154+ let eqWAmountB = $t03568435903._2
11391155 $Tuple6((wAmountsA :+ wAmountA), (wAmountsB :+ wAmountB), (debts :+ debt), (eqWAmountsA :+ eqWAmountA), (eqWAmountsB :+ eqWAmountB), (index + 1))
11401156 }
11411157 else throw("Strict value is not equal to itself.")
11421158 }
11431159 else $Tuple6((wAmountsA :+ wAmountA), (wAmountsB :+ wAmountB), debts, (wAmountsA :+ wAmountA), (wAmountsB :+ wAmountB), (index + 1))
11441160 }
11451161 }
11461162
1147- let $t03592836039 = {
1163+ let $t03615836269 = {
11481164 let $l = pools
11491165 let $s = size($l)
11501166 let $acc0 = $Tuple6(nil, nil, nil, nil, nil, 0)
11511167 func $f0_1 ($a,$i) = if (($i >= $s))
11521168 then $a
11531169 else userPos($a, $l[$i])
11541170
11551171 func $f0_2 ($a,$i) = if (($i >= $s))
11561172 then $a
11571173 else throw("List size exceeds 20")
11581174
11591175 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
11601176 }
1161- let wAmountsA = $t03592836039._1
1162- let wAmountsB = $t03592836039._2
1163- let debts = $t03592836039._3
1164- let eqWAmountsA = $t03592836039._4
1165- let eqWAmountsB = $t03592836039._5
1177+ let wAmountsA = $t03615836269._1
1178+ let wAmountsB = $t03615836269._2
1179+ let debts = $t03615836269._3
1180+ let eqWAmountsA = $t03615836269._4
1181+ let eqWAmountsB = $t03615836269._5
11661182 $Tuple2(nil, $Tuple5(wAmountsA, wAmountsB, debts, eqWAmountsA, eqWAmountsB))
11671183 }
11681184
11691185
11701186
11711187 @Callable(i)
11721188 func replenish (pool,leverage,borrowId) = valueOrElse(isActiveForUsers(), {
11731189 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
11741190 if (!(isPoolActive(pool, pType)))
11751191 then throw("Pool not active at this moment")
11761192 else if (if ((100 > leverage))
11771193 then true
11781194 else (leverage > 300))
11791195 then throw("Leverage can't be <100 and >300")
11801196 else if (if (!(getBooleanValue(this, (pool + kPoolCanBorrow))))
11811197 then (leverage > 100)
11821198 else false)
11831199 then throw("You can't borrow in this pool")
11841200 else {
1185- let $t03663736727 = getPoolData(Address(fromBase58String(pool)), pType)
1186- let AId = $t03663736727._1
1187- let BId = $t03663736727._2
1188- let balA = $t03663736727._3
1189- let balB = $t03663736727._4
1190- let shareId = $t03663736727._5
1201+ let $t03686736957 = getPoolData(Address(fromBase58String(pool)), pType)
1202+ let AId = $t03686736957._1
1203+ let BId = $t03686736957._2
1204+ let balA = $t03686736957._3
1205+ let balB = $t03686736957._4
1206+ let shareId = $t03686736957._5
11911207 if (if ((borrowId != AId))
11921208 then (borrowId != BId)
11931209 else false)
11941210 then throw("Wrong borrow asset")
11951211 else {
1196- let $t03680836867 = parseReplenishPmts(i.payments, AId, BId)
1197- let pmtA = $t03680836867._1
1198- let pmtB = $t03680836867._2
1212+ let $t03703837097 = parseReplenishPmts(i.payments, AId, BId)
1213+ let pmtA = $t03703837097._1
1214+ let pmtB = $t03703837097._2
11991215 let user = toString(i.caller)
12001216 let newPosNum = getNewUserPositionNumber(user)
12011217 if ((leverage > 100))
12021218 then {
12031219 let borrowAmount = calcBorrowAmount(pmtA, pmtB, AId, BId, leverage, borrowId)
12041220 let request = makeString([user, pool, toString(pmtA), AId, toString(pmtB), BId, toString(balA), toString(balB), shareId, borrowId, toString(borrowAmount)], ",")
12051221 let newRequestId = {
12061222 let @ = invoke(this, "createNewRequest", [request], nil)
12071223 if ($isInstanceOf(@, "Int"))
12081224 then @
12091225 else throw(($getType(@) + " couldn't be cast to Int"))
12101226 }
12111227 if ((newRequestId == newRequestId))
12121228 then {
12131229 let args = [((user + "_") + toString(newPosNum)), shareId, borrowId, borrowAmount, toString(this), "replenishFromLand", toString(valueOrErrorMessage(newRequestId, "Can't create new request"))]
12141230 let inv = reentrantInvoke(getLendSrvAddr(), "flashPosition", args, nil)
12151231 if ((inv == inv))
12161232 then {
12171233 let userStaked = getIntegerValue(this, (((((pool + "_") + user) + "_") + toString(newPosNum)) + kUserPosition))
1218- let $t03785637950 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1219- if (($t03785637950 == $t03785637950))
1234+ let $t03808638180 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1235+ if (($t03808638180 == $t03808638180))
12201236 then {
1221- let newBalB = $t03785637950._2
1222- let newBalA = $t03785637950._1
1237+ let newBalB = $t03808638180._2
1238+ let newBalA = $t03808638180._1
12231239 let prImpact = calcPriceImpact(balA, balB, newBalA, newBalB)
1224- let $t03802038135 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1225- let wAmountA = $t03802038135._1
1226- let wAmountB = $t03802038135._2
1240+ let $t03825038365 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1241+ let wAmountA = $t03825038365._1
1242+ let wAmountB = $t03825038365._2
12271243 $Tuple2(nil, [prImpact, wAmountA, wAmountB])
12281244 }
12291245 else throw("Strict value is not equal to itself.")
12301246 }
12311247 else throw("Strict value is not equal to itself.")
12321248 }
12331249 else throw("Strict value is not equal to itself.")
12341250 }
12351251 else {
1236- let $t03818838303 = replenishByType(pType, pool, NO_LOAN_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId)
1237- if (($t03818838303 == $t03818838303))
1252+ let $t03841838533 = replenishByType(pType, pool, NO_LOAN_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId)
1253+ if (($t03841838533 == $t03841838533))
12381254 then {
1239- let axlyFee = $t03818838303._2
1240- let userStaked = $t03818838303._1
1241- let $t03830938403 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1242- if (($t03830938403 == $t03830938403))
1255+ let axlyFee = $t03841838533._2
1256+ let userStaked = $t03841838533._1
1257+ let $t03853938633 = getPoolBalances(Address(fromBase58String(pool)), pType, AId, BId)
1258+ if (($t03853938633 == $t03853938633))
12431259 then {
1244- let newBalB = $t03830938403._2
1245- let newBalA = $t03830938403._1
1260+ let newBalB = $t03853938633._2
1261+ let newBalA = $t03853938633._1
12461262 let prImpact = calcPriceImpact(balA, balB, newBalA, newBalB)
1247- let $t03847338588 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1248- let wAmountA = $t03847338588._1
1249- let wAmountB = $t03847338588._2
1263+ let $t03870338818 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1264+ let wAmountA = $t03870338818._1
1265+ let wAmountB = $t03870338818._2
12501266 $Tuple2((replenishEntries(pool, user, userStaked, axlyFee, newPosNum, shareId, pType, false) ++ getCursEntries(AId, BId, shareId, [toString(wAmountA), toString(wAmountB)])), [prImpact, wAmountA, wAmountB])
12511267 }
12521268 else throw("Strict value is not equal to itself.")
12531269 }
12541270 else throw("Strict value is not equal to itself.")
12551271 }
12561272 }
12571273 }
12581274 })
12591275
12601276
12611277
12621278 @Callable(i)
12631279 func withdraw (pool,posId) = valueOrElse(isActiveForUsers(), {
12641280 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
12651281 if (!(isPoolActive(pool, pType)))
12661282 then throw("Pool not active at this moment")
12671283 else withdrawToUser(toString(i.caller), pool, toString(posId), false)
12681284 })
12691285
12701286
12711287
12721288 @Callable(i)
12731289 func createUpdateStopLoss (posId,poolId,assetId,price) = valueOrElse(isActiveForUsers(), {
12741290 let tokenOraclePrice = getIntegerValue(priceOracleAddr, (assetId + kPriceInOracle))
12751291 let pType = valueOrErrorMessage(getString(this, (kPool + poolId)), "Pool is not inited")
12761292 if (!(isPoolActive(poolId, pType)))
12771293 then throw("Pool not active at this moment")
12781294 else if (!(isDefined(getInteger(this, (((((poolId + "_") + toString(i.caller)) + "_") + toString(posId)) + kUserPosition)))))
12791295 then throw("There are no user position")
12801296 else if ((0 >= price))
12811297 then throw("Price must be greater than 0")
12821298 else if ((price > tokenOraclePrice))
12831299 then throw("Price must be less than current token price")
12841300 else [IntegerEntry((((((((toString(i.caller) + "_") + toString(posId)) + "_") + poolId) + "_") + assetId) + kUserStopLoss), price)]
12851301 })
12861302
12871303
12881304
12891305 @Callable(i)
12901306 func deleteStopLoss (posId,poolId,assetId) = valueOrElse(isActiveForUsers(), {
12911307 let pType = valueOrErrorMessage(getString(this, (kPool + poolId)), "Pool is not inited")
12921308 if (!(isPoolActive(poolId, pType)))
12931309 then throw("Pool not active at this moment")
12941310 else if (!(isDefined(getInteger(this, (((((((toString(i.caller) + "_") + toString(posId)) + "_") + poolId) + "_") + assetId) + kUserStopLoss)))))
12951311 then throw("No entry")
12961312 else [DeleteEntry((((((((toString(i.caller) + "_") + toString(posId)) + "_") + poolId) + "_") + assetId) + kUserStopLoss))]
12971313 })
12981314
12991315
13001316
13011317 @Callable(i)
13021318 func init (moneyBoxAddr,sfFarmingAddr,lendAddr,priceOracleAddr,keeperExContract,wxSwapContract,swopAssetId,wxAssetId,operatorPubKey,group1Admin1PubKey,group1Admin2PubKey,group2Admin1PubKey,group2Admin2PubKey) = valueOrElse(isSelfCall(i), if (isDefined(getString(kOperatorCallPK)))
13031319 then throw("Already inited")
13041320 else if (!(isDefined(addressFromString(moneyBoxAddr))))
13051321 then throw("moneyBoxAddr is not correct address")
13061322 else if (!(isDefined(addressFromString(sfFarmingAddr))))
13071323 then throw("sfFarmingAddr is not correct address")
13081324 else if (!(isDefined(addressFromString(lendAddr))))
13091325 then throw("lendAddr is not correct address")
13101326 else if (!(isDefined(addressFromString(priceOracleAddr))))
13111327 then throw("priceOracleAddr is not correct address")
13121328 else if (!(isDefined(addressFromString(keeperExContract))))
13131329 then throw("keeperExContract is not correct address")
13141330 else if (!(isDefined(assetInfo(fromBase58String(swopAssetId)))))
13151331 then throw("swopAssetId is not correct asset id")
13161332 else if (!(isDefined(assetInfo(fromBase58String(wxAssetId)))))
13171333 then throw("swopAssetId is not correct asset id")
13181334 else if ((size(fromBase58String(operatorPubKey)) != 32))
13191335 then throw("operatorPubKey is not correct")
13201336 else if ((size(fromBase58String(group1Admin1PubKey)) != 32))
1321- then throw("operatorPubKey is not correct")
1337+ then throw("group1Admin1PubKey is not correct")
13221338 else if ((size(fromBase58String(group1Admin2PubKey)) != 32))
1323- then throw("operatorPubKey is not correct")
1339+ then throw("group1Admin2PubKey is not correct")
13241340 else if ((size(fromBase58String(group2Admin1PubKey)) != 32))
1325- then throw("operatorPubKey is not correct")
1341+ then throw("group2Admin1PubKey is not correct")
13261342 else if ((size(fromBase58String(group2Admin2PubKey)) != 32))
1327- then throw("operatorPubKey is not correct")
1343+ then throw("group2Admin2PubKey is not correct")
13281344 else [StringEntry(kMoneyBox, moneyBoxAddr), StringEntry(kSFFarmingAddr, sfFarmingAddr), StringEntry(kLendService, lendAddr), StringEntry(kPriceOracle, priceOracleAddr), StringEntry(kExContract, keeperExContract), StringEntry(kWxSwapContract, wxSwapContract), StringEntry(kSwopId, swopAssetId), StringEntry(kWxId, wxAssetId), StringEntry(kOperatorCallPK, operatorPubKey), StringEntry(kGroup1Admin1PK, group1Admin1PubKey), StringEntry(kGroup1Admin2PK, group1Admin2PubKey), StringEntry(kGroup2Admin1PK, group2Admin1PubKey), StringEntry(kGroup2Admin2PK, group2Admin2PubKey)])
13291345
13301346
13311347
13321348 @Callable(i)
13331349 func createNewRequest (params) = valueOrElse(isSelfCall(i), {
13341350 let newRequestId = (valueOrElse(getInteger(this, kRequestIter), 0) + 1)
13351351 $Tuple2([StringEntry((toString(newRequestId) + kRequestId), params), IntegerEntry(kRequestIter, newRequestId)], newRequestId)
13361352 })
13371353
13381354
13391355
13401356 @Callable(i)
13411357 func replenishFromLand (requestId) = valueOrElse(isActive(), valueOrElse(isLandCall(i), {
1342- let $t04341143515 = parseRequest(requestId)
1343- let user = $t04341143515._1
1344- let pool = $t04341143515._2
1345- let pmtA = $t04341143515._3
1346- let AId = $t04341143515._4
1347- let pmtB = $t04341143515._5
1348- let BId = $t04341143515._6
1349- let balA = $t04341143515._7
1350- let balB = $t04341143515._8
1351- let shareId = $t04341143515._9
1352- let bwAsset = $t04341143515._10
1353- let bwAmount = $t04341143515._11
1358+ let $t04365743761 = parseRequest(requestId)
1359+ let user = $t04365743761._1
1360+ let pool = $t04365743761._2
1361+ let pmtA = $t04365743761._3
1362+ let AId = $t04365743761._4
1363+ let pmtB = $t04365743761._5
1364+ let BId = $t04365743761._6
1365+ let balA = $t04365743761._7
1366+ let balB = $t04365743761._8
1367+ let shareId = $t04365743761._9
1368+ let bwAsset = $t04365743761._10
1369+ let bwAmount = $t04365743761._11
13541370 if ((size(i.payments) != 1))
13551371 then throw("Wrong payment size")
13561372 else if (if ((assetIdToStr(i.payments[0].assetId) != bwAsset))
13571373 then true
13581374 else (i.payments[0].amount != bwAmount))
13591375 then throw("Wrong payment")
13601376 else {
1361- let $t04370543805 = if ((AId == bwAsset))
1377+ let $t04395144051 = if ((AId == bwAsset))
13621378 then $Tuple2((pmtA + bwAmount), pmtB)
13631379 else $Tuple2(pmtA, (pmtB + bwAmount))
1364- let pmtAllA = $t04370543805._1
1365- let pmtAllB = $t04370543805._2
1380+ let pmtAllA = $t04395144051._1
1381+ let pmtAllB = $t04395144051._2
13661382 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Unknown pool")
1367- let $t04388744002 = replenishByType(pType, pool, LOAN_FEE, pmtAllA, AId, pmtAllB, BId, balA, balB, shareId)
1368- let userStaked = $t04388744002._1
1369- let axlyFee = $t04388744002._2
1383+ let $t04413344248 = replenishByType(pType, pool, LOAN_FEE, pmtAllA, AId, pmtAllB, BId, balA, balB, shareId)
1384+ let userStaked = $t04413344248._1
1385+ let axlyFee = $t04413344248._2
13701386 let posNum = getNewUserPositionNumber(user)
13711387 let borrowEntries = [IntegerEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserBorrowAmount), bwAmount), StringEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserBorrowAssetId), bwAsset)]
13721388 let entries = replenishEntries(pool, user, userStaked, axlyFee, posNum, shareId, pType, true)
1373- let $t04436244477 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1374- let wAmountA = $t04436244477._1
1375- let wAmountB = $t04436244477._2
1389+ let $t04460844723 = calcWithdrawLPFromPoolVirt(Address(fromBase58String(pool)), pType, shareId, userStaked)
1390+ let wAmountA = $t04460844723._1
1391+ let wAmountB = $t04460844723._2
13761392 $Tuple2((((entries ++ getCursEntries(AId, BId, shareId, [toString(wAmountA), toString(wAmountB)])) ++ borrowEntries) :+ DeleteEntry((requestId + kRequestId))), userStaked)
13771393 }
13781394 }))
13791395
13801396
13811397
13821398 @Callable(i)
13831399 func liquidate (user,posId,liquidateAmount) = valueOrElse(isActive(), valueOrElse(isLandCall(i), {
13841400 let pool = valueOrErrorMessage(getString(this, (((user + "_") + posId) + kUserPositionPool)), "no position")
13851401 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
1386- let $t04499845088 = getPoolData(Address(fromBase58String(pool)), pType)
1387- let AId = $t04499845088._1
1388- let BId = $t04499845088._2
1389- let balA = $t04499845088._3
1390- let balB = $t04499845088._4
1391- let shareId = $t04499845088._5
1402+ let $t04524445334 = getPoolData(Address(fromBase58String(pool)), pType)
1403+ let AId = $t04524445334._1
1404+ let BId = $t04524445334._2
1405+ let balA = $t04524445334._3
1406+ let balB = $t04524445334._4
1407+ let shareId = $t04524445334._5
13921408 let amount = unstakeLP(pool, pType, shareId, liquidateAmount)
13931409 let borrowAmount = getIntegerValue(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAmount))
13941410 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAssetId))
13951411 let userCanWithdraw = userCanWithdrawShareCalc(user, pool, posId, (borrowAmount > 0))
13961412 if ((liquidateAmount > userCanWithdraw))
13971413 then throw("You can't liquidate more than user have")
13981414 else if ((borrowAmount == 0))
13991415 then throw("You can't liquidate position without borrow")
14001416 else [IntegerEntry((((((pool + "_") + user) + "_") + posId) + kUserPositionInterest), getIntegerValue(this, (pool + kPoolInterestLoan))), IntegerEntry((pool + kPoolTotalLoan), (getPoolTotalShareWithLoan(pool) - liquidateAmount)), IntegerEntry((pool + kPoolTotal), (getPoolTotalShare(pool) - liquidateAmount)), IntegerEntry((((((pool + "_") + user) + "_") + posId) + kUserPosition), (userCanWithdraw - liquidateAmount)), ScriptTransfer(i.caller, amount, fromBase58String(shareId))]
14011417 }))
14021418
14031419
14041420
14051421 @Callable(i)
14061422 func stopLoss (user,posId,pool,assetId) = valueOrElse(isActive(), valueOrElse(isOperatorCall(i), {
14071423 let tokenOraclePrice = getIntegerValue(priceOracleAddr, (assetId + kPriceInOracle))
14081424 let stopLossPrice = valueOrErrorMessage(getInteger(this, (((((((user + "_") + toString(posId)) + "_") + pool) + "_") + assetId) + kUserStopLoss)), "No entry")
14091425 if ((tokenOraclePrice > stopLossPrice))
14101426 then throw("Token price greater stop loss price")
14111427 else {
14121428 let res = withdrawToUser(user, pool, toString(posId), true)
14131429 $Tuple2((res._1 :+ DeleteEntry((((((((user + "_") + toString(posId)) + "_") + pool) + "_") + assetId) + kUserStopLoss))), res._2)
14141430 }
14151431 }))
14161432
14171433
14181434
14191435 @Callable(i)
14201436 func capitalizeExKeeper (pool,tokenToId,amountToExchange,claim,amountsIn,addresses,assetsToReceive,estReceived,slippageTolerance,minReceived,options) = valueOrElse(isActive(), valueOrElse(isOperatorCall(i), {
14211437 let pType = getStringValue(this, (kPool + pool))
14221438 let change = valueOrElse(getInteger(this, (pool + kPoolCapChange)), 0)
1423- let $t04724047339 = claimAndCheckAmnt(pool, pType, claim, amountToExchange, change)
1424- let claimedAmount = $t04724047339._1
1425- let claimedAsset = $t04724047339._2
1439+ let $t04748347582 = claimAndCheckAmnt(pool, pType, claim, amountToExchange, change)
1440+ let claimedAmount = $t04748347582._1
1441+ let claimedAsset = $t04748347582._2
14261442 let exchangedAmount = exchangeKeeper(tokenToId, amountToExchange, claimedAsset, amountsIn, addresses, assetsToReceive, estReceived, slippageTolerance, minReceived, options)
14271443 let newChange = ((claimedAmount + change) - amountToExchange)
14281444 let changeEntry = if ((newChange >= 0))
14291445 then [IntegerEntry((pool + kPoolCapChange), newChange)]
14301446 else throw("Negative change")
14311447 (capitalize(pool, pType, tokenToId, exchangedAmount) ++ changeEntry)
14321448 }))
14331449
14341450
14351451
14361452 @Callable(i)
14371453 func capitalizeExPuzzle (pool,tokenToId,amountToExchange,claim,routesStr,minToReceive,options) = valueOrElse(isActive(), valueOrElse(isOperatorCall(i), {
14381454 let pType = getStringValue(this, (kPool + pool))
14391455 let change = valueOrElse(getInteger(this, (pool + kPoolCapChange)), 0)
1440- let $t04813948238 = claimAndCheckAmnt(pool, pType, claim, amountToExchange, change)
1441- let claimedAmount = $t04813948238._1
1442- let claimedAsset = $t04813948238._2
1456+ let $t04838248481 = claimAndCheckAmnt(pool, pType, claim, amountToExchange, change)
1457+ let claimedAmount = $t04838248481._1
1458+ let claimedAsset = $t04838248481._2
14431459 let exchangedAmount = exchangePuzzle(tokenToId, amountToExchange, claimedAsset, routesStr, minToReceive, options)
14441460 let newChange = ((claimedAmount + change) - amountToExchange)
14451461 let changeEntry = if ((newChange >= 0))
14461462 then [IntegerEntry((pool + kPoolCapChange), newChange)]
14471463 else nil
14481464 (capitalize(pool, pType, tokenToId, exchangedAmount) ++ changeEntry)
14491465 }))
14501466
14511467
14521468
14531469 @Callable(i)
14541470 func capitalizeExSwopFi (pool,tokenToId,amountToExchange,claim,exchangers,exchangersType,args1,args2,routingAssetsKeys,minAmountToReceive,options) = valueOrElse(isActive(), valueOrElse(isOperatorCall(i), {
14551471 let pType = getStringValue(this, (kPool + pool))
14561472 let change = valueOrElse(getInteger(this, (pool + kPoolCapChange)), 0)
1457- let $t04908349182 = claimAndCheckAmnt(pool, pType, claim, amountToExchange, change)
1458- let claimedAmount = $t04908349182._1
1459- let claimedAsset = $t04908349182._2
1473+ let $t04932649425 = claimAndCheckAmnt(pool, pType, claim, amountToExchange, change)
1474+ let claimedAmount = $t04932649425._1
1475+ let claimedAsset = $t04932649425._2
14601476 let exchangedAmount = exchangeSwopFi(tokenToId, amountToExchange, claimedAsset, exchangers, exchangersType, args1, args2, routingAssetsKeys, minAmountToReceive, options)
14611477 let newChange = ((claimedAmount + change) - amountToExchange)
14621478 let changeEntry = if ((newChange >= 0))
14631479 then [IntegerEntry((pool + kPoolCapChange), newChange)]
14641480 else nil
14651481 (capitalize(pool, pType, tokenToId, exchangedAmount) ++ changeEntry)
14661482 }))
14671483
14681484
14691485
14701486 @Callable(i)
14711487 func capitalizeNoEx (pool,claim,amountFromBalance) = valueOrElse(isActive(), valueOrElse(isOperatorCall(i), {
14721488 let pType = getStringValue(this, (kPool + pool))
1473- let $t04977949874 = claimAndCheckAmnt(pool, pType, claim, amountFromBalance, 0)
1474- let claimedAmount = $t04977949874._1
1475- let claimedAsset = $t04977949874._2
1489+ let $t05002250117 = claimAndCheckAmnt(pool, pType, claim, amountFromBalance, 0)
1490+ let claimedAmount = $t05002250117._1
1491+ let claimedAsset = $t05002250117._2
14761492 capitalize(pool, pType, assetIdToStr(claimedAsset), (claimedAmount + amountFromBalance))
14771493 }))
14781494
14791495
14801496
14811497 @Callable(i)
14821498 func initNewPool (type,poolAddr,inFeeNoLoan,inFeeLoan,capFeeNoLoan,capFeeWithLoan,stoplossFeeNoLoan,stoplossFeeWithLoan,canBorrow) = valueOrElse(isActive(), valueOrElse(isAdminCall(i), if (if ((type != SF_POOL))
14831499 then (type != WX_POOL)
14841500 else false)
14851501 then throw("Wrong type")
14861502 else {
1487- let $t05030050394 = getPoolData(Address(fromBase58String(poolAddr)), type)
1488- let aId = $t05030050394._1
1489- let bId = $t05030050394._2
1490- let aBal = $t05030050394._3
1491- let bBal = $t05030050394._4
1492- let shareId = $t05030050394._5
1503+ let $t05054350637 = getPoolData(Address(fromBase58String(poolAddr)), type)
1504+ let aId = $t05054350637._1
1505+ let bId = $t05054350637._2
1506+ let aBal = $t05054350637._3
1507+ let bBal = $t05054350637._4
1508+ let shareId = $t05054350637._5
14931509 if ((0 > inFeeNoLoan))
14941510 then throw("inFeeNoLoan must be greater than 0")
14951511 else if ((0 > inFeeLoan))
14961512 then throw("inFeeLoan must be greater than 0")
14971513 else if ((0 > capFeeNoLoan))
14981514 then throw("capFeeNoLoan must be greater than 0")
14991515 else if ((0 > capFeeWithLoan))
15001516 then throw("capFeeWithLoan must be greater than 0")
15011517 else if ((0 > stoplossFeeNoLoan))
15021518 then throw("stoplossFeeNoLoan must be greater than 0")
15031519 else if ((0 > stoplossFeeWithLoan))
15041520 then throw("stoplossFeeWithLoan must be greater than 0")
15051521 else [IntegerEntry((poolAddr + kAxlyInFeeWithoutLoan), inFeeNoLoan), IntegerEntry((poolAddr + kAxlyInFeeWithLoan), inFeeLoan), IntegerEntry((poolAddr + kAxlyNoLoanCapFee), capFeeNoLoan), IntegerEntry((poolAddr + kAxlyWithLoanCapFee), capFeeWithLoan), IntegerEntry((poolAddr + kAxlyStopLossNoLoanFee), stoplossFeeNoLoan), IntegerEntry((poolAddr + kAxlyStopLossLoanFee), stoplossFeeWithLoan), IntegerEntry((poolAddr + kPoolInterestLoan), 0), IntegerEntry((poolAddr + kPoolInterestNoLoan), 0), StringEntry((kPool + poolAddr), type), StringEntry((shareId + kSharePool), poolAddr), BooleanEntry((poolAddr + kPoolCanBorrow), canBorrow)]
15061522 }))
1523+
1524+
1525+
1526+@Callable(i)
1527+func updatePoolFees (poolAddr,inFeeNoLoan,inFeeLoan,capFeeNoLoan,capFeeWithLoan,stoplossFeeNoLoan,stoplossFeeWithLoan) = valueOrElse(isActive(), valueOrElse(isAdminCall(i), if (!(isDefined(getString(this, (kPool + poolAddr)))))
1528+ then throw(("Can't find pool with addr " + poolAddr))
1529+ else if ((0 > inFeeNoLoan))
1530+ then throw("inFeeNoLoan must be greater than 0")
1531+ else if ((0 > inFeeLoan))
1532+ then throw("inFeeLoan must be greater than 0")
1533+ else if ((0 > capFeeNoLoan))
1534+ then throw("capFeeNoLoan must be greater than 0")
1535+ else if ((0 > capFeeWithLoan))
1536+ then throw("capFeeWithLoan must be greater than 0")
1537+ else if ((0 > stoplossFeeNoLoan))
1538+ then throw("stoplossFeeNoLoan must be greater than 0")
1539+ else if ((0 > stoplossFeeWithLoan))
1540+ then throw("stoplossFeeWithLoan must be greater than 0")
1541+ else [IntegerEntry((poolAddr + kAxlyInFeeWithoutLoan), inFeeNoLoan), IntegerEntry((poolAddr + kAxlyInFeeWithLoan), inFeeLoan), IntegerEntry((poolAddr + kAxlyNoLoanCapFee), capFeeNoLoan), IntegerEntry((poolAddr + kAxlyWithLoanCapFee), capFeeWithLoan), IntegerEntry((poolAddr + kAxlyStopLossNoLoanFee), stoplossFeeNoLoan), IntegerEntry((poolAddr + kAxlyStopLossLoanFee), stoplossFeeWithLoan)]))
15071542
15081543
15091544
15101545 @Callable(i)
15111546 func activate () = valueOrElse(isAdminCall(i), if (valueOrElse(getBoolean(this, kActive), true))
15121547 then throw("dApp already active")
15131548 else [BooleanEntry(kActive, true)])
15141549
15151550
15161551
15171552 @Callable(i)
15181553 func shutdown () = valueOrElse(isAdminCall(i), if (!(valueOrElse(getBoolean(this, kActive), true)))
15191554 then throw("dApp already shutdown")
15201555 else [BooleanEntry(kActive, false)])
15211556
15221557
15231558
15241559 @Callable(i)
15251560 func activateForUsers () = valueOrElse(isAdminCall(i), if (valueOrElse(getBoolean(this, kActiveUsers), true))
15261561 then throw("dApp already active for users")
15271562 else [BooleanEntry(kActiveUsers, true)])
15281563
15291564
15301565
15311566 @Callable(i)
15321567 func shutdownForUsers () = valueOrElse(isAdminCall(i), if (!(valueOrElse(getBoolean(this, kActiveUsers), true)))
15331568 then throw("dApp already shutdown for users")
15341569 else [BooleanEntry(kActiveUsers, false)])
15351570
15361571
15371572
15381573 @Callable(i)
15391574 func activateSF () = valueOrElse(isAdminCall(i), if (valueOrElse(getBoolean(this, (SF_POOL + kActiveSFWX)), true))
15401575 then throw("SWOPFI already active")
15411576 else [BooleanEntry((SF_POOL + kActiveSFWX), true)])
15421577
15431578
15441579
15451580 @Callable(i)
15461581 func shutdownSF () = valueOrElse(isAdminCall(i), if (!(valueOrElse(getBoolean(this, (SF_POOL + kActiveSFWX)), true)))
15471582 then throw("SWOPFI already shutdown")
15481583 else [BooleanEntry((SF_POOL + kActiveSFWX), false)])
15491584
15501585
15511586
15521587 @Callable(i)
15531588 func activateWX () = valueOrElse(isAdminCall(i), if (valueOrElse(getBoolean(this, (WX_POOL + kActiveSFWX)), true))
15541589 then throw("WX already active")
15551590 else [BooleanEntry((WX_POOL + kActiveSFWX), true)])
15561591
15571592
15581593
15591594 @Callable(i)
15601595 func shutdownWX () = valueOrElse(isAdminCall(i), if (!(valueOrElse(getBoolean(this, (WX_POOL + kActiveSFWX)), true)))
15611596 then throw("WX already shutdown")
15621597 else [BooleanEntry((WX_POOL + kActiveSFWX), false)])
15631598
15641599
15651600
15661601 @Callable(i)
15671602 func activatePool (pool) = valueOrElse(isAdminCall(i), if (!(isDefined(getString(this, (kPool + pool)))))
15681603 then throw("Unknown pool")
15691604 else if (valueOrElse(getBoolean(this, (pool + kPoolActive)), true))
15701605 then throw("Pool already active")
15711606 else [BooleanEntry((pool + kPoolActive), true)])
15721607
15731608
15741609
15751610 @Callable(i)
15761611 func shutdownPool (pool) = valueOrElse(isAdminCall(i), if (!(isDefined(getString(this, (kPool + pool)))))
15771612 then throw("Unknown pool")
15781613 else if (!(valueOrElse(getBoolean(this, (pool + kPoolActive)), true)))
15791614 then throw("Pool already shutdown")
15801615 else [BooleanEntry((pool + kPoolActive), false)])
15811616
15821617
1583-@Verifier(tx)
1584-func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
1585-

github/deemru/w8io/3ef1775 
266.25 ms