tx · mjwwCbNaHQvdpu8ca9kGhHhSQLt8tWZ6aUzaDyBkVgD

3PQtT2o7g8HmcZLGodx4L7YDe7ngb26wjYk:  -0.06100000 Waves

2023.08.09 18:31 [3768850] smart account 3PQtT2o7g8HmcZLGodx4L7YDe7ngb26wjYk > SELF 0.00000000 Waves

{ "type": 13, "id": "mjwwCbNaHQvdpu8ca9kGhHhSQLt8tWZ6aUzaDyBkVgD", "fee": 6100000, "feeAssetId": null, "timestamp": 1691595101946, "version": 2, "chainId": 87, "sender": "3PQtT2o7g8HmcZLGodx4L7YDe7ngb26wjYk", "senderPublicKey": "DGuDyEBiewoZje46attYBabwJWnk7PPwtLi6yBjzctPV", "proofs": [ "BA9geLR48MwebYnhpF6mT1iLUa58ryT8pWntYci8eoTVpitJtGJwnYBnuM3SvWLZfYd8JBWQxgpaLk3uNyQVmAz" ], "script": "base64:BgJvCAISEAoOGBgBAQgIAQEBAQEIAQgSAwoBARIDCgEBEgASBAoCCAESBAoCCAESAwoBARIECgIIARIDCgEBEgQKAggBEgUKAwgIARIDCgEIEgASAwoBCBIAEgMKAQESAwoBCBIAEgASAwoBCBIDCgEIdAADU0VQAgJfXwAFV0FWRVMCBXdhdmVzAAdNQVhfSU5UAP//////////fwAHTUFYX0ZFRQDAhD0ADU1BWF9BTVBMSUZJRVIJALYCAQDAhD0AFE1BWF9XRUlHSFRfQU1QTElGSUVSCQC2AgEAwIQ9AApNQVhfV0VJR0hUAMCEPQAUU0xJUFBBR0VfUkFURV9GQUNUT1IJALYCAQDAhD0AD0ZFRV9SQVRFX0ZBQ1RPUgkAtgIBAMCEPQALUkFURV9GQUNUT1IJALYCAQDAhD0ADlBFUkNFTlRfRkFDVE9SCQC2AgEAgICQu7rWrfANABBaRVJPX0lOVF9MSVNUXzEwCQDMCAIAAAkAzAgCAAAJAMwIAgAACQDMCAIAAAkAzAgCAAAJAMwIAgAACQDMCAIAAAkAzAgCAAAJAMwIAgAACQDMCAIAAAUDbmlsABBaRVJPX0lOVF9MSVNUXzExCQDNCAIFEFpFUk9fSU5UX0xJU1RfMTAAAAALWkVST19CSUdJTlQJALYCAQAAABNaRVJPX0JJR0lOVF9MSVNUXzEwCQDMCAIFC1pFUk9fQklHSU5UCQDMCAIFC1pFUk9fQklHSU5UCQDMCAIFC1pFUk9fQklHSU5UCQDMCAIFC1pFUk9fQklHSU5UCQDMCAIFC1pFUk9fQklHSU5UCQDMCAIFC1pFUk9fQklHSU5UCQDMCAIFC1pFUk9fQklHSU5UCQDMCAIFC1pFUk9fQklHSU5UCQDMCAIFC1pFUk9fQklHSU5UCQDMCAIFC1pFUk9fQklHSU5UBQNuaWwAE1pFUk9fQklHSU5UX0xJU1RfMTEJAM0IAgUTWkVST19CSUdJTlRfTElTVF8xMAULWkVST19CSUdJTlQADElOVF9ERUNJTUFMUwAIAA9CSUdJTlRfREVDSU1BTFMAEgAHTElTVF82NAkAvQkCAn8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wAgFfAAxLRVlfTVVMVElTSUcCCE1VTFRJU0lHAApLRVlfU1RBVFVTAgZTVEFUVVMACktFWV9QQVVTRUQCBlBBVVNFRAAKS0VZX1BBVVNFUgIGUEFVU0VSAAtLRVlfU1RPUkFHRQIHU1RPUkFHRQAKS0VZX0FTU0VUUwIGQVNTRVRTABJLRVlfQVNTRVRfQkFMQU5DRVMCDkFTU0VUX0JBTEFOQ0VTABFLRVlfQVNTRVRfV0VJR0hUUwINQVNTRVRfV0VJR0hUUwAKS0VZX0xQX0ZFRQIGTFBfRkVFABBLRVlfUFJPVE9DT0xfRkVFAgxQUk9UT0NPTF9GRUUADUtFWV9QUkVDSVNJT04CCVBSRUNJU0lPTgAUS0VZX1NJR01BX0ZFRV9QRVJfTFACEFNJR01BX0ZFRV9QRVJfTFAAGUtFWV9VU0VSX1NJR01BX0ZFRV9QRVJfTFACFVVTRVJfU0lHTUFfRkVFX1BFUl9MUAALS0VZX1VTRVJfTFACB1VTRVJfTFAADEtFWV9UT1RBTF9MUAIIVE9UQUxfTFAAEEtFWV9VU0VSX1BST0ZJVFMCDFVTRVJfUFJPRklUUwEQX3ZhbGlkYXRlQWRkcmVzcwIIYWRkcmVzc18EZXJyXwQHJG1hdGNoMAkApggBBQhhZGRyZXNzXwMJAAECBQckbWF0Y2gwAgdBZGRyZXNzBAFhBQckbWF0Y2gwBgkAAgEFBGVycl8BDl92YWxpZGF0ZUFzc2V0Aghhc3NldElkXwRlcnJfAwkAAAIFCGFzc2V0SWRfBQVXQVZFUwYEByRtYXRjaDAJAOwHAQkA2QQBBQhhc3NldElkXwMJAAECBQckbWF0Y2gwAgVBc3NldAQBYQUHJG1hdGNoMAYJAAIBBQRlcnJfAQxfdmFsaWRhdGVJbnQEBHZhbF8ObG93ZXJCb3VuZGFyeV8OdXBwZXJCb3VuZGFyeV8EZXJyXwMDCQBmAgUObG93ZXJCb3VuZGFyeV8FBHZhbF8GCQBmAgUEdmFsXwUOdXBwZXJCb3VuZGFyeV8JAAIBBQRlcnJfBgENX3ZhbGlkYXRlQm9vbAMEdmFsXwd0YXJnZXRfBGVycl8DCQECIT0CBQR2YWxfBQd0YXJnZXRfCQACAQUEZXJyXwYBFF92YWxpZGF0ZVN0cmluZ0VxdWFsAwV2YWwxXwV2YWwyXwRlcnJfAwkBAiE9AgUFdmFsMV8FBXZhbDJfCQACAQUEZXJyXwYBFF92YWxpZGF0ZVN0cmluZ05vdEVxAwV2YWwxXwV2YWwyXwRlcnJfAwkAAAIFBXZhbDFfBQV2YWwyXwkAAgEFBGVycl8GARBfdmFsaWRhdGVJbnRMaXN0BAR2YWxfDmxvd2VyQm91bmRhcnlfDnVwcGVyQm91bmRhcnlfBGVycl8KAQhmb2xkRnVuYwIDYWNjBGVsZW0EByRtYXRjaDAJALYJAQUEZWxlbQMJAAECBQckbWF0Y2gwAgNJbnQEAWEFByRtYXRjaDADBQNhY2MJAQxfdmFsaWRhdGVJbnQEBQFhBQ5sb3dlckJvdW5kYXJ5XwUOdXBwZXJCb3VuZGFyeV8FBGVycl8HCQACAQUEZXJyXwoAAiRsBQR2YWxfCgACJHMJAJADAQUCJGwKAAUkYWNjMAYKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCGZvbGRGdW5jAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAQ9fdmFsaWRhdGVBc3NldHMCB2Fzc2V0c18EZXJyXwoBCGZvbGRGdW5jAgNhY2MEZWxlbQMFA2FjYwkBDl92YWxpZGF0ZUFzc2V0AgUEZWxlbQUEZXJyXwcKAAIkbAUHYXNzZXRzXwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAGCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQhmb2xkRnVuYwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgESX3ZhbGlkYXRlSW50RXF1YWxzAwV2YWwxXwV2YWwyXwRlcnJfAwkBAiE9AgUFdmFsMV8FBXZhbDJfCQACAQUEZXJyXwYBEl92YWxpZGF0ZVRva2VuTmFtZQIEdmFsXwRlcnJfAwMJAGYCAAQJALECAQUEdmFsXwYJAGYCCQCxAgEFBHZhbF8AEAkAAgEFBGVycl8GARNfdmFsaWRhdGVUb2tlbkRlc2NyAgR2YWxfBGVycl8DCQBmAgkAsQIBBQR2YWxfAOgHCQACAQUEZXJyXwYBEV92YWxpZGF0ZURlY2ltYWxzAgR2YWxfBGVycl8DAwkAZgIAAAUEdmFsXwYJAGYCBQR2YWxfAAgJAAIBBQRlcnJfBgEQX3ZhbGlkYXRlUGF5bWVudAQIcGF5bWVudF8IYXNzZXRJZF8PcmVxdWlyZWRBbW91bnRfBGVycl8EByRtYXRjaDAIBQhwYXltZW50Xwdhc3NldElkAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAWEFByRtYXRjaDADCQECIT0CBQhhc3NldElkXwkA2AQBBQFhCQACAQkArAICBQRlcnJfAgc6IGFzc2V0AwkAZgIFD3JlcXVpcmVkQW1vdW50XwgFCHBheW1lbnRfBmFtb3VudAkAAgEJAKwCAgUEZXJyXwIIOiBhbW91bnQGCQACAQkArAICBQRlcnJfAgc6IGFzc2V0ARVfdmFsaWRhdGVMaXN0Q29udGFpbnMDBWxpc3RfBHZhbF8EZXJyXwMJAQEhAQkBD2NvbnRhaW5zRWxlbWVudAIFBWxpc3RfBQR2YWxfCQACAQUEZXJyXwYBC19hc3NldFRvU3RyAQZhc3NldF8EByRtYXRjaDAFBmFzc2V0XwMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAFhBQckbWF0Y2gwCQDYBAEFAWEFBVdBVkVTAQtfc3RyVG9Bc3NldAEGYXNzZXRfAwMJAAACBQZhc3NldF8FBVdBVkVTBgkAAAIFBmFzc2V0XwIABQR1bml0CQDZBAEFBmFzc2V0XwEKX2xvYWRQYXVzZQAEByRtYXRjaDAJAKAIAQUKS0VZX1BBVVNFRAMJAAECBQckbWF0Y2gwAgdCb29sZWFuBAFhBQckbWF0Y2gwBQFhBwEKX3NhdmVQYXVzZQEJaXNQYXVzZWRfCQDMCAIJAQxCb29sZWFuRW50cnkCBQpLRVlfUEFVU0VEBQlpc1BhdXNlZF8FA25pbAELX2xvYWRQYXVzZXIABAckbWF0Y2gwCQCiCAEFCktFWV9QQVVTRVIDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwCQERQGV4dHJOYXRpdmUoMTA2MikBBQFhCQEHQWRkcmVzcwEBAAELX3NhdmVQYXVzZXIBB3BhdXNlcl8JAMwIAgkBC1N0cmluZ0VudHJ5AgUKS0VZX1BBVVNFUgkApQgBBQdwYXVzZXJfBQNuaWwBDV9sb2FkTXVsdGlzaWcABAckbWF0Y2gwCQCiCAEFDEtFWV9NVUxUSVNJRwMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDAJARFAZXh0ck5hdGl2ZSgxMDYyKQEFAWEJAQdBZGRyZXNzAQEAAQ1fc2F2ZU11bHRpc2lnAQltdWx0aXNpZ18JAMwIAgkBC1N0cmluZ0VudHJ5AgUMS0VZX01VTFRJU0lHCQClCAEFCW11bHRpc2lnXwUDbmlsAQxfbG9hZFN0b3JhZ2UABAckbWF0Y2gwCQCiCAEFC0tFWV9TVE9SQUdFAwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAQGc3RydWN0CQC1CQIFAWEFA1NFUAkAnAoKCQDZBAEJAJEDAgUGc3RydWN0AAAJAAACCQCRAwIFBnN0cnVjdAABAgExCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUGc3RydWN0AAIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQZzdHJ1Y3QAAwkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBnN0cnVjdAAECQCnAwEJAJEDAgUGc3RydWN0AAUJAKcDAQkAkQMCBQZzdHJ1Y3QABgkApwMBCQCRAwIFBnN0cnVjdAAHCQCnAwEJAJEDAgUGc3RydWN0AAgJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAJEDAgUGc3RydWN0AAkJAJwKCgEABwAAAAAAAAULWkVST19CSUdJTlQFC1pFUk9fQklHSU5UBQtaRVJPX0JJR0lOVAULWkVST19CSUdJTlQJAQdBZGRyZXNzAQEAAQxfc2F2ZVN0b3JhZ2UBCHN0b3JhZ2VfCQDMCAIJAQtTdHJpbmdFbnRyeQIFC0tFWV9TVE9SQUdFCQC5CQIJAMwIAgkA2AQBCAUIc3RvcmFnZV8CXzEJAMwIAgMIBQhzdG9yYWdlXwJfMgIBMQIBMAkAzAgCCQCkAwEIBQhzdG9yYWdlXwJfMwkAzAgCCQCkAwEIBQhzdG9yYWdlXwJfNAkAzAgCCQCkAwEIBQhzdG9yYWdlXwJfNQkAzAgCCQCmAwEIBQhzdG9yYWdlXwJfNgkAzAgCCQCmAwEIBQhzdG9yYWdlXwJfNwkAzAgCCQCmAwEIBQhzdG9yYWdlXwJfOAkAzAgCCQCmAwEIBQhzdG9yYWdlXwJfOQkAzAgCCQClCAEIBQhzdG9yYWdlXwNfMTAFA25pbAUDU0VQBQNuaWwBC19sb2FkQXNzZXRzAAQHJG1hdGNoMAkAoggBBQpLRVlfQVNTRVRTAwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAMJAGYCCQCxAgEFAWEAAAkAvQkCBQFhBQNTRVAFA25pbAUDbmlsAQtfc2F2ZUFzc2V0cwEHYXNzZXRzXwkAzAgCCQELU3RyaW5nRW50cnkCBQpLRVlfQVNTRVRTCQC7CQIFB2Fzc2V0c18FA1NFUAUDbmlsARJfbG9hZEFzc2V0QmFsYW5jZXMACgEIZm9sZEZ1bmMCA2FjYwRlbGVtBAdiYWxhbmNlCQCnAwEFBGVsZW0JAJQKAgkAzQgCCAUDYWNjAl8xBQdiYWxhbmNlCQC3AgIIBQNhY2MCXzIFB2JhbGFuY2UEByRtYXRjaDAJAKIIAQUSS0VZX0FTU0VUX0JBTEFOQ0VTAwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAMJAGYCCQCxAgEFAWEAAAoAAiRsCQC9CQIFAWEFA1NFUAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgUDbmlsBQtaRVJPX0JJR0lOVAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEIZm9sZEZ1bmMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoJAJQKAgUTWkVST19CSUdJTlRfTElTVF8xMAULWkVST19CSUdJTlQJAJQKAgUTWkVST19CSUdJTlRfTElTVF8xMAULWkVST19CSUdJTlQBEl9zYXZlQXNzZXRCYWxhbmNlcwEJYmFsYW5jZXNfCgEIZm9sZEZ1bmMCA2FjYwRlbGVtCQDNCAIFA2FjYwkApgMBBQRlbGVtCQDMCAIJAQtTdHJpbmdFbnRyeQIFEktFWV9BU1NFVF9CQUxBTkNFUwkAuwkCCgACJGwFCWJhbGFuY2VzXwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEIZm9sZEZ1bmMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoFA1NFUAUDbmlsARFfbG9hZEFzc2V0V2VpZ2h0cwAKAQhmb2xkRnVuYwIDYWNjBGVsZW0EBndlaWdodAkBDXBhcnNlSW50VmFsdWUBBQRlbGVtCQCUCgIJAM0IAggFA2FjYwJfMQUGd2VpZ2h0CQBkAggFA2FjYwJfMgUGd2VpZ2h0BAckbWF0Y2gwCQCiCAEFEUtFWV9BU1NFVF9XRUlHSFRTAwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAMJAGYCCQCxAgEFAWEAAAoAAiRsCQC9CQIFAWEFA1NFUAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgUDbmlsAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCGZvbGRGdW5jAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKCQCUCgIFEFpFUk9fSU5UX0xJU1RfMTAAAAkAlAoCBRBaRVJPX0lOVF9MSVNUXzEwAAABEV9zYXZlQXNzZXRXZWlnaHRzAQh3ZWlnaHRzXwoBCGZvbGRGdW5jAgNhY2MEZWxlbQkAzQgCBQNhY2MJAKQDAQUEZWxlbQkAzAgCCQELU3RyaW5nRW50cnkCBRFLRVlfQVNTRVRfV0VJR0hUUwkAuwkCCgACJGwFCHdlaWdodHNfCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQhmb2xkRnVuYwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgUDU0VQBQNuaWwBCl9sb2FkTHBGZWUBCGFzc2V0SWRfBAckbWF0Y2gwCQCfCAEJALkJAgkAzAgCBQpLRVlfTFBfRkVFCQDMCAIFCGFzc2V0SWRfBQNuaWwFA1NFUAMJAAECBQckbWF0Y2gwAgNJbnQEAWEFByRtYXRjaDAFAWEAAAEKX3NhdmVMcEZlZQIIYXNzZXRJZF8EdmFsXwkAzAgCCQEMSW50ZWdlckVudHJ5AgkAuQkCCQDMCAIFCktFWV9MUF9GRUUJAMwIAgUIYXNzZXRJZF8FA25pbAUDU0VQBQR2YWxfBQNuaWwBEF9sb2FkUHJvdG9jb2xGZWUBCGFzc2V0SWRfBAckbWF0Y2gwCQCfCAEJALkJAgkAzAgCBRBLRVlfUFJPVE9DT0xfRkVFCQDMCAIFCGFzc2V0SWRfBQNuaWwFA1NFUAMJAAECBQckbWF0Y2gwAgNJbnQEAWEFByRtYXRjaDAFAWEAAAEQX3NhdmVQcm90b2NvbEZlZQIIYXNzZXRJZF8EdmFsXwkAzAgCCQEMSW50ZWdlckVudHJ5AgkAuQkCCQDMCAIFEEtFWV9QUk9UT0NPTF9GRUUJAMwIAgUIYXNzZXRJZF8FA25pbAUDU0VQBQR2YWxfBQNuaWwBDl9sb2FkUHJlY2lzaW9uAAQHJG1hdGNoMAkAnwgBBQ1LRVlfUFJFQ0lTSU9OAwkAAQIFByRtYXRjaDACA0ludAQBYQUHJG1hdGNoMAUBYQAAAQ5fc2F2ZVByZWNpc2lvbgEEdmFsXwkAzAgCCQEMSW50ZWdlckVudHJ5AgUNS0VZX1BSRUNJU0lPTgUEdmFsXwUDbmlsARJfbG9hZFNpZ21hRmVlUGVyTHAACgEIZm9sZEZ1bmMCA2FjYwRlbGVtCQDNCAIFA2FjYwkApwMBBQRlbGVtBAckbWF0Y2gwCQCiCAEFFEtFWV9TSUdNQV9GRUVfUEVSX0xQAwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAMJAGYCCQCxAgEFAWEAAAoAAiRsCQC9CQIFAWEFA1NFUAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEIZm9sZEZ1bmMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDExCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwUTWkVST19CSUdJTlRfTElTVF8xMQUTWkVST19CSUdJTlRfTElTVF8xMQESX3NhdmVTaWdtYUZlZVBlckxwAQR2YWxfCgEIZm9sZEZ1bmMCA2FjYwRlbGVtCQDNCAIFA2FjYwkApgMBBQRlbGVtCQDMCAIJAQtTdHJpbmdFbnRyeQIFFEtFWV9TSUdNQV9GRUVfUEVSX0xQCQC7CQIKAAIkbAUEdmFsXwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEIZm9sZEZ1bmMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDExCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwUDU0VQBQNuaWwBFl9sb2FkVXNlclNpZ21hRmVlUGVyTHABBXVzZXJfCgEIZm9sZEZ1bmMCA2FjYwRlbGVtCQDNCAIFA2FjYwkApwMBBQRlbGVtBAckbWF0Y2gwCQCiCAEJALkJAgkAzAgCBRlLRVlfVVNFUl9TSUdNQV9GRUVfUEVSX0xQCQDMCAIJAKUIAQUFdXNlcl8FA25pbAUDU0VQAwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAMJAGYCCQCxAgEFAWEAAAoAAiRsCQC9CQIFAWEFA1NFUAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEIZm9sZEZ1bmMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDExCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwUTWkVST19CSUdJTlRfTElTVF8xMQUTWkVST19CSUdJTlRfTElTVF8xMQEWX3NhdmVVc2VyU2lnbWFGZWVQZXJMcAIFdXNlcl8EdmFsXwoBCGZvbGRGdW5jAgNhY2MEZWxlbQkAzQgCBQNhY2MJAKYDAQUEZWxlbQkAzAgCCQELU3RyaW5nRW50cnkCCQC5CQIJAMwIAgUZS0VZX1VTRVJfU0lHTUFfRkVFX1BFUl9MUAkAzAgCCQClCAEFBXVzZXJfBQNuaWwFA1NFUAkAuwkCCgACJGwFBHZhbF8KAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCGZvbGRGdW5jAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsFA1NFUAUDbmlsAQtfbG9hZFVzZXJMcAEIYWRkcmVzc18EByRtYXRjaDAJAJ8IAQkAuQkCCQDMCAIFC0tFWV9VU0VSX0xQCQDMCAIJAKUIAQUIYWRkcmVzc18FA25pbAUDU0VQAwkAAQIFByRtYXRjaDACA0ludAQBYQUHJG1hdGNoMAUBYQAAAQtfc2F2ZVVzZXJMcAIIYWRkcmVzc18EdmFsXwkAzAgCCQEMSW50ZWdlckVudHJ5AgkAuQkCCQDMCAIFC0tFWV9VU0VSX0xQCQDMCAIJAKUIAQUIYWRkcmVzc18FA25pbAUDU0VQBQR2YWxfBQNuaWwBDF9sb2FkVG90YWxMcAAEByRtYXRjaDAJAJ8IAQUMS0VZX1RPVEFMX0xQAwkAAQIFByRtYXRjaDACA0ludAQBYQUHJG1hdGNoMAUBYQAAAQxfc2F2ZVRvdGFsTHABBHZhbF8JAMwIAgkBDEludGVnZXJFbnRyeQIFDEtFWV9UT1RBTF9MUAUEdmFsXwUDbmlsARBfbG9hZFVzZXJQcm9maXRzAQV1c2VyXwoBCGZvbGRGdW5jAgNhY2MEZWxlbQkAzQgCBQNhY2MJAQ1wYXJzZUludFZhbHVlAQUEZWxlbQQHJG1hdGNoMAkAoggBCQC5CQIJAMwIAgUQS0VZX1VTRVJfUFJPRklUUwkAzAgCCQClCAEFBXVzZXJfBQNuaWwFA1NFUAMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDADCQBmAgkAsQIBBQFhAAAKAAIkbAkAvQkCBQFhBQNTRVAKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCGZvbGRGdW5jAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsFEFpFUk9fSU5UX0xJU1RfMTEFEFpFUk9fSU5UX0xJU1RfMTEBEF9zYXZlVXNlclByb2ZpdHMCBXVzZXJfBHZhbF8KAQhmb2xkRnVuYwIDYWNjBGVsZW0JAM0IAgUDYWNjCQCkAwEFBGVsZW0JAMwIAgkBC1N0cmluZ0VudHJ5AgkAuQkCCQDMCAIFEEtFWV9VU0VSX1BST0ZJVFMJAMwIAgkApQgBBQV1c2VyXwUDbmlsBQNTRVAJALsJAgoAAiRsBQR2YWxfCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQhmb2xkRnVuYwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTEJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALBQNTRVAFA25pbAERX29ubHlUaGlzQ29udHJhY3QBB2NhbGxlcl8DCQECIT0CBQdjYWxsZXJfBQR0aGlzCQACAQIZX29ubHlUaGlzQ29udHJhY3Q6IHJldmVydAYBEF93aGVuTXVsdGlzaWdTZXQAAwkAAAIJAQ1fbG9hZE11bHRpc2lnAAkBB0FkZHJlc3MBAQAJAAIBAhhfd2hlbk11bHRpc2lnU2V0OiByZXZlcnQGARNfd2hlbk5vdEluaXRpYWxpemVkAAQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQADCQECIT0CCAUHc3RvcmFnZQJfMQEACQACAQIbX3doZW5Ob3RJbml0aWFsaXplZDogcmV2ZXJ0BgEQX3doZW5Jbml0aWFsaXplZAAEB3N0b3JhZ2UJAQxfbG9hZFN0b3JhZ2UAAwkAAAIIBQdzdG9yYWdlAl8xAQAJAAIBAhhfd2hlbkluaXRpYWxpemVkOiByZXZlcnQGAQ5fd2hlbk5vdFBhdXNlZAADCQEKX2xvYWRQYXVzZQAJAAIBAhZfd2hlbk5vdFBhdXNlZDogcmV2ZXJ0BgELX3doZW5QYXVzZWQAAwkBASEBCQEKX2xvYWRQYXVzZQAJAAIBAhNfd2hlblBhdXNlZDogcmV2ZXJ0BgELX29ubHlQYXVzZXIBB2NhbGxlcl8DCQECIT0CBQdjYWxsZXJfCQELX2xvYWRQYXVzZXIACQACAQITX29ubHlQYXVzZXI6IHJldmVydAYBDF9nZXREZWNpbWFscwEIYXNzZXRJZF8EByRtYXRjaDAJAOwHAQkA2QQBBQhhc3NldElkXwMJAAECBQckbWF0Y2gwAgVBc3NldAQBYQUHJG1hdGNoMAgFAWEIZGVjaW1hbHMJAAIBCQCsAgICF19nZXREZWNpbWFsczogbm8gYXNzZXQ9BQhhc3NldElkXwEGX3BvdzEwAQlleHBvbmVudF8EByRtYXRjaDAFCWV4cG9uZW50XwMJAAACAAgFByRtYXRjaDAAgMLXLwMJAAACAAcFByRtYXRjaDAAgK3iBAMJAAACAAYFByRtYXRjaDAAwIQ9AwkAAAIABQUHJG1hdGNoMACgjQYDCQAAAgAEBQckbWF0Y2gwAJBOAwkAAAIAAwUHJG1hdGNoMADoBwMJAAACAAIFByRtYXRjaDAAZAMJAAACAAEFByRtYXRjaDAACgMJAAACAAAFByRtYXRjaDAAAQkAAgEJAKwCAgIQX3BvdzEwOiByZXZlcnQ6IAkApAMBBQlleHBvbmVudF8BEl9ub3JtYWxpemVEZWNpbWFscwQHYW1vdW50Xw9zb3VyY2VEZWNpbWFsc18PdGFyZ2V0RGVjaW1hbHNfBnJvdW5kXwMJAGcCBQ9zb3VyY2VEZWNpbWFsc18FD3RhcmdldERlY2ltYWxzXwkAvQIEBQdhbW91bnRfCQC2AgEAAQkAtgIBCQEGX3BvdzEwAQkAZQIFD3NvdXJjZURlY2ltYWxzXwUPdGFyZ2V0RGVjaW1hbHNfBQZyb3VuZF8JALkCAgUHYW1vdW50XwkAtgIBCQEGX3BvdzEwAQkAZQIFD3RhcmdldERlY2ltYWxzXwUPc291cmNlRGVjaW1hbHNfARVfcHJlcGFyZUFzc2V0QmFsYW5jZXMBB2Fzc2V0c18KAQhmb2xkRnVuYwIDYWNjBGVsZW0JAM0IAgUDYWNjBQtaRVJPX0JJR0lOVAoAAiRsBQdhc3NldHNfCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQhmb2xkRnVuYwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgEUX3ByZXBhcmVBc3NldFdlaWdodHMBDWFzc2V0V2VpZ2h0c18KAQhmb2xkRnVuYwIDYWNjBGVsZW0EBndlaWdodAkBDXBhcnNlSW50VmFsdWUBBQRlbGVtCQCUCgIJAM0IAggFA2FjYwJfMQUGd2VpZ2h0CQBkAggFA2FjYwJfMgUGd2VpZ2h0CgACJGwFDWFzc2V0V2VpZ2h0c18KAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIFA25pbAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQhmb2xkRnVuYwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgEQX2xpc3RJbnRUb1N0cmluZwEHYXNzZXRzXwoBCGZvbGRGdW5jAgNhY2MEZWxlbQkAzQgCBQNhY2MJAKQDAQUEZWxlbQkAuwkCCgACJGwFB2Fzc2V0c18KAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCGZvbGRGdW5jAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyA2NQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQAFQAWABcAGAAZABoAGwAcAB0AHgAfACAAIQAiACMAJAAlACYAJwAoACkAKgArACwALQAuAC8AMAAxADIAMwA0ADUANgA3ADgAOQA6ADsAPAA9AD4APwBAAEEFA1NFUAETX2xpc3RCaWdJbnRUb1N0cmluZwEHYXNzZXRzXwoBCGZvbGRGdW5jAgNhY2MEZWxlbQkAzQgCBQNhY2MJAKYDAQUEZWxlbQkAuQkCCgACJGwFB2Fzc2V0c18KAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCGZvbGRGdW5jAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyA2NQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQAFQAWABcAGAAZABoAGwAcAB0AHgAfACAAIQAiACMAJAAlACYAJwAoACkAKgArACwALQAuAC8AMAAxADIAMwA0ADUANgA3ADgAOQA6ADsAPAA9AD4APwBAAEEFA1NFUAEQX2dldEVxdWlsaWJyaXVtcwMOc2lnbWFCYWxhbmNlc18Id2VpZ2h0c18Mc2lnbWFXZWlnaHRfCgEIZm9sZEZ1bmMCA2FjYwRlbGVtCQDNCAIFA2FjYwkAvAIDBQ5zaWdtYUJhbGFuY2VzXwkAtgIBBQRlbGVtCQC2AgEFDHNpZ21hV2VpZ2h0XwoAAiRsBQh3ZWlnaHRzXwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEIZm9sZEZ1bmMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoBG19pbmNyZW1lbnRCYWxhbmNlc0J5QW1vdW50cwIJYmFsYW5jZXNfCGFtb3VudHNfCgEIZm9sZEZ1bmMCA2FjYwRlbGVtBAVpbmRleAgFA2FjYwJfMQQGYW1vdW50CQCRAwIFCGFtb3VudHNfBQVpbmRleAQKbmV3QmFsYW5jZQkAtwICBQRlbGVtBQZhbW91bnQJAJUKAwkAZAIFBWluZGV4AAEJAM0IAggFA2FjYwJfMgUKbmV3QmFsYW5jZQkAtwICCAUDYWNjAl8zBQpuZXdCYWxhbmNlBAZyZXN1bHQKAAIkbAUJYmFsYW5jZXNfCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlQoDAAAFA25pbAULWkVST19CSUdJTlQKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCGZvbGRGdW5jAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKCQCUCgIIBQZyZXN1bHQCXzIIBQZyZXN1bHQCXzMBHF9pbmNyZW1lbnRCYWxhbmNlc0J5UGF5bWVudHMFCWJhbGFuY2VzXwlwYXltZW50c18HYXNzZXRzXwlkZWNpbWFsc18EZXJyXwoBCGZvbGRGdW5jAgNhY2MEZWxlbQQFaW5kZXgIBQNhY2MCXzEEB3BheW1lbnQJAJEDAgUJcGF5bWVudHNfBQVpbmRleAQPcGF5bWVudEFzc2V0U3RyCQELX2Fzc2V0VG9TdHIBCAUHcGF5bWVudAdhc3NldElkBANlcnIDCQECIT0CBQ9wYXltZW50QXNzZXRTdHIJAJEDAgUHYXNzZXRzXwUFaW5kZXgJAAIBCQCsAgIJAKwCAgUEZXJyXwIIOiBpbmRleD0JAKQDAQUFaW5kZXgFBHVuaXQDCQAAAgUDZXJyBQNlcnIEDWFzc2V0RGVjaW1hbHMJAQxfZ2V0RGVjaW1hbHMBBQ9wYXltZW50QXNzZXRTdHIECm5ld0JhbGFuY2UJALcCAgUEZWxlbQkBEl9ub3JtYWxpemVEZWNpbWFscwQJALYCAQgJAJEDAgUJcGF5bWVudHNfBQVpbmRleAZhbW91bnQFDWFzc2V0RGVjaW1hbHMFCWRlY2ltYWxzXwUERE9XTgkAlQoDCQBkAgUFaW5kZXgAAQkAzQgCCAUDYWNjAl8yBQpuZXdCYWxhbmNlCQC3AgIIBQNhY2MCXzMFCm5ld0JhbGFuY2UJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4EBnJlc3VsdAoAAiRsBQliYWxhbmNlc18KAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCVCgMAAAUDbmlsBQtaRVJPX0JJR0lOVAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEIZm9sZEZ1bmMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoJAJQKAggFBnJlc3VsdAJfMggFBnJlc3VsdAJfMwEYX2luY3JlbWVudEJhbGFuY2VCeUluZGV4AwliYWxhbmNlc18GaW5kZXhfB2Ftb3VudF8KAQhmb2xkRnVuYwIDYWNjBGVsZW0EBWluZGV4CAUDYWNjAl8xAwkAAAIFBWluZGV4BQZpbmRleF8JAJQKAgkAZAIFBWluZGV4AAEJAM0IAggFA2FjYwJfMgkAtwICBQRlbGVtBQdhbW91bnRfCQCUCgIJAGQCBQVpbmRleAABCQDNCAIIBQNhY2MCXzIFBGVsZW0EBnJlc3VsdAoAAiRsBQliYWxhbmNlc18KAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIAAAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQhmb2xkRnVuYwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACggFBnJlc3VsdAJfMgEYX2RlY3JlbWVudEJhbGFuY2VCeUluZGV4AwliYWxhbmNlc18GaW5kZXhfB2Ftb3VudF8KAQhmb2xkRnVuYwIDYWNjBGVsZW0EBWluZGV4CAUDYWNjAl8xAwkAAAIFBWluZGV4BQZpbmRleF8JAJQKAgkAZAIFBWluZGV4AAEJAM0IAggFA2FjYwJfMgkAuAICBQRlbGVtBQdhbW91bnRfCQCUCgIJAGQCBQVpbmRleAABCQDNCAIIBQNhY2MCXzIFBGVsZW0EBnJlc3VsdAoAAiRsBQliYWxhbmNlc18KAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIAAAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQhmb2xkRnVuYwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACggFBnJlc3VsdAJfMgEcX2RlY3JlbWVudEJhbGFuY2VzQnlMcEFtb3VudAMJYmFsYW5jZXNfB2Ftb3VudF8ObHBUb3RhbFN1cHBseV8EBHJhdGUJAL0CBAkAuAICBQ5scFRvdGFsU3VwcGx5XwUHYW1vdW50XwULUkFURV9GQUNUT1IFDmxwVG90YWxTdXBwbHlfBQdDRUlMSU5HCgEIZm9sZEZ1bmMCA2FjYwRlbGVtBApuZXdCYWxhbmNlCQC9AgQFBGVsZW0FBHJhdGUFC1JBVEVfRkFDVE9SBQdDRUlMSU5HBAxkZWx0YUJhbGFuY2UJALgCAgUEZWxlbQUKbmV3QmFsYW5jZQkAlQoDCQDNCAIIBQNhY2MCXzEFCm5ld0JhbGFuY2UJALcCAggFA2FjYwJfMgUKbmV3QmFsYW5jZQkAzQgCCAUDYWNjAl8zBQxkZWx0YUJhbGFuY2UKAAIkbAUJYmFsYW5jZXNfCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlQoDBQNuaWwFC1pFUk9fQklHSU5UBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCGZvbGRGdW5jAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKARhfZ2V0UGF5bWVudHNGcm9tQmFsYW5jZXMEB2Fzc2V0c18JYmFsYW5jZXNfCnJlY2lwaWVudF8Pc291cmNlRGVjaW1hbHNfCgEIZm9sZEZ1bmMCA2FjYwRlbGVtBAVpbmRleAgFA2FjYwJfMQkAlAoCCQBkAgUFaW5kZXgAAQkAzQgCCAUDYWNjAl8yCQEOU2NyaXB0VHJhbnNmZXIDBQpyZWNpcGllbnRfCQCgAwEJARJfbm9ybWFsaXplRGVjaW1hbHMECQCRAwIFCWJhbGFuY2VzXwUFaW5kZXgFD3NvdXJjZURlY2ltYWxzXwkBDF9nZXREZWNpbWFscwEFBGVsZW0FBERPV04JAQtfc3RyVG9Bc3NldAEFBGVsZW0EBnJlc3VsdAoAAiRsBQdhc3NldHNfCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCAAAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEIZm9sZEZ1bmMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoIBQZyZXN1bHQCXzIBEl9jYWxjdWxhdGVNaWNyb0ZlZQUIYmFsYW5jZV8MZXF1aWxpYnJpdW1fEHdlaWdodEFtcGxpZmllcl8Nc2xpcHBhZ2VSYXRlXwtmZWVNYXhSYXRlXwMJAL8CAgUMZXF1aWxpYnJpdW1fBQhiYWxhbmNlXwQJdGhyZXNob2xkCQC8AgMFDGVxdWlsaWJyaXVtXwkAuAICBRRNQVhfV0VJR0hUX0FNUExJRklFUgUQd2VpZ2h0QW1wbGlmaWVyXwUUTUFYX1dFSUdIVF9BTVBMSUZJRVIDCQC/AgIFCXRocmVzaG9sZAUIYmFsYW5jZV8EDG1heERldmlhdGlvbgkAuAICBQl0aHJlc2hvbGQFCGJhbGFuY2VfBAdmZWVSYXRlCQC8AgMJALwCAwUMbWF4RGV2aWF0aW9uBQ1zbGlwcGFnZVJhdGVfBRRTTElQUEFHRV9SQVRFX0ZBQ1RPUgUPRkVFX1JBVEVfRkFDVE9SBQxlcXVpbGlicml1bV8DCQC/AgIFB2ZlZVJhdGUFC2ZlZU1heFJhdGVfCQC8AgMFDG1heERldmlhdGlvbgULZmVlTWF4UmF0ZV8FD0ZFRV9SQVRFX0ZBQ1RPUgkAvAIDBQxtYXhEZXZpYXRpb24FB2ZlZVJhdGUFD0ZFRV9SQVRFX0ZBQ1RPUgULWkVST19CSUdJTlQECXRocmVzaG9sZAkAvAIDBQxlcXVpbGlicml1bV8JALcCAgUUTUFYX1dFSUdIVF9BTVBMSUZJRVIFEHdlaWdodEFtcGxpZmllcl8FFE1BWF9XRUlHSFRfQU1QTElGSUVSAwkAvwICBQhiYWxhbmNlXwUJdGhyZXNob2xkBAxtYXhEZXZpYXRpb24JALgCAgUIYmFsYW5jZV8FCXRocmVzaG9sZAQHZmVlUmF0ZQkAvAIDCQC8AgMFDG1heERldmlhdGlvbgUNc2xpcHBhZ2VSYXRlXwUUU0xJUFBBR0VfUkFURV9GQUNUT1IFD0ZFRV9SQVRFX0ZBQ1RPUgUMZXF1aWxpYnJpdW1fAwkAvwICBQdmZWVSYXRlBQtmZWVNYXhSYXRlXwkAvAIDBQxtYXhEZXZpYXRpb24FC2ZlZU1heFJhdGVfBQ9GRUVfUkFURV9GQUNUT1IJALwCAwUMbWF4RGV2aWF0aW9uBQdmZWVSYXRlBQ9GRUVfUkFURV9GQUNUT1IFC1pFUk9fQklHSU5UAQ1fY2FsY3VsYXRlRmVlBwliYWxhbmNlc18SYXNzZXRzVG90YWxTdXBwbHlfCHdlaWdodHNfDHNpZ21hV2VpZ2h0XxB3ZWlnaHRBbXBsaWZpZXJfDXNsaXBwYWdlUmF0ZV8LZmVlTWF4UmF0ZV8KAQhmb2xkRnVuYwIDYWNjB2JhbGFuY2UEBWluZGV4CAUDYWNjAl8xBAtlcXVpbGlicml1bQkAvAIDBRJhc3NldHNUb3RhbFN1cHBseV8JALYCAQkAkQMCBQh3ZWlnaHRzXwUFaW5kZXgJALYCAQUMc2lnbWFXZWlnaHRfCQCUCgIJAGQCBQVpbmRleAABCQC3AgIIBQNhY2MCXzIJARJfY2FsY3VsYXRlTWljcm9GZWUFBQdiYWxhbmNlBQtlcXVpbGlicml1bQUQd2VpZ2h0QW1wbGlmaWVyXwUNc2xpcHBhZ2VSYXRlXwULZmVlTWF4UmF0ZV8EBnJlc3VsdAoAAiRsBQliYWxhbmNlc18KAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIAAAULWkVST19CSUdJTlQKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCGZvbGRGdW5jAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKCAUGcmVzdWx0Al8yARtfdmFsaWRhdGVMaXF1aWRpdHlJbnZhcmlhbnQLEnByZXZBc3NldEJhbGFuY2VzXxVwcmV2QXNzZXRUb3RhbFN1cHBseV8OYXNzZXRCYWxhbmNlc18RYXNzZXRUb3RhbFN1cHBseV8ScHJldkxwVG90YWxTdXBwbHlfDmxwVG90YWxTdXBwbHlfDWFzc2V0V2VpZ2h0c18Mc2lnbWFXZWlnaHRfEHdlaWdodEFtcGxpZmllcl8Nc2xpcHBhZ2VSYXRlXwtmZWVNYXhSYXRlXwMDCQAAAgUScHJldkxwVG90YWxTdXBwbHlfAAAGCQAAAgUObHBUb3RhbFN1cHBseV8AAAYEDnByZXZBc3NldHNSYXRlCQC8AgMJALgCAgUVcHJldkFzc2V0VG90YWxTdXBwbHlfCQENX2NhbGN1bGF0ZUZlZQcFEnByZXZBc3NldEJhbGFuY2VzXwUVcHJldkFzc2V0VG90YWxTdXBwbHlfBQ1hc3NldFdlaWdodHNfBQxzaWdtYVdlaWdodF8FEHdlaWdodEFtcGxpZmllcl8FDXNsaXBwYWdlUmF0ZV8FC2ZlZU1heFJhdGVfBQtSQVRFX0ZBQ1RPUgkAtgIBBRJwcmV2THBUb3RhbFN1cHBseV8EDW5ld0Fzc2V0c1JhdGUJALwCAwkAuAICBRFhc3NldFRvdGFsU3VwcGx5XwkBDV9jYWxjdWxhdGVGZWUHBQ5hc3NldEJhbGFuY2VzXwURYXNzZXRUb3RhbFN1cHBseV8FDWFzc2V0V2VpZ2h0c18FDHNpZ21hV2VpZ2h0XwUQd2VpZ2h0QW1wbGlmaWVyXwUNc2xpcHBhZ2VSYXRlXwULZmVlTWF4UmF0ZV8FC1JBVEVfRkFDVE9SCQC2AgEFDmxwVG90YWxTdXBwbHlfBARkaWZmCQC4AgIFDW5ld0Fzc2V0c1JhdGUFDnByZXZBc3NldHNSYXRlAwMJAMACAgULWkVST19CSUdJTlQFBGRpZmYJAL8CAgkAuQICCQC2AgEA////////////AQkAtgIBCQEOX2xvYWRQcmVjaXNpb24ABQRkaWZmBwkAAgEJAKwCAgIqX3ZhbGlkYXRlTGlxdWlkaXR5SW52YXJpYW50OiByZXZlcnQ6IGRpZmY9CQCmAwEFBGRpZmYGARZfdmFsaWRhdGVTd2FwSW52YXJpYW50CRJwcmV2QXNzZXRCYWxhbmNlc18VcHJldkFzc2V0VG90YWxTdXBwbHlfDmFzc2V0QmFsYW5jZXNfEWFzc2V0VG90YWxTdXBwbHlfDWFzc2V0V2VpZ2h0c18Mc2lnbWFXZWlnaHRfEHdlaWdodEFtcGxpZmllcl8Nc2xpcHBhZ2VSYXRlXwtmZWVNYXhSYXRlXwQIcHJldlV0aWwJALgCAgUVcHJldkFzc2V0VG90YWxTdXBwbHlfCQENX2NhbGN1bGF0ZUZlZQcFEnByZXZBc3NldEJhbGFuY2VzXwUVcHJldkFzc2V0VG90YWxTdXBwbHlfBQ1hc3NldFdlaWdodHNfBQxzaWdtYVdlaWdodF8FEHdlaWdodEFtcGxpZmllcl8FDXNsaXBwYWdlUmF0ZV8FC2ZlZU1heFJhdGVfBAduZXdVdGlsCQC4AgIFEWFzc2V0VG90YWxTdXBwbHlfCQENX2NhbGN1bGF0ZUZlZQcFDmFzc2V0QmFsYW5jZXNfBRFhc3NldFRvdGFsU3VwcGx5XwUNYXNzZXRXZWlnaHRzXwUMc2lnbWFXZWlnaHRfBRB3ZWlnaHRBbXBsaWZpZXJfBQ1zbGlwcGFnZVJhdGVfBQtmZWVNYXhSYXRlXwQEZGlmZgkAuAICBQduZXdVdGlsBQhwcmV2VXRpbAMDCQDAAgIFC1pFUk9fQklHSU5UBQRkaWZmCQC/AgIJALkCAgkAtgIBAP///////////wEJALYCAQkBDl9sb2FkUHJlY2lzaW9uAAUEZGlmZgcJAAIBCQCsAgICJV92YWxpZGF0ZVN3YXBJbnZhcmlhbnQ6IHJldmVydDogZGlmZj0JAKYDAQUEZGlmZgYBGF92YWxpZGF0ZUFzc2V0QWxsb2NhdGlvbgcIYmFsYW5jZV8RYXNzZXRUb3RhbFN1cHBseV8McHJldkJhbGFuY2VfFXByZXZBc3NldFRvdGFsU3VwcGx5Xwd3ZWlnaHRfDHNpZ21hV2VpZ2h0XwxtYXhBbGxvY0FtcF8EC2VxdWlsaWJyaXVtCQC8AgMFEWFzc2V0VG90YWxTdXBwbHlfCQC2AgEFB3dlaWdodF8JALYCAQUMc2lnbWFXZWlnaHRfBBBtYXhBbGxvY2F0aW9uQW1wAwkAvwICBQhiYWxhbmNlXwULZXF1aWxpYnJpdW0JALcCAgUNTUFYX0FNUExJRklFUgUMbWF4QWxsb2NBbXBfCQC4AgIFDU1BWF9BTVBMSUZJRVIFDG1heEFsbG9jQW1wXwQNbWF4QWxsb2NhdGlvbgkAvAIDBQtlcXVpbGlicml1bQUQbWF4QWxsb2NhdGlvbkFtcAUNTUFYX0FNUExJRklFUgQRcHJldk1heEFsbG9jYXRpb24JALwCAwkAvAIDBRVwcmV2QXNzZXRUb3RhbFN1cHBseV8JALYCAQUHd2VpZ2h0XwkAtgIBBQxzaWdtYVdlaWdodF8FEG1heEFsbG9jYXRpb25BbXAFDU1BWF9BTVBMSUZJRVIDCQC/AgIFCGJhbGFuY2VfBQtlcXVpbGlicml1bQMJAL8CAgUIYmFsYW5jZV8FDW1heEFsbG9jYXRpb24DCQC/AgIFEXByZXZNYXhBbGxvY2F0aW9uBQxwcmV2QmFsYW5jZV8JAAIBAiBfdmFsaWRhdGVBc3NldEFsbG9jYXRpb246IG5ldyB1cAMJAL8CAgkAuAICBQhiYWxhbmNlXwUNbWF4QWxsb2NhdGlvbgkAuAICBQxwcmV2QmFsYW5jZV8FEXByZXZNYXhBbGxvY2F0aW9uCQACAQIiX3ZhbGlkYXRlQXNzZXRBbGxvY2F0aW9uOiBzdGlsbCB1cAYGAwkAvwICBQ1tYXhBbGxvY2F0aW9uBQhiYWxhbmNlXwMJAL8CAgUMcHJldkJhbGFuY2VfBRFwcmV2TWF4QWxsb2NhdGlvbgkAAgECIl92YWxpZGF0ZUFzc2V0QWxsb2NhdGlvbjogbmV3IGRvd24DCQC/AgIJALgCAgUNbWF4QWxsb2NhdGlvbgUIYmFsYW5jZV8JALgCAgURcHJldk1heEFsbG9jYXRpb24FDHByZXZCYWxhbmNlXwkAAgECJF92YWxpZGF0ZUFzc2V0QWxsb2NhdGlvbjogc3RpbGwgZG93bgYGARNfdmFsaWRhdGVBbGxvY2F0aW9uBw5hc3NldEJhbGFuY2VzXxFhc3NldFRvdGFsU3VwcGx5XxJwcmV2QXNzZXRCYWxhbmNlc18VcHJldkFzc2V0VG90YWxTdXBwbHlfDWFzc2V0V2VpZ2h0c18Mc2lnbWFXZWlnaHRfDG1heEFsbG9jQW1wXwoBCGZvbGRGdW5jAgNhY2MEZWxlbQQFaW5kZXgIBQNhY2MCXzEJAJQKAgkAZAIFBWluZGV4AAEDCAUDYWNjAl8yCQEYX3ZhbGlkYXRlQXNzZXRBbGxvY2F0aW9uBwUEZWxlbQURYXNzZXRUb3RhbFN1cHBseV8JAJEDAgUScHJldkFzc2V0QmFsYW5jZXNfBQVpbmRleAUVcHJldkFzc2V0VG90YWxTdXBwbHlfCQCRAwIFDWFzc2V0V2VpZ2h0c18FBWluZGV4BQxzaWdtYVdlaWdodF8FDG1heEFsbG9jQW1wXwcEBnJlc3VsdAoAAiRsBQ5hc3NldEJhbGFuY2VzXwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgAABgoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEIZm9sZEZ1bmMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoIBQZyZXN1bHQCXzIBC19jaGVja3BvaW50AQV1c2VyXwQGdXNlckxwCQELX2xvYWRVc2VyTHABBQV1c2VyXwQLdXNlclByb2ZpdHMJARBfbG9hZFVzZXJQcm9maXRzAQUFdXNlcl8EDXNpZ21hRmVlUGVyTHAJARJfbG9hZFNpZ21hRmVlUGVyTHAABBF1c2VyU2lnbWFGZWVQZXJMcAkBFl9sb2FkVXNlclNpZ21hRmVlUGVyTHABBQV1c2VyXwoBCGZvbGRGdW5jAgNhY2MEZWxlbQQFaW5kZXgIBQNhY2MCXzEEDXByb2ZpdFVwZGF0ZWQJAGQCCQCRAwIFC3VzZXJQcm9maXRzBQVpbmRleAkAoAMBCQC8AgMJALYCAQUGdXNlckxwCQC4AgIJAJEDAgUNc2lnbWFGZWVQZXJMcAUFaW5kZXgJAJEDAgURdXNlclNpZ21hRmVlUGVyTHAFBWluZGV4BQ5QRVJDRU5UX0ZBQ1RPUgkAlAoCCQBkAgUFaW5kZXgAAQkAzQgCCAUDYWNjAl8yBQ1wcm9maXRVcGRhdGVkBA0kdDAyNTI3NjI1MzQ5CgACJGwFEFpFUk9fSU5UX0xJU1RfMTEKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIAAAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQhmb2xkRnVuYwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTEJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALBANpZHgIBQ0kdDAyNTI3NjI1MzQ5Al8xBA5wcm9maXRzVXBkYXRlZAgFDSR0MDI1Mjc2MjUzNDkCXzIJAJQKAgkAzggCCQEQX3NhdmVVc2VyUHJvZml0cwIFBXVzZXJfBQ5wcm9maXRzVXBkYXRlZAkBFl9zYXZlVXNlclNpZ21hRmVlUGVyTHACBQV1c2VyXwUNc2lnbWFGZWVQZXJMcAUOcHJvZml0c1VwZGF0ZWQBFF91cGRhdGVTaWdtYUZlZVBlckxwBA5zaWdtYUZlZVBlckxwXwh0b3RhbExwXwZpbmRleF8GbHBGZWVfCgEIZm9sZEZ1bmMCA2FjYwRlbGVtBAVpbmRleAgFA2FjYwJfMQQUc2lnbWFGZWVQZXJMcFVwZGF0ZWQDCQAAAgUGaW5kZXhfBQVpbmRleAkAtwICCQCRAwIFDnNpZ21hRmVlUGVyTHBfBQVpbmRleAkAvAIDCQC2AgEFBmxwRmVlXwUOUEVSQ0VOVF9GQUNUT1IJALYCAQUIdG90YWxMcF8JAJEDAgUOc2lnbWFGZWVQZXJMcF8FBWluZGV4CQCUCgIJAGQCBQVpbmRleAABCQDNCAIIBQNhY2MCXzIFFHNpZ21hRmVlUGVyTHBVcGRhdGVkBA0kdDAyNTk5OTI2MDc4CgACJGwFEFpFUk9fSU5UX0xJU1RfMTEKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIAAAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQhmb2xkRnVuYwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTEJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALBANpZHgIBQ0kdDAyNTk5OTI2MDc4Al8xBBRzaWdtYUZlZVBlckxwVXBkYXRlZAgFDSR0MDI1OTk5MjYwNzgCXzIFFHNpZ21hRmVlUGVyTHBVcGRhdGVkARtfY2FsY3VsYXRlTHBBbmRQcm90b2NvbEZlZXMEC2Fzc2V0SW5kZXhfB2Ftb3VudF8KbHBGZWVSYXRlXxBwcm90b2NvbEZlZVJhdGVfBA1zaWdtYUZlZVBlckxwCQESX2xvYWRTaWdtYUZlZVBlckxwAAQHdG90YWxMcAkBDF9sb2FkVG90YWxMcAAEDSR0MDI2Mjk5MjY1NzQDCQAAAgUHdG90YWxMcAAACQCUCgIAAAkAawMFB2Ftb3VudF8FEHByb3RvY29sRmVlUmF0ZV8FB01BWF9GRUUJAJQKAgkAawMFB2Ftb3VudF8FCmxwRmVlUmF0ZV8FB01BWF9GRUUJAGsDBQdhbW91bnRfBRBwcm90b2NvbEZlZVJhdGVfBQdNQVhfRkVFBAVscEZlZQgFDSR0MDI2Mjk5MjY1NzQCXzEEC3Byb3RvY29sRmVlCAUNJHQwMjYyOTkyNjU3NAJfMgQUc2lnbWFGZWVQZXJMcFVwZGF0ZWQDCQAAAgUFbHBGZWUAAAUNc2lnbWFGZWVQZXJMcAkBFF91cGRhdGVTaWdtYUZlZVBlckxwBAUNc2lnbWFGZWVQZXJMcAUHdG90YWxMcAULYXNzZXRJbmRleF8FBWxwRmVlCQCVCgMFBWxwRmVlBQtwcm90b2NvbEZlZQUUc2lnbWFGZWVQZXJMcFVwZGF0ZWQBC19kZXBvc2l0QWxsAQdhbW91bnRfBAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAQNbHBUb3RhbFN1cHBseQgFB3N0b3JhZ2UCXzMED3dlaWdodEFtcGxpZmllcggFB3N0b3JhZ2UCXzcEDHNsaXBwYWdlUmF0ZQgFB3N0b3JhZ2UCXzgECmZlZU1heFJhdGUIBQdzdG9yYWdlAl85BAZhc3NldHMJAQtfbG9hZEFzc2V0cwAEDSR0MDI3MDgzMjcxMzYJARFfbG9hZEFzc2V0V2VpZ2h0cwAEDGFzc2V0V2VpZ2h0cwgFDSR0MDI3MDgzMjcxMzYCXzEEC3NpZ21hV2VpZ2h0CAUNJHQwMjcwODMyNzEzNgJfMgQNJHQwMjcxNDEyNzIwOQkBEl9sb2FkQXNzZXRCYWxhbmNlcwAEEXByZXZBc3NldEJhbGFuY2VzCAUNJHQwMjcxNDEyNzIwOQJfMQQUcHJldkFzc2V0VG90YWxTdXBwbHkIBQ0kdDAyNzE0MTI3MjA5Al8yBA0kdDAyNzIxNTI4NDYxAwkAAAIFFHByZXZBc3NldFRvdGFsU3VwcGx5BQtaRVJPX0JJR0lOVAoBCGZvbGRGdW5jAgNhY2MEZWxlbQQFaW5kZXgIBQNhY2MCXzEEGHJlcXVpcmVkQW1vdW50Tm9ybWFsaXplZAkAawMJAJEDAgUMYXNzZXRXZWlnaHRzBQVpbmRleAUHYW1vdW50XwULc2lnbWFXZWlnaHQJAJQKAgkAZAIFBWluZGV4AAEJAM0IAggFA2FjYwJfMgUYcmVxdWlyZWRBbW91bnROb3JtYWxpemVkBA0kdDAyNzY3MDI3NzQ0CgACJGwFBmFzc2V0cwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgAABQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCGZvbGRGdW5jAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKBANpZHgIBQ0kdDAyNzY3MDI3NzQ0Al8xBBlyZXF1aXJlZEFtb3VudHNOb3JtYWxpemVkCAUNJHQwMjc2NzAyNzc0NAJfMgkAlAoCBQdhbW91bnRfBRlyZXF1aXJlZEFtb3VudHNOb3JtYWxpemVkBAVyYXRpbwkAvAIDCQC2AgEFB2Ftb3VudF8FDlBFUkNFTlRfRkFDVE9SBRRwcmV2QXNzZXRUb3RhbFN1cHBseQoBCWZvbGRGdW5jMQIDYWNjBGVsZW0EBWluZGV4CAUDYWNjAl8xBBhyZXF1aXJlZEFtb3VudE5vcm1hbGl6ZWQJALwCAwUFcmF0aW8JAJEDAgURcHJldkFzc2V0QmFsYW5jZXMFBWluZGV4BQ5QRVJDRU5UX0ZBQ1RPUgkAlAoCCQBkAgUFaW5kZXgAAQkAzQgCCAUDYWNjAl8yBRhyZXF1aXJlZEFtb3VudE5vcm1hbGl6ZWQEDSR0MDI4MjYwMjgzMzUKAAIkbAUGYXNzZXRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCAAAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEJZm9sZEZ1bmMxAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKBANpZHgIBQ0kdDAyODI2MDI4MzM1Al8xBBlyZXF1aXJlZEFtb3VudHNOb3JtYWxpemVkCAUNJHQwMjgyNjAyODMzNQJfMgkAlAoCCQCgAwEJALwCAwkAtgIBBQdhbW91bnRfCQC2AgEFDWxwVG90YWxTdXBwbHkFFHByZXZBc3NldFRvdGFsU3VwcGx5BRlyZXF1aXJlZEFtb3VudHNOb3JtYWxpemVkBA5scFRva2Vuc1RvTWludAgFDSR0MDI3MjE1Mjg0NjECXzEEGXJlcXVpcmVkQW1vdW50c05vcm1hbGl6ZWQIBQ0kdDAyNzIxNTI4NDYxAl8yBA0kdDAyODQ2NzI4NTgwCQEbX2luY3JlbWVudEJhbGFuY2VzQnlBbW91bnRzAgURcHJldkFzc2V0QmFsYW5jZXMFGXJlcXVpcmVkQW1vdW50c05vcm1hbGl6ZWQEDWFzc2V0QmFsYW5jZXMIBQ0kdDAyODQ2NzI4NTgwAl8xBBBhc3NldFRvdGFsU3VwcGx5CAUNJHQwMjg0NjcyODU4MAJfMgQEZXJyMgkBG192YWxpZGF0ZUxpcXVpZGl0eUludmFyaWFudAsFEXByZXZBc3NldEJhbGFuY2VzBRRwcmV2QXNzZXRUb3RhbFN1cHBseQUNYXNzZXRCYWxhbmNlcwUQYXNzZXRUb3RhbFN1cHBseQUNbHBUb3RhbFN1cHBseQkAZAIFDWxwVG90YWxTdXBwbHkFDmxwVG9rZW5zVG9NaW50BQxhc3NldFdlaWdodHMFC3NpZ21hV2VpZ2h0BQ93ZWlnaHRBbXBsaWZpZXIFDHNsaXBwYWdlUmF0ZQUKZmVlTWF4UmF0ZQMJAAACBQRlcnIyBQRlcnIyCQCVCgMFDmxwVG9rZW5zVG9NaW50BRlyZXF1aXJlZEFtb3VudHNOb3JtYWxpemVkBQ1hc3NldEJhbGFuY2VzCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQhfZGVwb3NpdAIIYXNzZXRJZF8HYW1vdW50XwQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQAEDWxwVG90YWxTdXBwbHkIBQdzdG9yYWdlAl8zBBFtYXhBbGxvY0FtcGxpZmllcggFB3N0b3JhZ2UCXzYED3dlaWdodEFtcGxpZmllcggFB3N0b3JhZ2UCXzcEDHNsaXBwYWdlUmF0ZQgFB3N0b3JhZ2UCXzgECmZlZU1heFJhdGUIBQdzdG9yYWdlAl85BAZhc3NldHMJAQtfbG9hZEFzc2V0cwAEDSR0MDI5Mjc4MjkzMzEJARFfbG9hZEFzc2V0V2VpZ2h0cwAEDGFzc2V0V2VpZ2h0cwgFDSR0MDI5Mjc4MjkzMzECXzEEC3NpZ21hV2VpZ2h0CAUNJHQwMjkyNzgyOTMzMQJfMgQNJHQwMjkzMzYyOTQ1MAkBEl9sb2FkQXNzZXRCYWxhbmNlcwAEEXByZXZBc3NldEJhbGFuY2VzCAUNJHQwMjkzMzYyOTQ1MAJfMQQUcHJldkFzc2V0VG90YWxTdXBwbHkIBQ0kdDAyOTMzNjI5NDUwAl8yBA1hc3NldEJhbGFuY2VzCQEYX2luY3JlbWVudEJhbGFuY2VCeUluZGV4AwURcHJldkFzc2V0QmFsYW5jZXMJAQV2YWx1ZQEJAM8IAgUGYXNzZXRzBQhhc3NldElkXwUHYW1vdW50XwQQYXNzZXRUb3RhbFN1cHBseQkAtwICBRRwcmV2QXNzZXRUb3RhbFN1cHBseQUHYW1vdW50XwQEZXJyMgkBE192YWxpZGF0ZUFsbG9jYXRpb24HBQ1hc3NldEJhbGFuY2VzBRBhc3NldFRvdGFsU3VwcGx5BRFwcmV2QXNzZXRCYWxhbmNlcwUUcHJldkFzc2V0VG90YWxTdXBwbHkFDGFzc2V0V2VpZ2h0cwULc2lnbWFXZWlnaHQFEW1heEFsbG9jQW1wbGlmaWVyAwkAAAIFBGVycjIFBGVycjIEB3ByZXZGZWUJAQ1fY2FsY3VsYXRlRmVlBwURcHJldkFzc2V0QmFsYW5jZXMFFHByZXZBc3NldFRvdGFsU3VwcGx5BQxhc3NldFdlaWdodHMFC3NpZ21hV2VpZ2h0BQ93ZWlnaHRBbXBsaWZpZXIFDHNsaXBwYWdlUmF0ZQUKZmVlTWF4UmF0ZQQDZmVlCQENX2NhbGN1bGF0ZUZlZQcFDWFzc2V0QmFsYW5jZXMFEGFzc2V0VG90YWxTdXBwbHkFDGFzc2V0V2VpZ2h0cwULc2lnbWFXZWlnaHQFD3dlaWdodEFtcGxpZmllcgUMc2xpcHBhZ2VSYXRlBQpmZWVNYXhSYXRlBA5scFRva2Vuc1RvTWludAMJAAACBQ1scFRvdGFsU3VwcGx5AAAJAKADAQkAuAICBRBhc3NldFRvdGFsU3VwcGx5BQNmZWUECWFzc2V0RGlmZgkAuAICBRBhc3NldFRvdGFsU3VwcGx5BRRwcmV2QXNzZXRUb3RhbFN1cHBseQQHZmVlRGlmZgkAuAICBQNmZWUFB3ByZXZGZWUEE3V0aWxpdHlDaGFuZ2VGYWN0b3IJALwCAwkAuAICBQlhc3NldERpZmYFB2ZlZURpZmYFC1JBVEVfRkFDVE9SCQC4AgIFFHByZXZBc3NldFRvdGFsU3VwcGx5BQdwcmV2RmVlBBNscFRva2Vuc1RvTWludElubmVyCQCgAwEJALwCAwkAtgIBBQ1scFRvdGFsU3VwcGx5BRN1dGlsaXR5Q2hhbmdlRmFjdG9yBQtSQVRFX0ZBQ1RPUgQEZXJyMwkBG192YWxpZGF0ZUxpcXVpZGl0eUludmFyaWFudAsFEXByZXZBc3NldEJhbGFuY2VzBRRwcmV2QXNzZXRUb3RhbFN1cHBseQUNYXNzZXRCYWxhbmNlcwUQYXNzZXRUb3RhbFN1cHBseQUNbHBUb3RhbFN1cHBseQkAZAIFDWxwVG90YWxTdXBwbHkFE2xwVG9rZW5zVG9NaW50SW5uZXIFDGFzc2V0V2VpZ2h0cwULc2lnbWFXZWlnaHQFD3dlaWdodEFtcGxpZmllcgUMc2xpcHBhZ2VSYXRlBQpmZWVNYXhSYXRlAwkAAAIFBGVycjMFBGVycjMFE2xwVG9rZW5zVG9NaW50SW5uZXIJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAJQKAgUObHBUb2tlbnNUb01pbnQFDWFzc2V0QmFsYW5jZXMJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BDF93aXRoZHJhd0FsbAEHYW1vdW50XwQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQAEDWxwVG90YWxTdXBwbHkIBQdzdG9yYWdlAl8zBAlscEZlZVJhdGUIBQdzdG9yYWdlAl80BA9wcm90b2NvbEZlZVJhdGUIBQdzdG9yYWdlAl81BBFtYXhBbGxvY0FtcGxpZmllcggFB3N0b3JhZ2UCXzYED3dlaWdodEFtcGxpZmllcggFB3N0b3JhZ2UCXzcEDHNsaXBwYWdlUmF0ZQgFB3N0b3JhZ2UCXzgECmZlZU1heFJhdGUIBQdzdG9yYWdlAl85BA0kdDAzMTQ2MDMxNTI4CQESX2xvYWRBc3NldEJhbGFuY2VzAAQRcHJldkFzc2V0QmFsYW5jZXMIBQ0kdDAzMTQ2MDMxNTI4Al8xBBRwcmV2QXNzZXRUb3RhbFN1cHBseQgFDSR0MDMxNDYwMzE1MjgCXzIEDSR0MDMxNTMzMzE1ODYJARFfbG9hZEFzc2V0V2VpZ2h0cwAEDGFzc2V0V2VpZ2h0cwgFDSR0MDMxNTMzMzE1ODYCXzEEC3NpZ21hV2VpZ2h0CAUNJHQwMzE1MzMzMTU4NgJfMgQObHBUb2tlbnNUb0J1cm4FB2Ftb3VudF8EDSR0MDMxNjI1MzE3ODAJARxfZGVjcmVtZW50QmFsYW5jZXNCeUxwQW1vdW50AwURcHJldkFzc2V0QmFsYW5jZXMJALYCAQUObHBUb2tlbnNUb0J1cm4JALYCAQUNbHBUb3RhbFN1cHBseQQNYXNzZXRCYWxhbmNlcwgFDSR0MDMxNjI1MzE3ODACXzEEEGFzc2V0VG90YWxTdXBwbHkIBQ0kdDAzMTYyNTMxNzgwAl8yBA1iYWxhbmNlc1RvUGF5CAUNJHQwMzE2MjUzMTc4MAJfMwQEZXJyMgkBG192YWxpZGF0ZUxpcXVpZGl0eUludmFyaWFudAsFEXByZXZBc3NldEJhbGFuY2VzBRRwcmV2QXNzZXRUb3RhbFN1cHBseQUNYXNzZXRCYWxhbmNlcwUQYXNzZXRUb3RhbFN1cHBseQUNbHBUb3RhbFN1cHBseQkAZQIFDWxwVG90YWxTdXBwbHkFDmxwVG9rZW5zVG9CdXJuBQxhc3NldFdlaWdodHMFC3NpZ21hV2VpZ2h0BQ93ZWlnaHRBbXBsaWZpZXIFDHNsaXBwYWdlUmF0ZQUKZmVlTWF4UmF0ZQMJAAACBQRlcnIyBQRlcnIyCQCVCgMFDmxwVG9rZW5zVG9CdXJuBQ1iYWxhbmNlc1RvUGF5BQ1hc3NldEJhbGFuY2VzCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQlfd2l0aGRyYXcCCGFzc2V0SWRfCWxwQW1vdW50XwQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQAEDWxwVG90YWxTdXBwbHkIBQdzdG9yYWdlAl8zBAlscEZlZVJhdGUIBQdzdG9yYWdlAl80BA9wcm90b2NvbEZlZVJhdGUIBQdzdG9yYWdlAl81BBFtYXhBbGxvY0FtcGxpZmllcggFB3N0b3JhZ2UCXzYED3dlaWdodEFtcGxpZmllcggFB3N0b3JhZ2UCXzcEDHNsaXBwYWdlUmF0ZQgFB3N0b3JhZ2UCXzgECmZlZU1heFJhdGUIBQdzdG9yYWdlAl85BAlwcmVjaXNpb24JAQ5fbG9hZFByZWNpc2lvbgAEBmFzc2V0cwkBC19sb2FkQXNzZXRzAAQNJHQwMzI1NzIzMjY0MAkBEl9sb2FkQXNzZXRCYWxhbmNlcwAEEXByZXZBc3NldEJhbGFuY2VzCAUNJHQwMzI1NzIzMjY0MAJfMQQUcHJldkFzc2V0VG90YWxTdXBwbHkIBQ0kdDAzMjU3MjMyNjQwAl8yBA0kdDAzMjY0NTMyNjk4CQERX2xvYWRBc3NldFdlaWdodHMABAxhc3NldFdlaWdodHMIBQ0kdDAzMjY0NTMyNjk4Al8xBAtzaWdtYVdlaWdodAgFDSR0MDMyNjQ1MzI2OTgCXzIEEHRhcmdldEFzc2V0SW5kZXgJAQV2YWx1ZQEJAM8IAgUGYXNzZXRzBQhhc3NldElkXwQHcHJldkZlZQkBDV9jYWxjdWxhdGVGZWUHBRFwcmV2QXNzZXRCYWxhbmNlcwUUcHJldkFzc2V0VG90YWxTdXBwbHkFDGFzc2V0V2VpZ2h0cwULc2lnbWFXZWlnaHQFD3dlaWdodEFtcGxpZmllcgUMc2xpcHBhZ2VSYXRlBQpmZWVNYXhSYXRlBA1wcmV2VXRpbFZhbHVlCQC4AgIFFHByZXZBc3NldFRvdGFsU3VwcGx5BQdwcmV2RmVlBAFrCQC8AgMJALYCAQkAZQIFDWxwVG90YWxTdXBwbHkFCWxwQW1vdW50XwUOUEVSQ0VOVF9GQUNUT1IJALYCAQUNbHBUb3RhbFN1cHBseQQScHJldlV0aWxWYWx1ZVdpdGhLCQC8AgMFDXByZXZVdGlsVmFsdWUFAWsFDlBFUkNFTlRfRkFDVE9SCgEIZm9sZEZ1bmMCA2FjYwRlbGVtAwgFA2FjYwJfMQUDYWNjBApzdGFydElubmVyCAUDYWNjAl8yBAlzdG9wSW5uZXIIBQNhY2MCXzMEDWN1cnJlbnRBbW91bnQJALoCAgkAtwICBQlzdG9wSW5uZXIFCnN0YXJ0SW5uZXIJALYCAQACBBF0ZW1wQXNzZXRCYWxhbmNlcwkBGF9kZWNyZW1lbnRCYWxhbmNlQnlJbmRleAMFEXByZXZBc3NldEJhbGFuY2VzBRB0YXJnZXRBc3NldEluZGV4BQ1jdXJyZW50QW1vdW50BBR0ZW1wQXNzZXRUb3RhbFN1cHBseQkAuAICBRRwcmV2QXNzZXRUb3RhbFN1cHBseQUNY3VycmVudEFtb3VudAQJdXRpbFZhbHVlCQC4AgIFFHRlbXBBc3NldFRvdGFsU3VwcGx5CQENX2NhbGN1bGF0ZUZlZQcFEXRlbXBBc3NldEJhbGFuY2VzBRR0ZW1wQXNzZXRUb3RhbFN1cHBseQUMYXNzZXRXZWlnaHRzBQtzaWdtYVdlaWdodAUPd2VpZ2h0QW1wbGlmaWVyBQxzbGlwcGFnZVJhdGUFCmZlZU1heFJhdGUDAwkAvwICCQC2AgEFCXByZWNpc2lvbgkAuAICBQl1dGlsVmFsdWUFEnByZXZVdGlsVmFsdWVXaXRoSwkAwAICCQC4AgIFCXV0aWxWYWx1ZQUScHJldlV0aWxWYWx1ZVdpdGhLBQtaRVJPX0JJR0lOVAcJAJYKBAYFCnN0YXJ0SW5uZXIFCXN0b3BJbm5lcgUNY3VycmVudEFtb3VudAMJAL8CAgULWkVST19CSUdJTlQJALgCAgUJdXRpbFZhbHVlBRJwcmV2VXRpbFZhbHVlV2l0aEsJAJYKBAcFCnN0YXJ0SW5uZXIFDWN1cnJlbnRBbW91bnQFC1pFUk9fQklHSU5UCQCWCgQHBQ1jdXJyZW50QW1vdW50BQlzdG9wSW5uZXIFC1pFUk9fQklHSU5UBAx0YXJnZXRBbW91bnQEDSR0MDM0MjYzMzQ0MDkKAAIkbAUHTElTVF82NAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJYKBAcFC1pFUk9fQklHSU5UCQC3AgIJALYCAQUJbHBBbW91bnRfBQdwcmV2RmVlBQtaRVJPX0JJR0lOVAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEIZm9sZEZ1bmMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDIwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAQHc3VjY2VzcwgFDSR0MDM0MjYzMzQ0MDkCXzEECHN0YXJ0T3V0CAUNJHQwMzQyNjMzNDQwOQJfMgQHc3RvcE91dAgFDSR0MDM0MjYzMzQ0MDkCXzMED3RhcmdldEFtb3VudE91dAgFDSR0MDM0MjYzMzQ0MDkCXzQDCQEBIQEFB3N1Y2Nlc3MJAAIBCQCsAgICKF93aXRoZHJhdzogY2FuJ3QgY2FsY3VsYXRlIHRhcmdldEFtb3VudD0JAKYDAQUPdGFyZ2V0QW1vdW50T3V0BQ90YXJnZXRBbW91bnRPdXQEEmZpbmFsQXNzZXRCYWxhbmNlcwkBGF9kZWNyZW1lbnRCYWxhbmNlQnlJbmRleAMFEXByZXZBc3NldEJhbGFuY2VzBRB0YXJnZXRBc3NldEluZGV4BQx0YXJnZXRBbW91bnQEFWZpbmFsQXNzZXRUb3RhbFN1cHBseQkAuAICBRRwcmV2QXNzZXRUb3RhbFN1cHBseQUMdGFyZ2V0QW1vdW50BARlcnIxAwkBE192YWxpZGF0ZUFsbG9jYXRpb24HBRJmaW5hbEFzc2V0QmFsYW5jZXMFFWZpbmFsQXNzZXRUb3RhbFN1cHBseQURcHJldkFzc2V0QmFsYW5jZXMFFHByZXZBc3NldFRvdGFsU3VwcGx5BQxhc3NldFdlaWdodHMFC3NpZ21hV2VpZ2h0BRFtYXhBbGxvY0FtcGxpZmllcgkBG192YWxpZGF0ZUxpcXVpZGl0eUludmFyaWFudAsFEXByZXZBc3NldEJhbGFuY2VzBRRwcmV2QXNzZXRUb3RhbFN1cHBseQUSZmluYWxBc3NldEJhbGFuY2VzBRVmaW5hbEFzc2V0VG90YWxTdXBwbHkFDWxwVG90YWxTdXBwbHkJAGUCBQ1scFRvdGFsU3VwcGx5BQlscEFtb3VudF8FDGFzc2V0V2VpZ2h0cwULc2lnbWFXZWlnaHQFD3dlaWdodEFtcGxpZmllcgUMc2xpcHBhZ2VSYXRlBQpmZWVNYXhSYXRlBwMJAAACBQRlcnIxBQRlcnIxBA0kdDAzNTI4NDM1NDMyCQEbX2NhbGN1bGF0ZUxwQW5kUHJvdG9jb2xGZWVzBAkAZAIFEHRhcmdldEFzc2V0SW5kZXgAAQkAoAMBBQx0YXJnZXRBbW91bnQFCWxwRmVlUmF0ZQUPcHJvdG9jb2xGZWVSYXRlBAVscEZlZQgFDSR0MDM1Mjg0MzU0MzICXzEEC3Byb3RvY29sRmVlCAUNJHQwMzUyODQzNTQzMgJfMgQUc2lnbWFGZWVQZXJMcFVwZGF0ZWQIBQ0kdDAzNTI4NDM1NDMyAl8zCQCXCgUFDHRhcmdldEFtb3VudAUSZmluYWxBc3NldEJhbGFuY2VzBQVscEZlZQULcHJvdG9jb2xGZWUFFHNpZ21hRmVlUGVyTHBVcGRhdGVkCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQVfc3dhcAMRc291cmNlQXNzZXRJbmRleF8RdGFyZ2V0QXNzZXRJbmRleF8Nc291cmNlQW1vdW50XwQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQAECWxwQXNzZXRJZAgFB3N0b3JhZ2UCXzEECmxwRGVjaW1hbHMJAQxfZ2V0RGVjaW1hbHMBCQDYBAEFCWxwQXNzZXRJZAQNbHBUb3RhbFN1cHBseQgFB3N0b3JhZ2UCXzMECWxwRmVlUmF0ZQgFB3N0b3JhZ2UCXzQED3Byb3RvY29sRmVlUmF0ZQgFB3N0b3JhZ2UCXzUEEW1heEFsbG9jQW1wbGlmaWVyCAUHc3RvcmFnZQJfNgQPd2VpZ2h0QW1wbGlmaWVyCAUHc3RvcmFnZQJfNwQMc2xpcHBhZ2VSYXRlCAUHc3RvcmFnZQJfOAQKZmVlTWF4UmF0ZQgFB3N0b3JhZ2UCXzkECXByZWNpc2lvbgkBDl9sb2FkUHJlY2lzaW9uAAQNJHQwMzYwMTczNjA4NQkBEl9sb2FkQXNzZXRCYWxhbmNlcwAEEXByZXZBc3NldEJhbGFuY2VzCAUNJHQwMzYwMTczNjA4NQJfMQQUcHJldkFzc2V0VG90YWxTdXBwbHkIBQ0kdDAzNjAxNzM2MDg1Al8yBA0kdDAzNjA5MDM2MTQzCQERX2xvYWRBc3NldFdlaWdodHMABAxhc3NldFdlaWdodHMIBQ0kdDAzNjA5MDM2MTQzAl8xBAtzaWdtYVdlaWdodAgFDSR0MDM2MDkwMzYxNDMCXzIEDWFzc2V0QmFsYW5jZXMJARhfaW5jcmVtZW50QmFsYW5jZUJ5SW5kZXgDBRFwcmV2QXNzZXRCYWxhbmNlcwURc291cmNlQXNzZXRJbmRleF8FDXNvdXJjZUFtb3VudF8EEGFzc2V0VG90YWxTdXBwbHkJALcCAgUUcHJldkFzc2V0VG90YWxTdXBwbHkFDXNvdXJjZUFtb3VudF8EB3ByZXZGZWUJAQ1fY2FsY3VsYXRlRmVlBwURcHJldkFzc2V0QmFsYW5jZXMFFHByZXZBc3NldFRvdGFsU3VwcGx5BQxhc3NldFdlaWdodHMFC3NpZ21hV2VpZ2h0BQ93ZWlnaHRBbXBsaWZpZXIFDHNsaXBwYWdlUmF0ZQUKZmVlTWF4UmF0ZQQNcHJldlV0aWxWYWx1ZQkAuAICBRRwcmV2QXNzZXRUb3RhbFN1cHBseQUHcHJldkZlZQoBCGZvbGRGdW5jAgNhY2MEZWxlbQMIBQNhY2MCXzEFA2FjYwQKc3RhcnRJbm5lcggFA2FjYwJfMgQJc3RvcElubmVyCAUDYWNjAl8zBA1jdXJyZW50QW1vdW50CQC6AgIJALcCAgUJc3RvcElubmVyBQpzdGFydElubmVyCQC2AgEAAgQRdGVtcEFzc2V0QmFsYW5jZXMJARhfZGVjcmVtZW50QmFsYW5jZUJ5SW5kZXgDBQ1hc3NldEJhbGFuY2VzBRF0YXJnZXRBc3NldEluZGV4XwUNY3VycmVudEFtb3VudAQUdGVtcEFzc2V0VG90YWxTdXBwbHkJALgCAgUQYXNzZXRUb3RhbFN1cHBseQUNY3VycmVudEFtb3VudAQJdXRpbFZhbHVlCQC4AgIFFHRlbXBBc3NldFRvdGFsU3VwcGx5CQENX2NhbGN1bGF0ZUZlZQcFEXRlbXBBc3NldEJhbGFuY2VzBRR0ZW1wQXNzZXRUb3RhbFN1cHBseQUMYXNzZXRXZWlnaHRzBQtzaWdtYVdlaWdodAUPd2VpZ2h0QW1wbGlmaWVyBQxzbGlwcGFnZVJhdGUFCmZlZU1heFJhdGUDAwkAvwICCQC2AgEFCXByZWNpc2lvbgkAuAICBQl1dGlsVmFsdWUFDXByZXZVdGlsVmFsdWUJAMACAgkAuAICBQl1dGlsVmFsdWUFDXByZXZVdGlsVmFsdWUFC1pFUk9fQklHSU5UBwkAlgoEBgUKc3RhcnRJbm5lcgUJc3RvcElubmVyBQ1jdXJyZW50QW1vdW50AwkAvwICBQtaRVJPX0JJR0lOVAkAuAICBQl1dGlsVmFsdWUFDXByZXZVdGlsVmFsdWUJAJcKBQcFCnN0YXJ0SW5uZXIFDWN1cnJlbnRBbW91bnQFDWN1cnJlbnRBbW91bnQJAM0IAggFA2FjYwJfNQUJdXRpbFZhbHVlCQCXCgUHBQ1jdXJyZW50QW1vdW50BQlzdG9wSW5uZXIFDWN1cnJlbnRBbW91bnQJAM0IAggFA2FjYwJfNQUJdXRpbFZhbHVlBAx0YXJnZXRBbW91bnQEDHRhcmdldEFtb3VudAUNc291cmNlQW1vdW50XwQRdGVtcEFzc2V0QmFsYW5jZXMJARhfZGVjcmVtZW50QmFsYW5jZUJ5SW5kZXgDBQ1hc3NldEJhbGFuY2VzBRF0YXJnZXRBc3NldEluZGV4XwUMdGFyZ2V0QW1vdW50BBR0ZW1wQXNzZXRUb3RhbFN1cHBseQkAuAICBRBhc3NldFRvdGFsU3VwcGx5BQx0YXJnZXRBbW91bnQEA2ZlZQkBDV9jYWxjdWxhdGVGZWUHBRF0ZW1wQXNzZXRCYWxhbmNlcwUUdGVtcEFzc2V0VG90YWxTdXBwbHkFDGFzc2V0V2VpZ2h0cwULc2lnbWFXZWlnaHQFD3dlaWdodEFtcGxpZmllcgUMc2xpcHBhZ2VSYXRlBQpmZWVNYXhSYXRlBAdmZWVEaWZmCQC4AgIFA2ZlZQUHcHJldkZlZQMJAAACBQdmZWVEaWZmBQtaRVJPX0JJR0lOVAUMdGFyZ2V0QW1vdW50BA0kdDAzODU1NDM4NzA0CgACJGwFB0xJU1RfNjQKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCXCgUHBQtaRVJPX0JJR0lOVAkAtwICBQ1zb3VyY2VBbW91bnRfBQdwcmV2RmVlBQtaRVJPX0JJR0lOVAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQhmb2xkRnVuYwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgNDYJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUABUAFgAXABgAGQAaABsAHAAdAB4AHwAgACEAIgAjACQAJQAmACcAKAApACoAKwAsAC0ALgQHc3VjY2VzcwgFDSR0MDM4NTU0Mzg3MDQCXzEECHN0YXJ0T3V0CAUNJHQwMzg1NTQzODcwNAJfMgQHc3RvcE91dAgFDSR0MDM4NTU0Mzg3MDQCXzMED3RhcmdldEFtb3VudE91dAgFDSR0MDM4NTU0Mzg3MDQCXzQEBWRlYnVnCAUNJHQwMzg1NTQzODcwNAJfNQMJAQEhAQUHc3VjY2VzcwkAAgEJARNfbGlzdEJpZ0ludFRvU3RyaW5nAQUFZGVidWcFD3RhcmdldEFtb3VudE91dAQSZmluYWxBc3NldEJhbGFuY2VzCQEYX2RlY3JlbWVudEJhbGFuY2VCeUluZGV4AwUNYXNzZXRCYWxhbmNlcwURdGFyZ2V0QXNzZXRJbmRleF8FDHRhcmdldEFtb3VudAQVZmluYWxBc3NldFRvdGFsU3VwcGx5CQC4AgIFEGFzc2V0VG90YWxTdXBwbHkFDHRhcmdldEFtb3VudAQEZXJyMQMJARNfdmFsaWRhdGVBbGxvY2F0aW9uBwUSZmluYWxBc3NldEJhbGFuY2VzBRVmaW5hbEFzc2V0VG90YWxTdXBwbHkFEXByZXZBc3NldEJhbGFuY2VzBRRwcmV2QXNzZXRUb3RhbFN1cHBseQUMYXNzZXRXZWlnaHRzBQtzaWdtYVdlaWdodAURbWF4QWxsb2NBbXBsaWZpZXIJARZfdmFsaWRhdGVTd2FwSW52YXJpYW50CQURcHJldkFzc2V0QmFsYW5jZXMFFHByZXZBc3NldFRvdGFsU3VwcGx5BRJmaW5hbEFzc2V0QmFsYW5jZXMFFWZpbmFsQXNzZXRUb3RhbFN1cHBseQUMYXNzZXRXZWlnaHRzBQtzaWdtYVdlaWdodAUPd2VpZ2h0QW1wbGlmaWVyBQxzbGlwcGFnZVJhdGUFCmZlZU1heFJhdGUHAwkAAAIFBGVycjEFBGVycjEEDSR0MDM5NTcwMzk3MTkJARtfY2FsY3VsYXRlTHBBbmRQcm90b2NvbEZlZXMECQBkAgURdGFyZ2V0QXNzZXRJbmRleF8AAQkAoAMBBQx0YXJnZXRBbW91bnQFCWxwRmVlUmF0ZQUPcHJvdG9jb2xGZWVSYXRlBAVscEZlZQgFDSR0MDM5NTcwMzk3MTkCXzEEC3Byb3RvY29sRmVlCAUNJHQwMzk1NzAzOTcxOQJfMgQUc2lnbWFGZWVQZXJMcFVwZGF0ZWQIBQ0kdDAzOTU3MDM5NzE5Al8zCQCXCgUFDHRhcmdldEFtb3VudAUSZmluYWxBc3NldEJhbGFuY2VzBQVscEZlZQULcHJvdG9jb2xGZWUFFHNpZ21hRmVlUGVyTHBVcGRhdGVkCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuFQFpAQRpbml0Dgdhc3NldHNfDWFzc2V0V2VpZ2h0c18KbHBGZWVSYXRlXxBwcm90b2NvbEZlZVJhdGVfDGxwVG9rZW5OYW1lXw1scFRva2VuRGVzY3JfEGxwVG9rZW5EZWNpbWFsc18XbWF4QWxsb2NhdGlvbkFtcGxpZmllcl8Qd2VpZ2h0QW1wbGlmaWVyXw1zbGlwcGFnZVJhdGVfC2ZlZU1heFJhdGVfFHByb3RvY29sRmVlQ29udHJhY3RfCnByZWNpc2lvbl8HcGF1c2VyXwQDZXJyAwMDAwMDAwMDAwMDAwMDAwMJARFfb25seVRoaXNDb250cmFjdAEIBQFpBmNhbGxlcgkBE193aGVuTm90SW5pdGlhbGl6ZWQABwkBEF93aGVuTXVsdGlzaWdTZXQABwkBD192YWxpZGF0ZUFzc2V0cwIFB2Fzc2V0c18CFGluaXQ6IGludmFsaWQgYXNzZXRzBwkBEF92YWxpZGF0ZUludExpc3QEBQ1hc3NldFdlaWdodHNfAAEFCk1BWF9XRUlHSFQCGmluaXQ6IGludmFsaWQgYXNzZXRXZWlnaHRzBwkBEl92YWxpZGF0ZUludEVxdWFscwMJAJADAQUHYXNzZXRzXwkAkAMBBQ1hc3NldFdlaWdodHNfAh9pbml0OiBpbnZhbGlkIGFzc2V0V2VpZ2h0cyBzaXplBwkBDF92YWxpZGF0ZUludAQFCmxwRmVlUmF0ZV8AAAUHTUFYX0ZFRQIUaW5pdDogaW52YWxpZCBscCBmZWUHCQEMX3ZhbGlkYXRlSW50BAUQcHJvdG9jb2xGZWVSYXRlXwAABQdNQVhfRkVFAhppbml0OiBpbnZhbGlkIHByb3RvY29sIGZlZQcJARJfdmFsaWRhdGVUb2tlbk5hbWUCBQxscFRva2VuTmFtZV8CEmluaXQ6IGludmFsaWQgbmFtZQcJARNfdmFsaWRhdGVUb2tlbkRlc2NyAgUNbHBUb2tlbkRlc2NyXwITaW5pdDogaW52YWxpZCBkZXNjcgcJARFfdmFsaWRhdGVEZWNpbWFscwIFEGxwVG9rZW5EZWNpbWFsc18CFmluaXQ6IGludmFsaWQgZGVjaW1hbHMHCQEMX3ZhbGlkYXRlSW50BAUXbWF4QWxsb2NhdGlvbkFtcGxpZmllcl8AAAkAoAMBBQ1NQVhfQU1QTElGSUVSAiRpbml0OiBpbnZhbGlkIG1heEFsbG9jYXRpb25BbXBsaWZpZXIHCQEMX3ZhbGlkYXRlSW50BAUQd2VpZ2h0QW1wbGlmaWVyXwAABRdtYXhBbGxvY2F0aW9uQW1wbGlmaWVyXwIdaW5pdDogaW52YWxpZCB3ZWlnaHRBbXBsaWZpZXIHCQEMX3ZhbGlkYXRlSW50BAUNc2xpcHBhZ2VSYXRlXwAABQdNQVhfSU5UAhppbml0OiBpbnZhbGlkIHNsaXBwYWdlUmF0ZQcJAQxfdmFsaWRhdGVJbnQEBQtmZWVNYXhSYXRlXwAABQdNQVhfSU5UAhhpbml0OiBpbnZhbGlkIGZlZU1heFJhdGUHCQEQX3ZhbGlkYXRlQWRkcmVzcwIFFHByb3RvY29sRmVlQ29udHJhY3RfAiFpbml0OiBpbnZhbGlkIHByb3RvY29sRmVlQ29udHJhY3QHCQEMX3ZhbGlkYXRlSW50BAUKcHJlY2lzaW9uXwABBQdNQVhfSU5UAhdpbml0OiBpbnZhbGlkIHByZWNpc2lvbgcJARBfdmFsaWRhdGVBZGRyZXNzAgUHcGF1c2VyXwIUaW5pdDogaW52YWxpZCBwYXVzZXIHAwkAAAIFA2VycgUDZXJyBA0kdDA0MTU5MDQxNjU5CQEUX3ByZXBhcmVBc3NldFdlaWdodHMBBQ1hc3NldFdlaWdodHNfBAxhc3NldFdlaWdodHMIBQ0kdDA0MTU5MDQxNjU5Al8xBAtzaWdtYVdlaWdodAgFDSR0MDQxNTkwNDE2NTkCXzIEDWFzc2V0QmFsYW5jZXMJARVfcHJlcGFyZUFzc2V0QmFsYW5jZXMBBQdhc3NldHNfBAVpc3N1ZQkAwggFBQxscFRva2VuTmFtZV8FDWxwVG9rZW5EZXNjcl8AAAUQbHBUb2tlbkRlY2ltYWxzXwYECWxwQXNzZXRJZAkAuAgBBQVpc3N1ZQQOc3RvcmFnZVVwZGF0ZWQJAJwKCgUJbHBBc3NldElkBgAABQpscEZlZVJhdGVfBRBwcm90b2NvbEZlZVJhdGVfCQC2AgEFF21heEFsbG9jYXRpb25BbXBsaWZpZXJfCQC2AgEFEHdlaWdodEFtcGxpZmllcl8JALYCAQUNc2xpcHBhZ2VSYXRlXwkAtgIBBQtmZWVNYXhSYXRlXwkBEUBleHRyTmF0aXZlKDEwNjIpAQUUcHJvdG9jb2xGZWVDb250cmFjdF8JAJQKAgkAzggCCQDOCAIJAM4IAgkAzggCCQDOCAIJAM4IAgkAzggCCQDMCAIFBWlzc3VlBQNuaWwJAQxfc2F2ZVN0b3JhZ2UBBQ5zdG9yYWdlVXBkYXRlZAkBC19zYXZlQXNzZXRzAQUHYXNzZXRzXwkBEl9zYXZlQXNzZXRCYWxhbmNlcwEFDWFzc2V0QmFsYW5jZXMJARFfc2F2ZUFzc2V0V2VpZ2h0cwEFDGFzc2V0V2VpZ2h0cwkBDl9zYXZlUHJlY2lzaW9uAQUKcHJlY2lzaW9uXwkBEl9zYXZlU2lnbWFGZWVQZXJMcAEJARJfbG9hZFNpZ21hRmVlUGVyTHAACQELX3NhdmVQYXVzZXIBCQERQGV4dHJOYXRpdmUoMTA2MikBBQdwYXVzZXJfBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCmRlcG9zaXRBbGwBB2Ftb3VudF8EA2VycgMDCQEQX3doZW5Jbml0aWFsaXplZAAJAQ5fd2hlbk5vdFBhdXNlZAAHCQEMX3ZhbGlkYXRlSW50BAUHYW1vdW50XwAABQdNQVhfSU5UAhpkZXBvc2l0QWxsOiBpbnZhbGlkIGFtb3VudAcDCQAAAgUDZXJyBQNlcnIEB3N0b3JhZ2UJAQxfbG9hZFN0b3JhZ2UABAlscEFzc2V0SWQIBQdzdG9yYWdlAl8xBApscERlY2ltYWxzCQEMX2dldERlY2ltYWxzAQkA2AQBBQlscEFzc2V0SWQEBmFzc2V0cwkBC19sb2FkQXNzZXRzAAQNJHQwNDM0MDk0MzQ5NAkBC19kZXBvc2l0QWxsAQUHYW1vdW50XwQObHBUb2tlbnNUb01pbnQIBQ0kdDA0MzQwOTQzNDk0Al8xBBlyZXF1aXJlZEFtb3VudHNOb3JtYWxpemVkCAUNJHQwNDM0MDk0MzQ5NAJfMgQNYXNzZXRCYWxhbmNlcwgFDSR0MDQzNDA5NDM0OTQCXzMKAQhmb2xkRnVuYwIDYWNjBGVsZW0EBWluZGV4CAUDYWNjAl8xBA9wYXltZW50QXNzZXRTdHIJAQtfYXNzZXRUb1N0cgEICQCRAwIIBQFpCHBheW1lbnRzBQVpbmRleAdhc3NldElkBBRwYXltZW50QXNzZXREZWNpbWFscwkBDF9nZXREZWNpbWFscwEFD3BheW1lbnRBc3NldFN0cgQYcmVxdWlyZWRBbW91bnROb3JtYWxpemVkCQCRAwIFGXJlcXVpcmVkQW1vdW50c05vcm1hbGl6ZWQFBWluZGV4BA5yZXF1aXJlZEFtb3VudAkAoAMBCQESX25vcm1hbGl6ZURlY2ltYWxzBAUYcmVxdWlyZWRBbW91bnROb3JtYWxpemVkBQpscERlY2ltYWxzBRRwYXltZW50QXNzZXREZWNpbWFscwUHQ0VJTElORwQEZXJyMQMJAQIhPQIFD3BheW1lbnRBc3NldFN0cgUEZWxlbQkAAgEJAKwCAgIjZGVwb3NpdEFsbDogaW52YWxpZCBwYXltZW50OiBpbmRleD0JAKQDAQUFaW5kZXgDCQBnAgAABQ5yZXF1aXJlZEFtb3VudAkAAgECJmRlcG9zaXRBbGw6IHRvbyBsaXR0bGUgYW1vdW50IHJlcXVpcmVkBQR1bml0AwkAAAIFBGVycjEFBGVycjEEBmNoYW5nZQMJAGYCCAkAkQMCCAUBaQhwYXltZW50cwUFaW5kZXgGYW1vdW50BQ5yZXF1aXJlZEFtb3VudAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIJAGUCCAkAkQMCCAUBaQhwYXltZW50cwUFaW5kZXgGYW1vdW50BQ5yZXF1aXJlZEFtb3VudAgJAJEDAggFAWkIcGF5bWVudHMFBWluZGV4B2Fzc2V0SWQFA25pbAMJAGYCBQ5yZXF1aXJlZEFtb3VudAgJAJEDAggFAWkIcGF5bWVudHMFBWluZGV4BmFtb3VudAkAAgEJAKwCAgkArAICCQCsAgICKGRlcG9zaXRBbGw6IGluc3VmZmljaWVudCBwYXltZW50LCBpbmRleD0JAKQDAQUFaW5kZXgCCywgcmVxdWlyZWQ9CQCkAwEFDnJlcXVpcmVkQW1vdW50BQNuaWwJAJQKAgkAZAIFBWluZGV4AAEJAM4IAggFA2FjYwJfMgUGY2hhbmdlCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBA0kdDA0NDY5MjQ0NzU0CgACJGwFBmFzc2V0cwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgAABQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCGZvbGRGdW5jAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKBANpZHgIBQ0kdDA0NDY5MjQ0NzU0Al8xBA1jaGFuZ2VBY3Rpb25zCAUNJHQwNDQ2OTI0NDc1NAJfMgQOc3RvcmFnZVVwZGF0ZWQJAJwKCggFB3N0b3JhZ2UCXzEIBQdzdG9yYWdlAl8yCQBkAggFB3N0b3JhZ2UCXzMFDmxwVG9rZW5zVG9NaW50CAUHc3RvcmFnZQJfNAgFB3N0b3JhZ2UCXzUIBQdzdG9yYWdlAl82CAUHc3RvcmFnZQJfNwgFB3N0b3JhZ2UCXzgIBQdzdG9yYWdlAl85CAUHc3RvcmFnZQNfMTAJAJQKAgkAzggCCQDOCAIJAM4IAgkAzAgCCQEHUmVpc3N1ZQMFCWxwQXNzZXRJZAUObHBUb2tlbnNUb01pbnQGCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgUObHBUb2tlbnNUb01pbnQFCWxwQXNzZXRJZAUDbmlsCQEMX3NhdmVTdG9yYWdlAQUOc3RvcmFnZVVwZGF0ZWQJARJfc2F2ZUFzc2V0QmFsYW5jZXMBBQ1hc3NldEJhbGFuY2VzBQ1jaGFuZ2VBY3Rpb25zBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBB2RlcG9zaXQBDG1pbkxwQW1vdW50XwQDZXJyCQEMX3ZhbGlkYXRlSW50BAUMbWluTHBBbW91bnRfAAAFB01BWF9JTlQCHmRlcG9zaXQ6IGludmFsaWQgbWluIGxwIGFtb3VudAMJAAACBQNlcnIFA2VycgQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQAECWxwQXNzZXRJZAgFB3N0b3JhZ2UCXzEECmxwRGVjaW1hbHMJAQxfZ2V0RGVjaW1hbHMBCQDYBAEFCWxwQXNzZXRJZAQEZXJyMQMDAwMJARBfd2hlbkluaXRpYWxpemVkAAkBDl93aGVuTm90UGF1c2VkAAcJARJfdmFsaWRhdGVJbnRFcXVhbHMDCQCQAwEIBQFpCHBheW1lbnRzAAECHmRlcG9zaXQ6IGludmFsaWQgcGF5bWVudHMgc2l6ZQcJARVfdmFsaWRhdGVMaXN0Q29udGFpbnMDCQELX2xvYWRBc3NldHMACQELX2Fzc2V0VG9TdHIBCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQCHmRlcG9zaXQ6IGludmFsaWQgcGF5bWVudCBhc3NldAcJAQxfdmFsaWRhdGVJbnQECAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAABBQdNQVhfSU5UAh9kZXBvc2l0OiBpbnZhbGlkIHBheW1lbnQgYW1vdW50BwMJAAACBQRlcnIxBQRlcnIxBAhhc3NldFN0cgkBC19hc3NldFRvU3RyAQgJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBA1hc3NldERlY2ltYWxzCQEMX2dldERlY2ltYWxzAQUIYXNzZXRTdHIEEGFtb3VudE5vcm1hbGl6ZWQJARJfbm9ybWFsaXplRGVjaW1hbHMECQC2AgEICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BQ1hc3NldERlY2ltYWxzBQpscERlY2ltYWxzBQRET1dOBA0kdDA0NjE2MTQ2MjYxCQEIX2RlcG9zaXQCBQhhc3NldFN0cgUQYW1vdW50Tm9ybWFsaXplZAQObHBUb2tlbnNUb01pbnQIBQ0kdDA0NjE2MTQ2MjYxAl8xBA1hc3NldEJhbGFuY2VzCAUNJHQwNDYxNjE0NjI2MQJfMgQEZXJyMgkBDF92YWxpZGF0ZUludAQFDmxwVG9rZW5zVG9NaW50BQxtaW5McEFtb3VudF8FB01BWF9JTlQCGWRlcG9zaXQ6IGxlc3MgdGhhbiBtaW4gbHADCQAAAgUEZXJyMgUEZXJyMgQOc3RvcmFnZVVwZGF0ZWQJAJwKCggFB3N0b3JhZ2UCXzEIBQdzdG9yYWdlAl8yCQBkAggFB3N0b3JhZ2UCXzMFDmxwVG9rZW5zVG9NaW50CAUHc3RvcmFnZQJfNAgFB3N0b3JhZ2UCXzUIBQdzdG9yYWdlAl82CAUHc3RvcmFnZQJfNwgFB3N0b3JhZ2UCXzgIBQdzdG9yYWdlAl85CAUHc3RvcmFnZQNfMTAJAJQKAgkAzggCCQDOCAIJAMwIAgkBB1JlaXNzdWUDBQlscEFzc2V0SWQFDmxwVG9rZW5zVG9NaW50BgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFDmxwVG9rZW5zVG9NaW50BQlscEFzc2V0SWQFA25pbAkBDF9zYXZlU3RvcmFnZQEFDnN0b3JhZ2VVcGRhdGVkCQESX3NhdmVBc3NldEJhbGFuY2VzAQUNYXNzZXRCYWxhbmNlcwUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQt3aXRoZHJhd0FsbAAEB3N0b3JhZ2UJAQxfbG9hZFN0b3JhZ2UABAlscEFzc2V0SWQIBQdzdG9yYWdlAl8xBAxscEFzc2V0SWRTdHIJANgEAQUJbHBBc3NldElkBApscERlY2ltYWxzCQEMX2dldERlY2ltYWxzAQUMbHBBc3NldElkU3RyBAZhc3NldHMJAQtfbG9hZEFzc2V0cwAEA2VycgMDAwMJARBfd2hlbkluaXRpYWxpemVkAAkBDl93aGVuTm90UGF1c2VkAAcJARJfdmFsaWRhdGVJbnRFcXVhbHMDCQCQAwEIBQFpCHBheW1lbnRzAAECIndpdGhkcmF3QWxsOiBpbnZhbGlkIHBheW1lbnRzIHNpemUHCQEUX3ZhbGlkYXRlU3RyaW5nRXF1YWwDBQxscEFzc2V0SWRTdHIJAQtfYXNzZXRUb1N0cgEICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAIid2l0aGRyYXdBbGw6IGludmFsaWQgcGF5bWVudCBhc3NldAcJAQxfdmFsaWRhdGVJbnQECAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAABBQdNQVhfSU5UAiN3aXRoZHJhd0FsbDogaW52YWxpZCBwYXltZW50IGFtb3VudAcDCQAAAgUDZXJyBQNlcnIEDSR0MDQ3NDgxNDc1NjgJAQxfd2l0aGRyYXdBbGwBCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAQObHBUb2tlbnNUb0J1cm4IBQ0kdDA0NzQ4MTQ3NTY4Al8xBA1iYWxhbmNlc1RvUGF5CAUNJHQwNDc0ODE0NzU2OAJfMgQNYXNzZXRCYWxhbmNlcwgFDSR0MDQ3NDgxNDc1NjgCXzMEDnBheW1lbnRBY3Rpb25zCQEYX2dldFBheW1lbnRzRnJvbUJhbGFuY2VzBAUGYXNzZXRzBQ1iYWxhbmNlc1RvUGF5CAUBaQZjYWxsZXIFCmxwRGVjaW1hbHMEDnN0b3JhZ2VVcGRhdGVkCQCcCgoIBQdzdG9yYWdlAl8xCAUHc3RvcmFnZQJfMgkAZQIIBQdzdG9yYWdlAl8zBQ5scFRva2Vuc1RvQnVybggFB3N0b3JhZ2UCXzQIBQdzdG9yYWdlAl81CAUHc3RvcmFnZQJfNggFB3N0b3JhZ2UCXzcIBQdzdG9yYWdlAl84CAUHc3RvcmFnZQJfOQgFB3N0b3JhZ2UDXzEwCQCUCgIJAM4IAgkAzggCCQDOCAIJAMwIAgkBBEJ1cm4CBQlscEFzc2V0SWQFDmxwVG9rZW5zVG9CdXJuBQNuaWwFDnBheW1lbnRBY3Rpb25zCQEMX3NhdmVTdG9yYWdlAQUOc3RvcmFnZVVwZGF0ZWQJARJfc2F2ZUFzc2V0QmFsYW5jZXMBBQ1hc3NldEJhbGFuY2VzBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCHdpdGhkcmF3Aghhc3NldElkXwptaW5BbW91bnRfBAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAQJbHBBc3NldElkCAUHc3RvcmFnZQJfMQQMbHBBc3NldElkU3RyCQDYBAEFCWxwQXNzZXRJZAQKbHBEZWNpbWFscwkBDF9nZXREZWNpbWFscwEFDGxwQXNzZXRJZFN0cgQGYXNzZXRzCQELX2xvYWRBc3NldHMABANlcnIDAwMDAwMJARBfd2hlbkluaXRpYWxpemVkAAkBDl93aGVuTm90UGF1c2VkAAcJARJfdmFsaWRhdGVJbnRFcXVhbHMDCQCQAwEIBQFpCHBheW1lbnRzAAECH3dpdGhkcmF3OiBpbnZhbGlkIHBheW1lbnRzIHNpemUHCQEUX3ZhbGlkYXRlU3RyaW5nRXF1YWwDBQxscEFzc2V0SWRTdHIJAQtfYXNzZXRUb1N0cgEICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAIfd2l0aGRyYXc6IGludmFsaWQgcGF5bWVudCBhc3NldAcJAQxfdmFsaWRhdGVJbnQECAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAABBQdNQVhfSU5UAiB3aXRoZHJhdzogaW52YWxpZCBwYXltZW50IGFtb3VudAcJARVfdmFsaWRhdGVMaXN0Q29udGFpbnMDBQZhc3NldHMFCGFzc2V0SWRfAhl3aXRoZHJhdzogaW52YWxpZCBhc3NldElkBwkBDF92YWxpZGF0ZUludAQFCm1pbkFtb3VudF8AAAUHTUFYX0lOVAIbd2l0aGRyYXc6IGludmFsaWQgbWluQW1vdW50BwMJAAACBQNlcnIFA2VycgQNJHQwNDg4OTQ0OTAyOAkBCV93aXRoZHJhdwIFCGFzc2V0SWRfCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAQWdGFyZ2V0QW1vdW50Tm9ybWFsaXplZAgFDSR0MDQ4ODk0NDkwMjgCXzEEEmZpbmFsQXNzZXRCYWxhbmNlcwgFDSR0MDQ4ODk0NDkwMjgCXzIEBWxwRmVlCAUNJHQwNDg4OTQ0OTAyOAJfMwQLcHJvdG9jb2xGZWUIBQ0kdDA0ODg5NDQ5MDI4Al80BBRzaWdtYUZlZVBlckxwVXBkYXRlZAgFDSR0MDQ4ODk0NDkwMjgCXzUEFWZpbmFsQW1vdW50Tm9ybWFsaXplZAkAZQIJAGUCCQCgAwEFFnRhcmdldEFtb3VudE5vcm1hbGl6ZWQFBWxwRmVlBQtwcm90b2NvbEZlZQQOdGFyZ2V0RGVjaW1hbHMJAQxfZ2V0RGVjaW1hbHMBBQhhc3NldElkXwQLZmluYWxBbW91bnQJAKADAQkBEl9ub3JtYWxpemVEZWNpbWFscwQJALYCAQUVZmluYWxBbW91bnROb3JtYWxpemVkBQpscERlY2ltYWxzBQ50YXJnZXREZWNpbWFscwUERE9XTgQEZXJyMQkBDF92YWxpZGF0ZUludAQFC2ZpbmFsQW1vdW50BQptaW5BbW91bnRfBQdNQVhfSU5UAiN3aXRoZHJhdzogaW5zdWZmaWNpZW50IGZpbmFsIGFtb3VudAMJAAACBQRlcnIxBQRlcnIxBA5zdG9yYWdlVXBkYXRlZAkAnAoKCAUHc3RvcmFnZQJfMQgFB3N0b3JhZ2UCXzIJAGUCCAUHc3RvcmFnZQJfMwgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQIBQdzdG9yYWdlAl80CAUHc3RvcmFnZQJfNQgFB3N0b3JhZ2UCXzYIBQdzdG9yYWdlAl83CAUHc3RvcmFnZQJfOAgFB3N0b3JhZ2UCXzkIBQdzdG9yYWdlA18xMAkAlAoCCQDOCAIJAM4IAgkAzggCCQDOCAIJAM4IAgkAzAgCCQEEQnVybgIFCWxwQXNzZXRJZAgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQtmaW5hbEFtb3VudAkBC19zdHJUb0Fzc2V0AQUIYXNzZXRJZF8FA25pbAkBDF9zYXZlU3RvcmFnZQEFDnN0b3JhZ2VVcGRhdGVkCQESX3NhdmVBc3NldEJhbGFuY2VzAQUSZmluYWxBc3NldEJhbGFuY2VzCQEKX3NhdmVMcEZlZQIFCGFzc2V0SWRfCQBkAgUFbHBGZWUJAQpfbG9hZExwRmVlAQUIYXNzZXRJZF8JARBfc2F2ZVByb3RvY29sRmVlAgUIYXNzZXRJZF8JAGQCBQtwcm90b2NvbEZlZQkBEF9sb2FkUHJvdG9jb2xGZWUBBQhhc3NldElkXwkBEl9zYXZlU2lnbWFGZWVQZXJMcAEFFHNpZ21hRmVlUGVyTHBVcGRhdGVkBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBBHN3YXACDnRhcmdldEFzc2V0SWRfCm1pbkFtb3VudF8EB3N0b3JhZ2UJAQxfbG9hZFN0b3JhZ2UABAlscEFzc2V0SWQIBQdzdG9yYWdlAl8xBApscERlY2ltYWxzCQEMX2dldERlY2ltYWxzAQkA2AQBBQlscEFzc2V0SWQEBmFzc2V0cwkBC19sb2FkQXNzZXRzAAQOc291cmNlQXNzZXRTdHIJAQtfYXNzZXRUb1N0cgEICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAQWc291cmNlQW1vdW50Tm9ybWFsaXplZAkBEl9ub3JtYWxpemVEZWNpbWFscwQJALYCAQgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQJAQxfZ2V0RGVjaW1hbHMBBQ5zb3VyY2VBc3NldFN0cgUKbHBEZWNpbWFscwUERE9XTgQQc291cmNlQXNzZXRJbmRleAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDPCAIFBmFzc2V0cwUOc291cmNlQXNzZXRTdHICGnN3YXA6IGludmFsaWQgc291cmNlIGFzc2V0AwkAAAIFEHNvdXJjZUFzc2V0SW5kZXgFEHNvdXJjZUFzc2V0SW5kZXgEEHRhcmdldEFzc2V0SW5kZXgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAzwgCBQZhc3NldHMFDnRhcmdldEFzc2V0SWRfAhpzd2FwOiBpbnZhbGlkIHRhcmdldCBhc3NldAMJAAACBRB0YXJnZXRBc3NldEluZGV4BRB0YXJnZXRBc3NldEluZGV4BANlcnIDAwMDAwkBEF93aGVuSW5pdGlhbGl6ZWQACQEOX3doZW5Ob3RQYXVzZWQABwkBDF92YWxpZGF0ZUludAQFCm1pbkFtb3VudF8AAAUHTUFYX0lOVAIfc3dhcDogaW52YWxpZCBtaW4gdGFyZ2V0IGFtb3VudAcJAQxfdmFsaWRhdGVJbnQECQCgAwEFFnNvdXJjZUFtb3VudE5vcm1hbGl6ZWQAAQUHTUFYX0lOVAIbc3dhcDogaW52YWxpZCBzb3VyY2UgYW1vdW50BwkBFF92YWxpZGF0ZVN0cmluZ05vdEVxAwUOc291cmNlQXNzZXRTdHIFDnRhcmdldEFzc2V0SWRfAhFzd2FwOiBzYW1lIGFzc2V0cwcJARJfdmFsaWRhdGVJbnRFcXVhbHMDCQCQAwEIBQFpCHBheW1lbnRzAAECG3N3YXA6IGludmFsaWQgcGF5bWVudHMgc2l6ZQcDCQAAAgUDZXJyBQNlcnIEDSR0MDUxMjA1NTEzNjMJAQVfc3dhcAMFEHNvdXJjZUFzc2V0SW5kZXgFEHRhcmdldEFzc2V0SW5kZXgFFnNvdXJjZUFtb3VudE5vcm1hbGl6ZWQEFnRhcmdldEFtb3VudE5vcm1hbGl6ZWQIBQ0kdDA1MTIwNTUxMzYzAl8xBBJmaW5hbEFzc2V0QmFsYW5jZXMIBQ0kdDA1MTIwNTUxMzYzAl8yBAVscEZlZQgFDSR0MDUxMjA1NTEzNjMCXzMEC3Byb3RvY29sRmVlCAUNJHQwNTEyMDU1MTM2MwJfNAQUc2lnbWFGZWVQZXJMcFVwZGF0ZWQIBQ0kdDA1MTIwNTUxMzYzAl81BBVmaW5hbEFtb3VudE5vcm1hbGl6ZWQJAGUCCQBlAgkAoAMBBRZ0YXJnZXRBbW91bnROb3JtYWxpemVkBQVscEZlZQULcHJvdG9jb2xGZWUEDnRhcmdldERlY2ltYWxzCQEMX2dldERlY2ltYWxzAQUOdGFyZ2V0QXNzZXRJZF8EC2ZpbmFsQW1vdW50CQCgAwEJARJfbm9ybWFsaXplRGVjaW1hbHMECQC2AgEFFWZpbmFsQW1vdW50Tm9ybWFsaXplZAUKbHBEZWNpbWFscwUOdGFyZ2V0RGVjaW1hbHMFBERPV04EBGVycjEJAQxfdmFsaWRhdGVJbnQEBQtmaW5hbEFtb3VudAUKbWluQW1vdW50XwUHTUFYX0lOVAIfc3dhcDogaW5zdWZmaWNpZW50IGZpbmFsIGFtb3VudAMJAAACBQRlcnIxBQRlcnIxCQCUCgIJAM4IAgkAzggCCQDOCAIJAM4IAgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFC2ZpbmFsQW1vdW50CQELX3N0clRvQXNzZXQBBQ50YXJnZXRBc3NldElkXwUDbmlsCQESX3NhdmVBc3NldEJhbGFuY2VzAQUSZmluYWxBc3NldEJhbGFuY2VzCQEKX3NhdmVMcEZlZQIFDnRhcmdldEFzc2V0SWRfCQBkAgUFbHBGZWUJAQpfbG9hZExwRmVlAQUOdGFyZ2V0QXNzZXRJZF8JARBfc2F2ZVByb3RvY29sRmVlAgUOdGFyZ2V0QXNzZXRJZF8JAGQCBQtwcm90b2NvbEZlZQkBEF9sb2FkUHJvdG9jb2xGZWUBBQ50YXJnZXRBc3NldElkXwkBEl9zYXZlU2lnbWFGZWVQZXJMcAEFFHNpZ21hRmVlUGVyTHBVcGRhdGVkBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDWdldERlcG9zaXRBbGwBCWxwQW1vdW50XwQDZXJyCQEMX3ZhbGlkYXRlSW50BAUJbHBBbW91bnRfAAEFB01BWF9JTlQCHWdldERlcG9zaXRBbGw6IGludmFsaWQgYW1vdW50AwkAAAIFA2VycgUDZXJyBA0kdDA1MjUyMjUyNjA5CQELX2RlcG9zaXRBbGwBBQlscEFtb3VudF8EDmxwVG9rZW5zVG9NaW50CAUNJHQwNTI1MjI1MjYwOQJfMQQZcmVxdWlyZWRBbW91bnRzTm9ybWFsaXplZAgFDSR0MDUyNTIyNTI2MDkCXzIEDWFzc2V0QmFsYW5jZXMIBQ0kdDA1MjUyMjUyNjA5Al8zCQCUCgIFA25pbAkAlAoCBQ5scFRva2Vuc1RvTWludAUZcmVxdWlyZWRBbW91bnRzTm9ybWFsaXplZAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQpnZXREZXBvc2l0Aghhc3NldElkXwdhbW91bnRfBANlcnIDCQEVX3ZhbGlkYXRlTGlzdENvbnRhaW5zAwkBC19sb2FkQXNzZXRzAAUIYXNzZXRJZF8CGWdldERlcG9zaXQ6IGludmFsaWQgYXNzZXQJAQxfdmFsaWRhdGVJbnQEBQdhbW91bnRfAAEFB01BWF9JTlQCGmdldERlcG9zaXQ6IGludmFsaWQgYW1vdW50BwMJAAACBQNlcnIFA2VycgQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQAECWxwQXNzZXRJZAgFB3N0b3JhZ2UCXzEECmxwRGVjaW1hbHMJAQxfZ2V0RGVjaW1hbHMBCQDYBAEFCWxwQXNzZXRJZAQNYXNzZXREZWNpbWFscwkBDF9nZXREZWNpbWFscwEFCGFzc2V0SWRfBBBhbW91bnROb3JtYWxpemVkCQESX25vcm1hbGl6ZURlY2ltYWxzBAkAtgIBBQdhbW91bnRfBQ1hc3NldERlY2ltYWxzBQpscERlY2ltYWxzBQRET1dOBA0kdDA1MzM3OTUzNDUzCQEIX2RlcG9zaXQCBQhhc3NldElkXwUQYW1vdW50Tm9ybWFsaXplZAQObHBUb2tlbnNUb01pbnQIBQ0kdDA1MzM3OTUzNDUzAl8xBA1hc3NldEJhbGFuY2VzCAUNJHQwNTMzNzk1MzQ1MwJfMgkAlAoCBQNuaWwFDmxwVG9rZW5zVG9NaW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDmdldFdpdGhkcmF3QWxsAQlscEFtb3VudF8EA2VycgkBDF92YWxpZGF0ZUludAQFCWxwQW1vdW50XwAABQdNQVhfSU5UAh5nZXRXaXRoZHJhd0FsbDogaW52YWxpZCBhbW91bnQDCQAAAgUDZXJyBQNlcnIEDSR0MDUzODMwNTM5MDYJAQxfd2l0aGRyYXdBbGwBBQlscEFtb3VudF8EDmxwVG9rZW5zVG9CdXJuCAUNJHQwNTM4MzA1MzkwNgJfMQQNYmFsYW5jZXNUb0dldAgFDSR0MDUzODMwNTM5MDYCXzIEDWFzc2V0QmFsYW5jZXMIBQ0kdDA1MzgzMDUzOTA2Al8zCQCUCgIFA25pbAUNYmFsYW5jZXNUb0dldAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQtnZXRXaXRoZHJhdwIIYXNzZXRJZF8HYW1vdW50XwQDZXJyAwkBFV92YWxpZGF0ZUxpc3RDb250YWlucwMJAQtfbG9hZEFzc2V0cwAFCGFzc2V0SWRfAhpnZXRXaXRoZHJhdzogaW52YWxpZCBhc3NldAkBDF92YWxpZGF0ZUludAQFB2Ftb3VudF8AAQUHTUFYX0lOVAIbZ2V0V2l0aGRyYXc6IGludmFsaWQgYW1vdW50BwMJAAACBQNlcnIFA2VycgQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQAECWxwQXNzZXRJZAgFB3N0b3JhZ2UCXzEECmxwRGVjaW1hbHMJAQxfZ2V0RGVjaW1hbHMBCQDYBAEFCWxwQXNzZXRJZAQNJHQwNTQ1NTc1NDY3MwkBCV93aXRoZHJhdwIFCGFzc2V0SWRfBQdhbW91bnRfBBZ0YXJnZXRBbW91bnROb3JtYWxpemVkCAUNJHQwNTQ1NTc1NDY3MwJfMQQNYXNzZXRCYWxhbmNlcwgFDSR0MDU0NTU3NTQ2NzMCXzIEBWxwRmVlCAUNJHQwNTQ1NTc1NDY3MwJfMwQLcHJvdG9jb2xGZWUIBQ0kdDA1NDU1NzU0NjczAl80BBRzaWdtYUZlZVBlckxwVXBkYXRlZAgFDSR0MDU0NTU3NTQ2NzMCXzUEFWZpbmFsQW1vdW50Tm9ybWFsaXplZAkAZQIJAGUCCQCgAwEFFnRhcmdldEFtb3VudE5vcm1hbGl6ZWQFBWxwRmVlBQtwcm90b2NvbEZlZQQOdGFyZ2V0RGVjaW1hbHMJAQxfZ2V0RGVjaW1hbHMBBQhhc3NldElkXwQLZmluYWxBbW91bnQJARJfbm9ybWFsaXplRGVjaW1hbHMECQC2AgEFFWZpbmFsQW1vdW50Tm9ybWFsaXplZAUKbHBEZWNpbWFscwUOdGFyZ2V0RGVjaW1hbHMFBERPV04JAJQKAgUDbmlsBQtmaW5hbEFtb3VudAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQdnZXRTd2FwAw5zb3VyY2VBc3NldElkXw50YXJnZXRBc3NldElkXw1zb3VyY2VBbW91bnRfBAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAQJbHBBc3NldElkCAUHc3RvcmFnZQJfMQQKbHBEZWNpbWFscwkBDF9nZXREZWNpbWFscwEJANgEAQUJbHBBc3NldElkBAZhc3NldHMJAQtfbG9hZEFzc2V0cwAEEHNvdXJjZUFzc2V0SW5kZXgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAzwgCBQZhc3NldHMFDnNvdXJjZUFzc2V0SWRfAhpzd2FwOiBpbnZhbGlkIHNvdXJjZSBhc3NldAMJAAACBRBzb3VyY2VBc3NldEluZGV4BRBzb3VyY2VBc3NldEluZGV4BBB0YXJnZXRBc3NldEluZGV4CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAM8IAgUGYXNzZXRzBQ50YXJnZXRBc3NldElkXwIac3dhcDogaW52YWxpZCB0YXJnZXQgYXNzZXQDCQAAAgUQdGFyZ2V0QXNzZXRJbmRleAUQdGFyZ2V0QXNzZXRJbmRleAQWc291cmNlQW1vdW50Tm9ybWFsaXplZAkBEl9ub3JtYWxpemVEZWNpbWFscwQJALYCAQUNc291cmNlQW1vdW50XwkBDF9nZXREZWNpbWFscwEFDnNvdXJjZUFzc2V0SWRfBQpscERlY2ltYWxzBQRET1dOBANlcnIDCQEMX3ZhbGlkYXRlSW50BAkAoAMBBRZzb3VyY2VBbW91bnROb3JtYWxpemVkAAEFB01BWF9JTlQCG3N3YXA6IGludmFsaWQgc291cmNlIGFtb3VudAkBFF92YWxpZGF0ZVN0cmluZ05vdEVxAwUOc291cmNlQXNzZXRJZF8FDnRhcmdldEFzc2V0SWRfAhFzd2FwOiBzYW1lIGFzc2V0cwcDCQAAAgUDZXJyBQNlcnIEDSR0MDU2MTI1NTYyODMJAQVfc3dhcAMFEHNvdXJjZUFzc2V0SW5kZXgFEHRhcmdldEFzc2V0SW5kZXgFFnNvdXJjZUFtb3VudE5vcm1hbGl6ZWQEFnRhcmdldEFtb3VudE5vcm1hbGl6ZWQIBQ0kdDA1NjEyNTU2MjgzAl8xBBJmaW5hbEFzc2V0QmFsYW5jZXMIBQ0kdDA1NjEyNTU2MjgzAl8yBAVscEZlZQgFDSR0MDU2MTI1NTYyODMCXzMEC3Byb3RvY29sRmVlCAUNJHQwNTYxMjU1NjI4MwJfNAQUc2lnbWFGZWVQZXJMcFVwZGF0ZWQIBQ0kdDA1NjEyNTU2MjgzAl81BBVmaW5hbEFtb3VudE5vcm1hbGl6ZWQJAGUCCQBlAgkAoAMBBRZ0YXJnZXRBbW91bnROb3JtYWxpemVkBQVscEZlZQULcHJvdG9jb2xGZWUEDnRhcmdldERlY2ltYWxzCQEMX2dldERlY2ltYWxzAQUOdGFyZ2V0QXNzZXRJZF8EC2ZpbmFsQW1vdW50CQESX25vcm1hbGl6ZURlY2ltYWxzBAkAtgIBBRVmaW5hbEFtb3VudE5vcm1hbGl6ZWQFCmxwRGVjaW1hbHMFDnRhcmdldERlY2ltYWxzBQRET1dOCQCUCgIFA25pbAULZmluYWxBbW91bnQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEIZ2V0Q2xhaW0BBXVzZXJfBAR1c2VyAwkAZgIJALECAQUFdXNlcl8AAAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEFBXVzZXJfAhZnZXRDbGFpbTogaW52YWxpZCB1c2VyCAUBaQZjYWxsZXIEDSR0MDU2OTQ0NTcwMDAJAQtfY2hlY2twb2ludAEFBHVzZXIEEWNoZWNrcG9pbnRBY3Rpb25zCAUNJHQwNTY5NDQ1NzAwMAJfMQQLdXNlclByb2ZpdHMIBQ0kdDA1Njk0NDU3MDAwAl8yCQCUCgIFA25pbAULdXNlclByb2ZpdHMBaQELZ2V0VXRpbEZ1bmMABAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAQNbHBUb3RhbFN1cHBseQgFB3N0b3JhZ2UCXzMED3dlaWdodEFtcGxpZmllcggFB3N0b3JhZ2UCXzcEDHNsaXBwYWdlUmF0ZQgFB3N0b3JhZ2UCXzgECmZlZU1heFJhdGUIBQdzdG9yYWdlAl85BA0kdDA1NzMzMzU3MzkzCQESX2xvYWRBc3NldEJhbGFuY2VzAAQNYXNzZXRCYWxhbmNlcwgFDSR0MDU3MzMzNTczOTMCXzEEEGFzc2V0VG90YWxTdXBwbHkIBQ0kdDA1NzMzMzU3MzkzAl8yBA0kdDA1NzM5ODU3NDUxCQERX2xvYWRBc3NldFdlaWdodHMABAxhc3NldFdlaWdodHMIBQ0kdDA1NzM5ODU3NDUxAl8xBAtzaWdtYVdlaWdodAgFDSR0MDU3Mzk4NTc0NTECXzIEA2ZlZQkBDV9jYWxjdWxhdGVGZWUHBQ1hc3NldEJhbGFuY2VzBRBhc3NldFRvdGFsU3VwcGx5BQxhc3NldFdlaWdodHMFC3NpZ21hV2VpZ2h0BQ93ZWlnaHRBbXBsaWZpZXIFDHNsaXBwYWdlUmF0ZQUKZmVlTWF4UmF0ZQQJdXRpbFZhbHVlCQC4AgIFEGFzc2V0VG90YWxTdXBwbHkFA2ZlZQkAlAoCBQNuaWwJAJQKAgUJdXRpbFZhbHVlBQ1scFRvdGFsU3VwcGx5AWkBCmNoZWNrcG9pbnQBBXVzZXJfBANlcnIDCQEQX3doZW5Jbml0aWFsaXplZAAJAQ5fd2hlbk5vdFBhdXNlZAAHAwkAAAIFA2VycgUDZXJyBAR1c2VyAwkAZgIJALECAQUFdXNlcl8AAAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEFBXVzZXJfAhhjaGVja3BvaW50OiBpbnZhbGlkIHVzZXIIBQFpBmNhbGxlcgkBC19jaGVja3BvaW50AQUEdXNlcgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQVzdGFrZQAEA2VycgMJARBfd2hlbkluaXRpYWxpemVkAAkBDl93aGVuTm90UGF1c2VkAAcDCQAAAgUDZXJyBQNlcnIEB3N0b3JhZ2UJAQxfbG9hZFN0b3JhZ2UABAxscEFzc2V0SWRTdHIJAQtfYXNzZXRUb1N0cgEIBQdzdG9yYWdlAl8xBARlcnIxAwMJARJfdmFsaWRhdGVJbnRFcXVhbHMDCQCQAwEIBQFpCHBheW1lbnRzAAECHHN0YWtlOiBpbnZhbGlkIHBheW1lbnRzIHNpemUJARRfdmFsaWRhdGVTdHJpbmdFcXVhbAMFDGxwQXNzZXRJZFN0cgkBC19hc3NldFRvU3RyAQgJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkAhxzdGFrZTogaW52YWxpZCBwYXltZW50IGFzc2V0BwkBDF92YWxpZGF0ZUludAQICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50AAAFB01BWF9JTlQCHXN0YWtlOiBpbnZhbGlkIHBheW1lbnQgYW1vdW50BwMJAAACBQRlcnIxBQRlcnIxBA0kdDA1ODUyNDU4NTg0CQELX2NoZWNrcG9pbnQBCAUBaQZjYWxsZXIEEWNoZWNrcG9pbnRBY3Rpb25zCAUNJHQwNTg1MjQ1ODU4NAJfMQQLdXNlclByb2ZpdHMIBQ0kdDA1ODUyNDU4NTg0Al8yCQCUCgIJAM4IAgkAzggCBRFjaGVja3BvaW50QWN0aW9ucwkBC19zYXZlVXNlckxwAggFAWkGY2FsbGVyCQBkAgkBC19sb2FkVXNlckxwAQgFAWkGY2FsbGVyCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAkBDF9zYXZlVG90YWxMcAEJAGQCCQEMX2xvYWRUb3RhbExwAAgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEHdW5zdGFrZQEHYW1vdW50XwQDZXJyAwkBEF93aGVuSW5pdGlhbGl6ZWQACQEOX3doZW5Ob3RQYXVzZWQABwMJAAACBQNlcnIFA2VycgQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQAECWxwQXNzZXRJZAgFB3N0b3JhZ2UCXzEEBnVzZXJMcAkBC19sb2FkVXNlckxwAQgFAWkGY2FsbGVyBARlcnIxCQEMX3ZhbGlkYXRlSW50BAUHYW1vdW50XwAABQZ1c2VyTHACF3Vuc3Rha2U6IGludmFsaWQgYW1vdW50AwkAAAIFBGVycjEFBGVycjEEDSR0MDU5MDk1NTkxNTUJAQtfY2hlY2twb2ludAEIBQFpBmNhbGxlcgQRY2hlY2twb2ludEFjdGlvbnMIBQ0kdDA1OTA5NTU5MTU1Al8xBAt1c2VyUHJvZml0cwgFDSR0MDU5MDk1NTkxNTUCXzIJAJQKAgkAzggCCQDOCAIJAM4IAgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFB2Ftb3VudF8FCWxwQXNzZXRJZAUDbmlsBRFjaGVja3BvaW50QWN0aW9ucwkBC19zYXZlVXNlckxwAggFAWkGY2FsbGVyCQBlAgUGdXNlckxwBQdhbW91bnRfCQEMX3NhdmVUb3RhbExwAQkAZQIJAQxfbG9hZFRvdGFsTHAABQdhbW91bnRfBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBBWNsYWltAQV1c2VyXwQDZXJyAwkBEF93aGVuSW5pdGlhbGl6ZWQACQEOX3doZW5Ob3RQYXVzZWQABwMJAAACBQNlcnIFA2VycgQEdXNlcgMJAGYCCQCxAgEFBXVzZXJfAAAJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBBQV1c2VyXwITY2xhaW06IGludmFsaWQgdXNlcggFAWkGY2FsbGVyBAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAQJbHBBc3NldElkCAUHc3RvcmFnZQJfMQQMbHBBc3NldElkU3RyCQELX2Fzc2V0VG9TdHIBBQlscEFzc2V0SWQEBmFzc2V0cwkAzAgCBQxscEFzc2V0SWRTdHIJAQtfbG9hZEFzc2V0cwAECG1heEluZGV4CQBlAgkAkAMBBQZhc3NldHMAAQQGdXNlckxwCQELX2xvYWRVc2VyTHABBQR1c2VyBA0kdDA1OTg3ODU5OTM0CQELX2NoZWNrcG9pbnQBBQR1c2VyBBFjaGVja3BvaW50QWN0aW9ucwgFDSR0MDU5ODc4NTk5MzQCXzEEC3VzZXJQcm9maXRzCAUNJHQwNTk4Nzg1OTkzNAJfMgoBCGZvbGRGdW5jAgNhY2MGcHJvZml0BAVpbmRleAgFA2FjYwJfMQMDCQBnAgUIbWF4SW5kZXgFBWluZGV4CQBmAgUGcHJvZml0AAAHBAVhc3NldAkAkQMCBQZhc3NldHMFBWluZGV4CQCVCgMJAGQCBQVpbmRleAABCQDNCAIIBQNhY2MCXzIAAAkAzQgCCAUDYWNjAl8zCQEOU2NyaXB0VHJhbnNmZXIDBQR1c2VyBQZwcm9maXQJAQtfc3RyVG9Bc3NldAEFBWFzc2V0CQCVCgMJAGQCBQVpbmRleAABCQDNCAIIBQNhY2MCXzIFBnByb2ZpdAgFA2FjYwJfMwQNJHQwNjAzMTI2MDQwMwoAAiRsBQt1c2VyUHJvZml0cwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJUKAwAABQNuaWwFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEIZm9sZEZ1bmMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDExCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwQDaWR4CAUNJHQwNjAzMTI2MDQwMwJfMQQSdXNlclByb2ZpdHNVcGRhdGVkCAUNJHQwNjAzMTI2MDQwMwJfMgQNcHJvZml0QWN0aW9ucwgFDSR0MDYwMzEyNjA0MDMCXzMJAJQKAgkAzggCCQDOCAIFDXByb2ZpdEFjdGlvbnMJANEIAgURY2hlY2twb2ludEFjdGlvbnMAAAkBEF9zYXZlVXNlclByb2ZpdHMCBQR1c2VyBRJ1c2VyUHJvZml0c1VwZGF0ZWQFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEFcGF1c2UABANlcnIDAwkBC19vbmx5UGF1c2VyAQgFAWkGY2FsbGVyCQEQX3doZW5Jbml0aWFsaXplZAAHCQEOX3doZW5Ob3RQYXVzZWQABwMJAAACBQNlcnIFA2VycgkAlAoCCQEKX3NhdmVQYXVzZQEGBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBB3VucGF1c2UABANlcnIDAwkBC19vbmx5UGF1c2VyAQgFAWkGY2FsbGVyCQEQX3doZW5Jbml0aWFsaXplZAAHCQELX3doZW5QYXVzZWQABwMJAAACBQNlcnIFA2VycgkAlAoCCQEKX3NhdmVQYXVzZQEHBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDHVwZGF0ZVBhdXNlcgEHcGF1c2VyXwQDZXJyAwMJARFfb25seVRoaXNDb250cmFjdAEIBQFpBmNhbGxlcgkBEF93aGVuSW5pdGlhbGl6ZWQABwkBEF92YWxpZGF0ZUFkZHJlc3MCBQdwYXVzZXJfAhx1cGRhdGVQYXVzZXI6IGludmFsaWQgcGF1c2VyBwMJAAACBQNlcnIFA2VycgkAlAoCCQELX3NhdmVQYXVzZXIBCQERQGV4dHJOYXRpdmUoMTA2MikBBQdwYXVzZXJfBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBC3NldE11bHRpc2lnAQltdWx0aXNpZ18EA2VycgMJARFfb25seVRoaXNDb250cmFjdAEIBQFpBmNhbGxlcgkBEF92YWxpZGF0ZUFkZHJlc3MCBQltdWx0aXNpZ18CHXNldE11bHRpc2lnOiBpbnZhbGlkIG11bHRpc2lnBwMJAAACBQNlcnIFA2VycgkAlAoCCQENX3NhdmVNdWx0aXNpZwEJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCW11bHRpc2lnXwUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgECdHgBBnZlcmlmeQAJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAIBQJ0eA9zZW5kZXJQdWJsaWNLZXlnAtVO", "height": 3768850, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: BTPG461qffmb4GRSCrJqPzJd9tEByyzeFTjHR1zEoS8A Next: 3PZ5WUPhUDxVQAPZ4s9mZiAu812Z7Ti5grFQPNtFWDEP Diff:
OldNewDifferences
99
1010 let MAX_FEE = 1000000
1111
12-let MAX_AMPLIFIER = 1000000
13-
14-let MAX_WEIGHT_AMPLIFIER = 1000000
12+let MAX_AMPLIFIER = toBigInt(1000000)
13+
14+let MAX_WEIGHT_AMPLIFIER = toBigInt(1000000)
1515
1616 let MAX_WEIGHT = 1000000
1717
18-let SLIPPAGE_RATE_FACTOR = 1000000
19-
20-let FEE_RATE_FACTOR = 1000000
21-
22-let RATE_FACTOR = 1000000
18+let SLIPPAGE_RATE_FACTOR = toBigInt(1000000)
19+
20+let FEE_RATE_FACTOR = toBigInt(1000000)
21+
22+let RATE_FACTOR = toBigInt(1000000)
2323
2424 let PERCENT_FACTOR = toBigInt(1000000000000000000)
2525
2929
3030 let ZERO_BIGINT = toBigInt(0)
3131
32-let ZERO_BIGINT_LIST_11 = [ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT]
32+let ZERO_BIGINT_LIST_10 = [ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT]
33+
34+let ZERO_BIGINT_LIST_11 = (ZERO_BIGINT_LIST_10 :+ ZERO_BIGINT)
3335
3436 let INT_DECIMALS = 8
3537
246248 func _loadStorage () = match getString(KEY_STORAGE) {
247249 case a: String =>
248250 let struct = split(a, SEP)
249- $Tuple10(fromBase58String(struct[0]), (struct[1] == "1"), parseIntValue(struct[2]), parseIntValue(struct[3]), parseIntValue(struct[4]), parseIntValue(struct[5]), parseIntValue(struct[6]), parseIntValue(struct[7]), parseIntValue(struct[8]), addressFromStringValue(struct[9]))
251+ $Tuple10(fromBase58String(struct[0]), (struct[1] == "1"), parseIntValue(struct[2]), parseIntValue(struct[3]), parseIntValue(struct[4]), parseBigIntValue(struct[5]), parseBigIntValue(struct[6]), parseBigIntValue(struct[7]), parseBigIntValue(struct[8]), addressFromStringValue(struct[9]))
250252 case _ =>
251- $Tuple10(base58'', false, 0, 0, 0, 0, 0, 0, 0, Address(base58''))
253+ $Tuple10(base58'', false, 0, 0, 0, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, Address(base58''))
252254 }
253255
254256
272274
273275 func _loadAssetBalances () = {
274276 func foldFunc (acc,elem) = {
275- let balance = parseIntValue(elem)
277+ let balance = parseBigIntValue(elem)
276278 $Tuple2((acc._1 :+ balance), (acc._2 + balance))
277279 }
278280
282284 then {
283285 let $l = split_51C(a, SEP)
284286 let $s = size($l)
285- let $acc0 = $Tuple2(nil, 0)
287+ let $acc0 = $Tuple2(nil, ZERO_BIGINT)
286288 func $f0_1 ($a,$i) = if (($i >= $s))
287289 then $a
288290 else foldFunc($a, $l[$i])
293295
294296 $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)
295297 }
296- else $Tuple2(ZERO_INT_LIST_10, 0)
298+ else $Tuple2(ZERO_BIGINT_LIST_10, ZERO_BIGINT)
297299 case _ =>
298- $Tuple2(ZERO_INT_LIST_10, 0)
300+ $Tuple2(ZERO_BIGINT_LIST_10, ZERO_BIGINT)
299301 }
300302 }
301303
615617 }
616618
617619
620+func _pow10 (exponent_) = match exponent_ {
621+ case _ =>
622+ if ((8 == $match0))
623+ then 100000000
624+ else if ((7 == $match0))
625+ then 10000000
626+ else if ((6 == $match0))
627+ then 1000000
628+ else if ((5 == $match0))
629+ then 100000
630+ else if ((4 == $match0))
631+ then 10000
632+ else if ((3 == $match0))
633+ then 1000
634+ else if ((2 == $match0))
635+ then 100
636+ else if ((1 == $match0))
637+ then 10
638+ else if ((0 == $match0))
639+ then 1
640+ else throw(("_pow10: revert: " + toString(exponent_)))
641+}
642+
643+
618644 func _normalizeDecimals (amount_,sourceDecimals_,targetDecimals_,round_) = if ((sourceDecimals_ >= targetDecimals_))
619- then fraction(amount_, 1, pow(10, 0, (sourceDecimals_ - targetDecimals_), 0, 0, DOWN), round_)
620- else (amount_ * pow(10, 0, (targetDecimals_ - sourceDecimals_), 0, 0, DOWN))
645+ then fraction(amount_, toBigInt(1), toBigInt(_pow10((sourceDecimals_ - targetDecimals_))), round_)
646+ else (amount_ * toBigInt(_pow10((targetDecimals_ - sourceDecimals_))))
621647
622648
623649 func _prepareAssetBalances (assets_) = {
624- func foldFunc (acc,elem) = (acc :+ 0)
650+ func foldFunc (acc,elem) = (acc :+ ZERO_BIGINT)
625651
626652 let $l = assets_
627653 let $s = size($l)
659685 }
660686
661687
662-func _getAssetBalances (assets_,decimals_) = {
663- func foldFunc (acc,elem) = {
664- let assetDecimals = _getDecimals(elem)
665- let balance = _normalizeDecimals(assetBalance(this, fromBase58String(elem)), assetDecimals, decimals_, DOWN)
666- $Tuple2((acc._1 :+ balance), (acc._2 + balance))
667- }
668-
669- let $l = assets_
670- let $s = size($l)
671- let $acc0 = $Tuple2(nil, 0)
672- func $f0_1 ($a,$i) = if (($i >= $s))
673- then $a
674- else foldFunc($a, $l[$i])
675-
676- func $f0_2 ($a,$i) = if (($i >= $s))
677- then $a
678- else throw("List size exceeds 10")
679-
680- $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)
681- }
682-
683-
684688 func _listIntToString (assets_) = {
685689 func foldFunc (acc,elem) = (acc :+ toString(elem))
686690
714718
715719 func $f0_2 ($a,$i) = if (($i >= $s))
716720 then $a
717- else throw("List size exceeds 11")
718-
719- $f0_2($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)
721+ else throw("List size exceeds 65")
722+
723+ $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($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($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($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), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63), 64), 65)
720724 }, SEP)
721725 }
722726
723727
724728 func _getEquilibriums (sigmaBalances_,weights_,sigmaWeight_) = {
725- func foldFunc (acc,elem) = (acc :+ fraction(sigmaBalances_, elem, sigmaWeight_))
729+ func foldFunc (acc,elem) = (acc :+ fraction(sigmaBalances_, toBigInt(elem), toBigInt(sigmaWeight_)))
726730
727731 let $l = weights_
728732 let $s = size($l)
750754 let result = {
751755 let $l = balances_
752756 let $s = size($l)
753- let $acc0 = $Tuple3(0, nil, 0)
757+ let $acc0 = $Tuple3(0, nil, ZERO_BIGINT)
754758 func $f0_1 ($a,$i) = if (($i >= $s))
755759 then $a
756760 else foldFunc($a, $l[$i])
776780 if ((err == err))
777781 then {
778782 let assetDecimals = _getDecimals(paymentAssetStr)
779- let newBalance = (elem + _normalizeDecimals(payments_[index].amount, assetDecimals, decimals_, DOWN))
783+ let newBalance = (elem + _normalizeDecimals(toBigInt(payments_[index].amount), assetDecimals, decimals_, DOWN))
780784 $Tuple3((index + 1), (acc._2 :+ newBalance), (acc._3 + newBalance))
781785 }
782786 else throw("Strict value is not equal to itself.")
785789 let result = {
786790 let $l = balances_
787791 let $s = size($l)
788- let $acc0 = $Tuple3(0, nil, 0)
792+ let $acc0 = $Tuple3(0, nil, ZERO_BIGINT)
789793 func $f0_1 ($a,$i) = if (($i >= $s))
790794 then $a
791795 else foldFunc($a, $l[$i])
862866
863867 let $l = balances_
864868 let $s = size($l)
865- let $acc0 = $Tuple3(nil, 0, nil)
869+ let $acc0 = $Tuple3(nil, ZERO_BIGINT, nil)
866870 func $f0_1 ($a,$i) = if (($i >= $s))
867871 then $a
868872 else foldFunc($a, $l[$i])
878882 func _getPaymentsFromBalances (assets_,balances_,recipient_,sourceDecimals_) = {
879883 func foldFunc (acc,elem) = {
880884 let index = acc._1
881- $Tuple2((index + 1), (acc._2 :+ ScriptTransfer(recipient_, _normalizeDecimals(balances_[index], sourceDecimals_, _getDecimals(elem), DOWN), _strToAsset(elem))))
885+ $Tuple2((index + 1), (acc._2 :+ ScriptTransfer(recipient_, toInt(_normalizeDecimals(balances_[index], sourceDecimals_, _getDecimals(elem), DOWN)), _strToAsset(elem))))
882886 }
883887
884888 let result = {
910914 then fraction(maxDeviation, feeMaxRate_, FEE_RATE_FACTOR)
911915 else fraction(maxDeviation, feeRate, FEE_RATE_FACTOR)
912916 }
913- else 0
917+ else ZERO_BIGINT
914918 }
915919 else {
916920 let threshold = fraction(equilibrium_, (MAX_WEIGHT_AMPLIFIER + weightAmplifier_), MAX_WEIGHT_AMPLIFIER)
922926 then fraction(maxDeviation, feeMaxRate_, FEE_RATE_FACTOR)
923927 else fraction(maxDeviation, feeRate, FEE_RATE_FACTOR)
924928 }
925- else 0
929+ else ZERO_BIGINT
926930 }
927931
928932
929933 func _calculateFee (balances_,assetsTotalSupply_,weights_,sigmaWeight_,weightAmplifier_,slippageRate_,feeMaxRate_) = {
930934 func foldFunc (acc,balance) = {
931935 let index = acc._1
932- let equilibrium = fraction(assetsTotalSupply_, weights_[index], sigmaWeight_)
936+ let equilibrium = fraction(assetsTotalSupply_, toBigInt(weights_[index]), toBigInt(sigmaWeight_))
933937 $Tuple2((index + 1), (acc._2 + _calculateMicroFee(balance, equilibrium, weightAmplifier_, slippageRate_, feeMaxRate_)))
934938 }
935939
936940 let result = {
937941 let $l = balances_
938942 let $s = size($l)
939- let $acc0 = $Tuple2(0, 0)
943+ let $acc0 = $Tuple2(0, ZERO_BIGINT)
940944 func $f0_1 ($a,$i) = if (($i >= $s))
941945 then $a
942946 else foldFunc($a, $l[$i])
956960 else (lpTotalSupply_ == 0))
957961 then true
958962 else {
959- let prevAssetsRate = fraction((prevAssetTotalSupply_ - _calculateFee(prevAssetBalances_, prevAssetTotalSupply_, assetWeights_, sigmaWeight_, weightAmplifier_, slippageRate_, feeMaxRate_)), RATE_FACTOR, prevLpTotalSupply_)
960- let newAssetsRate = fraction((assetTotalSupply_ - _calculateFee(assetBalances_, assetTotalSupply_, assetWeights_, sigmaWeight_, weightAmplifier_, slippageRate_, feeMaxRate_)), RATE_FACTOR, lpTotalSupply_)
963+ let prevAssetsRate = fraction((prevAssetTotalSupply_ - _calculateFee(prevAssetBalances_, prevAssetTotalSupply_, assetWeights_, sigmaWeight_, weightAmplifier_, slippageRate_, feeMaxRate_)), RATE_FACTOR, toBigInt(prevLpTotalSupply_))
964+ let newAssetsRate = fraction((assetTotalSupply_ - _calculateFee(assetBalances_, assetTotalSupply_, assetWeights_, sigmaWeight_, weightAmplifier_, slippageRate_, feeMaxRate_)), RATE_FACTOR, toBigInt(lpTotalSupply_))
961965 let diff = (newAssetsRate - prevAssetsRate)
962- if (if ((0 >= diff))
963- then ((-1 * _loadPrecision()) > diff)
966+ if (if ((ZERO_BIGINT >= diff))
967+ then ((toBigInt(-1) * toBigInt(_loadPrecision())) > diff)
964968 else false)
965969 then throw(("_validateLiquidityInvariant: revert: diff=" + toString(diff)))
966970 else true
971975 let prevUtil = (prevAssetTotalSupply_ - _calculateFee(prevAssetBalances_, prevAssetTotalSupply_, assetWeights_, sigmaWeight_, weightAmplifier_, slippageRate_, feeMaxRate_))
972976 let newUtil = (assetTotalSupply_ - _calculateFee(assetBalances_, assetTotalSupply_, assetWeights_, sigmaWeight_, weightAmplifier_, slippageRate_, feeMaxRate_))
973977 let diff = (newUtil - prevUtil)
974- if (if ((0 >= diff))
975- then ((-1 * _loadPrecision()) > diff)
978+ if (if ((ZERO_BIGINT >= diff))
979+ then ((toBigInt(-1) * toBigInt(_loadPrecision())) > diff)
976980 else false)
977981 then throw(("_validateSwapInvariant: revert: diff=" + toString(diff)))
978982 else true
980984
981985
982986 func _validateAssetAllocation (balance_,assetTotalSupply_,prevBalance_,prevAssetTotalSupply_,weight_,sigmaWeight_,maxAllocAmp_) = {
983- let equilibrium = fraction(assetTotalSupply_, weight_, sigmaWeight_)
987+ let equilibrium = fraction(assetTotalSupply_, toBigInt(weight_), toBigInt(sigmaWeight_))
984988 let maxAllocationAmp = if ((balance_ > equilibrium))
985989 then (MAX_AMPLIFIER + maxAllocAmp_)
986990 else (MAX_AMPLIFIER - maxAllocAmp_)
987991 let maxAllocation = fraction(equilibrium, maxAllocationAmp, MAX_AMPLIFIER)
988- let prevMaxAllocation = fraction(fraction(prevAssetTotalSupply_, weight_, sigmaWeight_), maxAllocationAmp, MAX_AMPLIFIER)
992+ let prevMaxAllocation = fraction(fraction(prevAssetTotalSupply_, toBigInt(weight_), toBigInt(sigmaWeight_)), maxAllocationAmp, MAX_AMPLIFIER)
989993 if ((balance_ > equilibrium))
990994 then if ((balance_ > maxAllocation))
991995 then if ((prevMaxAllocation > prevBalance_))
10411045 $Tuple2((index + 1), (acc._2 :+ profitUpdated))
10421046 }
10431047
1044- let $t02462924702 = {
1048+ let $t02527625349 = {
10451049 let $l = ZERO_INT_LIST_11
10461050 let $s = size($l)
10471051 let $acc0 = $Tuple2(0, nil)
10551059
10561060 $f0_2($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)
10571061 }
1058- let idx = $t02462924702._1
1059- let profitsUpdated = $t02462924702._2
1062+ let idx = $t02527625349._1
1063+ let profitsUpdated = $t02527625349._2
10601064 $Tuple2((_saveUserProfits(user_, profitsUpdated) ++ _saveUserSigmaFeePerLp(user_, sigmaFeePerLp)), profitsUpdated)
10611065 }
10621066
10701074 $Tuple2((index + 1), (acc._2 :+ sigmaFeePerLpUpdated))
10711075 }
10721076
1073- let $t02535225431 = {
1077+ let $t02599926078 = {
10741078 let $l = ZERO_INT_LIST_11
10751079 let $s = size($l)
10761080 let $acc0 = $Tuple2(0, nil)
10841088
10851089 $f0_2($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)
10861090 }
1087- let idx = $t02535225431._1
1088- let sigmaFeePerLpUpdated = $t02535225431._2
1091+ let idx = $t02599926078._1
1092+ let sigmaFeePerLpUpdated = $t02599926078._2
10891093 sigmaFeePerLpUpdated
10901094 }
10911095
10931097 func _calculateLpAndProtocolFees (assetIndex_,amount_,lpFeeRate_,protocolFeeRate_) = {
10941098 let sigmaFeePerLp = _loadSigmaFeePerLp()
10951099 let totalLp = _loadTotalLp()
1096- let $t02565225927 = if ((totalLp == 0))
1100+ let $t02629926574 = if ((totalLp == 0))
10971101 then $Tuple2(0, fraction(amount_, protocolFeeRate_, MAX_FEE))
10981102 else $Tuple2(fraction(amount_, lpFeeRate_, MAX_FEE), fraction(amount_, protocolFeeRate_, MAX_FEE))
1099- let lpFee = $t02565225927._1
1100- let protocolFee = $t02565225927._2
1103+ let lpFee = $t02629926574._1
1104+ let protocolFee = $t02629926574._2
11011105 let sigmaFeePerLpUpdated = if ((lpFee == 0))
11021106 then sigmaFeePerLp
11031107 else _updateSigmaFeePerLp(sigmaFeePerLp, totalLp, assetIndex_, lpFee)
11121116 let slippageRate = storage._8
11131117 let feeMaxRate = storage._9
11141118 let assets = _loadAssets()
1115- let $t02643626489 = _loadAssetWeights()
1116- let assetWeights = $t02643626489._1
1117- let sigmaWeight = $t02643626489._2
1118- let $t02649426562 = _loadAssetBalances()
1119- let prevAssetBalances = $t02649426562._1
1120- let prevAssetTotalSupply = $t02649426562._2
1121- let $t02656827798 = if ((prevAssetTotalSupply == 0))
1119+ let $t02708327136 = _loadAssetWeights()
1120+ let assetWeights = $t02708327136._1
1121+ let sigmaWeight = $t02708327136._2
1122+ let $t02714127209 = _loadAssetBalances()
1123+ let prevAssetBalances = $t02714127209._1
1124+ let prevAssetTotalSupply = $t02714127209._2
1125+ let $t02721528461 = if ((prevAssetTotalSupply == ZERO_BIGINT))
11221126 then {
11231127 func foldFunc (acc,elem) = {
11241128 let index = acc._1
11261130 $Tuple2((index + 1), (acc._2 :+ requiredAmountNormalized))
11271131 }
11281132
1129- let $t02701027084 = {
1133+ let $t02767027744 = {
11301134 let $l = assets
11311135 let $s = size($l)
11321136 let $acc0 = $Tuple2(0, nil)
11401144
11411145 $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)
11421146 }
1143- let idx = $t02701027084._1
1144- let requiredAmountsNormalized = $t02701027084._2
1147+ let idx = $t02767027744._1
1148+ let requiredAmountsNormalized = $t02767027744._2
11451149 $Tuple2(amount_, requiredAmountsNormalized)
11461150 }
11471151 else {
1148- let ratio = fraction(toBigInt(amount_), PERCENT_FACTOR, toBigInt(prevAssetTotalSupply))
1152+ let ratio = fraction(toBigInt(amount_), PERCENT_FACTOR, prevAssetTotalSupply)
11491153 func foldFunc1 (acc,elem) = {
11501154 let index = acc._1
1151- let requiredAmountNormalized = toInt(fraction(ratio, toBigInt(prevAssetBalances[index]), PERCENT_FACTOR))
1155+ let requiredAmountNormalized = fraction(ratio, prevAssetBalances[index], PERCENT_FACTOR)
11521156 $Tuple2((index + 1), (acc._2 :+ requiredAmountNormalized))
11531157 }
11541158
1155- let $t02762727702 = {
1159+ let $t02826028335 = {
11561160 let $l = assets
11571161 let $s = size($l)
11581162 let $acc0 = $Tuple2(0, nil)
11661170
11671171 $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)
11681172 }
1169- let idx = $t02762727702._1
1170- let requiredAmountsNormalized = $t02762727702._2
1171- $Tuple2(fraction(amount_, lpTotalSupply, prevAssetTotalSupply), requiredAmountsNormalized)
1172- }
1173- let lpTokensToMint = $t02656827798._1
1174- let requiredAmountsNormalized = $t02656827798._2
1175- let $t02780427917 = _incrementBalancesByAmounts(prevAssetBalances, requiredAmountsNormalized)
1176- let assetBalances = $t02780427917._1
1177- let assetTotalSupply = $t02780427917._2
1173+ let idx = $t02826028335._1
1174+ let requiredAmountsNormalized = $t02826028335._2
1175+ $Tuple2(toInt(fraction(toBigInt(amount_), toBigInt(lpTotalSupply), prevAssetTotalSupply)), requiredAmountsNormalized)
1176+ }
1177+ let lpTokensToMint = $t02721528461._1
1178+ let requiredAmountsNormalized = $t02721528461._2
1179+ let $t02846728580 = _incrementBalancesByAmounts(prevAssetBalances, requiredAmountsNormalized)
1180+ let assetBalances = $t02846728580._1
1181+ let assetTotalSupply = $t02846728580._2
11781182 let err2 = _validateLiquidityInvariant(prevAssetBalances, prevAssetTotalSupply, assetBalances, assetTotalSupply, lpTotalSupply, (lpTotalSupply + lpTokensToMint), assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
11791183 if ((err2 == err2))
11801184 then $Tuple3(lpTokensToMint, requiredAmountsNormalized, assetBalances)
11901194 let slippageRate = storage._8
11911195 let feeMaxRate = storage._9
11921196 let assets = _loadAssets()
1193- let $t02861228665 = _loadAssetWeights()
1194- let assetWeights = $t02861228665._1
1195- let sigmaWeight = $t02861228665._2
1196- let $t02867028784 = _loadAssetBalances()
1197- let prevAssetBalances = $t02867028784._1
1198- let prevAssetTotalSupply = $t02867028784._2
1197+ let $t02927829331 = _loadAssetWeights()
1198+ let assetWeights = $t02927829331._1
1199+ let sigmaWeight = $t02927829331._2
1200+ let $t02933629450 = _loadAssetBalances()
1201+ let prevAssetBalances = $t02933629450._1
1202+ let prevAssetTotalSupply = $t02933629450._2
11991203 let assetBalances = _incrementBalanceByIndex(prevAssetBalances, value(indexOf(assets, assetId_)), amount_)
12001204 let assetTotalSupply = (prevAssetTotalSupply + amount_)
12011205 let err2 = _validateAllocation(assetBalances, assetTotalSupply, prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, maxAllocAmplifier)
12041208 let prevFee = _calculateFee(prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
12051209 let fee = _calculateFee(assetBalances, assetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
12061210 let lpTokensToMint = if ((lpTotalSupply == 0))
1207- then (assetTotalSupply - fee)
1211+ then toInt((assetTotalSupply - fee))
12081212 else {
12091213 let assetDiff = (assetTotalSupply - prevAssetTotalSupply)
12101214 let feeDiff = (fee - prevFee)
12111215 let utilityChangeFactor = fraction((assetDiff - feeDiff), RATE_FACTOR, (prevAssetTotalSupply - prevFee))
1212- let lpTokensToMintInner = fraction(lpTotalSupply, utilityChangeFactor, RATE_FACTOR)
1216+ let lpTokensToMintInner = toInt(fraction(toBigInt(lpTotalSupply), utilityChangeFactor, RATE_FACTOR))
12131217 let err3 = _validateLiquidityInvariant(prevAssetBalances, prevAssetTotalSupply, assetBalances, assetTotalSupply, lpTotalSupply, (lpTotalSupply + lpTokensToMintInner), assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
12141218 if ((err3 == err3))
12151219 then lpTokensToMintInner
12301234 let weightAmplifier = storage._7
12311235 let slippageRate = storage._8
12321236 let feeMaxRate = storage._9
1233- let $t03071130779 = _loadAssetBalances()
1234- let prevAssetBalances = $t03071130779._1
1235- let prevAssetTotalSupply = $t03071130779._2
1236- let $t03078430837 = _loadAssetWeights()
1237- let assetWeights = $t03078430837._1
1238- let sigmaWeight = $t03078430837._2
1237+ let $t03146031528 = _loadAssetBalances()
1238+ let prevAssetBalances = $t03146031528._1
1239+ let prevAssetTotalSupply = $t03146031528._2
1240+ let $t03153331586 = _loadAssetWeights()
1241+ let assetWeights = $t03153331586._1
1242+ let sigmaWeight = $t03153331586._2
12391243 let lpTokensToBurn = amount_
1240- let err = _validateInt(lpTokensToBurn, 0, MAX_INT, "_withdrawAll: lpTokensToBurn less than 0")
1241- if ((err == err))
1242- then {
1243- let $t03097931112 = _decrementBalancesByLpAmount(prevAssetBalances, lpTokensToBurn, lpTotalSupply)
1244- let assetBalances = $t03097931112._1
1245- let assetTotalSupply = $t03097931112._2
1246- let balancesToPay = $t03097931112._3
1247- let err2 = _validateLiquidityInvariant(prevAssetBalances, prevAssetTotalSupply, assetBalances, assetTotalSupply, lpTotalSupply, (lpTotalSupply - lpTokensToBurn), assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
1248- if ((err2 == err2))
1249- then $Tuple3(lpTokensToBurn, balancesToPay, assetBalances)
1250- else throw("Strict value is not equal to itself.")
1251- }
1244+ let $t03162531780 = _decrementBalancesByLpAmount(prevAssetBalances, toBigInt(lpTokensToBurn), toBigInt(lpTotalSupply))
1245+ let assetBalances = $t03162531780._1
1246+ let assetTotalSupply = $t03162531780._2
1247+ let balancesToPay = $t03162531780._3
1248+ let err2 = _validateLiquidityInvariant(prevAssetBalances, prevAssetTotalSupply, assetBalances, assetTotalSupply, lpTotalSupply, (lpTotalSupply - lpTokensToBurn), assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
1249+ if ((err2 == err2))
1250+ then $Tuple3(lpTokensToBurn, balancesToPay, assetBalances)
12521251 else throw("Strict value is not equal to itself.")
12531252 }
12541253
12641263 let feeMaxRate = storage._9
12651264 let precision = _loadPrecision()
12661265 let assets = _loadAssets()
1267- let $t03190431972 = _loadAssetBalances()
1268- let prevAssetBalances = $t03190431972._1
1269- let prevAssetTotalSupply = $t03190431972._2
1270- let $t03197732030 = _loadAssetWeights()
1271- let assetWeights = $t03197732030._1
1272- let sigmaWeight = $t03197732030._2
1266+ let $t03257232640 = _loadAssetBalances()
1267+ let prevAssetBalances = $t03257232640._1
1268+ let prevAssetTotalSupply = $t03257232640._2
1269+ let $t03264532698 = _loadAssetWeights()
1270+ let assetWeights = $t03264532698._1
1271+ let sigmaWeight = $t03264532698._2
12731272 let targetAssetIndex = value(indexOf(assets, assetId_))
12741273 let prevFee = _calculateFee(prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
12751274 let prevUtilValue = (prevAssetTotalSupply - prevFee)
12761275 let k = fraction(toBigInt((lpTotalSupply - lpAmount_)), PERCENT_FACTOR, toBigInt(lpTotalSupply))
1277- let prevUtilValueWithK = toInt(fraction(toBigInt(prevUtilValue), k, PERCENT_FACTOR))
1276+ let prevUtilValueWithK = fraction(prevUtilValue, k, PERCENT_FACTOR)
12781277 func foldFunc (acc,elem) = if (acc._1)
12791278 then acc
12801279 else {
12811280 let startInner = acc._2
12821281 let stopInner = acc._3
1283- let currentAmount = ((stopInner + startInner) / 2)
1282+ let currentAmount = ((stopInner + startInner) / toBigInt(2))
12841283 let tempAssetBalances = _decrementBalanceByIndex(prevAssetBalances, targetAssetIndex, currentAmount)
12851284 let tempAssetTotalSupply = (prevAssetTotalSupply - currentAmount)
12861285 let utilValue = (tempAssetTotalSupply - _calculateFee(tempAssetBalances, tempAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate))
1287- if (if ((precision > (utilValue - prevUtilValueWithK)))
1288- then ((utilValue - prevUtilValueWithK) >= 0)
1286+ if (if ((toBigInt(precision) > (utilValue - prevUtilValueWithK)))
1287+ then ((utilValue - prevUtilValueWithK) >= ZERO_BIGINT)
12891288 else false)
12901289 then $Tuple4(true, startInner, stopInner, currentAmount)
1291- else if ((0 > (utilValue - prevUtilValueWithK)))
1292- then $Tuple4(false, startInner, currentAmount, 0)
1293- else $Tuple4(false, currentAmount, stopInner, 0)
1290+ else if ((ZERO_BIGINT > (utilValue - prevUtilValueWithK)))
1291+ then $Tuple4(false, startInner, currentAmount, ZERO_BIGINT)
1292+ else $Tuple4(false, currentAmount, stopInner, ZERO_BIGINT)
12941293 }
12951294
12961295 let targetAmount = {
1297- let $t03352933644 = {
1296+ let $t03426334409 = {
12981297 let $l = LIST_64
12991298 let $s = size($l)
1300- let $acc0 = $Tuple4(false, 0, (lpAmount_ + prevFee), 0)
1299+ let $acc0 = $Tuple4(false, ZERO_BIGINT, (toBigInt(lpAmount_) + prevFee), ZERO_BIGINT)
13011300 func $f0_1 ($a,$i) = if (($i >= $s))
13021301 then $a
13031302 else foldFunc($a, $l[$i])
13041303
13051304 func $f0_2 ($a,$i) = if (($i >= $s))
13061305 then $a
1307- else throw("List size exceeds 64")
1308-
1309- $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($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($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($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), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63), 64)
1310- }
1311- let success = $t03352933644._1
1312- let startOut = $t03352933644._2
1313- let stopOut = $t03352933644._3
1314- let targetAmountOut = $t03352933644._4
1306+ else throw("List size exceeds 20")
1307+
1308+ $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)
1309+ }
1310+ let success = $t03426334409._1
1311+ let startOut = $t03426334409._2
1312+ let stopOut = $t03426334409._3
1313+ let targetAmountOut = $t03426334409._4
13151314 if (!(success))
13161315 then throw(("_withdraw: can't calculate targetAmount=" + toString(targetAmountOut)))
13171316 else targetAmountOut
13231322 else false
13241323 if ((err1 == err1))
13251324 then {
1326- let $t03451934659 = _calculateLpAndProtocolFees((targetAssetIndex + 1), targetAmount, lpFeeRate, protocolFeeRate)
1327- let lpFee = $t03451934659._1
1328- let protocolFee = $t03451934659._2
1329- let sigmaFeePerLpUpdated = $t03451934659._3
1325+ let $t03528435432 = _calculateLpAndProtocolFees((targetAssetIndex + 1), toInt(targetAmount), lpFeeRate, protocolFeeRate)
1326+ let lpFee = $t03528435432._1
1327+ let protocolFee = $t03528435432._2
1328+ let sigmaFeePerLpUpdated = $t03528435432._3
13301329 $Tuple5(targetAmount, finalAssetBalances, lpFee, protocolFee, sigmaFeePerLpUpdated)
13311330 }
13321331 else throw("Strict value is not equal to itself.")
13451344 let slippageRate = storage._8
13461345 let feeMaxRate = storage._9
13471346 let precision = _loadPrecision()
1348- let $t03524135309 = _loadAssetBalances()
1349- let prevAssetBalances = $t03524135309._1
1350- let prevAssetTotalSupply = $t03524135309._2
1351- let $t03531435367 = _loadAssetWeights()
1352- let assetWeights = $t03531435367._1
1353- let sigmaWeight = $t03531435367._2
1347+ let $t03601736085 = _loadAssetBalances()
1348+ let prevAssetBalances = $t03601736085._1
1349+ let prevAssetTotalSupply = $t03601736085._2
1350+ let $t03609036143 = _loadAssetWeights()
1351+ let assetWeights = $t03609036143._1
1352+ let sigmaWeight = $t03609036143._2
13541353 let assetBalances = _incrementBalanceByIndex(prevAssetBalances, sourceAssetIndex_, sourceAmount_)
13551354 let assetTotalSupply = (prevAssetTotalSupply + sourceAmount_)
13561355 let prevFee = _calculateFee(prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
13601359 else {
13611360 let startInner = acc._2
13621361 let stopInner = acc._3
1363- let currentAmount = ((stopInner + startInner) / 2)
1362+ let currentAmount = ((stopInner + startInner) / toBigInt(2))
13641363 let tempAssetBalances = _decrementBalanceByIndex(assetBalances, targetAssetIndex_, currentAmount)
13651364 let tempAssetTotalSupply = (assetTotalSupply - currentAmount)
13661365 let utilValue = (tempAssetTotalSupply - _calculateFee(tempAssetBalances, tempAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate))
1367- if (if ((precision > (utilValue - prevUtilValue)))
1368- then ((utilValue - prevUtilValue) >= 0)
1366+ if (if ((toBigInt(precision) > (utilValue - prevUtilValue)))
1367+ then ((utilValue - prevUtilValue) >= ZERO_BIGINT)
13691368 else false)
13701369 then $Tuple4(true, startInner, stopInner, currentAmount)
1371- else if ((0 > (utilValue - prevUtilValue)))
1372- then if ((((startInner + currentAmount) / 2) == 0))
1373- then throw(((toString(utilValue) + " ") + toString(prevUtilValue)))
1374- else $Tuple5(false, startInner, currentAmount, currentAmount, (acc._5 :+ utilValue))
1375- else if ((((stopInner + currentAmount) / 2) == 0))
1376- then throw(((toString(utilValue) + " ") + toString(prevUtilValue)))
1377- else $Tuple5(false, currentAmount, stopInner, currentAmount, (acc._5 :+ utilValue))
1370+ else if ((ZERO_BIGINT > (utilValue - prevUtilValue)))
1371+ then $Tuple5(false, startInner, currentAmount, currentAmount, (acc._5 :+ utilValue))
1372+ else $Tuple5(false, currentAmount, stopInner, currentAmount, (acc._5 :+ utilValue))
13781373 }
13791374
13801375 let targetAmount = {
13831378 let tempAssetTotalSupply = (assetTotalSupply - targetAmount)
13841379 let fee = _calculateFee(tempAssetBalances, tempAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
13851380 let feeDiff = (fee - prevFee)
1386- if ((feeDiff == 0))
1381+ if ((feeDiff == ZERO_BIGINT))
13871382 then targetAmount
13881383 else {
1389- let $t03764637776 = {
1384+ let $t03855438704 = {
13901385 let $l = LIST_64
13911386 let $s = size($l)
1392- let $acc0 = $Tuple5(false, 0, (sourceAmount_ + prevFee), 0, nil)
1387+ let $acc0 = $Tuple5(false, ZERO_BIGINT, (sourceAmount_ + prevFee), ZERO_BIGINT, nil)
13931388 func $f0_1 ($a,$i) = if (($i >= $s))
13941389 then $a
13951390 else foldFunc($a, $l[$i])
13961391
13971392 func $f0_2 ($a,$i) = if (($i >= $s))
13981393 then $a
1399- else throw("List size exceeds 64")
1400-
1401- $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($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($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($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), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63), 64)
1394+ else throw("List size exceeds 46")
1395+
1396+ $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($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($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), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46)
14021397 }
1403- let success = $t03764637776._1
1404- let startOut = $t03764637776._2
1405- let stopOut = $t03764637776._3
1406- let targetAmountOut = $t03764637776._4
1407- let debug = $t03764637776._5
1398+ let success = $t03855438704._1
1399+ let startOut = $t03855438704._2
1400+ let stopOut = $t03855438704._3
1401+ let targetAmountOut = $t03855438704._4
1402+ let debug = $t03855438704._5
14081403 if (!(success))
1409- then throw(_listIntToString(debug))
1404+ then throw(_listBigIntToString(debug))
14101405 else targetAmountOut
14111406 }
14121407 }
14171412 else false
14181413 if ((err1 == err1))
14191414 then {
1420- let $t03863938780 = _calculateLpAndProtocolFees((targetAssetIndex_ + 1), targetAmount, lpFeeRate, protocolFeeRate)
1421- let lpFee = $t03863938780._1
1422- let protocolFee = $t03863938780._2
1423- let sigmaFeePerLpUpdated = $t03863938780._3
1415+ let $t03957039719 = _calculateLpAndProtocolFees((targetAssetIndex_ + 1), toInt(targetAmount), lpFeeRate, protocolFeeRate)
1416+ let lpFee = $t03957039719._1
1417+ let protocolFee = $t03957039719._2
1418+ let sigmaFeePerLpUpdated = $t03957039719._3
14241419 $Tuple5(targetAmount, finalAssetBalances, lpFee, protocolFee, sigmaFeePerLpUpdated)
14251420 }
14261421 else throw("Strict value is not equal to itself.")
14501445 else false)
14511446 then _validateDecimals(lpTokenDecimals_, "init: invalid decimals")
14521447 else false)
1453- then _validateInt(maxAllocationAmplifier_, 0, MAX_AMPLIFIER, "init: invalid maxAllocationAmplifier")
1448+ then _validateInt(maxAllocationAmplifier_, 0, toInt(MAX_AMPLIFIER), "init: invalid maxAllocationAmplifier")
14541449 else false)
14551450 then _validateInt(weightAmplifier_, 0, maxAllocationAmplifier_, "init: invalid weightAmplifier")
14561451 else false)
14661461 else false
14671462 if ((err == err))
14681463 then {
1469- let $t04064340712 = _prepareAssetWeights(assetWeights_)
1470- let assetWeights = $t04064340712._1
1471- let sigmaWeight = $t04064340712._2
1464+ let $t04159041659 = _prepareAssetWeights(assetWeights_)
1465+ let assetWeights = $t04159041659._1
1466+ let sigmaWeight = $t04159041659._2
14721467 let assetBalances = _prepareAssetBalances(assets_)
14731468 let issue = Issue(lpTokenName_, lpTokenDescr_, 0, lpTokenDecimals_, true)
14741469 let lpAssetId = calculateAssetId(issue)
1475- let storageUpdated = $Tuple10(lpAssetId, true, 0, lpFeeRate_, protocolFeeRate_, maxAllocationAmplifier_, weightAmplifier_, slippageRate_, feeMaxRate_, addressFromStringValue(protocolFeeContract_))
1470+ let storageUpdated = $Tuple10(lpAssetId, true, 0, lpFeeRate_, protocolFeeRate_, toBigInt(maxAllocationAmplifier_), toBigInt(weightAmplifier_), toBigInt(slippageRate_), toBigInt(feeMaxRate_), addressFromStringValue(protocolFeeContract_))
14761471 $Tuple2(((((((([issue] ++ _saveStorage(storageUpdated)) ++ _saveAssets(assets_)) ++ _saveAssetBalances(assetBalances)) ++ _saveAssetWeights(assetWeights)) ++ _savePrecision(precision_)) ++ _saveSigmaFeePerLp(_loadSigmaFeePerLp())) ++ _savePauser(addressFromStringValue(pauser_))), unit)
14771472 }
14781473 else throw("Strict value is not equal to itself.")
14931488 let lpAssetId = storage._1
14941489 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
14951490 let assets = _loadAssets()
1496- let $t04246242547 = _depositAll(amount_)
1497- let lpTokensToMint = $t04246242547._1
1498- let requiredAmountsNormalized = $t04246242547._2
1499- let assetBalances = $t04246242547._3
1491+ let $t04340943494 = _depositAll(amount_)
1492+ let lpTokensToMint = $t04340943494._1
1493+ let requiredAmountsNormalized = $t04340943494._2
1494+ let assetBalances = $t04340943494._3
15001495 func foldFunc (acc,elem) = {
15011496 let index = acc._1
15021497 let paymentAssetStr = _assetToStr(i.payments[index].assetId)
15031498 let paymentAssetDecimals = _getDecimals(paymentAssetStr)
15041499 let requiredAmountNormalized = requiredAmountsNormalized[index]
1505- let requiredAmount = _normalizeDecimals(requiredAmountNormalized, lpDecimals, paymentAssetDecimals, CEILING)
1500+ let requiredAmount = toInt(_normalizeDecimals(requiredAmountNormalized, lpDecimals, paymentAssetDecimals, CEILING))
15061501 let err1 = if ((paymentAssetStr != elem))
15071502 then throw(("depositAll: invalid payment: index=" + toString(index)))
15081503 else if ((0 >= requiredAmount))
15201515 else throw("Strict value is not equal to itself.")
15211516 }
15221517
1523- let $t04369043752 = {
1518+ let $t04469244754 = {
15241519 let $l = assets
15251520 let $s = size($l)
15261521 let $acc0 = $Tuple2(0, nil)
15341529
15351530 $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)
15361531 }
1537- let idx = $t04369043752._1
1538- let changeActions = $t04369043752._2
1532+ let idx = $t04469244754._1
1533+ let changeActions = $t04469244754._2
15391534 let storageUpdated = $Tuple10(storage._1, storage._2, (storage._3 + lpTokensToMint), storage._4, storage._5, storage._6, storage._7, storage._8, storage._9, storage._10)
15401535 $Tuple2(((([Reissue(lpAssetId, lpTokensToMint, true), ScriptTransfer(i.caller, lpTokensToMint, lpAssetId)] ++ _saveStorage(storageUpdated)) ++ _saveAssetBalances(assetBalances)) ++ changeActions), unit)
15411536 }
15651560 then {
15661561 let assetStr = _assetToStr(i.payments[0].assetId)
15671562 let assetDecimals = _getDecimals(assetStr)
1568- let amountNormalized = _normalizeDecimals(i.payments[0].amount, assetDecimals, lpDecimals, DOWN)
1569- let $t04513145205 = _deposit(assetStr, amountNormalized)
1570- let lpTokensToMint = $t04513145205._1
1571- let assetBalances = $t04513145205._2
1563+ let amountNormalized = _normalizeDecimals(toBigInt(i.payments[0].amount), assetDecimals, lpDecimals, DOWN)
1564+ let $t04616146261 = _deposit(assetStr, amountNormalized)
1565+ let lpTokensToMint = $t04616146261._1
1566+ let assetBalances = $t04616146261._2
15721567 let err2 = _validateInt(lpTokensToMint, minLpAmount_, MAX_INT, "deposit: less than min lp")
15731568 if ((err2 == err2))
15741569 then {
16021597 else false
16031598 if ((err == err))
16041599 then {
1605- let $t04642646513 = _withdrawAll(i.payments[0].amount)
1606- let lpTokensToBurn = $t04642646513._1
1607- let balancesToPay = $t04642646513._2
1608- let assetBalances = $t04642646513._3
1600+ let $t04748147568 = _withdrawAll(i.payments[0].amount)
1601+ let lpTokensToBurn = $t04748147568._1
1602+ let balancesToPay = $t04748147568._2
1603+ let assetBalances = $t04748147568._3
16091604 let paymentActions = _getPaymentsFromBalances(assets, balancesToPay, i.caller, lpDecimals)
16101605 let storageUpdated = $Tuple10(storage._1, storage._2, (storage._3 - lpTokensToBurn), storage._4, storage._5, storage._6, storage._7, storage._8, storage._9, storage._10)
16111606 $Tuple2(((([Burn(lpAssetId, lpTokensToBurn)] ++ paymentActions) ++ _saveStorage(storageUpdated)) ++ _saveAssetBalances(assetBalances)), unit)
16371632 else false
16381633 if ((err == err))
16391634 then {
1640- let $t04783947973 = _withdraw(assetId_, i.payments[0].amount)
1641- let targetAmountNormalized = $t04783947973._1
1642- let finalAssetBalances = $t04783947973._2
1643- let lpFee = $t04783947973._3
1644- let protocolFee = $t04783947973._4
1645- let sigmaFeePerLpUpdated = $t04783947973._5
1646- let finalAmountNormalized = ((targetAmountNormalized - lpFee) - protocolFee)
1635+ let $t04889449028 = _withdraw(assetId_, i.payments[0].amount)
1636+ let targetAmountNormalized = $t04889449028._1
1637+ let finalAssetBalances = $t04889449028._2
1638+ let lpFee = $t04889449028._3
1639+ let protocolFee = $t04889449028._4
1640+ let sigmaFeePerLpUpdated = $t04889449028._5
1641+ let finalAmountNormalized = ((toInt(targetAmountNormalized) - lpFee) - protocolFee)
16471642 let targetDecimals = _getDecimals(assetId_)
1648- let finalAmount = _normalizeDecimals(finalAmountNormalized, lpDecimals, targetDecimals, DOWN)
1643+ let finalAmount = toInt(_normalizeDecimals(toBigInt(finalAmountNormalized), lpDecimals, targetDecimals, DOWN))
16491644 let err1 = _validateInt(finalAmount, minAmount_, MAX_INT, "withdraw: insufficient final amount")
16501645 if ((err1 == err1))
16511646 then {
16661661 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
16671662 let assets = _loadAssets()
16681663 let sourceAssetStr = _assetToStr(i.payments[0].assetId)
1669- let sourceAmountNormalized = _normalizeDecimals(i.payments[0].amount, _getDecimals(sourceAssetStr), lpDecimals, DOWN)
1664+ let sourceAmountNormalized = _normalizeDecimals(toBigInt(i.payments[0].amount), _getDecimals(sourceAssetStr), lpDecimals, DOWN)
16701665 let sourceAssetIndex = valueOrErrorMessage(indexOf(assets, sourceAssetStr), "swap: invalid source asset")
16711666 if ((sourceAssetIndex == sourceAssetIndex))
16721667 then {
16781673 else false)
16791674 then _validateInt(minAmount_, 0, MAX_INT, "swap: invalid min target amount")
16801675 else false)
1681- then _validateInt(sourceAmountNormalized, 1, MAX_INT, "swap: invalid source amount")
1676+ then _validateInt(toInt(sourceAmountNormalized), 1, MAX_INT, "swap: invalid source amount")
16821677 else false)
16831678 then _validateStringNotEq(sourceAssetStr, targetAssetId_, "swap: same assets")
16841679 else false)
16861681 else false
16871682 if ((err == err))
16881683 then {
1689- let $t05007050228 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
1690- let targetAmountNormalized = $t05007050228._1
1691- let finalAssetBalances = $t05007050228._2
1692- let lpFee = $t05007050228._3
1693- let protocolFee = $t05007050228._4
1694- let sigmaFeePerLpUpdated = $t05007050228._5
1695- let finalAmountNormalized = ((targetAmountNormalized - lpFee) - protocolFee)
1684+ let $t05120551363 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
1685+ let targetAmountNormalized = $t05120551363._1
1686+ let finalAssetBalances = $t05120551363._2
1687+ let lpFee = $t05120551363._3
1688+ let protocolFee = $t05120551363._4
1689+ let sigmaFeePerLpUpdated = $t05120551363._5
1690+ let finalAmountNormalized = ((toInt(targetAmountNormalized) - lpFee) - protocolFee)
16961691 let targetDecimals = _getDecimals(targetAssetId_)
1697- let finalAmount = _normalizeDecimals(finalAmountNormalized, lpDecimals, targetDecimals, DOWN)
1692+ let finalAmount = toInt(_normalizeDecimals(toBigInt(finalAmountNormalized), lpDecimals, targetDecimals, DOWN))
16981693 let err1 = _validateInt(finalAmount, minAmount_, MAX_INT, "swap: insufficient final amount")
16991694 if ((err1 == err1))
17001695 then $Tuple2((((([ScriptTransfer(i.caller, finalAmount, _strToAsset(targetAssetId_))] ++ _saveAssetBalances(finalAssetBalances)) ++ _saveLpFee(targetAssetId_, (lpFee + _loadLpFee(targetAssetId_)))) ++ _saveProtocolFee(targetAssetId_, (protocolFee + _loadProtocolFee(targetAssetId_)))) ++ _saveSigmaFeePerLp(sigmaFeePerLpUpdated)), unit)
17141709 let err = _validateInt(lpAmount_, 1, MAX_INT, "getDepositAll: invalid amount")
17151710 if ((err == err))
17161711 then {
1717- let $t05136051447 = _depositAll(lpAmount_)
1718- let lpTokensToMint = $t05136051447._1
1719- let requiredAmountsNormalized = $t05136051447._2
1720- let assetBalances = $t05136051447._3
1712+ let $t05252252609 = _depositAll(lpAmount_)
1713+ let lpTokensToMint = $t05252252609._1
1714+ let requiredAmountsNormalized = $t05252252609._2
1715+ let assetBalances = $t05252252609._3
17211716 $Tuple2(nil, $Tuple2(lpTokensToMint, requiredAmountsNormalized))
17221717 }
17231718 else throw("Strict value is not equal to itself.")
17361731 let lpAssetId = storage._1
17371732 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
17381733 let assetDecimals = _getDecimals(assetId_)
1739- let amountNormalized = _normalizeDecimals(amount_, assetDecimals, lpDecimals, DOWN)
1740- let $t05220652280 = _deposit(assetId_, amountNormalized)
1741- let lpTokensToMint = $t05220652280._1
1742- let assetBalances = $t05220652280._2
1734+ let amountNormalized = _normalizeDecimals(toBigInt(amount_), assetDecimals, lpDecimals, DOWN)
1735+ let $t05337953453 = _deposit(assetId_, amountNormalized)
1736+ let lpTokensToMint = $t05337953453._1
1737+ let assetBalances = $t05337953453._2
17431738 $Tuple2(nil, lpTokensToMint)
17441739 }
17451740 else throw("Strict value is not equal to itself.")
17521747 let err = _validateInt(lpAmount_, 0, MAX_INT, "getWithdrawAll: invalid amount")
17531748 if ((err == err))
17541749 then {
1755- let $t05265752733 = _withdrawAll(lpAmount_)
1756- let lpTokensToBurn = $t05265752733._1
1757- let balancesToGet = $t05265752733._2
1758- let assetBalances = $t05265752733._3
1750+ let $t05383053906 = _withdrawAll(lpAmount_)
1751+ let lpTokensToBurn = $t05383053906._1
1752+ let balancesToGet = $t05383053906._2
1753+ let assetBalances = $t05383053906._3
17591754 $Tuple2(nil, balancesToGet)
17601755 }
17611756 else throw("Strict value is not equal to itself.")
17731768 let storage = _loadStorage()
17741769 let lpAssetId = storage._1
17751770 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
1776- let $t05338453500 = _withdraw(assetId_, amount_)
1777- let targetAmountNormalized = $t05338453500._1
1778- let assetBalances = $t05338453500._2
1779- let lpFee = $t05338453500._3
1780- let protocolFee = $t05338453500._4
1781- let sigmaFeePerLpUpdated = $t05338453500._5
1782- let finalAmountNormalized = ((targetAmountNormalized - lpFee) - protocolFee)
1771+ let $t05455754673 = _withdraw(assetId_, amount_)
1772+ let targetAmountNormalized = $t05455754673._1
1773+ let assetBalances = $t05455754673._2
1774+ let lpFee = $t05455754673._3
1775+ let protocolFee = $t05455754673._4
1776+ let sigmaFeePerLpUpdated = $t05455754673._5
1777+ let finalAmountNormalized = ((toInt(targetAmountNormalized) - lpFee) - protocolFee)
17831778 let targetDecimals = _getDecimals(assetId_)
1784- let finalAmount = _normalizeDecimals(finalAmountNormalized, lpDecimals, targetDecimals, DOWN)
1779+ let finalAmount = _normalizeDecimals(toBigInt(finalAmountNormalized), lpDecimals, targetDecimals, DOWN)
17851780 $Tuple2(nil, finalAmount)
17861781 }
17871782 else throw("Strict value is not equal to itself.")
18011796 let targetAssetIndex = valueOrErrorMessage(indexOf(assets, targetAssetId_), "swap: invalid target asset")
18021797 if ((targetAssetIndex == targetAssetIndex))
18031798 then {
1804- let sourceAmountNormalized = _normalizeDecimals(sourceAmount_, _getDecimals(sourceAssetId_), lpDecimals, DOWN)
1805- let err = if (_validateInt(sourceAmountNormalized, 1, MAX_INT, "swap: invalid source amount"))
1799+ let sourceAmountNormalized = _normalizeDecimals(toBigInt(sourceAmount_), _getDecimals(sourceAssetId_), lpDecimals, DOWN)
1800+ let err = if (_validateInt(toInt(sourceAmountNormalized), 1, MAX_INT, "swap: invalid source amount"))
18061801 then _validateStringNotEq(sourceAssetId_, targetAssetId_, "swap: same assets")
18071802 else false
18081803 if ((err == err))
18091804 then {
1810- let $t05491455072 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
1811- let targetAmountNormalized = $t05491455072._1
1812- let finalAssetBalances = $t05491455072._2
1813- let lpFee = $t05491455072._3
1814- let protocolFee = $t05491455072._4
1815- let sigmaFeePerLpUpdated = $t05491455072._5
1816- let finalAmountNormalized = ((targetAmountNormalized - lpFee) - protocolFee)
1805+ let $t05612556283 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
1806+ let targetAmountNormalized = $t05612556283._1
1807+ let finalAssetBalances = $t05612556283._2
1808+ let lpFee = $t05612556283._3
1809+ let protocolFee = $t05612556283._4
1810+ let sigmaFeePerLpUpdated = $t05612556283._5
1811+ let finalAmountNormalized = ((toInt(targetAmountNormalized) - lpFee) - protocolFee)
18171812 let targetDecimals = _getDecimals(targetAssetId_)
1818- let finalAmount = _normalizeDecimals(finalAmountNormalized, lpDecimals, targetDecimals, DOWN)
1813+ let finalAmount = _normalizeDecimals(toBigInt(finalAmountNormalized), lpDecimals, targetDecimals, DOWN)
18191814 $Tuple2(nil, finalAmount)
18201815 }
18211816 else throw("Strict value is not equal to itself.")
18321827 let user = if ((size(user_) > 0))
18331828 then valueOrErrorMessage(addressFromString(user_), "getClaim: invalid user")
18341829 else i.caller
1835- let $t05571455770 = _checkpoint(user)
1836- let checkpointActions = $t05571455770._1
1837- let userProfits = $t05571455770._2
1830+ let $t05694457000 = _checkpoint(user)
1831+ let checkpointActions = $t05694457000._1
1832+ let userProfits = $t05694457000._2
18381833 $Tuple2(nil, userProfits)
18391834 }
18401835
18471842 let weightAmplifier = storage._7
18481843 let slippageRate = storage._8
18491844 let feeMaxRate = storage._9
1850- let $t05610356163 = _loadAssetBalances()
1851- let assetBalances = $t05610356163._1
1852- let assetTotalSupply = $t05610356163._2
1853- let $t05616856221 = _loadAssetWeights()
1854- let assetWeights = $t05616856221._1
1855- let sigmaWeight = $t05616856221._2
1845+ let $t05733357393 = _loadAssetBalances()
1846+ let assetBalances = $t05733357393._1
1847+ let assetTotalSupply = $t05733357393._2
1848+ let $t05739857451 = _loadAssetWeights()
1849+ let assetWeights = $t05739857451._1
1850+ let sigmaWeight = $t05739857451._2
18561851 let fee = _calculateFee(assetBalances, assetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
18571852 let utilValue = (assetTotalSupply - fee)
18581853 $Tuple2(nil, $Tuple2(utilValue, lpTotalSupply))
18931888 else false
18941889 if ((err1 == err1))
18951890 then {
1896- let $t05729457354 = _checkpoint(i.caller)
1897- let checkpointActions = $t05729457354._1
1898- let userProfits = $t05729457354._2
1891+ let $t05852458584 = _checkpoint(i.caller)
1892+ let checkpointActions = $t05852458584._1
1893+ let userProfits = $t05852458584._2
18991894 $Tuple2(((checkpointActions ++ _saveUserLp(i.caller, (_loadUserLp(i.caller) + i.payments[0].amount))) ++ _saveTotalLp((_loadTotalLp() + i.payments[0].amount))), unit)
19001895 }
19011896 else throw("Strict value is not equal to itself.")
19181913 let err1 = _validateInt(amount_, 0, userLp, "unstake: invalid amount")
19191914 if ((err1 == err1))
19201915 then {
1921- let $t05786557925 = _checkpoint(i.caller)
1922- let checkpointActions = $t05786557925._1
1923- let userProfits = $t05786557925._2
1916+ let $t05909559155 = _checkpoint(i.caller)
1917+ let checkpointActions = $t05909559155._1
1918+ let userProfits = $t05909559155._2
19241919 $Tuple2(((([ScriptTransfer(i.caller, amount_, lpAssetId)] ++ checkpointActions) ++ _saveUserLp(i.caller, (userLp - amount_))) ++ _saveTotalLp((_loadTotalLp() - amount_))), unit)
19251920 }
19261921 else throw("Strict value is not equal to itself.")
19461941 let assets = [lpAssetIdStr, _loadAssets()]
19471942 let maxIndex = (size(assets) - 1)
19481943 let userLp = _loadUserLp(user)
1949- let $t05864858704 = _checkpoint(user)
1950- let checkpointActions = $t05864858704._1
1951- let userProfits = $t05864858704._2
1944+ let $t05987859934 = _checkpoint(user)
1945+ let checkpointActions = $t05987859934._1
1946+ let userProfits = $t05987859934._2
19521947 func foldFunc (acc,profit) = {
19531948 let index = acc._1
19541949 if (if ((maxIndex >= index))
19611956 else $Tuple3((index + 1), (acc._2 :+ profit), acc._3)
19621957 }
19631958
1964- let $t05908259173 = {
1959+ let $t06031260403 = {
19651960 let $l = userProfits
19661961 let $s = size($l)
19671962 let $acc0 = $Tuple3(0, nil, nil)
19751970
19761971 $f0_2($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)
19771972 }
1978- let idx = $t05908259173._1
1979- let userProfitsUpdated = $t05908259173._2
1980- let profitActions = $t05908259173._3
1973+ let idx = $t06031260403._1
1974+ let userProfitsUpdated = $t06031260403._2
1975+ let profitActions = $t06031260403._3
19811976 $Tuple2(((profitActions ++ removeByIndex(checkpointActions, 0)) ++ _saveUserProfits(user, userProfitsUpdated)), unit)
19821977 }
19831978 else throw("Strict value is not equal to itself.")
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let SEP = "__"
55
66 let WAVES = "waves"
77
88 let MAX_INT = 9223372036854775807
99
1010 let MAX_FEE = 1000000
1111
12-let MAX_AMPLIFIER = 1000000
13-
14-let MAX_WEIGHT_AMPLIFIER = 1000000
12+let MAX_AMPLIFIER = toBigInt(1000000)
13+
14+let MAX_WEIGHT_AMPLIFIER = toBigInt(1000000)
1515
1616 let MAX_WEIGHT = 1000000
1717
18-let SLIPPAGE_RATE_FACTOR = 1000000
19-
20-let FEE_RATE_FACTOR = 1000000
21-
22-let RATE_FACTOR = 1000000
18+let SLIPPAGE_RATE_FACTOR = toBigInt(1000000)
19+
20+let FEE_RATE_FACTOR = toBigInt(1000000)
21+
22+let RATE_FACTOR = toBigInt(1000000)
2323
2424 let PERCENT_FACTOR = toBigInt(1000000000000000000)
2525
2626 let ZERO_INT_LIST_10 = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
2727
2828 let ZERO_INT_LIST_11 = (ZERO_INT_LIST_10 :+ 0)
2929
3030 let ZERO_BIGINT = toBigInt(0)
3131
32-let ZERO_BIGINT_LIST_11 = [ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT]
32+let ZERO_BIGINT_LIST_10 = [ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT]
33+
34+let ZERO_BIGINT_LIST_11 = (ZERO_BIGINT_LIST_10 :+ ZERO_BIGINT)
3335
3436 let INT_DECIMALS = 8
3537
3638 let BIGINT_DECIMALS = 18
3739
3840 let LIST_64 = split_51C("0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0", "_")
3941
4042 let KEY_MULTISIG = "MULTISIG"
4143
4244 let KEY_STATUS = "STATUS"
4345
4446 let KEY_PAUSED = "PAUSED"
4547
4648 let KEY_PAUSER = "PAUSER"
4749
4850 let KEY_STORAGE = "STORAGE"
4951
5052 let KEY_ASSETS = "ASSETS"
5153
5254 let KEY_ASSET_BALANCES = "ASSET_BALANCES"
5355
5456 let KEY_ASSET_WEIGHTS = "ASSET_WEIGHTS"
5557
5658 let KEY_LP_FEE = "LP_FEE"
5759
5860 let KEY_PROTOCOL_FEE = "PROTOCOL_FEE"
5961
6062 let KEY_PRECISION = "PRECISION"
6163
6264 let KEY_SIGMA_FEE_PER_LP = "SIGMA_FEE_PER_LP"
6365
6466 let KEY_USER_SIGMA_FEE_PER_LP = "USER_SIGMA_FEE_PER_LP"
6567
6668 let KEY_USER_LP = "USER_LP"
6769
6870 let KEY_TOTAL_LP = "TOTAL_LP"
6971
7072 let KEY_USER_PROFITS = "USER_PROFITS"
7173
7274 func _validateAddress (address_,err_) = match addressFromString(address_) {
7375 case a: Address =>
7476 true
7577 case _ =>
7678 throw(err_)
7779 }
7880
7981
8082 func _validateAsset (assetId_,err_) = if ((assetId_ == WAVES))
8183 then true
8284 else match assetInfo(fromBase58String(assetId_)) {
8385 case a: Asset =>
8486 true
8587 case _ =>
8688 throw(err_)
8789 }
8890
8991
9092 func _validateInt (val_,lowerBoundary_,upperBoundary_,err_) = if (if ((lowerBoundary_ > val_))
9193 then true
9294 else (val_ > upperBoundary_))
9395 then throw(err_)
9496 else true
9597
9698
9799 func _validateBool (val_,target_,err_) = if ((val_ != target_))
98100 then throw(err_)
99101 else true
100102
101103
102104 func _validateStringEqual (val1_,val2_,err_) = if ((val1_ != val2_))
103105 then throw(err_)
104106 else true
105107
106108
107109 func _validateStringNotEq (val1_,val2_,err_) = if ((val1_ == val2_))
108110 then throw(err_)
109111 else true
110112
111113
112114 func _validateIntList (val_,lowerBoundary_,upperBoundary_,err_) = {
113115 func foldFunc (acc,elem) = match parseInt(elem) {
114116 case a: Int =>
115117 if (acc)
116118 then _validateInt(a, lowerBoundary_, upperBoundary_, err_)
117119 else false
118120 case _ =>
119121 throw(err_)
120122 }
121123
122124 let $l = val_
123125 let $s = size($l)
124126 let $acc0 = true
125127 func $f0_1 ($a,$i) = if (($i >= $s))
126128 then $a
127129 else foldFunc($a, $l[$i])
128130
129131 func $f0_2 ($a,$i) = if (($i >= $s))
130132 then $a
131133 else throw("List size exceeds 10")
132134
133135 $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)
134136 }
135137
136138
137139 func _validateAssets (assets_,err_) = {
138140 func foldFunc (acc,elem) = if (acc)
139141 then _validateAsset(elem, err_)
140142 else false
141143
142144 let $l = assets_
143145 let $s = size($l)
144146 let $acc0 = true
145147 func $f0_1 ($a,$i) = if (($i >= $s))
146148 then $a
147149 else foldFunc($a, $l[$i])
148150
149151 func $f0_2 ($a,$i) = if (($i >= $s))
150152 then $a
151153 else throw("List size exceeds 10")
152154
153155 $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)
154156 }
155157
156158
157159 func _validateIntEquals (val1_,val2_,err_) = if ((val1_ != val2_))
158160 then throw(err_)
159161 else true
160162
161163
162164 func _validateTokenName (val_,err_) = if (if ((4 > size(val_)))
163165 then true
164166 else (size(val_) > 16))
165167 then throw(err_)
166168 else true
167169
168170
169171 func _validateTokenDescr (val_,err_) = if ((size(val_) > 1000))
170172 then throw(err_)
171173 else true
172174
173175
174176 func _validateDecimals (val_,err_) = if (if ((0 > val_))
175177 then true
176178 else (val_ > 8))
177179 then throw(err_)
178180 else true
179181
180182
181183 func _validatePayment (payment_,assetId_,requiredAmount_,err_) = match payment_.assetId {
182184 case a: ByteVector =>
183185 if ((assetId_ != toBase58String(a)))
184186 then throw((err_ + ": asset"))
185187 else if ((requiredAmount_ > payment_.amount))
186188 then throw((err_ + ": amount"))
187189 else true
188190 case _ =>
189191 throw((err_ + ": asset"))
190192 }
191193
192194
193195 func _validateListContains (list_,val_,err_) = if (!(containsElement(list_, val_)))
194196 then throw(err_)
195197 else true
196198
197199
198200 func _assetToStr (asset_) = match asset_ {
199201 case a: ByteVector =>
200202 toBase58String(a)
201203 case _ =>
202204 WAVES
203205 }
204206
205207
206208 func _strToAsset (asset_) = if (if ((asset_ == WAVES))
207209 then true
208210 else (asset_ == ""))
209211 then unit
210212 else fromBase58String(asset_)
211213
212214
213215 func _loadPause () = match getBoolean(KEY_PAUSED) {
214216 case a: Boolean =>
215217 a
216218 case _ =>
217219 false
218220 }
219221
220222
221223 func _savePause (isPaused_) = [BooleanEntry(KEY_PAUSED, isPaused_)]
222224
223225
224226 func _loadPauser () = match getString(KEY_PAUSER) {
225227 case a: String =>
226228 addressFromStringValue(a)
227229 case _ =>
228230 Address(base58'')
229231 }
230232
231233
232234 func _savePauser (pauser_) = [StringEntry(KEY_PAUSER, toString(pauser_))]
233235
234236
235237 func _loadMultisig () = match getString(KEY_MULTISIG) {
236238 case a: String =>
237239 addressFromStringValue(a)
238240 case _ =>
239241 Address(base58'')
240242 }
241243
242244
243245 func _saveMultisig (multisig_) = [StringEntry(KEY_MULTISIG, toString(multisig_))]
244246
245247
246248 func _loadStorage () = match getString(KEY_STORAGE) {
247249 case a: String =>
248250 let struct = split(a, SEP)
249- $Tuple10(fromBase58String(struct[0]), (struct[1] == "1"), parseIntValue(struct[2]), parseIntValue(struct[3]), parseIntValue(struct[4]), parseIntValue(struct[5]), parseIntValue(struct[6]), parseIntValue(struct[7]), parseIntValue(struct[8]), addressFromStringValue(struct[9]))
251+ $Tuple10(fromBase58String(struct[0]), (struct[1] == "1"), parseIntValue(struct[2]), parseIntValue(struct[3]), parseIntValue(struct[4]), parseBigIntValue(struct[5]), parseBigIntValue(struct[6]), parseBigIntValue(struct[7]), parseBigIntValue(struct[8]), addressFromStringValue(struct[9]))
250252 case _ =>
251- $Tuple10(base58'', false, 0, 0, 0, 0, 0, 0, 0, Address(base58''))
253+ $Tuple10(base58'', false, 0, 0, 0, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, Address(base58''))
252254 }
253255
254256
255257 func _saveStorage (storage_) = [StringEntry(KEY_STORAGE, makeString([toBase58String(storage_._1), if (storage_._2)
256258 then "1"
257259 else "0", toString(storage_._3), toString(storage_._4), toString(storage_._5), toString(storage_._6), toString(storage_._7), toString(storage_._8), toString(storage_._9), toString(storage_._10)], SEP))]
258260
259261
260262 func _loadAssets () = match getString(KEY_ASSETS) {
261263 case a: String =>
262264 if ((size(a) > 0))
263265 then split_51C(a, SEP)
264266 else nil
265267 case _ =>
266268 nil
267269 }
268270
269271
270272 func _saveAssets (assets_) = [StringEntry(KEY_ASSETS, makeString_11C(assets_, SEP))]
271273
272274
273275 func _loadAssetBalances () = {
274276 func foldFunc (acc,elem) = {
275- let balance = parseIntValue(elem)
277+ let balance = parseBigIntValue(elem)
276278 $Tuple2((acc._1 :+ balance), (acc._2 + balance))
277279 }
278280
279281 match getString(KEY_ASSET_BALANCES) {
280282 case a: String =>
281283 if ((size(a) > 0))
282284 then {
283285 let $l = split_51C(a, SEP)
284286 let $s = size($l)
285- let $acc0 = $Tuple2(nil, 0)
287+ let $acc0 = $Tuple2(nil, ZERO_BIGINT)
286288 func $f0_1 ($a,$i) = if (($i >= $s))
287289 then $a
288290 else foldFunc($a, $l[$i])
289291
290292 func $f0_2 ($a,$i) = if (($i >= $s))
291293 then $a
292294 else throw("List size exceeds 10")
293295
294296 $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)
295297 }
296- else $Tuple2(ZERO_INT_LIST_10, 0)
298+ else $Tuple2(ZERO_BIGINT_LIST_10, ZERO_BIGINT)
297299 case _ =>
298- $Tuple2(ZERO_INT_LIST_10, 0)
300+ $Tuple2(ZERO_BIGINT_LIST_10, ZERO_BIGINT)
299301 }
300302 }
301303
302304
303305 func _saveAssetBalances (balances_) = {
304306 func foldFunc (acc,elem) = (acc :+ toString(elem))
305307
306308 [StringEntry(KEY_ASSET_BALANCES, makeString_11C({
307309 let $l = balances_
308310 let $s = size($l)
309311 let $acc0 = nil
310312 func $f0_1 ($a,$i) = if (($i >= $s))
311313 then $a
312314 else foldFunc($a, $l[$i])
313315
314316 func $f0_2 ($a,$i) = if (($i >= $s))
315317 then $a
316318 else throw("List size exceeds 10")
317319
318320 $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)
319321 }, SEP))]
320322 }
321323
322324
323325 func _loadAssetWeights () = {
324326 func foldFunc (acc,elem) = {
325327 let weight = parseIntValue(elem)
326328 $Tuple2((acc._1 :+ weight), (acc._2 + weight))
327329 }
328330
329331 match getString(KEY_ASSET_WEIGHTS) {
330332 case a: String =>
331333 if ((size(a) > 0))
332334 then {
333335 let $l = split_51C(a, SEP)
334336 let $s = size($l)
335337 let $acc0 = $Tuple2(nil, 0)
336338 func $f0_1 ($a,$i) = if (($i >= $s))
337339 then $a
338340 else foldFunc($a, $l[$i])
339341
340342 func $f0_2 ($a,$i) = if (($i >= $s))
341343 then $a
342344 else throw("List size exceeds 10")
343345
344346 $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)
345347 }
346348 else $Tuple2(ZERO_INT_LIST_10, 0)
347349 case _ =>
348350 $Tuple2(ZERO_INT_LIST_10, 0)
349351 }
350352 }
351353
352354
353355 func _saveAssetWeights (weights_) = {
354356 func foldFunc (acc,elem) = (acc :+ toString(elem))
355357
356358 [StringEntry(KEY_ASSET_WEIGHTS, makeString_11C({
357359 let $l = weights_
358360 let $s = size($l)
359361 let $acc0 = nil
360362 func $f0_1 ($a,$i) = if (($i >= $s))
361363 then $a
362364 else foldFunc($a, $l[$i])
363365
364366 func $f0_2 ($a,$i) = if (($i >= $s))
365367 then $a
366368 else throw("List size exceeds 10")
367369
368370 $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)
369371 }, SEP))]
370372 }
371373
372374
373375 func _loadLpFee (assetId_) = match getInteger(makeString([KEY_LP_FEE, assetId_], SEP)) {
374376 case a: Int =>
375377 a
376378 case _ =>
377379 0
378380 }
379381
380382
381383 func _saveLpFee (assetId_,val_) = [IntegerEntry(makeString([KEY_LP_FEE, assetId_], SEP), val_)]
382384
383385
384386 func _loadProtocolFee (assetId_) = match getInteger(makeString([KEY_PROTOCOL_FEE, assetId_], SEP)) {
385387 case a: Int =>
386388 a
387389 case _ =>
388390 0
389391 }
390392
391393
392394 func _saveProtocolFee (assetId_,val_) = [IntegerEntry(makeString([KEY_PROTOCOL_FEE, assetId_], SEP), val_)]
393395
394396
395397 func _loadPrecision () = match getInteger(KEY_PRECISION) {
396398 case a: Int =>
397399 a
398400 case _ =>
399401 0
400402 }
401403
402404
403405 func _savePrecision (val_) = [IntegerEntry(KEY_PRECISION, val_)]
404406
405407
406408 func _loadSigmaFeePerLp () = {
407409 func foldFunc (acc,elem) = (acc :+ parseBigIntValue(elem))
408410
409411 match getString(KEY_SIGMA_FEE_PER_LP) {
410412 case a: String =>
411413 if ((size(a) > 0))
412414 then {
413415 let $l = split_51C(a, SEP)
414416 let $s = size($l)
415417 let $acc0 = nil
416418 func $f0_1 ($a,$i) = if (($i >= $s))
417419 then $a
418420 else foldFunc($a, $l[$i])
419421
420422 func $f0_2 ($a,$i) = if (($i >= $s))
421423 then $a
422424 else throw("List size exceeds 11")
423425
424426 $f0_2($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)
425427 }
426428 else ZERO_BIGINT_LIST_11
427429 case _ =>
428430 ZERO_BIGINT_LIST_11
429431 }
430432 }
431433
432434
433435 func _saveSigmaFeePerLp (val_) = {
434436 func foldFunc (acc,elem) = (acc :+ toString(elem))
435437
436438 [StringEntry(KEY_SIGMA_FEE_PER_LP, makeString_11C({
437439 let $l = val_
438440 let $s = size($l)
439441 let $acc0 = nil
440442 func $f0_1 ($a,$i) = if (($i >= $s))
441443 then $a
442444 else foldFunc($a, $l[$i])
443445
444446 func $f0_2 ($a,$i) = if (($i >= $s))
445447 then $a
446448 else throw("List size exceeds 11")
447449
448450 $f0_2($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)
449451 }, SEP))]
450452 }
451453
452454
453455 func _loadUserSigmaFeePerLp (user_) = {
454456 func foldFunc (acc,elem) = (acc :+ parseBigIntValue(elem))
455457
456458 match getString(makeString([KEY_USER_SIGMA_FEE_PER_LP, toString(user_)], SEP)) {
457459 case a: String =>
458460 if ((size(a) > 0))
459461 then {
460462 let $l = split_51C(a, SEP)
461463 let $s = size($l)
462464 let $acc0 = nil
463465 func $f0_1 ($a,$i) = if (($i >= $s))
464466 then $a
465467 else foldFunc($a, $l[$i])
466468
467469 func $f0_2 ($a,$i) = if (($i >= $s))
468470 then $a
469471 else throw("List size exceeds 11")
470472
471473 $f0_2($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)
472474 }
473475 else ZERO_BIGINT_LIST_11
474476 case _ =>
475477 ZERO_BIGINT_LIST_11
476478 }
477479 }
478480
479481
480482 func _saveUserSigmaFeePerLp (user_,val_) = {
481483 func foldFunc (acc,elem) = (acc :+ toString(elem))
482484
483485 [StringEntry(makeString([KEY_USER_SIGMA_FEE_PER_LP, toString(user_)], SEP), makeString_11C({
484486 let $l = val_
485487 let $s = size($l)
486488 let $acc0 = nil
487489 func $f0_1 ($a,$i) = if (($i >= $s))
488490 then $a
489491 else foldFunc($a, $l[$i])
490492
491493 func $f0_2 ($a,$i) = if (($i >= $s))
492494 then $a
493495 else throw("List size exceeds 11")
494496
495497 $f0_2($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)
496498 }, SEP))]
497499 }
498500
499501
500502 func _loadUserLp (address_) = match getInteger(makeString([KEY_USER_LP, toString(address_)], SEP)) {
501503 case a: Int =>
502504 a
503505 case _ =>
504506 0
505507 }
506508
507509
508510 func _saveUserLp (address_,val_) = [IntegerEntry(makeString([KEY_USER_LP, toString(address_)], SEP), val_)]
509511
510512
511513 func _loadTotalLp () = match getInteger(KEY_TOTAL_LP) {
512514 case a: Int =>
513515 a
514516 case _ =>
515517 0
516518 }
517519
518520
519521 func _saveTotalLp (val_) = [IntegerEntry(KEY_TOTAL_LP, val_)]
520522
521523
522524 func _loadUserProfits (user_) = {
523525 func foldFunc (acc,elem) = (acc :+ parseIntValue(elem))
524526
525527 match getString(makeString([KEY_USER_PROFITS, toString(user_)], SEP)) {
526528 case a: String =>
527529 if ((size(a) > 0))
528530 then {
529531 let $l = split_51C(a, SEP)
530532 let $s = size($l)
531533 let $acc0 = nil
532534 func $f0_1 ($a,$i) = if (($i >= $s))
533535 then $a
534536 else foldFunc($a, $l[$i])
535537
536538 func $f0_2 ($a,$i) = if (($i >= $s))
537539 then $a
538540 else throw("List size exceeds 11")
539541
540542 $f0_2($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)
541543 }
542544 else ZERO_INT_LIST_11
543545 case _ =>
544546 ZERO_INT_LIST_11
545547 }
546548 }
547549
548550
549551 func _saveUserProfits (user_,val_) = {
550552 func foldFunc (acc,elem) = (acc :+ toString(elem))
551553
552554 [StringEntry(makeString([KEY_USER_PROFITS, toString(user_)], SEP), makeString_11C({
553555 let $l = val_
554556 let $s = size($l)
555557 let $acc0 = nil
556558 func $f0_1 ($a,$i) = if (($i >= $s))
557559 then $a
558560 else foldFunc($a, $l[$i])
559561
560562 func $f0_2 ($a,$i) = if (($i >= $s))
561563 then $a
562564 else throw("List size exceeds 11")
563565
564566 $f0_2($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)
565567 }, SEP))]
566568 }
567569
568570
569571 func _onlyThisContract (caller_) = if ((caller_ != this))
570572 then throw("_onlyThisContract: revert")
571573 else true
572574
573575
574576 func _whenMultisigSet () = if ((_loadMultisig() == Address(base58'')))
575577 then throw("_whenMultisigSet: revert")
576578 else true
577579
578580
579581 func _whenNotInitialized () = {
580582 let storage = _loadStorage()
581583 if ((storage._1 != base58''))
582584 then throw("_whenNotInitialized: revert")
583585 else true
584586 }
585587
586588
587589 func _whenInitialized () = {
588590 let storage = _loadStorage()
589591 if ((storage._1 == base58''))
590592 then throw("_whenInitialized: revert")
591593 else true
592594 }
593595
594596
595597 func _whenNotPaused () = if (_loadPause())
596598 then throw("_whenNotPaused: revert")
597599 else true
598600
599601
600602 func _whenPaused () = if (!(_loadPause()))
601603 then throw("_whenPaused: revert")
602604 else true
603605
604606
605607 func _onlyPauser (caller_) = if ((caller_ != _loadPauser()))
606608 then throw("_onlyPauser: revert")
607609 else true
608610
609611
610612 func _getDecimals (assetId_) = match assetInfo(fromBase58String(assetId_)) {
611613 case a: Asset =>
612614 a.decimals
613615 case _ =>
614616 throw(("_getDecimals: no asset=" + assetId_))
615617 }
616618
617619
620+func _pow10 (exponent_) = match exponent_ {
621+ case _ =>
622+ if ((8 == $match0))
623+ then 100000000
624+ else if ((7 == $match0))
625+ then 10000000
626+ else if ((6 == $match0))
627+ then 1000000
628+ else if ((5 == $match0))
629+ then 100000
630+ else if ((4 == $match0))
631+ then 10000
632+ else if ((3 == $match0))
633+ then 1000
634+ else if ((2 == $match0))
635+ then 100
636+ else if ((1 == $match0))
637+ then 10
638+ else if ((0 == $match0))
639+ then 1
640+ else throw(("_pow10: revert: " + toString(exponent_)))
641+}
642+
643+
618644 func _normalizeDecimals (amount_,sourceDecimals_,targetDecimals_,round_) = if ((sourceDecimals_ >= targetDecimals_))
619- then fraction(amount_, 1, pow(10, 0, (sourceDecimals_ - targetDecimals_), 0, 0, DOWN), round_)
620- else (amount_ * pow(10, 0, (targetDecimals_ - sourceDecimals_), 0, 0, DOWN))
645+ then fraction(amount_, toBigInt(1), toBigInt(_pow10((sourceDecimals_ - targetDecimals_))), round_)
646+ else (amount_ * toBigInt(_pow10((targetDecimals_ - sourceDecimals_))))
621647
622648
623649 func _prepareAssetBalances (assets_) = {
624- func foldFunc (acc,elem) = (acc :+ 0)
650+ func foldFunc (acc,elem) = (acc :+ ZERO_BIGINT)
625651
626652 let $l = assets_
627653 let $s = size($l)
628654 let $acc0 = nil
629655 func $f0_1 ($a,$i) = if (($i >= $s))
630656 then $a
631657 else foldFunc($a, $l[$i])
632658
633659 func $f0_2 ($a,$i) = if (($i >= $s))
634660 then $a
635661 else throw("List size exceeds 10")
636662
637663 $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)
638664 }
639665
640666
641667 func _prepareAssetWeights (assetWeights_) = {
642668 func foldFunc (acc,elem) = {
643669 let weight = parseIntValue(elem)
644670 $Tuple2((acc._1 :+ weight), (acc._2 + weight))
645671 }
646672
647673 let $l = assetWeights_
648674 let $s = size($l)
649675 let $acc0 = $Tuple2(nil, 0)
650676 func $f0_1 ($a,$i) = if (($i >= $s))
651677 then $a
652678 else foldFunc($a, $l[$i])
653679
654680 func $f0_2 ($a,$i) = if (($i >= $s))
655681 then $a
656682 else throw("List size exceeds 10")
657683
658684 $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)
659685 }
660686
661687
662-func _getAssetBalances (assets_,decimals_) = {
663- func foldFunc (acc,elem) = {
664- let assetDecimals = _getDecimals(elem)
665- let balance = _normalizeDecimals(assetBalance(this, fromBase58String(elem)), assetDecimals, decimals_, DOWN)
666- $Tuple2((acc._1 :+ balance), (acc._2 + balance))
667- }
668-
669- let $l = assets_
670- let $s = size($l)
671- let $acc0 = $Tuple2(nil, 0)
672- func $f0_1 ($a,$i) = if (($i >= $s))
673- then $a
674- else foldFunc($a, $l[$i])
675-
676- func $f0_2 ($a,$i) = if (($i >= $s))
677- then $a
678- else throw("List size exceeds 10")
679-
680- $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)
681- }
682-
683-
684688 func _listIntToString (assets_) = {
685689 func foldFunc (acc,elem) = (acc :+ toString(elem))
686690
687691 makeString_11C({
688692 let $l = assets_
689693 let $s = size($l)
690694 let $acc0 = nil
691695 func $f0_1 ($a,$i) = if (($i >= $s))
692696 then $a
693697 else foldFunc($a, $l[$i])
694698
695699 func $f0_2 ($a,$i) = if (($i >= $s))
696700 then $a
697701 else throw("List size exceeds 65")
698702
699703 $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($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($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($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), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63), 64), 65)
700704 }, SEP)
701705 }
702706
703707
704708 func _listBigIntToString (assets_) = {
705709 func foldFunc (acc,elem) = (acc :+ toString(elem))
706710
707711 makeString({
708712 let $l = assets_
709713 let $s = size($l)
710714 let $acc0 = nil
711715 func $f0_1 ($a,$i) = if (($i >= $s))
712716 then $a
713717 else foldFunc($a, $l[$i])
714718
715719 func $f0_2 ($a,$i) = if (($i >= $s))
716720 then $a
717- else throw("List size exceeds 11")
718-
719- $f0_2($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)
721+ else throw("List size exceeds 65")
722+
723+ $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($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($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($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), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63), 64), 65)
720724 }, SEP)
721725 }
722726
723727
724728 func _getEquilibriums (sigmaBalances_,weights_,sigmaWeight_) = {
725- func foldFunc (acc,elem) = (acc :+ fraction(sigmaBalances_, elem, sigmaWeight_))
729+ func foldFunc (acc,elem) = (acc :+ fraction(sigmaBalances_, toBigInt(elem), toBigInt(sigmaWeight_)))
726730
727731 let $l = weights_
728732 let $s = size($l)
729733 let $acc0 = nil
730734 func $f0_1 ($a,$i) = if (($i >= $s))
731735 then $a
732736 else foldFunc($a, $l[$i])
733737
734738 func $f0_2 ($a,$i) = if (($i >= $s))
735739 then $a
736740 else throw("List size exceeds 10")
737741
738742 $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)
739743 }
740744
741745
742746 func _incrementBalancesByAmounts (balances_,amounts_) = {
743747 func foldFunc (acc,elem) = {
744748 let index = acc._1
745749 let amount = amounts_[index]
746750 let newBalance = (elem + amount)
747751 $Tuple3((index + 1), (acc._2 :+ newBalance), (acc._3 + newBalance))
748752 }
749753
750754 let result = {
751755 let $l = balances_
752756 let $s = size($l)
753- let $acc0 = $Tuple3(0, nil, 0)
757+ let $acc0 = $Tuple3(0, nil, ZERO_BIGINT)
754758 func $f0_1 ($a,$i) = if (($i >= $s))
755759 then $a
756760 else foldFunc($a, $l[$i])
757761
758762 func $f0_2 ($a,$i) = if (($i >= $s))
759763 then $a
760764 else throw("List size exceeds 10")
761765
762766 $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)
763767 }
764768 $Tuple2(result._2, result._3)
765769 }
766770
767771
768772 func _incrementBalancesByPayments (balances_,payments_,assets_,decimals_,err_) = {
769773 func foldFunc (acc,elem) = {
770774 let index = acc._1
771775 let payment = payments_[index]
772776 let paymentAssetStr = _assetToStr(payment.assetId)
773777 let err = if ((paymentAssetStr != assets_[index]))
774778 then throw(((err_ + ": index=") + toString(index)))
775779 else unit
776780 if ((err == err))
777781 then {
778782 let assetDecimals = _getDecimals(paymentAssetStr)
779- let newBalance = (elem + _normalizeDecimals(payments_[index].amount, assetDecimals, decimals_, DOWN))
783+ let newBalance = (elem + _normalizeDecimals(toBigInt(payments_[index].amount), assetDecimals, decimals_, DOWN))
780784 $Tuple3((index + 1), (acc._2 :+ newBalance), (acc._3 + newBalance))
781785 }
782786 else throw("Strict value is not equal to itself.")
783787 }
784788
785789 let result = {
786790 let $l = balances_
787791 let $s = size($l)
788- let $acc0 = $Tuple3(0, nil, 0)
792+ let $acc0 = $Tuple3(0, nil, ZERO_BIGINT)
789793 func $f0_1 ($a,$i) = if (($i >= $s))
790794 then $a
791795 else foldFunc($a, $l[$i])
792796
793797 func $f0_2 ($a,$i) = if (($i >= $s))
794798 then $a
795799 else throw("List size exceeds 10")
796800
797801 $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)
798802 }
799803 $Tuple2(result._2, result._3)
800804 }
801805
802806
803807 func _incrementBalanceByIndex (balances_,index_,amount_) = {
804808 func foldFunc (acc,elem) = {
805809 let index = acc._1
806810 if ((index == index_))
807811 then $Tuple2((index + 1), (acc._2 :+ (elem + amount_)))
808812 else $Tuple2((index + 1), (acc._2 :+ elem))
809813 }
810814
811815 let result = {
812816 let $l = balances_
813817 let $s = size($l)
814818 let $acc0 = $Tuple2(0, nil)
815819 func $f0_1 ($a,$i) = if (($i >= $s))
816820 then $a
817821 else foldFunc($a, $l[$i])
818822
819823 func $f0_2 ($a,$i) = if (($i >= $s))
820824 then $a
821825 else throw("List size exceeds 10")
822826
823827 $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)
824828 }
825829 result._2
826830 }
827831
828832
829833 func _decrementBalanceByIndex (balances_,index_,amount_) = {
830834 func foldFunc (acc,elem) = {
831835 let index = acc._1
832836 if ((index == index_))
833837 then $Tuple2((index + 1), (acc._2 :+ (elem - amount_)))
834838 else $Tuple2((index + 1), (acc._2 :+ elem))
835839 }
836840
837841 let result = {
838842 let $l = balances_
839843 let $s = size($l)
840844 let $acc0 = $Tuple2(0, nil)
841845 func $f0_1 ($a,$i) = if (($i >= $s))
842846 then $a
843847 else foldFunc($a, $l[$i])
844848
845849 func $f0_2 ($a,$i) = if (($i >= $s))
846850 then $a
847851 else throw("List size exceeds 10")
848852
849853 $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)
850854 }
851855 result._2
852856 }
853857
854858
855859 func _decrementBalancesByLpAmount (balances_,amount_,lpTotalSupply_) = {
856860 let rate = fraction((lpTotalSupply_ - amount_), RATE_FACTOR, lpTotalSupply_, CEILING)
857861 func foldFunc (acc,elem) = {
858862 let newBalance = fraction(elem, rate, RATE_FACTOR, CEILING)
859863 let deltaBalance = (elem - newBalance)
860864 $Tuple3((acc._1 :+ newBalance), (acc._2 + newBalance), (acc._3 :+ deltaBalance))
861865 }
862866
863867 let $l = balances_
864868 let $s = size($l)
865- let $acc0 = $Tuple3(nil, 0, nil)
869+ let $acc0 = $Tuple3(nil, ZERO_BIGINT, nil)
866870 func $f0_1 ($a,$i) = if (($i >= $s))
867871 then $a
868872 else foldFunc($a, $l[$i])
869873
870874 func $f0_2 ($a,$i) = if (($i >= $s))
871875 then $a
872876 else throw("List size exceeds 10")
873877
874878 $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)
875879 }
876880
877881
878882 func _getPaymentsFromBalances (assets_,balances_,recipient_,sourceDecimals_) = {
879883 func foldFunc (acc,elem) = {
880884 let index = acc._1
881- $Tuple2((index + 1), (acc._2 :+ ScriptTransfer(recipient_, _normalizeDecimals(balances_[index], sourceDecimals_, _getDecimals(elem), DOWN), _strToAsset(elem))))
885+ $Tuple2((index + 1), (acc._2 :+ ScriptTransfer(recipient_, toInt(_normalizeDecimals(balances_[index], sourceDecimals_, _getDecimals(elem), DOWN)), _strToAsset(elem))))
882886 }
883887
884888 let result = {
885889 let $l = assets_
886890 let $s = size($l)
887891 let $acc0 = $Tuple2(0, nil)
888892 func $f0_1 ($a,$i) = if (($i >= $s))
889893 then $a
890894 else foldFunc($a, $l[$i])
891895
892896 func $f0_2 ($a,$i) = if (($i >= $s))
893897 then $a
894898 else throw("List size exceeds 10")
895899
896900 $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)
897901 }
898902 result._2
899903 }
900904
901905
902906 func _calculateMicroFee (balance_,equilibrium_,weightAmplifier_,slippageRate_,feeMaxRate_) = if ((equilibrium_ > balance_))
903907 then {
904908 let threshold = fraction(equilibrium_, (MAX_WEIGHT_AMPLIFIER - weightAmplifier_), MAX_WEIGHT_AMPLIFIER)
905909 if ((threshold > balance_))
906910 then {
907911 let maxDeviation = (threshold - balance_)
908912 let feeRate = fraction(fraction(maxDeviation, slippageRate_, SLIPPAGE_RATE_FACTOR), FEE_RATE_FACTOR, equilibrium_)
909913 if ((feeRate > feeMaxRate_))
910914 then fraction(maxDeviation, feeMaxRate_, FEE_RATE_FACTOR)
911915 else fraction(maxDeviation, feeRate, FEE_RATE_FACTOR)
912916 }
913- else 0
917+ else ZERO_BIGINT
914918 }
915919 else {
916920 let threshold = fraction(equilibrium_, (MAX_WEIGHT_AMPLIFIER + weightAmplifier_), MAX_WEIGHT_AMPLIFIER)
917921 if ((balance_ > threshold))
918922 then {
919923 let maxDeviation = (balance_ - threshold)
920924 let feeRate = fraction(fraction(maxDeviation, slippageRate_, SLIPPAGE_RATE_FACTOR), FEE_RATE_FACTOR, equilibrium_)
921925 if ((feeRate > feeMaxRate_))
922926 then fraction(maxDeviation, feeMaxRate_, FEE_RATE_FACTOR)
923927 else fraction(maxDeviation, feeRate, FEE_RATE_FACTOR)
924928 }
925- else 0
929+ else ZERO_BIGINT
926930 }
927931
928932
929933 func _calculateFee (balances_,assetsTotalSupply_,weights_,sigmaWeight_,weightAmplifier_,slippageRate_,feeMaxRate_) = {
930934 func foldFunc (acc,balance) = {
931935 let index = acc._1
932- let equilibrium = fraction(assetsTotalSupply_, weights_[index], sigmaWeight_)
936+ let equilibrium = fraction(assetsTotalSupply_, toBigInt(weights_[index]), toBigInt(sigmaWeight_))
933937 $Tuple2((index + 1), (acc._2 + _calculateMicroFee(balance, equilibrium, weightAmplifier_, slippageRate_, feeMaxRate_)))
934938 }
935939
936940 let result = {
937941 let $l = balances_
938942 let $s = size($l)
939- let $acc0 = $Tuple2(0, 0)
943+ let $acc0 = $Tuple2(0, ZERO_BIGINT)
940944 func $f0_1 ($a,$i) = if (($i >= $s))
941945 then $a
942946 else foldFunc($a, $l[$i])
943947
944948 func $f0_2 ($a,$i) = if (($i >= $s))
945949 then $a
946950 else throw("List size exceeds 10")
947951
948952 $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)
949953 }
950954 result._2
951955 }
952956
953957
954958 func _validateLiquidityInvariant (prevAssetBalances_,prevAssetTotalSupply_,assetBalances_,assetTotalSupply_,prevLpTotalSupply_,lpTotalSupply_,assetWeights_,sigmaWeight_,weightAmplifier_,slippageRate_,feeMaxRate_) = if (if ((prevLpTotalSupply_ == 0))
955959 then true
956960 else (lpTotalSupply_ == 0))
957961 then true
958962 else {
959- let prevAssetsRate = fraction((prevAssetTotalSupply_ - _calculateFee(prevAssetBalances_, prevAssetTotalSupply_, assetWeights_, sigmaWeight_, weightAmplifier_, slippageRate_, feeMaxRate_)), RATE_FACTOR, prevLpTotalSupply_)
960- let newAssetsRate = fraction((assetTotalSupply_ - _calculateFee(assetBalances_, assetTotalSupply_, assetWeights_, sigmaWeight_, weightAmplifier_, slippageRate_, feeMaxRate_)), RATE_FACTOR, lpTotalSupply_)
963+ let prevAssetsRate = fraction((prevAssetTotalSupply_ - _calculateFee(prevAssetBalances_, prevAssetTotalSupply_, assetWeights_, sigmaWeight_, weightAmplifier_, slippageRate_, feeMaxRate_)), RATE_FACTOR, toBigInt(prevLpTotalSupply_))
964+ let newAssetsRate = fraction((assetTotalSupply_ - _calculateFee(assetBalances_, assetTotalSupply_, assetWeights_, sigmaWeight_, weightAmplifier_, slippageRate_, feeMaxRate_)), RATE_FACTOR, toBigInt(lpTotalSupply_))
961965 let diff = (newAssetsRate - prevAssetsRate)
962- if (if ((0 >= diff))
963- then ((-1 * _loadPrecision()) > diff)
966+ if (if ((ZERO_BIGINT >= diff))
967+ then ((toBigInt(-1) * toBigInt(_loadPrecision())) > diff)
964968 else false)
965969 then throw(("_validateLiquidityInvariant: revert: diff=" + toString(diff)))
966970 else true
967971 }
968972
969973
970974 func _validateSwapInvariant (prevAssetBalances_,prevAssetTotalSupply_,assetBalances_,assetTotalSupply_,assetWeights_,sigmaWeight_,weightAmplifier_,slippageRate_,feeMaxRate_) = {
971975 let prevUtil = (prevAssetTotalSupply_ - _calculateFee(prevAssetBalances_, prevAssetTotalSupply_, assetWeights_, sigmaWeight_, weightAmplifier_, slippageRate_, feeMaxRate_))
972976 let newUtil = (assetTotalSupply_ - _calculateFee(assetBalances_, assetTotalSupply_, assetWeights_, sigmaWeight_, weightAmplifier_, slippageRate_, feeMaxRate_))
973977 let diff = (newUtil - prevUtil)
974- if (if ((0 >= diff))
975- then ((-1 * _loadPrecision()) > diff)
978+ if (if ((ZERO_BIGINT >= diff))
979+ then ((toBigInt(-1) * toBigInt(_loadPrecision())) > diff)
976980 else false)
977981 then throw(("_validateSwapInvariant: revert: diff=" + toString(diff)))
978982 else true
979983 }
980984
981985
982986 func _validateAssetAllocation (balance_,assetTotalSupply_,prevBalance_,prevAssetTotalSupply_,weight_,sigmaWeight_,maxAllocAmp_) = {
983- let equilibrium = fraction(assetTotalSupply_, weight_, sigmaWeight_)
987+ let equilibrium = fraction(assetTotalSupply_, toBigInt(weight_), toBigInt(sigmaWeight_))
984988 let maxAllocationAmp = if ((balance_ > equilibrium))
985989 then (MAX_AMPLIFIER + maxAllocAmp_)
986990 else (MAX_AMPLIFIER - maxAllocAmp_)
987991 let maxAllocation = fraction(equilibrium, maxAllocationAmp, MAX_AMPLIFIER)
988- let prevMaxAllocation = fraction(fraction(prevAssetTotalSupply_, weight_, sigmaWeight_), maxAllocationAmp, MAX_AMPLIFIER)
992+ let prevMaxAllocation = fraction(fraction(prevAssetTotalSupply_, toBigInt(weight_), toBigInt(sigmaWeight_)), maxAllocationAmp, MAX_AMPLIFIER)
989993 if ((balance_ > equilibrium))
990994 then if ((balance_ > maxAllocation))
991995 then if ((prevMaxAllocation > prevBalance_))
992996 then throw("_validateAssetAllocation: new up")
993997 else if (((balance_ - maxAllocation) > (prevBalance_ - prevMaxAllocation)))
994998 then throw("_validateAssetAllocation: still up")
995999 else true
9961000 else true
9971001 else if ((maxAllocation > balance_))
9981002 then if ((prevBalance_ > prevMaxAllocation))
9991003 then throw("_validateAssetAllocation: new down")
10001004 else if (((maxAllocation - balance_) > (prevMaxAllocation - prevBalance_)))
10011005 then throw("_validateAssetAllocation: still down")
10021006 else true
10031007 else true
10041008 }
10051009
10061010
10071011 func _validateAllocation (assetBalances_,assetTotalSupply_,prevAssetBalances_,prevAssetTotalSupply_,assetWeights_,sigmaWeight_,maxAllocAmp_) = {
10081012 func foldFunc (acc,elem) = {
10091013 let index = acc._1
10101014 $Tuple2((index + 1), if (acc._2)
10111015 then _validateAssetAllocation(elem, assetTotalSupply_, prevAssetBalances_[index], prevAssetTotalSupply_, assetWeights_[index], sigmaWeight_, maxAllocAmp_)
10121016 else false)
10131017 }
10141018
10151019 let result = {
10161020 let $l = assetBalances_
10171021 let $s = size($l)
10181022 let $acc0 = $Tuple2(0, true)
10191023 func $f0_1 ($a,$i) = if (($i >= $s))
10201024 then $a
10211025 else foldFunc($a, $l[$i])
10221026
10231027 func $f0_2 ($a,$i) = if (($i >= $s))
10241028 then $a
10251029 else throw("List size exceeds 10")
10261030
10271031 $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)
10281032 }
10291033 result._2
10301034 }
10311035
10321036
10331037 func _checkpoint (user_) = {
10341038 let userLp = _loadUserLp(user_)
10351039 let userProfits = _loadUserProfits(user_)
10361040 let sigmaFeePerLp = _loadSigmaFeePerLp()
10371041 let userSigmaFeePerLp = _loadUserSigmaFeePerLp(user_)
10381042 func foldFunc (acc,elem) = {
10391043 let index = acc._1
10401044 let profitUpdated = (userProfits[index] + toInt(fraction(toBigInt(userLp), (sigmaFeePerLp[index] - userSigmaFeePerLp[index]), PERCENT_FACTOR)))
10411045 $Tuple2((index + 1), (acc._2 :+ profitUpdated))
10421046 }
10431047
1044- let $t02462924702 = {
1048+ let $t02527625349 = {
10451049 let $l = ZERO_INT_LIST_11
10461050 let $s = size($l)
10471051 let $acc0 = $Tuple2(0, nil)
10481052 func $f0_1 ($a,$i) = if (($i >= $s))
10491053 then $a
10501054 else foldFunc($a, $l[$i])
10511055
10521056 func $f0_2 ($a,$i) = if (($i >= $s))
10531057 then $a
10541058 else throw("List size exceeds 11")
10551059
10561060 $f0_2($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)
10571061 }
1058- let idx = $t02462924702._1
1059- let profitsUpdated = $t02462924702._2
1062+ let idx = $t02527625349._1
1063+ let profitsUpdated = $t02527625349._2
10601064 $Tuple2((_saveUserProfits(user_, profitsUpdated) ++ _saveUserSigmaFeePerLp(user_, sigmaFeePerLp)), profitsUpdated)
10611065 }
10621066
10631067
10641068 func _updateSigmaFeePerLp (sigmaFeePerLp_,totalLp_,index_,lpFee_) = {
10651069 func foldFunc (acc,elem) = {
10661070 let index = acc._1
10671071 let sigmaFeePerLpUpdated = if ((index_ == index))
10681072 then (sigmaFeePerLp_[index] + fraction(toBigInt(lpFee_), PERCENT_FACTOR, toBigInt(totalLp_)))
10691073 else sigmaFeePerLp_[index]
10701074 $Tuple2((index + 1), (acc._2 :+ sigmaFeePerLpUpdated))
10711075 }
10721076
1073- let $t02535225431 = {
1077+ let $t02599926078 = {
10741078 let $l = ZERO_INT_LIST_11
10751079 let $s = size($l)
10761080 let $acc0 = $Tuple2(0, nil)
10771081 func $f0_1 ($a,$i) = if (($i >= $s))
10781082 then $a
10791083 else foldFunc($a, $l[$i])
10801084
10811085 func $f0_2 ($a,$i) = if (($i >= $s))
10821086 then $a
10831087 else throw("List size exceeds 11")
10841088
10851089 $f0_2($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)
10861090 }
1087- let idx = $t02535225431._1
1088- let sigmaFeePerLpUpdated = $t02535225431._2
1091+ let idx = $t02599926078._1
1092+ let sigmaFeePerLpUpdated = $t02599926078._2
10891093 sigmaFeePerLpUpdated
10901094 }
10911095
10921096
10931097 func _calculateLpAndProtocolFees (assetIndex_,amount_,lpFeeRate_,protocolFeeRate_) = {
10941098 let sigmaFeePerLp = _loadSigmaFeePerLp()
10951099 let totalLp = _loadTotalLp()
1096- let $t02565225927 = if ((totalLp == 0))
1100+ let $t02629926574 = if ((totalLp == 0))
10971101 then $Tuple2(0, fraction(amount_, protocolFeeRate_, MAX_FEE))
10981102 else $Tuple2(fraction(amount_, lpFeeRate_, MAX_FEE), fraction(amount_, protocolFeeRate_, MAX_FEE))
1099- let lpFee = $t02565225927._1
1100- let protocolFee = $t02565225927._2
1103+ let lpFee = $t02629926574._1
1104+ let protocolFee = $t02629926574._2
11011105 let sigmaFeePerLpUpdated = if ((lpFee == 0))
11021106 then sigmaFeePerLp
11031107 else _updateSigmaFeePerLp(sigmaFeePerLp, totalLp, assetIndex_, lpFee)
11041108 $Tuple3(lpFee, protocolFee, sigmaFeePerLpUpdated)
11051109 }
11061110
11071111
11081112 func _depositAll (amount_) = {
11091113 let storage = _loadStorage()
11101114 let lpTotalSupply = storage._3
11111115 let weightAmplifier = storage._7
11121116 let slippageRate = storage._8
11131117 let feeMaxRate = storage._9
11141118 let assets = _loadAssets()
1115- let $t02643626489 = _loadAssetWeights()
1116- let assetWeights = $t02643626489._1
1117- let sigmaWeight = $t02643626489._2
1118- let $t02649426562 = _loadAssetBalances()
1119- let prevAssetBalances = $t02649426562._1
1120- let prevAssetTotalSupply = $t02649426562._2
1121- let $t02656827798 = if ((prevAssetTotalSupply == 0))
1119+ let $t02708327136 = _loadAssetWeights()
1120+ let assetWeights = $t02708327136._1
1121+ let sigmaWeight = $t02708327136._2
1122+ let $t02714127209 = _loadAssetBalances()
1123+ let prevAssetBalances = $t02714127209._1
1124+ let prevAssetTotalSupply = $t02714127209._2
1125+ let $t02721528461 = if ((prevAssetTotalSupply == ZERO_BIGINT))
11221126 then {
11231127 func foldFunc (acc,elem) = {
11241128 let index = acc._1
11251129 let requiredAmountNormalized = fraction(assetWeights[index], amount_, sigmaWeight)
11261130 $Tuple2((index + 1), (acc._2 :+ requiredAmountNormalized))
11271131 }
11281132
1129- let $t02701027084 = {
1133+ let $t02767027744 = {
11301134 let $l = assets
11311135 let $s = size($l)
11321136 let $acc0 = $Tuple2(0, nil)
11331137 func $f0_1 ($a,$i) = if (($i >= $s))
11341138 then $a
11351139 else foldFunc($a, $l[$i])
11361140
11371141 func $f0_2 ($a,$i) = if (($i >= $s))
11381142 then $a
11391143 else throw("List size exceeds 10")
11401144
11411145 $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)
11421146 }
1143- let idx = $t02701027084._1
1144- let requiredAmountsNormalized = $t02701027084._2
1147+ let idx = $t02767027744._1
1148+ let requiredAmountsNormalized = $t02767027744._2
11451149 $Tuple2(amount_, requiredAmountsNormalized)
11461150 }
11471151 else {
1148- let ratio = fraction(toBigInt(amount_), PERCENT_FACTOR, toBigInt(prevAssetTotalSupply))
1152+ let ratio = fraction(toBigInt(amount_), PERCENT_FACTOR, prevAssetTotalSupply)
11491153 func foldFunc1 (acc,elem) = {
11501154 let index = acc._1
1151- let requiredAmountNormalized = toInt(fraction(ratio, toBigInt(prevAssetBalances[index]), PERCENT_FACTOR))
1155+ let requiredAmountNormalized = fraction(ratio, prevAssetBalances[index], PERCENT_FACTOR)
11521156 $Tuple2((index + 1), (acc._2 :+ requiredAmountNormalized))
11531157 }
11541158
1155- let $t02762727702 = {
1159+ let $t02826028335 = {
11561160 let $l = assets
11571161 let $s = size($l)
11581162 let $acc0 = $Tuple2(0, nil)
11591163 func $f0_1 ($a,$i) = if (($i >= $s))
11601164 then $a
11611165 else foldFunc1($a, $l[$i])
11621166
11631167 func $f0_2 ($a,$i) = if (($i >= $s))
11641168 then $a
11651169 else throw("List size exceeds 10")
11661170
11671171 $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)
11681172 }
1169- let idx = $t02762727702._1
1170- let requiredAmountsNormalized = $t02762727702._2
1171- $Tuple2(fraction(amount_, lpTotalSupply, prevAssetTotalSupply), requiredAmountsNormalized)
1172- }
1173- let lpTokensToMint = $t02656827798._1
1174- let requiredAmountsNormalized = $t02656827798._2
1175- let $t02780427917 = _incrementBalancesByAmounts(prevAssetBalances, requiredAmountsNormalized)
1176- let assetBalances = $t02780427917._1
1177- let assetTotalSupply = $t02780427917._2
1173+ let idx = $t02826028335._1
1174+ let requiredAmountsNormalized = $t02826028335._2
1175+ $Tuple2(toInt(fraction(toBigInt(amount_), toBigInt(lpTotalSupply), prevAssetTotalSupply)), requiredAmountsNormalized)
1176+ }
1177+ let lpTokensToMint = $t02721528461._1
1178+ let requiredAmountsNormalized = $t02721528461._2
1179+ let $t02846728580 = _incrementBalancesByAmounts(prevAssetBalances, requiredAmountsNormalized)
1180+ let assetBalances = $t02846728580._1
1181+ let assetTotalSupply = $t02846728580._2
11781182 let err2 = _validateLiquidityInvariant(prevAssetBalances, prevAssetTotalSupply, assetBalances, assetTotalSupply, lpTotalSupply, (lpTotalSupply + lpTokensToMint), assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
11791183 if ((err2 == err2))
11801184 then $Tuple3(lpTokensToMint, requiredAmountsNormalized, assetBalances)
11811185 else throw("Strict value is not equal to itself.")
11821186 }
11831187
11841188
11851189 func _deposit (assetId_,amount_) = {
11861190 let storage = _loadStorage()
11871191 let lpTotalSupply = storage._3
11881192 let maxAllocAmplifier = storage._6
11891193 let weightAmplifier = storage._7
11901194 let slippageRate = storage._8
11911195 let feeMaxRate = storage._9
11921196 let assets = _loadAssets()
1193- let $t02861228665 = _loadAssetWeights()
1194- let assetWeights = $t02861228665._1
1195- let sigmaWeight = $t02861228665._2
1196- let $t02867028784 = _loadAssetBalances()
1197- let prevAssetBalances = $t02867028784._1
1198- let prevAssetTotalSupply = $t02867028784._2
1197+ let $t02927829331 = _loadAssetWeights()
1198+ let assetWeights = $t02927829331._1
1199+ let sigmaWeight = $t02927829331._2
1200+ let $t02933629450 = _loadAssetBalances()
1201+ let prevAssetBalances = $t02933629450._1
1202+ let prevAssetTotalSupply = $t02933629450._2
11991203 let assetBalances = _incrementBalanceByIndex(prevAssetBalances, value(indexOf(assets, assetId_)), amount_)
12001204 let assetTotalSupply = (prevAssetTotalSupply + amount_)
12011205 let err2 = _validateAllocation(assetBalances, assetTotalSupply, prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, maxAllocAmplifier)
12021206 if ((err2 == err2))
12031207 then {
12041208 let prevFee = _calculateFee(prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
12051209 let fee = _calculateFee(assetBalances, assetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
12061210 let lpTokensToMint = if ((lpTotalSupply == 0))
1207- then (assetTotalSupply - fee)
1211+ then toInt((assetTotalSupply - fee))
12081212 else {
12091213 let assetDiff = (assetTotalSupply - prevAssetTotalSupply)
12101214 let feeDiff = (fee - prevFee)
12111215 let utilityChangeFactor = fraction((assetDiff - feeDiff), RATE_FACTOR, (prevAssetTotalSupply - prevFee))
1212- let lpTokensToMintInner = fraction(lpTotalSupply, utilityChangeFactor, RATE_FACTOR)
1216+ let lpTokensToMintInner = toInt(fraction(toBigInt(lpTotalSupply), utilityChangeFactor, RATE_FACTOR))
12131217 let err3 = _validateLiquidityInvariant(prevAssetBalances, prevAssetTotalSupply, assetBalances, assetTotalSupply, lpTotalSupply, (lpTotalSupply + lpTokensToMintInner), assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
12141218 if ((err3 == err3))
12151219 then lpTokensToMintInner
12161220 else throw("Strict value is not equal to itself.")
12171221 }
12181222 $Tuple2(lpTokensToMint, assetBalances)
12191223 }
12201224 else throw("Strict value is not equal to itself.")
12211225 }
12221226
12231227
12241228 func _withdrawAll (amount_) = {
12251229 let storage = _loadStorage()
12261230 let lpTotalSupply = storage._3
12271231 let lpFeeRate = storage._4
12281232 let protocolFeeRate = storage._5
12291233 let maxAllocAmplifier = storage._6
12301234 let weightAmplifier = storage._7
12311235 let slippageRate = storage._8
12321236 let feeMaxRate = storage._9
1233- let $t03071130779 = _loadAssetBalances()
1234- let prevAssetBalances = $t03071130779._1
1235- let prevAssetTotalSupply = $t03071130779._2
1236- let $t03078430837 = _loadAssetWeights()
1237- let assetWeights = $t03078430837._1
1238- let sigmaWeight = $t03078430837._2
1237+ let $t03146031528 = _loadAssetBalances()
1238+ let prevAssetBalances = $t03146031528._1
1239+ let prevAssetTotalSupply = $t03146031528._2
1240+ let $t03153331586 = _loadAssetWeights()
1241+ let assetWeights = $t03153331586._1
1242+ let sigmaWeight = $t03153331586._2
12391243 let lpTokensToBurn = amount_
1240- let err = _validateInt(lpTokensToBurn, 0, MAX_INT, "_withdrawAll: lpTokensToBurn less than 0")
1241- if ((err == err))
1242- then {
1243- let $t03097931112 = _decrementBalancesByLpAmount(prevAssetBalances, lpTokensToBurn, lpTotalSupply)
1244- let assetBalances = $t03097931112._1
1245- let assetTotalSupply = $t03097931112._2
1246- let balancesToPay = $t03097931112._3
1247- let err2 = _validateLiquidityInvariant(prevAssetBalances, prevAssetTotalSupply, assetBalances, assetTotalSupply, lpTotalSupply, (lpTotalSupply - lpTokensToBurn), assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
1248- if ((err2 == err2))
1249- then $Tuple3(lpTokensToBurn, balancesToPay, assetBalances)
1250- else throw("Strict value is not equal to itself.")
1251- }
1244+ let $t03162531780 = _decrementBalancesByLpAmount(prevAssetBalances, toBigInt(lpTokensToBurn), toBigInt(lpTotalSupply))
1245+ let assetBalances = $t03162531780._1
1246+ let assetTotalSupply = $t03162531780._2
1247+ let balancesToPay = $t03162531780._3
1248+ let err2 = _validateLiquidityInvariant(prevAssetBalances, prevAssetTotalSupply, assetBalances, assetTotalSupply, lpTotalSupply, (lpTotalSupply - lpTokensToBurn), assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
1249+ if ((err2 == err2))
1250+ then $Tuple3(lpTokensToBurn, balancesToPay, assetBalances)
12521251 else throw("Strict value is not equal to itself.")
12531252 }
12541253
12551254
12561255 func _withdraw (assetId_,lpAmount_) = {
12571256 let storage = _loadStorage()
12581257 let lpTotalSupply = storage._3
12591258 let lpFeeRate = storage._4
12601259 let protocolFeeRate = storage._5
12611260 let maxAllocAmplifier = storage._6
12621261 let weightAmplifier = storage._7
12631262 let slippageRate = storage._8
12641263 let feeMaxRate = storage._9
12651264 let precision = _loadPrecision()
12661265 let assets = _loadAssets()
1267- let $t03190431972 = _loadAssetBalances()
1268- let prevAssetBalances = $t03190431972._1
1269- let prevAssetTotalSupply = $t03190431972._2
1270- let $t03197732030 = _loadAssetWeights()
1271- let assetWeights = $t03197732030._1
1272- let sigmaWeight = $t03197732030._2
1266+ let $t03257232640 = _loadAssetBalances()
1267+ let prevAssetBalances = $t03257232640._1
1268+ let prevAssetTotalSupply = $t03257232640._2
1269+ let $t03264532698 = _loadAssetWeights()
1270+ let assetWeights = $t03264532698._1
1271+ let sigmaWeight = $t03264532698._2
12731272 let targetAssetIndex = value(indexOf(assets, assetId_))
12741273 let prevFee = _calculateFee(prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
12751274 let prevUtilValue = (prevAssetTotalSupply - prevFee)
12761275 let k = fraction(toBigInt((lpTotalSupply - lpAmount_)), PERCENT_FACTOR, toBigInt(lpTotalSupply))
1277- let prevUtilValueWithK = toInt(fraction(toBigInt(prevUtilValue), k, PERCENT_FACTOR))
1276+ let prevUtilValueWithK = fraction(prevUtilValue, k, PERCENT_FACTOR)
12781277 func foldFunc (acc,elem) = if (acc._1)
12791278 then acc
12801279 else {
12811280 let startInner = acc._2
12821281 let stopInner = acc._3
1283- let currentAmount = ((stopInner + startInner) / 2)
1282+ let currentAmount = ((stopInner + startInner) / toBigInt(2))
12841283 let tempAssetBalances = _decrementBalanceByIndex(prevAssetBalances, targetAssetIndex, currentAmount)
12851284 let tempAssetTotalSupply = (prevAssetTotalSupply - currentAmount)
12861285 let utilValue = (tempAssetTotalSupply - _calculateFee(tempAssetBalances, tempAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate))
1287- if (if ((precision > (utilValue - prevUtilValueWithK)))
1288- then ((utilValue - prevUtilValueWithK) >= 0)
1286+ if (if ((toBigInt(precision) > (utilValue - prevUtilValueWithK)))
1287+ then ((utilValue - prevUtilValueWithK) >= ZERO_BIGINT)
12891288 else false)
12901289 then $Tuple4(true, startInner, stopInner, currentAmount)
1291- else if ((0 > (utilValue - prevUtilValueWithK)))
1292- then $Tuple4(false, startInner, currentAmount, 0)
1293- else $Tuple4(false, currentAmount, stopInner, 0)
1290+ else if ((ZERO_BIGINT > (utilValue - prevUtilValueWithK)))
1291+ then $Tuple4(false, startInner, currentAmount, ZERO_BIGINT)
1292+ else $Tuple4(false, currentAmount, stopInner, ZERO_BIGINT)
12941293 }
12951294
12961295 let targetAmount = {
1297- let $t03352933644 = {
1296+ let $t03426334409 = {
12981297 let $l = LIST_64
12991298 let $s = size($l)
1300- let $acc0 = $Tuple4(false, 0, (lpAmount_ + prevFee), 0)
1299+ let $acc0 = $Tuple4(false, ZERO_BIGINT, (toBigInt(lpAmount_) + prevFee), ZERO_BIGINT)
13011300 func $f0_1 ($a,$i) = if (($i >= $s))
13021301 then $a
13031302 else foldFunc($a, $l[$i])
13041303
13051304 func $f0_2 ($a,$i) = if (($i >= $s))
13061305 then $a
1307- else throw("List size exceeds 64")
1308-
1309- $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($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($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($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), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63), 64)
1310- }
1311- let success = $t03352933644._1
1312- let startOut = $t03352933644._2
1313- let stopOut = $t03352933644._3
1314- let targetAmountOut = $t03352933644._4
1306+ else throw("List size exceeds 20")
1307+
1308+ $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)
1309+ }
1310+ let success = $t03426334409._1
1311+ let startOut = $t03426334409._2
1312+ let stopOut = $t03426334409._3
1313+ let targetAmountOut = $t03426334409._4
13151314 if (!(success))
13161315 then throw(("_withdraw: can't calculate targetAmount=" + toString(targetAmountOut)))
13171316 else targetAmountOut
13181317 }
13191318 let finalAssetBalances = _decrementBalanceByIndex(prevAssetBalances, targetAssetIndex, targetAmount)
13201319 let finalAssetTotalSupply = (prevAssetTotalSupply - targetAmount)
13211320 let err1 = if (_validateAllocation(finalAssetBalances, finalAssetTotalSupply, prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, maxAllocAmplifier))
13221321 then _validateLiquidityInvariant(prevAssetBalances, prevAssetTotalSupply, finalAssetBalances, finalAssetTotalSupply, lpTotalSupply, (lpTotalSupply - lpAmount_), assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
13231322 else false
13241323 if ((err1 == err1))
13251324 then {
1326- let $t03451934659 = _calculateLpAndProtocolFees((targetAssetIndex + 1), targetAmount, lpFeeRate, protocolFeeRate)
1327- let lpFee = $t03451934659._1
1328- let protocolFee = $t03451934659._2
1329- let sigmaFeePerLpUpdated = $t03451934659._3
1325+ let $t03528435432 = _calculateLpAndProtocolFees((targetAssetIndex + 1), toInt(targetAmount), lpFeeRate, protocolFeeRate)
1326+ let lpFee = $t03528435432._1
1327+ let protocolFee = $t03528435432._2
1328+ let sigmaFeePerLpUpdated = $t03528435432._3
13301329 $Tuple5(targetAmount, finalAssetBalances, lpFee, protocolFee, sigmaFeePerLpUpdated)
13311330 }
13321331 else throw("Strict value is not equal to itself.")
13331332 }
13341333
13351334
13361335 func _swap (sourceAssetIndex_,targetAssetIndex_,sourceAmount_) = {
13371336 let storage = _loadStorage()
13381337 let lpAssetId = storage._1
13391338 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
13401339 let lpTotalSupply = storage._3
13411340 let lpFeeRate = storage._4
13421341 let protocolFeeRate = storage._5
13431342 let maxAllocAmplifier = storage._6
13441343 let weightAmplifier = storage._7
13451344 let slippageRate = storage._8
13461345 let feeMaxRate = storage._9
13471346 let precision = _loadPrecision()
1348- let $t03524135309 = _loadAssetBalances()
1349- let prevAssetBalances = $t03524135309._1
1350- let prevAssetTotalSupply = $t03524135309._2
1351- let $t03531435367 = _loadAssetWeights()
1352- let assetWeights = $t03531435367._1
1353- let sigmaWeight = $t03531435367._2
1347+ let $t03601736085 = _loadAssetBalances()
1348+ let prevAssetBalances = $t03601736085._1
1349+ let prevAssetTotalSupply = $t03601736085._2
1350+ let $t03609036143 = _loadAssetWeights()
1351+ let assetWeights = $t03609036143._1
1352+ let sigmaWeight = $t03609036143._2
13541353 let assetBalances = _incrementBalanceByIndex(prevAssetBalances, sourceAssetIndex_, sourceAmount_)
13551354 let assetTotalSupply = (prevAssetTotalSupply + sourceAmount_)
13561355 let prevFee = _calculateFee(prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
13571356 let prevUtilValue = (prevAssetTotalSupply - prevFee)
13581357 func foldFunc (acc,elem) = if (acc._1)
13591358 then acc
13601359 else {
13611360 let startInner = acc._2
13621361 let stopInner = acc._3
1363- let currentAmount = ((stopInner + startInner) / 2)
1362+ let currentAmount = ((stopInner + startInner) / toBigInt(2))
13641363 let tempAssetBalances = _decrementBalanceByIndex(assetBalances, targetAssetIndex_, currentAmount)
13651364 let tempAssetTotalSupply = (assetTotalSupply - currentAmount)
13661365 let utilValue = (tempAssetTotalSupply - _calculateFee(tempAssetBalances, tempAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate))
1367- if (if ((precision > (utilValue - prevUtilValue)))
1368- then ((utilValue - prevUtilValue) >= 0)
1366+ if (if ((toBigInt(precision) > (utilValue - prevUtilValue)))
1367+ then ((utilValue - prevUtilValue) >= ZERO_BIGINT)
13691368 else false)
13701369 then $Tuple4(true, startInner, stopInner, currentAmount)
1371- else if ((0 > (utilValue - prevUtilValue)))
1372- then if ((((startInner + currentAmount) / 2) == 0))
1373- then throw(((toString(utilValue) + " ") + toString(prevUtilValue)))
1374- else $Tuple5(false, startInner, currentAmount, currentAmount, (acc._5 :+ utilValue))
1375- else if ((((stopInner + currentAmount) / 2) == 0))
1376- then throw(((toString(utilValue) + " ") + toString(prevUtilValue)))
1377- else $Tuple5(false, currentAmount, stopInner, currentAmount, (acc._5 :+ utilValue))
1370+ else if ((ZERO_BIGINT > (utilValue - prevUtilValue)))
1371+ then $Tuple5(false, startInner, currentAmount, currentAmount, (acc._5 :+ utilValue))
1372+ else $Tuple5(false, currentAmount, stopInner, currentAmount, (acc._5 :+ utilValue))
13781373 }
13791374
13801375 let targetAmount = {
13811376 let targetAmount = sourceAmount_
13821377 let tempAssetBalances = _decrementBalanceByIndex(assetBalances, targetAssetIndex_, targetAmount)
13831378 let tempAssetTotalSupply = (assetTotalSupply - targetAmount)
13841379 let fee = _calculateFee(tempAssetBalances, tempAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
13851380 let feeDiff = (fee - prevFee)
1386- if ((feeDiff == 0))
1381+ if ((feeDiff == ZERO_BIGINT))
13871382 then targetAmount
13881383 else {
1389- let $t03764637776 = {
1384+ let $t03855438704 = {
13901385 let $l = LIST_64
13911386 let $s = size($l)
1392- let $acc0 = $Tuple5(false, 0, (sourceAmount_ + prevFee), 0, nil)
1387+ let $acc0 = $Tuple5(false, ZERO_BIGINT, (sourceAmount_ + prevFee), ZERO_BIGINT, nil)
13931388 func $f0_1 ($a,$i) = if (($i >= $s))
13941389 then $a
13951390 else foldFunc($a, $l[$i])
13961391
13971392 func $f0_2 ($a,$i) = if (($i >= $s))
13981393 then $a
1399- else throw("List size exceeds 64")
1400-
1401- $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($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($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($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), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63), 64)
1394+ else throw("List size exceeds 46")
1395+
1396+ $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($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($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), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46)
14021397 }
1403- let success = $t03764637776._1
1404- let startOut = $t03764637776._2
1405- let stopOut = $t03764637776._3
1406- let targetAmountOut = $t03764637776._4
1407- let debug = $t03764637776._5
1398+ let success = $t03855438704._1
1399+ let startOut = $t03855438704._2
1400+ let stopOut = $t03855438704._3
1401+ let targetAmountOut = $t03855438704._4
1402+ let debug = $t03855438704._5
14081403 if (!(success))
1409- then throw(_listIntToString(debug))
1404+ then throw(_listBigIntToString(debug))
14101405 else targetAmountOut
14111406 }
14121407 }
14131408 let finalAssetBalances = _decrementBalanceByIndex(assetBalances, targetAssetIndex_, targetAmount)
14141409 let finalAssetTotalSupply = (assetTotalSupply - targetAmount)
14151410 let err1 = if (_validateAllocation(finalAssetBalances, finalAssetTotalSupply, prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, maxAllocAmplifier))
14161411 then _validateSwapInvariant(prevAssetBalances, prevAssetTotalSupply, finalAssetBalances, finalAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
14171412 else false
14181413 if ((err1 == err1))
14191414 then {
1420- let $t03863938780 = _calculateLpAndProtocolFees((targetAssetIndex_ + 1), targetAmount, lpFeeRate, protocolFeeRate)
1421- let lpFee = $t03863938780._1
1422- let protocolFee = $t03863938780._2
1423- let sigmaFeePerLpUpdated = $t03863938780._3
1415+ let $t03957039719 = _calculateLpAndProtocolFees((targetAssetIndex_ + 1), toInt(targetAmount), lpFeeRate, protocolFeeRate)
1416+ let lpFee = $t03957039719._1
1417+ let protocolFee = $t03957039719._2
1418+ let sigmaFeePerLpUpdated = $t03957039719._3
14241419 $Tuple5(targetAmount, finalAssetBalances, lpFee, protocolFee, sigmaFeePerLpUpdated)
14251420 }
14261421 else throw("Strict value is not equal to itself.")
14271422 }
14281423
14291424
14301425 @Callable(i)
14311426 func init (assets_,assetWeights_,lpFeeRate_,protocolFeeRate_,lpTokenName_,lpTokenDescr_,lpTokenDecimals_,maxAllocationAmplifier_,weightAmplifier_,slippageRate_,feeMaxRate_,protocolFeeContract_,precision_,pauser_) = {
14321427 let err = if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (_onlyThisContract(i.caller))
14331428 then _whenNotInitialized()
14341429 else false)
14351430 then _whenMultisigSet()
14361431 else false)
14371432 then _validateAssets(assets_, "init: invalid assets")
14381433 else false)
14391434 then _validateIntList(assetWeights_, 1, MAX_WEIGHT, "init: invalid assetWeights")
14401435 else false)
14411436 then _validateIntEquals(size(assets_), size(assetWeights_), "init: invalid assetWeights size")
14421437 else false)
14431438 then _validateInt(lpFeeRate_, 0, MAX_FEE, "init: invalid lp fee")
14441439 else false)
14451440 then _validateInt(protocolFeeRate_, 0, MAX_FEE, "init: invalid protocol fee")
14461441 else false)
14471442 then _validateTokenName(lpTokenName_, "init: invalid name")
14481443 else false)
14491444 then _validateTokenDescr(lpTokenDescr_, "init: invalid descr")
14501445 else false)
14511446 then _validateDecimals(lpTokenDecimals_, "init: invalid decimals")
14521447 else false)
1453- then _validateInt(maxAllocationAmplifier_, 0, MAX_AMPLIFIER, "init: invalid maxAllocationAmplifier")
1448+ then _validateInt(maxAllocationAmplifier_, 0, toInt(MAX_AMPLIFIER), "init: invalid maxAllocationAmplifier")
14541449 else false)
14551450 then _validateInt(weightAmplifier_, 0, maxAllocationAmplifier_, "init: invalid weightAmplifier")
14561451 else false)
14571452 then _validateInt(slippageRate_, 0, MAX_INT, "init: invalid slippageRate")
14581453 else false)
14591454 then _validateInt(feeMaxRate_, 0, MAX_INT, "init: invalid feeMaxRate")
14601455 else false)
14611456 then _validateAddress(protocolFeeContract_, "init: invalid protocolFeeContract")
14621457 else false)
14631458 then _validateInt(precision_, 1, MAX_INT, "init: invalid precision")
14641459 else false)
14651460 then _validateAddress(pauser_, "init: invalid pauser")
14661461 else false
14671462 if ((err == err))
14681463 then {
1469- let $t04064340712 = _prepareAssetWeights(assetWeights_)
1470- let assetWeights = $t04064340712._1
1471- let sigmaWeight = $t04064340712._2
1464+ let $t04159041659 = _prepareAssetWeights(assetWeights_)
1465+ let assetWeights = $t04159041659._1
1466+ let sigmaWeight = $t04159041659._2
14721467 let assetBalances = _prepareAssetBalances(assets_)
14731468 let issue = Issue(lpTokenName_, lpTokenDescr_, 0, lpTokenDecimals_, true)
14741469 let lpAssetId = calculateAssetId(issue)
1475- let storageUpdated = $Tuple10(lpAssetId, true, 0, lpFeeRate_, protocolFeeRate_, maxAllocationAmplifier_, weightAmplifier_, slippageRate_, feeMaxRate_, addressFromStringValue(protocolFeeContract_))
1470+ let storageUpdated = $Tuple10(lpAssetId, true, 0, lpFeeRate_, protocolFeeRate_, toBigInt(maxAllocationAmplifier_), toBigInt(weightAmplifier_), toBigInt(slippageRate_), toBigInt(feeMaxRate_), addressFromStringValue(protocolFeeContract_))
14761471 $Tuple2(((((((([issue] ++ _saveStorage(storageUpdated)) ++ _saveAssets(assets_)) ++ _saveAssetBalances(assetBalances)) ++ _saveAssetWeights(assetWeights)) ++ _savePrecision(precision_)) ++ _saveSigmaFeePerLp(_loadSigmaFeePerLp())) ++ _savePauser(addressFromStringValue(pauser_))), unit)
14771472 }
14781473 else throw("Strict value is not equal to itself.")
14791474 }
14801475
14811476
14821477
14831478 @Callable(i)
14841479 func depositAll (amount_) = {
14851480 let err = if (if (_whenInitialized())
14861481 then _whenNotPaused()
14871482 else false)
14881483 then _validateInt(amount_, 0, MAX_INT, "depositAll: invalid amount")
14891484 else false
14901485 if ((err == err))
14911486 then {
14921487 let storage = _loadStorage()
14931488 let lpAssetId = storage._1
14941489 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
14951490 let assets = _loadAssets()
1496- let $t04246242547 = _depositAll(amount_)
1497- let lpTokensToMint = $t04246242547._1
1498- let requiredAmountsNormalized = $t04246242547._2
1499- let assetBalances = $t04246242547._3
1491+ let $t04340943494 = _depositAll(amount_)
1492+ let lpTokensToMint = $t04340943494._1
1493+ let requiredAmountsNormalized = $t04340943494._2
1494+ let assetBalances = $t04340943494._3
15001495 func foldFunc (acc,elem) = {
15011496 let index = acc._1
15021497 let paymentAssetStr = _assetToStr(i.payments[index].assetId)
15031498 let paymentAssetDecimals = _getDecimals(paymentAssetStr)
15041499 let requiredAmountNormalized = requiredAmountsNormalized[index]
1505- let requiredAmount = _normalizeDecimals(requiredAmountNormalized, lpDecimals, paymentAssetDecimals, CEILING)
1500+ let requiredAmount = toInt(_normalizeDecimals(requiredAmountNormalized, lpDecimals, paymentAssetDecimals, CEILING))
15061501 let err1 = if ((paymentAssetStr != elem))
15071502 then throw(("depositAll: invalid payment: index=" + toString(index)))
15081503 else if ((0 >= requiredAmount))
15091504 then throw("depositAll: too little amount required")
15101505 else unit
15111506 if ((err1 == err1))
15121507 then {
15131508 let change = if ((i.payments[index].amount > requiredAmount))
15141509 then [ScriptTransfer(i.caller, (i.payments[index].amount - requiredAmount), i.payments[index].assetId)]
15151510 else if ((requiredAmount > i.payments[index].amount))
15161511 then throw(((("depositAll: insufficient payment, index=" + toString(index)) + ", required=") + toString(requiredAmount)))
15171512 else nil
15181513 $Tuple2((index + 1), (acc._2 ++ change))
15191514 }
15201515 else throw("Strict value is not equal to itself.")
15211516 }
15221517
1523- let $t04369043752 = {
1518+ let $t04469244754 = {
15241519 let $l = assets
15251520 let $s = size($l)
15261521 let $acc0 = $Tuple2(0, nil)
15271522 func $f0_1 ($a,$i) = if (($i >= $s))
15281523 then $a
15291524 else foldFunc($a, $l[$i])
15301525
15311526 func $f0_2 ($a,$i) = if (($i >= $s))
15321527 then $a
15331528 else throw("List size exceeds 10")
15341529
15351530 $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)
15361531 }
1537- let idx = $t04369043752._1
1538- let changeActions = $t04369043752._2
1532+ let idx = $t04469244754._1
1533+ let changeActions = $t04469244754._2
15391534 let storageUpdated = $Tuple10(storage._1, storage._2, (storage._3 + lpTokensToMint), storage._4, storage._5, storage._6, storage._7, storage._8, storage._9, storage._10)
15401535 $Tuple2(((([Reissue(lpAssetId, lpTokensToMint, true), ScriptTransfer(i.caller, lpTokensToMint, lpAssetId)] ++ _saveStorage(storageUpdated)) ++ _saveAssetBalances(assetBalances)) ++ changeActions), unit)
15411536 }
15421537 else throw("Strict value is not equal to itself.")
15431538 }
15441539
15451540
15461541
15471542 @Callable(i)
15481543 func deposit (minLpAmount_) = {
15491544 let err = _validateInt(minLpAmount_, 0, MAX_INT, "deposit: invalid min lp amount")
15501545 if ((err == err))
15511546 then {
15521547 let storage = _loadStorage()
15531548 let lpAssetId = storage._1
15541549 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
15551550 let err1 = if (if (if (if (_whenInitialized())
15561551 then _whenNotPaused()
15571552 else false)
15581553 then _validateIntEquals(size(i.payments), 1, "deposit: invalid payments size")
15591554 else false)
15601555 then _validateListContains(_loadAssets(), _assetToStr(i.payments[0].assetId), "deposit: invalid payment asset")
15611556 else false)
15621557 then _validateInt(i.payments[0].amount, 1, MAX_INT, "deposit: invalid payment amount")
15631558 else false
15641559 if ((err1 == err1))
15651560 then {
15661561 let assetStr = _assetToStr(i.payments[0].assetId)
15671562 let assetDecimals = _getDecimals(assetStr)
1568- let amountNormalized = _normalizeDecimals(i.payments[0].amount, assetDecimals, lpDecimals, DOWN)
1569- let $t04513145205 = _deposit(assetStr, amountNormalized)
1570- let lpTokensToMint = $t04513145205._1
1571- let assetBalances = $t04513145205._2
1563+ let amountNormalized = _normalizeDecimals(toBigInt(i.payments[0].amount), assetDecimals, lpDecimals, DOWN)
1564+ let $t04616146261 = _deposit(assetStr, amountNormalized)
1565+ let lpTokensToMint = $t04616146261._1
1566+ let assetBalances = $t04616146261._2
15721567 let err2 = _validateInt(lpTokensToMint, minLpAmount_, MAX_INT, "deposit: less than min lp")
15731568 if ((err2 == err2))
15741569 then {
15751570 let storageUpdated = $Tuple10(storage._1, storage._2, (storage._3 + lpTokensToMint), storage._4, storage._5, storage._6, storage._7, storage._8, storage._9, storage._10)
15761571 $Tuple2((([Reissue(lpAssetId, lpTokensToMint, true), ScriptTransfer(i.caller, lpTokensToMint, lpAssetId)] ++ _saveStorage(storageUpdated)) ++ _saveAssetBalances(assetBalances)), unit)
15771572 }
15781573 else throw("Strict value is not equal to itself.")
15791574 }
15801575 else throw("Strict value is not equal to itself.")
15811576 }
15821577 else throw("Strict value is not equal to itself.")
15831578 }
15841579
15851580
15861581
15871582 @Callable(i)
15881583 func withdrawAll () = {
15891584 let storage = _loadStorage()
15901585 let lpAssetId = storage._1
15911586 let lpAssetIdStr = toBase58String(lpAssetId)
15921587 let lpDecimals = _getDecimals(lpAssetIdStr)
15931588 let assets = _loadAssets()
15941589 let err = if (if (if (if (_whenInitialized())
15951590 then _whenNotPaused()
15961591 else false)
15971592 then _validateIntEquals(size(i.payments), 1, "withdrawAll: invalid payments size")
15981593 else false)
15991594 then _validateStringEqual(lpAssetIdStr, _assetToStr(i.payments[0].assetId), "withdrawAll: invalid payment asset")
16001595 else false)
16011596 then _validateInt(i.payments[0].amount, 1, MAX_INT, "withdrawAll: invalid payment amount")
16021597 else false
16031598 if ((err == err))
16041599 then {
1605- let $t04642646513 = _withdrawAll(i.payments[0].amount)
1606- let lpTokensToBurn = $t04642646513._1
1607- let balancesToPay = $t04642646513._2
1608- let assetBalances = $t04642646513._3
1600+ let $t04748147568 = _withdrawAll(i.payments[0].amount)
1601+ let lpTokensToBurn = $t04748147568._1
1602+ let balancesToPay = $t04748147568._2
1603+ let assetBalances = $t04748147568._3
16091604 let paymentActions = _getPaymentsFromBalances(assets, balancesToPay, i.caller, lpDecimals)
16101605 let storageUpdated = $Tuple10(storage._1, storage._2, (storage._3 - lpTokensToBurn), storage._4, storage._5, storage._6, storage._7, storage._8, storage._9, storage._10)
16111606 $Tuple2(((([Burn(lpAssetId, lpTokensToBurn)] ++ paymentActions) ++ _saveStorage(storageUpdated)) ++ _saveAssetBalances(assetBalances)), unit)
16121607 }
16131608 else throw("Strict value is not equal to itself.")
16141609 }
16151610
16161611
16171612
16181613 @Callable(i)
16191614 func withdraw (assetId_,minAmount_) = {
16201615 let storage = _loadStorage()
16211616 let lpAssetId = storage._1
16221617 let lpAssetIdStr = toBase58String(lpAssetId)
16231618 let lpDecimals = _getDecimals(lpAssetIdStr)
16241619 let assets = _loadAssets()
16251620 let err = if (if (if (if (if (if (_whenInitialized())
16261621 then _whenNotPaused()
16271622 else false)
16281623 then _validateIntEquals(size(i.payments), 1, "withdraw: invalid payments size")
16291624 else false)
16301625 then _validateStringEqual(lpAssetIdStr, _assetToStr(i.payments[0].assetId), "withdraw: invalid payment asset")
16311626 else false)
16321627 then _validateInt(i.payments[0].amount, 1, MAX_INT, "withdraw: invalid payment amount")
16331628 else false)
16341629 then _validateListContains(assets, assetId_, "withdraw: invalid assetId")
16351630 else false)
16361631 then _validateInt(minAmount_, 0, MAX_INT, "withdraw: invalid minAmount")
16371632 else false
16381633 if ((err == err))
16391634 then {
1640- let $t04783947973 = _withdraw(assetId_, i.payments[0].amount)
1641- let targetAmountNormalized = $t04783947973._1
1642- let finalAssetBalances = $t04783947973._2
1643- let lpFee = $t04783947973._3
1644- let protocolFee = $t04783947973._4
1645- let sigmaFeePerLpUpdated = $t04783947973._5
1646- let finalAmountNormalized = ((targetAmountNormalized - lpFee) - protocolFee)
1635+ let $t04889449028 = _withdraw(assetId_, i.payments[0].amount)
1636+ let targetAmountNormalized = $t04889449028._1
1637+ let finalAssetBalances = $t04889449028._2
1638+ let lpFee = $t04889449028._3
1639+ let protocolFee = $t04889449028._4
1640+ let sigmaFeePerLpUpdated = $t04889449028._5
1641+ let finalAmountNormalized = ((toInt(targetAmountNormalized) - lpFee) - protocolFee)
16471642 let targetDecimals = _getDecimals(assetId_)
1648- let finalAmount = _normalizeDecimals(finalAmountNormalized, lpDecimals, targetDecimals, DOWN)
1643+ let finalAmount = toInt(_normalizeDecimals(toBigInt(finalAmountNormalized), lpDecimals, targetDecimals, DOWN))
16491644 let err1 = _validateInt(finalAmount, minAmount_, MAX_INT, "withdraw: insufficient final amount")
16501645 if ((err1 == err1))
16511646 then {
16521647 let storageUpdated = $Tuple10(storage._1, storage._2, (storage._3 - i.payments[0].amount), storage._4, storage._5, storage._6, storage._7, storage._8, storage._9, storage._10)
16531648 $Tuple2(((((([Burn(lpAssetId, i.payments[0].amount), ScriptTransfer(i.caller, finalAmount, _strToAsset(assetId_))] ++ _saveStorage(storageUpdated)) ++ _saveAssetBalances(finalAssetBalances)) ++ _saveLpFee(assetId_, (lpFee + _loadLpFee(assetId_)))) ++ _saveProtocolFee(assetId_, (protocolFee + _loadProtocolFee(assetId_)))) ++ _saveSigmaFeePerLp(sigmaFeePerLpUpdated)), unit)
16541649 }
16551650 else throw("Strict value is not equal to itself.")
16561651 }
16571652 else throw("Strict value is not equal to itself.")
16581653 }
16591654
16601655
16611656
16621657 @Callable(i)
16631658 func swap (targetAssetId_,minAmount_) = {
16641659 let storage = _loadStorage()
16651660 let lpAssetId = storage._1
16661661 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
16671662 let assets = _loadAssets()
16681663 let sourceAssetStr = _assetToStr(i.payments[0].assetId)
1669- let sourceAmountNormalized = _normalizeDecimals(i.payments[0].amount, _getDecimals(sourceAssetStr), lpDecimals, DOWN)
1664+ let sourceAmountNormalized = _normalizeDecimals(toBigInt(i.payments[0].amount), _getDecimals(sourceAssetStr), lpDecimals, DOWN)
16701665 let sourceAssetIndex = valueOrErrorMessage(indexOf(assets, sourceAssetStr), "swap: invalid source asset")
16711666 if ((sourceAssetIndex == sourceAssetIndex))
16721667 then {
16731668 let targetAssetIndex = valueOrErrorMessage(indexOf(assets, targetAssetId_), "swap: invalid target asset")
16741669 if ((targetAssetIndex == targetAssetIndex))
16751670 then {
16761671 let err = if (if (if (if (if (_whenInitialized())
16771672 then _whenNotPaused()
16781673 else false)
16791674 then _validateInt(minAmount_, 0, MAX_INT, "swap: invalid min target amount")
16801675 else false)
1681- then _validateInt(sourceAmountNormalized, 1, MAX_INT, "swap: invalid source amount")
1676+ then _validateInt(toInt(sourceAmountNormalized), 1, MAX_INT, "swap: invalid source amount")
16821677 else false)
16831678 then _validateStringNotEq(sourceAssetStr, targetAssetId_, "swap: same assets")
16841679 else false)
16851680 then _validateIntEquals(size(i.payments), 1, "swap: invalid payments size")
16861681 else false
16871682 if ((err == err))
16881683 then {
1689- let $t05007050228 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
1690- let targetAmountNormalized = $t05007050228._1
1691- let finalAssetBalances = $t05007050228._2
1692- let lpFee = $t05007050228._3
1693- let protocolFee = $t05007050228._4
1694- let sigmaFeePerLpUpdated = $t05007050228._5
1695- let finalAmountNormalized = ((targetAmountNormalized - lpFee) - protocolFee)
1684+ let $t05120551363 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
1685+ let targetAmountNormalized = $t05120551363._1
1686+ let finalAssetBalances = $t05120551363._2
1687+ let lpFee = $t05120551363._3
1688+ let protocolFee = $t05120551363._4
1689+ let sigmaFeePerLpUpdated = $t05120551363._5
1690+ let finalAmountNormalized = ((toInt(targetAmountNormalized) - lpFee) - protocolFee)
16961691 let targetDecimals = _getDecimals(targetAssetId_)
1697- let finalAmount = _normalizeDecimals(finalAmountNormalized, lpDecimals, targetDecimals, DOWN)
1692+ let finalAmount = toInt(_normalizeDecimals(toBigInt(finalAmountNormalized), lpDecimals, targetDecimals, DOWN))
16981693 let err1 = _validateInt(finalAmount, minAmount_, MAX_INT, "swap: insufficient final amount")
16991694 if ((err1 == err1))
17001695 then $Tuple2((((([ScriptTransfer(i.caller, finalAmount, _strToAsset(targetAssetId_))] ++ _saveAssetBalances(finalAssetBalances)) ++ _saveLpFee(targetAssetId_, (lpFee + _loadLpFee(targetAssetId_)))) ++ _saveProtocolFee(targetAssetId_, (protocolFee + _loadProtocolFee(targetAssetId_)))) ++ _saveSigmaFeePerLp(sigmaFeePerLpUpdated)), unit)
17011696 else throw("Strict value is not equal to itself.")
17021697 }
17031698 else throw("Strict value is not equal to itself.")
17041699 }
17051700 else throw("Strict value is not equal to itself.")
17061701 }
17071702 else throw("Strict value is not equal to itself.")
17081703 }
17091704
17101705
17111706
17121707 @Callable(i)
17131708 func getDepositAll (lpAmount_) = {
17141709 let err = _validateInt(lpAmount_, 1, MAX_INT, "getDepositAll: invalid amount")
17151710 if ((err == err))
17161711 then {
1717- let $t05136051447 = _depositAll(lpAmount_)
1718- let lpTokensToMint = $t05136051447._1
1719- let requiredAmountsNormalized = $t05136051447._2
1720- let assetBalances = $t05136051447._3
1712+ let $t05252252609 = _depositAll(lpAmount_)
1713+ let lpTokensToMint = $t05252252609._1
1714+ let requiredAmountsNormalized = $t05252252609._2
1715+ let assetBalances = $t05252252609._3
17211716 $Tuple2(nil, $Tuple2(lpTokensToMint, requiredAmountsNormalized))
17221717 }
17231718 else throw("Strict value is not equal to itself.")
17241719 }
17251720
17261721
17271722
17281723 @Callable(i)
17291724 func getDeposit (assetId_,amount_) = {
17301725 let err = if (_validateListContains(_loadAssets(), assetId_, "getDeposit: invalid asset"))
17311726 then _validateInt(amount_, 1, MAX_INT, "getDeposit: invalid amount")
17321727 else false
17331728 if ((err == err))
17341729 then {
17351730 let storage = _loadStorage()
17361731 let lpAssetId = storage._1
17371732 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
17381733 let assetDecimals = _getDecimals(assetId_)
1739- let amountNormalized = _normalizeDecimals(amount_, assetDecimals, lpDecimals, DOWN)
1740- let $t05220652280 = _deposit(assetId_, amountNormalized)
1741- let lpTokensToMint = $t05220652280._1
1742- let assetBalances = $t05220652280._2
1734+ let amountNormalized = _normalizeDecimals(toBigInt(amount_), assetDecimals, lpDecimals, DOWN)
1735+ let $t05337953453 = _deposit(assetId_, amountNormalized)
1736+ let lpTokensToMint = $t05337953453._1
1737+ let assetBalances = $t05337953453._2
17431738 $Tuple2(nil, lpTokensToMint)
17441739 }
17451740 else throw("Strict value is not equal to itself.")
17461741 }
17471742
17481743
17491744
17501745 @Callable(i)
17511746 func getWithdrawAll (lpAmount_) = {
17521747 let err = _validateInt(lpAmount_, 0, MAX_INT, "getWithdrawAll: invalid amount")
17531748 if ((err == err))
17541749 then {
1755- let $t05265752733 = _withdrawAll(lpAmount_)
1756- let lpTokensToBurn = $t05265752733._1
1757- let balancesToGet = $t05265752733._2
1758- let assetBalances = $t05265752733._3
1750+ let $t05383053906 = _withdrawAll(lpAmount_)
1751+ let lpTokensToBurn = $t05383053906._1
1752+ let balancesToGet = $t05383053906._2
1753+ let assetBalances = $t05383053906._3
17591754 $Tuple2(nil, balancesToGet)
17601755 }
17611756 else throw("Strict value is not equal to itself.")
17621757 }
17631758
17641759
17651760
17661761 @Callable(i)
17671762 func getWithdraw (assetId_,amount_) = {
17681763 let err = if (_validateListContains(_loadAssets(), assetId_, "getWithdraw: invalid asset"))
17691764 then _validateInt(amount_, 1, MAX_INT, "getWithdraw: invalid amount")
17701765 else false
17711766 if ((err == err))
17721767 then {
17731768 let storage = _loadStorage()
17741769 let lpAssetId = storage._1
17751770 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
1776- let $t05338453500 = _withdraw(assetId_, amount_)
1777- let targetAmountNormalized = $t05338453500._1
1778- let assetBalances = $t05338453500._2
1779- let lpFee = $t05338453500._3
1780- let protocolFee = $t05338453500._4
1781- let sigmaFeePerLpUpdated = $t05338453500._5
1782- let finalAmountNormalized = ((targetAmountNormalized - lpFee) - protocolFee)
1771+ let $t05455754673 = _withdraw(assetId_, amount_)
1772+ let targetAmountNormalized = $t05455754673._1
1773+ let assetBalances = $t05455754673._2
1774+ let lpFee = $t05455754673._3
1775+ let protocolFee = $t05455754673._4
1776+ let sigmaFeePerLpUpdated = $t05455754673._5
1777+ let finalAmountNormalized = ((toInt(targetAmountNormalized) - lpFee) - protocolFee)
17831778 let targetDecimals = _getDecimals(assetId_)
1784- let finalAmount = _normalizeDecimals(finalAmountNormalized, lpDecimals, targetDecimals, DOWN)
1779+ let finalAmount = _normalizeDecimals(toBigInt(finalAmountNormalized), lpDecimals, targetDecimals, DOWN)
17851780 $Tuple2(nil, finalAmount)
17861781 }
17871782 else throw("Strict value is not equal to itself.")
17881783 }
17891784
17901785
17911786
17921787 @Callable(i)
17931788 func getSwap (sourceAssetId_,targetAssetId_,sourceAmount_) = {
17941789 let storage = _loadStorage()
17951790 let lpAssetId = storage._1
17961791 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
17971792 let assets = _loadAssets()
17981793 let sourceAssetIndex = valueOrErrorMessage(indexOf(assets, sourceAssetId_), "swap: invalid source asset")
17991794 if ((sourceAssetIndex == sourceAssetIndex))
18001795 then {
18011796 let targetAssetIndex = valueOrErrorMessage(indexOf(assets, targetAssetId_), "swap: invalid target asset")
18021797 if ((targetAssetIndex == targetAssetIndex))
18031798 then {
1804- let sourceAmountNormalized = _normalizeDecimals(sourceAmount_, _getDecimals(sourceAssetId_), lpDecimals, DOWN)
1805- let err = if (_validateInt(sourceAmountNormalized, 1, MAX_INT, "swap: invalid source amount"))
1799+ let sourceAmountNormalized = _normalizeDecimals(toBigInt(sourceAmount_), _getDecimals(sourceAssetId_), lpDecimals, DOWN)
1800+ let err = if (_validateInt(toInt(sourceAmountNormalized), 1, MAX_INT, "swap: invalid source amount"))
18061801 then _validateStringNotEq(sourceAssetId_, targetAssetId_, "swap: same assets")
18071802 else false
18081803 if ((err == err))
18091804 then {
1810- let $t05491455072 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
1811- let targetAmountNormalized = $t05491455072._1
1812- let finalAssetBalances = $t05491455072._2
1813- let lpFee = $t05491455072._3
1814- let protocolFee = $t05491455072._4
1815- let sigmaFeePerLpUpdated = $t05491455072._5
1816- let finalAmountNormalized = ((targetAmountNormalized - lpFee) - protocolFee)
1805+ let $t05612556283 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
1806+ let targetAmountNormalized = $t05612556283._1
1807+ let finalAssetBalances = $t05612556283._2
1808+ let lpFee = $t05612556283._3
1809+ let protocolFee = $t05612556283._4
1810+ let sigmaFeePerLpUpdated = $t05612556283._5
1811+ let finalAmountNormalized = ((toInt(targetAmountNormalized) - lpFee) - protocolFee)
18171812 let targetDecimals = _getDecimals(targetAssetId_)
1818- let finalAmount = _normalizeDecimals(finalAmountNormalized, lpDecimals, targetDecimals, DOWN)
1813+ let finalAmount = _normalizeDecimals(toBigInt(finalAmountNormalized), lpDecimals, targetDecimals, DOWN)
18191814 $Tuple2(nil, finalAmount)
18201815 }
18211816 else throw("Strict value is not equal to itself.")
18221817 }
18231818 else throw("Strict value is not equal to itself.")
18241819 }
18251820 else throw("Strict value is not equal to itself.")
18261821 }
18271822
18281823
18291824
18301825 @Callable(i)
18311826 func getClaim (user_) = {
18321827 let user = if ((size(user_) > 0))
18331828 then valueOrErrorMessage(addressFromString(user_), "getClaim: invalid user")
18341829 else i.caller
1835- let $t05571455770 = _checkpoint(user)
1836- let checkpointActions = $t05571455770._1
1837- let userProfits = $t05571455770._2
1830+ let $t05694457000 = _checkpoint(user)
1831+ let checkpointActions = $t05694457000._1
1832+ let userProfits = $t05694457000._2
18381833 $Tuple2(nil, userProfits)
18391834 }
18401835
18411836
18421837
18431838 @Callable(i)
18441839 func getUtilFunc () = {
18451840 let storage = _loadStorage()
18461841 let lpTotalSupply = storage._3
18471842 let weightAmplifier = storage._7
18481843 let slippageRate = storage._8
18491844 let feeMaxRate = storage._9
1850- let $t05610356163 = _loadAssetBalances()
1851- let assetBalances = $t05610356163._1
1852- let assetTotalSupply = $t05610356163._2
1853- let $t05616856221 = _loadAssetWeights()
1854- let assetWeights = $t05616856221._1
1855- let sigmaWeight = $t05616856221._2
1845+ let $t05733357393 = _loadAssetBalances()
1846+ let assetBalances = $t05733357393._1
1847+ let assetTotalSupply = $t05733357393._2
1848+ let $t05739857451 = _loadAssetWeights()
1849+ let assetWeights = $t05739857451._1
1850+ let sigmaWeight = $t05739857451._2
18561851 let fee = _calculateFee(assetBalances, assetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
18571852 let utilValue = (assetTotalSupply - fee)
18581853 $Tuple2(nil, $Tuple2(utilValue, lpTotalSupply))
18591854 }
18601855
18611856
18621857
18631858 @Callable(i)
18641859 func checkpoint (user_) = {
18651860 let err = if (_whenInitialized())
18661861 then _whenNotPaused()
18671862 else false
18681863 if ((err == err))
18691864 then {
18701865 let user = if ((size(user_) > 0))
18711866 then valueOrErrorMessage(addressFromString(user_), "checkpoint: invalid user")
18721867 else i.caller
18731868 _checkpoint(user)
18741869 }
18751870 else throw("Strict value is not equal to itself.")
18761871 }
18771872
18781873
18791874
18801875 @Callable(i)
18811876 func stake () = {
18821877 let err = if (_whenInitialized())
18831878 then _whenNotPaused()
18841879 else false
18851880 if ((err == err))
18861881 then {
18871882 let storage = _loadStorage()
18881883 let lpAssetIdStr = _assetToStr(storage._1)
18891884 let err1 = if (if (_validateIntEquals(size(i.payments), 1, "stake: invalid payments size"))
18901885 then _validateStringEqual(lpAssetIdStr, _assetToStr(i.payments[0].assetId), "stake: invalid payment asset")
18911886 else false)
18921887 then _validateInt(i.payments[0].amount, 0, MAX_INT, "stake: invalid payment amount")
18931888 else false
18941889 if ((err1 == err1))
18951890 then {
1896- let $t05729457354 = _checkpoint(i.caller)
1897- let checkpointActions = $t05729457354._1
1898- let userProfits = $t05729457354._2
1891+ let $t05852458584 = _checkpoint(i.caller)
1892+ let checkpointActions = $t05852458584._1
1893+ let userProfits = $t05852458584._2
18991894 $Tuple2(((checkpointActions ++ _saveUserLp(i.caller, (_loadUserLp(i.caller) + i.payments[0].amount))) ++ _saveTotalLp((_loadTotalLp() + i.payments[0].amount))), unit)
19001895 }
19011896 else throw("Strict value is not equal to itself.")
19021897 }
19031898 else throw("Strict value is not equal to itself.")
19041899 }
19051900
19061901
19071902
19081903 @Callable(i)
19091904 func unstake (amount_) = {
19101905 let err = if (_whenInitialized())
19111906 then _whenNotPaused()
19121907 else false
19131908 if ((err == err))
19141909 then {
19151910 let storage = _loadStorage()
19161911 let lpAssetId = storage._1
19171912 let userLp = _loadUserLp(i.caller)
19181913 let err1 = _validateInt(amount_, 0, userLp, "unstake: invalid amount")
19191914 if ((err1 == err1))
19201915 then {
1921- let $t05786557925 = _checkpoint(i.caller)
1922- let checkpointActions = $t05786557925._1
1923- let userProfits = $t05786557925._2
1916+ let $t05909559155 = _checkpoint(i.caller)
1917+ let checkpointActions = $t05909559155._1
1918+ let userProfits = $t05909559155._2
19241919 $Tuple2(((([ScriptTransfer(i.caller, amount_, lpAssetId)] ++ checkpointActions) ++ _saveUserLp(i.caller, (userLp - amount_))) ++ _saveTotalLp((_loadTotalLp() - amount_))), unit)
19251920 }
19261921 else throw("Strict value is not equal to itself.")
19271922 }
19281923 else throw("Strict value is not equal to itself.")
19291924 }
19301925
19311926
19321927
19331928 @Callable(i)
19341929 func claim (user_) = {
19351930 let err = if (_whenInitialized())
19361931 then _whenNotPaused()
19371932 else false
19381933 if ((err == err))
19391934 then {
19401935 let user = if ((size(user_) > 0))
19411936 then valueOrErrorMessage(addressFromString(user_), "claim: invalid user")
19421937 else i.caller
19431938 let storage = _loadStorage()
19441939 let lpAssetId = storage._1
19451940 let lpAssetIdStr = _assetToStr(lpAssetId)
19461941 let assets = [lpAssetIdStr, _loadAssets()]
19471942 let maxIndex = (size(assets) - 1)
19481943 let userLp = _loadUserLp(user)
1949- let $t05864858704 = _checkpoint(user)
1950- let checkpointActions = $t05864858704._1
1951- let userProfits = $t05864858704._2
1944+ let $t05987859934 = _checkpoint(user)
1945+ let checkpointActions = $t05987859934._1
1946+ let userProfits = $t05987859934._2
19521947 func foldFunc (acc,profit) = {
19531948 let index = acc._1
19541949 if (if ((maxIndex >= index))
19551950 then (profit > 0)
19561951 else false)
19571952 then {
19581953 let asset = assets[index]
19591954 $Tuple3((index + 1), (acc._2 :+ 0), (acc._3 :+ ScriptTransfer(user, profit, _strToAsset(asset))))
19601955 }
19611956 else $Tuple3((index + 1), (acc._2 :+ profit), acc._3)
19621957 }
19631958
1964- let $t05908259173 = {
1959+ let $t06031260403 = {
19651960 let $l = userProfits
19661961 let $s = size($l)
19671962 let $acc0 = $Tuple3(0, nil, nil)
19681963 func $f0_1 ($a,$i) = if (($i >= $s))
19691964 then $a
19701965 else foldFunc($a, $l[$i])
19711966
19721967 func $f0_2 ($a,$i) = if (($i >= $s))
19731968 then $a
19741969 else throw("List size exceeds 11")
19751970
19761971 $f0_2($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)
19771972 }
1978- let idx = $t05908259173._1
1979- let userProfitsUpdated = $t05908259173._2
1980- let profitActions = $t05908259173._3
1973+ let idx = $t06031260403._1
1974+ let userProfitsUpdated = $t06031260403._2
1975+ let profitActions = $t06031260403._3
19811976 $Tuple2(((profitActions ++ removeByIndex(checkpointActions, 0)) ++ _saveUserProfits(user, userProfitsUpdated)), unit)
19821977 }
19831978 else throw("Strict value is not equal to itself.")
19841979 }
19851980
19861981
19871982
19881983 @Callable(i)
19891984 func pause () = {
19901985 let err = if (if (_onlyPauser(i.caller))
19911986 then _whenInitialized()
19921987 else false)
19931988 then _whenNotPaused()
19941989 else false
19951990 if ((err == err))
19961991 then $Tuple2(_savePause(true), unit)
19971992 else throw("Strict value is not equal to itself.")
19981993 }
19991994
20001995
20011996
20021997 @Callable(i)
20031998 func unpause () = {
20041999 let err = if (if (_onlyPauser(i.caller))
20052000 then _whenInitialized()
20062001 else false)
20072002 then _whenPaused()
20082003 else false
20092004 if ((err == err))
20102005 then $Tuple2(_savePause(false), unit)
20112006 else throw("Strict value is not equal to itself.")
20122007 }
20132008
20142009
20152010
20162011 @Callable(i)
20172012 func updatePauser (pauser_) = {
20182013 let err = if (if (_onlyThisContract(i.caller))
20192014 then _whenInitialized()
20202015 else false)
20212016 then _validateAddress(pauser_, "updatePauser: invalid pauser")
20222017 else false
20232018 if ((err == err))
20242019 then $Tuple2(_savePauser(addressFromStringValue(pauser_)), unit)
20252020 else throw("Strict value is not equal to itself.")
20262021 }
20272022
20282023
20292024
20302025 @Callable(i)
20312026 func setMultisig (multisig_) = {
20322027 let err = if (_onlyThisContract(i.caller))
20332028 then _validateAddress(multisig_, "setMultisig: invalid multisig")
20342029 else false
20352030 if ((err == err))
20362031 then $Tuple2(_saveMultisig(addressFromStringValue(multisig_)), unit)
20372032 else throw("Strict value is not equal to itself.")
20382033 }
20392034
20402035
20412036 @Verifier(tx)
20422037 func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
20432038

github/deemru/w8io/3ef1775 
255.65 ms