tx · E5AveZhi12RNfidhzu9NkbAu8WsJrf4inH8HYKNb4ioS

3MvRWw2FPEimFCTGtK7qY9uAJbM7XJ4ZfJS:  -0.04300000 Waves

2023.06.24 10:47 [2636406] smart account 3MvRWw2FPEimFCTGtK7qY9uAJbM7XJ4ZfJS > SELF 0.00000000 Waves

{ "type": 13, "id": "E5AveZhi12RNfidhzu9NkbAu8WsJrf4inH8HYKNb4ioS", "fee": 4300000, "feeAssetId": null, "timestamp": 1687592844036, "version": 2, "chainId": 84, "sender": "3MvRWw2FPEimFCTGtK7qY9uAJbM7XJ4ZfJS", "senderPublicKey": "HP8sssVq1866F7CaPQJwgFrt6fsqhQjKwM84cL1wjD2a", "proofs": [ "27f5B8X9126AqvpHeZz9qCvyjssMfdfMLe99z7rW2C2vHChD7C61m5kc4wLyCRQL9tJRyWLSgvv3T1nkxbJxtLi7" ], "script": "base64:BgKKAQgCEgcKBQgBCAEBEgMKAQgSBAoCCAgSBQoDCBgYEgUKAwgBCBIECgIIARIGCgQBCAgBEgUKAwEICBIDCgEIEgMKAQgSBQoDCAgBEgYKBAgBCAgSDgoMCAgIAQQRGBgRAQEYEgoKCAgICAEECAEYEg4KDAgICAEEGBgYGBgBGBIKCggICAEBAQEBAWYAB1NGX1BPT0wCAlNGAAdXWF9QT09MAgJXWAAPQ0FQX0ZFRV9OT19MT0FOAgljYXBOb0xvYW4ADENBUF9GRUVfTE9BTgIHY2FwTG9hbgAUU1RPUExPU1NfRkVFX05PX0xPQU4CDnN0b3BMb3NzTm9Mb2FuAA1TVE9QTE9TU19MT0FOAgxzdG9wTG9zc0xvYW4ACExPQU5fRkVFAgRsb2FuAAtOT19MT0FOX0ZFRQIGbm9Mb2FuAAZOT19GRUUCBW5vRmVlAAZTQ0FMRTgAgMLXLwAHU0NBTEUxMACAyK+gJQAHU0NBTEUxNgkAtgIBAICAhP6m3uERAApGRUVfU0NBTEU2AMCEPQAUa1NGUG9vbEFBc3NldEJhbGFuY2UCD0FfYXNzZXRfYmFsYW5jZQAUa1NGUG9vbEJBc3NldEJhbGFuY2UCD0JfYXNzZXRfYmFsYW5jZQAPa1NGUG9vbEFBc3NldElkAgpBX2Fzc2V0X2lkAA9rU0ZQb29sQkFzc2V0SWQCCkJfYXNzZXRfaWQADmtTRlBvb2xTaGFyZUlkAg5zaGFyZV9hc3NldF9pZAASa1NGUG9vbFNoYXJlU3VwcGx5AhJzaGFyZV9hc3NldF9zdXBwbHkACmtTRlBvb2xGZWUCCmNvbW1pc3Npb24ADWtVc2VyUG9zaXRpb24CDl91c2VyX3Bvc2l0aW9uABFrVXNlclBvc2l0aW9uUG9vbAITX3VzZXJfcG9zaXRpb25fcG9vbAARa1VzZXJCb3Jyb3dBbW91bnQCHF91c2VyX3Bvc2l0aW9uX2JvcnJvd19hbW91bnQAEmtVc2VyQm9ycm93QXNzZXRJZAIeX3VzZXJfcG9zaXRpb25fYm9ycm93X2Fzc2V0X2lkABBrVXNlclBvc2l0aW9uTnVtAhVfdXNlcl9wb3NpdGlvbl9udW1iZXIAFWtVc2VyUG9zaXRpb25JbnRlcmVzdAIXX3VzZXJfcG9zaXRpb25faW50ZXJlc3QACmtQb29sVG90YWwCC19wb29sX3RvdGFsAA5rUG9vbFRvdGFsTG9hbgIQX3Bvb2xfdG90YWxfbG9hbgARa1Bvb2xJbnRlcmVzdExvYW4CE19wb29sX2ludGVyZXN0X2xvYW4AE2tQb29sSW50ZXJlc3ROb0xvYW4CFl9wb29sX2ludGVyZXN0X25vX2xvYW4AFWtBeGx5SW5GZWVXaXRob3V0TG9hbgIWX2F4bHlfZmVlX3dpdGhvdXRfbG9hbgASa0F4bHlJbkZlZVdpdGhMb2FuAhNfYXhseV9mZWVfd2l0aF9sb2FuABFrQXhseU5vTG9hbkNhcEZlZQIXX2F4bHlfZmVlX2NhcF93aXRoX2xvYW4AE2tBeGx5V2l0aExvYW5DYXBGZWUCFV9heGx5X2ZlZV9jYXBfbm9fbG9hbgAWa0F4bHlTdG9wTG9zc05vTG9hbkZlZQIcX2F4bHlfZmVlX3N0b3Bsb3NzX3dpdGhfbG9hbgAUa0F4bHlTdG9wTG9zc0xvYW5GZWUCGl9heGx5X2ZlZV9zdG9wbG9zc19ub19sb2FuAAprUmVxdWVzdElkAgtfcmVxdWVzdF9pZAAMa1JlcXVlc3RJdGVyAg1yZXF1ZXN0c19pdGVyAAVrUG9vbAIFcG9vbF8ACmtTaGFyZVBvb2wCDl9wb29sX3NoYXJlX2lkAA5rUG9vbENhcENoYW5nZQIQX3Bvb2xfY2FwX2NoYW5nZQAPa1Rva2VuTGFzdFByaWNlAgpsYXN0X3ByaWNlAA1rVXNlclN0b3BMb3NzAgpfc3RvcF9sb3NzAAlrTW9uZXlCb3gCDmF4bHlfbW9uZXlfYm94AA5rU0ZGYXJtaW5nQWRkcgITc3dvcGZpX2Zhcm1pbmdfYWRkcgAMa0xlbmRTZXJ2aWNlAhFsZW5kX3NlcnZpY2VfYWRkcgAMa0FkbWluQ2FsbFBLAhJhZG1pbl9jYWxsX3B1Yl9rZXkADGtQcmljZU9yYWNsZQIMcHJpY2Vfb3JhY2xlAAtrRXhDb250cmFjdAIRZXhjaGFuZ2VfY29udHJhY3QAD2tXeFN3YXBDb250cmFjdAIQd3hfc3dhcF9jb250cmFjdAAIbW9uZXlCb3gJAQdBZGRyZXNzAQkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwUJa01vbmV5Qm94AhhObyBheGx5IG1vbmV5Qm94IGFkZHJlc3MACmV4Q29udHJhY3QJAQdBZGRyZXNzAQkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwULa0V4Q29udHJhY3QCHE5vIGV4Y2hhbmdlIGNvbnRyYWN0IGFkZHJlc3MAD3ByaWNlT3JhY2xlQWRkcgkBB0FkZHJlc3MBCQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzBQxrUHJpY2VPcmFjbGUCF05vIHByaWNlIG9yYWNsZSBhZGRyZXNzAA53eFN3YXBDb250cmFjdAkBB0FkZHJlc3MBCQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzBQ9rV3hTd2FwQ29udHJhY3QCEk5vIHd4IHN3YXAgYWRkcmVzcwAGU1dPUElEASA0ARNWjmBG4n5bqbgBR4LnsQAmEpt25E5LoqB8nG3ugQAEV1hJRAEgxlIegU7qbuM8wJewDl8s8mrp7Z2yhtGaQnioYH0+G7EBDmdldExlbmRTcnZBZGRyAAkBB0FkZHJlc3MBCQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzBQxrTGVuZFNlcnZpY2UCG0Nhbid0IGdldCBsZW5kIHNlcnZpY2UgYWRkcgEQZ2V0QWRtaW5DYWxsQWRkcgAJAKcIAQkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwUMa0FkbWluQ2FsbFBLAhRDYW4ndCBnZXQgYWRtaW4gYWRkcgELaXNBZG1pbkNhbGwBAWkDCQAAAggFAWkGY2FsbGVyCQEQZ2V0QWRtaW5DYWxsQWRkcgAFBHVuaXQJAAIBAiFPbmx5IGFkbWluIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24BCmlzU2VsZkNhbGwBAWkDCQAAAggFAWkGY2FsbGVyBQR0aGlzBQR1bml0CQACAQIrT25seSBjb250cmFjdCBpdHNlbGYgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgEKaXNMYW5kQ2FsbAEBaQMJAAACCAUBaQZjYWxsZXIJAQ5nZXRMZW5kU3J2QWRkcgAFBHVuaXQJAAIBAilPbmx5IGxhbmQgY29udHJhY3QgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgEOYWNjb3VudEJhbGFuY2UBB2Fzc2V0SWQEByRtYXRjaDAFB2Fzc2V0SWQDCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQCaWQFByRtYXRjaDAJAPAHAgUEdGhpcwUCaWQDCQABAgUHJG1hdGNoMAIEVW5pdAQFd2F2ZXMFByRtYXRjaDAICQDvBwEFBHRoaXMJYXZhaWxhYmxlCQACAQILTWF0Y2ggZXJyb3IBDWdldFNGUG9vbERhdGEBCHBvb2xBZGRyCQCXCgUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQhwb29sQWRkcgUPa1NGUG9vbEFBc3NldElkAhlDYW4ndCBnZXQgcG9vbCBBIGFzc2V0IGlkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUIcG9vbEFkZHIFD2tTRlBvb2xCQXNzZXRJZAIZQ2FuJ3QgZ2V0IHBvb2wgQiBhc3NldCBpZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFCHBvb2xBZGRyBRRrU0ZQb29sQUFzc2V0QmFsYW5jZQIeQ2FuJ3QgZ2V0IHBvb2wgQSBhc3NldCBiYWxhbmNlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUIcG9vbEFkZHIFFGtTRlBvb2xCQXNzZXRCYWxhbmNlAh5DYW4ndCBnZXQgcG9vbCBCIGFzc2V0IGJhbGFuY2UJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQhwb29sQWRkcgUOa1NGUG9vbFNoYXJlSWQCGENhbid0IGdldCBzaGFyZSBhc3NldCBpZAENZ2V0V1hQb29sRGF0YQEIcG9vbEFkZHIEA2NmZwoAAUAJAPwHBAUIcG9vbEFkZHICHGdldFBvb2xDb25maWdXcmFwcGVyUkVBRE9OTFkFA25pbAUDbmlsAwkAAQIFAUACCUxpc3RbQW55XQUBQAkAAgEJAKwCAgkAAwEFAUACHiBjb3VsZG4ndCBiZSBjYXN0IHRvIExpc3RbQW55XQMJAAACBQNjZmcFA2NmZwQDYUlkCQETdmFsdWVPckVycm9yTWVzc2FnZQIKAAFACQCRAwIFA2NmZwAEAwkAAQIFAUACBlN0cmluZwUBQAUEdW5pdAIZQ2FuJ3QgZ2V0IHBvb2wgQSBhc3NldCBpZAQDYklkCQETdmFsdWVPckVycm9yTWVzc2FnZQIKAAFACQCRAwIFA2NmZwAFAwkAAQIFAUACBlN0cmluZwUBQAUEdW5pdAIZQ2FuJ3QgZ2V0IHBvb2wgQiBhc3NldCBpZAQHc2hhcmVJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCgABQAkAkQMCBQNjZmcAAwMJAAECBQFAAgZTdHJpbmcFAUAFBHVuaXQCGkNhbid0IGdldCBwb29sIExQIGFzc2V0IGlkBARiYWxBCgABQAkA/AcEBQhwb29sQWRkcgIcZ2V0QWNjQmFsYW5jZVdyYXBwZXJSRUFET05MWQkAzAgCBQNhSWQFA25pbAUDbmlsAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAMJAAACBQRiYWxBBQRiYWxBBARiYWxCCgABQAkA/AcEBQhwb29sQWRkcgIcZ2V0QWNjQmFsYW5jZVdyYXBwZXJSRUFET05MWQkAzAgCBQNiSWQFA25pbAUDbmlsAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAMJAAACBQRiYWxCBQRiYWxCCQCXCgUFA2FJZAUDYklkBQRiYWxBBQRiYWxCBQdzaGFyZUlkCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQtnZXRQb29sRGF0YQIIcG9vbEFkZHIEdHlwZQMJAAACBQR0eXBlBQdTRl9QT09MCQENZ2V0U0ZQb29sRGF0YQEFCHBvb2xBZGRyAwkAAAIFBHR5cGUFB1dYX1BPT0wJAQ1nZXRXWFBvb2xEYXRhAQUIcG9vbEFkZHIJAAIBAg9Xcm9uZyBwb29sIHR5cGUBDmdldFNoYXJlU3VwcGx5Awhwb29sQWRkcgR0eXBlB3NoYXJlSWQDCQAAAgUEdHlwZQUHU0ZfUE9PTAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFCHBvb2xBZGRyBRJrU0ZQb29sU2hhcmVTdXBwbHkCHENhbid0IGdldCBzaGFyZSBhc3NldCBzdXBwbHkDCQAAAgUEdHlwZQUHV1hfUE9PTAgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkA7AcBCQDZBAEFB3NoYXJlSWQCDVdyb25nIFNoYXJlSWQIcXVhbnRpdHkJAAIBAg9Xcm9uZyBwb29sIHR5cGUBEWdldFBvb2xUb3RhbFNoYXJlAQRwb29sCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAUKa1Bvb2xUb3RhbAAAARlnZXRQb29sVG90YWxTaGFyZVdpdGhMb2FuAQRwb29sCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAUOa1Bvb2xUb3RhbExvYW4AAAEYZ2V0TmV3VXNlclBvc2l0aW9uTnVtYmVyAQR1c2VyCQBkAgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHVzZXIFEGtVc2VyUG9zaXRpb25OdW0AAAABAQpnZXRBeGx5RmVlAgRwb29sB2ZlZVR5cGUDCQAAAgUHZmVlVHlwZQUMQ0FQX0ZFRV9MT0FOCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIFBHBvb2wFE2tBeGx5V2l0aExvYW5DYXBGZWUDCQAAAgUHZmVlVHlwZQUPQ0FQX0ZFRV9OT19MT0FOCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIFBHBvb2wFEWtBeGx5Tm9Mb2FuQ2FwRmVlAwkAAAIFB2ZlZVR5cGUFCExPQU5fRkVFCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIFBHBvb2wFEmtBeGx5SW5GZWVXaXRoTG9hbgMJAAACBQdmZWVUeXBlBQtOT19MT0FOX0ZFRQkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICBQRwb29sBRVrQXhseUluRmVlV2l0aG91dExvYW4DCQAAAgUHZmVlVHlwZQUGTk9fRkVFAAAJAAIBAg5Xcm9uZyBmZWUgdHlwZQEQZ2V0U0ZGYXJtaW5nQWRkcgAJAQdBZGRyZXNzAQkA2QQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwUOa1NGRmFybWluZ0FkZHICHUNhbid0IGdldCBzd29wZmkgZmFybWluZyBhZGRyARBnZXRXWEZhcm1pbmdBZGRyAQhwb29sQWRkcgQJZkNvbnRyYWN0CQEHQWRkcmVzcwEJANkEAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFCHBvb2xBZGRyAhMlc19fZmFjdG9yeUNvbnRyYWN0AiJDYW4ndCBnZXQgV1ggZmFjdG9yeSBjb250cmFjdCBhZGRyBApmYWN0cm95Q2ZnCQC1CQIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQlmQ29udHJhY3QCESVzX19mYWN0b3J5Q29uZmlnAhhDYW4ndCBnZXQgV1ggZmFjdG9yeSBjZmcCAl9fCQEHQWRkcmVzcwEJANkEAQkAkQMCBQpmYWN0cm95Q2ZnAAEBDGFzc2V0SWRUb1N0cgEHYXNzZXRJZAQHJG1hdGNoMAUHYXNzZXRJZAMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAJpZAUHJG1hdGNoMAkA2AQBBQJpZAMJAAECBQckbWF0Y2gwAgRVbml0BAV3YXZlcwUHJG1hdGNoMAIFV0FWRVMJAAIBAgtNYXRjaCBlcnJvcgEOYXNzZXRJZEZyb21TdHIBB2Fzc2V0SWQDCQAAAgUHYXNzZXRJZAIFV0FWRVMFBHVuaXQJANkEAQUHYXNzZXRJZAEQZ2V0QXNzZXREZWNpbWFscwEHYXNzZXRJZAMJAAACBQdhc3NldElkAgVXQVZFUwAIBAckbWF0Y2gwCQDsBwEJANkEAQUHYXNzZXRJZAMJAAECBQckbWF0Y2gwAgVBc3NldAQFYXNzZXQFByRtYXRjaDAIBQVhc3NldAhkZWNpbWFscwkAAgECEENhbid0IGZpbmQgYXNzZXQBEWdldEFzc2V0UHJlY2l0aW9uAQdhc3NldElkCQBsBgAKAAAJARBnZXRBc3NldERlY2ltYWxzAQUHYXNzZXRJZAAAAAAFBERPV04BDmdldEFzc2V0c1ByaWNlAQhhc3NldElkcwoBCWdldFByaWNlcwIBYQdhc3NldElkBAphc3NldFByaWNlCAoAAUAJAPwHBAUPcHJpY2VPcmFjbGVBZGRyAglnZXRUV0FQNjAJAMwIAgUHYXNzZXRJZAkAzAgCBwUDbmlsBQNuaWwDCQABAgUBQAIKKEludCwgSW50KQUBQAkAAgEJAKwCAgkAAwEFAUACHyBjb3VsZG4ndCBiZSBjYXN0IHRvIChJbnQsIEludCkCXzIJAM0IAgUBYQUKYXNzZXRQcmljZQoAAiRsBQhhc3NldElkcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEJZ2V0UHJpY2VzAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyA1MAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQAFQAWABcAGAAZABoAGwAcAB0AHgAfACAAIQAiACMAJAAlACYAJwAoACkAKgArACwALQAuAC8AMAAxADIBDWdldFNoYXJlUHJpY2UBB3NoYXJlSWQEBHBvb2wJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzCQCsAgIFB3NoYXJlSWQFCmtTaGFyZVBvb2wCIENhbid0IGZpbmQgcG9vbCBhZGRyIGJ5IHNoYXJlIGlkBAhwb29sQWRkcgkBB0FkZHJlc3MBCQDZBAEFBHBvb2wEBXBUeXBlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICBQVrUG9vbAUEcG9vbAISUG9vbCBpcyBub3QgaW5pdGVkBAskdDA4ODQ1ODkxMAkBC2dldFBvb2xEYXRhAgUIcG9vbEFkZHIFBXBUeXBlBANhSWQIBQskdDA4ODQ1ODkxMAJfMQQDYklkCAULJHQwODg0NTg5MTACXzIECGFCYWxhbmNlCAULJHQwODg0NTg5MTACXzMECGJCYWxhbmNlCAULJHQwODg0NTg5MTACXzQEB2RQcmljZUEICgABQAkA/AcEBQ9wcmljZU9yYWNsZUFkZHICCWdldFRXQVA2MAkAzAgCBQNhSWQJAMwIAgcFA25pbAUDbmlsAwkAAQIFAUACCihJbnQsIEludCkFAUAJAAIBCQCsAgIJAAMBBQFAAh8gY291bGRuJ3QgYmUgY2FzdCB0byAoSW50LCBJbnQpAl8yBAdkUHJpY2VCCAoAAUAJAPwHBAUPcHJpY2VPcmFjbGVBZGRyAglnZXRUV0FQNjAJAMwIAgUDYklkCQDMCAIHBQNuaWwFA25pbAMJAAECBQFAAgooSW50LCBJbnQpBQFACQACAQkArAICCQADAQUBQAIfIGNvdWxkbid0IGJlIGNhc3QgdG8gKEludCwgSW50KQJfMgQLc2hhcmVTdXBwbHkJAQ5nZXRTaGFyZVN1cHBseQMFCHBvb2xBZGRyBQVwVHlwZQUHc2hhcmVJZAQKQVByZWNpc2lvbgkAbAYACgAACQEQZ2V0QXNzZXREZWNpbWFscwEFA2FJZAAAAAAFBERPV04ECkJQcmVjaXNpb24JAGwGAAoAAAkBEGdldEFzc2V0RGVjaW1hbHMBBQNiSWQAAAAABQRET1dOBA5zaGFyZVByZWNpc2lvbgkAbAYACgAACQEQZ2V0QXNzZXREZWNpbWFscwEFB3NoYXJlSWQAAAAABQRET1dOBANzdW0JAGQCCQBrAwUIYUJhbGFuY2UFB2RQcmljZUEFCkFQcmVjaXNpb24JAGsDBQhiQmFsYW5jZQUHZFByaWNlQgUKQlByZWNpc2lvbgkAawMFA3N1bQUOc2hhcmVQcmVjaXNpb24FC3NoYXJlU3VwcGx5AQ5nZXRTaGFyZVByaWNlcwEIc2hhcmVJZHMKAQlnZXRQcmljZXMCAWEHc2hhcmVJZAkAzQgCBQFhCQENZ2V0U2hhcmVQcmljZQEFB3NoYXJlSWQKAAIkbAUIc2hhcmVJZHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCWdldFByaWNlcwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMjAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUAQ5nZXRDdXJzRW50cmllcwMDYUlkA2JJZAdzaGFyZUlkBAxhc3NldHNQcmljZXMJAQ5nZXRBc3NldHNQcmljZQEJAMwIAgUDYUlkCQDMCAIFA2JJZAUDbmlsBApzaGFyZVByaWNlCQENZ2V0U2hhcmVQcmljZQEFB3NoYXJlSWQEBnByaWNlcwkAzAgCCQCkAwEJAJEDAgUMYXNzZXRzUHJpY2VzAAAJAMwIAgkApAMBCQCRAwIFDGFzc2V0c1ByaWNlcwABCQDMCAIJAKQDAQUKc2hhcmVQcmljZQUDbmlsCQDMCAIJAQtTdHJpbmdFbnRyeQIFD2tUb2tlbkxhc3RQcmljZQkAuQkCBQZwcmljZXMCASwFA25pbAEYY2FsY1JlcGxlbmlzaEJ5VHdvVG9rZW5zCAVwVHlwZQhwb29sQWRkcgRwbXRBA2FJZARwbXRCA2JJZARiYWxBBGJhbEIDCQAAAgUFcFR5cGUFB1NGX1BPT0wEBHJlcGwKAAFACQD8BwQFCHBvb2xBZGRyAgxjYWxsRnVuY3Rpb24JAMwIAgIgY2FsY0xQUmVwbGVuaXNoVHdvVG9rZW5zUkVBRE9OTFkJAMwIAgkAzAgCCQCkAwEFBHBtdEEJAMwIAgkApAMBBQRwbXRCBQNuaWwFA25pbAUDbmlsAwkAAQIFAUACCUxpc3RbQW55XQUBQAkAAgEJAKwCAgkAAwEFAUACHiBjb3VsZG4ndCBiZSBjYXN0IHRvIExpc3RbQW55XQMJAAACBQRyZXBsBQRyZXBsCQCXCgUKAAFACQCRAwIFBHJlcGwAAwMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQKAAFACQCRAwIFBHJlcGwABAMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQKAAFACQCRAwIFBHJlcGwAAQMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQJAQxhc3NldElkVG9TdHIBCgABQAkAkQMCBQRyZXBsAAIDCQABAgUBQAIPQnl0ZVZlY3RvcnxVbml0BQFACQACAQkArAICCQADAQUBQAIkIGNvdWxkbid0IGJlIGNhc3QgdG8gQnl0ZVZlY3RvcnxVbml0CgABQAkAkQMCBQRyZXBsAAADCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBA0kdDAxMDQ2NTEwNzE1CQCUCgIJALUJAgoAAUAJAPwHBAUIcG9vbEFkZHICIGV2YWx1YXRlUHV0QnlBbW91bnRBc3NldFJFQURPTkxZCQDMCAIFBHBtdEEFA25pbAUDbmlsAwkAAQIFAUACBlN0cmluZwUBQAkAAgEJAKwCAgkAAwEFAUACGyBjb3VsZG4ndCBiZSBjYXN0IHRvIFN0cmluZwICX18JALUJAgoAAUAJAPwHBAUIcG9vbEFkZHICH2V2YWx1YXRlUHV0QnlQcmljZUFzc2V0UkVBRE9OTFkJAMwIAgUEcG10QgUDbmlsBQNuaWwDCQABAgUBQAIGU3RyaW5nBQFACQACAQkArAICCQADAQUBQAIbIGNvdWxkbid0IGJlIGNhc3QgdG8gU3RyaW5nAgJfXwMJAAACBQ0kdDAxMDQ2NTEwNzE1BQ0kdDAxMDQ2NTEwNzE1BApldmFsUHV0SW5CCAUNJHQwMTA0NjUxMDcxNQJfMgQKZXZhbFB1dEluQQgFDSR0MDEwNDY1MTA3MTUCXzEEBWxwSW5BCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUKZXZhbFB1dEluQQABBAVscEluQgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCmV2YWxQdXRJbkIAAQMJAGYCBQVscEluQgUFbHBJbkEEA3BtdAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCmV2YWxQdXRJbkEACAkAlwoFBQRwbXRBBQNwbXQJAGUCBQRwbXRCBQNwbXQFA2JJZAUFbHBJbkIEA3BtdAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCmV2YWxQdXRJbkEACAkAlwoFBQNwbXQFBHBtdEIJAGUCBQRwbXRBBQNwbXQFA2FJZAUFbHBJbkEJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BGHJlcGxlbmlzaFR3b1Rva2Vuc0J5VHlwZQYIcG9vbEFkZHIFcFR5cGUEcG10QQNhSWQEcG10QgNiSWQECHBheW1lbnRzCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEOYXNzZXRJZEZyb21TdHIBBQNhSWQFBHBtdEEJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQ5hc3NldElkRnJvbVN0cgEFA2JJZAUEcG10QgUDbmlsAwkAAAIFBXBUeXBlBQdTRl9QT09MCQD8BwQFCHBvb2xBZGRyAgxjYWxsRnVuY3Rpb24JAMwIAgIWcmVwbGVuaXNoV2l0aFR3b1Rva2VucwkAzAgCCQDMCAICBWZhbHNlCQDMCAICATAFA25pbAUDbmlsBQhwYXltZW50cwkA/AcEBQhwb29sQWRkcgIDcHV0CQDMCAIAwIQ9CQDMCAIHBQNuaWwFCHBheW1lbnRzARdyZXBsZW5pc2hPbmVUb2tlbkJ5VHlwZQQIcG9vbEFkZHIFcFR5cGUDcG10BXBtdElkBAhwYXltZW50cwkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBDmFzc2V0SWRGcm9tU3RyAQUFcG10SWQFA3BtdAUDbmlsAwkAAAIFBXBUeXBlBQdTRl9QT09MCQD8BwQFCHBvb2xBZGRyAgxjYWxsRnVuY3Rpb24JAMwIAgIVcmVwbGVuaXNoV2l0aE9uZVRva2VuCQDMCAIJAMwIAgIBMAkAzAgCAgVmYWxzZQkAzAgCAgEwBQNuaWwFA25pbAUIcGF5bWVudHMJAPwHBAUIcG9vbEFkZHICCXB1dE9uZVRrbgkAzAgCAAAJAMwIAgcFA25pbAUIcGF5bWVudHMBB3N0YWtlTFAEBHBvb2wFcFR5cGUHc2hhcmVJZAZhbW91bnQECHBheW1lbnRzCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQDZBAEFB3NoYXJlSWQFBmFtb3VudAUDbmlsAwkAAAIFBXBUeXBlBQdTRl9QT09MCQD8BwQJARBnZXRTRkZhcm1pbmdBZGRyAAIPbG9ja1NoYXJlVG9rZW5zCQDMCAIFBHBvb2wJAMwIAgAABQNuaWwFCHBheW1lbnRzCQD8BwQJARBnZXRXWEZhcm1pbmdBZGRyAQkBEUBleHRyTmF0aXZlKDEwNjIpAQUEcG9vbAIFc3Rha2UFA25pbAUIcGF5bWVudHMBCXVuc3Rha2VMUAQEcG9vbAVwVHlwZQdzaGFyZUlkBmFtb3VudAQNJHQwMTIyMDAxMjU1NwMJAAACBQVwVHlwZQUHU0ZfUE9PTAkAlQoDCQEQZ2V0U0ZGYXJtaW5nQWRkcgACE3dpdGhkcmF3U2hhcmVUb2tlbnMJAMwIAgUEcG9vbAkAzAgCBQZhbW91bnQFA25pbAMJAAACBQVwVHlwZQUHV1hfUE9PTAkAlQoDCQEQZ2V0V1hGYXJtaW5nQWRkcgEJAQdBZGRyZXNzAQkA2QQBBQRwb29sAgd1bnN0YWtlCQDMCAIFB3NoYXJlSWQJAMwIAgUGYW1vdW50BQNuaWwJAAIBAg9Xcm9uZyBwb29sIHR5cGUECGZhcm1BZGRyCAUNJHQwMTIyMDAxMjU1NwJfMQQFZk5hbWUIBQ0kdDAxMjIwMDEyNTU3Al8yBAZwYXJhbXMIBQ0kdDAxMjIwMDEyNTU3Al8zBANpbnYJAPwHBAUIZmFybUFkZHIFBWZOYW1lBQZwYXJhbXMFA25pbAMJAAACBQNpbnYFA2ludgUGYW1vdW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuARFjYWxjQW1vdW50VG9QYXlTRgcEcG9vbAhhc3NldElkQQhhc3NldElkQgRiYWxBBGJhbEIQYW1vdW50VG9rZW5Ub0dldA9hc3NldFRva2VuVG9HZXQECHBvb2xBZGRyCQEHQWRkcmVzcwEJANkEAQUEcG9vbAQJZmVlU2NhbGU2AMCEPQQDZmVlCQERQGV4dHJOYXRpdmUoMTA1MCkCBQhwb29sQWRkcgUKa1NGUG9vbEZlZQQMYW1udEdldE5vRmVlCQBrAwUQYW1vdW50VG9rZW5Ub0dldAUJZmVlU2NhbGU2CQBlAgUJZmVlU2NhbGU2BQNmZWUEDSR0MDEyOTcwMTMyNTgDCQAAAgUPYXNzZXRUb2tlblRvR2V0BQhhc3NldElkQQQLYW1vdW50VG9QYXkJAGsDBQRiYWxBBQxhbW50R2V0Tm9GZWUJAGUCBQRiYWxCBQxhbW50R2V0Tm9GZWUJAJQKAgULYW1vdW50VG9QYXkFCGFzc2V0SWRCBAthbW91bnRUb1BheQkAawMFBGJhbEIFDGFtbnRHZXROb0ZlZQkAZQIFBGJhbEEFDGFtbnRHZXROb0ZlZQkAlAoCBQthbW91bnRUb1BheQUIYXNzZXRJZEEEC2Ftb3VudFRvUGF5CAUNJHQwMTI5NzAxMzI1OAJfMQQKYXNzZXRUb1BheQgFDSR0MDEyOTcwMTMyNTgCXzIJAJQKAgUKYXNzZXRUb1BheQULYW1vdW50VG9QYXkBEWNhbGNBbW91bnRUb1BheVdYBwRwb29sCGFzc2V0SWRBCGFzc2V0SWRCBGJhbEEEYmFsQhBhbW91bnRUb2tlblRvR2V0D2Fzc2V0VG9rZW5Ub0dldAQFcHJGZWUJARFAZXh0ck5hdGl2ZSgxMDUwKQIFDnd4U3dhcENvbnRyYWN0Ag8lc19fcHJvdG9jb2xGZWUEBHBGZWUJARFAZXh0ck5hdGl2ZSgxMDUwKQIFDnd4U3dhcENvbnRyYWN0Agslc19fcG9vbEZlZQQIZmVlU2NhbGUJALYCAQCAwtcvBA0kdDAxMzU5NzEzOTA1AwkAAAIFD2Fzc2V0VG9rZW5Ub0dldAUIYXNzZXRJZEEEC2Ftb3VudFRvUGF5CQBrAwUEYmFsQQUQYW1vdW50VG9rZW5Ub0dldAkAZQIFBGJhbEIFEGFtb3VudFRva2VuVG9HZXQJAJQKAgULYW1vdW50VG9QYXkFCGFzc2V0SWRCBAthbW91bnRUb1BheQkAawMFBGJhbEIFEGFtb3VudFRva2VuVG9HZXQJAGUCBQRiYWxBBRBhbW91bnRUb2tlblRvR2V0CQCUCgIFC2Ftb3VudFRvUGF5BQhhc3NldElkQQQLYW1vdW50VG9QYXkIBQ0kdDAxMzU5NzEzOTA1Al8xBAphc3NldFRvUGF5CAUNJHQwMTM1OTcxMzkwNQJfMgQSYW1vdW50VG9QYXlXaXRoRmVlCQCgAwEJALwCAwkAtgIBBQthbW91bnRUb1BheQUIZmVlU2NhbGUJALgCAgUIZmVlU2NhbGUJALYCAQkAZAIFBXByRmVlBQRwRmVlCQCUCgIFCmFzc2V0VG9QYXkFEmFtb3VudFRvUGF5V2l0aEZlZQEQZXhjaGFuZ2VEaXJlY3RseQgEdHlwZQRwb29sCGFzc2V0SWRBCGFzc2V0SWRCBGJhbEEEYmFsQhBhbW91bnRUb2tlblRvR2V0D2Fzc2V0VG9rZW5Ub0dldAMJAAACBQR0eXBlBQdTRl9QT09MBA0kdDAxNDI0MzE0MzY1CQERY2FsY0Ftb3VudFRvUGF5U0YHBQRwb29sBQhhc3NldElkQQUIYXNzZXRJZEIFBGJhbEEFBGJhbEIFEGFtb3VudFRva2VuVG9HZXQFD2Fzc2V0VG9rZW5Ub0dldAQKYXNzZXRUb1BheQgFDSR0MDE0MjQzMTQzNjUCXzEEC2Ftb3VudFRvUGF5CAUNJHQwMTQyNDMxNDM2NQJfMgkA/AcECQERQGV4dHJOYXRpdmUoMTA2MikBBQRwb29sAgxjYWxsRnVuY3Rpb24JAMwIAgIIZXhjaGFuZ2UJAMwIAgkAzAgCAgExBQNuaWwFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBDmFzc2V0SWRGcm9tU3RyAQUKYXNzZXRUb1BheQULYW1vdW50VG9QYXkFA25pbAQNJHQwMTQ1MTYxNDYzOAkBEWNhbGNBbW91bnRUb1BheVdYBwUEcG9vbAUIYXNzZXRJZEEFCGFzc2V0SWRCBQRiYWxBBQRiYWxCBRBhbW91bnRUb2tlblRvR2V0BQ9hc3NldFRva2VuVG9HZXQECmFzc2V0VG9QYXkIBQ0kdDAxNDUxNjE0NjM4Al8xBAthbW91bnRUb1BheQgFDSR0MDE0NTE2MTQ2MzgCXzIJAPwHBAUOd3hTd2FwQ29udHJhY3QCBHN3YXAJAMwIAgABCQDMCAIFD2Fzc2V0VG9rZW5Ub0dldAkAzAgCCQClCAEFBHRoaXMFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBDmFzc2V0SWRGcm9tU3RyAQUKYXNzZXRUb1BheQULYW1vdW50VG9QYXkFA25pbAETY2FsY1JlcGxlbmlzaExQVmlydAgFcFR5cGUEcG9vbARwbXRBA2FJZARwbXRCA2JJZARiYWxBBGJhbEIECHBvb2xBZGRyCQERQGV4dHJOYXRpdmUoMTA2MikBBQRwb29sAwkAAAIFBXBUeXBlBQdTRl9QT09MBANpbnYKAAFACQD8BwQFCHBvb2xBZGRyAgxjYWxsRnVuY3Rpb24JAMwIAgIfY2FsY0xQUmVwbGVuaXNoRGlmZlByb3BSRUFET05MWQkAzAgCCQDMCAIJAKQDAQUEcG10QQkAzAgCCQCkAwEFBHBtdEIJAMwIAgIBMAUDbmlsBQNuaWwFA25pbAMJAAECBQFAAglMaXN0W0FueV0FAUAJAAIBCQCsAgIJAAMBBQFAAh4gY291bGRuJ3QgYmUgY2FzdCB0byBMaXN0W0FueV0DCQAAAgUDaW52BQNpbnYJAJQKAgoAAUAJAJEDAgUDaW52AAADCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50CgABQAkAkQMCBQNpbnYAAQMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4DCQAAAgUFcFR5cGUFB1dYX1BPT0wEDSR0MDE1MjI2MTU1NjcDAwkAZgIFBHBtdEEAAAkAZgIFBHBtdEIAAAcEDSR0MDE1MzA3MTU0MzMJARhjYWxjUmVwbGVuaXNoQnlUd29Ub2tlbnMIBQVwVHlwZQUIcG9vbEFkZHIFBHBtdEEFA2FJZAUEcG10QgUDYklkBQRiYWxBBQRiYWxCBAZwbXRJbkEIBQ0kdDAxNTMwNzE1NDMzAl8xBAZwbXRJbkIIBQ0kdDAxNTMwNzE1NDMzAl8yBAZjaGFuZ2UIBQ0kdDAxNTMwNzE1NDMzAl8zBAhjaGFuZ2VJZAgFDSR0MDE1MzA3MTU0MzMCXzQECGxwQW1vdW50CAUNJHQwMTUzMDcxNTQzMwJfNQkAlQoDBQZjaGFuZ2UFCGNoYW5nZUlkBQhscEFtb3VudAMJAGYCBQRwbXRBAAAJAJUKAwUEcG10QQUDYUlkAAAJAJUKAwUEcG10QgUDYklkAAAEBmNoYW5nZQgFDSR0MDE1MjI2MTU1NjcCXzEECGNoYW5nZUlkCAUNJHQwMTUyMjYxNTU2NwJfMgQFbHBUd28IBQ0kdDAxNTIyNjE1NTY3Al8zBA0kdDAxNTU3NDE1NzkwAwkAZgIFBmNoYW5nZQAABANpbnYKAAFACQD8BwQFCHBvb2xBZGRyAhFwdXRPbmVUa25SRUFET05MWQkAzAgCBQhjaGFuZ2VJZAkAzAgCBQZjaGFuZ2UFA25pbAUDbmlsAwkAAQIFAUACDyhJbnQsIEludCwgSW50KQUBQAkAAgEJAKwCAgkAAwEFAUACJCBjb3VsZG4ndCBiZSBjYXN0IHRvIChJbnQsIEludCwgSW50KQMJAAACBQNpbnYFA2ludgkAlAoCCAUDaW52Al8xCAUDaW52Al8zCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQCUCgIAAAAABAVscE9uZQgFDSR0MDE1NTc0MTU3OTACXzEEBGxvc3MIBQ0kdDAxNTU3NDE1NzkwAl8yCQCUCgIJAGQCBQVscFR3bwUFbHBPbmUFBGxvc3MJAAIBAg9Xcm9uZyBwb29sIHR5cGUBEmNhbGNXaXRoZHJhd0xQVmlydAoFcFR5cGUEcG9vbAhscEFtb3VudAdzaGFyZUlkA2FJZANiSWQEYmFsQQRiYWxCDGJvcnJvd0Ftb3VudA1ib3Jyb3dBc3NldElkBAhwb29sQWRkcgkBEUBleHRyTmF0aXZlKDEwNjIpAQUEcG9vbAQNJHQwMTYwODQxNjU4NAMJAAACBQVwVHlwZQUHU0ZfUE9PTAQDaW52CgABQAkA/AcEBQhwb29sQWRkcgIMY2FsbEZ1bmN0aW9uCQDMCAICEHdpdGhkcmF3UkVBRE9OTFkJAMwIAgkAzAgCCQCkAwEFCGxwQW1vdW50CQDMCAIJAKQDAQUEYmFsQQkAzAgCCQCkAwEFBGJhbEIFA25pbAUDbmlsBQNuaWwDCQABAgUBQAIJTGlzdFtBbnldBQFACQACAQkArAICCQADAQUBQAIeIGNvdWxkbid0IGJlIGNhc3QgdG8gTGlzdFtBbnldAwkAAAIFA2ludgUDaW52CQCUCgIKAAFACQCRAwIFA2ludgAAAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAoAAUAJAJEDAgUDaW52AAEDCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAwkAAAIFBXBUeXBlBQdXWF9QT09MBANnZXQJALUJAgoAAUAJAPwHBAUIcG9vbEFkZHICE2V2YWx1YXRlR2V0UkVBRE9OTFkJAMwIAgUHc2hhcmVJZAkAzAgCBQhscEFtb3VudAUDbmlsBQNuaWwDCQABAgUBQAIGU3RyaW5nBQFACQACAQkArAICCQADAQUBQAIbIGNvdWxkbid0IGJlIGNhc3QgdG8gU3RyaW5nAgJfXwMJAAACBQNnZXQFA2dldAkAlAoCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUDZ2V0AAEJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQNnZXQAAgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECD1dyb25nIHBvb2wgdHlwZQQKZ2V0QW1vdW50QQgFDSR0MDE2MDg0MTY1ODQCXzEECmdldEFtb3VudEIIBQ0kdDAxNjA4NDE2NTg0Al8yAwkAZgIFDGJvcnJvd0Ftb3VudAAABA1hbW91bnRUb0dldEV4AwMJAAACBQ1ib3Jyb3dBc3NldElkBQNhSWQJAGYCBQxib3Jyb3dBbW91bnQFCmdldEFtb3VudEEHCQBlAgUMYm9ycm93QW1vdW50BQpnZXRBbW91bnRBAwMJAAACBQ1ib3Jyb3dBc3NldElkBQNiSWQJAGYCBQxib3Jyb3dBbW91bnQFCmdldEFtb3VudEIHCQBlAgUMYm9ycm93QW1vdW50BQpnZXRBbW91bnRCAAAEDSR0MDE2ODYyMTcxNjUDCQBmAgUNYW1vdW50VG9HZXRFeAAAAwkAAAIFBXBUeXBlBQdTRl9QT09MCQERY2FsY0Ftb3VudFRvUGF5U0YHBQRwb29sBQNhSWQFA2JJZAUEYmFsQQUEYmFsQgUNYW1vdW50VG9HZXRFeAUNYm9ycm93QXNzZXRJZAkBEWNhbGNBbW91bnRUb1BheVdYBwUEcG9vbAUDYUlkBQNiSWQFBGJhbEEFBGJhbEIFDWFtb3VudFRvR2V0RXgFDWJvcnJvd0Fzc2V0SWQJAJQKAgIAAAAECmFzc2V0VG9QYXkIBQ0kdDAxNjg2MjE3MTY1Al8xBAthbW91bnRUb1BheQgFDSR0MDE2ODYyMTcxNjUCXzIDCQAAAgUNYm9ycm93QXNzZXRJZAUDYUlkCQCUCgIJAGUCCQBkAgUKZ2V0QW1vdW50QQUNYW1vdW50VG9HZXRFeAUMYm9ycm93QW1vdW50CQBlAgUKZ2V0QW1vdW50QgULYW1vdW50VG9QYXkJAJQKAgkAZQIFCmdldEFtb3VudEEFC2Ftb3VudFRvUGF5CQBlAgkAZAIFCmdldEFtb3VudEIFDWFtb3VudFRvR2V0RXgFDGJvcnJvd0Ftb3VudAkAlAoCBQpnZXRBbW91bnRBBQpnZXRBbW91bnRCAQtjbGFpbUZhcm1lZAIEdHlwZQRwb29sAwkAAAIFBHR5cGUFB1NGX1BPT0wECWJhbEJlZm9yZQkBDmFjY291bnRCYWxhbmNlAQUGU1dPUElEAwkAAAIFCWJhbEJlZm9yZQUJYmFsQmVmb3JlBANpbnYJAPwHBAkBEGdldFNGRmFybWluZ0FkZHIAAgVjbGFpbQkAzAgCBQRwb29sBQNuaWwFA25pbAMJAAACBQNpbnYFA2ludgQIYmFsQWZ0ZXIJAQ5hY2NvdW50QmFsYW5jZQEFBlNXT1BJRAkAlAoCCQBlAgUIYmFsQWZ0ZXIFCWJhbEJlZm9yZQUGU1dPUElECQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAwkAAAIFBHR5cGUFB1dYX1BPT0wECWJhbEJlZm9yZQkBDmFjY291bnRCYWxhbmNlAQUEV1hJRAMJAAACBQliYWxCZWZvcmUFCWJhbEJlZm9yZQQDaW52CQD8BwQJARBnZXRXWEZhcm1pbmdBZGRyAQkBB0FkZHJlc3MBCQDZBAEFBHBvb2wCB2NsYWltV1gJAMwIAgUEcG9vbAUDbmlsBQNuaWwDCQAAAgUDaW52BQNpbnYECGJhbEFmdGVyCQEOYWNjb3VudEJhbGFuY2UBBQRXWElECQCUCgIJAGUCBQhiYWxBZnRlcgUJYmFsQmVmb3JlBQRXWElECQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIPV3JvbmcgcG9vbCB0eXBlAQ9yZXBsZW5pc2hCeVR5cGUKBXBUeXBlBHBvb2wHZmVlVHlwZQRwbXRBA2FJZARwbXRCA2JJZARiYWxBBGJhbEIETFBJZAQPbHBCYWxhbmNlQmVmb3JlCQEOYWNjb3VudEJhbGFuY2UBCQDZBAEFBExQSWQDCQAAAgUPbHBCYWxhbmNlQmVmb3JlBQ9scEJhbGFuY2VCZWZvcmUECHBvb2xBZGRyCQERQGV4dHJOYXRpdmUoMTA2MikBBQRwb29sBA0kdDAxODM2MjE4Nzc4AwMJAGYCBQRwbXRBAAAJAGYCBQRwbXRCAAAHBA0kdDAxODQyODE4NTQ0CQEYY2FsY1JlcGxlbmlzaEJ5VHdvVG9rZW5zCAUFcFR5cGUFCHBvb2xBZGRyBQRwbXRBBQNhSWQFBHBtdEIFA2JJZAUEYmFsQQUEYmFsQgQGcG10SW5BCAUNJHQwMTg0MjgxODU0NAJfMQQGcG10SW5CCAUNJHQwMTg0MjgxODU0NAJfMgQGY2hhbmdlCAUNJHQwMTg0MjgxODU0NAJfMwQIY2hhbmdlSWQIBQ0kdDAxODQyODE4NTQ0Al80BANpbnYJARhyZXBsZW5pc2hUd29Ub2tlbnNCeVR5cGUGBQhwb29sQWRkcgUFcFR5cGUFBnBtdEluQQUDYUlkBQZwbXRJbkIFA2JJZAMJAAACBQNpbnYFA2ludgkAlAoCBQZjaGFuZ2UFCGNoYW5nZUlkCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAwkAZgIFBHBtdEEAAAkAlAoCBQRwbXRBBQNhSWQDCQBmAgUEcG10QgAACQCUCgIFBHBtdEIFA2JJZAkAAgECEHBtdHMgbXVzdCBiZSA+IDAEBmNoYW5nZQgFDSR0MDE4MzYyMTg3NzgCXzEECGNoYW5nZUlkCAUNJHQwMTgzNjIxODc3OAJfMgQDaW52AwkAZgIFBmNoYW5nZQAACQEXcmVwbGVuaXNoT25lVG9rZW5CeVR5cGUEBQhwb29sQWRkcgUFcFR5cGUFBmNoYW5nZQUIY2hhbmdlSWQFA25pbAMJAAACBQNpbnYFA2ludgQObHBCYWxhbmNlQWZ0ZXIJAQ5hY2NvdW50QmFsYW5jZQEJANkEAQUETFBJZAQLdG90YWxTdGFrZWQJAGUCBQ5scEJhbGFuY2VBZnRlcgUPbHBCYWxhbmNlQmVmb3JlBA1heGx5RmVlQW1vdW50CQBrAwULdG90YWxTdGFrZWQJAQpnZXRBeGx5RmVlAgUEcG9vbAUHZmVlVHlwZQUKRkVFX1NDQUxFNgQRdXNlclNoYXJlRm9yU3Rha2UJAGUCBQt0b3RhbFN0YWtlZAUNYXhseUZlZUFtb3VudAMJAGcCAAAFEXVzZXJTaGFyZUZvclN0YWtlCQACAQIoYW1vdW50IG9mIHN0YWtlZCBzaGFyZXRva2VucyBtdXN0IGJlID4gMAQFaW52TFAJAQdzdGFrZUxQBAUEcG9vbAUFcFR5cGUFBExQSWQFEXVzZXJTaGFyZUZvclN0YWtlAwkAAAIFBWludkxQBQVpbnZMUAkAlAoCBRF1c2VyU2hhcmVGb3JTdGFrZQUNYXhseUZlZUFtb3VudAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEQcmVwbGVuaXNoRW50cmllcwgEcG9vbAR1c2VyDHN0YWtlZEFtb3VudA1heGx5RmVlQW1vdW50BnBvc051bQdzaGFyZUlkBHR5cGUId2l0aExvYW4EC3RvdGFsQW1vdW50CQERZ2V0UG9vbFRvdGFsU2hhcmUBBQRwb29sBA90b3RhbEFtb3VudExvYW4JARlnZXRQb29sVG90YWxTaGFyZVdpdGhMb2FuAQUEcG9vbAQNJHQwMTk2MzYxOTg3NAMFCHdpdGhMb2FuCQCUCgIJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgUEcG9vbAURa1Bvb2xJbnRlcmVzdExvYW4JAGQCBQ90b3RhbEFtb3VudExvYW4FDHN0YWtlZEFtb3VudAkAlAoCCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIFBHBvb2wFE2tQb29sSW50ZXJlc3ROb0xvYW4FD3RvdGFsQW1vdW50TG9hbgQPY3VyUG9vbEludGVyZXN0CAUNJHQwMTk2MzYxOTg3NAJfMQQTdG90YWxTdGFrZWRXaXRoTG9hbggFDSR0MDE5NjM2MTk4NzQCXzIJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUKa1Bvb2xUb3RhbAkAZAIFC3RvdGFsQW1vdW50BQxzdGFrZWRBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUOa1Bvb2xUb3RhbExvYW4FE3RvdGFsU3Rha2VkV2l0aExvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfCQCkAwEFBnBvc051bQUNa1VzZXJQb3NpdGlvbgUMc3Rha2VkQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwkApAMBBQZwb3NOdW0FFWtVc2VyUG9zaXRpb25JbnRlcmVzdAUPY3VyUG9vbEludGVyZXN0CQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICCQCsAgIFBHVzZXICAV8JAKQDAQUGcG9zTnVtBRFrVXNlclBvc2l0aW9uUG9vbAUEcG9vbAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQR1c2VyBRBrVXNlclBvc2l0aW9uTnVtBQZwb3NOdW0JAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUIbW9uZXlCb3gFDWF4bHlGZWVBbW91bnQJANkEAQUHc2hhcmVJZAUDbmlsAQ5leGNoYW5nZUtlZXBlcgoHdG9Ub2tlbglwbXRBbW91bnQIcG10QXNzZXQJYW1vdW50c0luCWFkZHJlc3Nlcw9hc3NldHNUb1JlY2VpdmULZXN0UmVjZWl2ZWQRc2xpcHBhZ2VUb2xlcmFuY2ULbWluUmVjZWl2ZWQHb3B0aW9ucwQSdG9rZW5CYWxhbmNlQmVmb3JlCQEOYWNjb3VudEJhbGFuY2UBCQEOYXNzZXRJZEZyb21TdHIBBQd0b1Rva2VuAwkAAAIFEnRva2VuQmFsYW5jZUJlZm9yZQUSdG9rZW5CYWxhbmNlQmVmb3JlBANpbnYJAPwHBAUKZXhDb250cmFjdAIEc3dhcAkAzAgCBQlhbW91bnRzSW4JAMwIAgUJYWRkcmVzc2VzCQDMCAIFD2Fzc2V0c1RvUmVjZWl2ZQkAzAgCBQtlc3RSZWNlaXZlZAkAzAgCBRFzbGlwcGFnZVRvbGVyYW5jZQkAzAgCBQttaW5SZWNlaXZlZAkAzAgCBQdvcHRpb25zBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFCHBtdEFzc2V0BQlwbXRBbW91bnQFA25pbAMJAAACBQNpbnYFA2ludgkAZQIJAQ5hY2NvdW50QmFsYW5jZQEJAQ5hc3NldElkRnJvbVN0cgEFB3RvVG9rZW4FEnRva2VuQmFsYW5jZUJlZm9yZQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEOZXhjaGFuZ2VQdXp6bGUGB3RvVG9rZW4JcG10QW1vdW50CHBtdEFzc2V0CXJvdXRlc1N0cgxtaW5Ub1JlY2VpdmUHb3B0aW9ucwQSdG9rZW5CYWxhbmNlQmVmb3JlCQEOYWNjb3VudEJhbGFuY2UBCQEOYXNzZXRJZEZyb21TdHIBBQd0b1Rva2VuAwkAAAIFEnRva2VuQmFsYW5jZUJlZm9yZQUSdG9rZW5CYWxhbmNlQmVmb3JlBANpbnYJAPwHBAUKZXhDb250cmFjdAIKcHV6emxlU3dhcAkAzAgCBQlyb3V0ZXNTdHIJAMwIAgUMbWluVG9SZWNlaXZlCQDMCAIFB29wdGlvbnMFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUIcG10QXNzZXQFCXBtdEFtb3VudAUDbmlsAwkAAAIFA2ludgUDaW52CQBlAgkBDmFjY291bnRCYWxhbmNlAQkBDmFzc2V0SWRGcm9tU3RyAQUHdG9Ub2tlbgUSdG9rZW5CYWxhbmNlQmVmb3JlCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQ5leGNoYW5nZVN3b3BGaQoHdG9Ub2tlbglwbXRBbW91bnQIcG10QXNzZXQKZXhjaGFuZ2Vycw5leGNoYW5nZXJzVHlwZQVhcmdzMQVhcmdzMhFyb3V0aW5nQXNzZXRzS2V5cxJtaW5BbW91bnRUb1JlY2VpdmUHb3B0aW9ucwQSdG9rZW5CYWxhbmNlQmVmb3JlCQEOYWNjb3VudEJhbGFuY2UBCQEOYXNzZXRJZEZyb21TdHIBBQd0b1Rva2VuAwkAAAIFEnRva2VuQmFsYW5jZUJlZm9yZQUSdG9rZW5CYWxhbmNlQmVmb3JlBANpbnYJAPwHBAUKZXhDb250cmFjdAIKc3dvcGZpU3dhcAkAzAgCBQpleGNoYW5nZXJzCQDMCAIFDmV4Y2hhbmdlcnNUeXBlCQDMCAIFBWFyZ3MxCQDMCAIFBWFyZ3MyCQDMCAIFEXJvdXRpbmdBc3NldHNLZXlzCQDMCAIFEm1pbkFtb3VudFRvUmVjZWl2ZQkAzAgCBQdvcHRpb25zBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFCHBtdEFzc2V0BQlwbXRBbW91bnQFA25pbAMJAAACBQNpbnYFA2ludgkAZQIJAQ5hY2NvdW50QmFsYW5jZQEJAQ5hc3NldElkRnJvbVN0cgEFB3RvVG9rZW4FEnRva2VuQmFsYW5jZUJlZm9yZQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEKY2FwaXRhbGl6ZQQEcG9vbAVwVHlwZQd0b2tlbklkC3Rva2VuQW1vdW50BAhwb29sQWRkcgkBB0FkZHJlc3MBCQDZBAEFBHBvb2wEDSR0MDIyMjI1MjIyOTEJAQtnZXRQb29sRGF0YQIFCHBvb2xBZGRyBQVwVHlwZQQDQUlkCAUNJHQwMjIyMjUyMjI5MQJfMQQDQklkCAUNJHQwMjIyMjUyMjI5MQJfMgQEYmFsQQgFDSR0MDIyMjI1MjIyOTECXzMEBGJhbEIIBQ0kdDAyMjIyNTIyMjkxAl80BAdzaGFyZUlkCAUNJHQwMjIyMjUyMjI5MQJfNQMDCQECIT0CBQd0b2tlbklkBQNBSWQJAQIhPQIFB3Rva2VuSWQFA0JJZAcJAAIBAgtXcm9uZyBhc3NldAQNJHQwMjIzNzYyMjQ1NgMJAAACBQd0b2tlbklkBQNBSWQJAJQKAgULdG9rZW5BbW91bnQAAAkAlAoCAAAFC3Rva2VuQW1vdW50BARwbXRBCAUNJHQwMjIzNzYyMjQ1NgJfMQQEcG10QggFDSR0MDIyMzc2MjI0NTYCXzIEDSR0MDIyNDU5MjI1NjMJAQ9yZXBsZW5pc2hCeVR5cGUKBQVwVHlwZQUEcG9vbAUGTk9fRkVFBQRwbXRBBQNBSWQFBHBtdEIFA0JJZAUEYmFsQQUEYmFsQgUHc2hhcmVJZAQMc3Rha2VkQW1vdW50CAUNJHQwMjI0NTkyMjU2MwJfMQQCbmYIBQ0kdDAyMjQ1OTIyNTYzAl8yBBNjdXJQb29sSW50ZXJlc3RMb2FuCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAURa1Bvb2xJbnRlcmVzdExvYW4AAAQVY3VyUG9vbEludGVyZXN0Tm9Mb2FuCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAUTa1Bvb2xJbnRlcmVzdE5vTG9hbgAABBB0b3RhbFNoYXJlQW1vdW50CQERZ2V0UG9vbFRvdGFsU2hhcmUBBQRwb29sBBh0b3RhbFNoYXJlQW1vdW50V2l0aExvYW4JARlnZXRQb29sVG90YWxTaGFyZVdpdGhMb2FuAQUEcG9vbAQLbG9hblBlcmNlbnQJAGsDBRh0b3RhbFNoYXJlQW1vdW50V2l0aExvYW4FBlNDQUxFOAUQdG90YWxTaGFyZUFtb3VudAQKc3Rha2VkTG9hbgkAawMFDHN0YWtlZEFtb3VudAULbG9hblBlcmNlbnQFBlNDQUxFOAQMc3Rha2VkTm9Mb2FuCQBlAgUMc3Rha2VkQW1vdW50BQpzdGFrZWRMb2FuBA9uZXdJbnRlcmVzdExvYW4DCQBmAgUYdG90YWxTaGFyZUFtb3VudFdpdGhMb2FuAAAJAGQCBRNjdXJQb29sSW50ZXJlc3RMb2FuCQBrAwUKc3Rha2VkTG9hbgUHU0NBTEUxMAUYdG90YWxTaGFyZUFtb3VudFdpdGhMb2FuAAAEEW5ld0ludGVyZXN0Tm9Mb2FuAwkAZgIJAGUCBRB0b3RhbFNoYXJlQW1vdW50BRh0b3RhbFNoYXJlQW1vdW50V2l0aExvYW4AAAkAZAIFFWN1clBvb2xJbnRlcmVzdE5vTG9hbgkAawMFDHN0YWtlZE5vTG9hbgUHU0NBTEUxMAkAZQIFEHRvdGFsU2hhcmVBbW91bnQFGHRvdGFsU2hhcmVBbW91bnRXaXRoTG9hbgAABAtheGx5RmVlTG9hbgkAawMFCnN0YWtlZExvYW4JAQpnZXRBeGx5RmVlAgUEcG9vbAUMQ0FQX0ZFRV9MT0FOBQpGRUVfU0NBTEU2BA1heGx5RmVlTm9Mb2FuCQBrAwUMc3Rha2VkTm9Mb2FuCQEKZ2V0QXhseUZlZQIFBHBvb2wFD0NBUF9GRUVfTk9fTE9BTgUKRkVFX1NDQUxFNgQHYXhseUZlZQkBCXVuc3Rha2VMUAQFBHBvb2wFBXBUeXBlBQdzaGFyZUlkCQBkAgULYXhseUZlZUxvYW4FDWF4bHlGZWVOb0xvYW4DCQAAAgUHYXhseUZlZQUHYXhseUZlZQkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFEWtQb29sSW50ZXJlc3RMb2FuBQ9uZXdJbnRlcmVzdExvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUTa1Bvb2xJbnRlcmVzdE5vTG9hbgURbmV3SW50ZXJlc3ROb0xvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUKa1Bvb2xUb3RhbAkAZQIJAGQCBRB0b3RhbFNoYXJlQW1vdW50BQxzdGFrZWRBbW91bnQFB2F4bHlGZWUJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUOa1Bvb2xUb3RhbExvYW4JAGUCCQBkAgUYdG90YWxTaGFyZUFtb3VudFdpdGhMb2FuBQpzdGFrZWRMb2FuBQtheGx5RmVlTG9hbgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQhtb25leUJveAkAZAIFC2F4bHlGZWVMb2FuBQ1heGx5RmVlTm9Mb2FuCQDZBAEFB3NoYXJlSWQFA25pbAkBDmdldEN1cnNFbnRyaWVzAwUDQUlkBQNCSWQFB3NoYXJlSWQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BEndpdGhkcmF3QW1vdW50Q2FsYwQEcG9vbA91c2VyQ2FuV2l0aGRyYXcEZGVidAtib3Jyb3dBc3NldAQIcG9vbEFkZHIJAQdBZGRyZXNzAQkA2QQBBQRwb29sBAVwVHlwZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgUFa1Bvb2wFBHBvb2wCDFVua25vd24gcG9vbAQNJHQwMjQzMzEyNDQwNwkBC2dldFBvb2xEYXRhAgUIcG9vbEFkZHIFBXBUeXBlBAhhc3NldElkQQgFDSR0MDI0MzMxMjQ0MDcCXzEECGFzc2V0SWRCCAUNJHQwMjQzMzEyNDQwNwJfMgQEYmFsQQgFDSR0MDI0MzMxMjQ0MDcCXzMEBGJhbEIIBQ0kdDAyNDMzMTI0NDA3Al80BAdzaGFyZUlkCAUNJHQwMjQzMzEyNDQwNwJfNQQLY0JhbEFCZWZvcmUJAQ5hY2NvdW50QmFsYW5jZQEJAQ5hc3NldElkRnJvbVN0cgEFCGFzc2V0SWRBAwkAAAIFC2NCYWxBQmVmb3JlBQtjQmFsQUJlZm9yZQQLY0JhbEJCZWZvcmUJAQ5hY2NvdW50QmFsYW5jZQEJAQ5hc3NldElkRnJvbVN0cgEFCGFzc2V0SWRCAwkAAAIFC2NCYWxCQmVmb3JlBQtjQmFsQkJlZm9yZQQDaW52AwkAAAIFBXBUeXBlBQdTRl9QT09MCQD8BwQFCHBvb2xBZGRyAgxjYWxsRnVuY3Rpb24JAMwIAgIId2l0aGRyYXcJAMwIAgkAzAgCCQCkAwEFD3VzZXJDYW5XaXRoZHJhdwUDbmlsBQNuaWwFA25pbAQDaW52CQEJdW5zdGFrZUxQBAUEcG9vbAUFcFR5cGUFB3NoYXJlSWQFD3VzZXJDYW5XaXRoZHJhdwMJAAACBQNpbnYFA2ludgkA/AcEBQhwb29sQWRkcgIDZ2V0BQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQ5hc3NldElkRnJvbVN0cgEFB3NoYXJlSWQFD3VzZXJDYW5XaXRoZHJhdwUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAwkAAAIFA2ludgUDaW52BApjQmFsQUFmdGVyCQEOYWNjb3VudEJhbGFuY2UBCQEOYXNzZXRJZEZyb21TdHIBBQhhc3NldElkQQQKY0JhbEJBZnRlcgkBDmFjY291bnRCYWxhbmNlAQkBDmFzc2V0SWRGcm9tU3RyAQUIYXNzZXRJZEIEDSR0MDI0OTcwMjUwNTkJAJQKAgkAZQIFCmNCYWxBQWZ0ZXIFC2NCYWxBQmVmb3JlCQBlAgUKY0JhbEJBZnRlcgULY0JhbEJCZWZvcmUEDXRva2Vuc0Ftb3VudEEIBQ0kdDAyNDk3MDI1MDU5Al8xBA10b2tlbnNBbW91bnRCCAUNJHQwMjQ5NzAyNTA1OQJfMgQNJHQwMjUwNjIyNTc1OAMJAGYCBQRkZWJ0AAAEDWFtb3VudFRvR2V0RXgDAwkAAAIFC2JvcnJvd0Fzc2V0BQhhc3NldElkQQkAZgIFBGRlYnQFDXRva2Vuc0Ftb3VudEEHCQBlAgUEZGVidAUNdG9rZW5zQW1vdW50QQMDCQAAAgULYm9ycm93QXNzZXQFCGFzc2V0SWRCCQBmAgUEZGVidAUNdG9rZW5zQW1vdW50QgcJAGUCBQRkZWJ0BQ10b2tlbnNBbW91bnRCAAAEBWV4SW52AwkAZgIFDWFtb3VudFRvR2V0RXgAAAkBEGV4Y2hhbmdlRGlyZWN0bHkIBQVwVHlwZQUEcG9vbAUIYXNzZXRJZEEFCGFzc2V0SWRCBQRiYWxBBQRiYWxCBQ1hbW91bnRUb0dldEV4BQtib3Jyb3dBc3NldAAAAwkAAAIFBWV4SW52BQVleEludgQPY0JhbEFBZnRlclJlcGF5CQEOYWNjb3VudEJhbGFuY2UBCQEOYXNzZXRJZEZyb21TdHIBBQhhc3NldElkQQQPY0JhbEJBZnRlclJlcGF5CQEOYWNjb3VudEJhbGFuY2UBCQEOYXNzZXRJZEZyb21TdHIBBQhhc3NldElkQgkAlAoCCQBlAgUPY0JhbEFBZnRlclJlcGF5BQtjQmFsQUJlZm9yZQkAZQIFD2NCYWxCQWZ0ZXJSZXBheQULY0JhbEJCZWZvcmUJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAJQKAgUNdG9rZW5zQW1vdW50QQUNdG9rZW5zQW1vdW50QgQNdG9Vc2VyQW1vdW50QQgFDSR0MDI1MDYyMjU3NTgCXzEEDXRvVXNlckFtb3VudEIIBQ0kdDAyNTA2MjI1NzU4Al8yCQCZCgcFDXRvVXNlckFtb3VudEEFCGFzc2V0SWRBBQ10b1VzZXJBbW91bnRCBQhhc3NldElkQgUKY0JhbEFBZnRlcgUKY0JhbEJBZnRlcgUHc2hhcmVJZAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEYdXNlckNhbldpdGhkcmF3U2hhcmVDYWxjBAR1c2VyBHBvb2wFcG9zSWQIYm9ycm93ZWQEB3BBbW91bnQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUFcG9zSWQFDWtVc2VyUG9zaXRpb24CEFVua25vd24gcG9zaXRpb24EDHVzZXJJbnRlcmVzdAkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBRVrVXNlclBvc2l0aW9uSW50ZXJlc3QEDHBvb2xJbnRlcmVzdAMFCGJvcnJvd2VkCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIFBHBvb2wFEWtQb29sSW50ZXJlc3RMb2FuCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIFBHBvb2wFE2tQb29sSW50ZXJlc3ROb0xvYW4JAGQCBQdwQW1vdW50CQBrAwUHcEFtb3VudAkAZQIFDHBvb2xJbnRlcmVzdAUMdXNlckludGVyZXN0BQdTQ0FMRTEwAQ53aXRoZHJhd1RvVXNlcgQEdXNlcgRwb29sBXBvc0lkCHN0b3BMb3NzBAdwQW1vdW50CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBQ1rVXNlclBvc2l0aW9uAhBVbmtub3duIHBvc2l0aW9uBAx1c2VySW50ZXJlc3QJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfBQVwb3NJZAUVa1VzZXJQb3NpdGlvbkludGVyZXN0BAxib3Jyb3dBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBRFrVXNlckJvcnJvd0Ftb3VudAAABA91c2VyQ2FuV2l0aGRyYXcJARh1c2VyQ2FuV2l0aGRyYXdTaGFyZUNhbGMEBQR1c2VyBQRwb29sBQVwb3NJZAkAZgIFDGJvcnJvd0Ftb3VudAAABA5wb29sVG90YWxTaGFyZQkBEWdldFBvb2xUb3RhbFNoYXJlAQUEcG9vbAQIdXNlckFkZHIJAQdBZGRyZXNzAQkA2QQBBQR1c2VyBAtib3Jyb3dBc3NldAkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUFcG9zSWQFEmtVc2VyQm9ycm93QXNzZXRJZAIABARkZWJ0AwkAZgIFDGJvcnJvd0Ftb3VudAAACgABQAkA/AcECQEOZ2V0TGVuZFNydkFkZHIAAgxnZXRBc3NldERlYnQJAMwIAgcJAMwIAgkArAICCQCsAgIFBHVzZXICAV8FBXBvc0lkCQDMCAIFC2JvcnJvd0Fzc2V0BQNuaWwFA25pbAMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQAAAQNJHQwMjcyNTcyNzQxMAkBEndpdGhkcmF3QW1vdW50Q2FsYwQFBHBvb2wFD3VzZXJDYW5XaXRoZHJhdwUEZGVidAULYm9ycm93QXNzZXQDCQAAAgUNJHQwMjcyNTcyNzQxMAUNJHQwMjcyNTcyNzQxMAQHc2hhcmVJZAgFDSR0MDI3MjU3Mjc0MTACXzcECmNCYWxCQWZ0ZXIIBQ0kdDAyNzI1NzI3NDEwAl82BApjQmFsQUFmdGVyCAUNJHQwMjcyNTcyNzQxMAJfNQQIYXNzZXRJZEIIBQ0kdDAyNzI1NzI3NDEwAl80BA10b1VzZXJBbW91bnRCCAUNJHQwMjcyNTcyNzQxMAJfMwQIYXNzZXRJZEEIBQ0kdDAyNzI1NzI3NDEwAl8yBA10b1VzZXJBbW91bnRBCAUNJHQwMjcyNTcyNzQxMAJfMQQLY2xvc2VEYnRJbnYDCQBmAgUEZGVidAAACQD8BwQJAQ5nZXRMZW5kU3J2QWRkcgACCHJlcGF5Rm9yCQDMCAIJAKwCAgkArAICBQR1c2VyAgFfBQVwb3NJZAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEOYXNzZXRJZEZyb21TdHIBBQtib3Jyb3dBc3NldAUEZGVidAUDbmlsAAADCQAAAgULY2xvc2VEYnRJbnYFC2Nsb3NlRGJ0SW52CQDOCAIJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBQ1rVXNlclBvc2l0aW9uCQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfBQVwb3NJZAUVa1VzZXJQb3NpdGlvbkludGVyZXN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFCmtQb29sVG90YWwJAGUCBQ5wb29sVG90YWxTaGFyZQUPdXNlckNhbldpdGhkcmF3CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFCHVzZXJBZGRyBQ10b1VzZXJBbW91bnRBCQEOYXNzZXRJZEZyb21TdHIBBQhhc3NldElkQQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQh1c2VyQWRkcgUNdG9Vc2VyQW1vdW50QgkBDmFzc2V0SWRGcm9tU3RyAQUIYXNzZXRJZEIFA25pbAkBDmdldEN1cnNFbnRyaWVzAwUIYXNzZXRJZEEFCGFzc2V0SWRCBQdzaGFyZUlkCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQxwYXJzZVJlcXVlc3QBCXJlcXVlc3RJZAQHcmVxdWVzdAkAtQkCCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICBQlyZXF1ZXN0SWQFCmtSZXF1ZXN0SWQJAKwCAgITTm8gcmVxdWVzdCB3aXRoIGlkIAUJcmVxdWVzdElkAgEsBAR1c2VyCQCRAwIFB3JlcXVlc3QAAAQEcG9vbAkAkQMCBQdyZXF1ZXN0AAEEBHBtdEEJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdyZXF1ZXN0AAIEA0FJZAkAkQMCBQdyZXF1ZXN0AAMEBHBtdEIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdyZXF1ZXN0AAQEA0JJZAkAkQMCBQdyZXF1ZXN0AAUEBGJhbEEJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdyZXF1ZXN0AAYEBGJhbEIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdyZXF1ZXN0AAcEB3NoYXJlSWQJAJEDAgUHcmVxdWVzdAAIBAdid0Fzc2V0CQCRAwIFB3JlcXVlc3QACQQIYndBbW91bnQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdyZXF1ZXN0AAoJAJ0KCwUEdXNlcgUEcG9vbAUEcG10QQUDQUlkBQRwbXRCBQNCSWQFBGJhbEEFBGJhbEIFB3NoYXJlSWQFB2J3QXNzZXQFCGJ3QW1vdW50ARBjYWxjQm9ycm93QW1vdW50BgRwbXRBBHBtdEIDYUlkA2JJZAhsZXZlcmFnZQhib3Jyb3dJZAQHZFByaWNlQQgKAAFACQD8BwQFD3ByaWNlT3JhY2xlQWRkcgIJZ2V0VFdBUDYwCQDMCAIFA2FJZAkAzAgCBwUDbmlsBQNuaWwDCQABAgUBQAIKKEludCwgSW50KQUBQAkAAgEJAKwCAgkAAwEFAUACHyBjb3VsZG4ndCBiZSBjYXN0IHRvIChJbnQsIEludCkCXzIEB2RQcmljZUIICgABQAkA/AcEBQ9wcmljZU9yYWNsZUFkZHICCWdldFRXQVA2MAkAzAgCBQNiSWQJAMwIAgcFA25pbAUDbmlsAwkAAQIFAUACCihJbnQsIEludCkFAUAJAAIBCQCsAgIJAAMBBQFAAh8gY291bGRuJ3QgYmUgY2FzdCB0byAoSW50LCBJbnQpAl8yBAZkZWNQckEJAGwGAAoAAAkBEGdldEFzc2V0RGVjaW1hbHMBBQNhSWQAAAAABQRET1dOBAZkZWNQckIJAGwGAAoAAAkBEGdldEFzc2V0RGVjaW1hbHMBBQNiSWQAAAAABQRET1dOBAxwYXlkSW5Eb2xsYXIJAGQCCQBrAwUHZFByaWNlQQUEcG10QQUGZGVjUHJBCQBrAwUHZFByaWNlQgUEcG10QgUGZGVjUHJCBA0kdDAyOTA5NjI5MTkzAwkAAAIFCGJvcnJvd0lkBQNhSWQJAJQKAgUHZFByaWNlQQUGZGVjUHJBCQCUCgIFB2RQcmljZUIFBmRlY1ByQgQLYm9ycm93UHJpY2UIBQ0kdDAyOTA5NjI5MTkzAl8xBAtib3Jyb3dEZWNQcggFDSR0MDI5MDk2MjkxOTMCXzIJAGsDCQBrAwUMcGF5ZEluRG9sbGFyCQBlAgUIbGV2ZXJhZ2UAZABkBQtib3Jyb3dEZWNQcgULYm9ycm93UHJpY2UQAWkBF2NhbGNQcmljZUltcGFjdEVWQUxPTkxZBQRwb29sCGxldmVyYWdlCGJvcnJvd0lkBHBtdEEEcG10QgMDCQBmAgBkBQhsZXZlcmFnZQYJAGYCBQhsZXZlcmFnZQCsAgkAAgECH0xldmVyYWdlIGNhbid0IGJlIDwxMDAgYW5kID4zMDAEBXBUeXBlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICBQVrUG9vbAUEcG9vbAISUG9vbCBpcyBub3QgaW5pdGVkBA0kdDAyOTYxMTI5NzAxCQELZ2V0UG9vbERhdGECCQEHQWRkcmVzcwEJANkEAQUEcG9vbAUFcFR5cGUEA0FJZAgFDSR0MDI5NjExMjk3MDECXzEEA0JJZAgFDSR0MDI5NjExMjk3MDECXzIEBGJhbEEIBQ0kdDAyOTYxMTI5NzAxAl8zBARiYWxCCAUNJHQwMjk2MTEyOTcwMQJfNAQHc2hhcmVJZAgFDSR0MDI5NjExMjk3MDECXzUEDGJvcnJvd0Ftb3VudAMJAGYCBQhsZXZlcmFnZQBkCQEQY2FsY0JvcnJvd0Ftb3VudAYFBHBtdEEFBHBtdEIFA0FJZAUDQklkBQhsZXZlcmFnZQUIYm9ycm93SWQAAAQNJHQwMjk4MzYyOTk0MwMJAAACBQhib3Jyb3dJZAUDQUlkCQCUCgIJAGQCBQRwbXRBBQxib3Jyb3dBbW91bnQFBHBtdEIJAJQKAgUEcG10QQkAZAIFBHBtdEIFDGJvcnJvd0Ftb3VudAQGcGF5SW5BCAUNJHQwMjk4MzYyOTk0MwJfMQQGcGF5SW5CCAUNJHQwMjk4MzYyOTk0MwJfMgQNJHQwMjk5NDYzMDAzOQkBE2NhbGNSZXBsZW5pc2hMUFZpcnQIBQVwVHlwZQUEcG9vbAUGcGF5SW5BBQNBSWQFBnBheUluQgUDQklkBQRiYWxBBQRiYWxCBAhscEFtb3VudAgFDSR0MDI5OTQ2MzAwMzkCXzEEBGxvc3MIBQ0kdDAyOTk0NjMwMDM5Al8yBAlpbXBhY3RNb2QDCQBmAgAABQRsb3NzCQBoAgUEbG9zcwD///////////8BBQRsb3NzCQCUCgIFA25pbAkAzAgCBQlpbXBhY3RNb2QFA25pbAFpARpnZXRTaGFyZUFzc2V0UHJpY2VSRUFET05MWQEHc2hhcmVJZAQLc2hhcmVQcmljZXMJAQ1nZXRTaGFyZVByaWNlAQUHc2hhcmVJZAkAlAoCBQNuaWwFC3NoYXJlUHJpY2VzAWkBImdldFVzZXJQb3NpdGlvblNoYXJlQW1vdW50UkVBRE9OTFkCBHVzZXIGcG9zTnVtBARwb29sCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICCQCsAgIJAKwCAgUEdXNlcgIBXwUGcG9zTnVtBRFrVXNlclBvc2l0aW9uUG9vbAIQVW5rbm93biBwb3NpdGlvbgQMYm9ycm93QW1vdW50CQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUGcG9zTnVtBRFrVXNlckJvcnJvd0Ftb3VudAQPdXNlckNhbldpdGhkcmF3CQEYdXNlckNhbldpdGhkcmF3U2hhcmVDYWxjBAUEdXNlcgUEcG9vbAUGcG9zTnVtCQBmAgUMYm9ycm93QW1vdW50AAAJAJQKAgUDbmlsBQ91c2VyQ2FuV2l0aGRyYXcBaQEgZ2V0VXNlclBvc2l0aW9uSW5Eb2xsYXJzUkVBRE9OTFkDBHVzZXIFcG9vbHMGcG9zTnVtCgEHdXNlclBvcwIBYQRwb29sBA0kdDAzMDg1MjMwODg2BQFhBAh0b3RhbFBvcwgFDSR0MDMwODUyMzA4ODYCXzEEB3Bvc0RlYnQIBQ0kdDAzMDg1MjMwODg2Al8yBAVpbmRleAgFDSR0MDMwODUyMzA4ODYCXzMEBXBUeXBlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICBQVrUG9vbAUEcG9vbAISUG9vbCBpcyBub3QgaW5pdGVkBA0kdDAzMDk3ODMxMDY4CQELZ2V0UG9vbERhdGECCQEHQWRkcmVzcwEJANkEAQUEcG9vbAUFcFR5cGUEA0FJZAgFDSR0MDMwOTc4MzEwNjgCXzEEA0JJZAgFDSR0MDMwOTc4MzEwNjgCXzIEBGJhbEEIBQ0kdDAzMDk3ODMxMDY4Al8zBARiYWxCCAUNJHQwMzA5NzgzMTA2OAJfNAQHc2hhcmVJZAgFDSR0MDMwOTc4MzEwNjgCXzUEDGJvcnJvd0Ftb3VudAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwkAkQMCBQZwb3NOdW0FBWluZGV4BRFrVXNlckJvcnJvd0Ftb3VudAAABA91c2VyQ2FuV2l0aGRyYXcJARh1c2VyQ2FuV2l0aGRyYXdTaGFyZUNhbGMEBQR1c2VyBQRwb29sCQCRAwIFBnBvc051bQUFaW5kZXgJAGYCBQxib3Jyb3dBbW91bnQAAAQLc2hhcmVQcmljZXMJAQ1nZXRTaGFyZVByaWNlAQUHc2hhcmVJZAQKZGVjUHJTaGFyZQkAbAYACgAACQEQZ2V0QXNzZXREZWNpbWFscwEFB3NoYXJlSWQAAAAABQRET1dOBAZzaGFyZUQJAGsDBQ91c2VyQ2FuV2l0aGRyYXcFC3NoYXJlUHJpY2VzBQpkZWNQclNoYXJlAwkAAAIFDGJvcnJvd0Ftb3VudAAACQCVCgMJAM0IAgUIdG90YWxQb3MFBnNoYXJlRAkAzQgCBQdwb3NEZWJ0AAAJAGQCBQVpbmRleAABBAtib3Jyb3dBc3NldAkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8JAJEDAgUGcG9zTnVtBQVpbmRleAUSa1VzZXJCb3Jyb3dBc3NldElkBARkZWJ0CgABQAkA/AcECQEOZ2V0TGVuZFNydkFkZHIAAgxnZXRBc3NldERlYnQJAMwIAgcJAMwIAgkArAICCQCsAgIFBHVzZXICAV8JAJEDAgUGcG9zTnVtBQVpbmRleAkAzAgCBQtib3Jyb3dBc3NldAUDbmlsBQNuaWwDCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50BBBib3Jyb3dBc3NldFByaWNlCAoAAUAJAPwHBAUPcHJpY2VPcmFjbGVBZGRyAglnZXRUV0FQNjAJAMwIAgULYm9ycm93QXNzZXQJAMwIAgcFA25pbAUDbmlsAwkAAQIFAUACCihJbnQsIEludCkFAUAJAAIBCQCsAgIJAAMBBQFAAh8gY291bGRuJ3QgYmUgY2FzdCB0byAoSW50LCBJbnQpAl8xBA1kZWNQckJvcnJvd0lkCQBsBgAKAAAJARBnZXRBc3NldERlY2ltYWxzAQULYm9ycm93QXNzZXQAAAAABQRET1dOBAVkZWJ0RAkAawMFBGRlYnQFEGJvcnJvd0Fzc2V0UHJpY2UFDWRlY1ByQm9ycm93SWQJAJUKAwkAzQgCBQh0b3RhbFBvcwUGc2hhcmVECQDNCAIFB3Bvc0RlYnQFBWRlYnRECQBkAgUFaW5kZXgAAQQNJHQwMzIxMTEzMjE2NgoAAiRsBQVwb29scwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJUKAwUDbmlsBQNuaWwAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEHdXNlclBvcwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMjAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUBANwb3MIBQ0kdDAzMjExMTMyMTY2Al8xBARkZWJ0CAUNJHQwMzIxMTEzMjE2NgJfMgkAlAoCBQNuaWwJAJQKAgUDcG9zBQRkZWJ0AWkBCXJlcGxlbmlzaAMEcG9vbAhsZXZlcmFnZQhib3Jyb3dJZAMDCQBmAgBkBQhsZXZlcmFnZQYJAGYCBQhsZXZlcmFnZQCsAgkAAgECH0xldmVyYWdlIGNhbid0IGJlIDwxMDAgYW5kID4zMDAEBXBUeXBlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICBQVrUG9vbAUEcG9vbAISUG9vbCBpcyBub3QgaW5pdGVkBA0kdDAzMjQ4OTMyNTc5CQELZ2V0UG9vbERhdGECCQEHQWRkcmVzcwEJANkEAQUEcG9vbAUFcFR5cGUEA0FJZAgFDSR0MDMyNDg5MzI1NzkCXzEEA0JJZAgFDSR0MDMyNDg5MzI1NzkCXzIEBGJhbEEIBQ0kdDAzMjQ4OTMyNTc5Al8zBARiYWxCCAUNJHQwMzI0ODkzMjU3OQJfNAQHc2hhcmVJZAgFDSR0MDMyNDg5MzI1NzkCXzUEDSR0MDMyNTgyMzMyMTkDCQAAAgkAkAMBCAUBaQhwYXltZW50cwACAwkBAiE9AgkBDGFzc2V0SWRUb1N0cgEICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAUDQUlkCQACAQIVV3JvbmcgcGF5bWVudCBhc3NldCBBAwkBAiE9AgkBDGFzc2V0SWRUb1N0cgEICQCRAwIIBQFpCHBheW1lbnRzAAEHYXNzZXRJZAUDQklkCQACAQIVV3JvbmcgcGF5bWVudCBhc3NldCBCCQCWCgQICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BQNBSWQICQCRAwIIBQFpCHBheW1lbnRzAAEGYW1vdW50BQNCSWQDCQAAAgkAkAMBCAUBaQhwYXltZW50cwABAwkAAAIJAQxhc3NldElkVG9TdHIBCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQFA0FJZAkAlgoECAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAUDQUlkAAAFA0JJZAMJAAACCQEMYXNzZXRJZFRvU3RyAQgJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBQNCSWQJAJYKBAAABQNBSWQICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BQNCSWQJAAIBAg1Xcm9uZyBwYXltZW50CQACAQIcT25lIG9yIHR3byBwYXltZW50cyBleHBlY3RlZAQEcG10QQgFDSR0MDMyNTgyMzMyMTkCXzEECXBtdEFzc2V0QQgFDSR0MDMyNTgyMzMyMTkCXzIEBHBtdEIIBQ0kdDAzMjU4MjMzMjE5Al8zBAlwbXRBc3NldEIIBQ0kdDAzMjU4MjMzMjE5Al80BAluZXdQb3NOdW0JARhnZXROZXdVc2VyUG9zaXRpb25OdW1iZXIBCQClCAEIBQFpBmNhbGxlcgMJAGYCBQhsZXZlcmFnZQBkBAxib3Jyb3dBbW91bnQJARBjYWxjQm9ycm93QW1vdW50BgUEcG10QQUEcG10QgUJcG10QXNzZXRBBQlwbXRBc3NldEIFCGxldmVyYWdlBQhib3Jyb3dJZAQHcmVxdWVzdAkAuQkCCQDMCAIJAKUIAQgFAWkGY2FsbGVyCQDMCAIFBHBvb2wJAMwIAgkApAMBBQRwbXRBCQDMCAIFCXBtdEFzc2V0QQkAzAgCCQCkAwEFBHBtdEIJAMwIAgUJcG10QXNzZXRCCQDMCAIJAKQDAQUEYmFsQQkAzAgCCQCkAwEFBGJhbEIJAMwIAgUHc2hhcmVJZAkAzAgCBQhib3Jyb3dJZAkAzAgCCQCkAwEFDGJvcnJvd0Ftb3VudAUDbmlsAgEsBAxuZXdSZXF1ZXN0SWQKAAFACQD8BwQFBHRoaXMCEGNyZWF0ZU5ld1JlcXVlc3QJAMwIAgUHcmVxdWVzdAUDbmlsBQNuaWwDCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50AwkAAAIFDG5ld1JlcXVlc3RJZAUMbmV3UmVxdWVzdElkBARhcmdzCQDMCAIJAKwCAgkArAICCQClCAEIBQFpBmNhbGxlcgIBXwkApAMBBQluZXdQb3NOdW0JAMwIAgUHc2hhcmVJZAkAzAgCBQhib3Jyb3dJZAkAzAgCBQxib3Jyb3dBbW91bnQJAMwIAgkApQgBBQR0aGlzCQDMCAICEXJlcGxlbmlzaEZyb21MYW5kCQDMCAIJAKQDAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCBQxuZXdSZXF1ZXN0SWQCGENhbid0IGNyZWF0ZSBuZXcgcmVxdWVzdAUDbmlsBANpbnYJAP0HBAkBDmdldExlbmRTcnZBZGRyAAINZmxhc2hQb3NpdGlvbgUEYXJncwUDbmlsAwkAAAIFA2ludgUDaW52BQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4EDSR0MDM0MTQ3MzQyNTkJAQ9yZXBsZW5pc2hCeVR5cGUKBQVwVHlwZQUEcG9vbAULTk9fTE9BTl9GRUUFBHBtdEEFA0FJZAUEcG10QgUDQklkBQRiYWxBBQRiYWxCBQdzaGFyZUlkBAp1c2VyU3Rha2VkCAUNJHQwMzQxNDczNDI1OQJfMQQHYXhseUZlZQgFDSR0MDM0MTQ3MzQyNTkCXzIJAM4IAgkBEHJlcGxlbmlzaEVudHJpZXMIBQRwb29sCQClCAEIBQFpBmNhbGxlcgUKdXNlclN0YWtlZAUHYXhseUZlZQUJbmV3UG9zTnVtBQdzaGFyZUlkBQVwVHlwZQcJAQ5nZXRDdXJzRW50cmllcwMFA0FJZAUDQklkBQdzaGFyZUlkAWkBCHdpdGhkcmF3AgRwb29sBXBvc0lkCQEOd2l0aGRyYXdUb1VzZXIECQClCAEIBQFpBmNhbGxlcgUEcG9vbAkApAMBBQVwb3NJZAcBaQEUY3JlYXRlVXBkYXRlU3RvcExvc3MEBXBvc0lkBnBvb2xJZAdhc3NldElkBXByaWNlBBB0b2tlbk9yYWNsZVByaWNlCAoAAUAJAPwHBAUPcHJpY2VPcmFjbGVBZGRyAglnZXRUV0FQNjAJAMwIAgUHYXNzZXRJZAkAzAgCBwUDbmlsBQNuaWwDCQABAgUBQAIKKEludCwgSW50KQUBQAkAAgEJAKwCAgkAAwEFAUACHyBjb3VsZG4ndCBiZSBjYXN0IHRvIChJbnQsIEludCkCXzEDCQEBIQEJAQlpc0RlZmluZWQBCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQZwb29sSWQCAV8JAKUIAQgFAWkGY2FsbGVyAgFfCQCkAwEFBXBvc0lkBQ1rVXNlclBvc2l0aW9uCQACAQIaVGhlcmUgYXJlIG5vIHVzZXIgcG9zaXRpb24DCQBnAgAABQVwcmljZQkAAgECHFByaWNlIG11c3QgYmUgZ3JlYXRlciB0aGFuIDADCQBmAgUFcHJpY2UFEHRva2VuT3JhY2xlUHJpY2UJAAIBAitQcmljZSBtdXN0IGJlIGxlc3MgdGhhbiBjdXJyZW50IHRva2VuIHByaWNlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKUIAQgFAWkGY2FsbGVyAgFfCQCkAwEFBXBvc0lkAgFfBQZwb29sSWQCAV8FB2Fzc2V0SWQFDWtVc2VyU3RvcExvc3MFBXByaWNlBQNuaWwBaQEOZGVsZXRlU3RvcExvc3MDBXBvc0lkBnBvb2xJZAdhc3NldElkAwkBASEBCQEJaXNEZWZpbmVkAQkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKUIAQgFAWkGY2FsbGVyAgFfCQCkAwEFBXBvc0lkAgFfBQZwb29sSWQCAV8FB2Fzc2V0SWQFDWtVc2VyU3RvcExvc3MJAAIBAghObyBlbnRyeQkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKUIAQgFAWkGY2FsbGVyAgFfCQCkAwEFBXBvc0lkAgFfBQZwb29sSWQCAV8FB2Fzc2V0SWQFDWtVc2VyU3RvcExvc3MFA25pbAFpARBjcmVhdGVOZXdSZXF1ZXN0AQZwYXJhbXMJAQt2YWx1ZU9yRWxzZQIJAQppc1NlbGZDYWxsAQUBaQQMbmV3UmVxdWVzdElkCQBkAgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQxrUmVxdWVzdEl0ZXIAAAABCQCUCgIJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCkAwEFDG5ld1JlcXVlc3RJZAUKa1JlcXVlc3RJZAUGcGFyYW1zCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQxrUmVxdWVzdEl0ZXIFDG5ld1JlcXVlc3RJZAUDbmlsBQxuZXdSZXF1ZXN0SWQBaQERcmVwbGVuaXNoRnJvbUxhbmQBCXJlcXVlc3RJZAkBC3ZhbHVlT3JFbHNlAgkBCmlzTGFuZENhbGwBBQFpBA0kdDAzNjAxMjM2MTE2CQEMcGFyc2VSZXF1ZXN0AQUJcmVxdWVzdElkBAR1c2VyCAUNJHQwMzYwMTIzNjExNgJfMQQEcG9vbAgFDSR0MDM2MDEyMzYxMTYCXzIEBHBtdEEIBQ0kdDAzNjAxMjM2MTE2Al8zBANBSWQIBQ0kdDAzNjAxMjM2MTE2Al80BARwbXRCCAUNJHQwMzYwMTIzNjExNgJfNQQDQklkCAUNJHQwMzYwMTIzNjExNgJfNgQEYmFsQQgFDSR0MDM2MDEyMzYxMTYCXzcEBGJhbEIIBQ0kdDAzNjAxMjM2MTE2Al84BAdzaGFyZUlkCAUNJHQwMzYwMTIzNjExNgJfOQQHYndBc3NldAgFDSR0MDM2MDEyMzYxMTYDXzEwBAhid0Ftb3VudAgFDSR0MDM2MDEyMzYxMTYDXzExAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwABCQACAQISV3JvbmcgcGF5bWVudCBzaXplAwMJAQIhPQIJAQxhc3NldElkVG9TdHIBCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQFB2J3QXNzZXQGCQECIT0CCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAUIYndBbW91bnQJAAIBAg1Xcm9uZyBwYXltZW50BA0kdDAzNjMwNjM2NDMwAwkAAAIFA0FJZAUHYndBc3NldAkAlAoCCQBkAgUEcG10QQgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQFBHBtdEIJAJQKAgUEcG10QQkAZAIFBHBtdEIICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BAdwbXRBbGxBCAUNJHQwMzYzMDYzNjQzMAJfMQQHcG10QWxsQggFDSR0MDM2MzA2MzY0MzACXzIEBXBUeXBlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkArAICBQVrUG9vbAUEcG9vbAIMVW5rbm93biBwb29sBA0kdDAzNjUxMjM2NjI3CQEPcmVwbGVuaXNoQnlUeXBlCgUFcFR5cGUFBHBvb2wFCExPQU5fRkVFBQdwbXRBbGxBBQNBSWQFB3BtdEFsbEIFA0JJZAUEYmFsQQUEYmFsQgUHc2hhcmVJZAQKdXNlclN0YWtlZAgFDSR0MDM2NTEyMzY2MjcCXzEEB2F4bHlGZWUIBQ0kdDAzNjUxMjM2NjI3Al8yBAZwb3NOdW0JARhnZXROZXdVc2VyUG9zaXRpb25OdW1iZXIBBQR1c2VyBA1ib3Jyb3dFbnRyaWVzCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwkApAMBBQZwb3NOdW0FEWtVc2VyQm9ycm93QW1vdW50BQhid0Ftb3VudAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwkApAMBBQZwb3NOdW0FEmtVc2VyQm9ycm93QXNzZXRJZAUHYndBc3NldAUDbmlsBAdlbnRyaWVzCQEQcmVwbGVuaXNoRW50cmllcwgFBHBvb2wFBHVzZXIFCnVzZXJTdGFrZWQFB2F4bHlGZWUFBnBvc051bQUHc2hhcmVJZAUFcFR5cGUGCQCUCgIJAM0IAgkAzggCCQDOCAIFB2VudHJpZXMJAQ5nZXRDdXJzRW50cmllcwMFA0FJZAUDQklkBQdzaGFyZUlkBQ1ib3Jyb3dFbnRyaWVzCQELRGVsZXRlRW50cnkBCQCsAgIFCXJlcXVlc3RJZAUKa1JlcXVlc3RJZAUKdXNlclN0YWtlZAFpAQlsaXF1aWRhdGUDBHVzZXIFcG9zSWQPbGlxdWlkYXRlQW1vdW50CQELdmFsdWVPckVsc2UCCQEKaXNMYW5kQ2FsbAEFAWkEBHBvb2wJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzCQCsAgIJAKwCAgkArAICBQR1c2VyAgFfBQVwb3NJZAURa1VzZXJQb3NpdGlvblBvb2wCC25vIHBvc2l0aW9uBAVwVHlwZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAKwCAgUFa1Bvb2wFBHBvb2wCElBvb2wgaXMgbm90IGluaXRlZAQNJHQwMzc0MDYzNzQ5NgkBC2dldFBvb2xEYXRhAgkBB0FkZHJlc3MBCQDZBAEFBHBvb2wFBXBUeXBlBANBSWQIBQ0kdDAzNzQwNjM3NDk2Al8xBANCSWQIBQ0kdDAzNzQwNjM3NDk2Al8yBARiYWxBCAUNJHQwMzc0MDYzNzQ5NgJfMwQEYmFsQggFDSR0MDM3NDA2Mzc0OTYCXzQEB3NoYXJlSWQIBQ0kdDAzNzQwNjM3NDk2Al81BAZhbW91bnQJAQl1bnN0YWtlTFAEBQRwb29sBQVwVHlwZQUHc2hhcmVJZAUPbGlxdWlkYXRlQW1vdW50BAxib3Jyb3dBbW91bnQJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfBQVwb3NJZAURa1VzZXJCb3Jyb3dBbW91bnQEC2JvcnJvd0Fzc2V0CQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwUEdXNlcgIBXwUFcG9zSWQFEmtVc2VyQm9ycm93QXNzZXRJZAQPdXNlckNhbldpdGhkcmF3CQEYdXNlckNhbldpdGhkcmF3U2hhcmVDYWxjBAUEdXNlcgUEcG9vbAUFcG9zSWQJAGYCBQxib3Jyb3dBbW91bnQAAAMJAAACBQxib3Jyb3dBbW91bnQAAAkAAgECK1lvdSBjYW4ndCBsaXF1aWRhdGUgcG9zaXRpb24gd2l0aG91dCBib3Jyb3cJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQRwb29sAgFfBQR1c2VyAgFfBQVwb3NJZAUVa1VzZXJQb3NpdGlvbkludGVyZXN0CQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIFBHBvb2wFEWtQb29sSW50ZXJlc3RMb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFDmtQb29sVG90YWxMb2FuCQBlAgkBGWdldFBvb2xUb3RhbFNoYXJlV2l0aExvYW4BBQRwb29sBQ9saXF1aWRhdGVBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUKa1Bvb2xUb3RhbAkAZQIJARFnZXRQb29sVG90YWxTaGFyZQEFBHBvb2wFD2xpcXVpZGF0ZUFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8FBHVzZXICAV8FBXBvc0lkBQ1rVXNlclBvc2l0aW9uCQBlAgUPdXNlckNhbldpdGhkcmF3BQ9saXF1aWRhdGVBbW91bnQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQZhbW91bnQJANkEAQUHc2hhcmVJZAUDbmlsAWkBCHN0b3BMb3NzBAR1c2VyBXBvc0lkBHBvb2wHYXNzZXRJZAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUBaQQQdG9rZW5PcmFjbGVQcmljZQgKAAFACQD8BwQFD3ByaWNlT3JhY2xlQWRkcgIJZ2V0VFdBUDYwCQDMCAIFB2Fzc2V0SWQJAMwIAgcFA25pbAUDbmlsAwkAAQIFAUACCihJbnQsIEludCkFAUAJAAIBCQCsAgIJAAMBBQFAAh8gY291bGRuJ3QgYmUgY2FzdCB0byAoSW50LCBJbnQpAl8xAwkBASEBCQEJaXNEZWZpbmVkAQkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHVzZXICAV8JAKQDAQUFcG9zSWQCAV8FBHBvb2wCAV8FB2Fzc2V0SWQFDWtVc2VyU3RvcExvc3MJAAIBAghObyBlbnRyeQkAzQgCCQEOd2l0aGRyYXdUb1VzZXIECQClCAEIBQFpBmNhbGxlcgUEcG9vbAkApAMBBQVwb3NJZAYJAQtEZWxldGVFbnRyeQEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEdXNlcgIBXwkApAMBBQVwb3NJZAIBXwUEcG9vbAIBXwUHYXNzZXRJZAUNa1VzZXJTdG9wTG9zcwFpARJjYXBpdGFsaXplRXhLZWVwZXIMBHBvb2wEdHlwZQl0b2tlblRvSWQQYW1vdW50VG9FeGNoYW5nZQVjbGFpbQlhbW91bnRzSW4JYWRkcmVzc2VzD2Fzc2V0c1RvUmVjZWl2ZQtlc3RSZWNlaXZlZBFzbGlwcGFnZVRvbGVyYW5jZQttaW5SZWNlaXZlZAdvcHRpb25zCQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpBA0kdDAzOTI4MjM5NDc2AwUFY2xhaW0JAQtjbGFpbUZhcm1lZAIFBHR5cGUFBHBvb2wEDGNsYWltZWRBc3NldAMJAAACBQR0eXBlBQdTRl9QT09MBQZTV09QSUQFBFdYSUQJAJQKAgUQYW1vdW50VG9FeGNoYW5nZQUMY2xhaW1lZEFzc2V0BA1jbGFpbWVkQW1vdW50CAUNJHQwMzkyODIzOTQ3NgJfMQQMY2xhaW1lZEFzc2V0CAUNJHQwMzkyODIzOTQ3NgJfMgQPZXhjaGFuZ2VkQW1vdW50CQEOZXhjaGFuZ2VLZWVwZXIKBQl0b2tlblRvSWQFEGFtb3VudFRvRXhjaGFuZ2UFDGNsYWltZWRBc3NldAUJYW1vdW50c0luBQlhZGRyZXNzZXMFD2Fzc2V0c1RvUmVjZWl2ZQULZXN0UmVjZWl2ZWQFEXNsaXBwYWdlVG9sZXJhbmNlBQttaW5SZWNlaXZlZAUHb3B0aW9ucwQGY2hhbmdlCQBlAgUNY2xhaW1lZEFtb3VudAUQYW1vdW50VG9FeGNoYW5nZQQLY2hhbmdlRW50cnkDCQBmAgUGY2hhbmdlAAAJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUOa1Bvb2xDYXBDaGFuZ2UJAGQCBQZjaGFuZ2UJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBQ5rUG9vbENhcENoYW5nZQAABQNuaWwFA25pbAkAzggCCQEKY2FwaXRhbGl6ZQQFBHBvb2wFBHR5cGUFCXRva2VuVG9JZAUPZXhjaGFuZ2VkQW1vdW50BQtjaGFuZ2VFbnRyeQFpARJjYXBpdGFsaXplRXhQdXp6bGUIBHBvb2wEdHlwZQl0b2tlblRvSWQQYW1vdW50VG9FeGNoYW5nZQVjbGFpbQlyb3V0ZXNTdHIMbWluVG9SZWNlaXZlB29wdGlvbnMJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkEDSR0MDQwMTYxNDAzNTUDBQVjbGFpbQkBC2NsYWltRmFybWVkAgUEdHlwZQUEcG9vbAQMY2xhaW1lZEFzc2V0AwkAAAIFBHR5cGUFB1NGX1BPT0wFBlNXT1BJRAUEV1hJRAkAlAoCBRBhbW91bnRUb0V4Y2hhbmdlBQxjbGFpbWVkQXNzZXQEDWNsYWltZWRBbW91bnQIBQ0kdDA0MDE2MTQwMzU1Al8xBAxjbGFpbWVkQXNzZXQIBQ0kdDA0MDE2MTQwMzU1Al8yBA9leGNoYW5nZWRBbW91bnQJAQ5leGNoYW5nZVB1enpsZQYFCXRva2VuVG9JZAUQYW1vdW50VG9FeGNoYW5nZQUMY2xhaW1lZEFzc2V0BQlyb3V0ZXNTdHIFDG1pblRvUmVjZWl2ZQUHb3B0aW9ucwQGY2hhbmdlCQBlAgUNY2xhaW1lZEFtb3VudAUQYW1vdW50VG9FeGNoYW5nZQQLY2hhbmdlRW50cnkDCQBmAgUGY2hhbmdlAAAJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUOa1Bvb2xDYXBDaGFuZ2UJAGQCBQZjaGFuZ2UJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBQ5rUG9vbENhcENoYW5nZQAABQNuaWwFA25pbAkAzggCCQEKY2FwaXRhbGl6ZQQFBHBvb2wFBHR5cGUFCXRva2VuVG9JZAUPZXhjaGFuZ2VkQW1vdW50BQtjaGFuZ2VFbnRyeQFpARJjYXBpdGFsaXplRXhTd29wRmkMBHBvb2wEdHlwZQl0b2tlblRvSWQQYW1vdW50VG9FeGNoYW5nZQVjbGFpbQpleGNoYW5nZXJzDmV4Y2hhbmdlcnNUeXBlBWFyZ3MxBWFyZ3MyEXJvdXRpbmdBc3NldHNLZXlzEm1pbkFtb3VudFRvUmVjZWl2ZQdvcHRpb25zCQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQFpBA0kdDA0MTEwNjQxMzAwAwUFY2xhaW0JAQtjbGFpbUZhcm1lZAIFBHR5cGUFBHBvb2wEDGNsYWltZWRBc3NldAMJAAACBQR0eXBlBQdTRl9QT09MBQZTV09QSUQFBFdYSUQJAJQKAgUQYW1vdW50VG9FeGNoYW5nZQUMY2xhaW1lZEFzc2V0BA1jbGFpbWVkQW1vdW50CAUNJHQwNDExMDY0MTMwMAJfMQQMY2xhaW1lZEFzc2V0CAUNJHQwNDExMDY0MTMwMAJfMgQPZXhjaGFuZ2VkQW1vdW50CQEOZXhjaGFuZ2VTd29wRmkKBQl0b2tlblRvSWQFEGFtb3VudFRvRXhjaGFuZ2UFDGNsYWltZWRBc3NldAUKZXhjaGFuZ2VycwUOZXhjaGFuZ2Vyc1R5cGUFBWFyZ3MxBQVhcmdzMgURcm91dGluZ0Fzc2V0c0tleXMFEm1pbkFtb3VudFRvUmVjZWl2ZQUHb3B0aW9ucwQGY2hhbmdlCQBlAgUNY2xhaW1lZEFtb3VudAUQYW1vdW50VG9FeGNoYW5nZQQLY2hhbmdlRW50cnkDCQBmAgUGY2hhbmdlAAAJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUOa1Bvb2xDYXBDaGFuZ2UJAGQCBQZjaGFuZ2UJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBQ5rUG9vbENhcENoYW5nZQAABQNuaWwFA25pbAkAzggCCQEKY2FwaXRhbGl6ZQQFBHBvb2wFBHR5cGUFCXRva2VuVG9JZAUPZXhjaGFuZ2VkQW1vdW50BQtjaGFuZ2VFbnRyeQFpAQtpbml0TmV3UG9vbAgEdHlwZQhwb29sQWRkcgtpbkZlZU5vTG9hbglpbkZlZUxvYW4MY2FwRmVlTm9Mb2FuDmNhcEZlZVdpdGhMb2FuEXN0b3Bsb3NzRmVlTm9Mb2FuE3N0b3Bsb3NzRmVlV2l0aExvYW4JAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkDAwkBAiE9AgUEdHlwZQUHU0ZfUE9PTAkBAiE9AgUEdHlwZQUHV1hfUE9PTAcJAAIBAgpXcm9uZyB0eXBlBA0kdDA0MjAyMTQyMTE1CQELZ2V0UG9vbERhdGECCQEHQWRkcmVzcwEJANkEAQUIcG9vbEFkZHIFBHR5cGUEA2FJZAgFDSR0MDQyMDIxNDIxMTUCXzEEA2JJZAgFDSR0MDQyMDIxNDIxMTUCXzIEBGFCYWwIBQ0kdDA0MjAyMTQyMTE1Al8zBARiQmFsCAUNJHQwNDIwMjE0MjExNQJfNAQHc2hhcmVJZAgFDSR0MDQyMDIxNDIxMTUCXzUJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUIcG9vbEFkZHIFFWtBeGx5SW5GZWVXaXRob3V0TG9hbgULaW5GZWVOb0xvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUIcG9vbEFkZHIFEmtBeGx5SW5GZWVXaXRoTG9hbgUJaW5GZWVMb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCHBvb2xBZGRyBRFrQXhseU5vTG9hbkNhcEZlZQUMY2FwRmVlTm9Mb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCHBvb2xBZGRyBRNrQXhseVdpdGhMb2FuQ2FwRmVlBQ5jYXBGZWVXaXRoTG9hbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQhwb29sQWRkcgUWa0F4bHlTdG9wTG9zc05vTG9hbkZlZQURc3RvcGxvc3NGZWVOb0xvYW4JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUIcG9vbEFkZHIFFGtBeGx5U3RvcExvc3NMb2FuRmVlBRNzdG9wbG9zc0ZlZVdpdGhMb2FuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCHBvb2xBZGRyBRFrUG9vbEludGVyZXN0TG9hbgAACQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCHBvb2xBZGRyBRNrUG9vbEludGVyZXN0Tm9Mb2FuAAAJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQVrUG9vbAUIcG9vbEFkZHIFBHR5cGUJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQdzaGFyZUlkBQprU2hhcmVQb29sBQhwb29sQWRkcgUDbmlsAQJ0eAEGdmVyaWZ5AAkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAgFAnR4D3NlbmRlclB1YmxpY0tleejkqPk=", "height": 2636406, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 4Fk7bYx6xdHRcB3w32CBpszvhVbawza5M9qHPY7eyDc9 Next: 6D9wtUz83iSGDkhLU1GPC6C5RkFHETkmvyZZe5eXczrr Diff:
OldNewDifferences
350350
351351 func calcReplenishByTwoTokens (pType,poolAddr,pmtA,aId,pmtB,bId,balA,balB) = if ((pType == SF_POOL))
352352 then {
353- let inv = {
353+ let repl = {
354354 let @ = invoke(poolAddr, "callFunction", ["calcLPReplenishTwoTokensREADONLY", [toString(pmtA), toString(pmtB)]], nil)
355355 if ($isInstanceOf(@, "List[Any]"))
356356 then @
357357 else throw(($getType(@) + " couldn't be cast to List[Any]"))
358358 }
359- if ((inv == inv))
359+ if ((repl == repl))
360360 then $Tuple5({
361- let @ = inv[3]
361+ let @ = repl[3]
362362 if ($isInstanceOf(@, "Int"))
363363 then @
364364 else throw(($getType(@) + " couldn't be cast to Int"))
365365 }, {
366- let @ = inv[4]
366+ let @ = repl[4]
367367 if ($isInstanceOf(@, "Int"))
368368 then @
369369 else throw(($getType(@) + " couldn't be cast to Int"))
370370 }, {
371- let @ = inv[1]
371+ let @ = repl[1]
372372 if ($isInstanceOf(@, "Int"))
373373 then @
374374 else throw(($getType(@) + " couldn't be cast to Int"))
375375 }, assetIdToStr({
376- let @ = inv[2]
376+ let @ = repl[2]
377377 if ($isInstanceOf(@, "ByteVector|Unit"))
378378 then @
379379 else throw(($getType(@) + " couldn't be cast to ByteVector|Unit"))
380380 }), {
381- let @ = inv[0]
381+ let @ = repl[0]
382382 if ($isInstanceOf(@, "Int"))
383383 then @
384384 else throw(($getType(@) + " couldn't be cast to Int"))
386386 else throw("Strict value is not equal to itself.")
387387 }
388388 else {
389- let $t01045910709 = $Tuple2(split({
389+ let $t01046510715 = $Tuple2(split({
390390 let @ = invoke(poolAddr, "evaluatePutByAmountAssetREADONLY", [pmtA], nil)
391391 if ($isInstanceOf(@, "String"))
392392 then @
397397 then @
398398 else throw(($getType(@) + " couldn't be cast to String"))
399399 }, "__"))
400- if (($t01045910709 == $t01045910709))
400+ if (($t01046510715 == $t01046510715))
401401 then {
402- let evalPutInB = $t01045910709._2
403- let evalPutInA = $t01045910709._1
402+ let evalPutInB = $t01046510715._2
403+ let evalPutInA = $t01046510715._1
404404 let lpInA = parseIntValue(evalPutInA[1])
405405 let lpInB = parseIntValue(evalPutInB[1])
406406 if ((lpInB > lpInA))
442442
443443
444444 func unstakeLP (pool,pType,shareId,amount) = {
445- let $t01219412551 = if ((pType == SF_POOL))
445+ let $t01220012557 = if ((pType == SF_POOL))
446446 then $Tuple3(getSFFarmingAddr(), "withdrawShareTokens", [pool, amount])
447447 else if ((pType == WX_POOL))
448448 then $Tuple3(getWXFarmingAddr(Address(fromBase58String(pool))), "unstake", [shareId, amount])
449449 else throw("Wrong pool type")
450- let farmAddr = $t01219412551._1
451- let fName = $t01219412551._2
452- let params = $t01219412551._3
450+ let farmAddr = $t01220012557._1
451+ let fName = $t01220012557._2
452+ let params = $t01220012557._3
453453 let inv = invoke(farmAddr, fName, params, nil)
454454 if ((inv == inv))
455455 then amount
462462 let feeScale6 = 1000000
463463 let fee = getIntegerValue(poolAddr, kSFPoolFee)
464464 let amntGetNoFee = fraction(amountTokenToGet, feeScale6, (feeScale6 - fee))
465- let $t01296413252 = if ((assetTokenToGet == assetIdA))
465+ let $t01297013258 = if ((assetTokenToGet == assetIdA))
466466 then {
467467 let amountToPay = fraction(balA, amntGetNoFee, (balB - amntGetNoFee))
468468 $Tuple2(amountToPay, assetIdB)
471471 let amountToPay = fraction(balB, amntGetNoFee, (balA - amntGetNoFee))
472472 $Tuple2(amountToPay, assetIdA)
473473 }
474- let amountToPay = $t01296413252._1
475- let assetToPay = $t01296413252._2
474+ let amountToPay = $t01297013258._1
475+ let assetToPay = $t01297013258._2
476476 $Tuple2(assetToPay, amountToPay)
477477 }
478478
481481 let prFee = getIntegerValue(wxSwapContract, "%s__protocolFee")
482482 let pFee = getIntegerValue(wxSwapContract, "%s__poolFee")
483483 let feeScale = toBigInt(100000000)
484- let $t01359113899 = if ((assetTokenToGet == assetIdA))
484+ let $t01359713905 = if ((assetTokenToGet == assetIdA))
485485 then {
486486 let amountToPay = fraction(balA, amountTokenToGet, (balB - amountTokenToGet))
487487 $Tuple2(amountToPay, assetIdB)
490490 let amountToPay = fraction(balB, amountTokenToGet, (balA - amountTokenToGet))
491491 $Tuple2(amountToPay, assetIdA)
492492 }
493- let amountToPay = $t01359113899._1
494- let assetToPay = $t01359113899._2
493+ let amountToPay = $t01359713905._1
494+ let assetToPay = $t01359713905._2
495495 let amountToPayWithFee = toInt(fraction(toBigInt(amountToPay), feeScale, (feeScale - toBigInt((prFee + pFee)))))
496496 $Tuple2(assetToPay, amountToPayWithFee)
497497 }
499499
500500 func exchangeDirectly (type,pool,assetIdA,assetIdB,balA,balB,amountTokenToGet,assetTokenToGet) = if ((type == SF_POOL))
501501 then {
502- let $t01423714359 = calcAmountToPaySF(pool, assetIdA, assetIdB, balA, balB, amountTokenToGet, assetTokenToGet)
503- let assetToPay = $t01423714359._1
504- let amountToPay = $t01423714359._2
502+ let $t01424314365 = calcAmountToPaySF(pool, assetIdA, assetIdB, balA, balB, amountTokenToGet, assetTokenToGet)
503+ let assetToPay = $t01424314365._1
504+ let amountToPay = $t01424314365._2
505505 invoke(addressFromStringValue(pool), "callFunction", ["exchange", ["1"]], [AttachedPayment(assetIdFromStr(assetToPay), amountToPay)])
506506 }
507507 else {
508- let $t01451014632 = calcAmountToPayWX(pool, assetIdA, assetIdB, balA, balB, amountTokenToGet, assetTokenToGet)
509- let assetToPay = $t01451014632._1
510- let amountToPay = $t01451014632._2
508+ let $t01451614638 = calcAmountToPayWX(pool, assetIdA, assetIdB, balA, balB, amountTokenToGet, assetTokenToGet)
509+ let assetToPay = $t01451614638._1
510+ let amountToPay = $t01451614638._2
511511 invoke(wxSwapContract, "swap", [1, assetTokenToGet, toString(this)], [AttachedPayment(assetIdFromStr(assetToPay), amountToPay)])
512512 }
513513
538538 }
539539 else if ((pType == WX_POOL))
540540 then {
541- let $t01522015561 = if (if ((pmtA > 0))
541+ let $t01522615567 = if (if ((pmtA > 0))
542542 then (pmtB > 0)
543543 else false)
544544 then {
545- let $t01530115427 = calcReplenishByTwoTokens(pType, poolAddr, pmtA, aId, pmtB, bId, balA, balB)
546- let pmtInA = $t01530115427._1
547- let pmtInB = $t01530115427._2
548- let change = $t01530115427._3
549- let changeId = $t01530115427._4
550- let lpAmount = $t01530115427._5
545+ let $t01530715433 = calcReplenishByTwoTokens(pType, poolAddr, pmtA, aId, pmtB, bId, balA, balB)
546+ let pmtInA = $t01530715433._1
547+ let pmtInB = $t01530715433._2
548+ let change = $t01530715433._3
549+ let changeId = $t01530715433._4
550+ let lpAmount = $t01530715433._5
551551 $Tuple3(change, changeId, lpAmount)
552552 }
553553 else if ((pmtA > 0))
554554 then $Tuple3(pmtA, aId, 0)
555555 else $Tuple3(pmtB, bId, 0)
556- let change = $t01522015561._1
557- let changeId = $t01522015561._2
558- let lpTwo = $t01522015561._3
559- let $t01556815784 = if ((change > 0))
556+ let change = $t01522615567._1
557+ let changeId = $t01522615567._2
558+ let lpTwo = $t01522615567._3
559+ let $t01557415790 = if ((change > 0))
560560 then {
561561 let inv = {
562562 let @ = invoke(poolAddr, "putOneTknREADONLY", [changeId, change], nil)
569569 else throw("Strict value is not equal to itself.")
570570 }
571571 else $Tuple2(0, 0)
572- let lpOne = $t01556815784._1
573- let loss = $t01556815784._2
572+ let lpOne = $t01557415790._1
573+ let loss = $t01557415790._2
574574 $Tuple2((lpTwo + lpOne), loss)
575575 }
576576 else throw("Wrong pool type")
579579
580580 func calcWithdrawLPVirt (pType,pool,lpAmount,shareId,aId,bId,balA,balB,borrowAmount,borrowAssetId) = {
581581 let poolAddr = addressFromStringValue(pool)
582- let $t01607816578 = if ((pType == SF_POOL))
582+ let $t01608416584 = if ((pType == SF_POOL))
583583 then {
584584 let inv = {
585585 let @ = invoke(poolAddr, "callFunction", ["withdrawREADONLY", [toString(lpAmount), toString(balA), toString(balB)]], nil)
614614 else throw("Strict value is not equal to itself.")
615615 }
616616 else throw("Wrong pool type")
617- let getAmountA = $t01607816578._1
618- let getAmountB = $t01607816578._2
617+ let getAmountA = $t01608416584._1
618+ let getAmountB = $t01608416584._2
619619 if ((borrowAmount > 0))
620620 then {
621621 let amountToGetEx = if (if ((borrowAssetId == aId))
627627 else false)
628628 then (borrowAmount - getAmountB)
629629 else 0
630- let $t01685617159 = if ((amountToGetEx > 0))
630+ let $t01686217165 = if ((amountToGetEx > 0))
631631 then if ((pType == SF_POOL))
632632 then calcAmountToPaySF(pool, aId, bId, balA, balB, amountToGetEx, borrowAssetId)
633633 else calcAmountToPayWX(pool, aId, bId, balA, balB, amountToGetEx, borrowAssetId)
634634 else $Tuple2("", 0)
635- let assetToPay = $t01685617159._1
636- let amountToPay = $t01685617159._2
635+ let assetToPay = $t01686217165._1
636+ let amountToPay = $t01686217165._2
637637 if ((borrowAssetId == aId))
638638 then $Tuple2(((getAmountA + amountToGetEx) - borrowAmount), (getAmountB - amountToPay))
639639 else $Tuple2((getAmountA - amountToPay), ((getAmountB + amountToGetEx) - borrowAmount))
680680 if ((lpBalanceBefore == lpBalanceBefore))
681681 then {
682682 let poolAddr = addressFromStringValue(pool)
683- let $t01835618772 = if (if ((pmtA > 0))
683+ let $t01836218778 = if (if ((pmtA > 0))
684684 then (pmtB > 0)
685685 else false)
686686 then {
687- let $t01842218538 = calcReplenishByTwoTokens(pType, poolAddr, pmtA, aId, pmtB, bId, balA, balB)
688- let pmtInA = $t01842218538._1
689- let pmtInB = $t01842218538._2
690- let change = $t01842218538._3
691- let changeId = $t01842218538._4
687+ let $t01842818544 = calcReplenishByTwoTokens(pType, poolAddr, pmtA, aId, pmtB, bId, balA, balB)
688+ let pmtInA = $t01842818544._1
689+ let pmtInB = $t01842818544._2
690+ let change = $t01842818544._3
691+ let changeId = $t01842818544._4
692692 let inv = replenishTwoTokensByType(poolAddr, pType, pmtInA, aId, pmtInB, bId)
693693 if ((inv == inv))
694694 then $Tuple2(change, changeId)
699699 else if ((pmtB > 0))
700700 then $Tuple2(pmtB, bId)
701701 else throw("pmts must be > 0")
702- let change = $t01835618772._1
703- let changeId = $t01835618772._2
702+ let change = $t01836218778._1
703+ let changeId = $t01836218778._2
704704 let inv = if ((change > 0))
705705 then replenishOneTokenByType(poolAddr, pType, change, changeId)
706706 else nil
728728 func replenishEntries (pool,user,stakedAmount,axlyFeeAmount,posNum,shareId,type,withLoan) = {
729729 let totalAmount = getPoolTotalShare(pool)
730730 let totalAmountLoan = getPoolTotalShareWithLoan(pool)
731- let $t01963019868 = if (withLoan)
731+ let $t01963619874 = if (withLoan)
732732 then $Tuple2(getIntegerValue(this, (pool + kPoolInterestLoan)), (totalAmountLoan + stakedAmount))
733733 else $Tuple2(getIntegerValue(this, (pool + kPoolInterestNoLoan)), totalAmountLoan)
734- let curPoolInterest = $t01963019868._1
735- let totalStakedWithLoan = $t01963019868._2
734+ let curPoolInterest = $t01963619874._1
735+ let totalStakedWithLoan = $t01963619874._2
736736 [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))]
737737 }
738738
778778
779779 func capitalize (pool,pType,tokenId,tokenAmount) = {
780780 let poolAddr = Address(fromBase58String(pool))
781- let $t02221922285 = getPoolData(poolAddr, pType)
782- let AId = $t02221922285._1
783- let BId = $t02221922285._2
784- let balA = $t02221922285._3
785- let balB = $t02221922285._4
786- let shareId = $t02221922285._5
781+ let $t02222522291 = getPoolData(poolAddr, pType)
782+ let AId = $t02222522291._1
783+ let BId = $t02222522291._2
784+ let balA = $t02222522291._3
785+ let balB = $t02222522291._4
786+ let shareId = $t02222522291._5
787787 if (if ((tokenId != AId))
788788 then (tokenId != BId)
789789 else false)
790790 then throw("Wrong asset")
791791 else {
792- let $t02237022450 = if ((tokenId == AId))
792+ let $t02237622456 = if ((tokenId == AId))
793793 then $Tuple2(tokenAmount, 0)
794794 else $Tuple2(0, tokenAmount)
795- let pmtA = $t02237022450._1
796- let pmtB = $t02237022450._2
797- let $t02245322557 = replenishByType(pType, pool, NO_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId)
798- let stakedAmount = $t02245322557._1
799- let nf = $t02245322557._2
795+ let pmtA = $t02237622456._1
796+ let pmtB = $t02237622456._2
797+ let $t02245922563 = replenishByType(pType, pool, NO_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId)
798+ let stakedAmount = $t02245922563._1
799+ let nf = $t02245922563._2
800800 let curPoolInterestLoan = valueOrElse(getInteger(this, (pool + kPoolInterestLoan)), 0)
801801 let curPoolInterestNoLoan = valueOrElse(getInteger(this, (pool + kPoolInterestNoLoan)), 0)
802802 let totalShareAmount = getPoolTotalShare(pool)
823823 func withdrawAmountCalc (pool,userCanWithdraw,debt,borrowAsset) = {
824824 let poolAddr = Address(fromBase58String(pool))
825825 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Unknown pool")
826- let $t02432524401 = getPoolData(poolAddr, pType)
827- let assetIdA = $t02432524401._1
828- let assetIdB = $t02432524401._2
829- let balA = $t02432524401._3
830- let balB = $t02432524401._4
831- let shareId = $t02432524401._5
826+ let $t02433124407 = getPoolData(poolAddr, pType)
827+ let assetIdA = $t02433124407._1
828+ let assetIdB = $t02433124407._2
829+ let balA = $t02433124407._3
830+ let balB = $t02433124407._4
831+ let shareId = $t02433124407._5
832832 let cBalABefore = accountBalance(assetIdFromStr(assetIdA))
833833 if ((cBalABefore == cBalABefore))
834834 then {
847847 then {
848848 let cBalAAfter = accountBalance(assetIdFromStr(assetIdA))
849849 let cBalBAfter = accountBalance(assetIdFromStr(assetIdB))
850- let $t02496425053 = $Tuple2((cBalAAfter - cBalABefore), (cBalBAfter - cBalBBefore))
851- let tokensAmountA = $t02496425053._1
852- let tokensAmountB = $t02496425053._2
853- let $t02505625752 = if ((debt > 0))
850+ let $t02497025059 = $Tuple2((cBalAAfter - cBalABefore), (cBalBAfter - cBalBBefore))
851+ let tokensAmountA = $t02497025059._1
852+ let tokensAmountB = $t02497025059._2
853+ let $t02506225758 = if ((debt > 0))
854854 then {
855855 let amountToGetEx = if (if ((borrowAsset == assetIdA))
856856 then (debt > tokensAmountA)
873873 else throw("Strict value is not equal to itself.")
874874 }
875875 else $Tuple2(tokensAmountA, tokensAmountB)
876- let toUserAmountA = $t02505625752._1
877- let toUserAmountB = $t02505625752._2
876+ let toUserAmountA = $t02506225758._1
877+ let toUserAmountB = $t02506225758._2
878878 $Tuple7(toUserAmountA, assetIdA, toUserAmountB, assetIdB, cBalAAfter, cBalBAfter, shareId)
879879 }
880880 else throw("Strict value is not equal to itself.")
911911 else throw(($getType(@) + " couldn't be cast to Int"))
912912 }
913913 else 0
914- let $t02725127404 = withdrawAmountCalc(pool, userCanWithdraw, debt, borrowAsset)
915- if (($t02725127404 == $t02725127404))
914+ let $t02725727410 = withdrawAmountCalc(pool, userCanWithdraw, debt, borrowAsset)
915+ if (($t02725727410 == $t02725727410))
916916 then {
917- let shareId = $t02725127404._7
918- let cBalBAfter = $t02725127404._6
919- let cBalAAfter = $t02725127404._5
920- let assetIdB = $t02725127404._4
921- let toUserAmountB = $t02725127404._3
922- let assetIdA = $t02725127404._2
923- let toUserAmountA = $t02725127404._1
917+ let shareId = $t02725727410._7
918+ let cBalBAfter = $t02725727410._6
919+ let cBalAAfter = $t02725727410._5
920+ let assetIdB = $t02725727410._4
921+ let toUserAmountB = $t02725727410._3
922+ let assetIdA = $t02725727410._2
923+ let toUserAmountA = $t02725727410._1
924924 let closeDbtInv = if ((debt > 0))
925925 then invoke(getLendSrvAddr(), "repayFor", [((user + "_") + posId)], [AttachedPayment(assetIdFromStr(borrowAsset), debt)])
926926 else 0
961961 let decPrA = pow(10, 0, getAssetDecimals(aId), 0, 0, DOWN)
962962 let decPrB = pow(10, 0, getAssetDecimals(bId), 0, 0, DOWN)
963963 let paydInDollar = (fraction(dPriceA, pmtA, decPrA) + fraction(dPriceB, pmtB, decPrB))
964- let $t02909029187 = if ((borrowId == aId))
964+ let $t02909629193 = if ((borrowId == aId))
965965 then $Tuple2(dPriceA, decPrA)
966966 else $Tuple2(dPriceB, decPrB)
967- let borrowPrice = $t02909029187._1
968- let borrowDecPr = $t02909029187._2
967+ let borrowPrice = $t02909629193._1
968+ let borrowDecPr = $t02909629193._2
969969 fraction(fraction(paydInDollar, (leverage - 100), 100), borrowDecPr, borrowPrice)
970970 }
971971
977977 then throw("Leverage can't be <100 and >300")
978978 else {
979979 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
980- let $t02960529695 = getPoolData(Address(fromBase58String(pool)), pType)
981- let AId = $t02960529695._1
982- let BId = $t02960529695._2
983- let balA = $t02960529695._3
984- let balB = $t02960529695._4
985- let shareId = $t02960529695._5
980+ let $t02961129701 = getPoolData(Address(fromBase58String(pool)), pType)
981+ let AId = $t02961129701._1
982+ let BId = $t02961129701._2
983+ let balA = $t02961129701._3
984+ let balB = $t02961129701._4
985+ let shareId = $t02961129701._5
986986 let borrowAmount = if ((leverage > 100))
987987 then calcBorrowAmount(pmtA, pmtB, AId, BId, leverage, borrowId)
988988 else 0
989- let $t02983029937 = if ((borrowId == AId))
989+ let $t02983629943 = if ((borrowId == AId))
990990 then $Tuple2((pmtA + borrowAmount), pmtB)
991991 else $Tuple2(pmtA, (pmtB + borrowAmount))
992- let payInA = $t02983029937._1
993- let payInB = $t02983029937._2
994- let $t02994030033 = calcReplenishLPVirt(pType, pool, payInA, AId, payInB, BId, balA, balB)
995- let lpAmount = $t02994030033._1
996- let loss = $t02994030033._2
992+ let payInA = $t02983629943._1
993+ let payInB = $t02983629943._2
994+ let $t02994630039 = calcReplenishLPVirt(pType, pool, payInA, AId, payInB, BId, balA, balB)
995+ let lpAmount = $t02994630039._1
996+ let loss = $t02994630039._2
997997 let impactMod = if ((0 > loss))
998998 then (loss * -1)
999999 else loss
10231023 @Callable(i)
10241024 func getUserPositionInDollarsREADONLY (user,pools,posNum) = {
10251025 func userPos (a,pool) = {
1026- let $t03084630880 = a
1027- let totalPos = $t03084630880._1
1028- let posDebt = $t03084630880._2
1029- let index = $t03084630880._3
1026+ let $t03085230886 = a
1027+ let totalPos = $t03085230886._1
1028+ let posDebt = $t03085230886._2
1029+ let index = $t03085230886._3
10301030 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
1031- let $t03097231062 = getPoolData(Address(fromBase58String(pool)), pType)
1032- let AId = $t03097231062._1
1033- let BId = $t03097231062._2
1034- let balA = $t03097231062._3
1035- let balB = $t03097231062._4
1036- let shareId = $t03097231062._5
1031+ let $t03097831068 = getPoolData(Address(fromBase58String(pool)), pType)
1032+ let AId = $t03097831068._1
1033+ let BId = $t03097831068._2
1034+ let balA = $t03097831068._3
1035+ let balB = $t03097831068._4
1036+ let shareId = $t03097831068._5
10371037 let borrowAmount = valueOrElse(getInteger(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserBorrowAmount)), 0)
10381038 let userCanWithdraw = userCanWithdrawShareCalc(user, pool, posNum[index], (borrowAmount > 0))
10391039 let sharePrices = getSharePrice(shareId)
10591059 }
10601060 }
10611061
1062- let $t03210532160 = {
1062+ let $t03211132166 = {
10631063 let $l = pools
10641064 let $s = size($l)
10651065 let $acc0 = $Tuple3(nil, nil, 0)
10731073
10741074 $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)
10751075 }
1076- let pos = $t03210532160._1
1077- let debt = $t03210532160._2
1076+ let pos = $t03211132166._1
1077+ let debt = $t03211132166._2
10781078 $Tuple2(nil, $Tuple2(pos, debt))
10791079 }
10801080
10871087 then throw("Leverage can't be <100 and >300")
10881088 else {
10891089 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
1090- let $t03248332573 = getPoolData(Address(fromBase58String(pool)), pType)
1091- let AId = $t03248332573._1
1092- let BId = $t03248332573._2
1093- let balA = $t03248332573._3
1094- let balB = $t03248332573._4
1095- let shareId = $t03248332573._5
1096- let $t03257633213 = if ((size(i.payments) == 2))
1090+ let $t03248932579 = getPoolData(Address(fromBase58String(pool)), pType)
1091+ let AId = $t03248932579._1
1092+ let BId = $t03248932579._2
1093+ let balA = $t03248932579._3
1094+ let balB = $t03248932579._4
1095+ let shareId = $t03248932579._5
1096+ let $t03258233219 = if ((size(i.payments) == 2))
10971097 then if ((assetIdToStr(i.payments[0].assetId) != AId))
10981098 then throw("Wrong payment asset A")
10991099 else if ((assetIdToStr(i.payments[1].assetId) != BId))
11061106 then $Tuple4(0, AId, i.payments[0].amount, BId)
11071107 else throw("Wrong payment")
11081108 else throw("One or two payments expected")
1109- let pmtA = $t03257633213._1
1110- let pmtAssetA = $t03257633213._2
1111- let pmtB = $t03257633213._3
1112- let pmtAssetB = $t03257633213._4
1109+ let pmtA = $t03258233219._1
1110+ let pmtAssetA = $t03258233219._2
1111+ let pmtB = $t03258233219._3
1112+ let pmtAssetB = $t03258233219._4
11131113 let newPosNum = getNewUserPositionNumber(toString(i.caller))
11141114 if ((leverage > 100))
11151115 then {
11321132 else throw("Strict value is not equal to itself.")
11331133 }
11341134 else {
1135- let $t03414134253 = replenishByType(pType, pool, NO_LOAN_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId)
1136- let userStaked = $t03414134253._1
1137- let axlyFee = $t03414134253._2
1135+ let $t03414734259 = replenishByType(pType, pool, NO_LOAN_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId)
1136+ let userStaked = $t03414734259._1
1137+ let axlyFee = $t03414734259._2
11381138 (replenishEntries(pool, toString(i.caller), userStaked, axlyFee, newPosNum, shareId, pType, false) ++ getCursEntries(AId, BId, shareId))
11391139 }
11401140 }
11801180
11811181 @Callable(i)
11821182 func replenishFromLand (requestId) = valueOrElse(isLandCall(i), {
1183- let $t03600636110 = parseRequest(requestId)
1184- let user = $t03600636110._1
1185- let pool = $t03600636110._2
1186- let pmtA = $t03600636110._3
1187- let AId = $t03600636110._4
1188- let pmtB = $t03600636110._5
1189- let BId = $t03600636110._6
1190- let balA = $t03600636110._7
1191- let balB = $t03600636110._8
1192- let shareId = $t03600636110._9
1193- let bwAsset = $t03600636110._10
1194- let bwAmount = $t03600636110._11
1183+ let $t03601236116 = parseRequest(requestId)
1184+ let user = $t03601236116._1
1185+ let pool = $t03601236116._2
1186+ let pmtA = $t03601236116._3
1187+ let AId = $t03601236116._4
1188+ let pmtB = $t03601236116._5
1189+ let BId = $t03601236116._6
1190+ let balA = $t03601236116._7
1191+ let balB = $t03601236116._8
1192+ let shareId = $t03601236116._9
1193+ let bwAsset = $t03601236116._10
1194+ let bwAmount = $t03601236116._11
11951195 if ((size(i.payments) != 1))
11961196 then throw("Wrong payment size")
11971197 else if (if ((assetIdToStr(i.payments[0].assetId) != bwAsset))
11991199 else (i.payments[0].amount != bwAmount))
12001200 then throw("Wrong payment")
12011201 else {
1202- let $t03630036424 = if ((AId == bwAsset))
1202+ let $t03630636430 = if ((AId == bwAsset))
12031203 then $Tuple2((pmtA + i.payments[0].amount), pmtB)
12041204 else $Tuple2(pmtA, (pmtB + i.payments[0].amount))
1205- let pmtAllA = $t03630036424._1
1206- let pmtAllB = $t03630036424._2
1205+ let pmtAllA = $t03630636430._1
1206+ let pmtAllB = $t03630636430._2
12071207 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Unknown pool")
1208- let $t03650636621 = replenishByType(pType, pool, LOAN_FEE, pmtAllA, AId, pmtAllB, BId, balA, balB, shareId)
1209- let userStaked = $t03650636621._1
1210- let axlyFee = $t03650636621._2
1208+ let $t03651236627 = replenishByType(pType, pool, LOAN_FEE, pmtAllA, AId, pmtAllB, BId, balA, balB, shareId)
1209+ let userStaked = $t03651236627._1
1210+ let axlyFee = $t03651236627._2
12111211 let posNum = getNewUserPositionNumber(user)
12121212 let borrowEntries = [IntegerEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserBorrowAmount), bwAmount), StringEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserBorrowAssetId), bwAsset)]
12131213 let entries = replenishEntries(pool, user, userStaked, axlyFee, posNum, shareId, pType, true)
12211221 func liquidate (user,posId,liquidateAmount) = valueOrElse(isLandCall(i), {
12221222 let pool = valueOrErrorMessage(getString(this, (((user + "_") + posId) + kUserPositionPool)), "no position")
12231223 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
1224- let $t03740037490 = getPoolData(Address(fromBase58String(pool)), pType)
1225- let AId = $t03740037490._1
1226- let BId = $t03740037490._2
1227- let balA = $t03740037490._3
1228- let balB = $t03740037490._4
1229- let shareId = $t03740037490._5
1224+ let $t03740637496 = getPoolData(Address(fromBase58String(pool)), pType)
1225+ let AId = $t03740637496._1
1226+ let BId = $t03740637496._2
1227+ let balA = $t03740637496._3
1228+ let balB = $t03740637496._4
1229+ let shareId = $t03740637496._5
12301230 let amount = unstakeLP(pool, pType, shareId, liquidateAmount)
12311231 let borrowAmount = getIntegerValue(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAmount))
12321232 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAssetId))
12531253
12541254 @Callable(i)
12551255 func capitalizeExKeeper (pool,type,tokenToId,amountToExchange,claim,amountsIn,addresses,assetsToReceive,estReceived,slippageTolerance,minReceived,options) = valueOrElse(isAdminCall(i), {
1256- let $t03927639470 = if (claim)
1256+ let $t03928239476 = if (claim)
12571257 then claimFarmed(type, pool)
12581258 else {
12591259 let claimedAsset = if ((type == SF_POOL))
12611261 else WXID
12621262 $Tuple2(amountToExchange, claimedAsset)
12631263 }
1264- let claimedAmount = $t03927639470._1
1265- let claimedAsset = $t03927639470._2
1264+ let claimedAmount = $t03928239476._1
1265+ let claimedAsset = $t03928239476._2
12661266 let exchangedAmount = exchangeKeeper(tokenToId, amountToExchange, claimedAsset, amountsIn, addresses, assetsToReceive, estReceived, slippageTolerance, minReceived, options)
12671267 let change = (claimedAmount - amountToExchange)
12681268 let changeEntry = if ((change > 0))
12751275
12761276 @Callable(i)
12771277 func capitalizeExPuzzle (pool,type,tokenToId,amountToExchange,claim,routesStr,minToReceive,options) = valueOrElse(isAdminCall(i), {
1278- let $t04015540349 = if (claim)
1278+ let $t04016140355 = if (claim)
12791279 then claimFarmed(type, pool)
12801280 else {
12811281 let claimedAsset = if ((type == SF_POOL))
12831283 else WXID
12841284 $Tuple2(amountToExchange, claimedAsset)
12851285 }
1286- let claimedAmount = $t04015540349._1
1287- let claimedAsset = $t04015540349._2
1286+ let claimedAmount = $t04016140355._1
1287+ let claimedAsset = $t04016140355._2
12881288 let exchangedAmount = exchangePuzzle(tokenToId, amountToExchange, claimedAsset, routesStr, minToReceive, options)
12891289 let change = (claimedAmount - amountToExchange)
12901290 let changeEntry = if ((change > 0))
12971297
12981298 @Callable(i)
12991299 func capitalizeExSwopFi (pool,type,tokenToId,amountToExchange,claim,exchangers,exchangersType,args1,args2,routingAssetsKeys,minAmountToReceive,options) = valueOrElse(isAdminCall(i), {
1300- let $t04110041294 = if (claim)
1300+ let $t04110641300 = if (claim)
13011301 then claimFarmed(type, pool)
13021302 else {
13031303 let claimedAsset = if ((type == SF_POOL))
13051305 else WXID
13061306 $Tuple2(amountToExchange, claimedAsset)
13071307 }
1308- let claimedAmount = $t04110041294._1
1309- let claimedAsset = $t04110041294._2
1308+ let claimedAmount = $t04110641300._1
1309+ let claimedAsset = $t04110641300._2
13101310 let exchangedAmount = exchangeSwopFi(tokenToId, amountToExchange, claimedAsset, exchangers, exchangersType, args1, args2, routingAssetsKeys, minAmountToReceive, options)
13111311 let change = (claimedAmount - amountToExchange)
13121312 let changeEntry = if ((change > 0))
13231323 else false)
13241324 then throw("Wrong type")
13251325 else {
1326- let $t04201542109 = getPoolData(Address(fromBase58String(poolAddr)), type)
1327- let aId = $t04201542109._1
1328- let bId = $t04201542109._2
1329- let aBal = $t04201542109._3
1330- let bBal = $t04201542109._4
1331- let shareId = $t04201542109._5
1326+ let $t04202142115 = getPoolData(Address(fromBase58String(poolAddr)), type)
1327+ let aId = $t04202142115._1
1328+ let bId = $t04202142115._2
1329+ let aBal = $t04202142115._3
1330+ let bBal = $t04202142115._4
1331+ let shareId = $t04202142115._5
13321332 [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)]
13331333 })
13341334
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 = "_user_position"
4545
4646 let kUserPositionPool = "_user_position_pool"
4747
4848 let kUserBorrowAmount = "_user_position_borrow_amount"
4949
5050 let kUserBorrowAssetId = "_user_position_borrow_asset_id"
5151
5252 let kUserPositionNum = "_user_position_number"
5353
5454 let kUserPositionInterest = "_user_position_interest"
5555
5656 let kPoolTotal = "_pool_total"
5757
5858 let kPoolTotalLoan = "_pool_total_loan"
5959
6060 let kPoolInterestLoan = "_pool_interest_loan"
6161
6262 let kPoolInterestNoLoan = "_pool_interest_no_loan"
6363
6464 let kAxlyInFeeWithoutLoan = "_axly_fee_without_loan"
6565
6666 let kAxlyInFeeWithLoan = "_axly_fee_with_loan"
6767
6868 let kAxlyNoLoanCapFee = "_axly_fee_cap_with_loan"
6969
7070 let kAxlyWithLoanCapFee = "_axly_fee_cap_no_loan"
7171
7272 let kAxlyStopLossNoLoanFee = "_axly_fee_stoploss_with_loan"
7373
7474 let kAxlyStopLossLoanFee = "_axly_fee_stoploss_no_loan"
7575
7676 let kRequestId = "_request_id"
7777
7878 let kRequestIter = "requests_iter"
7979
8080 let kPool = "pool_"
8181
8282 let kSharePool = "_pool_share_id"
8383
8484 let kPoolCapChange = "_pool_cap_change"
8585
8686 let kTokenLastPrice = "last_price"
8787
8888 let kUserStopLoss = "_stop_loss"
8989
9090 let kMoneyBox = "axly_money_box"
9191
9292 let kSFFarmingAddr = "swopfi_farming_addr"
9393
9494 let kLendService = "lend_service_addr"
9595
9696 let kAdminCallPK = "admin_call_pub_key"
9797
9898 let kPriceOracle = "price_oracle"
9999
100100 let kExContract = "exchange_contract"
101101
102102 let kWxSwapContract = "wx_swap_contract"
103103
104104 let moneyBox = Address(fromBase58String(valueOrErrorMessage(getString(this, kMoneyBox), "No axly moneyBox address")))
105105
106106 let exContract = Address(fromBase58String(valueOrErrorMessage(getString(this, kExContract), "No exchange contract address")))
107107
108108 let priceOracleAddr = Address(fromBase58String(valueOrErrorMessage(getString(this, kPriceOracle), "No price oracle address")))
109109
110110 let wxSwapContract = Address(fromBase58String(valueOrErrorMessage(getString(this, kWxSwapContract), "No wx swap address")))
111111
112112 let SWOPID = base58'4W19ndijcc2CsQa9HGW2dfXKTVXhnneWWttxXrtjPmEp'
113113
114114 let WXID = base58'EMAMLxDnv3xiz8RXg8Btj33jcEw3wLczL3JKYYmuubpc'
115115
116116 func getLendSrvAddr () = Address(fromBase58String(valueOrErrorMessage(getString(this, kLendService), "Can't get lend service addr")))
117117
118118
119119 func getAdminCallAddr () = addressFromPublicKey(fromBase58String(valueOrErrorMessage(getString(this, kAdminCallPK), "Can't get admin addr")))
120120
121121
122122 func isAdminCall (i) = if ((i.caller == getAdminCallAddr()))
123123 then unit
124124 else throw("Only admin can call this function")
125125
126126
127127 func isSelfCall (i) = if ((i.caller == this))
128128 then unit
129129 else throw("Only contract itself can call this function")
130130
131131
132132 func isLandCall (i) = if ((i.caller == getLendSrvAddr()))
133133 then unit
134134 else throw("Only land contract can call this function")
135135
136136
137137 func accountBalance (assetId) = match assetId {
138138 case id: ByteVector =>
139139 assetBalance(this, id)
140140 case waves: Unit =>
141141 wavesBalance(this).available
142142 case _ =>
143143 throw("Match error")
144144 }
145145
146146
147147 func getSFPoolData (poolAddr) = $Tuple5(valueOrErrorMessage(getString(poolAddr, kSFPoolAAssetId), "Can't get pool A asset id"), valueOrErrorMessage(getString(poolAddr, kSFPoolBAssetId), "Can't get pool B asset id"), valueOrErrorMessage(getInteger(poolAddr, kSFPoolAAssetBalance), "Can't get pool A asset balance"), valueOrErrorMessage(getInteger(poolAddr, kSFPoolBAssetBalance), "Can't get pool B asset balance"), valueOrErrorMessage(getString(poolAddr, kSFPoolShareId), "Can't get share asset id"))
148148
149149
150150 func getWXPoolData (poolAddr) = {
151151 let cfg = {
152152 let @ = invoke(poolAddr, "getPoolConfigWrapperREADONLY", nil, nil)
153153 if ($isInstanceOf(@, "List[Any]"))
154154 then @
155155 else throw(($getType(@) + " couldn't be cast to List[Any]"))
156156 }
157157 if ((cfg == cfg))
158158 then {
159159 let aId = valueOrErrorMessage({
160160 let @ = cfg[4]
161161 if ($isInstanceOf(@, "String"))
162162 then @
163163 else unit
164164 }, "Can't get pool A asset id")
165165 let bId = valueOrErrorMessage({
166166 let @ = cfg[5]
167167 if ($isInstanceOf(@, "String"))
168168 then @
169169 else unit
170170 }, "Can't get pool B asset id")
171171 let shareId = valueOrErrorMessage({
172172 let @ = cfg[3]
173173 if ($isInstanceOf(@, "String"))
174174 then @
175175 else unit
176176 }, "Can't get pool LP asset id")
177177 let balA = {
178178 let @ = invoke(poolAddr, "getAccBalanceWrapperREADONLY", [aId], nil)
179179 if ($isInstanceOf(@, "Int"))
180180 then @
181181 else throw(($getType(@) + " couldn't be cast to Int"))
182182 }
183183 if ((balA == balA))
184184 then {
185185 let balB = {
186186 let @ = invoke(poolAddr, "getAccBalanceWrapperREADONLY", [bId], nil)
187187 if ($isInstanceOf(@, "Int"))
188188 then @
189189 else throw(($getType(@) + " couldn't be cast to Int"))
190190 }
191191 if ((balB == balB))
192192 then $Tuple5(aId, bId, balA, balB, shareId)
193193 else throw("Strict value is not equal to itself.")
194194 }
195195 else throw("Strict value is not equal to itself.")
196196 }
197197 else throw("Strict value is not equal to itself.")
198198 }
199199
200200
201201 func getPoolData (poolAddr,type) = if ((type == SF_POOL))
202202 then getSFPoolData(poolAddr)
203203 else if ((type == WX_POOL))
204204 then getWXPoolData(poolAddr)
205205 else throw("Wrong pool type")
206206
207207
208208 func getShareSupply (poolAddr,type,shareId) = if ((type == SF_POOL))
209209 then valueOrErrorMessage(getInteger(poolAddr, kSFPoolShareSupply), "Can't get share asset supply")
210210 else if ((type == WX_POOL))
211211 then valueOrErrorMessage(assetInfo(fromBase58String(shareId)), "Wrong ShareId").quantity
212212 else throw("Wrong pool type")
213213
214214
215215 func getPoolTotalShare (pool) = valueOrElse(getInteger(this, (pool + kPoolTotal)), 0)
216216
217217
218218 func getPoolTotalShareWithLoan (pool) = valueOrElse(getInteger(this, (pool + kPoolTotalLoan)), 0)
219219
220220
221221 func getNewUserPositionNumber (user) = (valueOrElse(getInteger(this, (user + kUserPositionNum)), 0) + 1)
222222
223223
224224 func getAxlyFee (pool,feeType) = if ((feeType == CAP_FEE_LOAN))
225225 then getIntegerValue(this, (pool + kAxlyWithLoanCapFee))
226226 else if ((feeType == CAP_FEE_NO_LOAN))
227227 then getIntegerValue(this, (pool + kAxlyNoLoanCapFee))
228228 else if ((feeType == LOAN_FEE))
229229 then getIntegerValue(this, (pool + kAxlyInFeeWithLoan))
230230 else if ((feeType == NO_LOAN_FEE))
231231 then getIntegerValue(this, (pool + kAxlyInFeeWithoutLoan))
232232 else if ((feeType == NO_FEE))
233233 then 0
234234 else throw("Wrong fee type")
235235
236236
237237 func getSFFarmingAddr () = Address(fromBase58String(valueOrErrorMessage(getString(this, kSFFarmingAddr), "Can't get swopfi farming addr")))
238238
239239
240240 func getWXFarmingAddr (poolAddr) = {
241241 let fContract = Address(fromBase58String(valueOrErrorMessage(getString(poolAddr, "%s__factoryContract"), "Can't get WX factory contract addr")))
242242 let factroyCfg = split(valueOrErrorMessage(getString(fContract, "%s__factoryConfig"), "Can't get WX factory cfg"), "__")
243243 Address(fromBase58String(factroyCfg[1]))
244244 }
245245
246246
247247 func assetIdToStr (assetId) = match assetId {
248248 case id: ByteVector =>
249249 toBase58String(id)
250250 case waves: Unit =>
251251 "WAVES"
252252 case _ =>
253253 throw("Match error")
254254 }
255255
256256
257257 func assetIdFromStr (assetId) = if ((assetId == "WAVES"))
258258 then unit
259259 else fromBase58String(assetId)
260260
261261
262262 func getAssetDecimals (assetId) = if ((assetId == "WAVES"))
263263 then 8
264264 else match assetInfo(fromBase58String(assetId)) {
265265 case asset: Asset =>
266266 asset.decimals
267267 case _ =>
268268 throw("Can't find asset")
269269 }
270270
271271
272272 func getAssetPrecition (assetId) = pow(10, 0, getAssetDecimals(assetId), 0, 0, DOWN)
273273
274274
275275 func getAssetsPrice (assetIds) = {
276276 func getPrices (a,assetId) = {
277277 let assetPrice = ( let @ = invoke(priceOracleAddr, "getTWAP60", [assetId, false], nil)
278278 if ($isInstanceOf(@, "(Int, Int)"))
279279 then @
280280 else throw(($getType(@) + " couldn't be cast to (Int, Int)")))._2
281281 (a :+ assetPrice)
282282 }
283283
284284 let $l = assetIds
285285 let $s = size($l)
286286 let $acc0 = nil
287287 func $f0_1 ($a,$i) = if (($i >= $s))
288288 then $a
289289 else getPrices($a, $l[$i])
290290
291291 func $f0_2 ($a,$i) = if (($i >= $s))
292292 then $a
293293 else throw("List size exceeds 50")
294294
295295 $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)
296296 }
297297
298298
299299 func getSharePrice (shareId) = {
300300 let pool = valueOrErrorMessage(getString(this, (shareId + kSharePool)), "Can't find pool addr by share id")
301301 let poolAddr = Address(fromBase58String(pool))
302302 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
303303 let $t088458910 = getPoolData(poolAddr, pType)
304304 let aId = $t088458910._1
305305 let bId = $t088458910._2
306306 let aBalance = $t088458910._3
307307 let bBalance = $t088458910._4
308308 let dPriceA = ( let @ = invoke(priceOracleAddr, "getTWAP60", [aId, false], nil)
309309 if ($isInstanceOf(@, "(Int, Int)"))
310310 then @
311311 else throw(($getType(@) + " couldn't be cast to (Int, Int)")))._2
312312 let dPriceB = ( let @ = invoke(priceOracleAddr, "getTWAP60", [bId, false], nil)
313313 if ($isInstanceOf(@, "(Int, Int)"))
314314 then @
315315 else throw(($getType(@) + " couldn't be cast to (Int, Int)")))._2
316316 let shareSupply = getShareSupply(poolAddr, pType, shareId)
317317 let APrecision = pow(10, 0, getAssetDecimals(aId), 0, 0, DOWN)
318318 let BPrecision = pow(10, 0, getAssetDecimals(bId), 0, 0, DOWN)
319319 let sharePrecision = pow(10, 0, getAssetDecimals(shareId), 0, 0, DOWN)
320320 let sum = (fraction(aBalance, dPriceA, APrecision) + fraction(bBalance, dPriceB, BPrecision))
321321 fraction(sum, sharePrecision, shareSupply)
322322 }
323323
324324
325325 func getSharePrices (shareIds) = {
326326 func getPrices (a,shareId) = (a :+ getSharePrice(shareId))
327327
328328 let $l = shareIds
329329 let $s = size($l)
330330 let $acc0 = nil
331331 func $f0_1 ($a,$i) = if (($i >= $s))
332332 then $a
333333 else getPrices($a, $l[$i])
334334
335335 func $f0_2 ($a,$i) = if (($i >= $s))
336336 then $a
337337 else throw("List size exceeds 20")
338338
339339 $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)
340340 }
341341
342342
343343 func getCursEntries (aId,bId,shareId) = {
344344 let assetsPrices = getAssetsPrice([aId, bId])
345345 let sharePrice = getSharePrice(shareId)
346346 let prices = [toString(assetsPrices[0]), toString(assetsPrices[1]), toString(sharePrice)]
347347 [StringEntry(kTokenLastPrice, makeString(prices, ","))]
348348 }
349349
350350
351351 func calcReplenishByTwoTokens (pType,poolAddr,pmtA,aId,pmtB,bId,balA,balB) = if ((pType == SF_POOL))
352352 then {
353- let inv = {
353+ let repl = {
354354 let @ = invoke(poolAddr, "callFunction", ["calcLPReplenishTwoTokensREADONLY", [toString(pmtA), toString(pmtB)]], nil)
355355 if ($isInstanceOf(@, "List[Any]"))
356356 then @
357357 else throw(($getType(@) + " couldn't be cast to List[Any]"))
358358 }
359- if ((inv == inv))
359+ if ((repl == repl))
360360 then $Tuple5({
361- let @ = inv[3]
361+ let @ = repl[3]
362362 if ($isInstanceOf(@, "Int"))
363363 then @
364364 else throw(($getType(@) + " couldn't be cast to Int"))
365365 }, {
366- let @ = inv[4]
366+ let @ = repl[4]
367367 if ($isInstanceOf(@, "Int"))
368368 then @
369369 else throw(($getType(@) + " couldn't be cast to Int"))
370370 }, {
371- let @ = inv[1]
371+ let @ = repl[1]
372372 if ($isInstanceOf(@, "Int"))
373373 then @
374374 else throw(($getType(@) + " couldn't be cast to Int"))
375375 }, assetIdToStr({
376- let @ = inv[2]
376+ let @ = repl[2]
377377 if ($isInstanceOf(@, "ByteVector|Unit"))
378378 then @
379379 else throw(($getType(@) + " couldn't be cast to ByteVector|Unit"))
380380 }), {
381- let @ = inv[0]
381+ let @ = repl[0]
382382 if ($isInstanceOf(@, "Int"))
383383 then @
384384 else throw(($getType(@) + " couldn't be cast to Int"))
385385 })
386386 else throw("Strict value is not equal to itself.")
387387 }
388388 else {
389- let $t01045910709 = $Tuple2(split({
389+ let $t01046510715 = $Tuple2(split({
390390 let @ = invoke(poolAddr, "evaluatePutByAmountAssetREADONLY", [pmtA], nil)
391391 if ($isInstanceOf(@, "String"))
392392 then @
393393 else throw(($getType(@) + " couldn't be cast to String"))
394394 }, "__"), split({
395395 let @ = invoke(poolAddr, "evaluatePutByPriceAssetREADONLY", [pmtB], nil)
396396 if ($isInstanceOf(@, "String"))
397397 then @
398398 else throw(($getType(@) + " couldn't be cast to String"))
399399 }, "__"))
400- if (($t01045910709 == $t01045910709))
400+ if (($t01046510715 == $t01046510715))
401401 then {
402- let evalPutInB = $t01045910709._2
403- let evalPutInA = $t01045910709._1
402+ let evalPutInB = $t01046510715._2
403+ let evalPutInA = $t01046510715._1
404404 let lpInA = parseIntValue(evalPutInA[1])
405405 let lpInB = parseIntValue(evalPutInB[1])
406406 if ((lpInB > lpInA))
407407 then {
408408 let pmt = parseIntValue(evalPutInA[8])
409409 $Tuple5(pmtA, pmt, (pmtB - pmt), bId, lpInB)
410410 }
411411 else {
412412 let pmt = parseIntValue(evalPutInA[8])
413413 $Tuple5(pmt, pmtB, (pmtA - pmt), aId, lpInA)
414414 }
415415 }
416416 else throw("Strict value is not equal to itself.")
417417 }
418418
419419
420420 func replenishTwoTokensByType (poolAddr,pType,pmtA,aId,pmtB,bId) = {
421421 let payments = [AttachedPayment(assetIdFromStr(aId), pmtA), AttachedPayment(assetIdFromStr(bId), pmtB)]
422422 if ((pType == SF_POOL))
423423 then invoke(poolAddr, "callFunction", ["replenishWithTwoTokens", ["false", "0"]], payments)
424424 else invoke(poolAddr, "put", [1000000, false], payments)
425425 }
426426
427427
428428 func replenishOneTokenByType (poolAddr,pType,pmt,pmtId) = {
429429 let payments = [AttachedPayment(assetIdFromStr(pmtId), pmt)]
430430 if ((pType == SF_POOL))
431431 then invoke(poolAddr, "callFunction", ["replenishWithOneToken", ["0", "false", "0"]], payments)
432432 else invoke(poolAddr, "putOneTkn", [0, false], payments)
433433 }
434434
435435
436436 func stakeLP (pool,pType,shareId,amount) = {
437437 let payments = [AttachedPayment(fromBase58String(shareId), amount)]
438438 if ((pType == SF_POOL))
439439 then invoke(getSFFarmingAddr(), "lockShareTokens", [pool, 0], payments)
440440 else invoke(getWXFarmingAddr(addressFromStringValue(pool)), "stake", nil, payments)
441441 }
442442
443443
444444 func unstakeLP (pool,pType,shareId,amount) = {
445- let $t01219412551 = if ((pType == SF_POOL))
445+ let $t01220012557 = if ((pType == SF_POOL))
446446 then $Tuple3(getSFFarmingAddr(), "withdrawShareTokens", [pool, amount])
447447 else if ((pType == WX_POOL))
448448 then $Tuple3(getWXFarmingAddr(Address(fromBase58String(pool))), "unstake", [shareId, amount])
449449 else throw("Wrong pool type")
450- let farmAddr = $t01219412551._1
451- let fName = $t01219412551._2
452- let params = $t01219412551._3
450+ let farmAddr = $t01220012557._1
451+ let fName = $t01220012557._2
452+ let params = $t01220012557._3
453453 let inv = invoke(farmAddr, fName, params, nil)
454454 if ((inv == inv))
455455 then amount
456456 else throw("Strict value is not equal to itself.")
457457 }
458458
459459
460460 func calcAmountToPaySF (pool,assetIdA,assetIdB,balA,balB,amountTokenToGet,assetTokenToGet) = {
461461 let poolAddr = Address(fromBase58String(pool))
462462 let feeScale6 = 1000000
463463 let fee = getIntegerValue(poolAddr, kSFPoolFee)
464464 let amntGetNoFee = fraction(amountTokenToGet, feeScale6, (feeScale6 - fee))
465- let $t01296413252 = if ((assetTokenToGet == assetIdA))
465+ let $t01297013258 = if ((assetTokenToGet == assetIdA))
466466 then {
467467 let amountToPay = fraction(balA, amntGetNoFee, (balB - amntGetNoFee))
468468 $Tuple2(amountToPay, assetIdB)
469469 }
470470 else {
471471 let amountToPay = fraction(balB, amntGetNoFee, (balA - amntGetNoFee))
472472 $Tuple2(amountToPay, assetIdA)
473473 }
474- let amountToPay = $t01296413252._1
475- let assetToPay = $t01296413252._2
474+ let amountToPay = $t01297013258._1
475+ let assetToPay = $t01297013258._2
476476 $Tuple2(assetToPay, amountToPay)
477477 }
478478
479479
480480 func calcAmountToPayWX (pool,assetIdA,assetIdB,balA,balB,amountTokenToGet,assetTokenToGet) = {
481481 let prFee = getIntegerValue(wxSwapContract, "%s__protocolFee")
482482 let pFee = getIntegerValue(wxSwapContract, "%s__poolFee")
483483 let feeScale = toBigInt(100000000)
484- let $t01359113899 = if ((assetTokenToGet == assetIdA))
484+ let $t01359713905 = if ((assetTokenToGet == assetIdA))
485485 then {
486486 let amountToPay = fraction(balA, amountTokenToGet, (balB - amountTokenToGet))
487487 $Tuple2(amountToPay, assetIdB)
488488 }
489489 else {
490490 let amountToPay = fraction(balB, amountTokenToGet, (balA - amountTokenToGet))
491491 $Tuple2(amountToPay, assetIdA)
492492 }
493- let amountToPay = $t01359113899._1
494- let assetToPay = $t01359113899._2
493+ let amountToPay = $t01359713905._1
494+ let assetToPay = $t01359713905._2
495495 let amountToPayWithFee = toInt(fraction(toBigInt(amountToPay), feeScale, (feeScale - toBigInt((prFee + pFee)))))
496496 $Tuple2(assetToPay, amountToPayWithFee)
497497 }
498498
499499
500500 func exchangeDirectly (type,pool,assetIdA,assetIdB,balA,balB,amountTokenToGet,assetTokenToGet) = if ((type == SF_POOL))
501501 then {
502- let $t01423714359 = calcAmountToPaySF(pool, assetIdA, assetIdB, balA, balB, amountTokenToGet, assetTokenToGet)
503- let assetToPay = $t01423714359._1
504- let amountToPay = $t01423714359._2
502+ let $t01424314365 = calcAmountToPaySF(pool, assetIdA, assetIdB, balA, balB, amountTokenToGet, assetTokenToGet)
503+ let assetToPay = $t01424314365._1
504+ let amountToPay = $t01424314365._2
505505 invoke(addressFromStringValue(pool), "callFunction", ["exchange", ["1"]], [AttachedPayment(assetIdFromStr(assetToPay), amountToPay)])
506506 }
507507 else {
508- let $t01451014632 = calcAmountToPayWX(pool, assetIdA, assetIdB, balA, balB, amountTokenToGet, assetTokenToGet)
509- let assetToPay = $t01451014632._1
510- let amountToPay = $t01451014632._2
508+ let $t01451614638 = calcAmountToPayWX(pool, assetIdA, assetIdB, balA, balB, amountTokenToGet, assetTokenToGet)
509+ let assetToPay = $t01451614638._1
510+ let amountToPay = $t01451614638._2
511511 invoke(wxSwapContract, "swap", [1, assetTokenToGet, toString(this)], [AttachedPayment(assetIdFromStr(assetToPay), amountToPay)])
512512 }
513513
514514
515515 func calcReplenishLPVirt (pType,pool,pmtA,aId,pmtB,bId,balA,balB) = {
516516 let poolAddr = addressFromStringValue(pool)
517517 if ((pType == SF_POOL))
518518 then {
519519 let inv = {
520520 let @ = invoke(poolAddr, "callFunction", ["calcLPReplenishDiffPropREADONLY", [toString(pmtA), toString(pmtB), "0"]], nil)
521521 if ($isInstanceOf(@, "List[Any]"))
522522 then @
523523 else throw(($getType(@) + " couldn't be cast to List[Any]"))
524524 }
525525 if ((inv == inv))
526526 then $Tuple2({
527527 let @ = inv[0]
528528 if ($isInstanceOf(@, "Int"))
529529 then @
530530 else throw(($getType(@) + " couldn't be cast to Int"))
531531 }, {
532532 let @ = inv[1]
533533 if ($isInstanceOf(@, "Int"))
534534 then @
535535 else throw(($getType(@) + " couldn't be cast to Int"))
536536 })
537537 else throw("Strict value is not equal to itself.")
538538 }
539539 else if ((pType == WX_POOL))
540540 then {
541- let $t01522015561 = if (if ((pmtA > 0))
541+ let $t01522615567 = if (if ((pmtA > 0))
542542 then (pmtB > 0)
543543 else false)
544544 then {
545- let $t01530115427 = calcReplenishByTwoTokens(pType, poolAddr, pmtA, aId, pmtB, bId, balA, balB)
546- let pmtInA = $t01530115427._1
547- let pmtInB = $t01530115427._2
548- let change = $t01530115427._3
549- let changeId = $t01530115427._4
550- let lpAmount = $t01530115427._5
545+ let $t01530715433 = calcReplenishByTwoTokens(pType, poolAddr, pmtA, aId, pmtB, bId, balA, balB)
546+ let pmtInA = $t01530715433._1
547+ let pmtInB = $t01530715433._2
548+ let change = $t01530715433._3
549+ let changeId = $t01530715433._4
550+ let lpAmount = $t01530715433._5
551551 $Tuple3(change, changeId, lpAmount)
552552 }
553553 else if ((pmtA > 0))
554554 then $Tuple3(pmtA, aId, 0)
555555 else $Tuple3(pmtB, bId, 0)
556- let change = $t01522015561._1
557- let changeId = $t01522015561._2
558- let lpTwo = $t01522015561._3
559- let $t01556815784 = if ((change > 0))
556+ let change = $t01522615567._1
557+ let changeId = $t01522615567._2
558+ let lpTwo = $t01522615567._3
559+ let $t01557415790 = if ((change > 0))
560560 then {
561561 let inv = {
562562 let @ = invoke(poolAddr, "putOneTknREADONLY", [changeId, change], nil)
563563 if ($isInstanceOf(@, "(Int, Int, Int)"))
564564 then @
565565 else throw(($getType(@) + " couldn't be cast to (Int, Int, Int)"))
566566 }
567567 if ((inv == inv))
568568 then $Tuple2(inv._1, inv._3)
569569 else throw("Strict value is not equal to itself.")
570570 }
571571 else $Tuple2(0, 0)
572- let lpOne = $t01556815784._1
573- let loss = $t01556815784._2
572+ let lpOne = $t01557415790._1
573+ let loss = $t01557415790._2
574574 $Tuple2((lpTwo + lpOne), loss)
575575 }
576576 else throw("Wrong pool type")
577577 }
578578
579579
580580 func calcWithdrawLPVirt (pType,pool,lpAmount,shareId,aId,bId,balA,balB,borrowAmount,borrowAssetId) = {
581581 let poolAddr = addressFromStringValue(pool)
582- let $t01607816578 = if ((pType == SF_POOL))
582+ let $t01608416584 = if ((pType == SF_POOL))
583583 then {
584584 let inv = {
585585 let @ = invoke(poolAddr, "callFunction", ["withdrawREADONLY", [toString(lpAmount), toString(balA), toString(balB)]], nil)
586586 if ($isInstanceOf(@, "List[Any]"))
587587 then @
588588 else throw(($getType(@) + " couldn't be cast to List[Any]"))
589589 }
590590 if ((inv == inv))
591591 then $Tuple2({
592592 let @ = inv[0]
593593 if ($isInstanceOf(@, "Int"))
594594 then @
595595 else throw(($getType(@) + " couldn't be cast to Int"))
596596 }, {
597597 let @ = inv[1]
598598 if ($isInstanceOf(@, "Int"))
599599 then @
600600 else throw(($getType(@) + " couldn't be cast to Int"))
601601 })
602602 else throw("Strict value is not equal to itself.")
603603 }
604604 else if ((pType == WX_POOL))
605605 then {
606606 let get = split({
607607 let @ = invoke(poolAddr, "evaluateGetREADONLY", [shareId, lpAmount], nil)
608608 if ($isInstanceOf(@, "String"))
609609 then @
610610 else throw(($getType(@) + " couldn't be cast to String"))
611611 }, "__")
612612 if ((get == get))
613613 then $Tuple2(parseIntValue(get[1]), parseIntValue(get[2]))
614614 else throw("Strict value is not equal to itself.")
615615 }
616616 else throw("Wrong pool type")
617- let getAmountA = $t01607816578._1
618- let getAmountB = $t01607816578._2
617+ let getAmountA = $t01608416584._1
618+ let getAmountB = $t01608416584._2
619619 if ((borrowAmount > 0))
620620 then {
621621 let amountToGetEx = if (if ((borrowAssetId == aId))
622622 then (borrowAmount > getAmountA)
623623 else false)
624624 then (borrowAmount - getAmountA)
625625 else if (if ((borrowAssetId == bId))
626626 then (borrowAmount > getAmountB)
627627 else false)
628628 then (borrowAmount - getAmountB)
629629 else 0
630- let $t01685617159 = if ((amountToGetEx > 0))
630+ let $t01686217165 = if ((amountToGetEx > 0))
631631 then if ((pType == SF_POOL))
632632 then calcAmountToPaySF(pool, aId, bId, balA, balB, amountToGetEx, borrowAssetId)
633633 else calcAmountToPayWX(pool, aId, bId, balA, balB, amountToGetEx, borrowAssetId)
634634 else $Tuple2("", 0)
635- let assetToPay = $t01685617159._1
636- let amountToPay = $t01685617159._2
635+ let assetToPay = $t01686217165._1
636+ let amountToPay = $t01686217165._2
637637 if ((borrowAssetId == aId))
638638 then $Tuple2(((getAmountA + amountToGetEx) - borrowAmount), (getAmountB - amountToPay))
639639 else $Tuple2((getAmountA - amountToPay), ((getAmountB + amountToGetEx) - borrowAmount))
640640 }
641641 else $Tuple2(getAmountA, getAmountB)
642642 }
643643
644644
645645 func claimFarmed (type,pool) = if ((type == SF_POOL))
646646 then {
647647 let balBefore = accountBalance(SWOPID)
648648 if ((balBefore == balBefore))
649649 then {
650650 let inv = invoke(getSFFarmingAddr(), "claim", [pool], nil)
651651 if ((inv == inv))
652652 then {
653653 let balAfter = accountBalance(SWOPID)
654654 $Tuple2((balAfter - balBefore), SWOPID)
655655 }
656656 else throw("Strict value is not equal to itself.")
657657 }
658658 else throw("Strict value is not equal to itself.")
659659 }
660660 else if ((type == WX_POOL))
661661 then {
662662 let balBefore = accountBalance(WXID)
663663 if ((balBefore == balBefore))
664664 then {
665665 let inv = invoke(getWXFarmingAddr(Address(fromBase58String(pool))), "claimWX", [pool], nil)
666666 if ((inv == inv))
667667 then {
668668 let balAfter = accountBalance(WXID)
669669 $Tuple2((balAfter - balBefore), WXID)
670670 }
671671 else throw("Strict value is not equal to itself.")
672672 }
673673 else throw("Strict value is not equal to itself.")
674674 }
675675 else throw("Wrong pool type")
676676
677677
678678 func replenishByType (pType,pool,feeType,pmtA,aId,pmtB,bId,balA,balB,LPId) = {
679679 let lpBalanceBefore = accountBalance(fromBase58String(LPId))
680680 if ((lpBalanceBefore == lpBalanceBefore))
681681 then {
682682 let poolAddr = addressFromStringValue(pool)
683- let $t01835618772 = if (if ((pmtA > 0))
683+ let $t01836218778 = if (if ((pmtA > 0))
684684 then (pmtB > 0)
685685 else false)
686686 then {
687- let $t01842218538 = calcReplenishByTwoTokens(pType, poolAddr, pmtA, aId, pmtB, bId, balA, balB)
688- let pmtInA = $t01842218538._1
689- let pmtInB = $t01842218538._2
690- let change = $t01842218538._3
691- let changeId = $t01842218538._4
687+ let $t01842818544 = calcReplenishByTwoTokens(pType, poolAddr, pmtA, aId, pmtB, bId, balA, balB)
688+ let pmtInA = $t01842818544._1
689+ let pmtInB = $t01842818544._2
690+ let change = $t01842818544._3
691+ let changeId = $t01842818544._4
692692 let inv = replenishTwoTokensByType(poolAddr, pType, pmtInA, aId, pmtInB, bId)
693693 if ((inv == inv))
694694 then $Tuple2(change, changeId)
695695 else throw("Strict value is not equal to itself.")
696696 }
697697 else if ((pmtA > 0))
698698 then $Tuple2(pmtA, aId)
699699 else if ((pmtB > 0))
700700 then $Tuple2(pmtB, bId)
701701 else throw("pmts must be > 0")
702- let change = $t01835618772._1
703- let changeId = $t01835618772._2
702+ let change = $t01836218778._1
703+ let changeId = $t01836218778._2
704704 let inv = if ((change > 0))
705705 then replenishOneTokenByType(poolAddr, pType, change, changeId)
706706 else nil
707707 if ((inv == inv))
708708 then {
709709 let lpBalanceAfter = accountBalance(fromBase58String(LPId))
710710 let totalStaked = (lpBalanceAfter - lpBalanceBefore)
711711 let axlyFeeAmount = fraction(totalStaked, getAxlyFee(pool, feeType), FEE_SCALE6)
712712 let userShareForStake = (totalStaked - axlyFeeAmount)
713713 if ((0 >= userShareForStake))
714714 then throw("amount of staked sharetokens must be > 0")
715715 else {
716716 let invLP = stakeLP(pool, pType, LPId, userShareForStake)
717717 if ((invLP == invLP))
718718 then $Tuple2(userShareForStake, axlyFeeAmount)
719719 else throw("Strict value is not equal to itself.")
720720 }
721721 }
722722 else throw("Strict value is not equal to itself.")
723723 }
724724 else throw("Strict value is not equal to itself.")
725725 }
726726
727727
728728 func replenishEntries (pool,user,stakedAmount,axlyFeeAmount,posNum,shareId,type,withLoan) = {
729729 let totalAmount = getPoolTotalShare(pool)
730730 let totalAmountLoan = getPoolTotalShareWithLoan(pool)
731- let $t01963019868 = if (withLoan)
731+ let $t01963619874 = if (withLoan)
732732 then $Tuple2(getIntegerValue(this, (pool + kPoolInterestLoan)), (totalAmountLoan + stakedAmount))
733733 else $Tuple2(getIntegerValue(this, (pool + kPoolInterestNoLoan)), totalAmountLoan)
734- let curPoolInterest = $t01963019868._1
735- let totalStakedWithLoan = $t01963019868._2
734+ let curPoolInterest = $t01963619874._1
735+ let totalStakedWithLoan = $t01963619874._2
736736 [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))]
737737 }
738738
739739
740740 func exchangeKeeper (toToken,pmtAmount,pmtAsset,amountsIn,addresses,assetsToReceive,estReceived,slippageTolerance,minReceived,options) = {
741741 let tokenBalanceBefore = accountBalance(assetIdFromStr(toToken))
742742 if ((tokenBalanceBefore == tokenBalanceBefore))
743743 then {
744744 let inv = invoke(exContract, "swap", [amountsIn, addresses, assetsToReceive, estReceived, slippageTolerance, minReceived, options], [AttachedPayment(pmtAsset, pmtAmount)])
745745 if ((inv == inv))
746746 then (accountBalance(assetIdFromStr(toToken)) - tokenBalanceBefore)
747747 else throw("Strict value is not equal to itself.")
748748 }
749749 else throw("Strict value is not equal to itself.")
750750 }
751751
752752
753753 func exchangePuzzle (toToken,pmtAmount,pmtAsset,routesStr,minToReceive,options) = {
754754 let tokenBalanceBefore = accountBalance(assetIdFromStr(toToken))
755755 if ((tokenBalanceBefore == tokenBalanceBefore))
756756 then {
757757 let inv = invoke(exContract, "puzzleSwap", [routesStr, minToReceive, options], [AttachedPayment(pmtAsset, pmtAmount)])
758758 if ((inv == inv))
759759 then (accountBalance(assetIdFromStr(toToken)) - tokenBalanceBefore)
760760 else throw("Strict value is not equal to itself.")
761761 }
762762 else throw("Strict value is not equal to itself.")
763763 }
764764
765765
766766 func exchangeSwopFi (toToken,pmtAmount,pmtAsset,exchangers,exchangersType,args1,args2,routingAssetsKeys,minAmountToReceive,options) = {
767767 let tokenBalanceBefore = accountBalance(assetIdFromStr(toToken))
768768 if ((tokenBalanceBefore == tokenBalanceBefore))
769769 then {
770770 let inv = invoke(exContract, "swopfiSwap", [exchangers, exchangersType, args1, args2, routingAssetsKeys, minAmountToReceive, options], [AttachedPayment(pmtAsset, pmtAmount)])
771771 if ((inv == inv))
772772 then (accountBalance(assetIdFromStr(toToken)) - tokenBalanceBefore)
773773 else throw("Strict value is not equal to itself.")
774774 }
775775 else throw("Strict value is not equal to itself.")
776776 }
777777
778778
779779 func capitalize (pool,pType,tokenId,tokenAmount) = {
780780 let poolAddr = Address(fromBase58String(pool))
781- let $t02221922285 = getPoolData(poolAddr, pType)
782- let AId = $t02221922285._1
783- let BId = $t02221922285._2
784- let balA = $t02221922285._3
785- let balB = $t02221922285._4
786- let shareId = $t02221922285._5
781+ let $t02222522291 = getPoolData(poolAddr, pType)
782+ let AId = $t02222522291._1
783+ let BId = $t02222522291._2
784+ let balA = $t02222522291._3
785+ let balB = $t02222522291._4
786+ let shareId = $t02222522291._5
787787 if (if ((tokenId != AId))
788788 then (tokenId != BId)
789789 else false)
790790 then throw("Wrong asset")
791791 else {
792- let $t02237022450 = if ((tokenId == AId))
792+ let $t02237622456 = if ((tokenId == AId))
793793 then $Tuple2(tokenAmount, 0)
794794 else $Tuple2(0, tokenAmount)
795- let pmtA = $t02237022450._1
796- let pmtB = $t02237022450._2
797- let $t02245322557 = replenishByType(pType, pool, NO_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId)
798- let stakedAmount = $t02245322557._1
799- let nf = $t02245322557._2
795+ let pmtA = $t02237622456._1
796+ let pmtB = $t02237622456._2
797+ let $t02245922563 = replenishByType(pType, pool, NO_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId)
798+ let stakedAmount = $t02245922563._1
799+ let nf = $t02245922563._2
800800 let curPoolInterestLoan = valueOrElse(getInteger(this, (pool + kPoolInterestLoan)), 0)
801801 let curPoolInterestNoLoan = valueOrElse(getInteger(this, (pool + kPoolInterestNoLoan)), 0)
802802 let totalShareAmount = getPoolTotalShare(pool)
803803 let totalShareAmountWithLoan = getPoolTotalShareWithLoan(pool)
804804 let loanPercent = fraction(totalShareAmountWithLoan, SCALE8, totalShareAmount)
805805 let stakedLoan = fraction(stakedAmount, loanPercent, SCALE8)
806806 let stakedNoLoan = (stakedAmount - stakedLoan)
807807 let newInterestLoan = if ((totalShareAmountWithLoan > 0))
808808 then (curPoolInterestLoan + fraction(stakedLoan, SCALE10, totalShareAmountWithLoan))
809809 else 0
810810 let newInterestNoLoan = if (((totalShareAmount - totalShareAmountWithLoan) > 0))
811811 then (curPoolInterestNoLoan + fraction(stakedNoLoan, SCALE10, (totalShareAmount - totalShareAmountWithLoan)))
812812 else 0
813813 let axlyFeeLoan = fraction(stakedLoan, getAxlyFee(pool, CAP_FEE_LOAN), FEE_SCALE6)
814814 let axlyFeeNoLoan = fraction(stakedNoLoan, getAxlyFee(pool, CAP_FEE_NO_LOAN), FEE_SCALE6)
815815 let axlyFee = unstakeLP(pool, pType, shareId, (axlyFeeLoan + axlyFeeNoLoan))
816816 if ((axlyFee == axlyFee))
817817 then ([IntegerEntry((pool + kPoolInterestLoan), newInterestLoan), IntegerEntry((pool + kPoolInterestNoLoan), newInterestNoLoan), IntegerEntry((pool + kPoolTotal), ((totalShareAmount + stakedAmount) - axlyFee)), IntegerEntry((pool + kPoolTotalLoan), ((totalShareAmountWithLoan + stakedLoan) - axlyFeeLoan)), ScriptTransfer(moneyBox, (axlyFeeLoan + axlyFeeNoLoan), fromBase58String(shareId))] ++ getCursEntries(AId, BId, shareId))
818818 else throw("Strict value is not equal to itself.")
819819 }
820820 }
821821
822822
823823 func withdrawAmountCalc (pool,userCanWithdraw,debt,borrowAsset) = {
824824 let poolAddr = Address(fromBase58String(pool))
825825 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Unknown pool")
826- let $t02432524401 = getPoolData(poolAddr, pType)
827- let assetIdA = $t02432524401._1
828- let assetIdB = $t02432524401._2
829- let balA = $t02432524401._3
830- let balB = $t02432524401._4
831- let shareId = $t02432524401._5
826+ let $t02433124407 = getPoolData(poolAddr, pType)
827+ let assetIdA = $t02433124407._1
828+ let assetIdB = $t02433124407._2
829+ let balA = $t02433124407._3
830+ let balB = $t02433124407._4
831+ let shareId = $t02433124407._5
832832 let cBalABefore = accountBalance(assetIdFromStr(assetIdA))
833833 if ((cBalABefore == cBalABefore))
834834 then {
835835 let cBalBBefore = accountBalance(assetIdFromStr(assetIdB))
836836 if ((cBalBBefore == cBalBBefore))
837837 then {
838838 let inv = if ((pType == SF_POOL))
839839 then invoke(poolAddr, "callFunction", ["withdraw", [toString(userCanWithdraw)]], nil)
840840 else {
841841 let inv = unstakeLP(pool, pType, shareId, userCanWithdraw)
842842 if ((inv == inv))
843843 then invoke(poolAddr, "get", nil, [AttachedPayment(assetIdFromStr(shareId), userCanWithdraw)])
844844 else throw("Strict value is not equal to itself.")
845845 }
846846 if ((inv == inv))
847847 then {
848848 let cBalAAfter = accountBalance(assetIdFromStr(assetIdA))
849849 let cBalBAfter = accountBalance(assetIdFromStr(assetIdB))
850- let $t02496425053 = $Tuple2((cBalAAfter - cBalABefore), (cBalBAfter - cBalBBefore))
851- let tokensAmountA = $t02496425053._1
852- let tokensAmountB = $t02496425053._2
853- let $t02505625752 = if ((debt > 0))
850+ let $t02497025059 = $Tuple2((cBalAAfter - cBalABefore), (cBalBAfter - cBalBBefore))
851+ let tokensAmountA = $t02497025059._1
852+ let tokensAmountB = $t02497025059._2
853+ let $t02506225758 = if ((debt > 0))
854854 then {
855855 let amountToGetEx = if (if ((borrowAsset == assetIdA))
856856 then (debt > tokensAmountA)
857857 else false)
858858 then (debt - tokensAmountA)
859859 else if (if ((borrowAsset == assetIdB))
860860 then (debt > tokensAmountB)
861861 else false)
862862 then (debt - tokensAmountB)
863863 else 0
864864 let exInv = if ((amountToGetEx > 0))
865865 then exchangeDirectly(pType, pool, assetIdA, assetIdB, balA, balB, amountToGetEx, borrowAsset)
866866 else 0
867867 if ((exInv == exInv))
868868 then {
869869 let cBalAAfterRepay = accountBalance(assetIdFromStr(assetIdA))
870870 let cBalBAfterRepay = accountBalance(assetIdFromStr(assetIdB))
871871 $Tuple2((cBalAAfterRepay - cBalABefore), (cBalBAfterRepay - cBalBBefore))
872872 }
873873 else throw("Strict value is not equal to itself.")
874874 }
875875 else $Tuple2(tokensAmountA, tokensAmountB)
876- let toUserAmountA = $t02505625752._1
877- let toUserAmountB = $t02505625752._2
876+ let toUserAmountA = $t02506225758._1
877+ let toUserAmountB = $t02506225758._2
878878 $Tuple7(toUserAmountA, assetIdA, toUserAmountB, assetIdB, cBalAAfter, cBalBAfter, shareId)
879879 }
880880 else throw("Strict value is not equal to itself.")
881881 }
882882 else throw("Strict value is not equal to itself.")
883883 }
884884 else throw("Strict value is not equal to itself.")
885885 }
886886
887887
888888 func userCanWithdrawShareCalc (user,pool,posId,borrowed) = {
889889 let pAmount = valueOrErrorMessage(getInteger(this, (((((pool + "_") + user) + "_") + posId) + kUserPosition)), "Unknown position")
890890 let userInterest = getIntegerValue(this, (((((pool + "_") + user) + "_") + posId) + kUserPositionInterest))
891891 let poolInterest = if (borrowed)
892892 then getIntegerValue(this, (pool + kPoolInterestLoan))
893893 else getIntegerValue(this, (pool + kPoolInterestNoLoan))
894894 (pAmount + fraction(pAmount, (poolInterest - userInterest), SCALE10))
895895 }
896896
897897
898898 func withdrawToUser (user,pool,posId,stopLoss) = {
899899 let pAmount = valueOrErrorMessage(getInteger(this, (((((pool + "_") + user) + "_") + posId) + kUserPosition)), "Unknown position")
900900 let userInterest = getIntegerValue(this, (((((pool + "_") + user) + "_") + posId) + kUserPositionInterest))
901901 let borrowAmount = valueOrElse(getInteger(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAmount)), 0)
902902 let userCanWithdraw = userCanWithdrawShareCalc(user, pool, posId, (borrowAmount > 0))
903903 let poolTotalShare = getPoolTotalShare(pool)
904904 let userAddr = Address(fromBase58String(user))
905905 let borrowAsset = valueOrElse(getString(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAssetId)), "")
906906 let debt = if ((borrowAmount > 0))
907907 then {
908908 let @ = invoke(getLendSrvAddr(), "getAssetDebt", [false, ((user + "_") + posId), borrowAsset], nil)
909909 if ($isInstanceOf(@, "Int"))
910910 then @
911911 else throw(($getType(@) + " couldn't be cast to Int"))
912912 }
913913 else 0
914- let $t02725127404 = withdrawAmountCalc(pool, userCanWithdraw, debt, borrowAsset)
915- if (($t02725127404 == $t02725127404))
914+ let $t02725727410 = withdrawAmountCalc(pool, userCanWithdraw, debt, borrowAsset)
915+ if (($t02725727410 == $t02725727410))
916916 then {
917- let shareId = $t02725127404._7
918- let cBalBAfter = $t02725127404._6
919- let cBalAAfter = $t02725127404._5
920- let assetIdB = $t02725127404._4
921- let toUserAmountB = $t02725127404._3
922- let assetIdA = $t02725127404._2
923- let toUserAmountA = $t02725127404._1
917+ let shareId = $t02725727410._7
918+ let cBalBAfter = $t02725727410._6
919+ let cBalAAfter = $t02725727410._5
920+ let assetIdB = $t02725727410._4
921+ let toUserAmountB = $t02725727410._3
922+ let assetIdA = $t02725727410._2
923+ let toUserAmountA = $t02725727410._1
924924 let closeDbtInv = if ((debt > 0))
925925 then invoke(getLendSrvAddr(), "repayFor", [((user + "_") + posId)], [AttachedPayment(assetIdFromStr(borrowAsset), debt)])
926926 else 0
927927 if ((closeDbtInv == closeDbtInv))
928928 then ([DeleteEntry((((((pool + "_") + user) + "_") + posId) + kUserPosition)), DeleteEntry((((((pool + "_") + user) + "_") + posId) + kUserPositionInterest)), IntegerEntry((pool + kPoolTotal), (poolTotalShare - userCanWithdraw)), ScriptTransfer(userAddr, toUserAmountA, assetIdFromStr(assetIdA)), ScriptTransfer(userAddr, toUserAmountB, assetIdFromStr(assetIdB))] ++ getCursEntries(assetIdA, assetIdB, shareId))
929929 else throw("Strict value is not equal to itself.")
930930 }
931931 else throw("Strict value is not equal to itself.")
932932 }
933933
934934
935935 func parseRequest (requestId) = {
936936 let request = split(valueOrErrorMessage(getString(this, (requestId + kRequestId)), ("No request with id " + requestId)), ",")
937937 let user = request[0]
938938 let pool = request[1]
939939 let pmtA = parseIntValue(request[2])
940940 let AId = request[3]
941941 let pmtB = parseIntValue(request[4])
942942 let BId = request[5]
943943 let balA = parseIntValue(request[6])
944944 let balB = parseIntValue(request[7])
945945 let shareId = request[8]
946946 let bwAsset = request[9]
947947 let bwAmount = parseIntValue(request[10])
948948 $Tuple11(user, pool, pmtA, AId, pmtB, BId, balA, balB, shareId, bwAsset, bwAmount)
949949 }
950950
951951
952952 func calcBorrowAmount (pmtA,pmtB,aId,bId,leverage,borrowId) = {
953953 let dPriceA = ( let @ = invoke(priceOracleAddr, "getTWAP60", [aId, false], nil)
954954 if ($isInstanceOf(@, "(Int, Int)"))
955955 then @
956956 else throw(($getType(@) + " couldn't be cast to (Int, Int)")))._2
957957 let dPriceB = ( let @ = invoke(priceOracleAddr, "getTWAP60", [bId, false], nil)
958958 if ($isInstanceOf(@, "(Int, Int)"))
959959 then @
960960 else throw(($getType(@) + " couldn't be cast to (Int, Int)")))._2
961961 let decPrA = pow(10, 0, getAssetDecimals(aId), 0, 0, DOWN)
962962 let decPrB = pow(10, 0, getAssetDecimals(bId), 0, 0, DOWN)
963963 let paydInDollar = (fraction(dPriceA, pmtA, decPrA) + fraction(dPriceB, pmtB, decPrB))
964- let $t02909029187 = if ((borrowId == aId))
964+ let $t02909629193 = if ((borrowId == aId))
965965 then $Tuple2(dPriceA, decPrA)
966966 else $Tuple2(dPriceB, decPrB)
967- let borrowPrice = $t02909029187._1
968- let borrowDecPr = $t02909029187._2
967+ let borrowPrice = $t02909629193._1
968+ let borrowDecPr = $t02909629193._2
969969 fraction(fraction(paydInDollar, (leverage - 100), 100), borrowDecPr, borrowPrice)
970970 }
971971
972972
973973 @Callable(i)
974974 func calcPriceImpactEVALONLY (pool,leverage,borrowId,pmtA,pmtB) = if (if ((100 > leverage))
975975 then true
976976 else (leverage > 300))
977977 then throw("Leverage can't be <100 and >300")
978978 else {
979979 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
980- let $t02960529695 = getPoolData(Address(fromBase58String(pool)), pType)
981- let AId = $t02960529695._1
982- let BId = $t02960529695._2
983- let balA = $t02960529695._3
984- let balB = $t02960529695._4
985- let shareId = $t02960529695._5
980+ let $t02961129701 = getPoolData(Address(fromBase58String(pool)), pType)
981+ let AId = $t02961129701._1
982+ let BId = $t02961129701._2
983+ let balA = $t02961129701._3
984+ let balB = $t02961129701._4
985+ let shareId = $t02961129701._5
986986 let borrowAmount = if ((leverage > 100))
987987 then calcBorrowAmount(pmtA, pmtB, AId, BId, leverage, borrowId)
988988 else 0
989- let $t02983029937 = if ((borrowId == AId))
989+ let $t02983629943 = if ((borrowId == AId))
990990 then $Tuple2((pmtA + borrowAmount), pmtB)
991991 else $Tuple2(pmtA, (pmtB + borrowAmount))
992- let payInA = $t02983029937._1
993- let payInB = $t02983029937._2
994- let $t02994030033 = calcReplenishLPVirt(pType, pool, payInA, AId, payInB, BId, balA, balB)
995- let lpAmount = $t02994030033._1
996- let loss = $t02994030033._2
992+ let payInA = $t02983629943._1
993+ let payInB = $t02983629943._2
994+ let $t02994630039 = calcReplenishLPVirt(pType, pool, payInA, AId, payInB, BId, balA, balB)
995+ let lpAmount = $t02994630039._1
996+ let loss = $t02994630039._2
997997 let impactMod = if ((0 > loss))
998998 then (loss * -1)
999999 else loss
10001000 $Tuple2(nil, [impactMod])
10011001 }
10021002
10031003
10041004
10051005 @Callable(i)
10061006 func getShareAssetPriceREADONLY (shareId) = {
10071007 let sharePrices = getSharePrice(shareId)
10081008 $Tuple2(nil, sharePrices)
10091009 }
10101010
10111011
10121012
10131013 @Callable(i)
10141014 func getUserPositionShareAmountREADONLY (user,posNum) = {
10151015 let pool = valueOrErrorMessage(getString(this, (((user + "_") + posNum) + kUserPositionPool)), "Unknown position")
10161016 let borrowAmount = getIntegerValue(this, (((((pool + "_") + user) + "_") + posNum) + kUserBorrowAmount))
10171017 let userCanWithdraw = userCanWithdrawShareCalc(user, pool, posNum, (borrowAmount > 0))
10181018 $Tuple2(nil, userCanWithdraw)
10191019 }
10201020
10211021
10221022
10231023 @Callable(i)
10241024 func getUserPositionInDollarsREADONLY (user,pools,posNum) = {
10251025 func userPos (a,pool) = {
1026- let $t03084630880 = a
1027- let totalPos = $t03084630880._1
1028- let posDebt = $t03084630880._2
1029- let index = $t03084630880._3
1026+ let $t03085230886 = a
1027+ let totalPos = $t03085230886._1
1028+ let posDebt = $t03085230886._2
1029+ let index = $t03085230886._3
10301030 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
1031- let $t03097231062 = getPoolData(Address(fromBase58String(pool)), pType)
1032- let AId = $t03097231062._1
1033- let BId = $t03097231062._2
1034- let balA = $t03097231062._3
1035- let balB = $t03097231062._4
1036- let shareId = $t03097231062._5
1031+ let $t03097831068 = getPoolData(Address(fromBase58String(pool)), pType)
1032+ let AId = $t03097831068._1
1033+ let BId = $t03097831068._2
1034+ let balA = $t03097831068._3
1035+ let balB = $t03097831068._4
1036+ let shareId = $t03097831068._5
10371037 let borrowAmount = valueOrElse(getInteger(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserBorrowAmount)), 0)
10381038 let userCanWithdraw = userCanWithdrawShareCalc(user, pool, posNum[index], (borrowAmount > 0))
10391039 let sharePrices = getSharePrice(shareId)
10401040 let decPrShare = pow(10, 0, getAssetDecimals(shareId), 0, 0, DOWN)
10411041 let shareD = fraction(userCanWithdraw, sharePrices, decPrShare)
10421042 if ((borrowAmount == 0))
10431043 then $Tuple3((totalPos :+ shareD), (posDebt :+ 0), (index + 1))
10441044 else {
10451045 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posNum[index]) + kUserBorrowAssetId))
10461046 let debt = {
10471047 let @ = invoke(getLendSrvAddr(), "getAssetDebt", [false, ((user + "_") + posNum[index]), borrowAsset], nil)
10481048 if ($isInstanceOf(@, "Int"))
10491049 then @
10501050 else throw(($getType(@) + " couldn't be cast to Int"))
10511051 }
10521052 let borrowAssetPrice = ( let @ = invoke(priceOracleAddr, "getTWAP60", [borrowAsset, false], nil)
10531053 if ($isInstanceOf(@, "(Int, Int)"))
10541054 then @
10551055 else throw(($getType(@) + " couldn't be cast to (Int, Int)")))._1
10561056 let decPrBorrowId = pow(10, 0, getAssetDecimals(borrowAsset), 0, 0, DOWN)
10571057 let debtD = fraction(debt, borrowAssetPrice, decPrBorrowId)
10581058 $Tuple3((totalPos :+ shareD), (posDebt :+ debtD), (index + 1))
10591059 }
10601060 }
10611061
1062- let $t03210532160 = {
1062+ let $t03211132166 = {
10631063 let $l = pools
10641064 let $s = size($l)
10651065 let $acc0 = $Tuple3(nil, nil, 0)
10661066 func $f0_1 ($a,$i) = if (($i >= $s))
10671067 then $a
10681068 else userPos($a, $l[$i])
10691069
10701070 func $f0_2 ($a,$i) = if (($i >= $s))
10711071 then $a
10721072 else throw("List size exceeds 20")
10731073
10741074 $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)
10751075 }
1076- let pos = $t03210532160._1
1077- let debt = $t03210532160._2
1076+ let pos = $t03211132166._1
1077+ let debt = $t03211132166._2
10781078 $Tuple2(nil, $Tuple2(pos, debt))
10791079 }
10801080
10811081
10821082
10831083 @Callable(i)
10841084 func replenish (pool,leverage,borrowId) = if (if ((100 > leverage))
10851085 then true
10861086 else (leverage > 300))
10871087 then throw("Leverage can't be <100 and >300")
10881088 else {
10891089 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
1090- let $t03248332573 = getPoolData(Address(fromBase58String(pool)), pType)
1091- let AId = $t03248332573._1
1092- let BId = $t03248332573._2
1093- let balA = $t03248332573._3
1094- let balB = $t03248332573._4
1095- let shareId = $t03248332573._5
1096- let $t03257633213 = if ((size(i.payments) == 2))
1090+ let $t03248932579 = getPoolData(Address(fromBase58String(pool)), pType)
1091+ let AId = $t03248932579._1
1092+ let BId = $t03248932579._2
1093+ let balA = $t03248932579._3
1094+ let balB = $t03248932579._4
1095+ let shareId = $t03248932579._5
1096+ let $t03258233219 = if ((size(i.payments) == 2))
10971097 then if ((assetIdToStr(i.payments[0].assetId) != AId))
10981098 then throw("Wrong payment asset A")
10991099 else if ((assetIdToStr(i.payments[1].assetId) != BId))
11001100 then throw("Wrong payment asset B")
11011101 else $Tuple4(i.payments[0].amount, AId, i.payments[1].amount, BId)
11021102 else if ((size(i.payments) == 1))
11031103 then if ((assetIdToStr(i.payments[0].assetId) == AId))
11041104 then $Tuple4(i.payments[0].amount, AId, 0, BId)
11051105 else if ((assetIdToStr(i.payments[0].assetId) == BId))
11061106 then $Tuple4(0, AId, i.payments[0].amount, BId)
11071107 else throw("Wrong payment")
11081108 else throw("One or two payments expected")
1109- let pmtA = $t03257633213._1
1110- let pmtAssetA = $t03257633213._2
1111- let pmtB = $t03257633213._3
1112- let pmtAssetB = $t03257633213._4
1109+ let pmtA = $t03258233219._1
1110+ let pmtAssetA = $t03258233219._2
1111+ let pmtB = $t03258233219._3
1112+ let pmtAssetB = $t03258233219._4
11131113 let newPosNum = getNewUserPositionNumber(toString(i.caller))
11141114 if ((leverage > 100))
11151115 then {
11161116 let borrowAmount = calcBorrowAmount(pmtA, pmtB, pmtAssetA, pmtAssetB, leverage, borrowId)
11171117 let request = makeString([toString(i.caller), pool, toString(pmtA), pmtAssetA, toString(pmtB), pmtAssetB, toString(balA), toString(balB), shareId, borrowId, toString(borrowAmount)], ",")
11181118 let newRequestId = {
11191119 let @ = invoke(this, "createNewRequest", [request], nil)
11201120 if ($isInstanceOf(@, "Int"))
11211121 then @
11221122 else throw(($getType(@) + " couldn't be cast to Int"))
11231123 }
11241124 if ((newRequestId == newRequestId))
11251125 then {
11261126 let args = [((toString(i.caller) + "_") + toString(newPosNum)), shareId, borrowId, borrowAmount, toString(this), "replenishFromLand", toString(valueOrErrorMessage(newRequestId, "Can't create new request"))]
11271127 let inv = reentrantInvoke(getLendSrvAddr(), "flashPosition", args, nil)
11281128 if ((inv == inv))
11291129 then nil
11301130 else throw("Strict value is not equal to itself.")
11311131 }
11321132 else throw("Strict value is not equal to itself.")
11331133 }
11341134 else {
1135- let $t03414134253 = replenishByType(pType, pool, NO_LOAN_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId)
1136- let userStaked = $t03414134253._1
1137- let axlyFee = $t03414134253._2
1135+ let $t03414734259 = replenishByType(pType, pool, NO_LOAN_FEE, pmtA, AId, pmtB, BId, balA, balB, shareId)
1136+ let userStaked = $t03414734259._1
1137+ let axlyFee = $t03414734259._2
11381138 (replenishEntries(pool, toString(i.caller), userStaked, axlyFee, newPosNum, shareId, pType, false) ++ getCursEntries(AId, BId, shareId))
11391139 }
11401140 }
11411141
11421142
11431143
11441144 @Callable(i)
11451145 func withdraw (pool,posId) = withdrawToUser(toString(i.caller), pool, toString(posId), false)
11461146
11471147
11481148
11491149 @Callable(i)
11501150 func createUpdateStopLoss (posId,poolId,assetId,price) = {
11511151 let tokenOraclePrice = ( let @ = invoke(priceOracleAddr, "getTWAP60", [assetId, false], nil)
11521152 if ($isInstanceOf(@, "(Int, Int)"))
11531153 then @
11541154 else throw(($getType(@) + " couldn't be cast to (Int, Int)")))._1
11551155 if (!(isDefined(getInteger(this, (((((poolId + "_") + toString(i.caller)) + "_") + toString(posId)) + kUserPosition)))))
11561156 then throw("There are no user position")
11571157 else if ((0 >= price))
11581158 then throw("Price must be greater than 0")
11591159 else if ((price > tokenOraclePrice))
11601160 then throw("Price must be less than current token price")
11611161 else [IntegerEntry((((((((toString(i.caller) + "_") + toString(posId)) + "_") + poolId) + "_") + assetId) + kUserStopLoss), price)]
11621162 }
11631163
11641164
11651165
11661166 @Callable(i)
11671167 func deleteStopLoss (posId,poolId,assetId) = if (!(isDefined(getInteger(this, (((((((toString(i.caller) + "_") + toString(posId)) + "_") + poolId) + "_") + assetId) + kUserStopLoss)))))
11681168 then throw("No entry")
11691169 else [DeleteEntry((((((((toString(i.caller) + "_") + toString(posId)) + "_") + poolId) + "_") + assetId) + kUserStopLoss))]
11701170
11711171
11721172
11731173 @Callable(i)
11741174 func createNewRequest (params) = valueOrElse(isSelfCall(i), {
11751175 let newRequestId = (valueOrElse(getInteger(this, kRequestIter), 0) + 1)
11761176 $Tuple2([StringEntry((toString(newRequestId) + kRequestId), params), IntegerEntry(kRequestIter, newRequestId)], newRequestId)
11771177 })
11781178
11791179
11801180
11811181 @Callable(i)
11821182 func replenishFromLand (requestId) = valueOrElse(isLandCall(i), {
1183- let $t03600636110 = parseRequest(requestId)
1184- let user = $t03600636110._1
1185- let pool = $t03600636110._2
1186- let pmtA = $t03600636110._3
1187- let AId = $t03600636110._4
1188- let pmtB = $t03600636110._5
1189- let BId = $t03600636110._6
1190- let balA = $t03600636110._7
1191- let balB = $t03600636110._8
1192- let shareId = $t03600636110._9
1193- let bwAsset = $t03600636110._10
1194- let bwAmount = $t03600636110._11
1183+ let $t03601236116 = parseRequest(requestId)
1184+ let user = $t03601236116._1
1185+ let pool = $t03601236116._2
1186+ let pmtA = $t03601236116._3
1187+ let AId = $t03601236116._4
1188+ let pmtB = $t03601236116._5
1189+ let BId = $t03601236116._6
1190+ let balA = $t03601236116._7
1191+ let balB = $t03601236116._8
1192+ let shareId = $t03601236116._9
1193+ let bwAsset = $t03601236116._10
1194+ let bwAmount = $t03601236116._11
11951195 if ((size(i.payments) != 1))
11961196 then throw("Wrong payment size")
11971197 else if (if ((assetIdToStr(i.payments[0].assetId) != bwAsset))
11981198 then true
11991199 else (i.payments[0].amount != bwAmount))
12001200 then throw("Wrong payment")
12011201 else {
1202- let $t03630036424 = if ((AId == bwAsset))
1202+ let $t03630636430 = if ((AId == bwAsset))
12031203 then $Tuple2((pmtA + i.payments[0].amount), pmtB)
12041204 else $Tuple2(pmtA, (pmtB + i.payments[0].amount))
1205- let pmtAllA = $t03630036424._1
1206- let pmtAllB = $t03630036424._2
1205+ let pmtAllA = $t03630636430._1
1206+ let pmtAllB = $t03630636430._2
12071207 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Unknown pool")
1208- let $t03650636621 = replenishByType(pType, pool, LOAN_FEE, pmtAllA, AId, pmtAllB, BId, balA, balB, shareId)
1209- let userStaked = $t03650636621._1
1210- let axlyFee = $t03650636621._2
1208+ let $t03651236627 = replenishByType(pType, pool, LOAN_FEE, pmtAllA, AId, pmtAllB, BId, balA, balB, shareId)
1209+ let userStaked = $t03651236627._1
1210+ let axlyFee = $t03651236627._2
12111211 let posNum = getNewUserPositionNumber(user)
12121212 let borrowEntries = [IntegerEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserBorrowAmount), bwAmount), StringEntry((((((pool + "_") + user) + "_") + toString(posNum)) + kUserBorrowAssetId), bwAsset)]
12131213 let entries = replenishEntries(pool, user, userStaked, axlyFee, posNum, shareId, pType, true)
12141214 $Tuple2((((entries ++ getCursEntries(AId, BId, shareId)) ++ borrowEntries) :+ DeleteEntry((requestId + kRequestId))), userStaked)
12151215 }
12161216 })
12171217
12181218
12191219
12201220 @Callable(i)
12211221 func liquidate (user,posId,liquidateAmount) = valueOrElse(isLandCall(i), {
12221222 let pool = valueOrErrorMessage(getString(this, (((user + "_") + posId) + kUserPositionPool)), "no position")
12231223 let pType = valueOrErrorMessage(getString(this, (kPool + pool)), "Pool is not inited")
1224- let $t03740037490 = getPoolData(Address(fromBase58String(pool)), pType)
1225- let AId = $t03740037490._1
1226- let BId = $t03740037490._2
1227- let balA = $t03740037490._3
1228- let balB = $t03740037490._4
1229- let shareId = $t03740037490._5
1224+ let $t03740637496 = getPoolData(Address(fromBase58String(pool)), pType)
1225+ let AId = $t03740637496._1
1226+ let BId = $t03740637496._2
1227+ let balA = $t03740637496._3
1228+ let balB = $t03740637496._4
1229+ let shareId = $t03740637496._5
12301230 let amount = unstakeLP(pool, pType, shareId, liquidateAmount)
12311231 let borrowAmount = getIntegerValue(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAmount))
12321232 let borrowAsset = getStringValue(this, (((((pool + "_") + user) + "_") + posId) + kUserBorrowAssetId))
12331233 let userCanWithdraw = userCanWithdrawShareCalc(user, pool, posId, (borrowAmount > 0))
12341234 if ((borrowAmount == 0))
12351235 then throw("You can't liquidate position without borrow")
12361236 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))]
12371237 })
12381238
12391239
12401240
12411241 @Callable(i)
12421242 func stopLoss (user,posId,pool,assetId) = valueOrElse(isAdminCall(i), {
12431243 let tokenOraclePrice = ( let @ = invoke(priceOracleAddr, "getTWAP60", [assetId, false], nil)
12441244 if ($isInstanceOf(@, "(Int, Int)"))
12451245 then @
12461246 else throw(($getType(@) + " couldn't be cast to (Int, Int)")))._1
12471247 if (!(isDefined(getInteger(this, (((((((user + "_") + toString(posId)) + "_") + pool) + "_") + assetId) + kUserStopLoss)))))
12481248 then throw("No entry")
12491249 else (withdrawToUser(toString(i.caller), pool, toString(posId), true) :+ DeleteEntry((((((((user + "_") + toString(posId)) + "_") + pool) + "_") + assetId) + kUserStopLoss)))
12501250 })
12511251
12521252
12531253
12541254 @Callable(i)
12551255 func capitalizeExKeeper (pool,type,tokenToId,amountToExchange,claim,amountsIn,addresses,assetsToReceive,estReceived,slippageTolerance,minReceived,options) = valueOrElse(isAdminCall(i), {
1256- let $t03927639470 = if (claim)
1256+ let $t03928239476 = if (claim)
12571257 then claimFarmed(type, pool)
12581258 else {
12591259 let claimedAsset = if ((type == SF_POOL))
12601260 then SWOPID
12611261 else WXID
12621262 $Tuple2(amountToExchange, claimedAsset)
12631263 }
1264- let claimedAmount = $t03927639470._1
1265- let claimedAsset = $t03927639470._2
1264+ let claimedAmount = $t03928239476._1
1265+ let claimedAsset = $t03928239476._2
12661266 let exchangedAmount = exchangeKeeper(tokenToId, amountToExchange, claimedAsset, amountsIn, addresses, assetsToReceive, estReceived, slippageTolerance, minReceived, options)
12671267 let change = (claimedAmount - amountToExchange)
12681268 let changeEntry = if ((change > 0))
12691269 then [IntegerEntry((pool + kPoolCapChange), (change + valueOrElse(getInteger(this, (pool + kPoolCapChange)), 0)))]
12701270 else nil
12711271 (capitalize(pool, type, tokenToId, exchangedAmount) ++ changeEntry)
12721272 })
12731273
12741274
12751275
12761276 @Callable(i)
12771277 func capitalizeExPuzzle (pool,type,tokenToId,amountToExchange,claim,routesStr,minToReceive,options) = valueOrElse(isAdminCall(i), {
1278- let $t04015540349 = if (claim)
1278+ let $t04016140355 = if (claim)
12791279 then claimFarmed(type, pool)
12801280 else {
12811281 let claimedAsset = if ((type == SF_POOL))
12821282 then SWOPID
12831283 else WXID
12841284 $Tuple2(amountToExchange, claimedAsset)
12851285 }
1286- let claimedAmount = $t04015540349._1
1287- let claimedAsset = $t04015540349._2
1286+ let claimedAmount = $t04016140355._1
1287+ let claimedAsset = $t04016140355._2
12881288 let exchangedAmount = exchangePuzzle(tokenToId, amountToExchange, claimedAsset, routesStr, minToReceive, options)
12891289 let change = (claimedAmount - amountToExchange)
12901290 let changeEntry = if ((change > 0))
12911291 then [IntegerEntry((pool + kPoolCapChange), (change + valueOrElse(getInteger(this, (pool + kPoolCapChange)), 0)))]
12921292 else nil
12931293 (capitalize(pool, type, tokenToId, exchangedAmount) ++ changeEntry)
12941294 })
12951295
12961296
12971297
12981298 @Callable(i)
12991299 func capitalizeExSwopFi (pool,type,tokenToId,amountToExchange,claim,exchangers,exchangersType,args1,args2,routingAssetsKeys,minAmountToReceive,options) = valueOrElse(isAdminCall(i), {
1300- let $t04110041294 = if (claim)
1300+ let $t04110641300 = if (claim)
13011301 then claimFarmed(type, pool)
13021302 else {
13031303 let claimedAsset = if ((type == SF_POOL))
13041304 then SWOPID
13051305 else WXID
13061306 $Tuple2(amountToExchange, claimedAsset)
13071307 }
1308- let claimedAmount = $t04110041294._1
1309- let claimedAsset = $t04110041294._2
1308+ let claimedAmount = $t04110641300._1
1309+ let claimedAsset = $t04110641300._2
13101310 let exchangedAmount = exchangeSwopFi(tokenToId, amountToExchange, claimedAsset, exchangers, exchangersType, args1, args2, routingAssetsKeys, minAmountToReceive, options)
13111311 let change = (claimedAmount - amountToExchange)
13121312 let changeEntry = if ((change > 0))
13131313 then [IntegerEntry((pool + kPoolCapChange), (change + valueOrElse(getInteger(this, (pool + kPoolCapChange)), 0)))]
13141314 else nil
13151315 (capitalize(pool, type, tokenToId, exchangedAmount) ++ changeEntry)
13161316 })
13171317
13181318
13191319
13201320 @Callable(i)
13211321 func initNewPool (type,poolAddr,inFeeNoLoan,inFeeLoan,capFeeNoLoan,capFeeWithLoan,stoplossFeeNoLoan,stoplossFeeWithLoan) = valueOrElse(isAdminCall(i), if (if ((type != SF_POOL))
13221322 then (type != WX_POOL)
13231323 else false)
13241324 then throw("Wrong type")
13251325 else {
1326- let $t04201542109 = getPoolData(Address(fromBase58String(poolAddr)), type)
1327- let aId = $t04201542109._1
1328- let bId = $t04201542109._2
1329- let aBal = $t04201542109._3
1330- let bBal = $t04201542109._4
1331- let shareId = $t04201542109._5
1326+ let $t04202142115 = getPoolData(Address(fromBase58String(poolAddr)), type)
1327+ let aId = $t04202142115._1
1328+ let bId = $t04202142115._2
1329+ let aBal = $t04202142115._3
1330+ let bBal = $t04202142115._4
1331+ let shareId = $t04202142115._5
13321332 [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)]
13331333 })
13341334
13351335
13361336 @Verifier(tx)
13371337 func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
13381338

github/deemru/w8io/3ef1775 
263.24 ms