tx · DDszjsjgjwExQ4JTipPSek3guTeme8cB5bYhiS5Hxpw4

3Mp5kisFrqESzrXxAMEPk2k69zpeF41czEE:  -0.02900000 Waves

2022.09.29 16:50 [2250478] smart account 3Mp5kisFrqESzrXxAMEPk2k69zpeF41czEE > SELF 0.00000000 Waves

{ "type": 13, "id": "DDszjsjgjwExQ4JTipPSek3guTeme8cB5bYhiS5Hxpw4", "fee": 2900000, "feeAssetId": null, "timestamp": 1664459453066, "version": 1, "sender": "3Mp5kisFrqESzrXxAMEPk2k69zpeF41czEE", "senderPublicKey": "G349Uq3FTox7dRNLeAfAQeoACvwZ9iEnVSaHcEYn6j8J", "proofs": [ "3WgfV8goNDobUokVM7CpqSKLkvKm3x5QnecyavdVRZJazyPgd4BsaxUPzuHayPewdP8Xh4tUtXmtyS3xrB7zLbR3" ], "script": "base64:BgJtCAISBAoCCAESABIDCgEBEgASABIAEgMKAQgSAwoBCBIDCgEIEgUKAwEBARIFCgMBAQESABIDCgEIEgcKBQgICAgIEgoKCAgICAgICAgIEgoKCAgICAgICAgIEgoKCAgICAgICAgIEgMKAQgSAE8AA1NFUAICX18ABVNDQUxFAOgHAAVNVUxUOACAwtcvAAp6ZXJvQmlnSW50CQC2AgEAAAAUcHJvY2Vzc2luZ1N0YWdlVG90YWwAAAAVcHJvY2Vzc2luZ1N0YWdlU2hhcmVzAAEBDmdldE51bWJlckJ5S2V5AQNrZXkJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUDa2V5AAABD2dldE51bWJlck9yRmFpbAEDa2V5CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUEdGhpcwUDa2V5CQCsAgIJAKwCAgIPbWFuZGF0b3J5IHRoaXMuBQNrZXkCDyBpcyBub3QgZGVmaW5lZAEOZ2V0U3RyaW5nQnlLZXkBA2tleQkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzBQNrZXkCAAEPZ2V0U3RyaW5nT3JGYWlsAQNrZXkJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzBQNrZXkJAKwCAgkArAICAg9tYW5kYXRvcnkgdGhpcy4FA2tleQIPIGlzIG5vdCBkZWZpbmVkAQNhYnMBA3ZhbAMJAGYCAAAFA3ZhbAkBAS0BBQN2YWwFA3ZhbAEJYWJzQmlnSW50AQN2YWwDCQC/AgIFCnplcm9CaWdJbnQFA3ZhbAkAvgIBBQN2YWwFA3ZhbAALa2V5TWF4RGVwdGgCDCVzX19tYXhEZXB0aAAPbWF4RGVwdGhEZWZhdWx0AB4ACG1heERlcHRoCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFC2tleU1heERlcHRoBQ9tYXhEZXB0aERlZmF1bHQBEWtleUZhY3RvcnlBZGRyZXNzAAIcJXMlc19fY29uZmlnX19mYWN0b3J5QWRkcmVzcwARZmFjdG9yeUFkZHJlc3NTdHIJAQ9nZXRTdHJpbmdPckZhaWwBCQERa2V5RmFjdG9yeUFkZHJlc3MAAA9mYWN0b3J5Q29udHJhY3QJARFAZXh0ck5hdGl2ZSgxMDYyKQEFEWZhY3RvcnlBZGRyZXNzU3RyARJrZXlFbWlzc2lvbkFkZHJlc3MAAh0lcyVzX19jb25maWdfX2VtaXNzaW9uQWRkcmVzcwETa2V5TnVtVG9Vc2VyTWFwcGluZwEDbnVtCQC5CQIJAMwIAgIGJXMlcyVzCQDMCAICB21hcHBpbmcJAMwIAgIIbnVtMnVzZXIJAMwIAgkApAMBBQNudW0FA25pbAUDU0VQABZrZXlSZWZlcnJhbFByb2dyYW1OYW1lCQC5CQIJAMwIAgIEJXMlcwkAzAgCAghyZWZlcnJhbAkAzAgCAgtwcm9ncmFtTmFtZQUDbmlsBQNTRVAAGnJlZmVycmFsUHJvZ3JhbU5hbWVEZWZhdWx0AgZ3eGxvY2sAE3JlZmVycmFsUHJvZ3JhbU5hbWUJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwUWa2V5UmVmZXJyYWxQcm9ncmFtTmFtZQUacmVmZXJyYWxQcm9ncmFtTmFtZURlZmF1bHQAF2tleVJlZmVycmFsTWluR1d4QW1vdW50CQC5CQIJAMwIAgIEJXMlcwkAzAgCAghyZWZlcnJhbAkAzAgCAgxtaW5HV3hBbW91bnQFA25pbAUDU0VQABtyZWZlcnJhbE1pbkdXeEFtb3VudERlZmF1bHQJAGgCAPQDBQVNVUxUOAAUcmVmZXJyYWxNaW5HV3hBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUXa2V5UmVmZXJyYWxNaW5HV3hBbW91bnQFG3JlZmVycmFsTWluR1d4QW1vdW50RGVmYXVsdAAZa2V5UmVmZXJyZXJSZXdhcmRQZXJtaWxsZQkAuQkCCQDMCAICBCVzJXMJAMwIAgIIcmVmZXJyYWwJAMwIAgIWcmVmZXJyZXJSZXdhcmRQZXJtaWxsZQUDbmlsBQNTRVAAHXJlZmVycmVyUmV3YXJkUGVybWlsbGVEZWZhdWx0ADIAFnJlZmVycmVyUmV3YXJkUGVybWlsbGUJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUZa2V5UmVmZXJyZXJSZXdhcmRQZXJtaWxsZQUdcmVmZXJyZXJSZXdhcmRQZXJtaWxsZURlZmF1bHQAGWtleVJlZmVycmFsUmV3YXJkUGVybWlsbGUJALkJAgkAzAgCAgQlcyVzCQDMCAICCHJlZmVycmFsCQDMCAICFnJlZmVycmFsUmV3YXJkUGVybWlsbGUFA25pbAUDU0VQAB1yZWZlcnJhbFJld2FyZFBlcm1pbGxlRGVmYXVsdAAyABZyZWZlcnJhbFJld2FyZFBlcm1pbGxlCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFGWtleVJlZmVycmFsUmV3YXJkUGVybWlsbGUFHXJlZmVycmFsUmV3YXJkUGVybWlsbGVEZWZhdWx0AQtrZXlSZWZlcnJlcgEPcmVmZXJyYWxBZGRyZXNzCQC5CQIJAMwIAgIGJXMlcyVzCQDMCAICCHJlZmVycmVyCQDMCAIFE3JlZmVycmFsUHJvZ3JhbU5hbWUJAMwIAgUPcmVmZXJyYWxBZGRyZXNzBQNuaWwFA1NFUAEUa2V5VW5jbGFpbWVkUmVmZXJyYWwCC3Byb2dyYW1OYW1lDmNsYWltZXJBZGRyZXNzCQC5CQIJAMwIAgIIJXMlcyVzJXMJAMwIAgIRdW5jbGFpbWVkUmVmZXJyYWwJAMwIAgULcHJvZ3JhbU5hbWUJAMwIAgUOY2xhaW1lckFkZHJlc3MFA25pbAUDU0VQABJlbWlzc2lvbkFkZHJlc3NTdHIJAQ9nZXRTdHJpbmdPckZhaWwBCQESa2V5RW1pc3Npb25BZGRyZXNzAAAQZW1pc3Npb25Db250cmFjdAkBEUBleHRyTmF0aXZlKDEwNjIpAQUSZW1pc3Npb25BZGRyZXNzU3RyAA1JZHhDZmdBc3NldElkAAEAFklkeENmZ1BhY2VtYWtlckFkZHJlc3MAAgAWSWR4Q2ZnQm9vc3RpbmdDb250cmFjdAADAA5JZHhDZmdNYXhEZXB0aAAEAQlrZXlDb25maWcAAgolc19fY29uZmlnARVyZWFkQ29uZmlnQXJyYXlPckZhaWwACQC1CQIJAQ9nZXRTdHJpbmdPckZhaWwBCQEJa2V5Q29uZmlnAAUDU0VQAQxmb3JtYXRDb25maWcEDHd4QXNzZXRJZFN0chptYXRjaGVyUGFjZW1ha2VyQWRkcmVzc1N0chpib29zdGluZ0NvbnRyYWN0QWRkcmVzc1N0cghtYXhEZXB0aAkAuQkCCQDMCAICCCVzJXMlcyVkCQDMCAIFDHd4QXNzZXRJZFN0cgkAzAgCBRptYXRjaGVyUGFjZW1ha2VyQWRkcmVzc1N0cgkAzAgCBRpib29zdGluZ0NvbnRyYWN0QWRkcmVzc1N0cgkAzAgCCQCkAwEFCG1heERlcHRoBQNuaWwFA1NFUAEWYm9vc3RpbmdDb250cmFjdE9yRmFpbAAECGNmZ0FycmF5CQEVcmVhZENvbmZpZ0FycmF5T3JGYWlsAAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUIY2ZnQXJyYXkFFklkeENmZ0Jvb3N0aW5nQ29udHJhY3QCKGJvb3N0aW5nIGNvbnRyYWN0IGFkZHJlc3MgaXMgbm90IGRlZmluZWQBH2tleUd3eFJld2FyZEVtaXNzaW9uU3RhcnRIZWlnaHQAAiglcyVzX19nd3hSZXdhcmRFbWlzc2lvblBhcnRfX3N0YXJ0SGVpZ2h0AQ1rZXlVc2Vyc0NvdW50AAIPJXNfX25leHRVc2VyTnVtARZrZXlSYXRlUGVyQmxvY2tDdXJyZW50AAIbJXMlc19fcmF0ZVBlckJsb2NrX19jdXJyZW50ARRrZXlQb29sV2VpZ2h0VmlydHVhbAACICVzJXNfX3Bvb2xXZWlnaHRfX0dXWHZpcnR1YWxQT09MARRrZXlOZXh0UHJvY2Vzc2VkVXNlcgACFSVzX19uZXh0UHJvY2Vzc2VkVXNlcgEPa2V5TGF0ZXN0UGVyaW9kAAIQJXNfX2xhdGVzdFBlcmlvZAENa2V5TmV4dFBlcmlvZAACDiVzX19uZXh0UGVyaW9kARJrZXlQcm9jZXNzaW5nU3RhZ2UAAhMlc19fcHJvY2Vzc2luZ1N0YWdlARZrZXlOZXh0UHJvY2Vzc2VkUGVyaW9kAAIXJXNfX25leHRQcm9jZXNzZWRQZXJpb2QBEGtleVVzZXJVbmNsYWltZWQBCXVzZXJJbmRleAkAuQkCCQDMCAICBCVzJWQJAMwIAgINdXNlclVuY2xhaW1lZAkAzAgCCQCkAwEFCXVzZXJJbmRleAUDbmlsBQNTRVABG2tleU5leHRVbmxhaW1lZFBlcmlvZE9mVXNlcgEJdXNlckluZGV4CQC5CQIJAMwIAgIXJXMlZF9fbmV4dENsYWltZWRQZXJpb2QJAMwIAgkApAMBBQl1c2VySW5kZXgFA25pbAUDU0VQARxrZXlMYXN0UHJvY2Vzc2VkUGVyaW9kT2ZVc2VyAQl1c2VySW5kZXgJALkJAgkAzAgCAhklcyVkX19sYXN0UHJvY2Vzc2VkUGVyaW9kCQDMCAIJAKQDAQUJdXNlckluZGV4BQNuaWwFA1NFUAESa2V5SGVpZ2h0Rm9yUGVyaW9kAQZwZXJpb2QJALkJAgkAzAgCAholcyVkX19zdGFydEhlaWdodEZvclBlcmlvZAkAzAgCCQCkAwEFBnBlcmlvZAUDbmlsBQNTRVABHWtleUF1eEVtaXNzaW9uUmV3YXJkRm9yUGVyaW9kAQZwZXJpb2QJALkJAgkAzAgCAhclcyVkX19hdXhFbWlzc2lvblJld2FyZAkAzAgCCQCkAwEFBnBlcmlvZAUDbmlsBQNTRVABF2tleVRvdGFsQW1vdW50Rm9yUGVyaW9kAQZwZXJpb2QJALkJAgkAzAgCAholcyVkX190b3RhbEFtb3VudEZvclBlcmlvZAkAzAgCCQCkAwEFBnBlcmlvZAUDbmlsBQNTRVABEWtleUxhc3RQYXlvdXRJbmZvAAISJXNfX2xhc3RQYXlvdXRJbmZvARBQZXJpb2RQYXlvdXRJbmZvAwZwZXJpb2QNbWF0Y2hlclJld2FyZA5lbWlzc2lvblJld2FyZAkAuQkCCQDMCAICBiVkJWQlZAkAzAgCCQCkAwEFBnBlcmlvZAkAzAgCCQCkAwEFDW1hdGNoZXJSZXdhcmQJAMwIAgkApAMBBQ5lbWlzc2lvblJld2FyZAUDbmlsBQNTRVABFGtleVBheW91dEhpc3RvcnlJbmZvAQZwZXJpb2QJALkJAgkAzAgCAhglcyVzJWRfX3BheW91dHNfX2hpc3RvcnkJAMwIAgkApAMBBQZwZXJpb2QFA25pbAUDU0VQARdrZXlUb3RhbFdlaWdodEZvclBlcmlvZAEGcGVyaW9kCQC5CQIJAMwIAgIaJXMlZF9fdG90YWxXZWlnaHRGb3JQZXJpb2QJAMwIAgkApAMBBQZwZXJpb2QFA25pbAUDU0VQARZrZXlVc2VyS1ZhbHVlRm9yUGVyaW9kAgZwZXJpb2QJdXNlckluZGV4CQC5CQIJAMwIAgIXJXMlZCVzJWRfX3BhcmFtQnlQZXJpb2QJAMwIAgkApAMBBQl1c2VySW5kZXgJAMwIAgIBawkAzAgCCQCkAwEFBnBlcmlvZAUDbmlsBQNTRVABFmtleVVzZXJCVmFsdWVGb3JQZXJpb2QCBnBlcmlvZAl1c2VySW5kZXgJALkJAgkAzAgCAhclcyVkJXMlZF9fcGFyYW1CeVBlcmlvZAkAzAgCCQCkAwEFCXVzZXJJbmRleAkAzAgCAgFiCQDMCAIJAKQDAQUGcGVyaW9kBQNuaWwFA1NFUAEWa2V5VXNlcldlaWdodEZvclBlcmlvZAIGcGVyaW9kCXVzZXJJbmRleAkAuQkCCQDMCAICFyVzJWQlcyVkX19wYXJhbUJ5UGVyaW9kCQDMCAIJAKQDAQUJdXNlckluZGV4CQDMCAICBndlaWdodAkAzAgCCQCkAwEFBnBlcmlvZAUDbmlsBQNTRVABG2tleVJlZmVycmFsc0NvbnRyYWN0QWRkcmVzcwAJALkJAgkAzAgCAgQlcyVzCQDMCAICBmNvbmZpZwkAzAgCAhhyZWZlcnJhbHNDb250cmFjdEFkZHJlc3MFA25pbAUDU0VQAB5yZWZlcnJhbHNDb250cmFjdEFkZHJlc3NPckZhaWwJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQ9nZXRTdHJpbmdPckZhaWwBCQEba2V5UmVmZXJyYWxzQ29udHJhY3RBZGRyZXNzAAEMSGlzdG9yeUVudHJ5BAR0eXBlBHVzZXIGYW1vdW50AWkECmhpc3RvcnlLRVkJALkJAgkAzAgCAhElcyVzJXMlc19faGlzdG9yeQkAzAgCBQR0eXBlCQDMCAIFBHVzZXIJAMwIAgkA2AQBCAUBaQ10cmFuc2FjdGlvbklkBQNuaWwFA1NFUAQLaGlzdG9yeURBVEEJALkJAgkAzAgCAgwlZCVkJWQlZCVkJWQJAMwIAgkApAMBCAUJbGFzdEJsb2NrBmhlaWdodAkAzAgCCQCkAwEIBQlsYXN0QmxvY2sJdGltZXN0YW1wCQDMCAIJAKQDAQUGYW1vdW50BQNuaWwFA1NFUAkBC1N0cmluZ0VudHJ5AgUKaGlzdG9yeUtFWQULaGlzdG9yeURBVEEBE2tleU1hbmFnZXJQdWJsaWNLZXkAAhQlc19fbWFuYWdlclB1YmxpY0tleQEaa2V5UGVuZGluZ01hbmFnZXJQdWJsaWNLZXkAAhslc19fcGVuZGluZ01hbmFnZXJQdWJsaWNLZXkBFm1hbmFnZXJQdWJsaWNLZXlPclVuaXQABAckbWF0Y2gwCQCiCAEJARNrZXlNYW5hZ2VyUHVibGljS2V5AAMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXMFByRtYXRjaDAJANkEAQUBcwMJAAECBQckbWF0Y2gwAgRVbml0BQR1bml0CQACAQILTWF0Y2ggZXJyb3IBHXBlbmRpbmdNYW5hZ2VyUHVibGljS2V5T3JVbml0AAQHJG1hdGNoMAkAoggBCQEaa2V5UGVuZGluZ01hbmFnZXJQdWJsaWNLZXkAAwkAAQIFByRtYXRjaDACBlN0cmluZwQBcwUHJG1hdGNoMAkA2QQBBQFzAwkAAQIFByRtYXRjaDACBFVuaXQFBHVuaXQJAAIBAgtNYXRjaCBlcnJvcgELbXVzdE1hbmFnZXIBAWkEAnBkCQACAQIRUGVybWlzc2lvbiBkZW5pZWQEByRtYXRjaDAJARZtYW5hZ2VyUHVibGljS2V5T3JVbml0AAMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAJwawUHJG1hdGNoMAMJAAACCAUBaQ9jYWxsZXJQdWJsaWNLZXkFAnBrBgUCcGQDCQABAgUHJG1hdGNoMAIEVW5pdAMJAAACCAUBaQZjYWxsZXIFBHRoaXMGBQJwZAkAAgECC01hdGNoIGVycm9yAQ5jYWxjVXNlcldlaWdodAQXYm9vc3RpbmdDb250cmFjdEFkZHJlc3MPaGVpZ2h0Rm9yUGVyaW9kBnBlcmlvZAl1c2VySW5kZXgEBWtMYXN0CQEca2V5TGFzdFByb2Nlc3NlZFBlcmlvZE9mVXNlcgEFCXVzZXJJbmRleAQEa0tleQkBFmtleVVzZXJLVmFsdWVGb3JQZXJpb2QCBQZwZXJpb2QFCXVzZXJJbmRleAQEa1JhdwkAmggCBRdib29zdGluZ0NvbnRyYWN0QWRkcmVzcwUEa0tleQQLa1VzZXJXZWlnaHQJARZrZXlVc2VyV2VpZ2h0Rm9yUGVyaW9kAgUGcGVyaW9kBQl1c2VySW5kZXgDCQEJaXNEZWZpbmVkAQUEa1JhdwQBawkBBXZhbHVlAQUEa1JhdwQBYgkBBXZhbHVlAQkAmggCBRdib29zdGluZ0NvbnRyYWN0QWRkcmVzcwkBFmtleVVzZXJCVmFsdWVGb3JQZXJpb2QCBQZwZXJpb2QFCXVzZXJJbmRleAQBdwkAZAIJAGgCBQFrBQ9oZWlnaHRGb3JQZXJpb2QFAWIDCQBmAgUBdwAACQCUCgIJAGkCBQF3BQVTQ0FMRQkAzAgCCQEMSW50ZWdlckVudHJ5AgUFa0xhc3QFBnBlcmlvZAkAzAgCCQEMSW50ZWdlckVudHJ5AgULa1VzZXJXZWlnaHQFAXcFA25pbAkAlAoCAAAFA25pbAQBcAkAmggCBQR0aGlzBQVrTGFzdAMDCQEJaXNEZWZpbmVkAQUBcAkAZwIFBnBlcmlvZAkBBXZhbHVlAQUBcAcEAnB2CQEFdmFsdWUBBQFwBAFrCQEFdmFsdWUBCQCaCAIFF2Jvb3N0aW5nQ29udHJhY3RBZGRyZXNzCQEWa2V5VXNlcktWYWx1ZUZvclBlcmlvZAIFAnB2BQl1c2VySW5kZXgEAWIJAQV2YWx1ZQEJAJoIAgUXYm9vc3RpbmdDb250cmFjdEFkZHJlc3MJARZrZXlVc2VyQlZhbHVlRm9yUGVyaW9kAgUCcHYFCXVzZXJJbmRleAQBdwkAZAIJAGgCBQFrBQ9oZWlnaHRGb3JQZXJpb2QFAWIDCQBmAgUBdwAACQCUCgIJAGkCBQF3BQVTQ0FMRQkAzAgCCQEMSW50ZWdlckVudHJ5AgULa1VzZXJXZWlnaHQFAXcFA25pbAkAlAoCAAAFA25pbAkAlAoCAAAFA25pbAEWY2FsY1VzZXJXZWlnaHRGb3JDbGFpbQQXYm9vc3RpbmdDb250cmFjdEFkZHJlc3MPaGVpZ2h0Rm9yUGVyaW9kBnBlcmlvZAl1c2VySW5kZXgEC2tVc2VyV2VpZ2h0CQEWa2V5VXNlcldlaWdodEZvclBlcmlvZAIFBnBlcmlvZAUJdXNlckluZGV4BBB1c2VyV2VpZ2h0T3JVbml0CQCfCAEFC2tVc2VyV2VpZ2h0BAckbWF0Y2gwBRB1c2VyV2VpZ2h0T3JVbml0AwkAAQIFByRtYXRjaDACBFVuaXQAAAMJAAECBQckbWF0Y2gwAgNJbnQEAXcFByRtYXRjaDAJAGkCBQF3BQVTQ0FMRQkAAgECC01hdGNoIGVycm9yARVnZXRVc2VySW5kZXhCeUFkZHJlc3MCGmJvb3N0aW5nQ29udHJhY3RBZGRyZXNzU3RyC3VzZXJBZGRyZXNzBANrZXkJALkJAgkAzAgCAgYlcyVzJXMJAMwIAgIHbWFwcGluZwkAzAgCAgh1c2VyMm51bQkAzAgCBQt1c2VyQWRkcmVzcwUDbmlsBQNTRVAJAQ1wYXJzZUludFZhbHVlAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIJAQdBZGRyZXNzAQkA2QQBBRpib29zdGluZ0NvbnRyYWN0QWRkcmVzc1N0cgUDa2V5CQCsAgIJAKwCAgkArAICAg1Vc2VyIGFkZHJlc3MgBQt1c2VyQWRkcmVzcwItIGlzIG5vdCBmb3VuZCBpbiBib29zdGluZyBjb250cmFjdCBkYXRhLCBrZXk9BQNrZXkBCm5leHRQZXJpb2QACQEOZ2V0TnVtYmVyQnlLZXkBCQENa2V5TmV4dFBlcmlvZAABEWNvbW1vbkNsYWltUmV3YXJkAQt1c2VyQWRkcmVzcwQIY2ZnQXJyYXkJARVyZWFkQ29uZmlnQXJyYXlPckZhaWwABAd1c2VySWR4CQEVZ2V0VXNlckluZGV4QnlBZGRyZXNzAgkAkQMCBQhjZmdBcnJheQUWSWR4Q2ZnQm9vc3RpbmdDb250cmFjdAULdXNlckFkZHJlc3MEE3VzZXJVbmNsYWltZWRPcHRpb24JAJ8IAQkBEGtleVVzZXJVbmNsYWltZWQBBQd1c2VySWR4BAckbWF0Y2gwBRN1c2VyVW5jbGFpbWVkT3B0aW9uAwkAAQIFByRtYXRjaDACBFVuaXQJAJQKAgAABQNuaWwDCQABAgUHJG1hdGNoMAIDSW50BAF1BQckbWF0Y2gwCQCUCgIFAXUJAMwIAgkBDEludGVnZXJFbnRyeQIJARBrZXlVc2VyVW5jbGFpbWVkAQUHdXNlcklkeAAABQNuaWwJAAIBAgtNYXRjaCBlcnJvchMBaQEWdXBkYXRlUmVmZXJyYWxBY3Rpdml0eQILdXNlckFkZHJlc3MOZ1d4QW1vdW50U3RhcnQECHJlZmVycmVyCQCdCAIFHnJlZmVycmFsc0NvbnRyYWN0QWRkcmVzc09yRmFpbAkBC2tleVJlZmVycmVyAQULdXNlckFkZHJlc3MEEWFjdGl2ZVJlZmVycmFsSW52AwkAAAIFCHJlZmVycmVyBQR1bml0BQR1bml0CQD8BwQFHnJlZmVycmFsc0NvbnRyYWN0QWRkcmVzc09yRmFpbAIWdXBkYXRlUmVmZXJyYWxBY3Rpdml0eQkAzAgCBRNyZWZlcnJhbFByb2dyYW1OYW1lCQDMCAIFC3VzZXJBZGRyZXNzCQDMCAIJAGcCBQ5nV3hBbW91bnRTdGFydAUUcmVmZXJyYWxNaW5HV3hBbW91bnQFA25pbAUDbmlsAwkAAAIFEWFjdGl2ZVJlZmVycmFsSW52BRFhY3RpdmVSZWZlcnJhbEludgkAlAoCBQNuaWwFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEOZmluYWxpemVIZWxwZXIABA9wcm9jZXNzaW5nU3RhZ2UJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBEmtleVByb2Nlc3NpbmdTdGFnZQAFFHByb2Nlc3NpbmdTdGFnZVRvdGFsBA1jdXJyZW50UGVyaW9kCQEOZ2V0TnVtYmVyQnlLZXkBCQEWa2V5TmV4dFByb2Nlc3NlZFBlcmlvZAAEC2N1cnJlbnRVc2VyCQEOZ2V0TnVtYmVyQnlLZXkBCQEUa2V5TmV4dFByb2Nlc3NlZFVzZXIABAxsYXRlc3RQZXJpb2QJAQ5nZXROdW1iZXJCeUtleQEJAQ9rZXlMYXRlc3RQZXJpb2QABAp1c2Vyc0NvdW50CQELdmFsdWVPckVsc2UCCQCaCAIJARZib29zdGluZ0NvbnRyYWN0T3JGYWlsAAkBDWtleVVzZXJzQ291bnQAAAAEDnRvdGFsV2VpZ2h0S2V5CQEXa2V5VG90YWxXZWlnaHRGb3JQZXJpb2QBBQ1jdXJyZW50UGVyaW9kBAt0b3RhbFdlaWdodAkBDmdldE51bWJlckJ5S2V5AQkBF2tleVRvdGFsV2VpZ2h0Rm9yUGVyaW9kAQUNY3VycmVudFBlcmlvZAQPaGVpZ2h0Rm9yUGVyaW9kCQEOZ2V0TnVtYmVyQnlLZXkBCQESa2V5SGVpZ2h0Rm9yUGVyaW9kAQUNY3VycmVudFBlcmlvZAMJAGYCBQ1jdXJyZW50UGVyaW9kBQxsYXRlc3RQZXJpb2QJAJQKAgUDbmlsBwMJAAACBQ9wcm9jZXNzaW5nU3RhZ2UFFHByb2Nlc3NpbmdTdGFnZVRvdGFsBA0kdDAxMjA4NDEyMjAwCQEOY2FsY1VzZXJXZWlnaHQECQEWYm9vc3RpbmdDb250cmFjdE9yRmFpbAAFD2hlaWdodEZvclBlcmlvZAUNY3VycmVudFBlcmlvZAULY3VycmVudFVzZXIECnVzZXJXZWlnaHQIBQ0kdDAxMjA4NDEyMjAwAl8xBAt1c2VyQWN0aW9ucwgFDSR0MDEyMDg0MTIyMDACXzIEDnRvdGFsV2VpZ2h0TmV3CQBkAgULdG90YWxXZWlnaHQFCnVzZXJXZWlnaHQEEXByb2Nlc3NpbmdBY3Rpb25zAwkAZgIJAGUCBQp1c2Vyc0NvdW50AAEFC2N1cnJlbnRVc2VyCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEUa2V5TmV4dFByb2Nlc3NlZFVzZXIACQBkAgULY3VycmVudFVzZXIAAQUDbmlsCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQESa2V5UHJvY2Vzc2luZ1N0YWdlAAUVcHJvY2Vzc2luZ1N0YWdlU2hhcmVzCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEUa2V5TmV4dFByb2Nlc3NlZFVzZXIAAAAFA25pbAkAlAoCCQDOCAIJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgUOdG90YWxXZWlnaHRLZXkFDnRvdGFsV2VpZ2h0TmV3BQNuaWwFEXByb2Nlc3NpbmdBY3Rpb25zBQt1c2VyQWN0aW9ucwYDCQAAAgUPcHJvY2Vzc2luZ1N0YWdlBRVwcm9jZXNzaW5nU3RhZ2VTaGFyZXMECnVzZXJXZWlnaHQJARZjYWxjVXNlcldlaWdodEZvckNsYWltBAkBFmJvb3N0aW5nQ29udHJhY3RPckZhaWwABQ9oZWlnaHRGb3JQZXJpb2QFDWN1cnJlbnRQZXJpb2QFC2N1cnJlbnRVc2VyBBp1c2VyQW1vdW50TWF0Y2hlckZvclBlcmlvZAkAawMJAQ5nZXROdW1iZXJCeUtleQEJARdrZXlUb3RhbEFtb3VudEZvclBlcmlvZAEFDWN1cnJlbnRQZXJpb2QFCnVzZXJXZWlnaHQFC3RvdGFsV2VpZ2h0BBt1c2VyQW1vdW50RW1pc3Npb25Gb3JQZXJpb2QJAGsDCQEOZ2V0TnVtYmVyQnlLZXkBCQEda2V5QXV4RW1pc3Npb25SZXdhcmRGb3JQZXJpb2QBBQ1jdXJyZW50UGVyaW9kBQp1c2VyV2VpZ2h0BQt0b3RhbFdlaWdodAQPdXNlclRvdGFsQW1vdW50CQBkAgUbdXNlckFtb3VudEVtaXNzaW9uRm9yUGVyaW9kBRp1c2VyQW1vdW50TWF0Y2hlckZvclBlcmlvZAQTdXNlclVuY2xhaW1lZE9wdGlvbgkAnwgBCQEQa2V5VXNlclVuY2xhaW1lZAEFC2N1cnJlbnRVc2VyBAt1c2VyQWRkcmVzcwkBEUBleHRyTmF0aXZlKDEwNTMpAgkBFmJvb3N0aW5nQ29udHJhY3RPckZhaWwACQETa2V5TnVtVG9Vc2VyTWFwcGluZwEFC2N1cnJlbnRVc2VyBAhyZWZlcnJlcgkAnQgCBR5yZWZlcnJhbHNDb250cmFjdEFkZHJlc3NPckZhaWwJAQtrZXlSZWZlcnJlcgEFC3VzZXJBZGRyZXNzBBFhY3RpdmVSZWZlcnJhbEludgMJAAACBQhyZWZlcnJlcgUEdW5pdAUEdW5pdAkA/AcEBR5yZWZlcnJhbHNDb250cmFjdEFkZHJlc3NPckZhaWwCFnVwZGF0ZVJlZmVycmFsQWN0aXZpdHkJAMwIAgUTcmVmZXJyYWxQcm9ncmFtTmFtZQkAzAgCBQt1c2VyQWRkcmVzcwkAzAgCCQBnAgUKdXNlcldlaWdodAUUcmVmZXJyYWxNaW5HV3hBbW91bnQFA25pbAUDbmlsAwkAAAIFEWFjdGl2ZVJlZmVycmFsSW52BRFhY3RpdmVSZWZlcnJhbEludgQLcmVmZXJyYWxJbnYDAwkAAAIFCHJlZmVycmVyBQR1bml0BgkAZgIFFHJlZmVycmFsTWluR1d4QW1vdW50BQp1c2VyV2VpZ2h0BQR1bml0BA5yZWZlcnJlclJld2FyZAkAawMFD3VzZXJUb3RhbEFtb3VudAUWcmVmZXJyZXJSZXdhcmRQZXJtaWxsZQUFU0NBTEUEDnJlZmVycmFsUmV3YXJkCQBrAwUPdXNlclRvdGFsQW1vdW50BRZyZWZlcnJhbFJld2FyZFBlcm1pbGxlBQVTQ0FMRQkA/AcEBR5yZWZlcnJhbHNDb250cmFjdEFkZHJlc3NPckZhaWwCDGluY1VuY2xhaW1lZAkAzAgCBRNyZWZlcnJhbFByb2dyYW1OYW1lCQDMCAIFC3VzZXJBZGRyZXNzCQDMCAIFDnJlZmVycmVyUmV3YXJkCQDMCAIFDnJlZmVycmFsUmV3YXJkBQNuaWwFA25pbAMJAAACBQtyZWZlcnJhbEludgULcmVmZXJyYWxJbnYEEHVuY2xhaW1lZEFjdGlvbnMJAMwIAgkBDEludGVnZXJFbnRyeQIJARBrZXlVc2VyVW5jbGFpbWVkAQULY3VycmVudFVzZXIJAGQCCQELdmFsdWVPckVsc2UCBRN1c2VyVW5jbGFpbWVkT3B0aW9uAAAFD3VzZXJUb3RhbEFtb3VudAUDbmlsBBFwcm9jZXNzaW5nQWN0aW9ucwMJAGYCCQBlAgUKdXNlcnNDb3VudAABBQtjdXJyZW50VXNlcgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBFGtleU5leHRQcm9jZXNzZWRVc2VyAAkAZAIFC2N1cnJlbnRVc2VyAAEFA25pbAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBFmtleU5leHRQcm9jZXNzZWRQZXJpb2QACQBkAgUNY3VycmVudFBlcmlvZAABCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEUa2V5TmV4dFByb2Nlc3NlZFVzZXIAAAAJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBEmtleVByb2Nlc3NpbmdTdGFnZQAFA25pbAkAlAoCCQDOCAIFEHVuY2xhaW1lZEFjdGlvbnMFEXByb2Nlc3NpbmdBY3Rpb25zBgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECGGludmFsaWQgcHJvY2Vzc2luZyBzdGFnZQFpAQ9maW5hbGl6ZVdyYXBwZXIBB2NvdW50ZXIEBnJlc3VsdAoAAUAJAPwHBAUEdGhpcwIOZmluYWxpemVIZWxwZXIFA25pbAUDbmlsAwkAAQIFAUACB0Jvb2xlYW4FAUAJAAIBCQCsAgIJAAMBCQD8BwQFBHRoaXMCDmZpbmFsaXplSGVscGVyBQNuaWwFA25pbAIcIGNvdWxkbid0IGJlIGNhc3QgdG8gQm9vbGVhbgMJAAACBQZyZXN1bHQFBnJlc3VsdAMJAQEhAQUGcmVzdWx0AwkAAAIFB2NvdW50ZXIFCG1heERlcHRoCQACAQISTm90aGluZyB0byBwcm9jZXNzCQCUCgIFA25pbAUEdW5pdAMJAGYCBQdjb3VudGVyAAAJAJQKAgUDbmlsCQD8BwQFBHRoaXMCD2ZpbmFsaXplV3JhcHBlcgkAzAgCCQBlAgUHY291bnRlcgABBQNuaWwFA25pbAkAlAoCBQNuaWwFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEdcHJvY2Vzc1BlbmRpbmdQZXJpb2RzQW5kVXNlcnMACQCUCgIFA25pbAkA/AcEBQR0aGlzAg9maW5hbGl6ZVdyYXBwZXIJAMwIAgUIbWF4RGVwdGgFA25pbAUDbmlsAWkBB2RlcG9zaXQABAhjZmdBcnJheQkBFXJlYWRDb25maWdBcnJheU9yRmFpbAADCQECIT0CCAUBaQZjYWxsZXIJAQdBZGRyZXNzAQkA2QQBCQCRAwIFCGNmZ0FycmF5BRZJZHhDZmdQYWNlbWFrZXJBZGRyZXNzCQACAQIUV3JvbmcgY2FsbGVyIGFkZHJlc3MEB2Fzc2V0SWQJAQV2YWx1ZQEICQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAMJAQIhPQIFB2Fzc2V0SWQJANkEAQkAkQMCBQhjZmdBcnJheQUNSWR4Q2ZnQXNzZXRJZAkAAgECE1dyb25nIHBheW1lbnQgYXNzZXQEBnBlcmlvZAkBCm5leHRQZXJpb2QABAZkZWx0YUgJAGUCBQZoZWlnaHQJAQ9nZXROdW1iZXJPckZhaWwBCQEfa2V5R3d4UmV3YXJkRW1pc3Npb25TdGFydEhlaWdodAAEDGVtaXNzaW9uUmF0ZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFEGVtaXNzaW9uQ29udHJhY3QJARZrZXlSYXRlUGVyQmxvY2tDdXJyZW50AAkArAICCQCsAgICHG1hbmRhdG9yeSBlbWlzc2lvbl9jb250cmFjdC4JARZrZXlSYXRlUGVyQmxvY2tDdXJyZW50AAIPIGlzIG5vdCBkZWZpbmVkBAZ3ZWlnaHQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQ9mYWN0b3J5Q29udHJhY3QJARRrZXlQb29sV2VpZ2h0VmlydHVhbAAJAKwCAgkArAICAhttYW5kYXRvcnkgZmFjdG9yeV9jb250cmFjdC4JARRrZXlQb29sV2VpZ2h0VmlydHVhbAACDyBpcyBub3QgZGVmaW5lZAQJYXV4QW1vdW50CQBrAwkAaAIFBmRlbHRhSAUGd2VpZ2h0BQxlbWlzc2lvblJhdGUFBU1VTFQ4BAJlbQkA/AcEBRBlbWlzc2lvbkNvbnRyYWN0AgRlbWl0CQDMCAIFCWF1eEFtb3VudAUDbmlsBQNuaWwDCQAAAgUCZW0FAmVtBAttYXRjaGVyUGFydAgJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQECnBheW91dEluZm8JARBQZXJpb2RQYXlvdXRJbmZvAwUGcGVyaW9kBQttYXRjaGVyUGFydAUJYXV4QW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEPa2V5TGF0ZXN0UGVyaW9kAAUGcGVyaW9kCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQESa2V5SGVpZ2h0Rm9yUGVyaW9kAQUGcGVyaW9kBQZoZWlnaHQJAMwIAgkBDEludGVnZXJFbnRyeQIJAR1rZXlBdXhFbWlzc2lvblJld2FyZEZvclBlcmlvZAEFBnBlcmlvZAUJYXV4QW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEfa2V5R3d4UmV3YXJkRW1pc3Npb25TdGFydEhlaWdodAAFBmhlaWdodAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBF2tleVRvdGFsQW1vdW50Rm9yUGVyaW9kAQUGcGVyaW9kBQttYXRjaGVyUGFydAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBDWtleU5leHRQZXJpb2QACQBkAgUGcGVyaW9kAAEJAMwIAgkBC1N0cmluZ0VudHJ5AgkBEWtleUxhc3RQYXlvdXRJbmZvAAUKcGF5b3V0SW5mbwkAzAgCCQELU3RyaW5nRW50cnkCCQEUa2V5UGF5b3V0SGlzdG9yeUluZm8BBQZwZXJpb2QFCnBheW91dEluZm8FA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQtjbGFpbVJld2FyZAAECGNmZ0FycmF5CQEVcmVhZENvbmZpZ0FycmF5T3JGYWlsAAQHYWRkcmVzcwkApQgBCAUBaQZjYWxsZXIEDSR0MDE3NTQyMTc1OTIJARFjb21tb25DbGFpbVJld2FyZAEFB2FkZHJlc3MEBmFtb3VudAgFDSR0MDE3NTQyMTc1OTICXzEEB2FjdGlvbnMIBQ0kdDAxNzU0MjE3NTkyAl8yBAtjaGVja0Ftb3VudAMJAGYCBQZhbW91bnQAAAYJAAIBAhBOb3RoaW5nIHRvIGNsYWltAwkAAAIFC2NoZWNrQW1vdW50BQtjaGVja0Ftb3VudAQSYW1vdW50RnJvbUVtaXNzaW9uAAAED2NsYWltZWRSZWZlcnJhbAoAAUAJAPwHBAUecmVmZXJyYWxzQ29udHJhY3RBZGRyZXNzT3JGYWlsAgVjbGFpbQkAzAgCBRNyZWZlcnJhbFByb2dyYW1OYW1lBQNuaWwFA25pbAMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBCQD8BwQFHnJlZmVycmFsc0NvbnRyYWN0QWRkcmVzc09yRmFpbAIFY2xhaW0JAMwIAgUTcmVmZXJyYWxQcm9ncmFtTmFtZQUDbmlsBQNuaWwCGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAQLdG90YWxBbW91bnQJAGQCBQZhbW91bnQFD2NsYWltZWRSZWZlcnJhbAkAlAoCCQDOCAIJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQt0b3RhbEFtb3VudAkA2QQBCQCRAwIFCGNmZ0FycmF5BQ1JZHhDZmdBc3NldElkCQDMCAIJAQxIaXN0b3J5RW50cnkEAgVjbGFpbQUHYWRkcmVzcwUGYW1vdW50BQFpBQNuaWwFB2FjdGlvbnMJAMwIAgULdG90YWxBbW91bnQJAMwIAgUSYW1vdW50RnJvbUVtaXNzaW9uBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQETY2xhaW1SZXdhcmRSRUFET05MWQEHYWRkcmVzcwQNJHQwMTgxNjUxODIxNQkBEWNvbW1vbkNsYWltUmV3YXJkAQUHYWRkcmVzcwQGYW1vdW50CAUNJHQwMTgxNjUxODIxNQJfMQQHYWN0aW9ucwgFDSR0MDE4MTY1MTgyMTUCXzIEEXJlZmVycmFsVW5jbGFpbWVkCQELdmFsdWVPckVsc2UCCQCaCAIFHnJlZmVycmFsc0NvbnRyYWN0QWRkcmVzc09yRmFpbAkBFGtleVVuY2xhaW1lZFJlZmVycmFsAgUTcmVmZXJyYWxQcm9ncmFtTmFtZQUHYWRkcmVzcwAABAt0b3RhbEFtb3VudAkAZAIFBmFtb3VudAURcmVmZXJyYWxVbmNsYWltZWQJAJQKAgUDbmlsBQt0b3RhbEFtb3VudAFpAR1sYXRlc3RGaW5hbGl6ZWRQZXJpb2RSRUFET05MWQEHYWRkcmVzcwkAlAoCBQNuaWwJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBD2tleUxhdGVzdFBlcmlvZAAA////////////AQFpASFsYXRlc3RGaW5hbGl6ZWRQZXJpb2RJbmZvUkVBRE9OTFkBB2FkZHJlc3MJAJQKAgUDbmlsCQEOZ2V0U3RyaW5nQnlLZXkBCQERa2V5TGFzdFBheW91dEluZm8AAWkBFWNhbGNHd3hQYXJhbXNSRUFET05MWQMOZ3d4QW1vdW50U3RhcnQPbG9ja1N0YXJ0SGVpZ2h0EmxvY2tEdXJhdGlvbkJsb2NrcwQNbG9ja0VuZEhlaWdodAkAZAIFD2xvY2tTdGFydEhlaWdodAUSbG9ja0R1cmF0aW9uQmxvY2tzBAxzY2FsZThQYXJhbUsJAQEtAQkAawMFDmd3eEFtb3VudFN0YXJ0BQVTQ0FMRQUSbG9ja0R1cmF0aW9uQmxvY2tzBAxzY2FsZThQYXJhbUIJAGgCCQBrAwUOZ3d4QW1vdW50U3RhcnQFBVNDQUxFBRJsb2NrRHVyYXRpb25CbG9ja3MFDWxvY2tFbmRIZWlnaHQJAJQKAgUDbmlsCQDMCAIFDHNjYWxlOFBhcmFtSwkAzAgCBQxzY2FsZThQYXJhbUIJAMwIAgkBCm5leHRQZXJpb2QABQNuaWwBaQEaY2FsY0d3eEFtb3VudFN0YXJ0UkVBRE9OTFkDDHd4TG9ja0Ftb3VudAxsb2NrRHVyYXRpb24PbWF4TG9ja0R1cmF0aW9uBAdjb2VmZlg4CQBrAwUMbG9ja0R1cmF0aW9uBQVNVUxUOAUPbWF4TG9ja0R1cmF0aW9uBA5nV3hBbW91bnRTdGFydAkAawMFDHd4TG9ja0Ftb3VudAUHY29lZmZYOAUFTVVMVDgJAJQKAgUDbmlsCQDMCAIFDmdXeEFtb3VudFN0YXJ0BQNuaWwBaQEVb25FbWlzc2lvbkZvckd3eFN0YXJ0AAMJAQIhPQIIBQFpBmNhbGxlcgUPZmFjdG9yeUNvbnRyYWN0CQACAQIScGVybWlzc2lvbnMgZGVuaWVkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEfa2V5R3d4UmV3YXJkRW1pc3Npb25TdGFydEhlaWdodAAFBmhlaWdodAUDbmlsAWkBI2xhdGVzdFBlcmlvZEVtaXNzaW9uUmV3YXJkc1JFQURPTkxZAQdhZGRyZXNzBAZwZXJpb2QJAQpuZXh0UGVyaW9kAAkAlAoCBQNuaWwJAMwIAgkBDmdldE51bWJlckJ5S2V5AQkBHWtleUF1eEVtaXNzaW9uUmV3YXJkRm9yUGVyaW9kAQUGcGVyaW9kBQNuaWwBaQEFY2FsY0QFC3gxQmlnSW50U3RyC3gyQmlnSW50U3RyDGFtcEJpZ0ludFN0chNhUHJlY2lzaW9uQmlnSW50U3RyGHRhcmdldFByZWNpc2lvbkJpZ0ludFN0cgQGbkNvaW5zCQC2AgEAAgQKYVByZWNpc2lvbgkApwMBBRNhUHJlY2lzaW9uQmlnSW50U3RyBA90YXJnZXRQcmVjaXNpb24JAKcDAQUYdGFyZ2V0UHJlY2lzaW9uQmlnSW50U3RyBAJ4MQkApwMBBQt4MUJpZ0ludFN0cgQCeDIJAKcDAQULeDJCaWdJbnRTdHIEA2FtcAkAuQICCQCnAwEFDGFtcEJpZ0ludFN0cgUKYVByZWNpc2lvbgQBcwkAtwICBQJ4MQUCeDIDCQAAAgUBcwUKemVyb0JpZ0ludAkAlAoCBQNuaWwJAKYDAQUKemVyb0JpZ0ludAQDYW5uCQC5AgIFA2FtcAUGbkNvaW5zBANhcnIJAMwIAgABCQDMCAIAAgkAzAgCAAMJAMwIAgAECQDMCAIABQkAzAgCAAYJAMwIAgAHBQNuaWwKAQRjYWxjAgNhY2MDY3VyBA0kdDAyMDgzODIxMDI3BQNhY2MEAWQIBQ0kdDAyMDgzODIxMDI3Al8xBAVkUHJldggFDSR0MDIwODM4MjEwMjcCXzIEAmRwCQC6AgIJALkCAgkAuQICBQFkBQFkBQFkCQC5AgIJALkCAgkAuQICBQJ4MQUCeDIFBm5Db2lucwUGbkNvaW5zBAVkTmV4dAkAugICCQC5AgIJALcCAgkAugICCQC5AgIFA2FubgUBcwUKYVByZWNpc2lvbgkAuQICBQJkcAUGbkNvaW5zBQFkCQC3AgIJALoCAgkAuQICCQC4AgIFA2FubgUKYVByZWNpc2lvbgUBZAUKYVByZWNpc2lvbgkAuQICCQC3AgIFBm5Db2lucwkAtgIBAAEFAmRwCQCUCgIFBWROZXh0BQFkBA0kdDAyMTI0MDIxMjkwCgACJGwFA2FycgoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgUBcwUEdW5pdAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEEY2FsYwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgNwkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHBAVkTmV4dAgFDSR0MDIxMjQwMjEyOTACXzEEBWRQcmV2CAUNJHQwMjEyNDAyMTI5MAJfMgQFZERpZmYJAQlhYnNCaWdJbnQBCQC4AgIFBWROZXh0CQEFdmFsdWUBBQVkUHJldgMJAMACAgUPdGFyZ2V0UHJlY2lzaW9uBQVkRGlmZgkAlAoCBQNuaWwJAKYDAQUFZE5leHQJAAIBCQCsAgICHUQgY2FsY3VsYXRpb24gZXJyb3IsIGREaWZmID0gCQCmAwEFBWREaWZmAWkBDGNhbGNQdXRYT25seQgaYW1vdW50QXNzZXRBbW91bnRCaWdJbnRTdHIbYW1vdW50QXNzZXRCYWxhbmNlQmlnSW50U3RyGnByaWNlQXNzZXRCYWxhbmNlQmlnSW50U3RyCmRCaWdJbnRTdHIVYW1wbGlmaWNhdG9yQmlnSW50U3RyHmFtcGxpZmljYXRvclByZWNpc2lvbkJpZ0ludFN0chl0YXJnZXRYUHJlY2lzaW9uQmlnSW50U3RyGXRhcmdldERQcmVjaXNpb25CaWdJbnRTdHIEBm5Db2lucwkAtgIBAAIECmFQcmVjaXNpb24JAKcDAQUeYW1wbGlmaWNhdG9yUHJlY2lzaW9uQmlnSW50U3RyBA90YXJnZXRQcmVjaXNpb24JAKcDAQUZdGFyZ2V0WFByZWNpc2lvbkJpZ0ludFN0cgQBWAkApwMBBRthbW91bnRBc3NldEJhbGFuY2VCaWdJbnRTdHIEAVkJAKcDAQUacHJpY2VBc3NldEJhbGFuY2VCaWdJbnRTdHIEAWQDCQAAAgUKZEJpZ0ludFN0cgIACQCnAwEKAAFACQD8BwQFBHRoaXMCBWNhbGNECQDMCAIFG2Ftb3VudEFzc2V0QmFsYW5jZUJpZ0ludFN0cgkAzAgCBRpwcmljZUFzc2V0QmFsYW5jZUJpZ0ludFN0cgkAzAgCBRVhbXBsaWZpY2F0b3JCaWdJbnRTdHIJAMwIAgUeYW1wbGlmaWNhdG9yUHJlY2lzaW9uQmlnSW50U3RyCQDMCAIFGXRhcmdldERQcmVjaXNpb25CaWdJbnRTdHIFA25pbAUDbmlsAwkAAQIFAUACBlN0cmluZwUBQAkAAgEJAKwCAgkAAwEJAPwHBAUEdGhpcwIFY2FsY0QJAMwIAgUbYW1vdW50QXNzZXRCYWxhbmNlQmlnSW50U3RyCQDMCAIFGnByaWNlQXNzZXRCYWxhbmNlQmlnSW50U3RyCQDMCAIFFWFtcGxpZmljYXRvckJpZ0ludFN0cgkAzAgCBR5hbXBsaWZpY2F0b3JQcmVjaXNpb25CaWdJbnRTdHIJAMwIAgUZdGFyZ2V0RFByZWNpc2lvbkJpZ0ludFN0cgUDbmlsBQNuaWwCGyBjb3VsZG4ndCBiZSBjYXN0IHRvIFN0cmluZwkApwMBBQpkQmlnSW50U3RyBANhbXAJALkCAgkApwMBBRVhbXBsaWZpY2F0b3JCaWdJbnRTdHIFCmFQcmVjaXNpb24EAVMJAKcDAQUaYW1vdW50QXNzZXRBbW91bnRCaWdJbnRTdHIEA2FubgkAuQICBQNhbXAFBm5Db2lucwQDYXJyCQDMCAIAAQkAzAgCAAIJAMwIAgADCQDMCAIABAkAzAgCAAUJAMwIAgAGCQDMCAIABwkAzAgCAAgJAMwIAgAJCQDMCAIACgkAzAgCAAsJAMwIAgAMCQDMCAIADQkAzAgCAA4JAMwIAgAPCQDMCAIAEAkAzAgCABEJAMwIAgASCQDMCAIAEwkAzAgCABQFA25pbAoBBGNhbGMCA2FjYwNjdXIEDSR0MDIyODk4MjI5MTgFA2FjYwQBeAgFDSR0MDIyODk4MjI5MTgCXzEEBXhQcmV2CAUNJHQwMjI4OTgyMjkxOAJfMgQEbmV3WAkAuAICCQC3AgIFAVgFAVMFAXgEBG5ld1kJALgCAgUBWQkAugICCQC5AgIFAXgFAVkFAVgEAmRwCQC6AgIJALkCAgkAuQICBQFkBQFkBQFkCQC5AgIJALkCAgkAuQICBQRuZXdYBQRuZXdZBQZuQ29pbnMFBm5Db2lucwQFeE5leHQJALcCAgUBeAkAugICCQC4AgIJALcCAgkAtwICCQC6AgIJALkCAgkAvgIBBQFkBQNhbm4FCmFQcmVjaXNpb24FAWQJALoCAgkAuQICBQNhbm4JALcCAgUEbmV3WAUEbmV3WQUKYVByZWNpc2lvbgUCZHAJALcCAgkAtwICCQC6AgIJALkCAgkAvgIBBQNhbm4JALgCAgkAtgIBAP///////////wEJALoCAgUBWQUBWAUKYVByZWNpc2lvbgkAugICBQJkcAUEbmV3WAkAugICCQC5AgIFAVkFAmRwCQC5AgIFAVgFBG5ld1kJAJQKAgUFeE5leHQFAXgEDSR0MDIzMjIxMjMyODEKAAIkbAUDYXJyCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCBQp6ZXJvQmlnSW50BQR1bml0CgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQRjYWxjAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAyMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQEBXhOZXh0CAUNJHQwMjMyMjEyMzI4MQJfMQQFeFByZXYIBQ0kdDAyMzIyMTIzMjgxAl8yBAV4RGlmZgkBCWFic0JpZ0ludAEJALgCAgUFeE5leHQJAQV2YWx1ZQEFBXhQcmV2AwkAwAICBQ90YXJnZXRQcmVjaXNpb24FBXhEaWZmCQCUCgIFA25pbAkAlAoCCQCgAwEFBXhOZXh0CQCgAwEJALwCAwUFeE5leHQFAVkFAVgJAAIBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIdWCBjYWxjdWxhdGlvbiBlcnJvciwgeERpZmYgPSAJAKYDAQUFeERpZmYCCiwgeE5leHQgPSAJAKYDAQUFeE5leHQCCiwgeFByZXYgPSAJAKYDAQkBBXZhbHVlAQUFeFByZXYBaQEPY2FsY1N3YXBYVG9ZT2xkCBphbW91bnRBc3NldEFtb3VudEJpZ0ludFN0chthbW91bnRBc3NldEJhbGFuY2VCaWdJbnRTdHIacHJpY2VBc3NldEJhbGFuY2VCaWdJbnRTdHIKZEJpZ0ludFN0chVhbXBsaWZpY2F0b3JCaWdJbnRTdHIeYW1wbGlmaWNhdG9yUHJlY2lzaW9uQmlnSW50U3RyGXRhcmdldFhQcmVjaXNpb25CaWdJbnRTdHIZdGFyZ2V0RFByZWNpc2lvbkJpZ0ludFN0cgQGbkNvaW5zCQC2AgEAAgQKYVByZWNpc2lvbgkApwMBBR5hbXBsaWZpY2F0b3JQcmVjaXNpb25CaWdJbnRTdHIED3RhcmdldFByZWNpc2lvbgkApwMBBRl0YXJnZXRYUHJlY2lzaW9uQmlnSW50U3RyBAFYCQCnAwEFG2Ftb3VudEFzc2V0QmFsYW5jZUJpZ0ludFN0cgQBWQkApwMBBRpwcmljZUFzc2V0QmFsYW5jZUJpZ0ludFN0cgQBeAkApwMBBRphbW91bnRBc3NldEFtb3VudEJpZ0ludFN0cgQBZAMJAAACBQpkQmlnSW50U3RyAgAJAKcDAQoAAUAJAPwHBAUEdGhpcwIFY2FsY0QJAMwIAgUbYW1vdW50QXNzZXRCYWxhbmNlQmlnSW50U3RyCQDMCAIFGnByaWNlQXNzZXRCYWxhbmNlQmlnSW50U3RyCQDMCAIFFWFtcGxpZmljYXRvckJpZ0ludFN0cgkAzAgCBR5hbXBsaWZpY2F0b3JQcmVjaXNpb25CaWdJbnRTdHIJAMwIAgUZdGFyZ2V0RFByZWNpc2lvbkJpZ0ludFN0cgUDbmlsBQNuaWwDCQABAgUBQAIGU3RyaW5nBQFACQACAQkArAICCQADAQkA/AcEBQR0aGlzAgVjYWxjRAkAzAgCBRthbW91bnRBc3NldEJhbGFuY2VCaWdJbnRTdHIJAMwIAgUacHJpY2VBc3NldEJhbGFuY2VCaWdJbnRTdHIJAMwIAgUVYW1wbGlmaWNhdG9yQmlnSW50U3RyCQDMCAIFHmFtcGxpZmljYXRvclByZWNpc2lvbkJpZ0ludFN0cgkAzAgCBRl0YXJnZXREUHJlY2lzaW9uQmlnSW50U3RyBQNuaWwFA25pbAIbIGNvdWxkbid0IGJlIGNhc3QgdG8gU3RyaW5nCQCnAwEFCmRCaWdJbnRTdHIEA2FtcAkAuQICCQCnAwEFFWFtcGxpZmljYXRvckJpZ0ludFN0cgUKYVByZWNpc2lvbgQDYW5uCQC5AgIFA2FtcAUGbkNvaW5zBANhcnIJAMwIAgABCQDMCAIAAgkAzAgCAAMJAMwIAgAECQDMCAIABQkAzAgCAAYJAMwIAgAHCQDMCAIACAkAzAgCAAkJAMwIAgAKCQDMCAIACwkAzAgCAAwJAMwIAgANCQDMCAIADgkAzAgCAA8JAMwIAgAQCQDMCAIAEQUDbmlsCgEEY2FsYwIDYWNjA2N1cgQNJHQwMjQ5MzAyNDk1MAUDYWNjBAF5CAUNJHQwMjQ5MzAyNDk1MAJfMQQFeVByZXYIBQ0kdDAyNDkzMDI0OTUwAl8yBARuZXdYCQC3AgIFAVgFAXgEBG5ld1kJALgCAgUBWQUBeQQCZHAJALoCAgkAuQICCQC5AgIFAWQFAWQFAWQJALkCAgkAuQICCQC5AgIFBG5ld1gFBG5ld1kFBm5Db2lucwUGbkNvaW5zBAV5TmV4dAkAtwICBQF5CQC6AgIJALgCAgkAtwICCQC3AgIJALoCAgkAuQICCQC+AgEFAWQFA2FubgUKYVByZWNpc2lvbgUBZAkAugICCQC5AgIFA2FubgkAtwICBQRuZXdYBQRuZXdZBQphUHJlY2lzaW9uBQJkcAkAtwICCQC6AgIFA2FubgUKYVByZWNpc2lvbgkAugICBQJkcAUEbmV3WQkAlAoCBQV5TmV4dAUBeQQNJHQwMjUxOTIyNTI0MwoAAiRsBQNhcnIKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIFAWQFBHVuaXQKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBBGNhbGMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDE3CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQQFeU5leHQIBQ0kdDAyNTE5MjI1MjQzAl8xBAV5UHJldggFDSR0MDI1MTkyMjUyNDMCXzIEBXlEaWZmCQEJYWJzQmlnSW50AQkAuAICBQV5TmV4dAkBBXZhbHVlAQUFeVByZXYDCQDAAgIFD3RhcmdldFByZWNpc2lvbgUFeURpZmYJAJQKAgUDbmlsCQCgAwEFBXlOZXh0CQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgICHVkgY2FsY3VsYXRpb24gZXJyb3IsIHlEaWZmID0gCQCmAwEFBXlEaWZmAgosIHlOZXh0ID0gCQCmAwEFBXlOZXh0AgosIHlQcmV2ID0gCQCmAwEJAQV2YWx1ZQEFBXlQcmV2AWkBDGNhbGNTd2FwWFRvWQgaYW1vdW50QXNzZXRBbW91bnRCaWdJbnRTdHIbYW1vdW50QXNzZXRCYWxhbmNlQmlnSW50U3RyGnByaWNlQXNzZXRCYWxhbmNlQmlnSW50U3RyCmRCaWdJbnRTdHIVYW1wbGlmaWNhdG9yQmlnSW50U3RyHmFtcGxpZmljYXRvclByZWNpc2lvbkJpZ0ludFN0chl0YXJnZXRYUHJlY2lzaW9uQmlnSW50U3RyGXRhcmdldERQcmVjaXNpb25CaWdJbnRTdHIEBm5Db2lucwkAtgIBAAIECmFQcmVjaXNpb24JAKcDAQUeYW1wbGlmaWNhdG9yUHJlY2lzaW9uQmlnSW50U3RyBA90YXJnZXRQcmVjaXNpb24JAKcDAQUZdGFyZ2V0WFByZWNpc2lvbkJpZ0ludFN0cgQEb2xkWAkApwMBBRthbW91bnRBc3NldEJhbGFuY2VCaWdJbnRTdHIEAVkJAKcDAQUacHJpY2VBc3NldEJhbGFuY2VCaWdJbnRTdHIEAXgJAKcDAQUaYW1vdW50QXNzZXRBbW91bnRCaWdJbnRTdHIEAVgJALcCAgUEb2xkWAUBeAQBRAMJAAACBQpkQmlnSW50U3RyAgAJAKcDAQoAAUAJAPwHBAUEdGhpcwIFY2FsY0QJAMwIAgUbYW1vdW50QXNzZXRCYWxhbmNlQmlnSW50U3RyCQDMCAIFGnByaWNlQXNzZXRCYWxhbmNlQmlnSW50U3RyCQDMCAIFFWFtcGxpZmljYXRvckJpZ0ludFN0cgkAzAgCBR5hbXBsaWZpY2F0b3JQcmVjaXNpb25CaWdJbnRTdHIJAMwIAgUZdGFyZ2V0RFByZWNpc2lvbkJpZ0ludFN0cgUDbmlsBQNuaWwDCQABAgUBQAIGU3RyaW5nBQFACQACAQkArAICCQADAQkA/AcEBQR0aGlzAgVjYWxjRAkAzAgCBRthbW91bnRBc3NldEJhbGFuY2VCaWdJbnRTdHIJAMwIAgUacHJpY2VBc3NldEJhbGFuY2VCaWdJbnRTdHIJAMwIAgUVYW1wbGlmaWNhdG9yQmlnSW50U3RyCQDMCAIFHmFtcGxpZmljYXRvclByZWNpc2lvbkJpZ0ludFN0cgkAzAgCBRl0YXJnZXREUHJlY2lzaW9uQmlnSW50U3RyBQNuaWwFA25pbAIbIGNvdWxkbid0IGJlIGNhc3QgdG8gU3RyaW5nCQCnAwEFCmRCaWdJbnRTdHIEA2FtcAkAuQICCQCnAwEFFWFtcGxpZmljYXRvckJpZ0ludFN0cgUKYVByZWNpc2lvbgQBUwkAtwICBQFYBQFZBANhbm4JALkCAgUDYW1wBQZuQ29pbnMEAWMJALoCAgkAuQICCQC5AgIJALoCAgkAuQICCQC6AgIJALkCAgUBRAUBRAkAuQICBQFYBQZuQ29pbnMFAUQJALkCAgUBWQUGbkNvaW5zBQFEBQphUHJlY2lzaW9uCQC5AgIFA2FubgUGbkNvaW5zBAFiCQC3AgIFAVMJALoCAgkAuQICBQFEBQphUHJlY2lzaW9uBQNhbm4EA2FycgkAzAgCAAEJAMwIAgACCQDMCAIAAwkAzAgCAAQJAMwIAgAFCQDMCAIABgkAzAgCAAcJAMwIAgAICQDMCAIACQkAzAgCAAoJAMwIAgALCQDMCAIADAkAzAgCAA0JAMwIAgAOCQDMCAIADwUDbmlsCgEEY2FsYwIDYWNjA2N1cgQNJHQwMjY4NDcyNjg2NwUDYWNjBAF5CAUNJHQwMjY4NDcyNjg2NwJfMQQFeVByZXYIBQ0kdDAyNjg0NzI2ODY3Al8yBAV5TmV4dAkAugICCQC3AgIJALkCAgUBeQUBeQUBYwkAuAICCQC3AgIJALkCAgkAtgIBAAIFAXkFAWIFAUQJAJQKAgUFeU5leHQFAXkEDSR0MDI2OTQ2MjY5OTcKAAIkbAUDYXJyCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCBQFEBQR1bml0CgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQRjYWxjAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxNQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwQFeU5leHQIBQ0kdDAyNjk0NjI2OTk3Al8xBAV5UHJldggFDSR0MDI2OTQ2MjY5OTcCXzIEBXlEaWZmCQEJYWJzQmlnSW50AQkAuAICBQV5TmV4dAkBBXZhbHVlAQUFeVByZXYDCQDAAgIFD3RhcmdldFByZWNpc2lvbgUFeURpZmYJAJQKAgUDbmlsCQCgAwEJALgCAgUBWQUFeU5leHQJAAIBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIdWSBjYWxjdWxhdGlvbiBlcnJvciwgeURpZmYgPSAJAKYDAQUFeURpZmYCCiwgeU5leHQgPSAJAKYDAQUFeU5leHQCCiwgeVByZXYgPSAJAKYDAQkBBXZhbHVlAQUFeVByZXYBaQEKc2V0TWFuYWdlcgEXcGVuZGluZ01hbmFnZXJQdWJsaWNLZXkEC2NoZWNrQ2FsbGVyCQELbXVzdE1hbmFnZXIBBQFpAwkAAAIFC2NoZWNrQ2FsbGVyBQtjaGVja0NhbGxlcgQVY2hlY2tNYW5hZ2VyUHVibGljS2V5CQDZBAEFF3BlbmRpbmdNYW5hZ2VyUHVibGljS2V5AwkAAAIFFWNoZWNrTWFuYWdlclB1YmxpY0tleQUVY2hlY2tNYW5hZ2VyUHVibGljS2V5CQDMCAIJAQtTdHJpbmdFbnRyeQIJARprZXlQZW5kaW5nTWFuYWdlclB1YmxpY0tleQAFF3BlbmRpbmdNYW5hZ2VyUHVibGljS2V5BQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEOY29uZmlybU1hbmFnZXIABAJwbQkBHXBlbmRpbmdNYW5hZ2VyUHVibGljS2V5T3JVbml0AAQFaGFzUE0DCQEJaXNEZWZpbmVkAQUCcG0GCQACAQISTm8gcGVuZGluZyBtYW5hZ2VyAwkAAAIFBWhhc1BNBQVoYXNQTQQHY2hlY2tQTQMJAAACCAUBaQ9jYWxsZXJQdWJsaWNLZXkJAQV2YWx1ZQEFAnBtBgkAAgECG1lvdSBhcmUgbm90IHBlbmRpbmcgbWFuYWdlcgMJAAACBQdjaGVja1BNBQdjaGVja1BNCQDMCAIJAQtTdHJpbmdFbnRyeQIJARNrZXlNYW5hZ2VyUHVibGljS2V5AAkA2AQBCQEFdmFsdWUBBQJwbQkAzAgCCQELRGVsZXRlRW50cnkBCQEaa2V5UGVuZGluZ01hbmFnZXJQdWJsaWNLZXkABQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BAnR4AQZ2ZXJpZnkABA90YXJnZXRQdWJsaWNLZXkEByRtYXRjaDAJARZtYW5hZ2VyUHVibGljS2V5T3JVbml0AAMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAJwawUHJG1hdGNoMAUCcGsDCQABAgUHJG1hdGNoMAIEVW5pdAgFAnR4D3NlbmRlclB1YmxpY0tleQkAAgECC01hdGNoIGVycm9yCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABQ90YXJnZXRQdWJsaWNLZXlqQ025", "chainId": 84, "height": 2250478, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: HRPoYEjdq6LiXEyrvEp2sgPUprFiT1kt3iB1sHXv3YUG Next: 3fK9eZQ4QSBVfddqJawpkLRmRfNTCsLoGoW6xBy8SMDE Diff:
OldNewDifferences
693693 let amp = (parseBigIntValue(amplificatorBigIntStr) * aPrecision)
694694 let S = (X + Y)
695695 let ann = (amp * nCoins)
696- let c = fraction((((D * D) * D) * D), aPrecision, (((((X * Y) * nCoins) * nCoins) * nCoins) * ann))
696+ let c = (((((((D * D) / (X * nCoins)) * D) / (Y * nCoins)) * D) * aPrecision) / (ann * nCoins))
697697 let b = (S + ((D * aPrecision) / ann))
698698 let arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
699699 func calc (acc,cur) = {
700- let $t02684926869 = acc
701- let y = $t02684926869._1
702- let yPrev = $t02684926869._2
700+ let $t02684726867 = acc
701+ let y = $t02684726867._1
702+ let yPrev = $t02684726867._2
703703 let yNext = (((y * y) + c) / (((toBigInt(2) * y) + b) - D))
704704 $Tuple2(yNext, y)
705705 }
706706
707- let $t02694826999 = {
707+ let $t02694626997 = {
708708 let $l = arr
709709 let $s = size($l)
710710 let $acc0 = $Tuple2(D, unit)
718718
719719 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
720720 }
721- let yNext = $t02694826999._1
722- let yPrev = $t02694826999._2
721+ let yNext = $t02694626997._1
722+ let yPrev = $t02694626997._2
723723 let yDiff = absBigInt((yNext - value(yPrev)))
724724 if ((targetPrecision >= yDiff))
725725 then $Tuple2(nil, toInt((Y - yNext)))
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let SEP = "__"
55
66 let SCALE = 1000
77
88 let MULT8 = 100000000
99
1010 let zeroBigInt = toBigInt(0)
1111
1212 let processingStageTotal = 0
1313
1414 let processingStageShares = 1
1515
1616 func getNumberByKey (key) = valueOrElse(getInteger(this, key), 0)
1717
1818
1919 func getNumberOrFail (key) = valueOrErrorMessage(getInteger(this, key), (("mandatory this." + key) + " is not defined"))
2020
2121
2222 func getStringByKey (key) = valueOrElse(getString(this, key), "")
2323
2424
2525 func getStringOrFail (key) = valueOrErrorMessage(getString(this, key), (("mandatory this." + key) + " is not defined"))
2626
2727
2828 func abs (val) = if ((0 > val))
2929 then -(val)
3030 else val
3131
3232
3333 func absBigInt (val) = if ((zeroBigInt > val))
3434 then -(val)
3535 else val
3636
3737
3838 let keyMaxDepth = "%s__maxDepth"
3939
4040 let maxDepthDefault = 30
4141
4242 let maxDepth = valueOrElse(getInteger(this, keyMaxDepth), maxDepthDefault)
4343
4444 func keyFactoryAddress () = "%s%s__config__factoryAddress"
4545
4646
4747 let factoryAddressStr = getStringOrFail(keyFactoryAddress())
4848
4949 let factoryContract = addressFromStringValue(factoryAddressStr)
5050
5151 func keyEmissionAddress () = "%s%s__config__emissionAddress"
5252
5353
5454 func keyNumToUserMapping (num) = makeString(["%s%s%s", "mapping", "num2user", toString(num)], SEP)
5555
5656
5757 let keyReferralProgramName = makeString(["%s%s", "referral", "programName"], SEP)
5858
5959 let referralProgramNameDefault = "wxlock"
6060
6161 let referralProgramName = valueOrElse(getString(this, keyReferralProgramName), referralProgramNameDefault)
6262
6363 let keyReferralMinGWxAmount = makeString(["%s%s", "referral", "minGWxAmount"], SEP)
6464
6565 let referralMinGWxAmountDefault = (500 * MULT8)
6666
6767 let referralMinGWxAmount = valueOrElse(getInteger(this, keyReferralMinGWxAmount), referralMinGWxAmountDefault)
6868
6969 let keyReferrerRewardPermille = makeString(["%s%s", "referral", "referrerRewardPermille"], SEP)
7070
7171 let referrerRewardPermilleDefault = 50
7272
7373 let referrerRewardPermille = valueOrElse(getInteger(this, keyReferrerRewardPermille), referrerRewardPermilleDefault)
7474
7575 let keyReferralRewardPermille = makeString(["%s%s", "referral", "referralRewardPermille"], SEP)
7676
7777 let referralRewardPermilleDefault = 50
7878
7979 let referralRewardPermille = valueOrElse(getInteger(this, keyReferralRewardPermille), referralRewardPermilleDefault)
8080
8181 func keyReferrer (referralAddress) = makeString(["%s%s%s", "referrer", referralProgramName, referralAddress], SEP)
8282
8383
8484 func keyUnclaimedReferral (programName,claimerAddress) = makeString(["%s%s%s%s", "unclaimedReferral", programName, claimerAddress], SEP)
8585
8686
8787 let emissionAddressStr = getStringOrFail(keyEmissionAddress())
8888
8989 let emissionContract = addressFromStringValue(emissionAddressStr)
9090
9191 let IdxCfgAssetId = 1
9292
9393 let IdxCfgPacemakerAddress = 2
9494
9595 let IdxCfgBoostingContract = 3
9696
9797 let IdxCfgMaxDepth = 4
9898
9999 func keyConfig () = "%s__config"
100100
101101
102102 func readConfigArrayOrFail () = split(getStringOrFail(keyConfig()), SEP)
103103
104104
105105 func formatConfig (wxAssetIdStr,matcherPacemakerAddressStr,boostingContractAddressStr,maxDepth) = makeString(["%s%s%s%d", wxAssetIdStr, matcherPacemakerAddressStr, boostingContractAddressStr, toString(maxDepth)], SEP)
106106
107107
108108 func boostingContractOrFail () = {
109109 let cfgArray = readConfigArrayOrFail()
110110 valueOrErrorMessage(addressFromString(cfgArray[IdxCfgBoostingContract]), "boosting contract address is not defined")
111111 }
112112
113113
114114 func keyGwxRewardEmissionStartHeight () = "%s%s__gwxRewardEmissionPart__startHeight"
115115
116116
117117 func keyUsersCount () = "%s__nextUserNum"
118118
119119
120120 func keyRatePerBlockCurrent () = "%s%s__ratePerBlock__current"
121121
122122
123123 func keyPoolWeightVirtual () = "%s%s__poolWeight__GWXvirtualPOOL"
124124
125125
126126 func keyNextProcessedUser () = "%s__nextProcessedUser"
127127
128128
129129 func keyLatestPeriod () = "%s__latestPeriod"
130130
131131
132132 func keyNextPeriod () = "%s__nextPeriod"
133133
134134
135135 func keyProcessingStage () = "%s__processingStage"
136136
137137
138138 func keyNextProcessedPeriod () = "%s__nextProcessedPeriod"
139139
140140
141141 func keyUserUnclaimed (userIndex) = makeString(["%s%d", "userUnclaimed", toString(userIndex)], SEP)
142142
143143
144144 func keyNextUnlaimedPeriodOfUser (userIndex) = makeString(["%s%d__nextClaimedPeriod", toString(userIndex)], SEP)
145145
146146
147147 func keyLastProcessedPeriodOfUser (userIndex) = makeString(["%s%d__lastProcessedPeriod", toString(userIndex)], SEP)
148148
149149
150150 func keyHeightForPeriod (period) = makeString(["%s%d__startHeightForPeriod", toString(period)], SEP)
151151
152152
153153 func keyAuxEmissionRewardForPeriod (period) = makeString(["%s%d__auxEmissionReward", toString(period)], SEP)
154154
155155
156156 func keyTotalAmountForPeriod (period) = makeString(["%s%d__totalAmountForPeriod", toString(period)], SEP)
157157
158158
159159 func keyLastPayoutInfo () = "%s__lastPayoutInfo"
160160
161161
162162 func PeriodPayoutInfo (period,matcherReward,emissionReward) = makeString(["%d%d%d", toString(period), toString(matcherReward), toString(emissionReward)], SEP)
163163
164164
165165 func keyPayoutHistoryInfo (period) = makeString(["%s%s%d__payouts__history", toString(period)], SEP)
166166
167167
168168 func keyTotalWeightForPeriod (period) = makeString(["%s%d__totalWeightForPeriod", toString(period)], SEP)
169169
170170
171171 func keyUserKValueForPeriod (period,userIndex) = makeString(["%s%d%s%d__paramByPeriod", toString(userIndex), "k", toString(period)], SEP)
172172
173173
174174 func keyUserBValueForPeriod (period,userIndex) = makeString(["%s%d%s%d__paramByPeriod", toString(userIndex), "b", toString(period)], SEP)
175175
176176
177177 func keyUserWeightForPeriod (period,userIndex) = makeString(["%s%d%s%d__paramByPeriod", toString(userIndex), "weight", toString(period)], SEP)
178178
179179
180180 func keyReferralsContractAddress () = makeString(["%s%s", "config", "referralsContractAddress"], SEP)
181181
182182
183183 let referralsContractAddressOrFail = addressFromStringValue(getStringOrFail(keyReferralsContractAddress()))
184184
185185 func HistoryEntry (type,user,amount,i) = {
186186 let historyKEY = makeString(["%s%s%s%s__history", type, user, toBase58String(i.transactionId)], SEP)
187187 let historyDATA = makeString(["%d%d%d%d%d%d", toString(lastBlock.height), toString(lastBlock.timestamp), toString(amount)], SEP)
188188 StringEntry(historyKEY, historyDATA)
189189 }
190190
191191
192192 func keyManagerPublicKey () = "%s__managerPublicKey"
193193
194194
195195 func keyPendingManagerPublicKey () = "%s__pendingManagerPublicKey"
196196
197197
198198 func managerPublicKeyOrUnit () = match getString(keyManagerPublicKey()) {
199199 case s: String =>
200200 fromBase58String(s)
201201 case _: Unit =>
202202 unit
203203 case _ =>
204204 throw("Match error")
205205 }
206206
207207
208208 func pendingManagerPublicKeyOrUnit () = match getString(keyPendingManagerPublicKey()) {
209209 case s: String =>
210210 fromBase58String(s)
211211 case _: Unit =>
212212 unit
213213 case _ =>
214214 throw("Match error")
215215 }
216216
217217
218218 func mustManager (i) = {
219219 let pd = throw("Permission denied")
220220 match managerPublicKeyOrUnit() {
221221 case pk: ByteVector =>
222222 if ((i.callerPublicKey == pk))
223223 then true
224224 else pd
225225 case _: Unit =>
226226 if ((i.caller == this))
227227 then true
228228 else pd
229229 case _ =>
230230 throw("Match error")
231231 }
232232 }
233233
234234
235235 func calcUserWeight (boostingContractAddress,heightForPeriod,period,userIndex) = {
236236 let kLast = keyLastProcessedPeriodOfUser(userIndex)
237237 let kKey = keyUserKValueForPeriod(period, userIndex)
238238 let kRaw = getInteger(boostingContractAddress, kKey)
239239 let kUserWeight = keyUserWeightForPeriod(period, userIndex)
240240 if (isDefined(kRaw))
241241 then {
242242 let k = value(kRaw)
243243 let b = value(getInteger(boostingContractAddress, keyUserBValueForPeriod(period, userIndex)))
244244 let w = ((k * heightForPeriod) + b)
245245 if ((w > 0))
246246 then $Tuple2((w / SCALE), [IntegerEntry(kLast, period), IntegerEntry(kUserWeight, w)])
247247 else $Tuple2(0, nil)
248248 }
249249 else {
250250 let p = getInteger(this, kLast)
251251 if (if (isDefined(p))
252252 then (period >= value(p))
253253 else false)
254254 then {
255255 let pv = value(p)
256256 let k = value(getInteger(boostingContractAddress, keyUserKValueForPeriod(pv, userIndex)))
257257 let b = value(getInteger(boostingContractAddress, keyUserBValueForPeriod(pv, userIndex)))
258258 let w = ((k * heightForPeriod) + b)
259259 if ((w > 0))
260260 then $Tuple2((w / SCALE), [IntegerEntry(kUserWeight, w)])
261261 else $Tuple2(0, nil)
262262 }
263263 else $Tuple2(0, nil)
264264 }
265265 }
266266
267267
268268 func calcUserWeightForClaim (boostingContractAddress,heightForPeriod,period,userIndex) = {
269269 let kUserWeight = keyUserWeightForPeriod(period, userIndex)
270270 let userWeightOrUnit = getInteger(kUserWeight)
271271 match userWeightOrUnit {
272272 case _: Unit =>
273273 0
274274 case w: Int =>
275275 (w / SCALE)
276276 case _ =>
277277 throw("Match error")
278278 }
279279 }
280280
281281
282282 func getUserIndexByAddress (boostingContractAddressStr,userAddress) = {
283283 let key = makeString(["%s%s%s", "mapping", "user2num", userAddress], SEP)
284284 parseIntValue(valueOrErrorMessage(getString(Address(fromBase58String(boostingContractAddressStr)), key), ((("User address " + userAddress) + " is not found in boosting contract data, key=") + key)))
285285 }
286286
287287
288288 func nextPeriod () = getNumberByKey(keyNextPeriod())
289289
290290
291291 func commonClaimReward (userAddress) = {
292292 let cfgArray = readConfigArrayOrFail()
293293 let userIdx = getUserIndexByAddress(cfgArray[IdxCfgBoostingContract], userAddress)
294294 let userUnclaimedOption = getInteger(keyUserUnclaimed(userIdx))
295295 match userUnclaimedOption {
296296 case _: Unit =>
297297 $Tuple2(0, nil)
298298 case u: Int =>
299299 $Tuple2(u, [IntegerEntry(keyUserUnclaimed(userIdx), 0)])
300300 case _ =>
301301 throw("Match error")
302302 }
303303 }
304304
305305
306306 @Callable(i)
307307 func updateReferralActivity (userAddress,gWxAmountStart) = {
308308 let referrer = getString(referralsContractAddressOrFail, keyReferrer(userAddress))
309309 let activeReferralInv = if ((referrer == unit))
310310 then unit
311311 else invoke(referralsContractAddressOrFail, "updateReferralActivity", [referralProgramName, userAddress, (gWxAmountStart >= referralMinGWxAmount)], nil)
312312 if ((activeReferralInv == activeReferralInv))
313313 then $Tuple2(nil, unit)
314314 else throw("Strict value is not equal to itself.")
315315 }
316316
317317
318318
319319 @Callable(i)
320320 func finalizeHelper () = {
321321 let processingStage = valueOrElse(getInteger(keyProcessingStage()), processingStageTotal)
322322 let currentPeriod = getNumberByKey(keyNextProcessedPeriod())
323323 let currentUser = getNumberByKey(keyNextProcessedUser())
324324 let latestPeriod = getNumberByKey(keyLatestPeriod())
325325 let usersCount = valueOrElse(getInteger(boostingContractOrFail(), keyUsersCount()), 0)
326326 let totalWeightKey = keyTotalWeightForPeriod(currentPeriod)
327327 let totalWeight = getNumberByKey(keyTotalWeightForPeriod(currentPeriod))
328328 let heightForPeriod = getNumberByKey(keyHeightForPeriod(currentPeriod))
329329 if ((currentPeriod > latestPeriod))
330330 then $Tuple2(nil, false)
331331 else if ((processingStage == processingStageTotal))
332332 then {
333333 let $t01208412200 = calcUserWeight(boostingContractOrFail(), heightForPeriod, currentPeriod, currentUser)
334334 let userWeight = $t01208412200._1
335335 let userActions = $t01208412200._2
336336 let totalWeightNew = (totalWeight + userWeight)
337337 let processingActions = if (((usersCount - 1) > currentUser))
338338 then [IntegerEntry(keyNextProcessedUser(), (currentUser + 1))]
339339 else [IntegerEntry(keyProcessingStage(), processingStageShares), IntegerEntry(keyNextProcessedUser(), 0)]
340340 $Tuple2((([IntegerEntry(totalWeightKey, totalWeightNew)] ++ processingActions) ++ userActions), true)
341341 }
342342 else if ((processingStage == processingStageShares))
343343 then {
344344 let userWeight = calcUserWeightForClaim(boostingContractOrFail(), heightForPeriod, currentPeriod, currentUser)
345345 let userAmountMatcherForPeriod = fraction(getNumberByKey(keyTotalAmountForPeriod(currentPeriod)), userWeight, totalWeight)
346346 let userAmountEmissionForPeriod = fraction(getNumberByKey(keyAuxEmissionRewardForPeriod(currentPeriod)), userWeight, totalWeight)
347347 let userTotalAmount = (userAmountEmissionForPeriod + userAmountMatcherForPeriod)
348348 let userUnclaimedOption = getInteger(keyUserUnclaimed(currentUser))
349349 let userAddress = getStringValue(boostingContractOrFail(), keyNumToUserMapping(currentUser))
350350 let referrer = getString(referralsContractAddressOrFail, keyReferrer(userAddress))
351351 let activeReferralInv = if ((referrer == unit))
352352 then unit
353353 else invoke(referralsContractAddressOrFail, "updateReferralActivity", [referralProgramName, userAddress, (userWeight >= referralMinGWxAmount)], nil)
354354 if ((activeReferralInv == activeReferralInv))
355355 then {
356356 let referralInv = if (if ((referrer == unit))
357357 then true
358358 else (referralMinGWxAmount > userWeight))
359359 then unit
360360 else {
361361 let referrerReward = fraction(userTotalAmount, referrerRewardPermille, SCALE)
362362 let referralReward = fraction(userTotalAmount, referralRewardPermille, SCALE)
363363 invoke(referralsContractAddressOrFail, "incUnclaimed", [referralProgramName, userAddress, referrerReward, referralReward], nil)
364364 }
365365 if ((referralInv == referralInv))
366366 then {
367367 let unclaimedActions = [IntegerEntry(keyUserUnclaimed(currentUser), (valueOrElse(userUnclaimedOption, 0) + userTotalAmount))]
368368 let processingActions = if (((usersCount - 1) > currentUser))
369369 then [IntegerEntry(keyNextProcessedUser(), (currentUser + 1))]
370370 else [IntegerEntry(keyNextProcessedPeriod(), (currentPeriod + 1)), IntegerEntry(keyNextProcessedUser(), 0), DeleteEntry(keyProcessingStage())]
371371 $Tuple2((unclaimedActions ++ processingActions), true)
372372 }
373373 else throw("Strict value is not equal to itself.")
374374 }
375375 else throw("Strict value is not equal to itself.")
376376 }
377377 else throw("invalid processing stage")
378378 }
379379
380380
381381
382382 @Callable(i)
383383 func finalizeWrapper (counter) = {
384384 let result = {
385385 let @ = invoke(this, "finalizeHelper", nil, nil)
386386 if ($isInstanceOf(@, "Boolean"))
387387 then @
388388 else throw(($getType(invoke(this, "finalizeHelper", nil, nil)) + " couldn't be cast to Boolean"))
389389 }
390390 if ((result == result))
391391 then if (!(result))
392392 then if ((counter == maxDepth))
393393 then throw("Nothing to process")
394394 else $Tuple2(nil, unit)
395395 else if ((counter > 0))
396396 then $Tuple2(nil, invoke(this, "finalizeWrapper", [(counter - 1)], nil))
397397 else $Tuple2(nil, unit)
398398 else throw("Strict value is not equal to itself.")
399399 }
400400
401401
402402
403403 @Callable(i)
404404 func processPendingPeriodsAndUsers () = $Tuple2(nil, invoke(this, "finalizeWrapper", [maxDepth], nil))
405405
406406
407407
408408 @Callable(i)
409409 func deposit () = {
410410 let cfgArray = readConfigArrayOrFail()
411411 if ((i.caller != Address(fromBase58String(cfgArray[IdxCfgPacemakerAddress]))))
412412 then throw("Wrong caller address")
413413 else {
414414 let assetId = value(value(i.payments[0]).assetId)
415415 if ((assetId != fromBase58String(cfgArray[IdxCfgAssetId])))
416416 then throw("Wrong payment asset")
417417 else {
418418 let period = nextPeriod()
419419 let deltaH = (height - getNumberOrFail(keyGwxRewardEmissionStartHeight()))
420420 let emissionRate = valueOrErrorMessage(getInteger(emissionContract, keyRatePerBlockCurrent()), (("mandatory emission_contract." + keyRatePerBlockCurrent()) + " is not defined"))
421421 let weight = valueOrErrorMessage(getInteger(factoryContract, keyPoolWeightVirtual()), (("mandatory factory_contract." + keyPoolWeightVirtual()) + " is not defined"))
422422 let auxAmount = fraction((deltaH * weight), emissionRate, MULT8)
423423 let em = invoke(emissionContract, "emit", [auxAmount], nil)
424424 if ((em == em))
425425 then {
426426 let matcherPart = value(i.payments[0]).amount
427427 let payoutInfo = PeriodPayoutInfo(period, matcherPart, auxAmount)
428428 [IntegerEntry(keyLatestPeriod(), period), IntegerEntry(keyHeightForPeriod(period), height), IntegerEntry(keyAuxEmissionRewardForPeriod(period), auxAmount), IntegerEntry(keyGwxRewardEmissionStartHeight(), height), IntegerEntry(keyTotalAmountForPeriod(period), matcherPart), IntegerEntry(keyNextPeriod(), (period + 1)), StringEntry(keyLastPayoutInfo(), payoutInfo), StringEntry(keyPayoutHistoryInfo(period), payoutInfo)]
429429 }
430430 else throw("Strict value is not equal to itself.")
431431 }
432432 }
433433 }
434434
435435
436436
437437 @Callable(i)
438438 func claimReward () = {
439439 let cfgArray = readConfigArrayOrFail()
440440 let address = toString(i.caller)
441441 let $t01754217592 = commonClaimReward(address)
442442 let amount = $t01754217592._1
443443 let actions = $t01754217592._2
444444 let checkAmount = if ((amount > 0))
445445 then true
446446 else throw("Nothing to claim")
447447 if ((checkAmount == checkAmount))
448448 then {
449449 let amountFromEmission = 0
450450 let claimedReferral = {
451451 let @ = invoke(referralsContractAddressOrFail, "claim", [referralProgramName], nil)
452452 if ($isInstanceOf(@, "Int"))
453453 then @
454454 else throw(($getType(invoke(referralsContractAddressOrFail, "claim", [referralProgramName], nil)) + " couldn't be cast to Int"))
455455 }
456456 let totalAmount = (amount + claimedReferral)
457457 $Tuple2(([ScriptTransfer(i.caller, totalAmount, fromBase58String(cfgArray[IdxCfgAssetId])), HistoryEntry("claim", address, amount, i)] ++ actions), [totalAmount, amountFromEmission])
458458 }
459459 else throw("Strict value is not equal to itself.")
460460 }
461461
462462
463463
464464 @Callable(i)
465465 func claimRewardREADONLY (address) = {
466466 let $t01816518215 = commonClaimReward(address)
467467 let amount = $t01816518215._1
468468 let actions = $t01816518215._2
469469 let referralUnclaimed = valueOrElse(getInteger(referralsContractAddressOrFail, keyUnclaimedReferral(referralProgramName, address)), 0)
470470 let totalAmount = (amount + referralUnclaimed)
471471 $Tuple2(nil, totalAmount)
472472 }
473473
474474
475475
476476 @Callable(i)
477477 func latestFinalizedPeriodREADONLY (address) = $Tuple2(nil, valueOrElse(getInteger(this, keyLatestPeriod()), -1))
478478
479479
480480
481481 @Callable(i)
482482 func latestFinalizedPeriodInfoREADONLY (address) = $Tuple2(nil, getStringByKey(keyLastPayoutInfo()))
483483
484484
485485
486486 @Callable(i)
487487 func calcGwxParamsREADONLY (gwxAmountStart,lockStartHeight,lockDurationBlocks) = {
488488 let lockEndHeight = (lockStartHeight + lockDurationBlocks)
489489 let scale8ParamK = -(fraction(gwxAmountStart, SCALE, lockDurationBlocks))
490490 let scale8ParamB = (fraction(gwxAmountStart, SCALE, lockDurationBlocks) * lockEndHeight)
491491 $Tuple2(nil, [scale8ParamK, scale8ParamB, nextPeriod()])
492492 }
493493
494494
495495
496496 @Callable(i)
497497 func calcGwxAmountStartREADONLY (wxLockAmount,lockDuration,maxLockDuration) = {
498498 let coeffX8 = fraction(lockDuration, MULT8, maxLockDuration)
499499 let gWxAmountStart = fraction(wxLockAmount, coeffX8, MULT8)
500500 $Tuple2(nil, [gWxAmountStart])
501501 }
502502
503503
504504
505505 @Callable(i)
506506 func onEmissionForGwxStart () = if ((i.caller != factoryContract))
507507 then throw("permissions denied")
508508 else [IntegerEntry(keyGwxRewardEmissionStartHeight(), height)]
509509
510510
511511
512512 @Callable(i)
513513 func latestPeriodEmissionRewardsREADONLY (address) = {
514514 let period = nextPeriod()
515515 $Tuple2(nil, [getNumberByKey(keyAuxEmissionRewardForPeriod(period))])
516516 }
517517
518518
519519
520520 @Callable(i)
521521 func calcD (x1BigIntStr,x2BigIntStr,ampBigIntStr,aPrecisionBigIntStr,targetPrecisionBigIntStr) = {
522522 let nCoins = toBigInt(2)
523523 let aPrecision = parseBigIntValue(aPrecisionBigIntStr)
524524 let targetPrecision = parseBigIntValue(targetPrecisionBigIntStr)
525525 let x1 = parseBigIntValue(x1BigIntStr)
526526 let x2 = parseBigIntValue(x2BigIntStr)
527527 let amp = (parseBigIntValue(ampBigIntStr) * aPrecision)
528528 let s = (x1 + x2)
529529 if ((s == zeroBigInt))
530530 then $Tuple2(nil, toString(zeroBigInt))
531531 else {
532532 let ann = (amp * nCoins)
533533 let arr = [1, 2, 3, 4, 5, 6, 7]
534534 func calc (acc,cur) = {
535535 let $t02083821027 = acc
536536 let d = $t02083821027._1
537537 let dPrev = $t02083821027._2
538538 let dp = (((d * d) * d) / (((x1 * x2) * nCoins) * nCoins))
539539 let dNext = (((((ann * s) / aPrecision) + (dp * nCoins)) * d) / ((((ann - aPrecision) * d) / aPrecision) + ((nCoins + toBigInt(1)) * dp)))
540540 $Tuple2(dNext, d)
541541 }
542542
543543 let $t02124021290 = {
544544 let $l = arr
545545 let $s = size($l)
546546 let $acc0 = $Tuple2(s, unit)
547547 func $f0_1 ($a,$i) = if (($i >= $s))
548548 then $a
549549 else calc($a, $l[$i])
550550
551551 func $f0_2 ($a,$i) = if (($i >= $s))
552552 then $a
553553 else throw("List size exceeds 7")
554554
555555 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7)
556556 }
557557 let dNext = $t02124021290._1
558558 let dPrev = $t02124021290._2
559559 let dDiff = absBigInt((dNext - value(dPrev)))
560560 if ((targetPrecision >= dDiff))
561561 then $Tuple2(nil, toString(dNext))
562562 else throw(("D calculation error, dDiff = " + toString(dDiff)))
563563 }
564564 }
565565
566566
567567
568568 @Callable(i)
569569 func calcPutXOnly (amountAssetAmountBigIntStr,amountAssetBalanceBigIntStr,priceAssetBalanceBigIntStr,dBigIntStr,amplificatorBigIntStr,amplificatorPrecisionBigIntStr,targetXPrecisionBigIntStr,targetDPrecisionBigIntStr) = {
570570 let nCoins = toBigInt(2)
571571 let aPrecision = parseBigIntValue(amplificatorPrecisionBigIntStr)
572572 let targetPrecision = parseBigIntValue(targetXPrecisionBigIntStr)
573573 let X = parseBigIntValue(amountAssetBalanceBigIntStr)
574574 let Y = parseBigIntValue(priceAssetBalanceBigIntStr)
575575 let d = if ((dBigIntStr == ""))
576576 then parseBigIntValue({
577577 let @ = invoke(this, "calcD", [amountAssetBalanceBigIntStr, priceAssetBalanceBigIntStr, amplificatorBigIntStr, amplificatorPrecisionBigIntStr, targetDPrecisionBigIntStr], nil)
578578 if ($isInstanceOf(@, "String"))
579579 then @
580580 else throw(($getType(invoke(this, "calcD", [amountAssetBalanceBigIntStr, priceAssetBalanceBigIntStr, amplificatorBigIntStr, amplificatorPrecisionBigIntStr, targetDPrecisionBigIntStr], nil)) + " couldn't be cast to String"))
581581 })
582582 else parseBigIntValue(dBigIntStr)
583583 let amp = (parseBigIntValue(amplificatorBigIntStr) * aPrecision)
584584 let S = parseBigIntValue(amountAssetAmountBigIntStr)
585585 let ann = (amp * nCoins)
586586 let arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
587587 func calc (acc,cur) = {
588588 let $t02289822918 = acc
589589 let x = $t02289822918._1
590590 let xPrev = $t02289822918._2
591591 let newX = ((X + S) - x)
592592 let newY = (Y - ((x * Y) / X))
593593 let dp = (((d * d) * d) / (((newX * newY) * nCoins) * nCoins))
594594 let xNext = (x + ((((((-(d) * ann) / aPrecision) + d) + ((ann * (newX + newY)) / aPrecision)) - dp) / ((((-(ann) * (toBigInt(-1) - (Y / X))) / aPrecision) + (dp / newX)) + ((Y * dp) / (X * newY)))))
595595 $Tuple2(xNext, x)
596596 }
597597
598598 let $t02322123281 = {
599599 let $l = arr
600600 let $s = size($l)
601601 let $acc0 = $Tuple2(zeroBigInt, unit)
602602 func $f0_1 ($a,$i) = if (($i >= $s))
603603 then $a
604604 else calc($a, $l[$i])
605605
606606 func $f0_2 ($a,$i) = if (($i >= $s))
607607 then $a
608608 else throw("List size exceeds 20")
609609
610610 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
611611 }
612612 let xNext = $t02322123281._1
613613 let xPrev = $t02322123281._2
614614 let xDiff = absBigInt((xNext - value(xPrev)))
615615 if ((targetPrecision >= xDiff))
616616 then $Tuple2(nil, $Tuple2(toInt(xNext), toInt(fraction(xNext, Y, X))))
617617 else throw(((((("X calculation error, xDiff = " + toString(xDiff)) + ", xNext = ") + toString(xNext)) + ", xPrev = ") + toString(value(xPrev))))
618618 }
619619
620620
621621
622622 @Callable(i)
623623 func calcSwapXToYOld (amountAssetAmountBigIntStr,amountAssetBalanceBigIntStr,priceAssetBalanceBigIntStr,dBigIntStr,amplificatorBigIntStr,amplificatorPrecisionBigIntStr,targetXPrecisionBigIntStr,targetDPrecisionBigIntStr) = {
624624 let nCoins = toBigInt(2)
625625 let aPrecision = parseBigIntValue(amplificatorPrecisionBigIntStr)
626626 let targetPrecision = parseBigIntValue(targetXPrecisionBigIntStr)
627627 let X = parseBigIntValue(amountAssetBalanceBigIntStr)
628628 let Y = parseBigIntValue(priceAssetBalanceBigIntStr)
629629 let x = parseBigIntValue(amountAssetAmountBigIntStr)
630630 let d = if ((dBigIntStr == ""))
631631 then parseBigIntValue({
632632 let @ = invoke(this, "calcD", [amountAssetBalanceBigIntStr, priceAssetBalanceBigIntStr, amplificatorBigIntStr, amplificatorPrecisionBigIntStr, targetDPrecisionBigIntStr], nil)
633633 if ($isInstanceOf(@, "String"))
634634 then @
635635 else throw(($getType(invoke(this, "calcD", [amountAssetBalanceBigIntStr, priceAssetBalanceBigIntStr, amplificatorBigIntStr, amplificatorPrecisionBigIntStr, targetDPrecisionBigIntStr], nil)) + " couldn't be cast to String"))
636636 })
637637 else parseBigIntValue(dBigIntStr)
638638 let amp = (parseBigIntValue(amplificatorBigIntStr) * aPrecision)
639639 let ann = (amp * nCoins)
640640 let arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17]
641641 func calc (acc,cur) = {
642642 let $t02493024950 = acc
643643 let y = $t02493024950._1
644644 let yPrev = $t02493024950._2
645645 let newX = (X + x)
646646 let newY = (Y - y)
647647 let dp = (((d * d) * d) / (((newX * newY) * nCoins) * nCoins))
648648 let yNext = (y + ((((((-(d) * ann) / aPrecision) + d) + ((ann * (newX + newY)) / aPrecision)) - dp) / ((ann / aPrecision) + (dp / newY))))
649649 $Tuple2(yNext, y)
650650 }
651651
652652 let $t02519225243 = {
653653 let $l = arr
654654 let $s = size($l)
655655 let $acc0 = $Tuple2(d, unit)
656656 func $f0_1 ($a,$i) = if (($i >= $s))
657657 then $a
658658 else calc($a, $l[$i])
659659
660660 func $f0_2 ($a,$i) = if (($i >= $s))
661661 then $a
662662 else throw("List size exceeds 17")
663663
664664 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17)
665665 }
666666 let yNext = $t02519225243._1
667667 let yPrev = $t02519225243._2
668668 let yDiff = absBigInt((yNext - value(yPrev)))
669669 if ((targetPrecision >= yDiff))
670670 then $Tuple2(nil, toInt(yNext))
671671 else throw(((((("Y calculation error, yDiff = " + toString(yDiff)) + ", yNext = ") + toString(yNext)) + ", yPrev = ") + toString(value(yPrev))))
672672 }
673673
674674
675675
676676 @Callable(i)
677677 func calcSwapXToY (amountAssetAmountBigIntStr,amountAssetBalanceBigIntStr,priceAssetBalanceBigIntStr,dBigIntStr,amplificatorBigIntStr,amplificatorPrecisionBigIntStr,targetXPrecisionBigIntStr,targetDPrecisionBigIntStr) = {
678678 let nCoins = toBigInt(2)
679679 let aPrecision = parseBigIntValue(amplificatorPrecisionBigIntStr)
680680 let targetPrecision = parseBigIntValue(targetXPrecisionBigIntStr)
681681 let oldX = parseBigIntValue(amountAssetBalanceBigIntStr)
682682 let Y = parseBigIntValue(priceAssetBalanceBigIntStr)
683683 let x = parseBigIntValue(amountAssetAmountBigIntStr)
684684 let X = (oldX + x)
685685 let D = if ((dBigIntStr == ""))
686686 then parseBigIntValue({
687687 let @ = invoke(this, "calcD", [amountAssetBalanceBigIntStr, priceAssetBalanceBigIntStr, amplificatorBigIntStr, amplificatorPrecisionBigIntStr, targetDPrecisionBigIntStr], nil)
688688 if ($isInstanceOf(@, "String"))
689689 then @
690690 else throw(($getType(invoke(this, "calcD", [amountAssetBalanceBigIntStr, priceAssetBalanceBigIntStr, amplificatorBigIntStr, amplificatorPrecisionBigIntStr, targetDPrecisionBigIntStr], nil)) + " couldn't be cast to String"))
691691 })
692692 else parseBigIntValue(dBigIntStr)
693693 let amp = (parseBigIntValue(amplificatorBigIntStr) * aPrecision)
694694 let S = (X + Y)
695695 let ann = (amp * nCoins)
696- let c = fraction((((D * D) * D) * D), aPrecision, (((((X * Y) * nCoins) * nCoins) * nCoins) * ann))
696+ let c = (((((((D * D) / (X * nCoins)) * D) / (Y * nCoins)) * D) * aPrecision) / (ann * nCoins))
697697 let b = (S + ((D * aPrecision) / ann))
698698 let arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
699699 func calc (acc,cur) = {
700- let $t02684926869 = acc
701- let y = $t02684926869._1
702- let yPrev = $t02684926869._2
700+ let $t02684726867 = acc
701+ let y = $t02684726867._1
702+ let yPrev = $t02684726867._2
703703 let yNext = (((y * y) + c) / (((toBigInt(2) * y) + b) - D))
704704 $Tuple2(yNext, y)
705705 }
706706
707- let $t02694826999 = {
707+ let $t02694626997 = {
708708 let $l = arr
709709 let $s = size($l)
710710 let $acc0 = $Tuple2(D, unit)
711711 func $f0_1 ($a,$i) = if (($i >= $s))
712712 then $a
713713 else calc($a, $l[$i])
714714
715715 func $f0_2 ($a,$i) = if (($i >= $s))
716716 then $a
717717 else throw("List size exceeds 15")
718718
719719 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
720720 }
721- let yNext = $t02694826999._1
722- let yPrev = $t02694826999._2
721+ let yNext = $t02694626997._1
722+ let yPrev = $t02694626997._2
723723 let yDiff = absBigInt((yNext - value(yPrev)))
724724 if ((targetPrecision >= yDiff))
725725 then $Tuple2(nil, toInt((Y - yNext)))
726726 else throw(((((("Y calculation error, yDiff = " + toString(yDiff)) + ", yNext = ") + toString(yNext)) + ", yPrev = ") + toString(value(yPrev))))
727727 }
728728
729729
730730
731731 @Callable(i)
732732 func setManager (pendingManagerPublicKey) = {
733733 let checkCaller = mustManager(i)
734734 if ((checkCaller == checkCaller))
735735 then {
736736 let checkManagerPublicKey = fromBase58String(pendingManagerPublicKey)
737737 if ((checkManagerPublicKey == checkManagerPublicKey))
738738 then [StringEntry(keyPendingManagerPublicKey(), pendingManagerPublicKey)]
739739 else throw("Strict value is not equal to itself.")
740740 }
741741 else throw("Strict value is not equal to itself.")
742742 }
743743
744744
745745
746746 @Callable(i)
747747 func confirmManager () = {
748748 let pm = pendingManagerPublicKeyOrUnit()
749749 let hasPM = if (isDefined(pm))
750750 then true
751751 else throw("No pending manager")
752752 if ((hasPM == hasPM))
753753 then {
754754 let checkPM = if ((i.callerPublicKey == value(pm)))
755755 then true
756756 else throw("You are not pending manager")
757757 if ((checkPM == checkPM))
758758 then [StringEntry(keyManagerPublicKey(), toBase58String(value(pm))), DeleteEntry(keyPendingManagerPublicKey())]
759759 else throw("Strict value is not equal to itself.")
760760 }
761761 else throw("Strict value is not equal to itself.")
762762 }
763763
764764
765765 @Verifier(tx)
766766 func verify () = {
767767 let targetPublicKey = match managerPublicKeyOrUnit() {
768768 case pk: ByteVector =>
769769 pk
770770 case _: Unit =>
771771 tx.senderPublicKey
772772 case _ =>
773773 throw("Match error")
774774 }
775775 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
776776 }
777777

github/deemru/w8io/026f985 
145.61 ms