tx · D1YkgGT9xcRUq8BLs89DPx7Mxy876dBv2Jfoxq3sduXp 3PEa9FHtMPHnuMy49sRkepXV12L1LVtckf8: -0.06000000 Waves 2022.09.21 19:23 [3304566] smart account 3PEa9FHtMPHnuMy49sRkepXV12L1LVtckf8 > SELF 0.00000000 Waves
{ "type": 13, "id": "D1YkgGT9xcRUq8BLs89DPx7Mxy876dBv2Jfoxq3sduXp", "fee": 6000000, "feeAssetId": null, "timestamp": 1663777430940, "version": 2, "chainId": 87, "sender": "3PEa9FHtMPHnuMy49sRkepXV12L1LVtckf8", "senderPublicKey": "5uTkGBcBYJzxzmKDLPHVmo27q17aTotrkEYWVysrz44i", "proofs": [ "5W2rcSi4vUfRathGgdQLLwAPKkRm6xiWazYfkLBVbH3RnWANEb8rnyfYyNfdpxSDM8hHN7p7srdqaK3oXS6jPiZQ" ], "script": "base64:BgJvCAISABIAEgMKAQESAwoBARILCgkBAQEBAQEBAQESEAoOAQEBAQEBAQgICAEBAQESAwoBARIFCgMBAQESBgoEAQEBCBIAEgMKAQESABIDCgEIEgASBAoCCAESAwoBARIDCgEIEgMKAQgSAwoBARIAiAEACWtfb3JhX2tleQIJa19vcmFfa2V5AA9rX29yYV9ibG9ja19rZXkCD2tfb3JhX2Jsb2NrX2tleQAFa19vcmECBWtfb3JhAAlrX2JhbGFuY2UCCWtfYmFsYW5jZQAOa19wb3NpdGlvblNpemUCDmtfcG9zaXRpb25TaXplABBrX3Bvc2l0aW9uTWFyZ2luAhBrX3Bvc2l0aW9uTWFyZ2luABZrX3Bvc2l0aW9uT3Blbk5vdGlvbmFsAhZrX3Bvc2l0aW9uT3Blbk5vdGlvbmFsAC5rX3Bvc2l0aW9uTGFzdFVwZGF0ZWRDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uAhJrX3Bvc2l0aW9uRnJhY3Rpb24AFGtfcG9zaXRpb25DbG9zZWREYXRlAhRrX3Bvc2l0aW9uQ2xvc2VkRGF0ZQANa19pbml0aWFsaXplZAINa19pbml0aWFsaXplZAAIa19wYXVzZWQCCGtfcGF1c2VkAAVrX2ZlZQIFa19mZWUAD2tfZnVuZGluZ1BlcmlvZAIPa19mdW5kaW5nUGVyaW9kABFrX2luaXRNYXJnaW5SYXRpbwIRa19pbml0TWFyZ2luUmF0aW8AGGtfbWFpbnRlbmFuY2VNYXJnaW5SYXRpbwIFa19tbXIAFWtfbGlxdWlkYXRpb25GZWVSYXRpbwIVa19saXF1aWRhdGlvbkZlZVJhdGlvABlrX3BhcnRpYWxMaXF1aWRhdGlvblJhdGlvAhZrX3BhcnRMaXF1aWRhdGlvblJhdGlvAA1rX3NwcmVhZExpbWl0Ag1rX3NwcmVhZExpbWl0ABBrX21heFByaWNlSW1wYWN0AhBrX21heFByaWNlSW1wYWN0ABBrX21heFByaWNlU3ByZWFkAhBrX21heFByaWNlU3ByZWFkAA1rX2xhc3REYXRhU3RyAg1rX2xhc3REYXRhU3RyAA5rX2xhc3RNaW51dGVJZAIOa19sYXN0TWludXRlSWQAHWtfdHdhcERhdGFMYXN0Q3VtdWxhdGl2ZVByaWNlAh1rX3R3YXBEYXRhTGFzdEN1bXVsYXRpdmVQcmljZQATa190d2FwRGF0YUxhc3RQcmljZQITa190d2FwRGF0YUxhc3RQcmljZQAaa190d2FwRGF0YVByZXZpb3VzTWludXRlSWQCGmtfdHdhcERhdGFQcmV2aW91c01pbnV0ZUlkACVrX2xhdGVzdExvbmdDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uAhtrX2xhdGVzdExvbmdQcmVtaXVtRnJhY3Rpb24AJmtfbGF0ZXN0U2hvcnRDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uAhxrX2xhdGVzdFNob3J0UHJlbWl1bUZyYWN0aW9uABJrX25leHRGdW5kaW5nQmxvY2sCHmtfbmV4dEZ1bmRpbmdCbG9ja01pblRpbWVzdGFtcAARa19sb25nRnVuZGluZ1JhdGUCEWtfbG9uZ0Z1bmRpbmdSYXRlABJrX3Nob3J0RnVuZGluZ1JhdGUCEmtfc2hvcnRGdW5kaW5nUmF0ZQATa19xdW90ZUFzc2V0UmVzZXJ2ZQIIa19xdEFzdFIAEmtfYmFzZUFzc2V0UmVzZXJ2ZQIIa19ic0FzdFIAE2tfdG90YWxQb3NpdGlvblNpemUCE2tfdG90YWxQb3NpdGlvblNpemUAF2tfdG90YWxMb25nUG9zaXRpb25TaXplAhdrX3RvdGFsTG9uZ1Bvc2l0aW9uU2l6ZQAYa190b3RhbFNob3J0UG9zaXRpb25TaXplAhhrX3RvdGFsU2hvcnRQb3NpdGlvblNpemUAFGtfY3VtdWxhdGl2ZU5vdGlvbmFsAhRrX2N1bXVsYXRpdmVOb3Rpb25hbAAWa19vcGVuSW50ZXJlc3ROb3Rpb25hbAIWa19vcGVuSW50ZXJlc3ROb3Rpb25hbAAUa19jb29yZGluYXRvckFkZHJlc3MCFGtfY29vcmRpbmF0b3JBZGRyZXNzABNrX2luc3VyYW5jZV9hZGRyZXNzAhNrX2luc3VyYW5jZV9hZGRyZXNzAA9rX2FkbWluX2FkZHJlc3MCD2tfYWRtaW5fYWRkcmVzcwASa19hZG1pbl9wdWJsaWNfa2V5AhJrX2FkbWluX3B1YmxpY19rZXkADWtfcXVvdGVfYXNzZXQCDWtfcXVvdGVfYXNzZXQAD2tfcXVvdGVfc3Rha2luZwIPa19xdW90ZV9zdGFraW5nABFrX3N0YWtpbmdfYWRkcmVzcwIRa19zdGFraW5nX2FkZHJlc3MAD2tfbWluZXJfYWRkcmVzcwIPa19taW5lcl9hZGRyZXNzABBrX29yZGVyc19hZGRyZXNzAhBrX29yZGVyc19hZGRyZXNzABJrX3JlZmVycmFsX2FkZHJlc3MCEmtfcmVmZXJyYWxfYWRkcmVzcwELY29vcmRpbmF0b3IACQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwUUa19jb29yZGluYXRvckFkZHJlc3MCE0Nvb3JkaW5hdG9yIG5vdCBzZXQBDGFkbWluQWRkcmVzcwAJAKYIAQkBEUBleHRyTmF0aXZlKDEwNTMpAgkBC2Nvb3JkaW5hdG9yAAUPa19hZG1pbl9hZGRyZXNzAQ5hZG1pblB1YmxpY0tleQAJANkEAQkBEUBleHRyTmF0aXZlKDEwNTMpAgkBC2Nvb3JkaW5hdG9yAAUSa19hZG1pbl9wdWJsaWNfa2V5AQpxdW90ZUFzc2V0AAkA2QQBCQERQGV4dHJOYXRpdmUoMTA1MykCCQELY29vcmRpbmF0b3IABQ1rX3F1b3RlX2Fzc2V0ARFxdW90ZUFzc2V0U3Rha2luZwAJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQERQGV4dHJOYXRpdmUoMTA1MykCCQELY29vcmRpbmF0b3IABQ9rX3F1b3RlX3N0YWtpbmcCG1F1b3RlIGFzc2V0IHN0YWtpbmcgbm90IHNldAEOc3Rha2luZ0FkZHJlc3MACQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkBEUBleHRyTmF0aXZlKDEwNTMpAgkBC2Nvb3JkaW5hdG9yAAURa19zdGFraW5nX2FkZHJlc3MCD1N0YWtpbmcgbm90IHNldAEQaW5zdXJhbmNlQWRkcmVzcwAJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQERQGV4dHJOYXRpdmUoMTA1MykCCQELY29vcmRpbmF0b3IABRNrX2luc3VyYW5jZV9hZGRyZXNzAhFJbnN1cmFuY2Ugbm90IHNldAEMbWluZXJBZGRyZXNzAAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJARFAZXh0ck5hdGl2ZSgxMDUzKQIJAQtjb29yZGluYXRvcgAFD2tfbWluZXJfYWRkcmVzcwINTWluZXIgbm90IHNldAENb3JkZXJzQWRkcmVzcwAJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQERQGV4dHJOYXRpdmUoMTA1MykCCQELY29vcmRpbmF0b3IABRBrX29yZGVyc19hZGRyZXNzAg5PcmRlcnMgbm90IHNldAEPcmVmZXJyYWxBZGRyZXNzAAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJARFAZXh0ck5hdGl2ZSgxMDUzKQIJAQtjb29yZGluYXRvcgAFEmtfcmVmZXJyYWxfYWRkcmVzcwIQUmVmZXJyYWwgbm90IHNldAAIRElSX0xPTkcAAQAJRElSX1NIT1JUAAIADVRXQVBfSU5URVJWQUwADwAPT1JBQ0xFX0lOVEVSVkFMAA8AB1NFQ09ORFMA6AcADERFQ0lNQUxfVU5JVAkAaAIAAQkAaAIJAGgCCQBoAgkAaAIJAGgCAAoACgAKAAoACgAKAAdPTkVfREFZCQBoAgCAowUFDERFQ0lNQUxfVU5JVAAIQUxMX0ZFRVMAZAAPUE5MX09QVElPTl9TUE9UAAEAEVBOTF9PUFRJT05fT1JBQ0xFAAIBAXMBAl94CQCsAgIJAKQDAQUCX3gCASwBBGRpdmQCAl94Al95CQBuBAUCX3gFDERFQ0lNQUxfVU5JVAUCX3kFCEhBTEZFVkVOAQRtdWxkAgJfeAJfeQkAbgQFAl94BQJfeQUMREVDSU1BTF9VTklUBQhIQUxGRVZFTgEDYWJzAQJfeAMJAGYCBQJfeAAABQJfeAkBAS0BBQJfeAEEdm1heAICX3gCX3kDCQBnAgUCX3gFAl95BQJfeAUCX3kBDnRvQ29tcG9zaXRlS2V5AgRfa2V5CF9hZGRyZXNzCQCsAgIJAKwCAgUEX2tleQIBXwUIX2FkZHJlc3MBCWxpc3RUb1N0cgEFX2xpc3QKAQVfam9pbgILYWNjdW11bGF0b3IDdmFsCQCsAgIJAKwCAgULYWNjdW11bGF0b3IFA3ZhbAIBLAQKbmV3TGlzdFN0cgoAAiRsBQVfbGlzdAoAAiRzCQCQAwEFAiRsCgAFJGFjYzACAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEFX2pvaW4CBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDIwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAQLbmV3TGlzdFN0clUJALMCAgUKbmV3TGlzdFN0cgABBAtuZXdMaXN0U3RyUgMJAAACCQCvAgIFC25ld0xpc3RTdHJVAAECASwJALACAgULbmV3TGlzdFN0clUAAQULbmV3TGlzdFN0clUFC25ld0xpc3RTdHJSAQlzdHJUb0xpc3QBBF9zdHIJALUJAgUEX3N0cgIBLAELcHVzaFRvUXVldWUDBV9saXN0CF9tYXhTaXplBl92YWx1ZQMJAGYCCQCQAwEFBV9saXN0BQhfbWF4U2l6ZQkAzQgCCQDRCAIFBV9saXN0AAAFBl92YWx1ZQkAzQgCBQVfbGlzdAUGX3ZhbHVlAQNpbnQBAWsJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQR0aGlzBQFrCQCsAgICDW5vIHZhbHVlIGZvciAFAWsBCGNiYWxhbmNlAAkBA2ludAEFCWtfYmFsYW5jZQEDZmVlAAkBA2ludAEFBWtfZmVlAQ9pbml0TWFyZ2luUmF0aW8ACQEDaW50AQURa19pbml0TWFyZ2luUmF0aW8BBnF0QXN0UgAJAQNpbnQBBRNrX3F1b3RlQXNzZXRSZXNlcnZlAQZic0FzdFIACQEDaW50AQUSa19iYXNlQXNzZXRSZXNlcnZlARF0b3RhbFBvc2l0aW9uU2l6ZQAJAQNpbnQBBRNrX3RvdGFsUG9zaXRpb25TaXplARJjdW11bGF0aXZlTm90aW9uYWwACQEDaW50AQUUa19jdW11bGF0aXZlTm90aW9uYWwBFG9wZW5JbnRlcmVzdE5vdGlvbmFsAAkBA2ludAEFFmtfb3BlbkludGVyZXN0Tm90aW9uYWwBGW5leHRGdW5kaW5nQmxvY2tUaW1lc3RhbXAACQEDaW50AQUSa19uZXh0RnVuZGluZ0Jsb2NrARBmdW5kaW5nUGVyaW9kUmF3AAkBA2ludAEFD2tfZnVuZGluZ1BlcmlvZAEUZnVuZGluZ1BlcmlvZERlY2ltYWwACQBoAgkBEGZ1bmRpbmdQZXJpb2RSYXcABQxERUNJTUFMX1VOSVQBFGZ1bmRpbmdQZXJpb2RTZWNvbmRzAAkAaAIJARBmdW5kaW5nUGVyaW9kUmF3AAUHU0VDT05EUwEWbWFpbnRlbmFuY2VNYXJnaW5SYXRpbwAJAQNpbnQBBRhrX21haW50ZW5hbmNlTWFyZ2luUmF0aW8BE2xpcXVpZGF0aW9uRmVlUmF0aW8ACQEDaW50AQUVa19saXF1aWRhdGlvbkZlZVJhdGlvARdwYXJ0aWFsTGlxdWlkYXRpb25SYXRpbwAJAQNpbnQBBRlrX3BhcnRpYWxMaXF1aWRhdGlvblJhdGlvAQtzcHJlYWRMaW1pdAAJAQNpbnQBBQ1rX3NwcmVhZExpbWl0AQ5tYXhQcmljZUltcGFjdAAJAQNpbnQBBRBrX21heFByaWNlSW1wYWN0AQ5tYXhQcmljZVNwcmVhZAAJAQNpbnQBBRBrX21heFByaWNlU3ByZWFkASNsYXRlc3RMb25nQ3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgAJAQNpbnQBBSVrX2xhdGVzdExvbmdDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uASRsYXRlc3RTaG9ydEN1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24ACQEDaW50AQUma19sYXRlc3RTaG9ydEN1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24BFnRvdGFsU2hvcnRQb3NpdGlvblNpemUACQEDaW50AQUYa190b3RhbFNob3J0UG9zaXRpb25TaXplARV0b3RhbExvbmdQb3NpdGlvblNpemUACQEDaW50AQUXa190b3RhbExvbmdQb3NpdGlvblNpemUBD2dldEFjdHVhbENhbGxlcgEBaQkBC3ZhbHVlT3JFbHNlAgkAnQgCCQENb3JkZXJzQWRkcmVzcwACCGtfc2VuZGVyCQClCAEIBQFpBmNhbGxlcgEWcmVxdWlyZU1vcmVNYXJnaW5SYXRpbwMMX21hcmdpblJhdGlvEF9iYXNlTWFyZ2luUmF0aW8UX2xhcmdlclRoYW5PckVxdWFsVG8EFHJlbWFpbmluZ01hcmdpblJhdGlvCQBlAgUMX21hcmdpblJhdGlvBRBfYmFzZU1hcmdpblJhdGlvAwMFFF9sYXJnZXJUaGFuT3JFcXVhbFRvCQBmAgAABRRyZW1haW5pbmdNYXJnaW5SYXRpbwcJAAIBAg5JbnZhbGlkIG1hcmdpbgMDCQEBIQEFFF9sYXJnZXJUaGFuT3JFcXVhbFRvCQBnAgUUcmVtYWluaW5nTWFyZ2luUmF0aW8AAAcJAAIBAg5JbnZhbGlkIG1hcmdpbgYBH2xhdGVzdEN1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24BDV9wb3NpdGlvblNpemUDCQAAAgUNX3Bvc2l0aW9uU2l6ZQAACQACAQIsU2hvdWxkIG5vdCBiZSBjYWxsZWQgd2l0aCBfcG9zaXRpb25TaXplID09IDADCQBmAgUNX3Bvc2l0aW9uU2l6ZQAACQEjbGF0ZXN0TG9uZ0N1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24ACQEkbGF0ZXN0U2hvcnRDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uAAELZ2V0UG9zaXRpb24BB190cmFkZXIED3Bvc2l0aW9uU2l6ZU9wdAkAmggCBQR0aGlzCQEOdG9Db21wb3NpdGVLZXkCBQ5rX3Bvc2l0aW9uU2l6ZQUHX3RyYWRlcgQHJG1hdGNoMAUPcG9zaXRpb25TaXplT3B0AwkAAQIFByRtYXRjaDACA0ludAQMcG9zaXRpb25TaXplBQckbWF0Y2gwCQCWCgQFDHBvc2l0aW9uU2l6ZQkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkBDnRvQ29tcG9zaXRlS2V5AgUQa19wb3NpdGlvbk1hcmdpbgUHX3RyYWRlcgkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkBDnRvQ29tcG9zaXRlS2V5AgUWa19wb3NpdGlvbk9wZW5Ob3Rpb25hbAUHX3RyYWRlcgkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkBDnRvQ29tcG9zaXRlS2V5AgUua19wb3NpdGlvbkxhc3RVcGRhdGVkQ3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgUHX3RyYWRlcgkAlgoEAAAAAAAAAAABE3JlcXVpcmVPcGVuUG9zaXRpb24BB190cmFkZXIDCQAAAggJAQtnZXRQb3NpdGlvbgEFB190cmFkZXICXzEAAAkAAgECEE5vIG9wZW4gcG9zaXRpb24GAQtpbml0aWFsaXplZAAJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwUNa19pbml0aWFsaXplZAcBBnBhdXNlZAAJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwUIa19wYXVzZWQHAQ11cGRhdGVSZXNlcnZlAwZfaXNBZGQRX3F1b3RlQXNzZXRBbW91bnQQX2Jhc2VBc3NldEFtb3VudAMFBl9pc0FkZAQHbmV3QmFzZQkAZQIJAQZic0FzdFIABRBfYmFzZUFzc2V0QW1vdW50AwkAZwIAAAUHbmV3QmFzZQkAAgECKlR4IGxlYWQgdG8gYmFzZSBhc3NldCByZXNlcnZlIDw9IDAsIHJldmVydAkAlgoECQBkAgkBBnF0QXN0UgAFEV9xdW90ZUFzc2V0QW1vdW50BQduZXdCYXNlCQBkAgkBEXRvdGFsUG9zaXRpb25TaXplAAUQX2Jhc2VBc3NldEFtb3VudAkAZAIJARJjdW11bGF0aXZlTm90aW9uYWwABRFfcXVvdGVBc3NldEFtb3VudAQIbmV3UXVvdGUJAGUCCQEGcXRBc3RSAAURX3F1b3RlQXNzZXRBbW91bnQDCQBnAgAABQhuZXdRdW90ZQkAAgECKlR4IGxlYWQgdG8gYmFzZSBxdW90ZSByZXNlcnZlIDw9IDAsIHJldmVydAkAlgoEBQhuZXdRdW90ZQkAZAIJAQZic0FzdFIABRBfYmFzZUFzc2V0QW1vdW50CQBlAgkBEXRvdGFsUG9zaXRpb25TaXplAAUQX2Jhc2VBc3NldEFtb3VudAkAZQIJARJjdW11bGF0aXZlTm90aW9uYWwABRFfcXVvdGVBc3NldEFtb3VudAEJc3dhcElucHV0AgZfaXNBZGQRX3F1b3RlQXNzZXRBbW91bnQEB19xdEFzdFIJAQZxdEFzdFIABAdfYnNBc3RSCQEGYnNBc3RSAAQBawkBBG11bGQCBQdfcXRBc3RSBQdfYnNBc3RSBBZxdW90ZUFzc2V0UmVzZXJ2ZUFmdGVyAwUGX2lzQWRkCQBkAgUHX3F0QXN0UgURX3F1b3RlQXNzZXRBbW91bnQJAGUCBQdfcXRBc3RSBRFfcXVvdGVBc3NldEFtb3VudAQVYmFzZUFzc2V0UmVzZXJ2ZUFmdGVyCQEEZGl2ZAIFAWsFFnF1b3RlQXNzZXRSZXNlcnZlQWZ0ZXIEGGFtb3VudEJhc2VBc3NldEJvdWdodEFicwkBA2FicwEJAGUCBRViYXNlQXNzZXRSZXNlcnZlQWZ0ZXIFB19ic0FzdFIEFWFtb3VudEJhc2VBc3NldEJvdWdodAMFBl9pc0FkZAUYYW1vdW50QmFzZUFzc2V0Qm91Z2h0QWJzCQEBLQEFGGFtb3VudEJhc2VBc3NldEJvdWdodEFicwQNJHQwMTI4MTYxMzAwOQkBDXVwZGF0ZVJlc2VydmUDBQZfaXNBZGQFEV9xdW90ZUFzc2V0QW1vdW50BRhhbW91bnRCYXNlQXNzZXRCb3VnaHRBYnMEF3F1b3RlQXNzZXRSZXNlcnZlQWZ0ZXIxCAUNJHQwMTI4MTYxMzAwOQJfMQQWYmFzZUFzc2V0UmVzZXJ2ZUFmdGVyMQgFDSR0MDEyODE2MTMwMDkCXzIEF3RvdGFsUG9zaXRpb25TaXplQWZ0ZXIxCAUNJHQwMTI4MTYxMzAwOQJfMwQYY3VtdWxhdGl2ZU5vdGlvbmFsQWZ0ZXIxCAUNJHQwMTI4MTYxMzAwOQJfNAQLcHJpY2VCZWZvcmUJAQRkaXZkAgUHX3F0QXN0UgUHX2JzQXN0UgQLbWFya2V0UHJpY2UJAQRkaXZkAgURX3F1b3RlQXNzZXRBbW91bnQFGGFtb3VudEJhc2VBc3NldEJvdWdodEFicwQJcHJpY2VEaWZmCQEDYWJzAQkAZQIFC3ByaWNlQmVmb3JlBQttYXJrZXRQcmljZQQLcHJpY2VJbXBhY3QJAGUCBQxERUNJTUFMX1VOSVQJAQRkaXZkAgULcHJpY2VCZWZvcmUJAGQCBQtwcmljZUJlZm9yZQUJcHJpY2VEaWZmBBNtYXhQcmljZUltcGFjdFZhbHVlCQEObWF4UHJpY2VJbXBhY3QAAwkAZgIFC3ByaWNlSW1wYWN0BRNtYXhQcmljZUltcGFjdFZhbHVlCQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAg1QcmljZSBpbXBhY3QgCQCkAwEFC3ByaWNlSW1wYWN0AhQgPiBtYXggcHJpY2UgaW1wYWN0IAkApAMBBRNtYXhQcmljZUltcGFjdFZhbHVlAhUgYmVmb3JlIHF1b3RlIGFzc2V0OiAJAKQDAQUHX3F0QXN0UgIUIGJlZm9yZSBiYXNlIGFzc2V0OiAJAKQDAQUHX2JzQXN0UgIhIHF1b3RlIGFzc2V0IGFtb3VudCB0byBleGNoYW5nZTogCQCkAwEFEV9xdW90ZUFzc2V0QW1vdW50Ag8gcHJpY2UgYmVmb3JlOiAJAKQDAQULcHJpY2VCZWZvcmUCDiBtYXJrZXRQcmljZTogCQCkAwEFC21hcmtldFByaWNlCQCXCgUFFWFtb3VudEJhc2VBc3NldEJvdWdodAUXcXVvdGVBc3NldFJlc2VydmVBZnRlcjEFFmJhc2VBc3NldFJlc2VydmVBZnRlcjEFF3RvdGFsUG9zaXRpb25TaXplQWZ0ZXIxBRhjdW11bGF0aXZlTm90aW9uYWxBZnRlcjEBImNhbGNSZW1haW5NYXJnaW5XaXRoRnVuZGluZ1BheW1lbnQEEF9vbGRQb3NpdGlvblNpemUSX29sZFBvc2l0aW9uTWFyZ2luJV9vbGRQb3NpdGlvbkN1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24MX21hcmdpbkRlbHRhBA5mdW5kaW5nUGF5bWVudAMJAQIhPQIFEF9vbGRQb3NpdGlvblNpemUAAAQgX2xhdGVzdEN1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24JAR9sYXRlc3RDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uAQUQX29sZFBvc2l0aW9uU2l6ZQkBBG11bGQCCQBlAgUgX2xhdGVzdEN1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24FJV9vbGRQb3NpdGlvbkN1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24FEF9vbGRQb3NpdGlvblNpemUAAAQMc2lnbmVkTWFyZ2luCQBkAgkAZQIFDF9tYXJnaW5EZWx0YQUOZnVuZGluZ1BheW1lbnQFEl9vbGRQb3NpdGlvbk1hcmdpbgQNJHQwMTQ1MDAxNDYyNwMJAGYCAAAFDHNpZ25lZE1hcmdpbgkAlAoCAAAJAQNhYnMBBQxzaWduZWRNYXJnaW4JAJQKAgkBA2FicwEFDHNpZ25lZE1hcmdpbgAABAxyZW1haW5NYXJnaW4IBQ0kdDAxNDUwMDE0NjI3Al8xBAdiYWREZWJ0CAUNJHQwMTQ1MDAxNDYyNwJfMgkAlQoDBQxyZW1haW5NYXJnaW4FB2JhZERlYnQFDmZ1bmRpbmdQYXltZW50ARZzd2FwT3V0cHV0V2l0aFJlc2VydmVzBQZfaXNBZGQQX2Jhc2VBc3NldEFtb3VudBRfY2hlY2tNYXhQcmljZUltcGFjdBJfcXVvdGVBc3NldFJlc2VydmURX2Jhc2VBc3NldFJlc2VydmUEC3ByaWNlQmVmb3JlCQEEZGl2ZAIFEl9xdW90ZUFzc2V0UmVzZXJ2ZQURX2Jhc2VBc3NldFJlc2VydmUDCQAAAgUQX2Jhc2VBc3NldEFtb3VudAAACQACAQIZSW52YWxpZCBiYXNlIGFzc2V0IGFtb3VudAQBawkBBG11bGQCBRJfcXVvdGVBc3NldFJlc2VydmUFEV9iYXNlQXNzZXRSZXNlcnZlBBhiYXNlQXNzZXRQb29sQW1vdW50QWZ0ZXIDBQZfaXNBZGQJAGQCBRFfYmFzZUFzc2V0UmVzZXJ2ZQUQX2Jhc2VBc3NldEFtb3VudAkAZQIFEV9iYXNlQXNzZXRSZXNlcnZlBRBfYmFzZUFzc2V0QW1vdW50BA9xdW90ZUFzc2V0QWZ0ZXIJAQRkaXZkAgUBawUYYmFzZUFzc2V0UG9vbEFtb3VudEFmdGVyBA5xdW90ZUFzc2V0U29sZAkBA2FicwEJAGUCBQ9xdW90ZUFzc2V0QWZ0ZXIFEl9xdW90ZUFzc2V0UmVzZXJ2ZQQTbWF4UHJpY2VJbXBhY3RWYWx1ZQkBDm1heFByaWNlSW1wYWN0AAQNJHQwMTU2MDQxNTc5NwkBDXVwZGF0ZVJlc2VydmUDCQEBIQEFBl9pc0FkZAUOcXVvdGVBc3NldFNvbGQFEF9iYXNlQXNzZXRBbW91bnQEF3F1b3RlQXNzZXRSZXNlcnZlQWZ0ZXIxCAUNJHQwMTU2MDQxNTc5NwJfMQQWYmFzZUFzc2V0UmVzZXJ2ZUFmdGVyMQgFDSR0MDE1NjA0MTU3OTcCXzIEF3RvdGFsUG9zaXRpb25TaXplQWZ0ZXIxCAUNJHQwMTU2MDQxNTc5NwJfMwQYY3VtdWxhdGl2ZU5vdGlvbmFsQWZ0ZXIxCAUNJHQwMTU2MDQxNTc5NwJfNAQLbWFya2V0UHJpY2UJAQRkaXZkAgUOcXVvdGVBc3NldFNvbGQFEF9iYXNlQXNzZXRBbW91bnQECXByaWNlRGlmZgkBA2FicwEJAGUCBQtwcmljZUJlZm9yZQULbWFya2V0UHJpY2UEC3ByaWNlSW1wYWN0CQBlAgUMREVDSU1BTF9VTklUCQEEZGl2ZAIFC3ByaWNlQmVmb3JlCQBkAgULcHJpY2VCZWZvcmUFCXByaWNlRGlmZgMDCQBmAgULcHJpY2VJbXBhY3QFE21heFByaWNlSW1wYWN0VmFsdWUFFF9jaGVja01heFByaWNlSW1wYWN0BwkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgINUHJpY2UgaW1wYWN0IAkApAMBBQtwcmljZUltcGFjdAIUID4gbWF4IHByaWNlIGltcGFjdCAJAKQDAQUTbWF4UHJpY2VJbXBhY3RWYWx1ZQIVIGJlZm9yZSBxdW90ZSBhc3NldDogCQCkAwEFEl9xdW90ZUFzc2V0UmVzZXJ2ZQIUIGJlZm9yZSBiYXNlIGFzc2V0OiAJAKQDAQURX2Jhc2VBc3NldFJlc2VydmUCICBiYXNlIGFzc2V0IGFtb3VudCB0byBleGNoYW5nZTogCQCkAwEFEF9iYXNlQXNzZXRBbW91bnQCDyBwcmljZSBiZWZvcmU6IAkApAMBBQtwcmljZUJlZm9yZQIPIG1hcmtldCBwcmljZTogCQCkAwEFC21hcmtldFByaWNlCQCaCggFDnF1b3RlQXNzZXRTb2xkBRdxdW90ZUFzc2V0UmVzZXJ2ZUFmdGVyMQUWYmFzZUFzc2V0UmVzZXJ2ZUFmdGVyMQUXdG90YWxQb3NpdGlvblNpemVBZnRlcjEFGGN1bXVsYXRpdmVOb3Rpb25hbEFmdGVyMQkAZQIJARV0b3RhbExvbmdQb3NpdGlvblNpemUAAwUGX2lzQWRkCQEDYWJzAQUQX2Jhc2VBc3NldEFtb3VudAAACQBlAgkBFnRvdGFsU2hvcnRQb3NpdGlvblNpemUAAwkBASEBBQZfaXNBZGQJAQNhYnMBBRBfYmFzZUFzc2V0QW1vdW50AAAFC3ByaWNlSW1wYWN0AQpzd2FwT3V0cHV0AwZfaXNBZGQQX2Jhc2VBc3NldEFtb3VudBRfY2hlY2tNYXhQcmljZUltcGFjdAkBFnN3YXBPdXRwdXRXaXRoUmVzZXJ2ZXMFBQZfaXNBZGQFEF9iYXNlQXNzZXRBbW91bnQFFF9jaGVja01heFByaWNlSW1wYWN0CQEGcXRBc3RSAAkBBmJzQXN0UgABEmdldE9yYWNsZVR3YXBQcmljZQAEBm9yYWNsZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMFBWtfb3JhAgAECHByaWNlS2V5CQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzBQlrX29yYV9rZXkECGJsb2NrS2V5CQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzBQ9rX29yYV9ibG9ja19rZXkECWxhc3RWYWx1ZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFBm9yYWNsZQUIcHJpY2VLZXkJAKwCAgkArAICCQCsAgICIkNhbiBub3QgZ2V0IG9yYWNsZSBwcmljZS4gT3JhY2xlOiAJAKUIAQUGb3JhY2xlAgYga2V5OiAFCHByaWNlS2V5BQlsYXN0VmFsdWUBGXJlcXVpcmVOb3RPdmVyU3ByZWFkTGltaXQCEl9xdW90ZUFzc2V0UmVzZXJ2ZRFfYmFzZUFzc2V0UmVzZXJ2ZQQLb3JhY2xlUHJpY2UJARJnZXRPcmFjbGVUd2FwUHJpY2UABApwcmljZUFmdGVyCQEEZGl2ZAIFEl9xdW90ZUFzc2V0UmVzZXJ2ZQURX2Jhc2VBc3NldFJlc2VydmUEDGF2ZXJhZ2VQcmljZQkBBGRpdmQCCQBkAgULb3JhY2xlUHJpY2UFCnByaWNlQWZ0ZXIJAGgCAAIFDERFQ0lNQUxfVU5JVAQMYWJzUHJpY2VEaWZmCQEEZGl2ZAIJAQNhYnMBCQBlAgULb3JhY2xlUHJpY2UFCnByaWNlQWZ0ZXIFDGF2ZXJhZ2VQcmljZQMJAGYCBQxhYnNQcmljZURpZmYJAQ5tYXhQcmljZVNwcmVhZAAJAAIBCQCsAgIJAKwCAgkArAICAg1QcmljZSBzcHJlYWQgCQCkAwEFDGFic1ByaWNlRGlmZgIUID4gbWF4IHByaWNlIHNwcmVhZCAJAKQDAQkBDm1heFByaWNlU3ByZWFkAAYBDGdldFNwb3RQcmljZQAEEl9xdW90ZUFzc2V0UmVzZXJ2ZQkBBnF0QXN0UgAEEV9iYXNlQXNzZXRSZXNlcnZlCQEGYnNBc3RSAAkBBGRpdmQCBRJfcXVvdGVBc3NldFJlc2VydmUFEV9iYXNlQXNzZXRSZXNlcnZlARZpc092ZXJGbHVjdHVhdGlvbkxpbWl0AAQLb3JhY2xlUHJpY2UJARJnZXRPcmFjbGVUd2FwUHJpY2UABAxjdXJyZW50UHJpY2UJAQxnZXRTcG90UHJpY2UACQBmAgkBBGRpdmQCCQEDYWJzAQkAZQIFC29yYWNsZVByaWNlBQxjdXJyZW50UHJpY2UFC29yYWNsZVByaWNlCQELc3ByZWFkTGltaXQAAR9nZXRQb3NpdGlvbkFkanVzdGVkT3Blbk5vdGlvbmFsBA1fcG9zaXRpb25TaXplB19vcHRpb24SX3F1b3RlQXNzZXRSZXNlcnZlEV9iYXNlQXNzZXRSZXNlcnZlBA9wb3NpdGlvblNpemVBYnMJAQNhYnMBBQ1fcG9zaXRpb25TaXplBAdpc1Nob3J0CQBmAgAABQ1fcG9zaXRpb25TaXplBBBwb3NpdGlvbk5vdGlvbmFsAwkAAAIFB19vcHRpb24FD1BOTF9PUFRJT05fU1BPVAQNJHQwMTkwMTUxOTE4NgkBFnN3YXBPdXRwdXRXaXRoUmVzZXJ2ZXMFCQEBIQEFB2lzU2hvcnQFD3Bvc2l0aW9uU2l6ZUFicwcFEl9xdW90ZUFzc2V0UmVzZXJ2ZQURX2Jhc2VBc3NldFJlc2VydmUEE291dFBvc2l0aW9uTm90aW9uYWwIBQ0kdDAxOTAxNTE5MTg2Al8xBAJ4MQgFDSR0MDE5MDE1MTkxODYCXzIEAngyCAUNJHQwMTkwMTUxOTE4NgJfMwQCeDMIBQ0kdDAxOTAxNTE5MTg2Al80BRNvdXRQb3NpdGlvbk5vdGlvbmFsCQEEbXVsZAIFD3Bvc2l0aW9uU2l6ZUFicwkBEmdldE9yYWNsZVR3YXBQcmljZQAFEHBvc2l0aW9uTm90aW9uYWwBK2dldFBvc2l0aW9uTm90aW9uYWxBbmRVbnJlYWxpemVkUG5sQnlWYWx1ZXMFDV9wb3NpdGlvblNpemUVX3Bvc2l0aW9uT3Blbk5vdGlvbmFsEl9xdW90ZUFzc2V0UmVzZXJ2ZRFfYmFzZUFzc2V0UmVzZXJ2ZQdfb3B0aW9uAwkAAAIFDV9wb3NpdGlvblNpemUAAAkAAgECFUludmFsaWQgcG9zaXRpb24gc2l6ZQQHaXNTaG9ydAkAZgIAAAUNX3Bvc2l0aW9uU2l6ZQQQcG9zaXRpb25Ob3Rpb25hbAkBH2dldFBvc2l0aW9uQWRqdXN0ZWRPcGVuTm90aW9uYWwEBQ1fcG9zaXRpb25TaXplBQdfb3B0aW9uBRJfcXVvdGVBc3NldFJlc2VydmUFEV9iYXNlQXNzZXRSZXNlcnZlBA11bnJlYWxpemVkUG5sAwUHaXNTaG9ydAkAZQIFFV9wb3NpdGlvbk9wZW5Ob3Rpb25hbAUQcG9zaXRpb25Ob3Rpb25hbAkAZQIFEHBvc2l0aW9uTm90aW9uYWwFFV9wb3NpdGlvbk9wZW5Ob3Rpb25hbAkAlAoCBRBwb3NpdGlvbk5vdGlvbmFsBQ11bnJlYWxpemVkUG5sASNnZXRQb3NpdGlvbk5vdGlvbmFsQW5kVW5yZWFsaXplZFBubAIHX3RyYWRlcgdfb3B0aW9uBA0kdDAyMDUwMzIwNjMxCQELZ2V0UG9zaXRpb24BBQdfdHJhZGVyBAxwb3NpdGlvblNpemUIBQ0kdDAyMDUwMzIwNjMxAl8xBA5wb3NpdGlvbk1hcmdpbggFDSR0MDIwNTAzMjA2MzECXzIEFHBvc2l0aW9uT3Blbk5vdGlvbmFsCAUNJHQwMjA1MDMyMDYzMQJfMwQRcG9zaXRpb25Mc3RVcGRDUEYIBQ0kdDAyMDUwMzIwNjMxAl80CQErZ2V0UG9zaXRpb25Ob3Rpb25hbEFuZFVucmVhbGl6ZWRQbmxCeVZhbHVlcwUFDHBvc2l0aW9uU2l6ZQUUcG9zaXRpb25PcGVuTm90aW9uYWwJAQZxdEFzdFIACQEGYnNBc3RSAAUHX29wdGlvbgEPY2FsY01hcmdpblJhdGlvAw1fcmVtYWluTWFyZ2luCF9iYWREZWJ0EV9wb3NpdGlvbk5vdGlvbmFsCQEEZGl2ZAIJAGUCBQ1fcmVtYWluTWFyZ2luBQhfYmFkRGVidAURX3Bvc2l0aW9uTm90aW9uYWwBFmdldE1hcmdpblJhdGlvQnlPcHRpb24CB190cmFkZXIHX29wdGlvbgQNJHQwMjExMTIyMTIyMwkBC2dldFBvc2l0aW9uAQUHX3RyYWRlcgQMcG9zaXRpb25TaXplCAUNJHQwMjExMTIyMTIyMwJfMQQOcG9zaXRpb25NYXJnaW4IBQ0kdDAyMTExMjIxMjIzAl8yBANwb24IBQ0kdDAyMTExMjIxMjIzAl8zBBFwb3NpdGlvbkxzdFVwZENQRggFDSR0MDIxMTEyMjEyMjMCXzQEDSR0MDIxMjI5MjEzMjIJASNnZXRQb3NpdGlvbk5vdGlvbmFsQW5kVW5yZWFsaXplZFBubAIFB190cmFkZXIFB19vcHRpb24EEHBvc2l0aW9uTm90aW9uYWwIBQ0kdDAyMTIyOTIxMzIyAl8xBA11bnJlYWxpemVkUG5sCAUNJHQwMjEyMjkyMTMyMgJfMgQNJHQwMjEzMjcyMTQ5MwkBImNhbGNSZW1haW5NYXJnaW5XaXRoRnVuZGluZ1BheW1lbnQEBQxwb3NpdGlvblNpemUFDnBvc2l0aW9uTWFyZ2luBRFwb3NpdGlvbkxzdFVwZENQRgUNdW5yZWFsaXplZFBubAQMcmVtYWluTWFyZ2luCAUNJHQwMjEzMjcyMTQ5MwJfMQQHYmFkRGVidAgFDSR0MDIxMzI3MjE0OTMCXzIJAQ9jYWxjTWFyZ2luUmF0aW8DBQxyZW1haW5NYXJnaW4FB2JhZERlYnQFEHBvc2l0aW9uTm90aW9uYWwBDmdldE1hcmdpblJhdGlvAQdfdHJhZGVyCQEWZ2V0TWFyZ2luUmF0aW9CeU9wdGlvbgIFB190cmFkZXIFD1BOTF9PUFRJT05fU1BPVAEbZ2V0UGFydGlhbExpcXVpZGF0aW9uQW1vdW50AgdfdHJhZGVyDV9wb3NpdGlvblNpemUEDG1heGltdW1SYXRpbwkBBHZtYXgCCQEXcGFydGlhbExpcXVpZGF0aW9uUmF0aW8ACQBlAgUMREVDSU1BTF9VTklUCQEEZGl2ZAIJAQ5nZXRNYXJnaW5SYXRpbwEFB190cmFkZXIJARZtYWludGVuYW5jZU1hcmdpblJhdGlvAAQYbWF4RXhjaGFuZ2VkUG9zaXRpb25TaXplCQEEbXVsZAIJAQNhYnMBBQ1fcG9zaXRpb25TaXplBQxtYXhpbXVtUmF0aW8ECnN3YXBSZXN1bHQJAQpzd2FwT3V0cHV0AwkAZgIFDV9wb3NpdGlvblNpemUAAAUYbWF4RXhjaGFuZ2VkUG9zaXRpb25TaXplBwQcbWF4RXhjaGFuZ2VkUXVvdGVBc3NldEFtb3VudAgFCnN3YXBSZXN1bHQCXzEEC3ByaWNlSW1wYWN0CAUKc3dhcFJlc3VsdAJfOAMJAGYCCQEObWF4UHJpY2VJbXBhY3QABQtwcmljZUltcGFjdAUcbWF4RXhjaGFuZ2VkUXVvdGVBc3NldEFtb3VudAQVZXhjaGFuZ2VkUG9zaXRpb25TaXplCQEEbXVsZAIJAQNhYnMBBQ1fcG9zaXRpb25TaXplCQEXcGFydGlhbExpcXVpZGF0aW9uUmF0aW8ABBlleGNoYW5nZWRRdW90ZUFzc2V0QW1vdW50CAkBCnN3YXBPdXRwdXQDCQBmAgUNX3Bvc2l0aW9uU2l6ZQAABRVleGNoYW5nZWRQb3NpdGlvblNpemUHAl8xBRlleGNoYW5nZWRRdW90ZUFzc2V0QW1vdW50ARVpbnRlcm5hbENsb3NlUG9zaXRpb24CB190cmFkZXIUX2NoZWNrTWF4UHJpY2VJbXBhY3QEDSR0MDIyNzI2MjI4NTQJAQtnZXRQb3NpdGlvbgEFB190cmFkZXIEDHBvc2l0aW9uU2l6ZQgFDSR0MDIyNzI2MjI4NTQCXzEEDnBvc2l0aW9uTWFyZ2luCAUNJHQwMjI3MjYyMjg1NAJfMgQUcG9zaXRpb25PcGVuTm90aW9uYWwIBQ0kdDAyMjcyNjIyODU0Al8zBBFwb3NpdGlvbkxzdFVwZENQRggFDSR0MDIyNzI2MjI4NTQCXzQEDXVucmVhbGl6ZWRQbmwICQEjZ2V0UG9zaXRpb25Ob3Rpb25hbEFuZFVucmVhbGl6ZWRQbmwCBQdfdHJhZGVyBQ9QTkxfT1BUSU9OX1NQT1QCXzIEDSR0MDIyOTQ5MjMxMTcJASJjYWxjUmVtYWluTWFyZ2luV2l0aEZ1bmRpbmdQYXltZW50BAUMcG9zaXRpb25TaXplBQ5wb3NpdGlvbk1hcmdpbgURcG9zaXRpb25Mc3RVcGRDUEYFDXVucmVhbGl6ZWRQbmwEDHJlbWFpbk1hcmdpbggFDSR0MDIyOTQ5MjMxMTcCXzEEB2JhZERlYnQIBQ0kdDAyMjk0OTIzMTE3Al8yBBVleGNoYW5nZWRQb3NpdGlvblNpemUJAQEtAQUMcG9zaXRpb25TaXplBAtyZWFsaXplZFBubAUNdW5yZWFsaXplZFBubAQNbWFyZ2luVG9WYXVsdAkBAS0BBQxyZW1haW5NYXJnaW4EDSR0MDIzMjQ0MjM1NTUJAQpzd2FwT3V0cHV0AwkAZgIFDHBvc2l0aW9uU2l6ZQAACQEDYWJzAQUMcG9zaXRpb25TaXplBRRfY2hlY2tNYXhQcmljZUltcGFjdAQZZXhjaGFuZ2VkUXVvdGVBc3NldEFtb3VudAgFDSR0MDIzMjQ0MjM1NTUCXzEEFnF1b3RlQXNzZXRSZXNlcnZlQWZ0ZXIIBQ0kdDAyMzI0NDIzNTU1Al8yBBViYXNlQXNzZXRSZXNlcnZlQWZ0ZXIIBQ0kdDAyMzI0NDIzNTU1Al8zBBZ0b3RhbFBvc2l0aW9uU2l6ZUFmdGVyCAUNJHQwMjMyNDQyMzU1NQJfNAQXY3VtdWxhdGl2ZU5vdGlvbmFsQWZ0ZXIIBQ0kdDAyMzI0NDIzNTU1Al81BA50b3RhbExvbmdBZnRlcggFDSR0MDIzMjQ0MjM1NTUCXzYED3RvdGFsU2hvcnRBZnRlcggFDSR0MDIzMjQ0MjM1NTUCXzcEGW9wZW5JbnRlcmVzdE5vdGlvbmFsQWZ0ZXIJAGUCCQEUb3BlbkludGVyZXN0Tm90aW9uYWwABRRwb3NpdGlvbk9wZW5Ob3Rpb25hbAkAngoMBRVleGNoYW5nZWRQb3NpdGlvblNpemUFB2JhZERlYnQFC3JlYWxpemVkUG5sBQ1tYXJnaW5Ub1ZhdWx0BRZxdW90ZUFzc2V0UmVzZXJ2ZUFmdGVyBRViYXNlQXNzZXRSZXNlcnZlQWZ0ZXIFFnRvdGFsUG9zaXRpb25TaXplQWZ0ZXIFF2N1bXVsYXRpdmVOb3Rpb25hbEFmdGVyBRlvcGVuSW50ZXJlc3ROb3Rpb25hbEFmdGVyBRlleGNoYW5nZWRRdW90ZUFzc2V0QW1vdW50BQ50b3RhbExvbmdBZnRlcgUPdG90YWxTaG9ydEFmdGVyARBnZXRUd2FwU3BvdFByaWNlAAQIbWludXRlSWQJAGkCCQBpAggFCWxhc3RCbG9jawl0aW1lc3RhbXAA6AcAPAQNc3RhcnRNaW51dGVJZAkAZQIFCG1pbnV0ZUlkBQ1UV0FQX0lOVEVSVkFMBAdsaXN0U3RyCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMFDWtfbGFzdERhdGFTdHICAAQEbGlzdAkAtQkCBQdsaXN0U3RyAgEsCgEIZmlsdGVyRm4CC2FjY3VtdWxhdG9yBG5leHQDCQBnAgUNc3RhcnRNaW51dGVJZAkBDXBhcnNlSW50VmFsdWUBBQRuZXh0CQDNCAIFC2FjY3VtdWxhdG9yCQENcGFyc2VJbnRWYWx1ZQEFBG5leHQFC2FjY3VtdWxhdG9yBAVsaXN0RgoAAiRsBQRsaXN0CgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQhmaWx0ZXJGbgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMjAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUBAhtYXhJbmRleAMJAGYCCQCQAwEFBWxpc3RGAAAJAJYDAQUFbGlzdEYJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQRsaXN0AAAEDGxhc3RNaW51dGVJZAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQ5rX2xhc3RNaW51dGVJZAAABBZlbmRMYXN0Q3VtdWxhdGl2ZVByaWNlCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkArAICBR1rX3R3YXBEYXRhTGFzdEN1bXVsYXRpdmVQcmljZQIBXwkApAMBBQxsYXN0TWludXRlSWQAAAQMZW5kTGFzdFByaWNlCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkArAICBRNrX3R3YXBEYXRhTGFzdFByaWNlAgFfCQCkAwEFDGxhc3RNaW51dGVJZAAABBJub3dDdW11bGF0aXZlUHJpY2UJAGQCBRZlbmRMYXN0Q3VtdWxhdGl2ZVByaWNlCQBoAgkAZQIFCG1pbnV0ZUlkBQxsYXN0TWludXRlSWQFDGVuZExhc3RQcmljZQQYc3RhcnRMYXN0Q3VtdWxhdGl2ZVByaWNlCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkArAICBR1rX3R3YXBEYXRhTGFzdEN1bXVsYXRpdmVQcmljZQIBXwkApAMBBQhtYXhJbmRleAAABA5zdGFydExhc3RQcmljZQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgUTa190d2FwRGF0YUxhc3RQcmljZQIBXwkApAMBBQhtYXhJbmRleAAABBRzdGFydEN1bXVsYXRpdmVQcmljZQkAZAIFGHN0YXJ0TGFzdEN1bXVsYXRpdmVQcmljZQkAaAIJAGUCBQ1zdGFydE1pbnV0ZUlkBQhtYXhJbmRleAUOc3RhcnRMYXN0UHJpY2UJAGkCCQBlAgUSbm93Q3VtdWxhdGl2ZVByaWNlBRRzdGFydEN1bXVsYXRpdmVQcmljZQUNVFdBUF9JTlRFUlZBTAEQZ2V0UGVnQWRqdXN0Q29zdAEGX3ByaWNlBA1fcG9zaXRpb25TaXplCQERdG90YWxQb3NpdGlvblNpemUABAlkaXJlY3Rpb24JAGYCBQ1fcG9zaXRpb25TaXplAAAEFWN1cnJlbnROZXRNYXJrZXRWYWx1ZQgJAQpzd2FwT3V0cHV0AwUJZGlyZWN0aW9uCQEDYWJzAQUNX3Bvc2l0aW9uU2l6ZQcCXzEEEGJhc2VBc3NldFJlc2VydmUJAQZic0FzdFIABBRuZXdRdW90ZUFzc2V0UmVzZXJ2ZQkBBG11bGQCBRBiYXNlQXNzZXRSZXNlcnZlBQZfcHJpY2UEBGNvc3QICQErZ2V0UG9zaXRpb25Ob3Rpb25hbEFuZFVucmVhbGl6ZWRQbmxCeVZhbHVlcwUFDV9wb3NpdGlvblNpemUFFWN1cnJlbnROZXRNYXJrZXRWYWx1ZQUUbmV3UXVvdGVBc3NldFJlc2VydmUFEGJhc2VBc3NldFJlc2VydmUFD1BOTF9PUFRJT05fU1BPVAJfMgkAlAoCBRRuZXdRdW90ZUFzc2V0UmVzZXJ2ZQUEY29zdAEKZ2V0RnVuZGluZwAED3VuZGVybHlpbmdQcmljZQkBEmdldE9yYWNsZVR3YXBQcmljZQAEDXNwb3RUd2FwUHJpY2UJARBnZXRUd2FwU3BvdFByaWNlAAQHcHJlbWl1bQkAZQIFDXNwb3RUd2FwUHJpY2UFD3VuZGVybHlpbmdQcmljZQMDCQAAAgkBFnRvdGFsU2hvcnRQb3NpdGlvblNpemUAAAAGCQAAAgkBFXRvdGFsTG9uZ1Bvc2l0aW9uU2l6ZQAAAAkAlAoCAAAAAAMJAGYCAAAFB3ByZW1pdW0EFHNob3J0UHJlbWl1bUZyYWN0aW9uCQEEZGl2ZAIJAQRtdWxkAgUHcHJlbWl1bQkBFGZ1bmRpbmdQZXJpb2REZWNpbWFsAAUHT05FX0RBWQQTbG9uZ1ByZW1pdW1GcmFjdGlvbgkBBGRpdmQCCQEEbXVsZAIFFHNob3J0UHJlbWl1bUZyYWN0aW9uCQEWdG90YWxTaG9ydFBvc2l0aW9uU2l6ZQAJARV0b3RhbExvbmdQb3NpdGlvblNpemUACQCUCgIFFHNob3J0UHJlbWl1bUZyYWN0aW9uBRNsb25nUHJlbWl1bUZyYWN0aW9uBBNsb25nUHJlbWl1bUZyYWN0aW9uCQEEZGl2ZAIJAQRtdWxkAgUHcHJlbWl1bQkBFGZ1bmRpbmdQZXJpb2REZWNpbWFsAAUHT05FX0RBWQQUc2hvcnRQcmVtaXVtRnJhY3Rpb24JAQRkaXZkAgkBBG11bGQCBRNsb25nUHJlbWl1bUZyYWN0aW9uCQEVdG90YWxMb25nUG9zaXRpb25TaXplAAkBFnRvdGFsU2hvcnRQb3NpdGlvblNpemUACQCUCgIFFHNob3J0UHJlbWl1bUZyYWN0aW9uBRNsb25nUHJlbWl1bUZyYWN0aW9uAQ51cGRhdGVTZXR0aW5ncwkQX2luaXRNYXJnaW5SYXRpbwRfbW1yFF9saXF1aWRhdGlvbkZlZVJhdGlvDl9mdW5kaW5nUGVyaW9kBF9mZWUMX3NwcmVhZExpbWl0D19tYXhQcmljZUltcGFjdBhfcGFydGlhbExpcXVpZGF0aW9uUmF0aW8PX21heFByaWNlU3ByZWFkCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRFrX2luaXRNYXJnaW5SYXRpbwUQX2luaXRNYXJnaW5SYXRpbwkAzAgCCQEMSW50ZWdlckVudHJ5AgUYa19tYWludGVuYW5jZU1hcmdpblJhdGlvBQRfbW1yCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRVrX2xpcXVpZGF0aW9uRmVlUmF0aW8FFF9saXF1aWRhdGlvbkZlZVJhdGlvCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ9rX2Z1bmRpbmdQZXJpb2QFDl9mdW5kaW5nUGVyaW9kCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQVrX2ZlZQUEX2ZlZQkAzAgCCQEMSW50ZWdlckVudHJ5AgUNa19zcHJlYWRMaW1pdAUMX3NwcmVhZExpbWl0CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRBrX21heFByaWNlSW1wYWN0BQ9fbWF4UHJpY2VJbXBhY3QJAMwIAgkBDEludGVnZXJFbnRyeQIFGWtfcGFydGlhbExpcXVpZGF0aW9uUmF0aW8FGF9wYXJ0aWFsTGlxdWlkYXRpb25SYXRpbwkAzAgCCQEMSW50ZWdlckVudHJ5AgUQa19tYXhQcmljZVNwcmVhZAUPX21heFByaWNlU3ByZWFkBQNuaWwBDXVwZGF0ZUZ1bmRpbmcFEV9uZXh0RnVuZGluZ0Jsb2NrJF9sYXRlc3RMb25nQ3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbiVfbGF0ZXN0U2hvcnRDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uEF9sb25nRnVuZGluZ1JhdGURX3Nob3J0RnVuZGluZ1JhdGUJAMwIAgkBDEludGVnZXJFbnRyeQIFEmtfbmV4dEZ1bmRpbmdCbG9jawURX25leHRGdW5kaW5nQmxvY2sJAMwIAgkBDEludGVnZXJFbnRyeQIFJWtfbGF0ZXN0TG9uZ0N1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24FJF9sYXRlc3RMb25nQ3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgkAzAgCCQEMSW50ZWdlckVudHJ5AgUma19sYXRlc3RTaG9ydEN1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24FJV9sYXRlc3RTaG9ydEN1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24JAMwIAgkBDEludGVnZXJFbnRyeQIFEWtfbG9uZ0Z1bmRpbmdSYXRlBRBfbG9uZ0Z1bmRpbmdSYXRlCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRJrX3Nob3J0RnVuZGluZ1JhdGUFEV9zaG9ydEZ1bmRpbmdSYXRlBQNuaWwBDnVwZGF0ZVBvc2l0aW9uBQhfYWRkcmVzcwVfc2l6ZQdfbWFyZ2luDV9vcGVuTm90aW9uYWwgX2xhdGVzdEN1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24JAMwIAgkBDEludGVnZXJFbnRyeQIJAQ50b0NvbXBvc2l0ZUtleQIFDmtfcG9zaXRpb25TaXplBQhfYWRkcmVzcwUFX3NpemUJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ50b0NvbXBvc2l0ZUtleQIFEGtfcG9zaXRpb25NYXJnaW4FCF9hZGRyZXNzBQdfbWFyZ2luCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEOdG9Db21wb3NpdGVLZXkCBRZrX3Bvc2l0aW9uT3Blbk5vdGlvbmFsBQhfYWRkcmVzcwUNX29wZW5Ob3Rpb25hbAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBDnRvQ29tcG9zaXRlS2V5AgUua19wb3NpdGlvbkxhc3RVcGRhdGVkQ3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgUIX2FkZHJlc3MFIF9sYXRlc3RDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uBQNuaWwBCmFwcGVuZFR3YXABBXByaWNlBAhtaW51dGVJZAkAaQIJAGkCCAUJbGFzdEJsb2NrCXRpbWVzdGFtcADoBwA8BBBwcmV2aW91c01pbnV0ZUlkCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFDmtfbGFzdE1pbnV0ZUlkAAADCQBmAgUQcHJldmlvdXNNaW51dGVJZAUIbWludXRlSWQJAAIBAhFUV0FQIG91dC1vZi1vcmRlcgQMbGFzdE1pbnV0ZUlkAwkAAAIFEHByZXZpb3VzTWludXRlSWQAAAUIbWludXRlSWQFEHByZXZpb3VzTWludXRlSWQDCQBmAgUIbWludXRlSWQFEHByZXZpb3VzTWludXRlSWQEE3ByZXZDdW11bGF0aXZlUHJpY2UJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCsAgIFHWtfdHdhcERhdGFMYXN0Q3VtdWxhdGl2ZVByaWNlAgFfCQCkAwEFEHByZXZpb3VzTWludXRlSWQAAAQJcHJldlByaWNlCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkArAICBRNrX3R3YXBEYXRhTGFzdFByaWNlAgFfCQCkAwEFEHByZXZpb3VzTWludXRlSWQFBXByaWNlBBNsYXN0Q3VtdWxhdGl2ZVByaWNlCQBkAgUTcHJldkN1bXVsYXRpdmVQcmljZQkAaAIJAGUCBQhtaW51dGVJZAUMbGFzdE1pbnV0ZUlkBQlwcmV2UHJpY2UEBGxpc3QJAQtwdXNoVG9RdWV1ZQMJAQlzdHJUb0xpc3QBCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMFDWtfbGFzdERhdGFTdHICAAUNVFdBUF9JTlRFUlZBTAkApAMBBQhtaW51dGVJZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBDnRvQ29tcG9zaXRlS2V5AgUda190d2FwRGF0YUxhc3RDdW11bGF0aXZlUHJpY2UJAKQDAQUIbWludXRlSWQFE2xhc3RDdW11bGF0aXZlUHJpY2UJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ50b0NvbXBvc2l0ZUtleQIFE2tfdHdhcERhdGFMYXN0UHJpY2UJAKQDAQUIbWludXRlSWQFBXByaWNlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEOdG9Db21wb3NpdGVLZXkCBRprX3R3YXBEYXRhUHJldmlvdXNNaW51dGVJZAkApAMBBQhtaW51dGVJZAUQcHJldmlvdXNNaW51dGVJZAkAzAgCCQEMSW50ZWdlckVudHJ5AgUOa19sYXN0TWludXRlSWQFCG1pbnV0ZUlkCQDMCAIJAQtTdHJpbmdFbnRyeQIFDWtfbGFzdERhdGFTdHIJAQlsaXN0VG9TdHIBBQRsaXN0BQNuaWwEGHR3YXBEYXRhUHJldmlvdXNNaW51dGVJZAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEOdG9Db21wb3NpdGVLZXkCBRprX3R3YXBEYXRhUHJldmlvdXNNaW51dGVJZAkApAMBBQhtaW51dGVJZAAABBNwcmV2Q3VtdWxhdGl2ZVByaWNlCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAQ50b0NvbXBvc2l0ZUtleQIFHWtfdHdhcERhdGFMYXN0Q3VtdWxhdGl2ZVByaWNlCQCkAwEFGHR3YXBEYXRhUHJldmlvdXNNaW51dGVJZAAABAlwcmV2UHJpY2UJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBDnRvQ29tcG9zaXRlS2V5AgUTa190d2FwRGF0YUxhc3RQcmljZQkApAMBBRh0d2FwRGF0YVByZXZpb3VzTWludXRlSWQFBXByaWNlBBNsYXN0Q3VtdWxhdGl2ZVByaWNlCQBkAgUTcHJldkN1bXVsYXRpdmVQcmljZQkAaAIJAGUCBQhtaW51dGVJZAUYdHdhcERhdGFQcmV2aW91c01pbnV0ZUlkBQlwcmV2UHJpY2UJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ50b0NvbXBvc2l0ZUtleQIFHWtfdHdhcERhdGFMYXN0Q3VtdWxhdGl2ZVByaWNlCQCkAwEFCG1pbnV0ZUlkBRNsYXN0Q3VtdWxhdGl2ZVByaWNlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEOdG9Db21wb3NpdGVLZXkCBRNrX3R3YXBEYXRhTGFzdFByaWNlCQCkAwEFCG1pbnV0ZUlkBQVwcmljZQUDbmlsARF1cGRhdGVBbW1SZXNlcnZlcwIHX3F0QXN0UgdfYnNBc3RSCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRNrX3F1b3RlQXNzZXRSZXNlcnZlBQdfcXRBc3RSCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRJrX2Jhc2VBc3NldFJlc2VydmUFB19ic0FzdFIFA25pbAEJdXBkYXRlQW1tBwdfcXRBc3RSB19ic0FzdFIXX3RvdGFsUG9zaXRpb25TaXplQWZ0ZXIYX2N1bXVsYXRpdmVOb3Rpb25hbEFmdGVyFV9vcGVuSW50ZXJlc3ROb3Rpb25hbBZfdG90YWxMb25nUG9zaXRpb25TaXplF190b3RhbFNob3J0UG9zaXRpb25TaXplAwkBAiE9AgkAZQIFFl90b3RhbExvbmdQb3NpdGlvblNpemUFF190b3RhbFNob3J0UG9zaXRpb25TaXplBRdfdG90YWxQb3NpdGlvblNpemVBZnRlcgkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAhhJbnZhbGlkIEFNTSBzdGF0ZSBkYXRhOiAJAKQDAQUWX3RvdGFsTG9uZ1Bvc2l0aW9uU2l6ZQIEICsgIAkApAMBBRdfdG90YWxTaG9ydFBvc2l0aW9uU2l6ZQIEICE9IAkApAMBBRdfdG90YWxQb3NpdGlvblNpemVBZnRlcgkAzggCCQDOCAIJARF1cGRhdGVBbW1SZXNlcnZlcwIFB19xdEFzdFIFB19ic0FzdFIJAMwIAgkBDEludGVnZXJFbnRyeQIFE2tfdG90YWxQb3NpdGlvblNpemUFF190b3RhbFBvc2l0aW9uU2l6ZUFmdGVyCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRRrX2N1bXVsYXRpdmVOb3Rpb25hbAUYX2N1bXVsYXRpdmVOb3Rpb25hbEFmdGVyCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRZrX29wZW5JbnRlcmVzdE5vdGlvbmFsBRVfb3BlbkludGVyZXN0Tm90aW9uYWwJAMwIAgkBDEludGVnZXJFbnRyeQIFF2tfdG90YWxMb25nUG9zaXRpb25TaXplBRZfdG90YWxMb25nUG9zaXRpb25TaXplCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRhrX3RvdGFsU2hvcnRQb3NpdGlvblNpemUFF190b3RhbFNob3J0UG9zaXRpb25TaXplBQNuaWwJAQphcHBlbmRUd2FwAQkBBGRpdmQCBQdfcXRBc3RSBQdfYnNBc3RSAQ5kZWxldGVQb3NpdGlvbgEIX2FkZHJlc3MJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBDnRvQ29tcG9zaXRlS2V5AgUOa19wb3NpdGlvblNpemUFCF9hZGRyZXNzCQDMCAIJAQtEZWxldGVFbnRyeQEJAQ50b0NvbXBvc2l0ZUtleQIFEGtfcG9zaXRpb25NYXJnaW4FCF9hZGRyZXNzCQDMCAIJAQtEZWxldGVFbnRyeQEJAQ50b0NvbXBvc2l0ZUtleQIFFmtfcG9zaXRpb25PcGVuTm90aW9uYWwFCF9hZGRyZXNzCQDMCAIJAQtEZWxldGVFbnRyeQEJAQ50b0NvbXBvc2l0ZUtleQIFLmtfcG9zaXRpb25MYXN0VXBkYXRlZEN1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24FCF9hZGRyZXNzCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEOdG9Db21wb3NpdGVLZXkCBRRrX3Bvc2l0aW9uQ2xvc2VkRGF0ZQUIX2FkZHJlc3MIBQlsYXN0QmxvY2sJdGltZXN0YW1wBQNuaWwBCHdpdGhkcmF3AghfYWRkcmVzcwdfYW1vdW50BAdiYWxhbmNlCQDwBwIFBHRoaXMJAQpxdW90ZUFzc2V0AAMJAGYCBQdfYW1vdW50BQdiYWxhbmNlCQACAQkArAICCQCsAgIJAKwCAgITVW5hYmxlIHRvIHdpdGhkcmF3IAkApAMBBQdfYW1vdW50AhcgZnJvbSBjb250cmFjdCBiYWxhbmNlIAkApAMBBQdiYWxhbmNlCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFCF9hZGRyZXNzBQdfYW1vdW50CQEKcXVvdGVBc3NldAAFA25pbAENdXBkYXRlQmFsYW5jZQEBaQMJAGYCAAAFAWkJAAIBAgdCYWxhbmNlCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQlrX2JhbGFuY2UFAWkFA25pbAELdHJhbnNmZXJGZWUBAWkJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBDnN0YWtpbmdBZGRyZXNzAAUBaQkBCnF1b3RlQXNzZXQABQNuaWwUAWkBBXBhdXNlAAMJAQIhPQIIBQFpBmNhbGxlcgkBDGFkbWluQWRkcmVzcwAJAAIBAhpJbnZhbGlkIHRvZ2dsZVBhdXNlIHBhcmFtcwkAzAgCCQEMQm9vbGVhbkVudHJ5AgUIa19wYXVzZWQGBQNuaWwBaQEHdW5wYXVzZQADCQECIT0CCAUBaQZjYWxsZXIJAQxhZG1pbkFkZHJlc3MACQACAQIaSW52YWxpZCB0b2dnbGVQYXVzZSBwYXJhbXMJAMwIAgkBDEJvb2xlYW5FbnRyeQIFCGtfcGF1c2VkBwUDbmlsAWkBDGFkZExpcXVpZGl0eQERX3F1b3RlQXNzZXRBbW91bnQDAwkBAiE9AggFAWkGY2FsbGVyCQEMYWRtaW5BZGRyZXNzAAYJAGcCAAAFEV9xdW90ZUFzc2V0QW1vdW50CQACAQIbSW52YWxpZCBhZGRMaXF1aWRpdHkgcGFyYW1zBAdfcXRBc3RSCQEGcXRBc3RSAAQHX2JzQXN0UgkBBmJzQXN0UgAEBXByaWNlCQEEZGl2ZAIFB19xdEFzdFIFB19ic0FzdFIEFGJhc2VBc3NldEFtb3VudFRvQWRkCQEEZGl2ZAIFEV9xdW90ZUFzc2V0QW1vdW50BQVwcmljZQQLcXRBc3RSQWZ0ZXIJAGQCBQdfcXRBc3RSBRFfcXVvdGVBc3NldEFtb3VudAQLYnNBc3RSQWZ0ZXIJAGQCBQdfYnNBc3RSBRRiYXNlQXNzZXRBbW91bnRUb0FkZAkBEXVwZGF0ZUFtbVJlc2VydmVzAgULcXRBc3RSQWZ0ZXIFC2JzQXN0UkFmdGVyAWkBD3JlbW92ZUxpcXVpZGl0eQERX3F1b3RlQXNzZXRBbW91bnQDAwkBAiE9AggFAWkGY2FsbGVyCQEMYWRtaW5BZGRyZXNzAAYJAGcCAAAFEV9xdW90ZUFzc2V0QW1vdW50CQACAQIeSW52YWxpZCByZW1vdmVMaXF1aWRpdHkgcGFyYW1zBAdfcXRBc3RSCQEGcXRBc3RSAAQHX2JzQXN0UgkBBmJzQXN0UgAEBXByaWNlCQEEZGl2ZAIFB19xdEFzdFIFB19ic0FzdFIEF2Jhc2VBc3NldEFtb3VudFRvUmVtb3ZlCQEEZGl2ZAIFEV9xdW90ZUFzc2V0QW1vdW50BQVwcmljZQQLcXRBc3RSQWZ0ZXIJAGUCBQdfcXRBc3RSBRFfcXVvdGVBc3NldEFtb3VudAQLYnNBc3RSQWZ0ZXIJAGUCBQdfYnNBc3RSBRdiYXNlQXNzZXRBbW91bnRUb1JlbW92ZQkBEXVwZGF0ZUFtbVJlc2VydmVzAgULcXRBc3RSQWZ0ZXIFC2JzQXN0UkFmdGVyAWkBDmNoYW5nZVNldHRpbmdzCRBfaW5pdE1hcmdpblJhdGlvBF9tbXIUX2xpcXVpZGF0aW9uRmVlUmF0aW8OX2Z1bmRpbmdQZXJpb2QEX2ZlZQxfc3ByZWFkTGltaXQPX21heFByaWNlSW1wYWN0GF9wYXJ0aWFsTGlxdWlkYXRpb25SYXRpbw9fbWF4UHJpY2VTcHJlYWQDCQECIT0CCAUBaQZjYWxsZXIJAQxhZG1pbkFkZHJlc3MACQACAQIdSW52YWxpZCBjaGFuZ2VTZXR0aW5ncyBwYXJhbXMJAQ51cGRhdGVTZXR0aW5ncwkFEF9pbml0TWFyZ2luUmF0aW8FBF9tbXIFFF9saXF1aWRhdGlvbkZlZVJhdGlvBQ5fZnVuZGluZ1BlcmlvZAUEX2ZlZQUMX3NwcmVhZExpbWl0BQ9fbWF4UHJpY2VJbXBhY3QFGF9wYXJ0aWFsTGlxdWlkYXRpb25SYXRpbwUPX21heFByaWNlU3ByZWFkAWkBCmluaXRpYWxpemUOB19xdEFzdFIHX2JzQXN0Ug5fZnVuZGluZ1BlcmlvZBBfaW5pdE1hcmdpblJhdGlvBF9tbXIUX2xpcXVpZGF0aW9uRmVlUmF0aW8EX2ZlZQdfb3JhY2xlCl9vcmFjbGVLZXkMX2Nvb3JkaW5hdG9yDF9zcHJlYWRMaW1pdA9fbWF4UHJpY2VJbXBhY3QYX3BhcnRpYWxMaXF1aWRhdGlvblJhdGlvD19tYXhQcmljZVNwcmVhZAMDAwMDAwMDAwMDAwkAZwIAAAUHX3F0QXN0UgYJAGcCAAAFB19ic0FzdFIGCQBnAgAABQ5fZnVuZGluZ1BlcmlvZAYJAGcCAAAFEF9pbml0TWFyZ2luUmF0aW8GCQBnAgAABQRfbW1yBgkAZwIAAAUUX2xpcXVpZGF0aW9uRmVlUmF0aW8GCQBnAgAABQRfZmVlBgkAZwIAAAUMX3NwcmVhZExpbWl0BgkAZwIAAAUPX21heFByaWNlSW1wYWN0BgkAZwIAAAUYX3BhcnRpYWxMaXF1aWRhdGlvblJhdGlvBgkAZwIAAAUPX21heFByaWNlU3ByZWFkBgkBC2luaXRpYWxpemVkAAkAAgECHUludmFsaWQgaW5pdGlhbGl6ZSBwYXJhbWV0ZXJzCQDOCAIJAM4IAgkAzggCCQDOCAIJAQl1cGRhdGVBbW0HBQdfcXRBc3RSBQdfYnNBc3RSAAAAAAAAAAAAAAkBDnVwZGF0ZVNldHRpbmdzCQUQX2luaXRNYXJnaW5SYXRpbwUEX21tcgUUX2xpcXVpZGF0aW9uRmVlUmF0aW8FDl9mdW5kaW5nUGVyaW9kBQRfZmVlBQxfc3ByZWFkTGltaXQFD19tYXhQcmljZUltcGFjdAUYX3BhcnRpYWxMaXF1aWRhdGlvblJhdGlvBQ9fbWF4UHJpY2VTcHJlYWQJAQ11cGRhdGVGdW5kaW5nBQkAZAIIBQlsYXN0QmxvY2sJdGltZXN0YW1wBQ5fZnVuZGluZ1BlcmlvZAAAAAAAAAAACQENdXBkYXRlQmFsYW5jZQEAAAkAzAgCCQEMQm9vbGVhbkVudHJ5AgUNa19pbml0aWFsaXplZAYJAMwIAgkBC1N0cmluZ0VudHJ5AgUFa19vcmEFB19vcmFjbGUJAMwIAgkBC1N0cmluZ0VudHJ5AgUJa19vcmFfa2V5BQpfb3JhY2xlS2V5CQDMCAIJAQtTdHJpbmdFbnRyeQIFFGtfY29vcmRpbmF0b3JBZGRyZXNzBQxfY29vcmRpbmF0b3IFA25pbAFpARJzZXRJbml0TWFyZ2luUmF0aW8BEF9pbml0TWFyZ2luUmF0aW8DAwkAZwIAAAUQX2luaXRNYXJnaW5SYXRpbwYJAQEhAQkBC2luaXRpYWxpemVkAAkAAgECJUludmFsaWQgc2V0SW5pdE1hcmdpblJhdGlvIHBhcmFtZXRlcnMJAQ51cGRhdGVTZXR0aW5ncwkFEF9pbml0TWFyZ2luUmF0aW8JARZtYWludGVuYW5jZU1hcmdpblJhdGlvAAkBE2xpcXVpZGF0aW9uRmVlUmF0aW8ACQEQZnVuZGluZ1BlcmlvZFJhdwAJAQNmZWUACQELc3ByZWFkTGltaXQACQEObWF4UHJpY2VJbXBhY3QACQEXcGFydGlhbExpcXVpZGF0aW9uUmF0aW8ACQEObWF4UHJpY2VTcHJlYWQAAWkBEGRlY3JlYXNlUG9zaXRpb24DB19hbW91bnQJX2xldmVyYWdlE19taW5CYXNlQXNzZXRBbW91bnQDAwMDAwkAZwIAAAUHX2Ftb3VudAYJAQEhAQkBC2luaXRpYWxpemVkAAYJAQEhAQkBFnJlcXVpcmVNb3JlTWFyZ2luUmF0aW8DCQEEZGl2ZAIFDERFQ0lNQUxfVU5JVAUJX2xldmVyYWdlCQEPaW5pdE1hcmdpblJhdGlvAAYGCQEBIQEJARNyZXF1aXJlT3BlblBvc2l0aW9uAQkApQgBCAUBaQZjYWxsZXIGCQEGcGF1c2VkAAkAAgECI0ludmFsaWQgZGVjcmVhc2VQb3NpdGlvbiBwYXJhbWV0ZXJzBA0kdDAzNzMzMTM3NDgzCQELZ2V0UG9zaXRpb24BCQClCAEIBQFpBmNhbGxlcgQPb2xkUG9zaXRpb25TaXplCAUNJHQwMzczMzEzNzQ4MwJfMQQRb2xkUG9zaXRpb25NYXJnaW4IBQ0kdDAzNzMzMTM3NDgzAl8yBBdvbGRQb3NpdGlvbk9wZW5Ob3Rpb25hbAgFDSR0MDM3MzMxMzc0ODMCXzMEFG9sZFBvc2l0aW9uTHN0VXBkQ1BGCAUNJHQwMzczMzEzNzQ4MwJfNAQKX2RpcmVjdGlvbgMJAGYCBQ9vbGRQb3NpdGlvblNpemUAAAUJRElSX1NIT1JUBQhESVJfTE9ORwQFaXNBZGQJAAACBQpfZGlyZWN0aW9uBQhESVJfTE9ORwQMb3Blbk5vdGlvbmFsCQEEbXVsZAIFB19hbW91bnQFCV9sZXZlcmFnZQQNJHQwMzc2NTYzNzc3MgkBI2dldFBvc2l0aW9uTm90aW9uYWxBbmRVbnJlYWxpemVkUG5sAgkApQgBCAUBaQZjYWxsZXIFD1BOTF9PUFRJT05fU1BPVAQTb2xkUG9zaXRpb25Ob3Rpb25hbAgFDSR0MDM3NjU2Mzc3NzICXzEEDXVucmVhbGl6ZWRQbmwIBQ0kdDAzNzY1NjM3NzcyAl8yBA0kdDAzNzc3ODQwMzI3AwkAZgIFE29sZFBvc2l0aW9uTm90aW9uYWwFDG9wZW5Ob3Rpb25hbAQNJHQwMzgxNTUzODM3NAkBCXN3YXBJbnB1dAIFBWlzQWRkBQxvcGVuTm90aW9uYWwEFWV4Y2hhbmdlZFBvc2l0aW9uU2l6ZQgFDSR0MDM4MTU1MzgzNzQCXzEEFnF1b3RlQXNzZXRSZXNlcnZlQWZ0ZXIIBQ0kdDAzODE1NTM4Mzc0Al8yBBViYXNlQXNzZXRSZXNlcnZlQWZ0ZXIIBQ0kdDAzODE1NTM4Mzc0Al8zBBZ0b3RhbFBvc2l0aW9uU2l6ZUFmdGVyCAUNJHQwMzgxNTUzODM3NAJfNAQXY3VtdWxhdGl2ZU5vdGlvbmFsQWZ0ZXIIBQ0kdDAzODE1NTM4Mzc0Al81BBhleGNoYW5nZWRQb3NpdGlvblNpemVBYnMJAQNhYnMBBRVleGNoYW5nZWRQb3NpdGlvblNpemUDAwkBAiE9AgUTX21pbkJhc2VBc3NldEFtb3VudAAACQBmAgUTX21pbkJhc2VBc3NldEFtb3VudAUYZXhjaGFuZ2VkUG9zaXRpb25TaXplQWJzBwkAAgEJAKwCAgkArAICCQCsAgICJVRvbyBsaXR0bGUgYmFzZSBhc3NldCBleGNoYW5nZWQsIGdvdCAJAKQDAQUYZXhjaGFuZ2VkUG9zaXRpb25TaXplQWJzAgogZXhwZWN0ZWQgCQCkAwEFE19taW5CYXNlQXNzZXRBbW91bnQEC3JlYWxpemVkUG5sCQEEZGl2ZAIJAQRtdWxkAgUNdW5yZWFsaXplZFBubAUYZXhjaGFuZ2VkUG9zaXRpb25TaXplQWJzCQEDYWJzAQUPb2xkUG9zaXRpb25TaXplBA0kdDAzODgxMTM5MDU2CQEiY2FsY1JlbWFpbk1hcmdpbldpdGhGdW5kaW5nUGF5bWVudAQFD29sZFBvc2l0aW9uU2l6ZQURb2xkUG9zaXRpb25NYXJnaW4FFG9sZFBvc2l0aW9uTHN0VXBkQ1BGBQtyZWFsaXplZFBubAQMcmVtYWluTWFyZ2luCAUNJHQwMzg4MTEzOTA1NgJfMQQHYmFkRGVidAgFDSR0MDM4ODExMzkwNTYCXzIEDmZ1bmRpbmdQYXltZW50CAUNJHQwMzg4MTEzOTA1NgJfMwQZZXhjaGFuZ2VkUXVvdGVBc3NldEFtb3VudAUMb3Blbk5vdGlvbmFsBBJ1bnJlYWxpemVkUG5sQWZ0ZXIJAGUCBQ11bnJlYWxpemVkUG5sBQtyZWFsaXplZFBubAQScmVtYWluT3Blbk5vdGlvbmFsAwkAZgIFD29sZFBvc2l0aW9uU2l6ZQAACQBlAgkAZQIFE29sZFBvc2l0aW9uTm90aW9uYWwFGWV4Y2hhbmdlZFF1b3RlQXNzZXRBbW91bnQFEnVucmVhbGl6ZWRQbmxBZnRlcgkAZQIJAGQCBRJ1bnJlYWxpemVkUG5sQWZ0ZXIFE29sZFBvc2l0aW9uTm90aW9uYWwFGWV4Y2hhbmdlZFF1b3RlQXNzZXRBbW91bnQED25ld1Bvc2l0aW9uU2l6ZQkAZAIFD29sZFBvc2l0aW9uU2l6ZQUVZXhjaGFuZ2VkUG9zaXRpb25TaXplCQCdCgsFD25ld1Bvc2l0aW9uU2l6ZQUMcmVtYWluTWFyZ2luCQEDYWJzAQUScmVtYWluT3Blbk5vdGlvbmFsCQEfbGF0ZXN0Q3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgEFD25ld1Bvc2l0aW9uU2l6ZQUVYmFzZUFzc2V0UmVzZXJ2ZUFmdGVyBRZxdW90ZUFzc2V0UmVzZXJ2ZUFmdGVyBRZ0b3RhbFBvc2l0aW9uU2l6ZUFmdGVyBRdjdW11bGF0aXZlTm90aW9uYWxBZnRlcgkAZQIJARRvcGVuSW50ZXJlc3ROb3Rpb25hbAAFDG9wZW5Ob3Rpb25hbAkAZQIJARV0b3RhbExvbmdQb3NpdGlvblNpemUAAwkAZgIFD25ld1Bvc2l0aW9uU2l6ZQAACQEDYWJzAQUVZXhjaGFuZ2VkUG9zaXRpb25TaXplAAAJAGUCCQEWdG90YWxTaG9ydFBvc2l0aW9uU2l6ZQADCQBmAgAABQ9uZXdQb3NpdGlvblNpemUJAQNhYnMBBRVleGNoYW5nZWRQb3NpdGlvblNpemUAAAkAAgECFENsb3NlIHBvc2l0aW9uIGZpcnN0BA9uZXdQb3NpdGlvblNpemUIBQ0kdDAzNzc3ODQwMzI3Al8xBBduZXdQb3NpdGlvblJlbWFpbk1hcmdpbggFDSR0MDM3Nzc4NDAzMjcCXzIEF25ld1Bvc2l0aW9uT3Blbk5vdGlvbmFsCAUNJHQwMzc3Nzg0MDMyNwJfMwQUbmV3UG9zaXRpb25MYXRlc3RDUEYIBQ0kdDAzNzc3ODQwMzI3Al80BBViYXNlQXNzZXRSZXNlcnZlQWZ0ZXIIBQ0kdDAzNzc3ODQwMzI3Al81BBZxdW90ZUFzc2V0UmVzZXJ2ZUFmdGVyCAUNJHQwMzc3Nzg0MDMyNwJfNgQWdG90YWxQb3NpdGlvblNpemVBZnRlcggFDSR0MDM3Nzc4NDAzMjcCXzcEF2N1bXVsYXRpdmVOb3Rpb25hbEFmdGVyCAUNJHQwMzc3Nzg0MDMyNwJfOAQZb3BlbkludGVyZXN0Tm90aW9uYWxBZnRlcggFDSR0MDM3Nzc4NDAzMjcCXzkEDnRvdGFsTG9uZ0FmdGVyCAUNJHQwMzc3Nzg0MDMyNwNfMTAED3RvdGFsU2hvcnRBZnRlcggFDSR0MDM3Nzc4NDAzMjcDXzExBA5ub3RpZnlOb3Rpb25hbAkA/AcECQEMbWluZXJBZGRyZXNzAAIObm90aWZ5Tm90aW9uYWwJAMwIAgkApQgBCAUBaQZjYWxsZXIJAMwIAgUXbmV3UG9zaXRpb25PcGVuTm90aW9uYWwFA25pbAUDbmlsAwkAAAIFDm5vdGlmeU5vdGlvbmFsBQ5ub3RpZnlOb3Rpb25hbAkAzggCCQEOdXBkYXRlUG9zaXRpb24FCQClCAEIBQFpBmNhbGxlcgUPbmV3UG9zaXRpb25TaXplBRduZXdQb3NpdGlvblJlbWFpbk1hcmdpbgUXbmV3UG9zaXRpb25PcGVuTm90aW9uYWwFFG5ld1Bvc2l0aW9uTGF0ZXN0Q1BGCQEJdXBkYXRlQW1tBwUWcXVvdGVBc3NldFJlc2VydmVBZnRlcgUVYmFzZUFzc2V0UmVzZXJ2ZUFmdGVyBRZ0b3RhbFBvc2l0aW9uU2l6ZUFmdGVyBRdjdW11bGF0aXZlTm90aW9uYWxBZnRlcgUZb3BlbkludGVyZXN0Tm90aW9uYWxBZnRlcgUOdG90YWxMb25nQWZ0ZXIFD3RvdGFsU2hvcnRBZnRlcgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARBpbmNyZWFzZVBvc2l0aW9uBApfZGlyZWN0aW9uCV9sZXZlcmFnZRNfbWluQmFzZUFzc2V0QW1vdW50CF9yZWZMaW5rBApfcmF3QW1vdW50CAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAMDAwMDAwMJAQIhPQIFCl9kaXJlY3Rpb24FCERJUl9MT05HCQECIT0CBQpfZGlyZWN0aW9uBQlESVJfU0hPUlQHBgkAZwIAAAUKX3Jhd0Ftb3VudAYJAQEhAQkBC2luaXRpYWxpemVkAAYJAQIhPQIICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAkBCnF1b3RlQXNzZXQABgkBASEBCQEWcmVxdWlyZU1vcmVNYXJnaW5SYXRpbwMJAQRkaXZkAgUMREVDSU1BTF9VTklUBQlfbGV2ZXJhZ2UJAQ9pbml0TWFyZ2luUmF0aW8ABgYJAQZwYXVzZWQACQACAQIjSW52YWxpZCBpbmNyZWFzZVBvc2l0aW9uIHBhcmFtZXRlcnMEB190cmFkZXIJAKUIAQgFAWkGY2FsbGVyBAxyYXdGZWVBbW91bnQJAQRtdWxkAgUKX3Jhd0Ftb3VudAkBA2ZlZQAEDnJlZmVycmVyRmVlQW55CQD8BwQJAQ9yZWZlcnJhbEFkZHJlc3MAAhVhY2NlcHRQYXltZW50V2l0aExpbmsJAMwIAgUHX3RyYWRlcgkAzAgCBQhfcmVmTGluawUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEKcXVvdGVBc3NldAAFDHJhd0ZlZUFtb3VudAUDbmlsAwkAAAIFDnJlZmVycmVyRmVlQW55BQ5yZWZlcnJlckZlZUFueQQLcmVmZXJyZXJGZWUEByRtYXRjaDAFDnJlZmVycmVyRmVlQW55AwkAAQIFByRtYXRjaDACA0ludAQBeAUHJG1hdGNoMAUBeAkAAgECE0ludmFsaWQgcmVmZXJyZXJGZWUEB19hbW91bnQJAGUCBQpfcmF3QW1vdW50BQxyYXdGZWVBbW91bnQECWZlZUFtb3VudAkAZQIFDHJhd0ZlZUFtb3VudAULcmVmZXJyZXJGZWUEDSR0MDQxODU2NDE5OTYJAQtnZXRQb3NpdGlvbgEFB190cmFkZXIED29sZFBvc2l0aW9uU2l6ZQgFDSR0MDQxODU2NDE5OTYCXzEEEW9sZFBvc2l0aW9uTWFyZ2luCAUNJHQwNDE4NTY0MTk5NgJfMgQXb2xkUG9zaXRpb25PcGVuTm90aW9uYWwIBQ0kdDA0MTg1NjQxOTk2Al8zBBRvbGRQb3NpdGlvbkxzdFVwZENQRggFDSR0MDQxODU2NDE5OTYCXzQEDWlzTmV3UG9zaXRpb24JAAACBQ9vbGRQb3NpdGlvblNpemUAAAQPaXNTYW1lRGlyZWN0aW9uAwkAZgIFD29sZFBvc2l0aW9uU2l6ZQAACQAAAgUKX2RpcmVjdGlvbgUIRElSX0xPTkcJAAACBQpfZGlyZWN0aW9uBQlESVJfU0hPUlQEDmV4cGFuZEV4aXN0aW5nAwkBASEBBQ1pc05ld1Bvc2l0aW9uBQ9pc1NhbWVEaXJlY3Rpb24HBAVpc0FkZAkAAAIFCl9kaXJlY3Rpb24FCERJUl9MT05HBA0kdDA0MjI4NTQ0ODUzAwMFDWlzTmV3UG9zaXRpb24GBQ5leHBhbmRFeGlzdGluZwQMb3Blbk5vdGlvbmFsCQEEbXVsZAIFB19hbW91bnQFCV9sZXZlcmFnZQQNJHQwNDI3MDk0MjkxNQkBCXN3YXBJbnB1dAIFBWlzQWRkBQxvcGVuTm90aW9uYWwEFWFtb3VudEJhc2VBc3NldEJvdWdodAgFDSR0MDQyNzA5NDI5MTUCXzEEFnF1b3RlQXNzZXRSZXNlcnZlQWZ0ZXIIBQ0kdDA0MjcwOTQyOTE1Al8yBBViYXNlQXNzZXRSZXNlcnZlQWZ0ZXIIBQ0kdDA0MjcwOTQyOTE1Al8zBBZ0b3RhbFBvc2l0aW9uU2l6ZUFmdGVyCAUNJHQwNDI3MDk0MjkxNQJfNAQXY3VtdWxhdGl2ZU5vdGlvbmFsQWZ0ZXIIBQ0kdDA0MjcwOTQyOTE1Al81AwMJAQIhPQIFE19taW5CYXNlQXNzZXRBbW91bnQAAAkAZgIFE19taW5CYXNlQXNzZXRBbW91bnQJAQNhYnMBBRVhbW91bnRCYXNlQXNzZXRCb3VnaHQHCQACAQkArAICCQCsAgIJAKwCAgINTGltaXQgZXJyb3I6IAkApAMBCQEDYWJzAQUVYW1vdW50QmFzZUFzc2V0Qm91Z2h0AgMgPCAJAKQDAQUTX21pbkJhc2VBc3NldEFtb3VudAQPbmV3UG9zaXRpb25TaXplCQBkAgUPb2xkUG9zaXRpb25TaXplBRVhbW91bnRCYXNlQXNzZXRCb3VnaHQEGWluY3JlYXNlTWFyZ2luUmVxdWlyZW1lbnQJAQRkaXZkAgUMb3Blbk5vdGlvbmFsBQlfbGV2ZXJhZ2UEDSR0MDQzMjk2NDM1MzUJASJjYWxjUmVtYWluTWFyZ2luV2l0aEZ1bmRpbmdQYXltZW50BAUPb2xkUG9zaXRpb25TaXplBRFvbGRQb3NpdGlvbk1hcmdpbgUUb2xkUG9zaXRpb25Mc3RVcGRDUEYFGWluY3JlYXNlTWFyZ2luUmVxdWlyZW1lbnQEDHJlbWFpbk1hcmdpbggFDSR0MDQzMjk2NDM1MzUCXzEEAngxCAUNJHQwNDMyOTY0MzUzNQJfMgQCeDIIBQ0kdDA0MzI5NjQzNTM1Al8zAwkBASEBCQEZcmVxdWlyZU5vdE92ZXJTcHJlYWRMaW1pdAIFFnF1b3RlQXNzZXRSZXNlcnZlQWZ0ZXIFFWJhc2VBc3NldFJlc2VydmVBZnRlcgkAAgECFU92ZXIgbWF4IHNwcmVhZCBsaW1pdAkAnQoLBQ9uZXdQb3NpdGlvblNpemUFDHJlbWFpbk1hcmdpbgkAZAIFF29sZFBvc2l0aW9uT3Blbk5vdGlvbmFsBQxvcGVuTm90aW9uYWwJAR9sYXRlc3RDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uAQUPbmV3UG9zaXRpb25TaXplBRViYXNlQXNzZXRSZXNlcnZlQWZ0ZXIFFnF1b3RlQXNzZXRSZXNlcnZlQWZ0ZXIFFnRvdGFsUG9zaXRpb25TaXplQWZ0ZXIFF2N1bXVsYXRpdmVOb3Rpb25hbEFmdGVyCQBkAgkBFG9wZW5JbnRlcmVzdE5vdGlvbmFsAAUMb3Blbk5vdGlvbmFsCQBkAgkBFXRvdGFsTG9uZ1Bvc2l0aW9uU2l6ZQADCQBmAgUPbmV3UG9zaXRpb25TaXplAAAJAQNhYnMBBRVhbW91bnRCYXNlQXNzZXRCb3VnaHQAAAkAZAIJARZ0b3RhbFNob3J0UG9zaXRpb25TaXplAAMJAGYCAAAFD25ld1Bvc2l0aW9uU2l6ZQkBA2FicwEFFWFtb3VudEJhc2VBc3NldEJvdWdodAAABAxvcGVuTm90aW9uYWwJAQRtdWxkAgUHX2Ftb3VudAUJX2xldmVyYWdlBA0kdDA0NDU0NjQ0NjYyCQEjZ2V0UG9zaXRpb25Ob3Rpb25hbEFuZFVucmVhbGl6ZWRQbmwCCQClCAEIBQFpBmNhbGxlcgUPUE5MX09QVElPTl9TUE9UBBNvbGRQb3NpdGlvbk5vdGlvbmFsCAUNJHQwNDQ1NDY0NDY2MgJfMQQNdW5yZWFsaXplZFBubAgFDSR0MDQ0NTQ2NDQ2NjICXzIDCQBmAgUTb2xkUG9zaXRpb25Ob3Rpb25hbAUMb3Blbk5vdGlvbmFsCQACAQIuVXNlIGRlY3JlYXNlUG9zaXRpb24gdG8gZGVjcmVhc2UgcG9zaXRpb24gc2l6ZQkAAgECFENsb3NlIHBvc2l0aW9uIGZpcnN0BA9uZXdQb3NpdGlvblNpemUIBQ0kdDA0MjI4NTQ0ODUzAl8xBBduZXdQb3NpdGlvblJlbWFpbk1hcmdpbggFDSR0MDQyMjg1NDQ4NTMCXzIEF25ld1Bvc2l0aW9uT3Blbk5vdGlvbmFsCAUNJHQwNDIyODU0NDg1MwJfMwQUbmV3UG9zaXRpb25MYXRlc3RDUEYIBQ0kdDA0MjI4NTQ0ODUzAl80BBViYXNlQXNzZXRSZXNlcnZlQWZ0ZXIIBQ0kdDA0MjI4NTQ0ODUzAl81BBZxdW90ZUFzc2V0UmVzZXJ2ZUFmdGVyCAUNJHQwNDIyODU0NDg1MwJfNgQWdG90YWxQb3NpdGlvblNpemVBZnRlcggFDSR0MDQyMjg1NDQ4NTMCXzcEF2N1bXVsYXRpdmVOb3Rpb25hbEFmdGVyCAUNJHQwNDIyODU0NDg1MwJfOAQZb3BlbkludGVyZXN0Tm90aW9uYWxBZnRlcggFDSR0MDQyMjg1NDQ4NTMCXzkEDnRvdGFsTG9uZ0FmdGVyCAUNJHQwNDIyODU0NDg1MwNfMTAED3RvdGFsU2hvcnRBZnRlcggFDSR0MDQyMjg1NDQ4NTMDXzExBAxmZWVUb1N0YWtlcnMJAGkCBQlmZWVBbW91bnQAAgQOZmVlVG9JbnN1cmFuY2UJAGUCBQlmZWVBbW91bnQFDGZlZVRvU3Rha2VycwQFc3Rha2UJAPwHBAkBEXF1b3RlQXNzZXRTdGFraW5nAAIObG9ja05ldXRyaW5vU1AJAMwIAgkApQgBCQEOc3Rha2luZ0FkZHJlc3MACQDMCAIFCEFMTF9GRUVTBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQpxdW90ZUFzc2V0AAUHX2Ftb3VudAUDbmlsAwkAAAIFBXN0YWtlBQVzdGFrZQQQZGVwb3NpdEluc3VyYW5jZQkA/AcECQEQaW5zdXJhbmNlQWRkcmVzcwACB2RlcG9zaXQFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBCnF1b3RlQXNzZXQABQ5mZWVUb0luc3VyYW5jZQUDbmlsAwkAAAIFEGRlcG9zaXRJbnN1cmFuY2UFEGRlcG9zaXRJbnN1cmFuY2UECW5vdGlmeUZlZQkA/AcECQEMbWluZXJBZGRyZXNzAAIKbm90aWZ5RmVlcwkAzAgCBQdfdHJhZGVyCQDMCAIFCWZlZUFtb3VudAUDbmlsBQNuaWwDCQAAAgUJbm90aWZ5RmVlBQlub3RpZnlGZWUEDm5vdGlmeU5vdGlvbmFsCQD8BwQJAQxtaW5lckFkZHJlc3MAAg5ub3RpZnlOb3Rpb25hbAkAzAgCBQdfdHJhZGVyCQDMCAIFF25ld1Bvc2l0aW9uT3Blbk5vdGlvbmFsBQNuaWwFA25pbAMJAAACBQ5ub3RpZnlOb3Rpb25hbAUObm90aWZ5Tm90aW9uYWwJAM4IAgkAzggCCQDOCAIJAQ51cGRhdGVQb3NpdGlvbgUFB190cmFkZXIFD25ld1Bvc2l0aW9uU2l6ZQUXbmV3UG9zaXRpb25SZW1haW5NYXJnaW4FF25ld1Bvc2l0aW9uT3Blbk5vdGlvbmFsBRRuZXdQb3NpdGlvbkxhdGVzdENQRgkBCXVwZGF0ZUFtbQcFFnF1b3RlQXNzZXRSZXNlcnZlQWZ0ZXIFFWJhc2VBc3NldFJlc2VydmVBZnRlcgUWdG90YWxQb3NpdGlvblNpemVBZnRlcgUXY3VtdWxhdGl2ZU5vdGlvbmFsQWZ0ZXIFGW9wZW5JbnRlcmVzdE5vdGlvbmFsQWZ0ZXIFDnRvdGFsTG9uZ0FmdGVyBQ90b3RhbFNob3J0QWZ0ZXIJAQt0cmFuc2ZlckZlZQEFDGZlZVRvU3Rha2VycwkBDXVwZGF0ZUJhbGFuY2UBCQBkAgkBCGNiYWxhbmNlAAUHX2Ftb3VudAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQlhZGRNYXJnaW4ABApfcmF3QW1vdW50CAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAMDAwMJAQIhPQIICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAkBCnF1b3RlQXNzZXQABgkBASEBCQETcmVxdWlyZU9wZW5Qb3NpdGlvbgEJAKUIAQgFAWkGY2FsbGVyBgkBASEBCQELaW5pdGlhbGl6ZWQABgkBBnBhdXNlZAAJAAIBAhxJbnZhbGlkIGFkZE1hcmdpbiBwYXJhbWV0ZXJzBAdfdHJhZGVyCQClCAEIBQFpBmNhbGxlcgQMcmF3RmVlQW1vdW50CQEEbXVsZAIFCl9yYXdBbW91bnQJAQNmZWUABA5yZWZlcnJlckZlZUFueQkA/AcECQEPcmVmZXJyYWxBZGRyZXNzAAINYWNjZXB0UGF5bWVudAkAzAgCBQdfdHJhZGVyBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQpxdW90ZUFzc2V0AAUMcmF3RmVlQW1vdW50BQNuaWwDCQAAAgUOcmVmZXJyZXJGZWVBbnkFDnJlZmVycmVyRmVlQW55BAtyZWZlcnJlckZlZQQHJG1hdGNoMAUOcmVmZXJyZXJGZWVBbnkDCQABAgUHJG1hdGNoMAIDSW50BAF4BQckbWF0Y2gwBQF4CQACAQITSW52YWxpZCByZWZlcnJlckZlZQQJZmVlQW1vdW50CQBlAgUMcmF3RmVlQW1vdW50BQtyZWZlcnJlckZlZQQHX2Ftb3VudAkAZQIFCl9yYXdBbW91bnQFDHJhd0ZlZUFtb3VudAQNJHQwNDY3NDY0Njg4NgkBC2dldFBvc2l0aW9uAQUHX3RyYWRlcgQPb2xkUG9zaXRpb25TaXplCAUNJHQwNDY3NDY0Njg4NgJfMQQRb2xkUG9zaXRpb25NYXJnaW4IBQ0kdDA0Njc0NjQ2ODg2Al8yBBdvbGRQb3NpdGlvbk9wZW5Ob3Rpb25hbAgFDSR0MDQ2NzQ2NDY4ODYCXzMEFG9sZFBvc2l0aW9uTHN0VXBkQ1BGCAUNJHQwNDY3NDY0Njg4NgJfNAQMZmVlVG9TdGFrZXJzCQBpAgUJZmVlQW1vdW50AAIEDmZlZVRvSW5zdXJhbmNlCQBlAgUJZmVlQW1vdW50BQxmZWVUb1N0YWtlcnMEBXN0YWtlCQD8BwQJARFxdW90ZUFzc2V0U3Rha2luZwACDmxvY2tOZXV0cmlub1NQCQDMCAIJAKUIAQkBDnN0YWtpbmdBZGRyZXNzAAkAzAgCBQhBTExfRkVFUwUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEKcXVvdGVBc3NldAAFB19hbW91bnQFA25pbAMJAAACBQVzdGFrZQUFc3Rha2UEEGRlcG9zaXRJbnN1cmFuY2UJAPwHBAkBEGluc3VyYW5jZUFkZHJlc3MAAgdkZXBvc2l0BQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQpxdW90ZUFzc2V0AAUOZmVlVG9JbnN1cmFuY2UFA25pbAMJAAACBRBkZXBvc2l0SW5zdXJhbmNlBRBkZXBvc2l0SW5zdXJhbmNlBAlub3RpZnlGZWUJAPwHBAkBDG1pbmVyQWRkcmVzcwACCm5vdGlmeUZlZXMJAMwIAgUHX3RyYWRlcgkAzAgCBQlmZWVBbW91bnQFA25pbAUDbmlsAwkAAAIFCW5vdGlmeUZlZQUJbm90aWZ5RmVlCQDOCAIJAM4IAgkBDnVwZGF0ZVBvc2l0aW9uBQUHX3RyYWRlcgUPb2xkUG9zaXRpb25TaXplCQBkAgURb2xkUG9zaXRpb25NYXJnaW4FB19hbW91bnQFF29sZFBvc2l0aW9uT3Blbk5vdGlvbmFsBRRvbGRQb3NpdGlvbkxzdFVwZENQRgkBC3RyYW5zZmVyRmVlAQUMZmVlVG9TdGFrZXJzCQENdXBkYXRlQmFsYW5jZQEJAGQCCQEIY2JhbGFuY2UABQdfYW1vdW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDHJlbW92ZU1hcmdpbgEHX2Ftb3VudAMDAwMJAGcCAAAFB19hbW91bnQGCQEBIQEJARNyZXF1aXJlT3BlblBvc2l0aW9uAQkApQgBCAUBaQZjYWxsZXIGCQEBIQEJAQtpbml0aWFsaXplZAAGCQEGcGF1c2VkAAkAAgECH0ludmFsaWQgcmVtb3ZlTWFyZ2luIHBhcmFtZXRlcnMEDSR0MDQ3OTExNDgwNjMJAQtnZXRQb3NpdGlvbgEJAKUIAQgFAWkGY2FsbGVyBA9vbGRQb3NpdGlvblNpemUIBQ0kdDA0NzkxMTQ4MDYzAl8xBBFvbGRQb3NpdGlvbk1hcmdpbggFDSR0MDQ3OTExNDgwNjMCXzIEF29sZFBvc2l0aW9uT3Blbk5vdGlvbmFsCAUNJHQwNDc5MTE0ODA2MwJfMwQUb2xkUG9zaXRpb25Mc3RVcGRDUEYIBQ0kdDA0NzkxMTQ4MDYzAl80BAttYXJnaW5EZWx0YQkBAS0BBQdfYW1vdW50BA0kdDA0ODEwMDQ4Mjc5CQEiY2FsY1JlbWFpbk1hcmdpbldpdGhGdW5kaW5nUGF5bWVudAQFD29sZFBvc2l0aW9uU2l6ZQURb2xkUG9zaXRpb25NYXJnaW4FFG9sZFBvc2l0aW9uTHN0VXBkQ1BGBQttYXJnaW5EZWx0YQQMcmVtYWluTWFyZ2luCAUNJHQwNDgxMDA0ODI3OQJfMQQHYmFkRGVidAgFDSR0MDQ4MTAwNDgyNzkCXzIDCQECIT0CBQdiYWREZWJ0AAAJAAIBAh1JbnZhbGlkIHJlbW92ZWQgbWFyZ2luIGFtb3VudAQLbWFyZ2luUmF0aW8JAQ9jYWxjTWFyZ2luUmF0aW8DBQxyZW1haW5NYXJnaW4FB2JhZERlYnQFF29sZFBvc2l0aW9uT3Blbk5vdGlvbmFsAwkBASEBCQEWcmVxdWlyZU1vcmVNYXJnaW5SYXRpbwMFC21hcmdpblJhdGlvCQEPaW5pdE1hcmdpblJhdGlvAAYJAAIBCQCsAgIJAKwCAgkArAICAhlUb28gbXVjaCBtYXJnaW4gcmVtb3ZlZDogCQCkAwEFC21hcmdpblJhdGlvAgMgPCAJAKQDAQkBD2luaXRNYXJnaW5SYXRpbwAEB3Vuc3Rha2UJAPwHBAkBEXF1b3RlQXNzZXRTdGFraW5nAAIOdW5sb2NrTmV1dHJpbm8JAMwIAgUHX2Ftb3VudAkAzAgCCQDYBAEJAQpxdW90ZUFzc2V0AAUDbmlsBQNuaWwDCQAAAgUHdW5zdGFrZQUHdW5zdGFrZQkAzggCCQDOCAIJAQ51cGRhdGVQb3NpdGlvbgUJAKUIAQgFAWkGY2FsbGVyBQ9vbGRQb3NpdGlvblNpemUFDHJlbWFpbk1hcmdpbgUXb2xkUG9zaXRpb25PcGVuTm90aW9uYWwJAR9sYXRlc3RDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uAQUPb2xkUG9zaXRpb25TaXplCQEId2l0aGRyYXcCCAUBaQZjYWxsZXIFB19hbW91bnQJAQ11cGRhdGVCYWxhbmNlAQkAZQIJAQhjYmFsYW5jZQAFB19hbW91bnQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQENY2xvc2VQb3NpdGlvbgAEBmNhbGxlcgkBD2dldEFjdHVhbENhbGxlcgEFAWkEDWNhbGxlckFkZHJlc3MJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBBQZjYWxsZXICDkludmFsaWQgY2FsbGVyAwMDCQEBIQEJARNyZXF1aXJlT3BlblBvc2l0aW9uAQUGY2FsbGVyBgkBASEBCQELaW5pdGlhbGl6ZWQABgkBBnBhdXNlZAAJAAIBAiBJbnZhbGlkIGNsb3NlUG9zaXRpb24gcGFyYW1ldGVycwQNJHQwNDk0ODI0OTg1OQkBFWludGVybmFsQ2xvc2VQb3NpdGlvbgIFBmNhbGxlcgYEAngxCAUNJHQwNDk0ODI0OTg1OQJfMQQPcG9zaXRpb25CYWREZWJ0CAUNJHQwNDk0ODI0OTg1OQJfMgQLcmVhbGl6ZWRQbmwIBQ0kdDA0OTQ4MjQ5ODU5Al8zBA1tYXJnaW5Ub1ZhdWx0CAUNJHQwNDk0ODI0OTg1OQJfNAQWcXVvdGVBc3NldFJlc2VydmVBZnRlcggFDSR0MDQ5NDgyNDk4NTkCXzUEFWJhc2VBc3NldFJlc2VydmVBZnRlcggFDSR0MDQ5NDgyNDk4NTkCXzYEFnRvdGFsUG9zaXRpb25TaXplQWZ0ZXIIBQ0kdDA0OTQ4MjQ5ODU5Al83BBdjdW11bGF0aXZlTm90aW9uYWxBZnRlcggFDSR0MDQ5NDgyNDk4NTkCXzgEGW9wZW5JbnRlcmVzdE5vdGlvbmFsQWZ0ZXIIBQ0kdDA0OTQ4MjQ5ODU5Al85BAJ4MggFDSR0MDQ5NDgyNDk4NTkDXzEwBA50b3RhbExvbmdBZnRlcggFDSR0MDQ5NDgyNDk4NTkDXzExBA90b3RhbFNob3J0QWZ0ZXIIBQ0kdDA0OTQ4MjQ5ODU5A18xMgMJAGYCBQ9wb3NpdGlvbkJhZERlYnQAAAkAAgECJlVuYWJsZSB0byBjbG9zZSBwb3NpdGlvbiB3aXRoIGJhZCBkZWJ0BA53aXRoZHJhd0Ftb3VudAkBA2FicwEFDW1hcmdpblRvVmF1bHQECmFtbUJhbGFuY2UJAGUCCQEIY2JhbGFuY2UABQ53aXRoZHJhd0Ftb3VudAQNJHQwNTAwNjg1MDIxMAMJAGYCAAAFCmFtbUJhbGFuY2UJAJQKAgAACQEDYWJzAQUKYW1tQmFsYW5jZQkAlAoCBQphbW1CYWxhbmNlAAAEDWFtbU5ld0JhbGFuY2UIBQ0kdDA1MDA2ODUwMjEwAl8xBBBnZXRGcm9tSW5zdXJhbmNlCAUNJHQwNTAwNjg1MDIxMAJfMgQBeAMJAGYCBRBnZXRGcm9tSW5zdXJhbmNlAAAEEXdpdGhkcmF3SW5zdXJhbmNlCQD8BwQJARBpbnN1cmFuY2VBZGRyZXNzAAIId2l0aGRyYXcJAMwIAgUQZ2V0RnJvbUluc3VyYW5jZQUDbmlsBQNuaWwDCQAAAgURd2l0aGRyYXdJbnN1cmFuY2UFEXdpdGhkcmF3SW5zdXJhbmNlBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4FA25pbAMJAAACBQF4BQF4BAd1bnN0YWtlCQD8BwQJARFxdW90ZUFzc2V0U3Rha2luZwACDnVubG9ja05ldXRyaW5vCQDMCAIJAGUCBQ53aXRoZHJhd0Ftb3VudAUQZ2V0RnJvbUluc3VyYW5jZQkAzAgCCQDYBAEJAQpxdW90ZUFzc2V0AAUDbmlsBQNuaWwDCQAAAgUHdW5zdGFrZQUHdW5zdGFrZQQObm90aWZ5Tm90aW9uYWwJAPwHBAkBDG1pbmVyQWRkcmVzcwACDm5vdGlmeU5vdGlvbmFsCQDMCAIFBmNhbGxlcgkAzAgCAAAFA25pbAUDbmlsAwkAAAIFDm5vdGlmeU5vdGlvbmFsBQ5ub3RpZnlOb3Rpb25hbAkAzggCCQDOCAIJAM4IAgkBDmRlbGV0ZVBvc2l0aW9uAQUGY2FsbGVyCQEJdXBkYXRlQW1tBwUWcXVvdGVBc3NldFJlc2VydmVBZnRlcgUVYmFzZUFzc2V0UmVzZXJ2ZUFmdGVyBRZ0b3RhbFBvc2l0aW9uU2l6ZUFmdGVyBRdjdW11bGF0aXZlTm90aW9uYWxBZnRlcgUZb3BlbkludGVyZXN0Tm90aW9uYWxBZnRlcgUOdG90YWxMb25nQWZ0ZXIFD3RvdGFsU2hvcnRBZnRlcgkBCHdpdGhkcmF3AgUNY2FsbGVyQWRkcmVzcwUOd2l0aGRyYXdBbW91bnQJAQ11cGRhdGVCYWxhbmNlAQUNYW1tTmV3QmFsYW5jZQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQlsaXF1aWRhdGUBB190cmFkZXIED3Nwb3RNYXJnaW5SYXRpbwkBFmdldE1hcmdpblJhdGlvQnlPcHRpb24CBQdfdHJhZGVyBQ9QTkxfT1BUSU9OX1NQT1QEC21hcmdpblJhdGlvAwkBFmlzT3ZlckZsdWN0dWF0aW9uTGltaXQABBFvcmFjbGVNYXJnaW5SYXRpbwkBFmdldE1hcmdpblJhdGlvQnlPcHRpb24CBQdfdHJhZGVyBRFQTkxfT1BUSU9OX09SQUNMRQkBBHZtYXgCBQ9zcG90TWFyZ2luUmF0aW8FEW9yYWNsZU1hcmdpblJhdGlvBQ9zcG90TWFyZ2luUmF0aW8DAwMDCQEBIQEJARZyZXF1aXJlTW9yZU1hcmdpblJhdGlvAwULbWFyZ2luUmF0aW8JARZtYWludGVuYW5jZU1hcmdpblJhdGlvAAcGCQEBIQEJARNyZXF1aXJlT3BlblBvc2l0aW9uAQUHX3RyYWRlcgYJAQEhAQkBC2luaXRpYWxpemVkAAYJAQZwYXVzZWQACQACAQITVW5hYmxlIHRvIGxpcXVpZGF0ZQMDAwkAZgIFD3Nwb3RNYXJnaW5SYXRpbwkBE2xpcXVpZGF0aW9uRmVlUmF0aW8ACQBmAgkBF3BhcnRpYWxMaXF1aWRhdGlvblJhdGlvAAAABwkAZgIFDERFQ0lNQUxfVU5JVAkBF3BhcnRpYWxMaXF1aWRhdGlvblJhdGlvAAcEDSR0MDUyMjkwNTI0NDAJAQtnZXRQb3NpdGlvbgEFB190cmFkZXIED29sZFBvc2l0aW9uU2l6ZQgFDSR0MDUyMjkwNTI0NDACXzEEEW9sZFBvc2l0aW9uTWFyZ2luCAUNJHQwNTIyOTA1MjQ0MAJfMgQXb2xkUG9zaXRpb25PcGVuTm90aW9uYWwIBQ0kdDA1MjI5MDUyNDQwAl8zBBRvbGRQb3NpdGlvbkxzdFVwZENQRggFDSR0MDUyMjkwNTI0NDACXzQECl9kaXJlY3Rpb24DCQBmAgUPb2xkUG9zaXRpb25TaXplAAAFCURJUl9TSE9SVAUIRElSX0xPTkcEBWlzQWRkCQAAAgUKX2RpcmVjdGlvbgUIRElSX0xPTkcEGWV4Y2hhbmdlZFF1b3RlQXNzZXRBbW91bnQJARtnZXRQYXJ0aWFsTGlxdWlkYXRpb25BbW91bnQCBQdfdHJhZGVyBQ9vbGRQb3NpdGlvblNpemUEDSR0MDUyNjY1NTI3NjkJASNnZXRQb3NpdGlvbk5vdGlvbmFsQW5kVW5yZWFsaXplZFBubAIFB190cmFkZXIFD1BOTF9PUFRJT05fU1BPVAQTb2xkUG9zaXRpb25Ob3Rpb25hbAgFDSR0MDUyNjY1NTI3NjkCXzEEDXVucmVhbGl6ZWRQbmwIBQ0kdDA1MjY2NTUyNzY5Al8yBA0kdDA1Mjc3NzUzMDY3CQEJc3dhcElucHV0AgUFaXNBZGQFGWV4Y2hhbmdlZFF1b3RlQXNzZXRBbW91bnQEFWV4Y2hhbmdlZFBvc2l0aW9uU2l6ZQgFDSR0MDUyNzc3NTMwNjcCXzEEFnF1b3RlQXNzZXRSZXNlcnZlQWZ0ZXIIBQ0kdDA1Mjc3NzUzMDY3Al8yBBViYXNlQXNzZXRSZXNlcnZlQWZ0ZXIIBQ0kdDA1Mjc3NzUzMDY3Al8zBBZ0b3RhbFBvc2l0aW9uU2l6ZUFmdGVyCAUNJHQwNTI3Nzc1MzA2NwJfNAQXY3VtdWxhdGl2ZU5vdGlvbmFsQWZ0ZXIIBQ0kdDA1Mjc3NzUzMDY3Al81BAtyZWFsaXplZFBubAkBBGRpdmQCCQEEbXVsZAIFDXVucmVhbGl6ZWRQbmwJAQNhYnMBBRVleGNoYW5nZWRQb3NpdGlvblNpemUJAQNhYnMBBQ9vbGRQb3NpdGlvblNpemUEDSR0MDUzMTc0NTM0MDcJASJjYWxjUmVtYWluTWFyZ2luV2l0aEZ1bmRpbmdQYXltZW50BAUPb2xkUG9zaXRpb25TaXplBRFvbGRQb3NpdGlvbk1hcmdpbgUUb2xkUG9zaXRpb25Mc3RVcGRDUEYFC3JlYWxpemVkUG5sBAxyZW1haW5NYXJnaW4IBQ0kdDA1MzE3NDUzNDA3Al8xBAdiYWREZWJ0CAUNJHQwNTMxNzQ1MzQwNwJfMgQOZnVuZGluZ1BheW1lbnQIBQ0kdDA1MzE3NDUzNDA3Al8zBBJ1bnJlYWxpemVkUG5sQWZ0ZXIJAGUCBQ11bnJlYWxpemVkUG5sBQtyZWFsaXplZFBubAQScmVtYWluT3Blbk5vdGlvbmFsAwkAZgIFD29sZFBvc2l0aW9uU2l6ZQAACQBlAgkAZQIFE29sZFBvc2l0aW9uTm90aW9uYWwFGWV4Y2hhbmdlZFF1b3RlQXNzZXRBbW91bnQFEnVucmVhbGl6ZWRQbmxBZnRlcgkAZQIJAGQCBRJ1bnJlYWxpemVkUG5sQWZ0ZXIFE29sZFBvc2l0aW9uTm90aW9uYWwFGWV4Y2hhbmdlZFF1b3RlQXNzZXRBbW91bnQEEmxpcXVpZGF0aW9uUGVuYWx0eQkBBG11bGQCBRlleGNoYW5nZWRRdW90ZUFzc2V0QW1vdW50CQETbGlxdWlkYXRpb25GZWVSYXRpbwAED2ZlZVRvTGlxdWlkYXRvcgkAaQIFEmxpcXVpZGF0aW9uUGVuYWx0eQACBA5mZWVUb0luc3VyYW5jZQkAZQIFEmxpcXVpZGF0aW9uUGVuYWx0eQUPZmVlVG9MaXF1aWRhdG9yBBFuZXdQb3NpdGlvbk1hcmdpbgkAZQIFDHJlbWFpbk1hcmdpbgUSbGlxdWlkYXRpb25QZW5hbHR5BA9uZXdQb3NpdGlvblNpemUJAGQCBQ9vbGRQb3NpdGlvblNpemUFFWV4Y2hhbmdlZFBvc2l0aW9uU2l6ZQQXbmV3UG9zaXRpb25PcGVuTm90aW9uYWwJAQNhYnMBBRJyZW1haW5PcGVuTm90aW9uYWwEFG5ld1Bvc2l0aW9uTHN0VXBkQ1BGCQEfbGF0ZXN0Q3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgEFD25ld1Bvc2l0aW9uU2l6ZQQZb3BlbkludGVyZXN0Tm90aW9uYWxBZnRlcgkAZQIJARRvcGVuSW50ZXJlc3ROb3Rpb25hbAAFGWV4Y2hhbmdlZFF1b3RlQXNzZXRBbW91bnQECmFtbUJhbGFuY2UJAGUCCQEIY2JhbGFuY2UABRJsaXF1aWRhdGlvblBlbmFsdHkEDSR0MDU0NTgwNTQ3MjMDCQBmAgAABQphbW1CYWxhbmNlCQCUCgIAAAkBA2FicwEFCmFtbUJhbGFuY2UJAJQKAgUKYW1tQmFsYW5jZQAABA1uZXdBbW1CYWxhbmNlCAUNJHQwNTQ1ODA1NDcyMwJfMQQRdGFrZUZyb21JbnN1cmFuY2UIBQ0kdDA1NDU4MDU0NzIzAl8yBAF4AwkAZgIFEXRha2VGcm9tSW5zdXJhbmNlAAAEEXdpdGhkcmF3SW5zdXJhbmNlCQD8BwQJARBpbnN1cmFuY2VBZGRyZXNzAAIId2l0aGRyYXcJAMwIAgURdGFrZUZyb21JbnN1cmFuY2UFA25pbAUDbmlsAwkAAAIFEXdpdGhkcmF3SW5zdXJhbmNlBRF3aXRoZHJhd0luc3VyYW5jZQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBQNuaWwDCQAAAgUBeAUBeAQHdW5zdGFrZQkA/AcECQERcXVvdGVBc3NldFN0YWtpbmcAAg51bmxvY2tOZXV0cmlubwkAzAgCCQBlAgUSbGlxdWlkYXRpb25QZW5hbHR5BRF0YWtlRnJvbUluc3VyYW5jZQkAzAgCCQDYBAEJAQpxdW90ZUFzc2V0AAUDbmlsBQNuaWwDCQAAAgUHdW5zdGFrZQUHdW5zdGFrZQQQZGVwb3NpdEluc3VyYW5jZQkA/AcECQEQaW5zdXJhbmNlQWRkcmVzcwACB2RlcG9zaXQFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBCnF1b3RlQXNzZXQABQ5mZWVUb0luc3VyYW5jZQUDbmlsAwkAAAIFEGRlcG9zaXRJbnN1cmFuY2UFEGRlcG9zaXRJbnN1cmFuY2UEDm5vdGlmeU5vdGlvbmFsCQD8BwQJAQxtaW5lckFkZHJlc3MAAg5ub3RpZnlOb3Rpb25hbAkAzAgCBQdfdHJhZGVyCQDMCAIFF25ld1Bvc2l0aW9uT3Blbk5vdGlvbmFsBQNuaWwFA25pbAMJAAACBQ5ub3RpZnlOb3Rpb25hbAUObm90aWZ5Tm90aW9uYWwJAM4IAgkAzggCCQDOCAIJAQ51cGRhdGVQb3NpdGlvbgUFB190cmFkZXIFD25ld1Bvc2l0aW9uU2l6ZQURbmV3UG9zaXRpb25NYXJnaW4FF25ld1Bvc2l0aW9uT3Blbk5vdGlvbmFsBRRuZXdQb3NpdGlvbkxzdFVwZENQRgkBCXVwZGF0ZUFtbQcFFnF1b3RlQXNzZXRSZXNlcnZlQWZ0ZXIFFWJhc2VBc3NldFJlc2VydmVBZnRlcgUWdG90YWxQb3NpdGlvblNpemVBZnRlcgUXY3VtdWxhdGl2ZU5vdGlvbmFsQWZ0ZXIFGW9wZW5JbnRlcmVzdE5vdGlvbmFsQWZ0ZXIJAGUCCQEVdG90YWxMb25nUG9zaXRpb25TaXplAAMJAGYCBQ9uZXdQb3NpdGlvblNpemUAAAkBA2FicwEFFWV4Y2hhbmdlZFBvc2l0aW9uU2l6ZQAACQBlAgkBFnRvdGFsU2hvcnRQb3NpdGlvblNpemUAAwkAZgIAAAUPbmV3UG9zaXRpb25TaXplCQEDYWJzAQUVZXhjaGFuZ2VkUG9zaXRpb25TaXplAAAJAQh3aXRoZHJhdwIIBQFpBmNhbGxlcgUPZmVlVG9MaXF1aWRhdG9yCQENdXBkYXRlQmFsYW5jZQEFDW5ld0FtbUJhbGFuY2UJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4EDSR0MDU2MTc5NTY2MzQJARVpbnRlcm5hbENsb3NlUG9zaXRpb24CBQdfdHJhZGVyBwQCeDEIBQ0kdDA1NjE3OTU2NjM0Al8xBAdiYWREZWJ0CAUNJHQwNTYxNzk1NjYzNAJfMgQCeDIIBQ0kdDA1NjE3OTU2NjM0Al8zBAJ4MwgFDSR0MDU2MTc5NTY2MzQCXzQEFnF1b3RlQXNzZXRSZXNlcnZlQWZ0ZXIIBQ0kdDA1NjE3OTU2NjM0Al81BBViYXNlQXNzZXRSZXNlcnZlQWZ0ZXIIBQ0kdDA1NjE3OTU2NjM0Al82BBZ0b3RhbFBvc2l0aW9uU2l6ZUFmdGVyCAUNJHQwNTYxNzk1NjYzNAJfNwQXY3VtdWxhdGl2ZU5vdGlvbmFsQWZ0ZXIIBQ0kdDA1NjE3OTU2NjM0Al84BBlvcGVuSW50ZXJlc3ROb3Rpb25hbEFmdGVyCAUNJHQwNTYxNzk1NjYzNAJfOQQZZXhjaGFuZ2VkUXVvdGVBc3NldEFtb3VudAgFDSR0MDU2MTc5NTY2MzQDXzEwBA50b3RhbExvbmdBZnRlcggFDSR0MDU2MTc5NTY2MzQDXzExBA90b3RhbFNob3J0QWZ0ZXIIBQ0kdDA1NjE3OTU2NjM0A18xMgQSbGlxdWlkYXRpb25QZW5hbHR5CQEEbXVsZAIFGWV4Y2hhbmdlZFF1b3RlQXNzZXRBbW91bnQJARNsaXF1aWRhdGlvbkZlZVJhdGlvAAQPZmVlVG9MaXF1aWRhdG9yCQBpAgUSbGlxdWlkYXRpb25QZW5hbHR5AAIEDmZlZVRvSW5zdXJhbmNlCQBlAgUSbGlxdWlkYXRpb25QZW5hbHR5BQ9mZWVUb0xpcXVpZGF0b3IECmFtbUJhbGFuY2UJAGUCCQEIY2JhbGFuY2UABRJsaXF1aWRhdGlvblBlbmFsdHkEDSR0MDU3MDQ2NTcxODkDCQBmAgAABQphbW1CYWxhbmNlCQCUCgIAAAkBA2FicwEFCmFtbUJhbGFuY2UJAJQKAgUKYW1tQmFsYW5jZQAABA1uZXdBbW1CYWxhbmNlCAUNJHQwNTcwNDY1NzE4OQJfMQQRdGFrZUZyb21JbnN1cmFuY2UIBQ0kdDA1NzA0NjU3MTg5Al8yBAF4AwkAZgIFEXRha2VGcm9tSW5zdXJhbmNlAAAEEXdpdGhkcmF3SW5zdXJhbmNlCQD8BwQJARBpbnN1cmFuY2VBZGRyZXNzAAIId2l0aGRyYXcJAMwIAgURdGFrZUZyb21JbnN1cmFuY2UFA25pbAUDbmlsAwkAAAIFEXdpdGhkcmF3SW5zdXJhbmNlBRF3aXRoZHJhd0luc3VyYW5jZQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBQNuaWwDCQAAAgUBeAUBeAQHdW5zdGFrZQkA/AcECQERcXVvdGVBc3NldFN0YWtpbmcAAg51bmxvY2tOZXV0cmlubwkAzAgCCQBlAgUSbGlxdWlkYXRpb25QZW5hbHR5BRF0YWtlRnJvbUluc3VyYW5jZQkAzAgCCQDYBAEJAQpxdW90ZUFzc2V0AAUDbmlsBQNuaWwDCQAAAgUHdW5zdGFrZQUHdW5zdGFrZQQQZGVwb3NpdEluc3VyYW5jZQkA/AcECQEQaW5zdXJhbmNlQWRkcmVzcwACB2RlcG9zaXQFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBCnF1b3RlQXNzZXQABQ5mZWVUb0luc3VyYW5jZQUDbmlsAwkAAAIFEGRlcG9zaXRJbnN1cmFuY2UFEGRlcG9zaXRJbnN1cmFuY2UEDm5vdGlmeU5vdGlvbmFsCQD8BwQJAQxtaW5lckFkZHJlc3MAAg5ub3RpZnlOb3Rpb25hbAkAzAgCBQdfdHJhZGVyCQDMCAIAAAUDbmlsBQNuaWwDCQAAAgUObm90aWZ5Tm90aW9uYWwFDm5vdGlmeU5vdGlvbmFsCQDOCAIJAM4IAgkAzggCCQEOZGVsZXRlUG9zaXRpb24BBQdfdHJhZGVyCQEJdXBkYXRlQW1tBwUWcXVvdGVBc3NldFJlc2VydmVBZnRlcgUVYmFzZUFzc2V0UmVzZXJ2ZUFmdGVyBRZ0b3RhbFBvc2l0aW9uU2l6ZUFmdGVyBRdjdW11bGF0aXZlTm90aW9uYWxBZnRlcgUZb3BlbkludGVyZXN0Tm90aW9uYWxBZnRlcgUOdG90YWxMb25nQWZ0ZXIFD3RvdGFsU2hvcnRBZnRlcgkBCHdpdGhkcmF3AggFAWkGY2FsbGVyBQ9mZWVUb0xpcXVpZGF0b3IJAQ11cGRhdGVCYWxhbmNlAQUNbmV3QW1tQmFsYW5jZQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQpwYXlGdW5kaW5nAAQVZnVuZGluZ0Jsb2NrVGltZXN0YW1wCQEZbmV4dEZ1bmRpbmdCbG9ja1RpbWVzdGFtcAADAwMJAGYCBRVmdW5kaW5nQmxvY2tUaW1lc3RhbXAIBQlsYXN0QmxvY2sJdGltZXN0YW1wBgkBASEBCQELaW5pdGlhbGl6ZWQABgkBBnBhdXNlZAAJAAIBCQCsAgIJAKwCAgkArAICAiFJbnZhbGlkIGZ1bmRpbmcgYmxvY2sgdGltZXN0YW1wOiAJAKQDAQgFCWxhc3RCbG9jawl0aW1lc3RhbXACAyA8IAkApAMBBRVmdW5kaW5nQmxvY2tUaW1lc3RhbXAED3VuZGVybHlpbmdQcmljZQkBEmdldE9yYWNsZVR3YXBQcmljZQAEDSR0MDU4Njg0NTg3NDYJAQpnZXRGdW5kaW5nAAQUc2hvcnRQcmVtaXVtRnJhY3Rpb24IBQ0kdDA1ODY4NDU4NzQ2Al8xBBNsb25nUHJlbWl1bUZyYWN0aW9uCAUNJHQwNTg2ODQ1ODc0NgJfMgkBDXVwZGF0ZUZ1bmRpbmcFCQBkAgUVZnVuZGluZ0Jsb2NrVGltZXN0YW1wCQEUZnVuZGluZ1BlcmlvZFNlY29uZHMACQBkAgkBI2xhdGVzdExvbmdDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uAAUTbG9uZ1ByZW1pdW1GcmFjdGlvbgkAZAIJASRsYXRlc3RTaG9ydEN1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24ABRRzaG9ydFByZW1pdW1GcmFjdGlvbgkBBGRpdmQCBRNsb25nUHJlbWl1bUZyYWN0aW9uBQ91bmRlcmx5aW5nUHJpY2UJAQRkaXZkAgUUc2hvcnRQcmVtaXVtRnJhY3Rpb24FD3VuZGVybHlpbmdQcmljZQFpAQ5mb3JjZU1vdmVBc3NldAIHX3RyYWRlcgdfYW1vdW50AwMJAQIhPQIJAKcIAQkBDmFkbWluUHVibGljS2V5AAgFAWkGY2FsbGVyBgkAZgIAAAUHX2Ftb3VudAkAAgECIUludmFsaWQgZm9yY2VNb3ZlQXNzZXQgcGFyYW1ldGVycwQHdW5zdGFrZQkA/AcECQERcXVvdGVBc3NldFN0YWtpbmcAAg51bmxvY2tOZXV0cmlubwkAzAgCBQdfYW1vdW50CQDMCAIJANgEAQkBCnF1b3RlQXNzZXQABQNuaWwFA25pbAMJAAACBQd1bnN0YWtlBQd1bnN0YWtlCQDOCAIJAQh3aXRoZHJhdwIJARFAZXh0ck5hdGl2ZSgxMDYyKQEFB190cmFkZXIFB19hbW91bnQJAQ11cGRhdGVCYWxhbmNlAQkAZQIJAQhjYmFsYW5jZQAFB19hbW91bnQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEJYWRqdXN0UGVnAQZfcHJpY2UDAwkBAiE9AgkApwgBCQEOYWRtaW5QdWJsaWNLZXkACAUBaQZjYWxsZXIGCQBmAgAABQZfcHJpY2UJAAIBAhxJbnZhbGlkIGFkanVzdFBlZyBwYXJhbWV0ZXJzBA0kdDA1OTc0NjU5ODMyCQEQZ2V0UGVnQWRqdXN0Q29zdAEFBl9wcmljZQQUbmV3UXVvdGVBc3NldFJlc2VydmUIBQ0kdDA1OTc0NjU5ODMyAl8xBA1wZWdDaGFuZ2VDb3N0CAUNJHQwNTk3NDY1OTgzMgJfMgMJAAACBQ1wZWdDaGFuZ2VDb3N0AAAJAAIBAhFOb3RoaW5nIHRvIGFkanVzdAMJAGYCBQ1wZWdDaGFuZ2VDb3N0AAAEEXdpdGhkcmF3SW5zdXJhbmNlCQD8BwQJARBpbnN1cmFuY2VBZGRyZXNzAAIId2l0aGRyYXcJAMwIAgUNcGVnQ2hhbmdlQ29zdAUDbmlsBQNuaWwDCQAAAgURd2l0aGRyYXdJbnN1cmFuY2UFEXdpdGhkcmF3SW5zdXJhbmNlBAVzdGFrZQkA/AcECQERcXVvdGVBc3NldFN0YWtpbmcAAg5sb2NrTmV1dHJpbm9TUAkAzAgCCQClCAEJAQ5zdGFraW5nQWRkcmVzcwAJAMwIAgUIQUxMX0ZFRVMFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBCnF1b3RlQXNzZXQABQ1wZWdDaGFuZ2VDb3N0BQNuaWwDCQAAAgUFc3Rha2UFBXN0YWtlCQDOCAIJAQ11cGRhdGVCYWxhbmNlAQkAZAIJAQhjYmFsYW5jZQAFDXBlZ0NoYW5nZUNvc3QJARF1cGRhdGVBbW1SZXNlcnZlcwIFFG5ld1F1b3RlQXNzZXRSZXNlcnZlCQEGYnNBc3RSAAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgQHdW5zdGFrZQkA/AcECQERcXVvdGVBc3NldFN0YWtpbmcAAg51bmxvY2tOZXV0cmlubwkAzAgCCQEDYWJzAQUNcGVnQ2hhbmdlQ29zdAkAzAgCCQDYBAEJAQpxdW90ZUFzc2V0AAUDbmlsBQNuaWwDCQAAAgUHdW5zdGFrZQUHdW5zdGFrZQQQZGVwb3NpdEluc3VyYW5jZQkA/AcECQEQaW5zdXJhbmNlQWRkcmVzcwACB2RlcG9zaXQFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBCnF1b3RlQXNzZXQACQEDYWJzAQUNcGVnQ2hhbmdlQ29zdAUDbmlsAwkAAAIFEGRlcG9zaXRJbnN1cmFuY2UFEGRlcG9zaXRJbnN1cmFuY2UJAM4IAgkBDXVwZGF0ZUJhbGFuY2UBCQBlAgkBCGNiYWxhbmNlAAkBA2FicwEFDXBlZ0NoYW5nZUNvc3QJARF1cGRhdGVBbW1SZXNlcnZlcwIFFG5ld1F1b3RlQXNzZXRSZXNlcnZlCQEGYnNBc3RSAAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQV2X2dldAEHX3RyYWRlcgQNJHQwNjEwNTc2MTExNwkBFWludGVybmFsQ2xvc2VQb3NpdGlvbgIFB190cmFkZXIHBAJ4MQgFDSR0MDYxMDU3NjExMTcCXzEEAngyCAUNJHQwNjEwNTc2MTExNwJfMgQCeDMIBQ0kdDA2MTA1NzYxMTE3Al8zBAJ4NAgFDSR0MDYxMDU3NjExMTcCXzQJAAIBCQCsAgIJAKwCAgkArAICCQEBcwEFAngyCQEBcwEFAngzCQEBcwEFAng0CQEBcwEJAQ5nZXRNYXJnaW5SYXRpbwEFB190cmFkZXIBaQEndmlld19jYWxjUmVtYWluTWFyZ2luV2l0aEZ1bmRpbmdQYXltZW50AQdfdHJhZGVyBA0kdDA2MTI2NDYxMzc1CQELZ2V0UG9zaXRpb24BBQdfdHJhZGVyBAxwb3NpdGlvblNpemUIBQ0kdDA2MTI2NDYxMzc1Al8xBA5wb3NpdGlvbk1hcmdpbggFDSR0MDYxMjY0NjEzNzUCXzIEA3BvbggFDSR0MDYxMjY0NjEzNzUCXzMEEXBvc2l0aW9uTHN0VXBkQ1BGCAUNJHQwNjEyNjQ2MTM3NQJfNAQNJHQwNjEzODA2MTQ4MQkBI2dldFBvc2l0aW9uTm90aW9uYWxBbmRVbnJlYWxpemVkUG5sAgUHX3RyYWRlcgUPUE5MX09QVElPTl9TUE9UBBBwb3NpdGlvbk5vdGlvbmFsCAUNJHQwNjEzODA2MTQ4MQJfMQQNdW5yZWFsaXplZFBubAgFDSR0MDYxMzgwNjE0ODECXzIEDSR0MDYxNDg2NjE2NjgJASJjYWxjUmVtYWluTWFyZ2luV2l0aEZ1bmRpbmdQYXltZW50BAUMcG9zaXRpb25TaXplBQ5wb3NpdGlvbk1hcmdpbgURcG9zaXRpb25Mc3RVcGRDUEYFDXVucmVhbGl6ZWRQbmwEDHJlbWFpbk1hcmdpbggFDSR0MDYxNDg2NjE2NjgCXzEEB2JhZERlYnQIBQ0kdDA2MTQ4NjYxNjY4Al8yBA5mdW5kaW5nUGF5bWVudAgFDSR0MDYxNDg2NjE2NjgCXzMJAAIBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkBAXMBBQxyZW1haW5NYXJnaW4JAQFzAQUOZnVuZGluZ1BheW1lbnQJAQFzAQkBDmdldE1hcmdpblJhdGlvAQUHX3RyYWRlcgkBAXMBBQ11bnJlYWxpemVkUG5sCQEBcwEFB2JhZERlYnQJAQFzAQUQcG9zaXRpb25Ob3Rpb25hbAFpARV2aWV3X2dldFBlZ0FkanVzdENvc3QBBl9wcmljZQQEY29zdAkBEGdldFBlZ0FkanVzdENvc3QBBQZfcHJpY2UJAAIBCQCkAwEIBQRjb3N0Al8yAWkBD3ZpZXdfZ2V0RnVuZGluZwAED3VuZGVybHlpbmdQcmljZQkBEmdldE9yYWNsZVR3YXBQcmljZQAEDSR0MDYyMDU5NjIxMjEJAQpnZXRGdW5kaW5nAAQUc2hvcnRQcmVtaXVtRnJhY3Rpb24IBQ0kdDA2MjA1OTYyMTIxAl8xBBNsb25nUHJlbWl1bUZyYWN0aW9uCAUNJHQwNjIwNTk2MjEyMQJfMgQLbG9uZ0Z1bmRpbmcJAQRkaXZkAgUTbG9uZ1ByZW1pdW1GcmFjdGlvbgUPdW5kZXJseWluZ1ByaWNlBAxzaG9ydEZ1bmRpbmcJAQRkaXZkAgUUc2hvcnRQcmVtaXVtRnJhY3Rpb24FD3VuZGVybHlpbmdQcmljZQkAAgEJAKwCAgkArAICCQCsAgIJAQFzAQULbG9uZ0Z1bmRpbmcJAQFzAQUMc2hvcnRGdW5kaW5nCQEBcwEJARBnZXRUd2FwU3BvdFByaWNlAAkBAXMBCQESZ2V0T3JhY2xlVHdhcFByaWNlAAECdHgBBnZlcmlmeQAJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAJAQ5hZG1pblB1YmxpY0tleQAImkqf", "height": 3304566, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: FwAW1vFaokWfPFPXEzWvovAB6CVTCAp3gyrnGjQ6M9QJ Next: CZrScXhttsa7yKGErE8yeB3Wy54yqmR34Q9KnWjmkLnV Diff:
Old | New | Differences | |
---|---|---|---|
17 | 17 | ||
18 | 18 | let h = "k_positionFraction" | |
19 | 19 | ||
20 | - | let i = "k_ | |
20 | + | let i = "k_positionClosedDate" | |
21 | 21 | ||
22 | - | let j = "k_ | |
22 | + | let j = "k_initialized" | |
23 | 23 | ||
24 | - | let k = "k_ | |
24 | + | let k = "k_paused" | |
25 | 25 | ||
26 | - | let l = "k_ | |
26 | + | let l = "k_fee" | |
27 | 27 | ||
28 | - | let m = "k_ | |
28 | + | let m = "k_fundingPeriod" | |
29 | 29 | ||
30 | - | let n = "k_ | |
30 | + | let n = "k_initMarginRatio" | |
31 | 31 | ||
32 | - | let o = "k_ | |
32 | + | let o = "k_mmr" | |
33 | 33 | ||
34 | - | let p = "k_ | |
34 | + | let p = "k_liquidationFeeRatio" | |
35 | 35 | ||
36 | - | let q = "k_ | |
36 | + | let q = "k_partLiquidationRatio" | |
37 | 37 | ||
38 | - | let r = "k_ | |
38 | + | let r = "k_spreadLimit" | |
39 | 39 | ||
40 | - | let s = "k_ | |
40 | + | let s = "k_maxPriceImpact" | |
41 | 41 | ||
42 | - | let t = "k_ | |
42 | + | let t = "k_maxPriceSpread" | |
43 | 43 | ||
44 | - | let u = "k_ | |
44 | + | let u = "k_lastDataStr" | |
45 | 45 | ||
46 | - | let v = "k_ | |
46 | + | let v = "k_lastMinuteId" | |
47 | 47 | ||
48 | - | let w = "k_ | |
48 | + | let w = "k_twapDataLastCumulativePrice" | |
49 | 49 | ||
50 | - | let x = "k_ | |
50 | + | let x = "k_twapDataLastPrice" | |
51 | 51 | ||
52 | - | let y = "k_ | |
52 | + | let y = "k_twapDataPreviousMinuteId" | |
53 | 53 | ||
54 | - | let z = "k_ | |
54 | + | let z = "k_latestLongPremiumFraction" | |
55 | 55 | ||
56 | - | let A = "k_ | |
56 | + | let A = "k_latestShortPremiumFraction" | |
57 | 57 | ||
58 | - | let B = "k_ | |
58 | + | let B = "k_nextFundingBlockMinTimestamp" | |
59 | 59 | ||
60 | - | let C = "k_ | |
60 | + | let C = "k_longFundingRate" | |
61 | 61 | ||
62 | - | let D = "k_ | |
62 | + | let D = "k_shortFundingRate" | |
63 | 63 | ||
64 | - | let E = "k_ | |
64 | + | let E = "k_qtAstR" | |
65 | 65 | ||
66 | - | let F = "k_ | |
66 | + | let F = "k_bsAstR" | |
67 | 67 | ||
68 | - | let G = "k_ | |
68 | + | let G = "k_totalPositionSize" | |
69 | 69 | ||
70 | - | let H = "k_ | |
70 | + | let H = "k_totalLongPositionSize" | |
71 | 71 | ||
72 | - | let I = "k_ | |
72 | + | let I = "k_totalShortPositionSize" | |
73 | 73 | ||
74 | - | let J = "k_ | |
74 | + | let J = "k_cumulativeNotional" | |
75 | 75 | ||
76 | - | let K = "k_ | |
76 | + | let K = "k_openInterestNotional" | |
77 | 77 | ||
78 | - | let L = "k_ | |
78 | + | let L = "k_coordinatorAddress" | |
79 | 79 | ||
80 | - | let M = "k_ | |
80 | + | let M = "k_insurance_address" | |
81 | 81 | ||
82 | - | let N = "k_admin_ | |
82 | + | let N = "k_admin_address" | |
83 | 83 | ||
84 | - | let O = "k_ | |
84 | + | let O = "k_admin_public_key" | |
85 | 85 | ||
86 | - | let P = "k_quote_ | |
86 | + | let P = "k_quote_asset" | |
87 | 87 | ||
88 | - | let Q = "k_staking | |
88 | + | let Q = "k_quote_staking" | |
89 | 89 | ||
90 | - | let R = "k_ | |
90 | + | let R = "k_staking_address" | |
91 | 91 | ||
92 | - | func S () = valueOrErrorMessage(addressFromString(getStringValue(this, K)), "Coordinator not set") | |
92 | + | let S = "k_miner_address" | |
93 | + | ||
94 | + | let T = "k_orders_address" | |
95 | + | ||
96 | + | let U = "k_referral_address" | |
97 | + | ||
98 | + | func V () = valueOrErrorMessage(addressFromString(getStringValue(this, L)), "Coordinator not set") | |
93 | 99 | ||
94 | 100 | ||
95 | - | func | |
101 | + | func W () = addressFromString(getStringValue(V(), N)) | |
96 | 102 | ||
97 | 103 | ||
98 | - | func | |
104 | + | func X () = fromBase58String(getStringValue(V(), O)) | |
99 | 105 | ||
100 | 106 | ||
101 | - | func | |
107 | + | func Y () = fromBase58String(getStringValue(V(), P)) | |
102 | 108 | ||
103 | 109 | ||
104 | - | func | |
110 | + | func Z () = valueOrErrorMessage(addressFromString(getStringValue(V(), Q)), "Quote asset staking not set") | |
105 | 111 | ||
106 | 112 | ||
107 | - | func | |
113 | + | func aa () = valueOrErrorMessage(addressFromString(getStringValue(V(), R)), "Staking not set") | |
108 | 114 | ||
109 | 115 | ||
110 | - | func | |
116 | + | func ab () = valueOrErrorMessage(addressFromString(getStringValue(V(), M)), "Insurance not set") | |
111 | 117 | ||
112 | 118 | ||
113 | - | func | |
119 | + | func ac () = valueOrErrorMessage(addressFromString(getStringValue(V(), S)), "Miner not set") | |
114 | 120 | ||
115 | 121 | ||
116 | - | let aa = 1 | |
117 | - | ||
118 | - | let ab = 2 | |
119 | - | ||
120 | - | let ac = 15 | |
121 | - | ||
122 | - | let ad = 15 | |
123 | - | ||
124 | - | let ae = 1000 | |
125 | - | ||
126 | - | let af = (1 * (((((10 * 10) * 10) * 10) * 10) * 10)) | |
127 | - | ||
128 | - | let ag = (86400 * af) | |
129 | - | ||
130 | - | let ah = 100 | |
131 | - | ||
132 | - | let ai = 1 | |
133 | - | ||
134 | - | let aj = 2 | |
135 | - | ||
136 | - | func ak (al) = (toString(al) + ",") | |
122 | + | func ad () = valueOrErrorMessage(addressFromString(getStringValue(V(), T)), "Orders not set") | |
137 | 123 | ||
138 | 124 | ||
139 | - | func | |
125 | + | func ae () = valueOrErrorMessage(addressFromString(getStringValue(V(), U)), "Referral not set") | |
140 | 126 | ||
141 | 127 | ||
142 | - | func ao (al,an) = fraction(al, an, af, HALFEVEN) | |
128 | + | let af = 1 | |
129 | + | ||
130 | + | let ag = 2 | |
131 | + | ||
132 | + | let ah = 15 | |
133 | + | ||
134 | + | let ai = 15 | |
135 | + | ||
136 | + | let aj = 1000 | |
137 | + | ||
138 | + | let ak = (1 * (((((10 * 10) * 10) * 10) * 10) * 10)) | |
139 | + | ||
140 | + | let al = (86400 * ak) | |
141 | + | ||
142 | + | let am = 100 | |
143 | + | ||
144 | + | let an = 1 | |
145 | + | ||
146 | + | let ao = 2 | |
147 | + | ||
148 | + | func ap (aq) = (toString(aq) + ",") | |
143 | 149 | ||
144 | 150 | ||
145 | - | func ap (al) = if ((al > 0)) | |
146 | - | then al | |
147 | - | else -(al) | |
151 | + | func ar (aq,as) = fraction(aq, ak, as, HALFEVEN) | |
148 | 152 | ||
149 | 153 | ||
150 | - | func aq (al,an) = if ((al >= an)) | |
151 | - | then al | |
152 | - | else an | |
154 | + | func at (aq,as) = fraction(aq, as, ak, HALFEVEN) | |
153 | 155 | ||
154 | 156 | ||
155 | - | func ar (as,at) = ((as + "_") + at) | |
157 | + | func au (aq) = if ((aq > 0)) | |
158 | + | then aq | |
159 | + | else -(aq) | |
156 | 160 | ||
157 | 161 | ||
158 | - | func au (av) = { | |
159 | - | func aw (ax,ay) = ((ax + ay) + ",") | |
162 | + | func av (aq,as) = if ((aq >= as)) | |
163 | + | then aq | |
164 | + | else as | |
160 | 165 | ||
161 | - | let az = { | |
162 | - | let aA = av | |
163 | - | let aB = size(aA) | |
164 | - | let aC = "" | |
165 | - | func aD (aE,aF) = if ((aF >= aB)) | |
166 | - | then aE | |
167 | - | else aw(aE, aA[aF]) | |
168 | 166 | ||
169 | - | func aG (aE,aF) = if ((aF >= aB)) | |
170 | - | then aE | |
167 | + | func aw (ax,ay) = ((ax + "_") + ay) | |
168 | + | ||
169 | + | ||
170 | + | func az (aA) = { | |
171 | + | func aB (aC,aD) = ((aC + aD) + ",") | |
172 | + | ||
173 | + | let aE = { | |
174 | + | let aF = aA | |
175 | + | let aG = size(aF) | |
176 | + | let aH = "" | |
177 | + | func aI (aJ,aK) = if ((aK >= aG)) | |
178 | + | then aJ | |
179 | + | else aB(aJ, aF[aK]) | |
180 | + | ||
181 | + | func aL (aJ,aK) = if ((aK >= aG)) | |
182 | + | then aJ | |
171 | 183 | else throw("List size exceeds 20") | |
172 | 184 | ||
173 | - | | |
185 | + | aL(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aH, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20) | |
174 | 186 | } | |
175 | - | let | |
176 | - | let | |
177 | - | then drop( | |
178 | - | else | |
179 | - | | |
187 | + | let aM = dropRight(aE, 1) | |
188 | + | let aN = if ((take(aM, 1) == ",")) | |
189 | + | then drop(aM, 1) | |
190 | + | else aM | |
191 | + | aN | |
180 | 192 | } | |
181 | 193 | ||
182 | 194 | ||
183 | - | func | |
195 | + | func aO (aP) = split(aP, ",") | |
184 | 196 | ||
185 | 197 | ||
186 | - | func | |
187 | - | then (removeByIndex( | |
188 | - | else ( | |
198 | + | func aQ (aA,aR,aS) = if ((size(aA) > aR)) | |
199 | + | then (removeByIndex(aA, 0) :+ aS) | |
200 | + | else (aA :+ aS) | |
189 | 201 | ||
190 | 202 | ||
191 | - | func | |
203 | + | func aT (aU) = valueOrErrorMessage(getInteger(this, aU), ("no value for " + aU)) | |
192 | 204 | ||
193 | 205 | ||
194 | - | func | |
206 | + | func aV () = aT(d) | |
195 | 207 | ||
196 | 208 | ||
197 | - | func | |
209 | + | func aW () = aT(l) | |
198 | 210 | ||
199 | 211 | ||
200 | - | func | |
212 | + | func aX () = aT(n) | |
201 | 213 | ||
202 | 214 | ||
203 | - | func | |
215 | + | func aY () = aT(E) | |
204 | 216 | ||
205 | 217 | ||
206 | - | func | |
218 | + | func aZ () = aT(F) | |
207 | 219 | ||
208 | 220 | ||
209 | - | func | |
221 | + | func ba () = aT(G) | |
210 | 222 | ||
211 | 223 | ||
212 | - | func | |
224 | + | func bb () = aT(J) | |
213 | 225 | ||
214 | 226 | ||
215 | - | func | |
227 | + | func bc () = aT(K) | |
216 | 228 | ||
217 | 229 | ||
218 | - | func | |
230 | + | func bd () = aT(B) | |
219 | 231 | ||
220 | 232 | ||
221 | - | func | |
233 | + | func be () = aT(m) | |
222 | 234 | ||
223 | 235 | ||
224 | - | func | |
236 | + | func bf () = (be() * ak) | |
225 | 237 | ||
226 | 238 | ||
227 | - | func | |
239 | + | func bg () = (be() * aj) | |
228 | 240 | ||
229 | 241 | ||
230 | - | func | |
242 | + | func bh () = aT(o) | |
231 | 243 | ||
232 | 244 | ||
233 | - | func | |
245 | + | func bi () = aT(p) | |
234 | 246 | ||
235 | 247 | ||
236 | - | func | |
248 | + | func bj () = aT(q) | |
237 | 249 | ||
238 | 250 | ||
239 | - | func | |
251 | + | func bk () = aT(r) | |
240 | 252 | ||
241 | 253 | ||
242 | - | func | |
254 | + | func bl () = aT(s) | |
243 | 255 | ||
244 | 256 | ||
245 | - | func | |
257 | + | func bm () = aT(t) | |
246 | 258 | ||
247 | 259 | ||
248 | - | func | |
260 | + | func bn () = aT(z) | |
249 | 261 | ||
250 | 262 | ||
251 | - | func | |
263 | + | func bo () = aT(A) | |
252 | 264 | ||
253 | 265 | ||
254 | - | func | |
266 | + | func bp () = aT(I) | |
255 | 267 | ||
256 | 268 | ||
257 | - | func | |
269 | + | func bq () = aT(H) | |
258 | 270 | ||
259 | 271 | ||
260 | - | func bm (bn,bo,bp) = { | |
261 | - | let bq = (bn - bo) | |
262 | - | if (if (bp) | |
263 | - | then (0 > bq) | |
272 | + | func br (bs) = valueOrElse(getString(ad(), "k_sender"), toString(bs.caller)) | |
273 | + | ||
274 | + | ||
275 | + | func bt (bu,bv,bw) = { | |
276 | + | let bx = (bu - bv) | |
277 | + | if (if (bw) | |
278 | + | then (0 > bx) | |
264 | 279 | else false) | |
265 | 280 | then throw("Invalid margin") | |
266 | - | else if (if (!( | |
267 | - | then ( | |
281 | + | else if (if (!(bw)) | |
282 | + | then (bx >= 0) | |
268 | 283 | else false) | |
269 | 284 | then throw("Invalid margin") | |
270 | 285 | else true | |
271 | 286 | } | |
272 | 287 | ||
273 | 288 | ||
274 | - | func | |
289 | + | func by (bz) = if ((bz == 0)) | |
275 | 290 | then throw("Should not be called with _positionSize == 0") | |
276 | - | else if (( | |
277 | - | then | |
278 | - | else | |
291 | + | else if ((bz > 0)) | |
292 | + | then bn() | |
293 | + | else bo() | |
279 | 294 | ||
280 | 295 | ||
281 | - | func | |
282 | - | let | |
283 | - | let | |
284 | - | if ($isInstanceOf( | |
296 | + | func bA (bB) = { | |
297 | + | let bC = getInteger(this, aw(e, bB)) | |
298 | + | let bD = bC | |
299 | + | if ($isInstanceOf(bD, "Int")) | |
285 | 300 | then { | |
286 | - | let | |
287 | - | $Tuple4( | |
301 | + | let bE = bD | |
302 | + | $Tuple4(bE, getIntegerValue(this, aw(f, bB)), getIntegerValue(this, aw(g, bB)), getIntegerValue(this, aw(h, bB))) | |
288 | 303 | } | |
289 | 304 | else $Tuple4(0, 0, 0, 0) | |
290 | 305 | } | |
291 | 306 | ||
292 | 307 | ||
293 | - | func | |
308 | + | func bF (bB) = if ((bA(bB)._1 == 0)) | |
294 | 309 | then throw("No open position") | |
295 | 310 | else true | |
296 | 311 | ||
297 | 312 | ||
298 | - | func | |
313 | + | func bG () = valueOrElse(getBoolean(this, j), false) | |
299 | 314 | ||
300 | 315 | ||
301 | - | func | |
316 | + | func bH () = valueOrElse(getBoolean(this, k), false) | |
302 | 317 | ||
303 | 318 | ||
304 | - | func | |
319 | + | func bI (bJ,bK,bL) = if (bJ) | |
305 | 320 | then { | |
306 | - | let | |
307 | - | if ((0 >= | |
321 | + | let bM = (aZ() - bL) | |
322 | + | if ((0 >= bM)) | |
308 | 323 | then throw("Tx lead to base asset reserve <= 0, revert") | |
309 | - | else $Tuple4(( | |
324 | + | else $Tuple4((aY() + bK), bM, (ba() + bL), (bb() + bK)) | |
310 | 325 | } | |
311 | 326 | else { | |
312 | - | let | |
313 | - | if ((0 >= | |
327 | + | let bN = (aY() - bK) | |
328 | + | if ((0 >= bN)) | |
314 | 329 | then throw("Tx lead to base quote reserve <= 0, revert") | |
315 | - | else $Tuple4( | |
330 | + | else $Tuple4(bN, (aZ() + bL), (ba() - bL), (bb() - bK)) | |
316 | 331 | } | |
317 | 332 | ||
318 | 333 | ||
319 | - | func | |
320 | - | let | |
321 | - | let | |
322 | - | let | |
323 | - | let | |
324 | - | then ( | |
325 | - | else ( | |
326 | - | let | |
327 | - | let | |
328 | - | let | |
329 | - | then | |
330 | - | else -( | |
331 | - | let | |
332 | - | let | |
333 | - | let | |
334 | - | let | |
335 | - | let | |
336 | - | let | |
337 | - | let | |
338 | - | let | |
339 | - | let | |
340 | - | let | |
341 | - | if (( | |
342 | - | then throw(((((((((((((("Price impact " + toString( | |
343 | - | else $Tuple5( | |
334 | + | func bO (bJ,bK) = { | |
335 | + | let bP = aY() | |
336 | + | let bQ = aZ() | |
337 | + | let aU = at(bP, bQ) | |
338 | + | let bR = if (bJ) | |
339 | + | then (bP + bK) | |
340 | + | else (bP - bK) | |
341 | + | let bS = ar(aU, bR) | |
342 | + | let bT = au((bS - bQ)) | |
343 | + | let bU = if (bJ) | |
344 | + | then bT | |
345 | + | else -(bT) | |
346 | + | let bV = bI(bJ, bK, bT) | |
347 | + | let bW = bV._1 | |
348 | + | let bX = bV._2 | |
349 | + | let bY = bV._3 | |
350 | + | let bZ = bV._4 | |
351 | + | let ca = ar(bP, bQ) | |
352 | + | let cb = ar(bK, bT) | |
353 | + | let cc = au((ca - cb)) | |
354 | + | let cd = (ak - ar(ca, (ca + cc))) | |
355 | + | let ce = bl() | |
356 | + | if ((cd > ce)) | |
357 | + | then throw(((((((((((((("Price impact " + toString(cd)) + " > max price impact ") + toString(ce)) + " before quote asset: ") + toString(bP)) + " before base asset: ") + toString(bQ)) + " quote asset amount to exchange: ") + toString(bK)) + " price before: ") + toString(ca)) + " marketPrice: ") + toString(cb))) | |
358 | + | else $Tuple5(bU, bW, bX, bY, bZ) | |
344 | 359 | } | |
345 | 360 | ||
346 | 361 | ||
347 | - | func | |
348 | - | let | |
362 | + | func cf (cg,ch,ci,cj) = { | |
363 | + | let ck = if ((cg != 0)) | |
349 | 364 | then { | |
350 | - | let | |
351 | - | | |
365 | + | let cl = by(cg) | |
366 | + | at((cl - ci), cg) | |
352 | 367 | } | |
353 | 368 | else 0 | |
354 | - | let | |
355 | - | let | |
356 | - | then $Tuple2(0, | |
357 | - | else $Tuple2( | |
358 | - | let | |
359 | - | let | |
360 | - | $Tuple3( | |
369 | + | let cm = ((cj - ck) + ch) | |
370 | + | let cn = if ((0 > cm)) | |
371 | + | then $Tuple2(0, au(cm)) | |
372 | + | else $Tuple2(au(cm), 0) | |
373 | + | let co = cn._1 | |
374 | + | let cp = cn._2 | |
375 | + | $Tuple3(co, cp, ck) | |
361 | 376 | } | |
362 | 377 | ||
363 | 378 | ||
364 | - | func | |
365 | - | let | |
366 | - | if (( | |
379 | + | func cq (bJ,bL,cr,cs,ct) = { | |
380 | + | let ca = ar(cs, ct) | |
381 | + | if ((bL == 0)) | |
367 | 382 | then throw("Invalid base asset amount") | |
368 | 383 | else { | |
369 | - | let | |
370 | - | let | |
371 | - | then ( | |
372 | - | else ( | |
373 | - | let | |
374 | - | let | |
375 | - | let | |
376 | - | let | |
377 | - | let | |
378 | - | let | |
379 | - | let | |
380 | - | let | |
381 | - | let | |
382 | - | let | |
383 | - | let | |
384 | - | if (if (( | |
385 | - | then | |
384 | + | let aU = at(cs, ct) | |
385 | + | let cu = if (bJ) | |
386 | + | then (ct + bL) | |
387 | + | else (ct - bL) | |
388 | + | let cv = ar(aU, cu) | |
389 | + | let cw = au((cv - cs)) | |
390 | + | let ce = bl() | |
391 | + | let cx = bI(!(bJ), cw, bL) | |
392 | + | let bW = cx._1 | |
393 | + | let bX = cx._2 | |
394 | + | let bY = cx._3 | |
395 | + | let bZ = cx._4 | |
396 | + | let cb = ar(cw, bL) | |
397 | + | let cc = au((ca - cb)) | |
398 | + | let cd = (ak - ar(ca, (ca + cc))) | |
399 | + | if (if ((cd > ce)) | |
400 | + | then cr | |
386 | 401 | else false) | |
387 | - | then throw(((((((((((((("Price impact " + toString( | |
388 | - | else $Tuple8( | |
389 | - | then | |
390 | - | else 0)), ( | |
391 | - | then | |
392 | - | else 0)), | |
402 | + | then throw(((((((((((((("Price impact " + toString(cd)) + " > max price impact ") + toString(ce)) + " before quote asset: ") + toString(cs)) + " before base asset: ") + toString(ct)) + " base asset amount to exchange: ") + toString(bL)) + " price before: ") + toString(ca)) + " market price: ") + toString(cb))) | |
403 | + | else $Tuple8(cw, bW, bX, bY, bZ, (bq() - (if (bJ) | |
404 | + | then au(bL) | |
405 | + | else 0)), (bp() - (if (!(bJ)) | |
406 | + | then au(bL) | |
407 | + | else 0)), cd) | |
393 | 408 | } | |
394 | 409 | } | |
395 | 410 | ||
396 | 411 | ||
397 | - | func | |
412 | + | func cy (bJ,bL,cr) = cq(bJ, bL, cr, aY(), aZ()) | |
398 | 413 | ||
399 | 414 | ||
400 | - | func | |
401 | - | let | |
402 | - | let | |
403 | - | let | |
404 | - | let | |
405 | - | | |
415 | + | func cz () = { | |
416 | + | let cA = valueOrErrorMessage(addressFromString(getStringValue(this, c)), "") | |
417 | + | let cB = getStringValue(this, a) | |
418 | + | let cC = getStringValue(this, b) | |
419 | + | let cD = valueOrErrorMessage(getInteger(cA, cB), ((("Can not get oracle price. Oracle: " + toString(cA)) + " key: ") + cB)) | |
420 | + | cD | |
406 | 421 | } | |
407 | 422 | ||
408 | 423 | ||
409 | - | func | |
410 | - | let | |
411 | - | let | |
412 | - | let | |
413 | - | let | |
414 | - | if (( | |
415 | - | then throw(((("Price spread " + toString( | |
424 | + | func cE (cs,ct) = { | |
425 | + | let cF = cz() | |
426 | + | let cG = ar(cs, ct) | |
427 | + | let cH = ar((cF + cG), (2 * ak)) | |
428 | + | let cI = ar(au((cF - cG)), cH) | |
429 | + | if ((cI > bm())) | |
430 | + | then throw(((("Price spread " + toString(cI)) + " > max price spread ") + toString(bm()))) | |
416 | 431 | else true | |
417 | 432 | } | |
418 | 433 | ||
419 | 434 | ||
420 | - | func | |
421 | - | let | |
422 | - | let | |
423 | - | | |
435 | + | func cJ () = { | |
436 | + | let cs = aY() | |
437 | + | let ct = aZ() | |
438 | + | ar(cs, ct) | |
424 | 439 | } | |
425 | 440 | ||
426 | 441 | ||
427 | - | func | |
428 | - | let | |
429 | - | let | |
430 | - | ( | |
442 | + | func cK () = { | |
443 | + | let cF = cz() | |
444 | + | let cL = cJ() | |
445 | + | (ar(au((cF - cL)), cF) > bk()) | |
431 | 446 | } | |
432 | 447 | ||
433 | 448 | ||
434 | - | func | |
435 | - | let | |
436 | - | let | |
437 | - | let | |
449 | + | func cM (bz,cN,cs,ct) = { | |
450 | + | let cO = au(bz) | |
451 | + | let cP = (0 > bz) | |
452 | + | let cQ = if ((cN == an)) | |
438 | 453 | then { | |
439 | - | let | |
440 | - | let | |
441 | - | let | |
442 | - | let | |
443 | - | let | |
444 | - | | |
454 | + | let cR = cq(!(cP), cO, false, cs, ct) | |
455 | + | let cS = cR._1 | |
456 | + | let cT = cR._2 | |
457 | + | let cU = cR._3 | |
458 | + | let cV = cR._4 | |
459 | + | cS | |
445 | 460 | } | |
446 | - | else | |
447 | - | | |
461 | + | else at(cO, cz()) | |
462 | + | cQ | |
448 | 463 | } | |
449 | 464 | ||
450 | 465 | ||
451 | - | func cP (bu,cG) = { | |
452 | - | let cQ = bt(bu) | |
453 | - | let bx = cQ._1 | |
454 | - | let cR = cQ._2 | |
455 | - | let cS = cQ._3 | |
456 | - | let cT = cQ._4 | |
457 | - | if ((bx == 0)) | |
458 | - | then throw("Invalid position size") | |
466 | + | func cW (bz,cX,cs,ct,cN) = if ((bz == 0)) | |
467 | + | then throw("Invalid position size") | |
468 | + | else { | |
469 | + | let cP = (0 > bz) | |
470 | + | let cQ = cM(bz, cN, cs, ct) | |
471 | + | let cY = if (cP) | |
472 | + | then (cX - cQ) | |
473 | + | else (cQ - cX) | |
474 | + | $Tuple2(cQ, cY) | |
475 | + | } | |
476 | + | ||
477 | + | ||
478 | + | func cZ (bB,cN) = { | |
479 | + | let da = bA(bB) | |
480 | + | let bE = da._1 | |
481 | + | let db = da._2 | |
482 | + | let dc = da._3 | |
483 | + | let dd = da._4 | |
484 | + | cW(bE, dc, aY(), aZ(), cN) | |
485 | + | } | |
486 | + | ||
487 | + | ||
488 | + | func de (df,dg,dh) = ar((df - dg), dh) | |
489 | + | ||
490 | + | ||
491 | + | func di (bB,cN) = { | |
492 | + | let dj = bA(bB) | |
493 | + | let bE = dj._1 | |
494 | + | let db = dj._2 | |
495 | + | let dk = dj._3 | |
496 | + | let dd = dj._4 | |
497 | + | let dl = cZ(bB, cN) | |
498 | + | let cQ = dl._1 | |
499 | + | let cY = dl._2 | |
500 | + | let dm = cf(bE, db, dd, cY) | |
501 | + | let co = dm._1 | |
502 | + | let cp = dm._2 | |
503 | + | de(co, cp, cQ) | |
504 | + | } | |
505 | + | ||
506 | + | ||
507 | + | func dn (bB) = di(bB, an) | |
508 | + | ||
509 | + | ||
510 | + | func do (bB,bz) = { | |
511 | + | let dp = av(bj(), (ak - ar(dn(bB), bh()))) | |
512 | + | let dq = at(au(bz), dp) | |
513 | + | let dr = cy((bz > 0), dq, false) | |
514 | + | let ds = dr._1 | |
515 | + | let cd = dr._8 | |
516 | + | if ((bl() > cd)) | |
517 | + | then ds | |
459 | 518 | else { | |
460 | - | let cI = (0 > bx) | |
461 | - | let cJ = cF(bx, cG, aT(), aU()) | |
462 | - | let cU = if (cI) | |
463 | - | then (cS - cJ) | |
464 | - | else (cJ - cS) | |
465 | - | $Tuple2(cJ, cU) | |
519 | + | let dt = at(au(bz), bj()) | |
520 | + | let du = cy((bz > 0), dt, false)._1 | |
521 | + | du | |
466 | 522 | } | |
467 | 523 | } | |
468 | 524 | ||
469 | 525 | ||
470 | - | func cV (cW,cX,cY) = am((cW - cX), cY) | |
471 | - | ||
472 | - | ||
473 | - | func cZ (bu,cG) = { | |
474 | - | let da = bt(bu) | |
475 | - | let bx = da._1 | |
476 | - | let cR = da._2 | |
477 | - | let db = da._3 | |
478 | - | let cT = da._4 | |
479 | - | let dc = cP(bu, cG) | |
480 | - | let cJ = dc._1 | |
481 | - | let cU = dc._2 | |
482 | - | let dd = bY(bx, cR, cT, cU) | |
483 | - | let ch = dd._1 | |
484 | - | let ci = dd._2 | |
485 | - | cV(ch, ci, cJ) | |
526 | + | func dv (bB,cr) = { | |
527 | + | let dw = bA(bB) | |
528 | + | let bE = dw._1 | |
529 | + | let db = dw._2 | |
530 | + | let dc = dw._3 | |
531 | + | let dd = dw._4 | |
532 | + | let cY = cZ(bB, an)._2 | |
533 | + | let dx = cf(bE, db, dd, cY) | |
534 | + | let co = dx._1 | |
535 | + | let cp = dx._2 | |
536 | + | let dt = -(bE) | |
537 | + | let dy = cY | |
538 | + | let dz = -(co) | |
539 | + | let dA = cy((bE > 0), au(bE), cr) | |
540 | + | let du = dA._1 | |
541 | + | let bR = dA._2 | |
542 | + | let bS = dA._3 | |
543 | + | let dB = dA._4 | |
544 | + | let dC = dA._5 | |
545 | + | let dD = dA._6 | |
546 | + | let dE = dA._7 | |
547 | + | let dF = (bc() - dc) | |
548 | + | $Tuple12(dt, cp, dy, dz, bR, bS, dB, dC, dF, du, dD, dE) | |
486 | 549 | } | |
487 | 550 | ||
488 | 551 | ||
489 | - | func de (bu) = cZ(bu, ai) | |
552 | + | func dG () = { | |
553 | + | let dH = ((lastBlock.timestamp / 1000) / 60) | |
554 | + | let dI = (dH - ah) | |
555 | + | let dJ = valueOrElse(getString(this, u), "") | |
556 | + | let dK = split(dJ, ",") | |
557 | + | func dL (aC,dM) = if ((dI >= parseIntValue(dM))) | |
558 | + | then (aC :+ parseIntValue(dM)) | |
559 | + | else aC | |
490 | 560 | ||
561 | + | let dN = { | |
562 | + | let aF = dK | |
563 | + | let aG = size(aF) | |
564 | + | let aH = nil | |
565 | + | func aI (aJ,aK) = if ((aK >= aG)) | |
566 | + | then aJ | |
567 | + | else dL(aJ, aF[aK]) | |
491 | 568 | ||
492 | - | func df (bu,bs) = { | |
493 | - | let dg = aq(be(), (af - am(de(bu), bc()))) | |
494 | - | let dh = ao(ap(bs), dg) | |
495 | - | let di = cr((bs > 0), dh, false) | |
496 | - | let dj = di._1 | |
497 | - | let bW = di._8 | |
498 | - | if ((bg() > bW)) | |
499 | - | then dj | |
500 | - | else { | |
501 | - | let dk = ao(ap(bs), be()) | |
502 | - | let dl = cr((bs > 0), dk, false)._1 | |
503 | - | dl | |
504 | - | } | |
569 | + | func aL (aJ,aK) = if ((aK >= aG)) | |
570 | + | then aJ | |
571 | + | else throw("List size exceeds 20") | |
572 | + | ||
573 | + | aL(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aH, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20) | |
574 | + | } | |
575 | + | let dO = if ((size(dN) > 0)) | |
576 | + | then max(dN) | |
577 | + | else parseIntValue(dK[0]) | |
578 | + | let dP = valueOrElse(getInteger(this, v), 0) | |
579 | + | let dQ = valueOrElse(getInteger(this, ((w + "_") + toString(dP))), 0) | |
580 | + | let dR = valueOrElse(getInteger(this, ((x + "_") + toString(dP))), 0) | |
581 | + | let dS = (dQ + ((dH - dP) * dR)) | |
582 | + | let dT = valueOrElse(getInteger(this, ((w + "_") + toString(dO))), 0) | |
583 | + | let dU = valueOrElse(getInteger(this, ((x + "_") + toString(dO))), 0) | |
584 | + | let dV = (dT + ((dI - dO) * dU)) | |
585 | + | ((dS - dV) / ah) | |
505 | 586 | } | |
506 | 587 | ||
507 | 588 | ||
508 | - | func dm (bu,ck) = { | |
509 | - | let dn = bt(bu) | |
510 | - | let bx = dn._1 | |
511 | - | let cR = dn._2 | |
512 | - | let cS = dn._3 | |
513 | - | let cT = dn._4 | |
514 | - | let cU = cP(bu, ai)._2 | |
515 | - | let do = bY(bx, cR, cT, cU) | |
516 | - | let ch = do._1 | |
517 | - | let ci = do._2 | |
518 | - | let dk = -(bx) | |
519 | - | let dp = cU | |
520 | - | let dq = -(ch) | |
521 | - | let dr = cr((bx > 0), ap(bx), ck) | |
522 | - | let dl = dr._1 | |
523 | - | let bK = dr._2 | |
524 | - | let bL = dr._3 | |
525 | - | let ds = dr._4 | |
526 | - | let dt = dr._5 | |
527 | - | let du = dr._6 | |
528 | - | let dv = dr._7 | |
529 | - | let dw = (aX() - cS) | |
530 | - | $Tuple12(dk, ci, dp, dq, bK, bL, ds, dt, dw, dl, du, dv) | |
589 | + | func dW (dX) = { | |
590 | + | let bz = ba() | |
591 | + | let dY = (bz > 0) | |
592 | + | let dZ = cy(dY, au(bz), false)._1 | |
593 | + | let ea = aZ() | |
594 | + | let eb = at(ea, dX) | |
595 | + | let ec = cW(bz, dZ, eb, ea, an)._2 | |
596 | + | $Tuple2(eb, ec) | |
531 | 597 | } | |
532 | 598 | ||
533 | 599 | ||
534 | - | func dx () = { | |
535 | - | let dy = ((lastBlock.timestamp / 1000) / 60) | |
536 | - | let dz = (dy - ac) | |
537 | - | let dA = valueOrElse(getString(this, t), "") | |
538 | - | let dB = split(dA, ",") | |
539 | - | func dC (ax,dD) = if ((dz >= parseIntValue(dD))) | |
540 | - | then (ax :+ parseIntValue(dD)) | |
541 | - | else ax | |
542 | - | ||
543 | - | let dE = { | |
544 | - | let aA = dB | |
545 | - | let aB = size(aA) | |
546 | - | let aC = nil | |
547 | - | func aD (aE,aF) = if ((aF >= aB)) | |
548 | - | then aE | |
549 | - | else dC(aE, aA[aF]) | |
550 | - | ||
551 | - | func aG (aE,aF) = if ((aF >= aB)) | |
552 | - | then aE | |
553 | - | else throw("List size exceeds 20") | |
554 | - | ||
555 | - | aG(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aC, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20) | |
556 | - | } | |
557 | - | let dF = if ((size(dE) > 0)) | |
558 | - | then max(dE) | |
559 | - | else parseIntValue(dB[0]) | |
560 | - | let dG = valueOrElse(getInteger(this, u), 0) | |
561 | - | let dH = valueOrElse(getInteger(this, ((v + "_") + toString(dG))), 0) | |
562 | - | let dI = valueOrElse(getInteger(this, ((w + "_") + toString(dG))), 0) | |
563 | - | let dJ = (dH + ((dy - dG) * dI)) | |
564 | - | let dK = valueOrElse(getInteger(this, ((v + "_") + toString(dF))), 0) | |
565 | - | let dL = valueOrElse(getInteger(this, ((w + "_") + toString(dF))), 0) | |
566 | - | let dM = (dK + ((dz - dF) * dL)) | |
567 | - | ((dJ - dM) / ac) | |
600 | + | func ed () = { | |
601 | + | let ee = cz() | |
602 | + | let ef = dG() | |
603 | + | let eg = (ef - ee) | |
604 | + | if (if ((bp() == 0)) | |
605 | + | then true | |
606 | + | else (bq() == 0)) | |
607 | + | then $Tuple2(0, 0) | |
608 | + | else if ((0 > eg)) | |
609 | + | then { | |
610 | + | let eh = ar(at(eg, bf()), al) | |
611 | + | let ei = ar(at(eh, bp()), bq()) | |
612 | + | $Tuple2(eh, ei) | |
613 | + | } | |
614 | + | else { | |
615 | + | let ei = ar(at(eg, bf()), al) | |
616 | + | let eh = ar(at(ei, bq()), bp()) | |
617 | + | $Tuple2(eh, ei) | |
618 | + | } | |
568 | 619 | } | |
569 | 620 | ||
570 | 621 | ||
571 | - | func | |
622 | + | func ej (ek,el,em,en,eo,ep,eq,er,es) = [IntegerEntry(n, ek), IntegerEntry(o, el), IntegerEntry(p, em), IntegerEntry(m, en), IntegerEntry(l, eo), IntegerEntry(r, ep), IntegerEntry(s, eq), IntegerEntry(q, er), IntegerEntry(t, es)] | |
572 | 623 | ||
573 | 624 | ||
574 | - | func | |
625 | + | func et (eu,ev,ew,ex,ey) = [IntegerEntry(B, eu), IntegerEntry(z, ev), IntegerEntry(A, ew), IntegerEntry(C, ex), IntegerEntry(D, ey)] | |
575 | 626 | ||
576 | 627 | ||
577 | - | func | |
628 | + | func ez (ay,eA,eB,eC,cl) = [IntegerEntry(aw(e, ay), eA), IntegerEntry(aw(f, ay), eB), IntegerEntry(aw(g, ay), eC), IntegerEntry(aw(h, ay), cl)] | |
578 | 629 | ||
579 | 630 | ||
580 | - | func | |
581 | - | let | |
582 | - | let | |
583 | - | if (( | |
631 | + | func eD (eE) = { | |
632 | + | let dH = ((lastBlock.timestamp / 1000) / 60) | |
633 | + | let eF = valueOrElse(getInteger(this, v), 0) | |
634 | + | if ((eF > dH)) | |
584 | 635 | then throw("TWAP out-of-order") | |
585 | 636 | else { | |
586 | - | let | |
587 | - | then | |
588 | - | else | |
589 | - | if (( | |
637 | + | let dP = if ((eF == 0)) | |
638 | + | then dH | |
639 | + | else eF | |
640 | + | if ((dH > eF)) | |
590 | 641 | then { | |
591 | - | let | |
592 | - | let | |
593 | - | let | |
594 | - | let | |
595 | - | [IntegerEntry( | |
642 | + | let eG = valueOrElse(getInteger(this, ((w + "_") + toString(eF))), 0) | |
643 | + | let eH = valueOrElse(getInteger(this, ((x + "_") + toString(eF))), eE) | |
644 | + | let eI = (eG + ((dH - dP) * eH)) | |
645 | + | let dK = aQ(aO(valueOrElse(getString(this, u), "")), ah, toString(dH)) | |
646 | + | [IntegerEntry(aw(w, toString(dH)), eI), IntegerEntry(aw(x, toString(dH)), eE), IntegerEntry(aw(y, toString(dH)), eF), IntegerEntry(v, dH), StringEntry(u, az(dK))] | |
596 | 647 | } | |
597 | 648 | else { | |
598 | - | let | |
599 | - | let | |
600 | - | let | |
601 | - | let | |
602 | - | [IntegerEntry( | |
649 | + | let eJ = valueOrElse(getInteger(this, aw(y, toString(dH))), 0) | |
650 | + | let eG = valueOrElse(getInteger(this, aw(w, toString(eJ))), 0) | |
651 | + | let eH = valueOrElse(getInteger(this, aw(x, toString(eJ))), eE) | |
652 | + | let eI = (eG + ((dH - eJ) * eH)) | |
653 | + | [IntegerEntry(aw(w, toString(dH)), eI), IntegerEntry(aw(x, toString(dH)), eE)] | |
603 | 654 | } | |
604 | 655 | } | |
605 | 656 | } | |
606 | 657 | ||
607 | 658 | ||
608 | - | func | |
659 | + | func eK (bP,bQ) = [IntegerEntry(E, bP), IntegerEntry(F, bQ)] | |
609 | 660 | ||
610 | 661 | ||
611 | - | func | |
612 | - | then throw(((((("Invalid AMM state data: " + toString( | |
613 | - | else (( | |
662 | + | func eL (bP,bQ,eM,eN,eO,eP,eQ) = if (((eP - eQ) != eM)) | |
663 | + | then throw(((((("Invalid AMM state data: " + toString(eP)) + " + ") + toString(eQ)) + " != ") + toString(eM))) | |
664 | + | else ((eK(bP, bQ) ++ [IntegerEntry(G, eM), IntegerEntry(J, eN), IntegerEntry(K, eO), IntegerEntry(H, eP), IntegerEntry(I, eQ)]) ++ eD(ar(bP, bQ))) | |
614 | 665 | ||
615 | 666 | ||
616 | - | func | |
667 | + | func eR (ay) = [DeleteEntry(aw(e, ay)), DeleteEntry(aw(f, ay)), DeleteEntry(aw(g, ay)), DeleteEntry(aw(h, ay)), IntegerEntry(aw(i, ay), lastBlock.timestamp)] | |
617 | 668 | ||
618 | 669 | ||
619 | - | func | |
620 | - | let | |
621 | - | if (( | |
622 | - | then throw(((("Unable to withdraw " + toString( | |
623 | - | else [ScriptTransfer( | |
670 | + | func eS (ay,eT) = { | |
671 | + | let eU = assetBalance(this, Y()) | |
672 | + | if ((eT > eU)) | |
673 | + | then throw(((("Unable to withdraw " + toString(eT)) + " from contract balance ") + toString(eU))) | |
674 | + | else [ScriptTransfer(ay, eT, Y())] | |
624 | 675 | } | |
625 | 676 | ||
626 | 677 | ||
627 | - | func | |
678 | + | func eV (bs) = if ((0 > bs)) | |
628 | 679 | then throw("Balance") | |
629 | - | else [IntegerEntry(d, | |
680 | + | else [IntegerEntry(d, bs)] | |
630 | 681 | ||
631 | 682 | ||
632 | - | func | |
683 | + | func eW (bs) = [ScriptTransfer(aa(), bs, Y())] | |
633 | 684 | ||
634 | 685 | ||
635 | - | @Callable( | |
636 | - | func pause () = if (( | |
686 | + | @Callable(bs) | |
687 | + | func pause () = if ((bs.caller != W())) | |
637 | 688 | then throw("Invalid togglePause params") | |
638 | - | else [BooleanEntry( | |
689 | + | else [BooleanEntry(k, true)] | |
639 | 690 | ||
640 | 691 | ||
641 | 692 | ||
642 | - | @Callable( | |
643 | - | func unpause () = if (( | |
693 | + | @Callable(bs) | |
694 | + | func unpause () = if ((bs.caller != W())) | |
644 | 695 | then throw("Invalid togglePause params") | |
645 | - | else [BooleanEntry( | |
696 | + | else [BooleanEntry(k, false)] | |
646 | 697 | ||
647 | 698 | ||
648 | 699 | ||
649 | - | @Callable( | |
650 | - | func addLiquidity ( | |
700 | + | @Callable(bs) | |
701 | + | func addLiquidity (bK) = if (if ((bs.caller != W())) | |
651 | 702 | then true | |
652 | - | else (0 >= | |
703 | + | else (0 >= bK)) | |
653 | 704 | then throw("Invalid addLiquidity params") | |
654 | 705 | else { | |
655 | - | let | |
656 | - | let | |
657 | - | let | |
658 | - | let | |
659 | - | let | |
660 | - | let | |
661 | - | | |
706 | + | let bP = aY() | |
707 | + | let bQ = aZ() | |
708 | + | let eE = ar(bP, bQ) | |
709 | + | let eX = ar(bK, eE) | |
710 | + | let eY = (bP + bK) | |
711 | + | let eZ = (bQ + eX) | |
712 | + | eK(eY, eZ) | |
662 | 713 | } | |
663 | 714 | ||
664 | 715 | ||
665 | 716 | ||
666 | - | @Callable( | |
667 | - | func removeLiquidity ( | |
717 | + | @Callable(bs) | |
718 | + | func removeLiquidity (bK) = if (if ((bs.caller != W())) | |
668 | 719 | then true | |
669 | - | else (0 >= | |
720 | + | else (0 >= bK)) | |
670 | 721 | then throw("Invalid removeLiquidity params") | |
671 | 722 | else { | |
672 | - | let | |
673 | - | let | |
674 | - | let | |
675 | - | let | |
676 | - | let | |
677 | - | let | |
678 | - | | |
723 | + | let bP = aY() | |
724 | + | let bQ = aZ() | |
725 | + | let eE = ar(bP, bQ) | |
726 | + | let fa = ar(bK, eE) | |
727 | + | let eY = (bP - bK) | |
728 | + | let eZ = (bQ - fa) | |
729 | + | eK(eY, eZ) | |
679 | 730 | } | |
680 | 731 | ||
681 | 732 | ||
682 | 733 | ||
683 | - | @Callable( | |
684 | - | func changeSettings ( | |
734 | + | @Callable(bs) | |
735 | + | func changeSettings (ek,el,em,en,eo,ep,eq,er,es) = if ((bs.caller != W())) | |
685 | 736 | then throw("Invalid changeSettings params") | |
686 | - | else | |
737 | + | else ej(ek, el, em, en, eo, ep, eq, er, es) | |
687 | 738 | ||
688 | 739 | ||
689 | 740 | ||
690 | - | @Callable( | |
691 | - | func initialize ( | |
741 | + | @Callable(bs) | |
742 | + | func initialize (bP,bQ,en,ek,el,em,eo,fb,fc,fd,ep,eq,er,es) = if (if (if (if (if (if (if (if (if (if (if (if ((0 >= bP)) | |
692 | 743 | then true | |
693 | - | else (0 >= | |
744 | + | else (0 >= bQ)) | |
694 | 745 | then true | |
695 | - | else (0 >= | |
746 | + | else (0 >= en)) | |
696 | 747 | then true | |
697 | - | else (0 >= | |
748 | + | else (0 >= ek)) | |
698 | 749 | then true | |
699 | - | else (0 >= | |
750 | + | else (0 >= el)) | |
700 | 751 | then true | |
701 | - | else (0 >= | |
752 | + | else (0 >= em)) | |
702 | 753 | then true | |
703 | - | else (0 >= | |
754 | + | else (0 >= eo)) | |
704 | 755 | then true | |
705 | - | else (0 >= | |
756 | + | else (0 >= ep)) | |
706 | 757 | then true | |
707 | - | else (0 >= | |
758 | + | else (0 >= eq)) | |
708 | 759 | then true | |
709 | - | else (0 >= | |
760 | + | else (0 >= er)) | |
710 | 761 | then true | |
711 | - | else (0 >= | |
762 | + | else (0 >= es)) | |
712 | 763 | then true | |
713 | - | else | |
764 | + | else bG()) | |
714 | 765 | then throw("Invalid initialize parameters") | |
715 | - | else (((( | |
766 | + | else ((((eL(bP, bQ, 0, 0, 0, 0, 0) ++ ej(ek, el, em, en, eo, ep, eq, er, es)) ++ et((lastBlock.timestamp + en), 0, 0, 0, 0)) ++ eV(0)) ++ [BooleanEntry(j, true), StringEntry(c, fb), StringEntry(a, fc), StringEntry(L, fd)]) | |
716 | 767 | ||
717 | 768 | ||
718 | 769 | ||
719 | - | @Callable( | |
720 | - | func setInitMarginRatio ( | |
770 | + | @Callable(bs) | |
771 | + | func setInitMarginRatio (ek) = if (if ((0 >= ek)) | |
721 | 772 | then true | |
722 | - | else !( | |
773 | + | else !(bG())) | |
723 | 774 | then throw("Invalid setInitMarginRatio parameters") | |
724 | - | else | |
775 | + | else ej(ek, bh(), bi(), be(), aW(), bk(), bl(), bj(), bm()) | |
725 | 776 | ||
726 | 777 | ||
727 | 778 | ||
728 | - | @Callable( | |
729 | - | func decreasePosition ( | |
779 | + | @Callable(bs) | |
780 | + | func decreasePosition (eT,fe,ff) = if (if (if (if (if ((0 >= eT)) | |
730 | 781 | then true | |
731 | - | else !( | |
782 | + | else !(bG())) | |
732 | 783 | then true | |
733 | - | else !( | |
784 | + | else !(bt(ar(ak, fe), aX(), true))) | |
734 | 785 | then true | |
735 | - | else !( | |
786 | + | else !(bF(toString(bs.caller)))) | |
736 | 787 | then true | |
737 | - | else | |
788 | + | else bH()) | |
738 | 789 | then throw("Invalid decreasePosition parameters") | |
739 | 790 | else { | |
740 | - | let | |
741 | - | let | |
742 | - | let | |
743 | - | let | |
744 | - | let | |
745 | - | let | |
746 | - | then | |
747 | - | else | |
748 | - | let | |
749 | - | let | |
750 | - | let | |
751 | - | let | |
752 | - | let | |
753 | - | let | |
791 | + | let fg = bA(toString(bs.caller)) | |
792 | + | let fh = fg._1 | |
793 | + | let fi = fg._2 | |
794 | + | let fj = fg._3 | |
795 | + | let fk = fg._4 | |
796 | + | let fl = if ((fh > 0)) | |
797 | + | then ag | |
798 | + | else af | |
799 | + | let fm = (fl == af) | |
800 | + | let fn = at(eT, fe) | |
801 | + | let fo = cZ(toString(bs.caller), an) | |
802 | + | let fp = fo._1 | |
803 | + | let cY = fo._2 | |
804 | + | let fq = if ((fp > fn)) | |
754 | 805 | then { | |
755 | - | let | |
756 | - | let | |
757 | - | let | |
758 | - | let | |
759 | - | let | |
760 | - | let | |
761 | - | let | |
762 | - | if (if (( | |
763 | - | then ( | |
806 | + | let fr = bO(fm, fn) | |
807 | + | let dt = fr._1 | |
808 | + | let bR = fr._2 | |
809 | + | let bS = fr._3 | |
810 | + | let dB = fr._4 | |
811 | + | let dC = fr._5 | |
812 | + | let fs = au(dt) | |
813 | + | if (if ((ff != 0)) | |
814 | + | then (ff > fs) | |
764 | 815 | else false) | |
765 | - | then throw(((("Too little base asset exchanged, got " + toString( | |
816 | + | then throw(((("Too little base asset exchanged, got " + toString(fs)) + " expected ") + toString(ff))) | |
766 | 817 | else { | |
767 | - | let | |
768 | - | let | |
769 | - | let | |
770 | - | let | |
771 | - | let | |
772 | - | let | |
773 | - | let | |
774 | - | let | |
775 | - | then (( | |
776 | - | else (( | |
777 | - | let | |
778 | - | $Tuple11( | |
779 | - | then | |
780 | - | else 0)), ( | |
781 | - | then | |
818 | + | let dy = ar(at(cY, fs), au(fh)) | |
819 | + | let ft = cf(fh, fi, fk, dy) | |
820 | + | let co = ft._1 | |
821 | + | let cp = ft._2 | |
822 | + | let ck = ft._3 | |
823 | + | let du = fn | |
824 | + | let fu = (cY - dy) | |
825 | + | let fv = if ((fh > 0)) | |
826 | + | then ((fp - du) - fu) | |
827 | + | else ((fu + fp) - du) | |
828 | + | let fw = (fh + dt) | |
829 | + | $Tuple11(fw, co, au(fv), by(fw), bS, bR, dB, dC, (bc() - fn), (bq() - (if ((fw > 0)) | |
830 | + | then au(dt) | |
831 | + | else 0)), (bp() - (if ((0 > fw)) | |
832 | + | then au(dt) | |
782 | 833 | else 0))) | |
783 | 834 | } | |
784 | 835 | } | |
785 | 836 | else throw("Close position first") | |
786 | - | let | |
787 | - | let | |
788 | - | let | |
789 | - | let | |
790 | - | let | |
791 | - | let | |
792 | - | let | |
793 | - | let | |
794 | - | let | |
795 | - | let | |
796 | - | let | |
797 | - | let | |
798 | - | if (( | |
799 | - | then ( | |
837 | + | let fw = fq._1 | |
838 | + | let fx = fq._2 | |
839 | + | let fy = fq._3 | |
840 | + | let fz = fq._4 | |
841 | + | let bS = fq._5 | |
842 | + | let bR = fq._6 | |
843 | + | let dB = fq._7 | |
844 | + | let dC = fq._8 | |
845 | + | let dF = fq._9 | |
846 | + | let dD = fq._10 | |
847 | + | let dE = fq._11 | |
848 | + | let fA = invoke(ac(), "notifyNotional", [toString(bs.caller), fy], nil) | |
849 | + | if ((fA == fA)) | |
850 | + | then (ez(toString(bs.caller), fw, fx, fy, fz) ++ eL(bR, bS, dB, dC, dF, dD, dE)) | |
800 | 851 | else throw("Strict value is not equal to itself.") | |
801 | 852 | } | |
802 | 853 | ||
803 | 854 | ||
804 | 855 | ||
805 | - | @Callable( | |
806 | - | func increasePosition ( | |
807 | - | let | |
808 | - | if (if (if (if (if (if (if (( | |
809 | - | then ( | |
856 | + | @Callable(bs) | |
857 | + | func increasePosition (fl,fe,ff,fB) = { | |
858 | + | let fC = bs.payments[0].amount | |
859 | + | if (if (if (if (if (if (if ((fl != af)) | |
860 | + | then (fl != ag) | |
810 | 861 | else false) | |
811 | 862 | then true | |
812 | - | else (0 >= | |
863 | + | else (0 >= fC)) | |
813 | 864 | then true | |
814 | - | else !( | |
865 | + | else !(bG())) | |
815 | 866 | then true | |
816 | - | else ( | |
867 | + | else (bs.payments[0].assetId != Y())) | |
817 | 868 | then true | |
818 | - | else !( | |
869 | + | else !(bt(ar(ak, fe), aX(), true))) | |
819 | 870 | then true | |
820 | - | else | |
871 | + | else bH()) | |
821 | 872 | then throw("Invalid increasePosition parameters") | |
822 | 873 | else { | |
823 | - | let fh = ao(fg, aR()) | |
824 | - | let ex = (fg - fh) | |
825 | - | let fi = bt(toString(eA.caller)) | |
826 | - | let eM = fi._1 | |
827 | - | let eN = fi._2 | |
828 | - | let eO = fi._3 | |
829 | - | let eP = fi._4 | |
830 | - | let fj = (eM == 0) | |
831 | - | let fk = if ((eM > 0)) | |
832 | - | then (eQ == aa) | |
833 | - | else (eQ == ab) | |
834 | - | let fl = if (!(fj)) | |
835 | - | then fk | |
836 | - | else false | |
837 | - | let eR = (eQ == aa) | |
838 | - | let fm = if (if (fj) | |
839 | - | then true | |
840 | - | else fl) | |
874 | + | let bB = toString(bs.caller) | |
875 | + | let fD = at(fC, aW()) | |
876 | + | let fE = invoke(ae(), "acceptPaymentWithLink", [bB, fB], [AttachedPayment(Y(), fD)]) | |
877 | + | if ((fE == fE)) | |
841 | 878 | then { | |
842 | - | let eS = ao(ex, eJ) | |
843 | - | let fn = bH(eR, eS) | |
844 | - | let bN = fn._1 | |
845 | - | let bK = fn._2 | |
846 | - | let bL = fn._3 | |
847 | - | let ds = fn._4 | |
848 | - | let dt = fn._5 | |
849 | - | if (if ((eK != 0)) | |
850 | - | then (eK > ap(bN)) | |
851 | - | else false) | |
852 | - | then throw(((("Limit error: " + toString(ap(bN))) + " < ") + toString(eK))) | |
879 | + | let fF = { | |
880 | + | let bD = fE | |
881 | + | if ($isInstanceOf(bD, "Int")) | |
882 | + | then { | |
883 | + | let fG = bD | |
884 | + | fG | |
885 | + | } | |
886 | + | else throw("Invalid referrerFee") | |
887 | + | } | |
888 | + | let eT = (fC - fD) | |
889 | + | let fH = (fD - fF) | |
890 | + | let fI = bA(bB) | |
891 | + | let fh = fI._1 | |
892 | + | let fi = fI._2 | |
893 | + | let fj = fI._3 | |
894 | + | let fk = fI._4 | |
895 | + | let fJ = (fh == 0) | |
896 | + | let fK = if ((fh > 0)) | |
897 | + | then (fl == af) | |
898 | + | else (fl == ag) | |
899 | + | let fL = if (!(fJ)) | |
900 | + | then fK | |
901 | + | else false | |
902 | + | let fm = (fl == af) | |
903 | + | let fM = if (if (fJ) | |
904 | + | then true | |
905 | + | else fL) | |
906 | + | then { | |
907 | + | let fn = at(eT, fe) | |
908 | + | let fN = bO(fm, fn) | |
909 | + | let bU = fN._1 | |
910 | + | let bR = fN._2 | |
911 | + | let bS = fN._3 | |
912 | + | let dB = fN._4 | |
913 | + | let dC = fN._5 | |
914 | + | if (if ((ff != 0)) | |
915 | + | then (ff > au(bU)) | |
916 | + | else false) | |
917 | + | then throw(((("Limit error: " + toString(au(bU))) + " < ") + toString(ff))) | |
918 | + | else { | |
919 | + | let fw = (fh + bU) | |
920 | + | let fO = ar(fn, fe) | |
921 | + | let fP = cf(fh, fi, fk, fO) | |
922 | + | let co = fP._1 | |
923 | + | let cT = fP._2 | |
924 | + | let cU = fP._3 | |
925 | + | if (!(cE(bR, bS))) | |
926 | + | then throw("Over max spread limit") | |
927 | + | else $Tuple11(fw, co, (fj + fn), by(fw), bS, bR, dB, dC, (bc() + fn), (bq() + (if ((fw > 0)) | |
928 | + | then au(bU) | |
929 | + | else 0)), (bp() + (if ((0 > fw)) | |
930 | + | then au(bU) | |
931 | + | else 0))) | |
932 | + | } | |
933 | + | } | |
853 | 934 | else { | |
854 | - | let fb = (eM + bN) | |
855 | - | let fo = am(eS, eJ) | |
856 | - | let fp = bY(eM, eN, eP, fo) | |
857 | - | let ch = fp._1 | |
858 | - | let cM = fp._2 | |
859 | - | let cN = fp._3 | |
860 | - | if (!(cx(bK, bL))) | |
861 | - | then throw("Over max spread limit") | |
862 | - | else $Tuple11(fb, ch, (eO + eS), br(fb), bL, bK, ds, dt, (aX() + eS), (bl() + (if ((fb > 0)) | |
863 | - | then ap(bN) | |
864 | - | else 0)), (bk() + (if ((0 > fb)) | |
865 | - | then ap(bN) | |
866 | - | else 0))) | |
935 | + | let fn = at(eT, fe) | |
936 | + | let fQ = cZ(toString(bs.caller), an) | |
937 | + | let fp = fQ._1 | |
938 | + | let cY = fQ._2 | |
939 | + | if ((fp > fn)) | |
940 | + | then throw("Use decreasePosition to decrease position size") | |
941 | + | else throw("Close position first") | |
867 | 942 | } | |
868 | - | } | |
869 | - | else { | |
870 | - | let eS = ao(ex, eJ) | |
871 | - | let fq = cP(toString(eA.caller), ai) | |
872 | - | let eU = fq._1 | |
873 | - | let cU = fq._2 | |
874 | - | if ((eU > eS)) | |
875 | - | then throw("Use decreasePosition to decrease position size") | |
876 | - | else throw("Close position first") | |
877 | - | } | |
878 | - | let fb = fm._1 | |
879 | - | let fc = fm._2 | |
880 | - | let fd = fm._3 | |
881 | - | let fe = fm._4 | |
882 | - | let bL = fm._5 | |
883 | - | let bK = fm._6 | |
884 | - | let ds = fm._7 | |
885 | - | let dt = fm._8 | |
886 | - | let dw = fm._9 | |
887 | - | let du = fm._10 | |
888 | - | let dv = fm._11 | |
889 | - | let fr = (fh / 2) | |
890 | - | let fs = (fh - fr) | |
891 | - | let ft = invoke(W(), "lockNeutrinoSP", [toString(X()), ah], [AttachedPayment(V(), ex)]) | |
892 | - | if ((ft == ft)) | |
893 | - | then { | |
894 | - | let fu = invoke(Y(), "deposit", nil, [AttachedPayment(V(), fs)]) | |
895 | - | if ((fu == fu)) | |
943 | + | let fw = fM._1 | |
944 | + | let fx = fM._2 | |
945 | + | let fy = fM._3 | |
946 | + | let fz = fM._4 | |
947 | + | let bS = fM._5 | |
948 | + | let bR = fM._6 | |
949 | + | let dB = fM._7 | |
950 | + | let dC = fM._8 | |
951 | + | let dF = fM._9 | |
952 | + | let dD = fM._10 | |
953 | + | let dE = fM._11 | |
954 | + | let fR = (fH / 2) | |
955 | + | let fS = (fH - fR) | |
956 | + | let fT = invoke(Z(), "lockNeutrinoSP", [toString(aa()), am], [AttachedPayment(Y(), eT)]) | |
957 | + | if ((fT == fT)) | |
896 | 958 | then { | |
897 | - | let | |
898 | - | if (( | |
959 | + | let fU = invoke(ab(), "deposit", nil, [AttachedPayment(Y(), fS)]) | |
960 | + | if ((fU == fU)) | |
899 | 961 | then { | |
900 | - | let ff = invoke(Z(), "notifyNotional", [toString(eA.caller), fd], nil) | |
901 | - | if ((ff == ff)) | |
902 | - | then (((ed(toString(eA.caller), fb, fc, fd, fe) ++ ep(bK, bL, ds, dt, dw, du, dv)) ++ eB(fr)) ++ ez((aQ() + ex))) | |
962 | + | let fV = invoke(ac(), "notifyFees", [bB, fH], nil) | |
963 | + | if ((fV == fV)) | |
964 | + | then { | |
965 | + | let fA = invoke(ac(), "notifyNotional", [bB, fy], nil) | |
966 | + | if ((fA == fA)) | |
967 | + | then (((ez(bB, fw, fx, fy, fz) ++ eL(bR, bS, dB, dC, dF, dD, dE)) ++ eW(fR)) ++ eV((aV() + eT))) | |
968 | + | else throw("Strict value is not equal to itself.") | |
969 | + | } | |
903 | 970 | else throw("Strict value is not equal to itself.") | |
904 | 971 | } | |
905 | 972 | else throw("Strict value is not equal to itself.") | |
912 | 979 | ||
913 | 980 | ||
914 | 981 | ||
915 | - | @Callable( | |
982 | + | @Callable(bs) | |
916 | 983 | func addMargin () = { | |
917 | - | let | |
918 | - | if (if (if (if (( | |
984 | + | let fC = bs.payments[0].amount | |
985 | + | if (if (if (if ((bs.payments[0].assetId != Y())) | |
919 | 986 | then true | |
920 | - | else !( | |
987 | + | else !(bF(toString(bs.caller)))) | |
921 | 988 | then true | |
922 | - | else !( | |
989 | + | else !(bG())) | |
923 | 990 | then true | |
924 | - | else | |
991 | + | else bH()) | |
925 | 992 | then throw("Invalid addMargin parameters") | |
926 | 993 | else { | |
927 | - | let fh = ao(fg, aR()) | |
928 | - | let ex = (fg - fh) | |
929 | - | let fw = bt(toString(eA.caller)) | |
930 | - | let eM = fw._1 | |
931 | - | let eN = fw._2 | |
932 | - | let eO = fw._3 | |
933 | - | let eP = fw._4 | |
934 | - | let fr = (fh / 2) | |
935 | - | let fs = (fh - fr) | |
936 | - | let ft = invoke(W(), "lockNeutrinoSP", [toString(X()), ah], [AttachedPayment(V(), ex)]) | |
937 | - | if ((ft == ft)) | |
994 | + | let bB = toString(bs.caller) | |
995 | + | let fD = at(fC, aW()) | |
996 | + | let fE = invoke(ae(), "acceptPayment", [bB], [AttachedPayment(Y(), fD)]) | |
997 | + | if ((fE == fE)) | |
938 | 998 | then { | |
939 | - | let fu = invoke(Y(), "deposit", nil, [AttachedPayment(V(), fs)]) | |
940 | - | if ((fu == fu)) | |
999 | + | let fF = { | |
1000 | + | let bD = fE | |
1001 | + | if ($isInstanceOf(bD, "Int")) | |
1002 | + | then { | |
1003 | + | let fG = bD | |
1004 | + | fG | |
1005 | + | } | |
1006 | + | else throw("Invalid referrerFee") | |
1007 | + | } | |
1008 | + | let fH = (fD - fF) | |
1009 | + | let eT = (fC - fD) | |
1010 | + | let fW = bA(bB) | |
1011 | + | let fh = fW._1 | |
1012 | + | let fi = fW._2 | |
1013 | + | let fj = fW._3 | |
1014 | + | let fk = fW._4 | |
1015 | + | let fR = (fH / 2) | |
1016 | + | let fS = (fH - fR) | |
1017 | + | let fT = invoke(Z(), "lockNeutrinoSP", [toString(aa()), am], [AttachedPayment(Y(), eT)]) | |
1018 | + | if ((fT == fT)) | |
941 | 1019 | then { | |
942 | - | let fv = invoke(Z(), "notifyFees", [toString(eA.caller), fh], nil) | |
943 | - | if ((fv == fv)) | |
944 | - | then ((ed(toString(eA.caller), eM, (eN + ex), eO, eP) ++ eB(fr)) ++ ez((aQ() + ex))) | |
1020 | + | let fU = invoke(ab(), "deposit", nil, [AttachedPayment(Y(), fS)]) | |
1021 | + | if ((fU == fU)) | |
1022 | + | then { | |
1023 | + | let fV = invoke(ac(), "notifyFees", [bB, fH], nil) | |
1024 | + | if ((fV == fV)) | |
1025 | + | then ((ez(bB, fh, (fi + eT), fj, fk) ++ eW(fR)) ++ eV((aV() + eT))) | |
1026 | + | else throw("Strict value is not equal to itself.") | |
1027 | + | } | |
945 | 1028 | else throw("Strict value is not equal to itself.") | |
946 | 1029 | } | |
947 | 1030 | else throw("Strict value is not equal to itself.") | |
952 | 1035 | ||
953 | 1036 | ||
954 | 1037 | ||
955 | - | @Callable( | |
956 | - | func removeMargin ( | |
1038 | + | @Callable(bs) | |
1039 | + | func removeMargin (eT) = if (if (if (if ((0 >= eT)) | |
957 | 1040 | then true | |
958 | - | else !( | |
1041 | + | else !(bF(toString(bs.caller)))) | |
959 | 1042 | then true | |
960 | - | else !( | |
1043 | + | else !(bG())) | |
961 | 1044 | then true | |
962 | - | else | |
1045 | + | else bH()) | |
963 | 1046 | then throw("Invalid removeMargin parameters") | |
964 | 1047 | else { | |
965 | - | let | |
966 | - | let | |
967 | - | let | |
968 | - | let | |
969 | - | let | |
970 | - | let | |
971 | - | let | |
972 | - | let | |
973 | - | let | |
974 | - | if (( | |
1048 | + | let fX = bA(toString(bs.caller)) | |
1049 | + | let fh = fX._1 | |
1050 | + | let fi = fX._2 | |
1051 | + | let fj = fX._3 | |
1052 | + | let fk = fX._4 | |
1053 | + | let fY = -(eT) | |
1054 | + | let fZ = cf(fh, fi, fk, fY) | |
1055 | + | let co = fZ._1 | |
1056 | + | let cp = fZ._2 | |
1057 | + | if ((cp != 0)) | |
975 | 1058 | then throw("Invalid removed margin amount") | |
976 | 1059 | else { | |
977 | - | let | |
978 | - | if (!( | |
979 | - | then throw(((("Too much margin removed: " + toString( | |
1060 | + | let ga = de(co, cp, fj) | |
1061 | + | if (!(bt(ga, aX(), true))) | |
1062 | + | then throw(((("Too much margin removed: " + toString(ga)) + " < ") + toString(aX()))) | |
980 | 1063 | else { | |
981 | - | let | |
982 | - | if (( | |
983 | - | then (( | |
1064 | + | let gb = invoke(Z(), "unlockNeutrino", [eT, toBase58String(Y())], nil) | |
1065 | + | if ((gb == gb)) | |
1066 | + | then ((ez(toString(bs.caller), fh, co, fj, by(fh)) ++ eS(bs.caller, eT)) ++ eV((aV() - eT))) | |
984 | 1067 | else throw("Strict value is not equal to itself.") | |
985 | 1068 | } | |
986 | 1069 | } | |
988 | 1071 | ||
989 | 1072 | ||
990 | 1073 | ||
991 | - | @Callable(eA) | |
992 | - | func closePosition () = if (if (if (!(by(toString(eA.caller)))) | |
993 | - | then true | |
994 | - | else !(bz())) | |
995 | - | then true | |
996 | - | else bA()) | |
997 | - | then throw("Invalid closePosition parameters") | |
998 | - | else { | |
999 | - | let fC = dm(toString(eA.caller), true) | |
1000 | - | let cM = fC._1 | |
1001 | - | let fD = fC._2 | |
1002 | - | let dp = fC._3 | |
1003 | - | let dq = fC._4 | |
1004 | - | let bK = fC._5 | |
1005 | - | let bL = fC._6 | |
1006 | - | let ds = fC._7 | |
1007 | - | let dt = fC._8 | |
1008 | - | let dw = fC._9 | |
1009 | - | let cN = fC._10 | |
1010 | - | let du = fC._11 | |
1011 | - | let dv = fC._12 | |
1012 | - | if ((fD > 0)) | |
1013 | - | then throw("Unable to close position with bad debt") | |
1014 | - | else { | |
1015 | - | let fE = ap(dq) | |
1016 | - | let fF = (aQ() - fE) | |
1017 | - | let fG = if ((0 > fF)) | |
1018 | - | then $Tuple2(0, ap(fF)) | |
1019 | - | else $Tuple2(fF, 0) | |
1020 | - | let fH = fG._1 | |
1021 | - | let fI = fG._2 | |
1022 | - | let fJ = if ((fI > 0)) | |
1074 | + | @Callable(bs) | |
1075 | + | func closePosition () = { | |
1076 | + | let gc = br(bs) | |
1077 | + | let gd = valueOrErrorMessage(addressFromString(gc), "Invalid caller") | |
1078 | + | if (if (if (!(bF(gc))) | |
1079 | + | then true | |
1080 | + | else !(bG())) | |
1081 | + | then true | |
1082 | + | else bH()) | |
1083 | + | then throw("Invalid closePosition parameters") | |
1084 | + | else { | |
1085 | + | let ge = dv(gc, true) | |
1086 | + | let cT = ge._1 | |
1087 | + | let gf = ge._2 | |
1088 | + | let dy = ge._3 | |
1089 | + | let dz = ge._4 | |
1090 | + | let bR = ge._5 | |
1091 | + | let bS = ge._6 | |
1092 | + | let dB = ge._7 | |
1093 | + | let dC = ge._8 | |
1094 | + | let dF = ge._9 | |
1095 | + | let cU = ge._10 | |
1096 | + | let dD = ge._11 | |
1097 | + | let dE = ge._12 | |
1098 | + | if ((gf > 0)) | |
1099 | + | then throw("Unable to close position with bad debt") | |
1100 | + | else { | |
1101 | + | let gg = au(dz) | |
1102 | + | let gh = (aV() - gg) | |
1103 | + | let gi = if ((0 > gh)) | |
1104 | + | then $Tuple2(0, au(gh)) | |
1105 | + | else $Tuple2(gh, 0) | |
1106 | + | let gj = gi._1 | |
1107 | + | let gk = gi._2 | |
1108 | + | let fG = if ((gk > 0)) | |
1109 | + | then { | |
1110 | + | let gl = invoke(ab(), "withdraw", [gk], nil) | |
1111 | + | if ((gl == gl)) | |
1112 | + | then nil | |
1113 | + | else throw("Strict value is not equal to itself.") | |
1114 | + | } | |
1115 | + | else nil | |
1116 | + | if ((fG == fG)) | |
1117 | + | then { | |
1118 | + | let gb = invoke(Z(), "unlockNeutrino", [(gg - gk), toBase58String(Y())], nil) | |
1119 | + | if ((gb == gb)) | |
1120 | + | then { | |
1121 | + | let fA = invoke(ac(), "notifyNotional", [gc, 0], nil) | |
1122 | + | if ((fA == fA)) | |
1123 | + | then (((eR(gc) ++ eL(bR, bS, dB, dC, dF, dD, dE)) ++ eS(gd, gg)) ++ eV(gj)) | |
1124 | + | else throw("Strict value is not equal to itself.") | |
1125 | + | } | |
1126 | + | else throw("Strict value is not equal to itself.") | |
1127 | + | } | |
1128 | + | else throw("Strict value is not equal to itself.") | |
1129 | + | } | |
1130 | + | } | |
1131 | + | } | |
1132 | + | ||
1133 | + | ||
1134 | + | ||
1135 | + | @Callable(bs) | |
1136 | + | func liquidate (bB) = { | |
1137 | + | let gm = di(bB, an) | |
1138 | + | let ga = if (cK()) | |
1139 | + | then { | |
1140 | + | let gn = di(bB, ao) | |
1141 | + | av(gm, gn) | |
1142 | + | } | |
1143 | + | else gm | |
1144 | + | if (if (if (if (!(bt(ga, bh(), false))) | |
1145 | + | then true | |
1146 | + | else !(bF(bB))) | |
1147 | + | then true | |
1148 | + | else !(bG())) | |
1149 | + | then true | |
1150 | + | else bH()) | |
1151 | + | then throw("Unable to liquidate") | |
1152 | + | else if (if (if ((gm > bi())) | |
1153 | + | then (bj() > 0) | |
1154 | + | else false) | |
1155 | + | then (ak > bj()) | |
1156 | + | else false) | |
1157 | + | then { | |
1158 | + | let go = bA(bB) | |
1159 | + | let fh = go._1 | |
1160 | + | let fi = go._2 | |
1161 | + | let fj = go._3 | |
1162 | + | let fk = go._4 | |
1163 | + | let fl = if ((fh > 0)) | |
1164 | + | then ag | |
1165 | + | else af | |
1166 | + | let fm = (fl == af) | |
1167 | + | let du = do(bB, fh) | |
1168 | + | let gp = cZ(bB, an) | |
1169 | + | let fp = gp._1 | |
1170 | + | let cY = gp._2 | |
1171 | + | let gq = bO(fm, du) | |
1172 | + | let dt = gq._1 | |
1173 | + | let bR = gq._2 | |
1174 | + | let bS = gq._3 | |
1175 | + | let dB = gq._4 | |
1176 | + | let dC = gq._5 | |
1177 | + | let dy = ar(at(cY, au(dt)), au(fh)) | |
1178 | + | let gr = cf(fh, fi, fk, dy) | |
1179 | + | let co = gr._1 | |
1180 | + | let cp = gr._2 | |
1181 | + | let ck = gr._3 | |
1182 | + | let fu = (cY - dy) | |
1183 | + | let fv = if ((fh > 0)) | |
1184 | + | then ((fp - du) - fu) | |
1185 | + | else ((fu + fp) - du) | |
1186 | + | let gs = at(du, bi()) | |
1187 | + | let gt = (gs / 2) | |
1188 | + | let fS = (gs - gt) | |
1189 | + | let gu = (co - gs) | |
1190 | + | let fw = (fh + dt) | |
1191 | + | let fy = au(fv) | |
1192 | + | let gv = by(fw) | |
1193 | + | let dF = (bc() - du) | |
1194 | + | let gh = (aV() - gs) | |
1195 | + | let gw = if ((0 > gh)) | |
1196 | + | then $Tuple2(0, au(gh)) | |
1197 | + | else $Tuple2(gh, 0) | |
1198 | + | let gx = gw._1 | |
1199 | + | let gy = gw._2 | |
1200 | + | let fG = if ((gy > 0)) | |
1023 | 1201 | then { | |
1024 | - | let | |
1025 | - | if (( | |
1202 | + | let gl = invoke(ab(), "withdraw", [gy], nil) | |
1203 | + | if ((gl == gl)) | |
1026 | 1204 | then nil | |
1027 | 1205 | else throw("Strict value is not equal to itself.") | |
1028 | 1206 | } | |
1029 | 1207 | else nil | |
1030 | - | if (( | |
1208 | + | if ((fG == fG)) | |
1031 | 1209 | then { | |
1032 | - | let | |
1033 | - | if (( | |
1210 | + | let gb = invoke(Z(), "unlockNeutrino", [(gs - gy), toBase58String(Y())], nil) | |
1211 | + | if ((gb == gb)) | |
1034 | 1212 | then { | |
1035 | - | let ff = invoke(Z(), "notifyNotional", [toString(eA.caller), 0], nil) | |
1036 | - | if ((ff == ff)) | |
1037 | - | then (((ev(toString(eA.caller)) ++ ep(bK, bL, ds, dt, dw, du, dv)) ++ ew(eA.caller, fE)) ++ ez(fH)) | |
1038 | - | else throw("Strict value is not equal to itself.") | |
1039 | - | } | |
1040 | - | else throw("Strict value is not equal to itself.") | |
1041 | - | } | |
1042 | - | else throw("Strict value is not equal to itself.") | |
1043 | - | } | |
1044 | - | } | |
1045 | - | ||
1046 | - | ||
1047 | - | ||
1048 | - | @Callable(eA) | |
1049 | - | func liquidate (bu) = { | |
1050 | - | let fL = cZ(bu, ai) | |
1051 | - | let fA = if (cD()) | |
1052 | - | then { | |
1053 | - | let fM = cZ(bu, aj) | |
1054 | - | aq(fL, fM) | |
1055 | - | } | |
1056 | - | else fL | |
1057 | - | if (if (if (if (!(bm(fA, bc(), false))) | |
1058 | - | then true | |
1059 | - | else !(by(bu))) | |
1060 | - | then true | |
1061 | - | else !(bz())) | |
1062 | - | then true | |
1063 | - | else bA()) | |
1064 | - | then throw("Unable to liquidate") | |
1065 | - | else if (if (if ((fL > bd())) | |
1066 | - | then (be() > 0) | |
1067 | - | else false) | |
1068 | - | then (af > be()) | |
1069 | - | else false) | |
1070 | - | then { | |
1071 | - | let fN = bt(bu) | |
1072 | - | let eM = fN._1 | |
1073 | - | let eN = fN._2 | |
1074 | - | let eO = fN._3 | |
1075 | - | let eP = fN._4 | |
1076 | - | let eQ = if ((eM > 0)) | |
1077 | - | then ab | |
1078 | - | else aa | |
1079 | - | let eR = (eQ == aa) | |
1080 | - | let dl = df(bu, eM) | |
1081 | - | let fO = cP(bu, ai) | |
1082 | - | let eU = fO._1 | |
1083 | - | let cU = fO._2 | |
1084 | - | let fP = bH(eR, dl) | |
1085 | - | let dk = fP._1 | |
1086 | - | let bK = fP._2 | |
1087 | - | let bL = fP._3 | |
1088 | - | let ds = fP._4 | |
1089 | - | let dt = fP._5 | |
1090 | - | let dp = am(ao(cU, ap(dk)), ap(eM)) | |
1091 | - | let fQ = bY(eM, eN, eP, dp) | |
1092 | - | let ch = fQ._1 | |
1093 | - | let ci = fQ._2 | |
1094 | - | let cd = fQ._3 | |
1095 | - | let eZ = (cU - dp) | |
1096 | - | let fa = if ((eM > 0)) | |
1097 | - | then ((eU - dl) - eZ) | |
1098 | - | else ((eZ + eU) - dl) | |
1099 | - | let fR = ao(dl, bd()) | |
1100 | - | let fS = (fR / 2) | |
1101 | - | let fs = (fR - fS) | |
1102 | - | let fT = (ch - fR) | |
1103 | - | let fb = (eM + dk) | |
1104 | - | let fd = ap(fa) | |
1105 | - | let fU = br(fb) | |
1106 | - | let dw = (aX() - dl) | |
1107 | - | let fF = (aQ() - fR) | |
1108 | - | let fV = if ((0 > fF)) | |
1109 | - | then $Tuple2(0, ap(fF)) | |
1110 | - | else $Tuple2(fF, 0) | |
1111 | - | let fW = fV._1 | |
1112 | - | let fX = fV._2 | |
1113 | - | let fJ = if ((fX > 0)) | |
1114 | - | then { | |
1115 | - | let fK = invoke(Y(), "withdraw", [fX], nil) | |
1116 | - | if ((fK == fK)) | |
1117 | - | then nil | |
1118 | - | else throw("Strict value is not equal to itself.") | |
1119 | - | } | |
1120 | - | else nil | |
1121 | - | if ((fJ == fJ)) | |
1122 | - | then { | |
1123 | - | let fB = invoke(W(), "unlockNeutrino", [(fR - fX), toBase58String(V())], nil) | |
1124 | - | if ((fB == fB)) | |
1125 | - | then { | |
1126 | - | let fu = invoke(Y(), "deposit", nil, [AttachedPayment(V(), fs)]) | |
1127 | - | if ((fu == fu)) | |
1213 | + | let fU = invoke(ab(), "deposit", nil, [AttachedPayment(Y(), fS)]) | |
1214 | + | if ((fU == fU)) | |
1128 | 1215 | then { | |
1129 | - | let | |
1130 | - | if (( | |
1131 | - | then ((( | |
1132 | - | then | |
1133 | - | else 0)), ( | |
1134 | - | then | |
1135 | - | else 0)))) ++ | |
1216 | + | let fA = invoke(ac(), "notifyNotional", [bB, fy], nil) | |
1217 | + | if ((fA == fA)) | |
1218 | + | then (((ez(bB, fw, gu, fy, gv) ++ eL(bR, bS, dB, dC, dF, (bq() - (if ((fw > 0)) | |
1219 | + | then au(dt) | |
1220 | + | else 0)), (bp() - (if ((0 > fw)) | |
1221 | + | then au(dt) | |
1222 | + | else 0)))) ++ eS(bs.caller, gt)) ++ eV(gx)) | |
1136 | 1223 | else throw("Strict value is not equal to itself.") | |
1137 | 1224 | } | |
1138 | 1225 | else throw("Strict value is not equal to itself.") | |
1142 | 1229 | else throw("Strict value is not equal to itself.") | |
1143 | 1230 | } | |
1144 | 1231 | else { | |
1145 | - | let | |
1146 | - | let | |
1147 | - | let | |
1148 | - | let | |
1149 | - | let | |
1150 | - | let | |
1151 | - | let | |
1152 | - | let | |
1153 | - | let | |
1154 | - | let | |
1155 | - | let | |
1156 | - | let | |
1157 | - | let | |
1158 | - | let | |
1159 | - | let | |
1160 | - | let | |
1161 | - | let | |
1162 | - | let | |
1163 | - | then $Tuple2(0, | |
1164 | - | else $Tuple2( | |
1165 | - | let | |
1166 | - | let | |
1167 | - | let | |
1232 | + | let gz = dv(bB, false) | |
1233 | + | let cT = gz._1 | |
1234 | + | let cp = gz._2 | |
1235 | + | let cU = gz._3 | |
1236 | + | let cV = gz._4 | |
1237 | + | let bR = gz._5 | |
1238 | + | let bS = gz._6 | |
1239 | + | let dB = gz._7 | |
1240 | + | let dC = gz._8 | |
1241 | + | let dF = gz._9 | |
1242 | + | let du = gz._10 | |
1243 | + | let dD = gz._11 | |
1244 | + | let dE = gz._12 | |
1245 | + | let gs = at(du, bi()) | |
1246 | + | let gt = (gs / 2) | |
1247 | + | let fS = (gs - gt) | |
1248 | + | let gh = (aV() - gs) | |
1249 | + | let gA = if ((0 > gh)) | |
1250 | + | then $Tuple2(0, au(gh)) | |
1251 | + | else $Tuple2(gh, 0) | |
1252 | + | let gx = gA._1 | |
1253 | + | let gy = gA._2 | |
1254 | + | let fG = if ((gy > 0)) | |
1168 | 1255 | then { | |
1169 | - | let | |
1170 | - | if (( | |
1256 | + | let gl = invoke(ab(), "withdraw", [gy], nil) | |
1257 | + | if ((gl == gl)) | |
1171 | 1258 | then nil | |
1172 | 1259 | else throw("Strict value is not equal to itself.") | |
1173 | 1260 | } | |
1174 | 1261 | else nil | |
1175 | - | if (( | |
1262 | + | if ((fG == fG)) | |
1176 | 1263 | then { | |
1177 | - | let | |
1178 | - | if (( | |
1264 | + | let gb = invoke(Z(), "unlockNeutrino", [(gs - gy), toBase58String(Y())], nil) | |
1265 | + | if ((gb == gb)) | |
1179 | 1266 | then { | |
1180 | - | let | |
1181 | - | if (( | |
1267 | + | let fU = invoke(ab(), "deposit", nil, [AttachedPayment(Y(), fS)]) | |
1268 | + | if ((fU == fU)) | |
1182 | 1269 | then { | |
1183 | - | let | |
1184 | - | if (( | |
1185 | - | then ((( | |
1270 | + | let fA = invoke(ac(), "notifyNotional", [bB, 0], nil) | |
1271 | + | if ((fA == fA)) | |
1272 | + | then (((eR(bB) ++ eL(bR, bS, dB, dC, dF, dD, dE)) ++ eS(bs.caller, gt)) ++ eV(gx)) | |
1186 | 1273 | else throw("Strict value is not equal to itself.") | |
1187 | 1274 | } | |
1188 | 1275 | else throw("Strict value is not equal to itself.") | |
1195 | 1282 | ||
1196 | 1283 | ||
1197 | 1284 | ||
1198 | - | @Callable( | |
1285 | + | @Callable(bs) | |
1199 | 1286 | func payFunding () = { | |
1200 | - | let | |
1201 | - | if (if (if (( | |
1287 | + | let gB = bd() | |
1288 | + | if (if (if ((gB > lastBlock.timestamp)) | |
1202 | 1289 | then true | |
1203 | - | else !( | |
1290 | + | else !(bG())) | |
1204 | 1291 | then true | |
1205 | - | else | |
1206 | - | then throw(((("Invalid funding block timestamp: " + toString(lastBlock.timestamp)) + " < ") + toString( | |
1292 | + | else bH()) | |
1293 | + | then throw(((("Invalid funding block timestamp: " + toString(lastBlock.timestamp)) + " < ") + toString(gB))) | |
1207 | 1294 | else { | |
1208 | - | let gb = cs() | |
1209 | - | let gc = dx() | |
1210 | - | let gd = (gc - gb) | |
1211 | - | let ge = if (if ((bk() == 0)) | |
1212 | - | then true | |
1213 | - | else (bl() == 0)) | |
1214 | - | then $Tuple2(0, 0) | |
1215 | - | else if ((0 > gd)) | |
1216 | - | then { | |
1217 | - | let gf = am(ao(gd, ba()), ag) | |
1218 | - | let gg = am(ao(gf, bk()), bl()) | |
1219 | - | $Tuple2(gf, gg) | |
1220 | - | } | |
1221 | - | else { | |
1222 | - | let gg = am(ao(gd, ba()), ag) | |
1223 | - | let gf = am(ao(gg, bl()), bk()) | |
1224 | - | $Tuple2(gf, gg) | |
1225 | - | } | |
1226 | - | let gf = ge._1 | |
1227 | - | let gg = ge._2 | |
1228 | - | dX((ga + bb()), (bi() + gg), (bj() + gf), am(gg, gb), am(gf, gb)) | |
1295 | + | let ee = cz() | |
1296 | + | let gC = ed() | |
1297 | + | let eh = gC._1 | |
1298 | + | let ei = gC._2 | |
1299 | + | et((gB + bg()), (bn() + ei), (bo() + eh), ar(ei, ee), ar(eh, ee)) | |
1229 | 1300 | } | |
1230 | 1301 | } | |
1231 | 1302 | ||
1232 | 1303 | ||
1233 | 1304 | ||
1234 | - | @Callable(eA) | |
1235 | - | func v_get (bu) = { | |
1236 | - | let gh = dm(bu, false) | |
1237 | - | let cM = gh._1 | |
1238 | - | let cN = gh._2 | |
1239 | - | let cO = gh._3 | |
1240 | - | let gi = gh._4 | |
1241 | - | throw((((ak(cN) + ak(cO)) + ak(gi)) + ak(de(bu)))) | |
1305 | + | @Callable(bs) | |
1306 | + | func forceMoveAsset (bB,eT) = if (if ((addressFromPublicKey(X()) != bs.caller)) | |
1307 | + | then true | |
1308 | + | else (0 > eT)) | |
1309 | + | then throw("Invalid forceMoveAsset parameters") | |
1310 | + | else { | |
1311 | + | let gb = invoke(Z(), "unlockNeutrino", [eT, toBase58String(Y())], nil) | |
1312 | + | if ((gb == gb)) | |
1313 | + | then (eS(addressFromStringValue(bB), eT) ++ eV((aV() - eT))) | |
1314 | + | else throw("Strict value is not equal to itself.") | |
1315 | + | } | |
1316 | + | ||
1317 | + | ||
1318 | + | ||
1319 | + | @Callable(bs) | |
1320 | + | func adjustPeg (dX) = if (if ((addressFromPublicKey(X()) != bs.caller)) | |
1321 | + | then true | |
1322 | + | else (0 > dX)) | |
1323 | + | then throw("Invalid adjustPeg parameters") | |
1324 | + | else { | |
1325 | + | let gD = dW(dX) | |
1326 | + | let eb = gD._1 | |
1327 | + | let gE = gD._2 | |
1328 | + | if ((gE == 0)) | |
1329 | + | then throw("Nothing to adjust") | |
1330 | + | else if ((gE > 0)) | |
1331 | + | then { | |
1332 | + | let gl = invoke(ab(), "withdraw", [gE], nil) | |
1333 | + | if ((gl == gl)) | |
1334 | + | then { | |
1335 | + | let fT = invoke(Z(), "lockNeutrinoSP", [toString(aa()), am], [AttachedPayment(Y(), gE)]) | |
1336 | + | if ((fT == fT)) | |
1337 | + | then (eV((aV() + gE)) ++ eK(eb, aZ())) | |
1338 | + | else throw("Strict value is not equal to itself.") | |
1339 | + | } | |
1340 | + | else throw("Strict value is not equal to itself.") | |
1341 | + | } | |
1342 | + | else { | |
1343 | + | let gb = invoke(Z(), "unlockNeutrino", [au(gE), toBase58String(Y())], nil) | |
1344 | + | if ((gb == gb)) | |
1345 | + | then { | |
1346 | + | let fU = invoke(ab(), "deposit", nil, [AttachedPayment(Y(), au(gE))]) | |
1347 | + | if ((fU == fU)) | |
1348 | + | then (eV((aV() - au(gE))) ++ eK(eb, aZ())) | |
1349 | + | else throw("Strict value is not equal to itself.") | |
1350 | + | } | |
1351 | + | else throw("Strict value is not equal to itself.") | |
1352 | + | } | |
1353 | + | } | |
1354 | + | ||
1355 | + | ||
1356 | + | ||
1357 | + | @Callable(bs) | |
1358 | + | func v_get (bB) = { | |
1359 | + | let gF = dv(bB, false) | |
1360 | + | let cT = gF._1 | |
1361 | + | let cU = gF._2 | |
1362 | + | let cV = gF._3 | |
1363 | + | let gG = gF._4 | |
1364 | + | throw((((ap(cU) + ap(cV)) + ap(gG)) + ap(dn(bB)))) | |
1242 | 1365 | } | |
1243 | 1366 | ||
1244 | 1367 | ||
1245 | 1368 | ||
1246 | - | @Callable( | |
1247 | - | func view_calcRemainMarginWithFundingPayment ( | |
1248 | - | let | |
1249 | - | let | |
1250 | - | let | |
1251 | - | let | |
1252 | - | let | |
1253 | - | let | |
1254 | - | let | |
1255 | - | let | |
1256 | - | let | |
1257 | - | let | |
1258 | - | let | |
1259 | - | let | |
1260 | - | throw(((((( | |
1369 | + | @Callable(bs) | |
1370 | + | func view_calcRemainMarginWithFundingPayment (bB) = { | |
1371 | + | let gH = bA(bB) | |
1372 | + | let bE = gH._1 | |
1373 | + | let db = gH._2 | |
1374 | + | let dk = gH._3 | |
1375 | + | let dd = gH._4 | |
1376 | + | let gI = cZ(bB, an) | |
1377 | + | let cQ = gI._1 | |
1378 | + | let cY = gI._2 | |
1379 | + | let gJ = cf(bE, db, dd, cY) | |
1380 | + | let co = gJ._1 | |
1381 | + | let cp = gJ._2 | |
1382 | + | let ck = gJ._3 | |
1383 | + | throw((((((ap(co) + ap(ck)) + ap(dn(bB))) + ap(cY)) + ap(cp)) + ap(cQ))) | |
1261 | 1384 | } | |
1262 | 1385 | ||
1263 | 1386 | ||
1264 | 1387 | ||
1265 | - | @Callable(eA) | |
1266 | - | func forceMoveAsset (bu,ex) = if (if ((addressFromPublicKey(U()) != eA.caller)) | |
1267 | - | then true | |
1268 | - | else (0 > ex)) | |
1269 | - | then throw("Invalid forceMoveAsset parameters") | |
1270 | - | else { | |
1271 | - | let fB = invoke(W(), "unlockNeutrino", [ex, toBase58String(V())], nil) | |
1272 | - | if ((fB == fB)) | |
1273 | - | then (ew(addressFromStringValue(bu), ex) ++ ez((aQ() - ex))) | |
1274 | - | else throw("Strict value is not equal to itself.") | |
1275 | - | } | |
1388 | + | @Callable(bs) | |
1389 | + | func view_getPegAdjustCost (dX) = { | |
1390 | + | let ec = dW(dX) | |
1391 | + | throw(toString(ec._2)) | |
1392 | + | } | |
1276 | 1393 | ||
1277 | 1394 | ||
1278 | - | @Verifier(gm) | |
1279 | - | func gn () = sigVerify(gm.bodyBytes, gm.proofs[0], U()) | |
1395 | + | ||
1396 | + | @Callable(bs) | |
1397 | + | func view_getFunding () = { | |
1398 | + | let ee = cz() | |
1399 | + | let gK = ed() | |
1400 | + | let eh = gK._1 | |
1401 | + | let ei = gK._2 | |
1402 | + | let gL = ar(ei, ee) | |
1403 | + | let gM = ar(eh, ee) | |
1404 | + | throw((((ap(gL) + ap(gM)) + ap(dG())) + ap(cz()))) | |
1405 | + | } | |
1406 | + | ||
1407 | + | ||
1408 | + | @Verifier(gN) | |
1409 | + | func gO () = sigVerify(gN.bodyBytes, gN.proofs[0], X()) | |
1280 | 1410 |
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 6 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | 4 | let a = "k_ora_key" | |
5 | 5 | ||
6 | 6 | let b = "k_ora_block_key" | |
7 | 7 | ||
8 | 8 | let c = "k_ora" | |
9 | 9 | ||
10 | 10 | let d = "k_balance" | |
11 | 11 | ||
12 | 12 | let e = "k_positionSize" | |
13 | 13 | ||
14 | 14 | let f = "k_positionMargin" | |
15 | 15 | ||
16 | 16 | let g = "k_positionOpenNotional" | |
17 | 17 | ||
18 | 18 | let h = "k_positionFraction" | |
19 | 19 | ||
20 | - | let i = "k_ | |
20 | + | let i = "k_positionClosedDate" | |
21 | 21 | ||
22 | - | let j = "k_ | |
22 | + | let j = "k_initialized" | |
23 | 23 | ||
24 | - | let k = "k_ | |
24 | + | let k = "k_paused" | |
25 | 25 | ||
26 | - | let l = "k_ | |
26 | + | let l = "k_fee" | |
27 | 27 | ||
28 | - | let m = "k_ | |
28 | + | let m = "k_fundingPeriod" | |
29 | 29 | ||
30 | - | let n = "k_ | |
30 | + | let n = "k_initMarginRatio" | |
31 | 31 | ||
32 | - | let o = "k_ | |
32 | + | let o = "k_mmr" | |
33 | 33 | ||
34 | - | let p = "k_ | |
34 | + | let p = "k_liquidationFeeRatio" | |
35 | 35 | ||
36 | - | let q = "k_ | |
36 | + | let q = "k_partLiquidationRatio" | |
37 | 37 | ||
38 | - | let r = "k_ | |
38 | + | let r = "k_spreadLimit" | |
39 | 39 | ||
40 | - | let s = "k_ | |
40 | + | let s = "k_maxPriceImpact" | |
41 | 41 | ||
42 | - | let t = "k_ | |
42 | + | let t = "k_maxPriceSpread" | |
43 | 43 | ||
44 | - | let u = "k_ | |
44 | + | let u = "k_lastDataStr" | |
45 | 45 | ||
46 | - | let v = "k_ | |
46 | + | let v = "k_lastMinuteId" | |
47 | 47 | ||
48 | - | let w = "k_ | |
48 | + | let w = "k_twapDataLastCumulativePrice" | |
49 | 49 | ||
50 | - | let x = "k_ | |
50 | + | let x = "k_twapDataLastPrice" | |
51 | 51 | ||
52 | - | let y = "k_ | |
52 | + | let y = "k_twapDataPreviousMinuteId" | |
53 | 53 | ||
54 | - | let z = "k_ | |
54 | + | let z = "k_latestLongPremiumFraction" | |
55 | 55 | ||
56 | - | let A = "k_ | |
56 | + | let A = "k_latestShortPremiumFraction" | |
57 | 57 | ||
58 | - | let B = "k_ | |
58 | + | let B = "k_nextFundingBlockMinTimestamp" | |
59 | 59 | ||
60 | - | let C = "k_ | |
60 | + | let C = "k_longFundingRate" | |
61 | 61 | ||
62 | - | let D = "k_ | |
62 | + | let D = "k_shortFundingRate" | |
63 | 63 | ||
64 | - | let E = "k_ | |
64 | + | let E = "k_qtAstR" | |
65 | 65 | ||
66 | - | let F = "k_ | |
66 | + | let F = "k_bsAstR" | |
67 | 67 | ||
68 | - | let G = "k_ | |
68 | + | let G = "k_totalPositionSize" | |
69 | 69 | ||
70 | - | let H = "k_ | |
70 | + | let H = "k_totalLongPositionSize" | |
71 | 71 | ||
72 | - | let I = "k_ | |
72 | + | let I = "k_totalShortPositionSize" | |
73 | 73 | ||
74 | - | let J = "k_ | |
74 | + | let J = "k_cumulativeNotional" | |
75 | 75 | ||
76 | - | let K = "k_ | |
76 | + | let K = "k_openInterestNotional" | |
77 | 77 | ||
78 | - | let L = "k_ | |
78 | + | let L = "k_coordinatorAddress" | |
79 | 79 | ||
80 | - | let M = "k_ | |
80 | + | let M = "k_insurance_address" | |
81 | 81 | ||
82 | - | let N = "k_admin_ | |
82 | + | let N = "k_admin_address" | |
83 | 83 | ||
84 | - | let O = "k_ | |
84 | + | let O = "k_admin_public_key" | |
85 | 85 | ||
86 | - | let P = "k_quote_ | |
86 | + | let P = "k_quote_asset" | |
87 | 87 | ||
88 | - | let Q = "k_staking | |
88 | + | let Q = "k_quote_staking" | |
89 | 89 | ||
90 | - | let R = "k_ | |
90 | + | let R = "k_staking_address" | |
91 | 91 | ||
92 | - | func S () = valueOrErrorMessage(addressFromString(getStringValue(this, K)), "Coordinator not set") | |
92 | + | let S = "k_miner_address" | |
93 | + | ||
94 | + | let T = "k_orders_address" | |
95 | + | ||
96 | + | let U = "k_referral_address" | |
97 | + | ||
98 | + | func V () = valueOrErrorMessage(addressFromString(getStringValue(this, L)), "Coordinator not set") | |
93 | 99 | ||
94 | 100 | ||
95 | - | func | |
101 | + | func W () = addressFromString(getStringValue(V(), N)) | |
96 | 102 | ||
97 | 103 | ||
98 | - | func | |
104 | + | func X () = fromBase58String(getStringValue(V(), O)) | |
99 | 105 | ||
100 | 106 | ||
101 | - | func | |
107 | + | func Y () = fromBase58String(getStringValue(V(), P)) | |
102 | 108 | ||
103 | 109 | ||
104 | - | func | |
110 | + | func Z () = valueOrErrorMessage(addressFromString(getStringValue(V(), Q)), "Quote asset staking not set") | |
105 | 111 | ||
106 | 112 | ||
107 | - | func | |
113 | + | func aa () = valueOrErrorMessage(addressFromString(getStringValue(V(), R)), "Staking not set") | |
108 | 114 | ||
109 | 115 | ||
110 | - | func | |
116 | + | func ab () = valueOrErrorMessage(addressFromString(getStringValue(V(), M)), "Insurance not set") | |
111 | 117 | ||
112 | 118 | ||
113 | - | func | |
119 | + | func ac () = valueOrErrorMessage(addressFromString(getStringValue(V(), S)), "Miner not set") | |
114 | 120 | ||
115 | 121 | ||
116 | - | let aa = 1 | |
117 | - | ||
118 | - | let ab = 2 | |
119 | - | ||
120 | - | let ac = 15 | |
121 | - | ||
122 | - | let ad = 15 | |
123 | - | ||
124 | - | let ae = 1000 | |
125 | - | ||
126 | - | let af = (1 * (((((10 * 10) * 10) * 10) * 10) * 10)) | |
127 | - | ||
128 | - | let ag = (86400 * af) | |
129 | - | ||
130 | - | let ah = 100 | |
131 | - | ||
132 | - | let ai = 1 | |
133 | - | ||
134 | - | let aj = 2 | |
135 | - | ||
136 | - | func ak (al) = (toString(al) + ",") | |
122 | + | func ad () = valueOrErrorMessage(addressFromString(getStringValue(V(), T)), "Orders not set") | |
137 | 123 | ||
138 | 124 | ||
139 | - | func | |
125 | + | func ae () = valueOrErrorMessage(addressFromString(getStringValue(V(), U)), "Referral not set") | |
140 | 126 | ||
141 | 127 | ||
142 | - | func ao (al,an) = fraction(al, an, af, HALFEVEN) | |
128 | + | let af = 1 | |
129 | + | ||
130 | + | let ag = 2 | |
131 | + | ||
132 | + | let ah = 15 | |
133 | + | ||
134 | + | let ai = 15 | |
135 | + | ||
136 | + | let aj = 1000 | |
137 | + | ||
138 | + | let ak = (1 * (((((10 * 10) * 10) * 10) * 10) * 10)) | |
139 | + | ||
140 | + | let al = (86400 * ak) | |
141 | + | ||
142 | + | let am = 100 | |
143 | + | ||
144 | + | let an = 1 | |
145 | + | ||
146 | + | let ao = 2 | |
147 | + | ||
148 | + | func ap (aq) = (toString(aq) + ",") | |
143 | 149 | ||
144 | 150 | ||
145 | - | func ap (al) = if ((al > 0)) | |
146 | - | then al | |
147 | - | else -(al) | |
151 | + | func ar (aq,as) = fraction(aq, ak, as, HALFEVEN) | |
148 | 152 | ||
149 | 153 | ||
150 | - | func aq (al,an) = if ((al >= an)) | |
151 | - | then al | |
152 | - | else an | |
154 | + | func at (aq,as) = fraction(aq, as, ak, HALFEVEN) | |
153 | 155 | ||
154 | 156 | ||
155 | - | func ar (as,at) = ((as + "_") + at) | |
157 | + | func au (aq) = if ((aq > 0)) | |
158 | + | then aq | |
159 | + | else -(aq) | |
156 | 160 | ||
157 | 161 | ||
158 | - | func au (av) = { | |
159 | - | func aw (ax,ay) = ((ax + ay) + ",") | |
162 | + | func av (aq,as) = if ((aq >= as)) | |
163 | + | then aq | |
164 | + | else as | |
160 | 165 | ||
161 | - | let az = { | |
162 | - | let aA = av | |
163 | - | let aB = size(aA) | |
164 | - | let aC = "" | |
165 | - | func aD (aE,aF) = if ((aF >= aB)) | |
166 | - | then aE | |
167 | - | else aw(aE, aA[aF]) | |
168 | 166 | ||
169 | - | func aG (aE,aF) = if ((aF >= aB)) | |
170 | - | then aE | |
167 | + | func aw (ax,ay) = ((ax + "_") + ay) | |
168 | + | ||
169 | + | ||
170 | + | func az (aA) = { | |
171 | + | func aB (aC,aD) = ((aC + aD) + ",") | |
172 | + | ||
173 | + | let aE = { | |
174 | + | let aF = aA | |
175 | + | let aG = size(aF) | |
176 | + | let aH = "" | |
177 | + | func aI (aJ,aK) = if ((aK >= aG)) | |
178 | + | then aJ | |
179 | + | else aB(aJ, aF[aK]) | |
180 | + | ||
181 | + | func aL (aJ,aK) = if ((aK >= aG)) | |
182 | + | then aJ | |
171 | 183 | else throw("List size exceeds 20") | |
172 | 184 | ||
173 | - | | |
185 | + | aL(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aH, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20) | |
174 | 186 | } | |
175 | - | let | |
176 | - | let | |
177 | - | then drop( | |
178 | - | else | |
179 | - | | |
187 | + | let aM = dropRight(aE, 1) | |
188 | + | let aN = if ((take(aM, 1) == ",")) | |
189 | + | then drop(aM, 1) | |
190 | + | else aM | |
191 | + | aN | |
180 | 192 | } | |
181 | 193 | ||
182 | 194 | ||
183 | - | func | |
195 | + | func aO (aP) = split(aP, ",") | |
184 | 196 | ||
185 | 197 | ||
186 | - | func | |
187 | - | then (removeByIndex( | |
188 | - | else ( | |
198 | + | func aQ (aA,aR,aS) = if ((size(aA) > aR)) | |
199 | + | then (removeByIndex(aA, 0) :+ aS) | |
200 | + | else (aA :+ aS) | |
189 | 201 | ||
190 | 202 | ||
191 | - | func | |
203 | + | func aT (aU) = valueOrErrorMessage(getInteger(this, aU), ("no value for " + aU)) | |
192 | 204 | ||
193 | 205 | ||
194 | - | func | |
206 | + | func aV () = aT(d) | |
195 | 207 | ||
196 | 208 | ||
197 | - | func | |
209 | + | func aW () = aT(l) | |
198 | 210 | ||
199 | 211 | ||
200 | - | func | |
212 | + | func aX () = aT(n) | |
201 | 213 | ||
202 | 214 | ||
203 | - | func | |
215 | + | func aY () = aT(E) | |
204 | 216 | ||
205 | 217 | ||
206 | - | func | |
218 | + | func aZ () = aT(F) | |
207 | 219 | ||
208 | 220 | ||
209 | - | func | |
221 | + | func ba () = aT(G) | |
210 | 222 | ||
211 | 223 | ||
212 | - | func | |
224 | + | func bb () = aT(J) | |
213 | 225 | ||
214 | 226 | ||
215 | - | func | |
227 | + | func bc () = aT(K) | |
216 | 228 | ||
217 | 229 | ||
218 | - | func | |
230 | + | func bd () = aT(B) | |
219 | 231 | ||
220 | 232 | ||
221 | - | func | |
233 | + | func be () = aT(m) | |
222 | 234 | ||
223 | 235 | ||
224 | - | func | |
236 | + | func bf () = (be() * ak) | |
225 | 237 | ||
226 | 238 | ||
227 | - | func | |
239 | + | func bg () = (be() * aj) | |
228 | 240 | ||
229 | 241 | ||
230 | - | func | |
242 | + | func bh () = aT(o) | |
231 | 243 | ||
232 | 244 | ||
233 | - | func | |
245 | + | func bi () = aT(p) | |
234 | 246 | ||
235 | 247 | ||
236 | - | func | |
248 | + | func bj () = aT(q) | |
237 | 249 | ||
238 | 250 | ||
239 | - | func | |
251 | + | func bk () = aT(r) | |
240 | 252 | ||
241 | 253 | ||
242 | - | func | |
254 | + | func bl () = aT(s) | |
243 | 255 | ||
244 | 256 | ||
245 | - | func | |
257 | + | func bm () = aT(t) | |
246 | 258 | ||
247 | 259 | ||
248 | - | func | |
260 | + | func bn () = aT(z) | |
249 | 261 | ||
250 | 262 | ||
251 | - | func | |
263 | + | func bo () = aT(A) | |
252 | 264 | ||
253 | 265 | ||
254 | - | func | |
266 | + | func bp () = aT(I) | |
255 | 267 | ||
256 | 268 | ||
257 | - | func | |
269 | + | func bq () = aT(H) | |
258 | 270 | ||
259 | 271 | ||
260 | - | func bm (bn,bo,bp) = { | |
261 | - | let bq = (bn - bo) | |
262 | - | if (if (bp) | |
263 | - | then (0 > bq) | |
272 | + | func br (bs) = valueOrElse(getString(ad(), "k_sender"), toString(bs.caller)) | |
273 | + | ||
274 | + | ||
275 | + | func bt (bu,bv,bw) = { | |
276 | + | let bx = (bu - bv) | |
277 | + | if (if (bw) | |
278 | + | then (0 > bx) | |
264 | 279 | else false) | |
265 | 280 | then throw("Invalid margin") | |
266 | - | else if (if (!( | |
267 | - | then ( | |
281 | + | else if (if (!(bw)) | |
282 | + | then (bx >= 0) | |
268 | 283 | else false) | |
269 | 284 | then throw("Invalid margin") | |
270 | 285 | else true | |
271 | 286 | } | |
272 | 287 | ||
273 | 288 | ||
274 | - | func | |
289 | + | func by (bz) = if ((bz == 0)) | |
275 | 290 | then throw("Should not be called with _positionSize == 0") | |
276 | - | else if (( | |
277 | - | then | |
278 | - | else | |
291 | + | else if ((bz > 0)) | |
292 | + | then bn() | |
293 | + | else bo() | |
279 | 294 | ||
280 | 295 | ||
281 | - | func | |
282 | - | let | |
283 | - | let | |
284 | - | if ($isInstanceOf( | |
296 | + | func bA (bB) = { | |
297 | + | let bC = getInteger(this, aw(e, bB)) | |
298 | + | let bD = bC | |
299 | + | if ($isInstanceOf(bD, "Int")) | |
285 | 300 | then { | |
286 | - | let | |
287 | - | $Tuple4( | |
301 | + | let bE = bD | |
302 | + | $Tuple4(bE, getIntegerValue(this, aw(f, bB)), getIntegerValue(this, aw(g, bB)), getIntegerValue(this, aw(h, bB))) | |
288 | 303 | } | |
289 | 304 | else $Tuple4(0, 0, 0, 0) | |
290 | 305 | } | |
291 | 306 | ||
292 | 307 | ||
293 | - | func | |
308 | + | func bF (bB) = if ((bA(bB)._1 == 0)) | |
294 | 309 | then throw("No open position") | |
295 | 310 | else true | |
296 | 311 | ||
297 | 312 | ||
298 | - | func | |
313 | + | func bG () = valueOrElse(getBoolean(this, j), false) | |
299 | 314 | ||
300 | 315 | ||
301 | - | func | |
316 | + | func bH () = valueOrElse(getBoolean(this, k), false) | |
302 | 317 | ||
303 | 318 | ||
304 | - | func | |
319 | + | func bI (bJ,bK,bL) = if (bJ) | |
305 | 320 | then { | |
306 | - | let | |
307 | - | if ((0 >= | |
321 | + | let bM = (aZ() - bL) | |
322 | + | if ((0 >= bM)) | |
308 | 323 | then throw("Tx lead to base asset reserve <= 0, revert") | |
309 | - | else $Tuple4(( | |
324 | + | else $Tuple4((aY() + bK), bM, (ba() + bL), (bb() + bK)) | |
310 | 325 | } | |
311 | 326 | else { | |
312 | - | let | |
313 | - | if ((0 >= | |
327 | + | let bN = (aY() - bK) | |
328 | + | if ((0 >= bN)) | |
314 | 329 | then throw("Tx lead to base quote reserve <= 0, revert") | |
315 | - | else $Tuple4( | |
330 | + | else $Tuple4(bN, (aZ() + bL), (ba() - bL), (bb() - bK)) | |
316 | 331 | } | |
317 | 332 | ||
318 | 333 | ||
319 | - | func | |
320 | - | let | |
321 | - | let | |
322 | - | let | |
323 | - | let | |
324 | - | then ( | |
325 | - | else ( | |
326 | - | let | |
327 | - | let | |
328 | - | let | |
329 | - | then | |
330 | - | else -( | |
331 | - | let | |
332 | - | let | |
333 | - | let | |
334 | - | let | |
335 | - | let | |
336 | - | let | |
337 | - | let | |
338 | - | let | |
339 | - | let | |
340 | - | let | |
341 | - | if (( | |
342 | - | then throw(((((((((((((("Price impact " + toString( | |
343 | - | else $Tuple5( | |
334 | + | func bO (bJ,bK) = { | |
335 | + | let bP = aY() | |
336 | + | let bQ = aZ() | |
337 | + | let aU = at(bP, bQ) | |
338 | + | let bR = if (bJ) | |
339 | + | then (bP + bK) | |
340 | + | else (bP - bK) | |
341 | + | let bS = ar(aU, bR) | |
342 | + | let bT = au((bS - bQ)) | |
343 | + | let bU = if (bJ) | |
344 | + | then bT | |
345 | + | else -(bT) | |
346 | + | let bV = bI(bJ, bK, bT) | |
347 | + | let bW = bV._1 | |
348 | + | let bX = bV._2 | |
349 | + | let bY = bV._3 | |
350 | + | let bZ = bV._4 | |
351 | + | let ca = ar(bP, bQ) | |
352 | + | let cb = ar(bK, bT) | |
353 | + | let cc = au((ca - cb)) | |
354 | + | let cd = (ak - ar(ca, (ca + cc))) | |
355 | + | let ce = bl() | |
356 | + | if ((cd > ce)) | |
357 | + | then throw(((((((((((((("Price impact " + toString(cd)) + " > max price impact ") + toString(ce)) + " before quote asset: ") + toString(bP)) + " before base asset: ") + toString(bQ)) + " quote asset amount to exchange: ") + toString(bK)) + " price before: ") + toString(ca)) + " marketPrice: ") + toString(cb))) | |
358 | + | else $Tuple5(bU, bW, bX, bY, bZ) | |
344 | 359 | } | |
345 | 360 | ||
346 | 361 | ||
347 | - | func | |
348 | - | let | |
362 | + | func cf (cg,ch,ci,cj) = { | |
363 | + | let ck = if ((cg != 0)) | |
349 | 364 | then { | |
350 | - | let | |
351 | - | | |
365 | + | let cl = by(cg) | |
366 | + | at((cl - ci), cg) | |
352 | 367 | } | |
353 | 368 | else 0 | |
354 | - | let | |
355 | - | let | |
356 | - | then $Tuple2(0, | |
357 | - | else $Tuple2( | |
358 | - | let | |
359 | - | let | |
360 | - | $Tuple3( | |
369 | + | let cm = ((cj - ck) + ch) | |
370 | + | let cn = if ((0 > cm)) | |
371 | + | then $Tuple2(0, au(cm)) | |
372 | + | else $Tuple2(au(cm), 0) | |
373 | + | let co = cn._1 | |
374 | + | let cp = cn._2 | |
375 | + | $Tuple3(co, cp, ck) | |
361 | 376 | } | |
362 | 377 | ||
363 | 378 | ||
364 | - | func | |
365 | - | let | |
366 | - | if (( | |
379 | + | func cq (bJ,bL,cr,cs,ct) = { | |
380 | + | let ca = ar(cs, ct) | |
381 | + | if ((bL == 0)) | |
367 | 382 | then throw("Invalid base asset amount") | |
368 | 383 | else { | |
369 | - | let | |
370 | - | let | |
371 | - | then ( | |
372 | - | else ( | |
373 | - | let | |
374 | - | let | |
375 | - | let | |
376 | - | let | |
377 | - | let | |
378 | - | let | |
379 | - | let | |
380 | - | let | |
381 | - | let | |
382 | - | let | |
383 | - | let | |
384 | - | if (if (( | |
385 | - | then | |
384 | + | let aU = at(cs, ct) | |
385 | + | let cu = if (bJ) | |
386 | + | then (ct + bL) | |
387 | + | else (ct - bL) | |
388 | + | let cv = ar(aU, cu) | |
389 | + | let cw = au((cv - cs)) | |
390 | + | let ce = bl() | |
391 | + | let cx = bI(!(bJ), cw, bL) | |
392 | + | let bW = cx._1 | |
393 | + | let bX = cx._2 | |
394 | + | let bY = cx._3 | |
395 | + | let bZ = cx._4 | |
396 | + | let cb = ar(cw, bL) | |
397 | + | let cc = au((ca - cb)) | |
398 | + | let cd = (ak - ar(ca, (ca + cc))) | |
399 | + | if (if ((cd > ce)) | |
400 | + | then cr | |
386 | 401 | else false) | |
387 | - | then throw(((((((((((((("Price impact " + toString( | |
388 | - | else $Tuple8( | |
389 | - | then | |
390 | - | else 0)), ( | |
391 | - | then | |
392 | - | else 0)), | |
402 | + | then throw(((((((((((((("Price impact " + toString(cd)) + " > max price impact ") + toString(ce)) + " before quote asset: ") + toString(cs)) + " before base asset: ") + toString(ct)) + " base asset amount to exchange: ") + toString(bL)) + " price before: ") + toString(ca)) + " market price: ") + toString(cb))) | |
403 | + | else $Tuple8(cw, bW, bX, bY, bZ, (bq() - (if (bJ) | |
404 | + | then au(bL) | |
405 | + | else 0)), (bp() - (if (!(bJ)) | |
406 | + | then au(bL) | |
407 | + | else 0)), cd) | |
393 | 408 | } | |
394 | 409 | } | |
395 | 410 | ||
396 | 411 | ||
397 | - | func | |
412 | + | func cy (bJ,bL,cr) = cq(bJ, bL, cr, aY(), aZ()) | |
398 | 413 | ||
399 | 414 | ||
400 | - | func | |
401 | - | let | |
402 | - | let | |
403 | - | let | |
404 | - | let | |
405 | - | | |
415 | + | func cz () = { | |
416 | + | let cA = valueOrErrorMessage(addressFromString(getStringValue(this, c)), "") | |
417 | + | let cB = getStringValue(this, a) | |
418 | + | let cC = getStringValue(this, b) | |
419 | + | let cD = valueOrErrorMessage(getInteger(cA, cB), ((("Can not get oracle price. Oracle: " + toString(cA)) + " key: ") + cB)) | |
420 | + | cD | |
406 | 421 | } | |
407 | 422 | ||
408 | 423 | ||
409 | - | func | |
410 | - | let | |
411 | - | let | |
412 | - | let | |
413 | - | let | |
414 | - | if (( | |
415 | - | then throw(((("Price spread " + toString( | |
424 | + | func cE (cs,ct) = { | |
425 | + | let cF = cz() | |
426 | + | let cG = ar(cs, ct) | |
427 | + | let cH = ar((cF + cG), (2 * ak)) | |
428 | + | let cI = ar(au((cF - cG)), cH) | |
429 | + | if ((cI > bm())) | |
430 | + | then throw(((("Price spread " + toString(cI)) + " > max price spread ") + toString(bm()))) | |
416 | 431 | else true | |
417 | 432 | } | |
418 | 433 | ||
419 | 434 | ||
420 | - | func | |
421 | - | let | |
422 | - | let | |
423 | - | | |
435 | + | func cJ () = { | |
436 | + | let cs = aY() | |
437 | + | let ct = aZ() | |
438 | + | ar(cs, ct) | |
424 | 439 | } | |
425 | 440 | ||
426 | 441 | ||
427 | - | func | |
428 | - | let | |
429 | - | let | |
430 | - | ( | |
442 | + | func cK () = { | |
443 | + | let cF = cz() | |
444 | + | let cL = cJ() | |
445 | + | (ar(au((cF - cL)), cF) > bk()) | |
431 | 446 | } | |
432 | 447 | ||
433 | 448 | ||
434 | - | func | |
435 | - | let | |
436 | - | let | |
437 | - | let | |
449 | + | func cM (bz,cN,cs,ct) = { | |
450 | + | let cO = au(bz) | |
451 | + | let cP = (0 > bz) | |
452 | + | let cQ = if ((cN == an)) | |
438 | 453 | then { | |
439 | - | let | |
440 | - | let | |
441 | - | let | |
442 | - | let | |
443 | - | let | |
444 | - | | |
454 | + | let cR = cq(!(cP), cO, false, cs, ct) | |
455 | + | let cS = cR._1 | |
456 | + | let cT = cR._2 | |
457 | + | let cU = cR._3 | |
458 | + | let cV = cR._4 | |
459 | + | cS | |
445 | 460 | } | |
446 | - | else | |
447 | - | | |
461 | + | else at(cO, cz()) | |
462 | + | cQ | |
448 | 463 | } | |
449 | 464 | ||
450 | 465 | ||
451 | - | func cP (bu,cG) = { | |
452 | - | let cQ = bt(bu) | |
453 | - | let bx = cQ._1 | |
454 | - | let cR = cQ._2 | |
455 | - | let cS = cQ._3 | |
456 | - | let cT = cQ._4 | |
457 | - | if ((bx == 0)) | |
458 | - | then throw("Invalid position size") | |
466 | + | func cW (bz,cX,cs,ct,cN) = if ((bz == 0)) | |
467 | + | then throw("Invalid position size") | |
468 | + | else { | |
469 | + | let cP = (0 > bz) | |
470 | + | let cQ = cM(bz, cN, cs, ct) | |
471 | + | let cY = if (cP) | |
472 | + | then (cX - cQ) | |
473 | + | else (cQ - cX) | |
474 | + | $Tuple2(cQ, cY) | |
475 | + | } | |
476 | + | ||
477 | + | ||
478 | + | func cZ (bB,cN) = { | |
479 | + | let da = bA(bB) | |
480 | + | let bE = da._1 | |
481 | + | let db = da._2 | |
482 | + | let dc = da._3 | |
483 | + | let dd = da._4 | |
484 | + | cW(bE, dc, aY(), aZ(), cN) | |
485 | + | } | |
486 | + | ||
487 | + | ||
488 | + | func de (df,dg,dh) = ar((df - dg), dh) | |
489 | + | ||
490 | + | ||
491 | + | func di (bB,cN) = { | |
492 | + | let dj = bA(bB) | |
493 | + | let bE = dj._1 | |
494 | + | let db = dj._2 | |
495 | + | let dk = dj._3 | |
496 | + | let dd = dj._4 | |
497 | + | let dl = cZ(bB, cN) | |
498 | + | let cQ = dl._1 | |
499 | + | let cY = dl._2 | |
500 | + | let dm = cf(bE, db, dd, cY) | |
501 | + | let co = dm._1 | |
502 | + | let cp = dm._2 | |
503 | + | de(co, cp, cQ) | |
504 | + | } | |
505 | + | ||
506 | + | ||
507 | + | func dn (bB) = di(bB, an) | |
508 | + | ||
509 | + | ||
510 | + | func do (bB,bz) = { | |
511 | + | let dp = av(bj(), (ak - ar(dn(bB), bh()))) | |
512 | + | let dq = at(au(bz), dp) | |
513 | + | let dr = cy((bz > 0), dq, false) | |
514 | + | let ds = dr._1 | |
515 | + | let cd = dr._8 | |
516 | + | if ((bl() > cd)) | |
517 | + | then ds | |
459 | 518 | else { | |
460 | - | let cI = (0 > bx) | |
461 | - | let cJ = cF(bx, cG, aT(), aU()) | |
462 | - | let cU = if (cI) | |
463 | - | then (cS - cJ) | |
464 | - | else (cJ - cS) | |
465 | - | $Tuple2(cJ, cU) | |
519 | + | let dt = at(au(bz), bj()) | |
520 | + | let du = cy((bz > 0), dt, false)._1 | |
521 | + | du | |
466 | 522 | } | |
467 | 523 | } | |
468 | 524 | ||
469 | 525 | ||
470 | - | func cV (cW,cX,cY) = am((cW - cX), cY) | |
471 | - | ||
472 | - | ||
473 | - | func cZ (bu,cG) = { | |
474 | - | let da = bt(bu) | |
475 | - | let bx = da._1 | |
476 | - | let cR = da._2 | |
477 | - | let db = da._3 | |
478 | - | let cT = da._4 | |
479 | - | let dc = cP(bu, cG) | |
480 | - | let cJ = dc._1 | |
481 | - | let cU = dc._2 | |
482 | - | let dd = bY(bx, cR, cT, cU) | |
483 | - | let ch = dd._1 | |
484 | - | let ci = dd._2 | |
485 | - | cV(ch, ci, cJ) | |
526 | + | func dv (bB,cr) = { | |
527 | + | let dw = bA(bB) | |
528 | + | let bE = dw._1 | |
529 | + | let db = dw._2 | |
530 | + | let dc = dw._3 | |
531 | + | let dd = dw._4 | |
532 | + | let cY = cZ(bB, an)._2 | |
533 | + | let dx = cf(bE, db, dd, cY) | |
534 | + | let co = dx._1 | |
535 | + | let cp = dx._2 | |
536 | + | let dt = -(bE) | |
537 | + | let dy = cY | |
538 | + | let dz = -(co) | |
539 | + | let dA = cy((bE > 0), au(bE), cr) | |
540 | + | let du = dA._1 | |
541 | + | let bR = dA._2 | |
542 | + | let bS = dA._3 | |
543 | + | let dB = dA._4 | |
544 | + | let dC = dA._5 | |
545 | + | let dD = dA._6 | |
546 | + | let dE = dA._7 | |
547 | + | let dF = (bc() - dc) | |
548 | + | $Tuple12(dt, cp, dy, dz, bR, bS, dB, dC, dF, du, dD, dE) | |
486 | 549 | } | |
487 | 550 | ||
488 | 551 | ||
489 | - | func de (bu) = cZ(bu, ai) | |
552 | + | func dG () = { | |
553 | + | let dH = ((lastBlock.timestamp / 1000) / 60) | |
554 | + | let dI = (dH - ah) | |
555 | + | let dJ = valueOrElse(getString(this, u), "") | |
556 | + | let dK = split(dJ, ",") | |
557 | + | func dL (aC,dM) = if ((dI >= parseIntValue(dM))) | |
558 | + | then (aC :+ parseIntValue(dM)) | |
559 | + | else aC | |
490 | 560 | ||
561 | + | let dN = { | |
562 | + | let aF = dK | |
563 | + | let aG = size(aF) | |
564 | + | let aH = nil | |
565 | + | func aI (aJ,aK) = if ((aK >= aG)) | |
566 | + | then aJ | |
567 | + | else dL(aJ, aF[aK]) | |
491 | 568 | ||
492 | - | func df (bu,bs) = { | |
493 | - | let dg = aq(be(), (af - am(de(bu), bc()))) | |
494 | - | let dh = ao(ap(bs), dg) | |
495 | - | let di = cr((bs > 0), dh, false) | |
496 | - | let dj = di._1 | |
497 | - | let bW = di._8 | |
498 | - | if ((bg() > bW)) | |
499 | - | then dj | |
500 | - | else { | |
501 | - | let dk = ao(ap(bs), be()) | |
502 | - | let dl = cr((bs > 0), dk, false)._1 | |
503 | - | dl | |
504 | - | } | |
569 | + | func aL (aJ,aK) = if ((aK >= aG)) | |
570 | + | then aJ | |
571 | + | else throw("List size exceeds 20") | |
572 | + | ||
573 | + | aL(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aI(aH, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20) | |
574 | + | } | |
575 | + | let dO = if ((size(dN) > 0)) | |
576 | + | then max(dN) | |
577 | + | else parseIntValue(dK[0]) | |
578 | + | let dP = valueOrElse(getInteger(this, v), 0) | |
579 | + | let dQ = valueOrElse(getInteger(this, ((w + "_") + toString(dP))), 0) | |
580 | + | let dR = valueOrElse(getInteger(this, ((x + "_") + toString(dP))), 0) | |
581 | + | let dS = (dQ + ((dH - dP) * dR)) | |
582 | + | let dT = valueOrElse(getInteger(this, ((w + "_") + toString(dO))), 0) | |
583 | + | let dU = valueOrElse(getInteger(this, ((x + "_") + toString(dO))), 0) | |
584 | + | let dV = (dT + ((dI - dO) * dU)) | |
585 | + | ((dS - dV) / ah) | |
505 | 586 | } | |
506 | 587 | ||
507 | 588 | ||
508 | - | func dm (bu,ck) = { | |
509 | - | let dn = bt(bu) | |
510 | - | let bx = dn._1 | |
511 | - | let cR = dn._2 | |
512 | - | let cS = dn._3 | |
513 | - | let cT = dn._4 | |
514 | - | let cU = cP(bu, ai)._2 | |
515 | - | let do = bY(bx, cR, cT, cU) | |
516 | - | let ch = do._1 | |
517 | - | let ci = do._2 | |
518 | - | let dk = -(bx) | |
519 | - | let dp = cU | |
520 | - | let dq = -(ch) | |
521 | - | let dr = cr((bx > 0), ap(bx), ck) | |
522 | - | let dl = dr._1 | |
523 | - | let bK = dr._2 | |
524 | - | let bL = dr._3 | |
525 | - | let ds = dr._4 | |
526 | - | let dt = dr._5 | |
527 | - | let du = dr._6 | |
528 | - | let dv = dr._7 | |
529 | - | let dw = (aX() - cS) | |
530 | - | $Tuple12(dk, ci, dp, dq, bK, bL, ds, dt, dw, dl, du, dv) | |
589 | + | func dW (dX) = { | |
590 | + | let bz = ba() | |
591 | + | let dY = (bz > 0) | |
592 | + | let dZ = cy(dY, au(bz), false)._1 | |
593 | + | let ea = aZ() | |
594 | + | let eb = at(ea, dX) | |
595 | + | let ec = cW(bz, dZ, eb, ea, an)._2 | |
596 | + | $Tuple2(eb, ec) | |
531 | 597 | } | |
532 | 598 | ||
533 | 599 | ||
534 | - | func dx () = { | |
535 | - | let dy = ((lastBlock.timestamp / 1000) / 60) | |
536 | - | let dz = (dy - ac) | |
537 | - | let dA = valueOrElse(getString(this, t), "") | |
538 | - | let dB = split(dA, ",") | |
539 | - | func dC (ax,dD) = if ((dz >= parseIntValue(dD))) | |
540 | - | then (ax :+ parseIntValue(dD)) | |
541 | - | else ax | |
542 | - | ||
543 | - | let dE = { | |
544 | - | let aA = dB | |
545 | - | let aB = size(aA) | |
546 | - | let aC = nil | |
547 | - | func aD (aE,aF) = if ((aF >= aB)) | |
548 | - | then aE | |
549 | - | else dC(aE, aA[aF]) | |
550 | - | ||
551 | - | func aG (aE,aF) = if ((aF >= aB)) | |
552 | - | then aE | |
553 | - | else throw("List size exceeds 20") | |
554 | - | ||
555 | - | aG(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aC, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20) | |
556 | - | } | |
557 | - | let dF = if ((size(dE) > 0)) | |
558 | - | then max(dE) | |
559 | - | else parseIntValue(dB[0]) | |
560 | - | let dG = valueOrElse(getInteger(this, u), 0) | |
561 | - | let dH = valueOrElse(getInteger(this, ((v + "_") + toString(dG))), 0) | |
562 | - | let dI = valueOrElse(getInteger(this, ((w + "_") + toString(dG))), 0) | |
563 | - | let dJ = (dH + ((dy - dG) * dI)) | |
564 | - | let dK = valueOrElse(getInteger(this, ((v + "_") + toString(dF))), 0) | |
565 | - | let dL = valueOrElse(getInteger(this, ((w + "_") + toString(dF))), 0) | |
566 | - | let dM = (dK + ((dz - dF) * dL)) | |
567 | - | ((dJ - dM) / ac) | |
600 | + | func ed () = { | |
601 | + | let ee = cz() | |
602 | + | let ef = dG() | |
603 | + | let eg = (ef - ee) | |
604 | + | if (if ((bp() == 0)) | |
605 | + | then true | |
606 | + | else (bq() == 0)) | |
607 | + | then $Tuple2(0, 0) | |
608 | + | else if ((0 > eg)) | |
609 | + | then { | |
610 | + | let eh = ar(at(eg, bf()), al) | |
611 | + | let ei = ar(at(eh, bp()), bq()) | |
612 | + | $Tuple2(eh, ei) | |
613 | + | } | |
614 | + | else { | |
615 | + | let ei = ar(at(eg, bf()), al) | |
616 | + | let eh = ar(at(ei, bq()), bp()) | |
617 | + | $Tuple2(eh, ei) | |
618 | + | } | |
568 | 619 | } | |
569 | 620 | ||
570 | 621 | ||
571 | - | func | |
622 | + | func ej (ek,el,em,en,eo,ep,eq,er,es) = [IntegerEntry(n, ek), IntegerEntry(o, el), IntegerEntry(p, em), IntegerEntry(m, en), IntegerEntry(l, eo), IntegerEntry(r, ep), IntegerEntry(s, eq), IntegerEntry(q, er), IntegerEntry(t, es)] | |
572 | 623 | ||
573 | 624 | ||
574 | - | func | |
625 | + | func et (eu,ev,ew,ex,ey) = [IntegerEntry(B, eu), IntegerEntry(z, ev), IntegerEntry(A, ew), IntegerEntry(C, ex), IntegerEntry(D, ey)] | |
575 | 626 | ||
576 | 627 | ||
577 | - | func | |
628 | + | func ez (ay,eA,eB,eC,cl) = [IntegerEntry(aw(e, ay), eA), IntegerEntry(aw(f, ay), eB), IntegerEntry(aw(g, ay), eC), IntegerEntry(aw(h, ay), cl)] | |
578 | 629 | ||
579 | 630 | ||
580 | - | func | |
581 | - | let | |
582 | - | let | |
583 | - | if (( | |
631 | + | func eD (eE) = { | |
632 | + | let dH = ((lastBlock.timestamp / 1000) / 60) | |
633 | + | let eF = valueOrElse(getInteger(this, v), 0) | |
634 | + | if ((eF > dH)) | |
584 | 635 | then throw("TWAP out-of-order") | |
585 | 636 | else { | |
586 | - | let | |
587 | - | then | |
588 | - | else | |
589 | - | if (( | |
637 | + | let dP = if ((eF == 0)) | |
638 | + | then dH | |
639 | + | else eF | |
640 | + | if ((dH > eF)) | |
590 | 641 | then { | |
591 | - | let | |
592 | - | let | |
593 | - | let | |
594 | - | let | |
595 | - | [IntegerEntry( | |
642 | + | let eG = valueOrElse(getInteger(this, ((w + "_") + toString(eF))), 0) | |
643 | + | let eH = valueOrElse(getInteger(this, ((x + "_") + toString(eF))), eE) | |
644 | + | let eI = (eG + ((dH - dP) * eH)) | |
645 | + | let dK = aQ(aO(valueOrElse(getString(this, u), "")), ah, toString(dH)) | |
646 | + | [IntegerEntry(aw(w, toString(dH)), eI), IntegerEntry(aw(x, toString(dH)), eE), IntegerEntry(aw(y, toString(dH)), eF), IntegerEntry(v, dH), StringEntry(u, az(dK))] | |
596 | 647 | } | |
597 | 648 | else { | |
598 | - | let | |
599 | - | let | |
600 | - | let | |
601 | - | let | |
602 | - | [IntegerEntry( | |
649 | + | let eJ = valueOrElse(getInteger(this, aw(y, toString(dH))), 0) | |
650 | + | let eG = valueOrElse(getInteger(this, aw(w, toString(eJ))), 0) | |
651 | + | let eH = valueOrElse(getInteger(this, aw(x, toString(eJ))), eE) | |
652 | + | let eI = (eG + ((dH - eJ) * eH)) | |
653 | + | [IntegerEntry(aw(w, toString(dH)), eI), IntegerEntry(aw(x, toString(dH)), eE)] | |
603 | 654 | } | |
604 | 655 | } | |
605 | 656 | } | |
606 | 657 | ||
607 | 658 | ||
608 | - | func | |
659 | + | func eK (bP,bQ) = [IntegerEntry(E, bP), IntegerEntry(F, bQ)] | |
609 | 660 | ||
610 | 661 | ||
611 | - | func | |
612 | - | then throw(((((("Invalid AMM state data: " + toString( | |
613 | - | else (( | |
662 | + | func eL (bP,bQ,eM,eN,eO,eP,eQ) = if (((eP - eQ) != eM)) | |
663 | + | then throw(((((("Invalid AMM state data: " + toString(eP)) + " + ") + toString(eQ)) + " != ") + toString(eM))) | |
664 | + | else ((eK(bP, bQ) ++ [IntegerEntry(G, eM), IntegerEntry(J, eN), IntegerEntry(K, eO), IntegerEntry(H, eP), IntegerEntry(I, eQ)]) ++ eD(ar(bP, bQ))) | |
614 | 665 | ||
615 | 666 | ||
616 | - | func | |
667 | + | func eR (ay) = [DeleteEntry(aw(e, ay)), DeleteEntry(aw(f, ay)), DeleteEntry(aw(g, ay)), DeleteEntry(aw(h, ay)), IntegerEntry(aw(i, ay), lastBlock.timestamp)] | |
617 | 668 | ||
618 | 669 | ||
619 | - | func | |
620 | - | let | |
621 | - | if (( | |
622 | - | then throw(((("Unable to withdraw " + toString( | |
623 | - | else [ScriptTransfer( | |
670 | + | func eS (ay,eT) = { | |
671 | + | let eU = assetBalance(this, Y()) | |
672 | + | if ((eT > eU)) | |
673 | + | then throw(((("Unable to withdraw " + toString(eT)) + " from contract balance ") + toString(eU))) | |
674 | + | else [ScriptTransfer(ay, eT, Y())] | |
624 | 675 | } | |
625 | 676 | ||
626 | 677 | ||
627 | - | func | |
678 | + | func eV (bs) = if ((0 > bs)) | |
628 | 679 | then throw("Balance") | |
629 | - | else [IntegerEntry(d, | |
680 | + | else [IntegerEntry(d, bs)] | |
630 | 681 | ||
631 | 682 | ||
632 | - | func | |
683 | + | func eW (bs) = [ScriptTransfer(aa(), bs, Y())] | |
633 | 684 | ||
634 | 685 | ||
635 | - | @Callable( | |
636 | - | func pause () = if (( | |
686 | + | @Callable(bs) | |
687 | + | func pause () = if ((bs.caller != W())) | |
637 | 688 | then throw("Invalid togglePause params") | |
638 | - | else [BooleanEntry( | |
689 | + | else [BooleanEntry(k, true)] | |
639 | 690 | ||
640 | 691 | ||
641 | 692 | ||
642 | - | @Callable( | |
643 | - | func unpause () = if (( | |
693 | + | @Callable(bs) | |
694 | + | func unpause () = if ((bs.caller != W())) | |
644 | 695 | then throw("Invalid togglePause params") | |
645 | - | else [BooleanEntry( | |
696 | + | else [BooleanEntry(k, false)] | |
646 | 697 | ||
647 | 698 | ||
648 | 699 | ||
649 | - | @Callable( | |
650 | - | func addLiquidity ( | |
700 | + | @Callable(bs) | |
701 | + | func addLiquidity (bK) = if (if ((bs.caller != W())) | |
651 | 702 | then true | |
652 | - | else (0 >= | |
703 | + | else (0 >= bK)) | |
653 | 704 | then throw("Invalid addLiquidity params") | |
654 | 705 | else { | |
655 | - | let | |
656 | - | let | |
657 | - | let | |
658 | - | let | |
659 | - | let | |
660 | - | let | |
661 | - | | |
706 | + | let bP = aY() | |
707 | + | let bQ = aZ() | |
708 | + | let eE = ar(bP, bQ) | |
709 | + | let eX = ar(bK, eE) | |
710 | + | let eY = (bP + bK) | |
711 | + | let eZ = (bQ + eX) | |
712 | + | eK(eY, eZ) | |
662 | 713 | } | |
663 | 714 | ||
664 | 715 | ||
665 | 716 | ||
666 | - | @Callable( | |
667 | - | func removeLiquidity ( | |
717 | + | @Callable(bs) | |
718 | + | func removeLiquidity (bK) = if (if ((bs.caller != W())) | |
668 | 719 | then true | |
669 | - | else (0 >= | |
720 | + | else (0 >= bK)) | |
670 | 721 | then throw("Invalid removeLiquidity params") | |
671 | 722 | else { | |
672 | - | let | |
673 | - | let | |
674 | - | let | |
675 | - | let | |
676 | - | let | |
677 | - | let | |
678 | - | | |
723 | + | let bP = aY() | |
724 | + | let bQ = aZ() | |
725 | + | let eE = ar(bP, bQ) | |
726 | + | let fa = ar(bK, eE) | |
727 | + | let eY = (bP - bK) | |
728 | + | let eZ = (bQ - fa) | |
729 | + | eK(eY, eZ) | |
679 | 730 | } | |
680 | 731 | ||
681 | 732 | ||
682 | 733 | ||
683 | - | @Callable( | |
684 | - | func changeSettings ( | |
734 | + | @Callable(bs) | |
735 | + | func changeSettings (ek,el,em,en,eo,ep,eq,er,es) = if ((bs.caller != W())) | |
685 | 736 | then throw("Invalid changeSettings params") | |
686 | - | else | |
737 | + | else ej(ek, el, em, en, eo, ep, eq, er, es) | |
687 | 738 | ||
688 | 739 | ||
689 | 740 | ||
690 | - | @Callable( | |
691 | - | func initialize ( | |
741 | + | @Callable(bs) | |
742 | + | func initialize (bP,bQ,en,ek,el,em,eo,fb,fc,fd,ep,eq,er,es) = if (if (if (if (if (if (if (if (if (if (if (if ((0 >= bP)) | |
692 | 743 | then true | |
693 | - | else (0 >= | |
744 | + | else (0 >= bQ)) | |
694 | 745 | then true | |
695 | - | else (0 >= | |
746 | + | else (0 >= en)) | |
696 | 747 | then true | |
697 | - | else (0 >= | |
748 | + | else (0 >= ek)) | |
698 | 749 | then true | |
699 | - | else (0 >= | |
750 | + | else (0 >= el)) | |
700 | 751 | then true | |
701 | - | else (0 >= | |
752 | + | else (0 >= em)) | |
702 | 753 | then true | |
703 | - | else (0 >= | |
754 | + | else (0 >= eo)) | |
704 | 755 | then true | |
705 | - | else (0 >= | |
756 | + | else (0 >= ep)) | |
706 | 757 | then true | |
707 | - | else (0 >= | |
758 | + | else (0 >= eq)) | |
708 | 759 | then true | |
709 | - | else (0 >= | |
760 | + | else (0 >= er)) | |
710 | 761 | then true | |
711 | - | else (0 >= | |
762 | + | else (0 >= es)) | |
712 | 763 | then true | |
713 | - | else | |
764 | + | else bG()) | |
714 | 765 | then throw("Invalid initialize parameters") | |
715 | - | else (((( | |
766 | + | else ((((eL(bP, bQ, 0, 0, 0, 0, 0) ++ ej(ek, el, em, en, eo, ep, eq, er, es)) ++ et((lastBlock.timestamp + en), 0, 0, 0, 0)) ++ eV(0)) ++ [BooleanEntry(j, true), StringEntry(c, fb), StringEntry(a, fc), StringEntry(L, fd)]) | |
716 | 767 | ||
717 | 768 | ||
718 | 769 | ||
719 | - | @Callable( | |
720 | - | func setInitMarginRatio ( | |
770 | + | @Callable(bs) | |
771 | + | func setInitMarginRatio (ek) = if (if ((0 >= ek)) | |
721 | 772 | then true | |
722 | - | else !( | |
773 | + | else !(bG())) | |
723 | 774 | then throw("Invalid setInitMarginRatio parameters") | |
724 | - | else | |
775 | + | else ej(ek, bh(), bi(), be(), aW(), bk(), bl(), bj(), bm()) | |
725 | 776 | ||
726 | 777 | ||
727 | 778 | ||
728 | - | @Callable( | |
729 | - | func decreasePosition ( | |
779 | + | @Callable(bs) | |
780 | + | func decreasePosition (eT,fe,ff) = if (if (if (if (if ((0 >= eT)) | |
730 | 781 | then true | |
731 | - | else !( | |
782 | + | else !(bG())) | |
732 | 783 | then true | |
733 | - | else !( | |
784 | + | else !(bt(ar(ak, fe), aX(), true))) | |
734 | 785 | then true | |
735 | - | else !( | |
786 | + | else !(bF(toString(bs.caller)))) | |
736 | 787 | then true | |
737 | - | else | |
788 | + | else bH()) | |
738 | 789 | then throw("Invalid decreasePosition parameters") | |
739 | 790 | else { | |
740 | - | let | |
741 | - | let | |
742 | - | let | |
743 | - | let | |
744 | - | let | |
745 | - | let | |
746 | - | then | |
747 | - | else | |
748 | - | let | |
749 | - | let | |
750 | - | let | |
751 | - | let | |
752 | - | let | |
753 | - | let | |
791 | + | let fg = bA(toString(bs.caller)) | |
792 | + | let fh = fg._1 | |
793 | + | let fi = fg._2 | |
794 | + | let fj = fg._3 | |
795 | + | let fk = fg._4 | |
796 | + | let fl = if ((fh > 0)) | |
797 | + | then ag | |
798 | + | else af | |
799 | + | let fm = (fl == af) | |
800 | + | let fn = at(eT, fe) | |
801 | + | let fo = cZ(toString(bs.caller), an) | |
802 | + | let fp = fo._1 | |
803 | + | let cY = fo._2 | |
804 | + | let fq = if ((fp > fn)) | |
754 | 805 | then { | |
755 | - | let | |
756 | - | let | |
757 | - | let | |
758 | - | let | |
759 | - | let | |
760 | - | let | |
761 | - | let | |
762 | - | if (if (( | |
763 | - | then ( | |
806 | + | let fr = bO(fm, fn) | |
807 | + | let dt = fr._1 | |
808 | + | let bR = fr._2 | |
809 | + | let bS = fr._3 | |
810 | + | let dB = fr._4 | |
811 | + | let dC = fr._5 | |
812 | + | let fs = au(dt) | |
813 | + | if (if ((ff != 0)) | |
814 | + | then (ff > fs) | |
764 | 815 | else false) | |
765 | - | then throw(((("Too little base asset exchanged, got " + toString( | |
816 | + | then throw(((("Too little base asset exchanged, got " + toString(fs)) + " expected ") + toString(ff))) | |
766 | 817 | else { | |
767 | - | let | |
768 | - | let | |
769 | - | let | |
770 | - | let | |
771 | - | let | |
772 | - | let | |
773 | - | let | |
774 | - | let | |
775 | - | then (( | |
776 | - | else (( | |
777 | - | let | |
778 | - | $Tuple11( | |
779 | - | then | |
780 | - | else 0)), ( | |
781 | - | then | |
818 | + | let dy = ar(at(cY, fs), au(fh)) | |
819 | + | let ft = cf(fh, fi, fk, dy) | |
820 | + | let co = ft._1 | |
821 | + | let cp = ft._2 | |
822 | + | let ck = ft._3 | |
823 | + | let du = fn | |
824 | + | let fu = (cY - dy) | |
825 | + | let fv = if ((fh > 0)) | |
826 | + | then ((fp - du) - fu) | |
827 | + | else ((fu + fp) - du) | |
828 | + | let fw = (fh + dt) | |
829 | + | $Tuple11(fw, co, au(fv), by(fw), bS, bR, dB, dC, (bc() - fn), (bq() - (if ((fw > 0)) | |
830 | + | then au(dt) | |
831 | + | else 0)), (bp() - (if ((0 > fw)) | |
832 | + | then au(dt) | |
782 | 833 | else 0))) | |
783 | 834 | } | |
784 | 835 | } | |
785 | 836 | else throw("Close position first") | |
786 | - | let | |
787 | - | let | |
788 | - | let | |
789 | - | let | |
790 | - | let | |
791 | - | let | |
792 | - | let | |
793 | - | let | |
794 | - | let | |
795 | - | let | |
796 | - | let | |
797 | - | let | |
798 | - | if (( | |
799 | - | then ( | |
837 | + | let fw = fq._1 | |
838 | + | let fx = fq._2 | |
839 | + | let fy = fq._3 | |
840 | + | let fz = fq._4 | |
841 | + | let bS = fq._5 | |
842 | + | let bR = fq._6 | |
843 | + | let dB = fq._7 | |
844 | + | let dC = fq._8 | |
845 | + | let dF = fq._9 | |
846 | + | let dD = fq._10 | |
847 | + | let dE = fq._11 | |
848 | + | let fA = invoke(ac(), "notifyNotional", [toString(bs.caller), fy], nil) | |
849 | + | if ((fA == fA)) | |
850 | + | then (ez(toString(bs.caller), fw, fx, fy, fz) ++ eL(bR, bS, dB, dC, dF, dD, dE)) | |
800 | 851 | else throw("Strict value is not equal to itself.") | |
801 | 852 | } | |
802 | 853 | ||
803 | 854 | ||
804 | 855 | ||
805 | - | @Callable( | |
806 | - | func increasePosition ( | |
807 | - | let | |
808 | - | if (if (if (if (if (if (if (( | |
809 | - | then ( | |
856 | + | @Callable(bs) | |
857 | + | func increasePosition (fl,fe,ff,fB) = { | |
858 | + | let fC = bs.payments[0].amount | |
859 | + | if (if (if (if (if (if (if ((fl != af)) | |
860 | + | then (fl != ag) | |
810 | 861 | else false) | |
811 | 862 | then true | |
812 | - | else (0 >= | |
863 | + | else (0 >= fC)) | |
813 | 864 | then true | |
814 | - | else !( | |
865 | + | else !(bG())) | |
815 | 866 | then true | |
816 | - | else ( | |
867 | + | else (bs.payments[0].assetId != Y())) | |
817 | 868 | then true | |
818 | - | else !( | |
869 | + | else !(bt(ar(ak, fe), aX(), true))) | |
819 | 870 | then true | |
820 | - | else | |
871 | + | else bH()) | |
821 | 872 | then throw("Invalid increasePosition parameters") | |
822 | 873 | else { | |
823 | - | let fh = ao(fg, aR()) | |
824 | - | let ex = (fg - fh) | |
825 | - | let fi = bt(toString(eA.caller)) | |
826 | - | let eM = fi._1 | |
827 | - | let eN = fi._2 | |
828 | - | let eO = fi._3 | |
829 | - | let eP = fi._4 | |
830 | - | let fj = (eM == 0) | |
831 | - | let fk = if ((eM > 0)) | |
832 | - | then (eQ == aa) | |
833 | - | else (eQ == ab) | |
834 | - | let fl = if (!(fj)) | |
835 | - | then fk | |
836 | - | else false | |
837 | - | let eR = (eQ == aa) | |
838 | - | let fm = if (if (fj) | |
839 | - | then true | |
840 | - | else fl) | |
874 | + | let bB = toString(bs.caller) | |
875 | + | let fD = at(fC, aW()) | |
876 | + | let fE = invoke(ae(), "acceptPaymentWithLink", [bB, fB], [AttachedPayment(Y(), fD)]) | |
877 | + | if ((fE == fE)) | |
841 | 878 | then { | |
842 | - | let eS = ao(ex, eJ) | |
843 | - | let fn = bH(eR, eS) | |
844 | - | let bN = fn._1 | |
845 | - | let bK = fn._2 | |
846 | - | let bL = fn._3 | |
847 | - | let ds = fn._4 | |
848 | - | let dt = fn._5 | |
849 | - | if (if ((eK != 0)) | |
850 | - | then (eK > ap(bN)) | |
851 | - | else false) | |
852 | - | then throw(((("Limit error: " + toString(ap(bN))) + " < ") + toString(eK))) | |
879 | + | let fF = { | |
880 | + | let bD = fE | |
881 | + | if ($isInstanceOf(bD, "Int")) | |
882 | + | then { | |
883 | + | let fG = bD | |
884 | + | fG | |
885 | + | } | |
886 | + | else throw("Invalid referrerFee") | |
887 | + | } | |
888 | + | let eT = (fC - fD) | |
889 | + | let fH = (fD - fF) | |
890 | + | let fI = bA(bB) | |
891 | + | let fh = fI._1 | |
892 | + | let fi = fI._2 | |
893 | + | let fj = fI._3 | |
894 | + | let fk = fI._4 | |
895 | + | let fJ = (fh == 0) | |
896 | + | let fK = if ((fh > 0)) | |
897 | + | then (fl == af) | |
898 | + | else (fl == ag) | |
899 | + | let fL = if (!(fJ)) | |
900 | + | then fK | |
901 | + | else false | |
902 | + | let fm = (fl == af) | |
903 | + | let fM = if (if (fJ) | |
904 | + | then true | |
905 | + | else fL) | |
906 | + | then { | |
907 | + | let fn = at(eT, fe) | |
908 | + | let fN = bO(fm, fn) | |
909 | + | let bU = fN._1 | |
910 | + | let bR = fN._2 | |
911 | + | let bS = fN._3 | |
912 | + | let dB = fN._4 | |
913 | + | let dC = fN._5 | |
914 | + | if (if ((ff != 0)) | |
915 | + | then (ff > au(bU)) | |
916 | + | else false) | |
917 | + | then throw(((("Limit error: " + toString(au(bU))) + " < ") + toString(ff))) | |
918 | + | else { | |
919 | + | let fw = (fh + bU) | |
920 | + | let fO = ar(fn, fe) | |
921 | + | let fP = cf(fh, fi, fk, fO) | |
922 | + | let co = fP._1 | |
923 | + | let cT = fP._2 | |
924 | + | let cU = fP._3 | |
925 | + | if (!(cE(bR, bS))) | |
926 | + | then throw("Over max spread limit") | |
927 | + | else $Tuple11(fw, co, (fj + fn), by(fw), bS, bR, dB, dC, (bc() + fn), (bq() + (if ((fw > 0)) | |
928 | + | then au(bU) | |
929 | + | else 0)), (bp() + (if ((0 > fw)) | |
930 | + | then au(bU) | |
931 | + | else 0))) | |
932 | + | } | |
933 | + | } | |
853 | 934 | else { | |
854 | - | let fb = (eM + bN) | |
855 | - | let fo = am(eS, eJ) | |
856 | - | let fp = bY(eM, eN, eP, fo) | |
857 | - | let ch = fp._1 | |
858 | - | let cM = fp._2 | |
859 | - | let cN = fp._3 | |
860 | - | if (!(cx(bK, bL))) | |
861 | - | then throw("Over max spread limit") | |
862 | - | else $Tuple11(fb, ch, (eO + eS), br(fb), bL, bK, ds, dt, (aX() + eS), (bl() + (if ((fb > 0)) | |
863 | - | then ap(bN) | |
864 | - | else 0)), (bk() + (if ((0 > fb)) | |
865 | - | then ap(bN) | |
866 | - | else 0))) | |
935 | + | let fn = at(eT, fe) | |
936 | + | let fQ = cZ(toString(bs.caller), an) | |
937 | + | let fp = fQ._1 | |
938 | + | let cY = fQ._2 | |
939 | + | if ((fp > fn)) | |
940 | + | then throw("Use decreasePosition to decrease position size") | |
941 | + | else throw("Close position first") | |
867 | 942 | } | |
868 | - | } | |
869 | - | else { | |
870 | - | let eS = ao(ex, eJ) | |
871 | - | let fq = cP(toString(eA.caller), ai) | |
872 | - | let eU = fq._1 | |
873 | - | let cU = fq._2 | |
874 | - | if ((eU > eS)) | |
875 | - | then throw("Use decreasePosition to decrease position size") | |
876 | - | else throw("Close position first") | |
877 | - | } | |
878 | - | let fb = fm._1 | |
879 | - | let fc = fm._2 | |
880 | - | let fd = fm._3 | |
881 | - | let fe = fm._4 | |
882 | - | let bL = fm._5 | |
883 | - | let bK = fm._6 | |
884 | - | let ds = fm._7 | |
885 | - | let dt = fm._8 | |
886 | - | let dw = fm._9 | |
887 | - | let du = fm._10 | |
888 | - | let dv = fm._11 | |
889 | - | let fr = (fh / 2) | |
890 | - | let fs = (fh - fr) | |
891 | - | let ft = invoke(W(), "lockNeutrinoSP", [toString(X()), ah], [AttachedPayment(V(), ex)]) | |
892 | - | if ((ft == ft)) | |
893 | - | then { | |
894 | - | let fu = invoke(Y(), "deposit", nil, [AttachedPayment(V(), fs)]) | |
895 | - | if ((fu == fu)) | |
943 | + | let fw = fM._1 | |
944 | + | let fx = fM._2 | |
945 | + | let fy = fM._3 | |
946 | + | let fz = fM._4 | |
947 | + | let bS = fM._5 | |
948 | + | let bR = fM._6 | |
949 | + | let dB = fM._7 | |
950 | + | let dC = fM._8 | |
951 | + | let dF = fM._9 | |
952 | + | let dD = fM._10 | |
953 | + | let dE = fM._11 | |
954 | + | let fR = (fH / 2) | |
955 | + | let fS = (fH - fR) | |
956 | + | let fT = invoke(Z(), "lockNeutrinoSP", [toString(aa()), am], [AttachedPayment(Y(), eT)]) | |
957 | + | if ((fT == fT)) | |
896 | 958 | then { | |
897 | - | let | |
898 | - | if (( | |
959 | + | let fU = invoke(ab(), "deposit", nil, [AttachedPayment(Y(), fS)]) | |
960 | + | if ((fU == fU)) | |
899 | 961 | then { | |
900 | - | let ff = invoke(Z(), "notifyNotional", [toString(eA.caller), fd], nil) | |
901 | - | if ((ff == ff)) | |
902 | - | then (((ed(toString(eA.caller), fb, fc, fd, fe) ++ ep(bK, bL, ds, dt, dw, du, dv)) ++ eB(fr)) ++ ez((aQ() + ex))) | |
962 | + | let fV = invoke(ac(), "notifyFees", [bB, fH], nil) | |
963 | + | if ((fV == fV)) | |
964 | + | then { | |
965 | + | let fA = invoke(ac(), "notifyNotional", [bB, fy], nil) | |
966 | + | if ((fA == fA)) | |
967 | + | then (((ez(bB, fw, fx, fy, fz) ++ eL(bR, bS, dB, dC, dF, dD, dE)) ++ eW(fR)) ++ eV((aV() + eT))) | |
968 | + | else throw("Strict value is not equal to itself.") | |
969 | + | } | |
903 | 970 | else throw("Strict value is not equal to itself.") | |
904 | 971 | } | |
905 | 972 | else throw("Strict value is not equal to itself.") | |
906 | 973 | } | |
907 | 974 | else throw("Strict value is not equal to itself.") | |
908 | 975 | } | |
909 | 976 | else throw("Strict value is not equal to itself.") | |
910 | 977 | } | |
911 | 978 | } | |
912 | 979 | ||
913 | 980 | ||
914 | 981 | ||
915 | - | @Callable( | |
982 | + | @Callable(bs) | |
916 | 983 | func addMargin () = { | |
917 | - | let | |
918 | - | if (if (if (if (( | |
984 | + | let fC = bs.payments[0].amount | |
985 | + | if (if (if (if ((bs.payments[0].assetId != Y())) | |
919 | 986 | then true | |
920 | - | else !( | |
987 | + | else !(bF(toString(bs.caller)))) | |
921 | 988 | then true | |
922 | - | else !( | |
989 | + | else !(bG())) | |
923 | 990 | then true | |
924 | - | else | |
991 | + | else bH()) | |
925 | 992 | then throw("Invalid addMargin parameters") | |
926 | 993 | else { | |
927 | - | let fh = ao(fg, aR()) | |
928 | - | let ex = (fg - fh) | |
929 | - | let fw = bt(toString(eA.caller)) | |
930 | - | let eM = fw._1 | |
931 | - | let eN = fw._2 | |
932 | - | let eO = fw._3 | |
933 | - | let eP = fw._4 | |
934 | - | let fr = (fh / 2) | |
935 | - | let fs = (fh - fr) | |
936 | - | let ft = invoke(W(), "lockNeutrinoSP", [toString(X()), ah], [AttachedPayment(V(), ex)]) | |
937 | - | if ((ft == ft)) | |
994 | + | let bB = toString(bs.caller) | |
995 | + | let fD = at(fC, aW()) | |
996 | + | let fE = invoke(ae(), "acceptPayment", [bB], [AttachedPayment(Y(), fD)]) | |
997 | + | if ((fE == fE)) | |
938 | 998 | then { | |
939 | - | let fu = invoke(Y(), "deposit", nil, [AttachedPayment(V(), fs)]) | |
940 | - | if ((fu == fu)) | |
999 | + | let fF = { | |
1000 | + | let bD = fE | |
1001 | + | if ($isInstanceOf(bD, "Int")) | |
1002 | + | then { | |
1003 | + | let fG = bD | |
1004 | + | fG | |
1005 | + | } | |
1006 | + | else throw("Invalid referrerFee") | |
1007 | + | } | |
1008 | + | let fH = (fD - fF) | |
1009 | + | let eT = (fC - fD) | |
1010 | + | let fW = bA(bB) | |
1011 | + | let fh = fW._1 | |
1012 | + | let fi = fW._2 | |
1013 | + | let fj = fW._3 | |
1014 | + | let fk = fW._4 | |
1015 | + | let fR = (fH / 2) | |
1016 | + | let fS = (fH - fR) | |
1017 | + | let fT = invoke(Z(), "lockNeutrinoSP", [toString(aa()), am], [AttachedPayment(Y(), eT)]) | |
1018 | + | if ((fT == fT)) | |
941 | 1019 | then { | |
942 | - | let fv = invoke(Z(), "notifyFees", [toString(eA.caller), fh], nil) | |
943 | - | if ((fv == fv)) | |
944 | - | then ((ed(toString(eA.caller), eM, (eN + ex), eO, eP) ++ eB(fr)) ++ ez((aQ() + ex))) | |
1020 | + | let fU = invoke(ab(), "deposit", nil, [AttachedPayment(Y(), fS)]) | |
1021 | + | if ((fU == fU)) | |
1022 | + | then { | |
1023 | + | let fV = invoke(ac(), "notifyFees", [bB, fH], nil) | |
1024 | + | if ((fV == fV)) | |
1025 | + | then ((ez(bB, fh, (fi + eT), fj, fk) ++ eW(fR)) ++ eV((aV() + eT))) | |
1026 | + | else throw("Strict value is not equal to itself.") | |
1027 | + | } | |
945 | 1028 | else throw("Strict value is not equal to itself.") | |
946 | 1029 | } | |
947 | 1030 | else throw("Strict value is not equal to itself.") | |
948 | 1031 | } | |
949 | 1032 | else throw("Strict value is not equal to itself.") | |
950 | 1033 | } | |
951 | 1034 | } | |
952 | 1035 | ||
953 | 1036 | ||
954 | 1037 | ||
955 | - | @Callable( | |
956 | - | func removeMargin ( | |
1038 | + | @Callable(bs) | |
1039 | + | func removeMargin (eT) = if (if (if (if ((0 >= eT)) | |
957 | 1040 | then true | |
958 | - | else !( | |
1041 | + | else !(bF(toString(bs.caller)))) | |
959 | 1042 | then true | |
960 | - | else !( | |
1043 | + | else !(bG())) | |
961 | 1044 | then true | |
962 | - | else | |
1045 | + | else bH()) | |
963 | 1046 | then throw("Invalid removeMargin parameters") | |
964 | 1047 | else { | |
965 | - | let | |
966 | - | let | |
967 | - | let | |
968 | - | let | |
969 | - | let | |
970 | - | let | |
971 | - | let | |
972 | - | let | |
973 | - | let | |
974 | - | if (( | |
1048 | + | let fX = bA(toString(bs.caller)) | |
1049 | + | let fh = fX._1 | |
1050 | + | let fi = fX._2 | |
1051 | + | let fj = fX._3 | |
1052 | + | let fk = fX._4 | |
1053 | + | let fY = -(eT) | |
1054 | + | let fZ = cf(fh, fi, fk, fY) | |
1055 | + | let co = fZ._1 | |
1056 | + | let cp = fZ._2 | |
1057 | + | if ((cp != 0)) | |
975 | 1058 | then throw("Invalid removed margin amount") | |
976 | 1059 | else { | |
977 | - | let | |
978 | - | if (!( | |
979 | - | then throw(((("Too much margin removed: " + toString( | |
1060 | + | let ga = de(co, cp, fj) | |
1061 | + | if (!(bt(ga, aX(), true))) | |
1062 | + | then throw(((("Too much margin removed: " + toString(ga)) + " < ") + toString(aX()))) | |
980 | 1063 | else { | |
981 | - | let | |
982 | - | if (( | |
983 | - | then (( | |
1064 | + | let gb = invoke(Z(), "unlockNeutrino", [eT, toBase58String(Y())], nil) | |
1065 | + | if ((gb == gb)) | |
1066 | + | then ((ez(toString(bs.caller), fh, co, fj, by(fh)) ++ eS(bs.caller, eT)) ++ eV((aV() - eT))) | |
984 | 1067 | else throw("Strict value is not equal to itself.") | |
985 | 1068 | } | |
986 | 1069 | } | |
987 | 1070 | } | |
988 | 1071 | ||
989 | 1072 | ||
990 | 1073 | ||
991 | - | @Callable(eA) | |
992 | - | func closePosition () = if (if (if (!(by(toString(eA.caller)))) | |
993 | - | then true | |
994 | - | else !(bz())) | |
995 | - | then true | |
996 | - | else bA()) | |
997 | - | then throw("Invalid closePosition parameters") | |
998 | - | else { | |
999 | - | let fC = dm(toString(eA.caller), true) | |
1000 | - | let cM = fC._1 | |
1001 | - | let fD = fC._2 | |
1002 | - | let dp = fC._3 | |
1003 | - | let dq = fC._4 | |
1004 | - | let bK = fC._5 | |
1005 | - | let bL = fC._6 | |
1006 | - | let ds = fC._7 | |
1007 | - | let dt = fC._8 | |
1008 | - | let dw = fC._9 | |
1009 | - | let cN = fC._10 | |
1010 | - | let du = fC._11 | |
1011 | - | let dv = fC._12 | |
1012 | - | if ((fD > 0)) | |
1013 | - | then throw("Unable to close position with bad debt") | |
1014 | - | else { | |
1015 | - | let fE = ap(dq) | |
1016 | - | let fF = (aQ() - fE) | |
1017 | - | let fG = if ((0 > fF)) | |
1018 | - | then $Tuple2(0, ap(fF)) | |
1019 | - | else $Tuple2(fF, 0) | |
1020 | - | let fH = fG._1 | |
1021 | - | let fI = fG._2 | |
1022 | - | let fJ = if ((fI > 0)) | |
1074 | + | @Callable(bs) | |
1075 | + | func closePosition () = { | |
1076 | + | let gc = br(bs) | |
1077 | + | let gd = valueOrErrorMessage(addressFromString(gc), "Invalid caller") | |
1078 | + | if (if (if (!(bF(gc))) | |
1079 | + | then true | |
1080 | + | else !(bG())) | |
1081 | + | then true | |
1082 | + | else bH()) | |
1083 | + | then throw("Invalid closePosition parameters") | |
1084 | + | else { | |
1085 | + | let ge = dv(gc, true) | |
1086 | + | let cT = ge._1 | |
1087 | + | let gf = ge._2 | |
1088 | + | let dy = ge._3 | |
1089 | + | let dz = ge._4 | |
1090 | + | let bR = ge._5 | |
1091 | + | let bS = ge._6 | |
1092 | + | let dB = ge._7 | |
1093 | + | let dC = ge._8 | |
1094 | + | let dF = ge._9 | |
1095 | + | let cU = ge._10 | |
1096 | + | let dD = ge._11 | |
1097 | + | let dE = ge._12 | |
1098 | + | if ((gf > 0)) | |
1099 | + | then throw("Unable to close position with bad debt") | |
1100 | + | else { | |
1101 | + | let gg = au(dz) | |
1102 | + | let gh = (aV() - gg) | |
1103 | + | let gi = if ((0 > gh)) | |
1104 | + | then $Tuple2(0, au(gh)) | |
1105 | + | else $Tuple2(gh, 0) | |
1106 | + | let gj = gi._1 | |
1107 | + | let gk = gi._2 | |
1108 | + | let fG = if ((gk > 0)) | |
1109 | + | then { | |
1110 | + | let gl = invoke(ab(), "withdraw", [gk], nil) | |
1111 | + | if ((gl == gl)) | |
1112 | + | then nil | |
1113 | + | else throw("Strict value is not equal to itself.") | |
1114 | + | } | |
1115 | + | else nil | |
1116 | + | if ((fG == fG)) | |
1117 | + | then { | |
1118 | + | let gb = invoke(Z(), "unlockNeutrino", [(gg - gk), toBase58String(Y())], nil) | |
1119 | + | if ((gb == gb)) | |
1120 | + | then { | |
1121 | + | let fA = invoke(ac(), "notifyNotional", [gc, 0], nil) | |
1122 | + | if ((fA == fA)) | |
1123 | + | then (((eR(gc) ++ eL(bR, bS, dB, dC, dF, dD, dE)) ++ eS(gd, gg)) ++ eV(gj)) | |
1124 | + | else throw("Strict value is not equal to itself.") | |
1125 | + | } | |
1126 | + | else throw("Strict value is not equal to itself.") | |
1127 | + | } | |
1128 | + | else throw("Strict value is not equal to itself.") | |
1129 | + | } | |
1130 | + | } | |
1131 | + | } | |
1132 | + | ||
1133 | + | ||
1134 | + | ||
1135 | + | @Callable(bs) | |
1136 | + | func liquidate (bB) = { | |
1137 | + | let gm = di(bB, an) | |
1138 | + | let ga = if (cK()) | |
1139 | + | then { | |
1140 | + | let gn = di(bB, ao) | |
1141 | + | av(gm, gn) | |
1142 | + | } | |
1143 | + | else gm | |
1144 | + | if (if (if (if (!(bt(ga, bh(), false))) | |
1145 | + | then true | |
1146 | + | else !(bF(bB))) | |
1147 | + | then true | |
1148 | + | else !(bG())) | |
1149 | + | then true | |
1150 | + | else bH()) | |
1151 | + | then throw("Unable to liquidate") | |
1152 | + | else if (if (if ((gm > bi())) | |
1153 | + | then (bj() > 0) | |
1154 | + | else false) | |
1155 | + | then (ak > bj()) | |
1156 | + | else false) | |
1157 | + | then { | |
1158 | + | let go = bA(bB) | |
1159 | + | let fh = go._1 | |
1160 | + | let fi = go._2 | |
1161 | + | let fj = go._3 | |
1162 | + | let fk = go._4 | |
1163 | + | let fl = if ((fh > 0)) | |
1164 | + | then ag | |
1165 | + | else af | |
1166 | + | let fm = (fl == af) | |
1167 | + | let du = do(bB, fh) | |
1168 | + | let gp = cZ(bB, an) | |
1169 | + | let fp = gp._1 | |
1170 | + | let cY = gp._2 | |
1171 | + | let gq = bO(fm, du) | |
1172 | + | let dt = gq._1 | |
1173 | + | let bR = gq._2 | |
1174 | + | let bS = gq._3 | |
1175 | + | let dB = gq._4 | |
1176 | + | let dC = gq._5 | |
1177 | + | let dy = ar(at(cY, au(dt)), au(fh)) | |
1178 | + | let gr = cf(fh, fi, fk, dy) | |
1179 | + | let co = gr._1 | |
1180 | + | let cp = gr._2 | |
1181 | + | let ck = gr._3 | |
1182 | + | let fu = (cY - dy) | |
1183 | + | let fv = if ((fh > 0)) | |
1184 | + | then ((fp - du) - fu) | |
1185 | + | else ((fu + fp) - du) | |
1186 | + | let gs = at(du, bi()) | |
1187 | + | let gt = (gs / 2) | |
1188 | + | let fS = (gs - gt) | |
1189 | + | let gu = (co - gs) | |
1190 | + | let fw = (fh + dt) | |
1191 | + | let fy = au(fv) | |
1192 | + | let gv = by(fw) | |
1193 | + | let dF = (bc() - du) | |
1194 | + | let gh = (aV() - gs) | |
1195 | + | let gw = if ((0 > gh)) | |
1196 | + | then $Tuple2(0, au(gh)) | |
1197 | + | else $Tuple2(gh, 0) | |
1198 | + | let gx = gw._1 | |
1199 | + | let gy = gw._2 | |
1200 | + | let fG = if ((gy > 0)) | |
1023 | 1201 | then { | |
1024 | - | let | |
1025 | - | if (( | |
1202 | + | let gl = invoke(ab(), "withdraw", [gy], nil) | |
1203 | + | if ((gl == gl)) | |
1026 | 1204 | then nil | |
1027 | 1205 | else throw("Strict value is not equal to itself.") | |
1028 | 1206 | } | |
1029 | 1207 | else nil | |
1030 | - | if (( | |
1208 | + | if ((fG == fG)) | |
1031 | 1209 | then { | |
1032 | - | let | |
1033 | - | if (( | |
1210 | + | let gb = invoke(Z(), "unlockNeutrino", [(gs - gy), toBase58String(Y())], nil) | |
1211 | + | if ((gb == gb)) | |
1034 | 1212 | then { | |
1035 | - | let ff = invoke(Z(), "notifyNotional", [toString(eA.caller), 0], nil) | |
1036 | - | if ((ff == ff)) | |
1037 | - | then (((ev(toString(eA.caller)) ++ ep(bK, bL, ds, dt, dw, du, dv)) ++ ew(eA.caller, fE)) ++ ez(fH)) | |
1038 | - | else throw("Strict value is not equal to itself.") | |
1039 | - | } | |
1040 | - | else throw("Strict value is not equal to itself.") | |
1041 | - | } | |
1042 | - | else throw("Strict value is not equal to itself.") | |
1043 | - | } | |
1044 | - | } | |
1045 | - | ||
1046 | - | ||
1047 | - | ||
1048 | - | @Callable(eA) | |
1049 | - | func liquidate (bu) = { | |
1050 | - | let fL = cZ(bu, ai) | |
1051 | - | let fA = if (cD()) | |
1052 | - | then { | |
1053 | - | let fM = cZ(bu, aj) | |
1054 | - | aq(fL, fM) | |
1055 | - | } | |
1056 | - | else fL | |
1057 | - | if (if (if (if (!(bm(fA, bc(), false))) | |
1058 | - | then true | |
1059 | - | else !(by(bu))) | |
1060 | - | then true | |
1061 | - | else !(bz())) | |
1062 | - | then true | |
1063 | - | else bA()) | |
1064 | - | then throw("Unable to liquidate") | |
1065 | - | else if (if (if ((fL > bd())) | |
1066 | - | then (be() > 0) | |
1067 | - | else false) | |
1068 | - | then (af > be()) | |
1069 | - | else false) | |
1070 | - | then { | |
1071 | - | let fN = bt(bu) | |
1072 | - | let eM = fN._1 | |
1073 | - | let eN = fN._2 | |
1074 | - | let eO = fN._3 | |
1075 | - | let eP = fN._4 | |
1076 | - | let eQ = if ((eM > 0)) | |
1077 | - | then ab | |
1078 | - | else aa | |
1079 | - | let eR = (eQ == aa) | |
1080 | - | let dl = df(bu, eM) | |
1081 | - | let fO = cP(bu, ai) | |
1082 | - | let eU = fO._1 | |
1083 | - | let cU = fO._2 | |
1084 | - | let fP = bH(eR, dl) | |
1085 | - | let dk = fP._1 | |
1086 | - | let bK = fP._2 | |
1087 | - | let bL = fP._3 | |
1088 | - | let ds = fP._4 | |
1089 | - | let dt = fP._5 | |
1090 | - | let dp = am(ao(cU, ap(dk)), ap(eM)) | |
1091 | - | let fQ = bY(eM, eN, eP, dp) | |
1092 | - | let ch = fQ._1 | |
1093 | - | let ci = fQ._2 | |
1094 | - | let cd = fQ._3 | |
1095 | - | let eZ = (cU - dp) | |
1096 | - | let fa = if ((eM > 0)) | |
1097 | - | then ((eU - dl) - eZ) | |
1098 | - | else ((eZ + eU) - dl) | |
1099 | - | let fR = ao(dl, bd()) | |
1100 | - | let fS = (fR / 2) | |
1101 | - | let fs = (fR - fS) | |
1102 | - | let fT = (ch - fR) | |
1103 | - | let fb = (eM + dk) | |
1104 | - | let fd = ap(fa) | |
1105 | - | let fU = br(fb) | |
1106 | - | let dw = (aX() - dl) | |
1107 | - | let fF = (aQ() - fR) | |
1108 | - | let fV = if ((0 > fF)) | |
1109 | - | then $Tuple2(0, ap(fF)) | |
1110 | - | else $Tuple2(fF, 0) | |
1111 | - | let fW = fV._1 | |
1112 | - | let fX = fV._2 | |
1113 | - | let fJ = if ((fX > 0)) | |
1114 | - | then { | |
1115 | - | let fK = invoke(Y(), "withdraw", [fX], nil) | |
1116 | - | if ((fK == fK)) | |
1117 | - | then nil | |
1118 | - | else throw("Strict value is not equal to itself.") | |
1119 | - | } | |
1120 | - | else nil | |
1121 | - | if ((fJ == fJ)) | |
1122 | - | then { | |
1123 | - | let fB = invoke(W(), "unlockNeutrino", [(fR - fX), toBase58String(V())], nil) | |
1124 | - | if ((fB == fB)) | |
1125 | - | then { | |
1126 | - | let fu = invoke(Y(), "deposit", nil, [AttachedPayment(V(), fs)]) | |
1127 | - | if ((fu == fu)) | |
1213 | + | let fU = invoke(ab(), "deposit", nil, [AttachedPayment(Y(), fS)]) | |
1214 | + | if ((fU == fU)) | |
1128 | 1215 | then { | |
1129 | - | let | |
1130 | - | if (( | |
1131 | - | then ((( | |
1132 | - | then | |
1133 | - | else 0)), ( | |
1134 | - | then | |
1135 | - | else 0)))) ++ | |
1216 | + | let fA = invoke(ac(), "notifyNotional", [bB, fy], nil) | |
1217 | + | if ((fA == fA)) | |
1218 | + | then (((ez(bB, fw, gu, fy, gv) ++ eL(bR, bS, dB, dC, dF, (bq() - (if ((fw > 0)) | |
1219 | + | then au(dt) | |
1220 | + | else 0)), (bp() - (if ((0 > fw)) | |
1221 | + | then au(dt) | |
1222 | + | else 0)))) ++ eS(bs.caller, gt)) ++ eV(gx)) | |
1136 | 1223 | else throw("Strict value is not equal to itself.") | |
1137 | 1224 | } | |
1138 | 1225 | else throw("Strict value is not equal to itself.") | |
1139 | 1226 | } | |
1140 | 1227 | else throw("Strict value is not equal to itself.") | |
1141 | 1228 | } | |
1142 | 1229 | else throw("Strict value is not equal to itself.") | |
1143 | 1230 | } | |
1144 | 1231 | else { | |
1145 | - | let | |
1146 | - | let | |
1147 | - | let | |
1148 | - | let | |
1149 | - | let | |
1150 | - | let | |
1151 | - | let | |
1152 | - | let | |
1153 | - | let | |
1154 | - | let | |
1155 | - | let | |
1156 | - | let | |
1157 | - | let | |
1158 | - | let | |
1159 | - | let | |
1160 | - | let | |
1161 | - | let | |
1162 | - | let | |
1163 | - | then $Tuple2(0, | |
1164 | - | else $Tuple2( | |
1165 | - | let | |
1166 | - | let | |
1167 | - | let | |
1232 | + | let gz = dv(bB, false) | |
1233 | + | let cT = gz._1 | |
1234 | + | let cp = gz._2 | |
1235 | + | let cU = gz._3 | |
1236 | + | let cV = gz._4 | |
1237 | + | let bR = gz._5 | |
1238 | + | let bS = gz._6 | |
1239 | + | let dB = gz._7 | |
1240 | + | let dC = gz._8 | |
1241 | + | let dF = gz._9 | |
1242 | + | let du = gz._10 | |
1243 | + | let dD = gz._11 | |
1244 | + | let dE = gz._12 | |
1245 | + | let gs = at(du, bi()) | |
1246 | + | let gt = (gs / 2) | |
1247 | + | let fS = (gs - gt) | |
1248 | + | let gh = (aV() - gs) | |
1249 | + | let gA = if ((0 > gh)) | |
1250 | + | then $Tuple2(0, au(gh)) | |
1251 | + | else $Tuple2(gh, 0) | |
1252 | + | let gx = gA._1 | |
1253 | + | let gy = gA._2 | |
1254 | + | let fG = if ((gy > 0)) | |
1168 | 1255 | then { | |
1169 | - | let | |
1170 | - | if (( | |
1256 | + | let gl = invoke(ab(), "withdraw", [gy], nil) | |
1257 | + | if ((gl == gl)) | |
1171 | 1258 | then nil | |
1172 | 1259 | else throw("Strict value is not equal to itself.") | |
1173 | 1260 | } | |
1174 | 1261 | else nil | |
1175 | - | if (( | |
1262 | + | if ((fG == fG)) | |
1176 | 1263 | then { | |
1177 | - | let | |
1178 | - | if (( | |
1264 | + | let gb = invoke(Z(), "unlockNeutrino", [(gs - gy), toBase58String(Y())], nil) | |
1265 | + | if ((gb == gb)) | |
1179 | 1266 | then { | |
1180 | - | let | |
1181 | - | if (( | |
1267 | + | let fU = invoke(ab(), "deposit", nil, [AttachedPayment(Y(), fS)]) | |
1268 | + | if ((fU == fU)) | |
1182 | 1269 | then { | |
1183 | - | let | |
1184 | - | if (( | |
1185 | - | then ((( | |
1270 | + | let fA = invoke(ac(), "notifyNotional", [bB, 0], nil) | |
1271 | + | if ((fA == fA)) | |
1272 | + | then (((eR(bB) ++ eL(bR, bS, dB, dC, dF, dD, dE)) ++ eS(bs.caller, gt)) ++ eV(gx)) | |
1186 | 1273 | else throw("Strict value is not equal to itself.") | |
1187 | 1274 | } | |
1188 | 1275 | else throw("Strict value is not equal to itself.") | |
1189 | 1276 | } | |
1190 | 1277 | else throw("Strict value is not equal to itself.") | |
1191 | 1278 | } | |
1192 | 1279 | else throw("Strict value is not equal to itself.") | |
1193 | 1280 | } | |
1194 | 1281 | } | |
1195 | 1282 | ||
1196 | 1283 | ||
1197 | 1284 | ||
1198 | - | @Callable( | |
1285 | + | @Callable(bs) | |
1199 | 1286 | func payFunding () = { | |
1200 | - | let | |
1201 | - | if (if (if (( | |
1287 | + | let gB = bd() | |
1288 | + | if (if (if ((gB > lastBlock.timestamp)) | |
1202 | 1289 | then true | |
1203 | - | else !( | |
1290 | + | else !(bG())) | |
1204 | 1291 | then true | |
1205 | - | else | |
1206 | - | then throw(((("Invalid funding block timestamp: " + toString(lastBlock.timestamp)) + " < ") + toString( | |
1292 | + | else bH()) | |
1293 | + | then throw(((("Invalid funding block timestamp: " + toString(lastBlock.timestamp)) + " < ") + toString(gB))) | |
1207 | 1294 | else { | |
1208 | - | let gb = cs() | |
1209 | - | let gc = dx() | |
1210 | - | let gd = (gc - gb) | |
1211 | - | let ge = if (if ((bk() == 0)) | |
1212 | - | then true | |
1213 | - | else (bl() == 0)) | |
1214 | - | then $Tuple2(0, 0) | |
1215 | - | else if ((0 > gd)) | |
1216 | - | then { | |
1217 | - | let gf = am(ao(gd, ba()), ag) | |
1218 | - | let gg = am(ao(gf, bk()), bl()) | |
1219 | - | $Tuple2(gf, gg) | |
1220 | - | } | |
1221 | - | else { | |
1222 | - | let gg = am(ao(gd, ba()), ag) | |
1223 | - | let gf = am(ao(gg, bl()), bk()) | |
1224 | - | $Tuple2(gf, gg) | |
1225 | - | } | |
1226 | - | let gf = ge._1 | |
1227 | - | let gg = ge._2 | |
1228 | - | dX((ga + bb()), (bi() + gg), (bj() + gf), am(gg, gb), am(gf, gb)) | |
1295 | + | let ee = cz() | |
1296 | + | let gC = ed() | |
1297 | + | let eh = gC._1 | |
1298 | + | let ei = gC._2 | |
1299 | + | et((gB + bg()), (bn() + ei), (bo() + eh), ar(ei, ee), ar(eh, ee)) | |
1229 | 1300 | } | |
1230 | 1301 | } | |
1231 | 1302 | ||
1232 | 1303 | ||
1233 | 1304 | ||
1234 | - | @Callable(eA) | |
1235 | - | func v_get (bu) = { | |
1236 | - | let gh = dm(bu, false) | |
1237 | - | let cM = gh._1 | |
1238 | - | let cN = gh._2 | |
1239 | - | let cO = gh._3 | |
1240 | - | let gi = gh._4 | |
1241 | - | throw((((ak(cN) + ak(cO)) + ak(gi)) + ak(de(bu)))) | |
1305 | + | @Callable(bs) | |
1306 | + | func forceMoveAsset (bB,eT) = if (if ((addressFromPublicKey(X()) != bs.caller)) | |
1307 | + | then true | |
1308 | + | else (0 > eT)) | |
1309 | + | then throw("Invalid forceMoveAsset parameters") | |
1310 | + | else { | |
1311 | + | let gb = invoke(Z(), "unlockNeutrino", [eT, toBase58String(Y())], nil) | |
1312 | + | if ((gb == gb)) | |
1313 | + | then (eS(addressFromStringValue(bB), eT) ++ eV((aV() - eT))) | |
1314 | + | else throw("Strict value is not equal to itself.") | |
1315 | + | } | |
1316 | + | ||
1317 | + | ||
1318 | + | ||
1319 | + | @Callable(bs) | |
1320 | + | func adjustPeg (dX) = if (if ((addressFromPublicKey(X()) != bs.caller)) | |
1321 | + | then true | |
1322 | + | else (0 > dX)) | |
1323 | + | then throw("Invalid adjustPeg parameters") | |
1324 | + | else { | |
1325 | + | let gD = dW(dX) | |
1326 | + | let eb = gD._1 | |
1327 | + | let gE = gD._2 | |
1328 | + | if ((gE == 0)) | |
1329 | + | then throw("Nothing to adjust") | |
1330 | + | else if ((gE > 0)) | |
1331 | + | then { | |
1332 | + | let gl = invoke(ab(), "withdraw", [gE], nil) | |
1333 | + | if ((gl == gl)) | |
1334 | + | then { | |
1335 | + | let fT = invoke(Z(), "lockNeutrinoSP", [toString(aa()), am], [AttachedPayment(Y(), gE)]) | |
1336 | + | if ((fT == fT)) | |
1337 | + | then (eV((aV() + gE)) ++ eK(eb, aZ())) | |
1338 | + | else throw("Strict value is not equal to itself.") | |
1339 | + | } | |
1340 | + | else throw("Strict value is not equal to itself.") | |
1341 | + | } | |
1342 | + | else { | |
1343 | + | let gb = invoke(Z(), "unlockNeutrino", [au(gE), toBase58String(Y())], nil) | |
1344 | + | if ((gb == gb)) | |
1345 | + | then { | |
1346 | + | let fU = invoke(ab(), "deposit", nil, [AttachedPayment(Y(), au(gE))]) | |
1347 | + | if ((fU == fU)) | |
1348 | + | then (eV((aV() - au(gE))) ++ eK(eb, aZ())) | |
1349 | + | else throw("Strict value is not equal to itself.") | |
1350 | + | } | |
1351 | + | else throw("Strict value is not equal to itself.") | |
1352 | + | } | |
1353 | + | } | |
1354 | + | ||
1355 | + | ||
1356 | + | ||
1357 | + | @Callable(bs) | |
1358 | + | func v_get (bB) = { | |
1359 | + | let gF = dv(bB, false) | |
1360 | + | let cT = gF._1 | |
1361 | + | let cU = gF._2 | |
1362 | + | let cV = gF._3 | |
1363 | + | let gG = gF._4 | |
1364 | + | throw((((ap(cU) + ap(cV)) + ap(gG)) + ap(dn(bB)))) | |
1242 | 1365 | } | |
1243 | 1366 | ||
1244 | 1367 | ||
1245 | 1368 | ||
1246 | - | @Callable( | |
1247 | - | func view_calcRemainMarginWithFundingPayment ( | |
1248 | - | let | |
1249 | - | let | |
1250 | - | let | |
1251 | - | let | |
1252 | - | let | |
1253 | - | let | |
1254 | - | let | |
1255 | - | let | |
1256 | - | let | |
1257 | - | let | |
1258 | - | let | |
1259 | - | let | |
1260 | - | throw(((((( | |
1369 | + | @Callable(bs) | |
1370 | + | func view_calcRemainMarginWithFundingPayment (bB) = { | |
1371 | + | let gH = bA(bB) | |
1372 | + | let bE = gH._1 | |
1373 | + | let db = gH._2 | |
1374 | + | let dk = gH._3 | |
1375 | + | let dd = gH._4 | |
1376 | + | let gI = cZ(bB, an) | |
1377 | + | let cQ = gI._1 | |
1378 | + | let cY = gI._2 | |
1379 | + | let gJ = cf(bE, db, dd, cY) | |
1380 | + | let co = gJ._1 | |
1381 | + | let cp = gJ._2 | |
1382 | + | let ck = gJ._3 | |
1383 | + | throw((((((ap(co) + ap(ck)) + ap(dn(bB))) + ap(cY)) + ap(cp)) + ap(cQ))) | |
1261 | 1384 | } | |
1262 | 1385 | ||
1263 | 1386 | ||
1264 | 1387 | ||
1265 | - | @Callable(eA) | |
1266 | - | func forceMoveAsset (bu,ex) = if (if ((addressFromPublicKey(U()) != eA.caller)) | |
1267 | - | then true | |
1268 | - | else (0 > ex)) | |
1269 | - | then throw("Invalid forceMoveAsset parameters") | |
1270 | - | else { | |
1271 | - | let fB = invoke(W(), "unlockNeutrino", [ex, toBase58String(V())], nil) | |
1272 | - | if ((fB == fB)) | |
1273 | - | then (ew(addressFromStringValue(bu), ex) ++ ez((aQ() - ex))) | |
1274 | - | else throw("Strict value is not equal to itself.") | |
1275 | - | } | |
1388 | + | @Callable(bs) | |
1389 | + | func view_getPegAdjustCost (dX) = { | |
1390 | + | let ec = dW(dX) | |
1391 | + | throw(toString(ec._2)) | |
1392 | + | } | |
1276 | 1393 | ||
1277 | 1394 | ||
1278 | - | @Verifier(gm) | |
1279 | - | func gn () = sigVerify(gm.bodyBytes, gm.proofs[0], U()) | |
1395 | + | ||
1396 | + | @Callable(bs) | |
1397 | + | func view_getFunding () = { | |
1398 | + | let ee = cz() | |
1399 | + | let gK = ed() | |
1400 | + | let eh = gK._1 | |
1401 | + | let ei = gK._2 | |
1402 | + | let gL = ar(ei, ee) | |
1403 | + | let gM = ar(eh, ee) | |
1404 | + | throw((((ap(gL) + ap(gM)) + ap(dG())) + ap(cz()))) | |
1405 | + | } | |
1406 | + | ||
1407 | + | ||
1408 | + | @Verifier(gN) | |
1409 | + | func gO () = sigVerify(gN.bodyBytes, gN.proofs[0], X()) | |
1280 | 1410 |
github/deemru/w8io/3ef1775 378.71 ms ◑![]()