tx · 53hx9dPENCdbrLXVPcTUazWfExKWy9U4usqPqBPJVyrG

3PLrr8LpfYjUadnEQ1ov61uMWHdMopUCNAm:  -0.06000000 Waves

2024.03.26 17:11 [4101036] smart account 3PLrr8LpfYjUadnEQ1ov61uMWHdMopUCNAm > SELF 0.00000000 Waves

{ "type": 13, "id": "53hx9dPENCdbrLXVPcTUazWfExKWy9U4usqPqBPJVyrG", "fee": 6000000, "feeAssetId": null, "timestamp": 1711462283738, "version": 2, "chainId": 87, "sender": "3PLrr8LpfYjUadnEQ1ov61uMWHdMopUCNAm", "senderPublicKey": "9iad7wmJLjXSuuid6X6UicRw3yJkLkSMrJoyKdDd5zbx", "proofs": [ "5xVV6V2rFYo7QfHYFq4JMkPqcc3w9obiuPoJxDVg1jRnvZXEMQpxTfmqrCi6qfN1eG2iQ8XBGofTwGzYbRitutZg" ], "script": "base64:BgKMAQgCEhAKDhgYAQEICAEBAQEBCAEIEgMKAQESAwoBARIAEgQKAggBEgQKAggBEgMKAQESBAoCCAESAwoBARIECgIIARIFCgMICAESAwoBCBIAEgASAwoBCBIAEgMKAQESAwoBCBIDCgEIEgQKAgEBEgYKBAEBAQESABIAEgASAwoBCBIECgIIARIDCgEIfwADU0VQAgJfXwAFV0FWRVMCBXdhdmVzAAdNQVhfSU5UAP//////////fwAHTUFYX0ZFRQDAhD0ADU1BWF9BTVBMSUZJRVIAwIQ9ABRNQVhfV0VJR0hUX0FNUExJRklFUgDAhD0ACk1BWF9XRUlHSFQAwIQ9AA9GRUVfUkFURV9GQUNUT1IAwIQ9AAtSQVRFX0ZBQ1RPUgDAhD0ADlBFUkNFTlRfRkFDVE9SCQC2AgEAgICQu7rWrfANABdESVNCQWxBTkNFX0NPRUZGX0ZBQ1RPUgkAtgIBAICglKWNHQAQWkVST19JTlRfTElTVF8xMAkAzAgCAAAJAMwIAgAACQDMCAIAAAkAzAgCAAAJAMwIAgAACQDMCAIAAAkAzAgCAAAJAMwIAgAACQDMCAIAAAkAzAgCAAAFA25pbAAQWkVST19JTlRfTElTVF8xMQkAzQgCBRBaRVJPX0lOVF9MSVNUXzEwAAAACklOREVYX0xJU1QJAMwIAgAACQDMCAIAAQkAzAgCAAIJAMwIAgADCQDMCAIABAkAzAgCAAUJAMwIAgAGCQDMCAIABwkAzAgCAAgJAMwIAgAJBQNuaWwAC1pFUk9fQklHSU5UCQC2AgEAAAATWkVST19CSUdJTlRfTElTVF8xMQkAzAgCBQtaRVJPX0JJR0lOVAkAzAgCBQtaRVJPX0JJR0lOVAkAzAgCBQtaRVJPX0JJR0lOVAkAzAgCBQtaRVJPX0JJR0lOVAkAzAgCBQtaRVJPX0JJR0lOVAkAzAgCBQtaRVJPX0JJR0lOVAkAzAgCBQtaRVJPX0JJR0lOVAkAzAgCBQtaRVJPX0JJR0lOVAkAzAgCBQtaRVJPX0JJR0lOVAkAzAgCBQtaRVJPX0JJR0lOVAkAzAgCBQtaRVJPX0JJR0lOVAUDbmlsAAxJTlRfREVDSU1BTFMACAAPQklHSU5UX0RFQ0lNQUxTABIAB0xJU1RfNjQJAL0JAgJ/MF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMAIBXwAMS0VZX01VTFRJU0lHAghNVUxUSVNJRwAKS0VZX1NUQVRVUwIGU1RBVFVTAApLRVlfUEFVU0VEAgZQQVVTRUQACktFWV9QQVVTRVICBlBBVVNFUgALS0VZX1NUT1JBR0UCB1NUT1JBR0UACktFWV9BU1NFVFMCBkFTU0VUUwASS0VZX0FTU0VUX0JBTEFOQ0VTAg5BU1NFVF9CQUxBTkNFUwATS0VZX1JFV0FSRF9CQUxBTkNFUwIPUkVXQVJEX0JBTEFOQ0VTABFLRVlfQVNTRVRfV0VJR0hUUwINQVNTRVRfV0VJR0hUUwAKS0VZX0xQX0ZFRQIGTFBfRkVFABBLRVlfUFJPVE9DT0xfRkVFAgxQUk9UT0NPTF9GRUUADUtFWV9QUkVDSVNJT04CCVBSRUNJU0lPTgAUS0VZX1NJR01BX0ZFRV9QRVJfTFACEFNJR01BX0ZFRV9QRVJfTFAAGUtFWV9VU0VSX1NJR01BX0ZFRV9QRVJfTFACFVVTRVJfU0lHTUFfRkVFX1BFUl9MUAALS0VZX1VTRVJfTFACB1VTRVJfTFAADEtFWV9UT1RBTF9MUAIIVE9UQUxfTFAAEEtFWV9VU0VSX1BST0ZJVFMCDFVTRVJfUFJPRklUUwAMS0VZX1dBVENIRE9HAghXQVRDSERPRwATS0VZX1dBVENIRE9HX09GRlNFVAIPV0FUQ0hET0dfT0ZGU0VUABNLRVlfV0FUQ0hET0dfSEVJR0hUAg9XQVRDSERPR19IRUlHSFQBEF92YWxpZGF0ZUFkZHJlc3MCCGFkZHJlc3NfBGVycl8EByRtYXRjaDAJAKYIAQUIYWRkcmVzc18DCQABAgUHJG1hdGNoMAIHQWRkcmVzcwQBYQUHJG1hdGNoMAYJAAIBBQRlcnJfAQ5fdmFsaWRhdGVBc3NldAIIYXNzZXRJZF8EZXJyXwMJAAACBQhhc3NldElkXwUFV0FWRVMGBAckbWF0Y2gwCQDsBwEJANkEAQUIYXNzZXRJZF8DCQABAgUHJG1hdGNoMAIFQXNzZXQEAWEFByRtYXRjaDAGCQACAQUEZXJyXwEMX3ZhbGlkYXRlSW50BAR2YWxfDmxvd2VyQm91bmRhcnlfDnVwcGVyQm91bmRhcnlfBGVycl8DAwkAZgIFDmxvd2VyQm91bmRhcnlfBQR2YWxfBgkAZgIFBHZhbF8FDnVwcGVyQm91bmRhcnlfCQACAQUEZXJyXwYBDV92YWxpZGF0ZUJvb2wDBHZhbF8HdGFyZ2V0XwRlcnJfAwkBAiE9AgUEdmFsXwUHdGFyZ2V0XwkAAgEFBGVycl8GARRfdmFsaWRhdGVTdHJpbmdFcXVhbAMFdmFsMV8FdmFsMl8EZXJyXwMJAQIhPQIFBXZhbDFfBQV2YWwyXwkAAgEFBGVycl8GARRfdmFsaWRhdGVTdHJpbmdOb3RFcQMFdmFsMV8FdmFsMl8EZXJyXwMJAAACBQV2YWwxXwUFdmFsMl8JAAIBBQRlcnJfBgEQX3ZhbGlkYXRlSW50TGlzdAQEdmFsXw5sb3dlckJvdW5kYXJ5Xw51cHBlckJvdW5kYXJ5XwRlcnJfCgEIZm9sZEZ1bmMCA2FjYwRlbGVtBAckbWF0Y2gwCQC2CQEFBGVsZW0DCQABAgUHJG1hdGNoMAIDSW50BAFhBQckbWF0Y2gwAwUDYWNjCQEMX3ZhbGlkYXRlSW50BAUBYQUObG93ZXJCb3VuZGFyeV8FDnVwcGVyQm91bmRhcnlfBQRlcnJfBwkAAgEFBGVycl8KAAIkbAUEdmFsXwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAGCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQhmb2xkRnVuYwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgEPX3ZhbGlkYXRlQXNzZXRzAgdhc3NldHNfBGVycl8KAQhmb2xkRnVuYwIDYWNjBGVsZW0DBQNhY2MJAQ5fdmFsaWRhdGVBc3NldAIFBGVsZW0FBGVycl8HCgACJGwFB2Fzc2V0c18KAAIkcwkAkAMBBQIkbAoABSRhY2MwBgoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEIZm9sZEZ1bmMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoBEl92YWxpZGF0ZUludEVxdWFscwMFdmFsMV8FdmFsMl8EZXJyXwMJAQIhPQIFBXZhbDFfBQV2YWwyXwkAAgEFBGVycl8GARJfdmFsaWRhdGVUb2tlbk5hbWUCBHZhbF8EZXJyXwMDCQBmAgAECQCxAgEFBHZhbF8GCQBmAgkAsQIBBQR2YWxfABAJAAIBBQRlcnJfBgETX3ZhbGlkYXRlVG9rZW5EZXNjcgIEdmFsXwRlcnJfAwkAZgIJALECAQUEdmFsXwDoBwkAAgEFBGVycl8GARFfdmFsaWRhdGVEZWNpbWFscwIEdmFsXwRlcnJfAwMJAGYCAAAFBHZhbF8GCQBmAgUEdmFsXwAICQACAQUEZXJyXwYBEF92YWxpZGF0ZVBheW1lbnQECHBheW1lbnRfCGFzc2V0SWRfD3JlcXVpcmVkQW1vdW50XwRlcnJfBAckbWF0Y2gwCAUIcGF5bWVudF8HYXNzZXRJZAMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAFhBQckbWF0Y2gwAwkBAiE9AgUIYXNzZXRJZF8JANgEAQUBYQkAAgEJAKwCAgUEZXJyXwIHOiBhc3NldAMJAGYCBQ9yZXF1aXJlZEFtb3VudF8IBQhwYXltZW50XwZhbW91bnQJAAIBCQCsAgIFBGVycl8CCDogYW1vdW50BgkAAgEJAKwCAgUEZXJyXwIHOiBhc3NldAEVX3ZhbGlkYXRlTGlzdENvbnRhaW5zAwVsaXN0XwR2YWxfBGVycl8DCQEBIQEJAQ9jb250YWluc0VsZW1lbnQCBQVsaXN0XwUEdmFsXwkAAgEFBGVycl8GAQtfYXNzZXRUb1N0cgEGYXNzZXRfBAckbWF0Y2gwBQZhc3NldF8DCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQBYQUHJG1hdGNoMAkA2AQBBQFhBQVXQVZFUwELX3N0clRvQXNzZXQBBmFzc2V0XwMDCQAAAgUGYXNzZXRfBQVXQVZFUwYJAAACBQZhc3NldF8CAAUEdW5pdAkA2QQBBQZhc3NldF8BCl9sb2FkUGF1c2UABAckbWF0Y2gwCQCgCAEFCktFWV9QQVVTRUQDCQABAgUHJG1hdGNoMAIHQm9vbGVhbgQBYQUHJG1hdGNoMAUBYQcBCl9zYXZlUGF1c2UBCWlzUGF1c2VkXwkAzAgCCQEMQm9vbGVhbkVudHJ5AgUKS0VZX1BBVVNFRAUJaXNQYXVzZWRfBQNuaWwBC19sb2FkUGF1c2VyAAQHJG1hdGNoMAkAoggBBQpLRVlfUEFVU0VSAwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAkBEUBleHRyTmF0aXZlKDEwNjIpAQUBYQkBB0FkZHJlc3MBAQABC19zYXZlUGF1c2VyAQdwYXVzZXJfCQDMCAIJAQtTdHJpbmdFbnRyeQIFCktFWV9QQVVTRVIJAKUIAQUHcGF1c2VyXwUDbmlsAQ1fbG9hZE11bHRpc2lnAAQHJG1hdGNoMAkAoggBBQxLRVlfTVVMVElTSUcDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwCQERQGV4dHJOYXRpdmUoMTA2MikBBQFhCQEHQWRkcmVzcwEBAAENX3NhdmVNdWx0aXNpZwEJbXVsdGlzaWdfCQDMCAIJAQtTdHJpbmdFbnRyeQIFDEtFWV9NVUxUSVNJRwkApQgBBQltdWx0aXNpZ18FA25pbAEMX2xvYWRTdG9yYWdlAAQHJG1hdGNoMAkAoggBBQtLRVlfU1RPUkFHRQMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDAEBnN0cnVjdAkAtQkCBQFhBQNTRVAJAJwKCgkA2QQBCQCRAwIFBnN0cnVjdAAACQAAAgkAkQMCBQZzdHJ1Y3QAAQIBMQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBnN0cnVjdAACCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUGc3RydWN0AAMJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQZzdHJ1Y3QABAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBnN0cnVjdAAFCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUGc3RydWN0AAYJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQZzdHJ1Y3QABwkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBnN0cnVjdAAICQERQGV4dHJOYXRpdmUoMTA2MikBCQCRAwIFBnN0cnVjdAAJCQCcCgoBAAcAAAAAAAAAAAAAAAAAAAkBB0FkZHJlc3MBAQABDF9zYXZlU3RvcmFnZQEIc3RvcmFnZV8JAMwIAgkBC1N0cmluZ0VudHJ5AgULS0VZX1NUT1JBR0UJALkJAgkAzAgCCQDYBAEIBQhzdG9yYWdlXwJfMQkAzAgCAwgFCHN0b3JhZ2VfAl8yAgExAgEwCQDMCAIJAKQDAQgFCHN0b3JhZ2VfAl8zCQDMCAIJAKQDAQgFCHN0b3JhZ2VfAl80CQDMCAIJAKQDAQgFCHN0b3JhZ2VfAl81CQDMCAIJAKQDAQgFCHN0b3JhZ2VfAl82CQDMCAIJAKQDAQgFCHN0b3JhZ2VfAl83CQDMCAIJAKQDAQgFCHN0b3JhZ2VfAl84CQDMCAIJAKQDAQgFCHN0b3JhZ2VfAl85CQDMCAIJAKUIAQgFCHN0b3JhZ2VfA18xMAUDbmlsBQNTRVAFA25pbAELX2xvYWRBc3NldHMABAckbWF0Y2gwCQCiCAEFCktFWV9BU1NFVFMDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwAwkAZgIJALECAQUBYQAACQC9CQIFAWEFA1NFUAUDbmlsBQNuaWwBC19zYXZlQXNzZXRzAQdhc3NldHNfCQDMCAIJAQtTdHJpbmdFbnRyeQIFCktFWV9BU1NFVFMJALsJAgUHYXNzZXRzXwUDU0VQBQNuaWwBEl9sb2FkQXNzZXRCYWxhbmNlcwAKAQhmb2xkRnVuYwIDYWNjBGVsZW0EB2JhbGFuY2UJAQ1wYXJzZUludFZhbHVlAQUEZWxlbQkAlAoCCQDNCAIIBQNhY2MCXzEFB2JhbGFuY2UJAGQCCAUD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BGVsZW0JAMwIAgkBC1N0cmluZ0VudHJ5AgkAuQkCCQDMCAIFEEtFWV9VU0VSX1BST0ZJVFMJAMwIAgkApQgBBQV1c2VyXwUDbmlsBQNTRVAJALsJAgoAAiRsBQR2YWxfCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQhmb2xkRnVuYwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTEJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALBQNTRVAFA25pbAENX2xvYWRXYXRjaGRvZwAEByRtYXRjaDAJAKIIAQUMS0VZX1dBVENIRE9HAwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAkBEUBleHRyTmF0aXZlKDEwNjIpAQUBYQkBB0FkZHJlc3MBAQABDV9zYXZlV2F0Y2hkb2cBCXdhdGNoZG9nXwkAzAgCCQELU3RyaW5nRW50cnkCBQxLRVlfV0FUQ0hET0cJAKUIAQUJd2F0Y2hkb2dfBQNuaWwBE19sb2FkV2F0Y2hkb2dPZmZzZXQABAckbWF0Y2gwCQCfCAEFE0tFWV9XQVRDSERPR19PRkZTRVQDCQABAgUHJG1hdGNoMAIDSW50BAFhBQckbWF0Y2gwBQFhAAABE19zYXZlV2F0Y2hkb2dPZmZzZXQBB29mZnNldF8JAMwIAgkBDEludGVnZXJFbnRyeQIFE0tFWV9XQVRDSERPR19PRkZTRVQFB29mZnNldF8FA25pbAERX29ubHlUaGlzQ29udHJhY3QBB2NhbGxlcl8DCQECIT0CBQdjYWxsZXJfBQR0aGlzCQACAQIZX29ubHlUaGlzQ29udHJhY3Q6IHJldmVydAYBEF93aGVuTXVsdGlzaWdTZXQAAwkAAAIJAQ1fbG9hZE11bHRpc2lnAAkBB0FkZHJlc3MBAQAJAAIBAhhfd2hlbk11bHRpc2lnU2V0OiByZXZlcnQGARNfd2hlbk5vdEluaXRpYWxpemVkAAQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQADCQECIT0CCAUHc3RvcmFnZQJfMQEACQACAQIbX3doZW5Ob3RJbml0aWFsaXplZDogcmV2ZXJ0BgEQX3doZW5Jbml0aWFsaXplZAAEB3N0b3JhZ2UJAQxfbG9hZFN0b3JhZ2UAAwkAAAIIBQdzdG9yYWdlAl8xAQAJAAIBAhhfd2hlbkluaXRpYWxpemVkOiByZXZlcnQGAQ5fd2hlbk5vdFBhdXNlZAADCQEKX2xvYWRQYXVzZQAJAAIBAhZfd2hlbk5vdFBhdXNlZDogcmV2ZXJ0BgELX3doZW5QYXVzZWQAAwkBASEBCQEKX2xvYWRQYXVzZQAJAAIBAhNfd2hlblBhdXNlZDogcmV2ZXJ0BgELX29ubHlQYXVzZXIBB2NhbGxlcl8DCQECIT0CBQdjYWxsZXJfCQELX2xvYWRQYXVzZXIACQACAQITX29ubHlQYXVzZXI6IHJldmVydAYBDl9jaGVja1dhdGNoZG9nAAQCd2QEByRtYXRjaDAJAJoIAgkBDV9sb2FkV2F0Y2hkb2cABRNLRVlfV0FUQ0hET0dfSEVJR0hUAwkAAQIFByRtYXRjaDACA0ludAQBYQUHJG1hdGNoMAkAZAIFAWEJARNfbG9hZFdhdGNoZG9nT2Zmc2V0AAAAAwkAZgIFBmhlaWdodAUCd2QJAAIBAhZfY2hlY2tXYXRjaGRvZzogcmV2ZXJ0BgEMX2dldERlY2ltYWxzAQhhc3NldElkXwQHJG1hdGNoMAkA7AcBCQDZBAEFCGFzc2V0SWRfAwkAAQIFByRtYXRjaDACBUFzc2V0BAFhBQckbWF0Y2gwCAUBYQhkZWNpbWFscwkAAgEJAKwCAgIXX2dldERlY2ltYWxzOiBubyBhc3NldD0FCGFzc2V0SWRfARJfbm9ybWFsaXplRGVjaW1hbHMEB2Ftb3VudF8Pc291cmNlRGVjaW1hbHNfD3RhcmdldERlY2ltYWxzXwZyb3VuZF8DCQBnAgUPc291cmNlRGVjaW1hbHNfBQ90YXJnZXREZWNpbWFsc18JAG4EBQdhbW91bnRfAAEJAGwGAAoAAAkAZQIFD3NvdXJjZURl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AwIFCGFtb3VudHNfBQVpbmRleAQKbmV3QmFsYW5jZQkAZAIFBGVsZW0FBmFtb3VudAkAlQoDCQBkAgUFaW5kZXgAAQkAzQgCCAUDYWNjAl8yBQpuZXdCYWxhbmNlCQBkAggFA2FjYwJfMwUKbmV3QmFsYW5jZQQGcmVzdWx0CgACJGwFCWJhbGFuY2VzXwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJUKAwAABQNuaWwAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEIZm9sZEZ1bmMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoJAJQKAggFBnJlc3VsdAJfMggFBnJlc3VsdAJfMwEcX2luY3JlbWVudEJhbGFuY2VzQnlQYXltZW50cwUJYmFsYW5jZXNfCXBheW1lbnRzXwdhc3NldHNfCWRlY2ltYWxzXwRlcnJfCgEIZm9sZEZ1bmMCA2FjYwRlbGVtBAVpbmRleAgFA2FjYwJfMQQHcGF5bWVudAkAkQMCBQlwYXltZW50c18FBWluZGV4BA9wYXltZW50QXNzZXRTdHIJAQtfYXNzZXRUb1N0cgEIBQdwYXltZW50B2Fzc2V0SWQEA2VycgMJAQIhPQIFD3BheW1lbnRBc3NldFN0cgkAkQMCBQdhc3NldHNfBQVpbmRleAkAAgEJAKwCAgkArAICBQRlcnJfAgg6IGluZGV4PQkApAMBBQVpbmRleAUEdW5pdAMJAAACBQNlcnIFA2VycgQNYXNzZXREZWNpbWFscwkBDF9nZXREZWNpbWFscwEFD3BheW1lbnRBc3NldFN0cgQKbmV3QmFsYW5jZQkAZAIFBGVsZW0JARJfbm9ybWFsaXplRGVjaW1hbHMECAkAkQMCBQlwYXltZW50c18FBWluZGV4BmFtb3VudAUNYXNzZXREZWNpbWFscwUJ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AgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoIBQZyZXN1bHQCXzIBEl9jYWxjdWxhdGVNaW51c0ZlZQUIYmFsYW5jZV8MZXF1aWxpYnJpdW1fCWxwQW1vdW50XxB3ZWlnaHRBbXBsaWZpZXJfEGRpc2JhbGFuY2VDb2VmZl8ECXRocmVzaG9sZAkAawMFDGVxdWlsaWJyaXVtXwkAZQIFFE1BWF9XRUlHSFRfQU1QTElGSUVSBRB3ZWlnaHRBbXBsaWZpZXJfBRRNQVhfV0VJR0hUX0FNUExJRklFUgMJAGYCBQhiYWxhbmNlXwUJdGhyZXNob2xkAAAJAKADAQkAvQIECQC8AgMJALYCAQUJbHBBbW91bnRfCQC2AgEFEGRpc2JhbGFuY2VDb2VmZl8FF0RJU0JBbEFOQ0VfQ09FRkZfRkFDVE9SCQC2AgEJAGUCBQl0aHJlc2hvbGQFCGJhbGFuY2VfCQC2AgEFCXRocmVzaG9sZAUHQ0VJTElORwEXX2NhbGN1bGF0ZU1pbnVzRmVlRGVsdGEGDmJhbGFuY2VCZWZvcmVfDWJhbGFuY2VBZnRlcl8MZXF1aWxpYnJpdW1fCWxwQW1vdW50XxB3ZWlnaHRBbXBsaWZpZXJfEGRpc2JhbGFuY2VDb2VmZl8DCQBmAgUNYmFsYW5jZUFmdGVyXwUOYmFsYW5jZUJlZm9yZV8AAAkAZQIJARJfY2FsY3VsYXRlTWludXNGZWUFBQ1iYWxhbmNlQWZ0ZXJfBQxlcXVpbGlicml1bV8FCWxwQW1vdW50XwUQd2VpZ2h0QW1wbGlmaWVyXwUQZGlzYmFsYW5jZUNvZWZmXwkBEl9jYWxjdWxhdGVNaW51c0ZlZQUFDmJhbGFuY2VCZWZvcmVfBQxlcXVpbGlicml1bV8FCWxwQW1vdW50XwUQd2VpZ2h0QW1wbGlmaWVyXwUQZGlzYmFsYW5jZUNvZWZmXwERX2NhbGN1bGF0ZVBsdXNGZWUECGJhbGFuY2VfDGVxdWlsaWJyaXVtXw5yZXdhcmRCYWxhbmNlXxB3ZWlnaHRBbXBsaWZpZXJfBAl0aHJlc2hvbGQJAGsDBQxlcXVpbGlicml1bV8JAGUCBRRNQVhfV0VJR0hUX0FNUExJRklFUgUQd2VpZ2h0QW1wbGlmaWVyXwUUTUFYX1dFSUdIVF9BTVBMSUZJRVIEEGRpc2JhbGFuY2VSZXdhcmQJAGsDBQ5yZXdhcmRCYWxhbmNlXwUJdGhyZXNob2xkBQxlcXVpbGlicml1bV8DCQBmAgUIYmFsYW5jZV8FCXRocmVzaG9sZAUQZGlzYmFsYW5jZVJld2FyZAkAbgQFEGRpc2JhbGFuY2VSZXdhcmQFCGJhbGFuY2VfBQl0aHJlc2hvbGQFBUZMT09SARZfY2FsY3VsYXRlUGx1c0ZlZURlbHRhBQ5iYWxhbmNlQmVmb3JlXw1iYWxhbmNlQWZ0ZXJfDGVxdWlsaWJyaXVtXw5yZXdhcmRCYWxhbmNlXxB3ZWlnaHRBbXBsaWZpZXJfAwkAZgIFDmJhbGFuY2VCZWZvcmVfBQ1iYWxhbmNlQWZ0ZXJfAAAJAGUCCQERX2NhbGN1bGF0ZVBsdXNGZWUEBQ1iYWxhbmNlQWZ0ZXJfBQxlcXVpbGlicml1bV8FDnJld2FyZEJhbGFuY2VfBRB3ZWlnaHRBbXBsaWZpZXJfCQERX2NhbGN1bGF0ZVBsdXNGZWUEBQ5iYWxhbmNlQmVmb3JlXwUMZXF1aWxpYnJpdW1fBQ5yZXdhcmRCYWxhbmNlXwUQd2VpZ2h0QW1wbGlmaWVyXwEQX2ZlZUNvbXBlbnNhdGlvbgIOcmV3YXJkQmFsYW5jZV8EZmVlXwMJAGYCBQRmZWVfBQ5yZXdhcmRCYWxhbmNlXwUOcmV3YXJkQmFsYW5jZV8FBGZlZV8BE192YWxpZGF0ZUFsbG9jYXRpb24CDmFzc2V0QmFsYW5jZXNfD3Jld2FyZEJhbGFuY2VzXwQIbWF4SW5kZXgJAJADAQUOYXNzZXRCYWxhbmNlc18KAQhmb2xkRnVuYwIDYWNjBWluZGV4AwkAZwIFBWluZGV4BQhtYXhJbmRleAUDYWNjAwkAZgIAAAkAkQMCBQ5hc3NldEJhbGFuY2VzXwUFaW5kZXgJAAIBAitfdmFsaWRhdGVBbGxvY2F0aW9uOiBuZWdhdGl2ZSBhc3NldEJhbGFuY2VzAwkAZgIAAAkAkQMCBQ9yZXdhcmRCYWxhbmNlc18FBWluZGV4CQACAQIsX3ZhbGlkYXRlQWxsb2NhdGlvbjogbmVnYXRpdmUgcmV3YXJkQmFsYW5jZXMFA2FjYwoAAiRsBQpJTkRFWF9MSVNUCgACJHMJAJADAQUCJGwKAAUkYWNjMAYKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCGZvbGRGdW5jAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAQtfY2hlY2twb2ludAEFdXNlcl8EBnVzZXJMcAkBC19sb2FkVXNlckxwAQUFdXNlcl8EC3VzZXJQcm9maXRzCQEQX2xvYWRVc2VyUHJvZml0cwEFBXVzZXJfBA1zaWdtYUZlZVBlckxwCQESX2xvYWRTaWdtYUZlZVBlckxwAAQRdXNlclNpZ21hRmVlUGVyTHAJARZfbG9hZFVzZXJTaWdtYUZlZVBlckxwAQUFdXNlcl8KAQhmb2xkRnVuYwIDYWNjBGVsZW0EBWluZGV4CAUDYWNjAl8xBA1wcm9maXRVcGRhdGVkCQBkAgkAkQMCBQt1c2VyUHJvZml0cwUFaW5kZXgJAKADAQkAvAIDCQC2AgEFBnVzZXJMcAkAuAICCQCRAwIFDXNpZ21hRmVlUGVyTHAFBWluZGV4CQCRAwIFEXVzZXJTaWdtYUZlZVBlckxwBQVpbmRleAUOUEVSQ0VOVF9GQUNUT1IJAJQKAgkAZAIFBWluZGV4AAEJAM0IAggFA2FjYwJfMgUNcHJvZml0VXBkYXRlZAQNJHQwMjI3MDAyMjc3MwoAAiRsBRBaRVJPX0lOVF9MSVNUXzExCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCAAAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEIZm9sZEZ1bmMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDExCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwQDaWR4CAUNJHQwMjI3MDAyMjc3MwJfMQQOcHJvZml0c1VwZGF0ZWQIBQ0kdDAyMjcwMDIyNzczAl8yCQCUCgIJAM4IAgkBEF9zYXZlVXNlclByb2ZpdHMCBQV1c2VyXwUOcHJvZml0c1VwZGF0ZWQJARZfc2F2ZVVzZXJTaWdtYUZlZVBlckxwAgUFdXNlcl8FDXNpZ21hRmVlUGVyTHAFDnByb2ZpdHNVcGRhdGVkARRfdXBkYXRlU2lnbWFGZWVQZXJMcAQOc2lnbWFGZWVQZXJMcF8IdG90YWxMcF8GaW5kZXhfBmxwRmVlXwoBCGZvbGRGdW5jAgNhY2MEZWxlbQQFaW5kZXgIBQNhY2MCXzEEFHNpZ21hRmVlUGVyTHBVcGRhdGVkAwkAAAIFBmluZGV4XwUFaW5kZXgJALcCAgkAkQMCBQ5zaWdtYUZlZVBlckxwXwUFaW5kZXgJALwCAwkAtgIBBQZscEZlZV8FDlBFUkNFTlRfRkFDVE9SCQC2AgEFCHRvdGFsTHBfCQCRAwIFDnNpZ21hRmVlUGVyTHBfBQVpbmRleAkAlAoCCQBkAgUFaW5kZXgAAQkAzQgCCAUDYWNjAl8yBRRzaWdtYUZlZVBlckxwVXBkYXRlZAQNJHQwMjM0MjMyMzUwMgoAAiRsBRBaRVJPX0lOVF9MSVNUXzExCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCAAAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEIZm9sZEZ1bmMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDExCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwQDaWR4CAUNJHQwMjM0MjMyMzUwMgJfMQQUc2lnbWFGZWVQZXJMcFVwZGF0ZWQIBQ0kdDAyMzQyMzIzNTAyAl8yBRRzaWdtYUZlZVBlckxwVXBkYXRlZAEbX2NhbGN1bGF0ZUxwQW5kUHJvdG9jb2xGZWVzBAthc3NldEluZGV4XwdhbW91bnRfCmxwRmVlUmF0ZV8QcHJvdG9jb2xGZWVSYXRlXwQNc2lnbWFGZWVQZXJMcAkBEl9sb2FkU2lnbWFGZWVQZXJMcAAEB3RvdGFsTHAJAQxfbG9hZFRvdGFsTHAABA0kdDAyMzcyMzIzOTk4AwkAAAIFB3RvdGFsTHAAAAkAlAoCAAAJAGsDBQdhbW91bnRfBRBwcm90b2NvbEZlZVJhdGVfBQdNQVhfRkVFCQCUCgIJAGsDBQdhbW91bnRfBQpscEZlZVJhdGVfBQdNQVhfRkVFCQBrAwUHYW1vdW50XwUQcHJvdG9jb2xGZWVSYXRlXwUHTUFYX0ZFRQQFbHBGZWUIBQ0kdDAyMzcyMzIzOTk4Al8xBAtwcm90b2NvbEZlZQgFDSR0MDIzNzIzMjM5OTgCXzIEFHNpZ21hRmVlUGVyTHBVcGRhdGVkAwkAAAIFBWxwRmVlAAAFDXNpZ21hRmVlUGVyTHAJARRfdXBkYXRlU2lnbWFGZWVQZXJMcAQFDXNpZ21hRmVlUGVyTHAFB3RvdGFsTHAFC2Fzc2V0SW5kZXhfBQVscEZlZQkAlQoDBQVscEZlZQULcHJvdG9jb2xGZWUFFHNpZ21hRmVlUGVyTHBVcGRhdGVkAQtfZGVwb3NpdEFsbAEHYW1vdW50XwQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQAEDWxwVG90YWxTdXBwbHkIBQdzdG9yYWdlAl8zBAZhc3NldHMJAQtfbG9hZEFzc2V0cwAEDSR0MDI0NDA0MjQ0NTcJARFfbG9hZEFzc2V0V2VpZ2h0cwAEDGFzc2V0V2VpZ2h0cwgFDSR0MDI0NDA0MjQ0NTcCXzEEC3NpZ21hV2VpZ2h0CAUNJHQwMjQ0MDQyNDQ1NwJfMgQNJHQwMjQ0NjIyNDUzMAkBEl9sb2FkQXNzZXRCYWxhbmNlcwAEEXByZXZBc3NldEJhbGFuY2VzCAUNJHQwMjQ0NjIyNDUzMAJfMQQUcHJldkFzc2V0VG90YWxTdXBwbHkIBQ0kdDAyNDQ2MjI0NTMwAl8yBA0kdDAyNDUzNjI1NzY2AwkAAAIFFHByZXZBc3NldFRvdGFsU3VwcGx5AAAKAQhmb2xkRnVuYwIDYWNjBGVsZW0EBWluZGV4CAUDYWNjAl8xBBhyZXF1aXJlZEFtb3VudE5vcm1hbGl6ZWQJAGsDCQCRAwIFDGFzc2V0V2VpZ2h0cwUFaW5kZXgFB2Ftb3VudF8FC3NpZ21hV2VpZ2h0CQCUCgIJAGQCBQVpbmRleAABCQDNCAIIBQNhY2MCXzIFGHJlcXVpcmVkQW1vdW50Tm9ybWFsaXplZAQNJHQwMjQ5NzgyNTA1MgoAAiRsBQZhc3NldHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIAAAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQhmb2xkRnVuYwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgQDaWR4CAUNJHQwMjQ5NzgyNTA1MgJfMQQZcmVxdWlyZWRBbW91bnRzTm9ybWFsaXplZAgFDSR0MDI0OTc4MjUwNTICXzIJAJQKAgUHYW1vdW50XwUZcmVxdWlyZWRBbW91bnRzTm9ybWFsaXplZAQFcmF0aW8JALwCAwkAtgIBBQdhbW91bnRfBQ5QRVJDRU5UX0ZBQ1RPUgkAtgIBBRRwcmV2QXNzZXRUb3RhbFN1cHBseQoBCWZvbGRGdW5jMQIDYWNjBGVsZW0EBWluZGV4CAUDYWNjAl8xBBhyZXF1aXJlZEFtb3VudE5vcm1hbGl6ZWQJAKADAQkAvAIDBQVyYXRpbwkAtgIBCQCRAwIFEXByZXZBc3NldEJhbGFuY2VzBQVpbmRleAUOUEVSQ0VOVF9GQUNUT1IJAJQKAgkAZAIFBWluZGV4AAEJAM0IAggFA2FjYwJfMgUYcmVxdWlyZWRBbW91bnROb3JtYWxpemVkBA0kdDAyNTU5NTI1NjcwCgACJGwFBmFzc2V0cwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgAABQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCWZvbGRGdW5jMQIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgQDaWR4CAUNJHQwMjU1OTUyNTY3MAJfMQQZcmVxdWlyZWRBbW91bnRzTm9ybWFsaXplZAgFDSR0MDI1NTk1MjU2NzACXzIJAJQKAgkAawMFB2Ftb3VudF8FDWxwVG90YWxTdXBwbHkFFHByZXZBc3NldFRvdGFsU3VwcGx5BRlyZXF1aXJlZEFtb3VudHNOb3JtYWxpemVkBA5scFRva2Vuc1RvTWludAgFDSR0MDI0NTM2MjU3NjYCXzEEGXJlcXVpcmVkQW1vdW50c05vcm1hbGl6ZWQIBQ0kdDAyNDUzNjI1NzY2Al8yBA0kdDAyNTc3MjI1ODg1CQEbX2luY3JlbWVudEJhbGFuY2VzQnlBbW91bnRzAgURcHJldkFzc2V0QmFsYW5jZXMFGXJlcXVpcmVkQW1vdW50c05vcm1hbGl6ZWQEDWFzc2V0QmFsYW5jZXMIBQ0kdDAyNTc3MjI1ODg1Al8xBBBhc3NldFRvdGFsU3VwcGx5CAUNJHQwMjU3NzIyNTg4NQJfMgkAlQoDBQ5scFRva2Vuc1RvTWludAUZcmVxdWlyZWRBbW91bnRzTm9ybWFsaXplZAUNYXNzZXRCYWxhbmNlcwEIX2RlcG9zaXQCCGFzc2V0SWRfB2Ftb3VudF8EB3N0b3JhZ2UJAQxfbG9hZFN0b3JhZ2UABA1scFRvdGFsU3VwcGx5CAUHc3RvcmFnZQJfMwQJbHBGZWVSYXRlCAUHc3RvcmFnZQJfNAQPcHJvdG9jb2xGZWVSYXRlCAUHc3RvcmFnZQJfNQQRbWF4QWxsb2NBbXBsaWZpZXIIBQdzdG9yYWdlAl82BA93ZWlnaHRBbXBsaWZpZXIIBQdzdG9yYWdlAl83BAZhc3NldHMJAQtfbG9hZEFzc2V0cwAEDSR0MDI2MjUxMjYzMDQJARFfbG9hZEFzc2V0V2VpZ2h0cwAEDGFzc2V0V2VpZ2h0cwgFDSR0MDI2MjUxMjYzMDQCXzEEC3NpZ21hV2VpZ2h0CAUNJHQwMjYyNTEyNjMwNAJfMgQNJHQwMjYzMDkyNjM3NwkBEl9sb2FkQXNzZXRCYWxhbmNlcwAEEXByZXZBc3NldEJhbGFuY2VzCAUNJHQwMjYzMDkyNjM3NwJfMQQUcHJldkFzc2V0VG90YWxTdXBwbHkIBQ0kdDAyNjMwOTI2Mzc3Al8yBBJwcmV2UmV3YXJkQmFsYW5jZXMJARNfbG9hZFJld2FyZEJhbGFuY2VzAAQDZXJyAwMJAAACBRRwcmV2QXNzZXRUb3RhbFN1cHBseQAABgkAAAIFDWxwVG90YWxTdXBwbHkAAAkAAgECFF9kZXBvc2l0OiBlbXB0eSBwb29sBgMJAAACBQNlcnIFA2VycgQQc291cmNlQXNzZXRJbmRleAkBBXZhbHVlAQkAzwgCBQZhc3NldHMFCGFzc2V0SWRfBBFzb3VyY2VFcXVpbGlicml1bQkAawMFFHByZXZBc3NldFRvdGFsU3VwcGx5CQCRAwIFDGFzc2V0V2VpZ2h0cwUQc291cmNlQXNzZXRJbmRleAULc2lnbWFXZWlnaHQEE3NvdXJjZUJhbGFuY2VCZWZvcmUJAJEDAgURcHJldkFzc2V0QmFsYW5jZXMFEHNvdXJjZUFzc2V0SW5kZXgEE3NvdXJjZVJld2FyZEJhbGFuY2UJAJEDAgUScHJldlJld2FyZEJhbGFuY2VzBRBzb3VyY2VBc3NldEluZGV4BBJzb3VyY2VQbHVzRmVlRGVsdGEJARZfY2FsY3VsYXRlUGx1c0ZlZURlbHRhBQUTc291cmNlQmFsYW5jZUJlZm9yZQkAZAIFE3NvdXJjZUJhbGFuY2VCZWZvcmUFB2Ftb3VudF8FEXNvdXJjZUVxdWlsaWJyaXVtBRNzb3VyY2VSZXdhcmRCYWxhbmNlBQ93ZWlnaHRBbXBsaWZpZXIEDmxwVG9rZW5zVG9NaW50CQBkAgUHYW1vdW50XwUSc291cmNlUGx1c0ZlZURlbHRhBA0kdDAyNzE3NzI3MzA4CQEbX2NhbGN1bGF0ZUxwQW5kUHJvdG9jb2xGZWVzBAAABQ5scFRva2Vuc1RvTWludAkAaQIFCWxwRmVlUmF0ZQACCQBpAgUPcHJvdG9jb2xGZWVSYXRlAAIEBWxwRmVlCAUNJHQwMjcxNzcyNzMwOAJfMQQLcHJvdG9jb2xGZWUIBQ0kdDAyNzE3NzI3MzA4Al8yBBRzaWdtYUZlZVBlckxwVXBkYXRlZAgFDSR0MDI3MTc3MjczMDgCXzMED2ZlZUNvbXBlbnNhdGlvbgkBEF9mZWVDb21wZW5zYXRpb24CCQBlAgUTc291cmNlUmV3YXJkQmFsYW5jZQUSc291cmNlUGx1c0ZlZURlbHRhCQBkAgUFbHBGZWUFC3Byb3RvY29sRmVlBBFuZXdSZXdhcmRCYWxhbmNlcwkBGF9kZWNyZW1lbnRCYWxhbmNlQnlJbmRleAMFEnByZXZSZXdhcmRCYWxhbmNlcwUQc291cmNlQXNzZXRJbmRleAkAZAIFEnNvdXJjZVBsdXNGZWVEZWx0YQUPZmVlQ29tcGVuc2F0aW9uBBBuZXdBc3NldEJhbGFuY2VzCQEYX2luY3JlbWVudEJhbGFuY2VCeUluZGV4AwURcHJldkFzc2V0QmFsYW5jZXMFEHNvdXJjZUFzc2V0SW5kZXgJAGQCBQ5scFRva2Vuc1RvTWludAUPZmVlQ29tcGVuc2F0aW9uBARlcnIxCQETX3ZhbGlkYXRlQWxsb2NhdGlvbgIFEG5ld0Fzc2V0QmFsYW5jZXMFEW5ld1Jld2FyZEJhbGFuY2VzAwkAAAIFBGVycjEFBGVycjEJAJgKBgkAZAIFDmxwVG9rZW5zVG9NaW50BQ9mZWVDb21wZW5zYXRpb24FEG5ld0Fzc2V0QmFsYW5jZXMFEW5ld1Jld2FyZEJhbGFuY2VzBQVscEZlZQULcHJvdG9jb2xGZWUFFHNpZ21hRmVlUGVyTHBVcGRhdGVkCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQxfd2l0aGRyYXdBbGwBB2Ftb3VudF8EB3N0b3JhZ2UJAQxfbG9hZFN0b3JhZ2UABA1scFRvdGFsU3VwcGx5CAUHc3RvcmFnZQJfMwQNJHQwMjc5NzYyODA0NAkBEl9sb2FkQXNzZXRCYWxhbmNlcwAEEXByZXZBc3NldEJhbGFuY2VzCAUNJHQwMjc5NzYyODA0NAJfMQQUcHJldkFzc2V0VG90YWxTdXBwbHkIBQ0kdDAyNzk3NjI4MDQ0Al8yBA0kdDAyODA0OTI4MTAyCQERX2xvYWRBc3NldFdlaWdodHMABAxhc3NldFdlaWdodHMIBQ0kdDAyODA0OTI4MTAyAl8xBAtzaWdtYVdlaWdodAgFDSR0MDI4MDQ5MjgxMDICXzIEDmxwVG9rZW5zVG9CdXJuBQdhbW91bnRfBANlcnIJAQxfdmFsaWRhdGVJbnQEBQ5scFRva2Vuc1RvQnVybgAABQ1scFRvdGFsU3VwcGx5AiRfd2l0aGRyYXdBbGw6IGludmFsaWQgbHBUb2tlbnNUb0J1cm4DCQAAAgUDZXJyBQNlcnIEDSR0MDI4MjQ2MjgzNzkJARxfZGVjcmVtZW50QmFsYW5jZXNCeUxwQW1vdW50AwURcHJldkFzc2V0QmFsYW5jZXMFDmxwVG9rZW5zVG9CdXJuBQ1scFRvdGFsU3VwcGx5BA1hc3NldEJhbGFuY2VzCAUNJHQwMjgyNDYyODM3OQJfMQQQYXNzZXRUb3RhbFN1cHBseQgFDSR0MDI4MjQ2MjgzNzkCXzIEDWJhbGFuY2VzVG9QYXkIBQ0kdDAyODI0NjI4Mzc5Al8zCQCVCgMFDmxwVG9rZW5zVG9CdXJuBQ1iYWxhbmNlc1RvUGF5BQ1hc3NldEJhbGFuY2VzCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQlfd2l0aGRyYXcCCGFzc2V0SWRfCWxwQW1vdW50XwQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQAEDWxwVG90YWxTdXBwbHkIBQdzdG9yYWdlAl8zBAlscEZlZVJhdGUIBQdzdG9yYWdlAl80BA9wcm90b2NvbEZlZVJhdGUIBQdzdG9yYWdlAl81BBFtYXhBbGxvY0FtcGxpZmllcggFB3N0b3JhZ2UCXzYED3dlaWdodEFtcGxpZmllcggFB3N0b3JhZ2UCXzcED2Rpc2JhbGFuY2VDb2VmZggFB3N0b3JhZ2UCXzgEBmFzc2V0cwkBC19sb2FkQXNzZXRzAAQNJHQwMjg3NzMyODg0MQkBEl9sb2FkQXNzZXRCYWxhbmNlcwAEEXByZXZBc3NldEJhbGFuY2VzCAUNJHQwMjg3NzMyODg0MQJfMQQUcHJldkFzc2V0VG90YWxTdXBwbHkIBQ0kdDAyODc3MzI4ODQxAl8yBA0kdDAyODg0NjI4ODk5CQERX2xvYWRBc3NldFdlaWdodHMABAxhc3NldFdlaWdodHMIBQ0kdDAyODg0NjI4ODk5Al8xBAtzaWdtYVdlaWdodAgFDSR0MDI4ODQ2Mjg4OTkCXzIEEnByZXZSZXdhcmRCYWxhbmNlcwkBE19sb2FkUmV3YXJkQmFsYW5jZXMABBB0YXJnZXRBc3NldEluZGV4CQEFdmFsdWUBCQDPCAIFBmFzc2V0cwUIYXNzZXRJZF8EE3RhcmdldEJhbGFuY2VCZWZvcmUJAJEDAgURcHJldkFzc2V0QmFsYW5jZXMFEHRhcmdldEFzc2V0SW5kZXgEEXRhcmdldEVxdWlsaWJyaXVtCQBrAwUUcHJldkFzc2V0VG90YWxTdXBwbHkJAJEDAgUMYXNzZXRXZWlnaHRzBRB0YXJnZXRBc3NldEluZGV4BQtzaWdtYVdlaWdodAQTdGFyZ2V0UmV3YXJkQmFsYW5jZQkAkQMCBRJwcmV2UmV3YXJkQmFsYW5jZXMFEHRhcmdldEFzc2V0SW5kZXgEE3RhcmdldE1pbnVzRmVlRGVsdGEJARdfY2FsY3VsYXRlTWludXNGZWVEZWx0YQYFE3RhcmdldEJhbGFuY2VCZWZvcmUJAGUCBRN0YXJnZXRCYWxhbmNlQmVmb3JlBQlscEFtb3VudF8FEXRhcmdldEVxdWlsaWJyaXVtBRRwcmV2QXNzZXRUb3RhbFN1cHBseQUPd2VpZ2h0QW1wbGlmaWVyBQ9kaXNiYWxhbmNlQ29lZmYEDnJld2FyZEJhbGFuY2VzCQEYX2luY3JlbWVudEJhbGFuY2VCeUluZGV4AwUScHJldlJld2FyZEJhbGFuY2VzBRB0YXJnZXRBc3NldEluZGV4BRN0YXJnZXRNaW51c0ZlZURlbHRhBA1hc3NldEJhbGFuY2VzCQEYX2RlY3JlbWVudEJhbGFuY2VCeUluZGV4AwURcHJldkFzc2V0QmFsYW5jZXMFEHRhcmdldEFzc2V0SW5kZXgFCWxwQW1vdW50XwQMdGFyZ2V0QW1vdW50CQBlAgUJbHBBbW91bnRfBRN0YXJnZXRNaW51c0ZlZURlbHRhBANlcnIJARNfdmFsaWRhdGVBbGxvY2F0aW9uAgUNYXNzZXRCYWxhbmNlcwUOcmV3YXJkQmFsYW5jZXMDCQAAAgUDZXJyBQNlcnIEDSR0MDI5ODg1MzAwMzMJARtfY2FsY3VsYXRlTHBBbmRQcm90b2NvbEZlZXMECQBkAgUQdGFyZ2V0QXNzZXRJbmRleAABBQx0YXJnZXRBbW91bnQJAGkCBQlscEZlZVJhdGUAAgkAaQIFD3Byb3RvY29sRmVlUmF0ZQACBAVscEZlZQgFDSR0MDI5ODg1MzAwMzMCXzEEC3Byb3RvY29sRmVlCAUNJHQwMjk4ODUzMDAzMwJfMgQUc2lnbWFGZWVQZXJMcFVwZGF0ZWQIBQ0kdDAyOTg4NTMwMDMzAl8zCQCYCgYFDHRhcmdldEFtb3VudAUNYXNzZXRCYWxhbmNlcwUOcmV3YXJkQmFsYW5jZXMFBWxwRmVlBQtwcm90b2NvbEZlZQUUc2lnbWFGZWVQZXJMcFVwZGF0ZWQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BBV9zd2FwAxFzb3VyY2VBc3NldEluZGV4XxF0YXJnZXRBc3NldEluZGV4Xw1zb3VyY2VBbW91bnRfBAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAQJbHBBc3NldElkCAUHc3RvcmFnZQJfMQQKbHBEZWNpbWFscwkBDF9nZXREZWNpbWFscwEJANgEAQUJbHBBc3NldElkBA1scFRvdGFsU3VwcGx5CAUHc3RvcmFnZQJfMwQJbHBGZWVSYXRlCAUHc3RvcmFnZQJfNAQPcHJvdG9jb2xGZWVSYXRlCAUHc3RvcmFnZQJfNQQRbWF4QWxsb2NBbXBsaWZpZXIIBQdzdG9yYWdlAl82BA93ZWlnaHRBbXBsaWZpZXIIBQdzdG9yYWdlAl83BA9kaXNiYWxhbmNlQ29lZmYIBQdzdG9yYWdlAl84BA0kdDAzMDU2MDMwNjI4CQESX2xvYWRBc3NldEJhbGFuY2VzAAQRcHJldkFzc2V0QmFsYW5jZXMIBQ0kdDAzMDU2MDMwNjI4Al8xBBRwcmV2QXNzZXRUb3RhbFN1cHBseQgFDSR0MDMwNTYwMzA2MjgCXzIEDSR0MDMwNjMzMzA2ODYJARFfbG9hZEFzc2V0V2VpZ2h0cwAEDGFzc2V0V2VpZ2h0cwgFDSR0MDMwNjMzMzA2ODYCXzEEC3NpZ21hV2VpZ2h0CAUNJHQwMzA2MzMzMDY4NgJfMgQScHJldlJld2FyZEJhbGFuY2VzCQETX2xvYWRSZXdhcmRCYWxhbmNlcwAEEXNvdXJjZUVxdWlsaWJyaXVtCQBrAwUUcHJldkFzc2V0VG90YWxTdXBwbHkJAJEDAgUMYXNzZXRXZWlnaHRzBRFzb3VyY2VBc3NldEluZGV4XwULc2lnbWFXZWlnaHQEE3NvdXJjZUJhbGFuY2VCZWZvcmUJAJEDAgURcHJldkFzc2V0QmFsYW5jZXMFEXNvdXJjZUFzc2V0SW5kZXhfBBNzb3VyY2VSZXdhcmRCYWxhbmNlCQCRAwIFEnByZXZSZXdhcmRCYWxhbmNlcwURc291cmNlQXNzZXRJbmRleF8EEnNvdXJjZVBsdXNGZWVEZWx0YQkBFl9jYWxjdWxhdGVQbHVzRmVlRGVsdGEFBRNzb3VyY2VCYWxhbmNlQmVmb3JlCQBkAgUTc291cmNlQmFsYW5jZUJlZm9yZQUNc291cmNlQW1vdW50XwURc291cmNlRXF1aWxpYnJpdW0FE3NvdXJjZVJld2FyZEJhbGFuY2UFD3dlaWdodEFtcGxpZmllcgQTdGFyZ2V0QmFsYW5jZUJlZm9yZQkAkQMCBRFwcmV2QXNzZXRCYWxhbmNlcwURdGFyZ2V0QXNzZXRJbmRleF8EEXRhcmdldEVxdWlsaWJyaXVtCQBrAwUUcHJldkFzc2V0VG90YWxTdXBwbHkJAJEDAgUMYXNzZXRXZWlnaHRzBRF0YXJnZXRBc3NldEluZGV4XwULc2lnbWFXZWlnaHQEE3RhcmdldFJld2FyZEJhbGFuY2UJAJEDAgUScHJldlJld2FyZEJhbGFuY2VzBRF0YXJnZXRBc3NldEluZGV4XwQTdGFyZ2V0TWludXNGZWVEZWx0YQkBF19jYWxjdWxhdGVNaW51c0ZlZURlbHRhBgUTdGFyZ2V0QmFsYW5jZUJlZm9yZQkAZQIFE3RhcmdldEJhbGFuY2VCZWZvcmUFDXNvdXJjZUFtb3VudF8FEXRhcmdldEVxdWlsaWJyaXVtBRRwcmV2QXNzZXRUb3RhbFN1cHBseQUPd2VpZ2h0QW1wbGlmaWVyBQ9kaXNiYWxhbmNlQ29lZmYEEnRlbXBSZXdhcmRCYWxhbmNlcwkBGF9kZWNyZW1lbnRCYWxhbmNlQnlJbmRleAMFEnByZXZSZXdhcmRCYWxhbmNlcwURc291cmNlQXNzZXRJbmRleF8FEnNvdXJjZVBsdXNGZWVEZWx0YQQRbmV3UmV3YXJkQmFsYW5jZXMJARhfaW5jcmVtZW50QmFsYW5jZUJ5SW5kZXgDBRJ0ZW1wUmV3YXJkQmFsYW5jZXMFEXRhcmdldEFzc2V0SW5kZXhfBRN0YXJnZXRNaW51c0ZlZURlbHRhBBF0ZW1wQXNzZXRCYWxhbmNlcwkBGF9pbmNyZW1lbnRCYWxhbmNlQnlJbmRleAMFEXByZXZBc3NldEJhbGFuY2VzBRFzb3VyY2VBc3NldEluZGV4XwkAZAIFDXNvdXJjZUFtb3VudF8FEnNvdXJjZVBsdXNGZWVEZWx0YQQQbmV3QXNzZXRCYWxhbmNlcwkBGF9kZWNyZW1lbnRCYWxhbmNlQnlJbmRleAMFEXRlbXBBc3NldEJhbGFuY2VzBRF0YXJnZXRBc3NldEluZGV4XwkAZAIFDXNvdXJjZUFtb3VudF8FEnNvdXJjZVBsdXNGZWVEZWx0YQQMdGFyZ2V0QW1vdW50CQBlAgkAZAIFDXNvdXJjZUFtb3VudF8FEnNvdXJjZVBsdXNGZWVEZWx0YQUTdGFyZ2V0TWludXNGZWVEZWx0YQQDZXJyCQETX3ZhbGlkYXRlQWxsb2NhdGlvbgIFEG5ld0Fzc2V0QmFsYW5jZXMFEW5ld1Jld2FyZEJhbGFuY2VzAwkAAAIFA2VycgUDZXJyBA0kdDAzMjI4MjMyNDIzCQEbX2NhbGN1bGF0ZUxwQW5kUHJvdG9jb2xGZWVzBAkAZAIFEXRhcmdldEFzc2V0SW5kZXhfAAEFDHRhcmdldEFtb3VudAUJbHBGZWVSYXRlBQ9wcm90b2NvbEZlZVJhdGUEBWxwRmVlCAUNJHQwMzIyODIzMjQyMwJfMQQLcHJvdG9jb2xGZWUIBQ0kdDAzMjI4MjMyNDIzAl8yBBRzaWdtYUZlZVBlckxwVXBkYXRlZAgFDSR0MDMyMjgyMzI0MjMCXzMJAJgKBgUMdGFyZ2V0QW1vdW50BRBuZXdBc3NldEJhbGFuY2VzBRFuZXdSZXdhcmRCYWxhbmNlcwUFbHBGZWUFC3Byb3RvY29sRmVlBRRzaWdtYUZlZVBlckxwVXBkYXRlZAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLhsBaQEEaW5pdA4HYXNzZXRzXw1hc3NldFdlaWdodHNfCmxwRmVlUmF0ZV8QcHJvdG9jb2xGZWVSYXRlXwxscFRva2VuTmFtZV8NbHBUb2tlbkRlc2NyXxBscFRva2VuRGVjaW1hbHNfF21heEFsbG9jYXRpb25BbXBsaWZpZXJfEHdlaWdodEFtcGxpZmllcl8QZGlzYmFsYW5jZUNvZWZmXwtmZWVNYXhSYXRlXxRwcm90b2NvbEZlZUNvbnRyYWN0XwpwcmVjaXNpb25fB3BhdXNlcl8EA2VycgMDAwMDAwMDAwMDAwMDAwMDCQERX29ubHlUaGlzQ29udHJhY3QBCAUBaQZjYWxsZXIJARNfd2hlbk5vdEluaXRpYWxpemVkAAcJARBfd2hlbk11bHRpc2lnU2V0AAcJAQ9fdmFsaWRhdGVBc3NldHMCBQdhc3NldHNfAhRpbml0OiBpbnZhbGlkIGFzc2V0cwcJARBfdmFsaWRhdGVJbnRMaXN0BAUNYXNzZXRXZWlnaHRzXwABBQpNQVhfV0VJR0hUAhppbml0OiBpbnZhbGlkIGFzc2V0V2VpZ2h0cwcJARJfdmFsaWRhdGVJbnRFcXVhbHMDCQCQAwEFB2Fzc2V0c18JAJADAQUNYXNzZXRXZWlnaHRzXwIfaW5pdDogaW52YWxpZCBhc3NldFdlaWdodHMgc2l6ZQcJAQxfdmFsaWRhdGVJbnQEBQpscEZlZVJhdGVfAAAFB01BWF9GRUUCFGluaXQ6IGludmFsaWQgbHAgZmVlBwkBDF92YWxpZGF0ZUludAQFEHByb3RvY29sRmVlUmF0ZV8AAAUHTUFYX0ZFRQIaaW5pdDogaW52YWxpZCBwcm90b2NvbCBmZWUHCQESX3ZhbGlkYXRlVG9rZW5OYW1lAgUMbHBUb2tlbk5hbWVfAhJpbml0OiBpbnZhbGlkIG5hbWUHCQETX3ZhbGlkYXRlVG9rZW5EZXNjcgIFDWxwVG9rZW5EZXNjcl8CE2luaXQ6IGludmFsaWQgZGVzY3IHCQERX3ZhbGlkYXRlRGVjaW1hbHMCBRBscFRva2VuRGVjaW1hbHNfAhZpbml0OiBpbnZhbGlkIGRlY2ltYWxzBwkBDF92YWxpZGF0ZUludAQFF21heEFsbG9jYXRpb25BbXBsaWZpZXJfAAAFDU1BWF9BTVBMSUZJRVICJGluaXQ6IGludmFsaWQgbWF4QWxsb2NhdGlvbkFtcGxpZmllcgcJAQxfdmFsaWRhdGVJbnQEBRB3ZWlnaHRBbXBsaWZpZXJfAAAFF21heEFsbG9jYXRpb25BbXBsaWZpZXJfAh1pbml0OiBpbnZhbGlkIHdlaWdodEFtcGxpZmllcgcJAQxfdmFsaWRhdGVJbnQEBRBkaXNiYWxhbmNlQ29lZmZfAAAFB01BWF9JTlQCHWluaXQ6IGludmFsaWQgZGlzYmFsYW5jZUNvZWZmBwkBDF92YWxpZGF0ZUludAQFC2ZlZU1heFJhdGVfAAAFB01BWF9JTlQCGGluaXQ6IGludmFsaWQgZmVlTWF4UmF0ZQcJARBfdmFsaWRhdGVBZGRyZXNzAgUUcHJvdG9jb2xGZWVDb250cmFjdF8CIWluaXQ6IGludmFsaWQgcHJvdG9jb2xGZWVDb250cmFjdAcJAQxfdmFsaWRhdGVJbnQEBQpwcmVjaXNpb25fAAEFB01BWF9JTlQCF2luaXQ6IGludmFsaWQgcHJlY2lzaW9uBwkBEF92YWxpZGF0ZUFkZHJlc3MCBQdwYXVzZXJfAhRpbml0OiBpbnZhbGlkIHBhdXNlcgcDCQAAAgUDZXJyBQNlcnIEDSR0MDM0MzEyMzQzODEJARRfcHJlcGFyZUFzc2V0V2VpZ2h0cwEFDWFzc2V0V2VpZ2h0c18EDGFzc2V0V2VpZ2h0cwgFDSR0MDM0MzEyMzQzODECXzEEC3NpZ21hV2VpZ2h0CAUNJHQwMzQzMTIzNDM4MQJfMgQNYXNzZXRCYWxhbmNlcwkBFV9wcmVwYXJlQXNzZXRCYWxhbmNlcwEFB2Fzc2V0c18EBWlzc3VlCQDCCAUFDGxwVG9rZW5OYW1lXwUNbHBUb2tlbkRlc2NyXwAABRBscFRva2VuRGVjaW1hbHNfBgQJbHBBc3NldElkCQC4CAEFBWlzc3VlBA5zdG9yYWdlVXBkYXRlZAkAnAoKBQlscEFzc2V0SWQGAAAFCmxwRmVlUmF0ZV8FEHByb3RvY29sRmVlUmF0ZV8FF21heEFsbG9jYXRpb25BbXBsaWZpZXJfBRB3ZWlnaHRBbXBsaWZpZXJfBRBkaXNiYWxhbmNlQ29lZmZfBQtmZWVNYXhSYXRlXwkBEUBleHRyTmF0aXZlKDEwNjIpAQUUcHJvdG9jb2xGZWVDb250cmFjdF8JAJQKAgkAzggCCQDOCAIJAM4IAgkAzggCCQDOCAIJAM4IAgkAzggCCQDOCAIJAMwIAgUFaXNzdWUFA25pbAkBDF9zYXZlU3RvcmFnZQEFDnN0b3JhZ2VVcGRhdGVkCQELX3NhdmVBc3NldHMBBQdhc3NldHNfCQESX3NhdmVBc3NldEJhbGFuY2VzAQUNYXNzZXRCYWxhbmNlcwkBE19zYXZlUmV3YXJkQmFsYW5jZXMBBQ1hc3NldEJhbGFuY2VzCQERX3NhdmVBc3NldFdlaWdodHMBBQxhc3NldFdlaWdodHMJAQ5fc2F2ZVByZWNpc2lvbgEFCnByZWNpc2lvbl8JARJfc2F2ZVNpZ21hRmVlUGVyTHABCQESX2xvYWRTaWdtYUZlZVBlckxwAAkBC19zYXZlUGF1c2VyAQkBEUBleHRyTmF0aXZlKDEwNjIpAQUHcGF1c2VyXwUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQpkZXBvc2l0QWxsAQdhbW91bnRfBANlcnIDAwkBEF93aGVuSW5pdGlhbGl6ZWQACQEOX3doZW5Ob3RQYXVzZWQABwkBDF92YWxpZGF0ZUludAQFB2Ftb3VudF8AAAUHTUFYX0lOVAIaZGVwb3NpdEFsbDogaW52YWxpZCBhbW91bnQHAwkAAAIFA2VycgUDZXJyBAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAQJbHBBc3NldElkCAUHc3RvcmFnZQJfMQQKbHBEZWNpbWFscwkBDF9nZXREZWNpbWFscwEJANgEAQUJbHBBc3NldElkBAZhc3NldHMJAQtfbG9hZEFzc2V0cwAEDSR0MDM2MTgwMzYyNjUJAQtfZGVwb3NpdEFsbAEFB2Ftb3VudF8EDmxwVG9rZW5zVG9NaW50CAUNJHQwMzYxODAzNjI2NQJfMQQZcmVxdWlyZWRBbW91bnRzTm9ybWFsaXplZAgFDSR0MDM2MTgwMzYyNjUCXzIEDWFzc2V0QmFsYW5jZXMIBQ0kdDAzNjE4MDM2MjY1Al8zCgEIZm9sZEZ1bmMCA2FjYwRlbGVtBAVpbmRleAgFA2FjYwJfMQQPcGF5bWVudEFzc2V0U3RyCQELX2Fzc2V0VG9TdHIBCAkAkQMCCAUBaQhwYXltZW50cwUFaW5kZXgHYXNzZXRJZAQUcGF5bWVudEFzc2V0RGVjaW1hbHMJAQxfZ2V0RGVjaW1hbHMBBQ9wYXltZW50QXNzZXRTdHIEGHJlcXVpcmVkQW1vdW50Tm9ybWFsaXplZAkAkQMCBRlyZXF1aXJlZEFtb3VudHNOb3JtYWxpemVkBQVpbmRleAQOcmVxdWlyZWRBbW91bnQJARJfbm9ybWFsaXplRGVjaW1hbHMEBRhyZXF1aXJlZEFtb3VudE5vcm1hbGl6ZWQFCmxwRGVjaW1hbHMFFHBheW1lbnRBc3NldERlY2ltYWxzBQdDRUlMSU5HBARlcnIxAwkBAiE9AgUPcGF5bWVudEFzc2V0U3RyBQRlbGVtCQACAQkArAICAiNkZXBvc2l0QWxsOiBpbnZhbGlkIHBheW1lbnQ6IGluZGV4PQkApAMBBQVpbmRleAMJAGcCAAAFDnJlcXVpcmVkQW1vdW50CQACAQImZGVwb3NpdEFsbDogdG9vIGxpdHRsZSBhbW91bnQgcmVxdWlyZWQFBHVuaXQDCQAAAgUEZXJyMQUEZXJyMQQGY2hhbmdlAwkAZgIICQCRAwIIBQFpCHBheW1lbnRzBQVpbmRleAZhbW91bnQFDnJlcXVpcmVkQW1vdW50CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgkAZQIICQCRAwIIBQFpCHBheW1lbnRzBQVpbmRleAZhbW91bnQFDnJlcXVpcmVkQW1vdW50CAkAkQMCCAUBaQhwYXltZW50cwUFaW5kZXgHYXNzZXRJZAUDbmlsAwkAZgIFDnJlcXVpcmVkQW1vdW50CAkAkQMCCAUBaQhwYXltZW50cwUFaW5kZXgGYW1vdW50CQACAQkArAICCQCsAgIJAKwCAgIoZGVwb3NpdEFsbDogaW5zdWZmaWNpZW50IHBheW1lbnQsIGluZGV4PQkApAMBBQVpbmRleAILLCByZXF1aXJlZD0JAKQDAQUOcmVxdWlyZWRBbW91bnQFA25pbAkAlAoCCQBkAgUFaW5kZXgAAQkAzggCCAUDYWNjAl8yBQZjaGFuZ2UJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4EDSR0MDM3NDA4Mzc0NzAKAAIkbAUGYXNzZXRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCAAAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEIZm9sZEZ1bmMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoEA2lkeAgFDSR0MDM3NDA4Mzc0NzACXzEEDWNoYW5nZUFjdGlvbnMIBQ0kdDAzNzQwODM3NDcwAl8yBA5zdG9yYWdlVXBkYXRlZAkAnAoKCAUHc3RvcmFnZQJfMQgFB3N0b3JhZ2UCXzIJAGQCCAUHc3RvcmFnZQJfMwUObHBUb2tlbnNUb01pbnQIBQdzdG9yYWdlAl80CAUHc3RvcmFnZQJfNQgFB3N0b3JhZ2UCXzYIBQdzdG9yYWdlAl83CAUHc3RvcmFnZQJfOAgFB3N0b3JhZ2UCXzkIBQdzdG9yYWdlA18xMAkAlAoCCQDOCAIJAM4IAgkAzggCCQDMCAIJAQdSZWlzc3VlAwUJbHBBc3NldElkBQ5scFRva2Vuc1RvTWludAYJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQ5scFRva2Vuc1RvTWludAUJbHBBc3NldElkBQNuaWwJAQxfc2F2ZVN0b3JhZ2UBBQ5zdG9yYWdlVXBkYXRlZAkBEl9zYXZlQXNzZXRCYWxhbmNlcwEFDWFzc2V0QmFsYW5jZXMFDWNoYW5nZUFjdGlvbnMFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEHZGVwb3NpdAEMbWluTHBBbW91bnRfBANlcnIJAQxfdmFsaWRhdGVJbnQEBQxtaW5McEFtb3VudF8AAAUHTUFYX0lOVAIeZGVwb3NpdDogaW52YWxpZCBtaW4gbHAgYW1vdW50AwkAAAIFA2VycgUDZXJyBAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAQJbHBBc3NldElkCAUHc3RvcmFnZQJfMQQMbHBBc3NldElkU3RyCQELX2Fzc2V0VG9TdHIBBQlscEFzc2V0SWQECmxwRGVjaW1hbHMJAQxfZ2V0RGVjaW1hbHMBBQxscEFzc2V0SWRTdHIEBGVycjEDAwMDAwkBEF93aGVuSW5pdGlhbGl6ZWQACQEOX3doZW5Ob3RQYXVzZWQABwkBDl9jaGVja1dhdGNoZG9nAAcJARJfdmFsaWRhdGVJbnRFcXVhbHMDCQCQAwEIBQFpCHBheW1lbnRzAAECHmRlcG9zaXQ6IGludmFsaWQgcGF5bWVudHMgc2l6ZQcJARVfdmFsaWRhdGVMaXN0Q29udGFpbnMDCQELX2xvYWRBc3NldHMACQELX2Fzc2V0VG9TdHIBCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQCHmRlcG9zaXQ6IGludmFsaWQgcGF5bWVudCBhc3NldAcJAQxfdmFsaWRhdGVJbnQECAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAABBQdNQVhfSU5UAh9kZXBvc2l0OiBpbnZhbGlkIHBheW1lbnQgYW1vdW50BwMJAAACBQRlcnIxBQRlcnIxBAhhc3NldFN0cgkBC19hc3NldFRvU3RyAQgJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBA1hc3NldERlY2ltYWxzCQEMX2dldERlY2ltYWxzAQUIYXNzZXRTdHIEEGFtb3VudE5vcm1hbGl6ZWQJARJfbm9ybWFsaXplRGVjaW1hbHMECAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAUNYXNzZXREZWNpbWFscwUKbHBEZWNpbWFscwUERE9XTgQNJHQwMzg5MTAzOTA0MgkBCF9kZXBvc2l0AgUIYXNzZXRTdHIFEGFtb3VudE5vcm1hbGl6ZWQEDmxwVG9rZW5zVG9NaW50CAUNJHQwMzg5MTAzOTA0MgJfMQQNYXNzZXRCYWxhbmNlcwgFDSR0MDM4OTEwMzkwNDICXzIEDnJld2FyZEJhbGFuY2VzCAUNJHQwMzg5MTAzOTA0MgJfMwQFbHBGZWUIBQ0kdDAzODkxMDM5MDQyAl80BAtwcm90b2NvbEZlZQgFDSR0MDM4OTEwMzkwNDICXzUEFHNpZ21hRmVlUGVyTHBVcGRhdGVkCAUNJHQwMzg5MTAzOTA0MgJfNgQObHBUb2tlbnNUb1NlbmQJAGUCCQBlAgUObHBUb2tlbnNUb01pbnQFBWxwRmVlBQtwcm90b2NvbEZlZQQEZXJyMgkBDF92YWxpZGF0ZUludAQFDmxwVG9rZW5zVG9TZW5kBQxtaW5McEFtb3VudF8FB01BWF9JTlQCFmRlcG9zaXQ6IGxlc3MgdGhhbiBtaW4DCQAAAgUEZXJyMgUEZXJyMgQOc3RvcmFnZVVwZGF0ZWQJAJwKCggFB3N0b3JhZ2UCXzEIBQdzdG9yYWdlAl8yCQBkAggFB3N0b3JhZ2UCXzMFDmxwVG9rZW5zVG9NaW50CAUHc3RvcmFnZQJfNAgFB3N0b3JhZ2UCXzUIBQdzdG9yYWdlAl82CAUHc3RvcmFnZQJfNwgFB3N0b3JhZ2UCXzgIBQdzdG9yYWdlAl85CAUHc3RvcmFnZQNfMTAJAJQKAgkAzggCCQDOCAIJAM4IAgkAzggCCQDOCAIJAM4IAgkAzAgCCQEHUmVpc3N1ZQMFCWxwQXNzZXRJZAUObHBUb2tlbnNUb01pbnQGCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgUObHBUb2tlbnNUb1NlbmQFCWxwQXNzZXRJZAUDbmlsCQEMX3NhdmVTdG9yYWdlAQUOc3RvcmFnZVVwZGF0ZWQJARJfc2F2ZUFzc2V0QmFsYW5jZXMBBQ1hc3NldEJhbGFuY2VzCQETX3NhdmVSZXdhcmRCYWxhbmNlcwEFDnJld2FyZEJhbGFuY2VzCQEKX3NhdmVMcEZlZQIFDGxwQXNzZXRJZFN0cgkAZAIFBWxwRmVlCQEKX2xvYWRMcEZlZQEFDGxwQXNzZXRJZFN0cgkBEF9zYXZlUHJvdG9jb2xGZWUCBQxscEFzc2V0SWRTdHIJAGQCBQtwcm90b2NvbEZlZQkBEF9sb2FkUHJvdG9jb2xGZWUBBQxscEFzc2V0SWRTdHIJARJfc2F2ZVNpZ21hRmVlUGVyTHABBRRzaWdtYUZlZVBlckxwVXBkYXRlZAUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQt3aXRoZHJhd0FsbAAEB3N0b3JhZ2UJAQxfbG9hZFN0b3JhZ2UABAlscEFzc2V0SWQIBQdzdG9yYWdlAl8xBAxscEFzc2V0SWRTdHIJANgEAQUJbHBBc3NldElkBApscERlY2ltYWxzCQEMX2dldERlY2ltYWxzAQUMbHBBc3NldElkU3RyBAZhc3NldHMJAQtfbG9hZEFzc2V0cwAEA2VycgMDAwkBEF93aGVuSW5pdGlhbGl6ZWQACQESX3ZhbGlkYXRlSW50RXF1YWxzAwkAkAMBCAUBaQhwYXltZW50cwABAiJ3aXRoZHJhd0FsbDogaW52YWxpZCBwYXltZW50cyBzaXplBwkBFF92YWxpZGF0ZVN0cmluZ0VxdWFsAwUMbHBBc3NldElkU3RyCQELX2Fzc2V0VG9TdHIBCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQCIndpdGhkcmF3QWxsOiBpbnZhbGlkIHBheW1lbnQgYXNzZXQHCQEMX3ZhbGlkYXRlSW50BAgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQAAQUHTUFYX0lOVAIjd2l0aGRyYXdBbGw6IGludmFsaWQgcGF5bWVudCBhbW91bnQHAwkAAAIFA2VycgUDZXJyBA0kdDA0MDU1MDQwNjM3CQEMX3dpdGhkcmF3QWxsAQgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQEDmxwVG9rZW5zVG9CdXJuCAUNJHQwNDA1NTA0MDYzNwJfMQQNYmFsYW5jZXNUb1BheQgFDSR0MDQwNTUwNDA2MzcCXzIEDWFzc2V0QmFsYW5jZXMIBQ0kdDA0MDU1MDQwNjM3Al8zBA5wYXltZW50QWN0aW9ucwkBGF9nZXRQYXltZW50c0Zyb21CYWxhbmNlcwQFBmFzc2V0cwUNYmFsYW5jZXNUb1BheQgFAWkGY2FsbGVyBQpscERlY2ltYWxzBA5zdG9yYWdlVXBkYXRlZAkAnAoKCAUHc3RvcmFnZQJfMQgFB3N0b3JhZ2UCXzIJAGUCCAUHc3RvcmFnZQJfMwUObHBUb2tlbnNUb0J1cm4IBQdzdG9yYWdlAl80CAUHc3RvcmFnZQJfNQgFB3N0b3JhZ2UCXzYIBQdzdG9yYWdlAl83CAUHc3RvcmFnZQJfOAgFB3N0b3JhZ2UCXzkIBQdzdG9yYWdlA18xMAkAlAoCCQDOCAIJAM4IAgkAzggCCQDMCAIJAQRCdXJuAgUJbHBBc3NldElkBQ5scFRva2Vuc1RvQnVybgUDbmlsBQ5wYXltZW50QWN0aW9ucwkBDF9zYXZlU3RvcmFnZQEFDnN0b3JhZ2VVcGRhdGVkCQESX3NhdmVBc3NldEJhbGFuY2VzAQUNYXNzZXRCYWxhbmNlcwUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQh3aXRoZHJhdwIIYXNzZXRJZF8KbWluQW1vdW50XwQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQAECWxwQXNzZXRJZAgFB3N0b3JhZ2UCXzEEDGxwQXNzZXRJZFN0cgkA2AQBBQlscEFzc2V0SWQECmxwRGVjaW1hbHMJAQxfZ2V0RGVjaW1hbHMBBQxscEFzc2V0SWRTdHIEBmFzc2V0cwkBC19sb2FkQXNzZXRzAAQDZXJyAwMDAwMDAwkBEF93aGVuSW5pdGlhbGl6ZWQACQEOX3doZW5Ob3RQYXVzZWQABwkBDl9jaGVja1dhdGNoZG9nAAcJARJfdmFsaWRhdGVJbnRFcXVhbHMDCQCQAwEIBQFpCHBheW1lbnRzAAECH3dpdGhkcmF3OiBpbnZhbGlkIHBheW1lbnRzIHNpemUHCQEUX3ZhbGlkYXRlU3RyaW5nRXF1YWwDBQxscEFzc2V0SWRTdHIJAQtfYXNzZXRUb1N0cgEICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAIfd2l0aGRyYXc6IGludmFsaWQgcGF5bWVudCBhc3NldAcJAQxfdmFsaWRhdGVJbnQECAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAABBQdNQVhfSU5UAiB3aXRoZHJhdzogaW52YWxpZCBwYXltZW50IGFtb3VudAcJARVfdmFsaWRhdGVMaXN0Q29udGFpbnMDBQZhc3NldHMFCGFzc2V0SWRfAhl3aXRoZHJhdzogaW52YWxpZCBhc3NldElkBwkBDF92YWxpZGF0ZUludAQFCm1pbkFtb3VudF8AAAUHTUFYX0lOVAIbd2l0aGRyYXc6IGludmFsaWQgbWluQW1vdW50BwMJAAACBQNlcnIFA2VycgQNJHQwNDE5OTE0MjE0NgkBCV93aXRoZHJhdwIFCGFzc2V0SWRfCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAQWdGFyZ2V0QW1vdW50Tm9ybWFsaXplZAgFDSR0MDQxOTkxNDIxNDYCXzEEEmZpbmFsQXNzZXRCYWxhbmNlcwgFDSR0MDQxOTkxNDIxNDYCXzIEE2ZpbmFsUmV3YXJkQmFsYW5jZXMIBQ0kdDA0MTk5MTQyMTQ2Al8zBAVscEZlZQgFDSR0MDQxOTkxNDIxNDYCXzQEC3Byb3RvY29sRmVlCAUNJHQwNDE5OTE0MjE0NgJfNQQUc2lnbWFGZWVQZXJMcFVwZGF0ZWQIBQ0kdDA0MTk5MTQyMTQ2Al82BBVmaW5hbEFtb3VudE5vcm1hbGl6ZWQJAGUCCQBlAgUWdGFyZ2V0QW1vdW50Tm9ybWFsaXplZAUFbHBGZWUFC3Byb3RvY29sRmVlBA50YXJnZXREZWNpbWFscwkBDF9nZXREZWNpbWFscwEFCGFzc2V0SWRfBAtmaW5hbEFtb3VudAkBEl9ub3JtYWxpemVEZWNpbWFscwQFFWZpbmFsQW1vdW50Tm9ybWFsaXplZAUKbHBEZWNpbWFscwUOdGFyZ2V0RGVjaW1hbHMFBERPV04EBGVycjEJAQxfdmFsaWRhdGVJbnQEBQtmaW5hbEFtb3VudAUKbWluQW1vdW50XwUHTUFYX0lOVAIXd2l0aGRyYXc6IGxlc3MgdGhhbiBtaW4DCQAAAgUEZXJyMQUEZXJyMQQOc3RvcmFnZVVwZGF0ZWQJAJwKCggFB3N0b3JhZ2UCXzEIBQdzdG9yYWdlAl8yCQBlAggFB3N0b3JhZ2UCXzMICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50CAUHc3RvcmFnZQJfNAgFB3N0b3JhZ2UCXzUIBQdzdG9yYWdlAl82CAUHc3RvcmFnZQJfNwgFB3N0b3JhZ2UCXzgIBQdzdG9yYWdlAl85CAUHc3RvcmFnZQNfMTAJAJQKAgkAzggCCQDOCAIJAM4IAgkAzggCCQDOCAIJAM4IAgkAzAgCCQEEQnVybgIFCWxwQXNzZXRJZAgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQtmaW5hbEFtb3VudAkBC19zdHJUb0Fzc2V0AQUIYXNzZXRJZF8FA25pbAkBDF9zYXZlU3RvcmFnZQEFDnN0b3JhZ2VVcGRhdGVkCQESX3NhdmVBc3NldEJhbGFuY2VzAQUSZmluYWxBc3NldEJhbGFuY2VzCQETX3NhdmVSZXdhcmRCYWxhbmNlcwEFE2ZpbmFsUmV3YXJkQmFsYW5jZXMJAQpfc2F2ZUxwRmVlAgUIYXNzZXRJZF8JAGQCBQVscEZlZQkBCl9sb2FkTHBGZWUBBQhhc3NldElkXwkBEF9zYXZlUHJvdG9jb2xGZWUCBQhhc3NldElkXwkAZAIFC3Byb3RvY29sRmVlCQEQX2xvYWRQcm90b2NvbEZlZQEFCGFzc2V0SWRfCQESX3NhdmVTaWdtYUZlZVBlckxwAQUUc2lnbWFGZWVQZXJMcFVwZGF0ZWQFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEEc3dhcAIOdGFyZ2V0QXNzZXRJZF8KbWluQW1vdW50XwQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQAECWxwQXNzZXRJZAgFB3N0b3JhZ2UCXzEECmxwRGVjaW1hbHMJAQxfZ2V0RGVjaW1hbHMBCQDYBAEFCWxwQXNzZXRJZAQGYXNzZXRzCQELX2xvYWRBc3NldHMABA5zb3VyY2VBc3NldFN0cgkBC19hc3NldFRvU3RyAQgJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBBZzb3VyY2VBbW91bnROb3JtYWxpemVkCQESX25vcm1hbGl6ZURlY2ltYWxzBAgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQJAQxfZ2V0RGVjaW1hbHMBBQ5zb3VyY2VBc3NldFN0cgUKbHBEZWNpbWFscwUERE9XTgQQc291cmNlQXNzZXRJbmRleAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDPCAIFBmFzc2V0cwUOc291cmNlQXNzZXRTdHICGnN3YXA6IGludmFsaWQgc291cmNlIGFzc2V0AwkAAAIFEHNvdXJjZUFzc2V0SW5kZXgFEHNvdXJjZUFzc2V0SW5kZXgEEHRhcmdldEFzc2V0SW5kZXgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAzwgCBQZhc3NldHMFDnRhcmdldEFzc2V0SWRfAhpzd2FwOiBpbnZhbGlkIHRhcmdldCBhc3NldAMJAAACBRB0YXJnZXRBc3NldEluZGV4BRB0YXJnZXRBc3NldEluZGV4BANlcnIDAwMDAwMJARBfd2hlbkluaXRpYWxpemVkAAkBDl93aGVuTm90UGF1c2VkAAcJAQ5fY2hlY2tXYXRjaGRvZwAHCQEMX3ZhbGlkYXRlSW50BAUKbWluQW1vdW50XwAABQdNQVhfSU5UAh9zd2FwOiBpbnZhbGlkIG1pbiB0YXJnZXQgYW1vdW50BwkBDF92YWxpZGF0ZUludAQFFnNvdXJjZUFtb3VudE5vcm1hbGl6ZWQAAQUHTUFYX0lOVAIbc3dhcDogaW52YWxpZCBzb3VyY2UgYW1vdW50BwkBFF92YWxpZGF0ZVN0cmluZ05vdEVxAwUOc291cmNlQXNzZXRTdHIFDnRhcmdldEFzc2V0SWRfAhFzd2FwOiBzYW1lIGFzc2V0cwcJARJfdmFsaWRhdGVJbnRFcXVhbHMDCQCQAwEIBQFpCHBheW1lbnRzAAECG3N3YXA6IGludmFsaWQgcGF5bWVudHMgc2l6ZQcDCQAAAgUDZXJyBQNlcnIEDSR0MDQ0MzExNDQ0OTAJAQVfc3dhcAMFEHNvdXJjZUFzc2V0SW5kZXgFEHRhcmdldEFzc2V0SW5kZXgFFnNvdXJjZUFtb3VudE5vcm1hbGl6ZWQEFnRhcmdldEFtb3VudE5vcm1hbGl6ZWQIBQ0kdDA0NDMxMTQ0NDkwAl8xBBJmaW5hbEFzc2V0QmFsYW5jZXMIBQ0kdDA0NDMxMTQ0NDkwAl8yBBNmaW5hbFJld2FyZEJhbGFuY2VzCAUNJHQwNDQzMTE0NDQ5MAJfMwQFbHBGZWUIBQ0kdDA0NDMxMTQ0NDkwAl80BAtwcm90b2NvbEZlZQgFDSR0MDQ0MzExNDQ0OTACXzUEFHNpZ21hRmVlUGVyTHBVcGRhdGVkCAUNJHQwNDQzMTE0NDQ5MAJfNgQVZmluYWxBbW91bnROb3JtYWxpemVkCQBlAgkAZQIFFnRhcmdldEFtb3VudE5vcm1hbGl6ZWQFBWxwRmVlBQtwcm90b2NvbEZlZQQOdGFyZ2V0RGVjaW1hbHMJAQxfZ2V0RGVjaW1hbHMBBQ50YXJnZXRBc3NldElkXwQLZmluYWxBbW91bnQJARJfbm9ybWFsaXplRGVjaW1hbHMEBRVmaW5hbEFtb3VudE5vcm1hbGl6ZWQFCmxwRGVjaW1hbHMFDnRhcmdldERlY2ltYWxzBQRET1dOBARlcnIxCQEMX3ZhbGlkYXRlSW50BAULZmluYWxBbW91bnQFCm1pbkFtb3VudF8FB01BWF9JTlQCE3N3YXA6IGxlc3MgdGhhbiBtaW4DCQAAAgUEZXJyMQUEZXJyMQkAlAoCCQDOCAIJAM4IAgkAzggCCQDOCAIJAM4IAgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFC2ZpbmFsQW1vdW50CQELX3N0clRvQXNzZXQBBQ50YXJnZXRBc3NldElkXwUDbmlsCQESX3NhdmVBc3NldEJhbGFuY2VzAQUSZmluYWxBc3NldEJhbGFuY2VzCQETX3NhdmVSZXdhcmRCYWxhbmNlcwEFE2ZpbmFsUmV3YXJkQmFsYW5jZXMJAQpfc2F2ZUxwRmVlAgUOdGFyZ2V0QXNzZXRJZF8JAGQCBQVscEZlZQkBCl9sb2FkTHBGZWUBBQ50YXJnZXRBc3NldElkXwkBEF9zYXZlUHJvdG9jb2xGZWUCBQ50YXJnZXRBc3NldElkXwkAZAIFC3Byb3RvY29sRmVlCQEQX2xvYWRQcm90b2NvbEZlZQEFDnRhcmdldEFzc2V0SWRfCQESX3NhdmVTaWdtYUZlZVBlckxwAQUUc2lnbWFGZWVQZXJMcFVwZGF0ZWQFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQENZ2V0RGVwb3NpdEFsbAEJbHBBbW91bnRfBANlcnIJAQxfdmFsaWRhdGVJbnQEBQlscEFtb3VudF8AAQUHTUFYX0lOVAIdZ2V0RGVwb3NpdEFsbDogaW52YWxpZCBhbW91bnQDCQAAAgUDZXJyBQNlcnIEDSR0MDQ1NjYyNDU3NDkJAQtfZGVwb3NpdEFsbAEFCWxwQW1vdW50XwQObHBUb2tlbnNUb01pbnQIBQ0kdDA0NTY2MjQ1NzQ5Al8xBBlyZXF1aXJlZEFtb3VudHNOb3JtYWxpemVkCAUNJHQwNDU2NjI0NTc0OQJfMgQNYXNzZXRCYWxhbmNlcwgFDSR0MDQ1NjYyNDU3NDkCXzMJAJQKAgUDbmlsCQCUCgIFDmxwVG9rZW5zVG9NaW50BRlyZXF1aXJlZEFtb3VudHNOb3JtYWxpemVkCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCmdldERlcG9zaXQCCGFzc2V0SWRfB2Ftb3VudF8EA2VycgMJARVfdmFsaWRhdGVMaXN0Q29udGFpbnMDCQELX2xvYWRBc3NldHMABQhhc3NldElkXwIZZ2V0RGVwb3NpdDogaW52YWxpZCBhc3NldAkBDF92YWxpZGF0ZUludAQFB2Ftb3VudF8AAQUHTUFYX0lOVAIaZ2V0RGVwb3NpdDogaW52YWxpZCBhbW91bnQHAwkAAAIFA2VycgUDZXJyBAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAQJbHBBc3NldElkCAUHc3RvcmFnZQJfMQQKbHBEZWNpbWFscwkBDF9nZXREZWNpbWFscwEJANgEAQUJbHBBc3NldElkBA1hc3NldERlY2ltYWxzCQEMX2dldERlY2ltYWxzAQUIYXNzZXRJZF8EEGFtb3VudE5vcm1hbGl6ZWQJARJfbm9ybWFsaXplRGVjaW1hbHMEBQdhbW91bnRfBQ1hc3NldERlY2ltYWxzBQpscERlY2ltYWxzBQRET1dOBA0kdDA0NjUwODQ2NjQwCQEIX2RlcG9zaXQCBQhhc3NldElkXwUQYW1vdW50Tm9ybWFsaXplZAQObHBUb2tlbnNUb01pbnQIBQ0kdDA0NjUwODQ2NjQwAl8xBA1hc3NldEJhbGFuY2VzCAUNJHQwNDY1MDg0NjY0MAJfMgQOcmV3YXJkQmFsYW5jZXMIBQ0kdDA0NjUwODQ2NjQwAl8zBAVscEZlZQgFDSR0MDQ2NTA4NDY2NDACXzQEC3Byb3RvY29sRmVlCAUNJHQwNDY1MDg0NjY0MAJfNQQUc2lnbWFGZWVQZXJMcFVwZGF0ZWQIBQ0kdDA0NjUwODQ2NjQwAl82BA5scFRva2Vuc1RvU2VuZAkAZQIJAGUCBQ5scFRva2Vuc1RvTWludAUFbHBGZWUFC3Byb3RvY29sRmVlCQCUCgIFA25pbAUObHBUb2tlbnNUb1NlbmQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEOZ2V0V2l0aGRyYXdBbGwBCWxwQW1vdW50XwQDZXJyCQEMX3ZhbGlkYXRlSW50BAUJbHBBbW91bnRfAAAFB01BWF9JTlQCHmdldFdpdGhkcmF3QWxsOiBpbnZhbGlkIGFtb3VudAMJAAACBQNlcnIFA2VycgQNJHQwNDcwNzk0NzE1NQkBDF93aXRoZHJhd0FsbAEFCWxwQW1vdW50XwQObHBUb2tlbnNUb0J1cm4IBQ0kdDA0NzA3OTQ3MTU1Al8xBA1iYWxhbmNlc1RvR2V0CAUNJHQwNDcwNzk0NzE1NQJfMgQNYXNzZXRCYWxhbmNlcwgFDSR0MDQ3MDc5NDcxNTUCXzMJAJQKAgUDbmlsBQ1iYWxhbmNlc1RvR2V0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBC2dldFdpdGhkcmF3Aghhc3NldElkXwdhbW91bnRfBANlcnIDCQEVX3ZhbGlkYXRlTGlzdENvbnRhaW5zAwkBC19sb2FkQXNzZXRzAAUIYXNzZXRJZF8CGmdldFdpdGhkcmF3OiBpbnZhbGlkIGFzc2V0CQEMX3ZhbGlkYXRlSW50BAUHYW1vdW50XwABBQdNQVhfSU5UAhtnZXRXaXRoZHJhdzogaW52YWxpZCBhbW91bnQHAwkAAAIFA2VycgUDZXJyBAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAQJbHBBc3NldElkCAUHc3RvcmFnZQJfMQQKbHBEZWNpbWFscwkBDF9nZXREZWNpbWFscwEJANgEAQUJbHBBc3NldElkBA0kdDA0NzgwNjQ3OTM4CQEJX3dpdGhkcmF3AgUIYXNzZXRJZF8FB2Ftb3VudF8EFnRhcmdldEFtb3VudE5vcm1hbGl6ZWQIBQ0kdDA0NzgwNjQ3OTM4Al8xBA1hc3NldEJhbGFuY2VzCAUNJHQwNDc4MDY0NzkzOAJfMgQOcmV3YXJkQmFsYW5jZXMIBQ0kdDA0NzgwNjQ3OTM4Al8zBAVscEZlZQgFDSR0MDQ3ODA2NDc5MzgCXzQEC3Byb3RvY29sRmVlCAUNJHQwNDc4MDY0NzkzOAJfNQQUc2lnbWFGZWVQZXJMcFVwZGF0ZWQIBQ0kdDA0NzgwNjQ3OTM4Al82BBVmaW5hbEFtb3VudE5vcm1hbGl6ZWQJAGUCCQBlAgUWdGFyZ2V0QW1vdW50Tm9ybWFsaXplZAUFbHBGZWUFC3Byb3RvY29sRmVlBA50YXJnZXREZWNpbWFscwkBDF9nZXREZWNpbWFscwEFCGFzc2V0SWRfBAtmaW5hbEFtb3VudAkBEl9ub3JtYWxpemVEZWNpbWFscwQFFWZpbmFsQW1vdW50Tm9ybWFsaXplZAUKbHBEZWNpbWFscwUOdGFyZ2V0RGVjaW1hbHMFBERPV04JAJQKAgUDbmlsBQtmaW5hbEFtb3VudAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQdnZXRTd2FwAw5zb3VyY2VBc3NldElkXw50YXJnZXRBc3NldElkXw1zb3VyY2VBbW91bnRfBAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAQJbHBBc3NldElkCAUHc3RvcmFnZQJfMQQKbHBEZWNpbWFscwkBDF9nZXREZWNpbWFscwEJANgEAQUJbHBBc3NldElkBAZhc3NldHMJAQtfbG9hZEFzc2V0cwAEEHNvdXJjZUFzc2V0SW5kZXgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAzwgCBQZhc3NldHMFDnNvdXJjZUFzc2V0SWRfAhpzd2FwOiBpbnZhbGlkIHNvdXJjZSBhc3NldAMJAAACBRBzb3VyY2VBc3NldEluZGV4BRBzb3VyY2VBc3NldEluZGV4BBB0YXJnZXRBc3NldEluZGV4CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAM8IAgUGYXNzZXRzBQ50YXJnZXRBc3NldElkXwIac3dhcDogaW52YWxpZCB0YXJnZXQgYXNzZXQDCQAAAgUQdGFyZ2V0QXNzZXRJbmRleAUQdGFyZ2V0QXNzZXRJbmRleAQWc291cmNlQW1vdW50Tm9ybWFsaXplZAkBEl9ub3JtYWxpemVEZWNpbWFscwQFDXNvdXJjZUFtb3VudF8JAQxfZ2V0RGVjaW1hbHMBBQ5zb3VyY2VBc3NldElkXwUKbHBEZWNpbWFscwUERE9XTgQDZXJyAwkBDF92YWxpZGF0ZUludAQFFnNvdXJjZUFtb3VudE5vcm1hbGl6ZWQAAQUHTUFYX0lOVAIbc3dhcDogaW52YWxpZCBzb3VyY2UgYW1vdW50CQEUX3ZhbGlkYXRlU3RyaW5nTm90RXEDBQ5zb3VyY2VBc3NldElkXwUOdGFyZ2V0QXNzZXRJZF8CEXN3YXA6IHNhbWUgYXNzZXRzBwMJAAACBQNlcnIFA2VycgQNJHQwNDkzNDg0OTUyNwkBBV9zd2FwAwUQc291cmNlQXNzZXRJbmRleAUQdGFyZ2V0QXNzZXRJbmRleAUWc291cmNlQW1vdW50Tm9ybWFsaXplZAQWdGFyZ2V0QW1vdW50Tm9ybWFsaXplZAgFDSR0MDQ5MzQ4NDk1MjcCXzEEEmZpbmFsQXNzZXRCYWxhbmNlcwgFDSR0MDQ5MzQ4NDk1MjcCXzIEE2ZpbmFsUmV3YXJkQmFsYW5jZXMIBQ0kdDA0OTM0ODQ5NTI3Al8zBAVscEZlZQgFDSR0MDQ5MzQ4NDk1MjcCXzQEC3Byb3RvY29sRmVlCAUNJHQwNDkzNDg0OTUyNwJfNQQUc2lnbWFGZWVQZXJMcFVwZGF0ZWQIBQ0kdDA0OTM0ODQ5NTI3Al82BBVmaW5hbEFtb3VudE5vcm1hbGl6ZWQJAGUCCQBlAgUWdGFyZ2V0QW1vdW50Tm9ybWFsaXplZAUFbHBGZWUFC3Byb3RvY29sRmVlBA50YXJnZXREZWNpbWFscwkBDF9nZXREZWNpbWFscwEFDnRhcmdldEFzc2V0SWRfBAtmaW5hbEFtb3VudAkBEl9ub3JtYWxpemVEZWNpbWFscwQFFWZpbmFsQW1vdW50Tm9ybWFsaXplZAUKbHBEZWNpbWFscwUOdGFyZ2V0RGVjaW1hbHMFBERPV04JAJQKAgUDbmlsBQtmaW5hbEFtb3VudAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQhnZXRDbGFpbQEFdXNlcl8EBHVzZXIDCQBmAgkAsQIBBQV1c2VyXwAACQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQUFdXNlcl8CFmdldENsYWltOiBpbnZhbGlkIHVzZXIIBQFpBmNhbGxlcgQNJHQwNTAxNjk1MDIyNQkBC19jaGVja3BvaW50AQUEdXNlcgQRY2hlY2twb2ludEFjdGlvbnMIBQ0kdDA1MDE2OTUwMjI1Al8xBAt1c2VyUHJvZml0cwgFDSR0MDUwMTY5NTAyMjUCXzIJAJQKAgUDbmlsBQt1c2VyUHJvZml0cwFpAQpnZXRBc3NldElkAAQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQAECWxwQXNzZXRJZAgFB3N0b3JhZ2UCXzEJAJQKAgUDbmlsCQDYBAEFCWxwQXNzZXRJZAFpAQtnZXREZWNpbWFscwAEB3N0b3JhZ2UJAQxfbG9hZFN0b3JhZ2UABAlscEFzc2V0SWQIBQdzdG9yYWdlAl8xBApscERlY2ltYWxzCQEMX2dldERlY2ltYWxzAQkA2AQBBQlscEFzc2V0SWQJAJQKAgUDbmlsBQpscERlY2ltYWxzAWkBCmNoZWNrcG9pbnQBBXVzZXJfBANlcnIDCQEQX3doZW5Jbml0aWFsaXplZAAJAQ5fd2hlbk5vdFBhdXNlZAAHAwkAAAIFA2VycgUDZXJyBAR1c2VyAwkAZgIJALECAQUFdXNlcl8AAAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEFBXVzZXJfAhhjaGVja3BvaW50OiBpbnZhbGlkIHVzZXIIBQFpBmNhbGxlcgkBC19jaGVja3BvaW50AQUEdXNlcgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQVzdGFrZQAEA2VycgMJARBfd2hlbkluaXRpYWxpemVkAAkBDl93aGVuTm90UGF1c2VkAAcDCQAAAgUDZXJyBQNlcnIEB3N0b3JhZ2UJAQxfbG9hZFN0b3JhZ2UABAxscEFzc2V0SWRTdHIJAQtfYXNzZXRUb1N0cgEIBQdzdG9yYWdlAl8xBARlcnIxAwMJARJfdmFsaWRhdGVJbnRFcXVhbHMDCQCQAwEIBQFpCHBheW1lbnRzAAECHHN0YWtlOiBpbnZhbGlkIHBheW1lbnRzIHNpemUJARRfdmFsaWRhdGVTdHJpbmdFcXVhbAMFDGxwQXNzZXRJZFN0cgkBC19hc3NldFRvU3RyAQgJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkAhxzdGFrZTogaW52YWxpZCBwYXltZW50IGFzc2V0BwkBDF92YWxpZGF0ZUludAQICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50AAAFB01BWF9JTlQCHXN0YWtlOiBpbnZhbGlkIHBheW1lbnQgYW1vdW50BwMJAAACBQRlcnIxBQRlcnIxBA0kdDA1MTQzNzUxNDk3CQELX2NoZWNrcG9pbnQBCAUBaQZjYWxsZXIEEWNoZWNrcG9pbnRBY3Rpb25zCAUNJHQwNTE0Mzc1MTQ5NwJfMQQLdXNlclByb2ZpdHMIBQ0kdDA1MTQzNzUxNDk3Al8yCQCUCgIJAM4IAgkAzggCBRFjaGVja3BvaW50QWN0aW9ucwkBC19zYXZlVXNlckxwAggFAWkGY2FsbGVyCQBkAgkBC19sb2FkVXNlckxwAQgFAWkGY2FsbGVyCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAkBDF9zYXZlVG90YWxMcAEJAGQCCQEMX2xvYWRUb3RhbExwAAgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEHdW5zdGFrZQEHYW1vdW50XwQDZXJyAwkBEF93aGVuSW5pdGlhbGl6ZWQACQEOX3doZW5Ob3RQYXVzZWQABwMJAAACBQNlcnIFA2VycgQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQAECWxwQXNzZXRJZAgFB3N0b3JhZ2UCXzEEBnVzZXJMcAkBC19sb2FkVXNlckxwAQgFAWkGY2FsbGVyBARlcnIxCQEMX3ZhbGlkYXRlSW50BAUHYW1vdW50XwAABQZ1c2VyTHACF3Vuc3Rha2U6IGludmFsaWQgYW1vdW50AwkAAAIFBGVycjEFBGVycjEEDSR0MDUyMDA4NTIwNjgJAQtfY2hlY2twb2ludAEIBQFpBmNhbGxlcgQRY2hlY2twb2ludEFjdGlvbnMIBQ0kdDA1MjAwODUyMDY4Al8xBAt1c2VyUHJvZml0cwgFDSR0MDUyMDA4NTIwNjgCXzIJAJQKAgkAzggCCQDOCAIJAM4IAgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFB2Ftb3VudF8FCWxwQXNzZXRJZAUDbmlsBRFjaGVja3BvaW50QWN0aW9ucwkBC19zYXZlVXNlckxwAggFAWkGY2FsbGVyCQBlAgUGdXNlckxwBQdhbW91bnRfCQEMX3NhdmVUb3RhbExwAQkAZQIJAQxfbG9hZFRvdGFsTHAABQdhbW91bnRfBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBBWNsYWltAQV1c2VyXwQDZXJyAwkBEF93aGVuSW5pdGlhbGl6ZWQACQEOX3doZW5Ob3RQYXVzZWQABwMJAAACBQNlcnIFA2VycgQEdXNlcgMJAGYCCQCxAgEFBXVzZXJfAAAJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBBQV1c2VyXwITY2xhaW06IGludmFsaWQgdXNlcggFAWkGY2FsbGVyBAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAQJbHBBc3NldElkCAUHc3RvcmFnZQJfMQQMbHBBc3NldElkU3RyCQELX2Fzc2V0VG9TdHIBBQlscEFzc2V0SWQEBmFzc2V0cwkAzAgCBQxscEFzc2V0SWRTdHIJAQtfbG9hZEFzc2V0cwAECG1heEluZGV4CQBlAgkAkAMBBQZhc3NldHMAAQQNJHQwNTI3NTY1MjgxMgkBC19jaGVja3BvaW50AQUEdXNlcgQRY2hlY2twb2ludEFjdGlvbnMIBQ0kdDA1Mjc1NjUyODEyAl8xBAt1c2VyUHJvZml0cwgFDSR0MDUyNzU2NTI4MTICXzIKAQhmb2xkRnVuYwIDYWNjBnByb2ZpdAQFaW5kZXgIBQNhY2MCXzEDAwkAZwIFCG1heEluZGV4BQVpbmRleAkAZgIFBnByb2ZpdAAABwQFYXNzZXQJAJEDAgUGYXNzZXRzBQVpbmRleAkAlQoDCQBkAgUFaW5kZXgAAQkAzQgCCAUDYWNjAl8yAAAJAM0IAggFA2FjYwJfMwkBDlNjcmlwdFRyYW5zZmVyAwUEdXNlcgUGcHJvZml0CQELX3N0clRvQXNzZXQBBQVhc3NldAkAlQoDCQBkAgUFaW5kZXgAAQkAzQgCCAUDYWNjAl8yBQZwcm9maXQIBQNhY2MCXzMEDSR0MDUzMTkwNTMyODEKAAIkbAULdXNlclByb2ZpdHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCVCgMAAAUDbmlsBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCGZvbGRGdW5jAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsEA2lkeAgFDSR0MDUzMTkwNTMyODECXzEEEnVzZXJQcm9maXRzVXBkYXRlZAgFDSR0MDUzMTkwNTMyODECXzIEDXByb2ZpdEFjdGlvbnMIBQ0kdDA1MzE5MDUzMjgxAl8zCQCUCgIJAM4IAgkAzggCBQ1wcm9maXRBY3Rpb25zCQDRCAIFEWNoZWNrcG9pbnRBY3Rpb25zAAAJARBfc2F2ZVVzZXJQcm9maXRzAgUEdXNlcgUSdXNlclByb2ZpdHNVcGRhdGVkBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCGNsYWltQWxsAQV1c2VyXwQDZXJyAwkBEF93aGVuSW5pdGlhbGl6ZWQACQEOX3doZW5Ob3RQYXVzZWQABwMJAAACBQNlcnIFA2VycgQEdXNlcgMJAGYCCQCxAgEFBXVzZXJfAAAJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBBQV1c2VyXwIWY2xhaW1BbGw6IGludmFsaWQgdXNlcggFAWkGY2FsbGVyBAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAQJbHBBc3NldElkCAUHc3RvcmFnZQJfMQQMbHBBc3NldElkU3RyCQELX2Fzc2V0VG9TdHIBBQlscEFzc2V0SWQEBmFzc2V0cwkAzAgCBQxscEFzc2V0SWRTdHIJAQtfbG9hZEFzc2V0cwAECG1heEluZGV4CQBlAgkAkAMBBQZhc3NldHMAAQQNJHQwNTM5MTE1Mzk3MQkBEl9sb2FkQXNzZXRCYWxhbmNlcwAEDWFzc2V0QmFsYW5jZXMIBQ0kdDA1MzkxMTUzOTcxAl8xBBBhc3NldFRvdGFsU3VwcGx5CAUNJHQwNTM5MTE1Mzk3MQJfMgQNJHQwNTM5Nzc1NDAzMwkBC19jaGVja3BvaW50AQUEdXNlcgQRY2hlY2twb2ludEFjdGlvbnMIBQ0kdDA1Mzk3NzU0MDMzAl8xBAt1c2VyUHJvZml0cwgFDSR0MDUzOTc3NTQwMzMCXzIKAQhmb2xkRnVuYwIDYWNjBnByb2ZpdAQFaW5kZXgIBQNhY2MCXzEDCQAAAgUFaW5kZXgAAAkAlwoFCQBkAgUFaW5kZXgAAQkAzQgCCAUDYWNjAl8yAAAIBQNhY2MCXzMIBQNhY2MCXzQJAGQCCAUDYWNjAl81BQZwcm9maXQDAwkAZgIFBWluZGV4AAAJAGcCBQhtYXhJbmRleAUFaW5kZXgHBAphc3NldEluZGV4CQBlAgUFaW5kZXgAAQQHYmFsYW5jZQkAkQMCBQ1hc3NldEJhbGFuY2VzBQphc3NldEluZGV4CQCXCgUJAGQCBQVpbmRleAABCQDNCAIIBQNhY2MCXzIAAAkAzQgCCAUDYWNjAl8zCQBkAgUHYmFsYW5jZQUGcHJvZml0CQBkAggFA2FjYwJfNAUGcHJvZml0CAUDYWNjAl81CQCXCgUJAGQCBQVpbmRleAABCQDNCAIIBQNhY2MCXzIAAAgFA2FjYwJfMwgFA2FjYwJfNAgFA2FjYwJfNQQNJHQwNTQ1Njk1NDcwNQoAAiRsBQt1c2VyUHJvZml0cwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJcKBQAABQNuaWwFA25pbAAAAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCGZvbGRGdW5jAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsEA2lkeAgFDSR0MDU0NTY5NTQ3MDUCXzEEEnVzZXJQcm9maXRzVXBkYXRlZAgFDSR0MDU0NTY5NTQ3MDUCXzIEFGFzc2V0QmFsYW5jZXNVcGRhdGVkCAUNJHQwNTQ1Njk1NDcwNQJfMwQObHBUb2tlbnNUb01pbnQIBQ0kdDA1NDU2OTU0NzA1Al80BA5scFRva2Vuc1Byb2ZpdAgFDSR0MDU0NTY5NTQ3MDUCXzUEDnN0b3JhZ2VVcGRhdGVkCQCcCgoIBQdzdG9yYWdlAl8xCAUHc3RvcmFnZQJfMgkAZAIIBQdzdG9yYWdlAl8zBQ5scFRva2Vuc1RvTWludAgFB3N0b3JhZ2UCXzQIBQdzdG9yYWdlAl81CAUHc3RvcmFnZQJfNggFB3N0b3JhZ2UCXzcIBQdzdG9yYWdlAl84CAUHc3RvcmFnZQJfOQgFB3N0b3JhZ2UDXzEwCQCUCgIJAM4IAgkAzggCCQDOCAIJAM4IAgkAzAgCCQEHUmVpc3N1ZQMFCWxwQXNzZXRJZAUObHBUb2tlbnNUb01pbnQGCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFBHVzZXIJAGQCBQ5scFRva2Vuc1RvTWludAUObHBUb2tlbnNQcm9maXQFCWxwQXNzZXRJZAUDbmlsCQEMX3NhdmVTdG9yYWdlAQUOc3RvcmFnZVVwZGF0ZWQJARJfc2F2ZUFzc2V0QmFsYW5jZXMBBRRhc3NldEJhbGFuY2VzVXBkYXRlZAkA0QgCBRFjaGVja3BvaW50QWN0aW9ucwAACQEQX3NhdmVVc2VyUHJvZml0cwIFBHVzZXIFEnVzZXJQcm9maXRzVXBkYXRlZAUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQ51cGRhdGVQb29sRmVlcwIKbHBGZWVSYXRlXxBwcm90b2NvbEZlZVJhdGVfBANlcnIDAwMJARFfb25seVRoaXNDb250cmFjdAEIBQFpBmNhbGxlcgkBEF93aGVuSW5pdGlhbGl6ZWQABwkBDF92YWxpZGF0ZUludAQFCmxwRmVlUmF0ZV8AAAUHTUFYX0ZFRQIedXBkYXRlUG9vbEZlZXM6IGludmFsaWQgbHAgZmVlBwkBDF92YWxpZGF0ZUludAQFEHByb3RvY29sRmVlUmF0ZV8AAAUHTUFYX0ZFRQIkdXBkYXRlUG9vbEZlZXM6IGludmFsaWQgcHJvdG9jb2wgZmVlBwMJAAACBQNlcnIFA2VycgQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQAEDnN0b3JhZ2VVcGRhdGVkCQCcCgoIBQdzdG9yYWdlAl8xCAUHc3RvcmFnZQJfMggFB3N0b3JhZ2UCXzMFCmxwRmVlUmF0ZV8FEHByb3RvY29sRmVlUmF0ZV8IBQdzdG9yYWdlAl82CAUHc3RvcmFnZQJfNwgFB3N0b3JhZ2UCXzgIBQdzdG9yYWdlAl85CAUHc3RvcmFnZQNfMTAJAJQKAgkBDF9zYXZlU3RvcmFnZQEFDnN0b3JhZ2VVcGRhdGVkBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBEHVwZGF0ZVBvb2xQYXJhbXMEF21heEFsbG9jYXRpb25BbXBsaWZpZXJfEHdlaWdodEFtcGxpZmllcl8QZGlzYmFsYW5jZUNvZWZmXwtmZWVNYXhSYXRlXwQDZXJyAwMDAwMJARFfb25seVRoaXNDb250cmFjdAEIBQFpBmNhbGxlcgkBEF93aGVuSW5pdGlhbGl6ZWQABwkBDF92YWxpZGF0ZUludAQFF21heEFsbG9jYXRpb25BbXBsaWZpZXJfAAAFDU1BWF9BTVBMSUZJRVICMHVwZGF0ZVBvb2xQYXJhbXM6IGludmFsaWQgbWF4QWxsb2NhdGlvbkFtcGxpZmllcgcJAQxfdmFsaWRhdGVJbnQEBRB3ZWlnaHRBbXBsaWZpZXJfAAAFF21heEFsbG9jYXRpb25BbXBsaWZpZXJfAil1cGRhdGVQb29sUGFyYW1zOiBpbnZhbGlkIHdlaWdodEFtcGxpZmllcgcJAQxfdmFsaWRhdGVJbnQEBRBkaXNiYWxhbmNlQ29lZmZfAAAFB01BWF9JTlQCKXVwZGF0ZVBvb2xQYXJhbXM6IGludmFsaWQgZGlzYmFsYW5jZUNvZWZmBwkBDF92YWxpZGF0ZUludAQFC2ZlZU1heFJhdGVfAAAFB01BWF9JTlQCJHVwZGF0ZVBvb2xQYXJhbXM6IGludmFsaWQgZmVlTWF4UmF0ZQcDCQAAAgUDZXJyBQNlcnIEB3N0b3JhZ2UJAQxfbG9hZFN0b3JhZ2UABA5zdG9yYWdlVXBkYXRlZAkAnAoKCAUHc3RvcmFnZQJfMQgFB3N0b3JhZ2UCXzIIBQdzdG9yYWdlAl8zCAUHc3RvcmFnZQJfNAgFB3N0b3JhZ2UCXzUFF21heEFsbG9jYXRpb25BbXBsaWZpZXJfBRB3ZWlnaHRBbXBsaWZpZXJfBRBkaXNiYWxhbmNlQ29lZmZfBQtmZWVNYXhSYXRlXwgFB3N0b3JhZ2UDXzEwCQCUCgIJAQxfc2F2ZVN0b3JhZ2UBBQ5zdG9yYWdlVXBkYXRlZAUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQ9taWdyYXRlQmFsYW5jZXMABANlcnIDCQERX29ubHlUaGlzQ29udHJhY3QBCAUBaQZjYWxsZXIJARBfd2hlbkluaXRpYWxpemVkAAcDCQAAAgUDZXJyBQNlcnIEB3N0b3JhZ2UJAQxfbG9hZFN0b3JhZ2UABA1scFRva2VuU3VwcGx5CAUHc3RvcmFnZQJfMwQNJHQwNTcyMzY1NzI5NgkBEl9sb2FkQXNzZXRCYWxhbmNlcwAEDWFzc2V0QmFsYW5jZXMIBQ0kdDA1NzIzNjU3Mjk2Al8xBBBhc3NldFRvdGFsU3VwcGx5CAUNJHQwNTcyMzY1NzI5NgJfMgQMYmFsYW5jZXNEaWZmCQCWAwEJAMwIAgkAZQIFEGFzc2V0VG90YWxTdXBwbHkFDWxwVG9rZW5TdXBwbHkJAMwIAgAABQNuaWwEDnN0b3JhZ2VVcGRhdGVkCQCcCgoIBQdzdG9yYWdlAl8xCAUHc3RvcmFnZQJfMgkAZAIFDWxwVG9rZW5TdXBwbHkFDGJhbGFuY2VzRGlmZggFB3N0b3JhZ2UCXzQIBQdzdG9yYWdlAl81CAUHc3RvcmFnZQJfNggFB3N0b3JhZ2UCXzcIBQdzdG9yYWdlAl84CAUHc3RvcmFnZQJfOQgFB3N0b3JhZ2UDXzEwCQCUCgIJAQxfc2F2ZVN0b3JhZ2UBBQ5zdG9yYWdlVXBkYXRlZAUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQVwYXVzZQAEA2VycgMDCQELX29ubHlQYXVzZXIBCAUBaQZjYWxsZXIJARBfd2hlbkluaXRpYWxpemVkAAcJAQ5fd2hlbk5vdFBhdXNlZAAHAwkAAAIFA2VycgUDZXJyCQCUCgIJAQpfc2F2ZVBhdXNlAQYFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEHdW5wYXVzZQAEA2VycgMDCQERX29ubHlUaGlzQ29udHJhY3QBCAUBaQZjYWxsZXIJARBfd2hlbkluaXRpYWxpemVkAAcJAQtfd2hlblBhdXNlZAAHAwkAAAIFA2VycgUDZXJyCQCUCgIJAQpfc2F2ZVBhdXNlAQcFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEMdXBkYXRlUGF1c2VyAQdwYXVzZXJfBANlcnIDAwkBEV9vbmx5VGhpc0NvbnRyYWN0AQgFAWkGY2FsbGVyCQEQX3doZW5Jbml0aWFsaXplZAAHCQEQX3ZhbGlkYXRlQWRkcmVzcwIFB3BhdXNlcl8CHHVwZGF0ZVBhdXNlcjogaW52YWxpZCBwYXVzZXIHAwkAAAIFA2VycgUDZXJyCQCUCgIJAQtfc2F2ZVBhdXNlcgEJARFAZXh0ck5hdGl2ZSgxMDYyKQEFB3BhdXNlcl8FBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEOdXBkYXRlV2F0Y2hkb2cCCXdhdGNoZG9nXwdvZmZzZXRfBANlcnIDAwMJARFfb25seVRoaXNDb250cmFjdAEIBQFpBmNhbGxlcgkBEF93aGVuSW5pdGlhbGl6ZWQABwkBEF92YWxpZGF0ZUFkZHJlc3MCBQl3YXRjaGRvZ18CIHVwZGF0ZVdhdGNoZG9nOiBpbnZhbGlkIHdhdGNoZG9nBwkBDF92YWxpZGF0ZUludAQFB29mZnNldF8AAAUHTUFYX0lOVAIedXBkYXRlV2F0Y2hkb2c6IGludmFsaWQgb2Zmc2V0BwMJAAACBQNlcnIFA2VycgkAlAoCCQDOCAIJAQ1fc2F2ZVdhdGNoZG9nAQkBEUBleHRyTmF0aXZlKDEwNjIpAQUJd2F0Y2hkb2dfCQETX3NhdmVXYXRjaGRvZ09mZnNldAEFB29mZnNldF8FBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQELc2V0TXVsdGlzaWcBCW11bHRpc2lnXwQDZXJyAwkBEV9vbmx5VGhpc0NvbnRyYWN0AQgFAWkGY2FsbGVyCQEQX3ZhbGlkYXRlQWRkcmVzcwIFCW11bHRpc2lnXwIdc2V0TXVsdGlzaWc6IGludmFsaWQgbXVsdGlzaWcHAwkAAAIFA2VycgUDZXJyCQCUCgIJAQ1fc2F2ZU11bHRpc2lnAQkBEUBleHRyTmF0aXZlKDEwNjIpAQUJbXVsdGlzaWdfBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQJ0eAEGdmVyaWZ5AAQHJG1hdGNoMAkAoggBBQxLRVlfTVVMVElTSUcDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAhtdWx0aXNpZwUHJG1hdGNoMAkBC3ZhbHVlT3JFbHNlAgkAmwgCCQERQGV4dHJOYXRpdmUoMTA2MikBBQhtdWx0aXNpZwkAuQkCCQDMCAIFCktFWV9TVEFUVVMJAMwIAgkApQgBBQR0aGlzCQDMCAIJANgEAQgFAnR4AmlkBQNuaWwFA1NFUAcJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAIBQJ0eA9zZW5kZXJQdWJsaWNLZXmgPWn4", "height": 4101036, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 3h4jiKnLcQd77vG4CdGHz5myLh92dKsJ6EMtv6bNkzWU Next: none Diff:
OldNewDifferences
19831983 let lpTokensToMint = $t05456954705._4
19841984 let lpTokensProfit = $t05456954705._5
19851985 let storageUpdated = $Tuple10(storage._1, storage._2, (storage._3 + lpTokensToMint), storage._4, storage._5, storage._6, storage._7, storage._8, storage._9, storage._10)
1986- $Tuple2((((([Reissue(lpAssetId, lpTokensToMint, true), ScriptTransfer(i.caller, (lpTokensToMint + lpTokensProfit), lpAssetId)] ++ _saveStorage(storageUpdated)) ++ _saveAssetBalances(assetBalancesUpdated)) ++ removeByIndex(checkpointActions, 0)) ++ _saveUserProfits(user, userProfitsUpdated)), unit)
1986+ $Tuple2((((([Reissue(lpAssetId, lpTokensToMint, true), ScriptTransfer(user, (lpTokensToMint + lpTokensProfit), lpAssetId)] ++ _saveStorage(storageUpdated)) ++ _saveAssetBalances(assetBalancesUpdated)) ++ removeByIndex(checkpointActions, 0)) ++ _saveUserProfits(user, userProfitsUpdated)), unit)
19871987 }
19881988 else throw("Strict value is not equal to itself.")
19891989 }
20432043 then {
20442044 let storage = _loadStorage()
20452045 let lpTokenSupply = storage._3
2046- let $t05724057300 = _loadAssetBalances()
2047- let assetBalances = $t05724057300._1
2048- let assetTotalSupply = $t05724057300._2
2046+ let $t05723657296 = _loadAssetBalances()
2047+ let assetBalances = $t05723657296._1
2048+ let assetTotalSupply = $t05723657296._2
20492049 let balancesDiff = max([(assetTotalSupply - lpTokenSupply), 0])
20502050 let storageUpdated = $Tuple10(storage._1, storage._2, (lpTokenSupply + balancesDiff), storage._4, storage._5, storage._6, storage._7, storage._8, storage._9, storage._10)
20512051 $Tuple2(_saveStorage(storageUpdated), unit)
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 FEE_RATE_FACTOR = 1000000
1919
2020 let RATE_FACTOR = 1000000
2121
2222 let PERCENT_FACTOR = toBigInt(1000000000000000000)
2323
2424 let DISBAlANCE_COEFF_FACTOR = toBigInt(1000000000000)
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 INDEX_LIST = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
3131
3232 let ZERO_BIGINT = toBigInt(0)
3333
3434 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]
3535
3636 let INT_DECIMALS = 8
3737
3838 let BIGINT_DECIMALS = 18
3939
4040 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", "_")
4141
4242 let KEY_MULTISIG = "MULTISIG"
4343
4444 let KEY_STATUS = "STATUS"
4545
4646 let KEY_PAUSED = "PAUSED"
4747
4848 let KEY_PAUSER = "PAUSER"
4949
5050 let KEY_STORAGE = "STORAGE"
5151
5252 let KEY_ASSETS = "ASSETS"
5353
5454 let KEY_ASSET_BALANCES = "ASSET_BALANCES"
5555
5656 let KEY_REWARD_BALANCES = "REWARD_BALANCES"
5757
5858 let KEY_ASSET_WEIGHTS = "ASSET_WEIGHTS"
5959
6060 let KEY_LP_FEE = "LP_FEE"
6161
6262 let KEY_PROTOCOL_FEE = "PROTOCOL_FEE"
6363
6464 let KEY_PRECISION = "PRECISION"
6565
6666 let KEY_SIGMA_FEE_PER_LP = "SIGMA_FEE_PER_LP"
6767
6868 let KEY_USER_SIGMA_FEE_PER_LP = "USER_SIGMA_FEE_PER_LP"
6969
7070 let KEY_USER_LP = "USER_LP"
7171
7272 let KEY_TOTAL_LP = "TOTAL_LP"
7373
7474 let KEY_USER_PROFITS = "USER_PROFITS"
7575
7676 let KEY_WATCHDOG = "WATCHDOG"
7777
7878 let KEY_WATCHDOG_OFFSET = "WATCHDOG_OFFSET"
7979
8080 let KEY_WATCHDOG_HEIGHT = "WATCHDOG_HEIGHT"
8181
8282 func _validateAddress (address_,err_) = match addressFromString(address_) {
8383 case a: Address =>
8484 true
8585 case _ =>
8686 throw(err_)
8787 }
8888
8989
9090 func _validateAsset (assetId_,err_) = if ((assetId_ == WAVES))
9191 then true
9292 else match assetInfo(fromBase58String(assetId_)) {
9393 case a: Asset =>
9494 true
9595 case _ =>
9696 throw(err_)
9797 }
9898
9999
100100 func _validateInt (val_,lowerBoundary_,upperBoundary_,err_) = if (if ((lowerBoundary_ > val_))
101101 then true
102102 else (val_ > upperBoundary_))
103103 then throw(err_)
104104 else true
105105
106106
107107 func _validateBool (val_,target_,err_) = if ((val_ != target_))
108108 then throw(err_)
109109 else true
110110
111111
112112 func _validateStringEqual (val1_,val2_,err_) = if ((val1_ != val2_))
113113 then throw(err_)
114114 else true
115115
116116
117117 func _validateStringNotEq (val1_,val2_,err_) = if ((val1_ == val2_))
118118 then throw(err_)
119119 else true
120120
121121
122122 func _validateIntList (val_,lowerBoundary_,upperBoundary_,err_) = {
123123 func foldFunc (acc,elem) = match parseInt(elem) {
124124 case a: Int =>
125125 if (acc)
126126 then _validateInt(a, lowerBoundary_, upperBoundary_, err_)
127127 else false
128128 case _ =>
129129 throw(err_)
130130 }
131131
132132 let $l = val_
133133 let $s = size($l)
134134 let $acc0 = true
135135 func $f0_1 ($a,$i) = if (($i >= $s))
136136 then $a
137137 else foldFunc($a, $l[$i])
138138
139139 func $f0_2 ($a,$i) = if (($i >= $s))
140140 then $a
141141 else throw("List size exceeds 10")
142142
143143 $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)
144144 }
145145
146146
147147 func _validateAssets (assets_,err_) = {
148148 func foldFunc (acc,elem) = if (acc)
149149 then _validateAsset(elem, err_)
150150 else false
151151
152152 let $l = assets_
153153 let $s = size($l)
154154 let $acc0 = true
155155 func $f0_1 ($a,$i) = if (($i >= $s))
156156 then $a
157157 else foldFunc($a, $l[$i])
158158
159159 func $f0_2 ($a,$i) = if (($i >= $s))
160160 then $a
161161 else throw("List size exceeds 10")
162162
163163 $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)
164164 }
165165
166166
167167 func _validateIntEquals (val1_,val2_,err_) = if ((val1_ != val2_))
168168 then throw(err_)
169169 else true
170170
171171
172172 func _validateTokenName (val_,err_) = if (if ((4 > size(val_)))
173173 then true
174174 else (size(val_) > 16))
175175 then throw(err_)
176176 else true
177177
178178
179179 func _validateTokenDescr (val_,err_) = if ((size(val_) > 1000))
180180 then throw(err_)
181181 else true
182182
183183
184184 func _validateDecimals (val_,err_) = if (if ((0 > val_))
185185 then true
186186 else (val_ > 8))
187187 then throw(err_)
188188 else true
189189
190190
191191 func _validatePayment (payment_,assetId_,requiredAmount_,err_) = match payment_.assetId {
192192 case a: ByteVector =>
193193 if ((assetId_ != toBase58String(a)))
194194 then throw((err_ + ": asset"))
195195 else if ((requiredAmount_ > payment_.amount))
196196 then throw((err_ + ": amount"))
197197 else true
198198 case _ =>
199199 throw((err_ + ": asset"))
200200 }
201201
202202
203203 func _validateListContains (list_,val_,err_) = if (!(containsElement(list_, val_)))
204204 then throw(err_)
205205 else true
206206
207207
208208 func _assetToStr (asset_) = match asset_ {
209209 case a: ByteVector =>
210210 toBase58String(a)
211211 case _ =>
212212 WAVES
213213 }
214214
215215
216216 func _strToAsset (asset_) = if (if ((asset_ == WAVES))
217217 then true
218218 else (asset_ == ""))
219219 then unit
220220 else fromBase58String(asset_)
221221
222222
223223 func _loadPause () = match getBoolean(KEY_PAUSED) {
224224 case a: Boolean =>
225225 a
226226 case _ =>
227227 false
228228 }
229229
230230
231231 func _savePause (isPaused_) = [BooleanEntry(KEY_PAUSED, isPaused_)]
232232
233233
234234 func _loadPauser () = match getString(KEY_PAUSER) {
235235 case a: String =>
236236 addressFromStringValue(a)
237237 case _ =>
238238 Address(base58'')
239239 }
240240
241241
242242 func _savePauser (pauser_) = [StringEntry(KEY_PAUSER, toString(pauser_))]
243243
244244
245245 func _loadMultisig () = match getString(KEY_MULTISIG) {
246246 case a: String =>
247247 addressFromStringValue(a)
248248 case _ =>
249249 Address(base58'')
250250 }
251251
252252
253253 func _saveMultisig (multisig_) = [StringEntry(KEY_MULTISIG, toString(multisig_))]
254254
255255
256256 func _loadStorage () = match getString(KEY_STORAGE) {
257257 case a: String =>
258258 let struct = split(a, SEP)
259259 $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]))
260260 case _ =>
261261 $Tuple10(base58'', false, 0, 0, 0, 0, 0, 0, 0, Address(base58''))
262262 }
263263
264264
265265 func _saveStorage (storage_) = [StringEntry(KEY_STORAGE, makeString([toBase58String(storage_._1), if (storage_._2)
266266 then "1"
267267 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))]
268268
269269
270270 func _loadAssets () = match getString(KEY_ASSETS) {
271271 case a: String =>
272272 if ((size(a) > 0))
273273 then split_51C(a, SEP)
274274 else nil
275275 case _ =>
276276 nil
277277 }
278278
279279
280280 func _saveAssets (assets_) = [StringEntry(KEY_ASSETS, makeString_11C(assets_, SEP))]
281281
282282
283283 func _loadAssetBalances () = {
284284 func foldFunc (acc,elem) = {
285285 let balance = parseIntValue(elem)
286286 $Tuple2((acc._1 :+ balance), (acc._2 + balance))
287287 }
288288
289289 match getString(KEY_ASSET_BALANCES) {
290290 case a: String =>
291291 if ((size(a) > 0))
292292 then {
293293 let $l = split_51C(a, SEP)
294294 let $s = size($l)
295295 let $acc0 = $Tuple2(nil, 0)
296296 func $f0_1 ($a,$i) = if (($i >= $s))
297297 then $a
298298 else foldFunc($a, $l[$i])
299299
300300 func $f0_2 ($a,$i) = if (($i >= $s))
301301 then $a
302302 else throw("List size exceeds 10")
303303
304304 $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)
305305 }
306306 else $Tuple2(ZERO_INT_LIST_10, 0)
307307 case _ =>
308308 $Tuple2(ZERO_INT_LIST_10, 0)
309309 }
310310 }
311311
312312
313313 func _saveAssetBalances (balances_) = {
314314 func foldFunc (acc,elem) = (acc :+ toString(elem))
315315
316316 [StringEntry(KEY_ASSET_BALANCES, makeString_11C({
317317 let $l = balances_
318318 let $s = size($l)
319319 let $acc0 = nil
320320 func $f0_1 ($a,$i) = if (($i >= $s))
321321 then $a
322322 else foldFunc($a, $l[$i])
323323
324324 func $f0_2 ($a,$i) = if (($i >= $s))
325325 then $a
326326 else throw("List size exceeds 10")
327327
328328 $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)
329329 }, SEP))]
330330 }
331331
332332
333333 func _loadRewardBalances () = {
334334 func foldFunc (acc,elem) = {
335335 let balance = parseIntValue(elem)
336336 (acc :+ balance)
337337 }
338338
339339 match getString(KEY_REWARD_BALANCES) {
340340 case a: String =>
341341 if ((size(a) > 0))
342342 then {
343343 let $l = split_51C(a, SEP)
344344 let $s = size($l)
345345 let $acc0 = nil
346346 func $f0_1 ($a,$i) = if (($i >= $s))
347347 then $a
348348 else foldFunc($a, $l[$i])
349349
350350 func $f0_2 ($a,$i) = if (($i >= $s))
351351 then $a
352352 else throw("List size exceeds 10")
353353
354354 $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)
355355 }
356356 else ZERO_INT_LIST_10
357357 case _ =>
358358 ZERO_INT_LIST_10
359359 }
360360 }
361361
362362
363363 func _saveRewardBalances (balances_) = {
364364 func foldFunc (acc,elem) = (acc :+ toString(elem))
365365
366366 [StringEntry(KEY_REWARD_BALANCES, makeString_11C({
367367 let $l = balances_
368368 let $s = size($l)
369369 let $acc0 = nil
370370 func $f0_1 ($a,$i) = if (($i >= $s))
371371 then $a
372372 else foldFunc($a, $l[$i])
373373
374374 func $f0_2 ($a,$i) = if (($i >= $s))
375375 then $a
376376 else throw("List size exceeds 10")
377377
378378 $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)
379379 }, SEP))]
380380 }
381381
382382
383383 func _loadAssetWeights () = {
384384 func foldFunc (acc,elem) = {
385385 let weight = parseIntValue(elem)
386386 $Tuple2((acc._1 :+ weight), (acc._2 + weight))
387387 }
388388
389389 match getString(KEY_ASSET_WEIGHTS) {
390390 case a: String =>
391391 if ((size(a) > 0))
392392 then {
393393 let $l = split_51C(a, SEP)
394394 let $s = size($l)
395395 let $acc0 = $Tuple2(nil, 0)
396396 func $f0_1 ($a,$i) = if (($i >= $s))
397397 then $a
398398 else foldFunc($a, $l[$i])
399399
400400 func $f0_2 ($a,$i) = if (($i >= $s))
401401 then $a
402402 else throw("List size exceeds 10")
403403
404404 $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)
405405 }
406406 else $Tuple2(ZERO_INT_LIST_10, 0)
407407 case _ =>
408408 $Tuple2(ZERO_INT_LIST_10, 0)
409409 }
410410 }
411411
412412
413413 func _saveAssetWeights (weights_) = {
414414 func foldFunc (acc,elem) = (acc :+ toString(elem))
415415
416416 [StringEntry(KEY_ASSET_WEIGHTS, makeString_11C({
417417 let $l = weights_
418418 let $s = size($l)
419419 let $acc0 = nil
420420 func $f0_1 ($a,$i) = if (($i >= $s))
421421 then $a
422422 else foldFunc($a, $l[$i])
423423
424424 func $f0_2 ($a,$i) = if (($i >= $s))
425425 then $a
426426 else throw("List size exceeds 10")
427427
428428 $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)
429429 }, SEP))]
430430 }
431431
432432
433433 func _loadLpFee (assetId_) = match getInteger(makeString([KEY_LP_FEE, assetId_], SEP)) {
434434 case a: Int =>
435435 a
436436 case _ =>
437437 0
438438 }
439439
440440
441441 func _saveLpFee (assetId_,val_) = [IntegerEntry(makeString([KEY_LP_FEE, assetId_], SEP), val_)]
442442
443443
444444 func _loadProtocolFee (assetId_) = match getInteger(makeString([KEY_PROTOCOL_FEE, assetId_], SEP)) {
445445 case a: Int =>
446446 a
447447 case _ =>
448448 0
449449 }
450450
451451
452452 func _saveProtocolFee (assetId_,val_) = [IntegerEntry(makeString([KEY_PROTOCOL_FEE, assetId_], SEP), val_)]
453453
454454
455455 func _loadPrecision () = match getInteger(KEY_PRECISION) {
456456 case a: Int =>
457457 a
458458 case _ =>
459459 0
460460 }
461461
462462
463463 func _savePrecision (val_) = [IntegerEntry(KEY_PRECISION, val_)]
464464
465465
466466 func _loadSigmaFeePerLp () = {
467467 func foldFunc (acc,elem) = (acc :+ parseBigIntValue(elem))
468468
469469 match getString(KEY_SIGMA_FEE_PER_LP) {
470470 case a: String =>
471471 if ((size(a) > 0))
472472 then {
473473 let $l = split_51C(a, SEP)
474474 let $s = size($l)
475475 let $acc0 = nil
476476 func $f0_1 ($a,$i) = if (($i >= $s))
477477 then $a
478478 else foldFunc($a, $l[$i])
479479
480480 func $f0_2 ($a,$i) = if (($i >= $s))
481481 then $a
482482 else throw("List size exceeds 11")
483483
484484 $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)
485485 }
486486 else ZERO_BIGINT_LIST_11
487487 case _ =>
488488 ZERO_BIGINT_LIST_11
489489 }
490490 }
491491
492492
493493 func _saveSigmaFeePerLp (val_) = {
494494 func foldFunc (acc,elem) = (acc :+ toString(elem))
495495
496496 [StringEntry(KEY_SIGMA_FEE_PER_LP, makeString_11C({
497497 let $l = val_
498498 let $s = size($l)
499499 let $acc0 = nil
500500 func $f0_1 ($a,$i) = if (($i >= $s))
501501 then $a
502502 else foldFunc($a, $l[$i])
503503
504504 func $f0_2 ($a,$i) = if (($i >= $s))
505505 then $a
506506 else throw("List size exceeds 11")
507507
508508 $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)
509509 }, SEP))]
510510 }
511511
512512
513513 func _loadUserSigmaFeePerLp (user_) = {
514514 func foldFunc (acc,elem) = (acc :+ parseBigIntValue(elem))
515515
516516 match getString(makeString([KEY_USER_SIGMA_FEE_PER_LP, toString(user_)], SEP)) {
517517 case a: String =>
518518 if ((size(a) > 0))
519519 then {
520520 let $l = split_51C(a, SEP)
521521 let $s = size($l)
522522 let $acc0 = nil
523523 func $f0_1 ($a,$i) = if (($i >= $s))
524524 then $a
525525 else foldFunc($a, $l[$i])
526526
527527 func $f0_2 ($a,$i) = if (($i >= $s))
528528 then $a
529529 else throw("List size exceeds 11")
530530
531531 $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)
532532 }
533533 else ZERO_BIGINT_LIST_11
534534 case _ =>
535535 ZERO_BIGINT_LIST_11
536536 }
537537 }
538538
539539
540540 func _saveUserSigmaFeePerLp (user_,val_) = {
541541 func foldFunc (acc,elem) = (acc :+ toString(elem))
542542
543543 [StringEntry(makeString([KEY_USER_SIGMA_FEE_PER_LP, toString(user_)], SEP), makeString_11C({
544544 let $l = val_
545545 let $s = size($l)
546546 let $acc0 = nil
547547 func $f0_1 ($a,$i) = if (($i >= $s))
548548 then $a
549549 else foldFunc($a, $l[$i])
550550
551551 func $f0_2 ($a,$i) = if (($i >= $s))
552552 then $a
553553 else throw("List size exceeds 11")
554554
555555 $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)
556556 }, SEP))]
557557 }
558558
559559
560560 func _loadUserLp (address_) = match getInteger(makeString([KEY_USER_LP, toString(address_)], SEP)) {
561561 case a: Int =>
562562 a
563563 case _ =>
564564 0
565565 }
566566
567567
568568 func _saveUserLp (address_,val_) = [IntegerEntry(makeString([KEY_USER_LP, toString(address_)], SEP), val_)]
569569
570570
571571 func _loadTotalLp () = match getInteger(KEY_TOTAL_LP) {
572572 case a: Int =>
573573 a
574574 case _ =>
575575 0
576576 }
577577
578578
579579 func _saveTotalLp (val_) = [IntegerEntry(KEY_TOTAL_LP, val_)]
580580
581581
582582 func _loadUserProfits (user_) = {
583583 func foldFunc (acc,elem) = (acc :+ parseIntValue(elem))
584584
585585 match getString(makeString([KEY_USER_PROFITS, toString(user_)], SEP)) {
586586 case a: String =>
587587 if ((size(a) > 0))
588588 then {
589589 let $l = split_51C(a, SEP)
590590 let $s = size($l)
591591 let $acc0 = nil
592592 func $f0_1 ($a,$i) = if (($i >= $s))
593593 then $a
594594 else foldFunc($a, $l[$i])
595595
596596 func $f0_2 ($a,$i) = if (($i >= $s))
597597 then $a
598598 else throw("List size exceeds 11")
599599
600600 $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)
601601 }
602602 else ZERO_INT_LIST_11
603603 case _ =>
604604 ZERO_INT_LIST_11
605605 }
606606 }
607607
608608
609609 func _saveUserProfits (user_,val_) = {
610610 func foldFunc (acc,elem) = (acc :+ toString(elem))
611611
612612 [StringEntry(makeString([KEY_USER_PROFITS, toString(user_)], SEP), makeString_11C({
613613 let $l = val_
614614 let $s = size($l)
615615 let $acc0 = nil
616616 func $f0_1 ($a,$i) = if (($i >= $s))
617617 then $a
618618 else foldFunc($a, $l[$i])
619619
620620 func $f0_2 ($a,$i) = if (($i >= $s))
621621 then $a
622622 else throw("List size exceeds 11")
623623
624624 $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)
625625 }, SEP))]
626626 }
627627
628628
629629 func _loadWatchdog () = match getString(KEY_WATCHDOG) {
630630 case a: String =>
631631 addressFromStringValue(a)
632632 case _ =>
633633 Address(base58'')
634634 }
635635
636636
637637 func _saveWatchdog (watchdog_) = [StringEntry(KEY_WATCHDOG, toString(watchdog_))]
638638
639639
640640 func _loadWatchdogOffset () = match getInteger(KEY_WATCHDOG_OFFSET) {
641641 case a: Int =>
642642 a
643643 case _ =>
644644 0
645645 }
646646
647647
648648 func _saveWatchdogOffset (offset_) = [IntegerEntry(KEY_WATCHDOG_OFFSET, offset_)]
649649
650650
651651 func _onlyThisContract (caller_) = if ((caller_ != this))
652652 then throw("_onlyThisContract: revert")
653653 else true
654654
655655
656656 func _whenMultisigSet () = if ((_loadMultisig() == Address(base58'')))
657657 then throw("_whenMultisigSet: revert")
658658 else true
659659
660660
661661 func _whenNotInitialized () = {
662662 let storage = _loadStorage()
663663 if ((storage._1 != base58''))
664664 then throw("_whenNotInitialized: revert")
665665 else true
666666 }
667667
668668
669669 func _whenInitialized () = {
670670 let storage = _loadStorage()
671671 if ((storage._1 == base58''))
672672 then throw("_whenInitialized: revert")
673673 else true
674674 }
675675
676676
677677 func _whenNotPaused () = if (_loadPause())
678678 then throw("_whenNotPaused: revert")
679679 else true
680680
681681
682682 func _whenPaused () = if (!(_loadPause()))
683683 then throw("_whenPaused: revert")
684684 else true
685685
686686
687687 func _onlyPauser (caller_) = if ((caller_ != _loadPauser()))
688688 then throw("_onlyPauser: revert")
689689 else true
690690
691691
692692 func _checkWatchdog () = {
693693 let wd = match getInteger(_loadWatchdog(), KEY_WATCHDOG_HEIGHT) {
694694 case a: Int =>
695695 (a + _loadWatchdogOffset())
696696 case _ =>
697697 0
698698 }
699699 if ((height > wd))
700700 then throw("_checkWatchdog: revert")
701701 else true
702702 }
703703
704704
705705 func _getDecimals (assetId_) = match assetInfo(fromBase58String(assetId_)) {
706706 case a: Asset =>
707707 a.decimals
708708 case _ =>
709709 throw(("_getDecimals: no asset=" + assetId_))
710710 }
711711
712712
713713 func _normalizeDecimals (amount_,sourceDecimals_,targetDecimals_,round_) = if ((sourceDecimals_ >= targetDecimals_))
714714 then fraction(amount_, 1, pow(10, 0, (sourceDecimals_ - targetDecimals_), 0, 0, DOWN), round_)
715715 else (amount_ * pow(10, 0, (targetDecimals_ - sourceDecimals_), 0, 0, DOWN))
716716
717717
718718 func _prepareAssetBalances (assets_) = {
719719 func foldFunc (acc,elem) = (acc :+ 0)
720720
721721 let $l = assets_
722722 let $s = size($l)
723723 let $acc0 = nil
724724 func $f0_1 ($a,$i) = if (($i >= $s))
725725 then $a
726726 else foldFunc($a, $l[$i])
727727
728728 func $f0_2 ($a,$i) = if (($i >= $s))
729729 then $a
730730 else throw("List size exceeds 10")
731731
732732 $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)
733733 }
734734
735735
736736 func _prepareAssetWeights (assetWeights_) = {
737737 func foldFunc (acc,elem) = {
738738 let weight = parseIntValue(elem)
739739 $Tuple2((acc._1 :+ weight), (acc._2 + weight))
740740 }
741741
742742 let $l = assetWeights_
743743 let $s = size($l)
744744 let $acc0 = $Tuple2(nil, 0)
745745 func $f0_1 ($a,$i) = if (($i >= $s))
746746 then $a
747747 else foldFunc($a, $l[$i])
748748
749749 func $f0_2 ($a,$i) = if (($i >= $s))
750750 then $a
751751 else throw("List size exceeds 10")
752752
753753 $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)
754754 }
755755
756756
757757 func _getAssetBalances (assets_,decimals_) = {
758758 func foldFunc (acc,elem) = {
759759 let assetDecimals = _getDecimals(elem)
760760 let balance = _normalizeDecimals(assetBalance(this, fromBase58String(elem)), assetDecimals, decimals_, DOWN)
761761 $Tuple2((acc._1 :+ balance), (acc._2 + balance))
762762 }
763763
764764 let $l = assets_
765765 let $s = size($l)
766766 let $acc0 = $Tuple2(nil, 0)
767767 func $f0_1 ($a,$i) = if (($i >= $s))
768768 then $a
769769 else foldFunc($a, $l[$i])
770770
771771 func $f0_2 ($a,$i) = if (($i >= $s))
772772 then $a
773773 else throw("List size exceeds 10")
774774
775775 $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)
776776 }
777777
778778
779779 func _listIntToString (assets_) = {
780780 func foldFunc (acc,elem) = (acc :+ toString(elem))
781781
782782 makeString({
783783 let $l = assets_
784784 let $s = size($l)
785785 let $acc0 = nil
786786 func $f0_1 ($a,$i) = if (($i >= $s))
787787 then $a
788788 else foldFunc($a, $l[$i])
789789
790790 func $f0_2 ($a,$i) = if (($i >= $s))
791791 then $a
792792 else throw("List size exceeds 11")
793793
794794 $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)
795795 }, SEP)
796796 }
797797
798798
799799 func _listBigIntToString (assets_) = {
800800 func foldFunc (acc,elem) = (acc :+ toString(elem))
801801
802802 makeString({
803803 let $l = assets_
804804 let $s = size($l)
805805 let $acc0 = nil
806806 func $f0_1 ($a,$i) = if (($i >= $s))
807807 then $a
808808 else foldFunc($a, $l[$i])
809809
810810 func $f0_2 ($a,$i) = if (($i >= $s))
811811 then $a
812812 else throw("List size exceeds 11")
813813
814814 $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)
815815 }, SEP)
816816 }
817817
818818
819819 func _getEquilibriums (sigmaBalances_,weights_,sigmaWeight_) = {
820820 func foldFunc (acc,elem) = (acc :+ fraction(sigmaBalances_, elem, sigmaWeight_))
821821
822822 let $l = weights_
823823 let $s = size($l)
824824 let $acc0 = nil
825825 func $f0_1 ($a,$i) = if (($i >= $s))
826826 then $a
827827 else foldFunc($a, $l[$i])
828828
829829 func $f0_2 ($a,$i) = if (($i >= $s))
830830 then $a
831831 else throw("List size exceeds 10")
832832
833833 $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)
834834 }
835835
836836
837837 func _incrementBalancesByAmounts (balances_,amounts_) = {
838838 func foldFunc (acc,elem) = {
839839 let index = acc._1
840840 let amount = amounts_[index]
841841 let newBalance = (elem + amount)
842842 $Tuple3((index + 1), (acc._2 :+ newBalance), (acc._3 + newBalance))
843843 }
844844
845845 let result = {
846846 let $l = balances_
847847 let $s = size($l)
848848 let $acc0 = $Tuple3(0, nil, 0)
849849 func $f0_1 ($a,$i) = if (($i >= $s))
850850 then $a
851851 else foldFunc($a, $l[$i])
852852
853853 func $f0_2 ($a,$i) = if (($i >= $s))
854854 then $a
855855 else throw("List size exceeds 10")
856856
857857 $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)
858858 }
859859 $Tuple2(result._2, result._3)
860860 }
861861
862862
863863 func _incrementBalancesByPayments (balances_,payments_,assets_,decimals_,err_) = {
864864 func foldFunc (acc,elem) = {
865865 let index = acc._1
866866 let payment = payments_[index]
867867 let paymentAssetStr = _assetToStr(payment.assetId)
868868 let err = if ((paymentAssetStr != assets_[index]))
869869 then throw(((err_ + ": index=") + toString(index)))
870870 else unit
871871 if ((err == err))
872872 then {
873873 let assetDecimals = _getDecimals(paymentAssetStr)
874874 let newBalance = (elem + _normalizeDecimals(payments_[index].amount, assetDecimals, decimals_, DOWN))
875875 $Tuple3((index + 1), (acc._2 :+ newBalance), (acc._3 + newBalance))
876876 }
877877 else throw("Strict value is not equal to itself.")
878878 }
879879
880880 let result = {
881881 let $l = balances_
882882 let $s = size($l)
883883 let $acc0 = $Tuple3(0, nil, 0)
884884 func $f0_1 ($a,$i) = if (($i >= $s))
885885 then $a
886886 else foldFunc($a, $l[$i])
887887
888888 func $f0_2 ($a,$i) = if (($i >= $s))
889889 then $a
890890 else throw("List size exceeds 10")
891891
892892 $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)
893893 }
894894 $Tuple2(result._2, result._3)
895895 }
896896
897897
898898 func _incrementBalanceByIndex (balances_,index_,amount_) = {
899899 func foldFunc (acc,elem) = {
900900 let index = acc._1
901901 if ((index == index_))
902902 then $Tuple2((index + 1), (acc._2 :+ (elem + amount_)))
903903 else $Tuple2((index + 1), (acc._2 :+ elem))
904904 }
905905
906906 let result = {
907907 let $l = balances_
908908 let $s = size($l)
909909 let $acc0 = $Tuple2(0, nil)
910910 func $f0_1 ($a,$i) = if (($i >= $s))
911911 then $a
912912 else foldFunc($a, $l[$i])
913913
914914 func $f0_2 ($a,$i) = if (($i >= $s))
915915 then $a
916916 else throw("List size exceeds 10")
917917
918918 $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)
919919 }
920920 result._2
921921 }
922922
923923
924924 func _decrementBalanceByIndex (balances_,index_,amount_) = {
925925 func foldFunc (acc,elem) = {
926926 let index = acc._1
927927 if (if ((index == index_))
928928 then (amount_ > elem)
929929 else false)
930930 then throw("insufficient balance")
931931 else if (if ((index == index_))
932932 then (elem >= amount_)
933933 else false)
934934 then $Tuple2((index + 1), (acc._2 :+ (elem - amount_)))
935935 else $Tuple2((index + 1), (acc._2 :+ elem))
936936 }
937937
938938 let result = {
939939 let $l = balances_
940940 let $s = size($l)
941941 let $acc0 = $Tuple2(0, nil)
942942 func $f0_1 ($a,$i) = if (($i >= $s))
943943 then $a
944944 else foldFunc($a, $l[$i])
945945
946946 func $f0_2 ($a,$i) = if (($i >= $s))
947947 then $a
948948 else throw("List size exceeds 10")
949949
950950 $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)
951951 }
952952 result._2
953953 }
954954
955955
956956 func _decrementBalancesByLpAmount (balances_,amount_,lpTotalSupply_) = {
957957 let rate = fraction((lpTotalSupply_ - amount_), RATE_FACTOR, lpTotalSupply_, CEILING)
958958 func foldFunc (acc,elem) = {
959959 let newBalance = fraction(elem, rate, RATE_FACTOR, CEILING)
960960 let deltaBalance = (elem - newBalance)
961961 if ((0 > deltaBalance))
962962 then throw("insufficient delta balance")
963963 else $Tuple3((acc._1 :+ newBalance), (acc._2 + newBalance), (acc._3 :+ deltaBalance))
964964 }
965965
966966 let $l = balances_
967967 let $s = size($l)
968968 let $acc0 = $Tuple3(nil, 0, nil)
969969 func $f0_1 ($a,$i) = if (($i >= $s))
970970 then $a
971971 else foldFunc($a, $l[$i])
972972
973973 func $f0_2 ($a,$i) = if (($i >= $s))
974974 then $a
975975 else throw("List size exceeds 10")
976976
977977 $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)
978978 }
979979
980980
981981 func _getPaymentsFromBalances (assets_,balances_,recipient_,sourceDecimals_) = {
982982 func foldFunc (acc,elem) = {
983983 let index = acc._1
984984 $Tuple2((index + 1), (acc._2 :+ ScriptTransfer(recipient_, _normalizeDecimals(balances_[index], sourceDecimals_, _getDecimals(elem), DOWN), _strToAsset(elem))))
985985 }
986986
987987 let result = {
988988 let $l = assets_
989989 let $s = size($l)
990990 let $acc0 = $Tuple2(0, nil)
991991 func $f0_1 ($a,$i) = if (($i >= $s))
992992 then $a
993993 else foldFunc($a, $l[$i])
994994
995995 func $f0_2 ($a,$i) = if (($i >= $s))
996996 then $a
997997 else throw("List size exceeds 10")
998998
999999 $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)
10001000 }
10011001 result._2
10021002 }
10031003
10041004
10051005 func _calculateMinusFee (balance_,equilibrium_,lpAmount_,weightAmplifier_,disbalanceCoeff_) = {
10061006 let threshold = fraction(equilibrium_, (MAX_WEIGHT_AMPLIFIER - weightAmplifier_), MAX_WEIGHT_AMPLIFIER)
10071007 if ((balance_ > threshold))
10081008 then 0
10091009 else toInt(fraction(fraction(toBigInt(lpAmount_), toBigInt(disbalanceCoeff_), DISBAlANCE_COEFF_FACTOR), toBigInt((threshold - balance_)), toBigInt(threshold), CEILING))
10101010 }
10111011
10121012
10131013 func _calculateMinusFeeDelta (balanceBefore_,balanceAfter_,equilibrium_,lpAmount_,weightAmplifier_,disbalanceCoeff_) = if ((balanceAfter_ > balanceBefore_))
10141014 then 0
10151015 else (_calculateMinusFee(balanceAfter_, equilibrium_, lpAmount_, weightAmplifier_, disbalanceCoeff_) - _calculateMinusFee(balanceBefore_, equilibrium_, lpAmount_, weightAmplifier_, disbalanceCoeff_))
10161016
10171017
10181018 func _calculatePlusFee (balance_,equilibrium_,rewardBalance_,weightAmplifier_) = {
10191019 let threshold = fraction(equilibrium_, (MAX_WEIGHT_AMPLIFIER - weightAmplifier_), MAX_WEIGHT_AMPLIFIER)
10201020 let disbalanceReward = fraction(rewardBalance_, threshold, equilibrium_)
10211021 if ((balance_ > threshold))
10221022 then disbalanceReward
10231023 else fraction(disbalanceReward, balance_, threshold, FLOOR)
10241024 }
10251025
10261026
10271027 func _calculatePlusFeeDelta (balanceBefore_,balanceAfter_,equilibrium_,rewardBalance_,weightAmplifier_) = if ((balanceBefore_ > balanceAfter_))
10281028 then 0
10291029 else (_calculatePlusFee(balanceAfter_, equilibrium_, rewardBalance_, weightAmplifier_) - _calculatePlusFee(balanceBefore_, equilibrium_, rewardBalance_, weightAmplifier_))
10301030
10311031
10321032 func _feeCompensation (rewardBalance_,fee_) = if ((fee_ > rewardBalance_))
10331033 then rewardBalance_
10341034 else fee_
10351035
10361036
10371037 func _validateAllocation (assetBalances_,rewardBalances_) = {
10381038 let maxIndex = size(assetBalances_)
10391039 func foldFunc (acc,index) = if ((index >= maxIndex))
10401040 then acc
10411041 else if ((0 > assetBalances_[index]))
10421042 then throw("_validateAllocation: negative assetBalances")
10431043 else if ((0 > rewardBalances_[index]))
10441044 then throw("_validateAllocation: negative rewardBalances")
10451045 else acc
10461046
10471047 let $l = INDEX_LIST
10481048 let $s = size($l)
10491049 let $acc0 = true
10501050 func $f0_1 ($a,$i) = if (($i >= $s))
10511051 then $a
10521052 else foldFunc($a, $l[$i])
10531053
10541054 func $f0_2 ($a,$i) = if (($i >= $s))
10551055 then $a
10561056 else throw("List size exceeds 10")
10571057
10581058 $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)
10591059 }
10601060
10611061
10621062 func _checkpoint (user_) = {
10631063 let userLp = _loadUserLp(user_)
10641064 let userProfits = _loadUserProfits(user_)
10651065 let sigmaFeePerLp = _loadSigmaFeePerLp()
10661066 let userSigmaFeePerLp = _loadUserSigmaFeePerLp(user_)
10671067 func foldFunc (acc,elem) = {
10681068 let index = acc._1
10691069 let profitUpdated = (userProfits[index] + toInt(fraction(toBigInt(userLp), (sigmaFeePerLp[index] - userSigmaFeePerLp[index]), PERCENT_FACTOR)))
10701070 $Tuple2((index + 1), (acc._2 :+ profitUpdated))
10711071 }
10721072
10731073 let $t02270022773 = {
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 }
10871087 let idx = $t02270022773._1
10881088 let profitsUpdated = $t02270022773._2
10891089 $Tuple2((_saveUserProfits(user_, profitsUpdated) ++ _saveUserSigmaFeePerLp(user_, sigmaFeePerLp)), profitsUpdated)
10901090 }
10911091
10921092
10931093 func _updateSigmaFeePerLp (sigmaFeePerLp_,totalLp_,index_,lpFee_) = {
10941094 func foldFunc (acc,elem) = {
10951095 let index = acc._1
10961096 let sigmaFeePerLpUpdated = if ((index_ == index))
10971097 then (sigmaFeePerLp_[index] + fraction(toBigInt(lpFee_), PERCENT_FACTOR, toBigInt(totalLp_)))
10981098 else sigmaFeePerLp_[index]
10991099 $Tuple2((index + 1), (acc._2 :+ sigmaFeePerLpUpdated))
11001100 }
11011101
11021102 let $t02342323502 = {
11031103 let $l = ZERO_INT_LIST_11
11041104 let $s = size($l)
11051105 let $acc0 = $Tuple2(0, nil)
11061106 func $f0_1 ($a,$i) = if (($i >= $s))
11071107 then $a
11081108 else foldFunc($a, $l[$i])
11091109
11101110 func $f0_2 ($a,$i) = if (($i >= $s))
11111111 then $a
11121112 else throw("List size exceeds 11")
11131113
11141114 $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)
11151115 }
11161116 let idx = $t02342323502._1
11171117 let sigmaFeePerLpUpdated = $t02342323502._2
11181118 sigmaFeePerLpUpdated
11191119 }
11201120
11211121
11221122 func _calculateLpAndProtocolFees (assetIndex_,amount_,lpFeeRate_,protocolFeeRate_) = {
11231123 let sigmaFeePerLp = _loadSigmaFeePerLp()
11241124 let totalLp = _loadTotalLp()
11251125 let $t02372323998 = if ((totalLp == 0))
11261126 then $Tuple2(0, fraction(amount_, protocolFeeRate_, MAX_FEE))
11271127 else $Tuple2(fraction(amount_, lpFeeRate_, MAX_FEE), fraction(amount_, protocolFeeRate_, MAX_FEE))
11281128 let lpFee = $t02372323998._1
11291129 let protocolFee = $t02372323998._2
11301130 let sigmaFeePerLpUpdated = if ((lpFee == 0))
11311131 then sigmaFeePerLp
11321132 else _updateSigmaFeePerLp(sigmaFeePerLp, totalLp, assetIndex_, lpFee)
11331133 $Tuple3(lpFee, protocolFee, sigmaFeePerLpUpdated)
11341134 }
11351135
11361136
11371137 func _depositAll (amount_) = {
11381138 let storage = _loadStorage()
11391139 let lpTotalSupply = storage._3
11401140 let assets = _loadAssets()
11411141 let $t02440424457 = _loadAssetWeights()
11421142 let assetWeights = $t02440424457._1
11431143 let sigmaWeight = $t02440424457._2
11441144 let $t02446224530 = _loadAssetBalances()
11451145 let prevAssetBalances = $t02446224530._1
11461146 let prevAssetTotalSupply = $t02446224530._2
11471147 let $t02453625766 = if ((prevAssetTotalSupply == 0))
11481148 then {
11491149 func foldFunc (acc,elem) = {
11501150 let index = acc._1
11511151 let requiredAmountNormalized = fraction(assetWeights[index], amount_, sigmaWeight)
11521152 $Tuple2((index + 1), (acc._2 :+ requiredAmountNormalized))
11531153 }
11541154
11551155 let $t02497825052 = {
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 foldFunc($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 }
11691169 let idx = $t02497825052._1
11701170 let requiredAmountsNormalized = $t02497825052._2
11711171 $Tuple2(amount_, requiredAmountsNormalized)
11721172 }
11731173 else {
11741174 let ratio = fraction(toBigInt(amount_), PERCENT_FACTOR, toBigInt(prevAssetTotalSupply))
11751175 func foldFunc1 (acc,elem) = {
11761176 let index = acc._1
11771177 let requiredAmountNormalized = toInt(fraction(ratio, toBigInt(prevAssetBalances[index]), PERCENT_FACTOR))
11781178 $Tuple2((index + 1), (acc._2 :+ requiredAmountNormalized))
11791179 }
11801180
11811181 let $t02559525670 = {
11821182 let $l = assets
11831183 let $s = size($l)
11841184 let $acc0 = $Tuple2(0, nil)
11851185 func $f0_1 ($a,$i) = if (($i >= $s))
11861186 then $a
11871187 else foldFunc1($a, $l[$i])
11881188
11891189 func $f0_2 ($a,$i) = if (($i >= $s))
11901190 then $a
11911191 else throw("List size exceeds 10")
11921192
11931193 $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)
11941194 }
11951195 let idx = $t02559525670._1
11961196 let requiredAmountsNormalized = $t02559525670._2
11971197 $Tuple2(fraction(amount_, lpTotalSupply, prevAssetTotalSupply), requiredAmountsNormalized)
11981198 }
11991199 let lpTokensToMint = $t02453625766._1
12001200 let requiredAmountsNormalized = $t02453625766._2
12011201 let $t02577225885 = _incrementBalancesByAmounts(prevAssetBalances, requiredAmountsNormalized)
12021202 let assetBalances = $t02577225885._1
12031203 let assetTotalSupply = $t02577225885._2
12041204 $Tuple3(lpTokensToMint, requiredAmountsNormalized, assetBalances)
12051205 }
12061206
12071207
12081208 func _deposit (assetId_,amount_) = {
12091209 let storage = _loadStorage()
12101210 let lpTotalSupply = storage._3
12111211 let lpFeeRate = storage._4
12121212 let protocolFeeRate = storage._5
12131213 let maxAllocAmplifier = storage._6
12141214 let weightAmplifier = storage._7
12151215 let assets = _loadAssets()
12161216 let $t02625126304 = _loadAssetWeights()
12171217 let assetWeights = $t02625126304._1
12181218 let sigmaWeight = $t02625126304._2
12191219 let $t02630926377 = _loadAssetBalances()
12201220 let prevAssetBalances = $t02630926377._1
12211221 let prevAssetTotalSupply = $t02630926377._2
12221222 let prevRewardBalances = _loadRewardBalances()
12231223 let err = if (if ((prevAssetTotalSupply == 0))
12241224 then true
12251225 else (lpTotalSupply == 0))
12261226 then throw("_deposit: empty pool")
12271227 else true
12281228 if ((err == err))
12291229 then {
12301230 let sourceAssetIndex = value(indexOf(assets, assetId_))
12311231 let sourceEquilibrium = fraction(prevAssetTotalSupply, assetWeights[sourceAssetIndex], sigmaWeight)
12321232 let sourceBalanceBefore = prevAssetBalances[sourceAssetIndex]
12331233 let sourceRewardBalance = prevRewardBalances[sourceAssetIndex]
12341234 let sourcePlusFeeDelta = _calculatePlusFeeDelta(sourceBalanceBefore, (sourceBalanceBefore + amount_), sourceEquilibrium, sourceRewardBalance, weightAmplifier)
12351235 let lpTokensToMint = (amount_ + sourcePlusFeeDelta)
12361236 let $t02717727308 = _calculateLpAndProtocolFees(0, lpTokensToMint, (lpFeeRate / 2), (protocolFeeRate / 2))
12371237 let lpFee = $t02717727308._1
12381238 let protocolFee = $t02717727308._2
12391239 let sigmaFeePerLpUpdated = $t02717727308._3
12401240 let feeCompensation = _feeCompensation((sourceRewardBalance - sourcePlusFeeDelta), (lpFee + protocolFee))
12411241 let newRewardBalances = _decrementBalanceByIndex(prevRewardBalances, sourceAssetIndex, (sourcePlusFeeDelta + feeCompensation))
12421242 let newAssetBalances = _incrementBalanceByIndex(prevAssetBalances, sourceAssetIndex, (lpTokensToMint + feeCompensation))
12431243 let err1 = _validateAllocation(newAssetBalances, newRewardBalances)
12441244 if ((err1 == err1))
12451245 then $Tuple6((lpTokensToMint + feeCompensation), newAssetBalances, newRewardBalances, lpFee, protocolFee, sigmaFeePerLpUpdated)
12461246 else throw("Strict value is not equal to itself.")
12471247 }
12481248 else throw("Strict value is not equal to itself.")
12491249 }
12501250
12511251
12521252 func _withdrawAll (amount_) = {
12531253 let storage = _loadStorage()
12541254 let lpTotalSupply = storage._3
12551255 let $t02797628044 = _loadAssetBalances()
12561256 let prevAssetBalances = $t02797628044._1
12571257 let prevAssetTotalSupply = $t02797628044._2
12581258 let $t02804928102 = _loadAssetWeights()
12591259 let assetWeights = $t02804928102._1
12601260 let sigmaWeight = $t02804928102._2
12611261 let lpTokensToBurn = amount_
12621262 let err = _validateInt(lpTokensToBurn, 0, lpTotalSupply, "_withdrawAll: invalid lpTokensToBurn")
12631263 if ((err == err))
12641264 then {
12651265 let $t02824628379 = _decrementBalancesByLpAmount(prevAssetBalances, lpTokensToBurn, lpTotalSupply)
12661266 let assetBalances = $t02824628379._1
12671267 let assetTotalSupply = $t02824628379._2
12681268 let balancesToPay = $t02824628379._3
12691269 $Tuple3(lpTokensToBurn, balancesToPay, assetBalances)
12701270 }
12711271 else throw("Strict value is not equal to itself.")
12721272 }
12731273
12741274
12751275 func _withdraw (assetId_,lpAmount_) = {
12761276 let storage = _loadStorage()
12771277 let lpTotalSupply = storage._3
12781278 let lpFeeRate = storage._4
12791279 let protocolFeeRate = storage._5
12801280 let maxAllocAmplifier = storage._6
12811281 let weightAmplifier = storage._7
12821282 let disbalanceCoeff = storage._8
12831283 let assets = _loadAssets()
12841284 let $t02877328841 = _loadAssetBalances()
12851285 let prevAssetBalances = $t02877328841._1
12861286 let prevAssetTotalSupply = $t02877328841._2
12871287 let $t02884628899 = _loadAssetWeights()
12881288 let assetWeights = $t02884628899._1
12891289 let sigmaWeight = $t02884628899._2
12901290 let prevRewardBalances = _loadRewardBalances()
12911291 let targetAssetIndex = value(indexOf(assets, assetId_))
12921292 let targetBalanceBefore = prevAssetBalances[targetAssetIndex]
12931293 let targetEquilibrium = fraction(prevAssetTotalSupply, assetWeights[targetAssetIndex], sigmaWeight)
12941294 let targetRewardBalance = prevRewardBalances[targetAssetIndex]
12951295 let targetMinusFeeDelta = _calculateMinusFeeDelta(targetBalanceBefore, (targetBalanceBefore - lpAmount_), targetEquilibrium, prevAssetTotalSupply, weightAmplifier, disbalanceCoeff)
12961296 let rewardBalances = _incrementBalanceByIndex(prevRewardBalances, targetAssetIndex, targetMinusFeeDelta)
12971297 let assetBalances = _decrementBalanceByIndex(prevAssetBalances, targetAssetIndex, lpAmount_)
12981298 let targetAmount = (lpAmount_ - targetMinusFeeDelta)
12991299 let err = _validateAllocation(assetBalances, rewardBalances)
13001300 if ((err == err))
13011301 then {
13021302 let $t02988530033 = _calculateLpAndProtocolFees((targetAssetIndex + 1), targetAmount, (lpFeeRate / 2), (protocolFeeRate / 2))
13031303 let lpFee = $t02988530033._1
13041304 let protocolFee = $t02988530033._2
13051305 let sigmaFeePerLpUpdated = $t02988530033._3
13061306 $Tuple6(targetAmount, assetBalances, rewardBalances, lpFee, protocolFee, sigmaFeePerLpUpdated)
13071307 }
13081308 else throw("Strict value is not equal to itself.")
13091309 }
13101310
13111311
13121312 func _swap (sourceAssetIndex_,targetAssetIndex_,sourceAmount_) = {
13131313 let storage = _loadStorage()
13141314 let lpAssetId = storage._1
13151315 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
13161316 let lpTotalSupply = storage._3
13171317 let lpFeeRate = storage._4
13181318 let protocolFeeRate = storage._5
13191319 let maxAllocAmplifier = storage._6
13201320 let weightAmplifier = storage._7
13211321 let disbalanceCoeff = storage._8
13221322 let $t03056030628 = _loadAssetBalances()
13231323 let prevAssetBalances = $t03056030628._1
13241324 let prevAssetTotalSupply = $t03056030628._2
13251325 let $t03063330686 = _loadAssetWeights()
13261326 let assetWeights = $t03063330686._1
13271327 let sigmaWeight = $t03063330686._2
13281328 let prevRewardBalances = _loadRewardBalances()
13291329 let sourceEquilibrium = fraction(prevAssetTotalSupply, assetWeights[sourceAssetIndex_], sigmaWeight)
13301330 let sourceBalanceBefore = prevAssetBalances[sourceAssetIndex_]
13311331 let sourceRewardBalance = prevRewardBalances[sourceAssetIndex_]
13321332 let sourcePlusFeeDelta = _calculatePlusFeeDelta(sourceBalanceBefore, (sourceBalanceBefore + sourceAmount_), sourceEquilibrium, sourceRewardBalance, weightAmplifier)
13331333 let targetBalanceBefore = prevAssetBalances[targetAssetIndex_]
13341334 let targetEquilibrium = fraction(prevAssetTotalSupply, assetWeights[targetAssetIndex_], sigmaWeight)
13351335 let targetRewardBalance = prevRewardBalances[targetAssetIndex_]
13361336 let targetMinusFeeDelta = _calculateMinusFeeDelta(targetBalanceBefore, (targetBalanceBefore - sourceAmount_), targetEquilibrium, prevAssetTotalSupply, weightAmplifier, disbalanceCoeff)
13371337 let tempRewardBalances = _decrementBalanceByIndex(prevRewardBalances, sourceAssetIndex_, sourcePlusFeeDelta)
13381338 let newRewardBalances = _incrementBalanceByIndex(tempRewardBalances, targetAssetIndex_, targetMinusFeeDelta)
13391339 let tempAssetBalances = _incrementBalanceByIndex(prevAssetBalances, sourceAssetIndex_, (sourceAmount_ + sourcePlusFeeDelta))
13401340 let newAssetBalances = _decrementBalanceByIndex(tempAssetBalances, targetAssetIndex_, (sourceAmount_ + sourcePlusFeeDelta))
13411341 let targetAmount = ((sourceAmount_ + sourcePlusFeeDelta) - targetMinusFeeDelta)
13421342 let err = _validateAllocation(newAssetBalances, newRewardBalances)
13431343 if ((err == err))
13441344 then {
13451345 let $t03228232423 = _calculateLpAndProtocolFees((targetAssetIndex_ + 1), targetAmount, lpFeeRate, protocolFeeRate)
13461346 let lpFee = $t03228232423._1
13471347 let protocolFee = $t03228232423._2
13481348 let sigmaFeePerLpUpdated = $t03228232423._3
13491349 $Tuple6(targetAmount, newAssetBalances, newRewardBalances, lpFee, protocolFee, sigmaFeePerLpUpdated)
13501350 }
13511351 else throw("Strict value is not equal to itself.")
13521352 }
13531353
13541354
13551355 @Callable(i)
13561356 func init (assets_,assetWeights_,lpFeeRate_,protocolFeeRate_,lpTokenName_,lpTokenDescr_,lpTokenDecimals_,maxAllocationAmplifier_,weightAmplifier_,disbalanceCoeff_,feeMaxRate_,protocolFeeContract_,precision_,pauser_) = {
13571357 let err = if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (_onlyThisContract(i.caller))
13581358 then _whenNotInitialized()
13591359 else false)
13601360 then _whenMultisigSet()
13611361 else false)
13621362 then _validateAssets(assets_, "init: invalid assets")
13631363 else false)
13641364 then _validateIntList(assetWeights_, 1, MAX_WEIGHT, "init: invalid assetWeights")
13651365 else false)
13661366 then _validateIntEquals(size(assets_), size(assetWeights_), "init: invalid assetWeights size")
13671367 else false)
13681368 then _validateInt(lpFeeRate_, 0, MAX_FEE, "init: invalid lp fee")
13691369 else false)
13701370 then _validateInt(protocolFeeRate_, 0, MAX_FEE, "init: invalid protocol fee")
13711371 else false)
13721372 then _validateTokenName(lpTokenName_, "init: invalid name")
13731373 else false)
13741374 then _validateTokenDescr(lpTokenDescr_, "init: invalid descr")
13751375 else false)
13761376 then _validateDecimals(lpTokenDecimals_, "init: invalid decimals")
13771377 else false)
13781378 then _validateInt(maxAllocationAmplifier_, 0, MAX_AMPLIFIER, "init: invalid maxAllocationAmplifier")
13791379 else false)
13801380 then _validateInt(weightAmplifier_, 0, maxAllocationAmplifier_, "init: invalid weightAmplifier")
13811381 else false)
13821382 then _validateInt(disbalanceCoeff_, 0, MAX_INT, "init: invalid disbalanceCoeff")
13831383 else false)
13841384 then _validateInt(feeMaxRate_, 0, MAX_INT, "init: invalid feeMaxRate")
13851385 else false)
13861386 then _validateAddress(protocolFeeContract_, "init: invalid protocolFeeContract")
13871387 else false)
13881388 then _validateInt(precision_, 1, MAX_INT, "init: invalid precision")
13891389 else false)
13901390 then _validateAddress(pauser_, "init: invalid pauser")
13911391 else false
13921392 if ((err == err))
13931393 then {
13941394 let $t03431234381 = _prepareAssetWeights(assetWeights_)
13951395 let assetWeights = $t03431234381._1
13961396 let sigmaWeight = $t03431234381._2
13971397 let assetBalances = _prepareAssetBalances(assets_)
13981398 let issue = Issue(lpTokenName_, lpTokenDescr_, 0, lpTokenDecimals_, true)
13991399 let lpAssetId = calculateAssetId(issue)
14001400 let storageUpdated = $Tuple10(lpAssetId, true, 0, lpFeeRate_, protocolFeeRate_, maxAllocationAmplifier_, weightAmplifier_, disbalanceCoeff_, feeMaxRate_, addressFromStringValue(protocolFeeContract_))
14011401 $Tuple2((((((((([issue] ++ _saveStorage(storageUpdated)) ++ _saveAssets(assets_)) ++ _saveAssetBalances(assetBalances)) ++ _saveRewardBalances(assetBalances)) ++ _saveAssetWeights(assetWeights)) ++ _savePrecision(precision_)) ++ _saveSigmaFeePerLp(_loadSigmaFeePerLp())) ++ _savePauser(addressFromStringValue(pauser_))), unit)
14021402 }
14031403 else throw("Strict value is not equal to itself.")
14041404 }
14051405
14061406
14071407
14081408 @Callable(i)
14091409 func depositAll (amount_) = {
14101410 let err = if (if (_whenInitialized())
14111411 then _whenNotPaused()
14121412 else false)
14131413 then _validateInt(amount_, 0, MAX_INT, "depositAll: invalid amount")
14141414 else false
14151415 if ((err == err))
14161416 then {
14171417 let storage = _loadStorage()
14181418 let lpAssetId = storage._1
14191419 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
14201420 let assets = _loadAssets()
14211421 let $t03618036265 = _depositAll(amount_)
14221422 let lpTokensToMint = $t03618036265._1
14231423 let requiredAmountsNormalized = $t03618036265._2
14241424 let assetBalances = $t03618036265._3
14251425 func foldFunc (acc,elem) = {
14261426 let index = acc._1
14271427 let paymentAssetStr = _assetToStr(i.payments[index].assetId)
14281428 let paymentAssetDecimals = _getDecimals(paymentAssetStr)
14291429 let requiredAmountNormalized = requiredAmountsNormalized[index]
14301430 let requiredAmount = _normalizeDecimals(requiredAmountNormalized, lpDecimals, paymentAssetDecimals, CEILING)
14311431 let err1 = if ((paymentAssetStr != elem))
14321432 then throw(("depositAll: invalid payment: index=" + toString(index)))
14331433 else if ((0 >= requiredAmount))
14341434 then throw("depositAll: too little amount required")
14351435 else unit
14361436 if ((err1 == err1))
14371437 then {
14381438 let change = if ((i.payments[index].amount > requiredAmount))
14391439 then [ScriptTransfer(i.caller, (i.payments[index].amount - requiredAmount), i.payments[index].assetId)]
14401440 else if ((requiredAmount > i.payments[index].amount))
14411441 then throw(((("depositAll: insufficient payment, index=" + toString(index)) + ", required=") + toString(requiredAmount)))
14421442 else nil
14431443 $Tuple2((index + 1), (acc._2 ++ change))
14441444 }
14451445 else throw("Strict value is not equal to itself.")
14461446 }
14471447
14481448 let $t03740837470 = {
14491449 let $l = assets
14501450 let $s = size($l)
14511451 let $acc0 = $Tuple2(0, nil)
14521452 func $f0_1 ($a,$i) = if (($i >= $s))
14531453 then $a
14541454 else foldFunc($a, $l[$i])
14551455
14561456 func $f0_2 ($a,$i) = if (($i >= $s))
14571457 then $a
14581458 else throw("List size exceeds 10")
14591459
14601460 $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)
14611461 }
14621462 let idx = $t03740837470._1
14631463 let changeActions = $t03740837470._2
14641464 let storageUpdated = $Tuple10(storage._1, storage._2, (storage._3 + lpTokensToMint), storage._4, storage._5, storage._6, storage._7, storage._8, storage._9, storage._10)
14651465 $Tuple2(((([Reissue(lpAssetId, lpTokensToMint, true), ScriptTransfer(i.caller, lpTokensToMint, lpAssetId)] ++ _saveStorage(storageUpdated)) ++ _saveAssetBalances(assetBalances)) ++ changeActions), unit)
14661466 }
14671467 else throw("Strict value is not equal to itself.")
14681468 }
14691469
14701470
14711471
14721472 @Callable(i)
14731473 func deposit (minLpAmount_) = {
14741474 let err = _validateInt(minLpAmount_, 0, MAX_INT, "deposit: invalid min lp amount")
14751475 if ((err == err))
14761476 then {
14771477 let storage = _loadStorage()
14781478 let lpAssetId = storage._1
14791479 let lpAssetIdStr = _assetToStr(lpAssetId)
14801480 let lpDecimals = _getDecimals(lpAssetIdStr)
14811481 let err1 = if (if (if (if (if (_whenInitialized())
14821482 then _whenNotPaused()
14831483 else false)
14841484 then _checkWatchdog()
14851485 else false)
14861486 then _validateIntEquals(size(i.payments), 1, "deposit: invalid payments size")
14871487 else false)
14881488 then _validateListContains(_loadAssets(), _assetToStr(i.payments[0].assetId), "deposit: invalid payment asset")
14891489 else false)
14901490 then _validateInt(i.payments[0].amount, 1, MAX_INT, "deposit: invalid payment amount")
14911491 else false
14921492 if ((err1 == err1))
14931493 then {
14941494 let assetStr = _assetToStr(i.payments[0].assetId)
14951495 let assetDecimals = _getDecimals(assetStr)
14961496 let amountNormalized = _normalizeDecimals(i.payments[0].amount, assetDecimals, lpDecimals, DOWN)
14971497 let $t03891039042 = _deposit(assetStr, amountNormalized)
14981498 let lpTokensToMint = $t03891039042._1
14991499 let assetBalances = $t03891039042._2
15001500 let rewardBalances = $t03891039042._3
15011501 let lpFee = $t03891039042._4
15021502 let protocolFee = $t03891039042._5
15031503 let sigmaFeePerLpUpdated = $t03891039042._6
15041504 let lpTokensToSend = ((lpTokensToMint - lpFee) - protocolFee)
15051505 let err2 = _validateInt(lpTokensToSend, minLpAmount_, MAX_INT, "deposit: less than min")
15061506 if ((err2 == err2))
15071507 then {
15081508 let storageUpdated = $Tuple10(storage._1, storage._2, (storage._3 + lpTokensToMint), storage._4, storage._5, storage._6, storage._7, storage._8, storage._9, storage._10)
15091509 $Tuple2((((((([Reissue(lpAssetId, lpTokensToMint, true), ScriptTransfer(i.caller, lpTokensToSend, lpAssetId)] ++ _saveStorage(storageUpdated)) ++ _saveAssetBalances(assetBalances)) ++ _saveRewardBalances(rewardBalances)) ++ _saveLpFee(lpAssetIdStr, (lpFee + _loadLpFee(lpAssetIdStr)))) ++ _saveProtocolFee(lpAssetIdStr, (protocolFee + _loadProtocolFee(lpAssetIdStr)))) ++ _saveSigmaFeePerLp(sigmaFeePerLpUpdated)), unit)
15101510 }
15111511 else throw("Strict value is not equal to itself.")
15121512 }
15131513 else throw("Strict value is not equal to itself.")
15141514 }
15151515 else throw("Strict value is not equal to itself.")
15161516 }
15171517
15181518
15191519
15201520 @Callable(i)
15211521 func withdrawAll () = {
15221522 let storage = _loadStorage()
15231523 let lpAssetId = storage._1
15241524 let lpAssetIdStr = toBase58String(lpAssetId)
15251525 let lpDecimals = _getDecimals(lpAssetIdStr)
15261526 let assets = _loadAssets()
15271527 let err = if (if (if (_whenInitialized())
15281528 then _validateIntEquals(size(i.payments), 1, "withdrawAll: invalid payments size")
15291529 else false)
15301530 then _validateStringEqual(lpAssetIdStr, _assetToStr(i.payments[0].assetId), "withdrawAll: invalid payment asset")
15311531 else false)
15321532 then _validateInt(i.payments[0].amount, 1, MAX_INT, "withdrawAll: invalid payment amount")
15331533 else false
15341534 if ((err == err))
15351535 then {
15361536 let $t04055040637 = _withdrawAll(i.payments[0].amount)
15371537 let lpTokensToBurn = $t04055040637._1
15381538 let balancesToPay = $t04055040637._2
15391539 let assetBalances = $t04055040637._3
15401540 let paymentActions = _getPaymentsFromBalances(assets, balancesToPay, i.caller, lpDecimals)
15411541 let storageUpdated = $Tuple10(storage._1, storage._2, (storage._3 - lpTokensToBurn), storage._4, storage._5, storage._6, storage._7, storage._8, storage._9, storage._10)
15421542 $Tuple2(((([Burn(lpAssetId, lpTokensToBurn)] ++ paymentActions) ++ _saveStorage(storageUpdated)) ++ _saveAssetBalances(assetBalances)), unit)
15431543 }
15441544 else throw("Strict value is not equal to itself.")
15451545 }
15461546
15471547
15481548
15491549 @Callable(i)
15501550 func withdraw (assetId_,minAmount_) = {
15511551 let storage = _loadStorage()
15521552 let lpAssetId = storage._1
15531553 let lpAssetIdStr = toBase58String(lpAssetId)
15541554 let lpDecimals = _getDecimals(lpAssetIdStr)
15551555 let assets = _loadAssets()
15561556 let err = if (if (if (if (if (if (if (_whenInitialized())
15571557 then _whenNotPaused()
15581558 else false)
15591559 then _checkWatchdog()
15601560 else false)
15611561 then _validateIntEquals(size(i.payments), 1, "withdraw: invalid payments size")
15621562 else false)
15631563 then _validateStringEqual(lpAssetIdStr, _assetToStr(i.payments[0].assetId), "withdraw: invalid payment asset")
15641564 else false)
15651565 then _validateInt(i.payments[0].amount, 1, MAX_INT, "withdraw: invalid payment amount")
15661566 else false)
15671567 then _validateListContains(assets, assetId_, "withdraw: invalid assetId")
15681568 else false)
15691569 then _validateInt(minAmount_, 0, MAX_INT, "withdraw: invalid minAmount")
15701570 else false
15711571 if ((err == err))
15721572 then {
15731573 let $t04199142146 = _withdraw(assetId_, i.payments[0].amount)
15741574 let targetAmountNormalized = $t04199142146._1
15751575 let finalAssetBalances = $t04199142146._2
15761576 let finalRewardBalances = $t04199142146._3
15771577 let lpFee = $t04199142146._4
15781578 let protocolFee = $t04199142146._5
15791579 let sigmaFeePerLpUpdated = $t04199142146._6
15801580 let finalAmountNormalized = ((targetAmountNormalized - lpFee) - protocolFee)
15811581 let targetDecimals = _getDecimals(assetId_)
15821582 let finalAmount = _normalizeDecimals(finalAmountNormalized, lpDecimals, targetDecimals, DOWN)
15831583 let err1 = _validateInt(finalAmount, minAmount_, MAX_INT, "withdraw: less than min")
15841584 if ((err1 == err1))
15851585 then {
15861586 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)
15871587 $Tuple2((((((([Burn(lpAssetId, i.payments[0].amount), ScriptTransfer(i.caller, finalAmount, _strToAsset(assetId_))] ++ _saveStorage(storageUpdated)) ++ _saveAssetBalances(finalAssetBalances)) ++ _saveRewardBalances(finalRewardBalances)) ++ _saveLpFee(assetId_, (lpFee + _loadLpFee(assetId_)))) ++ _saveProtocolFee(assetId_, (protocolFee + _loadProtocolFee(assetId_)))) ++ _saveSigmaFeePerLp(sigmaFeePerLpUpdated)), unit)
15881588 }
15891589 else throw("Strict value is not equal to itself.")
15901590 }
15911591 else throw("Strict value is not equal to itself.")
15921592 }
15931593
15941594
15951595
15961596 @Callable(i)
15971597 func swap (targetAssetId_,minAmount_) = {
15981598 let storage = _loadStorage()
15991599 let lpAssetId = storage._1
16001600 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
16011601 let assets = _loadAssets()
16021602 let sourceAssetStr = _assetToStr(i.payments[0].assetId)
16031603 let sourceAmountNormalized = _normalizeDecimals(i.payments[0].amount, _getDecimals(sourceAssetStr), lpDecimals, DOWN)
16041604 let sourceAssetIndex = valueOrErrorMessage(indexOf(assets, sourceAssetStr), "swap: invalid source asset")
16051605 if ((sourceAssetIndex == sourceAssetIndex))
16061606 then {
16071607 let targetAssetIndex = valueOrErrorMessage(indexOf(assets, targetAssetId_), "swap: invalid target asset")
16081608 if ((targetAssetIndex == targetAssetIndex))
16091609 then {
16101610 let err = if (if (if (if (if (if (_whenInitialized())
16111611 then _whenNotPaused()
16121612 else false)
16131613 then _checkWatchdog()
16141614 else false)
16151615 then _validateInt(minAmount_, 0, MAX_INT, "swap: invalid min target amount")
16161616 else false)
16171617 then _validateInt(sourceAmountNormalized, 1, MAX_INT, "swap: invalid source amount")
16181618 else false)
16191619 then _validateStringNotEq(sourceAssetStr, targetAssetId_, "swap: same assets")
16201620 else false)
16211621 then _validateIntEquals(size(i.payments), 1, "swap: invalid payments size")
16221622 else false
16231623 if ((err == err))
16241624 then {
16251625 let $t04431144490 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
16261626 let targetAmountNormalized = $t04431144490._1
16271627 let finalAssetBalances = $t04431144490._2
16281628 let finalRewardBalances = $t04431144490._3
16291629 let lpFee = $t04431144490._4
16301630 let protocolFee = $t04431144490._5
16311631 let sigmaFeePerLpUpdated = $t04431144490._6
16321632 let finalAmountNormalized = ((targetAmountNormalized - lpFee) - protocolFee)
16331633 let targetDecimals = _getDecimals(targetAssetId_)
16341634 let finalAmount = _normalizeDecimals(finalAmountNormalized, lpDecimals, targetDecimals, DOWN)
16351635 let err1 = _validateInt(finalAmount, minAmount_, MAX_INT, "swap: less than min")
16361636 if ((err1 == err1))
16371637 then $Tuple2(((((([ScriptTransfer(i.caller, finalAmount, _strToAsset(targetAssetId_))] ++ _saveAssetBalances(finalAssetBalances)) ++ _saveRewardBalances(finalRewardBalances)) ++ _saveLpFee(targetAssetId_, (lpFee + _loadLpFee(targetAssetId_)))) ++ _saveProtocolFee(targetAssetId_, (protocolFee + _loadProtocolFee(targetAssetId_)))) ++ _saveSigmaFeePerLp(sigmaFeePerLpUpdated)), unit)
16381638 else throw("Strict value is not equal to itself.")
16391639 }
16401640 else throw("Strict value is not equal to itself.")
16411641 }
16421642 else throw("Strict value is not equal to itself.")
16431643 }
16441644 else throw("Strict value is not equal to itself.")
16451645 }
16461646
16471647
16481648
16491649 @Callable(i)
16501650 func getDepositAll (lpAmount_) = {
16511651 let err = _validateInt(lpAmount_, 1, MAX_INT, "getDepositAll: invalid amount")
16521652 if ((err == err))
16531653 then {
16541654 let $t04566245749 = _depositAll(lpAmount_)
16551655 let lpTokensToMint = $t04566245749._1
16561656 let requiredAmountsNormalized = $t04566245749._2
16571657 let assetBalances = $t04566245749._3
16581658 $Tuple2(nil, $Tuple2(lpTokensToMint, requiredAmountsNormalized))
16591659 }
16601660 else throw("Strict value is not equal to itself.")
16611661 }
16621662
16631663
16641664
16651665 @Callable(i)
16661666 func getDeposit (assetId_,amount_) = {
16671667 let err = if (_validateListContains(_loadAssets(), assetId_, "getDeposit: invalid asset"))
16681668 then _validateInt(amount_, 1, MAX_INT, "getDeposit: invalid amount")
16691669 else false
16701670 if ((err == err))
16711671 then {
16721672 let storage = _loadStorage()
16731673 let lpAssetId = storage._1
16741674 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
16751675 let assetDecimals = _getDecimals(assetId_)
16761676 let amountNormalized = _normalizeDecimals(amount_, assetDecimals, lpDecimals, DOWN)
16771677 let $t04650846640 = _deposit(assetId_, amountNormalized)
16781678 let lpTokensToMint = $t04650846640._1
16791679 let assetBalances = $t04650846640._2
16801680 let rewardBalances = $t04650846640._3
16811681 let lpFee = $t04650846640._4
16821682 let protocolFee = $t04650846640._5
16831683 let sigmaFeePerLpUpdated = $t04650846640._6
16841684 let lpTokensToSend = ((lpTokensToMint - lpFee) - protocolFee)
16851685 $Tuple2(nil, lpTokensToSend)
16861686 }
16871687 else throw("Strict value is not equal to itself.")
16881688 }
16891689
16901690
16911691
16921692 @Callable(i)
16931693 func getWithdrawAll (lpAmount_) = {
16941694 let err = _validateInt(lpAmount_, 0, MAX_INT, "getWithdrawAll: invalid amount")
16951695 if ((err == err))
16961696 then {
16971697 let $t04707947155 = _withdrawAll(lpAmount_)
16981698 let lpTokensToBurn = $t04707947155._1
16991699 let balancesToGet = $t04707947155._2
17001700 let assetBalances = $t04707947155._3
17011701 $Tuple2(nil, balancesToGet)
17021702 }
17031703 else throw("Strict value is not equal to itself.")
17041704 }
17051705
17061706
17071707
17081708 @Callable(i)
17091709 func getWithdraw (assetId_,amount_) = {
17101710 let err = if (_validateListContains(_loadAssets(), assetId_, "getWithdraw: invalid asset"))
17111711 then _validateInt(amount_, 1, MAX_INT, "getWithdraw: invalid amount")
17121712 else false
17131713 if ((err == err))
17141714 then {
17151715 let storage = _loadStorage()
17161716 let lpAssetId = storage._1
17171717 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
17181718 let $t04780647938 = _withdraw(assetId_, amount_)
17191719 let targetAmountNormalized = $t04780647938._1
17201720 let assetBalances = $t04780647938._2
17211721 let rewardBalances = $t04780647938._3
17221722 let lpFee = $t04780647938._4
17231723 let protocolFee = $t04780647938._5
17241724 let sigmaFeePerLpUpdated = $t04780647938._6
17251725 let finalAmountNormalized = ((targetAmountNormalized - lpFee) - protocolFee)
17261726 let targetDecimals = _getDecimals(assetId_)
17271727 let finalAmount = _normalizeDecimals(finalAmountNormalized, lpDecimals, targetDecimals, DOWN)
17281728 $Tuple2(nil, finalAmount)
17291729 }
17301730 else throw("Strict value is not equal to itself.")
17311731 }
17321732
17331733
17341734
17351735 @Callable(i)
17361736 func getSwap (sourceAssetId_,targetAssetId_,sourceAmount_) = {
17371737 let storage = _loadStorage()
17381738 let lpAssetId = storage._1
17391739 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
17401740 let assets = _loadAssets()
17411741 let sourceAssetIndex = valueOrErrorMessage(indexOf(assets, sourceAssetId_), "swap: invalid source asset")
17421742 if ((sourceAssetIndex == sourceAssetIndex))
17431743 then {
17441744 let targetAssetIndex = valueOrErrorMessage(indexOf(assets, targetAssetId_), "swap: invalid target asset")
17451745 if ((targetAssetIndex == targetAssetIndex))
17461746 then {
17471747 let sourceAmountNormalized = _normalizeDecimals(sourceAmount_, _getDecimals(sourceAssetId_), lpDecimals, DOWN)
17481748 let err = if (_validateInt(sourceAmountNormalized, 1, MAX_INT, "swap: invalid source amount"))
17491749 then _validateStringNotEq(sourceAssetId_, targetAssetId_, "swap: same assets")
17501750 else false
17511751 if ((err == err))
17521752 then {
17531753 let $t04934849527 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
17541754 let targetAmountNormalized = $t04934849527._1
17551755 let finalAssetBalances = $t04934849527._2
17561756 let finalRewardBalances = $t04934849527._3
17571757 let lpFee = $t04934849527._4
17581758 let protocolFee = $t04934849527._5
17591759 let sigmaFeePerLpUpdated = $t04934849527._6
17601760 let finalAmountNormalized = ((targetAmountNormalized - lpFee) - protocolFee)
17611761 let targetDecimals = _getDecimals(targetAssetId_)
17621762 let finalAmount = _normalizeDecimals(finalAmountNormalized, lpDecimals, targetDecimals, DOWN)
17631763 $Tuple2(nil, finalAmount)
17641764 }
17651765 else throw("Strict value is not equal to itself.")
17661766 }
17671767 else throw("Strict value is not equal to itself.")
17681768 }
17691769 else throw("Strict value is not equal to itself.")
17701770 }
17711771
17721772
17731773
17741774 @Callable(i)
17751775 func getClaim (user_) = {
17761776 let user = if ((size(user_) > 0))
17771777 then valueOrErrorMessage(addressFromString(user_), "getClaim: invalid user")
17781778 else i.caller
17791779 let $t05016950225 = _checkpoint(user)
17801780 let checkpointActions = $t05016950225._1
17811781 let userProfits = $t05016950225._2
17821782 $Tuple2(nil, userProfits)
17831783 }
17841784
17851785
17861786
17871787 @Callable(i)
17881788 func getAssetId () = {
17891789 let storage = _loadStorage()
17901790 let lpAssetId = storage._1
17911791 $Tuple2(nil, toBase58String(lpAssetId))
17921792 }
17931793
17941794
17951795
17961796 @Callable(i)
17971797 func getDecimals () = {
17981798 let storage = _loadStorage()
17991799 let lpAssetId = storage._1
18001800 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
18011801 $Tuple2(nil, lpDecimals)
18021802 }
18031803
18041804
18051805
18061806 @Callable(i)
18071807 func checkpoint (user_) = {
18081808 let err = if (_whenInitialized())
18091809 then _whenNotPaused()
18101810 else false
18111811 if ((err == err))
18121812 then {
18131813 let user = if ((size(user_) > 0))
18141814 then valueOrErrorMessage(addressFromString(user_), "checkpoint: invalid user")
18151815 else i.caller
18161816 _checkpoint(user)
18171817 }
18181818 else throw("Strict value is not equal to itself.")
18191819 }
18201820
18211821
18221822
18231823 @Callable(i)
18241824 func stake () = {
18251825 let err = if (_whenInitialized())
18261826 then _whenNotPaused()
18271827 else false
18281828 if ((err == err))
18291829 then {
18301830 let storage = _loadStorage()
18311831 let lpAssetIdStr = _assetToStr(storage._1)
18321832 let err1 = if (if (_validateIntEquals(size(i.payments), 1, "stake: invalid payments size"))
18331833 then _validateStringEqual(lpAssetIdStr, _assetToStr(i.payments[0].assetId), "stake: invalid payment asset")
18341834 else false)
18351835 then _validateInt(i.payments[0].amount, 0, MAX_INT, "stake: invalid payment amount")
18361836 else false
18371837 if ((err1 == err1))
18381838 then {
18391839 let $t05143751497 = _checkpoint(i.caller)
18401840 let checkpointActions = $t05143751497._1
18411841 let userProfits = $t05143751497._2
18421842 $Tuple2(((checkpointActions ++ _saveUserLp(i.caller, (_loadUserLp(i.caller) + i.payments[0].amount))) ++ _saveTotalLp((_loadTotalLp() + i.payments[0].amount))), unit)
18431843 }
18441844 else throw("Strict value is not equal to itself.")
18451845 }
18461846 else throw("Strict value is not equal to itself.")
18471847 }
18481848
18491849
18501850
18511851 @Callable(i)
18521852 func unstake (amount_) = {
18531853 let err = if (_whenInitialized())
18541854 then _whenNotPaused()
18551855 else false
18561856 if ((err == err))
18571857 then {
18581858 let storage = _loadStorage()
18591859 let lpAssetId = storage._1
18601860 let userLp = _loadUserLp(i.caller)
18611861 let err1 = _validateInt(amount_, 0, userLp, "unstake: invalid amount")
18621862 if ((err1 == err1))
18631863 then {
18641864 let $t05200852068 = _checkpoint(i.caller)
18651865 let checkpointActions = $t05200852068._1
18661866 let userProfits = $t05200852068._2
18671867 $Tuple2(((([ScriptTransfer(i.caller, amount_, lpAssetId)] ++ checkpointActions) ++ _saveUserLp(i.caller, (userLp - amount_))) ++ _saveTotalLp((_loadTotalLp() - amount_))), unit)
18681868 }
18691869 else throw("Strict value is not equal to itself.")
18701870 }
18711871 else throw("Strict value is not equal to itself.")
18721872 }
18731873
18741874
18751875
18761876 @Callable(i)
18771877 func claim (user_) = {
18781878 let err = if (_whenInitialized())
18791879 then _whenNotPaused()
18801880 else false
18811881 if ((err == err))
18821882 then {
18831883 let user = if ((size(user_) > 0))
18841884 then valueOrErrorMessage(addressFromString(user_), "claim: invalid user")
18851885 else i.caller
18861886 let storage = _loadStorage()
18871887 let lpAssetId = storage._1
18881888 let lpAssetIdStr = _assetToStr(lpAssetId)
18891889 let assets = [lpAssetIdStr, _loadAssets()]
18901890 let maxIndex = (size(assets) - 1)
18911891 let $t05275652812 = _checkpoint(user)
18921892 let checkpointActions = $t05275652812._1
18931893 let userProfits = $t05275652812._2
18941894 func foldFunc (acc,profit) = {
18951895 let index = acc._1
18961896 if (if ((maxIndex >= index))
18971897 then (profit > 0)
18981898 else false)
18991899 then {
19001900 let asset = assets[index]
19011901 $Tuple3((index + 1), (acc._2 :+ 0), (acc._3 :+ ScriptTransfer(user, profit, _strToAsset(asset))))
19021902 }
19031903 else $Tuple3((index + 1), (acc._2 :+ profit), acc._3)
19041904 }
19051905
19061906 let $t05319053281 = {
19071907 let $l = userProfits
19081908 let $s = size($l)
19091909 let $acc0 = $Tuple3(0, nil, nil)
19101910 func $f0_1 ($a,$i) = if (($i >= $s))
19111911 then $a
19121912 else foldFunc($a, $l[$i])
19131913
19141914 func $f0_2 ($a,$i) = if (($i >= $s))
19151915 then $a
19161916 else throw("List size exceeds 11")
19171917
19181918 $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)
19191919 }
19201920 let idx = $t05319053281._1
19211921 let userProfitsUpdated = $t05319053281._2
19221922 let profitActions = $t05319053281._3
19231923 $Tuple2(((profitActions ++ removeByIndex(checkpointActions, 0)) ++ _saveUserProfits(user, userProfitsUpdated)), unit)
19241924 }
19251925 else throw("Strict value is not equal to itself.")
19261926 }
19271927
19281928
19291929
19301930 @Callable(i)
19311931 func claimAll (user_) = {
19321932 let err = if (_whenInitialized())
19331933 then _whenNotPaused()
19341934 else false
19351935 if ((err == err))
19361936 then {
19371937 let user = if ((size(user_) > 0))
19381938 then valueOrErrorMessage(addressFromString(user_), "claimAll: invalid user")
19391939 else i.caller
19401940 let storage = _loadStorage()
19411941 let lpAssetId = storage._1
19421942 let lpAssetIdStr = _assetToStr(lpAssetId)
19431943 let assets = [lpAssetIdStr, _loadAssets()]
19441944 let maxIndex = (size(assets) - 1)
19451945 let $t05391153971 = _loadAssetBalances()
19461946 let assetBalances = $t05391153971._1
19471947 let assetTotalSupply = $t05391153971._2
19481948 let $t05397754033 = _checkpoint(user)
19491949 let checkpointActions = $t05397754033._1
19501950 let userProfits = $t05397754033._2
19511951 func foldFunc (acc,profit) = {
19521952 let index = acc._1
19531953 if ((index == 0))
19541954 then $Tuple5((index + 1), (acc._2 :+ 0), acc._3, acc._4, (acc._5 + profit))
19551955 else if (if ((index > 0))
19561956 then (maxIndex >= index)
19571957 else false)
19581958 then {
19591959 let assetIndex = (index - 1)
19601960 let balance = assetBalances[assetIndex]
19611961 $Tuple5((index + 1), (acc._2 :+ 0), (acc._3 :+ (balance + profit)), (acc._4 + profit), acc._5)
19621962 }
19631963 else $Tuple5((index + 1), (acc._2 :+ 0), acc._3, acc._4, acc._5)
19641964 }
19651965
19661966 let $t05456954705 = {
19671967 let $l = userProfits
19681968 let $s = size($l)
19691969 let $acc0 = $Tuple5(0, nil, nil, 0, 0)
19701970 func $f0_1 ($a,$i) = if (($i >= $s))
19711971 then $a
19721972 else foldFunc($a, $l[$i])
19731973
19741974 func $f0_2 ($a,$i) = if (($i >= $s))
19751975 then $a
19761976 else throw("List size exceeds 11")
19771977
19781978 $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)
19791979 }
19801980 let idx = $t05456954705._1
19811981 let userProfitsUpdated = $t05456954705._2
19821982 let assetBalancesUpdated = $t05456954705._3
19831983 let lpTokensToMint = $t05456954705._4
19841984 let lpTokensProfit = $t05456954705._5
19851985 let storageUpdated = $Tuple10(storage._1, storage._2, (storage._3 + lpTokensToMint), storage._4, storage._5, storage._6, storage._7, storage._8, storage._9, storage._10)
1986- $Tuple2((((([Reissue(lpAssetId, lpTokensToMint, true), ScriptTransfer(i.caller, (lpTokensToMint + lpTokensProfit), lpAssetId)] ++ _saveStorage(storageUpdated)) ++ _saveAssetBalances(assetBalancesUpdated)) ++ removeByIndex(checkpointActions, 0)) ++ _saveUserProfits(user, userProfitsUpdated)), unit)
1986+ $Tuple2((((([Reissue(lpAssetId, lpTokensToMint, true), ScriptTransfer(user, (lpTokensToMint + lpTokensProfit), lpAssetId)] ++ _saveStorage(storageUpdated)) ++ _saveAssetBalances(assetBalancesUpdated)) ++ removeByIndex(checkpointActions, 0)) ++ _saveUserProfits(user, userProfitsUpdated)), unit)
19871987 }
19881988 else throw("Strict value is not equal to itself.")
19891989 }
19901990
19911991
19921992
19931993 @Callable(i)
19941994 func updatePoolFees (lpFeeRate_,protocolFeeRate_) = {
19951995 let err = if (if (if (_onlyThisContract(i.caller))
19961996 then _whenInitialized()
19971997 else false)
19981998 then _validateInt(lpFeeRate_, 0, MAX_FEE, "updatePoolFees: invalid lp fee")
19991999 else false)
20002000 then _validateInt(protocolFeeRate_, 0, MAX_FEE, "updatePoolFees: invalid protocol fee")
20012001 else false
20022002 if ((err == err))
20032003 then {
20042004 let storage = _loadStorage()
20052005 let storageUpdated = $Tuple10(storage._1, storage._2, storage._3, lpFeeRate_, protocolFeeRate_, storage._6, storage._7, storage._8, storage._9, storage._10)
20062006 $Tuple2(_saveStorage(storageUpdated), unit)
20072007 }
20082008 else throw("Strict value is not equal to itself.")
20092009 }
20102010
20112011
20122012
20132013 @Callable(i)
20142014 func updatePoolParams (maxAllocationAmplifier_,weightAmplifier_,disbalanceCoeff_,feeMaxRate_) = {
20152015 let err = if (if (if (if (if (_onlyThisContract(i.caller))
20162016 then _whenInitialized()
20172017 else false)
20182018 then _validateInt(maxAllocationAmplifier_, 0, MAX_AMPLIFIER, "updatePoolParams: invalid maxAllocationAmplifier")
20192019 else false)
20202020 then _validateInt(weightAmplifier_, 0, maxAllocationAmplifier_, "updatePoolParams: invalid weightAmplifier")
20212021 else false)
20222022 then _validateInt(disbalanceCoeff_, 0, MAX_INT, "updatePoolParams: invalid disbalanceCoeff")
20232023 else false)
20242024 then _validateInt(feeMaxRate_, 0, MAX_INT, "updatePoolParams: invalid feeMaxRate")
20252025 else false
20262026 if ((err == err))
20272027 then {
20282028 let storage = _loadStorage()
20292029 let storageUpdated = $Tuple10(storage._1, storage._2, storage._3, storage._4, storage._5, maxAllocationAmplifier_, weightAmplifier_, disbalanceCoeff_, feeMaxRate_, storage._10)
20302030 $Tuple2(_saveStorage(storageUpdated), unit)
20312031 }
20322032 else throw("Strict value is not equal to itself.")
20332033 }
20342034
20352035
20362036
20372037 @Callable(i)
20382038 func migrateBalances () = {
20392039 let err = if (_onlyThisContract(i.caller))
20402040 then _whenInitialized()
20412041 else false
20422042 if ((err == err))
20432043 then {
20442044 let storage = _loadStorage()
20452045 let lpTokenSupply = storage._3
2046- let $t05724057300 = _loadAssetBalances()
2047- let assetBalances = $t05724057300._1
2048- let assetTotalSupply = $t05724057300._2
2046+ let $t05723657296 = _loadAssetBalances()
2047+ let assetBalances = $t05723657296._1
2048+ let assetTotalSupply = $t05723657296._2
20492049 let balancesDiff = max([(assetTotalSupply - lpTokenSupply), 0])
20502050 let storageUpdated = $Tuple10(storage._1, storage._2, (lpTokenSupply + balancesDiff), storage._4, storage._5, storage._6, storage._7, storage._8, storage._9, storage._10)
20512051 $Tuple2(_saveStorage(storageUpdated), unit)
20522052 }
20532053 else throw("Strict value is not equal to itself.")
20542054 }
20552055
20562056
20572057
20582058 @Callable(i)
20592059 func pause () = {
20602060 let err = if (if (_onlyPauser(i.caller))
20612061 then _whenInitialized()
20622062 else false)
20632063 then _whenNotPaused()
20642064 else false
20652065 if ((err == err))
20662066 then $Tuple2(_savePause(true), unit)
20672067 else throw("Strict value is not equal to itself.")
20682068 }
20692069
20702070
20712071
20722072 @Callable(i)
20732073 func unpause () = {
20742074 let err = if (if (_onlyThisContract(i.caller))
20752075 then _whenInitialized()
20762076 else false)
20772077 then _whenPaused()
20782078 else false
20792079 if ((err == err))
20802080 then $Tuple2(_savePause(false), unit)
20812081 else throw("Strict value is not equal to itself.")
20822082 }
20832083
20842084
20852085
20862086 @Callable(i)
20872087 func updatePauser (pauser_) = {
20882088 let err = if (if (_onlyThisContract(i.caller))
20892089 then _whenInitialized()
20902090 else false)
20912091 then _validateAddress(pauser_, "updatePauser: invalid pauser")
20922092 else false
20932093 if ((err == err))
20942094 then $Tuple2(_savePauser(addressFromStringValue(pauser_)), unit)
20952095 else throw("Strict value is not equal to itself.")
20962096 }
20972097
20982098
20992099
21002100 @Callable(i)
21012101 func updateWatchdog (watchdog_,offset_) = {
21022102 let err = if (if (if (_onlyThisContract(i.caller))
21032103 then _whenInitialized()
21042104 else false)
21052105 then _validateAddress(watchdog_, "updateWatchdog: invalid watchdog")
21062106 else false)
21072107 then _validateInt(offset_, 0, MAX_INT, "updateWatchdog: invalid offset")
21082108 else false
21092109 if ((err == err))
21102110 then $Tuple2((_saveWatchdog(addressFromStringValue(watchdog_)) ++ _saveWatchdogOffset(offset_)), unit)
21112111 else throw("Strict value is not equal to itself.")
21122112 }
21132113
21142114
21152115
21162116 @Callable(i)
21172117 func setMultisig (multisig_) = {
21182118 let err = if (_onlyThisContract(i.caller))
21192119 then _validateAddress(multisig_, "setMultisig: invalid multisig")
21202120 else false
21212121 if ((err == err))
21222122 then $Tuple2(_saveMultisig(addressFromStringValue(multisig_)), unit)
21232123 else throw("Strict value is not equal to itself.")
21242124 }
21252125
21262126
21272127 @Verifier(tx)
21282128 func verify () = match getString(KEY_MULTISIG) {
21292129 case multisig: String =>
21302130 valueOrElse(getBoolean(addressFromStringValue(multisig), makeString([KEY_STATUS, toString(this), toBase58String(tx.id)], SEP)), false)
21312131 case _ =>
21322132 sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
21332133 }
21342134

github/deemru/w8io/3ef1775 
126.48 ms