tx · 6WeEKVowuyDaFYfiG3ZrwJvL2fWDZ6fPDfxVZ6XMbjAt

3PQtT2o7g8HmcZLGodx4L7YDe7ngb26wjYk:  -0.06200000 Waves

2023.08.09 20:58 [3769004] smart account 3PQtT2o7g8HmcZLGodx4L7YDe7ngb26wjYk > SELF 0.00000000 Waves

{ "type": 13, "id": "6WeEKVowuyDaFYfiG3ZrwJvL2fWDZ6fPDfxVZ6XMbjAt", "fee": 6200000, "feeAssetId": null, "timestamp": 1691603940099, "version": 2, "chainId": 87, "sender": "3PQtT2o7g8HmcZLGodx4L7YDe7ngb26wjYk", "senderPublicKey": "DGuDyEBiewoZje46attYBabwJWnk7PPwtLi6yBjzctPV", "proofs": [ "KwmoP37gGkqRcQsB62rY5SY6BKspdBetaTX8R9CTdsmBYnogrQv7zjdAB8wyLBPYvxcVJWSCj2HSvofnyg5ycpV" ], "script": "base64:BgJxCAISEAoOGBgBAQgIAQEBAQEIAQgSAwoBARIDCgEBEgASBAoCCAESBAoCCAESAwoBARIECgIIARIDCgEBEgQKAggBEgUKAwgIARIDCgEIEgASABIDCgEIEgASAwoBARIDCgEIEgASABIDCgEIEgMKAQhzAANTRVACAl9fAAVXQVZFUwIFd2F2ZXMAB01BWF9JTlQA//////////9/AAdNQVhfRkVFAMCEPQANTUFYX0FNUExJRklFUgDAhD0AFE1BWF9XRUlHSFRfQU1QTElGSUVSAMCEPQAKTUFYX1dFSUdIVADAhD0AFFNMSVBQQUdFX1JBVEVfRkFDVE9SAMCEPQAPRkVFX1JBVEVfRkFDVE9SAMCEPQALUkFURV9GQUNUT1IAwIQ9AA5QRVJDRU5UX0ZBQ1RPUgkAtgIBAICAkLu61q3wDQAQWkVST19JTlRfTElTVF8xMAkAzAgCAAAJAMwIAgAACQDMCAIAAAkAzAgCAAAJAMwIAgAACQDMCAIAAAkAzAgCAAAJAMwIAgAACQDMCAIAAAkAzAgCAAAFA25pbAAQWkVST19JTlRfTElTVF8xMQkAzQgCBRBaRVJPX0lOVF9MSVNUXzEwAAAAC1pFUk9fQklHSU5UCQC2AgEAAAATWkVST19CSUdJTlRfTElTVF8xMQkAzAgCBQtaRVJPX0JJR0lOVAkAzAgCBQtaRVJPX0JJR0lOVAkAzAgCBQtaRVJPX0JJR0lOVAkAzAgCBQtaRVJPX0JJR0lOVAkAzAgCBQtaRVJPX0JJR0lOVAkAzAgCBQtaRVJPX0JJR0lOVAkAzAgCBQtaRVJPX0JJR0lOVAkAzAgCBQtaRVJPX0JJR0lOVAkAzAgCBQtaRVJPX0JJR0lOVAkAzAgCBQtaRVJPX0JJR0lOVAkAzAgCBQtaRVJPX0JJR0lOVAUDbmlsAAxJTlRfREVDSU1BTFMACAAPQklHSU5UX0RFQ0lNQUxTABIAB0xJU1RfNjQJAL0JAgJ/MF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMAIBXwAMS0VZX01VTFRJU0lHAghNVUxUSVNJRwAKS0VZX1NUQVRVUwIGU1RBVFVTAApLRVlfUEFVU0VEAgZQQVVTRUQACktFWV9QQVVTRVICBlBBVVNFUgALS0VZX1NUT1JBR0UCB1NUT1JBR0UACktFWV9BU1NFVFMCBkFTU0VUUwASS0VZX0FTU0VUX0JBTEFOQ0VTAg5BU1NFVF9CQUxBTkNFUwARS0VZX0FTU0VUX1dFSUdIVFMCDUFTU0VUX1dFSUdIVFMACktFWV9MUF9GRUUCBkxQX0ZFRQAQS0VZX1BST1RPQ09MX0ZFRQIMUFJPVE9DT0xfRkVFAA1LRVlfUFJFQ0lTSU9OAglQUkVDSVNJT04AFEtFWV9TSUdNQV9GRUVfUEVSX0xQAhBTSUdNQV9GRUVfUEVSX0xQABlLRVlfVVNFUl9TSUdNQV9GRUVfUEVSX0xQAhVVU0VSX1NJR01BX0ZFRV9QRVJfTFAAC0tFWV9VU0VSX0xQAgdVU0VSX0xQAAxLRVlfVE9UQUxfTFACCFRPVEFMX0xQABBLRVlfVVNFUl9QUk9GSVRTAgxVU0VSX1BST0ZJVFMBEF92YWxpZGF0ZUFkZHJlc3MCCGFkZHJlc3NfBGVycl8EByRtYXRjaDAJAKYIAQUIYWRkcmVzc18DCQABAgUHJG1hdGNoMAIHQWRkcmVzcwQBYQUHJG1hdGNoMAYJAAIBBQRlcnJfAQ5fdmFsaWRhdGVBc3NldAIIYXNzZXRJZF8EZXJyXwMJAAACBQhhc3NldElkXwUFV0FWRVMGBAckbWF0Y2gwCQDsBwEJANkEAQUIYXNzZXRJZF8DCQABAgUHJG1hdGNoMAIFQXNzZXQEAWEFByRtYXRjaDAGCQACAQUEZXJyXwEMX3ZhbGlkYXRlSW50BAR2YWxfDmxvd2VyQm91bmRhcnlfDnVwcGVyQm91bmRhcnlfBGVycl8DAwkAZgIFDmxvd2VyQm91bmRhcnlfBQR2YWxfBgkAZgIFBHZhbF8FDnVwcGVyQm91bmRhcnlfCQACAQUEZXJyXwYBDV92YWxpZGF0ZUJvb2wDBHZhbF8HdGFyZ2V0XwRlcnJfAwkBAiE9AgUEdmFsXwUHdGFyZ2V0XwkAAgEFBGVycl8GARRfdmFsaWRhdGVTdHJpbmdFcXVhbAMFdmFsMV8FdmFsMl8EZXJyXwMJAQIhPQIFBXZhbDFfBQV2YWwyXwkAAgEFBGVycl8GARRfdmFsaWRhdGVTdHJpbmdOb3RFcQMFdmFsMV8FdmFsMl8EZXJyXwMJAAACBQV2YWwxXwUFdmFsMl8JAAIBBQRlcnJfBgEQX3ZhbGlkYXRlSW50TGlzdAQEdmFsXw5sb3dlckJvdW5kYXJ5Xw51cHBlckJvdW5kYXJ5XwRlcnJfCgEIZm9sZEZ1bmMCA2FjYwRlbGVtBAckbWF0Y2gwCQC2CQEFBGVsZW0DCQABAgUHJG1hdGNoMAIDSW50BAFhBQckbWF0Y2gwAwUDYWNjCQEMX3ZhbGlkYXRlSW50BAUBYQUObG93ZXJCb3VuZGFyeV8FDnVwcGVyQm91bmRhcnlfBQRlcnJfBwkAAgEFBGVycl8KAAIkbAUEdmFsXwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAGCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQhmb2xkRnVuYwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgEPX3ZhbGlkYXRlQXNzZXRzAgdhc3NldHNfBGVycl8KAQhmb2xkRnVuYwIDYWNjBGVsZW0DBQNhY2MJAQ5fdmFsaWRhdGVBc3NldAIFBGVsZW0FBGVycl8HCgACJGwFB2Fzc2V0c18KAAIkcwkAkAMBBQIkbAoABSRhY2MwBgoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEIZm9sZEZ1bmMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoBEl92YWxpZGF0ZUludEVxdWFscwMFdmFsMV8FdmFsMl8EZXJyXwMJAQIhPQIFBXZhbDFfBQV2YWwyXwkAAgEFBGVycl8GARJfdmFsaWRhdGVUb2tlbk5hbWUCBHZhbF8EZXJyXwMDCQBmAgAECQCxAgEFBHZhbF8GCQBmAgkAsQIBBQR2YWxfABAJAAIBBQRlcnJfBgETX3ZhbGlkYXRlVG9rZW5EZXNjcgIEdmFsXwRlcnJfAwkAZgIJALECAQUEdmFsXwDoBwkAAgEFBGVycl8GARFfdmFsaWRhdGVEZWNpbWFscwIEdmFsXwRlcnJfAwMJAGYCAAAFBHZhbF8GCQBmAgUEdmFsXwAICQACAQUEZXJyXwYBEF92YWxpZGF0ZVBheW1lbnQECHBheW1lbnRfCGFzc2V0SWRfD3JlcXVpcmVkQW1vdW50XwRlcnJfBAckbWF0Y2gwCAUIcGF5bWVudF8HYXNzZXRJZAMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAFhBQckbWF0Y2gwAwkBAiE9AgUIYXNzZXRJZF8JANgEAQUBYQkAAgEJAKwCAgUEZXJyXwIHOiBhc3NldAMJAGYCBQ9yZXF1aXJlZEFtb3VudF8IBQhwYXltZW50XwZhbW91bnQJAAIBCQCsAgIFBGVycl8CCDogYW1vdW50BgkAAgEJAKwCAgUEZXJyXwIHOiBhc3NldAEVX3ZhbGlkYXRlTGlzdENvbnRhaW5zAwVsaXN0XwR2YWxfBGVycl8DCQEBIQEJAQ9jb250YWluc0VsZW1lbnQCBQVsaXN0XwUEdmFsXwkAAgEFBGVycl8GAQtfYXNzZXRUb1N0cgEGYXNzZXRfBAckbWF0Y2gwBQZhc3NldF8DCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQBYQUHJG1hdGNoMAkA2AQBBQFhBQVXQVZFUwELX3N0clRvQXNzZXQBBmFzc2V0XwMDCQAAAgUGYXNzZXRfBQVXQVZFUwYJAAACBQZhc3NldF8CAAUEdW5pdAkA2QQBBQZhc3NldF8BCl9sb2FkUGF1c2UABAckbWF0Y2gwCQCgCAEFCktFWV9QQVVTRUQDCQABAgUHJG1hdGNoMAIHQm9vbGVhbgQBYQUHJG1hdGNoMAUBYQcBCl9zYXZlUGF1c2UBCWlzUGF1c2VkXwkAzAgCCQEMQm9vbGVhbkVudHJ5AgUKS0VZX1BBVVNFRAUJaXNQYXVzZWRfBQNuaWwBC19sb2FkUGF1c2VyAAQHJG1hdGNoMAkAoggBBQpLRVlfUEFVU0VSAwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAkBEUBleHRyTmF0aXZlKDEwNjIpAQUBYQkBB0FkZHJlc3MBAQABC19zYXZlUGF1c2VyAQdwYXVzZXJfCQDMCAIJAQtTdHJpbmdFbnRyeQIFCktFWV9QQVVTRVIJAKUIAQUHcGF1c2VyXwUDbmlsAQ1fbG9hZE11bHRpc2lnAAQHJG1hdGNoMAkAoggBBQxLRVlfTVVMVElTSUcDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwCQERQGV4dHJOYXRpdmUoMTA2MikBBQFhCQEHQWRkcmVzcwEBAAENX3NhdmVNdWx0aXNpZwEJbXVsdGlzaWdfCQDMCAIJAQtTdHJpbmdFbnRyeQIFDEtFWV9NVUxUSVNJRwkApQgBBQltdWx0aXNpZ18FA25pbAEMX2xvYWRTdG9yYWdlAAQHJG1hdGNoMAkAoggBBQtLRVlfU1RPUkFHRQMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDAEBnN0cnVjdAkAtQkCBQFhBQNTRVAJAJwKCgkA2QQBCQCRAwIFBnN0cnVjdAAACQAAAgkAkQMCBQZzdHJ1Y3QAAQIBMQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBnN0cnVjdAACCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUGc3RydWN0AAMJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQZzdHJ1Y3QABAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBnN0cnVjdAAFCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUGc3RydWN0AAYJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQZzdHJ1Y3QABwkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBnN0cnVjdAAICQERQGV4dHJOYXRpdmUoMTA2MikBCQCRAwIFBnN0cnVjdAAJCQCcCgoBAAcAAAAAAAAAAAAAAAAAAAkBB0FkZHJlc3MBAQABDF9zYXZlU3RvcmFnZQEIc3RvcmFnZV8JAMwIAgkBC1N0cmluZ0VudHJ5AgULS0VZX1NUT1JBR0UJALkJAgkAzAgCCQDYBAEIBQhzdG9yYWdlXwJfMQkAzAgCAwgFCHN0b3JhZ2VfAl8yAgExAgEwCQDMCAIJAKQDAQgFCHN0b3JhZ2VfAl8zCQDMCAIJAKQDAQgFCHN0b3JhZ2VfAl80CQDMCAIJAKQDAQgFCHN0b3JhZ2VfAl81CQDMCAIJAKQDAQgFCHN0b3JhZ2VfAl82CQDMCAIJAKQDAQgFCHN0b3JhZ2VfAl83CQDMCAIJAKQDAQgFCHN0b3JhZ2VfAl84CQDMCAIJAKQDAQgFCHN0b3JhZ2VfAl85CQDMCAIJAKUIAQgFCHN0b3JhZ2VfA18xMAUDbmlsBQNTRVAFA25pbAELX2xvYWRBc3NldHMABAckbWF0Y2gwCQCiCAEFCktFWV9BU1NFVFMDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwAwkAZgIJALECAQUBYQAACQC9CQIFAWEFA1NFUAUDbmlsBQNuaWwBC19zYXZlQXNzZXRzAQdhc3NldHNfCQDMCAIJAQtTdHJpbmdFbnRyeQIFCktFWV9BU1NFVFMJALsJAgUHYXNzZXRzXwUDU0VQBQNuaWwBEl9sb2FkQXNzZXRCYWxhbmNlcwAKAQhmb2xkRnVuYwIDYWNjBGVsZW0EB2JhbGFuY2UJAQ1wYXJzZUludFZhbHVlAQUEZWxlbQkAlAoCCQDNCAIIBQNhY2MCXzEFB2JhbGFuY2UJAGQCCAUDYWNjAl8yBQdiYWxhbmNlBAckbWF0Y2gwCQCiCAEFEktFWV9BU1NFVF9CQUxBTkNFUwMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDADCQBmAgkAsQIBBQFhAAAKAAIkbAkAvQkCBQFhBQNTRVAKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIFA25pbAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQhmb2xkRnVuYwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2Vl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JGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwUDU0VQBQNuaWwBEV9vbmx5VGhpc0NvbnRyYWN0AQdjYWxsZXJfAwkBAiE9AgUHY2FsbGVyXwUEdGhpcwkAAgECGV9vbmx5VGhpc0NvbnRyYWN0OiByZXZlcnQGARBfd2hlbk11bHRpc2lnU2V0AAMJAAACCQENX2xvYWRNdWx0aXNpZwAJAQdBZGRyZXNzAQEACQACAQIYX3doZW5NdWx0aXNpZ1NldDogcmV2ZXJ0BgETX3doZW5Ob3RJbml0aWFsaXplZAAEB3N0b3JhZ2UJAQxfbG9hZFN0b3JhZ2UAAwkBAiE9AggFB3N0b3JhZ2UCXzEBAAkAAgECG193aGVuTm90SW5pdGlhbGl6ZWQ6IHJldmVydAYBEF93aGVuSW5pdGlhbGl6ZWQABAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAMJAAACCAUHc3RvcmFnZQJfMQEACQACAQIYX3doZW5Jbml0aWFsaXplZDogcmV2ZXJ0BgEOX3doZW5Ob3RQYXVzZWQAAwkBCl9sb2FkUGF1c2UACQACAQIWX3doZW5Ob3RQYXVzZWQ6IHJldmVydAYBC193aGVuUGF1c2VkAAMJAQEhAQkBCl9sb2FkUGF1c2UACQACAQITX3doZW5QYXVzZWQ6IHJldmVydAYBC19vbmx5UGF1c2VyAQdjYWxsZXJfAwkBAiE9AgUHY2FsbGVyXwkBC19sb2FkUGF1c2VyAAkAAgECE19vbmx5UGF1c2VyOiByZXZlcnQGAQxfZ2V0RGVjaW1hbHMBCGFzc2V0SWRfBAckbWF0Y2gwCQDsBwEJANkEAQUIYXNzZXRJZF8DCQABAgUHJG1hdGNoMAIFQXNzZXQEAWEFByRtYXRjaDAIBQFhCGRlY2ltYWxzCQACAQkArAICAhdfZ2V0RGVjaW1hbHM6IG5vIGFzc2V0PQUIYXNzZXRJZF8BEl9ub3JtYWxpemVEZWNpbWFscwQHYW1vdW50Xw9zb3VyY2VEZWNpbWFsc18PdGFyZ2V0RGVjaW1hbHNfBnJvdW5kXwMJAGcCBQ9zb3VyY2VEZWNpbWFsc18FD3RhcmdldERlY2ltYWxzXwkAbgQFB2Ftb3VudF8AAQkAbAYACgAACQBlAgUPc291cmNlRGVjaW1hbHNfBQ90YXJnZXREZWNpbWFsc18AAAAABQRET1dOBQZyb3VuZF8JAGgCBQdhbW91bnRfCQBsBgAKAAAJAGUCBQ90YXJnZXREZWNpbWFsc18FD3NvdXJjZURlY2ltYWxzXwAAAAAFBERPV04BFV9wcmVwYXJlQXNzZXRCYWxhbmNlcwEHYXNzZXRzXwoBCGZvbGRGdW5jAgNhY2MEZWxlbQkAzQgCBQNhY2MAAAoAAiRsBQdhc3NldHNfCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQhmb2xkRnVuYwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgEUX3ByZXBhcmVBc3NldFdlaWdodHMBDWFzc2V0V2VpZ2h0c18KAQhmb2xkRnVuYwIDYWNjBGVsZW0EBndlaWdodAkBDXBhcnNlSW50VmFsdWUBBQRlbGVtCQCUCgIJAM0IAggFA2FjYwJfMQUGd2VpZ2h0CQBkAggFA2FjYwJfMgUGd2VpZ2h0CgACJGwFDWFzc2V0V2VpZ2h0c18KAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIFA25pbAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQhmb2xkRnVuYwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgERX2dldEFzc2V0QmFsYW5jZXMCB2Fzc2V0c18JZGVjaW1hbHNfCgEIZm9sZEZ1bmMCA2FjYwRlbGVtBA1hc3NldERlY2ltYWxzCQEMX2dldERlY2ltYWxzAQUEZWxlbQQHYmFsYW5jZQkBEl9ub3JtYWxpemVEZWNpbWFscwQJAPAHAgUEdGhpcwkA2QQBBQRlbGVtBQ1hc3NldERlY2ltYWxzBQlkZWNpbWFsc18FBERPV04JAJQKAgkAzQgCCAUDYWNjAl8xBQdiYWxhbmNlCQBkAggFA2FjYwJfMgUHYmFsYW5jZQoAAiRsBQdhc3NldHNfCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCBQNuaWwAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEIZm9sZEZ1bmMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoBEF9saXN0SW50VG9TdHJpbmcBB2Fzc2V0c18KAQhmb2xkRnVuYwIDYWNjBGVsZW0JAM0IAgUDYWNjCQCkAwEFBGVsZW0JALkJAgoAAiRsBQdhc3NldHNfCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQhmb2xkRnVuYwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTEJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALBQNTRVABE19saXN0QmlnSW50VG9TdHJpbmcBB2Fzc2V0c18KAQhmb2xkRnVuYwIDYWNjBGVsZW0JAM0IAgUDYWNjCQCmAwEFBGVsZW0JALkJAgoAAiRsBQdhc3NldHNfCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQhmb2xkRnVuYwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTEJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALBQNTRVABEF9nZXRFcXVpbGlicml1bXMDDnNpZ21hQmFsYW5jZXNfCHdlaWdodHNfDHNpZ21hV2VpZ2h0XwoBCGZvbGRGdW5jAgNhY2MEZWxlbQkAzQgCBQNhY2MJAGsDBQ5zaWdtYUJhbGFuY2VzXwUEZWxlbQUMc2lnbWFXZWlnaHRfCgACJGwFCHdlaWdodHNfCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQhmb2xkRnVuYwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgEbX2luY3JlbWVudEJhbGFuY2VzQnlBbW91bnRzAgliYWxhbmNlc18IYW1vdW50c18KAQhmb2xkRnVuYwIDYWNjBGVsZW0EBWluZGV4CAUDYWNjAl8xBAZhbW91bnQJAJEDAgUIYW1vdW50c18FBWluZGV4BApuZXdCYWxhbmNlCQBkAgUEZWxlbQUGYW1vdW50CQCVCgMJAGQCBQVpbmRleAABCQDNCAIIBQNhY2MCXzIFCm5ld0JhbGFuY2UJAGQCCAUDYWNjAl8zBQpuZXdCYWxhbmNlBAZyZXN1bHQKAAIkbAUJYmFsYW5jZXNfCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlQoDAAAFA25pbAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQhmb2xkRnVuYwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgkAlAoCCAUGcmVzdWx0Al8yCAUGcmVzdWx0Al8zARxfaW5jcmVtZW50QmFsYW5jZXNCeVBheW1lbnRzBQliYWxhbmNlc18JcGF5bWVudHNfB2Fzc2V0c18JZGVjaW1hbHNfBGVycl8KAQhmb2xkRnVuYwIDYWNjBGVsZW0EBWluZGV4CAUDYWNjAl8xBAdwYXltZW50CQCRAwIFCXBheW1lbnRzXwUFaW5kZXgED3BheW1lbnRBc3NldFN0cgkBC19hc3NldFRvU3RyAQgFB3BheW1lbnQHYXNzZXRJZAQDZXJyAwkBAiE9AgUPcGF5bWVudEFzc2V0U3RyCQCRAwIFB2Fzc2V0c18FBWluZGV4CQACAQkArAICCQCsAgIFBGVycl8CCDogaW5kZXg9CQCkAwEFBWluZGV4BQR1bml0AwkAAAIFA2VycgUDZXJyBA1hc3NldERlY2ltYWxzCQEMX2dldERlY2ltYWxzAQUPcGF5bWVudEFzc2V0U3RyBApuZXdCYWxhbmNlCQBkAgUEZWxlbQkBEl9ub3JtYWxpemVEZWNp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AQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACggFBnJlc3VsdAJfMgESX2NhbGN1bGF0ZU1pY3JvRmVlBQhiYWxhbmNlXwxlcXVpbGlicml1bV8Qd2VpZ2h0QW1wbGlmaWVyXw1zbGlwcGFnZVJhdGVfC2ZlZU1heFJhdGVfAwkAZgIFDGVxdWlsaWJyaXVtXwUIYmFsYW5jZV8ECXRocmVzaG9sZAkAawMFDGVxdWlsaWJyaXVtXwkAZQIFFE1BWF9XRUlHSFRfQU1QTElGSUVSBRB3ZWlnaHRBbXBsaWZpZXJfBRRNQVhfV0VJR0hUX0FNUExJRklFUgMJAGYCBQl0aHJlc2hvbGQFCGJhbGFuY2VfBAxtYXhEZXZpYXRpb24JAGUCBQl0aHJlc2hvbGQFCGJhbGFuY2VfBAdmZWVSYXRlCQBrAwkAawMFDG1heERldmlhdGlvbgUNc2xpcHBhZ2VSYXRlXwUUU0xJUFBBR0VfUkFURV9GQUNUT1IFD0ZFRV9SQVRFX0ZBQ1RPUgUMZXF1aWxpYnJpdW1fAwkAZgIFB2ZlZVJhdGUFC2ZlZU1heFJhdGVfCQBrAwUMbWF4RGV2aWF0aW9uBQtmZWVNYXhSYXRlXwUPRkVFX1JBVEVfRkFDVE9SCQBrAwUMbWF4RGV2aWF0aW9uBQdmZWVSYXRlBQ9GRUVfUkFURV9GQUNUT1IAAAQJdGhyZXNob2xkCQBrAwUMZXF1aWxpYnJpdW1fCQBkAgUUTUFYX1dFSUdIVF9BTVBMSUZJRVIFEHdlaWdodEFtcGxpZmllcl8FFE1BWF9XRUlHSFRfQU1QTElGSUVSAwkAZgIFCGJhbGFuY2VfBQl0aHJlc2hvbGQEDG1heERldmlhdGlvbgkAZQIFCGJhbGFuY2VfBQl0aHJlc2hvbGQEB2ZlZVJhdGUJAGsDCQBrAwUMbWF4RGV2aWF0aW9uBQ1zbGlwcGFnZVJhdGVfBRRTTElQUEFHRV9SQVRFX0ZBQ1RPUgUPRkVFX1JBVEVfRkFDVE9SBQxlcXVpbGlicml1bV8DCQBmAgUHZmVlUmF0ZQULZmVlTWF4UmF0ZV8JAGsDBQxtYXhEZXZpYXRpb24FC2ZlZU1heFJhdGVfBQ9GRUVfUkFURV9GQUNUT1IJAGsDBQxtYXhEZXZpYXRpb24FB2ZlZVJhdGUFD0ZFRV9SQVRFX0ZBQ1RPUgAAAQ1fY2FsY3VsYXRlRmVlBwliYWxhbmNlc18SYXNzZXRzVG90YWxTdXBwbHlfCHdlaWdodHNfDHNpZ21hV2VpZ2h0XxB3ZWlnaHRBbXBsaWZpZXJfDXNsaXBwYWdlUmF0ZV8LZmVlTWF4UmF0ZV8KAQhmb2xkRnVuYwIDYWNjB2JhbGFuY2UEBWluZGV4CAUDYWNjAl8xBAtlcXVpbGlicml1bQkAawMFEmFzc2V0c1RvdGFsU3VwcGx5XwkAkQMCBQh3ZWlnaHRzXwUFaW5kZXgFDHNpZ21hV2VpZ2h0XwkAlAoCCQBkAgUFaW5kZXgAAQkAZAIIBQNhY2MCXzIJARJfY2FsY3VsYXRlTWljcm9GZWUFBQdiYWxhbmNlBQtlcXVpbGlicml1bQUQd2VpZ2h0QW1wbGlmaWVyXwUNc2xpcHBhZ2VSYXRlXwULZmVlTWF4UmF0ZV8EBnJlc3VsdAoAAiRsBQliYWxhbmNlc18KAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIAAAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQhmb2xkRnVuYwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACggFBnJlc3VsdAJfMgEbX3ZhbGlkYXRlTGlxdWlkaXR5SW52YXJpYW50CxJwcmV2QXNzZXRCYWxhbmNlc18VcHJldkFzc2V0VG90YWxTdXBwbHlfDmFzc2V0QmFsYW5jZXNfEWFzc2V0VG90YWxTdXBwbHlfEnByZXZMcFRvdGFsU3VwcGx5Xw5scFRvdGFsU3VwcGx5Xw1hc3NldFdlaWdodHNfDHNpZ21hV2VpZ2h0XxB3ZWlnaHRBbXBsaWZpZXJfDXNsaXBwYWdlUmF0ZV8LZmVlTWF4UmF0ZV8DAwkAAAIFEnByZXZMcFRvdGFsU3VwcGx5XwAABgkAAAIFDmxwVG90YWxTdXBwbHlfAAAGBA5wcmV2QXNzZXRzUmF0ZQkAawMJAGUCBRVwcmV2QXNzZXRUb3RhbFN1cHBseV8JAQ1fY2FsY3VsYXRlRmVlBwUScHJldkFzc2V0QmFsYW5jZXNfBRVwcmV2QXNzZXRUb3RhbFN1cHBseV8FDWFzc2V0V2VpZ2h0c18FDHNpZ21hV2VpZ2h0XwUQd2VpZ2h0QW1wbGlmaWVyXwUNc2xpcHBhZ2VSYXRlXwULZmVlTWF4UmF0ZV8FC1JBVEVfRkFDVE9SBRJwcmV2THBUb3RhbFN1cHBseV8EDW5ld0Fzc2V0c1JhdGUJAGsDCQBlAgURYXNzZXRUb3RhbFN1cHBseV8JAQ1fY2FsY3VsYXRlRmVlBwUOYXNzZXRCYWxhbmNlc18FEWFzc2V0VG90YWxTdXBwbHlfBQ1hc3NldFdlaWdodHNfBQxzaWdtYVdlaWdodF8FEHdlaWdodEFtcGxpZmllcl8FDXNsaXBwYWdlUmF0ZV8FC2ZlZU1heFJhdGVfBQtSQVRFX0ZBQ1RPUgUObHBUb3RhbFN1cHBseV8EBGRpZmYJAGUCBQ1uZXdBc3NldHNSYXRlBQ5wcmV2QXNzZXRzUmF0ZQMDCQBnAgAABQRkaWZmCQBmAgkAaAIA////////////AQkBDl9sb2FkUHJlY2lzaW9uAAUEZGlmZgcJAAIBCQCsAgICKl92YWxpZGF0ZUxpcXVpZGl0eUludmFyaWFudDogcmV2ZXJ0OiBkaWZmPQkApAMBBQRkaWZmBgEWX3ZhbGlkYXRlU3dhcEludmFyaWFudAkScHJldkFzc2V0QmFsYW5jZXNfFXByZXZBc3NldFRvdGFsU3VwcGx5Xw5hc3NldEJhbGFuY2VzXxFhc3NldFRvdGFsU3VwcGx5Xw1hc3NldFdlaWdodHNfDHNpZ21hV2VpZ2h0XxB3ZWlnaHRBbXBsaWZpZXJfDXNsaXBwYWdlUmF0ZV8LZmVlTWF4UmF0ZV8ECHByZXZVdGlsCQBlAgUVcHJldkFzc2V0VG90YWxTdXBwbHlfCQENX2NhbGN1bGF0ZUZlZQcFEnByZXZBc3NldEJhbGFuY2VzXwUVcHJldkFzc2V0VG90YWxTdXBwbHlfBQ1hc3NldFdlaWdodHNfBQxzaWdtYVdlaWdodF8FEHdlaWdodEFtcGxpZmllcl8FDXNsaXBwYWdlUmF0ZV8FC2ZlZU1heFJhdGVfBAduZXdVdGlsCQBlAgURYXNzZXRUb3RhbFN1cHBseV8JAQ1fY2FsY3VsYXRlRmVlBwUOYXNzZXRCYWxhbmNlc18FEWFzc2V0VG90YWxTdXBwbHlfBQ1hc3NldFdlaWdodHNfBQxzaWdtYVdlaWdodF8FEHdlaWdodEFtcGxpZmllcl8FDXNsaXBwYWdlUmF0ZV8FC2ZlZU1heFJhdGVfBARkaWZmCQBlAgUHbmV3VXRpbAUIcHJldlV0aWwDAwkAZwIAAAUEZGlmZgkAZgIJAGgCAP///////////wEJAQ5fbG9hZFByZWNpc2lvbgAFBGRpZmYHCQACAQkArAICAiVfdmFsaWRhdGVTd2FwSW52YXJpYW50OiByZXZlcnQ6IGRpZmY9CQCkAwEFBGRpZmYGARhfdmFsaWRhdGVBc3NldEFsbG9jYXRpb24HCGJhbGFuY2VfEWFzc2V0VG90YWxTdXBwbHlfDHByZXZCYWxhbmNlXxVwcmV2QXNzZXRUb3RhbFN1cHBseV8Hd2VpZ2h0XwxzaWdtYVdlaWdodF8MbWF4QWxsb2NBbXBfBAtlcXVpbGlicml1bQkAawMFEWFzc2V0VG90YWxTdXBwbHlfBQd3ZWlnaHRfBQxzaWdtYVdlaWdodF8EEG1heEFsbG9jYXRpb25BbXADCQBmAgUIYmFsYW5jZV8FC2VxdWlsaWJyaXVtCQBkAgUNTUFYX0FNUExJRklFUgUMbWF4QWxsb2NBbXBfCQBlAgUNTUFYX0FNUExJRklFUgUMbWF4QWxsb2NBbXBfBA1tYXhBbGxvY2F0aW9uCQBrAwULZXF1aWxpYnJpdW0FEG1heEFsbG9jYXRpb25BbXAFDU1BWF9BTVBMSUZJRVIEEXByZXZNYXhBbGxvY2F0aW9uCQBrAwkAawMFFXByZXZBc3NldFRvdGFsU3VwcGx5XwUHd2VpZ2h0XwUMc2lnbWFXZWlnaHRfBRBtYXhBbGxvY2F0aW9uQW1wBQ1NQVhfQU1QTElGSUVSAwkAZgIFCGJhbGFuY2VfBQtlcXVpbGlicml1bQMJAGYCBQhiYWxhbmNlXwUNbWF4QWxsb2NhdGlvbgMJAGYCBRFwcmV2TWF4QWxsb2NhdGlvbgUMcHJldkJhbGFuY2VfCQACAQIgX3ZhbGlkYXRlQXNzZXRBbGxvY2F0aW9uOiBuZXcgdXADCQBmAgkAZQIFCGJhbGFuY2VfBQ1tYXhBbGxvY2F0aW9uCQBlAgUMcHJldkJhbGFuY2VfBRFwcmV2TWF4QWxsb2NhdGlvbgkAAgECIl92YWxpZGF0ZUFzc2V0QWxsb2NhdGlvbjogc3RpbGwgdXAGBgMJAGYCBQ1tYXhBbGxvY2F0aW9uBQhiYWxhbmNlXwMJAGYCBQxwcmV2QmFsYW5jZV8FEXByZXZNYXhBbGxvY2F0aW9uCQACAQIiX3ZhbGlkYXRlQXNzZXRBbGxvY2F0aW9uOiBuZXcgZG93bgMJAGYCCQBlAgUNbWF4QWxsb2NhdGlvbgUIYmFsYW5jZV8JAGUCBRFwcmV2TWF4QWxsb2NhdGlvbgUMcHJldkJhbGFuY2VfCQACAQIkX3ZhbGlkYXRlQXNzZXRBbGxvY2F0aW9uOiBzdGlsbCBkb3duBgYBE192YWxpZGF0ZUFsbG9jYXRpb24HDmFzc2V0QmFsYW5jZXNfEWFzc2V0VG90YWxTdXBwbHlfEnByZXZBc3NldEJhbGFuY2VzXxVwcmV2QXNzZXRUb3RhbFN1cHBseV8NYXNzZXRXZWlnaHRzXwxzaWdtYVdlaWdodF8MbWF4QWxsb2NBbXBfCgEIZm9sZEZ1bmMCA2FjYwRlbGVtBAVpbmRleAgFA2FjYwJfMQkAlAoCCQBkAgUFaW5kZXgAAQMIBQNhY2MCXzIJARhfdmFsaWRhdGVBc3NldEFsbG9jYXRpb24HBQRlbGVtBRFhc3NldFRvdGFsU3VwcGx5XwkAkQMCBRJwcmV2QXNzZXRCYWxhbmNlc18FBWluZGV4BRVwcmV2QXNzZXRUb3RhbFN1cHBseV8JAJEDAgUNYXNzZXRXZWlnaHRzXwUFaW5kZXgFDHNpZ21hV2VpZ2h0XwUMbWF4QWxsb2NBbXBfBwQGcmVzdWx0CgACJGwFDmFzc2V0QmFsYW5jZXNfCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCAAAGCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQhmb2xkRnVuYwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACggFBnJlc3VsdAJfMgELX2NoZWNrcG9pbnQBBXVzZXJfBAZ1c2VyTHAJAQtfbG9hZFVzZXJMcAEFBXVzZXJfBAt1c2VyUHJvZml0cwkBEF9sb2FkVXNlclByb2ZpdHMBBQV1c2VyXwQNc2lnbWFGZWVQZXJMcAkBEl9sb2FkU2lnbWFGZWVQZXJMcAAEEXVzZXJTaWdtYUZlZVBlckxwCQEWX2xvYWRVc2VyU2lnbWFGZWVQZXJMcAEFBXVzZXJfCgEIZm9sZEZ1bmMCA2FjYwRlbGVtBAVpbmRleAgFA2FjYwJfMQQNcHJvZml0VXBkYXRlZAkAZAIJAJEDAgULdXNlclByb2ZpdHMFBWluZGV4CQCgAwEJALwCAwkAtgIBBQZ1c2VyTHAJALgCAgkAkQMCBQ1zaWdtYUZlZVBlckxwBQVpbmRleAkAkQMCBRF1c2VyU2lnbWFGZWVQZXJMcAUFaW5kZXgFDlBFUkNFTlRfRkFDVE9SCQCUCgIJAGQCBQVpbmRleAABCQDNCAIIBQNhY2MCXzIFDXByb2ZpdFVwZGF0ZWQEDSR0MDI0NjA1MjQ2NzgKAAIkbAUQWkVST19JTlRfTElTVF8xMQoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgAABQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCGZvbGRGdW5jAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsEA2lkeAgFDSR0MDI0NjA1MjQ2NzgCXzEEDnByb2ZpdHNVcGRhdGVkCAUNJHQwMjQ2MDUyNDY3OAJfMgkAlAoCCQDOCAIJARBfc2F2ZVVzZXJQcm9maXRzAgUFdXNlcl8FDnByb2ZpdHNVcGRhdGVkCQEWX3NhdmVVc2VyU2lnbWFGZWVQZXJMcAIFBXVzZXJfBQ1zaWdtYUZlZVBlckxwBQ5wcm9maXRzVXBkYXRlZAEUX3VwZGF0ZVNpZ21hRmVlUGVyTHAEDnNpZ21hRmVlUGVyTHBfCHRvdGFsTHBfBmluZGV4XwZscEZlZV8KAQhmb2xkRnVuYwIDYWNjBGVsZW0EBWluZGV4CAUDYWNjAl8xBBRzaWdtYUZlZVBlckxwVXBkYXRlZAMJAAACBQZpbmRleF8FBWluZGV4CQC3AgIJAJEDAgUOc2lnbWFGZWVQZXJMcF8FBWluZGV4CQC8AgMJALYCAQUGbHBGZWVfBQ5QRVJDRU5UX0ZBQ1RPUgkAtgIBBQh0b3RhbExwXwkAkQMCBQ5zaWdtYUZlZVBlckxwXwUFaW5kZXgJAJQKAgkAZAIFBWluZGV4AAEJAM0IAggFA2FjYwJfMgUUc2lnbWFGZWVQZXJMcFVwZGF0ZWQEDSR0MDI1MzI4MjU0MDcKAAIkbAUQWkVST19JTlRfTElTVF8xMQoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgAABQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCGZvbGRGdW5jAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsEA2lkeAgFDSR0MDI1MzI4MjU0MDcCXzEEFHNpZ21hRmVlUGVyTHBVcGRhdGVkCAUNJHQwMjUzMjgyNTQwNwJfMgUUc2lnbWFGZWVQZXJMcFVwZGF0ZWQBG19jYWxjdWxhdGVMcEFuZFByb3RvY29sRmVlcwQLYXNzZXRJbmRleF8HYW1vdW50XwpscEZlZVJhdGVfEHByb3RvY29sRmVlUmF0ZV8EDXNpZ21hRmVlUGVyTHAJARJfbG9hZFNpZ21hRmVlUGVyTHAABAd0b3RhbExwCQEMX2xvYWRUb3RhbExwAAQNJHQwMjU2MjgyNTkwMwMJAAACBQd0b3RhbExwAAAJAJQKAgAACQBrAwUHYW1vdW50XwUQcHJvdG9jb2xGZWVSYXRlXwUHTUFYX0ZFRQkAlAoCCQBrAwUHYW1vdW50XwUKbHBGZWVSYXRlXwUHTUFYX0ZFRQkAawMFB2Ftb3VudF8FEHByb3RvY29sRmVlUmF0ZV8FB01BWF9GRUUEBWxwRmVlCAUNJHQwMjU2MjgyNTkwMwJfMQQLcHJvdG9jb2xGZWUIBQ0kdDAyNTYyODI1OTAzAl8yBBRzaWdtYUZlZVBlckxwVXBkYXRlZAMJAAACBQVscEZlZQAABQ1zaWdtYUZlZVBlckxwCQEUX3VwZGF0ZVNpZ21hRmVlUGVyTHAEBQ1zaWdtYUZlZVBlckxwBQd0b3RhbExwBQthc3NldEluZGV4XwUFbHBGZWUJAJUKAwUFbHBGZWUFC3Byb3RvY29sRmVlBRRzaWdtYUZlZVBlckxwVXBkYXRlZAELX2RlcG9zaXRBbGwBB2Ftb3VudF8EB3N0b3JhZ2UJAQxfbG9hZFN0b3JhZ2UABA1scFRvdGFsU3VwcGx5CAUHc3RvcmFnZQJfMwQPd2VpZ2h0QW1wbGlmaWVyCAUHc3RvcmFnZQJfNwQMc2xpcHBhZ2VSYXRlCAUHc3RvcmFnZQJfOAQKZmVlTWF4UmF0ZQgFB3N0b3JhZ2UCXzkEBmFzc2V0cwkBC19sb2FkQXNzZXRzAAQNJHQwMjY0MTIyNjQ2NQkBEV9sb2FkQXNzZXRXZWlnaHRzAAQMYXNzZXRXZWlnaHRzCAUNJHQwMjY0MTIyNjQ2NQJfMQQLc2lnbWFXZWlnaHQIBQ0kdDAyNjQxMjI2NDY1Al8yBA0kdDAyNjQ3MDI2NTM4CQESX2xvYWRBc3NldEJhbGFuY2VzAAQRcHJldkFzc2V0QmFsYW5jZXMIBQ0kdDAyNjQ3MDI2NTM4Al8xBBRwcmV2QXNzZXRUb3RhbFN1cHBseQgFDSR0MDI2NDcwMjY1MzgCXzIEDSR0MDI2NTQ0Mjc3NzQDCQAAAgUUcHJldkFzc2V0VG90YWxTdXBwbHkAAAoBCGZvbGRGdW5jAgNhY2MEZWxlbQQFaW5kZXgIBQNhY2MCXzEEGHJlcXVpcmVkQW1vdW50Tm9ybWFsaXplZAkAawMJAJEDAgUMYXNzZXRXZWlnaHRzBQVpbmRleAUHYW1vdW50XwULc2lnbWFXZWlnaHQJAJQKAgkAZAIFBWluZGV4AAEJAM0IAggFA2FjYwJfMgUYcmVxdWlyZWRBbW91bnROb3JtYWxpemVkBA0kdDAyNjk4NjI3MDYwCgACJGwFBmFzc2V0cwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgAABQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCGZvbGRGdW5jAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKBANpZHgIBQ0kdDAyNjk4NjI3MDYwAl8xBBlyZXF1aXJlZEFtb3VudHNOb3JtYWxpemVkCAUNJHQwMjY5ODYyNzA2MAJfMgkAlAoCBQdhbW91bnRfBRlyZXF1aXJlZEFtb3VudHNOb3JtYWxpemVkBAVyYXRpbwkAvAIDCQC2AgEFB2Ftb3VudF8FDlBFUkNFTlRfRkFDVE9SCQC2AgEFFHByZXZBc3NldFRvdGFsU3VwcGx5CgEJZm9sZEZ1bmMxAgNhY2MEZWxlbQQFaW5kZXgIBQNhY2MCXzEEGHJlcXVpcmVkQW1vdW50Tm9ybWFsaXplZAkAoAMBCQC8AgMFBXJhdGlvCQC2AgEJAJEDAgURcHJldkFzc2V0QmFsYW5jZXMFBWluZGV4BQ5QRVJDRU5UX0ZBQ1RPUgkAlAoCCQBkAgUFaW5kZXgAAQkAzQgCCAUDYWNjAl8yBRhyZXF1aXJlZEFtb3VudE5vcm1hbGl6ZWQEDSR0MDI3NjAzMjc2NzgKAAIkbAUGYXNzZXRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCAAAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEJZm9sZEZ1bmMxAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKBANpZHgIBQ0kdDAyNzYwMzI3Njc4Al8xBBlyZXF1aXJlZEFtb3VudHNOb3JtYWxpemVkCAUNJHQwMjc2MDMyNzY3OAJfMgkAlAoCCQBrAwUHYW1vdW50XwUNbHBUb3RhbFN1cHBseQUUcHJldkFzc2V0VG90YWxTdXBwbHkFGXJlcXVpcmVkQW1vdW50c05vcm1hbGl6ZWQEDmxwVG9rZW5zVG9NaW50CAUNJHQwMjY1NDQyNzc3NAJfMQQZcmVxdWlyZWRBbW91bnRzTm9ybWFsaXplZAgFDSR0MDI2NTQ0Mjc3NzQCXzIEDSR0MDI3NzgwMjc4OTMJARtfaW5jcmVtZW50QmFsYW5jZXNCeUFtb3VudHMCBRFwcmV2QXNzZXRCYWxhbmNlcwUZcmVxdWlyZWRBbW91bnRzTm9ybWFsaXplZAQNYXNzZXRCYWxhbmNlcwgFDSR0MDI3NzgwMjc4OTMCXzEEEGFzc2V0VG90YWxTdXBwbHkIBQ0kdDAyNzc4MDI3ODkzAl8yBARlcnIyCQEbX3ZhbGlkYXRlTGlxdWlkaXR5SW52YXJpYW50CwURcHJldkFzc2V0QmFsYW5jZXMFFHByZXZBc3NldFRvdGFsU3VwcGx5BQ1hc3NldEJhbGFuY2VzBRBhc3NldFRvdGFsU3VwcGx5BQ1scFRvdGFsU3VwcGx5CQBkAgUNbHBUb3RhbFN1cHBseQUObHBUb2tlbnNUb01pbnQFDGFzc2V0V2VpZ2h0cwULc2lnbWFXZWlnaHQFD3dlaWdodEFtcGxpZmllcgUMc2xpcHBhZ2VSYXRlBQpmZWVNYXhSYXRlAwkAAAIFBGVycjIFBGVycjIJAJUKAwUObHBUb2tlbnNUb01pbnQFGXJlcXVpcmVkQW1vdW50c05vcm1hbGl6ZWQFDWFzc2V0QmFsYW5jZXMJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BCF9kZXBvc2l0Aghhc3NldElkXwdhbW91bnRfBAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAQNbHBUb3RhbFN1cHBseQgFB3N0b3JhZ2UCXzMECWxwRmVlUmF0ZQgFB3N0b3JhZ2UCXzQED3Byb3RvY29sRmVlUmF0ZQgFB3N0b3JhZ2UCXzUEEW1heEFsbG9jQW1wbGlmaWVyCAUHc3RvcmFnZQJfNgQPd2VpZ2h0QW1wbGlmaWVyCAUHc3RvcmFnZQJfNwQMc2xpcHBhZ2VSYXRlCAUHc3RvcmFnZQJfOAQKZmVlTWF4UmF0ZQgFB3N0b3JhZ2UCXzkEBmFzc2V0cwkBC19sb2FkQXNzZXRzAAQNJHQwMjg2NTYyODcwOQkBEV9sb2FkQXNzZXRXZWlnaHRzAAQMYXNzZXRXZWlnaHRzCAUNJHQwMjg2NTYyODcwOQJfMQQLc2lnbWFXZWlnaHQIBQ0kdDAyODY1NjI4NzA5Al8yBA0kdDAyODcxNDI4ODI4CQESX2xvYWRBc3NldEJhbGFuY2VzAAQRcHJldkFzc2V0QmFsYW5jZXMIBQ0kdDAyODcxNDI4ODI4Al8xBBRwcmV2QXNzZXRUb3RhbFN1cHBseQgFDSR0MDI4NzE0Mjg4MjgCXzIEDWFzc2V0QmFsYW5jZXMJARhfaW5jcmVtZW50QmFsYW5jZUJ5SW5kZXgDBRFwcmV2QXNzZXRCYWxhbmNlcwkBBXZhbHVlAQkAzwgCBQZhc3NldHMFCGFzc2V0SWRfBQdhbW91bnRfBBBhc3NldFRvdGFsU3VwcGx5CQBkAgUUcHJldkFzc2V0VG90YWxTdXBwbHkFB2Ftb3VudF8EBGVycjIJARNfdmFsaWRhdGVBbGxvY2F0aW9uBwUNYXNzZXRCYWxhbmNlcwUQYXNzZXRUb3RhbFN1cHBseQURcHJldkFzc2V0QmFsYW5jZXMFFHByZXZBc3NldFRvdGFsU3VwcGx5BQxhc3NldFdlaWdodHMFC3NpZ21hV2VpZ2h0BRFtYXhBbGxvY0FtcGxpZmllcgMJAAACBQRlcnIyBQRlcnIyBAdwcmV2RmVlCQENX2NhbGN1bGF0ZUZlZQcFEXByZXZBc3NldEJhbGFuY2VzBRRwcmV2QXNzZXRUb3RhbFN1cHBseQUMYXNzZXRXZWlnaHRzBQtzaWdtYVdlaWdodAUPd2VpZ2h0QW1wbGlmaWVyBQxzbGlwcGFnZVJhdGUFCmZlZU1heFJhdGUEA2ZlZQkBDV9jYWxjdWxhdGVGZWUHBQ1hc3NldEJhbGFuY2VzBRBhc3NldFRvdGFsU3VwcGx5BQxhc3NldFdlaWdodHMFC3NpZ21hV2VpZ2h0BQ93ZWlnaHRBbXBsaWZpZXIFDHNsaXBwYWdlUmF0ZQUKZmVlTWF4UmF0ZQQObHBUb2tlbnNUb01pbnQDCQAAAgUNbHBUb3RhbFN1cHBseQAACQACAQIUX2RlcG9zaXQ6IGVtcHR5IHBvb2wECWFzc2V0RGlmZgkAZQIFEGFzc2V0VG90YWxTdXBwbHkFFHByZXZBc3NldFRvdGFsU3VwcGx5BAdmZWVEaWZmCQBlAgUDZmVlBQdwcmV2RmVlBBN1dGlsaXR5Q2hhbmdlRmFjdG9yCQBrAwkAZQIFCWFzc2V0RGlmZgUHZmVlRGlmZgULUkFURV9GQUNUT1IJAGUCBRRwcmV2QXNzZXRUb3RhbFN1cHBseQUHcHJldkZlZQQTbHBUb2tlbnNUb01pbnRJbm5lcgkAawMFDWxwVG90YWxTdXBwbHkFE3V0aWxpdHlDaGFuZ2VGYWN0b3IFC1JBVEVfRkFDVE9SBARlcnIzCQEbX3ZhbGlkYXRlTGlxdWlkaXR5SW52YXJpYW50CwURcHJldkFzc2V0QmFsYW5jZXMFFHByZXZBc3NldFRvdGFsU3VwcGx5BQ1hc3NldEJhbGFuY2VzBRBhc3NldFRvdGFsU3VwcGx5BQ1scFRvdGFsU3VwcGx5CQBkAgUNbHBUb3RhbFN1cHBseQUTbHBUb2tlbnNUb01pbnRJbm5lcgUMYXNzZXRXZWlnaHRzBQtzaWdtYVdlaWdodAUPd2VpZ2h0QW1wbGlmaWVyBQxzbGlwcGFnZVJhdGUFCmZlZU1heFJhdGUDCQAAAgUEZXJyMwUEZXJyMwUTbHBUb2tlbnNUb01pbnRJbm5lcgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgQNJHQwMzA0OTAzMDYyMQkBG19jYWxjdWxhdGVMcEFuZFByb3RvY29sRmVlcwQAAAUObHBUb2tlbnNUb01pbnQJAGkCBQlscEZlZVJhdGUAAgkAaQIFD3Byb3RvY29sRmVlUmF0ZQACBAVscEZlZQgFDSR0MDMwNDkwMzA2MjECXzEEC3Byb3RvY29sRmVlCAUNJHQwMzA0OTAzMDYyMQJfMgQUc2lnbWFGZWVQZXJMcFVwZGF0ZWQIBQ0kdDAzMDQ5MDMwNjIxAl8zCQCXCgUFDmxwVG9rZW5zVG9NaW50BQ1hc3NldEJhbGFuY2VzBQVscEZlZQULcHJvdG9jb2xGZWUFFHNpZ21hRmVlUGVyTHBVcGRhdGVkCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQxfd2l0aGRyYXdBbGwBB2Ftb3VudF8EB3N0b3JhZ2UJAQxfbG9hZFN0b3JhZ2UABA1scFRvdGFsU3VwcGx5CAUHc3RvcmFnZQJfMwQRbWF4QWxsb2NBbXBsaWZpZXIIBQdzdG9yYWdlAl82BA93ZWlnaHRBbXBsaWZpZXIIBQdzdG9yYWdlAl83BAxzbGlwcGFnZVJhdGUIBQdzdG9yYWdlAl84BApmZWVNYXhSYXRlCAUHc3RvcmFnZQJfOQQNJHQwMzA5NTUzMTAyMwkBEl9sb2FkQXNzZXRCYWxhbmNlcwAEEXByZXZBc3NldEJhbGFuY2VzCAUNJHQwMzA5NTUzMTAyMwJfMQQUcHJldkFzc2V0VG90YWxTdXBwbHkIBQ0kdDAzMDk1NTMxMDIzAl8yBA0kdDAzMTAyODMxMDgxCQERX2xvYWRBc3NldFdlaWdodHMABAxhc3NldFdlaWdodHMIBQ0kdDAzMTAyODMxMDgxAl8xBAtzaWdtYVdlaWdodAgFDSR0MDMxMDI4MzEwODECXzIEDmxwVG9rZW5zVG9CdXJuBQdhbW91bnRfBANlcnIJAQxfdmFsaWRhdGVJbnQEBQ5scFRva2Vuc1RvQnVybgAABQdNQVhfSU5UAihfd2l0aGRyYXdBbGw6IGxwVG9rZW5zVG9CdXJuIGxlc3MgdGhhbiAwAwkAAAIFA2VycgUDZXJyBA0kdDAzMTIyMzMxMzU2CQEcX2RlY3JlbWVudEJhbGFuY2VzQnlMcEFtb3VudAMFEXByZXZBc3NldEJhbGFuY2VzBQ5scFRva2Vuc1RvQnVybgUNbHBUb3RhbFN1cHBseQQNYXNzZXRCYWxhbmNlcwgFDSR0MDMxMjIzMzEzNTYCXzEEEGFzc2V0VG90YWxTdXBwbHkIBQ0kdDAzMTIyMzMxMzU2Al8yBA1iYWxhbmNlc1RvUGF5CAUNJHQwMzEyMjMzMTM1NgJfMwQEZXJyMgkBG192YWxpZGF0ZUxpcXVpZGl0eUludmFyaWFudAsFEXByZXZBc3NldEJhbGFuY2VzBRRwcmV2QXNzZXRUb3RhbFN1cHBseQUNYXNzZXRCYWxhbmNlcwUQYXNzZXRUb3RhbFN1cHBseQUNbHBUb3RhbFN1cHBseQkAZQIFDWxwVG90YWxTdXBwbHkFDmxwVG9rZW5zVG9CdXJuBQxhc3NldFdlaWdodHMFC3NpZ21hV2VpZ2h0BQ93ZWlnaHRBbXBsaWZpZXIFDHNsaXBwYWdlUmF0ZQUKZmVlTWF4UmF0ZQMJAAACBQRlcnIyBQRlcnIyCQCVCgMFDmxwVG9rZW5zVG9CdXJuBQ1iYWxhbmNlc1RvUGF5BQ1hc3NldEJhbGFuY2VzCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQlfd2l0aGRyYXcCCGFzc2V0SWRfCWxwQW1vdW50XwQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQAEDWxwVG90YWxTdXBwbHkIBQdzdG9yYWdlAl8zBAlscEZlZVJhdGUIBQdzdG9yYWdlAl80BA9wcm90b2NvbEZlZVJhdGUIBQdzdG9yYWdlAl81BBFtYXhBbGxvY0FtcGxpZmllcggFB3N0b3JhZ2UCXzYED3dlaWdodEFtcGxpZmllcggFB3N0b3JhZ2UCXzcEDHNsaXBwYWdlUmF0ZQgFB3N0b3JhZ2UCXzgECmZlZU1heFJhdGUIBQdzdG9yYWdlAl85BAlwcmVjaXNpb24JAQ5fbG9hZFByZWNpc2lvbgAEBmFzc2V0cwkBC19sb2FkQXNzZXRzAAQNJHQwMzIxNDgzMjIxNgkBEl9sb2FkQXNzZXRCYWxhbmNlcwAEEXByZXZBc3NldEJhbGFuY2VzCAUNJHQwMzIxNDgzMjIxNgJfMQQUcHJldkFzc2V0VG90YWxTdXBwbHkIBQ0kdDAzMjE0ODMyMjE2Al8yBA0kdDAzMjIyMTMyMjc0CQERX2xvYWRBc3NldFdlaWdodHMABAxhc3NldFdlaWdodHMIBQ0kdDAzMjIyMTMyMjc0Al8xBAtzaWdtYVdlaWdodAgFDSR0MDMyMjIxMzIyNzQCXzIEEHRhcmdldEFzc2V0SW5kZXgJAQV2YWx1ZQEJAM8IAgUGYXNzZXRzBQhhc3NldElkXwQHcHJldkZlZQkBDV9jYWxjdWxhdGVGZWUHBRFwcmV2QXNzZXRCYWxhbmNlcwUUcHJldkFzc2V0VG90YWxTdXBwbHkFDGFzc2V0V2VpZ2h0cwULc2lnbWFXZWlnaHQFD3dlaWdodEFtcGxpZmllcgUMc2xpcHBhZ2VSYXRlBQpmZWVNYXhSYXRlBA1wcmV2VXRpbFZhbHVlCQBlAgUUcHJldkFzc2V0VG90YWxTdXBwbHkFB3ByZXZGZWUEAWsJALwCAwkAtgIBCQBlAgUNbHBUb3RhbFN1cHBseQUJbHBBbW91bnRfBQ5QRVJDRU5UX0ZBQ1RPUgkAtgIBBQ1scFRvdGFsU3VwcGx5BBJwcmV2VXRpbFZhbHVlV2l0aEsJAKADAQkAvAIDCQC2AgEFDXByZXZVdGlsVmFsdWUFAWsFDlBFUkNFTlRfRkFDVE9SCgEIZm9sZEZ1bmMCA2FjYwRlbGVtAwgFA2FjYwJfMQUDYWNjBApzdGFydElubmVyCAUDYWNjAl8yBAlzdG9wSW5uZXIIBQNhY2MCXzMEDWN1cnJlbnRBbW91bnQJAGkCCQBkAgUJc3RvcElubmVyBQpzdGFydElubmVyAAIEEXRlbXBBc3NldEJhbGFuY2VzCQEYX2RlY3JlbWVudEJhbGFuY2VCeUluZGV4AwURcHJldkFzc2V0QmFsYW5jZXMFEHRhcmdldEFzc2V0SW5kZXgFDWN1cnJlbnRBbW91bnQEFHRlbXBBc3NldFRvdGFsU3VwcGx5CQBlAgUUcHJldkFzc2V0VG90YWxTdXBwbHkFDWN1cnJlbnRBbW91bnQECXV0aWxWYWx1ZQkAZQIFFHRlbXBBc3NldFRvdGFsU3VwcGx5CQENX2NhbGN1bGF0ZUZlZQcFEXRlbXBBc3NldEJhbGFuY2VzBRR0ZW1wQXNzZXRUb3RhbFN1cHBseQUMYXNzZXRXZWlnaHRzBQtzaWdtYVdlaWdodAUPd2VpZ2h0QW1wbGlmaWVyBQxzbGlwcGFnZVJhdGUFCmZlZU1heFJhdGUDAwkAZgIFCXByZWNpc2lvbgkAZQIFCXV0aWxWYWx1ZQUScHJldlV0aWxWYWx1ZVdpdGhLCQBnAgkAZQIFCXV0aWxWYWx1ZQUScHJldlV0aWxWYWx1ZVdpdGhLAAAHCQCWCgQGBQpzdGFydElubmVyBQlzdG9wSW5uZXIFDWN1cnJlbnRBbW91bnQDCQBmAgAACQBlAgUJdXRpbFZhbHVlBRJwcmV2VXRpbFZhbHVlV2l0aEsJAJYKBAcFCnN0YXJ0SW5uZXIFDWN1cnJlbnRBbW91bnQFDWN1cnJlbnRBbW91bnQJAJYKBAcFDWN1cnJlbnRBbW91bnQFCXN0b3BJbm5lcgUNY3VycmVudEFtb3VudAQMdGFyZ2V0QW1vdW50BA0kdDAzMzc5NzMzOTEyCgACJGwFB0xJU1RfNjQKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCWCgQHAAAJAGQCBQlscEFtb3VudF8FB3ByZXZGZWUAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEIZm9sZEZ1bmMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDY0CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAAVABYAFwAYABkAGgAbABwAHQAeAB8AIAAhACIAIwAkACUAJgAnACgAKQAqACsALAAtAC4ALwAwADEAMgAzADQANQA2ADcAOAA5ADoAOwA8AD0APgA/AEAEB3N1Y2Nlc3MIBQ0kdDAzMzc5NzMzOTEyAl8xBAhzdGFydE91dAgFDSR0MDMzNzk3MzM5MTICXzIEB3N0b3BPdXQIBQ0kdDAzMzc5NzMzOTEyAl8zBA90YXJnZXRBbW91bnRPdXQIBQ0kdDAzMzc5NzMzOTEyAl80AwkBASEBBQdzdWNjZXNzCQACAQkArAICAihfd2l0aGRyYXc6IGNhbid0IGNhbGN1bGF0ZSB0YXJnZXRBbW91bnQ9CQCkAwEFD3RhcmdldEFtb3VudE91dAUPdGFyZ2V0QW1vdW50T3V0BBJmaW5hbEFzc2V0QmFsYW5jZXMJARhfZGVjcmVtZW50QmFsYW5jZUJ5SW5kZXgDBRFwcmV2QXNzZXRCYWxhbmNlcwUQdGFyZ2V0QXNzZXRJbmRleAUMdGFyZ2V0QW1vdW50BBVmaW5hbEFzc2V0VG90YWxTdXBwbHkJAGUCBRRwcmV2QXNzZXRUb3RhbFN1cHBseQUMdGFyZ2V0QW1vdW50BARlcnIxAwkBE192YWxpZGF0ZUFsbG9jYXRpb24HBRJmaW5hbEFzc2V0QmFsYW5jZXMFFWZpbmFsQXNzZXRUb3RhbFN1cHBseQURcHJldkFzc2V0QmFsYW5jZXMFFHByZXZBc3NldFRvdGFsU3VwcGx5BQxhc3NldFdlaWdodHMFC3NpZ21hV2VpZ2h0BRFtYXhBbGxvY0FtcGxpZmllcgkBG192YWxpZGF0ZUxpcXVpZGl0eUludmFyaWFudAsFEXByZXZBc3NldEJhbGFuY2VzBRRwcmV2QXNzZXRUb3RhbFN1cHBseQUSZmluYWxBc3NldEJhbGFuY2VzBRVmaW5hbEFzc2V0VG90YWxTdXBwbHkFDWxwVG90YWxTdXBwbHkJAGUCBQ1scFRvdGFsU3VwcGx5BQlscEFtb3VudF8FDGFzc2V0V2VpZ2h0cwULc2lnbWFXZWlnaHQFD3dlaWdodEFtcGxpZmllcgUMc2xpcHBhZ2VSYXRlBQpmZWVNYXhSYXRlBwMJAAACBQRlcnIxBQRlcnIxBA0kdDAzNDg3MDM1MDE4CQEbX2NhbGN1bGF0ZUxwQW5kUHJvdG9jb2xGZWVzBAkAZAIFEHRhcmdldEFzc2V0SW5kZXgAAQUMdGFyZ2V0QW1vdW50CQBpAgUJbHBGZWVSYXRlAAIJAGkCBQ9wcm90b2NvbEZlZVJhdGUAAgQFbHBGZWUIBQ0kdDAzNDg3MDM1MDE4Al8xBAtwcm90b2NvbEZlZQgFDSR0MDM0ODcwMzUwMTgCXzIEFHNpZ21hRmVlUGVyTHBVcGRhdGVkCAUNJHQwMzQ4NzAzNTAxOAJfMwkAlwoFBQx0YXJnZXRBbW91bnQFEmZpbmFsQXNzZXRCYWxhbmNlcwUFbHBGZWUFC3Byb3RvY29sRmVlBRRzaWdtYUZlZVBlckxwVXBkYXRlZAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEFX3N3YXADEXNvdXJjZUFzc2V0SW5kZXhfEXRhcmdldEFzc2V0SW5kZXhfDXNvdXJjZUFtb3VudF8EB3N0b3JhZ2UJAQxfbG9hZFN0b3JhZ2UABAlscEFzc2V0SWQIBQdzdG9yYWdlAl8xBApscERlY2ltYWxzCQEMX2dldERlY2ltYWxzAQkA2AQBBQlscEFzc2V0SWQEDWxwVG90YWxTdXBwbHkIBQdzdG9yYWdlAl8zBAlscEZlZVJhdGUIBQdzdG9yYWdlAl80BA9wcm90b2NvbEZlZVJhdGUIBQdzdG9yYWdlAl81BBFtYXhBbGxvY0FtcGxpZmllcggFB3N0b3JhZ2UCXzYED3dlaWdodEFtcGxpZmllcggFB3N0b3JhZ2UCXzcEDHNsaXBwYWdlUmF0ZQgFB3N0b3JhZ2UCXzgECmZlZU1heFJhdGUIBQdzdG9yYWdlAl85BAlwcmVjaXNpb24JAQ5fbG9hZFByZWNpc2lvbgAEDSR0MDM1NjAwMzU2NjgJARJfbG9hZEFzc2V0QmFsYW5jZXMABBFwcmV2QXNzZXRCYWxhbmNlcwgFDSR0MDM1NjAwMzU2NjgCXzEEFHByZXZBc3NldFRvdGFsU3VwcGx5CAUNJHQwMzU2MDAzNTY2OAJfMgQNJHQwMzU2NzMzNTcyNgkBEV9sb2FkQXNzZXRXZWlnaHRzAAQMYXNzZXRXZWlnaHRzCAUNJHQwMzU2NzMzNTcyNgJfMQQLc2lnbWFXZWlnaHQIBQ0kdDAzNTY3MzM1NzI2Al8yBA1hc3NldEJhbGFuY2VzCQEYX2luY3JlbWVudEJhbGFuY2VCeUluZGV4AwURcHJldkFzc2V0QmFsYW5jZXMFEXNvdXJjZUFzc2V0SW5kZXhfBQ1zb3VyY2VBbW91bnRfBBBhc3NldFRvdGFsU3VwcGx5CQBkAgUUcHJldkFzc2V0VG90YWxTdXBwbHkFDXNvdXJjZUFtb3VudF8EB3ByZXZGZWUJAQ1fY2FsY3VsYXRlRmVlBwURcHJldkFzc2V0QmFsYW5jZXMFFHByZXZBc3NldFRvdGFsU3VwcGx5BQxhc3NldFdlaWdodHMFC3NpZ21hV2VpZ2h0BQ93ZWlnaHRBbXBsaWZpZXIFDHNsaXBwYWdlUmF0ZQUKZmVlTWF4UmF0ZQQNcHJldlV0aWxWYWx1ZQkAZQIFFHByZXZBc3NldFRvdGFsU3VwcGx5BQdwcmV2RmVlCgEIZm9sZEZ1bmMCA2FjYwRlbGVtAwgFA2FjYwJfMQUDYWNjBApzdGFydElubmVyCAUDYWNjAl8yBAlzdG9wSW5uZXIIBQNhY2MCXzMEDWN1cnJlbnRBbW91bnQJAGkCCQBkAgUJc3RvcElubmVyBQpzdGFydElubmVyAAIEEXRlbXBBc3NldEJhbGFuY2VzCQEYX2RlY3JlbWVudEJhbGFuY2VCeUluZGV4AwUNYXNzZXRCYWxhbmNlcwURdGFyZ2V0QXNzZXRJbmRleF8FDWN1cnJlbnRBbW91bnQEFHRlbXBBc3NldFRvdGFsU3VwcGx5CQBlAgUQYXNzZXRUb3RhbFN1cHBseQUNY3VycmVudEFtb3VudAQJdXRpbFZhbHVlCQBlAgUUdGVtcEFzc2V0VG90YWxTdXBwbHkJAQ1fY2FsY3VsYXRlRmVlBwURdGVtcEFzc2V0QmFsYW5jZXMFFHRlbXBBc3NldFRvdGFsU3VwcGx5BQxhc3NldFdlaWdodHMFC3NpZ21hV2VpZ2h0BQ93ZWlnaHRBbXBsaWZpZXIFDHNsaXBwYWdlUmF0ZQUKZmVlTWF4UmF0ZQMDCQBmAgkAZQIFCXV0aWxWYWx1ZQUNcHJldlV0aWxWYWx1ZQkAaAIA////////////AQUJcHJlY2lzaW9uCQBmAgUJcHJlY2lzaW9uCQBlAgUJdXRpbFZhbHVlBQ1wcmV2VXRpbFZhbHVlBwkAlgoEBgUKc3RhcnRJbm5lcgUJc3RvcElubmVyBQ1jdXJyZW50QW1vdW50AwkAZgIAAAkAZQIFCXV0aWxWYWx1ZQUNcHJldlV0aWxWYWx1ZQkAlgoEBwUKc3RhcnRJbm5lcgUNY3VycmVudEFtb3VudAUNY3VycmVudEFtb3VudAkAlgoEBwUNY3VycmVudEFtb3VudAUJc3RvcElubmVyBQ1jdXJyZW50QW1vdW50BAx0YXJnZXRBbW91bnQEDHRhcmdldEFtb3VudAUNc291cmNlQW1vdW50XwQRdGVtcEFzc2V0QmFsYW5jZXMJARhfZGVjcmVtZW50QmFsYW5jZUJ5SW5kZXgDBQ1hc3NldEJhbGFuY2VzBRF0YXJnZXRBc3NldEluZGV4XwUMdGFyZ2V0QW1vdW50BBR0ZW1wQXNzZXRUb3RhbFN1cHBseQkAZQIFEGFzc2V0VG90YWxTdXBwbHkFDHRhcmdldEFtb3VudAQDZmVlCQENX2NhbGN1bGF0ZUZlZQcFEXRlbXBBc3NldEJhbGFuY2VzBRR0ZW1wQXNzZXRUb3RhbFN1cHBseQUMYXNzZXRXZWlnaHRzBQtzaWdtYVdlaWdodAUPd2VpZ2h0QW1wbGlmaWVyBQxzbGlwcGFnZVJhdGUFCmZlZU1heFJhdGUEB2ZlZURpZmYJAGUCBQNmZWUFB3ByZXZGZWUDCQAAAgUHZmVlRGlmZgAABQx0YXJnZXRBbW91bnQEDSR0MDM3NjEzMzc3MzIKAAIkbAUHTElTVF82NAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJYKBAcAAAkAZAIFDXNvdXJjZUFtb3VudF8FB3ByZXZGZWUAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEIZm9sZEZ1bmMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDY0CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAAVABYAFwAYABkAGgAbABwAHQAeAB8AIAAhACIAIwAkACUAJgAnACgAKQAqACsALAAtAC4ALwAwADEAMgAzADQANQA2ADcAOAA5ADoAOwA8AD0APgA/AEAEB3N1Y2Nlc3MIBQ0kdDAzNzYxMzM3NzMyAl8xBAhzdGFydE91dAgFDSR0MDM3NjEzMzc3MzICXzIEB3N0b3BPdXQIBQ0kdDAzNzYxMzM3NzMyAl8zBA90YXJnZXRBbW91bnRPdXQIBQ0kdDAzNzYxMzM3NzMyAl80AwkBASEBBQdzdWNjZXNzCQACAQkArAICAiRfc3dhcDogY2FuJ3QgY2FsY3VsYXRlIHRhcmdldEFtb3VudD0JAKQDAQUPdGFyZ2V0QW1vdW50T3V0BQ90YXJnZXRBbW91bnRPdXQEEmZpbmFsQXNzZXRCYWxhbmNlcwkBGF9kZWNyZW1lbnRCYWxhbmNlQnlJbmRleAMFDWFzc2V0QmFsYW5jZXMFEXRhcmdldEFzc2V0SW5kZXhfBQx0YXJnZXRBbW91bnQEFWZpbmFsQXNzZXRUb3RhbFN1cHBseQkAZQIFEGFzc2V0VG90YWxTdXBwbHkFDHRhcmdldEFtb3VudAQEZXJyMQMJARNfdmFsaWRhdGVBbGxvY2F0aW9uBwUSZmluYWxBc3NldEJhbGFuY2VzBRVmaW5hbEFzc2V0VG90YWxTdXBwbHkFEXByZXZBc3NldEJhbGFuY2VzBRRwcmV2QXNzZXRUb3RhbFN1cHBseQUMYXNzZXRXZWlnaHRzBQtzaWdtYVdlaWdodAURbWF4QWxsb2NBbXBsaWZpZXIJARZfdmFsaWRhdGVTd2FwSW52YXJpYW50CQURcHJldkFzc2V0QmFsYW5jZXMFFHByZXZBc3NldFRvdGFsU3VwcGx5BRJmaW5hbEFzc2V0QmFsYW5jZXMFFWZpbmFsQXNzZXRUb3RhbFN1cHBseQUMYXNzZXRXZWlnaHRzBQtzaWdtYVdlaWdodAUPd2VpZ2h0QW1wbGlmaWVyBQxzbGlwcGFnZVJhdGUFCmZlZU1heFJhdGUHAwkAAAIFBGVycjEFBGVycjEEDSR0MDM4NTQ1Mzg2ODYJARtfY2FsY3VsYXRlTHBBbmRQcm90b2NvbEZlZXMECQBkAgURdGFyZ2V0QXNzZXRJbmRleF8AAQUMdGFyZ2V0QW1vdW50BQlscEZlZVJhdGUFD3Byb3RvY29sRmVlUmF0ZQQFbHBGZWUIBQ0kdDAzODU0NTM4Njg2Al8xBAtwcm90b2NvbEZlZQgFDSR0MDM4NTQ1Mzg2ODYCXzIEFHNpZ21hRmVlUGVyTHBVcGRhdGVkCAUNJHQwMzg1NDUzODY4NgJfMwkAlwoFBQx0YXJnZXRBbW91bnQFEmZpbmFsQXNzZXRCYWxhbmNlcwUFbHBGZWUFC3Byb3RvY29sRmVlBRRzaWdtYUZlZVBlckxwVXBkYXRlZAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLhYBaQEEaW5pdA4HYXNzZXRzXw1hc3NldFdlaWdodHNfCmxwRmVlUmF0ZV8QcHJvdG9jb2xGZWVSYXRlXwxscFRva2VuTmFtZV8NbHBUb2tlbkRlc2NyXxBscFRva2VuRGVjaW1hbHNfF21heEFsbG9jYXRpb25BbXBsaWZpZXJfEHdlaWdodEFtcGxpZmllcl8Nc2xpcHBhZ2VSYXRlXwtmZWVNYXhSYXRlXxRwcm90b2NvbEZlZUNvbnRyYWN0XwpwcmVjaXNpb25fB3BhdXNlcl8EA2VycgMDAwMDAwMDAwMDAwMDAwMDCQERX29ubHlUaGlzQ29udHJhY3QBCAUBaQZjYWxsZXIJARNfd2hlbk5vdEluaXRpYWxpemVkAAcJARBfd2hlbk11bHRpc2lnU2V0AAcJAQ9fdmFsaWRhdGVBc3NldHMCBQdhc3NldHNfAhRpbml0OiBpbnZhbGlkIGFzc2V0cwcJARBfdmFsaWRhdGVJbnRMaXN0BAUNYXNzZXRXZWlnaHRzXwABBQpNQVhfV0VJR0hUAhppbml0OiBpbnZhbGlkIGFzc2V0V2VpZ2h0cwcJARJfdmFsaWRhdGVJbnRFcXVhbHMDCQCQAwEFB2Fzc2V0c18JAJADAQUNYXNzZXRXZWlnaHRzXwIfaW5pdDogaW52YWxpZCBhc3NldFdlaWdodHMgc2l6ZQcJAQxfdmFsaWRhdGVJbnQEBQpscEZlZVJhdGVfAAAFB01BWF9GRUUCFGluaXQ6IGludmFsaWQgbHAgZmVlBwkBDF92YWxpZGF0ZUludAQFEHByb3RvY29sRmVlUmF0ZV8AAAUHTUFYX0ZFRQIaaW5pdDogaW52YWxpZCBwcm90b2NvbCBmZWUHCQESX3ZhbGlkYXRlVG9rZW5OYW1lAgUMbHBUb2tlbk5hbWVfAhJpbml0OiBpbnZhbGlkIG5hbWUHCQETX3ZhbGlkYXRlVG9rZW5EZXNjcgIFDWxwVG9rZW5EZXNjcl8CE2luaXQ6IGludmFsaWQgZGVzY3IHCQERX3ZhbGlkYXRlRGVjaW1hbHMCBRBscFRva2VuRGVjaW1hbHNfAhZpbml0OiBpbnZhbGlkIGRlY2ltYWxzBwkBDF92YWxpZGF0ZUludAQFF21heEFsbG9jYXRpb25BbXBsaWZpZXJfAAAFDU1BWF9BTVBMSUZJRVICJGluaXQ6IGludmFsaWQgbWF4QWxsb2NhdGlvbkFtcGxpZmllcgcJAQxfdmFsaWRhdGVJbnQEBRB3ZWlnaHRBbXBsaWZpZXJfAAAFF21heEFsbG9jYXRpb25BbXBsaWZpZXJfAh1pbml0OiBpbnZhbGlkIHdlaWdodEFtcGxpZmllcgcJAQxfdmFsaWRhdGVJbnQEBQ1zbGlwcGFnZVJhdGVfAAAFB01BWF9JTlQCGmluaXQ6IGludmFsaWQgc2xpcHBhZ2VSYXRlBwkBDF92YWxpZGF0ZUludAQFC2ZlZU1heFJhdGVfAAAFB01BWF9JTlQCGGluaXQ6IGludmFsaWQgZmVlTWF4UmF0ZQcJARBfdmFsaWRhdGVBZGRyZXNzAgUUcHJvdG9jb2xGZWVDb250cmFjdF8CIWluaXQ6IGludmFsaWQgcHJvdG9jb2xGZWVDb250cmFjdAcJAQxfdmFsaWRhdGVJbnQEBQpwcmVjaXNpb25fAAEFB01BWF9JTlQCF2luaXQ6IGludmFsaWQgcHJlY2lzaW9uBwkBEF92YWxpZGF0ZUFkZHJlc3MCBQdwYXVzZXJfAhRpbml0OiBpbnZhbGlkIHBhdXNlcgcDCQAAAgUDZXJyBQNlcnIEDSR0MDQwNTQ5NDA2MTgJARRfcHJlcGFyZUFzc2V0V2VpZ2h0cwEFDWFzc2V0V2VpZ2h0c18EDGFzc2V0V2VpZ2h0cwgFDSR0MDQwNTQ5NDA2MTgCXzEEC3NpZ21hV2VpZ2h0CAUNJHQwNDA1NDk0MDYxOAJfMgQNYXNzZXRCYWxhbmNlcwkBFV9wcmVwYXJlQXNzZXRCYWxhbmNlcwEFB2Fzc2V0c18EBWlzc3VlCQDCCAUFDGxwVG9rZW5OYW1lXwUNbHBUb2tlbkRlc2NyXwAABRBscFRva2VuRGVjaW1hbHNfBgQJbHBBc3NldElkCQC4CAEFBWlzc3VlBA5zdG9yYWdlVXBkYXRlZAkAnAoKBQlscEFzc2V0SWQGAAAFCmxwRmVlUmF0ZV8FEHByb3RvY29sRmVlUmF0ZV8FF21heEFsbG9jYXRpb25BbXBsaWZpZXJfBRB3ZWlnaHRBbXBsaWZpZXJfBQ1zbGlwcGFnZVJhdGVfBQtmZWVNYXhSYXRlXwkBEUBleHRyTmF0aXZlKDEwNjIpAQUUcHJvdG9jb2xGZWVDb250cmFjdF8JAJQKAgkAzggCCQDOCAIJAM4IAgkAzggCCQDOCAIJAM4IAgkAzggCCQDMCAIFBWlzc3VlBQNuaWwJAQxfc2F2ZVN0b3JhZ2UBBQ5zdG9yYWdlVXBkYXRlZAkBC19zYXZlQXNzZXRzAQUHYXNzZXRzXwkBEl9zYXZlQXNzZXRCYWxhbmNlcwEFDWFzc2V0QmFsYW5jZXMJARFfc2F2ZUFzc2V0V2VpZ2h0cwEFDGFzc2V0V2VpZ2h0cwkBDl9zYXZlUHJlY2lzaW9uAQUKcHJlY2lzaW9uXwkBEl9zYXZlU2lnbWFGZWVQZXJMcAEJARJfbG9hZFNpZ21hRmVlUGVyTHAACQELX3NhdmVQYXVzZXIBCQERQGV4dHJOYXRpdmUoMTA2MikBBQdwYXVzZXJfBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCmRlcG9zaXRBbGwBB2Ftb3VudF8EA2VycgMDCQEQX3doZW5Jbml0aWFsaXplZAAJAQ5fd2hlbk5vdFBhdXNlZAAHCQEMX3ZhbGlkYXRlSW50BAUHYW1vdW50XwAABQdNQVhfSU5UAhpkZXBvc2l0QWxsOiBpbnZhbGlkIGFtb3VudAcDCQAAAgUDZXJyBQNlcnIEB3N0b3JhZ2UJAQxfbG9hZFN0b3JhZ2UABAlscEFzc2V0SWQIBQdzdG9yYWdlAl8xBApscERlY2ltYWxzCQEMX2dldERlY2ltYWxzAQkA2AQBBQlscEFzc2V0SWQEBmFzc2V0cwkBC19sb2FkQXNzZXRzAAQNJHQwNDIzNjg0MjQ1MwkBC19kZXBvc2l0QWxsAQUHYW1vdW50XwQObHBUb2tlbnNUb01pbnQIBQ0kdDA0MjM2ODQyNDUzAl8xBBlyZXF1aXJlZEFtb3VudHNOb3JtYWxpemVkCAUNJHQwNDIzNjg0MjQ1MwJfMgQNYXNzZXRCYWxhbmNlcwgFDSR0MDQyMzY4NDI0NTMCXzMKAQhmb2xkRnVuYwIDYWNjBGVsZW0EBWluZGV4CAUDYWNjAl8xBA9wYXltZW50QXNzZXRTdHIJAQtfYXNzZXRUb1N0cgEICQCRAwIIBQFpCHBheW1lbnRzBQVpbmRleAdhc3NldElkBBRwYXltZW50QXNzZXREZWNpbWFscwkBDF9nZXREZWNpbWFscwEFD3BheW1lbnRBc3NldFN0cgQYcmVxdWlyZWRBbW91bnROb3JtYWxpemVkCQCRAwIFGXJlcXVpcmVkQW1vdW50c05vcm1hbGl6ZWQFBWluZGV4BA5yZXF1aXJlZEFtb3VudAkBEl9ub3JtYWxpemVEZWNpbWFscwQFGHJlcXVpcmVkQW1vdW50Tm9ybWFsaXplZAUKbHBEZWNpbWFscwUUcGF5bWVudEFzc2V0RGVjaW1hbHMFB0NFSUxJTkcEBGVycjEDCQECIT0CBQ9wYXltZW50QXNzZXRTdHIFBGVsZW0JAAIBCQCsAgICI2RlcG9zaXRBbGw6IGludmFsaWQgcGF5bWVudDogaW5kZXg9CQCkAwEFBWluZGV4AwkAZwIAAAUOcmVxdWlyZWRBbW91bnQJAAIBAiZkZXBvc2l0QWxsOiB0b28gbGl0dGxlIGFtb3VudCByZXF1aXJlZAUEdW5pdAMJAAACBQRlcnIxBQRlcnIxBAZjaGFuZ2UDCQBmAggJAJEDAggFAWkIcGF5bWVudHMFBWluZGV4BmFtb3VudAUOcmVxdWlyZWRBbW91bnQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyCQBlAggJAJEDAggFAWkIcGF5bWVudHMFBWluZGV4BmFtb3VudAUOcmVxdWlyZWRBbW91bnQICQCRAwIIBQFpCHBheW1lbnRzBQVpbmRleAdhc3NldElkBQNuaWwDCQBmAgUOcmVxdWlyZWRBbW91bnQICQCRAwIIBQFpCHBheW1lbnRzBQVpbmRleAZhbW91bnQJAAIBCQCsAgIJAKwCAgkArAICAihkZXBvc2l0QWxsOiBpbnN1ZmZpY2llbnQgcGF5bWVudCwgaW5kZXg9CQCkAwEFBWluZGV4AgssIHJlcXVpcmVkPQkApAMBBQ5yZXF1aXJlZEFtb3VudAUDbmlsCQCUCgIJAGQCBQVpbmRleAABCQDOCAIIBQNhY2MCXzIFBmNoYW5nZQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgQNJHQwNDM1OTY0MzY1OAoAAiRsBQZhc3NldHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIAAAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQhmb2xkRnVuYwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgQDaWR4CAUNJHQwNDM1OTY0MzY1OAJfMQQNY2hhbmdlQWN0aW9ucwgFDSR0MDQzNTk2NDM2NTgCXzIEDnN0b3JhZ2VVcGRhdGVkCQCcCgoIBQdzdG9yYWdlAl8xCAUHc3RvcmFnZQJfMgkAZAIIBQdzdG9yYWdlAl8zBQ5scFRva2Vuc1RvTWludAgFB3N0b3JhZ2UCXzQIBQdzdG9yYWdlAl81CAUHc3RvcmFnZQJfNggFB3N0b3JhZ2UCXzcIBQdzdG9yYWdlAl84CAUHc3RvcmFnZQJfOQgFB3N0b3JhZ2UDXzEwCQCUCgIJAM4IAgkAzggCCQDOCAIJAMwIAgkBB1JlaXNzdWUDBQlscEFzc2V0SWQFDmxwVG9rZW5zVG9NaW50BgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFDmxwVG9rZW5zVG9NaW50BQlscEFzc2V0SWQFA25pbAkBDF9zYXZlU3RvcmFnZQEFDnN0b3JhZ2VVcGRhdGVkCQESX3NhdmVBc3NldEJhbGFuY2VzAQUNYXNzZXRCYWxhbmNlcwUNY2hhbmdlQWN0aW9ucwUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQdkZXBvc2l0AQxtaW5McEFtb3VudF8EA2VycgkBDF92YWxpZGF0ZUludAQFDG1pbkxwQW1vdW50XwAABQdNQVhfSU5UAh5kZXBvc2l0OiBpbnZhbGlkIG1pbiBscCBhbW91bnQDCQAAAgUDZXJyBQNlcnIEB3N0b3JhZ2UJAQxfbG9hZFN0b3JhZ2UABAlscEFzc2V0SWQIBQdzdG9yYWdlAl8xBAxscEFzc2V0SWRTdHIJAQtfYXNzZXRUb1N0cgEFCWxwQXNzZXRJZAQKbHBEZWNpbWFscwkBDF9nZXREZWNpbWFscwEFDGxwQXNzZXRJZFN0cgQEZXJyMQMDAwMJARBfd2hlbkluaXRpYWxpemVkAAkBDl93aGVuTm90UGF1c2VkAAcJARJfdmFsaWRhdGVJbnRFcXVhbHMDCQCQAwEIBQFpCHBheW1lbnRzAAECHmRlcG9zaXQ6IGludmFsaWQgcGF5bWVudHMgc2l6ZQcJARVfdmFsaWRhdGVMaXN0Q29udGFpbnMDCQELX2xvYWRBc3NldHMACQELX2Fzc2V0VG9TdHIBCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQCHmRlcG9zaXQ6IGludmFsaWQgcGF5bWVudCBhc3NldAcJAQxfdmFsaWRhdGVJbnQECAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAABBQdNQVhfSU5UAh9kZXBvc2l0OiBpbnZhbGlkIHBheW1lbnQgYW1vdW50BwMJAAACBQRlcnIxBQRlcnIxBAhhc3NldFN0cgkBC19hc3NldFRvU3RyAQgJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBA1hc3NldERlY2ltYWxzCQEMX2dldERlY2ltYWxzAQUIYXNzZXRTdHIEEGFtb3VudE5vcm1hbGl6ZWQJARJfbm9ybWFsaXplRGVjaW1hbHMECAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAUNYXNzZXREZWNpbWFscwUKbHBEZWNpbWFscwUERE9XTgQNJHQwNDUwNzA0NTE4NgkBCF9kZXBvc2l0AgUIYXNzZXRTdHIFEGFtb3VudE5vcm1hbGl6ZWQEDmxwVG9rZW5zVG9NaW50CAUNJHQwNDUwNzA0NTE4NgJfMQQNYXNzZXRCYWxhbmNlcwgFDSR0MDQ1MDcwNDUxODYCXzIEBWxwRmVlCAUNJHQwNDUwNzA0NTE4NgJfMwQLcHJvdG9jb2xGZWUIBQ0kdDA0NTA3MDQ1MTg2Al80BBRzaWdtYUZlZVBlckxwVXBkYXRlZAgFDSR0MDQ1MDcwNDUxODYCXzUEDmxwVG9rZW5zVG9TZW5kCQBlAgkAZQIFDmxwVG9rZW5zVG9NaW50BQVscEZlZQULcHJvdG9jb2xGZWUEBGVycjIJAQxfdmFsaWRhdGVJbnQEBQ5scFRva2Vuc1RvU2VuZAUMbWluTHBBbW91bnRfBQdNQVhfSU5UAhZkZXBvc2l0OiBsZXNzIHRoYW4gbWluAwkAAAIFBGVycjIFBGVycjIEDnN0b3JhZ2VVcGRhdGVkCQCcCgoIBQdzdG9yYWdlAl8xCAUHc3RvcmFnZQJfMgkAZAIIBQdzdG9yYWdlAl8zBQ5scFRva2Vuc1RvTWludAgFB3N0b3JhZ2UCXzQIBQdzdG9yYWdlAl81CAUHc3RvcmFnZQJfNggFB3N0b3JhZ2UCXzcIBQdzdG9yYWdlAl84CAUHc3RvcmFnZQJfOQgFB3N0b3JhZ2UDXzEwCQCUCgIJAM4IAgkAzggCCQDOCAIJAM4IAgkAzggCCQDMCAIJAQdSZWlzc3VlAwUJbHBBc3NldElkBQ5scFRva2Vuc1RvTWludAYJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQ5scFRva2Vuc1RvU2VuZAUJbHBBc3NldElkBQNuaWwJAQxfc2F2ZVN0b3JhZ2UBBQ5zdG9yYWdlVXBkYXRlZAkBEl9zYXZlQXNzZXRCYWxhbmNlcwEFDWFzc2V0QmFsYW5jZXMJAQpfc2F2ZUxwRmVlAgUMbHBBc3NldElkU3RyCQBkAgUFbHBGZWUJAQpfbG9hZExwRmVlAQUMbHBBc3NldElkU3RyCQEQX3NhdmVQcm90b2NvbEZlZQIFDGxwQXNzZXRJZFN0cgkAZAIFC3Byb3RvY29sRmVlCQEQX2xvYWRQcm90b2NvbEZlZQEFDGxwQXNzZXRJZFN0cgkBEl9zYXZlU2lnbWFGZWVQZXJMcAEFFHNpZ21hRmVlUGVyTHBVcGRhdGVkBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBC3dpdGhkcmF3QWxsAAQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQAECWxwQXNzZXRJZAgFB3N0b3JhZ2UCXzEEDGxwQXNzZXRJZFN0cgkA2AQBBQlscEFzc2V0SWQECmxwRGVjaW1hbHMJAQxfZ2V0RGVjaW1hbHMBBQxscEFzc2V0SWRTdHIEBmFzc2V0cwkBC19sb2FkQXNzZXRzAAQDZXJyAwMDAwkBEF93aGVuSW5pdGlhbGl6ZWQACQEOX3doZW5Ob3RQYXVzZWQABwkBEl92YWxpZGF0ZUludEVxdWFscwMJAJADAQgFAWkIcGF5bWVudHMAAQIid2l0aGRyYXdBbGw6IGludmFsaWQgcGF5bWVudHMgc2l6ZQcJARRfdmFsaWRhdGVTdHJpbmdFcXVhbAMFDGxwQXNzZXRJZFN0cgkBC19hc3NldFRvU3RyAQgJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkAiJ3aXRoZHJhd0FsbDogaW52YWxpZCBwYXltZW50IGFzc2V0BwkBDF92YWxpZGF0ZUludAQICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50AAEFB01BWF9JTlQCI3dpdGhkcmF3QWxsOiBpbnZhbGlkIHBheW1lbnQgYW1vdW50BwMJAAACBQNlcnIFA2VycgQNJHQwNDY2NzU0Njc2MgkBDF93aXRoZHJhd0FsbAEICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BA5scFRva2Vuc1RvQnVybggFDSR0MDQ2Njc1NDY3NjICXzEEDWJhbGFuY2VzVG9QYXkIBQ0kdDA0NjY3NTQ2NzYyAl8yBA1hc3NldEJhbGFuY2VzCAUNJHQwNDY2NzU0Njc2MgJfMwQOcGF5bWVudEFjdGlvbnMJARhfZ2V0UGF5bWVudHNGcm9tQmFsYW5jZXMEBQZhc3NldHMFDWJhbGFuY2VzVG9QYXkIBQFpBmNhbGxlcgUKbHBEZWNpbWFscwQOc3RvcmFnZVVwZGF0ZWQJAJwKCggFB3N0b3JhZ2UCXzEIBQdzdG9yYWdlAl8yCQBlAggFB3N0b3JhZ2UCXzMFDmxwVG9rZW5zVG9CdXJuCAUHc3RvcmFnZQJfNAgFB3N0b3JhZ2UCXzUIBQdzdG9yYWdlAl82CAUHc3RvcmFnZQJfNwgFB3N0b3JhZ2UCXzgIBQdzdG9yYWdlAl85CAUHc3RvcmFnZQNfMTAJAJQKAgkAzggCCQDOCAIJAM4IAgkAzAgCCQEEQnVybgIFCWxwQXNzZXRJZAUObHBUb2tlbnNUb0J1cm4FA25pbAUOcGF5bWVudEFjdGlvbnMJAQxfc2F2ZVN0b3JhZ2UBBQ5zdG9yYWdlVXBkYXRlZAkBEl9zYXZlQXNzZXRCYWxhbmNlcwEFDWFzc2V0QmFsYW5jZXMFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEId2l0aGRyYXcCCGFzc2V0SWRfCm1pbkFtb3VudF8EB3N0b3JhZ2UJAQxfbG9hZFN0b3JhZ2UABAlscEFzc2V0SWQIBQdzdG9yYWdlAl8xBAxscEFzc2V0SWRTdHIJANgEAQUJbHBBc3NldElkBApscERlY2ltYWxzCQEMX2dldERlY2ltYWxzAQUMbHBBc3NldElkU3RyBAZhc3NldHMJAQtfbG9hZEFzc2V0cwAEA2VycgMDAwMDAwkBEF93aGVuSW5pdGlhbGl6ZWQACQEOX3doZW5Ob3RQYXVzZWQABwkBEl92YWxpZGF0ZUludEVxdWFscwMJAJADAQgFAWkIcGF5bWVudHMAAQIfd2l0aGRyYXc6IGludmFsaWQgcGF5bWVudHMgc2l6ZQcJARRfdmFsaWRhdGVTdHJpbmdFcXVhbAMFDGxwQXNzZXRJZFN0cgkBC19hc3NldFRvU3RyAQgJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkAh93aXRoZHJhdzogaW52YWxpZCBwYXltZW50IGFzc2V0BwkBDF92YWxpZGF0ZUludAQICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50AAEFB01BWF9JTlQCIHdpdGhkcmF3OiBpbnZhbGlkIHBheW1lbnQgYW1vdW50BwkBFV92YWxpZGF0ZUxpc3RDb250YWlucwMFBmFzc2V0cwUIYXNzZXRJZF8CGXdpdGhkcmF3OiBpbnZhbGlkIGFzc2V0SWQHCQEMX3ZhbGlkYXRlSW50BAUKbWluQW1vdW50XwAABQdNQVhfSU5UAht3aXRoZHJhdzogaW52YWxpZCBtaW5BbW91bnQHAwkAAAIFA2VycgUDZXJyBA0kdDA0ODA4ODQ4MjIyCQEJX3dpdGhkcmF3AgUIYXNzZXRJZF8ICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BBZ0YXJnZXRBbW91bnROb3JtYWxpemVkCAUNJHQwNDgwODg0ODIyMgJfMQQSZmluYWxBc3NldEJhbGFuY2VzCAUNJHQwNDgwODg0ODIyMgJfMgQFbHBGZWUIBQ0kdDA0ODA4ODQ4MjIyAl8zBAtwcm90b2NvbEZlZQgFDSR0MDQ4MDg4NDgyMjICXzQEFHNpZ21hRmVlUGVyTHBVcGRhdGVkCAUNJHQwNDgwODg0ODIyMgJfNQQVZmluYWxBbW91bnROb3JtYWxpemVkCQBlAgkAZQIFFnRhcmdldEFtb3VudE5vcm1hbGl6ZWQFBWxwRmVlBQtwcm90b2NvbEZlZQQOdGFyZ2V0RGVjaW1hbHMJAQxfZ2V0RGVjaW1hbHMBBQhhc3NldElkXwQLZmluYWxBbW91bnQJARJfbm9ybWFsaXplRGVjaW1hbHMEBRVmaW5hbEFtb3VudE5vcm1hbGl6ZWQFCmxwRGVjaW1hbHMFDnRhcmdldERlY2ltYWxzBQRET1dOBARlcnIxCQEMX3ZhbGlkYXRlSW50BAULZmluYWxBbW91bnQFCm1pbkFtb3VudF8FB01BWF9JTlQCF3dpdGhkcmF3OiBsZXNzIHRoYW4gbWluAwkAAAIFBGVycjEFBGVycjEEDnN0b3JhZ2VVcGRhdGVkCQCcCgoIBQdzdG9yYWdlAl8xCAUHc3RvcmFnZQJfMgkAZQIIBQdzdG9yYWdlAl8zCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAgFB3N0b3JhZ2UCXzQIBQdzdG9yYWdlAl81CAUHc3RvcmFnZQJfNggFB3N0b3JhZ2UCXzcIBQdzdG9yYWdlAl84CAUHc3RvcmFnZQJfOQgFB3N0b3JhZ2UDXzEwCQCUCgIJAM4IAgkAzggCCQDOCAIJAM4IAgkAzggCCQDMCAIJAQRCdXJuAgUJbHBBc3NldElkCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFC2ZpbmFsQW1vdW50CQELX3N0clRvQXNzZXQBBQhhc3NldElkXwUDbmlsCQEMX3NhdmVTdG9yYWdlAQUOc3RvcmFnZVVwZGF0ZWQJARJfc2F2ZUFzc2V0QmFsYW5jZXMBBRJmaW5hbEFzc2V0QmFsYW5jZXMJAQpfc2F2ZUxwRmVlAgUIYXNzZXRJZF8JAGQCBQVscEZlZQkBCl9sb2FkTHBGZWUBBQhhc3NldElkXwkBEF9zYXZlUHJvdG9jb2xGZWUCBQhhc3NldElkXwkAZAIFC3Byb3RvY29sRmVlCQEQX2xvYWRQcm90b2NvbEZlZQEFCGFzc2V0SWRfCQESX3NhdmVTaWdtYUZlZVBlckxwAQUUc2lnbWFGZWVQZXJMcFVwZGF0ZWQFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEEc3dhcAIOdGFyZ2V0QXNzZXRJZF8KbWluQW1vdW50XwQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQAECWxwQXNzZXRJZAgFB3N0b3JhZ2UCXzEECmxwRGVjaW1hbHMJAQxfZ2V0RGVjaW1hbHMBCQDYBAEFCWxwQXNzZXRJZAQGYXNzZXRzCQELX2xvYWRBc3NldHMABA5zb3VyY2VBc3NldFN0cgkBC19hc3NldFRvU3RyAQgJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBBZzb3VyY2VBbW91bnROb3JtYWxpemVkCQESX25vcm1hbGl6ZURlY2ltYWxzBAgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQJAQxfZ2V0RGVjaW1hbHMBBQ5zb3VyY2VBc3NldFN0cgUKbHBEZWNpbWFscwUERE9XTgQQc291cmNlQXNzZXRJbmRleAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDPCAIFBmFzc2V0cwUOc291cmNlQXNzZXRTdHICGnN3YXA6IGludmFsaWQgc291cmNlIGFzc2V0AwkAAAIFEHNvdXJjZUFzc2V0SW5kZXgFEHNvdXJjZUFzc2V0SW5kZXgEEHRhcmdldEFzc2V0SW5kZXgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAzwgCBQZhc3NldHMFDnRhcmdldEFzc2V0SWRfAhpzd2FwOiBpbnZhbGlkIHRhcmdldCBhc3NldAMJAAACBRB0YXJnZXRBc3NldEluZGV4BRB0YXJnZXRBc3NldEluZGV4BANlcnIDAwMDAwkBEF93aGVuSW5pdGlhbGl6ZWQACQEOX3doZW5Ob3RQYXVzZWQABwkBDF92YWxpZGF0ZUludAQFCm1pbkFtb3VudF8AAAUHTUFYX0lOVAIfc3dhcDogaW52YWxpZCBtaW4gdGFyZ2V0IGFtb3VudAcJAQxfdmFsaWRhdGVJbnQEBRZzb3VyY2VBbW91bnROb3JtYWxpemVkAAEFB01BWF9JTlQCG3N3YXA6IGludmFsaWQgc291cmNlIGFtb3VudAcJARRfdmFsaWRhdGVTdHJpbmdOb3RFcQMFDnNvdXJjZUFzc2V0U3RyBQ50YXJnZXRBc3NldElkXwIRc3dhcDogc2FtZSBhc3NldHMHCQESX3ZhbGlkYXRlSW50RXF1YWxzAwkAkAMBCAUBaQhwYXltZW50cwABAhtzd2FwOiBpbnZhbGlkIHBheW1lbnRzIHNpemUHAwkAAAIFA2VycgUDZXJyBA0kdDA1MDMwNzUwNDY1CQEFX3N3YXADBRBzb3VyY2VBc3NldEluZGV4BRB0YXJnZXRBc3NldEluZGV4BRZzb3VyY2VBbW91bnROb3JtYWxpemVkBBZ0YXJnZXRBbW91bnROb3JtYWxpemVkCAUNJHQwNTAzMDc1MDQ2NQJfMQQSZmluYWxBc3NldEJhbGFuY2VzCAUNJHQwNTAzMDc1MDQ2NQJfMgQFbHBGZWUIBQ0kdDA1MDMwNzUwNDY1Al8zBAtwcm90b2NvbEZlZQgFDSR0MDUwMzA3NTA0NjUCXzQEFHNpZ21hRmVlUGVyTHBVcGRhdGVkCAUNJHQwNTAzMDc1MDQ2NQJfNQQVZmluYWxBbW91bnROb3JtYWxpemVkCQBlAgkAZQIFFnRhcmdldEFtb3VudE5vcm1hbGl6ZWQFBWxwRmVlBQtwcm90b2NvbEZlZQQOdGFyZ2V0RGVjaW1hbHMJAQxfZ2V0RGVjaW1hbHMBBQ50YXJnZXRBc3NldElkXwQLZmluYWxBbW91bnQJARJfbm9ybWFsaXplRGVjaW1hbHMEBRVmaW5hbEFtb3VudE5vcm1hbGl6ZWQFCmxwRGVjaW1hbHMFDnRhcmdldERlY2ltYWxzBQRET1dOBARlcnIxCQEMX3ZhbGlkYXRlSW50BAULZmluYWxBbW91bnQFCm1pbkFtb3VudF8FB01BWF9JTlQCE3N3YXA6IGxlc3MgdGhhbiBtaW4DCQAAAgUEZXJyMQUEZXJyMQkAlAoCCQDOCAIJAM4IAgkAzggCCQDOCAIJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQtmaW5hbEFtb3VudAkBC19zdHJUb0Fzc2V0AQUOdGFyZ2V0QXNzZXRJZF8FA25pbAkBEl9zYXZlQXNzZXRCYWxhbmNlcwEFEmZpbmFsQXNzZXRCYWxhbmNlcwkBCl9zYXZlTHBGZWUCBQ50YXJnZXRBc3NldElkXwkAZAIFBWxwRmVlCQEKX2xvYWRMcEZlZQEFDnRhcmdldEFzc2V0SWRfCQEQX3NhdmVQcm90b2NvbEZlZQIFDnRhcmdldEFzc2V0SWRfCQBkAgULcHJvdG9jb2xGZWUJARBfbG9hZFByb3RvY29sRmVlAQUOdGFyZ2V0QXNzZXRJZF8JARJfc2F2ZVNpZ21hRmVlUGVyTHABBRRzaWdtYUZlZVBlckxwVXBkYXRlZAUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQ1nZXREZXBvc2l0QWxsAQlscEFtb3VudF8EA2VycgkBDF92YWxpZGF0ZUludAQFCWxwQW1vdW50XwABBQdNQVhfSU5UAh1nZXREZXBvc2l0QWxsOiBpbnZhbGlkIGFtb3VudAMJAAACBQNlcnIFA2VycgQNJHQwNTE1ODU1MTY3MgkBC19kZXBvc2l0QWxsAQUJbHBBbW91bnRfBA5scFRva2Vuc1RvTWludAgFDSR0MDUxNTg1NTE2NzICXzEEGXJlcXVpcmVkQW1vdW50c05vcm1hbGl6ZWQIBQ0kdDA1MTU4NTUxNjcyAl8yBA1hc3NldEJhbGFuY2VzCAUNJHQwNTE1ODU1MTY3MgJfMwkAlAoCBQNuaWwJAJQKAgUObHBUb2tlbnNUb01pbnQFGXJlcXVpcmVkQW1vdW50c05vcm1hbGl6ZWQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEKZ2V0RGVwb3NpdAIIYXNzZXRJZF8HYW1vdW50XwQDZXJyAwkBFV92YWxpZGF0ZUxpc3RDb250YWlucwMJAQtfbG9hZEFzc2V0cwAFCGFzc2V0SWRfAhlnZXREZXBvc2l0OiBpbnZhbGlkIGFzc2V0CQEMX3ZhbGlkYXRlSW50BAUHYW1vdW50XwABBQdNQVhfSU5UAhpnZXREZXBvc2l0OiBpbnZhbGlkIGFtb3VudAcDCQAAAgUDZXJyBQNlcnIEB3N0b3JhZ2UJAQxfbG9hZFN0b3JhZ2UABAlscEFzc2V0SWQIBQdzdG9yYWdlAl8xBApscERlY2ltYWxzCQEMX2dldERlY2ltYWxzAQkA2AQBBQlscEFzc2V0SWQEDWFzc2V0RGVjaW1hbHMJAQxfZ2V0RGVjaW1hbHMBBQhhc3NldElkXwQQYW1vdW50Tm9ybWFsaXplZAkBEl9ub3JtYWxpemVEZWNpbWFscwQFB2Ftb3VudF8FDWFzc2V0RGVjaW1hbHMFCmxwRGVjaW1hbHMFBERPV04EDSR0MDUyNDMxNTI1NDcJAQhfZGVwb3NpdAIFCGFzc2V0SWRfBRBhbW91bnROb3JtYWxpemVkBA5scFRva2Vuc1RvTWludAgFDSR0MDUyNDMxNTI1NDcCXzEEDWFzc2V0QmFsYW5jZXMIBQ0kdDA1MjQzMTUyNTQ3Al8yBAVscEZlZQgFDSR0MDUyNDMxNTI1NDcCXzMEC3Byb3RvY29sRmVlCAUNJHQwNTI0MzE1MjU0NwJfNAQUc2lnbWFGZWVQZXJMcFVwZGF0ZWQIBQ0kdDA1MjQzMTUyNTQ3Al81BA5scFRva2Vuc1RvU2VuZAkAZQIJAGUCBQ5scFRva2Vuc1RvTWludAUFbHBGZWUFC3Byb3RvY29sRmVlCQCUCgIFA25pbAUObHBUb2tlbnNUb1NlbmQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEOZ2V0V2l0aGRyYXdBbGwBCWxwQW1vdW50XwQDZXJyCQEMX3ZhbGlkYXRlSW50BAUJbHBBbW91bnRfAAAFB01BWF9JTlQCHmdldFdpdGhkcmF3QWxsOiBpbnZhbGlkIGFtb3VudAMJAAACBQNlcnIFA2VycgQNJHQwNTI5ODY1MzA2MgkBDF93aXRoZHJhd0FsbAEFCWxwQW1vdW50XwQObHBUb2tlbnNUb0J1cm4IBQ0kdDA1Mjk4NjUzMDYyAl8xBA1iYWxhbmNlc1RvR2V0CAUNJHQwNTI5ODY1MzA2MgJfMgQNYXNzZXRCYWxhbmNlcwgFDSR0MDUyOTg2NTMwNjICXzMJAJQKAgUDbmlsBQ1iYWxhbmNlc1RvR2V0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBC2dldFdpdGhkcmF3Aghhc3NldElkXwdhbW91bnRfBANlcnIDCQEVX3ZhbGlkYXRlTGlzdENvbnRhaW5zAwkBC19sb2FkQXNzZXRzAAUIYXNzZXRJZF8CGmdldFdpdGhkcmF3OiBpbnZhbGlkIGFzc2V0CQEMX3ZhbGlkYXRlSW50BAUHYW1vdW50XwABBQdNQVhfSU5UAhtnZXRXaXRoZHJhdzogaW52YWxpZCBhbW91bnQHAwkAAAIFA2VycgUDZXJyBAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAQJbHBBc3NldElkCAUHc3RvcmFnZQJfMQQKbHBEZWNpbWFscwkBDF9nZXREZWNpbWFscwEJANgEAQUJbHBBc3NldElkBA0kdDA1MzcxMzUzODI5CQEJX3dpdGhkcmF3AgUIYXNzZXRJZF8FB2Ftb3VudF8EFnRhcmdldEFtb3VudE5vcm1hbGl6ZWQIBQ0kdDA1MzcxMzUzODI5Al8xBA1hc3NldEJhbGFuY2VzCAUNJHQwNTM3MTM1MzgyOQJfMgQFbHBGZWUIBQ0kdDA1MzcxMzUzODI5Al8zBAtwcm90b2NvbEZlZQgFDSR0MDUzNzEzNTM4MjkCXzQEFHNpZ21hRmVlUGVyTHBVcGRhdGVkCAUNJHQwNTM3MTM1MzgyOQJfNQQVZmluYWxBbW91bnROb3JtYWxpemVkCQBlAgkAZQIFFnRhcmdldEFtb3VudE5vcm1hbGl6ZWQFBWxwRmVlBQtwcm90b2NvbEZlZQQOdGFyZ2V0RGVjaW1hbHMJAQxfZ2V0RGVjaW1hbHMBBQhhc3NldElkXwQLZmluYWxBbW91bnQJARJfbm9ybWFsaXplRGVjaW1hbHMEBRVmaW5hbEFtb3VudE5vcm1hbGl6ZWQFCmxwRGVjaW1hbHMFDnRhcmdldERlY2ltYWxzBQRET1dOCQCUCgIFA25pbAULZmluYWxBbW91bnQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEHZ2V0U3dhcAMOc291cmNlQXNzZXRJZF8OdGFyZ2V0QXNzZXRJZF8Nc291cmNlQW1vdW50XwQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQAECWxwQXNzZXRJZAgFB3N0b3JhZ2UCXzEECmxwRGVjaW1hbHMJAQxfZ2V0RGVjaW1hbHMBCQDYBAEFCWxwQXNzZXRJZAQGYXNzZXRzCQELX2xvYWRBc3NldHMABBBzb3VyY2VBc3NldEluZGV4CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAM8IAgUGYXNzZXRzBQ5zb3VyY2VBc3NldElkXwIac3dhcDogaW52YWxpZCBzb3VyY2UgYXNzZXQDCQAAAgUQc291cmNlQXNzZXRJbmRleAUQc291cmNlQXNzZXRJbmRleAQQdGFyZ2V0QXNzZXRJbmRleAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDPCAIFBmFzc2V0cwUOdGFyZ2V0QXNzZXRJZF8CGnN3YXA6IGludmFsaWQgdGFyZ2V0IGFzc2V0AwkAAAIFEHRhcmdldEFzc2V0SW5kZXgFEHRhcmdldEFzc2V0SW5kZXgEFnNvdXJjZUFtb3VudE5vcm1hbGl6ZWQJARJfbm9ybWFsaXplRGVjaW1hbHMEBQ1zb3VyY2VBbW91bnRfCQEMX2dldERlY2ltYWxzAQUOc291cmNlQXNzZXRJZF8FCmxwRGVjaW1hbHMFBERPV04EA2VycgMJAQxfdmFsaWRhdGVJbnQEBRZzb3VyY2VBbW91bnROb3JtYWxpemVkAAEFB01BWF9JTlQCG3N3YXA6IGludmFsaWQgc291cmNlIGFtb3VudAkBFF92YWxpZGF0ZVN0cmluZ05vdEVxAwUOc291cmNlQXNzZXRJZF8FDnRhcmdldEFzc2V0SWRfAhFzd2FwOiBzYW1lIGFzc2V0cwcDCQAAAgUDZXJyBQNlcnIEDSR0MDU1MjQzNTU0MDEJAQVfc3dhcAMFEHNvdXJjZUFzc2V0SW5kZXgFEHRhcmdldEFzc2V0SW5kZXgFFnNvdXJjZUFtb3VudE5vcm1hbGl6ZWQEFnRhcmdldEFtb3VudE5vcm1hbGl6ZWQIBQ0kdDA1NTI0MzU1NDAxAl8xBBJmaW5hbEFzc2V0QmFsYW5jZXMIBQ0kdDA1NTI0MzU1NDAxAl8yBAVscEZlZQgFDSR0MDU1MjQzNTU0MDECXzMEC3Byb3RvY29sRmVlCAUNJHQwNTUyNDM1NTQwMQJfNAQUc2lnbWFGZWVQZXJMcFVwZGF0ZWQIBQ0kdDA1NTI0MzU1NDAxAl81BBVmaW5hbEFtb3VudE5vcm1hbGl6ZWQJAGUCCQBlAgUWdGFyZ2V0QW1vdW50Tm9ybWFsaXplZAUFbHBGZWUFC3Byb3RvY29sRmVlBA50YXJnZXREZWNpbWFscwkBDF9nZXREZWNpbWFscwEFDnRhcmdldEFzc2V0SWRfBAtmaW5hbEFtb3VudAkBEl9ub3JtYWxpemVEZWNpbWFscwQFFWZpbmFsQW1vdW50Tm9ybWFsaXplZAUKbHBEZWNpbWFscwUOdGFyZ2V0RGVjaW1hbHMFBERPV04JAJQKAgUDbmlsBQtmaW5hbEFtb3VudAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQhnZXRDbGFpbQEFdXNlcl8EBHVzZXIDCQBmAgkAsQIBBQV1c2VyXwAACQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQUFdXNlcl8CFmdldENsYWltOiBpbnZhbGlkIHVzZXIIBQFpBmNhbGxlcgQNJHQwNTYwNDM1NjA5OQkBC19jaGVja3BvaW50AQUEdXNlcgQRY2hlY2twb2ludEFjdGlvbnMIBQ0kdDA1NjA0MzU2MDk5Al8xBAt1c2VyUHJvZml0cwgFDSR0MDU2MDQzNTYwOTkCXzIJAJQKAgUDbmlsBQt1c2VyUHJvZml0cwFpAQtnZXRVdGlsRnVuYwAEB3N0b3JhZ2UJAQxfbG9hZFN0b3JhZ2UABA1scFRvdGFsU3VwcGx5CAUHc3RvcmFnZQJfMwQPd2VpZ2h0QW1wbGlmaWVyCAUHc3RvcmFnZQJfNwQMc2xpcHBhZ2VSYXRlCAUHc3RvcmFnZQJfOAQKZmVlTWF4UmF0ZQgFB3N0b3JhZ2UCXzkEDSR0MDU2NDMyNTY0OTIJARJfbG9hZEFzc2V0QmFsYW5jZXMABA1hc3NldEJhbGFuY2VzCAUNJHQwNTY0MzI1NjQ5MgJfMQQQYXNzZXRUb3RhbFN1cHBseQgFDSR0MDU2NDMyNTY0OTICXzIEDSR0MDU2NDk3NTY1NTAJARFfbG9hZEFzc2V0V2VpZ2h0cwAEDGFzc2V0V2VpZ2h0cwgFDSR0MDU2NDk3NTY1NTACXzEEC3NpZ21hV2VpZ2h0CAUNJHQwNTY0OTc1NjU1MAJfMgQDZmVlCQENX2NhbGN1bGF0ZUZlZQcFDWFzc2V0QmFsYW5jZXMFEGFzc2V0VG90YWxTdXBwbHkFDGFzc2V0V2VpZ2h0cwULc2lnbWFXZWlnaHQFD3dlaWdodEFtcGxpZmllcgUMc2xpcHBhZ2VSYXRlBQpmZWVNYXhSYXRlBAl1dGlsVmFsdWUJAGUCBRBhc3NldFRvdGFsU3VwcGx5BQNmZWUJAJQKAgUDbmlsCQCUCgIFCXV0aWxWYWx1ZQUNbHBUb3RhbFN1cHBseQFpAQpnZXRGZWVGdW5jAAQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQAED3dlaWdodEFtcGxpZmllcggFB3N0b3JhZ2UCXzcEDHNsaXBwYWdlUmF0ZQgFB3N0b3JhZ2UCXzgECmZlZU1heFJhdGUIBQdzdG9yYWdlAl85BA0kdDA1Njk4MjU3MDQyCQESX2xvYWRBc3NldEJhbGFuY2VzAAQNYXNzZXRCYWxhbmNlcwgFDSR0MDU2OTgyNTcwNDICXzEEEGFzc2V0VG90YWxTdXBwbHkIBQ0kdDA1Njk4MjU3MDQyAl8yBA0kdDA1NzA0NzU3MTAwCQERX2xvYWRBc3NldFdlaWdodHMABAxhc3NldFdlaWdodHMIBQ0kdDA1NzA0NzU3MTAwAl8xBAtzaWdtYVdlaWdodAgFDSR0MDU3MDQ3NTcxMDACXzIEA2ZlZQkBDV9jYWxjdWxhdGVGZWUHBQ1hc3NldEJhbGFuY2VzBRBhc3NldFRvdGFsU3VwcGx5BQxhc3NldFdlaWdodHMFC3NpZ21hV2VpZ2h0BQ93ZWlnaHRBbXBsaWZpZXIFDHNsaXBwYWdlUmF0ZQUKZmVlTWF4UmF0ZQkAlAoCBQNuaWwFA2ZlZQFpAQpjaGVja3BvaW50AQV1c2VyXwQDZXJyAwkBEF93aGVuSW5pdGlhbGl6ZWQACQEOX3doZW5Ob3RQYXVzZWQABwMJAAACBQNlcnIFA2VycgQEdXNlcgMJAGYCCQCxAgEFBXVzZXJfAAAJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBBQV1c2VyXwIYY2hlY2twb2ludDogaW52YWxpZCB1c2VyCAUBaQZjYWxsZXIJAQtfY2hlY2twb2ludAEFBHVzZXIJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEFc3Rha2UABANlcnIDCQEQX3doZW5Jbml0aWFsaXplZAAJAQ5fd2hlbk5vdFBhdXNlZAAHAwkAAAIFA2VycgUDZXJyBAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAQMbHBBc3NldElkU3RyCQELX2Fzc2V0VG9TdHIBCAUHc3RvcmFnZQJfMQQEZXJyMQMDCQESX3ZhbGlkYXRlSW50RXF1YWxzAwkAkAMBCAUBaQhwYXltZW50cwABAhxzdGFrZTogaW52YWxpZCBwYXltZW50cyBzaXplCQEUX3ZhbGlkYXRlU3RyaW5nRXF1YWwDBQxscEFzc2V0SWRTdHIJAQtfYXNzZXRUb1N0cgEICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAIcc3Rha2U6IGludmFsaWQgcGF5bWVudCBhc3NldAcJAQxfdmFsaWRhdGVJbnQECAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAAABQdNQVhfSU5UAh1zdGFrZTogaW52YWxpZCBwYXltZW50IGFtb3VudAcDCQAAAgUEZXJyMQUEZXJyMQQNJHQwNTgxMDg1ODE2OAkBC19jaGVja3BvaW50AQgFAWkGY2FsbGVyBBFjaGVja3BvaW50QWN0aW9ucwgFDSR0MDU4MTA4NTgxNjgCXzEEC3VzZXJQcm9maXRzCAUNJHQwNTgxMDg1ODE2OAJfMgkAlAoCCQDOCAIJAM4IAgURY2hlY2twb2ludEFjdGlvbnMJAQtfc2F2ZVVzZXJMcAIIBQFpBmNhbGxlcgkAZAIJAQtfbG9hZFVzZXJMcAEIBQFpBmNhbGxlcggJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQJAQxfc2F2ZVRvdGFsTHABCQBkAgkBDF9sb2FkVG90YWxMcAAICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBB3Vuc3Rha2UBB2Ftb3VudF8EA2VycgMJARBfd2hlbkluaXRpYWxpemVkAAkBDl93aGVuTm90UGF1c2VkAAcDCQAAAgUDZXJyBQNlcnIEB3N0b3JhZ2UJAQxfbG9hZFN0b3JhZ2UABAlscEFzc2V0SWQIBQdzdG9yYWdlAl8xBAZ1c2VyTHAJAQtfbG9hZFVzZXJMcAEIBQFpBmNhbGxlcgQEZXJyMQkBDF92YWxpZGF0ZUludAQFB2Ftb3VudF8AAAUGdXNlckxwAhd1bnN0YWtlOiBpbnZhbGlkIGFtb3VudAMJAAACBQRlcnIxBQRlcnIxBA0kdDA1ODY3OTU4NzM5CQELX2NoZWNrcG9pbnQBCAUBaQZjYWxsZXIEEWNoZWNrcG9pbnRBY3Rpb25zCAUNJHQwNTg2Nzk1ODczOQJfMQQLdXNlclByb2ZpdHMIBQ0kdDA1ODY3OTU4NzM5Al8yCQCUCgIJAM4IAgkAzggCCQDOCAIJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQdhbW91bnRfBQlscEFzc2V0SWQFA25pbAURY2hlY2twb2ludEFjdGlvbnMJAQtfc2F2ZVVzZXJMcAIIBQFpBmNhbGxlcgkAZQIFBnVzZXJMcAUHYW1vdW50XwkBDF9zYXZlVG90YWxMcAEJAGUCCQEMX2xvYWRUb3RhbExwAAUHYW1vdW50XwUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQVjbGFpbQEFdXNlcl8EA2VycgMJARBfd2hlbkluaXRpYWxpemVkAAkBDl93aGVuTm90UGF1c2VkAAcDCQAAAgUDZXJyBQNlcnIEBHVzZXIDCQBmAgkAsQIBBQV1c2VyXwAACQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQUFdXNlcl8CE2NsYWltOiBpbnZhbGlkIHVzZXIIBQFpBmNhbGxlcgQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQAECWxwQXNzZXRJZAgFB3N0b3JhZ2UCXzEEDGxwQXNzZXRJZFN0cgkBC19hc3NldFRvU3RyAQUJbHBBc3NldElkBAZhc3NldHMJAMwIAgUMbHBBc3NldElkU3RyCQELX2xvYWRBc3NldHMABAhtYXhJbmRleAkAZQIJAJADAQUGYXNzZXRzAAEEBnVzZXJMcAkBC19sb2FkVXNlckxwAQUEdXNlcgQNJHQwNTk0NjI1OTUxOAkBC19jaGVja3BvaW50AQUEdXNlcgQRY2hlY2twb2ludEFjdGlvbnMIBQ0kdDA1OTQ2MjU5NTE4Al8xBAt1c2VyUHJvZml0cwgFDSR0MDU5NDYyNTk1MTgCXzIKAQhmb2xkRnVuYwIDYWNjBnByb2ZpdAQFaW5kZXgIBQNhY2MCXzEDAwkAZwIFCG1heEluZGV4BQVpbmRleAkAZgIFBnByb2ZpdAAABwQFYXNzZXQJAJEDAgUGYXNzZXRzBQVpbmRleAkAlQoDCQBkAgUFaW5kZXgAAQkAzQgCCAUDYWNjAl8yAAAJAM0IAggFA2FjYwJfMwkBDlNjcmlwdFRyYW5zZmVyAwUEdXNlcgUGcHJvZml0CQELX3N0clRvQXNzZXQBBQVhc3NldAkAlQoDCQBkAgUFaW5kZXgAAQkAzQgCCAUDYWNjAl8yBQZwcm9maXQIBQNhY2MCXzMEDSR0MDU5ODk2NTk5ODcKAAIkbAULdXNlclByb2ZpdHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCVCgMAAAUDbmlsBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCGZvbGRGdW5jAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsEA2lkeAgFDSR0MDU5ODk2NTk5ODcCXzEEEnVzZXJQcm9maXRzVXBkYXRlZAgFDSR0MDU5ODk2NTk5ODcCXzIEDXByb2ZpdEFjdGlvbnMIBQ0kdDA1OTg5NjU5OTg3Al8zCQCUCgIJAM4IAgkAzggCBQ1wcm9maXRBY3Rpb25zCQDRCAIFEWNoZWNrcG9pbnRBY3Rpb25zAAAJARBfc2F2ZVVzZXJQcm9maXRzAgUEdXNlcgUSdXNlclByb2ZpdHNVcGRhdGVkBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBBXBhdXNlAAQDZXJyAwMJAQtfb25seVBhdXNlcgEIBQFpBmNhbGxlcgkBEF93aGVuSW5pdGlhbGl6ZWQABwkBDl93aGVuTm90UGF1c2VkAAcDCQAAAgUDZXJyBQNlcnIJAJQKAgkBCl9zYXZlUGF1c2UBBgUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQd1bnBhdXNlAAQDZXJyAwMJAQtfb25seVBhdXNlcgEIBQFpBmNhbGxlcgkBEF93aGVuSW5pdGlhbGl6ZWQABwkBC193aGVuUGF1c2VkAAcDCQAAAgUDZXJyBQNlcnIJAJQKAgkBCl9zYXZlUGF1c2UBBwUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQx1cGRhdGVQYXVzZXIBB3BhdXNlcl8EA2VycgMDCQERX29ubHlUaGlzQ29udHJhY3QBCAUBaQZjYWxsZXIJARBfd2hlbkluaXRpYWxpemVkAAcJARBfdmFsaWRhdGVBZGRyZXNzAgUHcGF1c2VyXwIcdXBkYXRlUGF1c2VyOiBpbnZhbGlkIHBhdXNlcgcDCQAAAgUDZXJyBQNlcnIJAJQKAgkBC19zYXZlUGF1c2VyAQkBEUBleHRyTmF0aXZlKDEwNjIpAQUHcGF1c2VyXwUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQtzZXRNdWx0aXNpZwEJbXVsdGlzaWdfBANlcnIDCQERX29ubHlUaGlzQ29udHJhY3QBCAUBaQZjYWxsZXIJARBfdmFsaWRhdGVBZGRyZXNzAgUJbXVsdGlzaWdfAh1zZXRNdWx0aXNpZzogaW52YWxpZCBtdWx0aXNpZwcDCQAAAgUDZXJyBQNlcnIJAJQKAgkBDV9zYXZlTXVsdGlzaWcBCQERQGV4dHJOYXRpdmUoMTA2MikBBQltdWx0aXNpZ18FBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BAnR4AQZ2ZXJpZnkABAckbWF0Y2gwCQCiCAEFDEtFWV9NVUxUSVNJRwMJAAECBQckbWF0Y2gwAgZTdHJpbmcECG11bHRpc2lnBQckbWF0Y2gwCQELdmFsdWVPckVsc2UCCQCbCAIJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCG11bHRpc2lnCQC5CQIJAMwIAgUKS0VZX1NUQVRVUwkAzAgCCQClCAEFBHRoaXMJAMwIAgkA2AQBCAUCdHgCaWQFA25pbAUDU0VQBwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAgFAnR4D3NlbmRlclB1YmxpY0tleSTM/vk=", "height": 3769004, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 9g24kHGUhfBYr166J1CHChYoTiY35nyLdSCSKgq96So1 Next: 7PeHHPo6Bietz73rGmcd9Su3p4XbCyqP9aNnbxbhg1X Diff:
OldNewDifferences
684684 func _listIntToString (assets_) = {
685685 func foldFunc (acc,elem) = (acc :+ toString(elem))
686686
687- makeString_11C({
687+ makeString({
688688 let $l = assets_
689689 let $s = size($l)
690690 let $acc0 = nil
694694
695695 func $f0_2 ($a,$i) = if (($i >= $s))
696696 then $a
697- else throw("List size exceeds 65")
698-
699- $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)
697+ else throw("List size exceeds 11")
698+
699+ $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)
700700 }, SEP)
701701 }
702702
10411041 $Tuple2((index + 1), (acc._2 :+ profitUpdated))
10421042 }
10431043
1044- let $t02462924702 = {
1044+ let $t02460524678 = {
10451045 let $l = ZERO_INT_LIST_11
10461046 let $s = size($l)
10471047 let $acc0 = $Tuple2(0, nil)
10551055
10561056 $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)
10571057 }
1058- let idx = $t02462924702._1
1059- let profitsUpdated = $t02462924702._2
1058+ let idx = $t02460524678._1
1059+ let profitsUpdated = $t02460524678._2
10601060 $Tuple2((_saveUserProfits(user_, profitsUpdated) ++ _saveUserSigmaFeePerLp(user_, sigmaFeePerLp)), profitsUpdated)
10611061 }
10621062
10701070 $Tuple2((index + 1), (acc._2 :+ sigmaFeePerLpUpdated))
10711071 }
10721072
1073- let $t02535225431 = {
1073+ let $t02532825407 = {
10741074 let $l = ZERO_INT_LIST_11
10751075 let $s = size($l)
10761076 let $acc0 = $Tuple2(0, nil)
10841084
10851085 $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)
10861086 }
1087- let idx = $t02535225431._1
1088- let sigmaFeePerLpUpdated = $t02535225431._2
1087+ let idx = $t02532825407._1
1088+ let sigmaFeePerLpUpdated = $t02532825407._2
10891089 sigmaFeePerLpUpdated
10901090 }
10911091
10931093 func _calculateLpAndProtocolFees (assetIndex_,amount_,lpFeeRate_,protocolFeeRate_) = {
10941094 let sigmaFeePerLp = _loadSigmaFeePerLp()
10951095 let totalLp = _loadTotalLp()
1096- let $t02565225927 = if ((totalLp == 0))
1096+ let $t02562825903 = if ((totalLp == 0))
10971097 then $Tuple2(0, fraction(amount_, protocolFeeRate_, MAX_FEE))
10981098 else $Tuple2(fraction(amount_, lpFeeRate_, MAX_FEE), fraction(amount_, protocolFeeRate_, MAX_FEE))
1099- let lpFee = $t02565225927._1
1100- let protocolFee = $t02565225927._2
1099+ let lpFee = $t02562825903._1
1100+ let protocolFee = $t02562825903._2
11011101 let sigmaFeePerLpUpdated = if ((lpFee == 0))
11021102 then sigmaFeePerLp
11031103 else _updateSigmaFeePerLp(sigmaFeePerLp, totalLp, assetIndex_, lpFee)
11121112 let slippageRate = storage._8
11131113 let feeMaxRate = storage._9
11141114 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))
1115+ let $t02641226465 = _loadAssetWeights()
1116+ let assetWeights = $t02641226465._1
1117+ let sigmaWeight = $t02641226465._2
1118+ let $t02647026538 = _loadAssetBalances()
1119+ let prevAssetBalances = $t02647026538._1
1120+ let prevAssetTotalSupply = $t02647026538._2
1121+ let $t02654427774 = if ((prevAssetTotalSupply == 0))
11221122 then {
11231123 func foldFunc (acc,elem) = {
11241124 let index = acc._1
11261126 $Tuple2((index + 1), (acc._2 :+ requiredAmountNormalized))
11271127 }
11281128
1129- let $t02701027084 = {
1129+ let $t02698627060 = {
11301130 let $l = assets
11311131 let $s = size($l)
11321132 let $acc0 = $Tuple2(0, nil)
11401140
11411141 $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)
11421142 }
1143- let idx = $t02701027084._1
1144- let requiredAmountsNormalized = $t02701027084._2
1143+ let idx = $t02698627060._1
1144+ let requiredAmountsNormalized = $t02698627060._2
11451145 $Tuple2(amount_, requiredAmountsNormalized)
11461146 }
11471147 else {
11521152 $Tuple2((index + 1), (acc._2 :+ requiredAmountNormalized))
11531153 }
11541154
1155- let $t02762727702 = {
1155+ let $t02760327678 = {
11561156 let $l = assets
11571157 let $s = size($l)
11581158 let $acc0 = $Tuple2(0, nil)
11661166
11671167 $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)
11681168 }
1169- let idx = $t02762727702._1
1170- let requiredAmountsNormalized = $t02762727702._2
1169+ let idx = $t02760327678._1
1170+ let requiredAmountsNormalized = $t02760327678._2
11711171 $Tuple2(fraction(amount_, lpTotalSupply, prevAssetTotalSupply), requiredAmountsNormalized)
11721172 }
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 lpTokensToMint = $t02654427774._1
1174+ let requiredAmountsNormalized = $t02654427774._2
1175+ let $t02778027893 = _incrementBalancesByAmounts(prevAssetBalances, requiredAmountsNormalized)
1176+ let assetBalances = $t02778027893._1
1177+ let assetTotalSupply = $t02778027893._2
11781178 let err2 = _validateLiquidityInvariant(prevAssetBalances, prevAssetTotalSupply, assetBalances, assetTotalSupply, lpTotalSupply, (lpTotalSupply + lpTokensToMint), assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
11791179 if ((err2 == err2))
11801180 then $Tuple3(lpTokensToMint, requiredAmountsNormalized, assetBalances)
11851185 func _deposit (assetId_,amount_) = {
11861186 let storage = _loadStorage()
11871187 let lpTotalSupply = storage._3
1188+ let lpFeeRate = storage._4
1189+ let protocolFeeRate = storage._5
11881190 let maxAllocAmplifier = storage._6
11891191 let weightAmplifier = storage._7
11901192 let slippageRate = storage._8
11911193 let feeMaxRate = storage._9
11921194 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
1195+ let $t02865628709 = _loadAssetWeights()
1196+ let assetWeights = $t02865628709._1
1197+ let sigmaWeight = $t02865628709._2
1198+ let $t02871428828 = _loadAssetBalances()
1199+ let prevAssetBalances = $t02871428828._1
1200+ let prevAssetTotalSupply = $t02871428828._2
11991201 let assetBalances = _incrementBalanceByIndex(prevAssetBalances, value(indexOf(assets, assetId_)), amount_)
12001202 let assetTotalSupply = (prevAssetTotalSupply + amount_)
12011203 let err2 = _validateAllocation(assetBalances, assetTotalSupply, prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, maxAllocAmplifier)
12041206 let prevFee = _calculateFee(prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
12051207 let fee = _calculateFee(assetBalances, assetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
12061208 let lpTokensToMint = if ((lpTotalSupply == 0))
1207- then (assetTotalSupply - fee)
1209+ then throw("_deposit: empty pool")
12081210 else {
12091211 let assetDiff = (assetTotalSupply - prevAssetTotalSupply)
12101212 let feeDiff = (fee - prevFee)
12151217 then lpTokensToMintInner
12161218 else throw("Strict value is not equal to itself.")
12171219 }
1218- $Tuple2(lpTokensToMint, assetBalances)
1220+ let $t03049030621 = _calculateLpAndProtocolFees(0, lpTokensToMint, (lpFeeRate / 2), (protocolFeeRate / 2))
1221+ let lpFee = $t03049030621._1
1222+ let protocolFee = $t03049030621._2
1223+ let sigmaFeePerLpUpdated = $t03049030621._3
1224+ $Tuple5(lpTokensToMint, assetBalances, lpFee, protocolFee, sigmaFeePerLpUpdated)
12191225 }
12201226 else throw("Strict value is not equal to itself.")
12211227 }
12241230 func _withdrawAll (amount_) = {
12251231 let storage = _loadStorage()
12261232 let lpTotalSupply = storage._3
1227- let lpFeeRate = storage._4
1228- 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 $t03095531023 = _loadAssetBalances()
1238+ let prevAssetBalances = $t03095531023._1
1239+ let prevAssetTotalSupply = $t03095531023._2
1240+ let $t03102831081 = _loadAssetWeights()
1241+ let assetWeights = $t03102831081._1
1242+ let sigmaWeight = $t03102831081._2
12391243 let lpTokensToBurn = amount_
12401244 let err = _validateInt(lpTokensToBurn, 0, MAX_INT, "_withdrawAll: lpTokensToBurn less than 0")
12411245 if ((err == err))
12421246 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 $t03122331356 = _decrementBalancesByLpAmount(prevAssetBalances, lpTokensToBurn, lpTotalSupply)
1248+ let assetBalances = $t03122331356._1
1249+ let assetTotalSupply = $t03122331356._2
1250+ let balancesToPay = $t03122331356._3
12471251 let err2 = _validateLiquidityInvariant(prevAssetBalances, prevAssetTotalSupply, assetBalances, assetTotalSupply, lpTotalSupply, (lpTotalSupply - lpTokensToBurn), assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
12481252 if ((err2 == err2))
12491253 then $Tuple3(lpTokensToBurn, balancesToPay, assetBalances)
12641268 let feeMaxRate = storage._9
12651269 let precision = _loadPrecision()
12661270 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
1271+ let $t03214832216 = _loadAssetBalances()
1272+ let prevAssetBalances = $t03214832216._1
1273+ let prevAssetTotalSupply = $t03214832216._2
1274+ let $t03222132274 = _loadAssetWeights()
1275+ let assetWeights = $t03222132274._1
1276+ let sigmaWeight = $t03222132274._2
12731277 let targetAssetIndex = value(indexOf(assets, assetId_))
12741278 let prevFee = _calculateFee(prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
12751279 let prevUtilValue = (prevAssetTotalSupply - prevFee)
12891293 else false)
12901294 then $Tuple4(true, startInner, stopInner, currentAmount)
12911295 else if ((0 > (utilValue - prevUtilValueWithK)))
1292- then $Tuple4(false, startInner, currentAmount, 0)
1293- else $Tuple4(false, currentAmount, stopInner, 0)
1296+ then $Tuple4(false, startInner, currentAmount, currentAmount)
1297+ else $Tuple4(false, currentAmount, stopInner, currentAmount)
12941298 }
12951299
12961300 let targetAmount = {
1297- let $t03352933644 = {
1301+ let $t03379733912 = {
12981302 let $l = LIST_64
12991303 let $s = size($l)
13001304 let $acc0 = $Tuple4(false, 0, (lpAmount_ + prevFee), 0)
13081312
13091313 $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)
13101314 }
1311- let success = $t03352933644._1
1312- let startOut = $t03352933644._2
1313- let stopOut = $t03352933644._3
1314- let targetAmountOut = $t03352933644._4
1315+ let success = $t03379733912._1
1316+ let startOut = $t03379733912._2
1317+ let stopOut = $t03379733912._3
1318+ let targetAmountOut = $t03379733912._4
13151319 if (!(success))
13161320 then throw(("_withdraw: can't calculate targetAmount=" + toString(targetAmountOut)))
13171321 else targetAmountOut
13231327 else false
13241328 if ((err1 == err1))
13251329 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
1330+ let $t03487035018 = _calculateLpAndProtocolFees((targetAssetIndex + 1), targetAmount, (lpFeeRate / 2), (protocolFeeRate / 2))
1331+ let lpFee = $t03487035018._1
1332+ let protocolFee = $t03487035018._2
1333+ let sigmaFeePerLpUpdated = $t03487035018._3
13301334 $Tuple5(targetAmount, finalAssetBalances, lpFee, protocolFee, sigmaFeePerLpUpdated)
13311335 }
13321336 else throw("Strict value is not equal to itself.")
13451349 let slippageRate = storage._8
13461350 let feeMaxRate = storage._9
13471351 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
1352+ let $t03560035668 = _loadAssetBalances()
1353+ let prevAssetBalances = $t03560035668._1
1354+ let prevAssetTotalSupply = $t03560035668._2
1355+ let $t03567335726 = _loadAssetWeights()
1356+ let assetWeights = $t03567335726._1
1357+ let sigmaWeight = $t03567335726._2
13541358 let assetBalances = _incrementBalanceByIndex(prevAssetBalances, sourceAssetIndex_, sourceAmount_)
13551359 let assetTotalSupply = (prevAssetTotalSupply + sourceAmount_)
13561360 let prevFee = _calculateFee(prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
13671371 if (if (((utilValue - prevUtilValue) > (-1 * precision)))
13681372 then (precision > (utilValue - prevUtilValue))
13691373 else false)
1370- then $Tuple5(true, startInner, stopInner, currentAmount, (acc._5 :+ utilValue))
1374+ then $Tuple4(true, startInner, stopInner, currentAmount)
13711375 else if ((0 > (utilValue - prevUtilValue)))
1372- then $Tuple5(false, startInner, currentAmount, currentAmount, (acc._5 :+ utilValue))
1373- else $Tuple5(false, currentAmount, stopInner, currentAmount, (acc._5 :+ utilValue))
1376+ then $Tuple4(false, startInner, currentAmount, currentAmount)
1377+ else $Tuple4(false, currentAmount, stopInner, currentAmount)
13741378 }
13751379
13761380 let targetAmount = {
13821386 if ((feeDiff == 0))
13831387 then targetAmount
13841388 else {
1385- let $t03732837458 = {
1389+ let $t03761337732 = {
13861390 let $l = LIST_64
13871391 let $s = size($l)
1388- let $acc0 = $Tuple5(false, 0, (sourceAmount_ + prevFee), 0, nil)
1392+ let $acc0 = $Tuple4(false, 0, (sourceAmount_ + prevFee), 0)
13891393 func $f0_1 ($a,$i) = if (($i >= $s))
13901394 then $a
13911395 else foldFunc($a, $l[$i])
13961400
13971401 $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)
13981402 }
1399- let success = $t03732837458._1
1400- let startOut = $t03732837458._2
1401- let stopOut = $t03732837458._3
1402- let targetAmountOut = $t03732837458._4
1403- let debug = $t03732837458._5
1403+ let success = $t03761337732._1
1404+ let startOut = $t03761337732._2
1405+ let stopOut = $t03761337732._3
1406+ let targetAmountOut = $t03761337732._4
14041407 if (!(success))
1405- then throw(_listIntToString(debug))
1408+ then throw(("_swap: can't calculate targetAmount=" + toString(targetAmountOut)))
14061409 else targetAmountOut
14071410 }
14081411 }
14131416 else false
14141417 if ((err1 == err1))
14151418 then {
1416- let $t03832638467 = _calculateLpAndProtocolFees((targetAssetIndex_ + 1), targetAmount, lpFeeRate, protocolFeeRate)
1417- let lpFee = $t03832638467._1
1418- let protocolFee = $t03832638467._2
1419- let sigmaFeePerLpUpdated = $t03832638467._3
1419+ let $t03854538686 = _calculateLpAndProtocolFees((targetAssetIndex_ + 1), targetAmount, lpFeeRate, protocolFeeRate)
1420+ let lpFee = $t03854538686._1
1421+ let protocolFee = $t03854538686._2
1422+ let sigmaFeePerLpUpdated = $t03854538686._3
14201423 $Tuple5(targetAmount, finalAssetBalances, lpFee, protocolFee, sigmaFeePerLpUpdated)
14211424 }
14221425 else throw("Strict value is not equal to itself.")
14621465 else false
14631466 if ((err == err))
14641467 then {
1465- let $t04033040399 = _prepareAssetWeights(assetWeights_)
1466- let assetWeights = $t04033040399._1
1467- let sigmaWeight = $t04033040399._2
1468+ let $t04054940618 = _prepareAssetWeights(assetWeights_)
1469+ let assetWeights = $t04054940618._1
1470+ let sigmaWeight = $t04054940618._2
14681471 let assetBalances = _prepareAssetBalances(assets_)
14691472 let issue = Issue(lpTokenName_, lpTokenDescr_, 0, lpTokenDecimals_, true)
14701473 let lpAssetId = calculateAssetId(issue)
14891492 let lpAssetId = storage._1
14901493 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
14911494 let assets = _loadAssets()
1492- let $t04214942234 = _depositAll(amount_)
1493- let lpTokensToMint = $t04214942234._1
1494- let requiredAmountsNormalized = $t04214942234._2
1495- let assetBalances = $t04214942234._3
1495+ let $t04236842453 = _depositAll(amount_)
1496+ let lpTokensToMint = $t04236842453._1
1497+ let requiredAmountsNormalized = $t04236842453._2
1498+ let assetBalances = $t04236842453._3
14961499 func foldFunc (acc,elem) = {
14971500 let index = acc._1
14981501 let paymentAssetStr = _assetToStr(i.payments[index].assetId)
15161519 else throw("Strict value is not equal to itself.")
15171520 }
15181521
1519- let $t04337743439 = {
1522+ let $t04359643658 = {
15201523 let $l = assets
15211524 let $s = size($l)
15221525 let $acc0 = $Tuple2(0, nil)
15301533
15311534 $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)
15321535 }
1533- let idx = $t04337743439._1
1534- let changeActions = $t04337743439._2
1536+ let idx = $t04359643658._1
1537+ let changeActions = $t04359643658._2
15351538 let storageUpdated = $Tuple10(storage._1, storage._2, (storage._3 + lpTokensToMint), storage._4, storage._5, storage._6, storage._7, storage._8, storage._9, storage._10)
15361539 $Tuple2(((([Reissue(lpAssetId, lpTokensToMint, true), ScriptTransfer(i.caller, lpTokensToMint, lpAssetId)] ++ _saveStorage(storageUpdated)) ++ _saveAssetBalances(assetBalances)) ++ changeActions), unit)
15371540 }
15471550 then {
15481551 let storage = _loadStorage()
15491552 let lpAssetId = storage._1
1550- let lpDecimals = _getDecimals(toBase58String(lpAssetId))
1553+ let lpAssetIdStr = _assetToStr(lpAssetId)
1554+ let lpDecimals = _getDecimals(lpAssetIdStr)
15511555 let err1 = if (if (if (if (_whenInitialized())
15521556 then _whenNotPaused()
15531557 else false)
15621566 let assetStr = _assetToStr(i.payments[0].assetId)
15631567 let assetDecimals = _getDecimals(assetStr)
15641568 let amountNormalized = _normalizeDecimals(i.payments[0].amount, assetDecimals, lpDecimals, DOWN)
1565- let $t04481844892 = _deposit(assetStr, amountNormalized)
1566- let lpTokensToMint = $t04481844892._1
1567- let assetBalances = $t04481844892._2
1568- let err2 = _validateInt(lpTokensToMint, minLpAmount_, MAX_INT, "deposit: less than min lp")
1569+ let $t04507045186 = _deposit(assetStr, amountNormalized)
1570+ let lpTokensToMint = $t04507045186._1
1571+ let assetBalances = $t04507045186._2
1572+ let lpFee = $t04507045186._3
1573+ let protocolFee = $t04507045186._4
1574+ let sigmaFeePerLpUpdated = $t04507045186._5
1575+ let lpTokensToSend = ((lpTokensToMint - lpFee) - protocolFee)
1576+ let err2 = _validateInt(lpTokensToSend, minLpAmount_, MAX_INT, "deposit: less than min")
15691577 if ((err2 == err2))
15701578 then {
15711579 let storageUpdated = $Tuple10(storage._1, storage._2, (storage._3 + lpTokensToMint), storage._4, storage._5, storage._6, storage._7, storage._8, storage._9, storage._10)
1572- $Tuple2((([Reissue(lpAssetId, lpTokensToMint, true), ScriptTransfer(i.caller, lpTokensToMint, lpAssetId)] ++ _saveStorage(storageUpdated)) ++ _saveAssetBalances(assetBalances)), unit)
1580+ $Tuple2(((((([Reissue(lpAssetId, lpTokensToMint, true), ScriptTransfer(i.caller, lpTokensToSend, lpAssetId)] ++ _saveStorage(storageUpdated)) ++ _saveAssetBalances(assetBalances)) ++ _saveLpFee(lpAssetIdStr, (lpFee + _loadLpFee(lpAssetIdStr)))) ++ _saveProtocolFee(lpAssetIdStr, (protocolFee + _loadProtocolFee(lpAssetIdStr)))) ++ _saveSigmaFeePerLp(sigmaFeePerLpUpdated)), unit)
15731581 }
15741582 else throw("Strict value is not equal to itself.")
15751583 }
15981606 else false
15991607 if ((err == err))
16001608 then {
1601- let $t04611346200 = _withdrawAll(i.payments[0].amount)
1602- let lpTokensToBurn = $t04611346200._1
1603- let balancesToPay = $t04611346200._2
1604- let assetBalances = $t04611346200._3
1609+ let $t04667546762 = _withdrawAll(i.payments[0].amount)
1610+ let lpTokensToBurn = $t04667546762._1
1611+ let balancesToPay = $t04667546762._2
1612+ let assetBalances = $t04667546762._3
16051613 let paymentActions = _getPaymentsFromBalances(assets, balancesToPay, i.caller, lpDecimals)
16061614 let storageUpdated = $Tuple10(storage._1, storage._2, (storage._3 - lpTokensToBurn), storage._4, storage._5, storage._6, storage._7, storage._8, storage._9, storage._10)
16071615 $Tuple2(((([Burn(lpAssetId, lpTokensToBurn)] ++ paymentActions) ++ _saveStorage(storageUpdated)) ++ _saveAssetBalances(assetBalances)), unit)
16331641 else false
16341642 if ((err == err))
16351643 then {
1636- let $t04752647660 = _withdraw(assetId_, i.payments[0].amount)
1637- let targetAmountNormalized = $t04752647660._1
1638- let finalAssetBalances = $t04752647660._2
1639- let lpFee = $t04752647660._3
1640- let protocolFee = $t04752647660._4
1641- let sigmaFeePerLpUpdated = $t04752647660._5
1644+ let $t04808848222 = _withdraw(assetId_, i.payments[0].amount)
1645+ let targetAmountNormalized = $t04808848222._1
1646+ let finalAssetBalances = $t04808848222._2
1647+ let lpFee = $t04808848222._3
1648+ let protocolFee = $t04808848222._4
1649+ let sigmaFeePerLpUpdated = $t04808848222._5
16421650 let finalAmountNormalized = ((targetAmountNormalized - lpFee) - protocolFee)
16431651 let targetDecimals = _getDecimals(assetId_)
16441652 let finalAmount = _normalizeDecimals(finalAmountNormalized, lpDecimals, targetDecimals, DOWN)
1645- let err1 = _validateInt(finalAmount, minAmount_, MAX_INT, "withdraw: insufficient final amount")
1653+ let err1 = _validateInt(finalAmount, minAmount_, MAX_INT, "withdraw: less than min")
16461654 if ((err1 == err1))
16471655 then {
16481656 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)
16821690 else false
16831691 if ((err == err))
16841692 then {
1685- let $t04975749915 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
1686- let targetAmountNormalized = $t04975749915._1
1687- let finalAssetBalances = $t04975749915._2
1688- let lpFee = $t04975749915._3
1689- let protocolFee = $t04975749915._4
1690- let sigmaFeePerLpUpdated = $t04975749915._5
1693+ let $t05030750465 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
1694+ let targetAmountNormalized = $t05030750465._1
1695+ let finalAssetBalances = $t05030750465._2
1696+ let lpFee = $t05030750465._3
1697+ let protocolFee = $t05030750465._4
1698+ let sigmaFeePerLpUpdated = $t05030750465._5
16911699 let finalAmountNormalized = ((targetAmountNormalized - lpFee) - protocolFee)
16921700 let targetDecimals = _getDecimals(targetAssetId_)
16931701 let finalAmount = _normalizeDecimals(finalAmountNormalized, lpDecimals, targetDecimals, DOWN)
1694- let err1 = _validateInt(finalAmount, minAmount_, MAX_INT, "swap: insufficient final amount")
1702+ let err1 = _validateInt(finalAmount, minAmount_, MAX_INT, "swap: less than min")
16951703 if ((err1 == err1))
16961704 then $Tuple2((((([ScriptTransfer(i.caller, finalAmount, _strToAsset(targetAssetId_))] ++ _saveAssetBalances(finalAssetBalances)) ++ _saveLpFee(targetAssetId_, (lpFee + _loadLpFee(targetAssetId_)))) ++ _saveProtocolFee(targetAssetId_, (protocolFee + _loadProtocolFee(targetAssetId_)))) ++ _saveSigmaFeePerLp(sigmaFeePerLpUpdated)), unit)
16971705 else throw("Strict value is not equal to itself.")
17101718 let err = _validateInt(lpAmount_, 1, MAX_INT, "getDepositAll: invalid amount")
17111719 if ((err == err))
17121720 then {
1713- let $t05104751134 = _depositAll(lpAmount_)
1714- let lpTokensToMint = $t05104751134._1
1715- let requiredAmountsNormalized = $t05104751134._2
1716- let assetBalances = $t05104751134._3
1721+ let $t05158551672 = _depositAll(lpAmount_)
1722+ let lpTokensToMint = $t05158551672._1
1723+ let requiredAmountsNormalized = $t05158551672._2
1724+ let assetBalances = $t05158551672._3
17171725 $Tuple2(nil, $Tuple2(lpTokensToMint, requiredAmountsNormalized))
17181726 }
17191727 else throw("Strict value is not equal to itself.")
17331741 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
17341742 let assetDecimals = _getDecimals(assetId_)
17351743 let amountNormalized = _normalizeDecimals(amount_, assetDecimals, lpDecimals, DOWN)
1736- let $t05189351967 = _deposit(assetId_, amountNormalized)
1737- let lpTokensToMint = $t05189351967._1
1738- let assetBalances = $t05189351967._2
1739- $Tuple2(nil, lpTokensToMint)
1744+ let $t05243152547 = _deposit(assetId_, amountNormalized)
1745+ let lpTokensToMint = $t05243152547._1
1746+ let assetBalances = $t05243152547._2
1747+ let lpFee = $t05243152547._3
1748+ let protocolFee = $t05243152547._4
1749+ let sigmaFeePerLpUpdated = $t05243152547._5
1750+ let lpTokensToSend = ((lpTokensToMint - lpFee) - protocolFee)
1751+ $Tuple2(nil, lpTokensToSend)
17401752 }
17411753 else throw("Strict value is not equal to itself.")
17421754 }
17481760 let err = _validateInt(lpAmount_, 0, MAX_INT, "getWithdrawAll: invalid amount")
17491761 if ((err == err))
17501762 then {
1751- let $t05234452420 = _withdrawAll(lpAmount_)
1752- let lpTokensToBurn = $t05234452420._1
1753- let balancesToGet = $t05234452420._2
1754- let assetBalances = $t05234452420._3
1763+ let $t05298653062 = _withdrawAll(lpAmount_)
1764+ let lpTokensToBurn = $t05298653062._1
1765+ let balancesToGet = $t05298653062._2
1766+ let assetBalances = $t05298653062._3
17551767 $Tuple2(nil, balancesToGet)
17561768 }
17571769 else throw("Strict value is not equal to itself.")
17691781 let storage = _loadStorage()
17701782 let lpAssetId = storage._1
17711783 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
1772- let $t05307153187 = _withdraw(assetId_, amount_)
1773- let targetAmountNormalized = $t05307153187._1
1774- let assetBalances = $t05307153187._2
1775- let lpFee = $t05307153187._3
1776- let protocolFee = $t05307153187._4
1777- let sigmaFeePerLpUpdated = $t05307153187._5
1784+ let $t05371353829 = _withdraw(assetId_, amount_)
1785+ let targetAmountNormalized = $t05371353829._1
1786+ let assetBalances = $t05371353829._2
1787+ let lpFee = $t05371353829._3
1788+ let protocolFee = $t05371353829._4
1789+ let sigmaFeePerLpUpdated = $t05371353829._5
17781790 let finalAmountNormalized = ((targetAmountNormalized - lpFee) - protocolFee)
17791791 let targetDecimals = _getDecimals(assetId_)
17801792 let finalAmount = _normalizeDecimals(finalAmountNormalized, lpDecimals, targetDecimals, DOWN)
18031815 else false
18041816 if ((err == err))
18051817 then {
1806- let $t05460154759 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
1807- let targetAmountNormalized = $t05460154759._1
1808- let finalAssetBalances = $t05460154759._2
1809- let lpFee = $t05460154759._3
1810- let protocolFee = $t05460154759._4
1811- let sigmaFeePerLpUpdated = $t05460154759._5
1818+ let $t05524355401 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
1819+ let targetAmountNormalized = $t05524355401._1
1820+ let finalAssetBalances = $t05524355401._2
1821+ let lpFee = $t05524355401._3
1822+ let protocolFee = $t05524355401._4
1823+ let sigmaFeePerLpUpdated = $t05524355401._5
18121824 let finalAmountNormalized = ((targetAmountNormalized - lpFee) - protocolFee)
18131825 let targetDecimals = _getDecimals(targetAssetId_)
18141826 let finalAmount = _normalizeDecimals(finalAmountNormalized, lpDecimals, targetDecimals, DOWN)
18281840 let user = if ((size(user_) > 0))
18291841 then valueOrErrorMessage(addressFromString(user_), "getClaim: invalid user")
18301842 else i.caller
1831- let $t05540155457 = _checkpoint(user)
1832- let checkpointActions = $t05540155457._1
1833- let userProfits = $t05540155457._2
1843+ let $t05604356099 = _checkpoint(user)
1844+ let checkpointActions = $t05604356099._1
1845+ let userProfits = $t05604356099._2
18341846 $Tuple2(nil, userProfits)
18351847 }
18361848
18431855 let weightAmplifier = storage._7
18441856 let slippageRate = storage._8
18451857 let feeMaxRate = storage._9
1846- let $t05579055850 = _loadAssetBalances()
1847- let assetBalances = $t05579055850._1
1848- let assetTotalSupply = $t05579055850._2
1849- let $t05585555908 = _loadAssetWeights()
1850- let assetWeights = $t05585555908._1
1851- let sigmaWeight = $t05585555908._2
1858+ let $t05643256492 = _loadAssetBalances()
1859+ let assetBalances = $t05643256492._1
1860+ let assetTotalSupply = $t05643256492._2
1861+ let $t05649756550 = _loadAssetWeights()
1862+ let assetWeights = $t05649756550._1
1863+ let sigmaWeight = $t05649756550._2
18521864 let fee = _calculateFee(assetBalances, assetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
18531865 let utilValue = (assetTotalSupply - fee)
18541866 $Tuple2(nil, $Tuple2(utilValue, lpTotalSupply))
1867+ }
1868+
1869+
1870+
1871+@Callable(i)
1872+func getFeeFunc () = {
1873+ let storage = _loadStorage()
1874+ let weightAmplifier = storage._7
1875+ let slippageRate = storage._8
1876+ let feeMaxRate = storage._9
1877+ let $t05698257042 = _loadAssetBalances()
1878+ let assetBalances = $t05698257042._1
1879+ let assetTotalSupply = $t05698257042._2
1880+ let $t05704757100 = _loadAssetWeights()
1881+ let assetWeights = $t05704757100._1
1882+ let sigmaWeight = $t05704757100._2
1883+ let fee = _calculateFee(assetBalances, assetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
1884+ $Tuple2(nil, fee)
18551885 }
18561886
18571887
18891919 else false
18901920 if ((err1 == err1))
18911921 then {
1892- let $t05698157041 = _checkpoint(i.caller)
1893- let checkpointActions = $t05698157041._1
1894- let userProfits = $t05698157041._2
1922+ let $t05810858168 = _checkpoint(i.caller)
1923+ let checkpointActions = $t05810858168._1
1924+ let userProfits = $t05810858168._2
18951925 $Tuple2(((checkpointActions ++ _saveUserLp(i.caller, (_loadUserLp(i.caller) + i.payments[0].amount))) ++ _saveTotalLp((_loadTotalLp() + i.payments[0].amount))), unit)
18961926 }
18971927 else throw("Strict value is not equal to itself.")
19141944 let err1 = _validateInt(amount_, 0, userLp, "unstake: invalid amount")
19151945 if ((err1 == err1))
19161946 then {
1917- let $t05755257612 = _checkpoint(i.caller)
1918- let checkpointActions = $t05755257612._1
1919- let userProfits = $t05755257612._2
1947+ let $t05867958739 = _checkpoint(i.caller)
1948+ let checkpointActions = $t05867958739._1
1949+ let userProfits = $t05867958739._2
19201950 $Tuple2(((([ScriptTransfer(i.caller, amount_, lpAssetId)] ++ checkpointActions) ++ _saveUserLp(i.caller, (userLp - amount_))) ++ _saveTotalLp((_loadTotalLp() - amount_))), unit)
19211951 }
19221952 else throw("Strict value is not equal to itself.")
19421972 let assets = [lpAssetIdStr, _loadAssets()]
19431973 let maxIndex = (size(assets) - 1)
19441974 let userLp = _loadUserLp(user)
1945- let $t05833558391 = _checkpoint(user)
1946- let checkpointActions = $t05833558391._1
1947- let userProfits = $t05833558391._2
1975+ let $t05946259518 = _checkpoint(user)
1976+ let checkpointActions = $t05946259518._1
1977+ let userProfits = $t05946259518._2
19481978 func foldFunc (acc,profit) = {
19491979 let index = acc._1
19501980 if (if ((maxIndex >= index))
19571987 else $Tuple3((index + 1), (acc._2 :+ profit), acc._3)
19581988 }
19591989
1960- let $t05876958860 = {
1990+ let $t05989659987 = {
19611991 let $l = userProfits
19621992 let $s = size($l)
19631993 let $acc0 = $Tuple3(0, nil, nil)
19712001
19722002 $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)
19732003 }
1974- let idx = $t05876958860._1
1975- let userProfitsUpdated = $t05876958860._2
1976- let profitActions = $t05876958860._3
2004+ let idx = $t05989659987._1
2005+ let userProfitsUpdated = $t05989659987._2
2006+ let profitActions = $t05989659987._3
19772007 $Tuple2(((profitActions ++ removeByIndex(checkpointActions, 0)) ++ _saveUserProfits(user, userProfitsUpdated)), unit)
19782008 }
19792009 else throw("Strict value is not equal to itself.")
20352065
20362066
20372067 @Verifier(tx)
2038-func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
2068+func verify () = match getString(KEY_MULTISIG) {
2069+ case multisig: String =>
2070+ valueOrElse(getBoolean(addressFromStringValue(multisig), makeString([KEY_STATUS, toString(this), toBase58String(tx.id)], SEP)), false)
2071+ case _ =>
2072+ sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
2073+}
20392074
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
1212 let MAX_AMPLIFIER = 1000000
1313
1414 let MAX_WEIGHT_AMPLIFIER = 1000000
1515
1616 let MAX_WEIGHT = 1000000
1717
1818 let SLIPPAGE_RATE_FACTOR = 1000000
1919
2020 let FEE_RATE_FACTOR = 1000000
2121
2222 let RATE_FACTOR = 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
3232 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]
3333
3434 let INT_DECIMALS = 8
3535
3636 let BIGINT_DECIMALS = 18
3737
3838 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", "_")
3939
4040 let KEY_MULTISIG = "MULTISIG"
4141
4242 let KEY_STATUS = "STATUS"
4343
4444 let KEY_PAUSED = "PAUSED"
4545
4646 let KEY_PAUSER = "PAUSER"
4747
4848 let KEY_STORAGE = "STORAGE"
4949
5050 let KEY_ASSETS = "ASSETS"
5151
5252 let KEY_ASSET_BALANCES = "ASSET_BALANCES"
5353
5454 let KEY_ASSET_WEIGHTS = "ASSET_WEIGHTS"
5555
5656 let KEY_LP_FEE = "LP_FEE"
5757
5858 let KEY_PROTOCOL_FEE = "PROTOCOL_FEE"
5959
6060 let KEY_PRECISION = "PRECISION"
6161
6262 let KEY_SIGMA_FEE_PER_LP = "SIGMA_FEE_PER_LP"
6363
6464 let KEY_USER_SIGMA_FEE_PER_LP = "USER_SIGMA_FEE_PER_LP"
6565
6666 let KEY_USER_LP = "USER_LP"
6767
6868 let KEY_TOTAL_LP = "TOTAL_LP"
6969
7070 let KEY_USER_PROFITS = "USER_PROFITS"
7171
7272 func _validateAddress (address_,err_) = match addressFromString(address_) {
7373 case a: Address =>
7474 true
7575 case _ =>
7676 throw(err_)
7777 }
7878
7979
8080 func _validateAsset (assetId_,err_) = if ((assetId_ == WAVES))
8181 then true
8282 else match assetInfo(fromBase58String(assetId_)) {
8383 case a: Asset =>
8484 true
8585 case _ =>
8686 throw(err_)
8787 }
8888
8989
9090 func _validateInt (val_,lowerBoundary_,upperBoundary_,err_) = if (if ((lowerBoundary_ > val_))
9191 then true
9292 else (val_ > upperBoundary_))
9393 then throw(err_)
9494 else true
9595
9696
9797 func _validateBool (val_,target_,err_) = if ((val_ != target_))
9898 then throw(err_)
9999 else true
100100
101101
102102 func _validateStringEqual (val1_,val2_,err_) = if ((val1_ != val2_))
103103 then throw(err_)
104104 else true
105105
106106
107107 func _validateStringNotEq (val1_,val2_,err_) = if ((val1_ == val2_))
108108 then throw(err_)
109109 else true
110110
111111
112112 func _validateIntList (val_,lowerBoundary_,upperBoundary_,err_) = {
113113 func foldFunc (acc,elem) = match parseInt(elem) {
114114 case a: Int =>
115115 if (acc)
116116 then _validateInt(a, lowerBoundary_, upperBoundary_, err_)
117117 else false
118118 case _ =>
119119 throw(err_)
120120 }
121121
122122 let $l = val_
123123 let $s = size($l)
124124 let $acc0 = true
125125 func $f0_1 ($a,$i) = if (($i >= $s))
126126 then $a
127127 else foldFunc($a, $l[$i])
128128
129129 func $f0_2 ($a,$i) = if (($i >= $s))
130130 then $a
131131 else throw("List size exceeds 10")
132132
133133 $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)
134134 }
135135
136136
137137 func _validateAssets (assets_,err_) = {
138138 func foldFunc (acc,elem) = if (acc)
139139 then _validateAsset(elem, err_)
140140 else false
141141
142142 let $l = assets_
143143 let $s = size($l)
144144 let $acc0 = true
145145 func $f0_1 ($a,$i) = if (($i >= $s))
146146 then $a
147147 else foldFunc($a, $l[$i])
148148
149149 func $f0_2 ($a,$i) = if (($i >= $s))
150150 then $a
151151 else throw("List size exceeds 10")
152152
153153 $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)
154154 }
155155
156156
157157 func _validateIntEquals (val1_,val2_,err_) = if ((val1_ != val2_))
158158 then throw(err_)
159159 else true
160160
161161
162162 func _validateTokenName (val_,err_) = if (if ((4 > size(val_)))
163163 then true
164164 else (size(val_) > 16))
165165 then throw(err_)
166166 else true
167167
168168
169169 func _validateTokenDescr (val_,err_) = if ((size(val_) > 1000))
170170 then throw(err_)
171171 else true
172172
173173
174174 func _validateDecimals (val_,err_) = if (if ((0 > val_))
175175 then true
176176 else (val_ > 8))
177177 then throw(err_)
178178 else true
179179
180180
181181 func _validatePayment (payment_,assetId_,requiredAmount_,err_) = match payment_.assetId {
182182 case a: ByteVector =>
183183 if ((assetId_ != toBase58String(a)))
184184 then throw((err_ + ": asset"))
185185 else if ((requiredAmount_ > payment_.amount))
186186 then throw((err_ + ": amount"))
187187 else true
188188 case _ =>
189189 throw((err_ + ": asset"))
190190 }
191191
192192
193193 func _validateListContains (list_,val_,err_) = if (!(containsElement(list_, val_)))
194194 then throw(err_)
195195 else true
196196
197197
198198 func _assetToStr (asset_) = match asset_ {
199199 case a: ByteVector =>
200200 toBase58String(a)
201201 case _ =>
202202 WAVES
203203 }
204204
205205
206206 func _strToAsset (asset_) = if (if ((asset_ == WAVES))
207207 then true
208208 else (asset_ == ""))
209209 then unit
210210 else fromBase58String(asset_)
211211
212212
213213 func _loadPause () = match getBoolean(KEY_PAUSED) {
214214 case a: Boolean =>
215215 a
216216 case _ =>
217217 false
218218 }
219219
220220
221221 func _savePause (isPaused_) = [BooleanEntry(KEY_PAUSED, isPaused_)]
222222
223223
224224 func _loadPauser () = match getString(KEY_PAUSER) {
225225 case a: String =>
226226 addressFromStringValue(a)
227227 case _ =>
228228 Address(base58'')
229229 }
230230
231231
232232 func _savePauser (pauser_) = [StringEntry(KEY_PAUSER, toString(pauser_))]
233233
234234
235235 func _loadMultisig () = match getString(KEY_MULTISIG) {
236236 case a: String =>
237237 addressFromStringValue(a)
238238 case _ =>
239239 Address(base58'')
240240 }
241241
242242
243243 func _saveMultisig (multisig_) = [StringEntry(KEY_MULTISIG, toString(multisig_))]
244244
245245
246246 func _loadStorage () = match getString(KEY_STORAGE) {
247247 case a: String =>
248248 let struct = split(a, SEP)
249249 $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]))
250250 case _ =>
251251 $Tuple10(base58'', false, 0, 0, 0, 0, 0, 0, 0, Address(base58''))
252252 }
253253
254254
255255 func _saveStorage (storage_) = [StringEntry(KEY_STORAGE, makeString([toBase58String(storage_._1), if (storage_._2)
256256 then "1"
257257 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))]
258258
259259
260260 func _loadAssets () = match getString(KEY_ASSETS) {
261261 case a: String =>
262262 if ((size(a) > 0))
263263 then split_51C(a, SEP)
264264 else nil
265265 case _ =>
266266 nil
267267 }
268268
269269
270270 func _saveAssets (assets_) = [StringEntry(KEY_ASSETS, makeString_11C(assets_, SEP))]
271271
272272
273273 func _loadAssetBalances () = {
274274 func foldFunc (acc,elem) = {
275275 let balance = parseIntValue(elem)
276276 $Tuple2((acc._1 :+ balance), (acc._2 + balance))
277277 }
278278
279279 match getString(KEY_ASSET_BALANCES) {
280280 case a: String =>
281281 if ((size(a) > 0))
282282 then {
283283 let $l = split_51C(a, SEP)
284284 let $s = size($l)
285285 let $acc0 = $Tuple2(nil, 0)
286286 func $f0_1 ($a,$i) = if (($i >= $s))
287287 then $a
288288 else foldFunc($a, $l[$i])
289289
290290 func $f0_2 ($a,$i) = if (($i >= $s))
291291 then $a
292292 else throw("List size exceeds 10")
293293
294294 $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)
295295 }
296296 else $Tuple2(ZERO_INT_LIST_10, 0)
297297 case _ =>
298298 $Tuple2(ZERO_INT_LIST_10, 0)
299299 }
300300 }
301301
302302
303303 func _saveAssetBalances (balances_) = {
304304 func foldFunc (acc,elem) = (acc :+ toString(elem))
305305
306306 [StringEntry(KEY_ASSET_BALANCES, makeString_11C({
307307 let $l = balances_
308308 let $s = size($l)
309309 let $acc0 = nil
310310 func $f0_1 ($a,$i) = if (($i >= $s))
311311 then $a
312312 else foldFunc($a, $l[$i])
313313
314314 func $f0_2 ($a,$i) = if (($i >= $s))
315315 then $a
316316 else throw("List size exceeds 10")
317317
318318 $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)
319319 }, SEP))]
320320 }
321321
322322
323323 func _loadAssetWeights () = {
324324 func foldFunc (acc,elem) = {
325325 let weight = parseIntValue(elem)
326326 $Tuple2((acc._1 :+ weight), (acc._2 + weight))
327327 }
328328
329329 match getString(KEY_ASSET_WEIGHTS) {
330330 case a: String =>
331331 if ((size(a) > 0))
332332 then {
333333 let $l = split_51C(a, SEP)
334334 let $s = size($l)
335335 let $acc0 = $Tuple2(nil, 0)
336336 func $f0_1 ($a,$i) = if (($i >= $s))
337337 then $a
338338 else foldFunc($a, $l[$i])
339339
340340 func $f0_2 ($a,$i) = if (($i >= $s))
341341 then $a
342342 else throw("List size exceeds 10")
343343
344344 $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)
345345 }
346346 else $Tuple2(ZERO_INT_LIST_10, 0)
347347 case _ =>
348348 $Tuple2(ZERO_INT_LIST_10, 0)
349349 }
350350 }
351351
352352
353353 func _saveAssetWeights (weights_) = {
354354 func foldFunc (acc,elem) = (acc :+ toString(elem))
355355
356356 [StringEntry(KEY_ASSET_WEIGHTS, makeString_11C({
357357 let $l = weights_
358358 let $s = size($l)
359359 let $acc0 = nil
360360 func $f0_1 ($a,$i) = if (($i >= $s))
361361 then $a
362362 else foldFunc($a, $l[$i])
363363
364364 func $f0_2 ($a,$i) = if (($i >= $s))
365365 then $a
366366 else throw("List size exceeds 10")
367367
368368 $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)
369369 }, SEP))]
370370 }
371371
372372
373373 func _loadLpFee (assetId_) = match getInteger(makeString([KEY_LP_FEE, assetId_], SEP)) {
374374 case a: Int =>
375375 a
376376 case _ =>
377377 0
378378 }
379379
380380
381381 func _saveLpFee (assetId_,val_) = [IntegerEntry(makeString([KEY_LP_FEE, assetId_], SEP), val_)]
382382
383383
384384 func _loadProtocolFee (assetId_) = match getInteger(makeString([KEY_PROTOCOL_FEE, assetId_], SEP)) {
385385 case a: Int =>
386386 a
387387 case _ =>
388388 0
389389 }
390390
391391
392392 func _saveProtocolFee (assetId_,val_) = [IntegerEntry(makeString([KEY_PROTOCOL_FEE, assetId_], SEP), val_)]
393393
394394
395395 func _loadPrecision () = match getInteger(KEY_PRECISION) {
396396 case a: Int =>
397397 a
398398 case _ =>
399399 0
400400 }
401401
402402
403403 func _savePrecision (val_) = [IntegerEntry(KEY_PRECISION, val_)]
404404
405405
406406 func _loadSigmaFeePerLp () = {
407407 func foldFunc (acc,elem) = (acc :+ parseBigIntValue(elem))
408408
409409 match getString(KEY_SIGMA_FEE_PER_LP) {
410410 case a: String =>
411411 if ((size(a) > 0))
412412 then {
413413 let $l = split_51C(a, SEP)
414414 let $s = size($l)
415415 let $acc0 = nil
416416 func $f0_1 ($a,$i) = if (($i >= $s))
417417 then $a
418418 else foldFunc($a, $l[$i])
419419
420420 func $f0_2 ($a,$i) = if (($i >= $s))
421421 then $a
422422 else throw("List size exceeds 11")
423423
424424 $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)
425425 }
426426 else ZERO_BIGINT_LIST_11
427427 case _ =>
428428 ZERO_BIGINT_LIST_11
429429 }
430430 }
431431
432432
433433 func _saveSigmaFeePerLp (val_) = {
434434 func foldFunc (acc,elem) = (acc :+ toString(elem))
435435
436436 [StringEntry(KEY_SIGMA_FEE_PER_LP, makeString_11C({
437437 let $l = val_
438438 let $s = size($l)
439439 let $acc0 = nil
440440 func $f0_1 ($a,$i) = if (($i >= $s))
441441 then $a
442442 else foldFunc($a, $l[$i])
443443
444444 func $f0_2 ($a,$i) = if (($i >= $s))
445445 then $a
446446 else throw("List size exceeds 11")
447447
448448 $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)
449449 }, SEP))]
450450 }
451451
452452
453453 func _loadUserSigmaFeePerLp (user_) = {
454454 func foldFunc (acc,elem) = (acc :+ parseBigIntValue(elem))
455455
456456 match getString(makeString([KEY_USER_SIGMA_FEE_PER_LP, toString(user_)], SEP)) {
457457 case a: String =>
458458 if ((size(a) > 0))
459459 then {
460460 let $l = split_51C(a, SEP)
461461 let $s = size($l)
462462 let $acc0 = nil
463463 func $f0_1 ($a,$i) = if (($i >= $s))
464464 then $a
465465 else foldFunc($a, $l[$i])
466466
467467 func $f0_2 ($a,$i) = if (($i >= $s))
468468 then $a
469469 else throw("List size exceeds 11")
470470
471471 $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)
472472 }
473473 else ZERO_BIGINT_LIST_11
474474 case _ =>
475475 ZERO_BIGINT_LIST_11
476476 }
477477 }
478478
479479
480480 func _saveUserSigmaFeePerLp (user_,val_) = {
481481 func foldFunc (acc,elem) = (acc :+ toString(elem))
482482
483483 [StringEntry(makeString([KEY_USER_SIGMA_FEE_PER_LP, toString(user_)], SEP), makeString_11C({
484484 let $l = val_
485485 let $s = size($l)
486486 let $acc0 = nil
487487 func $f0_1 ($a,$i) = if (($i >= $s))
488488 then $a
489489 else foldFunc($a, $l[$i])
490490
491491 func $f0_2 ($a,$i) = if (($i >= $s))
492492 then $a
493493 else throw("List size exceeds 11")
494494
495495 $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)
496496 }, SEP))]
497497 }
498498
499499
500500 func _loadUserLp (address_) = match getInteger(makeString([KEY_USER_LP, toString(address_)], SEP)) {
501501 case a: Int =>
502502 a
503503 case _ =>
504504 0
505505 }
506506
507507
508508 func _saveUserLp (address_,val_) = [IntegerEntry(makeString([KEY_USER_LP, toString(address_)], SEP), val_)]
509509
510510
511511 func _loadTotalLp () = match getInteger(KEY_TOTAL_LP) {
512512 case a: Int =>
513513 a
514514 case _ =>
515515 0
516516 }
517517
518518
519519 func _saveTotalLp (val_) = [IntegerEntry(KEY_TOTAL_LP, val_)]
520520
521521
522522 func _loadUserProfits (user_) = {
523523 func foldFunc (acc,elem) = (acc :+ parseIntValue(elem))
524524
525525 match getString(makeString([KEY_USER_PROFITS, toString(user_)], SEP)) {
526526 case a: String =>
527527 if ((size(a) > 0))
528528 then {
529529 let $l = split_51C(a, SEP)
530530 let $s = size($l)
531531 let $acc0 = nil
532532 func $f0_1 ($a,$i) = if (($i >= $s))
533533 then $a
534534 else foldFunc($a, $l[$i])
535535
536536 func $f0_2 ($a,$i) = if (($i >= $s))
537537 then $a
538538 else throw("List size exceeds 11")
539539
540540 $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)
541541 }
542542 else ZERO_INT_LIST_11
543543 case _ =>
544544 ZERO_INT_LIST_11
545545 }
546546 }
547547
548548
549549 func _saveUserProfits (user_,val_) = {
550550 func foldFunc (acc,elem) = (acc :+ toString(elem))
551551
552552 [StringEntry(makeString([KEY_USER_PROFITS, toString(user_)], SEP), makeString_11C({
553553 let $l = val_
554554 let $s = size($l)
555555 let $acc0 = nil
556556 func $f0_1 ($a,$i) = if (($i >= $s))
557557 then $a
558558 else foldFunc($a, $l[$i])
559559
560560 func $f0_2 ($a,$i) = if (($i >= $s))
561561 then $a
562562 else throw("List size exceeds 11")
563563
564564 $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)
565565 }, SEP))]
566566 }
567567
568568
569569 func _onlyThisContract (caller_) = if ((caller_ != this))
570570 then throw("_onlyThisContract: revert")
571571 else true
572572
573573
574574 func _whenMultisigSet () = if ((_loadMultisig() == Address(base58'')))
575575 then throw("_whenMultisigSet: revert")
576576 else true
577577
578578
579579 func _whenNotInitialized () = {
580580 let storage = _loadStorage()
581581 if ((storage._1 != base58''))
582582 then throw("_whenNotInitialized: revert")
583583 else true
584584 }
585585
586586
587587 func _whenInitialized () = {
588588 let storage = _loadStorage()
589589 if ((storage._1 == base58''))
590590 then throw("_whenInitialized: revert")
591591 else true
592592 }
593593
594594
595595 func _whenNotPaused () = if (_loadPause())
596596 then throw("_whenNotPaused: revert")
597597 else true
598598
599599
600600 func _whenPaused () = if (!(_loadPause()))
601601 then throw("_whenPaused: revert")
602602 else true
603603
604604
605605 func _onlyPauser (caller_) = if ((caller_ != _loadPauser()))
606606 then throw("_onlyPauser: revert")
607607 else true
608608
609609
610610 func _getDecimals (assetId_) = match assetInfo(fromBase58String(assetId_)) {
611611 case a: Asset =>
612612 a.decimals
613613 case _ =>
614614 throw(("_getDecimals: no asset=" + assetId_))
615615 }
616616
617617
618618 func _normalizeDecimals (amount_,sourceDecimals_,targetDecimals_,round_) = if ((sourceDecimals_ >= targetDecimals_))
619619 then fraction(amount_, 1, pow(10, 0, (sourceDecimals_ - targetDecimals_), 0, 0, DOWN), round_)
620620 else (amount_ * pow(10, 0, (targetDecimals_ - sourceDecimals_), 0, 0, DOWN))
621621
622622
623623 func _prepareAssetBalances (assets_) = {
624624 func foldFunc (acc,elem) = (acc :+ 0)
625625
626626 let $l = assets_
627627 let $s = size($l)
628628 let $acc0 = nil
629629 func $f0_1 ($a,$i) = if (($i >= $s))
630630 then $a
631631 else foldFunc($a, $l[$i])
632632
633633 func $f0_2 ($a,$i) = if (($i >= $s))
634634 then $a
635635 else throw("List size exceeds 10")
636636
637637 $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)
638638 }
639639
640640
641641 func _prepareAssetWeights (assetWeights_) = {
642642 func foldFunc (acc,elem) = {
643643 let weight = parseIntValue(elem)
644644 $Tuple2((acc._1 :+ weight), (acc._2 + weight))
645645 }
646646
647647 let $l = assetWeights_
648648 let $s = size($l)
649649 let $acc0 = $Tuple2(nil, 0)
650650 func $f0_1 ($a,$i) = if (($i >= $s))
651651 then $a
652652 else foldFunc($a, $l[$i])
653653
654654 func $f0_2 ($a,$i) = if (($i >= $s))
655655 then $a
656656 else throw("List size exceeds 10")
657657
658658 $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)
659659 }
660660
661661
662662 func _getAssetBalances (assets_,decimals_) = {
663663 func foldFunc (acc,elem) = {
664664 let assetDecimals = _getDecimals(elem)
665665 let balance = _normalizeDecimals(assetBalance(this, fromBase58String(elem)), assetDecimals, decimals_, DOWN)
666666 $Tuple2((acc._1 :+ balance), (acc._2 + balance))
667667 }
668668
669669 let $l = assets_
670670 let $s = size($l)
671671 let $acc0 = $Tuple2(nil, 0)
672672 func $f0_1 ($a,$i) = if (($i >= $s))
673673 then $a
674674 else foldFunc($a, $l[$i])
675675
676676 func $f0_2 ($a,$i) = if (($i >= $s))
677677 then $a
678678 else throw("List size exceeds 10")
679679
680680 $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)
681681 }
682682
683683
684684 func _listIntToString (assets_) = {
685685 func foldFunc (acc,elem) = (acc :+ toString(elem))
686686
687- makeString_11C({
687+ makeString({
688688 let $l = assets_
689689 let $s = size($l)
690690 let $acc0 = nil
691691 func $f0_1 ($a,$i) = if (($i >= $s))
692692 then $a
693693 else foldFunc($a, $l[$i])
694694
695695 func $f0_2 ($a,$i) = if (($i >= $s))
696696 then $a
697- else throw("List size exceeds 65")
698-
699- $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)
697+ else throw("List size exceeds 11")
698+
699+ $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)
700700 }, SEP)
701701 }
702702
703703
704704 func _listBigIntToString (assets_) = {
705705 func foldFunc (acc,elem) = (acc :+ toString(elem))
706706
707707 makeString({
708708 let $l = assets_
709709 let $s = size($l)
710710 let $acc0 = nil
711711 func $f0_1 ($a,$i) = if (($i >= $s))
712712 then $a
713713 else foldFunc($a, $l[$i])
714714
715715 func $f0_2 ($a,$i) = if (($i >= $s))
716716 then $a
717717 else throw("List size exceeds 11")
718718
719719 $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)
720720 }, SEP)
721721 }
722722
723723
724724 func _getEquilibriums (sigmaBalances_,weights_,sigmaWeight_) = {
725725 func foldFunc (acc,elem) = (acc :+ fraction(sigmaBalances_, elem, sigmaWeight_))
726726
727727 let $l = weights_
728728 let $s = size($l)
729729 let $acc0 = nil
730730 func $f0_1 ($a,$i) = if (($i >= $s))
731731 then $a
732732 else foldFunc($a, $l[$i])
733733
734734 func $f0_2 ($a,$i) = if (($i >= $s))
735735 then $a
736736 else throw("List size exceeds 10")
737737
738738 $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)
739739 }
740740
741741
742742 func _incrementBalancesByAmounts (balances_,amounts_) = {
743743 func foldFunc (acc,elem) = {
744744 let index = acc._1
745745 let amount = amounts_[index]
746746 let newBalance = (elem + amount)
747747 $Tuple3((index + 1), (acc._2 :+ newBalance), (acc._3 + newBalance))
748748 }
749749
750750 let result = {
751751 let $l = balances_
752752 let $s = size($l)
753753 let $acc0 = $Tuple3(0, nil, 0)
754754 func $f0_1 ($a,$i) = if (($i >= $s))
755755 then $a
756756 else foldFunc($a, $l[$i])
757757
758758 func $f0_2 ($a,$i) = if (($i >= $s))
759759 then $a
760760 else throw("List size exceeds 10")
761761
762762 $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)
763763 }
764764 $Tuple2(result._2, result._3)
765765 }
766766
767767
768768 func _incrementBalancesByPayments (balances_,payments_,assets_,decimals_,err_) = {
769769 func foldFunc (acc,elem) = {
770770 let index = acc._1
771771 let payment = payments_[index]
772772 let paymentAssetStr = _assetToStr(payment.assetId)
773773 let err = if ((paymentAssetStr != assets_[index]))
774774 then throw(((err_ + ": index=") + toString(index)))
775775 else unit
776776 if ((err == err))
777777 then {
778778 let assetDecimals = _getDecimals(paymentAssetStr)
779779 let newBalance = (elem + _normalizeDecimals(payments_[index].amount, assetDecimals, decimals_, DOWN))
780780 $Tuple3((index + 1), (acc._2 :+ newBalance), (acc._3 + newBalance))
781781 }
782782 else throw("Strict value is not equal to itself.")
783783 }
784784
785785 let result = {
786786 let $l = balances_
787787 let $s = size($l)
788788 let $acc0 = $Tuple3(0, nil, 0)
789789 func $f0_1 ($a,$i) = if (($i >= $s))
790790 then $a
791791 else foldFunc($a, $l[$i])
792792
793793 func $f0_2 ($a,$i) = if (($i >= $s))
794794 then $a
795795 else throw("List size exceeds 10")
796796
797797 $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)
798798 }
799799 $Tuple2(result._2, result._3)
800800 }
801801
802802
803803 func _incrementBalanceByIndex (balances_,index_,amount_) = {
804804 func foldFunc (acc,elem) = {
805805 let index = acc._1
806806 if ((index == index_))
807807 then $Tuple2((index + 1), (acc._2 :+ (elem + amount_)))
808808 else $Tuple2((index + 1), (acc._2 :+ elem))
809809 }
810810
811811 let result = {
812812 let $l = balances_
813813 let $s = size($l)
814814 let $acc0 = $Tuple2(0, nil)
815815 func $f0_1 ($a,$i) = if (($i >= $s))
816816 then $a
817817 else foldFunc($a, $l[$i])
818818
819819 func $f0_2 ($a,$i) = if (($i >= $s))
820820 then $a
821821 else throw("List size exceeds 10")
822822
823823 $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)
824824 }
825825 result._2
826826 }
827827
828828
829829 func _decrementBalanceByIndex (balances_,index_,amount_) = {
830830 func foldFunc (acc,elem) = {
831831 let index = acc._1
832832 if ((index == index_))
833833 then $Tuple2((index + 1), (acc._2 :+ (elem - amount_)))
834834 else $Tuple2((index + 1), (acc._2 :+ elem))
835835 }
836836
837837 let result = {
838838 let $l = balances_
839839 let $s = size($l)
840840 let $acc0 = $Tuple2(0, nil)
841841 func $f0_1 ($a,$i) = if (($i >= $s))
842842 then $a
843843 else foldFunc($a, $l[$i])
844844
845845 func $f0_2 ($a,$i) = if (($i >= $s))
846846 then $a
847847 else throw("List size exceeds 10")
848848
849849 $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)
850850 }
851851 result._2
852852 }
853853
854854
855855 func _decrementBalancesByLpAmount (balances_,amount_,lpTotalSupply_) = {
856856 let rate = fraction((lpTotalSupply_ - amount_), RATE_FACTOR, lpTotalSupply_, CEILING)
857857 func foldFunc (acc,elem) = {
858858 let newBalance = fraction(elem, rate, RATE_FACTOR, CEILING)
859859 let deltaBalance = (elem - newBalance)
860860 $Tuple3((acc._1 :+ newBalance), (acc._2 + newBalance), (acc._3 :+ deltaBalance))
861861 }
862862
863863 let $l = balances_
864864 let $s = size($l)
865865 let $acc0 = $Tuple3(nil, 0, nil)
866866 func $f0_1 ($a,$i) = if (($i >= $s))
867867 then $a
868868 else foldFunc($a, $l[$i])
869869
870870 func $f0_2 ($a,$i) = if (($i >= $s))
871871 then $a
872872 else throw("List size exceeds 10")
873873
874874 $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)
875875 }
876876
877877
878878 func _getPaymentsFromBalances (assets_,balances_,recipient_,sourceDecimals_) = {
879879 func foldFunc (acc,elem) = {
880880 let index = acc._1
881881 $Tuple2((index + 1), (acc._2 :+ ScriptTransfer(recipient_, _normalizeDecimals(balances_[index], sourceDecimals_, _getDecimals(elem), DOWN), _strToAsset(elem))))
882882 }
883883
884884 let result = {
885885 let $l = assets_
886886 let $s = size($l)
887887 let $acc0 = $Tuple2(0, nil)
888888 func $f0_1 ($a,$i) = if (($i >= $s))
889889 then $a
890890 else foldFunc($a, $l[$i])
891891
892892 func $f0_2 ($a,$i) = if (($i >= $s))
893893 then $a
894894 else throw("List size exceeds 10")
895895
896896 $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)
897897 }
898898 result._2
899899 }
900900
901901
902902 func _calculateMicroFee (balance_,equilibrium_,weightAmplifier_,slippageRate_,feeMaxRate_) = if ((equilibrium_ > balance_))
903903 then {
904904 let threshold = fraction(equilibrium_, (MAX_WEIGHT_AMPLIFIER - weightAmplifier_), MAX_WEIGHT_AMPLIFIER)
905905 if ((threshold > balance_))
906906 then {
907907 let maxDeviation = (threshold - balance_)
908908 let feeRate = fraction(fraction(maxDeviation, slippageRate_, SLIPPAGE_RATE_FACTOR), FEE_RATE_FACTOR, equilibrium_)
909909 if ((feeRate > feeMaxRate_))
910910 then fraction(maxDeviation, feeMaxRate_, FEE_RATE_FACTOR)
911911 else fraction(maxDeviation, feeRate, FEE_RATE_FACTOR)
912912 }
913913 else 0
914914 }
915915 else {
916916 let threshold = fraction(equilibrium_, (MAX_WEIGHT_AMPLIFIER + weightAmplifier_), MAX_WEIGHT_AMPLIFIER)
917917 if ((balance_ > threshold))
918918 then {
919919 let maxDeviation = (balance_ - threshold)
920920 let feeRate = fraction(fraction(maxDeviation, slippageRate_, SLIPPAGE_RATE_FACTOR), FEE_RATE_FACTOR, equilibrium_)
921921 if ((feeRate > feeMaxRate_))
922922 then fraction(maxDeviation, feeMaxRate_, FEE_RATE_FACTOR)
923923 else fraction(maxDeviation, feeRate, FEE_RATE_FACTOR)
924924 }
925925 else 0
926926 }
927927
928928
929929 func _calculateFee (balances_,assetsTotalSupply_,weights_,sigmaWeight_,weightAmplifier_,slippageRate_,feeMaxRate_) = {
930930 func foldFunc (acc,balance) = {
931931 let index = acc._1
932932 let equilibrium = fraction(assetsTotalSupply_, weights_[index], sigmaWeight_)
933933 $Tuple2((index + 1), (acc._2 + _calculateMicroFee(balance, equilibrium, weightAmplifier_, slippageRate_, feeMaxRate_)))
934934 }
935935
936936 let result = {
937937 let $l = balances_
938938 let $s = size($l)
939939 let $acc0 = $Tuple2(0, 0)
940940 func $f0_1 ($a,$i) = if (($i >= $s))
941941 then $a
942942 else foldFunc($a, $l[$i])
943943
944944 func $f0_2 ($a,$i) = if (($i >= $s))
945945 then $a
946946 else throw("List size exceeds 10")
947947
948948 $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)
949949 }
950950 result._2
951951 }
952952
953953
954954 func _validateLiquidityInvariant (prevAssetBalances_,prevAssetTotalSupply_,assetBalances_,assetTotalSupply_,prevLpTotalSupply_,lpTotalSupply_,assetWeights_,sigmaWeight_,weightAmplifier_,slippageRate_,feeMaxRate_) = if (if ((prevLpTotalSupply_ == 0))
955955 then true
956956 else (lpTotalSupply_ == 0))
957957 then true
958958 else {
959959 let prevAssetsRate = fraction((prevAssetTotalSupply_ - _calculateFee(prevAssetBalances_, prevAssetTotalSupply_, assetWeights_, sigmaWeight_, weightAmplifier_, slippageRate_, feeMaxRate_)), RATE_FACTOR, prevLpTotalSupply_)
960960 let newAssetsRate = fraction((assetTotalSupply_ - _calculateFee(assetBalances_, assetTotalSupply_, assetWeights_, sigmaWeight_, weightAmplifier_, slippageRate_, feeMaxRate_)), RATE_FACTOR, lpTotalSupply_)
961961 let diff = (newAssetsRate - prevAssetsRate)
962962 if (if ((0 >= diff))
963963 then ((-1 * _loadPrecision()) > diff)
964964 else false)
965965 then throw(("_validateLiquidityInvariant: revert: diff=" + toString(diff)))
966966 else true
967967 }
968968
969969
970970 func _validateSwapInvariant (prevAssetBalances_,prevAssetTotalSupply_,assetBalances_,assetTotalSupply_,assetWeights_,sigmaWeight_,weightAmplifier_,slippageRate_,feeMaxRate_) = {
971971 let prevUtil = (prevAssetTotalSupply_ - _calculateFee(prevAssetBalances_, prevAssetTotalSupply_, assetWeights_, sigmaWeight_, weightAmplifier_, slippageRate_, feeMaxRate_))
972972 let newUtil = (assetTotalSupply_ - _calculateFee(assetBalances_, assetTotalSupply_, assetWeights_, sigmaWeight_, weightAmplifier_, slippageRate_, feeMaxRate_))
973973 let diff = (newUtil - prevUtil)
974974 if (if ((0 >= diff))
975975 then ((-1 * _loadPrecision()) > diff)
976976 else false)
977977 then throw(("_validateSwapInvariant: revert: diff=" + toString(diff)))
978978 else true
979979 }
980980
981981
982982 func _validateAssetAllocation (balance_,assetTotalSupply_,prevBalance_,prevAssetTotalSupply_,weight_,sigmaWeight_,maxAllocAmp_) = {
983983 let equilibrium = fraction(assetTotalSupply_, weight_, sigmaWeight_)
984984 let maxAllocationAmp = if ((balance_ > equilibrium))
985985 then (MAX_AMPLIFIER + maxAllocAmp_)
986986 else (MAX_AMPLIFIER - maxAllocAmp_)
987987 let maxAllocation = fraction(equilibrium, maxAllocationAmp, MAX_AMPLIFIER)
988988 let prevMaxAllocation = fraction(fraction(prevAssetTotalSupply_, weight_, sigmaWeight_), maxAllocationAmp, MAX_AMPLIFIER)
989989 if ((balance_ > equilibrium))
990990 then if ((balance_ > maxAllocation))
991991 then if ((prevMaxAllocation > prevBalance_))
992992 then throw("_validateAssetAllocation: new up")
993993 else if (((balance_ - maxAllocation) > (prevBalance_ - prevMaxAllocation)))
994994 then throw("_validateAssetAllocation: still up")
995995 else true
996996 else true
997997 else if ((maxAllocation > balance_))
998998 then if ((prevBalance_ > prevMaxAllocation))
999999 then throw("_validateAssetAllocation: new down")
10001000 else if (((maxAllocation - balance_) > (prevMaxAllocation - prevBalance_)))
10011001 then throw("_validateAssetAllocation: still down")
10021002 else true
10031003 else true
10041004 }
10051005
10061006
10071007 func _validateAllocation (assetBalances_,assetTotalSupply_,prevAssetBalances_,prevAssetTotalSupply_,assetWeights_,sigmaWeight_,maxAllocAmp_) = {
10081008 func foldFunc (acc,elem) = {
10091009 let index = acc._1
10101010 $Tuple2((index + 1), if (acc._2)
10111011 then _validateAssetAllocation(elem, assetTotalSupply_, prevAssetBalances_[index], prevAssetTotalSupply_, assetWeights_[index], sigmaWeight_, maxAllocAmp_)
10121012 else false)
10131013 }
10141014
10151015 let result = {
10161016 let $l = assetBalances_
10171017 let $s = size($l)
10181018 let $acc0 = $Tuple2(0, true)
10191019 func $f0_1 ($a,$i) = if (($i >= $s))
10201020 then $a
10211021 else foldFunc($a, $l[$i])
10221022
10231023 func $f0_2 ($a,$i) = if (($i >= $s))
10241024 then $a
10251025 else throw("List size exceeds 10")
10261026
10271027 $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)
10281028 }
10291029 result._2
10301030 }
10311031
10321032
10331033 func _checkpoint (user_) = {
10341034 let userLp = _loadUserLp(user_)
10351035 let userProfits = _loadUserProfits(user_)
10361036 let sigmaFeePerLp = _loadSigmaFeePerLp()
10371037 let userSigmaFeePerLp = _loadUserSigmaFeePerLp(user_)
10381038 func foldFunc (acc,elem) = {
10391039 let index = acc._1
10401040 let profitUpdated = (userProfits[index] + toInt(fraction(toBigInt(userLp), (sigmaFeePerLp[index] - userSigmaFeePerLp[index]), PERCENT_FACTOR)))
10411041 $Tuple2((index + 1), (acc._2 :+ profitUpdated))
10421042 }
10431043
1044- let $t02462924702 = {
1044+ let $t02460524678 = {
10451045 let $l = ZERO_INT_LIST_11
10461046 let $s = size($l)
10471047 let $acc0 = $Tuple2(0, nil)
10481048 func $f0_1 ($a,$i) = if (($i >= $s))
10491049 then $a
10501050 else foldFunc($a, $l[$i])
10511051
10521052 func $f0_2 ($a,$i) = if (($i >= $s))
10531053 then $a
10541054 else throw("List size exceeds 11")
10551055
10561056 $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)
10571057 }
1058- let idx = $t02462924702._1
1059- let profitsUpdated = $t02462924702._2
1058+ let idx = $t02460524678._1
1059+ let profitsUpdated = $t02460524678._2
10601060 $Tuple2((_saveUserProfits(user_, profitsUpdated) ++ _saveUserSigmaFeePerLp(user_, sigmaFeePerLp)), profitsUpdated)
10611061 }
10621062
10631063
10641064 func _updateSigmaFeePerLp (sigmaFeePerLp_,totalLp_,index_,lpFee_) = {
10651065 func foldFunc (acc,elem) = {
10661066 let index = acc._1
10671067 let sigmaFeePerLpUpdated = if ((index_ == index))
10681068 then (sigmaFeePerLp_[index] + fraction(toBigInt(lpFee_), PERCENT_FACTOR, toBigInt(totalLp_)))
10691069 else sigmaFeePerLp_[index]
10701070 $Tuple2((index + 1), (acc._2 :+ sigmaFeePerLpUpdated))
10711071 }
10721072
1073- let $t02535225431 = {
1073+ let $t02532825407 = {
10741074 let $l = ZERO_INT_LIST_11
10751075 let $s = size($l)
10761076 let $acc0 = $Tuple2(0, nil)
10771077 func $f0_1 ($a,$i) = if (($i >= $s))
10781078 then $a
10791079 else foldFunc($a, $l[$i])
10801080
10811081 func $f0_2 ($a,$i) = if (($i >= $s))
10821082 then $a
10831083 else throw("List size exceeds 11")
10841084
10851085 $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)
10861086 }
1087- let idx = $t02535225431._1
1088- let sigmaFeePerLpUpdated = $t02535225431._2
1087+ let idx = $t02532825407._1
1088+ let sigmaFeePerLpUpdated = $t02532825407._2
10891089 sigmaFeePerLpUpdated
10901090 }
10911091
10921092
10931093 func _calculateLpAndProtocolFees (assetIndex_,amount_,lpFeeRate_,protocolFeeRate_) = {
10941094 let sigmaFeePerLp = _loadSigmaFeePerLp()
10951095 let totalLp = _loadTotalLp()
1096- let $t02565225927 = if ((totalLp == 0))
1096+ let $t02562825903 = if ((totalLp == 0))
10971097 then $Tuple2(0, fraction(amount_, protocolFeeRate_, MAX_FEE))
10981098 else $Tuple2(fraction(amount_, lpFeeRate_, MAX_FEE), fraction(amount_, protocolFeeRate_, MAX_FEE))
1099- let lpFee = $t02565225927._1
1100- let protocolFee = $t02565225927._2
1099+ let lpFee = $t02562825903._1
1100+ let protocolFee = $t02562825903._2
11011101 let sigmaFeePerLpUpdated = if ((lpFee == 0))
11021102 then sigmaFeePerLp
11031103 else _updateSigmaFeePerLp(sigmaFeePerLp, totalLp, assetIndex_, lpFee)
11041104 $Tuple3(lpFee, protocolFee, sigmaFeePerLpUpdated)
11051105 }
11061106
11071107
11081108 func _depositAll (amount_) = {
11091109 let storage = _loadStorage()
11101110 let lpTotalSupply = storage._3
11111111 let weightAmplifier = storage._7
11121112 let slippageRate = storage._8
11131113 let feeMaxRate = storage._9
11141114 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))
1115+ let $t02641226465 = _loadAssetWeights()
1116+ let assetWeights = $t02641226465._1
1117+ let sigmaWeight = $t02641226465._2
1118+ let $t02647026538 = _loadAssetBalances()
1119+ let prevAssetBalances = $t02647026538._1
1120+ let prevAssetTotalSupply = $t02647026538._2
1121+ let $t02654427774 = if ((prevAssetTotalSupply == 0))
11221122 then {
11231123 func foldFunc (acc,elem) = {
11241124 let index = acc._1
11251125 let requiredAmountNormalized = fraction(assetWeights[index], amount_, sigmaWeight)
11261126 $Tuple2((index + 1), (acc._2 :+ requiredAmountNormalized))
11271127 }
11281128
1129- let $t02701027084 = {
1129+ let $t02698627060 = {
11301130 let $l = assets
11311131 let $s = size($l)
11321132 let $acc0 = $Tuple2(0, nil)
11331133 func $f0_1 ($a,$i) = if (($i >= $s))
11341134 then $a
11351135 else foldFunc($a, $l[$i])
11361136
11371137 func $f0_2 ($a,$i) = if (($i >= $s))
11381138 then $a
11391139 else throw("List size exceeds 10")
11401140
11411141 $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)
11421142 }
1143- let idx = $t02701027084._1
1144- let requiredAmountsNormalized = $t02701027084._2
1143+ let idx = $t02698627060._1
1144+ let requiredAmountsNormalized = $t02698627060._2
11451145 $Tuple2(amount_, requiredAmountsNormalized)
11461146 }
11471147 else {
11481148 let ratio = fraction(toBigInt(amount_), PERCENT_FACTOR, toBigInt(prevAssetTotalSupply))
11491149 func foldFunc1 (acc,elem) = {
11501150 let index = acc._1
11511151 let requiredAmountNormalized = toInt(fraction(ratio, toBigInt(prevAssetBalances[index]), PERCENT_FACTOR))
11521152 $Tuple2((index + 1), (acc._2 :+ requiredAmountNormalized))
11531153 }
11541154
1155- let $t02762727702 = {
1155+ let $t02760327678 = {
11561156 let $l = assets
11571157 let $s = size($l)
11581158 let $acc0 = $Tuple2(0, nil)
11591159 func $f0_1 ($a,$i) = if (($i >= $s))
11601160 then $a
11611161 else foldFunc1($a, $l[$i])
11621162
11631163 func $f0_2 ($a,$i) = if (($i >= $s))
11641164 then $a
11651165 else throw("List size exceeds 10")
11661166
11671167 $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)
11681168 }
1169- let idx = $t02762727702._1
1170- let requiredAmountsNormalized = $t02762727702._2
1169+ let idx = $t02760327678._1
1170+ let requiredAmountsNormalized = $t02760327678._2
11711171 $Tuple2(fraction(amount_, lpTotalSupply, prevAssetTotalSupply), requiredAmountsNormalized)
11721172 }
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 lpTokensToMint = $t02654427774._1
1174+ let requiredAmountsNormalized = $t02654427774._2
1175+ let $t02778027893 = _incrementBalancesByAmounts(prevAssetBalances, requiredAmountsNormalized)
1176+ let assetBalances = $t02778027893._1
1177+ let assetTotalSupply = $t02778027893._2
11781178 let err2 = _validateLiquidityInvariant(prevAssetBalances, prevAssetTotalSupply, assetBalances, assetTotalSupply, lpTotalSupply, (lpTotalSupply + lpTokensToMint), assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
11791179 if ((err2 == err2))
11801180 then $Tuple3(lpTokensToMint, requiredAmountsNormalized, assetBalances)
11811181 else throw("Strict value is not equal to itself.")
11821182 }
11831183
11841184
11851185 func _deposit (assetId_,amount_) = {
11861186 let storage = _loadStorage()
11871187 let lpTotalSupply = storage._3
1188+ let lpFeeRate = storage._4
1189+ let protocolFeeRate = storage._5
11881190 let maxAllocAmplifier = storage._6
11891191 let weightAmplifier = storage._7
11901192 let slippageRate = storage._8
11911193 let feeMaxRate = storage._9
11921194 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
1195+ let $t02865628709 = _loadAssetWeights()
1196+ let assetWeights = $t02865628709._1
1197+ let sigmaWeight = $t02865628709._2
1198+ let $t02871428828 = _loadAssetBalances()
1199+ let prevAssetBalances = $t02871428828._1
1200+ let prevAssetTotalSupply = $t02871428828._2
11991201 let assetBalances = _incrementBalanceByIndex(prevAssetBalances, value(indexOf(assets, assetId_)), amount_)
12001202 let assetTotalSupply = (prevAssetTotalSupply + amount_)
12011203 let err2 = _validateAllocation(assetBalances, assetTotalSupply, prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, maxAllocAmplifier)
12021204 if ((err2 == err2))
12031205 then {
12041206 let prevFee = _calculateFee(prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
12051207 let fee = _calculateFee(assetBalances, assetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
12061208 let lpTokensToMint = if ((lpTotalSupply == 0))
1207- then (assetTotalSupply - fee)
1209+ then throw("_deposit: empty pool")
12081210 else {
12091211 let assetDiff = (assetTotalSupply - prevAssetTotalSupply)
12101212 let feeDiff = (fee - prevFee)
12111213 let utilityChangeFactor = fraction((assetDiff - feeDiff), RATE_FACTOR, (prevAssetTotalSupply - prevFee))
12121214 let lpTokensToMintInner = fraction(lpTotalSupply, utilityChangeFactor, RATE_FACTOR)
12131215 let err3 = _validateLiquidityInvariant(prevAssetBalances, prevAssetTotalSupply, assetBalances, assetTotalSupply, lpTotalSupply, (lpTotalSupply + lpTokensToMintInner), assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
12141216 if ((err3 == err3))
12151217 then lpTokensToMintInner
12161218 else throw("Strict value is not equal to itself.")
12171219 }
1218- $Tuple2(lpTokensToMint, assetBalances)
1220+ let $t03049030621 = _calculateLpAndProtocolFees(0, lpTokensToMint, (lpFeeRate / 2), (protocolFeeRate / 2))
1221+ let lpFee = $t03049030621._1
1222+ let protocolFee = $t03049030621._2
1223+ let sigmaFeePerLpUpdated = $t03049030621._3
1224+ $Tuple5(lpTokensToMint, assetBalances, lpFee, protocolFee, sigmaFeePerLpUpdated)
12191225 }
12201226 else throw("Strict value is not equal to itself.")
12211227 }
12221228
12231229
12241230 func _withdrawAll (amount_) = {
12251231 let storage = _loadStorage()
12261232 let lpTotalSupply = storage._3
1227- let lpFeeRate = storage._4
1228- 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 $t03095531023 = _loadAssetBalances()
1238+ let prevAssetBalances = $t03095531023._1
1239+ let prevAssetTotalSupply = $t03095531023._2
1240+ let $t03102831081 = _loadAssetWeights()
1241+ let assetWeights = $t03102831081._1
1242+ let sigmaWeight = $t03102831081._2
12391243 let lpTokensToBurn = amount_
12401244 let err = _validateInt(lpTokensToBurn, 0, MAX_INT, "_withdrawAll: lpTokensToBurn less than 0")
12411245 if ((err == err))
12421246 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 $t03122331356 = _decrementBalancesByLpAmount(prevAssetBalances, lpTokensToBurn, lpTotalSupply)
1248+ let assetBalances = $t03122331356._1
1249+ let assetTotalSupply = $t03122331356._2
1250+ let balancesToPay = $t03122331356._3
12471251 let err2 = _validateLiquidityInvariant(prevAssetBalances, prevAssetTotalSupply, assetBalances, assetTotalSupply, lpTotalSupply, (lpTotalSupply - lpTokensToBurn), assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
12481252 if ((err2 == err2))
12491253 then $Tuple3(lpTokensToBurn, balancesToPay, assetBalances)
12501254 else throw("Strict value is not equal to itself.")
12511255 }
12521256 else throw("Strict value is not equal to itself.")
12531257 }
12541258
12551259
12561260 func _withdraw (assetId_,lpAmount_) = {
12571261 let storage = _loadStorage()
12581262 let lpTotalSupply = storage._3
12591263 let lpFeeRate = storage._4
12601264 let protocolFeeRate = storage._5
12611265 let maxAllocAmplifier = storage._6
12621266 let weightAmplifier = storage._7
12631267 let slippageRate = storage._8
12641268 let feeMaxRate = storage._9
12651269 let precision = _loadPrecision()
12661270 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
1271+ let $t03214832216 = _loadAssetBalances()
1272+ let prevAssetBalances = $t03214832216._1
1273+ let prevAssetTotalSupply = $t03214832216._2
1274+ let $t03222132274 = _loadAssetWeights()
1275+ let assetWeights = $t03222132274._1
1276+ let sigmaWeight = $t03222132274._2
12731277 let targetAssetIndex = value(indexOf(assets, assetId_))
12741278 let prevFee = _calculateFee(prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
12751279 let prevUtilValue = (prevAssetTotalSupply - prevFee)
12761280 let k = fraction(toBigInt((lpTotalSupply - lpAmount_)), PERCENT_FACTOR, toBigInt(lpTotalSupply))
12771281 let prevUtilValueWithK = toInt(fraction(toBigInt(prevUtilValue), k, PERCENT_FACTOR))
12781282 func foldFunc (acc,elem) = if (acc._1)
12791283 then acc
12801284 else {
12811285 let startInner = acc._2
12821286 let stopInner = acc._3
12831287 let currentAmount = ((stopInner + startInner) / 2)
12841288 let tempAssetBalances = _decrementBalanceByIndex(prevAssetBalances, targetAssetIndex, currentAmount)
12851289 let tempAssetTotalSupply = (prevAssetTotalSupply - currentAmount)
12861290 let utilValue = (tempAssetTotalSupply - _calculateFee(tempAssetBalances, tempAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate))
12871291 if (if ((precision > (utilValue - prevUtilValueWithK)))
12881292 then ((utilValue - prevUtilValueWithK) >= 0)
12891293 else false)
12901294 then $Tuple4(true, startInner, stopInner, currentAmount)
12911295 else if ((0 > (utilValue - prevUtilValueWithK)))
1292- then $Tuple4(false, startInner, currentAmount, 0)
1293- else $Tuple4(false, currentAmount, stopInner, 0)
1296+ then $Tuple4(false, startInner, currentAmount, currentAmount)
1297+ else $Tuple4(false, currentAmount, stopInner, currentAmount)
12941298 }
12951299
12961300 let targetAmount = {
1297- let $t03352933644 = {
1301+ let $t03379733912 = {
12981302 let $l = LIST_64
12991303 let $s = size($l)
13001304 let $acc0 = $Tuple4(false, 0, (lpAmount_ + prevFee), 0)
13011305 func $f0_1 ($a,$i) = if (($i >= $s))
13021306 then $a
13031307 else foldFunc($a, $l[$i])
13041308
13051309 func $f0_2 ($a,$i) = if (($i >= $s))
13061310 then $a
13071311 else throw("List size exceeds 64")
13081312
13091313 $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)
13101314 }
1311- let success = $t03352933644._1
1312- let startOut = $t03352933644._2
1313- let stopOut = $t03352933644._3
1314- let targetAmountOut = $t03352933644._4
1315+ let success = $t03379733912._1
1316+ let startOut = $t03379733912._2
1317+ let stopOut = $t03379733912._3
1318+ let targetAmountOut = $t03379733912._4
13151319 if (!(success))
13161320 then throw(("_withdraw: can't calculate targetAmount=" + toString(targetAmountOut)))
13171321 else targetAmountOut
13181322 }
13191323 let finalAssetBalances = _decrementBalanceByIndex(prevAssetBalances, targetAssetIndex, targetAmount)
13201324 let finalAssetTotalSupply = (prevAssetTotalSupply - targetAmount)
13211325 let err1 = if (_validateAllocation(finalAssetBalances, finalAssetTotalSupply, prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, maxAllocAmplifier))
13221326 then _validateLiquidityInvariant(prevAssetBalances, prevAssetTotalSupply, finalAssetBalances, finalAssetTotalSupply, lpTotalSupply, (lpTotalSupply - lpAmount_), assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
13231327 else false
13241328 if ((err1 == err1))
13251329 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
1330+ let $t03487035018 = _calculateLpAndProtocolFees((targetAssetIndex + 1), targetAmount, (lpFeeRate / 2), (protocolFeeRate / 2))
1331+ let lpFee = $t03487035018._1
1332+ let protocolFee = $t03487035018._2
1333+ let sigmaFeePerLpUpdated = $t03487035018._3
13301334 $Tuple5(targetAmount, finalAssetBalances, lpFee, protocolFee, sigmaFeePerLpUpdated)
13311335 }
13321336 else throw("Strict value is not equal to itself.")
13331337 }
13341338
13351339
13361340 func _swap (sourceAssetIndex_,targetAssetIndex_,sourceAmount_) = {
13371341 let storage = _loadStorage()
13381342 let lpAssetId = storage._1
13391343 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
13401344 let lpTotalSupply = storage._3
13411345 let lpFeeRate = storage._4
13421346 let protocolFeeRate = storage._5
13431347 let maxAllocAmplifier = storage._6
13441348 let weightAmplifier = storage._7
13451349 let slippageRate = storage._8
13461350 let feeMaxRate = storage._9
13471351 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
1352+ let $t03560035668 = _loadAssetBalances()
1353+ let prevAssetBalances = $t03560035668._1
1354+ let prevAssetTotalSupply = $t03560035668._2
1355+ let $t03567335726 = _loadAssetWeights()
1356+ let assetWeights = $t03567335726._1
1357+ let sigmaWeight = $t03567335726._2
13541358 let assetBalances = _incrementBalanceByIndex(prevAssetBalances, sourceAssetIndex_, sourceAmount_)
13551359 let assetTotalSupply = (prevAssetTotalSupply + sourceAmount_)
13561360 let prevFee = _calculateFee(prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
13571361 let prevUtilValue = (prevAssetTotalSupply - prevFee)
13581362 func foldFunc (acc,elem) = if (acc._1)
13591363 then acc
13601364 else {
13611365 let startInner = acc._2
13621366 let stopInner = acc._3
13631367 let currentAmount = ((stopInner + startInner) / 2)
13641368 let tempAssetBalances = _decrementBalanceByIndex(assetBalances, targetAssetIndex_, currentAmount)
13651369 let tempAssetTotalSupply = (assetTotalSupply - currentAmount)
13661370 let utilValue = (tempAssetTotalSupply - _calculateFee(tempAssetBalances, tempAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate))
13671371 if (if (((utilValue - prevUtilValue) > (-1 * precision)))
13681372 then (precision > (utilValue - prevUtilValue))
13691373 else false)
1370- then $Tuple5(true, startInner, stopInner, currentAmount, (acc._5 :+ utilValue))
1374+ then $Tuple4(true, startInner, stopInner, currentAmount)
13711375 else if ((0 > (utilValue - prevUtilValue)))
1372- then $Tuple5(false, startInner, currentAmount, currentAmount, (acc._5 :+ utilValue))
1373- else $Tuple5(false, currentAmount, stopInner, currentAmount, (acc._5 :+ utilValue))
1376+ then $Tuple4(false, startInner, currentAmount, currentAmount)
1377+ else $Tuple4(false, currentAmount, stopInner, currentAmount)
13741378 }
13751379
13761380 let targetAmount = {
13771381 let targetAmount = sourceAmount_
13781382 let tempAssetBalances = _decrementBalanceByIndex(assetBalances, targetAssetIndex_, targetAmount)
13791383 let tempAssetTotalSupply = (assetTotalSupply - targetAmount)
13801384 let fee = _calculateFee(tempAssetBalances, tempAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
13811385 let feeDiff = (fee - prevFee)
13821386 if ((feeDiff == 0))
13831387 then targetAmount
13841388 else {
1385- let $t03732837458 = {
1389+ let $t03761337732 = {
13861390 let $l = LIST_64
13871391 let $s = size($l)
1388- let $acc0 = $Tuple5(false, 0, (sourceAmount_ + prevFee), 0, nil)
1392+ let $acc0 = $Tuple4(false, 0, (sourceAmount_ + prevFee), 0)
13891393 func $f0_1 ($a,$i) = if (($i >= $s))
13901394 then $a
13911395 else foldFunc($a, $l[$i])
13921396
13931397 func $f0_2 ($a,$i) = if (($i >= $s))
13941398 then $a
13951399 else throw("List size exceeds 64")
13961400
13971401 $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)
13981402 }
1399- let success = $t03732837458._1
1400- let startOut = $t03732837458._2
1401- let stopOut = $t03732837458._3
1402- let targetAmountOut = $t03732837458._4
1403- let debug = $t03732837458._5
1403+ let success = $t03761337732._1
1404+ let startOut = $t03761337732._2
1405+ let stopOut = $t03761337732._3
1406+ let targetAmountOut = $t03761337732._4
14041407 if (!(success))
1405- then throw(_listIntToString(debug))
1408+ then throw(("_swap: can't calculate targetAmount=" + toString(targetAmountOut)))
14061409 else targetAmountOut
14071410 }
14081411 }
14091412 let finalAssetBalances = _decrementBalanceByIndex(assetBalances, targetAssetIndex_, targetAmount)
14101413 let finalAssetTotalSupply = (assetTotalSupply - targetAmount)
14111414 let err1 = if (_validateAllocation(finalAssetBalances, finalAssetTotalSupply, prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, maxAllocAmplifier))
14121415 then _validateSwapInvariant(prevAssetBalances, prevAssetTotalSupply, finalAssetBalances, finalAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
14131416 else false
14141417 if ((err1 == err1))
14151418 then {
1416- let $t03832638467 = _calculateLpAndProtocolFees((targetAssetIndex_ + 1), targetAmount, lpFeeRate, protocolFeeRate)
1417- let lpFee = $t03832638467._1
1418- let protocolFee = $t03832638467._2
1419- let sigmaFeePerLpUpdated = $t03832638467._3
1419+ let $t03854538686 = _calculateLpAndProtocolFees((targetAssetIndex_ + 1), targetAmount, lpFeeRate, protocolFeeRate)
1420+ let lpFee = $t03854538686._1
1421+ let protocolFee = $t03854538686._2
1422+ let sigmaFeePerLpUpdated = $t03854538686._3
14201423 $Tuple5(targetAmount, finalAssetBalances, lpFee, protocolFee, sigmaFeePerLpUpdated)
14211424 }
14221425 else throw("Strict value is not equal to itself.")
14231426 }
14241427
14251428
14261429 @Callable(i)
14271430 func init (assets_,assetWeights_,lpFeeRate_,protocolFeeRate_,lpTokenName_,lpTokenDescr_,lpTokenDecimals_,maxAllocationAmplifier_,weightAmplifier_,slippageRate_,feeMaxRate_,protocolFeeContract_,precision_,pauser_) = {
14281431 let err = if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (_onlyThisContract(i.caller))
14291432 then _whenNotInitialized()
14301433 else false)
14311434 then _whenMultisigSet()
14321435 else false)
14331436 then _validateAssets(assets_, "init: invalid assets")
14341437 else false)
14351438 then _validateIntList(assetWeights_, 1, MAX_WEIGHT, "init: invalid assetWeights")
14361439 else false)
14371440 then _validateIntEquals(size(assets_), size(assetWeights_), "init: invalid assetWeights size")
14381441 else false)
14391442 then _validateInt(lpFeeRate_, 0, MAX_FEE, "init: invalid lp fee")
14401443 else false)
14411444 then _validateInt(protocolFeeRate_, 0, MAX_FEE, "init: invalid protocol fee")
14421445 else false)
14431446 then _validateTokenName(lpTokenName_, "init: invalid name")
14441447 else false)
14451448 then _validateTokenDescr(lpTokenDescr_, "init: invalid descr")
14461449 else false)
14471450 then _validateDecimals(lpTokenDecimals_, "init: invalid decimals")
14481451 else false)
14491452 then _validateInt(maxAllocationAmplifier_, 0, MAX_AMPLIFIER, "init: invalid maxAllocationAmplifier")
14501453 else false)
14511454 then _validateInt(weightAmplifier_, 0, maxAllocationAmplifier_, "init: invalid weightAmplifier")
14521455 else false)
14531456 then _validateInt(slippageRate_, 0, MAX_INT, "init: invalid slippageRate")
14541457 else false)
14551458 then _validateInt(feeMaxRate_, 0, MAX_INT, "init: invalid feeMaxRate")
14561459 else false)
14571460 then _validateAddress(protocolFeeContract_, "init: invalid protocolFeeContract")
14581461 else false)
14591462 then _validateInt(precision_, 1, MAX_INT, "init: invalid precision")
14601463 else false)
14611464 then _validateAddress(pauser_, "init: invalid pauser")
14621465 else false
14631466 if ((err == err))
14641467 then {
1465- let $t04033040399 = _prepareAssetWeights(assetWeights_)
1466- let assetWeights = $t04033040399._1
1467- let sigmaWeight = $t04033040399._2
1468+ let $t04054940618 = _prepareAssetWeights(assetWeights_)
1469+ let assetWeights = $t04054940618._1
1470+ let sigmaWeight = $t04054940618._2
14681471 let assetBalances = _prepareAssetBalances(assets_)
14691472 let issue = Issue(lpTokenName_, lpTokenDescr_, 0, lpTokenDecimals_, true)
14701473 let lpAssetId = calculateAssetId(issue)
14711474 let storageUpdated = $Tuple10(lpAssetId, true, 0, lpFeeRate_, protocolFeeRate_, maxAllocationAmplifier_, weightAmplifier_, slippageRate_, feeMaxRate_, addressFromStringValue(protocolFeeContract_))
14721475 $Tuple2(((((((([issue] ++ _saveStorage(storageUpdated)) ++ _saveAssets(assets_)) ++ _saveAssetBalances(assetBalances)) ++ _saveAssetWeights(assetWeights)) ++ _savePrecision(precision_)) ++ _saveSigmaFeePerLp(_loadSigmaFeePerLp())) ++ _savePauser(addressFromStringValue(pauser_))), unit)
14731476 }
14741477 else throw("Strict value is not equal to itself.")
14751478 }
14761479
14771480
14781481
14791482 @Callable(i)
14801483 func depositAll (amount_) = {
14811484 let err = if (if (_whenInitialized())
14821485 then _whenNotPaused()
14831486 else false)
14841487 then _validateInt(amount_, 0, MAX_INT, "depositAll: invalid amount")
14851488 else false
14861489 if ((err == err))
14871490 then {
14881491 let storage = _loadStorage()
14891492 let lpAssetId = storage._1
14901493 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
14911494 let assets = _loadAssets()
1492- let $t04214942234 = _depositAll(amount_)
1493- let lpTokensToMint = $t04214942234._1
1494- let requiredAmountsNormalized = $t04214942234._2
1495- let assetBalances = $t04214942234._3
1495+ let $t04236842453 = _depositAll(amount_)
1496+ let lpTokensToMint = $t04236842453._1
1497+ let requiredAmountsNormalized = $t04236842453._2
1498+ let assetBalances = $t04236842453._3
14961499 func foldFunc (acc,elem) = {
14971500 let index = acc._1
14981501 let paymentAssetStr = _assetToStr(i.payments[index].assetId)
14991502 let paymentAssetDecimals = _getDecimals(paymentAssetStr)
15001503 let requiredAmountNormalized = requiredAmountsNormalized[index]
15011504 let requiredAmount = _normalizeDecimals(requiredAmountNormalized, lpDecimals, paymentAssetDecimals, CEILING)
15021505 let err1 = if ((paymentAssetStr != elem))
15031506 then throw(("depositAll: invalid payment: index=" + toString(index)))
15041507 else if ((0 >= requiredAmount))
15051508 then throw("depositAll: too little amount required")
15061509 else unit
15071510 if ((err1 == err1))
15081511 then {
15091512 let change = if ((i.payments[index].amount > requiredAmount))
15101513 then [ScriptTransfer(i.caller, (i.payments[index].amount - requiredAmount), i.payments[index].assetId)]
15111514 else if ((requiredAmount > i.payments[index].amount))
15121515 then throw(((("depositAll: insufficient payment, index=" + toString(index)) + ", required=") + toString(requiredAmount)))
15131516 else nil
15141517 $Tuple2((index + 1), (acc._2 ++ change))
15151518 }
15161519 else throw("Strict value is not equal to itself.")
15171520 }
15181521
1519- let $t04337743439 = {
1522+ let $t04359643658 = {
15201523 let $l = assets
15211524 let $s = size($l)
15221525 let $acc0 = $Tuple2(0, nil)
15231526 func $f0_1 ($a,$i) = if (($i >= $s))
15241527 then $a
15251528 else foldFunc($a, $l[$i])
15261529
15271530 func $f0_2 ($a,$i) = if (($i >= $s))
15281531 then $a
15291532 else throw("List size exceeds 10")
15301533
15311534 $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)
15321535 }
1533- let idx = $t04337743439._1
1534- let changeActions = $t04337743439._2
1536+ let idx = $t04359643658._1
1537+ let changeActions = $t04359643658._2
15351538 let storageUpdated = $Tuple10(storage._1, storage._2, (storage._3 + lpTokensToMint), storage._4, storage._5, storage._6, storage._7, storage._8, storage._9, storage._10)
15361539 $Tuple2(((([Reissue(lpAssetId, lpTokensToMint, true), ScriptTransfer(i.caller, lpTokensToMint, lpAssetId)] ++ _saveStorage(storageUpdated)) ++ _saveAssetBalances(assetBalances)) ++ changeActions), unit)
15371540 }
15381541 else throw("Strict value is not equal to itself.")
15391542 }
15401543
15411544
15421545
15431546 @Callable(i)
15441547 func deposit (minLpAmount_) = {
15451548 let err = _validateInt(minLpAmount_, 0, MAX_INT, "deposit: invalid min lp amount")
15461549 if ((err == err))
15471550 then {
15481551 let storage = _loadStorage()
15491552 let lpAssetId = storage._1
1550- let lpDecimals = _getDecimals(toBase58String(lpAssetId))
1553+ let lpAssetIdStr = _assetToStr(lpAssetId)
1554+ let lpDecimals = _getDecimals(lpAssetIdStr)
15511555 let err1 = if (if (if (if (_whenInitialized())
15521556 then _whenNotPaused()
15531557 else false)
15541558 then _validateIntEquals(size(i.payments), 1, "deposit: invalid payments size")
15551559 else false)
15561560 then _validateListContains(_loadAssets(), _assetToStr(i.payments[0].assetId), "deposit: invalid payment asset")
15571561 else false)
15581562 then _validateInt(i.payments[0].amount, 1, MAX_INT, "deposit: invalid payment amount")
15591563 else false
15601564 if ((err1 == err1))
15611565 then {
15621566 let assetStr = _assetToStr(i.payments[0].assetId)
15631567 let assetDecimals = _getDecimals(assetStr)
15641568 let amountNormalized = _normalizeDecimals(i.payments[0].amount, assetDecimals, lpDecimals, DOWN)
1565- let $t04481844892 = _deposit(assetStr, amountNormalized)
1566- let lpTokensToMint = $t04481844892._1
1567- let assetBalances = $t04481844892._2
1568- let err2 = _validateInt(lpTokensToMint, minLpAmount_, MAX_INT, "deposit: less than min lp")
1569+ let $t04507045186 = _deposit(assetStr, amountNormalized)
1570+ let lpTokensToMint = $t04507045186._1
1571+ let assetBalances = $t04507045186._2
1572+ let lpFee = $t04507045186._3
1573+ let protocolFee = $t04507045186._4
1574+ let sigmaFeePerLpUpdated = $t04507045186._5
1575+ let lpTokensToSend = ((lpTokensToMint - lpFee) - protocolFee)
1576+ let err2 = _validateInt(lpTokensToSend, minLpAmount_, MAX_INT, "deposit: less than min")
15691577 if ((err2 == err2))
15701578 then {
15711579 let storageUpdated = $Tuple10(storage._1, storage._2, (storage._3 + lpTokensToMint), storage._4, storage._5, storage._6, storage._7, storage._8, storage._9, storage._10)
1572- $Tuple2((([Reissue(lpAssetId, lpTokensToMint, true), ScriptTransfer(i.caller, lpTokensToMint, lpAssetId)] ++ _saveStorage(storageUpdated)) ++ _saveAssetBalances(assetBalances)), unit)
1580+ $Tuple2(((((([Reissue(lpAssetId, lpTokensToMint, true), ScriptTransfer(i.caller, lpTokensToSend, lpAssetId)] ++ _saveStorage(storageUpdated)) ++ _saveAssetBalances(assetBalances)) ++ _saveLpFee(lpAssetIdStr, (lpFee + _loadLpFee(lpAssetIdStr)))) ++ _saveProtocolFee(lpAssetIdStr, (protocolFee + _loadProtocolFee(lpAssetIdStr)))) ++ _saveSigmaFeePerLp(sigmaFeePerLpUpdated)), unit)
15731581 }
15741582 else throw("Strict value is not equal to itself.")
15751583 }
15761584 else throw("Strict value is not equal to itself.")
15771585 }
15781586 else throw("Strict value is not equal to itself.")
15791587 }
15801588
15811589
15821590
15831591 @Callable(i)
15841592 func withdrawAll () = {
15851593 let storage = _loadStorage()
15861594 let lpAssetId = storage._1
15871595 let lpAssetIdStr = toBase58String(lpAssetId)
15881596 let lpDecimals = _getDecimals(lpAssetIdStr)
15891597 let assets = _loadAssets()
15901598 let err = if (if (if (if (_whenInitialized())
15911599 then _whenNotPaused()
15921600 else false)
15931601 then _validateIntEquals(size(i.payments), 1, "withdrawAll: invalid payments size")
15941602 else false)
15951603 then _validateStringEqual(lpAssetIdStr, _assetToStr(i.payments[0].assetId), "withdrawAll: invalid payment asset")
15961604 else false)
15971605 then _validateInt(i.payments[0].amount, 1, MAX_INT, "withdrawAll: invalid payment amount")
15981606 else false
15991607 if ((err == err))
16001608 then {
1601- let $t04611346200 = _withdrawAll(i.payments[0].amount)
1602- let lpTokensToBurn = $t04611346200._1
1603- let balancesToPay = $t04611346200._2
1604- let assetBalances = $t04611346200._3
1609+ let $t04667546762 = _withdrawAll(i.payments[0].amount)
1610+ let lpTokensToBurn = $t04667546762._1
1611+ let balancesToPay = $t04667546762._2
1612+ let assetBalances = $t04667546762._3
16051613 let paymentActions = _getPaymentsFromBalances(assets, balancesToPay, i.caller, lpDecimals)
16061614 let storageUpdated = $Tuple10(storage._1, storage._2, (storage._3 - lpTokensToBurn), storage._4, storage._5, storage._6, storage._7, storage._8, storage._9, storage._10)
16071615 $Tuple2(((([Burn(lpAssetId, lpTokensToBurn)] ++ paymentActions) ++ _saveStorage(storageUpdated)) ++ _saveAssetBalances(assetBalances)), unit)
16081616 }
16091617 else throw("Strict value is not equal to itself.")
16101618 }
16111619
16121620
16131621
16141622 @Callable(i)
16151623 func withdraw (assetId_,minAmount_) = {
16161624 let storage = _loadStorage()
16171625 let lpAssetId = storage._1
16181626 let lpAssetIdStr = toBase58String(lpAssetId)
16191627 let lpDecimals = _getDecimals(lpAssetIdStr)
16201628 let assets = _loadAssets()
16211629 let err = if (if (if (if (if (if (_whenInitialized())
16221630 then _whenNotPaused()
16231631 else false)
16241632 then _validateIntEquals(size(i.payments), 1, "withdraw: invalid payments size")
16251633 else false)
16261634 then _validateStringEqual(lpAssetIdStr, _assetToStr(i.payments[0].assetId), "withdraw: invalid payment asset")
16271635 else false)
16281636 then _validateInt(i.payments[0].amount, 1, MAX_INT, "withdraw: invalid payment amount")
16291637 else false)
16301638 then _validateListContains(assets, assetId_, "withdraw: invalid assetId")
16311639 else false)
16321640 then _validateInt(minAmount_, 0, MAX_INT, "withdraw: invalid minAmount")
16331641 else false
16341642 if ((err == err))
16351643 then {
1636- let $t04752647660 = _withdraw(assetId_, i.payments[0].amount)
1637- let targetAmountNormalized = $t04752647660._1
1638- let finalAssetBalances = $t04752647660._2
1639- let lpFee = $t04752647660._3
1640- let protocolFee = $t04752647660._4
1641- let sigmaFeePerLpUpdated = $t04752647660._5
1644+ let $t04808848222 = _withdraw(assetId_, i.payments[0].amount)
1645+ let targetAmountNormalized = $t04808848222._1
1646+ let finalAssetBalances = $t04808848222._2
1647+ let lpFee = $t04808848222._3
1648+ let protocolFee = $t04808848222._4
1649+ let sigmaFeePerLpUpdated = $t04808848222._5
16421650 let finalAmountNormalized = ((targetAmountNormalized - lpFee) - protocolFee)
16431651 let targetDecimals = _getDecimals(assetId_)
16441652 let finalAmount = _normalizeDecimals(finalAmountNormalized, lpDecimals, targetDecimals, DOWN)
1645- let err1 = _validateInt(finalAmount, minAmount_, MAX_INT, "withdraw: insufficient final amount")
1653+ let err1 = _validateInt(finalAmount, minAmount_, MAX_INT, "withdraw: less than min")
16461654 if ((err1 == err1))
16471655 then {
16481656 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)
16491657 $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)
16501658 }
16511659 else throw("Strict value is not equal to itself.")
16521660 }
16531661 else throw("Strict value is not equal to itself.")
16541662 }
16551663
16561664
16571665
16581666 @Callable(i)
16591667 func swap (targetAssetId_,minAmount_) = {
16601668 let storage = _loadStorage()
16611669 let lpAssetId = storage._1
16621670 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
16631671 let assets = _loadAssets()
16641672 let sourceAssetStr = _assetToStr(i.payments[0].assetId)
16651673 let sourceAmountNormalized = _normalizeDecimals(i.payments[0].amount, _getDecimals(sourceAssetStr), lpDecimals, DOWN)
16661674 let sourceAssetIndex = valueOrErrorMessage(indexOf(assets, sourceAssetStr), "swap: invalid source asset")
16671675 if ((sourceAssetIndex == sourceAssetIndex))
16681676 then {
16691677 let targetAssetIndex = valueOrErrorMessage(indexOf(assets, targetAssetId_), "swap: invalid target asset")
16701678 if ((targetAssetIndex == targetAssetIndex))
16711679 then {
16721680 let err = if (if (if (if (if (_whenInitialized())
16731681 then _whenNotPaused()
16741682 else false)
16751683 then _validateInt(minAmount_, 0, MAX_INT, "swap: invalid min target amount")
16761684 else false)
16771685 then _validateInt(sourceAmountNormalized, 1, MAX_INT, "swap: invalid source amount")
16781686 else false)
16791687 then _validateStringNotEq(sourceAssetStr, targetAssetId_, "swap: same assets")
16801688 else false)
16811689 then _validateIntEquals(size(i.payments), 1, "swap: invalid payments size")
16821690 else false
16831691 if ((err == err))
16841692 then {
1685- let $t04975749915 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
1686- let targetAmountNormalized = $t04975749915._1
1687- let finalAssetBalances = $t04975749915._2
1688- let lpFee = $t04975749915._3
1689- let protocolFee = $t04975749915._4
1690- let sigmaFeePerLpUpdated = $t04975749915._5
1693+ let $t05030750465 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
1694+ let targetAmountNormalized = $t05030750465._1
1695+ let finalAssetBalances = $t05030750465._2
1696+ let lpFee = $t05030750465._3
1697+ let protocolFee = $t05030750465._4
1698+ let sigmaFeePerLpUpdated = $t05030750465._5
16911699 let finalAmountNormalized = ((targetAmountNormalized - lpFee) - protocolFee)
16921700 let targetDecimals = _getDecimals(targetAssetId_)
16931701 let finalAmount = _normalizeDecimals(finalAmountNormalized, lpDecimals, targetDecimals, DOWN)
1694- let err1 = _validateInt(finalAmount, minAmount_, MAX_INT, "swap: insufficient final amount")
1702+ let err1 = _validateInt(finalAmount, minAmount_, MAX_INT, "swap: less than min")
16951703 if ((err1 == err1))
16961704 then $Tuple2((((([ScriptTransfer(i.caller, finalAmount, _strToAsset(targetAssetId_))] ++ _saveAssetBalances(finalAssetBalances)) ++ _saveLpFee(targetAssetId_, (lpFee + _loadLpFee(targetAssetId_)))) ++ _saveProtocolFee(targetAssetId_, (protocolFee + _loadProtocolFee(targetAssetId_)))) ++ _saveSigmaFeePerLp(sigmaFeePerLpUpdated)), unit)
16971705 else throw("Strict value is not equal to itself.")
16981706 }
16991707 else throw("Strict value is not equal to itself.")
17001708 }
17011709 else throw("Strict value is not equal to itself.")
17021710 }
17031711 else throw("Strict value is not equal to itself.")
17041712 }
17051713
17061714
17071715
17081716 @Callable(i)
17091717 func getDepositAll (lpAmount_) = {
17101718 let err = _validateInt(lpAmount_, 1, MAX_INT, "getDepositAll: invalid amount")
17111719 if ((err == err))
17121720 then {
1713- let $t05104751134 = _depositAll(lpAmount_)
1714- let lpTokensToMint = $t05104751134._1
1715- let requiredAmountsNormalized = $t05104751134._2
1716- let assetBalances = $t05104751134._3
1721+ let $t05158551672 = _depositAll(lpAmount_)
1722+ let lpTokensToMint = $t05158551672._1
1723+ let requiredAmountsNormalized = $t05158551672._2
1724+ let assetBalances = $t05158551672._3
17171725 $Tuple2(nil, $Tuple2(lpTokensToMint, requiredAmountsNormalized))
17181726 }
17191727 else throw("Strict value is not equal to itself.")
17201728 }
17211729
17221730
17231731
17241732 @Callable(i)
17251733 func getDeposit (assetId_,amount_) = {
17261734 let err = if (_validateListContains(_loadAssets(), assetId_, "getDeposit: invalid asset"))
17271735 then _validateInt(amount_, 1, MAX_INT, "getDeposit: invalid amount")
17281736 else false
17291737 if ((err == err))
17301738 then {
17311739 let storage = _loadStorage()
17321740 let lpAssetId = storage._1
17331741 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
17341742 let assetDecimals = _getDecimals(assetId_)
17351743 let amountNormalized = _normalizeDecimals(amount_, assetDecimals, lpDecimals, DOWN)
1736- let $t05189351967 = _deposit(assetId_, amountNormalized)
1737- let lpTokensToMint = $t05189351967._1
1738- let assetBalances = $t05189351967._2
1739- $Tuple2(nil, lpTokensToMint)
1744+ let $t05243152547 = _deposit(assetId_, amountNormalized)
1745+ let lpTokensToMint = $t05243152547._1
1746+ let assetBalances = $t05243152547._2
1747+ let lpFee = $t05243152547._3
1748+ let protocolFee = $t05243152547._4
1749+ let sigmaFeePerLpUpdated = $t05243152547._5
1750+ let lpTokensToSend = ((lpTokensToMint - lpFee) - protocolFee)
1751+ $Tuple2(nil, lpTokensToSend)
17401752 }
17411753 else throw("Strict value is not equal to itself.")
17421754 }
17431755
17441756
17451757
17461758 @Callable(i)
17471759 func getWithdrawAll (lpAmount_) = {
17481760 let err = _validateInt(lpAmount_, 0, MAX_INT, "getWithdrawAll: invalid amount")
17491761 if ((err == err))
17501762 then {
1751- let $t05234452420 = _withdrawAll(lpAmount_)
1752- let lpTokensToBurn = $t05234452420._1
1753- let balancesToGet = $t05234452420._2
1754- let assetBalances = $t05234452420._3
1763+ let $t05298653062 = _withdrawAll(lpAmount_)
1764+ let lpTokensToBurn = $t05298653062._1
1765+ let balancesToGet = $t05298653062._2
1766+ let assetBalances = $t05298653062._3
17551767 $Tuple2(nil, balancesToGet)
17561768 }
17571769 else throw("Strict value is not equal to itself.")
17581770 }
17591771
17601772
17611773
17621774 @Callable(i)
17631775 func getWithdraw (assetId_,amount_) = {
17641776 let err = if (_validateListContains(_loadAssets(), assetId_, "getWithdraw: invalid asset"))
17651777 then _validateInt(amount_, 1, MAX_INT, "getWithdraw: invalid amount")
17661778 else false
17671779 if ((err == err))
17681780 then {
17691781 let storage = _loadStorage()
17701782 let lpAssetId = storage._1
17711783 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
1772- let $t05307153187 = _withdraw(assetId_, amount_)
1773- let targetAmountNormalized = $t05307153187._1
1774- let assetBalances = $t05307153187._2
1775- let lpFee = $t05307153187._3
1776- let protocolFee = $t05307153187._4
1777- let sigmaFeePerLpUpdated = $t05307153187._5
1784+ let $t05371353829 = _withdraw(assetId_, amount_)
1785+ let targetAmountNormalized = $t05371353829._1
1786+ let assetBalances = $t05371353829._2
1787+ let lpFee = $t05371353829._3
1788+ let protocolFee = $t05371353829._4
1789+ let sigmaFeePerLpUpdated = $t05371353829._5
17781790 let finalAmountNormalized = ((targetAmountNormalized - lpFee) - protocolFee)
17791791 let targetDecimals = _getDecimals(assetId_)
17801792 let finalAmount = _normalizeDecimals(finalAmountNormalized, lpDecimals, targetDecimals, DOWN)
17811793 $Tuple2(nil, finalAmount)
17821794 }
17831795 else throw("Strict value is not equal to itself.")
17841796 }
17851797
17861798
17871799
17881800 @Callable(i)
17891801 func getSwap (sourceAssetId_,targetAssetId_,sourceAmount_) = {
17901802 let storage = _loadStorage()
17911803 let lpAssetId = storage._1
17921804 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
17931805 let assets = _loadAssets()
17941806 let sourceAssetIndex = valueOrErrorMessage(indexOf(assets, sourceAssetId_), "swap: invalid source asset")
17951807 if ((sourceAssetIndex == sourceAssetIndex))
17961808 then {
17971809 let targetAssetIndex = valueOrErrorMessage(indexOf(assets, targetAssetId_), "swap: invalid target asset")
17981810 if ((targetAssetIndex == targetAssetIndex))
17991811 then {
18001812 let sourceAmountNormalized = _normalizeDecimals(sourceAmount_, _getDecimals(sourceAssetId_), lpDecimals, DOWN)
18011813 let err = if (_validateInt(sourceAmountNormalized, 1, MAX_INT, "swap: invalid source amount"))
18021814 then _validateStringNotEq(sourceAssetId_, targetAssetId_, "swap: same assets")
18031815 else false
18041816 if ((err == err))
18051817 then {
1806- let $t05460154759 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
1807- let targetAmountNormalized = $t05460154759._1
1808- let finalAssetBalances = $t05460154759._2
1809- let lpFee = $t05460154759._3
1810- let protocolFee = $t05460154759._4
1811- let sigmaFeePerLpUpdated = $t05460154759._5
1818+ let $t05524355401 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
1819+ let targetAmountNormalized = $t05524355401._1
1820+ let finalAssetBalances = $t05524355401._2
1821+ let lpFee = $t05524355401._3
1822+ let protocolFee = $t05524355401._4
1823+ let sigmaFeePerLpUpdated = $t05524355401._5
18121824 let finalAmountNormalized = ((targetAmountNormalized - lpFee) - protocolFee)
18131825 let targetDecimals = _getDecimals(targetAssetId_)
18141826 let finalAmount = _normalizeDecimals(finalAmountNormalized, lpDecimals, targetDecimals, DOWN)
18151827 $Tuple2(nil, finalAmount)
18161828 }
18171829 else throw("Strict value is not equal to itself.")
18181830 }
18191831 else throw("Strict value is not equal to itself.")
18201832 }
18211833 else throw("Strict value is not equal to itself.")
18221834 }
18231835
18241836
18251837
18261838 @Callable(i)
18271839 func getClaim (user_) = {
18281840 let user = if ((size(user_) > 0))
18291841 then valueOrErrorMessage(addressFromString(user_), "getClaim: invalid user")
18301842 else i.caller
1831- let $t05540155457 = _checkpoint(user)
1832- let checkpointActions = $t05540155457._1
1833- let userProfits = $t05540155457._2
1843+ let $t05604356099 = _checkpoint(user)
1844+ let checkpointActions = $t05604356099._1
1845+ let userProfits = $t05604356099._2
18341846 $Tuple2(nil, userProfits)
18351847 }
18361848
18371849
18381850
18391851 @Callable(i)
18401852 func getUtilFunc () = {
18411853 let storage = _loadStorage()
18421854 let lpTotalSupply = storage._3
18431855 let weightAmplifier = storage._7
18441856 let slippageRate = storage._8
18451857 let feeMaxRate = storage._9
1846- let $t05579055850 = _loadAssetBalances()
1847- let assetBalances = $t05579055850._1
1848- let assetTotalSupply = $t05579055850._2
1849- let $t05585555908 = _loadAssetWeights()
1850- let assetWeights = $t05585555908._1
1851- let sigmaWeight = $t05585555908._2
1858+ let $t05643256492 = _loadAssetBalances()
1859+ let assetBalances = $t05643256492._1
1860+ let assetTotalSupply = $t05643256492._2
1861+ let $t05649756550 = _loadAssetWeights()
1862+ let assetWeights = $t05649756550._1
1863+ let sigmaWeight = $t05649756550._2
18521864 let fee = _calculateFee(assetBalances, assetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
18531865 let utilValue = (assetTotalSupply - fee)
18541866 $Tuple2(nil, $Tuple2(utilValue, lpTotalSupply))
1867+ }
1868+
1869+
1870+
1871+@Callable(i)
1872+func getFeeFunc () = {
1873+ let storage = _loadStorage()
1874+ let weightAmplifier = storage._7
1875+ let slippageRate = storage._8
1876+ let feeMaxRate = storage._9
1877+ let $t05698257042 = _loadAssetBalances()
1878+ let assetBalances = $t05698257042._1
1879+ let assetTotalSupply = $t05698257042._2
1880+ let $t05704757100 = _loadAssetWeights()
1881+ let assetWeights = $t05704757100._1
1882+ let sigmaWeight = $t05704757100._2
1883+ let fee = _calculateFee(assetBalances, assetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
1884+ $Tuple2(nil, fee)
18551885 }
18561886
18571887
18581888
18591889 @Callable(i)
18601890 func checkpoint (user_) = {
18611891 let err = if (_whenInitialized())
18621892 then _whenNotPaused()
18631893 else false
18641894 if ((err == err))
18651895 then {
18661896 let user = if ((size(user_) > 0))
18671897 then valueOrErrorMessage(addressFromString(user_), "checkpoint: invalid user")
18681898 else i.caller
18691899 _checkpoint(user)
18701900 }
18711901 else throw("Strict value is not equal to itself.")
18721902 }
18731903
18741904
18751905
18761906 @Callable(i)
18771907 func stake () = {
18781908 let err = if (_whenInitialized())
18791909 then _whenNotPaused()
18801910 else false
18811911 if ((err == err))
18821912 then {
18831913 let storage = _loadStorage()
18841914 let lpAssetIdStr = _assetToStr(storage._1)
18851915 let err1 = if (if (_validateIntEquals(size(i.payments), 1, "stake: invalid payments size"))
18861916 then _validateStringEqual(lpAssetIdStr, _assetToStr(i.payments[0].assetId), "stake: invalid payment asset")
18871917 else false)
18881918 then _validateInt(i.payments[0].amount, 0, MAX_INT, "stake: invalid payment amount")
18891919 else false
18901920 if ((err1 == err1))
18911921 then {
1892- let $t05698157041 = _checkpoint(i.caller)
1893- let checkpointActions = $t05698157041._1
1894- let userProfits = $t05698157041._2
1922+ let $t05810858168 = _checkpoint(i.caller)
1923+ let checkpointActions = $t05810858168._1
1924+ let userProfits = $t05810858168._2
18951925 $Tuple2(((checkpointActions ++ _saveUserLp(i.caller, (_loadUserLp(i.caller) + i.payments[0].amount))) ++ _saveTotalLp((_loadTotalLp() + i.payments[0].amount))), unit)
18961926 }
18971927 else throw("Strict value is not equal to itself.")
18981928 }
18991929 else throw("Strict value is not equal to itself.")
19001930 }
19011931
19021932
19031933
19041934 @Callable(i)
19051935 func unstake (amount_) = {
19061936 let err = if (_whenInitialized())
19071937 then _whenNotPaused()
19081938 else false
19091939 if ((err == err))
19101940 then {
19111941 let storage = _loadStorage()
19121942 let lpAssetId = storage._1
19131943 let userLp = _loadUserLp(i.caller)
19141944 let err1 = _validateInt(amount_, 0, userLp, "unstake: invalid amount")
19151945 if ((err1 == err1))
19161946 then {
1917- let $t05755257612 = _checkpoint(i.caller)
1918- let checkpointActions = $t05755257612._1
1919- let userProfits = $t05755257612._2
1947+ let $t05867958739 = _checkpoint(i.caller)
1948+ let checkpointActions = $t05867958739._1
1949+ let userProfits = $t05867958739._2
19201950 $Tuple2(((([ScriptTransfer(i.caller, amount_, lpAssetId)] ++ checkpointActions) ++ _saveUserLp(i.caller, (userLp - amount_))) ++ _saveTotalLp((_loadTotalLp() - amount_))), unit)
19211951 }
19221952 else throw("Strict value is not equal to itself.")
19231953 }
19241954 else throw("Strict value is not equal to itself.")
19251955 }
19261956
19271957
19281958
19291959 @Callable(i)
19301960 func claim (user_) = {
19311961 let err = if (_whenInitialized())
19321962 then _whenNotPaused()
19331963 else false
19341964 if ((err == err))
19351965 then {
19361966 let user = if ((size(user_) > 0))
19371967 then valueOrErrorMessage(addressFromString(user_), "claim: invalid user")
19381968 else i.caller
19391969 let storage = _loadStorage()
19401970 let lpAssetId = storage._1
19411971 let lpAssetIdStr = _assetToStr(lpAssetId)
19421972 let assets = [lpAssetIdStr, _loadAssets()]
19431973 let maxIndex = (size(assets) - 1)
19441974 let userLp = _loadUserLp(user)
1945- let $t05833558391 = _checkpoint(user)
1946- let checkpointActions = $t05833558391._1
1947- let userProfits = $t05833558391._2
1975+ let $t05946259518 = _checkpoint(user)
1976+ let checkpointActions = $t05946259518._1
1977+ let userProfits = $t05946259518._2
19481978 func foldFunc (acc,profit) = {
19491979 let index = acc._1
19501980 if (if ((maxIndex >= index))
19511981 then (profit > 0)
19521982 else false)
19531983 then {
19541984 let asset = assets[index]
19551985 $Tuple3((index + 1), (acc._2 :+ 0), (acc._3 :+ ScriptTransfer(user, profit, _strToAsset(asset))))
19561986 }
19571987 else $Tuple3((index + 1), (acc._2 :+ profit), acc._3)
19581988 }
19591989
1960- let $t05876958860 = {
1990+ let $t05989659987 = {
19611991 let $l = userProfits
19621992 let $s = size($l)
19631993 let $acc0 = $Tuple3(0, nil, nil)
19641994 func $f0_1 ($a,$i) = if (($i >= $s))
19651995 then $a
19661996 else foldFunc($a, $l[$i])
19671997
19681998 func $f0_2 ($a,$i) = if (($i >= $s))
19691999 then $a
19702000 else throw("List size exceeds 11")
19712001
19722002 $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)
19732003 }
1974- let idx = $t05876958860._1
1975- let userProfitsUpdated = $t05876958860._2
1976- let profitActions = $t05876958860._3
2004+ let idx = $t05989659987._1
2005+ let userProfitsUpdated = $t05989659987._2
2006+ let profitActions = $t05989659987._3
19772007 $Tuple2(((profitActions ++ removeByIndex(checkpointActions, 0)) ++ _saveUserProfits(user, userProfitsUpdated)), unit)
19782008 }
19792009 else throw("Strict value is not equal to itself.")
19802010 }
19812011
19822012
19832013
19842014 @Callable(i)
19852015 func pause () = {
19862016 let err = if (if (_onlyPauser(i.caller))
19872017 then _whenInitialized()
19882018 else false)
19892019 then _whenNotPaused()
19902020 else false
19912021 if ((err == err))
19922022 then $Tuple2(_savePause(true), unit)
19932023 else throw("Strict value is not equal to itself.")
19942024 }
19952025
19962026
19972027
19982028 @Callable(i)
19992029 func unpause () = {
20002030 let err = if (if (_onlyPauser(i.caller))
20012031 then _whenInitialized()
20022032 else false)
20032033 then _whenPaused()
20042034 else false
20052035 if ((err == err))
20062036 then $Tuple2(_savePause(false), unit)
20072037 else throw("Strict value is not equal to itself.")
20082038 }
20092039
20102040
20112041
20122042 @Callable(i)
20132043 func updatePauser (pauser_) = {
20142044 let err = if (if (_onlyThisContract(i.caller))
20152045 then _whenInitialized()
20162046 else false)
20172047 then _validateAddress(pauser_, "updatePauser: invalid pauser")
20182048 else false
20192049 if ((err == err))
20202050 then $Tuple2(_savePauser(addressFromStringValue(pauser_)), unit)
20212051 else throw("Strict value is not equal to itself.")
20222052 }
20232053
20242054
20252055
20262056 @Callable(i)
20272057 func setMultisig (multisig_) = {
20282058 let err = if (_onlyThisContract(i.caller))
20292059 then _validateAddress(multisig_, "setMultisig: invalid multisig")
20302060 else false
20312061 if ((err == err))
20322062 then $Tuple2(_saveMultisig(addressFromStringValue(multisig_)), unit)
20332063 else throw("Strict value is not equal to itself.")
20342064 }
20352065
20362066
20372067 @Verifier(tx)
2038-func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
2068+func verify () = match getString(KEY_MULTISIG) {
2069+ case multisig: String =>
2070+ valueOrElse(getBoolean(addressFromStringValue(multisig), makeString([KEY_STATUS, toString(this), toBase58String(tx.id)], SEP)), false)
2071+ case _ =>
2072+ sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
2073+}
20392074

github/deemru/w8io/873ac7e 
257.81 ms