tx · Hf3fvNhNvCyWnakTSnRyHEJT4VV933TgkD6LXrUQcEW2

3Mw8ZcMK47vENHqhYYhCZTCPDXhff6ZQVwt:  -0.06200000 Waves

2023.11.02 18:13 [2825884] smart account 3Mw8ZcMK47vENHqhYYhCZTCPDXhff6ZQVwt > SELF 0.00000000 Waves

{ "type": 13, "id": "Hf3fvNhNvCyWnakTSnRyHEJT4VV933TgkD6LXrUQcEW2", "fee": 6200000, "feeAssetId": null, "timestamp": 1698937784430, "version": 2, "chainId": 84, "sender": "3Mw8ZcMK47vENHqhYYhCZTCPDXhff6ZQVwt", "senderPublicKey": "3fNYAZ872D7hsaic3sPDZd5uAk59U5CiWiA153FUZ6Qv", "proofs": [ "5MHyeZpXjq8X3ZqqgaSGwwgn5L8aZMBcqALgdDQuPBV1sAdfbg8T3EDQtpXJx1m1tQ1Ja2hgpEuqoyW7HC84Kc9p" ], "script": "base64:BgJ3CAISEAoOGBgBAQgIAQEBAQEIAQgSAwoBARIDCgEBEgASBAoCCAESBAoCCAESAwoBARIECgIIARIDCgEBEgQKAggBEgUKAwgIARIDCgEIEgASABIDCgEIEgASAwoBARIDCgEIEgASABIDCgEIEgQKAggBEgMKAQh7AANTRVACAl9fAAVXQVZFUwIFd2F2ZXMAB01BWF9JTlQA//////////9/AAdNQVhfRkVFAMCEPQANTUFYX0FNUExJRklFUgDAhD0AFE1BWF9XRUlHSFRfQU1QTElGSUVSAMCEPQAKTUFYX1dFSUdIVADAhD0AFFNMSVBQQUdFX1JBVEVfRkFDVE9SAMCEPQAPRkVFX1JBVEVfRkFDVE9SAMCEPQALUkFURV9GQUNUT1IAwIQ9AA5QRVJDRU5UX0ZBQ1RPUgkAtgIBAICAkLu61q3wDQAQWkVST19JTlRfTElTVF8xMAkAzAgCAAAJAMwIAgAACQDMCAIAAAkAzAgCAAAJAMwIAgAACQDMCAIAAAkAzAgCAAAJAMwIAgAACQDMCAIAAAkAzAgCAAAFA25pbAAQWkVST19JTlRfTElTVF8xMQkAzQgCBRBaRVJPX0lOVF9MSVNUXzEwAAAAC1pFUk9fQklHSU5UCQC2AgEAAAATWkVST19CSUdJTlRfTElTVF8xMQkAzAgCBQtaRVJPX0JJR0lOVAkAzAgCBQtaRVJPX0JJR0lOVAkAzAgCBQtaRVJPX0JJR0lOVAkAzAgCBQtaRVJPX0JJR0lOVAkAzAgCBQtaRVJPX0JJR0lOVAkAzAgCBQtaRVJPX0JJR0lOVAkAzAgCBQtaRVJPX0JJR0lOVAkAzAgCBQtaRVJPX0JJR0lOVAkAzAgCBQtaRVJPX0JJR0lOVAkAzAgCBQtaRVJPX0JJR0lOVAkAzAgCBQtaRVJPX0JJR0lOVAUDbmlsAAxJTlRfREVDSU1BTFMACAAPQklHSU5UX0RFQ0lNQUxTABIAB0xJU1RfNjQJAL0JAgJ/MF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMF8wXzBfMAIBXwAMS0VZX01VTFRJU0lHAghNVUxUSVNJRwAKS0VZX1NUQVRVUwIGU1RBVFVTAApLRVlfUEFVU0VEAgZQQVVTRUQACktFWV9QQVVTRVICBlBBVVNFUgALS0VZX1NUT1JBR0UCB1NUT1JBR0UACktFWV9BU1NFVFMCBkFTU0VUUwASS0VZX0FTU0VUX0JBTEFOQ0VTAg5BU1NFVF9CQUxBTkNFUwARS0VZX0FTU0VUX1dFSUdIVFMCDUFTU0VUX1dFSUdIVFMACktFWV9MUF9GRUUCBkxQX0ZFRQAQS0VZX1BST1RPQ09MX0ZFRQIMUFJPVE9DT0xfRkVFAA1LRVlfUFJFQ0lTSU9OAglQUkVDSVNJT04AFEtFWV9TSUdNQV9GRUVfUEVSX0xQAhBTSUdNQV9GRUVfUEVSX0xQABlLRVlfVVNFUl9TSUdNQV9GRUVfUEVSX0xQAhVVU0VSX1NJR01BX0ZFRV9QRVJfTFAAC0tFWV9VU0VSX0xQAgdVU0VSX0xQAAxLRVlfVE9UQUxfTFACCFRPVEFMX0xQABBLRVlfVVNFUl9QUk9GSVRTAgxVU0VSX1BST0ZJVFMADEtFWV9XQVRDSERPRwIIV0FUQ0hET0cAE0tFWV9XQVRDSERPR19PRkZTRVQCD1dBVENIRE9HX09GRlNFVAATS0VZX1dBVENIRE9HX0hFSUdIVAIPV0FUQ0hET0dfSEVJR0hUARBfdmFsaWRhdGVBZGRyZXNzAghhZGRyZXNzXwRlcnJfBAckbWF0Y2gwCQCmCAEFCGFkZHJlc3NfAwkAAQIFByRtYXRjaDACB0FkZHJlc3MEAWEFByRtYXRjaDAGCQACAQUEZXJyXwEOX3ZhbGlkYXRlQXNzZXQCCGFzc2V0SWRfBGVycl8DCQAAAgUIYXNzZXRJZF8FBVdBVkVTBgQHJG1hdGNoMAkA7AcBCQDZBAEFCGFzc2V0SWRfAwkAAQIFByRtYXRjaDACBUFzc2V0BAFhBQckbWF0Y2gwBgkAAgEFBGVycl8BDF92YWxpZGF0ZUludAQEdmFsXw5sb3dlckJvdW5kYXJ5Xw51cHBlckJvdW5kYXJ5XwRlcnJfAwMJAGYCBQ5sb3dlckJvdW5kYXJ5XwUEdmFsXwYJAGYCBQR2YWxfBQ51cHBlckJvdW5kYXJ5XwkAAgEFBGVycl8GAQ1fdmFsaWRhdGVCb29sAwR2YWxfB3RhcmdldF8EZXJyXwMJAQIhPQIFBHZhbF8FB3RhcmdldF8JAAIBBQRlcnJfBgEUX3ZhbGlkYXRlU3RyaW5nRXF1YWwDBXZhbDFfBXZhbDJfBGVycl8DCQECIT0CBQV2YWwxXwUFdmFsMl8JAAIBBQRlcnJfBgEUX3ZhbGlkYXRlU3RyaW5nTm90RXEDBXZhbDFfBXZhbDJfBGVycl8DCQAAAgUFdmFsMV8FBXZhbDJfCQACAQUEZXJyXwYBEF92YWxpZGF0ZUludExpc3QEBHZhbF8ObG93ZXJCb3VuZGFyeV8OdXBwZXJCb3VuZGFyeV8EZXJyXwoBCGZvbGRGdW5jAgNhY2MEZWxlbQQHJG1hdGNoMAkAtgkBBQRlbGVtAwkAAQIFByRtYXRjaDACA0ludAQBYQUHJG1hdGNoMAMFA2FjYwkBDF92YWxpZGF0ZUludAQFAWEFDmxvd2VyQm91bmRhcnlfBQ51cHBlckJvdW5kYXJ5XwUEZXJyXwcJAAIBBQRlcnJfCgACJGwFBHZhbF8KAAIkcwkAkAMBBQIkbAoABSRhY2MwBgoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEIZm9sZEZ1bmMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoBD192YWxpZGF0ZUFzc2V0cwIHYXNzZXRzXwRlcnJfCgEIZm9sZEZ1bmMCA2FjYwRlbGVtAwUDYWNjCQEOX3ZhbGlkYXRlQXNzZXQCBQRlbGVtBQRlcnJfBwoAAiRsBQdhc3NldHNfCgACJHMJAJADAQUCJGwKAAUkYWNjMAYKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCGZvbGRGdW5jAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKARJfdmFsaWRhdGVJbnRFcXVhbHMDBXZhbDFfBXZhbDJfBGVycl8DCQECIT0CBQV2YWwxXwUFdmFsMl8JAAIBBQRlcnJfBgESX3ZhbGlkYXRlVG9rZW5OYW1lAgR2YWxfBGVycl8DAwkAZgIABAkAsQIBBQR2YWxfBgkAZgIJALECAQUEdmFsXwAQCQACAQUEZXJyXwYBE192YWxpZGF0ZVRva2VuRGVzY3ICBHZhbF8EZXJyXwMJAGYCCQCxAgEFBHZhbF8A6AcJAAIBBQRlcnJfBgERX3ZhbGlkYXRlRGVjaW1hbHMCBHZhbF8EZXJyXwMDCQBmAgAABQR2YWxfBgkAZgIFBHZhbF8ACAkAAgEFBGVycl8GARBfdmFsaWRhdGVQYXltZW50BAhwYXltZW50Xwhhc3NldElkXw9yZXF1aXJlZEFtb3VudF8EZXJyXwQHJG1hdGNoMAgFCHBheW1lbnRfB2Fzc2V0SWQDCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQBYQUHJG1hdGNoMAMJAQIhPQIFCGFzc2V0SWRfCQDYBAEFAWEJAAIBCQCsAgIFBGVycl8CBzogYXNzZXQDCQBmAgUPcmVxdWlyZWRBbW91bnRfCAUIcGF5bWVudF8GYW1vdW50CQACAQkArAICBQRlcnJfAgg6IGFtb3VudAYJAAIBCQCsAgIFBGVycl8CBzogYXNzZXQBFV92YWxpZGF0ZUxpc3RDb250YWlucwMFbGlzdF8EdmFsXwRlcnJfAwkBASEBCQEPY29udGFpbnNFbGVtZW50AgUFbGlzdF8FBHZhbF8JAAIBBQRlcnJfBgELX2Fzc2V0VG9TdHIBBmFzc2V0XwQHJG1hdGNoMAUGYXNzZXRfAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAWEFByRtYXRjaDAJANgEAQUBYQUFV0FWRVMBC19zdHJUb0Fzc2V0AQZhc3NldF8DAwkAAAIFBmFzc2V0XwUFV0FWRVMGCQAAAgUGYXNzZXRfAgAFBHVuaXQJANkEAQUGYXNzZXRfAQpfbG9hZFBhdXNlAAQHJG1hdGNoMAkAoAgBBQpLRVlfUEFVU0VEAwkAAQIFByRtYXRjaDACB0Jvb2xlYW4EAWEFByRtYXRjaDAFAWEHAQpfc2F2ZVBhdXNlAQlpc1BhdXNlZF8JAMwIAgkBDEJvb2xlYW5FbnRyeQIFCktFWV9QQVVTRUQFCWlzUGF1c2VkXwUDbmlsAQtfbG9hZFBhdXNlcgAEByRtYXRjaDAJAKIIAQUKS0VZX1BBVVNFUgMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDAJARFAZXh0ck5hdGl2ZSgxMDYyKQEFAWEJAQdBZGRyZXNzAQEAAQtfc2F2ZVBhdXNlcgEHcGF1c2VyXwkAzAgCCQELU3RyaW5nRW50cnkCBQpLRVlfUEFVU0VSCQClCAEFB3BhdXNlcl8FA25pbAENX2xvYWRNdWx0aXNpZwAEByRtYXRjaDAJAKIIAQUMS0VZX01VTFRJU0lHAwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAkBEUBleHRyTmF0aXZlKDEwNjIpAQUBYQkBB0FkZHJlc3MBAQABDV9zYXZlTXVsdGlzaWcBCW11bHRpc2lnXwkAzAgCCQELU3RyaW5nRW50cnkCBQxLRVlfTVVMVElTSUcJAKUIAQUJbXVsdGlzaWdfBQNuaWwBDF9sb2FkU3RvcmFnZQAEByRtYXRjaDAJAKIIAQULS0VZX1NUT1JBR0UDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwBAZzdHJ1Y3QJALUJAgUBYQUDU0VQCQCcCgoJANkEAQkAkQMCBQZzdHJ1Y3QAAAkAAAIJAJEDAgUGc3RydWN0AAECATEJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQZzdHJ1Y3QAAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBnN0cnVjdAADCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUGc3RydWN0AAQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQZzdHJ1Y3QABQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBnN0cnVjdAAGCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUGc3RydWN0AAcJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQZzdHJ1Y3QACAkBEUBleHRyTmF0aXZlKDEwNjIpAQkAkQMCBQZzdHJ1Y3QACQkAnAoKAQAHAAAAAAAAAAAAAAAAAAAJAQdBZGRyZXNzAQEAAQxfc2F2ZVN0b3JhZ2UBCHN0b3JhZ2VfCQDMCAIJAQtTdHJpbmdFbnRyeQIFC0tFWV9TVE9SQUdFCQC5CQIJAMwIAgkA2AQBCAUIc3RvcmFnZV8CXzEJAMwIAgMIBQhzdG9yYWdlXwJfMgIBMQIBMAkAzAgCCQCkAwEIBQhzdG9yYWdlXwJfMwkAzAgCCQCkAwEIBQhzdG9yYWdlXwJfNAkAzAgCCQCkAwEIBQhzdG9yYWdlXwJfNQkAzAgCCQCkAwEIBQhzdG9yYWdlXwJfNgkAzAgCCQCkAwEIBQhzdG9yYWdlXwJfNwkAzAgCCQCkAwEIBQhzdG9yYWdlXwJfOAkAzAgCCQCkAwEIBQhzdG9yYWdlXwJfOQkAzAgCCQClCAEIBQhzdG9yYWdlXwNfMTAFA25pbAUDU0VQBQNuaWwBC19sb2FkQXNzZXRzAAQHJG1hdGNoMAkAoggBBQpLRVlfQVNTRVRTAwkAAQIFByRtYXRjaDACBlN0cmluZwQBYQUHJG1hdGNoMAMJAGYCCQCxAgEFAWEAAAkAvQkCBQFhBQNTRVAFA25pbAUDbmlsAQtfc2F2ZUFzc2V0cwEHYXNzZXRzXwkAzAgCCQELU3RyaW5nRW50cnkCBQpLRVlfQVNTRVRTCQC7CQIFB2Fzc2V0c18FA1NFUAUDbmlsARJfbG9hZEFzc2V0QmFsYW5jZXMACgEIZm9sZEZ1bmMCA2FjYwRlbGVtBAdiYWxhbmNlCQENcGFyc2VJbnRWYWx1ZQEFBGVsZW0JAJQKAgkAzQgCCAUDYWNjAl8xBQdiYWxhbmNlCQBkAggFA2FjYwJfMgUHYmFsYW5jZQQHJG1hdGNoMAkAoggBBRJLRVlfQVNTRVRfQkFMQU5DRVMDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwAwkAZgIJALECAQUBYQAACgACJGwJAL0JAgUBYQUDU0VQCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCBQNuaWwAAAoBBSRmMF8x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CgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsFA1NFUAUDbmlsAQ1fbG9hZFdhdGNoZG9nAAQHJG1hdGNoMAkAoggBBQxLRVlfV0FUQ0hET0cDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwCQERQGV4dHJOYXRpdmUoMTA2MikBBQFhCQEHQWRkcmVzcwEBAAENX3NhdmVXYXRjaGRvZwEJd2F0Y2hkb2dfCQDMCAIJAQtTdHJpbmdFbnRyeQIFDEtFWV9XQVRDSERPRwkApQgBBQl3YXRjaGRvZ18FA25pbAETX2xvYWRXYXRjaGRvZ09mZnNldAAEByRtYXRjaDAJAJ8IAQUTS0VZX1dBVENIRE9HX09GRlNFVAMJAAECBQckbWF0Y2gwAgNJbnQEAWEFByRtYXRjaDAFAWEAAAETX3NhdmVXYXRjaGRvZ09mZnNldAEHb2Zmc2V0XwkAzAgCCQEMSW50ZWdlckVudHJ5AgUTS0VZX1dBVENIRE9HX09GRlNFVAUHb2Zmc2V0XwUDbmlsARFfb25seVRoaXNDb250cmFjdAEHY2FsbGVyXwMJAQIhPQIFB2NhbGxlcl8FBHRoaXMJAAIBAhlfb25seVRoaXNDb250cmFjdDogcmV2ZXJ0BgEQX3doZW5NdWx0aXNpZ1NldAADCQAAAgkBDV9sb2FkTXVsdGlzaWcACQEHQWRkcmVzcwEBAAkAAgECGF93aGVuTXVsdGlzaWdTZXQ6IHJldmVydAYBE193aGVuTm90SW5pdGlhbGl6ZWQABAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAMJAQIhPQIIBQdzdG9yYWdlAl8xAQAJAAIBAhtfd2hlbk5vdEluaXRpYWxpemVkOiByZXZlcnQGARBfd2hlbkluaXRpYWxpemVkAAQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQADCQAAAggFB3N0b3JhZ2UCXzEBAAkAAgECGF93aGVuSW5pdGlhbGl6ZWQ6IHJldmVydAYBDl93aGVuTm90UGF1c2VkAAMJAQpfbG9hZFBhdXNlAAkAAgECFl93aGVuTm90UGF1c2VkOiByZXZlcnQGAQtfd2hlblBhdXNlZAADCQEBIQEJAQpfbG9hZFBhdXNlAAkAAgECE193aGVuUGF1c2VkOiByZXZlcnQGAQtfb25seVBhdXNlcgEHY2FsbGVyXwMJAQIhPQIFB2NhbGxlcl8JAQtfbG9hZFBhdXNlcgAJAAIBAhNfb25seVBhdXNlcjogcmV2ZXJ0BgEOX2NoZWNrV2F0Y2hkb2cABAJ3ZAQHJG1hdGNoMAkAmggCCQENX2xvYWRXYXRjaGRvZwAFE0tFWV9XQVRDSERPR19IRUlHSFQDCQABAgUHJG1hdGNoMAIDSW50BAFhBQckbWF0Y2gwCQBkAgUBYQkBE19sb2FkV2F0Y2hkb2dPZmZzZXQAAAADCQBmAgUGaGVpZ2h0BQJ3ZAkAAgECFl9jaGVja1dhdGNoZG9nOiByZXZlcnQGAQxfZ2V0RGVjaW1hbHMBCGFzc2V0SWRfBAckbWF0Y2gwCQDsBwEJANkEAQUIYXNzZXRJZF8DCQABAgUHJG1hdGNoMAIFQXNzZXQEAWEFByRtYXRjaDAIBQFhCGRlY2ltYWxzCQACAQkArAICAhdfZ2V0RGVjaW1hbHM6IG5vIGFzc2V0PQUIYXNzZXRJZF8BEl9ub3JtYWxpemVEZWNpbWFscwQHYW1vdW50Xw9zb3VyY2VEZWNpbWFsc18PdGFyZ2V0RGVjaW1hbHNfBnJvdW5kXwMJAGcCBQ9zb3VyY2VEZWNpbWFsc18FD3RhcmdldERlY2ltYWxzXwkAbgQFB2Ftb3VudF8AAQkAbAYACgAACQBlAgUPc291cmNlRGVjaW1hbHNfBQ90YXJnZXREZWNpbWFsc18AAAAABQRET1dOBQZyb3VuZF8JAGgCBQdhbW91bnRfCQBsBgAKAAAJAGUCBQ90YXJnZXREZWNpbWFsc18FD3NvdXJjZURlY2ltYWxzXwAAAAAFBERPV04BFV9wcmVwYXJlQXNzZXRCYWxhbmNlcwEHYXNzZXRzXwoBCGZvbGRGdW5jAgNhY2MEZWxlbQkAzQgCBQNhY2MAAAoAAiRsBQdh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XzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQhmb2xkRnVuYwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgkAlAoCCAUGcmVzdWx0Al8yCAUGcmVzdWx0Al8zARxfaW5jcmVtZW50QmFsYW5jZXNCeVBheW1lbnRzBQliYWxhbmNlc18JcGF5bWVudHNfB2Fzc2V0c18JZGVjaW1hbHNfBGVycl8KAQhmb2xkRnVuYwIDYWNjBGVsZW0EBWluZGV4CAUDYWNjAl8xBAdwYXltZW50CQCRAwIFCXBheW1lbnRzXwUFaW5kZXgED3BheW1lbnRBc3NldFN0cgkBC19hc3NldFRvU3RyAQgFB3BheW1lbnQHYXNzZXRJZAQDZXJyAwkBAiE9AgUPcGF5bWVudEFzc2V0U3RyCQCRAwIFB2Fzc2V0c18FBWluZGV4CQACAQkArAICCQCsAgIFBGVycl8CCDogaW5kZXg9CQCkAwEFBWluZGV4BQR1bml0AwkAAAIFA2VycgUDZXJyBA1hc3NldERlY2ltYWxzCQEMX2dldERlY2ltYWxzAQUPcGF5bWVudEFzc2V0U3RyBApuZXdCYWxhbmNlCQBkAgUEZWxlbQkBEl9ub3JtYWxpemVEZWNpbWFscwQICQCRAwIFCXBheW1lbnRzXwUFaW5kZXgGYW1vdW50BQ1hc3NldERlY2ltYWxzBQlkZWNpbWFsc18FBERPV04JAJUKAwkAZAIFBWluZGV4AAEJAM0IAggFA2FjYwJfMgUKbmV3QmFsYW5jZQkAZAIIBQNhY2MCXzMFCm5ld0JhbGFuY2UJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4EBnJlc3VsdAoAAiRsBQliYWxhbmNlc18KAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCVCgMAAAUDbmls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aXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgEYX2dldFBheW1lbnRzRnJvbUJhbGFuY2VzBAdhc3NldHNfCWJhbGFuY2VzXwpyZWNpcGllbnRfD3NvdXJjZURlY2ltYWxzXwoBCGZvbGRGdW5jAgNhY2MEZWxlbQQFaW5kZXgIBQNhY2MCXzEJAJQKAgkAZAIFBWluZGV4AAEJAM0IAggFA2FjYwJfMgkBDlNjcmlwdFRyYW5zZmVyAwUKcmVjaXBpZW50XwkBEl9ub3JtYWxpemVEZWNpbWFscwQJAJEDAgUJYmFsYW5jZXNfBQVpbmRleAUPc291cmNlRGVjaW1hbHNfCQEMX2dldERlY2ltYWxzAQUEZWxlbQUERE9XTgkBC19zdHJUb0Fzc2V0AQUEZWxlbQQGcmVzdWx0CgACJGwFB2Fzc2V0c18KAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIAAAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQhmb2xkRnVuYwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACggFBnJlc3VsdAJfMgESX2NhbGN1bGF0ZU1pY3JvRmVlBQhiYWxhbmNlXwxlcXVpbGlicml1bV8Qd2VpZ2h0QW1wbGlmaWVyXw1zbGlwcGFnZVJhdGVfC2ZlZU1heFJhdGVfAwkAZgIFDGVxdWlsaWJyaXVtXwUIYmFsYW5jZV8ECXRocmVzaG9sZAkAawMFDGVxdWlsaWJyaXVtXwkAZQIFFE1BWF9XRUlHSFRfQU1QTElGSUVSBRB3ZWlnaHRBbXBsaWZpZXJfBRRNQVhfV0VJR0hUX0FNUExJRklFUgMJAGYCBQl0aHJlc2hvbGQFCGJhbGFuY2VfBAxtYXhEZXZpYXRpb24JAGUCBQl0aHJlc2hvbGQFCGJhbGFuY2VfBAdmZWVSYXRlCQBrAwkAawMFDG1heERldmlhdGlvbgUNc2xpcHBhZ2VSYXRlXwUUU0xJUFBBR0VfUkFURV9GQUNUT1IFD0ZFRV9SQVRFX0ZBQ1RPUgUMZXF1aWxpYnJpdW1fAwkAZgIFB2ZlZVJhdGUFC2ZlZU1heFJhdGVfCQBrAwUMbWF4RGV2aWF0aW9uBQtmZWVNYXhSYXRlXwUPRkVFX1JBVEVfRkFDVE9SCQBrAwUMbWF4RGV2aWF0aW9uBQdmZWVSYXRlBQ9GRUVfUkFURV9GQUNUT1IAAAQJdGhyZXNob2xkCQBrAwUMZXF1aWxpYnJpdW1fCQBkAgUUTUFYX1dFSUdIVF9BTVBMSUZJRVIFEHdlaWdodEFtcGxpZmllcl8FFE1BWF9XRUlHSFRfQU1QTElGSUVSAwkAZgIFCGJhbGFuY2VfBQl0aHJlc2hvbGQEDG1heERldmlhdGlvbgkAZQIFCGJhbGFuY2VfBQl0aHJlc2hvbGQEB2ZlZVJhdGUJAGsDCQBrAwUMbWF4RGV2aWF0aW9uBQ1zbGlwcGFnZVJhdGVfBRRTTElQUEFHRV9SQVRFX0ZBQ1RPUgUPRkVFX1JBVEVfRkFDVE9SBQxlcXVpbGlicml1bV8DCQBmAgUHZmVlUmF0ZQULZmVlTWF4UmF0ZV8JAGsDBQxtYXhEZXZpYXRpb24FC2ZlZU1heFJhdGVfBQ9GRUVfUkFURV9GQUNUT1IJAGsDBQxtYXhEZXZpYXRpb24FB2ZlZVJhdGUFD0ZFRV9SQVRFX0ZBQ1RPUgAAAQ1fY2FsY3VsYXRlRmVlBwliYWxhbmNlc18SYXNzZXRzVG90YWxTdXBwbHlfCHdlaWdodHNfDHNpZ21hV2VpZ2h0XxB3ZWlnaHRBbXBsaWZpZXJfDXNsaXBwYWdlUmF0ZV8LZmVlTWF4UmF0ZV8AAAEbX3ZhbGlkYXRlTGlxdWlkaXR5SW52YXJpYW50CxJwcmV2QXNzZXRCYWxhbmNlc18VcHJldkFzc2V0VG90YWxTdXBwbHlfDmFzc2V0QmFsYW5jZXNfEWFzc2V0VG90YWxTdXBwbHlfEnByZXZMcFRvdGFsU3VwcGx5Xw5scFRvdGFsU3VwcGx5Xw1hc3NldFdlaWdodHNfDHNpZ21hV2VpZ2h0XxB3ZWlnaHRBbXBsaWZpZXJfDXNsaXBwYWdlUmF0ZV8LZmVlTWF4UmF0ZV8DAwkAAAIFEnByZXZMcFRvdGFsU3VwcGx5XwAABgkAAAIFDmxwVG90YWxTdXBwbHlfAAAGBA5wcmV2QXNzZXRzUmF0ZQkAawMJAGUCBRVwcmV2QXNzZXRUb3RhbFN1cHBseV8JAQ1fY2FsY3VsYXRlRmVlBwUScHJldkFzc2V0QmFsYW5jZXNfBRVwcmV2QXNzZXRUb3RhbFN1cHBseV8FDWFzc2V0V2VpZ2h0c18FDHNpZ21hV2VpZ2h0XwUQd2VpZ2h0QW1wbGlmaWVyXwUNc2xpcHBhZ2VSYXRlXwULZmVlTWF4UmF0ZV8FC1JBVEVfRkFDVE9SBRJwcmV2THBUb3RhbFN1cHBseV8EDW5ld0Fzc2V0c1JhdGUJAGsDCQBlAgURYXNzZXRUb3RhbFN1cHBseV8JAQ1fY2FsY3VsYXRlRmVlBwUOYXNzZXRCYWxhbmNlc18FEWFzc2V0VG90YWxTdXBwbHlfBQ1hc3NldFdlaWdodHNfBQxzaWdtYVdlaWdodF8FEHdlaWdodEFtcGxpZmllcl8FDXNsaXBwYWdlUmF0ZV8FC2ZlZU1heFJhdGVfBQtSQVRFX0ZBQ1RPUgUObHBUb3RhbFN1cHBseV8EBGRpZmYJAGUCBQ1uZXdBc3NldHNSYXRlBQ5wcmV2QXNzZXRzUmF0ZQMDCQBnAgAABQRkaWZmCQBmAgkAaAIA////////////AQkBDl9sb2FkUHJlY2lzaW9uAAUEZGlmZgcJAAIBCQCsAgICKl92YWxpZGF0ZUxpcXVpZGl0eUludmFyaWFudDogcmV2ZXJ0OiBkaWZmPQkApAMBBQRkaWZmBgEWX3ZhbGlkYXRlU3dhcEludmFyaWFudAkScHJldkFzc2V0QmFsYW5jZXNfFXByZXZBc3NldFRvdGFsU3VwcGx5Xw5hc3NldEJhbGFuY2VzXxFhc3NldFRvdGFsU3VwcGx5Xw1hc3NldFdlaWdodHNfDHNpZ21hV2VpZ2h0XxB3ZWlnaHRBbXBsaWZpZXJfDXNsaXBwYWdlUmF0ZV8LZmVlTWF4UmF0ZV8ECHByZXZVdGlsCQBlAgUVcHJldkFzc2V0VG90YWxTdXBwbHlfCQENX2NhbGN1bGF0ZUZlZQcFEnByZXZBc3NldEJhbGFuY2VzXwUVcHJldkFzc2V0VG90YWxTdXBwbHlfBQ1hc3NldFdlaWdodHNfBQxzaWdtYVdlaWdodF8FEHdlaWdodEFtcGxpZmllcl8FDXNsaXBwYWdlUmF0ZV8FC2ZlZU1heFJhdGVfBAduZXdVdGlsCQBlAgURYXNzZXRUb3RhbFN1cHBseV8JAQ1fY2FsY3VsYXRlRmVlBwUOYXNzZXRCYWxhbmNlc18FEWFzc2V0VG90YWxTdXBwbHlfBQ1hc3NldFdlaWdodHNfBQxzaWdtYVdlaWdodF8FEHdlaWdodEFtcGxpZmllcl8FDXNsaXBwYWdlUmF0ZV8FC2ZlZU1heFJhdGVfBARkaWZmCQBlAgUHbmV3VXRpbAUIcHJldlV0aWwDAwkAZwIAAAUEZGlmZgkAZgIJAGgCAP///////////wEJAQ5fbG9hZFByZWNpc2lvbgAFBGRpZmYHCQACAQkArAICAiVfdmFsaWRhdGVTd2FwSW52YXJpYW50OiByZXZlcnQ6IGRpZmY9CQCkAwEFBGRpZmYGARhfdmFsaWRhdGVBc3NldEFsbG9jYXRpb24HCGJhbGFuY2VfEWFzc2V0VG90YWxTdXBwbHlfDHByZXZCYWxhbmNlXxVwcmV2QXNzZXRUb3RhbFN1cHBseV8Hd2VpZ2h0XwxzaWdtYVdlaWdodF8MbWF4QWxsb2NBbXBfBAtlcXVpbGlicml1bQkAawMFEWFzc2V0VG90YWxTdXBwbHlfBQd3ZWlnaHRfBQxzaWdtYVdlaWdodF8EEG1heEFsbG9jYXRpb25BbXADCQBmAgUIYmFsYW5jZV8FC2VxdWlsaWJyaXVtCQBkAgUNTUFYX0FNUExJRklFUgUMbWF4QWxsb2NBbXBfCQBlAgUNTUFYX0FNUExJRklFUgUMbWF4QWxsb2NBbXBfBA1tYXhBbGxvY2F0aW9uCQBrAwULZXF1aWxpYnJpdW0FEG1heEFsbG9jYXRpb25BbXAFDU1BWF9BTVBMSUZJRVIEEXByZXZNYXhBbGxvY2F0aW9uCQBrAwkAawMFFXByZXZBc3NldFRvdGFsU3VwcGx5XwUHd2VpZ2h0XwUMc2lnbWFXZWlnaHRfBRBtYXhBbGxvY2F0aW9uQW1wBQ1NQVhfQU1QTElGSUVSAwkAZgIFCGJhbGFuY2VfBQtlcXVpbGlicml1bQMJAGYCBQhiYWxhbmNlXwUNbWF4QWxsb2NhdGlvbgMJAGYCBRFwcmV2TWF4QWxsb2NhdGlvbgUMcHJldkJhbGFuY2VfCQACAQIgX3ZhbGlkYXRlQXNzZXRBbGxvY2F0aW9uOiBuZXcgdXADCQBmAgkAZQIFCGJhbGFuY2VfBQ1tYXhBbGxvY2F0aW9uCQBlAgUMcHJldkJhbGFuY2VfBRFwcmV2TWF4QWxsb2NhdGlvbgkAAgECIl92YWxpZGF0ZUFzc2V0QWxsb2NhdGlvbjogc3RpbGwgdXAGBgMJAGYCBQ1tYXhBbGxvY2F0aW9uBQhiYWxhbmNlXwMJAGYCBQxwcmV2QmFsYW5jZV8FEXByZXZNYXhBbGxvY2F0aW9uCQACAQIiX3ZhbGlkYXRlQXNzZXRBbGxvY2F0aW9uOiBuZXcgZG93bgMJAGYCCQBlAgUNbWF4QWxsb2NhdGlvbgUIYmFsYW5jZV8JAGUCBRFwcmV2TWF4QWxsb2NhdGlvbgUMcHJldkJhbGFuY2VfCQACAQIkX3ZhbGlkYXRlQXNzZXRBbGxvY2F0aW9uOiBzdGlsbCBkb3duBgYBE192YWxpZGF0ZUFsbG9jYXRpb24HDmFzc2V0QmFsYW5jZXNfEWFzc2V0VG90YWxTdXBwbHlfEnByZXZBc3NldEJhbGFuY2VzXxVwcmV2QXNzZXRUb3RhbFN1cHBseV8NYXNzZXRXZWlnaHRzXwxzaWdtYVdlaWdodF8MbWF4QWxsb2NBbXBfBgELX2NoZWNrcG9pbnQBBXVzZXJfBAZ1c2VyTHAJAQtfbG9hZFVzZXJMcAEFBXVzZXJfBAt1c2VyUHJvZml0cwkBEF9sb2FkVXNlclByb2ZpdHMBBQV1c2VyXwQNc2lnbWFGZWVQZXJMcAkBEl9sb2FkU2lnbWFGZWVQZXJMcAAEEXVzZXJTaWdtYUZlZVBlckxwCQEWX2xvYWRVc2VyU2lnbWFGZWVQZXJMcAEFBXVzZXJfCgEIZm9sZEZ1bmMCA2FjYwRlbGVtBAVpbmRleAgFA2FjYwJfMQQNcHJvZml0VXBkYXRlZAkAZAIJAJEDAgULdXNlclByb2ZpdHMFBWluZGV4CQCgAwEJALwCAwkAtgIBBQZ1c2VyTHAJALgCAgkAkQMCBQ1zaWdtYUZlZVBlckxwBQVpbmRleAkAkQMCBRF1c2VyU2lnbWFGZWVQZXJMcAUFaW5kZXgFDlBFUkNFTlRfRkFDVE9SCQCUCgIJAGQCBQVpbmRleAABCQDNCAIIBQNhY2MCXzIFDXByb2ZpdFVwZGF0ZWQEDSR0MDI1NTU4MjU2MzEKAAIkbAUQWkVST19JTlRfTElTVF8xMQoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgAABQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCGZvbGRGdW5jAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsEA2lkeAgFDSR0MDI1NTU4MjU2MzECXzEEDnByb2ZpdHNVcGRhdGVkCAUNJHQwMjU1NTgyNTYzMQJfMgkAlAoCCQDOCAIJARBfc2F2ZVVzZXJQcm9maXRzAgUFdXNlcl8FDnByb2ZpdHNVcGRhdGVkCQEWX3NhdmVVc2VyU2lnbWFGZWVQZXJMcAIFBXVzZXJfBQ1zaWdtYUZlZVBlckxwBQ5wcm9maXRzVXBkYXRlZAEUX3VwZGF0ZVNpZ21hRmVlUGVyTHAEDnNpZ21hRmVlUGVyTHBfCHRvdGFsTHBfBmluZGV4XwZscEZlZV8KAQhmb2xkRnVuYwIDYWNjBGVsZW0EBWluZGV4CAUDYWNjAl8xBBRzaWdtYUZlZVBlckxwVXBkYXRlZAMJAAACBQZpbmRleF8FBWluZGV4CQC3AgIJAJEDAgUOc2lnbWFGZWVQZXJMcF8FBWluZGV4CQC8AgMJALYCAQUGbHBGZWVfBQ5QRVJDRU5UX0ZBQ1RPUgkAtgIBBQh0b3RhbExwXwkAkQMCBQ5zaWdtYUZlZVBlckxwXwUFaW5kZXgJAJQKAgkAZAIFBWluZGV4AAEJAM0IAggFA2FjYwJfMgUUc2lnbWFGZWVQZXJMcFVwZGF0ZWQEDSR0MDI2MjgxMjYzNjAKAAIkbAUQWkVST19JTlRfTElTVF8xMQoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgAABQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCGZvbGRGdW5jAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsEA2lkeAgFDSR0MDI2MjgxMjYzNjACXzEEFHNpZ21hRmVlUGVyTHBVcGRhdGVkCAUNJHQwMjYyODEyNjM2MAJfMgUUc2lnbWFGZWVQZXJMcFVwZGF0ZWQBG19jYWxjdWxhdGVMcEFuZFByb3RvY29sRmVlcwQLYXNzZXRJbmRleF8HYW1vdW50XwpscEZlZVJhdGVfEHByb3RvY29sRmVlUmF0ZV8EDXNpZ21hRmVlUGVyTHAJARJfbG9hZFNpZ21hRmVlUGVyTHAABAd0b3RhbExwCQEMX2xvYWRUb3RhbExwAAQNJHQwMjY1ODEyNjg1NgMJAAACBQd0b3RhbExwAAAJAJQKAgAACQBrAwUHYW1vdW50XwUQcHJvdG9jb2xGZWVSYXRlXwUHTUFYX0ZFRQkAlAoCCQBrAwUHYW1vdW50XwUKbHBGZWVSYXRlXwUHTUFYX0ZFRQkAawMFB2Ftb3VudF8FEHByb3RvY29sRmVlUmF0ZV8FB01BWF9GRUUEBWxwRmVlCAUNJHQwMjY1ODEyNjg1NgJfMQQLcHJvdG9jb2xGZWUIBQ0kdDAyNjU4MTI2ODU2Al8yBBRzaWdtYUZlZVBlckxwVXBkYXRlZAMJAAACBQVscEZlZQAABQ1zaWdtYUZlZVBlckxwCQEUX3VwZGF0ZVNpZ21hRmVlUGVyTHAEBQ1zaWdtYUZlZVBlckxwBQd0b3RhbExwBQthc3NldEluZGV4XwUFbHBGZWUJAJUKAwUFbHBGZWUFC3Byb3RvY29sRmVlBRRzaWdtYUZlZVBlckxwVXBkYXRlZAELX2RlcG9zaXRBbGwBB2Ftb3VudF8EB3N0b3JhZ2UJAQxfbG9hZFN0b3JhZ2UABA1scFRvdGFsU3VwcGx5CAUHc3RvcmFnZQJfMwQPd2VpZ2h0QW1wbGlmaWVyCAUHc3RvcmFnZQJfNwQMc2xpcHBhZ2VSYXRlCAUHc3RvcmFnZQJfOAQKZmVlTWF4UmF0ZQgFB3N0b3JhZ2UCXzkEBmFzc2V0cwkBC19sb2FkQXNzZXRzAAQNJHQwMjczNjUyNzQxOAkBEV9sb2FkQXNzZXRXZWlnaHRzAAQMYXNzZXRXZWlnaHRzCAUNJHQwMjczNjUyNzQxOAJfMQQLc2lnbWFXZWlnaHQIBQ0kdDAyNzM2NTI3NDE4Al8yBA0kdDAyNzQyMzI3NDkxCQESX2xvYWRBc3NldEJhbGFuY2VzAAQRcHJldkFzc2V0QmFsYW5jZXMIBQ0kdDAyNzQyMzI3NDkxAl8xBBRwcmV2QXNzZXRUb3RhbFN1cHBseQgFDSR0MDI3NDIzMjc0OTECXzIEDSR0MDI3NDk3Mjg3MjcDCQAAAgUUcHJldkFzc2V0VG90YWxTdXBwbHkAAAoBCGZvbGRGdW5jAgNhY2MEZWxlbQQFaW5kZXgIBQNhY2MCXzEEGHJlcXVpcmVkQW1vdW50Tm9ybWFsaXplZAkAawMJAJEDAgUMYXNzZXRXZWlnaHRzBQVpbmRleAUHYW1vdW50XwULc2lnbWFXZWlnaHQJAJQKAgkAZAIFBWluZGV4AAEJAM0IAggFA2FjYwJfMgUYcmVxdWlyZWRBbW91bnROb3JtYWxpemVkBA0kdDAyNzkzOTI4MDEzCgACJGwFBmFzc2V0cwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgAABQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCGZvbGRGdW5jAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKBANpZHgIBQ0kdDAyNzkzOTI4MDEzAl8xBBlyZXF1aXJlZEFtb3VudHNOb3JtYWxpemVkCAUNJHQwMjc5MzkyODAxMwJfMgkAlAoCBQdhbW91bnRfBRlyZXF1aXJlZEFtb3VudHNOb3JtYWxpemVkBAVyYXRpbwkAvAIDCQC2AgEFB2Ftb3VudF8FDlBFUkNFTlRfRkFDVE9SCQC2AgEFFHByZXZBc3NldFRvdGFsU3VwcGx5CgEJZm9sZEZ1bmMxAgNhY2MEZWxlbQQFaW5kZXgIBQNhY2MCXzEEGHJlcXVpcmVkQW1vdW50Tm9ybWFsaXplZAkAoAMBCQC8AgMFBXJhdGlvCQC2AgEJAJEDAgURcHJldkFzc2V0QmFsYW5jZXMFBWluZGV4BQ5QRVJDRU5UX0ZBQ1RPUgkAlAoCCQBkAgUFaW5kZXgAAQkAzQgCCAUDYWNjAl8yBRhyZXF1aXJlZEFtb3VudE5vcm1hbGl6ZWQEDSR0MDI4NTU2Mjg2MzEKAAIkbAUGYXNzZXRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCAAAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEJZm9sZEZ1bmMxAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKBANpZHgIBQ0kdDAyODU1NjI4NjMxAl8xBBlyZXF1aXJlZEFtb3VudHNOb3JtYWxpemVkCAUNJHQwMjg1NTYyODYzMQJfMgkAlAoCCQBrAwUHYW1vdW50XwUNbHBUb3RhbFN1cHBseQUUcHJldkFzc2V0VG90YWxTdXBwbHkFGXJlcXVpcmVkQW1vdW50c05vcm1hbGl6ZWQEDmxwVG9rZW5zVG9NaW50CAUNJHQwMjc0OTcyODcyNwJfMQQZcmVxdWlyZWRBbW91bnRzTm9ybWFsaXplZAgFDSR0MDI3NDk3Mjg3MjcCXzIEDSR0MDI4NzMzMjg4NDYJARtfaW5jcmVtZW50QmFsYW5jZXNCeUFtb3VudHMCBRFwcmV2QXNzZXRCYWxhbmNlcwUZcmVxdWlyZWRBbW91bnRzTm9ybWFsaXplZAQNYXNzZXRCYWxhbmNlcwgFDSR0MDI4NzMzMjg4NDYCXzEEEGFzc2V0VG90YWxTdXBwbHkIBQ0kdDAyODczMzI4ODQ2Al8yBARlcnIyCQEbX3ZhbGlkYXRlTGlxdWlkaXR5SW52YXJpYW50CwURcHJldkFzc2V0QmFsYW5jZXMFFHByZXZBc3NldFRvdGFsU3VwcGx5BQ1hc3NldEJhbGFuY2VzBRBhc3NldFRvdGFsU3VwcGx5BQ1scFRvdGFsU3VwcGx5CQBkAgUNbHBUb3RhbFN1cHBseQUObHBUb2tlbnNUb01pbnQFDGFzc2V0V2VpZ2h0cwULc2lnbWFXZWlnaHQFD3dlaWdodEFtcGxpZmllcgUMc2xpcHBhZ2VSYXRlBQpmZWVNYXhSYXRlAwkAAAIFBGVycjIFBGVycjIJAJUKAwUObHBUb2tlbnNUb01pbnQFGXJlcXVpcmVkQW1vdW50c05vcm1hbGl6ZWQFDWFzc2V0QmFsYW5jZXMJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BCF9kZXBvc2l0Aghhc3NldElkXwdhbW91bnRfBAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAQNbHBUb3RhbFN1cHBseQgFB3N0b3JhZ2UCXzMECWxwRmVlUmF0ZQgFB3N0b3JhZ2UCXzQED3Byb3RvY29sRmVlUmF0ZQgFB3N0b3JhZ2UCXzUEEW1heEFsbG9jQW1wbGlmaWVyCAUHc3RvcmFnZQJfNgQPd2VpZ2h0QW1wbGlmaWVyCAUHc3RvcmFnZQJfNwQMc2xpcHBhZ2VSYXRlCAUHc3RvcmFnZQJfOAQKZmVlTWF4UmF0ZQgFB3N0b3JhZ2UCXzkEBmFzc2V0cwkBC19sb2FkQXNzZXRzAAQNJHQwMjk2MDkyOTY2MgkBEV9sb2FkQXNzZXRXZWlnaHRzAAQMYXNzZXRXZWlnaHRzCAUNJHQwMjk2MDkyOTY2MgJfMQQLc2lnbWFXZWlnaHQIBQ0kdDAyOTYwOTI5NjYyAl8yBA0kdDAyOTY2NzI5NzgxCQESX2xvYWRBc3NldEJhbGFuY2VzAAQRcHJldkFzc2V0QmFsYW5jZXMIBQ0kdDAyOTY2NzI5NzgxAl8xBBRwcmV2QXNzZXRUb3RhbFN1cHBseQgFDSR0MDI5NjY3Mjk3ODECXzIEDWFzc2V0QmFsYW5jZXMJARhfaW5jcmVtZW50QmFsYW5jZUJ5SW5kZXgDBRFwcmV2QXNzZXRCYWxhbmNlcwkBBXZhbHVlAQkAzwgCBQZhc3NldHMFCGFzc2V0SWRfBQdhbW91bnRfBBBhc3NldFRvdGFsU3VwcGx5CQBkAgUUcHJldkFzc2V0VG90YWxTdXBwbHkFB2Ftb3VudF8EBGVycjIJARNfdmFsaWRhdGVBbGxvY2F0aW9uBwUNYXNzZXRCYWxhbmNlcwUQYXNzZXRUb3RhbFN1cHBseQURcHJldkFzc2V0QmFsYW5jZXMFFHByZXZBc3NldFRvdGFsU3VwcGx5BQxhc3NldFdlaWdodHMFC3NpZ21hV2VpZ2h0BRFtYXhBbGxvY0FtcGxpZmllcgMJAAACBQRlcnIyBQRlcnIyBAdwcmV2RmVlCQENX2NhbGN1bGF0ZUZlZQcFEXByZXZBc3NldEJhbGFuY2VzBRRwcmV2QXNzZXRUb3RhbFN1cHBseQUMYXNzZXRXZWlnaHRzBQtzaWdtYVdlaWdodAUPd2VpZ2h0QW1wbGlmaWVyBQxzbGlwcGFnZVJhdGUFCmZlZU1heFJhdGUEA2ZlZQkBDV9jYWxjdWxhdGVGZWUHBQ1hc3NldEJhbGFuY2VzBRBhc3NldFRvdGFsU3VwcGx5BQxhc3NldFdlaWdodHMFC3NpZ21hV2VpZ2h0BQ93ZWlnaHRBbXBsaWZpZXIFDHNsaXBwYWdlUmF0ZQUKZmVlTWF4UmF0ZQQObHBUb2tlbnNUb01pbnQDCQAAAgUNbHBUb3RhbFN1cHBseQAACQACAQIUX2RlcG9zaXQ6IGVtcHR5IHBvb2wECWFzc2V0RGlmZgkAZQIFEGFzc2V0VG90YWxTdXBwbHkFFHByZXZBc3NldFRvdGFsU3VwcGx5BAdmZWVEaWZmCQBlAgUDZmVlBQdwcmV2RmVlBBN1dGlsaXR5Q2hhbmdlRmFjdG9yCQBrAwkAZQIFCWFzc2V0RGlmZgUHZmVlRGlmZgULUkFURV9GQUNUT1IJAGUCBRRwcmV2QXNzZXRUb3RhbFN1cHBseQUHcHJldkZlZQQTbHBUb2tlbnNUb01pbnRJbm5lcgkAawMFDWxwVG90YWxTdXBwbHkFE3V0aWxpdHlDaGFuZ2VGYWN0b3IFC1JBVEVfRkFDVE9SBARlcnIzCQEbX3ZhbGlkYXRlTGlxdWlkaXR5SW52YXJpYW50CwURcHJldkFzc2V0QmFsYW5jZXMFFHByZXZBc3NldFRvdGFsU3VwcGx5BQ1hc3NldEJhbGFuY2VzBRBhc3NldFRvdGFsU3VwcGx5BQ1scFRvdGFsU3VwcGx5CQBkAgUNbHBUb3RhbFN1cHBseQUTbHBUb2tlbnNUb01pbnRJbm5lcgUMYXNzZXRXZWlnaHRzBQtzaWdtYVdlaWdodAUPd2VpZ2h0QW1wbGlmaWVyBQxzbGlwcGFnZVJhdGUFCmZlZU1heFJhdGUDCQAAAgUEZXJyMwUEZXJyMwUTbHBUb2tlbnNUb01pbnRJbm5lcgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgQNJHQwMzE0NDMzMTU3NAkBG19jYWxjdWxhdGVMcEFuZFByb3RvY29sRmVlcwQAAAUObHBUb2tlbnNUb01pbnQJAGkCBQlscEZlZVJhdGUAAgkAaQIFD3Byb3RvY29sRmVlUmF0ZQACBAVscEZlZQgFDSR0MDMxNDQzMzE1NzQCXzEEC3Byb3RvY29sRmVlCAUNJHQwMzE0NDMzMTU3NAJfMgQUc2lnbWFGZWVQZXJMcFVwZGF0ZWQIBQ0kdDAzMTQ0MzMxNTc0Al8zCQCXCgUFDmxwVG9rZW5zVG9NaW50BQ1hc3NldEJhbGFuY2VzBQVscEZlZQULcHJvdG9jb2xGZWUFFHNpZ21hRmVlUGVyTHBVcGRhdGVkCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQxfd2l0aGRyYXdBbGwBB2Ftb3VudF8EB3N0b3JhZ2UJAQxfbG9hZFN0b3JhZ2UABA1scFRvdGFsU3VwcGx5CAUHc3RvcmFnZQJfMwQRbWF4QWxsb2NBbXBsaWZpZXIIBQdzdG9yYWdlAl82BA93ZWlnaHRBbXBsaWZpZXIIBQdzdG9yYWdlAl83BAxzbGlwcGFnZVJhdGUIBQdzdG9yYWdlAl84BApmZWVNYXhSYXRlCAUHc3RvcmFnZQJfOQQNJHQwMzE5MDgzMTk3NgkBEl9sb2FkQXNzZXRCYWxhbmNlcwAEEXByZXZBc3NldEJhbGFuY2VzCAUNJHQwMzE5MDgzMTk3NgJfMQQUcHJldkFzc2V0VG90YWxTdXBwbHkIBQ0kdDAzMTkwODMxOTc2Al8yBA0kdDAzMTk4MTMyMDM0CQERX2xvYWRBc3NldFdlaWdodHMABAxhc3NldFdlaWdodHMIBQ0kdDAzMTk4MTMyMDM0Al8xBAtzaWdtYVdlaWdodAgFDSR0MDMxOTgxMzIwMzQCXzIEDmxwVG9rZW5zVG9CdXJuBQdhbW91bnRfBANlcnIJAQxfdmFsaWRhdGVJbnQEBQ5scFRva2Vuc1RvQnVybgAABQdNQVhfSU5UAihfd2l0aGRyYXdBbGw6IGxwVG9rZW5zVG9CdXJuIGxlc3MgdGhhbiAwAwkAAAIFA2VycgUDZXJyBA0kdDAzMjE3NjMyMzA5CQEcX2RlY3JlbWVudEJhbGFuY2VzQnlMcEFtb3VudAMFEXByZXZBc3NldEJhbGFuY2VzBQ5scFRva2Vuc1RvQnVybgUNbHBUb3RhbFN1cHBseQQNYXNzZXRCYWxhbmNlcwgFDSR0MDMyMTc2MzIzMDkCXzEEEGFzc2V0VG90YWxTdXBwbHkIBQ0kdDAzMjE3NjMyMzA5Al8yBA1iYWxhbmNlc1RvUGF5CAUNJHQwMzIxNzYzMjMwOQJfMwQEZXJyMgkBG192YWxpZGF0ZUxpcXVpZGl0eUludmFyaWFudAsFEXByZXZBc3NldEJhbGFuY2VzBRRwcmV2QXNzZXRUb3RhbFN1cHBseQUNYXNzZXRCYWxhbmNlcwUQYXNzZXRUb3RhbFN1cHBseQUNbHBUb3RhbFN1cHBseQkAZQIFDWxwVG90YWxTdXBwbHkFDmxwVG9rZW5zVG9CdXJuBQxhc3NldFdlaWdodHMFC3NpZ21hV2VpZ2h0BQ93ZWlnaHRBbXBsaWZpZXIFDHNsaXBwYWdlUmF0ZQUKZmVlTWF4UmF0ZQMJAAACBQRlcnIyBQRlcnIyCQCVCgMFDmxwVG9rZW5zVG9CdXJuBQ1iYWxhbmNlc1RvUGF5BQ1hc3NldEJhbGFuY2VzCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQlfd2l0aGRyYXcCCGFzc2V0SWRfCWxwQW1vdW50XwQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQAEDWxwVG90YWxTdXBwbHkIBQdzdG9yYWdlAl8zBAlscEZlZVJhdGUIBQdzdG9yYWdlAl80BA9wcm90b2NvbEZlZVJhdGUIBQdzdG9yYWdlAl81BBFtYXhBbGxvY0FtcGxpZmllcggFB3N0b3JhZ2UCXzYED3dlaWdodEFtcGxpZmllcggFB3N0b3JhZ2UCXzcEDHNsaXBwYWdlUmF0ZQgFB3N0b3JhZ2UCXzgECmZlZU1heFJhdGUIBQdzdG9yYWdlAl85BAlwcmVjaXNpb24JAQ5fbG9hZFByZWNpc2lvbgAEBmFzc2V0cwkBC19sb2FkQXNzZXRzAAQNJHQwMzMxMDEzMzE2OQkBEl9sb2FkQXNzZXRCYWxhbmNlcwAEEXByZXZBc3NldEJhbGFuY2VzCAUNJHQwMzMxMDEzMzE2OQJfMQQUcHJldkFzc2V0VG90YWxTdXBwbHkIBQ0kdDAzMzEwMTMzMTY5Al8yBA0kdDAzMzE3NDMzMjI3CQERX2xvYWRBc3NldFdlaWdodHMABAxhc3NldFdlaWdodHMIBQ0kdDAzMzE3NDMzMjI3Al8xBAtzaWdtYVdlaWdodAgFDSR0MDMzMTc0MzMyMjcCXzIEEHRhcmdldEFzc2V0SW5kZXgJAQV2YWx1ZQEJAM8IAgUGYXNzZXRzBQhhc3NldElkXwQHcHJldkZlZQkBDV9jYWxjdWxhdGVGZWUHBRFwcmV2QXNzZXRCYWxhbmNlcwUUcHJldkFzc2V0VG90YWxTdXBwbHkFDGFzc2V0V2VpZ2h0cwULc2lnbWFXZWlnaHQFD3dlaWdodEFtcGxpZmllcgUMc2xpcHBhZ2VSYXRlBQpmZWVNYXhSYXRlBA1wcmV2VXRpbFZhbHVlCQBlAgUUcHJldkFzc2V0VG90YWxTdXBwbHkFB3ByZXZGZWUEAWsJALwCAwkAtgIBCQBlAgUNbHBUb3RhbFN1cHBseQUJbHBBbW91bnRfBQ5QRVJDRU5UX0ZBQ1RPUgkAtgIBBQ1scFRvdGFsU3VwcGx5BBJwcmV2VXRpbFZhbHVlV2l0aEsJAKADAQkAvAIDCQC2AgEFDXByZXZVdGlsVmFsdWUFAWsFDlBFUkNFTlRfRkFDVE9SBBJwcmV2VXRpbFZhbHVlRGl2THAJAL0CBAkAtgIBBQ1wcmV2VXRpbFZhbHVlBQ5QRVJDRU5UX0ZBQ1RPUgkAtgIBBQ1scFRvdGFsU3VwcGx5BQdDRUlMSU5HCgEIZm9sZEZ1bmMCA2FjYwRlbGVtAwgFA2FjYwJfMQUDYWNjBApzdGFydElubmVyCAUDYWNjAl8yBAlzdG9wSW5uZXIIBQNhY2MCXzMEDWN1cnJlbnRBbW91bnQJAGkCCQBkAgUJc3RvcElubmVyBQpzdGFydElubmVyAAIEEXRlbXBBc3NldEJhbGFuY2VzCQEYX2RlY3JlbWVudEJhbGFuY2VCeUluZGV4AwURcHJldkFzc2V0QmFsYW5jZXMFEHRhcmdldEFzc2V0SW5kZXgFDWN1cnJlbnRBbW91bnQEFHRlbXBBc3NldFRvdGFsU3VwcGx5CQBlAgUUcHJldkFzc2V0VG90YWxTdXBwbHkFDWN1cnJlbnRBbW91bnQECXV0aWxWYWx1ZQkAZQIFFHRlbXBBc3NldFRvdGFsU3VwcGx5CQENX2NhbGN1bGF0ZUZlZQcFEXRlbXBBc3NldEJhbGFuY2VzBRR0ZW1wQXNzZXRUb3RhbFN1cHBseQUMYXNzZXRXZWlnaHRzBQtzaWdtYVdlaWdodAUPd2VpZ2h0QW1wbGlmaWVyBQxzbGlwcGFnZVJhdGUFCmZlZU1heFJhdGUDAwkAZgIJAGUCBQl1dGlsVmFsdWUFEnByZXZVdGlsVmFsdWVXaXRoSwkAaAIA////////////AQUJcHJlY2lzaW9uCQBmAgUJcHJlY2lzaW9uCQBlAgUJdXRpbFZhbHVlBRJwcmV2VXRpbFZhbHVlV2l0aEsHCQCXCgUGBQpzdGFydElubmVyBQlzdG9wSW5uZXIFDWN1cnJlbnRBbW91bnQJAGUCBQl1dGlsVmFsdWUFEnByZXZVdGlsVmFsdWVXaXRoSwMJAGYCAAAJAGUCBQl1dGlsVmFsdWUFEnByZXZVdGlsVmFsdWVXaXRoSwkAlwoFBwUKc3RhcnRJbm5lcgUNY3VycmVudEFtb3VudAUNY3VycmVudEFtb3VudAkAZQIFCXV0aWxWYWx1ZQUScHJldlV0aWxWYWx1ZVdpdGhLCQCXCgUHBQ1jdXJyZW50QW1vdW50BQlzdG9wSW5uZXIFDWN1cnJlbnRBbW91bnQJAGUCBQl1dGlsVmFsdWUFEnByZXZVdGlsVmFsdWVXaXRoSwQMdGFyZ2V0QW1vdW50BARzdG9wCQCgAwEJAL0CBAkAtgIBCQBkAgUJbHBBbW91bnRfBQdwcmV2RmVlBRJwcmV2VXRpbFZhbHVlRGl2THAFDlBFUkNFTlRfRkFDVE9SBQdDRUlMSU5HBA0kdDAzNTA5MzM1MjA1CgACJGwFB0xJU1RfNjQKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCXCgUHAAAFBHN0b3AAAAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQhmb2xkRnVuYwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgNjQJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUABUAFgAXABgAGQAaABsAHAAdAB4AHwAgACEAIgAjACQAJQAmACcAKAApACoAKwAsAC0ALgAvADAAMQAyADMANAA1ADYANwA4ADkAOgA7ADwAPQA+AD8AQAQHc3VjY2VzcwgFDSR0MDM1MDkzMzUyMDUCXzEECHN0YXJ0T3V0CAUNJHQwMzUwOTMzNTIwNQJfMgQHc3RvcE91dAgFDSR0MDM1MDkzMzUyMDUCXzMED3RhcmdldEFtb3VudE91dAgFDSR0MDM1MDkzMzUyMDUCXzQEB2RpZmZPdXQIBQ0kdDAzNTA5MzM1MjA1Al81AwkBASEBBQdzdWNjZXNzCQACAQkArAICCQCsAgIJAKwCAgIoX3dpdGhkcmF3OiBjYW4ndCBjYWxjdWxhdGUgdGFyZ2V0QW1vdW50PQkApAMBBQ90YXJnZXRBbW91bnRPdXQCBixkaWZmPQkApAMBBQdkaWZmT3V0BQ90YXJnZXRBbW91bnRPdXQEEmZpbmFsQXNzZXRCYWxhbmNlcwkBGF9kZWNyZW1lbnRCYWxhbmNlQnlJbmRleAMFEXByZXZBc3NldEJhbGFuY2VzBRB0YXJnZXRBc3NldEluZGV4BQx0YXJnZXRBbW91bnQEFWZpbmFsQXNzZXRUb3RhbFN1cHBseQkAZQIFFHByZXZBc3NldFRvdGFsU3VwcGx5BQx0YXJnZXRBbW91bnQEBGVycjEDCQETX3ZhbGlkYXRlQWxsb2NhdGlvbgcFEmZpbmFsQXNzZXRCYWxhbmNlcwUVZmluYWxBc3NldFRvdGFsU3VwcGx5BRFwcmV2QXNzZXRCYWxhbmNlcwUUcHJldkFzc2V0VG90YWxTdXBwbHkFDGFzc2V0V2VpZ2h0cwULc2lnbWFXZWlnaHQFEW1heEFsbG9jQW1wbGlmaWVyCQEbX3ZhbGlkYXRlTGlxdWlkaXR5SW52YXJpYW50CwURcHJldkFzc2V0QmFsYW5jZXMFFHByZXZBc3NldFRvdGFsU3VwcGx5BRJmaW5hbEFzc2V0QmFsYW5jZXMFFWZpbmFsQXNzZXRUb3RhbFN1cHBseQUNbHBUb3RhbFN1cHBseQkAZQIFDWxwVG90YWxTdXBwbHkFCWxwQW1vdW50XwUMYXNzZXRXZWlnaHRzBQtzaWdtYVdlaWdodAUPd2VpZ2h0QW1wbGlmaWVyBQxzbGlwcGFnZVJhdGUFCmZlZU1heFJhdGUHAwkAAAIFBGVycjEFBGVycjEEDSR0MDM2MTk3MzYzNDUJARtfY2FsY3VsYXRlTHBBbmRQcm90b2NvbEZlZXMECQBkAgUQdGFyZ2V0QXNzZXRJbmRleAABBQx0YXJnZXRBbW91bnQJAGkCBQlscEZlZVJhdGUAAgkAaQIFD3Byb3RvY29sRmVlUmF0ZQACBAVscEZlZQgFDSR0MDM2MTk3MzYzNDUCXzEEC3Byb3RvY29sRmVlCAUNJHQwMzYxOTczNjM0NQJfMgQUc2lnbWFGZWVQZXJMcFVwZGF0ZWQIBQ0kdDAzNjE5NzM2MzQ1Al8zCQCXCgUFDHRhcmdldEFtb3VudAUSZmluYWxBc3NldEJhbGFuY2VzBQVscEZlZQULcHJvdG9jb2xGZWUFFHNpZ21hRmVlUGVyTHBVcGRhdGVkCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQVfc3dhcAMRc291cmNlQXNzZXRJbmRleF8RdGFyZ2V0QXNzZXRJbmRleF8Nc291cmNlQW1vdW50XwQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQAECWxwQXNzZXRJZAgFB3N0b3JhZ2UCXzEECmxwRGVjaW1hbHMJAQxfZ2V0RGVjaW1hbHMBCQDYBAEFCWxwQXNzZXRJZAQNbHBUb3RhbFN1cHBseQgFB3N0b3JhZ2UCXzMECWxwRmVlUmF0ZQgFB3N0b3JhZ2UCXzQED3Byb3RvY29sRmVlUmF0ZQgFB3N0b3JhZ2UCXzUEEW1heEFsbG9jQW1wbGlmaWVyCAUHc3RvcmFnZQJfNgQPd2VpZ2h0QW1wbGlmaWVyCAUHc3RvcmFnZQJfNwQMc2xpcHBhZ2VSYXRlCAUHc3RvcmFnZQJfOAQKZmVlTWF4UmF0ZQgFB3N0b3JhZ2UCXzkECXByZWNpc2lvbgkBDl9sb2FkUHJlY2lzaW9uAAQNJHQwMzY5MjczNjk5NQkBEl9sb2FkQXNzZXRCYWxhbmNlcwAEEXByZXZBc3NldEJhbGFuY2VzCAUNJHQwMzY5MjczNjk5NQJfMQQUcHJldkFzc2V0VG90YWxTdXBwbHkIBQ0kdDAzNjkyNzM2OTk1Al8yBA0kdDAzNzAwMDM3MDUzCQERX2xvYWRBc3NldFdlaWdodHMABAxhc3NldFdlaWdodHMIBQ0kdDAzNzAwMDM3MDUzAl8xBAtzaWdtYVdlaWdodAgFDSR0MDM3MDAwMzcwNTMCXzIEDWFzc2V0QmFsYW5jZXMJARhfaW5jcmVtZW50QmFsYW5jZUJ5SW5kZXgDBRFwcmV2QXNzZXRCYWxhbmNlcwURc291cmNlQXNzZXRJbmRleF8FDXNvdXJjZUFtb3VudF8EEGFzc2V0VG90YWxTdXBwbHkJAGQCBRRwcmV2QXNzZXRUb3RhbFN1cHBseQUNc291cmNlQW1vdW50XwQHcHJldkZlZQkBDV9jYWxjdWxhdGVGZWUHBRFwcmV2QXNzZXRCYWxhbmNlcwUUcHJldkFzc2V0VG90YWxTdXBwbHkFDGFzc2V0V2VpZ2h0cwULc2lnbWFXZWlnaHQFD3dlaWdodEFtcGxpZmllcgUMc2xpcHBhZ2VSYXRlBQpmZWVNYXhSYXRlBA1wcmV2VXRpbFZhbHVlCQBlAgUUcHJldkFzc2V0VG90YWxTdXBwbHkFB3ByZXZGZWUKAQhmb2xkRnVuYwIDYWNjBGVsZW0DCAUDYWNjAl8xBQNhY2MECnN0YXJ0SW5uZXIIBQNhY2MCXzIECXN0b3BJbm5lcggFA2FjYwJfMwQNY3VycmVudEFtb3VudAkAaQIJAGQCBQlzdG9wSW5uZXIFCnN0YXJ0SW5uZXIAAgQRdGVtcEFzc2V0QmFsYW5jZXMJARhfZGVjcmVtZW50QmFsYW5jZUJ5SW5kZXgDBQ1hc3NldEJhbGFuY2VzBRF0YXJnZXRBc3NldEluZGV4XwUNY3VycmVudEFtb3VudAQUdGVtcEFzc2V0VG90YWxTdXBwbHkJAGUCBRBhc3NldFRvdGFsU3VwcGx5BQ1jdXJyZW50QW1vdW50BAl1dGlsVmFsdWUJAGUCBRR0ZW1wQXNzZXRUb3RhbFN1cHBseQkBDV9jYWxjdWxhdGVGZWUHBRF0ZW1wQXNzZXRCYWxhbmNlcwUUdGVtcEFzc2V0VG90YWxTdXBwbHkFDGFzc2V0V2VpZ2h0cwULc2lnbWFXZWlnaHQFD3dlaWdodEFtcGxpZmllcgUMc2xpcHBhZ2VSYXRlBQpmZWVNYXhSYXRlAwMJAGYCCQBlAgUJdXRpbFZhbHVlBQ1wcmV2VXRpbFZhbHVlCQBoAgD///////////8BBQlwcmVjaXNpb24JAGYCBQlwcmVjaXNpb24JAGUCBQl1dGlsVmFsdWUFDXByZXZVdGlsVmFsdWUHCQCXCgUGBQpzdGFydElubmVyBQlzdG9wSW5uZXIFDWN1cnJlbnRBbW91bnQJAGUCBQl1dGlsVmFsdWUFDXByZXZVdGlsVmFsdWUDCQBmAgAACQBlAgUJdXRpbFZhbHVlBQ1wcmV2VXRpbFZhbHVlCQCXCgUHBQpzdGFydElubmVyBQ1jdXJyZW50QW1vdW50BQ1jdXJyZW50QW1vdW50CQBlAgUJdXRpbFZhbHVlBQ1wcmV2VXRpbFZhbHVlCQCXCgUHBQ1jdXJyZW50QW1vdW50BQlzdG9wSW5uZXIFDWN1cnJlbnRBbW91bnQJAGUCBQl1dGlsVmFsdWUFDXByZXZVdGlsVmFsdWUEDHRhcmdldEFtb3VudAQMdGFyZ2V0QW1vdW50BQ1zb3VyY2VBbW91bnRfBBF0ZW1wQXNzZXRCYWxhbmNlcwkBGF9kZWNyZW1lbnRCYWxhbmNlQnlJbmRleAMFDWFzc2V0QmFsYW5jZXMFEXRhcmdldEFzc2V0SW5kZXhfBQx0YXJnZXRBbW91bnQEFHRlbXBBc3NldFRvdGFsU3VwcGx5CQBlAgUQYXNzZXRUb3RhbFN1cHBseQUMdGFyZ2V0QW1vdW50BANmZWUJAQ1fY2FsY3VsYXRlRmVlBwURdGVtcEFzc2V0QmFsYW5jZXMFFHRlbXBBc3NldFRvdGFsU3VwcGx5BQxhc3NldFdlaWdodHMFC3NpZ21hV2VpZ2h0BQ93ZWlnaHRBbXBsaWZpZXIFDHNsaXBwYWdlUmF0ZQUKZmVlTWF4UmF0ZQQHZmVlRGlmZgkAZQIFA2ZlZQUHcHJldkZlZQMJAAACBQdmZWVEaWZmAAAFDHRhcmdldEFtb3VudAQNJHQwMzkwMjYzOTE1NwoAAiRsBQdMSVNUXzY0CgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlwoFBwAACQBkAgUNc291cmNlQW1vdW50XwUHcHJldkZlZQAAAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCGZvbGRGdW5jAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyA2NAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQAFQAWABcAGAAZABoAGwAcAB0AHgAfACAAIQAiACMAJAAlACYAJwAoACkAKgArACwALQAuAC8AMAAxADIAMwA0ADUANgA3ADgAOQA6ADsAPAA9AD4APwBABAdzdWNjZXNzCAUNJHQwMzkwMjYzOTE1NwJfMQQIc3RhcnRPdXQIBQ0kdDAzOTAyNjM5MTU3Al8yBAdzdG9wT3V0CAUNJHQwMzkwMjYzOTE1NwJfMwQPdGFyZ2V0QW1vdW50T3V0CAUNJHQwMzkwMjYzOTE1NwJfNAQHZGlmZk91dAgFDSR0MDM5MDI2MzkxNTcCXzUDCQEBIQEFB3N1Y2Nlc3MJAAIBCQCsAgIJAKwCAgkArAICAiRfc3dhcDogY2FuJ3QgY2FsY3VsYXRlIHRhcmdldEFtb3VudD0JAKQDAQUPdGFyZ2V0QW1vdW50T3V0AgYsZGlmZj0JAKQDAQUHZGlmZk91dAUPdGFyZ2V0QW1vdW50T3V0BBJmaW5hbEFzc2V0QmFsYW5jZXMJARhfZGVjcmVtZW50QmFsYW5jZUJ5SW5kZXgDBQ1hc3NldEJhbGFuY2VzBRF0YXJnZXRBc3NldEluZGV4XwUMdGFyZ2V0QW1vdW50BBVmaW5hbEFzc2V0VG90YWxTdXBwbHkJAGUCBRBhc3NldFRvdGFsU3VwcGx5BQx0YXJnZXRBbW91bnQEBGVycjEDCQETX3ZhbGlkYXRlQWxsb2NhdGlvbgcFEmZpbmFsQXNzZXRCYWxhbmNlcwUVZmluYWxBc3NldFRvdGFsU3VwcGx5BRFwcmV2QXNzZXRCYWxhbmNlcwUUcHJldkFzc2V0VG90YWxTdXBwbHkFDGFzc2V0V2VpZ2h0cwULc2lnbWFXZWlnaHQFEW1heEFsbG9jQW1wbGlmaWVyCQEWX3ZhbGlkYXRlU3dhcEludmFyaWFudAkFEXByZXZBc3NldEJhbGFuY2VzBRRwcmV2QXNzZXRUb3RhbFN1cHBseQUSZmluYWxBc3NldEJhbGFuY2VzBRVmaW5hbEFzc2V0VG90YWxTdXBwbHkFDGFzc2V0V2VpZ2h0cwULc2lnbWFXZWlnaHQFD3dlaWdodEFtcGxpZmllcgUMc2xpcHBhZ2VSYXRlBQpmZWVNYXhSYXRlBwMJAAACBQRlcnIxBQRlcnIxBA0kdDA0MDAwNDQwMTQ1CQEbX2NhbGN1bGF0ZUxwQW5kUHJvdG9jb2xGZWVzBAkAZAIFEXRhcmdldEFzc2V0SW5kZXhfAAEFDHRhcmdldEFtb3VudAUJbHBGZWVSYXRlBQ9wcm90b2NvbEZlZVJhdGUEBWxwRmVlCAUNJHQwNDAwMDQ0MDE0NQJfMQQLcHJvdG9jb2xGZWUIBQ0kdDA0MDAwNDQwMTQ1Al8yBBRzaWdtYUZlZVBlckxwVXBkYXRlZAgFDSR0MDQwMDA0NDAxNDUCXzMJAJcKBQUMdGFyZ2V0QW1vdW50BRJmaW5hbEFzc2V0QmFsYW5jZXMFBWxwRmVlBQtwcm90b2NvbEZlZQUUc2lnbWFGZWVQZXJMcFVwZGF0ZWQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4XAWkBBGluaXQOB2Fzc2V0c18NYXNzZXRXZWlnaHRzXwpscEZlZVJhdGVfEHByb3RvY29sRmVlUmF0ZV8MbHBUb2tlbk5hbWVfDWxwVG9rZW5EZXNjcl8QbHBUb2tlbkRlY2ltYWxzXxdtYXhBbGxvY2F0aW9uQW1wbGlmaWVyXxB3ZWlnaHRBbXBsaWZpZXJfDXNsaXBwYWdlUmF0ZV8LZmVlTWF4UmF0ZV8UcHJvdG9jb2xGZWVDb250cmFjdF8KcHJlY2lzaW9uXwdwYXVzZXJfBANlcnIDAwMDAwMDAwMDAwMDAwMDAwkBEV9vbmx5VGhpc0NvbnRyYWN0AQgFAWkGY2FsbGVyCQETX3doZW5Ob3RJbml0aWFsaXplZAAHCQEQX3doZW5NdWx0aXNpZ1NldAAHCQEPX3ZhbGlkYXRlQXNzZXRzAgUHYXNzZXRzXwIUaW5pdDogaW52YWxpZCBhc3NldHMHCQEQX3ZhbGlkYXRlSW50TGlzdAQFDWFzc2V0V2VpZ2h0c18AAQUKTUFYX1dFSUdIVAIaaW5pdDogaW52YWxpZCBhc3NldFdlaWdodHMHCQESX3ZhbGlkYXRlSW50RXF1YWxzAwkAkAMBBQdhc3NldHNfCQCQAwEFDWFzc2V0V2VpZ2h0c18CH2luaXQ6IGludmFsaWQgYXNzZXRXZWlnaHRzIHNpemUHCQEMX3ZhbGlkYXRlSW50BAUKbHBGZWVSYXRlXwAABQdNQVhfRkVFAhRpbml0OiBpbnZhbGlkIGxwIGZlZQcJAQxfdmFsaWRhdGVJbnQEBRBwcm90b2NvbEZlZVJhdGVfAAAFB01BWF9GRUUCGmluaXQ6IGludmFsaWQgcHJvdG9jb2wgZmVlBwkBEl92YWxpZGF0ZVRva2VuTmFtZQIFDGxwVG9rZW5OYW1lXwISaW5pdDogaW52YWxpZCBuYW1lBwkBE192YWxpZGF0ZVRva2VuRGVzY3ICBQ1scFRva2VuRGVzY3JfAhNpbml0OiBpbnZhbGlkIGRlc2NyBwkBEV92YWxpZGF0ZURlY2ltYWxzAgUQbHBUb2tlbkRlY2ltYWxzXwIWaW5pdDogaW52YWxpZCBkZWNpbWFscwcJAQxfdmFsaWRhdGVJbnQEBRdtYXhBbGxvY2F0aW9uQW1wbGlmaWVyXwAABQ1NQVhfQU1QTElGSUVSAiRpbml0OiBpbnZhbGlkIG1heEFsbG9jYXRpb25BbXBsaWZpZXIHCQEMX3ZhbGlkYXRlSW50BAUQd2VpZ2h0QW1wbGlmaWVyXwAABRdtYXhBbGxvY2F0aW9uQW1wbGlmaWVyXwIdaW5pdDogaW52YWxpZCB3ZWlnaHRBbXBsaWZpZXIHCQEMX3ZhbGlkYXRlSW50BAUNc2xpcHBhZ2VSYXRlXwAABQdNQVhfSU5UAhppbml0OiBpbnZhbGlkIHNsaXBwYWdlUmF0ZQcJAQxfdmFsaWRhdGVJbnQEBQtmZWVNYXhSYXRlXwAABQdNQVhfSU5UAhhpbml0OiBpbnZhbGlkIGZlZU1heFJhdGUHCQEQX3ZhbGlkYXRlQWRkcmVzcwIFFHByb3RvY29sRmVlQ29udHJhY3RfAiFpbml0OiBpbnZhbGlkIHByb3RvY29sRmVlQ29udHJhY3QHCQEMX3ZhbGlkYXRlSW50BAUKcHJlY2lzaW9uXwABBQdNQVhfSU5UAhdpbml0OiBpbnZhbGlkIHByZWNpc2lvbgcJARBfdmFsaWRhdGVBZGRyZXNzAgUHcGF1c2VyXwIUaW5pdDogaW52YWxpZCBwYXVzZXIHAwkAAAIFA2VycgUDZXJyBA0kdDA0MjAwODQyMDc3CQEUX3ByZXBhcmVBc3NldFdlaWdodHMBBQ1hc3NldFdlaWdodHNfBAxhc3NldFdlaWdodHMIBQ0kdDA0MjAwODQyMDc3Al8xBAtzaWdtYVdlaWdodAgFDSR0MDQyMDA4NDIwNzcCXzIEDWFzc2V0QmFsYW5jZXMJARVfcHJlcGFyZUFzc2V0QmFsYW5jZXMBBQdhc3NldHNfBAVpc3N1ZQkAwggFBQxscFRva2VuTmFtZV8FDWxwVG9rZW5EZXNjcl8AAAUQbHBUb2tlbkRlY2ltYWxzXwYECWxwQXNzZXRJZAkAuAgBBQVpc3N1ZQQOc3RvcmFnZVVwZGF0ZWQJAJwKCgUJbHBBc3NldElkBgAABQpscEZlZVJhdGVfBRBwcm90b2NvbEZlZVJhdGVfBRdtYXhBbGxvY2F0aW9uQW1wbGlmaWVyXwUQd2VpZ2h0QW1wbGlmaWVyXwUNc2xpcHBhZ2VSYXRlXwULZmVlTWF4UmF0ZV8JARFAZXh0ck5hdGl2ZSgxMDYyKQEFFHByb3RvY29sRmVlQ29udHJhY3RfCQCUCgIJAM4IAgkAzggCCQDOCAIJAM4IAgkAzggCCQDOCAIJAM4IAgkAzAgCBQVpc3N1ZQUDbmlsCQEMX3NhdmVTdG9yYWdlAQUOc3RvcmFnZVVwZGF0ZWQJAQtfc2F2ZUFzc2V0cwEFB2Fzc2V0c18JARJfc2F2ZUFzc2V0QmFsYW5jZXMBBQ1hc3NldEJhbGFuY2VzCQERX3NhdmVBc3NldFdlaWdodHMBBQxhc3NldFdlaWdodHMJAQ5fc2F2ZVByZWNpc2lvbgEFCnByZWNpc2lvbl8JARJfc2F2ZVNpZ21hRmVlUGVyTHABCQESX2xvYWRTaWdtYUZlZVBlckxwAAkBC19zYXZlUGF1c2VyAQkBEUBleHRyTmF0aXZlKDEwNjIpAQUHcGF1c2VyXwUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQpkZXBvc2l0QWxsAQdhbW91bnRfBANlcnIDAwkBEF93aGVuSW5pdGlhbGl6ZWQACQEOX3doZW5Ob3RQYXVzZWQABwkBDF92YWxpZGF0ZUludAQFB2Ftb3VudF8AAAUHTUFYX0lOVAIaZGVwb3NpdEFsbDogaW52YWxpZCBhbW91bnQHAwkAAAIFA2VycgUDZXJyBAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAQJbHBBc3NldElkCAUHc3RvcmFnZQJfMQQKbHBEZWNpbWFscwkBDF9nZXREZWNpbWFscwEJANgEAQUJbHBBc3NldElkBAZhc3NldHMJAQtfbG9hZEFzc2V0cwAEDSR0MDQzODI3NDM5MTIJAQtfZGVwb3NpdEFsbAEFB2Ftb3VudF8EDmxwVG9rZW5zVG9NaW50CAUNJHQwNDM4Mjc0MzkxMgJfMQQZcmVxdWlyZWRBbW91bnRzTm9ybWFsaXplZAgFDSR0MDQzODI3NDM5MTICXzIEDWFzc2V0QmFsYW5jZXMIBQ0kdDA0MzgyNzQzOTEyAl8zCgEIZm9sZEZ1bmMCA2FjYwRlbGVtBAVpbmRleAgFA2FjYwJfMQQPcGF5bWVudEFzc2V0U3RyCQELX2Fzc2V0VG9TdHIBCAkAkQMCCAUBaQhwYXltZW50cwUFaW5kZXgHYXNzZXRJZAQUcGF5bWVudEFzc2V0RGVjaW1hbHMJAQxfZ2V0RGVjaW1hbHMBBQ9wYXltZW50QXNzZXRTdHIEGHJlcXVpcmVkQW1vdW50Tm9ybWFsaXplZAkAkQMCBRlyZXF1aXJlZEFtb3VudHNOb3JtYWxpemVkBQVpbmRleAQOcmVxdWlyZWRBbW91bnQJARJfbm9ybWFsaXplRGVjaW1hbHMEBRhyZXF1aXJlZEFtb3VudE5vcm1hbGl6ZWQFCmxwRGVjaW1hbHMFFHBheW1lbnRBc3NldERlY2ltYWxzBQdDRUlMSU5HBARlcnIxAwkBAiE9AgUPcGF5bWVudEFzc2V0U3RyBQRlbGVtCQACAQkArAICAiNkZXBvc2l0QWxsOiBpbnZhbGlkIHBheW1lbnQ6IGluZGV4PQkApAMBBQVpbmRleAMJAGcCAAAFDnJlcXVpcmVkQW1vdW50CQACAQImZGVwb3NpdEFsbDogdG9vIGxpdHRsZSBhbW91bnQgcmVxdWlyZWQFBHVuaXQDCQAAAgUEZXJyMQUEZXJyMQQGY2hhbmdlAwkAZgIICQCRAwIIBQFpCHBheW1lbnRzBQVpbmRleAZhbW91bnQFDnJlcXVpcmVkQW1vdW50CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgkAZQIICQCRAwIIBQFpCHBheW1lbnRzBQVpbmRleAZhbW91bnQFDnJlcXVpcmVkQW1vdW50CAkAkQMCCAUBaQhwYXltZW50cwUFaW5kZXgHYXNzZXRJZAUDbmlsAwkAZgIFDnJlcXVpcmVkQW1vdW50CAkAkQMCCAUBaQhwYXltZW50cwUFaW5kZXgGYW1vdW50CQACAQkArAICCQCsAgIJAKwCAgIoZGVwb3NpdEFsbDogaW5zdWZmaWNpZW50IHBheW1lbnQsIGluZGV4PQkApAMBBQVpbmRleAILLCByZXF1aXJlZD0JAKQDAQUOcmVxdWlyZWRBbW91bnQFA25pbAkAlAoCCQBkAgUFaW5kZXgAAQkAzggCCAUDYWNjAl8yBQZjaGFuZ2UJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4EDSR0MDQ1MDU1NDUxMTcKAAIkbAUGYXNzZXRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCAAAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEIZm9sZEZ1bmMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoEA2lkeAgFDSR0MDQ1MDU1NDUxMTcCXzEEDWNoYW5nZUFjdGlvbnMIBQ0kdDA0NTA1NTQ1MTE3Al8yBA5zdG9yYWdlVXBkYXRlZAkAnAoKCAUHc3RvcmFnZQJfMQgFB3N0b3JhZ2UCXzIJAGQCCAUHc3RvcmFnZQJfMwUObHBUb2tlbnNUb01pbnQIBQdzdG9yYWdlAl80CAUHc3RvcmFnZQJfNQgFB3N0b3JhZ2UCXzYIBQdzdG9yYWdlAl83CAUHc3RvcmFnZQJfOAgFB3N0b3JhZ2UCXzkIBQdzdG9yYWdlA18xMAkAlAoCCQDOCAIJAM4IAgkAzggCCQDMCAIJAQdSZWlzc3VlAwUJbHBBc3NldElkBQ5scFRva2Vuc1RvTWludAYJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQ5scFRva2Vuc1RvTWludAUJbHBBc3NldElkBQNuaWwJAQxfc2F2ZVN0b3JhZ2UBBQ5zdG9yYWdlVXBkYXRlZAkBEl9zYXZlQXNzZXRCYWxhbmNlcwEFDWFzc2V0QmFsYW5jZXMFDWNoYW5nZUFjdGlvbnMFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEHZGVwb3NpdAEMbWluTHBBbW91bnRfBANlcnIJAQxfdmFsaWRhdGVJbnQEBQxtaW5McEFtb3VudF8AAAUHTUFYX0lOVAIeZGVwb3NpdDogaW52YWxpZCBtaW4gbHAgYW1vdW50AwkAAAIFA2VycgUDZXJyBAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAQJbHBBc3NldElkCAUHc3RvcmFnZQJfMQQMbHBBc3NldElkU3RyCQELX2Fzc2V0VG9TdHIBBQlscEFzc2V0SWQECmxwRGVjaW1hbHMJAQxfZ2V0RGVjaW1hbHMBBQxscEFzc2V0SWRTdHIEBGVycjEDAwMDAwkBEF93aGVuSW5pdGlhbGl6ZWQACQEOX3doZW5Ob3RQYXVzZWQABwkBDl9jaGVja1dhdGNoZG9nAAcJARJfdmFsaWRhdGVJbnRFcXVhbHMDCQCQAwEIBQFpCHBheW1lbnRzAAECHmRlcG9zaXQ6IGludmFsaWQgcGF5bWVudHMgc2l6ZQcJARVfdmFsaWRhdGVMaXN0Q29udGFpbnMDCQELX2xvYWRBc3NldHMACQELX2Fzc2V0VG9TdHIBCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQCHmRlcG9zaXQ6IGludmFsaWQgcGF5bWVudCBhc3NldAcJAQxfdmFsaWRhdGVJbnQECAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAABBQdNQVhfSU5UAh9kZXBvc2l0OiBpbnZhbGlkIHBheW1lbnQgYW1vdW50BwMJAAACBQRlcnIxBQRlcnIxBAhhc3NldFN0cgkBC19hc3NldFRvU3RyAQgJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBA1hc3NldERlY2ltYWxzCQEMX2dldERlY2ltYWxzAQUIYXNzZXRTdHIEEGFtb3VudE5vcm1hbGl6ZWQJARJfbm9ybWFsaXplRGVjaW1hbHMECAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAUNYXNzZXREZWNpbWFscwUKbHBEZWNpbWFscwUERE9XTgQNJHQwNDY1NTc0NjY3MwkBCF9kZXBvc2l0AgUIYXNzZXRTdHIFEGFtb3VudE5vcm1hbGl6ZWQEDmxwVG9rZW5zVG9NaW50CAUNJHQwNDY1NTc0NjY3MwJfMQQNYXNzZXRCYWxhbmNlcwgFDSR0MDQ2NTU3NDY2NzMCXzIEBWxwRmVlCAUNJHQwNDY1NTc0NjY3MwJfMwQLcHJvdG9jb2xGZWUIBQ0kdDA0NjU1NzQ2NjczAl80BBRzaWdtYUZlZVBlckxwVXBkYXRlZAgFDSR0MDQ2NTU3NDY2NzMCXzUEDmxwVG9rZW5zVG9TZW5kCQBlAgkAZQIFDmxwVG9rZW5zVG9NaW50BQVscEZlZQULcHJvdG9jb2xGZWUEBGVycjIJAQxfdmFsaWRhdGVJbnQEBQ5scFRva2Vuc1RvU2VuZAUMbWluTHBBbW91bnRfBQdNQVhfSU5UAhZkZXBvc2l0OiBsZXNzIHRoYW4gbWluAwkAAAIFBGVycjIFBGVycjIEDnN0b3JhZ2VVcGRhdGVkCQCcCgoIBQdzdG9yYWdlAl8xCAUHc3RvcmFnZQJfMgkAZAIIBQdzdG9yYWdlAl8zBQ5scFRva2Vuc1RvTWludAgFB3N0b3JhZ2UCXzQIBQdzdG9yYWdlAl81CAUHc3RvcmFnZQJfNggFB3N0b3JhZ2UCXzcIBQdzdG9yYWdlAl84CAUHc3RvcmFnZQJfOQgFB3N0b3JhZ2UDXzEwCQCUCgIJAM4IAgkAzggCCQDOCAIJAM4IAgkAzggCCQDMCAIJAQdSZWlzc3VlAwUJbHBBc3NldElkBQ5scFRva2Vuc1RvTWludAYJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQ5scFRva2Vuc1RvU2VuZAUJbHBBc3NldElkBQNuaWwJAQxfc2F2ZVN0b3JhZ2UBBQ5zdG9yYWdlVXBkYXRlZAkBEl9zYXZlQXNzZXRCYWxhbmNlcwEFDWFzc2V0QmFsYW5jZXMJAQpfc2F2ZUxwRmVlAgUMbHBBc3NldElkU3RyCQBkAgUFbHBGZWUJAQpfbG9hZExwRmVlAQUMbHBBc3NldElkU3RyCQEQX3NhdmVQcm90b2NvbEZlZQIFDGxwQXNzZXRJZFN0cgkAZAIFC3Byb3RvY29sRmVlCQEQX2xvYWRQcm90b2NvbEZlZQEFDGxwQXNzZXRJZFN0cgkBEl9zYXZlU2lnbWFGZWVQZXJMcAEFFHNpZ21hRmVlUGVyTHBVcGRhdGVkBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBC3dpdGhkcmF3QWxsAAQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQAECWxwQXNzZXRJZAgFB3N0b3JhZ2UCXzEEDGxwQXNzZXRJZFN0cgkA2AQBBQlscEFzc2V0SWQECmxwRGVjaW1hbHMJAQxfZ2V0RGVjaW1hbHMBBQxscEFzc2V0SWRTdHIEBmFzc2V0cwkBC19sb2FkQXNzZXRzAAQDZXJyAwMDCQEQX3doZW5Jbml0aWFsaXplZAAJARJfdmFsaWRhdGVJbnRFcXVhbHMDCQCQAwEIBQFpCHBheW1lbnRzAAECIndpdGhkcmF3QWxsOiBpbnZhbGlkIHBheW1lbnRzIHNpemUHCQEUX3ZhbGlkYXRlU3RyaW5nRXF1YWwDBQxscEFzc2V0SWRTdHIJAQtfYXNzZXRUb1N0cgEICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAIid2l0aGRyYXdBbGw6IGludmFsaWQgcGF5bWVudCBhc3NldAcJAQxfdmFsaWRhdGVJbnQECAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAABBQdNQVhfSU5UAiN3aXRoZHJhd0FsbDogaW52YWxpZCBwYXltZW50IGFtb3VudAcDCQAAAgUDZXJyBQNlcnIEDSR0MDQ4MTM0NDgyMjEJAQxfd2l0aGRyYXdBbGwBCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAQObHBUb2tlbnNUb0J1cm4IBQ0kdDA0ODEzNDQ4MjIxAl8xBA1iYWxhbmNlc1RvUGF5CAUNJHQwNDgxMzQ0ODIyMQJfMgQNYXNzZXRCYWxhbmNlcwgFDSR0MDQ4MTM0NDgyMjECXzMEDnBheW1lbnRBY3Rpb25zCQEYX2dldFBheW1lbnRzRnJvbUJhbGFuY2VzBAUGYXNzZXRzBQ1iYWxhbmNlc1RvUGF5CAUBaQZjYWxsZXIFCmxwRGVjaW1hbHMEDnN0b3JhZ2VVcGRhdGVkCQCcCgoIBQdzdG9yYWdlAl8xCAUHc3RvcmFnZQJfMgkAZQIIBQdzdG9yYWdlAl8zBQ5scFRva2Vuc1RvQnVybggFB3N0b3JhZ2UCXzQIBQdzdG9yYWdlAl81CAUHc3RvcmFnZQJfNggFB3N0b3JhZ2UCXzcIBQdzdG9yYWdlAl84CAUHc3RvcmFnZQJfOQgFB3N0b3JhZ2UDXzEwCQCUCgIJAM4IAgkAzggCCQDOCAIJAMwIAgkBBEJ1cm4CBQlscEFzc2V0SWQFDmxwVG9rZW5zVG9CdXJuBQNuaWwFDnBheW1lbnRBY3Rpb25zCQEMX3NhdmVTdG9yYWdlAQUOc3RvcmFnZVVwZGF0ZWQJARJfc2F2ZUFzc2V0QmFsYW5jZXMBBQ1hc3NldEJhbGFuY2VzBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCHdpdGhkcmF3Aghhc3NldElkXwptaW5BbW91bnRfBAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAQJbHBBc3NldElkCAUHc3RvcmFnZQJfMQQMbHBBc3NldElkU3RyCQDYBAEFCWxwQXNzZXRJZAQKbHBEZWNpbWFscwkBDF9nZXREZWNpbWFscwEFDGxwQXNzZXRJZFN0cgQGYXNzZXRzCQELX2xvYWRBc3NldHMABANlcnIDAwMDAwMDCQEQX3doZW5Jbml0aWFsaXplZAAJAQ5fd2hlbk5vdFBhdXNlZAAHCQEOX2NoZWNrV2F0Y2hkb2cABwkBEl92YWxpZGF0ZUludEVxdWFscwMJAJADAQgFAWkIcGF5bWVudHMAAQIfd2l0aGRyYXc6IGludmFsaWQgcGF5bWVudHMgc2l6ZQcJARRfdmFsaWRhdGVTdHJpbmdFcXVhbAMFDGxwQXNzZXRJZFN0cgkBC19hc3NldFRvU3RyAQgJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkAh93aXRoZHJhdzogaW52YWxpZCBwYXltZW50IGFzc2V0BwkBDF92YWxpZGF0ZUludAQICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50AAEFB01BWF9JTlQCIHdpdGhkcmF3OiBpbnZhbGlkIHBheW1lbnQgYW1vdW50BwkBFV92YWxpZGF0ZUxpc3RDb250YWlucwMFBmFzc2V0cwUIYXNzZXRJZF8CGXdpdGhkcmF3OiBpbnZhbGlkIGFzc2V0SWQHCQEMX3ZhbGlkYXRlSW50BAUKbWluQW1vdW50XwAABQdNQVhfSU5UAht3aXRoZHJhdzogaW52YWxpZCBtaW5BbW91bnQHAwkAAAIFA2VycgUDZXJyBA0kdDA0OTU3NTQ5NzA5CQEJX3dpdGhkcmF3AgUIYXNzZXRJZF8ICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BBZ0YXJnZXRBbW91bnROb3JtYWxpemVkCAUNJHQwNDk1NzU0OTcwOQJfMQQSZmluYWxBc3NldEJhbGFuY2VzCAUNJHQwNDk1NzU0OTcwOQJfMgQFbHBGZWUIBQ0kdDA0OTU3NTQ5NzA5Al8zBAtwcm90b2NvbEZlZQgFDSR0MDQ5NTc1NDk3MDkCXzQEFHNpZ21hRmVlUGVyTHBVcGRhdGVkCAUNJHQwNDk1NzU0OTcwOQJfNQQVZmluYWxBbW91bnROb3JtYWxpemVkCQBlAgkAZQIFFnRhcmdldEFtb3VudE5vcm1hbGl6ZWQFBWxwRmVlBQtwcm90b2NvbEZlZQQOdGFyZ2V0RGVjaW1hbHMJAQxfZ2V0RGVjaW1hbHMBBQhhc3NldElkXwQLZmluYWxBbW91bnQJARJfbm9ybWFsaXplRGVjaW1hbHMEBRVmaW5hbEFtb3VudE5vcm1hbGl6ZWQFCmxwRGVjaW1hbHMFDnRhcmdldERlY2ltYWxzBQRET1dOBARlcnIxCQEMX3ZhbGlkYXRlSW50BAULZmluYWxBbW91bnQFCm1pbkFtb3VudF8FB01BWF9JTlQCF3dpdGhkcmF3OiBsZXNzIHRoYW4gbWluAwkAAAIFBGVycjEFBGVycjEEDnN0b3JhZ2VVcGRhdGVkCQCcCgoIBQdzdG9yYWdlAl8xCAUHc3RvcmFnZQJfMgkAZQIIBQdzdG9yYWdlAl8zCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAgFB3N0b3JhZ2UCXzQIBQdzdG9yYWdlAl81CAUHc3RvcmFnZQJfNggFB3N0b3JhZ2UCXzcIBQdzdG9yYWdlAl84CAUHc3RvcmFnZQJfOQgFB3N0b3JhZ2UDXzEwCQCUCgIJAM4IAgkAzggCCQDOCAIJAM4IAgkAzggCCQDMCAIJAQRCdXJuAgUJbHBBc3NldElkCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFC2ZpbmFsQW1vdW50CQELX3N0clRvQXNzZXQBBQhhc3NldElkXwUDbmlsCQEMX3NhdmVTdG9yYWdlAQUOc3RvcmFnZVVwZGF0ZWQJARJfc2F2ZUFzc2V0QmFsYW5jZXMBBRJmaW5hbEFzc2V0QmFsYW5jZXMJAQpfc2F2ZUxwRmVlAgUIYXNzZXRJZF8JAGQCBQVscEZlZQkBCl9sb2FkTHBGZWUBBQhhc3NldElkXwkBEF9zYXZlUHJvdG9jb2xGZWUCBQhhc3NldElkXwkAZAIFC3Byb3RvY29sRmVlCQEQX2xvYWRQcm90b2NvbEZlZQEFCGFzc2V0SWRfCQESX3NhdmVTaWdtYUZlZVBlckxwAQUUc2lnbWFGZWVQZXJMcFVwZGF0ZWQFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEEc3dhcAIOdGFyZ2V0QXNzZXRJZF8KbWluQW1vdW50XwQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQAECWxwQXNzZXRJZAgFB3N0b3JhZ2UCXzEECmxwRGVjaW1hbHMJAQxfZ2V0RGVjaW1hbHMBCQDYBAEFCWxwQXNzZXRJZAQGYXNzZXRzCQELX2xvYWRBc3NldHMABA5zb3VyY2VBc3NldFN0cgkBC19hc3NldFRvU3RyAQgJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBBZzb3VyY2VBbW91bnROb3JtYWxpemVkCQESX25vcm1hbGl6ZURlY2ltYWxzBAgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQJAQxfZ2V0RGVjaW1hbHMBBQ5zb3VyY2VBc3NldFN0cgUKbHBEZWNpbWFscwUERE9XTgQQc291cmNlQXNzZXRJbmRleAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDPCAIFBmFzc2V0cwUOc291cmNlQXNzZXRTdHICGnN3YXA6IGludmFsaWQgc291cmNlIGFzc2V0AwkAAAIFEHNvdXJjZUFzc2V0SW5kZXgFEHNvdXJjZUFzc2V0SW5kZXgEEHRhcmdldEFzc2V0SW5kZXgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAzwgCBQZhc3NldHMFDnRhcmdldEFzc2V0SWRfAhpzd2FwOiBpbnZhbGlkIHRhcmdldCBhc3NldAMJAAACBRB0YXJnZXRBc3NldEluZGV4BRB0YXJnZXRBc3NldEluZGV4BANlcnIDAwMDAwMJARBfd2hlbkluaXRpYWxpemVkAAkBDl93aGVuTm90UGF1c2VkAAcJAQ5fY2hlY2tXYXRjaGRvZwAHCQEMX3ZhbGlkYXRlSW50BAUKbWluQW1vdW50XwAABQdNQVhfSU5UAh9zd2FwOiBpbnZhbGlkIG1pbiB0YXJnZXQgYW1vdW50BwkBDF92YWxpZGF0ZUludAQFFnNvdXJjZUFtb3VudE5vcm1hbGl6ZWQAAQUHTUFYX0lOVAIbc3dhcDogaW52YWxpZCBzb3VyY2UgYW1vdW50BwkBFF92YWxpZGF0ZVN0cmluZ05vdEVxAwUOc291cmNlQXNzZXRTdHIFDnRhcmdldEFzc2V0SWRfAhFzd2FwOiBzYW1lIGFzc2V0cwcJARJfdmFsaWRhdGVJbnRFcXVhbHMDCQCQAwEIBQFpCHBheW1lbnRzAAECG3N3YXA6IGludmFsaWQgcGF5bWVudHMgc2l6ZQcDCQAAAgUDZXJyBQNlcnIEDSR0MDUxODIyNTE5ODAJAQVfc3dhcAMFEHNvdXJjZUFzc2V0SW5kZXgFEHRhcmdldEFzc2V0SW5kZXgFFnNvdXJjZUFtb3VudE5vcm1hbGl6ZWQEFnRhcmdldEFtb3VudE5vcm1hbGl6ZWQIBQ0kdDA1MTgyMjUxOTgwAl8xBBJmaW5hbEFzc2V0QmFsYW5jZXMIBQ0kdDA1MTgyMjUxOTgwAl8yBAVscEZlZQgFDSR0MDUxODIyNTE5ODACXzMEC3Byb3RvY29sRmVlCAUNJHQwNTE4MjI1MTk4MAJfNAQUc2lnbWFGZWVQZXJMcFVwZGF0ZWQIBQ0kdDA1MTgyMjUxOTgwAl81BBVmaW5hbEFtb3VudE5vcm1hbGl6ZWQJAGUCCQBlAgUWdGFyZ2V0QW1vdW50Tm9ybWFsaXplZAUFbHBGZWUFC3Byb3RvY29sRmVlBA50YXJnZXREZWNpbWFscwkBDF9nZXREZWNpbWFscwEFDnRhcmdldEFzc2V0SWRfBAtmaW5hbEFtb3VudAkBEl9ub3JtYWxpemVEZWNpbWFscwQFFWZpbmFsQW1vdW50Tm9ybWFsaXplZAUKbHBEZWNpbWFscwUOdGFyZ2V0RGVjaW1hbHMFBERPV04EBGVycjEJAQxfdmFsaWRhdGVJbnQEBQtmaW5hbEFtb3VudAUKbWluQW1vdW50XwUHTUFYX0lOVAITc3dhcDogbGVzcyB0aGFuIG1pbgMJAAACBQRlcnIxBQRlcnIxCQCUCgIJAM4IAgkAzggCCQDOCAIJAM4IAgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFC2ZpbmFsQW1vdW50CQELX3N0clRvQXNzZXQBBQ50YXJnZXRBc3NldElkXwUDbmlsCQESX3NhdmVBc3NldEJhbGFuY2VzAQUSZmluYWxBc3NldEJhbGFuY2VzCQEKX3NhdmVMcEZlZQIFDnRhcmdldEFzc2V0SWRfCQBkAgUFbHBGZWUJAQpfbG9hZExwRmVlAQUOdGFyZ2V0QXNzZXRJZF8JARBfc2F2ZVByb3RvY29sRmVlAgUOdGFyZ2V0QXNzZXRJZF8JAGQCBQtwcm90b2NvbEZlZQkBEF9sb2FkUHJvdG9jb2xGZWUBBQ50YXJnZXRBc3NldElkXwkBEl9zYXZlU2lnbWFGZWVQZXJMcAEFFHNpZ21hRmVlUGVyTHBVcGRhdGVkBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDWdldERlcG9zaXRBbGwBCWxwQW1vdW50XwQDZXJyCQEMX3ZhbGlkYXRlSW50BAUJbHBBbW91bnRfAAEFB01BWF9JTlQCHWdldERlcG9zaXRBbGw6IGludmFsaWQgYW1vdW50AwkAAAIFA2VycgUDZXJyBA0kdDA1MzEwMDUzMTg3CQELX2RlcG9zaXRBbGwBBQlscEFtb3VudF8EDmxwVG9rZW5zVG9NaW50CAUNJHQwNTMxMDA1MzE4NwJfMQQZcmVxdWlyZWRBbW91bnRzTm9ybWFsaXplZAgFDSR0MDUzMTAwNTMxODcCXzIEDWFzc2V0QmFsYW5jZXMIBQ0kdDA1MzEwMDUzMTg3Al8zCQCUCgIFA25pbAkAlAoCBQ5scFRva2Vuc1RvTWludAUZcmVxdWlyZWRBbW91bnRzTm9ybWFsaXplZAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQpnZXREZXBvc2l0Aghhc3NldElkXwdhbW91bnRfBANlcnIDCQEVX3ZhbGlkYXRlTGlzdENvbnRhaW5zAwkBC19sb2FkQXNzZXRzAAUIYXNzZXRJZF8CGWdldERlcG9zaXQ6IGludmFsaWQgYXNzZXQJAQxfdmFsaWRhdGVJbnQEBQdhbW91bnRfAAEFB01BWF9JTlQCGmdldERlcG9zaXQ6IGludmFsaWQgYW1vdW50BwMJAAACBQNlcnIFA2VycgQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQAECWxwQXNzZXRJZAgFB3N0b3JhZ2UCXzEECmxwRGVjaW1hbHMJAQxfZ2V0RGVjaW1hbHMBCQDYBAEFCWxwQXNzZXRJZAQNYXNzZXREZWNpbWFscwkBDF9nZXREZWNpbWFscwEFCGFzc2V0SWRfBBBhbW91bnROb3JtYWxpemVkCQESX25vcm1hbGl6ZURlY2ltYWxzBAUHYW1vdW50XwUNYXNzZXREZWNpbWFscwUKbHBEZWNpbWFscwUERE9XTgQNJHQwNTM5NDY1NDA2MgkBCF9kZXBvc2l0AgUIYXNzZXRJZF8FEGFtb3VudE5vcm1hbGl6ZWQEDmxwVG9rZW5zVG9NaW50CAUNJHQwNTM5NDY1NDA2MgJfMQQNYXNzZXRCYWxhbmNlcwgFDSR0MDUzOTQ2NTQwNjICXzIEBWxwRmVlCAUNJHQwNTM5NDY1NDA2MgJfMwQLcHJvdG9jb2xGZWUIBQ0kdDA1Mzk0NjU0MDYyAl80BBRzaWdtYUZlZVBlckxwVXBkYXRlZAgFDSR0MDUzOTQ2NTQwNjICXzUEDmxwVG9rZW5zVG9TZW5kCQBlAgkAZQIFDmxwVG9rZW5zVG9NaW50BQVscEZlZQULcHJvdG9jb2xGZWUJAJQKAgUDbmlsBQ5scFRva2Vuc1RvU2VuZAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQ5nZXRXaXRoZHJhd0FsbAEJbHBBbW91bnRfBANlcnIJAQxfdmFsaWRhdGVJbnQEBQlscEFtb3VudF8AAAUHTUFYX0lOVAIeZ2V0V2l0aGRyYXdBbGw6IGludmFsaWQgYW1vdW50AwkAAAIFA2VycgUDZXJyBA0kdDA1NDUwMTU0NTc3CQEMX3dpdGhkcmF3QWxsAQUJbHBBbW91bnRfBA5scFRva2Vuc1RvQnVybggFDSR0MDU0NTAxNTQ1NzcCXzEEDWJhbGFuY2VzVG9HZXQIBQ0kdDA1NDUwMTU0NTc3Al8yBA1hc3NldEJhbGFuY2VzCAUNJHQwNTQ1MDE1NDU3NwJfMwkAlAoCBQNuaWwFDWJhbGFuY2VzVG9HZXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQELZ2V0V2l0aGRyYXcCCGFzc2V0SWRfB2Ftb3VudF8EA2VycgMJARVfdmFsaWRhdGVMaXN0Q29udGFpbnMDCQELX2xvYWRBc3NldHMABQhhc3NldElkXwIaZ2V0V2l0aGRyYXc6IGludmFsaWQgYXNzZXQJAQxfdmFsaWRhdGVJbnQEBQdhbW91bnRfAAEFB01BWF9JTlQCG2dldFdpdGhkcmF3OiBpbnZhbGlkIGFtb3VudAcDCQAAAgUDZXJyBQNlcnIEB3N0b3JhZ2UJAQxfbG9hZFN0b3JhZ2UABAlscEFzc2V0SWQIBQdzdG9yYWdlAl8xBApscERlY2ltYWxzCQEMX2dldERlY2ltYWxzAQkA2AQBBQlscEFzc2V0SWQEDSR0MDU1MjI4NTUzNDQJAQlfd2l0aGRyYXcCBQhhc3NldElkXwUHYW1vdW50XwQWdGFyZ2V0QW1vdW50Tm9ybWFsaXplZAgFDSR0MDU1MjI4NTUzNDQCXzEEDWFzc2V0QmFsYW5jZXMIBQ0kdDA1NTIyODU1MzQ0Al8yBAVscEZlZQgFDSR0MDU1MjI4NTUzNDQCXzMEC3Byb3RvY29sRmVlCAUNJHQwNTUyMjg1NTM0NAJfNAQUc2lnbWFGZWVQZXJMcFVwZGF0ZWQIBQ0kdDA1NTIyODU1MzQ0Al81BBVmaW5hbEFtb3VudE5vcm1hbGl6ZWQJAGUCCQBlAgUWdGFyZ2V0QW1vdW50Tm9ybWFsaXplZAUFbHBGZWUFC3Byb3RvY29sRmVlBA50YXJnZXREZWNpbWFscwkBDF9nZXREZWNpbWFscwEFCGFzc2V0SWRfBAtmaW5hbEFtb3VudAkBEl9ub3JtYWxpemVEZWNpbWFscwQFFWZpbmFsQW1vdW50Tm9ybWFsaXplZAUKbHBEZWNpbWFscwUOdGFyZ2V0RGVjaW1hbHMFBERPV04JAJQKAgUDbmlsBQtmaW5hbEFtb3VudAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQdnZXRTd2FwAw5zb3VyY2VBc3NldElkXw50YXJnZXRBc3NldElkXw1zb3VyY2VBbW91bnRfBAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAQJbHBBc3NldElkCAUHc3RvcmFnZQJfMQQKbHBEZWNpbWFscwkBDF9nZXREZWNpbWFscwEJANgEAQUJbHBBc3NldElkBAZhc3NldHMJAQtfbG9hZEFzc2V0cwAEEHNvdXJjZUFzc2V0SW5kZXgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAzwgCBQZhc3NldHMFDnNvdXJjZUFzc2V0SWRfAhpzd2FwOiBpbnZhbGlkIHNvdXJjZSBhc3NldAMJAAACBRBzb3VyY2VBc3NldEluZGV4BRBzb3VyY2VBc3NldEluZGV4BBB0YXJnZXRBc3NldEluZGV4CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAM8IAgUGYXNzZXRzBQ50YXJnZXRBc3NldElkXwIac3dhcDogaW52YWxpZCB0YXJnZXQgYXNzZXQDCQAAAgUQdGFyZ2V0QXNzZXRJbmRleAUQdGFyZ2V0QXNzZXRJbmRleAQWc291cmNlQW1vdW50Tm9ybWFsaXplZAkBEl9ub3JtYWxpemVEZWNpbWFscwQFDXNvdXJjZUFtb3VudF8JAQxfZ2V0RGVjaW1hbHMBBQ5zb3VyY2VBc3NldElkXwUKbHBEZWNpbWFscwUERE9XTgQDZXJyAwkBDF92YWxpZGF0ZUludAQFFnNvdXJjZUFtb3VudE5vcm1hbGl6ZWQAAQUHTUFYX0lOVAIbc3dhcDogaW52YWxpZCBzb3VyY2UgYW1vdW50CQEUX3ZhbGlkYXRlU3RyaW5nTm90RXEDBQ5zb3VyY2VBc3NldElkXwUOdGFyZ2V0QXNzZXRJZF8CEXN3YXA6IHNhbWUgYXNzZXRzBwMJAAACBQNlcnIFA2VycgQNJHQwNTY3NTQ1NjkxMgkBBV9zd2FwAwUQc291cmNlQXNzZXRJbmRleAUQdGFyZ2V0QXNzZXRJbmRleAUWc291cmNlQW1vdW50Tm9ybWFsaXplZAQWdGFyZ2V0QW1vdW50Tm9ybWFsaXplZAgFDSR0MDU2NzU0NTY5MTICXzEEEmZpbmFsQXNzZXRCYWxhbmNlcwgFDSR0MDU2NzU0NTY5MTICXzIEBWxwRmVlCAUNJHQwNTY3NTQ1NjkxMgJfMwQLcHJvdG9jb2xGZWUIBQ0kdDA1Njc1NDU2OTEyAl80BBRzaWdtYUZlZVBlckxwVXBkYXRlZAgFDSR0MDU2NzU0NTY5MTICXzUEFWZpbmFsQW1vdW50Tm9ybWFsaXplZAkAZQIJAGUCBRZ0YXJnZXRBbW91bnROb3JtYWxpemVkBQVscEZlZQULcHJvdG9jb2xGZWUEDnRhcmdldERlY2ltYWxzCQEMX2dldERlY2ltYWxzAQUOdGFyZ2V0QXNzZXRJZF8EC2ZpbmFsQW1vdW50CQESX25vcm1hbGl6ZURlY2ltYWxzBAUVZmluYWxBbW91bnROb3JtYWxpemVkBQpscERlY2ltYWxzBQ50YXJnZXREZWNpbWFscwUERE9XTgkAlAoCBQNuaWwFC2ZpbmFsQW1vdW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCGdldENsYWltAQV1c2VyXwQEdXNlcgMJAGYCCQCxAgEFBXVzZXJfAAAJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBBQV1c2VyXwIWZ2V0Q2xhaW06IGludmFsaWQgdXNlcggFAWkGY2FsbGVyBA0kdDA1NzU1NDU3NjEwCQELX2NoZWNrcG9pbnQBBQR1c2VyBBFjaGVja3BvaW50QWN0aW9ucwgFDSR0MDU3NTU0NTc2MTACXzEEC3VzZXJQcm9maXRzCAUNJHQwNTc1NTQ1NzYxMAJfMgkAlAoCBQNuaWwFC3VzZXJQcm9maXRzAWkBC2dldFV0aWxGdW5jAAQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQAEDWxwVG90YWxTdXBwbHkIBQdzdG9yYWdlAl8zBA93ZWlnaHRBbXBsaWZpZXIIBQdzdG9yYWdlAl83BAxzbGlwcGFnZVJhdGUIBQdzdG9yYWdlAl84BApmZWVNYXhSYXRlCAUHc3RvcmFnZQJfOQQNJHQwNTc5NDM1ODAwMwkBEl9sb2FkQXNzZXRCYWxhbmNlcwAEDWFzc2V0QmFsYW5jZXMIBQ0kdDA1Nzk0MzU4MDAzAl8xBBBhc3NldFRvdGFsU3VwcGx5CAUNJHQwNTc5NDM1ODAwMwJfMgQNJHQwNTgwMDg1ODA2MQkBEV9sb2FkQXNzZXRXZWlnaHRzAAQMYXNzZXRXZWlnaHRzCAUNJHQwNTgwMDg1ODA2MQJfMQQLc2lnbWFXZWlnaHQIBQ0kdDA1ODAwODU4MDYxAl8yBANmZWUJAQ1fY2FsY3VsYXRlRmVlBwUNYXNzZXRCYWxhbmNlcwUQYXNzZXRUb3RhbFN1cHBseQUMYXNzZXRXZWlnaHRzBQtzaWdtYVdlaWdodAUPd2VpZ2h0QW1wbGlmaWVyBQxzbGlwcGFnZVJhdGUFCmZlZU1heFJhdGUECXV0aWxWYWx1ZQkAZQIFEGFzc2V0VG90YWxTdXBwbHkFA2ZlZQkAlAoCBQNuaWwJAJQKAgUJdXRpbFZhbHVlBQ1scFRvdGFsU3VwcGx5AWkBCmdldEZlZUZ1bmMABAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAQPd2VpZ2h0QW1wbGlmaWVyCAUHc3RvcmFnZQJfNwQMc2xpcHBhZ2VSYXRlCAUHc3RvcmFnZQJfOAQKZmVlTWF4UmF0ZQgFB3N0b3JhZ2UCXzkEDSR0MDU4NDkzNTg1NTMJARJfbG9hZEFzc2V0QmFsYW5jZXMABA1hc3NldEJhbGFuY2VzCAUNJHQwNTg0OTM1ODU1MwJfMQQQYXNzZXRUb3RhbFN1cHBseQgFDSR0MDU4NDkzNTg1NTMCXzIEDSR0MDU4NTU4NTg2MTEJARFfbG9hZEFzc2V0V2VpZ2h0cwAEDGFzc2V0V2VpZ2h0cwgFDSR0MDU4NTU4NTg2MTECXzEEC3NpZ21hV2VpZ2h0CAUNJHQwNTg1NTg1ODYxMQJfMgQDZmVlCQENX2NhbGN1bGF0ZUZlZQcFDWFzc2V0QmFsYW5jZXMFEGFzc2V0VG90YWxTdXBwbHkFDGFzc2V0V2VpZ2h0cwULc2lnbWFXZWlnaHQFD3dlaWdodEFtcGxpZmllcgUMc2xpcHBhZ2VSYXRlBQpmZWVNYXhSYXRlCQCUCgIFA25pbAUDZmVlAWkBCmNoZWNrcG9pbnQBBXVzZXJfBANlcnIDCQEQX3doZW5Jbml0aWFsaXplZAAJAQ5fd2hlbk5vdFBhdXNlZAAHAwkAAAIFA2VycgUDZXJyBAR1c2VyAwkAZgIJALECAQUFdXNlcl8AAAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEFBXVzZXJfAhhjaGVja3BvaW50OiBpbnZhbGlkIHVzZXIIBQFpBmNhbGxlcgkBC19jaGVja3BvaW50AQUEdXNlcgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQVzdGFrZQAEA2VycgMJARBfd2hlbkluaXRpYWxpemVkAAkBDl93aGVuTm90UGF1c2VkAAcDCQAAAgUDZXJyBQNlcnIEB3N0b3JhZ2UJAQxfbG9hZFN0b3JhZ2UABAxscEFzc2V0SWRTdHIJAQtfYXNzZXRUb1N0cgEIBQdzdG9yYWdlAl8xBARlcnIxAwMJARJfdmFsaWRhdGVJbnRFcXVhbHMDCQCQAwEIBQFpCHBheW1lbnRzAAECHHN0YWtlOiBpbnZhbGlkIHBheW1lbnRzIHNpemUJARRfdmFsaWRhdGVTdHJpbmdFcXVhbAMFDGxwQXNzZXRJZFN0cgkBC19hc3NldFRvU3RyAQgJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkAhxzdGFrZTogaW52YWxpZCBwYXltZW50IGFzc2V0BwkBDF92YWxpZGF0ZUludAQICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50AAAFB01BWF9JTlQCHXN0YWtlOiBpbnZhbGlkIHBheW1lbnQgYW1vdW50BwMJAAACBQRlcnIxBQRlcnIxBA0kdDA1OTYxOTU5Njc5CQELX2NoZWNrcG9pbnQBCAUBaQZjYWxsZXIEEWNoZWNrcG9pbnRBY3Rpb25zCAUNJHQwNTk2MTk1OTY3OQJfMQQLdXNlclByb2ZpdHMIBQ0kdDA1OTYxOTU5Njc5Al8yCQCUCgIJAM4IAgkAzggCBRFjaGVja3BvaW50QWN0aW9ucwkBC19zYXZlVXNlckxwAggFAWkGY2FsbGVyCQBkAgkBC19sb2FkVXNlckxwAQgFAWkGY2FsbGVyCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAkBDF9zYXZlVG90YWxMcAEJAGQCCQEMX2xvYWRUb3RhbExwAAgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEHdW5zdGFrZQEHYW1vdW50XwQDZXJyAwkBEF93aGVuSW5pdGlhbGl6ZWQACQEOX3doZW5Ob3RQYXVzZWQABwMJAAACBQNlcnIFA2VycgQHc3RvcmFnZQkBDF9sb2FkU3RvcmFnZQAECWxwQXNzZXRJZAgFB3N0b3JhZ2UCXzEEBnVzZXJMcAkBC19sb2FkVXNlckxwAQgFAWkGY2FsbGVyBARlcnIxCQEMX3ZhbGlkYXRlSW50BAUHYW1vdW50XwAABQZ1c2VyTHACF3Vuc3Rha2U6IGludmFsaWQgYW1vdW50AwkAAAIFBGVycjEFBGVycjEEDSR0MDYwMTkwNjAyNTAJAQtfY2hlY2twb2ludAEIBQFpBmNhbGxlcgQRY2hlY2twb2ludEFjdGlvbnMIBQ0kdDA2MDE5MDYwMjUwAl8xBAt1c2VyUHJvZml0cwgFDSR0MDYwMTkwNjAyNTACXzIJAJQKAgkAzggCCQDOCAIJAM4IAgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFB2Ftb3VudF8FCWxwQXNzZXRJZAUDbmlsBRFjaGVja3BvaW50QWN0aW9ucwkBC19zYXZlVXNlckxwAggFAWkGY2FsbGVyCQBlAgUGdXNlckxwBQdhbW91bnRfCQEMX3NhdmVUb3RhbExwAQkAZQIJAQxfbG9hZFRvdGFsTHAABQdhbW91bnRfBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBBWNsYWltAQV1c2VyXwQDZXJyAwkBEF93aGVuSW5pdGlhbGl6ZWQACQEOX3doZW5Ob3RQYXVzZWQABwMJAAACBQNlcnIFA2VycgQEdXNlcgMJAGYCCQCxAgEFBXVzZXJfAAAJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBBQV1c2VyXwITY2xhaW06IGludmFsaWQgdXNlcggFAWkGY2FsbGVyBAdzdG9yYWdlCQEMX2xvYWRTdG9yYWdlAAQJbHBBc3NldElkCAUHc3RvcmFnZQJfMQQMbHBBc3NldElkU3RyCQELX2Fzc2V0VG9TdHIBBQlscEFzc2V0SWQEBmFzc2V0cwkAzAgCBQxscEFzc2V0SWRTdHIJAQtfbG9hZEFzc2V0cwAECG1heEluZGV4CQBlAgkAkAMBBQZhc3NldHMAAQQGdXNlckxwCQELX2xvYWRVc2VyTHABBQR1c2VyBA0kdDA2MDk3MzYxMDI5CQELX2NoZWNrcG9pbnQBBQR1c2VyBBFjaGVja3BvaW50QWN0aW9ucwgFDSR0MDYwOTczNjEwMjkCXzEEC3VzZXJQcm9maXRzCAUNJHQwNjA5NzM2MTAyOQJfMgoBCGZvbGRGdW5jAgNhY2MGcHJvZml0BAVpbmRleAgFA2FjYwJfMQMDCQBnAgUIbWF4SW5kZXgFBWluZGV4CQBmAgUGcHJvZml0AAAHBAVhc3NldAkAkQMCBQZhc3NldHMFBWluZGV4CQCVCgMJAGQCBQVpbmRleAABCQDNCAIIBQNhY2MCXzIAAAkAzQgCCAUDYWNjAl8zCQEOU2NyaXB0VHJhbnNmZXIDBQR1c2VyBQZwcm9maXQJAQtfc3RyVG9Bc3NldAEFBWFzc2V0CQCVCgMJAGQCBQVpbmRleAABCQDNCAIIBQNhY2MCXzIFBnByb2ZpdAgFA2FjYwJfMwQNJHQwNjE0MDc2MTQ5OAoAAiRsBQt1c2VyUHJvZml0cwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJUKAwAABQNuaWwFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEIZm9sZEZ1bmMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDExCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwQDaWR4CAUNJHQwNjE0MDc2MTQ5OAJfMQQSdXNlclByb2ZpdHNVcGRhdGVkCAUNJHQwNjE0MDc2MTQ5OAJfMgQNcHJvZml0QWN0aW9ucwgFDSR0MDYxNDA3NjE0OTgCXzMJAJQKAgkAzggCCQDOCAIFDXByb2ZpdEFjdGlvbnMJANEIAgURY2hlY2twb2ludEFjdGlvbnMAAAkBEF9zYXZlVXNlclByb2ZpdHMCBQR1c2VyBRJ1c2VyUHJvZml0c1VwZGF0ZWQFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEFcGF1c2UABANlcnIDAwkBC19vbmx5UGF1c2VyAQgFAWkGY2FsbGVyCQEQX3doZW5Jbml0aWFsaXplZAAHCQEOX3doZW5Ob3RQYXVzZWQABwMJAAACBQNlcnIFA2VycgkAlAoCCQEKX3NhdmVQYXVzZQEGBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBB3VucGF1c2UABANlcnIDAwkBEV9vbmx5VGhpc0NvbnRyYWN0AQgFAWkGY2FsbGVyCQEQX3doZW5Jbml0aWFsaXplZAAHCQELX3doZW5QYXVzZWQABwMJAAACBQNlcnIFA2VycgkAlAoCCQEKX3NhdmVQYXVzZQEHBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDHVwZGF0ZVBhdXNlcgEHcGF1c2VyXwQDZXJyAwMJARFfb25seVRoaXNDb250cmFjdAEIBQFpBmNhbGxlcgkBEF93aGVuSW5pdGlhbGl6ZWQABwkBEF92YWxpZGF0ZUFkZHJlc3MCBQdwYXVzZXJfAhx1cGRhdGVQYXVzZXI6IGludmFsaWQgcGF1c2VyBwMJAAACBQNlcnIFA2VycgkAlAoCCQELX3NhdmVQYXVzZXIBCQERQGV4dHJOYXRpdmUoMTA2MikBBQdwYXVzZXJfBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDnVwZGF0ZVdhdGNoZG9nAgl3YXRjaGRvZ18Hb2Zmc2V0XwQDZXJyAwMDCQERX29ubHlUaGlzQ29udHJhY3QBCAUBaQZjYWxsZXIJARBfd2hlbkluaXRpYWxpemVkAAcJARBfdmFsaWRhdGVBZGRyZXNzAgUJd2F0Y2hkb2dfAiB1cGRhdGVXYXRjaGRvZzogaW52YWxpZCB3YXRjaGRvZwcJAQxfdmFsaWRhdGVJbnQEBQdvZmZzZXRfAAAFB01BWF9JTlQCHnVwZGF0ZVdhdGNoZG9nOiBpbnZhbGlkIG9mZnNldAcDCQAAAgUDZXJyBQNlcnIJAJQKAgkAzggCCQENX3NhdmVXYXRjaGRvZwEJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCXdhdGNoZG9nXwkBE19zYXZlV2F0Y2hkb2dPZmZzZXQBBQdvZmZzZXRfBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBC3NldE11bHRpc2lnAQltdWx0aXNpZ18EA2VycgMJARFfb25seVRoaXNDb250cmFjdAEIBQFpBmNhbGxlcgkBEF92YWxpZGF0ZUFkZHJlc3MCBQltdWx0aXNpZ18CHXNldE11bHRpc2lnOiBpbnZhbGlkIG11bHRpc2lnBwMJAAACBQNlcnIFA2VycgkAlAoCCQENX3NhdmVNdWx0aXNpZwEJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCW11bHRpc2lnXwUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgECdHgBBnZlcmlmeQAEByRtYXRjaDAJAKIIAQUMS0VZX01VTFRJU0lHAwkAAQIFByRtYXRjaDACBlN0cmluZwQIbXVsdGlzaWcFByRtYXRjaDAJAQt2YWx1ZU9yRWxzZQIJAJsIAgkBEUBleHRyTmF0aXZlKDEwNjIpAQUIbXVsdGlzaWcJALkJAgkAzAgCBQpLRVlfU1RBVFVTCQDMCAIJAKUIAQUEdGhpcwkAzAgCCQDYBAEIBQJ0eAJpZAUDbmlsBQNTRVAHCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACAUCdHgPc2VuZGVyUHVibGljS2V5ycwuuQ==", "height": 2825884, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 7EYmVN4bsGkpXRNwu8omCtmm7inQu7pZqWhPjn9m9t5S Next: Er7uFsXJfxS9Ea4GyEdiSrNABexJ31bC8VV9EsQ2rJqq Diff:
OldNewDifferences
10231023 }
10241024
10251025
1026-func _validateAllocation (assetBalances_,assetTotalSupply_,prevAssetBalances_,prevAssetTotalSupply_,assetWeights_,sigmaWeight_,maxAllocAmp_) = {
1027- func foldFunc (acc,elem) = {
1028- let index = acc._1
1029- $Tuple2((index + 1), if (acc._2)
1030- then _validateAssetAllocation(elem, assetTotalSupply_, prevAssetBalances_[index], prevAssetTotalSupply_, assetWeights_[index], sigmaWeight_, maxAllocAmp_)
1031- else false)
1032- }
1033-
1034- let result = {
1035- let $l = assetBalances_
1036- let $s = size($l)
1037- let $acc0 = $Tuple2(0, true)
1038- func $f0_1 ($a,$i) = if (($i >= $s))
1039- then $a
1040- else foldFunc($a, $l[$i])
1041-
1042- func $f0_2 ($a,$i) = if (($i >= $s))
1043- then $a
1044- else throw("List size exceeds 10")
1045-
1046- $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)
1047- }
1048- result._2
1049- }
1026+func _validateAllocation (assetBalances_,assetTotalSupply_,prevAssetBalances_,prevAssetTotalSupply_,assetWeights_,sigmaWeight_,maxAllocAmp_) = true
10501027
10511028
10521029 func _checkpoint (user_) = {
10601037 $Tuple2((index + 1), (acc._2 :+ profitUpdated))
10611038 }
10621039
1063- let $t02552025593 = {
1040+ let $t02555825631 = {
10641041 let $l = ZERO_INT_LIST_11
10651042 let $s = size($l)
10661043 let $acc0 = $Tuple2(0, nil)
10741051
10751052 $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)
10761053 }
1077- let idx = $t02552025593._1
1078- let profitsUpdated = $t02552025593._2
1054+ let idx = $t02555825631._1
1055+ let profitsUpdated = $t02555825631._2
10791056 $Tuple2((_saveUserProfits(user_, profitsUpdated) ++ _saveUserSigmaFeePerLp(user_, sigmaFeePerLp)), profitsUpdated)
10801057 }
10811058
10891066 $Tuple2((index + 1), (acc._2 :+ sigmaFeePerLpUpdated))
10901067 }
10911068
1092- let $t02624326322 = {
1069+ let $t02628126360 = {
10931070 let $l = ZERO_INT_LIST_11
10941071 let $s = size($l)
10951072 let $acc0 = $Tuple2(0, nil)
11031080
11041081 $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)
11051082 }
1106- let idx = $t02624326322._1
1107- let sigmaFeePerLpUpdated = $t02624326322._2
1083+ let idx = $t02628126360._1
1084+ let sigmaFeePerLpUpdated = $t02628126360._2
11081085 sigmaFeePerLpUpdated
11091086 }
11101087
11121089 func _calculateLpAndProtocolFees (assetIndex_,amount_,lpFeeRate_,protocolFeeRate_) = {
11131090 let sigmaFeePerLp = _loadSigmaFeePerLp()
11141091 let totalLp = _loadTotalLp()
1115- let $t02654326818 = if ((totalLp == 0))
1092+ let $t02658126856 = if ((totalLp == 0))
11161093 then $Tuple2(0, fraction(amount_, protocolFeeRate_, MAX_FEE))
11171094 else $Tuple2(fraction(amount_, lpFeeRate_, MAX_FEE), fraction(amount_, protocolFeeRate_, MAX_FEE))
1118- let lpFee = $t02654326818._1
1119- let protocolFee = $t02654326818._2
1095+ let lpFee = $t02658126856._1
1096+ let protocolFee = $t02658126856._2
11201097 let sigmaFeePerLpUpdated = if ((lpFee == 0))
11211098 then sigmaFeePerLp
11221099 else _updateSigmaFeePerLp(sigmaFeePerLp, totalLp, assetIndex_, lpFee)
11311108 let slippageRate = storage._8
11321109 let feeMaxRate = storage._9
11331110 let assets = _loadAssets()
1134- let $t02732727380 = _loadAssetWeights()
1135- let assetWeights = $t02732727380._1
1136- let sigmaWeight = $t02732727380._2
1137- let $t02738527453 = _loadAssetBalances()
1138- let prevAssetBalances = $t02738527453._1
1139- let prevAssetTotalSupply = $t02738527453._2
1140- let $t02745928689 = if ((prevAssetTotalSupply == 0))
1111+ let $t02736527418 = _loadAssetWeights()
1112+ let assetWeights = $t02736527418._1
1113+ let sigmaWeight = $t02736527418._2
1114+ let $t02742327491 = _loadAssetBalances()
1115+ let prevAssetBalances = $t02742327491._1
1116+ let prevAssetTotalSupply = $t02742327491._2
1117+ let $t02749728727 = if ((prevAssetTotalSupply == 0))
11411118 then {
11421119 func foldFunc (acc,elem) = {
11431120 let index = acc._1
11451122 $Tuple2((index + 1), (acc._2 :+ requiredAmountNormalized))
11461123 }
11471124
1148- let $t02790127975 = {
1125+ let $t02793928013 = {
11491126 let $l = assets
11501127 let $s = size($l)
11511128 let $acc0 = $Tuple2(0, nil)
11591136
11601137 $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)
11611138 }
1162- let idx = $t02790127975._1
1163- let requiredAmountsNormalized = $t02790127975._2
1139+ let idx = $t02793928013._1
1140+ let requiredAmountsNormalized = $t02793928013._2
11641141 $Tuple2(amount_, requiredAmountsNormalized)
11651142 }
11661143 else {
11711148 $Tuple2((index + 1), (acc._2 :+ requiredAmountNormalized))
11721149 }
11731150
1174- let $t02851828593 = {
1151+ let $t02855628631 = {
11751152 let $l = assets
11761153 let $s = size($l)
11771154 let $acc0 = $Tuple2(0, nil)
11851162
11861163 $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)
11871164 }
1188- let idx = $t02851828593._1
1189- let requiredAmountsNormalized = $t02851828593._2
1165+ let idx = $t02855628631._1
1166+ let requiredAmountsNormalized = $t02855628631._2
11901167 $Tuple2(fraction(amount_, lpTotalSupply, prevAssetTotalSupply), requiredAmountsNormalized)
11911168 }
1192- let lpTokensToMint = $t02745928689._1
1193- let requiredAmountsNormalized = $t02745928689._2
1194- let $t02869528808 = _incrementBalancesByAmounts(prevAssetBalances, requiredAmountsNormalized)
1195- let assetBalances = $t02869528808._1
1196- let assetTotalSupply = $t02869528808._2
1169+ let lpTokensToMint = $t02749728727._1
1170+ let requiredAmountsNormalized = $t02749728727._2
1171+ let $t02873328846 = _incrementBalancesByAmounts(prevAssetBalances, requiredAmountsNormalized)
1172+ let assetBalances = $t02873328846._1
1173+ let assetTotalSupply = $t02873328846._2
11971174 let err2 = _validateLiquidityInvariant(prevAssetBalances, prevAssetTotalSupply, assetBalances, assetTotalSupply, lpTotalSupply, (lpTotalSupply + lpTokensToMint), assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
11981175 if ((err2 == err2))
11991176 then $Tuple3(lpTokensToMint, requiredAmountsNormalized, assetBalances)
12111188 let slippageRate = storage._8
12121189 let feeMaxRate = storage._9
12131190 let assets = _loadAssets()
1214- let $t02957129624 = _loadAssetWeights()
1215- let assetWeights = $t02957129624._1
1216- let sigmaWeight = $t02957129624._2
1217- let $t02962929743 = _loadAssetBalances()
1218- let prevAssetBalances = $t02962929743._1
1219- let prevAssetTotalSupply = $t02962929743._2
1191+ let $t02960929662 = _loadAssetWeights()
1192+ let assetWeights = $t02960929662._1
1193+ let sigmaWeight = $t02960929662._2
1194+ let $t02966729781 = _loadAssetBalances()
1195+ let prevAssetBalances = $t02966729781._1
1196+ let prevAssetTotalSupply = $t02966729781._2
12201197 let assetBalances = _incrementBalanceByIndex(prevAssetBalances, value(indexOf(assets, assetId_)), amount_)
12211198 let assetTotalSupply = (prevAssetTotalSupply + amount_)
12221199 let err2 = _validateAllocation(assetBalances, assetTotalSupply, prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, maxAllocAmplifier)
12361213 then lpTokensToMintInner
12371214 else throw("Strict value is not equal to itself.")
12381215 }
1239- let $t03140531536 = _calculateLpAndProtocolFees(0, lpTokensToMint, (lpFeeRate / 2), (protocolFeeRate / 2))
1240- let lpFee = $t03140531536._1
1241- let protocolFee = $t03140531536._2
1242- let sigmaFeePerLpUpdated = $t03140531536._3
1216+ let $t03144331574 = _calculateLpAndProtocolFees(0, lpTokensToMint, (lpFeeRate / 2), (protocolFeeRate / 2))
1217+ let lpFee = $t03144331574._1
1218+ let protocolFee = $t03144331574._2
1219+ let sigmaFeePerLpUpdated = $t03144331574._3
12431220 $Tuple5(lpTokensToMint, assetBalances, lpFee, protocolFee, sigmaFeePerLpUpdated)
12441221 }
12451222 else throw("Strict value is not equal to itself.")
12531230 let weightAmplifier = storage._7
12541231 let slippageRate = storage._8
12551232 let feeMaxRate = storage._9
1256- let $t03187031938 = _loadAssetBalances()
1257- let prevAssetBalances = $t03187031938._1
1258- let prevAssetTotalSupply = $t03187031938._2
1259- let $t03194331996 = _loadAssetWeights()
1260- let assetWeights = $t03194331996._1
1261- let sigmaWeight = $t03194331996._2
1233+ let $t03190831976 = _loadAssetBalances()
1234+ let prevAssetBalances = $t03190831976._1
1235+ let prevAssetTotalSupply = $t03190831976._2
1236+ let $t03198132034 = _loadAssetWeights()
1237+ let assetWeights = $t03198132034._1
1238+ let sigmaWeight = $t03198132034._2
12621239 let lpTokensToBurn = amount_
12631240 let err = _validateInt(lpTokensToBurn, 0, MAX_INT, "_withdrawAll: lpTokensToBurn less than 0")
12641241 if ((err == err))
12651242 then {
1266- let $t03213832271 = _decrementBalancesByLpAmount(prevAssetBalances, lpTokensToBurn, lpTotalSupply)
1267- let assetBalances = $t03213832271._1
1268- let assetTotalSupply = $t03213832271._2
1269- let balancesToPay = $t03213832271._3
1243+ let $t03217632309 = _decrementBalancesByLpAmount(prevAssetBalances, lpTokensToBurn, lpTotalSupply)
1244+ let assetBalances = $t03217632309._1
1245+ let assetTotalSupply = $t03217632309._2
1246+ let balancesToPay = $t03217632309._3
12701247 let err2 = _validateLiquidityInvariant(prevAssetBalances, prevAssetTotalSupply, assetBalances, assetTotalSupply, lpTotalSupply, (lpTotalSupply - lpTokensToBurn), assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
12711248 if ((err2 == err2))
12721249 then $Tuple3(lpTokensToBurn, balancesToPay, assetBalances)
12871264 let feeMaxRate = storage._9
12881265 let precision = _loadPrecision()
12891266 let assets = _loadAssets()
1290- let $t03306333131 = _loadAssetBalances()
1291- let prevAssetBalances = $t03306333131._1
1292- let prevAssetTotalSupply = $t03306333131._2
1293- let $t03313633189 = _loadAssetWeights()
1294- let assetWeights = $t03313633189._1
1295- let sigmaWeight = $t03313633189._2
1267+ let $t03310133169 = _loadAssetBalances()
1268+ let prevAssetBalances = $t03310133169._1
1269+ let prevAssetTotalSupply = $t03310133169._2
1270+ let $t03317433227 = _loadAssetWeights()
1271+ let assetWeights = $t03317433227._1
1272+ let sigmaWeight = $t03317433227._2
12961273 let targetAssetIndex = value(indexOf(assets, assetId_))
12971274 let prevFee = _calculateFee(prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
12981275 let prevUtilValue = (prevAssetTotalSupply - prevFee)
13191296
13201297 let targetAmount = {
13211298 let stop = toInt(fraction(toBigInt((lpAmount_ + prevFee)), prevUtilValueDivLp, PERCENT_FACTOR, CEILING))
1322- let $t03505535167 = {
1299+ let $t03509335205 = {
13231300 let $l = LIST_64
13241301 let $s = size($l)
13251302 let $acc0 = $Tuple5(false, 0, stop, 0, 0)
13331310
13341311 $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)
13351312 }
1336- let success = $t03505535167._1
1337- let startOut = $t03505535167._2
1338- let stopOut = $t03505535167._3
1339- let targetAmountOut = $t03505535167._4
1340- let diffOut = $t03505535167._5
1313+ let success = $t03509335205._1
1314+ let startOut = $t03509335205._2
1315+ let stopOut = $t03509335205._3
1316+ let targetAmountOut = $t03509335205._4
1317+ let diffOut = $t03509335205._5
13411318 if (!(success))
13421319 then throw(((("_withdraw: can't calculate targetAmount=" + toString(targetAmountOut)) + ",diff=") + toString(diffOut)))
13431320 else targetAmountOut
13491326 else false
13501327 if ((err1 == err1))
13511328 then {
1352- let $t03615936307 = _calculateLpAndProtocolFees((targetAssetIndex + 1), targetAmount, (lpFeeRate / 2), (protocolFeeRate / 2))
1353- let lpFee = $t03615936307._1
1354- let protocolFee = $t03615936307._2
1355- let sigmaFeePerLpUpdated = $t03615936307._3
1329+ let $t03619736345 = _calculateLpAndProtocolFees((targetAssetIndex + 1), targetAmount, (lpFeeRate / 2), (protocolFeeRate / 2))
1330+ let lpFee = $t03619736345._1
1331+ let protocolFee = $t03619736345._2
1332+ let sigmaFeePerLpUpdated = $t03619736345._3
13561333 $Tuple5(targetAmount, finalAssetBalances, lpFee, protocolFee, sigmaFeePerLpUpdated)
13571334 }
13581335 else throw("Strict value is not equal to itself.")
13711348 let slippageRate = storage._8
13721349 let feeMaxRate = storage._9
13731350 let precision = _loadPrecision()
1374- let $t03688936957 = _loadAssetBalances()
1375- let prevAssetBalances = $t03688936957._1
1376- let prevAssetTotalSupply = $t03688936957._2
1377- let $t03696237015 = _loadAssetWeights()
1378- let assetWeights = $t03696237015._1
1379- let sigmaWeight = $t03696237015._2
1351+ let $t03692736995 = _loadAssetBalances()
1352+ let prevAssetBalances = $t03692736995._1
1353+ let prevAssetTotalSupply = $t03692736995._2
1354+ let $t03700037053 = _loadAssetWeights()
1355+ let assetWeights = $t03700037053._1
1356+ let sigmaWeight = $t03700037053._2
13801357 let assetBalances = _incrementBalanceByIndex(prevAssetBalances, sourceAssetIndex_, sourceAmount_)
13811358 let assetTotalSupply = (prevAssetTotalSupply + sourceAmount_)
13821359 let prevFee = _calculateFee(prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
14081385 if ((feeDiff == 0))
14091386 then targetAmount
14101387 else {
1411- let $t03898839119 = {
1388+ let $t03902639157 = {
14121389 let $l = LIST_64
14131390 let $s = size($l)
14141391 let $acc0 = $Tuple5(false, 0, (sourceAmount_ + prevFee), 0, 0)
14221399
14231400 $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)
14241401 }
1425- let success = $t03898839119._1
1426- let startOut = $t03898839119._2
1427- let stopOut = $t03898839119._3
1428- let targetAmountOut = $t03898839119._4
1429- let diffOut = $t03898839119._5
1402+ let success = $t03902639157._1
1403+ let startOut = $t03902639157._2
1404+ let stopOut = $t03902639157._3
1405+ let targetAmountOut = $t03902639157._4
1406+ let diffOut = $t03902639157._5
14301407 if (!(success))
14311408 then throw(((("_swap: can't calculate targetAmount=" + toString(targetAmountOut)) + ",diff=") + toString(diffOut)))
14321409 else targetAmountOut
14391416 else false
14401417 if ((err1 == err1))
14411418 then {
1442- let $t03996640107 = _calculateLpAndProtocolFees((targetAssetIndex_ + 1), targetAmount, lpFeeRate, protocolFeeRate)
1443- let lpFee = $t03996640107._1
1444- let protocolFee = $t03996640107._2
1445- let sigmaFeePerLpUpdated = $t03996640107._3
1419+ let $t04000440145 = _calculateLpAndProtocolFees((targetAssetIndex_ + 1), targetAmount, lpFeeRate, protocolFeeRate)
1420+ let lpFee = $t04000440145._1
1421+ let protocolFee = $t04000440145._2
1422+ let sigmaFeePerLpUpdated = $t04000440145._3
14461423 $Tuple5(targetAmount, finalAssetBalances, lpFee, protocolFee, sigmaFeePerLpUpdated)
14471424 }
14481425 else throw("Strict value is not equal to itself.")
14881465 else false
14891466 if ((err == err))
14901467 then {
1491- let $t04197042039 = _prepareAssetWeights(assetWeights_)
1492- let assetWeights = $t04197042039._1
1493- let sigmaWeight = $t04197042039._2
1468+ let $t04200842077 = _prepareAssetWeights(assetWeights_)
1469+ let assetWeights = $t04200842077._1
1470+ let sigmaWeight = $t04200842077._2
14941471 let assetBalances = _prepareAssetBalances(assets_)
14951472 let issue = Issue(lpTokenName_, lpTokenDescr_, 0, lpTokenDecimals_, true)
14961473 let lpAssetId = calculateAssetId(issue)
15151492 let lpAssetId = storage._1
15161493 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
15171494 let assets = _loadAssets()
1518- let $t04378943874 = _depositAll(amount_)
1519- let lpTokensToMint = $t04378943874._1
1520- let requiredAmountsNormalized = $t04378943874._2
1521- let assetBalances = $t04378943874._3
1495+ let $t04382743912 = _depositAll(amount_)
1496+ let lpTokensToMint = $t04382743912._1
1497+ let requiredAmountsNormalized = $t04382743912._2
1498+ let assetBalances = $t04382743912._3
15221499 func foldFunc (acc,elem) = {
15231500 let index = acc._1
15241501 let paymentAssetStr = _assetToStr(i.payments[index].assetId)
15421519 else throw("Strict value is not equal to itself.")
15431520 }
15441521
1545- let $t04501745079 = {
1522+ let $t04505545117 = {
15461523 let $l = assets
15471524 let $s = size($l)
15481525 let $acc0 = $Tuple2(0, nil)
15561533
15571534 $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)
15581535 }
1559- let idx = $t04501745079._1
1560- let changeActions = $t04501745079._2
1536+ let idx = $t04505545117._1
1537+ let changeActions = $t04505545117._2
15611538 let storageUpdated = $Tuple10(storage._1, storage._2, (storage._3 + lpTokensToMint), storage._4, storage._5, storage._6, storage._7, storage._8, storage._9, storage._10)
15621539 $Tuple2(((([Reissue(lpAssetId, lpTokensToMint, true), ScriptTransfer(i.caller, lpTokensToMint, lpAssetId)] ++ _saveStorage(storageUpdated)) ++ _saveAssetBalances(assetBalances)) ++ changeActions), unit)
15631540 }
15911568 let assetStr = _assetToStr(i.payments[0].assetId)
15921569 let assetDecimals = _getDecimals(assetStr)
15931570 let amountNormalized = _normalizeDecimals(i.payments[0].amount, assetDecimals, lpDecimals, DOWN)
1594- let $t04651946635 = _deposit(assetStr, amountNormalized)
1595- let lpTokensToMint = $t04651946635._1
1596- let assetBalances = $t04651946635._2
1597- let lpFee = $t04651946635._3
1598- let protocolFee = $t04651946635._4
1599- let sigmaFeePerLpUpdated = $t04651946635._5
1571+ let $t04655746673 = _deposit(assetStr, amountNormalized)
1572+ let lpTokensToMint = $t04655746673._1
1573+ let assetBalances = $t04655746673._2
1574+ let lpFee = $t04655746673._3
1575+ let protocolFee = $t04655746673._4
1576+ let sigmaFeePerLpUpdated = $t04655746673._5
16001577 let lpTokensToSend = ((lpTokensToMint - lpFee) - protocolFee)
16011578 let err2 = _validateInt(lpTokensToSend, minLpAmount_, MAX_INT, "deposit: less than min")
16021579 if ((err2 == err2))
16291606 else false
16301607 if ((err == err))
16311608 then {
1632- let $t04809648183 = _withdrawAll(i.payments[0].amount)
1633- let lpTokensToBurn = $t04809648183._1
1634- let balancesToPay = $t04809648183._2
1635- let assetBalances = $t04809648183._3
1609+ let $t04813448221 = _withdrawAll(i.payments[0].amount)
1610+ let lpTokensToBurn = $t04813448221._1
1611+ let balancesToPay = $t04813448221._2
1612+ let assetBalances = $t04813448221._3
16361613 let paymentActions = _getPaymentsFromBalances(assets, balancesToPay, i.caller, lpDecimals)
16371614 let storageUpdated = $Tuple10(storage._1, storage._2, (storage._3 - lpTokensToBurn), storage._4, storage._5, storage._6, storage._7, storage._8, storage._9, storage._10)
16381615 $Tuple2(((([Burn(lpAssetId, lpTokensToBurn)] ++ paymentActions) ++ _saveStorage(storageUpdated)) ++ _saveAssetBalances(assetBalances)), unit)
16661643 else false
16671644 if ((err == err))
16681645 then {
1669- let $t04953749671 = _withdraw(assetId_, i.payments[0].amount)
1670- let targetAmountNormalized = $t04953749671._1
1671- let finalAssetBalances = $t04953749671._2
1672- let lpFee = $t04953749671._3
1673- let protocolFee = $t04953749671._4
1674- let sigmaFeePerLpUpdated = $t04953749671._5
1646+ let $t04957549709 = _withdraw(assetId_, i.payments[0].amount)
1647+ let targetAmountNormalized = $t04957549709._1
1648+ let finalAssetBalances = $t04957549709._2
1649+ let lpFee = $t04957549709._3
1650+ let protocolFee = $t04957549709._4
1651+ let sigmaFeePerLpUpdated = $t04957549709._5
16751652 let finalAmountNormalized = ((targetAmountNormalized - lpFee) - protocolFee)
16761653 let targetDecimals = _getDecimals(assetId_)
16771654 let finalAmount = _normalizeDecimals(finalAmountNormalized, lpDecimals, targetDecimals, DOWN)
17171694 else false
17181695 if ((err == err))
17191696 then {
1720- let $t05178451942 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
1721- let targetAmountNormalized = $t05178451942._1
1722- let finalAssetBalances = $t05178451942._2
1723- let lpFee = $t05178451942._3
1724- let protocolFee = $t05178451942._4
1725- let sigmaFeePerLpUpdated = $t05178451942._5
1697+ let $t05182251980 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
1698+ let targetAmountNormalized = $t05182251980._1
1699+ let finalAssetBalances = $t05182251980._2
1700+ let lpFee = $t05182251980._3
1701+ let protocolFee = $t05182251980._4
1702+ let sigmaFeePerLpUpdated = $t05182251980._5
17261703 let finalAmountNormalized = ((targetAmountNormalized - lpFee) - protocolFee)
17271704 let targetDecimals = _getDecimals(targetAssetId_)
17281705 let finalAmount = _normalizeDecimals(finalAmountNormalized, lpDecimals, targetDecimals, DOWN)
17451722 let err = _validateInt(lpAmount_, 1, MAX_INT, "getDepositAll: invalid amount")
17461723 if ((err == err))
17471724 then {
1748- let $t05306253149 = _depositAll(lpAmount_)
1749- let lpTokensToMint = $t05306253149._1
1750- let requiredAmountsNormalized = $t05306253149._2
1751- let assetBalances = $t05306253149._3
1725+ let $t05310053187 = _depositAll(lpAmount_)
1726+ let lpTokensToMint = $t05310053187._1
1727+ let requiredAmountsNormalized = $t05310053187._2
1728+ let assetBalances = $t05310053187._3
17521729 $Tuple2(nil, $Tuple2(lpTokensToMint, requiredAmountsNormalized))
17531730 }
17541731 else throw("Strict value is not equal to itself.")
17681745 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
17691746 let assetDecimals = _getDecimals(assetId_)
17701747 let amountNormalized = _normalizeDecimals(amount_, assetDecimals, lpDecimals, DOWN)
1771- let $t05390854024 = _deposit(assetId_, amountNormalized)
1772- let lpTokensToMint = $t05390854024._1
1773- let assetBalances = $t05390854024._2
1774- let lpFee = $t05390854024._3
1775- let protocolFee = $t05390854024._4
1776- let sigmaFeePerLpUpdated = $t05390854024._5
1748+ let $t05394654062 = _deposit(assetId_, amountNormalized)
1749+ let lpTokensToMint = $t05394654062._1
1750+ let assetBalances = $t05394654062._2
1751+ let lpFee = $t05394654062._3
1752+ let protocolFee = $t05394654062._4
1753+ let sigmaFeePerLpUpdated = $t05394654062._5
17771754 let lpTokensToSend = ((lpTokensToMint - lpFee) - protocolFee)
17781755 $Tuple2(nil, lpTokensToSend)
17791756 }
17871764 let err = _validateInt(lpAmount_, 0, MAX_INT, "getWithdrawAll: invalid amount")
17881765 if ((err == err))
17891766 then {
1790- let $t05446354539 = _withdrawAll(lpAmount_)
1791- let lpTokensToBurn = $t05446354539._1
1792- let balancesToGet = $t05446354539._2
1793- let assetBalances = $t05446354539._3
1767+ let $t05450154577 = _withdrawAll(lpAmount_)
1768+ let lpTokensToBurn = $t05450154577._1
1769+ let balancesToGet = $t05450154577._2
1770+ let assetBalances = $t05450154577._3
17941771 $Tuple2(nil, balancesToGet)
17951772 }
17961773 else throw("Strict value is not equal to itself.")
18081785 let storage = _loadStorage()
18091786 let lpAssetId = storage._1
18101787 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
1811- let $t05519055306 = _withdraw(assetId_, amount_)
1812- let targetAmountNormalized = $t05519055306._1
1813- let assetBalances = $t05519055306._2
1814- let lpFee = $t05519055306._3
1815- let protocolFee = $t05519055306._4
1816- let sigmaFeePerLpUpdated = $t05519055306._5
1788+ let $t05522855344 = _withdraw(assetId_, amount_)
1789+ let targetAmountNormalized = $t05522855344._1
1790+ let assetBalances = $t05522855344._2
1791+ let lpFee = $t05522855344._3
1792+ let protocolFee = $t05522855344._4
1793+ let sigmaFeePerLpUpdated = $t05522855344._5
18171794 let finalAmountNormalized = ((targetAmountNormalized - lpFee) - protocolFee)
18181795 let targetDecimals = _getDecimals(assetId_)
18191796 let finalAmount = _normalizeDecimals(finalAmountNormalized, lpDecimals, targetDecimals, DOWN)
18421819 else false
18431820 if ((err == err))
18441821 then {
1845- let $t05671656874 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
1846- let targetAmountNormalized = $t05671656874._1
1847- let finalAssetBalances = $t05671656874._2
1848- let lpFee = $t05671656874._3
1849- let protocolFee = $t05671656874._4
1850- let sigmaFeePerLpUpdated = $t05671656874._5
1822+ let $t05675456912 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
1823+ let targetAmountNormalized = $t05675456912._1
1824+ let finalAssetBalances = $t05675456912._2
1825+ let lpFee = $t05675456912._3
1826+ let protocolFee = $t05675456912._4
1827+ let sigmaFeePerLpUpdated = $t05675456912._5
18511828 let finalAmountNormalized = ((targetAmountNormalized - lpFee) - protocolFee)
18521829 let targetDecimals = _getDecimals(targetAssetId_)
18531830 let finalAmount = _normalizeDecimals(finalAmountNormalized, lpDecimals, targetDecimals, DOWN)
18671844 let user = if ((size(user_) > 0))
18681845 then valueOrErrorMessage(addressFromString(user_), "getClaim: invalid user")
18691846 else i.caller
1870- let $t05751657572 = _checkpoint(user)
1871- let checkpointActions = $t05751657572._1
1872- let userProfits = $t05751657572._2
1847+ let $t05755457610 = _checkpoint(user)
1848+ let checkpointActions = $t05755457610._1
1849+ let userProfits = $t05755457610._2
18731850 $Tuple2(nil, userProfits)
18741851 }
18751852
18821859 let weightAmplifier = storage._7
18831860 let slippageRate = storage._8
18841861 let feeMaxRate = storage._9
1885- let $t05790557965 = _loadAssetBalances()
1886- let assetBalances = $t05790557965._1
1887- let assetTotalSupply = $t05790557965._2
1888- let $t05797058023 = _loadAssetWeights()
1889- let assetWeights = $t05797058023._1
1890- let sigmaWeight = $t05797058023._2
1862+ let $t05794358003 = _loadAssetBalances()
1863+ let assetBalances = $t05794358003._1
1864+ let assetTotalSupply = $t05794358003._2
1865+ let $t05800858061 = _loadAssetWeights()
1866+ let assetWeights = $t05800858061._1
1867+ let sigmaWeight = $t05800858061._2
18911868 let fee = _calculateFee(assetBalances, assetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
18921869 let utilValue = (assetTotalSupply - fee)
18931870 $Tuple2(nil, $Tuple2(utilValue, lpTotalSupply))
19011878 let weightAmplifier = storage._7
19021879 let slippageRate = storage._8
19031880 let feeMaxRate = storage._9
1904- let $t05845558515 = _loadAssetBalances()
1905- let assetBalances = $t05845558515._1
1906- let assetTotalSupply = $t05845558515._2
1907- let $t05852058573 = _loadAssetWeights()
1908- let assetWeights = $t05852058573._1
1909- let sigmaWeight = $t05852058573._2
1881+ let $t05849358553 = _loadAssetBalances()
1882+ let assetBalances = $t05849358553._1
1883+ let assetTotalSupply = $t05849358553._2
1884+ let $t05855858611 = _loadAssetWeights()
1885+ let assetWeights = $t05855858611._1
1886+ let sigmaWeight = $t05855858611._2
19101887 let fee = _calculateFee(assetBalances, assetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
19111888 $Tuple2(nil, fee)
19121889 }
19461923 else false
19471924 if ((err1 == err1))
19481925 then {
1949- let $t05958159641 = _checkpoint(i.caller)
1950- let checkpointActions = $t05958159641._1
1951- let userProfits = $t05958159641._2
1926+ let $t05961959679 = _checkpoint(i.caller)
1927+ let checkpointActions = $t05961959679._1
1928+ let userProfits = $t05961959679._2
19521929 $Tuple2(((checkpointActions ++ _saveUserLp(i.caller, (_loadUserLp(i.caller) + i.payments[0].amount))) ++ _saveTotalLp((_loadTotalLp() + i.payments[0].amount))), unit)
19531930 }
19541931 else throw("Strict value is not equal to itself.")
19711948 let err1 = _validateInt(amount_, 0, userLp, "unstake: invalid amount")
19721949 if ((err1 == err1))
19731950 then {
1974- let $t06015260212 = _checkpoint(i.caller)
1975- let checkpointActions = $t06015260212._1
1976- let userProfits = $t06015260212._2
1951+ let $t06019060250 = _checkpoint(i.caller)
1952+ let checkpointActions = $t06019060250._1
1953+ let userProfits = $t06019060250._2
19771954 $Tuple2(((([ScriptTransfer(i.caller, amount_, lpAssetId)] ++ checkpointActions) ++ _saveUserLp(i.caller, (userLp - amount_))) ++ _saveTotalLp((_loadTotalLp() - amount_))), unit)
19781955 }
19791956 else throw("Strict value is not equal to itself.")
19991976 let assets = [lpAssetIdStr, _loadAssets()]
20001977 let maxIndex = (size(assets) - 1)
20011978 let userLp = _loadUserLp(user)
2002- let $t06093560991 = _checkpoint(user)
2003- let checkpointActions = $t06093560991._1
2004- let userProfits = $t06093560991._2
1979+ let $t06097361029 = _checkpoint(user)
1980+ let checkpointActions = $t06097361029._1
1981+ let userProfits = $t06097361029._2
20051982 func foldFunc (acc,profit) = {
20061983 let index = acc._1
20071984 if (if ((maxIndex >= index))
20141991 else $Tuple3((index + 1), (acc._2 :+ profit), acc._3)
20151992 }
20161993
2017- let $t06136961460 = {
1994+ let $t06140761498 = {
20181995 let $l = userProfits
20191996 let $s = size($l)
20201997 let $acc0 = $Tuple3(0, nil, nil)
20282005
20292006 $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)
20302007 }
2031- let idx = $t06136961460._1
2032- let userProfitsUpdated = $t06136961460._2
2033- let profitActions = $t06136961460._3
2008+ let idx = $t06140761498._1
2009+ let userProfitsUpdated = $t06140761498._2
2010+ let profitActions = $t06140761498._3
20342011 $Tuple2(((profitActions ++ removeByIndex(checkpointActions, 0)) ++ _saveUserProfits(user, userProfitsUpdated)), unit)
20352012 }
20362013 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 ((index == index_))
874874 then $Tuple2((index + 1), (acc._2 :+ (elem - amount_)))
875875 else $Tuple2((index + 1), (acc._2 :+ elem))
876876 }
877877
878878 let result = {
879879 let $l = balances_
880880 let $s = size($l)
881881 let $acc0 = $Tuple2(0, nil)
882882 func $f0_1 ($a,$i) = if (($i >= $s))
883883 then $a
884884 else foldFunc($a, $l[$i])
885885
886886 func $f0_2 ($a,$i) = if (($i >= $s))
887887 then $a
888888 else throw("List size exceeds 10")
889889
890890 $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)
891891 }
892892 result._2
893893 }
894894
895895
896896 func _decrementBalancesByLpAmount (balances_,amount_,lpTotalSupply_) = {
897897 let rate = fraction((lpTotalSupply_ - amount_), RATE_FACTOR, lpTotalSupply_, CEILING)
898898 func foldFunc (acc,elem) = {
899899 let newBalance = fraction(elem, rate, RATE_FACTOR, CEILING)
900900 let deltaBalance = (elem - newBalance)
901901 $Tuple3((acc._1 :+ newBalance), (acc._2 + newBalance), (acc._3 :+ deltaBalance))
902902 }
903903
904904 let $l = balances_
905905 let $s = size($l)
906906 let $acc0 = $Tuple3(nil, 0, nil)
907907 func $f0_1 ($a,$i) = if (($i >= $s))
908908 then $a
909909 else foldFunc($a, $l[$i])
910910
911911 func $f0_2 ($a,$i) = if (($i >= $s))
912912 then $a
913913 else throw("List size exceeds 10")
914914
915915 $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)
916916 }
917917
918918
919919 func _getPaymentsFromBalances (assets_,balances_,recipient_,sourceDecimals_) = {
920920 func foldFunc (acc,elem) = {
921921 let index = acc._1
922922 $Tuple2((index + 1), (acc._2 :+ ScriptTransfer(recipient_, _normalizeDecimals(balances_[index], sourceDecimals_, _getDecimals(elem), DOWN), _strToAsset(elem))))
923923 }
924924
925925 let result = {
926926 let $l = assets_
927927 let $s = size($l)
928928 let $acc0 = $Tuple2(0, nil)
929929 func $f0_1 ($a,$i) = if (($i >= $s))
930930 then $a
931931 else foldFunc($a, $l[$i])
932932
933933 func $f0_2 ($a,$i) = if (($i >= $s))
934934 then $a
935935 else throw("List size exceeds 10")
936936
937937 $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)
938938 }
939939 result._2
940940 }
941941
942942
943943 func _calculateMicroFee (balance_,equilibrium_,weightAmplifier_,slippageRate_,feeMaxRate_) = if ((equilibrium_ > balance_))
944944 then {
945945 let threshold = fraction(equilibrium_, (MAX_WEIGHT_AMPLIFIER - weightAmplifier_), MAX_WEIGHT_AMPLIFIER)
946946 if ((threshold > balance_))
947947 then {
948948 let maxDeviation = (threshold - balance_)
949949 let feeRate = fraction(fraction(maxDeviation, slippageRate_, SLIPPAGE_RATE_FACTOR), FEE_RATE_FACTOR, equilibrium_)
950950 if ((feeRate > feeMaxRate_))
951951 then fraction(maxDeviation, feeMaxRate_, FEE_RATE_FACTOR)
952952 else fraction(maxDeviation, feeRate, FEE_RATE_FACTOR)
953953 }
954954 else 0
955955 }
956956 else {
957957 let threshold = fraction(equilibrium_, (MAX_WEIGHT_AMPLIFIER + weightAmplifier_), MAX_WEIGHT_AMPLIFIER)
958958 if ((balance_ > threshold))
959959 then {
960960 let maxDeviation = (balance_ - threshold)
961961 let feeRate = fraction(fraction(maxDeviation, slippageRate_, SLIPPAGE_RATE_FACTOR), FEE_RATE_FACTOR, equilibrium_)
962962 if ((feeRate > feeMaxRate_))
963963 then fraction(maxDeviation, feeMaxRate_, FEE_RATE_FACTOR)
964964 else fraction(maxDeviation, feeRate, FEE_RATE_FACTOR)
965965 }
966966 else 0
967967 }
968968
969969
970970 func _calculateFee (balances_,assetsTotalSupply_,weights_,sigmaWeight_,weightAmplifier_,slippageRate_,feeMaxRate_) = 0
971971
972972
973973 func _validateLiquidityInvariant (prevAssetBalances_,prevAssetTotalSupply_,assetBalances_,assetTotalSupply_,prevLpTotalSupply_,lpTotalSupply_,assetWeights_,sigmaWeight_,weightAmplifier_,slippageRate_,feeMaxRate_) = if (if ((prevLpTotalSupply_ == 0))
974974 then true
975975 else (lpTotalSupply_ == 0))
976976 then true
977977 else {
978978 let prevAssetsRate = fraction((prevAssetTotalSupply_ - _calculateFee(prevAssetBalances_, prevAssetTotalSupply_, assetWeights_, sigmaWeight_, weightAmplifier_, slippageRate_, feeMaxRate_)), RATE_FACTOR, prevLpTotalSupply_)
979979 let newAssetsRate = fraction((assetTotalSupply_ - _calculateFee(assetBalances_, assetTotalSupply_, assetWeights_, sigmaWeight_, weightAmplifier_, slippageRate_, feeMaxRate_)), RATE_FACTOR, lpTotalSupply_)
980980 let diff = (newAssetsRate - prevAssetsRate)
981981 if (if ((0 >= diff))
982982 then ((-1 * _loadPrecision()) > diff)
983983 else false)
984984 then throw(("_validateLiquidityInvariant: revert: diff=" + toString(diff)))
985985 else true
986986 }
987987
988988
989989 func _validateSwapInvariant (prevAssetBalances_,prevAssetTotalSupply_,assetBalances_,assetTotalSupply_,assetWeights_,sigmaWeight_,weightAmplifier_,slippageRate_,feeMaxRate_) = {
990990 let prevUtil = (prevAssetTotalSupply_ - _calculateFee(prevAssetBalances_, prevAssetTotalSupply_, assetWeights_, sigmaWeight_, weightAmplifier_, slippageRate_, feeMaxRate_))
991991 let newUtil = (assetTotalSupply_ - _calculateFee(assetBalances_, assetTotalSupply_, assetWeights_, sigmaWeight_, weightAmplifier_, slippageRate_, feeMaxRate_))
992992 let diff = (newUtil - prevUtil)
993993 if (if ((0 >= diff))
994994 then ((-1 * _loadPrecision()) > diff)
995995 else false)
996996 then throw(("_validateSwapInvariant: revert: diff=" + toString(diff)))
997997 else true
998998 }
999999
10001000
10011001 func _validateAssetAllocation (balance_,assetTotalSupply_,prevBalance_,prevAssetTotalSupply_,weight_,sigmaWeight_,maxAllocAmp_) = {
10021002 let equilibrium = fraction(assetTotalSupply_, weight_, sigmaWeight_)
10031003 let maxAllocationAmp = if ((balance_ > equilibrium))
10041004 then (MAX_AMPLIFIER + maxAllocAmp_)
10051005 else (MAX_AMPLIFIER - maxAllocAmp_)
10061006 let maxAllocation = fraction(equilibrium, maxAllocationAmp, MAX_AMPLIFIER)
10071007 let prevMaxAllocation = fraction(fraction(prevAssetTotalSupply_, weight_, sigmaWeight_), maxAllocationAmp, MAX_AMPLIFIER)
10081008 if ((balance_ > equilibrium))
10091009 then if ((balance_ > maxAllocation))
10101010 then if ((prevMaxAllocation > prevBalance_))
10111011 then throw("_validateAssetAllocation: new up")
10121012 else if (((balance_ - maxAllocation) > (prevBalance_ - prevMaxAllocation)))
10131013 then throw("_validateAssetAllocation: still up")
10141014 else true
10151015 else true
10161016 else if ((maxAllocation > balance_))
10171017 then if ((prevBalance_ > prevMaxAllocation))
10181018 then throw("_validateAssetAllocation: new down")
10191019 else if (((maxAllocation - balance_) > (prevMaxAllocation - prevBalance_)))
10201020 then throw("_validateAssetAllocation: still down")
10211021 else true
10221022 else true
10231023 }
10241024
10251025
1026-func _validateAllocation (assetBalances_,assetTotalSupply_,prevAssetBalances_,prevAssetTotalSupply_,assetWeights_,sigmaWeight_,maxAllocAmp_) = {
1027- func foldFunc (acc,elem) = {
1028- let index = acc._1
1029- $Tuple2((index + 1), if (acc._2)
1030- then _validateAssetAllocation(elem, assetTotalSupply_, prevAssetBalances_[index], prevAssetTotalSupply_, assetWeights_[index], sigmaWeight_, maxAllocAmp_)
1031- else false)
1032- }
1033-
1034- let result = {
1035- let $l = assetBalances_
1036- let $s = size($l)
1037- let $acc0 = $Tuple2(0, true)
1038- func $f0_1 ($a,$i) = if (($i >= $s))
1039- then $a
1040- else foldFunc($a, $l[$i])
1041-
1042- func $f0_2 ($a,$i) = if (($i >= $s))
1043- then $a
1044- else throw("List size exceeds 10")
1045-
1046- $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)
1047- }
1048- result._2
1049- }
1026+func _validateAllocation (assetBalances_,assetTotalSupply_,prevAssetBalances_,prevAssetTotalSupply_,assetWeights_,sigmaWeight_,maxAllocAmp_) = true
10501027
10511028
10521029 func _checkpoint (user_) = {
10531030 let userLp = _loadUserLp(user_)
10541031 let userProfits = _loadUserProfits(user_)
10551032 let sigmaFeePerLp = _loadSigmaFeePerLp()
10561033 let userSigmaFeePerLp = _loadUserSigmaFeePerLp(user_)
10571034 func foldFunc (acc,elem) = {
10581035 let index = acc._1
10591036 let profitUpdated = (userProfits[index] + toInt(fraction(toBigInt(userLp), (sigmaFeePerLp[index] - userSigmaFeePerLp[index]), PERCENT_FACTOR)))
10601037 $Tuple2((index + 1), (acc._2 :+ profitUpdated))
10611038 }
10621039
1063- let $t02552025593 = {
1040+ let $t02555825631 = {
10641041 let $l = ZERO_INT_LIST_11
10651042 let $s = size($l)
10661043 let $acc0 = $Tuple2(0, nil)
10671044 func $f0_1 ($a,$i) = if (($i >= $s))
10681045 then $a
10691046 else foldFunc($a, $l[$i])
10701047
10711048 func $f0_2 ($a,$i) = if (($i >= $s))
10721049 then $a
10731050 else throw("List size exceeds 11")
10741051
10751052 $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)
10761053 }
1077- let idx = $t02552025593._1
1078- let profitsUpdated = $t02552025593._2
1054+ let idx = $t02555825631._1
1055+ let profitsUpdated = $t02555825631._2
10791056 $Tuple2((_saveUserProfits(user_, profitsUpdated) ++ _saveUserSigmaFeePerLp(user_, sigmaFeePerLp)), profitsUpdated)
10801057 }
10811058
10821059
10831060 func _updateSigmaFeePerLp (sigmaFeePerLp_,totalLp_,index_,lpFee_) = {
10841061 func foldFunc (acc,elem) = {
10851062 let index = acc._1
10861063 let sigmaFeePerLpUpdated = if ((index_ == index))
10871064 then (sigmaFeePerLp_[index] + fraction(toBigInt(lpFee_), PERCENT_FACTOR, toBigInt(totalLp_)))
10881065 else sigmaFeePerLp_[index]
10891066 $Tuple2((index + 1), (acc._2 :+ sigmaFeePerLpUpdated))
10901067 }
10911068
1092- let $t02624326322 = {
1069+ let $t02628126360 = {
10931070 let $l = ZERO_INT_LIST_11
10941071 let $s = size($l)
10951072 let $acc0 = $Tuple2(0, nil)
10961073 func $f0_1 ($a,$i) = if (($i >= $s))
10971074 then $a
10981075 else foldFunc($a, $l[$i])
10991076
11001077 func $f0_2 ($a,$i) = if (($i >= $s))
11011078 then $a
11021079 else throw("List size exceeds 11")
11031080
11041081 $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)
11051082 }
1106- let idx = $t02624326322._1
1107- let sigmaFeePerLpUpdated = $t02624326322._2
1083+ let idx = $t02628126360._1
1084+ let sigmaFeePerLpUpdated = $t02628126360._2
11081085 sigmaFeePerLpUpdated
11091086 }
11101087
11111088
11121089 func _calculateLpAndProtocolFees (assetIndex_,amount_,lpFeeRate_,protocolFeeRate_) = {
11131090 let sigmaFeePerLp = _loadSigmaFeePerLp()
11141091 let totalLp = _loadTotalLp()
1115- let $t02654326818 = if ((totalLp == 0))
1092+ let $t02658126856 = if ((totalLp == 0))
11161093 then $Tuple2(0, fraction(amount_, protocolFeeRate_, MAX_FEE))
11171094 else $Tuple2(fraction(amount_, lpFeeRate_, MAX_FEE), fraction(amount_, protocolFeeRate_, MAX_FEE))
1118- let lpFee = $t02654326818._1
1119- let protocolFee = $t02654326818._2
1095+ let lpFee = $t02658126856._1
1096+ let protocolFee = $t02658126856._2
11201097 let sigmaFeePerLpUpdated = if ((lpFee == 0))
11211098 then sigmaFeePerLp
11221099 else _updateSigmaFeePerLp(sigmaFeePerLp, totalLp, assetIndex_, lpFee)
11231100 $Tuple3(lpFee, protocolFee, sigmaFeePerLpUpdated)
11241101 }
11251102
11261103
11271104 func _depositAll (amount_) = {
11281105 let storage = _loadStorage()
11291106 let lpTotalSupply = storage._3
11301107 let weightAmplifier = storage._7
11311108 let slippageRate = storage._8
11321109 let feeMaxRate = storage._9
11331110 let assets = _loadAssets()
1134- let $t02732727380 = _loadAssetWeights()
1135- let assetWeights = $t02732727380._1
1136- let sigmaWeight = $t02732727380._2
1137- let $t02738527453 = _loadAssetBalances()
1138- let prevAssetBalances = $t02738527453._1
1139- let prevAssetTotalSupply = $t02738527453._2
1140- let $t02745928689 = if ((prevAssetTotalSupply == 0))
1111+ let $t02736527418 = _loadAssetWeights()
1112+ let assetWeights = $t02736527418._1
1113+ let sigmaWeight = $t02736527418._2
1114+ let $t02742327491 = _loadAssetBalances()
1115+ let prevAssetBalances = $t02742327491._1
1116+ let prevAssetTotalSupply = $t02742327491._2
1117+ let $t02749728727 = if ((prevAssetTotalSupply == 0))
11411118 then {
11421119 func foldFunc (acc,elem) = {
11431120 let index = acc._1
11441121 let requiredAmountNormalized = fraction(assetWeights[index], amount_, sigmaWeight)
11451122 $Tuple2((index + 1), (acc._2 :+ requiredAmountNormalized))
11461123 }
11471124
1148- let $t02790127975 = {
1125+ let $t02793928013 = {
11491126 let $l = assets
11501127 let $s = size($l)
11511128 let $acc0 = $Tuple2(0, nil)
11521129 func $f0_1 ($a,$i) = if (($i >= $s))
11531130 then $a
11541131 else foldFunc($a, $l[$i])
11551132
11561133 func $f0_2 ($a,$i) = if (($i >= $s))
11571134 then $a
11581135 else throw("List size exceeds 10")
11591136
11601137 $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)
11611138 }
1162- let idx = $t02790127975._1
1163- let requiredAmountsNormalized = $t02790127975._2
1139+ let idx = $t02793928013._1
1140+ let requiredAmountsNormalized = $t02793928013._2
11641141 $Tuple2(amount_, requiredAmountsNormalized)
11651142 }
11661143 else {
11671144 let ratio = fraction(toBigInt(amount_), PERCENT_FACTOR, toBigInt(prevAssetTotalSupply))
11681145 func foldFunc1 (acc,elem) = {
11691146 let index = acc._1
11701147 let requiredAmountNormalized = toInt(fraction(ratio, toBigInt(prevAssetBalances[index]), PERCENT_FACTOR))
11711148 $Tuple2((index + 1), (acc._2 :+ requiredAmountNormalized))
11721149 }
11731150
1174- let $t02851828593 = {
1151+ let $t02855628631 = {
11751152 let $l = assets
11761153 let $s = size($l)
11771154 let $acc0 = $Tuple2(0, nil)
11781155 func $f0_1 ($a,$i) = if (($i >= $s))
11791156 then $a
11801157 else foldFunc1($a, $l[$i])
11811158
11821159 func $f0_2 ($a,$i) = if (($i >= $s))
11831160 then $a
11841161 else throw("List size exceeds 10")
11851162
11861163 $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)
11871164 }
1188- let idx = $t02851828593._1
1189- let requiredAmountsNormalized = $t02851828593._2
1165+ let idx = $t02855628631._1
1166+ let requiredAmountsNormalized = $t02855628631._2
11901167 $Tuple2(fraction(amount_, lpTotalSupply, prevAssetTotalSupply), requiredAmountsNormalized)
11911168 }
1192- let lpTokensToMint = $t02745928689._1
1193- let requiredAmountsNormalized = $t02745928689._2
1194- let $t02869528808 = _incrementBalancesByAmounts(prevAssetBalances, requiredAmountsNormalized)
1195- let assetBalances = $t02869528808._1
1196- let assetTotalSupply = $t02869528808._2
1169+ let lpTokensToMint = $t02749728727._1
1170+ let requiredAmountsNormalized = $t02749728727._2
1171+ let $t02873328846 = _incrementBalancesByAmounts(prevAssetBalances, requiredAmountsNormalized)
1172+ let assetBalances = $t02873328846._1
1173+ let assetTotalSupply = $t02873328846._2
11971174 let err2 = _validateLiquidityInvariant(prevAssetBalances, prevAssetTotalSupply, assetBalances, assetTotalSupply, lpTotalSupply, (lpTotalSupply + lpTokensToMint), assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
11981175 if ((err2 == err2))
11991176 then $Tuple3(lpTokensToMint, requiredAmountsNormalized, assetBalances)
12001177 else throw("Strict value is not equal to itself.")
12011178 }
12021179
12031180
12041181 func _deposit (assetId_,amount_) = {
12051182 let storage = _loadStorage()
12061183 let lpTotalSupply = storage._3
12071184 let lpFeeRate = storage._4
12081185 let protocolFeeRate = storage._5
12091186 let maxAllocAmplifier = storage._6
12101187 let weightAmplifier = storage._7
12111188 let slippageRate = storage._8
12121189 let feeMaxRate = storage._9
12131190 let assets = _loadAssets()
1214- let $t02957129624 = _loadAssetWeights()
1215- let assetWeights = $t02957129624._1
1216- let sigmaWeight = $t02957129624._2
1217- let $t02962929743 = _loadAssetBalances()
1218- let prevAssetBalances = $t02962929743._1
1219- let prevAssetTotalSupply = $t02962929743._2
1191+ let $t02960929662 = _loadAssetWeights()
1192+ let assetWeights = $t02960929662._1
1193+ let sigmaWeight = $t02960929662._2
1194+ let $t02966729781 = _loadAssetBalances()
1195+ let prevAssetBalances = $t02966729781._1
1196+ let prevAssetTotalSupply = $t02966729781._2
12201197 let assetBalances = _incrementBalanceByIndex(prevAssetBalances, value(indexOf(assets, assetId_)), amount_)
12211198 let assetTotalSupply = (prevAssetTotalSupply + amount_)
12221199 let err2 = _validateAllocation(assetBalances, assetTotalSupply, prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, maxAllocAmplifier)
12231200 if ((err2 == err2))
12241201 then {
12251202 let prevFee = _calculateFee(prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
12261203 let fee = _calculateFee(assetBalances, assetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
12271204 let lpTokensToMint = if ((lpTotalSupply == 0))
12281205 then throw("_deposit: empty pool")
12291206 else {
12301207 let assetDiff = (assetTotalSupply - prevAssetTotalSupply)
12311208 let feeDiff = (fee - prevFee)
12321209 let utilityChangeFactor = fraction((assetDiff - feeDiff), RATE_FACTOR, (prevAssetTotalSupply - prevFee))
12331210 let lpTokensToMintInner = fraction(lpTotalSupply, utilityChangeFactor, RATE_FACTOR)
12341211 let err3 = _validateLiquidityInvariant(prevAssetBalances, prevAssetTotalSupply, assetBalances, assetTotalSupply, lpTotalSupply, (lpTotalSupply + lpTokensToMintInner), assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
12351212 if ((err3 == err3))
12361213 then lpTokensToMintInner
12371214 else throw("Strict value is not equal to itself.")
12381215 }
1239- let $t03140531536 = _calculateLpAndProtocolFees(0, lpTokensToMint, (lpFeeRate / 2), (protocolFeeRate / 2))
1240- let lpFee = $t03140531536._1
1241- let protocolFee = $t03140531536._2
1242- let sigmaFeePerLpUpdated = $t03140531536._3
1216+ let $t03144331574 = _calculateLpAndProtocolFees(0, lpTokensToMint, (lpFeeRate / 2), (protocolFeeRate / 2))
1217+ let lpFee = $t03144331574._1
1218+ let protocolFee = $t03144331574._2
1219+ let sigmaFeePerLpUpdated = $t03144331574._3
12431220 $Tuple5(lpTokensToMint, assetBalances, lpFee, protocolFee, sigmaFeePerLpUpdated)
12441221 }
12451222 else throw("Strict value is not equal to itself.")
12461223 }
12471224
12481225
12491226 func _withdrawAll (amount_) = {
12501227 let storage = _loadStorage()
12511228 let lpTotalSupply = storage._3
12521229 let maxAllocAmplifier = storage._6
12531230 let weightAmplifier = storage._7
12541231 let slippageRate = storage._8
12551232 let feeMaxRate = storage._9
1256- let $t03187031938 = _loadAssetBalances()
1257- let prevAssetBalances = $t03187031938._1
1258- let prevAssetTotalSupply = $t03187031938._2
1259- let $t03194331996 = _loadAssetWeights()
1260- let assetWeights = $t03194331996._1
1261- let sigmaWeight = $t03194331996._2
1233+ let $t03190831976 = _loadAssetBalances()
1234+ let prevAssetBalances = $t03190831976._1
1235+ let prevAssetTotalSupply = $t03190831976._2
1236+ let $t03198132034 = _loadAssetWeights()
1237+ let assetWeights = $t03198132034._1
1238+ let sigmaWeight = $t03198132034._2
12621239 let lpTokensToBurn = amount_
12631240 let err = _validateInt(lpTokensToBurn, 0, MAX_INT, "_withdrawAll: lpTokensToBurn less than 0")
12641241 if ((err == err))
12651242 then {
1266- let $t03213832271 = _decrementBalancesByLpAmount(prevAssetBalances, lpTokensToBurn, lpTotalSupply)
1267- let assetBalances = $t03213832271._1
1268- let assetTotalSupply = $t03213832271._2
1269- let balancesToPay = $t03213832271._3
1243+ let $t03217632309 = _decrementBalancesByLpAmount(prevAssetBalances, lpTokensToBurn, lpTotalSupply)
1244+ let assetBalances = $t03217632309._1
1245+ let assetTotalSupply = $t03217632309._2
1246+ let balancesToPay = $t03217632309._3
12701247 let err2 = _validateLiquidityInvariant(prevAssetBalances, prevAssetTotalSupply, assetBalances, assetTotalSupply, lpTotalSupply, (lpTotalSupply - lpTokensToBurn), assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
12711248 if ((err2 == err2))
12721249 then $Tuple3(lpTokensToBurn, balancesToPay, assetBalances)
12731250 else throw("Strict value is not equal to itself.")
12741251 }
12751252 else throw("Strict value is not equal to itself.")
12761253 }
12771254
12781255
12791256 func _withdraw (assetId_,lpAmount_) = {
12801257 let storage = _loadStorage()
12811258 let lpTotalSupply = storage._3
12821259 let lpFeeRate = storage._4
12831260 let protocolFeeRate = storage._5
12841261 let maxAllocAmplifier = storage._6
12851262 let weightAmplifier = storage._7
12861263 let slippageRate = storage._8
12871264 let feeMaxRate = storage._9
12881265 let precision = _loadPrecision()
12891266 let assets = _loadAssets()
1290- let $t03306333131 = _loadAssetBalances()
1291- let prevAssetBalances = $t03306333131._1
1292- let prevAssetTotalSupply = $t03306333131._2
1293- let $t03313633189 = _loadAssetWeights()
1294- let assetWeights = $t03313633189._1
1295- let sigmaWeight = $t03313633189._2
1267+ let $t03310133169 = _loadAssetBalances()
1268+ let prevAssetBalances = $t03310133169._1
1269+ let prevAssetTotalSupply = $t03310133169._2
1270+ let $t03317433227 = _loadAssetWeights()
1271+ let assetWeights = $t03317433227._1
1272+ let sigmaWeight = $t03317433227._2
12961273 let targetAssetIndex = value(indexOf(assets, assetId_))
12971274 let prevFee = _calculateFee(prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
12981275 let prevUtilValue = (prevAssetTotalSupply - prevFee)
12991276 let k = fraction(toBigInt((lpTotalSupply - lpAmount_)), PERCENT_FACTOR, toBigInt(lpTotalSupply))
13001277 let prevUtilValueWithK = toInt(fraction(toBigInt(prevUtilValue), k, PERCENT_FACTOR))
13011278 let prevUtilValueDivLp = fraction(toBigInt(prevUtilValue), PERCENT_FACTOR, toBigInt(lpTotalSupply), CEILING)
13021279 func foldFunc (acc,elem) = if (acc._1)
13031280 then acc
13041281 else {
13051282 let startInner = acc._2
13061283 let stopInner = acc._3
13071284 let currentAmount = ((stopInner + startInner) / 2)
13081285 let tempAssetBalances = _decrementBalanceByIndex(prevAssetBalances, targetAssetIndex, currentAmount)
13091286 let tempAssetTotalSupply = (prevAssetTotalSupply - currentAmount)
13101287 let utilValue = (tempAssetTotalSupply - _calculateFee(tempAssetBalances, tempAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate))
13111288 if (if (((utilValue - prevUtilValueWithK) > (-1 * precision)))
13121289 then (precision > (utilValue - prevUtilValueWithK))
13131290 else false)
13141291 then $Tuple5(true, startInner, stopInner, currentAmount, (utilValue - prevUtilValueWithK))
13151292 else if ((0 > (utilValue - prevUtilValueWithK)))
13161293 then $Tuple5(false, startInner, currentAmount, currentAmount, (utilValue - prevUtilValueWithK))
13171294 else $Tuple5(false, currentAmount, stopInner, currentAmount, (utilValue - prevUtilValueWithK))
13181295 }
13191296
13201297 let targetAmount = {
13211298 let stop = toInt(fraction(toBigInt((lpAmount_ + prevFee)), prevUtilValueDivLp, PERCENT_FACTOR, CEILING))
1322- let $t03505535167 = {
1299+ let $t03509335205 = {
13231300 let $l = LIST_64
13241301 let $s = size($l)
13251302 let $acc0 = $Tuple5(false, 0, stop, 0, 0)
13261303 func $f0_1 ($a,$i) = if (($i >= $s))
13271304 then $a
13281305 else foldFunc($a, $l[$i])
13291306
13301307 func $f0_2 ($a,$i) = if (($i >= $s))
13311308 then $a
13321309 else throw("List size exceeds 64")
13331310
13341311 $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)
13351312 }
1336- let success = $t03505535167._1
1337- let startOut = $t03505535167._2
1338- let stopOut = $t03505535167._3
1339- let targetAmountOut = $t03505535167._4
1340- let diffOut = $t03505535167._5
1313+ let success = $t03509335205._1
1314+ let startOut = $t03509335205._2
1315+ let stopOut = $t03509335205._3
1316+ let targetAmountOut = $t03509335205._4
1317+ let diffOut = $t03509335205._5
13411318 if (!(success))
13421319 then throw(((("_withdraw: can't calculate targetAmount=" + toString(targetAmountOut)) + ",diff=") + toString(diffOut)))
13431320 else targetAmountOut
13441321 }
13451322 let finalAssetBalances = _decrementBalanceByIndex(prevAssetBalances, targetAssetIndex, targetAmount)
13461323 let finalAssetTotalSupply = (prevAssetTotalSupply - targetAmount)
13471324 let err1 = if (_validateAllocation(finalAssetBalances, finalAssetTotalSupply, prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, maxAllocAmplifier))
13481325 then _validateLiquidityInvariant(prevAssetBalances, prevAssetTotalSupply, finalAssetBalances, finalAssetTotalSupply, lpTotalSupply, (lpTotalSupply - lpAmount_), assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
13491326 else false
13501327 if ((err1 == err1))
13511328 then {
1352- let $t03615936307 = _calculateLpAndProtocolFees((targetAssetIndex + 1), targetAmount, (lpFeeRate / 2), (protocolFeeRate / 2))
1353- let lpFee = $t03615936307._1
1354- let protocolFee = $t03615936307._2
1355- let sigmaFeePerLpUpdated = $t03615936307._3
1329+ let $t03619736345 = _calculateLpAndProtocolFees((targetAssetIndex + 1), targetAmount, (lpFeeRate / 2), (protocolFeeRate / 2))
1330+ let lpFee = $t03619736345._1
1331+ let protocolFee = $t03619736345._2
1332+ let sigmaFeePerLpUpdated = $t03619736345._3
13561333 $Tuple5(targetAmount, finalAssetBalances, lpFee, protocolFee, sigmaFeePerLpUpdated)
13571334 }
13581335 else throw("Strict value is not equal to itself.")
13591336 }
13601337
13611338
13621339 func _swap (sourceAssetIndex_,targetAssetIndex_,sourceAmount_) = {
13631340 let storage = _loadStorage()
13641341 let lpAssetId = storage._1
13651342 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
13661343 let lpTotalSupply = storage._3
13671344 let lpFeeRate = storage._4
13681345 let protocolFeeRate = storage._5
13691346 let maxAllocAmplifier = storage._6
13701347 let weightAmplifier = storage._7
13711348 let slippageRate = storage._8
13721349 let feeMaxRate = storage._9
13731350 let precision = _loadPrecision()
1374- let $t03688936957 = _loadAssetBalances()
1375- let prevAssetBalances = $t03688936957._1
1376- let prevAssetTotalSupply = $t03688936957._2
1377- let $t03696237015 = _loadAssetWeights()
1378- let assetWeights = $t03696237015._1
1379- let sigmaWeight = $t03696237015._2
1351+ let $t03692736995 = _loadAssetBalances()
1352+ let prevAssetBalances = $t03692736995._1
1353+ let prevAssetTotalSupply = $t03692736995._2
1354+ let $t03700037053 = _loadAssetWeights()
1355+ let assetWeights = $t03700037053._1
1356+ let sigmaWeight = $t03700037053._2
13801357 let assetBalances = _incrementBalanceByIndex(prevAssetBalances, sourceAssetIndex_, sourceAmount_)
13811358 let assetTotalSupply = (prevAssetTotalSupply + sourceAmount_)
13821359 let prevFee = _calculateFee(prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
13831360 let prevUtilValue = (prevAssetTotalSupply - prevFee)
13841361 func foldFunc (acc,elem) = if (acc._1)
13851362 then acc
13861363 else {
13871364 let startInner = acc._2
13881365 let stopInner = acc._3
13891366 let currentAmount = ((stopInner + startInner) / 2)
13901367 let tempAssetBalances = _decrementBalanceByIndex(assetBalances, targetAssetIndex_, currentAmount)
13911368 let tempAssetTotalSupply = (assetTotalSupply - currentAmount)
13921369 let utilValue = (tempAssetTotalSupply - _calculateFee(tempAssetBalances, tempAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate))
13931370 if (if (((utilValue - prevUtilValue) > (-1 * precision)))
13941371 then (precision > (utilValue - prevUtilValue))
13951372 else false)
13961373 then $Tuple5(true, startInner, stopInner, currentAmount, (utilValue - prevUtilValue))
13971374 else if ((0 > (utilValue - prevUtilValue)))
13981375 then $Tuple5(false, startInner, currentAmount, currentAmount, (utilValue - prevUtilValue))
13991376 else $Tuple5(false, currentAmount, stopInner, currentAmount, (utilValue - prevUtilValue))
14001377 }
14011378
14021379 let targetAmount = {
14031380 let targetAmount = sourceAmount_
14041381 let tempAssetBalances = _decrementBalanceByIndex(assetBalances, targetAssetIndex_, targetAmount)
14051382 let tempAssetTotalSupply = (assetTotalSupply - targetAmount)
14061383 let fee = _calculateFee(tempAssetBalances, tempAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
14071384 let feeDiff = (fee - prevFee)
14081385 if ((feeDiff == 0))
14091386 then targetAmount
14101387 else {
1411- let $t03898839119 = {
1388+ let $t03902639157 = {
14121389 let $l = LIST_64
14131390 let $s = size($l)
14141391 let $acc0 = $Tuple5(false, 0, (sourceAmount_ + prevFee), 0, 0)
14151392 func $f0_1 ($a,$i) = if (($i >= $s))
14161393 then $a
14171394 else foldFunc($a, $l[$i])
14181395
14191396 func $f0_2 ($a,$i) = if (($i >= $s))
14201397 then $a
14211398 else throw("List size exceeds 64")
14221399
14231400 $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)
14241401 }
1425- let success = $t03898839119._1
1426- let startOut = $t03898839119._2
1427- let stopOut = $t03898839119._3
1428- let targetAmountOut = $t03898839119._4
1429- let diffOut = $t03898839119._5
1402+ let success = $t03902639157._1
1403+ let startOut = $t03902639157._2
1404+ let stopOut = $t03902639157._3
1405+ let targetAmountOut = $t03902639157._4
1406+ let diffOut = $t03902639157._5
14301407 if (!(success))
14311408 then throw(((("_swap: can't calculate targetAmount=" + toString(targetAmountOut)) + ",diff=") + toString(diffOut)))
14321409 else targetAmountOut
14331410 }
14341411 }
14351412 let finalAssetBalances = _decrementBalanceByIndex(assetBalances, targetAssetIndex_, targetAmount)
14361413 let finalAssetTotalSupply = (assetTotalSupply - targetAmount)
14371414 let err1 = if (_validateAllocation(finalAssetBalances, finalAssetTotalSupply, prevAssetBalances, prevAssetTotalSupply, assetWeights, sigmaWeight, maxAllocAmplifier))
14381415 then _validateSwapInvariant(prevAssetBalances, prevAssetTotalSupply, finalAssetBalances, finalAssetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
14391416 else false
14401417 if ((err1 == err1))
14411418 then {
1442- let $t03996640107 = _calculateLpAndProtocolFees((targetAssetIndex_ + 1), targetAmount, lpFeeRate, protocolFeeRate)
1443- let lpFee = $t03996640107._1
1444- let protocolFee = $t03996640107._2
1445- let sigmaFeePerLpUpdated = $t03996640107._3
1419+ let $t04000440145 = _calculateLpAndProtocolFees((targetAssetIndex_ + 1), targetAmount, lpFeeRate, protocolFeeRate)
1420+ let lpFee = $t04000440145._1
1421+ let protocolFee = $t04000440145._2
1422+ let sigmaFeePerLpUpdated = $t04000440145._3
14461423 $Tuple5(targetAmount, finalAssetBalances, lpFee, protocolFee, sigmaFeePerLpUpdated)
14471424 }
14481425 else throw("Strict value is not equal to itself.")
14491426 }
14501427
14511428
14521429 @Callable(i)
14531430 func init (assets_,assetWeights_,lpFeeRate_,protocolFeeRate_,lpTokenName_,lpTokenDescr_,lpTokenDecimals_,maxAllocationAmplifier_,weightAmplifier_,slippageRate_,feeMaxRate_,protocolFeeContract_,precision_,pauser_) = {
14541431 let err = if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (_onlyThisContract(i.caller))
14551432 then _whenNotInitialized()
14561433 else false)
14571434 then _whenMultisigSet()
14581435 else false)
14591436 then _validateAssets(assets_, "init: invalid assets")
14601437 else false)
14611438 then _validateIntList(assetWeights_, 1, MAX_WEIGHT, "init: invalid assetWeights")
14621439 else false)
14631440 then _validateIntEquals(size(assets_), size(assetWeights_), "init: invalid assetWeights size")
14641441 else false)
14651442 then _validateInt(lpFeeRate_, 0, MAX_FEE, "init: invalid lp fee")
14661443 else false)
14671444 then _validateInt(protocolFeeRate_, 0, MAX_FEE, "init: invalid protocol fee")
14681445 else false)
14691446 then _validateTokenName(lpTokenName_, "init: invalid name")
14701447 else false)
14711448 then _validateTokenDescr(lpTokenDescr_, "init: invalid descr")
14721449 else false)
14731450 then _validateDecimals(lpTokenDecimals_, "init: invalid decimals")
14741451 else false)
14751452 then _validateInt(maxAllocationAmplifier_, 0, MAX_AMPLIFIER, "init: invalid maxAllocationAmplifier")
14761453 else false)
14771454 then _validateInt(weightAmplifier_, 0, maxAllocationAmplifier_, "init: invalid weightAmplifier")
14781455 else false)
14791456 then _validateInt(slippageRate_, 0, MAX_INT, "init: invalid slippageRate")
14801457 else false)
14811458 then _validateInt(feeMaxRate_, 0, MAX_INT, "init: invalid feeMaxRate")
14821459 else false)
14831460 then _validateAddress(protocolFeeContract_, "init: invalid protocolFeeContract")
14841461 else false)
14851462 then _validateInt(precision_, 1, MAX_INT, "init: invalid precision")
14861463 else false)
14871464 then _validateAddress(pauser_, "init: invalid pauser")
14881465 else false
14891466 if ((err == err))
14901467 then {
1491- let $t04197042039 = _prepareAssetWeights(assetWeights_)
1492- let assetWeights = $t04197042039._1
1493- let sigmaWeight = $t04197042039._2
1468+ let $t04200842077 = _prepareAssetWeights(assetWeights_)
1469+ let assetWeights = $t04200842077._1
1470+ let sigmaWeight = $t04200842077._2
14941471 let assetBalances = _prepareAssetBalances(assets_)
14951472 let issue = Issue(lpTokenName_, lpTokenDescr_, 0, lpTokenDecimals_, true)
14961473 let lpAssetId = calculateAssetId(issue)
14971474 let storageUpdated = $Tuple10(lpAssetId, true, 0, lpFeeRate_, protocolFeeRate_, maxAllocationAmplifier_, weightAmplifier_, slippageRate_, feeMaxRate_, addressFromStringValue(protocolFeeContract_))
14981475 $Tuple2(((((((([issue] ++ _saveStorage(storageUpdated)) ++ _saveAssets(assets_)) ++ _saveAssetBalances(assetBalances)) ++ _saveAssetWeights(assetWeights)) ++ _savePrecision(precision_)) ++ _saveSigmaFeePerLp(_loadSigmaFeePerLp())) ++ _savePauser(addressFromStringValue(pauser_))), unit)
14991476 }
15001477 else throw("Strict value is not equal to itself.")
15011478 }
15021479
15031480
15041481
15051482 @Callable(i)
15061483 func depositAll (amount_) = {
15071484 let err = if (if (_whenInitialized())
15081485 then _whenNotPaused()
15091486 else false)
15101487 then _validateInt(amount_, 0, MAX_INT, "depositAll: invalid amount")
15111488 else false
15121489 if ((err == err))
15131490 then {
15141491 let storage = _loadStorage()
15151492 let lpAssetId = storage._1
15161493 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
15171494 let assets = _loadAssets()
1518- let $t04378943874 = _depositAll(amount_)
1519- let lpTokensToMint = $t04378943874._1
1520- let requiredAmountsNormalized = $t04378943874._2
1521- let assetBalances = $t04378943874._3
1495+ let $t04382743912 = _depositAll(amount_)
1496+ let lpTokensToMint = $t04382743912._1
1497+ let requiredAmountsNormalized = $t04382743912._2
1498+ let assetBalances = $t04382743912._3
15221499 func foldFunc (acc,elem) = {
15231500 let index = acc._1
15241501 let paymentAssetStr = _assetToStr(i.payments[index].assetId)
15251502 let paymentAssetDecimals = _getDecimals(paymentAssetStr)
15261503 let requiredAmountNormalized = requiredAmountsNormalized[index]
15271504 let requiredAmount = _normalizeDecimals(requiredAmountNormalized, lpDecimals, paymentAssetDecimals, CEILING)
15281505 let err1 = if ((paymentAssetStr != elem))
15291506 then throw(("depositAll: invalid payment: index=" + toString(index)))
15301507 else if ((0 >= requiredAmount))
15311508 then throw("depositAll: too little amount required")
15321509 else unit
15331510 if ((err1 == err1))
15341511 then {
15351512 let change = if ((i.payments[index].amount > requiredAmount))
15361513 then [ScriptTransfer(i.caller, (i.payments[index].amount - requiredAmount), i.payments[index].assetId)]
15371514 else if ((requiredAmount > i.payments[index].amount))
15381515 then throw(((("depositAll: insufficient payment, index=" + toString(index)) + ", required=") + toString(requiredAmount)))
15391516 else nil
15401517 $Tuple2((index + 1), (acc._2 ++ change))
15411518 }
15421519 else throw("Strict value is not equal to itself.")
15431520 }
15441521
1545- let $t04501745079 = {
1522+ let $t04505545117 = {
15461523 let $l = assets
15471524 let $s = size($l)
15481525 let $acc0 = $Tuple2(0, nil)
15491526 func $f0_1 ($a,$i) = if (($i >= $s))
15501527 then $a
15511528 else foldFunc($a, $l[$i])
15521529
15531530 func $f0_2 ($a,$i) = if (($i >= $s))
15541531 then $a
15551532 else throw("List size exceeds 10")
15561533
15571534 $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)
15581535 }
1559- let idx = $t04501745079._1
1560- let changeActions = $t04501745079._2
1536+ let idx = $t04505545117._1
1537+ let changeActions = $t04505545117._2
15611538 let storageUpdated = $Tuple10(storage._1, storage._2, (storage._3 + lpTokensToMint), storage._4, storage._5, storage._6, storage._7, storage._8, storage._9, storage._10)
15621539 $Tuple2(((([Reissue(lpAssetId, lpTokensToMint, true), ScriptTransfer(i.caller, lpTokensToMint, lpAssetId)] ++ _saveStorage(storageUpdated)) ++ _saveAssetBalances(assetBalances)) ++ changeActions), unit)
15631540 }
15641541 else throw("Strict value is not equal to itself.")
15651542 }
15661543
15671544
15681545
15691546 @Callable(i)
15701547 func deposit (minLpAmount_) = {
15711548 let err = _validateInt(minLpAmount_, 0, MAX_INT, "deposit: invalid min lp amount")
15721549 if ((err == err))
15731550 then {
15741551 let storage = _loadStorage()
15751552 let lpAssetId = storage._1
15761553 let lpAssetIdStr = _assetToStr(lpAssetId)
15771554 let lpDecimals = _getDecimals(lpAssetIdStr)
15781555 let err1 = if (if (if (if (if (_whenInitialized())
15791556 then _whenNotPaused()
15801557 else false)
15811558 then _checkWatchdog()
15821559 else false)
15831560 then _validateIntEquals(size(i.payments), 1, "deposit: invalid payments size")
15841561 else false)
15851562 then _validateListContains(_loadAssets(), _assetToStr(i.payments[0].assetId), "deposit: invalid payment asset")
15861563 else false)
15871564 then _validateInt(i.payments[0].amount, 1, MAX_INT, "deposit: invalid payment amount")
15881565 else false
15891566 if ((err1 == err1))
15901567 then {
15911568 let assetStr = _assetToStr(i.payments[0].assetId)
15921569 let assetDecimals = _getDecimals(assetStr)
15931570 let amountNormalized = _normalizeDecimals(i.payments[0].amount, assetDecimals, lpDecimals, DOWN)
1594- let $t04651946635 = _deposit(assetStr, amountNormalized)
1595- let lpTokensToMint = $t04651946635._1
1596- let assetBalances = $t04651946635._2
1597- let lpFee = $t04651946635._3
1598- let protocolFee = $t04651946635._4
1599- let sigmaFeePerLpUpdated = $t04651946635._5
1571+ let $t04655746673 = _deposit(assetStr, amountNormalized)
1572+ let lpTokensToMint = $t04655746673._1
1573+ let assetBalances = $t04655746673._2
1574+ let lpFee = $t04655746673._3
1575+ let protocolFee = $t04655746673._4
1576+ let sigmaFeePerLpUpdated = $t04655746673._5
16001577 let lpTokensToSend = ((lpTokensToMint - lpFee) - protocolFee)
16011578 let err2 = _validateInt(lpTokensToSend, minLpAmount_, MAX_INT, "deposit: less than min")
16021579 if ((err2 == err2))
16031580 then {
16041581 let storageUpdated = $Tuple10(storage._1, storage._2, (storage._3 + lpTokensToMint), storage._4, storage._5, storage._6, storage._7, storage._8, storage._9, storage._10)
16051582 $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)
16061583 }
16071584 else throw("Strict value is not equal to itself.")
16081585 }
16091586 else throw("Strict value is not equal to itself.")
16101587 }
16111588 else throw("Strict value is not equal to itself.")
16121589 }
16131590
16141591
16151592
16161593 @Callable(i)
16171594 func withdrawAll () = {
16181595 let storage = _loadStorage()
16191596 let lpAssetId = storage._1
16201597 let lpAssetIdStr = toBase58String(lpAssetId)
16211598 let lpDecimals = _getDecimals(lpAssetIdStr)
16221599 let assets = _loadAssets()
16231600 let err = if (if (if (_whenInitialized())
16241601 then _validateIntEquals(size(i.payments), 1, "withdrawAll: invalid payments size")
16251602 else false)
16261603 then _validateStringEqual(lpAssetIdStr, _assetToStr(i.payments[0].assetId), "withdrawAll: invalid payment asset")
16271604 else false)
16281605 then _validateInt(i.payments[0].amount, 1, MAX_INT, "withdrawAll: invalid payment amount")
16291606 else false
16301607 if ((err == err))
16311608 then {
1632- let $t04809648183 = _withdrawAll(i.payments[0].amount)
1633- let lpTokensToBurn = $t04809648183._1
1634- let balancesToPay = $t04809648183._2
1635- let assetBalances = $t04809648183._3
1609+ let $t04813448221 = _withdrawAll(i.payments[0].amount)
1610+ let lpTokensToBurn = $t04813448221._1
1611+ let balancesToPay = $t04813448221._2
1612+ let assetBalances = $t04813448221._3
16361613 let paymentActions = _getPaymentsFromBalances(assets, balancesToPay, i.caller, lpDecimals)
16371614 let storageUpdated = $Tuple10(storage._1, storage._2, (storage._3 - lpTokensToBurn), storage._4, storage._5, storage._6, storage._7, storage._8, storage._9, storage._10)
16381615 $Tuple2(((([Burn(lpAssetId, lpTokensToBurn)] ++ paymentActions) ++ _saveStorage(storageUpdated)) ++ _saveAssetBalances(assetBalances)), unit)
16391616 }
16401617 else throw("Strict value is not equal to itself.")
16411618 }
16421619
16431620
16441621
16451622 @Callable(i)
16461623 func withdraw (assetId_,minAmount_) = {
16471624 let storage = _loadStorage()
16481625 let lpAssetId = storage._1
16491626 let lpAssetIdStr = toBase58String(lpAssetId)
16501627 let lpDecimals = _getDecimals(lpAssetIdStr)
16511628 let assets = _loadAssets()
16521629 let err = if (if (if (if (if (if (if (_whenInitialized())
16531630 then _whenNotPaused()
16541631 else false)
16551632 then _checkWatchdog()
16561633 else false)
16571634 then _validateIntEquals(size(i.payments), 1, "withdraw: invalid payments size")
16581635 else false)
16591636 then _validateStringEqual(lpAssetIdStr, _assetToStr(i.payments[0].assetId), "withdraw: invalid payment asset")
16601637 else false)
16611638 then _validateInt(i.payments[0].amount, 1, MAX_INT, "withdraw: invalid payment amount")
16621639 else false)
16631640 then _validateListContains(assets, assetId_, "withdraw: invalid assetId")
16641641 else false)
16651642 then _validateInt(minAmount_, 0, MAX_INT, "withdraw: invalid minAmount")
16661643 else false
16671644 if ((err == err))
16681645 then {
1669- let $t04953749671 = _withdraw(assetId_, i.payments[0].amount)
1670- let targetAmountNormalized = $t04953749671._1
1671- let finalAssetBalances = $t04953749671._2
1672- let lpFee = $t04953749671._3
1673- let protocolFee = $t04953749671._4
1674- let sigmaFeePerLpUpdated = $t04953749671._5
1646+ let $t04957549709 = _withdraw(assetId_, i.payments[0].amount)
1647+ let targetAmountNormalized = $t04957549709._1
1648+ let finalAssetBalances = $t04957549709._2
1649+ let lpFee = $t04957549709._3
1650+ let protocolFee = $t04957549709._4
1651+ let sigmaFeePerLpUpdated = $t04957549709._5
16751652 let finalAmountNormalized = ((targetAmountNormalized - lpFee) - protocolFee)
16761653 let targetDecimals = _getDecimals(assetId_)
16771654 let finalAmount = _normalizeDecimals(finalAmountNormalized, lpDecimals, targetDecimals, DOWN)
16781655 let err1 = _validateInt(finalAmount, minAmount_, MAX_INT, "withdraw: less than min")
16791656 if ((err1 == err1))
16801657 then {
16811658 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)
16821659 $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)
16831660 }
16841661 else throw("Strict value is not equal to itself.")
16851662 }
16861663 else throw("Strict value is not equal to itself.")
16871664 }
16881665
16891666
16901667
16911668 @Callable(i)
16921669 func swap (targetAssetId_,minAmount_) = {
16931670 let storage = _loadStorage()
16941671 let lpAssetId = storage._1
16951672 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
16961673 let assets = _loadAssets()
16971674 let sourceAssetStr = _assetToStr(i.payments[0].assetId)
16981675 let sourceAmountNormalized = _normalizeDecimals(i.payments[0].amount, _getDecimals(sourceAssetStr), lpDecimals, DOWN)
16991676 let sourceAssetIndex = valueOrErrorMessage(indexOf(assets, sourceAssetStr), "swap: invalid source asset")
17001677 if ((sourceAssetIndex == sourceAssetIndex))
17011678 then {
17021679 let targetAssetIndex = valueOrErrorMessage(indexOf(assets, targetAssetId_), "swap: invalid target asset")
17031680 if ((targetAssetIndex == targetAssetIndex))
17041681 then {
17051682 let err = if (if (if (if (if (if (_whenInitialized())
17061683 then _whenNotPaused()
17071684 else false)
17081685 then _checkWatchdog()
17091686 else false)
17101687 then _validateInt(minAmount_, 0, MAX_INT, "swap: invalid min target amount")
17111688 else false)
17121689 then _validateInt(sourceAmountNormalized, 1, MAX_INT, "swap: invalid source amount")
17131690 else false)
17141691 then _validateStringNotEq(sourceAssetStr, targetAssetId_, "swap: same assets")
17151692 else false)
17161693 then _validateIntEquals(size(i.payments), 1, "swap: invalid payments size")
17171694 else false
17181695 if ((err == err))
17191696 then {
1720- let $t05178451942 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
1721- let targetAmountNormalized = $t05178451942._1
1722- let finalAssetBalances = $t05178451942._2
1723- let lpFee = $t05178451942._3
1724- let protocolFee = $t05178451942._4
1725- let sigmaFeePerLpUpdated = $t05178451942._5
1697+ let $t05182251980 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
1698+ let targetAmountNormalized = $t05182251980._1
1699+ let finalAssetBalances = $t05182251980._2
1700+ let lpFee = $t05182251980._3
1701+ let protocolFee = $t05182251980._4
1702+ let sigmaFeePerLpUpdated = $t05182251980._5
17261703 let finalAmountNormalized = ((targetAmountNormalized - lpFee) - protocolFee)
17271704 let targetDecimals = _getDecimals(targetAssetId_)
17281705 let finalAmount = _normalizeDecimals(finalAmountNormalized, lpDecimals, targetDecimals, DOWN)
17291706 let err1 = _validateInt(finalAmount, minAmount_, MAX_INT, "swap: less than min")
17301707 if ((err1 == err1))
17311708 then $Tuple2((((([ScriptTransfer(i.caller, finalAmount, _strToAsset(targetAssetId_))] ++ _saveAssetBalances(finalAssetBalances)) ++ _saveLpFee(targetAssetId_, (lpFee + _loadLpFee(targetAssetId_)))) ++ _saveProtocolFee(targetAssetId_, (protocolFee + _loadProtocolFee(targetAssetId_)))) ++ _saveSigmaFeePerLp(sigmaFeePerLpUpdated)), unit)
17321709 else throw("Strict value is not equal to itself.")
17331710 }
17341711 else throw("Strict value is not equal to itself.")
17351712 }
17361713 else throw("Strict value is not equal to itself.")
17371714 }
17381715 else throw("Strict value is not equal to itself.")
17391716 }
17401717
17411718
17421719
17431720 @Callable(i)
17441721 func getDepositAll (lpAmount_) = {
17451722 let err = _validateInt(lpAmount_, 1, MAX_INT, "getDepositAll: invalid amount")
17461723 if ((err == err))
17471724 then {
1748- let $t05306253149 = _depositAll(lpAmount_)
1749- let lpTokensToMint = $t05306253149._1
1750- let requiredAmountsNormalized = $t05306253149._2
1751- let assetBalances = $t05306253149._3
1725+ let $t05310053187 = _depositAll(lpAmount_)
1726+ let lpTokensToMint = $t05310053187._1
1727+ let requiredAmountsNormalized = $t05310053187._2
1728+ let assetBalances = $t05310053187._3
17521729 $Tuple2(nil, $Tuple2(lpTokensToMint, requiredAmountsNormalized))
17531730 }
17541731 else throw("Strict value is not equal to itself.")
17551732 }
17561733
17571734
17581735
17591736 @Callable(i)
17601737 func getDeposit (assetId_,amount_) = {
17611738 let err = if (_validateListContains(_loadAssets(), assetId_, "getDeposit: invalid asset"))
17621739 then _validateInt(amount_, 1, MAX_INT, "getDeposit: invalid amount")
17631740 else false
17641741 if ((err == err))
17651742 then {
17661743 let storage = _loadStorage()
17671744 let lpAssetId = storage._1
17681745 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
17691746 let assetDecimals = _getDecimals(assetId_)
17701747 let amountNormalized = _normalizeDecimals(amount_, assetDecimals, lpDecimals, DOWN)
1771- let $t05390854024 = _deposit(assetId_, amountNormalized)
1772- let lpTokensToMint = $t05390854024._1
1773- let assetBalances = $t05390854024._2
1774- let lpFee = $t05390854024._3
1775- let protocolFee = $t05390854024._4
1776- let sigmaFeePerLpUpdated = $t05390854024._5
1748+ let $t05394654062 = _deposit(assetId_, amountNormalized)
1749+ let lpTokensToMint = $t05394654062._1
1750+ let assetBalances = $t05394654062._2
1751+ let lpFee = $t05394654062._3
1752+ let protocolFee = $t05394654062._4
1753+ let sigmaFeePerLpUpdated = $t05394654062._5
17771754 let lpTokensToSend = ((lpTokensToMint - lpFee) - protocolFee)
17781755 $Tuple2(nil, lpTokensToSend)
17791756 }
17801757 else throw("Strict value is not equal to itself.")
17811758 }
17821759
17831760
17841761
17851762 @Callable(i)
17861763 func getWithdrawAll (lpAmount_) = {
17871764 let err = _validateInt(lpAmount_, 0, MAX_INT, "getWithdrawAll: invalid amount")
17881765 if ((err == err))
17891766 then {
1790- let $t05446354539 = _withdrawAll(lpAmount_)
1791- let lpTokensToBurn = $t05446354539._1
1792- let balancesToGet = $t05446354539._2
1793- let assetBalances = $t05446354539._3
1767+ let $t05450154577 = _withdrawAll(lpAmount_)
1768+ let lpTokensToBurn = $t05450154577._1
1769+ let balancesToGet = $t05450154577._2
1770+ let assetBalances = $t05450154577._3
17941771 $Tuple2(nil, balancesToGet)
17951772 }
17961773 else throw("Strict value is not equal to itself.")
17971774 }
17981775
17991776
18001777
18011778 @Callable(i)
18021779 func getWithdraw (assetId_,amount_) = {
18031780 let err = if (_validateListContains(_loadAssets(), assetId_, "getWithdraw: invalid asset"))
18041781 then _validateInt(amount_, 1, MAX_INT, "getWithdraw: invalid amount")
18051782 else false
18061783 if ((err == err))
18071784 then {
18081785 let storage = _loadStorage()
18091786 let lpAssetId = storage._1
18101787 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
1811- let $t05519055306 = _withdraw(assetId_, amount_)
1812- let targetAmountNormalized = $t05519055306._1
1813- let assetBalances = $t05519055306._2
1814- let lpFee = $t05519055306._3
1815- let protocolFee = $t05519055306._4
1816- let sigmaFeePerLpUpdated = $t05519055306._5
1788+ let $t05522855344 = _withdraw(assetId_, amount_)
1789+ let targetAmountNormalized = $t05522855344._1
1790+ let assetBalances = $t05522855344._2
1791+ let lpFee = $t05522855344._3
1792+ let protocolFee = $t05522855344._4
1793+ let sigmaFeePerLpUpdated = $t05522855344._5
18171794 let finalAmountNormalized = ((targetAmountNormalized - lpFee) - protocolFee)
18181795 let targetDecimals = _getDecimals(assetId_)
18191796 let finalAmount = _normalizeDecimals(finalAmountNormalized, lpDecimals, targetDecimals, DOWN)
18201797 $Tuple2(nil, finalAmount)
18211798 }
18221799 else throw("Strict value is not equal to itself.")
18231800 }
18241801
18251802
18261803
18271804 @Callable(i)
18281805 func getSwap (sourceAssetId_,targetAssetId_,sourceAmount_) = {
18291806 let storage = _loadStorage()
18301807 let lpAssetId = storage._1
18311808 let lpDecimals = _getDecimals(toBase58String(lpAssetId))
18321809 let assets = _loadAssets()
18331810 let sourceAssetIndex = valueOrErrorMessage(indexOf(assets, sourceAssetId_), "swap: invalid source asset")
18341811 if ((sourceAssetIndex == sourceAssetIndex))
18351812 then {
18361813 let targetAssetIndex = valueOrErrorMessage(indexOf(assets, targetAssetId_), "swap: invalid target asset")
18371814 if ((targetAssetIndex == targetAssetIndex))
18381815 then {
18391816 let sourceAmountNormalized = _normalizeDecimals(sourceAmount_, _getDecimals(sourceAssetId_), lpDecimals, DOWN)
18401817 let err = if (_validateInt(sourceAmountNormalized, 1, MAX_INT, "swap: invalid source amount"))
18411818 then _validateStringNotEq(sourceAssetId_, targetAssetId_, "swap: same assets")
18421819 else false
18431820 if ((err == err))
18441821 then {
1845- let $t05671656874 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
1846- let targetAmountNormalized = $t05671656874._1
1847- let finalAssetBalances = $t05671656874._2
1848- let lpFee = $t05671656874._3
1849- let protocolFee = $t05671656874._4
1850- let sigmaFeePerLpUpdated = $t05671656874._5
1822+ let $t05675456912 = _swap(sourceAssetIndex, targetAssetIndex, sourceAmountNormalized)
1823+ let targetAmountNormalized = $t05675456912._1
1824+ let finalAssetBalances = $t05675456912._2
1825+ let lpFee = $t05675456912._3
1826+ let protocolFee = $t05675456912._4
1827+ let sigmaFeePerLpUpdated = $t05675456912._5
18511828 let finalAmountNormalized = ((targetAmountNormalized - lpFee) - protocolFee)
18521829 let targetDecimals = _getDecimals(targetAssetId_)
18531830 let finalAmount = _normalizeDecimals(finalAmountNormalized, lpDecimals, targetDecimals, DOWN)
18541831 $Tuple2(nil, finalAmount)
18551832 }
18561833 else throw("Strict value is not equal to itself.")
18571834 }
18581835 else throw("Strict value is not equal to itself.")
18591836 }
18601837 else throw("Strict value is not equal to itself.")
18611838 }
18621839
18631840
18641841
18651842 @Callable(i)
18661843 func getClaim (user_) = {
18671844 let user = if ((size(user_) > 0))
18681845 then valueOrErrorMessage(addressFromString(user_), "getClaim: invalid user")
18691846 else i.caller
1870- let $t05751657572 = _checkpoint(user)
1871- let checkpointActions = $t05751657572._1
1872- let userProfits = $t05751657572._2
1847+ let $t05755457610 = _checkpoint(user)
1848+ let checkpointActions = $t05755457610._1
1849+ let userProfits = $t05755457610._2
18731850 $Tuple2(nil, userProfits)
18741851 }
18751852
18761853
18771854
18781855 @Callable(i)
18791856 func getUtilFunc () = {
18801857 let storage = _loadStorage()
18811858 let lpTotalSupply = storage._3
18821859 let weightAmplifier = storage._7
18831860 let slippageRate = storage._8
18841861 let feeMaxRate = storage._9
1885- let $t05790557965 = _loadAssetBalances()
1886- let assetBalances = $t05790557965._1
1887- let assetTotalSupply = $t05790557965._2
1888- let $t05797058023 = _loadAssetWeights()
1889- let assetWeights = $t05797058023._1
1890- let sigmaWeight = $t05797058023._2
1862+ let $t05794358003 = _loadAssetBalances()
1863+ let assetBalances = $t05794358003._1
1864+ let assetTotalSupply = $t05794358003._2
1865+ let $t05800858061 = _loadAssetWeights()
1866+ let assetWeights = $t05800858061._1
1867+ let sigmaWeight = $t05800858061._2
18911868 let fee = _calculateFee(assetBalances, assetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
18921869 let utilValue = (assetTotalSupply - fee)
18931870 $Tuple2(nil, $Tuple2(utilValue, lpTotalSupply))
18941871 }
18951872
18961873
18971874
18981875 @Callable(i)
18991876 func getFeeFunc () = {
19001877 let storage = _loadStorage()
19011878 let weightAmplifier = storage._7
19021879 let slippageRate = storage._8
19031880 let feeMaxRate = storage._9
1904- let $t05845558515 = _loadAssetBalances()
1905- let assetBalances = $t05845558515._1
1906- let assetTotalSupply = $t05845558515._2
1907- let $t05852058573 = _loadAssetWeights()
1908- let assetWeights = $t05852058573._1
1909- let sigmaWeight = $t05852058573._2
1881+ let $t05849358553 = _loadAssetBalances()
1882+ let assetBalances = $t05849358553._1
1883+ let assetTotalSupply = $t05849358553._2
1884+ let $t05855858611 = _loadAssetWeights()
1885+ let assetWeights = $t05855858611._1
1886+ let sigmaWeight = $t05855858611._2
19101887 let fee = _calculateFee(assetBalances, assetTotalSupply, assetWeights, sigmaWeight, weightAmplifier, slippageRate, feeMaxRate)
19111888 $Tuple2(nil, fee)
19121889 }
19131890
19141891
19151892
19161893 @Callable(i)
19171894 func checkpoint (user_) = {
19181895 let err = if (_whenInitialized())
19191896 then _whenNotPaused()
19201897 else false
19211898 if ((err == err))
19221899 then {
19231900 let user = if ((size(user_) > 0))
19241901 then valueOrErrorMessage(addressFromString(user_), "checkpoint: invalid user")
19251902 else i.caller
19261903 _checkpoint(user)
19271904 }
19281905 else throw("Strict value is not equal to itself.")
19291906 }
19301907
19311908
19321909
19331910 @Callable(i)
19341911 func stake () = {
19351912 let err = if (_whenInitialized())
19361913 then _whenNotPaused()
19371914 else false
19381915 if ((err == err))
19391916 then {
19401917 let storage = _loadStorage()
19411918 let lpAssetIdStr = _assetToStr(storage._1)
19421919 let err1 = if (if (_validateIntEquals(size(i.payments), 1, "stake: invalid payments size"))
19431920 then _validateStringEqual(lpAssetIdStr, _assetToStr(i.payments[0].assetId), "stake: invalid payment asset")
19441921 else false)
19451922 then _validateInt(i.payments[0].amount, 0, MAX_INT, "stake: invalid payment amount")
19461923 else false
19471924 if ((err1 == err1))
19481925 then {
1949- let $t05958159641 = _checkpoint(i.caller)
1950- let checkpointActions = $t05958159641._1
1951- let userProfits = $t05958159641._2
1926+ let $t05961959679 = _checkpoint(i.caller)
1927+ let checkpointActions = $t05961959679._1
1928+ let userProfits = $t05961959679._2
19521929 $Tuple2(((checkpointActions ++ _saveUserLp(i.caller, (_loadUserLp(i.caller) + i.payments[0].amount))) ++ _saveTotalLp((_loadTotalLp() + i.payments[0].amount))), unit)
19531930 }
19541931 else throw("Strict value is not equal to itself.")
19551932 }
19561933 else throw("Strict value is not equal to itself.")
19571934 }
19581935
19591936
19601937
19611938 @Callable(i)
19621939 func unstake (amount_) = {
19631940 let err = if (_whenInitialized())
19641941 then _whenNotPaused()
19651942 else false
19661943 if ((err == err))
19671944 then {
19681945 let storage = _loadStorage()
19691946 let lpAssetId = storage._1
19701947 let userLp = _loadUserLp(i.caller)
19711948 let err1 = _validateInt(amount_, 0, userLp, "unstake: invalid amount")
19721949 if ((err1 == err1))
19731950 then {
1974- let $t06015260212 = _checkpoint(i.caller)
1975- let checkpointActions = $t06015260212._1
1976- let userProfits = $t06015260212._2
1951+ let $t06019060250 = _checkpoint(i.caller)
1952+ let checkpointActions = $t06019060250._1
1953+ let userProfits = $t06019060250._2
19771954 $Tuple2(((([ScriptTransfer(i.caller, amount_, lpAssetId)] ++ checkpointActions) ++ _saveUserLp(i.caller, (userLp - amount_))) ++ _saveTotalLp((_loadTotalLp() - amount_))), unit)
19781955 }
19791956 else throw("Strict value is not equal to itself.")
19801957 }
19811958 else throw("Strict value is not equal to itself.")
19821959 }
19831960
19841961
19851962
19861963 @Callable(i)
19871964 func claim (user_) = {
19881965 let err = if (_whenInitialized())
19891966 then _whenNotPaused()
19901967 else false
19911968 if ((err == err))
19921969 then {
19931970 let user = if ((size(user_) > 0))
19941971 then valueOrErrorMessage(addressFromString(user_), "claim: invalid user")
19951972 else i.caller
19961973 let storage = _loadStorage()
19971974 let lpAssetId = storage._1
19981975 let lpAssetIdStr = _assetToStr(lpAssetId)
19991976 let assets = [lpAssetIdStr, _loadAssets()]
20001977 let maxIndex = (size(assets) - 1)
20011978 let userLp = _loadUserLp(user)
2002- let $t06093560991 = _checkpoint(user)
2003- let checkpointActions = $t06093560991._1
2004- let userProfits = $t06093560991._2
1979+ let $t06097361029 = _checkpoint(user)
1980+ let checkpointActions = $t06097361029._1
1981+ let userProfits = $t06097361029._2
20051982 func foldFunc (acc,profit) = {
20061983 let index = acc._1
20071984 if (if ((maxIndex >= index))
20081985 then (profit > 0)
20091986 else false)
20101987 then {
20111988 let asset = assets[index]
20121989 $Tuple3((index + 1), (acc._2 :+ 0), (acc._3 :+ ScriptTransfer(user, profit, _strToAsset(asset))))
20131990 }
20141991 else $Tuple3((index + 1), (acc._2 :+ profit), acc._3)
20151992 }
20161993
2017- let $t06136961460 = {
1994+ let $t06140761498 = {
20181995 let $l = userProfits
20191996 let $s = size($l)
20201997 let $acc0 = $Tuple3(0, nil, nil)
20211998 func $f0_1 ($a,$i) = if (($i >= $s))
20221999 then $a
20232000 else foldFunc($a, $l[$i])
20242001
20252002 func $f0_2 ($a,$i) = if (($i >= $s))
20262003 then $a
20272004 else throw("List size exceeds 11")
20282005
20292006 $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)
20302007 }
2031- let idx = $t06136961460._1
2032- let userProfitsUpdated = $t06136961460._2
2033- let profitActions = $t06136961460._3
2008+ let idx = $t06140761498._1
2009+ let userProfitsUpdated = $t06140761498._2
2010+ let profitActions = $t06140761498._3
20342011 $Tuple2(((profitActions ++ removeByIndex(checkpointActions, 0)) ++ _saveUserProfits(user, userProfitsUpdated)), unit)
20352012 }
20362013 else throw("Strict value is not equal to itself.")
20372014 }
20382015
20392016
20402017
20412018 @Callable(i)
20422019 func pause () = {
20432020 let err = if (if (_onlyPauser(i.caller))
20442021 then _whenInitialized()
20452022 else false)
20462023 then _whenNotPaused()
20472024 else false
20482025 if ((err == err))
20492026 then $Tuple2(_savePause(true), unit)
20502027 else throw("Strict value is not equal to itself.")
20512028 }
20522029
20532030
20542031
20552032 @Callable(i)
20562033 func unpause () = {
20572034 let err = if (if (_onlyThisContract(i.caller))
20582035 then _whenInitialized()
20592036 else false)
20602037 then _whenPaused()
20612038 else false
20622039 if ((err == err))
20632040 then $Tuple2(_savePause(false), unit)
20642041 else throw("Strict value is not equal to itself.")
20652042 }
20662043
20672044
20682045
20692046 @Callable(i)
20702047 func updatePauser (pauser_) = {
20712048 let err = if (if (_onlyThisContract(i.caller))
20722049 then _whenInitialized()
20732050 else false)
20742051 then _validateAddress(pauser_, "updatePauser: invalid pauser")
20752052 else false
20762053 if ((err == err))
20772054 then $Tuple2(_savePauser(addressFromStringValue(pauser_)), unit)
20782055 else throw("Strict value is not equal to itself.")
20792056 }
20802057
20812058
20822059
20832060 @Callable(i)
20842061 func updateWatchdog (watchdog_,offset_) = {
20852062 let err = if (if (if (_onlyThisContract(i.caller))
20862063 then _whenInitialized()
20872064 else false)
20882065 then _validateAddress(watchdog_, "updateWatchdog: invalid watchdog")
20892066 else false)
20902067 then _validateInt(offset_, 0, MAX_INT, "updateWatchdog: invalid offset")
20912068 else false
20922069 if ((err == err))
20932070 then $Tuple2((_saveWatchdog(addressFromStringValue(watchdog_)) ++ _saveWatchdogOffset(offset_)), unit)
20942071 else throw("Strict value is not equal to itself.")
20952072 }
20962073
20972074
20982075
20992076 @Callable(i)
21002077 func setMultisig (multisig_) = {
21012078 let err = if (_onlyThisContract(i.caller))
21022079 then _validateAddress(multisig_, "setMultisig: invalid multisig")
21032080 else false
21042081 if ((err == err))
21052082 then $Tuple2(_saveMultisig(addressFromStringValue(multisig_)), unit)
21062083 else throw("Strict value is not equal to itself.")
21072084 }
21082085
21092086
21102087 @Verifier(tx)
21112088 func verify () = match getString(KEY_MULTISIG) {
21122089 case multisig: String =>
21132090 valueOrElse(getBoolean(addressFromStringValue(multisig), makeString([KEY_STATUS, toString(this), toBase58String(tx.id)], SEP)), false)
21142091 case _ =>
21152092 sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
21162093 }
21172094

github/deemru/w8io/026f985 
222.38 ms