tx · 7Ke5qAXEXNEQRQdot1yCsaeaFN6kx6mt1KSCDuJj475D

3N7rPu8fJbSU4LaBm6xXpC6Q1mFMipUgcRQ:  -0.04900000 Waves

2022.08.29 22:18 [2206149] smart account 3N7rPu8fJbSU4LaBm6xXpC6Q1mFMipUgcRQ > SELF 0.00000000 Waves

{ "type": 13, "id": "7Ke5qAXEXNEQRQdot1yCsaeaFN6kx6mt1KSCDuJj475D", "fee": 4900000, "feeAssetId": null, "timestamp": 1661800714796, "version": 2, "chainId": 84, "sender": "3N7rPu8fJbSU4LaBm6xXpC6Q1mFMipUgcRQ", "senderPublicKey": "9aasfTpGq8rpV4uUB9KaaHqqSrzvEw9t4pzXqv5N6BNr", "proofs": [ "3698F2JFngJzMJiupoeXPQhq9sxJC6FJkLhEbzRz4sNBo3oeqBuWjsY28pP8iN3t3yGXeWbsXgg6D1bNZPkEHEgq" ], "script": "base64:BgJiCAISABIAEgMKAQESAwoBARILCgkBAQEBAQEBAQESEAoOAQEBAQEBAQgICAEBAQESAwoBARIFCgMBAQESBQoDAQEBEgASAwoBARIAEgMKAQgSABIDCgEIEgMKAQgSBAoCCAF/AAlrX29yYV9rZXkCCWtfb3JhX2tleQAPa19vcmFfYmxvY2tfa2V5Ag9rX29yYV9ibG9ja19rZXkABWtfb3JhAgVrX29yYQAJa19iYWxhbmNlAglrX2JhbGFuY2UADmtfcG9zaXRpb25TaXplAg5rX3Bvc2l0aW9uU2l6ZQAQa19wb3NpdGlvbk1hcmdpbgIQa19wb3NpdGlvbk1hcmdpbgAWa19wb3NpdGlvbk9wZW5Ob3Rpb25hbAIWa19wb3NpdGlvbk9wZW5Ob3Rpb25hbAAua19wb3NpdGlvbkxhc3RVcGRhdGVkQ3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgISa19wb3NpdGlvbkZyYWN0aW9uAA1rX2luaXRpYWxpemVkAg1rX2luaXRpYWxpemVkAAhrX3BhdXNlZAIIa19wYXVzZWQABWtfZmVlAgVrX2ZlZQAPa19mdW5kaW5nUGVyaW9kAg9rX2Z1bmRpbmdQZXJpb2QAEWtfaW5pdE1hcmdpblJhdGlvAhFrX2luaXRNYXJnaW5SYXRpbwAYa19tYWludGVuYW5jZU1hcmdpblJhdGlvAgVrX21tcgAVa19saXF1aWRhdGlvbkZlZVJhdGlvAhVrX2xpcXVpZGF0aW9uRmVlUmF0aW8AGWtfcGFydGlhbExpcXVpZGF0aW9uUmF0aW8CFmtfcGFydExpcXVpZGF0aW9uUmF0aW8ADWtfc3ByZWFkTGltaXQCDWtfc3ByZWFkTGltaXQAEGtfbWF4UHJpY2VJbXBhY3QCEGtfbWF4UHJpY2VJbXBhY3QAEGtfbWF4UHJpY2VTcHJlYWQCEGtfbWF4UHJpY2VTcHJlYWQADWtfbGFzdERhdGFTdHICDWtfbGFzdERhdGFTdHIADmtfbGFzdE1pbnV0ZUlkAg5rX2xhc3RNaW51dGVJZAAda190d2FwRGF0YUxhc3RDdW11bGF0aXZlUHJpY2UCHWtfdHdhcERhdGFMYXN0Q3VtdWxhdGl2ZVByaWNlABNrX3R3YXBEYXRhTGFzdFByaWNlAhNrX3R3YXBEYXRhTGFzdFByaWNlABprX3R3YXBEYXRhUHJldmlvdXNNaW51dGVJZAIaa190d2FwRGF0YVByZXZpb3VzTWludXRlSWQAJWtfbGF0ZXN0TG9uZ0N1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24CG2tfbGF0ZXN0TG9uZ1ByZW1pdW1GcmFjdGlvbgAma19sYXRlc3RTaG9ydEN1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24CHGtfbGF0ZXN0U2hvcnRQcmVtaXVtRnJhY3Rpb24AEmtfbmV4dEZ1bmRpbmdCbG9jawIea19uZXh0RnVuZGluZ0Jsb2NrTWluVGltZXN0YW1wABFrX2xvbmdGdW5kaW5nUmF0ZQIRa19sb25nRnVuZGluZ1JhdGUAEmtfc2hvcnRGdW5kaW5nUmF0ZQISa19zaG9ydEZ1bmRpbmdSYXRlABNrX3F1b3RlQXNzZXRSZXNlcnZlAghrX3F0QXN0UgASa19iYXNlQXNzZXRSZXNlcnZlAghrX2JzQXN0UgATa190b3RhbFBvc2l0aW9uU2l6ZQITa190b3RhbFBvc2l0aW9uU2l6ZQAXa190b3RhbExvbmdQb3NpdGlvblNpemUCF2tfdG90YWxMb25nUG9zaXRpb25TaXplABhrX3RvdGFsU2hvcnRQb3NpdGlvblNpemUCGGtfdG90YWxTaG9ydFBvc2l0aW9uU2l6ZQAUa19jdW11bGF0aXZlTm90aW9uYWwCFGtfY3VtdWxhdGl2ZU5vdGlvbmFsABZrX29wZW5JbnRlcmVzdE5vdGlvbmFsAhZrX29wZW5JbnRlcmVzdE5vdGlvbmFsABRrX2Nvb3JkaW5hdG9yQWRkcmVzcwIUa19jb29yZGluYXRvckFkZHJlc3MAE2tfaW5zdXJhbmNlX2FkZHJlc3MCE2tfaW5zdXJhbmNlX2FkZHJlc3MAD2tfYWRtaW5fYWRkcmVzcwIPa19hZG1pbl9hZGRyZXNzABJrX2FkbWluX3B1YmxpY19rZXkCEmtfYWRtaW5fcHVibGljX2tleQANa19xdW90ZV9hc3NldAINa19xdW90ZV9hc3NldAAPa19xdW90ZV9zdGFraW5nAg9rX3F1b3RlX3N0YWtpbmcAEWtfc3Rha2luZ19hZGRyZXNzAhFrX3N0YWtpbmdfYWRkcmVzcwAPa19taW5lcl9hZGRyZXNzAg9rX21pbmVyX2FkZHJlc3MBC2Nvb3JkaW5hdG9yAAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMFFGtfY29vcmRpbmF0b3JBZGRyZXNzAhNDb29yZGluYXRvciBub3Qgc2V0AQxhZG1pbkFkZHJlc3MACQCmCAEJARFAZXh0ck5hdGl2ZSgxMDUzKQIJAQtjb29yZGluYXRvcgAFD2tfYWRtaW5fYWRkcmVzcwEOYWRtaW5QdWJsaWNLZXkACQDZBAEJARFAZXh0ck5hdGl2ZSgxMDUzKQIJAQtjb29yZGluYXRvcgAFEmtfYWRtaW5fcHVibGljX2tleQEKcXVvdGVBc3NldAAJANkEAQkBEUBleHRyTmF0aXZlKDEwNTMpAgkBC2Nvb3JkaW5hdG9yAAUNa19xdW90ZV9hc3NldAERcXVvdGVBc3NldFN0YWtpbmcACQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkBEUBleHRyTmF0aXZlKDEwNTMpAgkBC2Nvb3JkaW5hdG9yAAUPa19xdW90ZV9zdGFraW5nAhtRdW90ZSBhc3NldCBzdGFraW5nIG5vdCBzZXQBDnN0YWtpbmdBZGRyZXNzAAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJARFAZXh0ck5hdGl2ZSgxMDUzKQIJAQtjb29yZGluYXRvcgAFEWtfc3Rha2luZ19hZGRyZXNzAhFJbnN1cmFuY2Ugbm90IHNldAEQaW5zdXJhbmNlQWRkcmVzcwAJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQERQGV4dHJOYXRpdmUoMTA1MykCCQELY29vcmRpbmF0b3IABRNrX2luc3VyYW5jZV9hZGRyZXNzAhFJbnN1cmFuY2Ugbm90IHNldAEMbWluZXJBZGRyZXNzAAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJARFAZXh0ck5hdGl2ZSgxMDUzKQIJAQtjb29yZGluYXRvcgAFD2tfbWluZXJfYWRkcmVzcwIRSW5zdXJhbmNlIG5vdCBzZXQACERJUl9MT05HAAEACURJUl9TSE9SVAACAA1UV0FQX0lOVEVSVkFMAA8AD09SQUNMRV9JTlRFUlZBTAAPAAdTRUNPTkRTAOgHAAxERUNJTUFMX1VOSVQJAGgCAAEJAGgCCQBoAgkAaAIJAGgCCQBoAgAKAAoACgAKAAoACgAHT05FX0RBWQkAaAIAgKMFBQxERUNJTUFMX1VOSVQACEFMTF9GRUVTAGQAD1BOTF9PUFRJT05fU1BPVAABABFQTkxfT1BUSU9OX09SQUNMRQACAQFzAQJfeAkArAICCQCkAwEFAl94AgEsAQRkaXZkAgJfeAJfeQkAbgQFAl94BQxERUNJTUFMX1VOSVQFAl95BQhIQUxGRVZFTgEEbXVsZAICX3gCX3kJAG4EBQJfeAUCX3kFDERFQ0lNQUxfVU5JVAUISEFMRkVWRU4BA2FicwECX3gDCQBmAgUCX3gAAAUCX3gJAQEtAQUCX3gBBHZtYXgCAl94Al95AwkAZwIFAl94BQJfeQUCX3gFAl95AQ50b0NvbXBvc2l0ZUtleQIEX2tleQhfYWRkcmVzcwkArAICCQCsAgIFBF9rZXkCAV8FCF9hZGRyZXNzAQlsaXN0VG9TdHIBBV9saXN0CgEFX2pvaW4CC2FjY3VtdWxhdG9yA3ZhbAkArAICCQCsAgIFC2FjY3VtdWxhdG9yBQN2YWwCASwECm5ld0xpc3RTdHIKAAIkbAUFX2xpc3QKAAIkcwkAkAMBBQIkbAoABSRhY2MwAgAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBBV9qb2luAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAyMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQEC25ld0xpc3RTdHJVCQCzAgIFCm5ld0xpc3RTdHIAAQQLbmV3TGlzdFN0clIDCQAAAgkArwICBQtuZXdMaXN0U3RyVQABAgEsCQCwAgIFC25ld0xpc3RTdHJVAAEFC25ld0xpc3RTdHJVBQtuZXdMaXN0U3RyUgEJc3RyVG9MaXN0AQRfc3RyCQC1CQIFBF9zdHICASwBC3B1c2hUb1F1ZXVlAwVfbGlzdAhfbWF4U2l6ZQZfdmFsdWUDCQBmAgkAkAMBBQVfbGlzdAUIX21heFNpemUJAM0IAgkA0QgCBQVfbGlzdAAABQZfdmFsdWUJAM0IAgUFX2xpc3QFBl92YWx1ZQEDaW50AQFrCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUEdGhpcwUBawkArAICAg1ubyB2YWx1ZSBmb3IgBQFrAQhjYmFsYW5jZQAJAQNpbnQBBQlrX2JhbGFuY2UBA2ZlZQAJAQNpbnQBBQVrX2ZlZQEPaW5pdE1hcmdpblJhdGlvAAkBA2ludAEFEWtfaW5pdE1hcmdpblJhdGlvAQZxdEFzdFIACQEDaW50AQUTa19xdW90ZUFzc2V0UmVzZXJ2ZQEGYnNBc3RSAAkBA2ludAEFEmtfYmFzZUFzc2V0UmVzZXJ2ZQERdG90YWxQb3NpdGlvblNpemUACQEDaW50AQUTa190b3RhbFBvc2l0aW9uU2l6ZQESY3VtdWxhdGl2ZU5vdGlvbmFsAAkBA2ludAEFFGtfY3VtdWxhdGl2ZU5vdGlvbmFsARRvcGVuSW50ZXJlc3ROb3Rpb25hbAAJAQNpbnQBBRZrX29wZW5JbnRlcmVzdE5vdGlvbmFsARluZXh0RnVuZGluZ0Jsb2NrVGltZXN0YW1wAAkBA2ludAEFEmtfbmV4dEZ1bmRpbmdCbG9jawEQZnVuZGluZ1BlcmlvZFJhdwAJAQNpbnQBBQ9rX2Z1bmRpbmdQZXJpb2QBFGZ1bmRpbmdQZXJpb2REZWNpbWFsAAkAaAIJARBmdW5kaW5nUGVyaW9kUmF3AAUMREVDSU1BTF9VTklUARRmdW5kaW5nUGVyaW9kU2Vjb25kcwAJAGgCCQEQZnVuZGluZ1BlcmlvZFJhdwAFB1NFQ09ORFMBFm1haW50ZW5hbmNlTWFyZ2luUmF0aW8ACQEDaW50AQUYa19tYWludGVuYW5jZU1hcmdpblJhdGlvARNsaXF1aWRhdGlvbkZlZVJhdGlvAAkBA2ludAEFFWtfbGlxdWlkYXRpb25GZWVSYXRpbwEXcGFydGlhbExpcXVpZGF0aW9uUmF0aW8ACQEDaW50AQUZa19wYXJ0aWFsTGlxdWlkYXRpb25SYXRpbwELc3ByZWFkTGltaXQACQEDaW50AQUNa19zcHJlYWRMaW1pdAEObWF4UHJpY2VJbXBhY3QACQEDaW50AQUQa19tYXhQcmljZUltcGFjdAEObWF4UHJpY2VTcHJlYWQACQEDaW50AQUQa19tYXhQcmljZVNwcmVhZAEjbGF0ZXN0TG9uZ0N1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24ACQEDaW50AQUla19sYXRlc3RMb25nQ3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgEkbGF0ZXN0U2hvcnRDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uAAkBA2ludAEFJmtfbGF0ZXN0U2hvcnRDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uARZ0b3RhbFNob3J0UG9zaXRpb25TaXplAAkBA2ludAEFGGtfdG90YWxTaG9ydFBvc2l0aW9uU2l6ZQEVdG90YWxMb25nUG9zaXRpb25TaXplAAkBA2ludAEFF2tfdG90YWxMb25nUG9zaXRpb25TaXplARZyZXF1aXJlTW9yZU1hcmdpblJhdGlvAwxfbWFyZ2luUmF0aW8QX2Jhc2VNYXJnaW5SYXRpbxRfbGFyZ2VyVGhhbk9yRXF1YWxUbwQUcmVtYWluaW5nTWFyZ2luUmF0aW8JAGUCBQxfbWFyZ2luUmF0aW8FEF9iYXNlTWFyZ2luUmF0aW8DAwUUX2xhcmdlclRoYW5PckVxdWFsVG8JAGYCAAAFFHJlbWFpbmluZ01hcmdpblJhdGlvBwkAAgECDkludmFsaWQgbWFyZ2luAwMJAQEhAQUUX2xhcmdlclRoYW5PckVxdWFsVG8JAGcCBRRyZW1haW5pbmdNYXJnaW5SYXRpbwAABwkAAgECDkludmFsaWQgbWFyZ2luBgEfbGF0ZXN0Q3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgENX3Bvc2l0aW9uU2l6ZQMJAAACBQ1fcG9zaXRpb25TaXplAAAJAAIBAixTaG91bGQgbm90IGJlIGNhbGxlZCB3aXRoIF9wb3NpdGlvblNpemUgPT0gMAMJAGYCBQ1fcG9zaXRpb25TaXplAAAJASNsYXRlc3RMb25nQ3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgAJASRsYXRlc3RTaG9ydEN1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24AAQtnZXRQb3NpdGlvbgEHX3RyYWRlcgQPcG9zaXRpb25TaXplT3B0CQCaCAIFBHRoaXMJAQ50b0NvbXBvc2l0ZUtleQIFDmtfcG9zaXRpb25TaXplBQdfdHJhZGVyBAckbWF0Y2gwBQ9wb3NpdGlvblNpemVPcHQDCQABAgUHJG1hdGNoMAIDSW50BAxwb3NpdGlvblNpemUFByRtYXRjaDAJAJYKBAUMcG9zaXRpb25TaXplCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQEOdG9Db21wb3NpdGVLZXkCBRBrX3Bvc2l0aW9uTWFyZ2luBQdfdHJhZGVyCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQEOdG9Db21wb3NpdGVLZXkCBRZrX3Bvc2l0aW9uT3Blbk5vdGlvbmFsBQdfdHJhZGVyCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQEOdG9Db21wb3NpdGVLZXkCBS5rX3Bvc2l0aW9uTGFzdFVwZGF0ZWRDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uBQdfdHJhZGVyCQCWCgQAAAAAAAAAAAETcmVxdWlyZU9wZW5Qb3NpdGlvbgEHX3RyYWRlcgMJAAACCAkBC2dldFBvc2l0aW9uAQUHX3RyYWRlcgJfMQAACQACAQIQTm8gb3BlbiBwb3NpdGlvbgYBC2luaXRpYWxpemVkAAkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzBQ1rX2luaXRpYWxpemVkBwEGcGF1c2VkAAkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzBQhrX3BhdXNlZAcBDXVwZGF0ZVJlc2VydmUDBl9pc0FkZBFfcXVvdGVBc3NldEFtb3VudBBfYmFzZUFzc2V0QW1vdW50AwUGX2lzQWRkBAduZXdCYXNlCQBlAgkBBmJzQXN0UgAFEF9iYXNlQXNzZXRBbW91bnQDCQBnAgAABQduZXdCYXNlCQACAQIqVHggbGVhZCB0byBiYXNlIGFzc2V0IHJlc2VydmUgPD0gMCwgcmV2ZXJ0CQCWCgQJAGQCCQEGcXRBc3RSAAURX3F1b3RlQXNzZXRBbW91bnQFB25ld0Jhc2UJAGQCCQERdG90YWxQb3NpdGlvblNpemUABRBfYmFzZUFzc2V0QW1vdW50CQBkAgkBEmN1bXVsYXRpdmVOb3Rpb25hbAAFEV9xdW90ZUFzc2V0QW1vdW50BAhuZXdRdW90ZQkAZQIJAQZxdEFzdFIABRFfcXVvdGVBc3NldEFtb3VudAMJAGcCAAAFCG5ld1F1b3RlCQACAQIqVHggbGVhZCB0byBiYXNlIHF1b3RlIHJlc2VydmUgPD0gMCwgcmV2ZXJ0CQCWCgQFCG5ld1F1b3RlCQBkAgkBBmJzQXN0UgAFEF9iYXNlQXNzZXRBbW91bnQJAGUCCQERdG90YWxQb3NpdGlvblNpemUABRBfYmFzZUFzc2V0QW1vdW50CQBlAgkBEmN1bXVsYXRpdmVOb3Rpb25hbAAFEV9xdW90ZUFzc2V0QW1vdW50AQlzd2FwSW5wdXQCBl9pc0FkZBFfcXVvdGVBc3NldEFtb3VudAQHX3F0QXN0UgkBBnF0QXN0UgAEB19ic0FzdFIJAQZic0FzdFIABAFrCQEEbXVsZAIFB19xdEFzdFIFB19ic0FzdFIEFnF1b3RlQXNzZXRSZXNlcnZlQWZ0ZXIDBQZfaXNBZGQJAGQCBQdfcXRBc3RSBRFfcXVvdGVBc3NldEFtb3VudAkAZQIFB19xdEFzdFIFEV9xdW90ZUFzc2V0QW1vdW50BBViYXNlQXNzZXRSZXNlcnZlQWZ0ZXIJAQRkaXZkAgUBawUWcXVvdGVBc3NldFJlc2VydmVBZnRlcgQYYW1vdW50QmFzZUFzc2V0Qm91Z2h0QWJzCQEDYWJzAQkAZQIFFWJhc2VBc3NldFJlc2VydmVBZnRlcgUHX2JzQXN0UgQVYW1vdW50QmFzZUFzc2V0Qm91Z2h0AwUGX2lzQWRkBRhhbW91bnRCYXNlQXNzZXRCb3VnaHRBYnMJAQEtAQUYYW1vdW50QmFzZUFzc2V0Qm91Z2h0QWJzBA0kdDAxMjE3NzEyMzcwCQENdXBkYXRlUmVzZXJ2ZQMFBl9pc0FkZAURX3F1b3RlQXNzZXRBbW91bnQFGGFtb3VudEJhc2VBc3NldEJvdWdodEFicwQXcXVvdGVBc3NldFJlc2VydmVBZnRlcjEIBQ0kdDAxMjE3NzEyMzcwAl8xBBZiYXNlQXNzZXRSZXNlcnZlQWZ0ZXIxCAUNJHQwMTIxNzcxMjM3MAJfMgQXdG90YWxQb3NpdGlvblNpemVBZnRlcjEIBQ0kdDAxMjE3NzEyMzcwAl8zBBhjdW11bGF0aXZlTm90aW9uYWxBZnRlcjEIBQ0kdDAxMjE3NzEyMzcwAl80BAtwcmljZUJlZm9yZQkBBGRpdmQCBQdfcXRBc3RSBQdfYnNBc3RSBAttYXJrZXRQcmljZQkBBGRpdmQCBRFfcXVvdGVBc3NldEFtb3VudAUYYW1vdW50QmFzZUFzc2V0Qm91Z2h0QWJzBAlwcmljZURpZmYJAQNhYnMBCQBlAgULcHJpY2VCZWZvcmUFC21hcmtldFByaWNlBAtwcmljZUltcGFjdAkAZQIFDERFQ0lNQUxfVU5JVAkBBGRpdmQCBQtwcmljZUJlZm9yZQkAZAIFC3ByaWNlQmVmb3JlBQlwcmljZURpZmYEE21heFByaWNlSW1wYWN0VmFsdWUJAQ5tYXhQcmljZUltcGFjdAADCQBmAgULcHJpY2VJbXBhY3QFE21heFByaWNlSW1wYWN0VmFsdWUJAAIBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICDVByaWNlIGltcGFjdCAJAKQDAQULcHJpY2VJbXBhY3QCFCA+IG1heCBwcmljZSBpbXBhY3QgCQCkAwEFE21heFByaWNlSW1wYWN0VmFsdWUCFSBiZWZvcmUgcXVvdGUgYXNzZXQ6IAkApAMBBQdfcXRBc3RSAhQgYmVmb3JlIGJhc2UgYXNzZXQ6IAkApAMBBQdfYnNBc3RSAiEgcXVvdGUgYXNzZXQgYW1vdW50IHRvIGV4Y2hhbmdlOiAJAKQDAQURX3F1b3RlQXNzZXRBbW91bnQCDyBwcmljZSBiZWZvcmU6IAkApAMBBQtwcmljZUJlZm9yZQIOIG1hcmtldFByaWNlOiAJAKQDAQULbWFya2V0UHJpY2UJAJcKBQUVYW1vdW50QmFzZUFzc2V0Qm91Z2h0BRdxdW90ZUFzc2V0UmVzZXJ2ZUFmdGVyMQUWYmFzZUFzc2V0UmVzZXJ2ZUFmdGVyMQUXdG90YWxQb3NpdGlvblNpemVBZnRlcjEFGGN1bXVsYXRpdmVOb3Rpb25hbEFmdGVyMQEiY2FsY1JlbWFpbk1hcmdpbldpdGhGdW5kaW5nUGF5bWVudAQQX29sZFBvc2l0aW9uU2l6ZRJfb2xkUG9zaXRpb25NYXJnaW4lX29sZFBvc2l0aW9uQ3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgxfbWFyZ2luRGVsdGEEDmZ1bmRpbmdQYXltZW50AwkBAiE9AgUQX29sZFBvc2l0aW9uU2l6ZQAABCBfbGF0ZXN0Q3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgkBH2xhdGVzdEN1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24BBRBfb2xkUG9zaXRpb25TaXplCQEEbXVsZAIJAGUCBSBfbGF0ZXN0Q3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgUlX29sZFBvc2l0aW9uQ3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgUQX29sZFBvc2l0aW9uU2l6ZQAABAxzaWduZWRNYXJnaW4JAGQCCQBlAgUMX21hcmdpbkRlbHRhBQ5mdW5kaW5nUGF5bWVudAUSX29sZFBvc2l0aW9uTWFyZ2luBA0kdDAxMzg2MTEzOTg4AwkAZgIAAAUMc2lnbmVkTWFyZ2luCQCUCgIAAAkBA2FicwEFDHNpZ25lZE1hcmdpbgkAlAoCCQEDYWJzAQUMc2lnbmVkTWFyZ2luAAAEDHJlbWFpbk1hcmdpbggFDSR0MDEzODYxMTM5ODgCXzEEB2JhZERlYnQIBQ0kdDAxMzg2MTEzOTg4Al8yCQCVCgMFDHJlbWFpbk1hcmdpbgUHYmFkRGVidAUOZnVuZGluZ1BheW1lbnQBFnN3YXBPdXRwdXRXaXRoUmVzZXJ2ZXMFBl9pc0FkZBBfYmFzZUFzc2V0QW1vdW50FF9jaGVja01heFByaWNlSW1wYWN0El9xdW90ZUFzc2V0UmVzZXJ2ZRFfYmFzZUFzc2V0UmVzZXJ2ZQQLcHJpY2VCZWZvcmUJAQRkaXZkAgUSX3F1b3RlQXNzZXRSZXNlcnZlBRFfYmFzZUFzc2V0UmVzZXJ2ZQMJAAACBRBfYmFzZUFzc2V0QW1vdW50AAAJAAIBAhlJbnZhbGlkIGJhc2UgYXNzZXQgYW1vdW50BAFrCQEEbXVsZAIFEl9xdW90ZUFzc2V0UmVzZXJ2ZQURX2Jhc2VBc3NldFJlc2VydmUEGGJhc2VBc3NldFBvb2xBbW91bnRBZnRlcgMFBl9pc0FkZAkAZAIFEV9iYXNlQXNzZXRSZXNlcnZlBRBfYmFzZUFzc2V0QW1vdW50CQBlAgURX2Jhc2VBc3NldFJlc2VydmUFEF9iYXNlQXNzZXRBbW91bnQED3F1b3RlQXNzZXRBZnRlcgkBBGRpdmQCBQFrBRhiYXNlQXNzZXRQb29sQW1vdW50QWZ0ZXIEDnF1b3RlQXNzZXRTb2xkCQEDYWJzAQkAZQIFD3F1b3RlQXNzZXRBZnRlcgUSX3F1b3RlQXNzZXRSZXNlcnZlBBNtYXhQcmljZUltcGFjdFZhbHVlCQEObWF4UHJpY2VJbXBhY3QABA0kdDAxNDk2NTE1MTU4CQENdXBkYXRlUmVzZXJ2ZQMJAQEhAQUGX2lzQWRkBQ5xdW90ZUFzc2V0U29sZAUQX2Jhc2VBc3NldEFtb3VudAQXcXVvdGVBc3NldFJlc2VydmVBZnRlcjEIBQ0kdDAxNDk2NTE1MTU4Al8xBBZiYXNlQXNzZXRSZXNlcnZlQWZ0ZXIxCAUNJHQwMTQ5NjUxNTE1OAJfMgQXdG90YWxQb3NpdGlvblNpemVBZnRlcjEIBQ0kdDAxNDk2NTE1MTU4Al8zBBhjdW11bGF0aXZlTm90aW9uYWxBZnRlcjEIBQ0kdDAxNDk2NTE1MTU4Al80BAttYXJrZXRQcmljZQkBBGRpdmQCBQ5xdW90ZUFzc2V0U29sZAUQX2Jhc2VBc3NldEFtb3VudAQJcHJpY2VEaWZmCQEDYWJzAQkAZQIFC3ByaWNlQmVmb3JlBQttYXJrZXRQcmljZQQLcHJpY2VJbXBhY3QJAGUCBQxERUNJTUFMX1VOSVQJAQRkaXZkAgULcHJpY2VCZWZvcmUJAGQCBQtwcmljZUJlZm9yZQUJcHJpY2VEaWZmAwMJAGYCBQtwcmljZUltcGFjdAUTbWF4UHJpY2VJbXBhY3RWYWx1ZQUUX2NoZWNrTWF4UHJpY2VJbXBhY3QHCQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAg1QcmljZSBpbXBhY3QgCQCkAwEFC3ByaWNlSW1wYWN0AhQgPiBtYXggcHJpY2UgaW1wYWN0IAkApAMBBRNtYXhQcmljZUltcGFjdFZhbHVlAhUgYmVmb3JlIHF1b3RlIGFzc2V0OiAJAKQDAQUSX3F1b3RlQXNzZXRSZXNlcnZlAhQgYmVmb3JlIGJhc2UgYXNzZXQ6IAkApAMBBRFfYmFzZUFzc2V0UmVzZXJ2ZQIgIGJhc2UgYXNzZXQgYW1vdW50IHRvIGV4Y2hhbmdlOiAJAKQDAQUQX2Jhc2VBc3NldEFtb3VudAIPIHByaWNlIGJlZm9yZTogCQCkAwEFC3ByaWNlQmVmb3JlAg8gbWFya2V0IHByaWNlOiAJAKQDAQULbWFya2V0UHJpY2UJAJoKCAUOcXVvdGVBc3NldFNvbGQFF3F1b3RlQXNzZXRSZXNlcnZlQWZ0ZXIxBRZiYXNlQXNzZXRSZXNlcnZlQWZ0ZXIxBRd0b3RhbFBvc2l0aW9uU2l6ZUFmdGVyMQUYY3VtdWxhdGl2ZU5vdGlvbmFsQWZ0ZXIxCQBlAgkBFXRvdGFsTG9uZ1Bvc2l0aW9uU2l6ZQADBQZfaXNBZGQJAQNhYnMBBRBfYmFzZUFzc2V0QW1vdW50AAAJAGUCCQEWdG90YWxTaG9ydFBvc2l0aW9uU2l6ZQADCQEBIQEFBl9pc0FkZAkBA2FicwEFEF9iYXNlQXNzZXRBbW91bnQAAAULcHJpY2VJbXBhY3QBCnN3YXBPdXRwdXQDBl9pc0FkZBBfYmFzZUFzc2V0QW1vdW50FF9jaGVja01heFByaWNlSW1wYWN0CQEWc3dhcE91dHB1dFdpdGhSZXNlcnZlcwUFBl9pc0FkZAUQX2Jhc2VBc3NldEFtb3VudAUUX2NoZWNrTWF4UHJpY2VJbXBhY3QJAQZxdEFzdFIACQEGYnNBc3RSAAESZ2V0T3JhY2xlVHdhcFByaWNlAAQGb3JhY2xlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwUFa19vcmECAAQIcHJpY2VLZXkJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMFCWtfb3JhX2tleQQIYmxvY2tLZXkJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMFD2tfb3JhX2Jsb2NrX2tleQQJbGFzdFZhbHVlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUGb3JhY2xlBQhwcmljZUtleQkArAICCQCsAgIJAKwCAgIiQ2FuIG5vdCBnZXQgb3JhY2xlIHByaWNlLiBPcmFjbGU6IAkApQgBBQZvcmFjbGUCBiBrZXk6IAUIcHJpY2VLZXkFCWxhc3RWYWx1ZQEZcmVxdWlyZU5vdE92ZXJTcHJlYWRMaW1pdAISX3F1b3RlQXNzZXRSZXNlcnZlEV9iYXNlQXNzZXRSZXNlcnZlBAtvcmFjbGVQcmljZQkBEmdldE9yYWNsZVR3YXBQcmljZQAECnByaWNlQWZ0ZXIJAQRkaXZkAgUSX3F1b3RlQXNzZXRSZXNlcnZlBRFfYmFzZUFzc2V0UmVzZXJ2ZQQMYXZlcmFnZVByaWNlCQEEZGl2ZAIJAGQCBQtvcmFjbGVQcmljZQUKcHJpY2VBZnRlcgkAaAIAAgUMREVDSU1BTF9VTklUBAxhYnNQcmljZURpZmYJAQRkaXZkAgkBA2FicwEJAGUCBQtvcmFjbGVQcmljZQUKcHJpY2VBZnRlcgUMYXZlcmFnZVByaWNlAwkAZgIFDGFic1ByaWNlRGlmZgkBDm1heFByaWNlU3ByZWFkAAkAAgEJAKwCAgkArAICCQCsAgICDVByaWNlIHNwcmVhZCAJAKQDAQUMYWJzUHJpY2VEaWZmAhQgPiBtYXggcHJpY2Ugc3ByZWFkIAkApAMBCQEObWF4UHJpY2VTcHJlYWQABgEMZ2V0U3BvdFByaWNlAAQSX3F1b3RlQXNzZXRSZXNlcnZlCQEGcXRBc3RSAAQRX2Jhc2VBc3NldFJlc2VydmUJAQZic0FzdFIACQEEZGl2ZAIFEl9xdW90ZUFzc2V0UmVzZXJ2ZQURX2Jhc2VBc3NldFJlc2VydmUBFmlzT3ZlckZsdWN0dWF0aW9uTGltaXQABAtvcmFjbGVQcmljZQkBEmdldE9yYWNsZVR3YXBQcmljZQAEDGN1cnJlbnRQcmljZQkBDGdldFNwb3RQcmljZQAJAGYCCQEEZGl2ZAIJAQNhYnMBCQBlAgULb3JhY2xlUHJpY2UFDGN1cnJlbnRQcmljZQULb3JhY2xlUHJpY2UJAQtzcHJlYWRMaW1pdAABH2dldFBvc2l0aW9uQWRqdXN0ZWRPcGVuTm90aW9uYWwEDV9wb3NpdGlvblNpemUHX29wdGlvbhJfcXVvdGVBc3NldFJlc2VydmURX2Jhc2VBc3NldFJlc2VydmUED3Bvc2l0aW9uU2l6ZUFicwkBA2FicwEFDV9wb3NpdGlvblNpemUEB2lzU2hvcnQJAGYCAAAFDV9wb3NpdGlvblNpemUEEHBvc2l0aW9uTm90aW9uYWwDCQAAAgUHX29wdGlvbgUPUE5MX09QVElPTl9TUE9UBA0kdDAxODM3NjE4NTQ3CQEWc3dhcE91dHB1dFdpdGhSZXNlcnZlcwUJAQEhAQUHaXNTaG9ydAUPcG9zaXRpb25TaXplQWJzBwUSX3F1b3RlQXNzZXRSZXNlcnZlBRFfYmFzZUFzc2V0UmVzZXJ2ZQQTb3V0UG9zaXRpb25Ob3Rpb25hbAgFDSR0MDE4Mzc2MTg1NDcCXzEEAngxCAUNJHQwMTgzNzYxODU0NwJfMgQCeDIIBQ0kdDAxODM3NjE4NTQ3Al8zBAJ4MwgFDSR0MDE4Mzc2MTg1NDcCXzQFE291dFBvc2l0aW9uTm90aW9uYWwJAQRtdWxkAgUPcG9zaXRpb25TaXplQWJzCQESZ2V0T3JhY2xlVHdhcFByaWNlAAUQcG9zaXRpb25Ob3Rpb25hbAEjZ2V0UG9zaXRpb25Ob3Rpb25hbEFuZFVucmVhbGl6ZWRQbmwCB190cmFkZXIHX29wdGlvbgQNJHQwMTg5NDExOTA2OQkBC2dldFBvc2l0aW9uAQUHX3RyYWRlcgQMcG9zaXRpb25TaXplCAUNJHQwMTg5NDExOTA2OQJfMQQOcG9zaXRpb25NYXJnaW4IBQ0kdDAxODk0MTE5MDY5Al8yBBRwb3NpdGlvbk9wZW5Ob3Rpb25hbAgFDSR0MDE4OTQxMTkwNjkCXzMEEXBvc2l0aW9uTHN0VXBkQ1BGCAUNJHQwMTg5NDExOTA2OQJfNAMJAAACBQxwb3NpdGlvblNpemUAAAkAAgECFUludmFsaWQgcG9zaXRpb24gc2l6ZQQHaXNTaG9ydAkAZgIAAAUMcG9zaXRpb25TaXplBBBwb3NpdGlvbk5vdGlvbmFsCQEfZ2V0UG9zaXRpb25BZGp1c3RlZE9wZW5Ob3Rpb25hbAQFDHBvc2l0aW9uU2l6ZQUHX29wdGlvbgkBBnF0QXN0UgAJAQZic0FzdFIABA11bnJlYWxpemVkUG5sAwUHaXNTaG9ydAkAZQIFFHBvc2l0aW9uT3Blbk5vdGlvbmFsBRBwb3NpdGlvbk5vdGlvbmFsCQBlAgUQcG9zaXRpb25Ob3Rpb25hbAUUcG9zaXRpb25PcGVuTm90aW9uYWwJAJQKAgUQcG9zaXRpb25Ob3Rpb25hbAUNdW5yZWFsaXplZFBubAEPY2FsY01hcmdpblJhdGlvAw1fcmVtYWluTWFyZ2luCF9iYWREZWJ0EV9wb3NpdGlvbk5vdGlvbmFsCQEEZGl2ZAIJAGUCBQ1fcmVtYWluTWFyZ2luBQhfYmFkRGVidAURX3Bvc2l0aW9uTm90aW9uYWwBFmdldE1hcmdpblJhdGlvQnlPcHRpb24CB190cmFkZXIHX29wdGlvbgQNJHQwMTk5MDIyMDAxMwkBC2dldFBvc2l0aW9uAQUHX3RyYWRlcgQMcG9zaXRpb25TaXplCAUNJHQwMTk5MDIyMDAxMwJfMQQOcG9zaXRpb25NYXJnaW4IBQ0kdDAxOTkwMjIwMDEzAl8yBANwb24IBQ0kdDAxOTkwMjIwMDEzAl8zBBFwb3NpdGlvbkxzdFVwZENQRggFDSR0MDE5OTAyMjAwMTMCXzQEDSR0MDIwMDE5MjAxMTIJASNnZXRQb3NpdGlvbk5vdGlvbmFsQW5kVW5yZWFsaXplZFBubAIFB190cmFkZXIFB19vcHRpb24EEHBvc2l0aW9uTm90aW9uYWwIBQ0kdDAyMDAxOTIwMTEyAl8xBA11bnJlYWxpemVkUG5sCAUNJHQwMjAwMTkyMDExMgJfMgQNJHQwMjAxMTcyMDI4MwkBImNhbGNSZW1haW5NYXJnaW5XaXRoRnVuZGluZ1BheW1lbnQEBQxwb3NpdGlvblNpemUFDnBvc2l0aW9uTWFyZ2luBRFwb3NpdGlvbkxzdFVwZENQRgUNdW5yZWFsaXplZFBubAQMcmVtYWluTWFyZ2luCAUNJHQwMjAxMTcyMDI4MwJfMQQHYmFkRGVidAgFDSR0MDIwMTE3MjAyODMCXzIJAQ9jYWxjTWFyZ2luUmF0aW8DBQxyZW1haW5NYXJnaW4FB2JhZERlYnQFEHBvc2l0aW9uTm90aW9uYWwBDmdldE1hcmdpblJhdGlvAQdfdHJhZGVyCQEWZ2V0TWFyZ2luUmF0aW9CeU9wdGlvbgIFB190cmFkZXIFD1BOTF9PUFRJT05fU1BPVAEbZ2V0UGFydGlhbExpcXVpZGF0aW9uQW1vdW50AgdfdHJhZGVyDV9wb3NpdGlvblNpemUEDG1heGltdW1SYXRpbwkBBHZtYXgCCQEXcGFydGlhbExpcXVpZGF0aW9uUmF0aW8ACQBlAgUMREVDSU1BTF9VTklUCQEEZGl2ZAIJAQ5nZXRNYXJnaW5SYXRpbwEFB190cmFkZXIJARZtYWludGVuYW5jZU1hcmdpblJhdGlvAAQYbWF4RXhjaGFuZ2VkUG9zaXRpb25TaXplCQEEbXVsZAIJAQNhYnMBBQ1fcG9zaXRpb25TaXplBQxtYXhpbXVtUmF0aW8ECnN3YXBSZXN1bHQJAQpzd2FwT3V0cHV0AwkAZgIFDV9wb3NpdGlvblNpemUAAAUYbWF4RXhjaGFuZ2VkUG9zaXRpb25TaXplBwQcbWF4RXhjaGFuZ2VkUXVvdGVBc3NldEFtb3VudAgFCnN3YXBSZXN1bHQCXzEEC3ByaWNlSW1wYWN0CAUKc3dhcFJlc3VsdAJfOAMJAGYCCQEObWF4UHJpY2VJbXBhY3QABQtwcmljZUltcGFjdAUcbWF4RXhjaGFuZ2VkUXVvdGVBc3NldEFtb3VudAQVZXhjaGFuZ2VkUG9zaXRpb25TaXplCQEEbXVsZAIJAQNhYnMBBQ1fcG9zaXRpb25TaXplCQEXcGFydGlhbExpcXVpZGF0aW9uUmF0aW8ABBlleGNoYW5nZWRRdW90ZUFzc2V0QW1vdW50CAkBCnN3YXBPdXRwdXQDCQBmAgUNX3Bvc2l0aW9uU2l6ZQAABRVleGNoYW5nZWRQb3NpdGlvblNpemUHAl8xBRlleGNoYW5nZWRRdW90ZUFzc2V0QW1vdW50ARVpbnRlcm5hbENsb3NlUG9zaXRpb24CB190cmFkZXIUX2NoZWNrTWF4UHJpY2VJbXBhY3QEDSR0MDIxNDY1MjE1OTMJAQtnZXRQb3NpdGlvbgEFB190cmFkZXIEDHBvc2l0aW9uU2l6ZQgFDSR0MDIxNDY1MjE1OTMCXzEEDnBvc2l0aW9uTWFyZ2luCAUNJHQwMjE0NjUyMTU5MwJfMgQUcG9zaXRpb25PcGVuTm90aW9uYWwIBQ0kdDAyMTQ2NTIxNTkzAl8zBBFwb3NpdGlvbkxzdFVwZENQRggFDSR0MDIxNDY1MjE1OTMCXzQEDXVucmVhbGl6ZWRQbmwICQEjZ2V0UG9zaXRpb25Ob3Rpb25hbEFuZFVucmVhbGl6ZWRQbmwCBQdfdHJhZGVyBQ9QTkxfT1BUSU9OX1NQT1QCXzIEDSR0MDIxNjg4MjE4NTYJASJjYWxjUmVtYWluTWFyZ2luV2l0aEZ1bmRpbmdQYXltZW50BAUMcG9zaXRpb25TaXplBQ5wb3NpdGlvbk1hcmdpbgURcG9zaXRpb25Mc3RVcGRDUEYFDXVucmVhbGl6ZWRQbmwEDHJlbWFpbk1hcmdpbggFDSR0MDIxNjg4MjE4NTYCXzEEB2JhZERlYnQIBQ0kdDAyMTY4ODIxODU2Al8yBBVleGNoYW5nZWRQb3NpdGlvblNpemUJAQEtAQUMcG9zaXRpb25TaXplBAtyZWFsaXplZFBubAUNdW5yZWFsaXplZFBubAQNbWFyZ2luVG9WYXVsdAkBAS0BBQxyZW1haW5NYXJnaW4EDSR0MDIxOTgzMjIyOTQJAQpzd2FwT3V0cHV0AwkAZgIFDHBvc2l0aW9uU2l6ZQAACQEDYWJzAQUMcG9zaXRpb25TaXplBRRfY2hlY2tNYXhQcmljZUltcGFjdAQZZXhjaGFuZ2VkUXVvdGVBc3NldEFtb3VudAgFDSR0MDIxOTgzMjIyOTQCXzEEFnF1b3RlQXNzZXRSZXNlcnZlQWZ0ZXIIBQ0kdDAyMTk4MzIyMjk0Al8yBBViYXNlQXNzZXRSZXNlcnZlQWZ0ZXIIBQ0kdDAyMTk4MzIyMjk0Al8zBBZ0b3RhbFBvc2l0aW9uU2l6ZUFmdGVyCAUNJHQwMjE5ODMyMjI5NAJfNAQXY3VtdWxhdGl2ZU5vdGlvbmFsQWZ0ZXIIBQ0kdDAyMTk4MzIyMjk0Al81BA50b3RhbExvbmdBZnRlcggFDSR0MDIxOTgzMjIyOTQCXzYED3RvdGFsU2hvcnRBZnRlcggFDSR0MDIxOTgzMjIyOTQCXzcEGW9wZW5JbnRlcmVzdE5vdGlvbmFsQWZ0ZXIJAGUCCQEUb3BlbkludGVyZXN0Tm90aW9uYWwABRRwb3NpdGlvbk9wZW5Ob3Rpb25hbAkAngoMBRVleGNoYW5nZWRQb3NpdGlvblNpemUFB2JhZERlYnQFC3JlYWxpemVkUG5sBQ1tYXJnaW5Ub1ZhdWx0BRZxdW90ZUFzc2V0UmVzZXJ2ZUFmdGVyBRViYXNlQXNzZXRSZXNlcnZlQWZ0ZXIFFnRvdGFsUG9zaXRpb25TaXplQWZ0ZXIFF2N1bXVsYXRpdmVOb3Rpb25hbEFmdGVyBRlvcGVuSW50ZXJlc3ROb3Rpb25hbEFmdGVyBRlleGNoYW5nZWRRdW90ZUFzc2V0QW1vdW50BQ50b3RhbExvbmdBZnRlcgUPdG90YWxTaG9ydEFmdGVyARBnZXRUd2FwU3BvdFByaWNlAAQIbWludXRlSWQJAGkCCQBpAggFCWxhc3RCbG9jawl0aW1lc3RhbXAA6AcAPAQNc3RhcnRNaW51dGVJZAkAZQIFCG1pbnV0ZUlkBQ1UV0FQX0lOVEVSVkFMBAdsaXN0U3RyCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMFDWtfbGFzdERhdGFTdHICAAQEbGlzdAkAtQkCBQdsaXN0U3RyAgEsCgEIZmlsdGVyRm4CC2FjY3VtdWxhdG9yBG5leHQDCQBnAgUNc3RhcnRNaW51dGVJZAkBDXBhcnNlSW50VmFsdWUBBQRuZXh0CQDNCAIFC2FjY3VtdWxhdG9yCQENcGFyc2VJbnRWYWx1ZQEFBG5leHQFC2FjY3VtdWxhdG9yBAVsaXN0RgoAAiRsBQRsaXN0CgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQhmaWx0ZXJGbgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMjAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUBAhtYXhJbmRleAMJAGYCCQCQAwEFBWxpc3RGAAAJAJYDAQUFbGlzdEYJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQRsaXN0AAAEDGxhc3RNaW51dGVJZAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQ5rX2xhc3RNaW51dGVJZAAABBZlbmRMYXN0Q3VtdWxhdGl2ZVByaWNlCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkArAICBR1rX3R3YXBEYXRhTGFzdEN1bXVsYXRpdmVQcmljZQIBXwkApAMBBQxsYXN0TWludXRlSWQAAAQMZW5kTGFzdFByaWNlCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkArAICBRNrX3R3YXBEYXRhTGFzdFByaWNlAgFfCQCkAwEFDGxhc3RNaW51dGVJZAAABBJub3dDdW11bGF0aXZlUHJpY2UJAGQCBRZlbmRMYXN0Q3VtdWxhdGl2ZVByaWNlCQBoAgkAZQIFCG1pbnV0ZUlkBQxsYXN0TWludXRlSWQFDGVuZExhc3RQcmljZQQYc3RhcnRMYXN0Q3VtdWxhdGl2ZVByaWNlCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkArAICBR1rX3R3YXBEYXRhTGFzdEN1bXVsYXRpdmVQcmljZQIBXwkApAMBBQhtYXhJbmRleAAABA5zdGFydExhc3RQcmljZQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgUTa190d2FwRGF0YUxhc3RQcmljZQIBXwkApAMBBQhtYXhJbmRleAAABBRzdGFydEN1bXVsYXRpdmVQcmljZQkAZAIFGHN0YXJ0TGFzdEN1bXVsYXRpdmVQcmljZQkAaAIJAGUCBQ1zdGFydE1pbnV0ZUlkBQhtYXhJbmRleAUOc3RhcnRMYXN0UHJpY2UJAGkCCQBlAgUSbm93Q3VtdWxhdGl2ZVByaWNlBRRzdGFydEN1bXVsYXRpdmVQcmljZQUNVFdBUF9JTlRFUlZBTAEOdXBkYXRlU2V0dGluZ3MJEF9pbml0TWFyZ2luUmF0aW8EX21tchRfbGlxdWlkYXRpb25GZWVSYXRpbw5fZnVuZGluZ1BlcmlvZARfZmVlDF9zcHJlYWRMaW1pdA9fbWF4UHJpY2VJbXBhY3QYX3BhcnRpYWxMaXF1aWRhdGlvblJhdGlvD19tYXhQcmljZVNwcmVhZAkAzAgCCQEMSW50ZWdlckVudHJ5AgURa19pbml0TWFyZ2luUmF0aW8FEF9pbml0TWFyZ2luUmF0aW8JAMwIAgkBDEludGVnZXJFbnRyeQIFGGtfbWFpbnRlbmFuY2VNYXJnaW5SYXRpbwUEX21tcgkAzAgCCQEMSW50ZWdlckVudHJ5AgUVa19saXF1aWRhdGlvbkZlZVJhdGlvBRRfbGlxdWlkYXRpb25GZWVSYXRpbwkAzAgCCQEMSW50ZWdlckVudHJ5AgUPa19mdW5kaW5nUGVyaW9kBQ5fZnVuZGluZ1BlcmlvZAkAzAgCCQEMSW50ZWdlckVudHJ5AgUFa19mZWUFBF9mZWUJAMwIAgkBDEludGVnZXJFbnRyeQIFDWtfc3ByZWFkTGltaXQFDF9zcHJlYWRMaW1pdAkAzAgCCQEMSW50ZWdlckVudHJ5AgUQa19tYXhQcmljZUltcGFjdAUPX21heFByaWNlSW1wYWN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRlrX3BhcnRpYWxMaXF1aWRhdGlvblJhdGlvBRhfcGFydGlhbExpcXVpZGF0aW9uUmF0aW8JAMwIAgkBDEludGVnZXJFbnRyeQIFEGtfbWF4UHJpY2VTcHJlYWQFD19tYXhQcmljZVNwcmVhZAUDbmlsAQ11cGRhdGVGdW5kaW5nBRFfbmV4dEZ1bmRpbmdCbG9jayRfbGF0ZXN0TG9uZ0N1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24lX2xhdGVzdFNob3J0Q3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbhBfbG9uZ0Z1bmRpbmdSYXRlEV9zaG9ydEZ1bmRpbmdSYXRlCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRJrX25leHRGdW5kaW5nQmxvY2sFEV9uZXh0RnVuZGluZ0Jsb2NrCQDMCAIJAQxJbnRlZ2VyRW50cnkCBSVrX2xhdGVzdExvbmdDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uBSRfbGF0ZXN0TG9uZ0N1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24JAMwIAgkBDEludGVnZXJFbnRyeQIFJmtfbGF0ZXN0U2hvcnRDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uBSVfbGF0ZXN0U2hvcnRDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRFrX2xvbmdGdW5kaW5nUmF0ZQUQX2xvbmdGdW5kaW5nUmF0ZQkAzAgCCQEMSW50ZWdlckVudHJ5AgUSa19zaG9ydEZ1bmRpbmdSYXRlBRFfc2hvcnRGdW5kaW5nUmF0ZQUDbmlsAQ51cGRhdGVQb3NpdGlvbgUIX2FkZHJlc3MFX3NpemUHX21hcmdpbg1fb3Blbk5vdGlvbmFsIF9sYXRlc3RDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEOdG9Db21wb3NpdGVLZXkCBQ5rX3Bvc2l0aW9uU2l6ZQUIX2FkZHJlc3MFBV9zaXplCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEOdG9Db21wb3NpdGVLZXkCBRBrX3Bvc2l0aW9uTWFyZ2luBQhfYWRkcmVzcwUHX21hcmdpbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBDnRvQ29tcG9zaXRlS2V5AgUWa19wb3NpdGlvbk9wZW5Ob3Rpb25hbAUIX2FkZHJlc3MFDV9vcGVuTm90aW9uYWwJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ50b0NvbXBvc2l0ZUtleQIFLmtfcG9zaXRpb25MYXN0VXBkYXRlZEN1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24FCF9hZGRyZXNzBSBfbGF0ZXN0Q3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgUDbmlsAQphcHBlbmRUd2FwAQVwcmljZQQIbWludXRlSWQJAGkCCQBpAggFCWxhc3RCbG9jawl0aW1lc3RhbXAA6AcAPAQQcHJldmlvdXNNaW51dGVJZAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQ5rX2xhc3RNaW51dGVJZAAAAwkAZgIFEHByZXZpb3VzTWludXRlSWQFCG1pbnV0ZUlkCQACAQIRVFdBUCBvdXQtb2Ytb3JkZXIEDGxhc3RNaW51dGVJZAMJAAACBRBwcmV2aW91c01pbnV0ZUlkAAAFCG1pbnV0ZUlkBRBwcmV2aW91c01pbnV0ZUlkAwkAZgIFCG1pbnV0ZUlkBRBwcmV2aW91c01pbnV0ZUlkBBNwcmV2Q3VtdWxhdGl2ZVByaWNlCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkArAICBR1rX3R3YXBEYXRhTGFzdEN1bXVsYXRpdmVQcmljZQIBXwkApAMBBRBwcmV2aW91c01pbnV0ZUlkAAAECXByZXZQcmljZQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgUTa190d2FwRGF0YUxhc3RQcmljZQIBXwkApAMBBRBwcmV2aW91c01pbnV0ZUlkBQVwcmljZQQTbGFzdEN1bXVsYXRpdmVQcmljZQkAZAIFE3ByZXZDdW11bGF0aXZlUHJpY2UJAGgCCQBlAgUIbWludXRlSWQFDGxhc3RNaW51dGVJZAUJcHJldlByaWNlBARsaXN0CQELcHVzaFRvUXVldWUDCQEJc3RyVG9MaXN0AQkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzBQ1rX2xhc3REYXRhU3RyAgAFDVRXQVBfSU5URVJWQUwJAKQDAQUIbWludXRlSWQJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ50b0NvbXBvc2l0ZUtleQIFHWtfdHdhcERhdGFMYXN0Q3VtdWxhdGl2ZVByaWNlCQCkAwEFCG1pbnV0ZUlkBRNsYXN0Q3VtdWxhdGl2ZVByaWNlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEOdG9Db21wb3NpdGVLZXkCBRNrX3R3YXBEYXRhTGFzdFByaWNlCQCkAwEFCG1pbnV0ZUlkBQVwcmljZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBDnRvQ29tcG9zaXRlS2V5AgUaa190d2FwRGF0YVByZXZpb3VzTWludXRlSWQJAKQDAQUIbWludXRlSWQFEHByZXZpb3VzTWludXRlSWQJAMwIAgkBDEludGVnZXJFbnRyeQIFDmtfbGFzdE1pbnV0ZUlkBQhtaW51dGVJZAkAzAgCCQELU3RyaW5nRW50cnkCBQ1rX2xhc3REYXRhU3RyCQEJbGlzdFRvU3RyAQUEbGlzdAUDbmlsBBh0d2FwRGF0YVByZXZpb3VzTWludXRlSWQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBDnRvQ29tcG9zaXRlS2V5AgUaa190d2FwRGF0YVByZXZpb3VzTWludXRlSWQJAKQDAQUIbWludXRlSWQAAAQTcHJldkN1bXVsYXRpdmVQcmljZQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEOdG9Db21wb3NpdGVLZXkCBR1rX3R3YXBEYXRhTGFzdEN1bXVsYXRpdmVQcmljZQkApAMBBRh0d2FwRGF0YVByZXZpb3VzTWludXRlSWQAAAQJcHJldlByaWNlCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAQ50b0NvbXBvc2l0ZUtleQIFE2tfdHdhcERhdGFMYXN0UHJpY2UJAKQDAQUYdHdhcERhdGFQcmV2aW91c01pbnV0ZUlkBQVwcmljZQQTbGFzdEN1bXVsYXRpdmVQcmljZQkAZAIFE3ByZXZDdW11bGF0aXZlUHJpY2UJAGgCCQBlAgUIbWludXRlSWQFGHR3YXBEYXRhUHJldmlvdXNNaW51dGVJZAUJcHJldlByaWNlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEOdG9Db21wb3NpdGVLZXkCBR1rX3R3YXBEYXRhTGFzdEN1bXVsYXRpdmVQcmljZQkApAMBBQhtaW51dGVJZAUTbGFzdEN1bXVsYXRpdmVQcmljZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBDnRvQ29tcG9zaXRlS2V5AgUTa190d2FwRGF0YUxhc3RQcmljZQkApAMBBQhtaW51dGVJZAUFcHJpY2UFA25pbAERdXBkYXRlQW1tUmVzZXJ2ZXMCB19xdEFzdFIHX2JzQXN0UgkAzAgCCQEMSW50ZWdlckVudHJ5AgUTa19xdW90ZUFzc2V0UmVzZXJ2ZQUHX3F0QXN0UgkAzAgCCQEMSW50ZWdlckVudHJ5AgUSa19iYXNlQXNzZXRSZXNlcnZlBQdfYnNBc3RSBQNuaWwBCXVwZGF0ZUFtbQcHX3F0QXN0UgdfYnNBc3RSF190b3RhbFBvc2l0aW9uU2l6ZUFmdGVyGF9jdW11bGF0aXZlTm90aW9uYWxBZnRlchVfb3BlbkludGVyZXN0Tm90aW9uYWwWX3RvdGFsTG9uZ1Bvc2l0aW9uU2l6ZRdfdG90YWxTaG9ydFBvc2l0aW9uU2l6ZQMJAQIhPQIJAGUCBRZfdG90YWxMb25nUG9zaXRpb25TaXplBRdfdG90YWxTaG9ydFBvc2l0aW9uU2l6ZQUXX3RvdGFsUG9zaXRpb25TaXplQWZ0ZXIJAAIBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIYSW52YWxpZCBBTU0gc3RhdGUgZGF0YTogCQCkAwEFFl90b3RhbExvbmdQb3NpdGlvblNpemUCBCArICAJAKQDAQUXX3RvdGFsU2hvcnRQb3NpdGlvblNpemUCBCAhPSAJAKQDAQUXX3RvdGFsUG9zaXRpb25TaXplQWZ0ZXIJAM4IAgkAzggCCQERdXBkYXRlQW1tUmVzZXJ2ZXMCBQdfcXRBc3RSBQdfYnNBc3RSCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRNrX3RvdGFsUG9zaXRpb25TaXplBRdfdG90YWxQb3NpdGlvblNpemVBZnRlcgkAzAgCCQEMSW50ZWdlckVudHJ5AgUUa19jdW11bGF0aXZlTm90aW9uYWwFGF9jdW11bGF0aXZlTm90aW9uYWxBZnRlcgkAzAgCCQEMSW50ZWdlckVudHJ5AgUWa19vcGVuSW50ZXJlc3ROb3Rpb25hbAUVX29wZW5JbnRlcmVzdE5vdGlvbmFsCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRdrX3RvdGFsTG9uZ1Bvc2l0aW9uU2l6ZQUWX3RvdGFsTG9uZ1Bvc2l0aW9uU2l6ZQkAzAgCCQEMSW50ZWdlckVudHJ5AgUYa190b3RhbFNob3J0UG9zaXRpb25TaXplBRdfdG90YWxTaG9ydFBvc2l0aW9uU2l6ZQUDbmlsCQEKYXBwZW5kVHdhcAEJAQRkaXZkAgUHX3F0QXN0UgUHX2JzQXN0UgEOZGVsZXRlUG9zaXRpb24BCF9hZGRyZXNzCQDMCAIJAQtEZWxldGVFbnRyeQEJAQ50b0NvbXBvc2l0ZUtleQIFDmtfcG9zaXRpb25TaXplBQhfYWRkcmVzcwkAzAgCCQELRGVsZXRlRW50cnkBCQEOdG9Db21wb3NpdGVLZXkCBRBrX3Bvc2l0aW9uTWFyZ2luBQhfYWRkcmVzcwkAzAgCCQELRGVsZXRlRW50cnkBCQEOdG9Db21wb3NpdGVLZXkCBRZrX3Bvc2l0aW9uT3Blbk5vdGlvbmFsBQhfYWRkcmVzcwkAzAgCCQELRGVsZXRlRW50cnkBCQEOdG9Db21wb3NpdGVLZXkCBS5rX3Bvc2l0aW9uTGFzdFVwZGF0ZWRDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uBQhfYWRkcmVzcwUDbmlsAQh3aXRoZHJhdwIIX2FkZHJlc3MHX2Ftb3VudAQHYmFsYW5jZQkA8AcCBQR0aGlzCQEKcXVvdGVBc3NldAADCQBmAgUHX2Ftb3VudAUHYmFsYW5jZQkAAgEJAKwCAgkArAICCQCsAgICE1VuYWJsZSB0byB3aXRoZHJhdyAJAKQDAQUHX2Ftb3VudAIXIGZyb20gY29udHJhY3QgYmFsYW5jZSAJAKQDAQUHYmFsYW5jZQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQhfYWRkcmVzcwUHX2Ftb3VudAkBCnF1b3RlQXNzZXQABQNuaWwBDXVwZGF0ZUJhbGFuY2UBAWkDCQBmAgAABQFpCQACAQIHQmFsYW5jZQkAzAgCCQEMSW50ZWdlckVudHJ5AgUJa19iYWxhbmNlBQFpBQNuaWwBC3RyYW5zZmVyRmVlAQFpCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQ5zdGFraW5nQWRkcmVzcwAFAWkJAQpxdW90ZUFzc2V0AAUDbmlsEQFpAQVwYXVzZQADCQECIT0CCAUBaQZjYWxsZXIJAQxhZG1pbkFkZHJlc3MACQACAQIaSW52YWxpZCB0b2dnbGVQYXVzZSBwYXJhbXMJAMwIAgkBDEJvb2xlYW5FbnRyeQIFCGtfcGF1c2VkBgUDbmlsAWkBB3VucGF1c2UAAwkBAiE9AggFAWkGY2FsbGVyCQEMYWRtaW5BZGRyZXNzAAkAAgECGkludmFsaWQgdG9nZ2xlUGF1c2UgcGFyYW1zCQDMCAIJAQxCb29sZWFuRW50cnkCBQhrX3BhdXNlZAcFA25pbAFpAQxhZGRMaXF1aWRpdHkBEV9xdW90ZUFzc2V0QW1vdW50AwMJAQIhPQIIBQFpBmNhbGxlcgkBDGFkbWluQWRkcmVzcwAGCQBnAgAABRFfcXVvdGVBc3NldEFtb3VudAkAAgECG0ludmFsaWQgYWRkTGlxdWlkaXR5IHBhcmFtcwQHX3F0QXN0UgkBBnF0QXN0UgAEB19ic0FzdFIJAQZic0FzdFIABAVwcmljZQkBBGRpdmQCBQdfcXRBc3RSBQdfYnNBc3RSBBRiYXNlQXNzZXRBbW91bnRUb0FkZAkBBGRpdmQCBRFfcXVvdGVBc3NldEFtb3VudAUFcHJpY2UEC3F0QXN0UkFmdGVyCQBkAgUHX3F0QXN0UgURX3F1b3RlQXNzZXRBbW91bnQEC2JzQXN0UkFmdGVyCQBkAgUHX2JzQXN0UgUUYmFzZUFzc2V0QW1vdW50VG9BZGQJARF1cGRhdGVBbW1SZXNlcnZlcwIFC3F0QXN0UkFmdGVyBQtic0FzdFJBZnRlcgFpAQ9yZW1vdmVMaXF1aWRpdHkBEV9xdW90ZUFzc2V0QW1vdW50AwMJAQIhPQIIBQFpBmNhbGxlcgkBDGFkbWluQWRkcmVzcwAGCQBnAgAABRFfcXVvdGVBc3NldEFtb3VudAkAAgECHkludmFsaWQgcmVtb3ZlTGlxdWlkaXR5IHBhcmFtcwQHX3F0QXN0UgkBBnF0QXN0UgAEB19ic0FzdFIJAQZic0FzdFIABAVwcmljZQkBBGRpdmQCBQdfcXRBc3RSBQdfYnNBc3RSBBdiYXNlQXNzZXRBbW91bnRUb1JlbW92ZQkBBGRpdmQCBRFfcXVvdGVBc3NldEFtb3VudAUFcHJpY2UEC3F0QXN0UkFmdGVyCQBlAgUHX3F0QXN0UgURX3F1b3RlQXNzZXRBbW91bnQEC2JzQXN0UkFmdGVyCQBlAgUHX2JzQXN0UgUXYmFzZUFzc2V0QW1vdW50VG9SZW1vdmUJARF1cGRhdGVBbW1SZXNlcnZlcwIFC3F0QXN0UkFmdGVyBQtic0FzdFJBZnRlcgFpAQ5jaGFuZ2VTZXR0aW5ncwkQX2luaXRNYXJnaW5SYXRpbwRfbW1yFF9saXF1aWRhdGlvbkZlZVJhdGlvDl9mdW5kaW5nUGVyaW9kBF9mZWUMX3NwcmVhZExpbWl0D19tYXhQcmljZUltcGFjdBhfcGFydGlhbExpcXVpZGF0aW9uUmF0aW8PX21heFByaWNlU3ByZWFkAwkBAiE9AggFAWkGY2FsbGVyCQEMYWRtaW5BZGRyZXNzAAkAAgECHUludmFsaWQgY2hhbmdlU2V0dGluZ3MgcGFyYW1zCQEOdXBkYXRlU2V0dGluZ3MJBRBfaW5pdE1hcmdpblJhdGlvBQRfbW1yBRRfbGlxdWlkYXRpb25GZWVSYXRpbwUOX2Z1bmRpbmdQZXJpb2QFBF9mZWUFDF9zcHJlYWRMaW1pdAUPX21heFByaWNlSW1wYWN0BRhfcGFydGlhbExpcXVpZGF0aW9uUmF0aW8FD19tYXhQcmljZVNwcmVhZAFpAQppbml0aWFsaXplDgdfcXRBc3RSB19ic0FzdFIOX2Z1bmRpbmdQZXJpb2QQX2luaXRNYXJnaW5SYXRpbwRfbW1yFF9saXF1aWRhdGlvbkZlZVJhdGlvBF9mZWUHX29yYWNsZQpfb3JhY2xlS2V5DF9jb29yZGluYXRvcgxfc3ByZWFkTGltaXQPX21heFByaWNlSW1wYWN0GF9wYXJ0aWFsTGlxdWlkYXRpb25SYXRpbw9fbWF4UHJpY2VTcHJlYWQDAwMDAwMDAwMDAwMJAGcCAAAFB19xdEFzdFIGCQBnAgAABQdfYnNBc3RSBgkAZwIAAAUOX2Z1bmRpbmdQZXJpb2QGCQBnAgAABRBfaW5pdE1hcmdpblJhdGlvBgkAZwIAAAUEX21tcgYJAGcCAAAFFF9saXF1aWRhdGlvbkZlZVJhdGlvBgkAZwIAAAUEX2ZlZQYJAGcCAAAFDF9zcHJlYWRMaW1pdAYJAGcCAAAFD19tYXhQcmljZUltcGFjdAYJAGcCAAAFGF9wYXJ0aWFsTGlxdWlkYXRpb25SYXRpbwYJAGcCAAAFD19tYXhQcmljZVNwcmVhZAYJAQtpbml0aWFsaXplZAAJAAIBAh1JbnZhbGlkIGluaXRpYWxpemUgcGFyYW1ldGVycwkAzggCCQDOCAIJAM4IAgkAzggCCQEJdXBkYXRlQW1tBwUHX3F0QXN0UgUHX2JzQXN0UgAAAAAAAAAAAAAJAQ51cGRhdGVTZXR0aW5ncwkFEF9pbml0TWFyZ2luUmF0aW8FBF9tbXIFFF9saXF1aWRhdGlvbkZlZVJhdGlvBQ5fZnVuZGluZ1BlcmlvZAUEX2ZlZQUMX3NwcmVhZExpbWl0BQ9fbWF4UHJpY2VJbXBhY3QFGF9wYXJ0aWFsTGlxdWlkYXRpb25SYXRpbwUPX21heFByaWNlU3ByZWFkCQENdXBkYXRlRnVuZGluZwUJAGQCCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAUOX2Z1bmRpbmdQZXJpb2QAAAAAAAAAAAkBDXVwZGF0ZUJhbGFuY2UBAAAJAMwIAgkBDEJvb2xlYW5FbnRyeQIFDWtfaW5pdGlhbGl6ZWQGCQDMCAIJAQtTdHJpbmdFbnRyeQIFBWtfb3JhBQdfb3JhY2xlCQDMCAIJAQtTdHJpbmdFbnRyeQIFCWtfb3JhX2tleQUKX29yYWNsZUtleQkAzAgCCQELU3RyaW5nRW50cnkCBRRrX2Nvb3JkaW5hdG9yQWRkcmVzcwUMX2Nvb3JkaW5hdG9yBQNuaWwBaQESc2V0SW5pdE1hcmdpblJhdGlvARBfaW5pdE1hcmdpblJhdGlvAwMJAGcCAAAFEF9pbml0TWFyZ2luUmF0aW8GCQEBIQEJAQtpbml0aWFsaXplZAAJAAIBAiVJbnZhbGlkIHNldEluaXRNYXJnaW5SYXRpbyBwYXJhbWV0ZXJzCQEOdXBkYXRlU2V0dGluZ3MJBRBfaW5pdE1hcmdpblJhdGlvCQEWbWFpbnRlbmFuY2VNYXJnaW5SYXRpbwAJARNsaXF1aWRhdGlvbkZlZVJhdGlvAAkBEGZ1bmRpbmdQZXJpb2RSYXcACQEDZmVlAAkBC3NwcmVhZExpbWl0AAkBDm1heFByaWNlSW1wYWN0AAkBF3BhcnRpYWxMaXF1aWRhdGlvblJhdGlvAAkBDm1heFByaWNlU3ByZWFkAAFpARBkZWNyZWFzZVBvc2l0aW9uAwdfYW1vdW50CV9sZXZlcmFnZRNfbWluQmFzZUFzc2V0QW1vdW50AwMDAwMJAGcCAAAFB19hbW91bnQGCQEBIQEJAQtpbml0aWFsaXplZAAGCQEBIQEJARZyZXF1aXJlTW9yZU1hcmdpblJhdGlvAwkBBGRpdmQCBQxERUNJTUFMX1VOSVQFCV9sZXZlcmFnZQkBD2luaXRNYXJnaW5SYXRpbwAGBgkBASEBCQETcmVxdWlyZU9wZW5Qb3NpdGlvbgEJAKUIAQgFAWkGY2FsbGVyBgkBBnBhdXNlZAAJAAIBAiNJbnZhbGlkIGRlY3JlYXNlUG9zaXRpb24gcGFyYW1ldGVycwQNJHQwMzQxODczNDMzOQkBC2dldFBvc2l0aW9uAQkApQgBCAUBaQZjYWxsZXIED29sZFBvc2l0aW9uU2l6ZQgFDSR0MDM0MTg3MzQzMzkCXzEEEW9sZFBvc2l0aW9uTWFyZ2luCAUNJHQwMzQxODczNDMzOQJfMgQXb2xkUG9zaXRpb25PcGVuTm90aW9uYWwIBQ0kdDAzNDE4NzM0MzM5Al8zBBRvbGRQb3NpdGlvbkxzdFVwZENQRggFDSR0MDM0MTg3MzQzMzkCXzQECl9kaXJlY3Rpb24DCQBmAgUPb2xkUG9zaXRpb25TaXplAAAFCURJUl9TSE9SVAUIRElSX0xPTkcEBWlzQWRkCQAAAgUKX2RpcmVjdGlvbgUIRElSX0xPTkcEDG9wZW5Ob3Rpb25hbAkBBG11bGQCBQdfYW1vdW50BQlfbGV2ZXJhZ2UEDSR0MDM0NTEyMzQ2MjgJASNnZXRQb3NpdGlvbk5vdGlvbmFsQW5kVW5yZWFsaXplZFBubAIJAKUIAQgFAWkGY2FsbGVyBQ9QTkxfT1BUSU9OX1NQT1QEE29sZFBvc2l0aW9uTm90aW9uYWwIBQ0kdDAzNDUxMjM0NjI4Al8xBA11bnJlYWxpemVkUG5sCAUNJHQwMzQ1MTIzNDYyOAJfMgQNJHQwMzQ2MzQzNzE4MwMJAGYCBRNvbGRQb3NpdGlvbk5vdGlvbmFsBQxvcGVuTm90aW9uYWwEDSR0MDM1MDExMzUyMzAJAQlzd2FwSW5wdXQCBQVpc0FkZAUMb3Blbk5vdGlvbmFsBBVleGNoYW5nZWRQb3NpdGlvblNpemUIBQ0kdDAzNTAxMTM1MjMwAl8xBBZxdW90ZUFzc2V0UmVzZXJ2ZUFmdGVyCAUNJHQwMzUwMTEzNTIzMAJfMgQVYmFzZUFzc2V0UmVzZXJ2ZUFmdGVyCAUNJHQwMzUwMTEzNTIzMAJfMwQWdG90YWxQb3NpdGlvblNpemVBZnRlcggFDSR0MDM1MDExMzUyMzACXzQEF2N1bXVsYXRpdmVOb3Rpb25hbEFmdGVyCAUNJHQwMzUwMTEzNTIzMAJfNQQYZXhjaGFuZ2VkUG9zaXRpb25TaXplQWJzCQEDYWJzAQUVZXhjaGFuZ2VkUG9zaXRpb25TaXplAwMJAQIhPQIFE19taW5CYXNlQXNzZXRBbW91bnQAAAkAZgIFE19taW5CYXNlQXNzZXRBbW91bnQFGGV4Y2hhbmdlZFBvc2l0aW9uU2l6ZUFicwcJAAIBCQCsAgIJAKwCAgkArAICAiVUb28gbGl0dGxlIGJhc2UgYXNzZXQgZXhjaGFuZ2VkLCBnb3QgCQCkAwEFGGV4Y2hhbmdlZFBvc2l0aW9uU2l6ZUFicwIKIGV4cGVjdGVkIAkApAMBBRNfbWluQmFzZUFzc2V0QW1vdW50BAtyZWFsaXplZFBubAkBBGRpdmQCCQEEbXVsZAIFDXVucmVhbGl6ZWRQbmwFGGV4Y2hhbmdlZFBvc2l0aW9uU2l6ZUFicwkBA2FicwEFD29sZFBvc2l0aW9uU2l6ZQQNJHQwMzU2NjczNTkxMgkBImNhbGNSZW1haW5NYXJnaW5XaXRoRnVuZGluZ1BheW1lbnQEBQ9vbGRQb3NpdGlvblNpemUFEW9sZFBvc2l0aW9uTWFyZ2luBRRvbGRQb3NpdGlvbkxzdFVwZENQRgULcmVhbGl6ZWRQbmwEDHJlbWFpbk1hcmdpbggFDSR0MDM1NjY3MzU5MTICXzEEB2JhZERlYnQIBQ0kdDAzNTY2NzM1OTEyAl8yBA5mdW5kaW5nUGF5bWVudAgFDSR0MDM1NjY3MzU5MTICXzMEGWV4Y2hhbmdlZFF1b3RlQXNzZXRBbW91bnQFDG9wZW5Ob3Rpb25hbAQSdW5yZWFsaXplZFBubEFmdGVyCQBlAgUNdW5yZWFsaXplZFBubAULcmVhbGl6ZWRQbmwEEnJlbWFpbk9wZW5Ob3Rpb25hbAMJAGYCBQ9vbGRQb3NpdGlvblNpemUAAAkAZQIJAGUCBRNvbGRQb3NpdGlvbk5vdGlvbmFsBRlleGNoYW5nZWRRdW90ZUFzc2V0QW1vdW50BRJ1bnJlYWxpemVkUG5sQWZ0ZXIJAGUCCQBkAgUSdW5yZWFsaXplZFBubEFmdGVyBRNvbGRQb3NpdGlvbk5vdGlvbmFsBRlleGNoYW5nZWRRdW90ZUFzc2V0QW1vdW50BA9uZXdQb3NpdGlvblNpemUJAGQCBQ9vbGRQb3NpdGlvblNpemUFFWV4Y2hhbmdlZFBvc2l0aW9uU2l6ZQkAnQoLBQ9uZXdQb3NpdGlvblNpemUFDHJlbWFpbk1hcmdpbgkBA2FicwEFEnJlbWFpbk9wZW5Ob3Rpb25hbAkBH2xhdGVzdEN1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24BBQ9uZXdQb3NpdGlvblNpemUFFWJhc2VBc3NldFJlc2VydmVBZnRlcgUWcXVvdGVBc3NldFJlc2VydmVBZnRlcgUWdG90YWxQb3NpdGlvblNpemVBZnRlcgUXY3VtdWxhdGl2ZU5vdGlvbmFsQWZ0ZXIJAGUCCQEUb3BlbkludGVyZXN0Tm90aW9uYWwABQxvcGVuTm90aW9uYWwJAGUCCQEVdG90YWxMb25nUG9zaXRpb25TaXplAAMJAGYCBQ9uZXdQb3NpdGlvblNpemUAAAkBA2FicwEFFWV4Y2hhbmdlZFBvc2l0aW9uU2l6ZQAACQBlAgkBFnRvdGFsU2hvcnRQb3NpdGlvblNpemUAAwkAZgIAAAUPbmV3UG9zaXRpb25TaXplCQEDYWJzAQUVZXhjaGFuZ2VkUG9zaXRpb25TaXplAAAJAAIBAhRDbG9zZSBwb3NpdGlvbiBmaXJzdAQPbmV3UG9zaXRpb25TaXplCAUNJHQwMzQ2MzQzNzE4MwJfMQQXbmV3UG9zaXRpb25SZW1haW5NYXJnaW4IBQ0kdDAzNDYzNDM3MTgzAl8yBBduZXdQb3NpdGlvbk9wZW5Ob3Rpb25hbAgFDSR0MDM0NjM0MzcxODMCXzMEFG5ld1Bvc2l0aW9uTGF0ZXN0Q1BGCAUNJHQwMzQ2MzQzNzE4MwJfNAQVYmFzZUFzc2V0UmVzZXJ2ZUFmdGVyCAUNJHQwMzQ2MzQzNzE4MwJfNQQWcXVvdGVBc3NldFJlc2VydmVBZnRlcggFDSR0MDM0NjM0MzcxODMCXzYEFnRvdGFsUG9zaXRpb25TaXplQWZ0ZXIIBQ0kdDAzNDYzNDM3MTgzAl83BBdjdW11bGF0aXZlTm90aW9uYWxBZnRlcggFDSR0MDM0NjM0MzcxODMCXzgEGW9wZW5JbnRlcmVzdE5vdGlvbmFsQWZ0ZXIIBQ0kdDAzNDYzNDM3MTgzAl85BA50b3RhbExvbmdBZnRlcggFDSR0MDM0NjM0MzcxODMDXzEwBA90b3RhbFNob3J0QWZ0ZXIIBQ0kdDAzNDYzNDM3MTgzA18xMQQObm90aWZ5Tm90aW9uYWwJAPwHBAkBDG1pbmVyQWRkcmVzcwACDm5vdGlmeU5vdGlvbmFsCQDMCAIJAKUIAQgFAWkGY2FsbGVyCQDMCAIFF25ld1Bvc2l0aW9uT3Blbk5vdGlvbmFsBQNuaWwFA25pbAMJAAACBQ5ub3RpZnlOb3Rpb25hbAUObm90aWZ5Tm90aW9uYWwJAM4IAgkBDnVwZGF0ZVBvc2l0aW9uBQkApQgBCAUBaQZjYWxsZXIFD25ld1Bvc2l0aW9uU2l6ZQUXbmV3UG9zaXRpb25SZW1haW5NYXJnaW4FF25ld1Bvc2l0aW9uT3Blbk5vdGlvbmFsBRRuZXdQb3NpdGlvbkxhdGVzdENQRgkBCXVwZGF0ZUFtbQcFFnF1b3RlQXNzZXRSZXNlcnZlQWZ0ZXIFFWJhc2VBc3NldFJlc2VydmVBZnRlcgUWdG90YWxQb3NpdGlvblNpemVBZnRlcgUXY3VtdWxhdGl2ZU5vdGlvbmFsQWZ0ZXIFGW9wZW5JbnRlcmVzdE5vdGlvbmFsQWZ0ZXIFDnRvdGFsTG9uZ0FmdGVyBQ90b3RhbFNob3J0QWZ0ZXIJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEQaW5jcmVhc2VQb3NpdGlvbgMKX2RpcmVjdGlvbglfbGV2ZXJhZ2UTX21pbkJhc2VBc3NldEFtb3VudAQKX3Jhd0Ftb3VudAgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQDAwMDAwMDCQECIT0CBQpfZGlyZWN0aW9uBQhESVJfTE9ORwkBAiE9AgUKX2RpcmVjdGlvbgUJRElSX1NIT1JUBwYJAGcCAAAFCl9yYXdBbW91bnQGCQEBIQEJAQtpbml0aWFsaXplZAAGCQECIT0CCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQJAQpxdW90ZUFzc2V0AAYJAQEhAQkBFnJlcXVpcmVNb3JlTWFyZ2luUmF0aW8DCQEEZGl2ZAIFDERFQ0lNQUxfVU5JVAUJX2xldmVyYWdlCQEPaW5pdE1hcmdpblJhdGlvAAYGCQEGcGF1c2VkAAkAAgECI0ludmFsaWQgaW5jcmVhc2VQb3NpdGlvbiBwYXJhbWV0ZXJzBAlmZWVBbW91bnQJAQRtdWxkAgUKX3Jhd0Ftb3VudAkBA2ZlZQAEB19hbW91bnQJAGUCBQpfcmF3QW1vdW50BQlmZWVBbW91bnQEDSR0MDM4MzAxMzg0NTMJAQtnZXRQb3NpdGlvbgEJAKUIAQgFAWkGY2FsbGVyBA9vbGRQb3NpdGlvblNpemUIBQ0kdDAzODMwMTM4NDUzAl8xBBFvbGRQb3NpdGlvbk1hcmdpbggFDSR0MDM4MzAxMzg0NTMCXzIEF29sZFBvc2l0aW9uT3Blbk5vdGlvbmFsCAUNJHQwMzgzMDEzODQ1MwJfMwQUb2xkUG9zaXRpb25Mc3RVcGRDUEYIBQ0kdDAzODMwMTM4NDUzAl80BA1pc05ld1Bvc2l0aW9uCQAAAgUPb2xkUG9zaXRpb25TaXplAAAED2lzU2FtZURpcmVjdGlvbgMJAGYCBQ9vbGRQb3NpdGlvblNpemUAAAkAAAIFCl9kaXJlY3Rpb24FCERJUl9MT05HCQAAAgUKX2RpcmVjdGlvbgUJRElSX1NIT1JUBA5leHBhbmRFeGlzdGluZwMJAQEhAQUNaXNOZXdQb3NpdGlvbgUPaXNTYW1lRGlyZWN0aW9uBwQFaXNBZGQJAAACBQpfZGlyZWN0aW9uBQhESVJfTE9ORwQNJHQwMzg3NDI0MTMxMAMDBQ1pc05ld1Bvc2l0aW9uBgUOZXhwYW5kRXhpc3RpbmcEDG9wZW5Ob3Rpb25hbAkBBG11bGQCBQdfYW1vdW50BQlfbGV2ZXJhZ2UEDSR0MDM5MTY2MzkzNzIJAQlzd2FwSW5wdXQCBQVpc0FkZAUMb3Blbk5vdGlvbmFsBBVhbW91bnRCYXNlQXNzZXRCb3VnaHQIBQ0kdDAzOTE2NjM5MzcyAl8xBBZxdW90ZUFzc2V0UmVzZXJ2ZUFmdGVyCAUNJHQwMzkxNjYzOTM3MgJfMgQVYmFzZUFzc2V0UmVzZXJ2ZUFmdGVyCAUNJHQwMzkxNjYzOTM3MgJfMwQWdG90YWxQb3NpdGlvblNpemVBZnRlcggFDSR0MDM5MTY2MzkzNzICXzQEF2N1bXVsYXRpdmVOb3Rpb25hbEFmdGVyCAUNJHQwMzkxNjYzOTM3MgJfNQMDCQECIT0CBRNfbWluQmFzZUFzc2V0QW1vdW50AAAJAGYCBRNfbWluQmFzZUFzc2V0QW1vdW50CQEDYWJzAQUVYW1vdW50QmFzZUFzc2V0Qm91Z2h0BwkAAgEJAKwCAgkArAICCQCsAgICDUxpbWl0IGVycm9yOiAJAKQDAQkBA2FicwEFFWFtb3VudEJhc2VBc3NldEJvdWdodAIDIDwgCQCkAwEFE19taW5CYXNlQXNzZXRBbW91bnQED25ld1Bvc2l0aW9uU2l6ZQkAZAIFD29sZFBvc2l0aW9uU2l6ZQUVYW1vdW50QmFzZUFzc2V0Qm91Z2h0BBlpbmNyZWFzZU1hcmdpblJlcXVpcmVtZW50CQEEZGl2ZAIFDG9wZW5Ob3Rpb25hbAUJX2xldmVyYWdlBA0kdDAzOTc1MzM5OTkyCQEiY2FsY1JlbWFpbk1hcmdpbldpdGhGdW5kaW5nUGF5bWVudAQFD29sZFBvc2l0aW9uU2l6ZQURb2xkUG9zaXRpb25NYXJnaW4FFG9sZFBvc2l0aW9uTHN0VXBkQ1BGBRlpbmNyZWFzZU1hcmdpblJlcXVpcmVtZW50BAxyZW1haW5NYXJnaW4IBQ0kdDAzOTc1MzM5OTkyAl8xBAJ4MQgFDSR0MDM5NzUzMzk5OTICXzIEAngyCAUNJHQwMzk3NTMzOTk5MgJfMwMJAQEhAQkBGXJlcXVpcmVOb3RPdmVyU3ByZWFkTGltaXQCBRZxdW90ZUFzc2V0UmVzZXJ2ZUFmdGVyBRViYXNlQXNzZXRSZXNlcnZlQWZ0ZXIJAAIBAhVPdmVyIG1heCBzcHJlYWQgbGltaXQJAJ0KCwUPbmV3UG9zaXRpb25TaXplBQxyZW1haW5NYXJnaW4JAGQCBRdvbGRQb3NpdGlvbk9wZW5Ob3Rpb25hbAUMb3Blbk5vdGlvbmFsCQEfbGF0ZXN0Q3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgEFD25ld1Bvc2l0aW9uU2l6ZQUVYmFzZUFzc2V0UmVzZXJ2ZUFmdGVyBRZxdW90ZUFzc2V0UmVzZXJ2ZUFmdGVyBRZ0b3RhbFBvc2l0aW9uU2l6ZUFmdGVyBRdjdW11bGF0aXZlTm90aW9uYWxBZnRlcgkAZAIJARRvcGVuSW50ZXJlc3ROb3Rpb25hbAAFDG9wZW5Ob3Rpb25hbAkAZAIJARV0b3RhbExvbmdQb3NpdGlvblNpemUAAwkAZgIFD25ld1Bvc2l0aW9uU2l6ZQAACQEDYWJzAQUVYW1vdW50QmFzZUFzc2V0Qm91Z2h0AAAJAGQCCQEWdG90YWxTaG9ydFBvc2l0aW9uU2l6ZQADCQBmAgAABQ9uZXdQb3NpdGlvblNpemUJAQNhYnMBBRVhbW91bnRCYXNlQXNzZXRCb3VnaHQAAAQMb3Blbk5vdGlvbmFsCQEEbXVsZAIFB19hbW91bnQFCV9sZXZlcmFnZQQNJHQwNDEwMDM0MTExOQkBI2dldFBvc2l0aW9uTm90aW9uYWxBbmRVbnJlYWxpemVkUG5sAgkApQgBCAUBaQZjYWxsZXIFD1BOTF9PUFRJT05fU1BPVAQTb2xkUG9zaXRpb25Ob3Rpb25hbAgFDSR0MDQxMDAzNDExMTkCXzEEDXVucmVhbGl6ZWRQbmwIBQ0kdDA0MTAwMzQxMTE5Al8yAwkAZgIFE29sZFBvc2l0aW9uTm90aW9uYWwFDG9wZW5Ob3Rpb25hbAkAAgECLlVzZSBkZWNyZWFzZVBvc2l0aW9uIHRvIGRlY3JlYXNlIHBvc2l0aW9uIHNpemUJAAIBAhRDbG9zZSBwb3NpdGlvbiBmaXJzdAQPbmV3UG9zaXRpb25TaXplCAUNJHQwMzg3NDI0MTMxMAJfMQQXbmV3UG9zaXRpb25SZW1haW5NYXJnaW4IBQ0kdDAzODc0MjQxMzEwAl8yBBduZXdQb3NpdGlvbk9wZW5Ob3Rpb25hbAgFDSR0MDM4NzQyNDEzMTACXzMEFG5ld1Bvc2l0aW9uTGF0ZXN0Q1BGCAUNJHQwMzg3NDI0MTMxMAJfNAQVYmFzZUFzc2V0UmVzZXJ2ZUFmdGVyCAUNJHQwMzg3NDI0MTMxMAJfNQQWcXVvdGVBc3NldFJlc2VydmVBZnRlcggFDSR0MDM4NzQyNDEzMTACXzYEFnRvdGFsUG9zaXRpb25TaXplQWZ0ZXIIBQ0kdDAzODc0MjQxMzEwAl83BBdjdW11bGF0aXZlTm90aW9uYWxBZnRlcggFDSR0MDM4NzQyNDEzMTACXzgEGW9wZW5JbnRlcmVzdE5vdGlvbmFsQWZ0ZXIIBQ0kdDAzODc0MjQxMzEwAl85BA50b3RhbExvbmdBZnRlcggFDSR0MDM4NzQyNDEzMTADXzEwBA90b3RhbFNob3J0QWZ0ZXIIBQ0kdDAzODc0MjQxMzEwA18xMQQMZmVlVG9TdGFrZXJzCQBpAgUJZmVlQW1vdW50AAIEDmZlZVRvSW5zdXJhbmNlCQBlAgUJZmVlQW1vdW50BQxmZWVUb1N0YWtlcnMEBXN0YWtlCQD8BwQJARFxdW90ZUFzc2V0U3Rha2luZwACDmxvY2tOZXV0cmlub1NQCQDMCAIJAKUIAQkBDnN0YWtpbmdBZGRyZXNzAAkAzAgCBQhBTExfRkVFUwUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEKcXVvdGVBc3NldAAFB19hbW91bnQFA25pbAMJAAACBQVzdGFrZQUFc3Rha2UEEGRlcG9zaXRJbnN1cmFuY2UJAPwHBAkBEGluc3VyYW5jZUFkZHJlc3MAAgdkZXBvc2l0BQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQpxdW90ZUFzc2V0AAUOZmVlVG9JbnN1cmFuY2UFA25pbAMJAAACBRBkZXBvc2l0SW5zdXJhbmNlBRBkZXBvc2l0SW5zdXJhbmNlBAlub3RpZnlGZWUJAPwHBAkBDG1pbmVyQWRkcmVzcwACCm5vdGlmeUZlZXMJAMwIAgkApQgBCAUBaQZjYWxsZXIJAMwIAgUJZmVlQW1vdW50BQNuaWwFA25pbAMJAAACBQlub3RpZnlGZWUFCW5vdGlmeUZlZQQObm90aWZ5Tm90aW9uYWwJAPwHBAkBDG1pbmVyQWRkcmVzcwACDm5vdGlmeU5vdGlvbmFsCQDMCAIJAKUIAQgFAWkGY2FsbGVyCQDMCAIFF25ld1Bvc2l0aW9uT3Blbk5vdGlvbmFsBQNuaWwFA25pbAMJAAACBQ5ub3RpZnlOb3Rpb25hbAUObm90aWZ5Tm90aW9uYWwJAM4IAgkAzggCCQDOCAIJAQ51cGRhdGVQb3NpdGlvbgUJAKUIAQgFAWkGY2FsbGVyBQ9uZXdQb3NpdGlvblNpemUFF25ld1Bvc2l0aW9uUmVtYWluTWFyZ2luBRduZXdQb3NpdGlvbk9wZW5Ob3Rpb25hbAUUbmV3UG9zaXRpb25MYXRlc3RDUEYJAQl1cGRhdGVBbW0HBRZxdW90ZUFzc2V0UmVzZXJ2ZUFmdGVyBRViYXNlQXNzZXRSZXNlcnZlQWZ0ZXIFFnRvdGFsUG9zaXRpb25TaXplQWZ0ZXIFF2N1bXVsYXRpdmVOb3Rpb25hbEFmdGVyBRlvcGVuSW50ZXJlc3ROb3Rpb25hbEFmdGVyBQ50b3RhbExvbmdBZnRlcgUPdG90YWxTaG9ydEFmdGVyCQELdHJhbnNmZXJGZWUBBQxmZWVUb1N0YWtlcnMJAQ11cGRhdGVCYWxhbmNlAQkAZAIJAQhjYmFsYW5jZQAFB19hbW91bnQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEJYWRkTWFyZ2luAAQKX3Jhd0Ftb3VudAgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQDAwMDCQECIT0CCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQJAQpxdW90ZUFzc2V0AAYJAQEhAQkBE3JlcXVpcmVPcGVuUG9zaXRpb24BCQClCAEIBQFpBmNhbGxlcgYJAQEhAQkBC2luaXRpYWxpemVkAAYJAQZwYXVzZWQACQACAQIcSW52YWxpZCBhZGRNYXJnaW4gcGFyYW1ldGVycwQJZmVlQW1vdW50CQEEbXVsZAIFCl9yYXdBbW91bnQJAQNmZWUABAdfYW1vdW50CQBlAgUKX3Jhd0Ftb3VudAUJZmVlQW1vdW50BA0kdDA0Mjg2NjQzMDE4CQELZ2V0UG9zaXRpb24BCQClCAEIBQFpBmNhbGxlcgQPb2xkUG9zaXRpb25TaXplCAUNJHQwNDI4NjY0MzAxOAJfMQQRb2xkUG9zaXRpb25NYXJnaW4IBQ0kdDA0Mjg2NjQzMDE4Al8yBBdvbGRQb3NpdGlvbk9wZW5Ob3Rpb25hbAgFDSR0MDQyODY2NDMwMTgCXzMEFG9sZFBvc2l0aW9uTHN0VXBkQ1BGCAUNJHQwNDI4NjY0MzAxOAJfNAQMZmVlVG9TdGFrZXJzCQBpAgUJZmVlQW1vdW50AAIEDmZlZVRvSW5zdXJhbmNlCQBlAgUJZmVlQW1vdW50BQxmZWVUb1N0YWtlcnMEBXN0YWtlCQD8BwQJARFxdW90ZUFzc2V0U3Rha2luZwACDmxvY2tOZXV0cmlub1NQCQDMCAIJAKUIAQkBDnN0YWtpbmdBZGRyZXNzAAkAzAgCBQhBTExfRkVFUwUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEKcXVvdGVBc3NldAAFB19hbW91bnQFA25pbAMJAAACBQVzdGFrZQUFc3Rha2UEEGRlcG9zaXRJbnN1cmFuY2UJAPwHBAkBEGluc3VyYW5jZUFkZHJlc3MAAgdkZXBvc2l0BQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQpxdW90ZUFzc2V0AAUOZmVlVG9JbnN1cmFuY2UFA25pbAMJAAACBRBkZXBvc2l0SW5zdXJhbmNlBRBkZXBvc2l0SW5zdXJhbmNlBAlub3RpZnlGZWUJAPwHBAkBDG1pbmVyQWRkcmVzcwACCm5vdGlmeUZlZXMJAMwIAgkApQgBCAUBaQZjYWxsZXIJAMwIAgUJZmVlQW1vdW50BQNuaWwFA25pbAMJAAACBQlub3RpZnlGZWUFCW5vdGlmeUZlZQkAzggCCQDOCAIJAQ51cGRhdGVQb3NpdGlvbgUJAKUIAQgFAWkGY2FsbGVyBQ9vbGRQb3NpdGlvblNpemUJAGQCBRFvbGRQb3NpdGlvbk1hcmdpbgUHX2Ftb3VudAUXb2xkUG9zaXRpb25PcGVuTm90aW9uYWwFFG9sZFBvc2l0aW9uTHN0VXBkQ1BGCQELdHJhbnNmZXJGZWUBBQxmZWVUb1N0YWtlcnMJAQ11cGRhdGVCYWxhbmNlAQkAZAIJAQhjYmFsYW5jZQAFB19hbW91bnQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEMcmVtb3ZlTWFyZ2luAQdfYW1vdW50AwMDAwkAZwIAAAUHX2Ftb3VudAYJAQEhAQkBE3JlcXVpcmVPcGVuUG9zaXRpb24BCQClCAEIBQFpBmNhbGxlcgYJAQEhAQkBC2luaXRpYWxpemVkAAYJAQZwYXVzZWQACQACAQIfSW52YWxpZCByZW1vdmVNYXJnaW4gcGFyYW1ldGVycwQNJHQwNDQwNjc0NDIxOQkBC2dldFBvc2l0aW9uAQkApQgBCAUBaQZjYWxsZXIED29sZFBvc2l0aW9uU2l6ZQgFDSR0MDQ0MDY3NDQyMTkCXzEEEW9sZFBvc2l0aW9uTWFyZ2luCAUNJHQwNDQwNjc0NDIxOQJfMgQXb2xkUG9zaXRpb25PcGVuTm90aW9uYWwIBQ0kdDA0NDA2NzQ0MjE5Al8zBBRvbGRQb3NpdGlvbkxzdFVwZENQRggFDSR0MDQ0MDY3NDQyMTkCXzQEC21hcmdpbkRlbHRhCQEBLQEFB19hbW91bnQEDSR0MDQ0MjU2NDQ0MzUJASJjYWxjUmVtYWluTWFyZ2luV2l0aEZ1bmRpbmdQYXltZW50BAUPb2xkUG9zaXRpb25TaXplBRFvbGRQb3NpdGlvbk1hcmdpbgUUb2xkUG9zaXRpb25Mc3RVcGRDUEYFC21hcmdpbkRlbHRhBAxyZW1haW5NYXJnaW4IBQ0kdDA0NDI1NjQ0NDM1Al8xBAdiYWREZWJ0CAUNJHQwNDQyNTY0NDQzNQJfMgMJAQIhPQIFB2JhZERlYnQAAAkAAgECHUludmFsaWQgcmVtb3ZlZCBtYXJnaW4gYW1vdW50BAttYXJnaW5SYXRpbwkBD2NhbGNNYXJnaW5SYXRpbwMFDHJlbWFpbk1hcmdpbgUHYmFkRGVidAUXb2xkUG9zaXRpb25PcGVuTm90aW9uYWwDCQEBIQEJARZyZXF1aXJlTW9yZU1hcmdpblJhdGlvAwULbWFyZ2luUmF0aW8JAQ9pbml0TWFyZ2luUmF0aW8ABgkAAgEJAKwCAgkArAICCQCsAgICGVRvbyBtdWNoIG1hcmdpbiByZW1vdmVkOiAJAKQDAQULbWFyZ2luUmF0aW8CAyA8IAkApAMBCQEPaW5pdE1hcmdpblJhdGlvAAQHdW5zdGFrZQkA/AcECQERcXVvdGVBc3NldFN0YWtpbmcAAg51bmxvY2tOZXV0cmlubwkAzAgCBQdfYW1vdW50CQDMCAIJANgEAQkBCnF1b3RlQXNzZXQABQNuaWwFA25pbAMJAAACBQd1bnN0YWtlBQd1bnN0YWtlCQDOCAIJAM4IAgkBDnVwZGF0ZVBvc2l0aW9uBQkApQgBCAUBaQZjYWxsZXIFD29sZFBvc2l0aW9uU2l6ZQUMcmVtYWluTWFyZ2luBRdvbGRQb3NpdGlvbk9wZW5Ob3Rpb25hbAkBH2xhdGVzdEN1bXVsYXRpdmVQcmVtaXVtRnJhY3Rpb24BBQ9vbGRQb3NpdGlvblNpemUJAQh3aXRoZHJhdwIIBQFpBmNhbGxlcgUHX2Ftb3VudAkBDXVwZGF0ZUJhbGFuY2UBCQBlAgkBCGNiYWxhbmNlAAUHX2Ftb3VudAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQ1jbG9zZVBvc2l0aW9uAAMDAwkBASEBCQETcmVxdWlyZU9wZW5Qb3NpdGlvbgEJAKUIAQgFAWkGY2FsbGVyBgkBASEBCQELaW5pdGlhbGl6ZWQABgkBBnBhdXNlZAAJAAIBAiBJbnZhbGlkIGNsb3NlUG9zaXRpb24gcGFyYW1ldGVycwQNJHQwNDU1MzE0NTkyMQkBFWludGVybmFsQ2xvc2VQb3NpdGlvbgIJAKUIAQgFAWkGY2FsbGVyBgQCeDEIBQ0kdDA0NTUzMTQ1OTIxAl8xBA9wb3NpdGlvbkJhZERlYnQIBQ0kdDA0NTUzMTQ1OTIxAl8yBAtyZWFsaXplZFBubAgFDSR0MDQ1NTMxNDU5MjECXzMEDW1hcmdpblRvVmF1bHQIBQ0kdDA0NTUzMTQ1OTIxAl80BBZxdW90ZUFzc2V0UmVzZXJ2ZUFmdGVyCAUNJHQwNDU1MzE0NTkyMQJfNQQVYmFzZUFzc2V0UmVzZXJ2ZUFmdGVyCAUNJHQwNDU1MzE0NTkyMQJfNgQWdG90YWxQb3NpdGlvblNpemVBZnRlcggFDSR0MDQ1NTMxNDU5MjECXzcEF2N1bXVsYXRpdmVOb3Rpb25hbEFmdGVyCAUNJHQwNDU1MzE0NTkyMQJfOAQZb3BlbkludGVyZXN0Tm90aW9uYWxBZnRlcggFDSR0MDQ1NTMxNDU5MjECXzkEAngyCAUNJHQwNDU1MzE0NTkyMQNfMTAEDnRvdGFsTG9uZ0FmdGVyCAUNJHQwNDU1MzE0NTkyMQNfMTEED3RvdGFsU2hvcnRBZnRlcggFDSR0MDQ1NTMxNDU5MjEDXzEyAwkAZgIFD3Bvc2l0aW9uQmFkRGVidAAACQACAQImVW5hYmxlIHRvIGNsb3NlIHBvc2l0aW9uIHdpdGggYmFkIGRlYnQEDndpdGhkcmF3QW1vdW50CQEDYWJzAQUNbWFyZ2luVG9WYXVsdAQKYW1tQmFsYW5jZQkAZQIJAQhjYmFsYW5jZQAFDndpdGhkcmF3QW1vdW50BA0kdDA0NjEzMDQ2MjcyAwkAZgIAAAUKYW1tQmFsYW5jZQkAlAoCAAAJAQNhYnMBBQphbW1CYWxhbmNlCQCUCgIFCmFtbUJhbGFuY2UAAAQNYW1tTmV3QmFsYW5jZQgFDSR0MDQ2MTMwNDYyNzICXzEEEGdldEZyb21JbnN1cmFuY2UIBQ0kdDA0NjEzMDQ2MjcyAl8yBAF4AwkAZgIFEGdldEZyb21JbnN1cmFuY2UAAAQRd2l0aGRyYXdJbnN1cmFuY2UJAPwHBAkBEGluc3VyYW5jZUFkZHJlc3MAAgh3aXRoZHJhdwkAzAgCBRBnZXRGcm9tSW5zdXJhbmNlBQNuaWwFA25pbAMJAAACBRF3aXRoZHJhd0luc3VyYW5jZQURd2l0aGRyYXdJbnN1cmFuY2UFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgUDbmlsAwkAAAIFAXgFAXgEB3Vuc3Rha2UJAPwHBAkBEXF1b3RlQXNzZXRTdGFraW5nAAIOdW5sb2NrTmV1dHJpbm8JAMwIAgkAZQIFDndpdGhkcmF3QW1vdW50BRBnZXRGcm9tSW5zdXJhbmNlCQDMCAIJANgEAQkBCnF1b3RlQXNzZXQABQNuaWwFA25pbAMJAAACBQd1bnN0YWtlBQd1bnN0YWtlBA5ub3RpZnlOb3Rpb25hbAkA/AcECQEMbWluZXJBZGRyZXNzAAIObm90aWZ5Tm90aW9uYWwJAMwIAgkApQgBCAUBaQZjYWxsZXIJAMwIAgAABQNuaWwFA25pbAMJAAACBQ5ub3RpZnlOb3Rpb25hbAUObm90aWZ5Tm90aW9uYWwJAM4IAgkAzggCCQDOCAIJAQ5kZWxldGVQb3NpdGlvbgEJAKUIAQgFAWkGY2FsbGVyCQEJdXBkYXRlQW1tBwUWcXVvdGVBc3NldFJlc2VydmVBZnRlcgUVYmFzZUFzc2V0UmVzZXJ2ZUFmdGVyBRZ0b3RhbFBvc2l0aW9uU2l6ZUFmdGVyBRdjdW11bGF0aXZlTm90aW9uYWxBZnRlcgUZb3BlbkludGVyZXN0Tm90aW9uYWxBZnRlcgUOdG90YWxMb25nQWZ0ZXIFD3RvdGFsU2hvcnRBZnRlcgkBCHdpdGhkcmF3AggFAWkGY2FsbGVyBQ53aXRoZHJhd0Ftb3VudAkBDXVwZGF0ZUJhbGFuY2UBBQ1hbW1OZXdCYWxhbmNlCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCWxpcXVpZGF0ZQEHX3RyYWRlcgQPc3BvdE1hcmdpblJhdGlvCQEWZ2V0TWFyZ2luUmF0aW9CeU9wdGlvbgIFB190cmFkZXIFD1BOTF9PUFRJT05fU1BPVAQLbWFyZ2luUmF0aW8DCQEWaXNPdmVyRmx1Y3R1YXRpb25MaW1pdAAEEW9yYWNsZU1hcmdpblJhdGlvCQEWZ2V0TWFyZ2luUmF0aW9CeU9wdGlvbgIFB190cmFkZXIFEVBOTF9PUFRJT05fT1JBQ0xFCQEEdm1heAIFD3Nwb3RNYXJnaW5SYXRpbwURb3JhY2xlTWFyZ2luUmF0aW8FD3Nwb3RNYXJnaW5SYXRpbwMDAwMJAQEhAQkBFnJlcXVpcmVNb3JlTWFyZ2luUmF0aW8DBQttYXJnaW5SYXRpbwkBFm1haW50ZW5hbmNlTWFyZ2luUmF0aW8ABwYJAQEhAQkBE3JlcXVpcmVPcGVuUG9zaXRpb24BBQdfdHJhZGVyBgkBASEBCQELaW5pdGlhbGl6ZWQABgkBBnBhdXNlZAAJAAIBAhNVbmFibGUgdG8gbGlxdWlkYXRlAwMDCQBmAgUPc3BvdE1hcmdpblJhdGlvCQETbGlxdWlkYXRpb25GZWVSYXRpbwAJAGYCCQEXcGFydGlhbExpcXVpZGF0aW9uUmF0aW8AAAAHCQBmAgUMREVDSU1BTF9VTklUCQEXcGFydGlhbExpcXVpZGF0aW9uUmF0aW8ABwQNJHQwNDgzNzM0ODUyMwkBC2dldFBvc2l0aW9uAQUHX3RyYWRlcgQPb2xkUG9zaXRpb25TaXplCAUNJHQwNDgzNzM0ODUyMwJfMQQRb2xkUG9zaXRpb25NYXJnaW4IBQ0kdDA0ODM3MzQ4NTIzAl8yBBdvbGRQb3NpdGlvbk9wZW5Ob3Rpb25hbAgFDSR0MDQ4MzczNDg1MjMCXzMEFG9sZFBvc2l0aW9uTHN0VXBkQ1BGCAUNJHQwNDgzNzM0ODUyMwJfNAQKX2RpcmVjdGlvbgMJAGYCBQ9vbGRQb3NpdGlvblNpemUAAAUJRElSX1NIT1JUBQhESVJfTE9ORwQFaXNBZGQJAAACBQpfZGlyZWN0aW9uBQhESVJfTE9ORwQZZXhjaGFuZ2VkUXVvdGVBc3NldEFtb3VudAkBG2dldFBhcnRpYWxMaXF1aWRhdGlvbkFtb3VudAIFB190cmFkZXIFD29sZFBvc2l0aW9uU2l6ZQQNJHQwNDg3NDg0ODg1MgkBI2dldFBvc2l0aW9uTm90aW9uYWxBbmRVbnJlYWxpemVkUG5sAgUHX3RyYWRlcgUPUE5MX09QVElPTl9TUE9UBBNvbGRQb3NpdGlvbk5vdGlvbmFsCAUNJHQwNDg3NDg0ODg1MgJfMQQNdW5yZWFsaXplZFBubAgFDSR0MDQ4NzQ4NDg4NTICXzIEDSR0MDQ4ODYwNDkxNTAJAQlzd2FwSW5wdXQCBQVpc0FkZAUZZXhjaGFuZ2VkUXVvdGVBc3NldEFtb3VudAQVZXhjaGFuZ2VkUG9zaXRpb25TaXplCAUNJHQwNDg4NjA0OTE1MAJfMQQWcXVvdGVBc3NldFJlc2VydmVBZnRlcggFDSR0MDQ4ODYwNDkxNTACXzIEFWJhc2VBc3NldFJlc2VydmVBZnRlcggFDSR0MDQ4ODYwNDkxNTACXzMEFnRvdGFsUG9zaXRpb25TaXplQWZ0ZXIIBQ0kdDA0ODg2MDQ5MTUwAl80BBdjdW11bGF0aXZlTm90aW9uYWxBZnRlcggFDSR0MDQ4ODYwNDkxNTACXzUEC3JlYWxpemVkUG5sCQEEZGl2ZAIJAQRtdWxkAgUNdW5yZWFsaXplZFBubAkBA2FicwEFFWV4Y2hhbmdlZFBvc2l0aW9uU2l6ZQkBA2FicwEFD29sZFBvc2l0aW9uU2l6ZQQNJHQwNDkyNTc0OTQ5MAkBImNhbGNSZW1haW5NYXJnaW5XaXRoRnVuZGluZ1BheW1lbnQEBQ9vbGRQb3NpdGlvblNpemUFEW9sZFBvc2l0aW9uTWFyZ2luBRRvbGRQb3NpdGlvbkxzdFVwZENQRgULcmVhbGl6ZWRQbmwEDHJlbWFpbk1hcmdpbggFDSR0MDQ5MjU3NDk0OTACXzEEB2JhZERlYnQIBQ0kdDA0OTI1NzQ5NDkwAl8yBA5mdW5kaW5nUGF5bWVudAgFDSR0MDQ5MjU3NDk0OTACXzMEEnVucmVhbGl6ZWRQbmxBZnRlcgkAZQIFDXVucmVhbGl6ZWRQbmwFC3JlYWxpemVkUG5sBBJyZW1haW5PcGVuTm90aW9uYWwDCQBmAgUPb2xkUG9zaXRpb25TaXplAAAJAGUCCQBlAgUTb2xkUG9zaXRpb25Ob3Rpb25hbAUZZXhjaGFuZ2VkUXVvdGVBc3NldEFtb3VudAUSdW5yZWFsaXplZFBubEFmdGVyCQBlAgkAZAIFEnVucmVhbGl6ZWRQbmxBZnRlcgUTb2xkUG9zaXRpb25Ob3Rpb25hbAUZZXhjaGFuZ2VkUXVvdGVBc3NldEFtb3VudAQSbGlxdWlkYXRpb25QZW5hbHR5CQEEbXVsZAIFGWV4Y2hhbmdlZFF1b3RlQXNzZXRBbW91bnQJARNsaXF1aWRhdGlvbkZlZVJhdGlvAAQPZmVlVG9MaXF1aWRhdG9yCQBpAgUSbGlxdWlkYXRpb25QZW5hbHR5AAIEDmZlZVRvSW5zdXJhbmNlCQBlAgUSbGlxdWlkYXRpb25QZW5hbHR5BQ9mZWVUb0xpcXVpZGF0b3IEEW5ld1Bvc2l0aW9uTWFyZ2luCQBlAgUMcmVtYWluTWFyZ2luBRJsaXF1aWRhdGlvblBlbmFsdHkED25ld1Bvc2l0aW9uU2l6ZQkAZAIFD29sZFBvc2l0aW9uU2l6ZQUVZXhjaGFuZ2VkUG9zaXRpb25TaXplBBduZXdQb3NpdGlvbk9wZW5Ob3Rpb25hbAkBA2FicwEFEnJlbWFpbk9wZW5Ob3Rpb25hbAQUbmV3UG9zaXRpb25Mc3RVcGRDUEYJAR9sYXRlc3RDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uAQUPbmV3UG9zaXRpb25TaXplBBlvcGVuSW50ZXJlc3ROb3Rpb25hbEFmdGVyCQBlAgkBFG9wZW5JbnRlcmVzdE5vdGlvbmFsAAUZZXhjaGFuZ2VkUXVvdGVBc3NldEFtb3VudAQKYW1tQmFsYW5jZQkAZQIJAQhjYmFsYW5jZQAFEmxpcXVpZGF0aW9uUGVuYWx0eQQNJHQwNTA2NjM1MDgwNgMJAGYCAAAFCmFtbUJhbGFuY2UJAJQKAgAACQEDYWJzAQUKYW1tQmFsYW5jZQkAlAoCBQphbW1CYWxhbmNlAAAEDW5ld0FtbUJhbGFuY2UIBQ0kdDA1MDY2MzUwODA2Al8xBBF0YWtlRnJvbUluc3VyYW5jZQgFDSR0MDUwNjYzNTA4MDYCXzIEAXgDCQBmAgURdGFrZUZyb21JbnN1cmFuY2UAAAQRd2l0aGRyYXdJbnN1cmFuY2UJAPwHBAkBEGluc3VyYW5jZUFkZHJlc3MAAgh3aXRoZHJhdwkAzAgCBRF0YWtlRnJvbUluc3VyYW5jZQUDbmlsBQNuaWwDCQAAAgURd2l0aGRyYXdJbnN1cmFuY2UFEXdpdGhkcmF3SW5zdXJhbmNlBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4FA25pbAMJAAACBQF4BQF4BAd1bnN0YWtlCQD8BwQJARFxdW90ZUFzc2V0U3Rha2luZwACDnVubG9ja05ldXRyaW5vCQDMCAIJAGUCBRJsaXF1aWRhdGlvblBlbmFsdHkFEXRha2VGcm9tSW5zdXJhbmNlCQDMCAIJANgEAQkBCnF1b3RlQXNzZXQABQNuaWwFA25pbAMJAAACBQd1bnN0YWtlBQd1bnN0YWtlBBBkZXBvc2l0SW5zdXJhbmNlCQD8BwQJARBpbnN1cmFuY2VBZGRyZXNzAAIHZGVwb3NpdAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEKcXVvdGVBc3NldAAFDmZlZVRvSW5zdXJhbmNlBQNuaWwDCQAAAgUQZGVwb3NpdEluc3VyYW5jZQUQZGVwb3NpdEluc3VyYW5jZQQObm90aWZ5Tm90aW9uYWwJAPwHBAkBDG1pbmVyQWRkcmVzcwACDm5vdGlmeU5vdGlvbmFsCQDMCAIFB190cmFkZXIJAMwIAgUXbmV3UG9zaXRpb25PcGVuTm90aW9uYWwFA25pbAUDbmlsAwkAAAIFDm5vdGlmeU5vdGlvbmFsBQ5ub3RpZnlOb3Rpb25hbAkAzggCCQDOCAIJAM4IAgkBDnVwZGF0ZVBvc2l0aW9uBQUHX3RyYWRlcgUPbmV3UG9zaXRpb25TaXplBRFuZXdQb3NpdGlvbk1hcmdpbgUXbmV3UG9zaXRpb25PcGVuTm90aW9uYWwFFG5ld1Bvc2l0aW9uTHN0VXBkQ1BGCQEJdXBkYXRlQW1tBwUWcXVvdGVBc3NldFJlc2VydmVBZnRlcgUVYmFzZUFzc2V0UmVzZXJ2ZUFmdGVyBRZ0b3RhbFBvc2l0aW9uU2l6ZUFmdGVyBRdjdW11bGF0aXZlTm90aW9uYWxBZnRlcgUZb3BlbkludGVyZXN0Tm90aW9uYWxBZnRlcgkAZQIJARV0b3RhbExvbmdQb3NpdGlvblNpemUAAwkAZgIFD25ld1Bvc2l0aW9uU2l6ZQAACQEDYWJzAQUVZXhjaGFuZ2VkUG9zaXRpb25TaXplAAAJAGUCCQEWdG90YWxTaG9ydFBvc2l0aW9uU2l6ZQADCQBmAgAABQ9uZXdQb3NpdGlvblNpemUJAQNhYnMBBRVleGNoYW5nZWRQb3NpdGlvblNpemUAAAkBCHdpdGhkcmF3AggFAWkGY2FsbGVyBQ9mZWVUb0xpcXVpZGF0b3IJAQ11cGRhdGVCYWxhbmNlAQUNbmV3QW1tQmFsYW5jZQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgQNJHQwNTIyNjI1MjcxNwkBFWludGVybmFsQ2xvc2VQb3NpdGlvbgIFB190cmFkZXIHBAJ4MQgFDSR0MDUyMjYyNTI3MTcCXzEEB2JhZERlYnQIBQ0kdDA1MjI2MjUyNzE3Al8yBAJ4MggFDSR0MDUyMjYyNTI3MTcCXzMEAngzCAUNJHQwNTIyNjI1MjcxNwJfNAQWcXVvdGVBc3NldFJlc2VydmVBZnRlcggFDSR0MDUyMjYyNTI3MTcCXzUEFWJhc2VBc3NldFJlc2VydmVBZnRlcggFDSR0MDUyMjYyNTI3MTcCXzYEFnRvdGFsUG9zaXRpb25TaXplQWZ0ZXIIBQ0kdDA1MjI2MjUyNzE3Al83BBdjdW11bGF0aXZlTm90aW9uYWxBZnRlcggFDSR0MDUyMjYyNTI3MTcCXzgEGW9wZW5JbnRlcmVzdE5vdGlvbmFsQWZ0ZXIIBQ0kdDA1MjI2MjUyNzE3Al85BBlleGNoYW5nZWRRdW90ZUFzc2V0QW1vdW50CAUNJHQwNTIyNjI1MjcxNwNfMTAEDnRvdGFsTG9uZ0FmdGVyCAUNJHQwNTIyNjI1MjcxNwNfMTEED3RvdGFsU2hvcnRBZnRlcggFDSR0MDUyMjYyNTI3MTcDXzEyBBJsaXF1aWRhdGlvblBlbmFsdHkJAQRtdWxkAgUZZXhjaGFuZ2VkUXVvdGVBc3NldEFtb3VudAkBE2xpcXVpZGF0aW9uRmVlUmF0aW8ABA9mZWVUb0xpcXVpZGF0b3IJAGkCBRJsaXF1aWRhdGlvblBlbmFsdHkAAgQOZmVlVG9JbnN1cmFuY2UJAGUCBRJsaXF1aWRhdGlvblBlbmFsdHkFD2ZlZVRvTGlxdWlkYXRvcgQKYW1tQmFsYW5jZQkAZQIJAQhjYmFsYW5jZQAFEmxpcXVpZGF0aW9uUGVuYWx0eQQNJHQwNTMxMjk1MzI3MgMJAGYCAAAFCmFtbUJhbGFuY2UJAJQKAgAACQEDYWJzAQUKYW1tQmFsYW5jZQkAlAoCBQphbW1CYWxhbmNlAAAEDW5ld0FtbUJhbGFuY2UIBQ0kdDA1MzEyOTUzMjcyAl8xBBF0YWtlRnJvbUluc3VyYW5jZQgFDSR0MDUzMTI5NTMyNzICXzIEAXgDCQBmAgURdGFrZUZyb21JbnN1cmFuY2UAAAQRd2l0aGRyYXdJbnN1cmFuY2UJAPwHBAkBEGluc3VyYW5jZUFkZHJlc3MAAgh3aXRoZHJhdwkAzAgCBRF0YWtlRnJvbUluc3VyYW5jZQUDbmlsBQNuaWwDCQAAAgURd2l0aGRyYXdJbnN1cmFuY2UFEXdpdGhkcmF3SW5zdXJhbmNlBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4FA25pbAMJAAACBQF4BQF4BAd1bnN0YWtlCQD8BwQJARFxdW90ZUFzc2V0U3Rha2luZwACDnVubG9ja05ldXRyaW5vCQDMCAIJAGUCBRJsaXF1aWRhdGlvblBlbmFsdHkFEXRha2VGcm9tSW5zdXJhbmNlCQDMCAIJANgEAQkBCnF1b3RlQXNzZXQABQNuaWwFA25pbAMJAAACBQd1bnN0YWtlBQd1bnN0YWtlBBBkZXBvc2l0SW5zdXJhbmNlCQD8BwQJARBpbnN1cmFuY2VBZGRyZXNzAAIHZGVwb3NpdAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQEKcXVvdGVBc3NldAAFDmZlZVRvSW5zdXJhbmNlBQNuaWwDCQAAAgUQZGVwb3NpdEluc3VyYW5jZQUQZGVwb3NpdEluc3VyYW5jZQQObm90aWZ5Tm90aW9uYWwJAPwHBAkBDG1pbmVyQWRkcmVzcwACDm5vdGlmeU5vdGlvbmFsCQDMCAIFB190cmFkZXIJAMwIAgAABQNuaWwFA25pbAMJAAACBQ5ub3RpZnlOb3Rpb25hbAUObm90aWZ5Tm90aW9uYWwJAM4IAgkAzggCCQDOCAIJAQ5kZWxldGVQb3NpdGlvbgEFB190cmFkZXIJAQl1cGRhdGVBbW0HBRZxdW90ZUFzc2V0UmVzZXJ2ZUFmdGVyBRViYXNlQXNzZXRSZXNlcnZlQWZ0ZXIFFnRvdGFsUG9zaXRpb25TaXplQWZ0ZXIFF2N1bXVsYXRpdmVOb3Rpb25hbEFmdGVyBRlvcGVuSW50ZXJlc3ROb3Rpb25hbEFmdGVyBQ50b3RhbExvbmdBZnRlcgUPdG90YWxTaG9ydEFmdGVyCQEId2l0aGRyYXcCCAUBaQZjYWxsZXIFD2ZlZVRvTGlxdWlkYXRvcgkBDXVwZGF0ZUJhbGFuY2UBBQ1uZXdBbW1CYWxhbmNlCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCnBheUZ1bmRpbmcABBVmdW5kaW5nQmxvY2tUaW1lc3RhbXAJARluZXh0RnVuZGluZ0Jsb2NrVGltZXN0YW1wAAMDAwkAZgIFFWZ1bmRpbmdCbG9ja1RpbWVzdGFtcAgFCWxhc3RCbG9jawl0aW1lc3RhbXAGCQEBIQEJAQtpbml0aWFsaXplZAAGCQEGcGF1c2VkAAkAAgEJAKwCAgkArAICCQCsAgICIUludmFsaWQgZnVuZGluZyBibG9jayB0aW1lc3RhbXA6IAkApAMBCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAIDIDwgCQCkAwEFFWZ1bmRpbmdCbG9ja1RpbWVzdGFtcAQPdW5kZXJseWluZ1ByaWNlCQESZ2V0T3JhY2xlVHdhcFByaWNlAAQNc3BvdFR3YXBQcmljZQkBEGdldFR3YXBTcG90UHJpY2UABAdwcmVtaXVtCQBlAgUNc3BvdFR3YXBQcmljZQUPdW5kZXJseWluZ1ByaWNlBA0kdDA1NDg2MDU2MTk1AwMJAAACCQEWdG90YWxTaG9ydFBvc2l0aW9uU2l6ZQAAAAYJAAACCQEVdG90YWxMb25nUG9zaXRpb25TaXplAAAACQCUCgIAAAAAAwkAZgIAAAUHcHJlbWl1bQQUc2hvcnRQcmVtaXVtRnJhY3Rpb24JAQRkaXZkAgkBBG11bGQCBQdwcmVtaXVtCQEUZnVuZGluZ1BlcmlvZERlY2ltYWwABQdPTkVfREFZBBNsb25nUHJlbWl1bUZyYWN0aW9uCQEEZGl2ZAIJAQRtdWxkAgUUc2hvcnRQcmVtaXVtRnJhY3Rpb24JARZ0b3RhbFNob3J0UG9zaXRpb25TaXplAAkBFXRvdGFsTG9uZ1Bvc2l0aW9uU2l6ZQAJAJQKAgUUc2hvcnRQcmVtaXVtRnJhY3Rpb24FE2xvbmdQcmVtaXVtRnJhY3Rpb24EE2xvbmdQcmVtaXVtRnJhY3Rpb24JAQRkaXZkAgkBBG11bGQCBQdwcmVtaXVtCQEUZnVuZGluZ1BlcmlvZERlY2ltYWwABQdPTkVfREFZBBRzaG9ydFByZW1pdW1GcmFjdGlvbgkBBGRpdmQCCQEEbXVsZAIFE2xvbmdQcmVtaXVtRnJhY3Rpb24JARV0b3RhbExvbmdQb3NpdGlvblNpemUACQEWdG90YWxTaG9ydFBvc2l0aW9uU2l6ZQAJAJQKAgUUc2hvcnRQcmVtaXVtRnJhY3Rpb24FE2xvbmdQcmVtaXVtRnJhY3Rpb24EFHNob3J0UHJlbWl1bUZyYWN0aW9uCAUNJHQwNTQ4NjA1NjE5NQJfMQQTbG9uZ1ByZW1pdW1GcmFjdGlvbggFDSR0MDU0ODYwNTYxOTUCXzIJAQ11cGRhdGVGdW5kaW5nBQkAZAIFFWZ1bmRpbmdCbG9ja1RpbWVzdGFtcAkBFGZ1bmRpbmdQZXJpb2RTZWNvbmRzAAkAZAIJASNsYXRlc3RMb25nQ3VtdWxhdGl2ZVByZW1pdW1GcmFjdGlvbgAFE2xvbmdQcmVtaXVtRnJhY3Rpb24JAGQCCQEkbGF0ZXN0U2hvcnRDdW11bGF0aXZlUHJlbWl1bUZyYWN0aW9uAAUUc2hvcnRQcmVtaXVtRnJhY3Rpb24JAQRkaXZkAgUTbG9uZ1ByZW1pdW1GcmFjdGlvbgUPdW5kZXJseWluZ1ByaWNlCQEEZGl2ZAIFFHNob3J0UHJlbWl1bUZyYWN0aW9uBQ91bmRlcmx5aW5nUHJpY2UBaQEFdl9nZXQBB190cmFkZXIEDSR0MDU2NTcwNTY2MzAJARVpbnRlcm5hbENsb3NlUG9zaXRpb24CBQdfdHJhZGVyBwQCeDEIBQ0kdDA1NjU3MDU2NjMwAl8xBAJ4MggFDSR0MDU2NTcwNTY2MzACXzIEAngzCAUNJHQwNTY1NzA1NjYzMAJfMwQCeDQIBQ0kdDA1NjU3MDU2NjMwAl80CQACAQkArAICCQCsAgIJAKwCAgkBAXMBBQJ4MgkBAXMBBQJ4MwkBAXMBBQJ4NAkBAXMBCQEOZ2V0TWFyZ2luUmF0aW8BBQdfdHJhZGVyAWkBJ3ZpZXdfY2FsY1JlbWFpbk1hcmdpbldpdGhGdW5kaW5nUGF5bWVudAEHX3RyYWRlcgQNJHQwNTY3Nzc1Njg4OAkBC2dldFBvc2l0aW9uAQUHX3RyYWRlcgQMcG9zaXRpb25TaXplCAUNJHQwNTY3Nzc1Njg4OAJfMQQOcG9zaXRpb25NYXJnaW4IBQ0kdDA1Njc3NzU2ODg4Al8yBANwb24IBQ0kdDA1Njc3NzU2ODg4Al8zBBFwb3NpdGlvbkxzdFVwZENQRggFDSR0MDU2Nzc3NTY4ODgCXzQEDSR0MDU2ODkzNTY5OTQJASNnZXRQb3NpdGlvbk5vdGlvbmFsQW5kVW5yZWFsaXplZFBubAIFB190cmFkZXIFD1BOTF9PUFRJT05fU1BPVAQQcG9zaXRpb25Ob3Rpb25hbAgFDSR0MDU2ODkzNTY5OTQCXzEEDXVucmVhbGl6ZWRQbmwIBQ0kdDA1Njg5MzU2OTk0Al8yBA0kdDA1Njk5OTU3MTgxCQEiY2FsY1JlbWFpbk1hcmdpbldpdGhGdW5kaW5nUGF5bWVudAQFDHBvc2l0aW9uU2l6ZQUOcG9zaXRpb25NYXJnaW4FEXBvc2l0aW9uTHN0VXBkQ1BGBQ11bnJlYWxpemVkUG5sBAxyZW1haW5NYXJnaW4IBQ0kdDA1Njk5OTU3MTgxAl8xBAdiYWREZWJ0CAUNJHQwNTY5OTk1NzE4MQJfMgQOZnVuZGluZ1BheW1lbnQIBQ0kdDA1Njk5OTU3MTgxAl8zCQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAQFzAQUMcmVtYWluTWFyZ2luCQEBcwEFDmZ1bmRpbmdQYXltZW50CQEBcwEJAQ5nZXRNYXJnaW5SYXRpbwEFB190cmFkZXIJAQFzAQUNdW5yZWFsaXplZFBubAkBAXMBBQdiYWREZWJ0CQEBcwEFEHBvc2l0aW9uTm90aW9uYWwBaQEOZm9yY2VNb3ZlQXNzZXQCB190cmFkZXIHX2Ftb3VudAMDCQECIT0CCQCnCAEJAQ5hZG1pblB1YmxpY0tleQAIBQFpBmNhbGxlcgYJAGYCAAAFB19hbW91bnQJAAIBAiFJbnZhbGlkIGZvcmNlTW92ZUFzc2V0IHBhcmFtZXRlcnMEB3Vuc3Rha2UJAPwHBAkBEXF1b3RlQXNzZXRTdGFraW5nAAIOdW5sb2NrTmV1dHJpbm8JAMwIAgUHX2Ftb3VudAkAzAgCCQDYBAEJAQpxdW90ZUFzc2V0AAUDbmlsBQNuaWwDCQAAAgUHdW5zdGFrZQUHdW5zdGFrZQkAzggCCQEId2l0aGRyYXcCCQERQGV4dHJOYXRpdmUoMTA2MikBBQdfdHJhZGVyBQdfYW1vdW50CQENdXBkYXRlQmFsYW5jZQEJAGUCCQEIY2JhbGFuY2UABQdfYW1vdW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQJ0eAEGdmVyaWZ5AAkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAkBDmFkbWluUHVibGljS2V5AMe2r1k=", "height": 2206149, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 5LBJHrHAkQY2P3EdAysM7dRKjEbDiFCgsCFCBs4AWAt5 Next: Emrnxf85FqHxe1TkbvntMWxmPcgemLyVMdYxYnLRP7az Diff:
OldNewDifferences
1-{-# STDLIB_VERSION 5 #-}
1+{-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let a = "k_ora_key"
55
6-let b = "k_ora"
6+let b = "k_ora_block_key"
77
8-let c = "k_balance"
8+let c = "k_ora"
99
10-let d = "k_positionSize"
10+let d = "k_balance"
1111
12-let e = "k_positionMargin"
12+let e = "k_positionSize"
1313
14-let f = "k_positionOpenNotional"
14+let f = "k_positionMargin"
1515
16-let g = "k_positionFraction"
16+let g = "k_positionOpenNotional"
1717
18-let h = "k_initialized"
18+let h = "k_positionFraction"
1919
20-let i = "k_paused"
20+let i = "k_initialized"
2121
22-let j = "k_fee"
22+let j = "k_paused"
2323
24-let k = "k_fundingPeriod"
24+let k = "k_fee"
2525
26-let l = "k_initMarginRatio"
26+let l = "k_fundingPeriod"
2727
28-let m = "k_mmr"
28+let m = "k_initMarginRatio"
2929
30-let n = "k_liquidationFeeRatio"
30+let n = "k_mmr"
3131
32-let o = "k_spreadLimit"
32+let o = "k_liquidationFeeRatio"
3333
34-let p = "k_maxPriceImpact"
34+let p = "k_partLiquidationRatio"
3535
36-let q = "k_lastDataStr"
36+let q = "k_spreadLimit"
3737
38-let r = "k_lastMinuteId"
38+let r = "k_maxPriceImpact"
3939
40-let s = "k_twapDataLastCumulativePrice"
40+let s = "k_maxPriceSpread"
4141
42-let t = "k_twapDataLastPrice"
42+let t = "k_lastDataStr"
4343
44-let u = "k_twap"
44+let u = "k_lastMinuteId"
4545
46-let v = "k_latestLongPremiumFraction"
46+let v = "k_twapDataLastCumulativePrice"
4747
48-let w = "k_latestShortPremiumFraction"
48+let w = "k_twapDataLastPrice"
4949
50-let x = "k_nextFundingBlockMinTimestamp"
50+let x = "k_twapDataPreviousMinuteId"
5151
52-let y = "k_longFundingRate"
52+let y = "k_latestLongPremiumFraction"
5353
54-let z = "k_shortFundingRate"
54+let z = "k_latestShortPremiumFraction"
5555
56-let A = "k_qtAstR"
56+let A = "k_nextFundingBlockMinTimestamp"
5757
58-let B = "k_bsAstR"
58+let B = "k_longFundingRate"
5959
60-let C = "k_totalPositionSize"
60+let C = "k_shortFundingRate"
6161
62-let D = "k_totalLongPositionSize"
62+let D = "k_qtAstR"
6363
64-let E = "k_totalShortPositionSize"
64+let E = "k_bsAstR"
6565
66-let F = "k_cumulativeNotional"
66+let F = "k_totalPositionSize"
6767
68-let G = "k_openInteresetNotional"
68+let G = "k_totalLongPositionSize"
6969
70-let H = "k_coordinatorAddress"
70+let H = "k_totalShortPositionSize"
7171
72-let I = "k_insurance_address"
72+let I = "k_cumulativeNotional"
7373
74-let J = "k_admin_address"
74+let J = "k_openInterestNotional"
7575
76-let K = "k_admin_public_key"
76+let K = "k_coordinatorAddress"
7777
78-let L = "k_quote_asset"
78+let L = "k_insurance_address"
7979
80-let M = "k_quote_staking"
80+let M = "k_admin_address"
8181
82-let N = "k_staking_address"
82+let N = "k_admin_public_key"
8383
84-func O () = valueOrErrorMessage(addressFromString(getStringValue(this, H)), "Coordinator not set")
84+let O = "k_quote_asset"
85+
86+let P = "k_quote_staking"
87+
88+let Q = "k_staking_address"
89+
90+let R = "k_miner_address"
91+
92+func S () = valueOrErrorMessage(addressFromString(getStringValue(this, K)), "Coordinator not set")
8593
8694
87-func P () = addressFromString(getStringValue(O(), J))
95+func T () = addressFromString(getStringValue(S(), M))
8896
8997
90-func Q () = fromBase58String(getStringValue(O(), K))
98+func U () = fromBase58String(getStringValue(S(), N))
9199
92100
93-func R () = fromBase58String(getStringValue(O(), L))
101+func V () = fromBase58String(getStringValue(S(), O))
94102
95103
96-func S () = valueOrErrorMessage(addressFromString(getStringValue(O(), M)), "Quote assete staking not set")
104+func W () = valueOrErrorMessage(addressFromString(getStringValue(S(), P)), "Quote asset staking not set")
97105
98106
99-func T () = valueOrErrorMessage(addressFromString(getStringValue(O(), N)), "Insurance not set")
107+func X () = valueOrErrorMessage(addressFromString(getStringValue(S(), Q)), "Insurance not set")
100108
101109
102-func U () = valueOrErrorMessage(addressFromString(getStringValue(O(), I)), "Insurance not set")
110+func Y () = valueOrErrorMessage(addressFromString(getStringValue(S(), L)), "Insurance not set")
103111
104112
105-let V = 1
106-
107-let W = 2
108-
109-let X = 60
110-
111-let Y = 15
112-
113-let Z = 1000
114-
115-let aa = (1 * (((((10 * 10) * 10) * 10) * 10) * 10))
116-
117-let ab = (86400 * aa)
118-
119-let ac = 100
120-
121-let ad = 1
122-
123-let ae = 2
124-
125-func af (ag) = (toString(ag) + ",")
113+func Z () = valueOrErrorMessage(addressFromString(getStringValue(S(), R)), "Insurance not set")
126114
127115
128-func ah (ag,ai) = fraction(ag, aa, ai, HALFEVEN)
116+let aa = 1
117+
118+let ab = 2
119+
120+let ac = 15
121+
122+let ad = 15
123+
124+let ae = 1000
125+
126+let af = (1 * (((((10 * 10) * 10) * 10) * 10) * 10))
127+
128+let ag = (86400 * af)
129+
130+let ah = 100
131+
132+let ai = 1
133+
134+let aj = 2
135+
136+func ak (al) = (toString(al) + ",")
129137
130138
131-func aj (ag,ai) = fraction(ag, ai, aa, HALFEVEN)
139+func am (al,an) = fraction(al, af, an, HALFEVEN)
132140
133141
134-func ak (ag) = if ((ag > 0))
135- then ag
136- else -(ag)
142+func ao (al,an) = fraction(al, an, af, HALFEVEN)
137143
138144
139-func al (am,an) = ((am + "_") + an)
145+func ap (al) = if ((al > 0))
146+ then al
147+ else -(al)
140148
141149
142-func ao (ap,aq,ar) = {
143- let as = (ap - aq)
144- if (if (ar)
145- then (0 > as)
150+func aq (al,an) = if ((al >= an))
151+ then al
152+ else an
153+
154+
155+func ar (as,at) = ((as + "_") + at)
156+
157+
158+func au (av) = {
159+ func aw (ax,ay) = ((ax + ay) + ",")
160+
161+ let az = {
162+ let aA = av
163+ let aB = size(aA)
164+ let aC = ""
165+ func aD (aE,aF) = if ((aF >= aB))
166+ then aE
167+ else aw(aE, aA[aF])
168+
169+ func aG (aE,aF) = if ((aF >= aB))
170+ then aE
171+ else throw("List size exceeds 20")
172+
173+ aG(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aC, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
174+ }
175+ let aH = dropRight(az, 1)
176+ let aI = if ((take(aH, 1) == ","))
177+ then drop(aH, 1)
178+ else aH
179+ aI
180+ }
181+
182+
183+func aJ (aK) = split(aK, ",")
184+
185+
186+func aL (av,aM,aN) = if ((size(av) > aM))
187+ then (removeByIndex(av, 0) :+ aN)
188+ else (av :+ aN)
189+
190+
191+func aO (aP) = valueOrErrorMessage(getInteger(this, aP), ("no value for " + aP))
192+
193+
194+func aQ () = aO(d)
195+
196+
197+func aR () = aO(k)
198+
199+
200+func aS () = aO(m)
201+
202+
203+func aT () = aO(D)
204+
205+
206+func aU () = aO(E)
207+
208+
209+func aV () = aO(F)
210+
211+
212+func aW () = aO(I)
213+
214+
215+func aX () = aO(J)
216+
217+
218+func aY () = aO(A)
219+
220+
221+func aZ () = aO(l)
222+
223+
224+func ba () = (aZ() * af)
225+
226+
227+func bb () = (aZ() * ae)
228+
229+
230+func bc () = aO(n)
231+
232+
233+func bd () = aO(o)
234+
235+
236+func be () = aO(p)
237+
238+
239+func bf () = aO(q)
240+
241+
242+func bg () = aO(r)
243+
244+
245+func bh () = aO(s)
246+
247+
248+func bi () = aO(y)
249+
250+
251+func bj () = aO(z)
252+
253+
254+func bk () = aO(H)
255+
256+
257+func bl () = aO(G)
258+
259+
260+func bm (bn,bo,bp) = {
261+ let bq = (bn - bo)
262+ if (if (bp)
263+ then (0 > bq)
146264 else false)
147265 then throw("Invalid margin")
148- else if (if (!(ar))
149- then (as >= 0)
266+ else if (if (!(bp))
267+ then (bq >= 0)
150268 else false)
151269 then throw("Invalid margin")
152270 else true
153271 }
154272
155273
156-func at (au) = valueOrErrorMessage(getInteger(this, au), ("no value for " + au))
274+func br (bs) = if ((bs == 0))
275+ then throw("Should not be called with _positionSize == 0")
276+ else if ((bs > 0))
277+ then bi()
278+ else bj()
157279
158280
159-func av () = at(c)
160-
161-
162-func aw () = at(j)
163-
164-
165-func ax () = at(l)
166-
167-
168-func ay () = at(A)
169-
170-
171-func az () = at(B)
172-
173-
174-func aA () = at(C)
175-
176-
177-func aB () = at(F)
178-
179-
180-func aC () = at(G)
181-
182-
183-func aD () = at(x)
184-
185-
186-func aE () = at(k)
187-
188-
189-func aF () = (aE() * aa)
190-
191-
192-func aG () = (aE() * Z)
193-
194-
195-func aH () = at(m)
196-
197-
198-func aI () = at(n)
199-
200-
201-func aJ () = at(o)
202-
203-
204-func aK () = at(p)
205-
206-
207-func aL () = at(v)
208-
209-
210-func aM () = at(w)
211-
212-
213-func aN () = at(E)
214-
215-
216-func aO () = at(D)
217-
218-
219-func aP (aQ) = if ((aQ > 0))
220- then aL()
221- else aM()
222-
223-
224-func aR (aS) = {
225- let aT = getInteger(this, al(d, aS))
226- let aU = aT
227- if ($isInstanceOf(aU, "Int"))
281+func bt (bu) = {
282+ let bv = getInteger(this, ar(e, bu))
283+ let bw = bv
284+ if ($isInstanceOf(bw, "Int"))
228285 then {
229- let aV = aU
230- $Tuple4(aV, getIntegerValue(this, al(e, aS)), getIntegerValue(this, al(f, aS)), getIntegerValue(this, al(g, aS)))
286+ let bx = bw
287+ $Tuple4(bx, getIntegerValue(this, ar(f, bu)), getIntegerValue(this, ar(g, bu)), getIntegerValue(this, ar(h, bu)))
231288 }
232289 else $Tuple4(0, 0, 0, 0)
233290 }
234291
235292
236-func aW (aX) = if ((aR(aX)._1 == 0))
293+func by (bu) = if ((bt(bu)._1 == 0))
237294 then throw("No open position")
238295 else true
239296
240297
241-func aY () = valueOrElse(getBoolean(this, h), false)
298+func bz () = valueOrElse(getBoolean(this, i), false)
242299
243300
244-func aZ () = valueOrElse(getBoolean(this, i), false)
301+func bA () = valueOrElse(getBoolean(this, j), false)
245302
246303
247-func ba (bb,bc,bd) = if (bb)
304+func bB (bC,bD,bE) = if (bC)
248305 then {
249- let be = (az() - bd)
250- if ((0 >= be))
306+ let bF = (aU() - bE)
307+ if ((0 >= bF))
251308 then throw("Tx lead to base asset reserve <= 0, revert")
252- else $Tuple4((ay() + bc), be, (aA() + bd), (aB() + bc))
309+ else $Tuple4((aT() + bD), bF, (aV() + bE), (aW() + bD))
253310 }
254311 else {
255- let bf = (ay() - bc)
256- if ((0 >= bf))
312+ let bG = (aT() - bD)
313+ if ((0 >= bG))
257314 then throw("Tx lead to base quote reserve <= 0, revert")
258- else $Tuple4(bf, (az() + bd), (aA() - bd), (aB() - bc))
315+ else $Tuple4(bG, (aU() + bE), (aV() - bE), (aW() - bD))
259316 }
260317
261318
262-func bg (bb,bc) = {
263- let bh = ay()
264- let bi = az()
265- let bj = ah(bh, bi)
266- let bk = aj(bc, bj)
267- let au = aj(bh, bi)
268- let bl = if (bb)
269- then (bh + bc)
270- else (bh - bc)
271- let bm = ah(au, bl)
272- let bn = ak((bm - bi))
273- let bo = if (bb)
274- then bn
275- else -(bn)
276- let bp = ((bk - bn) / bk)
277- let bq = aK()
278- if ((bp > bq))
279- then throw(((("Price impact " + toString(bp)) + " > max price impact ") + toString(bq)))
319+func bH (bC,bD) = {
320+ let bI = aT()
321+ let bJ = aU()
322+ let aP = ao(bI, bJ)
323+ let bK = if (bC)
324+ then (bI + bD)
325+ else (bI - bD)
326+ let bL = am(aP, bK)
327+ let bM = ap((bL - bJ))
328+ let bN = if (bC)
329+ then bM
330+ else -(bM)
331+ let bO = bB(bC, bD, bM)
332+ let bP = bO._1
333+ let bQ = bO._2
334+ let bR = bO._3
335+ let bS = bO._4
336+ let bT = am(bI, bJ)
337+ let bU = am(bD, bM)
338+ let bV = ap((bT - bU))
339+ let bW = (af - am(bT, (bT + bV)))
340+ let bX = bg()
341+ if ((bW > bX))
342+ then throw(((((((((((((("Price impact " + toString(bW)) + " > max price impact ") + toString(bX)) + " before quote asset: ") + toString(bI)) + " before base asset: ") + toString(bJ)) + " quote asset amount to exchange: ") + toString(bD)) + " price before: ") + toString(bT)) + " marketPrice: ") + toString(bU)))
343+ else $Tuple5(bN, bP, bQ, bR, bS)
344+ }
345+
346+
347+func bY (bZ,ca,cb,cc) = {
348+ let cd = if ((bZ != 0))
349+ then {
350+ let ce = br(bZ)
351+ ao((ce - cb), bZ)
352+ }
353+ else 0
354+ let cf = ((cc - cd) + ca)
355+ let cg = if ((0 > cf))
356+ then $Tuple2(0, ap(cf))
357+ else $Tuple2(ap(cf), 0)
358+ let ch = cg._1
359+ let ci = cg._2
360+ $Tuple3(ch, ci, cd)
361+ }
362+
363+
364+func cj (bC,bE,ck,cl,cm) = {
365+ let bT = am(cl, cm)
366+ if ((bE == 0))
367+ then throw("Invalid base asset amount")
280368 else {
281- let br = ba(bb, bc, bn)
282- let bs = br._1
283- let bt = br._2
284- let bu = br._3
285- let bv = br._4
286- $Tuple5(bo, bs, bt, bu, bv)
369+ let aP = ao(cl, cm)
370+ let cn = if (bC)
371+ then (cm + bE)
372+ else (cm - bE)
373+ let co = am(aP, cn)
374+ let cp = ap((co - cl))
375+ let bX = bg()
376+ let cq = bB(!(bC), cp, bE)
377+ let bP = cq._1
378+ let bQ = cq._2
379+ let bR = cq._3
380+ let bS = cq._4
381+ let bU = am(cp, bE)
382+ let bV = ap((bT - bU))
383+ let bW = (af - am(bT, (bT + bV)))
384+ if (if ((bW > bX))
385+ then ck
386+ else false)
387+ then throw(((((((((((((("Price impact " + toString(bW)) + " > max price impact ") + toString(bX)) + " before quote asset: ") + toString(cl)) + " before base asset: ") + toString(cm)) + " base asset amount to exchange: ") + toString(bE)) + " price before: ") + toString(bT)) + " market price: ") + toString(bU)))
388+ else $Tuple8(cp, bP, bQ, bR, bS, (bl() - (if (bC)
389+ then ap(bE)
390+ else 0)), (bk() - (if (!(bC))
391+ then ap(bE)
392+ else 0)), bW)
287393 }
288394 }
289395
290396
291-func bw (bx,by,bz,bA) = {
292- let bB = aP(bx)
293- let bC = if ((bx != 0))
294- then aj((bB - bz), bx)
295- else 0
296- let bD = ((bA - bC) + by)
297- let bE = if ((0 > bD))
298- then $Tuple2(0, ak(bD))
299- else $Tuple2(ak(bD), 0)
300- let bF = bE._1
301- let bG = bE._2
302- $Tuple4(bF, bG, bC, bB)
397+func cr (bC,bE,ck) = cj(bC, bE, ck, aT(), aU())
398+
399+
400+func cs () = {
401+ let ct = valueOrErrorMessage(addressFromString(getStringValue(this, c)), "")
402+ let cu = getStringValue(this, a)
403+ let cv = getStringValue(this, b)
404+ let cw = valueOrErrorMessage(getInteger(ct, cu), ((("Can not get oracle price. Oracle: " + toString(ct)) + " key: ") + cu))
405+ cw
303406 }
304407
305408
306-func bH (bb,bd,bI,bJ) = if ((bd == 0))
307- then throw("Invalid base asset amount")
308- else {
309- let au = aj(bI, bJ)
310- let bK = if (bb)
311- then (bJ + bd)
312- else (bJ - bd)
313- let bL = ah(au, bK)
314- let bM = ak((bL - bI))
315- let bN = ba(!(bb), bM, bd)
316- let bs = bN._1
317- let bt = bN._2
318- let bu = bN._3
319- let bv = bN._4
320- $Tuple7(bM, bs, bt, bu, bv, (aO() - (if (bb)
321- then ak(bd)
322- else 0)), (aN() - (if (!(bb))
323- then ak(bd)
324- else 0)))
325- }
326-
327-
328-func bO () = {
329- let bP = valueOrErrorMessage(addressFromString(getStringValue(this, b)), "")
330- let bQ = getStringValue(this, a)
331- getIntegerValue(bP, bQ)
409+func cx (cl,cm) = {
410+ let cy = cs()
411+ let cz = am(cl, cm)
412+ let cA = am((cy + cz), (2 * af))
413+ let cB = am(ap((cy - cz)), cA)
414+ if ((cB > bh()))
415+ then throw(((("Price spread " + toString(cB)) + " > max price spread ") + toString(bh())))
416+ else true
332417 }
333418
334419
335-func bR () = {
336- let bh = ay()
337- let bi = az()
338- ah(bh, bi)
420+func cC () = {
421+ let cl = aT()
422+ let cm = aU()
423+ am(cl, cm)
339424 }
340425
341426
342-func bS () = {
343- let bT = bO()
344- let bU = bR()
345- (ah(ak((bT - bU)), bT) > aJ())
427+func cD () = {
428+ let cy = cs()
429+ let cE = cC()
430+ (am(ap((cy - cE)), cy) > bf())
346431 }
347432
348433
349-func bV (aX,bW) = {
350- let bX = aR(aX)
351- let aV = bX._1
352- let bY = bX._2
353- let bZ = bX._3
354- let ca = bX._4
355- let cb = ak(aV)
356- if ((cb == 0))
434+func cF (bs,cG,cl,cm) = {
435+ let cH = ap(bs)
436+ let cI = (0 > bs)
437+ let cJ = if ((cG == ai))
438+ then {
439+ let cK = cj(!(cI), cH, false, cl, cm)
440+ let cL = cK._1
441+ let cM = cK._2
442+ let cN = cK._3
443+ let cO = cK._4
444+ cL
445+ }
446+ else ao(cH, cs())
447+ cJ
448+ }
449+
450+
451+func cP (bu,cG) = {
452+ let cQ = bt(bu)
453+ let bx = cQ._1
454+ let cR = cQ._2
455+ let cS = cQ._3
456+ let cT = cQ._4
457+ if ((bx == 0))
357458 then throw("Invalid position size")
358459 else {
359- let cc = (0 > aV)
360- let cd = if ((bW == ad))
361- then {
362- let ce = bH(!(cc), cb, ay(), az())
363- let cf = ce._1
364- let cg = ce._2
365- let ch = ce._3
366- let ci = ce._4
367- cf
368- }
369- else (cb * bO())
370- let cj = if (cc)
371- then (bZ - cd)
372- else (cd - bZ)
373- $Tuple2(cd, cj)
460+ let cI = (0 > bx)
461+ let cJ = cF(bx, cG, aT(), aU())
462+ let cU = if (cI)
463+ then (cS - cJ)
464+ else (cJ - cS)
465+ $Tuple2(cJ, cU)
374466 }
375467 }
376468
377469
378-func ck (aX,bW) = {
379- func cl () = 0
470+func cV (cW,cX,cY) = am((cW - cX), cY)
380471
381- let cm = aR(aX)
382- let aV = cm._1
383- let bY = cm._2
384- let cn = cm._3
385- let ca = cm._4
386- let co = bV(aX, bW)
387- let cd = co._1
388- let cj = co._2
389- let cp = bw(aV, bY, ca, cj)
390- let bF = cp._1
391- let bG = cp._2
392- ah((bF - bG), cd)
472+
473+func cZ (bu,cG) = {
474+ let da = bt(bu)
475+ let bx = da._1
476+ let cR = da._2
477+ let db = da._3
478+ let cT = da._4
479+ let dc = cP(bu, cG)
480+ let cJ = dc._1
481+ let cU = dc._2
482+ let dd = bY(bx, cR, cT, cU)
483+ let ch = dd._1
484+ let ci = dd._2
485+ cV(ch, ci, cJ)
393486 }
394487
395488
396-func cq (aX) = ck(aX, ad)
489+func de (bu) = cZ(bu, ai)
397490
398491
399-func cr (aX) = {
400- let cs = aR(aX)
401- let aV = cs._1
402- let bY = cs._2
403- let cn = cs._3
404- let ca = cs._4
405- let ct = bV(aX, ad)
406- let cg = ct._1
407- let cj = ct._2
408- let cu = bw(aV, bY, ca, cj)
409- let bF = cu._1
410- let bG = cu._2
411- let ch = cu._3
412- let cv = -(aV)
413- let cw = cj
414- let cx = -(bF)
415- let cy = bH((aV > 0), ak(aV), ay(), az())
416- let cz = cy._1
417- let bl = cy._2
418- let bm = cy._3
419- let cA = cy._4
420- let cB = cy._5
421- let cC = cy._6
422- let cD = cy._7
423- let cE = (aC() - cn)
424- $Tuple12(cv, bG, cw, cx, bl, bm, cA, cB, cE, cz, cC, cD)
425- }
426-
427-
428-func cF () = {
429- let cG = ((lastBlock.timestamp / 1000) / 60)
430- let cH = (cG - Y)
431- let cI = valueOrElse(getString(this, q), "")
432- let cJ = split(cI, ",")
433- func cK (cL,cM) = if ((cH >= parseIntValue(cM)))
434- then (cL :+ parseIntValue(cM))
435- else cL
436-
437- let cN = {
438- let cO = cJ
439- let cP = size(cO)
440- let cQ = nil
441- func cR (cS,cT) = if ((cT >= cP))
442- then cS
443- else cK(cS, cO[cT])
444-
445- func cU (cS,cT) = if ((cT >= cP))
446- then cS
447- else throw("List size exceeds 20")
448-
449- cU(cR(cR(cR(cR(cR(cR(cR(cR(cR(cR(cR(cR(cR(cR(cR(cR(cR(cR(cR(cR(cQ, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
450- }
451- let cV = if ((size(cN) > 0))
452- then max(cN)
453- else parseIntValue(cJ[0])
454- let cW = valueOrElse(getInteger(this, r), 0)
455- let cX = valueOrElse(getInteger(this, ((s + "_") + toString(cW))), 0)
456- let cY = valueOrElse(getInteger(this, ((t + "_") + toString(cW))), 0)
457- let cZ = (cX + ((cG - cW) * cY))
458- let da = valueOrElse(getInteger(this, ((s + "_") + toString(cV))), 0)
459- let db = valueOrElse(getInteger(this, ((t + "_") + toString(cV))), 0)
460- let dc = (da + ((cH - cV) * db))
461- ((cZ - dc) / Y)
462- }
463-
464-
465-func dd (de,df,dg,dh,di,dj,dk) = [IntegerEntry(l, de), IntegerEntry(m, df), IntegerEntry(n, dg), IntegerEntry(k, dh), IntegerEntry(j, di), IntegerEntry(o, dj), IntegerEntry(p, dk)]
466-
467-
468-func dl (dm,dn,do,dp,dq) = [IntegerEntry(x, dm), IntegerEntry(v, dn), IntegerEntry(w, do), IntegerEntry(y, dp), IntegerEntry(z, dq)]
469-
470-
471-func dr (an,ds,dt,du,dv) = [IntegerEntry(al(d, an), ds), IntegerEntry(al(e, an), dt), IntegerEntry(al(f, an), du), IntegerEntry(al(g, an), dv)]
472-
473-
474-func dw (dx) = {
475- let cG = ((lastBlock.timestamp / 1000) / 60)
476- let dy = valueOrElse(getInteger(this, r), 0)
477- if ((dy > cG))
478- then throw("TWAP out-of-order")
492+func df (bu,bs) = {
493+ let dg = aq(be(), (af - am(de(bu), bc())))
494+ let dh = ao(ap(bs), dg)
495+ let di = cr((bs > 0), dh, false)
496+ let dj = di._1
497+ let bW = di._8
498+ if ((bg() > bW))
499+ then dj
479500 else {
480- let cW = if ((dy == 0))
481- then cG
482- else dy
483- let cI = valueOrElse(getString(this, q), "")
484- let dz = split(cI, ",")
485- let cJ = if ((size(dz) > Y))
486- then (removeByIndex(dz, 0) :+ toString(cG))
487- else (dz :+ toString(cG))
488- let dA = valueOrElse(getInteger(this, ((s + "_") + toString(dy))), 0)
489- let dB = valueOrElse(getInteger(this, ((t + "_") + toString(dy))), dx)
490- let dC = (dA + ((cG - cW) * dB))
491- func dD (cL,dE) = ((cL + dE) + ",")
492-
493- let dF = {
494- let cO = cJ
495- let cP = size(cO)
496- let cQ = ""
497- func cR (cS,cT) = if ((cT >= cP))
498- then cS
499- else dD(cS, cO[cT])
500-
501- func cU (cS,cT) = if ((cT >= cP))
502- then cS
503- else throw("List size exceeds 20")
504-
505- cU(cR(cR(cR(cR(cR(cR(cR(cR(cR(cR(cR(cR(cR(cR(cR(cR(cR(cR(cR(cR(cQ, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
506- }
507- let dG = dropRight(dF, 1)
508- let dH = if ((take(dG, 1) == ","))
509- then drop(dG, 1)
510- else dG
511-[IntegerEntry(((s + "_") + toString(cG)), dC), IntegerEntry(((t + "_") + toString(cG)), dx), IntegerEntry(r, cG), StringEntry(q, dH)]
501+ let dk = ao(ap(bs), be())
502+ let dl = cr((bs > 0), dk, false)._1
503+ dl
512504 }
513505 }
514506
515507
516-func dI (bh,bi,dJ,dK,dL,dM,dN) = if (((dM - dN) != dJ))
517- then throw(((((("Invalid AMM state data: " + toString(dM)) + " + ") + toString(dN)) + " != ") + toString(dJ)))
518- else ([IntegerEntry(A, bh), IntegerEntry(B, bi), IntegerEntry(C, dJ), IntegerEntry(F, dK), IntegerEntry(G, dL), IntegerEntry(D, dM), IntegerEntry(E, dN)] ++ dw(ah(bh, bi)))
519-
520-
521-func dO (an) = [DeleteEntry(al(d, an)), DeleteEntry(al(e, an)), DeleteEntry(al(f, an)), DeleteEntry(al(g, an))]
522-
523-
524-func dP (an,dQ) = {
525- let dR = assetBalance(this, R())
526- if ((dQ > dR))
527- then throw(((("Unable to withdraw " + toString(dQ)) + " from contract balance ") + toString(dR)))
528- else [ScriptTransfer(an, dQ, R())]
508+func dm (bu,ck) = {
509+ let dn = bt(bu)
510+ let bx = dn._1
511+ let cR = dn._2
512+ let cS = dn._3
513+ let cT = dn._4
514+ let cU = cP(bu, ai)._2
515+ let do = bY(bx, cR, cT, cU)
516+ let ch = do._1
517+ let ci = do._2
518+ let dk = -(bx)
519+ let dp = cU
520+ let dq = -(ch)
521+ let dr = cr((bx > 0), ap(bx), ck)
522+ let dl = dr._1
523+ let bK = dr._2
524+ let bL = dr._3
525+ let ds = dr._4
526+ let dt = dr._5
527+ let du = dr._6
528+ let dv = dr._7
529+ let dw = (aX() - cS)
530+ $Tuple12(dk, ci, dp, dq, bK, bL, ds, dt, dw, dl, du, dv)
529531 }
530532
531533
532-func dS (dT) = if ((0 > dT))
533- then throw("Balance")
534- else [IntegerEntry(c, dT)]
534+func dx () = {
535+ let dy = ((lastBlock.timestamp / 1000) / 60)
536+ let dz = (dy - ac)
537+ let dA = valueOrElse(getString(this, t), "")
538+ let dB = split(dA, ",")
539+ func dC (ax,dD) = if ((dz >= parseIntValue(dD)))
540+ then (ax :+ parseIntValue(dD))
541+ else ax
542+
543+ let dE = {
544+ let aA = dB
545+ let aB = size(aA)
546+ let aC = nil
547+ func aD (aE,aF) = if ((aF >= aB))
548+ then aE
549+ else dC(aE, aA[aF])
550+
551+ func aG (aE,aF) = if ((aF >= aB))
552+ then aE
553+ else throw("List size exceeds 20")
554+
555+ aG(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aC, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
556+ }
557+ let dF = if ((size(dE) > 0))
558+ then max(dE)
559+ else parseIntValue(dB[0])
560+ let dG = valueOrElse(getInteger(this, u), 0)
561+ let dH = valueOrElse(getInteger(this, ((v + "_") + toString(dG))), 0)
562+ let dI = valueOrElse(getInteger(this, ((w + "_") + toString(dG))), 0)
563+ let dJ = (dH + ((dy - dG) * dI))
564+ let dK = valueOrElse(getInteger(this, ((v + "_") + toString(dF))), 0)
565+ let dL = valueOrElse(getInteger(this, ((w + "_") + toString(dF))), 0)
566+ let dM = (dK + ((dz - dF) * dL))
567+ ((dJ - dM) / ac)
568+ }
535569
536570
537-func dU (dT) = [ScriptTransfer(T(), dT, R())]
571+func dN (dO,dP,dQ,dR,dS,dT,dU,dV,dW) = [IntegerEntry(m, dO), IntegerEntry(n, dP), IntegerEntry(o, dQ), IntegerEntry(l, dR), IntegerEntry(k, dS), IntegerEntry(q, dT), IntegerEntry(r, dU), IntegerEntry(p, dV), IntegerEntry(s, dW)]
538572
539573
540-@Callable(dT)
541-func pause () = if ((dT.caller != P()))
574+func dX (dY,dZ,ea,eb,ec) = [IntegerEntry(A, dY), IntegerEntry(y, dZ), IntegerEntry(z, ea), IntegerEntry(B, eb), IntegerEntry(C, ec)]
575+
576+
577+func ed (at,ee,ef,eg,ce) = [IntegerEntry(ar(e, at), ee), IntegerEntry(ar(f, at), ef), IntegerEntry(ar(g, at), eg), IntegerEntry(ar(h, at), ce)]
578+
579+
580+func eh (ei) = {
581+ let dy = ((lastBlock.timestamp / 1000) / 60)
582+ let ej = valueOrElse(getInteger(this, u), 0)
583+ if ((ej > dy))
584+ then throw("TWAP out-of-order")
585+ else {
586+ let dG = if ((ej == 0))
587+ then dy
588+ else ej
589+ if ((dy > ej))
590+ then {
591+ let ek = valueOrElse(getInteger(this, ((v + "_") + toString(ej))), 0)
592+ let el = valueOrElse(getInteger(this, ((w + "_") + toString(ej))), ei)
593+ let em = (ek + ((dy - dG) * el))
594+ let dB = aL(aJ(valueOrElse(getString(this, t), "")), ac, toString(dy))
595+[IntegerEntry(ar(v, toString(dy)), em), IntegerEntry(ar(w, toString(dy)), ei), IntegerEntry(ar(x, toString(dy)), ej), IntegerEntry(u, dy), StringEntry(t, au(dB))]
596+ }
597+ else {
598+ let en = valueOrElse(getInteger(this, ar(x, toString(dy))), 0)
599+ let ek = valueOrElse(getInteger(this, ar(v, toString(en))), 0)
600+ let el = valueOrElse(getInteger(this, ar(w, toString(en))), ei)
601+ let em = (ek + ((dy - en) * el))
602+[IntegerEntry(ar(v, toString(dy)), em), IntegerEntry(ar(w, toString(dy)), ei)]
603+ }
604+ }
605+ }
606+
607+
608+func eo (bI,bJ) = [IntegerEntry(D, bI), IntegerEntry(E, bJ)]
609+
610+
611+func ep (bI,bJ,eq,er,es,et,eu) = if (((et - eu) != eq))
612+ then throw(((((("Invalid AMM state data: " + toString(et)) + " + ") + toString(eu)) + " != ") + toString(eq)))
613+ else ((eo(bI, bJ) ++ [IntegerEntry(F, eq), IntegerEntry(I, er), IntegerEntry(J, es), IntegerEntry(G, et), IntegerEntry(H, eu)]) ++ eh(am(bI, bJ)))
614+
615+
616+func ev (at) = [DeleteEntry(ar(e, at)), DeleteEntry(ar(f, at)), DeleteEntry(ar(g, at)), DeleteEntry(ar(h, at))]
617+
618+
619+func ew (at,ex) = {
620+ let ey = assetBalance(this, V())
621+ if ((ex > ey))
622+ then throw(((("Unable to withdraw " + toString(ex)) + " from contract balance ") + toString(ey)))
623+ else [ScriptTransfer(at, ex, V())]
624+ }
625+
626+
627+func ez (eA) = if ((0 > eA))
628+ then throw("Balance")
629+ else [IntegerEntry(d, eA)]
630+
631+
632+func eB (eA) = [ScriptTransfer(X(), eA, V())]
633+
634+
635+@Callable(eA)
636+func pause () = if ((eA.caller != T()))
542637 then throw("Invalid togglePause params")
543- else [BooleanEntry(i, true)]
638+ else [BooleanEntry(j, true)]
544639
545640
546641
547-@Callable(dT)
548-func unpause () = if ((dT.caller != P()))
642+@Callable(eA)
643+func unpause () = if ((eA.caller != T()))
549644 then throw("Invalid togglePause params")
550- else [BooleanEntry(i, false)]
645+ else [BooleanEntry(j, false)]
551646
552647
553648
554-@Callable(dT)
555-func changeSettings (de,df,dg,dh,di,dj,dk) = if ((dT.caller != P()))
556- then throw("Invalid changeSettings params")
557- else dd(de, df, dg, dh, di, dj, dk)
558-
559-
560-
561-@Callable(dT)
562-func initialize (bh,bi,dh,de,df,dg,di,dV,dW,dX,dj,dk) = if (if (if (if (if (if (if (if (if (if ((0 >= bh))
649+@Callable(eA)
650+func addLiquidity (bD) = if (if ((eA.caller != T()))
563651 then true
564- else (0 >= bi))
565- then true
566- else (0 >= dh))
567- then true
568- else (0 >= de))
569- then true
570- else (0 >= df))
571- then true
572- else (0 >= dg))
573- then true
574- else (0 >= di))
575- then true
576- else (0 >= dj))
577- then true
578- else (0 >= dk))
579- then true
580- else aY())
581- then throw("Invalid initialize parameters")
582- else ((((dI(bh, bi, 0, 0, 0, 0, 0) ++ dd(de, df, dg, dh, di, dj, dk)) ++ dl((lastBlock.timestamp + dh), 0, 0, 0, 0)) ++ dS(0)) ++ [BooleanEntry(h, true), StringEntry(b, dV), StringEntry(a, dW), StringEntry(H, dX)])
583-
584-
585-
586-@Callable(dT)
587-func decreasePosition (dY,dQ,dZ,ea) = if (if (if (if (if (if (if ((dY != V))
588- then (dY != W)
589- else false)
590- then true
591- else (0 >= dQ))
592- then true
593- else if (((1 * aa) > dZ))
594- then true
595- else (dZ > (3 * aa)))
596- then true
597- else !(aY()))
598- then true
599- else !(ao(ah(aa, dZ), ax(), true)))
600- then true
601- else aZ())
602- then throw("Invalid decreasePosition parameters")
652+ else (0 >= bD))
653+ then throw("Invalid addLiquidity params")
603654 else {
604- let eb = aR(toString(dT.caller))
605- let ec = eb._1
606- let ed = eb._2
607- let ee = eb._3
608- let ef = eb._4
609- let eg = (ec == 0)
610- let eh = if ((ec > 0))
611- then (dY == V)
612- else (dY == W)
613- let ei = if (!(eg))
614- then eh
615- else false
616- let ej = (dY == V)
617- let ek = if (if (eg)
618- then true
619- else ei)
620- then throw("Use increasePosition to open new or increase position")
621- else {
622- let el = aj(dQ, dZ)
623- let em = bV(toString(dT.caller), ad)
624- let en = em._1
625- let cj = em._2
626- if ((en > el))
627- then {
628- let eo = bg(ej, el)
629- let cv = eo._1
630- let bl = eo._2
631- let bm = eo._3
632- let cA = eo._4
633- let cB = eo._5
634- let ep = ak(cv)
635- if (if ((ea != 0))
636- then (ea > ep)
637- else false)
638- then throw(((("Too little basse asset exchanged, got " + toString(ep)) + " expected ") + toString(ea)))
639- else {
640- let cw = if ((ec != 0))
641- then ah(aj(cj, ep), ec)
642- else 0
643- let eq = bw(ec, ed, ef, cw)
644- let bF = eq._1
645- let bG = eq._2
646- let bC = eq._3
647- let er = eq._4
648- let cz = el
649- let es = (cj - cw)
650- let et = if ((ec > 0))
651- then ((en - cz) - es)
652- else ((es + en) - cz)
653- let eu = (ec + cv)
654- $Tuple11(eu, bF, ak(et), er, bm, bl, cA, cB, (aC() - el), (aO() - (if ((eu > 0))
655- then ak(cv)
656- else 0)), (aN() - (if ((0 > eu))
657- then ak(cv)
658- else 0)))
659- }
660- }
661- else throw("Close position first")
662- }
663- let eu = ek._1
664- let ev = ek._2
665- let ew = ek._3
666- let ex = ek._4
667- let bm = ek._5
668- let bl = ek._6
669- let cA = ek._7
670- let cB = ek._8
671- let cE = ek._9
672- let cC = ek._10
673- let cD = ek._11
674- (dr(toString(dT.caller), eu, ev, ew, ex) ++ dI(bl, bm, cA, cB, cE, cC, cD))
655+ let bI = aT()
656+ let bJ = aU()
657+ let ei = am(bI, bJ)
658+ let eC = am(bD, ei)
659+ let eD = (bI + bD)
660+ let eE = (bJ + eC)
661+ eo(eD, eE)
675662 }
676663
677664
678665
679-@Callable(dT)
680-func increasePosition (dY,dZ,ea) = {
681- let ey = dT.payments[0].amount
682- if (if (if (if (if (if (if (if ((dY != V))
683- then (dY != W)
666+@Callable(eA)
667+func removeLiquidity (bD) = if (if ((eA.caller != T()))
668+ then true
669+ else (0 >= bD))
670+ then throw("Invalid removeLiquidity params")
671+ else {
672+ let bI = aT()
673+ let bJ = aU()
674+ let ei = am(bI, bJ)
675+ let eF = am(bD, ei)
676+ let eD = (bI - bD)
677+ let eE = (bJ - eF)
678+ eo(eD, eE)
679+ }
680+
681+
682+
683+@Callable(eA)
684+func changeSettings (dO,dP,dQ,dR,dS,dT,dU,dV,dW) = if ((eA.caller != T()))
685+ then throw("Invalid changeSettings params")
686+ else dN(dO, dP, dQ, dR, dS, dT, dU, dV, dW)
687+
688+
689+
690+@Callable(eA)
691+func initialize (bI,bJ,dR,dO,dP,dQ,dS,eG,eH,eI,dT,dU,dV,dW) = if (if (if (if (if (if (if (if (if (if (if (if ((0 >= bI))
692+ then true
693+ else (0 >= bJ))
694+ then true
695+ else (0 >= dR))
696+ then true
697+ else (0 >= dO))
698+ then true
699+ else (0 >= dP))
700+ then true
701+ else (0 >= dQ))
702+ then true
703+ else (0 >= dS))
704+ then true
705+ else (0 >= dT))
706+ then true
707+ else (0 >= dU))
708+ then true
709+ else (0 >= dV))
710+ then true
711+ else (0 >= dW))
712+ then true
713+ else bz())
714+ then throw("Invalid initialize parameters")
715+ else ((((ep(bI, bJ, 0, 0, 0, 0, 0) ++ dN(dO, dP, dQ, dR, dS, dT, dU, dV, dW)) ++ dX((lastBlock.timestamp + dR), 0, 0, 0, 0)) ++ ez(0)) ++ [BooleanEntry(i, true), StringEntry(c, eG), StringEntry(a, eH), StringEntry(K, eI)])
716+
717+
718+
719+@Callable(eA)
720+func setInitMarginRatio (dO) = if (if ((0 >= dO))
721+ then true
722+ else !(bz()))
723+ then throw("Invalid setInitMarginRatio parameters")
724+ else dN(dO, bc(), bd(), aZ(), aR(), bf(), bg(), be(), bh())
725+
726+
727+
728+@Callable(eA)
729+func decreasePosition (ex,eJ,eK) = if (if (if (if (if ((0 >= ex))
730+ then true
731+ else !(bz()))
732+ then true
733+ else !(bm(am(af, eJ), aS(), true)))
734+ then true
735+ else !(by(toString(eA.caller))))
736+ then true
737+ else bA())
738+ then throw("Invalid decreasePosition parameters")
739+ else {
740+ let eL = bt(toString(eA.caller))
741+ let eM = eL._1
742+ let eN = eL._2
743+ let eO = eL._3
744+ let eP = eL._4
745+ let eQ = if ((eM > 0))
746+ then ab
747+ else aa
748+ let eR = (eQ == aa)
749+ let eS = ao(ex, eJ)
750+ let eT = cP(toString(eA.caller), ai)
751+ let eU = eT._1
752+ let cU = eT._2
753+ let eV = if ((eU > eS))
754+ then {
755+ let eW = bH(eR, eS)
756+ let dk = eW._1
757+ let bK = eW._2
758+ let bL = eW._3
759+ let ds = eW._4
760+ let dt = eW._5
761+ let eX = ap(dk)
762+ if (if ((eK != 0))
763+ then (eK > eX)
764+ else false)
765+ then throw(((("Too little base asset exchanged, got " + toString(eX)) + " expected ") + toString(eK)))
766+ else {
767+ let dp = am(ao(cU, eX), ap(eM))
768+ let eY = bY(eM, eN, eP, dp)
769+ let ch = eY._1
770+ let ci = eY._2
771+ let cd = eY._3
772+ let dl = eS
773+ let eZ = (cU - dp)
774+ let fa = if ((eM > 0))
775+ then ((eU - dl) - eZ)
776+ else ((eZ + eU) - dl)
777+ let fb = (eM + dk)
778+ $Tuple11(fb, ch, ap(fa), br(fb), bL, bK, ds, dt, (aX() - eS), (bl() - (if ((fb > 0))
779+ then ap(dk)
780+ else 0)), (bk() - (if ((0 > fb))
781+ then ap(dk)
782+ else 0)))
783+ }
784+ }
785+ else throw("Close position first")
786+ let fb = eV._1
787+ let fc = eV._2
788+ let fd = eV._3
789+ let fe = eV._4
790+ let bL = eV._5
791+ let bK = eV._6
792+ let ds = eV._7
793+ let dt = eV._8
794+ let dw = eV._9
795+ let du = eV._10
796+ let dv = eV._11
797+ let ff = invoke(Z(), "notifyNotional", [toString(eA.caller), fd], nil)
798+ if ((ff == ff))
799+ then (ed(toString(eA.caller), fb, fc, fd, fe) ++ ep(bK, bL, ds, dt, dw, du, dv))
800+ else throw("Strict value is not equal to itself.")
801+ }
802+
803+
804+
805+@Callable(eA)
806+func increasePosition (eQ,eJ,eK) = {
807+ let fg = eA.payments[0].amount
808+ if (if (if (if (if (if (if ((eQ != aa))
809+ then (eQ != ab)
684810 else false)
685811 then true
686- else (0 >= ey))
812+ else (0 >= fg))
687813 then true
688- else if (((1 * aa) > dZ))
689- then true
690- else (dZ > (3 * aa)))
814+ else !(bz()))
691815 then true
692- else !(aY()))
816+ else (eA.payments[0].assetId != V()))
693817 then true
694- else (dT.payments[0].assetId != R()))
818+ else !(bm(am(af, eJ), aS(), true)))
695819 then true
696- else !(ao(ah(aa, dZ), ax(), true)))
697- then true
698- else aZ())
820+ else bA())
699821 then throw("Invalid increasePosition parameters")
700822 else {
701- let ez = aj(ey, aw())
702- let dQ = (ey - ez)
703- let eA = aR(toString(dT.caller))
704- let ec = eA._1
705- let ed = eA._2
706- let ee = eA._3
707- let ef = eA._4
708- let eg = (ec == 0)
709- let eh = if ((ec > 0))
710- then (dY == V)
711- else (dY == W)
712- let ei = if (!(eg))
713- then eh
823+ let fh = ao(fg, aR())
824+ let ex = (fg - fh)
825+ let fi = bt(toString(eA.caller))
826+ let eM = fi._1
827+ let eN = fi._2
828+ let eO = fi._3
829+ let eP = fi._4
830+ let fj = (eM == 0)
831+ let fk = if ((eM > 0))
832+ then (eQ == aa)
833+ else (eQ == ab)
834+ let fl = if (!(fj))
835+ then fk
714836 else false
715- let ej = (dY == V)
716- let eB = if (if (eg)
837+ let eR = (eQ == aa)
838+ let fm = if (if (fj)
717839 then true
718- else ei)
840+ else fl)
719841 then {
720- let el = aj(dQ, dZ)
721- let eC = bg(ej, el)
722- let bo = eC._1
723- let bl = eC._2
724- let bm = eC._3
725- let cA = eC._4
726- let cB = eC._5
727- if (if ((ea != 0))
728- then (ea > ak(bo))
842+ let eS = ao(ex, eJ)
843+ let fn = bH(eR, eS)
844+ let bN = fn._1
845+ let bK = fn._2
846+ let bL = fn._3
847+ let ds = fn._4
848+ let dt = fn._5
849+ if (if ((eK != 0))
850+ then (eK > ap(bN))
729851 else false)
730- then throw(((("Limit error: " + toString(ak(bo))) + " < ") + toString(ea)))
852+ then throw(((("Limit error: " + toString(ap(bN))) + " < ") + toString(eK)))
731853 else {
732- let eu = (ec + bo)
733- let eD = ah(el, dZ)
734- let eE = bw(ec, ed, ef, eD)
735- let bF = eE._1
736- let cg = eE._2
737- let ch = eE._3
738- let er = eE._4
739- $Tuple11(eu, bF, (ee + el), er, bm, bl, cA, cB, (aC() + el), (aO() + (if ((eu > 0))
740- then ak(bo)
741- else 0)), (aN() + (if ((0 > eu))
742- then ak(bo)
743- else 0)))
854+ let fb = (eM + bN)
855+ let fo = am(eS, eJ)
856+ let fp = bY(eM, eN, eP, fo)
857+ let ch = fp._1
858+ let cM = fp._2
859+ let cN = fp._3
860+ if (!(cx(bK, bL)))
861+ then throw("Over max spread limit")
862+ else $Tuple11(fb, ch, (eO + eS), br(fb), bL, bK, ds, dt, (aX() + eS), (bl() + (if ((fb > 0))
863+ then ap(bN)
864+ else 0)), (bk() + (if ((0 > fb))
865+ then ap(bN)
866+ else 0)))
744867 }
745868 }
746869 else {
747- let el = aj(dQ, dZ)
748- let eF = bV(toString(dT.caller), ad)
749- let en = eF._1
750- let cj = eF._2
751- if ((en > el))
870+ let eS = ao(ex, eJ)
871+ let fq = cP(toString(eA.caller), ai)
872+ let eU = fq._1
873+ let cU = fq._2
874+ if ((eU > eS))
752875 then throw("Use decreasePosition to decrease position size")
753876 else throw("Close position first")
754877 }
755- let eu = eB._1
756- let ev = eB._2
757- let ew = eB._3
758- let ex = eB._4
759- let bm = eB._5
760- let bl = eB._6
761- let cA = eB._7
762- let cB = eB._8
763- let cE = eB._9
764- let cC = eB._10
765- let cD = eB._11
766- let eG = (ez / 2)
767- let eH = (ez - eG)
768- let eI = invoke(S(), "lockNeutrinoSP", [toString(T()), ac], [AttachedPayment(R(), dQ)])
769- if ((eI == eI))
878+ let fb = fm._1
879+ let fc = fm._2
880+ let fd = fm._3
881+ let fe = fm._4
882+ let bL = fm._5
883+ let bK = fm._6
884+ let ds = fm._7
885+ let dt = fm._8
886+ let dw = fm._9
887+ let du = fm._10
888+ let dv = fm._11
889+ let fr = (fh / 2)
890+ let fs = (fh - fr)
891+ let ft = invoke(W(), "lockNeutrinoSP", [toString(X()), ah], [AttachedPayment(V(), ex)])
892+ if ((ft == ft))
770893 then {
771- let eJ = invoke(U(), "deposit", nil, [AttachedPayment(R(), eH)])
772- if ((eJ == eJ))
773- then (((dr(toString(dT.caller), eu, ev, ew, ex) ++ dI(bl, bm, cA, cB, cE, cC, cD)) ++ dU(eG)) ++ dS((av() + dQ)))
894+ let fu = invoke(Y(), "deposit", nil, [AttachedPayment(V(), fs)])
895+ if ((fu == fu))
896+ then {
897+ let fv = invoke(Z(), "notifyFees", [toString(eA.caller), fh], nil)
898+ if ((fv == fv))
899+ then {
900+ let ff = invoke(Z(), "notifyNotional", [toString(eA.caller), fd], nil)
901+ if ((ff == ff))
902+ then (((ed(toString(eA.caller), fb, fc, fd, fe) ++ ep(bK, bL, ds, dt, dw, du, dv)) ++ eB(fr)) ++ ez((aQ() + ex)))
903+ else throw("Strict value is not equal to itself.")
904+ }
905+ else throw("Strict value is not equal to itself.")
906+ }
774907 else throw("Strict value is not equal to itself.")
775908 }
776909 else throw("Strict value is not equal to itself.")
779912
780913
781914
782-@Callable(dT)
915+@Callable(eA)
783916 func addMargin () = {
784- let ey = dT.payments[0].amount
785- if (if (if (if ((dT.payments[0].assetId != R()))
917+ let fg = eA.payments[0].amount
918+ if (if (if (if ((eA.payments[0].assetId != V()))
786919 then true
787- else !(aW(toString(dT.caller))))
920+ else !(by(toString(eA.caller))))
788921 then true
789- else !(aY()))
922+ else !(bz()))
790923 then true
791- else aZ())
924+ else bA())
792925 then throw("Invalid addMargin parameters")
793926 else {
794- let ez = aj(ey, aw())
795- let dQ = (ey - ez)
796- let eK = aR(toString(dT.caller))
797- let ec = eK._1
798- let ed = eK._2
799- let ee = eK._3
800- let ef = eK._4
801- let eG = (ez / 2)
802- let eH = (ez - eG)
803- let eI = invoke(S(), "lockNeutrinoSP", [toString(T()), ac], [AttachedPayment(R(), dQ)])
804- if ((eI == eI))
927+ let fh = ao(fg, aR())
928+ let ex = (fg - fh)
929+ let fw = bt(toString(eA.caller))
930+ let eM = fw._1
931+ let eN = fw._2
932+ let eO = fw._3
933+ let eP = fw._4
934+ let fr = (fh / 2)
935+ let fs = (fh - fr)
936+ let ft = invoke(W(), "lockNeutrinoSP", [toString(X()), ah], [AttachedPayment(V(), ex)])
937+ if ((ft == ft))
805938 then {
806- let eJ = invoke(U(), "deposit", nil, [AttachedPayment(R(), eH)])
807- if ((eJ == eJ))
808- then ((dr(toString(dT.caller), ec, (ed + dQ), ee, ef) ++ dU(eG)) ++ dS((av() + dQ)))
939+ let fu = invoke(Y(), "deposit", nil, [AttachedPayment(V(), fs)])
940+ if ((fu == fu))
941+ then {
942+ let fv = invoke(Z(), "notifyFees", [toString(eA.caller), fh], nil)
943+ if ((fv == fv))
944+ then ((ed(toString(eA.caller), eM, (eN + ex), eO, eP) ++ eB(fr)) ++ ez((aQ() + ex)))
945+ else throw("Strict value is not equal to itself.")
946+ }
809947 else throw("Strict value is not equal to itself.")
810948 }
811949 else throw("Strict value is not equal to itself.")
814952
815953
816954
817-@Callable(dT)
818-func removeMargin (dQ) = if (if (if (if ((0 >= dQ))
955+@Callable(eA)
956+func removeMargin (ex) = if (if (if (if ((0 >= ex))
819957 then true
820- else !(aW(toString(dT.caller))))
958+ else !(by(toString(eA.caller))))
821959 then true
822- else !(aY()))
960+ else !(bz()))
823961 then true
824- else aZ())
962+ else bA())
825963 then throw("Invalid removeMargin parameters")
826964 else {
827- let eL = aR(toString(dT.caller))
828- let ec = eL._1
829- let ed = eL._2
830- let ee = eL._3
831- let ef = eL._4
832- let eM = -(dQ)
833- let eN = bw(ec, ed, ef, eM)
834- let bF = eN._1
835- let bG = eN._2
836- let cg = eN._3
837- let eO = eN._4
838- if ((bG != 0))
839- then throw("Invalid added margin amount")
965+ let fx = bt(toString(eA.caller))
966+ let eM = fx._1
967+ let eN = fx._2
968+ let eO = fx._3
969+ let eP = fx._4
970+ let fy = -(ex)
971+ let fz = bY(eM, eN, eP, fy)
972+ let ch = fz._1
973+ let ci = fz._2
974+ if ((ci != 0))
975+ then throw("Invalid removed margin amount")
840976 else {
841- let eP = invoke(S(), "unlockNeutrino", [dQ, toBase58String(R())], nil)
842- if ((eP == eP))
843- then ((dr(toString(dT.caller), ec, bF, ee, eO) ++ dP(dT.caller, dQ)) ++ dS((av() - dQ)))
844- else throw("Strict value is not equal to itself.")
977+ let fA = cV(ch, ci, eO)
978+ if (!(bm(fA, aS(), true)))
979+ then throw(((("Too much margin removed: " + toString(fA)) + " < ") + toString(aS())))
980+ else {
981+ let fB = invoke(W(), "unlockNeutrino", [ex, toBase58String(V())], nil)
982+ if ((fB == fB))
983+ then ((ed(toString(eA.caller), eM, ch, eO, br(eM)) ++ ew(eA.caller, ex)) ++ ez((aQ() - ex)))
984+ else throw("Strict value is not equal to itself.")
985+ }
845986 }
846987 }
847988
848989
849990
850-@Callable(dT)
851-func closePosition () = if (if (if (!(aW(toString(dT.caller))))
991+@Callable(eA)
992+func closePosition () = if (if (if (!(by(toString(eA.caller))))
852993 then true
853- else !(aY()))
994+ else !(bz()))
854995 then true
855- else aZ())
996+ else bA())
856997 then throw("Invalid closePosition parameters")
857998 else {
858- let eQ = cr(toString(dT.caller))
859- let cg = eQ._1
860- let eR = eQ._2
861- let cw = eQ._3
862- let cx = eQ._4
863- let bl = eQ._5
864- let bm = eQ._6
865- let cA = eQ._7
866- let cB = eQ._8
867- let cE = eQ._9
868- let ch = eQ._10
869- let cC = eQ._11
870- let cD = eQ._12
871- if ((eR > 0))
999+ let fC = dm(toString(eA.caller), true)
1000+ let cM = fC._1
1001+ let fD = fC._2
1002+ let dp = fC._3
1003+ let dq = fC._4
1004+ let bK = fC._5
1005+ let bL = fC._6
1006+ let ds = fC._7
1007+ let dt = fC._8
1008+ let dw = fC._9
1009+ let cN = fC._10
1010+ let du = fC._11
1011+ let dv = fC._12
1012+ if ((fD > 0))
8721013 then throw("Unable to close position with bad debt")
8731014 else {
874- let eS = ak(cx)
875- let eT = (av() - eS)
876- let eU = if ((0 > eT))
877- then $Tuple2(0, ak(eT))
878- else $Tuple2(eT, 0)
879- let eV = eU._1
880- let eW = eU._2
881- let cl = if ((eW > 0))
1015+ let fE = ap(dq)
1016+ let fF = (aQ() - fE)
1017+ let fG = if ((0 > fF))
1018+ then $Tuple2(0, ap(fF))
1019+ else $Tuple2(fF, 0)
1020+ let fH = fG._1
1021+ let fI = fG._2
1022+ let fJ = if ((fI > 0))
8821023 then {
883- let eX = invoke(U(), "withdraw", [eW], nil)
884- if ((eX == eX))
1024+ let fK = invoke(Y(), "withdraw", [fI], nil)
1025+ if ((fK == fK))
8851026 then nil
8861027 else throw("Strict value is not equal to itself.")
8871028 }
8881029 else nil
889- if ((cl == cl))
1030+ if ((fJ == fJ))
8901031 then {
891- let eP = invoke(S(), "unlockNeutrino", [(eS - eW), toBase58String(R())], nil)
892- if ((eP == eP))
893- then (((dO(toString(dT.caller)) ++ dI(bl, bm, cA, cB, cE, cC, cD)) ++ dP(dT.caller, eS)) ++ dS(eV))
1032+ let fB = invoke(W(), "unlockNeutrino", [(fE - fI), toBase58String(V())], nil)
1033+ if ((fB == fB))
1034+ then {
1035+ let ff = invoke(Z(), "notifyNotional", [toString(eA.caller), 0], nil)
1036+ if ((ff == ff))
1037+ then (((ev(toString(eA.caller)) ++ ep(bK, bL, ds, dt, dw, du, dv)) ++ ew(eA.caller, fE)) ++ ez(fH))
1038+ else throw("Strict value is not equal to itself.")
1039+ }
8941040 else throw("Strict value is not equal to itself.")
8951041 }
8961042 else throw("Strict value is not equal to itself.")
8991045
9001046
9011047
902-@Callable(dT)
903-func liquidate (aX) = {
904- let eY = if (bS())
905- then ck(aX, ae)
906- else ck(aX, ad)
907- if (if (if (!(ao(eY, aH(), false)))
1048+@Callable(eA)
1049+func liquidate (bu) = {
1050+ let fL = cZ(bu, ai)
1051+ let fA = if (cD())
1052+ then {
1053+ let fM = cZ(bu, aj)
1054+ aq(fL, fM)
1055+ }
1056+ else fL
1057+ if (if (if (if (!(bm(fA, bc(), false)))
9081058 then true
909- else !(aY()))
1059+ else !(by(bu)))
9101060 then true
911- else aZ())
1061+ else !(bz()))
1062+ then true
1063+ else bA())
9121064 then throw("Unable to liquidate")
1065+ else if (if (if ((fL > bd()))
1066+ then (be() > 0)
1067+ else false)
1068+ then (af > be())
1069+ else false)
1070+ then {
1071+ let fN = bt(bu)
1072+ let eM = fN._1
1073+ let eN = fN._2
1074+ let eO = fN._3
1075+ let eP = fN._4
1076+ let eQ = if ((eM > 0))
1077+ then ab
1078+ else aa
1079+ let eR = (eQ == aa)
1080+ let dl = df(bu, eM)
1081+ let fO = cP(bu, ai)
1082+ let eU = fO._1
1083+ let cU = fO._2
1084+ let fP = bH(eR, dl)
1085+ let dk = fP._1
1086+ let bK = fP._2
1087+ let bL = fP._3
1088+ let ds = fP._4
1089+ let dt = fP._5
1090+ let dp = am(ao(cU, ap(dk)), ap(eM))
1091+ let fQ = bY(eM, eN, eP, dp)
1092+ let ch = fQ._1
1093+ let ci = fQ._2
1094+ let cd = fQ._3
1095+ let eZ = (cU - dp)
1096+ let fa = if ((eM > 0))
1097+ then ((eU - dl) - eZ)
1098+ else ((eZ + eU) - dl)
1099+ let fR = ao(dl, bd())
1100+ let fS = (fR / 2)
1101+ let fs = (fR - fS)
1102+ let fT = (ch - fR)
1103+ let fb = (eM + dk)
1104+ let fd = ap(fa)
1105+ let fU = br(fb)
1106+ let dw = (aX() - dl)
1107+ let fF = (aQ() - fR)
1108+ let fV = if ((0 > fF))
1109+ then $Tuple2(0, ap(fF))
1110+ else $Tuple2(fF, 0)
1111+ let fW = fV._1
1112+ let fX = fV._2
1113+ let fJ = if ((fX > 0))
1114+ then {
1115+ let fK = invoke(Y(), "withdraw", [fX], nil)
1116+ if ((fK == fK))
1117+ then nil
1118+ else throw("Strict value is not equal to itself.")
1119+ }
1120+ else nil
1121+ if ((fJ == fJ))
1122+ then {
1123+ let fB = invoke(W(), "unlockNeutrino", [(fR - fX), toBase58String(V())], nil)
1124+ if ((fB == fB))
1125+ then {
1126+ let fu = invoke(Y(), "deposit", nil, [AttachedPayment(V(), fs)])
1127+ if ((fu == fu))
1128+ then {
1129+ let ff = invoke(Z(), "notifyNotional", [bu, fd], nil)
1130+ if ((ff == ff))
1131+ then (((ed(bu, fb, fT, fd, fU) ++ ep(bK, bL, ds, dt, dw, (bl() - (if ((fb > 0))
1132+ then ap(dk)
1133+ else 0)), (bk() - (if ((0 > fb))
1134+ then ap(dk)
1135+ else 0)))) ++ ew(eA.caller, fS)) ++ ez(fW))
1136+ else throw("Strict value is not equal to itself.")
1137+ }
1138+ else throw("Strict value is not equal to itself.")
1139+ }
1140+ else throw("Strict value is not equal to itself.")
1141+ }
1142+ else throw("Strict value is not equal to itself.")
1143+ }
1144+ else {
1145+ let fY = dm(bu, false)
1146+ let cM = fY._1
1147+ let ci = fY._2
1148+ let cN = fY._3
1149+ let cO = fY._4
1150+ let bK = fY._5
1151+ let bL = fY._6
1152+ let ds = fY._7
1153+ let dt = fY._8
1154+ let dw = fY._9
1155+ let dl = fY._10
1156+ let du = fY._11
1157+ let dv = fY._12
1158+ let fR = ao(dl, bd())
1159+ let fS = (fR / 2)
1160+ let fs = (fR - fS)
1161+ let fF = (aQ() - fR)
1162+ let fZ = if ((0 > fF))
1163+ then $Tuple2(0, ap(fF))
1164+ else $Tuple2(fF, 0)
1165+ let fW = fZ._1
1166+ let fX = fZ._2
1167+ let fJ = if ((fX > 0))
1168+ then {
1169+ let fK = invoke(Y(), "withdraw", [fX], nil)
1170+ if ((fK == fK))
1171+ then nil
1172+ else throw("Strict value is not equal to itself.")
1173+ }
1174+ else nil
1175+ if ((fJ == fJ))
1176+ then {
1177+ let fB = invoke(W(), "unlockNeutrino", [(fR - fX), toBase58String(V())], nil)
1178+ if ((fB == fB))
1179+ then {
1180+ let fu = invoke(Y(), "deposit", nil, [AttachedPayment(V(), fs)])
1181+ if ((fu == fu))
1182+ then {
1183+ let ff = invoke(Z(), "notifyNotional", [bu, 0], nil)
1184+ if ((ff == ff))
1185+ then (((ev(bu) ++ ep(bK, bL, ds, dt, dw, du, dv)) ++ ew(eA.caller, fS)) ++ ez(fW))
1186+ else throw("Strict value is not equal to itself.")
1187+ }
1188+ else throw("Strict value is not equal to itself.")
1189+ }
1190+ else throw("Strict value is not equal to itself.")
1191+ }
1192+ else throw("Strict value is not equal to itself.")
1193+ }
1194+ }
1195+
1196+
1197+
1198+@Callable(eA)
1199+func payFunding () = {
1200+ let ga = aY()
1201+ if (if (if ((ga > lastBlock.timestamp))
1202+ then true
1203+ else !(bz()))
1204+ then true
1205+ else bA())
1206+ then throw(((("Invalid funding block timestamp: " + toString(lastBlock.timestamp)) + " < ") + toString(ga)))
9131207 else {
914- let eZ = cr(aX)
915- let cg = eZ._1
916- let bG = eZ._2
917- let ch = eZ._3
918- let cx = eZ._4
919- let bl = eZ._5
920- let bm = eZ._6
921- let cA = eZ._7
922- let cB = eZ._8
923- let cE = eZ._9
924- let cz = eZ._10
925- let cC = eZ._11
926- let cD = eZ._12
927- let fa = (aj(cz, aI()) / 2)
928- let fb = if ((fa > cx))
929- then $Tuple3((fa - cx), cx, ((bG + fa) - cx))
930- else $Tuple3(0, (cx - fa), bG)
931- let fc = fb._1
932- let bF = fb._2
933- let fd = fb._3
934- let fe = (av() - fa)
935- let ff = if ((0 > fe))
936- then $Tuple2(0, ak(fe))
937- else $Tuple2(fe, 0)
938- let fg = ff._1
939- let fh = ff._2
940- let cl = if ((fh > 0))
941- then {
942- let eX = invoke(U(), "withdraw", [fh], nil)
943- if ((eX == eX))
944- then nil
945- else throw("Strict value is not equal to itself.")
946- }
947- else nil
948- if ((cl == cl))
949- then {
950- let eP = invoke(S(), "unlockNeutrino", [(fa - fh), toBase58String(R())], nil)
951- if ((eP == eP))
952- then (((dO(aX) ++ dI(bl, bm, cA, cB, cE, cC, cD)) ++ dP(dT.caller, fa)) ++ dS(fg))
953- else throw("Strict value is not equal to itself.")
954- }
955- else throw("Strict value is not equal to itself.")
1208+ let gb = cs()
1209+ let gc = dx()
1210+ let gd = (gc - gb)
1211+ let ge = if (if ((bk() == 0))
1212+ then true
1213+ else (bl() == 0))
1214+ then $Tuple2(0, 0)
1215+ else if ((0 > gd))
1216+ then {
1217+ let gf = am(ao(gd, ba()), ag)
1218+ let gg = am(ao(gf, bk()), bl())
1219+ $Tuple2(gf, gg)
1220+ }
1221+ else {
1222+ let gg = am(ao(gd, ba()), ag)
1223+ let gf = am(ao(gg, bl()), bk())
1224+ $Tuple2(gf, gg)
1225+ }
1226+ let gf = ge._1
1227+ let gg = ge._2
1228+ dX((ga + bb()), (bi() + gg), (bj() + gf), am(gg, gb), am(gf, gb))
9561229 }
9571230 }
9581231
9591232
9601233
961-@Callable(dT)
962-func payFunding () = {
963- let fi = aD()
964- if (if (if ((fi > lastBlock.timestamp))
965- then true
966- else !(aY()))
967- then true
968- else aZ())
969- then throw(((("Invalid funding block timestamp: " + toString(lastBlock.timestamp)) + " < ") + toString(fi)))
970- else {
971- let fj = bO()
972- let fk = cF()
973- let fl = (fk - fj)
974- let fm = if (if ((aN() == 0))
975- then true
976- else (aO() == 0))
977- then $Tuple2(0, 0)
978- else if ((0 > fl))
979- then {
980- let fn = ah(aj(fl, aF()), ab)
981- let fo = ah(aj(fn, aN()), aO())
982- $Tuple2(fn, fo)
983- }
984- else {
985- let fo = ah(aj(fl, aF()), ab)
986- let fn = ah(aj(fo, aO()), aN())
987- $Tuple2(fn, fo)
988- }
989- let fn = fm._1
990- let fo = fm._2
991- dl((fi + aG()), (aL() + fo), (aM() + fn), ah(fo, fj), ah(fn, fj))
992- }
1234+@Callable(eA)
1235+func v_get (bu) = {
1236+ let gh = dm(bu, false)
1237+ let cM = gh._1
1238+ let cN = gh._2
1239+ let cO = gh._3
1240+ let gi = gh._4
1241+ throw((((ak(cN) + ak(cO)) + ak(gi)) + ak(de(bu))))
9931242 }
9941243
9951244
9961245
997-@Callable(dT)
998-func v_get (aX) = {
999- let fp = cr(aX)
1000- let cg = fp._1
1001- let ch = fp._2
1002- let ci = fp._3
1003- let fq = fp._4
1004- throw((((af(ch) + af(ci)) + af(fq)) + af(cq(aX))))
1246+@Callable(eA)
1247+func view_calcRemainMarginWithFundingPayment (bu) = {
1248+ let gj = bt(bu)
1249+ let bx = gj._1
1250+ let cR = gj._2
1251+ let db = gj._3
1252+ let cT = gj._4
1253+ let gk = cP(bu, ai)
1254+ let cJ = gk._1
1255+ let cU = gk._2
1256+ let gl = bY(bx, cR, cT, cU)
1257+ let ch = gl._1
1258+ let ci = gl._2
1259+ let cd = gl._3
1260+ throw((((((ak(ch) + ak(cd)) + ak(de(bu))) + ak(cU)) + ak(ci)) + ak(cJ)))
10051261 }
10061262
10071263
10081264
1009-@Callable(dT)
1010-func view_calcRemainMarginWithFundingPayment (aX) = {
1011- let fr = aR(aX)
1012- let aV = fr._1
1013- let bY = fr._2
1014- let cn = fr._3
1015- let ca = fr._4
1016- let fs = bV(aX, ad)
1017- let cd = fs._1
1018- let cj = fs._2
1019- let ft = bw(aV, bY, ca, cj)
1020- let bF = ft._1
1021- let bG = ft._2
1022- let bC = ft._3
1023- throw((af(bF) + af(bC)))
1024- }
1265+@Callable(eA)
1266+func forceMoveAsset (bu,ex) = if (if ((addressFromPublicKey(U()) != eA.caller))
1267+ then true
1268+ else (0 > ex))
1269+ then throw("Invalid forceMoveAsset parameters")
1270+ else {
1271+ let fB = invoke(W(), "unlockNeutrino", [ex, toBase58String(V())], nil)
1272+ if ((fB == fB))
1273+ then (ew(addressFromStringValue(bu), ex) ++ ez((aQ() - ex)))
1274+ else throw("Strict value is not equal to itself.")
1275+ }
10251276
10261277
1027-@Verifier(fu)
1028-func fv () = sigVerify(fu.bodyBytes, fu.proofs[0], Q())
1278+@Verifier(gm)
1279+func gn () = sigVerify(gm.bodyBytes, gm.proofs[0], U())
10291280
Full:
OldNewDifferences
1-{-# STDLIB_VERSION 5 #-}
1+{-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let a = "k_ora_key"
55
6-let b = "k_ora"
6+let b = "k_ora_block_key"
77
8-let c = "k_balance"
8+let c = "k_ora"
99
10-let d = "k_positionSize"
10+let d = "k_balance"
1111
12-let e = "k_positionMargin"
12+let e = "k_positionSize"
1313
14-let f = "k_positionOpenNotional"
14+let f = "k_positionMargin"
1515
16-let g = "k_positionFraction"
16+let g = "k_positionOpenNotional"
1717
18-let h = "k_initialized"
18+let h = "k_positionFraction"
1919
20-let i = "k_paused"
20+let i = "k_initialized"
2121
22-let j = "k_fee"
22+let j = "k_paused"
2323
24-let k = "k_fundingPeriod"
24+let k = "k_fee"
2525
26-let l = "k_initMarginRatio"
26+let l = "k_fundingPeriod"
2727
28-let m = "k_mmr"
28+let m = "k_initMarginRatio"
2929
30-let n = "k_liquidationFeeRatio"
30+let n = "k_mmr"
3131
32-let o = "k_spreadLimit"
32+let o = "k_liquidationFeeRatio"
3333
34-let p = "k_maxPriceImpact"
34+let p = "k_partLiquidationRatio"
3535
36-let q = "k_lastDataStr"
36+let q = "k_spreadLimit"
3737
38-let r = "k_lastMinuteId"
38+let r = "k_maxPriceImpact"
3939
40-let s = "k_twapDataLastCumulativePrice"
40+let s = "k_maxPriceSpread"
4141
42-let t = "k_twapDataLastPrice"
42+let t = "k_lastDataStr"
4343
44-let u = "k_twap"
44+let u = "k_lastMinuteId"
4545
46-let v = "k_latestLongPremiumFraction"
46+let v = "k_twapDataLastCumulativePrice"
4747
48-let w = "k_latestShortPremiumFraction"
48+let w = "k_twapDataLastPrice"
4949
50-let x = "k_nextFundingBlockMinTimestamp"
50+let x = "k_twapDataPreviousMinuteId"
5151
52-let y = "k_longFundingRate"
52+let y = "k_latestLongPremiumFraction"
5353
54-let z = "k_shortFundingRate"
54+let z = "k_latestShortPremiumFraction"
5555
56-let A = "k_qtAstR"
56+let A = "k_nextFundingBlockMinTimestamp"
5757
58-let B = "k_bsAstR"
58+let B = "k_longFundingRate"
5959
60-let C = "k_totalPositionSize"
60+let C = "k_shortFundingRate"
6161
62-let D = "k_totalLongPositionSize"
62+let D = "k_qtAstR"
6363
64-let E = "k_totalShortPositionSize"
64+let E = "k_bsAstR"
6565
66-let F = "k_cumulativeNotional"
66+let F = "k_totalPositionSize"
6767
68-let G = "k_openInteresetNotional"
68+let G = "k_totalLongPositionSize"
6969
70-let H = "k_coordinatorAddress"
70+let H = "k_totalShortPositionSize"
7171
72-let I = "k_insurance_address"
72+let I = "k_cumulativeNotional"
7373
74-let J = "k_admin_address"
74+let J = "k_openInterestNotional"
7575
76-let K = "k_admin_public_key"
76+let K = "k_coordinatorAddress"
7777
78-let L = "k_quote_asset"
78+let L = "k_insurance_address"
7979
80-let M = "k_quote_staking"
80+let M = "k_admin_address"
8181
82-let N = "k_staking_address"
82+let N = "k_admin_public_key"
8383
84-func O () = valueOrErrorMessage(addressFromString(getStringValue(this, H)), "Coordinator not set")
84+let O = "k_quote_asset"
85+
86+let P = "k_quote_staking"
87+
88+let Q = "k_staking_address"
89+
90+let R = "k_miner_address"
91+
92+func S () = valueOrErrorMessage(addressFromString(getStringValue(this, K)), "Coordinator not set")
8593
8694
87-func P () = addressFromString(getStringValue(O(), J))
95+func T () = addressFromString(getStringValue(S(), M))
8896
8997
90-func Q () = fromBase58String(getStringValue(O(), K))
98+func U () = fromBase58String(getStringValue(S(), N))
9199
92100
93-func R () = fromBase58String(getStringValue(O(), L))
101+func V () = fromBase58String(getStringValue(S(), O))
94102
95103
96-func S () = valueOrErrorMessage(addressFromString(getStringValue(O(), M)), "Quote assete staking not set")
104+func W () = valueOrErrorMessage(addressFromString(getStringValue(S(), P)), "Quote asset staking not set")
97105
98106
99-func T () = valueOrErrorMessage(addressFromString(getStringValue(O(), N)), "Insurance not set")
107+func X () = valueOrErrorMessage(addressFromString(getStringValue(S(), Q)), "Insurance not set")
100108
101109
102-func U () = valueOrErrorMessage(addressFromString(getStringValue(O(), I)), "Insurance not set")
110+func Y () = valueOrErrorMessage(addressFromString(getStringValue(S(), L)), "Insurance not set")
103111
104112
105-let V = 1
106-
107-let W = 2
108-
109-let X = 60
110-
111-let Y = 15
112-
113-let Z = 1000
114-
115-let aa = (1 * (((((10 * 10) * 10) * 10) * 10) * 10))
116-
117-let ab = (86400 * aa)
118-
119-let ac = 100
120-
121-let ad = 1
122-
123-let ae = 2
124-
125-func af (ag) = (toString(ag) + ",")
113+func Z () = valueOrErrorMessage(addressFromString(getStringValue(S(), R)), "Insurance not set")
126114
127115
128-func ah (ag,ai) = fraction(ag, aa, ai, HALFEVEN)
116+let aa = 1
117+
118+let ab = 2
119+
120+let ac = 15
121+
122+let ad = 15
123+
124+let ae = 1000
125+
126+let af = (1 * (((((10 * 10) * 10) * 10) * 10) * 10))
127+
128+let ag = (86400 * af)
129+
130+let ah = 100
131+
132+let ai = 1
133+
134+let aj = 2
135+
136+func ak (al) = (toString(al) + ",")
129137
130138
131-func aj (ag,ai) = fraction(ag, ai, aa, HALFEVEN)
139+func am (al,an) = fraction(al, af, an, HALFEVEN)
132140
133141
134-func ak (ag) = if ((ag > 0))
135- then ag
136- else -(ag)
142+func ao (al,an) = fraction(al, an, af, HALFEVEN)
137143
138144
139-func al (am,an) = ((am + "_") + an)
145+func ap (al) = if ((al > 0))
146+ then al
147+ else -(al)
140148
141149
142-func ao (ap,aq,ar) = {
143- let as = (ap - aq)
144- if (if (ar)
145- then (0 > as)
150+func aq (al,an) = if ((al >= an))
151+ then al
152+ else an
153+
154+
155+func ar (as,at) = ((as + "_") + at)
156+
157+
158+func au (av) = {
159+ func aw (ax,ay) = ((ax + ay) + ",")
160+
161+ let az = {
162+ let aA = av
163+ let aB = size(aA)
164+ let aC = ""
165+ func aD (aE,aF) = if ((aF >= aB))
166+ then aE
167+ else aw(aE, aA[aF])
168+
169+ func aG (aE,aF) = if ((aF >= aB))
170+ then aE
171+ else throw("List size exceeds 20")
172+
173+ aG(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aC, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
174+ }
175+ let aH = dropRight(az, 1)
176+ let aI = if ((take(aH, 1) == ","))
177+ then drop(aH, 1)
178+ else aH
179+ aI
180+ }
181+
182+
183+func aJ (aK) = split(aK, ",")
184+
185+
186+func aL (av,aM,aN) = if ((size(av) > aM))
187+ then (removeByIndex(av, 0) :+ aN)
188+ else (av :+ aN)
189+
190+
191+func aO (aP) = valueOrErrorMessage(getInteger(this, aP), ("no value for " + aP))
192+
193+
194+func aQ () = aO(d)
195+
196+
197+func aR () = aO(k)
198+
199+
200+func aS () = aO(m)
201+
202+
203+func aT () = aO(D)
204+
205+
206+func aU () = aO(E)
207+
208+
209+func aV () = aO(F)
210+
211+
212+func aW () = aO(I)
213+
214+
215+func aX () = aO(J)
216+
217+
218+func aY () = aO(A)
219+
220+
221+func aZ () = aO(l)
222+
223+
224+func ba () = (aZ() * af)
225+
226+
227+func bb () = (aZ() * ae)
228+
229+
230+func bc () = aO(n)
231+
232+
233+func bd () = aO(o)
234+
235+
236+func be () = aO(p)
237+
238+
239+func bf () = aO(q)
240+
241+
242+func bg () = aO(r)
243+
244+
245+func bh () = aO(s)
246+
247+
248+func bi () = aO(y)
249+
250+
251+func bj () = aO(z)
252+
253+
254+func bk () = aO(H)
255+
256+
257+func bl () = aO(G)
258+
259+
260+func bm (bn,bo,bp) = {
261+ let bq = (bn - bo)
262+ if (if (bp)
263+ then (0 > bq)
146264 else false)
147265 then throw("Invalid margin")
148- else if (if (!(ar))
149- then (as >= 0)
266+ else if (if (!(bp))
267+ then (bq >= 0)
150268 else false)
151269 then throw("Invalid margin")
152270 else true
153271 }
154272
155273
156-func at (au) = valueOrErrorMessage(getInteger(this, au), ("no value for " + au))
274+func br (bs) = if ((bs == 0))
275+ then throw("Should not be called with _positionSize == 0")
276+ else if ((bs > 0))
277+ then bi()
278+ else bj()
157279
158280
159-func av () = at(c)
160-
161-
162-func aw () = at(j)
163-
164-
165-func ax () = at(l)
166-
167-
168-func ay () = at(A)
169-
170-
171-func az () = at(B)
172-
173-
174-func aA () = at(C)
175-
176-
177-func aB () = at(F)
178-
179-
180-func aC () = at(G)
181-
182-
183-func aD () = at(x)
184-
185-
186-func aE () = at(k)
187-
188-
189-func aF () = (aE() * aa)
190-
191-
192-func aG () = (aE() * Z)
193-
194-
195-func aH () = at(m)
196-
197-
198-func aI () = at(n)
199-
200-
201-func aJ () = at(o)
202-
203-
204-func aK () = at(p)
205-
206-
207-func aL () = at(v)
208-
209-
210-func aM () = at(w)
211-
212-
213-func aN () = at(E)
214-
215-
216-func aO () = at(D)
217-
218-
219-func aP (aQ) = if ((aQ > 0))
220- then aL()
221- else aM()
222-
223-
224-func aR (aS) = {
225- let aT = getInteger(this, al(d, aS))
226- let aU = aT
227- if ($isInstanceOf(aU, "Int"))
281+func bt (bu) = {
282+ let bv = getInteger(this, ar(e, bu))
283+ let bw = bv
284+ if ($isInstanceOf(bw, "Int"))
228285 then {
229- let aV = aU
230- $Tuple4(aV, getIntegerValue(this, al(e, aS)), getIntegerValue(this, al(f, aS)), getIntegerValue(this, al(g, aS)))
286+ let bx = bw
287+ $Tuple4(bx, getIntegerValue(this, ar(f, bu)), getIntegerValue(this, ar(g, bu)), getIntegerValue(this, ar(h, bu)))
231288 }
232289 else $Tuple4(0, 0, 0, 0)
233290 }
234291
235292
236-func aW (aX) = if ((aR(aX)._1 == 0))
293+func by (bu) = if ((bt(bu)._1 == 0))
237294 then throw("No open position")
238295 else true
239296
240297
241-func aY () = valueOrElse(getBoolean(this, h), false)
298+func bz () = valueOrElse(getBoolean(this, i), false)
242299
243300
244-func aZ () = valueOrElse(getBoolean(this, i), false)
301+func bA () = valueOrElse(getBoolean(this, j), false)
245302
246303
247-func ba (bb,bc,bd) = if (bb)
304+func bB (bC,bD,bE) = if (bC)
248305 then {
249- let be = (az() - bd)
250- if ((0 >= be))
306+ let bF = (aU() - bE)
307+ if ((0 >= bF))
251308 then throw("Tx lead to base asset reserve <= 0, revert")
252- else $Tuple4((ay() + bc), be, (aA() + bd), (aB() + bc))
309+ else $Tuple4((aT() + bD), bF, (aV() + bE), (aW() + bD))
253310 }
254311 else {
255- let bf = (ay() - bc)
256- if ((0 >= bf))
312+ let bG = (aT() - bD)
313+ if ((0 >= bG))
257314 then throw("Tx lead to base quote reserve <= 0, revert")
258- else $Tuple4(bf, (az() + bd), (aA() - bd), (aB() - bc))
315+ else $Tuple4(bG, (aU() + bE), (aV() - bE), (aW() - bD))
259316 }
260317
261318
262-func bg (bb,bc) = {
263- let bh = ay()
264- let bi = az()
265- let bj = ah(bh, bi)
266- let bk = aj(bc, bj)
267- let au = aj(bh, bi)
268- let bl = if (bb)
269- then (bh + bc)
270- else (bh - bc)
271- let bm = ah(au, bl)
272- let bn = ak((bm - bi))
273- let bo = if (bb)
274- then bn
275- else -(bn)
276- let bp = ((bk - bn) / bk)
277- let bq = aK()
278- if ((bp > bq))
279- then throw(((("Price impact " + toString(bp)) + " > max price impact ") + toString(bq)))
319+func bH (bC,bD) = {
320+ let bI = aT()
321+ let bJ = aU()
322+ let aP = ao(bI, bJ)
323+ let bK = if (bC)
324+ then (bI + bD)
325+ else (bI - bD)
326+ let bL = am(aP, bK)
327+ let bM = ap((bL - bJ))
328+ let bN = if (bC)
329+ then bM
330+ else -(bM)
331+ let bO = bB(bC, bD, bM)
332+ let bP = bO._1
333+ let bQ = bO._2
334+ let bR = bO._3
335+ let bS = bO._4
336+ let bT = am(bI, bJ)
337+ let bU = am(bD, bM)
338+ let bV = ap((bT - bU))
339+ let bW = (af - am(bT, (bT + bV)))
340+ let bX = bg()
341+ if ((bW > bX))
342+ then throw(((((((((((((("Price impact " + toString(bW)) + " > max price impact ") + toString(bX)) + " before quote asset: ") + toString(bI)) + " before base asset: ") + toString(bJ)) + " quote asset amount to exchange: ") + toString(bD)) + " price before: ") + toString(bT)) + " marketPrice: ") + toString(bU)))
343+ else $Tuple5(bN, bP, bQ, bR, bS)
344+ }
345+
346+
347+func bY (bZ,ca,cb,cc) = {
348+ let cd = if ((bZ != 0))
349+ then {
350+ let ce = br(bZ)
351+ ao((ce - cb), bZ)
352+ }
353+ else 0
354+ let cf = ((cc - cd) + ca)
355+ let cg = if ((0 > cf))
356+ then $Tuple2(0, ap(cf))
357+ else $Tuple2(ap(cf), 0)
358+ let ch = cg._1
359+ let ci = cg._2
360+ $Tuple3(ch, ci, cd)
361+ }
362+
363+
364+func cj (bC,bE,ck,cl,cm) = {
365+ let bT = am(cl, cm)
366+ if ((bE == 0))
367+ then throw("Invalid base asset amount")
280368 else {
281- let br = ba(bb, bc, bn)
282- let bs = br._1
283- let bt = br._2
284- let bu = br._3
285- let bv = br._4
286- $Tuple5(bo, bs, bt, bu, bv)
369+ let aP = ao(cl, cm)
370+ let cn = if (bC)
371+ then (cm + bE)
372+ else (cm - bE)
373+ let co = am(aP, cn)
374+ let cp = ap((co - cl))
375+ let bX = bg()
376+ let cq = bB(!(bC), cp, bE)
377+ let bP = cq._1
378+ let bQ = cq._2
379+ let bR = cq._3
380+ let bS = cq._4
381+ let bU = am(cp, bE)
382+ let bV = ap((bT - bU))
383+ let bW = (af - am(bT, (bT + bV)))
384+ if (if ((bW > bX))
385+ then ck
386+ else false)
387+ then throw(((((((((((((("Price impact " + toString(bW)) + " > max price impact ") + toString(bX)) + " before quote asset: ") + toString(cl)) + " before base asset: ") + toString(cm)) + " base asset amount to exchange: ") + toString(bE)) + " price before: ") + toString(bT)) + " market price: ") + toString(bU)))
388+ else $Tuple8(cp, bP, bQ, bR, bS, (bl() - (if (bC)
389+ then ap(bE)
390+ else 0)), (bk() - (if (!(bC))
391+ then ap(bE)
392+ else 0)), bW)
287393 }
288394 }
289395
290396
291-func bw (bx,by,bz,bA) = {
292- let bB = aP(bx)
293- let bC = if ((bx != 0))
294- then aj((bB - bz), bx)
295- else 0
296- let bD = ((bA - bC) + by)
297- let bE = if ((0 > bD))
298- then $Tuple2(0, ak(bD))
299- else $Tuple2(ak(bD), 0)
300- let bF = bE._1
301- let bG = bE._2
302- $Tuple4(bF, bG, bC, bB)
397+func cr (bC,bE,ck) = cj(bC, bE, ck, aT(), aU())
398+
399+
400+func cs () = {
401+ let ct = valueOrErrorMessage(addressFromString(getStringValue(this, c)), "")
402+ let cu = getStringValue(this, a)
403+ let cv = getStringValue(this, b)
404+ let cw = valueOrErrorMessage(getInteger(ct, cu), ((("Can not get oracle price. Oracle: " + toString(ct)) + " key: ") + cu))
405+ cw
303406 }
304407
305408
306-func bH (bb,bd,bI,bJ) = if ((bd == 0))
307- then throw("Invalid base asset amount")
308- else {
309- let au = aj(bI, bJ)
310- let bK = if (bb)
311- then (bJ + bd)
312- else (bJ - bd)
313- let bL = ah(au, bK)
314- let bM = ak((bL - bI))
315- let bN = ba(!(bb), bM, bd)
316- let bs = bN._1
317- let bt = bN._2
318- let bu = bN._3
319- let bv = bN._4
320- $Tuple7(bM, bs, bt, bu, bv, (aO() - (if (bb)
321- then ak(bd)
322- else 0)), (aN() - (if (!(bb))
323- then ak(bd)
324- else 0)))
325- }
326-
327-
328-func bO () = {
329- let bP = valueOrErrorMessage(addressFromString(getStringValue(this, b)), "")
330- let bQ = getStringValue(this, a)
331- getIntegerValue(bP, bQ)
409+func cx (cl,cm) = {
410+ let cy = cs()
411+ let cz = am(cl, cm)
412+ let cA = am((cy + cz), (2 * af))
413+ let cB = am(ap((cy - cz)), cA)
414+ if ((cB > bh()))
415+ then throw(((("Price spread " + toString(cB)) + " > max price spread ") + toString(bh())))
416+ else true
332417 }
333418
334419
335-func bR () = {
336- let bh = ay()
337- let bi = az()
338- ah(bh, bi)
420+func cC () = {
421+ let cl = aT()
422+ let cm = aU()
423+ am(cl, cm)
339424 }
340425
341426
342-func bS () = {
343- let bT = bO()
344- let bU = bR()
345- (ah(ak((bT - bU)), bT) > aJ())
427+func cD () = {
428+ let cy = cs()
429+ let cE = cC()
430+ (am(ap((cy - cE)), cy) > bf())
346431 }
347432
348433
349-func bV (aX,bW) = {
350- let bX = aR(aX)
351- let aV = bX._1
352- let bY = bX._2
353- let bZ = bX._3
354- let ca = bX._4
355- let cb = ak(aV)
356- if ((cb == 0))
434+func cF (bs,cG,cl,cm) = {
435+ let cH = ap(bs)
436+ let cI = (0 > bs)
437+ let cJ = if ((cG == ai))
438+ then {
439+ let cK = cj(!(cI), cH, false, cl, cm)
440+ let cL = cK._1
441+ let cM = cK._2
442+ let cN = cK._3
443+ let cO = cK._4
444+ cL
445+ }
446+ else ao(cH, cs())
447+ cJ
448+ }
449+
450+
451+func cP (bu,cG) = {
452+ let cQ = bt(bu)
453+ let bx = cQ._1
454+ let cR = cQ._2
455+ let cS = cQ._3
456+ let cT = cQ._4
457+ if ((bx == 0))
357458 then throw("Invalid position size")
358459 else {
359- let cc = (0 > aV)
360- let cd = if ((bW == ad))
361- then {
362- let ce = bH(!(cc), cb, ay(), az())
363- let cf = ce._1
364- let cg = ce._2
365- let ch = ce._3
366- let ci = ce._4
367- cf
368- }
369- else (cb * bO())
370- let cj = if (cc)
371- then (bZ - cd)
372- else (cd - bZ)
373- $Tuple2(cd, cj)
460+ let cI = (0 > bx)
461+ let cJ = cF(bx, cG, aT(), aU())
462+ let cU = if (cI)
463+ then (cS - cJ)
464+ else (cJ - cS)
465+ $Tuple2(cJ, cU)
374466 }
375467 }
376468
377469
378-func ck (aX,bW) = {
379- func cl () = 0
470+func cV (cW,cX,cY) = am((cW - cX), cY)
380471
381- let cm = aR(aX)
382- let aV = cm._1
383- let bY = cm._2
384- let cn = cm._3
385- let ca = cm._4
386- let co = bV(aX, bW)
387- let cd = co._1
388- let cj = co._2
389- let cp = bw(aV, bY, ca, cj)
390- let bF = cp._1
391- let bG = cp._2
392- ah((bF - bG), cd)
472+
473+func cZ (bu,cG) = {
474+ let da = bt(bu)
475+ let bx = da._1
476+ let cR = da._2
477+ let db = da._3
478+ let cT = da._4
479+ let dc = cP(bu, cG)
480+ let cJ = dc._1
481+ let cU = dc._2
482+ let dd = bY(bx, cR, cT, cU)
483+ let ch = dd._1
484+ let ci = dd._2
485+ cV(ch, ci, cJ)
393486 }
394487
395488
396-func cq (aX) = ck(aX, ad)
489+func de (bu) = cZ(bu, ai)
397490
398491
399-func cr (aX) = {
400- let cs = aR(aX)
401- let aV = cs._1
402- let bY = cs._2
403- let cn = cs._3
404- let ca = cs._4
405- let ct = bV(aX, ad)
406- let cg = ct._1
407- let cj = ct._2
408- let cu = bw(aV, bY, ca, cj)
409- let bF = cu._1
410- let bG = cu._2
411- let ch = cu._3
412- let cv = -(aV)
413- let cw = cj
414- let cx = -(bF)
415- let cy = bH((aV > 0), ak(aV), ay(), az())
416- let cz = cy._1
417- let bl = cy._2
418- let bm = cy._3
419- let cA = cy._4
420- let cB = cy._5
421- let cC = cy._6
422- let cD = cy._7
423- let cE = (aC() - cn)
424- $Tuple12(cv, bG, cw, cx, bl, bm, cA, cB, cE, cz, cC, cD)
425- }
426-
427-
428-func cF () = {
429- let cG = ((lastBlock.timestamp / 1000) / 60)
430- let cH = (cG - Y)
431- let cI = valueOrElse(getString(this, q), "")
432- let cJ = split(cI, ",")
433- func cK (cL,cM) = if ((cH >= parseIntValue(cM)))
434- then (cL :+ parseIntValue(cM))
435- else cL
436-
437- let cN = {
438- let cO = cJ
439- let cP = size(cO)
440- let cQ = nil
441- func cR (cS,cT) = if ((cT >= cP))
442- then cS
443- else cK(cS, cO[cT])
444-
445- func cU (cS,cT) = if ((cT >= cP))
446- then cS
447- else throw("List size exceeds 20")
448-
449- cU(cR(cR(cR(cR(cR(cR(cR(cR(cR(cR(cR(cR(cR(cR(cR(cR(cR(cR(cR(cR(cQ, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
450- }
451- let cV = if ((size(cN) > 0))
452- then max(cN)
453- else parseIntValue(cJ[0])
454- let cW = valueOrElse(getInteger(this, r), 0)
455- let cX = valueOrElse(getInteger(this, ((s + "_") + toString(cW))), 0)
456- let cY = valueOrElse(getInteger(this, ((t + "_") + toString(cW))), 0)
457- let cZ = (cX + ((cG - cW) * cY))
458- let da = valueOrElse(getInteger(this, ((s + "_") + toString(cV))), 0)
459- let db = valueOrElse(getInteger(this, ((t + "_") + toString(cV))), 0)
460- let dc = (da + ((cH - cV) * db))
461- ((cZ - dc) / Y)
462- }
463-
464-
465-func dd (de,df,dg,dh,di,dj,dk) = [IntegerEntry(l, de), IntegerEntry(m, df), IntegerEntry(n, dg), IntegerEntry(k, dh), IntegerEntry(j, di), IntegerEntry(o, dj), IntegerEntry(p, dk)]
466-
467-
468-func dl (dm,dn,do,dp,dq) = [IntegerEntry(x, dm), IntegerEntry(v, dn), IntegerEntry(w, do), IntegerEntry(y, dp), IntegerEntry(z, dq)]
469-
470-
471-func dr (an,ds,dt,du,dv) = [IntegerEntry(al(d, an), ds), IntegerEntry(al(e, an), dt), IntegerEntry(al(f, an), du), IntegerEntry(al(g, an), dv)]
472-
473-
474-func dw (dx) = {
475- let cG = ((lastBlock.timestamp / 1000) / 60)
476- let dy = valueOrElse(getInteger(this, r), 0)
477- if ((dy > cG))
478- then throw("TWAP out-of-order")
492+func df (bu,bs) = {
493+ let dg = aq(be(), (af - am(de(bu), bc())))
494+ let dh = ao(ap(bs), dg)
495+ let di = cr((bs > 0), dh, false)
496+ let dj = di._1
497+ let bW = di._8
498+ if ((bg() > bW))
499+ then dj
479500 else {
480- let cW = if ((dy == 0))
481- then cG
482- else dy
483- let cI = valueOrElse(getString(this, q), "")
484- let dz = split(cI, ",")
485- let cJ = if ((size(dz) > Y))
486- then (removeByIndex(dz, 0) :+ toString(cG))
487- else (dz :+ toString(cG))
488- let dA = valueOrElse(getInteger(this, ((s + "_") + toString(dy))), 0)
489- let dB = valueOrElse(getInteger(this, ((t + "_") + toString(dy))), dx)
490- let dC = (dA + ((cG - cW) * dB))
491- func dD (cL,dE) = ((cL + dE) + ",")
492-
493- let dF = {
494- let cO = cJ
495- let cP = size(cO)
496- let cQ = ""
497- func cR (cS,cT) = if ((cT >= cP))
498- then cS
499- else dD(cS, cO[cT])
500-
501- func cU (cS,cT) = if ((cT >= cP))
502- then cS
503- else throw("List size exceeds 20")
504-
505- cU(cR(cR(cR(cR(cR(cR(cR(cR(cR(cR(cR(cR(cR(cR(cR(cR(cR(cR(cR(cR(cQ, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
506- }
507- let dG = dropRight(dF, 1)
508- let dH = if ((take(dG, 1) == ","))
509- then drop(dG, 1)
510- else dG
511-[IntegerEntry(((s + "_") + toString(cG)), dC), IntegerEntry(((t + "_") + toString(cG)), dx), IntegerEntry(r, cG), StringEntry(q, dH)]
501+ let dk = ao(ap(bs), be())
502+ let dl = cr((bs > 0), dk, false)._1
503+ dl
512504 }
513505 }
514506
515507
516-func dI (bh,bi,dJ,dK,dL,dM,dN) = if (((dM - dN) != dJ))
517- then throw(((((("Invalid AMM state data: " + toString(dM)) + " + ") + toString(dN)) + " != ") + toString(dJ)))
518- else ([IntegerEntry(A, bh), IntegerEntry(B, bi), IntegerEntry(C, dJ), IntegerEntry(F, dK), IntegerEntry(G, dL), IntegerEntry(D, dM), IntegerEntry(E, dN)] ++ dw(ah(bh, bi)))
519-
520-
521-func dO (an) = [DeleteEntry(al(d, an)), DeleteEntry(al(e, an)), DeleteEntry(al(f, an)), DeleteEntry(al(g, an))]
522-
523-
524-func dP (an,dQ) = {
525- let dR = assetBalance(this, R())
526- if ((dQ > dR))
527- then throw(((("Unable to withdraw " + toString(dQ)) + " from contract balance ") + toString(dR)))
528- else [ScriptTransfer(an, dQ, R())]
508+func dm (bu,ck) = {
509+ let dn = bt(bu)
510+ let bx = dn._1
511+ let cR = dn._2
512+ let cS = dn._3
513+ let cT = dn._4
514+ let cU = cP(bu, ai)._2
515+ let do = bY(bx, cR, cT, cU)
516+ let ch = do._1
517+ let ci = do._2
518+ let dk = -(bx)
519+ let dp = cU
520+ let dq = -(ch)
521+ let dr = cr((bx > 0), ap(bx), ck)
522+ let dl = dr._1
523+ let bK = dr._2
524+ let bL = dr._3
525+ let ds = dr._4
526+ let dt = dr._5
527+ let du = dr._6
528+ let dv = dr._7
529+ let dw = (aX() - cS)
530+ $Tuple12(dk, ci, dp, dq, bK, bL, ds, dt, dw, dl, du, dv)
529531 }
530532
531533
532-func dS (dT) = if ((0 > dT))
533- then throw("Balance")
534- else [IntegerEntry(c, dT)]
534+func dx () = {
535+ let dy = ((lastBlock.timestamp / 1000) / 60)
536+ let dz = (dy - ac)
537+ let dA = valueOrElse(getString(this, t), "")
538+ let dB = split(dA, ",")
539+ func dC (ax,dD) = if ((dz >= parseIntValue(dD)))
540+ then (ax :+ parseIntValue(dD))
541+ else ax
542+
543+ let dE = {
544+ let aA = dB
545+ let aB = size(aA)
546+ let aC = nil
547+ func aD (aE,aF) = if ((aF >= aB))
548+ then aE
549+ else dC(aE, aA[aF])
550+
551+ func aG (aE,aF) = if ((aF >= aB))
552+ then aE
553+ else throw("List size exceeds 20")
554+
555+ aG(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aD(aC, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
556+ }
557+ let dF = if ((size(dE) > 0))
558+ then max(dE)
559+ else parseIntValue(dB[0])
560+ let dG = valueOrElse(getInteger(this, u), 0)
561+ let dH = valueOrElse(getInteger(this, ((v + "_") + toString(dG))), 0)
562+ let dI = valueOrElse(getInteger(this, ((w + "_") + toString(dG))), 0)
563+ let dJ = (dH + ((dy - dG) * dI))
564+ let dK = valueOrElse(getInteger(this, ((v + "_") + toString(dF))), 0)
565+ let dL = valueOrElse(getInteger(this, ((w + "_") + toString(dF))), 0)
566+ let dM = (dK + ((dz - dF) * dL))
567+ ((dJ - dM) / ac)
568+ }
535569
536570
537-func dU (dT) = [ScriptTransfer(T(), dT, R())]
571+func dN (dO,dP,dQ,dR,dS,dT,dU,dV,dW) = [IntegerEntry(m, dO), IntegerEntry(n, dP), IntegerEntry(o, dQ), IntegerEntry(l, dR), IntegerEntry(k, dS), IntegerEntry(q, dT), IntegerEntry(r, dU), IntegerEntry(p, dV), IntegerEntry(s, dW)]
538572
539573
540-@Callable(dT)
541-func pause () = if ((dT.caller != P()))
574+func dX (dY,dZ,ea,eb,ec) = [IntegerEntry(A, dY), IntegerEntry(y, dZ), IntegerEntry(z, ea), IntegerEntry(B, eb), IntegerEntry(C, ec)]
575+
576+
577+func ed (at,ee,ef,eg,ce) = [IntegerEntry(ar(e, at), ee), IntegerEntry(ar(f, at), ef), IntegerEntry(ar(g, at), eg), IntegerEntry(ar(h, at), ce)]
578+
579+
580+func eh (ei) = {
581+ let dy = ((lastBlock.timestamp / 1000) / 60)
582+ let ej = valueOrElse(getInteger(this, u), 0)
583+ if ((ej > dy))
584+ then throw("TWAP out-of-order")
585+ else {
586+ let dG = if ((ej == 0))
587+ then dy
588+ else ej
589+ if ((dy > ej))
590+ then {
591+ let ek = valueOrElse(getInteger(this, ((v + "_") + toString(ej))), 0)
592+ let el = valueOrElse(getInteger(this, ((w + "_") + toString(ej))), ei)
593+ let em = (ek + ((dy - dG) * el))
594+ let dB = aL(aJ(valueOrElse(getString(this, t), "")), ac, toString(dy))
595+[IntegerEntry(ar(v, toString(dy)), em), IntegerEntry(ar(w, toString(dy)), ei), IntegerEntry(ar(x, toString(dy)), ej), IntegerEntry(u, dy), StringEntry(t, au(dB))]
596+ }
597+ else {
598+ let en = valueOrElse(getInteger(this, ar(x, toString(dy))), 0)
599+ let ek = valueOrElse(getInteger(this, ar(v, toString(en))), 0)
600+ let el = valueOrElse(getInteger(this, ar(w, toString(en))), ei)
601+ let em = (ek + ((dy - en) * el))
602+[IntegerEntry(ar(v, toString(dy)), em), IntegerEntry(ar(w, toString(dy)), ei)]
603+ }
604+ }
605+ }
606+
607+
608+func eo (bI,bJ) = [IntegerEntry(D, bI), IntegerEntry(E, bJ)]
609+
610+
611+func ep (bI,bJ,eq,er,es,et,eu) = if (((et - eu) != eq))
612+ then throw(((((("Invalid AMM state data: " + toString(et)) + " + ") + toString(eu)) + " != ") + toString(eq)))
613+ else ((eo(bI, bJ) ++ [IntegerEntry(F, eq), IntegerEntry(I, er), IntegerEntry(J, es), IntegerEntry(G, et), IntegerEntry(H, eu)]) ++ eh(am(bI, bJ)))
614+
615+
616+func ev (at) = [DeleteEntry(ar(e, at)), DeleteEntry(ar(f, at)), DeleteEntry(ar(g, at)), DeleteEntry(ar(h, at))]
617+
618+
619+func ew (at,ex) = {
620+ let ey = assetBalance(this, V())
621+ if ((ex > ey))
622+ then throw(((("Unable to withdraw " + toString(ex)) + " from contract balance ") + toString(ey)))
623+ else [ScriptTransfer(at, ex, V())]
624+ }
625+
626+
627+func ez (eA) = if ((0 > eA))
628+ then throw("Balance")
629+ else [IntegerEntry(d, eA)]
630+
631+
632+func eB (eA) = [ScriptTransfer(X(), eA, V())]
633+
634+
635+@Callable(eA)
636+func pause () = if ((eA.caller != T()))
542637 then throw("Invalid togglePause params")
543- else [BooleanEntry(i, true)]
638+ else [BooleanEntry(j, true)]
544639
545640
546641
547-@Callable(dT)
548-func unpause () = if ((dT.caller != P()))
642+@Callable(eA)
643+func unpause () = if ((eA.caller != T()))
549644 then throw("Invalid togglePause params")
550- else [BooleanEntry(i, false)]
645+ else [BooleanEntry(j, false)]
551646
552647
553648
554-@Callable(dT)
555-func changeSettings (de,df,dg,dh,di,dj,dk) = if ((dT.caller != P()))
556- then throw("Invalid changeSettings params")
557- else dd(de, df, dg, dh, di, dj, dk)
558-
559-
560-
561-@Callable(dT)
562-func initialize (bh,bi,dh,de,df,dg,di,dV,dW,dX,dj,dk) = if (if (if (if (if (if (if (if (if (if ((0 >= bh))
649+@Callable(eA)
650+func addLiquidity (bD) = if (if ((eA.caller != T()))
563651 then true
564- else (0 >= bi))
565- then true
566- else (0 >= dh))
567- then true
568- else (0 >= de))
569- then true
570- else (0 >= df))
571- then true
572- else (0 >= dg))
573- then true
574- else (0 >= di))
575- then true
576- else (0 >= dj))
577- then true
578- else (0 >= dk))
579- then true
580- else aY())
581- then throw("Invalid initialize parameters")
582- else ((((dI(bh, bi, 0, 0, 0, 0, 0) ++ dd(de, df, dg, dh, di, dj, dk)) ++ dl((lastBlock.timestamp + dh), 0, 0, 0, 0)) ++ dS(0)) ++ [BooleanEntry(h, true), StringEntry(b, dV), StringEntry(a, dW), StringEntry(H, dX)])
583-
584-
585-
586-@Callable(dT)
587-func decreasePosition (dY,dQ,dZ,ea) = if (if (if (if (if (if (if ((dY != V))
588- then (dY != W)
589- else false)
590- then true
591- else (0 >= dQ))
592- then true
593- else if (((1 * aa) > dZ))
594- then true
595- else (dZ > (3 * aa)))
596- then true
597- else !(aY()))
598- then true
599- else !(ao(ah(aa, dZ), ax(), true)))
600- then true
601- else aZ())
602- then throw("Invalid decreasePosition parameters")
652+ else (0 >= bD))
653+ then throw("Invalid addLiquidity params")
603654 else {
604- let eb = aR(toString(dT.caller))
605- let ec = eb._1
606- let ed = eb._2
607- let ee = eb._3
608- let ef = eb._4
609- let eg = (ec == 0)
610- let eh = if ((ec > 0))
611- then (dY == V)
612- else (dY == W)
613- let ei = if (!(eg))
614- then eh
615- else false
616- let ej = (dY == V)
617- let ek = if (if (eg)
618- then true
619- else ei)
620- then throw("Use increasePosition to open new or increase position")
621- else {
622- let el = aj(dQ, dZ)
623- let em = bV(toString(dT.caller), ad)
624- let en = em._1
625- let cj = em._2
626- if ((en > el))
627- then {
628- let eo = bg(ej, el)
629- let cv = eo._1
630- let bl = eo._2
631- let bm = eo._3
632- let cA = eo._4
633- let cB = eo._5
634- let ep = ak(cv)
635- if (if ((ea != 0))
636- then (ea > ep)
637- else false)
638- then throw(((("Too little basse asset exchanged, got " + toString(ep)) + " expected ") + toString(ea)))
639- else {
640- let cw = if ((ec != 0))
641- then ah(aj(cj, ep), ec)
642- else 0
643- let eq = bw(ec, ed, ef, cw)
644- let bF = eq._1
645- let bG = eq._2
646- let bC = eq._3
647- let er = eq._4
648- let cz = el
649- let es = (cj - cw)
650- let et = if ((ec > 0))
651- then ((en - cz) - es)
652- else ((es + en) - cz)
653- let eu = (ec + cv)
654- $Tuple11(eu, bF, ak(et), er, bm, bl, cA, cB, (aC() - el), (aO() - (if ((eu > 0))
655- then ak(cv)
656- else 0)), (aN() - (if ((0 > eu))
657- then ak(cv)
658- else 0)))
659- }
660- }
661- else throw("Close position first")
662- }
663- let eu = ek._1
664- let ev = ek._2
665- let ew = ek._3
666- let ex = ek._4
667- let bm = ek._5
668- let bl = ek._6
669- let cA = ek._7
670- let cB = ek._8
671- let cE = ek._9
672- let cC = ek._10
673- let cD = ek._11
674- (dr(toString(dT.caller), eu, ev, ew, ex) ++ dI(bl, bm, cA, cB, cE, cC, cD))
655+ let bI = aT()
656+ let bJ = aU()
657+ let ei = am(bI, bJ)
658+ let eC = am(bD, ei)
659+ let eD = (bI + bD)
660+ let eE = (bJ + eC)
661+ eo(eD, eE)
675662 }
676663
677664
678665
679-@Callable(dT)
680-func increasePosition (dY,dZ,ea) = {
681- let ey = dT.payments[0].amount
682- if (if (if (if (if (if (if (if ((dY != V))
683- then (dY != W)
666+@Callable(eA)
667+func removeLiquidity (bD) = if (if ((eA.caller != T()))
668+ then true
669+ else (0 >= bD))
670+ then throw("Invalid removeLiquidity params")
671+ else {
672+ let bI = aT()
673+ let bJ = aU()
674+ let ei = am(bI, bJ)
675+ let eF = am(bD, ei)
676+ let eD = (bI - bD)
677+ let eE = (bJ - eF)
678+ eo(eD, eE)
679+ }
680+
681+
682+
683+@Callable(eA)
684+func changeSettings (dO,dP,dQ,dR,dS,dT,dU,dV,dW) = if ((eA.caller != T()))
685+ then throw("Invalid changeSettings params")
686+ else dN(dO, dP, dQ, dR, dS, dT, dU, dV, dW)
687+
688+
689+
690+@Callable(eA)
691+func initialize (bI,bJ,dR,dO,dP,dQ,dS,eG,eH,eI,dT,dU,dV,dW) = if (if (if (if (if (if (if (if (if (if (if (if ((0 >= bI))
692+ then true
693+ else (0 >= bJ))
694+ then true
695+ else (0 >= dR))
696+ then true
697+ else (0 >= dO))
698+ then true
699+ else (0 >= dP))
700+ then true
701+ else (0 >= dQ))
702+ then true
703+ else (0 >= dS))
704+ then true
705+ else (0 >= dT))
706+ then true
707+ else (0 >= dU))
708+ then true
709+ else (0 >= dV))
710+ then true
711+ else (0 >= dW))
712+ then true
713+ else bz())
714+ then throw("Invalid initialize parameters")
715+ else ((((ep(bI, bJ, 0, 0, 0, 0, 0) ++ dN(dO, dP, dQ, dR, dS, dT, dU, dV, dW)) ++ dX((lastBlock.timestamp + dR), 0, 0, 0, 0)) ++ ez(0)) ++ [BooleanEntry(i, true), StringEntry(c, eG), StringEntry(a, eH), StringEntry(K, eI)])
716+
717+
718+
719+@Callable(eA)
720+func setInitMarginRatio (dO) = if (if ((0 >= dO))
721+ then true
722+ else !(bz()))
723+ then throw("Invalid setInitMarginRatio parameters")
724+ else dN(dO, bc(), bd(), aZ(), aR(), bf(), bg(), be(), bh())
725+
726+
727+
728+@Callable(eA)
729+func decreasePosition (ex,eJ,eK) = if (if (if (if (if ((0 >= ex))
730+ then true
731+ else !(bz()))
732+ then true
733+ else !(bm(am(af, eJ), aS(), true)))
734+ then true
735+ else !(by(toString(eA.caller))))
736+ then true
737+ else bA())
738+ then throw("Invalid decreasePosition parameters")
739+ else {
740+ let eL = bt(toString(eA.caller))
741+ let eM = eL._1
742+ let eN = eL._2
743+ let eO = eL._3
744+ let eP = eL._4
745+ let eQ = if ((eM > 0))
746+ then ab
747+ else aa
748+ let eR = (eQ == aa)
749+ let eS = ao(ex, eJ)
750+ let eT = cP(toString(eA.caller), ai)
751+ let eU = eT._1
752+ let cU = eT._2
753+ let eV = if ((eU > eS))
754+ then {
755+ let eW = bH(eR, eS)
756+ let dk = eW._1
757+ let bK = eW._2
758+ let bL = eW._3
759+ let ds = eW._4
760+ let dt = eW._5
761+ let eX = ap(dk)
762+ if (if ((eK != 0))
763+ then (eK > eX)
764+ else false)
765+ then throw(((("Too little base asset exchanged, got " + toString(eX)) + " expected ") + toString(eK)))
766+ else {
767+ let dp = am(ao(cU, eX), ap(eM))
768+ let eY = bY(eM, eN, eP, dp)
769+ let ch = eY._1
770+ let ci = eY._2
771+ let cd = eY._3
772+ let dl = eS
773+ let eZ = (cU - dp)
774+ let fa = if ((eM > 0))
775+ then ((eU - dl) - eZ)
776+ else ((eZ + eU) - dl)
777+ let fb = (eM + dk)
778+ $Tuple11(fb, ch, ap(fa), br(fb), bL, bK, ds, dt, (aX() - eS), (bl() - (if ((fb > 0))
779+ then ap(dk)
780+ else 0)), (bk() - (if ((0 > fb))
781+ then ap(dk)
782+ else 0)))
783+ }
784+ }
785+ else throw("Close position first")
786+ let fb = eV._1
787+ let fc = eV._2
788+ let fd = eV._3
789+ let fe = eV._4
790+ let bL = eV._5
791+ let bK = eV._6
792+ let ds = eV._7
793+ let dt = eV._8
794+ let dw = eV._9
795+ let du = eV._10
796+ let dv = eV._11
797+ let ff = invoke(Z(), "notifyNotional", [toString(eA.caller), fd], nil)
798+ if ((ff == ff))
799+ then (ed(toString(eA.caller), fb, fc, fd, fe) ++ ep(bK, bL, ds, dt, dw, du, dv))
800+ else throw("Strict value is not equal to itself.")
801+ }
802+
803+
804+
805+@Callable(eA)
806+func increasePosition (eQ,eJ,eK) = {
807+ let fg = eA.payments[0].amount
808+ if (if (if (if (if (if (if ((eQ != aa))
809+ then (eQ != ab)
684810 else false)
685811 then true
686- else (0 >= ey))
812+ else (0 >= fg))
687813 then true
688- else if (((1 * aa) > dZ))
689- then true
690- else (dZ > (3 * aa)))
814+ else !(bz()))
691815 then true
692- else !(aY()))
816+ else (eA.payments[0].assetId != V()))
693817 then true
694- else (dT.payments[0].assetId != R()))
818+ else !(bm(am(af, eJ), aS(), true)))
695819 then true
696- else !(ao(ah(aa, dZ), ax(), true)))
697- then true
698- else aZ())
820+ else bA())
699821 then throw("Invalid increasePosition parameters")
700822 else {
701- let ez = aj(ey, aw())
702- let dQ = (ey - ez)
703- let eA = aR(toString(dT.caller))
704- let ec = eA._1
705- let ed = eA._2
706- let ee = eA._3
707- let ef = eA._4
708- let eg = (ec == 0)
709- let eh = if ((ec > 0))
710- then (dY == V)
711- else (dY == W)
712- let ei = if (!(eg))
713- then eh
823+ let fh = ao(fg, aR())
824+ let ex = (fg - fh)
825+ let fi = bt(toString(eA.caller))
826+ let eM = fi._1
827+ let eN = fi._2
828+ let eO = fi._3
829+ let eP = fi._4
830+ let fj = (eM == 0)
831+ let fk = if ((eM > 0))
832+ then (eQ == aa)
833+ else (eQ == ab)
834+ let fl = if (!(fj))
835+ then fk
714836 else false
715- let ej = (dY == V)
716- let eB = if (if (eg)
837+ let eR = (eQ == aa)
838+ let fm = if (if (fj)
717839 then true
718- else ei)
840+ else fl)
719841 then {
720- let el = aj(dQ, dZ)
721- let eC = bg(ej, el)
722- let bo = eC._1
723- let bl = eC._2
724- let bm = eC._3
725- let cA = eC._4
726- let cB = eC._5
727- if (if ((ea != 0))
728- then (ea > ak(bo))
842+ let eS = ao(ex, eJ)
843+ let fn = bH(eR, eS)
844+ let bN = fn._1
845+ let bK = fn._2
846+ let bL = fn._3
847+ let ds = fn._4
848+ let dt = fn._5
849+ if (if ((eK != 0))
850+ then (eK > ap(bN))
729851 else false)
730- then throw(((("Limit error: " + toString(ak(bo))) + " < ") + toString(ea)))
852+ then throw(((("Limit error: " + toString(ap(bN))) + " < ") + toString(eK)))
731853 else {
732- let eu = (ec + bo)
733- let eD = ah(el, dZ)
734- let eE = bw(ec, ed, ef, eD)
735- let bF = eE._1
736- let cg = eE._2
737- let ch = eE._3
738- let er = eE._4
739- $Tuple11(eu, bF, (ee + el), er, bm, bl, cA, cB, (aC() + el), (aO() + (if ((eu > 0))
740- then ak(bo)
741- else 0)), (aN() + (if ((0 > eu))
742- then ak(bo)
743- else 0)))
854+ let fb = (eM + bN)
855+ let fo = am(eS, eJ)
856+ let fp = bY(eM, eN, eP, fo)
857+ let ch = fp._1
858+ let cM = fp._2
859+ let cN = fp._3
860+ if (!(cx(bK, bL)))
861+ then throw("Over max spread limit")
862+ else $Tuple11(fb, ch, (eO + eS), br(fb), bL, bK, ds, dt, (aX() + eS), (bl() + (if ((fb > 0))
863+ then ap(bN)
864+ else 0)), (bk() + (if ((0 > fb))
865+ then ap(bN)
866+ else 0)))
744867 }
745868 }
746869 else {
747- let el = aj(dQ, dZ)
748- let eF = bV(toString(dT.caller), ad)
749- let en = eF._1
750- let cj = eF._2
751- if ((en > el))
870+ let eS = ao(ex, eJ)
871+ let fq = cP(toString(eA.caller), ai)
872+ let eU = fq._1
873+ let cU = fq._2
874+ if ((eU > eS))
752875 then throw("Use decreasePosition to decrease position size")
753876 else throw("Close position first")
754877 }
755- let eu = eB._1
756- let ev = eB._2
757- let ew = eB._3
758- let ex = eB._4
759- let bm = eB._5
760- let bl = eB._6
761- let cA = eB._7
762- let cB = eB._8
763- let cE = eB._9
764- let cC = eB._10
765- let cD = eB._11
766- let eG = (ez / 2)
767- let eH = (ez - eG)
768- let eI = invoke(S(), "lockNeutrinoSP", [toString(T()), ac], [AttachedPayment(R(), dQ)])
769- if ((eI == eI))
878+ let fb = fm._1
879+ let fc = fm._2
880+ let fd = fm._3
881+ let fe = fm._4
882+ let bL = fm._5
883+ let bK = fm._6
884+ let ds = fm._7
885+ let dt = fm._8
886+ let dw = fm._9
887+ let du = fm._10
888+ let dv = fm._11
889+ let fr = (fh / 2)
890+ let fs = (fh - fr)
891+ let ft = invoke(W(), "lockNeutrinoSP", [toString(X()), ah], [AttachedPayment(V(), ex)])
892+ if ((ft == ft))
770893 then {
771- let eJ = invoke(U(), "deposit", nil, [AttachedPayment(R(), eH)])
772- if ((eJ == eJ))
773- then (((dr(toString(dT.caller), eu, ev, ew, ex) ++ dI(bl, bm, cA, cB, cE, cC, cD)) ++ dU(eG)) ++ dS((av() + dQ)))
894+ let fu = invoke(Y(), "deposit", nil, [AttachedPayment(V(), fs)])
895+ if ((fu == fu))
896+ then {
897+ let fv = invoke(Z(), "notifyFees", [toString(eA.caller), fh], nil)
898+ if ((fv == fv))
899+ then {
900+ let ff = invoke(Z(), "notifyNotional", [toString(eA.caller), fd], nil)
901+ if ((ff == ff))
902+ then (((ed(toString(eA.caller), fb, fc, fd, fe) ++ ep(bK, bL, ds, dt, dw, du, dv)) ++ eB(fr)) ++ ez((aQ() + ex)))
903+ else throw("Strict value is not equal to itself.")
904+ }
905+ else throw("Strict value is not equal to itself.")
906+ }
774907 else throw("Strict value is not equal to itself.")
775908 }
776909 else throw("Strict value is not equal to itself.")
777910 }
778911 }
779912
780913
781914
782-@Callable(dT)
915+@Callable(eA)
783916 func addMargin () = {
784- let ey = dT.payments[0].amount
785- if (if (if (if ((dT.payments[0].assetId != R()))
917+ let fg = eA.payments[0].amount
918+ if (if (if (if ((eA.payments[0].assetId != V()))
786919 then true
787- else !(aW(toString(dT.caller))))
920+ else !(by(toString(eA.caller))))
788921 then true
789- else !(aY()))
922+ else !(bz()))
790923 then true
791- else aZ())
924+ else bA())
792925 then throw("Invalid addMargin parameters")
793926 else {
794- let ez = aj(ey, aw())
795- let dQ = (ey - ez)
796- let eK = aR(toString(dT.caller))
797- let ec = eK._1
798- let ed = eK._2
799- let ee = eK._3
800- let ef = eK._4
801- let eG = (ez / 2)
802- let eH = (ez - eG)
803- let eI = invoke(S(), "lockNeutrinoSP", [toString(T()), ac], [AttachedPayment(R(), dQ)])
804- if ((eI == eI))
927+ let fh = ao(fg, aR())
928+ let ex = (fg - fh)
929+ let fw = bt(toString(eA.caller))
930+ let eM = fw._1
931+ let eN = fw._2
932+ let eO = fw._3
933+ let eP = fw._4
934+ let fr = (fh / 2)
935+ let fs = (fh - fr)
936+ let ft = invoke(W(), "lockNeutrinoSP", [toString(X()), ah], [AttachedPayment(V(), ex)])
937+ if ((ft == ft))
805938 then {
806- let eJ = invoke(U(), "deposit", nil, [AttachedPayment(R(), eH)])
807- if ((eJ == eJ))
808- then ((dr(toString(dT.caller), ec, (ed + dQ), ee, ef) ++ dU(eG)) ++ dS((av() + dQ)))
939+ let fu = invoke(Y(), "deposit", nil, [AttachedPayment(V(), fs)])
940+ if ((fu == fu))
941+ then {
942+ let fv = invoke(Z(), "notifyFees", [toString(eA.caller), fh], nil)
943+ if ((fv == fv))
944+ then ((ed(toString(eA.caller), eM, (eN + ex), eO, eP) ++ eB(fr)) ++ ez((aQ() + ex)))
945+ else throw("Strict value is not equal to itself.")
946+ }
809947 else throw("Strict value is not equal to itself.")
810948 }
811949 else throw("Strict value is not equal to itself.")
812950 }
813951 }
814952
815953
816954
817-@Callable(dT)
818-func removeMargin (dQ) = if (if (if (if ((0 >= dQ))
955+@Callable(eA)
956+func removeMargin (ex) = if (if (if (if ((0 >= ex))
819957 then true
820- else !(aW(toString(dT.caller))))
958+ else !(by(toString(eA.caller))))
821959 then true
822- else !(aY()))
960+ else !(bz()))
823961 then true
824- else aZ())
962+ else bA())
825963 then throw("Invalid removeMargin parameters")
826964 else {
827- let eL = aR(toString(dT.caller))
828- let ec = eL._1
829- let ed = eL._2
830- let ee = eL._3
831- let ef = eL._4
832- let eM = -(dQ)
833- let eN = bw(ec, ed, ef, eM)
834- let bF = eN._1
835- let bG = eN._2
836- let cg = eN._3
837- let eO = eN._4
838- if ((bG != 0))
839- then throw("Invalid added margin amount")
965+ let fx = bt(toString(eA.caller))
966+ let eM = fx._1
967+ let eN = fx._2
968+ let eO = fx._3
969+ let eP = fx._4
970+ let fy = -(ex)
971+ let fz = bY(eM, eN, eP, fy)
972+ let ch = fz._1
973+ let ci = fz._2
974+ if ((ci != 0))
975+ then throw("Invalid removed margin amount")
840976 else {
841- let eP = invoke(S(), "unlockNeutrino", [dQ, toBase58String(R())], nil)
842- if ((eP == eP))
843- then ((dr(toString(dT.caller), ec, bF, ee, eO) ++ dP(dT.caller, dQ)) ++ dS((av() - dQ)))
844- else throw("Strict value is not equal to itself.")
977+ let fA = cV(ch, ci, eO)
978+ if (!(bm(fA, aS(), true)))
979+ then throw(((("Too much margin removed: " + toString(fA)) + " < ") + toString(aS())))
980+ else {
981+ let fB = invoke(W(), "unlockNeutrino", [ex, toBase58String(V())], nil)
982+ if ((fB == fB))
983+ then ((ed(toString(eA.caller), eM, ch, eO, br(eM)) ++ ew(eA.caller, ex)) ++ ez((aQ() - ex)))
984+ else throw("Strict value is not equal to itself.")
985+ }
845986 }
846987 }
847988
848989
849990
850-@Callable(dT)
851-func closePosition () = if (if (if (!(aW(toString(dT.caller))))
991+@Callable(eA)
992+func closePosition () = if (if (if (!(by(toString(eA.caller))))
852993 then true
853- else !(aY()))
994+ else !(bz()))
854995 then true
855- else aZ())
996+ else bA())
856997 then throw("Invalid closePosition parameters")
857998 else {
858- let eQ = cr(toString(dT.caller))
859- let cg = eQ._1
860- let eR = eQ._2
861- let cw = eQ._3
862- let cx = eQ._4
863- let bl = eQ._5
864- let bm = eQ._6
865- let cA = eQ._7
866- let cB = eQ._8
867- let cE = eQ._9
868- let ch = eQ._10
869- let cC = eQ._11
870- let cD = eQ._12
871- if ((eR > 0))
999+ let fC = dm(toString(eA.caller), true)
1000+ let cM = fC._1
1001+ let fD = fC._2
1002+ let dp = fC._3
1003+ let dq = fC._4
1004+ let bK = fC._5
1005+ let bL = fC._6
1006+ let ds = fC._7
1007+ let dt = fC._8
1008+ let dw = fC._9
1009+ let cN = fC._10
1010+ let du = fC._11
1011+ let dv = fC._12
1012+ if ((fD > 0))
8721013 then throw("Unable to close position with bad debt")
8731014 else {
874- let eS = ak(cx)
875- let eT = (av() - eS)
876- let eU = if ((0 > eT))
877- then $Tuple2(0, ak(eT))
878- else $Tuple2(eT, 0)
879- let eV = eU._1
880- let eW = eU._2
881- let cl = if ((eW > 0))
1015+ let fE = ap(dq)
1016+ let fF = (aQ() - fE)
1017+ let fG = if ((0 > fF))
1018+ then $Tuple2(0, ap(fF))
1019+ else $Tuple2(fF, 0)
1020+ let fH = fG._1
1021+ let fI = fG._2
1022+ let fJ = if ((fI > 0))
8821023 then {
883- let eX = invoke(U(), "withdraw", [eW], nil)
884- if ((eX == eX))
1024+ let fK = invoke(Y(), "withdraw", [fI], nil)
1025+ if ((fK == fK))
8851026 then nil
8861027 else throw("Strict value is not equal to itself.")
8871028 }
8881029 else nil
889- if ((cl == cl))
1030+ if ((fJ == fJ))
8901031 then {
891- let eP = invoke(S(), "unlockNeutrino", [(eS - eW), toBase58String(R())], nil)
892- if ((eP == eP))
893- then (((dO(toString(dT.caller)) ++ dI(bl, bm, cA, cB, cE, cC, cD)) ++ dP(dT.caller, eS)) ++ dS(eV))
1032+ let fB = invoke(W(), "unlockNeutrino", [(fE - fI), toBase58String(V())], nil)
1033+ if ((fB == fB))
1034+ then {
1035+ let ff = invoke(Z(), "notifyNotional", [toString(eA.caller), 0], nil)
1036+ if ((ff == ff))
1037+ then (((ev(toString(eA.caller)) ++ ep(bK, bL, ds, dt, dw, du, dv)) ++ ew(eA.caller, fE)) ++ ez(fH))
1038+ else throw("Strict value is not equal to itself.")
1039+ }
8941040 else throw("Strict value is not equal to itself.")
8951041 }
8961042 else throw("Strict value is not equal to itself.")
8971043 }
8981044 }
8991045
9001046
9011047
902-@Callable(dT)
903-func liquidate (aX) = {
904- let eY = if (bS())
905- then ck(aX, ae)
906- else ck(aX, ad)
907- if (if (if (!(ao(eY, aH(), false)))
1048+@Callable(eA)
1049+func liquidate (bu) = {
1050+ let fL = cZ(bu, ai)
1051+ let fA = if (cD())
1052+ then {
1053+ let fM = cZ(bu, aj)
1054+ aq(fL, fM)
1055+ }
1056+ else fL
1057+ if (if (if (if (!(bm(fA, bc(), false)))
9081058 then true
909- else !(aY()))
1059+ else !(by(bu)))
9101060 then true
911- else aZ())
1061+ else !(bz()))
1062+ then true
1063+ else bA())
9121064 then throw("Unable to liquidate")
1065+ else if (if (if ((fL > bd()))
1066+ then (be() > 0)
1067+ else false)
1068+ then (af > be())
1069+ else false)
1070+ then {
1071+ let fN = bt(bu)
1072+ let eM = fN._1
1073+ let eN = fN._2
1074+ let eO = fN._3
1075+ let eP = fN._4
1076+ let eQ = if ((eM > 0))
1077+ then ab
1078+ else aa
1079+ let eR = (eQ == aa)
1080+ let dl = df(bu, eM)
1081+ let fO = cP(bu, ai)
1082+ let eU = fO._1
1083+ let cU = fO._2
1084+ let fP = bH(eR, dl)
1085+ let dk = fP._1
1086+ let bK = fP._2
1087+ let bL = fP._3
1088+ let ds = fP._4
1089+ let dt = fP._5
1090+ let dp = am(ao(cU, ap(dk)), ap(eM))
1091+ let fQ = bY(eM, eN, eP, dp)
1092+ let ch = fQ._1
1093+ let ci = fQ._2
1094+ let cd = fQ._3
1095+ let eZ = (cU - dp)
1096+ let fa = if ((eM > 0))
1097+ then ((eU - dl) - eZ)
1098+ else ((eZ + eU) - dl)
1099+ let fR = ao(dl, bd())
1100+ let fS = (fR / 2)
1101+ let fs = (fR - fS)
1102+ let fT = (ch - fR)
1103+ let fb = (eM + dk)
1104+ let fd = ap(fa)
1105+ let fU = br(fb)
1106+ let dw = (aX() - dl)
1107+ let fF = (aQ() - fR)
1108+ let fV = if ((0 > fF))
1109+ then $Tuple2(0, ap(fF))
1110+ else $Tuple2(fF, 0)
1111+ let fW = fV._1
1112+ let fX = fV._2
1113+ let fJ = if ((fX > 0))
1114+ then {
1115+ let fK = invoke(Y(), "withdraw", [fX], nil)
1116+ if ((fK == fK))
1117+ then nil
1118+ else throw("Strict value is not equal to itself.")
1119+ }
1120+ else nil
1121+ if ((fJ == fJ))
1122+ then {
1123+ let fB = invoke(W(), "unlockNeutrino", [(fR - fX), toBase58String(V())], nil)
1124+ if ((fB == fB))
1125+ then {
1126+ let fu = invoke(Y(), "deposit", nil, [AttachedPayment(V(), fs)])
1127+ if ((fu == fu))
1128+ then {
1129+ let ff = invoke(Z(), "notifyNotional", [bu, fd], nil)
1130+ if ((ff == ff))
1131+ then (((ed(bu, fb, fT, fd, fU) ++ ep(bK, bL, ds, dt, dw, (bl() - (if ((fb > 0))
1132+ then ap(dk)
1133+ else 0)), (bk() - (if ((0 > fb))
1134+ then ap(dk)
1135+ else 0)))) ++ ew(eA.caller, fS)) ++ ez(fW))
1136+ else throw("Strict value is not equal to itself.")
1137+ }
1138+ else throw("Strict value is not equal to itself.")
1139+ }
1140+ else throw("Strict value is not equal to itself.")
1141+ }
1142+ else throw("Strict value is not equal to itself.")
1143+ }
1144+ else {
1145+ let fY = dm(bu, false)
1146+ let cM = fY._1
1147+ let ci = fY._2
1148+ let cN = fY._3
1149+ let cO = fY._4
1150+ let bK = fY._5
1151+ let bL = fY._6
1152+ let ds = fY._7
1153+ let dt = fY._8
1154+ let dw = fY._9
1155+ let dl = fY._10
1156+ let du = fY._11
1157+ let dv = fY._12
1158+ let fR = ao(dl, bd())
1159+ let fS = (fR / 2)
1160+ let fs = (fR - fS)
1161+ let fF = (aQ() - fR)
1162+ let fZ = if ((0 > fF))
1163+ then $Tuple2(0, ap(fF))
1164+ else $Tuple2(fF, 0)
1165+ let fW = fZ._1
1166+ let fX = fZ._2
1167+ let fJ = if ((fX > 0))
1168+ then {
1169+ let fK = invoke(Y(), "withdraw", [fX], nil)
1170+ if ((fK == fK))
1171+ then nil
1172+ else throw("Strict value is not equal to itself.")
1173+ }
1174+ else nil
1175+ if ((fJ == fJ))
1176+ then {
1177+ let fB = invoke(W(), "unlockNeutrino", [(fR - fX), toBase58String(V())], nil)
1178+ if ((fB == fB))
1179+ then {
1180+ let fu = invoke(Y(), "deposit", nil, [AttachedPayment(V(), fs)])
1181+ if ((fu == fu))
1182+ then {
1183+ let ff = invoke(Z(), "notifyNotional", [bu, 0], nil)
1184+ if ((ff == ff))
1185+ then (((ev(bu) ++ ep(bK, bL, ds, dt, dw, du, dv)) ++ ew(eA.caller, fS)) ++ ez(fW))
1186+ else throw("Strict value is not equal to itself.")
1187+ }
1188+ else throw("Strict value is not equal to itself.")
1189+ }
1190+ else throw("Strict value is not equal to itself.")
1191+ }
1192+ else throw("Strict value is not equal to itself.")
1193+ }
1194+ }
1195+
1196+
1197+
1198+@Callable(eA)
1199+func payFunding () = {
1200+ let ga = aY()
1201+ if (if (if ((ga > lastBlock.timestamp))
1202+ then true
1203+ else !(bz()))
1204+ then true
1205+ else bA())
1206+ then throw(((("Invalid funding block timestamp: " + toString(lastBlock.timestamp)) + " < ") + toString(ga)))
9131207 else {
914- let eZ = cr(aX)
915- let cg = eZ._1
916- let bG = eZ._2
917- let ch = eZ._3
918- let cx = eZ._4
919- let bl = eZ._5
920- let bm = eZ._6
921- let cA = eZ._7
922- let cB = eZ._8
923- let cE = eZ._9
924- let cz = eZ._10
925- let cC = eZ._11
926- let cD = eZ._12
927- let fa = (aj(cz, aI()) / 2)
928- let fb = if ((fa > cx))
929- then $Tuple3((fa - cx), cx, ((bG + fa) - cx))
930- else $Tuple3(0, (cx - fa), bG)
931- let fc = fb._1
932- let bF = fb._2
933- let fd = fb._3
934- let fe = (av() - fa)
935- let ff = if ((0 > fe))
936- then $Tuple2(0, ak(fe))
937- else $Tuple2(fe, 0)
938- let fg = ff._1
939- let fh = ff._2
940- let cl = if ((fh > 0))
941- then {
942- let eX = invoke(U(), "withdraw", [fh], nil)
943- if ((eX == eX))
944- then nil
945- else throw("Strict value is not equal to itself.")
946- }
947- else nil
948- if ((cl == cl))
949- then {
950- let eP = invoke(S(), "unlockNeutrino", [(fa - fh), toBase58String(R())], nil)
951- if ((eP == eP))
952- then (((dO(aX) ++ dI(bl, bm, cA, cB, cE, cC, cD)) ++ dP(dT.caller, fa)) ++ dS(fg))
953- else throw("Strict value is not equal to itself.")
954- }
955- else throw("Strict value is not equal to itself.")
1208+ let gb = cs()
1209+ let gc = dx()
1210+ let gd = (gc - gb)
1211+ let ge = if (if ((bk() == 0))
1212+ then true
1213+ else (bl() == 0))
1214+ then $Tuple2(0, 0)
1215+ else if ((0 > gd))
1216+ then {
1217+ let gf = am(ao(gd, ba()), ag)
1218+ let gg = am(ao(gf, bk()), bl())
1219+ $Tuple2(gf, gg)
1220+ }
1221+ else {
1222+ let gg = am(ao(gd, ba()), ag)
1223+ let gf = am(ao(gg, bl()), bk())
1224+ $Tuple2(gf, gg)
1225+ }
1226+ let gf = ge._1
1227+ let gg = ge._2
1228+ dX((ga + bb()), (bi() + gg), (bj() + gf), am(gg, gb), am(gf, gb))
9561229 }
9571230 }
9581231
9591232
9601233
961-@Callable(dT)
962-func payFunding () = {
963- let fi = aD()
964- if (if (if ((fi > lastBlock.timestamp))
965- then true
966- else !(aY()))
967- then true
968- else aZ())
969- then throw(((("Invalid funding block timestamp: " + toString(lastBlock.timestamp)) + " < ") + toString(fi)))
970- else {
971- let fj = bO()
972- let fk = cF()
973- let fl = (fk - fj)
974- let fm = if (if ((aN() == 0))
975- then true
976- else (aO() == 0))
977- then $Tuple2(0, 0)
978- else if ((0 > fl))
979- then {
980- let fn = ah(aj(fl, aF()), ab)
981- let fo = ah(aj(fn, aN()), aO())
982- $Tuple2(fn, fo)
983- }
984- else {
985- let fo = ah(aj(fl, aF()), ab)
986- let fn = ah(aj(fo, aO()), aN())
987- $Tuple2(fn, fo)
988- }
989- let fn = fm._1
990- let fo = fm._2
991- dl((fi + aG()), (aL() + fo), (aM() + fn), ah(fo, fj), ah(fn, fj))
992- }
1234+@Callable(eA)
1235+func v_get (bu) = {
1236+ let gh = dm(bu, false)
1237+ let cM = gh._1
1238+ let cN = gh._2
1239+ let cO = gh._3
1240+ let gi = gh._4
1241+ throw((((ak(cN) + ak(cO)) + ak(gi)) + ak(de(bu))))
9931242 }
9941243
9951244
9961245
997-@Callable(dT)
998-func v_get (aX) = {
999- let fp = cr(aX)
1000- let cg = fp._1
1001- let ch = fp._2
1002- let ci = fp._3
1003- let fq = fp._4
1004- throw((((af(ch) + af(ci)) + af(fq)) + af(cq(aX))))
1246+@Callable(eA)
1247+func view_calcRemainMarginWithFundingPayment (bu) = {
1248+ let gj = bt(bu)
1249+ let bx = gj._1
1250+ let cR = gj._2
1251+ let db = gj._3
1252+ let cT = gj._4
1253+ let gk = cP(bu, ai)
1254+ let cJ = gk._1
1255+ let cU = gk._2
1256+ let gl = bY(bx, cR, cT, cU)
1257+ let ch = gl._1
1258+ let ci = gl._2
1259+ let cd = gl._3
1260+ throw((((((ak(ch) + ak(cd)) + ak(de(bu))) + ak(cU)) + ak(ci)) + ak(cJ)))
10051261 }
10061262
10071263
10081264
1009-@Callable(dT)
1010-func view_calcRemainMarginWithFundingPayment (aX) = {
1011- let fr = aR(aX)
1012- let aV = fr._1
1013- let bY = fr._2
1014- let cn = fr._3
1015- let ca = fr._4
1016- let fs = bV(aX, ad)
1017- let cd = fs._1
1018- let cj = fs._2
1019- let ft = bw(aV, bY, ca, cj)
1020- let bF = ft._1
1021- let bG = ft._2
1022- let bC = ft._3
1023- throw((af(bF) + af(bC)))
1024- }
1265+@Callable(eA)
1266+func forceMoveAsset (bu,ex) = if (if ((addressFromPublicKey(U()) != eA.caller))
1267+ then true
1268+ else (0 > ex))
1269+ then throw("Invalid forceMoveAsset parameters")
1270+ else {
1271+ let fB = invoke(W(), "unlockNeutrino", [ex, toBase58String(V())], nil)
1272+ if ((fB == fB))
1273+ then (ew(addressFromStringValue(bu), ex) ++ ez((aQ() - ex)))
1274+ else throw("Strict value is not equal to itself.")
1275+ }
10251276
10261277
1027-@Verifier(fu)
1028-func fv () = sigVerify(fu.bodyBytes, fu.proofs[0], Q())
1278+@Verifier(gm)
1279+func gn () = sigVerify(gm.bodyBytes, gm.proofs[0], U())
10291280

github/deemru/w8io/169f3d6 
258.85 ms