tx · Ew3tXE4YqQXp2nxYXi9etrpKkWtXEVo2D773B6NUKhSi

3PJazesjmprZcXYcFx3LxBux9T7q6qYoEDu:  -0.03400000 Waves

2022.10.14 13:55 [3337390] smart account 3PJazesjmprZcXYcFx3LxBux9T7q6qYoEDu > SELF 0.00000000 Waves

{ "type": 13, "id": "Ew3tXE4YqQXp2nxYXi9etrpKkWtXEVo2D773B6NUKhSi", "fee": 3400000, "feeAssetId": null, "timestamp": 1665744911159, "version": 1, "sender": "3PJazesjmprZcXYcFx3LxBux9T7q6qYoEDu", "senderPublicKey": "Eh7K5LqQLQiMVtfTT8GBou465Ta9MUg5GpmqtykkYK8J", "proofs": [ "2KiGKCDaoPNYd5eemuWTrFKUtNvATVrmsfu7pwZzkdLoBfwyWVETBgsJDGzaEijh8nHaXgamoKtujBUuqWUXy14Z" ], "script": "base64:BgKUAQgCEgMKAQgSAwoBCBIAEgQKAgEEEgQKAgEEEgMKAQESABIECgIIARIECgIIARIECgIIARIECgIBARIDCgEBEgUKAwEIARIECgIBCBIECgIICBIECgIICBIECgIIARIAEgMKAQgSBQoDAQEBEgQKAggBEgQKAgEBEgQKAggIEgsKCQgBAQIBAggEBBIGCgQICAEIEgBeAAZzY2FsZTgAgMLXLwAMc2NhbGU4QmlnSW50CQC2AgEAgMLXLwAHc2NhbGUxOAkAtgIBAICAkLu61q3wDQAKemVyb0JpZ0ludAkAtgIBAAAABGJpZzAJALYCAQAAAARiaWcxCQC2AgEAAQAEYmlnMgkAtgIBAAIACnNsaXBwYWdlNEQJALYCAQkAZQIFBnNjYWxlOAkAaQIJAGgCBQZzY2FsZTgAAQUGc2NhbGU4AAVBbXVsdAIDMTAwAAVEY29udgIBMQADU0VQAgJfXwAFRU1QVFkCAAAKUG9vbEFjdGl2ZQABAApQb29sUHV0RGlzAAIADlBvb2xNYXRjaGVyRGlzAAMADFBvb2xTaHV0ZG93bgAEAA5pZHhQb29sQWRkcmVzcwABAAlpZHhQb29sU3QAAgAJaWR4TFBBc0lkAAMACWlkeEFtQXNJZAAEAAlpZHhQckFzSWQABQALaWR4QW10QXNEY20ABgANaWR4UHJpY2VBc0RjbQAHAAtpZHhJQW10QXNJZAAIAA1pZHhJUHJpY2VBc0lkAAkAD2lkeEZhY3RTdGFrQ250cgABABJpZHhGYWN0b3J5UmVzdENudHIABgAQaWR4RmFjdFNsaXBwQ250cgAHABFpZHhGYWN0R3d4UmV3Q250cgAKAApmZWVEZWZhdWx0CQBrAwAFBQZzY2FsZTgAkE4BAnQxAgdvcmlnVmFsDW9yaWdTY2FsZU11bHQJALwCAwkAtgIBBQdvcmlnVmFsBQdzY2FsZTE4CQC2AgEFDW9yaWdTY2FsZU11bHQBAmYxAgN2YWwPcmVzdWx0U2NhbGVNdWx0CQCgAwEJALwCAwUDdmFsCQC2AgEFD3Jlc3VsdFNjYWxlTXVsdAUHc2NhbGUxOAECdHMDA2FtdAhyZXNTY2FsZQhjdXJTY2FsZQkAawMFA2FtdAUIcmVzU2NhbGUFCGN1clNjYWxlAQNhYnMBA3ZhbAMJAL8CAgUKemVyb0JpZ0ludAUDdmFsCQC+AgEFA3ZhbAUDdmFsAQlhYnNCaWdJbnQBA3ZhbAMJAL8CAgUKemVyb0JpZ0ludAUDdmFsCQC+AgEFA3ZhbAUDdmFsAQJmYwACEyVzX19mYWN0b3J5Q29udHJhY3QBA21wawACFCVzX19tYW5hZ2VyUHVibGljS2V5AQRwbXBrAAIbJXNfX3BlbmRpbmdNYW5hZ2VyUHVibGljS2V5AQJwbAACESVzJXNfX3ByaWNlX19sYXN0AQJwaAIBaAF0CQC5CQIJAMwIAgIYJXMlcyVkJWRfX3ByaWNlX19oaXN0b3J5CQDMCAIJAKQDAQUBaAkAzAgCCQCkAwEFAXQFA25pbAUDU0VQAQNwYXUCAnVhBHR4SWQJAKwCAgkArAICCQCsAgICCyVzJXMlc19fUF9fBQJ1YQICX18FBHR4SWQBA2dhdQICdWEEdHhJZAkArAICCQCsAgIJAKwCAgILJXMlcyVzX19HX18FAnVhAgJfXwUEdHhJZAECYWEAAg8lc19fYW1vdW50QXNzZXQBAnBhAAIOJXNfX3ByaWNlQXNzZXQBA2FtcAACByVzX19hbXABA2FkYQACDSVzX19hZGRvbkFkZHIABmtleUZlZQIHJXNfX2ZlZQADZmVlCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFBmtleUZlZQUKZmVlRGVmYXVsdAEEZmNmZwACESVzX19mYWN0b3J5Q29uZmlnAQRtdHBrAAIYJXMlc19fbWF0Y2hlcl9fcHVibGljS2V5AQJwYwIGaUFtdEFzBWlQckFzCQCsAgIJAKwCAgkArAICCQCsAgICCCVkJWQlc19fBQZpQW10QXMCAl9fBQVpUHJBcwIIX19jb25maWcBA21iYQEFYkFTdHIJAKwCAgIoJXMlcyVzX19tYXBwaW5nc19fYmFzZUFzc2V0MmludGVybmFsSWRfXwUFYkFTdHIBA2FwcwACDCVzX19zaHV0ZG93bgEca2V5QWxsb3dlZExwU3RhYmxlU2NyaXB0SGFzaAACHSVzX19hbGxvd2VkTHBTdGFibGVTY3JpcHRIYXNoARZrZXlGZWVDb2xsZWN0b3JBZGRyZXNzAAIXJXNfX2ZlZUNvbGxlY3RvckFkZHJlc3MBA3RvZQMDb3JWBnNlbmRyVgZtYXRjaFYJAAIBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIRRmFpbGVkOiBvcmRWYWxpZD0JAKUDAQUDb3JWAgsgc25kclZhbGlkPQkApQMBBQZzZW5kclYCDCBtdGNoclZhbGlkPQkApQMBBQZtYXRjaFYBA3N0cgEDdmFsBAckbWF0Y2gwBQN2YWwDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAZ2YWxTdHIFByRtYXRjaDAFBnZhbFN0cgkAAgECE2ZhaWwgY2FzdCB0byBTdHJpbmcBBHN0cmYCBGFkZHIDa2V5CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEYWRkcgUDa2V5CQC5CQIJAMwIAgIKbWFuZGF0b3J5IAkAzAgCCQClCAEFBGFkZHIJAMwIAgIBLgkAzAgCBQNrZXkJAMwIAgIMIG5vdCBkZWZpbmVkBQNuaWwCAAEEaW50ZgIEYWRkcgNrZXkJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQRhZGRyBQNrZXkJALkJAgkAzAgCAgptYW5kYXRvcnkgCQDMCAIJAKUIAQUEYWRkcgkAzAgCAgEuCQDMCAIFA2tleQkAzAgCAgwgbm90IGRlZmluZWQFA25pbAIAAANmY2EJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQRzdHJmAgUEdGhpcwkBAmZjAAABQQkBBHN0cmYCBQR0aGlzCQEDYW1wAAEDaWdzAAkBC3ZhbHVlT3JFbHNlAgkAmwgCBQNmY2EJAQNhcHMABwECbXAACQDZBAEJAQRzdHJmAgUDZmNhCQEEbXRwawAAE2ZlZUNvbGxlY3RvckFkZHJlc3MJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQRzdHJmAgUDZmNhCQEWa2V5RmVlQ29sbGVjdG9yQWRkcmVzcwABA2dwYwAEBWFtdEFzCQEEc3RyZgIFBHRoaXMJAQJhYQAEB3ByaWNlQXMJAQRzdHJmAgUEdGhpcwkBAnBhAAQIaVByaWNlQXMJAQRpbnRmAgUDZmNhCQEDbWJhAQUHcHJpY2VBcwQGaUFtdEFzCQEEaW50ZgIFA2ZjYQkBA21iYQEFBWFtdEFzCQC1CQIJAQRzdHJmAgUDZmNhCQECcGMCCQCkAwEFBmlBbXRBcwkApAMBBQhpUHJpY2VBcwUDU0VQAQNnZmMACQC1CQIJAQRzdHJmAgUDZmNhCQEEZmNmZwAFA1NFUAANZmFjdG9yeUNvbmZpZwkBA2dmYwAAD3N0YWtpbmdDb250cmFjdAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUNZmFjdG9yeUNvbmZpZwUPaWR4RmFjdFN0YWtDbnRyAiBJbnZhbGlkIHN0YWtpbmcgY29udHJhY3QgYWRkcmVzcwAPc2xpcGFnZUNvbnRyYWN0CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkAkQMCBQ1mYWN0b3J5Q29uZmlnBRBpZHhGYWN0U2xpcHBDbnRyAiBJbnZhbGlkIHNsaXBhZ2UgY29udHJhY3QgYWRkcmVzcwALZ3d4Q29udHJhY3QJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIFDWZhY3RvcnlDb25maWcFEWlkeEZhY3RHd3hSZXdDbnRyAhxJbnZhbGlkIGd3eCBjb250cmFjdCBhZGRyZXNzAAxyZXN0Q29udHJhY3QJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIFDWZhY3RvcnlDb25maWcFEmlkeEZhY3RvcnlSZXN0Q250cgIcSW52YWxpZCBnd3ggY29udHJhY3QgYWRkcmVzcwERZGF0YVB1dEFjdGlvbkluZm8KDWluQW10QXNzZXRBbXQPaW5QcmljZUFzc2V0QW10CG91dExwQW10BXByaWNlCnNsaXBCeVVzZXIMc2xpcHBhZ2VSZWFsCHR4SGVpZ2h0C3R4VGltZXN0YW1wDHNsaXBhZ2VBbUFtdAxzbGlwYWdlUHJBbXQJALkJAgkAzAgCAhQlZCVkJWQlZCVkJWQlZCVkJWQlZAkAzAgCCQCkAwEFDWluQW10QXNzZXRBbXQJAMwIAgkApAMBBQ9pblByaWNlQXNzZXRBbXQJAMwIAgkApAMBBQhvdXRMcEFtdAkAzAgCCQCkAwEFBXByaWNlCQDMCAIJAKQDAQUKc2xpcEJ5VXNlcgkAzAgCCQCkAwEFDHNsaXBwYWdlUmVhbAkAzAgCCQCkAwEFCHR4SGVpZ2h0CQDMCAIJAKQDAQULdHhUaW1lc3RhbXAJAMwIAgkApAMBBQxzbGlwYWdlQW1BbXQJAMwIAgkApAMBBQxzbGlwYWdlUHJBbXQFA25pbAUDU0VQARFkYXRhR2V0QWN0aW9uSW5mbwYOb3V0QW10QXNzZXRBbXQQb3V0UHJpY2VBc3NldEFtdAdpbkxwQW10BXByaWNlCHR4SGVpZ2h0C3R4VGltZXN0YW1wCQC5CQIJAMwIAgIMJWQlZCVkJWQlZCVkCQDMCAIJAKQDAQUOb3V0QW10QXNzZXRBbXQJAMwIAgkApAMBBRBvdXRQcmljZUFzc2V0QW10CQDMCAIJAKQDAQUHaW5McEFtdAkAzAgCCQCkAwEFBXByaWNlCQDMCAIJAKQDAQUIdHhIZWlnaHQJAMwIAgkApAMBBQt0eFRpbWVzdGFtcAUDbmlsBQNTRVABDWdldEFjY0JhbGFuY2UBB2Fzc2V0SWQDCQAAAgUHYXNzZXRJZAIFV0FWRVMICQDvBwEFBHRoaXMJYXZhaWxhYmxlCQDwBwIFBHRoaXMJANkEAQUHYXNzZXRJZAEEY3BiaQIIcHJBbXRYMTgIYW1BbXRYMTgJALwCAwUIcHJBbXRYMTgFB3NjYWxlMTgFCGFtQW10WDE4AQN2YWQDAkExAkEyCHNsaXBwYWdlBARkaWZmCQC8AgMJALgCAgUCQTEFAkEyBQxzY2FsZThCaWdJbnQFAkEyBARwYXNzCQC/AgIJALgCAgUIc2xpcHBhZ2UJAQNhYnMBBQRkaWZmBQp6ZXJvQmlnSW50AwkBASEBBQRwYXNzCQACAQkArAICAgpCaWcgc2xwZzogCQCmAwEFBGRpZmYJAJQKAgUEcGFzcwkAmQMBCQDMCAIFAkExCQDMCAIFAkEyBQNuaWwBAnZkAwJEMQJEMARzbHBnBARkaWZmCQC8AgMFAkQwBQxzY2FsZThCaWdJbnQFAkQxBARmYWlsCQC/AgIFBHNscGcFBGRpZmYDAwUEZmFpbAYJAL8CAgUCRDAFAkQxCQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkApgMBBQJEMAIBIAkApgMBBQJEMQIBIAkApgMBBQRkaWZmAgEgCQCmAwEFBHNscGcFBGZhaWwBA3BjcAQKYW1Bc3NldERjbQpwckFzc2V0RGNtBWFtQW10BXByQW10BAthbXRBc0FtdFgxOAkBAnQxAgUFYW1BbXQFCmFtQXNzZXREY20ECnByQXNBbXRYMTgJAQJ0MQIFBXByQW10BQpwckFzc2V0RGNtCQEEY3BiaQIFCnByQXNBbXRYMTgFC2FtdEFzQW10WDE4AQpjYWxjUHJpY2VzAwVhbUFtdAVwckFtdAVscEFtdAQDY2ZnCQEDZ3BjAAQIYW10QXNEY20JAQ1wYXJzZUludFZhbHVlAQkAkQMCBQNjZmcFC2lkeEFtdEFzRGNtBAdwckFzRGNtCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUDY2ZnBQ1pZHhQcmljZUFzRGNtBAhwcmljZVgxOAkBA3BjcAQFCGFtdEFzRGNtBQdwckFzRGNtBQVhbUFtdAUFcHJBbXQECGFtQW10WDE4CQECdDECBQVhbUFtdAUIYW10QXNEY20ECHByQW10WDE4CQECdDECBQVwckFtdAUHcHJBc0RjbQQIbHBBbXRYMTgJAQJ0MQIFBWxwQW10BQZzY2FsZTgEDWxwUHJJbkFtQXNYMTgJAQRjcGJpAgUIYW1BbXRYMTgFCGxwQW10WDE4BA1scFBySW5QckFzWDE4CQEEY3BiaQIFCHByQW10WDE4BQhscEFtdFgxOAkAzAgCBQhwcmljZVgxOAkAzAgCBQ1scFBySW5BbUFzWDE4CQDMCAIFDWxwUHJJblByQXNYMTgFA25pbAEPY2FsY3VsYXRlUHJpY2VzAwVhbUFtdAVwckFtdAVscEFtdAQBcAkBCmNhbGNQcmljZXMDBQVhbUFtdAUFcHJBbXQFBWxwQW10CQDMCAIJAQJmMQIJAJEDAgUBcAAABQZzY2FsZTgJAMwIAgkBAmYxAgkAkQMCBQFwAAEFBnNjYWxlOAkAzAgCCQECZjECCQCRAwIFAXAAAgUGc2NhbGU4BQNuaWwBB3Rha2VGZWUBBmFtb3VudAQJZmVlQW1vdW50CQBrAwUGYW1vdW50BQNmZWUFBnNjYWxlOAkAlAoCCQBlAgUGYW1vdW50BQlmZWVBbW91bnQFCWZlZUFtb3VudAEDZWdvBAZ0eElkNTgKcG10QXNzZXRJZAhwbXRMcEFtdAt1c2VyQWRkcmVzcwQDY2ZnCQEDZ3BjAAQEbHBJZAkAkQMCBQNjZmcFCWlkeExQQXNJZAQEYW1JZAkAkQMCBQNjZmcFCWlkeEFtQXNJZAQEcHJJZAkAkQMCBQNjZmcFCWlkeFByQXNJZAQFYW1EY20JAQ1wYXJzZUludFZhbHVlAQkAkQMCBQNjZmcFC2lkeEFtdEFzRGNtBAVwckRjbQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFA2NmZwUNaWR4UHJpY2VBc0RjbQQDc3RzCQCRAwIFA2NmZwUJaWR4UG9vbFN0BAdscEVtaXNzCAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDsBwEJANkEAQUEbHBJZAILV3JvbmcgTFAgaWQIcXVhbnRpdHkDCQECIT0CBQRscElkBQpwbXRBc3NldElkCQACAQIPV3JvbmcgcG10IGFzc2V0BAlhbUJhbGFuY2UJAQ1nZXRBY2NCYWxhbmNlAQUEYW1JZAQMYW1CYWxhbmNlWDE4CQECdDECBQlhbUJhbGFuY2UFBWFtRGNtBAlwckJhbGFuY2UJAQ1nZXRBY2NCYWxhbmNlAQUEcHJJZAQMcHJCYWxhbmNlWDE4CQECdDECBQlwckJhbGFuY2UFBXByRGNtBAtjdXJQcmljZVgxOAkBBGNwYmkCBQxwckJhbGFuY2VYMTgFDGFtQmFsYW5jZVgxOAQIY3VyUHJpY2UJAQJmMQIFC2N1clByaWNlWDE4BQZzY2FsZTgEC3BtdExwQW10WDE4CQECdDECBQhwbXRMcEFtdAUGc2NhbGU4BApscEVtaXNzWDE4CQECdDECBQdscEVtaXNzBQZzY2FsZTgEC291dEFtQW10WDE4CQC8AgMFDGFtQmFsYW5jZVgxOAULcG10THBBbXRYMTgFCmxwRW1pc3NYMTgEC291dFByQW10WDE4CQC8AgMFDHByQmFsYW5jZVgxOAULcG10THBBbXRYMTgFCmxwRW1pc3NYMTgECG91dEFtQW10CQECZjECBQtvdXRBbUFtdFgxOAUFYW1EY20ECG91dFByQW10CQECZjECBQtvdXRQckFtdFgxOAUFcHJEY20EBXN0YXRlAwkAAAIFBnR4SWQ1OAIABQNuaWwJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwULdXNlckFkZHJlc3MFCG91dEFtQW10AwkAAAIFBGFtSWQCBVdBVkVTBQR1bml0CQDZBAEFBGFtSWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwULdXNlckFkZHJlc3MFCG91dFByQW10AwkAAAIFBHBySWQCBVdBVkVTBQR1bml0CQDZBAEFBHBySWQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBA2dhdQIJAKUIAQULdXNlckFkZHJlc3MFBnR4SWQ1OAkBEWRhdGFHZXRBY3Rpb25JbmZvBgUIb3V0QW1BbXQFCG91dFByQW10BQhwbXRMcEFtdAUIY3VyUHJpY2UFBmhlaWdodAgFCWxhc3RCbG9jawl0aW1lc3RhbXAJAMwIAgkBDEludGVnZXJFbnRyeQIJAQJwbAAFCGN1clByaWNlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECcGgCBQZoZWlnaHQIBQlsYXN0QmxvY2sJdGltZXN0YW1wBQhjdXJQcmljZQUDbmlsCQCcCgoFCG91dEFtQW10BQhvdXRQckFtdAUEYW1JZAUEcHJJZAUJYW1CYWxhbmNlBQlwckJhbGFuY2UFB2xwRW1pc3MFC2N1clByaWNlWDE4BQNzdHMFBXN0YXRlAQNlcG8NBnR4SWQ1OAhzbGlwcGFnZQdpbkFtQW10BmluQW1JZAdpblByQW10BmluUHJJZAt1c2VyQWRkcmVzcwZpc0V2YWwGZW1pdExwCmlzT25lQXNzZXQQdmFsaWRhdGVTbGlwcGFnZQZwbXRBbXQFcG10SWQEA2NmZwkBA2dwYwAEBGxwSWQJANkEAQkAkQMCBQNjZmcFCWlkeExQQXNJZAQHYW1JZFN0cgkAkQMCBQNjZmcFCWlkeEFtQXNJZAQHcHJJZFN0cgkAkQMCBQNjZmcFCWlkeFByQXNJZAQJaW5BbUlkU3RyCQCRAwIFA2NmZwULaWR4SUFtdEFzSWQECWluUHJJZFN0cgkAkQMCBQNjZmcFDWlkeElQcmljZUFzSWQEBmFtdERjbQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFA2NmZwULaWR4QW10QXNEY20ECHByaWNlRGNtCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUDY2ZnBQ1pZHhQcmljZUFzRGNtBANzdHMJAJEDAgUDY2ZnBQlpZHhQb29sU3QEBGxwRW0ICQETdmFsdWVPckVycm9yTWVzc2FnZQIJAOwHAQUEbHBJZAIIV3IgbHAgYXMIcXVhbnRpdHkECWFtQmFsYW5jZQMFBmlzRXZhbAkBDWdldEFjY0JhbGFuY2UBBQdhbUlkU3RyAwMFCmlzT25lQXNzZXQJAAACBQVwbXRJZAUHYW1JZFN0cgcJAGUCCQENZ2V0QWNjQmFsYW5jZQEFB2FtSWRTdHIFBnBtdEFtdAMFCmlzT25lQXNzZXQJAQ1nZXRBY2NCYWxhbmNlAQUHYW1JZFN0cgkAZQIJAQ1nZXRBY2NCYWxhbmNlAQUHYW1JZFN0cgUHaW5BbUFtdAQJcHJCYWxhbmNlAwUGaXNFdmFsCQENZ2V0QWNjQmFsYW5jZQEFB3BySWRTdHIDAwUKaXNPbmVBc3NldAkAAAIFBXBtdElkBQdwcklkU3RyBwkAZQIJAQ1nZXRBY2NCYWxhbmNlAQUHcHJJZFN0cgUGcG10QW10AwUKaXNPbmVBc3NldAkBDWdldEFjY0JhbGFuY2UBBQdwcklkU3RyCQBlAgkBDWdldEFjY0JhbGFuY2UBBQdwcklkU3RyBQdpblByQW10BA9pbkFtQXNzZXRBbXRYMTgJAQJ0MQIFB2luQW1BbXQFBmFtdERjbQQPaW5QckFzc2V0QW10WDE4CQECdDECBQdpblByQW10BQhwcmljZURjbQQMdXNlclByaWNlWDE4CQEEY3BiaQIFD2luUHJBc3NldEFtdFgxOAUPaW5BbUFzc2V0QW10WDE4BAxhbUJhbGFuY2VYMTgJAQJ0MQIFCWFtQmFsYW5jZQUGYW10RGNtBAxwckJhbGFuY2VYMTgJAQJ0MQIFCXByQmFsYW5jZQUIcHJpY2VEY20EAXIDCQAAAgUEbHBFbQAABAtjdXJQcmljZVgxOAUKemVyb0JpZ0ludAQLc2xpcHBhZ2VYMTgFCnplcm9CaWdJbnQECGxwQW10WDE4CQB2BgkAuQICBQ9pbkFtQXNzZXRBbXRYMTgFD2luUHJBc3NldEFtdFgxOAAACQC2AgEABQABAAAFBERPV04JAJcKBQkBAmYxAgUIbHBBbXRYMTgFBnNjYWxlOAkBAmYxAgUPaW5BbUFzc2V0QW10WDE4BQZhbXREY20JAQJmMQIFD2luUHJBc3NldEFtdFgxOAUIcHJpY2VEY20JAQRjcGJpAgkAtwICBQxwckJhbGFuY2VYMTgFD2luUHJBc3NldEFtdFgxOAkAtwICBQxhbUJhbGFuY2VYMTgFD2luQW1Bc3NldEFtdFgxOAULc2xpcHBhZ2VYMTgEC2N1clByaWNlWDE4CQEEY3BiaQIFDHByQmFsYW5jZVgxOAUMYW1CYWxhbmNlWDE4BA9zbGlwcGFnZVJlYWxYMTgJALwCAwkBA2FicwEJALgCAgULY3VyUHJpY2VYMTgFDHVzZXJQcmljZVgxOAUHc2NhbGUxOAULY3VyUHJpY2VYMTgEC3NsaXBwYWdlWDE4CQECdDECBQhzbGlwcGFnZQUGc2NhbGU4AwMDBRB2YWxpZGF0ZVNsaXBwYWdlCQECIT0CBQtjdXJQcmljZVgxOAUKemVyb0JpZ0ludAcJAL8CAgUPc2xpcHBhZ2VSZWFsWDE4BQtzbGlwcGFnZVgxOAcJAAIBCQCsAgIJAKwCAgkArAICAg9QcmljZSBzbGlwcGFnZSAJAKYDAQUPc2xpcHBhZ2VSZWFsWDE4AgMgPiAJAKYDAQULc2xpcHBhZ2VYMTgEDWxwRW1pc3Npb25YMTgJAQJ0MQIFBGxwRW0FBnNjYWxlOAQKcHJWaWFBbVgxOAkAvAIDBQ9pbkFtQXNzZXRBbXRYMTgFC2N1clByaWNlWDE4BQdzY2FsZTE4BAphbVZpYVByWDE4CQC8AgMFD2luUHJBc3NldEFtdFgxOAUHc2NhbGUxOAULY3VyUHJpY2VYMTgEDGV4cGVjdGVkQW10cwMJAL8CAgUKcHJWaWFBbVgxOAUPaW5QckFzc2V0QW10WDE4CQCUCgIFCmFtVmlhUHJYMTgFD2luUHJBc3NldEFtdFgxOAkAlAoCBQ9pbkFtQXNzZXRBbXRYMTgFCnByVmlhQW1YMTgEEWV4cEFtdEFzc2V0QW10WDE4CAUMZXhwZWN0ZWRBbXRzAl8xBBNleHBQcmljZUFzc2V0QW10WDE4CAUMZXhwZWN0ZWRBbXRzAl8yBAhscEFtdFgxOAkAvAIDBQ1scEVtaXNzaW9uWDE4BRNleHBQcmljZUFzc2V0QW10WDE4BQxwckJhbGFuY2VYMTgJAJcKBQkBAmYxAgUIbHBBbXRYMTgFBnNjYWxlOAkBAmYxAgURZXhwQW10QXNzZXRBbXRYMTgFBmFtdERjbQkBAmYxAgUTZXhwUHJpY2VBc3NldEFtdFgxOAUIcHJpY2VEY20FC2N1clByaWNlWDE4BQtzbGlwcGFnZVgxOAQJY2FsY0xwQW10CAUBcgJfMQQOY2FsY0FtQXNzZXRQbXQIBQFyAl8yBA5jYWxjUHJBc3NldFBtdAgFAXICXzMECGN1clByaWNlCQECZjECCAUBcgJfNAUGc2NhbGU4BAxzbGlwcGFnZUNhbGMJAQJmMQIIBQFyAl81BQZzY2FsZTgDCQBnAgAABQljYWxjTHBBbXQJAAIBAgdMUCA8PSAwBAllbWl0THBBbXQDCQEBIQEFBmVtaXRMcAAABQljYWxjTHBBbXQEBmFtRGlmZgkAZQIFB2luQW1BbXQFDmNhbGNBbUFzc2V0UG10BAZwckRpZmYJAGUCBQdpblByQW10BQ5jYWxjUHJBc3NldFBtdAQNJHQwMTY1MDkxNjg1NAMDBQppc09uZUFzc2V0CQAAAgUFcG10SWQFB2FtSWRTdHIHCQCUCgIFBnBtdEFtdAAAAwMFCmlzT25lQXNzZXQJAAACBQVwbXRJZAUHcHJJZFN0cgcJAJQKAgAABQZwbXRBbXQJAJQKAgUOY2FsY0FtQXNzZXRQbXQFDmNhbGNQckFzc2V0UG10BAp3cml0ZUFtQW10CAUNJHQwMTY1MDkxNjg1NAJfMQQKd3JpdGVQckFtdAgFDSR0MDE2NTA5MTY4NTQCXzIEC2NvbW1vblN0YXRlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECcGwABQhjdXJQcmljZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAnBoAgUGaGVpZ2h0CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAUIY3VyUHJpY2UJAMwIAgkBC1N0cmluZ0VudHJ5AgkBA3BhdQIFC3VzZXJBZGRyZXNzBQZ0eElkNTgJARFkYXRhUHV0QWN0aW9uSW5mbwoFCndyaXRlQW1BbXQFCndyaXRlUHJBbXQFCWVtaXRMcEFtdAUIY3VyUHJpY2UFCHNsaXBwYWdlBQxzbGlwcGFnZUNhbGMFBmhlaWdodAgFCWxhc3RCbG9jawl0aW1lc3RhbXAFBmFtRGlmZgUGcHJEaWZmBQNuaWwJAJ8KDQUJY2FsY0xwQW10BQllbWl0THBBbXQFCGN1clByaWNlBQlhbUJhbGFuY2UFCXByQmFsYW5jZQUEbHBFbQUEbHBJZAUDc3RzBQtjb21tb25TdGF0ZQUGYW1EaWZmBQZwckRpZmYFBmluQW1JZAUGaW5QcklkAQNtb2EBBW9yZGVyBANjZmcJAQNncGMABAdhbXRBc0lkCQCRAwIFA2NmZwUJaWR4QW1Bc0lkBAZwckFzSWQJAJEDAgUDY2ZnBQlpZHhQckFzSWQEA3N0cwkBDXBhcnNlSW50VmFsdWUBCQCRAwIFA2NmZwUJaWR4UG9vbFN0BAhhbXRBc0RjbQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFA2NmZwULaWR4QW10QXNEY20EB3ByQXNEY20JAQ1wYXJzZUludFZhbHVlAQkAkQMCBQNjZmcFDWlkeFByaWNlQXNEY20ED2FjY0FtdEFzQmFsYW5jZQkBDWdldEFjY0JhbGFuY2UBBQdhbXRBc0lkBA5hY2NQckFzQmFsYW5jZQkBDWdldEFjY0JhbGFuY2UBBQZwckFzSWQEC2N1clByaWNlWDE4AwkAAAIIBQVvcmRlcglvcmRlclR5cGUFA0J1eQkBA3BjcAQFCGFtdEFzRGNtBQdwckFzRGNtCQBkAgUPYWNjQW10QXNCYWxhbmNlCAUFb3JkZXIGYW1vdW50BQ5hY2NQckFzQmFsYW5jZQkBA3BjcAQFCGFtdEFzRGNtBQdwckFzRGNtCQBlAgUPYWNjQW10QXNCYWxhbmNlCAUFb3JkZXIGYW1vdW50BQ5hY2NQckFzQmFsYW5jZQQIY3VyUHJpY2UJAQJmMQIFC2N1clByaWNlWDE4BQZzY2FsZTgDAwMJAQNpZ3MABgkAAAIFA3N0cwUOUG9vbE1hdGNoZXJEaXMGCQAAAgUDc3RzBQxQb29sU2h1dGRvd24JAAIBAg1BZG1pbiBibG9ja2VkBApvckFtdEFzc2V0CAgFBW9yZGVyCWFzc2V0UGFpcgthbW91bnRBc3NldAQKb3JBbXRBc1N0cgMJAAACBQpvckFtdEFzc2V0BQR1bml0AgVXQVZFUwkA2AQBCQEFdmFsdWUBBQpvckFtdEFzc2V0BAlvclByQXNzZXQICAUFb3JkZXIJYXNzZXRQYWlyCnByaWNlQXNzZXQECW9yUHJBc1N0cgMJAAACBQlvclByQXNzZXQFBHVuaXQCBVdBVkVTCQDYBAEJAQV2YWx1ZQEFCW9yUHJBc3NldAMDCQECIT0CBQpvckFtdEFzU3RyBQdhbXRBc0lkBgkBAiE9AgUJb3JQckFzU3RyBQZwckFzSWQJAAIBAglXciBhc3NldHMECm9yZGVyUHJpY2UIBQVvcmRlcgVwcmljZQQIcHJpY2VEY20JAGsDBQZzY2FsZTgFB3ByQXNEY20FCGFtdEFzRGNtBA5jYXN0T3JkZXJQcmljZQkBAnRzAwUKb3JkZXJQcmljZQUGc2NhbGU4BQhwcmljZURjbQQRaXNPcmRlclByaWNlVmFsaWQDCQAAAggFBW9yZGVyCW9yZGVyVHlwZQUDQnV5CQBnAgUIY3VyUHJpY2UFDmNhc3RPcmRlclByaWNlCQBnAgUOY2FzdE9yZGVyUHJpY2UFCGN1clByaWNlBgECY2cBAWkDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEJAAIBAgoxIHBtbnQgZXhwBANwbXQJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAQKcG10QXNzZXRJZAkBBXZhbHVlAQgFA3BtdAdhc3NldElkBAZwbXRBbXQIBQNwbXQGYW1vdW50BAFyCQEDZWdvBAkA2AQBCAUBaQ10cmFuc2FjdGlvbklkCQDYBAEFCnBtdEFzc2V0SWQFBnBtdEFtdAgFAWkGY2FsbGVyBAhvdXRBbUFtdAgFAXICXzEECG91dFByQW10CAUBcgJfMgQDc3RzCQENcGFyc2VJbnRWYWx1ZQEIBQFyAl85BAVzdGF0ZQgFAXIDXzEwAwMJAQNpZ3MABgkAAAIFA3N0cwUMUG9vbFNodXRkb3duCQACAQkArAICAg9BZG1pbiBibG9ja2VkOiAJAKQDAQUDc3RzCQCXCgUFCG91dEFtQW10BQhvdXRQckFtdAUGcG10QW10BQpwbXRBc3NldElkBQVzdGF0ZQECY3AKBmNhbGxlcgR0eElkB2FtQXNQbXQHcHJBc1BtdAhzbGlwcGFnZQZlbWl0THAKaXNPbmVBc3NldBB2YWxpZGF0ZVNsaXBwYWdlBnBtdEFtdAVwbXRJZAQBcgkBA2Vwbw0FBHR4SWQFCHNsaXBwYWdlCAkBBXZhbHVlAQUHYW1Bc1BtdAZhbW91bnQICQEFdmFsdWUBBQdhbUFzUG10B2Fzc2V0SWQICQEFdmFsdWUBBQdwckFzUG10BmFtb3VudAgJAQV2YWx1ZQEFB3ByQXNQbXQHYXNzZXRJZAUGY2FsbGVyCQAAAgUEdHhJZAIABQZlbWl0THAFCmlzT25lQXNzZXQFEHZhbGlkYXRlU2xpcHBhZ2UFBnBtdEFtdAUFcG10SWQEA3N0cwkBDXBhcnNlSW50VmFsdWUBCAUBcgJfOAMDAwkBA2lncwAGCQAAAgUDc3RzBQpQb29sUHV0RGlzBgkAAAIFA3N0cwUMUG9vbFNodXRkb3duCQACAQkArAICAghCbG9ja2VkOgkApAMBBQNzdHMFAXIBBGdldEQBAnhwBAFuBQRiaWcyBAN4cDAJAJEDAgUCeHAAAAQDeHAxCQCRAwIFAnhwAAEECmFQcmVjaXNpb24JAKcDAQUFQW11bHQEAWEJALkCAgkApwMBBQFBBQphUHJlY2lzaW9uBAFzCQC3AgIFA3hwMAUDeHAxAwkAAAIFAXMFBGJpZzAFBGJpZzAEA2FubgkAuQICBQFhBQFuBAt4cDBfeHAxX25fbgkAuQICCQC5AgIJALkCAgUDeHAwBQN4cDEFAW4FAW4EEGFubl9zX2FQcmVjaXNpb24JALoCAgkAuQICBQNhbm4FAXMFCmFQcmVjaXNpb24EDmFubl9hUHJlY2lzaW9uCQC4AgIFA2FubgUKYVByZWNpc2lvbgQCbjEJALcCAgUBbgUEYmlnMQoBBGNhbGMCA2FjYwNjdXIEDSR0MDIxNDA2MjE0MjYFA2FjYwQBZAgFDSR0MDIxNDA2MjE0MjYCXzEEBWZvdW5kCAUNJHQwMjE0MDYyMTQyNgJfMgMJAQIhPQIFBWZvdW5kBQR1bml0BQNhY2MEAmRwCQC6AgIJALkCAgkAuQICBQFkBQFkBQFkBQt4cDBfeHAxX25fbgQFZE5leHQJALoCAgkAuQICCQC3AgIFEGFubl9zX2FQcmVjaXNpb24JALkCAgUCZHAFAW4FAWQJALcCAgkAugICCQC5AgIFDmFubl9hUHJlY2lzaW9uBQFkBQphUHJlY2lzaW9uCQC5AgIFAm4xBQJkcAQFZERpZmYJAQlhYnNCaWdJbnQBCQC4AgIFBWROZXh0CQEFdmFsdWUBBQFkAwkAwAICBQRiaWcxBQVkRGlmZgkAlAoCBQVkTmV4dAUDY3VyCQCUCgIFBWROZXh0BQR1bml0BANhcnIJAMwIAgAACQDMCAIAAQkAzAgCAAIJAMwIAgADCQDMCAIABAkAzAgCAAUJAMwIAgAGCQDMCAIABwkAzAgCAAgJAMwIAgAJCQDMCAIACgkAzAgCAAsJAMwIAgAMCQDMCAIADQkAzAgCAA4FA25pbAQNJHQwMjE4NDcyMTg5NAoAAiRsBQNhcnIKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIFAXMFBHVuaXQKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBBGNhbGMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDE1CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPBAFkCAUNJHQwMjE4NDcyMTg5NAJfMQQFZm91bmQIBQ0kdDAyMTg0NzIxODk0Al8yAwkBAiE9AgUFZm91bmQFBHVuaXQFAWQJAAIBCQCsAgICGUQgY2FsY3VsYXRpb24gZXJyb3IsIEQgPSAJAKYDAQUBZAEFZ2V0WUQDAnhwAWkBRAQBbgUEYmlnMgQBeAkAkQMCBQJ4cAMJAAACBQFpAAAAAQAABAphUHJlY2lzaW9uCQCnAwEFBUFtdWx0BAFhCQC5AgIJAKcDAQUBQQUKYVByZWNpc2lvbgQBcwUBeAQDYW5uCQC5AgIFAWEFAW4EAWMJALoCAgkAuQICCQC5AgIJALoCAgkAuQICBQFEBQFECQC5AgIFAXgFAW4FAUQFCmFQcmVjaXNpb24JALkCAgUDYW5uBQFuBAFiCQC4AgIJALcCAgUBcwkAugICCQC5AgIFAUQFCmFQcmVjaXNpb24FA2FubgUBRAoBBGNhbGMCA2FjYwNjdXIEDSR0MDIyMzk0MjI0MTQFA2FjYwQBeQgFDSR0MDIyMzk0MjI0MTQCXzEEBWZvdW5kCAUNJHQwMjIzOTQyMjQxNAJfMgMJAQIhPQIFBWZvdW5kBQR1bml0BQNhY2MEBXlOZXh0CQC6AgIJALcCAgkAuQICBQF5BQF5BQFjCQC3AgIJALkCAgUEYmlnMgUBeQUBYgQFeURpZmYJAQlhYnNCaWdJbnQBCQC4AgIFBXlOZXh0CQEFdmFsdWUBBQF5AwkAwAICBQRiaWcxBQV5RGlmZgkAlAoCBQV5TmV4dAUDY3VyCQCUCgIFBXlOZXh0BQR1bml0BANhcnIJAMwIAgAACQDMCAIAAQkAzAgCAAIJAMwIAgADCQDMCAIABAkAzAgCAAUJAMwIAgAGCQDMCAIABwkAzAgCAAgJAMwIAgAJCQDMCAIACgkAzAgCAAsJAMwIAgAMCQDMCAIADQkAzAgCAA4FA25pbAQNJHQwMjI3MjEyMjc2OAoAAiRsBQNhcnIKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIFAUQFBHVuaXQKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBBGNhbGMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDE1CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPBAF5CAUNJHQwMjI3MjEyMjc2OAJfMQQFZm91bmQIBQ0kdDAyMjcyMTIyNzY4Al8yAwkBAiE9AgUFZm91bmQFBHVuaXQFAXkJAAIBCQCsAgICGVkgY2FsY3VsYXRpb24gZXJyb3IsIFkgPSAJAKYDAQUBeQENY2FsY1B1dE9uZVRrbgQJcG10QW10UmF3CnBtdEFzc2V0SWQLdXNlckFkZHJlc3MEdHhJZAQKcG9vbENvbmZpZwkBA2dwYwAEBGFtSWQJAJEDAgUKcG9vbENvbmZpZwUJaWR4QW1Bc0lkBARwcklkCQCRAwIFCnBvb2xDb25maWcFCWlkeFByQXNJZAQEbHBJZAkAkQMCBQpwb29sQ29uZmlnBQlpZHhMUEFzSWQEBmFtdERjbQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCnBvb2xDb25maWcFC2lkeEFtdEFzRGNtBAhwcmljZURjbQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCnBvb2xDb25maWcFDWlkeFByaWNlQXNEY20ED2xwQXNzZXRFbWlzc2lvbgkAtgIBCAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDsBwEJANkEAQUEbHBJZAIQaW52YWxpZCBscCBhc3NldAhxdWFudGl0eQQNY2hlY2hFbWlzc2lvbgMJAL8CAgUPbHBBc3NldEVtaXNzaW9uBQRiaWcwBgkAAgECImluaXRpYWwgZGVwb3NpdCByZXF1aXJlcyBhbGwgY29pbnMDCQAAAgUNY2hlY2hFbWlzc2lvbgUNY2hlY2hFbWlzc2lvbgQJYW1CYWxhbmNlCQENZ2V0QWNjQmFsYW5jZQEFBGFtSWQECXByQmFsYW5jZQkBDWdldEFjY0JhbGFuY2UBBQRwcklkBA0kdDAyMzUyNzIzOTg5AwkAAAIFBHR4SWQCAAkAlAoCBQlhbUJhbGFuY2UFCXByQmFsYW5jZQMJAAACBQpwbXRBc3NldElkBQRhbUlkAwkAZgIFCXBtdEFtdFJhdwUJYW1CYWxhbmNlCQACAQIWaW52YWxpZCBwYXltZW50IGFtb3VudAkAlAoCCQBlAgUJYW1CYWxhbmNlBQlwbXRBbXRSYXcFCXByQmFsYW5jZQMJAAACBQpwbXRBc3NldElkBQRwcklkAwkAZgIFCXBtdEFtdFJhdwUJcHJCYWxhbmNlCQACAQIWaW52YWxpZCBwYXltZW50IGFtb3VudAkAlAoCBQlhbUJhbGFuY2UJAGUCBQlwckJhbGFuY2UFCXBtdEFtdFJhdwkAAgECEHdyb25nIHBtdEFzc2V0SWQEDGFtQmFsYW5jZU9sZAgFDSR0MDIzNTI3MjM5ODkCXzEEDHByQmFsYW5jZU9sZAgFDSR0MDIzNTI3MjM5ODkCXzIEDSR0MDIzOTk1MjQxNzEDCQAAAgUKcG10QXNzZXRJZAUEYW1JZAkAlAoCBQlwbXRBbXRSYXcAAAMJAAACBQpwbXRBc3NldElkBQRwcklkCQCUCgIAAAUJcG10QW10UmF3CQACAQIPaW52YWxpZCBwYXltZW50BAthbUFtb3VudFJhdwgFDSR0MDIzOTk1MjQxNzECXzEEC3ByQW1vdW50UmF3CAUNJHQwMjM5OTUyNDE3MQJfMgQIYW1BbW91bnQICQEHdGFrZUZlZQEFC2FtQW1vdW50UmF3Al8xBAhwckFtb3VudAgJAQd0YWtlRmVlAQULcHJBbW91bnRSYXcCXzEECWZlZUFtb3VudAgJAQd0YWtlRmVlAQUJcG10QW10UmF3Al8yBAxhbUJhbGFuY2VOZXcJAGQCBQxhbUJhbGFuY2VPbGQFCGFtQW1vdW50BAxwckJhbGFuY2VOZXcJAGQCBQxwckJhbGFuY2VPbGQFCHByQW1vdW50BAJEMAkBBGdldEQBCQDMCAIJALYCAQUMYW1CYWxhbmNlT2xkCQDMCAIJALYCAQUMcHJCYWxhbmNlT2xkBQNuaWwEAkQxCQEEZ2V0RAEJAMwIAgkAtgIBBQxhbUJhbGFuY2VOZXcJAMwIAgkAtgIBBQxwckJhbGFuY2VOZXcFA25pbAQGY2hlY2tEAwkAvwICBQJEMQUCRDAGCQEFdGhyb3cAAwkAAAIFBmNoZWNrRAUGY2hlY2tEBAhscEFtb3VudAkAvAIDBQ9scEFzc2V0RW1pc3Npb24JALgCAgUCRDEFAkQwBQJEMAQIY3VyUHJpY2UJAQJmMQIJAQRjcGJpAgkBAnQxAgUMcHJCYWxhbmNlTmV3BQhwcmljZURjbQkBAnQxAgUMYW1CYWxhbmNlTmV3BQZhbXREY20FBnNjYWxlOAQLY29tbW9uU3RhdGUJAMwIAgkBDEludGVnZXJFbnRyeQIJAQJwbAAFCGN1clByaWNlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECcGgCBQZoZWlnaHQIBQlsYXN0QmxvY2sJdGltZXN0YW1wBQhjdXJQcmljZQkAzAgCCQELU3RyaW5nRW50cnkCCQEDcGF1AgULdXNlckFkZHJlc3MFBHR4SWQJARFkYXRhUHV0QWN0aW9uSW5mbwoFC2FtQW1vdW50UmF3BQtwckFtb3VudFJhdwkAoAMBBQhscEFtb3VudAUIY3VyUHJpY2UAAAAABQZoZWlnaHQIBQlsYXN0QmxvY2sJdGltZXN0YW1wAAAAAAUDbmlsBA5wb29sUHJvcG9ydGlvbgkAawMFDHByQmFsYW5jZU9sZAUGc2NhbGU4BQxhbUJhbGFuY2VPbGQED2Ftb3VudEFzc2V0UGFydAkAawMFCXBtdEFtdFJhdwUGc2NhbGU4CQBkAgUOcG9vbFByb3BvcnRpb24FBnNjYWxlOAQOcHJpY2VBc3NldFBhcnQJAGUCBQlwbXRBbXRSYXcFD2Ftb3VudEFzc2V0UGFydAQJbHBBbXRCb3RoCQC8AgMFD2xwQXNzZXRFbWlzc2lvbgkAtgIBBQ5wcmljZUFzc2V0UGFydAkAtgIBBQxwckJhbGFuY2VPbGQEBWJvbnVzCQCgAwEJALwCAwkAuAICBQhscEFtb3VudAUJbHBBbXRCb3RoBQxzY2FsZThCaWdJbnQFCWxwQW10Qm90aAkAlgoECQCgAwEFCGxwQW1vdW50BQtjb21tb25TdGF0ZQUJZmVlQW1vdW50BQVib251cwkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgETZ2V0T25lVGtuVjJJbnRlcm5hbAYKb3V0QXNzZXRJZAxtaW5PdXRBbW91bnQIcGF5bWVudHMGY2FsbGVyDG9yaWdpbkNhbGxlcg10cmFuc2FjdGlvbklkAwkBAiE9AgkAkAMBBQhwYXltZW50cwABCQACAQILMSBwbW50IGV4cGQECnBvb2xDb25maWcJAQNncGMABARscElkCQCRAwIFCnBvb2xDb25maWcFCWlkeExQQXNJZAQEYW1JZAkAkQMCBQpwb29sQ29uZmlnBQlpZHhBbUFzSWQEBHBySWQJAJEDAgUKcG9vbENvbmZpZwUJaWR4UHJBc0lkBAphbURlY2ltYWxzCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUKcG9vbENvbmZpZwULaWR4QW10QXNEY20ECnByRGVjaW1hbHMJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQpwb29sQ29uZmlnBQ1pZHhQcmljZUFzRGNtBApwb29sU3RhdHVzCQCRAwIFCnBvb2xDb25maWcFCWlkeFBvb2xTdAQLdXNlckFkZHJlc3MDCQAAAgUGY2FsbGVyBQxyZXN0Q29udHJhY3QFDG9yaWdpbkNhbGxlcgUGY2FsbGVyBANwbXQJAQV2YWx1ZQEJAJEDAgUIcGF5bWVudHMAAAQKcG10QXNzZXRJZAkBBXZhbHVlAQgFA3BtdAdhc3NldElkBAZwbXRBbXQIBQNwbXQGYW1vdW50AwkAZgIAgJTr3AMFBnBtdEFtdAkAAgECDU1pbiBwbXQgMTAgTFAEBnR4SWQ1OAkA2AQBBQ10cmFuc2FjdGlvbklkAwkBAiE9AgUEbHBJZAkA2AQBBQpwbXRBc3NldElkCQACAQIIV3JvbmcgTFAECWFtQmFsYW5jZQkBDWdldEFjY0JhbGFuY2UBBQRhbUlkBAlwckJhbGFuY2UJAQ1nZXRBY2NCYWxhbmNlAQUEcHJJZAQNJHQwMjY0MjIyNjUzMAoAAUAJAPwHBAUEdGhpcwITZ2V0T25lVGtuVjJSRUFET05MWQkAzAgCBQpvdXRBc3NldElkCQDMCAIFBnBtdEFtdAUDbmlsBQNuaWwDCQABAgUBQAIKKEludCwgSW50KQUBQAkAAgEJAKwCAgkAAwEFAUACHyBjb3VsZG4ndCBiZSBjYXN0IHRvIChJbnQsIEludCkECHRvdGFsR2V0CAUNJHQwMjY0MjIyNjUzMAJfMQQJZmVlQW1vdW50CAUNJHQwMjY0MjIyNjUzMAJfMgQLdG90YWxBbW91bnQDAwkAZgIFDG1pbk91dEFtb3VudAAACQBmAgUMbWluT3V0QW1vdW50BQh0b3RhbEdldAcJAAIBCQC5CQIJAMwIAgIfYW1vdW50IHRvIHJlY2VpdmUgaXMgbGVzcyB0aGFuIAkAzAgCCQCkAwEFDG1pbk91dEFtb3VudAUDbmlsAgAFCHRvdGFsR2V0BA0kdDAyNjcxNzI3MDI0AwkAAAIFCm91dEFzc2V0SWQFBGFtSWQJAJYKBAULdG90YWxBbW91bnQAAAkAZQIJAGUCBQlhbUJhbGFuY2UFC3RvdGFsQW1vdW50BQlmZWVBbW91bnQFCXByQmFsYW5jZQMJAAACBQpvdXRBc3NldElkBQRwcklkCQCWCgQAAAULdG90YWxBbW91bnQFCWFtQmFsYW5jZQkAZQIJAGUCBQlwckJhbGFuY2UFC3RvdGFsQW1vdW50BQlmZWVBbW91bnQJAAIBAhRpbnZhbGlkIG91dCBhc3NldCBpZAQFb3V0QW0IBQ0kdDAyNjcxNzI3MDI0Al8xBAVvdXRQcggFDSR0MDI2NzE3MjcwMjQCXzIEDGFtQmFsYW5jZU5ldwgFDSR0MDI2NzE3MjcwMjQCXzMEDHByQmFsYW5jZU5ldwgFDSR0MDI2NzE3MjcwMjQCXzQECGN1clByWDE4CQEEY3BiaQIJAQJ0MQIFDHByQmFsYW5jZU5ldwUKcHJEZWNpbWFscwkBAnQxAgUMYW1CYWxhbmNlTmV3BQphbURlY2ltYWxzBAVjdXJQcgkBAmYxAgUIY3VyUHJYMTgFBnNjYWxlOAQRb3V0QXNzZXRJZE9yV2F2ZXMDCQAAAgUKb3V0QXNzZXRJZAIFV0FWRVMFBHVuaXQJANkEAQUKb3V0QXNzZXRJZAQQc2VuZEZlZVRvTWF0Y2hlcgMJAGYCBQlmZWVBbW91bnQAAAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBRNmZWVDb2xsZWN0b3JBZGRyZXNzBQlmZWVBbW91bnQFEW91dEFzc2V0SWRPcldhdmVzBQNuaWwFA25pbAQFc3RhdGUJAM4IAgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQt1c2VyQWRkcmVzcwULdG90YWxBbW91bnQFEW91dEFzc2V0SWRPcldhdmVzCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQNnYXUCCQClCAEFC3VzZXJBZGRyZXNzBQZ0eElkNTgJARFkYXRhR2V0QWN0aW9uSW5mbwYFBW91dEFtBQVvdXRQcgUGcG10QW10BQVjdXJQcgUGaGVpZ2h0CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAnBsAAUFY3VyUHIJAMwIAgkBDEludGVnZXJFbnRyeQIJAQJwaAIFBmhlaWdodAgFCWxhc3RCbG9jawl0aW1lc3RhbXAFBWN1clByBQNuaWwFEHNlbmRGZWVUb01hdGNoZXIDCQAAAgUFc3RhdGUFBXN0YXRlBARidXJuCQD8BwQFA2ZjYQIEYnVybgkAzAgCBQZwbXRBbXQFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUKcG10QXNzZXRJZAUGcG10QW10BQNuaWwDCQAAAgUEYnVybgUEYnVybgkAlAoCBQVzdGF0ZQULdG90YWxBbW91bnQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BAW0ABAckbWF0Y2gwCQCiCAEJAQNtcGsAAwkAAQIFByRtYXRjaDACBlN0cmluZwQBcwUHJG1hdGNoMAkA2QQBBQFzAwkAAQIFByRtYXRjaDACBFVuaXQFBHVuaXQJAAIBAgtNYXRjaCBlcnJvcgECcG0ABAckbWF0Y2gwCQCiCAEJAQRwbXBrAAMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXMFByRtYXRjaDAJANkEAQUBcwMJAAECBQckbWF0Y2gwAgRVbml0BQR1bml0CQACAQILTWF0Y2ggZXJyb3IAAnBkCQACAQIRUGVybWlzc2lvbiBkZW5pZWQBAm1tAQFpBAckbWF0Y2gwCQEBbQADCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQCcGsFByRtYXRjaDADCQAAAggFAWkPY2FsbGVyUHVibGljS2V5BQJwawYFAnBkAwkAAQIFByRtYXRjaDACBFVuaXQDCQAAAggFAWkGY2FsbGVyBQR0aGlzBgUCcGQJAAIBAgtNYXRjaCBlcnJvchoBaQELY29uc3RydWN0b3IBAmZjBAFjCQECbW0BBQFpAwkAAAIFAWMFAWMJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmZjAAUCZmMFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQpzZXRNYW5hZ2VyARdwZW5kaW5nTWFuYWdlclB1YmxpY0tleQQBYwkBAm1tAQUBaQMJAAACBQFjBQFjBAJjbQkA2QQBBRdwZW5kaW5nTWFuYWdlclB1YmxpY0tleQMJAAACBQJjbQUCY20JAMwIAgkBC1N0cmluZ0VudHJ5AgkBBHBtcGsABRdwZW5kaW5nTWFuYWdlclB1YmxpY0tleQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDmNvbmZpcm1NYW5hZ2VyAAQBcAkBAnBtAAQDaHBtAwkBCWlzRGVmaW5lZAEFAXAGCQACAQISTm8gcGVuZGluZyBtYW5hZ2VyAwkAAAIFA2hwbQUDaHBtBANjcG0DCQAAAggFAWkPY2FsbGVyUHVibGljS2V5CQEFdmFsdWUBBQFwBgkAAgECG1lvdSBhcmUgbm90IHBlbmRpbmcgbWFuYWdlcgMJAAACBQNjcG0FA2NwbQkAzAgCCQELU3RyaW5nRW50cnkCCQEDbXBrAAkA2AQBCQEFdmFsdWUBBQFwCQDMCAIJAQtEZWxldGVFbnRyeQEJAQRwbXBrAAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBA3B1dAIEc2xpcAlhdXRvU3Rha2UEB2ZhY3RDZmcJAQNnZmMABAtzdGFraW5nQ250cgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUHZmFjdENmZwUPaWR4RmFjdFN0YWtDbnRyAgpXciBzdCBhZGRyBAhzbGlwQ250cgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUHZmFjdENmZwUQaWR4RmFjdFNsaXBwQ250cgIKV3Igc2wgYWRkcgMJAGYCAAAFBHNsaXAJAAIBAg5Xcm9uZyBzbGlwcGFnZQMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAgkAAgECDDIgcG1udHMgZXhwZAQBZQkBAmNwCgkApQgBCAUBaQZjYWxsZXIJANgEAQgFAWkNdHJhbnNhY3Rpb25JZAkBD0F0dGFjaGVkUGF5bWVudAIICQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAgJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQJAJEDAggFAWkIcGF5bWVudHMAAQUEc2xpcAYHBgAAAgAECWVtaXRMcEFtdAgFAWUCXzIECWxwQXNzZXRJZAgFAWUCXzcEBXN0YXRlCAUBZQJfOQQGYW1EaWZmCAUBZQNfMTAEBnByRGlmZggFAWUDXzExBARhbUlkCAUBZQNfMTIEBHBySWQIBQFlA18xMwQBcgkA/AcEBQNmY2ECBGVtaXQJAMwIAgUJZW1pdExwQW10BQNuaWwFA25pbAMJAAACBQFyBQFyBAJlbAQHJG1hdGNoMAUBcgMJAAECBQckbWF0Y2gwAgdBZGRyZXNzBAZsZWdhY3kFByRtYXRjaDAJAPwHBAUGbGVnYWN5AgRlbWl0CQDMCAIFCWVtaXRMcEFtdAUDbmlsBQNuaWwFBHVuaXQDCQAAAgUCZWwFAmVsBAJzYQMJAGYCBQZhbURpZmYAAAkA/AcEBQhzbGlwQ250cgIDcHV0BQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFBGFtSWQFBmFtRGlmZgUDbmlsBQNuaWwDCQAAAgUCc2EFAnNhBAJzcAMJAGYCBQZwckRpZmYAAAkA/AcEBQhzbGlwQ250cgIDcHV0BQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFBHBySWQFBnByRGlmZgUDbmlsBQNuaWwDCQAAAgUCc3AFAnNwBAhscFRybnNmcgMFCWF1dG9TdGFrZQQCc3MJAPwHBAULc3Rha2luZ0NudHICBXN0YWtlBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFCWxwQXNzZXRJZAUJZW1pdExwQW10BQNuaWwDCQAAAgUCc3MFAnNzBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQllbWl0THBBbXQFCWxwQXNzZXRJZAUDbmlsCQDOCAIFBXN0YXRlBQhscFRybnNmcgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQtwdXRPbmVUa25WMgIMbWluT3V0QW1vdW50CWF1dG9TdGFrZQMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECCzEgcG1udCBleHBkBApwb29sQ29uZmlnCQEDZ3BjAAQEYW1JZAkAkQMCBQpwb29sQ29uZmlnBQlpZHhBbUFzSWQEBHBySWQJAJEDAgUKcG9vbENvbmZpZwUJaWR4UHJBc0lkBARscElkCQDZBAEJAJEDAgUKcG9vbENvbmZpZwUJaWR4TFBBc0lkBAphbURlY2ltYWxzCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUKcG9vbENvbmZpZwULaWR4QW10QXNEY20ECnByRGVjaW1hbHMJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQpwb29sQ29uZmlnBQ1pZHhQcmljZUFzRGNtBAt1c2VyQWRkcmVzcwMJAAACCAUBaQZjYWxsZXIFBHRoaXMIBQFpDG9yaWdpbkNhbGxlcggFAWkGY2FsbGVyBANwbXQJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAQKcG10QXNzZXRJZAkA2AQBCQEFdmFsdWUBCAUDcG10B2Fzc2V0SWQEBnBtdEFtdAgFA3BtdAZhbW91bnQDCQBmAgCAreIEBQZwbXRBbXQJAAIBAg1Xcm9uZyBwbXQgYW10BA0kdDAzMTkwMTMyMDI2CQENY2FsY1B1dE9uZVRrbgQFBnBtdEFtdAUKcG10QXNzZXRJZAkApQgBBQt1c2VyQWRkcmVzcwkA2AQBCAUBaQ10cmFuc2FjdGlvbklkBAdlc3RpbUxQCAUNJHQwMzE5MDEzMjAyNgJfMQQFc3RhdGUIBQ0kdDAzMTkwMTMyMDI2Al8yBAlmZWVBbW91bnQIBQ0kdDAzMTkwMTMyMDI2Al8zBAllbWl0THBBbXQDAwkAZgIFDG1pbk91dEFtb3VudAAACQBmAgUMbWluT3V0QW1vdW50BQdlc3RpbUxQBwkAAgEJALkJAgkAzAgCAh9hbW91bnQgdG8gcmVjZWl2ZSBpcyBsZXNzIHRoYW4gCQDMCAIJAKQDAQUMbWluT3V0QW1vdW50BQNuaWwCAAUHZXN0aW1MUAQBZQkA/AcEBQNmY2ECBGVtaXQJAMwIAgUJZW1pdExwQW10BQNuaWwFA25pbAMJAAACBQFlBQFlBAJlbAQHJG1hdGNoMAUBZQMJAAECBQckbWF0Y2gwAgdBZGRyZXNzBAZsZWdhY3kFByRtYXRjaDAJAPwHBAUGbGVnYWN5AgRlbWl0CQDMCAIFCWVtaXRMcEFtdAUDbmlsBQNuaWwFBHVuaXQDCQAAAgUCZWwFAmVsBAhscFRybnNmcgMFCWF1dG9TdGFrZQQCc3MJAPwHBAUPc3Rha2luZ0NvbnRyYWN0AgVzdGFrZQUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQRscElkBQllbWl0THBBbXQFA25pbAMJAAACBQJzcwUCc3MFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFCWVtaXRMcEFtdAUEbHBJZAUDbmlsBBBzZW5kRmVlVG9NYXRjaGVyAwkAZgIFCWZlZUFtb3VudAAACQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFE2ZlZUNvbGxlY3RvckFkZHJlc3MFCWZlZUFtb3VudAkA2QQBBQpwbXRBc3NldElkBQNuaWwFA25pbAkAlAoCCQDOCAIJAM4IAgUFc3RhdGUFCGxwVHJuc2ZyBRBzZW5kRmVlVG9NYXRjaGVyBQllbWl0THBBbXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEKcHV0Rm9yRnJlZQEHbWF4U2xwZwMJAGYCAAAFB21heFNscGcJAAIBAgpXcm9uZyBzbHBnAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwACCQACAQIMMiBwbW50cyBleHBkBAZlc3RQdXQJAQJjcAoJAKUIAQgFAWkGY2FsbGVyCQDYBAEIBQFpDXRyYW5zYWN0aW9uSWQJAQ9BdHRhY2hlZFBheW1lbnQCCAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQICQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50CQCRAwIIBQFpCHBheW1lbnRzAAEFB21heFNscGcHBwYAAAIACAUGZXN0UHV0Al85AWkBA2dldAAEAXIJAQJjZwEFAWkECW91dEFtdEFtdAgFAXICXzEECG91dFByQW10CAUBcgJfMgQGcG10QW10CAUBcgJfMwQKcG10QXNzZXRJZAgFAXICXzQEBXN0YXRlCAUBcgJfNQQBYgkA/AcEBQNmY2ECBGJ1cm4JAMwIAgUGcG10QW10BQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFCnBtdEFzc2V0SWQFBnBtdEFtdAUDbmlsAwkAAAIFAWIFAWIFBXN0YXRlCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBC2dldE9uZVRrblYyAgpvdXRBc3NldElkDG1pbk91dEFtb3VudAQNJHQwMzQyMDkzNDM2NAkBE2dldE9uZVRrblYySW50ZXJuYWwGBQpvdXRBc3NldElkBQxtaW5PdXRBbW91bnQIBQFpCHBheW1lbnRzCAUBaQZjYWxsZXIIBQFpDG9yaWdpbkNhbGxlcggFAWkNdHJhbnNhY3Rpb25JZAQFc3RhdGUIBQ0kdDAzNDIwOTM0MzY0Al8xBAt0b3RhbEFtb3VudAgFDSR0MDM0MjA5MzQzNjQCXzIJAJQKAgUFc3RhdGUFC3RvdGFsQW1vdW50AWkBE2dldE9uZVRrblYyUkVBRE9OTFkCCm91dEFzc2V0SWQNbHBBc3NldEFtb3VudAQKcG9vbENvbmZpZwkBA2dwYwAEBGFtSWQJAJEDAgUKcG9vbENvbmZpZwUJaWR4QW1Bc0lkBARwcklkCQCRAwIFCnBvb2xDb25maWcFCWlkeFByQXNJZAQEbHBJZAkAkQMCBQpwb29sQ29uZmlnBQlpZHhMUEFzSWQEAnhwCQDMCAIJALYCAQkBDWdldEFjY0JhbGFuY2UBBQRhbUlkCQDMCAIJALYCAQkBDWdldEFjY0JhbGFuY2UBBQRwcklkBQNuaWwECmxwRW1pc3Npb24JALYCAQgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkA7AcBCQDZBAEFBGxwSWQCEGludmFsaWQgbHAgYXNzZXQIcXVhbnRpdHkEAkQwCQEEZ2V0RAEFAnhwBAJEMQkAuAICBQJEMAkAvAIDCQC2AgEFDWxwQXNzZXRBbW91bnQFAkQwBQpscEVtaXNzaW9uBAVpbmRleAMJAAACBQpvdXRBc3NldElkBQRhbUlkAAADCQAAAgUKb3V0QXNzZXRJZAUEcHJJZAABCQACAQIUaW52YWxpZCBvdXQgYXNzZXQgaWQEBG5ld1kJAQVnZXRZRAMFAnhwBQVpbmRleAUCRDEEAmR5CQC4AgIJAJEDAgUCeHAFBWluZGV4BQRuZXdZBAt0b3RhbEdldFJhdwkAoAMBCQC4AgIFAmR5BQRiaWcxBA0kdDAzNTE0MzM1MTkyCQEHdGFrZUZlZQEFC3RvdGFsR2V0UmF3BAh0b3RhbEdldAgFDSR0MDM1MTQzMzUxOTICXzEECWZlZUFtb3VudAgFDSR0MDM1MTQzMzUxOTICXzIJAJQKAgUDbmlsCQCUCgIFCHRvdGFsR2V0BQlmZWVBbW91bnQBaQEcZ2V0T25lVGtuVjJXaXRoQm9udXNSRUFET05MWQIKb3V0QXNzZXRJZA1scEFzc2V0QW1vdW50BApwb29sQ29uZmlnCQEDZ3BjAAQEYW1JZAkAkQMCBQpwb29sQ29uZmlnBQlpZHhBbUFzSWQEBHBySWQJAJEDAgUKcG9vbENvbmZpZwUJaWR4UHJBc0lkBARscElkCQCRAwIFCnBvb2xDb25maWcFCWlkeExQQXNJZAQJYW1CYWxhbmNlCQENZ2V0QWNjQmFsYW5jZQEFBGFtSWQECXByQmFsYW5jZQkBDWdldEFjY0JhbGFuY2UBBQRwcklkBA0kdDAzNTUzNzM1NjUyCgABQAkA/AcEBQR0aGlzAhNnZXRPbmVUa25WMlJFQURPTkxZCQDMCAIFCm91dEFzc2V0SWQJAMwIAgUNbHBBc3NldEFtb3VudAUDbmlsBQNuaWwDCQABAgUBQAIKKEludCwgSW50KQUBQAkAAgEJAKwCAgkAAwEFAUACHyBjb3VsZG4ndCBiZSBjYXN0IHRvIChJbnQsIEludCkECHRvdGFsR2V0CAUNJHQwMzU1MzczNTY1MgJfMQQJZmVlQW1vdW50CAUNJHQwMzU1MzczNTY1MgJfMgQBcgkBA2VnbwQCAAUEbHBJZAUNbHBBc3NldEFtb3VudAUEdGhpcwQIb3V0QW1BbXQIBQFyAl8xBAhvdXRQckFtdAgFAXICXzIEDnN1bU9mR2V0QXNzZXRzCQBkAgUIb3V0QW1BbXQFCG91dFByQW10BAVib251cwkAawMJAGUCBQh0b3RhbEdldAUOc3VtT2ZHZXRBc3NldHMFBnNjYWxlOAUOc3VtT2ZHZXRBc3NldHMJAJQKAgUDbmlsCQCVCgMFCHRvdGFsR2V0BQlmZWVBbW91bnQFBWJvbnVzAWkBCWdldE5vTGVzcwISbm9MZXNzVGhlbkFtdEFzc2V0FG5vTGVzc1RoZW5QcmljZUFzc2V0BAFyCQECY2cBBQFpBAhvdXRBbUFtdAgFAXICXzEECG91dFByQW10CAUBcgJfMgQGcG10QW10CAUBcgJfMwQKcG10QXNzZXRJZAgFAXICXzQEBXN0YXRlCAUBcgJfNQMJAGYCBRJub0xlc3NUaGVuQW10QXNzZXQFCG91dEFtQW10CQACAQkArAICCQCsAgIJAKwCAgIJRmFpbGVkOiAgCQCkAwEFCG91dEFtQW10AgMgPCAJAKQDAQUSbm9MZXNzVGhlbkFtdEFzc2V0AwkAZgIFFG5vTGVzc1RoZW5QcmljZUFzc2V0BQhvdXRQckFtdAkAAgEJAKwCAgkArAICCQCsAgICCEZhaWxlZDogCQCkAwEFCG91dFByQW10AgMgPCAJAKQDAQUUbm9MZXNzVGhlblByaWNlQXNzZXQEFGJ1cm5MUEFzc2V0T25GYWN0b3J5CQD8BwQFA2ZjYQIEYnVybgkAzAgCBQZwbXRBbXQFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUKcG10QXNzZXRJZAUGcG10QW10BQNuaWwDCQAAAgUUYnVybkxQQXNzZXRPbkZhY3RvcnkFFGJ1cm5MUEFzc2V0T25GYWN0b3J5BQVzdGF0ZQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQ11bnN0YWtlQW5kR2V0AQZhbW91bnQEDWNoZWNrUGF5bWVudHMDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAAJAAIBAg1ObyBwbW50cyBleHBkBgMJAAACBQ1jaGVja1BheW1lbnRzBQ1jaGVja1BheW1lbnRzBANjZmcJAQNncGMABApmYWN0b3J5Q2ZnCQEDZ2ZjAAQJbHBBc3NldElkCQDZBAEJAJEDAgUDY2ZnBQlpZHhMUEFzSWQEB3N0YWtpbmcJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIFCmZhY3RvcnlDZmcFD2lkeEZhY3RTdGFrQ250cgIKV3Igc3QgYWRkcgQKdW5zdGFrZUludgkA/AcEBQdzdGFraW5nAgd1bnN0YWtlCQDMCAIJANgEAQUJbHBBc3NldElkCQDMCAIFBmFtb3VudAUDbmlsBQNuaWwDCQAAAgUKdW5zdGFrZUludgUKdW5zdGFrZUludgQBcgkBA2VnbwQJANgEAQgFAWkNdHJhbnNhY3Rpb25JZAkA2AQBBQlscEFzc2V0SWQFBmFtb3VudAgFAWkGY2FsbGVyBANzdHMJAQ1wYXJzZUludFZhbHVlAQgFAXICXzkEBXN0YXRlCAUBcgNfMTAEAXYDAwkBA2lncwAGCQAAAgUDc3RzBQxQb29sU2h1dGRvd24JAAIBCQCsAgICCUJsb2NrZWQ6IAkApAMBBQNzdHMGAwkAAAIFAXYFAXYEBWJ1cm5BCQD8BwQFA2ZjYQIEYnVybgkAzAgCBQZhbW91bnQFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUJbHBBc3NldElkBQZhbW91bnQFA25pbAMJAAACBQVidXJuQQUFYnVybkEFBXN0YXRlCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBFXVuc3Rha2VBbmRHZXRPbmVUa25WMgMNdW5zdGFrZUFtb3VudApvdXRBc3NldElkDG1pbk91dEFtb3VudAQNY2hlY2tQYXltZW50cwMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAAkAAgECDU5vIHBtbnRzIGV4cGQGAwkAAAIFDWNoZWNrUGF5bWVudHMFDWNoZWNrUGF5bWVudHMEA2NmZwkBA2dwYwAECmZhY3RvcnlDZmcJAQNnZmMABAlscEFzc2V0SWQJANkEAQkAkQMCBQNjZmcFCWlkeExQQXNJZAQHc3Rha2luZwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUKZmFjdG9yeUNmZwUPaWR4RmFjdFN0YWtDbnRyAgpXciBzdCBhZGRyBAp1bnN0YWtlSW52CQD8BwQFB3N0YWtpbmcCB3Vuc3Rha2UJAMwIAgkA2AQBBQlscEFzc2V0SWQJAMwIAgUNdW5zdGFrZUFtb3VudAUDbmlsBQNuaWwDCQAAAgUKdW5zdGFrZUludgUKdW5zdGFrZUludgQNJHQwMzc5NTkzODE0NwkBE2dldE9uZVRrblYySW50ZXJuYWwGBQpvdXRBc3NldElkBQxtaW5PdXRBbW91bnQJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFCWxwQXNzZXRJZAUNdW5zdGFrZUFtb3VudAUDbmlsCAUBaQZjYWxsZXIIBQFpDG9yaWdpbkNhbGxlcggFAWkNdHJhbnNhY3Rpb25JZAQFc3RhdGUIBQ0kdDAzNzk1OTM4MTQ3Al8xBAt0b3RhbEFtb3VudAgFDSR0MDM3OTU5MzgxNDcCXzIJAJQKAgUFc3RhdGUFC3RvdGFsQW1vdW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBHHB1dE9uZVRrblYyV2l0aEJvbnVzUkVBRE9OTFkCEHBheW1lbnRBbW91bnRSYXcOcGF5bWVudEFzc2V0SWQECnBvb2xDb25maWcJAQNncGMABARhbUlkCQCRAwIFCnBvb2xDb25maWcFCWlkeEFtQXNJZAQEcHJJZAkAkQMCBQpwb29sQ29uZmlnBQlpZHhQckFzSWQEBGxwSWQJAJEDAgUKcG9vbENvbmZpZwUJaWR4TFBBc0lkBA0kdDAzODQwNjM4NTAzCQENY2FsY1B1dE9uZVRrbgQFEHBheW1lbnRBbW91bnRSYXcFDnBheW1lbnRBc3NldElkAgACAAQIbHBBbW91bnQIBQ0kdDAzODQwNjM4NTAzAl8xBAVzdGF0ZQgFDSR0MDM4NDA2Mzg1MDMCXzIECWZlZUFtb3VudAgFDSR0MDM4NDA2Mzg1MDMCXzMEBWJvbnVzCAUNJHQwMzg0MDYzODUwMwJfNAkAlAoCBQNuaWwJAJUKAwUIbHBBbW91bnQFCWZlZUFtb3VudAUFYm9udXMBaQEIYWN0aXZhdGUCCGFtdEFzU3RyB3ByQXNTdHIDCQECIT0CCQClCAEIBQFpBmNhbGxlcgkApQgBBQNmY2EJAAIBAgZkZW5pZWQJAJQKAgkAzAgCCQELU3RyaW5nRW50cnkCCQECYWEABQhhbXRBc1N0cgkAzAgCCQELU3RyaW5nRW50cnkCCQECcGEABQdwckFzU3RyBQNuaWwCB3N1Y2Nlc3MBaQEEc2V0UwIBawF2AwkBAiE9AgkApQgBCAUBaQZjYWxsZXIJAQRzdHJmAgUEdGhpcwkBA2FkYQAFAnBkCQDMCAIJAQtTdHJpbmdFbnRyeQIFAWsFAXYFA25pbAFpAQRzZXRJAgFrAXYDCQECIT0CCQClCAEIBQFpBmNhbGxlcgkBBHN0cmYCBQR0aGlzCQEDYWRhAAUCcGQJAMwIAgkBDEludGVnZXJFbnRyeQIFAWsFAXYFA25pbAFpARxnZXRQb29sQ29uZmlnV3JhcHBlclJFQURPTkxZAAkAlAoCBQNuaWwJAQNncGMAAWkBHGdldEFjY0JhbGFuY2VXcmFwcGVyUkVBRE9OTFkBB2Fzc2V0SWQJAJQKAgUDbmlsCQENZ2V0QWNjQmFsYW5jZQEFB2Fzc2V0SWQBaQEZY2FsY1ByaWNlc1dyYXBwZXJSRUFET05MWQMFYW1BbXQFcHJBbXQFbHBBbXQEAnByCQEKY2FsY1ByaWNlcwMFBWFtQW10BQVwckFtdAUFbHBBbXQJAJQKAgUDbmlsCQDMCAIJAKYDAQkAkQMCBQJwcgAACQDMCAIJAKYDAQkAkQMCBQJwcgABCQDMCAIJAKYDAQkAkQMCBQJwcgACBQNuaWwBaQEWZnJvbVgxOFdyYXBwZXJSRUFET05MWQIDdmFsDHJlc1NjYWxlTXVsdAkAlAoCBQNuaWwJAQJmMQIJAKcDAQUDdmFsBQxyZXNTY2FsZU11bHQBaQEUdG9YMThXcmFwcGVyUkVBRE9OTFkCB29yaWdWYWwNb3JpZ1NjYWxlTXVsdAkAlAoCBQNuaWwJAKYDAQkBAnQxAgUHb3JpZ1ZhbAUNb3JpZ1NjYWxlTXVsdAFpAR5jYWxjUHJpY2VCaWdJbnRXcmFwcGVyUkVBRE9OTFkCCHByQW10WDE4CGFtQW10WDE4CQCUCgIFA25pbAkApgMBCQEEY3BiaQIJAKcDAQUIcHJBbXRYMTgJAKcDAQUIYW1BbXRYMTgBaQEjZXN0aW1hdGVQdXRPcGVyYXRpb25XcmFwcGVyUkVBRE9OTFkJBnR4SWQ1OAhzbGlwcGFnZQdpbkFtQW10BmluQW1JZAdpblByQW10BmluUHJJZAd1c3JBZGRyBmlzRXZhbAZlbWl0THAJAJQKAgUDbmlsCQEDZXBvDQUGdHhJZDU4BQhzbGlwcGFnZQUHaW5BbUFtdAUGaW5BbUlkBQdpblByQW10BQZpblBySWQFB3VzckFkZHIFBmlzRXZhbAUGZW1pdExwBgcAAAIAAWkBI2VzdGltYXRlR2V0T3BlcmF0aW9uV3JhcHBlclJFQURPTkxZBAZ0eElkNTgHcG10QXNJZAhwbXRMcEFtdAd1c3JBZGRyBAFyCQEDZWdvBAUGdHhJZDU4BQdwbXRBc0lkBQhwbXRMcEFtdAkBEUBleHRyTmF0aXZlKDEwNjIpAQUHdXNyQWRkcgkAlAoCBQNuaWwJAJwKCggFAXICXzEIBQFyAl8yCAUBcgJfMwgFAXICXzQIBQFyAl81CAUBcgJfNggFAXICXzcJAKYDAQgFAXICXzgIBQFyAl85CAUBcgNfMTABaQEOZ2V0RmVlUkVBRE9OTFkACQCUCgIFA25pbAUDZmVlAQJ0eAEGdmVyaWZ5AAQPdGFyZ2V0UHVibGljS2V5BAckbWF0Y2gwCQEBbQADCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQCcGsFByRtYXRjaDAFAnBrAwkAAQIFByRtYXRjaDACBFVuaXQIBQJ0eA9zZW5kZXJQdWJsaWNLZXkJAAIBAgtNYXRjaCBlcnJvcgQHJG1hdGNoMAUCdHgDCQABAgUHJG1hdGNoMAIFT3JkZXIEBW9yZGVyBQckbWF0Y2gwBAptYXRjaGVyUHViCQECbXAABApvcmRlclZhbGlkCQEDbW9hAQUFb3JkZXIEC3NlbmRlclZhbGlkCQD0AwMIBQVvcmRlcglib2R5Qnl0ZXMJAJEDAggFBW9yZGVyBnByb29mcwAACAUFb3JkZXIPc2VuZGVyUHVibGljS2V5BAxtYXRjaGVyVmFsaWQJAPQDAwgFBW9yZGVyCWJvZHlCeXRlcwkAkQMCCAUFb3JkZXIGcHJvb2ZzAAEFCm1hdGNoZXJQdWIDAwMFCm9yZGVyVmFsaWQFC3NlbmRlclZhbGlkBwUMbWF0Y2hlclZhbGlkBwYJAQN0b2UDBQpvcmRlclZhbGlkBQtzZW5kZXJWYWxpZAUMbWF0Y2hlclZhbGlkAwkAAQIFByRtYXRjaDACFFNldFNjcmlwdFRyYW5zYWN0aW9uBAFzBQckbWF0Y2gwBAduZXdIYXNoCQD2AwEJAQV2YWx1ZQEIBQFzBnNjcmlwdAQLYWxsb3dlZEhhc2gJANsEAQkBBXZhbHVlAQkAnQgCBQNmY2EJARxrZXlBbGxvd2VkTHBTdGFibGVTY3JpcHRIYXNoAAQLY3VycmVudEhhc2gJAPEHAQUEdGhpcwMDCQAAAgULYWxsb3dlZEhhc2gFB25ld0hhc2gJAQIhPQIFC2N1cnJlbnRIYXNoBQduZXdIYXNoBwYJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAFD3RhcmdldFB1YmxpY0tleQkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAUPdGFyZ2V0UHVibGljS2V5XMB3SA==", "chainId": 87, "height": 3337390, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 6DtWbAACaVxv9L31XoRBChH1xprYnwPywrFyNvzGcUVx Next: FYQDpJmbgD2arvxJsAaf6n3Wj4dkbSVAydoU9Y7jJgXW Diff:
OldNewDifferences
5252 let idxIPriceAsId = 9
5353
5454 let idxFactStakCntr = 1
55+
56+let idxFactoryRestCntr = 6
5557
5658 let idxFactSlippCntr = 7
5759
184186 let slipageContract = valueOrErrorMessage(addressFromString(factoryConfig[idxFactSlippCntr]), "Invalid slipage contract address")
185187
186188 let gwxContract = valueOrErrorMessage(addressFromString(factoryConfig[idxFactGwxRewCntr]), "Invalid gwx contract address")
189+
190+let restContract = valueOrErrorMessage(addressFromString(factoryConfig[idxFactoryRestCntr]), "Invalid gwx contract address")
187191
188192 func dataPutActionInfo (inAmtAssetAmt,inPriceAssetAmt,outLpAmt,price,slipByUser,slippageReal,txHeight,txTimestamp,slipageAmAmt,slipagePrAmt) = makeString(["%d%d%d%d%d%d%d%d%d%d", toString(inAmtAssetAmt), toString(inPriceAssetAmt), toString(outLpAmt), toString(price), toString(slipByUser), toString(slippageReal), toString(txHeight), toString(txTimestamp), toString(slipageAmAmt), toString(slipagePrAmt)], SEP)
189193
365369 else calcLpAmt
366370 let amDiff = (inAmAmt - calcAmAssetPmt)
367371 let prDiff = (inPrAmt - calcPrAssetPmt)
368- let $t01635116696 = if (if (isOneAsset)
372+ let $t01650916854 = if (if (isOneAsset)
369373 then (pmtId == amIdStr)
370374 else false)
371375 then $Tuple2(pmtAmt, 0)
374378 else false)
375379 then $Tuple2(0, pmtAmt)
376380 else $Tuple2(calcAmAssetPmt, calcPrAssetPmt)
377- let writeAmAmt = $t01635116696._1
378- let writePrAmt = $t01635116696._2
381+ let writeAmAmt = $t01650916854._1
382+ let writePrAmt = $t01650916854._2
379383 let commonState = [IntegerEntry(pl(), curPrice), IntegerEntry(ph(height, lastBlock.timestamp), curPrice), StringEntry(pau(userAddress, txId58), dataPutActionInfo(writeAmAmt, writePrAmt, emitLpAmt, curPrice, slippage, slippageCalc, height, lastBlock.timestamp, amDiff, prDiff))]
380384 $Tuple13(calcLpAmt, emitLpAmt, curPrice, amBalance, prBalance, lpEm, lpId, sts, commonState, amDiff, prDiff, inAmId, inPrId)
381385 }
475479 let ann_aPrecision = (ann - aPrecision)
476480 let n1 = (n + big1)
477481 func calc (acc,cur) = {
478- let $t02124821268 = acc
479- let d = $t02124821268._1
480- let found = $t02124821268._2
482+ let $t02140621426 = acc
483+ let d = $t02140621426._1
484+ let found = $t02140621426._2
481485 if ((found != unit))
482486 then acc
483487 else {
491495 }
492496
493497 let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
494- let $t02168921736 = {
498+ let $t02184721894 = {
495499 let $l = arr
496500 let $s = size($l)
497501 let $acc0 = $Tuple2(s, unit)
505509
506510 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
507511 }
508- let d = $t02168921736._1
509- let found = $t02168921736._2
512+ let d = $t02184721894._1
513+ let found = $t02184721894._2
510514 if ((found != unit))
511515 then d
512516 else throw(("D calculation error, D = " + toString(d)))
526530 let c = (((((D * D) / (x * n)) * D) * aPrecision) / (ann * n))
527531 let b = ((s + ((D * aPrecision) / ann)) - D)
528532 func calc (acc,cur) = {
529- let $t02223622256 = acc
530- let y = $t02223622256._1
531- let found = $t02223622256._2
533+ let $t02239422414 = acc
534+ let y = $t02239422414._1
535+ let found = $t02239422414._2
532536 if ((found != unit))
533537 then acc
534538 else {
541545 }
542546
543547 let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
544- let $t02256322610 = {
548+ let $t02272122768 = {
545549 let $l = arr
546550 let $s = size($l)
547551 let $acc0 = $Tuple2(D, unit)
555559
556560 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
557561 }
558- let y = $t02256322610._1
559- let found = $t02256322610._2
562+ let y = $t02272122768._1
563+ let found = $t02272122768._2
560564 if ((found != unit))
561565 then y
562566 else throw(("Y calculation error, Y = " + toString(y)))
578582 then {
579583 let amBalance = getAccBalance(amId)
580584 let prBalance = getAccBalance(prId)
581- let $t02336923831 = if ((txId == ""))
585+ let $t02352723989 = if ((txId == ""))
582586 then $Tuple2(amBalance, prBalance)
583587 else if ((pmtAssetId == amId))
584588 then if ((pmtAmtRaw > amBalance))
589593 then throw("invalid payment amount")
590594 else $Tuple2(amBalance, (prBalance - pmtAmtRaw))
591595 else throw("wrong pmtAssetId")
592- let amBalanceOld = $t02336923831._1
593- let prBalanceOld = $t02336923831._2
594- let $t02383724013 = if ((pmtAssetId == amId))
596+ let amBalanceOld = $t02352723989._1
597+ let prBalanceOld = $t02352723989._2
598+ let $t02399524171 = if ((pmtAssetId == amId))
595599 then $Tuple2(pmtAmtRaw, 0)
596600 else if ((pmtAssetId == prId))
597601 then $Tuple2(0, pmtAmtRaw)
598602 else throw("invalid payment")
599- let amAmountRaw = $t02383724013._1
600- let prAmountRaw = $t02383724013._2
603+ let amAmountRaw = $t02399524171._1
604+ let prAmountRaw = $t02399524171._2
601605 let amAmount = takeFee(amAmountRaw)._1
602606 let prAmount = takeFee(prAmountRaw)._1
603607 let feeAmount = takeFee(pmtAmtRaw)._2
636640 let amDecimals = parseIntValue(poolConfig[idxAmtAsDcm])
637641 let prDecimals = parseIntValue(poolConfig[idxPriceAsDcm])
638642 let poolStatus = poolConfig[idxPoolSt]
639- let userAddress = if ((caller == this))
643+ let userAddress = if ((caller == restContract))
640644 then originCaller
641645 else caller
642646 let pmt = value(payments[0])
651655 else {
652656 let amBalance = getAccBalance(amId)
653657 let prBalance = getAccBalance(prId)
654- let $t02625626364 = {
658+ let $t02642226530 = {
655659 let @ = invoke(this, "getOneTknV2READONLY", [outAssetId, pmtAmt], nil)
656660 if ($isInstanceOf(@, "(Int, Int)"))
657661 then @
658662 else throw(($getType(@) + " couldn't be cast to (Int, Int)"))
659663 }
660- let totalGet = $t02625626364._1
661- let feeAmount = $t02625626364._2
664+ let totalGet = $t02642226530._1
665+ let feeAmount = $t02642226530._2
662666 let totalAmount = if (if ((minOutAmount > 0))
663667 then (minOutAmount > totalGet)
664668 else false)
665669 then throw(makeString(["amount to receive is less than ", toString(minOutAmount)], ""))
666670 else totalGet
667- let $t02655126858 = if ((outAssetId == amId))
671+ let $t02671727024 = if ((outAssetId == amId))
668672 then $Tuple4(totalAmount, 0, ((amBalance - totalAmount) - feeAmount), prBalance)
669673 else if ((outAssetId == prId))
670674 then $Tuple4(0, totalAmount, amBalance, ((prBalance - totalAmount) - feeAmount))
671675 else throw("invalid out asset id")
672- let outAm = $t02655126858._1
673- let outPr = $t02655126858._2
674- let amBalanceNew = $t02655126858._3
675- let prBalanceNew = $t02655126858._4
676+ let outAm = $t02671727024._1
677+ let outPr = $t02671727024._2
678+ let amBalanceNew = $t02671727024._3
679+ let prBalanceNew = $t02671727024._4
676680 let curPrX18 = cpbi(t1(prBalanceNew, prDecimals), t1(amBalanceNew, amDecimals))
677681 let curPr = f1(curPrX18, scale8)
678682 let outAssetIdOrWaves = if ((outAssetId == "WAVES"))
856860 if ((10000000 > pmtAmt))
857861 then throw("Wrong pmt amt")
858862 else {
859- let $t03173531860 = calcPutOneTkn(pmtAmt, pmtAssetId, toString(userAddress), toBase58String(i.transactionId))
860- let estimLP = $t03173531860._1
861- let state = $t03173531860._2
862- let feeAmount = $t03173531860._3
863+ let $t03190132026 = calcPutOneTkn(pmtAmt, pmtAssetId, toString(userAddress), toBase58String(i.transactionId))
864+ let estimLP = $t03190132026._1
865+ let state = $t03190132026._2
866+ let feeAmount = $t03190132026._3
863867 let emitLpAmt = if (if ((minOutAmount > 0))
864868 then (minOutAmount > estimLP)
865869 else false)
927931
928932 @Callable(i)
929933 func getOneTknV2 (outAssetId,minOutAmount) = {
930- let $t03404334198 = getOneTknV2Internal(outAssetId, minOutAmount, i.payments, i.caller, i.originCaller, i.transactionId)
931- let state = $t03404334198._1
932- let totalAmount = $t03404334198._2
934+ let $t03420934364 = getOneTknV2Internal(outAssetId, minOutAmount, i.payments, i.caller, i.originCaller, i.transactionId)
935+ let state = $t03420934364._1
936+ let totalAmount = $t03420934364._2
933937 $Tuple2(state, totalAmount)
934938 }
935939
953957 let newY = getYD(xp, index, D1)
954958 let dy = (xp[index] - newY)
955959 let totalGetRaw = toInt((dy - big1))
956- let $t03497735026 = takeFee(totalGetRaw)
957- let totalGet = $t03497735026._1
958- let feeAmount = $t03497735026._2
960+ let $t03514335192 = takeFee(totalGetRaw)
961+ let totalGet = $t03514335192._1
962+ let feeAmount = $t03514335192._2
959963 $Tuple2(nil, $Tuple2(totalGet, feeAmount))
960964 }
961965
969973 let lpId = poolConfig[idxLPAsId]
970974 let amBalance = getAccBalance(amId)
971975 let prBalance = getAccBalance(prId)
972- let $t03537135486 = {
976+ let $t03553735652 = {
973977 let @ = invoke(this, "getOneTknV2READONLY", [outAssetId, lpAssetAmount], nil)
974978 if ($isInstanceOf(@, "(Int, Int)"))
975979 then @
976980 else throw(($getType(@) + " couldn't be cast to (Int, Int)"))
977981 }
978- let totalGet = $t03537135486._1
979- let feeAmount = $t03537135486._2
982+ let totalGet = $t03553735652._1
983+ let feeAmount = $t03553735652._2
980984 let r = ego("", lpId, lpAssetAmount, this)
981985 let outAmAmt = r._1
982986 let outPrAmt = r._2
10611065 let unstakeInv = invoke(staking, "unstake", [toBase58String(lpAssetId), unstakeAmount], nil)
10621066 if ((unstakeInv == unstakeInv))
10631067 then {
1064- let $t03779337981 = getOneTknV2Internal(outAssetId, minOutAmount, [AttachedPayment(lpAssetId, unstakeAmount)], i.caller, i.originCaller, i.transactionId)
1065- let state = $t03779337981._1
1066- let totalAmount = $t03779337981._2
1068+ let $t03795938147 = getOneTknV2Internal(outAssetId, minOutAmount, [AttachedPayment(lpAssetId, unstakeAmount)], i.caller, i.originCaller, i.transactionId)
1069+ let state = $t03795938147._1
1070+ let totalAmount = $t03795938147._2
10671071 $Tuple2(state, totalAmount)
10681072 }
10691073 else throw("Strict value is not equal to itself.")
10791083 let amId = poolConfig[idxAmAsId]
10801084 let prId = poolConfig[idxPrAsId]
10811085 let lpId = poolConfig[idxLPAsId]
1082- let $t03824038337 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "")
1083- let lpAmount = $t03824038337._1
1084- let state = $t03824038337._2
1085- let feeAmount = $t03824038337._3
1086- let bonus = $t03824038337._4
1086+ let $t03840638503 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "")
1087+ let lpAmount = $t03840638503._1
1088+ let state = $t03840638503._2
1089+ let feeAmount = $t03840638503._3
1090+ let bonus = $t03840638503._4
10871091 $Tuple2(nil, $Tuple3(lpAmount, feeAmount, bonus))
10881092 }
10891093
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let scale8 = 100000000
55
66 let scale8BigInt = toBigInt(100000000)
77
88 let scale18 = toBigInt(1000000000000000000)
99
1010 let zeroBigInt = toBigInt(0)
1111
1212 let big0 = toBigInt(0)
1313
1414 let big1 = toBigInt(1)
1515
1616 let big2 = toBigInt(2)
1717
1818 let slippage4D = toBigInt((scale8 - ((scale8 * 1) / scale8)))
1919
2020 let Amult = "100"
2121
2222 let Dconv = "1"
2323
2424 let SEP = "__"
2525
2626 let EMPTY = ""
2727
2828 let PoolActive = 1
2929
3030 let PoolPutDis = 2
3131
3232 let PoolMatcherDis = 3
3333
3434 let PoolShutdown = 4
3535
3636 let idxPoolAddress = 1
3737
3838 let idxPoolSt = 2
3939
4040 let idxLPAsId = 3
4141
4242 let idxAmAsId = 4
4343
4444 let idxPrAsId = 5
4545
4646 let idxAmtAsDcm = 6
4747
4848 let idxPriceAsDcm = 7
4949
5050 let idxIAmtAsId = 8
5151
5252 let idxIPriceAsId = 9
5353
5454 let idxFactStakCntr = 1
55+
56+let idxFactoryRestCntr = 6
5557
5658 let idxFactSlippCntr = 7
5759
5860 let idxFactGwxRewCntr = 10
5961
6062 let feeDefault = fraction(5, scale8, 10000)
6163
6264 func t1 (origVal,origScaleMult) = fraction(toBigInt(origVal), scale18, toBigInt(origScaleMult))
6365
6466
6567 func f1 (val,resultScaleMult) = toInt(fraction(val, toBigInt(resultScaleMult), scale18))
6668
6769
6870 func ts (amt,resScale,curScale) = fraction(amt, resScale, curScale)
6971
7072
7173 func abs (val) = if ((zeroBigInt > val))
7274 then -(val)
7375 else val
7476
7577
7678 func absBigInt (val) = if ((zeroBigInt > val))
7779 then -(val)
7880 else val
7981
8082
8183 func fc () = "%s__factoryContract"
8284
8385
8486 func mpk () = "%s__managerPublicKey"
8587
8688
8789 func pmpk () = "%s__pendingManagerPublicKey"
8890
8991
9092 func pl () = "%s%s__price__last"
9193
9294
9395 func ph (h,t) = makeString(["%s%s%d%d__price__history", toString(h), toString(t)], SEP)
9496
9597
9698 func pau (ua,txId) = ((("%s%s%s__P__" + ua) + "__") + txId)
9799
98100
99101 func gau (ua,txId) = ((("%s%s%s__G__" + ua) + "__") + txId)
100102
101103
102104 func aa () = "%s__amountAsset"
103105
104106
105107 func pa () = "%s__priceAsset"
106108
107109
108110 func amp () = "%s__amp"
109111
110112
111113 func ada () = "%s__addonAddr"
112114
113115
114116 let keyFee = "%s__fee"
115117
116118 let fee = valueOrElse(getInteger(this, keyFee), feeDefault)
117119
118120 func fcfg () = "%s__factoryConfig"
119121
120122
121123 func mtpk () = "%s%s__matcher__publicKey"
122124
123125
124126 func pc (iAmtAs,iPrAs) = (((("%d%d%s__" + iAmtAs) + "__") + iPrAs) + "__config")
125127
126128
127129 func mba (bAStr) = ("%s%s%s__mappings__baseAsset2internalId__" + bAStr)
128130
129131
130132 func aps () = "%s__shutdown"
131133
132134
133135 func keyAllowedLpStableScriptHash () = "%s__allowedLpStableScriptHash"
134136
135137
136138 func keyFeeCollectorAddress () = "%s__feeCollectorAddress"
137139
138140
139141 func toe (orV,sendrV,matchV) = throw(((((("Failed: ordValid=" + toString(orV)) + " sndrValid=") + toString(sendrV)) + " mtchrValid=") + toString(matchV)))
140142
141143
142144 func str (val) = match val {
143145 case valStr: String =>
144146 valStr
145147 case _ =>
146148 throw("fail cast to String")
147149 }
148150
149151
150152 func strf (addr,key) = valueOrErrorMessage(getString(addr, key), makeString(["mandatory ", toString(addr), ".", key, " not defined"], ""))
151153
152154
153155 func intf (addr,key) = valueOrErrorMessage(getInteger(addr, key), makeString(["mandatory ", toString(addr), ".", key, " not defined"], ""))
154156
155157
156158 let fca = addressFromStringValue(strf(this, fc()))
157159
158160 let A = strf(this, amp())
159161
160162 func igs () = valueOrElse(getBoolean(fca, aps()), false)
161163
162164
163165 func mp () = fromBase58String(strf(fca, mtpk()))
164166
165167
166168 let feeCollectorAddress = addressFromStringValue(strf(fca, keyFeeCollectorAddress()))
167169
168170 func gpc () = {
169171 let amtAs = strf(this, aa())
170172 let priceAs = strf(this, pa())
171173 let iPriceAs = intf(fca, mba(priceAs))
172174 let iAmtAs = intf(fca, mba(amtAs))
173175 split(strf(fca, pc(toString(iAmtAs), toString(iPriceAs))), SEP)
174176 }
175177
176178
177179 func gfc () = split(strf(fca, fcfg()), SEP)
178180
179181
180182 let factoryConfig = gfc()
181183
182184 let stakingContract = valueOrErrorMessage(addressFromString(factoryConfig[idxFactStakCntr]), "Invalid staking contract address")
183185
184186 let slipageContract = valueOrErrorMessage(addressFromString(factoryConfig[idxFactSlippCntr]), "Invalid slipage contract address")
185187
186188 let gwxContract = valueOrErrorMessage(addressFromString(factoryConfig[idxFactGwxRewCntr]), "Invalid gwx contract address")
189+
190+let restContract = valueOrErrorMessage(addressFromString(factoryConfig[idxFactoryRestCntr]), "Invalid gwx contract address")
187191
188192 func dataPutActionInfo (inAmtAssetAmt,inPriceAssetAmt,outLpAmt,price,slipByUser,slippageReal,txHeight,txTimestamp,slipageAmAmt,slipagePrAmt) = makeString(["%d%d%d%d%d%d%d%d%d%d", toString(inAmtAssetAmt), toString(inPriceAssetAmt), toString(outLpAmt), toString(price), toString(slipByUser), toString(slippageReal), toString(txHeight), toString(txTimestamp), toString(slipageAmAmt), toString(slipagePrAmt)], SEP)
189193
190194
191195 func dataGetActionInfo (outAmtAssetAmt,outPriceAssetAmt,inLpAmt,price,txHeight,txTimestamp) = makeString(["%d%d%d%d%d%d", toString(outAmtAssetAmt), toString(outPriceAssetAmt), toString(inLpAmt), toString(price), toString(txHeight), toString(txTimestamp)], SEP)
192196
193197
194198 func getAccBalance (assetId) = if ((assetId == "WAVES"))
195199 then wavesBalance(this).available
196200 else assetBalance(this, fromBase58String(assetId))
197201
198202
199203 func cpbi (prAmtX18,amAmtX18) = fraction(prAmtX18, scale18, amAmtX18)
200204
201205
202206 func vad (A1,A2,slippage) = {
203207 let diff = fraction((A1 - A2), scale8BigInt, A2)
204208 let pass = ((slippage - abs(diff)) > zeroBigInt)
205209 if (!(pass))
206210 then throw(("Big slpg: " + toString(diff)))
207211 else $Tuple2(pass, min([A1, A2]))
208212 }
209213
210214
211215 func vd (D1,D0,slpg) = {
212216 let diff = fraction(D0, scale8BigInt, D1)
213217 let fail = (slpg > diff)
214218 if (if (fail)
215219 then true
216220 else (D0 > D1))
217221 then throw(((((((toString(D0) + " ") + toString(D1)) + " ") + toString(diff)) + " ") + toString(slpg)))
218222 else fail
219223 }
220224
221225
222226 func pcp (amAssetDcm,prAssetDcm,amAmt,prAmt) = {
223227 let amtAsAmtX18 = t1(amAmt, amAssetDcm)
224228 let prAsAmtX18 = t1(prAmt, prAssetDcm)
225229 cpbi(prAsAmtX18, amtAsAmtX18)
226230 }
227231
228232
229233 func calcPrices (amAmt,prAmt,lpAmt) = {
230234 let cfg = gpc()
231235 let amtAsDcm = parseIntValue(cfg[idxAmtAsDcm])
232236 let prAsDcm = parseIntValue(cfg[idxPriceAsDcm])
233237 let priceX18 = pcp(amtAsDcm, prAsDcm, amAmt, prAmt)
234238 let amAmtX18 = t1(amAmt, amtAsDcm)
235239 let prAmtX18 = t1(prAmt, prAsDcm)
236240 let lpAmtX18 = t1(lpAmt, scale8)
237241 let lpPrInAmAsX18 = cpbi(amAmtX18, lpAmtX18)
238242 let lpPrInPrAsX18 = cpbi(prAmtX18, lpAmtX18)
239243 [priceX18, lpPrInAmAsX18, lpPrInPrAsX18]
240244 }
241245
242246
243247 func calculatePrices (amAmt,prAmt,lpAmt) = {
244248 let p = calcPrices(amAmt, prAmt, lpAmt)
245249 [f1(p[0], scale8), f1(p[1], scale8), f1(p[2], scale8)]
246250 }
247251
248252
249253 func takeFee (amount) = {
250254 let feeAmount = fraction(amount, fee, scale8)
251255 $Tuple2((amount - feeAmount), feeAmount)
252256 }
253257
254258
255259 func ego (txId58,pmtAssetId,pmtLpAmt,userAddress) = {
256260 let cfg = gpc()
257261 let lpId = cfg[idxLPAsId]
258262 let amId = cfg[idxAmAsId]
259263 let prId = cfg[idxPrAsId]
260264 let amDcm = parseIntValue(cfg[idxAmtAsDcm])
261265 let prDcm = parseIntValue(cfg[idxPriceAsDcm])
262266 let sts = cfg[idxPoolSt]
263267 let lpEmiss = valueOrErrorMessage(assetInfo(fromBase58String(lpId)), "Wrong LP id").quantity
264268 if ((lpId != pmtAssetId))
265269 then throw("Wrong pmt asset")
266270 else {
267271 let amBalance = getAccBalance(amId)
268272 let amBalanceX18 = t1(amBalance, amDcm)
269273 let prBalance = getAccBalance(prId)
270274 let prBalanceX18 = t1(prBalance, prDcm)
271275 let curPriceX18 = cpbi(prBalanceX18, amBalanceX18)
272276 let curPrice = f1(curPriceX18, scale8)
273277 let pmtLpAmtX18 = t1(pmtLpAmt, scale8)
274278 let lpEmissX18 = t1(lpEmiss, scale8)
275279 let outAmAmtX18 = fraction(amBalanceX18, pmtLpAmtX18, lpEmissX18)
276280 let outPrAmtX18 = fraction(prBalanceX18, pmtLpAmtX18, lpEmissX18)
277281 let outAmAmt = f1(outAmAmtX18, amDcm)
278282 let outPrAmt = f1(outPrAmtX18, prDcm)
279283 let state = if ((txId58 == ""))
280284 then nil
281285 else [ScriptTransfer(userAddress, outAmAmt, if ((amId == "WAVES"))
282286 then unit
283287 else fromBase58String(amId)), ScriptTransfer(userAddress, outPrAmt, if ((prId == "WAVES"))
284288 then unit
285289 else fromBase58String(prId)), StringEntry(gau(toString(userAddress), txId58), dataGetActionInfo(outAmAmt, outPrAmt, pmtLpAmt, curPrice, height, lastBlock.timestamp)), IntegerEntry(pl(), curPrice), IntegerEntry(ph(height, lastBlock.timestamp), curPrice)]
286290 $Tuple10(outAmAmt, outPrAmt, amId, prId, amBalance, prBalance, lpEmiss, curPriceX18, sts, state)
287291 }
288292 }
289293
290294
291295 func epo (txId58,slippage,inAmAmt,inAmId,inPrAmt,inPrId,userAddress,isEval,emitLp,isOneAsset,validateSlippage,pmtAmt,pmtId) = {
292296 let cfg = gpc()
293297 let lpId = fromBase58String(cfg[idxLPAsId])
294298 let amIdStr = cfg[idxAmAsId]
295299 let prIdStr = cfg[idxPrAsId]
296300 let inAmIdStr = cfg[idxIAmtAsId]
297301 let inPrIdStr = cfg[idxIPriceAsId]
298302 let amtDcm = parseIntValue(cfg[idxAmtAsDcm])
299303 let priceDcm = parseIntValue(cfg[idxPriceAsDcm])
300304 let sts = cfg[idxPoolSt]
301305 let lpEm = valueOrErrorMessage(assetInfo(lpId), "Wr lp as").quantity
302306 let amBalance = if (isEval)
303307 then getAccBalance(amIdStr)
304308 else if (if (isOneAsset)
305309 then (pmtId == amIdStr)
306310 else false)
307311 then (getAccBalance(amIdStr) - pmtAmt)
308312 else if (isOneAsset)
309313 then getAccBalance(amIdStr)
310314 else (getAccBalance(amIdStr) - inAmAmt)
311315 let prBalance = if (isEval)
312316 then getAccBalance(prIdStr)
313317 else if (if (isOneAsset)
314318 then (pmtId == prIdStr)
315319 else false)
316320 then (getAccBalance(prIdStr) - pmtAmt)
317321 else if (isOneAsset)
318322 then getAccBalance(prIdStr)
319323 else (getAccBalance(prIdStr) - inPrAmt)
320324 let inAmAssetAmtX18 = t1(inAmAmt, amtDcm)
321325 let inPrAssetAmtX18 = t1(inPrAmt, priceDcm)
322326 let userPriceX18 = cpbi(inPrAssetAmtX18, inAmAssetAmtX18)
323327 let amBalanceX18 = t1(amBalance, amtDcm)
324328 let prBalanceX18 = t1(prBalance, priceDcm)
325329 let r = if ((lpEm == 0))
326330 then {
327331 let curPriceX18 = zeroBigInt
328332 let slippageX18 = zeroBigInt
329333 let lpAmtX18 = pow((inAmAssetAmtX18 * inPrAssetAmtX18), 0, toBigInt(5), 1, 0, DOWN)
330334 $Tuple5(f1(lpAmtX18, scale8), f1(inAmAssetAmtX18, amtDcm), f1(inPrAssetAmtX18, priceDcm), cpbi((prBalanceX18 + inPrAssetAmtX18), (amBalanceX18 + inAmAssetAmtX18)), slippageX18)
331335 }
332336 else {
333337 let curPriceX18 = cpbi(prBalanceX18, amBalanceX18)
334338 let slippageRealX18 = fraction(abs((curPriceX18 - userPriceX18)), scale18, curPriceX18)
335339 let slippageX18 = t1(slippage, scale8)
336340 if (if (if (validateSlippage)
337341 then (curPriceX18 != zeroBigInt)
338342 else false)
339343 then (slippageRealX18 > slippageX18)
340344 else false)
341345 then throw(((("Price slippage " + toString(slippageRealX18)) + " > ") + toString(slippageX18)))
342346 else {
343347 let lpEmissionX18 = t1(lpEm, scale8)
344348 let prViaAmX18 = fraction(inAmAssetAmtX18, curPriceX18, scale18)
345349 let amViaPrX18 = fraction(inPrAssetAmtX18, scale18, curPriceX18)
346350 let expectedAmts = if ((prViaAmX18 > inPrAssetAmtX18))
347351 then $Tuple2(amViaPrX18, inPrAssetAmtX18)
348352 else $Tuple2(inAmAssetAmtX18, prViaAmX18)
349353 let expAmtAssetAmtX18 = expectedAmts._1
350354 let expPriceAssetAmtX18 = expectedAmts._2
351355 let lpAmtX18 = fraction(lpEmissionX18, expPriceAssetAmtX18, prBalanceX18)
352356 $Tuple5(f1(lpAmtX18, scale8), f1(expAmtAssetAmtX18, amtDcm), f1(expPriceAssetAmtX18, priceDcm), curPriceX18, slippageX18)
353357 }
354358 }
355359 let calcLpAmt = r._1
356360 let calcAmAssetPmt = r._2
357361 let calcPrAssetPmt = r._3
358362 let curPrice = f1(r._4, scale8)
359363 let slippageCalc = f1(r._5, scale8)
360364 if ((0 >= calcLpAmt))
361365 then throw("LP <= 0")
362366 else {
363367 let emitLpAmt = if (!(emitLp))
364368 then 0
365369 else calcLpAmt
366370 let amDiff = (inAmAmt - calcAmAssetPmt)
367371 let prDiff = (inPrAmt - calcPrAssetPmt)
368- let $t01635116696 = if (if (isOneAsset)
372+ let $t01650916854 = if (if (isOneAsset)
369373 then (pmtId == amIdStr)
370374 else false)
371375 then $Tuple2(pmtAmt, 0)
372376 else if (if (isOneAsset)
373377 then (pmtId == prIdStr)
374378 else false)
375379 then $Tuple2(0, pmtAmt)
376380 else $Tuple2(calcAmAssetPmt, calcPrAssetPmt)
377- let writeAmAmt = $t01635116696._1
378- let writePrAmt = $t01635116696._2
381+ let writeAmAmt = $t01650916854._1
382+ let writePrAmt = $t01650916854._2
379383 let commonState = [IntegerEntry(pl(), curPrice), IntegerEntry(ph(height, lastBlock.timestamp), curPrice), StringEntry(pau(userAddress, txId58), dataPutActionInfo(writeAmAmt, writePrAmt, emitLpAmt, curPrice, slippage, slippageCalc, height, lastBlock.timestamp, amDiff, prDiff))]
380384 $Tuple13(calcLpAmt, emitLpAmt, curPrice, amBalance, prBalance, lpEm, lpId, sts, commonState, amDiff, prDiff, inAmId, inPrId)
381385 }
382386 }
383387
384388
385389 func moa (order) = {
386390 let cfg = gpc()
387391 let amtAsId = cfg[idxAmAsId]
388392 let prAsId = cfg[idxPrAsId]
389393 let sts = parseIntValue(cfg[idxPoolSt])
390394 let amtAsDcm = parseIntValue(cfg[idxAmtAsDcm])
391395 let prAsDcm = parseIntValue(cfg[idxPriceAsDcm])
392396 let accAmtAsBalance = getAccBalance(amtAsId)
393397 let accPrAsBalance = getAccBalance(prAsId)
394398 let curPriceX18 = if ((order.orderType == Buy))
395399 then pcp(amtAsDcm, prAsDcm, (accAmtAsBalance + order.amount), accPrAsBalance)
396400 else pcp(amtAsDcm, prAsDcm, (accAmtAsBalance - order.amount), accPrAsBalance)
397401 let curPrice = f1(curPriceX18, scale8)
398402 if (if (if (igs())
399403 then true
400404 else (sts == PoolMatcherDis))
401405 then true
402406 else (sts == PoolShutdown))
403407 then throw("Admin blocked")
404408 else {
405409 let orAmtAsset = order.assetPair.amountAsset
406410 let orAmtAsStr = if ((orAmtAsset == unit))
407411 then "WAVES"
408412 else toBase58String(value(orAmtAsset))
409413 let orPrAsset = order.assetPair.priceAsset
410414 let orPrAsStr = if ((orPrAsset == unit))
411415 then "WAVES"
412416 else toBase58String(value(orPrAsset))
413417 if (if ((orAmtAsStr != amtAsId))
414418 then true
415419 else (orPrAsStr != prAsId))
416420 then throw("Wr assets")
417421 else {
418422 let orderPrice = order.price
419423 let priceDcm = fraction(scale8, prAsDcm, amtAsDcm)
420424 let castOrderPrice = ts(orderPrice, scale8, priceDcm)
421425 let isOrderPriceValid = if ((order.orderType == Buy))
422426 then (curPrice >= castOrderPrice)
423427 else (castOrderPrice >= curPrice)
424428 true
425429 }
426430 }
427431 }
428432
429433
430434 func cg (i) = if ((size(i.payments) != 1))
431435 then throw("1 pmnt exp")
432436 else {
433437 let pmt = value(i.payments[0])
434438 let pmtAssetId = value(pmt.assetId)
435439 let pmtAmt = pmt.amount
436440 let r = ego(toBase58String(i.transactionId), toBase58String(pmtAssetId), pmtAmt, i.caller)
437441 let outAmAmt = r._1
438442 let outPrAmt = r._2
439443 let sts = parseIntValue(r._9)
440444 let state = r._10
441445 if (if (igs())
442446 then true
443447 else (sts == PoolShutdown))
444448 then throw(("Admin blocked: " + toString(sts)))
445449 else $Tuple5(outAmAmt, outPrAmt, pmtAmt, pmtAssetId, state)
446450 }
447451
448452
449453 func cp (caller,txId,amAsPmt,prAsPmt,slippage,emitLp,isOneAsset,validateSlippage,pmtAmt,pmtId) = {
450454 let r = epo(txId, slippage, value(amAsPmt).amount, value(amAsPmt).assetId, value(prAsPmt).amount, value(prAsPmt).assetId, caller, (txId == ""), emitLp, isOneAsset, validateSlippage, pmtAmt, pmtId)
451455 let sts = parseIntValue(r._8)
452456 if (if (if (igs())
453457 then true
454458 else (sts == PoolPutDis))
455459 then true
456460 else (sts == PoolShutdown))
457461 then throw(("Blocked:" + toString(sts)))
458462 else r
459463 }
460464
461465
462466 func getD (xp) = {
463467 let n = big2
464468 let xp0 = xp[0]
465469 let xp1 = xp[1]
466470 let aPrecision = parseBigIntValue(Amult)
467471 let a = (parseBigIntValue(A) * aPrecision)
468472 let s = (xp0 + xp1)
469473 if ((s == big0))
470474 then big0
471475 else {
472476 let ann = (a * n)
473477 let xp0_xp1_n_n = (((xp0 * xp1) * n) * n)
474478 let ann_s_aPrecision = ((ann * s) / aPrecision)
475479 let ann_aPrecision = (ann - aPrecision)
476480 let n1 = (n + big1)
477481 func calc (acc,cur) = {
478- let $t02124821268 = acc
479- let d = $t02124821268._1
480- let found = $t02124821268._2
482+ let $t02140621426 = acc
483+ let d = $t02140621426._1
484+ let found = $t02140621426._2
481485 if ((found != unit))
482486 then acc
483487 else {
484488 let dp = (((d * d) * d) / xp0_xp1_n_n)
485489 let dNext = (((ann_s_aPrecision + (dp * n)) * d) / (((ann_aPrecision * d) / aPrecision) + (n1 * dp)))
486490 let dDiff = absBigInt((dNext - value(d)))
487491 if ((big1 >= dDiff))
488492 then $Tuple2(dNext, cur)
489493 else $Tuple2(dNext, unit)
490494 }
491495 }
492496
493497 let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
494- let $t02168921736 = {
498+ let $t02184721894 = {
495499 let $l = arr
496500 let $s = size($l)
497501 let $acc0 = $Tuple2(s, unit)
498502 func $f0_1 ($a,$i) = if (($i >= $s))
499503 then $a
500504 else calc($a, $l[$i])
501505
502506 func $f0_2 ($a,$i) = if (($i >= $s))
503507 then $a
504508 else throw("List size exceeds 15")
505509
506510 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
507511 }
508- let d = $t02168921736._1
509- let found = $t02168921736._2
512+ let d = $t02184721894._1
513+ let found = $t02184721894._2
510514 if ((found != unit))
511515 then d
512516 else throw(("D calculation error, D = " + toString(d)))
513517 }
514518 }
515519
516520
517521 func getYD (xp,i,D) = {
518522 let n = big2
519523 let x = xp[if ((i == 0))
520524 then 1
521525 else 0]
522526 let aPrecision = parseBigIntValue(Amult)
523527 let a = (parseBigIntValue(A) * aPrecision)
524528 let s = x
525529 let ann = (a * n)
526530 let c = (((((D * D) / (x * n)) * D) * aPrecision) / (ann * n))
527531 let b = ((s + ((D * aPrecision) / ann)) - D)
528532 func calc (acc,cur) = {
529- let $t02223622256 = acc
530- let y = $t02223622256._1
531- let found = $t02223622256._2
533+ let $t02239422414 = acc
534+ let y = $t02239422414._1
535+ let found = $t02239422414._2
532536 if ((found != unit))
533537 then acc
534538 else {
535539 let yNext = (((y * y) + c) / ((big2 * y) + b))
536540 let yDiff = absBigInt((yNext - value(y)))
537541 if ((big1 >= yDiff))
538542 then $Tuple2(yNext, cur)
539543 else $Tuple2(yNext, unit)
540544 }
541545 }
542546
543547 let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
544- let $t02256322610 = {
548+ let $t02272122768 = {
545549 let $l = arr
546550 let $s = size($l)
547551 let $acc0 = $Tuple2(D, unit)
548552 func $f0_1 ($a,$i) = if (($i >= $s))
549553 then $a
550554 else calc($a, $l[$i])
551555
552556 func $f0_2 ($a,$i) = if (($i >= $s))
553557 then $a
554558 else throw("List size exceeds 15")
555559
556560 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
557561 }
558- let y = $t02256322610._1
559- let found = $t02256322610._2
562+ let y = $t02272122768._1
563+ let found = $t02272122768._2
560564 if ((found != unit))
561565 then y
562566 else throw(("Y calculation error, Y = " + toString(y)))
563567 }
564568
565569
566570 func calcPutOneTkn (pmtAmtRaw,pmtAssetId,userAddress,txId) = {
567571 let poolConfig = gpc()
568572 let amId = poolConfig[idxAmAsId]
569573 let prId = poolConfig[idxPrAsId]
570574 let lpId = poolConfig[idxLPAsId]
571575 let amtDcm = parseIntValue(poolConfig[idxAmtAsDcm])
572576 let priceDcm = parseIntValue(poolConfig[idxPriceAsDcm])
573577 let lpAssetEmission = toBigInt(valueOrErrorMessage(assetInfo(fromBase58String(lpId)), "invalid lp asset").quantity)
574578 let chechEmission = if ((lpAssetEmission > big0))
575579 then true
576580 else throw("initial deposit requires all coins")
577581 if ((chechEmission == chechEmission))
578582 then {
579583 let amBalance = getAccBalance(amId)
580584 let prBalance = getAccBalance(prId)
581- let $t02336923831 = if ((txId == ""))
585+ let $t02352723989 = if ((txId == ""))
582586 then $Tuple2(amBalance, prBalance)
583587 else if ((pmtAssetId == amId))
584588 then if ((pmtAmtRaw > amBalance))
585589 then throw("invalid payment amount")
586590 else $Tuple2((amBalance - pmtAmtRaw), prBalance)
587591 else if ((pmtAssetId == prId))
588592 then if ((pmtAmtRaw > prBalance))
589593 then throw("invalid payment amount")
590594 else $Tuple2(amBalance, (prBalance - pmtAmtRaw))
591595 else throw("wrong pmtAssetId")
592- let amBalanceOld = $t02336923831._1
593- let prBalanceOld = $t02336923831._2
594- let $t02383724013 = if ((pmtAssetId == amId))
596+ let amBalanceOld = $t02352723989._1
597+ let prBalanceOld = $t02352723989._2
598+ let $t02399524171 = if ((pmtAssetId == amId))
595599 then $Tuple2(pmtAmtRaw, 0)
596600 else if ((pmtAssetId == prId))
597601 then $Tuple2(0, pmtAmtRaw)
598602 else throw("invalid payment")
599- let amAmountRaw = $t02383724013._1
600- let prAmountRaw = $t02383724013._2
603+ let amAmountRaw = $t02399524171._1
604+ let prAmountRaw = $t02399524171._2
601605 let amAmount = takeFee(amAmountRaw)._1
602606 let prAmount = takeFee(prAmountRaw)._1
603607 let feeAmount = takeFee(pmtAmtRaw)._2
604608 let amBalanceNew = (amBalanceOld + amAmount)
605609 let prBalanceNew = (prBalanceOld + prAmount)
606610 let D0 = getD([toBigInt(amBalanceOld), toBigInt(prBalanceOld)])
607611 let D1 = getD([toBigInt(amBalanceNew), toBigInt(prBalanceNew)])
608612 let checkD = if ((D1 > D0))
609613 then true
610614 else throw()
611615 if ((checkD == checkD))
612616 then {
613617 let lpAmount = fraction(lpAssetEmission, (D1 - D0), D0)
614618 let curPrice = f1(cpbi(t1(prBalanceNew, priceDcm), t1(amBalanceNew, amtDcm)), scale8)
615619 let commonState = [IntegerEntry(pl(), curPrice), IntegerEntry(ph(height, lastBlock.timestamp), curPrice), StringEntry(pau(userAddress, txId), dataPutActionInfo(amAmountRaw, prAmountRaw, toInt(lpAmount), curPrice, 0, 0, height, lastBlock.timestamp, 0, 0))]
616620 let poolProportion = fraction(prBalanceOld, scale8, amBalanceOld)
617621 let amountAssetPart = fraction(pmtAmtRaw, scale8, (poolProportion + scale8))
618622 let priceAssetPart = (pmtAmtRaw - amountAssetPart)
619623 let lpAmtBoth = fraction(lpAssetEmission, toBigInt(priceAssetPart), toBigInt(prBalanceOld))
620624 let bonus = toInt(fraction((lpAmount - lpAmtBoth), scale8BigInt, lpAmtBoth))
621625 $Tuple4(toInt(lpAmount), commonState, feeAmount, bonus)
622626 }
623627 else throw("Strict value is not equal to itself.")
624628 }
625629 else throw("Strict value is not equal to itself.")
626630 }
627631
628632
629633 func getOneTknV2Internal (outAssetId,minOutAmount,payments,caller,originCaller,transactionId) = if ((size(payments) != 1))
630634 then throw("1 pmnt expd")
631635 else {
632636 let poolConfig = gpc()
633637 let lpId = poolConfig[idxLPAsId]
634638 let amId = poolConfig[idxAmAsId]
635639 let prId = poolConfig[idxPrAsId]
636640 let amDecimals = parseIntValue(poolConfig[idxAmtAsDcm])
637641 let prDecimals = parseIntValue(poolConfig[idxPriceAsDcm])
638642 let poolStatus = poolConfig[idxPoolSt]
639- let userAddress = if ((caller == this))
643+ let userAddress = if ((caller == restContract))
640644 then originCaller
641645 else caller
642646 let pmt = value(payments[0])
643647 let pmtAssetId = value(pmt.assetId)
644648 let pmtAmt = pmt.amount
645649 if ((1000000000 > pmtAmt))
646650 then throw("Min pmt 10 LP")
647651 else {
648652 let txId58 = toBase58String(transactionId)
649653 if ((lpId != toBase58String(pmtAssetId)))
650654 then throw("Wrong LP")
651655 else {
652656 let amBalance = getAccBalance(amId)
653657 let prBalance = getAccBalance(prId)
654- let $t02625626364 = {
658+ let $t02642226530 = {
655659 let @ = invoke(this, "getOneTknV2READONLY", [outAssetId, pmtAmt], nil)
656660 if ($isInstanceOf(@, "(Int, Int)"))
657661 then @
658662 else throw(($getType(@) + " couldn't be cast to (Int, Int)"))
659663 }
660- let totalGet = $t02625626364._1
661- let feeAmount = $t02625626364._2
664+ let totalGet = $t02642226530._1
665+ let feeAmount = $t02642226530._2
662666 let totalAmount = if (if ((minOutAmount > 0))
663667 then (minOutAmount > totalGet)
664668 else false)
665669 then throw(makeString(["amount to receive is less than ", toString(minOutAmount)], ""))
666670 else totalGet
667- let $t02655126858 = if ((outAssetId == amId))
671+ let $t02671727024 = if ((outAssetId == amId))
668672 then $Tuple4(totalAmount, 0, ((amBalance - totalAmount) - feeAmount), prBalance)
669673 else if ((outAssetId == prId))
670674 then $Tuple4(0, totalAmount, amBalance, ((prBalance - totalAmount) - feeAmount))
671675 else throw("invalid out asset id")
672- let outAm = $t02655126858._1
673- let outPr = $t02655126858._2
674- let amBalanceNew = $t02655126858._3
675- let prBalanceNew = $t02655126858._4
676+ let outAm = $t02671727024._1
677+ let outPr = $t02671727024._2
678+ let amBalanceNew = $t02671727024._3
679+ let prBalanceNew = $t02671727024._4
676680 let curPrX18 = cpbi(t1(prBalanceNew, prDecimals), t1(amBalanceNew, amDecimals))
677681 let curPr = f1(curPrX18, scale8)
678682 let outAssetIdOrWaves = if ((outAssetId == "WAVES"))
679683 then unit
680684 else fromBase58String(outAssetId)
681685 let sendFeeToMatcher = if ((feeAmount > 0))
682686 then [ScriptTransfer(feeCollectorAddress, feeAmount, outAssetIdOrWaves)]
683687 else nil
684688 let state = ([ScriptTransfer(userAddress, totalAmount, outAssetIdOrWaves), StringEntry(gau(toString(userAddress), txId58), dataGetActionInfo(outAm, outPr, pmtAmt, curPr, height, lastBlock.timestamp)), IntegerEntry(pl(), curPr), IntegerEntry(ph(height, lastBlock.timestamp), curPr)] ++ sendFeeToMatcher)
685689 if ((state == state))
686690 then {
687691 let burn = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
688692 if ((burn == burn))
689693 then $Tuple2(state, totalAmount)
690694 else throw("Strict value is not equal to itself.")
691695 }
692696 else throw("Strict value is not equal to itself.")
693697 }
694698 }
695699 }
696700
697701
698702 func m () = match getString(mpk()) {
699703 case s: String =>
700704 fromBase58String(s)
701705 case _: Unit =>
702706 unit
703707 case _ =>
704708 throw("Match error")
705709 }
706710
707711
708712 func pm () = match getString(pmpk()) {
709713 case s: String =>
710714 fromBase58String(s)
711715 case _: Unit =>
712716 unit
713717 case _ =>
714718 throw("Match error")
715719 }
716720
717721
718722 let pd = throw("Permission denied")
719723
720724 func mm (i) = match m() {
721725 case pk: ByteVector =>
722726 if ((i.callerPublicKey == pk))
723727 then true
724728 else pd
725729 case _: Unit =>
726730 if ((i.caller == this))
727731 then true
728732 else pd
729733 case _ =>
730734 throw("Match error")
731735 }
732736
733737
734738 @Callable(i)
735739 func constructor (fc) = {
736740 let c = mm(i)
737741 if ((c == c))
738742 then [StringEntry(fc(), fc)]
739743 else throw("Strict value is not equal to itself.")
740744 }
741745
742746
743747
744748 @Callable(i)
745749 func setManager (pendingManagerPublicKey) = {
746750 let c = mm(i)
747751 if ((c == c))
748752 then {
749753 let cm = fromBase58String(pendingManagerPublicKey)
750754 if ((cm == cm))
751755 then [StringEntry(pmpk(), pendingManagerPublicKey)]
752756 else throw("Strict value is not equal to itself.")
753757 }
754758 else throw("Strict value is not equal to itself.")
755759 }
756760
757761
758762
759763 @Callable(i)
760764 func confirmManager () = {
761765 let p = pm()
762766 let hpm = if (isDefined(p))
763767 then true
764768 else throw("No pending manager")
765769 if ((hpm == hpm))
766770 then {
767771 let cpm = if ((i.callerPublicKey == value(p)))
768772 then true
769773 else throw("You are not pending manager")
770774 if ((cpm == cpm))
771775 then [StringEntry(mpk(), toBase58String(value(p))), DeleteEntry(pmpk())]
772776 else throw("Strict value is not equal to itself.")
773777 }
774778 else throw("Strict value is not equal to itself.")
775779 }
776780
777781
778782
779783 @Callable(i)
780784 func put (slip,autoStake) = {
781785 let factCfg = gfc()
782786 let stakingCntr = valueOrErrorMessage(addressFromString(factCfg[idxFactStakCntr]), "Wr st addr")
783787 let slipCntr = valueOrErrorMessage(addressFromString(factCfg[idxFactSlippCntr]), "Wr sl addr")
784788 if ((0 > slip))
785789 then throw("Wrong slippage")
786790 else if ((size(i.payments) != 2))
787791 then throw("2 pmnts expd")
788792 else {
789793 let e = cp(toString(i.caller), toBase58String(i.transactionId), AttachedPayment(value(i.payments[0]).assetId, value(i.payments[0]).amount), i.payments[1], slip, true, false, true, 0, "")
790794 let emitLpAmt = e._2
791795 let lpAssetId = e._7
792796 let state = e._9
793797 let amDiff = e._10
794798 let prDiff = e._11
795799 let amId = e._12
796800 let prId = e._13
797801 let r = invoke(fca, "emit", [emitLpAmt], nil)
798802 if ((r == r))
799803 then {
800804 let el = match r {
801805 case legacy: Address =>
802806 invoke(legacy, "emit", [emitLpAmt], nil)
803807 case _ =>
804808 unit
805809 }
806810 if ((el == el))
807811 then {
808812 let sa = if ((amDiff > 0))
809813 then invoke(slipCntr, "put", nil, [AttachedPayment(amId, amDiff)])
810814 else nil
811815 if ((sa == sa))
812816 then {
813817 let sp = if ((prDiff > 0))
814818 then invoke(slipCntr, "put", nil, [AttachedPayment(prId, prDiff)])
815819 else nil
816820 if ((sp == sp))
817821 then {
818822 let lpTrnsfr = if (autoStake)
819823 then {
820824 let ss = invoke(stakingCntr, "stake", nil, [AttachedPayment(lpAssetId, emitLpAmt)])
821825 if ((ss == ss))
822826 then nil
823827 else throw("Strict value is not equal to itself.")
824828 }
825829 else [ScriptTransfer(i.caller, emitLpAmt, lpAssetId)]
826830 (state ++ lpTrnsfr)
827831 }
828832 else throw("Strict value is not equal to itself.")
829833 }
830834 else throw("Strict value is not equal to itself.")
831835 }
832836 else throw("Strict value is not equal to itself.")
833837 }
834838 else throw("Strict value is not equal to itself.")
835839 }
836840 }
837841
838842
839843
840844 @Callable(i)
841845 func putOneTknV2 (minOutAmount,autoStake) = if ((size(i.payments) != 1))
842846 then throw("1 pmnt expd")
843847 else {
844848 let poolConfig = gpc()
845849 let amId = poolConfig[idxAmAsId]
846850 let prId = poolConfig[idxPrAsId]
847851 let lpId = fromBase58String(poolConfig[idxLPAsId])
848852 let amDecimals = parseIntValue(poolConfig[idxAmtAsDcm])
849853 let prDecimals = parseIntValue(poolConfig[idxPriceAsDcm])
850854 let userAddress = if ((i.caller == this))
851855 then i.originCaller
852856 else i.caller
853857 let pmt = value(i.payments[0])
854858 let pmtAssetId = toBase58String(value(pmt.assetId))
855859 let pmtAmt = pmt.amount
856860 if ((10000000 > pmtAmt))
857861 then throw("Wrong pmt amt")
858862 else {
859- let $t03173531860 = calcPutOneTkn(pmtAmt, pmtAssetId, toString(userAddress), toBase58String(i.transactionId))
860- let estimLP = $t03173531860._1
861- let state = $t03173531860._2
862- let feeAmount = $t03173531860._3
863+ let $t03190132026 = calcPutOneTkn(pmtAmt, pmtAssetId, toString(userAddress), toBase58String(i.transactionId))
864+ let estimLP = $t03190132026._1
865+ let state = $t03190132026._2
866+ let feeAmount = $t03190132026._3
863867 let emitLpAmt = if (if ((minOutAmount > 0))
864868 then (minOutAmount > estimLP)
865869 else false)
866870 then throw(makeString(["amount to receive is less than ", toString(minOutAmount)], ""))
867871 else estimLP
868872 let e = invoke(fca, "emit", [emitLpAmt], nil)
869873 if ((e == e))
870874 then {
871875 let el = match e {
872876 case legacy: Address =>
873877 invoke(legacy, "emit", [emitLpAmt], nil)
874878 case _ =>
875879 unit
876880 }
877881 if ((el == el))
878882 then {
879883 let lpTrnsfr = if (autoStake)
880884 then {
881885 let ss = invoke(stakingContract, "stake", nil, [AttachedPayment(lpId, emitLpAmt)])
882886 if ((ss == ss))
883887 then nil
884888 else throw("Strict value is not equal to itself.")
885889 }
886890 else [ScriptTransfer(i.caller, emitLpAmt, lpId)]
887891 let sendFeeToMatcher = if ((feeAmount > 0))
888892 then [ScriptTransfer(feeCollectorAddress, feeAmount, fromBase58String(pmtAssetId))]
889893 else nil
890894 $Tuple2(((state ++ lpTrnsfr) ++ sendFeeToMatcher), emitLpAmt)
891895 }
892896 else throw("Strict value is not equal to itself.")
893897 }
894898 else throw("Strict value is not equal to itself.")
895899 }
896900 }
897901
898902
899903
900904 @Callable(i)
901905 func putForFree (maxSlpg) = if ((0 > maxSlpg))
902906 then throw("Wrong slpg")
903907 else if ((size(i.payments) != 2))
904908 then throw("2 pmnts expd")
905909 else {
906910 let estPut = cp(toString(i.caller), toBase58String(i.transactionId), AttachedPayment(value(i.payments[0]).assetId, value(i.payments[0]).amount), i.payments[1], maxSlpg, false, false, true, 0, "")
907911 estPut._9
908912 }
909913
910914
911915
912916 @Callable(i)
913917 func get () = {
914918 let r = cg(i)
915919 let outAmtAmt = r._1
916920 let outPrAmt = r._2
917921 let pmtAmt = r._3
918922 let pmtAssetId = r._4
919923 let state = r._5
920924 let b = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
921925 if ((b == b))
922926 then state
923927 else throw("Strict value is not equal to itself.")
924928 }
925929
926930
927931
928932 @Callable(i)
929933 func getOneTknV2 (outAssetId,minOutAmount) = {
930- let $t03404334198 = getOneTknV2Internal(outAssetId, minOutAmount, i.payments, i.caller, i.originCaller, i.transactionId)
931- let state = $t03404334198._1
932- let totalAmount = $t03404334198._2
934+ let $t03420934364 = getOneTknV2Internal(outAssetId, minOutAmount, i.payments, i.caller, i.originCaller, i.transactionId)
935+ let state = $t03420934364._1
936+ let totalAmount = $t03420934364._2
933937 $Tuple2(state, totalAmount)
934938 }
935939
936940
937941
938942 @Callable(i)
939943 func getOneTknV2READONLY (outAssetId,lpAssetAmount) = {
940944 let poolConfig = gpc()
941945 let amId = poolConfig[idxAmAsId]
942946 let prId = poolConfig[idxPrAsId]
943947 let lpId = poolConfig[idxLPAsId]
944948 let xp = [toBigInt(getAccBalance(amId)), toBigInt(getAccBalance(prId))]
945949 let lpEmission = toBigInt(valueOrErrorMessage(assetInfo(fromBase58String(lpId)), "invalid lp asset").quantity)
946950 let D0 = getD(xp)
947951 let D1 = (D0 - fraction(toBigInt(lpAssetAmount), D0, lpEmission))
948952 let index = if ((outAssetId == amId))
949953 then 0
950954 else if ((outAssetId == prId))
951955 then 1
952956 else throw("invalid out asset id")
953957 let newY = getYD(xp, index, D1)
954958 let dy = (xp[index] - newY)
955959 let totalGetRaw = toInt((dy - big1))
956- let $t03497735026 = takeFee(totalGetRaw)
957- let totalGet = $t03497735026._1
958- let feeAmount = $t03497735026._2
960+ let $t03514335192 = takeFee(totalGetRaw)
961+ let totalGet = $t03514335192._1
962+ let feeAmount = $t03514335192._2
959963 $Tuple2(nil, $Tuple2(totalGet, feeAmount))
960964 }
961965
962966
963967
964968 @Callable(i)
965969 func getOneTknV2WithBonusREADONLY (outAssetId,lpAssetAmount) = {
966970 let poolConfig = gpc()
967971 let amId = poolConfig[idxAmAsId]
968972 let prId = poolConfig[idxPrAsId]
969973 let lpId = poolConfig[idxLPAsId]
970974 let amBalance = getAccBalance(amId)
971975 let prBalance = getAccBalance(prId)
972- let $t03537135486 = {
976+ let $t03553735652 = {
973977 let @ = invoke(this, "getOneTknV2READONLY", [outAssetId, lpAssetAmount], nil)
974978 if ($isInstanceOf(@, "(Int, Int)"))
975979 then @
976980 else throw(($getType(@) + " couldn't be cast to (Int, Int)"))
977981 }
978- let totalGet = $t03537135486._1
979- let feeAmount = $t03537135486._2
982+ let totalGet = $t03553735652._1
983+ let feeAmount = $t03553735652._2
980984 let r = ego("", lpId, lpAssetAmount, this)
981985 let outAmAmt = r._1
982986 let outPrAmt = r._2
983987 let sumOfGetAssets = (outAmAmt + outPrAmt)
984988 let bonus = fraction((totalGet - sumOfGetAssets), scale8, sumOfGetAssets)
985989 $Tuple2(nil, $Tuple3(totalGet, feeAmount, bonus))
986990 }
987991
988992
989993
990994 @Callable(i)
991995 func getNoLess (noLessThenAmtAsset,noLessThenPriceAsset) = {
992996 let r = cg(i)
993997 let outAmAmt = r._1
994998 let outPrAmt = r._2
995999 let pmtAmt = r._3
9961000 let pmtAssetId = r._4
9971001 let state = r._5
9981002 if ((noLessThenAmtAsset > outAmAmt))
9991003 then throw(((("Failed: " + toString(outAmAmt)) + " < ") + toString(noLessThenAmtAsset)))
10001004 else if ((noLessThenPriceAsset > outPrAmt))
10011005 then throw(((("Failed: " + toString(outPrAmt)) + " < ") + toString(noLessThenPriceAsset)))
10021006 else {
10031007 let burnLPAssetOnFactory = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
10041008 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
10051009 then state
10061010 else throw("Strict value is not equal to itself.")
10071011 }
10081012 }
10091013
10101014
10111015
10121016 @Callable(i)
10131017 func unstakeAndGet (amount) = {
10141018 let checkPayments = if ((size(i.payments) != 0))
10151019 then throw("No pmnts expd")
10161020 else true
10171021 if ((checkPayments == checkPayments))
10181022 then {
10191023 let cfg = gpc()
10201024 let factoryCfg = gfc()
10211025 let lpAssetId = fromBase58String(cfg[idxLPAsId])
10221026 let staking = valueOrErrorMessage(addressFromString(factoryCfg[idxFactStakCntr]), "Wr st addr")
10231027 let unstakeInv = invoke(staking, "unstake", [toBase58String(lpAssetId), amount], nil)
10241028 if ((unstakeInv == unstakeInv))
10251029 then {
10261030 let r = ego(toBase58String(i.transactionId), toBase58String(lpAssetId), amount, i.caller)
10271031 let sts = parseIntValue(r._9)
10281032 let state = r._10
10291033 let v = if (if (igs())
10301034 then true
10311035 else (sts == PoolShutdown))
10321036 then throw(("Blocked: " + toString(sts)))
10331037 else true
10341038 if ((v == v))
10351039 then {
10361040 let burnA = invoke(fca, "burn", [amount], [AttachedPayment(lpAssetId, amount)])
10371041 if ((burnA == burnA))
10381042 then state
10391043 else throw("Strict value is not equal to itself.")
10401044 }
10411045 else throw("Strict value is not equal to itself.")
10421046 }
10431047 else throw("Strict value is not equal to itself.")
10441048 }
10451049 else throw("Strict value is not equal to itself.")
10461050 }
10471051
10481052
10491053
10501054 @Callable(i)
10511055 func unstakeAndGetOneTknV2 (unstakeAmount,outAssetId,minOutAmount) = {
10521056 let checkPayments = if ((size(i.payments) != 0))
10531057 then throw("No pmnts expd")
10541058 else true
10551059 if ((checkPayments == checkPayments))
10561060 then {
10571061 let cfg = gpc()
10581062 let factoryCfg = gfc()
10591063 let lpAssetId = fromBase58String(cfg[idxLPAsId])
10601064 let staking = valueOrErrorMessage(addressFromString(factoryCfg[idxFactStakCntr]), "Wr st addr")
10611065 let unstakeInv = invoke(staking, "unstake", [toBase58String(lpAssetId), unstakeAmount], nil)
10621066 if ((unstakeInv == unstakeInv))
10631067 then {
1064- let $t03779337981 = getOneTknV2Internal(outAssetId, minOutAmount, [AttachedPayment(lpAssetId, unstakeAmount)], i.caller, i.originCaller, i.transactionId)
1065- let state = $t03779337981._1
1066- let totalAmount = $t03779337981._2
1068+ let $t03795938147 = getOneTknV2Internal(outAssetId, minOutAmount, [AttachedPayment(lpAssetId, unstakeAmount)], i.caller, i.originCaller, i.transactionId)
1069+ let state = $t03795938147._1
1070+ let totalAmount = $t03795938147._2
10671071 $Tuple2(state, totalAmount)
10681072 }
10691073 else throw("Strict value is not equal to itself.")
10701074 }
10711075 else throw("Strict value is not equal to itself.")
10721076 }
10731077
10741078
10751079
10761080 @Callable(i)
10771081 func putOneTknV2WithBonusREADONLY (paymentAmountRaw,paymentAssetId) = {
10781082 let poolConfig = gpc()
10791083 let amId = poolConfig[idxAmAsId]
10801084 let prId = poolConfig[idxPrAsId]
10811085 let lpId = poolConfig[idxLPAsId]
1082- let $t03824038337 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "")
1083- let lpAmount = $t03824038337._1
1084- let state = $t03824038337._2
1085- let feeAmount = $t03824038337._3
1086- let bonus = $t03824038337._4
1086+ let $t03840638503 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "")
1087+ let lpAmount = $t03840638503._1
1088+ let state = $t03840638503._2
1089+ let feeAmount = $t03840638503._3
1090+ let bonus = $t03840638503._4
10871091 $Tuple2(nil, $Tuple3(lpAmount, feeAmount, bonus))
10881092 }
10891093
10901094
10911095
10921096 @Callable(i)
10931097 func activate (amtAsStr,prAsStr) = if ((toString(i.caller) != toString(fca)))
10941098 then throw("denied")
10951099 else $Tuple2([StringEntry(aa(), amtAsStr), StringEntry(pa(), prAsStr)], "success")
10961100
10971101
10981102
10991103 @Callable(i)
11001104 func setS (k,v) = if ((toString(i.caller) != strf(this, ada())))
11011105 then pd
11021106 else [StringEntry(k, v)]
11031107
11041108
11051109
11061110 @Callable(i)
11071111 func setI (k,v) = if ((toString(i.caller) != strf(this, ada())))
11081112 then pd
11091113 else [IntegerEntry(k, v)]
11101114
11111115
11121116
11131117 @Callable(i)
11141118 func getPoolConfigWrapperREADONLY () = $Tuple2(nil, gpc())
11151119
11161120
11171121
11181122 @Callable(i)
11191123 func getAccBalanceWrapperREADONLY (assetId) = $Tuple2(nil, getAccBalance(assetId))
11201124
11211125
11221126
11231127 @Callable(i)
11241128 func calcPricesWrapperREADONLY (amAmt,prAmt,lpAmt) = {
11251129 let pr = calcPrices(amAmt, prAmt, lpAmt)
11261130 $Tuple2(nil, [toString(pr[0]), toString(pr[1]), toString(pr[2])])
11271131 }
11281132
11291133
11301134
11311135 @Callable(i)
11321136 func fromX18WrapperREADONLY (val,resScaleMult) = $Tuple2(nil, f1(parseBigIntValue(val), resScaleMult))
11331137
11341138
11351139
11361140 @Callable(i)
11371141 func toX18WrapperREADONLY (origVal,origScaleMult) = $Tuple2(nil, toString(t1(origVal, origScaleMult)))
11381142
11391143
11401144
11411145 @Callable(i)
11421146 func calcPriceBigIntWrapperREADONLY (prAmtX18,amAmtX18) = $Tuple2(nil, toString(cpbi(parseBigIntValue(prAmtX18), parseBigIntValue(amAmtX18))))
11431147
11441148
11451149
11461150 @Callable(i)
11471151 func estimatePutOperationWrapperREADONLY (txId58,slippage,inAmAmt,inAmId,inPrAmt,inPrId,usrAddr,isEval,emitLp) = $Tuple2(nil, epo(txId58, slippage, inAmAmt, inAmId, inPrAmt, inPrId, usrAddr, isEval, emitLp, true, false, 0, ""))
11481152
11491153
11501154
11511155 @Callable(i)
11521156 func estimateGetOperationWrapperREADONLY (txId58,pmtAsId,pmtLpAmt,usrAddr) = {
11531157 let r = ego(txId58, pmtAsId, pmtLpAmt, addressFromStringValue(usrAddr))
11541158 $Tuple2(nil, $Tuple10(r._1, r._2, r._3, r._4, r._5, r._6, r._7, toString(r._8), r._9, r._10))
11551159 }
11561160
11571161
11581162
11591163 @Callable(i)
11601164 func getFeeREADONLY () = $Tuple2(nil, fee)
11611165
11621166
11631167 @Verifier(tx)
11641168 func verify () = {
11651169 let targetPublicKey = match m() {
11661170 case pk: ByteVector =>
11671171 pk
11681172 case _: Unit =>
11691173 tx.senderPublicKey
11701174 case _ =>
11711175 throw("Match error")
11721176 }
11731177 match tx {
11741178 case order: Order =>
11751179 let matcherPub = mp()
11761180 let orderValid = moa(order)
11771181 let senderValid = sigVerify(order.bodyBytes, order.proofs[0], order.senderPublicKey)
11781182 let matcherValid = sigVerify(order.bodyBytes, order.proofs[1], matcherPub)
11791183 if (if (if (orderValid)
11801184 then senderValid
11811185 else false)
11821186 then matcherValid
11831187 else false)
11841188 then true
11851189 else toe(orderValid, senderValid, matcherValid)
11861190 case s: SetScriptTransaction =>
11871191 let newHash = blake2b256(value(s.script))
11881192 let allowedHash = fromBase64String(value(getString(fca, keyAllowedLpStableScriptHash())))
11891193 let currentHash = scriptHash(this)
11901194 if (if ((allowedHash == newHash))
11911195 then (currentHash != newHash)
11921196 else false)
11931197 then true
11941198 else sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
11951199 case _ =>
11961200 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
11971201 }
11981202 }
11991203

github/deemru/w8io/3ef1775 
125.72 ms