tx · Sq4SrTpPYdTtHpgiicyLmfLaJa9jVvtHVPcnkyX7znX

3PKWpLGyr6KJUiNaBFNZbRRxDMXKRLx2mEQ:  -0.06100000 Waves

2023.05.10 14:10 [3637174] smart account 3PKWpLGyr6KJUiNaBFNZbRRxDMXKRLx2mEQ > SELF 0.00000000 Waves

{ "type": 13, "id": "Sq4SrTpPYdTtHpgiicyLmfLaJa9jVvtHVPcnkyX7znX", "fee": 6100000, "feeAssetId": null, "timestamp": 1683717014799, "version": 2, "chainId": 87, "sender": "3PKWpLGyr6KJUiNaBFNZbRRxDMXKRLx2mEQ", "senderPublicKey": "8bERngMRramy2pwGvn2HDexFBjZauCEScdJn6t9BXsVi", "proofs": [ "49sDebT2UMZdQNnsSk1wf18NMGqhiuzqweRCgYEG6EyqFu7o2G6UKWV2aR72igiCg8PV37rrWr6YA34ziN2mJd1t" ], "script": "base64:BgKhAQgCEgASBQoDAQQBEgcKBQEEAQgBEgQKAgEEEgMKAQESBAoCAQQSBAoCCAESBAoCCAESBAoCCAESBQoDAQgBEgASBAoCAQESAwoBARIFCgMBAQESBAoCCAgSABIAEgMKAQgSBQoDAQEBEgQKAgEBEgQKAggBEgQKAggIEgsKCQgBAQIBAggEBBIGCgQICAEIEgASAwoBARIDCgEBEgQKAggBggEACmxQZGVjaW1hbHMACAAGc2NhbGU4AIDC1y8ADHNjYWxlOEJpZ0ludAkAtgIBAIDC1y8AB3NjYWxlMTgJALYCAQCAgJC7utat8A0ACnplcm9CaWdJbnQJALYCAQAAAARiaWcwCQC2AgEAAAAEYmlnMQkAtgIBAAEABGJpZzIJALYCAQACAAt3YXZlc1N0cmluZwIFV0FWRVMAA1NFUAICX18AClBvb2xBY3RpdmUAAQAPUG9vbFB1dERpc2FibGVkAAIAE1Bvb2xNYXRjaGVyRGlzYWJsZWQAAwAMUG9vbFNodXRkb3duAAQADmlkeFBvb2xBZGRyZXNzAAEADWlkeFBvb2xTdGF0dXMAAgAQaWR4UG9vbExQQXNzZXRJZAADAA1pZHhBbXRBc3NldElkAAQAD2lkeFByaWNlQXNzZXRJZAAFAA5pZHhBbXRBc3NldERjbQAGABBpZHhQcmljZUFzc2V0RGNtAAcADmlkeElBbXRBc3NldElkAAgAEGlkeElQcmljZUFzc2V0SWQACQANaWR4TFBBc3NldERjbQAKABJpZHhQb29sQW10QXNzZXRBbXQAAQAUaWR4UG9vbFByaWNlQXNzZXRBbXQAAgARaWR4UG9vbExQQXNzZXRBbXQAAwAZaWR4RmFjdG9yeVN0YWtpbmdDb250cmFjdAABABppZHhGYWN0b3J5U2xpcHBhZ2VDb250cmFjdAAHAQV0b1gxOAIHb3JpZ1ZhbA1vcmlnU2NhbGVNdWx0CQC8AgMJALYCAQUHb3JpZ1ZhbAUHc2NhbGUxOAkAtgIBBQ1vcmlnU2NhbGVNdWx0AQt0b1gxOEJpZ0ludAIHb3JpZ1ZhbA1vcmlnU2NhbGVNdWx0CQC8AgMFB29yaWdWYWwFB3NjYWxlMTgFDW9yaWdTY2FsZU11bHQBB2Zyb21YMTgCA3ZhbA9yZXN1bHRTY2FsZU11bHQJAKADAQkAvAIDBQN2YWwJALYCAQUPcmVzdWx0U2NhbGVNdWx0BQdzY2FsZTE4AQxmcm9tWDE4Um91bmQDA3ZhbA9yZXN1bHRTY2FsZU11bHQFcm91bmQJAKADAQkAvQIEBQN2YWwJALYCAQUPcmVzdWx0U2NhbGVNdWx0BQdzY2FsZTE4BQVyb3VuZAEHdG9TY2FsZQMDYW10CHJlc1NjYWxlCGN1clNjYWxlCQBrAwUDYW10BQhyZXNTY2FsZQUIY3VyU2NhbGUBA2FicwEDdmFsAwkAZgIAAAUDdmFsCQEBLQEFA3ZhbAUDdmFsAQlhYnNCaWdJbnQBA3ZhbAMJAL8CAgUKemVyb0JpZ0ludAUDdmFsCQC+AgEFA3ZhbAUDdmFsAQxzd2FwQ29udHJhY3QAAhAlc19fc3dhcENvbnRyYWN0AQJmYwACEyVzX19mYWN0b3J5Q29udHJhY3QBE2tleU1hbmFnZXJQdWJsaWNLZXkAAhQlc19fbWFuYWdlclB1YmxpY0tleQEWa2V5TWFuYWdlclZhdWx0QWRkcmVzcwACFyVzX19tYW5hZ2VyVmF1bHRBZGRyZXNzAQJwbAACESVzJXNfX3ByaWNlX19sYXN0AQJwaAIBaAl0aW1lc3RhbXAJALkJAgkAzAgCAhglcyVzJWQlZF9fcHJpY2VfX2hpc3RvcnkJAMwIAgkApAMBBQFoCQDMCAIJAKQDAQUJdGltZXN0YW1wBQNuaWwFA1NFUAEDcGF1Agt1c2VyQWRkcmVzcwR0eElkCQCsAgIJAKwCAgkArAICAgslcyVzJXNfX1BfXwULdXNlckFkZHJlc3MCAl9fBQR0eElkAQNnYXUCC3VzZXJBZGRyZXNzBHR4SWQJAKwCAgkArAICCQCsAgICCyVzJXMlc19fR19fBQt1c2VyQWRkcmVzcwICX18FBHR4SWQBAmFhAAIPJXNfX2Ftb3VudEFzc2V0AQJwYQACDiVzX19wcmljZUFzc2V0AAZrZXlGZWUCByVzX19mZWUACmZlZURlZmF1bHQJAGsDAAoFBnNjYWxlOACQTgADZmVlCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFBmtleUZlZQUKZmVlRGVmYXVsdAAGa2V5S0xwCQC5CQIJAMwIAgICJXMJAMwIAgIDa0xwBQNuaWwFA1NFUAAVa2V5S0xwUmVmcmVzaGVkSGVpZ2h0CQC5CQIJAMwIAgICJXMJAMwIAgISa0xwUmVmcmVzaGVkSGVpZ2h0BQNuaWwFA1NFUAASa2V5S0xwUmVmcmVzaERlbGF5CQC5CQIJAMwIAgICJXMJAMwIAgIPcmVmcmVzaEtMcERlbGF5BQNuaWwFA1NFUAAWa0xwUmVmcmVzaERlbGF5RGVmYXVsdAAeAA9rTHBSZWZyZXNoRGVsYXkJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUSa2V5S0xwUmVmcmVzaERlbGF5BRZrTHBSZWZyZXNoRGVsYXlEZWZhdWx0ARRrZXlBZGRpdGlvbmFsQmFsYW5jZQEHYXNzZXRJZAkAuQkCCQDMCAICBCVzJXMJAMwIAgINc3Rha2VkQmFsYW5jZQkAzAgCBQdhc3NldElkBQNuaWwFA1NFUAEWa2V5U3Rha2luZ0Fzc2V0QmFsYW5jZQEHYXNzZXRJZAkAuQkCCQDMCAICBCVzJXMJAMwIAgIRc2hhcmVBc3NldEJhbGFuY2UJAMwIAgUHYXNzZXRJZAUDbmlsBQNTRVABGmdldEFkZGl0aW9uYWxCYWxhbmNlT3JaZXJvAQdhc3NldElkCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJARRrZXlBZGRpdGlvbmFsQmFsYW5jZQEFB2Fzc2V0SWQAAAEcZ2V0U3Rha2luZ0Fzc2V0QmFsYW5jZU9yWmVybwEHYXNzZXRJZAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEWa2V5U3Rha2luZ0Fzc2V0QmFsYW5jZQEFB2Fzc2V0SWQAAAEQa2V5RmFjdG9yeUNvbmZpZwACESVzX19mYWN0b3J5Q29uZmlnAQ1rZXlNYXRjaGVyUHViAAIYJXMlc19fbWF0Y2hlcl9fcHVibGljS2V5ASlrZXlNYXBwaW5nUG9vbENvbnRyYWN0QWRkcmVzc1RvUG9vbEFzc2V0cwETcG9vbENvbnRyYWN0QWRkcmVzcwkArAICCQCsAgICCCVzJXMlc19fBRNwb29sQ29udHJhY3RBZGRyZXNzAiBfX21hcHBpbmdzX19wb29sQ29udHJhY3QyTHBBc3NldAENa2V5UG9vbENvbmZpZwIJaUFtdEFzc2V0C2lQcmljZUFzc2V0CQCsAgIJAKwCAgkArAICCQCsAgICCCVkJWQlc19fBQlpQW10QXNzZXQCAl9fBQtpUHJpY2VBc3NldAIIX19jb25maWcBH2tleU1hcHBpbmdzQmFzZUFzc2V0MmludGVybmFsSWQBDGJhc2VBc3NldFN0cgkArAICAiglcyVzJXNfX21hcHBpbmdzX19iYXNlQXNzZXQyaW50ZXJuYWxJZF9fBQxiYXNlQXNzZXRTdHIBE2tleUFsbFBvb2xzU2h1dGRvd24AAgwlc19fc2h1dGRvd24BDWtleVBvb2xXZWlnaHQBD2NvbnRyYWN0QWRkcmVzcwkArAICAhIlcyVzX19wb29sV2VpZ2h0X18FD2NvbnRyYWN0QWRkcmVzcwEWa2V5QWxsb3dlZExwU2NyaXB0SGFzaAACFyVzX19hbGxvd2VkTHBTY3JpcHRIYXNoABZrZXlGZWVDb2xsZWN0b3JBZGRyZXNzAhclc19fZmVlQ29sbGVjdG9yQWRkcmVzcwEWa2V5U2tpcE9yZGVyVmFsaWRhdGlvbgELcG9vbEFkZHJlc3MJAKwCAgIbJXMlc19fc2tpcE9yZGVyVmFsaWRhdGlvbl9fBQtwb29sQWRkcmVzcwEPdGhyb3dPcmRlckVycm9yBApvcmRlclZhbGlkDm9yZGVyVmFsaWRJbmZvC3NlbmRlclZhbGlkDG1hdGNoZXJWYWxpZAkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAiRvcmRlciB2YWxpZGF0aW9uIGZhaWxlZDogb3JkZXJWYWxpZD0JAKUDAQUKb3JkZXJWYWxpZAICICgFDm9yZGVyVmFsaWRJbmZvAgEpAg0gc2VuZGVyVmFsaWQ9CQClAwEFC3NlbmRlclZhbGlkAg4gbWF0Y2hlclZhbGlkPQkApQMBBQxtYXRjaGVyVmFsaWQBF2FkZHJlc3NGcm9tU3RyaW5nT3JUaGlzAQ1hZGRyZXNzU3RyaW5nBAckbWF0Y2gwCQCmCAEFDWFkZHJlc3NTdHJpbmcDCQABAgUHJG1hdGNoMAIHQWRkcmVzcwQBYQUHJG1hdGNoMAUBYQUEdGhpcwEcZ2V0TWFuYWdlclZhdWx0QWRkcmVzc09yVGhpcwAEDmZhY3RvcnlBZGRyZXNzBAckbWF0Y2gwCQCiCAEJAQJmYwADCQABAgUHJG1hdGNoMAIGU3RyaW5nBANmY2EFByRtYXRjaDAJARdhZGRyZXNzRnJvbVN0cmluZ09yVGhpcwEFA2ZjYQUEdGhpcwQHJG1hdGNoMAkAnQgCBQ5mYWN0b3J5QWRkcmVzcwkBFmtleU1hbmFnZXJWYXVsdEFkZHJlc3MAAwkAAQIFByRtYXRjaDACBlN0cmluZwQBcwUHJG1hdGNoMAkBF2FkZHJlc3NGcm9tU3RyaW5nT3JUaGlzAQUBcwUEdGhpcwEPZ2V0U3RyaW5nT3JGYWlsAgdhZGRyZXNzA2tleQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFB2FkZHJlc3MFA2tleQkAuQkCCQDMCAICCm1hbmRhdG9yeSAJAMwIAgkApQgBBQdhZGRyZXNzCQDMCAICAS4JAMwIAgUDa2V5CQDMCAICDyBpcyBub3QgZGVmaW5lZAUDbmlsAgABDGdldEludE9yRmFpbAIHYWRkcmVzcwNrZXkJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQdhZGRyZXNzBQNrZXkJALkJAgkAzAgCAgptYW5kYXRvcnkgCQDMCAIJAKUIAQUHYWRkcmVzcwkAzAgCAgEuCQDMCAIFA2tleQkAzAgCAg8gaXMgbm90IGRlZmluZWQFA25pbAIAAQh0aHJvd0VycgEDbXNnCQACAQkAuQkCCQDMCAICCGxwLnJpZGU6CQDMCAIFA21zZwUDbmlsAgEgAQZmbXRFcnIBA21zZwkAuQkCCQDMCAICCGxwLnJpZGU6CQDMCAIFA21zZwUDbmlsAgEgAA9mYWN0b3J5Q29udHJhY3QJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQ9nZXRTdHJpbmdPckZhaWwCBQR0aGlzCQECZmMAABNmZWVDb2xsZWN0b3JBZGRyZXNzCQERQGV4dHJOYXRpdmUoMTA2MikBCQEPZ2V0U3RyaW5nT3JGYWlsAgUPZmFjdG9yeUNvbnRyYWN0BRZrZXlGZWVDb2xsZWN0b3JBZGRyZXNzAAVpbkZlZQoAAUAJAPwHBAUPZmFjdG9yeUNvbnRyYWN0AhBnZXRJbkZlZVJFQURPTkxZCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQNuaWwDCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50AAZvdXRGZWUKAAFACQD8BwQFD2ZhY3RvcnlDb250cmFjdAIRZ2V0T3V0RmVlUkVBRE9OTFkJAMwIAgkApQgBBQR0aGlzBQNuaWwFA25pbAMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQBEGlzR2xvYmFsU2h1dGRvd24ACQELdmFsdWVPckVsc2UCCQCbCAIFD2ZhY3RvcnlDb250cmFjdAkBE2tleUFsbFBvb2xzU2h1dGRvd24ABwETZ2V0TWF0Y2hlclB1Yk9yRmFpbAAJANkEAQkBD2dldFN0cmluZ09yRmFpbAIFD2ZhY3RvcnlDb250cmFjdAkBDWtleU1hdGNoZXJQdWIAAQ1nZXRQb29sQ29uZmlnAAQIYW10QXNzZXQJAQ9nZXRTdHJpbmdPckZhaWwCBQR0aGlzCQECYWEABApwcmljZUFzc2V0CQEPZ2V0U3RyaW5nT3JGYWlsAgUEdGhpcwkBAnBhAAQLaVByaWNlQXNzZXQJAQxnZXRJbnRPckZhaWwCBQ9mYWN0b3J5Q29udHJhY3QJAR9rZXlNYXBwaW5nc0Jhc2VBc3NldDJpbnRlcm5hbElkAQUKcHJpY2VBc3NldAQJaUFtdEFzc2V0CQEMZ2V0SW50T3JGYWlsAgUPZmFjdG9yeUNvbnRyYWN0CQEfa2V5TWFwcGluZ3NCYXNlQXNzZXQyaW50ZXJuYWxJZAEFCGFtdEFzc2V0CQC1CQIJAQ9nZXRTdHJpbmdPckZhaWwCBQ9mYWN0b3J5Q29udHJhY3QJAQ1rZXlQb29sQ29uZmlnAgkApAMBBQlpQW10QXNzZXQJAKQDAQULaVByaWNlQXNzZXQFA1NFUAEMcGFyc2VBc3NldElkAQVpbnB1dAMJAAACBQVpbnB1dAULd2F2ZXNTdHJpbmcFBHVuaXQJANkEAQUFaW5wdXQBD2Fzc2V0SWRUb1N0cmluZwEFaW5wdXQDCQAAAgUFaW5wdXQFBHVuaXQFC3dhdmVzU3RyaW5nCQDYBAEJAQV2YWx1ZQEFBWlucHV0AQ9wYXJzZVBvb2xDb25maWcBCnBvb2xDb25maWcJAJkKBwkBEUBleHRyTmF0aXZlKDEwNjIpAQkAkQMCBQpwb29sQ29uZmlnBQ5pZHhQb29sQWRkcmVzcwkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCnBvb2xDb25maWcFDWlkeFBvb2xTdGF0dXMJANkEAQkAkQMCBQpwb29sQ29uZmlnBRBpZHhQb29sTFBBc3NldElkCQEMcGFyc2VBc3NldElkAQkAkQMCBQpwb29sQ29uZmlnBQ1pZHhBbXRBc3NldElkCQEMcGFyc2VBc3NldElkAQkAkQMCBQpwb29sQ29uZmlnBQ9pZHhQcmljZUFzc2V0SWQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQpwb29sQ29uZmlnBQ5pZHhBbXRBc3NldERjbQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCnBvb2xDb25maWcFEGlkeFByaWNlQXNzZXREY20AEHBvb2xDb25maWdQYXJzZWQJAQ9wYXJzZVBvb2xDb25maWcBCQENZ2V0UG9vbENvbmZpZwAACyR0MDk1Mjk5Njk1BRBwb29sQ29uZmlnUGFyc2VkAA5jZmdQb29sQWRkcmVzcwgFCyR0MDk1Mjk5Njk1Al8xAA1jZmdQb29sU3RhdHVzCAULJHQwOTUyOTk2OTUCXzIADGNmZ0xwQXNzZXRJZAgFCyR0MDk1Mjk5Njk1Al8zABBjZmdBbW91bnRBc3NldElkCAULJHQwOTUyOTk2OTUCXzQAD2NmZ1ByaWNlQXNzZXRJZAgFCyR0MDk1Mjk5Njk1Al81ABZjZmdBbW91bnRBc3NldERlY2ltYWxzCAULJHQwOTUyOTk2OTUCXzYAFWNmZ1ByaWNlQXNzZXREZWNpbWFscwgFCyR0MDk1Mjk5Njk1Al83ARBnZXRGYWN0b3J5Q29uZmlnAAkAtQkCCQEPZ2V0U3RyaW5nT3JGYWlsAgUPZmFjdG9yeUNvbnRyYWN0CQEQa2V5RmFjdG9yeUNvbmZpZwAFA1NFUAAPc3Rha2luZ0NvbnRyYWN0CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkAkQMCCQEQZ2V0RmFjdG9yeUNvbmZpZwAFGWlkeEZhY3RvcnlTdGFraW5nQ29udHJhY3QCGWluY29ycmVjdCBzdGFraW5nIGFkZHJlc3MAEHNsaXBwYWdlQ29udHJhY3QJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIJARBnZXRGYWN0b3J5Q29uZmlnAAUaaWR4RmFjdG9yeVNsaXBwYWdlQ29udHJhY3QCGWluY29ycmVjdCBzdGFraW5nIGFkZHJlc3MBEWRhdGFQdXRBY3Rpb25JbmZvCg1pbkFtdEFzc2V0QW10D2luUHJpY2VBc3NldEFtdAhvdXRMcEFtdAVwcmljZR1zbGlwcGFnZVRvbGVyYW5jZVBhc3NlZEJ5VXNlchVzbGlwcGFnZVRvbGVyYW5jZVJlYWwIdHhIZWlnaHQLdHhUaW1lc3RhbXASc2xpcGFnZUFtdEFzc2V0QW10FHNsaXBhZ2VQcmljZUFzc2V0QW10CQC5CQIJAMwIAgIUJWQlZCVkJWQlZCVkJWQlZCVkJWQJAMwIAgkApAMBBQ1pbkFtdEFzc2V0QW10CQDMCAIJAKQDAQUPaW5QcmljZUFzc2V0QW10CQDMCAIJAKQDAQUIb3V0THBBbXQJAMwIAgkApAMBBQVwcmljZQkAzAgCCQCkAwEFHXNsaXBwYWdlVG9sZXJhbmNlUGFzc2VkQnlVc2VyCQDMCAIJAKQDAQUVc2xpcHBhZ2VUb2xlcmFuY2VSZWFsCQDMCAIJAKQDAQUIdHhIZWlnaHQJAMwIAgkApAMBBQt0eFRpbWVzdGFtcAkAzAgCCQCkAwEFEnNsaXBhZ2VBbXRBc3NldEFtdAkAzAgCCQCkAwEFFHNsaXBhZ2VQcmljZUFzc2V0QW10BQNuaWwFA1NFUAERZGF0YUdldEFjdGlvbkluZm8GDm91dEFtdEFzc2V0QW10EG91dFByaWNlQXNzZXRBbXQHaW5McEFtdAVwcmljZQh0eEhlaWdodAt0eFRpbWVzdGFtcAkAuQkCCQDMCAICDCVkJWQlZCVkJWQlZAkAzAgCCQCkAwEFDm91dEFtdEFzc2V0QW10CQDMCAIJAKQDAQUQb3V0UHJpY2VBc3NldEFtdAkAzAgCCQCkAwEFB2luTHBBbXQJAMwIAgkApAMBBQVwcmljZQkAzAgCCQCkAwEFCHR4SGVpZ2h0CQDMCAIJAKQDAQULdHhUaW1lc3RhbXAFA25pbAUDU0VQAQ1nZXRBY2NCYWxhbmNlAQdhc3NldElkBA1iYWxhbmNlT25Qb29sAwkAAAIFB2Fzc2V0SWQCBVdBVkVTCAkA7wcBBQR0aGlzCWF2YWlsYWJsZQkA8AcCBQR0aGlzCQDZBAEFB2Fzc2V0SWQEDHRvdGFsQmFsYW5jZQkAZQIJAGQCBQ1iYWxhbmNlT25Qb29sCQEaZ2V0QWRkaXRpb25hbEJhbGFuY2VPclplcm8BBQdhc3NldElkCQEcZ2V0U3Rha2luZ0Fzc2V0QmFsYW5jZU9yWmVybwEFB2Fzc2V0SWQJAJYDAQkAzAgCAAAJAMwIAgUMdG90YWxCYWxhbmNlBQNuaWwBD2NhbGNQcmljZUJpZ0ludAIIcHJBbXRYMTgIYW1BbXRYMTgJALwCAwUIcHJBbXRYMTgFB3NjYWxlMTgFCGFtQW10WDE4ARRjYWxjUHJpY2VCaWdJbnRSb3VuZAMIcHJBbXRYMTgIYW1BbXRYMTgFcm91bmQJAL0CBAUIcHJBbXRYMTgFB3NjYWxlMTgFCGFtQW10WDE4BQVyb3VuZAEHZ2V0UmF0ZQEFcHJveHkEA2ludgkA/AcEBQVwcm94eQIHZ2V0UmF0ZQUDbmlsBQNuaWwDCQAAAgUDaW52BQNpbnYEByRtYXRjaDAFA2ludgMJAAECBQckbWF0Y2gwAgNJbnQEAXIFByRtYXRjaDAFAXIJAQh0aHJvd0VycgECIHByb3h5LmdldFJhdGUoKSB1bmV4cGVjdGVkIHZhbHVlCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQdkZXBvc2l0BAdhc3NldElkBmFtb3VudA5zdGFraW5nQXNzZXRJZAVwcm94eQQYY3VycmVudEFkZGl0aW9uYWxCYWxhbmNlCQEaZ2V0QWRkaXRpb25hbEJhbGFuY2VPclplcm8BBQdhc3NldElkAwkAAAIFGGN1cnJlbnRBZGRpdGlvbmFsQmFsYW5jZQUYY3VycmVudEFkZGl0aW9uYWxCYWxhbmNlBBpjdXJyZW50U3Rha2luZ0Fzc2V0QmFsYW5jZQkBHGdldFN0YWtpbmdBc3NldEJhbGFuY2VPclplcm8BBQ5zdGFraW5nQXNzZXRJZAMJAAACBRpjdXJyZW50U3Rha2luZ0Fzc2V0QmFsYW5jZQUaY3VycmVudFN0YWtpbmdBc3NldEJhbGFuY2UEBWFzc2V0CQEMcGFyc2VBc3NldElkAQUHYXNzZXRJZAMJAGYCBQZhbW91bnQAAAQNZGVwb3NpdEludm9rZQkA/AcEBQVwcm94eQIHZGVwb3NpdAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQVhc3NldAUGYW1vdW50BQNuaWwDCQAAAgUNZGVwb3NpdEludm9rZQUNZGVwb3NpdEludm9rZQQHJG1hdGNoMAUNZGVwb3NpdEludm9rZQMJAAECBQckbWF0Y2gwAgNJbnQEFHJlY2VpdmVkU3Rha2luZ0Fzc2V0BQckbWF0Y2gwBBRuZXdBZGRpdGlvbmFsQmFsYW5jZQkAZAIFGGN1cnJlbnRBZGRpdGlvbmFsQmFsYW5jZQUGYW1vdW50BBZuZXdTdGFraW5nQXNzZXRCYWxhbmNlCQBkAgUaY3VycmVudFN0YWtpbmdBc3NldEJhbGFuY2UFFHJlY2VpdmVkU3Rha2luZ0Fzc2V0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEUa2V5QWRkaXRpb25hbEJhbGFuY2UBBQdhc3NldElkBRRuZXdBZGRpdGlvbmFsQmFsYW5jZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBFmtleVN0YWtpbmdBc3NldEJhbGFuY2UBBQ5zdGFraW5nQXNzZXRJZAUWbmV3U3Rha2luZ0Fzc2V0QmFsYW5jZQUDbmlsBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4FA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEId2l0aGRyYXcGB2Fzc2V0SWQGYW1vdW50DnN0YWtpbmdBc3NldElkBXByb3h5DHByb3h5UmF0ZU11bA1wcm9maXRBZGRyZXNzBBhjdXJyZW50QWRkaXRpb25hbEJhbGFuY2UJARpnZXRBZGRpdGlvbmFsQmFsYW5jZU9yWmVybwEFB2Fzc2V0SWQDCQAAAgUYY3VycmVudEFkZGl0aW9uYWxCYWxhbmNlBRhjdXJyZW50QWRkaXRpb25hbEJhbGFuY2UEGmN1cnJlbnRTdGFraW5nQXNzZXRCYWxhbmNlCQEcZ2V0U3Rha2luZ0Fzc2V0QmFsYW5jZU9yWmVybwEFDnN0YWtpbmdBc3NldElkAwkAAAIFGmN1cnJlbnRTdGFraW5nQXNzZXRCYWxhbmNlBRpjdXJyZW50U3Rha2luZ0Fzc2V0QmFsYW5jZQQQY3VycmVudFByb3h5UmF0ZQkBB2dldFJhdGUBBQVwcm94eQMJAAACBRBjdXJyZW50UHJveHlSYXRlBRBjdXJyZW50UHJveHlSYXRlBAdvbGRSYXRlCQBrAwUMcHJveHlSYXRlTXVsBRhjdXJyZW50QWRkaXRpb25hbEJhbGFuY2UFGmN1cnJlbnRTdGFraW5nQXNzZXRCYWxhbmNlBAxzdGFraW5nQXNzZXQJAQxwYXJzZUFzc2V0SWQBBQ5zdGFraW5nQXNzZXRJZAQUb2xkU2VuZFN0YWtpbmdBbW91bnQJAGsDBQxwcm94eVJhdGVNdWwFBmFtb3VudAUHb2xkUmF0ZQQWc2VuZFN0YWtpbmdBc3NldEFtb3VudAkAawMFDHByb3h5UmF0ZU11bAUGYW1vdW50BRBjdXJyZW50UHJveHlSYXRlBAxwcm9maXRBbW91bnQJAJYDAQkAzAgCAAAJAMwIAgkAZQIFFG9sZFNlbmRTdGFraW5nQW1vdW50BRZzZW5kU3Rha2luZ0Fzc2V0QW1vdW50BQNuaWwDCQBmAgUWc2VuZFN0YWtpbmdBc3NldEFtb3VudAAABA53aXRoZHJhd0ludm9rZQkA/AcEBQVwcm94eQIId2l0aGRyYXcFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUMc3Rha2luZ0Fzc2V0BRZzZW5kU3Rha2luZ0Fzc2V0QW1vdW50BQNuaWwDCQAAAgUOd2l0aGRyYXdJbnZva2UFDndpdGhkcmF3SW52b2tlBAckbWF0Y2gwBQ53aXRoZHJhd0ludm9rZQMJAAECBQckbWF0Y2gwAgNJbnQEDnJlY2VpdmVkQXNzZXRzBQckbWF0Y2gwBBRuZXdBZGRpdGlvbmFsQmFsYW5jZQkAZQIFGGN1cnJlbnRBZGRpdGlvbmFsQmFsYW5jZQUOcmVjZWl2ZWRBc3NldHMEFm5ld1N0YWtpbmdBc3NldEJhbGFuY2UJAGUCCQBlAgUaY3VycmVudFN0YWtpbmdBc3NldEJhbGFuY2UFFnNlbmRTdGFraW5nQXNzZXRBbW91bnQFDHByb2ZpdEFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBFGtleUFkZGl0aW9uYWxCYWxhbmNlAQUHYXNzZXRJZAUUbmV3QWRkaXRpb25hbEJhbGFuY2UJAMwIAgkBDEludGVnZXJFbnRyeQIJARZrZXlTdGFraW5nQXNzZXRCYWxhbmNlAQUOc3Rha2luZ0Fzc2V0SWQFFm5ld1N0YWtpbmdBc3NldEJhbGFuY2UJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUNcHJvZml0QWRkcmVzcwUMcHJvZml0QW1vdW50CQEMcGFyc2VBc3NldElkAQUOc3Rha2luZ0Fzc2V0SWQFA25pbAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BE2dldExlYXNlUHJveHlDb25maWcBB2Fzc2V0SWQEByRtYXRjaDAJAPwHBAUPZmFjdG9yeUNvbnRyYWN0AhpnZXRQb29sTGVhc2VDb25maWdSRUFET05MWQkAzAgCCQClCAEFBHRoaXMJAMwIAgUHYXNzZXRJZAUDbmlsBQNuaWwDCQABAgUHJG1hdGNoMAIwKEJvb2xlYW4sIEludCwgSW50LCBTdHJpbmcsIFN0cmluZywgSW50LCBTdHJpbmcpBAFhBQckbWF0Y2gwBQFhCQEIdGhyb3dFcnIBCQCsAgIJAKwCAgIBWwUHYXNzZXRJZAIdXSBnZXRMZWFzZVByb3h5Q29uZmlnKCkgZXJyb3IBEXJlYmFsYW5jZUludGVybmFsBwt0YXJnZXRSYXRpbwdhc3NldElkDnN0YWtpbmdBc3NldElkCm1pbkJhbGFuY2UFcHJveHkMcHJveHlSYXRlTXVsDXByb2ZpdEFkZHJlc3MEGGN1cnJlbnRBZGRpdGlvbmFsQmFsYW5jZQkBGmdldEFkZGl0aW9uYWxCYWxhbmNlT3JaZXJvAQUHYXNzZXRJZAMJAAACBRhjdXJyZW50QWRkaXRpb25hbEJhbGFuY2UFGGN1cnJlbnRBZGRpdGlvbmFsQmFsYW5jZQQaY3VycmVudFN0YWtpbmdBc3NldEJhbGFuY2UJARxnZXRTdGFraW5nQXNzZXRCYWxhbmNlT3JaZXJvAQUOc3Rha2luZ0Fzc2V0SWQDCQAAAgUaY3VycmVudFN0YWtpbmdBc3NldEJhbGFuY2UFGmN1cnJlbnRTdGFraW5nQXNzZXRCYWxhbmNlBBRsZWFzYWJsZVRvdGFsQmFsYW5jZQkAlgMBCQDMCAIAAAkAzAgCCQBlAgkBDWdldEFjY0JhbGFuY2UBBQdhc3NldElkBQptaW5CYWxhbmNlBQNuaWwEF3RhcmdldEFkZGl0aW9uYWxCYWxhbmNlCQBrAwULdGFyZ2V0UmF0aW8FFGxlYXNhYmxlVG90YWxCYWxhbmNlAGQEBGRpZmYJAGUCBRhjdXJyZW50QWRkaXRpb25hbEJhbGFuY2UFF3RhcmdldEFkZGl0aW9uYWxCYWxhbmNlAwkAAAIFBGRpZmYAAAUDbmlsAwkAZgIAAAUEZGlmZgQPc2VuZEFzc2V0QW1vdW50CQEBLQEFBGRpZmYJAQdkZXBvc2l0BAUHYXNzZXRJZAUPc2VuZEFzc2V0QW1vdW50BQ5zdGFraW5nQXNzZXRJZAUFcHJveHkEDmdldEFzc2V0QW1vdW50BQRkaWZmCQEId2l0aGRyYXcGBQdhc3NldElkBQ5nZXRBc3NldEFtb3VudAUOc3Rha2luZ0Fzc2V0SWQFBXByb3h5BQxwcm94eVJhdGVNdWwFDXByb2ZpdEFkZHJlc3MJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BDnJlYmFsYW5jZUFzc2V0AQdhc3NldElkBA0kdDAxNTkzMTE2MDY3CQETZ2V0TGVhc2VQcm94eUNvbmZpZwEFB2Fzc2V0SWQECmlzTGVhc2FibGUIBQ0kdDAxNTkzMTE2MDY3Al8xBAtsZWFzZWRSYXRpbwgFDSR0MDE1OTMxMTYwNjcCXzIECm1pbkJhbGFuY2UIBQ0kdDAxNTkzMTE2MDY3Al8zBAxwcm94eUFkZHJlc3MIBQ0kdDAxNTkzMTE2MDY3Al80BAxwcm94eUFzc2V0SWQIBQ0kdDAxNTkzMTE2MDY3Al81BAxwcm94eVJhdGVNdWwIBQ0kdDAxNTkzMTE2MDY3Al82BBRzdGFraW5nUHJvZml0QWRkcmVzcwgFDSR0MDE1OTMxMTYwNjcCXzcDBQppc0xlYXNhYmxlCQERcmViYWxhbmNlSW50ZXJuYWwHBQtsZWFzZWRSYXRpbwUHYXNzZXRJZAUMcHJveHlBc3NldElkBQptaW5CYWxhbmNlCQERQGV4dHJOYXRpdmUoMTA2MikBBQxwcm94eUFkZHJlc3MFDHByb3h5UmF0ZU11bAkBEUBleHRyTmF0aXZlKDEwNjIpAQUUc3Rha2luZ1Byb2ZpdEFkZHJlc3MFA25pbAEZd2l0aGRyYXdBbmRSZWJhbGFuY2VBc3NldAIHYXNzZXRJZAlnZXRBbW91bnQEDSR0MDE2NDY2MTY2MDIJARNnZXRMZWFzZVByb3h5Q29uZmlnAQUHYXNzZXRJZAQKaXNMZWFzYWJsZQgFDSR0MDE2NDY2MTY2MDICXzEEC2xlYXNlZFJhdGlvCAUNJHQwMTY0NjYxNjYwMgJfMgQKbWluQmFsYW5jZQgFDSR0MDE2NDY2MTY2MDICXzMEDHByb3h5QWRkcmVzcwgFDSR0MDE2NDY2MTY2MDICXzQEDHByb3h5QXNzZXRJZAgFDSR0MDE2NDY2MTY2MDICXzUEDHByb3h5UmF0ZU11bAgFDSR0MDE2NDY2MTY2MDICXzYEFHN0YWtpbmdQcm9maXRBZGRyZXNzCAUNJHQwMTY0NjYxNjYwMgJfNwMFCmlzTGVhc2FibGUEF25ld1RvdGFsTGVhc2FibGVCYWxhbmNlCQCWAwEJAMwIAgAACQDMCAIJAGUCCQBlAgkBDWdldEFjY0JhbGFuY2UBBQdhc3NldElkBQlnZXRBbW91bnQFCm1pbkJhbGFuY2UFA25pbAMJAAACBRduZXdUb3RhbExlYXNhYmxlQmFsYW5jZQUXbmV3VG90YWxMZWFzYWJsZUJhbGFuY2UEFG5ld0FkZGl0aW9uYWxCYWxhbmNlCQBrAwULbGVhc2VkUmF0aW8FF25ld1RvdGFsTGVhc2FibGVCYWxhbmNlAGQDCQAAAgUUbmV3QWRkaXRpb25hbEJhbGFuY2UFFG5ld0FkZGl0aW9uYWxCYWxhbmNlBA53aXRoZHJhd0Ftb3VudAkAZQIJARpnZXRBZGRpdGlvbmFsQmFsYW5jZU9yWmVybwEFB2Fzc2V0SWQFFG5ld0FkZGl0aW9uYWxCYWxhbmNlAwkAAAIFDndpdGhkcmF3QW1vdW50BQ53aXRoZHJhd0Ftb3VudAMJAGYCAAAFDndpdGhkcmF3QW1vdW50CQEHZGVwb3NpdAQFB2Fzc2V0SWQJAQEtAQUOd2l0aGRyYXdBbW91bnQFDHByb3h5QXNzZXRJZAkBEUBleHRyTmF0aXZlKDEwNjIpAQUMcHJveHlBZGRyZXNzCQEId2l0aGRyYXcGBQdhc3NldElkBQ53aXRoZHJhd0Ftb3VudAUMcHJveHlBc3NldElkCQERQGV4dHJOYXRpdmUoMTA2MikBBQxwcm94eUFkZHJlc3MFDHByb3h5UmF0ZU11bAkBEUBleHRyTmF0aXZlKDEwNjIpAQUUc3Rha2luZ1Byb2ZpdEFkZHJlc3MJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4FA25pbAEXd2l0aGRyYXdBbmRSZWJhbGFuY2VBbGwCFGFtb3VudEFzc2V0T3V0QW1vdW50E3ByaWNlQXNzZXRPdXRBbW91bnQEEkFtQW10V2l0aGRyYXdTdGF0ZQkBGXdpdGhkcmF3QW5kUmViYWxhbmNlQXNzZXQCCQEPZ2V0U3RyaW5nT3JGYWlsAgUEdGhpcwkBAmFhAAUUYW1vdW50QXNzZXRPdXRBbW91bnQEElByQW10V2l0aGRyYXdTdGF0ZQkBGXdpdGhkcmF3QW5kUmViYWxhbmNlQXNzZXQCCQEPZ2V0U3RyaW5nT3JGYWlsAgUEdGhpcwkBAnBhAAUTcHJpY2VBc3NldE91dEFtb3VudAkAzggCBRJBbUFtdFdpdGhkcmF3U3RhdGUFElByQW10V2l0aGRyYXdTdGF0ZQEQcHJpdmF0ZUNhbGNQcmljZQQKYW1Bc3NldERjbQpwckFzc2V0RGNtBWFtQW10BXByQW10BA5hbXRBc3NldEFtdFgxOAkBBXRvWDE4AgUFYW1BbXQFCmFtQXNzZXREY20EEHByaWNlQXNzZXRBbXRYMTgJAQV0b1gxOAIFBXByQW10BQpwckFzc2V0RGNtCQEPY2FsY1ByaWNlQmlnSW50AgUQcHJpY2VBc3NldEFtdFgxOAUOYW10QXNzZXRBbXRYMTgBCmNhbGNQcmljZXMDBWFtQW10BXByQW10BWxwQW10BANjZmcJAQ1nZXRQb29sQ29uZmlnAAQLYW10QXNzZXREY20JAQ1wYXJzZUludFZhbHVlAQkAkQMCBQNjZmcFDmlkeEFtdEFzc2V0RGNtBA1wcmljZUFzc2V0RGNtCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUDY2ZnBRBpZHhQcmljZUFzc2V0RGNtBAhwcmljZVgxOAkBEHByaXZhdGVDYWxjUHJpY2UEBQthbXRBc3NldERjbQUNcHJpY2VBc3NldERjbQUFYW1BbXQFBXByQW10BAhhbUFtdFgxOAkBBXRvWDE4AgUFYW1BbXQFC2FtdEFzc2V0RGNtBAhwckFtdFgxOAkBBXRvWDE4AgUFcHJBbXQFDXByaWNlQXNzZXREY20ECGxwQW10WDE4CQEFdG9YMTgCBQVscEFtdAUGc2NhbGU4BBNscFByaWNlSW5BbUFzc2V0WDE4CQEPY2FsY1ByaWNlQmlnSW50AgUIYW1BbXRYMTgFCGxwQW10WDE4BBNscFByaWNlSW5QckFzc2V0WDE4CQEPY2FsY1ByaWNlQmlnSW50AgUIcHJBbXRYMTgFCGxwQW10WDE4CQDMCAIFCHByaWNlWDE4CQDMCAIFE2xwUHJpY2VJbkFtQXNzZXRYMTgJAMwIAgUTbHBQcmljZUluUHJBc3NldFgxOAUDbmlsAQ9jYWxjdWxhdGVQcmljZXMDBWFtQW10BXByQW10BWxwQW10BAZwcmljZXMJAQpjYWxjUHJpY2VzAwUFYW1BbXQFBXByQW10BQVscEFtdAkAzAgCCQEHZnJvbVgxOAIJAJEDAgUGcHJpY2VzAAAFBnNjYWxlOAkAzAgCCQEHZnJvbVgxOAIJAJEDAgUGcHJpY2VzAAEFBnNjYWxlOAkAzAgCCQEHZnJvbVgxOAIJAJEDAgUGcHJpY2VzAAIFBnNjYWxlOAUDbmlsARRlc3RpbWF0ZUdldE9wZXJhdGlvbgQGdHhJZDU4CnBtdEFzc2V0SWQIcG10THBBbXQLdXNlckFkZHJlc3MEA2NmZwkBDWdldFBvb2xDb25maWcABAlscEFzc2V0SWQJAJEDAgUDY2ZnBRBpZHhQb29sTFBBc3NldElkBAlhbUFzc2V0SWQJAJEDAgUDY2ZnBQ1pZHhBbXRBc3NldElkBAlwckFzc2V0SWQJAJEDAgUDY2ZnBQ9pZHhQcmljZUFzc2V0SWQECmFtQXNzZXREY20JAQ1wYXJzZUludFZhbHVlAQkAkQMCBQNjZmcFDmlkeEFtdEFzc2V0RGNtBApwckFzc2V0RGNtCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUDY2ZnBRBpZHhQcmljZUFzc2V0RGNtBApwb29sU3RhdHVzCQCRAwIFA2NmZwUNaWR4UG9vbFN0YXR1cwQKbHBFbWlzc2lvbggJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkA7AcBCQDZBAEFCWxwQXNzZXRJZAkArAICCQCsAgICBkFzc2V0IAUJbHBBc3NldElkAg4gZG9lc24ndCBleGlzdAhxdWFudGl0eQMJAQIhPQIFCWxwQXNzZXRJZAUKcG10QXNzZXRJZAkAAgECFUludmFsaWQgYXNzZXQgcGFzc2VkLgQJYW1CYWxhbmNlCQENZ2V0QWNjQmFsYW5jZQEFCWFtQXNzZXRJZAQMYW1CYWxhbmNlWDE4CQEFdG9YMTgCBQlhbUJhbGFuY2UFCmFtQXNzZXREY20ECXByQmFsYW5jZQkBDWdldEFjY0JhbGFuY2UBBQlwckFzc2V0SWQEDHByQmFsYW5jZVgxOAkBBXRvWDE4AgUJcHJCYWxhbmNlBQpwckFzc2V0RGNtBAtjdXJQcmljZVgxOAkBD2NhbGNQcmljZUJpZ0ludAIFDHByQmFsYW5jZVgxOAUMYW1CYWxhbmNlWDE4BAhjdXJQcmljZQkBB2Zyb21YMTgCBQtjdXJQcmljZVgxOAUGc2NhbGU4BAtwbXRMcEFtdFgxOAkBBXRvWDE4AgUIcG10THBBbXQFBnNjYWxlOAQNbHBFbWlzc2lvblgxOAkBBXRvWDE4AgUKbHBFbWlzc2lvbgUGc2NhbGU4BAtvdXRBbUFtdFgxOAkAvAIDBQxhbUJhbGFuY2VYMTgFC3BtdExwQW10WDE4BQ1scEVtaXNzaW9uWDE4BAtvdXRQckFtdFgxOAkAvAIDBQxwckJhbGFuY2VYMTgFC3BtdExwQW10WDE4BQ1scEVtaXNzaW9uWDE4BAhvdXRBbUFtdAkBDGZyb21YMThSb3VuZAMFC291dEFtQW10WDE4BQphbUFzc2V0RGNtBQVGTE9PUgQIb3V0UHJBbXQJAQxmcm9tWDE4Um91bmQDBQtvdXRQckFtdFgxOAUKcHJBc3NldERjbQUFRkxPT1IEBXN0YXRlAwkAAAIFBnR4SWQ1OAIABQNuaWwJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwULdXNlckFkZHJlc3MFCG91dEFtQW10AwkAAAIFCWFtQXNzZXRJZAIFV0FWRVMFBHVuaXQJANkEAQUJYW1Bc3NldElkCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFC3VzZXJBZGRyZXNzBQhvdXRQckFtdAMJAAACBQlwckFzc2V0SWQCBVdBVkVTBQR1bml0CQDZBAEFCXByQXNzZXRJZAkAzAgCCQELU3RyaW5nRW50cnkCCQEDZ2F1AgkApQgBBQt1c2VyQWRkcmVzcwUGdHhJZDU4CQERZGF0YUdldEFjdGlvbkluZm8GBQhvdXRBbUFtdAUIb3V0UHJBbXQFCHBtdExwQW10BQhjdXJQcmljZQUGaGVpZ2h0CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAnBsAAUIY3VyUHJpY2UJAMwIAgkBDEludGVnZXJFbnRyeQIJAQJwaAIFBmhlaWdodAgFCWxhc3RCbG9jawl0aW1lc3RhbXAFCGN1clByaWNlBQNuaWwJAJwKCgUIb3V0QW1BbXQFCG91dFByQW10BQlhbUFzc2V0SWQFCXByQXNzZXRJZAUJYW1CYWxhbmNlBQlwckJhbGFuY2UFCmxwRW1pc3Npb24FC2N1clByaWNlWDE4BQpwb29sU3RhdHVzBQVzdGF0ZQEUZXN0aW1hdGVQdXRPcGVyYXRpb24JBnR4SWQ1OBFzbGlwcGFnZVRvbGVyYW5jZQxpbkFtQXNzZXRBbXQLaW5BbUFzc2V0SWQMaW5QckFzc2V0QW10C2luUHJBc3NldElkC3VzZXJBZGRyZXNzCmlzRXZhbHVhdGUGZW1pdExwBANjZmcJAQ1nZXRQb29sQ29uZmlnAAQJbHBBc3NldElkCQDZBAEJAJEDAgUDY2ZnBRBpZHhQb29sTFBBc3NldElkBAxhbUFzc2V0SWRTdHIJAJEDAgUDY2ZnBQ1pZHhBbXRBc3NldElkBAxwckFzc2V0SWRTdHIJAJEDAgUDY2ZnBQ9pZHhQcmljZUFzc2V0SWQEC2lBbXRBc3NldElkCQCRAwIFA2NmZwUOaWR4SUFtdEFzc2V0SWQEDWlQcmljZUFzc2V0SWQJAJEDAgUDY2ZnBRBpZHhJUHJpY2VBc3NldElkBAthbXRBc3NldERjbQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFA2NmZwUOaWR4QW10QXNzZXREY20EDXByaWNlQXNzZXREY20JAQ1wYXJzZUludFZhbHVlAQkAkQMCBQNjZmcFEGlkeFByaWNlQXNzZXREY20ECnBvb2xTdGF0dXMJAJEDAgUDY2ZnBQ1pZHhQb29sU3RhdHVzBApscEVtaXNzaW9uCAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDsBwEFCWxwQXNzZXRJZAkArAICCQCsAgICBkFzc2V0IAkA2AQBBQlscEFzc2V0SWQCDiBkb2Vzbid0IGV4aXN0CHF1YW50aXR5BA5pbkFtQXNzZXRJZFN0cgkA2AQBCQELdmFsdWVPckVsc2UCBQtpbkFtQXNzZXRJZAkA2QQBAgVXQVZFUwQOaW5QckFzc2V0SWRTdHIJANgEAQkBC3ZhbHVlT3JFbHNlAgULaW5QckFzc2V0SWQJANkEAQIFV0FWRVMDAwkBAiE9AgUMYW1Bc3NldElkU3RyBQ5pbkFtQXNzZXRJZFN0cgYJAQIhPQIFDHByQXNzZXRJZFN0cgUOaW5QckFzc2V0SWRTdHIJAAIBAiJJbnZhbGlkIGFtdCBvciBwcmljZSBhc3NldCBwYXNzZWQuBAlhbUJhbGFuY2UDBQppc0V2YWx1YXRlCQENZ2V0QWNjQmFsYW5jZQEFDGFtQXNzZXRJZFN0cgkAZQIJAQ1nZXRBY2NCYWxhbmNlAQUMYW1Bc3NldElkU3RyBQxpbkFtQXNzZXRBbXQECXByQmFsYW5jZQMFCmlzRXZhbHVhdGUJAQ1nZXRBY2NCYWxhbmNlAQUMcHJBc3NldElkU3RyCQBlAgkBDWdldEFjY0JhbGFuY2UBBQxwckFzc2V0SWRTdHIFDGluUHJBc3NldEFtdAQPaW5BbUFzc2V0QW10WDE4CQEFdG9YMTgCBQxpbkFtQXNzZXRBbXQFC2FtdEFzc2V0RGNtBA9pblByQXNzZXRBbXRYMTgJAQV0b1gxOAIFDGluUHJBc3NldEFtdAUNcHJpY2VBc3NldERjbQQMdXNlclByaWNlWDE4CQEPY2FsY1ByaWNlQmlnSW50AgUPaW5QckFzc2V0QW10WDE4BQ9pbkFtQXNzZXRBbXRYMTgEDGFtQmFsYW5jZVgxOAkBBXRvWDE4AgUJYW1CYWxhbmNlBQthbXRBc3NldERjbQQMcHJCYWxhbmNlWDE4CQEFdG9YMTgCBQlwckJhbGFuY2UFDXByaWNlQXNzZXREY20EA3JlcwMJAAACBQpscEVtaXNzaW9uAAAEC2N1clByaWNlWDE4BQp6ZXJvQmlnSW50BAtzbGlwcGFnZVgxOAUKemVyb0JpZ0ludAQIbHBBbXRYMTgJAHYGCQC5AgIFD2luQW1Bc3NldEFtdFgxOAUPaW5QckFzc2V0QW10WDE4AAAJALYCAQAFAAEAAAUERE9XTgkAlwoFCQEHZnJvbVgxOAIFCGxwQW10WDE4BQZzY2FsZTgJAQdmcm9tWDE4AgUPaW5BbUFzc2V0QW10WDE4BQthbXRBc3NldERjbQkBB2Zyb21YMTgCBQ9pblByQXNzZXRBbXRYMTgFDXByaWNlQXNzZXREY20JAQ9jYWxjUHJpY2VCaWdJbnQCCQC3AgIFDHByQmFsYW5jZVgxOAUPaW5QckFzc2V0QW10WDE4CQC3AgIFDGFtQmFsYW5jZVgxOAUPaW5BbUFzc2V0QW10WDE4BQtzbGlwcGFnZVgxOAQLY3VyUHJpY2VYMTgJAQ9jYWxjUHJpY2VCaWdJbnQCBQxwckJhbGFuY2VYMTgFDGFtQmFsYW5jZVgxOAQLc2xpcHBhZ2VYMTgJALwCAwkBCWFic0JpZ0ludAEJALgCAgULY3VyUHJpY2VYMTgFDHVzZXJQcmljZVgxOAUHc2NhbGUxOAULY3VyUHJpY2VYMTgEFHNsaXBwYWdlVG9sZXJhbmNlWDE4CQEFdG9YMTgCBRFzbGlwcGFnZVRvbGVyYW5jZQUGc2NhbGU4AwMJAQIhPQIFC2N1clByaWNlWDE4BQp6ZXJvQmlnSW50CQC/AgIFC3NsaXBwYWdlWDE4BRRzbGlwcGFnZVRvbGVyYW5jZVgxOAcJAAIBCQCsAgIJAKwCAgkArAICAg9QcmljZSBzbGlwcGFnZSAJAKYDAQULc2xpcHBhZ2VYMTgCHiBleGNlZWRlZCB0aGUgcGFzc2VkIGxpbWl0IG9mIAkApgMBBRRzbGlwcGFnZVRvbGVyYW5jZVgxOAQNbHBFbWlzc2lvblgxOAkBBXRvWDE4AgUKbHBFbWlzc2lvbgUGc2NhbGU4BApwclZpYUFtWDE4CQC9AgQFD2luQW1Bc3NldEFtdFgxOAkBFGNhbGNQcmljZUJpZ0ludFJvdW5kAwUMcHJCYWxhbmNlWDE4BQxhbUJhbGFuY2VYMTgFB0NFSUxJTkcFB3NjYWxlMTgFB0NFSUxJTkcECmFtVmlhUHJYMTgJAL0CBAUPaW5QckFzc2V0QW10WDE4BQdzY2FsZTE4CQEUY2FsY1ByaWNlQmlnSW50Um91bmQDBQxwckJhbGFuY2VYMTgFDGFtQmFsYW5jZVgxOAUFRkxPT1IFB0NFSUxJTkcEDGV4cGVjdGVkQW10cwMJAL8CAgUKcHJWaWFBbVgxOAUPaW5QckFzc2V0QW10WDE4CQCUCgIFCmFtVmlhUHJYMTgFD2luUHJBc3NldEFtdFgxOAkAlAoCBQ9pbkFtQXNzZXRBbXRYMTgFCnByVmlhQW1YMTgEEWV4cEFtdEFzc2V0QW10WDE4CAUMZXhwZWN0ZWRBbXRzAl8xBBNleHBQcmljZUFzc2V0QW10WDE4CAUMZXhwZWN0ZWRBbXRzAl8yBAhscEFtdFgxOAkAvQIEBQ1scEVtaXNzaW9uWDE4BRNleHBQcmljZUFzc2V0QW10WDE4BQxwckJhbGFuY2VYMTgFBUZMT09SCQCXCgUJAQxmcm9tWDE4Um91bmQDBQhscEFtdFgxOAUGc2NhbGU4BQVGTE9PUgkBDGZyb21YMThSb3VuZAMFEWV4cEFtdEFzc2V0QW10WDE4BQthbXRBc3NldERjbQUHQ0VJTElORwkBDGZyb21YMThSb3VuZAMFE2V4cFByaWNlQXNzZXRBbXRYMTgFDXByaWNlQXNzZXREY20FB0NFSUxJTkcFC2N1clByaWNlWDE4BQtzbGlwcGFnZVgxOAQJY2FsY0xwQW10CAUDcmVzAl8xBA5jYWxjQW1Bc3NldFBtdAgFA3JlcwJfMgQOY2FsY1ByQXNzZXRQbXQIBQNyZXMCXzMECGN1clByaWNlCQEHZnJvbVgxOAIIBQNyZXMCXzQFBnNjYWxlOAQMc2xpcHBhZ2VDYWxjCQEHZnJvbVgxOAIIBQNyZXMCXzUFBnNjYWxlOAMJAGcCAAAFCWNhbGNMcEFtdAkAAgECNkludmFsaWQgY2FsY3VsYXRpb25zLiBMUCBjYWxjdWxhdGVkIGlzIGxlc3MgdGhhbiB6ZXJvLgQJZW1pdExwQW10AwkBASEBBQZlbWl0THAAAAUJY2FsY0xwQW10BAZhbURpZmYJAGUCBQxpbkFtQXNzZXRBbXQFDmNhbGNBbUFzc2V0UG10BAZwckRpZmYJAGUCBQxpblByQXNzZXRBbXQFDmNhbGNQckFzc2V0UG10BAtjb21tb25TdGF0ZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAnBsAAUIY3VyUHJpY2UJAMwIAgkBDEludGVnZXJFbnRyeQIJAQJwaAIFBmhlaWdodAgFCWxhc3RCbG9jawl0aW1lc3RhbXAFCGN1clByaWNlCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQNwYXUCBQt1c2VyQWRkcmVzcwUGdHhJZDU4CQERZGF0YVB1dEFjdGlvbkluZm8KBQ5jYWxjQW1Bc3NldFBtdAUOY2FsY1ByQXNzZXRQbXQFCWVtaXRMcEFtdAUIY3VyUHJpY2UFEXNsaXBwYWdlVG9sZXJhbmNlBQxzbGlwcGFnZUNhbGMFBmhlaWdodAgFCWxhc3RCbG9jawl0aW1lc3RhbXAFBmFtRGlmZgUGcHJEaWZmBQNuaWwJAJ8KDQUJY2FsY0xwQW10BQllbWl0THBBbXQFCGN1clByaWNlBQlhbUJhbGFuY2UFCXByQmFsYW5jZQUKbHBFbWlzc2lvbgUJbHBBc3NldElkBQpwb29sU3RhdHVzBQtjb21tb25TdGF0ZQUGYW1EaWZmBQZwckRpZmYFC2luQW1Bc3NldElkBQtpblByQXNzZXRJZAEHY2FsY0tMcAMNYW1vdW50QmFsYW5jZQxwcmljZUJhbGFuY2UKbHBFbWlzc2lvbgQQYW1vdW50QmFsYW5jZVgxOAkBC3RvWDE4QmlnSW50AgUNYW1vdW50QmFsYW5jZQkAtgIBBRZjZmdBbW91bnRBc3NldERlY2ltYWxzBA9wcmljZUJhbGFuY2VYMTgJAQt0b1gxOEJpZ0ludAIFDHByaWNlQmFsYW5jZQkAtgIBBRVjZmdQcmljZUFzc2V0RGVjaW1hbHMECnVwZGF0ZWRLTHAJALwCAwkAdgYJALkCAgUQYW1vdW50QmFsYW5jZVgxOAUPcHJpY2VCYWxhbmNlWDE4AAAJALYCAQAFAAEAEgUERE9XTgUEYmlnMQUKbHBFbWlzc2lvbgMJAAACBQpscEVtaXNzaW9uBQRiaWcwBQRiaWcwBQp1cGRhdGVkS0xwAQ5jYWxjQ3VycmVudEtMcAMQYW1vdW50QXNzZXREZWx0YQ9wcmljZUFzc2V0RGVsdGEUbHBBc3NldEVtaXNzaW9uRGVsdGEEEmFtb3VudEFzc2V0QmFsYW5jZQkAuAICCQC2AgEJAQ1nZXRBY2NCYWxhbmNlAQkBD2Fzc2V0SWRUb1N0cmluZwEFEGNmZ0Ftb3VudEFzc2V0SWQFEGFtb3VudEFzc2V0RGVsdGEEEXByaWNlQXNzZXRCYWxhbmNlCQC4AgIJALYCAQkBDWdldEFjY0JhbGFuY2UBCQEPYXNzZXRJZFRvU3RyaW5nAQUPY2ZnUHJpY2VBc3NldElkBQ9wcmljZUFzc2V0RGVsdGEED2xwQXNzZXRFbWlzc2lvbgkAuAICCQC2AgEICQEFdmFsdWUBCQDsBwEFDGNmZ0xwQXNzZXRJZAhxdWFudGl0eQUUbHBBc3NldEVtaXNzaW9uRGVsdGEECmN1cnJlbnRLTHAJAQdjYWxjS0xwAwUSYW1vdW50QXNzZXRCYWxhbmNlBRFwcmljZUFzc2V0QmFsYW5jZQUPbHBBc3NldEVtaXNzaW9uBQpjdXJyZW50S0xwARJyZWZyZXNoS0xwSW50ZXJuYWwDF2Ftb3VudEFzc2V0QmFsYW5jZURlbHRhFnByaWNlQXNzZXRCYWxhbmNlRGVsdGEUbHBBc3NldEVtaXNzaW9uRGVsdGEEEmFtb3VudEFzc2V0QmFsYW5jZQkAZAIJAQ1nZXRBY2NCYWxhbmNlAQkBD2Fzc2V0SWRUb1N0cmluZwEFEGNmZ0Ftb3VudEFzc2V0SWQFF2Ftb3VudEFzc2V0QmFsYW5jZURlbHRhBBFwcmljZUFzc2V0QmFsYW5jZQkAZAIJAQ1nZXRBY2NCYWxhbmNlAQkBD2Fzc2V0SWRUb1N0cmluZwEFD2NmZ1ByaWNlQXNzZXRJZAUWcHJpY2VBc3NldEJhbGFuY2VEZWx0YQQPbHBBc3NldEVtaXNzaW9uCQBkAggJAQV2YWx1ZQEJAOwHAQUMY2ZnTHBBc3NldElkCHF1YW50aXR5BRRscEFzc2V0RW1pc3Npb25EZWx0YQQKdXBkYXRlZEtMcAkBB2NhbGNLTHADCQC2AgEFEmFtb3VudEFzc2V0QmFsYW5jZQkAtgIBBRFwcmljZUFzc2V0QmFsYW5jZQkAtgIBBQ9scEFzc2V0RW1pc3Npb24EB2FjdGlvbnMJAMwIAgkBDEludGVnZXJFbnRyeQIFFWtleUtMcFJlZnJlc2hlZEhlaWdodAUGaGVpZ2h0CQDMCAIJAQtTdHJpbmdFbnRyeQIFBmtleUtMcAkApgMBBQp1cGRhdGVkS0xwBQNuaWwJAJQKAgUHYWN0aW9ucwUKdXBkYXRlZEtMcAETc2tpcE9yZGVyVmFsaWRhdGlvbgAJAQt2YWx1ZU9yRWxzZQIJAJsIAgUPZmFjdG9yeUNvbnRyYWN0CQEWa2V5U2tpcE9yZGVyVmFsaWRhdGlvbgEJAKUIAQUEdGhpcwcBEnZhbGlkYXRlVXBkYXRlZEtMcAIGb2xkS0xwCnVwZGF0ZWRLTHADCQDAAgIFCnVwZGF0ZWRLTHAFBm9sZEtMcAYJAQh0aHJvd0VycgEJALkJAgkAzAgCAiJ1cGRhdGVkIEtMcCBsb3dlciB0aGFuIGN1cnJlbnQgS0xwCQDMCAIJAKYDAQUGb2xkS0xwCQDMCAIJAKYDAQUKdXBkYXRlZEtMcAUDbmlsAgEgARt2YWxpZGF0ZU1hdGNoZXJPcmRlckFsbG93ZWQBBW9yZGVyBBJhbW91bnRBc3NldEJhbGFuY2UJAQ1nZXRBY2NCYWxhbmNlAQkBD2Fzc2V0SWRUb1N0cmluZwEFEGNmZ0Ftb3VudEFzc2V0SWQEEXByaWNlQXNzZXRCYWxhbmNlCQENZ2V0QWNjQmFsYW5jZQEJAQ9hc3NldElkVG9TdHJpbmcBBQ9jZmdQcmljZUFzc2V0SWQEEWFtb3VudEFzc2V0QW1vdW50CAUFb3JkZXIGYW1vdW50BBBwcmljZUFzc2V0QW1vdW50CQBuBAgFBW9yZGVyBmFtb3VudAgFBW9yZGVyBXByaWNlBQZzY2FsZTgFBUZMT09SBA0kdDAyODk5MTI5MjAzAwkAAAIIBQVvcmRlcglvcmRlclR5cGUFA0J1eQkAlAoCBRFhbW91bnRBc3NldEFtb3VudAkBAS0BBRBwcmljZUFzc2V0QW1vdW50CQCUCgIJAQEtAQURYW1vdW50QXNzZXRBbW91bnQFEHByaWNlQXNzZXRBbW91bnQEF2Ftb3VudEFzc2V0QmFsYW5jZURlbHRhCAUNJHQwMjg5OTEyOTIwMwJfMQQWcHJpY2VBc3NldEJhbGFuY2VEZWx0YQgFDSR0MDI4OTkxMjkyMDMCXzIDAwMJARBpc0dsb2JhbFNodXRkb3duAAYJAAACBQ1jZmdQb29sU3RhdHVzBRNQb29sTWF0Y2hlckRpc2FibGVkBgkAAAIFDWNmZ1Bvb2xTdGF0dXMFDFBvb2xTaHV0ZG93bgkAAgECHEV4Y2hhbmdlIG9wZXJhdGlvbnMgZGlzYWJsZWQDAwkBAiE9AggIBQVvcmRlcglhc3NldFBhaXILYW1vdW50QXNzZXQFEGNmZ0Ftb3VudEFzc2V0SWQGCQECIT0CCAgFBW9yZGVyCWFzc2V0UGFpcgpwcmljZUFzc2V0BQ9jZmdQcmljZUFzc2V0SWQJAAIBAhNXcm9uZyBvcmRlciBhc3NldHMuBANrTHAJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAqAMBCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMFBmtleUtMcAIBMAkBBmZtdEVycgECC2ludmFsaWQga0xwBA0kdDAyOTY0MzI5NzQzCQEScmVmcmVzaEtMcEludGVybmFsAwUXYW1vdW50QXNzZXRCYWxhbmNlRGVsdGEFFnByaWNlQXNzZXRCYWxhbmNlRGVsdGEAAAQNdW51c2VkQWN0aW9ucwgFDSR0MDI5NjQzMjk3NDMCXzEEBmtMcE5ldwgFDSR0MDI5NjQzMjk3NDMCXzIEDGlzT3JkZXJWYWxpZAkAwAICBQZrTHBOZXcFA2tMcAQEaW5mbwkAuQkCCQDMCAICBGtMcD0JAMwIAgkApgMBBQNrTHAJAMwIAgIIIGtMcE5ldz0JAMwIAgkApgMBBQZrTHBOZXcJAMwIAgIUIGFtb3VudEFzc2V0QmFsYW5jZT0JAMwIAgkApAMBBRJhbW91bnRBc3NldEJhbGFuY2UJAMwIAgITIHByaWNlQXNzZXRCYWxhbmNlPQkAzAgCCQCkAwEFEXByaWNlQXNzZXRCYWxhbmNlCQDMCAICGSBhbW91bnRBc3NldEJhbGFuY2VEZWx0YT0JAMwIAgkApAMBBRdhbW91bnRBc3NldEJhbGFuY2VEZWx0YQkAzAgCAhggcHJpY2VBc3NldEJhbGFuY2VEZWx0YT0JAMwIAgkApAMBBRZwcmljZUFzc2V0QmFsYW5jZURlbHRhCQDMCAICCCBoZWlnaHQ9CQDMCAIJAKQDAQUGaGVpZ2h0BQNuaWwCAAkAlAoCBQxpc09yZGVyVmFsaWQFBGluZm8BCWNvbW1vbkdldAEBaQMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECHWV4YWN0bHkgMSBwYXltZW50IGlzIGV4cGVjdGVkBANwbXQJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAQKcG10QXNzZXRJZAkBBXZhbHVlAQgFA3BtdAdhc3NldElkBAZwbXRBbXQIBQNwbXQGYW1vdW50BANyZXMJARRlc3RpbWF0ZUdldE9wZXJhdGlvbgQJANgEAQgFAWkNdHJhbnNhY3Rpb25JZAkA2AQBBQpwbXRBc3NldElkBQZwbXRBbXQIBQFpBmNhbGxlcgQIb3V0QW1BbXQIBQNyZXMCXzEECG91dFByQW10CAUDcmVzAl8yBApwb29sU3RhdHVzCQENcGFyc2VJbnRWYWx1ZQEIBQNyZXMCXzkEBXN0YXRlCAUDcmVzA18xMAMDCQEQaXNHbG9iYWxTaHV0ZG93bgAGCQAAAgUKcG9vbFN0YXR1cwUMUG9vbFNodXRkb3duCQACAQkArAICAixHZXQgb3BlcmF0aW9uIGlzIGJsb2NrZWQgYnkgYWRtaW4uIFN0YXR1cyA9IAkApAMBBQpwb29sU3RhdHVzCQCXCgUFCG91dEFtQW10BQhvdXRQckFtdAUGcG10QW10BQpwbXRBc3NldElkBQVzdGF0ZQEJY29tbW9uUHV0AwFpEXNsaXBwYWdlVG9sZXJhbmNlBmVtaXRMcAMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAgkAAgECH2V4YWN0bHkgMiBwYXltZW50cyBhcmUgZXhwZWN0ZWQECmFtQXNzZXRQbXQJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAQKcHJBc3NldFBtdAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwABBAZlc3RQdXQJARRlc3RpbWF0ZVB1dE9wZXJhdGlvbgkJANgEAQgFAWkNdHJhbnNhY3Rpb25JZAURc2xpcHBhZ2VUb2xlcmFuY2UIBQphbUFzc2V0UG10BmFtb3VudAgFCmFtQXNzZXRQbXQHYXNzZXRJZAgFCnByQXNzZXRQbXQGYW1vdW50CAUKcHJBc3NldFBtdAdhc3NldElkCQClCAEIBQFpBmNhbGxlcgcFBmVtaXRMcAQKcG9vbFN0YXR1cwkBDXBhcnNlSW50VmFsdWUBCAUGZXN0UHV0Al84AwMDCQEQaXNHbG9iYWxTaHV0ZG93bgAGCQAAAgUKcG9vbFN0YXR1cwUPUG9vbFB1dERpc2FibGVkBgkAAAIFCnBvb2xTdGF0dXMFDFBvb2xTaHV0ZG93bgkAAgEJAKwCAgIsUHV0IG9wZXJhdGlvbiBpcyBibG9ja2VkIGJ5IGFkbWluLiBTdGF0dXMgPSAJAKQDAQUKcG9vbFN0YXR1cwUGZXN0UHV0AQRlbWl0AQZhbW91bnQEB2VtaXRJbnYJAPwHBAUPZmFjdG9yeUNvbnRyYWN0AgRlbWl0CQDMCAIFBmFtb3VudAUDbmlsBQNuaWwDCQAAAgUHZW1pdEludgUHZW1pdEludgQNZW1pdEludkxlZ2FjeQQHJG1hdGNoMAUHZW1pdEludgMJAAECBQckbWF0Y2gwAgdBZGRyZXNzBBVsZWdhY3lGYWN0b3J5Q29udHJhY3QFByRtYXRjaDAJAPwHBAUVbGVnYWN5RmFjdG9yeUNvbnRyYWN0AgRlbWl0CQDMCAIFBmFtb3VudAUDbmlsBQNuaWwFBHVuaXQDCQAAAgUNZW1pdEludkxlZ2FjeQUNZW1pdEludkxlZ2FjeQUGYW1vdW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQd0YWtlRmVlAgZhbW91bnQDZmVlBAlmZWVBbW91bnQDCQAAAgUDZmVlAAAAAAkAawMFBmFtb3VudAUDZmVlBQZzY2FsZTgJAJQKAgkAZQIFBmFtb3VudAUJZmVlQW1vdW50BQlmZWVBbW91bnQBD2NhbGNQdXRPbmVUb2tlbgQQcGF5bWVudEFtb3VudFJhdw5wYXltZW50QXNzZXRJZAt1c2VyQWRkcmVzcwR0eElkBAZpc0V2YWwJAAACBQR0eElkBQR1bml0BBBhbW91bnRCYWxhbmNlUmF3CQENZ2V0QWNjQmFsYW5jZQEJAQ9hc3NldElkVG9TdHJpbmcBBRBjZmdBbW91bnRBc3NldElkBA9wcmljZUJhbGFuY2VSYXcJAQ1nZXRBY2NCYWxhbmNlAQkBD2Fzc2V0SWRUb1N0cmluZwEFD2NmZ1ByaWNlQXNzZXRJZAQUcGF5bWVudEluQW1vdW50QXNzZXQDCQAAAgUOcGF5bWVudEFzc2V0SWQFEGNmZ0Ftb3VudEFzc2V0SWQGAwkAAAIFDnBheW1lbnRBc3NldElkBQ9jZmdQcmljZUFzc2V0SWQHCQEIdGhyb3dFcnIBAg1pbnZhbGlkIGFzc2V0BA0kdDAzMjg1NjMzMTQ5AwUGaXNFdmFsCQCUCgIFEGFtb3VudEJhbGFuY2VSYXcFD3ByaWNlQmFsYW5jZVJhdwMFFHBheW1lbnRJbkFtb3VudEFzc2V0CQCUCgIJAGUCBRBhbW91bnRCYWxhbmNlUmF3BRBwYXltZW50QW1vdW50UmF3BQ9wcmljZUJhbGFuY2VSYXcJAJQKAgUQYW1vdW50QmFsYW5jZVJhdwkAZQIFD3ByaWNlQmFsYW5jZVJhdwUQcGF5bWVudEFtb3VudFJhdwQQYW1vdW50QmFsYW5jZU9sZAgFDSR0MDMyODU2MzMxNDkCXzEED3ByaWNlQmFsYW5jZU9sZAgFDSR0MDMyODU2MzMxNDkCXzIEDSR0MDMzMTUzMzMzMDIDBRRwYXltZW50SW5BbW91bnRBc3NldAkAlAoCBRBwYXltZW50QW1vdW50UmF3AAAJAJQKAgAABRBwYXltZW50QW1vdW50UmF3BBRhbW91bnRBc3NldEFtb3VudFJhdwgFDSR0MDMzMTUzMzMzMDICXzEEE3ByaWNlQXNzZXRBbW91bnRSYXcIBQ0kdDAzMzE1MzMzMzAyAl8yBBFhbW91bnRBc3NldEFtb3VudAgJAQd0YWtlRmVlAgUUYW1vdW50QXNzZXRBbW91bnRSYXcFBWluRmVlAl8xBBBwcmljZUFzc2V0QW1vdW50CAkBB3Rha2VGZWUCBRNwcmljZUFzc2V0QW1vdW50UmF3BQVpbkZlZQJfMQQNJHQwMzM0MzQzMzQ5OAkBB3Rha2VGZWUCBRBwYXltZW50QW1vdW50UmF3BQVpbkZlZQQNcGF5bWVudEFtb3VudAgFDSR0MDMzNDM0MzM0OTgCXzEECWZlZUFtb3VudAgFDSR0MDMzNDM0MzM0OTgCXzIEEGFtb3VudEJhbGFuY2VOZXcJAGQCBRBhbW91bnRCYWxhbmNlT2xkBRFhbW91bnRBc3NldEFtb3VudAQPcHJpY2VCYWxhbmNlTmV3CQBkAgUPcHJpY2VCYWxhbmNlT2xkBRBwcmljZUFzc2V0QW1vdW50BAtwcmljZU5ld1gxOAkBD2NhbGNQcmljZUJpZ0ludAIJAQV0b1gxOAIFD3ByaWNlQmFsYW5jZU5ldwUVY2ZnUHJpY2VBc3NldERlY2ltYWxzCQEFdG9YMTgCBRBhbW91bnRCYWxhbmNlTmV3BRZjZmdBbW91bnRBc3NldERlY2ltYWxzBAhwcmljZU5ldwkBB2Zyb21YMTgCBQtwcmljZU5ld1gxOAUGc2NhbGU4BA5wYXltZW50QmFsYW5jZQMFFHBheW1lbnRJbkFtb3VudEFzc2V0BRBhbW91bnRCYWxhbmNlT2xkBQ9wcmljZUJhbGFuY2VPbGQEFHBheW1lbnRCYWxhbmNlQmlnSW50CQC2AgEFDnBheW1lbnRCYWxhbmNlBAxzdXBwbHlCaWdJbnQJALYCAQgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkA7AcBBQxjZmdMcEFzc2V0SWQJAKwCAgkArAICAgZhc3NldCAJANgEAQUMY2ZnTHBBc3NldElkAg4gZG9lc24ndCBleGlzdAhxdWFudGl0eQQLY2hlY2hTdXBwbHkDCQC/AgIFDHN1cHBseUJpZ0ludAUEYmlnMAYJAQh0aHJvd0VycgECImluaXRpYWwgZGVwb3NpdCByZXF1aXJlcyBhbGwgY29pbnMDCQAAAgULY2hlY2hTdXBwbHkFC2NoZWNoU3VwcGx5BA1kZXBvc2l0QmlnSW50CQC2AgEFDXBheW1lbnRBbW91bnQEC2lzc3VlQW1vdW50CQCWAwEJAMwIAgAACQDMCAIJAKADAQkAugICCQC5AgIFDHN1cHBseUJpZ0ludAkAuAICCQEKc3FydEJpZ0ludAQJALcCAgUHc2NhbGUxOAkAugICCQC5AgIFDWRlcG9zaXRCaWdJbnQFB3NjYWxlMTgFFHBheW1lbnRCYWxhbmNlQmlnSW50ABIAEgUERE9XTgUHc2NhbGUxOAUHc2NhbGUxOAUDbmlsBAtjb21tb25TdGF0ZQMFBmlzRXZhbAUDbmlsCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECcGwABQhwcmljZU5ldwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAnBoAgUGaGVpZ2h0CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAUIcHJpY2VOZXcJAMwIAgkBC1N0cmluZ0VudHJ5AgkBA3BhdQIJAKUIAQkBBXZhbHVlAQULdXNlckFkZHJlc3MJANgEAQkBBXZhbHVlAQUEdHhJZAkBEWRhdGFQdXRBY3Rpb25JbmZvCgUUYW1vdW50QXNzZXRBbW91bnRSYXcFE3ByaWNlQXNzZXRBbW91bnRSYXcFC2lzc3VlQW1vdW50BQhwcmljZU5ldwAAAAAFBmhlaWdodAgFCWxhc3RCbG9jawl0aW1lc3RhbXAAAAAABQNuaWwEC3ByaWNlT2xkWDE4CQEPY2FsY1ByaWNlQmlnSW50AgkBBXRvWDE4AgUPcHJpY2VCYWxhbmNlT2xkBRVjZmdQcmljZUFzc2V0RGVjaW1hbHMJAQV0b1gxOAIFEGFtb3VudEJhbGFuY2VPbGQFFmNmZ0Ftb3VudEFzc2V0RGVjaW1hbHMECHByaWNlT2xkCQEHZnJvbVgxOAIFC3ByaWNlT2xkWDE4BQZzY2FsZTgEBGxvc3MEDSR0MDM1MTc5MzUzNDYDBRRwYXltZW50SW5BbW91bnRBc3NldAkAlAoCBRRhbW91bnRBc3NldEFtb3VudFJhdwUQYW1vdW50QmFsYW5jZU9sZAkAlAoCBRNwcmljZUFzc2V0QW1vdW50UmF3BQ9wcmljZUJhbGFuY2VPbGQEBmFtb3VudAgFDSR0MDM1MTc5MzUzNDYCXzEEB2JhbGFuY2UIBQ0kdDAzNTE3OTM1MzQ2Al8yBA9pc3N1ZUFtb3VudEJvdGgJAKADAQkAvAIDBQxzdXBwbHlCaWdJbnQJALYCAQkAaQIFBmFtb3VudAACCQC2AgEFB2JhbGFuY2UJAGsDCQBlAgULaXNzdWVBbW91bnQFD2lzc3VlQW1vdW50Qm90aAUGc2NhbGU4BQ9pc3N1ZUFtb3VudEJvdGgJAJcKBQULaXNzdWVBbW91bnQFC2NvbW1vblN0YXRlBQlmZWVBbW91bnQFBGxvc3MFFHBheW1lbnRJbkFtb3VudEFzc2V0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQ9jYWxjR2V0T25lVG9rZW4FCm91dEFzc2V0SWQNcGF5bWVudEFtb3VudA5wYXltZW50QXNzZXRJZAt1c2VyQWRkcmVzcwR0eElkBAZpc0V2YWwJAAACBQR0eElkBQR1bml0BANjZmcJAQ1nZXRQb29sQ29uZmlnAAQLYW10QXNzZXREY20JAQ1wYXJzZUludFZhbHVlAQkAkQMCBQNjZmcFDmlkeEFtdEFzc2V0RGNtBA1wcmljZUFzc2V0RGNtCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUDY2ZnBRBpZHhQcmljZUFzc2V0RGNtBAZjaGVja3MJAMwIAgMJAAACBQ5wYXltZW50QXNzZXRJZAUMY2ZnTHBBc3NldElkBgkBCHRocm93RXJyAQIQaW52YWxpZCBscCBhc3NldAUDbmlsAwkAAAIFBmNoZWNrcwUGY2hlY2tzBBBvdXRJbkFtb3VudEFzc2V0AwkAAAIFCm91dEFzc2V0SWQFEGNmZ0Ftb3VudEFzc2V0SWQGAwkAAAIFCm91dEFzc2V0SWQFD2NmZ1ByaWNlQXNzZXRJZAcJAQh0aHJvd0VycgECDWludmFsaWQgYXNzZXQEDWJhbGFuY2VCaWdJbnQDBRBvdXRJbkFtb3VudEFzc2V0CQC2AgEJAQ1nZXRBY2NCYWxhbmNlAQkBD2Fzc2V0SWRUb1N0cmluZwEFEGNmZ0Ftb3VudEFzc2V0SWQJALYCAQkBDWdldEFjY0JhbGFuY2UBCQEPYXNzZXRJZFRvU3RyaW5nAQUPY2ZnUHJpY2VBc3NldElkBBhvdXRJbkFtb3VudEFzc2V0RGVjaW1hbHMDBRBvdXRJbkFtb3VudEFzc2V0BQthbXRBc3NldERjbQUNcHJpY2VBc3NldERjbQQMYW1CYWxhbmNlT2xkCQENZ2V0QWNjQmFsYW5jZQEJAQ9hc3NldElkVG9TdHJpbmcBBRBjZmdBbW91bnRBc3NldElkBAxwckJhbGFuY2VPbGQJAQ1nZXRBY2NCYWxhbmNlAQkBD2Fzc2V0SWRUb1N0cmluZwEFD2NmZ1ByaWNlQXNzZXRJZAQKb3V0QmFsYW5jZQMFEG91dEluQW1vdW50QXNzZXQFDGFtQmFsYW5jZU9sZAUMcHJCYWxhbmNlT2xkBBBvdXRCYWxhbmNlQmlnSW50CQC2AgEFCm91dEJhbGFuY2UEDHN1cHBseUJpZ0ludAkAtgIBCAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDsBwEFDGNmZ0xwQXNzZXRJZAkArAICCQCsAgICBmFzc2V0IAkA2AQBBQxjZmdMcEFzc2V0SWQCDiBkb2Vzbid0IGV4aXN0CHF1YW50aXR5BA5yZWRlZW1lZEJpZ0ludAkAtgIBBQ1wYXltZW50QW1vdW50BAlhbW91bnRSYXcJAJYDAQkAzAgCAAAJAMwIAgkAoAMBCQC6AgIJALkCAgUNYmFsYW5jZUJpZ0ludAkAuAICBQdzY2FsZTE4CQB2BgkAuAICBQdzY2FsZTE4CQC6AgIJALkCAgUOcmVkZWVtZWRCaWdJbnQFB3NjYWxlMTgFDHN1cHBseUJpZ0ludAASBQRiaWcyAAAAEgUERE9XTgUHc2NhbGUxOAUDbmlsBA0kdDAzNzQyNDM3NDgwCQEHdGFrZUZlZQIFCWFtb3VudFJhdwUGb3V0RmVlBAt0b3RhbEFtb3VudAgFDSR0MDM3NDI0Mzc0ODACXzEECWZlZUFtb3VudAgFDSR0MDM3NDI0Mzc0ODACXzIEDSR0MDM3NDg0Mzc3MTADBRBvdXRJbkFtb3VudEFzc2V0CQCWCgQFC3RvdGFsQW1vdW50AAAJAGUCBQxhbUJhbGFuY2VPbGQFCWFtb3VudFJhdwUMcHJCYWxhbmNlT2xkCQCWCgQAAAULdG90YWxBbW91bnQFDGFtQmFsYW5jZU9sZAkAZQIFDHByQmFsYW5jZU9sZAUJYW1vdW50UmF3BAtvdXRBbUFtb3VudAgFDSR0MDM3NDg0Mzc3MTACXzEEC291dFByQW1vdW50CAUNJHQwMzc0ODQzNzcxMAJfMgQMYW1CYWxhbmNlTmV3CAUNJHQwMzc0ODQzNzcxMAJfMwQMcHJCYWxhbmNlTmV3CAUNJHQwMzc0ODQzNzcxMAJfNAQLcHJpY2VOZXdYMTgJAQ9jYWxjUHJpY2VCaWdJbnQCCQEFdG9YMTgCBQxwckJhbGFuY2VOZXcFFWNmZ1ByaWNlQXNzZXREZWNpbWFscwkBBXRvWDE4AgUMYW1CYWxhbmNlTmV3BRZjZmdBbW91bnRBc3NldERlY2ltYWxzBAhwcmljZU5ldwkBB2Zyb21YMTgCBQtwcmljZU5ld1gxOAUGc2NhbGU4BAtjb21tb25TdGF0ZQMFBmlzRXZhbAUDbmlsCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQNnYXUCCQClCAEJAQV2YWx1ZQEFC3VzZXJBZGRyZXNzCQDYBAEJAQV2YWx1ZQEFBHR4SWQJARFkYXRhR2V0QWN0aW9uSW5mbwYFC291dEFtQW1vdW50BQtvdXRQckFtb3VudAUNcGF5bWVudEFtb3VudAUIcHJpY2VOZXcFBmhlaWdodAgFCWxhc3RCbG9jawl0aW1lc3RhbXAJAMwIAgkBDEludGVnZXJFbnRyeQIJAQJwbAAFCHByaWNlTmV3CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECcGgCBQZoZWlnaHQIBQlsYXN0QmxvY2sJdGltZXN0YW1wBQhwcmljZU5ldwUDbmlsBAtwcmljZU9sZFgxOAkBD2NhbGNQcmljZUJpZ0ludAIJAQV0b1gxOAIFDHByQmFsYW5jZU9sZAUVY2ZnUHJpY2VBc3NldERlY2ltYWxzCQEFdG9YMTgCBQxhbUJhbGFuY2VPbGQFFmNmZ0Ftb3VudEFzc2V0RGVjaW1hbHMECHByaWNlT2xkCQEHZnJvbVgxOAIFC3ByaWNlT2xkWDE4BQZzY2FsZTgEBGxvc3MEGGFtb3VudEJvdGhJblBheW1lbnRBc3NldAkAaAIJAKADAQkAvAIDBQ1iYWxhbmNlQmlnSW50BQ5yZWRlZW1lZEJpZ0ludAUMc3VwcGx5QmlnSW50AAIJAGsDCQBlAgULdG90YWxBbW91bnQFGGFtb3VudEJvdGhJblBheW1lbnRBc3NldAUGc2NhbGU4BRhhbW91bnRCb3RoSW5QYXltZW50QXNzZXQJAJcKBQULdG90YWxBbW91bnQFC2NvbW1vblN0YXRlBQlmZWVBbW91bnQFBGxvc3MFEG91dEluQW1vdW50QXNzZXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BFm1hbmFnZXJQdWJsaWNLZXlPclVuaXQABBNtYW5hZ2VyVmF1bHRBZGRyZXNzCQEcZ2V0TWFuYWdlclZhdWx0QWRkcmVzc09yVGhpcwAEByRtYXRjaDAJAJ0IAgUTbWFuYWdlclZhdWx0QWRkcmVzcwkBE2tleU1hbmFnZXJQdWJsaWNLZXkAAwkAAQIFByRtYXRjaDACBlN0cmluZwQBcwUHJG1hdGNoMAkA2QQBBQFzAwkAAQIFByRtYXRjaDACBFVuaXQFBHVuaXQJAAIBAgtNYXRjaCBlcnJvcgEJaXNNYW5hZ2VyAQFpBAckbWF0Y2gwCQEWbWFuYWdlclB1YmxpY0tleU9yVW5pdAADCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQCcGsFByRtYXRjaDAJAAACCAUBaQ9jYWxsZXJQdWJsaWNLZXkFAnBrAwkAAQIFByRtYXRjaDACBFVuaXQJAAACCAUBaQZjYWxsZXIFBHRoaXMJAAIBAgtNYXRjaCBlcnJvcgELbXVzdE1hbmFnZXIBAWkEAnBkCQACAQIRUGVybWlzc2lvbiBkZW5pZWQEByRtYXRjaDAJARZtYW5hZ2VyUHVibGljS2V5T3JVbml0AAMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAJwawUHJG1hdGNoMAMJAAACCAUBaQ9jYWxsZXJQdWJsaWNLZXkFAnBrBgUCcGQDCQABAgUHJG1hdGNoMAIEVW5pdAMJAAACCAUBaQZjYWxsZXIFBHRoaXMGBQJwZAkAAgECC01hdGNoIGVycm9yHAFpAQlyZWJhbGFuY2UACQDOCAIJAQ5yZWJhbGFuY2VBc3NldAEJAQ9nZXRTdHJpbmdPckZhaWwCBQR0aGlzCQECYWEACQEOcmViYWxhbmNlQXNzZXQBCQEPZ2V0U3RyaW5nT3JGYWlsAgUEdGhpcwkBAnBhAAFpASFjYWxjdWxhdGVBbW91bnRPdXRGb3JTd2FwUkVBRE9OTFkDDWNsZWFuQW1vdW50SW4JaXNSZXZlcnNlDWZlZVBvb2xBbW91bnQEDSR0MDM5NTY5Mzk4NzQDCQAAAgUJaXNSZXZlcnNlBwQIYXNzZXRPdXQJAQ9nZXRTdHJpbmdPckZhaWwCBQR0aGlzCQECcGEABAdhc3NldEluCQEPZ2V0U3RyaW5nT3JGYWlsAgUEdGhpcwkBAmFhAAkAlAoCBQhhc3NldE91dAUHYXNzZXRJbgQIYXNzZXRPdXQJAQ9nZXRTdHJpbmdPckZhaWwCBQR0aGlzCQECYWEABAdhc3NldEluCQEPZ2V0U3RyaW5nT3JGYWlsAgUEdGhpcwkBAnBhAAkAlAoCBQhhc3NldE91dAUHYXNzZXRJbgQIYXNzZXRPdXQIBQ0kdDAzOTU2OTM5ODc0Al8xBAdhc3NldEluCAUNJHQwMzk1NjkzOTg3NAJfMgQScG9vbEFzc2V0SW5CYWxhbmNlCQENZ2V0QWNjQmFsYW5jZQEFB2Fzc2V0SW4EE3Bvb2xBc3NldE91dEJhbGFuY2UJAQ1nZXRBY2NCYWxhbmNlAQUIYXNzZXRPdXQECWFtb3VudE91dAkAawMFE3Bvb2xBc3NldE91dEJhbGFuY2UFDWNsZWFuQW1vdW50SW4JAGQCBRJwb29sQXNzZXRJbkJhbGFuY2UFDWNsZWFuQW1vdW50SW4EBG9sZEsJALkCAgkAtgIBBRJwb29sQXNzZXRJbkJhbGFuY2UJALYCAQUTcG9vbEFzc2V0T3V0QmFsYW5jZQQEbmV3SwkAuQICCQC3AgIJALcCAgkAtgIBCQENZ2V0QWNjQmFsYW5jZQEFB2Fzc2V0SW4JALYCAQUNY2xlYW5BbW91bnRJbgkAtgIBBQ1mZWVQb29sQW1vdW50CQC4AgIJALYCAQkBDWdldEFjY0JhbGFuY2UBBQhhc3NldE91dAkAtgIBBQlhbW91bnRPdXQEBmNoZWNrSwMJAMACAgUEbmV3SwUEb2xkSwYJAAIBAhRuZXcgSyBpcyBmZXdlciBlcnJvcgMJAAACBQZjaGVja0sFBmNoZWNrSwkAlAoCBQNuaWwFCWFtb3VudE91dAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpASZjYWxjdWxhdGVBbW91bnRPdXRGb3JTd2FwQW5kU2VuZFRva2VucwUNY2xlYW5BbW91bnRJbglpc1JldmVyc2UMYW1vdW50T3V0TWluCWFkZHJlc3NUbw1mZWVQb29sQW1vdW50BAtzd2FwQ29udGFjdAoAAUAJAPwHBAUPZmFjdG9yeUNvbnRyYWN0AhdnZXRTd2FwQ29udHJhY3RSRUFET05MWQUDbmlsBQNuaWwDCQABAgUBQAIGU3RyaW5nBQFACQACAQkArAICCQADAQUBQAIbIGNvdWxkbid0IGJlIGNhc3QgdG8gU3RyaW5nBAZjaGVja3MJAMwIAgMJAGcCCAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAUNY2xlYW5BbW91bnRJbgYJAQh0aHJvd0VycgECDFdyb25nIGFtb3VudAkAzAgCAwkAAAIIBQFpBmNhbGxlcgkBEUBleHRyTmF0aXZlKDEwNjIpAQULc3dhcENvbnRhY3QGCQEIdGhyb3dFcnIBAhFQZXJtaXNzaW9uIGRlbmllZAUDbmlsAwkAAAIFBmNoZWNrcwUGY2hlY2tzBANwbXQJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAQHYXNzZXRJbgkBD2Fzc2V0SWRUb1N0cmluZwEIBQNwbXQHYXNzZXRJZAQIYXNzZXRPdXQDCQAAAgUJaXNSZXZlcnNlBwkBD2dldFN0cmluZ09yRmFpbAIFBHRoaXMJAQJwYQAJAQ9nZXRTdHJpbmdPckZhaWwCBQR0aGlzCQECYWEABBJwb29sQXNzZXRJbkJhbGFuY2UJAGUCCQENZ2V0QWNjQmFsYW5jZQEFB2Fzc2V0SW4ICQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BBNwb29sQXNzZXRPdXRCYWxhbmNlCQENZ2V0QWNjQmFsYW5jZQEFCGFzc2V0T3V0BAlhbW91bnRPdXQJAGsDBRNwb29sQXNzZXRPdXRCYWxhbmNlBQ1jbGVhbkFtb3VudEluCQBkAgUScG9vbEFzc2V0SW5CYWxhbmNlBQ1jbGVhbkFtb3VudEluBARvbGRLCQC5AgIJALYCAQUScG9vbEFzc2V0SW5CYWxhbmNlCQC2AgEFE3Bvb2xBc3NldE91dEJhbGFuY2UEBG5ld0sJALkCAgkAtwICCQC2AgEJAQ1nZXRBY2NCYWxhbmNlAQUHYXNzZXRJbgkAtgIBBQ1mZWVQb29sQW1vdW50CQC4AgIJALYCAQkBDWdldEFjY0JhbGFuY2UBBQhhc3NldE91dAkAtgIBBQlhbW91bnRPdXQEBmNoZWNrSwMJAMACAgUEbmV3SwUEb2xkSwYJAAIBAhRuZXcgSyBpcyBmZXdlciBlcnJvcgMJAAACBQZjaGVja0sFBmNoZWNrSwQIY2hlY2tNaW4DCQBnAgUJYW1vdW50T3V0BQxhbW91bnRPdXRNaW4GCQACAQIsRXhjaGFuZ2UgcmVzdWx0IGlzIGZld2VyIGNvaW5zIHRoYW4gZXhwZWN0ZWQDCQAAAgUIY2hlY2tNaW4FCGNoZWNrTWluBA5yZWJhbGFuY2VTdGF0ZQkBDnJlYmFsYW5jZUFzc2V0AQUHYXNzZXRJbgMJAAACBQ5yZWJhbGFuY2VTdGF0ZQUOcmViYWxhbmNlU3RhdGUEDXdpdGhkcmF3U3RhdGUJARl3aXRoZHJhd0FuZFJlYmFsYW5jZUFzc2V0AgUIYXNzZXRPdXQFCWFtb3VudE91dAMJAAACBQ13aXRoZHJhd1N0YXRlBQ13aXRoZHJhd1N0YXRlCQCUCgIJAM4IAgkAzggCBQ13aXRoZHJhd1N0YXRlBQ5yZWJhbGFuY2VTdGF0ZQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQERQGV4dHJOYXRpdmUoMTA2MikBBQlhZGRyZXNzVG8FCWFtb3VudE91dAkBDHBhcnNlQXNzZXRJZAEFCGFzc2V0T3V0BQNuaWwFCWFtb3VudE91dAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQNwdXQCEXNsaXBwYWdlVG9sZXJhbmNlD3Nob3VsZEF1dG9TdGFrZQMJAGYCAAAFEXNsaXBwYWdlVG9sZXJhbmNlCQACAQIgSW52YWxpZCBzbGlwcGFnZVRvbGVyYW5jZSBwYXNzZWQEBmVzdFB1dAkBCWNvbW1vblB1dAMFAWkFEXNsaXBwYWdlVG9sZXJhbmNlBgQJZW1pdExwQW10CAUGZXN0UHV0Al8yBAlscEFzc2V0SWQIBQZlc3RQdXQCXzcEBXN0YXRlCAUGZXN0UHV0Al85BAZhbURpZmYIBQZlc3RQdXQDXzEwBAZwckRpZmYIBQZlc3RQdXQDXzExBARhbUlkCAUGZXN0UHV0A18xMgQEcHJJZAgFBmVzdFB1dANfMTMECmFtQXNzZXRQbXQJALYCAQgJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQECnByQXNzZXRQbXQJALYCAQgJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAQZhbW91bnQECmN1cnJlbnRLTHAJAQ5jYWxjQ3VycmVudEtMcAMFCmFtQXNzZXRQbXQFCnByQXNzZXRQbXQJALYCAQAAAwkAAAIFCmN1cnJlbnRLTHAFCmN1cnJlbnRLTHAEB2VtaXRJbnYJAPwHBAUPZmFjdG9yeUNvbnRyYWN0AgRlbWl0CQDMCAIFCWVtaXRMcEFtdAUDbmlsBQNuaWwDCQAAAgUHZW1pdEludgUHZW1pdEludgQNZW1pdEludkxlZ2FjeQQHJG1hdGNoMAUHZW1pdEludgMJAAECBQckbWF0Y2gwAgdBZGRyZXNzBBVsZWdhY3lGYWN0b3J5Q29udHJhY3QFByRtYXRjaDAJAPwHBAUVbGVnYWN5RmFjdG9yeUNvbnRyYWN0AgRlbWl0CQDMCAIFCWVtaXRMcEFtdAUDbmlsBQNuaWwFBHVuaXQDCQAAAgUNZW1pdEludkxlZ2FjeQUNZW1pdEludkxlZ2FjeQQMc2xpcHBhZ2VBSW52AwkAZgIFBmFtRGlmZgAACQD8BwQFEHNsaXBwYWdlQ29udHJhY3QCA3B1dAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQRhbUlkBQZhbURpZmYFA25pbAUDbmlsAwkAAAIFDHNsaXBwYWdlQUludgUMc2xpcHBhZ2VBSW52BAxzbGlwcGFnZVBJbnYDCQBmAgUGcHJEaWZmAAAJAPwHBAUQc2xpcHBhZ2VDb250cmFjdAIDcHV0BQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFBHBySWQFBnByRGlmZgUDbmlsBQNuaWwDCQAAAgUMc2xpcHBhZ2VQSW52BQxzbGlwcGFnZVBJbnYECmxwVHJhbnNmZXIDBQ9zaG91bGRBdXRvU3Rha2UEC3NscFN0YWtlSW52CQD8BwQFD3N0YWtpbmdDb250cmFjdAIFc3Rha2UFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUJbHBBc3NldElkBQllbWl0THBBbXQFA25pbAMJAAACBQtzbHBTdGFrZUludgULc2xwU3Rha2VJbnYFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFCWVtaXRMcEFtdAUJbHBBc3NldElkBQNuaWwEDSR0MDQ0MzYxNDQ4MjMJARJyZWZyZXNoS0xwSW50ZXJuYWwDAAAAAAAAAwkAAAIFDSR0MDQ0MzYxNDQ4MjMFDSR0MDQ0MzYxNDQ4MjMECnVwZGF0ZWRLTHAIBQ0kdDA0NDM2MTQ0ODIzAl8yBBFyZWZyZXNoS0xwQWN0aW9ucwgFDSR0MDQ0MzYxNDQ4MjMCXzEEEWlzVXBkYXRlZEtMcFZhbGlkCQESdmFsaWRhdGVVcGRhdGVkS0xwAgUKY3VycmVudEtMcAUKdXBkYXRlZEtMcAMJAAACBRFpc1VwZGF0ZWRLTHBWYWxpZAURaXNVcGRhdGVkS0xwVmFsaWQEA3JlYgkA/AcEBQR0aGlzAglyZWJhbGFuY2UFA25pbAUDbmlsAwkAAAIFA3JlYgUDcmViCQDOCAIJAM4IAgUFc3RhdGUFCmxwVHJhbnNmZXIFEXJlZnJlc2hLTHBBY3Rpb25zCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCnB1dEZvckZyZWUBC21heFNsaXBwYWdlAwkAZgIAAAULbWF4U2xpcHBhZ2UJAAIBAhRJbnZhbGlkIHZhbHVlIHBhc3NlZAQGZXN0UHV0CQEJY29tbW9uUHV0AwUBaQULbWF4U2xpcHBhZ2UHBAVzdGF0ZQgFBmVzdFB1dAJfOQQKYW1Bc3NldFBtdAkAtgIBCAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAQKcHJBc3NldFBtdAkAtgIBCAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwABBmFtb3VudAQKY3VycmVudEtMcAkBDmNhbGNDdXJyZW50S0xwAwUKYW1Bc3NldFBtdAUKcHJBc3NldFBtdAkAtgIBAAADCQAAAgUKY3VycmVudEtMcAUKY3VycmVudEtMcAQNJHQwNDU0MzU0NTUwMAkBEnJlZnJlc2hLTHBJbnRlcm5hbAMAAAAAAAAEEXJlZnJlc2hLTHBBY3Rpb25zCAUNJHQwNDU0MzU0NTUwMAJfMQQKdXBkYXRlZEtMcAgFDSR0MDQ1NDM1NDU1MDACXzIEEWlzVXBkYXRlZEtMcFZhbGlkCQESdmFsaWRhdGVVcGRhdGVkS0xwAgUKY3VycmVudEtMcAUKdXBkYXRlZEtMcAMJAAACBRFpc1VwZGF0ZWRLTHBWYWxpZAURaXNVcGRhdGVkS0xwVmFsaWQJAM4IAgUFc3RhdGUFEXJlZnJlc2hLTHBBY3Rpb25zCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCXB1dE9uZVRrbgIMbWluT3V0QW1vdW50CWF1dG9TdGFrZQQgaXNQb29sT25lVG9rZW5PcGVyYXRpb25zRGlzYWJsZWQKAAFACQD8BwQFD2ZhY3RvcnlDb250cmFjdAIoaXNQb29sT25lVG9rZW5PcGVyYXRpb25zRGlzYWJsZWRSRUFET05MWQkAzAgCCQClCAEFBHRoaXMFA25pbAUDbmlsAwkAAQIFAUACB0Jvb2xlYW4FAUAJAAIBCQCsAgIJAAMBBQFAAhwgY291bGRuJ3QgYmUgY2FzdCB0byBCb29sZWFuBA1pc1B1dERpc2FibGVkAwMDCQEQaXNHbG9iYWxTaHV0ZG93bgAGCQAAAgUNY2ZnUG9vbFN0YXR1cwUPUG9vbFB1dERpc2FibGVkBgkAAAIFDWNmZ1Bvb2xTdGF0dXMFDFBvb2xTaHV0ZG93bgYFIGlzUG9vbE9uZVRva2VuT3BlcmF0aW9uc0Rpc2FibGVkBAZjaGVja3MJAMwIAgMDCQEBIQEFDWlzUHV0RGlzYWJsZWQGCQEJaXNNYW5hZ2VyAQUBaQYJAQh0aHJvd0VycgECIXB1dCBvcGVyYXRpb24gaXMgYmxvY2tlZCBieSBhZG1pbgkAzAgCAwkAAAIJAJADAQgFAWkIcGF5bWVudHMAAQYJAQh0aHJvd0VycgECHmV4YWN0bHkgMSBwYXltZW50IGFyZSBleHBlY3RlZAUDbmlsAwkAAAIFBmNoZWNrcwUGY2hlY2tzBAdwYXltZW50CQCRAwIIBQFpCHBheW1lbnRzAAAEDnBheW1lbnRBc3NldElkCAUHcGF5bWVudAdhc3NldElkBBBwYXltZW50QW1vdW50UmF3CAUHcGF5bWVudAZhbW91bnQECmN1cnJlbnRLTHADCQAAAgUOcGF5bWVudEFzc2V0SWQFEGNmZ0Ftb3VudEFzc2V0SWQJAQ5jYWxjQ3VycmVudEtMcAMJALYCAQUQcGF5bWVudEFtb3VudFJhdwkAtgIBAAAJALYCAQAAAwkAAAIFDnBheW1lbnRBc3NldElkBQ9jZmdQcmljZUFzc2V0SWQJAQ5jYWxjQ3VycmVudEtMcAMJALYCAQAACQC2AgEFEHBheW1lbnRBbW91bnRSYXcJALYCAQAACQEIdGhyb3dFcnIBAh5wYXltZW50IGFzc2V0IGlzIG5vdCBzdXBwb3J0ZWQDCQAAAgUKY3VycmVudEtMcAUKY3VycmVudEtMcAQLdXNlckFkZHJlc3MIBQFpBmNhbGxlcgQEdHhJZAgFAWkNdHJhbnNhY3Rpb25JZAQNJHQwNDY2ODg0Njg0MAkBD2NhbGNQdXRPbmVUb2tlbgQFEHBheW1lbnRBbW91bnRSYXcFDnBheW1lbnRBc3NldElkBQt1c2VyQWRkcmVzcwUEdHhJZAMJAAACBQ0kdDA0NjY4ODQ2ODQwBQ0kdDA0NjY4ODQ2ODQwBBRwYXltZW50SW5BbW91bnRBc3NldAgFDSR0MDQ2Njg4NDY4NDACXzUEBWJvbnVzCAUNJHQwNDY2ODg0Njg0MAJfNAQJZmVlQW1vdW50CAUNJHQwNDY2ODg0Njg0MAJfMwQLY29tbW9uU3RhdGUIBQ0kdDA0NjY4ODQ2ODQwAl8yBBNlbWl0QW1vdW50RXN0aW1hdGVkCAUNJHQwNDY2ODg0Njg0MAJfMQQKZW1pdEFtb3VudAMDCQBmAgUMbWluT3V0QW1vdW50AAAJAGYCBQxtaW5PdXRBbW91bnQFE2VtaXRBbW91bnRFc3RpbWF0ZWQHCQEIdGhyb3dFcnIBCQC5CQIJAMwIAgIfYW1vdW50IHRvIHJlY2VpdmUgaXMgbGVzcyB0aGFuIAkAzAgCCQCkAwEFDG1pbk91dEFtb3VudAUDbmlsAgAFE2VtaXRBbW91bnRFc3RpbWF0ZWQEB2VtaXRJbnYJAQRlbWl0AQUKZW1pdEFtb3VudAMJAAACBQdlbWl0SW52BQdlbWl0SW52BApscFRyYW5zZmVyAwUJYXV0b1N0YWtlBAhzdGFrZUludgkA/AcEBQ9zdGFraW5nQ29udHJhY3QCBXN0YWtlBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFDGNmZ0xwQXNzZXRJZAUKZW1pdEFtb3VudAUDbmlsAwkAAAIFCHN0YWtlSW52BQhzdGFrZUludgUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgUKZW1pdEFtb3VudAUMY2ZnTHBBc3NldElkBQNuaWwEB3NlbmRGZWUDCQBmAgUJZmVlQW1vdW50AAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUTZmVlQ29sbGVjdG9yQWRkcmVzcwUJZmVlQW1vdW50BQ5wYXltZW50QXNzZXRJZAUDbmlsBQNuaWwEDSR0MDQ3NDI2NDc2MjMDCQAAAgUEdGhpcwUTZmVlQ29sbGVjdG9yQWRkcmVzcwkAlAoCAAAAAAMFFHBheW1lbnRJbkFtb3VudEFzc2V0CQCUCgIJAQEtAQUJZmVlQW1vdW50AAAJAJQKAgAACQEBLQEFCWZlZUFtb3VudAQXYW1vdW50QXNzZXRCYWxhbmNlRGVsdGEIBQ0kdDA0NzQyNjQ3NjIzAl8xBBZwcmljZUFzc2V0QmFsYW5jZURlbHRhCAUNJHQwNDc0MjY0NzYyMwJfMgQNJHQwNDc2MjY0NzczNAkBEnJlZnJlc2hLTHBJbnRlcm5hbAMFF2Ftb3VudEFzc2V0QmFsYW5jZURlbHRhBRZwcmljZUFzc2V0QmFsYW5jZURlbHRhAAAEEXJlZnJlc2hLTHBBY3Rpb25zCAUNJHQwNDc2MjY0NzczNAJfMQQKdXBkYXRlZEtMcAgFDSR0MDQ3NjI2NDc3MzQCXzIEA2tMcAkBBXZhbHVlAQkAoggBBQZrZXlLTHAEEWlzVXBkYXRlZEtMcFZhbGlkCQESdmFsaWRhdGVVcGRhdGVkS0xwAgUKY3VycmVudEtMcAUKdXBkYXRlZEtMcAMJAAACBRFpc1VwZGF0ZWRLTHBWYWxpZAURaXNVcGRhdGVkS0xwVmFsaWQEA3JlYgkA/AcEBQR0aGlzAglyZWJhbGFuY2UFA25pbAUDbmlsAwkAAAIFA3JlYgUDcmViCQCUCgIJAM4IAgkAzggCCQDOCAIFC2NvbW1vblN0YXRlBQpscFRyYW5zZmVyBQdzZW5kRmVlBRFyZWZyZXNoS0xwQWN0aW9ucwUKZW1pdEFtb3VudAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARFwdXRPbmVUa25SRUFET05MWQIOcGF5bWVudEFzc2V0SWQQcGF5bWVudEFtb3VudFJhdwQNJHQwNDgwODk0ODI0NgkBD2NhbGNQdXRPbmVUb2tlbgQFEHBheW1lbnRBbW91bnRSYXcJAQxwYXJzZUFzc2V0SWQBBQ5wYXltZW50QXNzZXRJZAUEdW5pdAUEdW5pdAQTZW1pdEFtb3VudEVzdGltYXRlZAgFDSR0MDQ4MDg5NDgyNDYCXzEEC2NvbW1vblN0YXRlCAUNJHQwNDgwODk0ODI0NgJfMgQJZmVlQW1vdW50CAUNJHQwNDgwODk0ODI0NgJfMwQFYm9udXMIBQ0kdDA0ODA4OTQ4MjQ2Al80BBRwYXltZW50SW5BbW91bnRBc3NldAgFDSR0MDQ4MDg5NDgyNDYCXzUJAJQKAgUDbmlsCQCVCgMFE2VtaXRBbW91bnRFc3RpbWF0ZWQFCWZlZUFtb3VudAUFYm9udXMBaQEJZ2V0T25lVGtuAg1vdXRBc3NldElkU3RyDG1pbk91dEFtb3VudAQgaXNQb29sT25lVG9rZW5PcGVyYXRpb25zRGlzYWJsZWQKAAFACQD8BwQFD2ZhY3RvcnlDb250cmFjdAIoaXNQb29sT25lVG9rZW5PcGVyYXRpb25zRGlzYWJsZWRSRUFET05MWQkAzAgCCQClCAEFBHRoaXMFA25pbAUDbmlsAwkAAQIFAUACB0Jvb2xlYW4FAUAJAAIBCQCsAgIJAAMBBQFAAhwgY291bGRuJ3QgYmUgY2FzdCB0byBCb29sZWFuBA1pc0dldERpc2FibGVkAwMJARBpc0dsb2JhbFNodXRkb3duAAYJAAACBQ1jZmdQb29sU3RhdHVzBQxQb29sU2h1dGRvd24GBSBpc1Bvb2xPbmVUb2tlbk9wZXJhdGlvbnNEaXNhYmxlZAQGY2hlY2tzCQDMCAIDAwkBASEBBQ1pc0dldERpc2FibGVkBgkBCWlzTWFuYWdlcgEFAWkGCQEIdGhyb3dFcnIBAiFnZXQgb3BlcmF0aW9uIGlzIGJsb2NrZWQgYnkgYWRtaW4JAMwIAgMJAAACCQCQAwEIBQFpCHBheW1lbnRzAAEGCQEIdGhyb3dFcnIBAh5leGFjdGx5IDEgcGF5bWVudCBhcmUgZXhwZWN0ZWQFA25pbAMJAAACBQZjaGVja3MFBmNoZWNrcwQKb3V0QXNzZXRJZAkBDHBhcnNlQXNzZXRJZAEFDW91dEFzc2V0SWRTdHIEB3BheW1lbnQJAJEDAggFAWkIcGF5bWVudHMAAAQOcGF5bWVudEFzc2V0SWQIBQdwYXltZW50B2Fzc2V0SWQEDXBheW1lbnRBbW91bnQIBQdwYXltZW50BmFtb3VudAQKY3VycmVudEtMcAkBDmNhbGNDdXJyZW50S0xwAwkAtgIBAAAJALYCAQAACQC2AgEAAAMJAAACBQpjdXJyZW50S0xwBQpjdXJyZW50S0xwBAt1c2VyQWRkcmVzcwgFAWkGY2FsbGVyBAR0eElkCAUBaQ10cmFuc2FjdGlvbklkBA0kdDA0OTEzMTQ5Mjg0CQEPY2FsY0dldE9uZVRva2VuBQUKb3V0QXNzZXRJZAUNcGF5bWVudEFtb3VudAUOcGF5bWVudEFzc2V0SWQFC3VzZXJBZGRyZXNzBQR0eElkAwkAAAIFDSR0MDQ5MTMxNDkyODQFDSR0MDQ5MTMxNDkyODQEEG91dEluQW1vdW50QXNzZXQIBQ0kdDA0OTEzMTQ5Mjg0Al81BAVib251cwgFDSR0MDQ5MTMxNDkyODQCXzQECWZlZUFtb3VudAgFDSR0MDQ5MTMxNDkyODQCXzMEC2NvbW1vblN0YXRlCAUNJHQwNDkxMzE0OTI4NAJfMgQPYW1vdW50RXN0aW1hdGVkCAUNJHQwNDkxMzE0OTI4NAJfMQQGYW1vdW50AwMJAGYCBQxtaW5PdXRBbW91bnQAAAkAZgIFDG1pbk91dEFtb3VudAUPYW1vdW50RXN0aW1hdGVkBwkBCHRocm93RXJyAQkAuQkCCQDMCAICH2Ftb3VudCB0byByZWNlaXZlIGlzIGxlc3MgdGhhbiAJAMwIAgkApAMBBQxtaW5PdXRBbW91bnQFA25pbAIABQ9hbW91bnRFc3RpbWF0ZWQEB2J1cm5JbnYJAPwHBAUPZmFjdG9yeUNvbnRyYWN0AgRidXJuCQDMCAIFDXBheW1lbnRBbW91bnQFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUOcGF5bWVudEFzc2V0SWQFDXBheW1lbnRBbW91bnQFA25pbAMJAAACBQdidXJuSW52BQdidXJuSW52BA13aXRoZHJhd1N0YXRlCQEZd2l0aGRyYXdBbmRSZWJhbGFuY2VBc3NldAIFDW91dEFzc2V0SWRTdHIJAGQCBQZhbW91bnQJAJYDAQkAzAgCAAAJAMwIAgUJZmVlQW1vdW50BQNuaWwEDWFzc2V0VHJhbnNmZXIJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwULdXNlckFkZHJlc3MFBmFtb3VudAUKb3V0QXNzZXRJZAUDbmlsBAdzZW5kRmVlAwkAZgIFCWZlZUFtb3VudAAACQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFE2ZlZUNvbGxlY3RvckFkZHJlc3MFCWZlZUFtb3VudAUKb3V0QXNzZXRJZAUDbmlsBQNuaWwEDSR0MDQ5OTQ4NTAxOTUEEGZlZUFtb3VudEZvckNhbGMDCQAAAgUEdGhpcwUTZmVlQ29sbGVjdG9yQWRkcmVzcwAABQlmZWVBbW91bnQDBRBvdXRJbkFtb3VudEFzc2V0CQCUCgIJAQEtAQkAZAIFBmFtb3VudAUQZmVlQW1vdW50Rm9yQ2FsYwAACQCUCgIAAAkBAS0BCQBkAgUGYW1vdW50BRBmZWVBbW91bnRGb3JDYWxjBBdhbW91bnRBc3NldEJhbGFuY2VEZWx0YQgFDSR0MDQ5OTQ4NTAxOTUCXzEEFnByaWNlQXNzZXRCYWxhbmNlRGVsdGEIBQ0kdDA0OTk0ODUwMTk1Al8yBA0kdDA1MDE5ODUwMzA2CQEScmVmcmVzaEtMcEludGVybmFsAwUXYW1vdW50QXNzZXRCYWxhbmNlRGVsdGEFFnByaWNlQXNzZXRCYWxhbmNlRGVsdGEAAAQRcmVmcmVzaEtMcEFjdGlvbnMIBQ0kdDA1MDE5ODUwMzA2Al8xBAp1cGRhdGVkS0xwCAUNJHQwNTAxOTg1MDMwNgJfMgQRaXNVcGRhdGVkS0xwVmFsaWQJARJ2YWxpZGF0ZVVwZGF0ZWRLTHACBQpjdXJyZW50S0xwBQp1cGRhdGVkS0xwAwkAAAIFEWlzVXBkYXRlZEtMcFZhbGlkBRFpc1VwZGF0ZWRLTHBWYWxpZAkAlAoCCQDOCAIJAM4IAgkAzggCCQDOCAIFC2NvbW1vblN0YXRlBQ13aXRoZHJhd1N0YXRlBQ1hc3NldFRyYW5zZmVyBQdzZW5kRmVlBRFyZWZyZXNoS0xwQWN0aW9ucwUGYW1vdW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBEWdldE9uZVRrblJFQURPTkxZAgpvdXRBc3NldElkDXBheW1lbnRBbW91bnQEDSR0MDUwNTg0NTA3NDAJAQ9jYWxjR2V0T25lVG9rZW4FCQEMcGFyc2VBc3NldElkAQUKb3V0QXNzZXRJZAUNcGF5bWVudEFtb3VudAUMY2ZnTHBBc3NldElkBQR1bml0BQR1bml0BA9hbW91bnRFc3RpbWF0ZWQIBQ0kdDA1MDU4NDUwNzQwAl8xBAtjb21tb25TdGF0ZQgFDSR0MDUwNTg0NTA3NDACXzIECWZlZUFtb3VudAgFDSR0MDUwNTg0NTA3NDACXzMEBWJvbnVzCAUNJHQwNTA1ODQ1MDc0MAJfNAQQb3V0SW5BbW91bnRBc3NldAgFDSR0MDUwNTg0NTA3NDACXzUJAJQKAgUDbmlsCQCVCgMFD2Ftb3VudEVzdGltYXRlZAUJZmVlQW1vdW50BQVib251cwFpARN1bnN0YWtlQW5kR2V0T25lVGtuAw11bnN0YWtlQW1vdW50DW91dEFzc2V0SWRTdHIMbWluT3V0QW1vdW50BCBpc1Bvb2xPbmVUb2tlbk9wZXJhdGlvbnNEaXNhYmxlZAoAAUAJAPwHBAUPZmFjdG9yeUNvbnRyYWN0Aihpc1Bvb2xPbmVUb2tlbk9wZXJhdGlvbnNEaXNhYmxlZFJFQURPTkxZCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQNuaWwDCQABAgUBQAIHQm9vbGVhbgUBQAkAAgEJAKwCAgkAAwEFAUACHCBjb3VsZG4ndCBiZSBjYXN0IHRvIEJvb2xlYW4EDWlzR2V0RGlzYWJsZWQDAwkBEGlzR2xvYmFsU2h1dGRvd24ABgkAAAIFDWNmZ1Bvb2xTdGF0dXMFDFBvb2xTaHV0ZG93bgYFIGlzUG9vbE9uZVRva2VuT3BlcmF0aW9uc0Rpc2FibGVkBAZjaGVja3MJAMwIAgMDCQEBIQEFDWlzR2V0RGlzYWJsZWQGCQEJaXNNYW5hZ2VyAQUBaQYJAQh0aHJvd0VycgECIWdldCBvcGVyYXRpb24gaXMgYmxvY2tlZCBieSBhZG1pbgkAzAgCAwkAAAIJAJADAQgFAWkIcGF5bWVudHMAAAYJAQh0aHJvd0VycgECGG5vIHBheW1lbnRzIGFyZSBleHBlY3RlZAUDbmlsAwkAAAIFBmNoZWNrcwUGY2hlY2tzBApvdXRBc3NldElkCQEMcGFyc2VBc3NldElkAQUNb3V0QXNzZXRJZFN0cgQLdXNlckFkZHJlc3MIBQFpBmNhbGxlcgQEdHhJZAgFAWkNdHJhbnNhY3Rpb25JZAQKY3VycmVudEtMcAkBDmNhbGNDdXJyZW50S0xwAwkAtgIBAAAJALYCAQAACQC2AgEAAAMJAAACBQpjdXJyZW50S0xwBQpjdXJyZW50S0xwBAp1bnN0YWtlSW52CQD8BwQFD3N0YWtpbmdDb250cmFjdAIHdW5zdGFrZQkAzAgCCQDYBAEFDGNmZ0xwQXNzZXRJZAkAzAgCBQ11bnN0YWtlQW1vdW50BQNuaWwFA25pbAMJAAACBQp1bnN0YWtlSW52BQp1bnN0YWtlSW52BA0kdDA1MTY0NTUxNzk2CQEPY2FsY0dldE9uZVRva2VuBQUKb3V0QXNzZXRJZAUNdW5zdGFrZUFtb3VudAUMY2ZnTHBBc3NldElkBQt1c2VyQWRkcmVzcwUEdHhJZAMJAAACBQ0kdDA1MTY0NTUxNzk2BQ0kdDA1MTY0NTUxNzk2BBBvdXRJbkFtb3VudEFzc2V0CAUNJHQwNTE2NDU1MTc5NgJfNQQFYm9udXMIBQ0kdDA1MTY0NTUxNzk2Al80BAlmZWVBbW91bnQIBQ0kdDA1MTY0NTUxNzk2Al8zBAtjb21tb25TdGF0ZQgFDSR0MDUxNjQ1NTE3OTYCXzIED2Ftb3VudEVzdGltYXRlZAgFDSR0MDUxNjQ1NTE3OTYCXzEEBmFtb3VudAMDCQBmAgUMbWluT3V0QW1vdW50AAAJAGYCBQxtaW5PdXRBbW91bnQFD2Ftb3VudEVzdGltYXRlZAcJAQh0aHJvd0VycgEJALkJAgkAzAgCAh9hbW91bnQgdG8gcmVjZWl2ZSBpcyBsZXNzIHRoYW4gCQDMCAIJAKQDAQUMbWluT3V0QW1vdW50BQNuaWwCAAUPYW1vdW50RXN0aW1hdGVkBAdidXJuSW52CQD8BwQFD2ZhY3RvcnlDb250cmFjdAIEYnVybgkAzAgCBQ11bnN0YWtlQW1vdW50BQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFDGNmZ0xwQXNzZXRJZAUNdW5zdGFrZUFtb3VudAUDbmlsAwkAAAIFB2J1cm5JbnYFB2J1cm5JbnYEDXdpdGhkcmF3U3RhdGUJARl3aXRoZHJhd0FuZFJlYmFsYW5jZUFzc2V0AgUNb3V0QXNzZXRJZFN0cgkAZAIFBmFtb3VudAkAlgMBCQDMCAIAAAkAzAgCBQlmZWVBbW91bnQFA25pbAQNYXNzZXRUcmFuc2ZlcgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFBmFtb3VudAUKb3V0QXNzZXRJZAUDbmlsBAdzZW5kRmVlAwkAZgIFCWZlZUFtb3VudAAACQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFE2ZlZUNvbGxlY3RvckFkZHJlc3MFCWZlZUFtb3VudAUKb3V0QXNzZXRJZAUDbmlsBQNuaWwEDSR0MDUyNDU1NTI3MDIEEGZlZUFtb3VudEZvckNhbGMDCQAAAgUEdGhpcwUTZmVlQ29sbGVjdG9yQWRkcmVzcwAABQlmZWVBbW91bnQDBRBvdXRJbkFtb3VudEFzc2V0CQCUCgIJAQEtAQkAZAIFBmFtb3VudAUQZmVlQW1vdW50Rm9yQ2FsYwAACQCUCgIAAAkBAS0BCQBkAgUGYW1vdW50BRBmZWVBbW91bnRGb3JDYWxjBBdhbW91bnRBc3NldEJhbGFuY2VEZWx0YQgFDSR0MDUyNDU1NTI3MDICXzEEFnByaWNlQXNzZXRCYWxhbmNlRGVsdGEIBQ0kdDA1MjQ1NTUyNzAyAl8yBA0kdDA1MjcwNTUyODEzCQEScmVmcmVzaEtMcEludGVybmFsAwUXYW1vdW50QXNzZXRCYWxhbmNlRGVsdGEFFnByaWNlQXNzZXRCYWxhbmNlRGVsdGEAAAQRcmVmcmVzaEtMcEFjdGlvbnMIBQ0kdDA1MjcwNTUyODEzAl8xBAp1cGRhdGVkS0xwCAUNJHQwNTI3MDU1MjgxMwJfMgQRaXNVcGRhdGVkS0xwVmFsaWQJARJ2YWxpZGF0ZVVwZGF0ZWRLTHACBQpjdXJyZW50S0xwBQp1cGRhdGVkS0xwAwkAAAIFEWlzVXBkYXRlZEtMcFZhbGlkBRFpc1VwZGF0ZWRLTHBWYWxpZAkAlAoCCQDOCAIJAM4IAgkAzggCCQDOCAIFC2NvbW1vblN0YXRlBQ13aXRoZHJhd1N0YXRlBQ1hc3NldFRyYW5zZmVyBQdzZW5kRmVlBRFyZWZyZXNoS0xwQWN0aW9ucwUGYW1vdW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBA2dldAAEA3JlcwkBCWNvbW1vbkdldAEFAWkECG91dEFtQW10CAUDcmVzAl8xBAhvdXRQckFtdAgFA3JlcwJfMgQGcG10QW10CAUDcmVzAl8zBApwbXRBc3NldElkCAUDcmVzAl80BAVzdGF0ZQgFA3JlcwJfNQQNd2l0aGRyYXdTdGF0ZQkBF3dpdGhkcmF3QW5kUmViYWxhbmNlQWxsAgUIb3V0QW1BbXQFCG91dFByQW10BApjdXJyZW50S0xwCQEOY2FsY0N1cnJlbnRLTHADCQC2AgEAAAkAtgIBAAAJALYCAQAAAwkAAAIFCmN1cnJlbnRLTHAFCmN1cnJlbnRLTHAEFGJ1cm5MUEFzc2V0T25GYWN0b3J5CQD8BwQFD2ZhY3RvcnlDb250cmFjdAIEYnVybgkAzAgCBQZwbXRBbXQFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUKcG10QXNzZXRJZAUGcG10QW10BQNuaWwDCQAAAgUUYnVybkxQQXNzZXRPbkZhY3RvcnkFFGJ1cm5MUEFzc2V0T25GYWN0b3J5BA0kdDA1MzkwODUzOTg5CQEScmVmcmVzaEtMcEludGVybmFsAwkBAS0BBQhvdXRBbUFtdAkBAS0BBQhvdXRQckFtdAAABBFyZWZyZXNoS0xwQWN0aW9ucwgFDSR0MDUzOTA4NTM5ODkCXzEECnVwZGF0ZWRLTHAIBQ0kdDA1MzkwODUzOTg5Al8yBBFpc1VwZGF0ZWRLTHBWYWxpZAkBEnZhbGlkYXRlVXBkYXRlZEtMcAIFCmN1cnJlbnRLTHAFCnVwZGF0ZWRLTHADCQAAAgURaXNVcGRhdGVkS0xwVmFsaWQFEWlzVXBkYXRlZEtMcFZhbGlkCQDOCAIJAM4IAgUNd2l0aGRyYXdTdGF0ZQUFc3RhdGUFEXJlZnJlc2hLTHBBY3Rpb25zCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCWdldE5vTGVzcwISbm9MZXNzVGhlbkFtdEFzc2V0FG5vTGVzc1RoZW5QcmljZUFzc2V0BANyZXMJAQljb21tb25HZXQBBQFpBAhvdXRBbUFtdAgFA3JlcwJfMQQIb3V0UHJBbXQIBQNyZXMCXzIEBnBtdEFtdAgFA3JlcwJfMwQKcG10QXNzZXRJZAgFA3JlcwJfNAQFc3RhdGUIBQNyZXMCXzUDCQBmAgUSbm9MZXNzVGhlbkFtdEFzc2V0BQhvdXRBbUFtdAkAAgEJAKwCAgkArAICCQCsAgICHG5vTGVzc1RoZW5BbXRBc3NldCBmYWlsZWQ6ICAJAKQDAQUIb3V0QW1BbXQCAyA8IAkApAMBBRJub0xlc3NUaGVuQW10QXNzZXQDCQBmAgUUbm9MZXNzVGhlblByaWNlQXNzZXQFCG91dFByQW10CQACAQkArAICCQCsAgIJAKwCAgIdbm9MZXNzVGhlblByaWNlQXNzZXQgZmFpbGVkOiAJAKQDAQUIb3V0UHJBbXQCAyA8IAkApAMBBRRub0xlc3NUaGVuUHJpY2VBc3NldAQNd2l0aGRyYXdTdGF0ZQkBF3dpdGhkcmF3QW5kUmViYWxhbmNlQWxsAgUIb3V0QW1BbXQFCG91dFByQW10BApjdXJyZW50S0xwCQEOY2FsY0N1cnJlbnRLTHADCQC2AgEAAAkAtgIBAAAJALYCAQAAAwkAAAIFCmN1cnJlbnRLTHAFCmN1cnJlbnRLTHAEFGJ1cm5MUEFzc2V0T25GYWN0b3J5CQD8BwQFD2ZhY3RvcnlDb250cmFjdAIEYnVybgkAzAgCBQZwbXRBbXQFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUKcG10QXNzZXRJZAUGcG10QW10BQNuaWwDCQAAAgUUYnVybkxQQXNzZXRPbkZhY3RvcnkFFGJ1cm5MUEFzc2V0T25GYWN0b3J5BA0kdDA1NTA4NDU1MTY1CQEScmVmcmVzaEtMcEludGVybmFsAwkBAS0BBQhvdXRBbUFtdAkBAS0BBQhvdXRQckFtdAAABBFyZWZyZXNoS0xwQWN0aW9ucwgFDSR0MDU1MDg0NTUxNjUCXzEECnVwZGF0ZWRLTHAIBQ0kdDA1NTA4NDU1MTY1Al8yBBFpc1VwZGF0ZWRLTHBWYWxpZAkBEnZhbGlkYXRlVXBkYXRlZEtMcAIFCmN1cnJlbnRLTHAFCnVwZGF0ZWRLTHADCQAAAgURaXNVcGRhdGVkS0xwVmFsaWQFEWlzVXBkYXRlZEtMcFZhbGlkCQDOCAIJAM4IAgUNd2l0aGRyYXdTdGF0ZQUFc3RhdGUFEXJlZnJlc2hLTHBBY3Rpb25zCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDXVuc3Rha2VBbmRHZXQBBmFtb3VudAQNY2hlY2tQYXltZW50cwMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAAkAAgECGE5vIHBheW1lbnRzIGFyZSBleHBlY3RlZAYDCQAAAgUNY2hlY2tQYXltZW50cwUNY2hlY2tQYXltZW50cwQDY2ZnCQENZ2V0UG9vbENvbmZpZwAECWxwQXNzZXRJZAkA2QQBCQCRAwIFA2NmZwUQaWR4UG9vbExQQXNzZXRJZAQKY3VycmVudEtMcAkBDmNhbGNDdXJyZW50S0xwAwkAtgIBAAAJALYCAQAACQC2AgEAAAMJAAACBQpjdXJyZW50S0xwBQpjdXJyZW50S0xwBAp1bnN0YWtlSW52CQD8BwQFD3N0YWtpbmdDb250cmFjdAIHdW5zdGFrZQkAzAgCCQDYBAEFCWxwQXNzZXRJZAkAzAgCBQZhbW91bnQFA25pbAUDbmlsAwkAAAIFCnVuc3Rha2VJbnYFCnVuc3Rha2VJbnYEA3JlcwkBFGVzdGltYXRlR2V0T3BlcmF0aW9uBAkA2AQBCAUBaQ10cmFuc2FjdGlvbklkCQDYBAEFCWxwQXNzZXRJZAUGYW1vdW50CAUBaQZjYWxsZXIECG91dEFtQW10CAUDcmVzAl8xBAhvdXRQckFtdAgFA3JlcwJfMgQKcG9vbFN0YXR1cwkBDXBhcnNlSW50VmFsdWUBCAUDcmVzAl85BAVzdGF0ZQgFA3JlcwNfMTAEDXdpdGhkcmF3U3RhdGUJARd3aXRoZHJhd0FuZFJlYmFsYW5jZUFsbAIFCG91dEFtQW10BQhvdXRQckFtdAQPY2hlY2tQb29sU3RhdHVzAwMJARBpc0dsb2JhbFNodXRkb3duAAYJAAACBQpwb29sU3RhdHVzBQxQb29sU2h1dGRvd24JAAIBCQCsAgICLEdldCBvcGVyYXRpb24gaXMgYmxvY2tlZCBieSBhZG1pbi4gU3RhdHVzID0gCQCkAwEFCnBvb2xTdGF0dXMGAwkAAAIFD2NoZWNrUG9vbFN0YXR1cwUPY2hlY2tQb29sU3RhdHVzBBRidXJuTFBBc3NldE9uRmFjdG9yeQkA/AcEBQ9mYWN0b3J5Q29udHJhY3QCBGJ1cm4JAMwIAgUGYW1vdW50BQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFCWxwQXNzZXRJZAUGYW1vdW50BQNuaWwDCQAAAgUUYnVybkxQQXNzZXRPbkZhY3RvcnkFFGJ1cm5MUEFzc2V0T25GYWN0b3J5BA0kdDA1NjQzNzU2NTE4CQEScmVmcmVzaEtMcEludGVybmFsAwkBAS0BBQhvdXRBbUFtdAkBAS0BBQhvdXRQckFtdAAABBFyZWZyZXNoS0xwQWN0aW9ucwgFDSR0MDU2NDM3NTY1MTgCXzEECnVwZGF0ZWRLTHAIBQ0kdDA1NjQzNzU2NTE4Al8yBBFpc1VwZGF0ZWRLTHBWYWxpZAkBEnZhbGlkYXRlVXBkYXRlZEtMcAIFCmN1cnJlbnRLTHAFCnVwZGF0ZWRLTHADCQAAAgURaXNVcGRhdGVkS0xwVmFsaWQFEWlzVXBkYXRlZEtMcFZhbGlkCQDOCAIJAM4IAgUNd2l0aGRyYXdTdGF0ZQUFc3RhdGUFEXJlZnJlc2hLTHBBY3Rpb25zCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBE3Vuc3Rha2VBbmRHZXROb0xlc3MDDXVuc3Rha2VBbW91bnQVbm9MZXNzVGhlbkFtb3VudEFzc2V0FG5vTGVzc1RoZW5QcmljZUFzc2V0BA1pc0dldERpc2FibGVkAwkBEGlzR2xvYmFsU2h1dGRvd24ABgkAAAIFDWNmZ1Bvb2xTdGF0dXMFDFBvb2xTaHV0ZG93bgQGY2hlY2tzCQDMCAIDCQEBIQEFDWlzR2V0RGlzYWJsZWQGCQACAQIhZ2V0IG9wZXJhdGlvbiBpcyBibG9ja2VkIGJ5IGFkbWluCQDMCAIDCQAAAgkAkAMBCAUBaQhwYXltZW50cwAABgkAAgECGG5vIHBheW1lbnRzIGFyZSBleHBlY3RlZAUDbmlsAwkAAAIFBmNoZWNrcwUGY2hlY2tzBApjdXJyZW50S0xwCQEOY2FsY0N1cnJlbnRLTHADCQC2AgEAAAkAtgIBAAAJALYCAQAAAwkAAAIFCmN1cnJlbnRLTHAFCmN1cnJlbnRLTHAECnVuc3Rha2VJbnYJAPwHBAUPc3Rha2luZ0NvbnRyYWN0Agd1bnN0YWtlCQDMCAIJANgEAQUMY2ZnTHBBc3NldElkCQDMCAIFDXVuc3Rha2VBbW91bnQFA25pbAUDbmlsAwkAAAIFCnVuc3Rha2VJbnYFCnVuc3Rha2VJbnYEA3JlcwkBFGVzdGltYXRlR2V0T3BlcmF0aW9uBAkA2AQBCAUBaQ10cmFuc2FjdGlvbklkCQDYBAEFDGNmZ0xwQXNzZXRJZAUNdW5zdGFrZUFtb3VudAgFAWkGY2FsbGVyBAhvdXRBbUFtdAgFA3JlcwJfMQQIb3V0UHJBbXQIBQNyZXMCXzIEBXN0YXRlCAUDcmVzA18xMAQNd2l0aGRyYXdTdGF0ZQkBF3dpdGhkcmF3QW5kUmViYWxhbmNlQWxsAgUIb3V0QW1BbXQFCG91dFByQW10BAxjaGVja0Ftb3VudHMJAMwIAgMJAGcCBQhvdXRBbUFtdAUVbm9MZXNzVGhlbkFtb3VudEFzc2V0BgkAAgEJALkJAgkAzAgCAixhbW91bnQgYXNzZXQgYW1vdW50IHRvIHJlY2VpdmUgaXMgbGVzcyB0aGFuIAkAzAgCCQCkAwEFFW5vTGVzc1RoZW5BbW91bnRBc3NldAUDbmlsAgAJAMwIAgMJAGcCBQhvdXRQckFtdAUUbm9MZXNzVGhlblByaWNlQXNzZXQGCQACAQkAuQkCCQDMCAICK3ByaWNlIGFzc2V0IGFtb3VudCB0byByZWNlaXZlIGlzIGxlc3MgdGhhbiAJAMwIAgkApAMBBRRub0xlc3NUaGVuUHJpY2VBc3NldAUDbmlsAgAFA25pbAMJAAACBQxjaGVja0Ftb3VudHMFDGNoZWNrQW1vdW50cwQUYnVybkxQQXNzZXRPbkZhY3RvcnkJAPwHBAUPZmFjdG9yeUNvbnRyYWN0AgRidXJuCQDMCAIFDXVuc3Rha2VBbW91bnQFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUMY2ZnTHBBc3NldElkBQ11bnN0YWtlQW1vdW50BQNuaWwDCQAAAgUUYnVybkxQQXNzZXRPbkZhY3RvcnkFFGJ1cm5MUEFzc2V0T25GYWN0b3J5BA0kdDA1Nzk1OTU4MDQwCQEScmVmcmVzaEtMcEludGVybmFsAwkBAS0BBQhvdXRBbUFtdAkBAS0BBQhvdXRQckFtdAAABBFyZWZyZXNoS0xwQWN0aW9ucwgFDSR0MDU3OTU5NTgwNDACXzEECnVwZGF0ZWRLTHAIBQ0kdDA1Nzk1OTU4MDQwAl8yBBFpc1VwZGF0ZWRLTHBWYWxpZAkBEnZhbGlkYXRlVXBkYXRlZEtMcAIFCmN1cnJlbnRLTHAFCnVwZGF0ZWRLTHADCQAAAgURaXNVcGRhdGVkS0xwVmFsaWQFEWlzVXBkYXRlZEtMcFZhbGlkCQDOCAIJAM4IAgUNd2l0aGRyYXdTdGF0ZQUFc3RhdGUFEXJlZnJlc2hLTHBBY3Rpb25zCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCGFjdGl2YXRlAgthbXRBc3NldFN0cg1wcmljZUFzc2V0U3RyAwkBAiE9AgkApQgBCAUBaQZjYWxsZXIJAKUIAQUPZmFjdG9yeUNvbnRyYWN0CQACAQIScGVybWlzc2lvbnMgZGVuaWVkCQCUCgIJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFhAAULYW10QXNzZXRTdHIJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAnBhAAUNcHJpY2VBc3NldFN0cgUDbmlsAgdzdWNjZXNzAWkBCnJlZnJlc2hLTHAABBhsYXN0UmVmcmVzaGVkQmxvY2tIZWlnaHQJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUVa2V5S0xwUmVmcmVzaGVkSGVpZ2h0AAAEHWNoZWNrTGFzdFJlZnJlc2hlZEJsb2NrSGVpZ2h0AwkAZwIJAGUCBQZoZWlnaHQFGGxhc3RSZWZyZXNoZWRCbG9ja0hlaWdodAUPa0xwUmVmcmVzaERlbGF5BQR1bml0CQEIdGhyb3dFcnIBCQC5CQIJAMwIAgkApAMBBQ9rTHBSZWZyZXNoRGVsYXkJAMwIAgIvIGJsb2NrcyBoYXZlIG5vdCBwYXNzZWQgc2luY2UgdGhlIHByZXZpb3VzIGNhbGwFA25pbAIAAwkAAAIFHWNoZWNrTGFzdFJlZnJlc2hlZEJsb2NrSGVpZ2h0BR1jaGVja0xhc3RSZWZyZXNoZWRCbG9ja0hlaWdodAQDa0xwCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKgDAQkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzBQZrZXlLTHACATAJAQZmbXRFcnIBAgtpbnZhbGlkIGtMcAQNJHQwNTkyNDQ1OTMwOAkBEnJlZnJlc2hLTHBJbnRlcm5hbAMAAAAAAAAEEGtMcFVwZGF0ZUFjdGlvbnMIBQ0kdDA1OTI0NDU5MzA4Al8xBAp1cGRhdGVkS0xwCAUNJHQwNTkyNDQ1OTMwOAJfMgQHYWN0aW9ucwMJAQIhPQIFA2tMcAUKdXBkYXRlZEtMcAUQa0xwVXBkYXRlQWN0aW9ucwkBCHRocm93RXJyAQISbm90aGluZyB0byByZWZyZXNoCQCUCgIFB2FjdGlvbnMJAKYDAQUKdXBkYXRlZEtMcAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARxnZXRQb29sQ29uZmlnV3JhcHBlclJFQURPTkxZAAkAlAoCBQNuaWwJAQ1nZXRQb29sQ29uZmlnAAFpARxnZXRBY2NCYWxhbmNlV3JhcHBlclJFQURPTkxZAQdhc3NldElkCQCUCgIFA25pbAkBDWdldEFjY0JhbGFuY2UBBQdhc3NldElkAWkBGWNhbGNQcmljZXNXcmFwcGVyUkVBRE9OTFkDBWFtQW10BXByQW10BWxwQW10BAZwcmljZXMJAQpjYWxjUHJpY2VzAwUFYW1BbXQFBXByQW10BQVscEFtdAkAlAoCBQNuaWwJAMwIAgkApgMBCQCRAwIFBnByaWNlcwAACQDMCAIJAKYDAQkAkQMCBQZwcmljZXMAAQkAzAgCCQCmAwEJAJEDAgUGcHJpY2VzAAIFA25pbAFpARR0b1gxOFdyYXBwZXJSRUFET05MWQIHb3JpZ1ZhbA1vcmlnU2NhbGVNdWx0CQCUCgIFA25pbAkApgMBCQEFdG9YMTgCBQdvcmlnVmFsBQ1vcmlnU2NhbGVNdWx0AWkBFmZyb21YMThXcmFwcGVyUkVBRE9OTFkCA3ZhbA9yZXN1bHRTY2FsZU11bHQJAJQKAgUDbmlsCQEHZnJvbVgxOAIJAKcDAQUDdmFsBQ9yZXN1bHRTY2FsZU11bHQBaQEeY2FsY1ByaWNlQmlnSW50V3JhcHBlclJFQURPTkxZAghwckFtdFgxOAhhbUFtdFgxOAkAlAoCBQNuaWwJAKYDAQkBD2NhbGNQcmljZUJpZ0ludAIJAKcDAQUIcHJBbXRYMTgJAKcDAQUIYW1BbXRYMTgBaQEjZXN0aW1hdGVQdXRPcGVyYXRpb25XcmFwcGVyUkVBRE9OTFkJBnR4SWQ1OBFzbGlwcGFnZVRvbGVyYW5jZQxpbkFtQXNzZXRBbXQLaW5BbUFzc2V0SWQMaW5QckFzc2V0QW10C2luUHJBc3NldElkC3VzZXJBZGRyZXNzCmlzRXZhbHVhdGUGZW1pdExwCQCUCgIFA25pbAkBFGVzdGltYXRlUHV0T3BlcmF0aW9uCQUGdHhJZDU4BRFzbGlwcGFnZVRvbGVyYW5jZQUMaW5BbUFzc2V0QW10BQtpbkFtQXNzZXRJZAUMaW5QckFzc2V0QW10BQtpblByQXNzZXRJZAULdXNlckFkZHJlc3MFCmlzRXZhbHVhdGUFBmVtaXRMcAFpASNlc3RpbWF0ZUdldE9wZXJhdGlvbldyYXBwZXJSRUFET05MWQQGdHhJZDU4CnBtdEFzc2V0SWQIcG10THBBbXQLdXNlckFkZHJlc3MEA3JlcwkBFGVzdGltYXRlR2V0T3BlcmF0aW9uBAUGdHhJZDU4BQpwbXRBc3NldElkBQhwbXRMcEFtdAkBEUBleHRyTmF0aXZlKDEwNjIpAQULdXNlckFkZHJlc3MJAJQKAgUDbmlsCQCcCgoIBQNyZXMCXzEIBQNyZXMCXzIIBQNyZXMCXzMIBQNyZXMCXzQIBQNyZXMCXzUIBQNyZXMCXzYIBQNyZXMCXzcJAKYDAQgFA3JlcwJfOAgFA3JlcwJfOQgFA3JlcwNfMTABaQENc3RhdHNSRUFET05MWQAEA2NmZwkBDWdldFBvb2xDb25maWcABAlscEFzc2V0SWQJANkEAQkAkQMCBQNjZmcFEGlkeFBvb2xMUEFzc2V0SWQECmFtdEFzc2V0SWQJAJEDAgUDY2ZnBQ1pZHhBbXRBc3NldElkBAxwcmljZUFzc2V0SWQJAJEDAgUDY2ZnBQ9pZHhQcmljZUFzc2V0SWQEC2lBbXRBc3NldElkCQCRAwIFA2NmZwUOaWR4SUFtdEFzc2V0SWQEDWlQcmljZUFzc2V0SWQJAJEDAgUDY2ZnBRBpZHhJUHJpY2VBc3NldElkBAthbXRBc3NldERjbQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFA2NmZwUOaWR4QW10QXNzZXREY20EDXByaWNlQXNzZXREY20JAQ1wYXJzZUludFZhbHVlAQkAkQMCBQNjZmcFEGlkeFByaWNlQXNzZXREY20EDXBvb2xMUEJhbGFuY2UICQETdmFsdWVPckVycm9yTWVzc2FnZQIJAOwHAQUJbHBBc3NldElkCQCsAgIJAKwCAgIGQXNzZXQgCQDYBAEFCWxwQXNzZXRJZAIOIGRvZXNuJ3QgZXhpc3QIcXVhbnRpdHkEEmFjY0FtdEFzc2V0QmFsYW5jZQkBDWdldEFjY0JhbGFuY2UBBQphbXRBc3NldElkBBRhY2NQcmljZUFzc2V0QmFsYW5jZQkBDWdldEFjY0JhbGFuY2UBBQxwcmljZUFzc2V0SWQECnByaWNlc0xpc3QDCQAAAgUNcG9vbExQQmFsYW5jZQAACQDMCAIFCnplcm9CaWdJbnQJAMwIAgUKemVyb0JpZ0ludAkAzAgCBQp6ZXJvQmlnSW50BQNuaWwJAQpjYWxjUHJpY2VzAwUSYWNjQW10QXNzZXRCYWxhbmNlBRRhY2NQcmljZUFzc2V0QmFsYW5jZQUNcG9vbExQQmFsYW5jZQQIY3VyUHJpY2UAAAQPbHBBbXRBc3NldFNoYXJlCQEHZnJvbVgxOAIJAJEDAgUKcHJpY2VzTGlzdAABBQZzY2FsZTgEEWxwUHJpY2VBc3NldFNoYXJlCQEHZnJvbVgxOAIJAJEDAgUKcHJpY2VzTGlzdAACBQZzY2FsZTgECnBvb2xXZWlnaHQJAQV2YWx1ZQEJAJoIAgUPZmFjdG9yeUNvbnRyYWN0CQENa2V5UG9vbFdlaWdodAEJAKUIAQUEdGhpcwkAlAoCBQNuaWwJALkJAgkAzAgCAg4lZCVkJWQlZCVkJWQlZAkAzAgCCQCkAwEFEmFjY0FtdEFzc2V0QmFsYW5jZQkAzAgCCQCkAwEFFGFjY1ByaWNlQXNzZXRCYWxhbmNlCQDMCAIJAKQDAQUNcG9vbExQQmFsYW5jZQkAzAgCCQCkAwEFCGN1clByaWNlCQDMCAIJAKQDAQUPbHBBbXRBc3NldFNoYXJlCQDMCAIJAKQDAQURbHBQcmljZUFzc2V0U2hhcmUJAMwIAgkApAMBBQpwb29sV2VpZ2h0BQNuaWwFA1NFUAFpASBldmFsdWF0ZVB1dEJ5QW1vdW50QXNzZXRSRUFET05MWQEMaW5BbUFzc2V0QW10BANjZmcJAQ1nZXRQb29sQ29uZmlnAAQJbHBBc3NldElkCQDZBAEJAJEDAgUDY2ZnBRBpZHhQb29sTFBBc3NldElkBAxhbUFzc2V0SWRTdHIJAJEDAgUDY2ZnBQ1pZHhBbXRBc3NldElkBAlhbUFzc2V0SWQJANkEAQUMYW1Bc3NldElkU3RyBAxwckFzc2V0SWRTdHIJAJEDAgUDY2ZnBQ9pZHhQcmljZUFzc2V0SWQECXByQXNzZXRJZAkA2QQBBQxwckFzc2V0SWRTdHIEC2FtdEFzc2V0RGNtCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUDY2ZnBQ5pZHhBbXRBc3NldERjbQQNcHJpY2VBc3NldERjbQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFA2NmZwUQaWR4UHJpY2VBc3NldERjbQQKcG9vbFN0YXR1cwkAkQMCBQNjZmcFDWlkeFBvb2xTdGF0dXMEDXBvb2xMUEJhbGFuY2UICQETdmFsdWVPckVycm9yTWVzc2FnZQIJAOwHAQUJbHBBc3NldElkCQCsAgIJAKwCAgIGQXNzZXQgCQDYBAEFCWxwQXNzZXRJZAIOIGRvZXNuJ3QgZXhpc3QIcXVhbnRpdHkEEmFjY0FtdEFzc2V0QmFsYW5jZQkBDWdldEFjY0JhbGFuY2UBBQxhbUFzc2V0SWRTdHIEFGFjY1ByaWNlQXNzZXRCYWxhbmNlCQENZ2V0QWNjQmFsYW5jZQEFDHByQXNzZXRJZFN0cgQOYW10QXNzZXRBbXRYMTgJAQV0b1gxOAIFEmFjY0FtdEFzc2V0QmFsYW5jZQULYW10QXNzZXREY20EEHByaWNlQXNzZXRBbXRYMTgJAQV0b1gxOAIFFGFjY1ByaWNlQXNzZXRCYWxhbmNlBQ1wcmljZUFzc2V0RGNtBAtjdXJQcmljZVgxOAMJAAACBQ1wb29sTFBCYWxhbmNlAAAFCnplcm9CaWdJbnQJAQ9jYWxjUHJpY2VCaWdJbnQCBRBwcmljZUFzc2V0QW10WDE4BQ5hbXRBc3NldEFtdFgxOAQPaW5BbUFzc2V0QW10WDE4CQEFdG9YMTgCBQxpbkFtQXNzZXRBbXQFC2FtdEFzc2V0RGNtBA9pblByQXNzZXRBbXRYMTgJALwCAwUPaW5BbUFzc2V0QW10WDE4BQtjdXJQcmljZVgxOAUHc2NhbGUxOAQMaW5QckFzc2V0QW10CQEHZnJvbVgxOAIFD2luUHJBc3NldEFtdFgxOAUNcHJpY2VBc3NldERjbQQGZXN0UHV0CQEUZXN0aW1hdGVQdXRPcGVyYXRpb24JAgAAoMIeBQxpbkFtQXNzZXRBbXQFCWFtQXNzZXRJZAUMaW5QckFzc2V0QW10BQlwckFzc2V0SWQCAAYHBAljYWxjTHBBbXQIBQZlc3RQdXQCXzEEDGN1clByaWNlQ2FsYwgFBmVzdFB1dAJfMwQJYW1CYWxhbmNlCAUGZXN0UHV0Al80BAlwckJhbGFuY2UIBQZlc3RQdXQCXzUECmxwRW1pc3Npb24IBQZlc3RQdXQCXzYJAJQKAgUDbmlsCQC5CQIJAMwIAgIQJWQlZCVkJWQlZCVkJWQlZAkAzAgCCQCkAwEFCWNhbGNMcEFtdAkAzAgCCQCkAwEJAQdmcm9tWDE4AgULY3VyUHJpY2VYMTgFBnNjYWxlOAkAzAgCCQCkAwEFCWFtQmFsYW5jZQkAzAgCCQCkAwEFCXByQmFsYW5jZQkAzAgCCQCkAwEFCmxwRW1pc3Npb24JAMwIAgUKcG9vbFN0YXR1cwkAzAgCCQCkAwEFDGluQW1Bc3NldEFtdAkAzAgCCQCkAwEFDGluUHJBc3NldEFtdAUDbmlsBQNTRVABaQEfZXZhbHVhdGVQdXRCeVByaWNlQXNzZXRSRUFET05MWQEMaW5QckFzc2V0QW10BANjZmcJAQ1nZXRQb29sQ29uZmlnAAQJbHBBc3NldElkCQDZBAEJAJEDAgUDY2ZnBRBpZHhQb29sTFBBc3NldElkBAxhbUFzc2V0SWRTdHIJAJEDAgUDY2ZnBQ1pZHhBbXRBc3NldElkBAlhbUFzc2V0SWQJANkEAQUMYW1Bc3NldElkU3RyBAxwckFzc2V0SWRTdHIJAJEDAgUDY2ZnBQ9pZHhQcmljZUFzc2V0SWQECXByQXNzZXRJZAkA2QQBBQxwckFzc2V0SWRTdHIEC2FtdEFzc2V0RGNtCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUDY2ZnBQ5pZHhBbXRBc3NldERjbQQNcHJpY2VBc3NldERjbQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFA2NmZwUQaWR4UHJpY2VBc3NldERjbQQKcG9vbFN0YXR1cwkAkQMCBQNjZmcFDWlkeFBvb2xTdGF0dXMEDXBvb2xMUEJhbGFuY2UICQETdmFsdWVPckVycm9yTWVzc2FnZQIJAOwHAQUJbHBBc3NldElkCQCsAgIJAKwCAgIGQXNzZXQgCQDYBAEFCWxwQXNzZXRJZAIOIGRvZXNuJ3QgZXhpc3QIcXVhbnRpdHkEDGFtQmFsYW5jZVJhdwkBDWdldEFjY0JhbGFuY2UBBQxhbUFzc2V0SWRTdHIEDHByQmFsYW5jZVJhdwkBDWdldEFjY0JhbGFuY2UBBQxwckFzc2V0SWRTdHIED2FtQmFsYW5jZVJhd1gxOAkBBXRvWDE4AgUMYW1CYWxhbmNlUmF3BQthbXRBc3NldERjbQQPcHJCYWxhbmNlUmF3WDE4CQEFdG9YMTgCBQxwckJhbGFuY2VSYXcFDXByaWNlQXNzZXREY20EC2N1clByaWNlWDE4AwkAAAIFDXBvb2xMUEJhbGFuY2UAAAUKemVyb0JpZ0ludAkBD2NhbGNQcmljZUJpZ0ludAIFD3ByQmFsYW5jZVJhd1gxOAUPYW1CYWxhbmNlUmF3WDE4BA9pblByQXNzZXRBbXRYMTgJAQV0b1gxOAIFDGluUHJBc3NldEFtdAUNcHJpY2VBc3NldERjbQQPaW5BbUFzc2V0QW10WDE4CQC8AgMFD2luUHJBc3NldEFtdFgxOAUHc2NhbGUxOAULY3VyUHJpY2VYMTgEDGluQW1Bc3NldEFtdAkBB2Zyb21YMTgCBQ9pbkFtQXNzZXRBbXRYMTgFC2FtdEFzc2V0RGNtBAZlc3RQdXQJARRlc3RpbWF0ZVB1dE9wZXJhdGlvbgkCAACgwh4FDGluQW1Bc3NldEFtdAUJYW1Bc3NldElkBQxpblByQXNzZXRBbXQFCXByQXNzZXRJZAIABgcECWNhbGNMcEFtdAgFBmVzdFB1dAJfMQQMY3VyUHJpY2VDYWxjCAUGZXN0UHV0Al8zBAlhbUJhbGFuY2UIBQZlc3RQdXQCXzQECXByQmFsYW5jZQgFBmVzdFB1dAJfNQQKbHBFbWlzc2lvbggFBmVzdFB1dAJfNgkAlAoCBQNuaWwJALkJAgkAzAgCAhAlZCVkJWQlZCVkJWQlZCVkCQDMCAIJAKQDAQUJY2FsY0xwQW10CQDMCAIJAKQDAQkBB2Zyb21YMTgCBQtjdXJQcmljZVgxOAUGc2NhbGU4CQDMCAIJAKQDAQUJYW1CYWxhbmNlCQDMCAIJAKQDAQUJcHJCYWxhbmNlCQDMCAIJAKQDAQUKbHBFbWlzc2lvbgkAzAgCBQpwb29sU3RhdHVzCQDMCAIJAKQDAQUMaW5BbUFzc2V0QW10CQDMCAIJAKQDAQUMaW5QckFzc2V0QW10BQNuaWwFA1NFUAFpARNldmFsdWF0ZUdldFJFQURPTkxZAhBwYXltZW50THBBc3NldElkDHBheW1lbnRMcEFtdAQDcmVzCQEUZXN0aW1hdGVHZXRPcGVyYXRpb24EAgAFEHBheW1lbnRMcEFzc2V0SWQFDHBheW1lbnRMcEFtdAUEdGhpcwQIb3V0QW1BbXQIBQNyZXMCXzEECG91dFByQW10CAUDcmVzAl8yBAlhbUJhbGFuY2UIBQNyZXMCXzUECXByQmFsYW5jZQgFA3JlcwJfNgQKbHBFbWlzc2lvbggFA3JlcwJfNwQIY3VyUHJpY2UIBQNyZXMCXzgECnBvb2xTdGF0dXMJAQ1wYXJzZUludFZhbHVlAQgFA3JlcwJfOQkAlAoCBQNuaWwJALkJAgkAzAgCAg4lZCVkJWQlZCVkJWQlZAkAzAgCCQCkAwEFCG91dEFtQW10CQDMCAIJAKQDAQUIb3V0UHJBbXQJAMwIAgkApAMBBQlhbUJhbGFuY2UJAMwIAgkApAMBBQlwckJhbGFuY2UJAMwIAgkApAMBBQpscEVtaXNzaW9uCQDMCAIJAKYDAQUIY3VyUHJpY2UJAMwIAgkApAMBBQpwb29sU3RhdHVzBQNuaWwFA1NFUAECdHgBBnZlcmlmeQAED3RhcmdldFB1YmxpY0tleQQHJG1hdGNoMAkBFm1hbmFnZXJQdWJsaWNLZXlPclVuaXQAAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAnBrBQckbWF0Y2gwBQJwawMJAAECBQckbWF0Y2gwAgRVbml0CAUCdHgPc2VuZGVyUHVibGljS2V5CQACAQILTWF0Y2ggZXJyb3IEByRtYXRjaDAFAnR4AwkAAQIFByRtYXRjaDACBU9yZGVyBAVvcmRlcgUHJG1hdGNoMAQKbWF0Y2hlclB1YgkBE2dldE1hdGNoZXJQdWJPckZhaWwABA0kdDA2Nzk3MDY4MDg3AwkBE3NraXBPcmRlclZhbGlkYXRpb24ACQCUCgIGAgAJARt2YWxpZGF0ZU1hdGNoZXJPcmRlckFsbG93ZWQBBQVvcmRlcgQKb3JkZXJWYWxpZAgFDSR0MDY3OTcwNjgwODcCXzEEDm9yZGVyVmFsaWRJbmZvCAUNJHQwNjc5NzA2ODA4NwJfMgQLc2VuZGVyVmFsaWQJAPQDAwgFBW9yZGVyCWJvZHlCeXRlcwkAkQMCCAUFb3JkZXIGcHJvb2ZzAAAIBQVvcmRlcg9zZW5kZXJQdWJsaWNLZXkEDG1hdGNoZXJWYWxpZAkA9AMDCAUFb3JkZXIJYm9keUJ5dGVzCQCRAwIIBQVvcmRlcgZwcm9vZnMAAQUKbWF0Y2hlclB1YgMDAwUKb3JkZXJWYWxpZAULc2VuZGVyVmFsaWQHBQxtYXRjaGVyVmFsaWQHBgkBD3Rocm93T3JkZXJFcnJvcgQFCm9yZGVyVmFsaWQFDm9yZGVyVmFsaWRJbmZvBQtzZW5kZXJWYWxpZAUMbWF0Y2hlclZhbGlkAwkAAQIFByRtYXRjaDACFFNldFNjcmlwdFRyYW5zYWN0aW9uBAFzBQckbWF0Y2gwAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAUPdGFyZ2V0UHVibGljS2V5BgQHbmV3SGFzaAkA9gMBCQEFdmFsdWUBCAUBcwZzY3JpcHQEC2FsbG93ZWRIYXNoCQDbBAEJAQV2YWx1ZQEJAJ0IAgUPZmFjdG9yeUNvbnRyYWN0CQEWa2V5QWxsb3dlZExwU2NyaXB0SGFzaAAEC2N1cnJlbnRIYXNoCQDxBwEFBHRoaXMDCQAAAgULYWxsb3dlZEhhc2gFB25ld0hhc2gJAQIhPQIFC2N1cnJlbnRIYXNoBQduZXdIYXNoBwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAUPdGFyZ2V0UHVibGljS2V50xR35w==", "height": 3637174, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: Fp57EqxZjFNyBXQmHcRvRny1yzTXqY25eT63nJ6h3JCo Next: 8g12DWAruHRAhw4V4LnT2Q9adNRAyfBdoESfCyKjtS2i Diff:
OldNewDifferences
183183
184184
185185 func getManagerVaultAddressOrThis () = {
186- let factoryAddress = match addressFromStringOrThis(fc()) {
187- case fca: Address =>
188- fca
186+ let factoryAddress = match getString(fc()) {
187+ case fca: String =>
188+ addressFromStringOrThis(fca)
189189 case _ =>
190190 this
191191 }
258258
259259 let poolConfigParsed = parsePoolConfig(getPoolConfig())
260260
261-let $t095199685 = poolConfigParsed
261+let $t095299695 = poolConfigParsed
262262
263-let cfgPoolAddress = $t095199685._1
263+let cfgPoolAddress = $t095299695._1
264264
265-let cfgPoolStatus = $t095199685._2
265+let cfgPoolStatus = $t095299695._2
266266
267-let cfgLpAssetId = $t095199685._3
267+let cfgLpAssetId = $t095299695._3
268268
269-let cfgAmountAssetId = $t095199685._4
269+let cfgAmountAssetId = $t095299695._4
270270
271-let cfgPriceAssetId = $t095199685._5
271+let cfgPriceAssetId = $t095299695._5
272272
273-let cfgAmountAssetDecimals = $t095199685._6
273+let cfgAmountAssetDecimals = $t095299695._6
274274
275-let cfgPriceAssetDecimals = $t095199685._7
275+let cfgPriceAssetDecimals = $t095299695._7
276276
277277 func getFactoryConfig () = split(getStringOrFail(factoryContract, keyFactoryConfig()), SEP)
278278
421421
422422
423423 func rebalanceAsset (assetId) = {
424- let $t01592116057 = getLeaseProxyConfig(assetId)
425- let isLeasable = $t01592116057._1
426- let leasedRatio = $t01592116057._2
427- let minBalance = $t01592116057._3
428- let proxyAddress = $t01592116057._4
429- let proxyAssetId = $t01592116057._5
430- let proxyRateMul = $t01592116057._6
431- let stakingProfitAddress = $t01592116057._7
424+ let $t01593116067 = getLeaseProxyConfig(assetId)
425+ let isLeasable = $t01593116067._1
426+ let leasedRatio = $t01593116067._2
427+ let minBalance = $t01593116067._3
428+ let proxyAddress = $t01593116067._4
429+ let proxyAssetId = $t01593116067._5
430+ let proxyRateMul = $t01593116067._6
431+ let stakingProfitAddress = $t01593116067._7
432432 if (isLeasable)
433433 then rebalanceInternal(leasedRatio, assetId, proxyAssetId, minBalance, addressFromStringValue(proxyAddress), proxyRateMul, addressFromStringValue(stakingProfitAddress))
434434 else nil
436436
437437
438438 func withdrawAndRebalanceAsset (assetId,getAmount) = {
439- let $t01645616592 = getLeaseProxyConfig(assetId)
440- let isLeasable = $t01645616592._1
441- let leasedRatio = $t01645616592._2
442- let minBalance = $t01645616592._3
443- let proxyAddress = $t01645616592._4
444- let proxyAssetId = $t01645616592._5
445- let proxyRateMul = $t01645616592._6
446- let stakingProfitAddress = $t01645616592._7
439+ let $t01646616602 = getLeaseProxyConfig(assetId)
440+ let isLeasable = $t01646616602._1
441+ let leasedRatio = $t01646616602._2
442+ let minBalance = $t01646616602._3
443+ let proxyAddress = $t01646616602._4
444+ let proxyAssetId = $t01646616602._5
445+ let proxyRateMul = $t01646616602._6
446+ let stakingProfitAddress = $t01646616602._7
447447 if (isLeasable)
448448 then {
449449 let newTotalLeasableBalance = max([0, ((getAccBalance(assetId) - getAmount) - minBalance)])
656656 let priceAssetBalance = getAccBalance(assetIdToString(cfgPriceAssetId))
657657 let amountAssetAmount = order.amount
658658 let priceAssetAmount = fraction(order.amount, order.price, scale8, FLOOR)
659- let $t02898129193 = if ((order.orderType == Buy))
659+ let $t02899129203 = if ((order.orderType == Buy))
660660 then $Tuple2(amountAssetAmount, -(priceAssetAmount))
661661 else $Tuple2(-(amountAssetAmount), priceAssetAmount)
662- let amountAssetBalanceDelta = $t02898129193._1
663- let priceAssetBalanceDelta = $t02898129193._2
662+ let amountAssetBalanceDelta = $t02899129203._1
663+ let priceAssetBalanceDelta = $t02899129203._2
664664 if (if (if (isGlobalShutdown())
665665 then true
666666 else (cfgPoolStatus == PoolMatcherDisabled))
673673 then throw("Wrong order assets.")
674674 else {
675675 let kLp = valueOrErrorMessage(parseBigInt(valueOrElse(getString(this, keyKLp), "0")), fmtErr("invalid kLp"))
676- let $t02963329733 = refreshKLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
677- let unusedActions = $t02963329733._1
678- let kLpNew = $t02963329733._2
676+ let $t02964329743 = refreshKLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
677+ let unusedActions = $t02964329743._1
678+ let kLpNew = $t02964329743._2
679679 let isOrderValid = (kLpNew >= kLp)
680680 let info = makeString(["kLp=", toString(kLp), " kLpNew=", toString(kLpNew), " amountAssetBalance=", toString(amountAssetBalance), " priceAssetBalance=", toString(priceAssetBalance), " amountAssetBalanceDelta=", toString(amountAssetBalanceDelta), " priceAssetBalanceDelta=", toString(priceAssetBalanceDelta), " height=", toString(height)], "")
681681 $Tuple2(isOrderValid, info)
754754 else if ((paymentAssetId == cfgPriceAssetId))
755755 then false
756756 else throwErr("invalid asset")
757- let $t03284633139 = if (isEval)
757+ let $t03285633149 = if (isEval)
758758 then $Tuple2(amountBalanceRaw, priceBalanceRaw)
759759 else if (paymentInAmountAsset)
760760 then $Tuple2((amountBalanceRaw - paymentAmountRaw), priceBalanceRaw)
761761 else $Tuple2(amountBalanceRaw, (priceBalanceRaw - paymentAmountRaw))
762- let amountBalanceOld = $t03284633139._1
763- let priceBalanceOld = $t03284633139._2
764- let $t03314333292 = if (paymentInAmountAsset)
762+ let amountBalanceOld = $t03285633149._1
763+ let priceBalanceOld = $t03285633149._2
764+ let $t03315333302 = if (paymentInAmountAsset)
765765 then $Tuple2(paymentAmountRaw, 0)
766766 else $Tuple2(0, paymentAmountRaw)
767- let amountAssetAmountRaw = $t03314333292._1
768- let priceAssetAmountRaw = $t03314333292._2
767+ let amountAssetAmountRaw = $t03315333302._1
768+ let priceAssetAmountRaw = $t03315333302._2
769769 let amountAssetAmount = takeFee(amountAssetAmountRaw, inFee)._1
770770 let priceAssetAmount = takeFee(priceAssetAmountRaw, inFee)._1
771- let $t03342433488 = takeFee(paymentAmountRaw, inFee)
772- let paymentAmount = $t03342433488._1
773- let feeAmount = $t03342433488._2
771+ let $t03343433498 = takeFee(paymentAmountRaw, inFee)
772+ let paymentAmount = $t03343433498._1
773+ let feeAmount = $t03343433498._2
774774 let amountBalanceNew = (amountBalanceOld + amountAssetAmount)
775775 let priceBalanceNew = (priceBalanceOld + priceAssetAmount)
776776 let priceNewX18 = calcPriceBigInt(toX18(priceBalanceNew, cfgPriceAssetDecimals), toX18(amountBalanceNew, cfgAmountAssetDecimals))
793793 let priceOldX18 = calcPriceBigInt(toX18(priceBalanceOld, cfgPriceAssetDecimals), toX18(amountBalanceOld, cfgAmountAssetDecimals))
794794 let priceOld = fromX18(priceOldX18, scale8)
795795 let loss = {
796- let $t03516935336 = if (paymentInAmountAsset)
796+ let $t03517935346 = if (paymentInAmountAsset)
797797 then $Tuple2(amountAssetAmountRaw, amountBalanceOld)
798798 else $Tuple2(priceAssetAmountRaw, priceBalanceOld)
799- let amount = $t03516935336._1
800- let balance = $t03516935336._2
799+ let amount = $t03517935346._1
800+ let balance = $t03517935346._2
801801 let issueAmountBoth = toInt(fraction(supplyBigInt, toBigInt((amount / 2)), toBigInt(balance)))
802802 fraction((issueAmount - issueAmountBoth), scale8, issueAmountBoth)
803803 }
837837 let supplyBigInt = toBigInt(valueOrErrorMessage(assetInfo(cfgLpAssetId), (("asset " + toBase58String(cfgLpAssetId)) + " doesn't exist")).quantity)
838838 let redeemedBigInt = toBigInt(paymentAmount)
839839 let amountRaw = max([0, toInt(((balanceBigInt * (scale18 - pow((scale18 - ((redeemedBigInt * scale18) / supplyBigInt)), 18, big2, 0, 18, DOWN))) / scale18))])
840- let $t03741437470 = takeFee(amountRaw, outFee)
841- let totalAmount = $t03741437470._1
842- let feeAmount = $t03741437470._2
843- let $t03747437700 = if (outInAmountAsset)
840+ let $t03742437480 = takeFee(amountRaw, outFee)
841+ let totalAmount = $t03742437480._1
842+ let feeAmount = $t03742437480._2
843+ let $t03748437710 = if (outInAmountAsset)
844844 then $Tuple4(totalAmount, 0, (amBalanceOld - amountRaw), prBalanceOld)
845845 else $Tuple4(0, totalAmount, amBalanceOld, (prBalanceOld - amountRaw))
846- let outAmAmount = $t03747437700._1
847- let outPrAmount = $t03747437700._2
848- let amBalanceNew = $t03747437700._3
849- let prBalanceNew = $t03747437700._4
846+ let outAmAmount = $t03748437710._1
847+ let outPrAmount = $t03748437710._2
848+ let amBalanceNew = $t03748437710._3
849+ let prBalanceNew = $t03748437710._4
850850 let priceNewX18 = calcPriceBigInt(toX18(prBalanceNew, cfgPriceAssetDecimals), toX18(amBalanceNew, cfgAmountAssetDecimals))
851851 let priceNew = fromX18(priceNewX18, scale8)
852852 let commonState = if (isEval)
911911
912912 @Callable(i)
913913 func calculateAmountOutForSwapREADONLY (cleanAmountIn,isReverse,feePoolAmount) = {
914- let $t03955939864 = if ((isReverse == false))
914+ let $t03956939874 = if ((isReverse == false))
915915 then {
916916 let assetOut = getStringOrFail(this, pa())
917917 let assetIn = getStringOrFail(this, aa())
922922 let assetIn = getStringOrFail(this, pa())
923923 $Tuple2(assetOut, assetIn)
924924 }
925- let assetOut = $t03955939864._1
926- let assetIn = $t03955939864._2
925+ let assetOut = $t03956939874._1
926+ let assetIn = $t03956939874._2
927927 let poolAssetInBalance = getAccBalance(assetIn)
928928 let poolAssetOutBalance = getAccBalance(assetOut)
929929 let amountOut = fraction(poolAssetOutBalance, cleanAmountIn, (poolAssetInBalance + cleanAmountIn))
10391039 else throw("Strict value is not equal to itself.")
10401040 }
10411041 else [ScriptTransfer(i.caller, emitLpAmt, lpAssetId)]
1042- let $t04435144813 = refreshKLpInternal(0, 0, 0)
1043- if (($t04435144813 == $t04435144813))
1042+ let $t04436144823 = refreshKLpInternal(0, 0, 0)
1043+ if (($t04436144823 == $t04436144823))
10441044 then {
1045- let updatedKLp = $t04435144813._2
1046- let refreshKLpActions = $t04435144813._1
1045+ let updatedKLp = $t04436144823._2
1046+ let refreshKLpActions = $t04436144823._1
10471047 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
10481048 if ((isUpdatedKLpValid == isUpdatedKLpValid))
10491049 then {
10801080 let currentKLp = calcCurrentKLp(amAssetPmt, prAssetPmt, toBigInt(0))
10811081 if ((currentKLp == currentKLp))
10821082 then {
1083- let $t04542545490 = refreshKLpInternal(0, 0, 0)
1084- let refreshKLpActions = $t04542545490._1
1085- let updatedKLp = $t04542545490._2
1083+ let $t04543545500 = refreshKLpInternal(0, 0, 0)
1084+ let refreshKLpActions = $t04543545500._1
1085+ let updatedKLp = $t04543545500._2
10861086 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
10871087 if ((isUpdatedKLpValid == isUpdatedKLpValid))
10881088 then (state ++ refreshKLpActions)
11291129 then {
11301130 let userAddress = i.caller
11311131 let txId = i.transactionId
1132- let $t04667846830 = calcPutOneToken(paymentAmountRaw, paymentAssetId, userAddress, txId)
1133- if (($t04667846830 == $t04667846830))
1132+ let $t04668846840 = calcPutOneToken(paymentAmountRaw, paymentAssetId, userAddress, txId)
1133+ if (($t04668846840 == $t04668846840))
11341134 then {
1135- let paymentInAmountAsset = $t04667846830._5
1136- let bonus = $t04667846830._4
1137- let feeAmount = $t04667846830._3
1138- let commonState = $t04667846830._2
1139- let emitAmountEstimated = $t04667846830._1
1135+ let paymentInAmountAsset = $t04668846840._5
1136+ let bonus = $t04668846840._4
1137+ let feeAmount = $t04668846840._3
1138+ let commonState = $t04668846840._2
1139+ let emitAmountEstimated = $t04668846840._1
11401140 let emitAmount = if (if ((minOutAmount > 0))
11411141 then (minOutAmount > emitAmountEstimated)
11421142 else false)
11561156 let sendFee = if ((feeAmount > 0))
11571157 then [ScriptTransfer(feeCollectorAddress, feeAmount, paymentAssetId)]
11581158 else nil
1159- let $t04741647613 = if ((this == feeCollectorAddress))
1159+ let $t04742647623 = if ((this == feeCollectorAddress))
11601160 then $Tuple2(0, 0)
11611161 else if (paymentInAmountAsset)
11621162 then $Tuple2(-(feeAmount), 0)
11631163 else $Tuple2(0, -(feeAmount))
1164- let amountAssetBalanceDelta = $t04741647613._1
1165- let priceAssetBalanceDelta = $t04741647613._2
1166- let $t04761647724 = refreshKLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
1167- let refreshKLpActions = $t04761647724._1
1168- let updatedKLp = $t04761647724._2
1164+ let amountAssetBalanceDelta = $t04742647623._1
1165+ let priceAssetBalanceDelta = $t04742647623._2
1166+ let $t04762647734 = refreshKLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
1167+ let refreshKLpActions = $t04762647734._1
1168+ let updatedKLp = $t04762647734._2
11691169 let kLp = value(getString(keyKLp))
11701170 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
11711171 if ((isUpdatedKLpValid == isUpdatedKLpValid))
11901190
11911191 @Callable(i)
11921192 func putOneTknREADONLY (paymentAssetId,paymentAmountRaw) = {
1193- let $t04807948236 = calcPutOneToken(paymentAmountRaw, parseAssetId(paymentAssetId), unit, unit)
1194- let emitAmountEstimated = $t04807948236._1
1195- let commonState = $t04807948236._2
1196- let feeAmount = $t04807948236._3
1197- let bonus = $t04807948236._4
1198- let paymentInAmountAsset = $t04807948236._5
1193+ let $t04808948246 = calcPutOneToken(paymentAmountRaw, parseAssetId(paymentAssetId), unit, unit)
1194+ let emitAmountEstimated = $t04808948246._1
1195+ let commonState = $t04808948246._2
1196+ let feeAmount = $t04808948246._3
1197+ let bonus = $t04808948246._4
1198+ let paymentInAmountAsset = $t04808948246._5
11991199 $Tuple2(nil, $Tuple3(emitAmountEstimated, feeAmount, bonus))
12001200 }
12011201
12321232 then {
12331233 let userAddress = i.caller
12341234 let txId = i.transactionId
1235- let $t04912149274 = calcGetOneToken(outAssetId, paymentAmount, paymentAssetId, userAddress, txId)
1236- if (($t04912149274 == $t04912149274))
1235+ let $t04913149284 = calcGetOneToken(outAssetId, paymentAmount, paymentAssetId, userAddress, txId)
1236+ if (($t04913149284 == $t04913149284))
12371237 then {
1238- let outInAmountAsset = $t04912149274._5
1239- let bonus = $t04912149274._4
1240- let feeAmount = $t04912149274._3
1241- let commonState = $t04912149274._2
1242- let amountEstimated = $t04912149274._1
1238+ let outInAmountAsset = $t04913149284._5
1239+ let bonus = $t04913149284._4
1240+ let feeAmount = $t04913149284._3
1241+ let commonState = $t04913149284._2
1242+ let amountEstimated = $t04913149284._1
12431243 let amount = if (if ((minOutAmount > 0))
12441244 then (minOutAmount > amountEstimated)
12451245 else false)
12531253 let sendFee = if ((feeAmount > 0))
12541254 then [ScriptTransfer(feeCollectorAddress, feeAmount, outAssetId)]
12551255 else nil
1256- let $t04993850185 = {
1256+ let $t04994850195 = {
12571257 let feeAmountForCalc = if ((this == feeCollectorAddress))
12581258 then 0
12591259 else feeAmount
12611261 then $Tuple2(-((amount + feeAmountForCalc)), 0)
12621262 else $Tuple2(0, -((amount + feeAmountForCalc)))
12631263 }
1264- let amountAssetBalanceDelta = $t04993850185._1
1265- let priceAssetBalanceDelta = $t04993850185._2
1266- let $t05018850296 = refreshKLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
1267- let refreshKLpActions = $t05018850296._1
1268- let updatedKLp = $t05018850296._2
1264+ let amountAssetBalanceDelta = $t04994850195._1
1265+ let priceAssetBalanceDelta = $t04994850195._2
1266+ let $t05019850306 = refreshKLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
1267+ let refreshKLpActions = $t05019850306._1
1268+ let updatedKLp = $t05019850306._2
12691269 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
12701270 if ((isUpdatedKLpValid == isUpdatedKLpValid))
12711271 then $Tuple2(((((commonState ++ withdrawState) ++ assetTransfer) ++ sendFee) ++ refreshKLpActions), amount)
12841284
12851285 @Callable(i)
12861286 func getOneTknREADONLY (outAssetId,paymentAmount) = {
1287- let $t05057450730 = calcGetOneToken(parseAssetId(outAssetId), paymentAmount, cfgLpAssetId, unit, unit)
1288- let amountEstimated = $t05057450730._1
1289- let commonState = $t05057450730._2
1290- let feeAmount = $t05057450730._3
1291- let bonus = $t05057450730._4
1292- let outInAmountAsset = $t05057450730._5
1287+ let $t05058450740 = calcGetOneToken(parseAssetId(outAssetId), paymentAmount, cfgLpAssetId, unit, unit)
1288+ let amountEstimated = $t05058450740._1
1289+ let commonState = $t05058450740._2
1290+ let feeAmount = $t05058450740._3
1291+ let bonus = $t05058450740._4
1292+ let outInAmountAsset = $t05058450740._5
12931293 $Tuple2(nil, $Tuple3(amountEstimated, feeAmount, bonus))
12941294 }
12951295
13261326 let unstakeInv = invoke(stakingContract, "unstake", [toBase58String(cfgLpAssetId), unstakeAmount], nil)
13271327 if ((unstakeInv == unstakeInv))
13281328 then {
1329- let $t05163551786 = calcGetOneToken(outAssetId, unstakeAmount, cfgLpAssetId, userAddress, txId)
1330- if (($t05163551786 == $t05163551786))
1329+ let $t05164551796 = calcGetOneToken(outAssetId, unstakeAmount, cfgLpAssetId, userAddress, txId)
1330+ if (($t05164551796 == $t05164551796))
13311331 then {
1332- let outInAmountAsset = $t05163551786._5
1333- let bonus = $t05163551786._4
1334- let feeAmount = $t05163551786._3
1335- let commonState = $t05163551786._2
1336- let amountEstimated = $t05163551786._1
1332+ let outInAmountAsset = $t05164551796._5
1333+ let bonus = $t05164551796._4
1334+ let feeAmount = $t05164551796._3
1335+ let commonState = $t05164551796._2
1336+ let amountEstimated = $t05164551796._1
13371337 let amount = if (if ((minOutAmount > 0))
13381338 then (minOutAmount > amountEstimated)
13391339 else false)
13471347 let sendFee = if ((feeAmount > 0))
13481348 then [ScriptTransfer(feeCollectorAddress, feeAmount, outAssetId)]
13491349 else nil
1350- let $t05244552692 = {
1350+ let $t05245552702 = {
13511351 let feeAmountForCalc = if ((this == feeCollectorAddress))
13521352 then 0
13531353 else feeAmount
13551355 then $Tuple2(-((amount + feeAmountForCalc)), 0)
13561356 else $Tuple2(0, -((amount + feeAmountForCalc)))
13571357 }
1358- let amountAssetBalanceDelta = $t05244552692._1
1359- let priceAssetBalanceDelta = $t05244552692._2
1360- let $t05269552803 = refreshKLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
1361- let refreshKLpActions = $t05269552803._1
1362- let updatedKLp = $t05269552803._2
1358+ let amountAssetBalanceDelta = $t05245552702._1
1359+ let priceAssetBalanceDelta = $t05245552702._2
1360+ let $t05270552813 = refreshKLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
1361+ let refreshKLpActions = $t05270552813._1
1362+ let updatedKLp = $t05270552813._2
13631363 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
13641364 if ((isUpdatedKLpValid == isUpdatedKLpValid))
13651365 then $Tuple2(((((commonState ++ withdrawState) ++ assetTransfer) ++ sendFee) ++ refreshKLpActions), amount)
13931393 let burnLPAssetOnFactory = invoke(factoryContract, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
13941394 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
13951395 then {
1396- let $t05389853979 = refreshKLpInternal(-(outAmAmt), -(outPrAmt), 0)
1397- let refreshKLpActions = $t05389853979._1
1398- let updatedKLp = $t05389853979._2
1396+ let $t05390853989 = refreshKLpInternal(-(outAmAmt), -(outPrAmt), 0)
1397+ let refreshKLpActions = $t05390853989._1
1398+ let updatedKLp = $t05390853989._2
13991399 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
14001400 if ((isUpdatedKLpValid == isUpdatedKLpValid))
14011401 then ((withdrawState ++ state) ++ refreshKLpActions)
14281428 let burnLPAssetOnFactory = invoke(factoryContract, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
14291429 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
14301430 then {
1431- let $t05507455155 = refreshKLpInternal(-(outAmAmt), -(outPrAmt), 0)
1432- let refreshKLpActions = $t05507455155._1
1433- let updatedKLp = $t05507455155._2
1431+ let $t05508455165 = refreshKLpInternal(-(outAmAmt), -(outPrAmt), 0)
1432+ let refreshKLpActions = $t05508455165._1
1433+ let updatedKLp = $t05508455165._2
14341434 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
14351435 if ((isUpdatedKLpValid == isUpdatedKLpValid))
14361436 then ((withdrawState ++ state) ++ refreshKLpActions)
14751475 let burnLPAssetOnFactory = invoke(factoryContract, "burn", [amount], [AttachedPayment(lpAssetId, amount)])
14761476 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
14771477 then {
1478- let $t05642756508 = refreshKLpInternal(-(outAmAmt), -(outPrAmt), 0)
1479- let refreshKLpActions = $t05642756508._1
1480- let updatedKLp = $t05642756508._2
1478+ let $t05643756518 = refreshKLpInternal(-(outAmAmt), -(outPrAmt), 0)
1479+ let refreshKLpActions = $t05643756518._1
1480+ let updatedKLp = $t05643756518._2
14811481 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
14821482 if ((isUpdatedKLpValid == isUpdatedKLpValid))
14831483 then ((withdrawState ++ state) ++ refreshKLpActions)
15291529 let burnLPAssetOnFactory = invoke(factoryContract, "burn", [unstakeAmount], [AttachedPayment(cfgLpAssetId, unstakeAmount)])
15301530 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
15311531 then {
1532- let $t05794958030 = refreshKLpInternal(-(outAmAmt), -(outPrAmt), 0)
1533- let refreshKLpActions = $t05794958030._1
1534- let updatedKLp = $t05794958030._2
1532+ let $t05795958040 = refreshKLpInternal(-(outAmAmt), -(outPrAmt), 0)
1533+ let refreshKLpActions = $t05795958040._1
1534+ let updatedKLp = $t05795958040._2
15351535 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
15361536 if ((isUpdatedKLpValid == isUpdatedKLpValid))
15371537 then ((withdrawState ++ state) ++ refreshKLpActions)
15661566 if ((checkLastRefreshedBlockHeight == checkLastRefreshedBlockHeight))
15671567 then {
15681568 let kLp = valueOrErrorMessage(parseBigInt(valueOrElse(getString(this, keyKLp), "0")), fmtErr("invalid kLp"))
1569- let $t05923459298 = refreshKLpInternal(0, 0, 0)
1570- let kLpUpdateActions = $t05923459298._1
1571- let updatedKLp = $t05923459298._2
1569+ let $t05924459308 = refreshKLpInternal(0, 0, 0)
1570+ let kLpUpdateActions = $t05924459308._1
1571+ let updatedKLp = $t05924459308._2
15721572 let actions = if ((kLp != updatedKLp))
15731573 then kLpUpdateActions
15741574 else throwErr("nothing to refresh")
17431743 match tx {
17441744 case order: Order =>
17451745 let matcherPub = getMatcherPubOrFail()
1746- let $t06796068077 = if (skipOrderValidation())
1746+ let $t06797068087 = if (skipOrderValidation())
17471747 then $Tuple2(true, "")
17481748 else validateMatcherOrderAllowed(order)
1749- let orderValid = $t06796068077._1
1750- let orderValidInfo = $t06796068077._2
1749+ let orderValid = $t06797068087._1
1750+ let orderValidInfo = $t06797068087._2
17511751 let senderValid = sigVerify(order.bodyBytes, order.proofs[0], order.senderPublicKey)
17521752 let matcherValid = sigVerify(order.bodyBytes, order.proofs[1], matcherPub)
17531753 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 () = {
186- let factoryAddress = match addressFromStringOrThis(fc()) {
187- case fca: Address =>
188- fca
186+ let factoryAddress = match getString(fc()) {
187+ case fca: String =>
188+ 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 isGlobalShutdown () = valueOrElse(getBoolean(factoryContract, keyAllPoolsShutdown()), false)
232232
233233
234234 func getMatcherPubOrFail () = fromBase58String(getStringOrFail(factoryContract, keyMatcherPub()))
235235
236236
237237 func getPoolConfig () = {
238238 let amtAsset = getStringOrFail(this, aa())
239239 let priceAsset = getStringOrFail(this, pa())
240240 let iPriceAsset = getIntOrFail(factoryContract, keyMappingsBaseAsset2internalId(priceAsset))
241241 let iAmtAsset = getIntOrFail(factoryContract, keyMappingsBaseAsset2internalId(amtAsset))
242242 split(getStringOrFail(factoryContract, keyPoolConfig(toString(iAmtAsset), toString(iPriceAsset))), SEP)
243243 }
244244
245245
246246 func parseAssetId (input) = if ((input == wavesString))
247247 then unit
248248 else fromBase58String(input)
249249
250250
251251 func assetIdToString (input) = if ((input == unit))
252252 then wavesString
253253 else toBase58String(value(input))
254254
255255
256256 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]))
257257
258258
259259 let poolConfigParsed = parsePoolConfig(getPoolConfig())
260260
261-let $t095199685 = poolConfigParsed
261+let $t095299695 = poolConfigParsed
262262
263-let cfgPoolAddress = $t095199685._1
263+let cfgPoolAddress = $t095299695._1
264264
265-let cfgPoolStatus = $t095199685._2
265+let cfgPoolStatus = $t095299695._2
266266
267-let cfgLpAssetId = $t095199685._3
267+let cfgLpAssetId = $t095299695._3
268268
269-let cfgAmountAssetId = $t095199685._4
269+let cfgAmountAssetId = $t095299695._4
270270
271-let cfgPriceAssetId = $t095199685._5
271+let cfgPriceAssetId = $t095299695._5
272272
273-let cfgAmountAssetDecimals = $t095199685._6
273+let cfgAmountAssetDecimals = $t095299695._6
274274
275-let cfgPriceAssetDecimals = $t095199685._7
275+let cfgPriceAssetDecimals = $t095299695._7
276276
277277 func getFactoryConfig () = split(getStringOrFail(factoryContract, keyFactoryConfig()), SEP)
278278
279279
280280 let stakingContract = valueOrErrorMessage(addressFromString(getFactoryConfig()[idxFactoryStakingContract]), "incorrect staking address")
281281
282282 let slippageContract = valueOrErrorMessage(addressFromString(getFactoryConfig()[idxFactorySlippageContract]), "incorrect staking address")
283283
284284 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)
285285
286286
287287 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)
288288
289289
290290 func getAccBalance (assetId) = {
291291 let balanceOnPool = if ((assetId == "WAVES"))
292292 then wavesBalance(this).available
293293 else assetBalance(this, fromBase58String(assetId))
294294 let totalBalance = ((balanceOnPool + getAdditionalBalanceOrZero(assetId)) - getStakingAssetBalanceOrZero(assetId))
295295 max([0, totalBalance])
296296 }
297297
298298
299299 func calcPriceBigInt (prAmtX18,amAmtX18) = fraction(prAmtX18, scale18, amAmtX18)
300300
301301
302302 func calcPriceBigIntRound (prAmtX18,amAmtX18,round) = fraction(prAmtX18, scale18, amAmtX18, round)
303303
304304
305305 func getRate (proxy) = {
306306 let inv = invoke(proxy, "getRate", nil, nil)
307307 if ((inv == inv))
308308 then match inv {
309309 case r: Int =>
310310 r
311311 case _ =>
312312 throwErr("proxy.getRate() unexpected value")
313313 }
314314 else throw("Strict value is not equal to itself.")
315315 }
316316
317317
318318 func deposit (assetId,amount,stakingAssetId,proxy) = {
319319 let currentAdditionalBalance = getAdditionalBalanceOrZero(assetId)
320320 if ((currentAdditionalBalance == currentAdditionalBalance))
321321 then {
322322 let currentStakingAssetBalance = getStakingAssetBalanceOrZero(stakingAssetId)
323323 if ((currentStakingAssetBalance == currentStakingAssetBalance))
324324 then {
325325 let asset = parseAssetId(assetId)
326326 if ((amount > 0))
327327 then {
328328 let depositInvoke = invoke(proxy, "deposit", nil, [AttachedPayment(asset, amount)])
329329 if ((depositInvoke == depositInvoke))
330330 then match depositInvoke {
331331 case receivedStakingAsset: Int =>
332332 let newAdditionalBalance = (currentAdditionalBalance + amount)
333333 let newStakingAssetBalance = (currentStakingAssetBalance + receivedStakingAsset)
334334 [IntegerEntry(keyAdditionalBalance(assetId), newAdditionalBalance), IntegerEntry(keyStakingAssetBalance(stakingAssetId), newStakingAssetBalance)]
335335 case _ =>
336336 nil
337337 }
338338 else throw("Strict value is not equal to itself.")
339339 }
340340 else nil
341341 }
342342 else throw("Strict value is not equal to itself.")
343343 }
344344 else throw("Strict value is not equal to itself.")
345345 }
346346
347347
348348 func withdraw (assetId,amount,stakingAssetId,proxy,proxyRateMul,profitAddress) = {
349349 let currentAdditionalBalance = getAdditionalBalanceOrZero(assetId)
350350 if ((currentAdditionalBalance == currentAdditionalBalance))
351351 then {
352352 let currentStakingAssetBalance = getStakingAssetBalanceOrZero(stakingAssetId)
353353 if ((currentStakingAssetBalance == currentStakingAssetBalance))
354354 then {
355355 let currentProxyRate = getRate(proxy)
356356 if ((currentProxyRate == currentProxyRate))
357357 then {
358358 let oldRate = fraction(proxyRateMul, currentAdditionalBalance, currentStakingAssetBalance)
359359 let stakingAsset = parseAssetId(stakingAssetId)
360360 let oldSendStakingAmount = fraction(proxyRateMul, amount, oldRate)
361361 let sendStakingAssetAmount = fraction(proxyRateMul, amount, currentProxyRate)
362362 let profitAmount = max([0, (oldSendStakingAmount - sendStakingAssetAmount)])
363363 if ((sendStakingAssetAmount > 0))
364364 then {
365365 let withdrawInvoke = invoke(proxy, "withdraw", nil, [AttachedPayment(stakingAsset, sendStakingAssetAmount)])
366366 if ((withdrawInvoke == withdrawInvoke))
367367 then match withdrawInvoke {
368368 case receivedAssets: Int =>
369369 let newAdditionalBalance = (currentAdditionalBalance - receivedAssets)
370370 let newStakingAssetBalance = ((currentStakingAssetBalance - sendStakingAssetAmount) - profitAmount)
371371 [IntegerEntry(keyAdditionalBalance(assetId), newAdditionalBalance), IntegerEntry(keyStakingAssetBalance(stakingAssetId), newStakingAssetBalance), ScriptTransfer(profitAddress, profitAmount, parseAssetId(stakingAssetId))]
372372 case _ =>
373373 nil
374374 }
375375 else throw("Strict value is not equal to itself.")
376376 }
377377 else nil
378378 }
379379 else throw("Strict value is not equal to itself.")
380380 }
381381 else throw("Strict value is not equal to itself.")
382382 }
383383 else throw("Strict value is not equal to itself.")
384384 }
385385
386386
387387 func getLeaseProxyConfig (assetId) = match invoke(factoryContract, "getPoolLeaseConfigREADONLY", [toString(this), assetId], nil) {
388388 case a: (Boolean, Int, Int, String, String, Int, String) =>
389389 a
390390 case _ =>
391391 throwErr((("[" + assetId) + "] getLeaseProxyConfig() error"))
392392 }
393393
394394
395395 func rebalanceInternal (targetRatio,assetId,stakingAssetId,minBalance,proxy,proxyRateMul,profitAddress) = {
396396 let currentAdditionalBalance = getAdditionalBalanceOrZero(assetId)
397397 if ((currentAdditionalBalance == currentAdditionalBalance))
398398 then {
399399 let currentStakingAssetBalance = getStakingAssetBalanceOrZero(stakingAssetId)
400400 if ((currentStakingAssetBalance == currentStakingAssetBalance))
401401 then {
402402 let leasableTotalBalance = max([0, (getAccBalance(assetId) - minBalance)])
403403 let targetAdditionalBalance = fraction(targetRatio, leasableTotalBalance, 100)
404404 let diff = (currentAdditionalBalance - targetAdditionalBalance)
405405 if ((diff == 0))
406406 then nil
407407 else if ((0 > diff))
408408 then {
409409 let sendAssetAmount = -(diff)
410410 deposit(assetId, sendAssetAmount, stakingAssetId, proxy)
411411 }
412412 else {
413413 let getAssetAmount = diff
414414 withdraw(assetId, getAssetAmount, stakingAssetId, proxy, proxyRateMul, profitAddress)
415415 }
416416 }
417417 else throw("Strict value is not equal to itself.")
418418 }
419419 else throw("Strict value is not equal to itself.")
420420 }
421421
422422
423423 func rebalanceAsset (assetId) = {
424- let $t01592116057 = getLeaseProxyConfig(assetId)
425- let isLeasable = $t01592116057._1
426- let leasedRatio = $t01592116057._2
427- let minBalance = $t01592116057._3
428- let proxyAddress = $t01592116057._4
429- let proxyAssetId = $t01592116057._5
430- let proxyRateMul = $t01592116057._6
431- let stakingProfitAddress = $t01592116057._7
424+ let $t01593116067 = getLeaseProxyConfig(assetId)
425+ let isLeasable = $t01593116067._1
426+ let leasedRatio = $t01593116067._2
427+ let minBalance = $t01593116067._3
428+ let proxyAddress = $t01593116067._4
429+ let proxyAssetId = $t01593116067._5
430+ let proxyRateMul = $t01593116067._6
431+ let stakingProfitAddress = $t01593116067._7
432432 if (isLeasable)
433433 then rebalanceInternal(leasedRatio, assetId, proxyAssetId, minBalance, addressFromStringValue(proxyAddress), proxyRateMul, addressFromStringValue(stakingProfitAddress))
434434 else nil
435435 }
436436
437437
438438 func withdrawAndRebalanceAsset (assetId,getAmount) = {
439- let $t01645616592 = getLeaseProxyConfig(assetId)
440- let isLeasable = $t01645616592._1
441- let leasedRatio = $t01645616592._2
442- let minBalance = $t01645616592._3
443- let proxyAddress = $t01645616592._4
444- let proxyAssetId = $t01645616592._5
445- let proxyRateMul = $t01645616592._6
446- let stakingProfitAddress = $t01645616592._7
439+ let $t01646616602 = getLeaseProxyConfig(assetId)
440+ let isLeasable = $t01646616602._1
441+ let leasedRatio = $t01646616602._2
442+ let minBalance = $t01646616602._3
443+ let proxyAddress = $t01646616602._4
444+ let proxyAssetId = $t01646616602._5
445+ let proxyRateMul = $t01646616602._6
446+ let stakingProfitAddress = $t01646616602._7
447447 if (isLeasable)
448448 then {
449449 let newTotalLeasableBalance = max([0, ((getAccBalance(assetId) - getAmount) - minBalance)])
450450 if ((newTotalLeasableBalance == newTotalLeasableBalance))
451451 then {
452452 let newAdditionalBalance = fraction(leasedRatio, newTotalLeasableBalance, 100)
453453 if ((newAdditionalBalance == newAdditionalBalance))
454454 then {
455455 let withdrawAmount = (getAdditionalBalanceOrZero(assetId) - newAdditionalBalance)
456456 if ((withdrawAmount == withdrawAmount))
457457 then if ((0 > withdrawAmount))
458458 then deposit(assetId, -(withdrawAmount), proxyAssetId, addressFromStringValue(proxyAddress))
459459 else withdraw(assetId, withdrawAmount, proxyAssetId, addressFromStringValue(proxyAddress), proxyRateMul, addressFromStringValue(stakingProfitAddress))
460460 else throw("Strict value is not equal to itself.")
461461 }
462462 else throw("Strict value is not equal to itself.")
463463 }
464464 else throw("Strict value is not equal to itself.")
465465 }
466466 else nil
467467 }
468468
469469
470470 func withdrawAndRebalanceAll (amountAssetOutAmount,priceAssetOutAmount) = {
471471 let AmAmtWithdrawState = withdrawAndRebalanceAsset(getStringOrFail(this, aa()), amountAssetOutAmount)
472472 let PrAmtWithdrawState = withdrawAndRebalanceAsset(getStringOrFail(this, pa()), priceAssetOutAmount)
473473 (AmAmtWithdrawState ++ PrAmtWithdrawState)
474474 }
475475
476476
477477 func privateCalcPrice (amAssetDcm,prAssetDcm,amAmt,prAmt) = {
478478 let amtAssetAmtX18 = toX18(amAmt, amAssetDcm)
479479 let priceAssetAmtX18 = toX18(prAmt, prAssetDcm)
480480 calcPriceBigInt(priceAssetAmtX18, amtAssetAmtX18)
481481 }
482482
483483
484484 func calcPrices (amAmt,prAmt,lpAmt) = {
485485 let cfg = getPoolConfig()
486486 let amtAssetDcm = parseIntValue(cfg[idxAmtAssetDcm])
487487 let priceAssetDcm = parseIntValue(cfg[idxPriceAssetDcm])
488488 let priceX18 = privateCalcPrice(amtAssetDcm, priceAssetDcm, amAmt, prAmt)
489489 let amAmtX18 = toX18(amAmt, amtAssetDcm)
490490 let prAmtX18 = toX18(prAmt, priceAssetDcm)
491491 let lpAmtX18 = toX18(lpAmt, scale8)
492492 let lpPriceInAmAssetX18 = calcPriceBigInt(amAmtX18, lpAmtX18)
493493 let lpPriceInPrAssetX18 = calcPriceBigInt(prAmtX18, lpAmtX18)
494494 [priceX18, lpPriceInAmAssetX18, lpPriceInPrAssetX18]
495495 }
496496
497497
498498 func calculatePrices (amAmt,prAmt,lpAmt) = {
499499 let prices = calcPrices(amAmt, prAmt, lpAmt)
500500 [fromX18(prices[0], scale8), fromX18(prices[1], scale8), fromX18(prices[2], scale8)]
501501 }
502502
503503
504504 func estimateGetOperation (txId58,pmtAssetId,pmtLpAmt,userAddress) = {
505505 let cfg = getPoolConfig()
506506 let lpAssetId = cfg[idxPoolLPAssetId]
507507 let amAssetId = cfg[idxAmtAssetId]
508508 let prAssetId = cfg[idxPriceAssetId]
509509 let amAssetDcm = parseIntValue(cfg[idxAmtAssetDcm])
510510 let prAssetDcm = parseIntValue(cfg[idxPriceAssetDcm])
511511 let poolStatus = cfg[idxPoolStatus]
512512 let lpEmission = valueOrErrorMessage(assetInfo(fromBase58String(lpAssetId)), (("Asset " + lpAssetId) + " doesn't exist")).quantity
513513 if ((lpAssetId != pmtAssetId))
514514 then throw("Invalid asset passed.")
515515 else {
516516 let amBalance = getAccBalance(amAssetId)
517517 let amBalanceX18 = toX18(amBalance, amAssetDcm)
518518 let prBalance = getAccBalance(prAssetId)
519519 let prBalanceX18 = toX18(prBalance, prAssetDcm)
520520 let curPriceX18 = calcPriceBigInt(prBalanceX18, amBalanceX18)
521521 let curPrice = fromX18(curPriceX18, scale8)
522522 let pmtLpAmtX18 = toX18(pmtLpAmt, scale8)
523523 let lpEmissionX18 = toX18(lpEmission, scale8)
524524 let outAmAmtX18 = fraction(amBalanceX18, pmtLpAmtX18, lpEmissionX18)
525525 let outPrAmtX18 = fraction(prBalanceX18, pmtLpAmtX18, lpEmissionX18)
526526 let outAmAmt = fromX18Round(outAmAmtX18, amAssetDcm, FLOOR)
527527 let outPrAmt = fromX18Round(outPrAmtX18, prAssetDcm, FLOOR)
528528 let state = if ((txId58 == ""))
529529 then nil
530530 else [ScriptTransfer(userAddress, outAmAmt, if ((amAssetId == "WAVES"))
531531 then unit
532532 else fromBase58String(amAssetId)), ScriptTransfer(userAddress, outPrAmt, if ((prAssetId == "WAVES"))
533533 then unit
534534 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)]
535535 $Tuple10(outAmAmt, outPrAmt, amAssetId, prAssetId, amBalance, prBalance, lpEmission, curPriceX18, poolStatus, state)
536536 }
537537 }
538538
539539
540540 func estimatePutOperation (txId58,slippageTolerance,inAmAssetAmt,inAmAssetId,inPrAssetAmt,inPrAssetId,userAddress,isEvaluate,emitLp) = {
541541 let cfg = getPoolConfig()
542542 let lpAssetId = fromBase58String(cfg[idxPoolLPAssetId])
543543 let amAssetIdStr = cfg[idxAmtAssetId]
544544 let prAssetIdStr = cfg[idxPriceAssetId]
545545 let iAmtAssetId = cfg[idxIAmtAssetId]
546546 let iPriceAssetId = cfg[idxIPriceAssetId]
547547 let amtAssetDcm = parseIntValue(cfg[idxAmtAssetDcm])
548548 let priceAssetDcm = parseIntValue(cfg[idxPriceAssetDcm])
549549 let poolStatus = cfg[idxPoolStatus]
550550 let lpEmission = valueOrErrorMessage(assetInfo(lpAssetId), (("Asset " + toBase58String(lpAssetId)) + " doesn't exist")).quantity
551551 let inAmAssetIdStr = toBase58String(valueOrElse(inAmAssetId, fromBase58String("WAVES")))
552552 let inPrAssetIdStr = toBase58String(valueOrElse(inPrAssetId, fromBase58String("WAVES")))
553553 if (if ((amAssetIdStr != inAmAssetIdStr))
554554 then true
555555 else (prAssetIdStr != inPrAssetIdStr))
556556 then throw("Invalid amt or price asset passed.")
557557 else {
558558 let amBalance = if (isEvaluate)
559559 then getAccBalance(amAssetIdStr)
560560 else (getAccBalance(amAssetIdStr) - inAmAssetAmt)
561561 let prBalance = if (isEvaluate)
562562 then getAccBalance(prAssetIdStr)
563563 else (getAccBalance(prAssetIdStr) - inPrAssetAmt)
564564 let inAmAssetAmtX18 = toX18(inAmAssetAmt, amtAssetDcm)
565565 let inPrAssetAmtX18 = toX18(inPrAssetAmt, priceAssetDcm)
566566 let userPriceX18 = calcPriceBigInt(inPrAssetAmtX18, inAmAssetAmtX18)
567567 let amBalanceX18 = toX18(amBalance, amtAssetDcm)
568568 let prBalanceX18 = toX18(prBalance, priceAssetDcm)
569569 let res = if ((lpEmission == 0))
570570 then {
571571 let curPriceX18 = zeroBigInt
572572 let slippageX18 = zeroBigInt
573573 let lpAmtX18 = pow((inAmAssetAmtX18 * inPrAssetAmtX18), 0, toBigInt(5), 1, 0, DOWN)
574574 $Tuple5(fromX18(lpAmtX18, scale8), fromX18(inAmAssetAmtX18, amtAssetDcm), fromX18(inPrAssetAmtX18, priceAssetDcm), calcPriceBigInt((prBalanceX18 + inPrAssetAmtX18), (amBalanceX18 + inAmAssetAmtX18)), slippageX18)
575575 }
576576 else {
577577 let curPriceX18 = calcPriceBigInt(prBalanceX18, amBalanceX18)
578578 let slippageX18 = fraction(absBigInt((curPriceX18 - userPriceX18)), scale18, curPriceX18)
579579 let slippageToleranceX18 = toX18(slippageTolerance, scale8)
580580 if (if ((curPriceX18 != zeroBigInt))
581581 then (slippageX18 > slippageToleranceX18)
582582 else false)
583583 then throw(((("Price slippage " + toString(slippageX18)) + " exceeded the passed limit of ") + toString(slippageToleranceX18)))
584584 else {
585585 let lpEmissionX18 = toX18(lpEmission, scale8)
586586 let prViaAmX18 = fraction(inAmAssetAmtX18, calcPriceBigIntRound(prBalanceX18, amBalanceX18, CEILING), scale18, CEILING)
587587 let amViaPrX18 = fraction(inPrAssetAmtX18, scale18, calcPriceBigIntRound(prBalanceX18, amBalanceX18, FLOOR), CEILING)
588588 let expectedAmts = if ((prViaAmX18 > inPrAssetAmtX18))
589589 then $Tuple2(amViaPrX18, inPrAssetAmtX18)
590590 else $Tuple2(inAmAssetAmtX18, prViaAmX18)
591591 let expAmtAssetAmtX18 = expectedAmts._1
592592 let expPriceAssetAmtX18 = expectedAmts._2
593593 let lpAmtX18 = fraction(lpEmissionX18, expPriceAssetAmtX18, prBalanceX18, FLOOR)
594594 $Tuple5(fromX18Round(lpAmtX18, scale8, FLOOR), fromX18Round(expAmtAssetAmtX18, amtAssetDcm, CEILING), fromX18Round(expPriceAssetAmtX18, priceAssetDcm, CEILING), curPriceX18, slippageX18)
595595 }
596596 }
597597 let calcLpAmt = res._1
598598 let calcAmAssetPmt = res._2
599599 let calcPrAssetPmt = res._3
600600 let curPrice = fromX18(res._4, scale8)
601601 let slippageCalc = fromX18(res._5, scale8)
602602 if ((0 >= calcLpAmt))
603603 then throw("Invalid calculations. LP calculated is less than zero.")
604604 else {
605605 let emitLpAmt = if (!(emitLp))
606606 then 0
607607 else calcLpAmt
608608 let amDiff = (inAmAssetAmt - calcAmAssetPmt)
609609 let prDiff = (inPrAssetAmt - calcPrAssetPmt)
610610 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))]
611611 $Tuple13(calcLpAmt, emitLpAmt, curPrice, amBalance, prBalance, lpEmission, lpAssetId, poolStatus, commonState, amDiff, prDiff, inAmAssetId, inPrAssetId)
612612 }
613613 }
614614 }
615615
616616
617617 func calcKLp (amountBalance,priceBalance,lpEmission) = {
618618 let amountBalanceX18 = toX18BigInt(amountBalance, toBigInt(cfgAmountAssetDecimals))
619619 let priceBalanceX18 = toX18BigInt(priceBalance, toBigInt(cfgPriceAssetDecimals))
620620 let updatedKLp = fraction(pow((amountBalanceX18 * priceBalanceX18), 0, toBigInt(5), 1, 18, DOWN), big1, lpEmission)
621621 if ((lpEmission == big0))
622622 then big0
623623 else updatedKLp
624624 }
625625
626626
627627 func calcCurrentKLp (amountAssetDelta,priceAssetDelta,lpAssetEmissionDelta) = {
628628 let amountAssetBalance = (toBigInt(getAccBalance(assetIdToString(cfgAmountAssetId))) - amountAssetDelta)
629629 let priceAssetBalance = (toBigInt(getAccBalance(assetIdToString(cfgPriceAssetId))) - priceAssetDelta)
630630 let lpAssetEmission = (toBigInt(value(assetInfo(cfgLpAssetId)).quantity) - lpAssetEmissionDelta)
631631 let currentKLp = calcKLp(amountAssetBalance, priceAssetBalance, lpAssetEmission)
632632 currentKLp
633633 }
634634
635635
636636 func refreshKLpInternal (amountAssetBalanceDelta,priceAssetBalanceDelta,lpAssetEmissionDelta) = {
637637 let amountAssetBalance = (getAccBalance(assetIdToString(cfgAmountAssetId)) + amountAssetBalanceDelta)
638638 let priceAssetBalance = (getAccBalance(assetIdToString(cfgPriceAssetId)) + priceAssetBalanceDelta)
639639 let lpAssetEmission = (value(assetInfo(cfgLpAssetId)).quantity + lpAssetEmissionDelta)
640640 let updatedKLp = calcKLp(toBigInt(amountAssetBalance), toBigInt(priceAssetBalance), toBigInt(lpAssetEmission))
641641 let actions = [IntegerEntry(keyKLpRefreshedHeight, height), StringEntry(keyKLp, toString(updatedKLp))]
642642 $Tuple2(actions, updatedKLp)
643643 }
644644
645645
646646 func skipOrderValidation () = valueOrElse(getBoolean(factoryContract, keySkipOrderValidation(toString(this))), false)
647647
648648
649649 func validateUpdatedKLp (oldKLp,updatedKLp) = if ((updatedKLp >= oldKLp))
650650 then true
651651 else throwErr(makeString(["updated KLp lower than current KLp", toString(oldKLp), toString(updatedKLp)], " "))
652652
653653
654654 func validateMatcherOrderAllowed (order) = {
655655 let amountAssetBalance = getAccBalance(assetIdToString(cfgAmountAssetId))
656656 let priceAssetBalance = getAccBalance(assetIdToString(cfgPriceAssetId))
657657 let amountAssetAmount = order.amount
658658 let priceAssetAmount = fraction(order.amount, order.price, scale8, FLOOR)
659- let $t02898129193 = if ((order.orderType == Buy))
659+ let $t02899129203 = if ((order.orderType == Buy))
660660 then $Tuple2(amountAssetAmount, -(priceAssetAmount))
661661 else $Tuple2(-(amountAssetAmount), priceAssetAmount)
662- let amountAssetBalanceDelta = $t02898129193._1
663- let priceAssetBalanceDelta = $t02898129193._2
662+ let amountAssetBalanceDelta = $t02899129203._1
663+ let priceAssetBalanceDelta = $t02899129203._2
664664 if (if (if (isGlobalShutdown())
665665 then true
666666 else (cfgPoolStatus == PoolMatcherDisabled))
667667 then true
668668 else (cfgPoolStatus == PoolShutdown))
669669 then throw("Exchange operations disabled")
670670 else if (if ((order.assetPair.amountAsset != cfgAmountAssetId))
671671 then true
672672 else (order.assetPair.priceAsset != cfgPriceAssetId))
673673 then throw("Wrong order assets.")
674674 else {
675675 let kLp = valueOrErrorMessage(parseBigInt(valueOrElse(getString(this, keyKLp), "0")), fmtErr("invalid kLp"))
676- let $t02963329733 = refreshKLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
677- let unusedActions = $t02963329733._1
678- let kLpNew = $t02963329733._2
676+ let $t02964329743 = refreshKLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
677+ let unusedActions = $t02964329743._1
678+ let kLpNew = $t02964329743._2
679679 let isOrderValid = (kLpNew >= kLp)
680680 let info = makeString(["kLp=", toString(kLp), " kLpNew=", toString(kLpNew), " amountAssetBalance=", toString(amountAssetBalance), " priceAssetBalance=", toString(priceAssetBalance), " amountAssetBalanceDelta=", toString(amountAssetBalanceDelta), " priceAssetBalanceDelta=", toString(priceAssetBalanceDelta), " height=", toString(height)], "")
681681 $Tuple2(isOrderValid, info)
682682 }
683683 }
684684
685685
686686 func commonGet (i) = if ((size(i.payments) != 1))
687687 then throw("exactly 1 payment is expected")
688688 else {
689689 let pmt = value(i.payments[0])
690690 let pmtAssetId = value(pmt.assetId)
691691 let pmtAmt = pmt.amount
692692 let res = estimateGetOperation(toBase58String(i.transactionId), toBase58String(pmtAssetId), pmtAmt, i.caller)
693693 let outAmAmt = res._1
694694 let outPrAmt = res._2
695695 let poolStatus = parseIntValue(res._9)
696696 let state = res._10
697697 if (if (isGlobalShutdown())
698698 then true
699699 else (poolStatus == PoolShutdown))
700700 then throw(("Get operation is blocked by admin. Status = " + toString(poolStatus)))
701701 else $Tuple5(outAmAmt, outPrAmt, pmtAmt, pmtAssetId, state)
702702 }
703703
704704
705705 func commonPut (i,slippageTolerance,emitLp) = if ((size(i.payments) != 2))
706706 then throw("exactly 2 payments are expected")
707707 else {
708708 let amAssetPmt = value(i.payments[0])
709709 let prAssetPmt = value(i.payments[1])
710710 let estPut = estimatePutOperation(toBase58String(i.transactionId), slippageTolerance, amAssetPmt.amount, amAssetPmt.assetId, prAssetPmt.amount, prAssetPmt.assetId, toString(i.caller), false, emitLp)
711711 let poolStatus = parseIntValue(estPut._8)
712712 if (if (if (isGlobalShutdown())
713713 then true
714714 else (poolStatus == PoolPutDisabled))
715715 then true
716716 else (poolStatus == PoolShutdown))
717717 then throw(("Put operation is blocked by admin. Status = " + toString(poolStatus)))
718718 else estPut
719719 }
720720
721721
722722 func emit (amount) = {
723723 let emitInv = invoke(factoryContract, "emit", [amount], nil)
724724 if ((emitInv == emitInv))
725725 then {
726726 let emitInvLegacy = match emitInv {
727727 case legacyFactoryContract: Address =>
728728 invoke(legacyFactoryContract, "emit", [amount], nil)
729729 case _ =>
730730 unit
731731 }
732732 if ((emitInvLegacy == emitInvLegacy))
733733 then amount
734734 else throw("Strict value is not equal to itself.")
735735 }
736736 else throw("Strict value is not equal to itself.")
737737 }
738738
739739
740740 func takeFee (amount,fee) = {
741741 let feeAmount = if ((fee == 0))
742742 then 0
743743 else fraction(amount, fee, scale8)
744744 $Tuple2((amount - feeAmount), feeAmount)
745745 }
746746
747747
748748 func calcPutOneToken (paymentAmountRaw,paymentAssetId,userAddress,txId) = {
749749 let isEval = (txId == unit)
750750 let amountBalanceRaw = getAccBalance(assetIdToString(cfgAmountAssetId))
751751 let priceBalanceRaw = getAccBalance(assetIdToString(cfgPriceAssetId))
752752 let paymentInAmountAsset = if ((paymentAssetId == cfgAmountAssetId))
753753 then true
754754 else if ((paymentAssetId == cfgPriceAssetId))
755755 then false
756756 else throwErr("invalid asset")
757- let $t03284633139 = if (isEval)
757+ let $t03285633149 = if (isEval)
758758 then $Tuple2(amountBalanceRaw, priceBalanceRaw)
759759 else if (paymentInAmountAsset)
760760 then $Tuple2((amountBalanceRaw - paymentAmountRaw), priceBalanceRaw)
761761 else $Tuple2(amountBalanceRaw, (priceBalanceRaw - paymentAmountRaw))
762- let amountBalanceOld = $t03284633139._1
763- let priceBalanceOld = $t03284633139._2
764- let $t03314333292 = if (paymentInAmountAsset)
762+ let amountBalanceOld = $t03285633149._1
763+ let priceBalanceOld = $t03285633149._2
764+ let $t03315333302 = if (paymentInAmountAsset)
765765 then $Tuple2(paymentAmountRaw, 0)
766766 else $Tuple2(0, paymentAmountRaw)
767- let amountAssetAmountRaw = $t03314333292._1
768- let priceAssetAmountRaw = $t03314333292._2
767+ let amountAssetAmountRaw = $t03315333302._1
768+ let priceAssetAmountRaw = $t03315333302._2
769769 let amountAssetAmount = takeFee(amountAssetAmountRaw, inFee)._1
770770 let priceAssetAmount = takeFee(priceAssetAmountRaw, inFee)._1
771- let $t03342433488 = takeFee(paymentAmountRaw, inFee)
772- let paymentAmount = $t03342433488._1
773- let feeAmount = $t03342433488._2
771+ let $t03343433498 = takeFee(paymentAmountRaw, inFee)
772+ let paymentAmount = $t03343433498._1
773+ let feeAmount = $t03343433498._2
774774 let amountBalanceNew = (amountBalanceOld + amountAssetAmount)
775775 let priceBalanceNew = (priceBalanceOld + priceAssetAmount)
776776 let priceNewX18 = calcPriceBigInt(toX18(priceBalanceNew, cfgPriceAssetDecimals), toX18(amountBalanceNew, cfgAmountAssetDecimals))
777777 let priceNew = fromX18(priceNewX18, scale8)
778778 let paymentBalance = if (paymentInAmountAsset)
779779 then amountBalanceOld
780780 else priceBalanceOld
781781 let paymentBalanceBigInt = toBigInt(paymentBalance)
782782 let supplyBigInt = toBigInt(valueOrErrorMessage(assetInfo(cfgLpAssetId), (("asset " + toBase58String(cfgLpAssetId)) + " doesn't exist")).quantity)
783783 let chechSupply = if ((supplyBigInt > big0))
784784 then true
785785 else throwErr("initial deposit requires all coins")
786786 if ((chechSupply == chechSupply))
787787 then {
788788 let depositBigInt = toBigInt(paymentAmount)
789789 let issueAmount = max([0, toInt(((supplyBigInt * (sqrtBigInt((scale18 + ((depositBigInt * scale18) / paymentBalanceBigInt)), 18, 18, DOWN) - scale18)) / scale18))])
790790 let commonState = if (isEval)
791791 then nil
792792 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))]
793793 let priceOldX18 = calcPriceBigInt(toX18(priceBalanceOld, cfgPriceAssetDecimals), toX18(amountBalanceOld, cfgAmountAssetDecimals))
794794 let priceOld = fromX18(priceOldX18, scale8)
795795 let loss = {
796- let $t03516935336 = if (paymentInAmountAsset)
796+ let $t03517935346 = if (paymentInAmountAsset)
797797 then $Tuple2(amountAssetAmountRaw, amountBalanceOld)
798798 else $Tuple2(priceAssetAmountRaw, priceBalanceOld)
799- let amount = $t03516935336._1
800- let balance = $t03516935336._2
799+ let amount = $t03517935346._1
800+ let balance = $t03517935346._2
801801 let issueAmountBoth = toInt(fraction(supplyBigInt, toBigInt((amount / 2)), toBigInt(balance)))
802802 fraction((issueAmount - issueAmountBoth), scale8, issueAmountBoth)
803803 }
804804 $Tuple5(issueAmount, commonState, feeAmount, loss, paymentInAmountAsset)
805805 }
806806 else throw("Strict value is not equal to itself.")
807807 }
808808
809809
810810 func calcGetOneToken (outAssetId,paymentAmount,paymentAssetId,userAddress,txId) = {
811811 let isEval = (txId == unit)
812812 let cfg = getPoolConfig()
813813 let amtAssetDcm = parseIntValue(cfg[idxAmtAssetDcm])
814814 let priceAssetDcm = parseIntValue(cfg[idxPriceAssetDcm])
815815 let checks = [if ((paymentAssetId == cfgLpAssetId))
816816 then true
817817 else throwErr("invalid lp asset")]
818818 if ((checks == checks))
819819 then {
820820 let outInAmountAsset = if ((outAssetId == cfgAmountAssetId))
821821 then true
822822 else if ((outAssetId == cfgPriceAssetId))
823823 then false
824824 else throwErr("invalid asset")
825825 let balanceBigInt = if (outInAmountAsset)
826826 then toBigInt(getAccBalance(assetIdToString(cfgAmountAssetId)))
827827 else toBigInt(getAccBalance(assetIdToString(cfgPriceAssetId)))
828828 let outInAmountAssetDecimals = if (outInAmountAsset)
829829 then amtAssetDcm
830830 else priceAssetDcm
831831 let amBalanceOld = getAccBalance(assetIdToString(cfgAmountAssetId))
832832 let prBalanceOld = getAccBalance(assetIdToString(cfgPriceAssetId))
833833 let outBalance = if (outInAmountAsset)
834834 then amBalanceOld
835835 else prBalanceOld
836836 let outBalanceBigInt = toBigInt(outBalance)
837837 let supplyBigInt = toBigInt(valueOrErrorMessage(assetInfo(cfgLpAssetId), (("asset " + toBase58String(cfgLpAssetId)) + " doesn't exist")).quantity)
838838 let redeemedBigInt = toBigInt(paymentAmount)
839839 let amountRaw = max([0, toInt(((balanceBigInt * (scale18 - pow((scale18 - ((redeemedBigInt * scale18) / supplyBigInt)), 18, big2, 0, 18, DOWN))) / scale18))])
840- let $t03741437470 = takeFee(amountRaw, outFee)
841- let totalAmount = $t03741437470._1
842- let feeAmount = $t03741437470._2
843- let $t03747437700 = if (outInAmountAsset)
840+ let $t03742437480 = takeFee(amountRaw, outFee)
841+ let totalAmount = $t03742437480._1
842+ let feeAmount = $t03742437480._2
843+ let $t03748437710 = if (outInAmountAsset)
844844 then $Tuple4(totalAmount, 0, (amBalanceOld - amountRaw), prBalanceOld)
845845 else $Tuple4(0, totalAmount, amBalanceOld, (prBalanceOld - amountRaw))
846- let outAmAmount = $t03747437700._1
847- let outPrAmount = $t03747437700._2
848- let amBalanceNew = $t03747437700._3
849- let prBalanceNew = $t03747437700._4
846+ let outAmAmount = $t03748437710._1
847+ let outPrAmount = $t03748437710._2
848+ let amBalanceNew = $t03748437710._3
849+ let prBalanceNew = $t03748437710._4
850850 let priceNewX18 = calcPriceBigInt(toX18(prBalanceNew, cfgPriceAssetDecimals), toX18(amBalanceNew, cfgAmountAssetDecimals))
851851 let priceNew = fromX18(priceNewX18, scale8)
852852 let commonState = if (isEval)
853853 then nil
854854 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)]
855855 let priceOldX18 = calcPriceBigInt(toX18(prBalanceOld, cfgPriceAssetDecimals), toX18(amBalanceOld, cfgAmountAssetDecimals))
856856 let priceOld = fromX18(priceOldX18, scale8)
857857 let loss = {
858858 let amountBothInPaymentAsset = (toInt(fraction(balanceBigInt, redeemedBigInt, supplyBigInt)) * 2)
859859 fraction((totalAmount - amountBothInPaymentAsset), scale8, amountBothInPaymentAsset)
860860 }
861861 $Tuple5(totalAmount, commonState, feeAmount, loss, outInAmountAsset)
862862 }
863863 else throw("Strict value is not equal to itself.")
864864 }
865865
866866
867867 func managerPublicKeyOrUnit () = {
868868 let managerVaultAddress = getManagerVaultAddressOrThis()
869869 match getString(managerVaultAddress, keyManagerPublicKey()) {
870870 case s: String =>
871871 fromBase58String(s)
872872 case _: Unit =>
873873 unit
874874 case _ =>
875875 throw("Match error")
876876 }
877877 }
878878
879879
880880 func isManager (i) = match managerPublicKeyOrUnit() {
881881 case pk: ByteVector =>
882882 (i.callerPublicKey == pk)
883883 case _: Unit =>
884884 (i.caller == this)
885885 case _ =>
886886 throw("Match error")
887887 }
888888
889889
890890 func mustManager (i) = {
891891 let pd = throw("Permission denied")
892892 match managerPublicKeyOrUnit() {
893893 case pk: ByteVector =>
894894 if ((i.callerPublicKey == pk))
895895 then true
896896 else pd
897897 case _: Unit =>
898898 if ((i.caller == this))
899899 then true
900900 else pd
901901 case _ =>
902902 throw("Match error")
903903 }
904904 }
905905
906906
907907 @Callable(i)
908908 func rebalance () = (rebalanceAsset(getStringOrFail(this, aa())) ++ rebalanceAsset(getStringOrFail(this, pa())))
909909
910910
911911
912912 @Callable(i)
913913 func calculateAmountOutForSwapREADONLY (cleanAmountIn,isReverse,feePoolAmount) = {
914- let $t03955939864 = if ((isReverse == false))
914+ let $t03956939874 = if ((isReverse == false))
915915 then {
916916 let assetOut = getStringOrFail(this, pa())
917917 let assetIn = getStringOrFail(this, aa())
918918 $Tuple2(assetOut, assetIn)
919919 }
920920 else {
921921 let assetOut = getStringOrFail(this, aa())
922922 let assetIn = getStringOrFail(this, pa())
923923 $Tuple2(assetOut, assetIn)
924924 }
925- let assetOut = $t03955939864._1
926- let assetIn = $t03955939864._2
925+ let assetOut = $t03956939874._1
926+ let assetIn = $t03956939874._2
927927 let poolAssetInBalance = getAccBalance(assetIn)
928928 let poolAssetOutBalance = getAccBalance(assetOut)
929929 let amountOut = fraction(poolAssetOutBalance, cleanAmountIn, (poolAssetInBalance + cleanAmountIn))
930930 let oldK = (toBigInt(poolAssetInBalance) * toBigInt(poolAssetOutBalance))
931931 let newK = (((toBigInt(getAccBalance(assetIn)) + toBigInt(cleanAmountIn)) + toBigInt(feePoolAmount)) * (toBigInt(getAccBalance(assetOut)) - toBigInt(amountOut)))
932932 let checkK = if ((newK >= oldK))
933933 then true
934934 else throw("new K is fewer error")
935935 if ((checkK == checkK))
936936 then $Tuple2(nil, amountOut)
937937 else throw("Strict value is not equal to itself.")
938938 }
939939
940940
941941
942942 @Callable(i)
943943 func calculateAmountOutForSwapAndSendTokens (cleanAmountIn,isReverse,amountOutMin,addressTo,feePoolAmount) = {
944944 let swapContact = {
945945 let @ = invoke(factoryContract, "getSwapContractREADONLY", nil, nil)
946946 if ($isInstanceOf(@, "String"))
947947 then @
948948 else throw(($getType(@) + " couldn't be cast to String"))
949949 }
950950 let checks = [if ((value(i.payments[0]).amount >= cleanAmountIn))
951951 then true
952952 else throwErr("Wrong amount"), if ((i.caller == addressFromStringValue(swapContact)))
953953 then true
954954 else throwErr("Permission denied")]
955955 if ((checks == checks))
956956 then {
957957 let pmt = value(i.payments[0])
958958 let assetIn = assetIdToString(pmt.assetId)
959959 let assetOut = if ((isReverse == false))
960960 then getStringOrFail(this, pa())
961961 else getStringOrFail(this, aa())
962962 let poolAssetInBalance = (getAccBalance(assetIn) - value(i.payments[0]).amount)
963963 let poolAssetOutBalance = getAccBalance(assetOut)
964964 let amountOut = fraction(poolAssetOutBalance, cleanAmountIn, (poolAssetInBalance + cleanAmountIn))
965965 let oldK = (toBigInt(poolAssetInBalance) * toBigInt(poolAssetOutBalance))
966966 let newK = ((toBigInt(getAccBalance(assetIn)) + toBigInt(feePoolAmount)) * (toBigInt(getAccBalance(assetOut)) - toBigInt(amountOut)))
967967 let checkK = if ((newK >= oldK))
968968 then true
969969 else throw("new K is fewer error")
970970 if ((checkK == checkK))
971971 then {
972972 let checkMin = if ((amountOut >= amountOutMin))
973973 then true
974974 else throw("Exchange result is fewer coins than expected")
975975 if ((checkMin == checkMin))
976976 then {
977977 let rebalanceState = rebalanceAsset(assetIn)
978978 if ((rebalanceState == rebalanceState))
979979 then {
980980 let withdrawState = withdrawAndRebalanceAsset(assetOut, amountOut)
981981 if ((withdrawState == withdrawState))
982982 then $Tuple2(((withdrawState ++ rebalanceState) ++ [ScriptTransfer(addressFromStringValue(addressTo), amountOut, parseAssetId(assetOut))]), amountOut)
983983 else throw("Strict value is not equal to itself.")
984984 }
985985 else throw("Strict value is not equal to itself.")
986986 }
987987 else throw("Strict value is not equal to itself.")
988988 }
989989 else throw("Strict value is not equal to itself.")
990990 }
991991 else throw("Strict value is not equal to itself.")
992992 }
993993
994994
995995
996996 @Callable(i)
997997 func put (slippageTolerance,shouldAutoStake) = if ((0 > slippageTolerance))
998998 then throw("Invalid slippageTolerance passed")
999999 else {
10001000 let estPut = commonPut(i, slippageTolerance, true)
10011001 let emitLpAmt = estPut._2
10021002 let lpAssetId = estPut._7
10031003 let state = estPut._9
10041004 let amDiff = estPut._10
10051005 let prDiff = estPut._11
10061006 let amId = estPut._12
10071007 let prId = estPut._13
10081008 let amAssetPmt = toBigInt(value(i.payments[0]).amount)
10091009 let prAssetPmt = toBigInt(value(i.payments[1]).amount)
10101010 let currentKLp = calcCurrentKLp(amAssetPmt, prAssetPmt, toBigInt(0))
10111011 if ((currentKLp == currentKLp))
10121012 then {
10131013 let emitInv = invoke(factoryContract, "emit", [emitLpAmt], nil)
10141014 if ((emitInv == emitInv))
10151015 then {
10161016 let emitInvLegacy = match emitInv {
10171017 case legacyFactoryContract: Address =>
10181018 invoke(legacyFactoryContract, "emit", [emitLpAmt], nil)
10191019 case _ =>
10201020 unit
10211021 }
10221022 if ((emitInvLegacy == emitInvLegacy))
10231023 then {
10241024 let slippageAInv = if ((amDiff > 0))
10251025 then invoke(slippageContract, "put", nil, [AttachedPayment(amId, amDiff)])
10261026 else nil
10271027 if ((slippageAInv == slippageAInv))
10281028 then {
10291029 let slippagePInv = if ((prDiff > 0))
10301030 then invoke(slippageContract, "put", nil, [AttachedPayment(prId, prDiff)])
10311031 else nil
10321032 if ((slippagePInv == slippagePInv))
10331033 then {
10341034 let lpTransfer = if (shouldAutoStake)
10351035 then {
10361036 let slpStakeInv = invoke(stakingContract, "stake", nil, [AttachedPayment(lpAssetId, emitLpAmt)])
10371037 if ((slpStakeInv == slpStakeInv))
10381038 then nil
10391039 else throw("Strict value is not equal to itself.")
10401040 }
10411041 else [ScriptTransfer(i.caller, emitLpAmt, lpAssetId)]
1042- let $t04435144813 = refreshKLpInternal(0, 0, 0)
1043- if (($t04435144813 == $t04435144813))
1042+ let $t04436144823 = refreshKLpInternal(0, 0, 0)
1043+ if (($t04436144823 == $t04436144823))
10441044 then {
1045- let updatedKLp = $t04435144813._2
1046- let refreshKLpActions = $t04435144813._1
1045+ let updatedKLp = $t04436144823._2
1046+ let refreshKLpActions = $t04436144823._1
10471047 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
10481048 if ((isUpdatedKLpValid == isUpdatedKLpValid))
10491049 then {
10501050 let reb = invoke(this, "rebalance", nil, nil)
10511051 if ((reb == reb))
10521052 then ((state ++ lpTransfer) ++ refreshKLpActions)
10531053 else throw("Strict value is not equal to itself.")
10541054 }
10551055 else throw("Strict value is not equal to itself.")
10561056 }
10571057 else throw("Strict value is not equal to itself.")
10581058 }
10591059 else throw("Strict value is not equal to itself.")
10601060 }
10611061 else throw("Strict value is not equal to itself.")
10621062 }
10631063 else throw("Strict value is not equal to itself.")
10641064 }
10651065 else throw("Strict value is not equal to itself.")
10661066 }
10671067 else throw("Strict value is not equal to itself.")
10681068 }
10691069
10701070
10711071
10721072 @Callable(i)
10731073 func putForFree (maxSlippage) = if ((0 > maxSlippage))
10741074 then throw("Invalid value passed")
10751075 else {
10761076 let estPut = commonPut(i, maxSlippage, false)
10771077 let state = estPut._9
10781078 let amAssetPmt = toBigInt(value(i.payments[0]).amount)
10791079 let prAssetPmt = toBigInt(value(i.payments[1]).amount)
10801080 let currentKLp = calcCurrentKLp(amAssetPmt, prAssetPmt, toBigInt(0))
10811081 if ((currentKLp == currentKLp))
10821082 then {
1083- let $t04542545490 = refreshKLpInternal(0, 0, 0)
1084- let refreshKLpActions = $t04542545490._1
1085- let updatedKLp = $t04542545490._2
1083+ let $t04543545500 = refreshKLpInternal(0, 0, 0)
1084+ let refreshKLpActions = $t04543545500._1
1085+ let updatedKLp = $t04543545500._2
10861086 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
10871087 if ((isUpdatedKLpValid == isUpdatedKLpValid))
10881088 then (state ++ refreshKLpActions)
10891089 else throw("Strict value is not equal to itself.")
10901090 }
10911091 else throw("Strict value is not equal to itself.")
10921092 }
10931093
10941094
10951095
10961096 @Callable(i)
10971097 func putOneTkn (minOutAmount,autoStake) = {
10981098 let isPoolOneTokenOperationsDisabled = {
10991099 let @ = invoke(factoryContract, "isPoolOneTokenOperationsDisabledREADONLY", [toString(this)], nil)
11001100 if ($isInstanceOf(@, "Boolean"))
11011101 then @
11021102 else throw(($getType(@) + " couldn't be cast to Boolean"))
11031103 }
11041104 let isPutDisabled = if (if (if (isGlobalShutdown())
11051105 then true
11061106 else (cfgPoolStatus == PoolPutDisabled))
11071107 then true
11081108 else (cfgPoolStatus == PoolShutdown))
11091109 then true
11101110 else isPoolOneTokenOperationsDisabled
11111111 let checks = [if (if (!(isPutDisabled))
11121112 then true
11131113 else isManager(i))
11141114 then true
11151115 else throwErr("put operation is blocked by admin"), if ((size(i.payments) == 1))
11161116 then true
11171117 else throwErr("exactly 1 payment are expected")]
11181118 if ((checks == checks))
11191119 then {
11201120 let payment = i.payments[0]
11211121 let paymentAssetId = payment.assetId
11221122 let paymentAmountRaw = payment.amount
11231123 let currentKLp = if ((paymentAssetId == cfgAmountAssetId))
11241124 then calcCurrentKLp(toBigInt(paymentAmountRaw), toBigInt(0), toBigInt(0))
11251125 else if ((paymentAssetId == cfgPriceAssetId))
11261126 then calcCurrentKLp(toBigInt(0), toBigInt(paymentAmountRaw), toBigInt(0))
11271127 else throwErr("payment asset is not supported")
11281128 if ((currentKLp == currentKLp))
11291129 then {
11301130 let userAddress = i.caller
11311131 let txId = i.transactionId
1132- let $t04667846830 = calcPutOneToken(paymentAmountRaw, paymentAssetId, userAddress, txId)
1133- if (($t04667846830 == $t04667846830))
1132+ let $t04668846840 = calcPutOneToken(paymentAmountRaw, paymentAssetId, userAddress, txId)
1133+ if (($t04668846840 == $t04668846840))
11341134 then {
1135- let paymentInAmountAsset = $t04667846830._5
1136- let bonus = $t04667846830._4
1137- let feeAmount = $t04667846830._3
1138- let commonState = $t04667846830._2
1139- let emitAmountEstimated = $t04667846830._1
1135+ let paymentInAmountAsset = $t04668846840._5
1136+ let bonus = $t04668846840._4
1137+ let feeAmount = $t04668846840._3
1138+ let commonState = $t04668846840._2
1139+ let emitAmountEstimated = $t04668846840._1
11401140 let emitAmount = if (if ((minOutAmount > 0))
11411141 then (minOutAmount > emitAmountEstimated)
11421142 else false)
11431143 then throwErr(makeString(["amount to receive is less than ", toString(minOutAmount)], ""))
11441144 else emitAmountEstimated
11451145 let emitInv = emit(emitAmount)
11461146 if ((emitInv == emitInv))
11471147 then {
11481148 let lpTransfer = if (autoStake)
11491149 then {
11501150 let stakeInv = invoke(stakingContract, "stake", nil, [AttachedPayment(cfgLpAssetId, emitAmount)])
11511151 if ((stakeInv == stakeInv))
11521152 then nil
11531153 else throw("Strict value is not equal to itself.")
11541154 }
11551155 else [ScriptTransfer(i.caller, emitAmount, cfgLpAssetId)]
11561156 let sendFee = if ((feeAmount > 0))
11571157 then [ScriptTransfer(feeCollectorAddress, feeAmount, paymentAssetId)]
11581158 else nil
1159- let $t04741647613 = if ((this == feeCollectorAddress))
1159+ let $t04742647623 = if ((this == feeCollectorAddress))
11601160 then $Tuple2(0, 0)
11611161 else if (paymentInAmountAsset)
11621162 then $Tuple2(-(feeAmount), 0)
11631163 else $Tuple2(0, -(feeAmount))
1164- let amountAssetBalanceDelta = $t04741647613._1
1165- let priceAssetBalanceDelta = $t04741647613._2
1166- let $t04761647724 = refreshKLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
1167- let refreshKLpActions = $t04761647724._1
1168- let updatedKLp = $t04761647724._2
1164+ let amountAssetBalanceDelta = $t04742647623._1
1165+ let priceAssetBalanceDelta = $t04742647623._2
1166+ let $t04762647734 = refreshKLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
1167+ let refreshKLpActions = $t04762647734._1
1168+ let updatedKLp = $t04762647734._2
11691169 let kLp = value(getString(keyKLp))
11701170 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
11711171 if ((isUpdatedKLpValid == isUpdatedKLpValid))
11721172 then {
11731173 let reb = invoke(this, "rebalance", nil, nil)
11741174 if ((reb == reb))
11751175 then $Tuple2((((commonState ++ lpTransfer) ++ sendFee) ++ refreshKLpActions), emitAmount)
11761176 else throw("Strict value is not equal to itself.")
11771177 }
11781178 else throw("Strict value is not equal to itself.")
11791179 }
11801180 else throw("Strict value is not equal to itself.")
11811181 }
11821182 else throw("Strict value is not equal to itself.")
11831183 }
11841184 else throw("Strict value is not equal to itself.")
11851185 }
11861186 else throw("Strict value is not equal to itself.")
11871187 }
11881188
11891189
11901190
11911191 @Callable(i)
11921192 func putOneTknREADONLY (paymentAssetId,paymentAmountRaw) = {
1193- let $t04807948236 = calcPutOneToken(paymentAmountRaw, parseAssetId(paymentAssetId), unit, unit)
1194- let emitAmountEstimated = $t04807948236._1
1195- let commonState = $t04807948236._2
1196- let feeAmount = $t04807948236._3
1197- let bonus = $t04807948236._4
1198- let paymentInAmountAsset = $t04807948236._5
1193+ let $t04808948246 = calcPutOneToken(paymentAmountRaw, parseAssetId(paymentAssetId), unit, unit)
1194+ let emitAmountEstimated = $t04808948246._1
1195+ let commonState = $t04808948246._2
1196+ let feeAmount = $t04808948246._3
1197+ let bonus = $t04808948246._4
1198+ let paymentInAmountAsset = $t04808948246._5
11991199 $Tuple2(nil, $Tuple3(emitAmountEstimated, feeAmount, bonus))
12001200 }
12011201
12021202
12031203
12041204 @Callable(i)
12051205 func getOneTkn (outAssetIdStr,minOutAmount) = {
12061206 let isPoolOneTokenOperationsDisabled = {
12071207 let @ = invoke(factoryContract, "isPoolOneTokenOperationsDisabledREADONLY", [toString(this)], nil)
12081208 if ($isInstanceOf(@, "Boolean"))
12091209 then @
12101210 else throw(($getType(@) + " couldn't be cast to Boolean"))
12111211 }
12121212 let isGetDisabled = if (if (isGlobalShutdown())
12131213 then true
12141214 else (cfgPoolStatus == PoolShutdown))
12151215 then true
12161216 else isPoolOneTokenOperationsDisabled
12171217 let checks = [if (if (!(isGetDisabled))
12181218 then true
12191219 else isManager(i))
12201220 then true
12211221 else throwErr("get operation is blocked by admin"), if ((size(i.payments) == 1))
12221222 then true
12231223 else throwErr("exactly 1 payment are expected")]
12241224 if ((checks == checks))
12251225 then {
12261226 let outAssetId = parseAssetId(outAssetIdStr)
12271227 let payment = i.payments[0]
12281228 let paymentAssetId = payment.assetId
12291229 let paymentAmount = payment.amount
12301230 let currentKLp = calcCurrentKLp(toBigInt(0), toBigInt(0), toBigInt(0))
12311231 if ((currentKLp == currentKLp))
12321232 then {
12331233 let userAddress = i.caller
12341234 let txId = i.transactionId
1235- let $t04912149274 = calcGetOneToken(outAssetId, paymentAmount, paymentAssetId, userAddress, txId)
1236- if (($t04912149274 == $t04912149274))
1235+ let $t04913149284 = calcGetOneToken(outAssetId, paymentAmount, paymentAssetId, userAddress, txId)
1236+ if (($t04913149284 == $t04913149284))
12371237 then {
1238- let outInAmountAsset = $t04912149274._5
1239- let bonus = $t04912149274._4
1240- let feeAmount = $t04912149274._3
1241- let commonState = $t04912149274._2
1242- let amountEstimated = $t04912149274._1
1238+ let outInAmountAsset = $t04913149284._5
1239+ let bonus = $t04913149284._4
1240+ let feeAmount = $t04913149284._3
1241+ let commonState = $t04913149284._2
1242+ let amountEstimated = $t04913149284._1
12431243 let amount = if (if ((minOutAmount > 0))
12441244 then (minOutAmount > amountEstimated)
12451245 else false)
12461246 then throwErr(makeString(["amount to receive is less than ", toString(minOutAmount)], ""))
12471247 else amountEstimated
12481248 let burnInv = invoke(factoryContract, "burn", [paymentAmount], [AttachedPayment(paymentAssetId, paymentAmount)])
12491249 if ((burnInv == burnInv))
12501250 then {
12511251 let withdrawState = withdrawAndRebalanceAsset(outAssetIdStr, (amount + max([0, feeAmount])))
12521252 let assetTransfer = [ScriptTransfer(userAddress, amount, outAssetId)]
12531253 let sendFee = if ((feeAmount > 0))
12541254 then [ScriptTransfer(feeCollectorAddress, feeAmount, outAssetId)]
12551255 else nil
1256- let $t04993850185 = {
1256+ let $t04994850195 = {
12571257 let feeAmountForCalc = if ((this == feeCollectorAddress))
12581258 then 0
12591259 else feeAmount
12601260 if (outInAmountAsset)
12611261 then $Tuple2(-((amount + feeAmountForCalc)), 0)
12621262 else $Tuple2(0, -((amount + feeAmountForCalc)))
12631263 }
1264- let amountAssetBalanceDelta = $t04993850185._1
1265- let priceAssetBalanceDelta = $t04993850185._2
1266- let $t05018850296 = refreshKLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
1267- let refreshKLpActions = $t05018850296._1
1268- let updatedKLp = $t05018850296._2
1264+ let amountAssetBalanceDelta = $t04994850195._1
1265+ let priceAssetBalanceDelta = $t04994850195._2
1266+ let $t05019850306 = refreshKLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
1267+ let refreshKLpActions = $t05019850306._1
1268+ let updatedKLp = $t05019850306._2
12691269 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
12701270 if ((isUpdatedKLpValid == isUpdatedKLpValid))
12711271 then $Tuple2(((((commonState ++ withdrawState) ++ assetTransfer) ++ sendFee) ++ refreshKLpActions), amount)
12721272 else throw("Strict value is not equal to itself.")
12731273 }
12741274 else throw("Strict value is not equal to itself.")
12751275 }
12761276 else throw("Strict value is not equal to itself.")
12771277 }
12781278 else throw("Strict value is not equal to itself.")
12791279 }
12801280 else throw("Strict value is not equal to itself.")
12811281 }
12821282
12831283
12841284
12851285 @Callable(i)
12861286 func getOneTknREADONLY (outAssetId,paymentAmount) = {
1287- let $t05057450730 = calcGetOneToken(parseAssetId(outAssetId), paymentAmount, cfgLpAssetId, unit, unit)
1288- let amountEstimated = $t05057450730._1
1289- let commonState = $t05057450730._2
1290- let feeAmount = $t05057450730._3
1291- let bonus = $t05057450730._4
1292- let outInAmountAsset = $t05057450730._5
1287+ let $t05058450740 = calcGetOneToken(parseAssetId(outAssetId), paymentAmount, cfgLpAssetId, unit, unit)
1288+ let amountEstimated = $t05058450740._1
1289+ let commonState = $t05058450740._2
1290+ let feeAmount = $t05058450740._3
1291+ let bonus = $t05058450740._4
1292+ let outInAmountAsset = $t05058450740._5
12931293 $Tuple2(nil, $Tuple3(amountEstimated, feeAmount, bonus))
12941294 }
12951295
12961296
12971297
12981298 @Callable(i)
12991299 func unstakeAndGetOneTkn (unstakeAmount,outAssetIdStr,minOutAmount) = {
13001300 let isPoolOneTokenOperationsDisabled = {
13011301 let @ = invoke(factoryContract, "isPoolOneTokenOperationsDisabledREADONLY", [toString(this)], nil)
13021302 if ($isInstanceOf(@, "Boolean"))
13031303 then @
13041304 else throw(($getType(@) + " couldn't be cast to Boolean"))
13051305 }
13061306 let isGetDisabled = if (if (isGlobalShutdown())
13071307 then true
13081308 else (cfgPoolStatus == PoolShutdown))
13091309 then true
13101310 else isPoolOneTokenOperationsDisabled
13111311 let checks = [if (if (!(isGetDisabled))
13121312 then true
13131313 else isManager(i))
13141314 then true
13151315 else throwErr("get operation is blocked by admin"), if ((size(i.payments) == 0))
13161316 then true
13171317 else throwErr("no payments are expected")]
13181318 if ((checks == checks))
13191319 then {
13201320 let outAssetId = parseAssetId(outAssetIdStr)
13211321 let userAddress = i.caller
13221322 let txId = i.transactionId
13231323 let currentKLp = calcCurrentKLp(toBigInt(0), toBigInt(0), toBigInt(0))
13241324 if ((currentKLp == currentKLp))
13251325 then {
13261326 let unstakeInv = invoke(stakingContract, "unstake", [toBase58String(cfgLpAssetId), unstakeAmount], nil)
13271327 if ((unstakeInv == unstakeInv))
13281328 then {
1329- let $t05163551786 = calcGetOneToken(outAssetId, unstakeAmount, cfgLpAssetId, userAddress, txId)
1330- if (($t05163551786 == $t05163551786))
1329+ let $t05164551796 = calcGetOneToken(outAssetId, unstakeAmount, cfgLpAssetId, userAddress, txId)
1330+ if (($t05164551796 == $t05164551796))
13311331 then {
1332- let outInAmountAsset = $t05163551786._5
1333- let bonus = $t05163551786._4
1334- let feeAmount = $t05163551786._3
1335- let commonState = $t05163551786._2
1336- let amountEstimated = $t05163551786._1
1332+ let outInAmountAsset = $t05164551796._5
1333+ let bonus = $t05164551796._4
1334+ let feeAmount = $t05164551796._3
1335+ let commonState = $t05164551796._2
1336+ let amountEstimated = $t05164551796._1
13371337 let amount = if (if ((minOutAmount > 0))
13381338 then (minOutAmount > amountEstimated)
13391339 else false)
13401340 then throwErr(makeString(["amount to receive is less than ", toString(minOutAmount)], ""))
13411341 else amountEstimated
13421342 let burnInv = invoke(factoryContract, "burn", [unstakeAmount], [AttachedPayment(cfgLpAssetId, unstakeAmount)])
13431343 if ((burnInv == burnInv))
13441344 then {
13451345 let withdrawState = withdrawAndRebalanceAsset(outAssetIdStr, (amount + max([0, feeAmount])))
13461346 let assetTransfer = [ScriptTransfer(i.caller, amount, outAssetId)]
13471347 let sendFee = if ((feeAmount > 0))
13481348 then [ScriptTransfer(feeCollectorAddress, feeAmount, outAssetId)]
13491349 else nil
1350- let $t05244552692 = {
1350+ let $t05245552702 = {
13511351 let feeAmountForCalc = if ((this == feeCollectorAddress))
13521352 then 0
13531353 else feeAmount
13541354 if (outInAmountAsset)
13551355 then $Tuple2(-((amount + feeAmountForCalc)), 0)
13561356 else $Tuple2(0, -((amount + feeAmountForCalc)))
13571357 }
1358- let amountAssetBalanceDelta = $t05244552692._1
1359- let priceAssetBalanceDelta = $t05244552692._2
1360- let $t05269552803 = refreshKLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
1361- let refreshKLpActions = $t05269552803._1
1362- let updatedKLp = $t05269552803._2
1358+ let amountAssetBalanceDelta = $t05245552702._1
1359+ let priceAssetBalanceDelta = $t05245552702._2
1360+ let $t05270552813 = refreshKLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
1361+ let refreshKLpActions = $t05270552813._1
1362+ let updatedKLp = $t05270552813._2
13631363 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
13641364 if ((isUpdatedKLpValid == isUpdatedKLpValid))
13651365 then $Tuple2(((((commonState ++ withdrawState) ++ assetTransfer) ++ sendFee) ++ refreshKLpActions), amount)
13661366 else throw("Strict value is not equal to itself.")
13671367 }
13681368 else throw("Strict value is not equal to itself.")
13691369 }
13701370 else throw("Strict value is not equal to itself.")
13711371 }
13721372 else throw("Strict value is not equal to itself.")
13731373 }
13741374 else throw("Strict value is not equal to itself.")
13751375 }
13761376 else throw("Strict value is not equal to itself.")
13771377 }
13781378
13791379
13801380
13811381 @Callable(i)
13821382 func get () = {
13831383 let res = commonGet(i)
13841384 let outAmAmt = res._1
13851385 let outPrAmt = res._2
13861386 let pmtAmt = res._3
13871387 let pmtAssetId = res._4
13881388 let state = res._5
13891389 let withdrawState = withdrawAndRebalanceAll(outAmAmt, outPrAmt)
13901390 let currentKLp = calcCurrentKLp(toBigInt(0), toBigInt(0), toBigInt(0))
13911391 if ((currentKLp == currentKLp))
13921392 then {
13931393 let burnLPAssetOnFactory = invoke(factoryContract, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
13941394 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
13951395 then {
1396- let $t05389853979 = refreshKLpInternal(-(outAmAmt), -(outPrAmt), 0)
1397- let refreshKLpActions = $t05389853979._1
1398- let updatedKLp = $t05389853979._2
1396+ let $t05390853989 = refreshKLpInternal(-(outAmAmt), -(outPrAmt), 0)
1397+ let refreshKLpActions = $t05390853989._1
1398+ let updatedKLp = $t05390853989._2
13991399 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
14001400 if ((isUpdatedKLpValid == isUpdatedKLpValid))
14011401 then ((withdrawState ++ state) ++ refreshKLpActions)
14021402 else throw("Strict value is not equal to itself.")
14031403 }
14041404 else throw("Strict value is not equal to itself.")
14051405 }
14061406 else throw("Strict value is not equal to itself.")
14071407 }
14081408
14091409
14101410
14111411 @Callable(i)
14121412 func getNoLess (noLessThenAmtAsset,noLessThenPriceAsset) = {
14131413 let res = commonGet(i)
14141414 let outAmAmt = res._1
14151415 let outPrAmt = res._2
14161416 let pmtAmt = res._3
14171417 let pmtAssetId = res._4
14181418 let state = res._5
14191419 if ((noLessThenAmtAsset > outAmAmt))
14201420 then throw(((("noLessThenAmtAsset failed: " + toString(outAmAmt)) + " < ") + toString(noLessThenAmtAsset)))
14211421 else if ((noLessThenPriceAsset > outPrAmt))
14221422 then throw(((("noLessThenPriceAsset failed: " + toString(outPrAmt)) + " < ") + toString(noLessThenPriceAsset)))
14231423 else {
14241424 let withdrawState = withdrawAndRebalanceAll(outAmAmt, outPrAmt)
14251425 let currentKLp = calcCurrentKLp(toBigInt(0), toBigInt(0), toBigInt(0))
14261426 if ((currentKLp == currentKLp))
14271427 then {
14281428 let burnLPAssetOnFactory = invoke(factoryContract, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
14291429 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
14301430 then {
1431- let $t05507455155 = refreshKLpInternal(-(outAmAmt), -(outPrAmt), 0)
1432- let refreshKLpActions = $t05507455155._1
1433- let updatedKLp = $t05507455155._2
1431+ let $t05508455165 = refreshKLpInternal(-(outAmAmt), -(outPrAmt), 0)
1432+ let refreshKLpActions = $t05508455165._1
1433+ let updatedKLp = $t05508455165._2
14341434 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
14351435 if ((isUpdatedKLpValid == isUpdatedKLpValid))
14361436 then ((withdrawState ++ state) ++ refreshKLpActions)
14371437 else throw("Strict value is not equal to itself.")
14381438 }
14391439 else throw("Strict value is not equal to itself.")
14401440 }
14411441 else throw("Strict value is not equal to itself.")
14421442 }
14431443 }
14441444
14451445
14461446
14471447 @Callable(i)
14481448 func unstakeAndGet (amount) = {
14491449 let checkPayments = if ((size(i.payments) != 0))
14501450 then throw("No payments are expected")
14511451 else true
14521452 if ((checkPayments == checkPayments))
14531453 then {
14541454 let cfg = getPoolConfig()
14551455 let lpAssetId = fromBase58String(cfg[idxPoolLPAssetId])
14561456 let currentKLp = calcCurrentKLp(toBigInt(0), toBigInt(0), toBigInt(0))
14571457 if ((currentKLp == currentKLp))
14581458 then {
14591459 let unstakeInv = invoke(stakingContract, "unstake", [toBase58String(lpAssetId), amount], nil)
14601460 if ((unstakeInv == unstakeInv))
14611461 then {
14621462 let res = estimateGetOperation(toBase58String(i.transactionId), toBase58String(lpAssetId), amount, i.caller)
14631463 let outAmAmt = res._1
14641464 let outPrAmt = res._2
14651465 let poolStatus = parseIntValue(res._9)
14661466 let state = res._10
14671467 let withdrawState = withdrawAndRebalanceAll(outAmAmt, outPrAmt)
14681468 let checkPoolStatus = if (if (isGlobalShutdown())
14691469 then true
14701470 else (poolStatus == PoolShutdown))
14711471 then throw(("Get operation is blocked by admin. Status = " + toString(poolStatus)))
14721472 else true
14731473 if ((checkPoolStatus == checkPoolStatus))
14741474 then {
14751475 let burnLPAssetOnFactory = invoke(factoryContract, "burn", [amount], [AttachedPayment(lpAssetId, amount)])
14761476 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
14771477 then {
1478- let $t05642756508 = refreshKLpInternal(-(outAmAmt), -(outPrAmt), 0)
1479- let refreshKLpActions = $t05642756508._1
1480- let updatedKLp = $t05642756508._2
1478+ let $t05643756518 = refreshKLpInternal(-(outAmAmt), -(outPrAmt), 0)
1479+ let refreshKLpActions = $t05643756518._1
1480+ let updatedKLp = $t05643756518._2
14811481 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
14821482 if ((isUpdatedKLpValid == isUpdatedKLpValid))
14831483 then ((withdrawState ++ state) ++ refreshKLpActions)
14841484 else throw("Strict value is not equal to itself.")
14851485 }
14861486 else throw("Strict value is not equal to itself.")
14871487 }
14881488 else throw("Strict value is not equal to itself.")
14891489 }
14901490 else throw("Strict value is not equal to itself.")
14911491 }
14921492 else throw("Strict value is not equal to itself.")
14931493 }
14941494 else throw("Strict value is not equal to itself.")
14951495 }
14961496
14971497
14981498
14991499 @Callable(i)
15001500 func unstakeAndGetNoLess (unstakeAmount,noLessThenAmountAsset,noLessThenPriceAsset) = {
15011501 let isGetDisabled = if (isGlobalShutdown())
15021502 then true
15031503 else (cfgPoolStatus == PoolShutdown)
15041504 let checks = [if (!(isGetDisabled))
15051505 then true
15061506 else throw("get operation is blocked by admin"), if ((size(i.payments) == 0))
15071507 then true
15081508 else throw("no payments are expected")]
15091509 if ((checks == checks))
15101510 then {
15111511 let currentKLp = calcCurrentKLp(toBigInt(0), toBigInt(0), toBigInt(0))
15121512 if ((currentKLp == currentKLp))
15131513 then {
15141514 let unstakeInv = invoke(stakingContract, "unstake", [toBase58String(cfgLpAssetId), unstakeAmount], nil)
15151515 if ((unstakeInv == unstakeInv))
15161516 then {
15171517 let res = estimateGetOperation(toBase58String(i.transactionId), toBase58String(cfgLpAssetId), unstakeAmount, i.caller)
15181518 let outAmAmt = res._1
15191519 let outPrAmt = res._2
15201520 let state = res._10
15211521 let withdrawState = withdrawAndRebalanceAll(outAmAmt, outPrAmt)
15221522 let checkAmounts = [if ((outAmAmt >= noLessThenAmountAsset))
15231523 then true
15241524 else throw(makeString(["amount asset amount to receive is less than ", toString(noLessThenAmountAsset)], "")), if ((outPrAmt >= noLessThenPriceAsset))
15251525 then true
15261526 else throw(makeString(["price asset amount to receive is less than ", toString(noLessThenPriceAsset)], ""))]
15271527 if ((checkAmounts == checkAmounts))
15281528 then {
15291529 let burnLPAssetOnFactory = invoke(factoryContract, "burn", [unstakeAmount], [AttachedPayment(cfgLpAssetId, unstakeAmount)])
15301530 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
15311531 then {
1532- let $t05794958030 = refreshKLpInternal(-(outAmAmt), -(outPrAmt), 0)
1533- let refreshKLpActions = $t05794958030._1
1534- let updatedKLp = $t05794958030._2
1532+ let $t05795958040 = refreshKLpInternal(-(outAmAmt), -(outPrAmt), 0)
1533+ let refreshKLpActions = $t05795958040._1
1534+ let updatedKLp = $t05795958040._2
15351535 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
15361536 if ((isUpdatedKLpValid == isUpdatedKLpValid))
15371537 then ((withdrawState ++ state) ++ refreshKLpActions)
15381538 else throw("Strict value is not equal to itself.")
15391539 }
15401540 else throw("Strict value is not equal to itself.")
15411541 }
15421542 else throw("Strict value is not equal to itself.")
15431543 }
15441544 else throw("Strict value is not equal to itself.")
15451545 }
15461546 else throw("Strict value is not equal to itself.")
15471547 }
15481548 else throw("Strict value is not equal to itself.")
15491549 }
15501550
15511551
15521552
15531553 @Callable(i)
15541554 func activate (amtAssetStr,priceAssetStr) = if ((toString(i.caller) != toString(factoryContract)))
15551555 then throw("permissions denied")
15561556 else $Tuple2([StringEntry(aa(), amtAssetStr), StringEntry(pa(), priceAssetStr)], "success")
15571557
15581558
15591559
15601560 @Callable(i)
15611561 func refreshKLp () = {
15621562 let lastRefreshedBlockHeight = valueOrElse(getInteger(keyKLpRefreshedHeight), 0)
15631563 let checkLastRefreshedBlockHeight = if (((height - lastRefreshedBlockHeight) >= kLpRefreshDelay))
15641564 then unit
15651565 else throwErr(makeString([toString(kLpRefreshDelay), " blocks have not passed since the previous call"], ""))
15661566 if ((checkLastRefreshedBlockHeight == checkLastRefreshedBlockHeight))
15671567 then {
15681568 let kLp = valueOrErrorMessage(parseBigInt(valueOrElse(getString(this, keyKLp), "0")), fmtErr("invalid kLp"))
1569- let $t05923459298 = refreshKLpInternal(0, 0, 0)
1570- let kLpUpdateActions = $t05923459298._1
1571- let updatedKLp = $t05923459298._2
1569+ let $t05924459308 = refreshKLpInternal(0, 0, 0)
1570+ let kLpUpdateActions = $t05924459308._1
1571+ let updatedKLp = $t05924459308._2
15721572 let actions = if ((kLp != updatedKLp))
15731573 then kLpUpdateActions
15741574 else throwErr("nothing to refresh")
15751575 $Tuple2(actions, toString(updatedKLp))
15761576 }
15771577 else throw("Strict value is not equal to itself.")
15781578 }
15791579
15801580
15811581
15821582 @Callable(i)
15831583 func getPoolConfigWrapperREADONLY () = $Tuple2(nil, getPoolConfig())
15841584
15851585
15861586
15871587 @Callable(i)
15881588 func getAccBalanceWrapperREADONLY (assetId) = $Tuple2(nil, getAccBalance(assetId))
15891589
15901590
15911591
15921592 @Callable(i)
15931593 func calcPricesWrapperREADONLY (amAmt,prAmt,lpAmt) = {
15941594 let prices = calcPrices(amAmt, prAmt, lpAmt)
15951595 $Tuple2(nil, [toString(prices[0]), toString(prices[1]), toString(prices[2])])
15961596 }
15971597
15981598
15991599
16001600 @Callable(i)
16011601 func toX18WrapperREADONLY (origVal,origScaleMult) = $Tuple2(nil, toString(toX18(origVal, origScaleMult)))
16021602
16031603
16041604
16051605 @Callable(i)
16061606 func fromX18WrapperREADONLY (val,resultScaleMult) = $Tuple2(nil, fromX18(parseBigIntValue(val), resultScaleMult))
16071607
16081608
16091609
16101610 @Callable(i)
16111611 func calcPriceBigIntWrapperREADONLY (prAmtX18,amAmtX18) = $Tuple2(nil, toString(calcPriceBigInt(parseBigIntValue(prAmtX18), parseBigIntValue(amAmtX18))))
16121612
16131613
16141614
16151615 @Callable(i)
16161616 func estimatePutOperationWrapperREADONLY (txId58,slippageTolerance,inAmAssetAmt,inAmAssetId,inPrAssetAmt,inPrAssetId,userAddress,isEvaluate,emitLp) = $Tuple2(nil, estimatePutOperation(txId58, slippageTolerance, inAmAssetAmt, inAmAssetId, inPrAssetAmt, inPrAssetId, userAddress, isEvaluate, emitLp))
16171617
16181618
16191619
16201620 @Callable(i)
16211621 func estimateGetOperationWrapperREADONLY (txId58,pmtAssetId,pmtLpAmt,userAddress) = {
16221622 let res = estimateGetOperation(txId58, pmtAssetId, pmtLpAmt, addressFromStringValue(userAddress))
16231623 $Tuple2(nil, $Tuple10(res._1, res._2, res._3, res._4, res._5, res._6, res._7, toString(res._8), res._9, res._10))
16241624 }
16251625
16261626
16271627
16281628 @Callable(i)
16291629 func statsREADONLY () = {
16301630 let cfg = getPoolConfig()
16311631 let lpAssetId = fromBase58String(cfg[idxPoolLPAssetId])
16321632 let amtAssetId = cfg[idxAmtAssetId]
16331633 let priceAssetId = cfg[idxPriceAssetId]
16341634 let iAmtAssetId = cfg[idxIAmtAssetId]
16351635 let iPriceAssetId = cfg[idxIPriceAssetId]
16361636 let amtAssetDcm = parseIntValue(cfg[idxAmtAssetDcm])
16371637 let priceAssetDcm = parseIntValue(cfg[idxPriceAssetDcm])
16381638 let poolLPBalance = valueOrErrorMessage(assetInfo(lpAssetId), (("Asset " + toBase58String(lpAssetId)) + " doesn't exist")).quantity
16391639 let accAmtAssetBalance = getAccBalance(amtAssetId)
16401640 let accPriceAssetBalance = getAccBalance(priceAssetId)
16411641 let pricesList = if ((poolLPBalance == 0))
16421642 then [zeroBigInt, zeroBigInt, zeroBigInt]
16431643 else calcPrices(accAmtAssetBalance, accPriceAssetBalance, poolLPBalance)
16441644 let curPrice = 0
16451645 let lpAmtAssetShare = fromX18(pricesList[1], scale8)
16461646 let lpPriceAssetShare = fromX18(pricesList[2], scale8)
16471647 let poolWeight = value(getInteger(factoryContract, keyPoolWeight(toString(this))))
16481648 $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))
16491649 }
16501650
16511651
16521652
16531653 @Callable(i)
16541654 func evaluatePutByAmountAssetREADONLY (inAmAssetAmt) = {
16551655 let cfg = getPoolConfig()
16561656 let lpAssetId = fromBase58String(cfg[idxPoolLPAssetId])
16571657 let amAssetIdStr = cfg[idxAmtAssetId]
16581658 let amAssetId = fromBase58String(amAssetIdStr)
16591659 let prAssetIdStr = cfg[idxPriceAssetId]
16601660 let prAssetId = fromBase58String(prAssetIdStr)
16611661 let amtAssetDcm = parseIntValue(cfg[idxAmtAssetDcm])
16621662 let priceAssetDcm = parseIntValue(cfg[idxPriceAssetDcm])
16631663 let poolStatus = cfg[idxPoolStatus]
16641664 let poolLPBalance = valueOrErrorMessage(assetInfo(lpAssetId), (("Asset " + toBase58String(lpAssetId)) + " doesn't exist")).quantity
16651665 let accAmtAssetBalance = getAccBalance(amAssetIdStr)
16661666 let accPriceAssetBalance = getAccBalance(prAssetIdStr)
16671667 let amtAssetAmtX18 = toX18(accAmtAssetBalance, amtAssetDcm)
16681668 let priceAssetAmtX18 = toX18(accPriceAssetBalance, priceAssetDcm)
16691669 let curPriceX18 = if ((poolLPBalance == 0))
16701670 then zeroBigInt
16711671 else calcPriceBigInt(priceAssetAmtX18, amtAssetAmtX18)
16721672 let inAmAssetAmtX18 = toX18(inAmAssetAmt, amtAssetDcm)
16731673 let inPrAssetAmtX18 = fraction(inAmAssetAmtX18, curPriceX18, scale18)
16741674 let inPrAssetAmt = fromX18(inPrAssetAmtX18, priceAssetDcm)
16751675 let estPut = estimatePutOperation("", 500000, inAmAssetAmt, amAssetId, inPrAssetAmt, prAssetId, "", true, false)
16761676 let calcLpAmt = estPut._1
16771677 let curPriceCalc = estPut._3
16781678 let amBalance = estPut._4
16791679 let prBalance = estPut._5
16801680 let lpEmission = estPut._6
16811681 $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))
16821682 }
16831683
16841684
16851685
16861686 @Callable(i)
16871687 func evaluatePutByPriceAssetREADONLY (inPrAssetAmt) = {
16881688 let cfg = getPoolConfig()
16891689 let lpAssetId = fromBase58String(cfg[idxPoolLPAssetId])
16901690 let amAssetIdStr = cfg[idxAmtAssetId]
16911691 let amAssetId = fromBase58String(amAssetIdStr)
16921692 let prAssetIdStr = cfg[idxPriceAssetId]
16931693 let prAssetId = fromBase58String(prAssetIdStr)
16941694 let amtAssetDcm = parseIntValue(cfg[idxAmtAssetDcm])
16951695 let priceAssetDcm = parseIntValue(cfg[idxPriceAssetDcm])
16961696 let poolStatus = cfg[idxPoolStatus]
16971697 let poolLPBalance = valueOrErrorMessage(assetInfo(lpAssetId), (("Asset " + toBase58String(lpAssetId)) + " doesn't exist")).quantity
16981698 let amBalanceRaw = getAccBalance(amAssetIdStr)
16991699 let prBalanceRaw = getAccBalance(prAssetIdStr)
17001700 let amBalanceRawX18 = toX18(amBalanceRaw, amtAssetDcm)
17011701 let prBalanceRawX18 = toX18(prBalanceRaw, priceAssetDcm)
17021702 let curPriceX18 = if ((poolLPBalance == 0))
17031703 then zeroBigInt
17041704 else calcPriceBigInt(prBalanceRawX18, amBalanceRawX18)
17051705 let inPrAssetAmtX18 = toX18(inPrAssetAmt, priceAssetDcm)
17061706 let inAmAssetAmtX18 = fraction(inPrAssetAmtX18, scale18, curPriceX18)
17071707 let inAmAssetAmt = fromX18(inAmAssetAmtX18, amtAssetDcm)
17081708 let estPut = estimatePutOperation("", 500000, inAmAssetAmt, amAssetId, inPrAssetAmt, prAssetId, "", true, false)
17091709 let calcLpAmt = estPut._1
17101710 let curPriceCalc = estPut._3
17111711 let amBalance = estPut._4
17121712 let prBalance = estPut._5
17131713 let lpEmission = estPut._6
17141714 $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))
17151715 }
17161716
17171717
17181718
17191719 @Callable(i)
17201720 func evaluateGetREADONLY (paymentLpAssetId,paymentLpAmt) = {
17211721 let res = estimateGetOperation("", paymentLpAssetId, paymentLpAmt, this)
17221722 let outAmAmt = res._1
17231723 let outPrAmt = res._2
17241724 let amBalance = res._5
17251725 let prBalance = res._6
17261726 let lpEmission = res._7
17271727 let curPrice = res._8
17281728 let poolStatus = parseIntValue(res._9)
17291729 $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))
17301730 }
17311731
17321732
17331733 @Verifier(tx)
17341734 func verify () = {
17351735 let targetPublicKey = match managerPublicKeyOrUnit() {
17361736 case pk: ByteVector =>
17371737 pk
17381738 case _: Unit =>
17391739 tx.senderPublicKey
17401740 case _ =>
17411741 throw("Match error")
17421742 }
17431743 match tx {
17441744 case order: Order =>
17451745 let matcherPub = getMatcherPubOrFail()
1746- let $t06796068077 = if (skipOrderValidation())
1746+ let $t06797068087 = if (skipOrderValidation())
17471747 then $Tuple2(true, "")
17481748 else validateMatcherOrderAllowed(order)
1749- let orderValid = $t06796068077._1
1750- let orderValidInfo = $t06796068077._2
1749+ let orderValid = $t06797068087._1
1750+ let orderValidInfo = $t06797068087._2
17511751 let senderValid = sigVerify(order.bodyBytes, order.proofs[0], order.senderPublicKey)
17521752 let matcherValid = sigVerify(order.bodyBytes, order.proofs[1], matcherPub)
17531753 if (if (if (orderValid)
17541754 then senderValid
17551755 else false)
17561756 then matcherValid
17571757 else false)
17581758 then true
17591759 else throwOrderError(orderValid, orderValidInfo, senderValid, matcherValid)
17601760 case s: SetScriptTransaction =>
17611761 if (sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey))
17621762 then true
17631763 else {
17641764 let newHash = blake2b256(value(s.script))
17651765 let allowedHash = fromBase64String(value(getString(factoryContract, keyAllowedLpScriptHash())))
17661766 let currentHash = scriptHash(this)
17671767 if ((allowedHash == newHash))
17681768 then (currentHash != newHash)
17691769 else false
17701770 }
17711771 case _ =>
17721772 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
17731773 }
17741774 }
17751775

github/deemru/w8io/3ef1775 
263.11 ms