tx · 3dhuSvHErDJWxEVQR76hrvJy5ZkkZNUQUm4uo7WE2PCd

3MsHk4t1vpYbvsDWWwj2cm8gqG7GERaviUF:  -0.06200000 Waves

2023.11.21 16:26 [2853212] smart account 3MsHk4t1vpYbvsDWWwj2cm8gqG7GERaviUF > SELF 0.00000000 Waves

{ "type": 13, "id": "3dhuSvHErDJWxEVQR76hrvJy5ZkkZNUQUm4uo7WE2PCd", "fee": 6200000, "feeAssetId": null, "timestamp": 1700573179574, "version": 2, "chainId": 84, "sender": "3MsHk4t1vpYbvsDWWwj2cm8gqG7GERaviUF", "senderPublicKey": "6sLckkgqPVBTaF1VsERJTmHJVcTFKGxiB1vwY6hUC2T7", "proofs": [ "2vxXWSEThj98CqxwrBCZWbmrRXvMtvv1oTLpgtJCuf5rusLPp4MV85ZXHarhwVvBLS5c41SQ7riLsC7YVtjibbQi" ], "script": "base64:BgJ3CAISEAoOGBgBAQgIAQEBAQEIAQgSAwoBARIDCgEBEgASBAoCCAESBAoCCAESAwoBARIECgIIARIDCgEBEgQKAggBEgUKAwgIARIDCgEIEgASABIDCgEIEgASAwoBARIDCgEIEgASABIDCgEIEgQKAggBEgMKAQh7AANTRVACAl9fAAVXQVZFUwIFd2F2ZXMAB01BWF9JTlQA//////////9/AAdNQVhfRkVFAMCEPQANTUFYX0FNUExJRklFUgDAhD0AFE1BWF9XRUlHSFRfQU1QTElGSUVSAMCEPQAKTUFYX1dFSUdIVADAhD0AFFNMSVBQQUdFX1JBVEVfRkFDVE9SAMCEPQAPRkVFX1JBVEVfRkFDVE9SAMCEPQALUkFURV9GQUNUT1IAwIQ9AA5QRVJDRU5UX0ZBQ1RPUgkAtgIBAICAkLu61q3wDQAQWkVST19JTlRfTElTVF8xMAkAzAgCAAAJAMwIAgAACQDMCAIAAAkAzAgCAAAJAMwIAgAACQDMCAIAAAkAzAgCAAAJAMwIAgAACQDMCAIAAAkAzAgCAAAFA25pbAAQWkVST19JTlRfTElTVF8xMQkAzQgCBRBaRVJPX0lOVF9MSVNUXzEwAAAAC1pFUk9fQklHSU5UCQC2AgEAAAATWkVST19CSUdJTlRfTElTVF8xMQkAzAgCBQtaRVJPX0JJR0lOVAkAzAgCBQtaRVJPX0JJR0lOVAkAzAgCBQtaRVJPX0JJR0lOVAkAzAgCBQtaRVJPX0JJR0lOVAkAzAgCBQtaRVJPX0JJR0lOVAkAzAgCBQtaRVJPX0JJR0lOVAkAzAgCBQtaRVJPX0JJR0lOVAkAzAgCBQtaRVJPX0JJR0lOVAkAzAgCBQtaRVJPX0JJR0lOVAkAzAgCBQtaRVJPX0JJR0lOVAkAzAgCBQtaRVJPX0JJR0lOVAUDbmlsAAxJTlRfREVDSU1BTFMACAAPQklHSU5UX0RFQ0lNQUxTABIAB0xJU1RfNjQJAL0JAgJ/MF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMAIBXwAMS0VZX01VTFRJU0lHAghNVUxUSVNJRwAKS0VZX1NUQVRVUwIGU1RBVFVTAApLRVlfUEFVU0VEAgZQQVVTRUQACktFWV9QQVVTRVICBlBBVVNFUgALS0VZX1NUT1JBR0UCB1NUT1JBR0UACktFWV9BU1NFVFMCBkFTU0VUUwASS0VZX0FTU0VUX0JBTEFOQ0VTAg5BU1NFVF9CQUxBTkNFUwARS0VZX0FTU0VUX1dFSUdIVFMCDUFTU0VUX1dFSUdIVFMACktFWV9MUF9GRUUCBkxQX0ZFRQAQS0VZX1BST1RPQ09MX0ZFRQIMUFJPVE9DT0xfRkVFAA1LRVlfUFJFQ0lTSU9OAglQUkVDSVNJT04AFEtFWV9TSUdNQV9GRUVfUEVSX0xQAhBTSUdNQV9GRUVfUEVSX0xQABlLRVlfVVNFUl9TSUdNQV9GRUVfUEVSX0xQAhVVU0VSX1NJR01BX0ZFRV9QRVJfTFAAC0tFWV9VU0VSX0xQAgdVU0VSX0xQAAxLRVlfVE9UQUxfTFACCFRPVEFMX0xQABBLRVlfVVNFUl9QUk9GSVRTAgxVU0VSX1BST0ZJVFMADEtFWV9XQVRDSERPRwIIV0FUQ0hET0cAE0tFWV9XQVRDSERPR19PRkZTRVQCD1dBVENIRE9HX09GRlNFVAATS0VZX1dBVENIRE9HX0hFSUdIVAIPV0FUQ0hET0dfSEVJR0hUARBfdmFsaWRhdGVBZGRyZXNzAghhZGRyZXNzXwRlcnJfBAckbWF0Y2gwCQCmCAEFCGFkZHJlc3NfAwkAAQIFByRtYXRjaDACB0FkZHJlc3MEAWEFByRtYXRjaDAGCQACAQUEZXJyXwEOX3ZhbGlkYXRlQXNzZXQCCGFzc2V0SWRfBGVycl8DCQAAAgUIYXNzZXRJZF8FBVdBVkVTBgQHJG1hdGNoMAkA7AcBCQDZBAEFCGFzc2V0SWRfAwkAAQIFByRtYXRjaDACBUFzc2V0BAFhBQckbWF0Y2gwBgkAAgEFBGVycl8BDF92YWxpZGF0ZUludAQEdmFsXw5sb3dlckJvdW5kYXJ5Xw51cHBlckJvdW5kYXJ5XwRlcnJfAwMJAGYCBQ5sb3dlckJvdW5kYXJ5XwUEdmFsXwYJAGYCBQR2YWxfBQ51cHBlckJvdW5kYXJ5XwkAAgEFBGVycl8GAQ1fdmFsaWRhdGVCb29sAwR2YWxfB3RhcmdldF8EZXJyXwMJAQIhPQIFBHZhbF8FB3RhcmdldF8JAAIBBQRlcnJfBgEUX3ZhbGlkYXRlU3RyaW5nRXF1YWwDBXZhbDFfBXZhbDJfBGVycl8DCQECIT0CBQV2YWwxXwUFdmFsMl8JAAIBBQRlcnJfBgEUX3ZhbGlkYXRlU3RyaW5nTm90RXEDBXZhbDFfBXZhbDJfBGVycl8DCQAAAgUFdmFsMV8FBXZhbDJfCQACAQUEZXJyXwYBEF92YWxpZGF0ZUludExpc3QEBHZhbF8ObG93ZXJCb3VuZGFyeV8OdXBwZXJCb3VuZGFyeV8EZXJyXwoBCGZvbGRGdW5jAgNhY2MEZWxlbQQHJG1hdGNoMAkAtgkBBQRlbGVtAwkAAQIFByRtYXRjaDACA0ludAQBYQUHJG1hdGNoMAMFA2FjYwkBDF92YWxpZGF0ZUludAQFAWEFDmxvd2VyQm91bmRhcnlfBQ51cHBlckJvdW5kYXJ5XwUEZXJyXwcJAAIBBQRlcnJfCgACJGwFBHZhbF8KAAIkcwkAkAMBBQIkbAoABSRhY2MwBgoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEIZm9sZEZ1bmMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoBD192YWxpZGF0ZUFzc2V0cwIHYXNzZXRzXwRlcnJfCgEIZm9sZEZ1bmMCA2FjYwRlbGVtAwUDYWNjCQEOX3ZhbGlkYXRlQXNzZXQCBQRlbGVtBQRlcnJfBwoAAiRsBQdhc3NldHNfCgACJHMJAJADAQUCJGwKAAUkYWNjMAYKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCGZvbGRGdW5jAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKARJfdmFsaWRhdGVJbnRFcXVhbHMDBXZhbDFfBXZhbDJfBGVycl8DCQECIT0CBQV2YWwxXwUFdmFsMl8JAAIBBQRlcnJfBgESX3ZhbGlkYXRlVG9rZW5OYW1lAgR2YWxfBGVycl8DAwkAZgIABAkAsQIBBQR2YWxfBgkAZgIJALECAQUEdmFsXwAQCQACAQUEZXJyXwYBE192YWxpZGF0ZVRva2VuRGVzY3ICBHZhbF8EZXJyXwMJAGYCCQCxAgEFBHZhbF8A6AcJAAIBBQRlcnJfBgERX3ZhbGlkYXRlRGVjaW1hbHMCBHZhbF8EZXJyXwMDCQBmAgAABQR2YWxfBgkAZgIFBHZhbF8ACAkAAgEFBGVycl8GARBfdmFsaWRhdGVQYXltZW50BAhwYXltZW50Xwhhc3NldElkXw9yZXF1aXJlZEFtb3VudF8EZXJyXwQHJG1hdGNoMAgFCHBheW1lbnRfB2Fzc2V0SWQDCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQBYQUHJG1hdGNoMAMJAQIhPQIFCGFzc2V0SWRfCQDYBAEFAWEJAAIBCQCsAgIFBGVycl8CBzogYXNzZXQDCQBmAgUPcmVxdWlyZWRBbW91bnRfCAUIcGF5bWVudF8GYW1vdW50CQACAQkArAICBQRlcnJfAgg6IGFtb3VudAYJAAIBCQCsAgIFBGVycl8CBzogYXNzZXQBFV92YWxpZGF0ZUxpc3RDb250YWlucwMFbGlzdF8EdmFsXwRlcnJfAwkBASEBCQEPY29udGFpbnNFbGVtZW50AgUFbGlzdF8FBHZhbF8JAAIBBQRlcnJfBgELX2Fzc2V0VG9TdHIBBmFzc2V0XwQHJG1hdGNoMAUGYXNzZXRfAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAWEFByRtYXRjaDAJANgEAQUBYQUFV0FWRVMBC19zdHJUb0Fzc2V0AQZhc3NldF8DAwkAAAIFBmFzc2V0XwUFV0FWRVMGCQAAAgUGYXNzZXRfAgAFBHVuaXQJANkEAQUGYXNzZXRfAQpfbG9hZFBhdXNlAAQHJG1hdGNoMAkAoAgBBQpLRVlfUEFVU0VEAwkAAQIFByRtYXRjaDACB0Jvb2xlYW4EAWEFByRtYXRjaDAFAWEHAQpfc2F2ZVBhdXNlAQlpc1BhdXNlZF8JAMwIAgkBDEJvb2xlYW5FbnRyeQIFCktFWV9QQVVTRUQFCWlzUGF1c2VkXwUDbmlsAQtfbG9hZFBhdXNlcgAEByRtYXRjaDAJAKIIAQUKS0VZX1BBVVNFUgMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDAJARFAZXh0ck5hdGl2ZSgxMDYyKQEFAWEJAQdBZGRyZXNzAQEAAQtfc2F2ZVBhdXNlcgEHcGF1c2VyXwkAzAgCCQELU3RyaW5nRW50cnkCBQpLRVlfUEFVU0VSCQClCAEFB3BhdXNlcl8FA25pbAENX2xvYWRNdWx0aXNpZwAEByRtYXRjaDAJAKIIAQUMS0VZX01VTFRJU0lHAwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAkBEUBleHRyTmF0aXZlKDEwNjIpAQUBYQkBB0FkZHJlc3MBAQABDV9zYXZlTXVsdGlzaWcBCW11bHRpc2lnXwkAzAgCCQELU3RyaW5nRW50cnkCBQxLRVlfTVVMVElTSUcJAKUIAQUJbXVsdGlzaWdfBQNuaWwBDF9sb2FkU3RvcmFnZQAEByRtYXRjaDAJAKIIAQULS0VZX1NUT1JBR0UDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwBAZzdHJ1Y3QJALUJAgUBYQUDU0VQCQCcCgoJANkEAQkAkQMCBQZzdHJ1Y3QAAAkAAAIJAJEDAgUGc3RydWN0AAECATEJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQZzdHJ1Y3QAAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBnN0cnVjdAADCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUGc3RydWN0AAQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQZzdHJ1Y3QABQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBnN0cnVjdAAGCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUGc3RydWN0AAcJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQZzdHJ1Y3QACAkBEUBleHRyTmF0aXZlKDEwNjIpAQkAkQMCBQZzdHJ1Y3QACQkAnAoKAQAHAAAAAAAAAAAAAAAAAAAJAQdBZGRyZXNzAQEAAQxfc2F2ZVN0b3JhZ2UBCHN0b3JhZ2VfCQDMCAIJAQtTdHJpbmdFbnRyeQIFC0tFWV9TVE9SQUdFCQC5CQIJAMwIAgkA2AQBCAUIc3RvcmFnZV8CXzEJAMwIAgMIBQhzdG9yYWdlXwJfMgIBMQIBMAkAzAgCCQCkAwEIBQhzdG9yYWdlXwJfMwkAzAgCCQCkAwEIBQhzdG9yYWdlXwJfNAkAzAgCCQCkAwEIBQhzdG9yYWdlXwJfNQkAzAgCCQCkAwEIBQhzdG9yYWdlXwJfNgkAzAgCCQCkAwEIBQhzdG9yYWdlXwJfNwkAzAgCCQCkAwEIBQhzdG9yYWdlXwJfOAkAzAgCCQCkAwEIBQhzdG9yYWdlXwJfOQkAzAgCCQClCAEIBQhzdG9yYWdlXwNfMTAFA25pbAUDU0VQBQNuaWwBC19sb2FkQXNzZXRzAAQHJG1hdGNoMAkAoggBBQpLRVlfQVNTRVRTAwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAMJAGYCCQCxAgEFAWEAAAkAvQkCBQFhBQNTRVAFA25pbAUDbmlsAQtfc2F2ZUFzc2V0cwEHYXNzZXRzXwkAzAgCCQELU3RyaW5nRW50cnkCBQpLRVlfQVNTRVRTCQC7CQIFB2Fzc2V0c18FA1NFUAUDbmlsARJfbG9hZEFzc2V0QmFsYW5jZXMACgEIZm9sZEZ1bmMCA2FjYwRlbGVtBAdiYWxhbmNlCQENcGFyc2VJbnRWYWx1ZQEFBGVsZW0JAJQKAgkAzQgCCAUDYWNjAl8xBQdiYWxhbmNlCQBkAggFA2FjYwJfMgUHYmFsYW5jZQQHJG1hdGNoMAkAoggBBRJLRVlfQVNTRVRfQkFMQU5DRVMDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwAwkAZgIJALECAQUBYQAACgACJGwJAL0JAgUBYQUDU0VQCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCBQNuaWwAAAoBBSRmMF8x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CgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsFA1NFUAUDbmlsAQ1fbG9hZFdhdGNoZG9nAAQHJG1hdGNoMAkAoggBBQxLRVlfV0FUQ0hET0cDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwCQERQGV4dHJOYXRpdmUoMTA2MikBBQFhCQEHQWRkcmVzcwEBAAENX3NhdmVXYXRjaGRvZwEJd2F0Y2hkb2dfCQDMCAIJAQtTdHJpbmdFbnRyeQIFDEtFWV9XQVRDSERPRwkApQgBBQl3YXRjaGRvZ18FA25pbAETX2xvYWRXYXRjaGRvZ09mZnNldAAEByRtYXRjaDAJAJ8IAQUTS0VZX1dBVENIRE9HX09GRlNFVAMJAAECBQckbWF0Y2gwAgNJbnQEAWEFByRtYXRjaDAFAWEAAAETX3NhdmVXYXRjaGRvZ09mZnNldAEHb2Zmc2V0XwkAzAgCCQEMSW50ZWdlckVudHJ5AgUTS0VZX1dBVENIRE9HX09GRlNFVAUHb2Zmc2V0XwUDbmlsARFfb25seVRoaXNDb250cmFjdAEHY2FsbGVyXwMJAQIhPQIFB2NhbGxlcl8FBHRoaXMJAAIBAhlfb25seVRoaXNDb250cmFjdDogcmV2ZXJ0BgEQX3doZW5NdWx0aXNpZ1NldAADCQAAAgkBDV9sb2FkTXVsdGlzaWcACQEHQWRkcmVzcwEBAAkAAgECGF93aGVuTXVsdGlzaWdTZXQ6IHJldmVydAYBE193aGVuTm90SW5pdGlhbGl6ZWQABAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAMJAQIhPQIIBQdzdG9yYWdlAl8xAQAJAAIBAhtfd2hlbk5vdEluaXRpYWxpemVkOiByZXZlcnQGARBfd2hlbkluaXRpYWxpemVkAAQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQADCQAAAggFB3N0b3JhZ2UCXzEBAAkAAgECGF93aGVuSW5pdGlhbGl6ZWQ6IHJldmVydAYBDl93aGVuTm90UGF1c2VkAAMJAQpfbG9hZFBhdXNlAAkAAgECFl93aGVuTm90UGF1c2VkOiByZXZlcnQGAQtfd2hlblBhdXNlZAADCQEBIQEJAQpfbG9hZFBhdXNlAAkAAgECE193aGVuUGF1c2VkOiByZXZlcnQGAQtfb25seVBhdXNlcgEHY2FsbGVyXwMJAQIhPQIFB2NhbGxlcl8JAQtfbG9hZFBhdXNlcgAJAAIBAhNfb25seVBhdXNlcjogcmV2ZXJ0BgEOX2NoZWNrV2F0Y2hkb2cABAJ3ZAQHJG1hdGNoMAkAmggCCQENX2xvYWRXYXRjaGRvZwAFE0tFWV9XQVRDSERPR19IRUlHSFQDCQABAgUHJG1hdGNoMAIDSW50BAFhBQckbWF0Y2gwCQBkAgUBYQkBE19sb2FkV2F0Y2hkb2dPZmZzZXQAAAADCQBmAgUGaGVpZ2h0BQJ3ZAkAAgECFl9jaGVja1dhdGNoZG9nOiByZXZlcnQGAQxfZ2V0RGVjaW1hbHMBCGFzc2V0SWRfBAckbWF0Y2gwCQDsBwEJANkEAQUIYXNzZXRJZF8DCQABAgUHJG1hdGNoMAIFQXNzZXQEAWEFByRtYXRjaDAIBQFhCGRlY2ltYWxzCQACAQkArAICAhdfZ2V0RGVjaW1hbHM6IG5vIGFzc2V0PQUIYXNzZXRJZF8BEl9ub3JtYWxpemVEZWNpbWFscwQHYW1vdW50Xw9zb3VyY2VEZWNpbWFsc18PdGFyZ2V0RGVjaW1hbHNfBnJvdW5kXwMJAGcCBQ9zb3VyY2VEZWNpbWFsc18FD3RhcmdldERlY2ltYWxzXwkAbgQFB2Ftb3VudF8AAQkAbAYACgAACQBlAgUPc291cmNlRGVjaW1hbHNfBQ90YXJnZXREZWNpbWFsc18AAAAABQRET1dOBQZyb3VuZF8JAGgCBQdhbW91bnRfCQBsBgAKAAAJAGUCBQ90YXJnZXREZWNpbWFsc18FD3NvdXJjZURlY2ltYWxzXwAAAAAFBERPV04BFV9wcmVwYXJlQXNzZXRCYWxhbmNlcwEHYXNzZXRzXwoBCGZvbGRGdW5jAgNhY2MEZWxlbQkAzQgCBQNhY2MAAAoAAiRsBQdh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XzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQhmb2xkRnVuYwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgkAlAoCCAUGcmVzdWx0Al8yCAUGcmVzdWx0Al8zARxfaW5jcmVtZW50QmFsYW5jZXNCeVBheW1lbnRzBQliYWxhbmNlc18JcGF5bWVudHNfB2Fzc2V0c18JZGVjaW1hbHNfBGVycl8KAQhmb2xkRnVuYwIDYWNjBGVsZW0EBWluZGV4CAUDYWNjAl8xBAdwYXltZW50CQCRAwIFCXBheW1lbnRzXwUFaW5kZXgED3BheW1lbnRBc3NldFN0cgkBC19hc3NldFRvU3RyAQgFB3BheW1lbnQHYXNzZXRJZAQDZXJyAwkBAiE9AgUPcGF5bWVudEFzc2V0U3RyCQCRAwIFB2Fzc2V0c18FBWluZGV4CQACAQkArAICCQCsAgIFBGVycl8CCDogaW5kZXg9CQCkAwEFBWluZGV4BQR1bml0AwkAAAIFA2VycgUDZXJyBA1hc3NldERlY2ltYWxzCQEMX2dldERlY2ltYWxzAQUPcGF5bWVudEFzc2V0U3RyBApuZXdCYWxhbmNlCQBkAgUEZWxlbQkBEl9ub3JtYWxpemVEZWNpbWFscwQICQCRAwIFCXBheW1lbnRzXwUFaW5kZXgGYW1vdW50BQ1hc3NldERlY2ltYWxzBQlkZWNpbWFsc18FBERPV04JAJUKAwkAZAIFBWluZGV4AAEJAM0IAggFA2FjYwJfMgUKbmV3QmFsYW5jZQkAZAIIBQNhY2MCXzMFCm5ld0JhbGFuY2UJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4EBnJlc3VsdAoAAiRsBQliYWxhbmNlc18KAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCVCgMAAAUDbmls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BQhiYWxhbmNlXwxlcXVpbGlicml1bV8Qd2VpZ2h0QW1wbGlmaWVyXw1zbGlwcGFnZVJhdGVfC2ZlZU1heFJhdGVfAwkAZgIFDGVxdWlsaWJyaXVtXwUIYmFsYW5jZV8ECXRocmVzaG9sZAkAawMFDGVxdWlsaWJyaXVtXwkAZQIFFE1BWF9XRUlHSFRfQU1QTElGSUVSBRB3ZWlnaHRBbXBsaWZpZXJfBRRNQVhfV0VJR0hUX0FNUExJRklFUgMJAGYCBQl0aHJlc2hvbGQFCGJhbGFuY2VfBAxtYXhEZXZpYXRpb24JAGUCBQl0aHJlc2hvbGQFCGJhbGFuY2VfBAdmZWVSYXRlCQBrAwkAawMFDG1heERldmlhdGlvbgUNc2xpcHBhZ2VSYXRlXwUUU0xJUFBBR0VfUkFURV9GQUNUT1IFD0ZFRV9SQVRFX0ZBQ1RPUgUMZXF1aWxpYnJpdW1fAwkAZgIFB2ZlZVJhdGUFC2ZlZU1heFJhdGVfCQBrAwUMbWF4RGV2aWF0aW9uBQtmZWVNYXhSYXRlXwUPRkVFX1JBVEVfRkFDVE9SCQBrAwUMbWF4RGV2aWF0aW9uBQdmZWVSYXRlBQ9GRUVfUkFURV9GQUNUT1IAAAQJdGhyZXNob2xkCQBrAwUMZXF1aWxpYnJpdW1fCQBkAgUUTUFYX1dFSUdIVF9BTVBMSUZJRVIFEHdlaWdodEFtcGxpZmllcl8FFE1BWF9XRUlHSFRfQU1QTElGSUVSAwkAZgIFCGJhbGFuY2VfBQl0aHJlc2hvbGQEDG1heERldmlhdGlvbgkAZQIFCGJhbGFuY2VfBQl0aHJlc2hvbGQEB2ZlZVJhdGUJAGsDCQBrAwUMbWF4RGV2aWF0aW9uBQ1zbGlwcGFnZVJhdGVfBRRTTElQUEFHRV9SQVRFX0ZBQ1RPUgUPRkVFX1JBVEVfRkFDVE9SBQxlcXVpbGlicml1bV8DCQBmAgUHZmVlUmF0ZQULZmVlTWF4UmF0ZV8JAGsDBQxtYXhEZXZpYXRpb24FC2ZlZU1heFJhdGVfBQ9GRUVfUkFURV9GQUNUT1IJAGsDBQxtYXhEZXZpYXRpb24FB2ZlZVJhdGUFD0ZFRV9SQVRFX0ZBQ1RPUgAAAQ1fY2FsY3VsYXRlRmVlBwliYWxhbmNlc18SYXNzZXRzVG90YWxTdXBwbHlfCHdlaWdodHNfDHNpZ21hV2VpZ2h0XxB3ZWlnaHRBbXBsaWZpZXJfDXNsaXBwYWdlUmF0ZV8LZmVlTWF4UmF0ZV8AAAEbX3ZhbGlkYXRlTGlxdWlkaXR5SW52YXJpYW50CxJwcmV2QXNzZXRCYWxhbmNlc18VcHJldkFzc2V0VG90YWxTdXBwbHlfDmFzc2V0QmFsYW5jZXNfEWFzc2V0VG90YWxTdXBwbHlfEnByZXZMcFRvdGFsU3VwcGx5Xw5scFRvdGFsU3VwcGx5Xw1hc3NldFdlaWdodHNfDHNpZ21hV2VpZ2h0XxB3ZWlnaHRBbXBsaWZpZXJfDXNsaXBwYWdlUmF0ZV8LZmVlTWF4UmF0ZV8DAwkAAAIFEnByZXZMcFRvdGFsU3VwcGx5XwAABgkAAAIFDmxwVG90YWxTdXBwbHlfAAAGBA5wcmV2QXNzZXRzUmF0ZQkAawMJAGUCBRVwcmV2QXNzZXRUb3RhbFN1cHBseV8JAQ1fY2FsY3VsYXRlRmVlBwUScHJldkFzc2V0QmFsYW5jZXNfBRVwcmV2QXNzZXRUb3RhbFN1cHBseV8FDWFzc2V0V2VpZ2h0c18FDHNpZ21hV2VpZ2h0XwUQd2VpZ2h0QW1wbGlmaWVyXwUNc2xpcHBhZ2VSYXRlXwULZmVlTWF4UmF0ZV8FC1JBVEVfRkFDVE9SBRJwcmV2THBUb3RhbFN1cHBseV8EDW5ld0Fzc2V0c1JhdGUJAGsDCQBlAgURYXNzZXRUb3RhbFN1cHBseV8JAQ1fY2FsY3VsYXRlRmVlBwUOYXNzZXRCYWxhbmNlc18FEWFzc2V0VG90YWxTdXBwbHlfBQ1hc3NldFdlaWdodHNfBQxzaWdtYVdlaWdodF8FEHdlaWdodEFtcGxpZmllcl8FDXNsaXBwYWdlUmF0ZV8FC2ZlZU1heFJhdGVfBQtSQVRFX0ZBQ1RPUgUObHBUb3RhbFN1cHBseV8EBGRpZmYJAGUCBQ1uZXdBc3NldHNSYXRlBQ5wcmV2QXNzZXRzUmF0ZQMDCQBnAgAABQRkaWZmCQBmAgkAaAIA////////////AQkBDl9sb2FkUHJlY2lzaW9uAAUEZGlmZgcJAAIBCQCsAgICKl92YWxpZGF0ZUxpcXVpZGl0eUludmFyaWFudDogcmV2ZXJ0OiBkaWZmPQkApAMBBQRkaWZmBgEWX3ZhbGlkYXRlU3dhcEludmFyaWFudAkScHJldkFzc2V0QmFsYW5jZXNfFXByZXZBc3NldFRvdGFsU3VwcGx5Xw5hc3NldEJhbGFuY2VzXxFhc3NldFRvdGFsU3VwcGx5Xw1hc3NldFdlaWdodHNfDHNpZ21hV2VpZ2h0XxB3ZWlnaHRBbXBsaWZpZXJfDXNsaXBwYWdlUmF0ZV8LZmVlTWF4UmF0ZV8ECHByZXZVdGlsCQBlAgUVcHJldkFzc2V0VG90YWxTdXBwbHlfCQENX2NhbGN1bGF0ZUZlZQcFEnByZXZBc3NldEJhbGFuY2VzXwUVcHJldkFzc2V0VG90YWxTdXBwbHlfBQ1hc3NldFdlaWdodHNfBQxzaWdtYVdlaWdodF8FEHdlaWdodEFtcGxpZmllcl8FDXNsaXBwYWdlUmF0ZV8FC2ZlZU1heFJhdGVfBAduZXdVdGlsCQBlAgURYXNzZXRUb3RhbFN1cHBseV8JAQ1fY2FsY3VsYXRlRmVlBwUOYXNzZXRCYWxhbmNlc18FEWFzc2V0VG90YWxTdXBwbHlfBQ1hc3NldFdlaWdodHNfBQxzaWdtYVdlaWdodF8FEHdlaWdodEFtcGxpZmllcl8FDXNsaXBwYWdlUmF0ZV8FC2ZlZU1heFJhdGVfBARkaWZmCQBlAgUHbmV3VXRpbAUIcHJldlV0aWwDAwkAZwIAAAUEZGlmZgkAZgIJAGgCAP///////////wEJAQ5fbG9hZFByZWNpc2lvbgAFBGRpZmYHCQACAQkArAICAiVfdmFsaWRhdGVTd2FwSW52YXJpYW50OiByZXZlcnQ6IGRpZmY9CQCkAwEFBGRpZmYGARhfdmFsaWRhdGVBc3NldEFsbG9jYXRpb24HCGJhbGFuY2VfEWFzc2V0VG90YWxTdXBwbHlfDHByZXZCYWxhbmNlXxVwcmV2QXNzZXRUb3RhbFN1cHBseV8Hd2VpZ2h0XwxzaWdtYVdlaWdodF8MbWF4QWxsb2NBbXBfBAtlcXVpbGlicml1bQkAawMFEWFzc2V0VG90YWxTdXBwbHlfBQd3ZWlnaHRfBQxzaWdtYVdlaWdodF8EEG1heEFsbG9jYXRpb25BbXADCQBmAgUIYmFsYW5jZV8FC2VxdWlsaWJyaXVtCQBkAgUNTUFYX0FNUExJRklFUgUMbWF4QWxsb2NBbXBfCQBlAgUNTUFYX0FNUExJRklFUgUMbWF4QWxsb2NBbXBfBA1tYXhBbGxvY2F0aW9uCQBrAwULZXF1aWxpYnJpdW0FEG1heEFsbG9jYXRpb25BbXAFDU1BWF9BTVBMSUZJRVIEEXByZXZNYXhBbGxvY2F0aW9uCQBrAwkAawMFFXByZXZBc3NldFRvdGFsU3VwcGx5XwUHd2VpZ2h0XwUMc2lnbWFXZWlnaHRfBRBtYXhBbGxvY2F0aW9uQW1wBQ1NQVhfQU1QTElGSUVSAwkAZgIFCGJhbGFuY2VfBQtlcXVpbGlicml1bQMJAGYCBQhiYWxhbmNlXwUNbWF4QWxsb2NhdGlvbgMJAGYCBRFwcmV2TWF4QWxsb2NhdGlvbgUMcHJldkJhbGFuY2VfCQACAQIgX3ZhbGlkYXRlQXNzZXRBbGxvY2F0aW9uOiBuZXcgdXADCQBmAgkAZQIFCGJhbGFuY2VfBQ1tYXhBbGxvY2F0aW9uCQBlAgUMcHJldkJhbGFuY2VfBRFwcmV2TWF4QWxsb2NhdGlvbgkAAgECIl92YWxpZGF0ZUFzc2V0QWxsb2NhdGlvbjogc3RpbGwgdXAGBgMJAGYCBQ1tYXhBbGxvY2F0aW9uBQhiYWxhbmNlXwMJAGYCBQxwcmV2QmFsYW5jZV8FEXByZXZNYXhBbGxvY2F0aW9uCQACAQIiX3ZhbGlkYXRlQXNzZXRBbGxvY2F0aW9uOiBuZXcgZG93bgMJAGYCCQBlAgUNbWF4QWxsb2NhdGlvbgUIYmFsYW5jZV8JAGUCBRFwcmV2TWF4QWxsb2NhdGlvbgUMcHJldkJhbGFuY2VfCQACAQIkX3ZhbGlkYXRlQXNzZXRBbGxvY2F0aW9uOiBzdGlsbCBkb3duBgYBE192YWxpZGF0ZUFsbG9jYXRpb24HDmFzc2V0QmFsYW5jZXNfEWFzc2V0VG90YWxTdXBwbHlfEnByZXZBc3NldEJhbGFuY2VzXxVwcmV2QXNzZXRUb3RhbFN1cHBseV8NYXNzZXRXZWlnaHRzXwxzaWdtYVdlaWdodF8MbWF4QWxsb2NBbXBfBgELX2NoZWNrcG9pbnQBBXVzZXJfBAZ1c2VyTHAJAQtfbG9hZFVzZXJMcAEFBXVzZXJfBAt1c2VyUHJvZml0cwkBEF9sb2FkVXNlclByb2ZpdHMBBQV1c2VyXwQNc2lnbWFGZWVQZXJMcAkBEl9sb2FkU2lnbWFGZWVQZXJMcAAEEXVzZXJTaWdtYUZlZVBlckxwCQEWX2xvYWRVc2VyU2lnbWFGZWVQZXJMcAEFBXVzZXJfCgEIZm9sZEZ1bmMCA2FjYwRlbGVtBAVpbmRleAgFA2FjYwJfMQQNcHJvZml0VXBkYXRlZAkAZAIJAJEDAgULdXNlclByb2ZpdHMFBWluZGV4CQCgAwEJALwCAwkAtgIBBQZ1c2VyTHAJALgCAgkAkQMCBQ1zaWdtYUZlZVBlckxwBQVpbmRleAkAkQMCBRF1c2VyU2lnbWFGZWVQZXJMcAUFaW5kZXgFDlBFUkNFTlRfRkFDVE9SCQCUCgIJAGQCBQVpbmRleAABCQDNCAIIBQNhY2MCXzIFDXByb2ZpdFVwZGF0ZWQEDSR0MDI1NzcwMjU4NDMKAAIkbAUQWkVST19JTlRfTElTVF8xMQoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgAABQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCGZvbGRGdW5jAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsEA2lkeAgFDSR0MDI1NzcwMjU4NDMCXzEEDnByb2ZpdHNVcGRhdGVkCAUNJHQwMjU3NzAyNTg0MwJfMgkAlAoCCQDOCAIJARBfc2F2ZVVzZXJQcm9maXRzAgUFdXNlcl8FDnByb2ZpdHNVcGRhdGVkCQEWX3NhdmVVc2VyU2lnbWFGZWVQZXJMcAIFBXVzZXJfBQ1zaWdtYUZlZVBlckxwBQ5wcm9maXRzVXBkYXRlZAEUX3VwZGF0ZVNpZ21hRmVlUGVyTHAEDnNpZ21hRmVlUGVyTHBfCHRvdGFsTHBfBmluZGV4XwZscEZlZV8KAQhmb2xkRnVuYwIDYWNjBGVsZW0EBWluZGV4CAUDYWNjAl8xBBRzaWdtYUZlZVBlckxwVXBkYXRlZAMJAAACBQZpbmRleF8FBWluZGV4CQC3AgIJAJEDAgUOc2lnbWFGZWVQZXJMcF8FBWluZGV4CQC8AgMJALYCAQUGbHBGZWVfBQ5QRVJDRU5UX0ZBQ1RPUgkAtgIBBQh0b3RhbExwXwkAkQMCBQ5zaWdtYUZlZVBlckxwXwUFaW5kZXgJAJQKAgkAZAIFBWluZGV4AAEJAM0IAggFA2FjYwJfMgUUc2lnbWFGZWVQZXJMcFVwZGF0ZWQEDSR0MDI2NDkzMjY1NzIKAAIkbAUQWkVST19JTlRfTElTVF8xMQoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgAABQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCGZvbGRGdW5jAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsEA2lkeAgFDSR0MDI2NDkzMjY1NzICXzEEFHNpZ21hRmVlUGVyTHBVcGRhdGVkCAUNJHQwMjY0OTMyNjU3MgJfMgUUc2lnbWFGZWVQZXJMcFVwZGF0ZWQBG19jYWxjdWxhdGVMcEFuZFByb3RvY29sRmVlcwQLYXNzZXRJbmRleF8HYW1vdW50XwpscEZlZVJhdGVfEHByb3RvY29sRmVlUmF0ZV8EDXNpZ21hRmVlUGVyTHAJARJfbG9hZFNpZ21hRmVlUGVyTHAABAd0b3RhbExwCQEMX2xvYWRUb3RhbExwAAQNJHQwMjY3OTMyNzA2OAMJAAACBQd0b3RhbExwAAAJAJQKAgAACQBrAwUHYW1vdW50XwUQcHJvdG9jb2xGZWVSYXRlXwUHTUFYX0ZFRQkAlAoCCQBrAwUHYW1vdW50XwUKbHBGZWVSYXRlXwUHTUFYX0ZFRQkAawMFB2Ftb3VudF8FEHByb3RvY29sRmVlUmF0ZV8FB01BWF9GRUUEBWxwRmVlCAUNJHQwMjY3OTMyNzA2OAJfMQQLcHJvdG9jb2xGZWUIBQ0kdDAyNjc5MzI3MDY4Al8yBBRzaWdtYUZlZVBlckxwVXBkYXRlZAMJAAACBQVscEZlZQAABQ1zaWdtYUZlZVBlckxwCQEUX3VwZGF0ZVNpZ21hRmVlUGVyTHAEBQ1zaWdtYUZlZVBlckxwBQd0b3RhbExwBQthc3NldEluZGV4XwUFbHBGZWUJAJUKAwUFbHBGZWUFC3Byb3RvY29sRmVlBRRzaWdtYUZlZVBlckxwVXBkYXRlZAELX2RlcG9zaXRBbGwBB2Ftb3VudF8EB3N0b3JhZ2UJAQxfbG9hZFN0b3JhZ2UABA1scFRvdGFsU3VwcGx5CAUHc3RvcmFnZQJfMwQPd2VpZ2h0QW1wbGlmaWVyCAUHc3RvcmFnZQJfNwQMc2xpcHBhZ2VSYXRlCAUHc3RvcmFnZQJfOAQKZmVlTWF4UmF0ZQgFB3N0b3JhZ2UCXzkEBmFzc2V0cwkBC19sb2FkQXNzZXRzAAQNJHQwMjc1NzcyNzYzMAkBEV9sb2FkQXNzZXRXZWlnaHRzAAQMYXNzZXRXZWlnaHRzCAUNJHQwMjc1NzcyNzYzMAJfMQQLc2lnbWFXZWlnaHQIBQ0kdDAyNzU3NzI3NjMwAl8yBA0kdDAyNzYzNTI3NzAzCQESX2xvYWRBc3NldEJhbGFuY2VzAAQRcHJldkFzc2V0QmFsYW5jZXMIBQ0kdDAyNzYzNTI3NzAzAl8xBBRwcmV2QXNzZXRUb3RhbFN1cHBseQgFDSR0MDI3NjM1Mjc3MDMCXzIEDSR0MDI3NzA5Mjg5MzkDCQAAAgUUcHJldkFzc2V0VG90YWxTdXBwbHkAAAoBCGZvbGRGdW5jAgNhY2MEZWxlbQQFaW5kZXgIBQNhY2MCXzEEGHJlcXVpcmVkQW1vdW50Tm9ybWFsaXplZAkAawMJAJEDAgUMYXNzZXRXZWlnaHRzBQVpbmRleAUHYW1vdW50XwULc2lnbWFXZWlnaHQJAJQKAgkAZAIFBWluZGV4AAEJAM0IAggFA2FjYwJfMgUYcmVxdWlyZWRBbW91bnROb3JtYWxpemVkBA0kdDAyODE1MTI4MjI1CgACJGwFBmFzc2V0cwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgAABQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCGZvbGRGdW5jAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKBANpZHgIBQ0kdDAyODE1MTI4MjI1Al8xBBlyZXF1aXJlZEFtb3VudHNOb3JtYWxpemVkCAUNJHQwMjgxNTEyODIyNQJfMgkAlAoCBQdhbW91bnRfBRlyZXF1aXJlZEFtb3VudHNOb3JtYWxpemVkBAVyYXRpbwkAvAIDCQC2AgEFB2Ftb3VudF8FDlBFUkNFTlRfRkFDVE9SCQC2AgEFFHByZXZBc3NldFRvdGFsU3VwcGx5CgEJZm9sZEZ1bmMxAgNhY2MEZWxlbQQFaW5kZXgIBQNhY2MCXzEEGHJlcXVpcmVkQW1vdW50Tm9ybWFsaXplZAkAoAMBCQC8AgMFBXJhdGlvCQC2AgEJAJEDAgURcHJldkFzc2V0QmFsYW5jZXMFBWluZGV4BQ5QRVJDRU5UX0ZBQ1RPUgkAlAoCCQBkAgUFaW5kZXgAAQkAzQgCCAUDYWNjAl8yBRhyZXF1aXJlZEFtb3VudE5vcm1hbGl6ZWQEDSR0MDI4NzY4Mjg4NDMKAAIkbAUGYXNzZXRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCAAAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEJZm9sZEZ1bmMxAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKBANpZHgIBQ0kdDAyODc2ODI4ODQzAl8xBBlyZXF1aXJlZEFtb3VudHNOb3JtYWxpemVkCAUNJHQwMjg3NjgyODg0MwJfMgkAlAoCCQBrAwUHYW1vdW50XwUNbHBUb3RhbFN1cHBseQUUcHJldkFzc2V0VG90YWxTdXBwbHkFGXJlcXVpcmVkQW1vdW50c05vcm1hbGl6ZWQEDmxwVG9rZW5zVG9NaW50CAUNJHQwMjc3MDkyODkzOQJfMQQZcmVxdWlyZWRBbW91bnRzTm9ybWFsaXplZAgFDSR0MDI3NzA5Mjg5MzkCXzIEDSR0MDI4OTQ1MjkwNTgJARtfaW5jcmVtZW50QmFsYW5jZXNCeUFtb3VudHMCBRFwcmV2QXNzZXRCYWxhbmNlcwUZcmVxdWlyZWRBbW91bnRzTm9ybWFsaXplZAQNYXNzZXRCYWxhbmNlcwgFDSR0MDI4OTQ1MjkwNTgCXzEEEGFzc2V0VG90YWxTdXBwbHkIBQ0kdDAyODk0NTI5MDU4Al8yBARlcnIyCQEbX3ZhbGlkYXRlTGlxdWlkaXR5SW52YXJpYW50CwURcHJldkFzc2V0QmFsYW5jZXMFFHByZXZBc3NldFRvdGFsU3VwcGx5BQ1hc3NldEJhbGFuY2VzBRBhc3NldFRvdGFsU3VwcGx5BQ1scFRvdGFsU3VwcGx5CQBkAgUNbHBUb3RhbFN1cHBseQUObHBUb2tlbnNUb01pbnQFDGFzc2V0V2VpZ2h0cwULc2lnbWFXZWlnaHQFD3dlaWdodEFtcGxpZmllcgUMc2xpcHBhZ2VSYXRlBQpmZWVNYXhSYXRlAwkAAAIFBGVycjIFBGVycjIJAJUKAwUObHBUb2tlbnNUb01pbnQFGXJlcXVpcmVkQW1vdW50c05vcm1hbGl6ZWQFDWFzc2V0QmFsYW5jZXMJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BCF9kZXBvc2l0Aghhc3NldElkXwdhbW91bnRfBAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAQNbHBUb3RhbFN1cHBseQgFB3N0b3JhZ2UCXzMECWxwRmVlUmF0ZQgFB3N0b3JhZ2UCXzQED3Byb3RvY29sRmVlUmF0ZQgFB3N0b3JhZ2UCXzUEEW1heEFsbG9jQW1wbGlmaWVyCAUHc3RvcmFnZQJfNgQPd2VpZ2h0QW1wbGlmaWVyCAUHc3RvcmFnZQJfNwQMc2xpcHBhZ2VSYXRlCAUHc3RvcmFnZQJfOAQKZmVlTWF4UmF0ZQgFB3N0b3JhZ2UCXzkEBmFzc2V0cwkBC19sb2FkQXNzZXRzAAQNJHQwMjk4MjEyOTg3NAkBEV9sb2FkQXNzZXRXZWlnaHRzAAQMYXNzZXRXZWlnaHRzCAUNJHQwMjk4MjEyOTg3NAJfMQQLc2lnbWFXZWlnaHQIBQ0kdDAyOTgyMTI5ODc0Al8yBA0kdDAyOTg3OTI5OTkzCQESX2xvYWRBc3NldEJhbGFuY2VzAAQRcHJldkFzc2V0QmFsYW5jZXMIBQ0kdDAyOTg3OTI5OTkzAl8xBBRwcmV2QXNzZXRUb3RhbFN1cHBseQgFDSR0MDI5ODc5Mjk5OTMCXzIEDWFzc2V0QmFsYW5jZXMJARhfaW5jcmVtZW50QmFsYW5jZUJ5SW5kZXgDBRFwcmV2QXNzZXRCYWxhbmNlcwkBBXZhbHVlAQkAzwgCBQZhc3NldHMFCGFzc2V0SWRfBQdhbW91bnRfBBBhc3NldFRvdGFsU3VwcGx5CQBkAgUUcHJldkFzc2V0VG90YWxTdXBwbHkFB2Ftb3VudF8EBGVycjIJARNfdmFsaWRhdGVBbGxvY2F0aW9uBwUNYXNzZXRCYWxhbmNlcwUQYXNzZXRUb3RhbFN1cHBseQURcHJldkFzc2V0QmFsYW5jZXMFFHByZXZBc3NldFRvdGFsU3VwcGx5BQxhc3NldFdlaWdodHMFC3NpZ21hV2VpZ2h0BRFtYXhBbGxvY0FtcGxpZmllcgMJAAACBQRlcnIyBQRlcnIyBAdwcmV2RmVlCQENX2NhbGN1bGF0ZUZlZQcFEXByZXZBc3NldEJhbGFuY2VzBRRwcmV2QXNzZXRUb3RhbFN1cHBseQUMYXNzZXRXZWlnaHRzBQtzaWdtYVdlaWdodAUPd2VpZ2h0QW1wbGlmaWVyBQxzbGlwcGFnZVJhdGUFCmZlZU1heFJhdGUEA2ZlZQkBDV9jYWxjdWxhdGVGZWUHBQ1hc3NldEJhbGFuY2VzBRBhc3NldFRvdGFsU3VwcGx5BQxhc3NldFdlaWdodHMFC3NpZ21hV2VpZ2h0BQ93ZWlnaHRBbXBsaWZpZXIFDHNsaXBwYWdlUmF0ZQUKZmVlTWF4UmF0ZQQObHBUb2tlbnNUb01pbnQDCQAAAgUNbHBUb3RhbFN1cHBseQAACQACAQIUX2RlcG9zaXQ6IGVtcHR5IHBvb2wECWFzc2V0RGlmZgkAZQIFEGFzc2V0VG90YWxTdXBwbHkFFHByZXZBc3NldFRvdGFsU3VwcGx5BAdmZWVEaWZmCQBlAgUDZmVlBQdwcmV2RmVlBBN1dGlsaXR5Q2hhbmdlRmFjdG9yCQBrAwkAZQIFCWFzc2V0RGlmZgUHZmVlRGlmZgULUkFURV9GQUNUT1IJAGUCBRRwcmV2QXNzZXRUb3RhbFN1cHBseQUHcHJldkZlZQQTbHBUb2tlbnNUb01pbnRJbm5lcgkAawMFDWxwVG90YWxTdXBwbHkFE3V0aWxpdHlDaGFuZ2VGYWN0b3IFC1JBVEVfRkFDVE9SBARlcnIzCQEbX3ZhbGlkYXRlTGlxdWlkaXR5SW52YXJpYW50CwURcHJldkFzc2V0QmFsYW5jZXMFFHByZXZBc3NldFRvdGFsU3VwcGx5BQ1hc3NldEJhbGFuY2VzBRBhc3NldFRvdGFsU3VwcGx5BQ1scFRvdGFsU3VwcGx5CQBkAgUNbHBUb3RhbFN1cHBseQUTbHBUb2tlbnNUb01pbnRJbm5lcgUMYXNzZXRXZWlnaHRzBQtzaWdtYVdlaWdodAUPd2VpZ2h0QW1wbGlmaWVyBQxzbGlwcGFnZVJhdGUFCmZlZU1heFJhdGUDCQAAAgUEZXJyMwUEZXJyMwUTbHBUb2tlbnNUb01pbnRJbm5lcgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgQNJHQwMzE2NTUzMTc4NgkBG19jYWxjdWxhdGVMcEFuZFByb3RvY29sRmVlcwQAAAUObHBUb2tlbnNUb01pbnQJAGkCBQlscEZlZVJhdGUAAgkAaQIFD3Byb3RvY29sRmVlUmF0ZQACBAVscEZlZQgFDSR0MDMxNjU1MzE3ODYCXzEEC3Byb3RvY29sRmVlCAUNJHQwMzE2NTUzMTc4NgJfMgQUc2lnbWFGZWVQZXJMcFVwZGF0ZWQIBQ0kdDAzMTY1NTMxNzg2Al8zCQCXCgUFDmxwVG9rZW5zVG9NaW50BQ1hc3NldEJhbGFuY2VzBQVscEZlZQULcHJvdG9jb2xGZWUFFHNpZ21hRmVlUGVyTHBVcGRhdGVkCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQxfd2l0aGRyYXdBbGwBB2Ftb3VudF8EB3N0b3JhZ2UJAQxfbG9hZFN0b3JhZ2UABA1scFRvdGFsU3VwcGx5CAUHc3RvcmFnZQJfMwQRbWF4QWxsb2NBbXBsaWZpZXIIBQdzdG9yYWdlAl82BA93ZWlnaHRBbXBsaWZpZXIIBQdzdG9yYWdlAl83BAxzbGlwcGFnZVJhdGUIBQdzdG9yYWdlAl84BApmZWVNYXhSYXRlCAUHc3RvcmFnZQJfOQQNJHQwMzIxMjAzMjE4OAkBEl9sb2FkQXNzZXRCYWxhbmNlcwAEEXByZXZBc3NldEJhbGFuY2VzCAUNJHQwMzIxMjAzMjE4OAJfMQQUcHJldkFzc2V0VG90YWxTdXBwbHkIBQ0kdDAzMjEyMDMyMTg4Al8yBA0kdDAzMjE5MzMyMjQ2CQERX2xvYWRBc3NldFdlaWdodHMABAxhc3NldFdlaWdodHMIBQ0kdDAzMjE5MzMyMjQ2Al8xBAtzaWdtYVdlaWdodAgFDSR0MDMyMTkzMzIyNDYCXzIEDmxwVG9rZW5zVG9CdXJuBQdhbW91bnRfBANlcnIJAQxfdmFsaWRhdGVJbnQEBQ5scFRva2Vuc1RvQnVybgAABQdNQVhfSU5UAihfd2l0aGRyYXdBbGw6IGxwVG9rZW5zVG9CdXJuIGxlc3MgdGhhbiAwAwkAAAIFA2VycgUDZXJyBA0kdDAzMjM4ODMyNTIxCQEcX2RlY3JlbWVudEJhbGFuY2VzQnlMcEFtb3VudAMFEXByZXZBc3NldEJhbGFuY2VzBQ5scFRva2Vuc1RvQnVybgUNbHBUb3RhbFN1cHBseQQNYXNzZXRCYWxhbmNlcwgFDSR0MDMyMzg4MzI1MjECXzEEEGFzc2V0VG90YWxTdXBwbHkIBQ0kdDAzMjM4ODMyNTIxAl8yBA1iYWxhbmNlc1RvUGF5CAUNJHQwMzIzODgzMjUyMQJfMwQEZXJyMgkBG192YWxpZGF0ZUxpcXVpZGl0eUludmFyaWFudAsFEXByZXZBc3NldEJhbGFuY2VzBRRwcmV2QXNzZXRUb3RhbFN1cHBseQUNYXNzZXRCYWxhbmNlcwUQYXNzZXRUb3RhbFN1cHBseQUNbHBUb3RhbFN1cHBseQkAZQIFDWxwVG90YWxTdXBwbHkFDmxwVG9rZW5zVG9CdXJuBQxhc3NldFdlaWdodHMFC3NpZ21hV2VpZ2h0BQ93ZWlnaHRBbXBsaWZpZXIFDHNsaXBwYWdlUmF0ZQUKZmVlTWF4UmF0ZQMJAAACBQRlcnIyBQRlcnIyCQCVCgMFDmxwVG9rZW5zVG9CdXJuBQ1iYWxhbmNlc1RvUGF5BQ1hc3NldEJhbGFuY2VzCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQlfd2l0aGRyYXcCCGFzc2V0SWRfCWxwQW1vdW50XwQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQAEDWxwVG90YWxTdXBwbHkIBQdzdG9yYWdlAl8zBAlscEZlZVJhdGUIBQdzdG9yYWdlAl80BA9wcm90b2NvbEZlZVJhdGUIBQdzdG9yYWdlAl81BBFtYXhBbGxvY0FtcGxpZmllcggFB3N0b3JhZ2UCXzYED3dlaWdodEFtcGxpZmllcggFB3N0b3JhZ2UCXzcEDHNsaXBwYWdlUmF0ZQgFB3N0b3JhZ2UCXzgECmZlZU1heFJhdGUIBQdzdG9yYWdlAl85BAlwcmVjaXNpb24JAQ5fbG9hZFByZWNpc2lvbgAEBmFzc2V0cwkBC19sb2FkQXNzZXRzAAQNJHQwMzMzMTMzMzM4MQkBEl9sb2FkQXNzZXRCYWxhbmNlcwAEEXByZXZBc3NldEJhbGFuY2VzCAUNJHQwMzMzMTMzMzM4MQJfMQQUcHJldkFzc2V0VG90YWxTdXBwbHkIBQ0kdDAzMzMxMzMzMzgxAl8yBA0kdDAzMzM4NjMzNDM5CQERX2xvYWRBc3NldFdlaWdodHMABAxhc3NldFdlaWdodHMIBQ0kdDAzMzM4NjMzNDM5Al8xBAtzaWdtYVdlaWdodAgFDSR0MDMzMzg2MzM0MzkCXzIEEHRhcmdldEFzc2V0SW5kZXgJAQV2YWx1ZQEJAM8IAgUGYXNzZXRzBQhhc3NldElkXwQHcHJldkZlZQkBDV9jYWxjdWxhdGVGZWUHBRFwcmV2QXNzZXRCYWxhbmNlcwUUcHJldkFzc2V0VG90YWxTdXBwbHkFDGFzc2V0V2VpZ2h0cwULc2lnbWFXZWlnaHQFD3dlaWdodEFtcGxpZmllcgUMc2xpcHBhZ2VSYXRlBQpmZWVNYXhSYXRlBA1wcmV2VXRpbFZhbHVlCQBlAgUUcHJldkFzc2V0VG90YWxTdXBwbHkFB3ByZXZGZWUEAWsJALwCAwkAtgIBCQBlAgUNbHBUb3RhbFN1cHBseQUJbHBBbW91bnRfBQ5QRVJDRU5UX0ZBQ1RPUgkAtgIBBQ1scFRvdGFsU3VwcGx5BBJwcmV2VXRpbFZhbHVlV2l0aEsJAKADAQkAvAIDCQC2AgEFDXByZXZVdGlsVmFsdWUFAWsFDlBFUkNFTlRfRkFDVE9SBBJwcmV2VXRpbFZhbHVlRGl2THAJAL0CBAkAtgIBBQ1wcmV2VXRpbFZhbHVlBQ5QRVJDRU5UX0ZBQ1RPUgkAtgIBBQ1scFRvdGFsU3VwcGx5BQdDRUlMSU5HCgEIZm9sZEZ1bmMCA2FjYwRlbGVtAwgFA2FjYwJfMQUDYWNjBApzdGFydElubmVyCAUDYWNjAl8yBAlzdG9wSW5uZXIIBQNhY2MCXzMEDWN1cnJlbnRBbW91bnQJAGkCCQBkAgUJc3RvcElubmVyBQpzdGFydElubmVyAAIEEXRlbXBBc3NldEJhbGFuY2VzCQEYX2RlY3JlbWVudEJhbGFuY2VCeUluZGV4AwURcHJldkFzc2V0QmFsYW5jZXMFEHRhcmdldEFzc2V0SW5kZXgFDWN1cnJlbnRBbW91bnQEFHRlbXBBc3NldFRvdGFsU3VwcGx5CQBlAgUUcHJldkFzc2V0VG90YWxTdXBwbHkFDWN1cnJlbnRBbW91bnQECXV0aWxWYWx1ZQkAZQIFFHRlbXBBc3NldFRvdGFsU3VwcGx5CQENX2NhbGN1bGF0ZUZlZQcFEXRlbXBBc3NldEJhbGFuY2VzBRR0ZW1wQXNzZXRUb3RhbFN1cHBseQUMYXNzZXRXZWlnaHRzBQtzaWdtYVdlaWdodAUPd2VpZ2h0QW1wbGlmaWVyBQxzbGlwcGFnZVJhdGUFCmZlZU1heFJhdGUDAwkAZgIJAGUCBQl1dGlsVmFsdWUFEnByZXZVdGlsVmFsdWVXaXRoSwkAaAIA////////////AQUJcHJlY2lzaW9uCQBmAgUJcHJlY2lzaW9uCQBlAgUJdXRpbFZhbHVlBRJwcmV2VXRpbFZhbHVlV2l0aEsHCQCXCgUGBQpzdGFydElubmVyBQlzdG9wSW5uZXIFDWN1cnJlbnRBbW91bnQJAGUCBQl1dGlsVmFsdWUFEnByZXZVdGlsVmFsdWVXaXRoSwMJAGYCAAAJAGUCBQl1dGlsVmFsdWUFEnByZXZVdGlsVmFsdWVXaXRoSwkAlwoFBwUKc3RhcnRJbm5lcgUNY3VycmVudEFtb3VudAUNY3VycmVudEFtb3VudAkAZQIFCXV0aWxWYWx1ZQUScHJldlV0aWxWYWx1ZVdpdGhLCQCXCgUHBQ1jdXJyZW50QW1vdW50BQlzdG9wSW5uZXIFDWN1cnJlbnRBbW91bnQJAGUCBQl1dGlsVmFsdWUFEnByZXZVdGlsVmFsdWVXaXRoSwQMdGFyZ2V0QW1vdW50BARzdG9wCQCgAwEJAL0CBAkAtgIBCQBkAgUJbHBBbW91bnRfBQdwcmV2RmVlBRJwcmV2VXRpbFZhbHVlRGl2THAFDlBFUkNFTlRfRkFDVE9SBQdDRUlMSU5HBA0kdDAzNTMwNTM1NDE3CgACJGwFB0xJU1RfNjQKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCXCgUHAAAFBHN0b3AAAAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQhmb2xkRnVuYwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgNjQJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUABUAFgAXABgAGQAaABsAHAAdAB4AHwAgACEAIgAjACQAJQAmACcAKAApACoAKwAsAC0ALgAvADAAMQAyADMANAA1ADYANwA4ADkAOgA7ADwAPQA+AD8AQAQHc3VjY2VzcwgFDSR0MDM1MzA1MzU0MTcCXzEECHN0YXJ0T3V0CAUNJHQwMzUzMDUzNTQxNwJfMgQHc3RvcE91dAgFDSR0MDM1MzA1MzU0MTcCXzMED3RhcmdldEFtb3VudE91dAgFDSR0MDM1MzA1MzU0MTcCXzQEB2RpZmZPdXQIBQ0kdDAzNTMwNTM1NDE3Al81AwkBASEBBQdzdWNjZXNzCQACAQkArAICCQCsAgIJAKwCAgIoX3dpdGhkcmF3OiBjYW4ndCBjYWxjdWxhdGUgdGFyZ2V0QW1vdW50PQkApAMBBQ90YXJnZXRBbW91bnRPdXQCBixkaWZmPQkApAMBBQdkaWZmT3V0BQ90YXJnZXRBbW91bnRPdXQEEmZpbmFsQXNzZXRCYWxhbmNlcwkBGF9kZWNyZW1lbnRCYWxhbmNlQnlJbmRleAMFEXByZXZBc3NldEJhbGFuY2VzBRB0YXJnZXRBc3NldEluZGV4BQx0YXJnZXRBbW91bnQEFWZpbmFsQXNzZXRUb3RhbFN1cHBseQkAZQIFFHByZXZBc3NldFRvdGFsU3VwcGx5BQx0YXJnZXRBbW91bnQEBGVycjEDCQETX3ZhbGlkYXRlQWxsb2NhdGlvbgcFEmZpbmFsQXNzZXRCYWxhbmNlcwUVZmluYWxBc3NldFRvdGFsU3VwcGx5BRFwcmV2QXNzZXRCYWxhbmNlcwUUcHJldkFzc2V0VG90YWxTdXBwbHkFDGFzc2V0V2VpZ2h0cwULc2lnbWFXZWlnaHQFEW1heEFsbG9jQW1wbGlmaWVyCQEbX3ZhbGlkYXRlTGlxdWlkaXR5SW52YXJpYW50CwURcHJldkFzc2V0QmFsYW5jZXMFFHByZXZBc3NldFRvdGFsU3VwcGx5BRJmaW5hbEFzc2V0QmFsYW5jZXMFFWZpbmFsQXNzZXRUb3RhbFN1cHBseQUNbHBUb3RhbFN1cHBseQkAZQIFDWxwVG90YWxTdXBwbHkFCWxwQW1vdW50XwUMYXNzZXRXZWlnaHRzBQtzaWdtYVdlaWdodAUPd2VpZ2h0QW1wbGlmaWVyBQxzbGlwcGFnZVJhdGUFCmZlZU1heFJhdGUHAwkAAAIFBGVycjEFBGVycjEEDSR0MDM2NDA5MzY1NTcJARtfY2FsY3VsYXRlTHBBbmRQcm90b2NvbEZlZXMECQBkAgUQdGFyZ2V0QXNzZXRJbmRleAABBQx0YXJnZXRBbW91bnQJAGkCBQlscEZlZVJhdGUAAgkAaQIFD3Byb3RvY29sRmVlUmF0ZQACBAVscEZlZQgFDSR0MDM2NDA5MzY1NTcCXzEEC3Byb3RvY29sRmVlCAUNJHQwMzY0MDkzNjU1NwJfMgQUc2lnbWFGZWVQZXJMcFVwZGF0ZWQIBQ0kdDAzNjQwOTM2NTU3Al8zCQCXCgUFDHRhcmdldEFtb3VudAUSZmluYWxBc3NldEJhbGFuY2VzBQVscEZlZQULcHJvdG9jb2xGZWUFFHNpZ21hRmVlUGVyTHBVcGRhdGVkCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQVfc3dhcAMRc291cmNlQXNzZXRJbmRleF8RdGFyZ2V0QXNzZXRJbmRleF8Nc291cmNlQW1vdW50XwQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQAECWxwQXNzZXRJZAgFB3N0b3JhZ2UCXzEECmxwRGVjaW1hbHMJAQxfZ2V0RGVjaW1hbHMBCQDYBAEFCWxwQXNzZXRJZAQNbHBUb3RhbFN1cHBseQgFB3N0b3JhZ2UCXzMECWxwRmVlUmF0ZQgFB3N0b3JhZ2UCXzQED3Byb3RvY29sRmVlUmF0ZQgFB3N0b3JhZ2UCXzUEEW1heEFsbG9jQW1wbGlmaWVyCAUHc3RvcmFnZQJfNgQPd2VpZ2h0QW1wbGlmaWVyCAUHc3RvcmFnZQJfNwQMc2xpcHBhZ2VSYXRlCAUHc3RvcmFnZQJfOAQKZmVlTWF4UmF0ZQgFB3N0b3JhZ2UCXzkECXByZWNpc2lvbgkBDl9sb2FkUHJlY2lzaW9uAAQNJHQwMzcxMzkzNzIwNwkBEl9sb2FkQXNzZXRCYWxhbmNlcwAEEXByZXZBc3NldEJhbGFuY2VzCAUNJHQwMzcxMzkzNzIwNwJfMQQUcHJldkFzc2V0VG90YWxTdXBwbHkIBQ0kdDAzNzEzOTM3MjA3Al8yBA0kdDAzNzIxMjM3MjY1CQERX2xvYWRBc3NldFdlaWdodHMABAxhc3NldFdlaWdodHMIBQ0kdDAzNzIxMjM3MjY1Al8xBAtzaWdtYVdlaWdodAgFDSR0MDM3MjEyMzcyNjUCXzIEDWFzc2V0QmFsYW5jZXMJARhfaW5jcmVtZW50QmFsYW5jZUJ5SW5kZXgDBRFwcmV2QXNzZXRCYWxhbmNlcwURc291cmNlQXNzZXRJbmRleF8FDXNvdXJjZUFtb3VudF8EEGFzc2V0VG90YWxTdXBwbHkJAGQCBRRwcmV2QXNzZXRUb3RhbFN1cHBseQUNc291cmNlQW1vdW50XwQHcHJldkZlZQkBDV9jYWxjdWxhdGVGZWUHBRFwcmV2QXNzZXRCYWxhbmNlcwUUcHJldkFzc2V0VG90YWxTdXBwbHkFDGFzc2V0V2VpZ2h0cwULc2lnbWFXZWlnaHQFD3dlaWdodEFtcGxpZmllcgUMc2xpcHBhZ2VSYXRlBQpmZWVNYXhSYXRlBA1wcmV2VXRpbFZhbHVlCQBlAgUUcHJldkFzc2V0VG90YWxTdXBwbHkFB3ByZXZGZWUKAQhmb2xkRnVuYwIDYWNjBGVsZW0DCAUDYWNjAl8xBQNhY2MECnN0YXJ0SW5uZXIIBQNhY2MCXzIECXN0b3BJbm5lcggFA2FjYwJfMwQNY3VycmVudEFtb3VudAkAaQIJAGQCBQlzdG9wSW5uZXIFCnN0YXJ0SW5uZXIAAgQRdGVtcEFzc2V0QmFsYW5jZXMJARhfZGVjcmVtZW50QmFsYW5jZUJ5SW5kZXgDBQ1hc3NldEJhbGFuY2VzBRF0YXJnZXRBc3NldEluZGV4XwUNY3VycmVudEFtb3VudAQUdGVtcEFzc2V0VG90YWxTdXBwbHkJAGUCBRBhc3NldFRvdGFsU3VwcGx5BQ1jdXJyZW50QW1vdW50BAl1dGlsVmFsdWUJAGUCBRR0ZW1wQXNzZXRUb3RhbFN1cHBseQkBDV9jYWxjdWxhdGVGZWUHBRF0ZW1wQXNzZXRCYWxhbmNlcwUUdGVtcEFzc2V0VG90YWxTdXBwbHkFDGFzc2V0V2VpZ2h0cwULc2lnbWFXZWlnaHQFD3dlaWdodEFtcGxpZmllcgUMc2xpcHBhZ2VSYXRlBQpmZWVNYXhSYXRlAwMJAGYCCQBlAgUJdXRpbFZhbHVlBQ1wcmV2VXRpbFZhbHVlCQBoAgD///////////8BBQlwcmVjaXNpb24JAGYCBQlwcmVjaXNpb24JAGUCBQl1dGlsVmFsdWUFDXByZXZVdGlsVmFsdWUHCQCXCgUGBQpzdGFydElubmVyBQlzdG9wSW5uZXIFDWN1cnJlbnRBbW91bnQJAGUCBQl1dGlsVmFsdWUFDXByZXZVdGlsVmFsdWUDCQBmAgAACQBlAgUJdXRpbFZhbHVlBQ1wcmV2VXRpbFZhbHVlCQCXCgUHBQpzdGFydElubmVyBQ1jdXJyZW50QW1vdW50BQ1jdXJyZW50QW1vdW50CQBlAgUJdXRpbFZhbHVlBQ1wcmV2VXRpbFZhbHVlCQCXCgUHBQ1jdXJyZW50QW1vdW50BQlzdG9wSW5uZXIFDWN1cnJlbnRBbW91bnQJAGUCBQl1dGlsVmFsdWUFDXByZXZVdGlsVmFsdWUEDHRhcmdldEFtb3VudAQMdGFyZ2V0QW1vdW50BQ1zb3VyY2VBbW91bnRfBBF0ZW1wQXNzZXRCYWxhbmNlcwkBGF9kZWNyZW1lbnRCYWxhbmNlQnlJbmRleAMFDWFzc2V0QmFsYW5jZXMFEXRhcmdldEFzc2V0SW5kZXhfBQx0YXJnZXRBbW91bnQEFHRlbXBBc3NldFRvdGFsU3VwcGx5CQBlAgUQYXNzZXRUb3RhbFN1cHBseQUMdGFyZ2V0QW1vdW50BANmZWUJAQ1fY2FsY3VsYXRlRmVlBwURdGVtcEFzc2V0QmFsYW5jZXMFFHRlbXBBc3NldFRvdGFsU3VwcGx5BQxhc3NldFdlaWdodHMFC3NpZ21hV2VpZ2h0BQ93ZWlnaHRBbXBsaWZpZXIFDHNsaXBwYWdlUmF0ZQUKZmVlTWF4UmF0ZQQHZmVlRGlmZgkAZQIFA2ZlZQUHcHJldkZlZQMJAAACBQdmZWVEaWZmAAAFDHRhcmdldEFtb3VudAQNJHQwMzkyMzgzOTM2OQoAAiRsBQdMSVNUXzY0CgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlwoFBwAACQBkAgUNc291cmNlQW1vdW50XwUHcHJldkZlZQAAAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCGZvbGRGdW5jAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyA2NAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQAFQAWABcAGAAZABoAGwAcAB0AHgAfACAAIQAiACMAJAAlACYAJwAoACkAKgArACwALQAuAC8AMAAxADIAMwA0ADUANgA3ADgAOQA6ADsAPAA9AD4APwBABAdzdWNjZXNzCAUNJHQwMzkyMzgzOTM2OQJfMQQIc3RhcnRPdXQIBQ0kdDAzOTIzODM5MzY5Al8yBAdzdG9wT3V0CAUNJHQwMzkyMzgzOTM2OQJfMwQPdGFyZ2V0QW1vdW50T3V0CAUNJHQwMzkyMzgzOTM2OQJfNAQHZGlmZk91dAgFDSR0MDM5MjM4MzkzNjkCXzUDCQEBIQEFB3N1Y2Nlc3MJAAIBCQCsAgIJAKwCAgkArAICAiRfc3dhcDogY2FuJ3QgY2FsY3VsYXRlIHRhcmdldEFtb3VudD0JAKQDAQUPdGFyZ2V0QW1vdW50T3V0AgYsZGlmZj0JAKQDAQUHZGlmZk91dAUPdGFyZ2V0QW1vdW50T3V0BBJmaW5hbEFzc2V0QmFsYW5jZXMJARhfZGVjcmVtZW50QmFsYW5jZUJ5SW5kZXgDBQ1hc3NldEJhbGFuY2VzBRF0YXJnZXRBc3NldEluZGV4XwUMdGFyZ2V0QW1vdW50BBVmaW5hbEFzc2V0VG90YWxTdXBwbHkJAGUCBRBhc3NldFRvdGFsU3VwcGx5BQx0YXJnZXRBbW91bnQEBGVycjEDCQETX3ZhbGlkYXRlQWxsb2NhdGlvbgcFEmZpbmFsQXNzZXRCYWxhbmNlcwUVZmluYWxBc3NldFRvdGFsU3VwcGx5BRFwcmV2QXNzZXRCYWxhbmNlcwUUcHJldkFzc2V0VG90YWxTdXBwbHkFDGFzc2V0V2VpZ2h0cwULc2lnbWFXZWlnaHQFEW1heEFsbG9jQW1wbGlmaWVyCQEWX3ZhbGlkYXRlU3dhcEludmFyaWFudAkFEXByZXZBc3NldEJhbGFuY2VzBRRwcmV2QXNzZXRUb3RhbFN1cHBseQUSZmluYWxBc3NldEJhbGFuY2VzBRVmaW5hbEFzc2V0VG90YWxTdXBwbHkFDGFzc2V0V2VpZ2h0cwULc2lnbWFXZWlnaHQFD3dlaWdodEFtcGxpZmllcgUMc2xpcHBhZ2VSYXRlBQpmZWVNYXhSYXRlBwMJAAACBQRlcnIxBQRlcnIxBA0kdDA0MDIxNjQwMzU3CQEbX2NhbGN1bGF0ZUxwQW5kUHJvdG9jb2xGZWVzBAkAZAIFEXRhcmdldEFzc2V0SW5kZXhfAAEFDHRhcmdldEFtb3VudAUJbHBGZWVSYXRlBQ9wcm90b2NvbEZlZVJhdGUEBWxwRmVlCAUNJHQwNDAyMTY0MDM1NwJfMQQLcHJvdG9jb2xGZWUIBQ0kdDA0MDIxNjQwMzU3Al8yBBRzaWdtYUZlZVBlckxwVXBkYXRlZAgFDSR0MDQwMjE2NDAzNTcCXzMJAJcKBQUMdGFyZ2V0QW1vdW50BRJmaW5hbEFzc2V0QmFsYW5jZXMFBWxwRmVlBQtwcm90b2NvbEZlZQUUc2lnbWFGZWVQZXJMcFVwZGF0ZWQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4XAWkBBGluaXQOB2Fzc2V0c18NYXNzZXRXZWlnaHRzXwpscEZlZVJhdGVfEHByb3RvY29sRmVlUmF0ZV8MbHBUb2tlbk5hbWVfDWxwVG9rZW5EZXNjcl8QbHBUb2tlbkRlY2ltYWxzXxdtYXhBbGxvY2F0aW9uQW1wbGlmaWVyXxB3ZWlnaHRBbXBsaWZpZXJfDXNsaXBwYWdlUmF0ZV8LZmVlTWF4UmF0ZV8UcHJvdG9jb2xGZWVDb250cmFjdF8KcHJlY2lzaW9uXwdwYXVzZXJfBANlcnIDAwMDAwMDAwMDAwMDAwMDAwkBEV9vbmx5VGhpc0NvbnRyYWN0AQgFAWkGY2FsbGVyCQETX3doZW5Ob3RJbml0aWFsaXplZAAHCQEQX3doZW5NdWx0aXNpZ1NldAAHCQEPX3ZhbGlkYXRlQXNzZXRzAgUHYXNzZXRzXwIUaW5pdDogaW52YWxpZCBhc3NldHMHCQEQX3ZhbGlkYXRlSW50TGlzdAQFDWFzc2V0V2VpZ2h0c18AAQUKTUFYX1dFSUdIVAIaaW5pdDogaW52YWxpZCBhc3NldFdlaWdodHMHCQESX3ZhbGlkYXRlSW50RXF1YWxzAwkAkAMBBQdhc3NldHNfCQCQAwEFDWFzc2V0V2VpZ2h0c18CH2luaXQ6IGludmFsaWQgYXNzZXRXZWlnaHRzIHNpemUHCQEMX3ZhbGlkYXRlSW50BAUKbHBGZWVSYXRlXwAABQdNQVhfRkVFAhRpbml0OiBpbnZhbGlkIGxwIGZlZQcJAQxfdmFsaWRhdGVJbnQEBRBwcm90b2NvbEZlZVJhdGVfAAAFB01BWF9GRUUCGmluaXQ6IGludmFsaWQgcHJvdG9jb2wgZmVlBwkBEl92YWxpZGF0ZVRva2VuTmFtZQIFDGxwVG9rZW5OYW1lXwISaW5pdDogaW52YWxpZCBuYW1lBwkBE192YWxpZGF0ZVRva2VuRGVzY3ICBQ1scFRva2VuRGVzY3JfAhNpbml0OiBpbnZhbGlkIGRlc2NyBwkBEV92YWxpZGF0ZURlY2ltYWxzAgUQbHBUb2tlbkRlY2ltYWxzXwIWaW5pdDogaW52YWxpZCBkZWNpbWFscwcJAQxfdmFsaWRhdGVJbnQEBRdtYXhBbGxvY2F0aW9uQW1wbGlmaWVyXwAABQ1NQVhfQU1QTElGSUVSAiRpbml0OiBpbnZhbGlkIG1heEFsbG9jYXRpb25BbXBsaWZpZXIHCQEMX3ZhbGlkYXRlSW50BAUQd2VpZ2h0QW1wbGlmaWVyXwAABRdtYXhBbGxvY2F0aW9uQW1wbGlmaWVyXwIdaW5pdDogaW52YWxpZCB3ZWlnaHRBbXBsaWZpZXIHCQEMX3ZhbGlkYXRlSW50BAUNc2xpcHBhZ2VSYXRlXwAABQdNQVhfSU5UAhppbml0OiBpbnZhbGlkIHNsaXBwYWdlUmF0ZQcJAQxfdmFsaWRhdGVJbnQEBQtmZWVNYXhSYXRlXwAABQdNQVhfSU5UAhhpbml0OiBpbnZhbGlkIGZlZU1heFJhdGUHCQEQX3ZhbGlkYXRlQWRkcmVzcwIFFHByb3RvY29sRmVlQ29udHJhY3RfAiFpbml0OiBpbnZhbGlkIHByb3RvY29sRmVlQ29udHJhY3QHCQEMX3ZhbGlkYXRlSW50BAUKcHJlY2lzaW9uXwABBQdNQVhfSU5UAhdpbml0OiBpbnZhbGlkIHByZWNpc2lvbgcJARBfdmFsaWRhdGVBZGRyZXNzAgUHcGF1c2VyXwIUaW5pdDogaW52YWxpZCBwYXVzZXIHAwkAAAIFA2VycgUDZXJyBA0kdDA0MjIyMDQyMjg5CQEUX3ByZXBhcmVBc3NldFdlaWdodHMBBQ1hc3NldFdlaWdodHNfBAxhc3NldFdlaWdodHMIBQ0kdDA0MjIyMDQyMjg5Al8xBAtzaWdtYVdlaWdodAgFDSR0MDQyMjIwNDIyODkCXzIEDWFzc2V0QmFsYW5jZXMJARVfcHJlcGFyZUFzc2V0QmFsYW5jZXMBBQdhc3NldHNfBAVpc3N1ZQkAwggFBQxscFRva2VuTmFtZV8FDWxwVG9rZW5EZXNjcl8AAAUQbHBUb2tlbkRlY2ltYWxzXwYECWxwQXNzZXRJZAkAuAgBBQVpc3N1ZQQOc3RvcmFnZVVwZGF0ZWQJAJwKCgUJbHBBc3NldElkBgAABQpscEZlZVJhdGVfBRBwcm90b2NvbEZlZVJhdGVfBRdtYXhBbGxvY2F0aW9uQW1wbGlmaWVyXwUQd2VpZ2h0QW1wbGlmaWVyXwUNc2xpcHBhZ2VSYXRlXwULZmVlTWF4UmF0ZV8JARFAZXh0ck5hdGl2ZSgxMDYyKQEFFHByb3RvY29sRmVlQ29udHJhY3RfCQCUCgIJAM4IAgkAzggCCQDOCAIJAM4IAgkAzggCCQDOCAIJAM4IAgkAzAgCBQVpc3N1ZQUDbmlsCQEMX3NhdmVTdG9yYWdlAQUOc3RvcmFnZVVwZGF0ZWQJAQtfc2F2ZUFzc2V0cwEFB2Fzc2V0c18JARJfc2F2ZUFzc2V0QmFsYW5jZXMBBQ1hc3NldEJhbGFuY2VzCQERX3NhdmVBc3NldFdlaWdodHMBBQxhc3NldFdlaWdodHMJAQ5fc2F2ZVByZWNpc2lvbgEFCnByZWNpc2lvbl8JARJfc2F2ZVNpZ21hRmVlUGVyTHABCQESX2xvYWRTaWdtYUZlZVBlckxwAAkBC19zYXZlUGF1c2VyAQkBEUBleHRyTmF0aXZlKDEwNjIpAQUHcGF1c2VyXwUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQpkZXBvc2l0QWxsAQdhbW91bnRfBANlcnIDAwkBEF93aGVuSW5pdGlhbGl6ZWQACQEOX3doZW5Ob3RQYXVzZWQABwkBDF92YWxpZGF0ZUludAQFB2Ftb3VudF8AAAUHTUFYX0lOVAIaZGVwb3NpdEFsbDogaW52YWxpZCBhbW91bnQHAwkAAAIFA2VycgUDZXJyBAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAQJbHBBc3NldElkCAUHc3RvcmFnZQJfMQQKbHBEZWNpbWFscwkBDF9nZXREZWNpbWFscwEJANgEAQUJbHBBc3NldElkBAZhc3NldHMJAQtfbG9hZEFzc2V0cwAEDSR0MDQ0MDM5NDQxMjQJAQtfZGVwb3NpdEFsbAEFB2Ftb3VudF8EDmxwVG9rZW5zVG9NaW50CAUNJHQwNDQwMzk0NDEyNAJfMQQZcmVxdWlyZWRBbW91bnRzTm9ybWFsaXplZAgFDSR0MDQ0MDM5NDQxMjQCXzIEDWFzc2V0QmFsYW5jZXMIBQ0kdDA0NDAzOTQ0MTI0Al8zCgEIZm9sZEZ1bmMCA2FjYwRlbGVtBAVpbmRleAgFA2FjYwJfMQQPcGF5bWVudEFzc2V0U3RyCQELX2Fzc2V0VG9TdHIBCAkAkQMCCAUBaQhwYXltZW50cwUFaW5kZXgHYXNzZXRJZAQUcGF5bWVudEFzc2V0RGVjaW1hbHMJAQxfZ2V0RGVjaW1hbHMBBQ9wYXltZW50QXNzZXRTdHIEGHJlcXVpcmVkQW1vdW50Tm9ybWFsaXplZAkAkQMCBRlyZXF1aXJlZEFtb3VudHNOb3JtYWxpemVkBQVpbmRleAQOcmVxdWlyZWRBbW91bnQJARJfbm9ybWFsaXplRGVjaW1hbHMEBRhyZXF1aXJlZEFtb3VudE5vcm1hbGl6ZWQFCmxwRGVjaW1hbHMFFHBheW1lbnRBc3NldERlY2ltYWxzBQdDRUlMSU5HBARlcnIxAwkBAiE9AgUPcGF5bWVudEFzc2V0U3RyBQRlbGVtCQACAQkArAICAiNkZXBvc2l0QWxsOiBpbnZhbGlkIHBheW1lbnQ6IGluZGV4PQkApAMBBQVpbmRleAMJAGcCAAAFDnJlcXVpcmVkQW1vdW50CQACAQImZGVwb3NpdEFsbDogdG9vIGxpdHRsZSBhbW91bnQgcmVxdWlyZWQFBHVuaXQDCQAAAgUEZXJyMQUEZXJyMQQGY2hhbmdlAwkAZgIICQCRAwIIBQFpCHBheW1lbnRzBQVpbmRleAZhbW91bnQFDnJlcXVpcmVkQW1vdW50CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgkAZQIICQCRAwIIBQFpCHBheW1lbnRzBQVpbmRleAZhbW91bnQFDnJlcXVpcmVkQW1vdW50CAkAkQMCCAUBaQhwYXltZW50cwUFaW5kZXgHYXNzZXRJZAUDbmlsAwkAZgIFDnJlcXVpcmVkQW1vdW50CAkAkQMCCAUBaQhwYXltZW50cwUFaW5kZXgGYW1vdW50CQACAQkArAICCQCsAgIJAKwCAgIoZGVwb3NpdEFsbDogaW5zdWZmaWNpZW50IHBheW1lbnQsIGluZGV4PQkApAMBBQVpbmRleAILLCByZXF1aXJlZD0JAKQDAQUOcmVxdWlyZWRBbW91bnQFA25pbAkAlAoCCQBkAgUFaW5kZXgAAQkAzggCCAUDYWNjAl8yBQZjaGFuZ2UJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4EDSR0MDQ1MjY3NDUzMjkKAAIkbAUGYXNzZXRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCAAAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEIZm9sZEZ1bmMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoEA2lkeAgFDSR0MDQ1MjY3NDUzMjkCXzEEDWNoYW5nZUFjdGlvbnMIBQ0kdDA0NTI2NzQ1MzI5Al8yBA5zdG9yYWdlVXBkYXRlZAkAnAoKCAUHc3RvcmFnZQJfMQgFB3N0b3JhZ2UCXzIJAGQCCAUHc3RvcmFnZQJfMwUObHBUb2tlbnNUb01pbnQIBQdzdG9yYWdlAl80CAUHc3RvcmFnZQJfNQgFB3N0b3JhZ2UCXzYIBQdzdG9yYWdlAl83CAUHc3RvcmFnZQJfOAgFB3N0b3JhZ2UCXzkIBQdzdG9yYWdlA18xMAkAlAoCCQDOCAIJAM4IAgkAzggCCQDMCAIJAQdSZWlzc3VlAwUJbHBBc3NldElkBQ5scFRva2Vuc1RvTWludAYJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQ5scFRva2Vuc1RvTWludAUJbHBBc3NldElkBQNuaWwJAQxfc2F2ZVN0b3JhZ2UBBQ5zdG9yYWdlVXBkYXRlZAkBEl9zYXZlQXNzZXRCYWxhbmNlcwEFDWFzc2V0QmFsYW5jZXMFDWNoYW5nZUFjdGlvbnMFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEHZGVwb3NpdAEMbWluTHBBbW91bnRfBANlcnIJAQxfdmFsaWRhdGVJbnQEBQxtaW5McEFtb3VudF8AAAUHTUFYX0lOVAIeZGVwb3NpdDogaW52YWxpZCBtaW4gbHAgYW1vdW50AwkAAAIFA2VycgUDZXJyBAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAQJbHBBc3NldElkCAUHc3RvcmFnZQJfMQQMbHBBc3NldElkU3RyCQELX2Fzc2V0VG9TdHIBBQlscEFzc2V0SWQECmxwRGVjaW1hbHMJAQxfZ2V0RGVjaW1hbHMBBQxscEFzc2V0SWRTdHIEBGVycjEDAwMDAwkBEF93aGVuSW5pdGlhbGl6ZWQACQEOX3doZW5Ob3RQYXVzZWQABwkBDl9jaGVja1dhdGNoZG9nAAcJARJfdmFsaWRhdGVJbnRFcXVhbHMDCQCQAwEIBQFpCHBheW1lbnRzAAECHmRlcG9zaXQ6IGludmFsaWQgcGF5bWVudHMgc2l6ZQcJARVfdmFsaWRhdGVMaXN0Q29udGFpbnMDCQELX2xvYWRBc3NldHMACQELX2Fzc2V0VG9TdHIBCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQCHmRlcG9zaXQ6IGludmFsaWQgcGF5bWVudCBhc3NldAcJAQxfdmFsaWRhdGVJbnQECAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAABBQdNQVhfSU5UAh9kZXBvc2l0OiBpbnZhbGlkIHBheW1lbnQgYW1vdW50BwMJAAACBQRlcnIxBQRlcnIxBAhhc3NldFN0cgkBC19hc3NldFRvU3RyAQgJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBA1hc3NldERlY2ltYWxzCQEMX2dldERlY2ltYWxzAQUIYXNzZXRTdHIEEGFtb3VudE5vcm1hbGl6ZWQJARJfbm9ybWFsaXplRGVjaW1hbHMECAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAUNYXNzZXREZWNpbWFscwUKbHBEZWNpbWFscwUERE9XTgQNJHQwNDY3Njk0Njg4NQkBCF9kZXBvc2l0AgUIYXNzZXRTdHIFEGFtb3VudE5vcm1hbGl6ZWQEDmxwVG9rZW5zVG9NaW50CAUNJHQwNDY3Njk0Njg4NQJfMQQNYXNzZXRCYWxhbmNlcwgFDSR0MDQ2NzY5NDY4ODUCXzIEBWxwRmVlCAUNJHQwNDY3Njk0Njg4NQJfMwQLcHJvdG9jb2xGZWUIBQ0kdDA0Njc2OTQ2ODg1Al80BBRzaWdtYUZlZVBlckxwVXBkYXRlZAgFDSR0MDQ2NzY5NDY4ODUCXzUEDmxwVG9rZW5zVG9TZW5kCQBlAgkAZQIFDmxwVG9rZW5zVG9NaW50BQVscEZlZQULcHJvdG9jb2xGZWUEBGVycjIJAQxfdmFsaWRhdGVJbnQEBQ5scFRva2Vuc1RvU2VuZAUMbWluTHBBbW91bnRfBQdNQVhfSU5UAhZkZXBvc2l0OiBsZXNzIHRoYW4gbWluAwkAAAIFBGVycjIFBGVycjIEDnN0b3JhZ2VVcGRhdGVkCQCcCgoIBQdzdG9yYWdlAl8xCAUHc3RvcmFnZQJfMgkAZAIIBQdzdG9yYWdlAl8zBQ5scFRva2Vuc1RvTWludAgFB3N0b3JhZ2UCXzQIBQdzdG9yYWdlAl81CAUHc3RvcmFnZQJfNggFB3N0b3JhZ2UCXzcIBQdzdG9yYWdlAl84CAUHc3RvcmFnZQJfOQgFB3N0b3JhZ2UDXzEwCQCUCgIJAM4IAgkAzggCCQDOCAIJAM4IAgkAzggCCQDMCAIJAQdSZWlzc3VlAwUJbHBBc3NldElkBQ5scFRva2Vuc1RvTWludAYJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQ5scFRva2Vuc1RvU2VuZAUJbHBBc3NldElkBQNuaWwJAQxfc2F2ZVN0b3JhZ2UBBQ5zdG9yYWdlVXBkYXRlZAkBEl9zYXZlQXNzZXRCYWxhbmNlcwEFDWFzc2V0QmFsYW5jZXMJAQpfc2F2ZUxwRmVlAgUMbHBBc3NldElkU3RyCQBkAgUFbHBGZWUJAQpfbG9hZExwRmVlAQUMbHBBc3NldElkU3RyCQEQX3NhdmVQcm90b2NvbEZlZQIFDGxwQXNzZXRJZFN0cgkAZAIFC3Byb3RvY29sRmVlCQEQX2xvYWRQcm90b2NvbEZlZQEFDGxwQXNzZXRJZFN0cgkBEl9zYXZlU2lnbWFGZWVQZXJMcAEFFHNpZ21hRmVlUGVyTHBVcGRhdGVkBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBC3dpdGhkcmF3QWxsAAQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQAECWxwQXNzZXRJZAgFB3N0b3JhZ2UCXzEEDGxwQXNzZXRJZFN0cgkA2AQBBQlscEFzc2V0SWQECmxwRGVjaW1hbHMJAQxfZ2V0RGVjaW1hbHMBBQxscEFzc2V0SWRTdHIEBmFzc2V0cwkBC19sb2FkQXNzZXRzAAQDZXJyAwMDCQEQX3doZW5Jbml0aWFsaXplZAAJARJfdmFsaWRhdGVJbnRFcXVhbHMDCQCQAwEIBQFpCHBheW1lbnRzAAECIndpdGhkcmF3QWxsOiBpbnZhbGlkIHBheW1lbnRzIHNpemUHCQEUX3ZhbGlkYXRlU3RyaW5nRXF1YWwDBQxscEFzc2V0SWRTdHIJAQtfYXNzZXRUb1N0cgEICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAIid2l0aGRyYXdBbGw6IGludmFsaWQgcGF5bWVudCBhc3NldAcJAQxfdmFsaWRhdGVJbnQECAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAABBQdNQVhfSU5UAiN3aXRoZHJhd0FsbDogaW52YWxpZCBwYXltZW50IGFtb3VudAcDCQAAAgUDZXJyBQNlcnIEDSR0MDQ4MzQ2NDg0MzMJAQxfd2l0aGRyYXdBbGwBCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAQObHBUb2tlbnNUb0J1cm4IBQ0kdDA0ODM0NjQ4NDMzAl8xBA1iYWxhbmNlc1RvUGF5CAUNJHQwNDgzNDY0ODQzMwJfMgQNYXNzZXRCYWxhbmNlcwgFDSR0MDQ4MzQ2NDg0MzMCXzMEDnBheW1lbnRBY3Rpb25zCQEYX2dldFBheW1lbnRzRnJvbUJhbGFuY2VzBAUGYXNzZXRzBQ1iYWxhbmNlc1RvUGF5CAUBaQZjYWxsZXIFCmxwRGVjaW1hbHMEDnN0b3JhZ2VVcGRhdGVkCQCcCgoIBQdzdG9yYWdlAl8xCAUHc3RvcmFnZQJfMgkAZQIIBQdzdG9yYWdlAl8zBQ5scFRva2Vuc1RvQnVybggFB3N0b3JhZ2UCXzQIBQdzdG9yYWdlAl81CAUHc3RvcmFnZQJfNggFB3N0b3JhZ2UCXzcIBQdzdG9yYWdlAl84CAUHc3RvcmFnZQJfOQgFB3N0b3JhZ2UDXzEwCQCUCgIJAM4IAgkAzggCCQDOCAIJAMwIAgkBBEJ1cm4CBQlscEFzc2V0SWQFDmxwVG9rZW5zVG9CdXJuBQNuaWwFDnBheW1lbnRBY3Rpb25zCQEMX3NhdmVTdG9yYWdlAQUOc3RvcmFnZVVwZGF0ZWQJARJfc2F2ZUFzc2V0QmFsYW5jZXMBBQ1hc3NldEJhbGFuY2VzBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCHdpdGhkcmF3Aghhc3NldElkXwptaW5BbW91bnRfBAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAQJbHBBc3NldElkCAUHc3RvcmFnZQJfMQQMbHBBc3NldElkU3RyCQDYBAEFCWxwQXNzZXRJZAQKbHBEZWNpbWFscwkBDF9nZXREZWNpbWFscwEFDGxwQXNzZXRJZFN0cgQGYXNzZXRzCQELX2xvYWRBc3NldHMABANlcnIDAwMDAwMDCQEQX3doZW5Jbml0aWFsaXplZAAJAQ5fd2hlbk5vdFBhdXNlZAAHCQEOX2NoZWNrV2F0Y2hkb2cABwkBEl92YWxpZGF0ZUludEVxdWFscwMJAJADAQgFAWkIcGF5bWVudHMAAQIfd2l0aGRyYXc6IGludmFsaWQgcGF5bWVudHMgc2l6ZQcJARRfdmFsaWRhdGVTdHJpbmdFcXVhbAMFDGxwQXNzZXRJZFN0cgkBC19hc3NldFRvU3RyAQgJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkAh93aXRoZHJhdzogaW52YWxpZCBwYXltZW50IGFzc2V0BwkBDF92YWxpZGF0ZUludAQICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50AAEFB01BWF9JTlQCIHdpdGhkcmF3OiBpbnZhbGlkIHBheW1lbnQgYW1vdW50BwkBFV92YWxpZGF0ZUxpc3RDb250YWlucwMFBmFzc2V0cwUIYXNzZXRJZF8CGXdpdGhkcmF3OiBpbnZhbGlkIGFzc2V0SWQHCQEMX3ZhbGlkYXRlSW50BAUKbWluQW1vdW50XwAABQdNQVhfSU5UAht3aXRoZHJhdzogaW52YWxpZCBtaW5BbW91bnQHAwkAAAIFA2VycgUDZXJyBA0kdDA0OTc4NzQ5OTIxCQEJX3dpdGhkcmF3AgUIYXNzZXRJZF8ICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BBZ0YXJnZXRBbW91bnROb3JtYWxpemVkCAUNJHQwNDk3ODc0OTkyMQJfMQQSZmluYWxBc3NldEJhbGFuY2VzCAUNJHQwNDk3ODc0OTkyMQJfMgQFbHBGZWUIBQ0kdDA0OTc4NzQ5OTIxAl8zBAtwcm90b2NvbEZlZQgFDSR0MDQ5Nzg3NDk5MjECXzQEFHNpZ21hRmVlUGVyTHBVcGRhdGVkCAUNJHQwNDk3ODc0OTkyMQJfNQQVZmluYWxBbW91bnROb3JtYWxpemVkCQBlAgkAZQIFFnRhcmdldEFtb3VudE5vcm1hbGl6ZWQFBWxwRmVlBQtwcm90b2NvbEZlZQQOdGFyZ2V0RGVjaW1hbHMJAQxfZ2V0RGVjaW1hbHMBBQhhc3NldElkXwQLZmluYWxBbW91bnQJARJfbm9ybWFsaXplRGVjaW1hbHMEBRVmaW5hbEFtb3VudE5vcm1hbGl6ZWQFCmxwRGVjaW1hbHMFDnRhcmdldERlY2ltYWxzBQRET1dOBARlcnIxCQEMX3ZhbGlkYXRlSW50BAULZmluYWxBbW91bnQFCm1pbkFtb3VudF8FB01BWF9JTlQCF3dpdGhkcmF3OiBsZXNzIHRoYW4gbWluAwkAAAIFBGVycjEFBGVycjEEDnN0b3JhZ2VVcGRhdGVkCQCcCgoIBQdzdG9yYWdlAl8xCAUHc3RvcmFnZQJfMgkAZQIIBQdzdG9yYWdlAl8zCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAgFB3N0b3JhZ2UCXzQIBQdzdG9yYWdlAl81CAUHc3RvcmFnZQJfNggFB3N0b3JhZ2UCXzcIBQdzdG9yYWdlAl84CAUHc3RvcmFnZQJfOQgFB3N0b3JhZ2UDXzEwCQCUCgIJAM4IAgkAzggCCQDOCAIJAM4IAgkAzggCCQDMCAIJAQRCdXJuAgUJbHBBc3NldElkCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFC2ZpbmFsQW1vdW50CQELX3N0clRvQXNzZXQBBQhhc3NldElkXwUDbmlsCQEMX3NhdmVTdG9yYWdlAQUOc3RvcmFnZVVwZGF0ZWQJARJfc2F2ZUFzc2V0QmFsYW5jZXMBBRJmaW5hbEFzc2V0QmFsYW5jZXMJAQpfc2F2ZUxwRmVlAgUIYXNzZXRJZF8JAGQCBQVscEZlZQkBCl9sb2FkTHBGZWUBBQhhc3NldElkXwkBEF9zYXZlUHJvdG9jb2xGZWUCBQhhc3NldElkXwkAZAIFC3Byb3RvY29sRmVlCQEQX2xvYWRQcm90b2NvbEZlZQEFCGFzc2V0SWRfCQESX3NhdmVTaWdtYUZlZVBlckxwAQUUc2lnbWFGZWVQZXJMcFVwZGF0ZWQFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEEc3dhcAIOdGFyZ2V0QXNzZXRJZF8KbWluQW1vdW50XwQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQAECWxwQXNzZXRJZAgFB3N0b3JhZ2UCXzEECmxwRGVjaW1hbHMJAQxfZ2V0RGVjaW1hbHMBCQDYBAEFCWxwQXNzZXRJZAQGYXNzZXRzCQELX2xvYWRBc3NldHMABA5zb3VyY2VBc3NldFN0cgkBC19hc3NldFRvU3RyAQgJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBBZzb3VyY2VBbW91bnROb3JtYWxpemVkCQESX25vcm1hbGl6ZURlY2ltYWxzBAgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQJAQxfZ2V0RGVjaW1hbHMBBQ5zb3VyY2VBc3NldFN0cgUKbHBEZWNpbWFscwUERE9XTgQQc291cmNlQXNzZXRJbmRleAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDPCAIFBmFzc2V0cwUOc291cmNlQXNzZXRTdHICGnN3YXA6IGludmFsaWQgc291cmNlIGFzc2V0AwkAAAIFEHNvdXJjZUFzc2V0SW5kZXgFEHNvdXJjZUFzc2V0SW5kZXgEEHRhcmdldEFzc2V0SW5kZXgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAzwgCBQZhc3NldHMFDnRhcmdldEFzc2V0SWRfAhpzd2FwOiBpbnZhbGlkIHRhcmdldCBhc3NldAMJAAACBRB0YXJnZXRBc3NldEluZGV4BRB0YXJnZXRBc3NldEluZGV4BANlcnIDAwMDAwMJARBfd2hlbkluaXRpYWxpemVkAAkBDl93aGVuTm90UGF1c2VkAAcJAQ5fY2hlY2tXYXRjaGRvZwAHCQEMX3ZhbGlkYXRlSW50BAUKbWluQW1vdW50XwAABQdNQVhfSU5UAh9zd2FwOiBpbnZhbGlkIG1pbiB0YXJnZXQgYW1vdW50BwkBDF92YWxpZGF0ZUludAQFFnNvdXJjZUFtb3VudE5vcm1hbGl6ZWQAAQUHTUFYX0lOVAIbc3dhcDogaW52YWxpZCBzb3VyY2UgYW1vdW50BwkBFF92YWxpZGF0ZVN0cmluZ05vdEVxAwUOc291cmNlQXNzZXRTdHIFDnRhcmdldEFzc2V0SWRfAhFzd2FwOiBzYW1lIGFzc2V0cwcJARJfdmFsaWRhdGVJbnRFcXVhbHMDCQCQAwEIBQFpCHBheW1lbnRzAAECG3N3YXA6IGludmFsaWQgcGF5bWVudHMgc2l6ZQcDCQAAAgUDZXJyBQNlcnIEDSR0MDUyMDM0NTIxOTIJAQVfc3dhcAMFEHNvdXJjZUFzc2V0SW5kZXgFEHRhcmdldEFzc2V0SW5kZXgFFnNvdXJjZUFtb3VudE5vcm1hbGl6ZWQEFnRhcmdldEFtb3VudE5vcm1hbGl6ZWQIBQ0kdDA1MjAzNDUyMTkyAl8xBBJmaW5hbEFzc2V0QmFsYW5jZXMIBQ0kdDA1MjAzNDUyMTkyAl8yBAVscEZlZQgFDSR0MDUyMDM0NTIxOTICXzMEC3Byb3RvY29sRmVlCAUNJHQwNTIwMzQ1MjE5MgJfNAQUc2lnbWFGZWVQZXJMcFVwZGF0ZWQIBQ0kdDA1MjAzNDUyMTkyAl81BBVmaW5hbEFtb3VudE5vcm1hbGl6ZWQJAGUCCQBlAgUWdGFyZ2V0QW1vdW50Tm9ybWFsaXplZAUFbHBGZWUFC3Byb3RvY29sRmVlBA50YXJnZXREZWNpbWFscwkBDF9nZXREZWNpbWFscwEFDnRhcmdldEFzc2V0SWRfBAtmaW5hbEFtb3VudAkBEl9ub3JtYWxpemVEZWNpbWFscwQFFWZpbmFsQW1vdW50Tm9ybWFsaXplZAUKbHBEZWNpbWFscwUOdGFyZ2V0RGVjaW1hbHMFBERPV04EBGVycjEJAQxfdmFsaWRhdGVJbnQEBQtmaW5hbEFtb3VudAUKbWluQW1vdW50XwUHTUFYX0lOVAITc3dhcDogbGVzcyB0aGFuIG1pbgMJAAACBQRlcnIxBQRlcnIxCQCUCgIJAM4IAgkAzggCCQDOCAIJAM4IAgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFC2ZpbmFsQW1vdW50CQELX3N0clRvQXNzZXQBBQ50YXJnZXRBc3NldElkXwUDbmlsCQESX3NhdmVBc3NldEJhbGFuY2VzAQUSZmluYWxBc3NldEJhbGFuY2VzCQEKX3NhdmVMcEZlZQIFDnRhcmdldEFzc2V0SWRfCQBkAgUFbHBGZWUJAQpfbG9hZExwRmVlAQUOdGFyZ2V0QXNzZXRJZF8JARBfc2F2ZVByb3RvY29sRmVlAgUOdGFyZ2V0QXNzZXRJZF8JAGQCBQtwcm90b2NvbEZlZQkBEF9sb2FkUHJvdG9jb2xGZWUBBQ50YXJnZXRBc3NldElkXwkBEl9zYXZlU2lnbWFGZWVQZXJMcAEFFHNpZ21hRmVlUGVyTHBVcGRhdGVkBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDWdldERlcG9zaXRBbGwBCWxwQW1vdW50XwQDZXJyCQEMX3ZhbGlkYXRlSW50BAUJbHBBbW91bnRfAAEFB01BWF9JTlQCHWdldERlcG9zaXRBbGw6IGludmFsaWQgYW1vdW50AwkAAAIFA2VycgUDZXJyBA0kdDA1MzMxMjUzMzk5CQELX2RlcG9zaXRBbGwBBQlscEFtb3VudF8EDmxwVG9rZW5zVG9NaW50CAUNJHQwNTMzMTI1MzM5OQJfMQQZcmVxdWlyZWRBbW91bnRzTm9ybWFsaXplZAgFDSR0MDUzMzEyNTMzOTkCXzIEDWFzc2V0QmFsYW5jZXMIBQ0kdDA1MzMxMjUzMzk5Al8zCQCUCgIFA25pbAkAlAoCBQ5scFRva2Vuc1RvTWludAUZcmVxdWlyZWRBbW91bnRzTm9ybWFsaXplZAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQpnZXREZXBvc2l0Aghhc3NldElkXwdhbW91bnRfBANlcnIDCQEVX3ZhbGlkYXRlTGlzdENvbnRhaW5zAwkBC19sb2FkQXNzZXRzAAUIYXNzZXRJZF8CGWdldERlcG9zaXQ6IGludmFsaWQgYXNzZXQJAQxfdmFsaWRhdGVJbnQEBQdhbW91bnRfAAEFB01BWF9JTlQCGmdldERlcG9zaXQ6IGludmFsaWQgYW1vdW50BwMJAAACBQNlcnIFA2VycgQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQAECWxwQXNzZXRJZAgFB3N0b3JhZ2UCXzEECmxwRGVjaW1hbHMJAQxfZ2V0RGVjaW1hbHMBCQDYBAEFCWxwQXNzZXRJZAQNYXNzZXREZWNpbWFscwkBDF9nZXREZWNpbWFscwEFCGFzc2V0SWRfBBBhbW91bnROb3JtYWxpemVkCQESX25vcm1hbGl6ZURlY2ltYWxzBAUHYW1vdW50XwUNYXNzZXREZWNpbWFscwUKbHBEZWNpbWFscwUERE9XTgQNJHQwNTQxNTg1NDI3NAkBCF9kZXBvc2l0AgUIYXNzZXRJZF8FEGFtb3VudE5vcm1hbGl6ZWQEDmxwVG9rZW5zVG9NaW50CAUNJHQwNTQxNTg1NDI3NAJfMQQNYXNzZXRCYWxhbmNlcwgFDSR0MDU0MTU4NTQyNzQCXzIEBWxwRmVlCAUNJHQwNTQxNTg1NDI3NAJfMwQLcHJvdG9jb2xGZWUIBQ0kdDA1NDE1ODU0Mjc0Al80BBRzaWdtYUZlZVBlckxwVXBkYXRlZAgFDSR0MDU0MTU4NTQyNzQCXzUEDmxwVG9rZW5zVG9TZW5kCQBlAgkAZQIFDmxwVG9rZW5zVG9NaW50BQVscEZlZQULcHJvdG9jb2xGZWUJAJQKAgUDbmlsBQ5scFRva2Vuc1RvU2VuZAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQ5nZXRXaXRoZHJhd0FsbAEJbHBBbW91bnRfBANlcnIJAQxfdmFsaWRhdGVJbnQEBQlscEFtb3VudF8AAAUHTUFYX0lOVAIeZ2V0V2l0aGRyYXdBbGw6IGludmFsaWQgYW1vdW50AwkAAAIFA2VycgUDZXJyBA0kdDA1NDcxMzU0Nzg5CQEMX3dpdGhkcmF3QWxsAQUJbHBBbW91bnRfBA5scFRva2Vuc1RvQnVybggFDSR0MDU0NzEzNTQ3ODkCXzEEDWJhbGFuY2VzVG9HZXQIBQ0kdDA1NDcxMzU0Nzg5Al8yBA1hc3NldEJhbGFuY2VzCAUNJHQwNTQ3MTM1NDc4OQJfMwkAlAoCBQNuaWwFDWJhbGFuY2VzVG9HZXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQELZ2V0V2l0aGRyYXcCCGFzc2V0SWRfB2Ftb3VudF8EA2VycgMJARVfdmFsaWRhdGVMaXN0Q29udGFpbnMDCQELX2xvYWRBc3NldHMABQhhc3NldElkXwIaZ2V0V2l0aGRyYXc6IGludmFsaWQgYXNzZXQJAQxfdmFsaWRhdGVJbnQEBQdhbW91bnRfAAEFB01BWF9JTlQCG2dldFdpdGhkcmF3OiBpbnZhbGlkIGFtb3VudAcDCQAAAgUDZXJyBQNlcnIEB3N0b3JhZ2UJAQxfbG9hZFN0b3JhZ2UABAlscEFzc2V0SWQIBQdzdG9yYWdlAl8xBApscERlY2ltYWxzCQEMX2dldERlY2ltYWxzAQkA2AQBBQlscEFzc2V0SWQEDSR0MDU1NDQwNTU1NTYJAQlfd2l0aGRyYXcCBQhhc3NldElkXwUHYW1vdW50XwQWdGFyZ2V0QW1vdW50Tm9ybWFsaXplZAgFDSR0MDU1NDQwNTU1NTYCXzEEDWFzc2V0QmFsYW5jZXMIBQ0kdDA1NTQ0MDU1NTU2Al8yBAVscEZlZQgFDSR0MDU1NDQwNTU1NTYCXzMEC3Byb3RvY29sRmVlCAUNJHQwNTU0NDA1NTU1NgJfNAQUc2lnbWFGZWVQZXJMcFVwZGF0ZWQIBQ0kdDA1NTQ0MDU1NTU2Al81BBVmaW5hbEFtb3VudE5vcm1hbGl6ZWQJAGUCCQBlAgUWdGFyZ2V0QW1vdW50Tm9ybWFsaXplZAUFbHBGZWUFC3Byb3RvY29sRmVlBA50YXJnZXREZWNpbWFscwkBDF9nZXREZWNpbWFscwEFCGFzc2V0SWRfBAtmaW5hbEFtb3VudAkBEl9ub3JtYWxpemVEZWNpbWFscwQFFWZpbmFsQW1vdW50Tm9ybWFsaXplZAUKbHBEZWNpbWFscwUOdGFyZ2V0RGVjaW1hbHMFBERPV04JAJQKAgUDbmlsBQtmaW5hbEFtb3VudAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQdnZXRTd2FwAw5zb3VyY2VBc3NldElkXw50YXJnZXRBc3NldElkXw1zb3VyY2VBbW91bnRfBAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAQJbHBBc3NldElkCAUHc3RvcmFnZQJfMQQKbHBEZWNpbWFscwkBDF9nZXREZWNpbWFscwEJANgEAQUJbHBBc3NldElkBAZhc3NldHMJAQtfbG9hZEFzc2V0cwAEEHNvdXJjZUFzc2V0SW5kZXgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAzwgCBQZhc3NldHMFDnNvdXJjZUFzc2V0SWRfAhpzd2FwOiBpbnZhbGlkIHNvdXJjZSBhc3NldAMJAAACBRBzb3VyY2VBc3NldEluZGV4BRBzb3VyY2VBc3NldEluZGV4BBB0YXJnZXRBc3NldEluZGV4CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAM8IAgUGYXNzZXRzBQ50YXJnZXRBc3NldElkXwIac3dhcDogaW52YWxpZCB0YXJnZXQgYXNzZXQDCQAAAgUQdGFyZ2V0QXNzZXRJbmRleAUQdGFyZ2V0QXNzZXRJbmRleAQWc291cmNlQW1vdW50Tm9ybWFsaXplZAkBEl9ub3JtYWxpemVEZWNpbWFscwQFDXNvdXJjZUFtb3VudF8JAQxfZ2V0RGVjaW1hbHMBBQ5zb3VyY2VBc3NldElkXwUKbHBEZWNpbWFscwUERE9XTgQDZXJyAwkBDF92YWxpZGF0ZUludAQFFnNvdXJjZUFtb3VudE5vcm1hbGl6ZWQAAQUHTUFYX0lOVAIbc3dhcDogaW52YWxpZCBzb3VyY2UgYW1vdW50CQEUX3ZhbGlkYXRlU3RyaW5nTm90RXEDBQ5zb3VyY2VBc3NldElkXwUOdGFyZ2V0QXNzZXRJZF8CEXN3YXA6IHNhbWUgYXNzZXRzBwMJAAACBQNlcnIFA2VycgQNJHQwNTY5NjY1NzEyNAkBBV9zd2FwAwUQc291cmNlQXNzZXRJbmRleAUQdGFyZ2V0QXNzZXRJbmRleAUWc291cmNlQW1vdW50Tm9ybWFsaXplZAQWdGFyZ2V0QW1vdW50Tm9ybWFsaXplZAgFDSR0MDU2OTY2NTcxMjQCXzEEEmZpbmFsQXNzZXRCYWxhbmNlcwgFDSR0MDU2OTY2NTcxMjQCXzIEBWxwRmVlCAUNJHQwNTY5NjY1NzEyNAJfMwQLcHJvdG9jb2xGZWUIBQ0kdDA1Njk2NjU3MTI0Al80BBRzaWdtYUZlZVBlckxwVXBkYXRlZAgFDSR0MDU2OTY2NTcxMjQCXzUEFWZpbmFsQW1vdW50Tm9ybWFsaXplZAkAZQIJAGUCBRZ0YXJnZXRBbW91bnROb3JtYWxpemVkBQVscEZlZQULcHJvdG9jb2xGZWUEDnRhcmdldERlY2ltYWxzCQEMX2dldERlY2ltYWxzAQUOdGFyZ2V0QXNzZXRJZF8EC2ZpbmFsQW1vdW50CQESX25vcm1hbGl6ZURlY2ltYWxzBAUVZmluYWxBbW91bnROb3JtYWxpemVkBQpscERlY2ltYWxzBQ50YXJnZXREZWNpbWFscwUERE9XTgkAlAoCBQNuaWwFC2ZpbmFsQW1vdW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCGdldENsYWltAQV1c2VyXwQEdXNlcgMJAGYCCQCxAgEFBXVzZXJfAAAJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBBQV1c2VyXwIWZ2V0Q2xhaW06IGludmFsaWQgdXNlcggFAWkGY2FsbGVyBA0kdDA1Nzc2NjU3ODIyCQELX2NoZWNrcG9pbnQBBQR1c2VyBBFjaGVja3BvaW50QWN0aW9ucwgFDSR0MDU3NzY2NTc4MjICXzEEC3VzZXJQcm9maXRzCAUNJHQwNTc3NjY1NzgyMgJfMgkAlAoCBQNuaWwFC3VzZXJQcm9maXRzAWkBC2dldFV0aWxGdW5jAAQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQAEDWxwVG90YWxTdXBwbHkIBQdzdG9yYWdlAl8zBA93ZWlnaHRBbXBsaWZpZXIIBQdzdG9yYWdlAl83BAxzbGlwcGFnZVJhdGUIBQdzdG9yYWdlAl84BApmZWVNYXhSYXRlCAUHc3RvcmFnZQJfOQQNJHQwNTgxNTU1ODIxNQkBEl9sb2FkQXNzZXRCYWxhbmNlcwAEDWFzc2V0QmFsYW5jZXMIBQ0kdDA1ODE1NTU4MjE1Al8xBBBhc3NldFRvdGFsU3VwcGx5CAUNJHQwNTgxNTU1ODIxNQJfMgQNJHQwNTgyMjA1ODI3MwkBEV9sb2FkQXNzZXRXZWlnaHRzAAQMYXNzZXRXZWlnaHRzCAUNJHQwNTgyMjA1ODI3MwJfMQQLc2lnbWFXZWlnaHQIBQ0kdDA1ODIyMDU4MjczAl8yBANmZWUJAQ1fY2FsY3VsYXRlRmVlBwUNYXNzZXRCYWxhbmNlcwUQYXNzZXRUb3RhbFN1cHBseQUMYXNzZXRXZWlnaHRzBQtzaWdtYVdlaWdodAUPd2VpZ2h0QW1wbGlmaWVyBQxzbGlwcGFnZVJhdGUFCmZlZU1heFJhdGUECXV0aWxWYWx1ZQkAZQIFEGFzc2V0VG90YWxTdXBwbHkFA2ZlZQkAlAoCBQNuaWwJAJQKAgUJdXRpbFZhbHVlBQ1scFRvdGFsU3VwcGx5AWkBCmdldEZlZUZ1bmMABAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAQPd2VpZ2h0QW1wbGlmaWVyCAUHc3RvcmFnZQJfNwQMc2xpcHBhZ2VSYXRlCAUHc3RvcmFnZQJfOAQKZmVlTWF4UmF0ZQgFB3N0b3JhZ2UCXzkEDSR0MDU4NzA1NTg3NjUJARJfbG9hZEFzc2V0QmFsYW5jZXMABA1hc3NldEJhbGFuY2VzCAUNJHQwNTg3MDU1ODc2NQJfMQQQYXNzZXRUb3RhbFN1cHBseQgFDSR0MDU4NzA1NTg3NjUCXzIEDSR0MDU4NzcwNTg4MjMJARFfbG9hZEFzc2V0V2VpZ2h0cwAEDGFzc2V0V2VpZ2h0cwgFDSR0MDU4NzcwNTg4MjMCXzEEC3NpZ21hV2VpZ2h0CAUNJHQwNTg3NzA1ODgyMwJfMgQDZmVlCQENX2NhbGN1bGF0ZUZlZQcFDWFzc2V0QmFsYW5jZXMFEGFzc2V0VG90YWxTdXBwbHkFDGFzc2V0V2VpZ2h0cwULc2lnbWFXZWlnaHQFD3dlaWdodEFtcGxpZmllcgUMc2xpcHBhZ2VSYXRlBQpmZWVNYXhSYXRlCQCUCgIFA25pbAUDZmVlAWkBCmNoZWNrcG9pbnQBBXVzZXJfBANlcnIDCQEQX3doZW5Jbml0aWFsaXplZAAJAQ5fd2hlbk5vdFBhdXNlZAAHAwkAAAIFA2VycgUDZXJyBAR1c2VyAwkAZgIJALECAQUFdXNlcl8AAAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEFBXVzZXJfAhhjaGVja3BvaW50OiBpbnZhbGlkIHVzZXIIBQFpBmNhbGxlcgkBC19jaGVja3BvaW50AQUEdXNlcgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQVzdGFrZQAEA2VycgMJARBfd2hlbkluaXRpYWxpemVkAAkBDl93aGVuTm90UGF1c2VkAAcDCQAAAgUDZXJyBQNlcnIEB3N0b3JhZ2UJAQxfbG9hZFN0b3JhZ2UABAxscEFzc2V0SWRTdHIJAQtfYXNzZXRUb1N0cgEIBQdzdG9yYWdlAl8xBARlcnIxAwMJARJfdmFsaWRhdGVJbnRFcXVhbHMDCQCQAwEIBQFpCHBheW1lbnRzAAECHHN0YWtlOiBpbnZhbGlkIHBheW1lbnRzIHNpemUJARRfdmFsaWRhdGVTdHJpbmdFcXVhbAMFDGxwQXNzZXRJZFN0cgkBC19hc3NldFRvU3RyAQgJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkAhxzdGFrZTogaW52YWxpZCBwYXltZW50IGFzc2V0BwkBDF92YWxpZGF0ZUludAQICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50AAAFB01BWF9JTlQCHXN0YWtlOiBpbnZhbGlkIHBheW1lbnQgYW1vdW50BwMJAAACBQRlcnIxBQRlcnIxBA0kdDA1OTgzMTU5ODkxCQELX2NoZWNrcG9pbnQBCAUBaQZjYWxsZXIEEWNoZWNrcG9pbnRBY3Rpb25zCAUNJHQwNTk4MzE1OTg5MQJfMQQLdXNlclByb2ZpdHMIBQ0kdDA1OTgzMTU5ODkxAl8yCQCUCgIJAM4IAgkAzggCBRFjaGVja3BvaW50QWN0aW9ucwkBC19zYXZlVXNlckxwAggFAWkGY2FsbGVyCQBkAgkBC19sb2FkVXNlckxwAQgFAWkGY2FsbGVyCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAkBDF9zYXZlVG90YWxMcAEJAGQCCQEMX2xvYWRUb3RhbExwAAgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEHdW5zdGFrZQEHYW1vdW50XwQDZXJyAwkBEF93aGVuSW5pdGlhbGl6ZWQACQEOX3doZW5Ob3RQYXVzZWQABwMJAAACBQNlcnIFA2VycgQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQAECWxwQXNzZXRJZAgFB3N0b3JhZ2UCXzEEBnVzZXJMcAkBC19sb2FkVXNlckxwAQgFAWkGY2FsbGVyBARlcnIxCQEMX3ZhbGlkYXRlSW50BAUHYW1vdW50XwAABQZ1c2VyTHACF3Vuc3Rha2U6IGludmFsaWQgYW1vdW50AwkAAAIFBGVycjEFBGVycjEEDSR0MDYwNDAyNjA0NjIJAQtfY2hlY2twb2ludAEIBQFpBmNhbGxlcgQRY2hlY2twb2ludEFjdGlvbnMIBQ0kdDA2MDQwMjYwNDYyAl8xBAt1c2VyUHJvZml0cwgFDSR0MDYwNDAyNjA0NjICXzIJAJQKAgkAzggCCQDOCAIJAM4IAgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFB2Ftb3VudF8FCWxwQXNzZXRJZAUDbmlsBRFjaGVja3BvaW50QWN0aW9ucwkBC19zYXZlVXNlckxwAggFAWkGY2FsbGVyCQBlAgUGdXNlckxwBQdhbW91bnRfCQEMX3NhdmVUb3RhbExwAQkAZQIJAQxfbG9hZFRvdGFsTHAABQdhbW91bnRfBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBBWNsYWltAQV1c2VyXwQDZXJyAwkBEF93aGVuSW5pdGlhbGl6ZWQACQEOX3doZW5Ob3RQYXVzZWQABwMJAAACBQNlcnIFA2VycgQEdXNlcgMJAGYCCQCxAgEFBXVzZXJfAAAJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBBQV1c2VyXwITY2xhaW06IGludmFsaWQgdXNlcggFAWkGY2FsbGVyBAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAQJbHBBc3NldElkCAUHc3RvcmFnZQJfMQQMbHBBc3NldElkU3RyCQELX2Fzc2V0VG9TdHIBBQlscEFzc2V0SWQEBmFzc2V0cwkAzAgCBQxscEFzc2V0SWRTdHIJAQtfbG9hZEFzc2V0cwAECG1heEluZGV4CQBlAgkAkAMBBQZhc3NldHMAAQQGdXNlckxwCQELX2xvYWRVc2VyTHABBQR1c2VyBA0kdDA2MTE4NTYxMjQxCQELX2NoZWNrcG9pbnQBBQR1c2VyBBFjaGVja3BvaW50QWN0aW9ucwgFDSR0MDYxMTg1NjEyNDECXzEEC3VzZXJQcm9maXRzCAUNJHQwNjExODU2MTI0MQJfMgoBCGZvbGRGdW5jAgNhY2MGcHJvZml0BAVpbmRleAgFA2FjYwJfMQMDCQBnAgUIbWF4SW5kZXgFBWluZGV4CQBmAgUGcHJvZml0AAAHBAVhc3NldAkAkQMCBQZhc3NldHMFBWluZGV4CQCVCgMJAGQCBQVpbmRleAABCQDNCAIIBQNhY2MCXzIAAAkAzQgCCAUDYWNjAl8zCQEOU2NyaXB0VHJhbnNmZXIDBQR1c2VyBQZwcm9maXQJAQtfc3RyVG9Bc3NldAEFBWFzc2V0CQCVCgMJAGQCBQVpbmRleAABCQDNCAIIBQNhY2MCXzIFBnByb2ZpdAgFA2FjYwJfMwQNJHQwNjE2MTk2MTcxMAoAAiRsBQt1c2VyUHJvZml0cwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJUKAwAABQNuaWwFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEIZm9sZEZ1bmMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDExCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwQDaWR4CAUNJHQwNjE2MTk2MTcxMAJfMQQSdXNlclByb2ZpdHNVcGRhdGVkCAUNJHQwNjE2MTk2MTcxMAJfMgQNcHJvZml0QWN0aW9ucwgFDSR0MDYxNjE5NjE3MTACXzMJAJQKAgkAzggCCQDOCAIFDXByb2ZpdEFjdGlvbnMJANEIAgURY2hlY2twb2ludEFjdGlvbnMAAAkBEF9zYXZlVXNlclByb2ZpdHMCBQR1c2VyBRJ1c2VyUHJvZml0c1VwZGF0ZWQFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEFcGF1c2UABANlcnIDAwkBC19vbmx5UGF1c2VyAQgFAWkGY2FsbGVyCQEQX3doZW5Jbml0aWFsaXplZAAHCQEOX3doZW5Ob3RQYXVzZWQABwMJAAACBQNlcnIFA2VycgkAlAoCCQEKX3NhdmVQYXVzZQEGBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBB3VucGF1c2UABANlcnIDAwkBEV9vbmx5VGhpc0NvbnRyYWN0AQgFAWkGY2FsbGVyCQEQX3doZW5Jbml0aWFsaXplZAAHCQELX3doZW5QYXVzZWQABwMJAAACBQNlcnIFA2VycgkAlAoCCQEKX3NhdmVQYXVzZQEHBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDHVwZGF0ZVBhdXNlcgEHcGF1c2VyXwQDZXJyAwMJARFfb25seVRoaXNDb250cmFjdAEIBQFpBmNhbGxlcgkBEF93aGVuSW5pdGlhbGl6ZWQABwkBEF92YWxpZGF0ZUFkZHJlc3MCBQdwYXVzZXJfAhx1cGRhdGVQYXVzZXI6IGludmFsaWQgcGF1c2VyBwMJAAACBQNlcnIFA2VycgkAlAoCCQELX3NhdmVQYXVzZXIBCQERQGV4dHJOYXRpdmUoMTA2MikBBQdwYXVzZXJfBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDnVwZGF0ZVdhdGNoZG9nAgl3YXRjaGRvZ18Hb2Zmc2V0XwQDZXJyAwMDCQERX29ubHlUaGlzQ29udHJhY3QBCAUBaQZjYWxsZXIJARBfd2hlbkluaXRpYWxpemVkAAcJARBfdmFsaWRhdGVBZGRyZXNzAgUJd2F0Y2hkb2dfAiB1cGRhdGVXYXRjaGRvZzogaW52YWxpZCB3YXRjaGRvZwcJAQxfdmFsaWRhdGVJbnQEBQdvZmZzZXRfAAAFB01BWF9JTlQCHnVwZGF0ZVdhdGNoZG9nOiBpbnZhbGlkIG9mZnNldAcDCQAAAgUDZXJyBQNlcnIJAJQKAgkAzggCCQENX3NhdmVXYXRjaGRvZwEJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCXdhdGNoZG9nXwkBE19zYXZlV2F0Y2hkb2dPZmZzZXQBBQdvZmZzZXRfBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBC3NldE11bHRpc2lnAQltdWx0aXNpZ18EA2VycgMJARFfb25seVRoaXNDb250cmFjdAEIBQFpBmNhbGxlcgkBEF92YWxpZGF0ZUFkZHJlc3MCBQltdWx0aXNpZ18CHXNldE11bHRpc2lnOiBpbnZhbGlkIG11bHRpc2lnBwMJAAACBQNlcnIFA2VycgkAlAoCCQENX3NhdmVNdWx0aXNpZwEJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCW11bHRpc2lnXwUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgECdHgBBnZlcmlmeQAEByRtYXRjaDAJAKIIAQUMS0VZX01VTFRJU0lHAwkAAQIFByRtYXRjaDACBlN0cmluZwQIbXVsdGlzaWcFByRtYXRjaDAJAQt2YWx1ZU9yRWxzZQIJAJsIAgkBEUBleHRyTmF0aXZlKDEwNjIpAQUIbXVsdGlzaWcJALkJAgkAzAgCBQpLRVlfU1RBVFVTCQDMCAIJAKUIAQUEdGhpcwkAzAgCCQDYBAEIBQJ0eAJpZAUDbmlsBQNTRVAHCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACAUCdHgPc2VuZGVyUHVibGljS2V5NPTs7Q==", "height": 2853212, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: HXmoTDMH1hQ66unyF9uZAB4DsfdZ6oFb6WbwETYnMBTR Next: EFhg6AytVjyfb4BYaf4sEgPYRPyU6DgtaTzX3hbFH7G4 Diff:
OldNewDifferences
10451045 $Tuple2((index + 1), (acc._2 :+ profitUpdated))
10461046 }
10471047
1048- let $t02577125844 = {
1048+ let $t02577025843 = {
10491049 let $l = ZERO_INT_LIST_11
10501050 let $s = size($l)
10511051 let $acc0 = $Tuple2(0, nil)
10591059
10601060 $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)
10611061 }
1062- let idx = $t02577125844._1
1063- let profitsUpdated = $t02577125844._2
1062+ let idx = $t02577025843._1
1063+ let profitsUpdated = $t02577025843._2
10641064 $Tuple2((_saveUserProfits(user_, profitsUpdated) ++ _saveUserSigmaFeePerLp(user_, sigmaFeePerLp)), profitsUpdated)
10651065 }
10661066
10741074 $Tuple2((index + 1), (acc._2 :+ sigmaFeePerLpUpdated))
10751075 }
10761076
1077- let $t02649426573 = {
1077+ let $t02649326572 = {
10781078 let $l = ZERO_INT_LIST_11
10791079 let $s = size($l)
10801080 let $acc0 = $Tuple2(0, nil)
10881088
10891089 $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)
10901090 }
1091- let idx = $t02649426573._1
1092- let sigmaFeePerLpUpdated = $t02649426573._2
1091+ let idx = $t02649326572._1
1092+ let sigmaFeePerLpUpdated = $t02649326572._2
10931093 sigmaFeePerLpUpdated
10941094 }
10951095
10971097 func _calculateLpAndProtocolFees (assetIndex_,amount_,lpFeeRate_,protocolFeeRate_) = {
10981098 let sigmaFeePerLp = _loadSigmaFeePerLp()
10991099 let totalLp = _loadTotalLp()
1100- let $t02679427069 = if ((totalLp == 0))
1100+ let $t02679327068 = if ((totalLp == 0))
11011101 then $Tuple2(0, fraction(amount_, protocolFeeRate_, MAX_FEE))
11021102 else $Tuple2(fraction(amount_, lpFeeRate_, MAX_FEE), fraction(amount_, protocolFeeRate_, MAX_FEE))
1103- let lpFee = $t02679427069._1
1104- let protocolFee = $t02679427069._2
1103+ let lpFee = $t02679327068._1
1104+ let protocolFee = $t02679327068._2
11051105 let sigmaFeePerLpUpdated = if ((lpFee == 0))
11061106 then sigmaFeePerLp
11071107 else _updateSigmaFeePerLp(sigmaFeePerLp, totalLp, assetIndex_, lpFee)
11161116 let slippageRate = storage._8
11171117 let feeMaxRate = storage._9
11181118 let assets = _loadAssets()
1119- let $t02757827631 = _loadAssetWeights()
1120- let assetWeights = $t02757827631._1
1121- let sigmaWeight = $t02757827631._2
1122- let $t02763627704 = _loadAssetBalances()
1123- let prevAssetBalances = $t02763627704._1
1124- let prevAssetTotalSupply = $t02763627704._2
1125- let $t02771028940 = if ((prevAssetTotalSupply == 0))
1119+ let $t02757727630 = _loadAssetWeights()
1120+ let assetWeights = $t02757727630._1
1121+ let sigmaWeight = $t02757727630._2
1122+ let $t02763527703 = _loadAssetBalances()
1123+ let prevAssetBalances = $t02763527703._1
1124+ let prevAssetTotalSupply = $t02763527703._2
1125+ let $t02770928939 = if ((prevAssetTotalSupply == 0))
11261126 then {
11271127 func foldFunc (acc,elem) = {
11281128 let index = acc._1
11301130 $Tuple2((index + 1), (acc._2 :+ requiredAmountNormalized))
11311131 }
11321132
1133- let $t02815228226 = {
1133+ let $t02815128225 = {
11341134 let $l = assets
11351135 let $s = size($l)
11361136 let $acc0 = $Tuple2(0, nil)
11441144
11451145 $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)
11461146 }
1147- let idx = $t02815228226._1
1148- let requiredAmountsNormalized = $t02815228226._2
1147+ let idx = $t02815128225._1
1148+ let requiredAmountsNormalized = $t02815128225._2
11491149 $Tuple2(amount_, requiredAmountsNormalized)
11501150 }
11511151 else {
11561156 $Tuple2((index + 1), (acc._2 :+ requiredAmountNormalized))
11571157 }
11581158
1159- let $t02876928844 = {
1159+ let $t02876828843 = {
11601160 let $l = assets
11611161 let $s = size($l)
11621162 let $acc0 = $Tuple2(0, nil)
11701170
11711171 $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)
11721172 }
1173- let idx = $t02876928844._1
1174- let requiredAmountsNormalized = $t02876928844._2
1173+ let idx = $t02876828843._1
1174+ let requiredAmountsNormalized = $t02876828843._2
11751175 $Tuple2(fraction(amount_, lpTotalSupply, prevAssetTotalSupply), requiredAmountsNormalized)
11761176 }
1177- let lpTokensToMint = $t02771028940._1
1178- let requiredAmountsNormalized = $t02771028940._2
1179- let $t02894629059 = _incrementBalancesByAmounts(prevAssetBalances, requiredAmountsNormalized)
1180- let assetBalances = $t02894629059._1
1181- let assetTotalSupply = $t02894629059._2
1177+ let lpTokensToMint = $t02770928939._1
1178+ let requiredAmountsNormalized = $t02770928939._2
1179+ let $t02894529058 = _incrementBalancesByAmounts(prevAssetBalances, requiredAmountsNormalized)
1180+ let assetBalances = $t02894529058._1
1181+ let assetTotalSupply = $t02894529058._2
11821182 let err2 = _validateLiquidityInvariant(prevAssetBalances, prevAssetTotalSupply, assetBalances, assetTotalSupply, lpTotalSupply, (lpTotalSupply + lpTokensToMint), assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
11831183 if ((err2 == err2))
11841184 then $Tuple3(lpTokensToMint, requiredAmountsNormalized, assetBalances)
11961196 let slippageRate = storage._8
11971197 let feeMaxRate = storage._9
11981198 let assets = _loadAssets()
1199- let $t02982229875 = _loadAssetWeights()
1200- let assetWeights = $t02982229875._1
1201- let sigmaWeight = $t02982229875._2
1202- let $t02988029994 = _loadAssetBalances()
1203- let prevAssetBalances = $t02988029994._1
1204- let prevAssetTotalSupply = $t02988029994._2
1199+ let $t02982129874 = _loadAssetWeights()
1200+ let assetWeights = $t02982129874._1
1201+ let sigmaWeight = $t02982129874._2
1202+ let $t02987929993 = _loadAssetBalances()
1203+ let prevAssetBalances = $t02987929993._1
1204+ let prevAssetTotalSupply = $t02987929993._2
12051205 let assetBalances = _incrementBalanceByIndex(prevAssetBalances, value(indexOf(assets, assetId_)), amount_)
12061206 let assetTotalSupply = (prevAssetTotalSupply + amount_)
12071207 let err2 = _validateAllocation(assetBalances, assetTotalSupply, prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, maxAllocAmplifier)
12211221 then lpTokensToMintInner
12221222 else throw("Strict value is not equal to itself.")
12231223 }
1224- let $t03165631787 = _calculateLpAndProtocolFees(0, lpTokensToMint, (lpFeeRate / 2), (protocolFeeRate / 2))
1225- let lpFee = $t03165631787._1
1226- let protocolFee = $t03165631787._2
1227- let sigmaFeePerLpUpdated = $t03165631787._3
1224+ let $t03165531786 = _calculateLpAndProtocolFees(0, lpTokensToMint, (lpFeeRate / 2), (protocolFeeRate / 2))
1225+ let lpFee = $t03165531786._1
1226+ let protocolFee = $t03165531786._2
1227+ let sigmaFeePerLpUpdated = $t03165531786._3
12281228 $Tuple5(lpTokensToMint, assetBalances, lpFee, protocolFee, sigmaFeePerLpUpdated)
12291229 }
12301230 else throw("Strict value is not equal to itself.")
12381238 let weightAmplifier = storage._7
12391239 let slippageRate = storage._8
12401240 let feeMaxRate = storage._9
1241- let $t03212132189 = _loadAssetBalances()
1242- let prevAssetBalances = $t03212132189._1
1243- let prevAssetTotalSupply = $t03212132189._2
1244- let $t03219432247 = _loadAssetWeights()
1245- let assetWeights = $t03219432247._1
1246- let sigmaWeight = $t03219432247._2
1241+ let $t03212032188 = _loadAssetBalances()
1242+ let prevAssetBalances = $t03212032188._1
1243+ let prevAssetTotalSupply = $t03212032188._2
1244+ let $t03219332246 = _loadAssetWeights()
1245+ let assetWeights = $t03219332246._1
1246+ let sigmaWeight = $t03219332246._2
12471247 let lpTokensToBurn = amount_
12481248 let err = _validateInt(lpTokensToBurn, 0, MAX_INT, "_withdrawAll: lpTokensToBurn less than 0")
12491249 if ((err == err))
12501250 then {
1251- let $t03238932522 = _decrementBalancesByLpAmount(prevAssetBalances, lpTokensToBurn, lpTotalSupply)
1252- let assetBalances = $t03238932522._1
1253- let assetTotalSupply = $t03238932522._2
1254- let balancesToPay = $t03238932522._3
1251+ let $t03238832521 = _decrementBalancesByLpAmount(prevAssetBalances, lpTokensToBurn, lpTotalSupply)
1252+ let assetBalances = $t03238832521._1
1253+ let assetTotalSupply = $t03238832521._2
1254+ let balancesToPay = $t03238832521._3
12551255 let err2 = _validateLiquidityInvariant(prevAssetBalances, prevAssetTotalSupply, assetBalances, assetTotalSupply, lpTotalSupply, (lpTotalSupply - lpTokensToBurn), assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
12561256 if ((err2 == err2))
12571257 then $Tuple3(lpTokensToBurn, balancesToPay, assetBalances)
12721272 let feeMaxRate = storage._9
12731273 let precision = _loadPrecision()
12741274 let assets = _loadAssets()
1275- let $t03331433382 = _loadAssetBalances()
1276- let prevAssetBalances = $t03331433382._1
1277- let prevAssetTotalSupply = $t03331433382._2
1278- let $t03338733440 = _loadAssetWeights()
1279- let assetWeights = $t03338733440._1
1280- let sigmaWeight = $t03338733440._2
1275+ let $t03331333381 = _loadAssetBalances()
1276+ let prevAssetBalances = $t03331333381._1
1277+ let prevAssetTotalSupply = $t03331333381._2
1278+ let $t03338633439 = _loadAssetWeights()
1279+ let assetWeights = $t03338633439._1
1280+ let sigmaWeight = $t03338633439._2
12811281 let targetAssetIndex = value(indexOf(assets, assetId_))
12821282 let prevFee = _calculateFee(prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
12831283 let prevUtilValue = (prevAssetTotalSupply - prevFee)
13041304
13051305 let targetAmount = {
13061306 let stop = toInt(fraction(toBigInt((lpAmount_ + prevFee)), prevUtilValueDivLp, PERCENT_FACTOR, CEILING))
1307- let $t03530635418 = {
1307+ let $t03530535417 = {
13081308 let $l = LIST_64
13091309 let $s = size($l)
13101310 let $acc0 = $Tuple5(false, 0, stop, 0, 0)
13181318
13191319 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63), 64)
13201320 }
1321- let success = $t03530635418._1
1322- let startOut = $t03530635418._2
1323- let stopOut = $t03530635418._3
1324- let targetAmountOut = $t03530635418._4
1325- let diffOut = $t03530635418._5
1321+ let success = $t03530535417._1
1322+ let startOut = $t03530535417._2
1323+ let stopOut = $t03530535417._3
1324+ let targetAmountOut = $t03530535417._4
1325+ let diffOut = $t03530535417._5
13261326 if (!(success))
13271327 then throw(((("_withdraw: can't calculate targetAmount=" + toString(targetAmountOut)) + ",diff=") + toString(diffOut)))
13281328 else targetAmountOut
13341334 else false
13351335 if ((err1 == err1))
13361336 then {
1337- let $t03641036558 = _calculateLpAndProtocolFees((targetAssetIndex + 1), targetAmount, (lpFeeRate / 2), (protocolFeeRate / 2))
1338- let lpFee = $t03641036558._1
1339- let protocolFee = $t03641036558._2
1340- let sigmaFeePerLpUpdated = $t03641036558._3
1337+ let $t03640936557 = _calculateLpAndProtocolFees((targetAssetIndex + 1), targetAmount, (lpFeeRate / 2), (protocolFeeRate / 2))
1338+ let lpFee = $t03640936557._1
1339+ let protocolFee = $t03640936557._2
1340+ let sigmaFeePerLpUpdated = $t03640936557._3
13411341 $Tuple5(targetAmount, finalAssetBalances, lpFee, protocolFee, sigmaFeePerLpUpdated)
13421342 }
13431343 else throw("Strict value is not equal to itself.")
13561356 let slippageRate = storage._8
13571357 let feeMaxRate = storage._9
13581358 let precision = _loadPrecision()
1359- let $t03714037208 = _loadAssetBalances()
1360- let prevAssetBalances = $t03714037208._1
1361- let prevAssetTotalSupply = $t03714037208._2
1362- let $t03721337266 = _loadAssetWeights()
1363- let assetWeights = $t03721337266._1
1364- let sigmaWeight = $t03721337266._2
1359+ let $t03713937207 = _loadAssetBalances()
1360+ let prevAssetBalances = $t03713937207._1
1361+ let prevAssetTotalSupply = $t03713937207._2
1362+ let $t03721237265 = _loadAssetWeights()
1363+ let assetWeights = $t03721237265._1
1364+ let sigmaWeight = $t03721237265._2
13651365 let assetBalances = _incrementBalanceByIndex(prevAssetBalances, sourceAssetIndex_, sourceAmount_)
13661366 let assetTotalSupply = (prevAssetTotalSupply + sourceAmount_)
13671367 let prevFee = _calculateFee(prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
13931393 if ((feeDiff == 0))
13941394 then targetAmount
13951395 else {
1396- let $t03923939370 = {
1396+ let $t03923839369 = {
13971397 let $l = LIST_64
13981398 let $s = size($l)
13991399 let $acc0 = $Tuple5(false, 0, (sourceAmount_ + prevFee), 0, 0)
14071407
14081408 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63), 64)
14091409 }
1410- let success = $t03923939370._1
1411- let startOut = $t03923939370._2
1412- let stopOut = $t03923939370._3
1413- let targetAmountOut = $t03923939370._4
1414- let diffOut = $t03923939370._5
1410+ let success = $t03923839369._1
1411+ let startOut = $t03923839369._2
1412+ let stopOut = $t03923839369._3
1413+ let targetAmountOut = $t03923839369._4
1414+ let diffOut = $t03923839369._5
14151415 if (!(success))
14161416 then throw(((("_swap: can't calculate targetAmount=" + toString(targetAmountOut)) + ",diff=") + toString(diffOut)))
14171417 else targetAmountOut
14241424 else false
14251425 if ((err1 == err1))
14261426 then {
1427- let $t04021740358 = _calculateLpAndProtocolFees((targetAssetIndex_ + 1), targetAmount, lpFeeRate, protocolFeeRate)
1428- let lpFee = $t04021740358._1
1429- let protocolFee = $t04021740358._2
1430- let sigmaFeePerLpUpdated = $t04021740358._3
1427+ let $t04021640357 = _calculateLpAndProtocolFees((targetAssetIndex_ + 1), targetAmount, lpFeeRate, protocolFeeRate)
1428+ let lpFee = $t04021640357._1
1429+ let protocolFee = $t04021640357._2
1430+ let sigmaFeePerLpUpdated = $t04021640357._3
14311431 $Tuple5(targetAmount, finalAssetBalances, lpFee, protocolFee, sigmaFeePerLpUpdated)
14321432 }
14331433 else throw("Strict value is not equal to itself.")
14731473 else false
14741474 if ((err == err))
14751475 then {
1476- let $t04222142290 = _prepareAssetWeights(assetWeights_)
1477- let assetWeights = $t04222142290._1
1478- let sigmaWeight = $t04222142290._2
1476+ let $t04222042289 = _prepareAssetWeights(assetWeights_)
1477+ let assetWeights = $t04222042289._1
1478+ let sigmaWeight = $t04222042289._2
14791479 let assetBalances = _prepareAssetBalances(assets_)
14801480 let issue = Issue(lpTokenName_, lpTokenDescr_, 0, lpTokenDecimals_, true)
14811481 let lpAssetId = calculateAssetId(issue)
15001500 let lpAssetId = storage._1
15011501 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
15021502 let assets = _loadAssets()
1503- let $t04404044125 = _depositAll(amount_)
1504- let lpTokensToMint = $t04404044125._1
1505- let requiredAmountsNormalized = $t04404044125._2
1506- let assetBalances = $t04404044125._3
1503+ let $t04403944124 = _depositAll(amount_)
1504+ let lpTokensToMint = $t04403944124._1
1505+ let requiredAmountsNormalized = $t04403944124._2
1506+ let assetBalances = $t04403944124._3
15071507 func foldFunc (acc,elem) = {
15081508 let index = acc._1
15091509 let paymentAssetStr = _assetToStr(i.payments[index].assetId)
15271527 else throw("Strict value is not equal to itself.")
15281528 }
15291529
1530- let $t04526845330 = {
1530+ let $t04526745329 = {
15311531 let $l = assets
15321532 let $s = size($l)
15331533 let $acc0 = $Tuple2(0, nil)
15411541
15421542 $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)
15431543 }
1544- let idx = $t04526845330._1
1545- let changeActions = $t04526845330._2
1544+ let idx = $t04526745329._1
1545+ let changeActions = $t04526745329._2
15461546 let storageUpdated = $Tuple10(storage._1, storage._2, (storage._3 + lpTokensToMint), storage._4, storage._5, storage._6, storage._7, storage._8, storage._9, storage._10)
15471547 $Tuple2(((([Reissue(lpAssetId, lpTokensToMint, true), ScriptTransfer(i.caller, lpTokensToMint, lpAssetId)] ++ _saveStorage(storageUpdated)) ++ _saveAssetBalances(assetBalances)) ++ changeActions), unit)
15481548 }
15761576 let assetStr = _assetToStr(i.payments[0].assetId)
15771577 let assetDecimals = _getDecimals(assetStr)
15781578 let amountNormalized = _normalizeDecimals(i.payments[0].amount, assetDecimals, lpDecimals, DOWN)
1579- let $t04677046886 = _deposit(assetStr, amountNormalized)
1580- let lpTokensToMint = $t04677046886._1
1581- let assetBalances = $t04677046886._2
1582- let lpFee = $t04677046886._3
1583- let protocolFee = $t04677046886._4
1584- let sigmaFeePerLpUpdated = $t04677046886._5
1579+ let $t04676946885 = _deposit(assetStr, amountNormalized)
1580+ let lpTokensToMint = $t04676946885._1
1581+ let assetBalances = $t04676946885._2
1582+ let lpFee = $t04676946885._3
1583+ let protocolFee = $t04676946885._4
1584+ let sigmaFeePerLpUpdated = $t04676946885._5
15851585 let lpTokensToSend = ((lpTokensToMint - lpFee) - protocolFee)
15861586 let err2 = _validateInt(lpTokensToSend, minLpAmount_, MAX_INT, "deposit: less than min")
15871587 if ((err2 == err2))
16141614 else false
16151615 if ((err == err))
16161616 then {
1617- let $t04834748434 = _withdrawAll(i.payments[0].amount)
1618- let lpTokensToBurn = $t04834748434._1
1619- let balancesToPay = $t04834748434._2
1620- let assetBalances = $t04834748434._3
1617+ let $t04834648433 = _withdrawAll(i.payments[0].amount)
1618+ let lpTokensToBurn = $t04834648433._1
1619+ let balancesToPay = $t04834648433._2
1620+ let assetBalances = $t04834648433._3
16211621 let paymentActions = _getPaymentsFromBalances(assets, balancesToPay, i.caller, lpDecimals)
16221622 let storageUpdated = $Tuple10(storage._1, storage._2, (storage._3 - lpTokensToBurn), storage._4, storage._5, storage._6, storage._7, storage._8, storage._9, storage._10)
16231623 $Tuple2(((([Burn(lpAssetId, lpTokensToBurn)] ++ paymentActions) ++ _saveStorage(storageUpdated)) ++ _saveAssetBalances(assetBalances)), unit)
16511651 else false
16521652 if ((err == err))
16531653 then {
1654- let $t04978849922 = _withdraw(assetId_, i.payments[0].amount)
1655- let targetAmountNormalized = $t04978849922._1
1656- let finalAssetBalances = $t04978849922._2
1657- let lpFee = $t04978849922._3
1658- let protocolFee = $t04978849922._4
1659- let sigmaFeePerLpUpdated = $t04978849922._5
1654+ let $t04978749921 = _withdraw(assetId_, i.payments[0].amount)
1655+ let targetAmountNormalized = $t04978749921._1
1656+ let finalAssetBalances = $t04978749921._2
1657+ let lpFee = $t04978749921._3
1658+ let protocolFee = $t04978749921._4
1659+ let sigmaFeePerLpUpdated = $t04978749921._5
16601660 let finalAmountNormalized = ((targetAmountNormalized - lpFee) - protocolFee)
16611661 let targetDecimals = _getDecimals(assetId_)
16621662 let finalAmount = _normalizeDecimals(finalAmountNormalized, lpDecimals, targetDecimals, DOWN)
17021702 else false
17031703 if ((err == err))
17041704 then {
1705- let $t05203552193 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
1706- let targetAmountNormalized = $t05203552193._1
1707- let finalAssetBalances = $t05203552193._2
1708- let lpFee = $t05203552193._3
1709- let protocolFee = $t05203552193._4
1710- let sigmaFeePerLpUpdated = $t05203552193._5
1705+ let $t05203452192 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
1706+ let targetAmountNormalized = $t05203452192._1
1707+ let finalAssetBalances = $t05203452192._2
1708+ let lpFee = $t05203452192._3
1709+ let protocolFee = $t05203452192._4
1710+ let sigmaFeePerLpUpdated = $t05203452192._5
17111711 let finalAmountNormalized = ((targetAmountNormalized - lpFee) - protocolFee)
17121712 let targetDecimals = _getDecimals(targetAssetId_)
17131713 let finalAmount = _normalizeDecimals(finalAmountNormalized, lpDecimals, targetDecimals, DOWN)
17301730 let err = _validateInt(lpAmount_, 1, MAX_INT, "getDepositAll: invalid amount")
17311731 if ((err == err))
17321732 then {
1733- let $t05331353400 = _depositAll(lpAmount_)
1734- let lpTokensToMint = $t05331353400._1
1735- let requiredAmountsNormalized = $t05331353400._2
1736- let assetBalances = $t05331353400._3
1733+ let $t05331253399 = _depositAll(lpAmount_)
1734+ let lpTokensToMint = $t05331253399._1
1735+ let requiredAmountsNormalized = $t05331253399._2
1736+ let assetBalances = $t05331253399._3
17371737 $Tuple2(nil, $Tuple2(lpTokensToMint, requiredAmountsNormalized))
17381738 }
17391739 else throw("Strict value is not equal to itself.")
17531753 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
17541754 let assetDecimals = _getDecimals(assetId_)
17551755 let amountNormalized = _normalizeDecimals(amount_, assetDecimals, lpDecimals, DOWN)
1756- let $t05415954275 = _deposit(assetId_, amountNormalized)
1757- let lpTokensToMint = $t05415954275._1
1758- let assetBalances = $t05415954275._2
1759- let lpFee = $t05415954275._3
1760- let protocolFee = $t05415954275._4
1761- let sigmaFeePerLpUpdated = $t05415954275._5
1756+ let $t05415854274 = _deposit(assetId_, amountNormalized)
1757+ let lpTokensToMint = $t05415854274._1
1758+ let assetBalances = $t05415854274._2
1759+ let lpFee = $t05415854274._3
1760+ let protocolFee = $t05415854274._4
1761+ let sigmaFeePerLpUpdated = $t05415854274._5
17621762 let lpTokensToSend = ((lpTokensToMint - lpFee) - protocolFee)
17631763 $Tuple2(nil, lpTokensToSend)
17641764 }
17721772 let err = _validateInt(lpAmount_, 0, MAX_INT, "getWithdrawAll: invalid amount")
17731773 if ((err == err))
17741774 then {
1775- let $t05471454790 = _withdrawAll(lpAmount_)
1776- let lpTokensToBurn = $t05471454790._1
1777- let balancesToGet = $t05471454790._2
1778- let assetBalances = $t05471454790._3
1775+ let $t05471354789 = _withdrawAll(lpAmount_)
1776+ let lpTokensToBurn = $t05471354789._1
1777+ let balancesToGet = $t05471354789._2
1778+ let assetBalances = $t05471354789._3
17791779 $Tuple2(nil, balancesToGet)
17801780 }
17811781 else throw("Strict value is not equal to itself.")
17931793 let storage = _loadStorage()
17941794 let lpAssetId = storage._1
17951795 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
1796- let $t05544155557 = _withdraw(assetId_, amount_)
1797- let targetAmountNormalized = $t05544155557._1
1798- let assetBalances = $t05544155557._2
1799- let lpFee = $t05544155557._3
1800- let protocolFee = $t05544155557._4
1801- let sigmaFeePerLpUpdated = $t05544155557._5
1796+ let $t05544055556 = _withdraw(assetId_, amount_)
1797+ let targetAmountNormalized = $t05544055556._1
1798+ let assetBalances = $t05544055556._2
1799+ let lpFee = $t05544055556._3
1800+ let protocolFee = $t05544055556._4
1801+ let sigmaFeePerLpUpdated = $t05544055556._5
18021802 let finalAmountNormalized = ((targetAmountNormalized - lpFee) - protocolFee)
18031803 let targetDecimals = _getDecimals(assetId_)
18041804 let finalAmount = _normalizeDecimals(finalAmountNormalized, lpDecimals, targetDecimals, DOWN)
18271827 else false
18281828 if ((err == err))
18291829 then {
1830- let $t05696757125 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
1831- let targetAmountNormalized = $t05696757125._1
1832- let finalAssetBalances = $t05696757125._2
1833- let lpFee = $t05696757125._3
1834- let protocolFee = $t05696757125._4
1835- let sigmaFeePerLpUpdated = $t05696757125._5
1830+ let $t05696657124 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
1831+ let targetAmountNormalized = $t05696657124._1
1832+ let finalAssetBalances = $t05696657124._2
1833+ let lpFee = $t05696657124._3
1834+ let protocolFee = $t05696657124._4
1835+ let sigmaFeePerLpUpdated = $t05696657124._5
18361836 let finalAmountNormalized = ((targetAmountNormalized - lpFee) - protocolFee)
18371837 let targetDecimals = _getDecimals(targetAssetId_)
18381838 let finalAmount = _normalizeDecimals(finalAmountNormalized, lpDecimals, targetDecimals, DOWN)
18521852 let user = if ((size(user_) > 0))
18531853 then valueOrErrorMessage(addressFromString(user_), "getClaim: invalid user")
18541854 else i.caller
1855- let $t05776757823 = _checkpoint(user)
1856- let checkpointActions = $t05776757823._1
1857- let userProfits = $t05776757823._2
1855+ let $t05776657822 = _checkpoint(user)
1856+ let checkpointActions = $t05776657822._1
1857+ let userProfits = $t05776657822._2
18581858 $Tuple2(nil, userProfits)
18591859 }
18601860
18671867 let weightAmplifier = storage._7
18681868 let slippageRate = storage._8
18691869 let feeMaxRate = storage._9
1870- let $t05815658216 = _loadAssetBalances()
1871- let assetBalances = $t05815658216._1
1872- let assetTotalSupply = $t05815658216._2
1873- let $t05822158274 = _loadAssetWeights()
1874- let assetWeights = $t05822158274._1
1875- let sigmaWeight = $t05822158274._2
1870+ let $t05815558215 = _loadAssetBalances()
1871+ let assetBalances = $t05815558215._1
1872+ let assetTotalSupply = $t05815558215._2
1873+ let $t05822058273 = _loadAssetWeights()
1874+ let assetWeights = $t05822058273._1
1875+ let sigmaWeight = $t05822058273._2
18761876 let fee = _calculateFee(assetBalances, assetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
18771877 let utilValue = (assetTotalSupply - fee)
18781878 $Tuple2(nil, $Tuple2(utilValue, lpTotalSupply))
18861886 let weightAmplifier = storage._7
18871887 let slippageRate = storage._8
18881888 let feeMaxRate = storage._9
1889- let $t05870658766 = _loadAssetBalances()
1890- let assetBalances = $t05870658766._1
1891- let assetTotalSupply = $t05870658766._2
1892- let $t05877158824 = _loadAssetWeights()
1893- let assetWeights = $t05877158824._1
1894- let sigmaWeight = $t05877158824._2
1889+ let $t05870558765 = _loadAssetBalances()
1890+ let assetBalances = $t05870558765._1
1891+ let assetTotalSupply = $t05870558765._2
1892+ let $t05877058823 = _loadAssetWeights()
1893+ let assetWeights = $t05877058823._1
1894+ let sigmaWeight = $t05877058823._2
18951895 let fee = _calculateFee(assetBalances, assetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
18961896 $Tuple2(nil, fee)
18971897 }
19311931 else false
19321932 if ((err1 == err1))
19331933 then {
1934- let $t05983259892 = _checkpoint(i.caller)
1935- let checkpointActions = $t05983259892._1
1936- let userProfits = $t05983259892._2
1934+ let $t05983159891 = _checkpoint(i.caller)
1935+ let checkpointActions = $t05983159891._1
1936+ let userProfits = $t05983159891._2
19371937 $Tuple2(((checkpointActions ++ _saveUserLp(i.caller, (_loadUserLp(i.caller) + i.payments[0].amount))) ++ _saveTotalLp((_loadTotalLp() + i.payments[0].amount))), unit)
19381938 }
19391939 else throw("Strict value is not equal to itself.")
19561956 let err1 = _validateInt(amount_, 0, userLp, "unstake: invalid amount")
19571957 if ((err1 == err1))
19581958 then {
1959- let $t06040360463 = _checkpoint(i.caller)
1960- let checkpointActions = $t06040360463._1
1961- let userProfits = $t06040360463._2
1959+ let $t06040260462 = _checkpoint(i.caller)
1960+ let checkpointActions = $t06040260462._1
1961+ let userProfits = $t06040260462._2
19621962 $Tuple2(((([ScriptTransfer(i.caller, amount_, lpAssetId)] ++ checkpointActions) ++ _saveUserLp(i.caller, (userLp - amount_))) ++ _saveTotalLp((_loadTotalLp() - amount_))), unit)
19631963 }
19641964 else throw("Strict value is not equal to itself.")
19841984 let assets = [lpAssetIdStr, _loadAssets()]
19851985 let maxIndex = (size(assets) - 1)
19861986 let userLp = _loadUserLp(user)
1987- let $t06118661242 = _checkpoint(user)
1988- let checkpointActions = $t06118661242._1
1989- let userProfits = $t06118661242._2
1987+ let $t06118561241 = _checkpoint(user)
1988+ let checkpointActions = $t06118561241._1
1989+ let userProfits = $t06118561241._2
19901990 func foldFunc (acc,profit) = {
19911991 let index = acc._1
19921992 if (if ((maxIndex >= index))
19991999 else $Tuple3((index + 1), (acc._2 :+ profit), acc._3)
20002000 }
20012001
2002- let $t06162061711 = {
2002+ let $t06161961710 = {
20032003 let $l = userProfits
20042004 let $s = size($l)
20052005 let $acc0 = $Tuple3(0, nil, nil)
20132013
20142014 $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)
20152015 }
2016- let idx = $t06162061711._1
2017- let userProfitsUpdated = $t06162061711._2
2018- let profitActions = $t06162061711._3
2016+ let idx = $t06161961710._1
2017+ let userProfitsUpdated = $t06161961710._2
2018+ let profitActions = $t06161961710._3
20192019 $Tuple2(((profitActions ++ removeByIndex(checkpointActions, 0)) ++ _saveUserProfits(user, userProfitsUpdated)), unit)
20202020 }
20212021 else throw("Strict value is not equal to itself.")
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let SEP = "__"
55
66 let WAVES = "waves"
77
88 let MAX_INT = 9223372036854775807
99
1010 let MAX_FEE = 1000000
1111
1212 let MAX_AMPLIFIER = 1000000
1313
1414 let MAX_WEIGHT_AMPLIFIER = 1000000
1515
1616 let MAX_WEIGHT = 1000000
1717
1818 let SLIPPAGE_RATE_FACTOR = 1000000
1919
2020 let FEE_RATE_FACTOR = 1000000
2121
2222 let RATE_FACTOR = 1000000
2323
2424 let PERCENT_FACTOR = toBigInt(1000000000000000000)
2525
2626 let ZERO_INT_LIST_10 = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
2727
2828 let ZERO_INT_LIST_11 = (ZERO_INT_LIST_10 :+ 0)
2929
3030 let ZERO_BIGINT = toBigInt(0)
3131
3232 let ZERO_BIGINT_LIST_11 = [ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT, ZERO_BIGINT]
3333
3434 let INT_DECIMALS = 8
3535
3636 let BIGINT_DECIMALS = 18
3737
3838 let LIST_64 = split_51C("0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0", "_")
3939
4040 let KEY_MULTISIG = "MULTISIG"
4141
4242 let KEY_STATUS = "STATUS"
4343
4444 let KEY_PAUSED = "PAUSED"
4545
4646 let KEY_PAUSER = "PAUSER"
4747
4848 let KEY_STORAGE = "STORAGE"
4949
5050 let KEY_ASSETS = "ASSETS"
5151
5252 let KEY_ASSET_BALANCES = "ASSET_BALANCES"
5353
5454 let KEY_ASSET_WEIGHTS = "ASSET_WEIGHTS"
5555
5656 let KEY_LP_FEE = "LP_FEE"
5757
5858 let KEY_PROTOCOL_FEE = "PROTOCOL_FEE"
5959
6060 let KEY_PRECISION = "PRECISION"
6161
6262 let KEY_SIGMA_FEE_PER_LP = "SIGMA_FEE_PER_LP"
6363
6464 let KEY_USER_SIGMA_FEE_PER_LP = "USER_SIGMA_FEE_PER_LP"
6565
6666 let KEY_USER_LP = "USER_LP"
6767
6868 let KEY_TOTAL_LP = "TOTAL_LP"
6969
7070 let KEY_USER_PROFITS = "USER_PROFITS"
7171
7272 let KEY_WATCHDOG = "WATCHDOG"
7373
7474 let KEY_WATCHDOG_OFFSET = "WATCHDOG_OFFSET"
7575
7676 let KEY_WATCHDOG_HEIGHT = "WATCHDOG_HEIGHT"
7777
7878 func _validateAddress (address_,err_) = match addressFromString(address_) {
7979 case a: Address =>
8080 true
8181 case _ =>
8282 throw(err_)
8383 }
8484
8585
8686 func _validateAsset (assetId_,err_) = if ((assetId_ == WAVES))
8787 then true
8888 else match assetInfo(fromBase58String(assetId_)) {
8989 case a: Asset =>
9090 true
9191 case _ =>
9292 throw(err_)
9393 }
9494
9595
9696 func _validateInt (val_,lowerBoundary_,upperBoundary_,err_) = if (if ((lowerBoundary_ > val_))
9797 then true
9898 else (val_ > upperBoundary_))
9999 then throw(err_)
100100 else true
101101
102102
103103 func _validateBool (val_,target_,err_) = if ((val_ != target_))
104104 then throw(err_)
105105 else true
106106
107107
108108 func _validateStringEqual (val1_,val2_,err_) = if ((val1_ != val2_))
109109 then throw(err_)
110110 else true
111111
112112
113113 func _validateStringNotEq (val1_,val2_,err_) = if ((val1_ == val2_))
114114 then throw(err_)
115115 else true
116116
117117
118118 func _validateIntList (val_,lowerBoundary_,upperBoundary_,err_) = {
119119 func foldFunc (acc,elem) = match parseInt(elem) {
120120 case a: Int =>
121121 if (acc)
122122 then _validateInt(a, lowerBoundary_, upperBoundary_, err_)
123123 else false
124124 case _ =>
125125 throw(err_)
126126 }
127127
128128 let $l = val_
129129 let $s = size($l)
130130 let $acc0 = true
131131 func $f0_1 ($a,$i) = if (($i >= $s))
132132 then $a
133133 else foldFunc($a, $l[$i])
134134
135135 func $f0_2 ($a,$i) = if (($i >= $s))
136136 then $a
137137 else throw("List size exceeds 10")
138138
139139 $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)
140140 }
141141
142142
143143 func _validateAssets (assets_,err_) = {
144144 func foldFunc (acc,elem) = if (acc)
145145 then _validateAsset(elem, err_)
146146 else false
147147
148148 let $l = assets_
149149 let $s = size($l)
150150 let $acc0 = true
151151 func $f0_1 ($a,$i) = if (($i >= $s))
152152 then $a
153153 else foldFunc($a, $l[$i])
154154
155155 func $f0_2 ($a,$i) = if (($i >= $s))
156156 then $a
157157 else throw("List size exceeds 10")
158158
159159 $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)
160160 }
161161
162162
163163 func _validateIntEquals (val1_,val2_,err_) = if ((val1_ != val2_))
164164 then throw(err_)
165165 else true
166166
167167
168168 func _validateTokenName (val_,err_) = if (if ((4 > size(val_)))
169169 then true
170170 else (size(val_) > 16))
171171 then throw(err_)
172172 else true
173173
174174
175175 func _validateTokenDescr (val_,err_) = if ((size(val_) > 1000))
176176 then throw(err_)
177177 else true
178178
179179
180180 func _validateDecimals (val_,err_) = if (if ((0 > val_))
181181 then true
182182 else (val_ > 8))
183183 then throw(err_)
184184 else true
185185
186186
187187 func _validatePayment (payment_,assetId_,requiredAmount_,err_) = match payment_.assetId {
188188 case a: ByteVector =>
189189 if ((assetId_ != toBase58String(a)))
190190 then throw((err_ + ": asset"))
191191 else if ((requiredAmount_ > payment_.amount))
192192 then throw((err_ + ": amount"))
193193 else true
194194 case _ =>
195195 throw((err_ + ": asset"))
196196 }
197197
198198
199199 func _validateListContains (list_,val_,err_) = if (!(containsElement(list_, val_)))
200200 then throw(err_)
201201 else true
202202
203203
204204 func _assetToStr (asset_) = match asset_ {
205205 case a: ByteVector =>
206206 toBase58String(a)
207207 case _ =>
208208 WAVES
209209 }
210210
211211
212212 func _strToAsset (asset_) = if (if ((asset_ == WAVES))
213213 then true
214214 else (asset_ == ""))
215215 then unit
216216 else fromBase58String(asset_)
217217
218218
219219 func _loadPause () = match getBoolean(KEY_PAUSED) {
220220 case a: Boolean =>
221221 a
222222 case _ =>
223223 false
224224 }
225225
226226
227227 func _savePause (isPaused_) = [BooleanEntry(KEY_PAUSED, isPaused_)]
228228
229229
230230 func _loadPauser () = match getString(KEY_PAUSER) {
231231 case a: String =>
232232 addressFromStringValue(a)
233233 case _ =>
234234 Address(base58'')
235235 }
236236
237237
238238 func _savePauser (pauser_) = [StringEntry(KEY_PAUSER, toString(pauser_))]
239239
240240
241241 func _loadMultisig () = match getString(KEY_MULTISIG) {
242242 case a: String =>
243243 addressFromStringValue(a)
244244 case _ =>
245245 Address(base58'')
246246 }
247247
248248
249249 func _saveMultisig (multisig_) = [StringEntry(KEY_MULTISIG, toString(multisig_))]
250250
251251
252252 func _loadStorage () = match getString(KEY_STORAGE) {
253253 case a: String =>
254254 let struct = split(a, SEP)
255255 $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]))
256256 case _ =>
257257 $Tuple10(base58'', false, 0, 0, 0, 0, 0, 0, 0, Address(base58''))
258258 }
259259
260260
261261 func _saveStorage (storage_) = [StringEntry(KEY_STORAGE, makeString([toBase58String(storage_._1), if (storage_._2)
262262 then "1"
263263 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))]
264264
265265
266266 func _loadAssets () = match getString(KEY_ASSETS) {
267267 case a: String =>
268268 if ((size(a) > 0))
269269 then split_51C(a, SEP)
270270 else nil
271271 case _ =>
272272 nil
273273 }
274274
275275
276276 func _saveAssets (assets_) = [StringEntry(KEY_ASSETS, makeString_11C(assets_, SEP))]
277277
278278
279279 func _loadAssetBalances () = {
280280 func foldFunc (acc,elem) = {
281281 let balance = parseIntValue(elem)
282282 $Tuple2((acc._1 :+ balance), (acc._2 + balance))
283283 }
284284
285285 match getString(KEY_ASSET_BALANCES) {
286286 case a: String =>
287287 if ((size(a) > 0))
288288 then {
289289 let $l = split_51C(a, SEP)
290290 let $s = size($l)
291291 let $acc0 = $Tuple2(nil, 0)
292292 func $f0_1 ($a,$i) = if (($i >= $s))
293293 then $a
294294 else foldFunc($a, $l[$i])
295295
296296 func $f0_2 ($a,$i) = if (($i >= $s))
297297 then $a
298298 else throw("List size exceeds 10")
299299
300300 $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)
301301 }
302302 else $Tuple2(ZERO_INT_LIST_10, 0)
303303 case _ =>
304304 $Tuple2(ZERO_INT_LIST_10, 0)
305305 }
306306 }
307307
308308
309309 func _saveAssetBalances (balances_) = {
310310 func foldFunc (acc,elem) = (acc :+ toString(elem))
311311
312312 [StringEntry(KEY_ASSET_BALANCES, makeString_11C({
313313 let $l = balances_
314314 let $s = size($l)
315315 let $acc0 = nil
316316 func $f0_1 ($a,$i) = if (($i >= $s))
317317 then $a
318318 else foldFunc($a, $l[$i])
319319
320320 func $f0_2 ($a,$i) = if (($i >= $s))
321321 then $a
322322 else throw("List size exceeds 10")
323323
324324 $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)
325325 }, SEP))]
326326 }
327327
328328
329329 func _loadAssetWeights () = {
330330 func foldFunc (acc,elem) = {
331331 let weight = parseIntValue(elem)
332332 $Tuple2((acc._1 :+ weight), (acc._2 + weight))
333333 }
334334
335335 match getString(KEY_ASSET_WEIGHTS) {
336336 case a: String =>
337337 if ((size(a) > 0))
338338 then {
339339 let $l = split_51C(a, SEP)
340340 let $s = size($l)
341341 let $acc0 = $Tuple2(nil, 0)
342342 func $f0_1 ($a,$i) = if (($i >= $s))
343343 then $a
344344 else foldFunc($a, $l[$i])
345345
346346 func $f0_2 ($a,$i) = if (($i >= $s))
347347 then $a
348348 else throw("List size exceeds 10")
349349
350350 $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)
351351 }
352352 else $Tuple2(ZERO_INT_LIST_10, 0)
353353 case _ =>
354354 $Tuple2(ZERO_INT_LIST_10, 0)
355355 }
356356 }
357357
358358
359359 func _saveAssetWeights (weights_) = {
360360 func foldFunc (acc,elem) = (acc :+ toString(elem))
361361
362362 [StringEntry(KEY_ASSET_WEIGHTS, makeString_11C({
363363 let $l = weights_
364364 let $s = size($l)
365365 let $acc0 = nil
366366 func $f0_1 ($a,$i) = if (($i >= $s))
367367 then $a
368368 else foldFunc($a, $l[$i])
369369
370370 func $f0_2 ($a,$i) = if (($i >= $s))
371371 then $a
372372 else throw("List size exceeds 10")
373373
374374 $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)
375375 }, SEP))]
376376 }
377377
378378
379379 func _loadLpFee (assetId_) = match getInteger(makeString([KEY_LP_FEE, assetId_], SEP)) {
380380 case a: Int =>
381381 a
382382 case _ =>
383383 0
384384 }
385385
386386
387387 func _saveLpFee (assetId_,val_) = [IntegerEntry(makeString([KEY_LP_FEE, assetId_], SEP), val_)]
388388
389389
390390 func _loadProtocolFee (assetId_) = match getInteger(makeString([KEY_PROTOCOL_FEE, assetId_], SEP)) {
391391 case a: Int =>
392392 a
393393 case _ =>
394394 0
395395 }
396396
397397
398398 func _saveProtocolFee (assetId_,val_) = [IntegerEntry(makeString([KEY_PROTOCOL_FEE, assetId_], SEP), val_)]
399399
400400
401401 func _loadPrecision () = match getInteger(KEY_PRECISION) {
402402 case a: Int =>
403403 a
404404 case _ =>
405405 0
406406 }
407407
408408
409409 func _savePrecision (val_) = [IntegerEntry(KEY_PRECISION, val_)]
410410
411411
412412 func _loadSigmaFeePerLp () = {
413413 func foldFunc (acc,elem) = (acc :+ parseBigIntValue(elem))
414414
415415 match getString(KEY_SIGMA_FEE_PER_LP) {
416416 case a: String =>
417417 if ((size(a) > 0))
418418 then {
419419 let $l = split_51C(a, SEP)
420420 let $s = size($l)
421421 let $acc0 = nil
422422 func $f0_1 ($a,$i) = if (($i >= $s))
423423 then $a
424424 else foldFunc($a, $l[$i])
425425
426426 func $f0_2 ($a,$i) = if (($i >= $s))
427427 then $a
428428 else throw("List size exceeds 11")
429429
430430 $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)
431431 }
432432 else ZERO_BIGINT_LIST_11
433433 case _ =>
434434 ZERO_BIGINT_LIST_11
435435 }
436436 }
437437
438438
439439 func _saveSigmaFeePerLp (val_) = {
440440 func foldFunc (acc,elem) = (acc :+ toString(elem))
441441
442442 [StringEntry(KEY_SIGMA_FEE_PER_LP, makeString_11C({
443443 let $l = val_
444444 let $s = size($l)
445445 let $acc0 = nil
446446 func $f0_1 ($a,$i) = if (($i >= $s))
447447 then $a
448448 else foldFunc($a, $l[$i])
449449
450450 func $f0_2 ($a,$i) = if (($i >= $s))
451451 then $a
452452 else throw("List size exceeds 11")
453453
454454 $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)
455455 }, SEP))]
456456 }
457457
458458
459459 func _loadUserSigmaFeePerLp (user_) = {
460460 func foldFunc (acc,elem) = (acc :+ parseBigIntValue(elem))
461461
462462 match getString(makeString([KEY_USER_SIGMA_FEE_PER_LP, toString(user_)], SEP)) {
463463 case a: String =>
464464 if ((size(a) > 0))
465465 then {
466466 let $l = split_51C(a, SEP)
467467 let $s = size($l)
468468 let $acc0 = nil
469469 func $f0_1 ($a,$i) = if (($i >= $s))
470470 then $a
471471 else foldFunc($a, $l[$i])
472472
473473 func $f0_2 ($a,$i) = if (($i >= $s))
474474 then $a
475475 else throw("List size exceeds 11")
476476
477477 $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)
478478 }
479479 else ZERO_BIGINT_LIST_11
480480 case _ =>
481481 ZERO_BIGINT_LIST_11
482482 }
483483 }
484484
485485
486486 func _saveUserSigmaFeePerLp (user_,val_) = {
487487 func foldFunc (acc,elem) = (acc :+ toString(elem))
488488
489489 [StringEntry(makeString([KEY_USER_SIGMA_FEE_PER_LP, toString(user_)], SEP), makeString_11C({
490490 let $l = val_
491491 let $s = size($l)
492492 let $acc0 = nil
493493 func $f0_1 ($a,$i) = if (($i >= $s))
494494 then $a
495495 else foldFunc($a, $l[$i])
496496
497497 func $f0_2 ($a,$i) = if (($i >= $s))
498498 then $a
499499 else throw("List size exceeds 11")
500500
501501 $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)
502502 }, SEP))]
503503 }
504504
505505
506506 func _loadUserLp (address_) = match getInteger(makeString([KEY_USER_LP, toString(address_)], SEP)) {
507507 case a: Int =>
508508 a
509509 case _ =>
510510 0
511511 }
512512
513513
514514 func _saveUserLp (address_,val_) = [IntegerEntry(makeString([KEY_USER_LP, toString(address_)], SEP), val_)]
515515
516516
517517 func _loadTotalLp () = match getInteger(KEY_TOTAL_LP) {
518518 case a: Int =>
519519 a
520520 case _ =>
521521 0
522522 }
523523
524524
525525 func _saveTotalLp (val_) = [IntegerEntry(KEY_TOTAL_LP, val_)]
526526
527527
528528 func _loadUserProfits (user_) = {
529529 func foldFunc (acc,elem) = (acc :+ parseIntValue(elem))
530530
531531 match getString(makeString([KEY_USER_PROFITS, toString(user_)], SEP)) {
532532 case a: String =>
533533 if ((size(a) > 0))
534534 then {
535535 let $l = split_51C(a, SEP)
536536 let $s = size($l)
537537 let $acc0 = nil
538538 func $f0_1 ($a,$i) = if (($i >= $s))
539539 then $a
540540 else foldFunc($a, $l[$i])
541541
542542 func $f0_2 ($a,$i) = if (($i >= $s))
543543 then $a
544544 else throw("List size exceeds 11")
545545
546546 $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)
547547 }
548548 else ZERO_INT_LIST_11
549549 case _ =>
550550 ZERO_INT_LIST_11
551551 }
552552 }
553553
554554
555555 func _saveUserProfits (user_,val_) = {
556556 func foldFunc (acc,elem) = (acc :+ toString(elem))
557557
558558 [StringEntry(makeString([KEY_USER_PROFITS, toString(user_)], SEP), makeString_11C({
559559 let $l = val_
560560 let $s = size($l)
561561 let $acc0 = nil
562562 func $f0_1 ($a,$i) = if (($i >= $s))
563563 then $a
564564 else foldFunc($a, $l[$i])
565565
566566 func $f0_2 ($a,$i) = if (($i >= $s))
567567 then $a
568568 else throw("List size exceeds 11")
569569
570570 $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)
571571 }, SEP))]
572572 }
573573
574574
575575 func _loadWatchdog () = match getString(KEY_WATCHDOG) {
576576 case a: String =>
577577 addressFromStringValue(a)
578578 case _ =>
579579 Address(base58'')
580580 }
581581
582582
583583 func _saveWatchdog (watchdog_) = [StringEntry(KEY_WATCHDOG, toString(watchdog_))]
584584
585585
586586 func _loadWatchdogOffset () = match getInteger(KEY_WATCHDOG_OFFSET) {
587587 case a: Int =>
588588 a
589589 case _ =>
590590 0
591591 }
592592
593593
594594 func _saveWatchdogOffset (offset_) = [IntegerEntry(KEY_WATCHDOG_OFFSET, offset_)]
595595
596596
597597 func _onlyThisContract (caller_) = if ((caller_ != this))
598598 then throw("_onlyThisContract: revert")
599599 else true
600600
601601
602602 func _whenMultisigSet () = if ((_loadMultisig() == Address(base58'')))
603603 then throw("_whenMultisigSet: revert")
604604 else true
605605
606606
607607 func _whenNotInitialized () = {
608608 let storage = _loadStorage()
609609 if ((storage._1 != base58''))
610610 then throw("_whenNotInitialized: revert")
611611 else true
612612 }
613613
614614
615615 func _whenInitialized () = {
616616 let storage = _loadStorage()
617617 if ((storage._1 == base58''))
618618 then throw("_whenInitialized: revert")
619619 else true
620620 }
621621
622622
623623 func _whenNotPaused () = if (_loadPause())
624624 then throw("_whenNotPaused: revert")
625625 else true
626626
627627
628628 func _whenPaused () = if (!(_loadPause()))
629629 then throw("_whenPaused: revert")
630630 else true
631631
632632
633633 func _onlyPauser (caller_) = if ((caller_ != _loadPauser()))
634634 then throw("_onlyPauser: revert")
635635 else true
636636
637637
638638 func _checkWatchdog () = {
639639 let wd = match getInteger(_loadWatchdog(), KEY_WATCHDOG_HEIGHT) {
640640 case a: Int =>
641641 (a + _loadWatchdogOffset())
642642 case _ =>
643643 0
644644 }
645645 if ((height > wd))
646646 then throw("_checkWatchdog: revert")
647647 else true
648648 }
649649
650650
651651 func _getDecimals (assetId_) = match assetInfo(fromBase58String(assetId_)) {
652652 case a: Asset =>
653653 a.decimals
654654 case _ =>
655655 throw(("_getDecimals: no asset=" + assetId_))
656656 }
657657
658658
659659 func _normalizeDecimals (amount_,sourceDecimals_,targetDecimals_,round_) = if ((sourceDecimals_ >= targetDecimals_))
660660 then fraction(amount_, 1, pow(10, 0, (sourceDecimals_ - targetDecimals_), 0, 0, DOWN), round_)
661661 else (amount_ * pow(10, 0, (targetDecimals_ - sourceDecimals_), 0, 0, DOWN))
662662
663663
664664 func _prepareAssetBalances (assets_) = {
665665 func foldFunc (acc,elem) = (acc :+ 0)
666666
667667 let $l = assets_
668668 let $s = size($l)
669669 let $acc0 = nil
670670 func $f0_1 ($a,$i) = if (($i >= $s))
671671 then $a
672672 else foldFunc($a, $l[$i])
673673
674674 func $f0_2 ($a,$i) = if (($i >= $s))
675675 then $a
676676 else throw("List size exceeds 10")
677677
678678 $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)
679679 }
680680
681681
682682 func _prepareAssetWeights (assetWeights_) = {
683683 func foldFunc (acc,elem) = {
684684 let weight = parseIntValue(elem)
685685 $Tuple2((acc._1 :+ weight), (acc._2 + weight))
686686 }
687687
688688 let $l = assetWeights_
689689 let $s = size($l)
690690 let $acc0 = $Tuple2(nil, 0)
691691 func $f0_1 ($a,$i) = if (($i >= $s))
692692 then $a
693693 else foldFunc($a, $l[$i])
694694
695695 func $f0_2 ($a,$i) = if (($i >= $s))
696696 then $a
697697 else throw("List size exceeds 10")
698698
699699 $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)
700700 }
701701
702702
703703 func _getAssetBalances (assets_,decimals_) = {
704704 func foldFunc (acc,elem) = {
705705 let assetDecimals = _getDecimals(elem)
706706 let balance = _normalizeDecimals(assetBalance(this, fromBase58String(elem)), assetDecimals, decimals_, DOWN)
707707 $Tuple2((acc._1 :+ balance), (acc._2 + balance))
708708 }
709709
710710 let $l = assets_
711711 let $s = size($l)
712712 let $acc0 = $Tuple2(nil, 0)
713713 func $f0_1 ($a,$i) = if (($i >= $s))
714714 then $a
715715 else foldFunc($a, $l[$i])
716716
717717 func $f0_2 ($a,$i) = if (($i >= $s))
718718 then $a
719719 else throw("List size exceeds 10")
720720
721721 $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)
722722 }
723723
724724
725725 func _listIntToString (assets_) = {
726726 func foldFunc (acc,elem) = (acc :+ toString(elem))
727727
728728 makeString({
729729 let $l = assets_
730730 let $s = size($l)
731731 let $acc0 = nil
732732 func $f0_1 ($a,$i) = if (($i >= $s))
733733 then $a
734734 else foldFunc($a, $l[$i])
735735
736736 func $f0_2 ($a,$i) = if (($i >= $s))
737737 then $a
738738 else throw("List size exceeds 11")
739739
740740 $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)
741741 }, SEP)
742742 }
743743
744744
745745 func _listBigIntToString (assets_) = {
746746 func foldFunc (acc,elem) = (acc :+ toString(elem))
747747
748748 makeString({
749749 let $l = assets_
750750 let $s = size($l)
751751 let $acc0 = nil
752752 func $f0_1 ($a,$i) = if (($i >= $s))
753753 then $a
754754 else foldFunc($a, $l[$i])
755755
756756 func $f0_2 ($a,$i) = if (($i >= $s))
757757 then $a
758758 else throw("List size exceeds 11")
759759
760760 $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)
761761 }, SEP)
762762 }
763763
764764
765765 func _getEquilibriums (sigmaBalances_,weights_,sigmaWeight_) = {
766766 func foldFunc (acc,elem) = (acc :+ fraction(sigmaBalances_, elem, sigmaWeight_))
767767
768768 let $l = weights_
769769 let $s = size($l)
770770 let $acc0 = nil
771771 func $f0_1 ($a,$i) = if (($i >= $s))
772772 then $a
773773 else foldFunc($a, $l[$i])
774774
775775 func $f0_2 ($a,$i) = if (($i >= $s))
776776 then $a
777777 else throw("List size exceeds 10")
778778
779779 $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)
780780 }
781781
782782
783783 func _incrementBalancesByAmounts (balances_,amounts_) = {
784784 func foldFunc (acc,elem) = {
785785 let index = acc._1
786786 let amount = amounts_[index]
787787 let newBalance = (elem + amount)
788788 $Tuple3((index + 1), (acc._2 :+ newBalance), (acc._3 + newBalance))
789789 }
790790
791791 let result = {
792792 let $l = balances_
793793 let $s = size($l)
794794 let $acc0 = $Tuple3(0, nil, 0)
795795 func $f0_1 ($a,$i) = if (($i >= $s))
796796 then $a
797797 else foldFunc($a, $l[$i])
798798
799799 func $f0_2 ($a,$i) = if (($i >= $s))
800800 then $a
801801 else throw("List size exceeds 10")
802802
803803 $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)
804804 }
805805 $Tuple2(result._2, result._3)
806806 }
807807
808808
809809 func _incrementBalancesByPayments (balances_,payments_,assets_,decimals_,err_) = {
810810 func foldFunc (acc,elem) = {
811811 let index = acc._1
812812 let payment = payments_[index]
813813 let paymentAssetStr = _assetToStr(payment.assetId)
814814 let err = if ((paymentAssetStr != assets_[index]))
815815 then throw(((err_ + ": index=") + toString(index)))
816816 else unit
817817 if ((err == err))
818818 then {
819819 let assetDecimals = _getDecimals(paymentAssetStr)
820820 let newBalance = (elem + _normalizeDecimals(payments_[index].amount, assetDecimals, decimals_, DOWN))
821821 $Tuple3((index + 1), (acc._2 :+ newBalance), (acc._3 + newBalance))
822822 }
823823 else throw("Strict value is not equal to itself.")
824824 }
825825
826826 let result = {
827827 let $l = balances_
828828 let $s = size($l)
829829 let $acc0 = $Tuple3(0, nil, 0)
830830 func $f0_1 ($a,$i) = if (($i >= $s))
831831 then $a
832832 else foldFunc($a, $l[$i])
833833
834834 func $f0_2 ($a,$i) = if (($i >= $s))
835835 then $a
836836 else throw("List size exceeds 10")
837837
838838 $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)
839839 }
840840 $Tuple2(result._2, result._3)
841841 }
842842
843843
844844 func _incrementBalanceByIndex (balances_,index_,amount_) = {
845845 func foldFunc (acc,elem) = {
846846 let index = acc._1
847847 if ((index == index_))
848848 then $Tuple2((index + 1), (acc._2 :+ (elem + amount_)))
849849 else $Tuple2((index + 1), (acc._2 :+ elem))
850850 }
851851
852852 let result = {
853853 let $l = balances_
854854 let $s = size($l)
855855 let $acc0 = $Tuple2(0, nil)
856856 func $f0_1 ($a,$i) = if (($i >= $s))
857857 then $a
858858 else foldFunc($a, $l[$i])
859859
860860 func $f0_2 ($a,$i) = if (($i >= $s))
861861 then $a
862862 else throw("List size exceeds 10")
863863
864864 $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)
865865 }
866866 result._2
867867 }
868868
869869
870870 func _decrementBalanceByIndex (balances_,index_,amount_) = {
871871 func foldFunc (acc,elem) = {
872872 let index = acc._1
873873 if (if ((index == index_))
874874 then (amount_ > elem)
875875 else false)
876876 then throw("insufficient balance")
877877 else if (if ((index == index_))
878878 then (elem >= amount_)
879879 else false)
880880 then $Tuple2((index + 1), (acc._2 :+ (elem - amount_)))
881881 else $Tuple2((index + 1), (acc._2 :+ elem))
882882 }
883883
884884 let result = {
885885 let $l = balances_
886886 let $s = size($l)
887887 let $acc0 = $Tuple2(0, nil)
888888 func $f0_1 ($a,$i) = if (($i >= $s))
889889 then $a
890890 else foldFunc($a, $l[$i])
891891
892892 func $f0_2 ($a,$i) = if (($i >= $s))
893893 then $a
894894 else throw("List size exceeds 10")
895895
896896 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
897897 }
898898 result._2
899899 }
900900
901901
902902 func _decrementBalancesByLpAmount (balances_,amount_,lpTotalSupply_) = {
903903 let rate = fraction((lpTotalSupply_ - amount_), RATE_FACTOR, lpTotalSupply_, CEILING)
904904 func foldFunc (acc,elem) = {
905905 let newBalance = fraction(elem, rate, RATE_FACTOR, CEILING)
906906 let deltaBalance = (elem - newBalance)
907907 if ((0 > deltaBalance))
908908 then throw("insufficient delta balance")
909909 else $Tuple3((acc._1 :+ newBalance), (acc._2 + newBalance), (acc._3 :+ deltaBalance))
910910 }
911911
912912 let $l = balances_
913913 let $s = size($l)
914914 let $acc0 = $Tuple3(nil, 0, nil)
915915 func $f0_1 ($a,$i) = if (($i >= $s))
916916 then $a
917917 else foldFunc($a, $l[$i])
918918
919919 func $f0_2 ($a,$i) = if (($i >= $s))
920920 then $a
921921 else throw("List size exceeds 10")
922922
923923 $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)
924924 }
925925
926926
927927 func _getPaymentsFromBalances (assets_,balances_,recipient_,sourceDecimals_) = {
928928 func foldFunc (acc,elem) = {
929929 let index = acc._1
930930 $Tuple2((index + 1), (acc._2 :+ ScriptTransfer(recipient_, _normalizeDecimals(balances_[index], sourceDecimals_, _getDecimals(elem), DOWN), _strToAsset(elem))))
931931 }
932932
933933 let result = {
934934 let $l = assets_
935935 let $s = size($l)
936936 let $acc0 = $Tuple2(0, nil)
937937 func $f0_1 ($a,$i) = if (($i >= $s))
938938 then $a
939939 else foldFunc($a, $l[$i])
940940
941941 func $f0_2 ($a,$i) = if (($i >= $s))
942942 then $a
943943 else throw("List size exceeds 10")
944944
945945 $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)
946946 }
947947 result._2
948948 }
949949
950950
951951 func _calculateMicroFee (balance_,equilibrium_,weightAmplifier_,slippageRate_,feeMaxRate_) = if ((equilibrium_ > balance_))
952952 then {
953953 let threshold = fraction(equilibrium_, (MAX_WEIGHT_AMPLIFIER - weightAmplifier_), MAX_WEIGHT_AMPLIFIER)
954954 if ((threshold > balance_))
955955 then {
956956 let maxDeviation = (threshold - balance_)
957957 let feeRate = fraction(fraction(maxDeviation, slippageRate_, SLIPPAGE_RATE_FACTOR), FEE_RATE_FACTOR, equilibrium_)
958958 if ((feeRate > feeMaxRate_))
959959 then fraction(maxDeviation, feeMaxRate_, FEE_RATE_FACTOR)
960960 else fraction(maxDeviation, feeRate, FEE_RATE_FACTOR)
961961 }
962962 else 0
963963 }
964964 else {
965965 let threshold = fraction(equilibrium_, (MAX_WEIGHT_AMPLIFIER + weightAmplifier_), MAX_WEIGHT_AMPLIFIER)
966966 if ((balance_ > threshold))
967967 then {
968968 let maxDeviation = (balance_ - threshold)
969969 let feeRate = fraction(fraction(maxDeviation, slippageRate_, SLIPPAGE_RATE_FACTOR), FEE_RATE_FACTOR, equilibrium_)
970970 if ((feeRate > feeMaxRate_))
971971 then fraction(maxDeviation, feeMaxRate_, FEE_RATE_FACTOR)
972972 else fraction(maxDeviation, feeRate, FEE_RATE_FACTOR)
973973 }
974974 else 0
975975 }
976976
977977
978978 func _calculateFee (balances_,assetsTotalSupply_,weights_,sigmaWeight_,weightAmplifier_,slippageRate_,feeMaxRate_) = 0
979979
980980
981981 func _validateLiquidityInvariant (prevAssetBalances_,prevAssetTotalSupply_,assetBalances_,assetTotalSupply_,prevLpTotalSupply_,lpTotalSupply_,assetWeights_,sigmaWeight_,weightAmplifier_,slippageRate_,feeMaxRate_) = if (if ((prevLpTotalSupply_ == 0))
982982 then true
983983 else (lpTotalSupply_ == 0))
984984 then true
985985 else {
986986 let prevAssetsRate = fraction((prevAssetTotalSupply_ - _calculateFee(prevAssetBalances_, prevAssetTotalSupply_, assetWeights_, sigmaWeight_, weightAmplifier_, slippageRate_, feeMaxRate_)), RATE_FACTOR, prevLpTotalSupply_)
987987 let newAssetsRate = fraction((assetTotalSupply_ - _calculateFee(assetBalances_, assetTotalSupply_, assetWeights_, sigmaWeight_, weightAmplifier_, slippageRate_, feeMaxRate_)), RATE_FACTOR, lpTotalSupply_)
988988 let diff = (newAssetsRate - prevAssetsRate)
989989 if (if ((0 >= diff))
990990 then ((-1 * _loadPrecision()) > diff)
991991 else false)
992992 then throw(("_validateLiquidityInvariant: revert: diff=" + toString(diff)))
993993 else true
994994 }
995995
996996
997997 func _validateSwapInvariant (prevAssetBalances_,prevAssetTotalSupply_,assetBalances_,assetTotalSupply_,assetWeights_,sigmaWeight_,weightAmplifier_,slippageRate_,feeMaxRate_) = {
998998 let prevUtil = (prevAssetTotalSupply_ - _calculateFee(prevAssetBalances_, prevAssetTotalSupply_, assetWeights_, sigmaWeight_, weightAmplifier_, slippageRate_, feeMaxRate_))
999999 let newUtil = (assetTotalSupply_ - _calculateFee(assetBalances_, assetTotalSupply_, assetWeights_, sigmaWeight_, weightAmplifier_, slippageRate_, feeMaxRate_))
10001000 let diff = (newUtil - prevUtil)
10011001 if (if ((0 >= diff))
10021002 then ((-1 * _loadPrecision()) > diff)
10031003 else false)
10041004 then throw(("_validateSwapInvariant: revert: diff=" + toString(diff)))
10051005 else true
10061006 }
10071007
10081008
10091009 func _validateAssetAllocation (balance_,assetTotalSupply_,prevBalance_,prevAssetTotalSupply_,weight_,sigmaWeight_,maxAllocAmp_) = {
10101010 let equilibrium = fraction(assetTotalSupply_, weight_, sigmaWeight_)
10111011 let maxAllocationAmp = if ((balance_ > equilibrium))
10121012 then (MAX_AMPLIFIER + maxAllocAmp_)
10131013 else (MAX_AMPLIFIER - maxAllocAmp_)
10141014 let maxAllocation = fraction(equilibrium, maxAllocationAmp, MAX_AMPLIFIER)
10151015 let prevMaxAllocation = fraction(fraction(prevAssetTotalSupply_, weight_, sigmaWeight_), maxAllocationAmp, MAX_AMPLIFIER)
10161016 if ((balance_ > equilibrium))
10171017 then if ((balance_ > maxAllocation))
10181018 then if ((prevMaxAllocation > prevBalance_))
10191019 then throw("_validateAssetAllocation: new up")
10201020 else if (((balance_ - maxAllocation) > (prevBalance_ - prevMaxAllocation)))
10211021 then throw("_validateAssetAllocation: still up")
10221022 else true
10231023 else true
10241024 else if ((maxAllocation > balance_))
10251025 then if ((prevBalance_ > prevMaxAllocation))
10261026 then throw("_validateAssetAllocation: new down")
10271027 else if (((maxAllocation - balance_) > (prevMaxAllocation - prevBalance_)))
10281028 then throw("_validateAssetAllocation: still down")
10291029 else true
10301030 else true
10311031 }
10321032
10331033
10341034 func _validateAllocation (assetBalances_,assetTotalSupply_,prevAssetBalances_,prevAssetTotalSupply_,assetWeights_,sigmaWeight_,maxAllocAmp_) = true
10351035
10361036
10371037 func _checkpoint (user_) = {
10381038 let userLp = _loadUserLp(user_)
10391039 let userProfits = _loadUserProfits(user_)
10401040 let sigmaFeePerLp = _loadSigmaFeePerLp()
10411041 let userSigmaFeePerLp = _loadUserSigmaFeePerLp(user_)
10421042 func foldFunc (acc,elem) = {
10431043 let index = acc._1
10441044 let profitUpdated = (userProfits[index] + toInt(fraction(toBigInt(userLp), (sigmaFeePerLp[index] - userSigmaFeePerLp[index]), PERCENT_FACTOR)))
10451045 $Tuple2((index + 1), (acc._2 :+ profitUpdated))
10461046 }
10471047
1048- let $t02577125844 = {
1048+ let $t02577025843 = {
10491049 let $l = ZERO_INT_LIST_11
10501050 let $s = size($l)
10511051 let $acc0 = $Tuple2(0, nil)
10521052 func $f0_1 ($a,$i) = if (($i >= $s))
10531053 then $a
10541054 else foldFunc($a, $l[$i])
10551055
10561056 func $f0_2 ($a,$i) = if (($i >= $s))
10571057 then $a
10581058 else throw("List size exceeds 11")
10591059
10601060 $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)
10611061 }
1062- let idx = $t02577125844._1
1063- let profitsUpdated = $t02577125844._2
1062+ let idx = $t02577025843._1
1063+ let profitsUpdated = $t02577025843._2
10641064 $Tuple2((_saveUserProfits(user_, profitsUpdated) ++ _saveUserSigmaFeePerLp(user_, sigmaFeePerLp)), profitsUpdated)
10651065 }
10661066
10671067
10681068 func _updateSigmaFeePerLp (sigmaFeePerLp_,totalLp_,index_,lpFee_) = {
10691069 func foldFunc (acc,elem) = {
10701070 let index = acc._1
10711071 let sigmaFeePerLpUpdated = if ((index_ == index))
10721072 then (sigmaFeePerLp_[index] + fraction(toBigInt(lpFee_), PERCENT_FACTOR, toBigInt(totalLp_)))
10731073 else sigmaFeePerLp_[index]
10741074 $Tuple2((index + 1), (acc._2 :+ sigmaFeePerLpUpdated))
10751075 }
10761076
1077- let $t02649426573 = {
1077+ let $t02649326572 = {
10781078 let $l = ZERO_INT_LIST_11
10791079 let $s = size($l)
10801080 let $acc0 = $Tuple2(0, nil)
10811081 func $f0_1 ($a,$i) = if (($i >= $s))
10821082 then $a
10831083 else foldFunc($a, $l[$i])
10841084
10851085 func $f0_2 ($a,$i) = if (($i >= $s))
10861086 then $a
10871087 else throw("List size exceeds 11")
10881088
10891089 $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)
10901090 }
1091- let idx = $t02649426573._1
1092- let sigmaFeePerLpUpdated = $t02649426573._2
1091+ let idx = $t02649326572._1
1092+ let sigmaFeePerLpUpdated = $t02649326572._2
10931093 sigmaFeePerLpUpdated
10941094 }
10951095
10961096
10971097 func _calculateLpAndProtocolFees (assetIndex_,amount_,lpFeeRate_,protocolFeeRate_) = {
10981098 let sigmaFeePerLp = _loadSigmaFeePerLp()
10991099 let totalLp = _loadTotalLp()
1100- let $t02679427069 = if ((totalLp == 0))
1100+ let $t02679327068 = if ((totalLp == 0))
11011101 then $Tuple2(0, fraction(amount_, protocolFeeRate_, MAX_FEE))
11021102 else $Tuple2(fraction(amount_, lpFeeRate_, MAX_FEE), fraction(amount_, protocolFeeRate_, MAX_FEE))
1103- let lpFee = $t02679427069._1
1104- let protocolFee = $t02679427069._2
1103+ let lpFee = $t02679327068._1
1104+ let protocolFee = $t02679327068._2
11051105 let sigmaFeePerLpUpdated = if ((lpFee == 0))
11061106 then sigmaFeePerLp
11071107 else _updateSigmaFeePerLp(sigmaFeePerLp, totalLp, assetIndex_, lpFee)
11081108 $Tuple3(lpFee, protocolFee, sigmaFeePerLpUpdated)
11091109 }
11101110
11111111
11121112 func _depositAll (amount_) = {
11131113 let storage = _loadStorage()
11141114 let lpTotalSupply = storage._3
11151115 let weightAmplifier = storage._7
11161116 let slippageRate = storage._8
11171117 let feeMaxRate = storage._9
11181118 let assets = _loadAssets()
1119- let $t02757827631 = _loadAssetWeights()
1120- let assetWeights = $t02757827631._1
1121- let sigmaWeight = $t02757827631._2
1122- let $t02763627704 = _loadAssetBalances()
1123- let prevAssetBalances = $t02763627704._1
1124- let prevAssetTotalSupply = $t02763627704._2
1125- let $t02771028940 = if ((prevAssetTotalSupply == 0))
1119+ let $t02757727630 = _loadAssetWeights()
1120+ let assetWeights = $t02757727630._1
1121+ let sigmaWeight = $t02757727630._2
1122+ let $t02763527703 = _loadAssetBalances()
1123+ let prevAssetBalances = $t02763527703._1
1124+ let prevAssetTotalSupply = $t02763527703._2
1125+ let $t02770928939 = if ((prevAssetTotalSupply == 0))
11261126 then {
11271127 func foldFunc (acc,elem) = {
11281128 let index = acc._1
11291129 let requiredAmountNormalized = fraction(assetWeights[index], amount_, sigmaWeight)
11301130 $Tuple2((index + 1), (acc._2 :+ requiredAmountNormalized))
11311131 }
11321132
1133- let $t02815228226 = {
1133+ let $t02815128225 = {
11341134 let $l = assets
11351135 let $s = size($l)
11361136 let $acc0 = $Tuple2(0, nil)
11371137 func $f0_1 ($a,$i) = if (($i >= $s))
11381138 then $a
11391139 else foldFunc($a, $l[$i])
11401140
11411141 func $f0_2 ($a,$i) = if (($i >= $s))
11421142 then $a
11431143 else throw("List size exceeds 10")
11441144
11451145 $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)
11461146 }
1147- let idx = $t02815228226._1
1148- let requiredAmountsNormalized = $t02815228226._2
1147+ let idx = $t02815128225._1
1148+ let requiredAmountsNormalized = $t02815128225._2
11491149 $Tuple2(amount_, requiredAmountsNormalized)
11501150 }
11511151 else {
11521152 let ratio = fraction(toBigInt(amount_), PERCENT_FACTOR, toBigInt(prevAssetTotalSupply))
11531153 func foldFunc1 (acc,elem) = {
11541154 let index = acc._1
11551155 let requiredAmountNormalized = toInt(fraction(ratio, toBigInt(prevAssetBalances[index]), PERCENT_FACTOR))
11561156 $Tuple2((index + 1), (acc._2 :+ requiredAmountNormalized))
11571157 }
11581158
1159- let $t02876928844 = {
1159+ let $t02876828843 = {
11601160 let $l = assets
11611161 let $s = size($l)
11621162 let $acc0 = $Tuple2(0, nil)
11631163 func $f0_1 ($a,$i) = if (($i >= $s))
11641164 then $a
11651165 else foldFunc1($a, $l[$i])
11661166
11671167 func $f0_2 ($a,$i) = if (($i >= $s))
11681168 then $a
11691169 else throw("List size exceeds 10")
11701170
11711171 $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)
11721172 }
1173- let idx = $t02876928844._1
1174- let requiredAmountsNormalized = $t02876928844._2
1173+ let idx = $t02876828843._1
1174+ let requiredAmountsNormalized = $t02876828843._2
11751175 $Tuple2(fraction(amount_, lpTotalSupply, prevAssetTotalSupply), requiredAmountsNormalized)
11761176 }
1177- let lpTokensToMint = $t02771028940._1
1178- let requiredAmountsNormalized = $t02771028940._2
1179- let $t02894629059 = _incrementBalancesByAmounts(prevAssetBalances, requiredAmountsNormalized)
1180- let assetBalances = $t02894629059._1
1181- let assetTotalSupply = $t02894629059._2
1177+ let lpTokensToMint = $t02770928939._1
1178+ let requiredAmountsNormalized = $t02770928939._2
1179+ let $t02894529058 = _incrementBalancesByAmounts(prevAssetBalances, requiredAmountsNormalized)
1180+ let assetBalances = $t02894529058._1
1181+ let assetTotalSupply = $t02894529058._2
11821182 let err2 = _validateLiquidityInvariant(prevAssetBalances, prevAssetTotalSupply, assetBalances, assetTotalSupply, lpTotalSupply, (lpTotalSupply + lpTokensToMint), assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
11831183 if ((err2 == err2))
11841184 then $Tuple3(lpTokensToMint, requiredAmountsNormalized, assetBalances)
11851185 else throw("Strict value is not equal to itself.")
11861186 }
11871187
11881188
11891189 func _deposit (assetId_,amount_) = {
11901190 let storage = _loadStorage()
11911191 let lpTotalSupply = storage._3
11921192 let lpFeeRate = storage._4
11931193 let protocolFeeRate = storage._5
11941194 let maxAllocAmplifier = storage._6
11951195 let weightAmplifier = storage._7
11961196 let slippageRate = storage._8
11971197 let feeMaxRate = storage._9
11981198 let assets = _loadAssets()
1199- let $t02982229875 = _loadAssetWeights()
1200- let assetWeights = $t02982229875._1
1201- let sigmaWeight = $t02982229875._2
1202- let $t02988029994 = _loadAssetBalances()
1203- let prevAssetBalances = $t02988029994._1
1204- let prevAssetTotalSupply = $t02988029994._2
1199+ let $t02982129874 = _loadAssetWeights()
1200+ let assetWeights = $t02982129874._1
1201+ let sigmaWeight = $t02982129874._2
1202+ let $t02987929993 = _loadAssetBalances()
1203+ let prevAssetBalances = $t02987929993._1
1204+ let prevAssetTotalSupply = $t02987929993._2
12051205 let assetBalances = _incrementBalanceByIndex(prevAssetBalances, value(indexOf(assets, assetId_)), amount_)
12061206 let assetTotalSupply = (prevAssetTotalSupply + amount_)
12071207 let err2 = _validateAllocation(assetBalances, assetTotalSupply, prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, maxAllocAmplifier)
12081208 if ((err2 == err2))
12091209 then {
12101210 let prevFee = _calculateFee(prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
12111211 let fee = _calculateFee(assetBalances, assetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
12121212 let lpTokensToMint = if ((lpTotalSupply == 0))
12131213 then throw("_deposit: empty pool")
12141214 else {
12151215 let assetDiff = (assetTotalSupply - prevAssetTotalSupply)
12161216 let feeDiff = (fee - prevFee)
12171217 let utilityChangeFactor = fraction((assetDiff - feeDiff), RATE_FACTOR, (prevAssetTotalSupply - prevFee))
12181218 let lpTokensToMintInner = fraction(lpTotalSupply, utilityChangeFactor, RATE_FACTOR)
12191219 let err3 = _validateLiquidityInvariant(prevAssetBalances, prevAssetTotalSupply, assetBalances, assetTotalSupply, lpTotalSupply, (lpTotalSupply + lpTokensToMintInner), assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
12201220 if ((err3 == err3))
12211221 then lpTokensToMintInner
12221222 else throw("Strict value is not equal to itself.")
12231223 }
1224- let $t03165631787 = _calculateLpAndProtocolFees(0, lpTokensToMint, (lpFeeRate / 2), (protocolFeeRate / 2))
1225- let lpFee = $t03165631787._1
1226- let protocolFee = $t03165631787._2
1227- let sigmaFeePerLpUpdated = $t03165631787._3
1224+ let $t03165531786 = _calculateLpAndProtocolFees(0, lpTokensToMint, (lpFeeRate / 2), (protocolFeeRate / 2))
1225+ let lpFee = $t03165531786._1
1226+ let protocolFee = $t03165531786._2
1227+ let sigmaFeePerLpUpdated = $t03165531786._3
12281228 $Tuple5(lpTokensToMint, assetBalances, lpFee, protocolFee, sigmaFeePerLpUpdated)
12291229 }
12301230 else throw("Strict value is not equal to itself.")
12311231 }
12321232
12331233
12341234 func _withdrawAll (amount_) = {
12351235 let storage = _loadStorage()
12361236 let lpTotalSupply = storage._3
12371237 let maxAllocAmplifier = storage._6
12381238 let weightAmplifier = storage._7
12391239 let slippageRate = storage._8
12401240 let feeMaxRate = storage._9
1241- let $t03212132189 = _loadAssetBalances()
1242- let prevAssetBalances = $t03212132189._1
1243- let prevAssetTotalSupply = $t03212132189._2
1244- let $t03219432247 = _loadAssetWeights()
1245- let assetWeights = $t03219432247._1
1246- let sigmaWeight = $t03219432247._2
1241+ let $t03212032188 = _loadAssetBalances()
1242+ let prevAssetBalances = $t03212032188._1
1243+ let prevAssetTotalSupply = $t03212032188._2
1244+ let $t03219332246 = _loadAssetWeights()
1245+ let assetWeights = $t03219332246._1
1246+ let sigmaWeight = $t03219332246._2
12471247 let lpTokensToBurn = amount_
12481248 let err = _validateInt(lpTokensToBurn, 0, MAX_INT, "_withdrawAll: lpTokensToBurn less than 0")
12491249 if ((err == err))
12501250 then {
1251- let $t03238932522 = _decrementBalancesByLpAmount(prevAssetBalances, lpTokensToBurn, lpTotalSupply)
1252- let assetBalances = $t03238932522._1
1253- let assetTotalSupply = $t03238932522._2
1254- let balancesToPay = $t03238932522._3
1251+ let $t03238832521 = _decrementBalancesByLpAmount(prevAssetBalances, lpTokensToBurn, lpTotalSupply)
1252+ let assetBalances = $t03238832521._1
1253+ let assetTotalSupply = $t03238832521._2
1254+ let balancesToPay = $t03238832521._3
12551255 let err2 = _validateLiquidityInvariant(prevAssetBalances, prevAssetTotalSupply, assetBalances, assetTotalSupply, lpTotalSupply, (lpTotalSupply - lpTokensToBurn), assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
12561256 if ((err2 == err2))
12571257 then $Tuple3(lpTokensToBurn, balancesToPay, assetBalances)
12581258 else throw("Strict value is not equal to itself.")
12591259 }
12601260 else throw("Strict value is not equal to itself.")
12611261 }
12621262
12631263
12641264 func _withdraw (assetId_,lpAmount_) = {
12651265 let storage = _loadStorage()
12661266 let lpTotalSupply = storage._3
12671267 let lpFeeRate = storage._4
12681268 let protocolFeeRate = storage._5
12691269 let maxAllocAmplifier = storage._6
12701270 let weightAmplifier = storage._7
12711271 let slippageRate = storage._8
12721272 let feeMaxRate = storage._9
12731273 let precision = _loadPrecision()
12741274 let assets = _loadAssets()
1275- let $t03331433382 = _loadAssetBalances()
1276- let prevAssetBalances = $t03331433382._1
1277- let prevAssetTotalSupply = $t03331433382._2
1278- let $t03338733440 = _loadAssetWeights()
1279- let assetWeights = $t03338733440._1
1280- let sigmaWeight = $t03338733440._2
1275+ let $t03331333381 = _loadAssetBalances()
1276+ let prevAssetBalances = $t03331333381._1
1277+ let prevAssetTotalSupply = $t03331333381._2
1278+ let $t03338633439 = _loadAssetWeights()
1279+ let assetWeights = $t03338633439._1
1280+ let sigmaWeight = $t03338633439._2
12811281 let targetAssetIndex = value(indexOf(assets, assetId_))
12821282 let prevFee = _calculateFee(prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
12831283 let prevUtilValue = (prevAssetTotalSupply - prevFee)
12841284 let k = fraction(toBigInt((lpTotalSupply - lpAmount_)), PERCENT_FACTOR, toBigInt(lpTotalSupply))
12851285 let prevUtilValueWithK = toInt(fraction(toBigInt(prevUtilValue), k, PERCENT_FACTOR))
12861286 let prevUtilValueDivLp = fraction(toBigInt(prevUtilValue), PERCENT_FACTOR, toBigInt(lpTotalSupply), CEILING)
12871287 func foldFunc (acc,elem) = if (acc._1)
12881288 then acc
12891289 else {
12901290 let startInner = acc._2
12911291 let stopInner = acc._3
12921292 let currentAmount = ((stopInner + startInner) / 2)
12931293 let tempAssetBalances = _decrementBalanceByIndex(prevAssetBalances, targetAssetIndex, currentAmount)
12941294 let tempAssetTotalSupply = (prevAssetTotalSupply - currentAmount)
12951295 let utilValue = (tempAssetTotalSupply - _calculateFee(tempAssetBalances, tempAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate))
12961296 if (if (((utilValue - prevUtilValueWithK) > (-1 * precision)))
12971297 then (precision > (utilValue - prevUtilValueWithK))
12981298 else false)
12991299 then $Tuple5(true, startInner, stopInner, currentAmount, (utilValue - prevUtilValueWithK))
13001300 else if ((0 > (utilValue - prevUtilValueWithK)))
13011301 then $Tuple5(false, startInner, currentAmount, currentAmount, (utilValue - prevUtilValueWithK))
13021302 else $Tuple5(false, currentAmount, stopInner, currentAmount, (utilValue - prevUtilValueWithK))
13031303 }
13041304
13051305 let targetAmount = {
13061306 let stop = toInt(fraction(toBigInt((lpAmount_ + prevFee)), prevUtilValueDivLp, PERCENT_FACTOR, CEILING))
1307- let $t03530635418 = {
1307+ let $t03530535417 = {
13081308 let $l = LIST_64
13091309 let $s = size($l)
13101310 let $acc0 = $Tuple5(false, 0, stop, 0, 0)
13111311 func $f0_1 ($a,$i) = if (($i >= $s))
13121312 then $a
13131313 else foldFunc($a, $l[$i])
13141314
13151315 func $f0_2 ($a,$i) = if (($i >= $s))
13161316 then $a
13171317 else throw("List size exceeds 64")
13181318
13191319 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63), 64)
13201320 }
1321- let success = $t03530635418._1
1322- let startOut = $t03530635418._2
1323- let stopOut = $t03530635418._3
1324- let targetAmountOut = $t03530635418._4
1325- let diffOut = $t03530635418._5
1321+ let success = $t03530535417._1
1322+ let startOut = $t03530535417._2
1323+ let stopOut = $t03530535417._3
1324+ let targetAmountOut = $t03530535417._4
1325+ let diffOut = $t03530535417._5
13261326 if (!(success))
13271327 then throw(((("_withdraw: can't calculate targetAmount=" + toString(targetAmountOut)) + ",diff=") + toString(diffOut)))
13281328 else targetAmountOut
13291329 }
13301330 let finalAssetBalances = _decrementBalanceByIndex(prevAssetBalances, targetAssetIndex, targetAmount)
13311331 let finalAssetTotalSupply = (prevAssetTotalSupply - targetAmount)
13321332 let err1 = if (_validateAllocation(finalAssetBalances, finalAssetTotalSupply, prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, maxAllocAmplifier))
13331333 then _validateLiquidityInvariant(prevAssetBalances, prevAssetTotalSupply, finalAssetBalances, finalAssetTotalSupply, lpTotalSupply, (lpTotalSupply - lpAmount_), assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
13341334 else false
13351335 if ((err1 == err1))
13361336 then {
1337- let $t03641036558 = _calculateLpAndProtocolFees((targetAssetIndex + 1), targetAmount, (lpFeeRate / 2), (protocolFeeRate / 2))
1338- let lpFee = $t03641036558._1
1339- let protocolFee = $t03641036558._2
1340- let sigmaFeePerLpUpdated = $t03641036558._3
1337+ let $t03640936557 = _calculateLpAndProtocolFees((targetAssetIndex + 1), targetAmount, (lpFeeRate / 2), (protocolFeeRate / 2))
1338+ let lpFee = $t03640936557._1
1339+ let protocolFee = $t03640936557._2
1340+ let sigmaFeePerLpUpdated = $t03640936557._3
13411341 $Tuple5(targetAmount, finalAssetBalances, lpFee, protocolFee, sigmaFeePerLpUpdated)
13421342 }
13431343 else throw("Strict value is not equal to itself.")
13441344 }
13451345
13461346
13471347 func _swap (sourceAssetIndex_,targetAssetIndex_,sourceAmount_) = {
13481348 let storage = _loadStorage()
13491349 let lpAssetId = storage._1
13501350 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
13511351 let lpTotalSupply = storage._3
13521352 let lpFeeRate = storage._4
13531353 let protocolFeeRate = storage._5
13541354 let maxAllocAmplifier = storage._6
13551355 let weightAmplifier = storage._7
13561356 let slippageRate = storage._8
13571357 let feeMaxRate = storage._9
13581358 let precision = _loadPrecision()
1359- let $t03714037208 = _loadAssetBalances()
1360- let prevAssetBalances = $t03714037208._1
1361- let prevAssetTotalSupply = $t03714037208._2
1362- let $t03721337266 = _loadAssetWeights()
1363- let assetWeights = $t03721337266._1
1364- let sigmaWeight = $t03721337266._2
1359+ let $t03713937207 = _loadAssetBalances()
1360+ let prevAssetBalances = $t03713937207._1
1361+ let prevAssetTotalSupply = $t03713937207._2
1362+ let $t03721237265 = _loadAssetWeights()
1363+ let assetWeights = $t03721237265._1
1364+ let sigmaWeight = $t03721237265._2
13651365 let assetBalances = _incrementBalanceByIndex(prevAssetBalances, sourceAssetIndex_, sourceAmount_)
13661366 let assetTotalSupply = (prevAssetTotalSupply + sourceAmount_)
13671367 let prevFee = _calculateFee(prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
13681368 let prevUtilValue = (prevAssetTotalSupply - prevFee)
13691369 func foldFunc (acc,elem) = if (acc._1)
13701370 then acc
13711371 else {
13721372 let startInner = acc._2
13731373 let stopInner = acc._3
13741374 let currentAmount = ((stopInner + startInner) / 2)
13751375 let tempAssetBalances = _decrementBalanceByIndex(assetBalances, targetAssetIndex_, currentAmount)
13761376 let tempAssetTotalSupply = (assetTotalSupply - currentAmount)
13771377 let utilValue = (tempAssetTotalSupply - _calculateFee(tempAssetBalances, tempAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate))
13781378 if (if (((utilValue - prevUtilValue) > (-1 * precision)))
13791379 then (precision > (utilValue - prevUtilValue))
13801380 else false)
13811381 then $Tuple5(true, startInner, stopInner, currentAmount, (utilValue - prevUtilValue))
13821382 else if ((0 > (utilValue - prevUtilValue)))
13831383 then $Tuple5(false, startInner, currentAmount, currentAmount, (utilValue - prevUtilValue))
13841384 else $Tuple5(false, currentAmount, stopInner, currentAmount, (utilValue - prevUtilValue))
13851385 }
13861386
13871387 let targetAmount = {
13881388 let targetAmount = sourceAmount_
13891389 let tempAssetBalances = _decrementBalanceByIndex(assetBalances, targetAssetIndex_, targetAmount)
13901390 let tempAssetTotalSupply = (assetTotalSupply - targetAmount)
13911391 let fee = _calculateFee(tempAssetBalances, tempAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
13921392 let feeDiff = (fee - prevFee)
13931393 if ((feeDiff == 0))
13941394 then targetAmount
13951395 else {
1396- let $t03923939370 = {
1396+ let $t03923839369 = {
13971397 let $l = LIST_64
13981398 let $s = size($l)
13991399 let $acc0 = $Tuple5(false, 0, (sourceAmount_ + prevFee), 0, 0)
14001400 func $f0_1 ($a,$i) = if (($i >= $s))
14011401 then $a
14021402 else foldFunc($a, $l[$i])
14031403
14041404 func $f0_2 ($a,$i) = if (($i >= $s))
14051405 then $a
14061406 else throw("List size exceeds 64")
14071407
14081408 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63), 64)
14091409 }
1410- let success = $t03923939370._1
1411- let startOut = $t03923939370._2
1412- let stopOut = $t03923939370._3
1413- let targetAmountOut = $t03923939370._4
1414- let diffOut = $t03923939370._5
1410+ let success = $t03923839369._1
1411+ let startOut = $t03923839369._2
1412+ let stopOut = $t03923839369._3
1413+ let targetAmountOut = $t03923839369._4
1414+ let diffOut = $t03923839369._5
14151415 if (!(success))
14161416 then throw(((("_swap: can't calculate targetAmount=" + toString(targetAmountOut)) + ",diff=") + toString(diffOut)))
14171417 else targetAmountOut
14181418 }
14191419 }
14201420 let finalAssetBalances = _decrementBalanceByIndex(assetBalances, targetAssetIndex_, targetAmount)
14211421 let finalAssetTotalSupply = (assetTotalSupply - targetAmount)
14221422 let err1 = if (_validateAllocation(finalAssetBalances, finalAssetTotalSupply, prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, maxAllocAmplifier))
14231423 then _validateSwapInvariant(prevAssetBalances, prevAssetTotalSupply, finalAssetBalances, finalAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
14241424 else false
14251425 if ((err1 == err1))
14261426 then {
1427- let $t04021740358 = _calculateLpAndProtocolFees((targetAssetIndex_ + 1), targetAmount, lpFeeRate, protocolFeeRate)
1428- let lpFee = $t04021740358._1
1429- let protocolFee = $t04021740358._2
1430- let sigmaFeePerLpUpdated = $t04021740358._3
1427+ let $t04021640357 = _calculateLpAndProtocolFees((targetAssetIndex_ + 1), targetAmount, lpFeeRate, protocolFeeRate)
1428+ let lpFee = $t04021640357._1
1429+ let protocolFee = $t04021640357._2
1430+ let sigmaFeePerLpUpdated = $t04021640357._3
14311431 $Tuple5(targetAmount, finalAssetBalances, lpFee, protocolFee, sigmaFeePerLpUpdated)
14321432 }
14331433 else throw("Strict value is not equal to itself.")
14341434 }
14351435
14361436
14371437 @Callable(i)
14381438 func init (assets_,assetWeights_,lpFeeRate_,protocolFeeRate_,lpTokenName_,lpTokenDescr_,lpTokenDecimals_,maxAllocationAmplifier_,weightAmplifier_,slippageRate_,feeMaxRate_,protocolFeeContract_,precision_,pauser_) = {
14391439 let err = if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (_onlyThisContract(i.caller))
14401440 then _whenNotInitialized()
14411441 else false)
14421442 then _whenMultisigSet()
14431443 else false)
14441444 then _validateAssets(assets_, "init: invalid assets")
14451445 else false)
14461446 then _validateIntList(assetWeights_, 1, MAX_WEIGHT, "init: invalid assetWeights")
14471447 else false)
14481448 then _validateIntEquals(size(assets_), size(assetWeights_), "init: invalid assetWeights size")
14491449 else false)
14501450 then _validateInt(lpFeeRate_, 0, MAX_FEE, "init: invalid lp fee")
14511451 else false)
14521452 then _validateInt(protocolFeeRate_, 0, MAX_FEE, "init: invalid protocol fee")
14531453 else false)
14541454 then _validateTokenName(lpTokenName_, "init: invalid name")
14551455 else false)
14561456 then _validateTokenDescr(lpTokenDescr_, "init: invalid descr")
14571457 else false)
14581458 then _validateDecimals(lpTokenDecimals_, "init: invalid decimals")
14591459 else false)
14601460 then _validateInt(maxAllocationAmplifier_, 0, MAX_AMPLIFIER, "init: invalid maxAllocationAmplifier")
14611461 else false)
14621462 then _validateInt(weightAmplifier_, 0, maxAllocationAmplifier_, "init: invalid weightAmplifier")
14631463 else false)
14641464 then _validateInt(slippageRate_, 0, MAX_INT, "init: invalid slippageRate")
14651465 else false)
14661466 then _validateInt(feeMaxRate_, 0, MAX_INT, "init: invalid feeMaxRate")
14671467 else false)
14681468 then _validateAddress(protocolFeeContract_, "init: invalid protocolFeeContract")
14691469 else false)
14701470 then _validateInt(precision_, 1, MAX_INT, "init: invalid precision")
14711471 else false)
14721472 then _validateAddress(pauser_, "init: invalid pauser")
14731473 else false
14741474 if ((err == err))
14751475 then {
1476- let $t04222142290 = _prepareAssetWeights(assetWeights_)
1477- let assetWeights = $t04222142290._1
1478- let sigmaWeight = $t04222142290._2
1476+ let $t04222042289 = _prepareAssetWeights(assetWeights_)
1477+ let assetWeights = $t04222042289._1
1478+ let sigmaWeight = $t04222042289._2
14791479 let assetBalances = _prepareAssetBalances(assets_)
14801480 let issue = Issue(lpTokenName_, lpTokenDescr_, 0, lpTokenDecimals_, true)
14811481 let lpAssetId = calculateAssetId(issue)
14821482 let storageUpdated = $Tuple10(lpAssetId, true, 0, lpFeeRate_, protocolFeeRate_, maxAllocationAmplifier_, weightAmplifier_, slippageRate_, feeMaxRate_, addressFromStringValue(protocolFeeContract_))
14831483 $Tuple2(((((((([issue] ++ _saveStorage(storageUpdated)) ++ _saveAssets(assets_)) ++ _saveAssetBalances(assetBalances)) ++ _saveAssetWeights(assetWeights)) ++ _savePrecision(precision_)) ++ _saveSigmaFeePerLp(_loadSigmaFeePerLp())) ++ _savePauser(addressFromStringValue(pauser_))), unit)
14841484 }
14851485 else throw("Strict value is not equal to itself.")
14861486 }
14871487
14881488
14891489
14901490 @Callable(i)
14911491 func depositAll (amount_) = {
14921492 let err = if (if (_whenInitialized())
14931493 then _whenNotPaused()
14941494 else false)
14951495 then _validateInt(amount_, 0, MAX_INT, "depositAll: invalid amount")
14961496 else false
14971497 if ((err == err))
14981498 then {
14991499 let storage = _loadStorage()
15001500 let lpAssetId = storage._1
15011501 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
15021502 let assets = _loadAssets()
1503- let $t04404044125 = _depositAll(amount_)
1504- let lpTokensToMint = $t04404044125._1
1505- let requiredAmountsNormalized = $t04404044125._2
1506- let assetBalances = $t04404044125._3
1503+ let $t04403944124 = _depositAll(amount_)
1504+ let lpTokensToMint = $t04403944124._1
1505+ let requiredAmountsNormalized = $t04403944124._2
1506+ let assetBalances = $t04403944124._3
15071507 func foldFunc (acc,elem) = {
15081508 let index = acc._1
15091509 let paymentAssetStr = _assetToStr(i.payments[index].assetId)
15101510 let paymentAssetDecimals = _getDecimals(paymentAssetStr)
15111511 let requiredAmountNormalized = requiredAmountsNormalized[index]
15121512 let requiredAmount = _normalizeDecimals(requiredAmountNormalized, lpDecimals, paymentAssetDecimals, CEILING)
15131513 let err1 = if ((paymentAssetStr != elem))
15141514 then throw(("depositAll: invalid payment: index=" + toString(index)))
15151515 else if ((0 >= requiredAmount))
15161516 then throw("depositAll: too little amount required")
15171517 else unit
15181518 if ((err1 == err1))
15191519 then {
15201520 let change = if ((i.payments[index].amount > requiredAmount))
15211521 then [ScriptTransfer(i.caller, (i.payments[index].amount - requiredAmount), i.payments[index].assetId)]
15221522 else if ((requiredAmount > i.payments[index].amount))
15231523 then throw(((("depositAll: insufficient payment, index=" + toString(index)) + ", required=") + toString(requiredAmount)))
15241524 else nil
15251525 $Tuple2((index + 1), (acc._2 ++ change))
15261526 }
15271527 else throw("Strict value is not equal to itself.")
15281528 }
15291529
1530- let $t04526845330 = {
1530+ let $t04526745329 = {
15311531 let $l = assets
15321532 let $s = size($l)
15331533 let $acc0 = $Tuple2(0, nil)
15341534 func $f0_1 ($a,$i) = if (($i >= $s))
15351535 then $a
15361536 else foldFunc($a, $l[$i])
15371537
15381538 func $f0_2 ($a,$i) = if (($i >= $s))
15391539 then $a
15401540 else throw("List size exceeds 10")
15411541
15421542 $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)
15431543 }
1544- let idx = $t04526845330._1
1545- let changeActions = $t04526845330._2
1544+ let idx = $t04526745329._1
1545+ let changeActions = $t04526745329._2
15461546 let storageUpdated = $Tuple10(storage._1, storage._2, (storage._3 + lpTokensToMint), storage._4, storage._5, storage._6, storage._7, storage._8, storage._9, storage._10)
15471547 $Tuple2(((([Reissue(lpAssetId, lpTokensToMint, true), ScriptTransfer(i.caller, lpTokensToMint, lpAssetId)] ++ _saveStorage(storageUpdated)) ++ _saveAssetBalances(assetBalances)) ++ changeActions), unit)
15481548 }
15491549 else throw("Strict value is not equal to itself.")
15501550 }
15511551
15521552
15531553
15541554 @Callable(i)
15551555 func deposit (minLpAmount_) = {
15561556 let err = _validateInt(minLpAmount_, 0, MAX_INT, "deposit: invalid min lp amount")
15571557 if ((err == err))
15581558 then {
15591559 let storage = _loadStorage()
15601560 let lpAssetId = storage._1
15611561 let lpAssetIdStr = _assetToStr(lpAssetId)
15621562 let lpDecimals = _getDecimals(lpAssetIdStr)
15631563 let err1 = if (if (if (if (if (_whenInitialized())
15641564 then _whenNotPaused()
15651565 else false)
15661566 then _checkWatchdog()
15671567 else false)
15681568 then _validateIntEquals(size(i.payments), 1, "deposit: invalid payments size")
15691569 else false)
15701570 then _validateListContains(_loadAssets(), _assetToStr(i.payments[0].assetId), "deposit: invalid payment asset")
15711571 else false)
15721572 then _validateInt(i.payments[0].amount, 1, MAX_INT, "deposit: invalid payment amount")
15731573 else false
15741574 if ((err1 == err1))
15751575 then {
15761576 let assetStr = _assetToStr(i.payments[0].assetId)
15771577 let assetDecimals = _getDecimals(assetStr)
15781578 let amountNormalized = _normalizeDecimals(i.payments[0].amount, assetDecimals, lpDecimals, DOWN)
1579- let $t04677046886 = _deposit(assetStr, amountNormalized)
1580- let lpTokensToMint = $t04677046886._1
1581- let assetBalances = $t04677046886._2
1582- let lpFee = $t04677046886._3
1583- let protocolFee = $t04677046886._4
1584- let sigmaFeePerLpUpdated = $t04677046886._5
1579+ let $t04676946885 = _deposit(assetStr, amountNormalized)
1580+ let lpTokensToMint = $t04676946885._1
1581+ let assetBalances = $t04676946885._2
1582+ let lpFee = $t04676946885._3
1583+ let protocolFee = $t04676946885._4
1584+ let sigmaFeePerLpUpdated = $t04676946885._5
15851585 let lpTokensToSend = ((lpTokensToMint - lpFee) - protocolFee)
15861586 let err2 = _validateInt(lpTokensToSend, minLpAmount_, MAX_INT, "deposit: less than min")
15871587 if ((err2 == err2))
15881588 then {
15891589 let storageUpdated = $Tuple10(storage._1, storage._2, (storage._3 + lpTokensToMint), storage._4, storage._5, storage._6, storage._7, storage._8, storage._9, storage._10)
15901590 $Tuple2(((((([Reissue(lpAssetId, lpTokensToMint, true), ScriptTransfer(i.caller, lpTokensToSend, lpAssetId)] ++ _saveStorage(storageUpdated)) ++ _saveAssetBalances(assetBalances)) ++ _saveLpFee(lpAssetIdStr, (lpFee + _loadLpFee(lpAssetIdStr)))) ++ _saveProtocolFee(lpAssetIdStr, (protocolFee + _loadProtocolFee(lpAssetIdStr)))) ++ _saveSigmaFeePerLp(sigmaFeePerLpUpdated)), unit)
15911591 }
15921592 else throw("Strict value is not equal to itself.")
15931593 }
15941594 else throw("Strict value is not equal to itself.")
15951595 }
15961596 else throw("Strict value is not equal to itself.")
15971597 }
15981598
15991599
16001600
16011601 @Callable(i)
16021602 func withdrawAll () = {
16031603 let storage = _loadStorage()
16041604 let lpAssetId = storage._1
16051605 let lpAssetIdStr = toBase58String(lpAssetId)
16061606 let lpDecimals = _getDecimals(lpAssetIdStr)
16071607 let assets = _loadAssets()
16081608 let err = if (if (if (_whenInitialized())
16091609 then _validateIntEquals(size(i.payments), 1, "withdrawAll: invalid payments size")
16101610 else false)
16111611 then _validateStringEqual(lpAssetIdStr, _assetToStr(i.payments[0].assetId), "withdrawAll: invalid payment asset")
16121612 else false)
16131613 then _validateInt(i.payments[0].amount, 1, MAX_INT, "withdrawAll: invalid payment amount")
16141614 else false
16151615 if ((err == err))
16161616 then {
1617- let $t04834748434 = _withdrawAll(i.payments[0].amount)
1618- let lpTokensToBurn = $t04834748434._1
1619- let balancesToPay = $t04834748434._2
1620- let assetBalances = $t04834748434._3
1617+ let $t04834648433 = _withdrawAll(i.payments[0].amount)
1618+ let lpTokensToBurn = $t04834648433._1
1619+ let balancesToPay = $t04834648433._2
1620+ let assetBalances = $t04834648433._3
16211621 let paymentActions = _getPaymentsFromBalances(assets, balancesToPay, i.caller, lpDecimals)
16221622 let storageUpdated = $Tuple10(storage._1, storage._2, (storage._3 - lpTokensToBurn), storage._4, storage._5, storage._6, storage._7, storage._8, storage._9, storage._10)
16231623 $Tuple2(((([Burn(lpAssetId, lpTokensToBurn)] ++ paymentActions) ++ _saveStorage(storageUpdated)) ++ _saveAssetBalances(assetBalances)), unit)
16241624 }
16251625 else throw("Strict value is not equal to itself.")
16261626 }
16271627
16281628
16291629
16301630 @Callable(i)
16311631 func withdraw (assetId_,minAmount_) = {
16321632 let storage = _loadStorage()
16331633 let lpAssetId = storage._1
16341634 let lpAssetIdStr = toBase58String(lpAssetId)
16351635 let lpDecimals = _getDecimals(lpAssetIdStr)
16361636 let assets = _loadAssets()
16371637 let err = if (if (if (if (if (if (if (_whenInitialized())
16381638 then _whenNotPaused()
16391639 else false)
16401640 then _checkWatchdog()
16411641 else false)
16421642 then _validateIntEquals(size(i.payments), 1, "withdraw: invalid payments size")
16431643 else false)
16441644 then _validateStringEqual(lpAssetIdStr, _assetToStr(i.payments[0].assetId), "withdraw: invalid payment asset")
16451645 else false)
16461646 then _validateInt(i.payments[0].amount, 1, MAX_INT, "withdraw: invalid payment amount")
16471647 else false)
16481648 then _validateListContains(assets, assetId_, "withdraw: invalid assetId")
16491649 else false)
16501650 then _validateInt(minAmount_, 0, MAX_INT, "withdraw: invalid minAmount")
16511651 else false
16521652 if ((err == err))
16531653 then {
1654- let $t04978849922 = _withdraw(assetId_, i.payments[0].amount)
1655- let targetAmountNormalized = $t04978849922._1
1656- let finalAssetBalances = $t04978849922._2
1657- let lpFee = $t04978849922._3
1658- let protocolFee = $t04978849922._4
1659- let sigmaFeePerLpUpdated = $t04978849922._5
1654+ let $t04978749921 = _withdraw(assetId_, i.payments[0].amount)
1655+ let targetAmountNormalized = $t04978749921._1
1656+ let finalAssetBalances = $t04978749921._2
1657+ let lpFee = $t04978749921._3
1658+ let protocolFee = $t04978749921._4
1659+ let sigmaFeePerLpUpdated = $t04978749921._5
16601660 let finalAmountNormalized = ((targetAmountNormalized - lpFee) - protocolFee)
16611661 let targetDecimals = _getDecimals(assetId_)
16621662 let finalAmount = _normalizeDecimals(finalAmountNormalized, lpDecimals, targetDecimals, DOWN)
16631663 let err1 = _validateInt(finalAmount, minAmount_, MAX_INT, "withdraw: less than min")
16641664 if ((err1 == err1))
16651665 then {
16661666 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)
16671667 $Tuple2(((((([Burn(lpAssetId, i.payments[0].amount), ScriptTransfer(i.caller, finalAmount, _strToAsset(assetId_))] ++ _saveStorage(storageUpdated)) ++ _saveAssetBalances(finalAssetBalances)) ++ _saveLpFee(assetId_, (lpFee + _loadLpFee(assetId_)))) ++ _saveProtocolFee(assetId_, (protocolFee + _loadProtocolFee(assetId_)))) ++ _saveSigmaFeePerLp(sigmaFeePerLpUpdated)), unit)
16681668 }
16691669 else throw("Strict value is not equal to itself.")
16701670 }
16711671 else throw("Strict value is not equal to itself.")
16721672 }
16731673
16741674
16751675
16761676 @Callable(i)
16771677 func swap (targetAssetId_,minAmount_) = {
16781678 let storage = _loadStorage()
16791679 let lpAssetId = storage._1
16801680 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
16811681 let assets = _loadAssets()
16821682 let sourceAssetStr = _assetToStr(i.payments[0].assetId)
16831683 let sourceAmountNormalized = _normalizeDecimals(i.payments[0].amount, _getDecimals(sourceAssetStr), lpDecimals, DOWN)
16841684 let sourceAssetIndex = valueOrErrorMessage(indexOf(assets, sourceAssetStr), "swap: invalid source asset")
16851685 if ((sourceAssetIndex == sourceAssetIndex))
16861686 then {
16871687 let targetAssetIndex = valueOrErrorMessage(indexOf(assets, targetAssetId_), "swap: invalid target asset")
16881688 if ((targetAssetIndex == targetAssetIndex))
16891689 then {
16901690 let err = if (if (if (if (if (if (_whenInitialized())
16911691 then _whenNotPaused()
16921692 else false)
16931693 then _checkWatchdog()
16941694 else false)
16951695 then _validateInt(minAmount_, 0, MAX_INT, "swap: invalid min target amount")
16961696 else false)
16971697 then _validateInt(sourceAmountNormalized, 1, MAX_INT, "swap: invalid source amount")
16981698 else false)
16991699 then _validateStringNotEq(sourceAssetStr, targetAssetId_, "swap: same assets")
17001700 else false)
17011701 then _validateIntEquals(size(i.payments), 1, "swap: invalid payments size")
17021702 else false
17031703 if ((err == err))
17041704 then {
1705- let $t05203552193 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
1706- let targetAmountNormalized = $t05203552193._1
1707- let finalAssetBalances = $t05203552193._2
1708- let lpFee = $t05203552193._3
1709- let protocolFee = $t05203552193._4
1710- let sigmaFeePerLpUpdated = $t05203552193._5
1705+ let $t05203452192 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
1706+ let targetAmountNormalized = $t05203452192._1
1707+ let finalAssetBalances = $t05203452192._2
1708+ let lpFee = $t05203452192._3
1709+ let protocolFee = $t05203452192._4
1710+ let sigmaFeePerLpUpdated = $t05203452192._5
17111711 let finalAmountNormalized = ((targetAmountNormalized - lpFee) - protocolFee)
17121712 let targetDecimals = _getDecimals(targetAssetId_)
17131713 let finalAmount = _normalizeDecimals(finalAmountNormalized, lpDecimals, targetDecimals, DOWN)
17141714 let err1 = _validateInt(finalAmount, minAmount_, MAX_INT, "swap: less than min")
17151715 if ((err1 == err1))
17161716 then $Tuple2((((([ScriptTransfer(i.caller, finalAmount, _strToAsset(targetAssetId_))] ++ _saveAssetBalances(finalAssetBalances)) ++ _saveLpFee(targetAssetId_, (lpFee + _loadLpFee(targetAssetId_)))) ++ _saveProtocolFee(targetAssetId_, (protocolFee + _loadProtocolFee(targetAssetId_)))) ++ _saveSigmaFeePerLp(sigmaFeePerLpUpdated)), unit)
17171717 else throw("Strict value is not equal to itself.")
17181718 }
17191719 else throw("Strict value is not equal to itself.")
17201720 }
17211721 else throw("Strict value is not equal to itself.")
17221722 }
17231723 else throw("Strict value is not equal to itself.")
17241724 }
17251725
17261726
17271727
17281728 @Callable(i)
17291729 func getDepositAll (lpAmount_) = {
17301730 let err = _validateInt(lpAmount_, 1, MAX_INT, "getDepositAll: invalid amount")
17311731 if ((err == err))
17321732 then {
1733- let $t05331353400 = _depositAll(lpAmount_)
1734- let lpTokensToMint = $t05331353400._1
1735- let requiredAmountsNormalized = $t05331353400._2
1736- let assetBalances = $t05331353400._3
1733+ let $t05331253399 = _depositAll(lpAmount_)
1734+ let lpTokensToMint = $t05331253399._1
1735+ let requiredAmountsNormalized = $t05331253399._2
1736+ let assetBalances = $t05331253399._3
17371737 $Tuple2(nil, $Tuple2(lpTokensToMint, requiredAmountsNormalized))
17381738 }
17391739 else throw("Strict value is not equal to itself.")
17401740 }
17411741
17421742
17431743
17441744 @Callable(i)
17451745 func getDeposit (assetId_,amount_) = {
17461746 let err = if (_validateListContains(_loadAssets(), assetId_, "getDeposit: invalid asset"))
17471747 then _validateInt(amount_, 1, MAX_INT, "getDeposit: invalid amount")
17481748 else false
17491749 if ((err == err))
17501750 then {
17511751 let storage = _loadStorage()
17521752 let lpAssetId = storage._1
17531753 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
17541754 let assetDecimals = _getDecimals(assetId_)
17551755 let amountNormalized = _normalizeDecimals(amount_, assetDecimals, lpDecimals, DOWN)
1756- let $t05415954275 = _deposit(assetId_, amountNormalized)
1757- let lpTokensToMint = $t05415954275._1
1758- let assetBalances = $t05415954275._2
1759- let lpFee = $t05415954275._3
1760- let protocolFee = $t05415954275._4
1761- let sigmaFeePerLpUpdated = $t05415954275._5
1756+ let $t05415854274 = _deposit(assetId_, amountNormalized)
1757+ let lpTokensToMint = $t05415854274._1
1758+ let assetBalances = $t05415854274._2
1759+ let lpFee = $t05415854274._3
1760+ let protocolFee = $t05415854274._4
1761+ let sigmaFeePerLpUpdated = $t05415854274._5
17621762 let lpTokensToSend = ((lpTokensToMint - lpFee) - protocolFee)
17631763 $Tuple2(nil, lpTokensToSend)
17641764 }
17651765 else throw("Strict value is not equal to itself.")
17661766 }
17671767
17681768
17691769
17701770 @Callable(i)
17711771 func getWithdrawAll (lpAmount_) = {
17721772 let err = _validateInt(lpAmount_, 0, MAX_INT, "getWithdrawAll: invalid amount")
17731773 if ((err == err))
17741774 then {
1775- let $t05471454790 = _withdrawAll(lpAmount_)
1776- let lpTokensToBurn = $t05471454790._1
1777- let balancesToGet = $t05471454790._2
1778- let assetBalances = $t05471454790._3
1775+ let $t05471354789 = _withdrawAll(lpAmount_)
1776+ let lpTokensToBurn = $t05471354789._1
1777+ let balancesToGet = $t05471354789._2
1778+ let assetBalances = $t05471354789._3
17791779 $Tuple2(nil, balancesToGet)
17801780 }
17811781 else throw("Strict value is not equal to itself.")
17821782 }
17831783
17841784
17851785
17861786 @Callable(i)
17871787 func getWithdraw (assetId_,amount_) = {
17881788 let err = if (_validateListContains(_loadAssets(), assetId_, "getWithdraw: invalid asset"))
17891789 then _validateInt(amount_, 1, MAX_INT, "getWithdraw: invalid amount")
17901790 else false
17911791 if ((err == err))
17921792 then {
17931793 let storage = _loadStorage()
17941794 let lpAssetId = storage._1
17951795 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
1796- let $t05544155557 = _withdraw(assetId_, amount_)
1797- let targetAmountNormalized = $t05544155557._1
1798- let assetBalances = $t05544155557._2
1799- let lpFee = $t05544155557._3
1800- let protocolFee = $t05544155557._4
1801- let sigmaFeePerLpUpdated = $t05544155557._5
1796+ let $t05544055556 = _withdraw(assetId_, amount_)
1797+ let targetAmountNormalized = $t05544055556._1
1798+ let assetBalances = $t05544055556._2
1799+ let lpFee = $t05544055556._3
1800+ let protocolFee = $t05544055556._4
1801+ let sigmaFeePerLpUpdated = $t05544055556._5
18021802 let finalAmountNormalized = ((targetAmountNormalized - lpFee) - protocolFee)
18031803 let targetDecimals = _getDecimals(assetId_)
18041804 let finalAmount = _normalizeDecimals(finalAmountNormalized, lpDecimals, targetDecimals, DOWN)
18051805 $Tuple2(nil, finalAmount)
18061806 }
18071807 else throw("Strict value is not equal to itself.")
18081808 }
18091809
18101810
18111811
18121812 @Callable(i)
18131813 func getSwap (sourceAssetId_,targetAssetId_,sourceAmount_) = {
18141814 let storage = _loadStorage()
18151815 let lpAssetId = storage._1
18161816 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
18171817 let assets = _loadAssets()
18181818 let sourceAssetIndex = valueOrErrorMessage(indexOf(assets, sourceAssetId_), "swap: invalid source asset")
18191819 if ((sourceAssetIndex == sourceAssetIndex))
18201820 then {
18211821 let targetAssetIndex = valueOrErrorMessage(indexOf(assets, targetAssetId_), "swap: invalid target asset")
18221822 if ((targetAssetIndex == targetAssetIndex))
18231823 then {
18241824 let sourceAmountNormalized = _normalizeDecimals(sourceAmount_, _getDecimals(sourceAssetId_), lpDecimals, DOWN)
18251825 let err = if (_validateInt(sourceAmountNormalized, 1, MAX_INT, "swap: invalid source amount"))
18261826 then _validateStringNotEq(sourceAssetId_, targetAssetId_, "swap: same assets")
18271827 else false
18281828 if ((err == err))
18291829 then {
1830- let $t05696757125 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
1831- let targetAmountNormalized = $t05696757125._1
1832- let finalAssetBalances = $t05696757125._2
1833- let lpFee = $t05696757125._3
1834- let protocolFee = $t05696757125._4
1835- let sigmaFeePerLpUpdated = $t05696757125._5
1830+ let $t05696657124 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
1831+ let targetAmountNormalized = $t05696657124._1
1832+ let finalAssetBalances = $t05696657124._2
1833+ let lpFee = $t05696657124._3
1834+ let protocolFee = $t05696657124._4
1835+ let sigmaFeePerLpUpdated = $t05696657124._5
18361836 let finalAmountNormalized = ((targetAmountNormalized - lpFee) - protocolFee)
18371837 let targetDecimals = _getDecimals(targetAssetId_)
18381838 let finalAmount = _normalizeDecimals(finalAmountNormalized, lpDecimals, targetDecimals, DOWN)
18391839 $Tuple2(nil, finalAmount)
18401840 }
18411841 else throw("Strict value is not equal to itself.")
18421842 }
18431843 else throw("Strict value is not equal to itself.")
18441844 }
18451845 else throw("Strict value is not equal to itself.")
18461846 }
18471847
18481848
18491849
18501850 @Callable(i)
18511851 func getClaim (user_) = {
18521852 let user = if ((size(user_) > 0))
18531853 then valueOrErrorMessage(addressFromString(user_), "getClaim: invalid user")
18541854 else i.caller
1855- let $t05776757823 = _checkpoint(user)
1856- let checkpointActions = $t05776757823._1
1857- let userProfits = $t05776757823._2
1855+ let $t05776657822 = _checkpoint(user)
1856+ let checkpointActions = $t05776657822._1
1857+ let userProfits = $t05776657822._2
18581858 $Tuple2(nil, userProfits)
18591859 }
18601860
18611861
18621862
18631863 @Callable(i)
18641864 func getUtilFunc () = {
18651865 let storage = _loadStorage()
18661866 let lpTotalSupply = storage._3
18671867 let weightAmplifier = storage._7
18681868 let slippageRate = storage._8
18691869 let feeMaxRate = storage._9
1870- let $t05815658216 = _loadAssetBalances()
1871- let assetBalances = $t05815658216._1
1872- let assetTotalSupply = $t05815658216._2
1873- let $t05822158274 = _loadAssetWeights()
1874- let assetWeights = $t05822158274._1
1875- let sigmaWeight = $t05822158274._2
1870+ let $t05815558215 = _loadAssetBalances()
1871+ let assetBalances = $t05815558215._1
1872+ let assetTotalSupply = $t05815558215._2
1873+ let $t05822058273 = _loadAssetWeights()
1874+ let assetWeights = $t05822058273._1
1875+ let sigmaWeight = $t05822058273._2
18761876 let fee = _calculateFee(assetBalances, assetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
18771877 let utilValue = (assetTotalSupply - fee)
18781878 $Tuple2(nil, $Tuple2(utilValue, lpTotalSupply))
18791879 }
18801880
18811881
18821882
18831883 @Callable(i)
18841884 func getFeeFunc () = {
18851885 let storage = _loadStorage()
18861886 let weightAmplifier = storage._7
18871887 let slippageRate = storage._8
18881888 let feeMaxRate = storage._9
1889- let $t05870658766 = _loadAssetBalances()
1890- let assetBalances = $t05870658766._1
1891- let assetTotalSupply = $t05870658766._2
1892- let $t05877158824 = _loadAssetWeights()
1893- let assetWeights = $t05877158824._1
1894- let sigmaWeight = $t05877158824._2
1889+ let $t05870558765 = _loadAssetBalances()
1890+ let assetBalances = $t05870558765._1
1891+ let assetTotalSupply = $t05870558765._2
1892+ let $t05877058823 = _loadAssetWeights()
1893+ let assetWeights = $t05877058823._1
1894+ let sigmaWeight = $t05877058823._2
18951895 let fee = _calculateFee(assetBalances, assetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
18961896 $Tuple2(nil, fee)
18971897 }
18981898
18991899
19001900
19011901 @Callable(i)
19021902 func checkpoint (user_) = {
19031903 let err = if (_whenInitialized())
19041904 then _whenNotPaused()
19051905 else false
19061906 if ((err == err))
19071907 then {
19081908 let user = if ((size(user_) > 0))
19091909 then valueOrErrorMessage(addressFromString(user_), "checkpoint: invalid user")
19101910 else i.caller
19111911 _checkpoint(user)
19121912 }
19131913 else throw("Strict value is not equal to itself.")
19141914 }
19151915
19161916
19171917
19181918 @Callable(i)
19191919 func stake () = {
19201920 let err = if (_whenInitialized())
19211921 then _whenNotPaused()
19221922 else false
19231923 if ((err == err))
19241924 then {
19251925 let storage = _loadStorage()
19261926 let lpAssetIdStr = _assetToStr(storage._1)
19271927 let err1 = if (if (_validateIntEquals(size(i.payments), 1, "stake: invalid payments size"))
19281928 then _validateStringEqual(lpAssetIdStr, _assetToStr(i.payments[0].assetId), "stake: invalid payment asset")
19291929 else false)
19301930 then _validateInt(i.payments[0].amount, 0, MAX_INT, "stake: invalid payment amount")
19311931 else false
19321932 if ((err1 == err1))
19331933 then {
1934- let $t05983259892 = _checkpoint(i.caller)
1935- let checkpointActions = $t05983259892._1
1936- let userProfits = $t05983259892._2
1934+ let $t05983159891 = _checkpoint(i.caller)
1935+ let checkpointActions = $t05983159891._1
1936+ let userProfits = $t05983159891._2
19371937 $Tuple2(((checkpointActions ++ _saveUserLp(i.caller, (_loadUserLp(i.caller) + i.payments[0].amount))) ++ _saveTotalLp((_loadTotalLp() + i.payments[0].amount))), unit)
19381938 }
19391939 else throw("Strict value is not equal to itself.")
19401940 }
19411941 else throw("Strict value is not equal to itself.")
19421942 }
19431943
19441944
19451945
19461946 @Callable(i)
19471947 func unstake (amount_) = {
19481948 let err = if (_whenInitialized())
19491949 then _whenNotPaused()
19501950 else false
19511951 if ((err == err))
19521952 then {
19531953 let storage = _loadStorage()
19541954 let lpAssetId = storage._1
19551955 let userLp = _loadUserLp(i.caller)
19561956 let err1 = _validateInt(amount_, 0, userLp, "unstake: invalid amount")
19571957 if ((err1 == err1))
19581958 then {
1959- let $t06040360463 = _checkpoint(i.caller)
1960- let checkpointActions = $t06040360463._1
1961- let userProfits = $t06040360463._2
1959+ let $t06040260462 = _checkpoint(i.caller)
1960+ let checkpointActions = $t06040260462._1
1961+ let userProfits = $t06040260462._2
19621962 $Tuple2(((([ScriptTransfer(i.caller, amount_, lpAssetId)] ++ checkpointActions) ++ _saveUserLp(i.caller, (userLp - amount_))) ++ _saveTotalLp((_loadTotalLp() - amount_))), unit)
19631963 }
19641964 else throw("Strict value is not equal to itself.")
19651965 }
19661966 else throw("Strict value is not equal to itself.")
19671967 }
19681968
19691969
19701970
19711971 @Callable(i)
19721972 func claim (user_) = {
19731973 let err = if (_whenInitialized())
19741974 then _whenNotPaused()
19751975 else false
19761976 if ((err == err))
19771977 then {
19781978 let user = if ((size(user_) > 0))
19791979 then valueOrErrorMessage(addressFromString(user_), "claim: invalid user")
19801980 else i.caller
19811981 let storage = _loadStorage()
19821982 let lpAssetId = storage._1
19831983 let lpAssetIdStr = _assetToStr(lpAssetId)
19841984 let assets = [lpAssetIdStr, _loadAssets()]
19851985 let maxIndex = (size(assets) - 1)
19861986 let userLp = _loadUserLp(user)
1987- let $t06118661242 = _checkpoint(user)
1988- let checkpointActions = $t06118661242._1
1989- let userProfits = $t06118661242._2
1987+ let $t06118561241 = _checkpoint(user)
1988+ let checkpointActions = $t06118561241._1
1989+ let userProfits = $t06118561241._2
19901990 func foldFunc (acc,profit) = {
19911991 let index = acc._1
19921992 if (if ((maxIndex >= index))
19931993 then (profit > 0)
19941994 else false)
19951995 then {
19961996 let asset = assets[index]
19971997 $Tuple3((index + 1), (acc._2 :+ 0), (acc._3 :+ ScriptTransfer(user, profit, _strToAsset(asset))))
19981998 }
19991999 else $Tuple3((index + 1), (acc._2 :+ profit), acc._3)
20002000 }
20012001
2002- let $t06162061711 = {
2002+ let $t06161961710 = {
20032003 let $l = userProfits
20042004 let $s = size($l)
20052005 let $acc0 = $Tuple3(0, nil, nil)
20062006 func $f0_1 ($a,$i) = if (($i >= $s))
20072007 then $a
20082008 else foldFunc($a, $l[$i])
20092009
20102010 func $f0_2 ($a,$i) = if (($i >= $s))
20112011 then $a
20122012 else throw("List size exceeds 11")
20132013
20142014 $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)
20152015 }
2016- let idx = $t06162061711._1
2017- let userProfitsUpdated = $t06162061711._2
2018- let profitActions = $t06162061711._3
2016+ let idx = $t06161961710._1
2017+ let userProfitsUpdated = $t06161961710._2
2018+ let profitActions = $t06161961710._3
20192019 $Tuple2(((profitActions ++ removeByIndex(checkpointActions, 0)) ++ _saveUserProfits(user, userProfitsUpdated)), unit)
20202020 }
20212021 else throw("Strict value is not equal to itself.")
20222022 }
20232023
20242024
20252025
20262026 @Callable(i)
20272027 func pause () = {
20282028 let err = if (if (_onlyPauser(i.caller))
20292029 then _whenInitialized()
20302030 else false)
20312031 then _whenNotPaused()
20322032 else false
20332033 if ((err == err))
20342034 then $Tuple2(_savePause(true), unit)
20352035 else throw("Strict value is not equal to itself.")
20362036 }
20372037
20382038
20392039
20402040 @Callable(i)
20412041 func unpause () = {
20422042 let err = if (if (_onlyThisContract(i.caller))
20432043 then _whenInitialized()
20442044 else false)
20452045 then _whenPaused()
20462046 else false
20472047 if ((err == err))
20482048 then $Tuple2(_savePause(false), unit)
20492049 else throw("Strict value is not equal to itself.")
20502050 }
20512051
20522052
20532053
20542054 @Callable(i)
20552055 func updatePauser (pauser_) = {
20562056 let err = if (if (_onlyThisContract(i.caller))
20572057 then _whenInitialized()
20582058 else false)
20592059 then _validateAddress(pauser_, "updatePauser: invalid pauser")
20602060 else false
20612061 if ((err == err))
20622062 then $Tuple2(_savePauser(addressFromStringValue(pauser_)), unit)
20632063 else throw("Strict value is not equal to itself.")
20642064 }
20652065
20662066
20672067
20682068 @Callable(i)
20692069 func updateWatchdog (watchdog_,offset_) = {
20702070 let err = if (if (if (_onlyThisContract(i.caller))
20712071 then _whenInitialized()
20722072 else false)
20732073 then _validateAddress(watchdog_, "updateWatchdog: invalid watchdog")
20742074 else false)
20752075 then _validateInt(offset_, 0, MAX_INT, "updateWatchdog: invalid offset")
20762076 else false
20772077 if ((err == err))
20782078 then $Tuple2((_saveWatchdog(addressFromStringValue(watchdog_)) ++ _saveWatchdogOffset(offset_)), unit)
20792079 else throw("Strict value is not equal to itself.")
20802080 }
20812081
20822082
20832083
20842084 @Callable(i)
20852085 func setMultisig (multisig_) = {
20862086 let err = if (_onlyThisContract(i.caller))
20872087 then _validateAddress(multisig_, "setMultisig: invalid multisig")
20882088 else false
20892089 if ((err == err))
20902090 then $Tuple2(_saveMultisig(addressFromStringValue(multisig_)), unit)
20912091 else throw("Strict value is not equal to itself.")
20922092 }
20932093
20942094
20952095 @Verifier(tx)
20962096 func verify () = match getString(KEY_MULTISIG) {
20972097 case multisig: String =>
20982098 valueOrElse(getBoolean(addressFromStringValue(multisig), makeString([KEY_STATUS, toString(this), toBase58String(tx.id)], SEP)), false)
20992099 case _ =>
21002100 sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
21012101 }
21022102

github/deemru/w8io/169f3d6 
213.71 ms