tx · ALbafyQFaGSpkuqRPvWjNcaDSSZYHYvpY916UR55TQVv

3NC3GcwFK9knYYKT2SRc7nWxc5SXc2aKBQ6:  -0.07500000 Waves

2023.01.18 17:32 [2410491] smart account 3NC3GcwFK9knYYKT2SRc7nWxc5SXc2aKBQ6 > SELF 0.00000000 Waves

{ "type": 13, "id": "ALbafyQFaGSpkuqRPvWjNcaDSSZYHYvpY916UR55TQVv", "fee": 7500000, "feeAssetId": null, "timestamp": 1674052399642, "version": 2, "chainId": 84, "sender": "3NC3GcwFK9knYYKT2SRc7nWxc5SXc2aKBQ6", "senderPublicKey": "5GAkpjTakesSgVm3A22kYMBvNpM8C1KpqWfyC7YyB84y", "proofs": [ "252NEQ3Cv33MDcJ7eGRYr1KFsGKSL2F28LHio78AeyApJLFg4JeBVZQjcEf9Ly6HhasoiCmsdFwZFWqXoUqyUHu4" ], "script": "base64:BgJ0CAISABIAEgASABIDCgEBEgMKAQESDgoMAQEBAQEBAQEBAQEBEhQKEgEBAQEBAQEICAgIAQEBAQEBARIGCgQBAQEIEgASAwoBARIFCgMBAQQSAwoBCBIAEgASAwoBCBIDCgEBEgASABIDCgEIEgASBAoCCAjGAQAJa19vcmFfa2V5AglrX29yYV9rZXkAD2tfb3JhX2Jsb2NrX2tleQIPa19vcmFfYmxvY2tfa2V5AA5rX29yYV9vcGVuX2tleQIOa19vcmFfb3Blbl9rZXkABWtfb3JhAgVrX29yYQAJa19iYWxhbmNlAglrX2JhbGFuY2UACmtfc2VxdWVuY2UCCmtfc2VxdWVuY2UADmtfcG9zaXRpb25TaXplAg5rX3Bvc2l0aW9uU2l6ZQAQa19wb3NpdGlvbk1hcmdpbgIQa19wb3NpdGlvbk1hcmdpbgAWa19wb3NpdGlvbk9wZW5Ob3Rpb25hbAIWa19wb3NpdGlvbk9wZW5Ob3Rpb25hbAAua19wb3NpdGlvbkxhc3RVcGRhdGVkQ3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgISa19wb3NpdGlvbkZyYWN0aW9uABJrX3Bvc2l0aW9uU2VxdWVuY2UCEmtfcG9zaXRpb25TZXF1ZW5jZQAPa19wb3NpdGlvbkFzc2V0Ag9rX3Bvc2l0aW9uQXNzZXQADWtfcG9zaXRpb25GZWUCDWtfcG9zaXRpb25GZWUADWtfaW5pdGlhbGl6ZWQCDWtfaW5pdGlhbGl6ZWQACGtfcGF1c2VkAghrX3BhdXNlZAALa19jbG9zZU9ubHkCC2tfY2xvc2VPbmx5AAVrX2ZlZQIFa19mZWUAD2tfZnVuZGluZ1BlcmlvZAIPa19mdW5kaW5nUGVyaW9kABFrX2luaXRNYXJnaW5SYXRpbwIRa19pbml0TWFyZ2luUmF0aW8AGGtfbWFpbnRlbmFuY2VNYXJnaW5SYXRpbwIFa19tbXIAFWtfbGlxdWlkYXRpb25GZWVSYXRpbwIVa19saXF1aWRhdGlvbkZlZVJhdGlvABlrX3BhcnRpYWxMaXF1aWRhdGlvblJhdGlvAhZrX3BhcnRMaXF1aWRhdGlvblJhdGlvAA1rX3NwcmVhZExpbWl0Ag1rX3NwcmVhZExpbWl0ABBrX21heFByaWNlSW1wYWN0AhBrX21heFByaWNlSW1wYWN0ABBrX21heFByaWNlU3ByZWFkAhBrX21heFByaWNlU3ByZWFkABFrX21heE9wZW5Ob3Rpb25hbAIRa19tYXhPcGVuTm90aW9uYWwAFWtfZmVlVG9TdGFrZXJzUGVyY2VudAIVa19mZWVUb1N0YWtlcnNQZXJjZW50ABBrX21heE9yYWNsZURlbGF5AhBrX21heE9yYWNsZURlbGF5AA1rX2xhc3REYXRhU3RyAg1rX2xhc3REYXRhU3RyAA5rX2xhc3RNaW51dGVJZAIOa19sYXN0TWludXRlSWQAHWtfdHdhcERhdGFMYXN0Q3VtdWxhdGl2ZVByaWNlAh1rX3R3YXBEYXRhTGFzdEN1bXVsYXRpdmVQcmljZQATa190d2FwRGF0YUxhc3RQcmljZQITa190d2FwRGF0YUxhc3RQcmljZQAaa190d2FwRGF0YVByZXZpb3VzTWludXRlSWQCGmtfdHdhcERhdGFQcmV2aW91c01pbnV0ZUlkACVrX2xhdGVzdExvbmdDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uAhtrX2xhdGVzdExvbmdQcmVtaXVtRnJhY3Rpb24AJmtfbGF0ZXN0U2hvcnRDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uAhxrX2xhdGVzdFNob3J0UHJlbWl1bUZyYWN0aW9uABJrX25leHRGdW5kaW5nQmxvY2sCHmtfbmV4dEZ1bmRpbmdCbG9ja01pblRpbWVzdGFtcAARa19sb25nRnVuZGluZ1JhdGUCEWtfbG9uZ0Z1bmRpbmdSYXRlABJrX3Nob3J0RnVuZGluZ1JhdGUCEmtfc2hvcnRGdW5kaW5nUmF0ZQATa19xdW90ZUFzc2V0UmVzZXJ2ZQIIa19xdEFzdFIAEmtfYmFzZUFzc2V0UmVzZXJ2ZQIIa19ic0FzdFIAEmtfcXVvdGVBc3NldFdlaWdodAIIa19xdEFzdFcAEWtfYmFzZUFzc2V0V2VpZ2h0AghrX2JzQXN0VwATa190b3RhbFBvc2l0aW9uU2l6ZQITa190b3RhbFBvc2l0aW9uU2l6ZQAXa190b3RhbExvbmdQb3NpdGlvblNpemUCF2tfdG90YWxMb25nUG9zaXRpb25TaXplABhrX3RvdGFsU2hvcnRQb3NpdGlvblNpemUCGGtfdG90YWxTaG9ydFBvc2l0aW9uU2l6ZQAWa19vcGVuSW50ZXJlc3ROb3Rpb25hbAIWa19vcGVuSW50ZXJlc3ROb3Rpb25hbAATa19vcGVuSW50ZXJlc3RTaG9ydAITa19vcGVuSW50ZXJlc3RTaG9ydAASa19vcGVuSW50ZXJlc3RMb25nAhJrX29wZW5JbnRlcmVzdExvbmcAFGtfY29vcmRpbmF0b3JBZGRyZXNzAhRrX2Nvb3JkaW5hdG9yQWRkcmVzcwAPa192YXVsdF9hZGRyZXNzAg9rX3ZhdWx0X2FkZHJlc3MAD2tfYWRtaW5fYWRkcmVzcwIPa19hZG1pbl9hZGRyZXNzABJrX2FkbWluX3B1YmxpY19rZXkCEmtfYWRtaW5fcHVibGljX2tleQANa19xdW90ZV9hc3NldAINa19xdW90ZV9hc3NldAAPa19xdW90ZV9zdGFraW5nAg9rX3F1b3RlX3N0YWtpbmcAEWtfc3Rha2luZ19hZGRyZXNzAhFrX3N0YWtpbmdfYWRkcmVzcwAPa19taW5lcl9hZGRyZXNzAg9rX21pbmVyX2FkZHJlc3MAEGtfb3JkZXJzX2FkZHJlc3MCEGtfb3JkZXJzX2FkZHJlc3MAEmtfcmVmZXJyYWxfYWRkcmVzcwISa19yZWZlcnJhbF9hZGRyZXNzABRrX2NvbGxhdGVyYWxfYWRkcmVzcwIUa19jb2xsYXRlcmFsX2FkZHJlc3MAEmtfZXhjaGFuZ2VfYWRkcmVzcwISa19leGNoYW5nZV9hZGRyZXNzABVrX25mdF9tYW5hZ2VyX2FkZHJlc3MCFWtfbmZ0X21hbmFnZXJfYWRkcmVzcwAga190cmFkZXJfbWFya2V0X2Fzc2V0X2NvbGxhdGVyYWwCIGtfdHJhZGVyX21hcmtldF9hc3NldF9jb2xsYXRlcmFsAQ50b0NvbXBvc2l0ZUtleQIEX2tleQhfYWRkcmVzcwkArAICCQCsAgIFBF9rZXkCAV8FCF9hZGRyZXNzAQtjb29yZGluYXRvcgAJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzBRRrX2Nvb3JkaW5hdG9yQWRkcmVzcwITQ29vcmRpbmF0b3Igbm90IHNldAEMYWRtaW5BZGRyZXNzAAkApggBCQERQGV4dHJOYXRpdmUoMTA1MykCCQELY29vcmRpbmF0b3IABQ9rX2FkbWluX2FkZHJlc3MBDmFkbWluUHVibGljS2V5AAkA2QQBCQERQGV4dHJOYXRpdmUoMTA1MykCCQELY29vcmRpbmF0b3IABRJrX2FkbWluX3B1YmxpY19rZXkBCnF1b3RlQXNzZXQACQDZBAEJARFAZXh0ck5hdGl2ZSgxMDUzKQIJAQtjb29yZGluYXRvcgAFDWtfcXVvdGVfYXNzZXQBEXF1b3RlQXNzZXRTdGFraW5nAAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJARFAZXh0ck5hdGl2ZSgxMDUzKQIJAQtjb29yZGluYXRvcgAFD2tfcXVvdGVfc3Rha2luZwIbUXVvdGUgYXNzZXQgc3Rha2luZyBub3Qgc2V0AQ5zdGFraW5nQWRkcmVzcwAJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQERQGV4dHJOYXRpdmUoMTA1MykCCQELY29vcmRpbmF0b3IABRFrX3N0YWtpbmdfYWRkcmVzcwIPU3Rha2luZyBub3Qgc2V0AQx2YXVsdEFkZHJlc3MACQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkBEUBleHRyTmF0aXZlKDEwNTMpAgkBC2Nvb3JkaW5hdG9yAAUPa192YXVsdF9hZGRyZXNzAg1WYXVsdCBub3Qgc2V0AQxtaW5lckFkZHJlc3MACQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkBEUBleHRyTmF0aXZlKDEwNTMpAgkBC2Nvb3JkaW5hdG9yAAUPa19taW5lcl9hZGRyZXNzAg1NaW5lciBub3Qgc2V0AQ1vcmRlcnNBZGRyZXNzAAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJARFAZXh0ck5hdGl2ZSgxMDUzKQIJAQtjb29yZGluYXRvcgAFEGtfb3JkZXJzX2FkZHJlc3MCDk9yZGVycyBub3Qgc2V0AQ9yZWZlcnJhbEFkZHJlc3MACQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkBEUBleHRyTmF0aXZlKDEwNTMpAgkBC2Nvb3JkaW5hdG9yAAUSa19yZWZlcnJhbF9hZGRyZXNzAhBSZWZlcnJhbCBub3Qgc2V0ARFuZnRNYW5hZ2VyQWRkcmVzcwAJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQERQGV4dHJOYXRpdmUoMTA1MykCCQELY29vcmRpbmF0b3IABRVrX25mdF9tYW5hZ2VyX2FkZHJlc3MCE05GVCBNYW5hZ2VyIG5vdCBzZXQBEWNvbGxhdGVyYWxBZGRyZXNzAAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJARFAZXh0ck5hdGl2ZSgxMDUzKQIJAQtjb29yZGluYXRvcgAFFGtfY29sbGF0ZXJhbF9hZGRyZXNzAhpDb2xsYXRlcmFsIE1hbmFnZXIgbm90IHNldAELc3dhcEFkZHJlc3MACQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIJAQtjb29yZGluYXRvcgAFEmtfZXhjaGFuZ2VfYWRkcmVzcwIPTm8gc3dhcCBhZGRyZXNzAhRJbnZhbGlkIHN3YXAgYWRkcmVzcwARa193aGl0ZWxpc3RfYXNzZXQCEWtfd2hpdGVsaXN0X2Fzc2V0ARBpc1doaXRlbGlzdEFzc2V0AQhfYXNzZXRJZAkBC3ZhbHVlT3JFbHNlAgkAmwgCCQERY29sbGF0ZXJhbEFkZHJlc3MACQEOdG9Db21wb3NpdGVLZXkCBRFrX3doaXRlbGlzdF9hc3NldAUIX2Fzc2V0SWQHAA1rX3Rva2VuX3BhcmFtAg1rX3Rva2VuX3BhcmFtAAxrX3Rva2VuX3R5cGUCDGtfdG9rZW5fdHlwZQAYRkVFX1JFRFVDVElPTl9UT0tFTl9UWVBFAg1mZWVfcmVkdWN0aW9uAAhESVJfTE9ORwABAAlESVJfU0hPUlQAAgANVFdBUF9JTlRFUlZBTAAPAA9PUkFDTEVfSU5URVJWQUwADwAHU0VDT05EUwDoBwAPREVDSU1BTF9OVU1CRVJTAAYADERFQ0lNQUxfVU5JVAkAaAIAAQkAaAIJAGgCCQBoAgkAaAIJAGgCAAoACgAKAAoACgAKAAdPTkVfREFZCQBoAgCAowUFDERFQ0lNQUxfVU5JVAAIQUxMX0ZFRVMAZAAPUE5MX09QVElPTl9TUE9UAAEAEVBOTF9PUFRJT05fT1JBQ0xFAAIBAXMBAl94CQCsAgIJAKQDAQUCX3gCASwBBGRpdmQCAl94Al95CQBuBAUCX3gFDERFQ0lNQUxfVU5JVAUCX3kFCEhBTEZFVkVOAQRtdWxkAgJfeAJfeQkAbgQFAl94BQJfeQUMREVDSU1BTF9VTklUBQhIQUxGRVZFTgEFc3FydGQBAl94CQEEc3FydAQFAl94BQ9ERUNJTUFMX05VTUJFUlMFD0RFQ0lNQUxfTlVNQkVSUwUISEFMRkVWRU4BBHBvd2QCAl94Al95CQBsBgUCX3gFD0RFQ0lNQUxfTlVNQkVSUwUCX3kFD0RFQ0lNQUxfTlVNQkVSUwUPREVDSU1BTF9OVU1CRVJTBQhIQUxGRVZFTgEFYmRpdmQCAl94Al95CQC9AgQFAl94CQC2AgEFDERFQ0lNQUxfVU5JVAUCX3kFCEhBTEZFVkVOAQVibXVsZAICX3gCX3kJAL0CBAUCX3gFAl95CQC2AgEFDERFQ0lNQUxfVU5JVAUISEFMRkVWRU4BBmJzcXJ0ZAECX3gJAQpzcXJ0QmlnSW50BAUCX3gFD0RFQ0lNQUxfTlVNQkVSUwUPREVDSU1BTF9OVU1CRVJTBQhIQUxGRVZFTgEFYnBvd2QCAl94Al95CQB2BgUCX3gFD0RFQ0lNQUxfTlVNQkVSUwUCX3kFD0RFQ0lNQUxfTlVNQkVSUwUPREVDSU1BTF9OVU1CRVJTBQhIQUxGRVZFTgEDYWJzAQJfeAMJAGYCBQJfeAAABQJfeAkBAS0BBQJfeAEEdm1heAICX3gCX3kDCQBnAgUCX3gFAl95BQJfeAUCX3kBCWxpc3RUb1N0cgEFX2xpc3QKAQVfam9pbgILYWNjdW11bGF0b3IDdmFsCQCsAgIJAKwCAgULYWNjdW11bGF0b3IFA3ZhbAIBLAQKbmV3TGlzdFN0cgoAAiRsBQVfbGlzdAoAAiRzCQCQAwEFAiRsCgAFJGFjYzACAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEFX2pvaW4CBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDIwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAQLbmV3TGlzdFN0clUJALMCAgUKbmV3TGlzdFN0cgABBAtuZXdMaXN0U3RyUgMJAAACCQCvAgIFC25ld0xpc3RTdHJVAAECASwJALACAgULbmV3TGlzdFN0clUAAQULbmV3TGlzdFN0clUFC25ld0xpc3RTdHJSAQlzdHJUb0xpc3QBBF9zdHIJALUJAgUEX3N0cgIBLAELcHVzaFRvUXVldWUDBV9saXN0CF9tYXhTaXplBl92YWx1ZQMJAGYCCQCQAwEFBV9saXN0BQhfbWF4U2l6ZQkAzQgCCQDRCAIFBV9saXN0AAAFBl92YWx1ZQkAzQgCBQVfbGlzdAUGX3ZhbHVlAQNpbnQBAWsJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQR0aGlzBQFrCQCsAgICDW5vIHZhbHVlIGZvciAFAWsBBWludE9yAgFrA2RlZgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQFrBQNkZWYBBHN0ckECCF9hZGRyZXNzBF9rZXkEA3ZhbAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFCF9hZGRyZXNzBQRfa2V5CQCsAgICEU5vIHZhbHVlIGZvciBrZXkgBQRfa2V5BQN2YWwBBGludEECCF9hZGRyZXNzBF9rZXkEA3ZhbAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFCF9hZGRyZXNzBQRfa2V5CQCsAgICEU5vIHZhbHVlIGZvciBrZXkgBQRfa2V5BQN2YWwBCGNiYWxhbmNlAAkBA2ludAEFCWtfYmFsYW5jZQEDZmVlAAkBA2ludAEFBWtfZmVlAQ9pbml0TWFyZ2luUmF0aW8ACQEDaW50AQURa19pbml0TWFyZ2luUmF0aW8BBnF0QXN0UgAJAQNpbnQBBRNrX3F1b3RlQXNzZXRSZXNlcnZlAQZic0FzdFIACQEDaW50AQUSa19iYXNlQXNzZXRSZXNlcnZlAQZxdEFzdFcACQEFaW50T3ICBRJrX3F1b3RlQXNzZXRXZWlnaHQFDERFQ0lNQUxfVU5JVAEGYnNBc3RXAAkBBWludE9yAgURa19iYXNlQXNzZXRXZWlnaHQFDERFQ0lNQUxfVU5JVAERdG90YWxQb3NpdGlvblNpemUACQEDaW50AQUTa190b3RhbFBvc2l0aW9uU2l6ZQEUb3BlbkludGVyZXN0Tm90aW9uYWwACQEDaW50AQUWa19vcGVuSW50ZXJlc3ROb3Rpb25hbAERb3BlbkludGVyZXN0U2hvcnQACQEDaW50AQUTa19vcGVuSW50ZXJlc3RTaG9ydAEQb3BlbkludGVyZXN0TG9uZwAJAQNpbnQBBRJrX29wZW5JbnRlcmVzdExvbmcBGW5leHRGdW5kaW5nQmxvY2tUaW1lc3RhbXAACQEDaW50AQUSa19uZXh0RnVuZGluZ0Jsb2NrARBmdW5kaW5nUGVyaW9kUmF3AAkBA2ludAEFD2tfZnVuZGluZ1BlcmlvZAEUZnVuZGluZ1BlcmlvZERlY2ltYWwACQBoAgkBEGZ1bmRpbmdQZXJpb2RSYXcABQxERUNJTUFMX1VOSVQBFGZ1bmRpbmdQZXJpb2RTZWNvbmRzAAkAaAIJARBmdW5kaW5nUGVyaW9kUmF3AAUHU0VDT05EUwEWbWFpbnRlbmFuY2VNYXJnaW5SYXRpbwAJAQNpbnQBBRhrX21haW50ZW5hbmNlTWFyZ2luUmF0aW8BE2xpcXVpZGF0aW9uRmVlUmF0aW8ACQEDaW50AQUVa19saXF1aWRhdGlvbkZlZVJhdGlvARdwYXJ0aWFsTGlxdWlkYXRpb25SYXRpbwAJAQNpbnQBBRlrX3BhcnRpYWxMaXF1aWRhdGlvblJhdGlvAQtzcHJlYWRMaW1pdAAJAQNpbnQBBQ1rX3NwcmVhZExpbWl0AQ5tYXhQcmljZUltcGFjdAAJAQNpbnQBBRBrX21heFByaWNlSW1wYWN0AQ5tYXhQcmljZVNwcmVhZAAJAQNpbnQBBRBrX21heFByaWNlU3ByZWFkAQ9tYXhPcGVuTm90aW9uYWwACQEDaW50AQURa19tYXhPcGVuTm90aW9uYWwBI2xhdGVzdExvbmdDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uAAkBA2ludAEFJWtfbGF0ZXN0TG9uZ0N1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24BJGxhdGVzdFNob3J0Q3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgAJAQNpbnQBBSZrX2xhdGVzdFNob3J0Q3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgEWdG90YWxTaG9ydFBvc2l0aW9uU2l6ZQAJAQNpbnQBBRhrX3RvdGFsU2hvcnRQb3NpdGlvblNpemUBFXRvdGFsTG9uZ1Bvc2l0aW9uU2l6ZQAJAQNpbnQBBRdrX3RvdGFsTG9uZ1Bvc2l0aW9uU2l6ZQEMbGFzdFNlcXVlbmNlAAkBBWludE9yAgUKa19zZXF1ZW5jZQAAARNmZWVUb1N0YWtlcnNQZXJjZW50AAkBA2ludAEFFWtfZmVlVG9TdGFrZXJzUGVyY2VudAEObWF4T3JhY2xlRGVsYXkACQEDaW50AQUQa19tYXhPcmFjbGVEZWxheQEPZ2V0QWN0dWFsQ2FsbGVyAQFpCQELdmFsdWVPckVsc2UCCQCdCAIJAQ1vcmRlcnNBZGRyZXNzAAIIa19zZW5kZXIJAKUIAQgFAWkGY2FsbGVyARZyZXF1aXJlTW9yZU1hcmdpblJhdGlvAwxfbWFyZ2luUmF0aW8QX2Jhc2VNYXJnaW5SYXRpbxRfbGFyZ2VyVGhhbk9yRXF1YWxUbwQUcmVtYWluaW5nTWFyZ2luUmF0aW8JAGUCBQxfbWFyZ2luUmF0aW8FEF9iYXNlTWFyZ2luUmF0aW8DAwUUX2xhcmdlclRoYW5PckVxdWFsVG8JAGYCAAAFFHJlbWFpbmluZ01hcmdpblJhdGlvBwkAAgEJAKwCAgkArAICCQCsAgICEEludmFsaWQgbWFyZ2luOiAJAKQDAQUMX21hcmdpblJhdGlvAgMgPCAJAKQDAQUQX2Jhc2VNYXJnaW5SYXRpbwMDCQEBIQEFFF9sYXJnZXJUaGFuT3JFcXVhbFRvCQBnAgUUcmVtYWluaW5nTWFyZ2luUmF0aW8AAAcJAAIBCQCsAgIJAKwCAgkArAICAhBJbnZhbGlkIG1hcmdpbjogCQCkAwEFDF9tYXJnaW5SYXRpbwIDID4gCQCkAwEFEF9iYXNlTWFyZ2luUmF0aW8GAR9sYXRlc3RDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uAQ1fcG9zaXRpb25TaXplAwkAAAIFDV9wb3NpdGlvblNpemUAAAkAAgECLFNob3VsZCBub3QgYmUgY2FsbGVkIHdpdGggX3Bvc2l0aW9uU2l6ZSA9PSAwAwkAZgIFDV9wb3NpdGlvblNpemUAAAkBI2xhdGVzdExvbmdDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uAAkBJGxhdGVzdFNob3J0Q3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgABC2dldFBvc2l0aW9uAQdfdHJhZGVyBA9wb3NpdGlvblNpemVPcHQJAJoIAgUEdGhpcwkBDnRvQ29tcG9zaXRlS2V5AgUOa19wb3NpdGlvblNpemUFB190cmFkZXIEByRtYXRjaDAFD3Bvc2l0aW9uU2l6ZU9wdAMJAAECBQckbWF0Y2gwAgNJbnQEDHBvc2l0aW9uU2l6ZQUHJG1hdGNoMAkAlgoEBQxwb3NpdGlvblNpemUJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAQ50b0NvbXBvc2l0ZUtleQIFEGtfcG9zaXRpb25NYXJnaW4FB190cmFkZXIJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAQ50b0NvbXBvc2l0ZUtleQIFFmtfcG9zaXRpb25PcGVuTm90aW9uYWwFB190cmFkZXIJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAQ50b0NvbXBvc2l0ZUtleQIFLmtfcG9zaXRpb25MYXN0VXBkYXRlZEN1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24FB190cmFkZXIJAJYKBAAAAAAAAAAAARBnZXRQb3NpdGlvbkFzc2V0AQdfdHJhZGVyBBBwb3NpdGlvbkFzc2V0T3B0CQCdCAIFBHRoaXMJAQ50b0NvbXBvc2l0ZUtleQIFD2tfcG9zaXRpb25Bc3NldAUHX3RyYWRlcgQHJG1hdGNoMAUQcG9zaXRpb25Bc3NldE9wdAMJAAECBQckbWF0Y2gwAgZTdHJpbmcEDXBvc2l0aW9uQXNzZXQFByRtYXRjaDAFDXBvc2l0aW9uQXNzZXQJANgEAQkBCnF1b3RlQXNzZXQAAQ5nZXRQb3NpdGlvbkZlZQEHX3RyYWRlcgQOcG9zaXRpb25GZWVPcHQJAJoIAgUEdGhpcwkBDnRvQ29tcG9zaXRlS2V5AgUNa19wb3NpdGlvbkZlZQUHX3RyYWRlcgQHJG1hdGNoMAUOcG9zaXRpb25GZWVPcHQDCQABAgUHJG1hdGNoMAIDSW50BAtwb3NpdGlvbkZlZQUHJG1hdGNoMAULcG9zaXRpb25GZWUJAQNmZWUAARNyZXF1aXJlT3BlblBvc2l0aW9uAQdfdHJhZGVyAwkAAAIICQELZ2V0UG9zaXRpb24BBQdfdHJhZGVyAl8xAAAJAAIBAhBObyBvcGVuIHBvc2l0aW9uBgELaW5pdGlhbGl6ZWQACQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMFDWtfaW5pdGlhbGl6ZWQHAQZwYXVzZWQACQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMFCGtfcGF1c2VkBwEJY2xvc2VPbmx5AAkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzBQtrX2Nsb3NlT25seQcBDXVwZGF0ZVJlc2VydmUDBl9pc0FkZBFfcXVvdGVBc3NldEFtb3VudBBfYmFzZUFzc2V0QW1vdW50AwUGX2lzQWRkBAduZXdCYXNlCQBlAgkBBmJzQXN0UgAFEF9iYXNlQXNzZXRBbW91bnQDCQBnAgAABQduZXdCYXNlCQACAQIqVHggbGVhZCB0byBiYXNlIGFzc2V0IHJlc2VydmUgPD0gMCwgcmV2ZXJ0CQCVCgMJAGQCCQEGcXRBc3RSAAURX3F1b3RlQXNzZXRBbW91bnQFB25ld0Jhc2UJAGQCCQERdG90YWxQb3NpdGlvblNpemUABRBfYmFzZUFzc2V0QW1vdW50BAhuZXdRdW90ZQkAZQIJAQZxdEFzdFIABRFfcXVvdGVBc3NldEFtb3VudAMJAGcCAAAFCG5ld1F1b3RlCQACAQIqVHggbGVhZCB0byBiYXNlIHF1b3RlIHJlc2VydmUgPD0gMCwgcmV2ZXJ0CQCVCgMFCG5ld1F1b3RlCQBkAgkBBmJzQXN0UgAFEF9iYXNlQXNzZXRBbW91bnQJAGUCCQERdG90YWxQb3NpdGlvblNpemUABRBfYmFzZUFzc2V0QW1vdW50AQ1jYWxjSW52YXJpYW50AgdfcXRBc3RSB19ic0FzdFIEB2JxdEFzdFIJALYCAQUHX3F0QXN0UgQHYmJzQXN0UgkAtgIBBQdfYnNBc3RSCQEFYm11bGQCBQdicXRBc3RSBQdiYnNBc3RSAQlzd2FwSW5wdXQCBl9pc0FkZBFfcXVvdGVBc3NldEFtb3VudAQHX3F0QXN0UgkBBnF0QXN0UgAEB19ic0FzdFIJAQZic0FzdFIABAdfcXRBc3RXCQEGcXRBc3RXAAQHX2JzQXN0VwkBBmJzQXN0VwAEGHF1b3RlQXNzZXRBbW91bnRBZGp1c3RlZAkBBGRpdmQCBRFfcXVvdGVBc3NldEFtb3VudAUHX3F0QXN0VwQBawkBDWNhbGNJbnZhcmlhbnQCBQdfcXRBc3RSBQdfYnNBc3RSBBZxdW90ZUFzc2V0UmVzZXJ2ZUFmdGVyAwUGX2lzQWRkCQBkAgUHX3F0QXN0UgUYcXVvdGVBc3NldEFtb3VudEFkanVzdGVkCQBlAgUHX3F0QXN0UgUYcXVvdGVBc3NldEFtb3VudEFkanVzdGVkBBViYXNlQXNzZXRSZXNlcnZlQWZ0ZXIJAKADAQkBBWJkaXZkAgUBawkAtgIBBRZxdW90ZUFzc2V0UmVzZXJ2ZUFmdGVyBBhhbW91bnRCYXNlQXNzZXRCb3VnaHRBYnMJAQNhYnMBCQBlAgUVYmFzZUFzc2V0UmVzZXJ2ZUFmdGVyBQdfYnNBc3RSBBVhbW91bnRCYXNlQXNzZXRCb3VnaHQDBQZfaXNBZGQFGGFtb3VudEJhc2VBc3NldEJvdWdodEFicwkBAS0BBRhhbW91bnRCYXNlQXNzZXRCb3VnaHRBYnMEDSR0MDE3MTM4MTczMDgJAQ11cGRhdGVSZXNlcnZlAwUGX2lzQWRkBRhxdW90ZUFzc2V0QW1vdW50QWRqdXN0ZWQFGGFtb3VudEJhc2VBc3NldEJvdWdodEFicwQXcXVvdGVBc3NldFJlc2VydmVBZnRlcjEIBQ0kdDAxNzEzODE3MzA4Al8xBBZiYXNlQXNzZXRSZXNlcnZlQWZ0ZXIxCAUNJHQwMTcxMzgxNzMwOAJfMgQXdG90YWxQb3NpdGlvblNpemVBZnRlcjEIBQ0kdDAxNzEzODE3MzA4Al8zBAtwcmljZUJlZm9yZQkBBGRpdmQCCQEEbXVsZAIFB19xdEFzdFIFB19xdEFzdFcJAQRtdWxkAgUHX2JzQXN0UgUHX2JzQXN0VwQLbWFya2V0UHJpY2UJAQRkaXZkAgURX3F1b3RlQXNzZXRBbW91bnQFGGFtb3VudEJhc2VBc3NldEJvdWdodEFicwQJcHJpY2VEaWZmCQEDYWJzAQkAZQIFC3ByaWNlQmVmb3JlBQttYXJrZXRQcmljZQQLcHJpY2VJbXBhY3QJAGUCBQxERUNJTUFMX1VOSVQJAQRkaXZkAgULcHJpY2VCZWZvcmUJAGQCBQtwcmljZUJlZm9yZQUJcHJpY2VEaWZmBBNtYXhQcmljZUltcGFjdFZhbHVlCQEObWF4UHJpY2VJbXBhY3QAAwkAZgIFC3ByaWNlSW1wYWN0BRNtYXhQcmljZUltcGFjdFZhbHVlCQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAg1QcmljZSBpbXBhY3QgCQCkAwEFC3ByaWNlSW1wYWN0AhQgPiBtYXggcHJpY2UgaW1wYWN0IAkApAMBBRNtYXhQcmljZUltcGFjdFZhbHVlAhUgYmVmb3JlIHF1b3RlIGFzc2V0OiAJAKQDAQUHX3F0QXN0UgIUIGJlZm9yZSBiYXNlIGFzc2V0OiAJAKQDAQUHX2JzQXN0UgIhIHF1b3RlIGFzc2V0IGFtb3VudCB0byBleGNoYW5nZTogCQCkAwEFEV9xdW90ZUFzc2V0QW1vdW50Ag8gcHJpY2UgYmVmb3JlOiAJAKQDAQULcHJpY2VCZWZvcmUCDiBtYXJrZXRQcmljZTogCQCkAwEFC21hcmtldFByaWNlCQCWCgQFFWFtb3VudEJhc2VBc3NldEJvdWdodAUXcXVvdGVBc3NldFJlc2VydmVBZnRlcjEFFmJhc2VBc3NldFJlc2VydmVBZnRlcjEFF3RvdGFsUG9zaXRpb25TaXplQWZ0ZXIxASJjYWxjUmVtYWluTWFyZ2luV2l0aEZ1bmRpbmdQYXltZW50BBBfb2xkUG9zaXRpb25TaXplEl9vbGRQb3NpdGlvbk1hcmdpbiVfb2xkUG9zaXRpb25DdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uDF9tYXJnaW5EZWx0YQQOZnVuZGluZ1BheW1lbnQDCQECIT0CBRBfb2xkUG9zaXRpb25TaXplAAAEIF9sYXRlc3RDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uCQEfbGF0ZXN0Q3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgEFEF9vbGRQb3NpdGlvblNpemUJAQRtdWxkAgkAZQIFIF9sYXRlc3RDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uBSVfb2xkUG9zaXRpb25DdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uBRBfb2xkUG9zaXRpb25TaXplAAAEDHNpZ25lZE1hcmdpbgkAZAIJAGUCBQxfbWFyZ2luRGVsdGEFDmZ1bmRpbmdQYXltZW50BRJfb2xkUG9zaXRpb25NYXJnaW4EDSR0MDE4Nzk1MTg5MjIDCQBmAgAABQxzaWduZWRNYXJnaW4JAJQKAgAACQEDYWJzAQUMc2lnbmVkTWFyZ2luCQCUCgIJAQNhYnMBBQxzaWduZWRNYXJnaW4AAAQMcmVtYWluTWFyZ2luCAUNJHQwMTg3OTUxODkyMgJfMQQHYmFkRGVidAgFDSR0MDE4Nzk1MTg5MjICXzIJAJUKAwUMcmVtYWluTWFyZ2luBQdiYWREZWJ0BQ5mdW5kaW5nUGF5bWVudAEWc3dhcE91dHB1dFdpdGhSZXNlcnZlcwcGX2lzQWRkEF9iYXNlQXNzZXRBbW91bnQUX2NoZWNrTWF4UHJpY2VJbXBhY3QSX3F1b3RlQXNzZXRSZXNlcnZlEV9xdW90ZUFzc2V0V2VpZ2h0EV9iYXNlQXNzZXRSZXNlcnZlEF9iYXNlQXNzZXRXZWlnaHQEC3ByaWNlQmVmb3JlCQEEZGl2ZAIJAQRtdWxkAgUSX3F1b3RlQXNzZXRSZXNlcnZlBRFfcXVvdGVBc3NldFdlaWdodAkBBG11bGQCBRFfYmFzZUFzc2V0UmVzZXJ2ZQUQX2Jhc2VBc3NldFdlaWdodAMJAAACBRBfYmFzZUFzc2V0QW1vdW50AAAJAAIBAhlJbnZhbGlkIGJhc2UgYXNzZXQgYW1vdW50BAFrCQENY2FsY0ludmFyaWFudAIFEl9xdW90ZUFzc2V0UmVzZXJ2ZQURX2Jhc2VBc3NldFJlc2VydmUEGGJhc2VBc3NldFBvb2xBbW91bnRBZnRlcgMFBl9pc0FkZAkAZAIFEV9iYXNlQXNzZXRSZXNlcnZlBRBfYmFzZUFzc2V0QW1vdW50CQBlAgURX2Jhc2VBc3NldFJlc2VydmUFEF9iYXNlQXNzZXRBbW91bnQED3F1b3RlQXNzZXRBZnRlcgkAoAMBCQEFYmRpdmQCBQFrCQC2AgEFGGJhc2VBc3NldFBvb2xBbW91bnRBZnRlcgQPcXVvdGVBc3NldERlbHRhCQEDYWJzAQkAZQIFD3F1b3RlQXNzZXRBZnRlcgUSX3F1b3RlQXNzZXRSZXNlcnZlBA5xdW90ZUFzc2V0U29sZAkBBG11bGQCBQ9xdW90ZUFzc2V0RGVsdGEFEV9xdW90ZUFzc2V0V2VpZ2h0BBNtYXhQcmljZUltcGFjdFZhbHVlCQEObWF4UHJpY2VJbXBhY3QABA0kdDAyMDA5MjIwMjU0CQENdXBkYXRlUmVzZXJ2ZQMJAQEhAQUGX2lzQWRkBQ9xdW90ZUFzc2V0RGVsdGEFEF9iYXNlQXNzZXRBbW91bnQEF3F1b3RlQXNzZXRSZXNlcnZlQWZ0ZXIxCAUNJHQwMjAwOTIyMDI1NAJfMQQWYmFzZUFzc2V0UmVzZXJ2ZUFmdGVyMQgFDSR0MDIwMDkyMjAyNTQCXzIEF3RvdGFsUG9zaXRpb25TaXplQWZ0ZXIxCAUNJHQwMjAwOTIyMDI1NAJfMwQLbWFya2V0UHJpY2UJAQRkaXZkAgUOcXVvdGVBc3NldFNvbGQFEF9iYXNlQXNzZXRBbW91bnQECXByaWNlRGlmZgkBA2FicwEJAGUCBQtwcmljZUJlZm9yZQULbWFya2V0UHJpY2UEC3ByaWNlSW1wYWN0CQBlAgUMREVDSU1BTF9VTklUCQEEZGl2ZAIFC3ByaWNlQmVmb3JlCQBkAgULcHJpY2VCZWZvcmUFCXByaWNlRGlmZgMDCQBmAgULcHJpY2VJbXBhY3QFE21heFByaWNlSW1wYWN0VmFsdWUFFF9jaGVja01heFByaWNlSW1wYWN0BwkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgINUHJpY2UgaW1wYWN0IAkApAMBBQtwcmljZUltcGFjdAIUID4gbWF4IHByaWNlIGltcGFjdCAJAKQDAQUTbWF4UHJpY2VJbXBhY3RWYWx1ZQIVIGJlZm9yZSBxdW90ZSBhc3NldDogCQCkAwEFEl9xdW90ZUFzc2V0UmVzZXJ2ZQIUIGJlZm9yZSBiYXNlIGFzc2V0OiAJAKQDAQURX2Jhc2VBc3NldFJlc2VydmUCICBiYXNlIGFzc2V0IGFtb3VudCB0byBleGNoYW5nZTogCQCkAwEFEF9iYXNlQXNzZXRBbW91bnQCDyBwcmljZSBiZWZvcmU6IAkApAMBBQtwcmljZUJlZm9yZQIPIG1hcmtldCBwcmljZTogCQCkAwEFC21hcmtldFByaWNlCQCZCgcFDnF1b3RlQXNzZXRTb2xkBRdxdW90ZUFzc2V0UmVzZXJ2ZUFmdGVyMQUWYmFzZUFzc2V0UmVzZXJ2ZUFmdGVyMQUXdG90YWxQb3NpdGlvblNpemVBZnRlcjEJAGUCCQEVdG90YWxMb25nUG9zaXRpb25TaXplAAMFBl9pc0FkZAkBA2FicwEFEF9iYXNlQXNzZXRBbW91bnQAAAkAZQIJARZ0b3RhbFNob3J0UG9zaXRpb25TaXplAAMJAQEhAQUGX2lzQWRkCQEDYWJzAQUQX2Jhc2VBc3NldEFtb3VudAAABQtwcmljZUltcGFjdAEKc3dhcE91dHB1dAMGX2lzQWRkEF9iYXNlQXNzZXRBbW91bnQUX2NoZWNrTWF4UHJpY2VJbXBhY3QJARZzd2FwT3V0cHV0V2l0aFJlc2VydmVzBwUGX2lzQWRkBRBfYmFzZUFzc2V0QW1vdW50BRRfY2hlY2tNYXhQcmljZUltcGFjdAkBBnF0QXN0UgAJAQZxdEFzdFcACQEGYnNBc3RSAAkBBmJzQXN0VwABDmdldE9yYWNsZVByaWNlAAQGb3JhY2xlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwUFa19vcmECAAQIcHJpY2VLZXkJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMFCWtfb3JhX2tleQQJbGFzdFZhbHVlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUGb3JhY2xlBQhwcmljZUtleQkArAICCQCsAgIJAKwCAgIiQ2FuIG5vdCBnZXQgb3JhY2xlIHByaWNlLiBPcmFjbGU6IAkApQgBBQZvcmFjbGUCBiBrZXk6IAUIcHJpY2VLZXkECGJsb2NrS2V5CQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMFD2tfb3JhX2Jsb2NrX2tleQIAAwkBAiE9AgUIYmxvY2tLZXkCAAQMY3VycmVudEJsb2NrCAUJbGFzdEJsb2NrBmhlaWdodAQPbGFzdE9yYWNsZUJsb2NrCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUGb3JhY2xlBQhibG9ja0tleQkArAICCQCsAgIJAKwCAgIiQ2FuIG5vdCBnZXQgb3JhY2xlIGJsb2NrLiBPcmFjbGU6IAkApQgBBQZvcmFjbGUCBiBrZXk6IAUIYmxvY2tLZXkDCQBmAgkAZQIFDGN1cnJlbnRCbG9jawUPbGFzdE9yYWNsZUJsb2NrCQEObWF4T3JhY2xlRGVsYXkACQACAQkArAICCQCsAgIJAKwCAgImT3JhY2xlIHN0YWxlIGRhdGEuIExhc3Qgb3JhY2xlIGJsb2NrOiAJAKQDAQUPbGFzdE9yYWNsZUJsb2NrAhAgY3VycmVudCBibG9jazogCQCkAwEFDGN1cnJlbnRCbG9jawUJbGFzdFZhbHVlBQlsYXN0VmFsdWUBDmlzTWFya2V0Q2xvc2VkAAQGb3JhY2xlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwUFa19vcmECAAQHb3BlbktleQkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzBQ5rX29yYV9vcGVuX2tleQIAAwkBAiE9AgUHb3BlbktleQIABAZpc09wZW4JARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmwgCBQZvcmFjbGUFB29wZW5LZXkJAKwCAgkArAICCQCsAgICK0NhbiBub3QgZ2V0IG9yYWNsZSBpcyBvcGVuL2Nsb3NlZC4gT3JhY2xlOiAJAKUIAQUGb3JhY2xlAgYga2V5OiAFB29wZW5LZXkJAQEhAQUGaXNPcGVuBwEMYWJzUHJpY2VEaWZmBQxfb3JhY2xlUHJpY2USX3F1b3RlQXNzZXRSZXNlcnZlEV9iYXNlQXNzZXRSZXNlcnZlB19xdEFzdFcHX2JzQXN0VwQKcHJpY2VBZnRlcgkBBGRpdmQCCQEEbXVsZAIFEl9xdW90ZUFzc2V0UmVzZXJ2ZQUHX3F0QXN0VwkBBG11bGQCBRFfYmFzZUFzc2V0UmVzZXJ2ZQUHX2JzQXN0VwQMYXZlcmFnZVByaWNlCQEEZGl2ZAIJAGQCBQxfb3JhY2xlUHJpY2UFCnByaWNlQWZ0ZXIJAGgCAAIFDERFQ0lNQUxfVU5JVAQMYWJzUHJpY2VEaWZmCQEEZGl2ZAIJAQNhYnMBCQBlAgUMX29yYWNsZVByaWNlBQpwcmljZUFmdGVyBQxhdmVyYWdlUHJpY2UFDGFic1ByaWNlRGlmZgEZcmVxdWlyZU5vdE92ZXJTcHJlYWRMaW1pdAISX3F1b3RlQXNzZXRSZXNlcnZlEV9iYXNlQXNzZXRSZXNlcnZlBAtvcmFjbGVQcmljZQkBDmdldE9yYWNsZVByaWNlAAQHX3F0QXN0VwkBBnF0QXN0VwAEB19ic0FzdFcJAQZic0FzdFcABBJhYnNQcmljZURpZmZCZWZvcmUJAQxhYnNQcmljZURpZmYFBQtvcmFjbGVQcmljZQkBBnF0QXN0UgAJAQZic0FzdFIABQdfcXRBc3RXBQdfYnNBc3RXBBFhYnNQcmljZURpZmZBZnRlcgkBDGFic1ByaWNlRGlmZgUFC29yYWNsZVByaWNlBRJfcXVvdGVBc3NldFJlc2VydmUFEV9iYXNlQXNzZXRSZXNlcnZlBQdfcXRBc3RXBQdfYnNBc3RXAwMJAGYCBRFhYnNQcmljZURpZmZBZnRlcgkBDm1heFByaWNlU3ByZWFkAAkAZgIFEWFic1ByaWNlRGlmZkFmdGVyBRJhYnNQcmljZURpZmZCZWZvcmUHCQACAQkArAICCQCsAgIJAKwCAgINUHJpY2Ugc3ByZWFkIAkApAMBBRFhYnNQcmljZURpZmZBZnRlcgIUID4gbWF4IHByaWNlIHNwcmVhZCAJAKQDAQkBDm1heFByaWNlU3ByZWFkAAYBHXJlcXVpcmVOb3RPdmVyTWF4T3Blbk5vdGlvbmFsAhFfbG9uZ09wZW5Ob3Rpb25hbBJfc2hvcnRPcGVuTm90aW9uYWwEEF9tYXhPcGVuTm90aW9uYWwJAQ9tYXhPcGVuTm90aW9uYWwAAwkAZgIFEV9sb25nT3Blbk5vdGlvbmFsBRBfbWF4T3Blbk5vdGlvbmFsCQACAQkArAICCQCsAgIJAKwCAgITTG9uZyBvcGVuIG5vdGlvbmFsIAkApAMBBRFfbG9uZ09wZW5Ob3Rpb25hbAIVID4gbWF4IG9wZW4gbm90aW9uYWwgCQCkAwEFEF9tYXhPcGVuTm90aW9uYWwDCQBmAgUSX3Nob3J0T3Blbk5vdGlvbmFsBRBfbWF4T3Blbk5vdGlvbmFsCQACAQkArAICCQCsAgIJAKwCAgIUU2hvcnQgb3BlbiBub3Rpb25hbCAJAKQDAQUSX3Nob3J0T3Blbk5vdGlvbmFsAhUgPiBtYXggb3BlbiBub3Rpb25hbCAJAKQDAQUQX21heE9wZW5Ob3Rpb25hbAYBDGdldFNwb3RQcmljZQAEEl9xdW90ZUFzc2V0UmVzZXJ2ZQkBBnF0QXN0UgAEEV9iYXNlQXNzZXRSZXNlcnZlCQEGYnNBc3RSAAQHX3F0QXN0VwkBBnF0QXN0VwAEB19ic0FzdFcJAQZic0FzdFcACQEEZGl2ZAIJAQRtdWxkAgUSX3F1b3RlQXNzZXRSZXNlcnZlBQdfcXRBc3RXCQEEbXVsZAIFEV9iYXNlQXNzZXRSZXNlcnZlBQdfYnNBc3RXARZpc092ZXJGbHVjdHVhdGlvbkxpbWl0AAQLb3JhY2xlUHJpY2UJAQ5nZXRPcmFjbGVQcmljZQAEDGN1cnJlbnRQcmljZQkBDGdldFNwb3RQcmljZQAJAGYCCQEEZGl2ZAIJAQNhYnMBCQBlAgULb3JhY2xlUHJpY2UFDGN1cnJlbnRQcmljZQULb3JhY2xlUHJpY2UJAQtzcHJlYWRMaW1pdAABH2dldFBvc2l0aW9uQWRqdXN0ZWRPcGVuTm90aW9uYWwGDV9wb3NpdGlvblNpemUHX29wdGlvbhJfcXVvdGVBc3NldFJlc2VydmURX3F1b3RlQXNzZXRXZWlnaHQRX2Jhc2VBc3NldFJlc2VydmUQX2Jhc2VBc3NldFdlaWdodAQPcG9zaXRpb25TaXplQWJzCQEDYWJzAQUNX3Bvc2l0aW9uU2l6ZQQHaXNTaG9ydAkAZgIAAAUNX3Bvc2l0aW9uU2l6ZQQQcG9zaXRpb25Ob3Rpb25hbAMJAAACBQdfb3B0aW9uBQ9QTkxfT1BUSU9OX1NQT1QEDSR0MDI1MjA1MjU0MjUJARZzd2FwT3V0cHV0V2l0aFJlc2VydmVzBwkBASEBBQdpc1Nob3J0BQ9wb3NpdGlvblNpemVBYnMHBRJfcXVvdGVBc3NldFJlc2VydmUFEV9xdW90ZUFzc2V0V2VpZ2h0BRFfYmFzZUFzc2V0UmVzZXJ2ZQUQX2Jhc2VBc3NldFdlaWdodAQTb3V0UG9zaXRpb25Ob3Rpb25hbAgFDSR0MDI1MjA1MjU0MjUCXzEEAngxCAUNJHQwMjUyMDUyNTQyNQJfMgQCeDIIBQ0kdDAyNTIwNTI1NDI1Al8zBAJ4MwgFDSR0MDI1MjA1MjU0MjUCXzQFE291dFBvc2l0aW9uTm90aW9uYWwJAQRtdWxkAgUPcG9zaXRpb25TaXplQWJzCQEOZ2V0T3JhY2xlUHJpY2UABRBwb3NpdGlvbk5vdGlvbmFsAStnZXRQb3NpdGlvbk5vdGlvbmFsQW5kVW5yZWFsaXplZFBubEJ5VmFsdWVzBw1fcG9zaXRpb25TaXplFV9wb3NpdGlvbk9wZW5Ob3Rpb25hbBJfcXVvdGVBc3NldFJlc2VydmURX3F1b3RlQXNzZXRXZWlnaHQRX2Jhc2VBc3NldFJlc2VydmUQX2Jhc2VBc3NldFdlaWdodAdfb3B0aW9uAwkAAAIFDV9wb3NpdGlvblNpemUAAAkAAgECFUludmFsaWQgcG9zaXRpb24gc2l6ZQQHaXNTaG9ydAkAZgIAAAUNX3Bvc2l0aW9uU2l6ZQQQcG9zaXRpb25Ob3Rpb25hbAkBH2dldFBvc2l0aW9uQWRqdXN0ZWRPcGVuTm90aW9uYWwGBQ1fcG9zaXRpb25TaXplBQdfb3B0aW9uBRJfcXVvdGVBc3NldFJlc2VydmUFEV9xdW90ZUFzc2V0V2VpZ2h0BRFfYmFzZUFzc2V0UmVzZXJ2ZQUQX2Jhc2VBc3NldFdlaWdodAQNdW5yZWFsaXplZFBubAMFB2lzU2hvcnQJAGUCBRVfcG9zaXRpb25PcGVuTm90aW9uYWwFEHBvc2l0aW9uTm90aW9uYWwJAGUCBRBwb3NpdGlvbk5vdGlvbmFsBRVfcG9zaXRpb25PcGVuTm90aW9uYWwJAJQKAgUQcG9zaXRpb25Ob3Rpb25hbAUNdW5yZWFsaXplZFBubAEjZ2V0UG9zaXRpb25Ob3Rpb25hbEFuZFVucmVhbGl6ZWRQbmwCB190cmFkZXIHX29wdGlvbgQNJHQwMjY4NDYyNjk3NAkBC2dldFBvc2l0aW9uAQUHX3RyYWRlcgQMcG9zaXRpb25TaXplCAUNJHQwMjY4NDYyNjk3NAJfMQQOcG9zaXRpb25NYXJnaW4IBQ0kdDAyNjg0NjI2OTc0Al8yBBRwb3NpdGlvbk9wZW5Ob3Rpb25hbAgFDSR0MDI2ODQ2MjY5NzQCXzMEEXBvc2l0aW9uTHN0VXBkQ1BGCAUNJHQwMjY4NDYyNjk3NAJfNAkBK2dldFBvc2l0aW9uTm90aW9uYWxBbmRVbnJlYWxpemVkUG5sQnlWYWx1ZXMHBQxwb3NpdGlvblNpemUFFHBvc2l0aW9uT3Blbk5vdGlvbmFsCQEGcXRBc3RSAAkBBnF0QXN0VwAJAQZic0FzdFIACQEGYnNBc3RXAAUHX29wdGlvbgEPY2FsY01hcmdpblJhdGlvAw1fcmVtYWluTWFyZ2luCF9iYWREZWJ0EV9wb3NpdGlvbk5vdGlvbmFsCQEEZGl2ZAIJAGUCBQ1fcmVtYWluTWFyZ2luBQhfYmFkRGVidAURX3Bvc2l0aW9uTm90aW9uYWwBFmdldE1hcmdpblJhdGlvQnlPcHRpb24CB190cmFkZXIHX29wdGlvbgQNJHQwMjc0ODcyNzU5OAkBC2dldFBvc2l0aW9uAQUHX3RyYWRlcgQMcG9zaXRpb25TaXplCAUNJHQwMjc0ODcyNzU5OAJfMQQOcG9zaXRpb25NYXJnaW4IBQ0kdDAyNzQ4NzI3NTk4Al8yBANwb24IBQ0kdDAyNzQ4NzI3NTk4Al8zBBFwb3NpdGlvbkxzdFVwZENQRggFDSR0MDI3NDg3Mjc1OTgCXzQEDSR0MDI3NjA0Mjc2OTcJASNnZXRQb3NpdGlvbk5vdGlvbmFsQW5kVW5yZWFsaXplZFBubAIFB190cmFkZXIFB19vcHRpb24EEHBvc2l0aW9uTm90aW9uYWwIBQ0kdDAyNzYwNDI3Njk3Al8xBA11bnJlYWxpemVkUG5sCAUNJHQwMjc2MDQyNzY5NwJfMgQNJHQwMjc3MDIyNzg2OAkBImNhbGNSZW1haW5NYXJnaW5XaXRoRnVuZGluZ1BheW1lbnQEBQxwb3NpdGlvblNpemUFDnBvc2l0aW9uTWFyZ2luBRFwb3NpdGlvbkxzdFVwZENQRgUNdW5yZWFsaXplZFBubAQMcmVtYWluTWFyZ2luCAUNJHQwMjc3MDIyNzg2OAJfMQQHYmFkRGVidAgFDSR0MDI3NzAyMjc4NjgCXzIJAQ9jYWxjTWFyZ2luUmF0aW8DBQxyZW1haW5NYXJnaW4FB2JhZERlYnQFEHBvc2l0aW9uTm90aW9uYWwBDmdldE1hcmdpblJhdGlvAQdfdHJhZGVyCQEWZ2V0TWFyZ2luUmF0aW9CeU9wdGlvbgIFB190cmFkZXIFD1BOTF9PUFRJT05fU1BPVAEbZ2V0UGFydGlhbExpcXVpZGF0aW9uQW1vdW50AgdfdHJhZGVyDV9wb3NpdGlvblNpemUEDG1heGltdW1SYXRpbwkBBHZtYXgCCQEXcGFydGlhbExpcXVpZGF0aW9uUmF0aW8ACQBlAgUMREVDSU1BTF9VTklUCQEEZGl2ZAIJAQ5nZXRNYXJnaW5SYXRpbwEFB190cmFkZXIJARZtYWludGVuYW5jZU1hcmdpblJhdGlvAAQYbWF4RXhjaGFuZ2VkUG9zaXRpb25TaXplCQEEbXVsZAIJAQNhYnMBBQ1fcG9zaXRpb25TaXplBQxtYXhpbXVtUmF0aW8ECnN3YXBSZXN1bHQJAQpzd2FwT3V0cHV0AwkAZgIFDV9wb3NpdGlvblNpemUAAAUYbWF4RXhjaGFuZ2VkUG9zaXRpb25TaXplBwQcbWF4RXhjaGFuZ2VkUXVvdGVBc3NldEFtb3VudAgFCnN3YXBSZXN1bHQCXzEEC3ByaWNlSW1wYWN0CAUKc3dhcFJlc3VsdAJfNwMJAGYCCQEObWF4UHJpY2VJbXBhY3QABQtwcmljZUltcGFjdAUcbWF4RXhjaGFuZ2VkUXVvdGVBc3NldEFtb3VudAQVZXhjaGFuZ2VkUG9zaXRpb25TaXplCQEEbXVsZAIJAQNhYnMBBQ1fcG9zaXRpb25TaXplCQEXcGFydGlhbExpcXVpZGF0aW9uUmF0aW8ABBlleGNoYW5nZWRRdW90ZUFzc2V0QW1vdW50CAkBCnN3YXBPdXRwdXQDCQBmAgUNX3Bvc2l0aW9uU2l6ZQAABRVleGNoYW5nZWRQb3NpdGlvblNpemUHAl8xBRlleGNoYW5nZWRRdW90ZUFzc2V0QW1vdW50ARVpbnRlcm5hbENsb3NlUG9zaXRpb24CB190cmFkZXIUX2NoZWNrTWF4UHJpY2VJbXBhY3QEDSR0MDI5MTA4MjkyMzYJAQtnZXRQb3NpdGlvbgEFB190cmFkZXIEDHBvc2l0aW9uU2l6ZQgFDSR0MDI5MTA4MjkyMzYCXzEEDnBvc2l0aW9uTWFyZ2luCAUNJHQwMjkxMDgyOTIzNgJfMgQUcG9zaXRpb25PcGVuTm90aW9uYWwIBQ0kdDAyOTEwODI5MjM2Al8zBBFwb3NpdGlvbkxzdFVwZENQRggFDSR0MDI5MTA4MjkyMzYCXzQEDXVucmVhbGl6ZWRQbmwICQEjZ2V0UG9zaXRpb25Ob3Rpb25hbEFuZFVucmVhbGl6ZWRQbmwCBQdfdHJhZGVyBQ9QTkxfT1BUSU9OX1NQT1QCXzIEDSR0MDI5MzMxMjk0OTkJASJjYWxjUmVtYWluTWFyZ2luV2l0aEZ1bmRpbmdQYXltZW50BAUMcG9zaXRpb25TaXplBQ5wb3NpdGlvbk1hcmdpbgURcG9zaXRpb25Mc3RVcGRDUEYFDXVucmVhbGl6ZWRQbmwEDHJlbWFpbk1hcmdpbggFDSR0MDI5MzMxMjk0OTkCXzEEB2JhZERlYnQIBQ0kdDAyOTMzMTI5NDk5Al8yBBVleGNoYW5nZWRQb3NpdGlvblNpemUJAQEtAQUMcG9zaXRpb25TaXplBAtyZWFsaXplZFBubAUNdW5yZWFsaXplZFBubAQNbWFyZ2luVG9WYXVsdAkBAS0BBQxyZW1haW5NYXJnaW4EDSR0MDI5NjI2Mjk5MDAJAQpzd2FwT3V0cHV0AwkAZgIFDHBvc2l0aW9uU2l6ZQAACQEDYWJzAQUMcG9zaXRpb25TaXplBRRfY2hlY2tNYXhQcmljZUltcGFjdAQZZXhjaGFuZ2VkUXVvdGVBc3NldEFtb3VudAgFDSR0MDI5NjI2Mjk5MDACXzEEFnF1b3RlQXNzZXRSZXNlcnZlQWZ0ZXIIBQ0kdDAyOTYyNjI5OTAwAl8yBBViYXNlQXNzZXRSZXNlcnZlQWZ0ZXIIBQ0kdDAyOTYyNjI5OTAwAl8zBBZ0b3RhbFBvc2l0aW9uU2l6ZUFmdGVyCAUNJHQwMjk2MjYyOTkwMAJfNAQOdG90YWxMb25nQWZ0ZXIIBQ0kdDAyOTYyNjI5OTAwAl81BA90b3RhbFNob3J0QWZ0ZXIIBQ0kdDAyOTYyNjI5OTAwAl82BBlvcGVuSW50ZXJlc3ROb3Rpb25hbEFmdGVyCQBlAgkBFG9wZW5JbnRlcmVzdE5vdGlvbmFsAAUUcG9zaXRpb25PcGVuTm90aW9uYWwJAJ8KDQUVZXhjaGFuZ2VkUG9zaXRpb25TaXplBQdiYWREZWJ0BQtyZWFsaXplZFBubAUNbWFyZ2luVG9WYXVsdAUWcXVvdGVBc3NldFJlc2VydmVBZnRlcgUVYmFzZUFzc2V0UmVzZXJ2ZUFmdGVyBRZ0b3RhbFBvc2l0aW9uU2l6ZUFmdGVyBRlvcGVuSW50ZXJlc3ROb3Rpb25hbEFmdGVyBRlleGNoYW5nZWRRdW90ZUFzc2V0QW1vdW50BQ50b3RhbExvbmdBZnRlcgUPdG90YWxTaG9ydEFmdGVyCQBlAgkBEG9wZW5JbnRlcmVzdExvbmcAAwkAZgIFDHBvc2l0aW9uU2l6ZQAABRRwb3NpdGlvbk9wZW5Ob3Rpb25hbAAACQBlAgkBEW9wZW5JbnRlcmVzdFNob3J0AAMJAGYCAAAFDHBvc2l0aW9uU2l6ZQUUcG9zaXRpb25PcGVuTm90aW9uYWwAAAEQZ2V0VHdhcFNwb3RQcmljZQAECG1pbnV0ZUlkCQBpAgkAaQIIBQlsYXN0QmxvY2sJdGltZXN0YW1wAOgHADwEDXN0YXJ0TWludXRlSWQJAGUCBQhtaW51dGVJZAUNVFdBUF9JTlRFUlZBTAQHbGlzdFN0cgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzBQ1rX2xhc3REYXRhU3RyAgAEBGxpc3QJALUJAgUHbGlzdFN0cgIBLAoBCGZpbHRlckZuAgthY2N1bXVsYXRvcgRuZXh0AwkAZwIFDXN0YXJ0TWludXRlSWQJAQ1wYXJzZUludFZhbHVlAQUEbmV4dAkAzQgCBQthY2N1bXVsYXRvcgkBDXBhcnNlSW50VmFsdWUBBQRuZXh0BQthY2N1bXVsYXRvcgQFbGlzdEYKAAIkbAUEbGlzdAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEIZmlsdGVyRm4CBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDIwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAQIbWF4SW5kZXgDCQBmAgkAkAMBBQVsaXN0RgAACQCWAwEFBWxpc3RGCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUEbGlzdAAABAxsYXN0TWludXRlSWQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUOa19sYXN0TWludXRlSWQAAAQWZW5kTGFzdEN1bXVsYXRpdmVQcmljZQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgUda190d2FwRGF0YUxhc3RDdW11bGF0aXZlUHJpY2UCAV8JAKQDAQUMbGFzdE1pbnV0ZUlkAAAEDGVuZExhc3RQcmljZQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgUTa190d2FwRGF0YUxhc3RQcmljZQIBXwkApAMBBQxsYXN0TWludXRlSWQAAAQSbm93Q3VtdWxhdGl2ZVByaWNlCQBkAgUWZW5kTGFzdEN1bXVsYXRpdmVQcmljZQkAaAIJAGUCBQhtaW51dGVJZAUMbGFzdE1pbnV0ZUlkBQxlbmRMYXN0UHJpY2UEGHN0YXJ0TGFzdEN1bXVsYXRpdmVQcmljZQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgUda190d2FwRGF0YUxhc3RDdW11bGF0aXZlUHJpY2UCAV8JAKQDAQUIbWF4SW5kZXgAAAQOc3RhcnRMYXN0UHJpY2UJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCsAgIFE2tfdHdhcERhdGFMYXN0UHJpY2UCAV8JAKQDAQUIbWF4SW5kZXgAAAQUc3RhcnRDdW11bGF0aXZlUHJpY2UJAGQCBRhzdGFydExhc3RDdW11bGF0aXZlUHJpY2UJAGgCCQBlAgUNc3RhcnRNaW51dGVJZAUIbWF4SW5kZXgFDnN0YXJ0TGFzdFByaWNlCQBpAgkAZQIFEm5vd0N1bXVsYXRpdmVQcmljZQUUc3RhcnRDdW11bGF0aXZlUHJpY2UFDVRXQVBfSU5URVJWQUwBE2dldFRlcm1pbmFsQW1tU3RhdGUABA1fcG9zaXRpb25TaXplCQERdG90YWxQb3NpdGlvblNpemUAAwkAAAIFDV9wb3NpdGlvblNpemUAAAkAlAoCCQEGcXRBc3RSAAkBBmJzQXN0UgAECWRpcmVjdGlvbgkAZgIFDV9wb3NpdGlvblNpemUAAAQNJHQwMzIwMjMzMjIwMgkBCnN3YXBPdXRwdXQDBQlkaXJlY3Rpb24JAQNhYnMBBQ1fcG9zaXRpb25TaXplBwQVY3VycmVudE5ldE1hcmtldFZhbHVlCAUNJHQwMzIwMjMzMjIwMgJfMQQZdGVybWluYWxRdW90ZUFzc2V0UmVzZXJ2ZQgFDSR0MDMyMDIzMzIyMDICXzIEGHRlcm1pbmFsQmFzZUFzc2V0UmVzZXJ2ZQgFDSR0MDMyMDIzMzIyMDICXzMJAJQKAgUZdGVybWluYWxRdW90ZUFzc2V0UmVzZXJ2ZQUYdGVybWluYWxCYXNlQXNzZXRSZXNlcnZlARNnZXRRdW90ZUFzc2V0V2VpZ2h0BBBiYXNlQXNzZXRSZXNlcnZlEXRvdGFsUG9zaXRpb25TaXplEXF1b3RlQXNzZXRSZXNlcnZlC3RhcmdldFByaWNlBAFiCQC2AgEFEGJhc2VBc3NldFJlc2VydmUEAnN6CQC2AgEFEXRvdGFsUG9zaXRpb25TaXplBAFxCQC2AgEFEXF1b3RlQXNzZXRSZXNlcnZlBAFwCQC2AgEFC3RhcmdldFByaWNlBAFrCQEFYm11bGQCBQFxBQFiBARuZXdCCQC3AgIFAWIFAnN6BARuZXdRCQEFYmRpdmQCBQFrBQRuZXdCBAF6CQEFYmRpdmQCBQRuZXdRBQRuZXdCBAZyZXN1bHQJAQViZGl2ZAIFAXAFAXoJAKADAQUGcmVzdWx0ARRnZXRTeW5jVGVybWluYWxQcmljZQMOX3Rlcm1pbmFsUHJpY2UHX3F0QXN0UgdfYnNBc3RSBA1fcG9zaXRpb25TaXplCQERdG90YWxQb3NpdGlvblNpemUAAwkAAAIFDV9wb3NpdGlvblNpemUAAAQJbmV3UXRBc3RXCQEEZGl2ZAIJAQRtdWxkAgUOX3Rlcm1pbmFsUHJpY2UFB19ic0FzdFIFB19xdEFzdFIJAJUKAwUJbmV3UXRBc3RXBQxERUNJTUFMX1VOSVQAAAQJZGlyZWN0aW9uCQBmAgUNX3Bvc2l0aW9uU2l6ZQAABBVjdXJyZW50TmV0TWFya2V0VmFsdWUICQEKc3dhcE91dHB1dAMFCWRpcmVjdGlvbgkBA2FicwEFDV9wb3NpdGlvblNpemUHAl8xBAluZXdRdEFzdFcJARNnZXRRdW90ZUFzc2V0V2VpZ2h0BAUHX2JzQXN0UgUNX3Bvc2l0aW9uU2l6ZQUHX3F0QXN0UgUOX3Rlcm1pbmFsUHJpY2UECW5ld0JzQXN0VwUMREVDSU1BTF9VTklUBA1tYXJnaW5Ub1ZhdWx0CAkBK2dldFBvc2l0aW9uTm90aW9uYWxBbmRVbnJlYWxpemVkUG5sQnlWYWx1ZXMHBQ1fcG9zaXRpb25TaXplBRVjdXJyZW50TmV0TWFya2V0VmFsdWUFB19xdEFzdFIFCW5ld1F0QXN0VwUHX2JzQXN0UgUJbmV3QnNBc3RXBQ9QTkxfT1BUSU9OX1NQT1QCXzIJAJUKAwUJbmV3UXRBc3RXBQluZXdCc0FzdFcFDW1hcmdpblRvVmF1bHQBCmdldEZ1bmRpbmcABA91bmRlcmx5aW5nUHJpY2UJAQ5nZXRPcmFjbGVQcmljZQAEDXNwb3RUd2FwUHJpY2UJARBnZXRUd2FwU3BvdFByaWNlAAQHcHJlbWl1bQkAZQIFDXNwb3RUd2FwUHJpY2UFD3VuZGVybHlpbmdQcmljZQMDAwkAAAIJARZ0b3RhbFNob3J0UG9zaXRpb25TaXplAAAABgkAAAIJARV0b3RhbExvbmdQb3NpdGlvblNpemUAAAAGCQEOaXNNYXJrZXRDbG9zZWQACQCUCgIAAAAAAwkAZgIAAAUHcHJlbWl1bQQUc2hvcnRQcmVtaXVtRnJhY3Rpb24JAQRkaXZkAgkBBG11bGQCBQdwcmVtaXVtCQEUZnVuZGluZ1BlcmlvZERlY2ltYWwABQdPTkVfREFZBBNsb25nUHJlbWl1bUZyYWN0aW9uCQEEZGl2ZAIJAQRtdWxkAgUUc2hvcnRQcmVtaXVtRnJhY3Rpb24JARZ0b3RhbFNob3J0UG9zaXRpb25TaXplAAkBFXRvdGFsTG9uZ1Bvc2l0aW9uU2l6ZQAJAJQKAgUUc2hvcnRQcmVtaXVtRnJhY3Rpb24FE2xvbmdQcmVtaXVtRnJhY3Rpb24EE2xvbmdQcmVtaXVtRnJhY3Rpb24JAQRkaXZkAgkBBG11bGQCBQdwcmVtaXVtCQEUZnVuZGluZ1BlcmlvZERlY2ltYWwABQdPTkVfREFZBBRzaG9ydFByZW1pdW1GcmFjdGlvbgkBBGRpdmQCCQEEbXVsZAIFE2xvbmdQcmVtaXVtRnJhY3Rpb24JARV0b3RhbExvbmdQb3NpdGlvblNpemUACQEWdG90YWxTaG9ydFBvc2l0aW9uU2l6ZQAJAJQKAgUUc2hvcnRQcmVtaXVtRnJhY3Rpb24FE2xvbmdQcmVtaXVtRnJhY3Rpb24BDmdldEFkanVzdGVkRmVlAgtfYXJ0aWZhY3RJZBBfYmFzZUZlZURpc2NvdW50BApiYXNlRmVlUmF3CQEDZmVlAAQHYmFzZUZlZQkBBG11bGQCBQpiYXNlRmVlUmF3BRBfYmFzZUZlZURpc2NvdW50BA0kdDAzNTA2MzM1NTU4AwkBAiE9AgULX2FydGlmYWN0SWQCAAQMYXJ0aWZhY3RLaW5kCQEEc3RyQQIJARFuZnRNYW5hZ2VyQWRkcmVzcwAJAQ50b0NvbXBvc2l0ZUtleQIFDGtfdG9rZW5fdHlwZQULX2FydGlmYWN0SWQDCQAAAgUMYXJ0aWZhY3RLaW5kBRhGRUVfUkVEVUNUSU9OX1RPS0VOX1RZUEUECXJlZHVjdGlvbgkBBGludEECCQERbmZ0TWFuYWdlckFkZHJlc3MACQEOdG9Db21wb3NpdGVLZXkCBQ1rX3Rva2VuX3BhcmFtBQtfYXJ0aWZhY3RJZAQLYWRqdXN0ZWRGZWUJAQRtdWxkAgUHYmFzZUZlZQUJcmVkdWN0aW9uCQCUCgIFC2FkanVzdGVkRmVlBgkAAgECGUludmFsaWQgYXR0YWNoZWQgYXJ0aWZhY3QJAJQKAgUHYmFzZUZlZQcEC2FkanVzdGVkRmVlCAUNJHQwMzUwNjMzNTU1OAJfMQQMYnVybkFydGlmYWN0CAUNJHQwMzUwNjMzNTU1OAJfMgkAlAoCBQthZGp1c3RlZEZlZQUMYnVybkFydGlmYWN0ARdpc1NhbWVBc3NldE9yTm9Qb3NpdGlvbgIHX3RyYWRlcghfYXNzZXRJZAQPb2xkUG9zaXRpb25TaXplCAkBC2dldFBvc2l0aW9uAQUHX3RyYWRlcgJfMQMJAAACBQ9vbGRQb3NpdGlvblNpemUAAAYJAAACCQEQZ2V0UG9zaXRpb25Bc3NldAEFB190cmFkZXIFCF9hc3NldElkAQtpc1NhbWVBc3NldAIHX3RyYWRlcghfYXNzZXRJZAkAAAIJARBnZXRQb3NpdGlvbkFzc2V0AQUHX3RyYWRlcgUIX2Fzc2V0SWQBHmdldEJvcnJvd2VkQnlUcmFkZXJJbk1hcmtldEtleQMEX2FtbQhfYXNzZXRJZAdfdHJhZGVyCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBSBrX3RyYWRlcl9tYXJrZXRfYXNzZXRfY29sbGF0ZXJhbAIBXwUEX2FtbQIBXwUIX2Fzc2V0SWQCAV8FB190cmFkZXIBE2dldEJvcnJvd2VkQnlUcmFkZXIBB190cmFkZXIEDXBvc2l0aW9uQXNzZXQJARBnZXRQb3NpdGlvbkFzc2V0AQUHX3RyYWRlcgMJAAACBQ1wb3NpdGlvbkFzc2V0CQDYBAEJAQpxdW90ZUFzc2V0AAkAlAoCAAAFDXBvc2l0aW9uQXNzZXQEA2tleQkBHmdldEJvcnJvd2VkQnlUcmFkZXJJbk1hcmtldEtleQMJAKUIAQUEdGhpcwUNcG9zaXRpb25Bc3NldAUHX3RyYWRlcgQGYm9ycm93CQELdmFsdWVPckVsc2UCCQCaCAIJARFjb2xsYXRlcmFsQWRkcmVzcwAFA2tleQAACQCUCgIFBmJvcnJvdwUNcG9zaXRpb25Bc3NldAEYZ2V0Rm9yVHJhZGVyV2l0aEFydGlmYWN0AgdfdHJhZGVyC19hcnRpZmFjdElkBBBkb0dldEZlZURpc2NvdW50CQD8BwQJAQxtaW5lckFkZHJlc3MAAhJjb21wdXRlRmVlRGlzY291bnQJAMwIAgUHX3RyYWRlcgUDbmlsBQNuaWwDCQAAAgUQZG9HZXRGZWVEaXNjb3VudAUQZG9HZXRGZWVEaXNjb3VudAQLZmVlRGlzY291bnQEByRtYXRjaDAFEGRvR2V0RmVlRGlzY291bnQDCQABAgUHJG1hdGNoMAIDSW50BAF4BQckbWF0Y2gwBQF4CQACAQIhSW52YWxpZCBjb21wdXRlRmVlRGlzY291bnQgcmVzdWx0BA0kdDAzNjc4OTM2ODYzCQEOZ2V0QWRqdXN0ZWRGZWUCBQtfYXJ0aWZhY3RJZAULZmVlRGlzY291bnQEC2FkanVzdGVkRmVlCAUNJHQwMzY3ODkzNjg2MwJfMQQMYnVybkFydGlmYWN0CAUNJHQwMzY3ODkzNjg2MwJfMgkAlAoCBQthZGp1c3RlZEZlZQUMYnVybkFydGlmYWN0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQ1nZXRBcnRpZmFjdElkAQFpBAphcnRpZmFjdElkAwkAZgIJAJADAQgFAWkIcGF5bWVudHMAAQkA2AQBCQETdmFsdWVPckVycm9yTWVzc2FnZQIICQCRAwIIBQFpCHBheW1lbnRzAAEHYXNzZXRJZAISSW52YWxpZCBhcnRpZmFjdElkAgAFCmFydGlmYWN0SWQBDWRpc3RyaWJ1dGVGZWUBCl9mZWVBbW91bnQEDGZlZVRvU3Rha2VycwkBBG11bGQCBQpfZmVlQW1vdW50CQETZmVlVG9TdGFrZXJzUGVyY2VudAAECmZlZVRvVmF1bHQJAGUCBQpfZmVlQW1vdW50BQxmZWVUb1N0YWtlcnMJAJQKAgUMZmVlVG9TdGFrZXJzBQpmZWVUb1ZhdWx0AQ51cGRhdGVTZXR0aW5ncwwQX2luaXRNYXJnaW5SYXRpbwRfbW1yFF9saXF1aWRhdGlvbkZlZVJhdGlvDl9mdW5kaW5nUGVyaW9kBF9mZWUMX3NwcmVhZExpbWl0D19tYXhQcmljZUltcGFjdBhfcGFydGlhbExpcXVpZGF0aW9uUmF0aW8PX21heFByaWNlU3ByZWFkEF9tYXhPcGVuTm90aW9uYWwUX2ZlZVRvU3Rha2Vyc1BlcmNlbnQPX21heE9yYWNsZURlbGF5CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRFrX2luaXRNYXJnaW5SYXRpbwUQX2luaXRNYXJnaW5SYXRpbwkAzAgCCQEMSW50ZWdlckVudHJ5AgUYa19tYWludGVuYW5jZU1hcmdpblJhdGlvBQRfbW1yCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRVrX2xpcXVpZGF0aW9uRmVlUmF0aW8FFF9saXF1aWRhdGlvbkZlZVJhdGlvCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ9rX2Z1bmRpbmdQZXJpb2QFDl9mdW5kaW5nUGVyaW9kCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQVrX2ZlZQUEX2ZlZQkAzAgCCQEMSW50ZWdlckVudHJ5AgUNa19zcHJlYWRMaW1pdAUMX3NwcmVhZExpbWl0CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRBrX21heFByaWNlSW1wYWN0BQ9fbWF4UHJpY2VJbXBhY3QJAMwIAgkBDEludGVnZXJFbnRyeQIFGWtfcGFydGlhbExpcXVpZGF0aW9uUmF0aW8FGF9wYXJ0aWFsTGlxdWlkYXRpb25SYXRpbwkAzAgCCQEMSW50ZWdlckVudHJ5AgUQa19tYXhQcmljZVNwcmVhZAUPX21heFByaWNlU3ByZWFkCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRFrX21heE9wZW5Ob3Rpb25hbAUQX21heE9wZW5Ob3Rpb25hbAkAzAgCCQEMSW50ZWdlckVudHJ5AgUVa19mZWVUb1N0YWtlcnNQZXJjZW50BRRfZmVlVG9TdGFrZXJzUGVyY2VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgUQa19tYXhPcmFjbGVEZWxheQUUX2ZlZVRvU3Rha2Vyc1BlcmNlbnQFA25pbAENdXBkYXRlRnVuZGluZwURX25leHRGdW5kaW5nQmxvY2skX2xhdGVzdExvbmdDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uJV9sYXRlc3RTaG9ydEN1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24QX2xvbmdGdW5kaW5nUmF0ZRFfc2hvcnRGdW5kaW5nUmF0ZQkAzAgCCQEMSW50ZWdlckVudHJ5AgUSa19uZXh0RnVuZGluZ0Jsb2NrBRFfbmV4dEZ1bmRpbmdCbG9jawkAzAgCCQEMSW50ZWdlckVudHJ5AgUla19sYXRlc3RMb25nQ3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgUkX2xhdGVzdExvbmdDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uCQDMCAIJAQxJbnRlZ2VyRW50cnkCBSZrX2xhdGVzdFNob3J0Q3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgUlX2xhdGVzdFNob3J0Q3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgkAzAgCCQEMSW50ZWdlckVudHJ5AgURa19sb25nRnVuZGluZ1JhdGUFEF9sb25nRnVuZGluZ1JhdGUJAMwIAgkBDEludGVnZXJFbnRyeQIFEmtfc2hvcnRGdW5kaW5nUmF0ZQURX3Nob3J0RnVuZGluZ1JhdGUFA25pbAETdXBkYXRlUG9zaXRpb25Bc3NldAIIX2FkZHJlc3MIX2Fzc2V0SWQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDnRvQ29tcG9zaXRlS2V5AgUPa19wb3NpdGlvbkFzc2V0BQhfYWRkcmVzcwUIX2Fzc2V0SWQFA25pbAEfaW5jcmVtZW50UG9zaXRpb25TZXF1ZW5jZU51bWJlcgIOX2lzTmV3UG9zaXRpb24IX2FkZHJlc3MDBQ5faXNOZXdQb3NpdGlvbgQPY3VycmVudFNlcXVlbmNlCQEMbGFzdFNlcXVlbmNlAAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBDnRvQ29tcG9zaXRlS2V5AgUSa19wb3NpdGlvblNlcXVlbmNlBQhfYWRkcmVzcwkAZAIFD2N1cnJlbnRTZXF1ZW5jZQABCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQprX3NlcXVlbmNlCQBkAgUPY3VycmVudFNlcXVlbmNlAAEFA25pbAUDbmlsARF1cGRhdGVQb3NpdGlvbkZlZQMOX2lzTmV3UG9zaXRpb24IX2FkZHJlc3MEX2ZlZQMFDl9pc05ld1Bvc2l0aW9uCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEOdG9Db21wb3NpdGVLZXkCBQ1rX3Bvc2l0aW9uRmVlBQhfYWRkcmVzcwUEX2ZlZQUDbmlsBQNuaWwBDnVwZGF0ZVBvc2l0aW9uBQhfYWRkcmVzcwVfc2l6ZQdfbWFyZ2luDV9vcGVuTm90aW9uYWwgX2xhdGVzdEN1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24JAMwIAgkBDEludGVnZXJFbnRyeQIJAQ50b0NvbXBvc2l0ZUtleQIFDmtfcG9zaXRpb25TaXplBQhfYWRkcmVzcwUFX3NpemUJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ50b0NvbXBvc2l0ZUtleQIFEGtfcG9zaXRpb25NYXJnaW4FCF9hZGRyZXNzBQdfbWFyZ2luCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEOdG9Db21wb3NpdGVLZXkCBRZrX3Bvc2l0aW9uT3Blbk5vdGlvbmFsBQhfYWRkcmVzcwUNX29wZW5Ob3Rpb25hbAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBDnRvQ29tcG9zaXRlS2V5AgUua19wb3NpdGlvbkxhc3RVcGRhdGVkQ3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgUIX2FkZHJlc3MFIF9sYXRlc3RDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uBQNuaWwBCmFwcGVuZFR3YXABBl9wcmljZQQIbWludXRlSWQJAGkCCQBpAggFCWxhc3RCbG9jawl0aW1lc3RhbXAA6AcAPAQQcHJldmlvdXNNaW51dGVJZAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQ5rX2xhc3RNaW51dGVJZAAAAwkAZgIFEHByZXZpb3VzTWludXRlSWQFCG1pbnV0ZUlkCQACAQIRVFdBUCBvdXQtb2Ytb3JkZXIEDGxhc3RNaW51dGVJZAMJAAACBRBwcmV2aW91c01pbnV0ZUlkAAAFCG1pbnV0ZUlkBRBwcmV2aW91c01pbnV0ZUlkAwkAZgIFCG1pbnV0ZUlkBRBwcmV2aW91c01pbnV0ZUlkBBNwcmV2Q3VtdWxhdGl2ZVByaWNlCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkArAICBR1rX3R3YXBEYXRhTGFzdEN1bXVsYXRpdmVQcmljZQIBXwkApAMBBRBwcmV2aW91c01pbnV0ZUlkAAAECXByZXZQcmljZQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgUTa190d2FwRGF0YUxhc3RQcmljZQIBXwkApAMBBRBwcmV2aW91c01pbnV0ZUlkBQZfcHJpY2UEE2xhc3RDdW11bGF0aXZlUHJpY2UJAGQCBRNwcmV2Q3VtdWxhdGl2ZVByaWNlCQBoAgkAZQIFCG1pbnV0ZUlkBQxsYXN0TWludXRlSWQFCXByZXZQcmljZQQEbGlzdAkBC3B1c2hUb1F1ZXVlAwkBCXN0clRvTGlzdAEJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwUNa19sYXN0RGF0YVN0cgIABQ1UV0FQX0lOVEVSVkFMCQCkAwEFCG1pbnV0ZUlkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEOdG9Db21wb3NpdGVLZXkCBR1rX3R3YXBEYXRhTGFzdEN1bXVsYXRpdmVQcmljZQkApAMBBQhtaW51dGVJZAUTbGFzdEN1bXVsYXRpdmVQcmljZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBDnRvQ29tcG9zaXRlS2V5AgUTa190d2FwRGF0YUxhc3RQcmljZQkApAMBBQhtaW51dGVJZAUGX3ByaWNlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEOdG9Db21wb3NpdGVLZXkCBRprX3R3YXBEYXRhUHJldmlvdXNNaW51dGVJZAkApAMBBQhtaW51dGVJZAUQcHJldmlvdXNNaW51dGVJZAkAzAgCCQEMSW50ZWdlckVudHJ5AgUOa19sYXN0TWludXRlSWQFCG1pbnV0ZUlkCQDMCAIJAQtTdHJpbmdFbnRyeQIFDWtfbGFzdERhdGFTdHIJAQlsaXN0VG9TdHIBBQRsaXN0BQNuaWwEGHR3YXBEYXRhUHJldmlvdXNNaW51dGVJZAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEOdG9Db21wb3NpdGVLZXkCBRprX3R3YXBEYXRhUHJldmlvdXNNaW51dGVJZAkApAMBBQhtaW51dGVJZAAABBNwcmV2Q3VtdWxhdGl2ZVByaWNlCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAQ50b0NvbXBvc2l0ZUtleQIFHWtfdHdhcERhdGFMYXN0Q3VtdWxhdGl2ZVByaWNlCQCkAwEFGHR3YXBEYXRhUHJldmlvdXNNaW51dGVJZAAABAlwcmV2UHJpY2UJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBDnRvQ29tcG9zaXRlS2V5AgUTa190d2FwRGF0YUxhc3RQcmljZQkApAMBBRh0d2FwRGF0YVByZXZpb3VzTWludXRlSWQFBl9wcmljZQQTbGFzdEN1bXVsYXRpdmVQcmljZQkAZAIFE3ByZXZDdW11bGF0aXZlUHJpY2UJAGgCCQBlAgUIbWludXRlSWQFGHR3YXBEYXRhUHJldmlvdXNNaW51dGVJZAUJcHJldlByaWNlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEOdG9Db21wb3NpdGVLZXkCBR1rX3R3YXBEYXRhTGFzdEN1bXVsYXRpdmVQcmljZQkApAMBBQhtaW51dGVJZAUTbGFzdEN1bXVsYXRpdmVQcmljZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBDnRvQ29tcG9zaXRlS2V5AgUTa190d2FwRGF0YUxhc3RQcmljZQkApAMBBQhtaW51dGVJZAUGX3ByaWNlBQNuaWwBEXVwZGF0ZUFtbVJlc2VydmVzAgdfcXRBc3RSB19ic0FzdFIJAMwIAgkBDEludGVnZXJFbnRyeQIFE2tfcXVvdGVBc3NldFJlc2VydmUFB19xdEFzdFIJAMwIAgkBDEludGVnZXJFbnRyeQIFEmtfYmFzZUFzc2V0UmVzZXJ2ZQUHX2JzQXN0UgUDbmlsARB1cGRhdGVBbW1XZWlnaHRzAgdfcXRBc3RXB19ic0FzdFcJAMwIAgkBDEludGVnZXJFbnRyeQIFEmtfcXVvdGVBc3NldFdlaWdodAUHX3F0QXN0VwkAzAgCCQEMSW50ZWdlckVudHJ5AgURa19iYXNlQXNzZXRXZWlnaHQFB19ic0FzdFcFA25pbAEJdXBkYXRlQW1tCAdfcXRBc3RSB19ic0FzdFIXX3RvdGFsUG9zaXRpb25TaXplQWZ0ZXIVX29wZW5JbnRlcmVzdE5vdGlvbmFsFl90b3RhbExvbmdQb3NpdGlvblNpemUXX3RvdGFsU2hvcnRQb3NpdGlvblNpemUWX3RvdGFsTG9uZ09wZW5Ob3Rpb25hbBdfdG90YWxTaG9ydE9wZW5Ob3Rpb25hbAQHX3F0QXN0VwkBBnF0QXN0VwAEB19ic0FzdFcJAQZic0FzdFcAAwkBAiE9AgkAZQIFFl90b3RhbExvbmdQb3NpdGlvblNpemUFF190b3RhbFNob3J0UG9zaXRpb25TaXplBRdfdG90YWxQb3NpdGlvblNpemVBZnRlcgkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAhhJbnZhbGlkIEFNTSBzdGF0ZSBkYXRhOiAJAKQDAQUWX3RvdGFsTG9uZ1Bvc2l0aW9uU2l6ZQIEICsgIAkApAMBBRdfdG90YWxTaG9ydFBvc2l0aW9uU2l6ZQIEICE9IAkApAMBBRdfdG90YWxQb3NpdGlvblNpemVBZnRlcgkAzggCCQDOCAIJARF1cGRhdGVBbW1SZXNlcnZlcwIFB19xdEFzdFIFB19ic0FzdFIJAMwIAgkBDEludGVnZXJFbnRyeQIFE2tfdG90YWxQb3NpdGlvblNpemUFF190b3RhbFBvc2l0aW9uU2l6ZUFmdGVyCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRZrX29wZW5JbnRlcmVzdE5vdGlvbmFsBRVfb3BlbkludGVyZXN0Tm90aW9uYWwJAMwIAgkBDEludGVnZXJFbnRyeQIFF2tfdG90YWxMb25nUG9zaXRpb25TaXplBRZfdG90YWxMb25nUG9zaXRpb25TaXplCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRhrX3RvdGFsU2hvcnRQb3NpdGlvblNpemUFF190b3RhbFNob3J0UG9zaXRpb25TaXplCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRJrX29wZW5JbnRlcmVzdExvbmcFFl90b3RhbExvbmdPcGVuTm90aW9uYWwJAMwIAgkBDEludGVnZXJFbnRyeQIFE2tfb3BlbkludGVyZXN0U2hvcnQFF190b3RhbFNob3J0T3Blbk5vdGlvbmFsBQNuaWwJAQphcHBlbmRUd2FwAQkBBGRpdmQCCQEEbXVsZAIFB19xdEFzdFIFB19xdEFzdFcJAQRtdWxkAgUHX2JzQXN0UgUHX2JzQXN0VwEOZGVsZXRlUG9zaXRpb24BCF9hZGRyZXNzCQDMCAIJAQtEZWxldGVFbnRyeQEJAQ50b0NvbXBvc2l0ZUtleQIFDmtfcG9zaXRpb25TaXplBQhfYWRkcmVzcwkAzAgCCQELRGVsZXRlRW50cnkBCQEOdG9Db21wb3NpdGVLZXkCBRBrX3Bvc2l0aW9uTWFyZ2luBQhfYWRkcmVzcwkAzAgCCQELRGVsZXRlRW50cnkBCQEOdG9Db21wb3NpdGVLZXkCBRZrX3Bvc2l0aW9uT3Blbk5vdGlvbmFsBQhfYWRkcmVzcwkAzAgCCQELRGVsZXRlRW50cnkBCQEOdG9Db21wb3NpdGVLZXkCBS5rX3Bvc2l0aW9uTGFzdFVwZGF0ZWRDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uBQhfYWRkcmVzcwkAzAgCCQELRGVsZXRlRW50cnkBCQEOdG9Db21wb3NpdGVLZXkCBQ9rX3Bvc2l0aW9uQXNzZXQFCF9hZGRyZXNzBQNuaWwBCHdpdGhkcmF3AghfYWRkcmVzcwdfYW1vdW50BAdiYWxhbmNlCQDwBwIFBHRoaXMJAQpxdW90ZUFzc2V0AAMJAGYCBQdfYW1vdW50BQdiYWxhbmNlCQACAQkArAICCQCsAgIJAKwCAgITVW5hYmxlIHRvIHdpdGhkcmF3IAkApAMBBQdfYW1vdW50AhcgZnJvbSBjb250cmFjdCBiYWxhbmNlIAkApAMBBQdiYWxhbmNlCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFCF9hZGRyZXNzBQdfYW1vdW50CQEKcXVvdGVBc3NldAAFA25pbAENdXBkYXRlQmFsYW5jZQEBaQMJAGYCAAAFAWkJAAIBAgdCYWxhbmNlCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQlrX2JhbGFuY2UFAWkFA25pbAELdHJhbnNmZXJGZWUBAWkJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBDnN0YWtpbmdBZGRyZXNzAAUBaQkBCnF1b3RlQXNzZXQABQNuaWwBDmRvQnVybkFydGlmYWN0Ag1fYnVybkFydGlmYWN0AWkDBQ1fYnVybkFydGlmYWN0CQDMCAIJAQRCdXJuAgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCAkAkQMCCAUBaQhwYXltZW50cwABB2Fzc2V0SWQCEEludmFsaWQgYXJ0aWZhY3QAAQUDbmlsBQNuaWwWAWkBBXBhdXNlAAMJAQIhPQIIBQFpBmNhbGxlcgkBDGFkbWluQWRkcmVzcwAJAAIBAhRJbnZhbGlkIHBhdXNlIHBhcmFtcwkAzAgCCQEMQm9vbGVhbkVudHJ5AgUIa19wYXVzZWQGBQNuaWwBaQEHdW5wYXVzZQADCQECIT0CCAUBaQZjYWxsZXIJAQxhZG1pbkFkZHJlc3MACQACAQIWSW52YWxpZCB1bnBhdXNlIHBhcmFtcwkAzAgCCQEMQm9vbGVhbkVudHJ5AgUIa19wYXVzZWQHBQNuaWwBaQEMc2V0Q2xvc2VPbmx5AAMJAQIhPQIIBQFpBmNhbGxlcgkBDGFkbWluQWRkcmVzcwAJAAIBAhtJbnZhbGlkIHNldENsb3NlT25seSBwYXJhbXMJAMwIAgkBDEJvb2xlYW5FbnRyeQIFC2tfY2xvc2VPbmx5BgUDbmlsAWkBDnVuc2V0Q2xvc2VPbmx5AAMJAQIhPQIIBQFpBmNhbGxlcgkBDGFkbWluQWRkcmVzcwAJAAIBAh1JbnZhbGlkIHVuc2V0Q2xvc2VPbmx5IHBhcmFtcwkAzAgCCQEMQm9vbGVhbkVudHJ5AgULa19jbG9zZU9ubHkHBQNuaWwBaQEMYWRkTGlxdWlkaXR5ARFfcXVvdGVBc3NldEFtb3VudAMDCQECIT0CCAUBaQZjYWxsZXIJAQxhZG1pbkFkZHJlc3MABgkAZwIAAAURX3F1b3RlQXNzZXRBbW91bnQJAAIBAhtJbnZhbGlkIGFkZExpcXVpZGl0eSBwYXJhbXMEB19xdEFzdFIJAQZxdEFzdFIABAdfYnNBc3RSCQEGYnNBc3RSAAQHX3F0QXN0VwkBBnF0QXN0VwAEB19ic0FzdFcJAQZic0FzdFcABAVwcmljZQkBBGRpdmQCCQEEbXVsZAIFB19xdEFzdFIFB19xdEFzdFcJAQRtdWxkAgUHX2JzQXN0UgUHX2JzQXN0VwQLcXRBc3RSQWZ0ZXIJAGQCBQdfcXRBc3RSBRFfcXVvdGVBc3NldEFtb3VudAQUYmFzZUFzc2V0QW1vdW50VG9BZGQJAGUCCQEEZGl2ZAIJAQRtdWxkAgULcXRBc3RSQWZ0ZXIFB19xdEFzdFcFBXByaWNlBQdfYnNBc3RSBAtic0FzdFJBZnRlcgkAZAIFB19ic0FzdFIFFGJhc2VBc3NldEFtb3VudFRvQWRkBA0kdDA0NjEwNzQ2MjU4CQEUZ2V0U3luY1Rlcm1pbmFsUHJpY2UDCQEOZ2V0T3JhY2xlUHJpY2UABQtxdEFzdFJBZnRlcgULYnNBc3RSQWZ0ZXIEE25ld1F1b3RlQXNzZXRXZWlnaHQIBQ0kdDA0NjEwNzQ2MjU4Al8xBBJuZXdCYXNlQXNzZXRXZWlnaHQIBQ0kdDA0NjEwNzQ2MjU4Al8yBA1tYXJnaW5Ub1ZhdWx0CAUNJHQwNDYxMDc0NjI1OAJfMwQNZG9FeGNoYW5nZVBuTAMJAQIhPQIFDW1hcmdpblRvVmF1bHQAAAQNZG9FeGNoYW5nZVBuTAkA/AcECQEMdmF1bHRBZGRyZXNzAAIVZXhjaGFuZ2VGcmVlQW5kTG9ja2VkCQDMCAIFDW1hcmdpblRvVmF1bHQFA25pbAUDbmlsAwkAAAIFDWRvRXhjaGFuZ2VQbkwFDWRvRXhjaGFuZ2VQbkwFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgUDbmlsAwkAAAIFDWRvRXhjaGFuZ2VQbkwFDWRvRXhjaGFuZ2VQbkwJAM4IAgkBEXVwZGF0ZUFtbVJlc2VydmVzAgULcXRBc3RSQWZ0ZXIFC2JzQXN0UkFmdGVyCQEQdXBkYXRlQW1tV2VpZ2h0cwIFE25ld1F1b3RlQXNzZXRXZWlnaHQFEm5ld0Jhc2VBc3NldFdlaWdodAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQ9yZW1vdmVMaXF1aWRpdHkBEV9xdW90ZUFzc2V0QW1vdW50AwMJAQIhPQIIBQFpBmNhbGxlcgkBDGFkbWluQWRkcmVzcwAGCQBnAgURX3F1b3RlQXNzZXRBbW91bnQAAAkAAgECHkludmFsaWQgcmVtb3ZlTGlxdWlkaXR5IHBhcmFtcwQHX3F0QXN0UgkBBnF0QXN0UgAEB19ic0FzdFIJAQZic0FzdFIABAdfcXRBc3RXCQEGcXRBc3RXAAQHX2JzQXN0VwkBBmJzQXN0VwAEBXByaWNlCQEEZGl2ZAIJAQRtdWxkAgUHX3F0QXN0UgUHX3F0QXN0VwkBBG11bGQCBQdfYnNBc3RSBQdfYnNBc3RXBAtxdEFzdFJBZnRlcgkAZQIFB19xdEFzdFIFEV9xdW90ZUFzc2V0QW1vdW50BBdiYXNlQXNzZXRBbW91bnRUb1JlbW92ZQkBA2FicwEJAGUCCQEEZGl2ZAIJAQRtdWxkAgULcXRBc3RSQWZ0ZXIFB19xdEFzdFcFBXByaWNlBQdfYnNBc3RSBAtic0FzdFJBZnRlcgkAZQIFB19ic0FzdFIFF2Jhc2VBc3NldEFtb3VudFRvUmVtb3ZlBA0kdDA0NzE5MDQ3MzQxCQEUZ2V0U3luY1Rlcm1pbmFsUHJpY2UDCQEOZ2V0T3JhY2xlUHJpY2UABQtxdEFzdFJBZnRlcgULYnNBc3RSQWZ0ZXIEE25ld1F1b3RlQXNzZXRXZWlnaHQIBQ0kdDA0NzE5MDQ3MzQxAl8xBBJuZXdCYXNlQXNzZXRXZWlnaHQIBQ0kdDA0NzE5MDQ3MzQxAl8yBA1tYXJnaW5Ub1ZhdWx0CAUNJHQwNDcxOTA0NzM0MQJfMwQNZG9FeGNoYW5nZVBuTAMJAQIhPQIFDW1hcmdpblRvVmF1bHQAAAQNZG9FeGNoYW5nZVBuTAkA/AcECQEMdmF1bHRBZGRyZXNzAAIVZXhjaGFuZ2VGcmVlQW5kTG9ja2VkCQDMCAIFDW1hcmdpblRvVmF1bHQFA25pbAUDbmlsAwkAAAIFDWRvRXhjaGFuZ2VQbkwFDWRvRXhjaGFuZ2VQbkwFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgUDbmlsAwkAAAIFDWRvRXhjaGFuZ2VQbkwFDWRvRXhjaGFuZ2VQbkwJAM4IAgkBEXVwZGF0ZUFtbVJlc2VydmVzAgULcXRBc3RSQWZ0ZXIFC2JzQXN0UkFmdGVyCQEQdXBkYXRlQW1tV2VpZ2h0cwIFE25ld1F1b3RlQXNzZXRXZWlnaHQFEm5ld0Jhc2VBc3NldFdlaWdodAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQ5jaGFuZ2VTZXR0aW5ncwwQX2luaXRNYXJnaW5SYXRpbwRfbW1yFF9saXF1aWRhdGlvbkZlZVJhdGlvDl9mdW5kaW5nUGVyaW9kBF9mZWUMX3NwcmVhZExpbWl0D19tYXhQcmljZUltcGFjdBhfcGFydGlhbExpcXVpZGF0aW9uUmF0aW8PX21heFByaWNlU3ByZWFkEF9tYXhPcGVuTm90aW9uYWwUX2ZlZVRvU3Rha2Vyc1BlcmNlbnQPX21heE9yYWNsZURlbGF5AwkBAiE9AggFAWkGY2FsbGVyCQEMYWRtaW5BZGRyZXNzAAkAAgECHUludmFsaWQgY2hhbmdlU2V0dGluZ3MgcGFyYW1zCQEOdXBkYXRlU2V0dGluZ3MMBRBfaW5pdE1hcmdpblJhdGlvBQRfbW1yBRRfbGlxdWlkYXRpb25GZWVSYXRpbwUOX2Z1bmRpbmdQZXJpb2QFBF9mZWUFDF9zcHJlYWRMaW1pdAUPX21heFByaWNlSW1wYWN0BRhfcGFydGlhbExpcXVpZGF0aW9uUmF0aW8FD19tYXhQcmljZVNwcmVhZAUQX21heE9wZW5Ob3Rpb25hbAUUX2ZlZVRvU3Rha2Vyc1BlcmNlbnQFD19tYXhPcmFjbGVEZWxheQFpAQppbml0aWFsaXplEgdfcXRBc3RSB19ic0FzdFIOX2Z1bmRpbmdQZXJpb2QQX2luaXRNYXJnaW5SYXRpbwRfbW1yFF9saXF1aWRhdGlvbkZlZVJhdGlvBF9mZWUHX29yYWNsZQpfb3JhY2xlS2V5D19vcmFjbGVCbG9ja0tleQxfY29vcmRpbmF0b3IMX3NwcmVhZExpbWl0D19tYXhQcmljZUltcGFjdBhfcGFydGlhbExpcXVpZGF0aW9uUmF0aW8PX21heFByaWNlU3ByZWFkEF9tYXhPcGVuTm90aW9uYWwUX2ZlZVRvU3Rha2Vyc1BlcmNlbnQPX21heE9yYWNsZURlbGF5AwMDAwMDAwMDAwMDAwMDAwkAZwIAAAUHX3F0QXN0UgYJAGcCAAAFB19ic0FzdFIGCQBnAgAABQ5fZnVuZGluZ1BlcmlvZAYJAGcCAAAFEF9pbml0TWFyZ2luUmF0aW8GCQBnAgAABQRfbW1yBgkAZwIAAAUUX2xpcXVpZGF0aW9uRmVlUmF0aW8GCQBnAgAABQRfZmVlBgkAZwIAAAUMX3NwcmVhZExpbWl0BgkAZwIAAAUPX21heFByaWNlSW1wYWN0BgkAZwIAAAUYX3BhcnRpYWxMaXF1aWRhdGlvblJhdGlvBgkAZwIAAAUPX21heFByaWNlU3ByZWFkBgkAZwIAAAUQX21heE9wZW5Ob3Rpb25hbAYJAGcCAAAFFF9mZWVUb1N0YWtlcnNQZXJjZW50BgkAZgIFFF9mZWVUb1N0YWtlcnNQZXJjZW50BQxERUNJTUFMX1VOSVQGCQBnAgAABQ9fbWF4T3JhY2xlRGVsYXkGCQELaW5pdGlhbGl6ZWQACQACAQIdSW52YWxpZCBpbml0aWFsaXplIHBhcmFtZXRlcnMJAM4IAgkAzggCCQDOCAIJAM4IAgkBCXVwZGF0ZUFtbQgFB19xdEFzdFIFB19ic0FzdFIAAAAAAAAAAAAAAAAJAQ51cGRhdGVTZXR0aW5ncwwFEF9pbml0TWFyZ2luUmF0aW8FBF9tbXIFFF9saXF1aWRhdGlvbkZlZVJhdGlvBQ5fZnVuZGluZ1BlcmlvZAUEX2ZlZQUMX3NwcmVhZExpbWl0BQ9fbWF4UHJpY2VJbXBhY3QFGF9wYXJ0aWFsTGlxdWlkYXRpb25SYXRpbwUPX21heFByaWNlU3ByZWFkBRBfbWF4T3Blbk5vdGlvbmFsBRRfZmVlVG9TdGFrZXJzUGVyY2VudAUPX21heE9yYWNsZURlbGF5CQENdXBkYXRlRnVuZGluZwUJAGQCCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAUOX2Z1bmRpbmdQZXJpb2QAAAAAAAAAAAkBDXVwZGF0ZUJhbGFuY2UBAAAJAMwIAgkBDEJvb2xlYW5FbnRyeQIFDWtfaW5pdGlhbGl6ZWQGCQDMCAIJAQtTdHJpbmdFbnRyeQIFBWtfb3JhBQdfb3JhY2xlCQDMCAIJAQtTdHJpbmdFbnRyeQIFCWtfb3JhX2tleQUKX29yYWNsZUtleQkAzAgCCQELU3RyaW5nRW50cnkCBQ9rX29yYV9ibG9ja19rZXkFD19vcmFjbGVCbG9ja0tleQkAzAgCCQELU3RyaW5nRW50cnkCBRRrX2Nvb3JkaW5hdG9yQWRkcmVzcwUMX2Nvb3JkaW5hdG9yBQNuaWwBaQEQaW5jcmVhc2VQb3NpdGlvbgQKX2RpcmVjdGlvbglfbGV2ZXJhZ2UTX21pbkJhc2VBc3NldEFtb3VudAhfcmVmTGluawQEc3luYwkA/AcEBQR0aGlzAhlzeW5jVGVybWluYWxQcmljZVRvT3JhY2xlBQNuaWwFA25pbAMJAAACBQRzeW5jBQRzeW5jBAdfdHJhZGVyCQEPZ2V0QWN0dWFsQ2FsbGVyAQUBaQQKX3Jhd0Ftb3VudAgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQECF9hc3NldElkCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQEC19hc3NldElkU3RyCQDYBAEJAQV2YWx1ZQEFCF9hc3NldElkBAxpc1F1b3RlQXNzZXQJAAACBQhfYXNzZXRJZAkBCnF1b3RlQXNzZXQABBFpc0NvbGxhdGVyYWxBc3NldAkBEGlzV2hpdGVsaXN0QXNzZXQBBQtfYXNzZXRJZFN0cgMDAwMDAwMDAwMJAQIhPQIFCl9kaXJlY3Rpb24FCERJUl9MT05HCQECIT0CBQpfZGlyZWN0aW9uBQlESVJfU0hPUlQHBgkAZwIAAAUKX3Jhd0Ftb3VudAYJAQEhAQkBC2luaXRpYWxpemVkAAYDCQEBIQEFDGlzUXVvdGVBc3NldAkBASEBBRFpc0NvbGxhdGVyYWxBc3NldAcGCQEBIQEJARdpc1NhbWVBc3NldE9yTm9Qb3NpdGlvbgIFB190cmFkZXIFC19hc3NldElkU3RyBgkBASEBCQEWcmVxdWlyZU1vcmVNYXJnaW5SYXRpbwMJAQRkaXZkAgUMREVDSU1BTF9VTklUBQlfbGV2ZXJhZ2UJAQ9pbml0TWFyZ2luUmF0aW8ABgYJAQZwYXVzZWQABgkBCWNsb3NlT25seQAGCQEOaXNNYXJrZXRDbG9zZWQACQACAQIjSW52YWxpZCBpbmNyZWFzZVBvc2l0aW9uIHBhcmFtZXRlcnMEDSR0MDUxMDA5NTExNTgJARhnZXRGb3JUcmFkZXJXaXRoQXJ0aWZhY3QCBQdfdHJhZGVyCQENZ2V0QXJ0aWZhY3RJZAEFAWkEC2FkanVzdGVkRmVlCAUNJHQwNTEwMDk1MTE1OAJfMQQMYnVybkFydGlmYWN0CAUNJHQwNTEwMDk1MTE1OAJfMgQHX2Ftb3VudAkBBGRpdmQCBQpfcmF3QW1vdW50CQBkAgkBBG11bGQCBQthZGp1c3RlZEZlZQUJX2xldmVyYWdlBQxERUNJTUFMX1VOSVQEDHJhd0ZlZUFtb3VudAkAZQIFCl9yYXdBbW91bnQFB19hbW91bnQEE2Rpc3RyaWJ1dGVGZWVBbW91bnQDBRFpc0NvbGxhdGVyYWxBc3NldAQIZG9Cb3Jyb3cJAPwHBAkBEWNvbGxhdGVyYWxBZGRyZXNzAAIGYm9ycm93CQDMCAIFB190cmFkZXIFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUIX2Fzc2V0SWQFB19hbW91bnQFA25pbAMJAAACBQhkb0JvcnJvdwUIZG9Cb3Jyb3cEDWJhbGFuY2VCZWZvcmUJAPAHAgUEdGhpcwkBCnF1b3RlQXNzZXQAAwkAAAIFDWJhbGFuY2VCZWZvcmUFDWJhbGFuY2VCZWZvcmUEBmRvU3dhcAkA/AcECQELc3dhcEFkZHJlc3MAAgRzd2FwCQDMCAIJANgEAQkBCnF1b3RlQXNzZXQACQDMCAIAAAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQhfYXNzZXRJZAUMcmF3RmVlQW1vdW50BQNuaWwDCQAAAgUGZG9Td2FwBQZkb1N3YXAEDGJhbGFuY2VBZnRlcgkA8AcCBQR0aGlzCQEKcXVvdGVBc3NldAADCQAAAgUMYmFsYW5jZUFmdGVyBQxiYWxhbmNlQWZ0ZXIED2V4Y2hhbmdlZEFtb3VudAkAZQIFDGJhbGFuY2VBZnRlcgUNYmFsYW5jZUJlZm9yZQMJAAACBQ9leGNoYW5nZWRBbW91bnQFD2V4Y2hhbmdlZEFtb3VudAUPZXhjaGFuZ2VkQW1vdW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBQxyYXdGZWVBbW91bnQDCQAAAgUTZGlzdHJpYnV0ZUZlZUFtb3VudAUTZGlzdHJpYnV0ZUZlZUFtb3VudAQOcmVmZXJyZXJGZWVBbnkJAPwHBAkBD3JlZmVycmFsQWRkcmVzcwACFWFjY2VwdFBheW1lbnRXaXRoTGluawkAzAgCBQdfdHJhZGVyCQDMCAIFCF9yZWZMaW5rBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQpxdW90ZUFzc2V0AAUTZGlzdHJpYnV0ZUZlZUFtb3VudAUDbmlsAwkAAAIFDnJlZmVycmVyRmVlQW55BQ5yZWZlcnJlckZlZUFueQQLcmVmZXJyZXJGZWUEByRtYXRjaDAFDnJlZmVycmVyRmVlQW55AwkAAQIFByRtYXRjaDACA0ludAQBeAUHJG1hdGNoMAUBeAkAAgECE0ludmFsaWQgcmVmZXJyZXJGZWUECWZlZUFtb3VudAkAZQIFE2Rpc3RyaWJ1dGVGZWVBbW91bnQFC3JlZmVycmVyRmVlBA0kdDA1MjUwMDUyNjQwCQELZ2V0UG9zaXRpb24BBQdfdHJhZGVyBA9vbGRQb3NpdGlvblNpemUIBQ0kdDA1MjUwMDUyNjQwAl8xBBFvbGRQb3NpdGlvbk1hcmdpbggFDSR0MDUyNTAwNTI2NDACXzIEF29sZFBvc2l0aW9uT3Blbk5vdGlvbmFsCAUNJHQwNTI1MDA1MjY0MAJfMwQUb2xkUG9zaXRpb25Mc3RVcGRDUEYIBQ0kdDA1MjUwMDUyNjQwAl80BA1pc05ld1Bvc2l0aW9uCQAAAgUPb2xkUG9zaXRpb25TaXplAAAED2lzU2FtZURpcmVjdGlvbgMJAGYCBQ9vbGRQb3NpdGlvblNpemUAAAkAAAIFCl9kaXJlY3Rpb24FCERJUl9MT05HCQAAAgUKX2RpcmVjdGlvbgUJRElSX1NIT1JUBA5leHBhbmRFeGlzdGluZwMJAQEhAQUNaXNOZXdQb3NpdGlvbgUPaXNTYW1lRGlyZWN0aW9uBwQFaXNBZGQJAAACBQpfZGlyZWN0aW9uBQhESVJfTE9ORwQNJHQwNTI5Mjk1NTg5MQMDBQ1pc05ld1Bvc2l0aW9uBgUOZXhwYW5kRXhpc3RpbmcEDG9wZW5Ob3Rpb25hbAkBBG11bGQCBQdfYW1vdW50BQlfbGV2ZXJhZ2UEDSR0MDUzMzkxNTM1NjQJAQlzd2FwSW5wdXQCBQVpc0FkZAUMb3Blbk5vdGlvbmFsBBVhbW91bnRCYXNlQXNzZXRCb3VnaHQIBQ0kdDA1MzM5MTUzNTY0Al8xBBZxdW90ZUFzc2V0UmVzZXJ2ZUFmdGVyCAUNJHQwNTMzOTE1MzU2NAJfMgQVYmFzZUFzc2V0UmVzZXJ2ZUFmdGVyCAUNJHQwNTMzOTE1MzU2NAJfMwQWdG90YWxQb3NpdGlvblNpemVBZnRlcggFDSR0MDUzMzkxNTM1NjQCXzQDAwkBAiE9AgUTX21pbkJhc2VBc3NldEFtb3VudAAACQBmAgUTX21pbkJhc2VBc3NldEFtb3VudAkBA2FicwEFFWFtb3VudEJhc2VBc3NldEJvdWdodAcJAAIBCQCsAgIJAKwCAgkArAICAg1MaW1pdCBlcnJvcjogCQCkAwEJAQNhYnMBBRVhbW91bnRCYXNlQXNzZXRCb3VnaHQCAyA8IAkApAMBBRNfbWluQmFzZUFzc2V0QW1vdW50BA9uZXdQb3NpdGlvblNpemUJAGQCBQ9vbGRQb3NpdGlvblNpemUFFWFtb3VudEJhc2VBc3NldEJvdWdodAQadG90YWxMb25nT3BlbkludGVyZXN0QWZ0ZXIJAGQCCQEQb3BlbkludGVyZXN0TG9uZwADCQBmAgUPbmV3UG9zaXRpb25TaXplAAAFDG9wZW5Ob3Rpb25hbAAABBt0b3RhbFNob3J0T3BlbkludGVyZXN0QWZ0ZXIJAGQCCQERb3BlbkludGVyZXN0U2hvcnQAAwkAZgIAAAUPbmV3UG9zaXRpb25TaXplBQxvcGVuTm90aW9uYWwAAAQNJHQwNTQxMTA1NDMzMQkBImNhbGNSZW1haW5NYXJnaW5XaXRoRnVuZGluZ1BheW1lbnQEBQ9vbGRQb3NpdGlvblNpemUFEW9sZFBvc2l0aW9uTWFyZ2luBRRvbGRQb3NpdGlvbkxzdFVwZENQRgUHX2Ftb3VudAQMcmVtYWluTWFyZ2luCAUNJHQwNTQxMTA1NDMzMQJfMQQCeDEIBQ0kdDA1NDExMDU0MzMxAl8yBAJ4MggFDSR0MDU0MTEwNTQzMzECXzMDCQEBIQEJARlyZXF1aXJlTm90T3ZlclNwcmVhZExpbWl0AgUWcXVvdGVBc3NldFJlc2VydmVBZnRlcgUVYmFzZUFzc2V0UmVzZXJ2ZUFmdGVyCQACAQIVT3ZlciBtYXggc3ByZWFkIGxpbWl0AwkBASEBCQEdcmVxdWlyZU5vdE92ZXJNYXhPcGVuTm90aW9uYWwCBRp0b3RhbExvbmdPcGVuSW50ZXJlc3RBZnRlcgUbdG90YWxTaG9ydE9wZW5JbnRlcmVzdEFmdGVyCQACAQIWT3ZlciBtYXggb3BlbiBub3Rpb25hbAkAngoMBQ9uZXdQb3NpdGlvblNpemUFDHJlbWFpbk1hcmdpbgkAZAIFF29sZFBvc2l0aW9uT3Blbk5vdGlvbmFsBQxvcGVuTm90aW9uYWwJAR9sYXRlc3RDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uAQUPbmV3UG9zaXRpb25TaXplBRViYXNlQXNzZXRSZXNlcnZlQWZ0ZXIFFnF1b3RlQXNzZXRSZXNlcnZlQWZ0ZXIFFnRvdGFsUG9zaXRpb25TaXplQWZ0ZXIJAGQCCQEUb3BlbkludGVyZXN0Tm90aW9uYWwABQxvcGVuTm90aW9uYWwJAGQCCQEVdG90YWxMb25nUG9zaXRpb25TaXplAAMJAGYCBQ9uZXdQb3NpdGlvblNpemUAAAkBA2FicwEFFWFtb3VudEJhc2VBc3NldEJvdWdodAAACQBkAgkBFnRvdGFsU2hvcnRQb3NpdGlvblNpemUAAwkAZgIAAAUPbmV3UG9zaXRpb25TaXplCQEDYWJzAQUVYW1vdW50QmFzZUFzc2V0Qm91Z2h0AAAFGnRvdGFsTG9uZ09wZW5JbnRlcmVzdEFmdGVyBRt0b3RhbFNob3J0T3BlbkludGVyZXN0QWZ0ZXIEDG9wZW5Ob3Rpb25hbAkBBG11bGQCBQdfYW1vdW50BQlfbGV2ZXJhZ2UEDSR0MDU1NTkxNTU3MDcJASNnZXRQb3NpdGlvbk5vdGlvbmFsQW5kVW5yZWFsaXplZFBubAIJAKUIAQgFAWkGY2FsbGVyBQ9QTkxfT1BUSU9OX1NQT1QEE29sZFBvc2l0aW9uTm90aW9uYWwIBQ0kdDA1NTU5MTU1NzA3Al8xBA11bnJlYWxpemVkUG5sCAUNJHQwNTU1OTE1NTcwNwJfMgMJAGYCBRNvbGRQb3NpdGlvbk5vdGlvbmFsBQxvcGVuTm90aW9uYWwJAAIBAi5Vc2UgZGVjcmVhc2VQb3NpdGlvbiB0byBkZWNyZWFzZSBwb3NpdGlvbiBzaXplCQACAQIUQ2xvc2UgcG9zaXRpb24gZmlyc3QED25ld1Bvc2l0aW9uU2l6ZQgFDSR0MDUyOTI5NTU4OTECXzEEF25ld1Bvc2l0aW9uUmVtYWluTWFyZ2luCAUNJHQwNTI5Mjk1NTg5MQJfMgQXbmV3UG9zaXRpb25PcGVuTm90aW9uYWwIBQ0kdDA1MjkyOTU1ODkxAl8zBBRuZXdQb3NpdGlvbkxhdGVzdENQRggFDSR0MDUyOTI5NTU4OTECXzQEFWJhc2VBc3NldFJlc2VydmVBZnRlcggFDSR0MDUyOTI5NTU4OTECXzUEFnF1b3RlQXNzZXRSZXNlcnZlQWZ0ZXIIBQ0kdDA1MjkyOTU1ODkxAl82BBZ0b3RhbFBvc2l0aW9uU2l6ZUFmdGVyCAUNJHQwNTI5Mjk1NTg5MQJfNwQZb3BlbkludGVyZXN0Tm90aW9uYWxBZnRlcggFDSR0MDUyOTI5NTU4OTECXzgEDnRvdGFsTG9uZ0FmdGVyCAUNJHQwNTI5Mjk1NTg5MQJfOQQPdG90YWxTaG9ydEFmdGVyCAUNJHQwNTI5Mjk1NTg5MQNfMTAEGnRvdGFsTG9uZ09wZW5JbnRlcmVzdEFmdGVyCAUNJHQwNTI5Mjk1NTg5MQNfMTEEG3RvdGFsU2hvcnRPcGVuSW50ZXJlc3RBZnRlcggFDSR0MDUyOTI5NTU4OTEDXzEyBA0kdDA1NTg5NzU1OTU0CQENZGlzdHJpYnV0ZUZlZQEFCWZlZUFtb3VudAQMZmVlVG9TdGFrZXJzCAUNJHQwNTU4OTc1NTk1NAJfMQQKZmVlVG9WYXVsdAgFDSR0MDU1ODk3NTU5NTQCXzIEBXN0YWtlAwUMaXNRdW90ZUFzc2V0BAVzdGFrZQkA/AcECQEMdmF1bHRBZGRyZXNzAAIJYWRkTG9ja2VkCQDMCAIHBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQpxdW90ZUFzc2V0AAUHX2Ftb3VudAUDbmlsAwkAAAIFBXN0YWtlBQVzdGFrZQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBQNuaWwDCQAAAgUFc3Rha2UFBXN0YWtlBAxkZXBvc2l0VmF1bHQJAPwHBAkBDHZhdWx0QWRkcmVzcwACB2FkZEZyZWUFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBCnF1b3RlQXNzZXQABQpmZWVUb1ZhdWx0BQNuaWwDCQAAAgUMZGVwb3NpdFZhdWx0BQxkZXBvc2l0VmF1bHQECW5vdGlmeUZlZQkA/AcECQEMbWluZXJBZGRyZXNzAAIKbm90aWZ5RmVlcwkAzAgCBQdfdHJhZGVyCQDMCAIFCWZlZUFtb3VudAUDbmlsBQNuaWwDCQAAAgUJbm90aWZ5RmVlBQlub3RpZnlGZWUEDm5vdGlmeU5vdGlvbmFsCQD8BwQJAQxtaW5lckFkZHJlc3MAAg5ub3RpZnlOb3Rpb25hbAkAzAgCBQdfdHJhZGVyCQDMCAIFF25ld1Bvc2l0aW9uT3Blbk5vdGlvbmFsBQNuaWwFA25pbAMJAAACBQ5ub3RpZnlOb3Rpb25hbAUObm90aWZ5Tm90aW9uYWwJAM4IAgkAzggCCQDOCAIJAM4IAgkAzggCCQDOCAIJAM4IAgkBDnVwZGF0ZVBvc2l0aW9uBQUHX3RyYWRlcgUPbmV3UG9zaXRpb25TaXplBRduZXdQb3NpdGlvblJlbWFpbk1hcmdpbgUXbmV3UG9zaXRpb25PcGVuTm90aW9uYWwFFG5ld1Bvc2l0aW9uTGF0ZXN0Q1BGCQEfaW5jcmVtZW50UG9zaXRpb25TZXF1ZW5jZU51bWJlcgIFDWlzTmV3UG9zaXRpb24FB190cmFkZXIJARF1cGRhdGVQb3NpdGlvbkZlZQMFDWlzTmV3UG9zaXRpb24FB190cmFkZXIFC2FkanVzdGVkRmVlCQETdXBkYXRlUG9zaXRpb25Bc3NldAIFB190cmFkZXIFC19hc3NldElkU3RyCQEJdXBkYXRlQW1tCAUWcXVvdGVBc3NldFJlc2VydmVBZnRlcgUVYmFzZUFzc2V0UmVzZXJ2ZUFmdGVyBRZ0b3RhbFBvc2l0aW9uU2l6ZUFmdGVyBRlvcGVuSW50ZXJlc3ROb3Rpb25hbEFmdGVyBQ50b3RhbExvbmdBZnRlcgUPdG90YWxTaG9ydEFmdGVyBRp0b3RhbExvbmdPcGVuSW50ZXJlc3RBZnRlcgUbdG90YWxTaG9ydE9wZW5JbnRlcmVzdEFmdGVyCQELdHJhbnNmZXJGZWUBBQxmZWVUb1N0YWtlcnMJAQ11cGRhdGVCYWxhbmNlAQkAZAIJAQhjYmFsYW5jZQAFB19hbW91bnQJAQ5kb0J1cm5BcnRpZmFjdAIFDGJ1cm5BcnRpZmFjdAUBaQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQlhZGRNYXJnaW4ABARzeW5jCQD8BwQFBHRoaXMCGXN5bmNUZXJtaW5hbFByaWNlVG9PcmFjbGUFA25pbAUDbmlsAwkAAAIFBHN5bmMFBHN5bmMEB190cmFkZXIJAKUIAQgFAWkGY2FsbGVyBAdfYW1vdW50CAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAQIX2Fzc2V0SWQICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAQLX2Fzc2V0SWRTdHIJANgEAQkBBXZhbHVlAQUIX2Fzc2V0SWQEDGlzUXVvdGVBc3NldAkAAAIFCF9hc3NldElkCQEKcXVvdGVBc3NldAAEEWlzQ29sbGF0ZXJhbEFzc2V0CQEQaXNXaGl0ZWxpc3RBc3NldAEFC19hc3NldElkU3RyAwMDAwMDAwMJAQEhAQUMaXNRdW90ZUFzc2V0CQEBIQEFEWlzQ29sbGF0ZXJhbEFzc2V0BwYJAQEhAQkBE3JlcXVpcmVPcGVuUG9zaXRpb24BCQClCAEIBQFpBmNhbGxlcgYJAQEhAQkBC2lzU2FtZUFzc2V0AgUHX3RyYWRlcgULX2Fzc2V0SWRTdHIGCQEBIQEJAQtpbml0aWFsaXplZAAGCQEGcGF1c2VkAAYJAQljbG9zZU9ubHkABgkBDmlzTWFya2V0Q2xvc2VkAAkAAgECHEludmFsaWQgYWRkTWFyZ2luIHBhcmFtZXRlcnMEDSR0MDU3OTg1NTgxMjUJAQtnZXRQb3NpdGlvbgEFB190cmFkZXIED29sZFBvc2l0aW9uU2l6ZQgFDSR0MDU3OTg1NTgxMjUCXzEEEW9sZFBvc2l0aW9uTWFyZ2luCAUNJHQwNTc5ODU1ODEyNQJfMgQXb2xkUG9zaXRpb25PcGVuTm90aW9uYWwIBQ0kdDA1Nzk4NTU4MTI1Al8zBBRvbGRQb3NpdGlvbkxzdFVwZENQRggFDSR0MDU3OTg1NTgxMjUCXzQEBXN0YWtlAwUMaXNRdW90ZUFzc2V0BAVzdGFrZQkA/AcECQEMdmF1bHRBZGRyZXNzAAIJYWRkTG9ja2VkCQDMCAIHBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQpxdW90ZUFzc2V0AAUHX2Ftb3VudAUDbmlsAwkAAAIFBXN0YWtlBQVzdGFrZQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBQNuaWwDCQAAAgUFc3Rha2UFBXN0YWtlCQDOCAIJAQ51cGRhdGVQb3NpdGlvbgUFB190cmFkZXIFD29sZFBvc2l0aW9uU2l6ZQkAZAIFEW9sZFBvc2l0aW9uTWFyZ2luBQdfYW1vdW50BRdvbGRQb3NpdGlvbk9wZW5Ob3Rpb25hbAUUb2xkUG9zaXRpb25Mc3RVcGRDUEYJAQ11cGRhdGVCYWxhbmNlAQkAZAIJAQhjYmFsYW5jZQAFB19hbW91bnQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEMcmVtb3ZlTWFyZ2luAQdfYW1vdW50BARzeW5jCQD8BwQFBHRoaXMCGXN5bmNUZXJtaW5hbFByaWNlVG9PcmFjbGUFA25pbAUDbmlsAwkAAAIFBHN5bmMFBHN5bmMEB190cmFkZXIJAKUIAQgFAWkGY2FsbGVyAwMDAwMJAGcCAAAFB19hbW91bnQGCQEBIQEJARNyZXF1aXJlT3BlblBvc2l0aW9uAQUHX3RyYWRlcgYJAQEhAQkBC2luaXRpYWxpemVkAAYJAQZwYXVzZWQABgkBDmlzTWFya2V0Q2xvc2VkAAkAAgECH0ludmFsaWQgcmVtb3ZlTWFyZ2luIHBhcmFtZXRlcnMEDSR0MDU4OTIwNTkwNjAJAQtnZXRQb3NpdGlvbgEFB190cmFkZXIED29sZFBvc2l0aW9uU2l6ZQgFDSR0MDU4OTIwNTkwNjACXzEEEW9sZFBvc2l0aW9uTWFyZ2luCAUNJHQwNTg5MjA1OTA2MAJfMgQXb2xkUG9zaXRpb25PcGVuTm90aW9uYWwIBQ0kdDA1ODkyMDU5MDYwAl8zBBRvbGRQb3NpdGlvbkxzdFVwZENQRggFDSR0MDU4OTIwNTkwNjACXzQEC21hcmdpbkRlbHRhCQEBLQEFB19hbW91bnQEDSR0MDU5MDk3NTkyNzYJASJjYWxjUmVtYWluTWFyZ2luV2l0aEZ1bmRpbmdQYXltZW50BAUPb2xkUG9zaXRpb25TaXplBRFvbGRQb3NpdGlvbk1hcmdpbgUUb2xkUG9zaXRpb25Mc3RVcGRDUEYFC21hcmdpbkRlbHRhBAxyZW1haW5NYXJnaW4IBQ0kdDA1OTA5NzU5Mjc2Al8xBAdiYWREZWJ0CAUNJHQwNTkwOTc1OTI3NgJfMgMJAQIhPQIFB2JhZERlYnQAAAkAAgECHUludmFsaWQgcmVtb3ZlZCBtYXJnaW4gYW1vdW50BAttYXJnaW5SYXRpbwkBD2NhbGNNYXJnaW5SYXRpbwMFDHJlbWFpbk1hcmdpbgUHYmFkRGVidAUXb2xkUG9zaXRpb25PcGVuTm90aW9uYWwDCQEBIQEJARZyZXF1aXJlTW9yZU1hcmdpblJhdGlvAwULbWFyZ2luUmF0aW8JAQ9pbml0TWFyZ2luUmF0aW8ABgkAAgEJAKwCAgkArAICCQCsAgICGVRvbyBtdWNoIG1hcmdpbiByZW1vdmVkOiAJAKQDAQULbWFyZ2luUmF0aW8CAyA8IAkApAMBCQEPaW5pdE1hcmdpblJhdGlvAAQNcXVvdGVBc3NldFN0cgkA2AQBCQEKcXVvdGVBc3NldAAEDSR0MDU5NzIwNTk3NzQJARNnZXRCb3Jyb3dlZEJ5VHJhZGVyAQUHX3RyYWRlcgQIYm9ycm93ZWQIBQ0kdDA1OTcyMDU5Nzc0Al8xBAdhc3NldElkCAUNJHQwNTk3MjA1OTc3NAJfMgQHdG9SZXBheQMJAGYCBQdfYW1vdW50BQhib3Jyb3dlZAUIYm9ycm93ZWQFB19hbW91bnQECnRvV2l0aGRyYXcDCQBmAgUIYm9ycm93ZWQFB19hbW91bnQAAAkAZQIFB19hbW91bnQFCGJvcnJvd2VkBAtmaW5hbEJvcnJvdwkAZQIFCGJvcnJvd2VkBQd0b1JlcGF5BBVzd2l0Y2hQb3NpdGlvblRvUXVvdGUDCQBmAgULZmluYWxCb3Jyb3cAAAUDbmlsCQETdXBkYXRlUG9zaXRpb25Bc3NldAIFB190cmFkZXIFDXF1b3RlQXNzZXRTdHIEDWRvU2FuaXR5Q2hlY2sDCQECIT0CCQBkAgUHdG9SZXBheQUKdG9XaXRoZHJhdwUHX2Ftb3VudAkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAgh0b1JlcGF5PQkApAMBBQd0b1JlcGF5Ag4gKyB0b1dpdGhkcmF3PQkApAMBBQp0b1dpdGhkcmF3AgQgIT0gCQCkAwEFB19hbW91bnQFA25pbAMJAAACBQ1kb1Nhbml0eUNoZWNrBQ1kb1Nhbml0eUNoZWNrBAlkb1Vuc3Rha2UDCQBmAgUKdG9XaXRoZHJhdwAABAlkb1Vuc3Rha2UJAPwHBAkBDHZhdWx0QWRkcmVzcwACDndpdGhkcmF3TG9ja2VkCQDMCAIFCnRvV2l0aGRyYXcFA25pbAUDbmlsAwkAAAIFCWRvVW5zdGFrZQUJZG9VbnN0YWtlBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4FA25pbAMJAAACBQlkb1Vuc3Rha2UFCWRvVW5zdGFrZQQWcmV0dXJuQ29sbGF0ZXJhbEFjdGlvbgMJAGYCBQd0b1JlcGF5AAAEB2RvUmVwYXkJAPwHBAkBEWNvbGxhdGVyYWxBZGRyZXNzAAIFcmVwYXkJAMwIAgUHX3RyYWRlcgkAzAgCBQd0b1JlcGF5CQDMCAIFB2Fzc2V0SWQFA25pbAUDbmlsAwkAAAIFB2RvUmVwYXkFB2RvUmVwYXkJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQd0b1JlcGF5CQDZBAEFB2Fzc2V0SWQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgUDbmlsAwkAAAIFFnJldHVybkNvbGxhdGVyYWxBY3Rpb24FFnJldHVybkNvbGxhdGVyYWxBY3Rpb24JAM4IAgkAzggCCQDOCAIJAM4IAgkBDnVwZGF0ZVBvc2l0aW9uBQUHX3RyYWRlcgUPb2xkUG9zaXRpb25TaXplBQxyZW1haW5NYXJnaW4FF29sZFBvc2l0aW9uT3Blbk5vdGlvbmFsCQEfbGF0ZXN0Q3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgEFD29sZFBvc2l0aW9uU2l6ZQMJAGYCBQp0b1dpdGhkcmF3AAAJAQh3aXRoZHJhdwIIBQFpBmNhbGxlcgUKdG9XaXRoZHJhdwUDbmlsCQENdXBkYXRlQmFsYW5jZQEJAGUCCQEIY2JhbGFuY2UABQdfYW1vdW50BRVzd2l0Y2hQb3NpdGlvblRvUXVvdGUFFnJldHVybkNvbGxhdGVyYWxBY3Rpb24JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQENY2xvc2VQb3NpdGlvbgMFX3NpemUUX21pblF1b3RlQXNzZXRBbW91bnQMX2FkZFRvTWFyZ2luBARzeW5jCQD8BwQFBHRoaXMCGXN5bmNUZXJtaW5hbFByaWNlVG9PcmFjbGUFA25pbAUDbmlsAwkAAAIFBHN5bmMFBHN5bmMEB190cmFkZXIJAQ9nZXRBY3R1YWxDYWxsZXIBBQFpBA5fdHJhZGVyQWRkcmVzcwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEFB190cmFkZXICDkludmFsaWQgY2FsbGVyBAtwb3NpdGlvbkZlZQkBDmdldFBvc2l0aW9uRmVlAQUHX3RyYWRlcgMDAwMDAwkBASEBCQETcmVxdWlyZU9wZW5Qb3NpdGlvbgEFB190cmFkZXIGCQEBIQEJAQtpbml0aWFsaXplZAAGCQEGcGF1c2VkAAYJAGcCAAAFBV9zaXplBgkAZgIAAAUUX21pblF1b3RlQXNzZXRBbW91bnQGCQEOaXNNYXJrZXRDbG9zZWQACQACAQIgSW52YWxpZCBjbG9zZVBvc2l0aW9uIHBhcmFtZXRlcnMEDSR0MDYyMDExNjIxNTEJAQtnZXRQb3NpdGlvbgEFB190cmFkZXIED29sZFBvc2l0aW9uU2l6ZQgFDSR0MDYyMDExNjIxNTECXzEEEW9sZFBvc2l0aW9uTWFyZ2luCAUNJHQwNjIwMTE2MjE1MQJfMgQXb2xkUG9zaXRpb25PcGVuTm90aW9uYWwIBQ0kdDA2MjAxMTYyMTUxAl8zBBRvbGRQb3NpdGlvbkxzdFVwZENQRggFDSR0MDYyMDExNjIxNTECXzQEDSR0MDYyMTU3Njc5MTYDCQBmAgkBA2FicwEFD29sZFBvc2l0aW9uU2l6ZQUFX3NpemUEDSR0MDYyNjQ5NjI4NzEJAQpzd2FwT3V0cHV0AwkAZgIFD29sZFBvc2l0aW9uU2l6ZQAABQVfc2l6ZQYEGWV4Y2hhbmdlZFF1b3RlQXNzZXRBbW91bnQIBQ0kdDA2MjY0OTYyODcxAl8xBBZxdW90ZUFzc2V0UmVzZXJ2ZUFmdGVyCAUNJHQwNjI2NDk2Mjg3MQJfMgQVYmFzZUFzc2V0UmVzZXJ2ZUFmdGVyCAUNJHQwNjI2NDk2Mjg3MQJfMwQWdG90YWxQb3NpdGlvblNpemVBZnRlcggFDSR0MDYyNjQ5NjI4NzECXzQEFWV4Y2hhbmdlZFBvc2l0aW9uU2l6ZQMJAGYCBQ9vbGRQb3NpdGlvblNpemUAAAkBAS0BBQVfc2l6ZQUFX3NpemUEDSR0MDYyOTYyNjMxMTYJASNnZXRQb3NpdGlvbk5vdGlvbmFsQW5kVW5yZWFsaXplZFBubAIFB190cmFkZXIFD1BOTF9PUFRJT05fU1BPVAQTb2xkUG9zaXRpb25Ob3Rpb25hbAgFDSR0MDYyOTYyNjMxMTYCXzEEDXVucmVhbGl6ZWRQbmwIBQ0kdDA2Mjk2MjYzMTE2Al8yBAJtcgkBFmdldE1hcmdpblJhdGlvQnlPcHRpb24CBQdfdHJhZGVyBQ9QTkxfT1BUSU9OX1NQT1QEDXJlYWxpemVkUmF0aW8JAQRkaXZkAgkBA2FicwEFFWV4Y2hhbmdlZFBvc2l0aW9uU2l6ZQkBA2FicwEFD29sZFBvc2l0aW9uU2l6ZQQLcmVhbGl6ZWRQbmwJAQRtdWxkAgUNdW5yZWFsaXplZFBubAUNcmVhbGl6ZWRSYXRpbwQLcmVhbGl6ZWRGZWUJAQRtdWxkAgkBBG11bGQCBRNvbGRQb3NpdGlvbk5vdGlvbmFsBQ1yZWFsaXplZFJhdGlvBQtwb3NpdGlvbkZlZQQScmVtYWluTWFyZ2luQmVmb3JlCAkBImNhbGNSZW1haW5NYXJnaW5XaXRoRnVuZGluZ1BheW1lbnQEBQ9vbGRQb3NpdGlvblNpemUFEW9sZFBvc2l0aW9uTWFyZ2luBRRvbGRQb3NpdGlvbkxzdFVwZENQRgUNdW5yZWFsaXplZFBubAJfMQQPcG9zaXRpb25CYWREZWJ0CAkBImNhbGNSZW1haW5NYXJnaW5XaXRoRnVuZGluZ1BheW1lbnQEBQ9vbGRQb3NpdGlvblNpemUFEW9sZFBvc2l0aW9uTWFyZ2luBRRvbGRQb3NpdGlvbkxzdFVwZENQRgULcmVhbGl6ZWRQbmwCXzIEEnVucmVhbGl6ZWRQbmxBZnRlcgkAZQIFDXVucmVhbGl6ZWRQbmwFC3JlYWxpemVkUG5sBBJyZW1haW5PcGVuTm90aW9uYWwDCQBmAgUPb2xkUG9zaXRpb25TaXplAAAJAGUCCQBlAgUTb2xkUG9zaXRpb25Ob3Rpb25hbAUZZXhjaGFuZ2VkUXVvdGVBc3NldEFtb3VudAUSdW5yZWFsaXplZFBubEFmdGVyCQBlAgkAZAIFEnVucmVhbGl6ZWRQbmxBZnRlcgUTb2xkUG9zaXRpb25Ob3Rpb25hbAUZZXhjaGFuZ2VkUXVvdGVBc3NldEFtb3VudAQXbmV3UG9zaXRpb25PcGVuTm90aW9uYWwJAQNhYnMBBRJyZW1haW5PcGVuTm90aW9uYWwED25ld1Bvc2l0aW9uU2l6ZQkAZAIFD29sZFBvc2l0aW9uU2l6ZQUVZXhjaGFuZ2VkUG9zaXRpb25TaXplBBRuZXdQb3NpdGlvbkxzdFVwZENQRgkBH2xhdGVzdEN1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24BBQ9uZXdQb3NpdGlvblNpemUEEW9wZW5Ob3Rpb25hbERlbHRhCQBlAgUXb2xkUG9zaXRpb25PcGVuTm90aW9uYWwFF25ld1Bvc2l0aW9uT3Blbk5vdGlvbmFsBBlvcGVuSW50ZXJlc3ROb3Rpb25hbEFmdGVyCQBlAgkBFG9wZW5JbnRlcmVzdE5vdGlvbmFsAAURb3Blbk5vdGlvbmFsRGVsdGEEEW5ld1Bvc2l0aW9uTWFyZ2luAwkAZgIFD29sZFBvc2l0aW9uU2l6ZQAACQBlAgkBBG11bGQCCQBkAgUXbmV3UG9zaXRpb25PcGVuTm90aW9uYWwFEnVucmVhbGl6ZWRQbmxBZnRlcgUCbXIFEnVucmVhbGl6ZWRQbmxBZnRlcgkAZQIJAQRtdWxkAgkAZQIFF25ld1Bvc2l0aW9uT3Blbk5vdGlvbmFsBRJ1bnJlYWxpemVkUG5sQWZ0ZXIFAm1yBRJ1bnJlYWxpemVkUG5sQWZ0ZXIEEW1hcmdpblRvVHJhZGVyUmF3CQBlAgkAZQIFEnJlbWFpbk1hcmdpbkJlZm9yZQkAZAIFEW5ld1Bvc2l0aW9uTWFyZ2luBRJ1bnJlYWxpemVkUG5sQWZ0ZXIFC3JlYWxpemVkRmVlBA5tYXJnaW5Ub1RyYWRlcgMJAGYCAAAFEW1hcmdpblRvVHJhZGVyUmF3CQACAQIlTWFyZ2luIGVycm9yOiB1bmFibGUgdG8gcGF5IGNsb3NlIGZlZQURbWFyZ2luVG9UcmFkZXJSYXcDAwkBAiE9AgUUX21pblF1b3RlQXNzZXRBbW91bnQAAAkAZgIFFF9taW5RdW90ZUFzc2V0QW1vdW50BRlleGNoYW5nZWRRdW90ZUFzc2V0QW1vdW50BwkAAgEJAKwCAgkArAICCQCsAgICDUxpbWl0IGVycm9yOiAJAKQDAQUZZXhjaGFuZ2VkUXVvdGVBc3NldEFtb3VudAIDIDwgCQCkAwEFFF9taW5RdW90ZUFzc2V0QW1vdW50CQCiChAFD25ld1Bvc2l0aW9uU2l6ZQMFDF9hZGRUb01hcmdpbgkAZAIFEW5ld1Bvc2l0aW9uTWFyZ2luBQ5tYXJnaW5Ub1RyYWRlcgURbmV3UG9zaXRpb25NYXJnaW4FF25ld1Bvc2l0aW9uT3Blbk5vdGlvbmFsBRRuZXdQb3NpdGlvbkxzdFVwZENQRgUPcG9zaXRpb25CYWREZWJ0BQtyZWFsaXplZFBubAMFDF9hZGRUb01hcmdpbgAABQ5tYXJnaW5Ub1RyYWRlcgUWcXVvdGVBc3NldFJlc2VydmVBZnRlcgUVYmFzZUFzc2V0UmVzZXJ2ZUFmdGVyBRZ0b3RhbFBvc2l0aW9uU2l6ZUFmdGVyBRlvcGVuSW50ZXJlc3ROb3Rpb25hbEFmdGVyCQBlAgkBFXRvdGFsTG9uZ1Bvc2l0aW9uU2l6ZQADCQBmAgUPbmV3UG9zaXRpb25TaXplAAAJAQNhYnMBBRVleGNoYW5nZWRQb3NpdGlvblNpemUAAAkAZQIJARZ0b3RhbFNob3J0UG9zaXRpb25TaXplAAMJAGYCAAAFD25ld1Bvc2l0aW9uU2l6ZQkBA2FicwEFFWV4Y2hhbmdlZFBvc2l0aW9uU2l6ZQAACQBlAgkBEG9wZW5JbnRlcmVzdExvbmcAAwkAZgIFD25ld1Bvc2l0aW9uU2l6ZQAABRFvcGVuTm90aW9uYWxEZWx0YQAACQBlAgkBEW9wZW5JbnRlcmVzdFNob3J0AAMJAGYCAAAFD25ld1Bvc2l0aW9uU2l6ZQURb3Blbk5vdGlvbmFsRGVsdGEAAAULcmVhbGl6ZWRGZWUDCQBmAgUFX3NpemUJAQNhYnMBBQ9vbGRQb3NpdGlvblNpemUJAAIBAiBJbnZhbGlkIGNsb3NlUG9zaXRpb24gcGFyYW1ldGVycwQNJHQwNjYzMzU2Njc2NQkBFWludGVybmFsQ2xvc2VQb3NpdGlvbgIFB190cmFkZXIGBAJ4MggFDSR0MDY2MzM1NjY3NjUCXzEED3Bvc2l0aW9uQmFkRGVidAgFDSR0MDY2MzM1NjY3NjUCXzIEC3JlYWxpemVkUG5sCAUNJHQwNjYzMzU2Njc2NQJfMwQYbWFyZ2luVG9UcmFkZXJXaXRob3V0RmVlCAUNJHQwNjYzMzU2Njc2NQJfNAQWcXVvdGVBc3NldFJlc2VydmVBZnRlcggFDSR0MDY2MzM1NjY3NjUCXzUEFWJhc2VBc3NldFJlc2VydmVBZnRlcggFDSR0MDY2MzM1NjY3NjUCXzYEFnRvdGFsUG9zaXRpb25TaXplQWZ0ZXIIBQ0kdDA2NjMzNTY2NzY1Al83BBlvcGVuSW50ZXJlc3ROb3Rpb25hbEFmdGVyCAUNJHQwNjYzMzU2Njc2NQJfOAQZZXhjaGFuZ2VkUXVvdGVBc3NldEFtb3VudAgFDSR0MDY2MzM1NjY3NjUCXzkEDnRvdGFsTG9uZ0FmdGVyCAUNJHQwNjYzMzU2Njc2NQNfMTAED3RvdGFsU2hvcnRBZnRlcggFDSR0MDY2MzM1NjY3NjUDXzExBBp0b3RhbExvbmdPcGVuSW50ZXJlc3RBZnRlcggFDSR0MDY2MzM1NjY3NjUDXzEyBBt0b3RhbFNob3J0T3BlbkludGVyZXN0QWZ0ZXIIBQ0kdDA2NjMzNTY2NzY1A18xMwQLcmVhbGl6ZWRGZWUJAQRtdWxkAgUZZXhjaGFuZ2VkUXVvdGVBc3NldEFtb3VudAULcG9zaXRpb25GZWUEEW1hcmdpblRvVHJhZGVyUmF3CQBlAgkBA2FicwEFGG1hcmdpblRvVHJhZGVyV2l0aG91dEZlZQULcmVhbGl6ZWRGZWUEDm1hcmdpblRvVHJhZGVyAwkAZgIAAAURbWFyZ2luVG9UcmFkZXJSYXcJAAIBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICJ01hcmdpbiBlcnJvcjogdW5hYmxlIHRvIHBheSBjbG9zZSBmZWU6IAkApAMBBQtyZWFsaXplZEZlZQIJIG1hcmdpbjogCQCkAwEFGG1hcmdpblRvVHJhZGVyV2l0aG91dEZlZQIOIGZlZSBwZXJjZW50OiAJAKQDAQULcG9zaXRpb25GZWUCCyBub3Rpb25hbDogCQCkAwEFGWV4Y2hhbmdlZFF1b3RlQXNzZXRBbW91bnQFEW1hcmdpblRvVHJhZGVyUmF3AwMJAQIhPQIFFF9taW5RdW90ZUFzc2V0QW1vdW50AAAJAGYCBRRfbWluUXVvdGVBc3NldEFtb3VudAUZZXhjaGFuZ2VkUXVvdGVBc3NldEFtb3VudAcJAAIBCQCsAgIJAKwCAgkArAICAg1MaW1pdCBlcnJvcjogCQCkAwEFGWV4Y2hhbmdlZFF1b3RlQXNzZXRBbW91bnQCAyA8IAkApAMBBRRfbWluUXVvdGVBc3NldEFtb3VudAkAogoQAAAAAAAAAAAFD3Bvc2l0aW9uQmFkRGVidAULcmVhbGl6ZWRQbmwFDm1hcmdpblRvVHJhZGVyBRZxdW90ZUFzc2V0UmVzZXJ2ZUFmdGVyBRViYXNlQXNzZXRSZXNlcnZlQWZ0ZXIFFnRvdGFsUG9zaXRpb25TaXplQWZ0ZXIFGW9wZW5JbnRlcmVzdE5vdGlvbmFsQWZ0ZXIFDnRvdGFsTG9uZ0FmdGVyBQ90b3RhbFNob3J0QWZ0ZXIFGnRvdGFsTG9uZ09wZW5JbnRlcmVzdEFmdGVyBRt0b3RhbFNob3J0T3BlbkludGVyZXN0QWZ0ZXIFC3JlYWxpemVkRmVlBA9uZXdQb3NpdGlvblNpemUIBQ0kdDA2MjE1NzY3OTE2Al8xBBFuZXdQb3NpdGlvbk1hcmdpbggFDSR0MDYyMTU3Njc5MTYCXzIEF25ld1Bvc2l0aW9uT3Blbk5vdGlvbmFsCAUNJHQwNjIxNTc2NzkxNgJfMwQUbmV3UG9zaXRpb25Mc3RVcGRDUEYIBQ0kdDA2MjE1NzY3OTE2Al80BA9wb3NpdGlvbkJhZERlYnQIBQ0kdDA2MjE1NzY3OTE2Al81BAtyZWFsaXplZFBubAgFDSR0MDYyMTU3Njc5MTYCXzYEDm1hcmdpblRvVHJhZGVyCAUNJHQwNjIxNTc2NzkxNgJfNwQWcXVvdGVBc3NldFJlc2VydmVBZnRlcggFDSR0MDYyMTU3Njc5MTYCXzgEFWJhc2VBc3NldFJlc2VydmVBZnRlcggFDSR0MDYyMTU3Njc5MTYCXzkEFnRvdGFsUG9zaXRpb25TaXplQWZ0ZXIIBQ0kdDA2MjE1NzY3OTE2A18xMAQZb3BlbkludGVyZXN0Tm90aW9uYWxBZnRlcggFDSR0MDYyMTU3Njc5MTYDXzExBA50b3RhbExvbmdBZnRlcggFDSR0MDYyMTU3Njc5MTYDXzEyBA90b3RhbFNob3J0QWZ0ZXIIBQ0kdDA2MjE1NzY3OTE2A18xMwQadG90YWxMb25nT3BlbkludGVyZXN0QWZ0ZXIIBQ0kdDA2MjE1NzY3OTE2A18xNAQbdG90YWxTaG9ydE9wZW5JbnRlcmVzdEFmdGVyCAUNJHQwNjIxNTc2NzkxNgNfMTUEC3JlYWxpemVkRmVlCAUNJHQwNjIxNTc2NzkxNgNfMTYDCQBmAgUPcG9zaXRpb25CYWREZWJ0AAAJAAIBAiZVbmFibGUgdG8gY2xvc2UgcG9zaXRpb24gd2l0aCBiYWQgZGVidAQOaXNQYXJ0aWFsQ2xvc2UJAQIhPQIFD25ld1Bvc2l0aW9uU2l6ZQAABA53aXRoZHJhd0Ftb3VudAkAZAIFDm1hcmdpblRvVHJhZGVyBQtyZWFsaXplZEZlZQQKYW1tQmFsYW5jZQkAZQIJAQhjYmFsYW5jZQAFDndpdGhkcmF3QW1vdW50BA0kdDA2ODE4MzY4MzkwAwkAZgIAAAUKYW1tQmFsYW5jZQkAlAoCAAAJAQNhYnMBBQphbW1CYWxhbmNlCQCUCgIFCmFtbUJhbGFuY2UAAAQNYW1tTmV3QmFsYW5jZQgFDSR0MDY4MTgzNjgzOTACXzEEA3gxMQgFDSR0MDY4MTgzNjgzOTACXzIEDSR0MDY4Mzk3Njg0NTEJARNnZXRCb3Jyb3dlZEJ5VHJhZGVyAQUHX3RyYWRlcgQIYm9ycm93ZWQIBQ0kdDA2ODM5NzY4NDUxAl8xBAdhc3NldElkCAUNJHQwNjgzOTc2ODQ1MQJfMgQNJHQwNjg0NTk2OTMxOQMJAGYCBQhib3Jyb3dlZAAAAwkAZwIFDndpdGhkcmF3QW1vdW50BQhib3Jyb3dlZAQHZG9SZXBheQkA/AcECQERY29sbGF0ZXJhbEFkZHJlc3MAAgVyZXBheQkAzAgCBQdfdHJhZGVyCQDMCAIFCGJvcnJvd2VkCQDMCAIFB2Fzc2V0SWQFA25pbAUDbmlsAwkAAAIFB2RvUmVwYXkFB2RvUmVwYXkJAJUKAwUIYm9ycm93ZWQJAGUCBQ53aXRoZHJhd0Ftb3VudAUIYm9ycm93ZWQFDmlzUGFydGlhbENsb3NlCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBA9yZWFsaXplQW5kQ2xvc2UJAPwHBAkBEWNvbGxhdGVyYWxBZGRyZXNzAAMFDmlzUGFydGlhbENsb3NlAgVyZXBheQIYcmVhbGl6ZVBhcnRpYWxseUFuZENsb3NlCQDMCAIFB190cmFkZXIJAMwIAgUOd2l0aGRyYXdBbW91bnQJAMwIAgUHYXNzZXRJZAUDbmlsBQNuaWwDCQAAAgUPcmVhbGl6ZUFuZENsb3NlBQ9yZWFsaXplQW5kQ2xvc2UJAJUKAwUOd2l0aGRyYXdBbW91bnQAAAcJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAJUKAwAABQ53aXRoZHJhd0Ftb3VudAcDCQAAAgUNJHQwNjg0NTk2OTMxOQUNJHQwNjg0NTk2OTMxOQQNc3dpdGNoVG9RdW90ZQgFDSR0MDY4NDU5NjkzMTkCXzMEHHF1b3RlV2l0aGRyYXdBbW91bnRCZWZvcmVGZWUIBQ0kdDA2ODQ1OTY5MzE5Al8yBBxhc3NldFdpdGhkcmF3QW1vdW50QmVmb3JlRmVlCAUNJHQwNjg0NTk2OTMxOQJfMQQNJHQwNjkzMjc3MDM5NAMJAGcCBRxxdW90ZVdpdGhkcmF3QW1vdW50QmVmb3JlRmVlBQtyZWFsaXplZEZlZQkAlQoDBRxhc3NldFdpdGhkcmF3QW1vdW50QmVmb3JlRmVlCQBlAgUccXVvdGVXaXRoZHJhd0Ftb3VudEJlZm9yZUZlZQULcmVhbGl6ZWRGZWUFC3JlYWxpemVkRmVlBBpmZWVMZWZ0VG9XaXRoZHJhd0Zyb21Bc3NldAkAZQIFC3JlYWxpemVkRmVlBRxxdW90ZVdpdGhkcmF3QW1vdW50QmVmb3JlRmVlBBthc3NldFdpdGhkcmF3QW1vdW50QWZ0ZXJGZWUJAGUCBRxhc3NldFdpdGhkcmF3QW1vdW50QmVmb3JlRmVlBRpmZWVMZWZ0VG9XaXRoZHJhd0Zyb21Bc3NldAQNYmFsYW5jZUJlZm9yZQkA8AcCBQR0aGlzCQEKcXVvdGVBc3NldAADCQAAAgUNYmFsYW5jZUJlZm9yZQUNYmFsYW5jZUJlZm9yZQQGZG9Td2FwCQD8BwQJAQtzd2FwQWRkcmVzcwACBHN3YXAJAMwIAgkA2AQBCQEKcXVvdGVBc3NldAAJAMwIAgAABQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJANkEAQUHYXNzZXRJZAUaZmVlTGVmdFRvV2l0aGRyYXdGcm9tQXNzZXQFA25pbAMJAAACBQZkb1N3YXAFBmRvU3dhcAQMYmFsYW5jZUFmdGVyCQDwBwIFBHRoaXMJAQpxdW90ZUFzc2V0AAMJAAACBQxiYWxhbmNlQWZ0ZXIFDGJhbGFuY2VBZnRlcgQPZXhjaGFuZ2VkQW1vdW50CQBlAgUMYmFsYW5jZUFmdGVyBQ1iYWxhbmNlQmVmb3JlAwkAAAIFD2V4Y2hhbmdlZEFtb3VudAUPZXhjaGFuZ2VkQW1vdW50CQCVCgMFG2Fzc2V0V2l0aGRyYXdBbW91bnRBZnRlckZlZQAACQBkAgUccXVvdGVXaXRoZHJhd0Ftb3VudEJlZm9yZUZlZQUPZXhjaGFuZ2VkQW1vdW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAwkAAAIFDSR0MDY5MzI3NzAzOTQFDSR0MDY5MzI3NzAzOTQEFWFjdHVhbEZlZUluUXVvdGVBc3NldAgFDSR0MDY5MzI3NzAzOTQCXzMEG3F1b3RlV2l0aGRyYXdBbW91bnRBZnRlckZlZQgFDSR0MDY5MzI3NzAzOTQCXzIEG2Fzc2V0V2l0aGRyYXdBbW91bnRBZnRlckZlZQgFDSR0MDY5MzI3NzAzOTQCXzEEB3Vuc3Rha2UDCQBmAgUccXVvdGVXaXRoZHJhd0Ftb3VudEJlZm9yZUZlZQAABAd1bnN0YWtlCQD8BwQJAQx2YXVsdEFkZHJlc3MAAg53aXRoZHJhd0xvY2tlZAkAzAgCBRxxdW90ZVdpdGhkcmF3QW1vdW50QmVmb3JlRmVlBQNuaWwFA25pbAMJAAACBQd1bnN0YWtlBQd1bnN0YWtlBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4FA25pbAMJAAACBQd1bnN0YWtlBQd1bnN0YWtlBA0kdDA3MDY2ODcwNzM3CQENZGlzdHJpYnV0ZUZlZQEFFWFjdHVhbEZlZUluUXVvdGVBc3NldAQMZmVlVG9TdGFrZXJzCAUNJHQwNzA2Njg3MDczNwJfMQQKZmVlVG9WYXVsdAgFDSR0MDcwNjY4NzA3MzcCXzIEDGRlcG9zaXRWYXVsdAkA/AcECQEMdmF1bHRBZGRyZXNzAAIHYWRkRnJlZQUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEKcXVvdGVBc3NldAAFCmZlZVRvVmF1bHQFA25pbAMJAAACBQxkZXBvc2l0VmF1bHQFDGRlcG9zaXRWYXVsdAQJbm90aWZ5RmVlCQD8BwQJAQxtaW5lckFkZHJlc3MAAgpub3RpZnlGZWVzCQDMCAIFB190cmFkZXIJAMwIAgULcmVhbGl6ZWRGZWUFA25pbAUDbmlsAwkAAAIFCW5vdGlmeUZlZQUJbm90aWZ5RmVlBA5ub3RpZnlOb3Rpb25hbAkA/AcECQEMbWluZXJBZGRyZXNzAAIObm90aWZ5Tm90aW9uYWwJAMwIAgUHX3RyYWRlcgkAzAgCBRduZXdQb3NpdGlvbk9wZW5Ob3Rpb25hbAUDbmlsBQNuaWwDCQAAAgUObm90aWZ5Tm90aW9uYWwFDm5vdGlmeU5vdGlvbmFsCQDOCAIJAM4IAgkAzggCCQDOCAIJAM4IAgkAzggCAwUOaXNQYXJ0aWFsQ2xvc2UJAQ51cGRhdGVQb3NpdGlvbgUFB190cmFkZXIFD25ld1Bvc2l0aW9uU2l6ZQURbmV3UG9zaXRpb25NYXJnaW4FF25ld1Bvc2l0aW9uT3Blbk5vdGlvbmFsBRRuZXdQb3NpdGlvbkxzdFVwZENQRgkBDmRlbGV0ZVBvc2l0aW9uAQUHX3RyYWRlcgMFDXN3aXRjaFRvUXVvdGUEDXF1b3RlQXNzZXRTdHIJANgEAQkBCnF1b3RlQXNzZXQACQETdXBkYXRlUG9zaXRpb25Bc3NldAIFB190cmFkZXIFDXF1b3RlQXNzZXRTdHIFA25pbAkBCXVwZGF0ZUFtbQgFFnF1b3RlQXNzZXRSZXNlcnZlQWZ0ZXIFFWJhc2VBc3NldFJlc2VydmVBZnRlcgUWdG90YWxQb3NpdGlvblNpemVBZnRlcgUZb3BlbkludGVyZXN0Tm90aW9uYWxBZnRlcgUOdG90YWxMb25nQWZ0ZXIFD3RvdGFsU2hvcnRBZnRlcgUadG90YWxMb25nT3BlbkludGVyZXN0QWZ0ZXIFG3RvdGFsU2hvcnRPcGVuSW50ZXJlc3RBZnRlcgkBC3RyYW5zZmVyRmVlAQUMZmVlVG9TdGFrZXJzAwkAZgIFG3F1b3RlV2l0aGRyYXdBbW91bnRBZnRlckZlZQAACQEId2l0aGRyYXcCBQ5fdHJhZGVyQWRkcmVzcwUbcXVvdGVXaXRoZHJhd0Ftb3VudEFmdGVyRmVlBQNuaWwJAQ11cGRhdGVCYWxhbmNlAQUNYW1tTmV3QmFsYW5jZQMJAGYCBRthc3NldFdpdGhkcmF3QW1vdW50QWZ0ZXJGZWUAAAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQ5fdHJhZGVyQWRkcmVzcwUbYXNzZXRXaXRoZHJhd0Ftb3VudEFmdGVyRmVlCQDZBAEFB2Fzc2V0SWQFA25pbAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCWxpcXVpZGF0ZQEHX3RyYWRlcgQEc3luYwkA/AcEBQR0aGlzAhlzeW5jVGVybWluYWxQcmljZVRvT3JhY2xlBQNuaWwFA25pbAMJAAACBQRzeW5jBQRzeW5jBA9zcG90TWFyZ2luUmF0aW8JARZnZXRNYXJnaW5SYXRpb0J5T3B0aW9uAgUHX3RyYWRlcgUPUE5MX09QVElPTl9TUE9UBAttYXJnaW5SYXRpbwMJARZpc092ZXJGbHVjdHVhdGlvbkxpbWl0AAQRb3JhY2xlTWFyZ2luUmF0aW8JARZnZXRNYXJnaW5SYXRpb0J5T3B0aW9uAgUHX3RyYWRlcgURUE5MX09QVElPTl9PUkFDTEUJAQR2bWF4AgUPc3BvdE1hcmdpblJhdGlvBRFvcmFjbGVNYXJnaW5SYXRpbwUPc3BvdE1hcmdpblJhdGlvAwMDAwMJAQEhAQkBFnJlcXVpcmVNb3JlTWFyZ2luUmF0aW8DBQttYXJnaW5SYXRpbwkBFm1haW50ZW5hbmNlTWFyZ2luUmF0aW8ABwYJAQEhAQkBE3JlcXVpcmVPcGVuUG9zaXRpb24BBQdfdHJhZGVyBgkBASEBCQELaW5pdGlhbGl6ZWQABgkBBnBhdXNlZAAGCQEOaXNNYXJrZXRDbG9zZWQACQACAQITVW5hYmxlIHRvIGxpcXVpZGF0ZQMDAwkAZgIFD3Nwb3RNYXJnaW5SYXRpbwkBE2xpcXVpZGF0aW9uRmVlUmF0aW8ACQBmAgkBF3BhcnRpYWxMaXF1aWRhdGlvblJhdGlvAAAABwkAZgIFDERFQ0lNQUxfVU5JVAkBF3BhcnRpYWxMaXF1aWRhdGlvblJhdGlvAAcEDSR0MDczNDkwNzM2NDAJAQtnZXRQb3NpdGlvbgEFB190cmFkZXIED29sZFBvc2l0aW9uU2l6ZQgFDSR0MDczNDkwNzM2NDACXzEEEW9sZFBvc2l0aW9uTWFyZ2luCAUNJHQwNzM0OTA3MzY0MAJfMgQXb2xkUG9zaXRpb25PcGVuTm90aW9uYWwIBQ0kdDA3MzQ5MDczNjQwAl8zBBRvbGRQb3NpdGlvbkxzdFVwZENQRggFDSR0MDczNDkwNzM2NDACXzQECl9kaXJlY3Rpb24DCQBmAgUPb2xkUG9zaXRpb25TaXplAAAFCURJUl9TSE9SVAUIRElSX0xPTkcEBWlzQWRkCQAAAgUKX2RpcmVjdGlvbgUIRElSX0xPTkcEGWV4Y2hhbmdlZFF1b3RlQXNzZXRBbW91bnQJARtnZXRQYXJ0aWFsTGlxdWlkYXRpb25BbW91bnQCBQdfdHJhZGVyBQ9vbGRQb3NpdGlvblNpemUEDSR0MDczODY1NzM5NjkJASNnZXRQb3NpdGlvbk5vdGlvbmFsQW5kVW5yZWFsaXplZFBubAIFB190cmFkZXIFD1BOTF9PUFRJT05fU1BPVAQTb2xkUG9zaXRpb25Ob3Rpb25hbAgFDSR0MDczODY1NzM5NjkCXzEEDXVucmVhbGl6ZWRQbmwIBQ0kdDA3Mzg2NTczOTY5Al8yBA0kdDA3Mzk3Nzc0MTY0CQEJc3dhcElucHV0AgUFaXNBZGQFGWV4Y2hhbmdlZFF1b3RlQXNzZXRBbW91bnQEFWV4Y2hhbmdlZFBvc2l0aW9uU2l6ZQgFDSR0MDczOTc3NzQxNjQCXzEEFnF1b3RlQXNzZXRSZXNlcnZlQWZ0ZXIIBQ0kdDA3Mzk3Nzc0MTY0Al8yBBViYXNlQXNzZXRSZXNlcnZlQWZ0ZXIIBQ0kdDA3Mzk3Nzc0MTY0Al8zBBZ0b3RhbFBvc2l0aW9uU2l6ZUFmdGVyCAUNJHQwNzM5Nzc3NDE2NAJfNAQQbGlxdWlkYXRpb25SYXRpbwkBBGRpdmQCCQEDYWJzAQUVZXhjaGFuZ2VkUG9zaXRpb25TaXplCQEDYWJzAQUPb2xkUG9zaXRpb25TaXplBAtyZWFsaXplZFBubAkBBG11bGQCBQ11bnJlYWxpemVkUG5sBRBsaXF1aWRhdGlvblJhdGlvBA0kdDA3NDQ1Mzc0Njg2CQEiY2FsY1JlbWFpbk1hcmdpbldpdGhGdW5kaW5nUGF5bWVudAQFD29sZFBvc2l0aW9uU2l6ZQURb2xkUG9zaXRpb25NYXJnaW4FFG9sZFBvc2l0aW9uTHN0VXBkQ1BGBQtyZWFsaXplZFBubAQMcmVtYWluTWFyZ2luCAUNJHQwNzQ0NTM3NDY4NgJfMQQHYmFkRGVidAgFDSR0MDc0NDUzNzQ2ODYCXzIEDmZ1bmRpbmdQYXltZW50CAUNJHQwNzQ0NTM3NDY4NgJfMwQSdW5yZWFsaXplZFBubEFmdGVyCQBlAgUNdW5yZWFsaXplZFBubAULcmVhbGl6ZWRQbmwEEnJlbWFpbk9wZW5Ob3Rpb25hbAMJAGYCBQ9vbGRQb3NpdGlvblNpemUAAAkAZQIJAGUCBRNvbGRQb3NpdGlvbk5vdGlvbmFsBRlleGNoYW5nZWRRdW90ZUFzc2V0QW1vdW50BRJ1bnJlYWxpemVkUG5sQWZ0ZXIJAGUCCQBkAgUSdW5yZWFsaXplZFBubEFmdGVyBRNvbGRQb3NpdGlvbk5vdGlvbmFsBRlleGNoYW5nZWRRdW90ZUFzc2V0QW1vdW50BBJsaXF1aWRhdGlvblBlbmFsdHkJAQRtdWxkAgUZZXhjaGFuZ2VkUXVvdGVBc3NldEFtb3VudAkBE2xpcXVpZGF0aW9uRmVlUmF0aW8ABA9mZWVUb0xpcXVpZGF0b3IJAGkCBRJsaXF1aWRhdGlvblBlbmFsdHkAAgQKZmVlVG9WYXVsdAkAZQIFEmxpcXVpZGF0aW9uUGVuYWx0eQUPZmVlVG9MaXF1aWRhdG9yBBFuZXdQb3NpdGlvbk1hcmdpbgkAZQIFDHJlbWFpbk1hcmdpbgUSbGlxdWlkYXRpb25QZW5hbHR5BA9uZXdQb3NpdGlvblNpemUJAGQCBQ9vbGRQb3NpdGlvblNpemUFFWV4Y2hhbmdlZFBvc2l0aW9uU2l6ZQQXbmV3UG9zaXRpb25PcGVuTm90aW9uYWwJAQNhYnMBBRJyZW1haW5PcGVuTm90aW9uYWwEEW9wZW5Ob3Rpb25hbERlbHRhCQBlAgUXb2xkUG9zaXRpb25PcGVuTm90aW9uYWwFF25ld1Bvc2l0aW9uT3Blbk5vdGlvbmFsBBRuZXdQb3NpdGlvbkxzdFVwZENQRgkBH2xhdGVzdEN1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24BBQ9uZXdQb3NpdGlvblNpemUEGW9wZW5JbnRlcmVzdE5vdGlvbmFsQWZ0ZXIJAGUCCQEUb3BlbkludGVyZXN0Tm90aW9uYWwABRFvcGVuTm90aW9uYWxEZWx0YQQKYW1tQmFsYW5jZQkAZQIJAQhjYmFsYW5jZQAFEmxpcXVpZGF0aW9uUGVuYWx0eQQNJHQwNzU5Mjc3NjA1NgMJAGYCAAAFCmFtbUJhbGFuY2UJAJQKAgAACQEDYWJzAQUKYW1tQmFsYW5jZQkAlAoCBQphbW1CYWxhbmNlAAAEDW5ld0FtbUJhbGFuY2UIBQ0kdDA3NTkyNzc2MDU2Al8xBAN4MTEIBQ0kdDA3NTkyNzc2MDU2Al8yBA0kdDA3NjA2NDc2MTE4CQETZ2V0Qm9ycm93ZWRCeVRyYWRlcgEFB190cmFkZXIECGJvcnJvd2VkCAUNJHQwNzYwNjQ3NjExOAJfMQQHYXNzZXRJZAgFDSR0MDc2MDY0NzYxMTgCXzIEFWRvTGlxdWlkYXRlQ29sbGF0ZXJhbAMJAGYCBQhib3Jyb3dlZAAABBBjb2xsYXRlcmFsVG9TZWxsCQEEbXVsZAIFCGJvcnJvd2VkBRBsaXF1aWRhdGlvblJhdGlvBA9yZWFsaXplQW5kQ2xvc2UJAPwHBAkBEWNvbGxhdGVyYWxBZGRyZXNzAAIQcmVhbGl6ZVBhcnRpYWxseQkAzAgCBQdfdHJhZGVyCQDMCAIFB2Fzc2V0SWQJAMwIAgUQY29sbGF0ZXJhbFRvU2VsbAUDbmlsBQNuaWwDCQAAAgUPcmVhbGl6ZUFuZENsb3NlBQ9yZWFsaXplQW5kQ2xvc2UFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgUDbmlsAwkAAAIFFWRvTGlxdWlkYXRlQ29sbGF0ZXJhbAUVZG9MaXF1aWRhdGVDb2xsYXRlcmFsBAd1bnN0YWtlCQD8BwQJAQx2YXVsdEFkZHJlc3MAAg53aXRoZHJhd0xvY2tlZAkAzAgCBRJsaXF1aWRhdGlvblBlbmFsdHkFA25pbAUDbmlsAwkAAAIFB3Vuc3Rha2UFB3Vuc3Rha2UEEGRlcG9zaXRJbnN1cmFuY2UJAPwHBAkBDHZhdWx0QWRkcmVzcwACB2FkZEZyZWUFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBCnF1b3RlQXNzZXQABQpmZWVUb1ZhdWx0BQNuaWwDCQAAAgUQZGVwb3NpdEluc3VyYW5jZQUQZGVwb3NpdEluc3VyYW5jZQQObm90aWZ5Tm90aW9uYWwJAPwHBAkBDG1pbmVyQWRkcmVzcwACDm5vdGlmeU5vdGlvbmFsCQDMCAIFB190cmFkZXIJAMwIAgUXbmV3UG9zaXRpb25PcGVuTm90aW9uYWwFA25pbAUDbmlsAwkAAAIFDm5vdGlmeU5vdGlvbmFsBQ5ub3RpZnlOb3Rpb25hbAkAzggCCQDOCAIJAM4IAgkBDnVwZGF0ZVBvc2l0aW9uBQUHX3RyYWRlcgUPbmV3UG9zaXRpb25TaXplBRFuZXdQb3NpdGlvbk1hcmdpbgUXbmV3UG9zaXRpb25PcGVuTm90aW9uYWwFFG5ld1Bvc2l0aW9uTHN0VXBkQ1BGCQEJdXBkYXRlQW1tCAUWcXVvdGVBc3NldFJlc2VydmVBZnRlcgUVYmFzZUFzc2V0UmVzZXJ2ZUFmdGVyBRZ0b3RhbFBvc2l0aW9uU2l6ZUFmdGVyBRlvcGVuSW50ZXJlc3ROb3Rpb25hbEFmdGVyCQBlAgkBFXRvdGFsTG9uZ1Bvc2l0aW9uU2l6ZQADCQBmAgUPbmV3UG9zaXRpb25TaXplAAAJAQNhYnMBBRVleGNoYW5nZWRQb3NpdGlvblNpemUAAAkAZQIJARZ0b3RhbFNob3J0UG9zaXRpb25TaXplAAMJAGYCAAAFD25ld1Bvc2l0aW9uU2l6ZQkBA2FicwEFFWV4Y2hhbmdlZFBvc2l0aW9uU2l6ZQAACQBlAgkBEG9wZW5JbnRlcmVzdExvbmcAAwkAZgIFD25ld1Bvc2l0aW9uU2l6ZQAABRFvcGVuTm90aW9uYWxEZWx0YQAACQBlAgkBEW9wZW5JbnRlcmVzdFNob3J0AAMJAGYCAAAFD25ld1Bvc2l0aW9uU2l6ZQURb3Blbk5vdGlvbmFsRGVsdGEAAAkBCHdpdGhkcmF3AggFAWkGY2FsbGVyBQ9mZWVUb0xpcXVpZGF0b3IJAQ11cGRhdGVCYWxhbmNlAQUNbmV3QW1tQmFsYW5jZQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgQNJHQwNzc3OTc3ODI5MgkBFWludGVybmFsQ2xvc2VQb3NpdGlvbgIFB190cmFkZXIHBAJ4MQgFDSR0MDc3Nzk3NzgyOTICXzEEB2JhZERlYnQIBQ0kdDA3Nzc5Nzc4MjkyAl8yBAJ4MggFDSR0MDc3Nzk3NzgyOTICXzMEAngzCAUNJHQwNzc3OTc3ODI5MgJfNAQWcXVvdGVBc3NldFJlc2VydmVBZnRlcggFDSR0MDc3Nzk3NzgyOTICXzUEFWJhc2VBc3NldFJlc2VydmVBZnRlcggFDSR0MDc3Nzk3NzgyOTICXzYEFnRvdGFsUG9zaXRpb25TaXplQWZ0ZXIIBQ0kdDA3Nzc5Nzc4MjkyAl83BBlvcGVuSW50ZXJlc3ROb3Rpb25hbEFmdGVyCAUNJHQwNzc3OTc3ODI5MgJfOAQZZXhjaGFuZ2VkUXVvdGVBc3NldEFtb3VudAgFDSR0MDc3Nzk3NzgyOTICXzkEDnRvdGFsTG9uZ0FmdGVyCAUNJHQwNzc3OTc3ODI5MgNfMTAED3RvdGFsU2hvcnRBZnRlcggFDSR0MDc3Nzk3NzgyOTIDXzExBBp0b3RhbExvbmdPcGVuSW50ZXJlc3RBZnRlcggFDSR0MDc3Nzk3NzgyOTIDXzEyBBt0b3RhbFNob3J0T3BlbkludGVyZXN0QWZ0ZXIIBQ0kdDA3Nzc5Nzc4MjkyA18xMwQSbGlxdWlkYXRpb25QZW5hbHR5CQEEbXVsZAIFGWV4Y2hhbmdlZFF1b3RlQXNzZXRBbW91bnQJARNsaXF1aWRhdGlvbkZlZVJhdGlvAAQPZmVlVG9MaXF1aWRhdG9yCQBpAgUSbGlxdWlkYXRpb25QZW5hbHR5AAIECmZlZVRvVmF1bHQJAGUCBRJsaXF1aWRhdGlvblBlbmFsdHkFD2ZlZVRvTGlxdWlkYXRvcgQKYW1tQmFsYW5jZQkAZQIJAQhjYmFsYW5jZQAFEmxpcXVpZGF0aW9uUGVuYWx0eQQNJHQwNzg3MDA3ODgyOQMJAGYCAAAFCmFtbUJhbGFuY2UJAJQKAgAACQEDYWJzAQUKYW1tQmFsYW5jZQkAlAoCBQphbW1CYWxhbmNlAAAEDW5ld0FtbUJhbGFuY2UIBQ0kdDA3ODcwMDc4ODI5Al8xBAN4MTEIBQ0kdDA3ODcwMDc4ODI5Al8yBA0kdDA3ODgzNzc4ODkxCQETZ2V0Qm9ycm93ZWRCeVRyYWRlcgEFB190cmFkZXIECGJvcnJvd2VkCAUNJHQwNzg4Mzc3ODg5MQJfMQQHYXNzZXRJZAgFDSR0MDc4ODM3Nzg4OTECXzIEFWRvTGlxdWlkYXRlQ29sbGF0ZXJhbAMJAGYCBQhib3Jyb3dlZAAABA9yZWFsaXplQW5kQ2xvc2UJAPwHBAkBEWNvbGxhdGVyYWxBZGRyZXNzAAIYcmVhbGl6ZVBhcnRpYWxseUFuZENsb3NlCQDMCAIFB190cmFkZXIJAMwIAgAACQDMCAIFB2Fzc2V0SWQFA25pbAUDbmlsAwkAAAIFD3JlYWxpemVBbmRDbG9zZQUPcmVhbGl6ZUFuZENsb3NlBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4FA25pbAMJAAACBRVkb0xpcXVpZGF0ZUNvbGxhdGVyYWwFFWRvTGlxdWlkYXRlQ29sbGF0ZXJhbAQBeAMJAGYCBQdiYWREZWJ0AAAEC2xvY2tCYWREZWJ0CQD8BwQJAQx2YXVsdEFkZHJlc3MAAhVleGNoYW5nZUZyZWVBbmRMb2NrZWQJAMwIAgUHYmFkRGVidAUDbmlsBQNuaWwDCQAAAgULbG9ja0JhZERlYnQFC2xvY2tCYWREZWJ0BQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4FA25pbAMJAAACBQF4BQF4BAd1bnN0YWtlCQD8BwQJAQx2YXVsdEFkZHJlc3MAAg53aXRoZHJhd0xvY2tlZAkAzAgCBRJsaXF1aWRhdGlvblBlbmFsdHkFA25pbAUDbmlsAwkAAAIFB3Vuc3Rha2UFB3Vuc3Rha2UEEGRlcG9zaXRJbnN1cmFuY2UJAPwHBAkBDHZhdWx0QWRkcmVzcwACB2FkZEZyZWUFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBCnF1b3RlQXNzZXQABQpmZWVUb1ZhdWx0BQNuaWwDCQAAAgUQZGVwb3NpdEluc3VyYW5jZQUQZGVwb3NpdEluc3VyYW5jZQQObm90aWZ5Tm90aW9uYWwJAPwHBAkBDG1pbmVyQWRkcmVzcwACDm5vdGlmeU5vdGlvbmFsCQDMCAIFB190cmFkZXIJAMwIAgAABQNuaWwFA25pbAMJAAACBQ5ub3RpZnlOb3Rpb25hbAUObm90aWZ5Tm90aW9uYWwJAM4IAgkAzggCCQDOCAIJAQ5kZWxldGVQb3NpdGlvbgEFB190cmFkZXIJAQl1cGRhdGVBbW0IBRZxdW90ZUFzc2V0UmVzZXJ2ZUFmdGVyBRViYXNlQXNzZXRSZXNlcnZlQWZ0ZXIFFnRvdGFsUG9zaXRpb25TaXplQWZ0ZXIFGW9wZW5JbnRlcmVzdE5vdGlvbmFsQWZ0ZXIFDnRvdGFsTG9uZ0FmdGVyBQ90b3RhbFNob3J0QWZ0ZXIFGnRvdGFsTG9uZ09wZW5JbnRlcmVzdEFmdGVyBRt0b3RhbFNob3J0T3BlbkludGVyZXN0QWZ0ZXIJAQh3aXRoZHJhdwIIBQFpBmNhbGxlcgUPZmVlVG9MaXF1aWRhdG9yCQENdXBkYXRlQmFsYW5jZQEFDW5ld0FtbUJhbGFuY2UJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEKcGF5RnVuZGluZwAEBHN5bmMJAPwHBAUEdGhpcwIZc3luY1Rlcm1pbmFsUHJpY2VUb09yYWNsZQUDbmlsBQNuaWwDCQAAAgUEc3luYwUEc3luYwQVZnVuZGluZ0Jsb2NrVGltZXN0YW1wCQEZbmV4dEZ1bmRpbmdCbG9ja1RpbWVzdGFtcAADAwMJAGYCBRVmdW5kaW5nQmxvY2tUaW1lc3RhbXAIBQlsYXN0QmxvY2sJdGltZXN0YW1wBgkBASEBCQELaW5pdGlhbGl6ZWQABgkBBnBhdXNlZAAJAAIBCQCsAgIJAKwCAgkArAICAiFJbnZhbGlkIGZ1bmRpbmcgYmxvY2sgdGltZXN0YW1wOiAJAKQDAQgFCWxhc3RCbG9jawl0aW1lc3RhbXACAyA8IAkApAMBBRVmdW5kaW5nQmxvY2tUaW1lc3RhbXAED3VuZGVybHlpbmdQcmljZQkBDmdldE9yYWNsZVByaWNlAAQNJHQwODA3NjM4MDgyNQkBCmdldEZ1bmRpbmcABBRzaG9ydFByZW1pdW1GcmFjdGlvbggFDSR0MDgwNzYzODA4MjUCXzEEE2xvbmdQcmVtaXVtRnJhY3Rpb24IBQ0kdDA4MDc2MzgwODI1Al8yCQENdXBkYXRlRnVuZGluZwUJAGQCBRVmdW5kaW5nQmxvY2tUaW1lc3RhbXAJARRmdW5kaW5nUGVyaW9kU2Vjb25kcwAJAGQCCQEjbGF0ZXN0TG9uZ0N1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24ABRNsb25nUHJlbWl1bUZyYWN0aW9uCQBkAgkBJGxhdGVzdFNob3J0Q3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgAFFHNob3J0UHJlbWl1bUZyYWN0aW9uCQEEZGl2ZAIFE2xvbmdQcmVtaXVtRnJhY3Rpb24FD3VuZGVybHlpbmdQcmljZQkBBGRpdmQCBRRzaG9ydFByZW1pdW1GcmFjdGlvbgUPdW5kZXJseWluZ1ByaWNlCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBGXN5bmNUZXJtaW5hbFByaWNlVG9PcmFjbGUABAdfcXRBc3RSCQEGcXRBc3RSAAQHX2JzQXN0UgkBBmJzQXN0UgAEDSR0MDgxMjU3ODEzOTIJARRnZXRTeW5jVGVybWluYWxQcmljZQMJAQ5nZXRPcmFjbGVQcmljZQAFB19xdEFzdFIFB19ic0FzdFIEE25ld1F1b3RlQXNzZXRXZWlnaHQIBQ0kdDA4MTI1NzgxMzkyAl8xBBJuZXdCYXNlQXNzZXRXZWlnaHQIBQ0kdDA4MTI1NzgxMzkyAl8yBA1tYXJnaW5Ub1ZhdWx0CAUNJHQwODEyNTc4MTM5MgJfMwQNZG9FeGNoYW5nZVBuTAMJAQIhPQIFDW1hcmdpblRvVmF1bHQAAAQNZG9FeGNoYW5nZVBuTAkA/AcECQEMdmF1bHRBZGRyZXNzAAIVZXhjaGFuZ2VGcmVlQW5kTG9ja2VkCQDMCAIFDW1hcmdpblRvVmF1bHQFA25pbAUDbmlsAwkAAAIFDWRvRXhjaGFuZ2VQbkwFDWRvRXhjaGFuZ2VQbkwFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgUDbmlsAwkAAAIFDWRvRXhjaGFuZ2VQbkwFDWRvRXhjaGFuZ2VQbkwJAM4IAgkBEHVwZGF0ZUFtbVdlaWdodHMCBRNuZXdRdW90ZUFzc2V0V2VpZ2h0BRJuZXdCYXNlQXNzZXRXZWlnaHQJAQphcHBlbmRUd2FwAQkBBGRpdmQCCQEEbXVsZAIFB19xdEFzdFIFE25ld1F1b3RlQXNzZXRXZWlnaHQJAQRtdWxkAgUHX2JzQXN0UgUSbmV3QmFzZUFzc2V0V2VpZ2h0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBJ3ZpZXdfY2FsY1JlbWFpbk1hcmdpbldpdGhGdW5kaW5nUGF5bWVudAEHX3RyYWRlcgQEc3luYwkA/AcEBQR0aGlzAhlzeW5jVGVybWluYWxQcmljZVRvT3JhY2xlBQNuaWwFA25pbAMJAAACBQRzeW5jBQRzeW5jBA0kdDA4MTk2MTgyMDYyCQELZ2V0UG9zaXRpb24BBQdfdHJhZGVyBAxwb3NpdGlvblNpemUIBQ0kdDA4MTk2MTgyMDYyAl8xBA5wb3NpdGlvbk1hcmdpbggFDSR0MDgxOTYxODIwNjICXzIEA3BvbggFDSR0MDgxOTYxODIwNjICXzMEEXBvc2l0aW9uTHN0VXBkQ1BGCAUNJHQwODE5NjE4MjA2MgJfNAQNJHQwODIwNjU4MjE2NgkBI2dldFBvc2l0aW9uTm90aW9uYWxBbmRVbnJlYWxpemVkUG5sAgUHX3RyYWRlcgUPUE5MX09QVElPTl9TUE9UBBBwb3NpdGlvbk5vdGlvbmFsCAUNJHQwODIwNjU4MjE2NgJfMQQNdW5yZWFsaXplZFBubAgFDSR0MDgyMDY1ODIxNjYCXzIEDSR0MDgyMTY5ODIzNDEJASJjYWxjUmVtYWluTWFyZ2luV2l0aEZ1bmRpbmdQYXltZW50BAUMcG9zaXRpb25TaXplBQ5wb3NpdGlvbk1hcmdpbgURcG9zaXRpb25Mc3RVcGRDUEYFDXVucmVhbGl6ZWRQbmwEDHJlbWFpbk1hcmdpbggFDSR0MDgyMTY5ODIzNDECXzEEB2JhZERlYnQIBQ0kdDA4MjE2OTgyMzQxAl8yBA5mdW5kaW5nUGF5bWVudAgFDSR0MDgyMTY5ODIzNDECXzMJAAIBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkBAXMBBQxyZW1haW5NYXJnaW4JAQFzAQUOZnVuZGluZ1BheW1lbnQJAQFzAQkBDmdldE1hcmdpblJhdGlvAQUHX3RyYWRlcgkBAXMBBQ11bnJlYWxpemVkUG5sCQEBcwEFB2JhZERlYnQJAQFzAQUQcG9zaXRpb25Ob3Rpb25hbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARV2aWV3X2dldFBlZ0FkanVzdENvc3QBBl9wcmljZQQHX3F0QXN0UgkBBnF0QXN0UgAEB19ic0FzdFIJAQZic0FzdFIABAZyZXN1bHQJARRnZXRTeW5jVGVybWluYWxQcmljZQMFBl9wcmljZQUHX3F0QXN0UgUHX2JzQXN0UgkAAgEJAKQDAQgFBnJlc3VsdAJfMwFpARh2aWV3X2dldFRlcm1pbmFsQW1tUHJpY2UABA0kdDA4Mjc1NzgyODM4CQETZ2V0VGVybWluYWxBbW1TdGF0ZQAEGXRlcm1pbmFsUXVvdGVBc3NldFJlc2VydmUIBQ0kdDA4Mjc1NzgyODM4Al8xBBh0ZXJtaW5hbEJhc2VBc3NldFJlc2VydmUIBQ0kdDA4Mjc1NzgyODM4Al8yBAVwcmljZQkBBGRpdmQCCQEEbXVsZAIFGXRlcm1pbmFsUXVvdGVBc3NldFJlc2VydmUJAQZxdEFzdFcACQEEbXVsZAIFGHRlcm1pbmFsQmFzZUFzc2V0UmVzZXJ2ZQkBBmJzQXN0VwAJAAIBCQCkAwEFBXByaWNlAWkBD3ZpZXdfZ2V0RnVuZGluZwAED3VuZGVybHlpbmdQcmljZQkBDmdldE9yYWNsZVByaWNlAAQNJHQwODMwNTM4MzExNQkBCmdldEZ1bmRpbmcABBRzaG9ydFByZW1pdW1GcmFjdGlvbggFDSR0MDgzMDUzODMxMTUCXzEEE2xvbmdQcmVtaXVtRnJhY3Rpb24IBQ0kdDA4MzA1MzgzMTE1Al8yBAtsb25nRnVuZGluZwkBBGRpdmQCBRNsb25nUHJlbWl1bUZyYWN0aW9uBQ91bmRlcmx5aW5nUHJpY2UEDHNob3J0RnVuZGluZwkBBGRpdmQCBRRzaG9ydFByZW1pdW1GcmFjdGlvbgUPdW5kZXJseWluZ1ByaWNlCQACAQkArAICCQCsAgIJAKwCAgkBAXMBBQtsb25nRnVuZGluZwkBAXMBBQxzaG9ydEZ1bmRpbmcJAQFzAQkBEGdldFR3YXBTcG90UHJpY2UACQEBcwEJAQ5nZXRPcmFjbGVQcmljZQABaQEYdmlld19nZXRCb3Jyb3dlZEJ5VHJhZGVyAQdfdHJhZGVyBA0kdDA4MzQwMTgzNDU1CQETZ2V0Qm9ycm93ZWRCeVRyYWRlcgEFB190cmFkZXIECGJvcnJvd2VkCAUNJHQwODM0MDE4MzQ1NQJfMQQHYXNzZXRJZAgFDSR0MDgzNDAxODM0NTUCXzIJAAIBCQCsAgIJAQFzAQUIYm9ycm93ZWQFB2Fzc2V0SWQBaQEQY29tcHV0ZVNwb3RQcmljZQAEBnJlc3VsdAkBDGdldFNwb3RQcmljZQAJAJQKAgUDbmlsBQZyZXN1bHQBaQEfY29tcHV0ZUZlZUZvclRyYWRlcldpdGhBcnRpZmFjdAIHX3RyYWRlcgtfYXJ0aWZhY3RJZAQGcmVzdWx0CQEYZ2V0Rm9yVHJhZGVyV2l0aEFydGlmYWN0AgUHX3RyYWRlcgULX2FydGlmYWN0SWQJAJQKAgUDbmlsBQZyZXN1bHQBAnR4AQZ2ZXJpZnkACQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACQEOYWRtaW5QdWJsaWNLZXkAI/MSvA==", "height": 2410491, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: AhGER8w5c4Pcd3ASemMyeoCk6Wed59h5CYtCawnEtM1g Next: 55a9BMiBtVZw1LcNSVCNgmPnqSwbnVDoS2VJij6DDpUd Diff:
OldNewDifferences
55
66 let b = "k_ora_block_key"
77
8-let c = "k_ora"
9-
10-let d = "k_balance"
11-
12-let e = "k_sequence"
13-
14-let f = "k_positionSize"
15-
16-let g = "k_positionMargin"
17-
18-let h = "k_positionOpenNotional"
19-
20-let i = "k_positionFraction"
21-
22-let j = "k_positionSequence"
23-
24-let k = "k_positionAsset"
25-
26-let l = "k_initialized"
27-
28-let m = "k_paused"
29-
30-let n = "k_closeOnly"
31-
32-let o = "k_fee"
33-
34-let p = "k_fundingPeriod"
35-
36-let q = "k_initMarginRatio"
37-
38-let r = "k_mmr"
39-
40-let s = "k_liquidationFeeRatio"
41-
42-let t = "k_partLiquidationRatio"
43-
44-let u = "k_spreadLimit"
45-
46-let v = "k_maxPriceImpact"
47-
48-let w = "k_maxPriceSpread"
49-
50-let x = "k_maxOpenNotional"
51-
52-let y = "k_feeToStakersPercent"
53-
54-let z = "k_maxOracleDelay"
55-
56-let A = "k_lastDataStr"
57-
58-let B = "k_lastMinuteId"
59-
60-let C = "k_twapDataLastCumulativePrice"
61-
62-let D = "k_twapDataLastPrice"
63-
64-let E = "k_twapDataPreviousMinuteId"
65-
66-let F = "k_latestLongPremiumFraction"
67-
68-let G = "k_latestShortPremiumFraction"
69-
70-let H = "k_nextFundingBlockMinTimestamp"
71-
72-let I = "k_longFundingRate"
73-
74-let J = "k_shortFundingRate"
75-
76-let K = "k_qtAstR"
77-
78-let L = "k_bsAstR"
79-
80-let M = "k_qtAstW"
81-
82-let N = "k_bsAstW"
83-
84-let O = "k_totalPositionSize"
85-
86-let P = "k_totalLongPositionSize"
87-
88-let Q = "k_totalShortPositionSize"
89-
90-let R = "k_openInterestNotional"
91-
92-let S = "k_openInterestShort"
93-
94-let T = "k_openInterestLong"
95-
96-let U = "k_coordinatorAddress"
97-
98-let V = "k_vault_address"
99-
100-let W = "k_admin_address"
101-
102-let X = "k_admin_public_key"
103-
104-let Y = "k_quote_asset"
105-
106-let Z = "k_quote_staking"
107-
108-let aa = "k_staking_address"
109-
110-let ab = "k_miner_address"
111-
112-let ac = "k_orders_address"
113-
114-let ad = "k_referral_address"
115-
116-let ae = "k_collateral_address"
117-
118-let af = "k_exchange_address"
119-
120-let ag = "k_nft_manager_address"
121-
122-let ah = "k_trader_market_asset_collateral"
123-
124-func ai (aj,ak) = ((aj + "_") + ak)
125-
126-
127-func al () = valueOrErrorMessage(addressFromString(getStringValue(this, U)), "Coordinator not set")
128-
129-
130-func am () = addressFromString(getStringValue(al(), W))
131-
132-
133-func an () = fromBase58String(getStringValue(al(), X))
134-
135-
136-func ao () = fromBase58String(getStringValue(al(), Y))
137-
138-
139-func ap () = valueOrErrorMessage(addressFromString(getStringValue(al(), Z)), "Quote asset staking not set")
140-
141-
142-func aq () = valueOrErrorMessage(addressFromString(getStringValue(al(), aa)), "Staking not set")
143-
144-
145-func ar () = valueOrErrorMessage(addressFromString(getStringValue(al(), V)), "Vault not set")
146-
147-
148-func as () = valueOrErrorMessage(addressFromString(getStringValue(al(), ab)), "Miner not set")
149-
150-
151-func at () = valueOrErrorMessage(addressFromString(getStringValue(al(), ac)), "Orders not set")
152-
153-
154-func au () = valueOrErrorMessage(addressFromString(getStringValue(al(), ad)), "Referral not set")
155-
156-
157-func av () = valueOrErrorMessage(addressFromString(getStringValue(al(), ag)), "NFT Manager not set")
158-
159-
160-func aw () = valueOrErrorMessage(addressFromString(getStringValue(al(), ae)), "Collateral Manager not set")
161-
162-
163-func ax () = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(al(), af), "No swap address")), "Invalid swap address")
164-
165-
166-let ay = "k_whitelist_asset"
167-
168-func az (aA) = valueOrElse(getBoolean(aw(), ai(ay, aA)), false)
169-
170-
171-let aB = "k_token_param"
172-
173-let aC = "k_token_type"
174-
175-let aD = "fee_reduction"
176-
177-let aE = 1
178-
179-let aF = 2
180-
181-let aG = 15
182-
183-let aH = 15
184-
185-let aI = 1000
186-
187-let aJ = 6
188-
189-let aK = (1 * (((((10 * 10) * 10) * 10) * 10) * 10))
190-
191-let aL = (86400 * aK)
192-
193-let aM = 100
194-
195-let aN = 1
196-
197-let aO = 2
198-
199-func aP (aQ) = (toString(aQ) + ",")
200-
201-
202-func aR (aQ,aS) = fraction(aQ, aK, aS, HALFEVEN)
203-
204-
205-func aT (aQ,aS) = fraction(aQ, aS, aK, HALFEVEN)
206-
207-
208-func aU (aQ) = sqrt(aQ, aJ, aJ, HALFEVEN)
209-
210-
211-func aV (aQ,aS) = pow(aQ, aJ, aS, aJ, aJ, HALFEVEN)
212-
213-
214-func aW (aQ,aS) = fraction(aQ, toBigInt(aK), aS, HALFEVEN)
215-
216-
217-func aX (aQ,aS) = fraction(aQ, aS, toBigInt(aK), HALFEVEN)
218-
219-
220-func aY (aQ) = sqrtBigInt(aQ, aJ, aJ, HALFEVEN)
221-
222-
223-func aZ (aQ,aS) = pow(aQ, aJ, aS, aJ, aJ, HALFEVEN)
224-
225-
226-func ba (aQ) = if ((aQ > 0))
227- then aQ
228- else -(aQ)
229-
230-
231-func bb (aQ,aS) = if ((aQ >= aS))
232- then aQ
233- else aS
234-
235-
236-func bc (bd) = {
237- func be (bf,bg) = ((bf + bg) + ",")
238-
239- let bh = {
240- let bi = bd
241- let bj = size(bi)
242- let bk = ""
243- func bl (bm,bn) = if ((bn >= bj))
244- then bm
245- else be(bm, bi[bn])
246-
247- func bo (bm,bn) = if ((bn >= bj))
248- then bm
8+let c = "k_ora_open_key"
9+
10+let d = "k_ora"
11+
12+let e = "k_balance"
13+
14+let f = "k_sequence"
15+
16+let g = "k_positionSize"
17+
18+let h = "k_positionMargin"
19+
20+let i = "k_positionOpenNotional"
21+
22+let j = "k_positionFraction"
23+
24+let k = "k_positionSequence"
25+
26+let l = "k_positionAsset"
27+
28+let m = "k_positionFee"
29+
30+let n = "k_initialized"
31+
32+let o = "k_paused"
33+
34+let p = "k_closeOnly"
35+
36+let q = "k_fee"
37+
38+let r = "k_fundingPeriod"
39+
40+let s = "k_initMarginRatio"
41+
42+let t = "k_mmr"
43+
44+let u = "k_liquidationFeeRatio"
45+
46+let v = "k_partLiquidationRatio"
47+
48+let w = "k_spreadLimit"
49+
50+let x = "k_maxPriceImpact"
51+
52+let y = "k_maxPriceSpread"
53+
54+let z = "k_maxOpenNotional"
55+
56+let A = "k_feeToStakersPercent"
57+
58+let B = "k_maxOracleDelay"
59+
60+let C = "k_lastDataStr"
61+
62+let D = "k_lastMinuteId"
63+
64+let E = "k_twapDataLastCumulativePrice"
65+
66+let F = "k_twapDataLastPrice"
67+
68+let G = "k_twapDataPreviousMinuteId"
69+
70+let H = "k_latestLongPremiumFraction"
71+
72+let I = "k_latestShortPremiumFraction"
73+
74+let J = "k_nextFundingBlockMinTimestamp"
75+
76+let K = "k_longFundingRate"
77+
78+let L = "k_shortFundingRate"
79+
80+let M = "k_qtAstR"
81+
82+let N = "k_bsAstR"
83+
84+let O = "k_qtAstW"
85+
86+let P = "k_bsAstW"
87+
88+let Q = "k_totalPositionSize"
89+
90+let R = "k_totalLongPositionSize"
91+
92+let S = "k_totalShortPositionSize"
93+
94+let T = "k_openInterestNotional"
95+
96+let U = "k_openInterestShort"
97+
98+let V = "k_openInterestLong"
99+
100+let W = "k_coordinatorAddress"
101+
102+let X = "k_vault_address"
103+
104+let Y = "k_admin_address"
105+
106+let Z = "k_admin_public_key"
107+
108+let aa = "k_quote_asset"
109+
110+let ab = "k_quote_staking"
111+
112+let ac = "k_staking_address"
113+
114+let ad = "k_miner_address"
115+
116+let ae = "k_orders_address"
117+
118+let af = "k_referral_address"
119+
120+let ag = "k_collateral_address"
121+
122+let ah = "k_exchange_address"
123+
124+let ai = "k_nft_manager_address"
125+
126+let aj = "k_trader_market_asset_collateral"
127+
128+func ak (al,am) = ((al + "_") + am)
129+
130+
131+func an () = valueOrErrorMessage(addressFromString(getStringValue(this, W)), "Coordinator not set")
132+
133+
134+func ao () = addressFromString(getStringValue(an(), Y))
135+
136+
137+func ap () = fromBase58String(getStringValue(an(), Z))
138+
139+
140+func aq () = fromBase58String(getStringValue(an(), aa))
141+
142+
143+func ar () = valueOrErrorMessage(addressFromString(getStringValue(an(), ab)), "Quote asset staking not set")
144+
145+
146+func as () = valueOrErrorMessage(addressFromString(getStringValue(an(), ac)), "Staking not set")
147+
148+
149+func at () = valueOrErrorMessage(addressFromString(getStringValue(an(), X)), "Vault not set")
150+
151+
152+func au () = valueOrErrorMessage(addressFromString(getStringValue(an(), ad)), "Miner not set")
153+
154+
155+func av () = valueOrErrorMessage(addressFromString(getStringValue(an(), ae)), "Orders not set")
156+
157+
158+func aw () = valueOrErrorMessage(addressFromString(getStringValue(an(), af)), "Referral not set")
159+
160+
161+func ax () = valueOrErrorMessage(addressFromString(getStringValue(an(), ai)), "NFT Manager not set")
162+
163+
164+func ay () = valueOrErrorMessage(addressFromString(getStringValue(an(), ag)), "Collateral Manager not set")
165+
166+
167+func az () = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(an(), ah), "No swap address")), "Invalid swap address")
168+
169+
170+let aA = "k_whitelist_asset"
171+
172+func aB (aC) = valueOrElse(getBoolean(ay(), ak(aA, aC)), false)
173+
174+
175+let aD = "k_token_param"
176+
177+let aE = "k_token_type"
178+
179+let aF = "fee_reduction"
180+
181+let aG = 1
182+
183+let aH = 2
184+
185+let aI = 15
186+
187+let aJ = 15
188+
189+let aK = 1000
190+
191+let aL = 6
192+
193+let aM = (1 * (((((10 * 10) * 10) * 10) * 10) * 10))
194+
195+let aN = (86400 * aM)
196+
197+let aO = 100
198+
199+let aP = 1
200+
201+let aQ = 2
202+
203+func aR (aS) = (toString(aS) + ",")
204+
205+
206+func aT (aS,aU) = fraction(aS, aM, aU, HALFEVEN)
207+
208+
209+func aV (aS,aU) = fraction(aS, aU, aM, HALFEVEN)
210+
211+
212+func aW (aS) = sqrt(aS, aL, aL, HALFEVEN)
213+
214+
215+func aX (aS,aU) = pow(aS, aL, aU, aL, aL, HALFEVEN)
216+
217+
218+func aY (aS,aU) = fraction(aS, toBigInt(aM), aU, HALFEVEN)
219+
220+
221+func aZ (aS,aU) = fraction(aS, aU, toBigInt(aM), HALFEVEN)
222+
223+
224+func ba (aS) = sqrtBigInt(aS, aL, aL, HALFEVEN)
225+
226+
227+func bb (aS,aU) = pow(aS, aL, aU, aL, aL, HALFEVEN)
228+
229+
230+func bc (aS) = if ((aS > 0))
231+ then aS
232+ else -(aS)
233+
234+
235+func bd (aS,aU) = if ((aS >= aU))
236+ then aS
237+ else aU
238+
239+
240+func be (bf) = {
241+ func bg (bh,bi) = ((bh + bi) + ",")
242+
243+ let bj = {
244+ let bk = bf
245+ let bl = size(bk)
246+ let bm = ""
247+ func bn (bo,bp) = if ((bp >= bl))
248+ then bo
249+ else bg(bo, bk[bp])
250+
251+ func bq (bo,bp) = if ((bp >= bl))
252+ then bo
249253 else throw("List size exceeds 20")
250254
251- bo(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bk, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
255+ bq(bn(bn(bn(bn(bn(bn(bn(bn(bn(bn(bn(bn(bn(bn(bn(bn(bn(bn(bn(bn(bm, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
252256 }
253- let bp = dropRight(bh, 1)
254- let bq = if ((take(bp, 1) == ","))
255- then drop(bp, 1)
256- else bp
257- bq
258- }
259-
260-
261-func br (bs) = split(bs, ",")
262-
263-
264-func bt (bd,bu,bv) = if ((size(bd) > bu))
265- then (removeByIndex(bd, 0) :+ bv)
266- else (bd :+ bv)
267-
268-
269-func bw (bx) = valueOrErrorMessage(getInteger(this, bx), ("no value for " + bx))
270-
271-
272-func by (bx,bz) = valueOrElse(getInteger(this, bx), bz)
273-
274-
275-func bA (ak,aj) = {
276- let bg = valueOrErrorMessage(getString(ak, aj), ("No value for key " + aj))
277- bg
278- }
279-
280-
281-func bB (ak,aj) = {
282- let bg = valueOrErrorMessage(getInteger(ak, aj), ("No value for key " + aj))
283- bg
284- }
285-
286-
287-func bC () = bw(d)
288-
289-
290-func bD () = bw(o)
291-
292-
293-func bE () = bw(q)
294-
295-
296-func bF () = bw(K)
297-
298-
299-func bG () = bw(L)
300-
301-
302-func bH () = by(M, aK)
303-
304-
305-func bI () = by(N, aK)
306-
307-
308-func bJ () = bw(O)
309-
310-
311-func bK () = bw(R)
312-
313-
314-func bL () = bw(S)
315-
316-
317-func bM () = bw(T)
318-
319-
320-func bN () = bw(H)
321-
322-
323-func bO () = bw(p)
324-
325-
326-func bP () = (bO() * aK)
327-
328-
329-func bQ () = (bO() * aI)
330-
331-
332-func bR () = bw(r)
333-
334-
335-func bS () = bw(s)
336-
337-
338-func bT () = bw(t)
339-
340-
341-func bU () = bw(u)
342-
343-
344-func bV () = bw(v)
345-
346-
347-func bW () = bw(w)
348-
349-
350-func bX () = bw(x)
351-
352-
353-func bY () = bw(F)
354-
355-
356-func bZ () = bw(G)
357-
358-
359-func ca () = bw(Q)
360-
361-
362-func cb () = bw(P)
363-
364-
365-func cc () = by(e, 0)
366-
367-
368-func cd () = bw(y)
369-
370-
371-func ce () = bw(z)
372-
373-
374-func cf (cg) = valueOrElse(getString(at(), "k_sender"), toString(cg.caller))
375-
376-
377-func ch (ci,cj,ck) = {
378- let cl = (ci - cj)
379- if (if (ck)
380- then (0 > cl)
257+ let br = dropRight(bj, 1)
258+ let bs = if ((take(br, 1) == ","))
259+ then drop(br, 1)
260+ else br
261+ bs
262+ }
263+
264+
265+func bt (bu) = split(bu, ",")
266+
267+
268+func bv (bf,bw,bx) = if ((size(bf) > bw))
269+ then (removeByIndex(bf, 0) :+ bx)
270+ else (bf :+ bx)
271+
272+
273+func by (bz) = valueOrErrorMessage(getInteger(this, bz), ("no value for " + bz))
274+
275+
276+func bA (bz,bB) = valueOrElse(getInteger(this, bz), bB)
277+
278+
279+func bC (am,al) = {
280+ let bi = valueOrErrorMessage(getString(am, al), ("No value for key " + al))
281+ bi
282+ }
283+
284+
285+func bD (am,al) = {
286+ let bi = valueOrErrorMessage(getInteger(am, al), ("No value for key " + al))
287+ bi
288+ }
289+
290+
291+func bE () = by(e)
292+
293+
294+func bF () = by(q)
295+
296+
297+func bG () = by(s)
298+
299+
300+func bH () = by(M)
301+
302+
303+func bI () = by(N)
304+
305+
306+func bJ () = bA(O, aM)
307+
308+
309+func bK () = bA(P, aM)
310+
311+
312+func bL () = by(Q)
313+
314+
315+func bM () = by(T)
316+
317+
318+func bN () = by(U)
319+
320+
321+func bO () = by(V)
322+
323+
324+func bP () = by(J)
325+
326+
327+func bQ () = by(r)
328+
329+
330+func bR () = (bQ() * aM)
331+
332+
333+func bS () = (bQ() * aK)
334+
335+
336+func bT () = by(t)
337+
338+
339+func bU () = by(u)
340+
341+
342+func bV () = by(v)
343+
344+
345+func bW () = by(w)
346+
347+
348+func bX () = by(x)
349+
350+
351+func bY () = by(y)
352+
353+
354+func bZ () = by(z)
355+
356+
357+func ca () = by(H)
358+
359+
360+func cb () = by(I)
361+
362+
363+func cc () = by(S)
364+
365+
366+func cd () = by(R)
367+
368+
369+func ce () = bA(f, 0)
370+
371+
372+func cf () = by(A)
373+
374+
375+func cg () = by(B)
376+
377+
378+func ch (ci) = valueOrElse(getString(av(), "k_sender"), toString(ci.caller))
379+
380+
381+func cj (ck,cl,cm) = {
382+ let cn = (ck - cl)
383+ if (if (cm)
384+ then (0 > cn)
381385 else false)
382- then throw("Invalid margin")
383- else if (if (!(ck))
384- then (cl >= 0)
386+ then throw(((("Invalid margin: " + toString(ck)) + " < ") + toString(cl)))
387+ else if (if (!(cm))
388+ then (cn >= 0)
385389 else false)
386- then throw("Invalid margin")
390+ then throw(((("Invalid margin: " + toString(ck)) + " > ") + toString(cl)))
387391 else true
388392 }
389393
390394
391-func cm (cn) = if ((cn == 0))
395+func co (cp) = if ((cp == 0))
392396 then throw("Should not be called with _positionSize == 0")
393- else if ((cn > 0))
394- then bY()
395- else bZ()
396-
397-
398-func co (cp) = {
399- let cq = getInteger(this, ai(f, cp))
400- let cr = cq
401- if ($isInstanceOf(cr, "Int"))
397+ else if ((cp > 0))
398+ then ca()
399+ else cb()
400+
401+
402+func cq (cr) = {
403+ let cs = getInteger(this, ak(g, cr))
404+ let ct = cs
405+ if ($isInstanceOf(ct, "Int"))
402406 then {
403- let cs = cr
404- $Tuple4(cs, getIntegerValue(this, ai(g, cp)), getIntegerValue(this, ai(h, cp)), getIntegerValue(this, ai(i, cp)))
407+ let cu = ct
408+ $Tuple4(cu, getIntegerValue(this, ak(h, cr)), getIntegerValue(this, ak(i, cr)), getIntegerValue(this, ak(j, cr)))
405409 }
406410 else $Tuple4(0, 0, 0, 0)
407411 }
408412
409413
410-func ct (cp) = {
411- let cu = getString(this, ai(k, cp))
412- let cr = cu
413- if ($isInstanceOf(cr, "String"))
414+func cv (cr) = {
415+ let cw = getString(this, ak(l, cr))
416+ let ct = cw
417+ if ($isInstanceOf(ct, "String"))
414418 then {
415- let cv = cr
416- cv
417- }
418- else toBase58String(ao())
419- }
420-
421-
422-func cw (cp) = if ((co(cp)._1 == 0))
419+ let cx = ct
420+ cx
421+ }
422+ else toBase58String(aq())
423+ }
424+
425+
426+func cy (cr) = {
427+ let cz = getInteger(this, ak(m, cr))
428+ let ct = cz
429+ if ($isInstanceOf(ct, "Int"))
430+ then {
431+ let cA = ct
432+ cA
433+ }
434+ else bF()
435+ }
436+
437+
438+func cB (cr) = if ((cq(cr)._1 == 0))
423439 then throw("No open position")
424440 else true
425441
426442
427-func cx () = valueOrElse(getBoolean(this, l), false)
428-
429-
430-func cy () = valueOrElse(getBoolean(this, m), false)
431-
432-
433-func cz () = valueOrElse(getBoolean(this, n), false)
434-
435-
436-func cA (cB,cC,cD) = if (cB)
443+func cC () = valueOrElse(getBoolean(this, n), false)
444+
445+
446+func cD () = valueOrElse(getBoolean(this, o), false)
447+
448+
449+func cE () = valueOrElse(getBoolean(this, p), false)
450+
451+
452+func cF (cG,cH,cI) = if (cG)
437453 then {
438- let cE = (bG() - cD)
439- if ((0 >= cE))
454+ let cJ = (bI() - cI)
455+ if ((0 >= cJ))
440456 then throw("Tx lead to base asset reserve <= 0, revert")
441- else $Tuple3((bF() + cC), cE, (bJ() + cD))
457+ else $Tuple3((bH() + cH), cJ, (bL() + cI))
442458 }
443459 else {
444- let cF = (bF() - cC)
445- if ((0 >= cF))
460+ let cK = (bH() - cH)
461+ if ((0 >= cK))
446462 then throw("Tx lead to base quote reserve <= 0, revert")
447- else $Tuple3(cF, (bG() + cD), (bJ() - cD))
463+ else $Tuple3(cK, (bI() + cI), (bL() - cI))
448464 }
449465
450466
451-func cG (cH,cI,cJ,cK) = {
452- let cL = toBigInt(cH)
453- let cM = toBigInt(cI)
454- let cN = toBigInt(cJ)
455- let cO = toBigInt(cK)
456- aX(aX(cL, cM), aX(cN, cO))
457- }
458-
459-
460-func cP (cB,cC) = {
461- let cH = bF()
462- let cJ = bG()
463- let cI = bH()
464- let cK = bI()
465- let bx = cG(cH, cI, cJ, cK)
466- let cQ = if (cB)
467- then (cH + cC)
468- else (cH - cC)
469- let cR = toInt(aW(bx, toBigInt(aT(cQ, cI))))
470- let cS = aR(ba((cR - cJ)), cI)
471- let cT = if (cB)
472- then cS
473- else -(cS)
474- let cU = cA(cB, cC, cS)
475- let cV = cU._1
476- let cW = cU._2
477- let cX = cU._3
478- let cY = aR(aT(cH, cI), aT(cJ, cK))
479- let cZ = aR(cC, cS)
480- let da = ba((cY - cZ))
481- let db = (aK - aR(cY, (cY + da)))
482- let dc = bV()
483- if ((db > dc))
484- then throw(((((((((((((("Price impact " + toString(db)) + " > max price impact ") + toString(dc)) + " before quote asset: ") + toString(cH)) + " before base asset: ") + toString(cJ)) + " quote asset amount to exchange: ") + toString(cC)) + " price before: ") + toString(cY)) + " marketPrice: ") + toString(cZ)))
485- else $Tuple4(cT, cV, cW, cX)
486- }
487-
488-
489-func dd (de,df,dg,dh) = {
490- let di = if ((de != 0))
467+func cL (cM,cN) = {
468+ let cO = toBigInt(cM)
469+ let cP = toBigInt(cN)
470+ aZ(cO, cP)
471+ }
472+
473+
474+func cQ (cG,cH) = {
475+ let cM = bH()
476+ let cN = bI()
477+ let cR = bJ()
478+ let cS = bK()
479+ let cT = aT(cH, cR)
480+ let bz = cL(cM, cN)
481+ let cU = if (cG)
482+ then (cM + cT)
483+ else (cM - cT)
484+ let cV = toInt(aY(bz, toBigInt(cU)))
485+ let cW = bc((cV - cN))
486+ let cX = if (cG)
487+ then cW
488+ else -(cW)
489+ let cY = cF(cG, cT, cW)
490+ let cZ = cY._1
491+ let da = cY._2
492+ let db = cY._3
493+ let dc = aT(aV(cM, cR), aV(cN, cS))
494+ let dd = aT(cH, cW)
495+ let de = bc((dc - dd))
496+ let df = (aM - aT(dc, (dc + de)))
497+ let dg = bX()
498+ if ((df > dg))
499+ then throw(((((((((((((("Price impact " + toString(df)) + " > max price impact ") + toString(dg)) + " before quote asset: ") + toString(cM)) + " before base asset: ") + toString(cN)) + " quote asset amount to exchange: ") + toString(cH)) + " price before: ") + toString(dc)) + " marketPrice: ") + toString(dd)))
500+ else $Tuple4(cX, cZ, da, db)
501+ }
502+
503+
504+func dh (di,dj,dk,dl) = {
505+ let dm = if ((di != 0))
491506 then {
492- let dj = cm(de)
493- aT((dj - dg), de)
507+ let dn = co(di)
508+ aV((dn - dk), di)
494509 }
495510 else 0
496- let dk = ((dh - di) + df)
497- let dl = if ((0 > dk))
498- then $Tuple2(0, ba(dk))
499- else $Tuple2(ba(dk), 0)
500- let dm = dl._1
501- let dn = dl._2
502- $Tuple3(dm, dn, di)
503- }
504-
505-
506-func do (cB,cD,dp,dq,dr,ds,dt) = {
507- let cY = aR(aT(dq, dr), aT(ds, dt))
508- if ((cD == 0))
511+ let do = ((dl - dm) + dj)
512+ let dp = if ((0 > do))
513+ then $Tuple2(0, bc(do))
514+ else $Tuple2(bc(do), 0)
515+ let dq = dp._1
516+ let dr = dp._2
517+ $Tuple3(dq, dr, dm)
518+ }
519+
520+
521+func ds (cG,cI,dt,du,dv,dw,dx) = {
522+ let dc = aT(aV(du, dv), aV(dw, dx))
523+ if ((cI == 0))
509524 then throw("Invalid base asset amount")
510525 else {
511- let bx = cG(dq, dr, ds, dt)
512- let du = if (cB)
513- then (ds + cD)
514- else (ds - cD)
515- let dv = toInt(aW(bx, toBigInt(aT(du, dt))))
516- let dw = ba((dv - aT(dq, dr)))
517- let dc = bV()
518- let dx = cA(!(cB), dw, cD)
519- let cV = dx._1
520- let cW = dx._2
521- let cX = dx._3
522- let cZ = aR(dw, cD)
523- let da = ba((cY - cZ))
524- let db = (aK - aR(cY, (cY + da)))
525- if (if ((db > dc))
526- then dp
526+ let bz = cL(du, dw)
527+ let dy = if (cG)
528+ then (dw + cI)
529+ else (dw - cI)
530+ let dz = toInt(aY(bz, toBigInt(dy)))
531+ let dA = bc((dz - du))
532+ let dB = aV(dA, dv)
533+ let dg = bX()
534+ let dC = cF(!(cG), dA, cI)
535+ let cZ = dC._1
536+ let da = dC._2
537+ let db = dC._3
538+ let dd = aT(dB, cI)
539+ let de = bc((dc - dd))
540+ let df = (aM - aT(dc, (dc + de)))
541+ if (if ((df > dg))
542+ then dt
527543 else false)
528- then throw(((((((((((((("Price impact " + toString(db)) + " > max price impact ") + toString(dc)) + " before quote asset: ") + toString(dq)) + " before base asset: ") + toString(ds)) + " base asset amount to exchange: ") + toString(cD)) + " price before: ") + toString(cY)) + " market price: ") + toString(cZ)))
529- else $Tuple7(dw, cV, cW, cX, (cb() - (if (cB)
530- then ba(cD)
531- else 0)), (ca() - (if (!(cB))
532- then ba(cD)
533- else 0)), db)
534- }
535- }
536-
537-
538-func dy (cB,cD,dp) = do(cB, cD, dp, bF(), bH(), bG(), bI())
539-
540-
541-func dz () = {
542- let dA = valueOrErrorMessage(addressFromString(getStringValue(this, c)), "")
543- let dB = getStringValue(this, a)
544- let dC = valueOrErrorMessage(getInteger(dA, dB), ((("Can not get oracle price. Oracle: " + toString(dA)) + " key: ") + dB))
545- let dD = valueOrElse(getString(this, b), "")
546- if ((dD != ""))
544+ then throw(((((((((((((("Price impact " + toString(df)) + " > max price impact ") + toString(dg)) + " before quote asset: ") + toString(du)) + " before base asset: ") + toString(dw)) + " base asset amount to exchange: ") + toString(cI)) + " price before: ") + toString(dc)) + " market price: ") + toString(dd)))
545+ else $Tuple7(dB, cZ, da, db, (cd() - (if (cG)
546+ then bc(cI)
547+ else 0)), (cc() - (if (!(cG))
548+ then bc(cI)
549+ else 0)), df)
550+ }
551+ }
552+
553+
554+func dD (cG,cI,dt) = ds(cG, cI, dt, bH(), bJ(), bI(), bK())
555+
556+
557+func dE () = {
558+ let dF = valueOrErrorMessage(addressFromString(getStringValue(this, d)), "")
559+ let dG = getStringValue(this, a)
560+ let dH = valueOrErrorMessage(getInteger(dF, dG), ((("Can not get oracle price. Oracle: " + toString(dF)) + " key: ") + dG))
561+ let dI = valueOrElse(getString(this, b), "")
562+ if ((dI != ""))
547563 then {
548- let dE = lastBlock.height
549- let dF = valueOrErrorMessage(getInteger(dA, b), ((("Can not get oracle block. Oracle: " + toString(dA)) + " key: ") + dD))
550- if (((dE - dF) > ce()))
551- then throw(((("Oracle stale data. Last oracle block: " + toString(dF)) + " current block: ") + toString(dE)))
552- else dC
553- }
554- else dC
555- }
556-
557-
558-func dG (dq,ds) = {
559- let dH = dz()
560- let cI = bH()
561- let cK = bI()
562- let dI = aR(aT(dq, cI), aT(ds, cK))
563- let dJ = aR((dH + dI), (2 * aK))
564- let dK = aR(ba((dH - dI)), dJ)
565- if ((dK > bW()))
566- then throw(((("Price spread " + toString(dK)) + " > max price spread ") + toString(bW())))
564+ let dJ = lastBlock.height
565+ let dK = valueOrErrorMessage(getInteger(dF, dI), ((("Can not get oracle block. Oracle: " + toString(dF)) + " key: ") + dI))
566+ if (((dJ - dK) > cg()))
567+ then throw(((("Oracle stale data. Last oracle block: " + toString(dK)) + " current block: ") + toString(dJ)))
568+ else dH
569+ }
570+ else dH
571+ }
572+
573+
574+func dL () = {
575+ let dF = valueOrErrorMessage(addressFromString(getStringValue(this, d)), "")
576+ let dM = valueOrElse(getString(this, c), "")
577+ if ((dM != ""))
578+ then {
579+ let dN = valueOrErrorMessage(getBoolean(dF, dM), ((("Can not get oracle is open/closed. Oracle: " + toString(dF)) + " key: ") + dM))
580+ !(dN)
581+ }
582+ else false
583+ }
584+
585+
586+func dO (dP,du,dw,cR,cS) = {
587+ let dQ = aT(aV(du, cR), aV(dw, cS))
588+ let dR = aT((dP + dQ), (2 * aM))
589+ let dO = aT(bc((dP - dQ)), dR)
590+ dO
591+ }
592+
593+
594+func dS (du,dw) = {
595+ let dT = dE()
596+ let cR = bJ()
597+ let cS = bK()
598+ let dU = dO(dT, bH(), bI(), cR, cS)
599+ let dV = dO(dT, du, dw, cR, cS)
600+ if (if ((dV > bY()))
601+ then (dV > dU)
602+ else false)
603+ then throw(((("Price spread " + toString(dV)) + " > max price spread ") + toString(bY())))
567604 else true
568605 }
569606
570607
571-func dL (dM,dN) = {
572- let dO = bX()
573- if ((dM > dO))
574- then throw(((("Long open notional " + toString(dM)) + " > max open notional ") + toString(dO)))
575- else if ((dN > dO))
576- then throw(((("Short open notional " + toString(dN)) + " > max open notional ") + toString(dO)))
608+func dW (dX,dY) = {
609+ let dZ = bZ()
610+ if ((dX > dZ))
611+ then throw(((("Long open notional " + toString(dX)) + " > max open notional ") + toString(dZ)))
612+ else if ((dY > dZ))
613+ then throw(((("Short open notional " + toString(dY)) + " > max open notional ") + toString(dZ)))
577614 else true
578615 }
579616
580617
581-func dP () = {
582- let dq = bF()
583- let ds = bG()
584- let cI = bH()
585- let cK = bI()
586- aR(aT(dq, cI), aT(ds, cK))
587- }
588-
589-
590-func dQ () = {
591- let dH = dz()
592- let dR = dP()
593- (aR(ba((dH - dR)), dH) > bU())
594- }
595-
596-
597-func dS (cn,dT,dq,dr,ds,dt) = {
598- let dU = ba(cn)
599- let dV = (0 > cn)
600- let dW = if ((dT == aN))
618+func ea () = {
619+ let du = bH()
620+ let dw = bI()
621+ let cR = bJ()
622+ let cS = bK()
623+ aT(aV(du, cR), aV(dw, cS))
624+ }
625+
626+
627+func eb () = {
628+ let dT = dE()
629+ let ec = ea()
630+ (aT(bc((dT - ec)), dT) > bW())
631+ }
632+
633+
634+func ed (cp,ee,du,dv,dw,dx) = {
635+ let ef = bc(cp)
636+ let eg = (0 > cp)
637+ let eh = if ((ee == aP))
601638 then {
602- let dX = do(!(dV), dU, false, dq, dr, ds, dt)
603- let dY = dX._1
604- let dZ = dX._2
605- let ea = dX._3
606- let eb = dX._4
607- dY
608- }
609- else aT(dU, dz())
610- dW
611- }
612-
613-
614-func ec (cn,ed,dq,dr,ds,dt,dT) = if ((cn == 0))
639+ let ei = ds(!(eg), ef, false, du, dv, dw, dx)
640+ let ej = ei._1
641+ let ek = ei._2
642+ let el = ei._3
643+ let em = ei._4
644+ ej
645+ }
646+ else aV(ef, dE())
647+ eh
648+ }
649+
650+
651+func en (cp,eo,du,dv,dw,dx,ee) = if ((cp == 0))
615652 then throw("Invalid position size")
616653 else {
617- let dV = (0 > cn)
618- let dW = dS(cn, dT, dq, dr, ds, dt)
619- let ee = if (dV)
620- then (ed - dW)
621- else (dW - ed)
622- $Tuple2(dW, ee)
654+ let eg = (0 > cp)
655+ let eh = ed(cp, ee, du, dv, dw, dx)
656+ let ep = if (eg)
657+ then (eo - eh)
658+ else (eh - eo)
659+ $Tuple2(eh, ep)
623660 }
624661
625662
626-func ef (cp,dT) = {
627- let eg = co(cp)
628- let cs = eg._1
629- let eh = eg._2
630- let ei = eg._3
631- let ej = eg._4
632- ec(cs, ei, bF(), bH(), bG(), bI(), dT)
633- }
634-
635-
636-func ek (el,em,en) = aR((el - em), en)
637-
638-
639-func eo (cp,dT) = {
640- let ep = co(cp)
641- let cs = ep._1
642- let eh = ep._2
643- let eq = ep._3
644- let ej = ep._4
645- let er = ef(cp, dT)
646- let dW = er._1
647- let ee = er._2
648- let es = dd(cs, eh, ej, ee)
649- let dm = es._1
650- let dn = es._2
651- ek(dm, dn, dW)
652- }
653-
654-
655-func et (cp) = eo(cp, aN)
656-
657-
658-func eu (cp,cn) = {
659- let ev = bb(bT(), (aK - aR(et(cp), bR())))
660- let ew = aT(ba(cn), ev)
661- let ex = dy((cn > 0), ew, false)
662- let ey = ex._1
663- let db = ex._7
664- if ((bV() > db))
665- then ey
663+func eq (cr,ee) = {
664+ let er = cq(cr)
665+ let cu = er._1
666+ let es = er._2
667+ let et = er._3
668+ let eu = er._4
669+ en(cu, et, bH(), bJ(), bI(), bK(), ee)
670+ }
671+
672+
673+func ev (ew,ex,ey) = aT((ew - ex), ey)
674+
675+
676+func ez (cr,ee) = {
677+ let eA = cq(cr)
678+ let cu = eA._1
679+ let es = eA._2
680+ let eB = eA._3
681+ let eu = eA._4
682+ let eC = eq(cr, ee)
683+ let eh = eC._1
684+ let ep = eC._2
685+ let eD = dh(cu, es, eu, ep)
686+ let dq = eD._1
687+ let dr = eD._2
688+ ev(dq, dr, eh)
689+ }
690+
691+
692+func eE (cr) = ez(cr, aP)
693+
694+
695+func eF (cr,cp) = {
696+ let eG = bd(bV(), (aM - aT(eE(cr), bT())))
697+ let eH = aV(bc(cp), eG)
698+ let eI = dD((cp > 0), eH, false)
699+ let eJ = eI._1
700+ let df = eI._7
701+ if ((bX() > df))
702+ then eJ
666703 else {
667- let ez = aT(ba(cn), bT())
668- let eA = dy((cn > 0), ez, false)._1
669- eA
670- }
671- }
672-
673-
674-func eB (cp,dp) = {
675- let eC = co(cp)
676- let cs = eC._1
677- let eh = eC._2
678- let ei = eC._3
679- let ej = eC._4
680- let ee = ef(cp, aN)._2
681- let eD = dd(cs, eh, ej, ee)
682- let dm = eD._1
683- let dn = eD._2
684- let ez = -(cs)
685- let eE = ee
686- let eF = -(dm)
687- let eG = dy((cs > 0), ba(cs), dp)
688- let eA = eG._1
689- let cQ = eG._2
690- let cR = eG._3
691- let eH = eG._4
692- let eI = eG._5
693- let eJ = eG._6
694- let eK = (bK() - ei)
695- $Tuple13(ez, dn, eE, eF, cQ, cR, eH, eK, eA, eI, eJ, (bM() - (if ((cs > 0))
696- then ei
697- else 0)), (bL() - (if ((0 > cs))
698- then ei
704+ let eK = aV(bc(cp), bV())
705+ let eL = dD((cp > 0), eK, false)._1
706+ eL
707+ }
708+ }
709+
710+
711+func eM (cr,dt) = {
712+ let eN = cq(cr)
713+ let cu = eN._1
714+ let es = eN._2
715+ let et = eN._3
716+ let eu = eN._4
717+ let ep = eq(cr, aP)._2
718+ let eO = dh(cu, es, eu, ep)
719+ let dq = eO._1
720+ let dr = eO._2
721+ let eK = -(cu)
722+ let eP = ep
723+ let eQ = -(dq)
724+ let eR = dD((cu > 0), bc(cu), dt)
725+ let eL = eR._1
726+ let cU = eR._2
727+ let cV = eR._3
728+ let eS = eR._4
729+ let eT = eR._5
730+ let eU = eR._6
731+ let eV = (bM() - et)
732+ $Tuple13(eK, dr, eP, eQ, cU, cV, eS, eV, eL, eT, eU, (bO() - (if ((cu > 0))
733+ then et
734+ else 0)), (bN() - (if ((0 > cu))
735+ then et
699736 else 0)))
700737 }
701738
702739
703-func eL () = {
704- let eM = ((lastBlock.timestamp / 1000) / 60)
705- let eN = (eM - aG)
706- let eO = valueOrElse(getString(this, A), "")
707- let eP = split(eO, ",")
708- func eQ (bf,eR) = if ((eN >= parseIntValue(eR)))
709- then (bf :+ parseIntValue(eR))
710- else bf
711-
712- let eS = {
713- let bi = eP
714- let bj = size(bi)
715- let bk = nil
716- func bl (bm,bn) = if ((bn >= bj))
717- then bm
718- else eQ(bm, bi[bn])
719-
720- func bo (bm,bn) = if ((bn >= bj))
721- then bm
740+func eW () = {
741+ let eX = ((lastBlock.timestamp / 1000) / 60)
742+ let eY = (eX - aI)
743+ let eZ = valueOrElse(getString(this, C), "")
744+ let fa = split(eZ, ",")
745+ func fb (bh,fc) = if ((eY >= parseIntValue(fc)))
746+ then (bh :+ parseIntValue(fc))
747+ else bh
748+
749+ let fd = {
750+ let bk = fa
751+ let bl = size(bk)
752+ let bm = nil
753+ func bn (bo,bp) = if ((bp >= bl))
754+ then bo
755+ else fb(bo, bk[bp])
756+
757+ func bq (bo,bp) = if ((bp >= bl))
758+ then bo
722759 else throw("List size exceeds 20")
723760
724- bo(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bk, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
761+ bq(bn(bn(bn(bn(bn(bn(bn(bn(bn(bn(bn(bn(bn(bn(bn(bn(bn(bn(bn(bn(bm, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
725762 }
726- let eT = if ((size(eS) > 0))
727- then max(eS)
728- else parseIntValue(eP[0])
729- let eU = valueOrElse(getInteger(this, B), 0)
730- let eV = valueOrElse(getInteger(this, ((C + "_") + toString(eU))), 0)
731- let eW = valueOrElse(getInteger(this, ((D + "_") + toString(eU))), 0)
732- let eX = (eV + ((eM - eU) * eW))
733- let eY = valueOrElse(getInteger(this, ((C + "_") + toString(eT))), 0)
734- let eZ = valueOrElse(getInteger(this, ((D + "_") + toString(eT))), 0)
735- let fa = (eY + ((eN - eT) * eZ))
736- ((eX - fa) / aG)
737- }
738-
739-
740-func fb () = {
741- let cn = bJ()
742- if ((cn == 0))
743- then $Tuple2(bF(), bG())
763+ let fe = if ((size(fd) > 0))
764+ then max(fd)
765+ else parseIntValue(fa[0])
766+ let ff = valueOrElse(getInteger(this, D), 0)
767+ let fg = valueOrElse(getInteger(this, ((E + "_") + toString(ff))), 0)
768+ let fh = valueOrElse(getInteger(this, ((F + "_") + toString(ff))), 0)
769+ let fi = (fg + ((eX - ff) * fh))
770+ let fj = valueOrElse(getInteger(this, ((E + "_") + toString(fe))), 0)
771+ let fk = valueOrElse(getInteger(this, ((F + "_") + toString(fe))), 0)
772+ let fl = (fj + ((eY - fe) * fk))
773+ ((fi - fl) / aI)
774+ }
775+
776+
777+func fm () = {
778+ let cp = bL()
779+ if ((cp == 0))
780+ then $Tuple2(bH(), bI())
744781 else {
745- let fc = (cn > 0)
746- let fd = dy(fc, ba(cn), false)
747- let fe = fd._1
748- let ff = fd._2
749- let fg = fd._3
750- $Tuple2(ff, fg)
751- }
752- }
753-
754-
755-func fh (fi,bJ,fj,fk) = {
756- let fl = toBigInt(fi)
757- let fm = toBigInt(bJ)
758- let fn = toBigInt(fj)
759- let fo = toBigInt(fk)
760- let fp = aZ((fl + fm), toBigInt((2 * aK)))
761- let fq = aX(fn, fp)
762- let fr = (toBigInt(4) * aX(fo, fm))
763- let fs = aY(aX(fq, (fn - fr)))
764- let ft = aX(fl, fn)
765- let fu = aX(fn, fm)
766- let fv = ((-(fs) + ft) + fu)
767- let fw = (toBigInt(2) * aX(fn, fm))
768- let fx = aW(fv, fw)
769- toInt(fx)
770- }
771-
772-
773-func fy (fz) = {
774- let cn = bJ()
775- if ((cn == 0))
782+ let fn = (cp > 0)
783+ let fo = dD(fn, bc(cp), false)
784+ let fp = fo._1
785+ let fq = fo._2
786+ let fr = fo._3
787+ $Tuple2(fq, fr)
788+ }
789+ }
790+
791+
792+func fs (ft,bL,fu,fv) = {
793+ let fw = toBigInt(ft)
794+ let fx = toBigInt(bL)
795+ let fy = toBigInt(fu)
796+ let fz = toBigInt(fv)
797+ let bz = aZ(fy, fw)
798+ let fA = (fw + fx)
799+ let fB = aY(bz, fA)
800+ let fC = aY(fB, fA)
801+ let fD = aY(fz, fC)
802+ toInt(fD)
803+ }
804+
805+
806+func fE (fF,cM,cN) = {
807+ let cp = bL()
808+ if ((cp == 0))
776809 then {
777- let cH = bF()
778- let cJ = bG()
779- let fA = aR(aT(fz, cJ), cH)
780- $Tuple3(fA, aK, 0)
810+ let fG = aT(aV(fF, cN), cM)
811+ $Tuple3(fG, aM, 0)
781812 }
782813 else {
783- let fc = (cn > 0)
784- let fe = dy(fc, ba(cn), false)._1
785- let cH = bF()
786- let cJ = bG()
787- let fA = fh(cJ, cn, cH, fz)
788- let fB = aK
789- let eF = ec(cn, fe, cH, fA, cJ, fB, aN)._2
790- $Tuple3(fA, fB, eF)
791- }
792- }
793-
794-
795-func fC () = {
796- let fD = dz()
797- let fE = eL()
798- let fF = (fE - fD)
799- if (if ((ca() == 0))
814+ let fn = (cp > 0)
815+ let fp = dD(fn, bc(cp), false)._1
816+ let fG = fs(cN, cp, cM, fF)
817+ let fH = aM
818+ let eQ = en(cp, fp, cM, fG, cN, fH, aP)._2
819+ $Tuple3(fG, fH, eQ)
820+ }
821+ }
822+
823+
824+func fI () = {
825+ let fJ = dE()
826+ let fK = eW()
827+ let fL = (fK - fJ)
828+ if (if (if ((cc() == 0))
800829 then true
801- else (cb() == 0))
830+ else (cd() == 0))
831+ then true
832+ else dL())
802833 then $Tuple2(0, 0)
803- else if ((0 > fF))
834+ else if ((0 > fL))
804835 then {
805- let fG = aR(aT(fF, bP()), aL)
806- let fH = aR(aT(fG, ca()), cb())
807- $Tuple2(fG, fH)
836+ let fM = aT(aV(fL, bR()), aN)
837+ let fN = aT(aV(fM, cc()), cd())
838+ $Tuple2(fM, fN)
808839 }
809840 else {
810- let fH = aR(aT(fF, bP()), aL)
811- let fG = aR(aT(fH, cb()), ca())
812- $Tuple2(fG, fH)
841+ let fN = aT(aV(fL, bR()), aN)
842+ let fM = aT(aV(fN, cd()), cc())
843+ $Tuple2(fM, fN)
813844 }
814845 }
815846
816847
817-func fI (fJ,fK) = {
818- let fL = bD()
819- let fM = aT(fL, fK)
820- let fN = if ((fJ != ""))
848+func fO (fP,fQ) = {
849+ let fR = bF()
850+ let fS = aV(fR, fQ)
851+ let fT = if ((fP != ""))
821852 then {
822- let fO = bA(av(), ai(aC, fJ))
823- if ((fO == aD))
853+ let fU = bC(ax(), ak(aE, fP))
854+ if ((fU == aF))
824855 then {
825- let fP = bB(av(), ai(aB, fJ))
826- let fQ = aT(fM, fP)
827- $Tuple2(fQ, true)
856+ let fV = bD(ax(), ak(aD, fP))
857+ let fW = aV(fS, fV)
858+ $Tuple2(fW, true)
828859 }
829860 else throw("Invalid attached artifact")
830861 }
831- else $Tuple2(fM, false)
832- let fQ = fN._1
833- let fR = fN._2
834- $Tuple2(fQ, fR)
835- }
836-
837-
838-func fS (cp,aA) = {
839- let fT = co(cp)._1
840- if ((fT == 0))
862+ else $Tuple2(fS, false)
863+ let fW = fT._1
864+ let fX = fT._2
865+ $Tuple2(fW, fX)
866+ }
867+
868+
869+func fY (cr,aC) = {
870+ let fZ = cq(cr)._1
871+ if ((fZ == 0))
841872 then true
842- else (ct(cp) == aA)
843- }
844-
845-
846-func fU (cp,aA) = (ct(cp) == aA)
847-
848-
849-func fV (fW,aA,cp) = ((((((ah + "_") + fW) + "_") + aA) + "_") + cp)
850-
851-
852-func fX (cp) = {
853- let cv = ct(cp)
854- if ((cv == toBase58String(ao())))
855- then $Tuple2(0, cv)
873+ else (cv(cr) == aC)
874+ }
875+
876+
877+func ga (cr,aC) = (cv(cr) == aC)
878+
879+
880+func gb (gc,aC,cr) = ((((((aj + "_") + gc) + "_") + aC) + "_") + cr)
881+
882+
883+func gd (cr) = {
884+ let cx = cv(cr)
885+ if ((cx == toBase58String(aq())))
886+ then $Tuple2(0, cx)
856887 else {
857- let fY = fV(toString(this), cv, cp)
858- let fZ = valueOrElse(getInteger(aw(), fY), 0)
859- $Tuple2(fZ, cv)
860- }
861- }
862-
863-
864-func ga (cp,fJ) = {
865- let gb = invoke(as(), "computeFeeDiscount", [cp], nil)
866- if ((gb == gb))
888+ let ge = gb(toString(this), cx, cr)
889+ let gf = valueOrElse(getInteger(ay(), ge), 0)
890+ $Tuple2(gf, cx)
891+ }
892+ }
893+
894+
895+func gg (cr,fP) = {
896+ let gh = invoke(au(), "computeFeeDiscount", [cr], nil)
897+ if ((gh == gh))
867898 then {
868- let gc = {
869- let cr = gb
870- if ($isInstanceOf(cr, "Int"))
899+ let gi = {
900+ let ct = gh
901+ if ($isInstanceOf(ct, "Int"))
871902 then {
872- let gd = cr
873- gd
903+ let gj = ct
904+ gj
874905 }
875906 else throw("Invalid computeFeeDiscount result")
876907 }
877- let ge = fI(fJ, gc)
878- let fQ = ge._1
879- let fR = ge._2
880- $Tuple2(fQ, fR)
908+ let gk = fO(fP, gi)
909+ let fW = gk._1
910+ let fX = gk._2
911+ $Tuple2(fW, fX)
881912 }
882913 else throw("Strict value is not equal to itself.")
883914 }
884915
885916
886-func gf (cg) = {
887- let gg = if ((size(cg.payments) > 1))
888- then toBase58String(valueOrErrorMessage(cg.payments[1].assetId, "Invalid artifactId"))
917+func gl (ci) = {
918+ let gm = if ((size(ci.payments) > 1))
919+ then toBase58String(valueOrErrorMessage(ci.payments[1].assetId, "Invalid artifactId"))
889920 else ""
890- gg
891- }
892-
893-
894-func gh (gi) = {
895- let gj = aT(gi, cd())
896- let gk = (gi - gj)
897- $Tuple2(gj, gk)
898- }
899-
900-
901-func gl (gm,gn,go,gp,gq,gr,gs,gt,gu,dO,gv,gw) = [IntegerEntry(q, gm), IntegerEntry(r, gn), IntegerEntry(s, go), IntegerEntry(p, gp), IntegerEntry(o, gq), IntegerEntry(u, gr), IntegerEntry(v, gs), IntegerEntry(t, gt), IntegerEntry(w, gu), IntegerEntry(x, dO), IntegerEntry(y, gv), IntegerEntry(z, gv)]
902-
903-
904-func gx (gy,gz,gA,gB,gC) = [IntegerEntry(H, gy), IntegerEntry(F, gz), IntegerEntry(G, gA), IntegerEntry(I, gB), IntegerEntry(J, gC)]
905-
906-
907-func gD (ak,aA) = [StringEntry(ai(k, ak), aA)]
908-
909-
910-func gE (gF,ak) = if (gF)
921+ gm
922+ }
923+
924+
925+func gn (go) = {
926+ let gp = aV(go, cf())
927+ let gq = (go - gp)
928+ $Tuple2(gp, gq)
929+ }
930+
931+
932+func gr (gs,gt,gu,gv,gw,gx,gy,gz,gA,dZ,gB,gC) = [IntegerEntry(s, gs), IntegerEntry(t, gt), IntegerEntry(u, gu), IntegerEntry(r, gv), IntegerEntry(q, gw), IntegerEntry(w, gx), IntegerEntry(x, gy), IntegerEntry(v, gz), IntegerEntry(y, gA), IntegerEntry(z, dZ), IntegerEntry(A, gB), IntegerEntry(B, gB)]
933+
934+
935+func gD (gE,gF,gG,gH,gI) = [IntegerEntry(J, gE), IntegerEntry(H, gF), IntegerEntry(I, gG), IntegerEntry(K, gH), IntegerEntry(L, gI)]
936+
937+
938+func gJ (am,aC) = [StringEntry(ak(l, am), aC)]
939+
940+
941+func gK (gL,am) = if (gL)
911942 then {
912- let gG = cc()
913-[IntegerEntry(ai(j, ak), (gG + 1)), IntegerEntry(e, (gG + 1))]
943+ let gM = ce()
944+[IntegerEntry(ak(k, am), (gM + 1)), IntegerEntry(f, (gM + 1))]
914945 }
915946 else nil
916947
917948
918-func gH (ak,gI,gJ,gK,dj) = [IntegerEntry(ai(f, ak), gI), IntegerEntry(ai(g, ak), gJ), IntegerEntry(ai(h, ak), gK), IntegerEntry(ai(i, ak), dj)]
919-
920-
921-func gL (gM) = {
922- let eM = ((lastBlock.timestamp / 1000) / 60)
923- let gN = valueOrElse(getInteger(this, B), 0)
924- if ((gN > eM))
949+func gN (gL,am,gw) = if (gL)
950+ then [IntegerEntry(ak(m, am), gw)]
951+ else nil
952+
953+
954+func gO (am,gP,gQ,gR,dn) = [IntegerEntry(ak(g, am), gP), IntegerEntry(ak(h, am), gQ), IntegerEntry(ak(i, am), gR), IntegerEntry(ak(j, am), dn)]
955+
956+
957+func gS (gT) = {
958+ let eX = ((lastBlock.timestamp / 1000) / 60)
959+ let gU = valueOrElse(getInteger(this, D), 0)
960+ if ((gU > eX))
925961 then throw("TWAP out-of-order")
926962 else {
927- let eU = if ((gN == 0))
928- then eM
929- else gN
930- if ((eM > gN))
963+ let ff = if ((gU == 0))
964+ then eX
965+ else gU
966+ if ((eX > gU))
931967 then {
932- let gO = valueOrElse(getInteger(this, ((C + "_") + toString(gN))), 0)
933- let gP = valueOrElse(getInteger(this, ((D + "_") + toString(gN))), gM)
934- let gQ = (gO + ((eM - eU) * gP))
935- let eP = bt(br(valueOrElse(getString(this, A), "")), aG, toString(eM))
936-[IntegerEntry(ai(C, toString(eM)), gQ), IntegerEntry(ai(D, toString(eM)), gM), IntegerEntry(ai(E, toString(eM)), gN), IntegerEntry(B, eM), StringEntry(A, bc(eP))]
968+ let gV = valueOrElse(getInteger(this, ((E + "_") + toString(gU))), 0)
969+ let gW = valueOrElse(getInteger(this, ((F + "_") + toString(gU))), gT)
970+ let gX = (gV + ((eX - ff) * gW))
971+ let fa = bv(bt(valueOrElse(getString(this, C), "")), aI, toString(eX))
972+[IntegerEntry(ak(E, toString(eX)), gX), IntegerEntry(ak(F, toString(eX)), gT), IntegerEntry(ak(G, toString(eX)), gU), IntegerEntry(D, eX), StringEntry(C, be(fa))]
937973 }
938974 else {
939- let gR = valueOrElse(getInteger(this, ai(E, toString(eM))), 0)
940- let gO = valueOrElse(getInteger(this, ai(C, toString(gR))), 0)
941- let gP = valueOrElse(getInteger(this, ai(D, toString(gR))), gM)
942- let gQ = (gO + ((eM - gR) * gP))
943-[IntegerEntry(ai(C, toString(eM)), gQ), IntegerEntry(ai(D, toString(eM)), gM)]
975+ let gY = valueOrElse(getInteger(this, ak(G, toString(eX))), 0)
976+ let gV = valueOrElse(getInteger(this, ak(E, toString(gY))), 0)
977+ let gW = valueOrElse(getInteger(this, ak(F, toString(gY))), gT)
978+ let gX = (gV + ((eX - gY) * gW))
979+[IntegerEntry(ak(E, toString(eX)), gX), IntegerEntry(ak(F, toString(eX)), gT)]
944980 }
945981 }
946982 }
947983
948984
949-func gS (cH,cJ) = [IntegerEntry(K, cH), IntegerEntry(L, cJ)]
950-
951-
952-func gT (cI,cK) = [IntegerEntry(M, cI), IntegerEntry(N, cK)]
953-
954-
955-func gU (cH,cJ,gV,gW,gX,gY,gZ,ha) = {
956- let cI = bH()
957- let cK = bI()
958- if (((gX - gY) != gV))
959- then throw(((((("Invalid AMM state data: " + toString(gX)) + " + ") + toString(gY)) + " != ") + toString(gV)))
960- else ((gS(cH, cJ) ++ [IntegerEntry(O, gV), IntegerEntry(R, gW), IntegerEntry(P, gX), IntegerEntry(Q, gY), IntegerEntry(T, gZ), IntegerEntry(S, ha)]) ++ gL(aR(aT(cH, cI), aT(cJ, cK))))
961- }
962-
963-
964-func hb (ak) = [DeleteEntry(ai(f, ak)), DeleteEntry(ai(g, ak)), DeleteEntry(ai(h, ak)), DeleteEntry(ai(i, ak)), DeleteEntry(ai(k, ak))]
965-
966-
967-func hc (ak,hd) = {
968- let he = assetBalance(this, ao())
969- if ((hd > he))
970- then throw(((("Unable to withdraw " + toString(hd)) + " from contract balance ") + toString(he)))
971- else [ScriptTransfer(ak, hd, ao())]
972- }
973-
974-
975-func hf (cg) = if ((0 > cg))
985+func gZ (cM,cN) = [IntegerEntry(M, cM), IntegerEntry(N, cN)]
986+
987+
988+func ha (cR,cS) = [IntegerEntry(O, cR), IntegerEntry(P, cS)]
989+
990+
991+func hb (cM,cN,hc,hd,he,hf,hg,hh) = {
992+ let cR = bJ()
993+ let cS = bK()
994+ if (((he - hf) != hc))
995+ then throw(((((("Invalid AMM state data: " + toString(he)) + " + ") + toString(hf)) + " != ") + toString(hc)))
996+ else ((gZ(cM, cN) ++ [IntegerEntry(Q, hc), IntegerEntry(T, hd), IntegerEntry(R, he), IntegerEntry(S, hf), IntegerEntry(V, hg), IntegerEntry(U, hh)]) ++ gS(aT(aV(cM, cR), aV(cN, cS))))
997+ }
998+
999+
1000+func hi (am) = [DeleteEntry(ak(g, am)), DeleteEntry(ak(h, am)), DeleteEntry(ak(i, am)), DeleteEntry(ak(j, am)), DeleteEntry(ak(l, am))]
1001+
1002+
1003+func hj (am,hk) = {
1004+ let hl = assetBalance(this, aq())
1005+ if ((hk > hl))
1006+ then throw(((("Unable to withdraw " + toString(hk)) + " from contract balance ") + toString(hl)))
1007+ else [ScriptTransfer(am, hk, aq())]
1008+ }
1009+
1010+
1011+func hm (ci) = if ((0 > ci))
9761012 then throw("Balance")
977- else [IntegerEntry(d, cg)]
978-
979-
980-func hg (cg) = [ScriptTransfer(aq(), cg, ao())]
981-
982-
983-func hh (hi,cg) = if (hi)
984- then [Burn(valueOrErrorMessage(cg.payments[1].assetId, "Invalid artifact"), 1)]
1013+ else [IntegerEntry(e, ci)]
1014+
1015+
1016+func hn (ci) = [ScriptTransfer(as(), ci, aq())]
1017+
1018+
1019+func ho (hp,ci) = if (hp)
1020+ then [Burn(valueOrErrorMessage(ci.payments[1].assetId, "Invalid artifact"), 1)]
9851021 else nil
9861022
9871023
988-@Callable(cg)
989-func pause () = if ((cg.caller != am()))
1024+@Callable(ci)
1025+func pause () = if ((ci.caller != ao()))
9901026 then throw("Invalid pause params")
991- else [BooleanEntry(m, true)]
992-
993-
994-
995-@Callable(cg)
996-func unpause () = if ((cg.caller != am()))
1027+ else [BooleanEntry(o, true)]
1028+
1029+
1030+
1031+@Callable(ci)
1032+func unpause () = if ((ci.caller != ao()))
9971033 then throw("Invalid unpause params")
998- else [BooleanEntry(m, false)]
999-
1000-
1001-
1002-@Callable(cg)
1003-func setCloseOnly () = if ((cg.caller != am()))
1034+ else [BooleanEntry(o, false)]
1035+
1036+
1037+
1038+@Callable(ci)
1039+func setCloseOnly () = if ((ci.caller != ao()))
10041040 then throw("Invalid setCloseOnly params")
1005- else [BooleanEntry(n, true)]
1006-
1007-
1008-
1009-@Callable(cg)
1010-func unsetCloseOnly () = if ((cg.caller != am()))
1041+ else [BooleanEntry(p, true)]
1042+
1043+
1044+
1045+@Callable(ci)
1046+func unsetCloseOnly () = if ((ci.caller != ao()))
10111047 then throw("Invalid unsetCloseOnly params")
1012- else [BooleanEntry(n, false)]
1013-
1014-
1015-
1016-@Callable(cg)
1017-func addLiquidity (cC) = if (if ((cg.caller != am()))
1048+ else [BooleanEntry(p, false)]
1049+
1050+
1051+
1052+@Callable(ci)
1053+func addLiquidity (cH) = if (if ((ci.caller != ao()))
10181054 then true
1019- else (0 >= cC))
1055+ else (0 >= cH))
10201056 then throw("Invalid addLiquidity params")
10211057 else {
1022- let cH = bF()
1023- let cJ = bG()
1024- let cI = bH()
1025- let cK = bI()
1026- let hj = aR(aT(cH, cI), aT(cJ, cK))
1027- let hk = aR(cC, hj)
1028- let hl = (cH + cC)
1029- let hm = (cJ + hk)
1030- gS(hl, hm)
1058+ let cM = bH()
1059+ let cN = bI()
1060+ let cR = bJ()
1061+ let cS = bK()
1062+ let hq = aT(aV(cM, cR), aV(cN, cS))
1063+ let hr = (cM + cH)
1064+ let hs = (aT(aV(hr, cR), hq) - cN)
1065+ let ht = (cN + hs)
1066+ let hu = fE(dE(), hr, ht)
1067+ let hv = hu._1
1068+ let hw = hu._2
1069+ let eQ = hu._3
1070+ let hx = if ((eQ != 0))
1071+ then {
1072+ let hx = invoke(at(), "exchangeFreeAndLocked", [eQ], nil)
1073+ if ((hx == hx))
1074+ then nil
1075+ else throw("Strict value is not equal to itself.")
1076+ }
1077+ else nil
1078+ if ((hx == hx))
1079+ then (gZ(hr, ht) ++ ha(hv, hw))
1080+ else throw("Strict value is not equal to itself.")
10311081 }
10321082
10331083
10341084
1035-@Callable(cg)
1036-func removeLiquidity (cC) = if (if ((cg.caller != am()))
1085+@Callable(ci)
1086+func removeLiquidity (cH) = if (if ((ci.caller != ao()))
10371087 then true
1038- else (0 >= cC))
1088+ else (cH >= 0))
10391089 then throw("Invalid removeLiquidity params")
10401090 else {
1041- let cH = bF()
1042- let cJ = bG()
1043- let cI = bH()
1044- let cK = bI()
1045- let hj = aR(aT(cH, cI), aT(cJ, cK))
1046- let hn = aR(cC, hj)
1047- let hl = (cH - cC)
1048- let hm = (cJ - hn)
1049- gS(hl, hm)
1091+ let cM = bH()
1092+ let cN = bI()
1093+ let cR = bJ()
1094+ let cS = bK()
1095+ let hq = aT(aV(cM, cR), aV(cN, cS))
1096+ let hr = (cM - cH)
1097+ let hy = bc((aT(aV(hr, cR), hq) - cN))
1098+ let ht = (cN - hy)
1099+ let hz = fE(dE(), hr, ht)
1100+ let hv = hz._1
1101+ let hw = hz._2
1102+ let eQ = hz._3
1103+ let hx = if ((eQ != 0))
1104+ then {
1105+ let hx = invoke(at(), "exchangeFreeAndLocked", [eQ], nil)
1106+ if ((hx == hx))
1107+ then nil
1108+ else throw("Strict value is not equal to itself.")
1109+ }
1110+ else nil
1111+ if ((hx == hx))
1112+ then (gZ(hr, ht) ++ ha(hv, hw))
1113+ else throw("Strict value is not equal to itself.")
10501114 }
10511115
10521116
10531117
1054-@Callable(cg)
1055-func changeSettings (gm,gn,go,gp,gq,gr,gs,gt,gu,dO,gv,gw) = if ((cg.caller != am()))
1118+@Callable(ci)
1119+func changeSettings (gs,gt,gu,gv,gw,gx,gy,gz,gA,dZ,gB,gC) = if ((ci.caller != ao()))
10561120 then throw("Invalid changeSettings params")
1057- else gl(gm, gn, go, gp, gq, gr, gs, gt, gu, dO, gv, gw)
1058-
1059-
1060-
1061-@Callable(cg)
1062-func initialize (cH,cJ,gp,gm,gn,go,gq,ho,hp,hq,hr,gr,gs,gt,gu,dO,gv,gw) = if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if ((0 >= cH))
1121+ else gr(gs, gt, gu, gv, gw, gx, gy, gz, gA, dZ, gB, gC)
1122+
1123+
1124+
1125+@Callable(ci)
1126+func initialize (cM,cN,gv,gs,gt,gu,gw,hA,hB,hC,hD,gx,gy,gz,gA,dZ,gB,gC) = if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if ((0 >= cM))
10631127 then true
1064- else (0 >= cJ))
1128+ else (0 >= cN))
10651129 then true
1066- else (0 >= gp))
1067- then true
1068- else (0 >= gm))
1069- then true
1070- else (0 >= gn))
1071- then true
1072- else (0 >= go))
1073- then true
1074- else (0 >= gq))
1075- then true
1076- else (0 >= gr))
1130+ else (0 >= gv))
10771131 then true
10781132 else (0 >= gs))
10791133 then true
10811135 then true
10821136 else (0 >= gu))
10831137 then true
1084- else (0 >= dO))
1085- then true
1086- else (0 >= gv))
1087- then true
1088- else (gv > aK))
1089- then true
10901138 else (0 >= gw))
10911139 then true
1092- else cx())
1140+ else (0 >= gx))
1141+ then true
1142+ else (0 >= gy))
1143+ then true
1144+ else (0 >= gz))
1145+ then true
1146+ else (0 >= gA))
1147+ then true
1148+ else (0 >= dZ))
1149+ then true
1150+ else (0 >= gB))
1151+ then true
1152+ else (gB > aM))
1153+ then true
1154+ else (0 >= gC))
1155+ then true
1156+ else cC())
10931157 then throw("Invalid initialize parameters")
1094- else ((((gU(cH, cJ, 0, 0, 0, 0, 0, 0) ++ gl(gm, gn, go, gp, gq, gr, gs, gt, gu, dO, gv, gw)) ++ gx((lastBlock.timestamp + gp), 0, 0, 0, 0)) ++ hf(0)) ++ [BooleanEntry(l, true), StringEntry(c, ho), StringEntry(a, hp), StringEntry(b, hq), StringEntry(U, hr)])
1095-
1096-
1097-
1098-@Callable(cg)
1099-func decreasePosition (hd,hs,ht) = {
1100- let hu = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1101- if ((hu == hu))
1158+ else ((((hb(cM, cN, 0, 0, 0, 0, 0, 0) ++ gr(gs, gt, gu, gv, gw, gx, gy, gz, gA, dZ, gB, gC)) ++ gD((lastBlock.timestamp + gv), 0, 0, 0, 0)) ++ hm(0)) ++ [BooleanEntry(n, true), StringEntry(d, hA), StringEntry(a, hB), StringEntry(b, hC), StringEntry(W, hD)])
1159+
1160+
1161+
1162+@Callable(ci)
1163+func increasePosition (hE,hF,hG,hH) = {
1164+ let hI = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1165+ if ((hI == hI))
11021166 then {
1103- let cp = cf(cg)
1104- if (if (if (if (if ((0 >= hd))
1105- then true
1106- else !(cx()))
1107- then true
1108- else !(ch(aR(aK, hs), bE(), true)))
1109- then true
1110- else !(cw(cp)))
1111- then true
1112- else cy())
1113- then throw("Invalid decreasePosition parameters")
1114- else {
1115- let hv = co(cp)
1116- let fT = hv._1
1117- let hw = hv._2
1118- let hx = hv._3
1119- let hy = hv._4
1120- let hz = if ((fT > 0))
1121- then aF
1122- else aE
1123- let hA = (hz == aE)
1124- let hB = aT(hd, hs)
1125- let hC = ef(cp, aN)
1126- let hD = hC._1
1127- let ee = hC._2
1128- let hE = if ((hD > hB))
1129- then {
1130- let hF = cP(hA, hB)
1131- let ez = hF._1
1132- let cQ = hF._2
1133- let cR = hF._3
1134- let eH = hF._4
1135- let hG = ba(ez)
1136- if (if ((ht != 0))
1137- then (ht > hG)
1138- else false)
1139- then throw(((("Too little base asset exchanged, got " + toString(hG)) + " expected ") + toString(ht)))
1140- else {
1141- let eE = aR(aT(ee, hG), ba(fT))
1142- let hH = dd(fT, hw, hy, eE)
1143- let dm = hH._1
1144- let dn = hH._2
1145- let di = hH._3
1146- let eA = hB
1147- let hI = (ee - eE)
1148- let hJ = if ((fT > 0))
1149- then ((hD - eA) - hI)
1150- else ((hI + hD) - eA)
1151- let hK = (fT + ez)
1152- $Tuple12(hK, dm, ba(hJ), cm(hK), cR, cQ, eH, (bK() - hB), (cb() - (if ((hK > 0))
1153- then ba(ez)
1154- else 0)), (ca() - (if ((0 > hK))
1155- then ba(ez)
1156- else 0)), (bM() - (if ((hK > 0))
1157- then hB
1158- else 0)), (bL() - (if ((0 > hK))
1159- then hB
1160- else 0)))
1161- }
1162- }
1163- else throw("Close position first")
1164- let hK = hE._1
1165- let hL = hE._2
1166- let hM = hE._3
1167- let hN = hE._4
1168- let cR = hE._5
1169- let cQ = hE._6
1170- let eH = hE._7
1171- let eK = hE._8
1172- let eI = hE._9
1173- let eJ = hE._10
1174- let hO = hE._11
1175- let hP = hE._12
1176- let hQ = invoke(as(), "notifyNotional", [cp, hM], nil)
1177- if ((hQ == hQ))
1178- then (gH(cp, hK, hL, hM, hN) ++ gU(cQ, cR, eH, eK, eI, eJ, hO, hP))
1179- else throw("Strict value is not equal to itself.")
1180- }
1181- }
1182- else throw("Strict value is not equal to itself.")
1183- }
1184-
1185-
1186-
1187-@Callable(cg)
1188-func increasePosition (hz,hs,ht,hR) = {
1189- let hu = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1190- if ((hu == hu))
1191- then {
1192- let cp = cf(cg)
1193- let hS = cg.payments[0].amount
1194- let aA = cg.payments[0].assetId
1195- let hT = toBase58String(value(aA))
1196- let hU = (aA == ao())
1197- let hV = az(hT)
1198- if (if (if (if (if (if (if (if (if ((hz != aE))
1199- then (hz != aF)
1167+ let cr = ch(ci)
1168+ let hJ = ci.payments[0].amount
1169+ let aC = ci.payments[0].assetId
1170+ let hK = toBase58String(value(aC))
1171+ let hL = (aC == aq())
1172+ let hM = aB(hK)
1173+ if (if (if (if (if (if (if (if (if (if ((hE != aG))
1174+ then (hE != aH)
12001175 else false)
12011176 then true
1202- else (0 >= hS))
1203- then true
1204- else !(cx()))
1205- then true
1206- else if (!(hU))
1207- then !(hV)
1177+ else (0 >= hJ))
1178+ then true
1179+ else !(cC()))
1180+ then true
1181+ else if (!(hL))
1182+ then !(hM)
12081183 else false)
12091184 then true
1210- else !(fS(cp, hT)))
1211- then true
1212- else !(ch(aR(aK, hs), bE(), true)))
1213- then true
1214- else cy())
1215- then true
1216- else cz())
1185+ else !(fY(cr, hK)))
1186+ then true
1187+ else !(cj(aT(aM, hF), bG(), true)))
1188+ then true
1189+ else cD())
1190+ then true
1191+ else cE())
1192+ then true
1193+ else dL())
12171194 then throw("Invalid increasePosition parameters")
12181195 else {
1219- let hW = ga(cp, gf(cg))
1220- let fQ = hW._1
1221- let fR = hW._2
1222- let hX = aT(hS, fQ)
1223- let hd = (hS - hX)
1224- let hY = if (hV)
1196+ let hN = gg(cr, gl(ci))
1197+ let fW = hN._1
1198+ let fX = hN._2
1199+ let hk = aT(hJ, (aV(fW, hF) + aM))
1200+ let hO = (hJ - hk)
1201+ let hP = if (hM)
12251202 then {
1226- let hZ = invoke(aw(), "borrow", [cp], [AttachedPayment(aA, hd)])
1227- if ((hZ == hZ))
1203+ let hQ = invoke(ay(), "borrow", [cr], [AttachedPayment(aC, hk)])
1204+ if ((hQ == hQ))
12281205 then {
1229- let ia = assetBalance(this, ao())
1230- if ((ia == ia))
1206+ let hR = assetBalance(this, aq())
1207+ if ((hR == hR))
12311208 then {
1232- let ib = invoke(ax(), "swap", [toBase58String(ao()), 0], [AttachedPayment(aA, hX)])
1233- if ((ib == ib))
1209+ let hS = invoke(az(), "swap", [toBase58String(aq()), 0], [AttachedPayment(aC, hO)])
1210+ if ((hS == hS))
12341211 then {
1235- let ic = assetBalance(this, ao())
1236- if ((ic == ic))
1212+ let hT = assetBalance(this, aq())
1213+ if ((hT == hT))
12371214 then {
1238- let id = (ic - ia)
1239- if ((id == id))
1240- then id
1215+ let hU = (hT - hR)
1216+ if ((hU == hU))
1217+ then hU
12411218 else throw("Strict value is not equal to itself.")
12421219 }
12431220 else throw("Strict value is not equal to itself.")
12481225 }
12491226 else throw("Strict value is not equal to itself.")
12501227 }
1251- else hX
1252- if ((hY == hY))
1228+ else hO
1229+ if ((hP == hP))
12531230 then {
1254- let ie = invoke(au(), "acceptPaymentWithLink", [cp, hR], [AttachedPayment(ao(), hY)])
1255- if ((ie == ie))
1231+ let hV = invoke(aw(), "acceptPaymentWithLink", [cr, hH], [AttachedPayment(aq(), hP)])
1232+ if ((hV == hV))
12561233 then {
1257- let if = {
1258- let cr = ie
1259- if ($isInstanceOf(cr, "Int"))
1234+ let hW = {
1235+ let ct = hV
1236+ if ($isInstanceOf(ct, "Int"))
12601237 then {
1261- let gd = cr
1262- gd
1238+ let gj = ct
1239+ gj
12631240 }
12641241 else throw("Invalid referrerFee")
12651242 }
1266- let ig = (hY - if)
1267- let ih = co(cp)
1268- let fT = ih._1
1269- let hw = ih._2
1270- let hx = ih._3
1271- let hy = ih._4
1272- let gF = (fT == 0)
1273- let ii = if ((fT > 0))
1274- then (hz == aE)
1275- else (hz == aF)
1276- let ij = if (!(gF))
1277- then ii
1243+ let hX = (hP - hW)
1244+ let hY = cq(cr)
1245+ let fZ = hY._1
1246+ let hZ = hY._2
1247+ let ia = hY._3
1248+ let ib = hY._4
1249+ let ic = (fZ == 0)
1250+ let id = if ((fZ > 0))
1251+ then (hE == aG)
1252+ else (hE == aH)
1253+ let ie = if (!(ic))
1254+ then id
12781255 else false
1279- let hA = (hz == aE)
1280- let ik = if (if (gF)
1256+ let if = (hE == aG)
1257+ let ig = if (if (ic)
12811258 then true
1282- else ij)
1259+ else ie)
12831260 then {
1284- let hB = aT(hd, hs)
1285- let il = cP(hA, hB)
1286- let cT = il._1
1287- let cQ = il._2
1288- let cR = il._3
1289- let eH = il._4
1290- if (if ((ht != 0))
1291- then (ht > ba(cT))
1261+ let ih = aV(hk, hF)
1262+ let ii = cQ(if, ih)
1263+ let cX = ii._1
1264+ let cU = ii._2
1265+ let cV = ii._3
1266+ let eS = ii._4
1267+ if (if ((hG != 0))
1268+ then (hG > bc(cX))
12921269 else false)
1293- then throw(((("Limit error: " + toString(ba(cT))) + " < ") + toString(ht)))
1270+ then throw(((("Limit error: " + toString(bc(cX))) + " < ") + toString(hG)))
12941271 else {
1295- let hK = (fT + cT)
1296- let hO = (bM() + (if ((hK > 0))
1297- then hB
1272+ let ij = (fZ + cX)
1273+ let ik = (bO() + (if ((ij > 0))
1274+ then ih
12981275 else 0))
1299- let hP = (bL() + (if ((0 > hK))
1300- then hB
1276+ let il = (bN() + (if ((0 > ij))
1277+ then ih
13011278 else 0))
1302- let im = aR(hB, hs)
1303- let in = dd(fT, hw, hy, im)
1304- let dm = in._1
1305- let dZ = in._2
1306- let ea = in._3
1307- if (!(dG(cQ, cR)))
1279+ let im = dh(fZ, hZ, ib, hk)
1280+ let dq = im._1
1281+ let ek = im._2
1282+ let el = im._3
1283+ if (!(dS(cU, cV)))
13081284 then throw("Over max spread limit")
1309- else if (!(dL(hO, hP)))
1285+ else if (!(dW(ik, il)))
13101286 then throw("Over max open notional")
1311- else $Tuple12(hK, dm, (hx + hB), cm(hK), cR, cQ, eH, (bK() + hB), (cb() + (if ((hK > 0))
1312- then ba(cT)
1313- else 0)), (ca() + (if ((0 > hK))
1314- then ba(cT)
1315- else 0)), hO, hP)
1287+ else $Tuple12(ij, dq, (ia + ih), co(ij), cV, cU, eS, (bM() + ih), (cd() + (if ((ij > 0))
1288+ then bc(cX)
1289+ else 0)), (cc() + (if ((0 > ij))
1290+ then bc(cX)
1291+ else 0)), ik, il)
13161292 }
13171293 }
13181294 else {
1319- let hB = aT(hd, hs)
1320- let io = ef(toString(cg.caller), aN)
1321- let hD = io._1
1322- let ee = io._2
1323- if ((hD > hB))
1295+ let ih = aV(hk, hF)
1296+ let in = eq(toString(ci.caller), aP)
1297+ let io = in._1
1298+ let ep = in._2
1299+ if ((io > ih))
13241300 then throw("Use decreasePosition to decrease position size")
13251301 else throw("Close position first")
13261302 }
1327- let hK = ik._1
1328- let hL = ik._2
1329- let hM = ik._3
1330- let hN = ik._4
1331- let cR = ik._5
1332- let cQ = ik._6
1333- let eH = ik._7
1334- let eK = ik._8
1335- let eI = ik._9
1336- let eJ = ik._10
1337- let hO = ik._11
1338- let hP = ik._12
1339- let ip = gh(ig)
1340- let gj = ip._1
1341- let gk = ip._2
1342- let iq = if (hU)
1303+ let ij = ig._1
1304+ let ip = ig._2
1305+ let iq = ig._3
1306+ let ir = ig._4
1307+ let cV = ig._5
1308+ let cU = ig._6
1309+ let eS = ig._7
1310+ let eV = ig._8
1311+ let eT = ig._9
1312+ let eU = ig._10
1313+ let ik = ig._11
1314+ let il = ig._12
1315+ let is = gn(hX)
1316+ let gp = is._1
1317+ let gq = is._2
1318+ let it = if (hL)
13431319 then {
1344- let iq = invoke(ar(), "addLocked", [false], [AttachedPayment(ao(), hd)])
1345- if ((iq == iq))
1320+ let it = invoke(at(), "addLocked", [false], [AttachedPayment(aq(), hk)])
1321+ if ((it == it))
13461322 then nil
13471323 else throw("Strict value is not equal to itself.")
13481324 }
13491325 else nil
1350- if ((iq == iq))
1326+ if ((it == it))
13511327 then {
1352- let ir = invoke(ar(), "addFree", nil, [AttachedPayment(ao(), gk)])
1353- if ((ir == ir))
1328+ let iu = invoke(at(), "addFree", nil, [AttachedPayment(aq(), gq)])
1329+ if ((iu == iu))
13541330 then {
1355- let is = invoke(as(), "notifyFees", [cp, ig], nil)
1356- if ((is == is))
1331+ let iv = invoke(au(), "notifyFees", [cr, hX], nil)
1332+ if ((iv == iv))
13571333 then {
1358- let hQ = invoke(as(), "notifyNotional", [cp, hM], nil)
1359- if ((hQ == hQ))
1360- then ((((((gH(cp, hK, hL, hM, hN) ++ gE(gF, cp)) ++ gD(cp, hT)) ++ gU(cQ, cR, eH, eK, eI, eJ, hO, hP)) ++ hg(gj)) ++ hf((bC() + hd))) ++ hh(fR, cg))
1334+ let iw = invoke(au(), "notifyNotional", [cr, iq], nil)
1335+ if ((iw == iw))
1336+ then (((((((gO(cr, ij, ip, iq, ir) ++ gK(ic, cr)) ++ gN(ic, cr, fW)) ++ gJ(cr, hK)) ++ hb(cU, cV, eS, eV, eT, eU, ik, il)) ++ hn(gp)) ++ hm((bE() + hk))) ++ ho(fX, ci))
13611337 else throw("Strict value is not equal to itself.")
13621338 }
13631339 else throw("Strict value is not equal to itself.")
13761352
13771353
13781354
1379-@Callable(cg)
1355+@Callable(ci)
13801356 func addMargin () = {
1381- let hu = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1382- if ((hu == hu))
1357+ let hI = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1358+ if ((hI == hI))
13831359 then {
1384- let cp = toString(cg.caller)
1385- let hS = cg.payments[0].amount
1386- let aA = cg.payments[0].assetId
1387- let hT = toBase58String(value(aA))
1388- let hU = (aA == ao())
1389- let hV = az(hT)
1390- if (if (if (if (if (if (if (!(hU))
1391- then !(hV)
1360+ let cr = toString(ci.caller)
1361+ let hk = ci.payments[0].amount
1362+ let aC = ci.payments[0].assetId
1363+ let hK = toBase58String(value(aC))
1364+ let hL = (aC == aq())
1365+ let hM = aB(hK)
1366+ if (if (if (if (if (if (if (if (!(hL))
1367+ then !(hM)
13921368 else false)
13931369 then true
1394- else !(cw(toString(cg.caller))))
1395- then true
1396- else !(fU(cp, hT)))
1397- then true
1398- else !(cx()))
1399- then true
1400- else cy())
1401- then true
1402- else cz())
1370+ else !(cB(toString(ci.caller))))
1371+ then true
1372+ else !(ga(cr, hK)))
1373+ then true
1374+ else !(cC()))
1375+ then true
1376+ else cD())
1377+ then true
1378+ else cE())
1379+ then true
1380+ else dL())
14031381 then throw("Invalid addMargin parameters")
14041382 else {
1405- let it = ga(cp, gf(cg))
1406- let fQ = it._1
1407- let fR = it._2
1408- let hX = aT(hS, fQ)
1409- let hd = (hS - hX)
1410- let hY = if (hV)
1383+ let ix = cq(cr)
1384+ let fZ = ix._1
1385+ let hZ = ix._2
1386+ let ia = ix._3
1387+ let ib = ix._4
1388+ let it = if (hL)
14111389 then {
1412- let hZ = invoke(aw(), "borrow", [cp], [AttachedPayment(aA, hd)])
1413- if ((hZ == hZ))
1390+ let it = invoke(at(), "addLocked", [false], [AttachedPayment(aq(), hk)])
1391+ if ((it == it))
1392+ then nil
1393+ else throw("Strict value is not equal to itself.")
1394+ }
1395+ else nil
1396+ if ((it == it))
1397+ then (gO(cr, fZ, (hZ + hk), ia, ib) ++ hm((bE() + hk)))
1398+ else throw("Strict value is not equal to itself.")
1399+ }
1400+ }
1401+ else throw("Strict value is not equal to itself.")
1402+ }
1403+
1404+
1405+
1406+@Callable(ci)
1407+func removeMargin (hk) = {
1408+ let hI = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1409+ if ((hI == hI))
1410+ then {
1411+ let cr = toString(ci.caller)
1412+ if (if (if (if (if ((0 >= hk))
1413+ then true
1414+ else !(cB(cr)))
1415+ then true
1416+ else !(cC()))
1417+ then true
1418+ else cD())
1419+ then true
1420+ else dL())
1421+ then throw("Invalid removeMargin parameters")
1422+ else {
1423+ let iy = cq(cr)
1424+ let fZ = iy._1
1425+ let hZ = iy._2
1426+ let ia = iy._3
1427+ let ib = iy._4
1428+ let iz = -(hk)
1429+ let iA = dh(fZ, hZ, ib, iz)
1430+ let dq = iA._1
1431+ let dr = iA._2
1432+ if ((dr != 0))
1433+ then throw("Invalid removed margin amount")
1434+ else {
1435+ let iB = ev(dq, dr, ia)
1436+ if (!(cj(iB, bG(), true)))
1437+ then throw(((("Too much margin removed: " + toString(iB)) + " < ") + toString(bG())))
1438+ else {
1439+ let iC = toBase58String(aq())
1440+ let iD = gd(cr)
1441+ let iE = iD._1
1442+ let iF = iD._2
1443+ let iG = if ((hk > iE))
1444+ then iE
1445+ else hk
1446+ let iH = if ((iE > hk))
1447+ then 0
1448+ else (hk - iE)
1449+ let iI = (iE - iG)
1450+ let iJ = if ((iI > 0))
1451+ then nil
1452+ else gJ(cr, iC)
1453+ let iK = if (((iG + iH) != hk))
1454+ then throw(((((("toRepay=" + toString(iG)) + " + toWithdraw=") + toString(iH)) + " != ") + toString(hk)))
1455+ else nil
1456+ if ((iK == iK))
1457+ then {
1458+ let iL = if ((iH > 0))
1459+ then {
1460+ let iL = invoke(at(), "withdrawLocked", [iH], nil)
1461+ if ((iL == iL))
1462+ then nil
1463+ else throw("Strict value is not equal to itself.")
1464+ }
1465+ else nil
1466+ if ((iL == iL))
1467+ then {
1468+ let iM = if ((iG > 0))
1469+ then {
1470+ let iN = invoke(ay(), "repay", [cr, iG, iF], nil)
1471+ if ((iN == iN))
1472+ then [ScriptTransfer(ci.caller, iG, fromBase58String(iF))]
1473+ else throw("Strict value is not equal to itself.")
1474+ }
1475+ else nil
1476+ if ((iM == iM))
1477+ then ((((gO(cr, fZ, dq, ia, co(fZ)) ++ (if ((iH > 0))
1478+ then hj(ci.caller, iH)
1479+ else nil)) ++ hm((bE() - hk))) ++ iJ) ++ iM)
1480+ else throw("Strict value is not equal to itself.")
1481+ }
1482+ else throw("Strict value is not equal to itself.")
1483+ }
1484+ else throw("Strict value is not equal to itself.")
1485+ }
1486+ }
1487+ }
1488+ }
1489+ else throw("Strict value is not equal to itself.")
1490+ }
1491+
1492+
1493+
1494+@Callable(ci)
1495+func closePosition (gP,iO,iP) = {
1496+ let hI = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1497+ if ((hI == hI))
1498+ then {
1499+ let cr = ch(ci)
1500+ let iQ = valueOrErrorMessage(addressFromString(cr), "Invalid caller")
1501+ let cA = cy(cr)
1502+ if (if (if (if (if (if (!(cB(cr)))
1503+ then true
1504+ else !(cC()))
1505+ then true
1506+ else cD())
1507+ then true
1508+ else (0 >= gP))
1509+ then true
1510+ else (0 > iO))
1511+ then true
1512+ else dL())
1513+ then throw("Invalid closePosition parameters")
1514+ else {
1515+ let iR = cq(cr)
1516+ let fZ = iR._1
1517+ let hZ = iR._2
1518+ let ia = iR._3
1519+ let ib = iR._4
1520+ let iS = if ((bc(fZ) > gP))
1521+ then {
1522+ let iT = dD((fZ > 0), gP, true)
1523+ let eL = iT._1
1524+ let cU = iT._2
1525+ let cV = iT._3
1526+ let eS = iT._4
1527+ let eK = if ((fZ > 0))
1528+ then -(gP)
1529+ else gP
1530+ let iU = eq(cr, aP)
1531+ let io = iU._1
1532+ let ep = iU._2
1533+ let iV = ez(cr, aP)
1534+ let iW = aT(bc(eK), bc(fZ))
1535+ let eP = aV(ep, iW)
1536+ let iX = aV(aV(io, iW), cA)
1537+ let iY = dh(fZ, hZ, ib, ep)._1
1538+ let iZ = dh(fZ, hZ, ib, eP)._2
1539+ let ja = (ep - eP)
1540+ let jb = if ((fZ > 0))
1541+ then ((io - eL) - ja)
1542+ else ((ja + io) - eL)
1543+ let iq = bc(jb)
1544+ let ij = (fZ + eK)
1545+ let jc = co(ij)
1546+ let jd = (ia - iq)
1547+ let eV = (bM() - jd)
1548+ let je = if ((fZ > 0))
1549+ then (aV((iq + ja), iV) - ja)
1550+ else (aV((iq - ja), iV) - ja)
1551+ let jf = ((iY - (je + ja)) - iX)
1552+ let jg = if ((0 > jf))
1553+ then throw("Margin error: unable to pay close fee")
1554+ else jf
1555+ if (if ((iO != 0))
1556+ then (iO > eL)
1557+ else false)
1558+ then throw(((("Limit error: " + toString(eL)) + " < ") + toString(iO)))
1559+ else $Tuple16(ij, if (iP)
1560+ then (je + jg)
1561+ else je, iq, jc, iZ, eP, if (iP)
1562+ then 0
1563+ else jg, cU, cV, eS, eV, (cd() - (if ((ij > 0))
1564+ then bc(eK)
1565+ else 0)), (cc() - (if ((0 > ij))
1566+ then bc(eK)
1567+ else 0)), (bO() - (if ((ij > 0))
1568+ then jd
1569+ else 0)), (bN() - (if ((0 > ij))
1570+ then jd
1571+ else 0)), iX)
1572+ }
1573+ else if ((gP > bc(fZ)))
1574+ then throw("Invalid closePosition parameters")
1575+ else {
1576+ let jh = eM(cr, true)
1577+ let el = jh._1
1578+ let iZ = jh._2
1579+ let eP = jh._3
1580+ let ji = jh._4
1581+ let cU = jh._5
1582+ let cV = jh._6
1583+ let eS = jh._7
1584+ let eV = jh._8
1585+ let eL = jh._9
1586+ let eT = jh._10
1587+ let eU = jh._11
1588+ let ik = jh._12
1589+ let il = jh._13
1590+ let iX = aV(eL, cA)
1591+ let jf = (bc(ji) - iX)
1592+ let jg = if ((0 > jf))
1593+ then throw(((((((("Margin error: unable to pay close fee: " + toString(iX)) + " margin: ") + toString(ji)) + " fee percent: ") + toString(cA)) + " notional: ") + toString(eL)))
1594+ else jf
1595+ if (if ((iO != 0))
1596+ then (iO > eL)
1597+ else false)
1598+ then throw(((("Limit error: " + toString(eL)) + " < ") + toString(iO)))
1599+ else $Tuple16(0, 0, 0, 0, iZ, eP, jg, cU, cV, eS, eV, eT, eU, ik, il, iX)
1600+ }
1601+ let ij = iS._1
1602+ let je = iS._2
1603+ let iq = iS._3
1604+ let jc = iS._4
1605+ let iZ = iS._5
1606+ let eP = iS._6
1607+ let jg = iS._7
1608+ let cU = iS._8
1609+ let cV = iS._9
1610+ let eS = iS._10
1611+ let eV = iS._11
1612+ let eT = iS._12
1613+ let eU = iS._13
1614+ let ik = iS._14
1615+ let il = iS._15
1616+ let iX = iS._16
1617+ if ((iZ > 0))
1618+ then throw("Unable to close position with bad debt")
1619+ else {
1620+ let jj = (ij != 0)
1621+ let jk = (jg + iX)
1622+ let jl = (bE() - jk)
1623+ let jm = if ((0 > jl))
1624+ then $Tuple2(0, bc(jl))
1625+ else $Tuple2(jl, 0)
1626+ let jn = jm._1
1627+ let jo = jm._2
1628+ let jp = gd(cr)
1629+ let iE = jp._1
1630+ let iF = jp._2
1631+ let jq = if ((iE > 0))
1632+ then if ((jk >= iE))
1633+ then {
1634+ let iN = invoke(ay(), "repay", [cr, iE, iF], nil)
1635+ if ((iN == iN))
1636+ then $Tuple3(iE, (jk - iE), jj)
1637+ else throw("Strict value is not equal to itself.")
1638+ }
1639+ else {
1640+ let jr = invoke(ay(), if (jj)
1641+ then "repay"
1642+ else "realizePartiallyAndClose", [cr, jk, iF], nil)
1643+ if ((jr == jr))
1644+ then $Tuple3(jk, 0, false)
1645+ else throw("Strict value is not equal to itself.")
1646+ }
1647+ else $Tuple3(0, jk, false)
1648+ if ((jq == jq))
14141649 then {
1415- let ia = assetBalance(this, ao())
1416- if ((ia == ia))
1650+ let js = jq._3
1651+ let jt = jq._2
1652+ let ju = jq._1
1653+ let jv = if ((jt >= iX))
1654+ then $Tuple3(ju, (jt - iX), iX)
1655+ else {
1656+ let jw = (iX - jt)
1657+ let jx = (ju - jw)
1658+ let hR = assetBalance(this, aq())
1659+ if ((hR == hR))
1660+ then {
1661+ let hS = invoke(az(), "swap", [toBase58String(aq()), 0], [AttachedPayment(fromBase58String(iF), jw)])
1662+ if ((hS == hS))
1663+ then {
1664+ let hT = assetBalance(this, aq())
1665+ if ((hT == hT))
1666+ then {
1667+ let hU = (hT - hR)
1668+ if ((hU == hU))
1669+ then $Tuple3(jx, 0, (jt + hU))
1670+ else throw("Strict value is not equal to itself.")
1671+ }
1672+ else throw("Strict value is not equal to itself.")
1673+ }
1674+ else throw("Strict value is not equal to itself.")
1675+ }
1676+ else throw("Strict value is not equal to itself.")
1677+ }
1678+ if ((jv == jv))
14171679 then {
1418- let ib = invoke(ax(), "swap", [toBase58String(ao()), 0], [AttachedPayment(aA, hX)])
1419- if ((ib == ib))
1680+ let jy = jv._3
1681+ let jz = jv._2
1682+ let jx = jv._1
1683+ let jA = if ((jt > 0))
14201684 then {
1421- let ic = assetBalance(this, ao())
1422- if ((ic == ic))
1685+ let jA = invoke(at(), "withdrawLocked", [jt], nil)
1686+ if ((jA == jA))
1687+ then nil
1688+ else throw("Strict value is not equal to itself.")
1689+ }
1690+ else nil
1691+ if ((jA == jA))
1692+ then {
1693+ let jB = gn(jy)
1694+ let gp = jB._1
1695+ let gq = jB._2
1696+ let iu = invoke(at(), "addFree", nil, [AttachedPayment(aq(), gq)])
1697+ if ((iu == iu))
14231698 then {
1424- let id = (ic - ia)
1425- if ((id == id))
1426- then id
1699+ let iv = invoke(au(), "notifyFees", [cr, iX], nil)
1700+ if ((iv == iv))
1701+ then {
1702+ let iw = invoke(au(), "notifyNotional", [cr, iq], nil)
1703+ if ((iw == iw))
1704+ then (((((((if (jj)
1705+ then gO(cr, ij, je, iq, jc)
1706+ else hi(cr)) ++ (if (js)
1707+ then {
1708+ let iC = toBase58String(aq())
1709+ gJ(cr, iC)
1710+ }
1711+ else nil)) ++ hb(cU, cV, eS, eV, eT, eU, ik, il)) ++ hn(gp)) ++ (if ((jz > 0))
1712+ then hj(iQ, jz)
1713+ else nil)) ++ hm(jn)) ++ (if ((jx > 0))
1714+ then [ScriptTransfer(iQ, jx, fromBase58String(iF))]
1715+ else nil))
1716+ else throw("Strict value is not equal to itself.")
1717+ }
14271718 else throw("Strict value is not equal to itself.")
14281719 }
14291720 else throw("Strict value is not equal to itself.")
14341725 }
14351726 else throw("Strict value is not equal to itself.")
14361727 }
1437- else hX
1438- if ((hY == hY))
1439- then {
1440- let ie = invoke(au(), "acceptPayment", [cp], [AttachedPayment(ao(), hY)])
1441- if ((ie == ie))
1442- then {
1443- let if = {
1444- let cr = ie
1445- if ($isInstanceOf(cr, "Int"))
1446- then {
1447- let gd = cr
1448- gd
1449- }
1450- else throw("Invalid referrerFee")
1451- }
1452- let ig = (hY - if)
1453- let iu = co(cp)
1454- let fT = iu._1
1455- let hw = iu._2
1456- let hx = iu._3
1457- let hy = iu._4
1458- let iv = gh(ig)
1459- let gj = iv._1
1460- let gk = iv._2
1461- let iq = if (hU)
1462- then {
1463- let iq = invoke(ar(), "addLocked", [false], [AttachedPayment(ao(), hd)])
1464- if ((iq == iq))
1465- then nil
1466- else throw("Strict value is not equal to itself.")
1467- }
1468- else nil
1469- if ((iq == iq))
1470- then {
1471- let ir = invoke(ar(), "addFree", nil, [AttachedPayment(ao(), gk)])
1472- if ((ir == ir))
1473- then {
1474- let is = invoke(as(), "notifyFees", [cp, ig], nil)
1475- if ((is == is))
1476- then (((gH(cp, fT, (hw + hd), hx, hy) ++ hg(gj)) ++ hf((bC() + hd))) ++ hh(fR, cg))
1477- else throw("Strict value is not equal to itself.")
1478- }
1479- else throw("Strict value is not equal to itself.")
1480- }
1481- else throw("Strict value is not equal to itself.")
1482- }
1483- else throw("Strict value is not equal to itself.")
1484- }
1485- else throw("Strict value is not equal to itself.")
14861728 }
14871729 }
14881730 else throw("Strict value is not equal to itself.")
14901732
14911733
14921734
1493-@Callable(cg)
1494-func removeMargin (hd) = {
1495- let hu = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1496- if ((hu == hu))
1735+@Callable(ci)
1736+func liquidate (cr) = {
1737+ let hI = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1738+ if ((hI == hI))
14971739 then {
1498- let cp = toString(cg.caller)
1499- if (if (if (if ((0 >= hd))
1500- then true
1501- else !(cw(cp)))
1502- then true
1503- else !(cx()))
1504- then true
1505- else cy())
1506- then throw("Invalid removeMargin parameters")
1507- else {
1508- let iw = co(cp)
1509- let fT = iw._1
1510- let hw = iw._2
1511- let hx = iw._3
1512- let hy = iw._4
1513- let ix = -(hd)
1514- let iy = dd(fT, hw, hy, ix)
1515- let dm = iy._1
1516- let dn = iy._2
1517- if ((dn != 0))
1518- then throw("Invalid removed margin amount")
1519- else {
1520- let iz = ek(dm, dn, hx)
1521- if (!(ch(iz, bE(), true)))
1522- then throw(((("Too much margin removed: " + toString(iz)) + " < ") + toString(bE())))
1523- else {
1524- let iA = toBase58String(ao())
1525- let iB = fX(cp)
1526- let iC = iB._1
1527- let iD = iB._2
1528- let iE = if ((hd > iC))
1529- then iC
1530- else hd
1531- let iF = if ((iC > hd))
1532- then 0
1533- else (hd - iC)
1534- let iG = (iC - iE)
1535- let iH = if ((iG > 0))
1536- then nil
1537- else gD(cp, iA)
1538- let iI = if (((iE + iF) != hd))
1539- then throw(((((("toRepay=" + toString(iE)) + " + toWithdraw=") + toString(iF)) + " != ") + toString(hd)))
1540- else nil
1541- if ((iI == iI))
1542- then {
1543- let iJ = if ((iF > 0))
1544- then {
1545- let iJ = invoke(ar(), "withdrawLocked", [iF], nil)
1546- if ((iJ == iJ))
1547- then nil
1548- else throw("Strict value is not equal to itself.")
1549- }
1550- else nil
1551- if ((iJ == iJ))
1552- then {
1553- let iK = if ((iE > 0))
1554- then {
1555- let iL = invoke(aw(), "repay", [cp, iE, iD], nil)
1556- if ((iL == iL))
1557- then [ScriptTransfer(cg.caller, iE, fromBase58String(iD))]
1558- else throw("Strict value is not equal to itself.")
1559- }
1560- else nil
1561- if ((iK == iK))
1562- then ((((gH(cp, fT, dm, hx, cm(fT)) ++ (if ((iF > 0))
1563- then hc(cg.caller, iF)
1564- else nil)) ++ hf((bC() - hd))) ++ iH) ++ iK)
1565- else throw("Strict value is not equal to itself.")
1566- }
1567- else throw("Strict value is not equal to itself.")
1568- }
1569- else throw("Strict value is not equal to itself.")
1570- }
1571- }
1740+ let jC = ez(cr, aP)
1741+ let iB = if (eb())
1742+ then {
1743+ let jD = ez(cr, aQ)
1744+ bd(jC, jD)
15721745 }
1573- }
1574- else throw("Strict value is not equal to itself.")
1575- }
1576-
1577-
1578-
1579-@Callable(cg)
1580-func closePosition (gI,iM) = {
1581- let hu = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1582- if ((hu == hu))
1583- then {
1584- let cp = cf(cg)
1585- let iN = valueOrErrorMessage(addressFromString(cp), "Invalid caller")
1586- if (if (if (if (if (!(cw(cp)))
1587- then true
1588- else !(cx()))
1589- then true
1590- else cy())
1591- then true
1592- else (0 >= gI))
1593- then true
1594- else (0 > iM))
1595- then throw("Invalid closePosition parameters")
1596- else {
1597- let iO = co(cp)
1598- let fT = iO._1
1599- let hw = iO._2
1600- let hx = iO._3
1601- let hy = iO._4
1602- let iP = if ((ba(fT) > gI))
1603- then {
1604- let hz = if ((fT > 0))
1605- then aF
1606- else aE
1607- let hA = (hz == aE)
1608- let iQ = dy((fT > 0), gI, true)
1609- let eA = iQ._1
1610- let cQ = iQ._2
1611- let cR = iQ._3
1612- let eH = iQ._4
1613- let ez = if ((fT > 0))
1614- then -(gI)
1615- else gI
1616- let iR = ef(cp, aN)
1617- let hD = iR._1
1618- let ee = iR._2
1619- let iS = eo(cp, aN)
1620- let iT = aR(ba(ez), ba(fT))
1621- let eE = aT(ee, iT)
1622- let iU = dd(fT, hw, hy, eE)
1623- let dm = iU._1
1624- let iV = iU._2
1625- let di = iU._3
1626- let hI = (ee - eE)
1627- let hJ = if ((fT > 0))
1628- then ((hD - eA) - hI)
1629- else ((hI + hD) - eA)
1630- let hM = ba(hJ)
1631- let iW = aT(hM, iS)
1632- let hK = (fT + ez)
1633- let iX = cm(hK)
1634- let eK = (bK() - eA)
1635- if (if ((iM != 0))
1636- then (iM > eA)
1637- else false)
1638- then throw(((("Limit error: " + toString(eA)) + " < ") + toString(iM)))
1639- else $Tuple15(hK, iW, hM, iX, iV, eE, (ba((dm - iW)) + eE), cQ, cR, eH, eK, (cb() - (if ((hK > 0))
1640- then ba(ez)
1641- else 0)), (ca() - (if ((0 > hK))
1642- then ba(ez)
1643- else 0)), (bM() - (if ((hK > 0))
1644- then eA
1645- else 0)), (bL() - (if ((0 > hK))
1646- then eA
1647- else 0)))
1648- }
1649- else if ((gI > ba(fT)))
1650- then throw("Invalid closePosition parameters")
1651- else {
1652- let iY = eB(cp, true)
1653- let eA = iY._1
1654- let iV = iY._2
1655- let eE = iY._3
1656- let eF = iY._4
1657- let cQ = iY._5
1658- let cR = iY._6
1659- let eH = iY._7
1660- let eK = iY._8
1661- let ea = iY._9
1662- let eI = iY._10
1663- let eJ = iY._11
1664- let hO = iY._12
1665- let hP = iY._13
1666- if (if ((iM != 0))
1667- then (iM > eA)
1668- else false)
1669- then throw(((("Limit error: " + toString(eA)) + " < ") + toString(iM)))
1670- else $Tuple15(0, 0, 0, 0, iV, eE, eF, cQ, cR, eH, eK, eI, eJ, hO, hP)
1671- }
1672- let hK = iP._1
1673- let iW = iP._2
1674- let hM = iP._3
1675- let iX = iP._4
1676- let iV = iP._5
1677- let eE = iP._6
1678- let eF = iP._7
1679- let cQ = iP._8
1680- let cR = iP._9
1681- let eH = iP._10
1682- let eK = iP._11
1683- let eI = iP._12
1684- let eJ = iP._13
1685- let hO = iP._14
1686- let hP = iP._15
1687- if ((iV > 0))
1688- then throw("Unable to close position with bad debt")
1689- else {
1690- let iZ = ba(eF)
1691- let ja = (bC() - iZ)
1692- let jb = if ((0 > ja))
1693- then $Tuple2(0, ba(ja))
1694- else $Tuple2(ja, 0)
1695- let jc = jb._1
1696- let jd = jb._2
1697- let je = fX(cp)
1698- let iC = je._1
1699- let iD = je._2
1700- let jf = if ((iC > 0))
1701- then if ((iZ >= iC))
1702- then {
1703- let iL = invoke(aw(), "repay", [cp, iC, iD], nil)
1704- if ((iL == iL))
1705- then $Tuple2([ScriptTransfer(iN, iC, fromBase58String(iD))], (iZ - iC))
1706- else throw("Strict value is not equal to itself.")
1707- }
1708- else {
1709- let jg = invoke(aw(), "realizePartiallyAndClose", [cp, iZ, iD], nil)
1710- if ((jg == jg))
1711- then $Tuple2([ScriptTransfer(iN, iZ, fromBase58String(iD))], 0)
1712- else throw("Strict value is not equal to itself.")
1713- }
1714- else $Tuple2(nil, iZ)
1715- if ((jf == jf))
1716- then {
1717- let jh = jf._2
1718- let ji = jf._1
1719- let jj = if ((jh > 0))
1720- then {
1721- let jj = invoke(ar(), "withdrawLocked", [jh], nil)
1722- if ((jj == jj))
1723- then nil
1724- else throw("Strict value is not equal to itself.")
1725- }
1726- else nil
1727- if ((jj == jj))
1728- then {
1729- let hQ = invoke(as(), "notifyNotional", [cp, 0], nil)
1730- if ((hQ == hQ))
1731- then (((((if ((hK == 0))
1732- then hb(cp)
1733- else gH(cp, hK, iW, hM, iX)) ++ gU(cQ, cR, eH, eK, eI, eJ, hO, hP)) ++ (if ((jh > 0))
1734- then hc(iN, jh)
1735- else nil)) ++ hf(jc)) ++ ji)
1736- else throw("Strict value is not equal to itself.")
1737- }
1738- else throw("Strict value is not equal to itself.")
1739- }
1740- else throw("Strict value is not equal to itself.")
1741- }
1742- }
1743- }
1744- else throw("Strict value is not equal to itself.")
1745- }
1746-
1747-
1748-
1749-@Callable(cg)
1750-func liquidate (cp) = {
1751- let hu = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1752- if ((hu == hu))
1753- then {
1754- let jk = eo(cp, aN)
1755- let iz = if (dQ())
1756- then {
1757- let jl = eo(cp, aO)
1758- bb(jk, jl)
1759- }
1760- else jk
1761- if (if (if (if (!(ch(iz, bR(), false)))
1762- then true
1763- else !(cw(cp)))
1764- then true
1765- else !(cx()))
1766- then true
1767- else cy())
1746+ else jC
1747+ if (if (if (if (if (!(cj(iB, bT(), false)))
1748+ then true
1749+ else !(cB(cr)))
1750+ then true
1751+ else !(cC()))
1752+ then true
1753+ else cD())
1754+ then true
1755+ else dL())
17681756 then throw("Unable to liquidate")
1769- else if (if (if ((jk > bS()))
1770- then (bT() > 0)
1757+ else if (if (if ((jC > bU()))
1758+ then (bV() > 0)
17711759 else false)
1772- then (aK > bT())
1760+ then (aM > bV())
17731761 else false)
17741762 then {
1775- let jm = co(cp)
1776- let fT = jm._1
1777- let hw = jm._2
1778- let hx = jm._3
1779- let hy = jm._4
1780- let hz = if ((fT > 0))
1781- then aF
1782- else aE
1783- let hA = (hz == aE)
1784- let eA = eu(cp, fT)
1785- let jn = ef(cp, aN)
1786- let hD = jn._1
1787- let ee = jn._2
1788- let jo = cP(hA, eA)
1789- let ez = jo._1
1790- let cQ = jo._2
1791- let cR = jo._3
1792- let eH = jo._4
1793- let jp = aR(ba(ez), ba(fT))
1794- let eE = aT(ee, jp)
1795- let jq = dd(fT, hw, hy, eE)
1796- let dm = jq._1
1797- let dn = jq._2
1798- let di = jq._3
1799- let hI = (ee - eE)
1800- let hJ = if ((fT > 0))
1801- then ((hD - eA) - hI)
1802- else ((hI + hD) - eA)
1803- let jr = aT(eA, bS())
1804- let js = (jr / 2)
1805- let gk = (jr - js)
1806- let iW = (dm - jr)
1807- let hK = (fT + ez)
1808- let hM = ba(hJ)
1809- let iX = cm(hK)
1810- let eK = (bK() - eA)
1811- let ja = (bC() - jr)
1812- let jt = if ((0 > ja))
1813- then $Tuple2(0, ba(ja))
1814- else $Tuple2(ja, 0)
1815- let ju = jt._1
1816- let jd = jt._2
1817- let jv = fX(cp)
1818- let iC = jv._1
1819- let iD = jv._2
1820- let jw = if ((iC > 0))
1763+ let jE = cq(cr)
1764+ let fZ = jE._1
1765+ let hZ = jE._2
1766+ let ia = jE._3
1767+ let ib = jE._4
1768+ let hE = if ((fZ > 0))
1769+ then aH
1770+ else aG
1771+ let if = (hE == aG)
1772+ let eL = eF(cr, fZ)
1773+ let jF = eq(cr, aP)
1774+ let io = jF._1
1775+ let ep = jF._2
1776+ let jG = cQ(if, eL)
1777+ let eK = jG._1
1778+ let cU = jG._2
1779+ let cV = jG._3
1780+ let eS = jG._4
1781+ let jH = aT(bc(eK), bc(fZ))
1782+ let eP = aV(ep, jH)
1783+ let jI = dh(fZ, hZ, ib, eP)
1784+ let dq = jI._1
1785+ let dr = jI._2
1786+ let dm = jI._3
1787+ let ja = (ep - eP)
1788+ let jb = if ((fZ > 0))
1789+ then ((io - eL) - ja)
1790+ else ((ja + io) - eL)
1791+ let jJ = aV(eL, bU())
1792+ let jK = (jJ / 2)
1793+ let gq = (jJ - jK)
1794+ let je = (dq - jJ)
1795+ let ij = (fZ + eK)
1796+ let iq = bc(jb)
1797+ let jd = (ia - iq)
1798+ let jc = co(ij)
1799+ let eV = (bM() - jd)
1800+ let jl = (bE() - jJ)
1801+ let jL = if ((0 > jl))
1802+ then $Tuple2(0, bc(jl))
1803+ else $Tuple2(jl, 0)
1804+ let jM = jL._1
1805+ let jo = jL._2
1806+ let jN = gd(cr)
1807+ let iE = jN._1
1808+ let iF = jN._2
1809+ let jO = if ((iE > 0))
18211810 then {
1822- let jx = aT(iC, jp)
1823- let jg = invoke(aw(), "realizePartially", [cp, iD, jx], nil)
1824- if ((jg == jg))
1811+ let jP = aV(iE, jH)
1812+ let jr = invoke(ay(), "realizePartially", [cr, iF, jP], nil)
1813+ if ((jr == jr))
18251814 then nil
18261815 else throw("Strict value is not equal to itself.")
18271816 }
18281817 else nil
1829- if ((jw == jw))
1818+ if ((jO == jO))
18301819 then {
1831- let jj = invoke(ar(), "withdrawLocked", [jr], nil)
1832- if ((jj == jj))
1820+ let jA = invoke(at(), "withdrawLocked", [jJ], nil)
1821+ if ((jA == jA))
18331822 then {
1834- let ir = invoke(ar(), "addFree", nil, [AttachedPayment(ao(), gk)])
1835- if ((ir == ir))
1823+ let jQ = invoke(at(), "addFree", nil, [AttachedPayment(aq(), gq)])
1824+ if ((jQ == jQ))
18361825 then {
1837- let hQ = invoke(as(), "notifyNotional", [cp, hM], nil)
1838- if ((hQ == hQ))
1839- then (((gH(cp, hK, iW, hM, iX) ++ gU(cQ, cR, eH, eK, (cb() - (if ((hK > 0))
1840- then ba(ez)
1841- else 0)), (ca() - (if ((0 > hK))
1842- then ba(ez)
1843- else 0)), (bM() - (if ((hK > 0))
1844- then eA
1845- else 0)), (bL() - (if ((0 > hK))
1846- then eA
1847- else 0)))) ++ hc(cg.caller, js)) ++ hf(ju))
1826+ let iw = invoke(au(), "notifyNotional", [cr, iq], nil)
1827+ if ((iw == iw))
1828+ then (((gO(cr, ij, je, iq, jc) ++ hb(cU, cV, eS, eV, (cd() - (if ((ij > 0))
1829+ then bc(eK)
1830+ else 0)), (cc() - (if ((0 > ij))
1831+ then bc(eK)
1832+ else 0)), (bO() - (if ((ij > 0))
1833+ then jd
1834+ else 0)), (bN() - (if ((0 > ij))
1835+ then jd
1836+ else 0)))) ++ hj(ci.caller, jK)) ++ hm(jM))
18481837 else throw("Strict value is not equal to itself.")
18491838 }
18501839 else throw("Strict value is not equal to itself.")
18541843 else throw("Strict value is not equal to itself.")
18551844 }
18561845 else {
1857- let jy = eB(cp, false)
1858- let dZ = jy._1
1859- let dn = jy._2
1860- let ea = jy._3
1861- let eb = jy._4
1862- let cQ = jy._5
1863- let cR = jy._6
1864- let eH = jy._7
1865- let eK = jy._8
1866- let eA = jy._9
1867- let eI = jy._10
1868- let eJ = jy._11
1869- let hO = jy._12
1870- let hP = jy._13
1871- let jr = aT(eA, bS())
1872- let js = (jr / 2)
1873- let gk = (jr - js)
1874- let ja = (bC() - jr)
1875- let jz = if ((0 > ja))
1876- then $Tuple2(0, ba(ja))
1877- else $Tuple2(ja, 0)
1878- let ju = jz._1
1879- let jd = jz._2
1880- let jA = fX(cp)
1881- let iC = jA._1
1882- let iD = jA._2
1883- let jw = if ((iC > 0))
1846+ let jR = eM(cr, false)
1847+ let ek = jR._1
1848+ let dr = jR._2
1849+ let el = jR._3
1850+ let em = jR._4
1851+ let cU = jR._5
1852+ let cV = jR._6
1853+ let eS = jR._7
1854+ let eV = jR._8
1855+ let eL = jR._9
1856+ let eT = jR._10
1857+ let eU = jR._11
1858+ let ik = jR._12
1859+ let il = jR._13
1860+ let jJ = aV(eL, bU())
1861+ let jK = (jJ / 2)
1862+ let gq = (jJ - jK)
1863+ let jl = (bE() - jJ)
1864+ let jS = if ((0 > jl))
1865+ then $Tuple2(0, bc(jl))
1866+ else $Tuple2(jl, 0)
1867+ let jM = jS._1
1868+ let jo = jS._2
1869+ let jT = gd(cr)
1870+ let iE = jT._1
1871+ let iF = jT._2
1872+ let jO = if ((iE > 0))
18841873 then {
1885- let jg = invoke(aw(), "realizePartiallyAndClose", [cp, 0, iD], nil)
1886- if ((jg == jg))
1874+ let jr = invoke(ay(), "realizePartiallyAndClose", [cr, 0, iF], nil)
1875+ if ((jr == jr))
18871876 then nil
18881877 else throw("Strict value is not equal to itself.")
18891878 }
18901879 else nil
1891- if ((jw == jw))
1880+ if ((jO == jO))
18921881 then {
1893- let gd = if ((dn > 0))
1882+ let gj = if ((dr > 0))
18941883 then {
1895- let jB = invoke(ar(), "exchangeFreeAndLocked", [dn], nil)
1896- if ((jB == jB))
1884+ let jU = invoke(at(), "exchangeFreeAndLocked", [dr], nil)
1885+ if ((jU == jU))
18971886 then nil
18981887 else throw("Strict value is not equal to itself.")
18991888 }
19001889 else nil
1901- if ((gd == gd))
1890+ if ((gj == gj))
19021891 then {
1903- let jj = invoke(ar(), "withdrawLocked", [jr], nil)
1904- if ((jj == jj))
1892+ let jA = invoke(at(), "withdrawLocked", [jJ], nil)
1893+ if ((jA == jA))
19051894 then {
1906- let ir = invoke(ar(), "addFree", nil, [AttachedPayment(ao(), gk)])
1907- if ((ir == ir))
1895+ let jQ = invoke(at(), "addFree", nil, [AttachedPayment(aq(), gq)])
1896+ if ((jQ == jQ))
19081897 then {
1909- let hQ = invoke(as(), "notifyNotional", [cp, 0], nil)
1910- if ((hQ == hQ))
1911- then (((hb(cp) ++ gU(cQ, cR, eH, eK, eI, eJ, hO, hP)) ++ hc(cg.caller, js)) ++ hf(ju))
1898+ let iw = invoke(au(), "notifyNotional", [cr, 0], nil)
1899+ if ((iw == iw))
1900+ then (((hi(cr) ++ hb(cU, cV, eS, eV, eT, eU, ik, il)) ++ hj(ci.caller, jK)) ++ hm(jM))
19121901 else throw("Strict value is not equal to itself.")
19131902 }
19141903 else throw("Strict value is not equal to itself.")
19251914
19261915
19271916
1928-@Callable(cg)
1917+@Callable(ci)
19291918 func payFunding () = {
1930- let jC = bN()
1931- if (if (if ((jC > lastBlock.timestamp))
1932- then true
1933- else !(cx()))
1934- then true
1935- else cy())
1936- then throw(((("Invalid funding block timestamp: " + toString(lastBlock.timestamp)) + " < ") + toString(jC)))
1937- else {
1938- let fD = dz()
1939- let jD = fC()
1940- let fG = jD._1
1941- let fH = jD._2
1942- gx((jC + bQ()), (bY() + fH), (bZ() + fG), aR(fH, fD), aR(fG, fD))
1943- }
1944- }
1945-
1946-
1947-
1948-@Callable(cg)
1919+ let hI = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1920+ if ((hI == hI))
1921+ then {
1922+ let jV = bP()
1923+ if (if (if ((jV > lastBlock.timestamp))
1924+ then true
1925+ else !(cC()))
1926+ then true
1927+ else cD())
1928+ then throw(((("Invalid funding block timestamp: " + toString(lastBlock.timestamp)) + " < ") + toString(jV)))
1929+ else {
1930+ let fJ = dE()
1931+ let jW = fI()
1932+ let fM = jW._1
1933+ let fN = jW._2
1934+ gD((jV + bS()), (ca() + fN), (cb() + fM), aT(fN, fJ), aT(fM, fJ))
1935+ }
1936+ }
1937+ else throw("Strict value is not equal to itself.")
1938+ }
1939+
1940+
1941+
1942+@Callable(ci)
19491943 func syncTerminalPriceToOracle () = {
1950- let jE = fy(dz())
1951- let jF = jE._1
1952- let jG = jE._2
1953- let eF = jE._3
1954- let jH = if ((eF != 0))
1944+ let cM = bH()
1945+ let cN = bI()
1946+ let jX = fE(dE(), cM, cN)
1947+ let hv = jX._1
1948+ let hw = jX._2
1949+ let eQ = jX._3
1950+ let hx = if ((eQ != 0))
19551951 then {
1956- let jH = invoke(ar(), "exchangeFreeAndLocked", [eF], nil)
1957- if ((jH == jH))
1952+ let hx = invoke(at(), "exchangeFreeAndLocked", [eQ], nil)
1953+ if ((hx == hx))
19581954 then nil
19591955 else throw("Strict value is not equal to itself.")
19601956 }
19611957 else nil
1962- if ((jH == jH))
1963- then gT(jF, jG)
1958+ if ((hx == hx))
1959+ then (ha(hv, hw) ++ gS(aT(aV(cM, hv), aV(cN, hw))))
19641960 else throw("Strict value is not equal to itself.")
19651961 }
19661962
19671963
19681964
1969-@Callable(cg)
1970-func view_calcRemainMarginWithFundingPayment (cp) = {
1971- let hu = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1972- if ((hu == hu))
1965+@Callable(ci)
1966+func view_calcRemainMarginWithFundingPayment (cr) = {
1967+ let hI = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1968+ if ((hI == hI))
19731969 then {
1974- let jI = co(cp)
1975- let cs = jI._1
1976- let eh = jI._2
1977- let eq = jI._3
1978- let ej = jI._4
1979- let jJ = ef(cp, aN)
1980- let dW = jJ._1
1981- let ee = jJ._2
1982- let jK = dd(cs, eh, ej, ee)
1983- let dm = jK._1
1984- let dn = jK._2
1985- let di = jK._3
1986- throw((((((aP(dm) + aP(di)) + aP(et(cp))) + aP(ee)) + aP(dn)) + aP(dW)))
1970+ let jY = cq(cr)
1971+ let cu = jY._1
1972+ let es = jY._2
1973+ let eB = jY._3
1974+ let eu = jY._4
1975+ let jZ = eq(cr, aP)
1976+ let eh = jZ._1
1977+ let ep = jZ._2
1978+ let ka = dh(cu, es, eu, ep)
1979+ let dq = ka._1
1980+ let dr = ka._2
1981+ let dm = ka._3
1982+ throw((((((aR(dq) + aR(dm)) + aR(eE(cr))) + aR(ep)) + aR(dr)) + aR(eh)))
19871983 }
19881984 else throw("Strict value is not equal to itself.")
19891985 }
19901986
19911987
19921988
1993-@Callable(cg)
1994-func view_getPegAdjustCost (gM) = {
1995- let fx = fy(gM)
1996- throw(toString(fx._3))
1997- }
1998-
1999-
2000-
2001-@Callable(cg)
1989+@Callable(ci)
1990+func view_getPegAdjustCost (gT) = {
1991+ let cM = bH()
1992+ let cN = bI()
1993+ let fD = fE(gT, cM, cN)
1994+ throw(toString(fD._3))
1995+ }
1996+
1997+
1998+
1999+@Callable(ci)
20022000 func view_getTerminalAmmPrice () = {
2003- let jL = fb()
2004- let ff = jL._1
2005- let fg = jL._2
2006- let hj = aR(aT(ff, bH()), aT(fg, bI()))
2007- throw(toString(hj))
2008- }
2009-
2010-
2011-
2012-@Callable(cg)
2001+ let kb = fm()
2002+ let fq = kb._1
2003+ let fr = kb._2
2004+ let hq = aT(aV(fq, bJ()), aV(fr, bK()))
2005+ throw(toString(hq))
2006+ }
2007+
2008+
2009+
2010+@Callable(ci)
20132011 func view_getFunding () = {
2014- let fD = dz()
2015- let jM = fC()
2016- let fG = jM._1
2017- let fH = jM._2
2018- let jN = aR(fH, fD)
2019- let jO = aR(fG, fD)
2020- throw((((aP(jN) + aP(jO)) + aP(eL())) + aP(dz())))
2021- }
2022-
2023-
2024-
2025-@Callable(cg)
2026-func view_getBorrowedByTrader (cp) = {
2027- let jP = fX(cp)
2028- let iC = jP._1
2029- let iD = jP._2
2030- throw((aP(iC) + iD))
2031- }
2032-
2033-
2034-
2035-@Callable(cg)
2012+ let fJ = dE()
2013+ let kc = fI()
2014+ let fM = kc._1
2015+ let fN = kc._2
2016+ let kd = aT(fN, fJ)
2017+ let ke = aT(fM, fJ)
2018+ throw((((aR(kd) + aR(ke)) + aR(eW())) + aR(dE())))
2019+ }
2020+
2021+
2022+
2023+@Callable(ci)
2024+func view_getBorrowedByTrader (cr) = {
2025+ let kf = gd(cr)
2026+ let iE = kf._1
2027+ let iF = kf._2
2028+ throw((aR(iE) + iF))
2029+ }
2030+
2031+
2032+
2033+@Callable(ci)
20362034 func computeSpotPrice () = {
2037- let fx = dP()
2038- $Tuple2(nil, fx)
2039- }
2040-
2041-
2042-
2043-@Callable(cg)
2044-func computeFeeForTraderWithArtifact (cp,fJ) = {
2045- let fx = ga(cp, fJ)
2046- $Tuple2(nil, fx)
2047- }
2048-
2049-
2050-@Verifier(jQ)
2051-func jR () = sigVerify(jQ.bodyBytes, jQ.proofs[0], an())
2035+ let fD = ea()
2036+ $Tuple2(nil, fD)
2037+ }
2038+
2039+
2040+
2041+@Callable(ci)
2042+func computeFeeForTraderWithArtifact (cr,fP) = {
2043+ let fD = gg(cr, fP)
2044+ $Tuple2(nil, fD)
2045+ }
2046+
2047+
2048+@Verifier(kg)
2049+func kh () = sigVerify(kg.bodyBytes, kg.proofs[0], ap())
20522050
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let a = "k_ora_key"
55
66 let b = "k_ora_block_key"
77
8-let c = "k_ora"
9-
10-let d = "k_balance"
11-
12-let e = "k_sequence"
13-
14-let f = "k_positionSize"
15-
16-let g = "k_positionMargin"
17-
18-let h = "k_positionOpenNotional"
19-
20-let i = "k_positionFraction"
21-
22-let j = "k_positionSequence"
23-
24-let k = "k_positionAsset"
25-
26-let l = "k_initialized"
27-
28-let m = "k_paused"
29-
30-let n = "k_closeOnly"
31-
32-let o = "k_fee"
33-
34-let p = "k_fundingPeriod"
35-
36-let q = "k_initMarginRatio"
37-
38-let r = "k_mmr"
39-
40-let s = "k_liquidationFeeRatio"
41-
42-let t = "k_partLiquidationRatio"
43-
44-let u = "k_spreadLimit"
45-
46-let v = "k_maxPriceImpact"
47-
48-let w = "k_maxPriceSpread"
49-
50-let x = "k_maxOpenNotional"
51-
52-let y = "k_feeToStakersPercent"
53-
54-let z = "k_maxOracleDelay"
55-
56-let A = "k_lastDataStr"
57-
58-let B = "k_lastMinuteId"
59-
60-let C = "k_twapDataLastCumulativePrice"
61-
62-let D = "k_twapDataLastPrice"
63-
64-let E = "k_twapDataPreviousMinuteId"
65-
66-let F = "k_latestLongPremiumFraction"
67-
68-let G = "k_latestShortPremiumFraction"
69-
70-let H = "k_nextFundingBlockMinTimestamp"
71-
72-let I = "k_longFundingRate"
73-
74-let J = "k_shortFundingRate"
75-
76-let K = "k_qtAstR"
77-
78-let L = "k_bsAstR"
79-
80-let M = "k_qtAstW"
81-
82-let N = "k_bsAstW"
83-
84-let O = "k_totalPositionSize"
85-
86-let P = "k_totalLongPositionSize"
87-
88-let Q = "k_totalShortPositionSize"
89-
90-let R = "k_openInterestNotional"
91-
92-let S = "k_openInterestShort"
93-
94-let T = "k_openInterestLong"
95-
96-let U = "k_coordinatorAddress"
97-
98-let V = "k_vault_address"
99-
100-let W = "k_admin_address"
101-
102-let X = "k_admin_public_key"
103-
104-let Y = "k_quote_asset"
105-
106-let Z = "k_quote_staking"
107-
108-let aa = "k_staking_address"
109-
110-let ab = "k_miner_address"
111-
112-let ac = "k_orders_address"
113-
114-let ad = "k_referral_address"
115-
116-let ae = "k_collateral_address"
117-
118-let af = "k_exchange_address"
119-
120-let ag = "k_nft_manager_address"
121-
122-let ah = "k_trader_market_asset_collateral"
123-
124-func ai (aj,ak) = ((aj + "_") + ak)
125-
126-
127-func al () = valueOrErrorMessage(addressFromString(getStringValue(this, U)), "Coordinator not set")
128-
129-
130-func am () = addressFromString(getStringValue(al(), W))
131-
132-
133-func an () = fromBase58String(getStringValue(al(), X))
134-
135-
136-func ao () = fromBase58String(getStringValue(al(), Y))
137-
138-
139-func ap () = valueOrErrorMessage(addressFromString(getStringValue(al(), Z)), "Quote asset staking not set")
140-
141-
142-func aq () = valueOrErrorMessage(addressFromString(getStringValue(al(), aa)), "Staking not set")
143-
144-
145-func ar () = valueOrErrorMessage(addressFromString(getStringValue(al(), V)), "Vault not set")
146-
147-
148-func as () = valueOrErrorMessage(addressFromString(getStringValue(al(), ab)), "Miner not set")
149-
150-
151-func at () = valueOrErrorMessage(addressFromString(getStringValue(al(), ac)), "Orders not set")
152-
153-
154-func au () = valueOrErrorMessage(addressFromString(getStringValue(al(), ad)), "Referral not set")
155-
156-
157-func av () = valueOrErrorMessage(addressFromString(getStringValue(al(), ag)), "NFT Manager not set")
158-
159-
160-func aw () = valueOrErrorMessage(addressFromString(getStringValue(al(), ae)), "Collateral Manager not set")
161-
162-
163-func ax () = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(al(), af), "No swap address")), "Invalid swap address")
164-
165-
166-let ay = "k_whitelist_asset"
167-
168-func az (aA) = valueOrElse(getBoolean(aw(), ai(ay, aA)), false)
169-
170-
171-let aB = "k_token_param"
172-
173-let aC = "k_token_type"
174-
175-let aD = "fee_reduction"
176-
177-let aE = 1
178-
179-let aF = 2
180-
181-let aG = 15
182-
183-let aH = 15
184-
185-let aI = 1000
186-
187-let aJ = 6
188-
189-let aK = (1 * (((((10 * 10) * 10) * 10) * 10) * 10))
190-
191-let aL = (86400 * aK)
192-
193-let aM = 100
194-
195-let aN = 1
196-
197-let aO = 2
198-
199-func aP (aQ) = (toString(aQ) + ",")
200-
201-
202-func aR (aQ,aS) = fraction(aQ, aK, aS, HALFEVEN)
203-
204-
205-func aT (aQ,aS) = fraction(aQ, aS, aK, HALFEVEN)
206-
207-
208-func aU (aQ) = sqrt(aQ, aJ, aJ, HALFEVEN)
209-
210-
211-func aV (aQ,aS) = pow(aQ, aJ, aS, aJ, aJ, HALFEVEN)
212-
213-
214-func aW (aQ,aS) = fraction(aQ, toBigInt(aK), aS, HALFEVEN)
215-
216-
217-func aX (aQ,aS) = fraction(aQ, aS, toBigInt(aK), HALFEVEN)
218-
219-
220-func aY (aQ) = sqrtBigInt(aQ, aJ, aJ, HALFEVEN)
221-
222-
223-func aZ (aQ,aS) = pow(aQ, aJ, aS, aJ, aJ, HALFEVEN)
224-
225-
226-func ba (aQ) = if ((aQ > 0))
227- then aQ
228- else -(aQ)
229-
230-
231-func bb (aQ,aS) = if ((aQ >= aS))
232- then aQ
233- else aS
234-
235-
236-func bc (bd) = {
237- func be (bf,bg) = ((bf + bg) + ",")
238-
239- let bh = {
240- let bi = bd
241- let bj = size(bi)
242- let bk = ""
243- func bl (bm,bn) = if ((bn >= bj))
244- then bm
245- else be(bm, bi[bn])
246-
247- func bo (bm,bn) = if ((bn >= bj))
248- then bm
8+let c = "k_ora_open_key"
9+
10+let d = "k_ora"
11+
12+let e = "k_balance"
13+
14+let f = "k_sequence"
15+
16+let g = "k_positionSize"
17+
18+let h = "k_positionMargin"
19+
20+let i = "k_positionOpenNotional"
21+
22+let j = "k_positionFraction"
23+
24+let k = "k_positionSequence"
25+
26+let l = "k_positionAsset"
27+
28+let m = "k_positionFee"
29+
30+let n = "k_initialized"
31+
32+let o = "k_paused"
33+
34+let p = "k_closeOnly"
35+
36+let q = "k_fee"
37+
38+let r = "k_fundingPeriod"
39+
40+let s = "k_initMarginRatio"
41+
42+let t = "k_mmr"
43+
44+let u = "k_liquidationFeeRatio"
45+
46+let v = "k_partLiquidationRatio"
47+
48+let w = "k_spreadLimit"
49+
50+let x = "k_maxPriceImpact"
51+
52+let y = "k_maxPriceSpread"
53+
54+let z = "k_maxOpenNotional"
55+
56+let A = "k_feeToStakersPercent"
57+
58+let B = "k_maxOracleDelay"
59+
60+let C = "k_lastDataStr"
61+
62+let D = "k_lastMinuteId"
63+
64+let E = "k_twapDataLastCumulativePrice"
65+
66+let F = "k_twapDataLastPrice"
67+
68+let G = "k_twapDataPreviousMinuteId"
69+
70+let H = "k_latestLongPremiumFraction"
71+
72+let I = "k_latestShortPremiumFraction"
73+
74+let J = "k_nextFundingBlockMinTimestamp"
75+
76+let K = "k_longFundingRate"
77+
78+let L = "k_shortFundingRate"
79+
80+let M = "k_qtAstR"
81+
82+let N = "k_bsAstR"
83+
84+let O = "k_qtAstW"
85+
86+let P = "k_bsAstW"
87+
88+let Q = "k_totalPositionSize"
89+
90+let R = "k_totalLongPositionSize"
91+
92+let S = "k_totalShortPositionSize"
93+
94+let T = "k_openInterestNotional"
95+
96+let U = "k_openInterestShort"
97+
98+let V = "k_openInterestLong"
99+
100+let W = "k_coordinatorAddress"
101+
102+let X = "k_vault_address"
103+
104+let Y = "k_admin_address"
105+
106+let Z = "k_admin_public_key"
107+
108+let aa = "k_quote_asset"
109+
110+let ab = "k_quote_staking"
111+
112+let ac = "k_staking_address"
113+
114+let ad = "k_miner_address"
115+
116+let ae = "k_orders_address"
117+
118+let af = "k_referral_address"
119+
120+let ag = "k_collateral_address"
121+
122+let ah = "k_exchange_address"
123+
124+let ai = "k_nft_manager_address"
125+
126+let aj = "k_trader_market_asset_collateral"
127+
128+func ak (al,am) = ((al + "_") + am)
129+
130+
131+func an () = valueOrErrorMessage(addressFromString(getStringValue(this, W)), "Coordinator not set")
132+
133+
134+func ao () = addressFromString(getStringValue(an(), Y))
135+
136+
137+func ap () = fromBase58String(getStringValue(an(), Z))
138+
139+
140+func aq () = fromBase58String(getStringValue(an(), aa))
141+
142+
143+func ar () = valueOrErrorMessage(addressFromString(getStringValue(an(), ab)), "Quote asset staking not set")
144+
145+
146+func as () = valueOrErrorMessage(addressFromString(getStringValue(an(), ac)), "Staking not set")
147+
148+
149+func at () = valueOrErrorMessage(addressFromString(getStringValue(an(), X)), "Vault not set")
150+
151+
152+func au () = valueOrErrorMessage(addressFromString(getStringValue(an(), ad)), "Miner not set")
153+
154+
155+func av () = valueOrErrorMessage(addressFromString(getStringValue(an(), ae)), "Orders not set")
156+
157+
158+func aw () = valueOrErrorMessage(addressFromString(getStringValue(an(), af)), "Referral not set")
159+
160+
161+func ax () = valueOrErrorMessage(addressFromString(getStringValue(an(), ai)), "NFT Manager not set")
162+
163+
164+func ay () = valueOrErrorMessage(addressFromString(getStringValue(an(), ag)), "Collateral Manager not set")
165+
166+
167+func az () = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(an(), ah), "No swap address")), "Invalid swap address")
168+
169+
170+let aA = "k_whitelist_asset"
171+
172+func aB (aC) = valueOrElse(getBoolean(ay(), ak(aA, aC)), false)
173+
174+
175+let aD = "k_token_param"
176+
177+let aE = "k_token_type"
178+
179+let aF = "fee_reduction"
180+
181+let aG = 1
182+
183+let aH = 2
184+
185+let aI = 15
186+
187+let aJ = 15
188+
189+let aK = 1000
190+
191+let aL = 6
192+
193+let aM = (1 * (((((10 * 10) * 10) * 10) * 10) * 10))
194+
195+let aN = (86400 * aM)
196+
197+let aO = 100
198+
199+let aP = 1
200+
201+let aQ = 2
202+
203+func aR (aS) = (toString(aS) + ",")
204+
205+
206+func aT (aS,aU) = fraction(aS, aM, aU, HALFEVEN)
207+
208+
209+func aV (aS,aU) = fraction(aS, aU, aM, HALFEVEN)
210+
211+
212+func aW (aS) = sqrt(aS, aL, aL, HALFEVEN)
213+
214+
215+func aX (aS,aU) = pow(aS, aL, aU, aL, aL, HALFEVEN)
216+
217+
218+func aY (aS,aU) = fraction(aS, toBigInt(aM), aU, HALFEVEN)
219+
220+
221+func aZ (aS,aU) = fraction(aS, aU, toBigInt(aM), HALFEVEN)
222+
223+
224+func ba (aS) = sqrtBigInt(aS, aL, aL, HALFEVEN)
225+
226+
227+func bb (aS,aU) = pow(aS, aL, aU, aL, aL, HALFEVEN)
228+
229+
230+func bc (aS) = if ((aS > 0))
231+ then aS
232+ else -(aS)
233+
234+
235+func bd (aS,aU) = if ((aS >= aU))
236+ then aS
237+ else aU
238+
239+
240+func be (bf) = {
241+ func bg (bh,bi) = ((bh + bi) + ",")
242+
243+ let bj = {
244+ let bk = bf
245+ let bl = size(bk)
246+ let bm = ""
247+ func bn (bo,bp) = if ((bp >= bl))
248+ then bo
249+ else bg(bo, bk[bp])
250+
251+ func bq (bo,bp) = if ((bp >= bl))
252+ then bo
249253 else throw("List size exceeds 20")
250254
251- bo(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bk, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
255+ bq(bn(bn(bn(bn(bn(bn(bn(bn(bn(bn(bn(bn(bn(bn(bn(bn(bn(bn(bn(bn(bm, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
252256 }
253- let bp = dropRight(bh, 1)
254- let bq = if ((take(bp, 1) == ","))
255- then drop(bp, 1)
256- else bp
257- bq
258- }
259-
260-
261-func br (bs) = split(bs, ",")
262-
263-
264-func bt (bd,bu,bv) = if ((size(bd) > bu))
265- then (removeByIndex(bd, 0) :+ bv)
266- else (bd :+ bv)
267-
268-
269-func bw (bx) = valueOrErrorMessage(getInteger(this, bx), ("no value for " + bx))
270-
271-
272-func by (bx,bz) = valueOrElse(getInteger(this, bx), bz)
273-
274-
275-func bA (ak,aj) = {
276- let bg = valueOrErrorMessage(getString(ak, aj), ("No value for key " + aj))
277- bg
278- }
279-
280-
281-func bB (ak,aj) = {
282- let bg = valueOrErrorMessage(getInteger(ak, aj), ("No value for key " + aj))
283- bg
284- }
285-
286-
287-func bC () = bw(d)
288-
289-
290-func bD () = bw(o)
291-
292-
293-func bE () = bw(q)
294-
295-
296-func bF () = bw(K)
297-
298-
299-func bG () = bw(L)
300-
301-
302-func bH () = by(M, aK)
303-
304-
305-func bI () = by(N, aK)
306-
307-
308-func bJ () = bw(O)
309-
310-
311-func bK () = bw(R)
312-
313-
314-func bL () = bw(S)
315-
316-
317-func bM () = bw(T)
318-
319-
320-func bN () = bw(H)
321-
322-
323-func bO () = bw(p)
324-
325-
326-func bP () = (bO() * aK)
327-
328-
329-func bQ () = (bO() * aI)
330-
331-
332-func bR () = bw(r)
333-
334-
335-func bS () = bw(s)
336-
337-
338-func bT () = bw(t)
339-
340-
341-func bU () = bw(u)
342-
343-
344-func bV () = bw(v)
345-
346-
347-func bW () = bw(w)
348-
349-
350-func bX () = bw(x)
351-
352-
353-func bY () = bw(F)
354-
355-
356-func bZ () = bw(G)
357-
358-
359-func ca () = bw(Q)
360-
361-
362-func cb () = bw(P)
363-
364-
365-func cc () = by(e, 0)
366-
367-
368-func cd () = bw(y)
369-
370-
371-func ce () = bw(z)
372-
373-
374-func cf (cg) = valueOrElse(getString(at(), "k_sender"), toString(cg.caller))
375-
376-
377-func ch (ci,cj,ck) = {
378- let cl = (ci - cj)
379- if (if (ck)
380- then (0 > cl)
257+ let br = dropRight(bj, 1)
258+ let bs = if ((take(br, 1) == ","))
259+ then drop(br, 1)
260+ else br
261+ bs
262+ }
263+
264+
265+func bt (bu) = split(bu, ",")
266+
267+
268+func bv (bf,bw,bx) = if ((size(bf) > bw))
269+ then (removeByIndex(bf, 0) :+ bx)
270+ else (bf :+ bx)
271+
272+
273+func by (bz) = valueOrErrorMessage(getInteger(this, bz), ("no value for " + bz))
274+
275+
276+func bA (bz,bB) = valueOrElse(getInteger(this, bz), bB)
277+
278+
279+func bC (am,al) = {
280+ let bi = valueOrErrorMessage(getString(am, al), ("No value for key " + al))
281+ bi
282+ }
283+
284+
285+func bD (am,al) = {
286+ let bi = valueOrErrorMessage(getInteger(am, al), ("No value for key " + al))
287+ bi
288+ }
289+
290+
291+func bE () = by(e)
292+
293+
294+func bF () = by(q)
295+
296+
297+func bG () = by(s)
298+
299+
300+func bH () = by(M)
301+
302+
303+func bI () = by(N)
304+
305+
306+func bJ () = bA(O, aM)
307+
308+
309+func bK () = bA(P, aM)
310+
311+
312+func bL () = by(Q)
313+
314+
315+func bM () = by(T)
316+
317+
318+func bN () = by(U)
319+
320+
321+func bO () = by(V)
322+
323+
324+func bP () = by(J)
325+
326+
327+func bQ () = by(r)
328+
329+
330+func bR () = (bQ() * aM)
331+
332+
333+func bS () = (bQ() * aK)
334+
335+
336+func bT () = by(t)
337+
338+
339+func bU () = by(u)
340+
341+
342+func bV () = by(v)
343+
344+
345+func bW () = by(w)
346+
347+
348+func bX () = by(x)
349+
350+
351+func bY () = by(y)
352+
353+
354+func bZ () = by(z)
355+
356+
357+func ca () = by(H)
358+
359+
360+func cb () = by(I)
361+
362+
363+func cc () = by(S)
364+
365+
366+func cd () = by(R)
367+
368+
369+func ce () = bA(f, 0)
370+
371+
372+func cf () = by(A)
373+
374+
375+func cg () = by(B)
376+
377+
378+func ch (ci) = valueOrElse(getString(av(), "k_sender"), toString(ci.caller))
379+
380+
381+func cj (ck,cl,cm) = {
382+ let cn = (ck - cl)
383+ if (if (cm)
384+ then (0 > cn)
381385 else false)
382- then throw("Invalid margin")
383- else if (if (!(ck))
384- then (cl >= 0)
386+ then throw(((("Invalid margin: " + toString(ck)) + " < ") + toString(cl)))
387+ else if (if (!(cm))
388+ then (cn >= 0)
385389 else false)
386- then throw("Invalid margin")
390+ then throw(((("Invalid margin: " + toString(ck)) + " > ") + toString(cl)))
387391 else true
388392 }
389393
390394
391-func cm (cn) = if ((cn == 0))
395+func co (cp) = if ((cp == 0))
392396 then throw("Should not be called with _positionSize == 0")
393- else if ((cn > 0))
394- then bY()
395- else bZ()
396-
397-
398-func co (cp) = {
399- let cq = getInteger(this, ai(f, cp))
400- let cr = cq
401- if ($isInstanceOf(cr, "Int"))
397+ else if ((cp > 0))
398+ then ca()
399+ else cb()
400+
401+
402+func cq (cr) = {
403+ let cs = getInteger(this, ak(g, cr))
404+ let ct = cs
405+ if ($isInstanceOf(ct, "Int"))
402406 then {
403- let cs = cr
404- $Tuple4(cs, getIntegerValue(this, ai(g, cp)), getIntegerValue(this, ai(h, cp)), getIntegerValue(this, ai(i, cp)))
407+ let cu = ct
408+ $Tuple4(cu, getIntegerValue(this, ak(h, cr)), getIntegerValue(this, ak(i, cr)), getIntegerValue(this, ak(j, cr)))
405409 }
406410 else $Tuple4(0, 0, 0, 0)
407411 }
408412
409413
410-func ct (cp) = {
411- let cu = getString(this, ai(k, cp))
412- let cr = cu
413- if ($isInstanceOf(cr, "String"))
414+func cv (cr) = {
415+ let cw = getString(this, ak(l, cr))
416+ let ct = cw
417+ if ($isInstanceOf(ct, "String"))
414418 then {
415- let cv = cr
416- cv
417- }
418- else toBase58String(ao())
419- }
420-
421-
422-func cw (cp) = if ((co(cp)._1 == 0))
419+ let cx = ct
420+ cx
421+ }
422+ else toBase58String(aq())
423+ }
424+
425+
426+func cy (cr) = {
427+ let cz = getInteger(this, ak(m, cr))
428+ let ct = cz
429+ if ($isInstanceOf(ct, "Int"))
430+ then {
431+ let cA = ct
432+ cA
433+ }
434+ else bF()
435+ }
436+
437+
438+func cB (cr) = if ((cq(cr)._1 == 0))
423439 then throw("No open position")
424440 else true
425441
426442
427-func cx () = valueOrElse(getBoolean(this, l), false)
428-
429-
430-func cy () = valueOrElse(getBoolean(this, m), false)
431-
432-
433-func cz () = valueOrElse(getBoolean(this, n), false)
434-
435-
436-func cA (cB,cC,cD) = if (cB)
443+func cC () = valueOrElse(getBoolean(this, n), false)
444+
445+
446+func cD () = valueOrElse(getBoolean(this, o), false)
447+
448+
449+func cE () = valueOrElse(getBoolean(this, p), false)
450+
451+
452+func cF (cG,cH,cI) = if (cG)
437453 then {
438- let cE = (bG() - cD)
439- if ((0 >= cE))
454+ let cJ = (bI() - cI)
455+ if ((0 >= cJ))
440456 then throw("Tx lead to base asset reserve <= 0, revert")
441- else $Tuple3((bF() + cC), cE, (bJ() + cD))
457+ else $Tuple3((bH() + cH), cJ, (bL() + cI))
442458 }
443459 else {
444- let cF = (bF() - cC)
445- if ((0 >= cF))
460+ let cK = (bH() - cH)
461+ if ((0 >= cK))
446462 then throw("Tx lead to base quote reserve <= 0, revert")
447- else $Tuple3(cF, (bG() + cD), (bJ() - cD))
463+ else $Tuple3(cK, (bI() + cI), (bL() - cI))
448464 }
449465
450466
451-func cG (cH,cI,cJ,cK) = {
452- let cL = toBigInt(cH)
453- let cM = toBigInt(cI)
454- let cN = toBigInt(cJ)
455- let cO = toBigInt(cK)
456- aX(aX(cL, cM), aX(cN, cO))
457- }
458-
459-
460-func cP (cB,cC) = {
461- let cH = bF()
462- let cJ = bG()
463- let cI = bH()
464- let cK = bI()
465- let bx = cG(cH, cI, cJ, cK)
466- let cQ = if (cB)
467- then (cH + cC)
468- else (cH - cC)
469- let cR = toInt(aW(bx, toBigInt(aT(cQ, cI))))
470- let cS = aR(ba((cR - cJ)), cI)
471- let cT = if (cB)
472- then cS
473- else -(cS)
474- let cU = cA(cB, cC, cS)
475- let cV = cU._1
476- let cW = cU._2
477- let cX = cU._3
478- let cY = aR(aT(cH, cI), aT(cJ, cK))
479- let cZ = aR(cC, cS)
480- let da = ba((cY - cZ))
481- let db = (aK - aR(cY, (cY + da)))
482- let dc = bV()
483- if ((db > dc))
484- then throw(((((((((((((("Price impact " + toString(db)) + " > max price impact ") + toString(dc)) + " before quote asset: ") + toString(cH)) + " before base asset: ") + toString(cJ)) + " quote asset amount to exchange: ") + toString(cC)) + " price before: ") + toString(cY)) + " marketPrice: ") + toString(cZ)))
485- else $Tuple4(cT, cV, cW, cX)
486- }
487-
488-
489-func dd (de,df,dg,dh) = {
490- let di = if ((de != 0))
467+func cL (cM,cN) = {
468+ let cO = toBigInt(cM)
469+ let cP = toBigInt(cN)
470+ aZ(cO, cP)
471+ }
472+
473+
474+func cQ (cG,cH) = {
475+ let cM = bH()
476+ let cN = bI()
477+ let cR = bJ()
478+ let cS = bK()
479+ let cT = aT(cH, cR)
480+ let bz = cL(cM, cN)
481+ let cU = if (cG)
482+ then (cM + cT)
483+ else (cM - cT)
484+ let cV = toInt(aY(bz, toBigInt(cU)))
485+ let cW = bc((cV - cN))
486+ let cX = if (cG)
487+ then cW
488+ else -(cW)
489+ let cY = cF(cG, cT, cW)
490+ let cZ = cY._1
491+ let da = cY._2
492+ let db = cY._3
493+ let dc = aT(aV(cM, cR), aV(cN, cS))
494+ let dd = aT(cH, cW)
495+ let de = bc((dc - dd))
496+ let df = (aM - aT(dc, (dc + de)))
497+ let dg = bX()
498+ if ((df > dg))
499+ then throw(((((((((((((("Price impact " + toString(df)) + " > max price impact ") + toString(dg)) + " before quote asset: ") + toString(cM)) + " before base asset: ") + toString(cN)) + " quote asset amount to exchange: ") + toString(cH)) + " price before: ") + toString(dc)) + " marketPrice: ") + toString(dd)))
500+ else $Tuple4(cX, cZ, da, db)
501+ }
502+
503+
504+func dh (di,dj,dk,dl) = {
505+ let dm = if ((di != 0))
491506 then {
492- let dj = cm(de)
493- aT((dj - dg), de)
507+ let dn = co(di)
508+ aV((dn - dk), di)
494509 }
495510 else 0
496- let dk = ((dh - di) + df)
497- let dl = if ((0 > dk))
498- then $Tuple2(0, ba(dk))
499- else $Tuple2(ba(dk), 0)
500- let dm = dl._1
501- let dn = dl._2
502- $Tuple3(dm, dn, di)
503- }
504-
505-
506-func do (cB,cD,dp,dq,dr,ds,dt) = {
507- let cY = aR(aT(dq, dr), aT(ds, dt))
508- if ((cD == 0))
511+ let do = ((dl - dm) + dj)
512+ let dp = if ((0 > do))
513+ then $Tuple2(0, bc(do))
514+ else $Tuple2(bc(do), 0)
515+ let dq = dp._1
516+ let dr = dp._2
517+ $Tuple3(dq, dr, dm)
518+ }
519+
520+
521+func ds (cG,cI,dt,du,dv,dw,dx) = {
522+ let dc = aT(aV(du, dv), aV(dw, dx))
523+ if ((cI == 0))
509524 then throw("Invalid base asset amount")
510525 else {
511- let bx = cG(dq, dr, ds, dt)
512- let du = if (cB)
513- then (ds + cD)
514- else (ds - cD)
515- let dv = toInt(aW(bx, toBigInt(aT(du, dt))))
516- let dw = ba((dv - aT(dq, dr)))
517- let dc = bV()
518- let dx = cA(!(cB), dw, cD)
519- let cV = dx._1
520- let cW = dx._2
521- let cX = dx._3
522- let cZ = aR(dw, cD)
523- let da = ba((cY - cZ))
524- let db = (aK - aR(cY, (cY + da)))
525- if (if ((db > dc))
526- then dp
526+ let bz = cL(du, dw)
527+ let dy = if (cG)
528+ then (dw + cI)
529+ else (dw - cI)
530+ let dz = toInt(aY(bz, toBigInt(dy)))
531+ let dA = bc((dz - du))
532+ let dB = aV(dA, dv)
533+ let dg = bX()
534+ let dC = cF(!(cG), dA, cI)
535+ let cZ = dC._1
536+ let da = dC._2
537+ let db = dC._3
538+ let dd = aT(dB, cI)
539+ let de = bc((dc - dd))
540+ let df = (aM - aT(dc, (dc + de)))
541+ if (if ((df > dg))
542+ then dt
527543 else false)
528- then throw(((((((((((((("Price impact " + toString(db)) + " > max price impact ") + toString(dc)) + " before quote asset: ") + toString(dq)) + " before base asset: ") + toString(ds)) + " base asset amount to exchange: ") + toString(cD)) + " price before: ") + toString(cY)) + " market price: ") + toString(cZ)))
529- else $Tuple7(dw, cV, cW, cX, (cb() - (if (cB)
530- then ba(cD)
531- else 0)), (ca() - (if (!(cB))
532- then ba(cD)
533- else 0)), db)
534- }
535- }
536-
537-
538-func dy (cB,cD,dp) = do(cB, cD, dp, bF(), bH(), bG(), bI())
539-
540-
541-func dz () = {
542- let dA = valueOrErrorMessage(addressFromString(getStringValue(this, c)), "")
543- let dB = getStringValue(this, a)
544- let dC = valueOrErrorMessage(getInteger(dA, dB), ((("Can not get oracle price. Oracle: " + toString(dA)) + " key: ") + dB))
545- let dD = valueOrElse(getString(this, b), "")
546- if ((dD != ""))
544+ then throw(((((((((((((("Price impact " + toString(df)) + " > max price impact ") + toString(dg)) + " before quote asset: ") + toString(du)) + " before base asset: ") + toString(dw)) + " base asset amount to exchange: ") + toString(cI)) + " price before: ") + toString(dc)) + " market price: ") + toString(dd)))
545+ else $Tuple7(dB, cZ, da, db, (cd() - (if (cG)
546+ then bc(cI)
547+ else 0)), (cc() - (if (!(cG))
548+ then bc(cI)
549+ else 0)), df)
550+ }
551+ }
552+
553+
554+func dD (cG,cI,dt) = ds(cG, cI, dt, bH(), bJ(), bI(), bK())
555+
556+
557+func dE () = {
558+ let dF = valueOrErrorMessage(addressFromString(getStringValue(this, d)), "")
559+ let dG = getStringValue(this, a)
560+ let dH = valueOrErrorMessage(getInteger(dF, dG), ((("Can not get oracle price. Oracle: " + toString(dF)) + " key: ") + dG))
561+ let dI = valueOrElse(getString(this, b), "")
562+ if ((dI != ""))
547563 then {
548- let dE = lastBlock.height
549- let dF = valueOrErrorMessage(getInteger(dA, b), ((("Can not get oracle block. Oracle: " + toString(dA)) + " key: ") + dD))
550- if (((dE - dF) > ce()))
551- then throw(((("Oracle stale data. Last oracle block: " + toString(dF)) + " current block: ") + toString(dE)))
552- else dC
553- }
554- else dC
555- }
556-
557-
558-func dG (dq,ds) = {
559- let dH = dz()
560- let cI = bH()
561- let cK = bI()
562- let dI = aR(aT(dq, cI), aT(ds, cK))
563- let dJ = aR((dH + dI), (2 * aK))
564- let dK = aR(ba((dH - dI)), dJ)
565- if ((dK > bW()))
566- then throw(((("Price spread " + toString(dK)) + " > max price spread ") + toString(bW())))
564+ let dJ = lastBlock.height
565+ let dK = valueOrErrorMessage(getInteger(dF, dI), ((("Can not get oracle block. Oracle: " + toString(dF)) + " key: ") + dI))
566+ if (((dJ - dK) > cg()))
567+ then throw(((("Oracle stale data. Last oracle block: " + toString(dK)) + " current block: ") + toString(dJ)))
568+ else dH
569+ }
570+ else dH
571+ }
572+
573+
574+func dL () = {
575+ let dF = valueOrErrorMessage(addressFromString(getStringValue(this, d)), "")
576+ let dM = valueOrElse(getString(this, c), "")
577+ if ((dM != ""))
578+ then {
579+ let dN = valueOrErrorMessage(getBoolean(dF, dM), ((("Can not get oracle is open/closed. Oracle: " + toString(dF)) + " key: ") + dM))
580+ !(dN)
581+ }
582+ else false
583+ }
584+
585+
586+func dO (dP,du,dw,cR,cS) = {
587+ let dQ = aT(aV(du, cR), aV(dw, cS))
588+ let dR = aT((dP + dQ), (2 * aM))
589+ let dO = aT(bc((dP - dQ)), dR)
590+ dO
591+ }
592+
593+
594+func dS (du,dw) = {
595+ let dT = dE()
596+ let cR = bJ()
597+ let cS = bK()
598+ let dU = dO(dT, bH(), bI(), cR, cS)
599+ let dV = dO(dT, du, dw, cR, cS)
600+ if (if ((dV > bY()))
601+ then (dV > dU)
602+ else false)
603+ then throw(((("Price spread " + toString(dV)) + " > max price spread ") + toString(bY())))
567604 else true
568605 }
569606
570607
571-func dL (dM,dN) = {
572- let dO = bX()
573- if ((dM > dO))
574- then throw(((("Long open notional " + toString(dM)) + " > max open notional ") + toString(dO)))
575- else if ((dN > dO))
576- then throw(((("Short open notional " + toString(dN)) + " > max open notional ") + toString(dO)))
608+func dW (dX,dY) = {
609+ let dZ = bZ()
610+ if ((dX > dZ))
611+ then throw(((("Long open notional " + toString(dX)) + " > max open notional ") + toString(dZ)))
612+ else if ((dY > dZ))
613+ then throw(((("Short open notional " + toString(dY)) + " > max open notional ") + toString(dZ)))
577614 else true
578615 }
579616
580617
581-func dP () = {
582- let dq = bF()
583- let ds = bG()
584- let cI = bH()
585- let cK = bI()
586- aR(aT(dq, cI), aT(ds, cK))
587- }
588-
589-
590-func dQ () = {
591- let dH = dz()
592- let dR = dP()
593- (aR(ba((dH - dR)), dH) > bU())
594- }
595-
596-
597-func dS (cn,dT,dq,dr,ds,dt) = {
598- let dU = ba(cn)
599- let dV = (0 > cn)
600- let dW = if ((dT == aN))
618+func ea () = {
619+ let du = bH()
620+ let dw = bI()
621+ let cR = bJ()
622+ let cS = bK()
623+ aT(aV(du, cR), aV(dw, cS))
624+ }
625+
626+
627+func eb () = {
628+ let dT = dE()
629+ let ec = ea()
630+ (aT(bc((dT - ec)), dT) > bW())
631+ }
632+
633+
634+func ed (cp,ee,du,dv,dw,dx) = {
635+ let ef = bc(cp)
636+ let eg = (0 > cp)
637+ let eh = if ((ee == aP))
601638 then {
602- let dX = do(!(dV), dU, false, dq, dr, ds, dt)
603- let dY = dX._1
604- let dZ = dX._2
605- let ea = dX._3
606- let eb = dX._4
607- dY
608- }
609- else aT(dU, dz())
610- dW
611- }
612-
613-
614-func ec (cn,ed,dq,dr,ds,dt,dT) = if ((cn == 0))
639+ let ei = ds(!(eg), ef, false, du, dv, dw, dx)
640+ let ej = ei._1
641+ let ek = ei._2
642+ let el = ei._3
643+ let em = ei._4
644+ ej
645+ }
646+ else aV(ef, dE())
647+ eh
648+ }
649+
650+
651+func en (cp,eo,du,dv,dw,dx,ee) = if ((cp == 0))
615652 then throw("Invalid position size")
616653 else {
617- let dV = (0 > cn)
618- let dW = dS(cn, dT, dq, dr, ds, dt)
619- let ee = if (dV)
620- then (ed - dW)
621- else (dW - ed)
622- $Tuple2(dW, ee)
654+ let eg = (0 > cp)
655+ let eh = ed(cp, ee, du, dv, dw, dx)
656+ let ep = if (eg)
657+ then (eo - eh)
658+ else (eh - eo)
659+ $Tuple2(eh, ep)
623660 }
624661
625662
626-func ef (cp,dT) = {
627- let eg = co(cp)
628- let cs = eg._1
629- let eh = eg._2
630- let ei = eg._3
631- let ej = eg._4
632- ec(cs, ei, bF(), bH(), bG(), bI(), dT)
633- }
634-
635-
636-func ek (el,em,en) = aR((el - em), en)
637-
638-
639-func eo (cp,dT) = {
640- let ep = co(cp)
641- let cs = ep._1
642- let eh = ep._2
643- let eq = ep._3
644- let ej = ep._4
645- let er = ef(cp, dT)
646- let dW = er._1
647- let ee = er._2
648- let es = dd(cs, eh, ej, ee)
649- let dm = es._1
650- let dn = es._2
651- ek(dm, dn, dW)
652- }
653-
654-
655-func et (cp) = eo(cp, aN)
656-
657-
658-func eu (cp,cn) = {
659- let ev = bb(bT(), (aK - aR(et(cp), bR())))
660- let ew = aT(ba(cn), ev)
661- let ex = dy((cn > 0), ew, false)
662- let ey = ex._1
663- let db = ex._7
664- if ((bV() > db))
665- then ey
663+func eq (cr,ee) = {
664+ let er = cq(cr)
665+ let cu = er._1
666+ let es = er._2
667+ let et = er._3
668+ let eu = er._4
669+ en(cu, et, bH(), bJ(), bI(), bK(), ee)
670+ }
671+
672+
673+func ev (ew,ex,ey) = aT((ew - ex), ey)
674+
675+
676+func ez (cr,ee) = {
677+ let eA = cq(cr)
678+ let cu = eA._1
679+ let es = eA._2
680+ let eB = eA._3
681+ let eu = eA._4
682+ let eC = eq(cr, ee)
683+ let eh = eC._1
684+ let ep = eC._2
685+ let eD = dh(cu, es, eu, ep)
686+ let dq = eD._1
687+ let dr = eD._2
688+ ev(dq, dr, eh)
689+ }
690+
691+
692+func eE (cr) = ez(cr, aP)
693+
694+
695+func eF (cr,cp) = {
696+ let eG = bd(bV(), (aM - aT(eE(cr), bT())))
697+ let eH = aV(bc(cp), eG)
698+ let eI = dD((cp > 0), eH, false)
699+ let eJ = eI._1
700+ let df = eI._7
701+ if ((bX() > df))
702+ then eJ
666703 else {
667- let ez = aT(ba(cn), bT())
668- let eA = dy((cn > 0), ez, false)._1
669- eA
670- }
671- }
672-
673-
674-func eB (cp,dp) = {
675- let eC = co(cp)
676- let cs = eC._1
677- let eh = eC._2
678- let ei = eC._3
679- let ej = eC._4
680- let ee = ef(cp, aN)._2
681- let eD = dd(cs, eh, ej, ee)
682- let dm = eD._1
683- let dn = eD._2
684- let ez = -(cs)
685- let eE = ee
686- let eF = -(dm)
687- let eG = dy((cs > 0), ba(cs), dp)
688- let eA = eG._1
689- let cQ = eG._2
690- let cR = eG._3
691- let eH = eG._4
692- let eI = eG._5
693- let eJ = eG._6
694- let eK = (bK() - ei)
695- $Tuple13(ez, dn, eE, eF, cQ, cR, eH, eK, eA, eI, eJ, (bM() - (if ((cs > 0))
696- then ei
697- else 0)), (bL() - (if ((0 > cs))
698- then ei
704+ let eK = aV(bc(cp), bV())
705+ let eL = dD((cp > 0), eK, false)._1
706+ eL
707+ }
708+ }
709+
710+
711+func eM (cr,dt) = {
712+ let eN = cq(cr)
713+ let cu = eN._1
714+ let es = eN._2
715+ let et = eN._3
716+ let eu = eN._4
717+ let ep = eq(cr, aP)._2
718+ let eO = dh(cu, es, eu, ep)
719+ let dq = eO._1
720+ let dr = eO._2
721+ let eK = -(cu)
722+ let eP = ep
723+ let eQ = -(dq)
724+ let eR = dD((cu > 0), bc(cu), dt)
725+ let eL = eR._1
726+ let cU = eR._2
727+ let cV = eR._3
728+ let eS = eR._4
729+ let eT = eR._5
730+ let eU = eR._6
731+ let eV = (bM() - et)
732+ $Tuple13(eK, dr, eP, eQ, cU, cV, eS, eV, eL, eT, eU, (bO() - (if ((cu > 0))
733+ then et
734+ else 0)), (bN() - (if ((0 > cu))
735+ then et
699736 else 0)))
700737 }
701738
702739
703-func eL () = {
704- let eM = ((lastBlock.timestamp / 1000) / 60)
705- let eN = (eM - aG)
706- let eO = valueOrElse(getString(this, A), "")
707- let eP = split(eO, ",")
708- func eQ (bf,eR) = if ((eN >= parseIntValue(eR)))
709- then (bf :+ parseIntValue(eR))
710- else bf
711-
712- let eS = {
713- let bi = eP
714- let bj = size(bi)
715- let bk = nil
716- func bl (bm,bn) = if ((bn >= bj))
717- then bm
718- else eQ(bm, bi[bn])
719-
720- func bo (bm,bn) = if ((bn >= bj))
721- then bm
740+func eW () = {
741+ let eX = ((lastBlock.timestamp / 1000) / 60)
742+ let eY = (eX - aI)
743+ let eZ = valueOrElse(getString(this, C), "")
744+ let fa = split(eZ, ",")
745+ func fb (bh,fc) = if ((eY >= parseIntValue(fc)))
746+ then (bh :+ parseIntValue(fc))
747+ else bh
748+
749+ let fd = {
750+ let bk = fa
751+ let bl = size(bk)
752+ let bm = nil
753+ func bn (bo,bp) = if ((bp >= bl))
754+ then bo
755+ else fb(bo, bk[bp])
756+
757+ func bq (bo,bp) = if ((bp >= bl))
758+ then bo
722759 else throw("List size exceeds 20")
723760
724- bo(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bl(bk, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
761+ bq(bn(bn(bn(bn(bn(bn(bn(bn(bn(bn(bn(bn(bn(bn(bn(bn(bn(bn(bn(bn(bm, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
725762 }
726- let eT = if ((size(eS) > 0))
727- then max(eS)
728- else parseIntValue(eP[0])
729- let eU = valueOrElse(getInteger(this, B), 0)
730- let eV = valueOrElse(getInteger(this, ((C + "_") + toString(eU))), 0)
731- let eW = valueOrElse(getInteger(this, ((D + "_") + toString(eU))), 0)
732- let eX = (eV + ((eM - eU) * eW))
733- let eY = valueOrElse(getInteger(this, ((C + "_") + toString(eT))), 0)
734- let eZ = valueOrElse(getInteger(this, ((D + "_") + toString(eT))), 0)
735- let fa = (eY + ((eN - eT) * eZ))
736- ((eX - fa) / aG)
737- }
738-
739-
740-func fb () = {
741- let cn = bJ()
742- if ((cn == 0))
743- then $Tuple2(bF(), bG())
763+ let fe = if ((size(fd) > 0))
764+ then max(fd)
765+ else parseIntValue(fa[0])
766+ let ff = valueOrElse(getInteger(this, D), 0)
767+ let fg = valueOrElse(getInteger(this, ((E + "_") + toString(ff))), 0)
768+ let fh = valueOrElse(getInteger(this, ((F + "_") + toString(ff))), 0)
769+ let fi = (fg + ((eX - ff) * fh))
770+ let fj = valueOrElse(getInteger(this, ((E + "_") + toString(fe))), 0)
771+ let fk = valueOrElse(getInteger(this, ((F + "_") + toString(fe))), 0)
772+ let fl = (fj + ((eY - fe) * fk))
773+ ((fi - fl) / aI)
774+ }
775+
776+
777+func fm () = {
778+ let cp = bL()
779+ if ((cp == 0))
780+ then $Tuple2(bH(), bI())
744781 else {
745- let fc = (cn > 0)
746- let fd = dy(fc, ba(cn), false)
747- let fe = fd._1
748- let ff = fd._2
749- let fg = fd._3
750- $Tuple2(ff, fg)
751- }
752- }
753-
754-
755-func fh (fi,bJ,fj,fk) = {
756- let fl = toBigInt(fi)
757- let fm = toBigInt(bJ)
758- let fn = toBigInt(fj)
759- let fo = toBigInt(fk)
760- let fp = aZ((fl + fm), toBigInt((2 * aK)))
761- let fq = aX(fn, fp)
762- let fr = (toBigInt(4) * aX(fo, fm))
763- let fs = aY(aX(fq, (fn - fr)))
764- let ft = aX(fl, fn)
765- let fu = aX(fn, fm)
766- let fv = ((-(fs) + ft) + fu)
767- let fw = (toBigInt(2) * aX(fn, fm))
768- let fx = aW(fv, fw)
769- toInt(fx)
770- }
771-
772-
773-func fy (fz) = {
774- let cn = bJ()
775- if ((cn == 0))
782+ let fn = (cp > 0)
783+ let fo = dD(fn, bc(cp), false)
784+ let fp = fo._1
785+ let fq = fo._2
786+ let fr = fo._3
787+ $Tuple2(fq, fr)
788+ }
789+ }
790+
791+
792+func fs (ft,bL,fu,fv) = {
793+ let fw = toBigInt(ft)
794+ let fx = toBigInt(bL)
795+ let fy = toBigInt(fu)
796+ let fz = toBigInt(fv)
797+ let bz = aZ(fy, fw)
798+ let fA = (fw + fx)
799+ let fB = aY(bz, fA)
800+ let fC = aY(fB, fA)
801+ let fD = aY(fz, fC)
802+ toInt(fD)
803+ }
804+
805+
806+func fE (fF,cM,cN) = {
807+ let cp = bL()
808+ if ((cp == 0))
776809 then {
777- let cH = bF()
778- let cJ = bG()
779- let fA = aR(aT(fz, cJ), cH)
780- $Tuple3(fA, aK, 0)
810+ let fG = aT(aV(fF, cN), cM)
811+ $Tuple3(fG, aM, 0)
781812 }
782813 else {
783- let fc = (cn > 0)
784- let fe = dy(fc, ba(cn), false)._1
785- let cH = bF()
786- let cJ = bG()
787- let fA = fh(cJ, cn, cH, fz)
788- let fB = aK
789- let eF = ec(cn, fe, cH, fA, cJ, fB, aN)._2
790- $Tuple3(fA, fB, eF)
791- }
792- }
793-
794-
795-func fC () = {
796- let fD = dz()
797- let fE = eL()
798- let fF = (fE - fD)
799- if (if ((ca() == 0))
814+ let fn = (cp > 0)
815+ let fp = dD(fn, bc(cp), false)._1
816+ let fG = fs(cN, cp, cM, fF)
817+ let fH = aM
818+ let eQ = en(cp, fp, cM, fG, cN, fH, aP)._2
819+ $Tuple3(fG, fH, eQ)
820+ }
821+ }
822+
823+
824+func fI () = {
825+ let fJ = dE()
826+ let fK = eW()
827+ let fL = (fK - fJ)
828+ if (if (if ((cc() == 0))
800829 then true
801- else (cb() == 0))
830+ else (cd() == 0))
831+ then true
832+ else dL())
802833 then $Tuple2(0, 0)
803- else if ((0 > fF))
834+ else if ((0 > fL))
804835 then {
805- let fG = aR(aT(fF, bP()), aL)
806- let fH = aR(aT(fG, ca()), cb())
807- $Tuple2(fG, fH)
836+ let fM = aT(aV(fL, bR()), aN)
837+ let fN = aT(aV(fM, cc()), cd())
838+ $Tuple2(fM, fN)
808839 }
809840 else {
810- let fH = aR(aT(fF, bP()), aL)
811- let fG = aR(aT(fH, cb()), ca())
812- $Tuple2(fG, fH)
841+ let fN = aT(aV(fL, bR()), aN)
842+ let fM = aT(aV(fN, cd()), cc())
843+ $Tuple2(fM, fN)
813844 }
814845 }
815846
816847
817-func fI (fJ,fK) = {
818- let fL = bD()
819- let fM = aT(fL, fK)
820- let fN = if ((fJ != ""))
848+func fO (fP,fQ) = {
849+ let fR = bF()
850+ let fS = aV(fR, fQ)
851+ let fT = if ((fP != ""))
821852 then {
822- let fO = bA(av(), ai(aC, fJ))
823- if ((fO == aD))
853+ let fU = bC(ax(), ak(aE, fP))
854+ if ((fU == aF))
824855 then {
825- let fP = bB(av(), ai(aB, fJ))
826- let fQ = aT(fM, fP)
827- $Tuple2(fQ, true)
856+ let fV = bD(ax(), ak(aD, fP))
857+ let fW = aV(fS, fV)
858+ $Tuple2(fW, true)
828859 }
829860 else throw("Invalid attached artifact")
830861 }
831- else $Tuple2(fM, false)
832- let fQ = fN._1
833- let fR = fN._2
834- $Tuple2(fQ, fR)
835- }
836-
837-
838-func fS (cp,aA) = {
839- let fT = co(cp)._1
840- if ((fT == 0))
862+ else $Tuple2(fS, false)
863+ let fW = fT._1
864+ let fX = fT._2
865+ $Tuple2(fW, fX)
866+ }
867+
868+
869+func fY (cr,aC) = {
870+ let fZ = cq(cr)._1
871+ if ((fZ == 0))
841872 then true
842- else (ct(cp) == aA)
843- }
844-
845-
846-func fU (cp,aA) = (ct(cp) == aA)
847-
848-
849-func fV (fW,aA,cp) = ((((((ah + "_") + fW) + "_") + aA) + "_") + cp)
850-
851-
852-func fX (cp) = {
853- let cv = ct(cp)
854- if ((cv == toBase58String(ao())))
855- then $Tuple2(0, cv)
873+ else (cv(cr) == aC)
874+ }
875+
876+
877+func ga (cr,aC) = (cv(cr) == aC)
878+
879+
880+func gb (gc,aC,cr) = ((((((aj + "_") + gc) + "_") + aC) + "_") + cr)
881+
882+
883+func gd (cr) = {
884+ let cx = cv(cr)
885+ if ((cx == toBase58String(aq())))
886+ then $Tuple2(0, cx)
856887 else {
857- let fY = fV(toString(this), cv, cp)
858- let fZ = valueOrElse(getInteger(aw(), fY), 0)
859- $Tuple2(fZ, cv)
860- }
861- }
862-
863-
864-func ga (cp,fJ) = {
865- let gb = invoke(as(), "computeFeeDiscount", [cp], nil)
866- if ((gb == gb))
888+ let ge = gb(toString(this), cx, cr)
889+ let gf = valueOrElse(getInteger(ay(), ge), 0)
890+ $Tuple2(gf, cx)
891+ }
892+ }
893+
894+
895+func gg (cr,fP) = {
896+ let gh = invoke(au(), "computeFeeDiscount", [cr], nil)
897+ if ((gh == gh))
867898 then {
868- let gc = {
869- let cr = gb
870- if ($isInstanceOf(cr, "Int"))
899+ let gi = {
900+ let ct = gh
901+ if ($isInstanceOf(ct, "Int"))
871902 then {
872- let gd = cr
873- gd
903+ let gj = ct
904+ gj
874905 }
875906 else throw("Invalid computeFeeDiscount result")
876907 }
877- let ge = fI(fJ, gc)
878- let fQ = ge._1
879- let fR = ge._2
880- $Tuple2(fQ, fR)
908+ let gk = fO(fP, gi)
909+ let fW = gk._1
910+ let fX = gk._2
911+ $Tuple2(fW, fX)
881912 }
882913 else throw("Strict value is not equal to itself.")
883914 }
884915
885916
886-func gf (cg) = {
887- let gg = if ((size(cg.payments) > 1))
888- then toBase58String(valueOrErrorMessage(cg.payments[1].assetId, "Invalid artifactId"))
917+func gl (ci) = {
918+ let gm = if ((size(ci.payments) > 1))
919+ then toBase58String(valueOrErrorMessage(ci.payments[1].assetId, "Invalid artifactId"))
889920 else ""
890- gg
891- }
892-
893-
894-func gh (gi) = {
895- let gj = aT(gi, cd())
896- let gk = (gi - gj)
897- $Tuple2(gj, gk)
898- }
899-
900-
901-func gl (gm,gn,go,gp,gq,gr,gs,gt,gu,dO,gv,gw) = [IntegerEntry(q, gm), IntegerEntry(r, gn), IntegerEntry(s, go), IntegerEntry(p, gp), IntegerEntry(o, gq), IntegerEntry(u, gr), IntegerEntry(v, gs), IntegerEntry(t, gt), IntegerEntry(w, gu), IntegerEntry(x, dO), IntegerEntry(y, gv), IntegerEntry(z, gv)]
902-
903-
904-func gx (gy,gz,gA,gB,gC) = [IntegerEntry(H, gy), IntegerEntry(F, gz), IntegerEntry(G, gA), IntegerEntry(I, gB), IntegerEntry(J, gC)]
905-
906-
907-func gD (ak,aA) = [StringEntry(ai(k, ak), aA)]
908-
909-
910-func gE (gF,ak) = if (gF)
921+ gm
922+ }
923+
924+
925+func gn (go) = {
926+ let gp = aV(go, cf())
927+ let gq = (go - gp)
928+ $Tuple2(gp, gq)
929+ }
930+
931+
932+func gr (gs,gt,gu,gv,gw,gx,gy,gz,gA,dZ,gB,gC) = [IntegerEntry(s, gs), IntegerEntry(t, gt), IntegerEntry(u, gu), IntegerEntry(r, gv), IntegerEntry(q, gw), IntegerEntry(w, gx), IntegerEntry(x, gy), IntegerEntry(v, gz), IntegerEntry(y, gA), IntegerEntry(z, dZ), IntegerEntry(A, gB), IntegerEntry(B, gB)]
933+
934+
935+func gD (gE,gF,gG,gH,gI) = [IntegerEntry(J, gE), IntegerEntry(H, gF), IntegerEntry(I, gG), IntegerEntry(K, gH), IntegerEntry(L, gI)]
936+
937+
938+func gJ (am,aC) = [StringEntry(ak(l, am), aC)]
939+
940+
941+func gK (gL,am) = if (gL)
911942 then {
912- let gG = cc()
913-[IntegerEntry(ai(j, ak), (gG + 1)), IntegerEntry(e, (gG + 1))]
943+ let gM = ce()
944+[IntegerEntry(ak(k, am), (gM + 1)), IntegerEntry(f, (gM + 1))]
914945 }
915946 else nil
916947
917948
918-func gH (ak,gI,gJ,gK,dj) = [IntegerEntry(ai(f, ak), gI), IntegerEntry(ai(g, ak), gJ), IntegerEntry(ai(h, ak), gK), IntegerEntry(ai(i, ak), dj)]
919-
920-
921-func gL (gM) = {
922- let eM = ((lastBlock.timestamp / 1000) / 60)
923- let gN = valueOrElse(getInteger(this, B), 0)
924- if ((gN > eM))
949+func gN (gL,am,gw) = if (gL)
950+ then [IntegerEntry(ak(m, am), gw)]
951+ else nil
952+
953+
954+func gO (am,gP,gQ,gR,dn) = [IntegerEntry(ak(g, am), gP), IntegerEntry(ak(h, am), gQ), IntegerEntry(ak(i, am), gR), IntegerEntry(ak(j, am), dn)]
955+
956+
957+func gS (gT) = {
958+ let eX = ((lastBlock.timestamp / 1000) / 60)
959+ let gU = valueOrElse(getInteger(this, D), 0)
960+ if ((gU > eX))
925961 then throw("TWAP out-of-order")
926962 else {
927- let eU = if ((gN == 0))
928- then eM
929- else gN
930- if ((eM > gN))
963+ let ff = if ((gU == 0))
964+ then eX
965+ else gU
966+ if ((eX > gU))
931967 then {
932- let gO = valueOrElse(getInteger(this, ((C + "_") + toString(gN))), 0)
933- let gP = valueOrElse(getInteger(this, ((D + "_") + toString(gN))), gM)
934- let gQ = (gO + ((eM - eU) * gP))
935- let eP = bt(br(valueOrElse(getString(this, A), "")), aG, toString(eM))
936-[IntegerEntry(ai(C, toString(eM)), gQ), IntegerEntry(ai(D, toString(eM)), gM), IntegerEntry(ai(E, toString(eM)), gN), IntegerEntry(B, eM), StringEntry(A, bc(eP))]
968+ let gV = valueOrElse(getInteger(this, ((E + "_") + toString(gU))), 0)
969+ let gW = valueOrElse(getInteger(this, ((F + "_") + toString(gU))), gT)
970+ let gX = (gV + ((eX - ff) * gW))
971+ let fa = bv(bt(valueOrElse(getString(this, C), "")), aI, toString(eX))
972+[IntegerEntry(ak(E, toString(eX)), gX), IntegerEntry(ak(F, toString(eX)), gT), IntegerEntry(ak(G, toString(eX)), gU), IntegerEntry(D, eX), StringEntry(C, be(fa))]
937973 }
938974 else {
939- let gR = valueOrElse(getInteger(this, ai(E, toString(eM))), 0)
940- let gO = valueOrElse(getInteger(this, ai(C, toString(gR))), 0)
941- let gP = valueOrElse(getInteger(this, ai(D, toString(gR))), gM)
942- let gQ = (gO + ((eM - gR) * gP))
943-[IntegerEntry(ai(C, toString(eM)), gQ), IntegerEntry(ai(D, toString(eM)), gM)]
975+ let gY = valueOrElse(getInteger(this, ak(G, toString(eX))), 0)
976+ let gV = valueOrElse(getInteger(this, ak(E, toString(gY))), 0)
977+ let gW = valueOrElse(getInteger(this, ak(F, toString(gY))), gT)
978+ let gX = (gV + ((eX - gY) * gW))
979+[IntegerEntry(ak(E, toString(eX)), gX), IntegerEntry(ak(F, toString(eX)), gT)]
944980 }
945981 }
946982 }
947983
948984
949-func gS (cH,cJ) = [IntegerEntry(K, cH), IntegerEntry(L, cJ)]
950-
951-
952-func gT (cI,cK) = [IntegerEntry(M, cI), IntegerEntry(N, cK)]
953-
954-
955-func gU (cH,cJ,gV,gW,gX,gY,gZ,ha) = {
956- let cI = bH()
957- let cK = bI()
958- if (((gX - gY) != gV))
959- then throw(((((("Invalid AMM state data: " + toString(gX)) + " + ") + toString(gY)) + " != ") + toString(gV)))
960- else ((gS(cH, cJ) ++ [IntegerEntry(O, gV), IntegerEntry(R, gW), IntegerEntry(P, gX), IntegerEntry(Q, gY), IntegerEntry(T, gZ), IntegerEntry(S, ha)]) ++ gL(aR(aT(cH, cI), aT(cJ, cK))))
961- }
962-
963-
964-func hb (ak) = [DeleteEntry(ai(f, ak)), DeleteEntry(ai(g, ak)), DeleteEntry(ai(h, ak)), DeleteEntry(ai(i, ak)), DeleteEntry(ai(k, ak))]
965-
966-
967-func hc (ak,hd) = {
968- let he = assetBalance(this, ao())
969- if ((hd > he))
970- then throw(((("Unable to withdraw " + toString(hd)) + " from contract balance ") + toString(he)))
971- else [ScriptTransfer(ak, hd, ao())]
972- }
973-
974-
975-func hf (cg) = if ((0 > cg))
985+func gZ (cM,cN) = [IntegerEntry(M, cM), IntegerEntry(N, cN)]
986+
987+
988+func ha (cR,cS) = [IntegerEntry(O, cR), IntegerEntry(P, cS)]
989+
990+
991+func hb (cM,cN,hc,hd,he,hf,hg,hh) = {
992+ let cR = bJ()
993+ let cS = bK()
994+ if (((he - hf) != hc))
995+ then throw(((((("Invalid AMM state data: " + toString(he)) + " + ") + toString(hf)) + " != ") + toString(hc)))
996+ else ((gZ(cM, cN) ++ [IntegerEntry(Q, hc), IntegerEntry(T, hd), IntegerEntry(R, he), IntegerEntry(S, hf), IntegerEntry(V, hg), IntegerEntry(U, hh)]) ++ gS(aT(aV(cM, cR), aV(cN, cS))))
997+ }
998+
999+
1000+func hi (am) = [DeleteEntry(ak(g, am)), DeleteEntry(ak(h, am)), DeleteEntry(ak(i, am)), DeleteEntry(ak(j, am)), DeleteEntry(ak(l, am))]
1001+
1002+
1003+func hj (am,hk) = {
1004+ let hl = assetBalance(this, aq())
1005+ if ((hk > hl))
1006+ then throw(((("Unable to withdraw " + toString(hk)) + " from contract balance ") + toString(hl)))
1007+ else [ScriptTransfer(am, hk, aq())]
1008+ }
1009+
1010+
1011+func hm (ci) = if ((0 > ci))
9761012 then throw("Balance")
977- else [IntegerEntry(d, cg)]
978-
979-
980-func hg (cg) = [ScriptTransfer(aq(), cg, ao())]
981-
982-
983-func hh (hi,cg) = if (hi)
984- then [Burn(valueOrErrorMessage(cg.payments[1].assetId, "Invalid artifact"), 1)]
1013+ else [IntegerEntry(e, ci)]
1014+
1015+
1016+func hn (ci) = [ScriptTransfer(as(), ci, aq())]
1017+
1018+
1019+func ho (hp,ci) = if (hp)
1020+ then [Burn(valueOrErrorMessage(ci.payments[1].assetId, "Invalid artifact"), 1)]
9851021 else nil
9861022
9871023
988-@Callable(cg)
989-func pause () = if ((cg.caller != am()))
1024+@Callable(ci)
1025+func pause () = if ((ci.caller != ao()))
9901026 then throw("Invalid pause params")
991- else [BooleanEntry(m, true)]
992-
993-
994-
995-@Callable(cg)
996-func unpause () = if ((cg.caller != am()))
1027+ else [BooleanEntry(o, true)]
1028+
1029+
1030+
1031+@Callable(ci)
1032+func unpause () = if ((ci.caller != ao()))
9971033 then throw("Invalid unpause params")
998- else [BooleanEntry(m, false)]
999-
1000-
1001-
1002-@Callable(cg)
1003-func setCloseOnly () = if ((cg.caller != am()))
1034+ else [BooleanEntry(o, false)]
1035+
1036+
1037+
1038+@Callable(ci)
1039+func setCloseOnly () = if ((ci.caller != ao()))
10041040 then throw("Invalid setCloseOnly params")
1005- else [BooleanEntry(n, true)]
1006-
1007-
1008-
1009-@Callable(cg)
1010-func unsetCloseOnly () = if ((cg.caller != am()))
1041+ else [BooleanEntry(p, true)]
1042+
1043+
1044+
1045+@Callable(ci)
1046+func unsetCloseOnly () = if ((ci.caller != ao()))
10111047 then throw("Invalid unsetCloseOnly params")
1012- else [BooleanEntry(n, false)]
1013-
1014-
1015-
1016-@Callable(cg)
1017-func addLiquidity (cC) = if (if ((cg.caller != am()))
1048+ else [BooleanEntry(p, false)]
1049+
1050+
1051+
1052+@Callable(ci)
1053+func addLiquidity (cH) = if (if ((ci.caller != ao()))
10181054 then true
1019- else (0 >= cC))
1055+ else (0 >= cH))
10201056 then throw("Invalid addLiquidity params")
10211057 else {
1022- let cH = bF()
1023- let cJ = bG()
1024- let cI = bH()
1025- let cK = bI()
1026- let hj = aR(aT(cH, cI), aT(cJ, cK))
1027- let hk = aR(cC, hj)
1028- let hl = (cH + cC)
1029- let hm = (cJ + hk)
1030- gS(hl, hm)
1058+ let cM = bH()
1059+ let cN = bI()
1060+ let cR = bJ()
1061+ let cS = bK()
1062+ let hq = aT(aV(cM, cR), aV(cN, cS))
1063+ let hr = (cM + cH)
1064+ let hs = (aT(aV(hr, cR), hq) - cN)
1065+ let ht = (cN + hs)
1066+ let hu = fE(dE(), hr, ht)
1067+ let hv = hu._1
1068+ let hw = hu._2
1069+ let eQ = hu._3
1070+ let hx = if ((eQ != 0))
1071+ then {
1072+ let hx = invoke(at(), "exchangeFreeAndLocked", [eQ], nil)
1073+ if ((hx == hx))
1074+ then nil
1075+ else throw("Strict value is not equal to itself.")
1076+ }
1077+ else nil
1078+ if ((hx == hx))
1079+ then (gZ(hr, ht) ++ ha(hv, hw))
1080+ else throw("Strict value is not equal to itself.")
10311081 }
10321082
10331083
10341084
1035-@Callable(cg)
1036-func removeLiquidity (cC) = if (if ((cg.caller != am()))
1085+@Callable(ci)
1086+func removeLiquidity (cH) = if (if ((ci.caller != ao()))
10371087 then true
1038- else (0 >= cC))
1088+ else (cH >= 0))
10391089 then throw("Invalid removeLiquidity params")
10401090 else {
1041- let cH = bF()
1042- let cJ = bG()
1043- let cI = bH()
1044- let cK = bI()
1045- let hj = aR(aT(cH, cI), aT(cJ, cK))
1046- let hn = aR(cC, hj)
1047- let hl = (cH - cC)
1048- let hm = (cJ - hn)
1049- gS(hl, hm)
1091+ let cM = bH()
1092+ let cN = bI()
1093+ let cR = bJ()
1094+ let cS = bK()
1095+ let hq = aT(aV(cM, cR), aV(cN, cS))
1096+ let hr = (cM - cH)
1097+ let hy = bc((aT(aV(hr, cR), hq) - cN))
1098+ let ht = (cN - hy)
1099+ let hz = fE(dE(), hr, ht)
1100+ let hv = hz._1
1101+ let hw = hz._2
1102+ let eQ = hz._3
1103+ let hx = if ((eQ != 0))
1104+ then {
1105+ let hx = invoke(at(), "exchangeFreeAndLocked", [eQ], nil)
1106+ if ((hx == hx))
1107+ then nil
1108+ else throw("Strict value is not equal to itself.")
1109+ }
1110+ else nil
1111+ if ((hx == hx))
1112+ then (gZ(hr, ht) ++ ha(hv, hw))
1113+ else throw("Strict value is not equal to itself.")
10501114 }
10511115
10521116
10531117
1054-@Callable(cg)
1055-func changeSettings (gm,gn,go,gp,gq,gr,gs,gt,gu,dO,gv,gw) = if ((cg.caller != am()))
1118+@Callable(ci)
1119+func changeSettings (gs,gt,gu,gv,gw,gx,gy,gz,gA,dZ,gB,gC) = if ((ci.caller != ao()))
10561120 then throw("Invalid changeSettings params")
1057- else gl(gm, gn, go, gp, gq, gr, gs, gt, gu, dO, gv, gw)
1058-
1059-
1060-
1061-@Callable(cg)
1062-func initialize (cH,cJ,gp,gm,gn,go,gq,ho,hp,hq,hr,gr,gs,gt,gu,dO,gv,gw) = if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if ((0 >= cH))
1121+ else gr(gs, gt, gu, gv, gw, gx, gy, gz, gA, dZ, gB, gC)
1122+
1123+
1124+
1125+@Callable(ci)
1126+func initialize (cM,cN,gv,gs,gt,gu,gw,hA,hB,hC,hD,gx,gy,gz,gA,dZ,gB,gC) = if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (if ((0 >= cM))
10631127 then true
1064- else (0 >= cJ))
1128+ else (0 >= cN))
10651129 then true
1066- else (0 >= gp))
1067- then true
1068- else (0 >= gm))
1069- then true
1070- else (0 >= gn))
1071- then true
1072- else (0 >= go))
1073- then true
1074- else (0 >= gq))
1075- then true
1076- else (0 >= gr))
1130+ else (0 >= gv))
10771131 then true
10781132 else (0 >= gs))
10791133 then true
10801134 else (0 >= gt))
10811135 then true
10821136 else (0 >= gu))
10831137 then true
1084- else (0 >= dO))
1085- then true
1086- else (0 >= gv))
1087- then true
1088- else (gv > aK))
1089- then true
10901138 else (0 >= gw))
10911139 then true
1092- else cx())
1140+ else (0 >= gx))
1141+ then true
1142+ else (0 >= gy))
1143+ then true
1144+ else (0 >= gz))
1145+ then true
1146+ else (0 >= gA))
1147+ then true
1148+ else (0 >= dZ))
1149+ then true
1150+ else (0 >= gB))
1151+ then true
1152+ else (gB > aM))
1153+ then true
1154+ else (0 >= gC))
1155+ then true
1156+ else cC())
10931157 then throw("Invalid initialize parameters")
1094- else ((((gU(cH, cJ, 0, 0, 0, 0, 0, 0) ++ gl(gm, gn, go, gp, gq, gr, gs, gt, gu, dO, gv, gw)) ++ gx((lastBlock.timestamp + gp), 0, 0, 0, 0)) ++ hf(0)) ++ [BooleanEntry(l, true), StringEntry(c, ho), StringEntry(a, hp), StringEntry(b, hq), StringEntry(U, hr)])
1095-
1096-
1097-
1098-@Callable(cg)
1099-func decreasePosition (hd,hs,ht) = {
1100- let hu = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1101- if ((hu == hu))
1158+ else ((((hb(cM, cN, 0, 0, 0, 0, 0, 0) ++ gr(gs, gt, gu, gv, gw, gx, gy, gz, gA, dZ, gB, gC)) ++ gD((lastBlock.timestamp + gv), 0, 0, 0, 0)) ++ hm(0)) ++ [BooleanEntry(n, true), StringEntry(d, hA), StringEntry(a, hB), StringEntry(b, hC), StringEntry(W, hD)])
1159+
1160+
1161+
1162+@Callable(ci)
1163+func increasePosition (hE,hF,hG,hH) = {
1164+ let hI = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1165+ if ((hI == hI))
11021166 then {
1103- let cp = cf(cg)
1104- if (if (if (if (if ((0 >= hd))
1105- then true
1106- else !(cx()))
1107- then true
1108- else !(ch(aR(aK, hs), bE(), true)))
1109- then true
1110- else !(cw(cp)))
1111- then true
1112- else cy())
1113- then throw("Invalid decreasePosition parameters")
1114- else {
1115- let hv = co(cp)
1116- let fT = hv._1
1117- let hw = hv._2
1118- let hx = hv._3
1119- let hy = hv._4
1120- let hz = if ((fT > 0))
1121- then aF
1122- else aE
1123- let hA = (hz == aE)
1124- let hB = aT(hd, hs)
1125- let hC = ef(cp, aN)
1126- let hD = hC._1
1127- let ee = hC._2
1128- let hE = if ((hD > hB))
1129- then {
1130- let hF = cP(hA, hB)
1131- let ez = hF._1
1132- let cQ = hF._2
1133- let cR = hF._3
1134- let eH = hF._4
1135- let hG = ba(ez)
1136- if (if ((ht != 0))
1137- then (ht > hG)
1138- else false)
1139- then throw(((("Too little base asset exchanged, got " + toString(hG)) + " expected ") + toString(ht)))
1140- else {
1141- let eE = aR(aT(ee, hG), ba(fT))
1142- let hH = dd(fT, hw, hy, eE)
1143- let dm = hH._1
1144- let dn = hH._2
1145- let di = hH._3
1146- let eA = hB
1147- let hI = (ee - eE)
1148- let hJ = if ((fT > 0))
1149- then ((hD - eA) - hI)
1150- else ((hI + hD) - eA)
1151- let hK = (fT + ez)
1152- $Tuple12(hK, dm, ba(hJ), cm(hK), cR, cQ, eH, (bK() - hB), (cb() - (if ((hK > 0))
1153- then ba(ez)
1154- else 0)), (ca() - (if ((0 > hK))
1155- then ba(ez)
1156- else 0)), (bM() - (if ((hK > 0))
1157- then hB
1158- else 0)), (bL() - (if ((0 > hK))
1159- then hB
1160- else 0)))
1161- }
1162- }
1163- else throw("Close position first")
1164- let hK = hE._1
1165- let hL = hE._2
1166- let hM = hE._3
1167- let hN = hE._4
1168- let cR = hE._5
1169- let cQ = hE._6
1170- let eH = hE._7
1171- let eK = hE._8
1172- let eI = hE._9
1173- let eJ = hE._10
1174- let hO = hE._11
1175- let hP = hE._12
1176- let hQ = invoke(as(), "notifyNotional", [cp, hM], nil)
1177- if ((hQ == hQ))
1178- then (gH(cp, hK, hL, hM, hN) ++ gU(cQ, cR, eH, eK, eI, eJ, hO, hP))
1179- else throw("Strict value is not equal to itself.")
1180- }
1181- }
1182- else throw("Strict value is not equal to itself.")
1183- }
1184-
1185-
1186-
1187-@Callable(cg)
1188-func increasePosition (hz,hs,ht,hR) = {
1189- let hu = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1190- if ((hu == hu))
1191- then {
1192- let cp = cf(cg)
1193- let hS = cg.payments[0].amount
1194- let aA = cg.payments[0].assetId
1195- let hT = toBase58String(value(aA))
1196- let hU = (aA == ao())
1197- let hV = az(hT)
1198- if (if (if (if (if (if (if (if (if ((hz != aE))
1199- then (hz != aF)
1167+ let cr = ch(ci)
1168+ let hJ = ci.payments[0].amount
1169+ let aC = ci.payments[0].assetId
1170+ let hK = toBase58String(value(aC))
1171+ let hL = (aC == aq())
1172+ let hM = aB(hK)
1173+ if (if (if (if (if (if (if (if (if (if ((hE != aG))
1174+ then (hE != aH)
12001175 else false)
12011176 then true
1202- else (0 >= hS))
1203- then true
1204- else !(cx()))
1205- then true
1206- else if (!(hU))
1207- then !(hV)
1177+ else (0 >= hJ))
1178+ then true
1179+ else !(cC()))
1180+ then true
1181+ else if (!(hL))
1182+ then !(hM)
12081183 else false)
12091184 then true
1210- else !(fS(cp, hT)))
1211- then true
1212- else !(ch(aR(aK, hs), bE(), true)))
1213- then true
1214- else cy())
1215- then true
1216- else cz())
1185+ else !(fY(cr, hK)))
1186+ then true
1187+ else !(cj(aT(aM, hF), bG(), true)))
1188+ then true
1189+ else cD())
1190+ then true
1191+ else cE())
1192+ then true
1193+ else dL())
12171194 then throw("Invalid increasePosition parameters")
12181195 else {
1219- let hW = ga(cp, gf(cg))
1220- let fQ = hW._1
1221- let fR = hW._2
1222- let hX = aT(hS, fQ)
1223- let hd = (hS - hX)
1224- let hY = if (hV)
1196+ let hN = gg(cr, gl(ci))
1197+ let fW = hN._1
1198+ let fX = hN._2
1199+ let hk = aT(hJ, (aV(fW, hF) + aM))
1200+ let hO = (hJ - hk)
1201+ let hP = if (hM)
12251202 then {
1226- let hZ = invoke(aw(), "borrow", [cp], [AttachedPayment(aA, hd)])
1227- if ((hZ == hZ))
1203+ let hQ = invoke(ay(), "borrow", [cr], [AttachedPayment(aC, hk)])
1204+ if ((hQ == hQ))
12281205 then {
1229- let ia = assetBalance(this, ao())
1230- if ((ia == ia))
1206+ let hR = assetBalance(this, aq())
1207+ if ((hR == hR))
12311208 then {
1232- let ib = invoke(ax(), "swap", [toBase58String(ao()), 0], [AttachedPayment(aA, hX)])
1233- if ((ib == ib))
1209+ let hS = invoke(az(), "swap", [toBase58String(aq()), 0], [AttachedPayment(aC, hO)])
1210+ if ((hS == hS))
12341211 then {
1235- let ic = assetBalance(this, ao())
1236- if ((ic == ic))
1212+ let hT = assetBalance(this, aq())
1213+ if ((hT == hT))
12371214 then {
1238- let id = (ic - ia)
1239- if ((id == id))
1240- then id
1215+ let hU = (hT - hR)
1216+ if ((hU == hU))
1217+ then hU
12411218 else throw("Strict value is not equal to itself.")
12421219 }
12431220 else throw("Strict value is not equal to itself.")
12441221 }
12451222 else throw("Strict value is not equal to itself.")
12461223 }
12471224 else throw("Strict value is not equal to itself.")
12481225 }
12491226 else throw("Strict value is not equal to itself.")
12501227 }
1251- else hX
1252- if ((hY == hY))
1228+ else hO
1229+ if ((hP == hP))
12531230 then {
1254- let ie = invoke(au(), "acceptPaymentWithLink", [cp, hR], [AttachedPayment(ao(), hY)])
1255- if ((ie == ie))
1231+ let hV = invoke(aw(), "acceptPaymentWithLink", [cr, hH], [AttachedPayment(aq(), hP)])
1232+ if ((hV == hV))
12561233 then {
1257- let if = {
1258- let cr = ie
1259- if ($isInstanceOf(cr, "Int"))
1234+ let hW = {
1235+ let ct = hV
1236+ if ($isInstanceOf(ct, "Int"))
12601237 then {
1261- let gd = cr
1262- gd
1238+ let gj = ct
1239+ gj
12631240 }
12641241 else throw("Invalid referrerFee")
12651242 }
1266- let ig = (hY - if)
1267- let ih = co(cp)
1268- let fT = ih._1
1269- let hw = ih._2
1270- let hx = ih._3
1271- let hy = ih._4
1272- let gF = (fT == 0)
1273- let ii = if ((fT > 0))
1274- then (hz == aE)
1275- else (hz == aF)
1276- let ij = if (!(gF))
1277- then ii
1243+ let hX = (hP - hW)
1244+ let hY = cq(cr)
1245+ let fZ = hY._1
1246+ let hZ = hY._2
1247+ let ia = hY._3
1248+ let ib = hY._4
1249+ let ic = (fZ == 0)
1250+ let id = if ((fZ > 0))
1251+ then (hE == aG)
1252+ else (hE == aH)
1253+ let ie = if (!(ic))
1254+ then id
12781255 else false
1279- let hA = (hz == aE)
1280- let ik = if (if (gF)
1256+ let if = (hE == aG)
1257+ let ig = if (if (ic)
12811258 then true
1282- else ij)
1259+ else ie)
12831260 then {
1284- let hB = aT(hd, hs)
1285- let il = cP(hA, hB)
1286- let cT = il._1
1287- let cQ = il._2
1288- let cR = il._3
1289- let eH = il._4
1290- if (if ((ht != 0))
1291- then (ht > ba(cT))
1261+ let ih = aV(hk, hF)
1262+ let ii = cQ(if, ih)
1263+ let cX = ii._1
1264+ let cU = ii._2
1265+ let cV = ii._3
1266+ let eS = ii._4
1267+ if (if ((hG != 0))
1268+ then (hG > bc(cX))
12921269 else false)
1293- then throw(((("Limit error: " + toString(ba(cT))) + " < ") + toString(ht)))
1270+ then throw(((("Limit error: " + toString(bc(cX))) + " < ") + toString(hG)))
12941271 else {
1295- let hK = (fT + cT)
1296- let hO = (bM() + (if ((hK > 0))
1297- then hB
1272+ let ij = (fZ + cX)
1273+ let ik = (bO() + (if ((ij > 0))
1274+ then ih
12981275 else 0))
1299- let hP = (bL() + (if ((0 > hK))
1300- then hB
1276+ let il = (bN() + (if ((0 > ij))
1277+ then ih
13011278 else 0))
1302- let im = aR(hB, hs)
1303- let in = dd(fT, hw, hy, im)
1304- let dm = in._1
1305- let dZ = in._2
1306- let ea = in._3
1307- if (!(dG(cQ, cR)))
1279+ let im = dh(fZ, hZ, ib, hk)
1280+ let dq = im._1
1281+ let ek = im._2
1282+ let el = im._3
1283+ if (!(dS(cU, cV)))
13081284 then throw("Over max spread limit")
1309- else if (!(dL(hO, hP)))
1285+ else if (!(dW(ik, il)))
13101286 then throw("Over max open notional")
1311- else $Tuple12(hK, dm, (hx + hB), cm(hK), cR, cQ, eH, (bK() + hB), (cb() + (if ((hK > 0))
1312- then ba(cT)
1313- else 0)), (ca() + (if ((0 > hK))
1314- then ba(cT)
1315- else 0)), hO, hP)
1287+ else $Tuple12(ij, dq, (ia + ih), co(ij), cV, cU, eS, (bM() + ih), (cd() + (if ((ij > 0))
1288+ then bc(cX)
1289+ else 0)), (cc() + (if ((0 > ij))
1290+ then bc(cX)
1291+ else 0)), ik, il)
13161292 }
13171293 }
13181294 else {
1319- let hB = aT(hd, hs)
1320- let io = ef(toString(cg.caller), aN)
1321- let hD = io._1
1322- let ee = io._2
1323- if ((hD > hB))
1295+ let ih = aV(hk, hF)
1296+ let in = eq(toString(ci.caller), aP)
1297+ let io = in._1
1298+ let ep = in._2
1299+ if ((io > ih))
13241300 then throw("Use decreasePosition to decrease position size")
13251301 else throw("Close position first")
13261302 }
1327- let hK = ik._1
1328- let hL = ik._2
1329- let hM = ik._3
1330- let hN = ik._4
1331- let cR = ik._5
1332- let cQ = ik._6
1333- let eH = ik._7
1334- let eK = ik._8
1335- let eI = ik._9
1336- let eJ = ik._10
1337- let hO = ik._11
1338- let hP = ik._12
1339- let ip = gh(ig)
1340- let gj = ip._1
1341- let gk = ip._2
1342- let iq = if (hU)
1303+ let ij = ig._1
1304+ let ip = ig._2
1305+ let iq = ig._3
1306+ let ir = ig._4
1307+ let cV = ig._5
1308+ let cU = ig._6
1309+ let eS = ig._7
1310+ let eV = ig._8
1311+ let eT = ig._9
1312+ let eU = ig._10
1313+ let ik = ig._11
1314+ let il = ig._12
1315+ let is = gn(hX)
1316+ let gp = is._1
1317+ let gq = is._2
1318+ let it = if (hL)
13431319 then {
1344- let iq = invoke(ar(), "addLocked", [false], [AttachedPayment(ao(), hd)])
1345- if ((iq == iq))
1320+ let it = invoke(at(), "addLocked", [false], [AttachedPayment(aq(), hk)])
1321+ if ((it == it))
13461322 then nil
13471323 else throw("Strict value is not equal to itself.")
13481324 }
13491325 else nil
1350- if ((iq == iq))
1326+ if ((it == it))
13511327 then {
1352- let ir = invoke(ar(), "addFree", nil, [AttachedPayment(ao(), gk)])
1353- if ((ir == ir))
1328+ let iu = invoke(at(), "addFree", nil, [AttachedPayment(aq(), gq)])
1329+ if ((iu == iu))
13541330 then {
1355- let is = invoke(as(), "notifyFees", [cp, ig], nil)
1356- if ((is == is))
1331+ let iv = invoke(au(), "notifyFees", [cr, hX], nil)
1332+ if ((iv == iv))
13571333 then {
1358- let hQ = invoke(as(), "notifyNotional", [cp, hM], nil)
1359- if ((hQ == hQ))
1360- then ((((((gH(cp, hK, hL, hM, hN) ++ gE(gF, cp)) ++ gD(cp, hT)) ++ gU(cQ, cR, eH, eK, eI, eJ, hO, hP)) ++ hg(gj)) ++ hf((bC() + hd))) ++ hh(fR, cg))
1334+ let iw = invoke(au(), "notifyNotional", [cr, iq], nil)
1335+ if ((iw == iw))
1336+ then (((((((gO(cr, ij, ip, iq, ir) ++ gK(ic, cr)) ++ gN(ic, cr, fW)) ++ gJ(cr, hK)) ++ hb(cU, cV, eS, eV, eT, eU, ik, il)) ++ hn(gp)) ++ hm((bE() + hk))) ++ ho(fX, ci))
13611337 else throw("Strict value is not equal to itself.")
13621338 }
13631339 else throw("Strict value is not equal to itself.")
13641340 }
13651341 else throw("Strict value is not equal to itself.")
13661342 }
13671343 else throw("Strict value is not equal to itself.")
13681344 }
13691345 else throw("Strict value is not equal to itself.")
13701346 }
13711347 else throw("Strict value is not equal to itself.")
13721348 }
13731349 }
13741350 else throw("Strict value is not equal to itself.")
13751351 }
13761352
13771353
13781354
1379-@Callable(cg)
1355+@Callable(ci)
13801356 func addMargin () = {
1381- let hu = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1382- if ((hu == hu))
1357+ let hI = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1358+ if ((hI == hI))
13831359 then {
1384- let cp = toString(cg.caller)
1385- let hS = cg.payments[0].amount
1386- let aA = cg.payments[0].assetId
1387- let hT = toBase58String(value(aA))
1388- let hU = (aA == ao())
1389- let hV = az(hT)
1390- if (if (if (if (if (if (if (!(hU))
1391- then !(hV)
1360+ let cr = toString(ci.caller)
1361+ let hk = ci.payments[0].amount
1362+ let aC = ci.payments[0].assetId
1363+ let hK = toBase58String(value(aC))
1364+ let hL = (aC == aq())
1365+ let hM = aB(hK)
1366+ if (if (if (if (if (if (if (if (!(hL))
1367+ then !(hM)
13921368 else false)
13931369 then true
1394- else !(cw(toString(cg.caller))))
1395- then true
1396- else !(fU(cp, hT)))
1397- then true
1398- else !(cx()))
1399- then true
1400- else cy())
1401- then true
1402- else cz())
1370+ else !(cB(toString(ci.caller))))
1371+ then true
1372+ else !(ga(cr, hK)))
1373+ then true
1374+ else !(cC()))
1375+ then true
1376+ else cD())
1377+ then true
1378+ else cE())
1379+ then true
1380+ else dL())
14031381 then throw("Invalid addMargin parameters")
14041382 else {
1405- let it = ga(cp, gf(cg))
1406- let fQ = it._1
1407- let fR = it._2
1408- let hX = aT(hS, fQ)
1409- let hd = (hS - hX)
1410- let hY = if (hV)
1383+ let ix = cq(cr)
1384+ let fZ = ix._1
1385+ let hZ = ix._2
1386+ let ia = ix._3
1387+ let ib = ix._4
1388+ let it = if (hL)
14111389 then {
1412- let hZ = invoke(aw(), "borrow", [cp], [AttachedPayment(aA, hd)])
1413- if ((hZ == hZ))
1390+ let it = invoke(at(), "addLocked", [false], [AttachedPayment(aq(), hk)])
1391+ if ((it == it))
1392+ then nil
1393+ else throw("Strict value is not equal to itself.")
1394+ }
1395+ else nil
1396+ if ((it == it))
1397+ then (gO(cr, fZ, (hZ + hk), ia, ib) ++ hm((bE() + hk)))
1398+ else throw("Strict value is not equal to itself.")
1399+ }
1400+ }
1401+ else throw("Strict value is not equal to itself.")
1402+ }
1403+
1404+
1405+
1406+@Callable(ci)
1407+func removeMargin (hk) = {
1408+ let hI = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1409+ if ((hI == hI))
1410+ then {
1411+ let cr = toString(ci.caller)
1412+ if (if (if (if (if ((0 >= hk))
1413+ then true
1414+ else !(cB(cr)))
1415+ then true
1416+ else !(cC()))
1417+ then true
1418+ else cD())
1419+ then true
1420+ else dL())
1421+ then throw("Invalid removeMargin parameters")
1422+ else {
1423+ let iy = cq(cr)
1424+ let fZ = iy._1
1425+ let hZ = iy._2
1426+ let ia = iy._3
1427+ let ib = iy._4
1428+ let iz = -(hk)
1429+ let iA = dh(fZ, hZ, ib, iz)
1430+ let dq = iA._1
1431+ let dr = iA._2
1432+ if ((dr != 0))
1433+ then throw("Invalid removed margin amount")
1434+ else {
1435+ let iB = ev(dq, dr, ia)
1436+ if (!(cj(iB, bG(), true)))
1437+ then throw(((("Too much margin removed: " + toString(iB)) + " < ") + toString(bG())))
1438+ else {
1439+ let iC = toBase58String(aq())
1440+ let iD = gd(cr)
1441+ let iE = iD._1
1442+ let iF = iD._2
1443+ let iG = if ((hk > iE))
1444+ then iE
1445+ else hk
1446+ let iH = if ((iE > hk))
1447+ then 0
1448+ else (hk - iE)
1449+ let iI = (iE - iG)
1450+ let iJ = if ((iI > 0))
1451+ then nil
1452+ else gJ(cr, iC)
1453+ let iK = if (((iG + iH) != hk))
1454+ then throw(((((("toRepay=" + toString(iG)) + " + toWithdraw=") + toString(iH)) + " != ") + toString(hk)))
1455+ else nil
1456+ if ((iK == iK))
1457+ then {
1458+ let iL = if ((iH > 0))
1459+ then {
1460+ let iL = invoke(at(), "withdrawLocked", [iH], nil)
1461+ if ((iL == iL))
1462+ then nil
1463+ else throw("Strict value is not equal to itself.")
1464+ }
1465+ else nil
1466+ if ((iL == iL))
1467+ then {
1468+ let iM = if ((iG > 0))
1469+ then {
1470+ let iN = invoke(ay(), "repay", [cr, iG, iF], nil)
1471+ if ((iN == iN))
1472+ then [ScriptTransfer(ci.caller, iG, fromBase58String(iF))]
1473+ else throw("Strict value is not equal to itself.")
1474+ }
1475+ else nil
1476+ if ((iM == iM))
1477+ then ((((gO(cr, fZ, dq, ia, co(fZ)) ++ (if ((iH > 0))
1478+ then hj(ci.caller, iH)
1479+ else nil)) ++ hm((bE() - hk))) ++ iJ) ++ iM)
1480+ else throw("Strict value is not equal to itself.")
1481+ }
1482+ else throw("Strict value is not equal to itself.")
1483+ }
1484+ else throw("Strict value is not equal to itself.")
1485+ }
1486+ }
1487+ }
1488+ }
1489+ else throw("Strict value is not equal to itself.")
1490+ }
1491+
1492+
1493+
1494+@Callable(ci)
1495+func closePosition (gP,iO,iP) = {
1496+ let hI = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1497+ if ((hI == hI))
1498+ then {
1499+ let cr = ch(ci)
1500+ let iQ = valueOrErrorMessage(addressFromString(cr), "Invalid caller")
1501+ let cA = cy(cr)
1502+ if (if (if (if (if (if (!(cB(cr)))
1503+ then true
1504+ else !(cC()))
1505+ then true
1506+ else cD())
1507+ then true
1508+ else (0 >= gP))
1509+ then true
1510+ else (0 > iO))
1511+ then true
1512+ else dL())
1513+ then throw("Invalid closePosition parameters")
1514+ else {
1515+ let iR = cq(cr)
1516+ let fZ = iR._1
1517+ let hZ = iR._2
1518+ let ia = iR._3
1519+ let ib = iR._4
1520+ let iS = if ((bc(fZ) > gP))
1521+ then {
1522+ let iT = dD((fZ > 0), gP, true)
1523+ let eL = iT._1
1524+ let cU = iT._2
1525+ let cV = iT._3
1526+ let eS = iT._4
1527+ let eK = if ((fZ > 0))
1528+ then -(gP)
1529+ else gP
1530+ let iU = eq(cr, aP)
1531+ let io = iU._1
1532+ let ep = iU._2
1533+ let iV = ez(cr, aP)
1534+ let iW = aT(bc(eK), bc(fZ))
1535+ let eP = aV(ep, iW)
1536+ let iX = aV(aV(io, iW), cA)
1537+ let iY = dh(fZ, hZ, ib, ep)._1
1538+ let iZ = dh(fZ, hZ, ib, eP)._2
1539+ let ja = (ep - eP)
1540+ let jb = if ((fZ > 0))
1541+ then ((io - eL) - ja)
1542+ else ((ja + io) - eL)
1543+ let iq = bc(jb)
1544+ let ij = (fZ + eK)
1545+ let jc = co(ij)
1546+ let jd = (ia - iq)
1547+ let eV = (bM() - jd)
1548+ let je = if ((fZ > 0))
1549+ then (aV((iq + ja), iV) - ja)
1550+ else (aV((iq - ja), iV) - ja)
1551+ let jf = ((iY - (je + ja)) - iX)
1552+ let jg = if ((0 > jf))
1553+ then throw("Margin error: unable to pay close fee")
1554+ else jf
1555+ if (if ((iO != 0))
1556+ then (iO > eL)
1557+ else false)
1558+ then throw(((("Limit error: " + toString(eL)) + " < ") + toString(iO)))
1559+ else $Tuple16(ij, if (iP)
1560+ then (je + jg)
1561+ else je, iq, jc, iZ, eP, if (iP)
1562+ then 0
1563+ else jg, cU, cV, eS, eV, (cd() - (if ((ij > 0))
1564+ then bc(eK)
1565+ else 0)), (cc() - (if ((0 > ij))
1566+ then bc(eK)
1567+ else 0)), (bO() - (if ((ij > 0))
1568+ then jd
1569+ else 0)), (bN() - (if ((0 > ij))
1570+ then jd
1571+ else 0)), iX)
1572+ }
1573+ else if ((gP > bc(fZ)))
1574+ then throw("Invalid closePosition parameters")
1575+ else {
1576+ let jh = eM(cr, true)
1577+ let el = jh._1
1578+ let iZ = jh._2
1579+ let eP = jh._3
1580+ let ji = jh._4
1581+ let cU = jh._5
1582+ let cV = jh._6
1583+ let eS = jh._7
1584+ let eV = jh._8
1585+ let eL = jh._9
1586+ let eT = jh._10
1587+ let eU = jh._11
1588+ let ik = jh._12
1589+ let il = jh._13
1590+ let iX = aV(eL, cA)
1591+ let jf = (bc(ji) - iX)
1592+ let jg = if ((0 > jf))
1593+ then throw(((((((("Margin error: unable to pay close fee: " + toString(iX)) + " margin: ") + toString(ji)) + " fee percent: ") + toString(cA)) + " notional: ") + toString(eL)))
1594+ else jf
1595+ if (if ((iO != 0))
1596+ then (iO > eL)
1597+ else false)
1598+ then throw(((("Limit error: " + toString(eL)) + " < ") + toString(iO)))
1599+ else $Tuple16(0, 0, 0, 0, iZ, eP, jg, cU, cV, eS, eV, eT, eU, ik, il, iX)
1600+ }
1601+ let ij = iS._1
1602+ let je = iS._2
1603+ let iq = iS._3
1604+ let jc = iS._4
1605+ let iZ = iS._5
1606+ let eP = iS._6
1607+ let jg = iS._7
1608+ let cU = iS._8
1609+ let cV = iS._9
1610+ let eS = iS._10
1611+ let eV = iS._11
1612+ let eT = iS._12
1613+ let eU = iS._13
1614+ let ik = iS._14
1615+ let il = iS._15
1616+ let iX = iS._16
1617+ if ((iZ > 0))
1618+ then throw("Unable to close position with bad debt")
1619+ else {
1620+ let jj = (ij != 0)
1621+ let jk = (jg + iX)
1622+ let jl = (bE() - jk)
1623+ let jm = if ((0 > jl))
1624+ then $Tuple2(0, bc(jl))
1625+ else $Tuple2(jl, 0)
1626+ let jn = jm._1
1627+ let jo = jm._2
1628+ let jp = gd(cr)
1629+ let iE = jp._1
1630+ let iF = jp._2
1631+ let jq = if ((iE > 0))
1632+ then if ((jk >= iE))
1633+ then {
1634+ let iN = invoke(ay(), "repay", [cr, iE, iF], nil)
1635+ if ((iN == iN))
1636+ then $Tuple3(iE, (jk - iE), jj)
1637+ else throw("Strict value is not equal to itself.")
1638+ }
1639+ else {
1640+ let jr = invoke(ay(), if (jj)
1641+ then "repay"
1642+ else "realizePartiallyAndClose", [cr, jk, iF], nil)
1643+ if ((jr == jr))
1644+ then $Tuple3(jk, 0, false)
1645+ else throw("Strict value is not equal to itself.")
1646+ }
1647+ else $Tuple3(0, jk, false)
1648+ if ((jq == jq))
14141649 then {
1415- let ia = assetBalance(this, ao())
1416- if ((ia == ia))
1650+ let js = jq._3
1651+ let jt = jq._2
1652+ let ju = jq._1
1653+ let jv = if ((jt >= iX))
1654+ then $Tuple3(ju, (jt - iX), iX)
1655+ else {
1656+ let jw = (iX - jt)
1657+ let jx = (ju - jw)
1658+ let hR = assetBalance(this, aq())
1659+ if ((hR == hR))
1660+ then {
1661+ let hS = invoke(az(), "swap", [toBase58String(aq()), 0], [AttachedPayment(fromBase58String(iF), jw)])
1662+ if ((hS == hS))
1663+ then {
1664+ let hT = assetBalance(this, aq())
1665+ if ((hT == hT))
1666+ then {
1667+ let hU = (hT - hR)
1668+ if ((hU == hU))
1669+ then $Tuple3(jx, 0, (jt + hU))
1670+ else throw("Strict value is not equal to itself.")
1671+ }
1672+ else throw("Strict value is not equal to itself.")
1673+ }
1674+ else throw("Strict value is not equal to itself.")
1675+ }
1676+ else throw("Strict value is not equal to itself.")
1677+ }
1678+ if ((jv == jv))
14171679 then {
1418- let ib = invoke(ax(), "swap", [toBase58String(ao()), 0], [AttachedPayment(aA, hX)])
1419- if ((ib == ib))
1680+ let jy = jv._3
1681+ let jz = jv._2
1682+ let jx = jv._1
1683+ let jA = if ((jt > 0))
14201684 then {
1421- let ic = assetBalance(this, ao())
1422- if ((ic == ic))
1685+ let jA = invoke(at(), "withdrawLocked", [jt], nil)
1686+ if ((jA == jA))
1687+ then nil
1688+ else throw("Strict value is not equal to itself.")
1689+ }
1690+ else nil
1691+ if ((jA == jA))
1692+ then {
1693+ let jB = gn(jy)
1694+ let gp = jB._1
1695+ let gq = jB._2
1696+ let iu = invoke(at(), "addFree", nil, [AttachedPayment(aq(), gq)])
1697+ if ((iu == iu))
14231698 then {
1424- let id = (ic - ia)
1425- if ((id == id))
1426- then id
1699+ let iv = invoke(au(), "notifyFees", [cr, iX], nil)
1700+ if ((iv == iv))
1701+ then {
1702+ let iw = invoke(au(), "notifyNotional", [cr, iq], nil)
1703+ if ((iw == iw))
1704+ then (((((((if (jj)
1705+ then gO(cr, ij, je, iq, jc)
1706+ else hi(cr)) ++ (if (js)
1707+ then {
1708+ let iC = toBase58String(aq())
1709+ gJ(cr, iC)
1710+ }
1711+ else nil)) ++ hb(cU, cV, eS, eV, eT, eU, ik, il)) ++ hn(gp)) ++ (if ((jz > 0))
1712+ then hj(iQ, jz)
1713+ else nil)) ++ hm(jn)) ++ (if ((jx > 0))
1714+ then [ScriptTransfer(iQ, jx, fromBase58String(iF))]
1715+ else nil))
1716+ else throw("Strict value is not equal to itself.")
1717+ }
14271718 else throw("Strict value is not equal to itself.")
14281719 }
14291720 else throw("Strict value is not equal to itself.")
14301721 }
14311722 else throw("Strict value is not equal to itself.")
14321723 }
14331724 else throw("Strict value is not equal to itself.")
14341725 }
14351726 else throw("Strict value is not equal to itself.")
14361727 }
1437- else hX
1438- if ((hY == hY))
1439- then {
1440- let ie = invoke(au(), "acceptPayment", [cp], [AttachedPayment(ao(), hY)])
1441- if ((ie == ie))
1442- then {
1443- let if = {
1444- let cr = ie
1445- if ($isInstanceOf(cr, "Int"))
1446- then {
1447- let gd = cr
1448- gd
1449- }
1450- else throw("Invalid referrerFee")
1451- }
1452- let ig = (hY - if)
1453- let iu = co(cp)
1454- let fT = iu._1
1455- let hw = iu._2
1456- let hx = iu._3
1457- let hy = iu._4
1458- let iv = gh(ig)
1459- let gj = iv._1
1460- let gk = iv._2
1461- let iq = if (hU)
1462- then {
1463- let iq = invoke(ar(), "addLocked", [false], [AttachedPayment(ao(), hd)])
1464- if ((iq == iq))
1465- then nil
1466- else throw("Strict value is not equal to itself.")
1467- }
1468- else nil
1469- if ((iq == iq))
1470- then {
1471- let ir = invoke(ar(), "addFree", nil, [AttachedPayment(ao(), gk)])
1472- if ((ir == ir))
1473- then {
1474- let is = invoke(as(), "notifyFees", [cp, ig], nil)
1475- if ((is == is))
1476- then (((gH(cp, fT, (hw + hd), hx, hy) ++ hg(gj)) ++ hf((bC() + hd))) ++ hh(fR, cg))
1477- else throw("Strict value is not equal to itself.")
1478- }
1479- else throw("Strict value is not equal to itself.")
1480- }
1481- else throw("Strict value is not equal to itself.")
1482- }
1483- else throw("Strict value is not equal to itself.")
1484- }
1485- else throw("Strict value is not equal to itself.")
14861728 }
14871729 }
14881730 else throw("Strict value is not equal to itself.")
14891731 }
14901732
14911733
14921734
1493-@Callable(cg)
1494-func removeMargin (hd) = {
1495- let hu = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1496- if ((hu == hu))
1735+@Callable(ci)
1736+func liquidate (cr) = {
1737+ let hI = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1738+ if ((hI == hI))
14971739 then {
1498- let cp = toString(cg.caller)
1499- if (if (if (if ((0 >= hd))
1500- then true
1501- else !(cw(cp)))
1502- then true
1503- else !(cx()))
1504- then true
1505- else cy())
1506- then throw("Invalid removeMargin parameters")
1507- else {
1508- let iw = co(cp)
1509- let fT = iw._1
1510- let hw = iw._2
1511- let hx = iw._3
1512- let hy = iw._4
1513- let ix = -(hd)
1514- let iy = dd(fT, hw, hy, ix)
1515- let dm = iy._1
1516- let dn = iy._2
1517- if ((dn != 0))
1518- then throw("Invalid removed margin amount")
1519- else {
1520- let iz = ek(dm, dn, hx)
1521- if (!(ch(iz, bE(), true)))
1522- then throw(((("Too much margin removed: " + toString(iz)) + " < ") + toString(bE())))
1523- else {
1524- let iA = toBase58String(ao())
1525- let iB = fX(cp)
1526- let iC = iB._1
1527- let iD = iB._2
1528- let iE = if ((hd > iC))
1529- then iC
1530- else hd
1531- let iF = if ((iC > hd))
1532- then 0
1533- else (hd - iC)
1534- let iG = (iC - iE)
1535- let iH = if ((iG > 0))
1536- then nil
1537- else gD(cp, iA)
1538- let iI = if (((iE + iF) != hd))
1539- then throw(((((("toRepay=" + toString(iE)) + " + toWithdraw=") + toString(iF)) + " != ") + toString(hd)))
1540- else nil
1541- if ((iI == iI))
1542- then {
1543- let iJ = if ((iF > 0))
1544- then {
1545- let iJ = invoke(ar(), "withdrawLocked", [iF], nil)
1546- if ((iJ == iJ))
1547- then nil
1548- else throw("Strict value is not equal to itself.")
1549- }
1550- else nil
1551- if ((iJ == iJ))
1552- then {
1553- let iK = if ((iE > 0))
1554- then {
1555- let iL = invoke(aw(), "repay", [cp, iE, iD], nil)
1556- if ((iL == iL))
1557- then [ScriptTransfer(cg.caller, iE, fromBase58String(iD))]
1558- else throw("Strict value is not equal to itself.")
1559- }
1560- else nil
1561- if ((iK == iK))
1562- then ((((gH(cp, fT, dm, hx, cm(fT)) ++ (if ((iF > 0))
1563- then hc(cg.caller, iF)
1564- else nil)) ++ hf((bC() - hd))) ++ iH) ++ iK)
1565- else throw("Strict value is not equal to itself.")
1566- }
1567- else throw("Strict value is not equal to itself.")
1568- }
1569- else throw("Strict value is not equal to itself.")
1570- }
1571- }
1740+ let jC = ez(cr, aP)
1741+ let iB = if (eb())
1742+ then {
1743+ let jD = ez(cr, aQ)
1744+ bd(jC, jD)
15721745 }
1573- }
1574- else throw("Strict value is not equal to itself.")
1575- }
1576-
1577-
1578-
1579-@Callable(cg)
1580-func closePosition (gI,iM) = {
1581- let hu = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1582- if ((hu == hu))
1583- then {
1584- let cp = cf(cg)
1585- let iN = valueOrErrorMessage(addressFromString(cp), "Invalid caller")
1586- if (if (if (if (if (!(cw(cp)))
1587- then true
1588- else !(cx()))
1589- then true
1590- else cy())
1591- then true
1592- else (0 >= gI))
1593- then true
1594- else (0 > iM))
1595- then throw("Invalid closePosition parameters")
1596- else {
1597- let iO = co(cp)
1598- let fT = iO._1
1599- let hw = iO._2
1600- let hx = iO._3
1601- let hy = iO._4
1602- let iP = if ((ba(fT) > gI))
1603- then {
1604- let hz = if ((fT > 0))
1605- then aF
1606- else aE
1607- let hA = (hz == aE)
1608- let iQ = dy((fT > 0), gI, true)
1609- let eA = iQ._1
1610- let cQ = iQ._2
1611- let cR = iQ._3
1612- let eH = iQ._4
1613- let ez = if ((fT > 0))
1614- then -(gI)
1615- else gI
1616- let iR = ef(cp, aN)
1617- let hD = iR._1
1618- let ee = iR._2
1619- let iS = eo(cp, aN)
1620- let iT = aR(ba(ez), ba(fT))
1621- let eE = aT(ee, iT)
1622- let iU = dd(fT, hw, hy, eE)
1623- let dm = iU._1
1624- let iV = iU._2
1625- let di = iU._3
1626- let hI = (ee - eE)
1627- let hJ = if ((fT > 0))
1628- then ((hD - eA) - hI)
1629- else ((hI + hD) - eA)
1630- let hM = ba(hJ)
1631- let iW = aT(hM, iS)
1632- let hK = (fT + ez)
1633- let iX = cm(hK)
1634- let eK = (bK() - eA)
1635- if (if ((iM != 0))
1636- then (iM > eA)
1637- else false)
1638- then throw(((("Limit error: " + toString(eA)) + " < ") + toString(iM)))
1639- else $Tuple15(hK, iW, hM, iX, iV, eE, (ba((dm - iW)) + eE), cQ, cR, eH, eK, (cb() - (if ((hK > 0))
1640- then ba(ez)
1641- else 0)), (ca() - (if ((0 > hK))
1642- then ba(ez)
1643- else 0)), (bM() - (if ((hK > 0))
1644- then eA
1645- else 0)), (bL() - (if ((0 > hK))
1646- then eA
1647- else 0)))
1648- }
1649- else if ((gI > ba(fT)))
1650- then throw("Invalid closePosition parameters")
1651- else {
1652- let iY = eB(cp, true)
1653- let eA = iY._1
1654- let iV = iY._2
1655- let eE = iY._3
1656- let eF = iY._4
1657- let cQ = iY._5
1658- let cR = iY._6
1659- let eH = iY._7
1660- let eK = iY._8
1661- let ea = iY._9
1662- let eI = iY._10
1663- let eJ = iY._11
1664- let hO = iY._12
1665- let hP = iY._13
1666- if (if ((iM != 0))
1667- then (iM > eA)
1668- else false)
1669- then throw(((("Limit error: " + toString(eA)) + " < ") + toString(iM)))
1670- else $Tuple15(0, 0, 0, 0, iV, eE, eF, cQ, cR, eH, eK, eI, eJ, hO, hP)
1671- }
1672- let hK = iP._1
1673- let iW = iP._2
1674- let hM = iP._3
1675- let iX = iP._4
1676- let iV = iP._5
1677- let eE = iP._6
1678- let eF = iP._7
1679- let cQ = iP._8
1680- let cR = iP._9
1681- let eH = iP._10
1682- let eK = iP._11
1683- let eI = iP._12
1684- let eJ = iP._13
1685- let hO = iP._14
1686- let hP = iP._15
1687- if ((iV > 0))
1688- then throw("Unable to close position with bad debt")
1689- else {
1690- let iZ = ba(eF)
1691- let ja = (bC() - iZ)
1692- let jb = if ((0 > ja))
1693- then $Tuple2(0, ba(ja))
1694- else $Tuple2(ja, 0)
1695- let jc = jb._1
1696- let jd = jb._2
1697- let je = fX(cp)
1698- let iC = je._1
1699- let iD = je._2
1700- let jf = if ((iC > 0))
1701- then if ((iZ >= iC))
1702- then {
1703- let iL = invoke(aw(), "repay", [cp, iC, iD], nil)
1704- if ((iL == iL))
1705- then $Tuple2([ScriptTransfer(iN, iC, fromBase58String(iD))], (iZ - iC))
1706- else throw("Strict value is not equal to itself.")
1707- }
1708- else {
1709- let jg = invoke(aw(), "realizePartiallyAndClose", [cp, iZ, iD], nil)
1710- if ((jg == jg))
1711- then $Tuple2([ScriptTransfer(iN, iZ, fromBase58String(iD))], 0)
1712- else throw("Strict value is not equal to itself.")
1713- }
1714- else $Tuple2(nil, iZ)
1715- if ((jf == jf))
1716- then {
1717- let jh = jf._2
1718- let ji = jf._1
1719- let jj = if ((jh > 0))
1720- then {
1721- let jj = invoke(ar(), "withdrawLocked", [jh], nil)
1722- if ((jj == jj))
1723- then nil
1724- else throw("Strict value is not equal to itself.")
1725- }
1726- else nil
1727- if ((jj == jj))
1728- then {
1729- let hQ = invoke(as(), "notifyNotional", [cp, 0], nil)
1730- if ((hQ == hQ))
1731- then (((((if ((hK == 0))
1732- then hb(cp)
1733- else gH(cp, hK, iW, hM, iX)) ++ gU(cQ, cR, eH, eK, eI, eJ, hO, hP)) ++ (if ((jh > 0))
1734- then hc(iN, jh)
1735- else nil)) ++ hf(jc)) ++ ji)
1736- else throw("Strict value is not equal to itself.")
1737- }
1738- else throw("Strict value is not equal to itself.")
1739- }
1740- else throw("Strict value is not equal to itself.")
1741- }
1742- }
1743- }
1744- else throw("Strict value is not equal to itself.")
1745- }
1746-
1747-
1748-
1749-@Callable(cg)
1750-func liquidate (cp) = {
1751- let hu = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1752- if ((hu == hu))
1753- then {
1754- let jk = eo(cp, aN)
1755- let iz = if (dQ())
1756- then {
1757- let jl = eo(cp, aO)
1758- bb(jk, jl)
1759- }
1760- else jk
1761- if (if (if (if (!(ch(iz, bR(), false)))
1762- then true
1763- else !(cw(cp)))
1764- then true
1765- else !(cx()))
1766- then true
1767- else cy())
1746+ else jC
1747+ if (if (if (if (if (!(cj(iB, bT(), false)))
1748+ then true
1749+ else !(cB(cr)))
1750+ then true
1751+ else !(cC()))
1752+ then true
1753+ else cD())
1754+ then true
1755+ else dL())
17681756 then throw("Unable to liquidate")
1769- else if (if (if ((jk > bS()))
1770- then (bT() > 0)
1757+ else if (if (if ((jC > bU()))
1758+ then (bV() > 0)
17711759 else false)
1772- then (aK > bT())
1760+ then (aM > bV())
17731761 else false)
17741762 then {
1775- let jm = co(cp)
1776- let fT = jm._1
1777- let hw = jm._2
1778- let hx = jm._3
1779- let hy = jm._4
1780- let hz = if ((fT > 0))
1781- then aF
1782- else aE
1783- let hA = (hz == aE)
1784- let eA = eu(cp, fT)
1785- let jn = ef(cp, aN)
1786- let hD = jn._1
1787- let ee = jn._2
1788- let jo = cP(hA, eA)
1789- let ez = jo._1
1790- let cQ = jo._2
1791- let cR = jo._3
1792- let eH = jo._4
1793- let jp = aR(ba(ez), ba(fT))
1794- let eE = aT(ee, jp)
1795- let jq = dd(fT, hw, hy, eE)
1796- let dm = jq._1
1797- let dn = jq._2
1798- let di = jq._3
1799- let hI = (ee - eE)
1800- let hJ = if ((fT > 0))
1801- then ((hD - eA) - hI)
1802- else ((hI + hD) - eA)
1803- let jr = aT(eA, bS())
1804- let js = (jr / 2)
1805- let gk = (jr - js)
1806- let iW = (dm - jr)
1807- let hK = (fT + ez)
1808- let hM = ba(hJ)
1809- let iX = cm(hK)
1810- let eK = (bK() - eA)
1811- let ja = (bC() - jr)
1812- let jt = if ((0 > ja))
1813- then $Tuple2(0, ba(ja))
1814- else $Tuple2(ja, 0)
1815- let ju = jt._1
1816- let jd = jt._2
1817- let jv = fX(cp)
1818- let iC = jv._1
1819- let iD = jv._2
1820- let jw = if ((iC > 0))
1763+ let jE = cq(cr)
1764+ let fZ = jE._1
1765+ let hZ = jE._2
1766+ let ia = jE._3
1767+ let ib = jE._4
1768+ let hE = if ((fZ > 0))
1769+ then aH
1770+ else aG
1771+ let if = (hE == aG)
1772+ let eL = eF(cr, fZ)
1773+ let jF = eq(cr, aP)
1774+ let io = jF._1
1775+ let ep = jF._2
1776+ let jG = cQ(if, eL)
1777+ let eK = jG._1
1778+ let cU = jG._2
1779+ let cV = jG._3
1780+ let eS = jG._4
1781+ let jH = aT(bc(eK), bc(fZ))
1782+ let eP = aV(ep, jH)
1783+ let jI = dh(fZ, hZ, ib, eP)
1784+ let dq = jI._1
1785+ let dr = jI._2
1786+ let dm = jI._3
1787+ let ja = (ep - eP)
1788+ let jb = if ((fZ > 0))
1789+ then ((io - eL) - ja)
1790+ else ((ja + io) - eL)
1791+ let jJ = aV(eL, bU())
1792+ let jK = (jJ / 2)
1793+ let gq = (jJ - jK)
1794+ let je = (dq - jJ)
1795+ let ij = (fZ + eK)
1796+ let iq = bc(jb)
1797+ let jd = (ia - iq)
1798+ let jc = co(ij)
1799+ let eV = (bM() - jd)
1800+ let jl = (bE() - jJ)
1801+ let jL = if ((0 > jl))
1802+ then $Tuple2(0, bc(jl))
1803+ else $Tuple2(jl, 0)
1804+ let jM = jL._1
1805+ let jo = jL._2
1806+ let jN = gd(cr)
1807+ let iE = jN._1
1808+ let iF = jN._2
1809+ let jO = if ((iE > 0))
18211810 then {
1822- let jx = aT(iC, jp)
1823- let jg = invoke(aw(), "realizePartially", [cp, iD, jx], nil)
1824- if ((jg == jg))
1811+ let jP = aV(iE, jH)
1812+ let jr = invoke(ay(), "realizePartially", [cr, iF, jP], nil)
1813+ if ((jr == jr))
18251814 then nil
18261815 else throw("Strict value is not equal to itself.")
18271816 }
18281817 else nil
1829- if ((jw == jw))
1818+ if ((jO == jO))
18301819 then {
1831- let jj = invoke(ar(), "withdrawLocked", [jr], nil)
1832- if ((jj == jj))
1820+ let jA = invoke(at(), "withdrawLocked", [jJ], nil)
1821+ if ((jA == jA))
18331822 then {
1834- let ir = invoke(ar(), "addFree", nil, [AttachedPayment(ao(), gk)])
1835- if ((ir == ir))
1823+ let jQ = invoke(at(), "addFree", nil, [AttachedPayment(aq(), gq)])
1824+ if ((jQ == jQ))
18361825 then {
1837- let hQ = invoke(as(), "notifyNotional", [cp, hM], nil)
1838- if ((hQ == hQ))
1839- then (((gH(cp, hK, iW, hM, iX) ++ gU(cQ, cR, eH, eK, (cb() - (if ((hK > 0))
1840- then ba(ez)
1841- else 0)), (ca() - (if ((0 > hK))
1842- then ba(ez)
1843- else 0)), (bM() - (if ((hK > 0))
1844- then eA
1845- else 0)), (bL() - (if ((0 > hK))
1846- then eA
1847- else 0)))) ++ hc(cg.caller, js)) ++ hf(ju))
1826+ let iw = invoke(au(), "notifyNotional", [cr, iq], nil)
1827+ if ((iw == iw))
1828+ then (((gO(cr, ij, je, iq, jc) ++ hb(cU, cV, eS, eV, (cd() - (if ((ij > 0))
1829+ then bc(eK)
1830+ else 0)), (cc() - (if ((0 > ij))
1831+ then bc(eK)
1832+ else 0)), (bO() - (if ((ij > 0))
1833+ then jd
1834+ else 0)), (bN() - (if ((0 > ij))
1835+ then jd
1836+ else 0)))) ++ hj(ci.caller, jK)) ++ hm(jM))
18481837 else throw("Strict value is not equal to itself.")
18491838 }
18501839 else throw("Strict value is not equal to itself.")
18511840 }
18521841 else throw("Strict value is not equal to itself.")
18531842 }
18541843 else throw("Strict value is not equal to itself.")
18551844 }
18561845 else {
1857- let jy = eB(cp, false)
1858- let dZ = jy._1
1859- let dn = jy._2
1860- let ea = jy._3
1861- let eb = jy._4
1862- let cQ = jy._5
1863- let cR = jy._6
1864- let eH = jy._7
1865- let eK = jy._8
1866- let eA = jy._9
1867- let eI = jy._10
1868- let eJ = jy._11
1869- let hO = jy._12
1870- let hP = jy._13
1871- let jr = aT(eA, bS())
1872- let js = (jr / 2)
1873- let gk = (jr - js)
1874- let ja = (bC() - jr)
1875- let jz = if ((0 > ja))
1876- then $Tuple2(0, ba(ja))
1877- else $Tuple2(ja, 0)
1878- let ju = jz._1
1879- let jd = jz._2
1880- let jA = fX(cp)
1881- let iC = jA._1
1882- let iD = jA._2
1883- let jw = if ((iC > 0))
1846+ let jR = eM(cr, false)
1847+ let ek = jR._1
1848+ let dr = jR._2
1849+ let el = jR._3
1850+ let em = jR._4
1851+ let cU = jR._5
1852+ let cV = jR._6
1853+ let eS = jR._7
1854+ let eV = jR._8
1855+ let eL = jR._9
1856+ let eT = jR._10
1857+ let eU = jR._11
1858+ let ik = jR._12
1859+ let il = jR._13
1860+ let jJ = aV(eL, bU())
1861+ let jK = (jJ / 2)
1862+ let gq = (jJ - jK)
1863+ let jl = (bE() - jJ)
1864+ let jS = if ((0 > jl))
1865+ then $Tuple2(0, bc(jl))
1866+ else $Tuple2(jl, 0)
1867+ let jM = jS._1
1868+ let jo = jS._2
1869+ let jT = gd(cr)
1870+ let iE = jT._1
1871+ let iF = jT._2
1872+ let jO = if ((iE > 0))
18841873 then {
1885- let jg = invoke(aw(), "realizePartiallyAndClose", [cp, 0, iD], nil)
1886- if ((jg == jg))
1874+ let jr = invoke(ay(), "realizePartiallyAndClose", [cr, 0, iF], nil)
1875+ if ((jr == jr))
18871876 then nil
18881877 else throw("Strict value is not equal to itself.")
18891878 }
18901879 else nil
1891- if ((jw == jw))
1880+ if ((jO == jO))
18921881 then {
1893- let gd = if ((dn > 0))
1882+ let gj = if ((dr > 0))
18941883 then {
1895- let jB = invoke(ar(), "exchangeFreeAndLocked", [dn], nil)
1896- if ((jB == jB))
1884+ let jU = invoke(at(), "exchangeFreeAndLocked", [dr], nil)
1885+ if ((jU == jU))
18971886 then nil
18981887 else throw("Strict value is not equal to itself.")
18991888 }
19001889 else nil
1901- if ((gd == gd))
1890+ if ((gj == gj))
19021891 then {
1903- let jj = invoke(ar(), "withdrawLocked", [jr], nil)
1904- if ((jj == jj))
1892+ let jA = invoke(at(), "withdrawLocked", [jJ], nil)
1893+ if ((jA == jA))
19051894 then {
1906- let ir = invoke(ar(), "addFree", nil, [AttachedPayment(ao(), gk)])
1907- if ((ir == ir))
1895+ let jQ = invoke(at(), "addFree", nil, [AttachedPayment(aq(), gq)])
1896+ if ((jQ == jQ))
19081897 then {
1909- let hQ = invoke(as(), "notifyNotional", [cp, 0], nil)
1910- if ((hQ == hQ))
1911- then (((hb(cp) ++ gU(cQ, cR, eH, eK, eI, eJ, hO, hP)) ++ hc(cg.caller, js)) ++ hf(ju))
1898+ let iw = invoke(au(), "notifyNotional", [cr, 0], nil)
1899+ if ((iw == iw))
1900+ then (((hi(cr) ++ hb(cU, cV, eS, eV, eT, eU, ik, il)) ++ hj(ci.caller, jK)) ++ hm(jM))
19121901 else throw("Strict value is not equal to itself.")
19131902 }
19141903 else throw("Strict value is not equal to itself.")
19151904 }
19161905 else throw("Strict value is not equal to itself.")
19171906 }
19181907 else throw("Strict value is not equal to itself.")
19191908 }
19201909 else throw("Strict value is not equal to itself.")
19211910 }
19221911 }
19231912 else throw("Strict value is not equal to itself.")
19241913 }
19251914
19261915
19271916
1928-@Callable(cg)
1917+@Callable(ci)
19291918 func payFunding () = {
1930- let jC = bN()
1931- if (if (if ((jC > lastBlock.timestamp))
1932- then true
1933- else !(cx()))
1934- then true
1935- else cy())
1936- then throw(((("Invalid funding block timestamp: " + toString(lastBlock.timestamp)) + " < ") + toString(jC)))
1937- else {
1938- let fD = dz()
1939- let jD = fC()
1940- let fG = jD._1
1941- let fH = jD._2
1942- gx((jC + bQ()), (bY() + fH), (bZ() + fG), aR(fH, fD), aR(fG, fD))
1943- }
1944- }
1945-
1946-
1947-
1948-@Callable(cg)
1919+ let hI = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1920+ if ((hI == hI))
1921+ then {
1922+ let jV = bP()
1923+ if (if (if ((jV > lastBlock.timestamp))
1924+ then true
1925+ else !(cC()))
1926+ then true
1927+ else cD())
1928+ then throw(((("Invalid funding block timestamp: " + toString(lastBlock.timestamp)) + " < ") + toString(jV)))
1929+ else {
1930+ let fJ = dE()
1931+ let jW = fI()
1932+ let fM = jW._1
1933+ let fN = jW._2
1934+ gD((jV + bS()), (ca() + fN), (cb() + fM), aT(fN, fJ), aT(fM, fJ))
1935+ }
1936+ }
1937+ else throw("Strict value is not equal to itself.")
1938+ }
1939+
1940+
1941+
1942+@Callable(ci)
19491943 func syncTerminalPriceToOracle () = {
1950- let jE = fy(dz())
1951- let jF = jE._1
1952- let jG = jE._2
1953- let eF = jE._3
1954- let jH = if ((eF != 0))
1944+ let cM = bH()
1945+ let cN = bI()
1946+ let jX = fE(dE(), cM, cN)
1947+ let hv = jX._1
1948+ let hw = jX._2
1949+ let eQ = jX._3
1950+ let hx = if ((eQ != 0))
19551951 then {
1956- let jH = invoke(ar(), "exchangeFreeAndLocked", [eF], nil)
1957- if ((jH == jH))
1952+ let hx = invoke(at(), "exchangeFreeAndLocked", [eQ], nil)
1953+ if ((hx == hx))
19581954 then nil
19591955 else throw("Strict value is not equal to itself.")
19601956 }
19611957 else nil
1962- if ((jH == jH))
1963- then gT(jF, jG)
1958+ if ((hx == hx))
1959+ then (ha(hv, hw) ++ gS(aT(aV(cM, hv), aV(cN, hw))))
19641960 else throw("Strict value is not equal to itself.")
19651961 }
19661962
19671963
19681964
1969-@Callable(cg)
1970-func view_calcRemainMarginWithFundingPayment (cp) = {
1971- let hu = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1972- if ((hu == hu))
1965+@Callable(ci)
1966+func view_calcRemainMarginWithFundingPayment (cr) = {
1967+ let hI = invoke(this, "syncTerminalPriceToOracle", nil, nil)
1968+ if ((hI == hI))
19731969 then {
1974- let jI = co(cp)
1975- let cs = jI._1
1976- let eh = jI._2
1977- let eq = jI._3
1978- let ej = jI._4
1979- let jJ = ef(cp, aN)
1980- let dW = jJ._1
1981- let ee = jJ._2
1982- let jK = dd(cs, eh, ej, ee)
1983- let dm = jK._1
1984- let dn = jK._2
1985- let di = jK._3
1986- throw((((((aP(dm) + aP(di)) + aP(et(cp))) + aP(ee)) + aP(dn)) + aP(dW)))
1970+ let jY = cq(cr)
1971+ let cu = jY._1
1972+ let es = jY._2
1973+ let eB = jY._3
1974+ let eu = jY._4
1975+ let jZ = eq(cr, aP)
1976+ let eh = jZ._1
1977+ let ep = jZ._2
1978+ let ka = dh(cu, es, eu, ep)
1979+ let dq = ka._1
1980+ let dr = ka._2
1981+ let dm = ka._3
1982+ throw((((((aR(dq) + aR(dm)) + aR(eE(cr))) + aR(ep)) + aR(dr)) + aR(eh)))
19871983 }
19881984 else throw("Strict value is not equal to itself.")
19891985 }
19901986
19911987
19921988
1993-@Callable(cg)
1994-func view_getPegAdjustCost (gM) = {
1995- let fx = fy(gM)
1996- throw(toString(fx._3))
1997- }
1998-
1999-
2000-
2001-@Callable(cg)
1989+@Callable(ci)
1990+func view_getPegAdjustCost (gT) = {
1991+ let cM = bH()
1992+ let cN = bI()
1993+ let fD = fE(gT, cM, cN)
1994+ throw(toString(fD._3))
1995+ }
1996+
1997+
1998+
1999+@Callable(ci)
20022000 func view_getTerminalAmmPrice () = {
2003- let jL = fb()
2004- let ff = jL._1
2005- let fg = jL._2
2006- let hj = aR(aT(ff, bH()), aT(fg, bI()))
2007- throw(toString(hj))
2008- }
2009-
2010-
2011-
2012-@Callable(cg)
2001+ let kb = fm()
2002+ let fq = kb._1
2003+ let fr = kb._2
2004+ let hq = aT(aV(fq, bJ()), aV(fr, bK()))
2005+ throw(toString(hq))
2006+ }
2007+
2008+
2009+
2010+@Callable(ci)
20132011 func view_getFunding () = {
2014- let fD = dz()
2015- let jM = fC()
2016- let fG = jM._1
2017- let fH = jM._2
2018- let jN = aR(fH, fD)
2019- let jO = aR(fG, fD)
2020- throw((((aP(jN) + aP(jO)) + aP(eL())) + aP(dz())))
2021- }
2022-
2023-
2024-
2025-@Callable(cg)
2026-func view_getBorrowedByTrader (cp) = {
2027- let jP = fX(cp)
2028- let iC = jP._1
2029- let iD = jP._2
2030- throw((aP(iC) + iD))
2031- }
2032-
2033-
2034-
2035-@Callable(cg)
2012+ let fJ = dE()
2013+ let kc = fI()
2014+ let fM = kc._1
2015+ let fN = kc._2
2016+ let kd = aT(fN, fJ)
2017+ let ke = aT(fM, fJ)
2018+ throw((((aR(kd) + aR(ke)) + aR(eW())) + aR(dE())))
2019+ }
2020+
2021+
2022+
2023+@Callable(ci)
2024+func view_getBorrowedByTrader (cr) = {
2025+ let kf = gd(cr)
2026+ let iE = kf._1
2027+ let iF = kf._2
2028+ throw((aR(iE) + iF))
2029+ }
2030+
2031+
2032+
2033+@Callable(ci)
20362034 func computeSpotPrice () = {
2037- let fx = dP()
2038- $Tuple2(nil, fx)
2039- }
2040-
2041-
2042-
2043-@Callable(cg)
2044-func computeFeeForTraderWithArtifact (cp,fJ) = {
2045- let fx = ga(cp, fJ)
2046- $Tuple2(nil, fx)
2047- }
2048-
2049-
2050-@Verifier(jQ)
2051-func jR () = sigVerify(jQ.bodyBytes, jQ.proofs[0], an())
2035+ let fD = ea()
2036+ $Tuple2(nil, fD)
2037+ }
2038+
2039+
2040+
2041+@Callable(ci)
2042+func computeFeeForTraderWithArtifact (cr,fP) = {
2043+ let fD = gg(cr, fP)
2044+ $Tuple2(nil, fD)
2045+ }
2046+
2047+
2048+@Verifier(kg)
2049+func kh () = sigVerify(kg.bodyBytes, kg.proofs[0], ap())
20522050

github/deemru/w8io/c3f4982 
482.27 ms