2023.07.11 12:20 [3726696] smart account 3PAZv9tgK1PX7dKR7b4kchq5qdpUS3G5sYT > SELF 0.00000000 Waves

{ "type": 13, "id": "D3ybpjjEgebtbwFCZ9kcXenNYNhaBPfzZADfRZcUvwWX", "fee": 3100000, "feeAssetId": null, "timestamp": 1689067283290, "version": 1, "sender": "3PAZv9tgK1PX7dKR7b4kchq5qdpUS3G5sYT", "senderPublicKey": "2cFG5wZimjVSeCT8ZCRybx7Mzo5tJF879aw2b31uLRmR", "proofs": [ "vHcaAZLpcehCBF8MgJdUGoPQ1wmJVyH1zUp83mogQnvoDsTcPFfpFEfgnukJEtckfnbFe4pckSwFSSxYCPfQM29" ], "script": "base64:BgKRAQgCEgMKAQgSBAoCCAQSBQoDCAQIEgMKAQgSBAoCCAESABIAEgQKAggBEgQKAggBEgMKAQgSBAoCCAESAwoBCBIECgIIARIECgIIARIECgIIARIECgIBBBIFCgMIAQQSBAoCBAQSAwoBCBIECgIBBBIAEgQKAggEEgASBAoCCAESAwoBCBIAEgQKAggIEgMKAQg4AAtmYWN0b3JzQmFzZQDoBwEDZkNpAwV2YWx1ZQludW1lcmF0b3ILZGVub21pbmF0b3IEBGNhbmQJAGsDBQV2YWx1ZQUJbnVtZXJhdG9yBQtkZW5vbWluYXRvcgQBRACz5pOoCwQFZXhhY3QJAAACCQBqAgkAaAIJAGoCBQRjYW5kBQFECQBqAgULZGVub21pbmF0b3IFAUQFAUQJAGoCCQBoAgkAagIFBXZhbHVlBQFECQBqAgUJbnVtZXJhdG9yBQFEBQFEAwUFZXhhY3QFBGNhbmQJAGQCBQRjYW5kAAEBC3B1cmVBc3NldElkAQdhc3NldElkBAFpCQCRAwIJALUJAgUHYXNzZXRJZAIBXwAAAwkAAAIFAWkCBVdBVkVTBQR1bml0CQDZBAEFAWkBEHdyaXRlQ29uc3RTdHJpbmcCA2tleQV2YWx1ZQMJAQEhAQkBCWlzRGVmaW5lZAEJAJ0IAgUEdGhpcwUDa2V5CQELU3RyaW5nRW50cnkCBQNrZXkFBXZhbHVlCQACAQkArAICAhVhbHJlYWR5IGluaXRpYWxpemVkOiAFA2tleQEFYXNJbnQBBXZhbHVlBAckbWF0Y2gwBQV2YWx1ZQMJAAECBQckbWF0Y2gwAgNJbnQEA2ludAUHJG1hdGNoMAUDaW50CQACAQIDbToxAQZhc0ludDMBBXZhbHVlBAckbWF0Y2gwBQV2YWx1ZQMJAAECBQckbWF0Y2gwAg8oSW50LCBJbnQsIEludCkEAXgFByRtYXRjaDAFAXgEAXQFByRtYXRjaDAJAAIBAgEyARFhc1VzZXJCYWxhbmNlRGF0YQEFdmFsdWUEByRtYXRjaDAFBXZhbHVlAwkAAQIFByRtYXRjaDACIihJbnQsIEludCwgSW50LCBJbnQsIEludCwgQm9vbGVhbikEAXgFByRtYXRjaDAFAXgEAXQFByRtYXRjaDAJAAIBAgEzAAtjb25maWdTdG9yZQIGY29uZmlnAAVhVElkUwIIYVRva2VuSWQABGFJZFMCB2Fzc2V0SWQADWNvbmZpZ0FkZHJlc3MJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMFC2NvbmZpZ1N0b3JlAAttYXliZUxvY2tlcgkAnQgCBQ1jb25maWdBZGRyZXNzAglscF9sb2NrZXIAC3Jlc2VydmVzU3RyCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUNY29uZmlnQWRkcmVzcwIQcHJpbWFyeV9yZXNlcnZlcwIWbm8gcmVzZXJ2ZXMgcmVnaXN0ZXJlZAAIcmVzZXJ2ZXMJALwJAgULcmVzZXJ2ZXNTdHICAXwAA2ViUgkBEUBleHRyTmF0aXZlKDEwNjIpAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFDWNvbmZpZ0FkZHJlc3MCCmViX3Jld2FyZHMCDW5vIGViX3Jld2FyZHMAC3ZpcmVzTWludGVyCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFDWNvbmZpZ0FkZHJlc3MCDHZpcmVzX21pbnRlcgIUbWFpbjogbm8gdmlyZXNNaW50ZXICCmJhZCBtaW50ZXIAB21heWJldlMJAJ0IAgUNY29uZmlnQWRkcmVzcwIMdmlyZXNfc3Rha2VyAAJ2UwkBEUBleHRyTmF0aXZlKDEwNjIpAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCBQdtYXliZXZTAg9ubyB2aXJlc19zdGFrZXIAAmRDCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFDWNvbmZpZ0FkZHJlc3MCEmRpdmlkZW5kc19jb250cmFjdAIVbm8gZGl2aWRlbmRzX2NvbnRyYWN0AgdiYWQgZGl2AANtVkQEByRtYXRjaDAJAJ0IAgUNY29uZmlnQWRkcmVzcwIRdmlyZXNfZGlzdHJpYnV0b3IDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFkBQckbWF0Y2gwCQERQGV4dHJOYXRpdmUoMTA2MikBBQFkBQR1bml0AAJWRAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCBQNtVkQCCG5vIGRpc3RyAAdsaW1pdGVyBAckbWF0Y2gwCQCdCAIFDWNvbmZpZ0FkZHJlc3MCB2xpbWl0ZXIDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFkBQckbWF0Y2gwCQERQGV4dHJOYXRpdmUoMTA2MikBBQFkBQR1bml0ABFtYXliZVZpcmVzQXNzZXRJZAkAnQgCBQt2aXJlc01pbnRlcgUEYUlkUwAMdmlyZXNBc3NldElkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJANkEAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCBRFtYXliZVZpcmVzQXNzZXRJZAILbm8gdmlyZXMgaWQCEGludmFsaWQgdmlyZXMgaWQBDHZpcmVzUGF5bWVudAEBaQMJAAACCQCQAwEIBQFpCHBheW1lbnRzAAAAAAMJAQIhPQIICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAUMdmlyZXNBc3NldElkCQACAQIJbm90IHZpcmVzCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAEQYXNzZXRJZE9mUmVzZXJ2ZQEDcnNyCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUDcnNyBQRhSWRTAhFubyBhc3NldElkIGluIHJzcgEQY29sbGF0ZXJhbEZhY3RvcgEDcnNyCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUNY29uZmlnQWRkcmVzcwkArAICCQEQYXNzZXRJZE9mUmVzZXJ2ZQEFA3JzcgIRX0NvbGxhdGVyYWxGYWN0b3ICBG5vIDEBFGxpcXVpZGF0aW9uVGhyZXNob2xkAQNyc3IJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQ1jb25maWdBZGRyZXNzCQCsAgIJARBhc3NldElkT2ZSZXNlcnZlAQUDcnNyAhVfTGlxdWlkYXRpb25UaHJlc2hvbGQCBG5vIDIAFmFjY291bnRIZWFsdGhUaHJlc2hvbGQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQ1jb25maWdBZGRyZXNzAhhhY2NvdW50X2hlYWx0aF90aHJlc2hvbGQCBG5vIDQAFGFjY291bnRIZWFsdGhPdmVybGFwCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUNY29uZmlnQWRkcmVzcwIWYWNjb3VudF9oZWFsdGhfb3ZlcmxhcAIEbm8gNQALbGlxdWlkYXRvcnMJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUNY29uZmlnQWRkcmVzcwILbGlxdWlkYXRvcnMCAAEJcmVzZXJ2ZUJ5AgVzdG9yZQV2YWx1ZQoBBGZvbGQCAWEBcgQHJG1hdGNoMAUBYQMJAAECBQckbWF0Y2gwAgdBZGRyZXNzBAVmb3VuZAUHJG1hdGNoMAUFZm91bmQEA3JzcgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEFAXICD3JzciBiYWQgYWRkcmVzcwMJAAACCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUDcnNyBQVzdG9yZQkArAICAgtyc3IgaGFzIG5vIAUFc3RvcmUFBXZhbHVlBQNyc3IFBHVuaXQEByRtYXRjaDAKAAIkbAUIcmVzZXJ2ZXMKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQR1bml0CgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQRmb2xkAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAyMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQDCQABAgUHJG1hdGNoMAIHQWRkcmVzcwQFZm91bmQFByRtYXRjaDAFBWZvdW5kCQACAQkArAICAgh1bmtub3duIAUFc3RvcmUBA3ZsUgEBcgMJAQhjb250YWlucwIFC3Jlc2VydmVzU3RyBQFyCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQUBcgINbWFpbjogYmFkIHJzcgkAAgEJAKwCAgIMdW5rbm93biByc3I6BQFyAQt1c2VyQmFsYW5jZQIDcnNyBHVzZXIJARFhc1VzZXJCYWxhbmNlRGF0YQEJAPwHBAUDcnNyAgt1c2VyQmFsYW5jZQkAzAgCBQR1c2VyBQNuaWwFA25pbAAObWF5YmVQcm90ZWN0ZWQEByRtYXRjaDAJAJ0IAgUNY29uZmlnQWRkcmVzcwIRcHJvdGVjdGVkX3Jlc2VydmUDCQABAgUHJG1hdGNoMAIGU3RyaW5nBANwZHMFByRtYXRjaDAJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBBQNwZHMCDWJhZCBwcm90ZWN0ZWQFBHVuaXQAEHByb3RlY3RlZFJlc2VydmUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgUObWF5YmVQcm90ZWN0ZWQCEG5vIHByb3RlY3RlZCByc3IAHHByb2hpYml0ZWRDb2xsYXRlcmFsUmVzZXJ2ZXMEByRtYXRjaDAJAJ0IAgUNY29uZmlnQWRkcmVzcwIccHJvaGliaXRlZENvbGxhdGVyYWxSZXNlcnZlcwMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXMFByRtYXRjaDAJALUJAgUBcwIBfAUDbmlsAR1lbnN1cmVOb1Byb2hpYml0ZWRDb2xsYXRlcmFscwEEdXNlcgoBCGZvbGRGdW5jAgFhEXByb2hpYml0ZWRSZXNlcnZlBANhdGIJAQt2YWx1ZU9yRWxzZQIJAJoIAgkBEUBleHRyTmF0aXZlKDEwNjIpAQURcHJvaGliaXRlZFJlc2VydmUJAKwCAgUEdXNlcgIOX2FUb2tlbkJhbGFuY2UAAAMJAGYCBQNhdGIAAQkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgImb3BlcmF0aW9uIGRlbmllZDogdXNlciBoYXMgZGVwb3NpdCBpbiAFEXByb2hpYml0ZWRSZXNlcnZlAgI6IAkApAMBBQNhdGICCyhscCB0b2tlbnMpBgQbZW5zdXJlTm9Qcm90ZWN0ZWRVU0ROb3JFVVJOBANhbnkJAGQCCQELdmFsdWVPckVsc2UCCQCaCAIFEHByb3RlY3RlZFJlc2VydmUJAKwCAgI4dXNlclNoYXJlc19ERzJ4RmtQZER3S1VvQmt6R0FoUXRMcFNHemZYTGlDWVBFemVLSDJBZDI0cF8FBHVzZXIAAAkBC3ZhbHVlT3JFbHNlAgkAmggCBRBwcm90ZWN0ZWRSZXNlcnZlCQCsAgICOHVzZXJTaGFyZXNfRFVrMllUeGhSb0FxTUpMdXM0RzJiM2ZSOGhNSFZoNmVpeUZ4NXIyOVZSNnRfBQR1c2VyAAADCQBmAgUDYW55AAAJAAIBAjBoYXMgbm9uLWJvcnJvd2FibGUgTmV1dHJpbm8gYXNzZXRzIGFzIGNvbGxhdGVyYWwGCgACJGwFHHByb2hpYml0ZWRDb2xsYXRlcmFsUmVzZXJ2ZXMKAAIkcwkAkAMBBQIkbAoABSRhY2MwBRtlbnN1cmVOb1Byb3RlY3RlZFVTRE5vckVVUk4KAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCGZvbGRGdW5jAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxNQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwESZW5zdXJlTm9Qcm9oaWJpdGVkAwR1c2VyA2JwdQdyZXNlcnZlAwMJAAACBQNicHUAAAYJAQlpc0RlZmluZWQBCQDPCAIFHHByb2hpYml0ZWRDb2xsYXRlcmFsUmVzZXJ2ZXMFB3Jlc2VydmUGCQEdZW5zdXJlTm9Qcm9oaWJpdGVkQ29sbGF0ZXJhbHMBBQR1c2VyARFlbnN1cmVOb1Byb3RlY3RlZAEEdXNlcgQDaGFzBAckbWF0Y2gwBQ5tYXliZVByb3RlY3RlZAMJAAECBQckbWF0Y2gwAgdBZGRyZXNzBAJwYQUHJG1hdGNoMAkBC3ZhbHVlT3JFbHNlAgkAmwgCBQJwYQkArAICAhVwcm90ZWN0ZWRfY29sbGF0ZXJhbF8FBHVzZXIHBwMFA2hhcwkAAgECCmRpc2FsbG93ZWQFBHVuaXQBC2Vuc3VyZUxpbWl0BAZhY3Rpb24DcnNyBHVzZXIGYW1vdW50BAckbWF0Y2gwBQdsaW1pdGVyAwkAAQIFByRtYXRjaDACB0FkZHJlc3MEAWwFByRtYXRjaDAJAQVhc0ludAEJAPwHBAUBbAINdmFsaWRhdGVMaW1pdAkAzAgCBQZhY3Rpb24JAMwIAgkApQgBBQNyc3IJAMwIAgUEdXNlcgkAzAgCBQZhbW91bnQFA25pbAUDbmlsBgEJdXNlclBvd2VyAQR1c2VyBBBwcm90ZWN0ZWREZXBvc2l0BAckbWF0Y2gwBQ5tYXliZVByb3RlY3RlZAMJAAECBQckbWF0Y2gwAgdBZGRyZXNzBAJwYQUHJG1hdGNoMAkBBWFzSW50AQkA/AcEBQJwYQILYm9ycm93UG93ZXIJAMwIAgUEdXNlcgUDbmlsBQNuaWwAAAoBBGZvbGQCBnRvdGFscwFyBAskdDA5MDkzOTEzOQUGdG90YWxzBAZ0b3RhbEQIBQskdDA5MDkzOTEzOQJfMQQGdG90YWxCCAULJHQwOTA5MzkxMzkCXzIED251bWJlck9mQm9ycm93cwgFCyR0MDkwOTM5MTM5Al8zBANyc3IJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBBQFyAg9yc3IgYmFkIGFkZHJlc3MEAmNmCQEQY29sbGF0ZXJhbEZhY3RvcgEFA3JzcgQCbHQJARRsaXF1aWRhdGlvblRocmVzaG9sZAEFA3JzcgQLJHQwOTI5MzkzNzcJAQt1c2VyQmFsYW5jZQIFA3JzcgUEdXNlcgQFdG9rZW4IBQskdDA5MjkzOTM3NwJfMQQFYXNzZXQIBQskdDA5MjkzOTM3NwJfMgQKZGVwb3NpdFVzZAgFCyR0MDkyOTM5Mzc3Al8zBARkZWJ0CAULJHQwOTI5MzkzNzcCXzQEB2RlYnRVc2QIBQskdDA5MjkzOTM3NwJfNQQMYXNDb2xsYXRlcmFsCAULJHQwOTI5MzkzNzcCXzYEDHRvdGFsQm9ycm93cwkAZAIFD251bWJlck9mQm9ycm93cwMJAGYCBQRkZWJ0AAAAAQAABBNlZmZlY3RpdmVEZXBvc2l0VXNkAwUMYXNDb2xsYXRlcmFsBQpkZXBvc2l0VXNkAAAECm92ZXJsYXBVc2QJAJcDAQkAzAgCBQdkZWJ0VXNkCQDMCAIFE2VmZmVjdGl2ZURlcG9zaXRVc2QFA25pbAQNb3ZlcmxhcENoYXJnZQkBA2ZDaQMFCm92ZXJsYXBVc2QFFGFjY291bnRIZWFsdGhPdmVybGFwBQtmYWN0b3JzQmFzZQMJAGYCBQdkZWJ0VXNkBRNlZmZlY3RpdmVEZXBvc2l0VXNkCQCVCgMFBnRvdGFsRAkAZAIJAGQCBQZ0b3RhbEIJAGsDCQBlAgUHZGVidFVzZAUTZWZmZWN0aXZlRGVwb3NpdFVzZAULZmFjdG9yc0Jhc2UFAmx0BQ1vdmVybGFwQ2hhcmdlBQx0b3RhbEJvcnJvd3MJAJUKAwkAZAIFBnRvdGFsRAkAawMJAGUCBRNlZmZlY3RpdmVEZXBvc2l0VXNkBQdkZWJ0VXNkBQJjZgULZmFjdG9yc0Jhc2UJAGQCBQZ0b3RhbEIFDW92ZXJsYXBDaGFyZ2UFDHRvdGFsQm9ycm93cwoAAiRsBQhyZXNlcnZlcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJUKAwUQcHJvdGVjdGVkRGVwb3NpdAAAAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBBGZvbGQCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDIwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAENZ2V0VXNlckhlYWx0aAEHYWNjb3VudAQNJHQwMTAwMzExMDA4MgkBBmFzSW50MwEJAQl1c2VyUG93ZXIBBQdhY2NvdW50BAJicAgFDSR0MDEwMDMxMTAwODICXzEEA2JwdQgFDSR0MDEwMDMxMTAwODICXzIEBmlnbm9yZQgFDSR0MDEwMDMxMTAwODICXzMJAKwCAgkArAICCQCsAgICA2JwOgkApAMBBQJicAIGLCBicHU6CQCkAwEFA2JwdQENdmFsaWRhdGVBZnRlcgIEdXNlcgJvcAQNJHQwMTAxOTQxMDIyNQkBCXVzZXJQb3dlcgEFBHVzZXIEAmJwCAUNJHQwMTAxOTQxMDIyNQJfMQQDYnB1CAUNJHQwMTAxOTQxMDIyNQJfMgQJYWNjSGVhbHRoCQBpAgkAaAIJAGUCBQJicAUDYnB1BQtmYWN0b3JzQmFzZQUCYnADAwkAAAIFAmJwAAAJAAACBQNicHUAAAcAAAMDCQAAAgUCYnAAAAkAZgIFA2JwdQAABwkAAgEJAKwCAgkArAICBQJvcAIsOiBicmVhY2hpbmcgbGlxdWlkYXRpb24gdGhyZXNob2xkKGJwPTAsIGJwdT0JAKQDAQUDYnB1AwkAZgIFFmFjY291bnRIZWFsdGhUaHJlc2hvbGQFCWFjY0hlYWx0aAkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUCb3ACJTogYnJlYWNoaW5nIGxpcXVpZGF0aW9uIHRocmVzaG9sZChicD0JAKQDAQUCYnACBiwgYnB1PQkApAMBBQNicHUCCSwgaGVhbHRoPQkApAMBBQlhY2NIZWFsdGgCASkFA2JwdQECdVMFA3JzcgZhY3Rpb24EdXNlcgp1c2VyQ2hhbmdlDHN0cmVhbUNoYW5nZQQHJG1hdGNoMAUDbVZEAwkAAQIFByRtYXRjaDACB0FkZHJlc3MEAWEFByRtYXRjaDAJAPwHBAUBYQIIb25BY3Rpb24JAMwIAgUDcnNyCQDMCAIFBmFjdGlvbgkAzAgCBQR1c2VyCQDMCAIFCnVzZXJDaGFuZ2UJAMwIAgUMc3RyZWFtQ2hhbmdlBQNuaWwFA25pbAUEdW5pdAEKbW92ZVN0cmVhbQUDcnNyBmFjdGlvbgRmcm9tBnN0cmluZwNhbXQEByRtYXRjaDAFA21WRAMJAAECBQckbWF0Y2gwAgdBZGRyZXNzBAFhBQckbWF0Y2gwCQD8BwQFAWECBG1vdmUJAMwIAgUDcnNyCQDMCAIFBmFjdGlvbgkAzAgCBQRmcm9tCQDMCAIFBnN0cmluZwkAzAgCBQNhbXQFA25pbAUDbmlsBQR1bml0AQJzUgEDcnNyBAckbWF0Y2gwBQNtVkQDCQABAgUHJG1hdGNoMAIHQWRkcmVzcwQBYQUHJG1hdGNoMAkA/AcEBQFhAgpzeW5jSGVpZ2h0CQDMCAIFA3JzcgUDbmlsBQNuaWwFBHVuaXQBDGxvY2tPclBheW91dAMJcmVjaXBpZW50A2FtdARsb2NrAwkBASEBBQRsb2NrCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFCXJlY2lwaWVudAUDYW10BQx2aXJlc0Fzc2V0SWQFA25pbAQGZG9Mb2NrCQD8BwQFAmRDAgdsb2NrRm9yCQDMCAIJAKUIAQUJcmVjaXBpZW50CQDMCAIAAQUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQx2aXJlc0Fzc2V0SWQFA2FtdAUDbmlsAwkAAAIFBmRvTG9jawUGZG9Mb2NrBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BCWRvRGVwb3NpdAMBaQNyc3IFYXNDb2wEBHVzZXIJAKUIAQgFAWkGY2FsbGVyBAZjaGVja3MJARFlbnN1cmVOb1Byb3RlY3RlZAEFBHVzZXIDCQAAAgUGY2hlY2tzBQZjaGVja3MEAnNoCQECc1IBBQNyc3IDCQAAAgUCc2gFAnNoBAZhY3Rpb24JAPwHBAkBA3ZsUgEFA3JzcgIKZGVwb3NpdEZvcgkAzAgCBQR1c2VyCQDMCAIFBWFzQ29sBQNuaWwIBQFpCHBheW1lbnRzAwkAAAIFBmFjdGlvbgUGYWN0aW9uBANhbXQICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BANwUncJAQJ1UwUFA3JzcgIHZGVwb3NpdAUEdXNlcgUDYW10BQNhbXQDCQAAAgUDcFJ3BQNwUncEAnZhAwkBASEBBQVhc0NvbAkBDXZhbGlkYXRlQWZ0ZXICBQR1c2VyAgpkZXBvc2l0aW5nAAADCQAAAgUCdmEFAnZhBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4ADnJld2FyZFJlc2VydmVzCQC8CQIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQ1jb25maWdBZGRyZXNzAhNyZXdhcmRhYmxlX3Jlc2VydmVzAglubyBzdHJpbmcCAXwBFmNsYWltQWxsUmV3YXJkc0ZvclVzZXIBBHVzZXIECWNsYWltZWRFYgkBBWFzSW50AQkA/AcEBQNlYlICEGNsYWltRWJSZXdhcmRGb3IJAMwIAgUEdXNlcgkAzAgCAP///////////wEFA25pbAUDbmlsAwkAAAIFCWNsYWltZWRFYgUJY2xhaW1lZEViCgEEZm9sZAIDYWNjA3JzcgQHY2xhaW1lZAkBBWFzSW50AQkA/AcEBQJWRAIOY2xhaW1SZXdhcmRGb3IJAMwIAgUDcnNyCQDMCAIFBHVzZXIJAMwIAgD///////////8BBQNuaWwFA25pbAMJAAACBQdjbGFpbWVkBQdjbGFpbWVkCQBkAgUDYWNjBQdjbGFpbWVkCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBAxjbGFpbWVkVG90YWwKAAIkbAUOcmV3YXJkUmVzZXJ2ZXMKAAIkcwkAkAMBBQIkbAoABSRhY2MwAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBBGZvbGQCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDIwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAkAZAIFDGNsYWltZWRUb3RhbAUJY2xhaW1lZEViCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuARhjbGFpbUFsbExwUmV3YXJkc0ZvclVzZXIBBHVzZXIEByRtYXRjaDAFC21heWJlTG9ja2VyAwkAAQIFByRtYXRjaDACBlN0cmluZwQBcwUHJG1hdGNoMAQGbG9ja2VyCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQUBcwIfYmFkIGxwX2xvY2tlciBhZGRyZXNzIGluIGNvbmZpZwoBBGZvbGQCA2FjYwNyc3IECGFUb2tlbklkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgkBEUBleHRyTmF0aXZlKDEwNjIpAQUDcnNyBQVhVElkUwIWbm8gYVRva2VuSWQgaW4gcmVzZXJ2ZQQHY2xhaW1lZAkBBWFzSW50AQkA/AcEBQZsb2NrZXICEGNsYWltTHBSZXdhcmRGb3IJAMwIAgUEdXNlcgkAzAgCBQhhVG9rZW5JZAkAzAgCAP///////////wEFA25pbAUDbmlsAwkAAAIFB2NsYWltZWQFB2NsYWltZWQJAGQCBQNhY2MFB2NsYWltZWQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4EDGNsYWltZWRUb3RhbAoAAiRsBQ5yZXdhcmRSZXNlcnZlcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEEZm9sZAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMjAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUBQxjbGFpbWVkVG90YWwAAAEObW92ZUNvbGxhdGVyYWwEBGFkZHIIYXNzZXRTdHIDcnNyCnJlc2VydmVTdHIEA2FtdAkBBWFzSW50AQkA/AcEBRBwcm90ZWN0ZWRSZXNlcnZlAg53aXRoZHJhd1RvTWFpbgkAzAgCBQRhZGRyCQDMCAIFCGFzc2V0U3RyBQNuaWwFA25pbAMJAAACBQNhbXQFA2FtdAQDZGVwCQD8BwQFA3JzcgIKZGVwb3NpdEZvcgkAzAgCBQRhZGRyCQDMCAIGBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQtwdXJlQXNzZXRJZAEFCGFzc2V0U3RyBQNhbXQFA25pbAMJAAACBQNkZXAFA2RlcAQEcHJvcAkBAnVTBQUKcmVzZXJ2ZVN0cgIHZGVwb3NpdAUEYWRkcgUDYW10BQNhbXQDCQAAAgUEcHJvcAUEcHJvcAUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEEc3BmcgAJAPwHBAUCZEMCF3NoYXJlUHJvZml0RnJvbVJlc2VydmVzBQNuaWwFA25pbAEKd2RJbnRlcm5hbAQEdXNlcgNyc3IDYW10Am9wBAJzaAkBAnNSAQkApQgBBQNyc3IDCQAAAgUCc2gFAnNoBA93aXRoZHJhd25BbW91bnQJAQVhc0ludAEJAPwHBAUDcnNyBQJvcAkAzAgCBQR1c2VyCQDMCAIFA2FtdAUDbmlsBQNuaWwDCQAAAgUPd2l0aGRyYXduQW1vdW50BQ93aXRoZHJhd25BbW91bnQEA3BSdwkBAnVTBQkApQgBBQNyc3ICB2RlcG9zaXQFBHVzZXIJAQEtAQUPd2l0aGRyYXduQW1vdW50CQEBLQEFD3dpdGhkcmF3bkFtb3VudAMJAAACBQNwUncFA3BSdwQBZQkBC2Vuc3VyZUxpbWl0BAIId2l0aGRyYXcFA3JzcgUEdXNlcgUPd2l0aGRyYXduQW1vdW50AwkAAAIFAWUFAWUFD3dpdGhkcmF3bkFtb3VudAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEXcmVwYXlXaXRoQXRva2VuSW50ZXJuYWwCBHVzZXIHcGF5bWVudAQIYVRva2VuSWQJANgEAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCAUHcGF5bWVudAdhc3NldElkAh5iYWQgYXNzZXRJZDogd2F2ZXMgbm90IGFsbG93ZWQEAXQJAQlyZXNlcnZlQnkCBQVhVElkUwUIYVRva2VuSWQEAnNoCQECc1IBCQClCAEFAXQDCQAAAgUCc2gFAnNoBANhbXQJAQVhc0ludAEJAPwHBAUBdAIecmVwbGVuaXNoRm9yUmVwYXlXaXRoQXRva2VuRm9yCQDMCAIFBHVzZXIFA25pbAkAzAgCBQdwYXltZW50BQNuaWwDCQAAAgUDYW10BQNhbXQEAWMJAQVhc0ludAEJAPwHBAUBdAIRY29sbGFwc2VGb3JBbW91bnQJAMwIAgUEdXNlcgkAzAgCBQNhbXQFA25pbAUDbmlsAwkAAAIFAWMFAWMDCQBmAgUDYW10BQFjCQACAQIRcmVwYXlpbmcgdG9vIG11Y2gEA3BSdwkBAnVTBQkApQgBBQF0AgZib3Jyb3cFBHVzZXIJAQEtAQUBYwkBAS0BBQFjAwkAAAIFA3BSdwUDcFJ3BARwUncyCQECdVMFCQClCAEFAXQCB2RlcG9zaXQFBHVzZXIJAGUCBQNhbXQFAWMJAQEtAQUBYwMJAAACBQRwUncyBQRwUncyBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4cAWkBCmluaXRpYWxpemUBAmNhCQDMCAIJARB3cml0ZUNvbnN0U3RyaW5nAgULY29uZmlnU3RvcmUFAmNhBQNuaWwBaQEHZGVwb3NpdAIDcnNyBWFzQ29sCQEJZG9EZXBvc2l0AwUBaQUDcnNyBQVhc0NvbAFpAQpkZXBvc2l0UmVmAwNyc3IFYXNDb2wDcmVmCQEJZG9EZXBvc2l0AwUBaQUDcnNyBQVhc0NvbAFpAQVyZXBheQEDcnNyBAR1c2VyCQClCAEIBQFpBmNhbGxlcgQCc2gJAQJzUgEFA3JzcgMJAAACBQJzaAUCc2gEBnJlcGFpZAkBBWFzSW50AQkA/AcECQEDdmxSAQUDcnNyAghyZXBheUZvcgkAzAgCBQR1c2VyBQNuaWwIBQFpCHBheW1lbnRzAwkAAAIFBnJlcGFpZAUGcmVwYWlkBANwUncJAQJ1UwUFA3JzcgIGYm9ycm93BQR1c2VyCQEBLQEFBnJlcGFpZAkBAS0BBQZyZXBhaWQDCQAAAgUDcFJ3BQNwUncFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQptaW50QXRva2VuAghhVG9rZW5JZANhbXQEBHVzZXIJAKUIAQgFAWkGY2FsbGVyBAF0CQEJcmVzZXJ2ZUJ5AgUFYVRJZFMFCGFUb2tlbklkBAJzaAkBAnNSAQkApQgBBQF0AwkAAAIFAnNoBQJzaAQGYWN0dWFsCQEFYXNJbnQBCQD8BwQFAXQCDW1pbnRBdG9rZW5Gb3IJAMwIAgUEdXNlcgkAzAgCBQNhbXQFA25pbAUDbmlsAwkAAAIFBmFjdHVhbAUGYWN0dWFsBANwUncJAQJ1UwUJAKUIAQUBdAIHZGVwb3NpdAUEdXNlcgkBAS0BBQZhY3R1YWwAAAMJAAACBQNwUncFA3BSdwQDYnB1CQEFYXNJbnQBCQENdmFsaWRhdGVBZnRlcgIFBHVzZXICB21pbnRpbmcDCQAAAgUDYnB1BQNicHUEAnBjCQESZW5zdXJlTm9Qcm9oaWJpdGVkAwUEdXNlcgUDYnB1CQClCAEFAXQDCQAAAgUCcGMFAnBjBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQETcmVwbGVuaXNoV2l0aEF0b2tlbgAEBHVzZXIJAKUIAQgFAWkGY2FsbGVyBAZjaGVja3MJARFlbnN1cmVOb1Byb3RlY3RlZAEFBHVzZXIDCQAAAgUGY2hlY2tzBQZjaGVja3MECGFUb2tlbklkCQDYBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAggJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkAg5iYWQgYXNzZXRJZCh3KQQDcnNyCQEJcmVzZXJ2ZUJ5AgUFYVRJZFMFCGFUb2tlbklkBAJzaAkBAnNSAQkApQgBBQNyc3IDCQAAAgUCc2gFAnNoBANhbXQJAQVhc0ludAEJAPwHBAUDcnNyAhZyZXBsZW5pc2hXaXRoQXRva2VuRm9yCQDMCAIFBHVzZXIFA25pbAgFAWkIcGF5bWVudHMDCQAAAgUDYW10BQNhbXQEA3BSdwkBAnVTBQkApQgBBQNyc3ICB2RlcG9zaXQFBHVzZXIFA2FtdAAAAwkAAAIFA3BSdwUDcFJ3BAFlCQELZW5zdXJlTGltaXQEAgZpbXBvcnQFA3JzcgUEdXNlcgUDYW10AwkAAAIFAWUFAWUFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQ1yZWRlZW1BdG9rZW5zAAQEdXNlcgkApQgBCAUBaQZjYWxsZXIECGFUb2tlbklkCQDYBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAggJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkAhJiYWQgYXNzZXRJZDogV0FWRVMEA3JzcgkBCXJlc2VydmVCeQIFBWFUSWRTBQhhVG9rZW5JZAQCc2gJAQJzUgEJAKUIAQUDcnNyAwkAAAIFAnNoBQJzaAQDYW10CQEFYXNJbnQBCQD8BwQFA3JzcgIQcmVkZWVtQXRva2Vuc0ZvcgkAzAgCBQR1c2VyBQNuaWwIBQFpCHBheW1lbnRzAwkAAAIFA2FtdAUDYW10BANwUncJAQJ1UwUJAKUIAQUDcnNyAgdkZXBvc2l0BQR1c2VyAAAJAQEtAQUDYW10AwkAAAIFA3BSdwUDcFJ3BAFlCQELZW5zdXJlTGltaXQEAgZyZWRlZW0FA3JzcgUEdXNlcgUDYW10AwkAAAIFAWUFAWUFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQh3aXRoZHJhdwIHYXNzZXRJZANhbXQEBHVzZXIJAKUIAQgFAWkGY2FsbGVyBAFyCQEJcmVzZXJ2ZUJ5AgUEYUlkUwUHYXNzZXRJZAQGcmVzdWx0CQEFYXNJbnQBCQEKd2RJbnRlcm5hbAQFBHVzZXIFAXIFA2FtdAILd2l0aGRyYXdGb3IDCQAAAgUGcmVzdWx0BQZyZXN1bHQEA2JwdQkBBWFzSW50AQkBDXZhbGlkYXRlQWZ0ZXICBQR1c2VyAgt3aXRoZHJhd2luZwMJAAACBQNicHUFA2JwdQQCcGMJARJlbnN1cmVOb1Byb2hpYml0ZWQDBQR1c2VyBQNicHUJAKUIAQUBcgMJAAACBQJwYwUCcGMJAJQKAgUDbmlsBQZyZXN1bHQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEJd2l0aGRyYXcyAgNyc3IDYW10BAR1c2VyCQClCAEIBQFpBmNhbGxlcgQCc2gJAQJzUgEFA3JzcgMJAAACBQJzaAUCc2gEB3JzckFkZHIJAQN2bFIBBQNyc3IEBmFjdHVhbAkBBWFzSW50AQkA/AcEBQdyc3JBZGRyAgt3aXRoZHJhd0ZvcgkAzAgCBQR1c2VyCQDMCAIFA2FtdAUDbmlsBQNuaWwDCQAAAgUGYWN0dWFsBQZhY3R1YWwEA3BSdwkBAnVTBQUDcnNyAgdkZXBvc2l0BQR1c2VyCQEBLQEFBmFjdHVhbAkBAS0BBQZhY3R1YWwDCQAAAgUDcFJ3BQNwUncEA2JwdQMJAQhjb250YWlucwIFC2xpcXVpZGF0b3JzBQR1c2VyAAAEAWUJAQtlbnN1cmVMaW1pdAQCCHdpdGhkcmF3BQdyc3JBZGRyBQR1c2VyBQZhY3R1YWwDCQAAAgUBZQUBZQkBBWFzSW50AQkBDXZhbGlkYXRlQWZ0ZXICBQR1c2VyAgx3aXRoZHJhd2luZzIJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4EAnBjCQESZW5zdXJlTm9Qcm9oaWJpdGVkAwUEdXNlcgUDYnB1BQNyc3IDCQAAAgUCcGMFAnBjCQCUCgIFA25pbAUGYWN0dWFsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBEXByb3RlY3RDb2xsYXRlcmFsAQNyc3IEBHVzZXIJAKUIAQgFAWkGY2FsbGVyBAFyCQEDdmxSAQUDcnNyBANhbXQJAQVhc0ludAEJAQp3ZEludGVybmFsBAUEdXNlcgUBcgD///////////8BAg53aXRoZHJhd1RvTWFpbgMJAAACBQNhbXQFA2FtdAQKYXNzZXRJZFN0cgkBEUBleHRyTmF0aXZlKDEwNTMpAgUBcgUEYUlkUwQBcAkA/AcEBRBwcm90ZWN0ZWRSZXNlcnZlAglzdXBwbHlGb3IJAMwIAgUEdXNlcgUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQELcHVyZUFzc2V0SWQBBQphc3NldElkU3RyBQNhbXQFA25pbAMJAAACBQFwBQFwCQCUCgIFA25pbAUDYW10CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBG3dpdGhkcmF3UHJvdGVjdGVkQ29sbGF0ZXJhbAIHYXNzZXRJZANhbXQEBHVzZXIJAKUIAQgFAWkGY2FsbGVyBAFhCQEFYXNJbnQBCQD8BwQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgUQcHJvdGVjdGVkUmVzZXJ2ZQITbm8gcHJvdGVjdGVkUmVzZXJ2ZQILd2l0aGRyYXdGb3IJAMwIAgUEdXNlcgkAzAgCBQdhc3NldElkCQDMCAIFA2FtdAUDbmlsBQNuaWwDCQAAAgUBYQUBYQQCdmEJAQ12YWxpZGF0ZUFmdGVyAgUEdXNlcgIVd2l0aGRyYXdpbmcgcHJvdGVjdGVkAwkAAAIFAnZhBQJ2YQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBE25vcm1hbGl6ZUNvbGxhdGVyYWwBA3JzcgQEYWRkcgkApQgBCAUBaQZjYWxsZXIEAnJBCQEDdmxSAQUDcnNyAwkAAAIFAnJBBQJyQQQCc2gJAQJzUgEFA3JzcgMJAAACBQJzaAUCc2gECmFzc2V0SWRTdHIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQJyQQUEYUlkUwkArAICAhNubyBhc3NldElkIGluIHJzdjogBQNyc3IEAm1jCQEObW92ZUNvbGxhdGVyYWwEBQRhZGRyBQphc3NldElkU3RyBQJyQQUDcnNyAwkAAAIFAm1jBQJtYwUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBBmJvcnJvdwIHYXNzZXRJZANhbXQEBHVzZXIJAKUIAQgFAWkGY2FsbGVyBANyc3IJAQlyZXNlcnZlQnkCBQRhSWRTBQdhc3NldElkBAJzaAkBAnNSAQkApQgBBQNyc3IDCQAAAgUCc2gFAnNoBAFhCQD8BwQFA3JzcgIJYm9ycm93Rm9yCQDMCAIFBHVzZXIJAMwIAgUDYW10BQNuaWwFA25pbAMJAAACBQFhBQFhBANwUncJAQJ1UwUJAKUIAQUDcnNyAgZib3Jyb3cFBHVzZXIFA2FtdAUDYW10AwkAAAIFA3BSdwUDcFJ3BAFlCQELZW5zdXJlTGltaXQEAgZib3Jyb3cFA3JzcgUEdXNlcgUDYW10AwkAAAIFAWUFAWUEA2JwdQkBBWFzSW50AQkBDXZhbGlkYXRlQWZ0ZXICBQR1c2VyAglib3Jyb3dpbmcDCQAAAgUDYnB1BQNicHUEAnBjCQEdZW5zdXJlTm9Qcm9oaWJpdGVkQ29sbGF0ZXJhbHMBBQR1c2VyAwkAAAIFAnBjBQJwYwUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBB2JvcnJvdzICA3JzcgNhbXQEBHVzZXIJAKUIAQgFAWkGY2FsbGVyBAFyCQEDdmxSAQUDcnNyBAJzaAkBAnNSAQUDcnNyAwkAAAIFAnNoBQJzaAQBYQkA/AcEBQFyAglib3Jyb3dGb3IJAMwIAgUEdXNlcgkAzAgCBQNhbXQFA25pbAUDbmlsAwkAAAIFAWEFAWEEA3BSdwkBAnVTBQUDcnNyAgZib3Jyb3cFBHVzZXIFA2FtdAUDYW10AwkAAAIFA3BSdwUDcFJ3BAFlCQELZW5zdXJlTGltaXQEAgZib3Jyb3cFAXIFBHVzZXIFA2FtdAMJAAACBQFlBQFlBANicHUJAQVhc0ludAEJAQ12YWxpZGF0ZUFmdGVyAgUEdXNlcgIJYm9ycm93aW5nAwkAAAIFA2JwdQUDYnB1BAJwYwkBHWVuc3VyZU5vUHJvaGliaXRlZENvbGxhdGVyYWxzAQUEdXNlcgMJAAACBQJwYwUCcGMFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQhjb2xsYXBzZQIDcnNyA2FtdAQEdXNlcgkApQgBCAUBaQZjYWxsZXIEAnNoCQECc1IBBQNyc3IDCQAAAgUCc2gFAnNoBAFjCQEFYXNJbnQBCQD8BwQJAQN2bFIBBQNyc3ICEWNvbGxhcHNlRm9yQW1vdW50CQDMCAIFBHVzZXIJAMwIAgUDYW10BQNuaWwFA25pbAMJAAACBQFjBQFjBANwUncJAQJ1UwUFA3JzcgIGYm9ycm93BQR1c2VyCQEBLQEFAWMJAQEtAQUBYwMJAAACBQNwUncFA3BSdwQEcFJ3MgkBAnVTBQUDcnNyAgdkZXBvc2l0BQR1c2VyCQEBLQEFAWMJAQEtAQUBYwMJAAACBQRwUncyBQRwUncyBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEOY2xhaW1FYlJld2FyZDICA2FtdARsb2NrBAR1c2VyCQClCAEIBQFpBmNhbGxlcgQBYwkBBWFzSW50AQkA/AcEBQNlYlICEGNsYWltRWJSZXdhcmRGb3IJAMwIAgUEdXNlcgkAzAgCBQNhbXQFA25pbAUDbmlsAwkAAAIFAWMFAWMJAQxsb2NrT3JQYXlvdXQDCAUBaQZjYWxsZXIFAWMFBGxvY2sJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEMY2xhaW1SZXdhcmQyAwNyc3IDYW10BGxvY2sEAXYJAQN2bFIBBQNyc3IDCQAAAgUBdgUBdgQEdXNlcgkApQgBCAUBaQZjYWxsZXIEAWMJAQVhc0ludAEJAPwHBAUCVkQCDmNsYWltUmV3YXJkRm9yCQDMCAIFA3JzcgkAzAgCBQR1c2VyCQDMCAIFA2FtdAUDbmlsBQNuaWwDCQAAAgUBYwUBYwkBDGxvY2tPclBheW91dAMIBQFpBmNhbGxlcgUBYwUEbG9jawkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpASFjbGFpbUFsbFJld2FyZHNBbmRBbGxFYkF2YWlsYWJsZTICBGxvY2sNdW5zdGFrZUxlZ2FjeQQEdXNlcgkApQgBCAUBaQZjYWxsZXIEAmNyCQEWY2xhaW1BbGxSZXdhcmRzRm9yVXNlcgEFBHVzZXIDCQAAAgUCY3IFAmNyBARjckxwCQEYY2xhaW1BbGxMcFJld2FyZHNGb3JVc2VyAQUEdXNlcgMJAAACBQRjckxwBQRjckxwBAJsQQMFDXVuc3Rha2VMZWdhY3kJAQVhc0ludAEJAPwHBAUCdlMCE3Vuc3Rha2VBbGxWaXJlc0Zyb20JAMwIAgUEdXNlcgUDbmlsBQNuaWwAAAMJAAACBQJsQQUCbEEJAQxsb2NrT3JQYXlvdXQDCAUBaQZjYWxsZXIJAGQCCQBkAgUCY3IFBGNyTHAFAmxBBQRsb2NrCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBFmRpc2FibGVVc2VBc0NvbGxhdGVyYWwBA3JzcgQEdXNlcgkApQgBCAUBaQZjYWxsZXIEAWQJAPwHBAkBA3ZsUgEFA3JzcgIZZGlzYWJsZVVzZUFzQ29sbGF0ZXJhbEZvcgkAzAgCBQR1c2VyBQNuaWwFA25pbAMJAAACBQFkBQFkBAJ2YQkBDXZhbGlkYXRlQWZ0ZXICBQR1c2VyAhpjaGFuZ2luZyBjb2xsYXRlcmFsIHN0YXR1cwMJAAACBQJ2YQUCdmEFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQlsb2NrVmlyZXMCBmZhY3RvcgdtaWdyYXRlBAR1c2VyCQClCAEIBQFpBmNhbGxlcgQBYQkBBHNwZnIAAwkAAAIFAWEFAWEEDW1pZ3JhdGVBbW91bnQDBQdtaWdyYXRlCQEFYXNJbnQBCQD8BwQFAnZTAhN1bnN0YWtlQWxsVmlyZXNGcm9tCQDMCAIFBHVzZXIFA25pbAUDbmlsAAAEBXRvdGFsCQBkAgUNbWlncmF0ZUFtb3VudAkBDHZpcmVzUGF5bWVudAEFAWkEAWwJAPwHBAUCZEMCB2xvY2tGb3IJAMwIAgUEdXNlcgkAzAgCBQZmYWN0b3IFA25pbAMJAAACBQV0b3RhbAAABQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFDHZpcmVzQXNzZXRJZAUFdG90YWwFA25pbAMJAAACBQFsBQFsBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEYd2l0aGRyYXdBbGxQb3NzaWJsZVZpcmVzAAQEdXNlcgkApQgBCAUBaQZjYWxsZXIEAWEJAQRzcGZyAAMJAAACBQFhBQFhBBFzdGFrZXJWaXJlc0Ftb3VudAkBBWFzSW50AQkA/AcEBQJ2UwITdW5zdGFrZUFsbFZpcmVzRnJvbQkAzAgCBQR1c2VyBQNuaWwFA25pbAMJAAACBRFzdGFrZXJWaXJlc0Ftb3VudAURc3Rha2VyVmlyZXNBbW91bnQEAXUJAPwHBAUCZEMCE3dpdGhkcmF3VW5sb2NrZWRGb3IJAMwIAgUEdXNlcgUDbmlsBQNuaWwDCQAAAgUBdQUBdQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFEXN0YWtlclZpcmVzQW1vdW50BQx2aXJlc0Fzc2V0SWQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARdjbGFpbVByb3RvY29sUHJvZml0RnJvbQIEZnJvbQZyZWxvY2sEBHVzZXIJAKUIAQgFAWkGY2FsbGVyBAFhCQEEc3BmcgADCQAAAgUBYQUBYQQBdQkA/AcEBQJkQwILY2xhaW1Qcm9maXQJAMwIAgUEZnJvbQkAzAgCBQR1c2VyCQDMCAIFBnJlbG9jawUDbmlsBQNuaWwDCQAAAgUBdQUBdQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBFXdpdGhkcmF3VW5sb2NrZWRWaXJlcwAEAWEJAQRzcGZyAAMJAAACBQFhBQFhBAF1CQD8BwQFAmRDAhN3aXRoZHJhd1VubG9ja2VkRm9yCQDMCAIJAKUIAQgFAWkGY2FsbGVyBQNuaWwFA25pbAMJAAACBQF1BQF1BQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEKbG9ja1N1cHBseQIHcmVzZXJ2ZQZwZXJpb2QEA3JzcgkBA3ZsUgEFB3Jlc2VydmUEBHVzZXIJAKUIAQgFAWkGY2FsbGVyBAZjaGVja3MJARFlbnN1cmVOb1Byb3RlY3RlZAEFBHVzZXIDCQAAAgUGY2hlY2tzBQZjaGVja3MECGFUb2tlbklkCQEFdmFsdWUBCQELcHVyZUFzc2V0SWQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUDcnNyAghhVG9rZW5JZAIWbm8gYVRva2VuSWQgaW4gcmVzZXJ2ZQQJbWlncmF0aW9uAwkAAAIJAJADAQgFAWkIcGF5bWVudHMAAAUEdW5pdAMJAAACCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQFCGFUb2tlbklkBQR1bml0AwkAAAIICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAkBC3B1cmVBc3NldElkAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFA3JzcgUEYUlkUwIVbm8gYXNzZXRJZCBpbiByZXNlcnZlBAJzaAkBAnNSAQUHcmVzZXJ2ZQMJAAACBQJzaAUCc2gEBmFjdGlvbgkA/AcEBQNyc3ICCmRlcG9zaXRGb3IJAMwIAgUEdXNlcgkAzAgCBgUDbmlsCAUBaQhwYXltZW50cwMJAAACBQZhY3Rpb24FBmFjdGlvbgQDYW10CAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAQDcFJ3CQECdVMFBQdyZXNlcnZlAgdkZXBvc2l0BQR1c2VyBQNhbXQFA2FtdAMJAAACBQNwUncFA3BSdwUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECEmJhZCBhc3NldCBhdHRhY2hlZAMJAAACBQltaWdyYXRpb24FCW1pZ3JhdGlvbgQEbWludAQCc2gJAQJzUgEFB3Jlc2VydmUDCQAAAgUCc2gFAnNoBAZhY3R1YWwJAQVhc0ludAEJAPwHBAUDcnNyAg9taW50QXRva2VuRm9yVG8JAMwIAgUEdXNlcgkAzAgCAP///////////wEJAMwIAgkApQgBBQR0aGlzBQNuaWwFA25pbAMJAAACBQZhY3R1YWwFBmFjdHVhbAQDcFJ3CQECdVMFCQClCAEFA3JzcgIHZGVwb3NpdAUEdXNlcgkBAS0BBQZhY3R1YWwAAAMJAAACBQNwUncFA3BSdwQCdmEJAQ12YWxpZGF0ZUFmdGVyAgUEdXNlcgIMbG9jay1taW50aW5nAwkAAAIFAnZhBQJ2YQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAwkAAAIFBG1pbnQFBG1pbnQEB2JhbGFuY2UJAPAHAgUEdGhpcwUIYVRva2VuSWQEAXIJAPwHBAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgULbWF5YmVMb2NrZXICFm5vIGxwX2xvY2tlciBpbiBjb25maWcCH2JhZCBscF9sb2NrZXIgYWRkcmVzcyBpbiBjb25maWcCBmxvY2tMUAkAzAgCBQR1c2VyCQDMCAIFBnBlcmlvZAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQhhVG9rZW5JZAUHYmFsYW5jZQUDbmlsAwkAAAIFAXIFAXIJAJQKAgUDbmlsBQdiYWxhbmNlCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBEnJlcGF5V2l0aEF0b2tlbkZvcgEEdXNlcgQGY2hlY2tzAwkBASEBCQEJaXNEZWZpbmVkAQkApggBBQR1c2VyCQACAQIIYmFkIHVzZXIGAwkAAAIFBmNoZWNrcwUGY2hlY2tzCQEXcmVwYXlXaXRoQXRva2VuSW50ZXJuYWwCBQR1c2VyCQCRAwIIBQFpCHBheW1lbnRzAAAJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEPcmVwYXlXaXRoQXRva2VuAAkBF3JlcGF5V2l0aEF0b2tlbkludGVybmFsAgkApQgBCAUBaQZjYWxsZXIJAJEDAggFAWkIcGF5bWVudHMAAAFpAQhyZXBheUZvcgIDcnNyBHVzZXIEBmNoZWNrcwMJAQEhAQkBCWlzRGVmaW5lZAEJAKYIAQUEdXNlcgkAAgECCGJhZCB1c2VyBgMJAAACBQZjaGVja3MFBmNoZWNrcwQCc2gJAQJzUgEFA3JzcgMJAAACBQJzaAUCc2gEBnJlcGFpZAkBBWFzSW50AQkA/AcECQEDdmxSAQUDcnNyAghyZXBheUZvcgkAzAgCBQR1c2VyBQNuaWwIBQFpCHBheW1lbnRzAwkAAAIFBnJlcGFpZAUGcmVwYWlkBANwUncJAQJ1UwUFA3JzcgIGYm9ycm93BQR1c2VyCQEBLQEFBnJlcGFpZAkBAS0BBQZyZXBhaWQDCQAAAgUDcFJ3BQNwUncFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQhoZWFsdGhPZgEHYWRkcmVzcwQNJHQwMjQyODMyNDMzNAkBBmFzSW50MwEJAQl1c2VyUG93ZXIBBQdhZGRyZXNzBAJicAgFDSR0MDI0MjgzMjQzMzQCXzEEA2JwdQgFDSR0MDI0MjgzMjQzMzQCXzIEBmlnbm9yZQgFDSR0MDI0MjgzMjQzMzQCXzMJAJQKAgUDbmlsCQCUCgIFAmJwBQNicHUBAnR4AQZ2ZXJpZnkABBJtYXliZU9yYWNsZUFkZHJlc3MEByRtYXRjaDAJAJ0IAgUNY29uZmlnQWRkcmVzcwIOb3JhY2xlX2FkZHJlc3MDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFzBQckbWF0Y2gwCQCmCAEFAXMFBHVuaXQEBkhFSUdIVAUGaGVpZ2h0BARCQVNFAOgHBAtxdW9ydW1SYXRpbwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFDWNvbmZpZ0FkZHJlc3MCFXByb3Bvc2FsX3F1b3J1bV9yYXRpbwIicHJvcG9zYWxRdW9ydW1SYXRpbyBpcyBub3QgZGVmaW5lZAQLcGFzc2VkUmF0aW8JARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQ1jb25maWdBZGRyZXNzAhVwcm9wb3NhbF9wYXNzZWRfcmF0aW8CJXByb3Bvc2FsVGhyZXNob2xkUmF0aW8gaXMgbm90IGRlZmluZWQEDmdWaXJlc0NvbnRyYWN0CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFDWNvbmZpZ0FkZHJlc3MCEmRpdmlkZW5kc19jb250cmFjdAIVbm8gZGl2aWRlbmRzX2NvbnRyYWN0AhppbnZhbGlkIGRpdmlkZW5kc19jb250cmFjdAQOdm90aW5nQ29udHJhY3QJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUNY29uZmlnQWRkcmVzcwIPdm90aW5nX2NvbnRyYWN0AhJubyB2b3RpbmdfY29udHJhY3QCF2ludmFsaWQgdm90aW5nX2NvbnRyYWN0BAJpZAkA2AQBCAUCdHgCaWQECHZvdGVzWWVzCQELdmFsdWVPckVsc2UCCQCaCAIFDnZvdGluZ0NvbnRyYWN0CQCsAgICDXByb3Bvc2FsX3llc18FAmlkAAAEB3ZvdGVzTm8JAQt2YWx1ZU9yRWxzZQIJAJoIAgUOdm90aW5nQ29udHJhY3QJAKwCAgIMcHJvcG9zYWxfbm9fBQJpZAAABA5wcm9wb3NhbEhlaWdodAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFDnZvdGluZ0NvbnRyYWN0CQCsAgICEHByb3Bvc2FsX2hlaWdodF8FAmlkAhdwcm9wb3NhbCBub3QgcmVnaXN0ZXJlZAQKYXBwbHlTdGFydAkBC3ZhbHVlT3JFbHNlAgkAmggCBQ52b3RpbmdDb250cmFjdAkArAICAhRwcm9wb3NhbF9hcHBseXN0YXJ0XwUCaWQAAAQIYXBwbHlFbmQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUOdm90aW5nQ29udHJhY3QJAKwCAgIScHJvcG9zYWxfYXBwbHllbmRfBQJpZAAABAt0b3RhbEdWaXJlcwkBC3ZhbHVlT3JFbHNlAgkAmggCBQ52b3RpbmdDb250cmFjdAkArAICAhBwcm9wb3NhbF9ndmlyZXNfBQJpZAAABAdlbmFibGVkCQELdmFsdWVPckVsc2UCCQCbCAIFDWNvbmZpZ0FkZHJlc3MCHW9wX2dvdmVybmFuY2VfYXBwbHlfdHhfcGF1c2VkBwQHdm90ZVllcwUIdm90ZXNZZXMEBnZvdGVObwUHdm90ZXNObwQKdG90YWxWb3RlcwkAZAIFB3ZvdGVZZXMFBnZvdGVObwQJaGFzUXVvcnVtCQBnAgkAaQIJAGgCBQp0b3RhbFZvdGVzBQRCQVNFBQt0b3RhbEdWaXJlcwULcXVvcnVtUmF0aW8ECWhhc1Bhc3NlZAkAZwIJAGkCCQBoAgUHdm90ZVllcwUEQkFTRQUKdG90YWxWb3RlcwULcGFzc2VkUmF0aW8ECHRvb0Vhcmx5CQBnAgUKYXBwbHlTdGFydAUGSEVJR0hUBAd0b29MYXRlCQBnAgUGSEVJR0hUBQhhcHBseUVuZAQJdGltZURlYnVnCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICEXByb3Bvc2FsSGVpZ2h0ID0gCQCkAwEFDnByb3Bvc2FsSGVpZ2h0Ag8sIGFwcGx5U3RhcnQgPSAJAKQDAQUKYXBwbHlTdGFydAINLCBhcHBseUVuZCA9IAkApAMBBQhhcHBseUVuZAILLCBIRUlHSFQgPSAJAKQDAQUGSEVJR0hUBAhieVZvdGluZwMJAQEhAQUHZW5hYmxlZAkAAgECK3R4IGFwcGxpY2F0aW9uIHRocm93IGdvdmVybmFuY2Ugbm90IGVuYWJsZWQDBQh0b29FYXJseQkAAgEJAKwCAgIucHJvcG9zYWwgY2FuJ3QgYmUgZXhlY3V0ZWQgYXMgaXQncyB0b28gZWFybHk6IAUJdGltZURlYnVnAwUHdG9vTGF0ZQkAAgEJAKwCAgIscHJvcG9zYWwgY2FuJ3QgYmUgZXhlY3V0ZWQgYXMgaXQncyB0b28gbGF0ZToFCXRpbWVEZWJ1ZwMJAQEhAQUJaGFzUXVvcnVtCQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgILbm8gcXVvcnVtOiACDHRvdGFsVm90ZXM6IAkApAMBBQp0b3RhbFZvdGVzAg8sIHRvdGFsR1ZpcmVzOiAJAKQDAQULdG90YWxHVmlyZXMCDywgcXVvcnVtUmF0aW86IAkApAMBBQtxdW9ydW1SYXRpbwMJAQEhAQUJaGFzUGFzc2VkCQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIXbm8gdGhyZXNob2xkIGFjaGlldmVkOiACCXZvdGVZZXM6IAkApAMBBQd2b3RlWWVzAgosIHZvdGVObzogCQCkAwEFBnZvdGVObwIPLCBwYXNzZWRSYXRpbzogCQCkAwEFC3Bhc3NlZFJhdGlvBgMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAIBQJ0eA9zZW5kZXJQdWJsaWNLZXkGBQhieVZvdGluZ9AOCjw=", "chainId": 87, "height": 3726696, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 9kmV8eUyEd1DqYUNrJFjZq7D7bxbGwB9F4qbxLn3g4bH Next: GvEUf6wG56CYPTHvGeBbynFdJPQqwVqBoNUBbeuQtFmU Diff:
OldNewDifferences
5858
5959 let configAddress = addressFromStringValue(getStringValue(this, configStore))
6060
61-let locker = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, "lp_locker"), "no lp_locker address in config")), "bad lp_locker address in config")
61+let maybeLocker = getString(configAddress, "lp_locker")
6262
6363 let reservesStr = valueOrErrorMessage(getString(configAddress, "primary_reserves"), "no reserves registered")
6464
236236 0
237237 }
238238 func fold (totals,r) = {
239- let $t092179263 = totals
240- let totalD = $t092179263._1
241- let totalB = $t092179263._2
242- let numberOfBorrows = $t092179263._3
239+ let $t090939139 = totals
240+ let totalD = $t090939139._1
241+ let totalB = $t090939139._2
242+ let numberOfBorrows = $t090939139._3
243243 let rsr = valueOrErrorMessage(addressFromString(r), "rsr bad address")
244244 let cf = collateralFactor(rsr)
245245 let lt = liquidationThreshold(rsr)
246- let $t094179501 = userBalance(rsr, user)
247- let token = $t094179501._1
248- let asset = $t094179501._2
249- let depositUsd = $t094179501._3
250- let debt = $t094179501._4
251- let debtUsd = $t094179501._5
252- let asCollateral = $t094179501._6
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
253253 let totalBorrows = (numberOfBorrows + (if ((debt > 0))
254254 then 1
255255 else 0))
263263 else $Tuple3((totalD + fraction((effectiveDepositUsd - debtUsd), cf, factorsBase)), (totalB + overlapCharge), totalBorrows)
264264 }
265265
266- let r = {
267- let $l = reserves
268- let $s = size($l)
269- let $acc0 = $Tuple3(protectedDeposit, 0, 0)
270- func $f0_1 ($a,$i) = if (($i >= $s))
271- then $a
272- else fold($a, $l[$i])
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])
273272
274- func $f0_2 ($a,$i) = if (($i >= $s))
275- then $a
276- else throw("List size exceeds 20")
273+ func $f0_2 ($a,$i) = if (($i >= $s))
274+ then $a
275+ else throw("List size exceeds 20")
277276
278- $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)
279- }
280- if (if ((protectedDeposit > 0))
281- then (r._3 > 4)
282- else false)
283- then throw("can't have more than 4 borrows")
284- else r
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)
285278 }
286279
287280
288281 func getUserHealth (account) = {
289- let $t01025610307 = asInt3(userPower(account))
290- let bp = $t01025610307._1
291- let bpu = $t01025610307._2
292- let ignore = $t01025610307._3
282+ let $t01003110082 = asInt3(userPower(account))
283+ let bp = $t01003110082._1
284+ let bpu = $t01003110082._2
285+ let ignore = $t01003110082._3
293286 ((("bp:" + toString(bp)) + ", bpu:") + toString(bpu))
294287 }
295288
296289
297290 func validateAfter (user,op) = {
298- let $t01041910450 = userPower(user)
299- let bp = $t01041910450._1
300- let bpu = $t01041910450._2
291+ let $t01019410225 = userPower(user)
292+ let bp = $t01019410225._1
293+ let bpu = $t01019410225._2
301294 let accHealth = (((bp - bpu) * factorsBase) / bp)
302295 if (if ((bp == 0))
303296 then (bpu == 0)
412405 }
413406
414407
415-func claimAllLpRewardsForUser (user) = {
416- func fold (acc,rsr) = {
417- let aTokenId = valueOrErrorMessage(getString(addressFromStringValue(rsr), aTIdS), "no aTokenId in reserve")
418- let claimed = asInt(invoke(locker, "claimLpRewardFor", [user, aTokenId, -1], nil))
419- if ((claimed == claimed))
420- then (acc + claimed)
421- else throw("Strict value is not equal to itself.")
422- }
408+func claimAllLpRewardsForUser (user) = match maybeLocker {
409+ case s: String =>
410+ let locker = valueOrErrorMessage(addressFromString(s), "bad lp_locker address in config")
411+ func fold (acc,rsr) = {
412+ let aTokenId = valueOrErrorMessage(getString(addressFromStringValue(rsr), aTIdS), "no aTokenId in reserve")
413+ let claimed = asInt(invoke(locker, "claimLpRewardFor", [user, aTokenId, -1], nil))
414+ if ((claimed == claimed))
415+ then (acc + claimed)
416+ else throw("Strict value is not equal to itself.")
417+ }
423418
424- let claimedTotal = {
425- let $l = rewardReserves
426- let $s = size($l)
427- let $acc0 = 0
428- func $f0_1 ($a,$i) = if (($i >= $s))
429- then $a
430- else fold($a, $l[$i])
419+ let claimedTotal = {
420+ let $l = rewardReserves
421+ let $s = size($l)
422+ let $acc0 = 0
423+ func $f0_1 ($a,$i) = if (($i >= $s))
424+ then $a
425+ else fold($a, $l[$i])
431426
432- func $f0_2 ($a,$i) = if (($i >= $s))
433- then $a
434- else throw("List size exceeds 20")
427+ func $f0_2 ($a,$i) = if (($i >= $s))
428+ then $a
429+ else throw("List size exceeds 20")
435430
436- $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)
437- }
438- claimedTotal
439- }
431+ $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)
432+ }
433+ claimedTotal
434+ case _ =>
435+ 0
436+}
440437
441438
442439 func moveCollateral (addr,assetStr,rsr,reserveStr) = {
711708 let assetIdStr = getStringValue(r, aIdS)
712709 let p = invoke(protectedReserve, "supplyFor", [user], [AttachedPayment(pureAssetId(assetIdStr), amt)])
713710 if ((p == p))
714- then {
715- let pc = ensureNoProhibited(user, userPower(user)._2, rsr)
716- if ((pc == pc))
717- then $Tuple2(nil, amt)
718- else throw("Strict value is not equal to itself.")
719- }
711+ then $Tuple2(nil, amt)
720712 else throw("Strict value is not equal to itself.")
721713 }
722714 else throw("Strict value is not equal to itself.")
10591051 if ((mint == mint))
10601052 then {
10611053 let balance = assetBalance(this, aTokenId)
1062- let r = invoke(locker, "lockLP", [user, period], [AttachedPayment(aTokenId, balance)])
1054+ let r = invoke(valueOrErrorMessage(addressFromString(valueOrErrorMessage(maybeLocker, "no lp_locker in config")), "bad lp_locker address in config"), "lockLP", [user, period], [AttachedPayment(aTokenId, balance)])
10631055 if ((r == r))
10641056 then $Tuple2(nil, balance)
10651057 else throw("Strict value is not equal to itself.")
11191111
11201112 @Callable(i)
11211113 func healthOf (address) = {
1122- let $t02411624167 = asInt3(userPower(address))
1123- let bp = $t02411624167._1
1124- let bpu = $t02411624167._2
1125- let ignore = $t02411624167._3
1114+ let $t02428324334 = asInt3(userPower(address))
1115+ let bp = $t02428324334._1
1116+ let bpu = $t02428324334._2
1117+ let ignore = $t02428324334._3
11261118 $Tuple2(nil, $Tuple2(bp, bpu))
11271119 }
11281120
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
61-let locker = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, "lp_locker"), "no lp_locker address in config")), "bad lp_locker address in config")
61+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, "|")
6666
6767 let ebR = addressFromStringValue(valueOrErrorMessage(getString(configAddress, "eb_rewards"), "no eb_rewards"))
6868
6969 let viresMinter = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, "vires_minter"), "main: no viresMinter")), "bad minter")
7070
7171 let maybevS = getString(configAddress, "vires_staker")
7272
7373 let vS = addressFromStringValue(valueOrErrorMessage(maybevS, "no vires_staker"))
7474
7575 let dC = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, "dividends_contract"), "no dividends_contract")), "bad div")
7676
7777 let mVD = match getString(configAddress, "vires_distributor") {
7878 case d: String =>
7979 addressFromStringValue(d)
8080 case _ =>
8181 unit
8282 }
8383
8484 let VD = valueOrErrorMessage(mVD, "no distr")
8585
8686 let limiter = match getString(configAddress, "limiter") {
8787 case d: String =>
8888 addressFromStringValue(d)
8989 case _ =>
9090 unit
9191 }
9292
9393 let maybeViresAssetId = getString(viresMinter, aIdS)
9494
9595 let viresAssetId = valueOrErrorMessage(fromBase58String(valueOrErrorMessage(maybeViresAssetId, "no vires id")), "invalid vires id")
9696
9797 func viresPayment (i) = if ((size(i.payments) == 0))
9898 then 0
9999 else if ((i.payments[0].assetId != viresAssetId))
100100 then throw("not vires")
101101 else i.payments[0].amount
102102
103103
104104 func assetIdOfReserve (rsr) = valueOrErrorMessage(getString(rsr, aIdS), "no assetId in rsr")
105105
106106
107107 func collateralFactor (rsr) = valueOrErrorMessage(getInteger(configAddress, (assetIdOfReserve(rsr) + "_CollateralFactor")), "no 1")
108108
109109
110110 func liquidationThreshold (rsr) = valueOrErrorMessage(getInteger(configAddress, (assetIdOfReserve(rsr) + "_LiquidationThreshold")), "no 2")
111111
112112
113113 let accountHealthThreshold = valueOrErrorMessage(getInteger(configAddress, "account_health_threshold"), "no 4")
114114
115115 let accountHealthOverlap = valueOrErrorMessage(getInteger(configAddress, "account_health_overlap"), "no 5")
116116
117117 let liquidators = valueOrElse(getString(configAddress, "liquidators"), "")
118118
119119 func reserveBy (store,value) = {
120120 func fold (a,r) = match a {
121121 case found: Address =>
122122 found
123123 case _ =>
124124 let rsr = valueOrErrorMessage(addressFromString(r), "rsr bad address")
125125 if ((valueOrErrorMessage(getString(rsr, store), ("rsr has no " + store)) == value))
126126 then rsr
127127 else unit
128128 }
129129
130130 match let $l = reserves
131131 let $s = size($l)
132132 let $acc0 = unit
133133 func $f0_1 ($a,$i) = if (($i >= $s))
134134 then $a
135135 else fold($a, $l[$i])
136136
137137 func $f0_2 ($a,$i) = if (($i >= $s))
138138 then $a
139139 else throw("List size exceeds 20")
140140
141141 $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) {
142142 case found: Address =>
143143 found
144144 case _ =>
145145 throw(("unknown " + store))
146146 }
147147 }
148148
149149
150150 func vlR (r) = if (contains(reservesStr, r))
151151 then valueOrErrorMessage(addressFromString(r), "main: bad rsr")
152152 else throw(("unknown rsr:" + r))
153153
154154
155155 func userBalance (rsr,user) = asUserBalanceData(invoke(rsr, "userBalance", [user], nil))
156156
157157
158158 let maybeProtected = match getString(configAddress, "protected_reserve") {
159159 case pds: String =>
160160 valueOrErrorMessage(addressFromString(pds), "bad protected")
161161 case _ =>
162162 unit
163163 }
164164
165165 let protectedReserve = valueOrErrorMessage(maybeProtected, "no protected rsr")
166166
167167 let prohibitedCollateralReserves = match getString(configAddress, "prohibitedCollateralReserves") {
168168 case s: String =>
169169 split(s, "|")
170170 case _ =>
171171 nil
172172 }
173173
174174 func ensureNoProhibitedCollaterals (user) = {
175175 func foldFunc (a,prohibitedReserve) = {
176176 let atb = valueOrElse(getInteger(addressFromStringValue(prohibitedReserve), (user + "_aTokenBalance")), 0)
177177 if ((atb > 1))
178178 then throw((((("operation denied: user has deposit in " + prohibitedReserve) + ": ") + toString(atb)) + "(lp tokens)"))
179179 else true
180180 }
181181
182182 let ensureNoProtectedUSDNorEURN = {
183183 let any = (valueOrElse(getInteger(protectedReserve, ("userShares_DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p_" + user)), 0) + valueOrElse(getInteger(protectedReserve, ("userShares_DUk2YTxhRoAqMJLus4G2b3fR8hMHVh6eiyFx5r29VR6t_" + user)), 0))
184184 if ((any > 0))
185185 then throw("has non-borrowable Neutrino assets as collateral")
186186 else true
187187 }
188188 let $l = prohibitedCollateralReserves
189189 let $s = size($l)
190190 let $acc0 = ensureNoProtectedUSDNorEURN
191191 func $f0_1 ($a,$i) = if (($i >= $s))
192192 then $a
193193 else foldFunc($a, $l[$i])
194194
195195 func $f0_2 ($a,$i) = if (($i >= $s))
196196 then $a
197197 else throw("List size exceeds 15")
198198
199199 $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)
200200 }
201201
202202
203203 func ensureNoProhibited (user,bpu,reserve) = if (if ((bpu == 0))
204204 then true
205205 else isDefined(indexOf(prohibitedCollateralReserves, reserve)))
206206 then true
207207 else ensureNoProhibitedCollaterals(user)
208208
209209
210210 func ensureNoProtected (user) = {
211211 let has = match maybeProtected {
212212 case pa: Address =>
213213 valueOrElse(getBoolean(pa, ("protected_collateral_" + user)), false)
214214 case _ =>
215215 false
216216 }
217217 if (has)
218218 then throw("disallowed")
219219 else unit
220220 }
221221
222222
223223 func ensureLimit (action,rsr,user,amount) = match limiter {
224224 case l: Address =>
225225 asInt(invoke(l, "validateLimit", [action, toString(rsr), user, amount], nil))
226226 case _ =>
227227 true
228228 }
229229
230230
231231 func userPower (user) = {
232232 let protectedDeposit = match maybeProtected {
233233 case pa: Address =>
234234 asInt(invoke(pa, "borrowPower", [user], nil))
235235 case _ =>
236236 0
237237 }
238238 func fold (totals,r) = {
239- let $t092179263 = totals
240- let totalD = $t092179263._1
241- let totalB = $t092179263._2
242- let numberOfBorrows = $t092179263._3
239+ let $t090939139 = totals
240+ let totalD = $t090939139._1
241+ let totalB = $t090939139._2
242+ let numberOfBorrows = $t090939139._3
243243 let rsr = valueOrErrorMessage(addressFromString(r), "rsr bad address")
244244 let cf = collateralFactor(rsr)
245245 let lt = liquidationThreshold(rsr)
246- let $t094179501 = userBalance(rsr, user)
247- let token = $t094179501._1
248- let asset = $t094179501._2
249- let depositUsd = $t094179501._3
250- let debt = $t094179501._4
251- let debtUsd = $t094179501._5
252- let asCollateral = $t094179501._6
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
253253 let totalBorrows = (numberOfBorrows + (if ((debt > 0))
254254 then 1
255255 else 0))
256256 let effectiveDepositUsd = if (asCollateral)
257257 then depositUsd
258258 else 0
259259 let overlapUsd = min([debtUsd, effectiveDepositUsd])
260260 let overlapCharge = fCi(overlapUsd, accountHealthOverlap, factorsBase)
261261 if ((debtUsd > effectiveDepositUsd))
262262 then $Tuple3(totalD, ((totalB + fraction((debtUsd - effectiveDepositUsd), factorsBase, lt)) + overlapCharge), totalBorrows)
263263 else $Tuple3((totalD + fraction((effectiveDepositUsd - debtUsd), cf, factorsBase)), (totalB + overlapCharge), totalBorrows)
264264 }
265265
266- let r = {
267- let $l = reserves
268- let $s = size($l)
269- let $acc0 = $Tuple3(protectedDeposit, 0, 0)
270- func $f0_1 ($a,$i) = if (($i >= $s))
271- then $a
272- else fold($a, $l[$i])
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])
273272
274- func $f0_2 ($a,$i) = if (($i >= $s))
275- then $a
276- else throw("List size exceeds 20")
273+ func $f0_2 ($a,$i) = if (($i >= $s))
274+ then $a
275+ else throw("List size exceeds 20")
277276
278- $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)
279- }
280- if (if ((protectedDeposit > 0))
281- then (r._3 > 4)
282- else false)
283- then throw("can't have more than 4 borrows")
284- else r
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)
285278 }
286279
287280
288281 func getUserHealth (account) = {
289- let $t01025610307 = asInt3(userPower(account))
290- let bp = $t01025610307._1
291- let bpu = $t01025610307._2
292- let ignore = $t01025610307._3
282+ let $t01003110082 = asInt3(userPower(account))
283+ let bp = $t01003110082._1
284+ let bpu = $t01003110082._2
285+ let ignore = $t01003110082._3
293286 ((("bp:" + toString(bp)) + ", bpu:") + toString(bpu))
294287 }
295288
296289
297290 func validateAfter (user,op) = {
298- let $t01041910450 = userPower(user)
299- let bp = $t01041910450._1
300- let bpu = $t01041910450._2
291+ let $t01019410225 = userPower(user)
292+ let bp = $t01019410225._1
293+ let bpu = $t01019410225._2
301294 let accHealth = (((bp - bpu) * factorsBase) / bp)
302295 if (if ((bp == 0))
303296 then (bpu == 0)
304297 else false)
305298 then 0
306299 else if (if ((bp == 0))
307300 then (bpu > 0)
308301 else false)
309302 then throw(((op + ": breaching liquidation threshold(bp=0, bpu=") + toString(bpu)))
310303 else if ((accountHealthThreshold > accHealth))
311304 then throw((((((((op + ": breaching liquidation threshold(bp=") + toString(bp)) + ", bpu=") + toString(bpu)) + ", health=") + toString(accHealth)) + ")"))
312305 else bpu
313306 }
314307
315308
316309 func uS (rsr,action,user,userChange,streamChange) = match mVD {
317310 case a: Address =>
318311 invoke(a, "onAction", [rsr, action, user, userChange, streamChange], nil)
319312 case _ =>
320313 unit
321314 }
322315
323316
324317 func moveStream (rsr,action,from,string,amt) = match mVD {
325318 case a: Address =>
326319 invoke(a, "move", [rsr, action, from, string, amt], nil)
327320 case _ =>
328321 unit
329322 }
330323
331324
332325 func sR (rsr) = match mVD {
333326 case a: Address =>
334327 invoke(a, "syncHeight", [rsr], nil)
335328 case _ =>
336329 unit
337330 }
338331
339332
340333 func lockOrPayout (recipient,amt,lock) = if (!(lock))
341334 then [ScriptTransfer(recipient, amt, viresAssetId)]
342335 else {
343336 let doLock = invoke(dC, "lockFor", [toString(recipient), 1], [AttachedPayment(viresAssetId, amt)])
344337 if ((doLock == doLock))
345338 then nil
346339 else throw("Strict value is not equal to itself.")
347340 }
348341
349342
350343 func doDeposit (i,rsr,asCol) = {
351344 let user = toString(i.caller)
352345 let checks = ensureNoProtected(user)
353346 if ((checks == checks))
354347 then {
355348 let sh = sR(rsr)
356349 if ((sh == sh))
357350 then {
358351 let action = invoke(vlR(rsr), "depositFor", [user, asCol], i.payments)
359352 if ((action == action))
360353 then {
361354 let amt = i.payments[0].amount
362355 let pRw = uS(rsr, "deposit", user, amt, amt)
363356 if ((pRw == pRw))
364357 then {
365358 let va = if (!(asCol))
366359 then validateAfter(user, "depositing")
367360 else 0
368361 if ((va == va))
369362 then nil
370363 else throw("Strict value is not equal to itself.")
371364 }
372365 else throw("Strict value is not equal to itself.")
373366 }
374367 else throw("Strict value is not equal to itself.")
375368 }
376369 else throw("Strict value is not equal to itself.")
377370 }
378371 else throw("Strict value is not equal to itself.")
379372 }
380373
381374
382375 let rewardReserves = split_4C(valueOrErrorMessage(getString(configAddress, "rewardable_reserves"), "no string"), "|")
383376
384377 func claimAllRewardsForUser (user) = {
385378 let claimedEb = asInt(invoke(ebR, "claimEbRewardFor", [user, -1], nil))
386379 if ((claimedEb == claimedEb))
387380 then {
388381 func fold (acc,rsr) = {
389382 let claimed = asInt(invoke(VD, "claimRewardFor", [rsr, user, -1], nil))
390383 if ((claimed == claimed))
391384 then (acc + claimed)
392385 else throw("Strict value is not equal to itself.")
393386 }
394387
395388 let claimedTotal = {
396389 let $l = rewardReserves
397390 let $s = size($l)
398391 let $acc0 = 0
399392 func $f0_1 ($a,$i) = if (($i >= $s))
400393 then $a
401394 else fold($a, $l[$i])
402395
403396 func $f0_2 ($a,$i) = if (($i >= $s))
404397 then $a
405398 else throw("List size exceeds 20")
406399
407400 $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)
408401 }
409402 (claimedTotal + claimedEb)
410403 }
411404 else throw("Strict value is not equal to itself.")
412405 }
413406
414407
415-func claimAllLpRewardsForUser (user) = {
416- func fold (acc,rsr) = {
417- let aTokenId = valueOrErrorMessage(getString(addressFromStringValue(rsr), aTIdS), "no aTokenId in reserve")
418- let claimed = asInt(invoke(locker, "claimLpRewardFor", [user, aTokenId, -1], nil))
419- if ((claimed == claimed))
420- then (acc + claimed)
421- else throw("Strict value is not equal to itself.")
422- }
408+func claimAllLpRewardsForUser (user) = match maybeLocker {
409+ case s: String =>
410+ let locker = valueOrErrorMessage(addressFromString(s), "bad lp_locker address in config")
411+ func fold (acc,rsr) = {
412+ let aTokenId = valueOrErrorMessage(getString(addressFromStringValue(rsr), aTIdS), "no aTokenId in reserve")
413+ let claimed = asInt(invoke(locker, "claimLpRewardFor", [user, aTokenId, -1], nil))
414+ if ((claimed == claimed))
415+ then (acc + claimed)
416+ else throw("Strict value is not equal to itself.")
417+ }
423418
424- let claimedTotal = {
425- let $l = rewardReserves
426- let $s = size($l)
427- let $acc0 = 0
428- func $f0_1 ($a,$i) = if (($i >= $s))
429- then $a
430- else fold($a, $l[$i])
419+ let claimedTotal = {
420+ let $l = rewardReserves
421+ let $s = size($l)
422+ let $acc0 = 0
423+ func $f0_1 ($a,$i) = if (($i >= $s))
424+ then $a
425+ else fold($a, $l[$i])
431426
432- func $f0_2 ($a,$i) = if (($i >= $s))
433- then $a
434- else throw("List size exceeds 20")
427+ func $f0_2 ($a,$i) = if (($i >= $s))
428+ then $a
429+ else throw("List size exceeds 20")
435430
436- $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)
437- }
438- claimedTotal
439- }
431+ $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)
432+ }
433+ claimedTotal
434+ case _ =>
435+ 0
436+}
440437
441438
442439 func moveCollateral (addr,assetStr,rsr,reserveStr) = {
443440 let amt = asInt(invoke(protectedReserve, "withdrawToMain", [addr, assetStr], nil))
444441 if ((amt == amt))
445442 then {
446443 let dep = invoke(rsr, "depositFor", [addr, true], [AttachedPayment(pureAssetId(assetStr), amt)])
447444 if ((dep == dep))
448445 then {
449446 let prop = uS(reserveStr, "deposit", addr, amt, amt)
450447 if ((prop == prop))
451448 then unit
452449 else throw("Strict value is not equal to itself.")
453450 }
454451 else throw("Strict value is not equal to itself.")
455452 }
456453 else throw("Strict value is not equal to itself.")
457454 }
458455
459456
460457 func spfr () = invoke(dC, "shareProfitFromReserves", nil, nil)
461458
462459
463460 func wdInternal (user,rsr,amt,op) = {
464461 let sh = sR(toString(rsr))
465462 if ((sh == sh))
466463 then {
467464 let withdrawnAmount = asInt(invoke(rsr, op, [user, amt], nil))
468465 if ((withdrawnAmount == withdrawnAmount))
469466 then {
470467 let pRw = uS(toString(rsr), "deposit", user, -(withdrawnAmount), -(withdrawnAmount))
471468 if ((pRw == pRw))
472469 then {
473470 let e = ensureLimit("withdraw", rsr, user, withdrawnAmount)
474471 if ((e == e))
475472 then withdrawnAmount
476473 else throw("Strict value is not equal to itself.")
477474 }
478475 else throw("Strict value is not equal to itself.")
479476 }
480477 else throw("Strict value is not equal to itself.")
481478 }
482479 else throw("Strict value is not equal to itself.")
483480 }
484481
485482
486483 func repayWithAtokenInternal (user,payment) = {
487484 let aTokenId = toBase58String(valueOrErrorMessage(payment.assetId, "bad assetId: waves not allowed"))
488485 let t = reserveBy(aTIdS, aTokenId)
489486 let sh = sR(toString(t))
490487 if ((sh == sh))
491488 then {
492489 let amt = asInt(invoke(t, "replenishForRepayWithAtokenFor", [user], [payment]))
493490 if ((amt == amt))
494491 then {
495492 let c = asInt(invoke(t, "collapseForAmount", [user, amt], nil))
496493 if ((c == c))
497494 then if ((amt > c))
498495 then throw("repaying too much")
499496 else {
500497 let pRw = uS(toString(t), "borrow", user, -(c), -(c))
501498 if ((pRw == pRw))
502499 then {
503500 let pRw2 = uS(toString(t), "deposit", user, (amt - c), -(c))
504501 if ((pRw2 == pRw2))
505502 then nil
506503 else throw("Strict value is not equal to itself.")
507504 }
508505 else throw("Strict value is not equal to itself.")
509506 }
510507 else throw("Strict value is not equal to itself.")
511508 }
512509 else throw("Strict value is not equal to itself.")
513510 }
514511 else throw("Strict value is not equal to itself.")
515512 }
516513
517514
518515 @Callable(i)
519516 func initialize (ca) = [writeConstString(configStore, ca)]
520517
521518
522519
523520 @Callable(i)
524521 func deposit (rsr,asCol) = doDeposit(i, rsr, asCol)
525522
526523
527524
528525 @Callable(i)
529526 func depositRef (rsr,asCol,ref) = doDeposit(i, rsr, asCol)
530527
531528
532529
533530 @Callable(i)
534531 func repay (rsr) = {
535532 let user = toString(i.caller)
536533 let sh = sR(rsr)
537534 if ((sh == sh))
538535 then {
539536 let repaid = asInt(invoke(vlR(rsr), "repayFor", [user], i.payments))
540537 if ((repaid == repaid))
541538 then {
542539 let pRw = uS(rsr, "borrow", user, -(repaid), -(repaid))
543540 if ((pRw == pRw))
544541 then nil
545542 else throw("Strict value is not equal to itself.")
546543 }
547544 else throw("Strict value is not equal to itself.")
548545 }
549546 else throw("Strict value is not equal to itself.")
550547 }
551548
552549
553550
554551 @Callable(i)
555552 func mintAtoken (aTokenId,amt) = {
556553 let user = toString(i.caller)
557554 let t = reserveBy(aTIdS, aTokenId)
558555 let sh = sR(toString(t))
559556 if ((sh == sh))
560557 then {
561558 let actual = asInt(invoke(t, "mintAtokenFor", [user, amt], nil))
562559 if ((actual == actual))
563560 then {
564561 let pRw = uS(toString(t), "deposit", user, -(actual), 0)
565562 if ((pRw == pRw))
566563 then {
567564 let bpu = asInt(validateAfter(user, "minting"))
568565 if ((bpu == bpu))
569566 then {
570567 let pc = ensureNoProhibited(user, bpu, toString(t))
571568 if ((pc == pc))
572569 then nil
573570 else throw("Strict value is not equal to itself.")
574571 }
575572 else throw("Strict value is not equal to itself.")
576573 }
577574 else throw("Strict value is not equal to itself.")
578575 }
579576 else throw("Strict value is not equal to itself.")
580577 }
581578 else throw("Strict value is not equal to itself.")
582579 }
583580
584581
585582
586583 @Callable(i)
587584 func replenishWithAtoken () = {
588585 let user = toString(i.caller)
589586 let checks = ensureNoProtected(user)
590587 if ((checks == checks))
591588 then {
592589 let aTokenId = toBase58String(valueOrErrorMessage(i.payments[0].assetId, "bad assetId(w)"))
593590 let rsr = reserveBy(aTIdS, aTokenId)
594591 let sh = sR(toString(rsr))
595592 if ((sh == sh))
596593 then {
597594 let amt = asInt(invoke(rsr, "replenishWithAtokenFor", [user], i.payments))
598595 if ((amt == amt))
599596 then {
600597 let pRw = uS(toString(rsr), "deposit", user, amt, 0)
601598 if ((pRw == pRw))
602599 then {
603600 let e = ensureLimit("import", rsr, user, amt)
604601 if ((e == e))
605602 then nil
606603 else throw("Strict value is not equal to itself.")
607604 }
608605 else throw("Strict value is not equal to itself.")
609606 }
610607 else throw("Strict value is not equal to itself.")
611608 }
612609 else throw("Strict value is not equal to itself.")
613610 }
614611 else throw("Strict value is not equal to itself.")
615612 }
616613
617614
618615
619616 @Callable(i)
620617 func redeemAtokens () = {
621618 let user = toString(i.caller)
622619 let aTokenId = toBase58String(valueOrErrorMessage(i.payments[0].assetId, "bad assetId: WAVES"))
623620 let rsr = reserveBy(aTIdS, aTokenId)
624621 let sh = sR(toString(rsr))
625622 if ((sh == sh))
626623 then {
627624 let amt = asInt(invoke(rsr, "redeemAtokensFor", [user], i.payments))
628625 if ((amt == amt))
629626 then {
630627 let pRw = uS(toString(rsr), "deposit", user, 0, -(amt))
631628 if ((pRw == pRw))
632629 then {
633630 let e = ensureLimit("redeem", rsr, user, amt)
634631 if ((e == e))
635632 then nil
636633 else throw("Strict value is not equal to itself.")
637634 }
638635 else throw("Strict value is not equal to itself.")
639636 }
640637 else throw("Strict value is not equal to itself.")
641638 }
642639 else throw("Strict value is not equal to itself.")
643640 }
644641
645642
646643
647644 @Callable(i)
648645 func withdraw (assetId,amt) = {
649646 let user = toString(i.caller)
650647 let r = reserveBy(aIdS, assetId)
651648 let result = asInt(wdInternal(user, r, amt, "withdrawFor"))
652649 if ((result == result))
653650 then {
654651 let bpu = asInt(validateAfter(user, "withdrawing"))
655652 if ((bpu == bpu))
656653 then {
657654 let pc = ensureNoProhibited(user, bpu, toString(r))
658655 if ((pc == pc))
659656 then $Tuple2(nil, result)
660657 else throw("Strict value is not equal to itself.")
661658 }
662659 else throw("Strict value is not equal to itself.")
663660 }
664661 else throw("Strict value is not equal to itself.")
665662 }
666663
667664
668665
669666 @Callable(i)
670667 func withdraw2 (rsr,amt) = {
671668 let user = toString(i.caller)
672669 let sh = sR(rsr)
673670 if ((sh == sh))
674671 then {
675672 let rsrAddr = vlR(rsr)
676673 let actual = asInt(invoke(rsrAddr, "withdrawFor", [user, amt], nil))
677674 if ((actual == actual))
678675 then {
679676 let pRw = uS(rsr, "deposit", user, -(actual), -(actual))
680677 if ((pRw == pRw))
681678 then {
682679 let bpu = if (contains(liquidators, user))
683680 then 0
684681 else {
685682 let e = ensureLimit("withdraw", rsrAddr, user, actual)
686683 if ((e == e))
687684 then asInt(validateAfter(user, "withdrawing2"))
688685 else throw("Strict value is not equal to itself.")
689686 }
690687 let pc = ensureNoProhibited(user, bpu, rsr)
691688 if ((pc == pc))
692689 then $Tuple2(nil, actual)
693690 else throw("Strict value is not equal to itself.")
694691 }
695692 else throw("Strict value is not equal to itself.")
696693 }
697694 else throw("Strict value is not equal to itself.")
698695 }
699696 else throw("Strict value is not equal to itself.")
700697 }
701698
702699
703700
704701 @Callable(i)
705702 func protectCollateral (rsr) = {
706703 let user = toString(i.caller)
707704 let r = vlR(rsr)
708705 let amt = asInt(wdInternal(user, r, -1, "withdrawToMain"))
709706 if ((amt == amt))
710707 then {
711708 let assetIdStr = getStringValue(r, aIdS)
712709 let p = invoke(protectedReserve, "supplyFor", [user], [AttachedPayment(pureAssetId(assetIdStr), amt)])
713710 if ((p == p))
714- then {
715- let pc = ensureNoProhibited(user, userPower(user)._2, rsr)
716- if ((pc == pc))
717- then $Tuple2(nil, amt)
718- else throw("Strict value is not equal to itself.")
719- }
711+ then $Tuple2(nil, amt)
720712 else throw("Strict value is not equal to itself.")
721713 }
722714 else throw("Strict value is not equal to itself.")
723715 }
724716
725717
726718
727719 @Callable(i)
728720 func withdrawProtectedCollateral (assetId,amt) = {
729721 let user = toString(i.caller)
730722 let a = asInt(invoke(valueOrErrorMessage(protectedReserve, "no protectedReserve"), "withdrawFor", [user, assetId, amt], nil))
731723 if ((a == a))
732724 then {
733725 let va = validateAfter(user, "withdrawing protected")
734726 if ((va == va))
735727 then nil
736728 else throw("Strict value is not equal to itself.")
737729 }
738730 else throw("Strict value is not equal to itself.")
739731 }
740732
741733
742734
743735 @Callable(i)
744736 func normalizeCollateral (rsr) = {
745737 let addr = toString(i.caller)
746738 let rA = vlR(rsr)
747739 if ((rA == rA))
748740 then {
749741 let sh = sR(rsr)
750742 if ((sh == sh))
751743 then {
752744 let assetIdStr = valueOrErrorMessage(getString(rA, aIdS), ("no assetId in rsv: " + rsr))
753745 let mc = moveCollateral(addr, assetIdStr, rA, rsr)
754746 if ((mc == mc))
755747 then nil
756748 else throw("Strict value is not equal to itself.")
757749 }
758750 else throw("Strict value is not equal to itself.")
759751 }
760752 else throw("Strict value is not equal to itself.")
761753 }
762754
763755
764756
765757 @Callable(i)
766758 func borrow (assetId,amt) = {
767759 let user = toString(i.caller)
768760 let rsr = reserveBy(aIdS, assetId)
769761 let sh = sR(toString(rsr))
770762 if ((sh == sh))
771763 then {
772764 let a = invoke(rsr, "borrowFor", [user, amt], nil)
773765 if ((a == a))
774766 then {
775767 let pRw = uS(toString(rsr), "borrow", user, amt, amt)
776768 if ((pRw == pRw))
777769 then {
778770 let e = ensureLimit("borrow", rsr, user, amt)
779771 if ((e == e))
780772 then {
781773 let bpu = asInt(validateAfter(user, "borrowing"))
782774 if ((bpu == bpu))
783775 then {
784776 let pc = ensureNoProhibitedCollaterals(user)
785777 if ((pc == pc))
786778 then nil
787779 else throw("Strict value is not equal to itself.")
788780 }
789781 else throw("Strict value is not equal to itself.")
790782 }
791783 else throw("Strict value is not equal to itself.")
792784 }
793785 else throw("Strict value is not equal to itself.")
794786 }
795787 else throw("Strict value is not equal to itself.")
796788 }
797789 else throw("Strict value is not equal to itself.")
798790 }
799791
800792
801793
802794 @Callable(i)
803795 func borrow2 (rsr,amt) = {
804796 let user = toString(i.caller)
805797 let r = vlR(rsr)
806798 let sh = sR(rsr)
807799 if ((sh == sh))
808800 then {
809801 let a = invoke(r, "borrowFor", [user, amt], nil)
810802 if ((a == a))
811803 then {
812804 let pRw = uS(rsr, "borrow", user, amt, amt)
813805 if ((pRw == pRw))
814806 then {
815807 let e = ensureLimit("borrow", r, user, amt)
816808 if ((e == e))
817809 then {
818810 let bpu = asInt(validateAfter(user, "borrowing"))
819811 if ((bpu == bpu))
820812 then {
821813 let pc = ensureNoProhibitedCollaterals(user)
822814 if ((pc == pc))
823815 then nil
824816 else throw("Strict value is not equal to itself.")
825817 }
826818 else throw("Strict value is not equal to itself.")
827819 }
828820 else throw("Strict value is not equal to itself.")
829821 }
830822 else throw("Strict value is not equal to itself.")
831823 }
832824 else throw("Strict value is not equal to itself.")
833825 }
834826 else throw("Strict value is not equal to itself.")
835827 }
836828
837829
838830
839831 @Callable(i)
840832 func collapse (rsr,amt) = {
841833 let user = toString(i.caller)
842834 let sh = sR(rsr)
843835 if ((sh == sh))
844836 then {
845837 let c = asInt(invoke(vlR(rsr), "collapseForAmount", [user, amt], nil))
846838 if ((c == c))
847839 then {
848840 let pRw = uS(rsr, "borrow", user, -(c), -(c))
849841 if ((pRw == pRw))
850842 then {
851843 let pRw2 = uS(rsr, "deposit", user, -(c), -(c))
852844 if ((pRw2 == pRw2))
853845 then nil
854846 else throw("Strict value is not equal to itself.")
855847 }
856848 else throw("Strict value is not equal to itself.")
857849 }
858850 else throw("Strict value is not equal to itself.")
859851 }
860852 else throw("Strict value is not equal to itself.")
861853 }
862854
863855
864856
865857 @Callable(i)
866858 func claimEbReward2 (amt,lock) = {
867859 let user = toString(i.caller)
868860 let c = asInt(invoke(ebR, "claimEbRewardFor", [user, amt], nil))
869861 if ((c == c))
870862 then lockOrPayout(i.caller, c, lock)
871863 else throw("Strict value is not equal to itself.")
872864 }
873865
874866
875867
876868 @Callable(i)
877869 func claimReward2 (rsr,amt,lock) = {
878870 let v = vlR(rsr)
879871 if ((v == v))
880872 then {
881873 let user = toString(i.caller)
882874 let c = asInt(invoke(VD, "claimRewardFor", [rsr, user, amt], nil))
883875 if ((c == c))
884876 then lockOrPayout(i.caller, c, lock)
885877 else throw("Strict value is not equal to itself.")
886878 }
887879 else throw("Strict value is not equal to itself.")
888880 }
889881
890882
891883
892884 @Callable(i)
893885 func claimAllRewardsAndAllEbAvailable2 (lock,unstakeLegacy) = {
894886 let user = toString(i.caller)
895887 let cr = claimAllRewardsForUser(user)
896888 if ((cr == cr))
897889 then {
898890 let crLp = claimAllLpRewardsForUser(user)
899891 if ((crLp == crLp))
900892 then {
901893 let lA = if (unstakeLegacy)
902894 then asInt(invoke(vS, "unstakeAllViresFrom", [user], nil))
903895 else 0
904896 if ((lA == lA))
905897 then lockOrPayout(i.caller, ((cr + crLp) + lA), lock)
906898 else throw("Strict value is not equal to itself.")
907899 }
908900 else throw("Strict value is not equal to itself.")
909901 }
910902 else throw("Strict value is not equal to itself.")
911903 }
912904
913905
914906
915907 @Callable(i)
916908 func disableUseAsCollateral (rsr) = {
917909 let user = toString(i.caller)
918910 let d = invoke(vlR(rsr), "disableUseAsCollateralFor", [user], nil)
919911 if ((d == d))
920912 then {
921913 let va = validateAfter(user, "changing collateral status")
922914 if ((va == va))
923915 then nil
924916 else throw("Strict value is not equal to itself.")
925917 }
926918 else throw("Strict value is not equal to itself.")
927919 }
928920
929921
930922
931923 @Callable(i)
932924 func lockVires (factor,migrate) = {
933925 let user = toString(i.caller)
934926 let a = spfr()
935927 if ((a == a))
936928 then {
937929 let migrateAmount = if (migrate)
938930 then asInt(invoke(vS, "unstakeAllViresFrom", [user], nil))
939931 else 0
940932 let total = (migrateAmount + viresPayment(i))
941933 let l = invoke(dC, "lockFor", [user, factor], if ((total == 0))
942934 then nil
943935 else [AttachedPayment(viresAssetId, total)])
944936 if ((l == l))
945937 then nil
946938 else throw("Strict value is not equal to itself.")
947939 }
948940 else throw("Strict value is not equal to itself.")
949941 }
950942
951943
952944
953945 @Callable(i)
954946 func withdrawAllPossibleVires () = {
955947 let user = toString(i.caller)
956948 let a = spfr()
957949 if ((a == a))
958950 then {
959951 let stakerViresAmount = asInt(invoke(vS, "unstakeAllViresFrom", [user], nil))
960952 if ((stakerViresAmount == stakerViresAmount))
961953 then {
962954 let u = invoke(dC, "withdrawUnlockedFor", [user], nil)
963955 if ((u == u))
964956 then [ScriptTransfer(i.caller, stakerViresAmount, viresAssetId)]
965957 else throw("Strict value is not equal to itself.")
966958 }
967959 else throw("Strict value is not equal to itself.")
968960 }
969961 else throw("Strict value is not equal to itself.")
970962 }
971963
972964
973965
974966 @Callable(i)
975967 func claimProtocolProfitFrom (from,relock) = {
976968 let user = toString(i.caller)
977969 let a = spfr()
978970 if ((a == a))
979971 then {
980972 let u = invoke(dC, "claimProfit", [from, user, relock], nil)
981973 if ((u == u))
982974 then nil
983975 else throw("Strict value is not equal to itself.")
984976 }
985977 else throw("Strict value is not equal to itself.")
986978 }
987979
988980
989981
990982 @Callable(i)
991983 func withdrawUnlockedVires () = {
992984 let a = spfr()
993985 if ((a == a))
994986 then {
995987 let u = invoke(dC, "withdrawUnlockedFor", [toString(i.caller)], nil)
996988 if ((u == u))
997989 then nil
998990 else throw("Strict value is not equal to itself.")
999991 }
1000992 else throw("Strict value is not equal to itself.")
1001993 }
1002994
1003995
1004996
1005997 @Callable(i)
1006998 func lockSupply (reserve,period) = {
1007999 let rsr = vlR(reserve)
10081000 let user = toString(i.caller)
10091001 let checks = ensureNoProtected(user)
10101002 if ((checks == checks))
10111003 then {
10121004 let aTokenId = value(pureAssetId(valueOrErrorMessage(getString(rsr, "aTokenId"), "no aTokenId in reserve")))
10131005 let migration = if ((size(i.payments) == 0))
10141006 then unit
10151007 else if ((i.payments[0].assetId == aTokenId))
10161008 then unit
10171009 else if ((i.payments[0].assetId == pureAssetId(valueOrErrorMessage(getString(rsr, aIdS), "no assetId in reserve"))))
10181010 then {
10191011 let sh = sR(reserve)
10201012 if ((sh == sh))
10211013 then {
10221014 let action = invoke(rsr, "depositFor", [user, true], i.payments)
10231015 if ((action == action))
10241016 then {
10251017 let amt = i.payments[0].amount
10261018 let pRw = uS(reserve, "deposit", user, amt, amt)
10271019 if ((pRw == pRw))
10281020 then unit
10291021 else throw("Strict value is not equal to itself.")
10301022 }
10311023 else throw("Strict value is not equal to itself.")
10321024 }
10331025 else throw("Strict value is not equal to itself.")
10341026 }
10351027 else throw("bad asset attached")
10361028 if ((migration == migration))
10371029 then {
10381030 let mint = {
10391031 let sh = sR(reserve)
10401032 if ((sh == sh))
10411033 then {
10421034 let actual = asInt(invoke(rsr, "mintAtokenForTo", [user, -1, toString(this)], nil))
10431035 if ((actual == actual))
10441036 then {
10451037 let pRw = uS(toString(rsr), "deposit", user, -(actual), 0)
10461038 if ((pRw == pRw))
10471039 then {
10481040 let va = validateAfter(user, "lock-minting")
10491041 if ((va == va))
10501042 then nil
10511043 else throw("Strict value is not equal to itself.")
10521044 }
10531045 else throw("Strict value is not equal to itself.")
10541046 }
10551047 else throw("Strict value is not equal to itself.")
10561048 }
10571049 else throw("Strict value is not equal to itself.")
10581050 }
10591051 if ((mint == mint))
10601052 then {
10611053 let balance = assetBalance(this, aTokenId)
1062- let r = invoke(locker, "lockLP", [user, period], [AttachedPayment(aTokenId, balance)])
1054+ let r = invoke(valueOrErrorMessage(addressFromString(valueOrErrorMessage(maybeLocker, "no lp_locker in config")), "bad lp_locker address in config"), "lockLP", [user, period], [AttachedPayment(aTokenId, balance)])
10631055 if ((r == r))
10641056 then $Tuple2(nil, balance)
10651057 else throw("Strict value is not equal to itself.")
10661058 }
10671059 else throw("Strict value is not equal to itself.")
10681060 }
10691061 else throw("Strict value is not equal to itself.")
10701062 }
10711063 else throw("Strict value is not equal to itself.")
10721064 }
10731065
10741066
10751067
10761068 @Callable(i)
10771069 func repayWithAtokenFor (user) = {
10781070 let checks = if (!(isDefined(addressFromString(user))))
10791071 then throw("bad user")
10801072 else true
10811073 if ((checks == checks))
10821074 then repayWithAtokenInternal(user, i.payments[0])
10831075 else throw("Strict value is not equal to itself.")
10841076 }
10851077
10861078
10871079
10881080 @Callable(i)
10891081 func repayWithAtoken () = repayWithAtokenInternal(toString(i.caller), i.payments[0])
10901082
10911083
10921084
10931085 @Callable(i)
10941086 func repayFor (rsr,user) = {
10951087 let checks = if (!(isDefined(addressFromString(user))))
10961088 then throw("bad user")
10971089 else true
10981090 if ((checks == checks))
10991091 then {
11001092 let sh = sR(rsr)
11011093 if ((sh == sh))
11021094 then {
11031095 let repaid = asInt(invoke(vlR(rsr), "repayFor", [user], i.payments))
11041096 if ((repaid == repaid))
11051097 then {
11061098 let pRw = uS(rsr, "borrow", user, -(repaid), -(repaid))
11071099 if ((pRw == pRw))
11081100 then nil
11091101 else throw("Strict value is not equal to itself.")
11101102 }
11111103 else throw("Strict value is not equal to itself.")
11121104 }
11131105 else throw("Strict value is not equal to itself.")
11141106 }
11151107 else throw("Strict value is not equal to itself.")
11161108 }
11171109
11181110
11191111
11201112 @Callable(i)
11211113 func healthOf (address) = {
1122- let $t02411624167 = asInt3(userPower(address))
1123- let bp = $t02411624167._1
1124- let bpu = $t02411624167._2
1125- let ignore = $t02411624167._3
1114+ let $t02428324334 = asInt3(userPower(address))
1115+ let bp = $t02428324334._1
1116+ let bpu = $t02428324334._2
1117+ let ignore = $t02428324334._3
11261118 $Tuple2(nil, $Tuple2(bp, bpu))
11271119 }
11281120
11291121
11301122 @Verifier(tx)
11311123 func verify () = {
11321124 let maybeOracleAddress = match getString(configAddress, "oracle_address") {
11331125 case s: String =>
11341126 addressFromString(s)
11351127 case _ =>
11361128 unit
11371129 }
11381130 let HEIGHT = height
11391131 let BASE = 1000
11401132 let quorumRatio = valueOrErrorMessage(getInteger(configAddress, "proposal_quorum_ratio"), "proposalQuorumRatio is not defined")
11411133 let passedRatio = valueOrErrorMessage(getInteger(configAddress, "proposal_passed_ratio"), "proposalThresholdRatio is not defined")
11421134 let gViresContract = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, "dividends_contract"), "no dividends_contract")), "invalid dividends_contract")
11431135 let votingContract = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, "voting_contract"), "no voting_contract")), "invalid voting_contract")
11441136 let id = toBase58String(tx.id)
11451137 let votesYes = valueOrElse(getInteger(votingContract, ("proposal_yes_" + id)), 0)
11461138 let votesNo = valueOrElse(getInteger(votingContract, ("proposal_no_" + id)), 0)
11471139 let proposalHeight = valueOrErrorMessage(getInteger(votingContract, ("proposal_height_" + id)), "proposal not registered")
11481140 let applyStart = valueOrElse(getInteger(votingContract, ("proposal_applystart_" + id)), 0)
11491141 let applyEnd = valueOrElse(getInteger(votingContract, ("proposal_applyend_" + id)), 0)
11501142 let totalGVires = valueOrElse(getInteger(votingContract, ("proposal_gvires_" + id)), 0)
11511143 let enabled = valueOrElse(getBoolean(configAddress, "op_governance_apply_tx_paused"), false)
11521144 let voteYes = votesYes
11531145 let voteNo = votesNo
11541146 let totalVotes = (voteYes + voteNo)
11551147 let hasQuorum = (((totalVotes * BASE) / totalGVires) >= quorumRatio)
11561148 let hasPassed = (((voteYes * BASE) / totalVotes) >= passedRatio)
11571149 let tooEarly = (applyStart >= HEIGHT)
11581150 let tooLate = (HEIGHT >= applyEnd)
11591151 let timeDebug = ((((((("proposalHeight = " + toString(proposalHeight)) + ", applyStart = ") + toString(applyStart)) + ", applyEnd = ") + toString(applyEnd)) + ", HEIGHT = ") + toString(HEIGHT))
11601152 let byVoting = if (!(enabled))
11611153 then throw("tx application throw governance not enabled")
11621154 else if (tooEarly)
11631155 then throw(("proposal can't be executed as it's too early: " + timeDebug))
11641156 else if (tooLate)
11651157 then throw(("proposal can't be executed as it's too late:" + timeDebug))
11661158 else if (!(hasQuorum))
11671159 then throw((((((("no quorum: " + "totalVotes: ") + toString(totalVotes)) + ", totalGVires: ") + toString(totalGVires)) + ", quorumRatio: ") + toString(quorumRatio)))
11681160 else if (!(hasPassed))
11691161 then throw((((((("no threshold achieved: " + "voteYes: ") + toString(voteYes)) + ", voteNo: ") + toString(voteNo)) + ", passedRatio: ") + toString(passedRatio)))
11701162 else true
11711163 if (sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey))
11721164 then true
11731165 else byVoting
11741166 }
11751167

github/deemru/w8io/786bc32 
119.85 ms