tx · FsiYSLSi2LwLFrvsx8cKu4b35Gx4Zz5UowqZA9H4x5xE

3Mqo3c7G5qkBfvMMLhriequKQFofhJSP9ip:  -0.06200000 Waves

2024.02.21 15:14 [2985981] smart account 3Mqo3c7G5qkBfvMMLhriequKQFofhJSP9ip > SELF 0.00000000 Waves

{ "type": 13, "id": "FsiYSLSi2LwLFrvsx8cKu4b35Gx4Zz5UowqZA9H4x5xE", "fee": 6200000, "feeAssetId": null, "timestamp": 1708517636604, "version": 2, "chainId": 84, "sender": "3Mqo3c7G5qkBfvMMLhriequKQFofhJSP9ip", "senderPublicKey": "5A4c5wG6NUWakcEewdfBkkZSvSdZRqo9onS5bqQrv3x1", "proofs": [ "jmXPCFSiJ95x42i73gM9vpvCLUavLaTvZAm3ZZpoegGMHLt2eTkkFUgfF3K41dZLrcpnUbVW5Us9F7gHszWCfv9" ], "script": "base64:BgKhAQgCEgASBQoDAQQBEgcKBQEEAQgBEgQKAgEEEgMKAQESBAoCAQQSBAoCCAESBAoCCAESBAoCCAESBQoDAQgBEgASBAoCAQESAwoBARIFCgMBAQESBAoCCAgSABIAEgMKAQgSBQoDAQEBEgQKAgEBEgQKAggBEgQKAggIEgsKCQgBAQIBAggEBBIGCgQICAEIEgASAwoBARIDCgEBEgQKAggBhAEACmxQZGVjaW1hbHMACAAGc2NhbGU4AIDC1y8ADHNjYWxlOEJpZ0ludAkAtgIBAIDC1y8AB3NjYWxlMTgJALYCAQCAgJC7utat8A0ACnplcm9CaWdJbnQJALYCAQAAAARiaWcwCQC2AgEAAAAEYmlnMQkAtgIBAAEABGJpZzIJALYCAQACAAt3YXZlc1N0cmluZwIFV0FWRVMAA1NFUAICX18AClBvb2xBY3RpdmUAAQAPUG9vbFB1dERpc2FibGVkAAIAE1Bvb2xNYXRjaGVyRGlzYWJsZWQAAwAMUG9vbFNodXRkb3duAAQADmlkeFBvb2xBZGRyZXNzAAEADWlkeFBvb2xTdGF0dXMAAgAQaWR4UG9vbExQQXNzZXRJZAADAA1pZHhBbXRBc3NldElkAAQAD2lkeFByaWNlQXNzZXRJZAAFAA5pZHhBbXRBc3NldERjbQAGABBpZHhQcmljZUFzc2V0RGNtAAcADmlkeElBbXRBc3NldElkAAgAEGlkeElQcmljZUFzc2V0SWQACQANaWR4TFBBc3NldERjbQAKABJpZHhQb29sQW10QXNzZXRBbXQAAQAUaWR4UG9vbFByaWNlQXNzZXRBbXQAAgARaWR4UG9vbExQQXNzZXRBbXQAAwAZaWR4RmFjdG9yeVN0YWtpbmdDb250cmFjdAABABppZHhGYWN0b3J5U2xpcHBhZ2VDb250cmFjdAAHAQV0b1gxOAIHb3JpZ1ZhbA1vcmlnU2NhbGVNdWx0CQC8AgMJALYCAQUHb3JpZ1ZhbAUHc2NhbGUxOAkAtgIBBQ1vcmlnU2NhbGVNdWx0AQt0b1gxOEJpZ0ludAIHb3JpZ1ZhbA1vcmlnU2NhbGVNdWx0CQC8AgMFB29yaWdWYWwFB3NjYWxlMTgFDW9yaWdTY2FsZU11bHQBB2Zyb21YMTgCA3ZhbA9yZXN1bHRTY2FsZU11bHQJAKADAQkAvAIDBQN2YWwJALYCAQUPcmVzdWx0U2NhbGVNdWx0BQdzY2FsZTE4AQxmcm9tWDE4Um91bmQDA3ZhbA9yZXN1bHRTY2FsZU11bHQFcm91bmQJAKADAQkAvQIEBQN2YWwJALYCAQUPcmVzdWx0U2NhbGVNdWx0BQdzY2FsZTE4BQVyb3VuZAEHdG9TY2FsZQMDYW10CHJlc1NjYWxlCGN1clNjYWxlCQBrAwUDYW10BQhyZXNTY2FsZQUIY3VyU2NhbGUBA2FicwEDdmFsAwkAZgIAAAUDdmFsCQEBLQEFA3ZhbAUDdmFsAQlhYnNCaWdJbnQBA3ZhbAMJAL8CAgUKemVyb0JpZ0ludAUDdmFsCQC+AgEFA3ZhbAUDdmFsAQxzd2FwQ29udHJhY3QAAhAlc19fc3dhcENvbnRyYWN0AQJmYwACEyVzX19mYWN0b3J5Q29udHJhY3QBE2tleU1hbmFnZXJQdWJsaWNLZXkAAhQlc19fbWFuYWdlclB1YmxpY0tleQEWa2V5TWFuYWdlclZhdWx0QWRkcmVzcwACFyVzX19tYW5hZ2VyVmF1bHRBZGRyZXNzAQJwbAACESVzJXNfX3ByaWNlX19sYXN0AQJwaAIBaAl0aW1lc3RhbXAJALkJAgkAzAgCAhglcyVzJWQlZF9fcHJpY2VfX2hpc3RvcnkJAMwIAgkApAMBBQFoCQDMCAIJAKQDAQUJdGltZXN0YW1wBQNuaWwFA1NFUAEDcGF1Agt1c2VyQWRkcmVzcwR0eElkCQCsAgIJAKwCAgkArAICAgslcyVzJXNfX1BfXwULdXNlckFkZHJlc3MCAl9fBQR0eElkAQNnYXUCC3VzZXJBZGRyZXNzBHR4SWQJAKwCAgkArAICCQCsAgICCyVzJXMlc19fR19fBQt1c2VyQWRkcmVzcwICX18FBHR4SWQBAmFhAAIPJXNfX2Ftb3VudEFzc2V0AQJwYQACDiVzX19wcmljZUFzc2V0AAZrZXlGZWUCByVzX19mZWUACmZlZURlZmF1bHQJAGsDAAoFBnNjYWxlOACQTgADZmVlCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFBmtleUZlZQUKZmVlRGVmYXVsdAAGa2V5S0xwCQC5CQIJAMwIAgICJXMJAMwIAgIDa0xwBQNuaWwFA1NFUAAVa2V5S0xwUmVmcmVzaGVkSGVpZ2h0CQC5CQIJAMwIAgICJXMJAMwIAgISa0xwUmVmcmVzaGVkSGVpZ2h0BQNuaWwFA1NFUAASa2V5S0xwUmVmcmVzaERlbGF5CQC5CQIJAMwIAgICJXMJAMwIAgIPcmVmcmVzaEtMcERlbGF5BQNuaWwFA1NFUAAWa0xwUmVmcmVzaERlbGF5RGVmYXVsdAAeAA9rTHBSZWZyZXNoRGVsYXkJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUSa2V5S0xwUmVmcmVzaERlbGF5BRZrTHBSZWZyZXNoRGVsYXlEZWZhdWx0ARRrZXlBZGRpdGlvbmFsQmFsYW5jZQEHYXNzZXRJZAkAuQkCCQDMCAICBCVzJXMJAMwIAgINc3Rha2VkQmFsYW5jZQkAzAgCBQdhc3NldElkBQNuaWwFA1NFUAEWa2V5U3Rha2luZ0Fzc2V0QmFsYW5jZQEHYXNzZXRJZAkAuQkCCQDMCAICBCVzJXMJAMwIAgIRc2hhcmVBc3NldEJhbGFuY2UJAMwIAgUHYXNzZXRJZAUDbmlsBQNTRVABGmdldEFkZGl0aW9uYWxCYWxhbmNlT3JaZXJvAQdhc3NldElkCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJARRrZXlBZGRpdGlvbmFsQmFsYW5jZQEFB2Fzc2V0SWQAAAEcZ2V0U3Rha2luZ0Fzc2V0QmFsYW5jZU9yWmVybwEHYXNzZXRJZAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEWa2V5U3Rha2luZ0Fzc2V0QmFsYW5jZQEFB2Fzc2V0SWQAAAEQa2V5RmFjdG9yeUNvbmZpZwACESVzX19mYWN0b3J5Q29uZmlnAQ1rZXlNYXRjaGVyUHViAAIYJXMlc19fbWF0Y2hlcl9fcHVibGljS2V5ASlrZXlNYXBwaW5nUG9vbENvbnRyYWN0QWRkcmVzc1RvUG9vbEFzc2V0cwETcG9vbENvbnRyYWN0QWRkcmVzcwkArAICCQCsAgICCCVzJXMlc19fBRNwb29sQ29udHJhY3RBZGRyZXNzAiBfX21hcHBpbmdzX19wb29sQ29udHJhY3QyTHBBc3NldAENa2V5UG9vbENvbmZpZwIJaUFtdEFzc2V0C2lQcmljZUFzc2V0CQCsAgIJAKwCAgkArAICCQCsAgICCCVkJWQlc19fBQlpQW10QXNzZXQCAl9fBQtpUHJpY2VBc3NldAIIX19jb25maWcBH2tleU1hcHBpbmdzQmFzZUFzc2V0MmludGVybmFsSWQBDGJhc2VBc3NldFN0cgkArAICAiglcyVzJXNfX21hcHBpbmdzX19iYXNlQXNzZXQyaW50ZXJuYWxJZF9fBQxiYXNlQXNzZXRTdHIBE2tleUFsbFBvb2xzU2h1dGRvd24AAgwlc19fc2h1dGRvd24BDWtleVBvb2xXZWlnaHQBD2NvbnRyYWN0QWRkcmVzcwkArAICAhIlcyVzX19wb29sV2VpZ2h0X18FD2NvbnRyYWN0QWRkcmVzcwEWa2V5QWxsb3dlZExwU2NyaXB0SGFzaAACFyVzX19hbGxvd2VkTHBTY3JpcHRIYXNoABZrZXlGZWVDb2xsZWN0b3JBZGRyZXNzAhclc19fZmVlQ29sbGVjdG9yQWRkcmVzcwEWa2V5U2tpcE9yZGVyVmFsaWRhdGlvbgELcG9vbEFkZHJlc3MJAKwCAgIbJXMlc19fc2tpcE9yZGVyVmFsaWRhdGlvbl9fBQtwb29sQWRkcmVzcwEPdGhyb3dPcmRlckVycm9yBApvcmRlclZhbGlkDm9yZGVyVmFsaWRJbmZvC3NlbmRlclZhbGlkDG1hdGNoZXJWYWxpZAkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAiRvcmRlciB2YWxpZGF0aW9uIGZhaWxlZDogb3JkZXJWYWxpZD0JAKUDAQUKb3JkZXJWYWxpZAICICgFDm9yZGVyVmFsaWRJbmZvAgEpAg0gc2VuZGVyVmFsaWQ9CQClAwEFC3NlbmRlclZhbGlkAg4gbWF0Y2hlclZhbGlkPQkApQMBBQxtYXRjaGVyVmFsaWQBF2FkZHJlc3NGcm9tU3RyaW5nT3JUaGlzAQ1hZGRyZXNzU3RyaW5nBAckbWF0Y2gwCQCmCAEFDWFkZHJlc3NTdHJpbmcDCQABAgUHJG1hdGNoMAIHQWRkcmVzcwQBYQUHJG1hdGNoMAUBYQUEdGhpcwEcZ2V0TWFuYWdlclZhdWx0QWRkcmVzc09yVGhpcwAEDmZhY3RvcnlBZGRyZXNzBAckbWF0Y2gwCQCiCAEJAQJmYwADCQABAgUHJG1hdGNoMAIGU3RyaW5nBANmY2EFByRtYXRjaDAJARdhZGRyZXNzRnJvbVN0cmluZ09yVGhpcwEFA2ZjYQUEdGhpcwQHJG1hdGNoMAkAnQgCBQ5mYWN0b3J5QWRkcmVzcwkBFmtleU1hbmFnZXJWYXVsdEFkZHJlc3MAAwkAAQIFByRtYXRjaDACBlN0cmluZwQBcwUHJG1hdGNoMAkBF2FkZHJlc3NGcm9tU3RyaW5nT3JUaGlzAQUBcwUEdGhpcwEPZ2V0U3RyaW5nT3JGYWlsAgdhZGRyZXNzA2tleQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFB2FkZHJlc3MFA2tleQkAuQkCCQDMCAICCm1hbmRhdG9yeSAJAMwIAgkApQgBBQdhZGRyZXNzCQDMCAICAS4JAMwIAgUDa2V5CQDMCAICDyBpcyBub3QgZGVmaW5lZAUDbmlsAgABDGdldEludE9yRmFpbAIHYWRkcmVzcwNrZXkJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQdhZGRyZXNzBQNrZXkJALkJAgkAzAgCAgptYW5kYXRvcnkgCQDMCAIJAKUIAQUHYWRkcmVzcwkAzAgCAgEuCQDMCAIFA2tleQkAzAgCAg8gaXMgbm90IGRlZmluZWQFA25pbAIAAQh0aHJvd0VycgEDbXNnCQACAQkAuQkCCQDMCAICCGxwLnJpZGU6CQDMCAIFA21zZwUDbmlsAgEgAQZmbXRFcnIBA21zZwkAuQkCCQDMCAICCGxwLnJpZGU6CQDMCAIFA21zZwUDbmlsAgEgAA9mYWN0b3J5Q29udHJhY3QJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQ9nZXRTdHJpbmdPckZhaWwCBQR0aGlzCQECZmMAABNmZWVDb2xsZWN0b3JBZGRyZXNzCQERQGV4dHJOYXRpdmUoMTA2MikBCQEPZ2V0U3RyaW5nT3JGYWlsAgUPZmFjdG9yeUNvbnRyYWN0BRZrZXlGZWVDb2xsZWN0b3JBZGRyZXNzAAVpbkZlZQoAAUAJAPwHBAUPZmFjdG9yeUNvbnRyYWN0AhBnZXRJbkZlZVJFQURPTkxZCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQNuaWwDCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50AAZvdXRGZWUKAAFACQD8BwQFD2ZhY3RvcnlDb250cmFjdAIRZ2V0T3V0RmVlUkVBRE9OTFkJAMwIAgkApQgBBQR0aGlzBQNuaWwFA25pbAMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQBFWtleUFkZHJlc3NXaGl0ZWxpc3RlZAEHYWRkcmVzcwkAuQkCCQDMCAICBCVzJXMJAMwIAgILd2hpdGVsaXN0ZWQJAMwIAgkApQgBBQdhZGRyZXNzBQNuaWwFA1NFUAEUaXNBZGRyZXNzV2hpdGVsaXN0ZWQBB2FkZHJlc3MJAQt2YWx1ZU9yRWxzZQIJAJsIAgUPZmFjdG9yeUNvbnRyYWN0CQEVa2V5QWRkcmVzc1doaXRlbGlzdGVkAQUHYWRkcmVzcwcBEGlzR2xvYmFsU2h1dGRvd24ACQELdmFsdWVPckVsc2UCCQCbCAIFD2ZhY3RvcnlDb250cmFjdAkBE2tleUFsbFBvb2xzU2h1dGRvd24ABwETZ2V0TWF0Y2hlclB1Yk9yRmFpbAAJANkEAQkBD2dldFN0cmluZ09yRmFpbAIFD2ZhY3RvcnlDb250cmFjdAkBDWtleU1hdGNoZXJQdWIAAQ1nZXRQb29sQ29uZmlnAAQIYW10QXNzZXQJAQ9nZXRTdHJpbmdPckZhaWwCBQR0aGlzCQECYWEABApwcmljZUFzc2V0CQEPZ2V0U3RyaW5nT3JGYWlsAgUEdGhpcwkBAnBhAAQLaVByaWNlQXNzZXQJAQxnZXRJbnRPckZhaWwCBQ9mYWN0b3J5Q29udHJhY3QJAR9rZXlNYXBwaW5nc0Jhc2VBc3NldDJpbnRlcm5hbElkAQUKcHJpY2VBc3NldAQJaUFtdEFzc2V0CQEMZ2V0SW50T3JGYWlsAgUPZmFjdG9yeUNvbnRyYWN0CQEfa2V5TWFwcGluZ3NCYXNlQXNzZXQyaW50ZXJuYWxJZAEFCGFtdEFzc2V0CQC1CQIJAQ9nZXRTdHJpbmdPckZhaWwCBQ9mYWN0b3J5Q29udHJhY3QJAQ1rZXlQb29sQ29uZmlnAgkApAMBBQlpQW10QXNzZXQJAKQDAQULaVByaWNlQXNzZXQFA1NFUAEMcGFyc2VBc3NldElkAQVpbnB1dAMJAAACBQVpbnB1dAULd2F2ZXNTdHJpbmcFBHVuaXQJANkEAQUFaW5wdXQBD2Fzc2V0SWRUb1N0cmluZwEFaW5wdXQDCQAAAgUFaW5wdXQFBHVuaXQFC3dhdmVzU3RyaW5nCQDYBAEJAQV2YWx1ZQEFBWlucHV0AQ9wYXJzZVBvb2xDb25maWcBCnBvb2xDb25maWcJAJkKBwkBEUBleHRyTmF0aXZlKDEwNjIpAQkAkQMCBQpwb29sQ29uZmlnBQ5pZHhQb29sQWRkcmVzcwkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCnBvb2xDb25maWcFDWlkeFBvb2xTdGF0dXMJANkEAQkAkQMCBQpwb29sQ29uZmlnBRBpZHhQb29sTFBBc3NldElkCQEMcGFyc2VBc3NldElkAQkAkQMCBQpwb29sQ29uZmlnBQ1pZHhBbXRBc3NldElkCQEMcGFyc2VBc3NldElkAQkAkQMCBQpwb29sQ29uZmlnBQ9pZHhQcmljZUFzc2V0SWQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQpwb29sQ29uZmlnBQ5pZHhBbXRBc3NldERjbQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCnBvb2xDb25maWcFEGlkeFByaWNlQXNzZXREY20AEHBvb2xDb25maWdQYXJzZWQJAQ9wYXJzZVBvb2xDb25maWcBCQENZ2V0UG9vbENvbmZpZwAACyR0MDk3Njk5OTM1BRBwb29sQ29uZmlnUGFyc2VkAA5jZmdQb29sQWRkcmVzcwgFCyR0MDk3Njk5OTM1Al8xAA1jZmdQb29sU3RhdHVzCAULJHQwOTc2OTk5MzUCXzIADGNmZ0xwQXNzZXRJZAgFCyR0MDk3Njk5OTM1Al8zABBjZmdBbW91bnRBc3NldElkCAULJHQwOTc2OTk5MzUCXzQAD2NmZ1ByaWNlQXNzZXRJZAgFCyR0MDk3Njk5OTM1Al81ABZjZmdBbW91bnRBc3NldERlY2ltYWxzCAULJHQwOTc2OTk5MzUCXzYAFWNmZ1ByaWNlQXNzZXREZWNpbWFscwgFCyR0MDk3Njk5OTM1Al83ARBnZXRGYWN0b3J5Q29uZmlnAAkAtQkCCQEPZ2V0U3RyaW5nT3JGYWlsAgUPZmFjdG9yeUNvbnRyYWN0CQEQa2V5RmFjdG9yeUNvbmZpZwAFA1NFUAAPc3Rha2luZ0NvbnRyYWN0CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkAkQMCCQEQZ2V0RmFjdG9yeUNvbmZpZwAFGWlkeEZhY3RvcnlTdGFraW5nQ29udHJhY3QCGWluY29ycmVjdCBzdGFraW5nIGFkZHJlc3MAEHNsaXBwYWdlQ29udHJhY3QJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIJARBnZXRGYWN0b3J5Q29uZmlnAAUaaWR4RmFjdG9yeVNsaXBwYWdlQ29udHJhY3QCGWluY29ycmVjdCBzdGFraW5nIGFkZHJlc3MBEWRhdGFQdXRBY3Rpb25JbmZvCg1pbkFtdEFzc2V0QW10D2luUHJpY2VBc3NldEFtdAhvdXRMcEFtdAVwcmljZR1zbGlwcGFnZVRvbGVyYW5jZVBhc3NlZEJ5VXNlchVzbGlwcGFnZVRvbGVyYW5jZVJlYWwIdHhIZWlnaHQLdHhUaW1lc3RhbXASc2xpcGFnZUFtdEFzc2V0QW10FHNsaXBhZ2VQcmljZUFzc2V0QW10CQC5CQIJAMwIAgIUJWQlZCVkJWQlZCVkJWQlZCVkJWQJAMwIAgkApAMBBQ1pbkFtdEFzc2V0QW10CQDMCAIJAKQDAQUPaW5QcmljZUFzc2V0QW10CQDMCAIJAKQDAQUIb3V0THBBbXQJAMwIAgkApAMBBQVwcmljZQkAzAgCCQCkAwEFHXNsaXBwYWdlVG9sZXJhbmNlUGFzc2VkQnlVc2VyCQDMCAIJAKQDAQUVc2xpcHBhZ2VUb2xlcmFuY2VSZWFsCQDMCAIJAKQDAQUIdHhIZWlnaHQJAMwIAgkApAMBBQt0eFRpbWVzdGFtcAkAzAgCCQCkAwEFEnNsaXBhZ2VBbXRBc3NldEFtdAkAzAgCCQCkAwEFFHNsaXBhZ2VQcmljZUFzc2V0QW10BQNuaWwFA1NFUAERZGF0YUdldEFjdGlvbkluZm8GDm91dEFtdEFzc2V0QW10EG91dFByaWNlQXNzZXRBbXQHaW5McEFtdAVwcmljZQh0eEhlaWdodAt0eFRpbWVzdGFtcAkAuQkCCQDMCAICDCVkJWQlZCVkJWQlZAkAzAgCCQCkAwEFDm91dEFtdEFzc2V0QW10CQDMCAIJAKQDAQUQb3V0UHJpY2VBc3NldEFtdAkAzAgCCQCkAwEFB2luTHBBbXQJAMwIAgkApAMBBQVwcmljZQkAzAgCCQCkAwEFCHR4SGVpZ2h0CQDMCAIJAKQDAQULdHhUaW1lc3RhbXAFA25pbAUDU0VQAQ1nZXRBY2NCYWxhbmNlAQdhc3NldElkBA1iYWxhbmNlT25Qb29sAwkAAAIFB2Fzc2V0SWQCBVdBVkVTCAkA7wcBBQR0aGlzCWF2YWlsYWJsZQkA8AcCBQR0aGlzCQDZBAEFB2Fzc2V0SWQEDHRvdGFsQmFsYW5jZQkAZQIJAGQCBQ1iYWxhbmNlT25Qb29sCQEaZ2V0QWRkaXRpb25hbEJhbGFuY2VPclplcm8BBQdhc3NldElkCQEcZ2V0U3Rha2luZ0Fzc2V0QmFsYW5jZU9yWmVybwEFB2Fzc2V0SWQJAJYDAQkAzAgCAAAJAMwIAgUMdG90YWxCYWxhbmNlBQNuaWwBD2NhbGNQcmljZUJpZ0ludAIIcHJBbXRYMTgIYW1BbXRYMTgJALwCAwUIcHJBbXRYMTgFB3NjYWxlMTgFCGFtQW10WDE4ARRjYWxjUHJpY2VCaWdJbnRSb3VuZAMIcHJBbXRYMTgIYW1BbXRYMTgFcm91bmQJAL0CBAUIcHJBbXRYMTgFB3NjYWxlMTgFCGFtQW10WDE4BQVyb3VuZAEHZ2V0UmF0ZQEFcHJveHkEA2ludgkA/AcEBQVwcm94eQIHZ2V0UmF0ZQUDbmlsBQNuaWwDCQAAAgUDaW52BQNpbnYEByRtYXRjaDAFA2ludgMJAAECBQckbWF0Y2gwAgNJbnQEAXIFByRtYXRjaDAFAXIJAQh0aHJvd0VycgECIHByb3h5LmdldFJhdGUoKSB1bmV4cGVjdGVkIHZhbHVlCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQdkZXBvc2l0BAdhc3NldElkBmFtb3VudA5zdGFraW5nQXNzZXRJZAVwcm94eQQYY3VycmVudEFkZGl0aW9uYWxCYWxhbmNlCQEaZ2V0QWRkaXRpb25hbEJhbGFuY2VPclplcm8BBQdhc3NldElkAwkAAAIFGGN1cnJlbnRBZGRpdGlvbmFsQmFsYW5jZQUYY3VycmVudEFkZGl0aW9uYWxCYWxhbmNlBBpjdXJyZW50U3Rha2luZ0Fzc2V0QmFsYW5jZQkBHGdldFN0YWtpbmdBc3NldEJhbGFuY2VPclplcm8BBQ5zdGFraW5nQXNzZXRJZAMJAAACBRpjdXJyZW50U3Rha2luZ0Fzc2V0QmFsYW5jZQUaY3VycmVudFN0YWtpbmdBc3NldEJhbGFuY2UEBWFzc2V0CQEMcGFyc2VBc3NldElkAQUHYXNzZXRJZAMJAGYCBQZhbW91bnQAAAQNZGVwb3NpdEludm9rZQkA/AcEBQVwcm94eQIHZGVwb3NpdAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQVhc3NldAUGYW1vdW50BQNuaWwDCQAAAgUNZGVwb3NpdEludm9rZQUNZGVwb3NpdEludm9rZQQHJG1hdGNoMAUNZGVwb3NpdEludm9rZQMJAAECBQckbWF0Y2gwAgNJbnQEFHJlY2VpdmVkU3Rha2luZ0Fzc2V0BQckbWF0Y2gwBBRuZXdBZGRpdGlvbmFsQmFsYW5jZQkAZAIFGGN1cnJlbnRBZGRpdGlvbmFsQmFsYW5jZQUGYW1vdW50BBZuZXdTdGFraW5nQXNzZXRCYWxhbmNlCQBkAgUaY3VycmVudFN0YWtpbmdBc3NldEJhbGFuY2UFFHJlY2VpdmVkU3Rha2luZ0Fzc2V0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEUa2V5QWRkaXRpb25hbEJhbGFuY2UBBQdhc3NldElkBRRuZXdBZGRpdGlvbmFsQmFsYW5jZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBFmtleVN0YWtpbmdBc3NldEJhbGFuY2UBBQ5zdGFraW5nQXNzZXRJZAUWbmV3U3Rha2luZ0Fzc2V0QmFsYW5jZQUDbmlsBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4FA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEId2l0aGRyYXcGB2Fzc2V0SWQGYW1vdW50DnN0YWtpbmdBc3NldElkBXByb3h5DHByb3h5UmF0ZU11bA1wcm9maXRBZGRyZXNzBBhjdXJyZW50QWRkaXRpb25hbEJhbGFuY2UJARpnZXRBZGRpdGlvbmFsQmFsYW5jZU9yWmVybwEFB2Fzc2V0SWQDCQAAAgUYY3VycmVudEFkZGl0aW9uYWxCYWxhbmNlBRhjdXJyZW50QWRkaXRpb25hbEJhbGFuY2UEGmN1cnJlbnRTdGFraW5nQXNzZXRCYWxhbmNlCQEcZ2V0U3Rha2luZ0Fzc2V0QmFsYW5jZU9yWmVybwEFDnN0YWtpbmdBc3NldElkAwkAAAIFGmN1cnJlbnRTdGFraW5nQXNzZXRCYWxhbmNlBRpjdXJyZW50U3Rha2luZ0Fzc2V0QmFsYW5jZQQQY3VycmVudFByb3h5UmF0ZQkBB2dldFJhdGUBBQVwcm94eQMJAAACBRBjdXJyZW50UHJveHlSYXRlBRBjdXJyZW50UHJveHlSYXRlBAdvbGRSYXRlCQBrAwUMcHJveHlSYXRlTXVsBRhjdXJyZW50QWRkaXRpb25hbEJhbGFuY2UFGmN1cnJlbnRTdGFraW5nQXNzZXRCYWxhbmNlBAxzdGFraW5nQXNzZXQJAQxwYXJzZUFzc2V0SWQBBQ5zdGFraW5nQXNzZXRJZAQUb2xkU2VuZFN0YWtpbmdBbW91bnQJAGsDBQxwcm94eVJhdGVNdWwFBmFtb3VudAUHb2xkUmF0ZQQWc2VuZFN0YWtpbmdBc3NldEFtb3VudAkAawMFDHByb3h5UmF0ZU11bAUGYW1vdW50BRBjdXJyZW50UHJveHlSYXRlBAxwcm9maXRBbW91bnQJAJYDAQkAzAgCAAAJAMwIAgkAZQIFFG9sZFNlbmRTdGFraW5nQW1vdW50BRZzZW5kU3Rha2luZ0Fzc2V0QW1vdW50BQNuaWwDCQBmAgUWc2VuZFN0YWtpbmdBc3NldEFtb3VudAAABA53aXRoZHJhd0ludm9rZQkA/AcEBQVwcm94eQIId2l0aGRyYXcFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUMc3Rha2luZ0Fzc2V0BRZzZW5kU3Rha2luZ0Fzc2V0QW1vdW50BQNuaWwDCQAAAgUOd2l0aGRyYXdJbnZva2UFDndpdGhkcmF3SW52b2tlBAckbWF0Y2gwBQ53aXRoZHJhd0ludm9rZQMJAAECBQckbWF0Y2gwAgNJbnQEDnJlY2VpdmVkQXNzZXRzBQckbWF0Y2gwBBRuZXdBZGRpdGlvbmFsQmFsYW5jZQkAZQIFGGN1cnJlbnRBZGRpdGlvbmFsQmFsYW5jZQUOcmVjZWl2ZWRBc3NldHMEFm5ld1N0YWtpbmdBc3NldEJhbGFuY2UJAGUCCQBlAgUaY3VycmVudFN0YWtpbmdBc3NldEJhbGFuY2UFFnNlbmRTdGFraW5nQXNzZXRBbW91bnQFDHByb2ZpdEFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBFGtleUFkZGl0aW9uYWxCYWxhbmNlAQUHYXNzZXRJZAUUbmV3QWRkaXRpb25hbEJhbGFuY2UJAMwIAgkBDEludGVnZXJFbnRyeQIJARZrZXlTdGFraW5nQXNzZXRCYWxhbmNlAQUOc3Rha2luZ0Fzc2V0SWQFFm5ld1N0YWtpbmdBc3NldEJhbGFuY2UJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUNcHJvZml0QWRkcmVzcwUMcHJvZml0QW1vdW50CQEMcGFyc2VBc3NldElkAQUOc3Rha2luZ0Fzc2V0SWQFA25pbAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BE2dldExlYXNlUHJveHlDb25maWcBB2Fzc2V0SWQEByRtYXRjaDAJAPwHBAUPZmFjdG9yeUNvbnRyYWN0AhpnZXRQb29sTGVhc2VDb25maWdSRUFET05MWQkAzAgCCQClCAEFBHRoaXMJAMwIAgUHYXNzZXRJZAUDbmlsBQNuaWwDCQABAgUHJG1hdGNoMAIwKEJvb2xlYW4sIEludCwgSW50LCBTdHJpbmcsIFN0cmluZywgSW50LCBTdHJpbmcpBAFhBQckbWF0Y2gwBQFhCQEIdGhyb3dFcnIBCQCsAgIJAKwCAgIBWwUHYXNzZXRJZAIdXSBnZXRMZWFzZVByb3h5Q29uZmlnKCkgZXJyb3IBEXJlYmFsYW5jZUludGVybmFsBwt0YXJnZXRSYXRpbwdhc3NldElkDnN0YWtpbmdBc3NldElkCm1pbkJhbGFuY2UFcHJveHkMcHJveHlSYXRlTXVsDXByb2ZpdEFkZHJlc3MEGmN1cnJlbnRTdGFraW5nQXNzZXRCYWxhbmNlCQEcZ2V0U3Rha2luZ0Fzc2V0QmFsYW5jZU9yWmVybwEFDnN0YWtpbmdBc3NldElkAwkAAAIFGmN1cnJlbnRTdGFraW5nQXNzZXRCYWxhbmNlBRpjdXJyZW50U3Rha2luZ0Fzc2V0QmFsYW5jZQQYY3VycmVudEFkZGl0aW9uYWxCYWxhbmNlAwkBAiE9AgUaY3VycmVudFN0YWtpbmdBc3NldEJhbGFuY2UAAAkBGmdldEFkZGl0aW9uYWxCYWxhbmNlT3JaZXJvAQUHYXNzZXRJZAAAAwkAAAIFGGN1cnJlbnRBZGRpdGlvbmFsQmFsYW5jZQUYY3VycmVudEFkZGl0aW9uYWxCYWxhbmNlBBRsZWFzYWJsZVRvdGFsQmFsYW5jZQkAlgMBCQDMCAIAAAkAzAgCCQBlAgkBDWdldEFjY0JhbGFuY2UBBQdhc3NldElkBQptaW5CYWxhbmNlBQNuaWwEF3RhcmdldEFkZGl0aW9uYWxCYWxhbmNlCQBrAwULdGFyZ2V0UmF0aW8FFGxlYXNhYmxlVG90YWxCYWxhbmNlAGQEBGRpZmYJAGUCBRhjdXJyZW50QWRkaXRpb25hbEJhbGFuY2UFF3RhcmdldEFkZGl0aW9uYWxCYWxhbmNlAwkAAAIFBGRpZmYAAAUDbmlsAwkAZgIAAAUEZGlmZgQPc2VuZEFzc2V0QW1vdW50CQEBLQEFBGRpZmYJAQdkZXBvc2l0BAUHYXNzZXRJZAUPc2VuZEFzc2V0QW1vdW50BQ5zdGFraW5nQXNzZXRJZAUFcHJveHkEDmdldEFzc2V0QW1vdW50BQRkaWZmCQEId2l0aGRyYXcGBQdhc3NldElkBQ5nZXRBc3NldEFtb3VudAUOc3Rha2luZ0Fzc2V0SWQFBXByb3h5BQxwcm94eVJhdGVNdWwFDXByb2ZpdEFkZHJlc3MJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BDnJlYmFsYW5jZUFzc2V0AQdhc3NldElkBA0kdDAxNjIyMDE2MzU2CQETZ2V0TGVhc2VQcm94eUNvbmZpZwEFB2Fzc2V0SWQECmlzTGVhc2FibGUIBQ0kdDAxNjIyMDE2MzU2Al8xBAtsZWFzZWRSYXRpbwgFDSR0MDE2MjIwMTYzNTYCXzIECm1pbkJhbGFuY2UIBQ0kdDAxNjIyMDE2MzU2Al8zBAxwcm94eUFkZHJlc3MIBQ0kdDAxNjIyMDE2MzU2Al80BAxwcm94eUFzc2V0SWQIBQ0kdDAxNjIyMDE2MzU2Al81BAxwcm94eVJhdGVNdWwIBQ0kdDAxNjIyMDE2MzU2Al82BBRzdGFraW5nUHJvZml0QWRkcmVzcwgFDSR0MDE2MjIwMTYzNTYCXzcDBQppc0xlYXNhYmxlCQERcmViYWxhbmNlSW50ZXJuYWwHBQtsZWFzZWRSYXRpbwUHYXNzZXRJZAUMcHJveHlBc3NldElkBQptaW5CYWxhbmNlCQERQGV4dHJOYXRpdmUoMTA2MikBBQxwcm94eUFkZHJlc3MFDHByb3h5UmF0ZU11bAkBEUBleHRyTmF0aXZlKDEwNjIpAQUUc3Rha2luZ1Byb2ZpdEFkZHJlc3MFA25pbAEZd2l0aGRyYXdBbmRSZWJhbGFuY2VBc3NldAIHYXNzZXRJZAlnZXRBbW91bnQEDSR0MDE2NzU1MTY4OTEJARNnZXRMZWFzZVByb3h5Q29uZmlnAQUHYXNzZXRJZAQKaXNMZWFzYWJsZQgFDSR0MDE2NzU1MTY4OTECXzEEC2xlYXNlZFJhdGlvCAUNJHQwMTY3NTUxNjg5MQJfMgQKbWluQmFsYW5jZQgFDSR0MDE2NzU1MTY4OTECXzMEDHByb3h5QWRkcmVzcwgFDSR0MDE2NzU1MTY4OTECXzQEDHByb3h5QXNzZXRJZAgFDSR0MDE2NzU1MTY4OTECXzUEDHByb3h5UmF0ZU11bAgFDSR0MDE2NzU1MTY4OTECXzYEFHN0YWtpbmdQcm9maXRBZGRyZXNzCAUNJHQwMTY3NTUxNjg5MQJfNwMFCmlzTGVhc2FibGUEGmN1cnJlbnRTdGFraW5nQXNzZXRCYWxhbmNlCQEcZ2V0U3Rha2luZ0Fzc2V0QmFsYW5jZU9yWmVybwEFDHByb3h5QXNzZXRJZAMJAAACBRpjdXJyZW50U3Rha2luZ0Fzc2V0QmFsYW5jZQUaY3VycmVudFN0YWtpbmdBc3NldEJhbGFuY2UEGGN1cnJlbnRBZGRpdGlvbmFsQmFsYW5jZQMJAQIhPQIFGmN1cnJlbnRTdGFraW5nQXNzZXRCYWxhbmNlAAAJARpnZXRBZGRpdGlvbmFsQmFsYW5jZU9yWmVybwEFB2Fzc2V0SWQAAAMJAAACBRhjdXJyZW50QWRkaXRpb25hbEJhbGFuY2UFGGN1cnJlbnRBZGRpdGlvbmFsQmFsYW5jZQQXbmV3VG90YWxMZWFzYWJsZUJhbGFuY2UJAJYDAQkAzAgCAAAJAMwIAgkAZQIJAGUCCQENZ2V0QWNjQmFsYW5jZQEFB2Fzc2V0SWQFCWdldEFtb3VudAUKbWluQmFsYW5jZQUDbmlsAwkAAAIFF25ld1RvdGFsTGVhc2FibGVCYWxhbmNlBRduZXdUb3RhbExlYXNhYmxlQmFsYW5jZQQUbmV3QWRkaXRpb25hbEJhbGFuY2UJAGsDBQtsZWFzZWRSYXRpbwUXbmV3VG90YWxMZWFzYWJsZUJhbGFuY2UAZAMJAAACBRRuZXdBZGRpdGlvbmFsQmFsYW5jZQUUbmV3QWRkaXRpb25hbEJhbGFuY2UEDndpdGhkcmF3QW1vdW50CQBlAgUYY3VycmVudEFkZGl0aW9uYWxCYWxhbmNlBRRuZXdBZGRpdGlvbmFsQmFsYW5jZQMJAAACBQ53aXRoZHJhd0Ftb3VudAUOd2l0aGRyYXdBbW91bnQDCQBmAgAABQ53aXRoZHJhd0Ftb3VudAkBB2RlcG9zaXQEBQdhc3NldElkCQEBLQEFDndpdGhkcmF3QW1vdW50BQxwcm94eUFzc2V0SWQJARFAZXh0ck5hdGl2ZSgxMDYyKQEFDHByb3h5QWRkcmVzcwkBCHdpdGhkcmF3BgUHYXNzZXRJZAUOd2l0aGRyYXdBbW91bnQFDHByb3h5QXNzZXRJZAkBEUBleHRyTmF0aXZlKDEwNjIpAQUMcHJveHlBZGRyZXNzBQxwcm94eVJhdGVNdWwJARFAZXh0ck5hdGl2ZSgxMDYyKQEFFHN0YWtpbmdQcm9maXRBZGRyZXNzCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBQNuaWwBF3dpdGhkcmF3QW5kUmViYWxhbmNlQWxsAhRhbW91bnRBc3NldE91dEFtb3VudBNwcmljZUFzc2V0T3V0QW1vdW50BBJBbUFtdFdpdGhkcmF3U3RhdGUJARl3aXRoZHJhd0FuZFJlYmFsYW5jZUFzc2V0AgkBD2dldFN0cmluZ09yRmFpbAIFBHRoaXMJAQJhYQAFFGFtb3VudEFzc2V0T3V0QW1vdW50BBJQckFtdFdpdGhkcmF3U3RhdGUJARl3aXRoZHJhd0FuZFJlYmFsYW5jZUFzc2V0AgkBD2dldFN0cmluZ09yRmFpbAIFBHRoaXMJAQJwYQAFE3ByaWNlQXNzZXRPdXRBbW91bnQJAM4IAgUSQW1BbXRXaXRoZHJhd1N0YXRlBRJQckFtdFdpdGhkcmF3U3RhdGUBEHByaXZhdGVDYWxjUHJpY2UECmFtQXNzZXREY20KcHJBc3NldERjbQVhbUFtdAVwckFtdAQOYW10QXNzZXRBbXRYMTgJAQV0b1gxOAIFBWFtQW10BQphbUFzc2V0RGNtBBBwcmljZUFzc2V0QW10WDE4CQEFdG9YMTgCBQVwckFtdAUKcHJBc3NldERjbQkBD2NhbGNQcmljZUJpZ0ludAIFEHByaWNlQXNzZXRBbXRYMTgFDmFtdEFzc2V0QW10WDE4AQpjYWxjUHJpY2VzAwVhbUFtdAVwckFtdAVscEFtdAQDY2ZnCQENZ2V0UG9vbENvbmZpZwAEC2FtdEFzc2V0RGNtCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUDY2ZnBQ5pZHhBbXRBc3NldERjbQQNcHJpY2VBc3NldERjbQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFA2NmZwUQaWR4UHJpY2VBc3NldERjbQQIcHJpY2VYMTgJARBwcml2YXRlQ2FsY1ByaWNlBAULYW10QXNzZXREY20FDXByaWNlQXNzZXREY20FBWFtQW10BQVwckFtdAQIYW1BbXRYMTgJAQV0b1gxOAIFBWFtQW10BQthbXRBc3NldERjbQQIcHJBbXRYMTgJAQV0b1gxOAIFBXByQW10BQ1wcmljZUFzc2V0RGNtBAhscEFtdFgxOAkBBXRvWDE4AgUFbHBBbXQFBnNjYWxlOAQTbHBQcmljZUluQW1Bc3NldFgxOAkBD2NhbGNQcmljZUJpZ0ludAIFCGFtQW10WDE4BQhscEFtdFgxOAQTbHBQcmljZUluUHJBc3NldFgxOAkBD2NhbGNQcmljZUJpZ0ludAIFCHByQW10WDE4BQhscEFtdFgxOAkAzAgCBQhwcmljZVgxOAkAzAgCBRNscFByaWNlSW5BbUFzc2V0WDE4CQDMCAIFE2xwUHJpY2VJblByQXNzZXRYMTgFA25pbAEPY2FsY3VsYXRlUHJpY2VzAwVhbUFtdAVwckFtdAVscEFtdAQGcHJpY2VzCQEKY2FsY1ByaWNlcwMFBWFtQW10BQVwckFtdAUFbHBBbXQJAMwIAgkBB2Zyb21YMTgCCQCRAwIFBnByaWNlcwAABQZzY2FsZTgJAMwIAgkBB2Zyb21YMTgCCQCRAwIFBnByaWNlcwABBQZzY2FsZTgJAMwIAgkBB2Zyb21YMTgCCQCRAwIFBnByaWNlcwACBQZzY2FsZTgFA25pbAEUZXN0aW1hdGVHZXRPcGVyYXRpb24EBnR4SWQ1OApwbXRBc3NldElkCHBtdExwQW10C3VzZXJBZGRyZXNzBANjZmcJAQ1nZXRQb29sQ29uZmlnAAQJbHBBc3NldElkCQCRAwIFA2NmZwUQaWR4UG9vbExQQXNzZXRJZAQJYW1Bc3NldElkCQCRAwIFA2NmZwUNaWR4QW10QXNzZXRJZAQJcHJBc3NldElkCQCRAwIFA2NmZwUPaWR4UHJpY2VBc3NldElkBAphbUFzc2V0RGNtCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUDY2ZnBQ5pZHhBbXRBc3NldERjbQQKcHJBc3NldERjbQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFA2NmZwUQaWR4UHJpY2VBc3NldERjbQQKcG9vbFN0YXR1cwkAkQMCBQNjZmcFDWlkeFBvb2xTdGF0dXMECmxwRW1pc3Npb24ICQETdmFsdWVPckVycm9yTWVzc2FnZQIJAOwHAQkA2QQBBQlscEFzc2V0SWQJAKwCAgkArAICAgZBc3NldCAFCWxwQXNzZXRJZAIOIGRvZXNuJ3QgZXhpc3QIcXVhbnRpdHkDCQECIT0CBQlscEFzc2V0SWQFCnBtdEFzc2V0SWQJAAIBAhVJbnZhbGlkIGFzc2V0IHBhc3NlZC4ECWFtQmFsYW5jZQkBDWdldEFjY0JhbGFuY2UBBQlhbUFzc2V0SWQEDGFtQmFsYW5jZVgxOAkBBXRvWDE4AgUJYW1CYWxhbmNlBQphbUFzc2V0RGNtBAlwckJhbGFuY2UJAQ1nZXRBY2NCYWxhbmNlAQUJcHJBc3NldElkBAxwckJhbGFuY2VYMTgJAQV0b1gxOAIFCXByQmFsYW5jZQUKcHJBc3NldERjbQQLY3VyUHJpY2VYMTgJAQ9jYWxjUHJpY2VCaWdJbnQCBQxwckJhbGFuY2VYMTgFDGFtQmFsYW5jZVgxOAQIY3VyUHJpY2UJAQdmcm9tWDE4AgULY3VyUHJpY2VYMTgFBnNjYWxlOAQLcG10THBBbXRYMTgJAQV0b1gxOAIFCHBtdExwQW10BQZzY2FsZTgEDWxwRW1pc3Npb25YMTgJAQV0b1gxOAIFCmxwRW1pc3Npb24FBnNjYWxlOAQLb3V0QW1BbXRYMTgJALwCAwUMYW1CYWxhbmNlWDE4BQtwbXRMcEFtdFgxOAUNbHBFbWlzc2lvblgxOAQLb3V0UHJBbXRYMTgJALwCAwUMcHJCYWxhbmNlWDE4BQtwbXRMcEFtdFgxOAUNbHBFbWlzc2lvblgxOAQIb3V0QW1BbXQJAQxmcm9tWDE4Um91bmQDBQtvdXRBbUFtdFgxOAUKYW1Bc3NldERjbQUFRkxPT1IECG91dFByQW10CQEMZnJvbVgxOFJvdW5kAwULb3V0UHJBbXRYMTgFCnByQXNzZXREY20FBUZMT09SBAVzdGF0ZQMJAAACBQZ0eElkNTgCAAUDbmlsCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFC3VzZXJBZGRyZXNzBQhvdXRBbUFtdAMJAAACBQlhbUFzc2V0SWQCBVdBVkVTBQR1bml0CQDZBAEFCWFtQXNzZXRJZAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQt1c2VyQWRkcmVzcwUIb3V0UHJBbXQDCQAAAgUJcHJBc3NldElkAgVXQVZFUwUEdW5pdAkA2QQBBQlwckFzc2V0SWQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBA2dhdQIJAKUIAQULdXNlckFkZHJlc3MFBnR4SWQ1OAkBEWRhdGFHZXRBY3Rpb25JbmZvBgUIb3V0QW1BbXQFCG91dFByQW10BQhwbXRMcEFtdAUIY3VyUHJpY2UFBmhlaWdodAgFCWxhc3RCbG9jawl0aW1lc3RhbXAJAMwIAgkBDEludGVnZXJFbnRyeQIJAQJwbAAFCGN1clByaWNlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECcGgCBQZoZWlnaHQIBQlsYXN0QmxvY2sJdGltZXN0YW1wBQhjdXJQcmljZQUDbmlsCQCcCgoFCG91dEFtQW10BQhvdXRQckFtdAUJYW1Bc3NldElkBQlwckFzc2V0SWQFCWFtQmFsYW5jZQUJcHJCYWxhbmNlBQpscEVtaXNzaW9uBQtjdXJQcmljZVgxOAUKcG9vbFN0YXR1cwUFc3RhdGUBFGVzdGltYXRlUHV0T3BlcmF0aW9uCQZ0eElkNTgRc2xpcHBhZ2VUb2xlcmFuY2UMaW5BbUFzc2V0QW10C2luQW1Bc3NldElkDGluUHJBc3NldEFtdAtpblByQXNzZXRJZAt1c2VyQWRkcmVzcwppc0V2YWx1YXRlBmVtaXRMcAQDY2ZnCQENZ2V0UG9vbENvbmZpZwAECWxwQXNzZXRJZAkA2QQBCQCRAwIFA2NmZwUQaWR4UG9vbExQQXNzZXRJZAQMYW1Bc3NldElkU3RyCQCRAwIFA2NmZwUNaWR4QW10QXNzZXRJZAQMcHJBc3NldElkU3RyCQCRAwIFA2NmZwUPaWR4UHJpY2VBc3NldElkBAtpQW10QXNzZXRJZAkAkQMCBQNjZmcFDmlkeElBbXRBc3NldElkBA1pUHJpY2VBc3NldElkCQCRAwIFA2NmZwUQaWR4SVByaWNlQXNzZXRJZAQLYW10QXNzZXREY20JAQ1wYXJzZUludFZhbHVlAQkAkQMCBQNjZmcFDmlkeEFtdEFzc2V0RGNtBA1wcmljZUFzc2V0RGNtCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUDY2ZnBRBpZHhQcmljZUFzc2V0RGNtBApwb29sU3RhdHVzCQCRAwIFA2NmZwUNaWR4UG9vbFN0YXR1cwQKbHBFbWlzc2lvbggJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkA7AcBBQlscEFzc2V0SWQJAKwCAgkArAICAgZBc3NldCAJANgEAQUJbHBBc3NldElkAg4gZG9lc24ndCBleGlzdAhxdWFudGl0eQQOaW5BbUFzc2V0SWRTdHIJANgEAQkBC3ZhbHVlT3JFbHNlAgULaW5BbUFzc2V0SWQJANkEAQIFV0FWRVMEDmluUHJBc3NldElkU3RyCQDYBAEJAQt2YWx1ZU9yRWxzZQIFC2luUHJBc3NldElkCQDZBAECBVdBVkVTAwMJAQIhPQIFDGFtQXNzZXRJZFN0cgUOaW5BbUFzc2V0SWRTdHIGCQECIT0CBQxwckFzc2V0SWRTdHIFDmluUHJBc3NldElkU3RyCQACAQIiSW52YWxpZCBhbXQgb3IgcHJpY2UgYXNzZXQgcGFzc2VkLgQJYW1CYWxhbmNlAwUKaXNFdmFsdWF0ZQkBDWdldEFjY0JhbGFuY2UBBQxhbUFzc2V0SWRTdHIJAGUCCQENZ2V0QWNjQmFsYW5jZQEFDGFtQXNzZXRJZFN0cgUMaW5BbUFzc2V0QW10BAlwckJhbGFuY2UDBQppc0V2YWx1YXRlCQENZ2V0QWNjQmFsYW5jZQEFDHByQXNzZXRJZFN0cgkAZQIJAQ1nZXRBY2NCYWxhbmNlAQUMcHJBc3NldElkU3RyBQxpblByQXNzZXRBbXQED2luQW1Bc3NldEFtdFgxOAkBBXRvWDE4AgUMaW5BbUFzc2V0QW10BQthbXRBc3NldERjbQQPaW5QckFzc2V0QW10WDE4CQEFdG9YMTgCBQxpblByQXNzZXRBbXQFDXByaWNlQXNzZXREY20EDHVzZXJQcmljZVgxOAkBD2NhbGNQcmljZUJpZ0ludAIFD2luUHJBc3NldEFtdFgxOAUPaW5BbUFzc2V0QW10WDE4BAxhbUJhbGFuY2VYMTgJAQV0b1gxOAIFCWFtQmFsYW5jZQULYW10QXNzZXREY20EDHByQmFsYW5jZVgxOAkBBXRvWDE4AgUJcHJCYWxhbmNlBQ1wcmljZUFzc2V0RGNtBANyZXMDCQAAAgUKbHBFbWlzc2lvbgAABAtjdXJQcmljZVgxOAUKemVyb0JpZ0ludAQLc2xpcHBhZ2VYMTgFCnplcm9CaWdJbnQECGxwQW10WDE4CQB2BgkAuQICBQ9pbkFtQXNzZXRBbXRYMTgFD2luUHJBc3NldEFtdFgxOAAACQC2AgEABQABAAAFBERPV04JAJcKBQkBB2Zyb21YMTgCBQhscEFtdFgxOAUGc2NhbGU4CQEHZnJvbVgxOAIFD2luQW1Bc3NldEFtdFgxOAULYW10QXNzZXREY20JAQdmcm9tWDE4AgUPaW5QckFzc2V0QW10WDE4BQ1wcmljZUFzc2V0RGNtCQEPY2FsY1ByaWNlQmlnSW50AgkAtwICBQxwckJhbGFuY2VYMTgFD2luUHJBc3NldEFtdFgxOAkAtwICBQxhbUJhbGFuY2VYMTgFD2luQW1Bc3NldEFtdFgxOAULc2xpcHBhZ2VYMTgEC2N1clByaWNlWDE4CQEPY2FsY1ByaWNlQmlnSW50AgUMcHJCYWxhbmNlWDE4BQxhbUJhbGFuY2VYMTgEC3NsaXBwYWdlWDE4CQC8AgMJAQlhYnNCaWdJbnQBCQC4AgIFC2N1clByaWNlWDE4BQx1c2VyUHJpY2VYMTgFB3NjYWxlMTgFC2N1clByaWNlWDE4BBRzbGlwcGFnZVRvbGVyYW5jZVgxOAkBBXRvWDE4AgURc2xpcHBhZ2VUb2xlcmFuY2UFBnNjYWxlOAMDCQECIT0CBQtjdXJQcmljZVgxOAUKemVyb0JpZ0ludAkAvwICBQtzbGlwcGFnZVgxOAUUc2xpcHBhZ2VUb2xlcmFuY2VYMTgHCQACAQkArAICCQCsAgIJAKwCAgIPUHJpY2Ugc2xpcHBhZ2UgCQCmAwEFC3NsaXBwYWdlWDE4Ah4gZXhjZWVkZWQgdGhlIHBhc3NlZCBsaW1pdCBvZiAJAKYDAQUUc2xpcHBhZ2VUb2xlcmFuY2VYMTgEDWxwRW1pc3Npb25YMTgJAQV0b1gxOAIFCmxwRW1pc3Npb24FBnNjYWxlOAQKcHJWaWFBbVgxOAkAvQIEBQ9pbkFtQXNzZXRBbXRYMTgJARRjYWxjUHJpY2VCaWdJbnRSb3VuZAMFDHByQmFsYW5jZVgxOAUMYW1CYWxhbmNlWDE4BQdDRUlMSU5HBQdzY2FsZTE4BQdDRUlMSU5HBAphbVZpYVByWDE4CQC9AgQFD2luUHJBc3NldEFtdFgxOAUHc2NhbGUxOAkBFGNhbGNQcmljZUJpZ0ludFJvdW5kAwUMcHJCYWxhbmNlWDE4BQxhbUJhbGFuY2VYMTgFBUZMT09SBQdDRUlMSU5HBAxleHBlY3RlZEFtdHMDCQC/AgIFCnByVmlhQW1YMTgFD2luUHJBc3NldEFtdFgxOAkAlAoCBQphbVZpYVByWDE4BQ9pblByQXNzZXRBbXRYMTgJAJQKAgUPaW5BbUFzc2V0QW10WDE4BQpwclZpYUFtWDE4BBFleHBBbXRBc3NldEFtdFgxOAgFDGV4cGVjdGVkQW10cwJfMQQTZXhwUHJpY2VBc3NldEFtdFgxOAgFDGV4cGVjdGVkQW10cwJfMgQIbHBBbXRYMTgJAL0CBAUNbHBFbWlzc2lvblgxOAUTZXhwUHJpY2VBc3NldEFtdFgxOAUMcHJCYWxhbmNlWDE4BQVGTE9PUgkAlwoFCQEMZnJvbVgxOFJvdW5kAwUIbHBBbXRYMTgFBnNjYWxlOAUFRkxPT1IJAQxmcm9tWDE4Um91bmQDBRFleHBBbXRBc3NldEFtdFgxOAULYW10QXNzZXREY20FB0NFSUxJTkcJAQxmcm9tWDE4Um91bmQDBRNleHBQcmljZUFzc2V0QW10WDE4BQ1wcmljZUFzc2V0RGNtBQdDRUlMSU5HBQtjdXJQcmljZVgxOAULc2xpcHBhZ2VYMTgECWNhbGNMcEFtdAgFA3JlcwJfMQQOY2FsY0FtQXNzZXRQbXQIBQNyZXMCXzIEDmNhbGNQckFzc2V0UG10CAUDcmVzAl8zBAhjdXJQcmljZQkBB2Zyb21YMTgCCAUDcmVzAl80BQZzY2FsZTgEDHNsaXBwYWdlQ2FsYwkBB2Zyb21YMTgCCAUDcmVzAl81BQZzY2FsZTgDCQBnAgAABQljYWxjTHBBbXQJAAIBAjZJbnZhbGlkIGNhbGN1bGF0aW9ucy4gTFAgY2FsY3VsYXRlZCBpcyBsZXNzIHRoYW4gemVyby4ECWVtaXRMcEFtdAMJAQEhAQUGZW1pdExwAAAFCWNhbGNMcEFtdAQGYW1EaWZmCQBlAgUMaW5BbUFzc2V0QW10BQ5jYWxjQW1Bc3NldFBtdAQGcHJEaWZmCQBlAgUMaW5QckFzc2V0QW10BQ5jYWxjUHJBc3NldFBtdAQLY29tbW9uU3RhdGUJAMwIAgkBDEludGVnZXJFbnRyeQIJAQJwbAAFCGN1clByaWNlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECcGgCBQZoZWlnaHQIBQlsYXN0QmxvY2sJdGltZXN0YW1wBQhjdXJQcmljZQkAzAgCCQELU3RyaW5nRW50cnkCCQEDcGF1AgULdXNlckFkZHJlc3MFBnR4SWQ1OAkBEWRhdGFQdXRBY3Rpb25JbmZvCgUOY2FsY0FtQXNzZXRQbXQFDmNhbGNQckFzc2V0UG10BQllbWl0THBBbXQFCGN1clByaWNlBRFzbGlwcGFnZVRvbGVyYW5jZQUMc2xpcHBhZ2VDYWxjBQZoZWlnaHQIBQlsYXN0QmxvY2sJdGltZXN0YW1wBQZhbURpZmYFBnByRGlmZgUDbmlsCQCfCg0FCWNhbGNMcEFtdAUJZW1pdExwQW10BQhjdXJQcmljZQUJYW1CYWxhbmNlBQlwckJhbGFuY2UFCmxwRW1pc3Npb24FCWxwQXNzZXRJZAUKcG9vbFN0YXR1cwULY29tbW9uU3RhdGUFBmFtRGlmZgUGcHJEaWZmBQtpbkFtQXNzZXRJZAULaW5QckFzc2V0SWQBB2NhbGNLTHADDWFtb3VudEJhbGFuY2UMcHJpY2VCYWxhbmNlCmxwRW1pc3Npb24EEGFtb3VudEJhbGFuY2VYMTgJAQt0b1gxOEJpZ0ludAIFDWFtb3VudEJhbGFuY2UJALYCAQUWY2ZnQW1vdW50QXNzZXREZWNpbWFscwQPcHJpY2VCYWxhbmNlWDE4CQELdG9YMThCaWdJbnQCBQxwcmljZUJhbGFuY2UJALYCAQUVY2ZnUHJpY2VBc3NldERlY2ltYWxzBAp1cGRhdGVkS0xwCQC8AgMJAHYGCQC5AgIFEGFtb3VudEJhbGFuY2VYMTgFD3ByaWNlQmFsYW5jZVgxOAAACQC2AgEABQABABIFBERPV04FBGJpZzEFCmxwRW1pc3Npb24DCQAAAgUKbHBFbWlzc2lvbgUEYmlnMAUEYmlnMAUKdXBkYXRlZEtMcAEOY2FsY0N1cnJlbnRLTHADEGFtb3VudEFzc2V0RGVsdGEPcHJpY2VBc3NldERlbHRhFGxwQXNzZXRFbWlzc2lvbkRlbHRhBBJhbW91bnRBc3NldEJhbGFuY2UJALgCAgkAtgIBCQENZ2V0QWNjQmFsYW5jZQEJAQ9hc3NldElkVG9TdHJpbmcBBRBjZmdBbW91bnRBc3NldElkBRBhbW91bnRBc3NldERlbHRhBBFwcmljZUFzc2V0QmFsYW5jZQkAuAICCQC2AgEJAQ1nZXRBY2NCYWxhbmNlAQkBD2Fzc2V0SWRUb1N0cmluZwEFD2NmZ1ByaWNlQXNzZXRJZAUPcHJpY2VBc3NldERlbHRhBA9scEFzc2V0RW1pc3Npb24JALgCAgkAtgIBCAkBBXZhbHVlAQkA7AcBBQxjZmdMcEFzc2V0SWQIcXVhbnRpdHkFFGxwQXNzZXRFbWlzc2lvbkRlbHRhBApjdXJyZW50S0xwCQEHY2FsY0tMcAMFEmFtb3VudEFzc2V0QmFsYW5jZQURcHJpY2VBc3NldEJhbGFuY2UFD2xwQXNzZXRFbWlzc2lvbgUKY3VycmVudEtMcAEScmVmcmVzaEtMcEludGVybmFsAxdhbW91bnRBc3NldEJhbGFuY2VEZWx0YRZwcmljZUFzc2V0QmFsYW5jZURlbHRhFGxwQXNzZXRFbWlzc2lvbkRlbHRhBBJhbW91bnRBc3NldEJhbGFuY2UJAGQCCQENZ2V0QWNjQmFsYW5jZQEJAQ9hc3NldElkVG9TdHJpbmcBBRBjZmdBbW91bnRBc3NldElkBRdhbW91bnRBc3NldEJhbGFuY2VEZWx0YQQRcHJpY2VBc3NldEJhbGFuY2UJAGQCCQENZ2V0QWNjQmFsYW5jZQEJAQ9hc3NldElkVG9TdHJpbmcBBQ9jZmdQcmljZUFzc2V0SWQFFnByaWNlQXNzZXRCYWxhbmNlRGVsdGEED2xwQXNzZXRFbWlzc2lvbgkAZAIICQEFdmFsdWUBCQDsBwEFDGNmZ0xwQXNzZXRJZAhxdWFudGl0eQUUbHBBc3NldEVtaXNzaW9uRGVsdGEECnVwZGF0ZWRLTHAJAQdjYWxjS0xwAwkAtgIBBRJhbW91bnRBc3NldEJhbGFuY2UJALYCAQURcHJpY2VBc3NldEJhbGFuY2UJALYCAQUPbHBBc3NldEVtaXNzaW9uBAdhY3Rpb25zCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRVrZXlLTHBSZWZyZXNoZWRIZWlnaHQFBmhlaWdodAkAzAgCCQELU3RyaW5nRW50cnkCBQZrZXlLTHAJAKYDAQUKdXBkYXRlZEtMcAUDbmlsCQCUCgIFB2FjdGlvbnMFCnVwZGF0ZWRLTHABE3NraXBPcmRlclZhbGlkYXRpb24ACQELdmFsdWVPckVsc2UCCQCbCAIFD2ZhY3RvcnlDb250cmFjdAkBFmtleVNraXBPcmRlclZhbGlkYXRpb24BCQClCAEFBHRoaXMHARJ2YWxpZGF0ZVVwZGF0ZWRLTHACBm9sZEtMcAp1cGRhdGVkS0xwAwkAwAICBQp1cGRhdGVkS0xwBQZvbGRLTHAGCQEIdGhyb3dFcnIBCQC5CQIJAMwIAgIidXBkYXRlZCBLTHAgbG93ZXIgdGhhbiBjdXJyZW50IEtMcAkAzAgCCQCmAwEFBm9sZEtMcAkAzAgCCQCmAwEFCnVwZGF0ZWRLTHAFA25pbAIBIAEbdmFsaWRhdGVNYXRjaGVyT3JkZXJBbGxvd2VkAQVvcmRlcgQSYW1vdW50QXNzZXRCYWxhbmNlCQENZ2V0QWNjQmFsYW5jZQEJAQ9hc3NldElkVG9TdHJpbmcBBRBjZmdBbW91bnRBc3NldElkBBFwcmljZUFzc2V0QmFsYW5jZQkBDWdldEFjY0JhbGFuY2UBCQEPYXNzZXRJZFRvU3RyaW5nAQUPY2ZnUHJpY2VBc3NldElkBBFhbW91bnRBc3NldEFtb3VudAgFBW9yZGVyBmFtb3VudAQQcHJpY2VBc3NldEFtb3VudAkAbgQIBQVvcmRlcgZhbW91bnQIBQVvcmRlcgVwcmljZQUGc2NhbGU4BQVGTE9PUgQNJHQwMjk0NzUyOTY4NwMJAAACCAUFb3JkZXIJb3JkZXJUeXBlBQNCdXkJAJQKAgURYW1vdW50QXNzZXRBbW91bnQJAQEtAQUQcHJpY2VBc3NldEFtb3VudAkAlAoCCQEBLQEFEWFtb3VudEFzc2V0QW1vdW50BRBwcmljZUFzc2V0QW1vdW50BBdhbW91bnRBc3NldEJhbGFuY2VEZWx0YQgFDSR0MDI5NDc1Mjk2ODcCXzEEFnByaWNlQXNzZXRCYWxhbmNlRGVsdGEIBQ0kdDAyOTQ3NTI5Njg3Al8yAwMDCQEQaXNHbG9iYWxTaHV0ZG93bgAGCQAAAgUNY2ZnUG9vbFN0YXR1cwUTUG9vbE1hdGNoZXJEaXNhYmxlZAYJAAACBQ1jZmdQb29sU3RhdHVzBQxQb29sU2h1dGRvd24JAAIBAhxFeGNoYW5nZSBvcGVyYXRpb25zIGRpc2FibGVkAwMJAQIhPQIICAUFb3JkZXIJYXNzZXRQYWlyC2Ftb3VudEFzc2V0BRBjZmdBbW91bnRBc3NldElkBgkBAiE9AggIBQVvcmRlcglhc3NldFBhaXIKcHJpY2VBc3NldAUPY2ZnUHJpY2VBc3NldElkCQACAQITV3Jvbmcgb3JkZXIgYXNzZXRzLgQDa0xwCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKgDAQkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzBQZrZXlLTHACATAJAQZmbXRFcnIBAgtpbnZhbGlkIGtMcAQNJHQwMzAxMjczMDIyNwkBEnJlZnJlc2hLTHBJbnRlcm5hbAMFF2Ftb3VudEFzc2V0QmFsYW5jZURlbHRhBRZwcmljZUFzc2V0QmFsYW5jZURlbHRhAAAEDXVudXNlZEFjdGlvbnMIBQ0kdDAzMDEyNzMwMjI3Al8xBAZrTHBOZXcIBQ0kdDAzMDEyNzMwMjI3Al8yBAxpc09yZGVyVmFsaWQJAMACAgUGa0xwTmV3BQNrTHAEBGluZm8JALkJAgkAzAgCAgRrTHA9CQDMCAIJAKYDAQUDa0xwCQDMCAICCCBrTHBOZXc9CQDMCAIJAKYDAQUGa0xwTmV3CQDMCAICFCBhbW91bnRBc3NldEJhbGFuY2U9CQDMCAIJAKQDAQUSYW1vdW50QXNzZXRCYWxhbmNlCQDMCAICEyBwcmljZUFzc2V0QmFsYW5jZT0JAMwIAgkApAMBBRFwcmljZUFzc2V0QmFsYW5jZQkAzAgCAhkgYW1vdW50QXNzZXRCYWxhbmNlRGVsdGE9CQDMCAIJAKQDAQUXYW1vdW50QXNzZXRCYWxhbmNlRGVsdGEJAMwIAgIYIHByaWNlQXNzZXRCYWxhbmNlRGVsdGE9CQDMCAIJAKQDAQUWcHJpY2VBc3NldEJhbGFuY2VEZWx0YQkAzAgCAgggaGVpZ2h0PQkAzAgCCQCkAwEFBmhlaWdodAUDbmlsAgAJAJQKAgUMaXNPcmRlclZhbGlkBQRpbmZvAQljb21tb25HZXQBAWkDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEJAAIBAh1leGFjdGx5IDEgcGF5bWVudCBpcyBleHBlY3RlZAQDcG10CQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAAECnBtdEFzc2V0SWQJAQV2YWx1ZQEIBQNwbXQHYXNzZXRJZAQGcG10QW10CAUDcG10BmFtb3VudAQDcmVzCQEUZXN0aW1hdGVHZXRPcGVyYXRpb24ECQDYBAEIBQFpDXRyYW5zYWN0aW9uSWQJANgEAQUKcG10QXNzZXRJZAUGcG10QW10CAUBaQZjYWxsZXIECG91dEFtQW10CAUDcmVzAl8xBAhvdXRQckFtdAgFA3JlcwJfMgQFc3RhdGUIBQNyZXMDXzEwBA1pc0dldERpc2FibGVkAwkBASEBCQEUaXNBZGRyZXNzV2hpdGVsaXN0ZWQBCAUBaQZjYWxsZXIDCQEQaXNHbG9iYWxTaHV0ZG93bgAGCQAAAgUNY2ZnUG9vbFN0YXR1cwUMUG9vbFNodXRkb3duBwMFDWlzR2V0RGlzYWJsZWQJAAIBCQCsAgICLEdldCBvcGVyYXRpb24gaXMgYmxvY2tlZCBieSBhZG1pbi4gU3RhdHVzID0gCQCkAwEFDWNmZ1Bvb2xTdGF0dXMJAJcKBQUIb3V0QW1BbXQFCG91dFByQW10BQZwbXRBbXQFCnBtdEFzc2V0SWQFBXN0YXRlAQljb21tb25QdXQDAWkRc2xpcHBhZ2VUb2xlcmFuY2UGZW1pdExwAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwACCQACAQIfZXhhY3RseSAyIHBheW1lbnRzIGFyZSBleHBlY3RlZAQKYW1Bc3NldFBtdAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwAABApwckFzc2V0UG10CQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAEEBmVzdFB1dAkBFGVzdGltYXRlUHV0T3BlcmF0aW9uCQkA2AQBCAUBaQ10cmFuc2FjdGlvbklkBRFzbGlwcGFnZVRvbGVyYW5jZQgFCmFtQXNzZXRQbXQGYW1vdW50CAUKYW1Bc3NldFBtdAdhc3NldElkCAUKcHJBc3NldFBtdAZhbW91bnQIBQpwckFzc2V0UG10B2Fzc2V0SWQJAKUIAQgFAWkGY2FsbGVyBwUGZW1pdExwBA1pc1B1dERpc2FibGVkAwkBASEBCQEUaXNBZGRyZXNzV2hpdGVsaXN0ZWQBCAUBaQZjYWxsZXIDAwkBEGlzR2xvYmFsU2h1dGRvd24ABgkAAAIFDWNmZ1Bvb2xTdGF0dXMFD1Bvb2xQdXREaXNhYmxlZAYJAAACBQ1jZmdQb29sU3RhdHVzBQxQb29sU2h1dGRvd24HAwUNaXNQdXREaXNhYmxlZAkAAgEJAKwCAgIsUHV0IG9wZXJhdGlvbiBpcyBibG9ja2VkIGJ5IGFkbWluLiBTdGF0dXMgPSAJAKQDAQUNY2ZnUG9vbFN0YXR1cwUGZXN0UHV0AQRlbWl0AQZhbW91bnQEB2VtaXRJbnYJAPwHBAUPZmFjdG9yeUNvbnRyYWN0AgRlbWl0CQDMCAIFBmFtb3VudAUDbmlsBQNuaWwDCQAAAgUHZW1pdEludgUHZW1pdEludgQNZW1pdEludkxlZ2FjeQQHJG1hdGNoMAUHZW1pdEludgMJAAECBQckbWF0Y2gwAgdBZGRyZXNzBBVsZWdhY3lGYWN0b3J5Q29udHJhY3QFByRtYXRjaDAJAPwHBAUVbGVnYWN5RmFjdG9yeUNvbnRyYWN0AgRlbWl0CQDMCAIFBmFtb3VudAUDbmlsBQNuaWwFBHVuaXQDCQAAAgUNZW1pdEludkxlZ2FjeQUNZW1pdEludkxlZ2FjeQUGYW1vdW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQd0YWtlRmVlAgZhbW91bnQDZmVlBAlmZWVBbW91bnQDCQAAAgUDZmVlAAAAAAkAawMFBmFtb3VudAUDZmVlBQZzY2FsZTgJAJQKAgkAZQIFBmFtb3VudAUJZmVlQW1vdW50BQlmZWVBbW91bnQBD2NhbGNQdXRPbmVUb2tlbgQQcGF5bWVudEFtb3VudFJhdw5wYXltZW50QXNzZXRJZAt1c2VyQWRkcmVzcwR0eElkBAZpc0V2YWwJAAACBQR0eElkBQR1bml0BBBhbW91bnRCYWxhbmNlUmF3CQENZ2V0QWNjQmFsYW5jZQEJAQ9hc3NldElkVG9TdHJpbmcBBRBjZmdBbW91bnRBc3NldElkBA9wcmljZUJhbGFuY2VSYXcJAQ1nZXRBY2NCYWxhbmNlAQkBD2Fzc2V0SWRUb1N0cmluZwEFD2NmZ1ByaWNlQXNzZXRJZAQUcGF5bWVudEluQW1vdW50QXNzZXQDCQAAAgUOcGF5bWVudEFzc2V0SWQFEGNmZ0Ftb3VudEFzc2V0SWQGAwkAAAIFDnBheW1lbnRBc3NldElkBQ9jZmdQcmljZUFzc2V0SWQHCQEIdGhyb3dFcnIBAg1pbnZhbGlkIGFzc2V0BA0kdDAzMzQxMzMzNzA2AwUGaXNFdmFsCQCUCgIFEGFtb3VudEJhbGFuY2VSYXcFD3ByaWNlQmFsYW5jZVJhdwMFFHBheW1lbnRJbkFtb3VudEFzc2V0CQCUCgIJAGUCBRBhbW91bnRCYWxhbmNlUmF3BRBwYXltZW50QW1vdW50UmF3BQ9wcmljZUJhbGFuY2VSYXcJAJQKAgUQYW1vdW50QmFsYW5jZVJhdwkAZQIFD3ByaWNlQmFsYW5jZVJhdwUQcGF5bWVudEFtb3VudFJhdwQQYW1vdW50QmFsYW5jZU9sZAgFDSR0MDMzNDEzMzM3MDYCXzEED3ByaWNlQmFsYW5jZU9sZAgFDSR0MDMzNDEzMzM3MDYCXzIEDSR0MDMzNzEwMzM4NTkDBRRwYXltZW50SW5BbW91bnRBc3NldAkAlAoCBRBwYXltZW50QW1vdW50UmF3AAAJAJQKAgAABRBwYXltZW50QW1vdW50UmF3BBRhbW91bnRBc3NldEFtb3VudFJhdwgFDSR0MDMzNzEwMzM4NTkCXzEEE3ByaWNlQXNzZXRBbW91bnRSYXcIBQ0kdDAzMzcxMDMzODU5Al8yBBFhbW91bnRBc3NldEFtb3VudAgJAQd0YWtlRmVlAgUUYW1vdW50QXNzZXRBbW91bnRSYXcFBWluRmVlAl8xBBBwcmljZUFzc2V0QW1vdW50CAkBB3Rha2VGZWUCBRNwcmljZUFzc2V0QW1vdW50UmF3BQVpbkZlZQJfMQQNJHQwMzM5OTEzNDA1NQkBB3Rha2VGZWUCBRBwYXltZW50QW1vdW50UmF3BQVpbkZlZQQNcGF5bWVudEFtb3VudAgFDSR0MDMzOTkxMzQwNTUCXzEECWZlZUFtb3VudAgFDSR0MDMzOTkxMzQwNTUCXzIEEGFtb3VudEJhbGFuY2VOZXcJAGQCBRBhbW91bnRCYWxhbmNlT2xkBRFhbW91bnRBc3NldEFtb3VudAQPcHJpY2VCYWxhbmNlTmV3CQBkAgUPcHJpY2VCYWxhbmNlT2xkBRBwcmljZUFzc2V0QW1vdW50BAtwcmljZU5ld1gxOAkBD2NhbGNQcmljZUJpZ0ludAIJAQV0b1gxOAIFD3ByaWNlQmFsYW5jZU5ldwUVY2ZnUHJpY2VBc3NldERlY2ltYWxzCQEFdG9YMTgCBRBhbW91bnRCYWxhbmNlTmV3BRZjZmdBbW91bnRBc3NldERlY2ltYWxzBAhwcmljZU5ldwkBB2Zyb21YMTgCBQtwcmljZU5ld1gxOAUGc2NhbGU4BA5wYXltZW50QmFsYW5jZQMFFHBheW1lbnRJbkFtb3VudEFzc2V0BRBhbW91bnRCYWxhbmNlT2xkBQ9wcmljZUJhbGFuY2VPbGQEFHBheW1lbnRCYWxhbmNlQmlnSW50CQC2AgEFDnBheW1lbnRCYWxhbmNlBAxzdXBwbHlCaWdJbnQJALYCAQgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkA7AcBBQxjZmdMcEFzc2V0SWQJAKwCAgkArAICAgZhc3NldCAJANgEAQUMY2ZnTHBBc3NldElkAg4gZG9lc24ndCBleGlzdAhxdWFudGl0eQQLY2hlY2hTdXBwbHkDCQC/AgIFDHN1cHBseUJpZ0ludAUEYmlnMAYJAQh0aHJvd0VycgECImluaXRpYWwgZGVwb3NpdCByZXF1aXJlcyBhbGwgY29pbnMDCQAAAgULY2hlY2hTdXBwbHkFC2NoZWNoU3VwcGx5BA1kZXBvc2l0QmlnSW50CQC2AgEFDXBheW1lbnRBbW91bnQEC2lzc3VlQW1vdW50CQCWAwEJAMwIAgAACQDMCAIJAKADAQkAugICCQC5AgIFDHN1cHBseUJpZ0ludAkAuAICCQEKc3FydEJpZ0ludAQJALcCAgUHc2NhbGUxOAkAugICCQC5AgIFDWRlcG9zaXRCaWdJbnQFB3NjYWxlMTgFFHBheW1lbnRCYWxhbmNlQmlnSW50ABIAEgUERE9XTgUHc2NhbGUxOAUHc2NhbGUxOAUDbmlsBAtjb21tb25TdGF0ZQMFBmlzRXZhbAUDbmlsCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECcGwABQhwcmljZU5ldwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAnBoAgUGaGVpZ2h0CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAUIcHJpY2VOZXcJAMwIAgkBC1N0cmluZ0VudHJ5AgkBA3BhdQIJAKUIAQkBBXZhbHVlAQULdXNlckFkZHJlc3MJANgEAQkBBXZhbHVlAQUEdHhJZAkBEWRhdGFQdXRBY3Rpb25JbmZvCgUUYW1vdW50QXNzZXRBbW91bnRSYXcFE3ByaWNlQXNzZXRBbW91bnRSYXcFC2lzc3VlQW1vdW50BQhwcmljZU5ldwAAAAAFBmhlaWdodAgFCWxhc3RCbG9jawl0aW1lc3RhbXAAAAAABQNuaWwEC3ByaWNlT2xkWDE4CQEPY2FsY1ByaWNlQmlnSW50AgkBBXRvWDE4AgUPcHJpY2VCYWxhbmNlT2xkBRVjZmdQcmljZUFzc2V0RGVjaW1hbHMJAQV0b1gxOAIFEGFtb3VudEJhbGFuY2VPbGQFFmNmZ0Ftb3VudEFzc2V0RGVjaW1hbHMECHByaWNlT2xkCQEHZnJvbVgxOAIFC3ByaWNlT2xkWDE4BQZzY2FsZTgEBGxvc3MEDSR0MDM1NzM2MzU5MDMDBRRwYXltZW50SW5BbW91bnRBc3NldAkAlAoCBRRhbW91bnRBc3NldEFtb3VudFJhdwUQYW1vdW50QmFsYW5jZU9sZAkAlAoCBRNwcmljZUFzc2V0QW1vdW50UmF3BQ9wcmljZUJhbGFuY2VPbGQEBmFtb3VudAgFDSR0MDM1NzM2MzU5MDMCXzEEB2JhbGFuY2UIBQ0kdDAzNTczNjM1OTAzAl8yBA9pc3N1ZUFtb3VudEJvdGgJAKADAQkAvAIDBQxzdXBwbHlCaWdJbnQJALYCAQkAaQIFBmFtb3VudAACCQC2AgEFB2JhbGFuY2UJAGsDCQBlAgULaXNzdWVBbW91bnQFD2lzc3VlQW1vdW50Qm90aAUGc2NhbGU4BQ9pc3N1ZUFtb3VudEJvdGgJAJcKBQULaXNzdWVBbW91bnQFC2NvbW1vblN0YXRlBQlmZWVBbW91bnQFBGxvc3MFFHBheW1lbnRJbkFtb3VudEFzc2V0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQ9jYWxjR2V0T25lVG9rZW4FCm91dEFzc2V0SWQNcGF5bWVudEFtb3VudA5wYXltZW50QXNzZXRJZAt1c2VyQWRkcmVzcwR0eElkBAZpc0V2YWwJAAACBQR0eElkBQR1bml0BANjZmcJAQ1nZXRQb29sQ29uZmlnAAQLYW10QXNzZXREY20JAQ1wYXJzZUludFZhbHVlAQkAkQMCBQNjZmcFDmlkeEFtdEFzc2V0RGNtBA1wcmljZUFzc2V0RGNtCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUDY2ZnBRBpZHhQcmljZUFzc2V0RGNtBAZjaGVja3MJAMwIAgMJAAACBQ5wYXltZW50QXNzZXRJZAUMY2ZnTHBBc3NldElkBgkBCHRocm93RXJyAQIQaW52YWxpZCBscCBhc3NldAUDbmlsAwkAAAIFBmNoZWNrcwUGY2hlY2tzBBBvdXRJbkFtb3VudEFzc2V0AwkAAAIFCm91dEFzc2V0SWQFEGNmZ0Ftb3VudEFzc2V0SWQGAwkAAAIFCm91dEFzc2V0SWQFD2NmZ1ByaWNlQXNzZXRJZAcJAQh0aHJvd0VycgECDWludmFsaWQgYXNzZXQEDWJhbGFuY2VCaWdJbnQDBRBvdXRJbkFtb3VudEFzc2V0CQC2AgEJAQ1nZXRBY2NCYWxhbmNlAQkBD2Fzc2V0SWRUb1N0cmluZwEFEGNmZ0Ftb3VudEFzc2V0SWQJALYCAQkBDWdldEFjY0JhbGFuY2UBCQEPYXNzZXRJZFRvU3RyaW5nAQUPY2ZnUHJpY2VBc3NldElkBBhvdXRJbkFtb3VudEFzc2V0RGVjaW1hbHMDBRBvdXRJbkFtb3VudEFzc2V0BQthbXRBc3NldERjbQUNcHJpY2VBc3NldERjbQQMYW1CYWxhbmNlT2xkCQENZ2V0QWNjQmFsYW5jZQEJAQ9hc3NldElkVG9TdHJpbmcBBRBjZmdBbW91bnRBc3NldElkBAxwckJhbGFuY2VPbGQJAQ1nZXRBY2NCYWxhbmNlAQkBD2Fzc2V0SWRUb1N0cmluZwEFD2NmZ1ByaWNlQXNzZXRJZAQKb3V0QmFsYW5jZQMFEG91dEluQW1vdW50QXNzZXQFDGFtQmFsYW5jZU9sZAUMcHJCYWxhbmNlT2xkBBBvdXRCYWxhbmNlQmlnSW50CQC2AgEFCm91dEJhbGFuY2UEDHN1cHBseUJpZ0ludAkAtgIBCAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDsBwEFDGNmZ0xwQXNzZXRJZAkArAICCQCsAgICBmFzc2V0IAkA2AQBBQxjZmdMcEFzc2V0SWQCDiBkb2Vzbid0IGV4aXN0CHF1YW50aXR5BA5yZWRlZW1lZEJpZ0ludAkAtgIBBQ1wYXltZW50QW1vdW50BAlhbW91bnRSYXcJAJYDAQkAzAgCAAAJAMwIAgkAoAMBCQC6AgIJALkCAgUNYmFsYW5jZUJpZ0ludAkAuAICBQdzY2FsZTE4CQB2BgkAuAICBQdzY2FsZTE4CQC6AgIJALkCAgUOcmVkZWVtZWRCaWdJbnQFB3NjYWxlMTgFDHN1cHBseUJpZ0ludAASBQRiaWcyAAAAEgUERE9XTgUHc2NhbGUxOAUDbmlsBA0kdDAzNzk4MTM4MDM3CQEHdGFrZUZlZQIFCWFtb3VudFJhdwUGb3V0RmVlBAt0b3RhbEFtb3VudAgFDSR0MDM3OTgxMzgwMzcCXzEECWZlZUFtb3VudAgFDSR0MDM3OTgxMzgwMzcCXzIEDSR0MDM4MDQxMzgyNjcDBRBvdXRJbkFtb3VudEFzc2V0CQCWCgQFC3RvdGFsQW1vdW50AAAJAGUCBQxhbUJhbGFuY2VPbGQFCWFtb3VudFJhdwUMcHJCYWxhbmNlT2xkCQCWCgQAAAULdG90YWxBbW91bnQFDGFtQmFsYW5jZU9sZAkAZQIFDHByQmFsYW5jZU9sZAUJYW1vdW50UmF3BAtvdXRBbUFtb3VudAgFDSR0MDM4MDQxMzgyNjcCXzEEC291dFByQW1vdW50CAUNJHQwMzgwNDEzODI2NwJfMgQMYW1CYWxhbmNlTmV3CAUNJHQwMzgwNDEzODI2NwJfMwQMcHJCYWxhbmNlTmV3CAUNJHQwMzgwNDEzODI2NwJfNAQLcHJpY2VOZXdYMTgJAQ9jYWxjUHJpY2VCaWdJbnQCCQEFdG9YMTgCBQxwckJhbGFuY2VOZXcFFWNmZ1ByaWNlQXNzZXREZWNpbWFscwkBBXRvWDE4AgUMYW1CYWxhbmNlTmV3BRZjZmdBbW91bnRBc3NldERlY2ltYWxzBAhwcmljZU5ldwkBB2Zyb21YMTgCBQtwcmljZU5ld1gxOAUGc2NhbGU4BAtjb21tb25TdGF0ZQMFBmlzRXZhbAUDbmlsCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQNnYXUCCQClCAEJAQV2YWx1ZQEFC3VzZXJBZGRyZXNzCQDYBAEJAQV2YWx1ZQEFBHR4SWQJARFkYXRhR2V0QWN0aW9uSW5mbwYFC291dEFtQW1vdW50BQtvdXRQckFtb3VudAUNcGF5bWVudEFtb3VudAUIcHJpY2VOZXcFBmhlaWdodAgFCWxhc3RCbG9jawl0aW1lc3RhbXAJAMwIAgkBDEludGVnZXJFbnRyeQIJAQJwbAAFCHByaWNlTmV3CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECcGgCBQZoZWlnaHQIBQlsYXN0QmxvY2sJdGltZXN0YW1wBQhwcmljZU5ldwUDbmlsBAtwcmljZU9sZFgxOAkBD2NhbGNQcmljZUJpZ0ludAIJAQV0b1gxOAIFDHByQmFsYW5jZU9sZAUVY2ZnUHJpY2VBc3NldERlY2ltYWxzCQEFdG9YMTgCBQxhbUJhbGFuY2VPbGQFFmNmZ0Ftb3VudEFzc2V0RGVjaW1hbHMECHByaWNlT2xkCQEHZnJvbVgxOAIFC3ByaWNlT2xkWDE4BQZzY2FsZTgEBGxvc3MEGGFtb3VudEJvdGhJblBheW1lbnRBc3NldAkAaAIJAKADAQkAvAIDBQ1iYWxhbmNlQmlnSW50BQ5yZWRlZW1lZEJpZ0ludAUMc3VwcGx5QmlnSW50AAIJAGsDCQBlAgULdG90YWxBbW91bnQFGGFtb3VudEJvdGhJblBheW1lbnRBc3NldAUGc2NhbGU4BRhhbW91bnRCb3RoSW5QYXltZW50QXNzZXQJAJcKBQULdG90YWxBbW91bnQFC2NvbW1vblN0YXRlBQlmZWVBbW91bnQFBGxvc3MFEG91dEluQW1vdW50QXNzZXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BFm1hbmFnZXJQdWJsaWNLZXlPclVuaXQABBNtYW5hZ2VyVmF1bHRBZGRyZXNzCQEcZ2V0TWFuYWdlclZhdWx0QWRkcmVzc09yVGhpcwAEByRtYXRjaDAJAJ0IAgUTbWFuYWdlclZhdWx0QWRkcmVzcwkBE2tleU1hbmFnZXJQdWJsaWNLZXkAAwkAAQIFByRtYXRjaDACBlN0cmluZwQBcwUHJG1hdGNoMAkA2QQBBQFzAwkAAQIFByRtYXRjaDACBFVuaXQFBHVuaXQJAAIBAgtNYXRjaCBlcnJvcgEJaXNNYW5hZ2VyAQFpBAckbWF0Y2gwCQEWbWFuYWdlclB1YmxpY0tleU9yVW5pdAADCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQCcGsFByRtYXRjaDAJAAACCAUBaQ9jYWxsZXJQdWJsaWNLZXkFAnBrAwkAAQIFByRtYXRjaDACBFVuaXQJAAACCAUBaQZjYWxsZXIFBHRoaXMJAAIBAgtNYXRjaCBlcnJvcgELbXVzdE1hbmFnZXIBAWkEAnBkCQACAQIRUGVybWlzc2lvbiBkZW5pZWQEByRtYXRjaDAJARZtYW5hZ2VyUHVibGljS2V5T3JVbml0AAMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAJwawUHJG1hdGNoMAMJAAACCAUBaQ9jYWxsZXJQdWJsaWNLZXkFAnBrBgUCcGQDCQABAgUHJG1hdGNoMAIEVW5pdAMJAAACCAUBaQZjYWxsZXIFBHRoaXMGBQJwZAkAAgECC01hdGNoIGVycm9yHAFpAQlyZWJhbGFuY2UACQDOCAIJAQ5yZWJhbGFuY2VBc3NldAEJAQ9nZXRTdHJpbmdPckZhaWwCBQR0aGlzCQECYWEACQEOcmViYWxhbmNlQXNzZXQBCQEPZ2V0U3RyaW5nT3JGYWlsAgUEdGhpcwkBAnBhAAFpASFjYWxjdWxhdGVBbW91bnRPdXRGb3JTd2FwUkVBRE9OTFkDDWNsZWFuQW1vdW50SW4JaXNSZXZlcnNlDWZlZVBvb2xBbW91bnQEDSR0MDQwMTI1NDA0MzADCQAAAgUJaXNSZXZlcnNlBwQIYXNzZXRPdXQJAQ9nZXRTdHJpbmdPckZhaWwCBQR0aGlzCQECcGEABAdhc3NldEluCQEPZ2V0U3RyaW5nT3JGYWlsAgUEdGhpcwkBAmFhAAkAlAoCBQhhc3NldE91dAUHYXNzZXRJbgQIYXNzZXRPdXQJAQ9nZXRTdHJpbmdPckZhaWwCBQR0aGlzCQECYWEABAdhc3NldEluCQEPZ2V0U3RyaW5nT3JGYWlsAgUEdGhpcwkBAnBhAAkAlAoCBQhhc3NldE91dAUHYXNzZXRJbgQIYXNzZXRPdXQIBQ0kdDA0MDEyNTQwNDMwAl8xBAdhc3NldEluCAUNJHQwNDAxMjU0MDQzMAJfMgQScG9vbEFzc2V0SW5CYWxhbmNlCQENZ2V0QWNjQmFsYW5jZQEFB2Fzc2V0SW4EE3Bvb2xBc3NldE91dEJhbGFuY2UJAQ1nZXRBY2NCYWxhbmNlAQUIYXNzZXRPdXQECWFtb3VudE91dAkAawMFE3Bvb2xBc3NldE91dEJhbGFuY2UFDWNsZWFuQW1vdW50SW4JAGQCBRJwb29sQXNzZXRJbkJhbGFuY2UFDWNsZWFuQW1vdW50SW4EBG9sZEsJALkCAgkAtgIBBRJwb29sQXNzZXRJbkJhbGFuY2UJALYCAQUTcG9vbEFzc2V0T3V0QmFsYW5jZQQEbmV3SwkAuQICCQC3AgIJALcCAgkAtgIBCQENZ2V0QWNjQmFsYW5jZQEFB2Fzc2V0SW4JALYCAQUNY2xlYW5BbW91bnRJbgkAtgIBBQ1mZWVQb29sQW1vdW50CQC4AgIJALYCAQkBDWdldEFjY0JhbGFuY2UBBQhhc3NldE91dAkAtgIBBQlhbW91bnRPdXQEBmNoZWNrSwMJAMACAgUEbmV3SwUEb2xkSwYJAAIBAhRuZXcgSyBpcyBmZXdlciBlcnJvcgMJAAACBQZjaGVja0sFBmNoZWNrSwkAlAoCBQNuaWwFCWFtb3VudE91dAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpASZjYWxjdWxhdGVBbW91bnRPdXRGb3JTd2FwQW5kU2VuZFRva2VucwUNY2xlYW5BbW91bnRJbglpc1JldmVyc2UMYW1vdW50T3V0TWluCWFkZHJlc3NUbw1mZWVQb29sQW1vdW50BAtzd2FwQ29udGFjdAoAAUAJAPwHBAUPZmFjdG9yeUNvbnRyYWN0AhdnZXRTd2FwQ29udHJhY3RSRUFET05MWQUDbmlsBQNuaWwDCQABAgUBQAIGU3RyaW5nBQFACQACAQkArAICCQADAQUBQAIbIGNvdWxkbid0IGJlIGNhc3QgdG8gU3RyaW5nBBJpc1Bvb2xTd2FwRGlzYWJsZWQKAAFACQD8BwQFD2ZhY3RvcnlDb250cmFjdAIaaXNQb29sU3dhcERpc2FibGVkUkVBRE9OTFkJAMwIAgkApQgBBQR0aGlzBQNuaWwFA25pbAMJAAECBQFAAgdCb29sZWFuBQFACQACAQkArAICCQADAQUBQAIcIGNvdWxkbid0IGJlIGNhc3QgdG8gQm9vbGVhbgQOaXNTd2FwRGlzYWJsZWQDCQEBIQEJARRpc0FkZHJlc3NXaGl0ZWxpc3RlZAEIBQFpBmNhbGxlcgMDCQEQaXNHbG9iYWxTaHV0ZG93bgAGCQAAAgUNY2ZnUG9vbFN0YXR1cwUMUG9vbFNodXRkb3duBgUSaXNQb29sU3dhcERpc2FibGVkBwQGY2hlY2tzCQDMCAIDAwkBASEBBQ5pc1N3YXBEaXNhYmxlZAYJAQlpc01hbmFnZXIBBQFpBgkBCHRocm93RXJyAQIic3dhcCBvcGVyYXRpb24gaXMgYmxvY2tlZCBieSBhZG1pbgkAzAgCAwkAZwIICQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BQ1jbGVhbkFtb3VudEluBgkBCHRocm93RXJyAQIMV3JvbmcgYW1vdW50CQDMCAIDCQAAAggFAWkGY2FsbGVyCQERQGV4dHJOYXRpdmUoMTA2MikBBQtzd2FwQ29udGFjdAYJAQh0aHJvd0VycgECEVBlcm1pc3Npb24gZGVuaWVkBQNuaWwDCQAAAgUGY2hlY2tzBQZjaGVja3MEA3BtdAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwAABAdhc3NldEluCQEPYXNzZXRJZFRvU3RyaW5nAQgFA3BtdAdhc3NldElkBAhhc3NldE91dAMJAAACBQlpc1JldmVyc2UHCQEPZ2V0U3RyaW5nT3JGYWlsAgUEdGhpcwkBAnBhAAkBD2dldFN0cmluZ09yRmFpbAIFBHRoaXMJAQJhYQAEEnBvb2xBc3NldEluQmFsYW5jZQkAZQIJAGUCCQENZ2V0QWNjQmFsYW5jZQEFB2Fzc2V0SW4ICQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BQ1mZWVQb29sQW1vdW50BBNwb29sQXNzZXRPdXRCYWxhbmNlCQENZ2V0QWNjQmFsYW5jZQEFCGFzc2V0T3V0BAlhbW91bnRPdXQJAGsDBRNwb29sQXNzZXRPdXRCYWxhbmNlBQ1jbGVhbkFtb3VudEluCQBkAgUScG9vbEFzc2V0SW5CYWxhbmNlBQ1jbGVhbkFtb3VudEluBARvbGRLCQC5AgIJALYCAQUScG9vbEFzc2V0SW5CYWxhbmNlCQC2AgEFE3Bvb2xBc3NldE91dEJhbGFuY2UEBG5ld0sJALkCAgkAtwICCQC2AgEJAQ1nZXRBY2NCYWxhbmNlAQUHYXNzZXRJbgkAtgIBBQ1mZWVQb29sQW1vdW50CQC4AgIJALYCAQkBDWdldEFjY0JhbGFuY2UBBQhhc3NldE91dAkAtgIBBQlhbW91bnRPdXQEBmNoZWNrSwMJAMACAgUEbmV3SwUEb2xkSwYJAAIBAhRuZXcgSyBpcyBmZXdlciBlcnJvcgMJAAACBQZjaGVja0sFBmNoZWNrSwQIY2hlY2tNaW4DCQBnAgUJYW1vdW50T3V0BQxhbW91bnRPdXRNaW4GCQACAQIsRXhjaGFuZ2UgcmVzdWx0IGlzIGZld2VyIGNvaW5zIHRoYW4gZXhwZWN0ZWQDCQAAAgUIY2hlY2tNaW4FCGNoZWNrTWluBBdhbW91bnRBc3NldEJhbGFuY2VEZWx0YQMFCWlzUmV2ZXJzZQkBAS0BBQlhbW91bnRPdXQFDWZlZVBvb2xBbW91bnQEFnByaWNlQXNzZXRCYWxhbmNlRGVsdGEDBQlpc1JldmVyc2UFDWZlZVBvb2xBbW91bnQJAQEtAQUJYW1vdW50T3V0BBFyZWZyZXNoS0xwQWN0aW9ucwgJARJyZWZyZXNoS0xwSW50ZXJuYWwDBRdhbW91bnRBc3NldEJhbGFuY2VEZWx0YQUWcHJpY2VBc3NldEJhbGFuY2VEZWx0YQAAAl8xAwkAAAIFEXJlZnJlc2hLTHBBY3Rpb25zBRFyZWZyZXNoS0xwQWN0aW9ucwQOcmViYWxhbmNlU3RhdGUJAQ5yZWJhbGFuY2VBc3NldAEFB2Fzc2V0SW4DCQAAAgUOcmViYWxhbmNlU3RhdGUFDnJlYmFsYW5jZVN0YXRlBA13aXRoZHJhd1N0YXRlCQEZd2l0aGRyYXdBbmRSZWJhbGFuY2VBc3NldAIFCGFzc2V0T3V0BQlhbW91bnRPdXQDCQAAAgUNd2l0aGRyYXdTdGF0ZQUNd2l0aGRyYXdTdGF0ZQkAlAoCCQDOCAIJAM4IAgUNd2l0aGRyYXdTdGF0ZQUOcmViYWxhbmNlU3RhdGUJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQUJYWRkcmVzc1RvBQlhbW91bnRPdXQJAQxwYXJzZUFzc2V0SWQBBQhhc3NldE91dAUDbmlsBQlhbW91bnRPdXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEDcHV0AhFzbGlwcGFnZVRvbGVyYW5jZQ9zaG91bGRBdXRvU3Rha2UDCQBmAgAABRFzbGlwcGFnZVRvbGVyYW5jZQkAAgECIEludmFsaWQgc2xpcHBhZ2VUb2xlcmFuY2UgcGFzc2VkBAZlc3RQdXQJAQljb21tb25QdXQDBQFpBRFzbGlwcGFnZVRvbGVyYW5jZQYECWVtaXRMcEFtdAgFBmVzdFB1dAJfMgQJbHBBc3NldElkCAUGZXN0UHV0Al83BAVzdGF0ZQgFBmVzdFB1dAJfOQQGYW1EaWZmCAUGZXN0UHV0A18xMAQGcHJEaWZmCAUGZXN0UHV0A18xMQQEYW1JZAgFBmVzdFB1dANfMTIEBHBySWQIBQZlc3RQdXQDXzEzBAphbUFzc2V0UG10CQC2AgEICQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BApwckFzc2V0UG10CQC2AgEICQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAEGYW1vdW50BApjdXJyZW50S0xwCQEOY2FsY0N1cnJlbnRLTHADBQphbUFzc2V0UG10BQpwckFzc2V0UG10CQC2AgEAAAMJAAACBQpjdXJyZW50S0xwBQpjdXJyZW50S0xwBAdlbWl0SW52CQD8BwQFD2ZhY3RvcnlDb250cmFjdAIEZW1pdAkAzAgCBQllbWl0THBBbXQFA25pbAUDbmlsAwkAAAIFB2VtaXRJbnYFB2VtaXRJbnYEDWVtaXRJbnZMZWdhY3kEByRtYXRjaDAFB2VtaXRJbnYDCQABAgUHJG1hdGNoMAIHQWRkcmVzcwQVbGVnYWN5RmFjdG9yeUNvbnRyYWN0BQckbWF0Y2gwCQD8BwQFFWxlZ2FjeUZhY3RvcnlDb250cmFjdAIEZW1pdAkAzAgCBQllbWl0THBBbXQFA25pbAUDbmlsBQR1bml0AwkAAAIFDWVtaXRJbnZMZWdhY3kFDWVtaXRJbnZMZWdhY3kEDHNsaXBwYWdlQUludgMJAGYCBQZhbURpZmYAAAkA/AcEBRBzbGlwcGFnZUNvbnRyYWN0AgNwdXQFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUEYW1JZAUGYW1EaWZmBQNuaWwFA25pbAMJAAACBQxzbGlwcGFnZUFJbnYFDHNsaXBwYWdlQUludgQMc2xpcHBhZ2VQSW52AwkAZgIFBnByRGlmZgAACQD8BwQFEHNsaXBwYWdlQ29udHJhY3QCA3B1dAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQRwcklkBQZwckRpZmYFA25pbAUDbmlsAwkAAAIFDHNsaXBwYWdlUEludgUMc2xpcHBhZ2VQSW52BApscFRyYW5zZmVyAwUPc2hvdWxkQXV0b1N0YWtlBAtzbHBTdGFrZUludgkA/AcEBQ9zdGFraW5nQ29udHJhY3QCBXN0YWtlBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFCWxwQXNzZXRJZAUJZW1pdExwQW10BQNuaWwDCQAAAgULc2xwU3Rha2VJbnYFC3NscFN0YWtlSW52BQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQllbWl0THBBbXQFCWxwQXNzZXRJZAUDbmlsBA0kdDA0NTYwNjQ2MDY4CQEScmVmcmVzaEtMcEludGVybmFsAwAAAAAAAAMJAAACBQ0kdDA0NTYwNjQ2MDY4BQ0kdDA0NTYwNjQ2MDY4BAp1cGRhdGVkS0xwCAUNJHQwNDU2MDY0NjA2OAJfMgQRcmVmcmVzaEtMcEFjdGlvbnMIBQ0kdDA0NTYwNjQ2MDY4Al8xBBFpc1VwZGF0ZWRLTHBWYWxpZAkBEnZhbGlkYXRlVXBkYXRlZEtMcAIFCmN1cnJlbnRLTHAFCnVwZGF0ZWRLTHADCQAAAgURaXNVcGRhdGVkS0xwVmFsaWQFEWlzVXBkYXRlZEtMcFZhbGlkBANyZWIJAPwHBAUEdGhpcwIJcmViYWxhbmNlBQNuaWwFA25pbAMJAAACBQNyZWIFA3JlYgkAzggCCQDOCAIFBXN0YXRlBQpscFRyYW5zZmVyBRFyZWZyZXNoS0xwQWN0aW9ucwkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQpwdXRGb3JGcmVlAQttYXhTbGlwcGFnZQMJAGYCAAAFC21heFNsaXBwYWdlCQACAQIUSW52YWxpZCB2YWx1ZSBwYXNzZWQEBmVzdFB1dAkBCWNvbW1vblB1dAMFAWkFC21heFNsaXBwYWdlBwQFc3RhdGUIBQZlc3RQdXQCXzkECmFtQXNzZXRQbXQJALYCAQgJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQECnByQXNzZXRQbXQJALYCAQgJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAQZhbW91bnQECmN1cnJlbnRLTHAJAQ5jYWxjQ3VycmVudEtMcAMFCmFtQXNzZXRQbXQFCnByQXNzZXRQbXQJALYCAQAAAwkAAAIFCmN1cnJlbnRLTHAFCmN1cnJlbnRLTHAEDSR0MDQ2NjgwNDY3NDUJARJyZWZyZXNoS0xwSW50ZXJuYWwDAAAAAAAABBFyZWZyZXNoS0xwQWN0aW9ucwgFDSR0MDQ2NjgwNDY3NDUCXzEECnVwZGF0ZWRLTHAIBQ0kdDA0NjY4MDQ2NzQ1Al8yBBFpc1VwZGF0ZWRLTHBWYWxpZAkBEnZhbGlkYXRlVXBkYXRlZEtMcAIFCmN1cnJlbnRLTHAFCnVwZGF0ZWRLTHADCQAAAgURaXNVcGRhdGVkS0xwVmFsaWQFEWlzVXBkYXRlZEtMcFZhbGlkCQDOCAIFBXN0YXRlBRFyZWZyZXNoS0xwQWN0aW9ucwkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQlwdXRPbmVUa24CDG1pbk91dEFtb3VudAlhdXRvU3Rha2UEIGlzUG9vbE9uZVRva2VuT3BlcmF0aW9uc0Rpc2FibGVkCgABQAkA/AcEBQ9mYWN0b3J5Q29udHJhY3QCKGlzUG9vbE9uZVRva2VuT3BlcmF0aW9uc0Rpc2FibGVkUkVBRE9OTFkJAMwIAgkApQgBBQR0aGlzBQNuaWwFA25pbAMJAAECBQFAAgdCb29sZWFuBQFACQACAQkArAICCQADAQUBQAIcIGNvdWxkbid0IGJlIGNhc3QgdG8gQm9vbGVhbgQNaXNQdXREaXNhYmxlZAMJAQEhAQkBFGlzQWRkcmVzc1doaXRlbGlzdGVkAQgFAWkGY2FsbGVyAwMDCQEQaXNHbG9iYWxTaHV0ZG93bgAGCQAAAgUNY2ZnUG9vbFN0YXR1cwUPUG9vbFB1dERpc2FibGVkBgkAAAIFDWNmZ1Bvb2xTdGF0dXMFDFBvb2xTaHV0ZG93bgYFIGlzUG9vbE9uZVRva2VuT3BlcmF0aW9uc0Rpc2FibGVkBwQGY2hlY2tzCQDMCAIDAwkBASEBBQ1pc1B1dERpc2FibGVkBgkBCWlzTWFuYWdlcgEFAWkGCQEIdGhyb3dFcnIBAiFwdXQgb3BlcmF0aW9uIGlzIGJsb2NrZWQgYnkgYWRtaW4JAMwIAgMJAAACCQCQAwEIBQFpCHBheW1lbnRzAAEGCQEIdGhyb3dFcnIBAh5leGFjdGx5IDEgcGF5bWVudCBhcmUgZXhwZWN0ZWQFA25pbAMJAAACBQZjaGVja3MFBmNoZWNrcwQHcGF5bWVudAkAkQMCCAUBaQhwYXltZW50cwAABA5wYXltZW50QXNzZXRJZAgFB3BheW1lbnQHYXNzZXRJZAQQcGF5bWVudEFtb3VudFJhdwgFB3BheW1lbnQGYW1vdW50BApjdXJyZW50S0xwAwkAAAIFDnBheW1lbnRBc3NldElkBRBjZmdBbW91bnRBc3NldElkCQEOY2FsY0N1cnJlbnRLTHADCQC2AgEFEHBheW1lbnRBbW91bnRSYXcJALYCAQAACQC2AgEAAAMJAAACBQ5wYXltZW50QXNzZXRJZAUPY2ZnUHJpY2VBc3NldElkCQEOY2FsY0N1cnJlbnRLTHADCQC2AgEAAAkAtgIBBRBwYXltZW50QW1vdW50UmF3CQC2AgEAAAkBCHRocm93RXJyAQIecGF5bWVudCBhc3NldCBpcyBub3Qgc3VwcG9ydGVkAwkAAAIFCmN1cnJlbnRLTHAFCmN1cnJlbnRLTHAEC3VzZXJBZGRyZXNzCAUBaQZjYWxsZXIEBHR4SWQIBQFpDXRyYW5zYWN0aW9uSWQEDSR0MDQ3OTc0NDgxMjYJAQ9jYWxjUHV0T25lVG9rZW4EBRBwYXltZW50QW1vdW50UmF3BQ5wYXltZW50QXNzZXRJZAULdXNlckFkZHJlc3MFBHR4SWQDCQAAAgUNJHQwNDc5NzQ0ODEyNgUNJHQwNDc5NzQ0ODEyNgQUcGF5bWVudEluQW1vdW50QXNzZXQIBQ0kdDA0Nzk3NDQ4MTI2Al81BAVib251cwgFDSR0MDQ3OTc0NDgxMjYCXzQECWZlZUFtb3VudAgFDSR0MDQ3OTc0NDgxMjYCXzMEC2NvbW1vblN0YXRlCAUNJHQwNDc5NzQ0ODEyNgJfMgQTZW1pdEFtb3VudEVzdGltYXRlZAgFDSR0MDQ3OTc0NDgxMjYCXzEECmVtaXRBbW91bnQDAwkAZgIFDG1pbk91dEFtb3VudAAACQBmAgUMbWluT3V0QW1vdW50BRNlbWl0QW1vdW50RXN0aW1hdGVkBwkBCHRocm93RXJyAQkAuQkCCQDMCAICH2Ftb3VudCB0byByZWNlaXZlIGlzIGxlc3MgdGhhbiAJAMwIAgkApAMBBQxtaW5PdXRBbW91bnQFA25pbAIABRNlbWl0QW1vdW50RXN0aW1hdGVkBAdlbWl0SW52CQEEZW1pdAEFCmVtaXRBbW91bnQDCQAAAgUHZW1pdEludgUHZW1pdEludgQKbHBUcmFuc2ZlcgMFCWF1dG9TdGFrZQQIc3Rha2VJbnYJAPwHBAUPc3Rha2luZ0NvbnRyYWN0AgVzdGFrZQUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQxjZmdMcEFzc2V0SWQFCmVtaXRBbW91bnQFA25pbAMJAAACBQhzdGFrZUludgUIc3Rha2VJbnYFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFCmVtaXRBbW91bnQFDGNmZ0xwQXNzZXRJZAUDbmlsBAdzZW5kRmVlAwkAZgIFCWZlZUFtb3VudAAACQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFE2ZlZUNvbGxlY3RvckFkZHJlc3MFCWZlZUFtb3VudAUOcGF5bWVudEFzc2V0SWQFA25pbAUDbmlsBA0kdDA0ODcxMjQ4OTA5AwkAAAIFBHRoaXMFE2ZlZUNvbGxlY3RvckFkZHJlc3MJAJQKAgAAAAADBRRwYXltZW50SW5BbW91bnRBc3NldAkAlAoCCQEBLQEFCWZlZUFtb3VudAAACQCUCgIAAAkBAS0BBQlmZWVBbW91bnQEF2Ftb3VudEFzc2V0QmFsYW5jZURlbHRhCAUNJHQwNDg3MTI0ODkwOQJfMQQWcHJpY2VBc3NldEJhbGFuY2VEZWx0YQgFDSR0MDQ4NzEyNDg5MDkCXzIEDSR0MDQ4OTEyNDkwMjAJARJyZWZyZXNoS0xwSW50ZXJuYWwDBRdhbW91bnRBc3NldEJhbGFuY2VEZWx0YQUWcHJpY2VBc3NldEJhbGFuY2VEZWx0YQAABBFyZWZyZXNoS0xwQWN0aW9ucwgFDSR0MDQ4OTEyNDkwMjACXzEECnVwZGF0ZWRLTHAIBQ0kdDA0ODkxMjQ5MDIwAl8yBANrTHAJAQV2YWx1ZQEJAKIIAQUGa2V5S0xwBBFpc1VwZGF0ZWRLTHBWYWxpZAkBEnZhbGlkYXRlVXBkYXRlZEtMcAIFCmN1cnJlbnRLTHAFCnVwZGF0ZWRLTHADCQAAAgURaXNVcGRhdGVkS0xwVmFsaWQFEWlzVXBkYXRlZEtMcFZhbGlkBANyZWIJAPwHBAUEdGhpcwIJcmViYWxhbmNlBQNuaWwFA25pbAMJAAACBQNyZWIFA3JlYgkAlAoCCQDOCAIJAM4IAgkAzggCBQtjb21tb25TdGF0ZQUKbHBUcmFuc2ZlcgUHc2VuZEZlZQURcmVmcmVzaEtMcEFjdGlvbnMFCmVtaXRBbW91bnQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQERcHV0T25lVGtuUkVBRE9OTFkCDnBheW1lbnRBc3NldElkEHBheW1lbnRBbW91bnRSYXcEDSR0MDQ5Mzc1NDk1MzIJAQ9jYWxjUHV0T25lVG9rZW4EBRBwYXltZW50QW1vdW50UmF3CQEMcGFyc2VBc3NldElkAQUOcGF5bWVudEFzc2V0SWQFBHVuaXQFBHVuaXQEE2VtaXRBbW91bnRFc3RpbWF0ZWQIBQ0kdDA0OTM3NTQ5NTMyAl8xBAtjb21tb25TdGF0ZQgFDSR0MDQ5Mzc1NDk1MzICXzIECWZlZUFtb3VudAgFDSR0MDQ5Mzc1NDk1MzICXzMEBWJvbnVzCAUNJHQwNDkzNzU0OTUzMgJfNAQUcGF5bWVudEluQW1vdW50QXNzZXQIBQ0kdDA0OTM3NTQ5NTMyAl81CQCUCgIFA25pbAkAlQoDBRNlbWl0QW1vdW50RXN0aW1hdGVkBQlmZWVBbW91bnQFBWJvbnVzAWkBCWdldE9uZVRrbgINb3V0QXNzZXRJZFN0cgxtaW5PdXRBbW91bnQEIGlzUG9vbE9uZVRva2VuT3BlcmF0aW9uc0Rpc2FibGVkCgABQAkA/AcEBQ9mYWN0b3J5Q29udHJhY3QCKGlzUG9vbE9uZVRva2VuT3BlcmF0aW9uc0Rpc2FibGVkUkVBRE9OTFkJAMwIAgkApQgBBQR0aGlzBQNuaWwFA25pbAMJAAECBQFAAgdCb29sZWFuBQFACQACAQkArAICCQADAQUBQAIcIGNvdWxkbid0IGJlIGNhc3QgdG8gQm9vbGVhbgQNaXNHZXREaXNhYmxlZAMJAQEhAQkBFGlzQWRkcmVzc1doaXRlbGlzdGVkAQgFAWkGY2FsbGVyAwMJARBpc0dsb2JhbFNodXRkb3duAAYJAAACBQ1jZmdQb29sU3RhdHVzBQxQb29sU2h1dGRvd24GBSBpc1Bvb2xPbmVUb2tlbk9wZXJhdGlvbnNEaXNhYmxlZAcEBmNoZWNrcwkAzAgCAwMJAQEhAQUNaXNHZXREaXNhYmxlZAYJAQlpc01hbmFnZXIBBQFpBgkBCHRocm93RXJyAQIhZ2V0IG9wZXJhdGlvbiBpcyBibG9ja2VkIGJ5IGFkbWluCQDMCAIDCQAAAgkAkAMBCAUBaQhwYXltZW50cwABBgkBCHRocm93RXJyAQIeZXhhY3RseSAxIHBheW1lbnQgYXJlIGV4cGVjdGVkBQNuaWwDCQAAAgUGY2hlY2tzBQZjaGVja3MECm91dEFzc2V0SWQJAQxwYXJzZUFzc2V0SWQBBQ1vdXRBc3NldElkU3RyBAdwYXltZW50CQCRAwIIBQFpCHBheW1lbnRzAAAEDnBheW1lbnRBc3NldElkCAUHcGF5bWVudAdhc3NldElkBA1wYXltZW50QW1vdW50CAUHcGF5bWVudAZhbW91bnQECmN1cnJlbnRLTHAJAQ5jYWxjQ3VycmVudEtMcAMJALYCAQAACQC2AgEAAAkAtgIBAAADCQAAAgUKY3VycmVudEtMcAUKY3VycmVudEtMcAQLdXNlckFkZHJlc3MIBQFpBmNhbGxlcgQEdHhJZAgFAWkNdHJhbnNhY3Rpb25JZAQNJHQwNTA0NTQ1MDYwNwkBD2NhbGNHZXRPbmVUb2tlbgUFCm91dEFzc2V0SWQFDXBheW1lbnRBbW91bnQFDnBheW1lbnRBc3NldElkBQt1c2VyQWRkcmVzcwUEdHhJZAMJAAACBQ0kdDA1MDQ1NDUwNjA3BQ0kdDA1MDQ1NDUwNjA3BBBvdXRJbkFtb3VudEFzc2V0CAUNJHQwNTA0NTQ1MDYwNwJfNQQFYm9udXMIBQ0kdDA1MDQ1NDUwNjA3Al80BAlmZWVBbW91bnQIBQ0kdDA1MDQ1NDUwNjA3Al8zBAtjb21tb25TdGF0ZQgFDSR0MDUwNDU0NTA2MDcCXzIED2Ftb3VudEVzdGltYXRlZAgFDSR0MDUwNDU0NTA2MDcCXzEEBmFtb3VudAMDCQBmAgUMbWluT3V0QW1vdW50AAAJAGYCBQxtaW5PdXRBbW91bnQFD2Ftb3VudEVzdGltYXRlZAcJAQh0aHJvd0VycgEJALkJAgkAzAgCAh9hbW91bnQgdG8gcmVjZWl2ZSBpcyBsZXNzIHRoYW4gCQDMCAIJAKQDAQUMbWluT3V0QW1vdW50BQNuaWwCAAUPYW1vdW50RXN0aW1hdGVkBAdidXJuSW52CQD8BwQFD2ZhY3RvcnlDb250cmFjdAIEYnVybgkAzAgCBQ1wYXltZW50QW1vdW50BQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFDnBheW1lbnRBc3NldElkBQ1wYXltZW50QW1vdW50BQNuaWwDCQAAAgUHYnVybkludgUHYnVybkludgQNd2l0aGRyYXdTdGF0ZQkBGXdpdGhkcmF3QW5kUmViYWxhbmNlQXNzZXQCBQ1vdXRBc3NldElkU3RyCQBkAgUGYW1vdW50CQCWAwEJAMwIAgAACQDMCAIFCWZlZUFtb3VudAUDbmlsBA1hc3NldFRyYW5zZmVyCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFC3VzZXJBZGRyZXNzBQZhbW91bnQFCm91dEFzc2V0SWQFA25pbAQHc2VuZEZlZQMJAGYCBQlmZWVBbW91bnQAAAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBRNmZWVDb2xsZWN0b3JBZGRyZXNzBQlmZWVBbW91bnQFCm91dEFzc2V0SWQFA25pbAUDbmlsBA0kdDA1MTI3MTUxNTE4BBBmZWVBbW91bnRGb3JDYWxjAwkAAAIFBHRoaXMFE2ZlZUNvbGxlY3RvckFkZHJlc3MAAAUJZmVlQW1vdW50AwUQb3V0SW5BbW91bnRBc3NldAkAlAoCCQEBLQEJAGQCBQZhbW91bnQFEGZlZUFtb3VudEZvckNhbGMAAAkAlAoCAAAJAQEtAQkAZAIFBmFtb3VudAUQZmVlQW1vdW50Rm9yQ2FsYwQXYW1vdW50QXNzZXRCYWxhbmNlRGVsdGEIBQ0kdDA1MTI3MTUxNTE4Al8xBBZwcmljZUFzc2V0QmFsYW5jZURlbHRhCAUNJHQwNTEyNzE1MTUxOAJfMgQNJHQwNTE1MjE1MTYyOQkBEnJlZnJlc2hLTHBJbnRlcm5hbAMFF2Ftb3VudEFzc2V0QmFsYW5jZURlbHRhBRZwcmljZUFzc2V0QmFsYW5jZURlbHRhAAAEEXJlZnJlc2hLTHBBY3Rpb25zCAUNJHQwNTE1MjE1MTYyOQJfMQQKdXBkYXRlZEtMcAgFDSR0MDUxNTIxNTE2MjkCXzIEEWlzVXBkYXRlZEtMcFZhbGlkCQESdmFsaWRhdGVVcGRhdGVkS0xwAgUKY3VycmVudEtMcAUKdXBkYXRlZEtMcAMJAAACBRFpc1VwZGF0ZWRLTHBWYWxpZAURaXNVcGRhdGVkS0xwVmFsaWQJAJQKAgkAzggCCQDOCAIJAM4IAgkAzggCBQtjb21tb25TdGF0ZQUNd2l0aGRyYXdTdGF0ZQUNYXNzZXRUcmFuc2ZlcgUHc2VuZEZlZQURcmVmcmVzaEtMcEFjdGlvbnMFBmFtb3VudAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARFnZXRPbmVUa25SRUFET05MWQIKb3V0QXNzZXRJZA1wYXltZW50QW1vdW50BA0kdDA1MTkwNzUyMDYzCQEPY2FsY0dldE9uZVRva2VuBQkBDHBhcnNlQXNzZXRJZAEFCm91dEFzc2V0SWQFDXBheW1lbnRBbW91bnQFDGNmZ0xwQXNzZXRJZAUEdW5pdAUEdW5pdAQPYW1vdW50RXN0aW1hdGVkCAUNJHQwNTE5MDc1MjA2MwJfMQQLY29tbW9uU3RhdGUIBQ0kdDA1MTkwNzUyMDYzAl8yBAlmZWVBbW91bnQIBQ0kdDA1MTkwNzUyMDYzAl8zBAVib251cwgFDSR0MDUxOTA3NTIwNjMCXzQEEG91dEluQW1vdW50QXNzZXQIBQ0kdDA1MTkwNzUyMDYzAl81CQCUCgIFA25pbAkAlQoDBQ9hbW91bnRFc3RpbWF0ZWQFCWZlZUFtb3VudAUFYm9udXMBaQETdW5zdGFrZUFuZEdldE9uZVRrbgMNdW5zdGFrZUFtb3VudA1vdXRBc3NldElkU3RyDG1pbk91dEFtb3VudAQgaXNQb29sT25lVG9rZW5PcGVyYXRpb25zRGlzYWJsZWQKAAFACQD8BwQFD2ZhY3RvcnlDb250cmFjdAIoaXNQb29sT25lVG9rZW5PcGVyYXRpb25zRGlzYWJsZWRSRUFET05MWQkAzAgCCQClCAEFBHRoaXMFA25pbAUDbmlsAwkAAQIFAUACB0Jvb2xlYW4FAUAJAAIBCQCsAgIJAAMBBQFAAhwgY291bGRuJ3QgYmUgY2FzdCB0byBCb29sZWFuBA1pc0dldERpc2FibGVkAwkBASEBCQEUaXNBZGRyZXNzV2hpdGVsaXN0ZWQBCAUBaQZjYWxsZXIDAwkBEGlzR2xvYmFsU2h1dGRvd24ABgkAAAIFDWNmZ1Bvb2xTdGF0dXMFDFBvb2xTaHV0ZG93bgYFIGlzUG9vbE9uZVRva2VuT3BlcmF0aW9uc0Rpc2FibGVkBwQGY2hlY2tzCQDMCAIDAwkBASEBBQ1pc0dldERpc2FibGVkBgkBCWlzTWFuYWdlcgEFAWkGCQEIdGhyb3dFcnIBAiFnZXQgb3BlcmF0aW9uIGlzIGJsb2NrZWQgYnkgYWRtaW4JAMwIAgMJAAACCQCQAwEIBQFpCHBheW1lbnRzAAAGCQEIdGhyb3dFcnIBAhhubyBwYXltZW50cyBhcmUgZXhwZWN0ZWQFA25pbAMJAAACBQZjaGVja3MFBmNoZWNrcwQKb3V0QXNzZXRJZAkBDHBhcnNlQXNzZXRJZAEFDW91dEFzc2V0SWRTdHIEC3VzZXJBZGRyZXNzCAUBaQZjYWxsZXIEBHR4SWQIBQFpDXRyYW5zYWN0aW9uSWQECmN1cnJlbnRLTHAJAQ5jYWxjQ3VycmVudEtMcAMJALYCAQAACQC2AgEAAAkAtgIBAAADCQAAAgUKY3VycmVudEtMcAUKY3VycmVudEtMcAQKdW5zdGFrZUludgkA/AcEBQ9zdGFraW5nQ29udHJhY3QCB3Vuc3Rha2UJAMwIAgkA2AQBBQxjZmdMcEFzc2V0SWQJAMwIAgUNdW5zdGFrZUFtb3VudAUDbmlsBQNuaWwDCQAAAgUKdW5zdGFrZUludgUKdW5zdGFrZUludgQNJHQwNTMwMDU1MzE1NgkBD2NhbGNHZXRPbmVUb2tlbgUFCm91dEFzc2V0SWQFDXVuc3Rha2VBbW91bnQFDGNmZ0xwQXNzZXRJZAULdXNlckFkZHJlc3MFBHR4SWQDCQAAAgUNJHQwNTMwMDU1MzE1NgUNJHQwNTMwMDU1MzE1NgQQb3V0SW5BbW91bnRBc3NldAgFDSR0MDUzMDA1NTMxNTYCXzUEBWJvbnVzCAUNJHQwNTMwMDU1MzE1NgJfNAQJZmVlQW1vdW50CAUNJHQwNTMwMDU1MzE1NgJfMwQLY29tbW9uU3RhdGUIBQ0kdDA1MzAwNTUzMTU2Al8yBA9hbW91bnRFc3RpbWF0ZWQIBQ0kdDA1MzAwNTUzMTU2Al8xBAZhbW91bnQDAwkAZgIFDG1pbk91dEFtb3VudAAACQBmAgUMbWluT3V0QW1vdW50BQ9hbW91bnRFc3RpbWF0ZWQHCQEIdGhyb3dFcnIBCQC5CQIJAMwIAgIfYW1vdW50IHRvIHJlY2VpdmUgaXMgbGVzcyB0aGFuIAkAzAgCCQCkAwEFDG1pbk91dEFtb3VudAUDbmlsAgAFD2Ftb3VudEVzdGltYXRlZAQHYnVybkludgkA/AcEBQ9mYWN0b3J5Q29udHJhY3QCBGJ1cm4JAMwIAgUNdW5zdGFrZUFtb3VudAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQxjZmdMcEFzc2V0SWQFDXVuc3Rha2VBbW91bnQFA25pbAMJAAACBQdidXJuSW52BQdidXJuSW52BA13aXRoZHJhd1N0YXRlCQEZd2l0aGRyYXdBbmRSZWJhbGFuY2VBc3NldAIFDW91dEFzc2V0SWRTdHIJAGQCBQZhbW91bnQJAJYDAQkAzAgCAAAJAMwIAgUJZmVlQW1vdW50BQNuaWwEDWFzc2V0VHJhbnNmZXIJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQZhbW91bnQFCm91dEFzc2V0SWQFA25pbAQHc2VuZEZlZQMJAGYCBQlmZWVBbW91bnQAAAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBRNmZWVDb2xsZWN0b3JBZGRyZXNzBQlmZWVBbW91bnQFCm91dEFzc2V0SWQFA25pbAUDbmlsBA0kdDA1MzgxNTU0MDYyBBBmZWVBbW91bnRGb3JDYWxjAwkAAAIFBHRoaXMFE2ZlZUNvbGxlY3RvckFkZHJlc3MAAAUJZmVlQW1vdW50AwUQb3V0SW5BbW91bnRBc3NldAkAlAoCCQEBLQEJAGQCBQZhbW91bnQFEGZlZUFtb3VudEZvckNhbGMAAAkAlAoCAAAJAQEtAQkAZAIFBmFtb3VudAUQZmVlQW1vdW50Rm9yQ2FsYwQXYW1vdW50QXNzZXRCYWxhbmNlRGVsdGEIBQ0kdDA1MzgxNTU0MDYyAl8xBBZwcmljZUFzc2V0QmFsYW5jZURlbHRhCAUNJHQwNTM4MTU1NDA2MgJfMgQNJHQwNTQwNjU1NDE3MwkBEnJlZnJlc2hLTHBJbnRlcm5hbAMFF2Ftb3VudEFzc2V0QmFsYW5jZURlbHRhBRZwcmljZUFzc2V0QmFsYW5jZURlbHRhAAAEEXJlZnJlc2hLTHBBY3Rpb25zCAUNJHQwNTQwNjU1NDE3MwJfMQQKdXBkYXRlZEtMcAgFDSR0MDU0MDY1NTQxNzMCXzIEEWlzVXBkYXRlZEtMcFZhbGlkCQESdmFsaWRhdGVVcGRhdGVkS0xwAgUKY3VycmVudEtMcAUKdXBkYXRlZEtMcAMJAAACBRFpc1VwZGF0ZWRLTHBWYWxpZAURaXNVcGRhdGVkS0xwVmFsaWQJAJQKAgkAzggCCQDOCAIJAM4IAgkAzggCBQtjb21tb25TdGF0ZQUNd2l0aGRyYXdTdGF0ZQUNYXNzZXRUcmFuc2ZlcgUHc2VuZEZlZQURcmVmcmVzaEtMcEFjdGlvbnMFBmFtb3VudAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQNnZXQABANyZXMJAQljb21tb25HZXQBBQFpBAhvdXRBbUFtdAgFA3JlcwJfMQQIb3V0UHJBbXQIBQNyZXMCXzIEBnBtdEFtdAgFA3JlcwJfMwQKcG10QXNzZXRJZAgFA3JlcwJfNAQFc3RhdGUIBQNyZXMCXzUEDXdpdGhkcmF3U3RhdGUJARd3aXRoZHJhd0FuZFJlYmFsYW5jZUFsbAIFCG91dEFtQW10BQhvdXRQckFtdAQKY3VycmVudEtMcAkBDmNhbGNDdXJyZW50S0xwAwkAtgIBAAAJALYCAQAACQC2AgEAAAMJAAACBQpjdXJyZW50S0xwBQpjdXJyZW50S0xwBBRidXJuTFBBc3NldE9uRmFjdG9yeQkA/AcEBQ9mYWN0b3J5Q29udHJhY3QCBGJ1cm4JAMwIAgUGcG10QW10BQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFCnBtdEFzc2V0SWQFBnBtdEFtdAUDbmlsAwkAAAIFFGJ1cm5MUEFzc2V0T25GYWN0b3J5BRRidXJuTFBBc3NldE9uRmFjdG9yeQQNJHQwNTUyNjg1NTM0OQkBEnJlZnJlc2hLTHBJbnRlcm5hbAMJAQEtAQUIb3V0QW1BbXQJAQEtAQUIb3V0UHJBbXQAAAQRcmVmcmVzaEtMcEFjdGlvbnMIBQ0kdDA1NTI2ODU1MzQ5Al8xBAp1cGRhdGVkS0xwCAUNJHQwNTUyNjg1NTM0OQJfMgQRaXNVcGRhdGVkS0xwVmFsaWQJARJ2YWxpZGF0ZVVwZGF0ZWRLTHACBQpjdXJyZW50S0xwBQp1cGRhdGVkS0xwAwkAAAIFEWlzVXBkYXRlZEtMcFZhbGlkBRFpc1VwZGF0ZWRLTHBWYWxpZAkAzggCCQDOCAIFDXdpdGhkcmF3U3RhdGUFBXN0YXRlBRFyZWZyZXNoS0xwQWN0aW9ucwkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQlnZXROb0xlc3MCEm5vTGVzc1RoZW5BbXRBc3NldBRub0xlc3NUaGVuUHJpY2VBc3NldAQDcmVzCQEJY29tbW9uR2V0AQUBaQQIb3V0QW1BbXQIBQNyZXMCXzEECG91dFByQW10CAUDcmVzAl8yBAZwbXRBbXQIBQNyZXMCXzMECnBtdEFzc2V0SWQIBQNyZXMCXzQEBXN0YXRlCAUDcmVzAl81AwkAZgIFEm5vTGVzc1RoZW5BbXRBc3NldAUIb3V0QW1BbXQJAAIBCQCsAgIJAKwCAgkArAICAhxub0xlc3NUaGVuQW10QXNzZXQgZmFpbGVkOiAgCQCkAwEFCG91dEFtQW10AgMgPCAJAKQDAQUSbm9MZXNzVGhlbkFtdEFzc2V0AwkAZgIFFG5vTGVzc1RoZW5QcmljZUFzc2V0BQhvdXRQckFtdAkAAgEJAKwCAgkArAICCQCsAgICHW5vTGVzc1RoZW5QcmljZUFzc2V0IGZhaWxlZDogCQCkAwEFCG91dFByQW10AgMgPCAJAKQDAQUUbm9MZXNzVGhlblByaWNlQXNzZXQEDXdpdGhkcmF3U3RhdGUJARd3aXRoZHJhd0FuZFJlYmFsYW5jZUFsbAIFCG91dEFtQW10BQhvdXRQckFtdAQKY3VycmVudEtMcAkBDmNhbGNDdXJyZW50S0xwAwkAtgIBAAAJALYCAQAACQC2AgEAAAMJAAACBQpjdXJyZW50S0xwBQpjdXJyZW50S0xwBBRidXJuTFBBc3NldE9uRmFjdG9yeQkA/AcEBQ9mYWN0b3J5Q29udHJhY3QCBGJ1cm4JAMwIAgUGcG10QW10BQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFCnBtdEFzc2V0SWQFBnBtdEFtdAUDbmlsAwkAAAIFFGJ1cm5MUEFzc2V0T25GYWN0b3J5BRRidXJuTFBBc3NldE9uRmFjdG9yeQQNJHQwNTY0NDQ1NjUyNQkBEnJlZnJlc2hLTHBJbnRlcm5hbAMJAQEtAQUIb3V0QW1BbXQJAQEtAQUIb3V0UHJBbXQAAAQRcmVmcmVzaEtMcEFjdGlvbnMIBQ0kdDA1NjQ0NDU2NTI1Al8xBAp1cGRhdGVkS0xwCAUNJHQwNTY0NDQ1NjUyNQJfMgQRaXNVcGRhdGVkS0xwVmFsaWQJARJ2YWxpZGF0ZVVwZGF0ZWRLTHACBQpjdXJyZW50S0xwBQp1cGRhdGVkS0xwAwkAAAIFEWlzVXBkYXRlZEtMcFZhbGlkBRFpc1VwZGF0ZWRLTHBWYWxpZAkAzggCCQDOCAIFDXdpdGhkcmF3U3RhdGUFBXN0YXRlBRFyZWZyZXNoS0xwQWN0aW9ucwkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQ11bnN0YWtlQW5kR2V0AQZhbW91bnQEDWNoZWNrUGF5bWVudHMDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAAJAAIBAhhObyBwYXltZW50cyBhcmUgZXhwZWN0ZWQGAwkAAAIFDWNoZWNrUGF5bWVudHMFDWNoZWNrUGF5bWVudHMEA2NmZwkBDWdldFBvb2xDb25maWcABAlscEFzc2V0SWQJANkEAQkAkQMCBQNjZmcFEGlkeFBvb2xMUEFzc2V0SWQECmN1cnJlbnRLTHAJAQ5jYWxjQ3VycmVudEtMcAMJALYCAQAACQC2AgEAAAkAtgIBAAADCQAAAgUKY3VycmVudEtMcAUKY3VycmVudEtMcAQKdW5zdGFrZUludgkA/AcEBQ9zdGFraW5nQ29udHJhY3QCB3Vuc3Rha2UJAMwIAgkA2AQBBQlscEFzc2V0SWQJAMwIAgUGYW1vdW50BQNuaWwFA25pbAMJAAACBQp1bnN0YWtlSW52BQp1bnN0YWtlSW52BANyZXMJARRlc3RpbWF0ZUdldE9wZXJhdGlvbgQJANgEAQgFAWkNdHJhbnNhY3Rpb25JZAkA2AQBBQlscEFzc2V0SWQFBmFtb3VudAgFAWkGY2FsbGVyBAhvdXRBbUFtdAgFA3JlcwJfMQQIb3V0UHJBbXQIBQNyZXMCXzIECnBvb2xTdGF0dXMJAQ1wYXJzZUludFZhbHVlAQgFA3JlcwJfOQQFc3RhdGUIBQNyZXMDXzEwBA13aXRoZHJhd1N0YXRlCQEXd2l0aGRyYXdBbmRSZWJhbGFuY2VBbGwCBQhvdXRBbUFtdAUIb3V0UHJBbXQEDWlzR2V0RGlzYWJsZWQDCQEBIQEJARRpc0FkZHJlc3NXaGl0ZWxpc3RlZAEIBQFpBmNhbGxlcgMJARBpc0dsb2JhbFNodXRkb3duAAYJAAACBQ1jZmdQb29sU3RhdHVzBQxQb29sU2h1dGRvd24HBA9jaGVja1Bvb2xTdGF0dXMDBQ1pc0dldERpc2FibGVkCQACAQkArAICAixHZXQgb3BlcmF0aW9uIGlzIGJsb2NrZWQgYnkgYWRtaW4uIFN0YXR1cyA9IAkApAMBBQpwb29sU3RhdHVzBgMJAAACBQ9jaGVja1Bvb2xTdGF0dXMFD2NoZWNrUG9vbFN0YXR1cwQUYnVybkxQQXNzZXRPbkZhY3RvcnkJAPwHBAUPZmFjdG9yeUNvbnRyYWN0AgRidXJuCQDMCAIFBmFtb3VudAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQlscEFzc2V0SWQFBmFtb3VudAUDbmlsAwkAAAIFFGJ1cm5MUEFzc2V0T25GYWN0b3J5BRRidXJuTFBBc3NldE9uRmFjdG9yeQQNJHQwNTc4NzM1Nzk1NAkBEnJlZnJlc2hLTHBJbnRlcm5hbAMJAQEtAQUIb3V0QW1BbXQJAQEtAQUIb3V0UHJBbXQAAAQRcmVmcmVzaEtMcEFjdGlvbnMIBQ0kdDA1Nzg3MzU3OTU0Al8xBAp1cGRhdGVkS0xwCAUNJHQwNTc4NzM1Nzk1NAJfMgQRaXNVcGRhdGVkS0xwVmFsaWQJARJ2YWxpZGF0ZVVwZGF0ZWRLTHACBQpjdXJyZW50S0xwBQp1cGRhdGVkS0xwAwkAAAIFEWlzVXBkYXRlZEtMcFZhbGlkBRFpc1VwZGF0ZWRLTHBWYWxpZAkAzggCCQDOCAIFDXdpdGhkcmF3U3RhdGUFBXN0YXRlBRFyZWZyZXNoS0xwQWN0aW9ucwkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARN1bnN0YWtlQW5kR2V0Tm9MZXNzAw11bnN0YWtlQW1vdW50FW5vTGVzc1RoZW5BbW91bnRBc3NldBRub0xlc3NUaGVuUHJpY2VBc3NldAQNaXNHZXREaXNhYmxlZAMJAQEhAQkBFGlzQWRkcmVzc1doaXRlbGlzdGVkAQgFAWkGY2FsbGVyAwkBEGlzR2xvYmFsU2h1dGRvd24ABgkAAAIFDWNmZ1Bvb2xTdGF0dXMFDFBvb2xTaHV0ZG93bgcEBmNoZWNrcwkAzAgCAwkBASEBBQ1pc0dldERpc2FibGVkBgkAAgECIWdldCBvcGVyYXRpb24gaXMgYmxvY2tlZCBieSBhZG1pbgkAzAgCAwkAAAIJAJADAQgFAWkIcGF5bWVudHMAAAYJAAIBAhhubyBwYXltZW50cyBhcmUgZXhwZWN0ZWQFA25pbAMJAAACBQZjaGVja3MFBmNoZWNrcwQKY3VycmVudEtMcAkBDmNhbGNDdXJyZW50S0xwAwkAtgIBAAAJALYCAQAACQC2AgEAAAMJAAACBQpjdXJyZW50S0xwBQpjdXJyZW50S0xwBAp1bnN0YWtlSW52CQD8BwQFD3N0YWtpbmdDb250cmFjdAIHdW5zdGFrZQkAzAgCCQDYBAEFDGNmZ0xwQXNzZXRJZAkAzAgCBQ11bnN0YWtlQW1vdW50BQNuaWwFA25pbAMJAAACBQp1bnN0YWtlSW52BQp1bnN0YWtlSW52BANyZXMJARRlc3RpbWF0ZUdldE9wZXJhdGlvbgQJANgEAQgFAWkNdHJhbnNhY3Rpb25JZAkA2AQBBQxjZmdMcEFzc2V0SWQFDXVuc3Rha2VBbW91bnQIBQFpBmNhbGxlcgQIb3V0QW1BbXQIBQNyZXMCXzEECG91dFByQW10CAUDcmVzAl8yBAVzdGF0ZQgFA3JlcwNfMTAEDXdpdGhkcmF3U3RhdGUJARd3aXRoZHJhd0FuZFJlYmFsYW5jZUFsbAIFCG91dEFtQW10BQhvdXRQckFtdAQMY2hlY2tBbW91bnRzCQDMCAIDCQBnAgUIb3V0QW1BbXQFFW5vTGVzc1RoZW5BbW91bnRBc3NldAYJAAIBCQC5CQIJAMwIAgIsYW1vdW50IGFzc2V0IGFtb3VudCB0byByZWNlaXZlIGlzIGxlc3MgdGhhbiAJAMwIAgkApAMBBRVub0xlc3NUaGVuQW1vdW50QXNzZXQFA25pbAIACQDMCAIDCQBnAgUIb3V0UHJBbXQFFG5vTGVzc1RoZW5QcmljZUFzc2V0BgkAAgEJALkJAgkAzAgCAitwcmljZSBhc3NldCBhbW91bnQgdG8gcmVjZWl2ZSBpcyBsZXNzIHRoYW4gCQDMCAIJAKQDAQUUbm9MZXNzVGhlblByaWNlQXNzZXQFA25pbAIABQNuaWwDCQAAAgUMY2hlY2tBbW91bnRzBQxjaGVja0Ftb3VudHMEFGJ1cm5MUEFzc2V0T25GYWN0b3J5CQD8BwQFD2ZhY3RvcnlDb250cmFjdAIEYnVybgkAzAgCBQ11bnN0YWtlQW1vdW50BQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFDGNmZ0xwQXNzZXRJZAUNdW5zdGFrZUFtb3VudAUDbmlsAwkAAAIFFGJ1cm5MUEFzc2V0T25GYWN0b3J5BRRidXJuTFBBc3NldE9uRmFjdG9yeQQNJHQwNTk0MzI1OTUxMwkBEnJlZnJlc2hLTHBJbnRlcm5hbAMJAQEtAQUIb3V0QW1BbXQJAQEtAQUIb3V0UHJBbXQAAAQRcmVmcmVzaEtMcEFjdGlvbnMIBQ0kdDA1OTQzMjU5NTEzAl8xBAp1cGRhdGVkS0xwCAUNJHQwNTk0MzI1OTUxMwJfMgQRaXNVcGRhdGVkS0xwVmFsaWQJARJ2YWxpZGF0ZVVwZGF0ZWRLTHACBQpjdXJyZW50S0xwBQp1cGRhdGVkS0xwAwkAAAIFEWlzVXBkYXRlZEtMcFZhbGlkBRFpc1VwZGF0ZWRLTHBWYWxpZAkAzggCCQDOCAIFDXdpdGhkcmF3U3RhdGUFBXN0YXRlBRFyZWZyZXNoS0xwQWN0aW9ucwkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQhhY3RpdmF0ZQILYW10QXNzZXRTdHINcHJpY2VBc3NldFN0cgMJAQIhPQIJAKUIAQgFAWkGY2FsbGVyCQClCAEFD2ZhY3RvcnlDb250cmFjdAkAAgECEnBlcm1pc3Npb25zIGRlbmllZAkAlAoCCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhYQAFC2FtdEFzc2V0U3RyCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJwYQAFDXByaWNlQXNzZXRTdHIFA25pbAIHc3VjY2VzcwFpAQpyZWZyZXNoS0xwAAQYbGFzdFJlZnJlc2hlZEJsb2NrSGVpZ2h0CQELdmFsdWVPckVsc2UCCQCfCAEFFWtleUtMcFJlZnJlc2hlZEhlaWdodAAABB1jaGVja0xhc3RSZWZyZXNoZWRCbG9ja0hlaWdodAMJAGcCCQBlAgUGaGVpZ2h0BRhsYXN0UmVmcmVzaGVkQmxvY2tIZWlnaHQFD2tMcFJlZnJlc2hEZWxheQUEdW5pdAkBCHRocm93RXJyAQkAuQkCCQDMCAIJAKQDAQUPa0xwUmVmcmVzaERlbGF5CQDMCAICLyBibG9ja3MgaGF2ZSBub3QgcGFzc2VkIHNpbmNlIHRoZSBwcmV2aW91cyBjYWxsBQNuaWwCAAMJAAACBR1jaGVja0xhc3RSZWZyZXNoZWRCbG9ja0hlaWdodAUdY2hlY2tMYXN0UmVmcmVzaGVkQmxvY2tIZWlnaHQEA2tMcAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCoAwEJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwUGa2V5S0xwAgEwCQEGZm10RXJyAQILaW52YWxpZCBrTHAEDSR0MDYwNzE3NjA3ODEJARJyZWZyZXNoS0xwSW50ZXJuYWwDAAAAAAAABBBrTHBVcGRhdGVBY3Rpb25zCAUNJHQwNjA3MTc2MDc4MQJfMQQKdXBkYXRlZEtMcAgFDSR0MDYwNzE3NjA3ODECXzIEB2FjdGlvbnMDCQECIT0CBQNrTHAFCnVwZGF0ZWRLTHAFEGtMcFVwZGF0ZUFjdGlvbnMJAQh0aHJvd0VycgECEm5vdGhpbmcgdG8gcmVmcmVzaAkAlAoCBQdhY3Rpb25zCQCmAwEFCnVwZGF0ZWRLTHAJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEcZ2V0UG9vbENvbmZpZ1dyYXBwZXJSRUFET05MWQAJAJQKAgUDbmlsCQENZ2V0UG9vbENvbmZpZwABaQEcZ2V0QWNjQmFsYW5jZVdyYXBwZXJSRUFET05MWQEHYXNzZXRJZAkAlAoCBQNuaWwJAQ1nZXRBY2NCYWxhbmNlAQUHYXNzZXRJZAFpARljYWxjUHJpY2VzV3JhcHBlclJFQURPTkxZAwVhbUFtdAVwckFtdAVscEFtdAQGcHJpY2VzCQEKY2FsY1ByaWNlcwMFBWFtQW10BQVwckFtdAUFbHBBbXQJAJQKAgUDbmlsCQDMCAIJAKYDAQkAkQMCBQZwcmljZXMAAAkAzAgCCQCmAwEJAJEDAgUGcHJpY2VzAAEJAMwIAgkApgMBCQCRAwIFBnByaWNlcwACBQNuaWwBaQEUdG9YMThXcmFwcGVyUkVBRE9OTFkCB29yaWdWYWwNb3JpZ1NjYWxlTXVsdAkAlAoCBQNuaWwJAKYDAQkBBXRvWDE4AgUHb3JpZ1ZhbAUNb3JpZ1NjYWxlTXVsdAFpARZmcm9tWDE4V3JhcHBlclJFQURPTkxZAgN2YWwPcmVzdWx0U2NhbGVNdWx0CQCUCgIFA25pbAkBB2Zyb21YMTgCCQCnAwEFA3ZhbAUPcmVzdWx0U2NhbGVNdWx0AWkBHmNhbGNQcmljZUJpZ0ludFdyYXBwZXJSRUFET05MWQIIcHJBbXRYMTgIYW1BbXRYMTgJAJQKAgUDbmlsCQCmAwEJAQ9jYWxjUHJpY2VCaWdJbnQCCQCnAwEFCHByQW10WDE4CQCnAwEFCGFtQW10WDE4AWkBI2VzdGltYXRlUHV0T3BlcmF0aW9uV3JhcHBlclJFQURPTkxZCQZ0eElkNTgRc2xpcHBhZ2VUb2xlcmFuY2UMaW5BbUFzc2V0QW10C2luQW1Bc3NldElkDGluUHJBc3NldEFtdAtpblByQXNzZXRJZAt1c2VyQWRkcmVzcwppc0V2YWx1YXRlBmVtaXRMcAkAlAoCBQNuaWwJARRlc3RpbWF0ZVB1dE9wZXJhdGlvbgkFBnR4SWQ1OAURc2xpcHBhZ2VUb2xlcmFuY2UFDGluQW1Bc3NldEFtdAULaW5BbUFzc2V0SWQFDGluUHJBc3NldEFtdAULaW5QckFzc2V0SWQFC3VzZXJBZGRyZXNzBQppc0V2YWx1YXRlBQZlbWl0THABaQEjZXN0aW1hdGVHZXRPcGVyYXRpb25XcmFwcGVyUkVBRE9OTFkEBnR4SWQ1OApwbXRBc3NldElkCHBtdExwQW10C3VzZXJBZGRyZXNzBANyZXMJARRlc3RpbWF0ZUdldE9wZXJhdGlvbgQFBnR4SWQ1OAUKcG10QXNzZXRJZAUIcG10THBBbXQJARFAZXh0ck5hdGl2ZSgxMDYyKQEFC3VzZXJBZGRyZXNzCQCUCgIFA25pbAkAnAoKCAUDcmVzAl8xCAUDcmVzAl8yCAUDcmVzAl8zCAUDcmVzAl80CAUDcmVzAl81CAUDcmVzAl82CAUDcmVzAl83CQCmAwEIBQNyZXMCXzgIBQNyZXMCXzkIBQNyZXMDXzEwAWkBDXN0YXRzUkVBRE9OTFkABANjZmcJAQ1nZXRQb29sQ29uZmlnAAQJbHBBc3NldElkCQDZBAEJAJEDAgUDY2ZnBRBpZHhQb29sTFBBc3NldElkBAphbXRBc3NldElkCQCRAwIFA2NmZwUNaWR4QW10QXNzZXRJZAQMcHJpY2VBc3NldElkCQCRAwIFA2NmZwUPaWR4UHJpY2VBc3NldElkBAtpQW10QXNzZXRJZAkAkQMCBQNjZmcFDmlkeElBbXRBc3NldElkBA1pUHJpY2VBc3NldElkCQCRAwIFA2NmZwUQaWR4SVByaWNlQXNzZXRJZAQLYW10QXNzZXREY20JAQ1wYXJzZUludFZhbHVlAQkAkQMCBQNjZmcFDmlkeEFtdEFzc2V0RGNtBA1wcmljZUFzc2V0RGNtCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUDY2ZnBRBpZHhQcmljZUFzc2V0RGNtBA1wb29sTFBCYWxhbmNlCAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDsBwEFCWxwQXNzZXRJZAkArAICCQCsAgICBkFzc2V0IAkA2AQBBQlscEFzc2V0SWQCDiBkb2Vzbid0IGV4aXN0CHF1YW50aXR5BBJhY2NBbXRBc3NldEJhbGFuY2UJAQ1nZXRBY2NCYWxhbmNlAQUKYW10QXNzZXRJZAQUYWNjUHJpY2VBc3NldEJhbGFuY2UJAQ1nZXRBY2NCYWxhbmNlAQUMcHJpY2VBc3NldElkBApwcmljZXNMaXN0AwkAAAIFDXBvb2xMUEJhbGFuY2UAAAkAzAgCBQp6ZXJvQmlnSW50CQDMCAIFCnplcm9CaWdJbnQJAMwIAgUKemVyb0JpZ0ludAUDbmlsCQEKY2FsY1ByaWNlcwMFEmFjY0FtdEFzc2V0QmFsYW5jZQUUYWNjUHJpY2VBc3NldEJhbGFuY2UFDXBvb2xMUEJhbGFuY2UECGN1clByaWNlAAAED2xwQW10QXNzZXRTaGFyZQkBB2Zyb21YMTgCCQCRAwIFCnByaWNlc0xpc3QAAQUGc2NhbGU4BBFscFByaWNlQXNzZXRTaGFyZQkBB2Zyb21YMTgCCQCRAwIFCnByaWNlc0xpc3QAAgUGc2NhbGU4BApwb29sV2VpZ2h0CQEFdmFsdWUBCQCaCAIFD2ZhY3RvcnlDb250cmFjdAkBDWtleVBvb2xXZWlnaHQBCQClCAEFBHRoaXMJAJQKAgUDbmlsCQC5CQIJAMwIAgIOJWQlZCVkJWQlZCVkJWQJAMwIAgkApAMBBRJhY2NBbXRBc3NldEJhbGFuY2UJAMwIAgkApAMBBRRhY2NQcmljZUFzc2V0QmFsYW5jZQkAzAgCCQCkAwEFDXBvb2xMUEJhbGFuY2UJAMwIAgkApAMBBQhjdXJQcmljZQkAzAgCCQCkAwEFD2xwQW10QXNzZXRTaGFyZQkAzAgCCQCkAwEFEWxwUHJpY2VBc3NldFNoYXJlCQDMCAIJAKQDAQUKcG9vbFdlaWdodAUDbmlsBQNTRVABaQEgZXZhbHVhdGVQdXRCeUFtb3VudEFzc2V0UkVBRE9OTFkBDGluQW1Bc3NldEFtdAQDY2ZnCQENZ2V0UG9vbENvbmZpZwAECWxwQXNzZXRJZAkA2QQBCQCRAwIFA2NmZwUQaWR4UG9vbExQQXNzZXRJZAQMYW1Bc3NldElkU3RyCQCRAwIFA2NmZwUNaWR4QW10QXNzZXRJZAQJYW1Bc3NldElkCQDZBAEFDGFtQXNzZXRJZFN0cgQMcHJBc3NldElkU3RyCQCRAwIFA2NmZwUPaWR4UHJpY2VBc3NldElkBAlwckFzc2V0SWQJANkEAQUMcHJBc3NldElkU3RyBAthbXRBc3NldERjbQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFA2NmZwUOaWR4QW10QXNzZXREY20EDXByaWNlQXNzZXREY20JAQ1wYXJzZUludFZhbHVlAQkAkQMCBQNjZmcFEGlkeFByaWNlQXNzZXREY20ECnBvb2xTdGF0dXMJAJEDAgUDY2ZnBQ1pZHhQb29sU3RhdHVzBA1wb29sTFBCYWxhbmNlCAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDsBwEFCWxwQXNzZXRJZAkArAICCQCsAgICBkFzc2V0IAkA2AQBBQlscEFzc2V0SWQCDiBkb2Vzbid0IGV4aXN0CHF1YW50aXR5BBJhY2NBbXRBc3NldEJhbGFuY2UJAQ1nZXRBY2NCYWxhbmNlAQUMYW1Bc3NldElkU3RyBBRhY2NQcmljZUFzc2V0QmFsYW5jZQkBDWdldEFjY0JhbGFuY2UBBQxwckFzc2V0SWRTdHIEDmFtdEFzc2V0QW10WDE4CQEFdG9YMTgCBRJhY2NBbXRBc3NldEJhbGFuY2UFC2FtdEFzc2V0RGNtBBBwcmljZUFzc2V0QW10WDE4CQEFdG9YMTgCBRRhY2NQcmljZUFzc2V0QmFsYW5jZQUNcHJpY2VBc3NldERjbQQLY3VyUHJpY2VYMTgDCQAAAgUNcG9vbExQQmFsYW5jZQAABQp6ZXJvQmlnSW50CQEPY2FsY1ByaWNlQmlnSW50AgUQcHJpY2VBc3NldEFtdFgxOAUOYW10QXNzZXRBbXRYMTgED2luQW1Bc3NldEFtdFgxOAkBBXRvWDE4AgUMaW5BbUFzc2V0QW10BQthbXRBc3NldERjbQQPaW5QckFzc2V0QW10WDE4CQC8AgMFD2luQW1Bc3NldEFtdFgxOAULY3VyUHJpY2VYMTgFB3NjYWxlMTgEDGluUHJBc3NldEFtdAkBB2Zyb21YMTgCBQ9pblByQXNzZXRBbXRYMTgFDXByaWNlQXNzZXREY20EBmVzdFB1dAkBFGVzdGltYXRlUHV0T3BlcmF0aW9uCQIAAKDCHgUMaW5BbUFzc2V0QW10BQlhbUFzc2V0SWQFDGluUHJBc3NldEFtdAUJcHJBc3NldElkAgAGBwQJY2FsY0xwQW10CAUGZXN0UHV0Al8xBAxjdXJQcmljZUNhbGMIBQZlc3RQdXQCXzMECWFtQmFsYW5jZQgFBmVzdFB1dAJfNAQJcHJCYWxhbmNlCAUGZXN0UHV0Al81BApscEVtaXNzaW9uCAUGZXN0UHV0Al82CQCUCgIFA25pbAkAuQkCCQDMCAICECVkJWQlZCVkJWQlZCVkJWQJAMwIAgkApAMBBQljYWxjTHBBbXQJAMwIAgkApAMBCQEHZnJvbVgxOAIFC2N1clByaWNlWDE4BQZzY2FsZTgJAMwIAgkApAMBBQlhbUJhbGFuY2UJAMwIAgkApAMBBQlwckJhbGFuY2UJAMwIAgkApAMBBQpscEVtaXNzaW9uCQDMCAIFCnBvb2xTdGF0dXMJAMwIAgkApAMBBQxpbkFtQXNzZXRBbXQJAMwIAgkApAMBBQxpblByQXNzZXRBbXQFA25pbAUDU0VQAWkBH2V2YWx1YXRlUHV0QnlQcmljZUFzc2V0UkVBRE9OTFkBDGluUHJBc3NldEFtdAQDY2ZnCQENZ2V0UG9vbENvbmZpZwAECWxwQXNzZXRJZAkA2QQBCQCRAwIFA2NmZwUQaWR4UG9vbExQQXNzZXRJZAQMYW1Bc3NldElkU3RyCQCRAwIFA2NmZwUNaWR4QW10QXNzZXRJZAQJYW1Bc3NldElkCQDZBAEFDGFtQXNzZXRJZFN0cgQMcHJBc3NldElkU3RyCQCRAwIFA2NmZwUPaWR4UHJpY2VBc3NldElkBAlwckFzc2V0SWQJANkEAQUMcHJBc3NldElkU3RyBAthbXRBc3NldERjbQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFA2NmZwUOaWR4QW10QXNzZXREY20EDXByaWNlQXNzZXREY20JAQ1wYXJzZUludFZhbHVlAQkAkQMCBQNjZmcFEGlkeFByaWNlQXNzZXREY20ECnBvb2xTdGF0dXMJAJEDAgUDY2ZnBQ1pZHhQb29sU3RhdHVzBA1wb29sTFBCYWxhbmNlCAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDsBwEFCWxwQXNzZXRJZAkArAICCQCsAgICBkFzc2V0IAkA2AQBBQlscEFzc2V0SWQCDiBkb2Vzbid0IGV4aXN0CHF1YW50aXR5BAxhbUJhbGFuY2VSYXcJAQ1nZXRBY2NCYWxhbmNlAQUMYW1Bc3NldElkU3RyBAxwckJhbGFuY2VSYXcJAQ1nZXRBY2NCYWxhbmNlAQUMcHJBc3NldElkU3RyBA9hbUJhbGFuY2VSYXdYMTgJAQV0b1gxOAIFDGFtQmFsYW5jZVJhdwULYW10QXNzZXREY20ED3ByQmFsYW5jZVJhd1gxOAkBBXRvWDE4AgUMcHJCYWxhbmNlUmF3BQ1wcmljZUFzc2V0RGNtBAtjdXJQcmljZVgxOAMJAAACBQ1wb29sTFBCYWxhbmNlAAAFCnplcm9CaWdJbnQJAQ9jYWxjUHJpY2VCaWdJbnQCBQ9wckJhbGFuY2VSYXdYMTgFD2FtQmFsYW5jZVJhd1gxOAQPaW5QckFzc2V0QW10WDE4CQEFdG9YMTgCBQxpblByQXNzZXRBbXQFDXByaWNlQXNzZXREY20ED2luQW1Bc3NldEFtdFgxOAkAvAIDBQ9pblByQXNzZXRBbXRYMTgFB3NjYWxlMTgFC2N1clByaWNlWDE4BAxpbkFtQXNzZXRBbXQJAQdmcm9tWDE4AgUPaW5BbUFzc2V0QW10WDE4BQthbXRBc3NldERjbQQGZXN0UHV0CQEUZXN0aW1hdGVQdXRPcGVyYXRpb24JAgAAoMIeBQxpbkFtQXNzZXRBbXQFCWFtQXNzZXRJZAUMaW5QckFzc2V0QW10BQlwckFzc2V0SWQCAAYHBAljYWxjTHBBbXQIBQZlc3RQdXQCXzEEDGN1clByaWNlQ2FsYwgFBmVzdFB1dAJfMwQJYW1CYWxhbmNlCAUGZXN0UHV0Al80BAlwckJhbGFuY2UIBQZlc3RQdXQCXzUECmxwRW1pc3Npb24IBQZlc3RQdXQCXzYJAJQKAgUDbmlsCQC5CQIJAMwIAgIQJWQlZCVkJWQlZCVkJWQlZAkAzAgCCQCkAwEFCWNhbGNMcEFtdAkAzAgCCQCkAwEJAQdmcm9tWDE4AgULY3VyUHJpY2VYMTgFBnNjYWxlOAkAzAgCCQCkAwEFCWFtQmFsYW5jZQkAzAgCCQCkAwEFCXByQmFsYW5jZQkAzAgCCQCkAwEFCmxwRW1pc3Npb24JAMwIAgUKcG9vbFN0YXR1cwkAzAgCCQCkAwEFDGluQW1Bc3NldEFtdAkAzAgCCQCkAwEFDGluUHJBc3NldEFtdAUDbmlsBQNTRVABaQETZXZhbHVhdGVHZXRSRUFET05MWQIQcGF5bWVudExwQXNzZXRJZAxwYXltZW50THBBbXQEA3JlcwkBFGVzdGltYXRlR2V0T3BlcmF0aW9uBAIABRBwYXltZW50THBBc3NldElkBQxwYXltZW50THBBbXQFBHRoaXMECG91dEFtQW10CAUDcmVzAl8xBAhvdXRQckFtdAgFA3JlcwJfMgQJYW1CYWxhbmNlCAUDcmVzAl81BAlwckJhbGFuY2UIBQNyZXMCXzYECmxwRW1pc3Npb24IBQNyZXMCXzcECGN1clByaWNlCAUDcmVzAl84BApwb29sU3RhdHVzCQENcGFyc2VJbnRWYWx1ZQEIBQNyZXMCXzkJAJQKAgUDbmlsCQC5CQIJAMwIAgIOJWQlZCVkJWQlZCVkJWQJAMwIAgkApAMBBQhvdXRBbUFtdAkAzAgCCQCkAwEFCG91dFByQW10CQDMCAIJAKQDAQUJYW1CYWxhbmNlCQDMCAIJAKQDAQUJcHJCYWxhbmNlCQDMCAIJAKQDAQUKbHBFbWlzc2lvbgkAzAgCCQCmAwEFCGN1clByaWNlCQDMCAIJAKQDAQUKcG9vbFN0YXR1cwUDbmlsBQNTRVABAnR4AQZ2ZXJpZnkABA90YXJnZXRQdWJsaWNLZXkEByRtYXRjaDAJARZtYW5hZ2VyUHVibGljS2V5T3JVbml0AAMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAJwawUHJG1hdGNoMAUCcGsDCQABAgUHJG1hdGNoMAIEVW5pdAgFAnR4D3NlbmRlclB1YmxpY0tleQkAAgECC01hdGNoIGVycm9yBAckbWF0Y2gwBQJ0eAMJAAECBQckbWF0Y2gwAgVPcmRlcgQFb3JkZXIFByRtYXRjaDAECm1hdGNoZXJQdWIJARNnZXRNYXRjaGVyUHViT3JGYWlsAAQNJHQwNjk0NDM2OTU2MAMJARNza2lwT3JkZXJWYWxpZGF0aW9uAAkAlAoCBgIACQEbdmFsaWRhdGVNYXRjaGVyT3JkZXJBbGxvd2VkAQUFb3JkZXIECm9yZGVyVmFsaWQIBQ0kdDA2OTQ0MzY5NTYwAl8xBA5vcmRlclZhbGlkSW5mbwgFDSR0MDY5NDQzNjk1NjACXzIEC3NlbmRlclZhbGlkCQD0AwMIBQVvcmRlcglib2R5Qnl0ZXMJAJEDAggFBW9yZGVyBnByb29mcwAACAUFb3JkZXIPc2VuZGVyUHVibGljS2V5BAxtYXRjaGVyVmFsaWQJAPQDAwgFBW9yZGVyCWJvZHlCeXRlcwkAkQMCCAUFb3JkZXIGcHJvb2ZzAAEFCm1hdGNoZXJQdWIDAwMFCm9yZGVyVmFsaWQFC3NlbmRlclZhbGlkBwUMbWF0Y2hlclZhbGlkBwYJAQ90aHJvd09yZGVyRXJyb3IEBQpvcmRlclZhbGlkBQ5vcmRlclZhbGlkSW5mbwULc2VuZGVyVmFsaWQFDG1hdGNoZXJWYWxpZAMJAAECBQckbWF0Y2gwAhRTZXRTY3JpcHRUcmFuc2FjdGlvbgQBcwUHJG1hdGNoMAMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAFD3RhcmdldFB1YmxpY0tleQYEB25ld0hhc2gJAPYDAQkBBXZhbHVlAQgFAXMGc2NyaXB0BAthbGxvd2VkSGFzaAkA2wQBCQEFdmFsdWUBCQCdCAIFD2ZhY3RvcnlDb250cmFjdAkBFmtleUFsbG93ZWRMcFNjcmlwdEhhc2gABAtjdXJyZW50SGFzaAkA8QcBBQR0aGlzAwkAAAIFC2FsbG93ZWRIYXNoBQduZXdIYXNoCQECIT0CBQtjdXJyZW50SGFzaAUHbmV3SGFzaAcJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAFD3RhcmdldFB1YmxpY0tlecMZ+sA=", "height": 2985981, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: EcgcLqYpdrg7GknRTtZdXgjntZS8SqgFcdk9aeGHAMeg Next: 838d9aNBMi4kstg36zxLE49tezzDLvMamci9kRLAU3Eb Diff:
OldNewDifferences
454454 let stakingProfitAddress = $t01675516891._7
455455 if (isLeasable)
456456 then {
457- let newTotalLeasableBalance = max([0, ((getAccBalance(assetId) - getAmount) - minBalance)])
458- if ((newTotalLeasableBalance == newTotalLeasableBalance))
457+ let currentStakingAssetBalance = getStakingAssetBalanceOrZero(proxyAssetId)
458+ if ((currentStakingAssetBalance == currentStakingAssetBalance))
459459 then {
460- let newAdditionalBalance = fraction(leasedRatio, newTotalLeasableBalance, 100)
461- if ((newAdditionalBalance == newAdditionalBalance))
460+ let currentAdditionalBalance = if ((currentStakingAssetBalance != 0))
461+ then getAdditionalBalanceOrZero(assetId)
462+ else 0
463+ if ((currentAdditionalBalance == currentAdditionalBalance))
462464 then {
463- let withdrawAmount = (getAdditionalBalanceOrZero(assetId) - newAdditionalBalance)
464- if ((withdrawAmount == withdrawAmount))
465- then if ((0 > withdrawAmount))
466- then deposit(assetId, -(withdrawAmount), proxyAssetId, addressFromStringValue(proxyAddress))
467- else withdraw(assetId, withdrawAmount, proxyAssetId, addressFromStringValue(proxyAddress), proxyRateMul, addressFromStringValue(stakingProfitAddress))
465+ let newTotalLeasableBalance = max([0, ((getAccBalance(assetId) - getAmount) - minBalance)])
466+ if ((newTotalLeasableBalance == newTotalLeasableBalance))
467+ then {
468+ let newAdditionalBalance = fraction(leasedRatio, newTotalLeasableBalance, 100)
469+ if ((newAdditionalBalance == newAdditionalBalance))
470+ then {
471+ let withdrawAmount = (currentAdditionalBalance - newAdditionalBalance)
472+ if ((withdrawAmount == withdrawAmount))
473+ then if ((0 > withdrawAmount))
474+ then deposit(assetId, -(withdrawAmount), proxyAssetId, addressFromStringValue(proxyAddress))
475+ else withdraw(assetId, withdrawAmount, proxyAssetId, addressFromStringValue(proxyAddress), proxyRateMul, addressFromStringValue(stakingProfitAddress))
476+ else throw("Strict value is not equal to itself.")
477+ }
478+ else throw("Strict value is not equal to itself.")
479+ }
468480 else throw("Strict value is not equal to itself.")
469481 }
470482 else throw("Strict value is not equal to itself.")
664676 let priceAssetBalance = getAccBalance(assetIdToString(cfgPriceAssetId))
665677 let amountAssetAmount = order.amount
666678 let priceAssetAmount = fraction(order.amount, order.price, scale8, FLOOR)
667- let $t02928029492 = if ((order.orderType == Buy))
679+ let $t02947529687 = if ((order.orderType == Buy))
668680 then $Tuple2(amountAssetAmount, -(priceAssetAmount))
669681 else $Tuple2(-(amountAssetAmount), priceAssetAmount)
670- let amountAssetBalanceDelta = $t02928029492._1
671- let priceAssetBalanceDelta = $t02928029492._2
682+ let amountAssetBalanceDelta = $t02947529687._1
683+ let priceAssetBalanceDelta = $t02947529687._2
672684 if (if (if (isGlobalShutdown())
673685 then true
674686 else (cfgPoolStatus == PoolMatcherDisabled))
681693 then throw("Wrong order assets.")
682694 else {
683695 let kLp = valueOrErrorMessage(parseBigInt(valueOrElse(getString(this, keyKLp), "0")), fmtErr("invalid kLp"))
684- let $t02993230032 = refreshKLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
685- let unusedActions = $t02993230032._1
686- let kLpNew = $t02993230032._2
696+ let $t03012730227 = refreshKLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
697+ let unusedActions = $t03012730227._1
698+ let kLpNew = $t03012730227._2
687699 let isOrderValid = (kLpNew >= kLp)
688700 let info = makeString(["kLp=", toString(kLp), " kLpNew=", toString(kLpNew), " amountAssetBalance=", toString(amountAssetBalance), " priceAssetBalance=", toString(priceAssetBalance), " amountAssetBalanceDelta=", toString(amountAssetBalanceDelta), " priceAssetBalanceDelta=", toString(priceAssetBalanceDelta), " height=", toString(height)], "")
689701 $Tuple2(isOrderValid, info)
766778 else if ((paymentAssetId == cfgPriceAssetId))
767779 then false
768780 else throwErr("invalid asset")
769- let $t03321833511 = if (isEval)
781+ let $t03341333706 = if (isEval)
770782 then $Tuple2(amountBalanceRaw, priceBalanceRaw)
771783 else if (paymentInAmountAsset)
772784 then $Tuple2((amountBalanceRaw - paymentAmountRaw), priceBalanceRaw)
773785 else $Tuple2(amountBalanceRaw, (priceBalanceRaw - paymentAmountRaw))
774- let amountBalanceOld = $t03321833511._1
775- let priceBalanceOld = $t03321833511._2
776- let $t03351533664 = if (paymentInAmountAsset)
786+ let amountBalanceOld = $t03341333706._1
787+ let priceBalanceOld = $t03341333706._2
788+ let $t03371033859 = if (paymentInAmountAsset)
777789 then $Tuple2(paymentAmountRaw, 0)
778790 else $Tuple2(0, paymentAmountRaw)
779- let amountAssetAmountRaw = $t03351533664._1
780- let priceAssetAmountRaw = $t03351533664._2
791+ let amountAssetAmountRaw = $t03371033859._1
792+ let priceAssetAmountRaw = $t03371033859._2
781793 let amountAssetAmount = takeFee(amountAssetAmountRaw, inFee)._1
782794 let priceAssetAmount = takeFee(priceAssetAmountRaw, inFee)._1
783- let $t03379633860 = takeFee(paymentAmountRaw, inFee)
784- let paymentAmount = $t03379633860._1
785- let feeAmount = $t03379633860._2
795+ let $t03399134055 = takeFee(paymentAmountRaw, inFee)
796+ let paymentAmount = $t03399134055._1
797+ let feeAmount = $t03399134055._2
786798 let amountBalanceNew = (amountBalanceOld + amountAssetAmount)
787799 let priceBalanceNew = (priceBalanceOld + priceAssetAmount)
788800 let priceNewX18 = calcPriceBigInt(toX18(priceBalanceNew, cfgPriceAssetDecimals), toX18(amountBalanceNew, cfgAmountAssetDecimals))
805817 let priceOldX18 = calcPriceBigInt(toX18(priceBalanceOld, cfgPriceAssetDecimals), toX18(amountBalanceOld, cfgAmountAssetDecimals))
806818 let priceOld = fromX18(priceOldX18, scale8)
807819 let loss = {
808- let $t03554135708 = if (paymentInAmountAsset)
820+ let $t03573635903 = if (paymentInAmountAsset)
809821 then $Tuple2(amountAssetAmountRaw, amountBalanceOld)
810822 else $Tuple2(priceAssetAmountRaw, priceBalanceOld)
811- let amount = $t03554135708._1
812- let balance = $t03554135708._2
823+ let amount = $t03573635903._1
824+ let balance = $t03573635903._2
813825 let issueAmountBoth = toInt(fraction(supplyBigInt, toBigInt((amount / 2)), toBigInt(balance)))
814826 fraction((issueAmount - issueAmountBoth), scale8, issueAmountBoth)
815827 }
849861 let supplyBigInt = toBigInt(valueOrErrorMessage(assetInfo(cfgLpAssetId), (("asset " + toBase58String(cfgLpAssetId)) + " doesn't exist")).quantity)
850862 let redeemedBigInt = toBigInt(paymentAmount)
851863 let amountRaw = max([0, toInt(((balanceBigInt * (scale18 - pow((scale18 - ((redeemedBigInt * scale18) / supplyBigInt)), 18, big2, 0, 18, DOWN))) / scale18))])
852- let $t03778637842 = takeFee(amountRaw, outFee)
853- let totalAmount = $t03778637842._1
854- let feeAmount = $t03778637842._2
855- let $t03784638072 = if (outInAmountAsset)
864+ let $t03798138037 = takeFee(amountRaw, outFee)
865+ let totalAmount = $t03798138037._1
866+ let feeAmount = $t03798138037._2
867+ let $t03804138267 = if (outInAmountAsset)
856868 then $Tuple4(totalAmount, 0, (amBalanceOld - amountRaw), prBalanceOld)
857869 else $Tuple4(0, totalAmount, amBalanceOld, (prBalanceOld - amountRaw))
858- let outAmAmount = $t03784638072._1
859- let outPrAmount = $t03784638072._2
860- let amBalanceNew = $t03784638072._3
861- let prBalanceNew = $t03784638072._4
870+ let outAmAmount = $t03804138267._1
871+ let outPrAmount = $t03804138267._2
872+ let amBalanceNew = $t03804138267._3
873+ let prBalanceNew = $t03804138267._4
862874 let priceNewX18 = calcPriceBigInt(toX18(prBalanceNew, cfgPriceAssetDecimals), toX18(amBalanceNew, cfgAmountAssetDecimals))
863875 let priceNew = fromX18(priceNewX18, scale8)
864876 let commonState = if (isEval)
923935
924936 @Callable(i)
925937 func calculateAmountOutForSwapREADONLY (cleanAmountIn,isReverse,feePoolAmount) = {
926- let $t03993040235 = if ((isReverse == false))
938+ let $t04012540430 = if ((isReverse == false))
927939 then {
928940 let assetOut = getStringOrFail(this, pa())
929941 let assetIn = getStringOrFail(this, aa())
934946 let assetIn = getStringOrFail(this, pa())
935947 $Tuple2(assetOut, assetIn)
936948 }
937- let assetOut = $t03993040235._1
938- let assetIn = $t03993040235._2
949+ let assetOut = $t04012540430._1
950+ let assetIn = $t04012540430._2
939951 let poolAssetInBalance = getAccBalance(assetIn)
940952 let poolAssetOutBalance = getAccBalance(assetOut)
941953 let amountOut = fraction(poolAssetOutBalance, cleanAmountIn, (poolAssetInBalance + cleanAmountIn))
10791091 else throw("Strict value is not equal to itself.")
10801092 }
10811093 else [ScriptTransfer(i.caller, emitLpAmt, lpAssetId)]
1082- let $t04541145873 = refreshKLpInternal(0, 0, 0)
1083- if (($t04541145873 == $t04541145873))
1094+ let $t04560646068 = refreshKLpInternal(0, 0, 0)
1095+ if (($t04560646068 == $t04560646068))
10841096 then {
1085- let updatedKLp = $t04541145873._2
1086- let refreshKLpActions = $t04541145873._1
1097+ let updatedKLp = $t04560646068._2
1098+ let refreshKLpActions = $t04560646068._1
10871099 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
10881100 if ((isUpdatedKLpValid == isUpdatedKLpValid))
10891101 then {
11201132 let currentKLp = calcCurrentKLp(amAssetPmt, prAssetPmt, toBigInt(0))
11211133 if ((currentKLp == currentKLp))
11221134 then {
1123- let $t04648546550 = refreshKLpInternal(0, 0, 0)
1124- let refreshKLpActions = $t04648546550._1
1125- let updatedKLp = $t04648546550._2
1135+ let $t04668046745 = refreshKLpInternal(0, 0, 0)
1136+ let refreshKLpActions = $t04668046745._1
1137+ let updatedKLp = $t04668046745._2
11261138 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
11271139 if ((isUpdatedKLpValid == isUpdatedKLpValid))
11281140 then (state ++ refreshKLpActions)
11711183 then {
11721184 let userAddress = i.caller
11731185 let txId = i.transactionId
1174- let $t04777947931 = calcPutOneToken(paymentAmountRaw, paymentAssetId, userAddress, txId)
1175- if (($t04777947931 == $t04777947931))
1186+ let $t04797448126 = calcPutOneToken(paymentAmountRaw, paymentAssetId, userAddress, txId)
1187+ if (($t04797448126 == $t04797448126))
11761188 then {
1177- let paymentInAmountAsset = $t04777947931._5
1178- let bonus = $t04777947931._4
1179- let feeAmount = $t04777947931._3
1180- let commonState = $t04777947931._2
1181- let emitAmountEstimated = $t04777947931._1
1189+ let paymentInAmountAsset = $t04797448126._5
1190+ let bonus = $t04797448126._4
1191+ let feeAmount = $t04797448126._3
1192+ let commonState = $t04797448126._2
1193+ let emitAmountEstimated = $t04797448126._1
11821194 let emitAmount = if (if ((minOutAmount > 0))
11831195 then (minOutAmount > emitAmountEstimated)
11841196 else false)
11981210 let sendFee = if ((feeAmount > 0))
11991211 then [ScriptTransfer(feeCollectorAddress, feeAmount, paymentAssetId)]
12001212 else nil
1201- let $t04851748714 = if ((this == feeCollectorAddress))
1213+ let $t04871248909 = if ((this == feeCollectorAddress))
12021214 then $Tuple2(0, 0)
12031215 else if (paymentInAmountAsset)
12041216 then $Tuple2(-(feeAmount), 0)
12051217 else $Tuple2(0, -(feeAmount))
1206- let amountAssetBalanceDelta = $t04851748714._1
1207- let priceAssetBalanceDelta = $t04851748714._2
1208- let $t04871748825 = refreshKLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
1209- let refreshKLpActions = $t04871748825._1
1210- let updatedKLp = $t04871748825._2
1218+ let amountAssetBalanceDelta = $t04871248909._1
1219+ let priceAssetBalanceDelta = $t04871248909._2
1220+ let $t04891249020 = refreshKLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
1221+ let refreshKLpActions = $t04891249020._1
1222+ let updatedKLp = $t04891249020._2
12111223 let kLp = value(getString(keyKLp))
12121224 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
12131225 if ((isUpdatedKLpValid == isUpdatedKLpValid))
12321244
12331245 @Callable(i)
12341246 func putOneTknREADONLY (paymentAssetId,paymentAmountRaw) = {
1235- let $t04918049337 = calcPutOneToken(paymentAmountRaw, parseAssetId(paymentAssetId), unit, unit)
1236- let emitAmountEstimated = $t04918049337._1
1237- let commonState = $t04918049337._2
1238- let feeAmount = $t04918049337._3
1239- let bonus = $t04918049337._4
1240- let paymentInAmountAsset = $t04918049337._5
1247+ let $t04937549532 = calcPutOneToken(paymentAmountRaw, parseAssetId(paymentAssetId), unit, unit)
1248+ let emitAmountEstimated = $t04937549532._1
1249+ let commonState = $t04937549532._2
1250+ let feeAmount = $t04937549532._3
1251+ let bonus = $t04937549532._4
1252+ let paymentInAmountAsset = $t04937549532._5
12411253 $Tuple2(nil, $Tuple3(emitAmountEstimated, feeAmount, bonus))
12421254 }
12431255
12761288 then {
12771289 let userAddress = i.caller
12781290 let txId = i.transactionId
1279- let $t05025950412 = calcGetOneToken(outAssetId, paymentAmount, paymentAssetId, userAddress, txId)
1280- if (($t05025950412 == $t05025950412))
1291+ let $t05045450607 = calcGetOneToken(outAssetId, paymentAmount, paymentAssetId, userAddress, txId)
1292+ if (($t05045450607 == $t05045450607))
12811293 then {
1282- let outInAmountAsset = $t05025950412._5
1283- let bonus = $t05025950412._4
1284- let feeAmount = $t05025950412._3
1285- let commonState = $t05025950412._2
1286- let amountEstimated = $t05025950412._1
1294+ let outInAmountAsset = $t05045450607._5
1295+ let bonus = $t05045450607._4
1296+ let feeAmount = $t05045450607._3
1297+ let commonState = $t05045450607._2
1298+ let amountEstimated = $t05045450607._1
12871299 let amount = if (if ((minOutAmount > 0))
12881300 then (minOutAmount > amountEstimated)
12891301 else false)
12971309 let sendFee = if ((feeAmount > 0))
12981310 then [ScriptTransfer(feeCollectorAddress, feeAmount, outAssetId)]
12991311 else nil
1300- let $t05107651323 = {
1312+ let $t05127151518 = {
13011313 let feeAmountForCalc = if ((this == feeCollectorAddress))
13021314 then 0
13031315 else feeAmount
13051317 then $Tuple2(-((amount + feeAmountForCalc)), 0)
13061318 else $Tuple2(0, -((amount + feeAmountForCalc)))
13071319 }
1308- let amountAssetBalanceDelta = $t05107651323._1
1309- let priceAssetBalanceDelta = $t05107651323._2
1310- let $t05132651434 = refreshKLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
1311- let refreshKLpActions = $t05132651434._1
1312- let updatedKLp = $t05132651434._2
1320+ let amountAssetBalanceDelta = $t05127151518._1
1321+ let priceAssetBalanceDelta = $t05127151518._2
1322+ let $t05152151629 = refreshKLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
1323+ let refreshKLpActions = $t05152151629._1
1324+ let updatedKLp = $t05152151629._2
13131325 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
13141326 if ((isUpdatedKLpValid == isUpdatedKLpValid))
13151327 then $Tuple2(((((commonState ++ withdrawState) ++ assetTransfer) ++ sendFee) ++ refreshKLpActions), amount)
13281340
13291341 @Callable(i)
13301342 func getOneTknREADONLY (outAssetId,paymentAmount) = {
1331- let $t05171251868 = calcGetOneToken(parseAssetId(outAssetId), paymentAmount, cfgLpAssetId, unit, unit)
1332- let amountEstimated = $t05171251868._1
1333- let commonState = $t05171251868._2
1334- let feeAmount = $t05171251868._3
1335- let bonus = $t05171251868._4
1336- let outInAmountAsset = $t05171251868._5
1343+ let $t05190752063 = calcGetOneToken(parseAssetId(outAssetId), paymentAmount, cfgLpAssetId, unit, unit)
1344+ let amountEstimated = $t05190752063._1
1345+ let commonState = $t05190752063._2
1346+ let feeAmount = $t05190752063._3
1347+ let bonus = $t05190752063._4
1348+ let outInAmountAsset = $t05190752063._5
13371349 $Tuple2(nil, $Tuple3(amountEstimated, feeAmount, bonus))
13381350 }
13391351
13721384 let unstakeInv = invoke(stakingContract, "unstake", [toBase58String(cfgLpAssetId), unstakeAmount], nil)
13731385 if ((unstakeInv == unstakeInv))
13741386 then {
1375- let $t05281052961 = calcGetOneToken(outAssetId, unstakeAmount, cfgLpAssetId, userAddress, txId)
1376- if (($t05281052961 == $t05281052961))
1387+ let $t05300553156 = calcGetOneToken(outAssetId, unstakeAmount, cfgLpAssetId, userAddress, txId)
1388+ if (($t05300553156 == $t05300553156))
13771389 then {
1378- let outInAmountAsset = $t05281052961._5
1379- let bonus = $t05281052961._4
1380- let feeAmount = $t05281052961._3
1381- let commonState = $t05281052961._2
1382- let amountEstimated = $t05281052961._1
1390+ let outInAmountAsset = $t05300553156._5
1391+ let bonus = $t05300553156._4
1392+ let feeAmount = $t05300553156._3
1393+ let commonState = $t05300553156._2
1394+ let amountEstimated = $t05300553156._1
13831395 let amount = if (if ((minOutAmount > 0))
13841396 then (minOutAmount > amountEstimated)
13851397 else false)
13931405 let sendFee = if ((feeAmount > 0))
13941406 then [ScriptTransfer(feeCollectorAddress, feeAmount, outAssetId)]
13951407 else nil
1396- let $t05362053867 = {
1408+ let $t05381554062 = {
13971409 let feeAmountForCalc = if ((this == feeCollectorAddress))
13981410 then 0
13991411 else feeAmount
14011413 then $Tuple2(-((amount + feeAmountForCalc)), 0)
14021414 else $Tuple2(0, -((amount + feeAmountForCalc)))
14031415 }
1404- let amountAssetBalanceDelta = $t05362053867._1
1405- let priceAssetBalanceDelta = $t05362053867._2
1406- let $t05387053978 = refreshKLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
1407- let refreshKLpActions = $t05387053978._1
1408- let updatedKLp = $t05387053978._2
1416+ let amountAssetBalanceDelta = $t05381554062._1
1417+ let priceAssetBalanceDelta = $t05381554062._2
1418+ let $t05406554173 = refreshKLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
1419+ let refreshKLpActions = $t05406554173._1
1420+ let updatedKLp = $t05406554173._2
14091421 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
14101422 if ((isUpdatedKLpValid == isUpdatedKLpValid))
14111423 then $Tuple2(((((commonState ++ withdrawState) ++ assetTransfer) ++ sendFee) ++ refreshKLpActions), amount)
14391451 let burnLPAssetOnFactory = invoke(factoryContract, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
14401452 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
14411453 then {
1442- let $t05507355154 = refreshKLpInternal(-(outAmAmt), -(outPrAmt), 0)
1443- let refreshKLpActions = $t05507355154._1
1444- let updatedKLp = $t05507355154._2
1454+ let $t05526855349 = refreshKLpInternal(-(outAmAmt), -(outPrAmt), 0)
1455+ let refreshKLpActions = $t05526855349._1
1456+ let updatedKLp = $t05526855349._2
14451457 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
14461458 if ((isUpdatedKLpValid == isUpdatedKLpValid))
14471459 then ((withdrawState ++ state) ++ refreshKLpActions)
14741486 let burnLPAssetOnFactory = invoke(factoryContract, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
14751487 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
14761488 then {
1477- let $t05624956330 = refreshKLpInternal(-(outAmAmt), -(outPrAmt), 0)
1478- let refreshKLpActions = $t05624956330._1
1479- let updatedKLp = $t05624956330._2
1489+ let $t05644456525 = refreshKLpInternal(-(outAmAmt), -(outPrAmt), 0)
1490+ let refreshKLpActions = $t05644456525._1
1491+ let updatedKLp = $t05644456525._2
14801492 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
14811493 if ((isUpdatedKLpValid == isUpdatedKLpValid))
14821494 then ((withdrawState ++ state) ++ refreshKLpActions)
15241536 let burnLPAssetOnFactory = invoke(factoryContract, "burn", [amount], [AttachedPayment(lpAssetId, amount)])
15251537 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
15261538 then {
1527- let $t05767857759 = refreshKLpInternal(-(outAmAmt), -(outPrAmt), 0)
1528- let refreshKLpActions = $t05767857759._1
1529- let updatedKLp = $t05767857759._2
1539+ let $t05787357954 = refreshKLpInternal(-(outAmAmt), -(outPrAmt), 0)
1540+ let refreshKLpActions = $t05787357954._1
1541+ let updatedKLp = $t05787357954._2
15301542 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
15311543 if ((isUpdatedKLpValid == isUpdatedKLpValid))
15321544 then ((withdrawState ++ state) ++ refreshKLpActions)
15801592 let burnLPAssetOnFactory = invoke(factoryContract, "burn", [unstakeAmount], [AttachedPayment(cfgLpAssetId, unstakeAmount)])
15811593 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
15821594 then {
1583- let $t05923759318 = refreshKLpInternal(-(outAmAmt), -(outPrAmt), 0)
1584- let refreshKLpActions = $t05923759318._1
1585- let updatedKLp = $t05923759318._2
1595+ let $t05943259513 = refreshKLpInternal(-(outAmAmt), -(outPrAmt), 0)
1596+ let refreshKLpActions = $t05943259513._1
1597+ let updatedKLp = $t05943259513._2
15861598 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
15871599 if ((isUpdatedKLpValid == isUpdatedKLpValid))
15881600 then ((withdrawState ++ state) ++ refreshKLpActions)
16171629 if ((checkLastRefreshedBlockHeight == checkLastRefreshedBlockHeight))
16181630 then {
16191631 let kLp = valueOrErrorMessage(parseBigInt(valueOrElse(getString(this, keyKLp), "0")), fmtErr("invalid kLp"))
1620- let $t06052260586 = refreshKLpInternal(0, 0, 0)
1621- let kLpUpdateActions = $t06052260586._1
1622- let updatedKLp = $t06052260586._2
1632+ let $t06071760781 = refreshKLpInternal(0, 0, 0)
1633+ let kLpUpdateActions = $t06071760781._1
1634+ let updatedKLp = $t06071760781._2
16231635 let actions = if ((kLp != updatedKLp))
16241636 then kLpUpdateActions
16251637 else throwErr("nothing to refresh")
17941806 match tx {
17951807 case order: Order =>
17961808 let matcherPub = getMatcherPubOrFail()
1797- let $t06924869365 = if (skipOrderValidation())
1809+ let $t06944369560 = if (skipOrderValidation())
17981810 then $Tuple2(true, "")
17991811 else validateMatcherOrderAllowed(order)
1800- let orderValid = $t06924869365._1
1801- let orderValidInfo = $t06924869365._2
1812+ let orderValid = $t06944369560._1
1813+ let orderValidInfo = $t06944369560._2
18021814 let senderValid = sigVerify(order.bodyBytes, order.proofs[0], order.senderPublicKey)
18031815 let matcherValid = sigVerify(order.bodyBytes, order.proofs[1], matcherPub)
18041816 if (if (if (orderValid)
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let lPdecimals = 8
55
66 let scale8 = 100000000
77
88 let scale8BigInt = toBigInt(100000000)
99
1010 let scale18 = toBigInt(1000000000000000000)
1111
1212 let zeroBigInt = toBigInt(0)
1313
1414 let big0 = toBigInt(0)
1515
1616 let big1 = toBigInt(1)
1717
1818 let big2 = toBigInt(2)
1919
2020 let wavesString = "WAVES"
2121
2222 let SEP = "__"
2323
2424 let PoolActive = 1
2525
2626 let PoolPutDisabled = 2
2727
2828 let PoolMatcherDisabled = 3
2929
3030 let PoolShutdown = 4
3131
3232 let idxPoolAddress = 1
3333
3434 let idxPoolStatus = 2
3535
3636 let idxPoolLPAssetId = 3
3737
3838 let idxAmtAssetId = 4
3939
4040 let idxPriceAssetId = 5
4141
4242 let idxAmtAssetDcm = 6
4343
4444 let idxPriceAssetDcm = 7
4545
4646 let idxIAmtAssetId = 8
4747
4848 let idxIPriceAssetId = 9
4949
5050 let idxLPAssetDcm = 10
5151
5252 let idxPoolAmtAssetAmt = 1
5353
5454 let idxPoolPriceAssetAmt = 2
5555
5656 let idxPoolLPAssetAmt = 3
5757
5858 let idxFactoryStakingContract = 1
5959
6060 let idxFactorySlippageContract = 7
6161
6262 func toX18 (origVal,origScaleMult) = fraction(toBigInt(origVal), scale18, toBigInt(origScaleMult))
6363
6464
6565 func toX18BigInt (origVal,origScaleMult) = fraction(origVal, scale18, origScaleMult)
6666
6767
6868 func fromX18 (val,resultScaleMult) = toInt(fraction(val, toBigInt(resultScaleMult), scale18))
6969
7070
7171 func fromX18Round (val,resultScaleMult,round) = toInt(fraction(val, toBigInt(resultScaleMult), scale18, round))
7272
7373
7474 func toScale (amt,resScale,curScale) = fraction(amt, resScale, curScale)
7575
7676
7777 func abs (val) = if ((0 > val))
7878 then -(val)
7979 else val
8080
8181
8282 func absBigInt (val) = if ((zeroBigInt > val))
8383 then -(val)
8484 else val
8585
8686
8787 func swapContract () = "%s__swapContract"
8888
8989
9090 func fc () = "%s__factoryContract"
9191
9292
9393 func keyManagerPublicKey () = "%s__managerPublicKey"
9494
9595
9696 func keyManagerVaultAddress () = "%s__managerVaultAddress"
9797
9898
9999 func pl () = "%s%s__price__last"
100100
101101
102102 func ph (h,timestamp) = makeString(["%s%s%d%d__price__history", toString(h), toString(timestamp)], SEP)
103103
104104
105105 func pau (userAddress,txId) = ((("%s%s%s__P__" + userAddress) + "__") + txId)
106106
107107
108108 func gau (userAddress,txId) = ((("%s%s%s__G__" + userAddress) + "__") + txId)
109109
110110
111111 func aa () = "%s__amountAsset"
112112
113113
114114 func pa () = "%s__priceAsset"
115115
116116
117117 let keyFee = "%s__fee"
118118
119119 let feeDefault = fraction(10, scale8, 10000)
120120
121121 let fee = valueOrElse(getInteger(this, keyFee), feeDefault)
122122
123123 let keyKLp = makeString(["%s", "kLp"], SEP)
124124
125125 let keyKLpRefreshedHeight = makeString(["%s", "kLpRefreshedHeight"], SEP)
126126
127127 let keyKLpRefreshDelay = makeString(["%s", "refreshKLpDelay"], SEP)
128128
129129 let kLpRefreshDelayDefault = 30
130130
131131 let kLpRefreshDelay = valueOrElse(getInteger(this, keyKLpRefreshDelay), kLpRefreshDelayDefault)
132132
133133 func keyAdditionalBalance (assetId) = makeString(["%s%s", "stakedBalance", assetId], SEP)
134134
135135
136136 func keyStakingAssetBalance (assetId) = makeString(["%s%s", "shareAssetBalance", assetId], SEP)
137137
138138
139139 func getAdditionalBalanceOrZero (assetId) = valueOrElse(getInteger(this, keyAdditionalBalance(assetId)), 0)
140140
141141
142142 func getStakingAssetBalanceOrZero (assetId) = valueOrElse(getInteger(this, keyStakingAssetBalance(assetId)), 0)
143143
144144
145145 func keyFactoryConfig () = "%s__factoryConfig"
146146
147147
148148 func keyMatcherPub () = "%s%s__matcher__publicKey"
149149
150150
151151 func keyMappingPoolContractAddressToPoolAssets (poolContractAddress) = (("%s%s%s__" + poolContractAddress) + "__mappings__poolContract2LpAsset")
152152
153153
154154 func keyPoolConfig (iAmtAsset,iPriceAsset) = (((("%d%d%s__" + iAmtAsset) + "__") + iPriceAsset) + "__config")
155155
156156
157157 func keyMappingsBaseAsset2internalId (baseAssetStr) = ("%s%s%s__mappings__baseAsset2internalId__" + baseAssetStr)
158158
159159
160160 func keyAllPoolsShutdown () = "%s__shutdown"
161161
162162
163163 func keyPoolWeight (contractAddress) = ("%s%s__poolWeight__" + contractAddress)
164164
165165
166166 func keyAllowedLpScriptHash () = "%s__allowedLpScriptHash"
167167
168168
169169 let keyFeeCollectorAddress = "%s__feeCollectorAddress"
170170
171171 func keySkipOrderValidation (poolAddress) = ("%s%s__skipOrderValidation__" + poolAddress)
172172
173173
174174 func throwOrderError (orderValid,orderValidInfo,senderValid,matcherValid) = throw((((((((("order validation failed: orderValid=" + toString(orderValid)) + " (") + orderValidInfo) + ")") + " senderValid=") + toString(senderValid)) + " matcherValid=") + toString(matcherValid)))
175175
176176
177177 func addressFromStringOrThis (addressString) = match addressFromString(addressString) {
178178 case a: Address =>
179179 a
180180 case _ =>
181181 this
182182 }
183183
184184
185185 func getManagerVaultAddressOrThis () = {
186186 let factoryAddress = match getString(fc()) {
187187 case fca: String =>
188188 addressFromStringOrThis(fca)
189189 case _ =>
190190 this
191191 }
192192 match getString(factoryAddress, keyManagerVaultAddress()) {
193193 case s: String =>
194194 addressFromStringOrThis(s)
195195 case _ =>
196196 this
197197 }
198198 }
199199
200200
201201 func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
202202
203203
204204 func getIntOrFail (address,key) = valueOrErrorMessage(getInteger(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
205205
206206
207207 func throwErr (msg) = throw(makeString(["lp.ride:", msg], " "))
208208
209209
210210 func fmtErr (msg) = makeString(["lp.ride:", msg], " ")
211211
212212
213213 let factoryContract = addressFromStringValue(getStringOrFail(this, fc()))
214214
215215 let feeCollectorAddress = addressFromStringValue(getStringOrFail(factoryContract, keyFeeCollectorAddress))
216216
217217 let inFee = {
218218 let @ = invoke(factoryContract, "getInFeeREADONLY", [toString(this)], nil)
219219 if ($isInstanceOf(@, "Int"))
220220 then @
221221 else throw(($getType(@) + " couldn't be cast to Int"))
222222 }
223223
224224 let outFee = {
225225 let @ = invoke(factoryContract, "getOutFeeREADONLY", [toString(this)], nil)
226226 if ($isInstanceOf(@, "Int"))
227227 then @
228228 else throw(($getType(@) + " couldn't be cast to Int"))
229229 }
230230
231231 func keyAddressWhitelisted (address) = makeString(["%s%s", "whitelisted", toString(address)], SEP)
232232
233233
234234 func isAddressWhitelisted (address) = valueOrElse(getBoolean(factoryContract, keyAddressWhitelisted(address)), false)
235235
236236
237237 func isGlobalShutdown () = valueOrElse(getBoolean(factoryContract, keyAllPoolsShutdown()), false)
238238
239239
240240 func getMatcherPubOrFail () = fromBase58String(getStringOrFail(factoryContract, keyMatcherPub()))
241241
242242
243243 func getPoolConfig () = {
244244 let amtAsset = getStringOrFail(this, aa())
245245 let priceAsset = getStringOrFail(this, pa())
246246 let iPriceAsset = getIntOrFail(factoryContract, keyMappingsBaseAsset2internalId(priceAsset))
247247 let iAmtAsset = getIntOrFail(factoryContract, keyMappingsBaseAsset2internalId(amtAsset))
248248 split(getStringOrFail(factoryContract, keyPoolConfig(toString(iAmtAsset), toString(iPriceAsset))), SEP)
249249 }
250250
251251
252252 func parseAssetId (input) = if ((input == wavesString))
253253 then unit
254254 else fromBase58String(input)
255255
256256
257257 func assetIdToString (input) = if ((input == unit))
258258 then wavesString
259259 else toBase58String(value(input))
260260
261261
262262 func parsePoolConfig (poolConfig) = $Tuple7(addressFromStringValue(poolConfig[idxPoolAddress]), parseIntValue(poolConfig[idxPoolStatus]), fromBase58String(poolConfig[idxPoolLPAssetId]), parseAssetId(poolConfig[idxAmtAssetId]), parseAssetId(poolConfig[idxPriceAssetId]), parseIntValue(poolConfig[idxAmtAssetDcm]), parseIntValue(poolConfig[idxPriceAssetDcm]))
263263
264264
265265 let poolConfigParsed = parsePoolConfig(getPoolConfig())
266266
267267 let $t097699935 = poolConfigParsed
268268
269269 let cfgPoolAddress = $t097699935._1
270270
271271 let cfgPoolStatus = $t097699935._2
272272
273273 let cfgLpAssetId = $t097699935._3
274274
275275 let cfgAmountAssetId = $t097699935._4
276276
277277 let cfgPriceAssetId = $t097699935._5
278278
279279 let cfgAmountAssetDecimals = $t097699935._6
280280
281281 let cfgPriceAssetDecimals = $t097699935._7
282282
283283 func getFactoryConfig () = split(getStringOrFail(factoryContract, keyFactoryConfig()), SEP)
284284
285285
286286 let stakingContract = valueOrErrorMessage(addressFromString(getFactoryConfig()[idxFactoryStakingContract]), "incorrect staking address")
287287
288288 let slippageContract = valueOrErrorMessage(addressFromString(getFactoryConfig()[idxFactorySlippageContract]), "incorrect staking address")
289289
290290 func dataPutActionInfo (inAmtAssetAmt,inPriceAssetAmt,outLpAmt,price,slippageTolerancePassedByUser,slippageToleranceReal,txHeight,txTimestamp,slipageAmtAssetAmt,slipagePriceAssetAmt) = makeString(["%d%d%d%d%d%d%d%d%d%d", toString(inAmtAssetAmt), toString(inPriceAssetAmt), toString(outLpAmt), toString(price), toString(slippageTolerancePassedByUser), toString(slippageToleranceReal), toString(txHeight), toString(txTimestamp), toString(slipageAmtAssetAmt), toString(slipagePriceAssetAmt)], SEP)
291291
292292
293293 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)
294294
295295
296296 func getAccBalance (assetId) = {
297297 let balanceOnPool = if ((assetId == "WAVES"))
298298 then wavesBalance(this).available
299299 else assetBalance(this, fromBase58String(assetId))
300300 let totalBalance = ((balanceOnPool + getAdditionalBalanceOrZero(assetId)) - getStakingAssetBalanceOrZero(assetId))
301301 max([0, totalBalance])
302302 }
303303
304304
305305 func calcPriceBigInt (prAmtX18,amAmtX18) = fraction(prAmtX18, scale18, amAmtX18)
306306
307307
308308 func calcPriceBigIntRound (prAmtX18,amAmtX18,round) = fraction(prAmtX18, scale18, amAmtX18, round)
309309
310310
311311 func getRate (proxy) = {
312312 let inv = invoke(proxy, "getRate", nil, nil)
313313 if ((inv == inv))
314314 then match inv {
315315 case r: Int =>
316316 r
317317 case _ =>
318318 throwErr("proxy.getRate() unexpected value")
319319 }
320320 else throw("Strict value is not equal to itself.")
321321 }
322322
323323
324324 func deposit (assetId,amount,stakingAssetId,proxy) = {
325325 let currentAdditionalBalance = getAdditionalBalanceOrZero(assetId)
326326 if ((currentAdditionalBalance == currentAdditionalBalance))
327327 then {
328328 let currentStakingAssetBalance = getStakingAssetBalanceOrZero(stakingAssetId)
329329 if ((currentStakingAssetBalance == currentStakingAssetBalance))
330330 then {
331331 let asset = parseAssetId(assetId)
332332 if ((amount > 0))
333333 then {
334334 let depositInvoke = invoke(proxy, "deposit", nil, [AttachedPayment(asset, amount)])
335335 if ((depositInvoke == depositInvoke))
336336 then match depositInvoke {
337337 case receivedStakingAsset: Int =>
338338 let newAdditionalBalance = (currentAdditionalBalance + amount)
339339 let newStakingAssetBalance = (currentStakingAssetBalance + receivedStakingAsset)
340340 [IntegerEntry(keyAdditionalBalance(assetId), newAdditionalBalance), IntegerEntry(keyStakingAssetBalance(stakingAssetId), newStakingAssetBalance)]
341341 case _ =>
342342 nil
343343 }
344344 else throw("Strict value is not equal to itself.")
345345 }
346346 else nil
347347 }
348348 else throw("Strict value is not equal to itself.")
349349 }
350350 else throw("Strict value is not equal to itself.")
351351 }
352352
353353
354354 func withdraw (assetId,amount,stakingAssetId,proxy,proxyRateMul,profitAddress) = {
355355 let currentAdditionalBalance = getAdditionalBalanceOrZero(assetId)
356356 if ((currentAdditionalBalance == currentAdditionalBalance))
357357 then {
358358 let currentStakingAssetBalance = getStakingAssetBalanceOrZero(stakingAssetId)
359359 if ((currentStakingAssetBalance == currentStakingAssetBalance))
360360 then {
361361 let currentProxyRate = getRate(proxy)
362362 if ((currentProxyRate == currentProxyRate))
363363 then {
364364 let oldRate = fraction(proxyRateMul, currentAdditionalBalance, currentStakingAssetBalance)
365365 let stakingAsset = parseAssetId(stakingAssetId)
366366 let oldSendStakingAmount = fraction(proxyRateMul, amount, oldRate)
367367 let sendStakingAssetAmount = fraction(proxyRateMul, amount, currentProxyRate)
368368 let profitAmount = max([0, (oldSendStakingAmount - sendStakingAssetAmount)])
369369 if ((sendStakingAssetAmount > 0))
370370 then {
371371 let withdrawInvoke = invoke(proxy, "withdraw", nil, [AttachedPayment(stakingAsset, sendStakingAssetAmount)])
372372 if ((withdrawInvoke == withdrawInvoke))
373373 then match withdrawInvoke {
374374 case receivedAssets: Int =>
375375 let newAdditionalBalance = (currentAdditionalBalance - receivedAssets)
376376 let newStakingAssetBalance = ((currentStakingAssetBalance - sendStakingAssetAmount) - profitAmount)
377377 [IntegerEntry(keyAdditionalBalance(assetId), newAdditionalBalance), IntegerEntry(keyStakingAssetBalance(stakingAssetId), newStakingAssetBalance), ScriptTransfer(profitAddress, profitAmount, parseAssetId(stakingAssetId))]
378378 case _ =>
379379 nil
380380 }
381381 else throw("Strict value is not equal to itself.")
382382 }
383383 else nil
384384 }
385385 else throw("Strict value is not equal to itself.")
386386 }
387387 else throw("Strict value is not equal to itself.")
388388 }
389389 else throw("Strict value is not equal to itself.")
390390 }
391391
392392
393393 func getLeaseProxyConfig (assetId) = match invoke(factoryContract, "getPoolLeaseConfigREADONLY", [toString(this), assetId], nil) {
394394 case a: (Boolean, Int, Int, String, String, Int, String) =>
395395 a
396396 case _ =>
397397 throwErr((("[" + assetId) + "] getLeaseProxyConfig() error"))
398398 }
399399
400400
401401 func rebalanceInternal (targetRatio,assetId,stakingAssetId,minBalance,proxy,proxyRateMul,profitAddress) = {
402402 let currentStakingAssetBalance = getStakingAssetBalanceOrZero(stakingAssetId)
403403 if ((currentStakingAssetBalance == currentStakingAssetBalance))
404404 then {
405405 let currentAdditionalBalance = if ((currentStakingAssetBalance != 0))
406406 then getAdditionalBalanceOrZero(assetId)
407407 else 0
408408 if ((currentAdditionalBalance == currentAdditionalBalance))
409409 then {
410410 let leasableTotalBalance = max([0, (getAccBalance(assetId) - minBalance)])
411411 let targetAdditionalBalance = fraction(targetRatio, leasableTotalBalance, 100)
412412 let diff = (currentAdditionalBalance - targetAdditionalBalance)
413413 if ((diff == 0))
414414 then nil
415415 else if ((0 > diff))
416416 then {
417417 let sendAssetAmount = -(diff)
418418 deposit(assetId, sendAssetAmount, stakingAssetId, proxy)
419419 }
420420 else {
421421 let getAssetAmount = diff
422422 withdraw(assetId, getAssetAmount, stakingAssetId, proxy, proxyRateMul, profitAddress)
423423 }
424424 }
425425 else throw("Strict value is not equal to itself.")
426426 }
427427 else throw("Strict value is not equal to itself.")
428428 }
429429
430430
431431 func rebalanceAsset (assetId) = {
432432 let $t01622016356 = getLeaseProxyConfig(assetId)
433433 let isLeasable = $t01622016356._1
434434 let leasedRatio = $t01622016356._2
435435 let minBalance = $t01622016356._3
436436 let proxyAddress = $t01622016356._4
437437 let proxyAssetId = $t01622016356._5
438438 let proxyRateMul = $t01622016356._6
439439 let stakingProfitAddress = $t01622016356._7
440440 if (isLeasable)
441441 then rebalanceInternal(leasedRatio, assetId, proxyAssetId, minBalance, addressFromStringValue(proxyAddress), proxyRateMul, addressFromStringValue(stakingProfitAddress))
442442 else nil
443443 }
444444
445445
446446 func withdrawAndRebalanceAsset (assetId,getAmount) = {
447447 let $t01675516891 = getLeaseProxyConfig(assetId)
448448 let isLeasable = $t01675516891._1
449449 let leasedRatio = $t01675516891._2
450450 let minBalance = $t01675516891._3
451451 let proxyAddress = $t01675516891._4
452452 let proxyAssetId = $t01675516891._5
453453 let proxyRateMul = $t01675516891._6
454454 let stakingProfitAddress = $t01675516891._7
455455 if (isLeasable)
456456 then {
457- let newTotalLeasableBalance = max([0, ((getAccBalance(assetId) - getAmount) - minBalance)])
458- if ((newTotalLeasableBalance == newTotalLeasableBalance))
457+ let currentStakingAssetBalance = getStakingAssetBalanceOrZero(proxyAssetId)
458+ if ((currentStakingAssetBalance == currentStakingAssetBalance))
459459 then {
460- let newAdditionalBalance = fraction(leasedRatio, newTotalLeasableBalance, 100)
461- if ((newAdditionalBalance == newAdditionalBalance))
460+ let currentAdditionalBalance = if ((currentStakingAssetBalance != 0))
461+ then getAdditionalBalanceOrZero(assetId)
462+ else 0
463+ if ((currentAdditionalBalance == currentAdditionalBalance))
462464 then {
463- let withdrawAmount = (getAdditionalBalanceOrZero(assetId) - newAdditionalBalance)
464- if ((withdrawAmount == withdrawAmount))
465- then if ((0 > withdrawAmount))
466- then deposit(assetId, -(withdrawAmount), proxyAssetId, addressFromStringValue(proxyAddress))
467- else withdraw(assetId, withdrawAmount, proxyAssetId, addressFromStringValue(proxyAddress), proxyRateMul, addressFromStringValue(stakingProfitAddress))
465+ let newTotalLeasableBalance = max([0, ((getAccBalance(assetId) - getAmount) - minBalance)])
466+ if ((newTotalLeasableBalance == newTotalLeasableBalance))
467+ then {
468+ let newAdditionalBalance = fraction(leasedRatio, newTotalLeasableBalance, 100)
469+ if ((newAdditionalBalance == newAdditionalBalance))
470+ then {
471+ let withdrawAmount = (currentAdditionalBalance - newAdditionalBalance)
472+ if ((withdrawAmount == withdrawAmount))
473+ then if ((0 > withdrawAmount))
474+ then deposit(assetId, -(withdrawAmount), proxyAssetId, addressFromStringValue(proxyAddress))
475+ else withdraw(assetId, withdrawAmount, proxyAssetId, addressFromStringValue(proxyAddress), proxyRateMul, addressFromStringValue(stakingProfitAddress))
476+ else throw("Strict value is not equal to itself.")
477+ }
478+ else throw("Strict value is not equal to itself.")
479+ }
468480 else throw("Strict value is not equal to itself.")
469481 }
470482 else throw("Strict value is not equal to itself.")
471483 }
472484 else throw("Strict value is not equal to itself.")
473485 }
474486 else nil
475487 }
476488
477489
478490 func withdrawAndRebalanceAll (amountAssetOutAmount,priceAssetOutAmount) = {
479491 let AmAmtWithdrawState = withdrawAndRebalanceAsset(getStringOrFail(this, aa()), amountAssetOutAmount)
480492 let PrAmtWithdrawState = withdrawAndRebalanceAsset(getStringOrFail(this, pa()), priceAssetOutAmount)
481493 (AmAmtWithdrawState ++ PrAmtWithdrawState)
482494 }
483495
484496
485497 func privateCalcPrice (amAssetDcm,prAssetDcm,amAmt,prAmt) = {
486498 let amtAssetAmtX18 = toX18(amAmt, amAssetDcm)
487499 let priceAssetAmtX18 = toX18(prAmt, prAssetDcm)
488500 calcPriceBigInt(priceAssetAmtX18, amtAssetAmtX18)
489501 }
490502
491503
492504 func calcPrices (amAmt,prAmt,lpAmt) = {
493505 let cfg = getPoolConfig()
494506 let amtAssetDcm = parseIntValue(cfg[idxAmtAssetDcm])
495507 let priceAssetDcm = parseIntValue(cfg[idxPriceAssetDcm])
496508 let priceX18 = privateCalcPrice(amtAssetDcm, priceAssetDcm, amAmt, prAmt)
497509 let amAmtX18 = toX18(amAmt, amtAssetDcm)
498510 let prAmtX18 = toX18(prAmt, priceAssetDcm)
499511 let lpAmtX18 = toX18(lpAmt, scale8)
500512 let lpPriceInAmAssetX18 = calcPriceBigInt(amAmtX18, lpAmtX18)
501513 let lpPriceInPrAssetX18 = calcPriceBigInt(prAmtX18, lpAmtX18)
502514 [priceX18, lpPriceInAmAssetX18, lpPriceInPrAssetX18]
503515 }
504516
505517
506518 func calculatePrices (amAmt,prAmt,lpAmt) = {
507519 let prices = calcPrices(amAmt, prAmt, lpAmt)
508520 [fromX18(prices[0], scale8), fromX18(prices[1], scale8), fromX18(prices[2], scale8)]
509521 }
510522
511523
512524 func estimateGetOperation (txId58,pmtAssetId,pmtLpAmt,userAddress) = {
513525 let cfg = getPoolConfig()
514526 let lpAssetId = cfg[idxPoolLPAssetId]
515527 let amAssetId = cfg[idxAmtAssetId]
516528 let prAssetId = cfg[idxPriceAssetId]
517529 let amAssetDcm = parseIntValue(cfg[idxAmtAssetDcm])
518530 let prAssetDcm = parseIntValue(cfg[idxPriceAssetDcm])
519531 let poolStatus = cfg[idxPoolStatus]
520532 let lpEmission = valueOrErrorMessage(assetInfo(fromBase58String(lpAssetId)), (("Asset " + lpAssetId) + " doesn't exist")).quantity
521533 if ((lpAssetId != pmtAssetId))
522534 then throw("Invalid asset passed.")
523535 else {
524536 let amBalance = getAccBalance(amAssetId)
525537 let amBalanceX18 = toX18(amBalance, amAssetDcm)
526538 let prBalance = getAccBalance(prAssetId)
527539 let prBalanceX18 = toX18(prBalance, prAssetDcm)
528540 let curPriceX18 = calcPriceBigInt(prBalanceX18, amBalanceX18)
529541 let curPrice = fromX18(curPriceX18, scale8)
530542 let pmtLpAmtX18 = toX18(pmtLpAmt, scale8)
531543 let lpEmissionX18 = toX18(lpEmission, scale8)
532544 let outAmAmtX18 = fraction(amBalanceX18, pmtLpAmtX18, lpEmissionX18)
533545 let outPrAmtX18 = fraction(prBalanceX18, pmtLpAmtX18, lpEmissionX18)
534546 let outAmAmt = fromX18Round(outAmAmtX18, amAssetDcm, FLOOR)
535547 let outPrAmt = fromX18Round(outPrAmtX18, prAssetDcm, FLOOR)
536548 let state = if ((txId58 == ""))
537549 then nil
538550 else [ScriptTransfer(userAddress, outAmAmt, if ((amAssetId == "WAVES"))
539551 then unit
540552 else fromBase58String(amAssetId)), ScriptTransfer(userAddress, outPrAmt, if ((prAssetId == "WAVES"))
541553 then unit
542554 else fromBase58String(prAssetId)), StringEntry(gau(toString(userAddress), txId58), dataGetActionInfo(outAmAmt, outPrAmt, pmtLpAmt, curPrice, height, lastBlock.timestamp)), IntegerEntry(pl(), curPrice), IntegerEntry(ph(height, lastBlock.timestamp), curPrice)]
543555 $Tuple10(outAmAmt, outPrAmt, amAssetId, prAssetId, amBalance, prBalance, lpEmission, curPriceX18, poolStatus, state)
544556 }
545557 }
546558
547559
548560 func estimatePutOperation (txId58,slippageTolerance,inAmAssetAmt,inAmAssetId,inPrAssetAmt,inPrAssetId,userAddress,isEvaluate,emitLp) = {
549561 let cfg = getPoolConfig()
550562 let lpAssetId = fromBase58String(cfg[idxPoolLPAssetId])
551563 let amAssetIdStr = cfg[idxAmtAssetId]
552564 let prAssetIdStr = cfg[idxPriceAssetId]
553565 let iAmtAssetId = cfg[idxIAmtAssetId]
554566 let iPriceAssetId = cfg[idxIPriceAssetId]
555567 let amtAssetDcm = parseIntValue(cfg[idxAmtAssetDcm])
556568 let priceAssetDcm = parseIntValue(cfg[idxPriceAssetDcm])
557569 let poolStatus = cfg[idxPoolStatus]
558570 let lpEmission = valueOrErrorMessage(assetInfo(lpAssetId), (("Asset " + toBase58String(lpAssetId)) + " doesn't exist")).quantity
559571 let inAmAssetIdStr = toBase58String(valueOrElse(inAmAssetId, fromBase58String("WAVES")))
560572 let inPrAssetIdStr = toBase58String(valueOrElse(inPrAssetId, fromBase58String("WAVES")))
561573 if (if ((amAssetIdStr != inAmAssetIdStr))
562574 then true
563575 else (prAssetIdStr != inPrAssetIdStr))
564576 then throw("Invalid amt or price asset passed.")
565577 else {
566578 let amBalance = if (isEvaluate)
567579 then getAccBalance(amAssetIdStr)
568580 else (getAccBalance(amAssetIdStr) - inAmAssetAmt)
569581 let prBalance = if (isEvaluate)
570582 then getAccBalance(prAssetIdStr)
571583 else (getAccBalance(prAssetIdStr) - inPrAssetAmt)
572584 let inAmAssetAmtX18 = toX18(inAmAssetAmt, amtAssetDcm)
573585 let inPrAssetAmtX18 = toX18(inPrAssetAmt, priceAssetDcm)
574586 let userPriceX18 = calcPriceBigInt(inPrAssetAmtX18, inAmAssetAmtX18)
575587 let amBalanceX18 = toX18(amBalance, amtAssetDcm)
576588 let prBalanceX18 = toX18(prBalance, priceAssetDcm)
577589 let res = if ((lpEmission == 0))
578590 then {
579591 let curPriceX18 = zeroBigInt
580592 let slippageX18 = zeroBigInt
581593 let lpAmtX18 = pow((inAmAssetAmtX18 * inPrAssetAmtX18), 0, toBigInt(5), 1, 0, DOWN)
582594 $Tuple5(fromX18(lpAmtX18, scale8), fromX18(inAmAssetAmtX18, amtAssetDcm), fromX18(inPrAssetAmtX18, priceAssetDcm), calcPriceBigInt((prBalanceX18 + inPrAssetAmtX18), (amBalanceX18 + inAmAssetAmtX18)), slippageX18)
583595 }
584596 else {
585597 let curPriceX18 = calcPriceBigInt(prBalanceX18, amBalanceX18)
586598 let slippageX18 = fraction(absBigInt((curPriceX18 - userPriceX18)), scale18, curPriceX18)
587599 let slippageToleranceX18 = toX18(slippageTolerance, scale8)
588600 if (if ((curPriceX18 != zeroBigInt))
589601 then (slippageX18 > slippageToleranceX18)
590602 else false)
591603 then throw(((("Price slippage " + toString(slippageX18)) + " exceeded the passed limit of ") + toString(slippageToleranceX18)))
592604 else {
593605 let lpEmissionX18 = toX18(lpEmission, scale8)
594606 let prViaAmX18 = fraction(inAmAssetAmtX18, calcPriceBigIntRound(prBalanceX18, amBalanceX18, CEILING), scale18, CEILING)
595607 let amViaPrX18 = fraction(inPrAssetAmtX18, scale18, calcPriceBigIntRound(prBalanceX18, amBalanceX18, FLOOR), CEILING)
596608 let expectedAmts = if ((prViaAmX18 > inPrAssetAmtX18))
597609 then $Tuple2(amViaPrX18, inPrAssetAmtX18)
598610 else $Tuple2(inAmAssetAmtX18, prViaAmX18)
599611 let expAmtAssetAmtX18 = expectedAmts._1
600612 let expPriceAssetAmtX18 = expectedAmts._2
601613 let lpAmtX18 = fraction(lpEmissionX18, expPriceAssetAmtX18, prBalanceX18, FLOOR)
602614 $Tuple5(fromX18Round(lpAmtX18, scale8, FLOOR), fromX18Round(expAmtAssetAmtX18, amtAssetDcm, CEILING), fromX18Round(expPriceAssetAmtX18, priceAssetDcm, CEILING), curPriceX18, slippageX18)
603615 }
604616 }
605617 let calcLpAmt = res._1
606618 let calcAmAssetPmt = res._2
607619 let calcPrAssetPmt = res._3
608620 let curPrice = fromX18(res._4, scale8)
609621 let slippageCalc = fromX18(res._5, scale8)
610622 if ((0 >= calcLpAmt))
611623 then throw("Invalid calculations. LP calculated is less than zero.")
612624 else {
613625 let emitLpAmt = if (!(emitLp))
614626 then 0
615627 else calcLpAmt
616628 let amDiff = (inAmAssetAmt - calcAmAssetPmt)
617629 let prDiff = (inPrAssetAmt - calcPrAssetPmt)
618630 let commonState = [IntegerEntry(pl(), curPrice), IntegerEntry(ph(height, lastBlock.timestamp), curPrice), StringEntry(pau(userAddress, txId58), dataPutActionInfo(calcAmAssetPmt, calcPrAssetPmt, emitLpAmt, curPrice, slippageTolerance, slippageCalc, height, lastBlock.timestamp, amDiff, prDiff))]
619631 $Tuple13(calcLpAmt, emitLpAmt, curPrice, amBalance, prBalance, lpEmission, lpAssetId, poolStatus, commonState, amDiff, prDiff, inAmAssetId, inPrAssetId)
620632 }
621633 }
622634 }
623635
624636
625637 func calcKLp (amountBalance,priceBalance,lpEmission) = {
626638 let amountBalanceX18 = toX18BigInt(amountBalance, toBigInt(cfgAmountAssetDecimals))
627639 let priceBalanceX18 = toX18BigInt(priceBalance, toBigInt(cfgPriceAssetDecimals))
628640 let updatedKLp = fraction(pow((amountBalanceX18 * priceBalanceX18), 0, toBigInt(5), 1, 18, DOWN), big1, lpEmission)
629641 if ((lpEmission == big0))
630642 then big0
631643 else updatedKLp
632644 }
633645
634646
635647 func calcCurrentKLp (amountAssetDelta,priceAssetDelta,lpAssetEmissionDelta) = {
636648 let amountAssetBalance = (toBigInt(getAccBalance(assetIdToString(cfgAmountAssetId))) - amountAssetDelta)
637649 let priceAssetBalance = (toBigInt(getAccBalance(assetIdToString(cfgPriceAssetId))) - priceAssetDelta)
638650 let lpAssetEmission = (toBigInt(value(assetInfo(cfgLpAssetId)).quantity) - lpAssetEmissionDelta)
639651 let currentKLp = calcKLp(amountAssetBalance, priceAssetBalance, lpAssetEmission)
640652 currentKLp
641653 }
642654
643655
644656 func refreshKLpInternal (amountAssetBalanceDelta,priceAssetBalanceDelta,lpAssetEmissionDelta) = {
645657 let amountAssetBalance = (getAccBalance(assetIdToString(cfgAmountAssetId)) + amountAssetBalanceDelta)
646658 let priceAssetBalance = (getAccBalance(assetIdToString(cfgPriceAssetId)) + priceAssetBalanceDelta)
647659 let lpAssetEmission = (value(assetInfo(cfgLpAssetId)).quantity + lpAssetEmissionDelta)
648660 let updatedKLp = calcKLp(toBigInt(amountAssetBalance), toBigInt(priceAssetBalance), toBigInt(lpAssetEmission))
649661 let actions = [IntegerEntry(keyKLpRefreshedHeight, height), StringEntry(keyKLp, toString(updatedKLp))]
650662 $Tuple2(actions, updatedKLp)
651663 }
652664
653665
654666 func skipOrderValidation () = valueOrElse(getBoolean(factoryContract, keySkipOrderValidation(toString(this))), false)
655667
656668
657669 func validateUpdatedKLp (oldKLp,updatedKLp) = if ((updatedKLp >= oldKLp))
658670 then true
659671 else throwErr(makeString(["updated KLp lower than current KLp", toString(oldKLp), toString(updatedKLp)], " "))
660672
661673
662674 func validateMatcherOrderAllowed (order) = {
663675 let amountAssetBalance = getAccBalance(assetIdToString(cfgAmountAssetId))
664676 let priceAssetBalance = getAccBalance(assetIdToString(cfgPriceAssetId))
665677 let amountAssetAmount = order.amount
666678 let priceAssetAmount = fraction(order.amount, order.price, scale8, FLOOR)
667- let $t02928029492 = if ((order.orderType == Buy))
679+ let $t02947529687 = if ((order.orderType == Buy))
668680 then $Tuple2(amountAssetAmount, -(priceAssetAmount))
669681 else $Tuple2(-(amountAssetAmount), priceAssetAmount)
670- let amountAssetBalanceDelta = $t02928029492._1
671- let priceAssetBalanceDelta = $t02928029492._2
682+ let amountAssetBalanceDelta = $t02947529687._1
683+ let priceAssetBalanceDelta = $t02947529687._2
672684 if (if (if (isGlobalShutdown())
673685 then true
674686 else (cfgPoolStatus == PoolMatcherDisabled))
675687 then true
676688 else (cfgPoolStatus == PoolShutdown))
677689 then throw("Exchange operations disabled")
678690 else if (if ((order.assetPair.amountAsset != cfgAmountAssetId))
679691 then true
680692 else (order.assetPair.priceAsset != cfgPriceAssetId))
681693 then throw("Wrong order assets.")
682694 else {
683695 let kLp = valueOrErrorMessage(parseBigInt(valueOrElse(getString(this, keyKLp), "0")), fmtErr("invalid kLp"))
684- let $t02993230032 = refreshKLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
685- let unusedActions = $t02993230032._1
686- let kLpNew = $t02993230032._2
696+ let $t03012730227 = refreshKLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
697+ let unusedActions = $t03012730227._1
698+ let kLpNew = $t03012730227._2
687699 let isOrderValid = (kLpNew >= kLp)
688700 let info = makeString(["kLp=", toString(kLp), " kLpNew=", toString(kLpNew), " amountAssetBalance=", toString(amountAssetBalance), " priceAssetBalance=", toString(priceAssetBalance), " amountAssetBalanceDelta=", toString(amountAssetBalanceDelta), " priceAssetBalanceDelta=", toString(priceAssetBalanceDelta), " height=", toString(height)], "")
689701 $Tuple2(isOrderValid, info)
690702 }
691703 }
692704
693705
694706 func commonGet (i) = if ((size(i.payments) != 1))
695707 then throw("exactly 1 payment is expected")
696708 else {
697709 let pmt = value(i.payments[0])
698710 let pmtAssetId = value(pmt.assetId)
699711 let pmtAmt = pmt.amount
700712 let res = estimateGetOperation(toBase58String(i.transactionId), toBase58String(pmtAssetId), pmtAmt, i.caller)
701713 let outAmAmt = res._1
702714 let outPrAmt = res._2
703715 let state = res._10
704716 let isGetDisabled = if (!(isAddressWhitelisted(i.caller)))
705717 then if (isGlobalShutdown())
706718 then true
707719 else (cfgPoolStatus == PoolShutdown)
708720 else false
709721 if (isGetDisabled)
710722 then throw(("Get operation is blocked by admin. Status = " + toString(cfgPoolStatus)))
711723 else $Tuple5(outAmAmt, outPrAmt, pmtAmt, pmtAssetId, state)
712724 }
713725
714726
715727 func commonPut (i,slippageTolerance,emitLp) = if ((size(i.payments) != 2))
716728 then throw("exactly 2 payments are expected")
717729 else {
718730 let amAssetPmt = value(i.payments[0])
719731 let prAssetPmt = value(i.payments[1])
720732 let estPut = estimatePutOperation(toBase58String(i.transactionId), slippageTolerance, amAssetPmt.amount, amAssetPmt.assetId, prAssetPmt.amount, prAssetPmt.assetId, toString(i.caller), false, emitLp)
721733 let isPutDisabled = if (!(isAddressWhitelisted(i.caller)))
722734 then if (if (isGlobalShutdown())
723735 then true
724736 else (cfgPoolStatus == PoolPutDisabled))
725737 then true
726738 else (cfgPoolStatus == PoolShutdown)
727739 else false
728740 if (isPutDisabled)
729741 then throw(("Put operation is blocked by admin. Status = " + toString(cfgPoolStatus)))
730742 else estPut
731743 }
732744
733745
734746 func emit (amount) = {
735747 let emitInv = invoke(factoryContract, "emit", [amount], nil)
736748 if ((emitInv == emitInv))
737749 then {
738750 let emitInvLegacy = match emitInv {
739751 case legacyFactoryContract: Address =>
740752 invoke(legacyFactoryContract, "emit", [amount], nil)
741753 case _ =>
742754 unit
743755 }
744756 if ((emitInvLegacy == emitInvLegacy))
745757 then amount
746758 else throw("Strict value is not equal to itself.")
747759 }
748760 else throw("Strict value is not equal to itself.")
749761 }
750762
751763
752764 func takeFee (amount,fee) = {
753765 let feeAmount = if ((fee == 0))
754766 then 0
755767 else fraction(amount, fee, scale8)
756768 $Tuple2((amount - feeAmount), feeAmount)
757769 }
758770
759771
760772 func calcPutOneToken (paymentAmountRaw,paymentAssetId,userAddress,txId) = {
761773 let isEval = (txId == unit)
762774 let amountBalanceRaw = getAccBalance(assetIdToString(cfgAmountAssetId))
763775 let priceBalanceRaw = getAccBalance(assetIdToString(cfgPriceAssetId))
764776 let paymentInAmountAsset = if ((paymentAssetId == cfgAmountAssetId))
765777 then true
766778 else if ((paymentAssetId == cfgPriceAssetId))
767779 then false
768780 else throwErr("invalid asset")
769- let $t03321833511 = if (isEval)
781+ let $t03341333706 = if (isEval)
770782 then $Tuple2(amountBalanceRaw, priceBalanceRaw)
771783 else if (paymentInAmountAsset)
772784 then $Tuple2((amountBalanceRaw - paymentAmountRaw), priceBalanceRaw)
773785 else $Tuple2(amountBalanceRaw, (priceBalanceRaw - paymentAmountRaw))
774- let amountBalanceOld = $t03321833511._1
775- let priceBalanceOld = $t03321833511._2
776- let $t03351533664 = if (paymentInAmountAsset)
786+ let amountBalanceOld = $t03341333706._1
787+ let priceBalanceOld = $t03341333706._2
788+ let $t03371033859 = if (paymentInAmountAsset)
777789 then $Tuple2(paymentAmountRaw, 0)
778790 else $Tuple2(0, paymentAmountRaw)
779- let amountAssetAmountRaw = $t03351533664._1
780- let priceAssetAmountRaw = $t03351533664._2
791+ let amountAssetAmountRaw = $t03371033859._1
792+ let priceAssetAmountRaw = $t03371033859._2
781793 let amountAssetAmount = takeFee(amountAssetAmountRaw, inFee)._1
782794 let priceAssetAmount = takeFee(priceAssetAmountRaw, inFee)._1
783- let $t03379633860 = takeFee(paymentAmountRaw, inFee)
784- let paymentAmount = $t03379633860._1
785- let feeAmount = $t03379633860._2
795+ let $t03399134055 = takeFee(paymentAmountRaw, inFee)
796+ let paymentAmount = $t03399134055._1
797+ let feeAmount = $t03399134055._2
786798 let amountBalanceNew = (amountBalanceOld + amountAssetAmount)
787799 let priceBalanceNew = (priceBalanceOld + priceAssetAmount)
788800 let priceNewX18 = calcPriceBigInt(toX18(priceBalanceNew, cfgPriceAssetDecimals), toX18(amountBalanceNew, cfgAmountAssetDecimals))
789801 let priceNew = fromX18(priceNewX18, scale8)
790802 let paymentBalance = if (paymentInAmountAsset)
791803 then amountBalanceOld
792804 else priceBalanceOld
793805 let paymentBalanceBigInt = toBigInt(paymentBalance)
794806 let supplyBigInt = toBigInt(valueOrErrorMessage(assetInfo(cfgLpAssetId), (("asset " + toBase58String(cfgLpAssetId)) + " doesn't exist")).quantity)
795807 let chechSupply = if ((supplyBigInt > big0))
796808 then true
797809 else throwErr("initial deposit requires all coins")
798810 if ((chechSupply == chechSupply))
799811 then {
800812 let depositBigInt = toBigInt(paymentAmount)
801813 let issueAmount = max([0, toInt(((supplyBigInt * (sqrtBigInt((scale18 + ((depositBigInt * scale18) / paymentBalanceBigInt)), 18, 18, DOWN) - scale18)) / scale18))])
802814 let commonState = if (isEval)
803815 then nil
804816 else [IntegerEntry(pl(), priceNew), IntegerEntry(ph(height, lastBlock.timestamp), priceNew), StringEntry(pau(toString(value(userAddress)), toBase58String(value(txId))), dataPutActionInfo(amountAssetAmountRaw, priceAssetAmountRaw, issueAmount, priceNew, 0, 0, height, lastBlock.timestamp, 0, 0))]
805817 let priceOldX18 = calcPriceBigInt(toX18(priceBalanceOld, cfgPriceAssetDecimals), toX18(amountBalanceOld, cfgAmountAssetDecimals))
806818 let priceOld = fromX18(priceOldX18, scale8)
807819 let loss = {
808- let $t03554135708 = if (paymentInAmountAsset)
820+ let $t03573635903 = if (paymentInAmountAsset)
809821 then $Tuple2(amountAssetAmountRaw, amountBalanceOld)
810822 else $Tuple2(priceAssetAmountRaw, priceBalanceOld)
811- let amount = $t03554135708._1
812- let balance = $t03554135708._2
823+ let amount = $t03573635903._1
824+ let balance = $t03573635903._2
813825 let issueAmountBoth = toInt(fraction(supplyBigInt, toBigInt((amount / 2)), toBigInt(balance)))
814826 fraction((issueAmount - issueAmountBoth), scale8, issueAmountBoth)
815827 }
816828 $Tuple5(issueAmount, commonState, feeAmount, loss, paymentInAmountAsset)
817829 }
818830 else throw("Strict value is not equal to itself.")
819831 }
820832
821833
822834 func calcGetOneToken (outAssetId,paymentAmount,paymentAssetId,userAddress,txId) = {
823835 let isEval = (txId == unit)
824836 let cfg = getPoolConfig()
825837 let amtAssetDcm = parseIntValue(cfg[idxAmtAssetDcm])
826838 let priceAssetDcm = parseIntValue(cfg[idxPriceAssetDcm])
827839 let checks = [if ((paymentAssetId == cfgLpAssetId))
828840 then true
829841 else throwErr("invalid lp asset")]
830842 if ((checks == checks))
831843 then {
832844 let outInAmountAsset = if ((outAssetId == cfgAmountAssetId))
833845 then true
834846 else if ((outAssetId == cfgPriceAssetId))
835847 then false
836848 else throwErr("invalid asset")
837849 let balanceBigInt = if (outInAmountAsset)
838850 then toBigInt(getAccBalance(assetIdToString(cfgAmountAssetId)))
839851 else toBigInt(getAccBalance(assetIdToString(cfgPriceAssetId)))
840852 let outInAmountAssetDecimals = if (outInAmountAsset)
841853 then amtAssetDcm
842854 else priceAssetDcm
843855 let amBalanceOld = getAccBalance(assetIdToString(cfgAmountAssetId))
844856 let prBalanceOld = getAccBalance(assetIdToString(cfgPriceAssetId))
845857 let outBalance = if (outInAmountAsset)
846858 then amBalanceOld
847859 else prBalanceOld
848860 let outBalanceBigInt = toBigInt(outBalance)
849861 let supplyBigInt = toBigInt(valueOrErrorMessage(assetInfo(cfgLpAssetId), (("asset " + toBase58String(cfgLpAssetId)) + " doesn't exist")).quantity)
850862 let redeemedBigInt = toBigInt(paymentAmount)
851863 let amountRaw = max([0, toInt(((balanceBigInt * (scale18 - pow((scale18 - ((redeemedBigInt * scale18) / supplyBigInt)), 18, big2, 0, 18, DOWN))) / scale18))])
852- let $t03778637842 = takeFee(amountRaw, outFee)
853- let totalAmount = $t03778637842._1
854- let feeAmount = $t03778637842._2
855- let $t03784638072 = if (outInAmountAsset)
864+ let $t03798138037 = takeFee(amountRaw, outFee)
865+ let totalAmount = $t03798138037._1
866+ let feeAmount = $t03798138037._2
867+ let $t03804138267 = if (outInAmountAsset)
856868 then $Tuple4(totalAmount, 0, (amBalanceOld - amountRaw), prBalanceOld)
857869 else $Tuple4(0, totalAmount, amBalanceOld, (prBalanceOld - amountRaw))
858- let outAmAmount = $t03784638072._1
859- let outPrAmount = $t03784638072._2
860- let amBalanceNew = $t03784638072._3
861- let prBalanceNew = $t03784638072._4
870+ let outAmAmount = $t03804138267._1
871+ let outPrAmount = $t03804138267._2
872+ let amBalanceNew = $t03804138267._3
873+ let prBalanceNew = $t03804138267._4
862874 let priceNewX18 = calcPriceBigInt(toX18(prBalanceNew, cfgPriceAssetDecimals), toX18(amBalanceNew, cfgAmountAssetDecimals))
863875 let priceNew = fromX18(priceNewX18, scale8)
864876 let commonState = if (isEval)
865877 then nil
866878 else [StringEntry(gau(toString(value(userAddress)), toBase58String(value(txId))), dataGetActionInfo(outAmAmount, outPrAmount, paymentAmount, priceNew, height, lastBlock.timestamp)), IntegerEntry(pl(), priceNew), IntegerEntry(ph(height, lastBlock.timestamp), priceNew)]
867879 let priceOldX18 = calcPriceBigInt(toX18(prBalanceOld, cfgPriceAssetDecimals), toX18(amBalanceOld, cfgAmountAssetDecimals))
868880 let priceOld = fromX18(priceOldX18, scale8)
869881 let loss = {
870882 let amountBothInPaymentAsset = (toInt(fraction(balanceBigInt, redeemedBigInt, supplyBigInt)) * 2)
871883 fraction((totalAmount - amountBothInPaymentAsset), scale8, amountBothInPaymentAsset)
872884 }
873885 $Tuple5(totalAmount, commonState, feeAmount, loss, outInAmountAsset)
874886 }
875887 else throw("Strict value is not equal to itself.")
876888 }
877889
878890
879891 func managerPublicKeyOrUnit () = {
880892 let managerVaultAddress = getManagerVaultAddressOrThis()
881893 match getString(managerVaultAddress, keyManagerPublicKey()) {
882894 case s: String =>
883895 fromBase58String(s)
884896 case _: Unit =>
885897 unit
886898 case _ =>
887899 throw("Match error")
888900 }
889901 }
890902
891903
892904 func isManager (i) = match managerPublicKeyOrUnit() {
893905 case pk: ByteVector =>
894906 (i.callerPublicKey == pk)
895907 case _: Unit =>
896908 (i.caller == this)
897909 case _ =>
898910 throw("Match error")
899911 }
900912
901913
902914 func mustManager (i) = {
903915 let pd = throw("Permission denied")
904916 match managerPublicKeyOrUnit() {
905917 case pk: ByteVector =>
906918 if ((i.callerPublicKey == pk))
907919 then true
908920 else pd
909921 case _: Unit =>
910922 if ((i.caller == this))
911923 then true
912924 else pd
913925 case _ =>
914926 throw("Match error")
915927 }
916928 }
917929
918930
919931 @Callable(i)
920932 func rebalance () = (rebalanceAsset(getStringOrFail(this, aa())) ++ rebalanceAsset(getStringOrFail(this, pa())))
921933
922934
923935
924936 @Callable(i)
925937 func calculateAmountOutForSwapREADONLY (cleanAmountIn,isReverse,feePoolAmount) = {
926- let $t03993040235 = if ((isReverse == false))
938+ let $t04012540430 = if ((isReverse == false))
927939 then {
928940 let assetOut = getStringOrFail(this, pa())
929941 let assetIn = getStringOrFail(this, aa())
930942 $Tuple2(assetOut, assetIn)
931943 }
932944 else {
933945 let assetOut = getStringOrFail(this, aa())
934946 let assetIn = getStringOrFail(this, pa())
935947 $Tuple2(assetOut, assetIn)
936948 }
937- let assetOut = $t03993040235._1
938- let assetIn = $t03993040235._2
949+ let assetOut = $t04012540430._1
950+ let assetIn = $t04012540430._2
939951 let poolAssetInBalance = getAccBalance(assetIn)
940952 let poolAssetOutBalance = getAccBalance(assetOut)
941953 let amountOut = fraction(poolAssetOutBalance, cleanAmountIn, (poolAssetInBalance + cleanAmountIn))
942954 let oldK = (toBigInt(poolAssetInBalance) * toBigInt(poolAssetOutBalance))
943955 let newK = (((toBigInt(getAccBalance(assetIn)) + toBigInt(cleanAmountIn)) + toBigInt(feePoolAmount)) * (toBigInt(getAccBalance(assetOut)) - toBigInt(amountOut)))
944956 let checkK = if ((newK >= oldK))
945957 then true
946958 else throw("new K is fewer error")
947959 if ((checkK == checkK))
948960 then $Tuple2(nil, amountOut)
949961 else throw("Strict value is not equal to itself.")
950962 }
951963
952964
953965
954966 @Callable(i)
955967 func calculateAmountOutForSwapAndSendTokens (cleanAmountIn,isReverse,amountOutMin,addressTo,feePoolAmount) = {
956968 let swapContact = {
957969 let @ = invoke(factoryContract, "getSwapContractREADONLY", nil, nil)
958970 if ($isInstanceOf(@, "String"))
959971 then @
960972 else throw(($getType(@) + " couldn't be cast to String"))
961973 }
962974 let isPoolSwapDisabled = {
963975 let @ = invoke(factoryContract, "isPoolSwapDisabledREADONLY", [toString(this)], nil)
964976 if ($isInstanceOf(@, "Boolean"))
965977 then @
966978 else throw(($getType(@) + " couldn't be cast to Boolean"))
967979 }
968980 let isSwapDisabled = if (!(isAddressWhitelisted(i.caller)))
969981 then if (if (isGlobalShutdown())
970982 then true
971983 else (cfgPoolStatus == PoolShutdown))
972984 then true
973985 else isPoolSwapDisabled
974986 else false
975987 let checks = [if (if (!(isSwapDisabled))
976988 then true
977989 else isManager(i))
978990 then true
979991 else throwErr("swap operation is blocked by admin"), if ((value(i.payments[0]).amount >= cleanAmountIn))
980992 then true
981993 else throwErr("Wrong amount"), if ((i.caller == addressFromStringValue(swapContact)))
982994 then true
983995 else throwErr("Permission denied")]
984996 if ((checks == checks))
985997 then {
986998 let pmt = value(i.payments[0])
987999 let assetIn = assetIdToString(pmt.assetId)
9881000 let assetOut = if ((isReverse == false))
9891001 then getStringOrFail(this, pa())
9901002 else getStringOrFail(this, aa())
9911003 let poolAssetInBalance = ((getAccBalance(assetIn) - value(i.payments[0]).amount) - feePoolAmount)
9921004 let poolAssetOutBalance = getAccBalance(assetOut)
9931005 let amountOut = fraction(poolAssetOutBalance, cleanAmountIn, (poolAssetInBalance + cleanAmountIn))
9941006 let oldK = (toBigInt(poolAssetInBalance) * toBigInt(poolAssetOutBalance))
9951007 let newK = ((toBigInt(getAccBalance(assetIn)) + toBigInt(feePoolAmount)) * (toBigInt(getAccBalance(assetOut)) - toBigInt(amountOut)))
9961008 let checkK = if ((newK >= oldK))
9971009 then true
9981010 else throw("new K is fewer error")
9991011 if ((checkK == checkK))
10001012 then {
10011013 let checkMin = if ((amountOut >= amountOutMin))
10021014 then true
10031015 else throw("Exchange result is fewer coins than expected")
10041016 if ((checkMin == checkMin))
10051017 then {
10061018 let amountAssetBalanceDelta = if (isReverse)
10071019 then -(amountOut)
10081020 else feePoolAmount
10091021 let priceAssetBalanceDelta = if (isReverse)
10101022 then feePoolAmount
10111023 else -(amountOut)
10121024 let refreshKLpActions = refreshKLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)._1
10131025 if ((refreshKLpActions == refreshKLpActions))
10141026 then {
10151027 let rebalanceState = rebalanceAsset(assetIn)
10161028 if ((rebalanceState == rebalanceState))
10171029 then {
10181030 let withdrawState = withdrawAndRebalanceAsset(assetOut, amountOut)
10191031 if ((withdrawState == withdrawState))
10201032 then $Tuple2(((withdrawState ++ rebalanceState) ++ [ScriptTransfer(addressFromStringValue(addressTo), amountOut, parseAssetId(assetOut))]), amountOut)
10211033 else throw("Strict value is not equal to itself.")
10221034 }
10231035 else throw("Strict value is not equal to itself.")
10241036 }
10251037 else throw("Strict value is not equal to itself.")
10261038 }
10271039 else throw("Strict value is not equal to itself.")
10281040 }
10291041 else throw("Strict value is not equal to itself.")
10301042 }
10311043 else throw("Strict value is not equal to itself.")
10321044 }
10331045
10341046
10351047
10361048 @Callable(i)
10371049 func put (slippageTolerance,shouldAutoStake) = if ((0 > slippageTolerance))
10381050 then throw("Invalid slippageTolerance passed")
10391051 else {
10401052 let estPut = commonPut(i, slippageTolerance, true)
10411053 let emitLpAmt = estPut._2
10421054 let lpAssetId = estPut._7
10431055 let state = estPut._9
10441056 let amDiff = estPut._10
10451057 let prDiff = estPut._11
10461058 let amId = estPut._12
10471059 let prId = estPut._13
10481060 let amAssetPmt = toBigInt(value(i.payments[0]).amount)
10491061 let prAssetPmt = toBigInt(value(i.payments[1]).amount)
10501062 let currentKLp = calcCurrentKLp(amAssetPmt, prAssetPmt, toBigInt(0))
10511063 if ((currentKLp == currentKLp))
10521064 then {
10531065 let emitInv = invoke(factoryContract, "emit", [emitLpAmt], nil)
10541066 if ((emitInv == emitInv))
10551067 then {
10561068 let emitInvLegacy = match emitInv {
10571069 case legacyFactoryContract: Address =>
10581070 invoke(legacyFactoryContract, "emit", [emitLpAmt], nil)
10591071 case _ =>
10601072 unit
10611073 }
10621074 if ((emitInvLegacy == emitInvLegacy))
10631075 then {
10641076 let slippageAInv = if ((amDiff > 0))
10651077 then invoke(slippageContract, "put", nil, [AttachedPayment(amId, amDiff)])
10661078 else nil
10671079 if ((slippageAInv == slippageAInv))
10681080 then {
10691081 let slippagePInv = if ((prDiff > 0))
10701082 then invoke(slippageContract, "put", nil, [AttachedPayment(prId, prDiff)])
10711083 else nil
10721084 if ((slippagePInv == slippagePInv))
10731085 then {
10741086 let lpTransfer = if (shouldAutoStake)
10751087 then {
10761088 let slpStakeInv = invoke(stakingContract, "stake", nil, [AttachedPayment(lpAssetId, emitLpAmt)])
10771089 if ((slpStakeInv == slpStakeInv))
10781090 then nil
10791091 else throw("Strict value is not equal to itself.")
10801092 }
10811093 else [ScriptTransfer(i.caller, emitLpAmt, lpAssetId)]
1082- let $t04541145873 = refreshKLpInternal(0, 0, 0)
1083- if (($t04541145873 == $t04541145873))
1094+ let $t04560646068 = refreshKLpInternal(0, 0, 0)
1095+ if (($t04560646068 == $t04560646068))
10841096 then {
1085- let updatedKLp = $t04541145873._2
1086- let refreshKLpActions = $t04541145873._1
1097+ let updatedKLp = $t04560646068._2
1098+ let refreshKLpActions = $t04560646068._1
10871099 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
10881100 if ((isUpdatedKLpValid == isUpdatedKLpValid))
10891101 then {
10901102 let reb = invoke(this, "rebalance", nil, nil)
10911103 if ((reb == reb))
10921104 then ((state ++ lpTransfer) ++ refreshKLpActions)
10931105 else throw("Strict value is not equal to itself.")
10941106 }
10951107 else throw("Strict value is not equal to itself.")
10961108 }
10971109 else throw("Strict value is not equal to itself.")
10981110 }
10991111 else throw("Strict value is not equal to itself.")
11001112 }
11011113 else throw("Strict value is not equal to itself.")
11021114 }
11031115 else throw("Strict value is not equal to itself.")
11041116 }
11051117 else throw("Strict value is not equal to itself.")
11061118 }
11071119 else throw("Strict value is not equal to itself.")
11081120 }
11091121
11101122
11111123
11121124 @Callable(i)
11131125 func putForFree (maxSlippage) = if ((0 > maxSlippage))
11141126 then throw("Invalid value passed")
11151127 else {
11161128 let estPut = commonPut(i, maxSlippage, false)
11171129 let state = estPut._9
11181130 let amAssetPmt = toBigInt(value(i.payments[0]).amount)
11191131 let prAssetPmt = toBigInt(value(i.payments[1]).amount)
11201132 let currentKLp = calcCurrentKLp(amAssetPmt, prAssetPmt, toBigInt(0))
11211133 if ((currentKLp == currentKLp))
11221134 then {
1123- let $t04648546550 = refreshKLpInternal(0, 0, 0)
1124- let refreshKLpActions = $t04648546550._1
1125- let updatedKLp = $t04648546550._2
1135+ let $t04668046745 = refreshKLpInternal(0, 0, 0)
1136+ let refreshKLpActions = $t04668046745._1
1137+ let updatedKLp = $t04668046745._2
11261138 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
11271139 if ((isUpdatedKLpValid == isUpdatedKLpValid))
11281140 then (state ++ refreshKLpActions)
11291141 else throw("Strict value is not equal to itself.")
11301142 }
11311143 else throw("Strict value is not equal to itself.")
11321144 }
11331145
11341146
11351147
11361148 @Callable(i)
11371149 func putOneTkn (minOutAmount,autoStake) = {
11381150 let isPoolOneTokenOperationsDisabled = {
11391151 let @ = invoke(factoryContract, "isPoolOneTokenOperationsDisabledREADONLY", [toString(this)], nil)
11401152 if ($isInstanceOf(@, "Boolean"))
11411153 then @
11421154 else throw(($getType(@) + " couldn't be cast to Boolean"))
11431155 }
11441156 let isPutDisabled = if (!(isAddressWhitelisted(i.caller)))
11451157 then if (if (if (isGlobalShutdown())
11461158 then true
11471159 else (cfgPoolStatus == PoolPutDisabled))
11481160 then true
11491161 else (cfgPoolStatus == PoolShutdown))
11501162 then true
11511163 else isPoolOneTokenOperationsDisabled
11521164 else false
11531165 let checks = [if (if (!(isPutDisabled))
11541166 then true
11551167 else isManager(i))
11561168 then true
11571169 else throwErr("put operation is blocked by admin"), if ((size(i.payments) == 1))
11581170 then true
11591171 else throwErr("exactly 1 payment are expected")]
11601172 if ((checks == checks))
11611173 then {
11621174 let payment = i.payments[0]
11631175 let paymentAssetId = payment.assetId
11641176 let paymentAmountRaw = payment.amount
11651177 let currentKLp = if ((paymentAssetId == cfgAmountAssetId))
11661178 then calcCurrentKLp(toBigInt(paymentAmountRaw), toBigInt(0), toBigInt(0))
11671179 else if ((paymentAssetId == cfgPriceAssetId))
11681180 then calcCurrentKLp(toBigInt(0), toBigInt(paymentAmountRaw), toBigInt(0))
11691181 else throwErr("payment asset is not supported")
11701182 if ((currentKLp == currentKLp))
11711183 then {
11721184 let userAddress = i.caller
11731185 let txId = i.transactionId
1174- let $t04777947931 = calcPutOneToken(paymentAmountRaw, paymentAssetId, userAddress, txId)
1175- if (($t04777947931 == $t04777947931))
1186+ let $t04797448126 = calcPutOneToken(paymentAmountRaw, paymentAssetId, userAddress, txId)
1187+ if (($t04797448126 == $t04797448126))
11761188 then {
1177- let paymentInAmountAsset = $t04777947931._5
1178- let bonus = $t04777947931._4
1179- let feeAmount = $t04777947931._3
1180- let commonState = $t04777947931._2
1181- let emitAmountEstimated = $t04777947931._1
1189+ let paymentInAmountAsset = $t04797448126._5
1190+ let bonus = $t04797448126._4
1191+ let feeAmount = $t04797448126._3
1192+ let commonState = $t04797448126._2
1193+ let emitAmountEstimated = $t04797448126._1
11821194 let emitAmount = if (if ((minOutAmount > 0))
11831195 then (minOutAmount > emitAmountEstimated)
11841196 else false)
11851197 then throwErr(makeString(["amount to receive is less than ", toString(minOutAmount)], ""))
11861198 else emitAmountEstimated
11871199 let emitInv = emit(emitAmount)
11881200 if ((emitInv == emitInv))
11891201 then {
11901202 let lpTransfer = if (autoStake)
11911203 then {
11921204 let stakeInv = invoke(stakingContract, "stake", nil, [AttachedPayment(cfgLpAssetId, emitAmount)])
11931205 if ((stakeInv == stakeInv))
11941206 then nil
11951207 else throw("Strict value is not equal to itself.")
11961208 }
11971209 else [ScriptTransfer(i.caller, emitAmount, cfgLpAssetId)]
11981210 let sendFee = if ((feeAmount > 0))
11991211 then [ScriptTransfer(feeCollectorAddress, feeAmount, paymentAssetId)]
12001212 else nil
1201- let $t04851748714 = if ((this == feeCollectorAddress))
1213+ let $t04871248909 = if ((this == feeCollectorAddress))
12021214 then $Tuple2(0, 0)
12031215 else if (paymentInAmountAsset)
12041216 then $Tuple2(-(feeAmount), 0)
12051217 else $Tuple2(0, -(feeAmount))
1206- let amountAssetBalanceDelta = $t04851748714._1
1207- let priceAssetBalanceDelta = $t04851748714._2
1208- let $t04871748825 = refreshKLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
1209- let refreshKLpActions = $t04871748825._1
1210- let updatedKLp = $t04871748825._2
1218+ let amountAssetBalanceDelta = $t04871248909._1
1219+ let priceAssetBalanceDelta = $t04871248909._2
1220+ let $t04891249020 = refreshKLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
1221+ let refreshKLpActions = $t04891249020._1
1222+ let updatedKLp = $t04891249020._2
12111223 let kLp = value(getString(keyKLp))
12121224 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
12131225 if ((isUpdatedKLpValid == isUpdatedKLpValid))
12141226 then {
12151227 let reb = invoke(this, "rebalance", nil, nil)
12161228 if ((reb == reb))
12171229 then $Tuple2((((commonState ++ lpTransfer) ++ sendFee) ++ refreshKLpActions), emitAmount)
12181230 else throw("Strict value is not equal to itself.")
12191231 }
12201232 else throw("Strict value is not equal to itself.")
12211233 }
12221234 else throw("Strict value is not equal to itself.")
12231235 }
12241236 else throw("Strict value is not equal to itself.")
12251237 }
12261238 else throw("Strict value is not equal to itself.")
12271239 }
12281240 else throw("Strict value is not equal to itself.")
12291241 }
12301242
12311243
12321244
12331245 @Callable(i)
12341246 func putOneTknREADONLY (paymentAssetId,paymentAmountRaw) = {
1235- let $t04918049337 = calcPutOneToken(paymentAmountRaw, parseAssetId(paymentAssetId), unit, unit)
1236- let emitAmountEstimated = $t04918049337._1
1237- let commonState = $t04918049337._2
1238- let feeAmount = $t04918049337._3
1239- let bonus = $t04918049337._4
1240- let paymentInAmountAsset = $t04918049337._5
1247+ let $t04937549532 = calcPutOneToken(paymentAmountRaw, parseAssetId(paymentAssetId), unit, unit)
1248+ let emitAmountEstimated = $t04937549532._1
1249+ let commonState = $t04937549532._2
1250+ let feeAmount = $t04937549532._3
1251+ let bonus = $t04937549532._4
1252+ let paymentInAmountAsset = $t04937549532._5
12411253 $Tuple2(nil, $Tuple3(emitAmountEstimated, feeAmount, bonus))
12421254 }
12431255
12441256
12451257
12461258 @Callable(i)
12471259 func getOneTkn (outAssetIdStr,minOutAmount) = {
12481260 let isPoolOneTokenOperationsDisabled = {
12491261 let @ = invoke(factoryContract, "isPoolOneTokenOperationsDisabledREADONLY", [toString(this)], nil)
12501262 if ($isInstanceOf(@, "Boolean"))
12511263 then @
12521264 else throw(($getType(@) + " couldn't be cast to Boolean"))
12531265 }
12541266 let isGetDisabled = if (!(isAddressWhitelisted(i.caller)))
12551267 then if (if (isGlobalShutdown())
12561268 then true
12571269 else (cfgPoolStatus == PoolShutdown))
12581270 then true
12591271 else isPoolOneTokenOperationsDisabled
12601272 else false
12611273 let checks = [if (if (!(isGetDisabled))
12621274 then true
12631275 else isManager(i))
12641276 then true
12651277 else throwErr("get operation is blocked by admin"), if ((size(i.payments) == 1))
12661278 then true
12671279 else throwErr("exactly 1 payment are expected")]
12681280 if ((checks == checks))
12691281 then {
12701282 let outAssetId = parseAssetId(outAssetIdStr)
12711283 let payment = i.payments[0]
12721284 let paymentAssetId = payment.assetId
12731285 let paymentAmount = payment.amount
12741286 let currentKLp = calcCurrentKLp(toBigInt(0), toBigInt(0), toBigInt(0))
12751287 if ((currentKLp == currentKLp))
12761288 then {
12771289 let userAddress = i.caller
12781290 let txId = i.transactionId
1279- let $t05025950412 = calcGetOneToken(outAssetId, paymentAmount, paymentAssetId, userAddress, txId)
1280- if (($t05025950412 == $t05025950412))
1291+ let $t05045450607 = calcGetOneToken(outAssetId, paymentAmount, paymentAssetId, userAddress, txId)
1292+ if (($t05045450607 == $t05045450607))
12811293 then {
1282- let outInAmountAsset = $t05025950412._5
1283- let bonus = $t05025950412._4
1284- let feeAmount = $t05025950412._3
1285- let commonState = $t05025950412._2
1286- let amountEstimated = $t05025950412._1
1294+ let outInAmountAsset = $t05045450607._5
1295+ let bonus = $t05045450607._4
1296+ let feeAmount = $t05045450607._3
1297+ let commonState = $t05045450607._2
1298+ let amountEstimated = $t05045450607._1
12871299 let amount = if (if ((minOutAmount > 0))
12881300 then (minOutAmount > amountEstimated)
12891301 else false)
12901302 then throwErr(makeString(["amount to receive is less than ", toString(minOutAmount)], ""))
12911303 else amountEstimated
12921304 let burnInv = invoke(factoryContract, "burn", [paymentAmount], [AttachedPayment(paymentAssetId, paymentAmount)])
12931305 if ((burnInv == burnInv))
12941306 then {
12951307 let withdrawState = withdrawAndRebalanceAsset(outAssetIdStr, (amount + max([0, feeAmount])))
12961308 let assetTransfer = [ScriptTransfer(userAddress, amount, outAssetId)]
12971309 let sendFee = if ((feeAmount > 0))
12981310 then [ScriptTransfer(feeCollectorAddress, feeAmount, outAssetId)]
12991311 else nil
1300- let $t05107651323 = {
1312+ let $t05127151518 = {
13011313 let feeAmountForCalc = if ((this == feeCollectorAddress))
13021314 then 0
13031315 else feeAmount
13041316 if (outInAmountAsset)
13051317 then $Tuple2(-((amount + feeAmountForCalc)), 0)
13061318 else $Tuple2(0, -((amount + feeAmountForCalc)))
13071319 }
1308- let amountAssetBalanceDelta = $t05107651323._1
1309- let priceAssetBalanceDelta = $t05107651323._2
1310- let $t05132651434 = refreshKLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
1311- let refreshKLpActions = $t05132651434._1
1312- let updatedKLp = $t05132651434._2
1320+ let amountAssetBalanceDelta = $t05127151518._1
1321+ let priceAssetBalanceDelta = $t05127151518._2
1322+ let $t05152151629 = refreshKLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
1323+ let refreshKLpActions = $t05152151629._1
1324+ let updatedKLp = $t05152151629._2
13131325 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
13141326 if ((isUpdatedKLpValid == isUpdatedKLpValid))
13151327 then $Tuple2(((((commonState ++ withdrawState) ++ assetTransfer) ++ sendFee) ++ refreshKLpActions), amount)
13161328 else throw("Strict value is not equal to itself.")
13171329 }
13181330 else throw("Strict value is not equal to itself.")
13191331 }
13201332 else throw("Strict value is not equal to itself.")
13211333 }
13221334 else throw("Strict value is not equal to itself.")
13231335 }
13241336 else throw("Strict value is not equal to itself.")
13251337 }
13261338
13271339
13281340
13291341 @Callable(i)
13301342 func getOneTknREADONLY (outAssetId,paymentAmount) = {
1331- let $t05171251868 = calcGetOneToken(parseAssetId(outAssetId), paymentAmount, cfgLpAssetId, unit, unit)
1332- let amountEstimated = $t05171251868._1
1333- let commonState = $t05171251868._2
1334- let feeAmount = $t05171251868._3
1335- let bonus = $t05171251868._4
1336- let outInAmountAsset = $t05171251868._5
1343+ let $t05190752063 = calcGetOneToken(parseAssetId(outAssetId), paymentAmount, cfgLpAssetId, unit, unit)
1344+ let amountEstimated = $t05190752063._1
1345+ let commonState = $t05190752063._2
1346+ let feeAmount = $t05190752063._3
1347+ let bonus = $t05190752063._4
1348+ let outInAmountAsset = $t05190752063._5
13371349 $Tuple2(nil, $Tuple3(amountEstimated, feeAmount, bonus))
13381350 }
13391351
13401352
13411353
13421354 @Callable(i)
13431355 func unstakeAndGetOneTkn (unstakeAmount,outAssetIdStr,minOutAmount) = {
13441356 let isPoolOneTokenOperationsDisabled = {
13451357 let @ = invoke(factoryContract, "isPoolOneTokenOperationsDisabledREADONLY", [toString(this)], nil)
13461358 if ($isInstanceOf(@, "Boolean"))
13471359 then @
13481360 else throw(($getType(@) + " couldn't be cast to Boolean"))
13491361 }
13501362 let isGetDisabled = if (!(isAddressWhitelisted(i.caller)))
13511363 then if (if (isGlobalShutdown())
13521364 then true
13531365 else (cfgPoolStatus == PoolShutdown))
13541366 then true
13551367 else isPoolOneTokenOperationsDisabled
13561368 else false
13571369 let checks = [if (if (!(isGetDisabled))
13581370 then true
13591371 else isManager(i))
13601372 then true
13611373 else throwErr("get operation is blocked by admin"), if ((size(i.payments) == 0))
13621374 then true
13631375 else throwErr("no payments are expected")]
13641376 if ((checks == checks))
13651377 then {
13661378 let outAssetId = parseAssetId(outAssetIdStr)
13671379 let userAddress = i.caller
13681380 let txId = i.transactionId
13691381 let currentKLp = calcCurrentKLp(toBigInt(0), toBigInt(0), toBigInt(0))
13701382 if ((currentKLp == currentKLp))
13711383 then {
13721384 let unstakeInv = invoke(stakingContract, "unstake", [toBase58String(cfgLpAssetId), unstakeAmount], nil)
13731385 if ((unstakeInv == unstakeInv))
13741386 then {
1375- let $t05281052961 = calcGetOneToken(outAssetId, unstakeAmount, cfgLpAssetId, userAddress, txId)
1376- if (($t05281052961 == $t05281052961))
1387+ let $t05300553156 = calcGetOneToken(outAssetId, unstakeAmount, cfgLpAssetId, userAddress, txId)
1388+ if (($t05300553156 == $t05300553156))
13771389 then {
1378- let outInAmountAsset = $t05281052961._5
1379- let bonus = $t05281052961._4
1380- let feeAmount = $t05281052961._3
1381- let commonState = $t05281052961._2
1382- let amountEstimated = $t05281052961._1
1390+ let outInAmountAsset = $t05300553156._5
1391+ let bonus = $t05300553156._4
1392+ let feeAmount = $t05300553156._3
1393+ let commonState = $t05300553156._2
1394+ let amountEstimated = $t05300553156._1
13831395 let amount = if (if ((minOutAmount > 0))
13841396 then (minOutAmount > amountEstimated)
13851397 else false)
13861398 then throwErr(makeString(["amount to receive is less than ", toString(minOutAmount)], ""))
13871399 else amountEstimated
13881400 let burnInv = invoke(factoryContract, "burn", [unstakeAmount], [AttachedPayment(cfgLpAssetId, unstakeAmount)])
13891401 if ((burnInv == burnInv))
13901402 then {
13911403 let withdrawState = withdrawAndRebalanceAsset(outAssetIdStr, (amount + max([0, feeAmount])))
13921404 let assetTransfer = [ScriptTransfer(i.caller, amount, outAssetId)]
13931405 let sendFee = if ((feeAmount > 0))
13941406 then [ScriptTransfer(feeCollectorAddress, feeAmount, outAssetId)]
13951407 else nil
1396- let $t05362053867 = {
1408+ let $t05381554062 = {
13971409 let feeAmountForCalc = if ((this == feeCollectorAddress))
13981410 then 0
13991411 else feeAmount
14001412 if (outInAmountAsset)
14011413 then $Tuple2(-((amount + feeAmountForCalc)), 0)
14021414 else $Tuple2(0, -((amount + feeAmountForCalc)))
14031415 }
1404- let amountAssetBalanceDelta = $t05362053867._1
1405- let priceAssetBalanceDelta = $t05362053867._2
1406- let $t05387053978 = refreshKLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
1407- let refreshKLpActions = $t05387053978._1
1408- let updatedKLp = $t05387053978._2
1416+ let amountAssetBalanceDelta = $t05381554062._1
1417+ let priceAssetBalanceDelta = $t05381554062._2
1418+ let $t05406554173 = refreshKLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
1419+ let refreshKLpActions = $t05406554173._1
1420+ let updatedKLp = $t05406554173._2
14091421 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
14101422 if ((isUpdatedKLpValid == isUpdatedKLpValid))
14111423 then $Tuple2(((((commonState ++ withdrawState) ++ assetTransfer) ++ sendFee) ++ refreshKLpActions), amount)
14121424 else throw("Strict value is not equal to itself.")
14131425 }
14141426 else throw("Strict value is not equal to itself.")
14151427 }
14161428 else throw("Strict value is not equal to itself.")
14171429 }
14181430 else throw("Strict value is not equal to itself.")
14191431 }
14201432 else throw("Strict value is not equal to itself.")
14211433 }
14221434 else throw("Strict value is not equal to itself.")
14231435 }
14241436
14251437
14261438
14271439 @Callable(i)
14281440 func get () = {
14291441 let res = commonGet(i)
14301442 let outAmAmt = res._1
14311443 let outPrAmt = res._2
14321444 let pmtAmt = res._3
14331445 let pmtAssetId = res._4
14341446 let state = res._5
14351447 let withdrawState = withdrawAndRebalanceAll(outAmAmt, outPrAmt)
14361448 let currentKLp = calcCurrentKLp(toBigInt(0), toBigInt(0), toBigInt(0))
14371449 if ((currentKLp == currentKLp))
14381450 then {
14391451 let burnLPAssetOnFactory = invoke(factoryContract, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
14401452 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
14411453 then {
1442- let $t05507355154 = refreshKLpInternal(-(outAmAmt), -(outPrAmt), 0)
1443- let refreshKLpActions = $t05507355154._1
1444- let updatedKLp = $t05507355154._2
1454+ let $t05526855349 = refreshKLpInternal(-(outAmAmt), -(outPrAmt), 0)
1455+ let refreshKLpActions = $t05526855349._1
1456+ let updatedKLp = $t05526855349._2
14451457 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
14461458 if ((isUpdatedKLpValid == isUpdatedKLpValid))
14471459 then ((withdrawState ++ state) ++ refreshKLpActions)
14481460 else throw("Strict value is not equal to itself.")
14491461 }
14501462 else throw("Strict value is not equal to itself.")
14511463 }
14521464 else throw("Strict value is not equal to itself.")
14531465 }
14541466
14551467
14561468
14571469 @Callable(i)
14581470 func getNoLess (noLessThenAmtAsset,noLessThenPriceAsset) = {
14591471 let res = commonGet(i)
14601472 let outAmAmt = res._1
14611473 let outPrAmt = res._2
14621474 let pmtAmt = res._3
14631475 let pmtAssetId = res._4
14641476 let state = res._5
14651477 if ((noLessThenAmtAsset > outAmAmt))
14661478 then throw(((("noLessThenAmtAsset failed: " + toString(outAmAmt)) + " < ") + toString(noLessThenAmtAsset)))
14671479 else if ((noLessThenPriceAsset > outPrAmt))
14681480 then throw(((("noLessThenPriceAsset failed: " + toString(outPrAmt)) + " < ") + toString(noLessThenPriceAsset)))
14691481 else {
14701482 let withdrawState = withdrawAndRebalanceAll(outAmAmt, outPrAmt)
14711483 let currentKLp = calcCurrentKLp(toBigInt(0), toBigInt(0), toBigInt(0))
14721484 if ((currentKLp == currentKLp))
14731485 then {
14741486 let burnLPAssetOnFactory = invoke(factoryContract, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
14751487 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
14761488 then {
1477- let $t05624956330 = refreshKLpInternal(-(outAmAmt), -(outPrAmt), 0)
1478- let refreshKLpActions = $t05624956330._1
1479- let updatedKLp = $t05624956330._2
1489+ let $t05644456525 = refreshKLpInternal(-(outAmAmt), -(outPrAmt), 0)
1490+ let refreshKLpActions = $t05644456525._1
1491+ let updatedKLp = $t05644456525._2
14801492 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
14811493 if ((isUpdatedKLpValid == isUpdatedKLpValid))
14821494 then ((withdrawState ++ state) ++ refreshKLpActions)
14831495 else throw("Strict value is not equal to itself.")
14841496 }
14851497 else throw("Strict value is not equal to itself.")
14861498 }
14871499 else throw("Strict value is not equal to itself.")
14881500 }
14891501 }
14901502
14911503
14921504
14931505 @Callable(i)
14941506 func unstakeAndGet (amount) = {
14951507 let checkPayments = if ((size(i.payments) != 0))
14961508 then throw("No payments are expected")
14971509 else true
14981510 if ((checkPayments == checkPayments))
14991511 then {
15001512 let cfg = getPoolConfig()
15011513 let lpAssetId = fromBase58String(cfg[idxPoolLPAssetId])
15021514 let currentKLp = calcCurrentKLp(toBigInt(0), toBigInt(0), toBigInt(0))
15031515 if ((currentKLp == currentKLp))
15041516 then {
15051517 let unstakeInv = invoke(stakingContract, "unstake", [toBase58String(lpAssetId), amount], nil)
15061518 if ((unstakeInv == unstakeInv))
15071519 then {
15081520 let res = estimateGetOperation(toBase58String(i.transactionId), toBase58String(lpAssetId), amount, i.caller)
15091521 let outAmAmt = res._1
15101522 let outPrAmt = res._2
15111523 let poolStatus = parseIntValue(res._9)
15121524 let state = res._10
15131525 let withdrawState = withdrawAndRebalanceAll(outAmAmt, outPrAmt)
15141526 let isGetDisabled = if (!(isAddressWhitelisted(i.caller)))
15151527 then if (isGlobalShutdown())
15161528 then true
15171529 else (cfgPoolStatus == PoolShutdown)
15181530 else false
15191531 let checkPoolStatus = if (isGetDisabled)
15201532 then throw(("Get operation is blocked by admin. Status = " + toString(poolStatus)))
15211533 else true
15221534 if ((checkPoolStatus == checkPoolStatus))
15231535 then {
15241536 let burnLPAssetOnFactory = invoke(factoryContract, "burn", [amount], [AttachedPayment(lpAssetId, amount)])
15251537 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
15261538 then {
1527- let $t05767857759 = refreshKLpInternal(-(outAmAmt), -(outPrAmt), 0)
1528- let refreshKLpActions = $t05767857759._1
1529- let updatedKLp = $t05767857759._2
1539+ let $t05787357954 = refreshKLpInternal(-(outAmAmt), -(outPrAmt), 0)
1540+ let refreshKLpActions = $t05787357954._1
1541+ let updatedKLp = $t05787357954._2
15301542 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
15311543 if ((isUpdatedKLpValid == isUpdatedKLpValid))
15321544 then ((withdrawState ++ state) ++ refreshKLpActions)
15331545 else throw("Strict value is not equal to itself.")
15341546 }
15351547 else throw("Strict value is not equal to itself.")
15361548 }
15371549 else throw("Strict value is not equal to itself.")
15381550 }
15391551 else throw("Strict value is not equal to itself.")
15401552 }
15411553 else throw("Strict value is not equal to itself.")
15421554 }
15431555 else throw("Strict value is not equal to itself.")
15441556 }
15451557
15461558
15471559
15481560 @Callable(i)
15491561 func unstakeAndGetNoLess (unstakeAmount,noLessThenAmountAsset,noLessThenPriceAsset) = {
15501562 let isGetDisabled = if (!(isAddressWhitelisted(i.caller)))
15511563 then if (isGlobalShutdown())
15521564 then true
15531565 else (cfgPoolStatus == PoolShutdown)
15541566 else false
15551567 let checks = [if (!(isGetDisabled))
15561568 then true
15571569 else throw("get operation is blocked by admin"), if ((size(i.payments) == 0))
15581570 then true
15591571 else throw("no payments are expected")]
15601572 if ((checks == checks))
15611573 then {
15621574 let currentKLp = calcCurrentKLp(toBigInt(0), toBigInt(0), toBigInt(0))
15631575 if ((currentKLp == currentKLp))
15641576 then {
15651577 let unstakeInv = invoke(stakingContract, "unstake", [toBase58String(cfgLpAssetId), unstakeAmount], nil)
15661578 if ((unstakeInv == unstakeInv))
15671579 then {
15681580 let res = estimateGetOperation(toBase58String(i.transactionId), toBase58String(cfgLpAssetId), unstakeAmount, i.caller)
15691581 let outAmAmt = res._1
15701582 let outPrAmt = res._2
15711583 let state = res._10
15721584 let withdrawState = withdrawAndRebalanceAll(outAmAmt, outPrAmt)
15731585 let checkAmounts = [if ((outAmAmt >= noLessThenAmountAsset))
15741586 then true
15751587 else throw(makeString(["amount asset amount to receive is less than ", toString(noLessThenAmountAsset)], "")), if ((outPrAmt >= noLessThenPriceAsset))
15761588 then true
15771589 else throw(makeString(["price asset amount to receive is less than ", toString(noLessThenPriceAsset)], ""))]
15781590 if ((checkAmounts == checkAmounts))
15791591 then {
15801592 let burnLPAssetOnFactory = invoke(factoryContract, "burn", [unstakeAmount], [AttachedPayment(cfgLpAssetId, unstakeAmount)])
15811593 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
15821594 then {
1583- let $t05923759318 = refreshKLpInternal(-(outAmAmt), -(outPrAmt), 0)
1584- let refreshKLpActions = $t05923759318._1
1585- let updatedKLp = $t05923759318._2
1595+ let $t05943259513 = refreshKLpInternal(-(outAmAmt), -(outPrAmt), 0)
1596+ let refreshKLpActions = $t05943259513._1
1597+ let updatedKLp = $t05943259513._2
15861598 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
15871599 if ((isUpdatedKLpValid == isUpdatedKLpValid))
15881600 then ((withdrawState ++ state) ++ refreshKLpActions)
15891601 else throw("Strict value is not equal to itself.")
15901602 }
15911603 else throw("Strict value is not equal to itself.")
15921604 }
15931605 else throw("Strict value is not equal to itself.")
15941606 }
15951607 else throw("Strict value is not equal to itself.")
15961608 }
15971609 else throw("Strict value is not equal to itself.")
15981610 }
15991611 else throw("Strict value is not equal to itself.")
16001612 }
16011613
16021614
16031615
16041616 @Callable(i)
16051617 func activate (amtAssetStr,priceAssetStr) = if ((toString(i.caller) != toString(factoryContract)))
16061618 then throw("permissions denied")
16071619 else $Tuple2([StringEntry(aa(), amtAssetStr), StringEntry(pa(), priceAssetStr)], "success")
16081620
16091621
16101622
16111623 @Callable(i)
16121624 func refreshKLp () = {
16131625 let lastRefreshedBlockHeight = valueOrElse(getInteger(keyKLpRefreshedHeight), 0)
16141626 let checkLastRefreshedBlockHeight = if (((height - lastRefreshedBlockHeight) >= kLpRefreshDelay))
16151627 then unit
16161628 else throwErr(makeString([toString(kLpRefreshDelay), " blocks have not passed since the previous call"], ""))
16171629 if ((checkLastRefreshedBlockHeight == checkLastRefreshedBlockHeight))
16181630 then {
16191631 let kLp = valueOrErrorMessage(parseBigInt(valueOrElse(getString(this, keyKLp), "0")), fmtErr("invalid kLp"))
1620- let $t06052260586 = refreshKLpInternal(0, 0, 0)
1621- let kLpUpdateActions = $t06052260586._1
1622- let updatedKLp = $t06052260586._2
1632+ let $t06071760781 = refreshKLpInternal(0, 0, 0)
1633+ let kLpUpdateActions = $t06071760781._1
1634+ let updatedKLp = $t06071760781._2
16231635 let actions = if ((kLp != updatedKLp))
16241636 then kLpUpdateActions
16251637 else throwErr("nothing to refresh")
16261638 $Tuple2(actions, toString(updatedKLp))
16271639 }
16281640 else throw("Strict value is not equal to itself.")
16291641 }
16301642
16311643
16321644
16331645 @Callable(i)
16341646 func getPoolConfigWrapperREADONLY () = $Tuple2(nil, getPoolConfig())
16351647
16361648
16371649
16381650 @Callable(i)
16391651 func getAccBalanceWrapperREADONLY (assetId) = $Tuple2(nil, getAccBalance(assetId))
16401652
16411653
16421654
16431655 @Callable(i)
16441656 func calcPricesWrapperREADONLY (amAmt,prAmt,lpAmt) = {
16451657 let prices = calcPrices(amAmt, prAmt, lpAmt)
16461658 $Tuple2(nil, [toString(prices[0]), toString(prices[1]), toString(prices[2])])
16471659 }
16481660
16491661
16501662
16511663 @Callable(i)
16521664 func toX18WrapperREADONLY (origVal,origScaleMult) = $Tuple2(nil, toString(toX18(origVal, origScaleMult)))
16531665
16541666
16551667
16561668 @Callable(i)
16571669 func fromX18WrapperREADONLY (val,resultScaleMult) = $Tuple2(nil, fromX18(parseBigIntValue(val), resultScaleMult))
16581670
16591671
16601672
16611673 @Callable(i)
16621674 func calcPriceBigIntWrapperREADONLY (prAmtX18,amAmtX18) = $Tuple2(nil, toString(calcPriceBigInt(parseBigIntValue(prAmtX18), parseBigIntValue(amAmtX18))))
16631675
16641676
16651677
16661678 @Callable(i)
16671679 func estimatePutOperationWrapperREADONLY (txId58,slippageTolerance,inAmAssetAmt,inAmAssetId,inPrAssetAmt,inPrAssetId,userAddress,isEvaluate,emitLp) = $Tuple2(nil, estimatePutOperation(txId58, slippageTolerance, inAmAssetAmt, inAmAssetId, inPrAssetAmt, inPrAssetId, userAddress, isEvaluate, emitLp))
16681680
16691681
16701682
16711683 @Callable(i)
16721684 func estimateGetOperationWrapperREADONLY (txId58,pmtAssetId,pmtLpAmt,userAddress) = {
16731685 let res = estimateGetOperation(txId58, pmtAssetId, pmtLpAmt, addressFromStringValue(userAddress))
16741686 $Tuple2(nil, $Tuple10(res._1, res._2, res._3, res._4, res._5, res._6, res._7, toString(res._8), res._9, res._10))
16751687 }
16761688
16771689
16781690
16791691 @Callable(i)
16801692 func statsREADONLY () = {
16811693 let cfg = getPoolConfig()
16821694 let lpAssetId = fromBase58String(cfg[idxPoolLPAssetId])
16831695 let amtAssetId = cfg[idxAmtAssetId]
16841696 let priceAssetId = cfg[idxPriceAssetId]
16851697 let iAmtAssetId = cfg[idxIAmtAssetId]
16861698 let iPriceAssetId = cfg[idxIPriceAssetId]
16871699 let amtAssetDcm = parseIntValue(cfg[idxAmtAssetDcm])
16881700 let priceAssetDcm = parseIntValue(cfg[idxPriceAssetDcm])
16891701 let poolLPBalance = valueOrErrorMessage(assetInfo(lpAssetId), (("Asset " + toBase58String(lpAssetId)) + " doesn't exist")).quantity
16901702 let accAmtAssetBalance = getAccBalance(amtAssetId)
16911703 let accPriceAssetBalance = getAccBalance(priceAssetId)
16921704 let pricesList = if ((poolLPBalance == 0))
16931705 then [zeroBigInt, zeroBigInt, zeroBigInt]
16941706 else calcPrices(accAmtAssetBalance, accPriceAssetBalance, poolLPBalance)
16951707 let curPrice = 0
16961708 let lpAmtAssetShare = fromX18(pricesList[1], scale8)
16971709 let lpPriceAssetShare = fromX18(pricesList[2], scale8)
16981710 let poolWeight = value(getInteger(factoryContract, keyPoolWeight(toString(this))))
16991711 $Tuple2(nil, makeString(["%d%d%d%d%d%d%d", toString(accAmtAssetBalance), toString(accPriceAssetBalance), toString(poolLPBalance), toString(curPrice), toString(lpAmtAssetShare), toString(lpPriceAssetShare), toString(poolWeight)], SEP))
17001712 }
17011713
17021714
17031715
17041716 @Callable(i)
17051717 func evaluatePutByAmountAssetREADONLY (inAmAssetAmt) = {
17061718 let cfg = getPoolConfig()
17071719 let lpAssetId = fromBase58String(cfg[idxPoolLPAssetId])
17081720 let amAssetIdStr = cfg[idxAmtAssetId]
17091721 let amAssetId = fromBase58String(amAssetIdStr)
17101722 let prAssetIdStr = cfg[idxPriceAssetId]
17111723 let prAssetId = fromBase58String(prAssetIdStr)
17121724 let amtAssetDcm = parseIntValue(cfg[idxAmtAssetDcm])
17131725 let priceAssetDcm = parseIntValue(cfg[idxPriceAssetDcm])
17141726 let poolStatus = cfg[idxPoolStatus]
17151727 let poolLPBalance = valueOrErrorMessage(assetInfo(lpAssetId), (("Asset " + toBase58String(lpAssetId)) + " doesn't exist")).quantity
17161728 let accAmtAssetBalance = getAccBalance(amAssetIdStr)
17171729 let accPriceAssetBalance = getAccBalance(prAssetIdStr)
17181730 let amtAssetAmtX18 = toX18(accAmtAssetBalance, amtAssetDcm)
17191731 let priceAssetAmtX18 = toX18(accPriceAssetBalance, priceAssetDcm)
17201732 let curPriceX18 = if ((poolLPBalance == 0))
17211733 then zeroBigInt
17221734 else calcPriceBigInt(priceAssetAmtX18, amtAssetAmtX18)
17231735 let inAmAssetAmtX18 = toX18(inAmAssetAmt, amtAssetDcm)
17241736 let inPrAssetAmtX18 = fraction(inAmAssetAmtX18, curPriceX18, scale18)
17251737 let inPrAssetAmt = fromX18(inPrAssetAmtX18, priceAssetDcm)
17261738 let estPut = estimatePutOperation("", 500000, inAmAssetAmt, amAssetId, inPrAssetAmt, prAssetId, "", true, false)
17271739 let calcLpAmt = estPut._1
17281740 let curPriceCalc = estPut._3
17291741 let amBalance = estPut._4
17301742 let prBalance = estPut._5
17311743 let lpEmission = estPut._6
17321744 $Tuple2(nil, makeString(["%d%d%d%d%d%d%d%d", toString(calcLpAmt), toString(fromX18(curPriceX18, scale8)), toString(amBalance), toString(prBalance), toString(lpEmission), poolStatus, toString(inAmAssetAmt), toString(inPrAssetAmt)], SEP))
17331745 }
17341746
17351747
17361748
17371749 @Callable(i)
17381750 func evaluatePutByPriceAssetREADONLY (inPrAssetAmt) = {
17391751 let cfg = getPoolConfig()
17401752 let lpAssetId = fromBase58String(cfg[idxPoolLPAssetId])
17411753 let amAssetIdStr = cfg[idxAmtAssetId]
17421754 let amAssetId = fromBase58String(amAssetIdStr)
17431755 let prAssetIdStr = cfg[idxPriceAssetId]
17441756 let prAssetId = fromBase58String(prAssetIdStr)
17451757 let amtAssetDcm = parseIntValue(cfg[idxAmtAssetDcm])
17461758 let priceAssetDcm = parseIntValue(cfg[idxPriceAssetDcm])
17471759 let poolStatus = cfg[idxPoolStatus]
17481760 let poolLPBalance = valueOrErrorMessage(assetInfo(lpAssetId), (("Asset " + toBase58String(lpAssetId)) + " doesn't exist")).quantity
17491761 let amBalanceRaw = getAccBalance(amAssetIdStr)
17501762 let prBalanceRaw = getAccBalance(prAssetIdStr)
17511763 let amBalanceRawX18 = toX18(amBalanceRaw, amtAssetDcm)
17521764 let prBalanceRawX18 = toX18(prBalanceRaw, priceAssetDcm)
17531765 let curPriceX18 = if ((poolLPBalance == 0))
17541766 then zeroBigInt
17551767 else calcPriceBigInt(prBalanceRawX18, amBalanceRawX18)
17561768 let inPrAssetAmtX18 = toX18(inPrAssetAmt, priceAssetDcm)
17571769 let inAmAssetAmtX18 = fraction(inPrAssetAmtX18, scale18, curPriceX18)
17581770 let inAmAssetAmt = fromX18(inAmAssetAmtX18, amtAssetDcm)
17591771 let estPut = estimatePutOperation("", 500000, inAmAssetAmt, amAssetId, inPrAssetAmt, prAssetId, "", true, false)
17601772 let calcLpAmt = estPut._1
17611773 let curPriceCalc = estPut._3
17621774 let amBalance = estPut._4
17631775 let prBalance = estPut._5
17641776 let lpEmission = estPut._6
17651777 $Tuple2(nil, makeString(["%d%d%d%d%d%d%d%d", toString(calcLpAmt), toString(fromX18(curPriceX18, scale8)), toString(amBalance), toString(prBalance), toString(lpEmission), poolStatus, toString(inAmAssetAmt), toString(inPrAssetAmt)], SEP))
17661778 }
17671779
17681780
17691781
17701782 @Callable(i)
17711783 func evaluateGetREADONLY (paymentLpAssetId,paymentLpAmt) = {
17721784 let res = estimateGetOperation("", paymentLpAssetId, paymentLpAmt, this)
17731785 let outAmAmt = res._1
17741786 let outPrAmt = res._2
17751787 let amBalance = res._5
17761788 let prBalance = res._6
17771789 let lpEmission = res._7
17781790 let curPrice = res._8
17791791 let poolStatus = parseIntValue(res._9)
17801792 $Tuple2(nil, makeString(["%d%d%d%d%d%d%d", toString(outAmAmt), toString(outPrAmt), toString(amBalance), toString(prBalance), toString(lpEmission), toString(curPrice), toString(poolStatus)], SEP))
17811793 }
17821794
17831795
17841796 @Verifier(tx)
17851797 func verify () = {
17861798 let targetPublicKey = match managerPublicKeyOrUnit() {
17871799 case pk: ByteVector =>
17881800 pk
17891801 case _: Unit =>
17901802 tx.senderPublicKey
17911803 case _ =>
17921804 throw("Match error")
17931805 }
17941806 match tx {
17951807 case order: Order =>
17961808 let matcherPub = getMatcherPubOrFail()
1797- let $t06924869365 = if (skipOrderValidation())
1809+ let $t06944369560 = if (skipOrderValidation())
17981810 then $Tuple2(true, "")
17991811 else validateMatcherOrderAllowed(order)
1800- let orderValid = $t06924869365._1
1801- let orderValidInfo = $t06924869365._2
1812+ let orderValid = $t06944369560._1
1813+ let orderValidInfo = $t06944369560._2
18021814 let senderValid = sigVerify(order.bodyBytes, order.proofs[0], order.senderPublicKey)
18031815 let matcherValid = sigVerify(order.bodyBytes, order.proofs[1], matcherPub)
18041816 if (if (if (orderValid)
18051817 then senderValid
18061818 else false)
18071819 then matcherValid
18081820 else false)
18091821 then true
18101822 else throwOrderError(orderValid, orderValidInfo, senderValid, matcherValid)
18111823 case s: SetScriptTransaction =>
18121824 if (sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey))
18131825 then true
18141826 else {
18151827 let newHash = blake2b256(value(s.script))
18161828 let allowedHash = fromBase64String(value(getString(factoryContract, keyAllowedLpScriptHash())))
18171829 let currentHash = scriptHash(this)
18181830 if ((allowedHash == newHash))
18191831 then (currentHash != newHash)
18201832 else false
18211833 }
18221834 case _ =>
18231835 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
18241836 }
18251837 }
18261838

github/deemru/w8io/3ef1775 
318.44 ms