tx · DtFwinjC8cbkAWcPjTwRSSqTs1VXSbLgXbVWL43u6jTs

3N2yNznNNBCevaJdCMr8XhM87sKKuBjMdEq:  -0.10000000 Waves

2022.10.10 12:52 [2266084] smart account 3N2yNznNNBCevaJdCMr8XhM87sKKuBjMdEq > SELF 0.00000000 Waves

{ "type": 13, "id": "DtFwinjC8cbkAWcPjTwRSSqTs1VXSbLgXbVWL43u6jTs", "fee": 10000000, "feeAssetId": null, "timestamp": 1665395516292, "version": 2, "chainId": 84, "sender": "3N2yNznNNBCevaJdCMr8XhM87sKKuBjMdEq", "senderPublicKey": "644NyMVpLnyzhSJG4FPftw1Gn3yQfD6hbZJQvvoavceg", "proofs": [ "2imvLxSd6akaLouTicHmiqoHpYf65MPg7qYfp1U2xxwAaemKqTUBXMuzhpNE44oD6NVM9kqXu68Eq2yWbfKmPcMk", "5h2jHE8Fk3YoPTyfZq8CuPFDGxgNqrQTiGCYgpu5UN2h32aubTp8NQ7bL6Mk3Hux1tp1bAL6fvnchGK6KQcYGrAn" ], "script": "base64:BgJKCAISBgoEAhgREhIGCgQCGBESEgYKBAIYERISBgoEAhgREhIGCgQCGBESEgYKBAIYERISBgoEAhgREhIGCgQCGBESEgYKBAIYERJLAAd2ZXJzaW9uAgUxLjAuMAAIa1ZlcnNpb24CB3ZlcnNpb24AB2tBY3RpdmUCBmFjdGl2ZQAJa0Fzc2V0SWRBAgpBX2Fzc2V0X2lkAAlrQXNzZXRJZEICCkJfYXNzZXRfaWQACWtCYWxhbmNlQQIPQV9hc3NldF9iYWxhbmNlAAlrQmFsYW5jZUICD0JfYXNzZXRfYmFsYW5jZQANa0JhbGFuY2VJbml0QQIMQV9hc3NldF9pbml0AA1rQmFsYW5jZUluaXRCAgxCX2Fzc2V0X2luaXQADWtTaGFyZUFzc2V0SWQCDnNoYXJlX2Fzc2V0X2lkABFrU2hhcmVBc3NldFN1cHBseQISc2hhcmVfYXNzZXRfc3VwcGx5AARrRmVlAgpjb21taXNzaW9uAAZrQ2F1c2UCDnNodXRkb3duX2NhdXNlAA1rRmlyc3RIYXJ2ZXN0Ag1maXJzdF9oYXJ2ZXN0ABNrRmlyc3RIYXJ2ZXN0SGVpZ2h0AhRmaXJzdF9oYXJ2ZXN0X2hlaWdodAALa1NoYXJlTGltaXQCHHNoYXJlX2xpbWl0X29uX2ZpcnN0X2hhcnZlc3QAC2tCYXNlUGVyaW9kAgtiYXNlX3BlcmlvZAANa1BlcmlvZExlbmd0aAINcGVyaW9kX2xlbmd0aAAMa1N0YXJ0SGVpZ2h0AgxzdGFydF9oZWlnaHQADGtVU0ROQWRkcmVzcwIYc3Rha2luZ191c2RubnNidF9hZGRyZXNzAAxrRVVSTkFkZHJlc3MCFHN0YWtpbmdfZXVybl9hZGRyZXNzAA5rTGVhc2luZ0Ftb3VudAIObGVhc2luZ19hbW91bnQADGtVU0ROQXNzZXRJZAINdXNkbl9hc3NldF9pZAAMa0VVUk5Bc3NldElkAg1ldXJuX2Fzc2V0X2lkAA5rU3Rha2luZ0Fzc2V0cwIOc3Rha2luZ19hc3NldHMADWtPcmFjbGVBY3RpdmUCFGFjdGl2ZV9hbGxfY29udHJhY3RzABdrT3JhY2xlQWN0aXZlRXhjaGFuZ2VycwIYYWN0aXZlX2dsb2JhbF9leGNoYW5nZXJzAAprRGlzY291bnRzAglkaXNjb3VudHMAD2tEaXNjb3VudFZhbHVlcwIPZGlzY291bnRfdmFsdWVzAA5rVXNlclN3b3BJbkdvdgIMX1NXT1BfYW1vdW50AAtrT3JhY2xlUG9vbAIFcG9vbF8ADWtBZG1pblB1YktleTECC2FkbWluX3B1Yl8xAA1rQWRtaW5QdWJLZXkyAgthZG1pbl9wdWJfMgANa0FkbWluUHViS2V5MwILYWRtaW5fcHViXzMAEmtBZG1pbkludm9rZVB1YktleQIQYWRtaW5faW52b2tlX3B1YgAQa01vbmV5Qm94QWRkcmVzcwIRbW9uZXlfYm94X2FkZHJlc3MADmtWb3RpbmdBZGRyZXNzAg52b3RpbmdfYWRkcmVzcwALa0dvdkFkZHJlc3MCEmdvdmVybmFuY2VfYWRkcmVzcwAPa0Zhcm1pbmdBZGRyZXNzAg9mYXJtaW5nX2FkZHJlc3MABm9yYWNsZQkBB0FkZHJlc3MBARoBVOlFqh6QLzqu8boO5i6akl8amITh82KzCAETZ2V0QmFzZTU4RnJvbU9yYWNsZQEDa2V5BAckbWF0Y2gwCQCdCAIFBm9yYWNsZQUDa2V5AwkAAQIFByRtYXRjaDACBlN0cmluZwQGc3RyaW5nBQckbWF0Y2gwCQDZBAEFBnN0cmluZwQHbm90aGluZwUHJG1hdGNoMAkAAgEJAKwCAgUDa2V5AghpcyBlbXB0eQAMYWRtaW5QdWJLZXkxCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFDWtBZG1pblB1YktleTEADGFkbWluUHViS2V5MgkBE2dldEJhc2U1OEZyb21PcmFjbGUBBQ1rQWRtaW5QdWJLZXkyAAxhZG1pblB1YktleTMJARNnZXRCYXNlNThGcm9tT3JhY2xlAQUNa0FkbWluUHViS2V5MwARYWRtaW5JbnZva2VQdWJLZXkJARNnZXRCYXNlNThGcm9tT3JhY2xlAQUSa0FkbWluSW52b2tlUHViS2V5AA9tb25leUJveEFkZHJlc3MJAQdBZGRyZXNzAQkBE2dldEJhc2U1OEZyb21PcmFjbGUBBRBrTW9uZXlCb3hBZGRyZXNzAA12b3RpbmdBZGRyZXNzCQEHQWRkcmVzcwEJARNnZXRCYXNlNThGcm9tT3JhY2xlAQUOa1ZvdGluZ0FkZHJlc3MACmdvdkFkZHJlc3MJAQdBZGRyZXNzAQkBE2dldEJhc2U1OEZyb21PcmFjbGUBBQtrR292QWRkcmVzcwAOZmFybWluZ0FkZHJlc3MJAQdBZGRyZXNzAQkBE2dldEJhc2U1OEZyb21PcmFjbGUBBQ9rRmFybWluZ0FkZHJlc3MABFVTRE4JARNnZXRCYXNlNThGcm9tT3JhY2xlAQUMa1VTRE5Bc3NldElkAARFVVJOCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFDGtFVVJOQXNzZXRJZAANc3Rha2luZ0Fzc2V0cwkBEUBleHRyTmF0aXZlKDEwNTMpAgUGb3JhY2xlBQ5rU3Rha2luZ0Fzc2V0cwASc3Rha2luZ1VTRE5BZGRyZXNzCQEHQWRkcmVzcwEJARNnZXRCYXNlNThGcm9tT3JhY2xlAQUMa1VTRE5BZGRyZXNzABJzdGFraW5nRVVSTkFkZHJlc3MJAQdBZGRyZXNzAQkBE2dldEJhc2U1OEZyb21PcmFjbGUBBQxrRVVSTkFkZHJlc3MACmJhc2VQZXJpb2QJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQ12b3RpbmdBZGRyZXNzBQtrQmFzZVBlcmlvZAIRRW1wdHkga0Jhc2VQZXJpb2QAC3N0YXJ0SGVpZ2h0CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUNdm90aW5nQWRkcmVzcwUMa1N0YXJ0SGVpZ2h0AhJFbXB0eSBrU3RhcnRIZWlnaHQADHBlcmlvZExlbmd0aAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFDXZvdGluZ0FkZHJlc3MFDWtQZXJpb2RMZW5ndGgCE0VtcHR5IGtQZXJpb2RMZW5ndGgAFWZpcnN0SGFydmVzdEVuZFBlcmlvZAkAZAIJAGQCBQpiYXNlUGVyaW9kCQBpAgkAZQIFBmhlaWdodAULc3RhcnRIZWlnaHQFDHBlcmlvZExlbmd0aAADAAZhY3RpdmUDCQERQGV4dHJOYXRpdmUoMTA1MSkCBQZvcmFjbGUFDWtPcmFjbGVBY3RpdmUJARFAZXh0ck5hdGl2ZSgxMDUxKQIFBm9yYWNsZQUXa09yYWNsZUFjdGl2ZUV4Y2hhbmdlcnMHAAlmZWVTY2FsZTYAwIQ9AAZzY2FsZTgAgMLXLwEOYWNjb3VudEJhbGFuY2UCB2Fzc2V0SWQEcG9vbAQHJG1hdGNoMAUHYXNzZXRJZAMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAJpZAUHJG1hdGNoMAkA8AcCBQRwb29sBQJpZAMJAAECBQckbWF0Y2gwAgRVbml0BAV3YXZlcwUHJG1hdGNoMAgJAO8HAQUEcG9vbAlhdmFpbGFibGUJAAIBAgtNYXRjaCBlcnJvcgEMc3Rha2VkQW1vdW50Agdhc3NldElkBHBvb2wEFnN0YWtlZEFtb3VudENhbGN1bGF0ZWQEByRtYXRjaDAFB2Fzc2V0SWQDCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQDYUlkBQckbWF0Y2gwAwkAAAIFA2FJZAUEVVNETgkAmggCBRJzdGFraW5nVVNETkFkZHJlc3MJAKwCAgkArAICCQCsAgICDHJwZF9iYWxhbmNlXwkA2AQBBQNhSWQCAV8JAKUIAQUEcG9vbAMJAAACBQNhSWQFBEVVUk4JAJoIAgUSc3Rha2luZ0VVUk5BZGRyZXNzCQCsAgIJAKwCAgkArAICAhglcyVzJXNfX3N0YWtpbmdCYWxhbmNlX18JANgEAQUDYUlkAgJfXwkApQgBBQRwb29sAAADCQABAgUHJG1hdGNoMAIEVW5pdAkBC3ZhbHVlT3JFbHNlAgkAmggCBQRwb29sBQ5rTGVhc2luZ0Ftb3VudAAACQACAQILTWF0Y2ggZXJyb3IEByRtYXRjaDAFFnN0YWtlZEFtb3VudENhbGN1bGF0ZWQDCQABAgUHJG1hdGNoMAIDSW50BAFpBQckbWF0Y2gwBQFpAAABDGdldEFzc2V0SW5mbwEHYXNzZXRJZAQHJG1hdGNoMAUHYXNzZXRJZAMDCQABAgUHJG1hdGNoMAIGU3RyaW5nBgkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAmlkBQckbWF0Y2gwBAskdDAzOTY3NDEzOQQHJG1hdGNoMQUCaWQDCQABAgUHJG1hdGNoMQIKQnl0ZVZlY3RvcgQDYUlkBQckbWF0Y2gxCQCUCgIJANgEAQUDYUlkBQNhSWQDCQABAgUHJG1hdGNoMQIGU3RyaW5nBANhSWQFByRtYXRjaDEJAJQKAgUDYUlkCQDZBAEFA2FJZAkAAgECC01hdGNoIGVycm9yBAhzdHJpbmdJZAgFCyR0MDM5Njc0MTM5Al8xBAdieXRlc0lkCAULJHQwMzk2NzQxMzkCXzIEBGluZm8JARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkA7AcBBQdieXRlc0lkCQCsAgIJAKwCAgIGQXNzZXQgBQhzdHJpbmdJZAIOIGRvZXNuJ3QgZXhpc3QJAJUKAwUIc3RyaW5nSWQIBQRpbmZvBG5hbWUIBQRpbmZvCGRlY2ltYWxzAwkAAQIFByRtYXRjaDACBFVuaXQEBXdhdmVzBQckbWF0Y2gwCQCVCgMCBVdBVkVTAgVXQVZFUwAICQACAQILTWF0Y2ggZXJyb3IBB3N1c3BlbmQBBWNhdXNlCQDMCAIJAQxCb29sZWFuRW50cnkCBQdrQWN0aXZlBwkAzAgCCQELU3RyaW5nRW50cnkCBQZrQ2F1c2UFBWNhdXNlBQNuaWwBFGNhbGN1bGF0ZUZlZURpc2NvdW50AQh1c2VyQWRkcgQKc3dvcEFtb3VudAkBC3ZhbHVlT3JFbHNlAgkAmggCBQpnb3ZBZGRyZXNzCQCsAgIJAKUIAQUIdXNlckFkZHIFDmtVc2VyU3dvcEluR292AAAEDmRpc2NvdW50VmFsdWVzCQC1CQIJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBm9yYWNsZQUPa0Rpc2NvdW50VmFsdWVzAgEsBAlkaXNjb3VudHMJALUJAgkBEUBleHRyTmF0aXZlKDEwNTMpAgUGb3JhY2xlBQprRGlzY291bnRzAgEsAwMJAGcCBQpzd29wQW1vdW50CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUOZGlzY291bnRWYWx1ZXMAAAkAZgIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQ5kaXNjb3VudFZhbHVlcwABBQpzd29wQW1vdW50BwkAZQIFCWZlZVNjYWxlNgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCWRpc2NvdW50cwAAAwMJAGcCBQpzd29wQW1vdW50CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUOZGlzY291bnRWYWx1ZXMAAQkAZgIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQ5kaXNjb3VudFZhbHVlcwACBQpzd29wQW1vdW50BwkAZQIFCWZlZVNjYWxlNgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCWRpc2NvdW50cwABAwMJAGcCBQpzd29wQW1vdW50CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUOZGlzY291bnRWYWx1ZXMAAgkAZgIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQ5kaXNjb3VudFZhbHVlcwADBQpzd29wQW1vdW50BwkAZQIFCWZlZVNjYWxlNgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCWRpc2NvdW50cwACAwMJAGcCBQpzd29wQW1vdW50CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUOZGlzY291bnRWYWx1ZXMAAwkAZgIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQ5kaXNjb3VudFZhbHVlcwAEBQpzd29wQW1vdW50BwkAZQIFCWZlZVNjYWxlNgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCWRpc2NvdW50cwADAwkAZwIFCnN3b3BBbW91bnQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQ5kaXNjb3VudFZhbHVlcwAECQBlAgUJZmVlU2NhbGU2CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUJZGlzY291bnRzAAQFCWZlZVNjYWxlNgENY2FsY3VsYXRlRmVlcwYJcG10QW1vdW50Em1pbkFtb3VudFRvUmVjZWl2ZQl0b2tlbkZyb20HdG9rZW5UbwNmZWUNZmVlR292ZXJuYW5jZQQQYW1vdW50V2l0aG91dEZlZQkAawMFB3Rva2VuVG8FCXBtdEFtb3VudAkAZAIFCXBtdEFtb3VudAUJdG9rZW5Gcm9tBA1hbW91bnRXaXRoRmVlCQBrAwUQYW1vdW50V2l0aG91dEZlZQkAZQIFCWZlZVNjYWxlNgUDZmVlBQlmZWVTY2FsZTYEEGdvdmVybmFuY2VSZXdhcmQJAGsDBRBhbW91bnRXaXRob3V0RmVlBQ1mZWVHb3Zlcm5hbmNlBQlmZWVTY2FsZTYDCQBmAgUSbWluQW1vdW50VG9SZWNlaXZlBQ1hbW91bnRXaXRoRmVlCQACAQkArAICCQCsAgIJAKwCAgIdQ2FsY3VsYXRlZCBhbW91bnQgdG8gcmVjZWl2ZSAJAKQDAQUNYW1vdW50V2l0aEZlZQIgIGlzIGxlc3MgdGhhbiBzcGVjaWZpZWQgbWluaW11bSAJAKQDAQUSbWluQW1vdW50VG9SZWNlaXZlCQCVCgMFEGFtb3VudFdpdGhvdXRGZWUFDWFtb3VudFdpdGhGZWUFEGdvdmVybmFuY2VSZXdhcmQBEGNhbGN1bGF0ZVZpcnRHZXQDCXBtdEFtb3VudAdiYWxhbmNlA2ZlZQQBYQABBAFiCQBlAgkAZAIJAGQCBQdiYWxhbmNlCQBrAwUHYmFsYW5jZQkAZQIFCWZlZVNjYWxlNgUDZmVlBQlmZWVTY2FsZTYJAGsDBQlwbXRBbW91bnQJAGUCBQlmZWVTY2FsZTYFA2ZlZQUJZmVlU2NhbGU2BQlwbXRBbW91bnQEAWMJALkCAgkAvgIBCQC2AgEFB2JhbGFuY2UJALYCAQUJcG10QW1vdW50BAFECQC4AgIJALkCAgkAtgIBBQFiCQC2AgEFAWIJALkCAgkAuQICCQC2AgEABAkAtgIBBQFhBQFjCQBoAgkAoAMBCQC6AgIJALcCAgkAvgIBCQC2AgEFAWIJAHYGBQFEAAAJALYCAQAFAAEAAAUERE9XTgkAtgIBAAIFAWEBEXBhcnNlUGF5bWVudEFzc2V0AQdhc3NldElkAwkAAAIFB2Fzc2V0SWQBAAUEdW5pdAUHYXNzZXRJZAERc3VzcGVuZFN1c3BpY2lvdXMGD2FjY291bnRCYWxhbmNlQQ9hY2NvdW50QmFsYW5jZUIIYmFsYW5jZUEIYmFsYW5jZUIIYXNzZXRJZEEIYXNzZXRJZEIJAQdzdXNwZW5kAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIjU3VzcGljaW91cyBzdGF0ZS4gQWN0dWFsIGJhbGFuY2VzOiAJAKQDAQUPYWNjb3VudEJhbGFuY2VBAgEgBQhhc3NldElkQQICLCAJAKQDAQUPYWNjb3VudEJhbGFuY2VCAgEgBQhhc3NldElkQgIJLiBTdGF0ZTogCQCkAwEFCGJhbGFuY2VBAgEgBQhhc3NldElkQQICLCAJAKQDAQUIYmFsYW5jZUICASAFCGFzc2V0SWRCAQhpc0FjdGl2ZQADBQZhY3RpdmUFBHVuaXQJAAIBAh9EQXBwIGlzIGluYWN0aXZlIGF0IHRoaXMgbW9tZW50AQxpc09yYWNsZVBvb2wBC3Bvb2xBZGRyZXNzAwkBCWlzRGVmaW5lZAEJAJ0IAgUGb3JhY2xlCQCsAgIFC2tPcmFjbGVQb29sBQtwb29sQWRkcmVzcwUEdW5pdAkAAgECG0RBcHAgaXMgbm90IHJlZ2lzdGVyZWQgcG9vbAEPZ2V0UG9vbEJhbGFuY2VzAwRwb29sCGFzc2V0SWRBCGFzc2V0SWRCBAhiYWxhbmNlQQkBEUBleHRyTmF0aXZlKDEwNTApAgUEcG9vbAUJa0JhbGFuY2VBBAhiYWxhbmNlQgkBEUBleHRyTmF0aXZlKDEwNTApAgUEcG9vbAUJa0JhbGFuY2VCBA1zdGFrZWRBbW91bnRBCQEMc3Rha2VkQW1vdW50AgUIYXNzZXRJZEEFBHBvb2wEDXN0YWtlZEFtb3VudEIJAQxzdGFrZWRBbW91bnQCBQhhc3NldElkQgUEcG9vbAQPYWNjb3VudEJhbGFuY2VBCQBkAgkBDmFjY291bnRCYWxhbmNlAgUIYXNzZXRJZEEFBHBvb2wFDXN0YWtlZEFtb3VudEEED2FjY291bnRCYWxhbmNlQgkAZAIJAQ5hY2NvdW50QmFsYW5jZQIFCGFzc2V0SWRCBQRwb29sBQ1zdGFrZWRBbW91bnRCBAtzaGFyZVN1cHBseQkBEUBleHRyTmF0aXZlKDEwNTApAgUEcG9vbAURa1NoYXJlQXNzZXRTdXBwbHkJAJcKBQUIYmFsYW5jZUEFCGJhbGFuY2VCBQ9hY2NvdW50QmFsYW5jZUEFD2FjY291bnRCYWxhbmNlQgULc2hhcmVTdXBwbHkBDWdldFBvb2xBc3NldHMBBHBvb2wEC3N0ckFzc2V0SWRBCQERQGV4dHJOYXRpdmUoMTA1MykCBQRwb29sBQlrQXNzZXRJZEEEC3N0ckFzc2V0SWRCCQERQGV4dHJOYXRpdmUoMTA1MykCBQRwb29sBQlrQXNzZXRJZEIECGFzc2V0SWRBAwkAAAIFC3N0ckFzc2V0SWRBAgVXQVZFUwUEdW5pdAkA2QQBBQtzdHJBc3NldElkQQQIYXNzZXRJZEIDCQAAAgULc3RyQXNzZXRJZEICBVdBVkVTBQR1bml0CQDZBAEFC3N0ckFzc2V0SWRCBAxzaGFyZUFzc2V0SWQJANkEAQkBEUBleHRyTmF0aXZlKDEwNTMpAgUEcG9vbAUNa1NoYXJlQXNzZXRJZAkAlwoFBQtzdHJBc3NldElkQQULc3RyQXNzZXRJZEIFCGFzc2V0SWRBBQhhc3NldElkQgUMc2hhcmVBc3NldElkAQxnZXRGZWVQYXJhbXMCBHBvb2wGY2FsbGVyBAtmZWVEaXNjb3VudAkBFGNhbGN1bGF0ZUZlZURpc2NvdW50AQUGY2FsbGVyBANmZWUJAG4ECQERQGV4dHJOYXRpdmUoMTA1MCkCBQRwb29sBQRrRmVlBQtmZWVEaXNjb3VudAUJZmVlU2NhbGU2BQdDRUlMSU5HBAZnb3ZGZWUJAG4ECQBrAwUDZmVlACgAZAULZmVlRGlzY291bnQFCWZlZVNjYWxlNgUHQ0VJTElORwkAlAoCBQNmZWUFBmdvdkZlZQkBaQEEaW5pdAQLY2FsbGVyQnl0ZXMEYXJncwhwQW1vdW50cwlwQXNzZXRJZHMEBmNhbGxlcgkBB0FkZHJlc3MBBQtjYWxsZXJCeXRlcwQLJHQwODg1MTg5MjkJAJQKAgkAkQMCBQhwQW1vdW50cwAACQERcGFyc2VQYXltZW50QXNzZXQBCQCRAwIFCXBBc3NldElkcwAABApwbXRBbW91bnRBCAULJHQwODg1MTg5MjkCXzEEC3BtdEFzc2V0SWRBCAULJHQwODg1MTg5MjkCXzIECyR0MDg5MzQ5MDEyCQCUCgIJAJEDAgUIcEFtb3VudHMAAQkBEXBhcnNlUGF5bWVudEFzc2V0AQkAkQMCBQlwQXNzZXRJZHMAAQQKcG10QW1vdW50QggFCyR0MDg5MzQ5MDEyAl8xBAtwbXRBc3NldElkQggFCyR0MDg5MzQ5MDEyAl8yAwkBASEBCQEPY29udGFpbnNFbGVtZW50AgkAzAgCBQxhZG1pblB1YktleTEJAMwIAgUMYWRtaW5QdWJLZXkyCQDMCAIFDGFkbWluUHViS2V5MwkAzAgCBRFhZG1pbkludm9rZVB1YktleQUDbmlsCAUBaRVvcmlnaW5DYWxsZXJQdWJsaWNLZXkJAAIBAiFPbmx5IGFkbWluIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24DCQEJaXNEZWZpbmVkAQkAmwgCBQZjYWxsZXIFB2tBY3RpdmUJAAIBAhZEQXBwIGlzIGFscmVhZHkgYWN0aXZlAwkAAAIFC3BtdEFzc2V0SWRBBQtwbXRBc3NldElkQgkAAgECGEFzc2V0cyBtdXN0IGJlIGRpZmZlcmVudAQLJHQwOTM4Mjk0NTkJAQxnZXRBc3NldEluZm8BBQtwbXRBc3NldElkQQQOcG10U3RyQXNzZXRJZEEIBQskdDA5MzgyOTQ1OQJfMQQNcG10QXNzZXROYW1lQQgFCyR0MDkzODI5NDU5Al8yBAxwbXREZWNpbWFsc0EIBQskdDA5MzgyOTQ1OQJfMwQLJHQwOTQ2ODk1NDUJAQxnZXRBc3NldEluZm8BBQtwbXRBc3NldElkQgQOcG10U3RyQXNzZXRJZEIIBQskdDA5NDY4OTU0NQJfMQQNcG10QXNzZXROYW1lQggFCyR0MDk0Njg5NTQ1Al8yBAxwbXREZWNpbWFsc0IIBQskdDA5NDY4OTU0NQJfMwQMZmlyc3RIYXJ2ZXN0CQAAAgkAkQMCBQRhcmdzAAACBHRydWUECXNoYXJlTmFtZQkArAICCQCsAgIJAKwCAgIBcwkArwICBQ1wbXRBc3NldE5hbWVBAAcCAV8JAK8CAgUNcG10QXNzZXROYW1lQgAHBBBzaGFyZURlc2NyaXB0aW9uCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIiU2hhcmVUb2tlbiBvZiBTd29wRmkgcHJvdG9jb2wgZm9yIAUNcG10QXNzZXROYW1lQQIFIGFuZCAFDXBtdEFzc2V0TmFtZUICDCBhdCBhZGRyZXNzIAkApQgBBQR0aGlzBA1zaGFyZURlY2ltYWxzCQBpAgkAZAIFDHBtdERlY2ltYWxzQQUMcG10RGVjaW1hbHNCAAIEBGFyZzEJAGwGBQpwbXRBbW91bnRBBQxwbXREZWNpbWFsc0EABQABBQxwbXREZWNpbWFsc0EFBERPV04EBGFyZzIJAGwGBQpwbXRBbW91bnRCBQxwbXREZWNpbWFsc0IABQABBQxwbXREZWNpbWFsc0IFBERPV04EBGFyZzMJAGwGAAoAAAUNc2hhcmVEZWNpbWFscwAAAAAFBERPV04EEnNoYXJlSW5pdGlhbFN1cHBseQkAawMFBGFyZzEFBGFyZzIFBGFyZzMECnNoYXJlSXNzdWUJAMIIBQUJc2hhcmVOYW1lBRBzaGFyZURlc2NyaXB0aW9uBRJzaGFyZUluaXRpYWxTdXBwbHkFDXNoYXJlRGVjaW1hbHMGBAxzaGFyZUlzc3VlSWQJALgIAQUKc2hhcmVJc3N1ZQQGc3Rha2UxAwkBCGNvbnRhaW5zAgUNc3Rha2luZ0Fzc2V0cwUOcG10U3RyQXNzZXRJZEEJAPwHBAgFAWkGY2FsbGVyAgxzdGFrZVVuc3Rha2UJAMwIAgYJAMwIAgUKcG10QW1vdW50QQkAzAgCBQ5wbXRTdHJBc3NldElkQQUDbmlsBQNuaWwAAAMJAAACBQZzdGFrZTEFBnN0YWtlMQQGc3Rha2UyAwkBCGNvbnRhaW5zAgUNc3Rha2luZ0Fzc2V0cwUOcG10U3RyQXNzZXRJZEIJAPwHBAgFAWkGY2FsbGVyAgxzdGFrZVVuc3Rha2UJAMwIAgYJAMwIAgUKcG10QW1vdW50QgkAzAgCBQ5wbXRTdHJBc3NldElkQgUDbmlsBQNuaWwAAAMJAAACBQZzdGFrZTIFBnN0YWtlMgQJYmFzZUVudHJ5CQDMCAIJAQtTdHJpbmdFbnRyeQIFCGtWZXJzaW9uBQd2ZXJzaW9uCQDMCAIJAQxCb29sZWFuRW50cnkCBQdrQWN0aXZlBgkAzAgCCQELU3RyaW5nRW50cnkCBQlrQXNzZXRJZEEFDnBtdFN0ckFzc2V0SWRBCQDMCAIJAQtTdHJpbmdFbnRyeQIFCWtBc3NldElkQgUOcG10U3RyQXNzZXRJZEIJAMwIAgkBDEludGVnZXJFbnRyeQIFCWtCYWxhbmNlQQUKcG10QW1vdW50QQkAzAgCCQEMSW50ZWdlckVudHJ5AgUJa0JhbGFuY2VCBQpwbXRBbW91bnRCCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQRrRmVlCQERQGV4dHJOYXRpdmUoMTA1MCkCBQZvcmFjbGUCDWJhc2VfZmVlX2NwbW0JAMwIAgUKc2hhcmVJc3N1ZQkAzAgCCQELU3RyaW5nRW50cnkCBQ1rU2hhcmVBc3NldElkCQDYBAEFDHNoYXJlSXNzdWVJZAkAzAgCCQEMSW50ZWdlckVudHJ5AgURa1NoYXJlQXNzZXRTdXBwbHkFEnNoYXJlSW5pdGlhbFN1cHBseQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQZjYWxsZXIFEnNoYXJlSW5pdGlhbFN1cHBseQUMc2hhcmVJc3N1ZUlkBQNuaWwDBQxmaXJzdEhhcnZlc3QJAJQKAgUDbmlsCQCUCgIJAM4IAgUJYmFzZUVudHJ5CQDMCAIJAQxCb29sZWFuRW50cnkCBQ1rRmlyc3RIYXJ2ZXN0BQxmaXJzdEhhcnZlc3QJAMwIAgkBDEludGVnZXJFbnRyeQIFE2tGaXJzdEhhcnZlc3RIZWlnaHQJAGQCBQtzdGFydEhlaWdodAkAaAIFFWZpcnN0SGFydmVzdEVuZFBlcmlvZAUMcGVyaW9kTGVuZ3RoBQNuaWwFA25pbAkAlAoCBQNuaWwJAJQKAgUJYmFzZUVudHJ5BQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQERaW5pdFdpdGhJbml0UmF0aW8EC2NhbGxlckJ5dGVzBGFyZ3MIcEFtb3VudHMJcEFzc2V0SWRzBAZjYWxsZXIJAQdBZGRyZXNzAQULY2FsbGVyQnl0ZXMEDSR0MDExNzkwMTE5OTAJAJcKBQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBGFyZ3MAAAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBGFyZ3MAAQkAkQMCBQRhcmdzAAIJAJEDAgUEYXJncwADCQAAAgkAkQMCBQRhcmdzAAQCBHRydWUECWFtdEFzc2V0QQgFDSR0MDExNzkwMTE5OTACXzEECWFtdEFzc2V0QggFDSR0MDExNzkwMTE5OTACXzIEC2Fzc2V0SWRBU3RyCAUNJHQwMTE3OTAxMTk5MAJfMwQLYXNzZXRJZEJTdHIIBQ0kdDAxMTc5MDExOTkwAl80BAxmaXJzdEhhcnZlc3QIBQ0kdDAxMTc5MDExOTkwAl81AwkBASEBCQEPY29udGFpbnNFbGVtZW50AgkAzAgCBQxhZG1pblB1YktleTEJAMwIAgUMYWRtaW5QdWJLZXkyCQDMCAIFDGFkbWluUHViS2V5MwkAzAgCBRFhZG1pbkludm9rZVB1YktleQUDbmlsCAUBaRVvcmlnaW5DYWxsZXJQdWJsaWNLZXkJAAIBAiFPbmx5IGFkbWluIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24DCQEJaXNEZWZpbmVkAQkAmwgCBQZjYWxsZXIFB2tBY3RpdmUJAAIBAhZEQXBwIGlzIGFscmVhZHkgYWN0aXZlAwkAAAIFC2Fzc2V0SWRBU3RyBQthc3NldElkQlN0cgkAAgECGEFzc2V0cyBtdXN0IGJlIGRpZmZlcmVudAQNJHQwMTIzNjAxMjQzNwkBDGdldEFzc2V0SW5mbwEFC2Fzc2V0SWRBU3RyBA5wbXRTdHJBc3NldElkQQgFDSR0MDEyMzYwMTI0MzcCXzEEDXBtdEFzc2V0TmFtZUEIBQ0kdDAxMjM2MDEyNDM3Al8yBAxwbXREZWNpbWFsc0EIBQ0kdDAxMjM2MDEyNDM3Al8zBA0kdDAxMjQ0NjEyNTIzCQEMZ2V0QXNzZXRJbmZvAQULYXNzZXRJZEJTdHIEDnBtdFN0ckFzc2V0SWRCCAUNJHQwMTI0NDYxMjUyMwJfMQQNcG10QXNzZXROYW1lQggFDSR0MDEyNDQ2MTI1MjMCXzIEDHBtdERlY2ltYWxzQggFDSR0MDEyNDQ2MTI1MjMCXzMECXNoYXJlTmFtZQkArAICCQCsAgIJAKwCAgIBcwkArwICBQ1wbXRBc3NldE5hbWVBAAcCAV8JAK8CAgUNcG10QXNzZXROYW1lQgAHBBBzaGFyZURlc2NyaXB0aW9uCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIiU2hhcmVUb2tlbiBvZiBTd29wRmkgcHJvdG9jb2wgZm9yIAUNcG10QXNzZXROYW1lQQIFIGFuZCAFDXBtdEFzc2V0TmFtZUICDCBhdCBhZGRyZXNzIAkApQgBBQR0aGlzBA1zaGFyZURlY2ltYWxzCQBpAgkAZAIFDHBtdERlY2ltYWxzQQUMcG10RGVjaW1hbHNCAAIEEnNoYXJlSW5pdGlhbFN1cHBseQAABApzaGFyZUlzc3VlCQDCCAUFCXNoYXJlTmFtZQUQc2hhcmVEZXNjcmlwdGlvbgUSc2hhcmVJbml0aWFsU3VwcGx5BQ1zaGFyZURlY2ltYWxzBgQMc2hhcmVJc3N1ZUlkCQC4CAEFCnNoYXJlSXNzdWUECWJhc2VFbnRyeQkAzAgCCQELU3RyaW5nRW50cnkCBQhrVmVyc2lvbgUHdmVyc2lvbgkAzAgCCQEMQm9vbGVhbkVudHJ5AgUHa0FjdGl2ZQYJAMwIAgkBC1N0cmluZ0VudHJ5AgUJa0Fzc2V0SWRBBQ5wbXRTdHJBc3NldElkQQkAzAgCCQELU3RyaW5nRW50cnkCBQlrQXNzZXRJZEIFDnBtdFN0ckFzc2V0SWRCCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ1rQmFsYW5jZUluaXRBBQlhbXRBc3NldEEJAMwIAgkBDEludGVnZXJFbnRyeQIFDWtCYWxhbmNlSW5pdEIFCWFtdEFzc2V0QgkAzAgCCQEMSW50ZWdlckVudHJ5AgUJa0JhbGFuY2VBAAAJAMwIAgkBDEludGVnZXJFbnRyeQIFCWtCYWxhbmNlQgAACQDMCAIJAQxJbnRlZ2VyRW50cnkCBQRrRmVlCQERQGV4dHJOYXRpdmUoMTA1MCkCBQZvcmFjbGUCDWJhc2VfZmVlX2NwbW0JAMwIAgUKc2hhcmVJc3N1ZQkAzAgCCQELU3RyaW5nRW50cnkCBQ1rU2hhcmVBc3NldElkCQDYBAEFDHNoYXJlSXNzdWVJZAkAzAgCCQEMSW50ZWdlckVudHJ5AgURa1NoYXJlQXNzZXRTdXBwbHkFEnNoYXJlSW5pdGlhbFN1cHBseQUDbmlsAwUMZmlyc3RIYXJ2ZXN0CQCUCgIFA25pbAkAlAoCCQDOCAIFCWJhc2VFbnRyeQkAzAgCCQEMQm9vbGVhbkVudHJ5AgUNa0ZpcnN0SGFydmVzdAUMZmlyc3RIYXJ2ZXN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRNrRmlyc3RIYXJ2ZXN0SGVpZ2h0CQBkAgULc3RhcnRIZWlnaHQJAGgCBRVmaXJzdEhhcnZlc3RFbmRQZXJpb2QFDHBlcmlvZExlbmd0aAUDbmlsBQNuaWwJAJQKAgUDbmlsCQCUCgIFCWJhc2VFbnRyeQUDbmlsAWkBGGtlZXBMaW1pdEZvckZpcnN0SGFydmVzdAQLY2FsbGVyQnl0ZXMEYXJncwhwQW1vdW50cwlwQXNzZXRJZHMJAQt2YWx1ZU9yRWxzZQIJAQxpc09yYWNsZVBvb2wBCQClCAEIBQFpBmNhbGxlcgkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAMJAQEhAQkBD2NvbnRhaW5zRWxlbWVudAIJAMwIAgUMYWRtaW5QdWJLZXkxCQDMCAIFDGFkbWluUHViS2V5MgkAzAgCBQxhZG1pblB1YktleTMJAMwIAgURYWRtaW5JbnZva2VQdWJLZXkFA25pbAgFAWkVb3JpZ2luQ2FsbGVyUHVibGljS2V5CQACAQIhT25seSBhZG1pbiBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uBApzaGFyZUxpbWl0CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUEYXJncwAACQCUCgIFA25pbAkAlAoCCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQtrU2hhcmVMaW1pdAUKc2hhcmVMaW1pdAUDbmlsBQNuaWwBaQEIZXhjaGFuZ2UEC2NhbGxlckJ5dGVzBGFyZ3MIcEFtb3VudHMJcEFzc2V0SWRzCQELdmFsdWVPckVsc2UCCQEMaXNPcmFjbGVQb29sAQkApQgBCAUBaQZjYWxsZXIJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAEBmNhbGxlcgkBB0FkZHJlc3MBBQtjYWxsZXJCeXRlcwQNJHQwMTQ4NDgxNDkyNAkAlAoCCQCRAwIFCHBBbW91bnRzAAAJARFwYXJzZVBheW1lbnRBc3NldAEJAJEDAgUJcEFzc2V0SWRzAAAECXBtdEFtb3VudAgFDSR0MDE0ODQ4MTQ5MjQCXzEECnBtdEFzc2V0SWQIBQ0kdDAxNDg0ODE0OTI0Al8yBBJtaW5BbW91bnRUb1JlY2VpdmUJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQRhcmdzAAAEDSR0MDE0OTk3MTUwNzMJAQ1nZXRQb29sQXNzZXRzAQgFAWkGY2FsbGVyBAtzdHJBc3NldElkQQgFDSR0MDE0OTk3MTUwNzMCXzEEC3N0ckFzc2V0SWRCCAUNJHQwMTQ5OTcxNTA3MwJfMgQIYXNzZXRJZEEIBQ0kdDAxNDk5NzE1MDczAl8zBAhhc3NldElkQggFDSR0MDE0OTk3MTUwNzMCXzQEDSR0MDE1MDg2MTUxOTIJAQ9nZXRQb29sQmFsYW5jZXMDCAUBaQZjYWxsZXIFCGFzc2V0SWRBBQhhc3NldElkQgQIYmFsYW5jZUEIBQ0kdDAxNTA4NjE1MTkyAl8xBAhiYWxhbmNlQggFDSR0MDE1MDg2MTUxOTICXzIED2FjY291bnRCYWxhbmNlQQgFDSR0MDE1MDg2MTUxOTICXzMED2FjY291bnRCYWxhbmNlQggFDSR0MDE1MDg2MTUxOTICXzQDAwkAAAIFCGJhbGFuY2VBAAAGCQAAAgUIYmFsYW5jZUIAAAkAAgECIENhbid0IGV4Y2hhbmdlIHdpdGggemVybyBiYWxhbmNlAwkAZwIAAAUSbWluQW1vdW50VG9SZWNlaXZlCQACAQkArAICAjRNaW5pbWFsIGFtb3VudCB0byByZWNlaXZlIG11c3QgYmUgcG9zaXRpdmUuIEFjdHVhbDogCQCkAwEFEm1pbkFtb3VudFRvUmVjZWl2ZQMJAQIhPQIJAJADAQUIcEFtb3VudHMAAQkAAgECHU9uZSBhdHRhY2hlZCBwYXltZW50IGV4cGVjdGVkAwkBASEBCQEPY29udGFpbnNFbGVtZW50AgkAzAgCBQhhc3NldElkQQkAzAgCBQhhc3NldElkQgUDbmlsBQpwbXRBc3NldElkCQACAQkArAICCQCsAgIJAKwCAgIkSW5jb3JyZWN0IGFzc2V0IGF0dGFjaGVkLiBFeHBlY3RlZDogBQtzdHJBc3NldElkQQIEIG9yIAULc3RyQXNzZXRJZEIDAwkAZgIFCGJhbGFuY2VBBQ9hY2NvdW50QmFsYW5jZUEGCQBmAgUIYmFsYW5jZUIFD2FjY291bnRCYWxhbmNlQgkAlAoCBQNuaWwJAM4IAgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQZjYWxsZXIFCXBtdEFtb3VudAUKcG10QXNzZXRJZAUDbmlsCQERc3VzcGVuZFN1c3BpY2lvdXMGBQ9hY2NvdW50QmFsYW5jZUEFD2FjY291bnRCYWxhbmNlQgUIYmFsYW5jZUEFCGJhbGFuY2VCBQtzdHJBc3NldElkQQULc3RyQXNzZXRJZEIEDSR0MDE2MDc3MTYxMzUJAQxnZXRGZWVQYXJhbXMCCAUBaQZjYWxsZXIIBQFpDG9yaWdpbkNhbGxlcgQDZmVlCAUNJHQwMTYwNzcxNjEzNQJfMQQGZ292RmVlCAUNJHQwMTYwNzcxNjEzNQJfMgQNJHQwMTYxNTIxNjQ4OQMJAAACBQpwbXRBc3NldElkBQhhc3NldElkQQkBDWNhbGN1bGF0ZUZlZXMGBQlwbXRBbW91bnQFEm1pbkFtb3VudFRvUmVjZWl2ZQUIYmFsYW5jZUEFCGJhbGFuY2VCBQNmZWUFBmdvdkZlZQkBDWNhbGN1bGF0ZUZlZXMGBQlwbXRBbW91bnQFEm1pbkFtb3VudFRvUmVjZWl2ZQUIYmFsYW5jZUIFCGJhbGFuY2VBBQNmZWUFBmdvdkZlZQQQYW1vdW50V2l0aG91dEZlZQgFDSR0MDE2MTUyMTY0ODkCXzEEDWFtb3VudFdpdGhGZWUIBQ0kdDAxNjE1MjE2NDg5Al8yBBBnb3Zlcm5hbmNlUmV3YXJkCAUNJHQwMTYxNTIxNjQ4OQJfMwQNJHQwMTY1MDcxNjgzMgMJAAACBQpwbXRBc3NldElkBQhhc3NldElkQQkAlQoDCQBkAgUIYmFsYW5jZUEFCXBtdEFtb3VudAkAZQIJAGUCBQhiYWxhbmNlQgUNYW1vdW50V2l0aEZlZQUQZ292ZXJuYW5jZVJld2FyZAUIYXNzZXRJZEIJAJUKAwkAZQIJAGUCBQhiYWxhbmNlQQUNYW1vdW50V2l0aEZlZQUQZ292ZXJuYW5jZVJld2FyZAkAZAIFCGJhbGFuY2VCBQlwbXRBbW91bnQFCGFzc2V0SWRBBAtuZXdCYWxhbmNlQQgFDSR0MDE2NTA3MTY4MzICXzEEC25ld0JhbGFuY2VCCAUNJHQwMTY1MDcxNjgzMgJfMgQLYXNzZXRJZFNlbmQIBQ0kdDAxNjUwNzE2ODMyAl8zBA0kdDAxNjg1MDE3MTAwAwkAAAIFCnBtdEFzc2V0SWQFCGFzc2V0SWRBCQCUCgIFCXBtdEFtb3VudAkAZAIFDWFtb3VudFdpdGhGZWUFEGdvdmVybmFuY2VSZXdhcmQJAJQKAgkAZAIFDWFtb3VudFdpdGhGZWUFEGdvdmVybmFuY2VSZXdhcmQFCXBtdEFtb3VudAQMc3Rha2VBbW91bnRBCAUNJHQwMTY4NTAxNzEwMAJfMQQMc3Rha2VBbW91bnRCCAUNJHQwMTY4NTAxNzEwMAJfMgQGc3Rha2UxAwkBCGNvbnRhaW5zAgUNc3Rha2luZ0Fzc2V0cwULc3RyQXNzZXRJZEEJAPwHBAgFAWkGY2FsbGVyAgxzdGFrZVVuc3Rha2UJAMwIAgkAAAIFCnBtdEFzc2V0SWQFCGFzc2V0SWRBCQDMCAIFDHN0YWtlQW1vdW50QQkAzAgCBQtzdHJBc3NldElkQQUDbmlsBQNuaWwAAAMJAAACBQZzdGFrZTEFBnN0YWtlMQQGc3Rha2UyAwkBCGNvbnRhaW5zAgUNc3Rha2luZ0Fzc2V0cwULc3RyQXNzZXRJZEIJAPwHBAgFAWkGY2FsbGVyAgxzdGFrZVVuc3Rha2UJAMwIAgkAAAIFCnBtdEFzc2V0SWQFCGFzc2V0SWRCCQDMCAIFDHN0YWtlQW1vdW50QgkAzAgCBQtzdHJBc3NldElkQgUDbmlsBQNuaWwAAAMJAAACBQZzdGFrZTIFBnN0YWtlMgkAlAoCBQNuaWwJAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgUJa0JhbGFuY2VBBQtuZXdCYWxhbmNlQQkAzAgCCQEMSW50ZWdlckVudHJ5AgUJa0JhbGFuY2VCBQtuZXdCYWxhbmNlQgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQZjYWxsZXIFDWFtb3VudFdpdGhGZWUFC2Fzc2V0SWRTZW5kCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFD21vbmV5Qm94QWRkcmVzcwUQZ292ZXJuYW5jZVJld2FyZAULYXNzZXRJZFNlbmQFA25pbAkAzAgCBQ1hbW91bnRXaXRoRmVlCQDMCAIFC2Fzc2V0SWRTZW5kBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEWcmVwbGVuaXNoV2l0aFR3b1Rva2VucwQLY2FsbGVyQnl0ZXMEYXJncwhwQW1vdW50cwlwQXNzZXRJZHMJAQt2YWx1ZU9yRWxzZQIJAQxpc09yYWNsZVBvb2wBCQClCAEIBQFpBmNhbGxlcgkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAQGY2FsbGVyCQEHQWRkcmVzcwEFC2NhbGxlckJ5dGVzBAtwbXRBc3NldElkQQkBEXBhcnNlUGF5bWVudEFzc2V0AQkAkQMCBQlwQXNzZXRJZHMAAAQLcG10QXNzZXRJZEIJARFwYXJzZVBheW1lbnRBc3NldAEJAJEDAgUJcEFzc2V0SWRzAAEEDHN0YWtlRmFybWluZwkAAAIJAJEDAgUEYXJncwAAAgR0cnVlBA0kdDAxODMxMjE4NDAyCQENZ2V0UG9vbEFzc2V0cwEIBQFpBmNhbGxlcgQLc3RyQXNzZXRJZEEIBQ0kdDAxODMxMjE4NDAyAl8xBAtzdHJBc3NldElkQggFDSR0MDE4MzEyMTg0MDICXzIECGFzc2V0SWRBCAUNJHQwMTgzMTIxODQwMgJfMwQIYXNzZXRJZEIIBQ0kdDAxODMxMjE4NDAyAl80BAxzaGFyZUFzc2V0SWQIBQ0kdDAxODMxMjE4NDAyAl81BA0kdDAxODQxNTE4NTM5CQEPZ2V0UG9vbEJhbGFuY2VzAwgFAWkGY2FsbGVyBQhhc3NldElkQQUIYXNzZXRJZEIECGJhbGFuY2VBCAUNJHQwMTg0MTUxODUzOQJfMQQIYmFsYW5jZUIIBQ0kdDAxODQxNTE4NTM5Al8yBA9hY2NvdW50QmFsYW5jZUEIBQ0kdDAxODQxNTE4NTM5Al8zBA9hY2NvdW50QmFsYW5jZUIIBQ0kdDAxODQxNTE4NTM5Al80BBBzaGFyZUFzc2V0U3VwcGx5CAUNJHQwMTg0MTUxODUzOQJfNQMJAQIhPQIJAJADAQUIcEFtb3VudHMAAgkAAgECHFR3byBhdHRhY2hlZCBhc3NldHMgZXhwZWN0ZWQDAwkBAiE9AgULcG10QXNzZXRJZEEFCGFzc2V0SWRBBgkBAiE9AgULcG10QXNzZXRJZEIFCGFzc2V0SWRCCQACAQkArAICCQCsAgIJAKwCAgIlSW5jb3JyZWN0IGFzc2V0cyBhdHRhY2hlZC4gRXhwZWN0ZWQ6IAULc3RyQXNzZXRJZEECBSBhbmQgBQtzdHJBc3NldElkQgMDCQBmAgUIYmFsYW5jZUEFD2FjY291bnRCYWxhbmNlQQYJAGYCBQhiYWxhbmNlQgUPYWNjb3VudEJhbGFuY2VCCQCUCgIFA25pbAkAzggCCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFBmNhbGxlcgkAkQMCBQhwQW1vdW50cwAABQtwbXRBc3NldElkQQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQZjYWxsZXIJAJEDAgUIcEFtb3VudHMAAQULcG10QXNzZXRJZEIFA25pbAkBEXN1c3BlbmRTdXNwaWNpb3VzBgUPYWNjb3VudEJhbGFuY2VBBQ9hY2NvdW50QmFsYW5jZUIFCGJhbGFuY2VBBQhiYWxhbmNlQgULc3RyQXNzZXRJZEEFC3N0ckFzc2V0SWRCBA0kdDAxOTIxMTE5Mjg4CQEMZ2V0QXNzZXRJbmZvAQULcG10QXNzZXRJZEEEDnBtdFN0ckFzc2V0SWRBCAUNJHQwMTkyMTExOTI4OAJfMQQNcG10QXNzZXROYW1lQQgFDSR0MDE5MjExMTkyODgCXzIEDHBtdERlY2ltYWxzQQgFDSR0MDE5MjExMTkyODgCXzMEDSR0MDE5MzA1MTkzODIJAQxnZXRBc3NldEluZm8BBQtwbXRBc3NldElkQgQOcG10U3RyQXNzZXRJZEIIBQ0kdDAxOTMwNTE5MzgyAl8xBA1wbXRBc3NldE5hbWVCCAUNJHQwMTkzMDUxOTM4MgJfMgQMcG10RGVjaW1hbHNCCAUNJHQwMTkzMDUxOTM4MgJfMwQHaW5pdGlhbAkAAAIJAGQCBQhiYWxhbmNlQQUIYmFsYW5jZUIAAAQNJHQwMTk0NTcyMDMwMAMFB2luaXRpYWwJAJcKBQkAkQMCBQhwQW1vdW50cwAACQCRAwIFCHBBbW91bnRzAAEAAAULcG10QXNzZXRJZEEAAQQTcmF0aW9TaGFyZVRva2Vuc0luQQkAawMFBnNjYWxlOAkAkQMCBQhwQW1vdW50cwAABQhiYWxhbmNlQQQTcmF0aW9TaGFyZVRva2Vuc0luQgkAawMFBnNjYWxlOAkAkQMCBQhwQW1vdW50cwABBQhiYWxhbmNlQgMJAGYCBRNyYXRpb1NoYXJlVG9rZW5zSW5CBRNyYXRpb1NoYXJlVG9rZW5zSW5BBANwbXQJAGsDCQCRAwIFCHBBbW91bnRzAAAFCGJhbGFuY2VCBQhiYWxhbmNlQQkAlwoFCQCRAwIFCHBBbW91bnRzAAAFA3BtdAkAZQIJAJEDAgUIcEFtb3VudHMAAQUDcG10BQtwbXRBc3NldElkQgUTcmF0aW9TaGFyZVRva2Vuc0luQQQDcG10CQBrAwkAkQMCBQhwQW1vdW50cwABBQhiYWxhbmNlQQUIYmFsYW5jZUIJAJcKBQUDcG10CQCRAwIFCHBBbW91bnRzAAEJAGUCCQCRAwIFCHBBbW91bnRzAAAFA3BtdAULcG10QXNzZXRJZEEFE3JhdGlvU2hhcmVUb2tlbnNJbkIECnBtdEFtb3VudEEIBQ0kdDAxOTQ1NzIwMzAwAl8xBApwbXRBbW91bnRCCAUNJHQwMTk0NTcyMDMwMAJfMgQGY2hhbmdlCAUNJHQwMTk0NTcyMDMwMAJfMwQNY2hhbmdlQXNzZXRJZAgFDSR0MDE5NDU3MjAzMDACXzQED3NoYXJlVG9rZW5SYXRpbwgFDSR0MDE5NDU3MjAzMDACXzUEFXNoYXJlVG9rZW5Ub1BheUFtb3VudAMFB2luaXRpYWwEDXNoYXJlRGVjaW1hbHMJAGkCCQBkAgUMcG10RGVjaW1hbHNBBQxwbXREZWNpbWFsc0IAAgkAawMJAGwGBQpwbXRBbW91bnRBBQxwbXREZWNpbWFsc0EABQABBQxwbXREZWNpbWFsc0EFBERPV04JAGwGBQpwbXRBbW91bnRCBQxwbXREZWNpbWFsc0IABQABBQxwbXREZWNpbWFsc0IFBERPV04JAGwGAAoAAAUNc2hhcmVEZWNpbWFscwAAAAAFBERPV04JAGsDBQ9zaGFyZVRva2VuUmF0aW8FEHNoYXJlQXNzZXRTdXBwbHkFBnNjYWxlOAMJAAACBRVzaGFyZVRva2VuVG9QYXlBbW91bnQAAAkAAgECHVRvbyBzbWFsbCBhbW91bnQgdG8gcmVwbGVuaXNoAwkAZgIAAAUGY2hhbmdlCQACAQIKQ2hhbmdlIDwgMAQGc3Rha2UxAwkBCGNvbnRhaW5zAgUNc3Rha2luZ0Fzc2V0cwUOcG10U3RyQXNzZXRJZEEJAPwHBAgFAWkGY2FsbGVyAgxzdGFrZVVuc3Rha2UJAMwIAgYJAMwIAgUKcG10QW1vdW50QQkAzAgCBQ5wbXRTdHJBc3NldElkQQUDbmlsBQNuaWwAAAMJAAACBQZzdGFrZTEFBnN0YWtlMQQGc3Rha2UyAwkBCGNvbnRhaW5zAgUNc3Rha2luZ0Fzc2V0cwUOcG10U3RyQXNzZXRJZEIJAPwHBAgFAWkGY2FsbGVyAgxzdGFrZVVuc3Rha2UJAMwIAgYJAMwIAgUKcG10QW1vdW50QgkAzAgCBQ5wbXRTdHJBc3NldElkQgUDbmlsBQNuaWwAAAMJAAACBQZzdGFrZTIFBnN0YWtlMgQMc2hhcmVUb2tlblNUAwUMc3Rha2VGYXJtaW5nBAdyZWlzc3VlCQD8BwQIBQFpBmNhbGxlcgIRcmVpc3N1ZVNoYXJlVG9rZW4JAMwIAgUVc2hhcmVUb2tlblRvUGF5QW1vdW50BQNuaWwFA25pbAMJAAACBQdyZWlzc3VlBQdyZWlzc3VlBAZzdGFrZTMJAPwHBAUOZmFybWluZ0FkZHJlc3MCD2xvY2tTaGFyZVRva2VucwkAzAgCCQClCAEIBQFpBmNhbGxlcgUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQxzaGFyZUFzc2V0SWQFFXNoYXJlVG9rZW5Ub1BheUFtb3VudAUDbmlsAwkAAAIFBnN0YWtlMwUGc3Rha2UzBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAMwIAgkBB1JlaXNzdWUDBQxzaGFyZUFzc2V0SWQFFXNoYXJlVG9rZW5Ub1BheUFtb3VudAYJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUGY2FsbGVyBRVzaGFyZVRva2VuVG9QYXlBbW91bnQFDHNoYXJlQXNzZXRJZAUDbmlsCQCUCgIFA25pbAkAlAoCCQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIFCWtCYWxhbmNlQQkAZAIFCGJhbGFuY2VBBQpwbXRBbW91bnRBCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQlrQmFsYW5jZUIJAGQCBQhiYWxhbmNlQgUKcG10QW1vdW50QgkAzAgCCQEMSW50ZWdlckVudHJ5AgURa1NoYXJlQXNzZXRTdXBwbHkJAGQCBRBzaGFyZUFzc2V0U3VwcGx5BRVzaGFyZVRva2VuVG9QYXlBbW91bnQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUGY2FsbGVyBQZjaGFuZ2UFDWNoYW5nZUFzc2V0SWQFA25pbAUMc2hhcmVUb2tlblNUBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEVcmVwbGVuaXNoV2l0aE9uZVRva2VuBAtjYWxsZXJCeXRlcwRhcmdzCHBBbW91bnRzCXBBc3NldElkcwkBC3ZhbHVlT3JFbHNlAgkBDGlzT3JhY2xlUG9vbAEJAKUIAQgFAWkGY2FsbGVyCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUABAZjYWxsZXIJAQdBZGRyZXNzAQULY2FsbGVyQnl0ZXMECnBtdEFzc2V0SWQJARFwYXJzZVBheW1lbnRBc3NldAEJAJEDAgUJcEFzc2V0SWRzAAAECXBtdEFtb3VudAkAkQMCBQhwQW1vdW50cwAABBB2aXJ0R2V0TWluQW1vdW50CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUEYXJncwAABAxzdGFrZUZhcm1pbmcJAAACCQCRAwIFBGFyZ3MAAQIEdHJ1ZQQNJHQwMjI4NTUyMjk0NQkBDWdldFBvb2xBc3NldHMBCAUBaQZjYWxsZXIEC3N0ckFzc2V0SWRBCAUNJHQwMjI4NTUyMjk0NQJfMQQLc3RyQXNzZXRJZEIIBQ0kdDAyMjg1NTIyOTQ1Al8yBAhhc3NldElkQQgFDSR0MDIyODU1MjI5NDUCXzMECGFzc2V0SWRCCAUNJHQwMjI4NTUyMjk0NQJfNAQMc2hhcmVBc3NldElkCAUNJHQwMjI4NTUyMjk0NQJfNQQNJHQwMjI5NTgyMzA4MgkBD2dldFBvb2xCYWxhbmNlcwMIBQFpBmNhbGxlcgUIYXNzZXRJZEEFCGFzc2V0SWRCBAhiYWxhbmNlQQgFDSR0MDIyOTU4MjMwODICXzEECGJhbGFuY2VCCAUNJHQwMjI5NTgyMzA4MgJfMgQPYWNjb3VudEJhbGFuY2VBCAUNJHQwMjI5NTgyMzA4MgJfMwQPYWNjb3VudEJhbGFuY2VCCAUNJHQwMjI5NTgyMzA4MgJfNAQQc2hhcmVBc3NldFN1cHBseQgFDSR0MDIyOTU4MjMwODICXzUEB2luaXRpYWwJAAACCQBkAgUIYmFsYW5jZUEFCGJhbGFuY2VCAAADCQECIT0CCQCQAwEFCHBBbW91bnRzAAEJAAIBAhxPbmUgYXR0YWNoZWQgYXNzZXRzIGV4cGVjdGVkAwMJAQIhPQIFCnBtdEFzc2V0SWQFCGFzc2V0SWRBCQECIT0CBQpwbXRBc3NldElkBQhhc3NldElkQgcJAAIBCQCsAgIJAKwCAgkArAICAiRJbmNvcnJlY3QgYXNzZXQgYXR0YWNoZWQuIEV4cGVjdGVkOiAFC3N0ckFzc2V0SWRBAgQgb3IgBQtzdHJBc3NldElkQgMFB2luaXRpYWwJAAIBAjBGb3IgaW5pdGlhbCBleGNoYW5nZXIgeW91IG5lZWQgdG8gdXNlIHR3byB0b2tlbnMDAwkAZgIFCGJhbGFuY2VBBQ9hY2NvdW50QmFsYW5jZUEGCQBmAgUIYmFsYW5jZUIFD2FjY291bnRCYWxhbmNlQgkAlAoCBQNuaWwJAM4IAgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQZjYWxsZXIFCXBtdEFtb3VudAUKcG10QXNzZXRJZAUDbmlsCQERc3VzcGVuZFN1c3BpY2lvdXMGBQ9hY2NvdW50QmFsYW5jZUEFD2FjY291bnRCYWxhbmNlQgUIYmFsYW5jZUEFCGJhbGFuY2VCBQtzdHJBc3NldElkQQULc3RyQXNzZXRJZEIEDSR0MDIzODM2MjM4OTQJAQxnZXRGZWVQYXJhbXMCCAUBaQZjYWxsZXIIBQFpDG9yaWdpbkNhbGxlcgQDZmVlCAUNJHQwMjM4MzYyMzg5NAJfMQQGZ292RmVlCAUNJHQwMjM4MzYyMzg5NAJfMgQNJHQwMjM5MTEyNTc5NwMJAAACBQpwbXRBc3NldElkBQhhc3NldElkQQQNdmlydFBheUFtb3VudAkBEGNhbGN1bGF0ZVZpcnRHZXQDBQlwbXRBbW91bnQFCGJhbGFuY2VBBQNmZWUEDSR0MDI0MTkwMjQzMjcJAQ1jYWxjdWxhdGVGZWVzBgUNdmlydFBheUFtb3VudAUQdmlydEdldE1pbkFtb3VudAUIYmFsYW5jZUEFCGJhbGFuY2VCBQNmZWUFBmdvdkZlZQQQYW1vdW50V2l0aG91dEZlZQgFDSR0MDI0MTkwMjQzMjcCXzEEDWFtb3VudFdpdGhGZWUIBQ0kdDAyNDE5MDI0MzI3Al8yBBBnb3Zlcm5hbmNlUmV3YXJkCAUNJHQwMjQxOTAyNDMyNwJfMwQLbmV3QmFsYW5jZUEJAGQCBQhiYWxhbmNlQQUJcG10QW1vdW50BAtuZXdCYWxhbmNlQgkAZQIFCGJhbGFuY2VCBRBnb3Zlcm5hbmNlUmV3YXJkBBNyYXRpb1NoYXJlVG9rZW5zSW5BCQBrAwkAZQIFCXBtdEFtb3VudAUNdmlydFBheUFtb3VudAUGc2NhbGU4BQtuZXdCYWxhbmNlQQQTcmF0aW9TaGFyZVRva2Vuc0luQgkAawMFDWFtb3VudFdpdGhGZWUFBnNjYWxlOAULbmV3QmFsYW5jZUIEFXNoYXJlVG9rZW5Ub1BheUFtb3VudAkAawMJAJcDAQkAzAgCBRNyYXRpb1NoYXJlVG9rZW5zSW5BCQDMCAIFE3JhdGlvU2hhcmVUb2tlbnNJbkIFA25pbAUQc2hhcmVBc3NldFN1cHBseQUGc2NhbGU4CQCZCgcFC25ld0JhbGFuY2VBBQtuZXdCYWxhbmNlQgUVc2hhcmVUb2tlblRvUGF5QW1vdW50BRBnb3Zlcm5hbmNlUmV3YXJkBQhhc3NldElkQgULc3RyQXNzZXRJZEIFC3N0ckFzc2V0SWRBBA12aXJ0UGF5QW1vdW50CQEQY2FsY3VsYXRlVmlydEdldAMFCXBtdEFtb3VudAUIYmFsYW5jZUIFA2ZlZQQNJHQwMjUwNjIyNTE5OQkBDWNhbGN1bGF0ZUZlZXMGBQ12aXJ0UGF5QW1vdW50BRB2aXJ0R2V0TWluQW1vdW50BQhiYWxhbmNlQgUIYmFsYW5jZUEFA2ZlZQUGZ292RmVlBBBhbW91bnRXaXRob3V0RmVlCAUNJHQwMjUwNjIyNTE5OQJfMQQNYW1vdW50V2l0aEZlZQgFDSR0MDI1MDYyMjUxOTkCXzIEEGdvdmVybmFuY2VSZXdhcmQIBQ0kdDAyNTA2MjI1MTk5Al8zBAtuZXdCYWxhbmNlQQkAZQIFCGJhbGFuY2VBBRBnb3Zlcm5hbmNlUmV3YXJkBAtuZXdCYWxhbmNlQgkAZAIFCGJhbGFuY2VCBQlwbXRBbW91bnQEE3JhdGlvU2hhcmVUb2tlbnNJbkEJAGsDBQ1hbW91bnRXaXRoRmVlBQZzY2FsZTgFC25ld0JhbGFuY2VBBBNyYXRpb1NoYXJlVG9rZW5zSW5CCQBrAwkAZQIFCXBtdEFtb3VudAUNdmlydFBheUFtb3VudAUGc2NhbGU4BQtuZXdCYWxhbmNlQgQVc2hhcmVUb2tlblRvUGF5QW1vdW50CQBrAwkAlwMBCQDMCAIFE3JhdGlvU2hhcmVUb2tlbnNJbkEJAMwIAgUTcmF0aW9TaGFyZVRva2Vuc0luQgUDbmlsBRBzaGFyZUFzc2V0U3VwcGx5BQZzY2FsZTgJAJkKBwULbmV3QmFsYW5jZUEFC25ld0JhbGFuY2VCBRVzaGFyZVRva2VuVG9QYXlBbW91bnQFEGdvdmVybmFuY2VSZXdhcmQFCGFzc2V0SWRBBQtzdHJBc3NldElkQQULc3RyQXNzZXRJZEIEC25ld0JhbGFuY2VBCAUNJHQwMjM5MTEyNTc5NwJfMQQLbmV3QmFsYW5jZUIIBQ0kdDAyMzkxMTI1Nzk3Al8yBBVzaGFyZVRva2VuVG9QYXlBbW91bnQIBQ0kdDAyMzkxMTI1Nzk3Al8zBAlnb3ZSZXdhcmQIBQ0kdDAyMzkxMTI1Nzk3Al80BA5nb3ZSZXdhcmRBc3NldAgFDSR0MDIzOTExMjU3OTcCXzUEEWdvdlJld2FyZEFzc2V0U3RyCAUNJHQwMjM5MTEyNTc5NwJfNgQNcG10QXNzZXRJZFN0cggFDSR0MDIzOTExMjU3OTcCXzcDCQAAAgUVc2hhcmVUb2tlblRvUGF5QW1vdW50AAAJAAIBAh1Ub28gc21hbGwgYW1vdW50IHRvIHJlcGxlbmlzaAQGc3Rha2UxAwkBCGNvbnRhaW5zAgUNc3Rha2luZ0Fzc2V0cwUNcG10QXNzZXRJZFN0cgkA/AcECAUBaQZjYWxsZXICDHN0YWtlVW5zdGFrZQkAzAgCBgkAzAgCBQlwbXRBbW91bnQJAMwIAgUNcG10QXNzZXRJZFN0cgUDbmlsBQNuaWwAAAMJAAACBQZzdGFrZTEFBnN0YWtlMQQGc3Rha2UyAwkBCGNvbnRhaW5zAgUNc3Rha2luZ0Fzc2V0cwURZ292UmV3YXJkQXNzZXRTdHIJAPwHBAgFAWkGY2FsbGVyAgxzdGFrZVVuc3Rha2UJAMwIAgcJAMwIAgUJZ292UmV3YXJkCQDMCAIFEWdvdlJld2FyZEFzc2V0U3RyBQNuaWwFA25pbAAAAwkAAAIFBnN0YWtlMgUGc3Rha2UyBAxzaGFyZVRva2VuU1QDBQxzdGFrZUZhcm1pbmcEB3JlaXNzdWUJAPwHBAgFAWkGY2FsbGVyAhFyZWlzc3VlU2hhcmVUb2tlbgkAzAgCBRVzaGFyZVRva2VuVG9QYXlBbW91bnQFA25pbAUDbmlsAwkAAAIFB3JlaXNzdWUFB3JlaXNzdWUEBnN0YWtlMwkA/AcEBQ5mYXJtaW5nQWRkcmVzcwIPbG9ja1NoYXJlVG9rZW5zCQDMCAIJAKUIAQgFAWkGY2FsbGVyBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFDHNoYXJlQXNzZXRJZAUVc2hhcmVUb2tlblRvUGF5QW1vdW50BQNuaWwDCQAAAgUGc3Rha2UzBQZzdGFrZTMFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAzAgCCQEHUmVpc3N1ZQMFDHNoYXJlQXNzZXRJZAUVc2hhcmVUb2tlblRvUGF5QW1vdW50BgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQZjYWxsZXIFFXNoYXJlVG9rZW5Ub1BheUFtb3VudAUMc2hhcmVBc3NldElkBQNuaWwJAJQKAgUDbmlsCQCUCgIJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgUJa0JhbGFuY2VBBQtuZXdCYWxhbmNlQQkAzAgCCQEMSW50ZWdlckVudHJ5AgUJa0JhbGFuY2VCBQtuZXdCYWxhbmNlQgkAzAgCCQEMSW50ZWdlckVudHJ5AgURa1NoYXJlQXNzZXRTdXBwbHkJAGQCBRBzaGFyZUFzc2V0U3VwcGx5BRVzaGFyZVRva2VuVG9QYXlBbW91bnQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUPbW9uZXlCb3hBZGRyZXNzBQlnb3ZSZXdhcmQFDmdvdlJld2FyZEFzc2V0BQNuaWwFDHNoYXJlVG9rZW5TVAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCHdpdGhkcmF3BAtjYWxsZXJCeXRlcwRhcmdzCHBBbW91bnRzCXBBc3NldElkcwkBC3ZhbHVlT3JFbHNlAgkBDGlzT3JhY2xlUG9vbAEJAKUIAQgFAWkGY2FsbGVyCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUABAZjYWxsZXIJAQdBZGRyZXNzAQULY2FsbGVyQnl0ZXMEDSR0MDI3NjA5Mjc2OTkJAQ1nZXRQb29sQXNzZXRzAQgFAWkGY2FsbGVyBAtzdHJBc3NldElkQQgFDSR0MDI3NjA5Mjc2OTkCXzEEC3N0ckFzc2V0SWRCCAUNJHQwMjc2MDkyNzY5OQJfMgQIYXNzZXRJZEEIBQ0kdDAyNzYwOTI3Njk5Al8zBAhhc3NldElkQggFDSR0MDI3NjA5Mjc2OTkCXzQEDHNoYXJlQXNzZXRJZAgFDSR0MDI3NjA5Mjc2OTkCXzUEDSR0MDI3NzEyMjc4MzYJAQ9nZXRQb29sQmFsYW5jZXMDCAUBaQZjYWxsZXIFCGFzc2V0SWRBBQhhc3NldElkQgQIYmFsYW5jZUEIBQ0kdDAyNzcxMjI3ODM2Al8xBAhiYWxhbmNlQggFDSR0MDI3NzEyMjc4MzYCXzIED2FjY291bnRCYWxhbmNlQQgFDSR0MDI3NzEyMjc4MzYCXzMED2FjY291bnRCYWxhbmNlQggFDSR0MDI3NzEyMjc4MzYCXzQEEHNoYXJlQXNzZXRTdXBwbHkIBQ0kdDAyNzcxMjI3ODM2Al81BA0kdDAyNzg0OTI4MjU3AwkAAAIJAJADAQUIcEFtb3VudHMAAQQGcEFzc2V0CQERcGFyc2VQYXltZW50QXNzZXQBCQCRAwIFCXBBc3NldElkcwAAAwkBAiE9AgUGcEFzc2V0BQxzaGFyZUFzc2V0SWQJAAIBCQCsAgICJEluY29ycmVjdCBhc3NldCBhdHRhY2hlZC4gRXhwZWN0ZWQ6IAkA2AQBBQxzaGFyZUFzc2V0SWQJAJQKAgkAkQMCBQhwQW1vdW50cwAABQZwQXNzZXQJAJQKAgAABQxzaGFyZUFzc2V0SWQECXBtdEFtb3VudAgFDSR0MDI3ODQ5MjgyNTcCXzEECnBtdEFzc2V0SWQIBQ0kdDAyNzg0OTI4MjU3Al8yAwkAZgIJAJADAQUIcEFtb3VudHMAAQkAAgECHU9uZSBhdHRhY2hlZCBwYXltZW50IGV4cGVjdGVkAwMJAGYCBQhiYWxhbmNlQQUPYWNjb3VudEJhbGFuY2VBBgkAZgIFCGJhbGFuY2VCBQ9hY2NvdW50QmFsYW5jZUIJAJQKAgUDbmlsCQDOCAIJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUGY2FsbGVyBQlwbXRBbW91bnQFCnBtdEFzc2V0SWQFA25pbAkBEXN1c3BlbmRTdXNwaWNpb3VzBgUPYWNjb3VudEJhbGFuY2VBBQ9hY2NvdW50QmFsYW5jZUIFCGJhbGFuY2VBBQhiYWxhbmNlQgULc3RyQXNzZXRJZEEFC3N0ckFzc2V0SWRCBAx1bmxvY2tBbW91bnQJAQ1wYXJzZUludFZhbHVlAQkBC3ZhbHVlT3JFbHNlAgkAkQMCBQRhcmdzAAACATAEBnVubG9jawMJAGYCBQx1bmxvY2tBbW91bnQAAAkA/AcEBQ5mYXJtaW5nQWRkcmVzcwITd2l0aGRyYXdTaGFyZVRva2VucwkAzAgCCQClCAEIBQFpBmNhbGxlcgkAzAgCBQx1bmxvY2tBbW91bnQFA25pbAUDbmlsAAADCQAAAgUGdW5sb2NrBQZ1bmxvY2sEDndpdGhkcmF3QW1vdW50CQBkAgUJcG10QW1vdW50BQx1bmxvY2tBbW91bnQEDGFtb3VudFRvUGF5QQkAawMFDndpdGhkcmF3QW1vdW50BQhiYWxhbmNlQQUQc2hhcmVBc3NldFN1cHBseQQMYW1vdW50VG9QYXlCCQBrAwUOd2l0aGRyYXdBbW91bnQFCGJhbGFuY2VCBRBzaGFyZUFzc2V0U3VwcGx5BAZzdGFrZTEDCQEIY29udGFpbnMCBQ1zdGFraW5nQXNzZXRzBQtzdHJBc3NldElkQQkA/AcECAUBaQZjYWxsZXICDHN0YWtlVW5zdGFrZQkAzAgCBwkAzAgCBQxhbW91bnRUb1BheUEJAMwIAgULc3RyQXNzZXRJZEEFA25pbAUDbmlsAAADCQAAAgUGc3Rha2UxBQZzdGFrZTEEBnN0YWtlMgMJAQhjb250YWlucwIFDXN0YWtpbmdBc3NldHMFC3N0ckFzc2V0SWRCCQD8BwQIBQFpBmNhbGxlcgIMc3Rha2VVbnN0YWtlCQDMCAIHCQDMCAIFDGFtb3VudFRvUGF5QgkAzAgCBQtzdHJBc3NldElkQgUDbmlsBQNuaWwAAAMJAAACBQZzdGFrZTIFBnN0YWtlMgkAlAoCCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgUMdW5sb2NrQW1vdW50BQxzaGFyZUFzc2V0SWQFA25pbAkAlAoCCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQlrQmFsYW5jZUEJAGUCBQhiYWxhbmNlQQUMYW1vdW50VG9QYXlBCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQlrQmFsYW5jZUIJAGUCBQhiYWxhbmNlQgUMYW1vdW50VG9QYXlCCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRFrU2hhcmVBc3NldFN1cHBseQkAZQIFEHNoYXJlQXNzZXRTdXBwbHkFDndpdGhkcmF3QW1vdW50CQDMCAIJAQRCdXJuAgUMc2hhcmVBc3NldElkBQ53aXRoZHJhd0Ftb3VudAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQZjYWxsZXIFDGFtb3VudFRvUGF5QQUIYXNzZXRJZEEJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUGY2FsbGVyBQxhbW91bnRUb1BheUIFCGFzc2V0SWRCBQNuaWwFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARB3aXRoZHJhd09uZVRva2VuBAtjYWxsZXJCeXRlcwRhcmdzCHBBbW91bnRzCXBBc3NldElkcwkBC3ZhbHVlT3JFbHNlAgkBDGlzT3JhY2xlUG9vbAEJAKUIAQgFAWkGY2FsbGVyCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUABAZjYWxsZXIJAQdBZGRyZXNzAQULY2FsbGVyQnl0ZXMEDXdpdGhkcmF3QXNzZXQDCQAAAgkAkQMCBQRhcmdzAAACAAUEdW5pdAkA2QQBCQCRAwIFBGFyZ3MAAAQNJHQwMzA0NjUzMDU1NQkBDWdldFBvb2xBc3NldHMBCAUBaQZjYWxsZXIEC3N0ckFzc2V0SWRBCAUNJHQwMzA0NjUzMDU1NQJfMQQLc3RyQXNzZXRJZEIIBQ0kdDAzMDQ2NTMwNTU1Al8yBAhhc3NldElkQQgFDSR0MDMwNDY1MzA1NTUCXzMECGFzc2V0SWRCCAUNJHQwMzA0NjUzMDU1NQJfNAQMc2hhcmVBc3NldElkCAUNJHQwMzA0NjUzMDU1NQJfNQQNJHQwMzA1NjgzMDY5MgkBD2dldFBvb2xCYWxhbmNlcwMIBQFpBmNhbGxlcgUIYXNzZXRJZEEFCGFzc2V0SWRCBAhiYWxhbmNlQQgFDSR0MDMwNTY4MzA2OTICXzEECGJhbGFuY2VCCAUNJHQwMzA1NjgzMDY5MgJfMgQPYWNjb3VudEJhbGFuY2VBCAUNJHQwMzA1NjgzMDY5MgJfMwQPYWNjb3VudEJhbGFuY2VCCAUNJHQwMzA1NjgzMDY5MgJfNAQQc2hhcmVBc3NldFN1cHBseQgFDSR0MDMwNTY4MzA2OTICXzUEDSR0MDMwNzA1MzEwODUDCQAAAgkAkAMBBQhwQW1vdW50cwABBAZwQXNzZXQJARFwYXJzZVBheW1lbnRBc3NldAEJAJEDAgUJcEFzc2V0SWRzAAADCQECIT0CBQZwQXNzZXQFDHNoYXJlQXNzZXRJZAkAAgEJAKwCAgIkSW5jb3JyZWN0IGFzc2V0IGF0dGFjaGVkLiBFeHBlY3RlZDogCQDYBAEFDHNoYXJlQXNzZXRJZAkAlAoCCQCRAwIFCHBBbW91bnRzAAAFBnBBc3NldAkAlAoCAAAFDHNoYXJlQXNzZXRJZAQJcG10QW1vdW50CAUNJHQwMzA3MDUzMTA4NQJfMQQKcG10QXNzZXRJZAgFDSR0MDMwNzA1MzEwODUCXzIED3ZpcnRNaW5Ub1JlY2l2ZQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBGFyZ3MAAQMJAQIhPQIJAJADAQUIcEFtb3VudHMAAQkAAgECHU9uZSBhdHRhY2hlZCBwYXltZW50IGV4cGVjdGVkAwkBAiE9AgUKcG10QXNzZXRJZAUMc2hhcmVBc3NldElkCQACAQkArAICAiRJbmNvcnJlY3QgYXNzZXQgYXR0YWNoZWQuIEV4cGVjdGVkOiAJANgEAQUMc2hhcmVBc3NldElkAwkBASEBCQEPY29udGFpbnNFbGVtZW50AgkAzAgCBQhhc3NldElkQQkAzAgCBQhhc3NldElkQgUDbmlsBQ13aXRoZHJhd0Fzc2V0CQACAQIZSW5jb3JyZWN0IHdpdGhkcmF3IGFzc2V0LgMDCQBmAgUIYmFsYW5jZUEFD2FjY291bnRCYWxhbmNlQQYJAGYCBQhiYWxhbmNlQgUPYWNjb3VudEJhbGFuY2VCCQCUCgIFA25pbAkAzggCCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFBmNhbGxlcgUJcG10QW1vdW50BQpwbXRBc3NldElkBQNuaWwJARFzdXNwZW5kU3VzcGljaW91cwYFD2FjY291bnRCYWxhbmNlQQUPYWNjb3VudEJhbGFuY2VCBQhiYWxhbmNlQQUIYmFsYW5jZUIFC3N0ckFzc2V0SWRBBQtzdHJBc3NldElkQgQMdW5sb2NrQW1vdW50CQENcGFyc2VJbnRWYWx1ZQEJAQt2YWx1ZU9yRWxzZQIJAJEDAgUEYXJncwACAgEwBAZ1bmxvY2sDCQBmAgUMdW5sb2NrQW1vdW50AAAJAPwHBAUOZmFybWluZ0FkZHJlc3MCE3dpdGhkcmF3U2hhcmVUb2tlbnMJAMwIAgkApQgBCAUBaQZjYWxsZXIJAMwIAgUMdW5sb2NrQW1vdW50BQNuaWwFA25pbAAAAwkAAAIFBnVubG9jawUGdW5sb2NrBA53aXRoZHJhd0Ftb3VudAkAZAIFCXBtdEFtb3VudAUMdW5sb2NrQW1vdW50BAxhbW91bnRUb1BheUEJAGsDBQ53aXRoZHJhd0Ftb3VudAUIYmFsYW5jZUEFEHNoYXJlQXNzZXRTdXBwbHkEDGFtb3VudFRvUGF5QgkAawMFDndpdGhkcmF3QW1vdW50BQhiYWxhbmNlQgUQc2hhcmVBc3NldFN1cHBseQQNJHQwMzIzMzAzMjM4OAkBDGdldEZlZVBhcmFtcwIIBQFpBmNhbGxlcggFAWkMb3JpZ2luQ2FsbGVyBANmZWUIBQ0kdDAzMjMzMDMyMzg4Al8xBAZnb3ZGZWUIBQ0kdDAzMjMzMDMyMzg4Al8yBA0kdDAzMjQwNTMyNzQ1AwkAAAIFDXdpdGhkcmF3QXNzZXQFCGFzc2V0SWRBCQENY2FsY3VsYXRlRmVlcwYFDGFtb3VudFRvUGF5QgUPdmlydE1pblRvUmVjaXZlBQhiYWxhbmNlQgUIYmFsYW5jZUEFA2ZlZQUGZ292RmVlCQENY2FsY3VsYXRlRmVlcwYFDGFtb3VudFRvUGF5QQUPdmlydE1pblRvUmVjaXZlBQhiYWxhbmNlQQUIYmFsYW5jZUIFA2ZlZQUGZ292RmVlBBBhbW91bnRXaXRob3V0RmVlCAUNJHQwMzI0MDUzMjc0NQJfMQQNYW1vdW50V2l0aEZlZQgFDSR0MDMyNDA1MzI3NDUCXzIEEGdvdmVybmFuY2VSZXdhcmQIBQ0kdDAzMjQwNTMyNzQ1Al8zBA0kdDAzMjc2MjM0MTA4AwkAAAIFDXdpdGhkcmF3QXNzZXQFCGFzc2V0SWRBBAd1bnN0YWtlAwkBCGNvbnRhaW5zAgUNc3Rha2luZ0Fzc2V0cwULc3RyQXNzZXRJZEEJAPwHBAgFAWkGY2FsbGVyAgxzdGFrZVVuc3Rha2UJAMwIAgcJAMwIAgkAZAIJAGQCBQxhbW91bnRUb1BheUEFDWFtb3VudFdpdGhGZWUFEGdvdmVybmFuY2VSZXdhcmQJAMwIAgULc3RyQXNzZXRJZEEFA25pbAUDbmlsAAADCQAAAgUHdW5zdGFrZQUHdW5zdGFrZQkAlgoECQBlAgkAZQIJAGUCBQhiYWxhbmNlQQUMYW1vdW50VG9QYXlBBQ1hbW91bnRXaXRoRmVlBRBnb3Zlcm5hbmNlUmV3YXJkBQhiYWxhbmNlQgUIYXNzZXRJZEEJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUGY2FsbGVyCQBkAgUMYW1vdW50VG9QYXlBBQ1hbW91bnRXaXRoRmVlBQhhc3NldElkQQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBAd1bnN0YWtlAwkBCGNvbnRhaW5zAgUNc3Rha2luZ0Fzc2V0cwULc3RyQXNzZXRJZEIJAPwHBAgFAWkGY2FsbGVyAgxzdGFrZVVuc3Rha2UJAMwIAgcJAMwIAgkAZAIJAGQCBQxhbW91bnRUb1BheUIFDWFtb3VudFdpdGhGZWUFEGdvdmVybmFuY2VSZXdhcmQJAMwIAgULc3RyQXNzZXRJZEIFA25pbAUDbmlsAAADCQAAAgUHdW5zdGFrZQUHdW5zdGFrZQkAlgoEBQhiYWxhbmNlQQkAZQIJAGUCCQBlAgUIYmFsYW5jZUIFDGFtb3VudFRvUGF5QgUNYW1vdW50V2l0aEZlZQUQZ292ZXJuYW5jZVJld2FyZAUIYXNzZXRJZEIJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUGY2FsbGVyCQBkAgUMYW1vdW50VG9QYXlCBQ1hbW91bnRXaXRoRmVlBQhhc3NldElkQgUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBAtuZXdCYWxhbmNlQQgFDSR0MDMyNzYyMzQxMDgCXzEEC25ld0JhbGFuY2VCCAUNJHQwMzI3NjIzNDEwOAJfMgQQZ292UmV3YXJkQXNzZXRJZAgFDSR0MDMyNzYyMzQxMDgCXzMEDHVzZXJUcmFuc2ZlcggFDSR0MDMyNzYyMzQxMDgCXzQJAJQKAgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFDHVubG9ja0Ftb3VudAUMc2hhcmVBc3NldElkBQNuaWwJAJQKAgkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQlrQmFsYW5jZUEFC25ld0JhbGFuY2VBCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQlrQmFsYW5jZUIFC25ld0JhbGFuY2VCCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRFrU2hhcmVBc3NldFN1cHBseQkAZQIFEHNoYXJlQXNzZXRTdXBwbHkFDndpdGhkcmF3QW1vdW50CQDMCAIJAQRCdXJuAgUMc2hhcmVBc3NldElkBQ53aXRoZHJhd0Ftb3VudAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQ9tb25leUJveEFkZHJlc3MFEGdvdmVybmFuY2VSZXdhcmQFEGdvdlJld2FyZEFzc2V0SWQFA25pbAUMdXNlclRyYW5zZmVyBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEZdGFrZUludG9BY2NvdW50RXh0cmFGdW5kcwQLY2FsbGVyQnl0ZXMEYXJncwhwQW1vdW50cwlwQXNzZXRJZHMJAQt2YWx1ZU9yRWxzZQIJAQxpc09yYWNsZVBvb2wBCQClCAEIBQFpBmNhbGxlcgkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAQNJHQwMzQ4MzMzNDkwOQkBDWdldFBvb2xBc3NldHMBCAUBaQZjYWxsZXIEC3N0ckFzc2V0SWRBCAUNJHQwMzQ4MzMzNDkwOQJfMQQLc3RyQXNzZXRJZEIIBQ0kdDAzNDgzMzM0OTA5Al8yBAhhc3NldElkQQgFDSR0MDM0ODMzMzQ5MDkCXzMECGFzc2V0SWRCCAUNJHQwMzQ4MzMzNDkwOQJfNAQNJHQwMzQ5MjIzNTAyOAkBD2dldFBvb2xCYWxhbmNlcwMIBQFpBmNhbGxlcgUIYXNzZXRJZEEFCGFzc2V0SWRCBAhiYWxhbmNlQQgFDSR0MDM0OTIyMzUwMjgCXzEECGJhbGFuY2VCCAUNJHQwMzQ5MjIzNTAyOAJfMgQPYWNjb3VudEJhbGFuY2VBCAUNJHQwMzQ5MjIzNTAyOAJfMwQPYWNjb3VudEJhbGFuY2VCCAUNJHQwMzQ5MjIzNTAyOAJfNAQNYW1vdW50RW5yb2xsQQkAZQIFD2FjY291bnRCYWxhbmNlQQUIYmFsYW5jZUEEDWFtb3VudEVucm9sbEIJAGUCBQ9hY2NvdW50QmFsYW5jZUIFCGJhbGFuY2VCAwkBAiE9AgUPbW9uZXlCb3hBZGRyZXNzCAUBaQxvcmlnaW5DYWxsZXIJAAIBAiZPbmx5IHRoZSB3YWxsZXQgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgMDCQBmAgAABQ1hbW91bnRFbnJvbGxBBgkAZgIAAAUNYW1vdW50RW5yb2xsQgkBB3N1c3BlbmQBAhZFbnJvbGwgYW1vdW50IG5lZ2F0aXZlAwMJAAACBQ1hbW91bnRFbnJvbGxBAAAJAAACBQ1hbW91bnRFbnJvbGxCAAAHCQACAQIQTm8gbW9uZXkgdG8gdGFrZQQGc3Rha2UxAwMJAQhjb250YWlucwIFDXN0YWtpbmdBc3NldHMFC3N0ckFzc2V0SWRBCQBmAgUNYW1vdW50RW5yb2xsQQAABwkA/AcEBQR0aGlzAgxzdGFrZVVuc3Rha2UJAMwIAgYJAMwIAgUNYW1vdW50RW5yb2xsQQkAzAgCBQtzdHJBc3NldElkQQUDbmlsBQNuaWwAAAMJAAACBQZzdGFrZTEFBnN0YWtlMQQGc3Rha2UyAwMJAQhjb250YWlucwIFDXN0YWtpbmdBc3NldHMFC3N0ckFzc2V0SWRCCQBmAgUNYW1vdW50RW5yb2xsQgAABwkA/AcEBQR0aGlzAgxzdGFrZVVuc3Rha2UJAMwIAgYJAMwIAgUNYW1vdW50RW5yb2xsQgkAzAgCBQtzdHJBc3NldElkQgUDbmlsBQNuaWwAAAMJAAACBQZzdGFrZTIFBnN0YWtlMgkAlAoCBQNuaWwJAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgUJa0JhbGFuY2VBCQBkAgUIYmFsYW5jZUEFDWFtb3VudEVucm9sbEEJAMwIAgkBDEludGVnZXJFbnRyeQIFCWtCYWxhbmNlQgkAZAIFCGJhbGFuY2VCBQ1hbW91bnRFbnJvbGxCBQNuaWwFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgECdHgBBnZlcmlmeQAEE211bHRpU2lnbmVkQnlBZG1pbnMEEmFkbWluUHViS2V5MVNpZ25lZAMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAFDGFkbWluUHViS2V5MQABAAAEEmFkbWluUHViS2V5MlNpZ25lZAMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAEFDGFkbWluUHViS2V5MgABAAAEEmFkbWluUHViS2V5M1NpZ25lZAMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAIFDGFkbWluUHViS2V5MwABAAAJAGcCCQBkAgkAZAIFEmFkbWluUHViS2V5MVNpZ25lZAUSYWRtaW5QdWJLZXkyU2lnbmVkBRJhZG1pblB1YktleTNTaWduZWQAAgUTbXVsdGlTaWduZWRCeUFkbWluczvT2SU=", "height": 2266084, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: Bz9P6rJGoJT1hMCKddpY611edWW1zwMgyhJKKsaQjUjB Next: none Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let version = "1.0.0"
55
66 let kVersion = "version"
77
88 let kActive = "active"
99
1010 let kAssetIdA = "A_asset_id"
1111
1212 let kAssetIdB = "B_asset_id"
1313
1414 let kBalanceA = "A_asset_balance"
1515
1616 let kBalanceB = "B_asset_balance"
1717
1818 let kBalanceInitA = "A_asset_init"
1919
2020 let kBalanceInitB = "B_asset_init"
2121
2222 let kShareAssetId = "share_asset_id"
2323
2424 let kShareAssetSupply = "share_asset_supply"
2525
2626 let kFee = "commission"
2727
2828 let kCause = "shutdown_cause"
2929
3030 let kFirstHarvest = "first_harvest"
3131
3232 let kFirstHarvestHeight = "first_harvest_height"
3333
3434 let kShareLimit = "share_limit_on_first_harvest"
3535
3636 let kBasePeriod = "base_period"
3737
3838 let kPeriodLength = "period_length"
3939
4040 let kStartHeight = "start_height"
4141
4242 let kUSDNAddress = "staking_usdnnsbt_address"
4343
4444 let kEURNAddress = "staking_eurn_address"
4545
4646 let kLeasingAmount = "leasing_amount"
4747
4848 let kUSDNAssetId = "usdn_asset_id"
4949
5050 let kEURNAssetId = "eurn_asset_id"
5151
5252 let kStakingAssets = "staking_assets"
5353
5454 let kOracleActive = "active_all_contracts"
5555
5656 let kOracleActiveExchangers = "active_global_exchangers"
5757
5858 let kDiscounts = "discounts"
5959
6060 let kDiscountValues = "discount_values"
6161
6262 let kUserSwopInGov = "_SWOP_amount"
6363
6464 let kOraclePool = "pool_"
6565
6666 let kAdminPubKey1 = "admin_pub_1"
6767
6868 let kAdminPubKey2 = "admin_pub_2"
6969
7070 let kAdminPubKey3 = "admin_pub_3"
7171
7272 let kAdminInvokePubKey = "admin_invoke_pub"
7373
7474 let kMoneyBoxAddress = "money_box_address"
7575
7676 let kVotingAddress = "voting_address"
7777
7878 let kGovAddress = "governance_address"
7979
8080 let kFarmingAddress = "farming_address"
8181
8282 let oracle = Address(base58'3NBBWfzZtZtszaXbitTKnrB2xXwv26Bn7H9')
8383
8484 func getBase58FromOracle (key) = match getString(oracle, key) {
8585 case string: String =>
8686 fromBase58String(string)
8787 case nothing =>
8888 throw((key + "is empty"))
8989 }
9090
9191
9292 let adminPubKey1 = getBase58FromOracle(kAdminPubKey1)
9393
9494 let adminPubKey2 = getBase58FromOracle(kAdminPubKey2)
9595
9696 let adminPubKey3 = getBase58FromOracle(kAdminPubKey3)
9797
9898 let adminInvokePubKey = getBase58FromOracle(kAdminInvokePubKey)
9999
100100 let moneyBoxAddress = Address(getBase58FromOracle(kMoneyBoxAddress))
101101
102102 let votingAddress = Address(getBase58FromOracle(kVotingAddress))
103103
104104 let govAddress = Address(getBase58FromOracle(kGovAddress))
105105
106106 let farmingAddress = Address(getBase58FromOracle(kFarmingAddress))
107107
108108 let USDN = getBase58FromOracle(kUSDNAssetId)
109109
110110 let EURN = getBase58FromOracle(kEURNAssetId)
111111
112112 let stakingAssets = getStringValue(oracle, kStakingAssets)
113113
114114 let stakingUSDNAddress = Address(getBase58FromOracle(kUSDNAddress))
115115
116116 let stakingEURNAddress = Address(getBase58FromOracle(kEURNAddress))
117117
118118 let basePeriod = valueOrErrorMessage(getInteger(votingAddress, kBasePeriod), "Empty kBasePeriod")
119119
120120 let startHeight = valueOrErrorMessage(getInteger(votingAddress, kStartHeight), "Empty kStartHeight")
121121
122122 let periodLength = valueOrErrorMessage(getInteger(votingAddress, kPeriodLength), "Empty kPeriodLength")
123123
124124 let firstHarvestEndPeriod = ((basePeriod + ((height - startHeight) / periodLength)) + 3)
125125
126126 let active = if (getBooleanValue(oracle, kOracleActive))
127127 then getBooleanValue(oracle, kOracleActiveExchangers)
128128 else false
129129
130130 let feeScale6 = 1000000
131131
132132 let scale8 = 100000000
133133
134134 func accountBalance (assetId,pool) = match assetId {
135135 case id: ByteVector =>
136136 assetBalance(pool, id)
137137 case waves: Unit =>
138138 wavesBalance(pool).available
139139 case _ =>
140140 throw("Match error")
141141 }
142142
143143
144144 func stakedAmount (assetId,pool) = {
145145 let stakedAmountCalculated = match assetId {
146146 case aId: ByteVector =>
147147 if ((aId == USDN))
148148 then getInteger(stakingUSDNAddress, ((("rpd_balance_" + toBase58String(aId)) + "_") + toString(pool)))
149149 else if ((aId == EURN))
150150 then getInteger(stakingEURNAddress, ((("%s%s%s__stakingBalance__" + toBase58String(aId)) + "__") + toString(pool)))
151151 else 0
152152 case _: Unit =>
153153 valueOrElse(getInteger(pool, kLeasingAmount), 0)
154154 case _ =>
155155 throw("Match error")
156156 }
157157 match stakedAmountCalculated {
158158 case i: Int =>
159159 i
160160 case _ =>
161161 0
162162 }
163163 }
164164
165165
166166 func getAssetInfo (assetId) = match assetId {
167167 case id: String|ByteVector =>
168168 let $t039674139 = match id {
169169 case aId: ByteVector =>
170170 $Tuple2(toBase58String(aId), aId)
171171 case aId: String =>
172172 $Tuple2(aId, fromBase58String(aId))
173173 case _ =>
174174 throw("Match error")
175175 }
176176 let stringId = $t039674139._1
177177 let bytesId = $t039674139._2
178178 let info = valueOrErrorMessage(assetInfo(bytesId), (("Asset " + stringId) + " doesn't exist"))
179179 $Tuple3(stringId, info.name, info.decimals)
180180 case waves: Unit =>
181181 $Tuple3("WAVES", "WAVES", 8)
182182 case _ =>
183183 throw("Match error")
184184 }
185185
186186
187187 func suspend (cause) = [BooleanEntry(kActive, false), StringEntry(kCause, cause)]
188188
189189
190190 func calculateFeeDiscount (userAddr) = {
191191 let swopAmount = valueOrElse(getInteger(govAddress, (toString(userAddr) + kUserSwopInGov)), 0)
192192 let discountValues = split(getStringValue(oracle, kDiscountValues), ",")
193193 let discounts = split(getStringValue(oracle, kDiscounts), ",")
194194 if (if ((swopAmount >= parseIntValue(discountValues[0])))
195195 then (parseIntValue(discountValues[1]) > swopAmount)
196196 else false)
197197 then (feeScale6 - parseIntValue(discounts[0]))
198198 else if (if ((swopAmount >= parseIntValue(discountValues[1])))
199199 then (parseIntValue(discountValues[2]) > swopAmount)
200200 else false)
201201 then (feeScale6 - parseIntValue(discounts[1]))
202202 else if (if ((swopAmount >= parseIntValue(discountValues[2])))
203203 then (parseIntValue(discountValues[3]) > swopAmount)
204204 else false)
205205 then (feeScale6 - parseIntValue(discounts[2]))
206206 else if (if ((swopAmount >= parseIntValue(discountValues[3])))
207207 then (parseIntValue(discountValues[4]) > swopAmount)
208208 else false)
209209 then (feeScale6 - parseIntValue(discounts[3]))
210210 else if ((swopAmount >= parseIntValue(discountValues[4])))
211211 then (feeScale6 - parseIntValue(discounts[4]))
212212 else feeScale6
213213 }
214214
215215
216216 func calculateFees (pmtAmount,minAmountToReceive,tokenFrom,tokenTo,fee,feeGovernance) = {
217217 let amountWithoutFee = fraction(tokenTo, pmtAmount, (pmtAmount + tokenFrom))
218218 let amountWithFee = fraction(amountWithoutFee, (feeScale6 - fee), feeScale6)
219219 let governanceReward = fraction(amountWithoutFee, feeGovernance, feeScale6)
220220 if ((minAmountToReceive > amountWithFee))
221221 then throw(((("Calculated amount to receive " + toString(amountWithFee)) + " is less than specified minimum ") + toString(minAmountToReceive)))
222222 else $Tuple3(amountWithoutFee, amountWithFee, governanceReward)
223223 }
224224
225225
226226 func calculateVirtGet (pmtAmount,balance,fee) = {
227227 let a = 1
228228 let b = (((balance + fraction(balance, (feeScale6 - fee), feeScale6)) + fraction(pmtAmount, (feeScale6 - fee), feeScale6)) - pmtAmount)
229229 let c = (-(toBigInt(balance)) * toBigInt(pmtAmount))
230230 let D = ((toBigInt(b) * toBigInt(b)) - ((toBigInt(4) * toBigInt(a)) * c))
231231 (toInt(((-(toBigInt(b)) + pow(D, 0, toBigInt(5), 1, 0, DOWN)) / toBigInt(2))) * a)
232232 }
233233
234234
235235 func parsePaymentAsset (assetId) = if ((assetId == base58''))
236236 then unit
237237 else assetId
238238
239239
240240 func suspendSuspicious (accountBalanceA,accountBalanceB,balanceA,balanceB,assetIdA,assetIdB) = suspend(((((((((((((((("Suspicious state. Actual balances: " + toString(accountBalanceA)) + " ") + assetIdA) + ", ") + toString(accountBalanceB)) + " ") + assetIdB) + ". State: ") + toString(balanceA)) + " ") + assetIdA) + ", ") + toString(balanceB)) + " ") + assetIdB))
241241
242242
243243 func isActive () = if (active)
244244 then unit
245245 else throw("DApp is inactive at this moment")
246246
247247
248248 func isOraclePool (poolAddress) = if (isDefined(getString(oracle, (kOraclePool + poolAddress))))
249249 then unit
250250 else throw("DApp is not registered pool")
251251
252252
253253 func getPoolBalances (pool,assetIdA,assetIdB) = {
254254 let balanceA = getIntegerValue(pool, kBalanceA)
255255 let balanceB = getIntegerValue(pool, kBalanceB)
256256 let stakedAmountA = stakedAmount(assetIdA, pool)
257257 let stakedAmountB = stakedAmount(assetIdB, pool)
258258 let accountBalanceA = (accountBalance(assetIdA, pool) + stakedAmountA)
259259 let accountBalanceB = (accountBalance(assetIdB, pool) + stakedAmountB)
260260 let shareSupply = getIntegerValue(pool, kShareAssetSupply)
261261 $Tuple5(balanceA, balanceB, accountBalanceA, accountBalanceB, shareSupply)
262262 }
263263
264264
265265 func getPoolAssets (pool) = {
266266 let strAssetIdA = getStringValue(pool, kAssetIdA)
267267 let strAssetIdB = getStringValue(pool, kAssetIdB)
268268 let assetIdA = if ((strAssetIdA == "WAVES"))
269269 then unit
270270 else fromBase58String(strAssetIdA)
271271 let assetIdB = if ((strAssetIdB == "WAVES"))
272272 then unit
273273 else fromBase58String(strAssetIdB)
274274 let shareAssetId = fromBase58String(getStringValue(pool, kShareAssetId))
275275 $Tuple5(strAssetIdA, strAssetIdB, assetIdA, assetIdB, shareAssetId)
276276 }
277277
278278
279279 func getFeeParams (pool,caller) = {
280280 let feeDiscount = calculateFeeDiscount(caller)
281281 let fee = fraction(getIntegerValue(pool, kFee), feeDiscount, feeScale6, CEILING)
282282 let govFee = fraction(fraction(fee, 40, 100), feeDiscount, feeScale6, CEILING)
283283 $Tuple2(fee, govFee)
284284 }
285285
286286
287287 @Callable(i)
288288 func init (callerBytes,args,pAmounts,pAssetIds) = {
289289 let caller = Address(callerBytes)
290290 let $t088518929 = $Tuple2(pAmounts[0], parsePaymentAsset(pAssetIds[0]))
291291 let pmtAmountA = $t088518929._1
292292 let pmtAssetIdA = $t088518929._2
293293 let $t089349012 = $Tuple2(pAmounts[1], parsePaymentAsset(pAssetIds[1]))
294294 let pmtAmountB = $t089349012._1
295295 let pmtAssetIdB = $t089349012._2
296296 if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminInvokePubKey], i.originCallerPublicKey)))
297297 then throw("Only admin can call this function")
298298 else if (isDefined(getBoolean(caller, kActive)))
299299 then throw("DApp is already active")
300300 else if ((pmtAssetIdA == pmtAssetIdB))
301301 then throw("Assets must be different")
302302 else {
303303 let $t093829459 = getAssetInfo(pmtAssetIdA)
304304 let pmtStrAssetIdA = $t093829459._1
305305 let pmtAssetNameA = $t093829459._2
306306 let pmtDecimalsA = $t093829459._3
307307 let $t094689545 = getAssetInfo(pmtAssetIdB)
308308 let pmtStrAssetIdB = $t094689545._1
309309 let pmtAssetNameB = $t094689545._2
310310 let pmtDecimalsB = $t094689545._3
311311 let firstHarvest = (args[0] == "true")
312312 let shareName = ((("s" + take(pmtAssetNameA, 7)) + "_") + take(pmtAssetNameB, 7))
313313 let shareDescription = ((((("ShareToken of SwopFi protocol for " + pmtAssetNameA) + " and ") + pmtAssetNameB) + " at address ") + toString(this))
314314 let shareDecimals = ((pmtDecimalsA + pmtDecimalsB) / 2)
315315 let arg1 = pow(pmtAmountA, pmtDecimalsA, 5, 1, pmtDecimalsA, DOWN)
316316 let arg2 = pow(pmtAmountB, pmtDecimalsB, 5, 1, pmtDecimalsB, DOWN)
317317 let arg3 = pow(10, 0, shareDecimals, 0, 0, DOWN)
318318 let shareInitialSupply = fraction(arg1, arg2, arg3)
319319 let shareIssue = Issue(shareName, shareDescription, shareInitialSupply, shareDecimals, true)
320320 let shareIssueId = calculateAssetId(shareIssue)
321321 let stake1 = if (contains(stakingAssets, pmtStrAssetIdA))
322322 then invoke(i.caller, "stakeUnstake", [true, pmtAmountA, pmtStrAssetIdA], nil)
323323 else 0
324324 if ((stake1 == stake1))
325325 then {
326326 let stake2 = if (contains(stakingAssets, pmtStrAssetIdB))
327327 then invoke(i.caller, "stakeUnstake", [true, pmtAmountB, pmtStrAssetIdB], nil)
328328 else 0
329329 if ((stake2 == stake2))
330330 then {
331331 let baseEntry = [StringEntry(kVersion, version), BooleanEntry(kActive, true), StringEntry(kAssetIdA, pmtStrAssetIdA), StringEntry(kAssetIdB, pmtStrAssetIdB), IntegerEntry(kBalanceA, pmtAmountA), IntegerEntry(kBalanceB, pmtAmountB), IntegerEntry(kFee, getIntegerValue(oracle, "base_fee_cpmm")), shareIssue, StringEntry(kShareAssetId, toBase58String(shareIssueId)), IntegerEntry(kShareAssetSupply, shareInitialSupply), ScriptTransfer(caller, shareInitialSupply, shareIssueId)]
332332 if (firstHarvest)
333333 then $Tuple2(nil, $Tuple2((baseEntry ++ [BooleanEntry(kFirstHarvest, firstHarvest), IntegerEntry(kFirstHarvestHeight, (startHeight + (firstHarvestEndPeriod * periodLength)))]), nil))
334334 else $Tuple2(nil, $Tuple2(baseEntry, nil))
335335 }
336336 else throw("Strict value is not equal to itself.")
337337 }
338338 else throw("Strict value is not equal to itself.")
339339 }
340340 }
341341
342342
343343
344344 @Callable(i)
345345 func initWithInitRatio (callerBytes,args,pAmounts,pAssetIds) = {
346346 let caller = Address(callerBytes)
347347 let $t01179011990 = $Tuple5(parseIntValue(args[0]), parseIntValue(args[1]), args[2], args[3], (args[4] == "true"))
348348 let amtAssetA = $t01179011990._1
349349 let amtAssetB = $t01179011990._2
350350 let assetIdAStr = $t01179011990._3
351351 let assetIdBStr = $t01179011990._4
352352 let firstHarvest = $t01179011990._5
353353 if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminInvokePubKey], i.originCallerPublicKey)))
354354 then throw("Only admin can call this function")
355355 else if (isDefined(getBoolean(caller, kActive)))
356356 then throw("DApp is already active")
357357 else if ((assetIdAStr == assetIdBStr))
358358 then throw("Assets must be different")
359359 else {
360360 let $t01236012437 = getAssetInfo(assetIdAStr)
361361 let pmtStrAssetIdA = $t01236012437._1
362362 let pmtAssetNameA = $t01236012437._2
363363 let pmtDecimalsA = $t01236012437._3
364364 let $t01244612523 = getAssetInfo(assetIdBStr)
365365 let pmtStrAssetIdB = $t01244612523._1
366366 let pmtAssetNameB = $t01244612523._2
367367 let pmtDecimalsB = $t01244612523._3
368368 let shareName = ((("s" + take(pmtAssetNameA, 7)) + "_") + take(pmtAssetNameB, 7))
369369 let shareDescription = ((((("ShareToken of SwopFi protocol for " + pmtAssetNameA) + " and ") + pmtAssetNameB) + " at address ") + toString(this))
370370 let shareDecimals = ((pmtDecimalsA + pmtDecimalsB) / 2)
371371 let shareInitialSupply = 0
372372 let shareIssue = Issue(shareName, shareDescription, shareInitialSupply, shareDecimals, true)
373373 let shareIssueId = calculateAssetId(shareIssue)
374374 let baseEntry = [StringEntry(kVersion, version), BooleanEntry(kActive, true), StringEntry(kAssetIdA, pmtStrAssetIdA), StringEntry(kAssetIdB, pmtStrAssetIdB), IntegerEntry(kBalanceInitA, amtAssetA), IntegerEntry(kBalanceInitB, amtAssetB), IntegerEntry(kBalanceA, 0), IntegerEntry(kBalanceB, 0), IntegerEntry(kFee, getIntegerValue(oracle, "base_fee_cpmm")), shareIssue, StringEntry(kShareAssetId, toBase58String(shareIssueId)), IntegerEntry(kShareAssetSupply, shareInitialSupply)]
375375 if (firstHarvest)
376376 then $Tuple2(nil, $Tuple2((baseEntry ++ [BooleanEntry(kFirstHarvest, firstHarvest), IntegerEntry(kFirstHarvestHeight, (startHeight + (firstHarvestEndPeriod * periodLength)))]), nil))
377377 else $Tuple2(nil, $Tuple2(baseEntry, nil))
378378 }
379379 }
380380
381381
382382
383383 @Callable(i)
384384 func keepLimitForFirstHarvest (callerBytes,args,pAmounts,pAssetIds) = valueOrElse(isOraclePool(toString(i.caller)), valueOrElse(isActive(), if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminInvokePubKey], i.originCallerPublicKey)))
385385 then throw("Only admin can call this function")
386386 else {
387387 let shareLimit = parseIntValue(args[0])
388388 $Tuple2(nil, $Tuple2([IntegerEntry(kShareLimit, shareLimit)], nil))
389389 }))
390390
391391
392392
393393 @Callable(i)
394394 func exchange (callerBytes,args,pAmounts,pAssetIds) = valueOrElse(isOraclePool(toString(i.caller)), valueOrElse(isActive(), {
395395 let caller = Address(callerBytes)
396396 let $t01484814924 = $Tuple2(pAmounts[0], parsePaymentAsset(pAssetIds[0]))
397397 let pmtAmount = $t01484814924._1
398398 let pmtAssetId = $t01484814924._2
399399 let minAmountToReceive = parseIntValue(args[0])
400400 let $t01499715073 = getPoolAssets(i.caller)
401401 let strAssetIdA = $t01499715073._1
402402 let strAssetIdB = $t01499715073._2
403403 let assetIdA = $t01499715073._3
404404 let assetIdB = $t01499715073._4
405405 let $t01508615192 = getPoolBalances(i.caller, assetIdA, assetIdB)
406406 let balanceA = $t01508615192._1
407407 let balanceB = $t01508615192._2
408408 let accountBalanceA = $t01508615192._3
409409 let accountBalanceB = $t01508615192._4
410410 if (if ((balanceA == 0))
411411 then true
412412 else (balanceB == 0))
413413 then throw("Can't exchange with zero balance")
414414 else if ((0 >= minAmountToReceive))
415415 then throw(("Minimal amount to receive must be positive. Actual: " + toString(minAmountToReceive)))
416416 else if ((size(pAmounts) != 1))
417417 then throw("One attached payment expected")
418418 else if (!(containsElement([assetIdA, assetIdB], pmtAssetId)))
419419 then throw(((("Incorrect asset attached. Expected: " + strAssetIdA) + " or ") + strAssetIdB))
420420 else if (if ((balanceA > accountBalanceA))
421421 then true
422422 else (balanceB > accountBalanceB))
423423 then $Tuple2(nil, ([ScriptTransfer(caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious(accountBalanceA, accountBalanceB, balanceA, balanceB, strAssetIdA, strAssetIdB)))
424424 else {
425425 let $t01607716135 = getFeeParams(i.caller, i.originCaller)
426426 let fee = $t01607716135._1
427427 let govFee = $t01607716135._2
428428 let $t01615216489 = if ((pmtAssetId == assetIdA))
429429 then calculateFees(pmtAmount, minAmountToReceive, balanceA, balanceB, fee, govFee)
430430 else calculateFees(pmtAmount, minAmountToReceive, balanceB, balanceA, fee, govFee)
431431 let amountWithoutFee = $t01615216489._1
432432 let amountWithFee = $t01615216489._2
433433 let governanceReward = $t01615216489._3
434434 let $t01650716832 = if ((pmtAssetId == assetIdA))
435435 then $Tuple3((balanceA + pmtAmount), ((balanceB - amountWithFee) - governanceReward), assetIdB)
436436 else $Tuple3(((balanceA - amountWithFee) - governanceReward), (balanceB + pmtAmount), assetIdA)
437437 let newBalanceA = $t01650716832._1
438438 let newBalanceB = $t01650716832._2
439439 let assetIdSend = $t01650716832._3
440440 let $t01685017100 = if ((pmtAssetId == assetIdA))
441441 then $Tuple2(pmtAmount, (amountWithFee + governanceReward))
442442 else $Tuple2((amountWithFee + governanceReward), pmtAmount)
443443 let stakeAmountA = $t01685017100._1
444444 let stakeAmountB = $t01685017100._2
445445 let stake1 = if (contains(stakingAssets, strAssetIdA))
446446 then invoke(i.caller, "stakeUnstake", [(pmtAssetId == assetIdA), stakeAmountA, strAssetIdA], nil)
447447 else 0
448448 if ((stake1 == stake1))
449449 then {
450450 let stake2 = if (contains(stakingAssets, strAssetIdB))
451451 then invoke(i.caller, "stakeUnstake", [(pmtAssetId == assetIdB), stakeAmountB, strAssetIdB], nil)
452452 else 0
453453 if ((stake2 == stake2))
454454 then $Tuple2(nil, $Tuple2([IntegerEntry(kBalanceA, newBalanceA), IntegerEntry(kBalanceB, newBalanceB), ScriptTransfer(caller, amountWithFee, assetIdSend), ScriptTransfer(moneyBoxAddress, governanceReward, assetIdSend)], [amountWithFee, assetIdSend]))
455455 else throw("Strict value is not equal to itself.")
456456 }
457457 else throw("Strict value is not equal to itself.")
458458 }
459459 }))
460460
461461
462462
463463 @Callable(i)
464464 func replenishWithTwoTokens (callerBytes,args,pAmounts,pAssetIds) = valueOrElse(isOraclePool(toString(i.caller)), valueOrElse(isActive(), {
465465 let caller = Address(callerBytes)
466466 let pmtAssetIdA = parsePaymentAsset(pAssetIds[0])
467467 let pmtAssetIdB = parsePaymentAsset(pAssetIds[1])
468468 let stakeFarming = (args[0] == "true")
469469 let $t01831218402 = getPoolAssets(i.caller)
470470 let strAssetIdA = $t01831218402._1
471471 let strAssetIdB = $t01831218402._2
472472 let assetIdA = $t01831218402._3
473473 let assetIdB = $t01831218402._4
474474 let shareAssetId = $t01831218402._5
475475 let $t01841518539 = getPoolBalances(i.caller, assetIdA, assetIdB)
476476 let balanceA = $t01841518539._1
477477 let balanceB = $t01841518539._2
478478 let accountBalanceA = $t01841518539._3
479479 let accountBalanceB = $t01841518539._4
480480 let shareAssetSupply = $t01841518539._5
481481 if ((size(pAmounts) != 2))
482482 then throw("Two attached assets expected")
483483 else if (if ((pmtAssetIdA != assetIdA))
484484 then true
485485 else (pmtAssetIdB != assetIdB))
486486 then throw(((("Incorrect assets attached. Expected: " + strAssetIdA) + " and ") + strAssetIdB))
487487 else if (if ((balanceA > accountBalanceA))
488488 then true
489489 else (balanceB > accountBalanceB))
490490 then $Tuple2(nil, ([ScriptTransfer(caller, pAmounts[0], pmtAssetIdA), ScriptTransfer(caller, pAmounts[1], pmtAssetIdB)] ++ suspendSuspicious(accountBalanceA, accountBalanceB, balanceA, balanceB, strAssetIdA, strAssetIdB)))
491491 else {
492492 let $t01921119288 = getAssetInfo(pmtAssetIdA)
493493 let pmtStrAssetIdA = $t01921119288._1
494494 let pmtAssetNameA = $t01921119288._2
495495 let pmtDecimalsA = $t01921119288._3
496496 let $t01930519382 = getAssetInfo(pmtAssetIdB)
497497 let pmtStrAssetIdB = $t01930519382._1
498498 let pmtAssetNameB = $t01930519382._2
499499 let pmtDecimalsB = $t01930519382._3
500500 let initial = ((balanceA + balanceB) == 0)
501501 let $t01945720300 = if (initial)
502502 then $Tuple5(pAmounts[0], pAmounts[1], 0, pmtAssetIdA, 1)
503503 else {
504504 let ratioShareTokensInA = fraction(scale8, pAmounts[0], balanceA)
505505 let ratioShareTokensInB = fraction(scale8, pAmounts[1], balanceB)
506506 if ((ratioShareTokensInB > ratioShareTokensInA))
507507 then {
508508 let pmt = fraction(pAmounts[0], balanceB, balanceA)
509509 $Tuple5(pAmounts[0], pmt, (pAmounts[1] - pmt), pmtAssetIdB, ratioShareTokensInA)
510510 }
511511 else {
512512 let pmt = fraction(pAmounts[1], balanceA, balanceB)
513513 $Tuple5(pmt, pAmounts[1], (pAmounts[0] - pmt), pmtAssetIdA, ratioShareTokensInB)
514514 }
515515 }
516516 let pmtAmountA = $t01945720300._1
517517 let pmtAmountB = $t01945720300._2
518518 let change = $t01945720300._3
519519 let changeAssetId = $t01945720300._4
520520 let shareTokenRatio = $t01945720300._5
521521 let shareTokenToPayAmount = if (initial)
522522 then {
523523 let shareDecimals = ((pmtDecimalsA + pmtDecimalsB) / 2)
524524 fraction(pow(pmtAmountA, pmtDecimalsA, 5, 1, pmtDecimalsA, DOWN), pow(pmtAmountB, pmtDecimalsB, 5, 1, pmtDecimalsB, DOWN), pow(10, 0, shareDecimals, 0, 0, DOWN))
525525 }
526526 else fraction(shareTokenRatio, shareAssetSupply, scale8)
527527 if ((shareTokenToPayAmount == 0))
528528 then throw("Too small amount to replenish")
529529 else if ((0 > change))
530530 then throw("Change < 0")
531531 else {
532532 let stake1 = if (contains(stakingAssets, pmtStrAssetIdA))
533533 then invoke(i.caller, "stakeUnstake", [true, pmtAmountA, pmtStrAssetIdA], nil)
534534 else 0
535535 if ((stake1 == stake1))
536536 then {
537537 let stake2 = if (contains(stakingAssets, pmtStrAssetIdB))
538538 then invoke(i.caller, "stakeUnstake", [true, pmtAmountB, pmtStrAssetIdB], nil)
539539 else 0
540540 if ((stake2 == stake2))
541541 then {
542542 let shareTokenST = if (stakeFarming)
543543 then {
544544 let reissue = invoke(i.caller, "reissueShareToken", [shareTokenToPayAmount], nil)
545545 if ((reissue == reissue))
546546 then {
547547 let stake3 = invoke(farmingAddress, "lockShareTokens", [toString(i.caller)], [AttachedPayment(shareAssetId, shareTokenToPayAmount)])
548548 if ((stake3 == stake3))
549549 then nil
550550 else throw("Strict value is not equal to itself.")
551551 }
552552 else throw("Strict value is not equal to itself.")
553553 }
554554 else [Reissue(shareAssetId, shareTokenToPayAmount, true), ScriptTransfer(caller, shareTokenToPayAmount, shareAssetId)]
555555 $Tuple2(nil, $Tuple2(([IntegerEntry(kBalanceA, (balanceA + pmtAmountA)), IntegerEntry(kBalanceB, (balanceB + pmtAmountB)), IntegerEntry(kShareAssetSupply, (shareAssetSupply + shareTokenToPayAmount)), ScriptTransfer(caller, change, changeAssetId)] ++ shareTokenST), nil))
556556 }
557557 else throw("Strict value is not equal to itself.")
558558 }
559559 else throw("Strict value is not equal to itself.")
560560 }
561561 }
562562 }))
563563
564564
565565
566566 @Callable(i)
567567 func replenishWithOneToken (callerBytes,args,pAmounts,pAssetIds) = valueOrElse(isOraclePool(toString(i.caller)), valueOrElse(isActive(), {
568568 let caller = Address(callerBytes)
569569 let pmtAssetId = parsePaymentAsset(pAssetIds[0])
570570 let pmtAmount = pAmounts[0]
571571 let virtGetMinAmount = parseIntValue(args[0])
572572 let stakeFarming = (args[1] == "true")
573573 let $t02285522945 = getPoolAssets(i.caller)
574574 let strAssetIdA = $t02285522945._1
575575 let strAssetIdB = $t02285522945._2
576576 let assetIdA = $t02285522945._3
577577 let assetIdB = $t02285522945._4
578578 let shareAssetId = $t02285522945._5
579579 let $t02295823082 = getPoolBalances(i.caller, assetIdA, assetIdB)
580580 let balanceA = $t02295823082._1
581581 let balanceB = $t02295823082._2
582582 let accountBalanceA = $t02295823082._3
583583 let accountBalanceB = $t02295823082._4
584584 let shareAssetSupply = $t02295823082._5
585585 let initial = ((balanceA + balanceB) == 0)
586586 if ((size(pAmounts) != 1))
587587 then throw("One attached assets expected")
588588 else if (if ((pmtAssetId != assetIdA))
589589 then (pmtAssetId != assetIdB)
590590 else false)
591591 then throw(((("Incorrect asset attached. Expected: " + strAssetIdA) + " or ") + strAssetIdB))
592592 else if (initial)
593593 then throw("For initial exchanger you need to use two tokens")
594594 else if (if ((balanceA > accountBalanceA))
595595 then true
596596 else (balanceB > accountBalanceB))
597597 then $Tuple2(nil, ([ScriptTransfer(caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious(accountBalanceA, accountBalanceB, balanceA, balanceB, strAssetIdA, strAssetIdB)))
598598 else {
599599 let $t02383623894 = getFeeParams(i.caller, i.originCaller)
600600 let fee = $t02383623894._1
601601 let govFee = $t02383623894._2
602602 let $t02391125797 = if ((pmtAssetId == assetIdA))
603603 then {
604604 let virtPayAmount = calculateVirtGet(pmtAmount, balanceA, fee)
605605 let $t02419024327 = calculateFees(virtPayAmount, virtGetMinAmount, balanceA, balanceB, fee, govFee)
606606 let amountWithoutFee = $t02419024327._1
607607 let amountWithFee = $t02419024327._2
608608 let governanceReward = $t02419024327._3
609609 let newBalanceA = (balanceA + pmtAmount)
610610 let newBalanceB = (balanceB - governanceReward)
611611 let ratioShareTokensInA = fraction((pmtAmount - virtPayAmount), scale8, newBalanceA)
612612 let ratioShareTokensInB = fraction(amountWithFee, scale8, newBalanceB)
613613 let shareTokenToPayAmount = fraction(min([ratioShareTokensInA, ratioShareTokensInB]), shareAssetSupply, scale8)
614614 $Tuple7(newBalanceA, newBalanceB, shareTokenToPayAmount, governanceReward, assetIdB, strAssetIdB, strAssetIdA)
615615 }
616616 else {
617617 let virtPayAmount = calculateVirtGet(pmtAmount, balanceB, fee)
618618 let $t02506225199 = calculateFees(virtPayAmount, virtGetMinAmount, balanceB, balanceA, fee, govFee)
619619 let amountWithoutFee = $t02506225199._1
620620 let amountWithFee = $t02506225199._2
621621 let governanceReward = $t02506225199._3
622622 let newBalanceA = (balanceA - governanceReward)
623623 let newBalanceB = (balanceB + pmtAmount)
624624 let ratioShareTokensInA = fraction(amountWithFee, scale8, newBalanceA)
625625 let ratioShareTokensInB = fraction((pmtAmount - virtPayAmount), scale8, newBalanceB)
626626 let shareTokenToPayAmount = fraction(min([ratioShareTokensInA, ratioShareTokensInB]), shareAssetSupply, scale8)
627627 $Tuple7(newBalanceA, newBalanceB, shareTokenToPayAmount, governanceReward, assetIdA, strAssetIdA, strAssetIdB)
628628 }
629629 let newBalanceA = $t02391125797._1
630630 let newBalanceB = $t02391125797._2
631631 let shareTokenToPayAmount = $t02391125797._3
632632 let govReward = $t02391125797._4
633633 let govRewardAsset = $t02391125797._5
634634 let govRewardAssetStr = $t02391125797._6
635635 let pmtAssetIdStr = $t02391125797._7
636636 if ((shareTokenToPayAmount == 0))
637637 then throw("Too small amount to replenish")
638638 else {
639639 let stake1 = if (contains(stakingAssets, pmtAssetIdStr))
640640 then invoke(i.caller, "stakeUnstake", [true, pmtAmount, pmtAssetIdStr], nil)
641641 else 0
642642 if ((stake1 == stake1))
643643 then {
644644 let stake2 = if (contains(stakingAssets, govRewardAssetStr))
645645 then invoke(i.caller, "stakeUnstake", [false, govReward, govRewardAssetStr], nil)
646646 else 0
647647 if ((stake2 == stake2))
648648 then {
649649 let shareTokenST = if (stakeFarming)
650650 then {
651651 let reissue = invoke(i.caller, "reissueShareToken", [shareTokenToPayAmount], nil)
652652 if ((reissue == reissue))
653653 then {
654654 let stake3 = invoke(farmingAddress, "lockShareTokens", [toString(i.caller)], [AttachedPayment(shareAssetId, shareTokenToPayAmount)])
655655 if ((stake3 == stake3))
656656 then nil
657657 else throw("Strict value is not equal to itself.")
658658 }
659659 else throw("Strict value is not equal to itself.")
660660 }
661661 else [Reissue(shareAssetId, shareTokenToPayAmount, true), ScriptTransfer(caller, shareTokenToPayAmount, shareAssetId)]
662662 $Tuple2(nil, $Tuple2(([IntegerEntry(kBalanceA, newBalanceA), IntegerEntry(kBalanceB, newBalanceB), IntegerEntry(kShareAssetSupply, (shareAssetSupply + shareTokenToPayAmount)), ScriptTransfer(moneyBoxAddress, govReward, govRewardAsset)] ++ shareTokenST), nil))
663663 }
664664 else throw("Strict value is not equal to itself.")
665665 }
666666 else throw("Strict value is not equal to itself.")
667667 }
668668 }
669669 }))
670670
671671
672672
673673 @Callable(i)
674674 func withdraw (callerBytes,args,pAmounts,pAssetIds) = valueOrElse(isOraclePool(toString(i.caller)), valueOrElse(isActive(), {
675675 let caller = Address(callerBytes)
676676 let $t02760927699 = getPoolAssets(i.caller)
677677 let strAssetIdA = $t02760927699._1
678678 let strAssetIdB = $t02760927699._2
679679 let assetIdA = $t02760927699._3
680680 let assetIdB = $t02760927699._4
681681 let shareAssetId = $t02760927699._5
682682 let $t02771227836 = getPoolBalances(i.caller, assetIdA, assetIdB)
683683 let balanceA = $t02771227836._1
684684 let balanceB = $t02771227836._2
685685 let accountBalanceA = $t02771227836._3
686686 let accountBalanceB = $t02771227836._4
687687 let shareAssetSupply = $t02771227836._5
688688 let $t02784928257 = if ((size(pAmounts) == 1))
689689 then {
690690 let pAsset = parsePaymentAsset(pAssetIds[0])
691691 if ((pAsset != shareAssetId))
692692 then throw(("Incorrect asset attached. Expected: " + toBase58String(shareAssetId)))
693693 else $Tuple2(pAmounts[0], pAsset)
694694 }
695695 else $Tuple2(0, shareAssetId)
696696 let pmtAmount = $t02784928257._1
697697 let pmtAssetId = $t02784928257._2
698698 if ((size(pAmounts) > 1))
699699 then throw("One attached payment expected")
700700 else if (if ((balanceA > accountBalanceA))
701701 then true
702702 else (balanceB > accountBalanceB))
703703 then $Tuple2(nil, ([ScriptTransfer(caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious(accountBalanceA, accountBalanceB, balanceA, balanceB, strAssetIdA, strAssetIdB)))
704704 else {
705705 let unlockAmount = parseIntValue(valueOrElse(args[0], "0"))
706706 let unlock = if ((unlockAmount > 0))
707707 then invoke(farmingAddress, "withdrawShareTokens", [toString(i.caller), unlockAmount], nil)
708708 else 0
709709 if ((unlock == unlock))
710710 then {
711711 let withdrawAmount = (pmtAmount + unlockAmount)
712712 let amountToPayA = fraction(withdrawAmount, balanceA, shareAssetSupply)
713713 let amountToPayB = fraction(withdrawAmount, balanceB, shareAssetSupply)
714714 let stake1 = if (contains(stakingAssets, strAssetIdA))
715715 then invoke(i.caller, "stakeUnstake", [false, amountToPayA, strAssetIdA], nil)
716716 else 0
717717 if ((stake1 == stake1))
718718 then {
719719 let stake2 = if (contains(stakingAssets, strAssetIdB))
720720 then invoke(i.caller, "stakeUnstake", [false, amountToPayB, strAssetIdB], nil)
721721 else 0
722722 if ((stake2 == stake2))
723723 then $Tuple2([ScriptTransfer(i.caller, unlockAmount, shareAssetId)], $Tuple2([IntegerEntry(kBalanceA, (balanceA - amountToPayA)), IntegerEntry(kBalanceB, (balanceB - amountToPayB)), IntegerEntry(kShareAssetSupply, (shareAssetSupply - withdrawAmount)), Burn(shareAssetId, withdrawAmount), ScriptTransfer(caller, amountToPayA, assetIdA), ScriptTransfer(caller, amountToPayB, assetIdB)], nil))
724724 else throw("Strict value is not equal to itself.")
725725 }
726726 else throw("Strict value is not equal to itself.")
727727 }
728728 else throw("Strict value is not equal to itself.")
729729 }
730730 }))
731731
732732
733733
734734 @Callable(i)
735735 func withdrawOneToken (callerBytes,args,pAmounts,pAssetIds) = valueOrElse(isOraclePool(toString(i.caller)), valueOrElse(isActive(), {
736736 let caller = Address(callerBytes)
737737 let withdrawAsset = if ((args[0] == ""))
738738 then unit
739739 else fromBase58String(args[0])
740740 let $t03046530555 = getPoolAssets(i.caller)
741741 let strAssetIdA = $t03046530555._1
742742 let strAssetIdB = $t03046530555._2
743743 let assetIdA = $t03046530555._3
744744 let assetIdB = $t03046530555._4
745745 let shareAssetId = $t03046530555._5
746746 let $t03056830692 = getPoolBalances(i.caller, assetIdA, assetIdB)
747747 let balanceA = $t03056830692._1
748748 let balanceB = $t03056830692._2
749749 let accountBalanceA = $t03056830692._3
750750 let accountBalanceB = $t03056830692._4
751751 let shareAssetSupply = $t03056830692._5
752752 let $t03070531085 = if ((size(pAmounts) == 1))
753753 then {
754754 let pAsset = parsePaymentAsset(pAssetIds[0])
755755 if ((pAsset != shareAssetId))
756756 then throw(("Incorrect asset attached. Expected: " + toBase58String(shareAssetId)))
757757 else $Tuple2(pAmounts[0], pAsset)
758758 }
759759 else $Tuple2(0, shareAssetId)
760760 let pmtAmount = $t03070531085._1
761761 let pmtAssetId = $t03070531085._2
762762 let virtMinToRecive = parseIntValue(args[1])
763763 if ((size(pAmounts) != 1))
764764 then throw("One attached payment expected")
765765 else if ((pmtAssetId != shareAssetId))
766766 then throw(("Incorrect asset attached. Expected: " + toBase58String(shareAssetId)))
767767 else if (!(containsElement([assetIdA, assetIdB], withdrawAsset)))
768768 then throw("Incorrect withdraw asset.")
769769 else if (if ((balanceA > accountBalanceA))
770770 then true
771771 else (balanceB > accountBalanceB))
772772 then $Tuple2(nil, ([ScriptTransfer(caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious(accountBalanceA, accountBalanceB, balanceA, balanceB, strAssetIdA, strAssetIdB)))
773773 else {
774774 let unlockAmount = parseIntValue(valueOrElse(args[2], "0"))
775775 let unlock = if ((unlockAmount > 0))
776776 then invoke(farmingAddress, "withdrawShareTokens", [toString(i.caller), unlockAmount], nil)
777777 else 0
778778 if ((unlock == unlock))
779779 then {
780780 let withdrawAmount = (pmtAmount + unlockAmount)
781781 let amountToPayA = fraction(withdrawAmount, balanceA, shareAssetSupply)
782782 let amountToPayB = fraction(withdrawAmount, balanceB, shareAssetSupply)
783783 let $t03233032388 = getFeeParams(i.caller, i.originCaller)
784784 let fee = $t03233032388._1
785785 let govFee = $t03233032388._2
786786 let $t03240532745 = if ((withdrawAsset == assetIdA))
787787 then calculateFees(amountToPayB, virtMinToRecive, balanceB, balanceA, fee, govFee)
788788 else calculateFees(amountToPayA, virtMinToRecive, balanceA, balanceB, fee, govFee)
789789 let amountWithoutFee = $t03240532745._1
790790 let amountWithFee = $t03240532745._2
791791 let governanceReward = $t03240532745._3
792792 let $t03276234108 = if ((withdrawAsset == assetIdA))
793793 then {
794794 let unstake = if (contains(stakingAssets, strAssetIdA))
795795 then invoke(i.caller, "stakeUnstake", [false, ((amountToPayA + amountWithFee) + governanceReward), strAssetIdA], nil)
796796 else 0
797797 if ((unstake == unstake))
798798 then $Tuple4((((balanceA - amountToPayA) - amountWithFee) - governanceReward), balanceB, assetIdA, [ScriptTransfer(caller, (amountToPayA + amountWithFee), assetIdA)])
799799 else throw("Strict value is not equal to itself.")
800800 }
801801 else {
802802 let unstake = if (contains(stakingAssets, strAssetIdB))
803803 then invoke(i.caller, "stakeUnstake", [false, ((amountToPayB + amountWithFee) + governanceReward), strAssetIdB], nil)
804804 else 0
805805 if ((unstake == unstake))
806806 then $Tuple4(balanceA, (((balanceB - amountToPayB) - amountWithFee) - governanceReward), assetIdB, [ScriptTransfer(caller, (amountToPayB + amountWithFee), assetIdB)])
807807 else throw("Strict value is not equal to itself.")
808808 }
809809 let newBalanceA = $t03276234108._1
810810 let newBalanceB = $t03276234108._2
811811 let govRewardAssetId = $t03276234108._3
812812 let userTransfer = $t03276234108._4
813813 $Tuple2([ScriptTransfer(i.caller, unlockAmount, shareAssetId)], $Tuple2(([IntegerEntry(kBalanceA, newBalanceA), IntegerEntry(kBalanceB, newBalanceB), IntegerEntry(kShareAssetSupply, (shareAssetSupply - withdrawAmount)), Burn(shareAssetId, withdrawAmount), ScriptTransfer(moneyBoxAddress, governanceReward, govRewardAssetId)] ++ userTransfer), nil))
814814 }
815815 else throw("Strict value is not equal to itself.")
816816 }
817817 }))
818818
819819
820820
821821 @Callable(i)
822822 func takeIntoAccountExtraFunds (callerBytes,args,pAmounts,pAssetIds) = valueOrElse(isOraclePool(toString(i.caller)), valueOrElse(isActive(), {
823823 let $t03483334909 = getPoolAssets(i.caller)
824824 let strAssetIdA = $t03483334909._1
825825 let strAssetIdB = $t03483334909._2
826826 let assetIdA = $t03483334909._3
827827 let assetIdB = $t03483334909._4
828828 let $t03492235028 = getPoolBalances(i.caller, assetIdA, assetIdB)
829829 let balanceA = $t03492235028._1
830830 let balanceB = $t03492235028._2
831831 let accountBalanceA = $t03492235028._3
832832 let accountBalanceB = $t03492235028._4
833833 let amountEnrollA = (accountBalanceA - balanceA)
834834 let amountEnrollB = (accountBalanceB - balanceB)
835835 if ((moneyBoxAddress != i.originCaller))
836836 then throw("Only the wallet can call this function")
837837 else if (if ((0 > amountEnrollA))
838838 then true
839839 else (0 > amountEnrollB))
840840 then suspend("Enroll amount negative")
841841 else if (if ((amountEnrollA == 0))
842842 then (amountEnrollB == 0)
843843 else false)
844844 then throw("No money to take")
845845 else {
846846 let stake1 = if (if (contains(stakingAssets, strAssetIdA))
847847 then (amountEnrollA > 0)
848848 else false)
849849 then invoke(this, "stakeUnstake", [true, amountEnrollA, strAssetIdA], nil)
850850 else 0
851851 if ((stake1 == stake1))
852852 then {
853853 let stake2 = if (if (contains(stakingAssets, strAssetIdB))
854854 then (amountEnrollB > 0)
855855 else false)
856856 then invoke(this, "stakeUnstake", [true, amountEnrollB, strAssetIdB], nil)
857857 else 0
858858 if ((stake2 == stake2))
859859 then $Tuple2(nil, $Tuple2([IntegerEntry(kBalanceA, (balanceA + amountEnrollA)), IntegerEntry(kBalanceB, (balanceB + amountEnrollB))], nil))
860860 else throw("Strict value is not equal to itself.")
861861 }
862862 else throw("Strict value is not equal to itself.")
863863 }
864864 }))
865865
866866
867867 @Verifier(tx)
868868 func verify () = {
869869 let multiSignedByAdmins = {
870870 let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
871871 then 1
872872 else 0
873873 let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], adminPubKey2))
874874 then 1
875875 else 0
876876 let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], adminPubKey3))
877877 then 1
878878 else 0
879879 (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
880880 }
881881 multiSignedByAdmins
882882 }
883883

github/deemru/w8io/873ac7e 
81.34 ms