2023.10.16 19:09 [3867245] smart account 3PAZv9tgK1PX7dKR7b4kchq5qdpUS3G5sYT > SELF 0.00000000 Waves

{ "type": 13, "id": "GvEUf6wG56CYPTHvGeBbynFdJPQqwVqBoNUBbeuQtFmU", "fee": 3100000, "feeAssetId": null, "timestamp": 1697472590446, "version": 1, "sender": "3PAZv9tgK1PX7dKR7b4kchq5qdpUS3G5sYT", "senderPublicKey": "2cFG5wZimjVSeCT8ZCRybx7Mzo5tJF879aw2b31uLRmR", "proofs": [ "4vtpiUAW7rBtzy3gUwvQMGtbVah3SMhBK1Rk3EywdTVkL6HKm1pE3ztq9XPPDLpDp3CrENzzQSm3X7edscjdtqmV" ], "script": "base64:BgKRAQgCEgMKAQgSBAoCCAQSBQoDCAQIEgMKAQgSBAoCCAESABIAEgQKAggBEgQKAggBEgMKAQgSBAoCCAESAwoBCBIECgIIARIECgIIARIECgIIARIECgIBBBIFCgMIAQQSBAoCBAQSAwoBCBIECgIBBBIAEgQKAggEEgASBAoCCAESAwoBCBIAEgQKAggIEgMKAQg5AAtmYWN0b3JzQmFzZQDoBwEDZkNpAwV2YWx1ZQludW1lcmF0b3ILZGVub21pbmF0b3IEBGNhbmQJAGsDBQV2YWx1ZQUJbnVtZXJhdG9yBQtkZW5vbWluYXRvcgQBRACz5pOoCwQFZXhhY3QJAAACCQBqAgkAaAIJAGoCBQRjYW5kBQFECQBqAgULZGVub21pbmF0b3IFAUQFAUQJAGoCCQBoAgkAagIFBXZhbHVlBQFECQBqAgUJbnVtZXJhdG9yBQFEBQFEAwUFZXhhY3QFBGNhbmQJAGQCBQRjYW5kAAEBC3B1cmVBc3NldElkAQdhc3NldElkBAFpCQCRAwIJALUJAgUHYXNzZXRJZAIBXwAAAwkAAAIFAWkCBVdBVkVTBQR1bml0CQDZBAEFAWkBEHdyaXRlQ29uc3RTdHJpbmcCA2tleQV2YWx1ZQMJAQEhAQkBCWlzRGVmaW5lZAEJAJ0IAgUEdGhpcwUDa2V5CQELU3RyaW5nRW50cnkCBQNrZXkFBXZhbHVlCQACAQkArAICAhVhbHJlYWR5IGluaXRpYWxpemVkOiAFA2tleQEFYXNJbnQBBXZhbHVlBAckbWF0Y2gwBQV2YWx1ZQMJAAECBQckbWF0Y2gwAgNJbnQEA2ludAUHJG1hdGNoMAUDaW50CQACAQIDbToxAQZhc0ludDMBBXZhbHVlBAckbWF0Y2gwBQV2YWx1ZQMJAAECBQckbWF0Y2gwAg8oSW50LCBJbnQsIEludCkEAXgFByRtYXRjaDAFAXgEAXQFByRtYXRjaDAJAAIBAgEyARFhc1VzZXJCYWxhbmNlRGF0YQEFdmFsdWUEByRtYXRjaDAFBXZhbHVlAwkAAQIFByRtYXRjaDACIihJbnQsIEludCwgSW50LCBJbnQsIEludCwgQm9vbGVhbikEAXgFByRtYXRjaDAFAXgEAXQFByRtYXRjaDAJAAIBAgEzAAtjb25maWdTdG9yZQIGY29uZmlnAAVhVElkUwIIYVRva2VuSWQABGFJZFMCB2Fzc2V0SWQADWNvbmZpZ0FkZHJlc3MJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMFC2NvbmZpZ1N0b3JlAAttYXliZUxvY2tlcgkAnQgCBQ1jb25maWdBZGRyZXNzAglscF9sb2NrZXIAC3Jlc2VydmVzU3RyCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUNY29uZmlnQWRkcmVzcwIQcHJpbWFyeV9yZXNlcnZlcwIWbm8gcmVzZXJ2ZXMgcmVnaXN0ZXJlZAAIcmVzZXJ2ZXMJALwJAgULcmVzZXJ2ZXNTdHICAXwAFWlnbm9yZVZhbGlkYXRpb25Vc2VycwkBC3ZhbHVlT3JFbHNlAgkAnQgCBQ1jb25maWdBZGRyZXNzAhtpZ25vcmVfdmFsaWRhdGlvbl9hZGRyZXNzZXMCIzNQODRldlhTV01jaFlNYTZoa0xMUm1RNHVzSGY0Y05zak5wAANlYlIJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQ1jb25maWdBZGRyZXNzAgplYl9yZXdhcmRzAg1ubyBlYl9yZXdhcmRzAAt2aXJlc01pbnRlcgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQ1jb25maWdBZGRyZXNzAgx2aXJlc19taW50ZXICFG1haW46IG5vIHZpcmVzTWludGVyAgpiYWQgbWludGVyAAdtYXliZXZTCQCdCAIFDWNvbmZpZ0FkZHJlc3MCDHZpcmVzX3N0YWtlcgACdlMJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgUHbWF5YmV2UwIPbm8gdmlyZXNfc3Rha2VyAAJkQwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQ1jb25maWdBZGRyZXNzAhJkaXZpZGVuZHNfY29udHJhY3QCFW5vIGRpdmlkZW5kc19jb250cmFjdAIHYmFkIGRpdgADbVZEBAckbWF0Y2gwCQCdCAIFDWNvbmZpZ0FkZHJlc3MCEXZpcmVzX2Rpc3RyaWJ1dG9yAwkAAQIFByRtYXRjaDACBlN0cmluZwQBZAUHJG1hdGNoMAkBEUBleHRyTmF0aXZlKDEwNjIpAQUBZAUEdW5pdAACVkQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgUDbVZEAghubyBkaXN0cgAHbGltaXRlcgQHJG1hdGNoMAkAnQgCBQ1jb25maWdBZGRyZXNzAgdsaW1pdGVyAwkAAQIFByRtYXRjaDACBlN0cmluZwQBZAUHJG1hdGNoMAkBEUBleHRyTmF0aXZlKDEwNjIpAQUBZAUEdW5pdAARbWF5YmVWaXJlc0Fzc2V0SWQJAJ0IAgULdmlyZXNNaW50ZXIFBGFJZFMADHZpcmVzQXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDZBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgURbWF5YmVWaXJlc0Fzc2V0SWQCC25vIHZpcmVzIGlkAhBpbnZhbGlkIHZpcmVzIGlkAQx2aXJlc1BheW1lbnQBAWkDCQAAAgkAkAMBCAUBaQhwYXltZW50cwAAAAADCQECIT0CCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQFDHZpcmVzQXNzZXRJZAkAAgECCW5vdCB2aXJlcwgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQBEGFzc2V0SWRPZlJlc2VydmUBA3JzcgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFA3JzcgUEYUlkUwIRbm8gYXNzZXRJZCBpbiByc3IBEGNvbGxhdGVyYWxGYWN0b3IBA3JzcgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFDWNvbmZpZ0FkZHJlc3MJAKwCAgkBEGFzc2V0SWRPZlJlc2VydmUBBQNyc3ICEV9Db2xsYXRlcmFsRmFjdG9yAgRubyAxARRsaXF1aWRhdGlvblRocmVzaG9sZAEDcnNyCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUNY29uZmlnQWRkcmVzcwkArAICCQEQYXNzZXRJZE9mUmVzZXJ2ZQEFA3JzcgIVX0xpcXVpZGF0aW9uVGhyZXNob2xkAgRubyAyABZhY2NvdW50SGVhbHRoVGhyZXNob2xkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUNY29uZmlnQWRkcmVzcwIYYWNjb3VudF9oZWFsdGhfdGhyZXNob2xkAgRubyA0ABRhY2NvdW50SGVhbHRoT3ZlcmxhcAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFDWNvbmZpZ0FkZHJlc3MCFmFjY291bnRfaGVhbHRoX292ZXJsYXACBG5vIDUAC2xpcXVpZGF0b3JzCQELdmFsdWVPckVsc2UCCQCdCAIFDWNvbmZpZ0FkZHJlc3MCC2xpcXVpZGF0b3JzAgABCXJlc2VydmVCeQIFc3RvcmUFdmFsdWUKAQRmb2xkAgFhAXIEByRtYXRjaDAFAWEDCQABAgUHJG1hdGNoMAIHQWRkcmVzcwQFZm91bmQFByRtYXRjaDAFBWZvdW5kBANyc3IJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBBQFyAg9yc3IgYmFkIGFkZHJlc3MDCQAAAgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFA3JzcgUFc3RvcmUJAKwCAgILcnNyIGhhcyBubyAFBXN0b3JlBQV2YWx1ZQUDcnNyBQR1bml0BAckbWF0Y2gwCgACJGwFCHJlc2VydmVzCgACJHMJAJADAQUCJGwKAAUkYWNjMAUEdW5pdAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEEZm9sZAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMjAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUAwkAAQIFByRtYXRjaDACB0FkZHJlc3MEBWZvdW5kBQckbWF0Y2gwBQVmb3VuZAkAAgEJAKwCAgIIdW5rbm93biAFBXN0b3JlAQN2bFIBAXIDCQEIY29udGFpbnMCBQtyZXNlcnZlc1N0cgUBcgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEFAXICDW1haW46IGJhZCByc3IJAAIBCQCsAgICDHVua25vd24gcnNyOgUBcgELdXNlckJhbGFuY2UCA3JzcgR1c2VyCQERYXNVc2VyQmFsYW5jZURhdGEBCQD8BwQFA3JzcgILdXNlckJhbGFuY2UJAMwIAgUEdXNlcgUDbmlsBQNuaWwADm1heWJlUHJvdGVjdGVkBAckbWF0Y2gwCQCdCAIFDWNvbmZpZ0FkZHJlc3MCEXByb3RlY3RlZF9yZXNlcnZlAwkAAQIFByRtYXRjaDACBlN0cmluZwQDcGRzBQckbWF0Y2gwCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQUDcGRzAg1iYWQgcHJvdGVjdGVkBQR1bml0ABBwcm90ZWN0ZWRSZXNlcnZlCQETdmFsdWVPckVycm9yTWVzc2FnZQIFDm1heWJlUHJvdGVjdGVkAhBubyBwcm90ZWN0ZWQgcnNyABxwcm9oaWJpdGVkQ29sbGF0ZXJhbFJlc2VydmVzBAckbWF0Y2gwCQCdCAIFDWNvbmZpZ0FkZHJlc3MCHHByb2hpYml0ZWRDb2xsYXRlcmFsUmVzZXJ2ZXMDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFzBQckbWF0Y2gwCQC1CQIFAXMCAXwFA25pbAEdZW5zdXJlTm9Qcm9oaWJpdGVkQ29sbGF0ZXJhbHMBBHVzZXIKAQhmb2xkRnVuYwIBYRFwcm9oaWJpdGVkUmVzZXJ2ZQQDYXRiCQELdmFsdWVPckVsc2UCCQCaCAIJARFAZXh0ck5hdGl2ZSgxMDYyKQEFEXByb2hpYml0ZWRSZXNlcnZlCQCsAgIFBHVzZXICDl9hVG9rZW5CYWxhbmNlAAADCQBmAgUDYXRiAAEJAAIBCQCsAgIJAKwCAgkArAICCQCsAgICJm9wZXJhdGlvbiBkZW5pZWQ6IHVzZXIgaGFzIGRlcG9zaXQgaW4gBRFwcm9oaWJpdGVkUmVzZXJ2ZQICOiAJAKQDAQUDYXRiAgsobHAgdG9rZW5zKQYEG2Vuc3VyZU5vUHJvdGVjdGVkVVNETm9yRVVSTgQDYW55CQBkAgkBC3ZhbHVlT3JFbHNlAgkAmggCBRBwcm90ZWN0ZWRSZXNlcnZlCQCsAgICOHVzZXJTaGFyZXNfREcyeEZrUGREd0tVb0JrekdBaFF0THBTR3pmWExpQ1lQRXplS0gyQWQyNHBfBQR1c2VyAAAJAQt2YWx1ZU9yRWxzZQIJAJoIAgUQcHJvdGVjdGVkUmVzZXJ2ZQkArAICAjh1c2VyU2hhcmVzX0RVazJZVHhoUm9BcU1KTHVzNEcyYjNmUjhoTUhWaDZlaXlGeDVyMjlWUjZ0XwUEdXNlcgAAAwkAZgIFA2FueQAACQACAQIwaGFzIG5vbi1ib3Jyb3dhYmxlIE5ldXRyaW5vIGFzc2V0cyBhcyBjb2xsYXRlcmFsBgoAAiRsBRxwcm9oaWJpdGVkQ29sbGF0ZXJhbFJlc2VydmVzCgACJHMJAJADAQUCJGwKAAUkYWNjMAUbZW5zdXJlTm9Qcm90ZWN0ZWRVU0ROb3JFVVJOCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQhmb2xkRnVuYwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTUJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8BEmVuc3VyZU5vUHJvaGliaXRlZAMEdXNlcgNicHUHcmVzZXJ2ZQMDCQAAAgUDYnB1AAAGCQEJaXNEZWZpbmVkAQkAzwgCBRxwcm9oaWJpdGVkQ29sbGF0ZXJhbFJlc2VydmVzBQdyZXNlcnZlBgkBHWVuc3VyZU5vUHJvaGliaXRlZENvbGxhdGVyYWxzAQUEdXNlcgERZW5zdXJlTm9Qcm90ZWN0ZWQBBHVzZXIEA2hhcwQHJG1hdGNoMAUObWF5YmVQcm90ZWN0ZWQDCQABAgUHJG1hdGNoMAIHQWRkcmVzcwQCcGEFByRtYXRjaDAJAQt2YWx1ZU9yRWxzZQIJAJsIAgUCcGEJAKwCAgIVcHJvdGVjdGVkX2NvbGxhdGVyYWxfBQR1c2VyBwcDBQNoYXMJAAIBAgpkaXNhbGxvd2VkBQR1bml0AQtlbnN1cmVMaW1pdAQGYWN0aW9uA3JzcgR1c2VyBmFtb3VudAQHJG1hdGNoMAUHbGltaXRlcgMJAAECBQckbWF0Y2gwAgdBZGRyZXNzBAFsBQckbWF0Y2gwCQEFYXNJbnQBCQD8BwQFAWwCDXZhbGlkYXRlTGltaXQJAMwIAgUGYWN0aW9uCQDMCAIJAKUIAQUDcnNyCQDMCAIFBHVzZXIJAMwIAgUGYW1vdW50BQNuaWwFA25pbAYBCXVzZXJQb3dlcgEEdXNlcgQQcHJvdGVjdGVkRGVwb3NpdAQHJG1hdGNoMAUObWF5YmVQcm90ZWN0ZWQDCQABAgUHJG1hdGNoMAIHQWRkcmVzcwQCcGEFByRtYXRjaDAJAQVhc0ludAEJAPwHBAUCcGECC2JvcnJvd1Bvd2VyCQDMCAIFBHVzZXIFA25pbAUDbmlsAAAKAQRmb2xkAgZ0b3RhbHMBcgQLJHQwOTIyNzkyNzMFBnRvdGFscwQGdG90YWxECAULJHQwOTIyNzkyNzMCXzEEBnRvdGFsQggFCyR0MDkyMjc5MjczAl8yBA9udW1iZXJPZkJvcnJvd3MIBQskdDA5MjI3OTI3MwJfMwQDcnNyCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQUBcgIPcnNyIGJhZCBhZGRyZXNzBAJjZgkBEGNvbGxhdGVyYWxGYWN0b3IBBQNyc3IEAmx0CQEUbGlxdWlkYXRpb25UaHJlc2hvbGQBBQNyc3IECyR0MDk0Mjc5NTExCQELdXNlckJhbGFuY2UCBQNyc3IFBHVzZXIEBXRva2VuCAULJHQwOTQyNzk1MTECXzEEBWFzc2V0CAULJHQwOTQyNzk1MTECXzIECmRlcG9zaXRVc2QIBQskdDA5NDI3OTUxMQJfMwQEZGVidAgFCyR0MDk0Mjc5NTExAl80BAdkZWJ0VXNkCAULJHQwOTQyNzk1MTECXzUEDGFzQ29sbGF0ZXJhbAgFCyR0MDk0Mjc5NTExAl82BAx0b3RhbEJvcnJvd3MJAGQCBQ9udW1iZXJPZkJvcnJvd3MDCQBmAgUEZGVidAAAAAEAAAQTZWZmZWN0aXZlRGVwb3NpdFVzZAMFDGFzQ29sbGF0ZXJhbAUKZGVwb3NpdFVzZAAABApvdmVybGFwVXNkCQCXAwEJAMwIAgUHZGVidFVzZAkAzAgCBRNlZmZlY3RpdmVEZXBvc2l0VXNkBQNuaWwEDW92ZXJsYXBDaGFyZ2UJAQNmQ2kDBQpvdmVybGFwVXNkBRRhY2NvdW50SGVhbHRoT3ZlcmxhcAULZmFjdG9yc0Jhc2UDCQBmAgUHZGVidFVzZAUTZWZmZWN0aXZlRGVwb3NpdFVzZAkAlQoDBQZ0b3RhbEQJAGQCCQBkAgUGdG90YWxCCQBrAwkAZQIFB2RlYnRVc2QFE2VmZmVjdGl2ZURlcG9zaXRVc2QFC2ZhY3RvcnNCYXNlBQJsdAUNb3ZlcmxhcENoYXJnZQUMdG90YWxCb3Jyb3dzCQCVCgMJAGQCBQZ0b3RhbEQJAGsDCQBlAgUTZWZmZWN0aXZlRGVwb3NpdFVzZAUHZGVidFVzZAUCY2YFC2ZhY3RvcnNCYXNlCQBkAgUGdG90YWxCBQ1vdmVybGFwQ2hhcmdlBQx0b3RhbEJvcnJvd3MEAXIKAAIkbAUIcmVzZXJ2ZXMKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCVCgMFEHByb3RlY3RlZERlcG9zaXQAAAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQRmb2xkAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAyMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQDAwkAZgIFEHByb3RlY3RlZERlcG9zaXQAAAkAZgIIBQFyAl8zAAQHCQACAQIeY2FuJ3QgaGF2ZSBtb3JlIHRoYW4gNCBib3Jyb3dzBQFyAQ1nZXRVc2VySGVhbHRoAQdhY2NvdW50BA0kdDAxMDI2NjEwMzE3CQEGYXNJbnQzAQkBCXVzZXJQb3dlcgEFB2FjY291bnQEAmJwCAUNJHQwMTAyNjYxMDMxNwJfMQQDYnB1CAUNJHQwMTAyNjYxMDMxNwJfMgQGaWdub3JlCAUNJHQwMTAyNjYxMDMxNwJfMwkArAICCQCsAgIJAKwCAgIDYnA6CQCkAwEFAmJwAgYsIGJwdToJAKQDAQUDYnB1AQ12YWxpZGF0ZUFmdGVyAgR1c2VyAm9wBA0kdDAxMDQyOTEwNDYwCQEJdXNlclBvd2VyAQUEdXNlcgQCYnAIBQ0kdDAxMDQyOTEwNDYwAl8xBANicHUIBQ0kdDAxMDQyOTEwNDYwAl8yBAlhY2NIZWFsdGgJAGkCCQBoAgkAZQIFAmJwBQNicHUFC2ZhY3RvcnNCYXNlBQJicAMDCQAAAgUCYnAAAAkAAAIFA2JwdQAABwAAAwMJAAACBQJicAAACQBmAgUDYnB1AAAHCQACAQkArAICCQCsAgIFAm9wAiw6IGJyZWFjaGluZyBsaXF1aWRhdGlvbiB0aHJlc2hvbGQoYnA9MCwgYnB1PQkApAMBBQNicHUDCQBmAgUWYWNjb3VudEhlYWx0aFRocmVzaG9sZAUJYWNjSGVhbHRoCQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQJvcAIlOiBicmVhY2hpbmcgbGlxdWlkYXRpb24gdGhyZXNob2xkKGJwPQkApAMBBQJicAIGLCBicHU9CQCkAwEFA2JwdQIJLCBoZWFsdGg9CQCkAwEFCWFjY0hlYWx0aAIBKQUDYnB1AQJ1UwUDcnNyBmFjdGlvbgR1c2VyCnVzZXJDaGFuZ2UMc3RyZWFtQ2hhbmdlBAckbWF0Y2gwBQNtVkQDCQABAgUHJG1hdGNoMAIHQWRkcmVzcwQBYQUHJG1hdGNoMAkA/AcEBQFhAghvbkFjdGlvbgkAzAgCBQNyc3IJAMwIAgUGYWN0aW9uCQDMCAIFBHVzZXIJAMwIAgUKdXNlckNoYW5nZQkAzAgCBQxzdHJlYW1DaGFuZ2UFA25pbAUDbmlsBQR1bml0AQptb3ZlU3RyZWFtBQNyc3IGYWN0aW9uBGZyb20Gc3RyaW5nA2FtdAQHJG1hdGNoMAUDbVZEAwkAAQIFByRtYXRjaDACB0FkZHJlc3MEAWEFByRtYXRjaDAJAPwHBAUBYQIEbW92ZQkAzAgCBQNyc3IJAMwIAgUGYWN0aW9uCQDMCAIFBGZyb20JAMwIAgUGc3RyaW5nCQDMCAIFA2FtdAUDbmlsBQNuaWwFBHVuaXQBAnNSAQNyc3IEByRtYXRjaDAFA21WRAMJAAECBQckbWF0Y2gwAgdBZGRyZXNzBAFhBQckbWF0Y2gwCQD8BwQFAWECCnN5bmNIZWlnaHQJAMwIAgUDcnNyBQNuaWwFA25pbAUEdW5pdAEMbG9ja09yUGF5b3V0AwlyZWNpcGllbnQDYW10BGxvY2sDCQEBIQEFBGxvY2sJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUJcmVjaXBpZW50BQNhbXQFDHZpcmVzQXNzZXRJZAUDbmlsBAZkb0xvY2sJAPwHBAUCZEMCB2xvY2tGb3IJAMwIAgkApQgBBQlyZWNpcGllbnQJAMwIAgABBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFDHZpcmVzQXNzZXRJZAUDYW10BQNuaWwDCQAAAgUGZG9Mb2NrBQZkb0xvY2sFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEJZG9EZXBvc2l0AwFpA3JzcgVhc0NvbAQEdXNlcgkApQgBCAUBaQZjYWxsZXIEBmNoZWNrcwkBEWVuc3VyZU5vUHJvdGVjdGVkAQUEdXNlcgMJAAACBQZjaGVja3MFBmNoZWNrcwQCc2gJAQJzUgEFA3JzcgMJAAACBQJzaAUCc2gEBmFjdGlvbgkA/AcECQEDdmxSAQUDcnNyAgpkZXBvc2l0Rm9yCQDMCAIFBHVzZXIJAMwIAgUFYXNDb2wFA25pbAgFAWkIcGF5bWVudHMDCQAAAgUGYWN0aW9uBQZhY3Rpb24EA2FtdAgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQEA3BSdwkBAnVTBQUDcnNyAgdkZXBvc2l0BQR1c2VyBQNhbXQFA2FtdAMJAAACBQNwUncFA3BSdwQCdmEDCQEBIQEFBWFzQ29sCQENdmFsaWRhdGVBZnRlcgIFBHVzZXICCmRlcG9zaXRpbmcAAAMJAAACBQJ2YQUCdmEFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgAOcmV3YXJkUmVzZXJ2ZXMJALwJAgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFDWNvbmZpZ0FkZHJlc3MCE3Jld2FyZGFibGVfcmVzZXJ2ZXMCCW5vIHN0cmluZwIBfAEWY2xhaW1BbGxSZXdhcmRzRm9yVXNlcgEEdXNlcgQJY2xhaW1lZEViCQEFYXNJbnQBCQD8BwQFA2ViUgIQY2xhaW1FYlJld2FyZEZvcgkAzAgCBQR1c2VyCQDMCAIA////////////AQUDbmlsBQNuaWwDCQAAAgUJY2xhaW1lZEViBQljbGFpbWVkRWIKAQRmb2xkAgNhY2MDcnNyBAdjbGFpbWVkCQEFYXNJbnQBCQD8BwQFAlZEAg5jbGFpbVJld2FyZEZvcgkAzAgCBQNyc3IJAMwIAgUEdXNlcgkAzAgCAP///////////wEFA25pbAUDbmlsAwkAAAIFB2NsYWltZWQFB2NsYWltZWQJAGQCBQNhY2MFB2NsYWltZWQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4EDGNsYWltZWRUb3RhbAoAAiRsBQ5yZXdhcmRSZXNlcnZlcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEEZm9sZAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMjAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUCQBkAgUMY2xhaW1lZFRvdGFsBQljbGFpbWVkRWIJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BGGNsYWltQWxsTHBSZXdhcmRzRm9yVXNlcgEEdXNlcgQHJG1hdGNoMAULbWF5YmVMb2NrZXIDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFzBQckbWF0Y2gwBAZsb2NrZXIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBBQFzAh9iYWQgbHBfbG9ja2VyIGFkZHJlc3MgaW4gY29uZmlnCgEEZm9sZAIDYWNjA3JzcgQIYVRva2VuSWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCCQERQGV4dHJOYXRpdmUoMTA2MikBBQNyc3IFBWFUSWRTAhZubyBhVG9rZW5JZCBpbiByZXNlcnZlBAdjbGFpbWVkCQEFYXNJbnQBCQD8BwQFBmxvY2tlcgIQY2xhaW1McFJld2FyZEZvcgkAzAgCBQR1c2VyCQDMCAIFCGFUb2tlbklkCQDMCAIA////////////AQUDbmlsBQNuaWwDCQAAAgUHY2xhaW1lZAUHY2xhaW1lZAkAZAIFA2FjYwUHY2xhaW1lZAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgQMY2xhaW1lZFRvdGFsCgACJGwFDnJld2FyZFJlc2VydmVzCgACJHMJAJADAQUCJGwKAAUkYWNjMAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQRmb2xkAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAyMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQFDGNsYWltZWRUb3RhbAAAAQ5tb3ZlQ29sbGF0ZXJhbAQEYWRkcghhc3NldFN0cgNyc3IKcmVzZXJ2ZVN0cgQDYW10CQEFYXNJbnQBCQD8BwQFEHByb3RlY3RlZFJlc2VydmUCDndpdGhkcmF3VG9NYWluCQDMCAIFBGFkZHIJAMwIAgUIYXNzZXRTdHIFA25pbAUDbmlsAwkAAAIFA2FtdAUDYW10BANkZXAJAPwHBAUDcnNyAgpkZXBvc2l0Rm9yCQDMCAIFBGFkZHIJAMwIAgYFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBC3B1cmVBc3NldElkAQUIYXNzZXRTdHIFA2FtdAUDbmlsAwkAAAIFA2RlcAUDZGVwBARwcm9wCQECdVMFBQpyZXNlcnZlU3RyAgdkZXBvc2l0BQRhZGRyBQNhbXQFA2FtdAMJAAACBQRwcm9wBQRwcm9wBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQRzcGZyAAkA/AcEBQJkQwIXc2hhcmVQcm9maXRGcm9tUmVzZXJ2ZXMFA25pbAUDbmlsAQp3ZEludGVybmFsBAR1c2VyA3JzcgNhbXQCb3AEAnNoCQECc1IBCQClCAEFA3JzcgMJAAACBQJzaAUCc2gED3dpdGhkcmF3bkFtb3VudAkBBWFzSW50AQkA/AcEBQNyc3IFAm9wCQDMCAIFBHVzZXIJAMwIAgUDYW10BQNuaWwFA25pbAMJAAACBQ93aXRoZHJhd25BbW91bnQFD3dpdGhkcmF3bkFtb3VudAQDcFJ3CQECdVMFCQClCAEFA3JzcgIHZGVwb3NpdAUEdXNlcgkBAS0BBQ93aXRoZHJhd25BbW91bnQJAQEtAQUPd2l0aGRyYXduQW1vdW50AwkAAAIFA3BSdwUDcFJ3BAFlCQELZW5zdXJlTGltaXQEAgh3aXRoZHJhdwUDcnNyBQR1c2VyBQ93aXRoZHJhd25BbW91bnQDCQAAAgUBZQUBZQUPd2l0aGRyYXduQW1vdW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuARdyZXBheVdpdGhBdG9rZW5JbnRlcm5hbAIEdXNlcgdwYXltZW50BAhhVG9rZW5JZAkA2AQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIIBQdwYXltZW50B2Fzc2V0SWQCHmJhZCBhc3NldElkOiB3YXZlcyBub3QgYWxsb3dlZAQBdAkBCXJlc2VydmVCeQIFBWFUSWRTBQhhVG9rZW5JZAQCc2gJAQJzUgEJAKUIAQUBdAMJAAACBQJzaAUCc2gEA2FtdAkBBWFzSW50AQkA/AcEBQF0Ah5yZXBsZW5pc2hGb3JSZXBheVdpdGhBdG9rZW5Gb3IJAMwIAgUEdXNlcgUDbmlsCQDMCAIFB3BheW1lbnQFA25pbAMJAAACBQNhbXQFA2FtdAQBYwkBBWFzSW50AQkA/AcEBQF0AhFjb2xsYXBzZUZvckFtb3VudAkAzAgCBQR1c2VyCQDMCAIFA2FtdAUDbmlsBQNuaWwDCQAAAgUBYwUBYwMJAGYCBQNhbXQFAWMJAAIBAhFyZXBheWluZyB0b28gbXVjaAQDcFJ3CQECdVMFCQClCAEFAXQCBmJvcnJvdwUEdXNlcgkBAS0BBQFjCQEBLQEFAWMDCQAAAgUDcFJ3BQNwUncEBHBSdzIJAQJ1UwUJAKUIAQUBdAIHZGVwb3NpdAUEdXNlcgkAZQIFA2FtdAUBYwkBAS0BBQFjAwkAAAIFBHBSdzIFBHBSdzIFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLhwBaQEKaW5pdGlhbGl6ZQECY2EJAMwIAgkBEHdyaXRlQ29uc3RTdHJpbmcCBQtjb25maWdTdG9yZQUCY2EFA25pbAFpAQdkZXBvc2l0AgNyc3IFYXNDb2wJAQlkb0RlcG9zaXQDBQFpBQNyc3IFBWFzQ29sAWkBCmRlcG9zaXRSZWYDA3JzcgVhc0NvbANyZWYJAQlkb0RlcG9zaXQDBQFpBQNyc3IFBWFzQ29sAWkBBXJlcGF5AQNyc3IEBHVzZXIJAKUIAQgFAWkGY2FsbGVyBAJzaAkBAnNSAQUDcnNyAwkAAAIFAnNoBQJzaAQGcmVwYWlkCQEFYXNJbnQBCQD8BwQJAQN2bFIBBQNyc3ICCHJlcGF5Rm9yCQDMCAIFBHVzZXIFA25pbAgFAWkIcGF5bWVudHMDCQAAAgUGcmVwYWlkBQZyZXBhaWQEA3BSdwkBAnVTBQUDcnNyAgZib3Jyb3cFBHVzZXIJAQEtAQUGcmVwYWlkCQEBLQEFBnJlcGFpZAMJAAACBQNwUncFA3BSdwUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCm1pbnRBdG9rZW4CCGFUb2tlbklkA2FtdAQEdXNlcgkApQgBCAUBaQZjYWxsZXIEAXQJAQlyZXNlcnZlQnkCBQVhVElkUwUIYVRva2VuSWQEAnNoCQECc1IBCQClCAEFAXQDCQAAAgUCc2gFAnNoBAZhY3R1YWwJAQVhc0ludAEJAPwHBAUBdAINbWludEF0b2tlbkZvcgkAzAgCBQR1c2VyCQDMCAIFA2FtdAUDbmlsBQNuaWwDCQAAAgUGYWN0dWFsBQZhY3R1YWwEA3BSdwkBAnVTBQkApQgBBQF0AgdkZXBvc2l0BQR1c2VyCQEBLQEFBmFjdHVhbAAAAwkAAAIFA3BSdwUDcFJ3BANicHUJAQVhc0ludAEJAQ12YWxpZGF0ZUFmdGVyAgUEdXNlcgIHbWludGluZwMJAAACBQNicHUFA2JwdQQCcGMJARJlbnN1cmVOb1Byb2hpYml0ZWQDBQR1c2VyBQNicHUJAKUIAQUBdAMJAAACBQJwYwUCcGMFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARNyZXBsZW5pc2hXaXRoQXRva2VuAAQEdXNlcgkApQgBCAUBaQZjYWxsZXIEBmNoZWNrcwkBEWVuc3VyZU5vUHJvdGVjdGVkAQUEdXNlcgMJAAACBQZjaGVja3MFBmNoZWNrcwQIYVRva2VuSWQJANgEAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQCDmJhZCBhc3NldElkKHcpBANyc3IJAQlyZXNlcnZlQnkCBQVhVElkUwUIYVRva2VuSWQEAnNoCQECc1IBCQClCAEFA3JzcgMJAAACBQJzaAUCc2gEA2FtdAkBBWFzSW50AQkA/AcEBQNyc3ICFnJlcGxlbmlzaFdpdGhBdG9rZW5Gb3IJAMwIAgUEdXNlcgUDbmlsCAUBaQhwYXltZW50cwMJAAACBQNhbXQFA2FtdAQDcFJ3CQECdVMFCQClCAEFA3JzcgIHZGVwb3NpdAUEdXNlcgUDYW10AAADCQAAAgUDcFJ3BQNwUncEAWUJAQtlbnN1cmVMaW1pdAQCBmltcG9ydAUDcnNyBQR1c2VyBQNhbXQDCQAAAgUBZQUBZQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDXJlZGVlbUF0b2tlbnMABAR1c2VyCQClCAEIBQFpBmNhbGxlcgQIYVRva2VuSWQJANgEAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQCEmJhZCBhc3NldElkOiBXQVZFUwQDcnNyCQEJcmVzZXJ2ZUJ5AgUFYVRJZFMFCGFUb2tlbklkBAJzaAkBAnNSAQkApQgBBQNyc3IDCQAAAgUCc2gFAnNoBANhbXQJAQVhc0ludAEJAPwHBAUDcnNyAhByZWRlZW1BdG9rZW5zRm9yCQDMCAIFBHVzZXIFA25pbAgFAWkIcGF5bWVudHMDCQAAAgUDYW10BQNhbXQEA3BSdwkBAnVTBQkApQgBBQNyc3ICB2RlcG9zaXQFBHVzZXIAAAkBAS0BBQNhbXQDCQAAAgUDcFJ3BQNwUncEAWUJAQtlbnN1cmVMaW1pdAQCBnJlZGVlbQUDcnNyBQR1c2VyBQNhbXQDCQAAAgUBZQUBZQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCHdpdGhkcmF3Agdhc3NldElkA2FtdAQEdXNlcgkApQgBCAUBaQZjYWxsZXIEAXIJAQlyZXNlcnZlQnkCBQRhSWRTBQdhc3NldElkBAZyZXN1bHQJAQVhc0ludAEJAQp3ZEludGVybmFsBAUEdXNlcgUBcgUDYW10Agt3aXRoZHJhd0ZvcgMJAAACBQZyZXN1bHQFBnJlc3VsdAQDYnB1CQEFYXNJbnQBCQENdmFsaWRhdGVBZnRlcgIFBHVzZXICC3dpdGhkcmF3aW5nAwkAAAIFA2JwdQUDYnB1BAJwYwkBEmVuc3VyZU5vUHJvaGliaXRlZAMFBHVzZXIFA2JwdQkApQgBBQFyAwkAAAIFAnBjBQJwYwkAlAoCBQNuaWwFBnJlc3VsdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQl3aXRoZHJhdzICA3JzcgNhbXQEBHVzZXIJAKUIAQgFAWkGY2FsbGVyBAJzaAkBAnNSAQUDcnNyAwkAAAIFAnNoBQJzaAQHcnNyQWRkcgkBA3ZsUgEFA3JzcgQGYWN0dWFsCQEFYXNJbnQBCQD8BwQFB3JzckFkZHICC3dpdGhkcmF3Rm9yCQDMCAIFBHVzZXIJAMwIAgUDYW10BQNuaWwFA25pbAMJAAACBQZhY3R1YWwFBmFjdHVhbAQDcFJ3CQECdVMFBQNyc3ICB2RlcG9zaXQFBHVzZXIJAQEtAQUGYWN0dWFsCQEBLQEFBmFjdHVhbAMJAAACBQNwUncFA3BSdwQDYnB1AwkBCGNvbnRhaW5zAgULbGlxdWlkYXRvcnMFBHVzZXIAAAQBZQkBC2Vuc3VyZUxpbWl0BAIId2l0aGRyYXcFB3JzckFkZHIFBHVzZXIFBmFjdHVhbAMJAAACBQFlBQFlCQEFYXNJbnQBCQENdmFsaWRhdGVBZnRlcgIFBHVzZXICDHdpdGhkcmF3aW5nMgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgQCcGMJARJlbnN1cmVOb1Byb2hpYml0ZWQDBQR1c2VyBQNicHUFA3JzcgMJAAACBQJwYwUCcGMJAJQKAgUDbmlsBQZhY3R1YWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQERcHJvdGVjdENvbGxhdGVyYWwBA3JzcgQEdXNlcgkApQgBCAUBaQZjYWxsZXIEAXIJAQN2bFIBBQNyc3IEA2FtdAkBBWFzSW50AQkBCndkSW50ZXJuYWwEBQR1c2VyBQFyAP///////////wECDndpdGhkcmF3VG9NYWluAwkAAAIFA2FtdAUDYW10BAphc3NldElkU3RyCQERQGV4dHJOYXRpdmUoMTA1MykCBQFyBQRhSWRTBAFwCQD8BwQFEHByb3RlY3RlZFJlc2VydmUCCXN1cHBseUZvcgkAzAgCBQR1c2VyBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQtwdXJlQXNzZXRJZAEFCmFzc2V0SWRTdHIFA2FtdAUDbmlsAwkAAAIFAXAFAXAJAJQKAgUDbmlsBQNhbXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEbd2l0aGRyYXdQcm90ZWN0ZWRDb2xsYXRlcmFsAgdhc3NldElkA2FtdAQEdXNlcgkApQgBCAUBaQZjYWxsZXIEAWEJAQVhc0ludAEJAPwHBAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCBRBwcm90ZWN0ZWRSZXNlcnZlAhNubyBwcm90ZWN0ZWRSZXNlcnZlAgt3aXRoZHJhd0ZvcgkAzAgCBQR1c2VyCQDMCAIFB2Fzc2V0SWQJAMwIAgUDYW10BQNuaWwFA25pbAMJAAACBQFhBQFhAwkBCGNvbnRhaW5zAgUVaWdub3JlVmFsaWRhdGlvblVzZXJzBQR1c2VyBQNuaWwEAnZhCQENdmFsaWRhdGVBZnRlcgIFBHVzZXICFXdpdGhkcmF3aW5nIHByb3RlY3RlZAMJAAACBQJ2YQUCdmEFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARNub3JtYWxpemVDb2xsYXRlcmFsAQNyc3IEBGFkZHIJAKUIAQgFAWkGY2FsbGVyBAJyQQkBA3ZsUgEFA3JzcgMJAAACBQJyQQUCckEEAnNoCQECc1IBBQNyc3IDCQAAAgUCc2gFAnNoBAphc3NldElkU3RyCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUCckEFBGFJZFMJAKwCAgITbm8gYXNzZXRJZCBpbiByc3Y6IAUDcnNyBAJtYwkBDm1vdmVDb2xsYXRlcmFsBAUEYWRkcgUKYXNzZXRJZFN0cgUCckEFA3JzcgMJAAACBQJtYwUCbWMFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQZib3Jyb3cCB2Fzc2V0SWQDYW10BAR1c2VyCQClCAEIBQFpBmNhbGxlcgQDcnNyCQEJcmVzZXJ2ZUJ5AgUEYUlkUwUHYXNzZXRJZAQCc2gJAQJzUgEJAKUIAQUDcnNyAwkAAAIFAnNoBQJzaAQBYQkA/AcEBQNyc3ICCWJvcnJvd0ZvcgkAzAgCBQR1c2VyCQDMCAIFA2FtdAUDbmlsBQNuaWwDCQAAAgUBYQUBYQQDcFJ3CQECdVMFCQClCAEFA3JzcgIGYm9ycm93BQR1c2VyBQNhbXQFA2FtdAMJAAACBQNwUncFA3BSdwQBZQkBC2Vuc3VyZUxpbWl0BAIGYm9ycm93BQNyc3IFBHVzZXIFA2FtdAMJAAACBQFlBQFlBANicHUJAQVhc0ludAEJAQ12YWxpZGF0ZUFmdGVyAgUEdXNlcgIJYm9ycm93aW5nAwkAAAIFA2JwdQUDYnB1BAJwYwkBHWVuc3VyZU5vUHJvaGliaXRlZENvbGxhdGVyYWxzAQUEdXNlcgMJAAACBQJwYwUCcGMFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQdib3Jyb3cyAgNyc3IDYW10BAR1c2VyCQClCAEIBQFpBmNhbGxlcgQBcgkBA3ZsUgEFA3JzcgQCc2gJAQJzUgEFA3JzcgMJAAACBQJzaAUCc2gEAWEJAPwHBAUBcgIJYm9ycm93Rm9yCQDMCAIFBHVzZXIJAMwIAgUDYW10BQNuaWwFA25pbAMJAAACBQFhBQFhBANwUncJAQJ1UwUFA3JzcgIGYm9ycm93BQR1c2VyBQNhbXQFA2FtdAMJAAACBQNwUncFA3BSdwQBZQkBC2Vuc3VyZUxpbWl0BAIGYm9ycm93BQFyBQR1c2VyBQNhbXQDCQAAAgUBZQUBZQQDYnB1CQEFYXNJbnQBCQENdmFsaWRhdGVBZnRlcgIFBHVzZXICCWJvcnJvd2luZwMJAAACBQNicHUFA2JwdQQCcGMJAR1lbnN1cmVOb1Byb2hpYml0ZWRDb2xsYXRlcmFscwEFBHVzZXIDCQAAAgUCcGMFAnBjBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEIY29sbGFwc2UCA3JzcgNhbXQEBHVzZXIJAKUIAQgFAWkGY2FsbGVyBAJzaAkBAnNSAQUDcnNyAwkAAAIFAnNoBQJzaAQBYwkBBWFzSW50AQkA/AcECQEDdmxSAQUDcnNyAhFjb2xsYXBzZUZvckFtb3VudAkAzAgCBQR1c2VyCQDMCAIFA2FtdAUDbmlsBQNuaWwDCQAAAgUBYwUBYwQDcFJ3CQECdVMFBQNyc3ICBmJvcnJvdwUEdXNlcgkBAS0BBQFjCQEBLQEFAWMDCQAAAgUDcFJ3BQNwUncEBHBSdzIJAQJ1UwUFA3JzcgIHZGVwb3NpdAUEdXNlcgkBAS0BBQFjCQEBLQEFAWMDCQAAAgUEcFJ3MgUEcFJ3MgUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDmNsYWltRWJSZXdhcmQyAgNhbXQEbG9jawQEdXNlcgkApQgBCAUBaQZjYWxsZXIEAWMJAQVhc0ludAEJAPwHBAUDZWJSAhBjbGFpbUViUmV3YXJkRm9yCQDMCAIFBHVzZXIJAMwIAgUDYW10BQNuaWwFA25pbAMJAAACBQFjBQFjCQEMbG9ja09yUGF5b3V0AwgFAWkGY2FsbGVyBQFjBQRsb2NrCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDGNsYWltUmV3YXJkMgMDcnNyA2FtdARsb2NrBAF2CQEDdmxSAQUDcnNyAwkAAAIFAXYFAXYEBHVzZXIJAKUIAQgFAWkGY2FsbGVyBAFjCQEFYXNJbnQBCQD8BwQFAlZEAg5jbGFpbVJld2FyZEZvcgkAzAgCBQNyc3IJAMwIAgUEdXNlcgkAzAgCBQNhbXQFA25pbAUDbmlsAwkAAAIFAWMFAWMJAQxsb2NrT3JQYXlvdXQDCAUBaQZjYWxsZXIFAWMFBGxvY2sJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEhY2xhaW1BbGxSZXdhcmRzQW5kQWxsRWJBdmFpbGFibGUyAgRsb2NrDXVuc3Rha2VMZWdhY3kEBHVzZXIJAKUIAQgFAWkGY2FsbGVyBAJjcgkBFmNsYWltQWxsUmV3YXJkc0ZvclVzZXIBBQR1c2VyAwkAAAIFAmNyBQJjcgQEY3JMcAkBGGNsYWltQWxsTHBSZXdhcmRzRm9yVXNlcgEFBHVzZXIDCQAAAgUEY3JMcAUEY3JMcAQCbEEDBQ11bnN0YWtlTGVnYWN5CQEFYXNJbnQBCQD8BwQFAnZTAhN1bnN0YWtlQWxsVmlyZXNGcm9tCQDMCAIFBHVzZXIFA25pbAUDbmlsAAADCQAAAgUCbEEFAmxBCQEMbG9ja09yUGF5b3V0AwgFAWkGY2FsbGVyCQBkAgkAZAIFAmNyBQRjckxwBQJsQQUEbG9jawkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARZkaXNhYmxlVXNlQXNDb2xsYXRlcmFsAQNyc3IEBHVzZXIJAKUIAQgFAWkGY2FsbGVyBAFkCQD8BwQJAQN2bFIBBQNyc3ICGWRpc2FibGVVc2VBc0NvbGxhdGVyYWxGb3IJAMwIAgUEdXNlcgUDbmlsBQNuaWwDCQAAAgUBZAUBZAQCdmEJAQ12YWxpZGF0ZUFmdGVyAgUEdXNlcgIaY2hhbmdpbmcgY29sbGF0ZXJhbCBzdGF0dXMDCQAAAgUCdmEFAnZhBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEJbG9ja1ZpcmVzAgZmYWN0b3IHbWlncmF0ZQQEdXNlcgkApQgBCAUBaQZjYWxsZXIEAWEJAQRzcGZyAAMJAAACBQFhBQFhBA1taWdyYXRlQW1vdW50AwUHbWlncmF0ZQkBBWFzSW50AQkA/AcEBQJ2UwITdW5zdGFrZUFsbFZpcmVzRnJvbQkAzAgCBQR1c2VyBQNuaWwFA25pbAAABAV0b3RhbAkAZAIFDW1pZ3JhdGVBbW91bnQJAQx2aXJlc1BheW1lbnQBBQFpBAFsCQD8BwQFAmRDAgdsb2NrRm9yCQDMCAIFBHVzZXIJAMwIAgUGZmFjdG9yBQNuaWwDCQAAAgUFdG90YWwAAAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQx2aXJlc0Fzc2V0SWQFBXRvdGFsBQNuaWwDCQAAAgUBbAUBbAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBGHdpdGhkcmF3QWxsUG9zc2libGVWaXJlcwAEBHVzZXIJAKUIAQgFAWkGY2FsbGVyBAFhCQEEc3BmcgADCQAAAgUBYQUBYQQRc3Rha2VyVmlyZXNBbW91bnQJAQVhc0ludAEJAPwHBAUCdlMCE3Vuc3Rha2VBbGxWaXJlc0Zyb20JAMwIAgUEdXNlcgUDbmlsBQNuaWwDCQAAAgURc3Rha2VyVmlyZXNBbW91bnQFEXN0YWtlclZpcmVzQW1vdW50BAF1CQD8BwQFAmRDAhN3aXRoZHJhd1VubG9ja2VkRm9yCQDMCAIFBHVzZXIFA25pbAUDbmlsAwkAAAIFAXUFAXUJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBRFzdGFrZXJWaXJlc0Ftb3VudAUMdmlyZXNBc3NldElkBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEXY2xhaW1Qcm90b2NvbFByb2ZpdEZyb20CBGZyb20GcmVsb2NrBAR1c2VyCQClCAEIBQFpBmNhbGxlcgQBYQkBBHNwZnIAAwkAAAIFAWEFAWEEAXUJAPwHBAUCZEMCC2NsYWltUHJvZml0CQDMCAIFBGZyb20JAMwIAgUEdXNlcgkAzAgCBQZyZWxvY2sFA25pbAUDbmlsAwkAAAIFAXUFAXUFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARV3aXRoZHJhd1VubG9ja2VkVmlyZXMABAFhCQEEc3BmcgADCQAAAgUBYQUBYQQBdQkA/AcEBQJkQwITd2l0aGRyYXdVbmxvY2tlZEZvcgkAzAgCCQClCAEIBQFpBmNhbGxlcgUDbmlsBQNuaWwDCQAAAgUBdQUBdQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCmxvY2tTdXBwbHkCB3Jlc2VydmUGcGVyaW9kBANyc3IJAQN2bFIBBQdyZXNlcnZlBAR1c2VyCQClCAEIBQFpBmNhbGxlcgQGY2hlY2tzCQERZW5zdXJlTm9Qcm90ZWN0ZWQBBQR1c2VyAwkAAAIFBmNoZWNrcwUGY2hlY2tzBAhhVG9rZW5JZAkBBXZhbHVlAQkBC3B1cmVBc3NldElkAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFA3JzcgIIYVRva2VuSWQCFm5vIGFUb2tlbklkIGluIHJlc2VydmUECW1pZ3JhdGlvbgMJAAACCQCQAwEIBQFpCHBheW1lbnRzAAAFBHVuaXQDCQAAAggJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBQhhVG9rZW5JZAUEdW5pdAMJAAACCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQJAQtwdXJlQXNzZXRJZAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQNyc3IFBGFJZFMCFW5vIGFzc2V0SWQgaW4gcmVzZXJ2ZQQCc2gJAQJzUgEFB3Jlc2VydmUDCQAAAgUCc2gFAnNoBAZhY3Rpb24JAPwHBAUDcnNyAgpkZXBvc2l0Rm9yCQDMCAIFBHVzZXIJAMwIAgYFA25pbAgFAWkIcGF5bWVudHMDCQAAAgUGYWN0aW9uBQZhY3Rpb24EA2FtdAgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQEA3BSdwkBAnVTBQUHcmVzZXJ2ZQIHZGVwb3NpdAUEdXNlcgUDYW10BQNhbXQDCQAAAgUDcFJ3BQNwUncFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAhJiYWQgYXNzZXQgYXR0YWNoZWQDCQAAAgUJbWlncmF0aW9uBQltaWdyYXRpb24EBG1pbnQEAnNoCQECc1IBBQdyZXNlcnZlAwkAAAIFAnNoBQJzaAQGYWN0dWFsCQEFYXNJbnQBCQD8BwQFA3JzcgIPbWludEF0b2tlbkZvclRvCQDMCAIFBHVzZXIJAMwIAgD///////////8BCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQNuaWwDCQAAAgUGYWN0dWFsBQZhY3R1YWwEA3BSdwkBAnVTBQkApQgBBQNyc3ICB2RlcG9zaXQFBHVzZXIJAQEtAQUGYWN0dWFsAAADCQAAAgUDcFJ3BQNwUncEAnZhCQENdmFsaWRhdGVBZnRlcgIFBHVzZXICDGxvY2stbWludGluZwMJAAACBQJ2YQUCdmEFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgMJAAACBQRtaW50BQRtaW50BAdiYWxhbmNlCQDwBwIFBHRoaXMFCGFUb2tlbklkBAFyCQD8BwQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQETdmFsdWVPckVycm9yTWVzc2FnZQIFC21heWJlTG9ja2VyAhZubyBscF9sb2NrZXIgaW4gY29uZmlnAh9iYWQgbHBfbG9ja2VyIGFkZHJlc3MgaW4gY29uZmlnAgZsb2NrTFAJAMwIAgUEdXNlcgkAzAgCBQZwZXJpb2QFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUIYVRva2VuSWQFB2JhbGFuY2UFA25pbAMJAAACBQFyBQFyCQCUCgIFA25pbAUHYmFsYW5jZQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARJyZXBheVdpdGhBdG9rZW5Gb3IBBHVzZXIEBmNoZWNrcwMJAQEhAQkBCWlzRGVmaW5lZAEJAKYIAQUEdXNlcgkAAgECCGJhZCB1c2VyBgMJAAACBQZjaGVja3MFBmNoZWNrcwkBF3JlcGF5V2l0aEF0b2tlbkludGVybmFsAgUEdXNlcgkAkQMCCAUBaQhwYXltZW50cwAACQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBD3JlcGF5V2l0aEF0b2tlbgAJARdyZXBheVdpdGhBdG9rZW5JbnRlcm5hbAIJAKUIAQgFAWkGY2FsbGVyCQCRAwIIBQFpCHBheW1lbnRzAAABaQEIcmVwYXlGb3ICA3JzcgR1c2VyBAZjaGVja3MDCQEBIQEJAQlpc0RlZmluZWQBCQCmCAEFBHVzZXIJAAIBAghiYWQgdXNlcgYDCQAAAgUGY2hlY2tzBQZjaGVja3MEAnNoCQECc1IBBQNyc3IDCQAAAgUCc2gFAnNoBAZyZXBhaWQJAQVhc0ludAEJAPwHBAkBA3ZsUgEFA3JzcgIIcmVwYXlGb3IJAMwIAgUEdXNlcgUDbmlsCAUBaQhwYXltZW50cwMJAAACBQZyZXBhaWQFBnJlcGFpZAQDcFJ3CQECdVMFBQNyc3ICBmJvcnJvdwUEdXNlcgkBAS0BBQZyZXBhaWQJAQEtAQUGcmVwYWlkAwkAAAIFA3BSdwUDcFJ3BQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEIaGVhbHRoT2YBB2FkZHJlc3MEDSR0MDI0NTgzMjQ2MzQJAQZhc0ludDMBCQEJdXNlclBvd2VyAQUHYWRkcmVzcwQCYnAIBQ0kdDAyNDU4MzI0NjM0Al8xBANicHUIBQ0kdDAyNDU4MzI0NjM0Al8yBAZpZ25vcmUIBQ0kdDAyNDU4MzI0NjM0Al8zCQCUCgIFA25pbAkAlAoCBQJicAUDYnB1AQJ0eAEGdmVyaWZ5AAQSbWF5YmVPcmFjbGVBZGRyZXNzBAckbWF0Y2gwCQCdCAIFDWNvbmZpZ0FkZHJlc3MCDm9yYWNsZV9hZGRyZXNzAwkAAQIFByRtYXRjaDACBlN0cmluZwQBcwUHJG1hdGNoMAkApggBBQFzBQR1bml0BAZIRUlHSFQFBmhlaWdodAQEQkFTRQDoBwQLcXVvcnVtUmF0aW8JARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQ1jb25maWdBZGRyZXNzAhVwcm9wb3NhbF9xdW9ydW1fcmF0aW8CInByb3Bvc2FsUXVvcnVtUmF0aW8gaXMgbm90IGRlZmluZWQEC3Bhc3NlZFJhdGlvCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUNY29uZmlnQWRkcmVzcwIVcHJvcG9zYWxfcGFzc2VkX3JhdGlvAiVwcm9wb3NhbFRocmVzaG9sZFJhdGlvIGlzIG5vdCBkZWZpbmVkBA5nVmlyZXNDb250cmFjdAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQ1jb25maWdBZGRyZXNzAhJkaXZpZGVuZHNfY29udHJhY3QCFW5vIGRpdmlkZW5kc19jb250cmFjdAIaaW52YWxpZCBkaXZpZGVuZHNfY29udHJhY3QEDnZvdGluZ0NvbnRyYWN0CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFDWNvbmZpZ0FkZHJlc3MCD3ZvdGluZ19jb250cmFjdAISbm8gdm90aW5nX2NvbnRyYWN0AhdpbnZhbGlkIHZvdGluZ19jb250cmFjdAQCaWQJANgEAQgFAnR4AmlkBAh2b3Rlc1llcwkBC3ZhbHVlT3JFbHNlAgkAmggCBQ52b3RpbmdDb250cmFjdAkArAICAg1wcm9wb3NhbF95ZXNfBQJpZAAABAd2b3Rlc05vCQELdmFsdWVPckVsc2UCCQCaCAIFDnZvdGluZ0NvbnRyYWN0CQCsAgICDHByb3Bvc2FsX25vXwUCaWQAAAQOcHJvcG9zYWxIZWlnaHQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQ52b3RpbmdDb250cmFjdAkArAICAhBwcm9wb3NhbF9oZWlnaHRfBQJpZAIXcHJvcG9zYWwgbm90IHJlZ2lzdGVyZWQECmFwcGx5U3RhcnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUOdm90aW5nQ29udHJhY3QJAKwCAgIUcHJvcG9zYWxfYXBwbHlzdGFydF8FAmlkAAAECGFwcGx5RW5kCQELdmFsdWVPckVsc2UCCQCaCAIFDnZvdGluZ0NvbnRyYWN0CQCsAgICEnByb3Bvc2FsX2FwcGx5ZW5kXwUCaWQAAAQLdG90YWxHVmlyZXMJAQt2YWx1ZU9yRWxzZQIJAJoIAgUOdm90aW5nQ29udHJhY3QJAKwCAgIQcHJvcG9zYWxfZ3ZpcmVzXwUCaWQAAAQHZW5hYmxlZAkBC3ZhbHVlT3JFbHNlAgkAmwgCBQ1jb25maWdBZGRyZXNzAh1vcF9nb3Zlcm5hbmNlX2FwcGx5X3R4X3BhdXNlZAcEB3ZvdGVZZXMFCHZvdGVzWWVzBAZ2b3RlTm8FB3ZvdGVzTm8ECnRvdGFsVm90ZXMJAGQCBQd2b3RlWWVzBQZ2b3RlTm8ECWhhc1F1b3J1bQkAZwIJAGkCCQBoAgUKdG90YWxWb3RlcwUEQkFTRQULdG90YWxHVmlyZXMFC3F1b3J1bVJhdGlvBAloYXNQYXNzZWQJAGcCCQBpAgkAaAIFB3ZvdGVZZXMFBEJBU0UFCnRvdGFsVm90ZXMFC3Bhc3NlZFJhdGlvBAh0b29FYXJseQkAZwIFCmFwcGx5U3RhcnQFBkhFSUdIVAQHdG9vTGF0ZQkAZwIFBkhFSUdIVAUIYXBwbHlFbmQECXRpbWVEZWJ1ZwkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAhFwcm9wb3NhbEhlaWdodCA9IAkApAMBBQ5wcm9wb3NhbEhlaWdodAIPLCBhcHBseVN0YXJ0ID0gCQCkAwEFCmFwcGx5U3RhcnQCDSwgYXBwbHlFbmQgPSAJAKQDAQUIYXBwbHlFbmQCCywgSEVJR0hUID0gCQCkAwEFBkhFSUdIVAQIYnlWb3RpbmcDCQEBIQEFB2VuYWJsZWQJAAIBAit0eCBhcHBsaWNhdGlvbiB0aHJvdyBnb3Zlcm5hbmNlIG5vdCBlbmFibGVkAwUIdG9vRWFybHkJAAIBCQCsAgICLnByb3Bvc2FsIGNhbid0IGJlIGV4ZWN1dGVkIGFzIGl0J3MgdG9vIGVhcmx5OiAFCXRpbWVEZWJ1ZwMFB3Rvb0xhdGUJAAIBCQCsAgICLHByb3Bvc2FsIGNhbid0IGJlIGV4ZWN1dGVkIGFzIGl0J3MgdG9vIGxhdGU6BQl0aW1lRGVidWcDCQEBIQEFCWhhc1F1b3J1bQkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICC25vIHF1b3J1bTogAgx0b3RhbFZvdGVzOiAJAKQDAQUKdG90YWxWb3RlcwIPLCB0b3RhbEdWaXJlczogCQCkAwEFC3RvdGFsR1ZpcmVzAg8sIHF1b3J1bVJhdGlvOiAJAKQDAQULcXVvcnVtUmF0aW8DCQEBIQEFCWhhc1Bhc3NlZAkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICF25vIHRocmVzaG9sZCBhY2hpZXZlZDogAgl2b3RlWWVzOiAJAKQDAQUHdm90ZVllcwIKLCB2b3RlTm86IAkApAMBBQZ2b3RlTm8CDywgcGFzc2VkUmF0aW86IAkApAMBBQtwYXNzZWRSYXRpbwYDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACAUCdHgPc2VuZGVyUHVibGljS2V5BgUIYnlWb3RpbmeZo5fA", "chainId": 87, "height": 3867245, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: D3ybpjjEgebtbwFCZ9kcXenNYNhaBPfzZADfRZcUvwWX Next: 8e8HrE5nV2B1FG5BNKfsTWynyzVzm1dhnYgLwWcZrWfY Diff:
OldNewDifferences
6363 let reservesStr = valueOrErrorMessage(getString(configAddress, "primary_reserves"), "no reserves registered")
6464
6565 let reserves = split_4C(reservesStr, "|")
66+
67+let ignoreValidationUsers = valueOrElse(getString(configAddress, "ignore_validation_addresses"), "3P84evXSWMchYMa6hkLLRmQ4usHf4cNsjNp")
6668
6769 let ebR = addressFromStringValue(valueOrErrorMessage(getString(configAddress, "eb_rewards"), "no eb_rewards"))
6870
236238 0
237239 }
238240 func fold (totals,r) = {
239- let $t090939139 = totals
240- let totalD = $t090939139._1
241- let totalB = $t090939139._2
242- let numberOfBorrows = $t090939139._3
241+ let $t092279273 = totals
242+ let totalD = $t092279273._1
243+ let totalB = $t092279273._2
244+ let numberOfBorrows = $t092279273._3
243245 let rsr = valueOrErrorMessage(addressFromString(r), "rsr bad address")
244246 let cf = collateralFactor(rsr)
245247 let lt = liquidationThreshold(rsr)
246- let $t092939377 = userBalance(rsr, user)
247- let token = $t092939377._1
248- let asset = $t092939377._2
249- let depositUsd = $t092939377._3
250- let debt = $t092939377._4
251- let debtUsd = $t092939377._5
252- let asCollateral = $t092939377._6
248+ let $t094279511 = userBalance(rsr, user)
249+ let token = $t094279511._1
250+ let asset = $t094279511._2
251+ let depositUsd = $t094279511._3
252+ let debt = $t094279511._4
253+ let debtUsd = $t094279511._5
254+ let asCollateral = $t094279511._6
253255 let totalBorrows = (numberOfBorrows + (if ((debt > 0))
254256 then 1
255257 else 0))
263265 else $Tuple3((totalD + fraction((effectiveDepositUsd - debtUsd), cf, factorsBase)), (totalB + overlapCharge), totalBorrows)
264266 }
265267
266- let $l = reserves
267- let $s = size($l)
268- let $acc0 = $Tuple3(protectedDeposit, 0, 0)
269- func $f0_1 ($a,$i) = if (($i >= $s))
270- then $a
271- else fold($a, $l[$i])
268+ let r = {
269+ let $l = reserves
270+ let $s = size($l)
271+ let $acc0 = $Tuple3(protectedDeposit, 0, 0)
272+ func $f0_1 ($a,$i) = if (($i >= $s))
273+ then $a
274+ else fold($a, $l[$i])
272275
273- func $f0_2 ($a,$i) = if (($i >= $s))
274- then $a
275- else throw("List size exceeds 20")
276+ func $f0_2 ($a,$i) = if (($i >= $s))
277+ then $a
278+ else throw("List size exceeds 20")
276279
277- $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)
280+ $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)
281+ }
282+ if (if ((protectedDeposit > 0))
283+ then (r._3 > 4)
284+ else false)
285+ then throw("can't have more than 4 borrows")
286+ else r
278287 }
279288
280289
281290 func getUserHealth (account) = {
282- let $t01003110082 = asInt3(userPower(account))
283- let bp = $t01003110082._1
284- let bpu = $t01003110082._2
285- let ignore = $t01003110082._3
291+ let $t01026610317 = asInt3(userPower(account))
292+ let bp = $t01026610317._1
293+ let bpu = $t01026610317._2
294+ let ignore = $t01026610317._3
286295 ((("bp:" + toString(bp)) + ", bpu:") + toString(bpu))
287296 }
288297
289298
290299 func validateAfter (user,op) = {
291- let $t01019410225 = userPower(user)
292- let bp = $t01019410225._1
293- let bpu = $t01019410225._2
300+ let $t01042910460 = userPower(user)
301+ let bp = $t01042910460._1
302+ let bpu = $t01042910460._2
294303 let accHealth = (((bp - bpu) * factorsBase) / bp)
295304 if (if ((bp == 0))
296305 then (bpu == 0)
721730 let user = toString(i.caller)
722731 let a = asInt(invoke(valueOrErrorMessage(protectedReserve, "no protectedReserve"), "withdrawFor", [user, assetId, amt], nil))
723732 if ((a == a))
724- then {
725- let va = validateAfter(user, "withdrawing protected")
726- if ((va == va))
727- then nil
728- else throw("Strict value is not equal to itself.")
729- }
733+ then if (contains(ignoreValidationUsers, user))
734+ then nil
735+ else {
736+ let va = validateAfter(user, "withdrawing protected")
737+ if ((va == va))
738+ then nil
739+ else throw("Strict value is not equal to itself.")
740+ }
730741 else throw("Strict value is not equal to itself.")
731742 }
732743
11111122
11121123 @Callable(i)
11131124 func healthOf (address) = {
1114- let $t02428324334 = asInt3(userPower(address))
1115- let bp = $t02428324334._1
1116- let bpu = $t02428324334._2
1117- let ignore = $t02428324334._3
1125+ let $t02458324634 = asInt3(userPower(address))
1126+ let bp = $t02458324634._1
1127+ let bpu = $t02458324634._2
1128+ let ignore = $t02458324634._3
11181129 $Tuple2(nil, $Tuple2(bp, bpu))
11191130 }
11201131
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let factorsBase = 1000
55
66 func fCi (value,numerator,denominator) = {
77 let cand = fraction(value, numerator, denominator)
88 let D = 3037000499
99 let exact = ((((cand % D) * (denominator % D)) % D) == (((value % D) * (numerator % D)) % D))
1010 if (exact)
1111 then cand
1212 else (cand + 1)
1313 }
1414
1515
1616 func pureAssetId (assetId) = {
1717 let i = split(assetId, "_")[0]
1818 if ((i == "WAVES"))
1919 then unit
2020 else fromBase58String(i)
2121 }
2222
2323
2424 func writeConstString (key,value) = if (!(isDefined(getString(this, key))))
2525 then StringEntry(key, value)
2626 else throw(("already initialized: " + key))
2727
2828
2929 func asInt (value) = match value {
3030 case int: Int =>
3131 int
3232 case _ =>
3333 throw("m:1")
3434 }
3535
3636
3737 func asInt3 (value) = match value {
3838 case x: (Int, Int, Int) =>
3939 x
4040 case t =>
4141 throw("2")
4242 }
4343
4444
4545 func asUserBalanceData (value) = match value {
4646 case x: (Int, Int, Int, Int, Int, Boolean) =>
4747 x
4848 case t =>
4949 throw("3")
5050 }
5151
5252
5353 let configStore = "config"
5454
5555 let aTIdS = "aTokenId"
5656
5757 let aIdS = "assetId"
5858
5959 let configAddress = addressFromStringValue(getStringValue(this, configStore))
6060
6161 let maybeLocker = getString(configAddress, "lp_locker")
6262
6363 let reservesStr = valueOrErrorMessage(getString(configAddress, "primary_reserves"), "no reserves registered")
6464
6565 let reserves = split_4C(reservesStr, "|")
66+
67+let ignoreValidationUsers = valueOrElse(getString(configAddress, "ignore_validation_addresses"), "3P84evXSWMchYMa6hkLLRmQ4usHf4cNsjNp")
6668
6769 let ebR = addressFromStringValue(valueOrErrorMessage(getString(configAddress, "eb_rewards"), "no eb_rewards"))
6870
6971 let viresMinter = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, "vires_minter"), "main: no viresMinter")), "bad minter")
7072
7173 let maybevS = getString(configAddress, "vires_staker")
7274
7375 let vS = addressFromStringValue(valueOrErrorMessage(maybevS, "no vires_staker"))
7476
7577 let dC = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, "dividends_contract"), "no dividends_contract")), "bad div")
7678
7779 let mVD = match getString(configAddress, "vires_distributor") {
7880 case d: String =>
7981 addressFromStringValue(d)
8082 case _ =>
8183 unit
8284 }
8385
8486 let VD = valueOrErrorMessage(mVD, "no distr")
8587
8688 let limiter = match getString(configAddress, "limiter") {
8789 case d: String =>
8890 addressFromStringValue(d)
8991 case _ =>
9092 unit
9193 }
9294
9395 let maybeViresAssetId = getString(viresMinter, aIdS)
9496
9597 let viresAssetId = valueOrErrorMessage(fromBase58String(valueOrErrorMessage(maybeViresAssetId, "no vires id")), "invalid vires id")
9698
9799 func viresPayment (i) = if ((size(i.payments) == 0))
98100 then 0
99101 else if ((i.payments[0].assetId != viresAssetId))
100102 then throw("not vires")
101103 else i.payments[0].amount
102104
103105
104106 func assetIdOfReserve (rsr) = valueOrErrorMessage(getString(rsr, aIdS), "no assetId in rsr")
105107
106108
107109 func collateralFactor (rsr) = valueOrErrorMessage(getInteger(configAddress, (assetIdOfReserve(rsr) + "_CollateralFactor")), "no 1")
108110
109111
110112 func liquidationThreshold (rsr) = valueOrErrorMessage(getInteger(configAddress, (assetIdOfReserve(rsr) + "_LiquidationThreshold")), "no 2")
111113
112114
113115 let accountHealthThreshold = valueOrErrorMessage(getInteger(configAddress, "account_health_threshold"), "no 4")
114116
115117 let accountHealthOverlap = valueOrErrorMessage(getInteger(configAddress, "account_health_overlap"), "no 5")
116118
117119 let liquidators = valueOrElse(getString(configAddress, "liquidators"), "")
118120
119121 func reserveBy (store,value) = {
120122 func fold (a,r) = match a {
121123 case found: Address =>
122124 found
123125 case _ =>
124126 let rsr = valueOrErrorMessage(addressFromString(r), "rsr bad address")
125127 if ((valueOrErrorMessage(getString(rsr, store), ("rsr has no " + store)) == value))
126128 then rsr
127129 else unit
128130 }
129131
130132 match let $l = reserves
131133 let $s = size($l)
132134 let $acc0 = unit
133135 func $f0_1 ($a,$i) = if (($i >= $s))
134136 then $a
135137 else fold($a, $l[$i])
136138
137139 func $f0_2 ($a,$i) = if (($i >= $s))
138140 then $a
139141 else throw("List size exceeds 20")
140142
141143 $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) {
142144 case found: Address =>
143145 found
144146 case _ =>
145147 throw(("unknown " + store))
146148 }
147149 }
148150
149151
150152 func vlR (r) = if (contains(reservesStr, r))
151153 then valueOrErrorMessage(addressFromString(r), "main: bad rsr")
152154 else throw(("unknown rsr:" + r))
153155
154156
155157 func userBalance (rsr,user) = asUserBalanceData(invoke(rsr, "userBalance", [user], nil))
156158
157159
158160 let maybeProtected = match getString(configAddress, "protected_reserve") {
159161 case pds: String =>
160162 valueOrErrorMessage(addressFromString(pds), "bad protected")
161163 case _ =>
162164 unit
163165 }
164166
165167 let protectedReserve = valueOrErrorMessage(maybeProtected, "no protected rsr")
166168
167169 let prohibitedCollateralReserves = match getString(configAddress, "prohibitedCollateralReserves") {
168170 case s: String =>
169171 split(s, "|")
170172 case _ =>
171173 nil
172174 }
173175
174176 func ensureNoProhibitedCollaterals (user) = {
175177 func foldFunc (a,prohibitedReserve) = {
176178 let atb = valueOrElse(getInteger(addressFromStringValue(prohibitedReserve), (user + "_aTokenBalance")), 0)
177179 if ((atb > 1))
178180 then throw((((("operation denied: user has deposit in " + prohibitedReserve) + ": ") + toString(atb)) + "(lp tokens)"))
179181 else true
180182 }
181183
182184 let ensureNoProtectedUSDNorEURN = {
183185 let any = (valueOrElse(getInteger(protectedReserve, ("userShares_DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p_" + user)), 0) + valueOrElse(getInteger(protectedReserve, ("userShares_DUk2YTxhRoAqMJLus4G2b3fR8hMHVh6eiyFx5r29VR6t_" + user)), 0))
184186 if ((any > 0))
185187 then throw("has non-borrowable Neutrino assets as collateral")
186188 else true
187189 }
188190 let $l = prohibitedCollateralReserves
189191 let $s = size($l)
190192 let $acc0 = ensureNoProtectedUSDNorEURN
191193 func $f0_1 ($a,$i) = if (($i >= $s))
192194 then $a
193195 else foldFunc($a, $l[$i])
194196
195197 func $f0_2 ($a,$i) = if (($i >= $s))
196198 then $a
197199 else throw("List size exceeds 15")
198200
199201 $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)
200202 }
201203
202204
203205 func ensureNoProhibited (user,bpu,reserve) = if (if ((bpu == 0))
204206 then true
205207 else isDefined(indexOf(prohibitedCollateralReserves, reserve)))
206208 then true
207209 else ensureNoProhibitedCollaterals(user)
208210
209211
210212 func ensureNoProtected (user) = {
211213 let has = match maybeProtected {
212214 case pa: Address =>
213215 valueOrElse(getBoolean(pa, ("protected_collateral_" + user)), false)
214216 case _ =>
215217 false
216218 }
217219 if (has)
218220 then throw("disallowed")
219221 else unit
220222 }
221223
222224
223225 func ensureLimit (action,rsr,user,amount) = match limiter {
224226 case l: Address =>
225227 asInt(invoke(l, "validateLimit", [action, toString(rsr), user, amount], nil))
226228 case _ =>
227229 true
228230 }
229231
230232
231233 func userPower (user) = {
232234 let protectedDeposit = match maybeProtected {
233235 case pa: Address =>
234236 asInt(invoke(pa, "borrowPower", [user], nil))
235237 case _ =>
236238 0
237239 }
238240 func fold (totals,r) = {
239- let $t090939139 = totals
240- let totalD = $t090939139._1
241- let totalB = $t090939139._2
242- let numberOfBorrows = $t090939139._3
241+ let $t092279273 = totals
242+ let totalD = $t092279273._1
243+ let totalB = $t092279273._2
244+ let numberOfBorrows = $t092279273._3
243245 let rsr = valueOrErrorMessage(addressFromString(r), "rsr bad address")
244246 let cf = collateralFactor(rsr)
245247 let lt = liquidationThreshold(rsr)
246- let $t092939377 = userBalance(rsr, user)
247- let token = $t092939377._1
248- let asset = $t092939377._2
249- let depositUsd = $t092939377._3
250- let debt = $t092939377._4
251- let debtUsd = $t092939377._5
252- let asCollateral = $t092939377._6
248+ let $t094279511 = userBalance(rsr, user)
249+ let token = $t094279511._1
250+ let asset = $t094279511._2
251+ let depositUsd = $t094279511._3
252+ let debt = $t094279511._4
253+ let debtUsd = $t094279511._5
254+ let asCollateral = $t094279511._6
253255 let totalBorrows = (numberOfBorrows + (if ((debt > 0))
254256 then 1
255257 else 0))
256258 let effectiveDepositUsd = if (asCollateral)
257259 then depositUsd
258260 else 0
259261 let overlapUsd = min([debtUsd, effectiveDepositUsd])
260262 let overlapCharge = fCi(overlapUsd, accountHealthOverlap, factorsBase)
261263 if ((debtUsd > effectiveDepositUsd))
262264 then $Tuple3(totalD, ((totalB + fraction((debtUsd - effectiveDepositUsd), factorsBase, lt)) + overlapCharge), totalBorrows)
263265 else $Tuple3((totalD + fraction((effectiveDepositUsd - debtUsd), cf, factorsBase)), (totalB + overlapCharge), totalBorrows)
264266 }
265267
266- let $l = reserves
267- let $s = size($l)
268- let $acc0 = $Tuple3(protectedDeposit, 0, 0)
269- func $f0_1 ($a,$i) = if (($i >= $s))
270- then $a
271- else fold($a, $l[$i])
268+ let r = {
269+ let $l = reserves
270+ let $s = size($l)
271+ let $acc0 = $Tuple3(protectedDeposit, 0, 0)
272+ func $f0_1 ($a,$i) = if (($i >= $s))
273+ then $a
274+ else fold($a, $l[$i])
272275
273- func $f0_2 ($a,$i) = if (($i >= $s))
274- then $a
275- else throw("List size exceeds 20")
276+ func $f0_2 ($a,$i) = if (($i >= $s))
277+ then $a
278+ else throw("List size exceeds 20")
276279
277- $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)
280+ $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)
281+ }
282+ if (if ((protectedDeposit > 0))
283+ then (r._3 > 4)
284+ else false)
285+ then throw("can't have more than 4 borrows")
286+ else r
278287 }
279288
280289
281290 func getUserHealth (account) = {
282- let $t01003110082 = asInt3(userPower(account))
283- let bp = $t01003110082._1
284- let bpu = $t01003110082._2
285- let ignore = $t01003110082._3
291+ let $t01026610317 = asInt3(userPower(account))
292+ let bp = $t01026610317._1
293+ let bpu = $t01026610317._2
294+ let ignore = $t01026610317._3
286295 ((("bp:" + toString(bp)) + ", bpu:") + toString(bpu))
287296 }
288297
289298
290299 func validateAfter (user,op) = {
291- let $t01019410225 = userPower(user)
292- let bp = $t01019410225._1
293- let bpu = $t01019410225._2
300+ let $t01042910460 = userPower(user)
301+ let bp = $t01042910460._1
302+ let bpu = $t01042910460._2
294303 let accHealth = (((bp - bpu) * factorsBase) / bp)
295304 if (if ((bp == 0))
296305 then (bpu == 0)
297306 else false)
298307 then 0
299308 else if (if ((bp == 0))
300309 then (bpu > 0)
301310 else false)
302311 then throw(((op + ": breaching liquidation threshold(bp=0, bpu=") + toString(bpu)))
303312 else if ((accountHealthThreshold > accHealth))
304313 then throw((((((((op + ": breaching liquidation threshold(bp=") + toString(bp)) + ", bpu=") + toString(bpu)) + ", health=") + toString(accHealth)) + ")"))
305314 else bpu
306315 }
307316
308317
309318 func uS (rsr,action,user,userChange,streamChange) = match mVD {
310319 case a: Address =>
311320 invoke(a, "onAction", [rsr, action, user, userChange, streamChange], nil)
312321 case _ =>
313322 unit
314323 }
315324
316325
317326 func moveStream (rsr,action,from,string,amt) = match mVD {
318327 case a: Address =>
319328 invoke(a, "move", [rsr, action, from, string, amt], nil)
320329 case _ =>
321330 unit
322331 }
323332
324333
325334 func sR (rsr) = match mVD {
326335 case a: Address =>
327336 invoke(a, "syncHeight", [rsr], nil)
328337 case _ =>
329338 unit
330339 }
331340
332341
333342 func lockOrPayout (recipient,amt,lock) = if (!(lock))
334343 then [ScriptTransfer(recipient, amt, viresAssetId)]
335344 else {
336345 let doLock = invoke(dC, "lockFor", [toString(recipient), 1], [AttachedPayment(viresAssetId, amt)])
337346 if ((doLock == doLock))
338347 then nil
339348 else throw("Strict value is not equal to itself.")
340349 }
341350
342351
343352 func doDeposit (i,rsr,asCol) = {
344353 let user = toString(i.caller)
345354 let checks = ensureNoProtected(user)
346355 if ((checks == checks))
347356 then {
348357 let sh = sR(rsr)
349358 if ((sh == sh))
350359 then {
351360 let action = invoke(vlR(rsr), "depositFor", [user, asCol], i.payments)
352361 if ((action == action))
353362 then {
354363 let amt = i.payments[0].amount
355364 let pRw = uS(rsr, "deposit", user, amt, amt)
356365 if ((pRw == pRw))
357366 then {
358367 let va = if (!(asCol))
359368 then validateAfter(user, "depositing")
360369 else 0
361370 if ((va == va))
362371 then nil
363372 else throw("Strict value is not equal to itself.")
364373 }
365374 else throw("Strict value is not equal to itself.")
366375 }
367376 else throw("Strict value is not equal to itself.")
368377 }
369378 else throw("Strict value is not equal to itself.")
370379 }
371380 else throw("Strict value is not equal to itself.")
372381 }
373382
374383
375384 let rewardReserves = split_4C(valueOrErrorMessage(getString(configAddress, "rewardable_reserves"), "no string"), "|")
376385
377386 func claimAllRewardsForUser (user) = {
378387 let claimedEb = asInt(invoke(ebR, "claimEbRewardFor", [user, -1], nil))
379388 if ((claimedEb == claimedEb))
380389 then {
381390 func fold (acc,rsr) = {
382391 let claimed = asInt(invoke(VD, "claimRewardFor", [rsr, user, -1], nil))
383392 if ((claimed == claimed))
384393 then (acc + claimed)
385394 else throw("Strict value is not equal to itself.")
386395 }
387396
388397 let claimedTotal = {
389398 let $l = rewardReserves
390399 let $s = size($l)
391400 let $acc0 = 0
392401 func $f0_1 ($a,$i) = if (($i >= $s))
393402 then $a
394403 else fold($a, $l[$i])
395404
396405 func $f0_2 ($a,$i) = if (($i >= $s))
397406 then $a
398407 else throw("List size exceeds 20")
399408
400409 $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)
401410 }
402411 (claimedTotal + claimedEb)
403412 }
404413 else throw("Strict value is not equal to itself.")
405414 }
406415
407416
408417 func claimAllLpRewardsForUser (user) = match maybeLocker {
409418 case s: String =>
410419 let locker = valueOrErrorMessage(addressFromString(s), "bad lp_locker address in config")
411420 func fold (acc,rsr) = {
412421 let aTokenId = valueOrErrorMessage(getString(addressFromStringValue(rsr), aTIdS), "no aTokenId in reserve")
413422 let claimed = asInt(invoke(locker, "claimLpRewardFor", [user, aTokenId, -1], nil))
414423 if ((claimed == claimed))
415424 then (acc + claimed)
416425 else throw("Strict value is not equal to itself.")
417426 }
418427
419428 let claimedTotal = {
420429 let $l = rewardReserves
421430 let $s = size($l)
422431 let $acc0 = 0
423432 func $f0_1 ($a,$i) = if (($i >= $s))
424433 then $a
425434 else fold($a, $l[$i])
426435
427436 func $f0_2 ($a,$i) = if (($i >= $s))
428437 then $a
429438 else throw("List size exceeds 20")
430439
431440 $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)
432441 }
433442 claimedTotal
434443 case _ =>
435444 0
436445 }
437446
438447
439448 func moveCollateral (addr,assetStr,rsr,reserveStr) = {
440449 let amt = asInt(invoke(protectedReserve, "withdrawToMain", [addr, assetStr], nil))
441450 if ((amt == amt))
442451 then {
443452 let dep = invoke(rsr, "depositFor", [addr, true], [AttachedPayment(pureAssetId(assetStr), amt)])
444453 if ((dep == dep))
445454 then {
446455 let prop = uS(reserveStr, "deposit", addr, amt, amt)
447456 if ((prop == prop))
448457 then unit
449458 else throw("Strict value is not equal to itself.")
450459 }
451460 else throw("Strict value is not equal to itself.")
452461 }
453462 else throw("Strict value is not equal to itself.")
454463 }
455464
456465
457466 func spfr () = invoke(dC, "shareProfitFromReserves", nil, nil)
458467
459468
460469 func wdInternal (user,rsr,amt,op) = {
461470 let sh = sR(toString(rsr))
462471 if ((sh == sh))
463472 then {
464473 let withdrawnAmount = asInt(invoke(rsr, op, [user, amt], nil))
465474 if ((withdrawnAmount == withdrawnAmount))
466475 then {
467476 let pRw = uS(toString(rsr), "deposit", user, -(withdrawnAmount), -(withdrawnAmount))
468477 if ((pRw == pRw))
469478 then {
470479 let e = ensureLimit("withdraw", rsr, user, withdrawnAmount)
471480 if ((e == e))
472481 then withdrawnAmount
473482 else throw("Strict value is not equal to itself.")
474483 }
475484 else throw("Strict value is not equal to itself.")
476485 }
477486 else throw("Strict value is not equal to itself.")
478487 }
479488 else throw("Strict value is not equal to itself.")
480489 }
481490
482491
483492 func repayWithAtokenInternal (user,payment) = {
484493 let aTokenId = toBase58String(valueOrErrorMessage(payment.assetId, "bad assetId: waves not allowed"))
485494 let t = reserveBy(aTIdS, aTokenId)
486495 let sh = sR(toString(t))
487496 if ((sh == sh))
488497 then {
489498 let amt = asInt(invoke(t, "replenishForRepayWithAtokenFor", [user], [payment]))
490499 if ((amt == amt))
491500 then {
492501 let c = asInt(invoke(t, "collapseForAmount", [user, amt], nil))
493502 if ((c == c))
494503 then if ((amt > c))
495504 then throw("repaying too much")
496505 else {
497506 let pRw = uS(toString(t), "borrow", user, -(c), -(c))
498507 if ((pRw == pRw))
499508 then {
500509 let pRw2 = uS(toString(t), "deposit", user, (amt - c), -(c))
501510 if ((pRw2 == pRw2))
502511 then nil
503512 else throw("Strict value is not equal to itself.")
504513 }
505514 else throw("Strict value is not equal to itself.")
506515 }
507516 else throw("Strict value is not equal to itself.")
508517 }
509518 else throw("Strict value is not equal to itself.")
510519 }
511520 else throw("Strict value is not equal to itself.")
512521 }
513522
514523
515524 @Callable(i)
516525 func initialize (ca) = [writeConstString(configStore, ca)]
517526
518527
519528
520529 @Callable(i)
521530 func deposit (rsr,asCol) = doDeposit(i, rsr, asCol)
522531
523532
524533
525534 @Callable(i)
526535 func depositRef (rsr,asCol,ref) = doDeposit(i, rsr, asCol)
527536
528537
529538
530539 @Callable(i)
531540 func repay (rsr) = {
532541 let user = toString(i.caller)
533542 let sh = sR(rsr)
534543 if ((sh == sh))
535544 then {
536545 let repaid = asInt(invoke(vlR(rsr), "repayFor", [user], i.payments))
537546 if ((repaid == repaid))
538547 then {
539548 let pRw = uS(rsr, "borrow", user, -(repaid), -(repaid))
540549 if ((pRw == pRw))
541550 then nil
542551 else throw("Strict value is not equal to itself.")
543552 }
544553 else throw("Strict value is not equal to itself.")
545554 }
546555 else throw("Strict value is not equal to itself.")
547556 }
548557
549558
550559
551560 @Callable(i)
552561 func mintAtoken (aTokenId,amt) = {
553562 let user = toString(i.caller)
554563 let t = reserveBy(aTIdS, aTokenId)
555564 let sh = sR(toString(t))
556565 if ((sh == sh))
557566 then {
558567 let actual = asInt(invoke(t, "mintAtokenFor", [user, amt], nil))
559568 if ((actual == actual))
560569 then {
561570 let pRw = uS(toString(t), "deposit", user, -(actual), 0)
562571 if ((pRw == pRw))
563572 then {
564573 let bpu = asInt(validateAfter(user, "minting"))
565574 if ((bpu == bpu))
566575 then {
567576 let pc = ensureNoProhibited(user, bpu, toString(t))
568577 if ((pc == pc))
569578 then nil
570579 else throw("Strict value is not equal to itself.")
571580 }
572581 else throw("Strict value is not equal to itself.")
573582 }
574583 else throw("Strict value is not equal to itself.")
575584 }
576585 else throw("Strict value is not equal to itself.")
577586 }
578587 else throw("Strict value is not equal to itself.")
579588 }
580589
581590
582591
583592 @Callable(i)
584593 func replenishWithAtoken () = {
585594 let user = toString(i.caller)
586595 let checks = ensureNoProtected(user)
587596 if ((checks == checks))
588597 then {
589598 let aTokenId = toBase58String(valueOrErrorMessage(i.payments[0].assetId, "bad assetId(w)"))
590599 let rsr = reserveBy(aTIdS, aTokenId)
591600 let sh = sR(toString(rsr))
592601 if ((sh == sh))
593602 then {
594603 let amt = asInt(invoke(rsr, "replenishWithAtokenFor", [user], i.payments))
595604 if ((amt == amt))
596605 then {
597606 let pRw = uS(toString(rsr), "deposit", user, amt, 0)
598607 if ((pRw == pRw))
599608 then {
600609 let e = ensureLimit("import", rsr, user, amt)
601610 if ((e == e))
602611 then nil
603612 else throw("Strict value is not equal to itself.")
604613 }
605614 else throw("Strict value is not equal to itself.")
606615 }
607616 else throw("Strict value is not equal to itself.")
608617 }
609618 else throw("Strict value is not equal to itself.")
610619 }
611620 else throw("Strict value is not equal to itself.")
612621 }
613622
614623
615624
616625 @Callable(i)
617626 func redeemAtokens () = {
618627 let user = toString(i.caller)
619628 let aTokenId = toBase58String(valueOrErrorMessage(i.payments[0].assetId, "bad assetId: WAVES"))
620629 let rsr = reserveBy(aTIdS, aTokenId)
621630 let sh = sR(toString(rsr))
622631 if ((sh == sh))
623632 then {
624633 let amt = asInt(invoke(rsr, "redeemAtokensFor", [user], i.payments))
625634 if ((amt == amt))
626635 then {
627636 let pRw = uS(toString(rsr), "deposit", user, 0, -(amt))
628637 if ((pRw == pRw))
629638 then {
630639 let e = ensureLimit("redeem", rsr, user, amt)
631640 if ((e == e))
632641 then nil
633642 else throw("Strict value is not equal to itself.")
634643 }
635644 else throw("Strict value is not equal to itself.")
636645 }
637646 else throw("Strict value is not equal to itself.")
638647 }
639648 else throw("Strict value is not equal to itself.")
640649 }
641650
642651
643652
644653 @Callable(i)
645654 func withdraw (assetId,amt) = {
646655 let user = toString(i.caller)
647656 let r = reserveBy(aIdS, assetId)
648657 let result = asInt(wdInternal(user, r, amt, "withdrawFor"))
649658 if ((result == result))
650659 then {
651660 let bpu = asInt(validateAfter(user, "withdrawing"))
652661 if ((bpu == bpu))
653662 then {
654663 let pc = ensureNoProhibited(user, bpu, toString(r))
655664 if ((pc == pc))
656665 then $Tuple2(nil, result)
657666 else throw("Strict value is not equal to itself.")
658667 }
659668 else throw("Strict value is not equal to itself.")
660669 }
661670 else throw("Strict value is not equal to itself.")
662671 }
663672
664673
665674
666675 @Callable(i)
667676 func withdraw2 (rsr,amt) = {
668677 let user = toString(i.caller)
669678 let sh = sR(rsr)
670679 if ((sh == sh))
671680 then {
672681 let rsrAddr = vlR(rsr)
673682 let actual = asInt(invoke(rsrAddr, "withdrawFor", [user, amt], nil))
674683 if ((actual == actual))
675684 then {
676685 let pRw = uS(rsr, "deposit", user, -(actual), -(actual))
677686 if ((pRw == pRw))
678687 then {
679688 let bpu = if (contains(liquidators, user))
680689 then 0
681690 else {
682691 let e = ensureLimit("withdraw", rsrAddr, user, actual)
683692 if ((e == e))
684693 then asInt(validateAfter(user, "withdrawing2"))
685694 else throw("Strict value is not equal to itself.")
686695 }
687696 let pc = ensureNoProhibited(user, bpu, rsr)
688697 if ((pc == pc))
689698 then $Tuple2(nil, actual)
690699 else throw("Strict value is not equal to itself.")
691700 }
692701 else throw("Strict value is not equal to itself.")
693702 }
694703 else throw("Strict value is not equal to itself.")
695704 }
696705 else throw("Strict value is not equal to itself.")
697706 }
698707
699708
700709
701710 @Callable(i)
702711 func protectCollateral (rsr) = {
703712 let user = toString(i.caller)
704713 let r = vlR(rsr)
705714 let amt = asInt(wdInternal(user, r, -1, "withdrawToMain"))
706715 if ((amt == amt))
707716 then {
708717 let assetIdStr = getStringValue(r, aIdS)
709718 let p = invoke(protectedReserve, "supplyFor", [user], [AttachedPayment(pureAssetId(assetIdStr), amt)])
710719 if ((p == p))
711720 then $Tuple2(nil, amt)
712721 else throw("Strict value is not equal to itself.")
713722 }
714723 else throw("Strict value is not equal to itself.")
715724 }
716725
717726
718727
719728 @Callable(i)
720729 func withdrawProtectedCollateral (assetId,amt) = {
721730 let user = toString(i.caller)
722731 let a = asInt(invoke(valueOrErrorMessage(protectedReserve, "no protectedReserve"), "withdrawFor", [user, assetId, amt], nil))
723732 if ((a == a))
724- then {
725- let va = validateAfter(user, "withdrawing protected")
726- if ((va == va))
727- then nil
728- else throw("Strict value is not equal to itself.")
729- }
733+ then if (contains(ignoreValidationUsers, user))
734+ then nil
735+ else {
736+ let va = validateAfter(user, "withdrawing protected")
737+ if ((va == va))
738+ then nil
739+ else throw("Strict value is not equal to itself.")
740+ }
730741 else throw("Strict value is not equal to itself.")
731742 }
732743
733744
734745
735746 @Callable(i)
736747 func normalizeCollateral (rsr) = {
737748 let addr = toString(i.caller)
738749 let rA = vlR(rsr)
739750 if ((rA == rA))
740751 then {
741752 let sh = sR(rsr)
742753 if ((sh == sh))
743754 then {
744755 let assetIdStr = valueOrErrorMessage(getString(rA, aIdS), ("no assetId in rsv: " + rsr))
745756 let mc = moveCollateral(addr, assetIdStr, rA, rsr)
746757 if ((mc == mc))
747758 then nil
748759 else throw("Strict value is not equal to itself.")
749760 }
750761 else throw("Strict value is not equal to itself.")
751762 }
752763 else throw("Strict value is not equal to itself.")
753764 }
754765
755766
756767
757768 @Callable(i)
758769 func borrow (assetId,amt) = {
759770 let user = toString(i.caller)
760771 let rsr = reserveBy(aIdS, assetId)
761772 let sh = sR(toString(rsr))
762773 if ((sh == sh))
763774 then {
764775 let a = invoke(rsr, "borrowFor", [user, amt], nil)
765776 if ((a == a))
766777 then {
767778 let pRw = uS(toString(rsr), "borrow", user, amt, amt)
768779 if ((pRw == pRw))
769780 then {
770781 let e = ensureLimit("borrow", rsr, user, amt)
771782 if ((e == e))
772783 then {
773784 let bpu = asInt(validateAfter(user, "borrowing"))
774785 if ((bpu == bpu))
775786 then {
776787 let pc = ensureNoProhibitedCollaterals(user)
777788 if ((pc == pc))
778789 then nil
779790 else throw("Strict value is not equal to itself.")
780791 }
781792 else throw("Strict value is not equal to itself.")
782793 }
783794 else throw("Strict value is not equal to itself.")
784795 }
785796 else throw("Strict value is not equal to itself.")
786797 }
787798 else throw("Strict value is not equal to itself.")
788799 }
789800 else throw("Strict value is not equal to itself.")
790801 }
791802
792803
793804
794805 @Callable(i)
795806 func borrow2 (rsr,amt) = {
796807 let user = toString(i.caller)
797808 let r = vlR(rsr)
798809 let sh = sR(rsr)
799810 if ((sh == sh))
800811 then {
801812 let a = invoke(r, "borrowFor", [user, amt], nil)
802813 if ((a == a))
803814 then {
804815 let pRw = uS(rsr, "borrow", user, amt, amt)
805816 if ((pRw == pRw))
806817 then {
807818 let e = ensureLimit("borrow", r, user, amt)
808819 if ((e == e))
809820 then {
810821 let bpu = asInt(validateAfter(user, "borrowing"))
811822 if ((bpu == bpu))
812823 then {
813824 let pc = ensureNoProhibitedCollaterals(user)
814825 if ((pc == pc))
815826 then nil
816827 else throw("Strict value is not equal to itself.")
817828 }
818829 else throw("Strict value is not equal to itself.")
819830 }
820831 else throw("Strict value is not equal to itself.")
821832 }
822833 else throw("Strict value is not equal to itself.")
823834 }
824835 else throw("Strict value is not equal to itself.")
825836 }
826837 else throw("Strict value is not equal to itself.")
827838 }
828839
829840
830841
831842 @Callable(i)
832843 func collapse (rsr,amt) = {
833844 let user = toString(i.caller)
834845 let sh = sR(rsr)
835846 if ((sh == sh))
836847 then {
837848 let c = asInt(invoke(vlR(rsr), "collapseForAmount", [user, amt], nil))
838849 if ((c == c))
839850 then {
840851 let pRw = uS(rsr, "borrow", user, -(c), -(c))
841852 if ((pRw == pRw))
842853 then {
843854 let pRw2 = uS(rsr, "deposit", user, -(c), -(c))
844855 if ((pRw2 == pRw2))
845856 then nil
846857 else throw("Strict value is not equal to itself.")
847858 }
848859 else throw("Strict value is not equal to itself.")
849860 }
850861 else throw("Strict value is not equal to itself.")
851862 }
852863 else throw("Strict value is not equal to itself.")
853864 }
854865
855866
856867
857868 @Callable(i)
858869 func claimEbReward2 (amt,lock) = {
859870 let user = toString(i.caller)
860871 let c = asInt(invoke(ebR, "claimEbRewardFor", [user, amt], nil))
861872 if ((c == c))
862873 then lockOrPayout(i.caller, c, lock)
863874 else throw("Strict value is not equal to itself.")
864875 }
865876
866877
867878
868879 @Callable(i)
869880 func claimReward2 (rsr,amt,lock) = {
870881 let v = vlR(rsr)
871882 if ((v == v))
872883 then {
873884 let user = toString(i.caller)
874885 let c = asInt(invoke(VD, "claimRewardFor", [rsr, user, amt], nil))
875886 if ((c == c))
876887 then lockOrPayout(i.caller, c, lock)
877888 else throw("Strict value is not equal to itself.")
878889 }
879890 else throw("Strict value is not equal to itself.")
880891 }
881892
882893
883894
884895 @Callable(i)
885896 func claimAllRewardsAndAllEbAvailable2 (lock,unstakeLegacy) = {
886897 let user = toString(i.caller)
887898 let cr = claimAllRewardsForUser(user)
888899 if ((cr == cr))
889900 then {
890901 let crLp = claimAllLpRewardsForUser(user)
891902 if ((crLp == crLp))
892903 then {
893904 let lA = if (unstakeLegacy)
894905 then asInt(invoke(vS, "unstakeAllViresFrom", [user], nil))
895906 else 0
896907 if ((lA == lA))
897908 then lockOrPayout(i.caller, ((cr + crLp) + lA), lock)
898909 else throw("Strict value is not equal to itself.")
899910 }
900911 else throw("Strict value is not equal to itself.")
901912 }
902913 else throw("Strict value is not equal to itself.")
903914 }
904915
905916
906917
907918 @Callable(i)
908919 func disableUseAsCollateral (rsr) = {
909920 let user = toString(i.caller)
910921 let d = invoke(vlR(rsr), "disableUseAsCollateralFor", [user], nil)
911922 if ((d == d))
912923 then {
913924 let va = validateAfter(user, "changing collateral status")
914925 if ((va == va))
915926 then nil
916927 else throw("Strict value is not equal to itself.")
917928 }
918929 else throw("Strict value is not equal to itself.")
919930 }
920931
921932
922933
923934 @Callable(i)
924935 func lockVires (factor,migrate) = {
925936 let user = toString(i.caller)
926937 let a = spfr()
927938 if ((a == a))
928939 then {
929940 let migrateAmount = if (migrate)
930941 then asInt(invoke(vS, "unstakeAllViresFrom", [user], nil))
931942 else 0
932943 let total = (migrateAmount + viresPayment(i))
933944 let l = invoke(dC, "lockFor", [user, factor], if ((total == 0))
934945 then nil
935946 else [AttachedPayment(viresAssetId, total)])
936947 if ((l == l))
937948 then nil
938949 else throw("Strict value is not equal to itself.")
939950 }
940951 else throw("Strict value is not equal to itself.")
941952 }
942953
943954
944955
945956 @Callable(i)
946957 func withdrawAllPossibleVires () = {
947958 let user = toString(i.caller)
948959 let a = spfr()
949960 if ((a == a))
950961 then {
951962 let stakerViresAmount = asInt(invoke(vS, "unstakeAllViresFrom", [user], nil))
952963 if ((stakerViresAmount == stakerViresAmount))
953964 then {
954965 let u = invoke(dC, "withdrawUnlockedFor", [user], nil)
955966 if ((u == u))
956967 then [ScriptTransfer(i.caller, stakerViresAmount, viresAssetId)]
957968 else throw("Strict value is not equal to itself.")
958969 }
959970 else throw("Strict value is not equal to itself.")
960971 }
961972 else throw("Strict value is not equal to itself.")
962973 }
963974
964975
965976
966977 @Callable(i)
967978 func claimProtocolProfitFrom (from,relock) = {
968979 let user = toString(i.caller)
969980 let a = spfr()
970981 if ((a == a))
971982 then {
972983 let u = invoke(dC, "claimProfit", [from, user, relock], nil)
973984 if ((u == u))
974985 then nil
975986 else throw("Strict value is not equal to itself.")
976987 }
977988 else throw("Strict value is not equal to itself.")
978989 }
979990
980991
981992
982993 @Callable(i)
983994 func withdrawUnlockedVires () = {
984995 let a = spfr()
985996 if ((a == a))
986997 then {
987998 let u = invoke(dC, "withdrawUnlockedFor", [toString(i.caller)], nil)
988999 if ((u == u))
9891000 then nil
9901001 else throw("Strict value is not equal to itself.")
9911002 }
9921003 else throw("Strict value is not equal to itself.")
9931004 }
9941005
9951006
9961007
9971008 @Callable(i)
9981009 func lockSupply (reserve,period) = {
9991010 let rsr = vlR(reserve)
10001011 let user = toString(i.caller)
10011012 let checks = ensureNoProtected(user)
10021013 if ((checks == checks))
10031014 then {
10041015 let aTokenId = value(pureAssetId(valueOrErrorMessage(getString(rsr, "aTokenId"), "no aTokenId in reserve")))
10051016 let migration = if ((size(i.payments) == 0))
10061017 then unit
10071018 else if ((i.payments[0].assetId == aTokenId))
10081019 then unit
10091020 else if ((i.payments[0].assetId == pureAssetId(valueOrErrorMessage(getString(rsr, aIdS), "no assetId in reserve"))))
10101021 then {
10111022 let sh = sR(reserve)
10121023 if ((sh == sh))
10131024 then {
10141025 let action = invoke(rsr, "depositFor", [user, true], i.payments)
10151026 if ((action == action))
10161027 then {
10171028 let amt = i.payments[0].amount
10181029 let pRw = uS(reserve, "deposit", user, amt, amt)
10191030 if ((pRw == pRw))
10201031 then unit
10211032 else throw("Strict value is not equal to itself.")
10221033 }
10231034 else throw("Strict value is not equal to itself.")
10241035 }
10251036 else throw("Strict value is not equal to itself.")
10261037 }
10271038 else throw("bad asset attached")
10281039 if ((migration == migration))
10291040 then {
10301041 let mint = {
10311042 let sh = sR(reserve)
10321043 if ((sh == sh))
10331044 then {
10341045 let actual = asInt(invoke(rsr, "mintAtokenForTo", [user, -1, toString(this)], nil))
10351046 if ((actual == actual))
10361047 then {
10371048 let pRw = uS(toString(rsr), "deposit", user, -(actual), 0)
10381049 if ((pRw == pRw))
10391050 then {
10401051 let va = validateAfter(user, "lock-minting")
10411052 if ((va == va))
10421053 then nil
10431054 else throw("Strict value is not equal to itself.")
10441055 }
10451056 else throw("Strict value is not equal to itself.")
10461057 }
10471058 else throw("Strict value is not equal to itself.")
10481059 }
10491060 else throw("Strict value is not equal to itself.")
10501061 }
10511062 if ((mint == mint))
10521063 then {
10531064 let balance = assetBalance(this, aTokenId)
10541065 let r = invoke(valueOrErrorMessage(addressFromString(valueOrErrorMessage(maybeLocker, "no lp_locker in config")), "bad lp_locker address in config"), "lockLP", [user, period], [AttachedPayment(aTokenId, balance)])
10551066 if ((r == r))
10561067 then $Tuple2(nil, balance)
10571068 else throw("Strict value is not equal to itself.")
10581069 }
10591070 else throw("Strict value is not equal to itself.")
10601071 }
10611072 else throw("Strict value is not equal to itself.")
10621073 }
10631074 else throw("Strict value is not equal to itself.")
10641075 }
10651076
10661077
10671078
10681079 @Callable(i)
10691080 func repayWithAtokenFor (user) = {
10701081 let checks = if (!(isDefined(addressFromString(user))))
10711082 then throw("bad user")
10721083 else true
10731084 if ((checks == checks))
10741085 then repayWithAtokenInternal(user, i.payments[0])
10751086 else throw("Strict value is not equal to itself.")
10761087 }
10771088
10781089
10791090
10801091 @Callable(i)
10811092 func repayWithAtoken () = repayWithAtokenInternal(toString(i.caller), i.payments[0])
10821093
10831094
10841095
10851096 @Callable(i)
10861097 func repayFor (rsr,user) = {
10871098 let checks = if (!(isDefined(addressFromString(user))))
10881099 then throw("bad user")
10891100 else true
10901101 if ((checks == checks))
10911102 then {
10921103 let sh = sR(rsr)
10931104 if ((sh == sh))
10941105 then {
10951106 let repaid = asInt(invoke(vlR(rsr), "repayFor", [user], i.payments))
10961107 if ((repaid == repaid))
10971108 then {
10981109 let pRw = uS(rsr, "borrow", user, -(repaid), -(repaid))
10991110 if ((pRw == pRw))
11001111 then nil
11011112 else throw("Strict value is not equal to itself.")
11021113 }
11031114 else throw("Strict value is not equal to itself.")
11041115 }
11051116 else throw("Strict value is not equal to itself.")
11061117 }
11071118 else throw("Strict value is not equal to itself.")
11081119 }
11091120
11101121
11111122
11121123 @Callable(i)
11131124 func healthOf (address) = {
1114- let $t02428324334 = asInt3(userPower(address))
1115- let bp = $t02428324334._1
1116- let bpu = $t02428324334._2
1117- let ignore = $t02428324334._3
1125+ let $t02458324634 = asInt3(userPower(address))
1126+ let bp = $t02458324634._1
1127+ let bpu = $t02458324634._2
1128+ let ignore = $t02458324634._3
11181129 $Tuple2(nil, $Tuple2(bp, bpu))
11191130 }
11201131
11211132
11221133 @Verifier(tx)
11231134 func verify () = {
11241135 let maybeOracleAddress = match getString(configAddress, "oracle_address") {
11251136 case s: String =>
11261137 addressFromString(s)
11271138 case _ =>
11281139 unit
11291140 }
11301141 let HEIGHT = height
11311142 let BASE = 1000
11321143 let quorumRatio = valueOrErrorMessage(getInteger(configAddress, "proposal_quorum_ratio"), "proposalQuorumRatio is not defined")
11331144 let passedRatio = valueOrErrorMessage(getInteger(configAddress, "proposal_passed_ratio"), "proposalThresholdRatio is not defined")
11341145 let gViresContract = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, "dividends_contract"), "no dividends_contract")), "invalid dividends_contract")
11351146 let votingContract = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, "voting_contract"), "no voting_contract")), "invalid voting_contract")
11361147 let id = toBase58String(tx.id)
11371148 let votesYes = valueOrElse(getInteger(votingContract, ("proposal_yes_" + id)), 0)
11381149 let votesNo = valueOrElse(getInteger(votingContract, ("proposal_no_" + id)), 0)
11391150 let proposalHeight = valueOrErrorMessage(getInteger(votingContract, ("proposal_height_" + id)), "proposal not registered")
11401151 let applyStart = valueOrElse(getInteger(votingContract, ("proposal_applystart_" + id)), 0)
11411152 let applyEnd = valueOrElse(getInteger(votingContract, ("proposal_applyend_" + id)), 0)
11421153 let totalGVires = valueOrElse(getInteger(votingContract, ("proposal_gvires_" + id)), 0)
11431154 let enabled = valueOrElse(getBoolean(configAddress, "op_governance_apply_tx_paused"), false)
11441155 let voteYes = votesYes
11451156 let voteNo = votesNo
11461157 let totalVotes = (voteYes + voteNo)
11471158 let hasQuorum = (((totalVotes * BASE) / totalGVires) >= quorumRatio)
11481159 let hasPassed = (((voteYes * BASE) / totalVotes) >= passedRatio)
11491160 let tooEarly = (applyStart >= HEIGHT)
11501161 let tooLate = (HEIGHT >= applyEnd)
11511162 let timeDebug = ((((((("proposalHeight = " + toString(proposalHeight)) + ", applyStart = ") + toString(applyStart)) + ", applyEnd = ") + toString(applyEnd)) + ", HEIGHT = ") + toString(HEIGHT))
11521163 let byVoting = if (!(enabled))
11531164 then throw("tx application throw governance not enabled")
11541165 else if (tooEarly)
11551166 then throw(("proposal can't be executed as it's too early: " + timeDebug))
11561167 else if (tooLate)
11571168 then throw(("proposal can't be executed as it's too late:" + timeDebug))
11581169 else if (!(hasQuorum))
11591170 then throw((((((("no quorum: " + "totalVotes: ") + toString(totalVotes)) + ", totalGVires: ") + toString(totalGVires)) + ", quorumRatio: ") + toString(quorumRatio)))
11601171 else if (!(hasPassed))
11611172 then throw((((((("no threshold achieved: " + "voteYes: ") + toString(voteYes)) + ", voteNo: ") + toString(voteNo)) + ", passedRatio: ") + toString(passedRatio)))
11621173 else true
11631174 if (sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey))
11641175 then true
11651176 else byVoting
11661177 }
11671178

github/deemru/w8io/786bc32 
119.89 ms