tx · 2vNWKQnNL1ig96EMC387h7mJQgbbzcdmXQvTJV8rzBiH

3PPWSpENBfmvH7Hkz7vqMrwywTZYEtLEBaH:  -0.02400000 Waves

2024.03.29 09:24 [4104937] smart account 3PPWSpENBfmvH7Hkz7vqMrwywTZYEtLEBaH > SELF 0.00000000 Waves

{ "type": 13, "id": "2vNWKQnNL1ig96EMC387h7mJQgbbzcdmXQvTJV8rzBiH", "fee": 2400000, "feeAssetId": null, "timestamp": 1711693500725, "version": 2, "chainId": 87, "sender": "3PPWSpENBfmvH7Hkz7vqMrwywTZYEtLEBaH", "senderPublicKey": "9uamYnu8jeJY8we2eNQxdBBf8FWrWpLP9i1T1H4gmGze", "proofs": [ "4US2GxRcWMS2iXRonG86SZd6f4RQutLYWW6HJp91H5PFqNwJ4NdYX2nx2nVTTuWL9Cab44YiqZzxKqYzEBJ5qwvE" ], "script": "base64:BgJDCAISBQoDCAgBEgASBgoECAgICBIDCgEIEgMKAQQSABIDCgEBEgASAwoBBBIECgIIARIFCgMEAQgSABIHCgUIAQEICDMACXN0YXJ0VHNNcwCgy9Cb5jEBF2NhbGN1bGF0ZURheXNTaW5jZVN0YXJ0AAQEZGlmZgkAZQIIBQlsYXN0QmxvY2sJdGltZXN0YW1wBQlzdGFydFRzTXMECmRheXNQYXNzZWQJAGkCBQRkaWZmCQBoAgCAowUA6AcFCmRheXNQYXNzZWQBCmFzSW50VHVwbGUBBXZhbHVlBAckbWF0Y2gwBQV2YWx1ZQMJAAECBQckbWF0Y2gwAgooSW50LCBJbnQpBANpbnQFByRtYXRjaDAFA2ludAkAAgECH1dyb25nIHR5cGUsIGV4cGVjdGVkOiBUdXBsZSBJbnQBEGdldE9yYWNsZUFkZHJlc3MACQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMCDXN0YXRpY19vcmFjbGUCEW9yYWNsZSBub3QgZm91bmQhAhZjb3VsZCBub3QgcGFyc2Ugb3JhY2xlAQ5nZXRGZWVzQWNjb3VudAAJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCCQEQZ2V0T3JhY2xlQWRkcmVzcwACFHN0YXRpY19mZWVBZ2dyZWdhdG9yAh9zdGF0aWNfZmVlQWdncmVnYXRvciBub3QgZm91bmQhAQ5nZXROb2RlQWNjb3VudAAJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCCQEQZ2V0T3JhY2xlQWRkcmVzcwACEnN0YXRpY19ub2RlQWRkcmVzcwIXbm9kZV9hZGRyZXNzIG5vdCBmb3VuZCEBDXRyeUdldEludGVnZXIBA2tleQQHJG1hdGNoMAkAmggCBQR0aGlzBQNrZXkDCQABAgUHJG1hdGNoMAIDSW50BAFiBQckbWF0Y2gwBQFiAAABDHRyeUdldEJpbmFyeQEDa2V5BAckbWF0Y2gwCQCcCAIFBHRoaXMFA2tleQMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAFiBQckbWF0Y2gwBQFiAQABDHRyeUdldFN0cmluZwEDa2V5BAckbWF0Y2gwCQCdCAIFBHRoaXMFA2tleQMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWIFByRtYXRjaDAFAWICAAEOZ2V0QXNzZXRTdHJpbmcBB2Fzc2V0SWQEByRtYXRjaDAFB2Fzc2V0SWQDCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQBYgUHJG1hdGNoMAkA2AQBBQFiAgVXQVZFUwENZ2V0QXNzZXRCeXRlcwEKYXNzZXRJZFN0cgMJAAACBQphc3NldElkU3RyAgVXQVZFUwUEdW5pdAkA2QQBBQphc3NldElkU3RyARNhZGRBc3NldEJ5dGVzVG9MaXN0AgVhY2N1bQRpdGVtCQDOCAIFBWFjY3VtCQDMCAIJAQ1nZXRBc3NldEJ5dGVzAQUEaXRlbQUDbmlsARRhZGRBc3NldFdlaWdodFRvTGlzdAIFYWNjdW0EaXRlbQkAzggCBQVhY2N1bQkAzAgCCQENdHJ5R2V0SW50ZWdlcgEJAKwCAgkArAICAgdzdGF0aWNfCQEOZ2V0QXNzZXRTdHJpbmcBBQRpdGVtAgdfd2VpZ2h0BQNuaWwBFmFkZEFzc2V0RGVjaW1hbHNUb0xpc3QCBWFjY3VtBGl0ZW0JAM4IAgUFYWNjdW0JAMwIAgkBDXRyeUdldEludGVnZXIBCQCsAgIJAKwCAgIHc3RhdGljXwkBDmdldEFzc2V0U3RyaW5nAQUEaXRlbQIJX2RlY2ltYWxzBQNuaWwBE2FkZEFzc2V0U2NhbGVUb0xpc3QCBWFjY3VtBGl0ZW0JAM4IAgUFYWNjdW0JAMwIAgkBDXRyeUdldEludGVnZXIBCQCsAgIJAKwCAgIHc3RhdGljXwkBDmdldEFzc2V0U3RyaW5nAQUEaXRlbQIGX3NjYWxlBQNuaWwBDGFkZEludFRvTGlzdAIFYWNjdW0EaXRlbQkAzggCBQVhY2N1bQkAzAgCCQENcGFyc2VJbnRWYWx1ZQEFBGl0ZW0FA25pbAEXcmV2ZW5ldUZvckRheUJ5QXNzZXRPdXQCA2RheQdhc3NldElkCQCsAgIJAKwCAgkArAICAgxyZXZlbmV1X2RheV8FB2Fzc2V0SWQCAV8JAKQDAQUDZGF5ARB2b2x1bWVGb3JEYXlCeUluAgNkYXkHYXNzZXRJZAkArAICCQCsAgIJAKwCAgILdm9sdW1lX2RheV8FB2Fzc2V0SWQCAV8JAKQDAQUDZGF5AAFUCQENdHJ5R2V0SW50ZWdlcgECE3N0YXRpY190b2tlbnNBbW91bnQACGFzc2V0SWRzCgACJGwJALUJAgkBDHRyeUdldFN0cmluZwECD3N0YXRpY190b2tlbklkcwIBLAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQETYWRkQXNzZXRCeXRlc1RvTGlzdAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgANQXNzZXRzV2VpZ2h0cwoAAiRsBQhhc3NldElkcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMV8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEUYWRkQXNzZXRXZWlnaHRUb0xpc3QCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjFfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYxXzICCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECCQEFJGYxXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACERlY2ltYWxzCgACJGwFCGFzc2V0SWRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYyXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJARZhZGRBc3NldERlY2ltYWxzVG9MaXN0AgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYyXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMl8yAgkBBSRmMl8xAgkBBSRmMl8xAgkBBSRmMl8xAgkBBSRmMl8xAgkBBSRmMl8xAgkBBSRmMl8xAgkBBSRmMl8xAgkBBSRmMl8xAgkBBSRmMl8xAgkBBSRmMl8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAZTY2FsZXMKAAIkbAUIYXNzZXRJZHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjNfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBE2FkZEFzc2V0U2NhbGVUb0xpc3QCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjNfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYzXzICCQEFJGYzXzECCQEFJGYzXzECCQEFJGYzXzECCQEFJGYzXzECCQEFJGYzXzECCQEFJGYzXzECCQEFJGYzXzECCQEFJGYzXzECCQEFJGYzXzECCQEFJGYzXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoAB3N0YWtlSWQJAQx0cnlHZXRTdHJpbmcBAg1sYXN0X3N0YWtlX2lkAANGZWUJAQ10cnlHZXRJbnRlZ2VyAQIKc3RhdGljX2ZlZQAVQXNzZXRzV2VpZ2h0c0RlY2ltYWxzAAIABVNjYWxlAJBOAAZTY2FsZTgAgMLXLwAIRmVlU2NhbGUAkE4AEVBvb2xUb2tlbkRlY2ltYWxzAAgADlBvb2xUb2tlblNjYWxlCQBsBgAKAAAFEVBvb2xUb2tlbkRlY2ltYWxzAAAAAAUGSEFMRlVQAAxlYXJuZWRBc3NldHMFCGFzc2V0SWRzAQhidXJuRmVlcwADCQECIT0CCQEMdHJ5R2V0U3RyaW5nAQINc3RhdGljX29yYWNsZQIABAckbWF0Y2gwCQCbCAIJARBnZXRPcmFjbGVBZGRyZXNzAAkArAICAglhbW1fYnVybl8JAKUIAQUEdGhpcwMJAAECBQckbWF0Y2gwAgdCb29sZWFuBAF4BQckbWF0Y2gwBQF4BwcBCmlzU2h1dGRvd24ABAhzaHV0ZG93bgMJAQIhPQIJAQx0cnlHZXRTdHJpbmcBAg1zdGF0aWNfb3JhY2xlAgAEByRtYXRjaDAJAJsIAgkBEGdldE9yYWNsZUFkZHJlc3MAAgxhbW1fc2h1dGRvd24DCQABAgUHJG1hdGNoMAIHQm9vbGVhbgQBeAUHJG1hdGNoMAUBeAcHBAlzaHV0ZG93bjIEByRtYXRjaDAJAJsIAgUEdGhpcwILaXNfc2h1dGRvd24DCQABAgUHJG1hdGNoMAIHQm9vbGVhbgQBeAUHJG1hdGNoMAUBeAcDBQhzaHV0ZG93bgYFCXNodXRkb3duMgEJY2FuVXBkYXRlAAMJAQIhPQIJAQx0cnlHZXRTdHJpbmcBAg1zdGF0aWNfb3JhY2xlAgAEByRtYXRjaDAJAJsIAgkBEGdldE9yYWNsZUFkZHJlc3MAAgZhbW1fdHgDCQABAgUHJG1hdGNoMAIHQm9vbGVhbgQBeAUHJG1hdGNoMAUBeAYGARZnZXRDdXJyZW50VG9rZW5CYWxhbmNlAQl0b2tlblR5cGUEB3Rva2VuSWQJAQ5nZXRBc3NldFN0cmluZwEJAJEDAgUIYXNzZXRJZHMFCXRva2VuVHlwZQkBDXRyeUdldEludGVnZXIBCQCsAgIJAKwCAgIHZ2xvYmFsXwUHdG9rZW5JZAIIX2JhbGFuY2UBEGNhbGN1bGF0ZVBJc3N1ZWQCBmFtb3VudAd0b2tlbklkBAdQc3VwcGx5CQENdHJ5R2V0SW50ZWdlcgECF2dsb2JhbF9wb29sVG9rZW5fYW1vdW50BAdCYWxhbmNlCQENdHJ5R2V0SW50ZWdlcgEJAKwCAgkArAICAgdnbG9iYWxfCQEOZ2V0QXNzZXRTdHJpbmcBBQd0b2tlbklkAghfYmFsYW5jZQkAbgQFBmFtb3VudAUHUHN1cHBseQUHQmFsYW5jZQUERE9XTgENZ2V0TWluUElzc3VlZAEIcGF5bWVudHMKAQdoYW5kbGVyAgVhY2N1bQdjdXJyZW50BAdQSXNzdWVkCQEQY2FsY3VsYXRlUElzc3VlZAIIBQdjdXJyZW50BmFtb3VudAgFB2N1cnJlbnQHYXNzZXRJZAMJAAACBQdQSXNzdWVkAAAJAAIBAiRvbmUgb2YgdGhlIHRva2VucyBhbW91bnRzIGlzIHRvbyBsb3cDAwkAAAIFBWFjY3VtAAAGCQBmAgUFYWNjdW0FB1BJc3N1ZWQFB1BJc3N1ZWQFBWFjY3VtBAltaW5QSXNzZWQKAAIkbAUIcGF5bWVudHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwAAAKAQUkZjRfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBB2hhbmRsZXICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjRfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGY0XzICCQEFJGY0XzECCQEFJGY0XzECCQEFJGY0XzECCQEFJGY0XzECCQEFJGY0XzECCQEFJGY0XzECCQEFJGY0XzECCQEFJGY0XzECCQEFJGY0XzECCQEFJGY0XzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoFCW1pblBJc3NlZAETY2hlY2tUb2tlbnNWYWxpZGl0eQEIcGF5bWVudHMKAQhoYW5kbGVyMQIFYWNjdW0HcGF5bWVudAkAzggCBQVhY2N1bQkAzAgCCAUHcGF5bWVudAdhc3NldElkBQNuaWwEA2lkcwoAAiRsBQhwYXltZW50cwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmNF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEIaGFuZGxlcjECBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjRfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGY0XzICCQEFJGY0XzECCQEFJGY0XzECCQEFJGY0XzECCQEFJGY0XzECCQEFJGY0XzECCQEFJGY0XzECCQEFJGY0XzECCQEFJGY0XzECCQEFJGY0XzECCQEFJGY0XzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoDCQAAAgUDaWRzBQNpZHMKAQhoYW5kbGVyMgIFYWNjdW0HYXNzZXRJZAMJAQIhPQIJAM8IAgUDaWRzBQdhc3NldElkBQR1bml0CQBkAgUFYWNjdW0AAQkAAgEJAKwCAgIUYXNzZXQgbm90IGF0dGFjaGVkOiAJAQ5nZXRBc3NldFN0cmluZwEFB2Fzc2V0SWQEBmNoZWNrcwoAAiRsBQhhc3NldElkcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAAAAoBBSRmNV8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEIaGFuZGxlcjICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjVfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGY1XzICCQEFJGY1XzECCQEFJGY1XzECCQEFJGY1XzECCQEFJGY1XzECCQEFJGY1XzECCQEFJGY1XzECCQEFJGY1XzECCQEFJGY1XzECCQEFJGY1XzECCQEFJGY1XzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoDCQAAAgUGY2hlY2tzBQZjaGVja3MGCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQxzdGFrZVVuc3Rha2UDBXN0YWtlBmFtb3VudAdhc3NldElkAwMJAAACBQdhc3NldElkAgVXQVZFUwkAZgIFBmFtb3VudAAABwQNbGVhc2luZ0Ftb3VudAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzAg5sZWFzaW5nX2Ftb3VudAAABA5uZXdMZWFzZUFtb3VudAMFBXN0YWtlCQBkAgUNbGVhc2luZ0Ftb3VudAUGYW1vdW50CQBlAgUNbGVhc2luZ0Ftb3VudAUGYW1vdW50BAhuZXdMZWFzZQkAxAgCCQEOZ2V0Tm9kZUFjY291bnQABQ5uZXdMZWFzZUFtb3VudAQKbmV3TGVhc2VJZAkAuQgBBQhuZXdMZWFzZQQEZGF0YQkAzAgCBQhuZXdMZWFzZQkAzAgCCQELU3RyaW5nRW50cnkCAg1sYXN0X3N0YWtlX2lkCQDYBAEFCm5ld0xlYXNlSWQJAMwIAgkBDEludGVnZXJFbnRyeQICDmxlYXNpbmdfYW1vdW50BQ5uZXdMZWFzZUFtb3VudAUDbmlsAwkBAiE9AgUHc3Rha2VJZAIACQDOCAIJAMwIAgkBC0xlYXNlQ2FuY2VsAQkA2QQBBQdzdGFrZUlkBQNuaWwFBGRhdGEFBGRhdGEFA25pbAETaGFuZGxlUG9vbFRva2Vuc0FkZAQHUElzc3VlZAhwYXltZW50cwt1c2VyQWRkcmVzcwpuZWVkQ2hhbmdlCgEVZ2V0VG9rZW5QYXltZW50QW1vdW50AQd0b2tlbklkCgEHaGFuZGxlcgIFYWNjdW0HcGF5bWVudAMJAAACCAUHcGF5bWVudAdhc3NldElkBQd0b2tlbklkCAUHcGF5bWVudAZhbW91bnQFBWFjY3VtCgACJGwFCHBheW1lbnRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAAACgEFJGY0XzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQdoYW5kbGVyAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGY0XzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmNF8yAgkBBSRmNF8xAgkBBSRmNF8xAgkBBSRmNF8xAgkBBSRmNF8xAgkBBSRmNF8xAgkBBSRmNF8xAgkBBSRmNF8xAgkBBSRmNF8xAgkBBSRmNF8xAgkBBSRmNF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKCgERaGFuZGxlVG9rZW5DaGFuZ2UCBWFjY3VtB3Rva2VuSWQEAkJrCQENdHJ5R2V0SW50ZWdlcgEJAKwCAgkArAICAgdnbG9iYWxfCQEOZ2V0QXNzZXRTdHJpbmcBBQd0b2tlbklkAghfYmFsYW5jZQQHUFN1cHBseQkBDXRyeUdldEludGVnZXIBAhdnbG9iYWxfcG9vbFRva2VuX2Ftb3VudAQNdG9rZW5EZWNpbWFscwkBDXRyeUdldEludGVnZXIBCQCsAgIJAKwCAgIHc3RhdGljXwkBDmdldEFzc2V0U3RyaW5nAQUHdG9rZW5JZAIGX3NjYWxlBAZEa1RlbXAJAG4ECQBlAgkAbgQJAGQCBQdQU3VwcGx5BQdQSXNzdWVkBQ10b2tlbkRlY2ltYWxzBQdQU3VwcGx5BQdDRUlMSU5HBQ10b2tlbkRlY2ltYWxzBQJCawUNdG9rZW5EZWNpbWFscwUHQ0VJTElORwQNcGF5bWVudEFtb3VudAkBFWdldFRva2VuUGF5bWVudEFtb3VudAEFB3Rva2VuSWQEAkRrCQCXAwEJAMwIAgUGRGtUZW1wCQDMCAIFDXBheW1lbnRBbW91bnQFA25pbAQIdG9SZXR1cm4JAGUCAwkBAiE9AgUNcGF5bWVudEFtb3VudAAABQ1wYXltZW50QW1vdW50AAAFAkRrBAF0AwMFCm5lZWRDaGFuZ2UJAGYCBQh0b1JldHVybgAABwkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQt1c2VyQWRkcmVzcwUIdG9SZXR1cm4FB3Rva2VuSWQFA25pbAUDbmlsBBBzdGFrZVVuc3Rha2VEYXRhAwkAAAIJAQ5nZXRBc3NldFN0cmluZwEFB3Rva2VuSWQCBVdBVkVTCQEMc3Rha2VVbnN0YWtlAwYFAkRrAgVXQVZFUwUDbmlsCQDOCAIJAM4IAgkAzggCBQVhY2N1bQUBdAUQc3Rha2VVbnN0YWtlRGF0YQkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgICB2dsb2JhbF8JAQ5nZXRBc3NldFN0cmluZwEFB3Rva2VuSWQCCF9iYWxhbmNlCQBkAgUCQmsFAkRrBQNuaWwKAAIkbAUIYXNzZXRJZHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjRfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBEWhhbmRsZVRva2VuQ2hhbmdlAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGY0XzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmNF8yAgkBBSRmNF8xAgkBBSRmNF8xAgkBBSRmNF8xAgkBBSRmNF8xAgkBBSRmNF8xAgkBBSRmNF8xAgkBBSRmNF8xAgkBBSRmNF8xAgkBBSRmNF8xAgkBBSRmNF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKARZoYW5kbGVQb29sVG9rZW5zUmVkZWVtAglQUmVkZWVtZWQLdXNlckFkZHJlc3MKARFoYW5kbGVUb2tlblJlZGVlbQIFYWNjdW0HdG9rZW5JZAQCQmsJAQ10cnlHZXRJbnRlZ2VyAQkArAICCQCsAgICB2dsb2JhbF8JAQ5nZXRBc3NldFN0cmluZwEFB3Rva2VuSWQCCF9iYWxhbmNlBAdQU3VwcGx5CQENdHJ5R2V0SW50ZWdlcgECF2dsb2JhbF9wb29sVG9rZW5fYW1vdW50BA10b2tlbkRlY2ltYWxzCQENdHJ5R2V0SW50ZWdlcgEJAKwCAgkArAICAgdzdGF0aWNfCQEOZ2V0QXNzZXRTdHJpbmcBBQd0b2tlbklkAgZfc2NhbGUEBmFtb3VudAkAoAMBCQC9AgQJALgCAgkAtgIBBQZTY2FsZTgJAL0CBAkAtgIBCQBlAgUHUFN1cHBseQUJUFJlZGVlbWVkCQC2AgEFBlNjYWxlOAkAtgIBBQdQU3VwcGx5BQdDRUlMSU5HCQC2AgEFAkJrCQC2AgEFBlNjYWxlOAUERE9XTgQQc3Rha2VVbnN0YWtlRGF0YQMJAAACCQEOZ2V0QXNzZXRTdHJpbmcBBQd0b2tlbklkAgVXQVZFUwkBDHN0YWtlVW5zdGFrZQMHBQZhbW91bnQCBVdBVkVTBQNuaWwJAM4IAgkAzggCBQVhY2N1bQUQc3Rha2VVbnN0YWtlRGF0YQkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgICB2dsb2JhbF8JAQ5nZXRBc3NldFN0cmluZwEFB3Rva2VuSWQCCF9iYWxhbmNlCQBlAgUCQmsFBmFtb3VudAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQt1c2VyQWRkcmVzcwUGYW1vdW50BQd0b2tlbklkBQNuaWwKAAIkbAUIYXNzZXRJZHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjRfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBEWhhbmRsZVRva2VuUmVkZWVtAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGY0XzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmNF8yAgkBBSRmNF8xAgkBBSRmNF8xAgkBBSRmNF8xAgkBBSRmNF8xAgkBBSRmNF8xAgkBBSRmNF8xAgkBBSRmNF8xAgkBBSRmNF8xAgkBBSRmNF8xAgkBBSRmNF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKARJjYWxjdWxhdGVPdXRBbW91bnQFCEFtb3VudEluB2Fzc2V0SW4IYXNzZXRPdXQJQmFsYW5jZUluCkJhbGFuY2VPdXQEB0luZGV4SW4JAQV2YWx1ZQEJAM8IAgUIYXNzZXRJZHMFB2Fzc2V0SW4ECEluZGV4T3V0CQEFdmFsdWUBCQDPCAIFCGFzc2V0SWRzBQhhc3NldE91dAMJAAACBQdJbmRleEluBQhJbmRleE91dAkAAgECEXdyb25nIHRva2VucyBwYWlyCQBuBAUKQmFsYW5jZU91dAkAZQIJAGgCBQZTY2FsZTgFBlNjYWxlOAkAoAMBCQB2BgkAvQIECQC2AgEFCUJhbGFuY2VJbgkAtgIBCQBoAgUGU2NhbGU4BQZTY2FsZTgJALYCAQkAZAIFCUJhbGFuY2VJbgUIQW1vdW50SW4FBkhBTEZVUAAQCQC2AgEJAGsDCQCRAwIFDUFzc2V0c1dlaWdodHMFB0luZGV4SW4AkE4JAJEDAgUNQXNzZXRzV2VpZ2h0cwUISW5kZXhPdXQABAAQBQdDRUlMSU5HCQBoAgUGU2NhbGU4BQZTY2FsZTgFBERPV04BEWNhbGN1bGF0ZU1pblRvR2V0AwZhc3NldDEGYXNzZXQyDGFtb3VudFRvU3dhcAQJa0JhbGFuY2VBCQCsAgIJAKwCAgIHZ2xvYmFsXwUGYXNzZXQxAghfYmFsYW5jZQQPQV9hc3NldF9iYWxhbmNlCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzBQlrQmFsYW5jZUEECWtCYWxhbmNlQgkArAICCQCsAgICB2dsb2JhbF8FBmFzc2V0MgIIX2JhbGFuY2UED0JfYXNzZXRfYmFsYW5jZQkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwUJa0JhbGFuY2VCBAV0b0dldAkBEmNhbGN1bGF0ZU91dEFtb3VudAUFDGFtb3VudFRvU3dhcAkBDWdldEFzc2V0Qnl0ZXMBBQZhc3NldDEJAQ1nZXRBc3NldEJ5dGVzAQUGYXNzZXQyBQ9BX2Fzc2V0X2JhbGFuY2UFD0JfYXNzZXRfYmFsYW5jZQQJZmVlQW1vdW50CQBrAwUFdG9HZXQFA0ZlZQUIRmVlU2NhbGUDCQAAAgUJZmVlQW1vdW50BQlmZWVBbW91bnQEDmNsZWFuQW1vdW50T3V0CQBlAgUFdG9HZXQFCWZlZUFtb3VudAMJAAACBQ5jbGVhbkFtb3VudE91dAUOY2xlYW5BbW91bnRPdXQFDmNsZWFuQW1vdW50T3V0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQ9nZXRUb2tlbkJhbGFuY2UBB2Fzc2V0SWQEByRtYXRjaDAFB2Fzc2V0SWQDCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQBdAUHJG1hdGNoMAkA8AcCBQR0aGlzBQF0CAkA7wcBBQR0aGlzB3JlZ3VsYXIBHWNhbGN1bGF0ZUN1cnJlbnRBc3NldEludGVyZXN0BAdhc3NldElkCmFzc2V0SWRTdHIIYUJhbGFuY2UWdG9rZW5FYXJuaW5nc0xhc3RDaGVjawQLdG90YWxTdGFrZWQJAQ10cnlHZXRJbnRlZ2VyAQISZ2xvYmFsX2luZGV4U3Rha2VkBBV0b2tlbkJhbGFuY2VMYXN0Q2hlY2sFFnRva2VuRWFybmluZ3NMYXN0Q2hlY2sEE2N1cnJlbnRCYWxhbmNlRGVsdGEJAGUCCQEPZ2V0VG9rZW5CYWxhbmNlAQUHYXNzZXRJZAUIYUJhbGFuY2UEFGN1cnJlbnRUb2tlbkVhcm5pbmdzAwkAZgIFE2N1cnJlbnRCYWxhbmNlRGVsdGEFFXRva2VuQmFsYW5jZUxhc3RDaGVjawUTY3VycmVudEJhbGFuY2VEZWx0YQUVdG9rZW5CYWxhbmNlTGFzdENoZWNrBAtuZXdFYXJuaW5ncwkAZQIFFGN1cnJlbnRUb2tlbkVhcm5pbmdzBRV0b2tlbkJhbGFuY2VMYXN0Q2hlY2sEC25ld0ludGVyZXN0AwkAAAIFC3RvdGFsU3Rha2VkAAAAAAkAawMFC25ld0Vhcm5pbmdzBQZTY2FsZTgFC3RvdGFsU3Rha2VkBBFsYXN0Q2hlY2tJbnRlcmVzdAkBDXRyeUdldEludGVnZXIBCQCsAgIJAKwCAgIRZ2xvYmFsX2xhc3RDaGVja18FCmFzc2V0SWRTdHICCV9pbnRlcmVzdAkAZAIFEWxhc3RDaGVja0ludGVyZXN0BQtuZXdJbnRlcmVzdAELY2xhaW1SZXN1bHQBB2FkZHJlc3MECmFkZHJlc3NTdHIJAKUIAQUHYWRkcmVzcwQLc2hhcmVBbW91bnQJAQ10cnlHZXRJbnRlZ2VyAQkArAICBQphZGRyZXNzU3RyAgxfaW5kZXhTdGFrZWQKAQdoYW5kbGVyAgVhY2N1bQdhc3NldElkBAphc3NldElkU3RyCQEOZ2V0QXNzZXRTdHJpbmcBBQdhc3NldElkBAhhQmFsYW5jZQkBDXRyeUdldEludGVnZXIBCQCsAgIJAKwCAgIHZ2xvYmFsXwkBDmdldEFzc2V0U3RyaW5nAQUHYXNzZXRJZAIIX2JhbGFuY2UEFnRva2VuRWFybmluZ3NMYXN0Q2hlY2sJAQ10cnlHZXRJbnRlZ2VyAQkArAICCQCsAgICEWdsb2JhbF9sYXN0Q2hlY2tfBQphc3NldElkU3RyAglfZWFybmluZ3MEFGN1cnJlbnRUb2tlbkludGVyZXN0CQEdY2FsY3VsYXRlQ3VycmVudEFzc2V0SW50ZXJlc3QEBQdhc3NldElkBQphc3NldElkU3RyBQhhQmFsYW5jZQUWdG9rZW5FYXJuaW5nc0xhc3RDaGVjawQUY3VycmVudFRva2VuRWFybmluZ3MJAJYDAQkAzAgCBRZ0b2tlbkVhcm5pbmdzTGFzdENoZWNrCQDMCAIJAGUCCQEPZ2V0VG9rZW5CYWxhbmNlAQUHYXNzZXRJZAUIYUJhbGFuY2UFA25pbAQMcmV3YXJkQW1vdW50CQBrAwULc2hhcmVBbW91bnQJAGUCBRRjdXJyZW50VG9rZW5JbnRlcmVzdAkBDXRyeUdldEludGVnZXIBCQCsAgIJAKwCAgkArAICBQphZGRyZXNzU3RyAgtfbGFzdENoZWNrXwUKYXNzZXRJZFN0cgIJX2ludGVyZXN0BQZTY2FsZTgECHRyYW5zZmVyAwkAAAIFDHJld2FyZEFtb3VudAAABQNuaWwJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUHYWRkcmVzcwUMcmV3YXJkQW1vdW50BQdhc3NldElkBQNuaWwEB2NsYWltZWQJAQ10cnlHZXRJbnRlZ2VyAQkArAICCQCsAgIJAKwCAgUKYWRkcmVzc1N0cgILX2xhc3RDaGVja18FCmFzc2V0SWRTdHICCF9jbGFpbWVkCQDOCAIJAM4IAgUFYWNjdW0FCHRyYW5zZmVyCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgIRZ2xvYmFsX2xhc3RDaGVja18FCmFzc2V0SWRTdHICCV9lYXJuaW5ncwkAZQIFFGN1cnJlbnRUb2tlbkVhcm5pbmdzBQxyZXdhcmRBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICAhFnbG9iYWxfbGFzdENoZWNrXwUKYXNzZXRJZFN0cgIJX2ludGVyZXN0BRRjdXJyZW50VG9rZW5JbnRlcmVzdAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgUKYWRkcmVzc1N0cgILX2xhc3RDaGVja18FCmFzc2V0SWRTdHICCV9pbnRlcmVzdAUUY3VycmVudFRva2VuSW50ZXJlc3QJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIFCmFkZHJlc3NTdHICC19sYXN0Q2hlY2tfBQphc3NldElkU3RyAghfY2xhaW1lZAkAZAIFB2NsYWltZWQFDHJld2FyZEFtb3VudAUDbmlsBAVhY2N1bQoAAiRsBQxlYXJuZWRBc3NldHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjRfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBB2hhbmRsZXICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjRfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGY0XzICCQEFJGY0XzECCQEFJGY0XzECCQEFJGY0XzECCQEFJGY0XzECCQEFJGY0XzECCQEFJGY0XzECCQEFJGY0XzECCQEFJGY0XzECCQEFJGY0XzECCQEFJGY0XzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoJAM4IAgUFYWNjdW0JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUKYWRkcmVzc1N0cgIKX2xhc3RDbGFpbQgFCWxhc3RCbG9jawl0aW1lc3RhbXAFA25pbAEQaW5kZXhTdGFrZVJlc3VsdAIKYWRkcmVzc1N0cgZhbW91bnQEAmxpCQELY2xhaW1SZXN1bHQBCQERQGV4dHJOYXRpdmUoMTA2MikBBQphZGRyZXNzU3RyCQDOCAIFAmxpCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCmFkZHJlc3NTdHICDF9pbmRleFN0YWtlZAkAZAIJAQ10cnlHZXRJbnRlZ2VyAQkArAICBQphZGRyZXNzU3RyAgxfaW5kZXhTdGFrZWQFBmFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgISZ2xvYmFsX2luZGV4U3Rha2VkCQBkAgkBDXRyeUdldEludGVnZXIBAhJnbG9iYWxfaW5kZXhTdGFrZWQFBmFtb3VudAUDbmlsAQNzdW0CBWFjY3VtAW4JAGQCBQVhY2N1bQkBDXBhcnNlSW50VmFsdWUBBQFuARtzZXRPcmFjbGVBZGRyZXNzQW5kSW5pdGlhdGUBB2FkZHJlc3MJAMwIAgkBC1N0cmluZ0VudHJ5AgINc3RhdGljX29yYWNsZQUHYWRkcmVzcwUDbmlsAQlpc1Rlc3RFbnYABAd0ZXN0ZW52BAckbWF0Y2gwCQCbCAIFBHRoaXMCB1RFU1RFTlYDCQABAgUHJG1hdGNoMAIHQm9vbGVhbgQBeAUHJG1hdGNoMAUBeAcFB3Rlc3RlbnYNAWkBDHJlYWRPbmx5RnVuYwMGYXNzZXQxBmFzc2V0MgxhbW91bnRUb1N3YXAECWFtb3VudE91dAkBEWNhbGN1bGF0ZU1pblRvR2V0AwUGYXNzZXQxBQZhc3NldDIFDGFtb3VudFRvU3dhcAkAzAgCCQEMSW50ZWdlckVudHJ5AgIFREVCVUcFCWFtb3VudE91dAUDbmlsAWkBCnRvcFVwRnVuZHMAAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwABCQACAQIYV3JvbmcgcGF5bWVudHMgYXR0YWNoZWQhBAdwYXltZW50CQCRAwIIBQFpCHBheW1lbnRzAAAEBWFzc2V0CAUHcGF5bWVudAdhc3NldElkAwkAAAIJAM8IAgUIYXNzZXRJZHMFBWFzc2V0BQR1bml0CQACAQIVTm90IHN1cHBvcnRlZCBhc3NldElkBAZhbW91bnQIBQdwYXltZW50BmFtb3VudAQIYUJhbGFuY2UJAQ10cnlHZXRJbnRlZ2VyAQkArAICCQCsAgICB2dsb2JhbF8JAQ5nZXRBc3NldFN0cmluZwEFBWFzc2V0AghfYmFsYW5jZQQDZGF5CQEXY2FsY3VsYXRlRGF5c1NpbmNlU3RhcnQABAdyZXZlbmV1CQENdHJ5R2V0SW50ZWdlcgEJARdyZXZlbmV1Rm9yRGF5QnlBc3NldE91dAIFA2RheQkBDmdldEFzc2V0U3RyaW5nAQUFYXNzZXQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICAgdnbG9iYWxfCQEOZ2V0QXNzZXRTdHJpbmcBBQVhc3NldAIIX2JhbGFuY2UJAGQCBQhhQmFsYW5jZQUGYW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCAg5kYXlzX3NpbmNlX2FweQUDZGF5CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEXcmV2ZW5ldUZvckRheUJ5QXNzZXRPdXQCBQNkYXkJAQ5nZXRBc3NldFN0cmluZwEFBWFzc2V0CQBkAgUHcmV2ZW5ldQUGYW1vdW50BQNuaWwBaQEHcHJlSW5pdAQLYXNzZXRJZHNTdHIPYXNzZXRXZWlnaHRzU3RyDmJhc2VUb2tlbklkU3RyCnBvb2xEb21haW4DCQECIT0CBQR0aGlzCAUBaQZjYWxsZXIJAAIBAgphZG1pbiBvbmx5AwkAZgIJALECAQUKcG9vbERvbWFpbgANCQACAQIVdG9vIGxhcmdlIHBvb2wgZG9tYWluBA1hc3NldElkc1N0ckxpCQC1CQIFC2Fzc2V0SWRzU3RyAgEsBAphc3NldElkc0xpCgACJGwFDWFzc2V0SWRzU3RyTGkKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjRfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBE2FkZEFzc2V0Qnl0ZXNUb0xpc3QCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjRfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGY0XzICCQEFJGY0XzECCQEFJGY0XzECCQEFJGY0XzECCQEFJGY0XzECCQEFJGY0XzECCQEFJGY0XzECCQEFJGY0XzECCQEFJGY0XzECCQEFJGY0XzECCQEFJGY0XzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoEEWFzc2V0V2VpZ2h0c1N0ckxpCQC1CQIFD2Fzc2V0V2VpZ2h0c1N0cgIBLAQPYXNzZXRXZWlnaHRzU3VtCgACJGwFEWFzc2V0V2VpZ2h0c1N0ckxpCgACJHMJAJADAQUCJGwKAAUkYWNjMAAACgEFJGY1XzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQNzdW0CBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjVfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGY1XzICCQEFJGY1XzECCQEFJGY1XzECCQEFJGY1XzECCQEFJGY1XzECCQEFJGY1XzECCQEFJGY1XzECCQEFJGY1XzECCQEFJGY1XzECCQEFJGY1XzECCQEFJGY1XzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoKARNhZGRUb2tlbkRhdGFFbnRyaWVzAgVhY2N1bQhhc3NldE51bQMJAGcCBQhhc3NldE51bQkAkAMBBQphc3NldElkc0xpBQVhY2N1bQQNYXNzZXREZWNpbWFscwQHJG1hdGNoMAkAkQMCBQphc3NldElkc0xpBQhhc3NldE51bQMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAF4BQckbWF0Y2gwCAkBBXZhbHVlAQkA7AcBCQCRAwIFCmFzc2V0SWRzTGkFCGFzc2V0TnVtCGRlY2ltYWxzAAgJAM4IAgUFYWNjdW0JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICAgdzdGF0aWNfCQCRAwIFDWFzc2V0SWRzU3RyTGkFCGFzc2V0TnVtAgZfc2NhbGUJAGwGAAoAAAUNYXNzZXREZWNpbWFscwAAAAAFBERPV04JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICAgdzdGF0aWNfCQCRAwIFDWFzc2V0SWRzU3RyTGkFCGFzc2V0TnVtAglfZGVjaW1hbHMFDWFzc2V0RGVjaW1hbHMJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICAgdzdGF0aWNfCQCRAwIFDWFzc2V0SWRzU3RyTGkFCGFzc2V0TnVtAgdfd2VpZ2h0CQEFdmFsdWUBCQC2CQEJAJEDAgURYXNzZXRXZWlnaHRzU3RyTGkFCGFzc2V0TnVtBQNuaWwDCQECIT0CBQ9hc3NldFdlaWdodHNTdW0AZAkAAgECKXN1bSBvZiB0b2tlbiB3ZWlnaHRzIG11c3QgYmUgZXF1YWwgdG8gMTAwCQDOCAIKAAIkbAkAzAgCAAAJAMwIAgABCQDMCAIAAgUDbmlsCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGY2XzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJARNhZGRUb2tlbkRhdGFFbnRyaWVzAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGY2XzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmNl8yAgkBBSRmNl8xAgkBBSRmNl8xAgkBBSRmNl8xAgkBBSRmNl8xAgkBBSRmNl8xAgkBBSRmNl8xAgkBBSRmNl8xAgkBBSRmNl8xAgkBBSRmNl8xAgkBBSRmNl8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKCQDMCAIJAQtTdHJpbmdFbnRyeQICD3N0YXRpY190b2tlbklkcwULYXNzZXRJZHNTdHIJAMwIAgkBC1N0cmluZ0VudHJ5AgITc3RhdGljX3Rva2VuV2VpZ2h0cwUPYXNzZXRXZWlnaHRzU3RyCQDMCAIJAQxJbnRlZ2VyRW50cnkCAhNzdGF0aWNfdG9rZW5zQW1vdW50CQCQAwEFCmFzc2V0SWRzTGkJAMwIAgkBC1N0cmluZ0VudHJ5AgIRc3RhdGljX3Bvb2xEb21haW4FCnBvb2xEb21haW4JAMwIAgkBC1N0cmluZ0VudHJ5AgISc3RhdGljX2Jhc2VUb2tlbklkBQ5iYXNlVG9rZW5JZFN0cgkAzAgCCQEMSW50ZWdlckVudHJ5AgIKc3RhdGljX2ZlZQBkBQNuaWwBaQEEaW5pdAEGb3JhY2xlCgELcHJlcGFyZUxpc3QACgEHaGFuZGxlcgIFYWNjdW0BbgkAzggCBQVhY2N1bQkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgICB2dsb2JhbF8JAQ5nZXRBc3NldFN0cmluZwEIBQFuB2Fzc2V0SWQCCF9iYWxhbmNlCAUBbgZhbW91bnQFA25pbAoAAiRsCAUBaQhwYXltZW50cwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmNF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEHaGFuZGxlcgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmNF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjRfMgIJAQUkZjRfMQIJAQUkZjRfMQIJAQUkZjRfMQIJAQUkZjRfMQIJAQUkZjRfMQIJAQUkZjRfMQIJAQUkZjRfMQIJAQUkZjRfMQIJAQUkZjRfMQIJAQUkZjRfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgoBGWNhbGN1bGF0ZVBvb2xUb2tlbnNBbW91bnQBCHBheW1lbnRzCgEHaGFuZGxlcgIFYWNjdW0DcG10BAdhc3NldElkCAUDcG10B2Fzc2V0SWQKAQhoYW5kbGVyMgIFYWNjdW0BbgMJAAACBQFuBQdhc3NldElkCQEFdmFsdWUBCQDPCAIFCGFzc2V0SWRzBQFuBQVhY2N1bQQFVG9rZW4KAAIkbAUIYXNzZXRJZHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwAAEKAQUkZjRfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCGhhbmRsZXIyAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGY0XzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmNF8yAgkBBSRmNF8xAgkBBSRmNF8xAgkBBSRmNF8xAgkBBSRmNF8xAgkBBSRmNF8xAgkBBSRmNF8xAgkBBSRmNF8xAgkBBSRmNF8xAgkBBSRmNF8xAgkBBSRmNF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKCQBrAwUFYWNjdW0JAGwGCAUDcG10BmFtb3VudAkAkQMCBQhEZWNpbWFscwUFVG9rZW4JAJEDAgUNQXNzZXRzV2VpZ2h0cwUFVG9rZW4FFUFzc2V0c1dlaWdodHNEZWNpbWFscwAIBQVGTE9PUgUGU2NhbGU4CgACJGwFCHBheW1lbnRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAUOUG9vbFRva2VuU2NhbGUKAQUkZjRfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBB2hhbmRsZXICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjRfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGY0XzICCQEFJGY0XzECCQEFJGY0XzECCQEFJGY0XzECCQEFJGY0XzECCQEFJGY0XzECCQEFJGY0XzECCQEFJGY0XzECCQEFJGY0XzECCQEFJGY0XzECCQEFJGY0XzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoDCQBmAgkBDXRyeUdldEludGVnZXIBAhBnbG9iYWxfd2FzSW5pdGVkAAAJAAIBAhNwb29sIGFscmVhZHkgaW5pdGVkBBFpbml0aWFsUG9vbFRva2VucwkBGWNhbGN1bGF0ZVBvb2xUb2tlbnNBbW91bnQBCAUBaQhwYXltZW50cwMJAAACBRFpbml0aWFsUG9vbFRva2VucwAACQACAQIyeW91IG5lZWQgYSBiaWdnZXIgdG9rZW5zIGFtb3VudCB0byBsYXVuY2ggdGhlIHBvb2wEDnBvb2xUb2tlbklzc3VlCQDDCAcJAKwCAgIDV0QgCQEMdHJ5R2V0U3RyaW5nAQIRc3RhdGljX3Bvb2xEb21haW4CDVdEIHBvb2wgdG9rZW4FEWluaXRpYWxQb29sVG9rZW5zBRFQb29sVG9rZW5EZWNpbWFscwYFBHVuaXQAAAQLcG9vbFRva2VuSWQJALgIAQUOcG9vbFRva2VuSXNzdWUJAM4IAgkAzggCCQELcHJlcGFyZUxpc3QACQDMCAIFDnBvb2xUb2tlbklzc3VlCQDMCAIJAQxJbnRlZ2VyRW50cnkCAhdnbG9iYWxfcG9vbFRva2VuX2Ftb3VudAURaW5pdGlhbFBvb2xUb2tlbnMJAMwIAgkBDEludGVnZXJFbnRyeQICEGdsb2JhbF93YXNJbml0ZWQAAQkAzAgCCQELQmluYXJ5RW50cnkCAhNnbG9iYWxfcG9vbFRva2VuX2lkBQtwb29sVG9rZW5JZAkAzAgCCQELU3RyaW5nRW50cnkCAhZzdGF0aWNfcG9vbFRva2VuX2lkU3RyCQEOZ2V0QXNzZXRTdHJpbmcBBQtwb29sVG9rZW5JZAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFEWluaXRpYWxQb29sVG9rZW5zBQtwb29sVG9rZW5JZAUDbmlsCQEbc2V0T3JhY2xlQWRkcmVzc0FuZEluaXRpYXRlAQUGb3JhY2xlAWkBDWdlbmVyYXRlSW5kZXgBCm5lZWRDaGFuZ2UDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzBQFUCQACAQkArAICAjt5b3UgbmVlZCB0byBhdHRhY2ggYWxsIHBvb2wgdG9rZW5zLiBhbW91bnQgb2YgcG9vbCB0b2tlbnM6IAkApAMBBQFUAwkBASEBCQETY2hlY2tUb2tlbnNWYWxpZGl0eQEIBQFpCHBheW1lbnRzCQACAQIVd3JvbmcgYXNzZXRzIGF0dGFjaGVkBAdQSXNzdWVkCQENZ2V0TWluUElzc3VlZAEIBQFpCHBheW1lbnRzBAdyZWlzc3VlCQEHUmVpc3N1ZQMJARFAZXh0ck5hdGl2ZSgxMDU3KQECE2dsb2JhbF9wb29sVG9rZW5faWQFB1BJc3N1ZWQGBAZyZXN1bHQJARNoYW5kbGVQb29sVG9rZW5zQWRkBAUHUElzc3VlZAgFAWkIcGF5bWVudHMIBQFpDG9yaWdpbkNhbGxlcgUKbmVlZENoYW5nZQkAlAoCCQDOCAIFBnJlc3VsdAkAzAgCBQdyZWlzc3VlCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgUHUElzc3VlZAkBDHRyeUdldEJpbmFyeQECE2dsb2JhbF9wb29sVG9rZW5faWQJAMwIAgkBDEludGVnZXJFbnRyeQICF2dsb2JhbF9wb29sVG9rZW5fYW1vdW50CQBkAgkBDXRyeUdldEludGVnZXIBAhdnbG9iYWxfcG9vbFRva2VuX2Ftb3VudAUHUElzc3VlZAUDbmlsBQdQSXNzdWVkAWkBCnN0YWtlSW5kZXgABAphZGRyZXNzU3RyCQClCAEIBQFpDG9yaWdpbkNhbGxlcgQDcG10CQCRAwIIBQFpCHBheW1lbnRzAAADCQECIT0CCQEFdmFsdWUBCAUDcG10B2Fzc2V0SWQJAQx0cnlHZXRCaW5hcnkBAhNnbG9iYWxfcG9vbFRva2VuX2lkCQACAQIUd3JvbmcgYXNzZXQgYXR0YWNoZWQJARBpbmRleFN0YWtlUmVzdWx0AgUKYWRkcmVzc1N0cggFA3BtdAZhbW91bnQBaQEMdW5zdGFrZUluZGV4AQtzaGFyZUFtb3VudAQKYWRkcmVzc1N0cgkApQgBCAUBaQxvcmlnaW5DYWxsZXIEDnNoYXJlQXZhaWxhYmxlCQENdHJ5R2V0SW50ZWdlcgEJAKwCAgUKYWRkcmVzc1N0cgIMX2luZGV4U3Rha2VkAwkAZgIFC3NoYXJlQW1vdW50BQ5zaGFyZUF2YWlsYWJsZQkAAgECJXlvdSBkb24ndCBoYXZlIGluZGV4IHRva2VucyBhdmFpbGFibGUJAM4IAgkBC2NsYWltUmVzdWx0AQgFAWkMb3JpZ2luQ2FsbGVyCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCmFkZHJlc3NTdHICDF9pbmRleFN0YWtlZAkAZQIFDnNoYXJlQXZhaWxhYmxlBQtzaGFyZUFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgISZ2xvYmFsX2luZGV4U3Rha2VkCQBlAgkBDXRyeUdldEludGVnZXIBAhJnbG9iYWxfaW5kZXhTdGFrZWQFC3NoYXJlQW1vdW50CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgULc2hhcmVBbW91bnQJARFAZXh0ck5hdGl2ZSgxMDU3KQECE2dsb2JhbF9wb29sVG9rZW5faWQFA25pbAFpARFjbGFpbUluZGV4UmV3YXJkcwAJAQtjbGFpbVJlc3VsdAEIBQFpBmNhbGxlcgFpAQtyZWRlZW1JbmRleAEMc2VuZFRvT3JpZ2luBANwbXQJAJEDAggFAWkIcGF5bWVudHMAAAMJAQIhPQIIBQNwbXQHYXNzZXRJZAkBDHRyeUdldEJpbmFyeQECE2dsb2JhbF9wb29sVG9rZW5faWQJAAIBAh5wbGVhc2UgYXR0YWNoIHBvb2wgc2hhcmUgdG9rZW4ECVBSZWRlZW1lZAgFA3BtdAZhbW91bnQEBnJlc3VsdAkBFmhhbmRsZVBvb2xUb2tlbnNSZWRlZW0CBQlQUmVkZWVtZWQDBQxzZW5kVG9PcmlnaW4IBQFpDG9yaWdpbkNhbGxlcggFAWkGY2FsbGVyCQDOCAIFBnJlc3VsdAkAzAgCCQEEQnVybgIJAQx0cnlHZXRCaW5hcnkBAhNnbG9iYWxfcG9vbFRva2VuX2lkBQlQUmVkZWVtZWQJAMwIAgkBDEludGVnZXJFbnRyeQICF2dsb2JhbF9wb29sVG9rZW5fYW1vdW50CQBlAgkBDXRyeUdldEludGVnZXIBAhdnbG9iYWxfcG9vbFRva2VuX2Ftb3VudAUJUFJlZGVlbWVkBQNuaWwBaQEEc3dhcAIIYXNzZXRPdXQHbWluaW11bQMJAQppc1NodXRkb3duAAkAAgECGlBvb2wgaXMgY3VycmVudGx5IHNodXRkb3duBANwbXQJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAQIQW1vdW50SW4JAQV2YWx1ZQEICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BAdBc3NldEluCAUDcG10B2Fzc2V0SWQECmludm9rZVN3YXAJAQphc0ludFR1cGxlAQkA/QcEBQR0aGlzAgxzd2FwSW50ZXJuYWwJAMwIAgUIYXNzZXRPdXQJAMwIAgUHbWluaW11bQkAzAgCBQhBbW91bnRJbgkAzAgCCQEOZ2V0QXNzZXRTdHJpbmcBBQdBc3NldEluCQDMCAIJAKUIAQgFAWkGY2FsbGVyBQNuaWwFA25pbAMJAAACBQppbnZva2VTd2FwBQppbnZva2VTd2FwBA5jbGVhbkFtb3VudE91dAgFCmludm9rZVN3YXACXzEDCQAAAgUOY2xlYW5BbW91bnRPdXQFDmNsZWFuQW1vdW50T3V0BAlmZWVBbW91bnQIBQppbnZva2VTd2FwAl8yAwkAAAIFCWZlZUFtb3VudAUJZmVlQW1vdW50BA5mZWVzTWFuYWdlbWVudAMDCQEIYnVybkZlZXMACQECIT0CBQhhc3NldE91dAIFV0FWRVMHCQDMCAIJAQRCdXJuAgkBBXZhbHVlAQkBDWdldEFzc2V0Qnl0ZXMBBQhhc3NldE91dAkAawMFCWZlZUFtb3VudAACAAQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICAgdnbG9iYWxfBQhhc3NldE91dAIHX2J1cm5lZAkAZAIJAQ10cnlHZXRJbnRlZ2VyAQkArAICCQCsAgICB2dsb2JhbF8FCGFzc2V0T3V0AgdfYnVybmVkCQBrAwUJZmVlQW1vdW50AAIABAUDbmlsCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQ5nZXRGZWVzQWNjb3VudAAJAGsDBQlmZWVBbW91bnQAAgAECQENZ2V0QXNzZXRCeXRlcwEFCGFzc2V0T3V0BQNuaWwDCQAAAgUOZmVlc01hbmFnZW1lbnQFDmZlZXNNYW5hZ2VtZW50CQCUCgIFDmZlZXNNYW5hZ2VtZW50BQ5jbGVhbkFtb3VudE91dAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQhpbnRlcm5hbAMFc3Rha2UGYW1vdW50B2Fzc2V0SWQDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAgtOb3QgYWxsb3dlZAkBDHN0YWtlVW5zdGFrZQMFBXN0YWtlBQZhbW91bnQFB2Fzc2V0SWQBaQEIc3Rha2VBbGwACQEMc3Rha2VVbnN0YWtlAwYJAGUCCQENdHJ5R2V0SW50ZWdlcgECFGdsb2JhbF9XQVZFU19iYWxhbmNlCQENdHJ5R2V0SW50ZWdlcgECDmxlYXNpbmdfYW1vdW50AgVXQVZFUwFpAQxzd2FwSW50ZXJuYWwFCGFzc2V0T3V0B21pbmltdW0IQW1vdW50SW4HQXNzZXRJbgZjYWxsZXIDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAhtZb3UgY2FudCBjYWxsIHRoaXMgZGlyZWN0bHkECEFzc2V0T3V0CQENZ2V0QXNzZXRCeXRlcwEFCGFzc2V0T3V0BANkYXkJARdjYWxjdWxhdGVEYXlzU2luY2VTdGFydAAEB3JldmVuZXUJAQ10cnlHZXRJbnRlZ2VyAQkBF3JldmVuZXVGb3JEYXlCeUFzc2V0T3V0AgUDZGF5BQhhc3NldE91dAQOQXNzZXRJbkJhbGFuY2UJAQ10cnlHZXRJbnRlZ2VyAQkArAICCQCsAgICB2dsb2JhbF8FB0Fzc2V0SW4CCF9iYWxhbmNlAwkAAAIFDkFzc2V0SW5CYWxhbmNlBQ5Bc3NldEluQmFsYW5jZQQPQXNzZXRPdXRCYWxhbmNlCQENdHJ5R2V0SW50ZWdlcgEJAKwCAgkArAICAgdnbG9iYWxfBQhhc3NldE91dAIIX2JhbGFuY2UDCQAAAgUPQXNzZXRPdXRCYWxhbmNlBQ9Bc3NldE91dEJhbGFuY2UECUFtb3VudE91dAkBEmNhbGN1bGF0ZU91dEFtb3VudAUFCEFtb3VudEluCQENZ2V0QXNzZXRCeXRlcwEFB0Fzc2V0SW4FCEFzc2V0T3V0BQ5Bc3NldEluQmFsYW5jZQUPQXNzZXRPdXRCYWxhbmNlAwkAAAIFCUFtb3VudE91dAUJQW1vdW50T3V0BAlmZWVBbW91bnQJAGsDBQlBbW91bnRPdXQFA0ZlZQUIRmVlU2NhbGUDCQAAAgUJZmVlQW1vdW50BQlmZWVBbW91bnQEDmNsZWFuQW1vdW50T3V0CQBlAgUJQW1vdW50T3V0BQlmZWVBbW91bnQDCQAAAgUOY2xlYW5BbW91bnRPdXQFDmNsZWFuQW1vdW50T3V0AwkAZgIFB21pbmltdW0FDmNsZWFuQW1vdW50T3V0CQACAQkArAICAithbW91bnQgdG8gcmVjaWV2ZSBpcyBsb3dlciB0aGFuIGdpdmVuIG9uZTogCQCkAwEFDmNsZWFuQW1vdW50T3V0AwkAZgIAAAkAZQIFD0Fzc2V0T3V0QmFsYW5jZQUJQW1vdW50T3V0CQACAQIbY29udHJhY3QgaXMgb3V0IG9mIHJlc2VydmVzAwkAAAIFCEFzc2V0T3V0CQENZ2V0QXNzZXRCeXRlcwEFB0Fzc2V0SW4JAAIBAhh0aGlzIHN3YXAgaXMgbm90IGFsbG93ZWQECXZvbHVtZUtleQkBEHZvbHVtZUZvckRheUJ5SW4CBQNkYXkFB0Fzc2V0SW4EBnZvbHVtZQkBDXRyeUdldEludGVnZXIBBQl2b2x1bWVLZXkEDG5ld0JhbGFuY2VJbgkAZAIFDkFzc2V0SW5CYWxhbmNlBQhBbW91bnRJbgMJAAACBQxuZXdCYWxhbmNlSW4FDG5ld0JhbGFuY2VJbgQFc3Rha2UJAP0HBAUEdGhpcwIIaW50ZXJuYWwJAMwIAgYJAMwIAgUIQW1vdW50SW4JAMwIAgUHQXNzZXRJbgUDbmlsBQNuaWwDCQAAAgUFc3Rha2UFBXN0YWtlBA1uZXdCYWxhbmNlT3V0CQBlAgUPQXNzZXRPdXRCYWxhbmNlBQlBbW91bnRPdXQDCQAAAgUNbmV3QmFsYW5jZU91dAUNbmV3QmFsYW5jZU91dAQHdW5zdGFrZQkA/QcEBQR0aGlzAghpbnRlcm5hbAkAzAgCBwkAzAgCCQBkAgUOY2xlYW5BbW91bnRPdXQJAGsDBQlmZWVBbW91bnQAAwAECQDMCAIFCGFzc2V0T3V0BQNuaWwFA25pbAMJAAACBQd1bnN0YWtlBQd1bnN0YWtlCQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICAgdnbG9iYWxfBQhhc3NldE91dAIIX2JhbGFuY2UJAGQCBQ1uZXdCYWxhbmNlT3V0CQBrAwUJZmVlQW1vdW50AAEABAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQERQGV4dHJOYXRpdmUoMTA2MikBBQZjYWxsZXIFDmNsZWFuQW1vdW50T3V0BQhBc3NldE91dAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgICB2dsb2JhbF8FB0Fzc2V0SW4CCF9iYWxhbmNlBQxuZXdCYWxhbmNlSW4JAMwIAgkBDEludGVnZXJFbnRyeQICDmRheXNfc2luY2VfYXB5BQNkYXkJAMwIAgkBDEludGVnZXJFbnRyeQIJARdyZXZlbmV1Rm9yRGF5QnlBc3NldE91dAIFA2RheQUIYXNzZXRPdXQJAGQCBQdyZXZlbmV1BQlmZWVBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIFCXZvbHVtZUtleQkAZAIFBnZvbHVtZQUIQW1vdW50SW4FA25pbAkAlAoCBQ5jbGVhbkFtb3VudE91dAUJZmVlQW1vdW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQJ0eAEGdmVyaWZ5AAMJAQlpc1Rlc3RFbnYACQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACAUCdHgPc2VuZGVyUHVibGljS2V5BAlmaXJzdFVzZXIBIFEc5P1m/xJp0vFaFJ87suL0O3/By2gnojRebDjXV91tBApzZWNvbmRVc2VyASDBbN+O7dONc4+Lovn6iQ/0dc1EG1RyUqO0nNJWpC3gdQQJdGhpcmRVc2VyASDnW/SOqtL5SZ5uhCa4+X4f3GeofdwruNTqe83yaArBJQQPZmlyc3RVc2VyU2lnbmVkAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAUJZmlyc3RVc2VyAAEDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwABBQlmaXJzdFVzZXIAAQMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAIFCWZpcnN0VXNlcgABAAAEEHNlY29uZFVzZXJTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABQpzZWNvbmRVc2VyAAEDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwABBQpzZWNvbmRVc2VyAAEDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwACBQpzZWNvbmRVc2VyAAEAAAQPdGhpcmRVc2VyU2lnbmVkAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAUJdGhpcmRVc2VyAAEDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwABBQl0aGlyZFVzZXIAAQMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAIFCXRoaXJkVXNlcgABAAAED3NpZ25hdHVyZXNDb3VudAkAZAIJAGQCBQ9maXJzdFVzZXJTaWduZWQFEHNlY29uZFVzZXJTaWduZWQFD3RoaXJkVXNlclNpZ25lZAQHJG1hdGNoMAUCdHgJAGcCBQ9zaWduYXR1cmVzQ291bnQAAimwoPc=", "height": 4104937, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: none Next: 7Md7tcayQTQmGMyRgBqU72cW9Fpmq6rZHUj6Cu7jGfR3 Full:
OldNewDifferences
1-# no script
1+{-# STDLIB_VERSION 6 #-}
2+{-# SCRIPT_TYPE ACCOUNT #-}
3+{-# CONTENT_TYPE DAPP #-}
4+let startTsMs = 1711065540000
5+
6+func calculateDaysSinceStart () = {
7+ let diff = (lastBlock.timestamp - startTsMs)
8+ let daysPassed = (diff / (86400 * 1000))
9+ daysPassed
10+ }
11+
12+
13+func asIntTuple (value) = match value {
14+ case int: (Int, Int) =>
15+ int
16+ case _ =>
17+ throw("Wrong type, expected: Tuple Int")
18+}
19+
20+
21+func getOracleAddress () = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(this, "static_oracle"), "oracle not found!")), "could not parse oracle")
22+
23+
24+func getFeesAccount () = addressFromStringValue(valueOrErrorMessage(getString(getOracleAddress(), "static_feeAggregator"), "static_feeAggregator not found!"))
25+
26+
27+func getNodeAccount () = addressFromStringValue(valueOrErrorMessage(getString(getOracleAddress(), "static_nodeAddress"), "node_address not found!"))
28+
29+
30+func tryGetInteger (key) = match getInteger(this, key) {
31+ case b: Int =>
32+ b
33+ case _ =>
34+ 0
35+}
36+
37+
38+func tryGetBinary (key) = match getBinary(this, key) {
39+ case b: ByteVector =>
40+ b
41+ case _ =>
42+ base58''
43+}
44+
45+
46+func tryGetString (key) = match getString(this, key) {
47+ case b: String =>
48+ b
49+ case _ =>
50+ ""
51+}
52+
53+
54+func getAssetString (assetId) = match assetId {
55+ case b: ByteVector =>
56+ toBase58String(b)
57+ case _ =>
58+ "WAVES"
59+}
60+
61+
62+func getAssetBytes (assetIdStr) = if ((assetIdStr == "WAVES"))
63+ then unit
64+ else fromBase58String(assetIdStr)
65+
66+
67+func addAssetBytesToList (accum,item) = (accum ++ [getAssetBytes(item)])
68+
69+
70+func addAssetWeightToList (accum,item) = (accum ++ [tryGetInteger((("static_" + getAssetString(item)) + "_weight"))])
71+
72+
73+func addAssetDecimalsToList (accum,item) = (accum ++ [tryGetInteger((("static_" + getAssetString(item)) + "_decimals"))])
74+
75+
76+func addAssetScaleToList (accum,item) = (accum ++ [tryGetInteger((("static_" + getAssetString(item)) + "_scale"))])
77+
78+
79+func addIntToList (accum,item) = (accum ++ [parseIntValue(item)])
80+
81+
82+func reveneuForDayByAssetOut (day,assetId) = ((("reveneu_day_" + assetId) + "_") + toString(day))
83+
84+
85+func volumeForDayByIn (day,assetId) = ((("volume_day_" + assetId) + "_") + toString(day))
86+
87+
88+let T = tryGetInteger("static_tokensAmount")
89+
90+let assetIds = {
91+ let $l = split(tryGetString("static_tokenIds"), ",")
92+ let $s = size($l)
93+ let $acc0 = nil
94+ func $f0_1 ($a,$i) = if (($i >= $s))
95+ then $a
96+ else addAssetBytesToList($a, $l[$i])
97+
98+ func $f0_2 ($a,$i) = if (($i >= $s))
99+ then $a
100+ else throw("List size exceeds 10")
101+
102+ $f0_2($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)
103+ }
104+
105+let AssetsWeights = {
106+ let $l = assetIds
107+ let $s = size($l)
108+ let $acc0 = nil
109+ func $f1_1 ($a,$i) = if (($i >= $s))
110+ then $a
111+ else addAssetWeightToList($a, $l[$i])
112+
113+ func $f1_2 ($a,$i) = if (($i >= $s))
114+ then $a
115+ else throw("List size exceeds 10")
116+
117+ $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
118+ }
119+
120+let Decimals = {
121+ let $l = assetIds
122+ let $s = size($l)
123+ let $acc0 = nil
124+ func $f2_1 ($a,$i) = if (($i >= $s))
125+ then $a
126+ else addAssetDecimalsToList($a, $l[$i])
127+
128+ func $f2_2 ($a,$i) = if (($i >= $s))
129+ then $a
130+ else throw("List size exceeds 10")
131+
132+ $f2_2($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
133+ }
134+
135+let Scales = {
136+ let $l = assetIds
137+ let $s = size($l)
138+ let $acc0 = nil
139+ func $f3_1 ($a,$i) = if (($i >= $s))
140+ then $a
141+ else addAssetScaleToList($a, $l[$i])
142+
143+ func $f3_2 ($a,$i) = if (($i >= $s))
144+ then $a
145+ else throw("List size exceeds 10")
146+
147+ $f3_2($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
148+ }
149+
150+let stakeId = tryGetString("last_stake_id")
151+
152+let Fee = tryGetInteger("static_fee")
153+
154+let AssetsWeightsDecimals = 2
155+
156+let Scale = 10000
157+
158+let Scale8 = 100000000
159+
160+let FeeScale = 10000
161+
162+let PoolTokenDecimals = 8
163+
164+let PoolTokenScale = pow(10, 0, PoolTokenDecimals, 0, 0, HALFUP)
165+
166+let earnedAssets = assetIds
167+
168+func burnFees () = if ((tryGetString("static_oracle") != ""))
169+ then match getBoolean(getOracleAddress(), ("amm_burn_" + toString(this))) {
170+ case x: Boolean =>
171+ x
172+ case _ =>
173+ false
174+ }
175+ else false
176+
177+
178+func isShutdown () = {
179+ let shutdown = if ((tryGetString("static_oracle") != ""))
180+ then match getBoolean(getOracleAddress(), "amm_shutdown") {
181+ case x: Boolean =>
182+ x
183+ case _ =>
184+ false
185+ }
186+ else false
187+ let shutdown2 = match getBoolean(this, "is_shutdown") {
188+ case x: Boolean =>
189+ x
190+ case _ =>
191+ false
192+ }
193+ if (shutdown)
194+ then true
195+ else shutdown2
196+ }
197+
198+
199+func canUpdate () = if ((tryGetString("static_oracle") != ""))
200+ then match getBoolean(getOracleAddress(), "amm_tx") {
201+ case x: Boolean =>
202+ x
203+ case _ =>
204+ true
205+ }
206+ else true
207+
208+
209+func getCurrentTokenBalance (tokenType) = {
210+ let tokenId = getAssetString(assetIds[tokenType])
211+ tryGetInteger((("global_" + tokenId) + "_balance"))
212+ }
213+
214+
215+func calculatePIssued (amount,tokenId) = {
216+ let Psupply = tryGetInteger("global_poolToken_amount")
217+ let Balance = tryGetInteger((("global_" + getAssetString(tokenId)) + "_balance"))
218+ fraction(amount, Psupply, Balance, DOWN)
219+ }
220+
221+
222+func getMinPIssued (payments) = {
223+ func handler (accum,current) = {
224+ let PIssued = calculatePIssued(current.amount, current.assetId)
225+ if ((PIssued == 0))
226+ then throw("one of the tokens amounts is too low")
227+ else if (if ((accum == 0))
228+ then true
229+ else (accum > PIssued))
230+ then PIssued
231+ else accum
232+ }
233+
234+ let minPIssed = {
235+ let $l = payments
236+ let $s = size($l)
237+ let $acc0 = 0
238+ func $f4_1 ($a,$i) = if (($i >= $s))
239+ then $a
240+ else handler($a, $l[$i])
241+
242+ func $f4_2 ($a,$i) = if (($i >= $s))
243+ then $a
244+ else throw("List size exceeds 10")
245+
246+ $f4_2($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
247+ }
248+ minPIssed
249+ }
250+
251+
252+func checkTokensValidity (payments) = {
253+ func handler1 (accum,payment) = (accum ++ [payment.assetId])
254+
255+ let ids = {
256+ let $l = payments
257+ let $s = size($l)
258+ let $acc0 = nil
259+ func $f4_1 ($a,$i) = if (($i >= $s))
260+ then $a
261+ else handler1($a, $l[$i])
262+
263+ func $f4_2 ($a,$i) = if (($i >= $s))
264+ then $a
265+ else throw("List size exceeds 10")
266+
267+ $f4_2($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
268+ }
269+ if ((ids == ids))
270+ then {
271+ func handler2 (accum,assetId) = if ((indexOf(ids, assetId) != unit))
272+ then (accum + 1)
273+ else throw(("asset not attached: " + getAssetString(assetId)))
274+
275+ let checks = {
276+ let $l = assetIds
277+ let $s = size($l)
278+ let $acc0 = 0
279+ func $f5_1 ($a,$i) = if (($i >= $s))
280+ then $a
281+ else handler2($a, $l[$i])
282+
283+ func $f5_2 ($a,$i) = if (($i >= $s))
284+ then $a
285+ else throw("List size exceeds 10")
286+
287+ $f5_2($f5_1($f5_1($f5_1($f5_1($f5_1($f5_1($f5_1($f5_1($f5_1($f5_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
288+ }
289+ if ((checks == checks))
290+ then true
291+ else throw("Strict value is not equal to itself.")
292+ }
293+ else throw("Strict value is not equal to itself.")
294+ }
295+
296+
297+func stakeUnstake (stake,amount,assetId) = if (if ((assetId == "WAVES"))
298+ then (amount > 0)
299+ else false)
300+ then {
301+ let leasingAmount = valueOrElse(getInteger(this, "leasing_amount"), 0)
302+ let newLeaseAmount = if (stake)
303+ then (leasingAmount + amount)
304+ else (leasingAmount - amount)
305+ let newLease = Lease(getNodeAccount(), newLeaseAmount)
306+ let newLeaseId = calculateLeaseId(newLease)
307+ let data = [newLease, StringEntry("last_stake_id", toBase58String(newLeaseId)), IntegerEntry("leasing_amount", newLeaseAmount)]
308+ if ((stakeId != ""))
309+ then ([LeaseCancel(fromBase58String(stakeId))] ++ data)
310+ else data
311+ }
312+ else nil
313+
314+
315+func handlePoolTokensAdd (PIssued,payments,userAddress,needChange) = {
316+ func getTokenPaymentAmount (tokenId) = {
317+ func handler (accum,payment) = if ((payment.assetId == tokenId))
318+ then payment.amount
319+ else accum
320+
321+ let $l = payments
322+ let $s = size($l)
323+ let $acc0 = 0
324+ func $f4_1 ($a,$i) = if (($i >= $s))
325+ then $a
326+ else handler($a, $l[$i])
327+
328+ func $f4_2 ($a,$i) = if (($i >= $s))
329+ then $a
330+ else throw("List size exceeds 10")
331+
332+ $f4_2($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
333+ }
334+
335+ func handleTokenChange (accum,tokenId) = {
336+ let Bk = tryGetInteger((("global_" + getAssetString(tokenId)) + "_balance"))
337+ let PSupply = tryGetInteger("global_poolToken_amount")
338+ let tokenDecimals = tryGetInteger((("static_" + getAssetString(tokenId)) + "_scale"))
339+ let DkTemp = fraction((fraction((PSupply + PIssued), tokenDecimals, PSupply, CEILING) - tokenDecimals), Bk, tokenDecimals, CEILING)
340+ let paymentAmount = getTokenPaymentAmount(tokenId)
341+ let Dk = min([DkTemp, paymentAmount])
342+ let toReturn = ((if ((paymentAmount != 0))
343+ then paymentAmount
344+ else 0) - Dk)
345+ let t = if (if (needChange)
346+ then (toReturn > 0)
347+ else false)
348+ then [ScriptTransfer(userAddress, toReturn, tokenId)]
349+ else nil
350+ let stakeUnstakeData = if ((getAssetString(tokenId) == "WAVES"))
351+ then stakeUnstake(true, Dk, "WAVES")
352+ else nil
353+ (((accum ++ t) ++ stakeUnstakeData) ++ [IntegerEntry((("global_" + getAssetString(tokenId)) + "_balance"), (Bk + Dk))])
354+ }
355+
356+ let $l = assetIds
357+ let $s = size($l)
358+ let $acc0 = nil
359+ func $f4_1 ($a,$i) = if (($i >= $s))
360+ then $a
361+ else handleTokenChange($a, $l[$i])
362+
363+ func $f4_2 ($a,$i) = if (($i >= $s))
364+ then $a
365+ else throw("List size exceeds 10")
366+
367+ $f4_2($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
368+ }
369+
370+
371+func handlePoolTokensRedeem (PRedeemed,userAddress) = {
372+ func handleTokenRedeem (accum,tokenId) = {
373+ let Bk = tryGetInteger((("global_" + getAssetString(tokenId)) + "_balance"))
374+ let PSupply = tryGetInteger("global_poolToken_amount")
375+ let tokenDecimals = tryGetInteger((("static_" + getAssetString(tokenId)) + "_scale"))
376+ let amount = toInt(fraction((toBigInt(Scale8) - fraction(toBigInt((PSupply - PRedeemed)), toBigInt(Scale8), toBigInt(PSupply), CEILING)), toBigInt(Bk), toBigInt(Scale8), DOWN))
377+ let stakeUnstakeData = if ((getAssetString(tokenId) == "WAVES"))
378+ then stakeUnstake(false, amount, "WAVES")
379+ else nil
380+ ((accum ++ stakeUnstakeData) ++ [IntegerEntry((("global_" + getAssetString(tokenId)) + "_balance"), (Bk - amount)), ScriptTransfer(userAddress, amount, tokenId)])
381+ }
382+
383+ let $l = assetIds
384+ let $s = size($l)
385+ let $acc0 = nil
386+ func $f4_1 ($a,$i) = if (($i >= $s))
387+ then $a
388+ else handleTokenRedeem($a, $l[$i])
389+
390+ func $f4_2 ($a,$i) = if (($i >= $s))
391+ then $a
392+ else throw("List size exceeds 10")
393+
394+ $f4_2($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
395+ }
396+
397+
398+func calculateOutAmount (AmountIn,assetIn,assetOut,BalanceIn,BalanceOut) = {
399+ let IndexIn = value(indexOf(assetIds, assetIn))
400+ let IndexOut = value(indexOf(assetIds, assetOut))
401+ if ((IndexIn == IndexOut))
402+ then throw("wrong tokens pair")
403+ else fraction(BalanceOut, ((Scale8 * Scale8) - toInt(pow(fraction(toBigInt(BalanceIn), toBigInt((Scale8 * Scale8)), toBigInt((BalanceIn + AmountIn)), HALFUP), 16, toBigInt(fraction(AssetsWeights[IndexIn], 10000, AssetsWeights[IndexOut])), 4, 16, CEILING))), (Scale8 * Scale8), DOWN)
404+ }
405+
406+
407+func calculateMinToGet (asset1,asset2,amountToSwap) = {
408+ let kBalanceA = (("global_" + asset1) + "_balance")
409+ let A_asset_balance = getIntegerValue(this, kBalanceA)
410+ let kBalanceB = (("global_" + asset2) + "_balance")
411+ let B_asset_balance = getIntegerValue(this, kBalanceB)
412+ let toGet = calculateOutAmount(amountToSwap, getAssetBytes(asset1), getAssetBytes(asset2), A_asset_balance, B_asset_balance)
413+ let feeAmount = fraction(toGet, Fee, FeeScale)
414+ if ((feeAmount == feeAmount))
415+ then {
416+ let cleanAmountOut = (toGet - feeAmount)
417+ if ((cleanAmountOut == cleanAmountOut))
418+ then cleanAmountOut
419+ else throw("Strict value is not equal to itself.")
420+ }
421+ else throw("Strict value is not equal to itself.")
422+ }
423+
424+
425+func getTokenBalance (assetId) = match assetId {
426+ case t: ByteVector =>
427+ assetBalance(this, t)
428+ case _ =>
429+ wavesBalance(this).regular
430+}
431+
432+
433+func calculateCurrentAssetInterest (assetId,assetIdStr,aBalance,tokenEarningsLastCheck) = {
434+ let totalStaked = tryGetInteger("global_indexStaked")
435+ let tokenBalanceLastCheck = tokenEarningsLastCheck
436+ let currentBalanceDelta = (getTokenBalance(assetId) - aBalance)
437+ let currentTokenEarnings = if ((currentBalanceDelta > tokenBalanceLastCheck))
438+ then currentBalanceDelta
439+ else tokenBalanceLastCheck
440+ let newEarnings = (currentTokenEarnings - tokenBalanceLastCheck)
441+ let newInterest = if ((totalStaked == 0))
442+ then 0
443+ else fraction(newEarnings, Scale8, totalStaked)
444+ let lastCheckInterest = tryGetInteger((("global_lastCheck_" + assetIdStr) + "_interest"))
445+ (lastCheckInterest + newInterest)
446+ }
447+
448+
449+func claimResult (address) = {
450+ let addressStr = toString(address)
451+ let shareAmount = tryGetInteger((addressStr + "_indexStaked"))
452+ func handler (accum,assetId) = {
453+ let assetIdStr = getAssetString(assetId)
454+ let aBalance = tryGetInteger((("global_" + getAssetString(assetId)) + "_balance"))
455+ let tokenEarningsLastCheck = tryGetInteger((("global_lastCheck_" + assetIdStr) + "_earnings"))
456+ let currentTokenInterest = calculateCurrentAssetInterest(assetId, assetIdStr, aBalance, tokenEarningsLastCheck)
457+ let currentTokenEarnings = max([tokenEarningsLastCheck, (getTokenBalance(assetId) - aBalance)])
458+ let rewardAmount = fraction(shareAmount, (currentTokenInterest - tryGetInteger((((addressStr + "_lastCheck_") + assetIdStr) + "_interest"))), Scale8)
459+ let transfer = if ((rewardAmount == 0))
460+ then nil
461+ else [ScriptTransfer(address, rewardAmount, assetId)]
462+ let claimed = tryGetInteger((((addressStr + "_lastCheck_") + assetIdStr) + "_claimed"))
463+ ((accum ++ transfer) ++ [IntegerEntry((("global_lastCheck_" + assetIdStr) + "_earnings"), (currentTokenEarnings - rewardAmount)), IntegerEntry((("global_lastCheck_" + assetIdStr) + "_interest"), currentTokenInterest), IntegerEntry((((addressStr + "_lastCheck_") + assetIdStr) + "_interest"), currentTokenInterest), IntegerEntry((((addressStr + "_lastCheck_") + assetIdStr) + "_claimed"), (claimed + rewardAmount))])
464+ }
465+
466+ let accum = {
467+ let $l = earnedAssets
468+ let $s = size($l)
469+ let $acc0 = nil
470+ func $f4_1 ($a,$i) = if (($i >= $s))
471+ then $a
472+ else handler($a, $l[$i])
473+
474+ func $f4_2 ($a,$i) = if (($i >= $s))
475+ then $a
476+ else throw("List size exceeds 10")
477+
478+ $f4_2($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
479+ }
480+ (accum ++ [IntegerEntry((addressStr + "_lastClaim"), lastBlock.timestamp)])
481+ }
482+
483+
484+func indexStakeResult (addressStr,amount) = {
485+ let li = claimResult(addressFromStringValue(addressStr))
486+ (li ++ [IntegerEntry((addressStr + "_indexStaked"), (tryGetInteger((addressStr + "_indexStaked")) + amount)), IntegerEntry("global_indexStaked", (tryGetInteger("global_indexStaked") + amount))])
487+ }
488+
489+
490+func sum (accum,n) = (accum + parseIntValue(n))
491+
492+
493+func setOracleAddressAndInitiate (address) = [StringEntry("static_oracle", address)]
494+
495+
496+func isTestEnv () = {
497+ let testenv = match getBoolean(this, "TESTENV") {
498+ case x: Boolean =>
499+ x
500+ case _ =>
501+ false
502+ }
503+ testenv
504+ }
505+
506+
507+@Callable(i)
508+func readOnlyFunc (asset1,asset2,amountToSwap) = {
509+ let amountOut = calculateMinToGet(asset1, asset2, amountToSwap)
510+[IntegerEntry("DEBUG", amountOut)]
511+ }
512+
513+
514+
515+@Callable(i)
516+func topUpFunds () = if ((size(i.payments) != 1))
517+ then throw("Wrong payments attached!")
518+ else {
519+ let payment = i.payments[0]
520+ let asset = payment.assetId
521+ if ((indexOf(assetIds, asset) == unit))
522+ then throw("Not supported assetId")
523+ else {
524+ let amount = payment.amount
525+ let aBalance = tryGetInteger((("global_" + getAssetString(asset)) + "_balance"))
526+ let day = calculateDaysSinceStart()
527+ let reveneu = tryGetInteger(reveneuForDayByAssetOut(day, getAssetString(asset)))
528+[IntegerEntry((("global_" + getAssetString(asset)) + "_balance"), (aBalance + amount)), IntegerEntry("days_since_apy", day), IntegerEntry(reveneuForDayByAssetOut(day, getAssetString(asset)), (reveneu + amount))]
529+ }
530+ }
531+
532+
533+
534+@Callable(i)
535+func preInit (assetIdsStr,assetWeightsStr,baseTokenIdStr,poolDomain) = if ((this != i.caller))
536+ then throw("admin only")
537+ else if ((size(poolDomain) > 13))
538+ then throw("too large pool domain")
539+ else {
540+ let assetIdsStrLi = split(assetIdsStr, ",")
541+ let assetIdsLi = {
542+ let $l = assetIdsStrLi
543+ let $s = size($l)
544+ let $acc0 = nil
545+ func $f4_1 ($a,$i) = if (($i >= $s))
546+ then $a
547+ else addAssetBytesToList($a, $l[$i])
548+
549+ func $f4_2 ($a,$i) = if (($i >= $s))
550+ then $a
551+ else throw("List size exceeds 10")
552+
553+ $f4_2($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
554+ }
555+ let assetWeightsStrLi = split(assetWeightsStr, ",")
556+ let assetWeightsSum = {
557+ let $l = assetWeightsStrLi
558+ let $s = size($l)
559+ let $acc0 = 0
560+ func $f5_1 ($a,$i) = if (($i >= $s))
561+ then $a
562+ else sum($a, $l[$i])
563+
564+ func $f5_2 ($a,$i) = if (($i >= $s))
565+ then $a
566+ else throw("List size exceeds 10")
567+
568+ $f5_2($f5_1($f5_1($f5_1($f5_1($f5_1($f5_1($f5_1($f5_1($f5_1($f5_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
569+ }
570+ func addTokenDataEntries (accum,assetNum) = if ((assetNum >= size(assetIdsLi)))
571+ then accum
572+ else {
573+ let assetDecimals = match assetIdsLi[assetNum] {
574+ case x: ByteVector =>
575+ value(assetInfo(assetIdsLi[assetNum])).decimals
576+ case _ =>
577+ 8
578+ }
579+ (accum ++ [IntegerEntry((("static_" + assetIdsStrLi[assetNum]) + "_scale"), pow(10, 0, assetDecimals, 0, 0, DOWN)), IntegerEntry((("static_" + assetIdsStrLi[assetNum]) + "_decimals"), assetDecimals), IntegerEntry((("static_" + assetIdsStrLi[assetNum]) + "_weight"), value(parseInt(assetWeightsStrLi[assetNum])))])
580+ }
581+
582+ if ((assetWeightsSum != 100))
583+ then throw("sum of token weights must be equal to 100")
584+ else ({
585+ let $l = [0, 1, 2]
586+ let $s = size($l)
587+ let $acc0 = nil
588+ func $f6_1 ($a,$i) = if (($i >= $s))
589+ then $a
590+ else addTokenDataEntries($a, $l[$i])
591+
592+ func $f6_2 ($a,$i) = if (($i >= $s))
593+ then $a
594+ else throw("List size exceeds 10")
595+
596+ $f6_2($f6_1($f6_1($f6_1($f6_1($f6_1($f6_1($f6_1($f6_1($f6_1($f6_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
597+ } ++ [StringEntry("static_tokenIds", assetIdsStr), StringEntry("static_tokenWeights", assetWeightsStr), IntegerEntry("static_tokensAmount", size(assetIdsLi)), StringEntry("static_poolDomain", poolDomain), StringEntry("static_baseTokenId", baseTokenIdStr), IntegerEntry("static_fee", 100)])
598+ }
599+
600+
601+
602+@Callable(i)
603+func init (oracle) = {
604+ func prepareList () = {
605+ func handler (accum,n) = (accum ++ [IntegerEntry((("global_" + getAssetString(n.assetId)) + "_balance"), n.amount)])
606+
607+ let $l = i.payments
608+ let $s = size($l)
609+ let $acc0 = nil
610+ func $f4_1 ($a,$i) = if (($i >= $s))
611+ then $a
612+ else handler($a, $l[$i])
613+
614+ func $f4_2 ($a,$i) = if (($i >= $s))
615+ then $a
616+ else throw("List size exceeds 10")
617+
618+ $f4_2($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
619+ }
620+
621+ func calculatePoolTokensAmount (payments) = {
622+ func handler (accum,pmt) = {
623+ let assetId = pmt.assetId
624+ func handler2 (accum,n) = if ((n == assetId))
625+ then value(indexOf(assetIds, n))
626+ else accum
627+
628+ let Token = {
629+ let $l = assetIds
630+ let $s = size($l)
631+ let $acc0 = 1
632+ func $f4_1 ($a,$i) = if (($i >= $s))
633+ then $a
634+ else handler2($a, $l[$i])
635+
636+ func $f4_2 ($a,$i) = if (($i >= $s))
637+ then $a
638+ else throw("List size exceeds 10")
639+
640+ $f4_2($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
641+ }
642+ fraction(accum, pow(pmt.amount, Decimals[Token], AssetsWeights[Token], AssetsWeightsDecimals, 8, FLOOR), Scale8)
643+ }
644+
645+ let $l = payments
646+ let $s = size($l)
647+ let $acc0 = PoolTokenScale
648+ func $f4_1 ($a,$i) = if (($i >= $s))
649+ then $a
650+ else handler($a, $l[$i])
651+
652+ func $f4_2 ($a,$i) = if (($i >= $s))
653+ then $a
654+ else throw("List size exceeds 10")
655+
656+ $f4_2($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($f4_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
657+ }
658+
659+ if ((tryGetInteger("global_wasInited") > 0))
660+ then throw("pool already inited")
661+ else {
662+ let initialPoolTokens = calculatePoolTokensAmount(i.payments)
663+ if ((initialPoolTokens == 0))
664+ then throw("you need a bigger tokens amount to launch the pool")
665+ else {
666+ let poolTokenIssue = Issue(("WD " + tryGetString("static_poolDomain")), "WD pool token", initialPoolTokens, PoolTokenDecimals, true, unit, 0)
667+ let poolTokenId = calculateAssetId(poolTokenIssue)
668+ ((prepareList() ++ [poolTokenIssue, IntegerEntry("global_poolToken_amount", initialPoolTokens), IntegerEntry("global_wasInited", 1), BinaryEntry("global_poolToken_id", poolTokenId), StringEntry("static_poolToken_idStr", getAssetString(poolTokenId)), ScriptTransfer(i.caller, initialPoolTokens, poolTokenId)]) ++ setOracleAddressAndInitiate(oracle))
669+ }
670+ }
671+ }
672+
673+
674+
675+@Callable(i)
676+func generateIndex (needChange) = if ((size(i.payments) != T))
677+ then throw(("you need to attach all pool tokens. amount of pool tokens: " + toString(T)))
678+ else if (!(checkTokensValidity(i.payments)))
679+ then throw("wrong assets attached")
680+ else {
681+ let PIssued = getMinPIssued(i.payments)
682+ let reissue = Reissue(getBinaryValue("global_poolToken_id"), PIssued, true)
683+ let result = handlePoolTokensAdd(PIssued, i.payments, i.originCaller, needChange)
684+ $Tuple2((result ++ [reissue, ScriptTransfer(i.caller, PIssued, tryGetBinary("global_poolToken_id")), IntegerEntry("global_poolToken_amount", (tryGetInteger("global_poolToken_amount") + PIssued))]), PIssued)
685+ }
686+
687+
688+
689+@Callable(i)
690+func stakeIndex () = {
691+ let addressStr = toString(i.originCaller)
692+ let pmt = i.payments[0]
693+ if ((value(pmt.assetId) != tryGetBinary("global_poolToken_id")))
694+ then throw("wrong asset attached")
695+ else indexStakeResult(addressStr, pmt.amount)
696+ }
697+
698+
699+
700+@Callable(i)
701+func unstakeIndex (shareAmount) = {
702+ let addressStr = toString(i.originCaller)
703+ let shareAvailable = tryGetInteger((addressStr + "_indexStaked"))
704+ if ((shareAmount > shareAvailable))
705+ then throw("you don't have index tokens available")
706+ else (claimResult(i.originCaller) ++ [IntegerEntry((addressStr + "_indexStaked"), (shareAvailable - shareAmount)), IntegerEntry("global_indexStaked", (tryGetInteger("global_indexStaked") - shareAmount)), ScriptTransfer(i.caller, shareAmount, getBinaryValue("global_poolToken_id"))])
707+ }
708+
709+
710+
711+@Callable(i)
712+func claimIndexRewards () = claimResult(i.caller)
713+
714+
715+
716+@Callable(i)
717+func redeemIndex (sendToOrigin) = {
718+ let pmt = i.payments[0]
719+ if ((pmt.assetId != tryGetBinary("global_poolToken_id")))
720+ then throw("please attach pool share token")
721+ else {
722+ let PRedeemed = pmt.amount
723+ let result = handlePoolTokensRedeem(PRedeemed, if (sendToOrigin)
724+ then i.originCaller
725+ else i.caller)
726+ (result ++ [Burn(tryGetBinary("global_poolToken_id"), PRedeemed), IntegerEntry("global_poolToken_amount", (tryGetInteger("global_poolToken_amount") - PRedeemed))])
727+ }
728+ }
729+
730+
731+
732+@Callable(i)
733+func swap (assetOut,minimum) = if (isShutdown())
734+ then throw("Pool is currently shutdown")
735+ else {
736+ let pmt = value(i.payments[0])
737+ let AmountIn = value(i.payments[0].amount)
738+ let AssetIn = pmt.assetId
739+ let invokeSwap = asIntTuple(reentrantInvoke(this, "swapInternal", [assetOut, minimum, AmountIn, getAssetString(AssetIn), toString(i.caller)], nil))
740+ if ((invokeSwap == invokeSwap))
741+ then {
742+ let cleanAmountOut = invokeSwap._1
743+ if ((cleanAmountOut == cleanAmountOut))
744+ then {
745+ let feeAmount = invokeSwap._2
746+ if ((feeAmount == feeAmount))
747+ then {
748+ let feesManagement = if (if (burnFees())
749+ then (assetOut != "WAVES")
750+ else false)
751+ then [Burn(value(getAssetBytes(assetOut)), fraction(feeAmount, 2, 4)), IntegerEntry((("global_" + assetOut) + "_burned"), (tryGetInteger((("global_" + assetOut) + "_burned")) + fraction(feeAmount, 2, 4)))]
752+ else [ScriptTransfer(getFeesAccount(), fraction(feeAmount, 2, 4), getAssetBytes(assetOut))]
753+ if ((feesManagement == feesManagement))
754+ then $Tuple2(feesManagement, cleanAmountOut)
755+ else throw("Strict value is not equal to itself.")
756+ }
757+ else throw("Strict value is not equal to itself.")
758+ }
759+ else throw("Strict value is not equal to itself.")
760+ }
761+ else throw("Strict value is not equal to itself.")
762+ }
763+
764+
765+
766+@Callable(i)
767+func internal (stake,amount,assetId) = if ((i.caller != this))
768+ then throw("Not allowed")
769+ else stakeUnstake(stake, amount, assetId)
770+
771+
772+
773+@Callable(i)
774+func stakeAll () = stakeUnstake(true, (tryGetInteger("global_WAVES_balance") - tryGetInteger("leasing_amount")), "WAVES")
775+
776+
777+
778+@Callable(i)
779+func swapInternal (assetOut,minimum,AmountIn,AssetIn,caller) = if ((i.caller != this))
780+ then throw("You cant call this directly")
781+ else {
782+ let AssetOut = getAssetBytes(assetOut)
783+ let day = calculateDaysSinceStart()
784+ let reveneu = tryGetInteger(reveneuForDayByAssetOut(day, assetOut))
785+ let AssetInBalance = tryGetInteger((("global_" + AssetIn) + "_balance"))
786+ if ((AssetInBalance == AssetInBalance))
787+ then {
788+ let AssetOutBalance = tryGetInteger((("global_" + assetOut) + "_balance"))
789+ if ((AssetOutBalance == AssetOutBalance))
790+ then {
791+ let AmountOut = calculateOutAmount(AmountIn, getAssetBytes(AssetIn), AssetOut, AssetInBalance, AssetOutBalance)
792+ if ((AmountOut == AmountOut))
793+ then {
794+ let feeAmount = fraction(AmountOut, Fee, FeeScale)
795+ if ((feeAmount == feeAmount))
796+ then {
797+ let cleanAmountOut = (AmountOut - feeAmount)
798+ if ((cleanAmountOut == cleanAmountOut))
799+ then if ((minimum > cleanAmountOut))
800+ then throw(("amount to recieve is lower than given one: " + toString(cleanAmountOut)))
801+ else if ((0 > (AssetOutBalance - AmountOut)))
802+ then throw("contract is out of reserves")
803+ else if ((AssetOut == getAssetBytes(AssetIn)))
804+ then throw("this swap is not allowed")
805+ else {
806+ let volumeKey = volumeForDayByIn(day, AssetIn)
807+ let volume = tryGetInteger(volumeKey)
808+ let newBalanceIn = (AssetInBalance + AmountIn)
809+ if ((newBalanceIn == newBalanceIn))
810+ then {
811+ let stake = reentrantInvoke(this, "internal", [true, AmountIn, AssetIn], nil)
812+ if ((stake == stake))
813+ then {
814+ let newBalanceOut = (AssetOutBalance - AmountOut)
815+ if ((newBalanceOut == newBalanceOut))
816+ then {
817+ let unstake = reentrantInvoke(this, "internal", [false, (cleanAmountOut + fraction(feeAmount, 3, 4)), assetOut], nil)
818+ if ((unstake == unstake))
819+ then $Tuple2([IntegerEntry((("global_" + assetOut) + "_balance"), (newBalanceOut + fraction(feeAmount, 1, 4))), ScriptTransfer(addressFromStringValue(caller), cleanAmountOut, AssetOut), IntegerEntry((("global_" + AssetIn) + "_balance"), newBalanceIn), IntegerEntry("days_since_apy", day), IntegerEntry(reveneuForDayByAssetOut(day, assetOut), (reveneu + feeAmount)), IntegerEntry(volumeKey, (volume + AmountIn))], $Tuple2(cleanAmountOut, feeAmount))
820+ else throw("Strict value is not equal to itself.")
821+ }
822+ else throw("Strict value is not equal to itself.")
823+ }
824+ else throw("Strict value is not equal to itself.")
825+ }
826+ else throw("Strict value is not equal to itself.")
827+ }
828+ else throw("Strict value is not equal to itself.")
829+ }
830+ else throw("Strict value is not equal to itself.")
831+ }
832+ else throw("Strict value is not equal to itself.")
833+ }
834+ else throw("Strict value is not equal to itself.")
835+ }
836+ else throw("Strict value is not equal to itself.")
837+ }
838+
839+
840+@Verifier(tx)
841+func verify () = if (isTestEnv())
842+ then sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
843+ else {
844+ let firstUser = base58'6TdaXEfhnjYquvPf3yV7MFxt2CbgFmaqsvGwkKfXtKi4'
845+ let secondUser = base58'E23yUg8eun5nXB1nZRDf7RTyRADKxQhGNXdpTYonEvtU'
846+ let thirdUser = base58'Ga8WEBTPXbHuoXRD355mQ6ms8PsM2RFYKeA1mEP32CFe'
847+ let firstUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], firstUser))
848+ then 1
849+ else if (sigVerify(tx.bodyBytes, tx.proofs[1], firstUser))
850+ then 1
851+ else if (sigVerify(tx.bodyBytes, tx.proofs[2], firstUser))
852+ then 1
853+ else 0
854+ let secondUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], secondUser))
855+ then 1
856+ else if (sigVerify(tx.bodyBytes, tx.proofs[1], secondUser))
857+ then 1
858+ else if (sigVerify(tx.bodyBytes, tx.proofs[2], secondUser))
859+ then 1
860+ else 0
861+ let thirdUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], thirdUser))
862+ then 1
863+ else if (sigVerify(tx.bodyBytes, tx.proofs[1], thirdUser))
864+ then 1
865+ else if (sigVerify(tx.bodyBytes, tx.proofs[2], thirdUser))
866+ then 1
867+ else 0
868+ let signaturesCount = ((firstUserSigned + secondUserSigned) + thirdUserSigned)
869+ match tx {
870+ case _ =>
871+ (signaturesCount >= 2)
872+ }
873+ }
874+

github/deemru/w8io/3ef1775 
72.07 ms