tx · EQbN2YdZyr5QV5AAffip2qxvig91oFqePKHDD3K4LjQL

3NBf9paePfCRTe5teHMeQYwBTeXb8w5X8XU:  -0.01800000 Waves

2022.10.27 05:39 [2290245] smart account 3NBf9paePfCRTe5teHMeQYwBTeXb8w5X8XU > SELF 0.00000000 Waves

{ "type": 13, "id": "EQbN2YdZyr5QV5AAffip2qxvig91oFqePKHDD3K4LjQL", "fee": 1800000, "feeAssetId": null, "timestamp": 1666838339996, "version": 2, "chainId": 84, "sender": "3NBf9paePfCRTe5teHMeQYwBTeXb8w5X8XU", "senderPublicKey": "DCKh8MYoZuPLjqsqXu8UuTXcxwZPKkDTCdAjpLiRXffa", "proofs": [ "2dxEui9CkGQNi5nfrWTasoXjkbREoC2gX3Wnzecbik1jHwEpS8PB5Cz3Kh2h5NPEX5gzu5UbdxZVVLc66VJMWHQc" ], "script": "base64:BgJkCAISBAoCCAgSCAoGCAgICAgIEgkKBwgICAgICAgSAwoBCBIECgIICBIGCgQICAgIEggKBggICAEBARIJCgcICAgIAQEBEgUKAwgIBBIECgIICBIFCgMICAgSBAoCCAgSAwoBCDMAB1ZFUlNJT04CBTEuMC4wAQ5nZXRTdHJpbmdCeUtleQEDa2V5CQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMFA2tleQIAAAh1c2VyRGFwcAkBBXZhbHVlAQkApggBCQEOZ2V0U3RyaW5nQnlLZXkBAg9jb25mX3VzZXJzX2RhcHAAC2ZlZVJlY2VpdmVyCQEOZ2V0U3RyaW5nQnlLZXkBAhFjb25mX2ZlZV9yZWNlaXZlcgALc2lnbkFzc2V0SWQJANkEAQkBDmdldFN0cmluZ0J5S2V5AQIYY29uZl9hY2NlcHRlZF9hc3NldF9TSUdOAAVjaHJpcwkBDmdldFN0cmluZ0J5S2V5AQIMY29uZl9hZG1pbl8xAQ9nZXRJbnRlZ2VyQnlLZXkBA2tleQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQNrZXkAAAEPZ2V0Qm9vbGVhbkJ5S2V5AQNrZXkJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwUDa2V5BwALZGFwcFJ1bm5pbmcJAQt2YWx1ZU9yRWxzZQIJAJsIAgUIdXNlckRhcHACFGNvbmZfZGFwcF9pc19ydW5uaW5nBgAObWFpbnRlbmFuY2VNU0cJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUIdXNlckRhcHACFGNvbmZfbWFpbnRlbmFuY2VfbXNnAgAADXVzZXJTdXNwZW5kZWQCCVNVU1BFTkRFRAAQdXNlclVucmVnaXN0ZXJlZAIMVU5SRUdJU1RFUkVEAQt2YWxpZGF0ZUNJRAEDY2lkAwkBCGNvbnRhaW5zAgUDY2lkAgEvAwMJAGYCAEwJALECAQUDY2lkCQAAAgkAsQIBCQCRAwIJALUJAgUDY2lkAgEvAAAAOwcJAGYCABAJALECAQkAkQMCCQC1CQIFA2NpZAIBLwABBwcAB3NpZ25DdXQAAgENa2V5VXNlclN0YXR1cwEGY2FsbGVyCQCsAgICDHVzZXJfc3RhdHVzXwUGY2FsbGVyARZrZXlFdmVudE93bmVyQnlFdmVudElkAQdldmVudElkCQCsAgICEGdldF9ldmVudF9vd25lcl8FB2V2ZW50SWQBEWtleUV2ZW50QWRkZWREYXRlAgZjYWxsZXIHZXZlbnRJZAkArAICCQCsAgIJAKwCAgIQZXZlbnRfYWRkZWREYXRlXwUHZXZlbnRJZAIBXwUGY2FsbGVyAQxrZXlFdmVudERhdGUCBmNhbGxlcgdldmVudElkCQCsAgIJAKwCAgkArAICAgtldmVudF9kYXRlXwUHZXZlbnRJZAIBXwUGY2FsbGVyAQxrZXlFdmVudE5hbWUCBmNhbGxlcgdldmVudElkCQCsAgIJAKwCAgkArAICAgtldmVudF9uYW1lXwUHZXZlbnRJZAIBXwUGY2FsbGVyAQxrZXlFdmVudERlc2MCBmNhbGxlcgdldmVudElkCQCsAgIJAKwCAgkArAICAgtldmVudF9kZXNjXwUHZXZlbnRJZAIBXwUGY2FsbGVyARJrZXlFdmVudERpc3BsYXlDaWQCBmNhbGxlcgdldmVudElkCQCsAgIJAKwCAgkArAICAhFldmVudF9kaXNwbGF5Q2lkXwUHZXZlbnRJZAIBXwUGY2FsbGVyAQxrZXlFdmVudFRhZ3MCBmNhbGxlcgdldmVudElkCQCsAgIJAKwCAgkArAICAgtldmVudF90YWdzXwUHZXZlbnRJZAIBXwUGY2FsbGVyAQxrZXlFdmVudEZsYWcCBmNhbGxlcgdldmVudElkCQCsAgIJAKwCAgkArAICAgtldmVudF9mbGFnXwUHZXZlbnRJZAIBXwUGY2FsbGVyAQxrZXlFdmVudE5vdGUCBmNhbGxlcgdldmVudElkCQCsAgIJAKwCAgkArAICAgtldmVudF9ub3RlXwUHZXZlbnRJZAIBXwUGY2FsbGVyAQ9rZXlFdmVudENyYXdsZXICBmNhbGxlcgdldmVudElkCQCsAgIJAKwCAgkArAICAhFldmVudF9jcmF3bGVyQ2lkXwUHZXZlbnRJZAIBXwUGY2FsbGVyARhrZXlFdmVudFRvdGFsVGlja2V0VHlwZXMCBmNhbGxlcgdldmVudElkCQCsAgIJAKwCAgkArAICAhdldmVudF90b3RhbFRpY2tldFR5cGVzXwUHZXZlbnRJZAIBXwUGY2FsbGVyARprZXlFdmVudFRvdGFsVGlja2V0c0lzc3VlZAIGY2FsbGVyB2V2ZW50SWQJAKwCAgkArAICCQCsAgICEmV2ZW50X3RvdGFsSXNzdWVkXwUHZXZlbnRJZAIBXwUGY2FsbGVyARBrZXlFdmVudENhbmNlbGVkAgZjYWxsZXIHZXZlbnRJZAkArAICCQCsAgIJAKwCAgIPZXZlbnRfY2FuY2VsZWRfBQdldmVudElkAgFfBQZjYWxsZXIBFmtleUV2ZW50Q2FuY2VsZWRSZWFzb24CBmNhbGxlcgdldmVudElkCQCsAgIJAKwCAgkArAICAhVldmVudF9jYW5jZWxlZFJlYXNvbl8FB2V2ZW50SWQCAV8FBmNhbGxlcgENa2V5VGlja2V0TmFtZQMGY2FsbGVyB2V2ZW50SWQIdGlja2V0SWQJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAgx0aWNrZXRfbmFtZV8FB2V2ZW50SWQCAV8FBmNhbGxlcgIBXwUIdGlja2V0SWQBDWtleVRpY2tldERlc2MDBmNhbGxlcgdldmVudElkCHRpY2tldElkCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIMdGlja2V0X2Rlc2NfBQdldmVudElkAgFfBQZjYWxsZXICAV8FCHRpY2tldElkAQ5rZXlUaWNrZXRQcmljZQMGY2FsbGVyB2V2ZW50SWQIdGlja2V0SWQJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAg10aWNrZXRfcHJpY2VfBQdldmVudElkAgFfBQZjYWxsZXICAV8FCHRpY2tldElkAQ1rZXlUaWNrZXREYXRlAwZjYWxsZXIHZXZlbnRJZAh0aWNrZXRJZAkArAICCQCsAgIJAKwCAgkArAICCQCsAgICDHRpY2tldF9kYXRlXwUHZXZlbnRJZAIBXwUGY2FsbGVyAgFfBQh0aWNrZXRJZAEVa2V5VGlja2V0TWF4QXZhaWxhYmxlAwZjYWxsZXIHZXZlbnRJZAh0aWNrZXRJZAkArAICCQCsAgIJAKwCAgkArAICCQCsAgICFHRpY2tldF9tYXhBdmFpbGFibGVfBQdldmVudElkAgFfBQZjYWxsZXICAV8FCHRpY2tldElkAQ1rZXlUaWNrZXRTb2xkAwZjYWxsZXIHZXZlbnRJZAh0aWNrZXRJZAkArAICCQCsAgIJAKwCAgkArAICCQCsAgICDHRpY2tldF9zb2xkXwUHZXZlbnRJZAIBXwUGY2FsbGVyAgFfBQh0aWNrZXRJZAEPa2V5VGlja2V0T25TYWxlAwZjYWxsZXIHZXZlbnRJZAh0aWNrZXRJZAkArAICCQCsAgIJAKwCAgkArAICCQCsAgICDnRpY2tldF9vblNhbGVfBQdldmVudElkAgFfBQZjYWxsZXICAV8FCHRpY2tldElkARNrZXlUaWNrZXRBbW91bnRVc2VkAwZjYWxsZXIHZXZlbnRJZAh0aWNrZXRJZAkArAICCQCsAgIJAKwCAgkArAICCQCsAgICEnRpY2tldF9hbW91bnRVc2VkXwUHZXZlbnRJZAIBXwUGY2FsbGVyAgFfBQh0aWNrZXRJZAEPa2V5VGlja2V0TWF4VXNlAwZjYWxsZXIHZXZlbnRJZAh0aWNrZXRJZAkArAICCQCsAgIJAKwCAgkArAICCQCsAgICDnRpY2tldF9tYXhVc2VfBQdldmVudElkAgFfBQZjYWxsZXICAV8FCHRpY2tldElkARRrZXlUaWNrZXRUb3RhbElzc3VlZAMGY2FsbGVyB2V2ZW50SWQIdGlja2V0SWQJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAhN0aWNrZXRfdG90YWxJc3N1ZWRfBQdldmVudElkAgFfBQZjYWxsZXICAV8FCHRpY2tldElkAQ52YWxpZGF0ZVN0cmluZwIDc3RyA21heAMJAAACCQCxAgEFA3N0cgAACQACAQIYRmllbGQgY2Fubm90IGJlIGlzIGVtcHR5AwkAZgIJALECAQUDc3RyBQNtYXgJAAIBCQCsAgIFA3N0cgIMIGlzIHRvbyBsb25nBgELdmFsaWRhdGVJbnQBA251bQkAZgIAAAUDbnVtARZnZXRFdmVudE93bmVyQnlFdmVudElkAQdldmVudElkCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMJARZrZXlFdmVudE93bmVyQnlFdmVudElkAQUHZXZlbnRJZAIAAQx2YWxpZGF0ZVVzZXIBBmNhbGxlcgQKdXNlclN0YXR1cwkBC3ZhbHVlT3JFbHNlAgkAnQgCBQh1c2VyRGFwcAkBDWtleVVzZXJTdGF0dXMBBQZjYWxsZXIFEHVzZXJVbnJlZ2lzdGVyZWQDCQAAAgUKdXNlclN0YXR1cwUQdXNlclVucmVnaXN0ZXJlZAIuUmVnaXN0ZXIgdGhpcyBhY2NvdW50IGZpcnN0IHdpdGggIkFjY291bnQiIHRhYgMJAAACBQp1c2VyU3RhdHVzBQ11c2VyU3VzcGVuZGVkAhFBY2NvdW50IHN1c3BlbmRlZAIAARF2YWxpZGF0ZUV2ZW50RGF0YQYGY2FsbGVyCmNpZERpc3BsYXkEbmFtZQtkZXNjcmlwdGlvbgR0YWdzBGRhdGUECWNoZWNrVXNlcgkBDHZhbGlkYXRlVXNlcgEFBmNhbGxlcgMJAQIhPQIFCWNoZWNrVXNlcgIACQACAQUJY2hlY2tVc2VyAwkAAAIJALECAQUKY2lkRGlzcGxheQAACQACAQIbRGlzcGxheSBDSUQgY2Fubm90IGJlIGVtcHR5AwkBASEBCQELdmFsaWRhdGVDSUQBBQpjaWREaXNwbGF5CQACAQIQUHJvYmxlbSB3aXRoIENJRAMJAQEhAQkBDnZhbGlkYXRlU3RyaW5nAgUEbmFtZQDIAQkAAgECEjEwMCBDaGFyLiBtYXggbmFtZQMJAQEhAQkBDnZhbGlkYXRlU3RyaW5nAgULZGVzY3JpcHRpb24A6AcJAAIBAhoxMDAwIENoYXIuIG1heCBkZXNjcmlwdGlvbgMJAQEhAQkBDnZhbGlkYXRlU3RyaW5nAgUEZGF0ZQDoBwkAAgECEzEwMDAgQ2hhci4gbWF4IGRhdGUDCQBmAgkAkAMBCQC1CQIFBHRhZ3MCASwABQkAAgECCzUgdGFncyBtYXguAgABEnZhbGlkYXRlVGlja2V0RGF0YQcHZXZlbnRJZAZjYWxsZXIEbmFtZQtkZXNjcmlwdGlvbgVwcmljZQxtYXhBdmFpbGFibGUGbWF4VXNlBAljaGVja1VzZXIJAQx2YWxpZGF0ZVVzZXIBBQZjYWxsZXIDCQECIT0CBQljaGVja1VzZXICAAkAAgEFCWNoZWNrVXNlcgMJAQEhAQkBDnZhbGlkYXRlU3RyaW5nAgUEbmFtZQDIAQkAAgECEjEwMCBDaGFyLiBtYXggbmFtZQMJAQEhAQkBDnZhbGlkYXRlU3RyaW5nAgULZGVzY3JpcHRpb24A6AcJAAIBAhoxMDAwIENoYXIuIG1heCBkZXNjcmlwdGlvbgMDAwkBC3ZhbGlkYXRlSW50AQUFcHJpY2UGCQELdmFsaWRhdGVJbnQBBQZtYXhVc2UGCQELdmFsaWRhdGVJbnQBBQxtYXhBdmFpbGFibGUJAAIBAhRQb3NpdGl2ZSBhbW91bnQgb25seQMJAQEhAQkBDnZhbGlkYXRlU3RyaW5nAgULZGVzY3JpcHRpb24A6AcJAAIBAhoxMDAwIENoYXIuIG1heCBkZXNjcmlwdGlvbgIAAQxpZENhbGxlckRhdGUBAWkDCQEBIQEFC2RhcHBSdW5uaW5nCQACAQUObWFpbnRlbmFuY2VNU0cJAJUKAwkA2AQBCAUBaQ10cmFuc2FjdGlvbklkCQDYBAEICAUBaQZjYWxsZXIFYnl0ZXMIBQlsYXN0QmxvY2sJdGltZXN0YW1wAQlpc1BheW1lbnQBAWkDCQAAAgkAkAMBCAUBaQhwYXltZW50cwAACQACAQITTm8gcGF5bWVudCBhdHRhY2hlZAQHcGF5bWVudAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwAABAZhbW91bnQJAQV2YWx1ZQEIBQdwYXltZW50BmFtb3VudAkAlAoCBQdwYXltZW50BQZhbW91bnQBFHZhbGlkYXRlUHJpY2VBc3NldElkAwFpDHByaWNlQXNzZXRJZAxhcnR3b3JrUHJpY2UECyR0MDY0ODM2NTE5CQEJaXNQYXltZW50AQUBaQQHcGF5bWVudAgFCyR0MDY0ODM2NTE5Al8xBAZhbW91bnQIBQskdDA2NDgzNjUxOQJfMgMJAQEhAQkBCWlzRGVmaW5lZAEIBQdwYXltZW50B2Fzc2V0SWQJAAIBAhRXcm9uZyBhc3NldCBhdHRhY2hlZAQHYXNzZXRJZAMDCQBmAgkAsQIBBQxwcmljZUFzc2V0SWQAAAkAAAIJANgEAQkBBXZhbHVlAQgFB3BheW1lbnQHYXNzZXRJZAUMcHJpY2VBc3NldElkBwgFB3BheW1lbnQHYXNzZXRJZAkAAgECFFdyb25nIGFzc2V0IGF0dGFjaGVkAwkBAiE9AgUMYXJ0d29ya1ByaWNlBQZhbW91bnQJAAIBAhpQYXltZW50IGFtb3VudCBkb24ndCBtYXRjaAkAlAoCBQZhbW91bnQFB2Fzc2V0SWQBDGlzRXZlbnRPd25lcgIHZXZlbnRJZAZjYWxsZXIECmV2ZW50T3duZXIJARZnZXRFdmVudE93bmVyQnlFdmVudElkAQUHZXZlbnRJZAMJAAACBQpldmVudE93bmVyAgAJAAIBAg9FdmVudCBub3QgZm91bmQJAAACBQpldmVudE93bmVyBQZjYWxsZXIBC3RpY2tldEV4aXN0AwZjYWxsZXIHZXZlbnRJZAh0aWNrZXRJZAQGdGlja2V0CQEOZ2V0U3RyaW5nQnlLZXkBCQENa2V5VGlja2V0TmFtZQMFBmNhbGxlcgUHZXZlbnRJZAUIdGlja2V0SWQJAQIhPQIJALECAQUGdGlja2V0AAABD2V2ZW50SXNDYW5jZWxlZAIGaXNzdWVyB2V2ZW50SWQJAQ9nZXRCb29sZWFuQnlLZXkBCQEQa2V5RXZlbnRDYW5jZWxlZAIFBmlzc3VlcgUHZXZlbnRJZA0GaW52b2tlAQdzZXRDb25mAgNrZXkDdmFsBAZjYWxsZXIJAKUIAQgFBmludm9rZQZjYWxsZXIDCQEPY29udGFpbnNFbGVtZW50AgkAzAgCBQVjaHJpcwkAzAgCCQClCAEFBHRoaXMFA25pbAUGY2FsbGVyAwkBCGNvbnRhaW5zAgUDa2V5AgVjb25mXwkAzAgCCQELU3RyaW5nRW50cnkCBQNrZXkFA3ZhbAUDbmlsCQACAQIgRW50cmllcyBzdGFydGluZyB3aXRoIGNvbmZfIG9ubHkJAAIBAiJZb3UgYXJlIG5vdCBhbGxvd2VkIHRvIGNoYW5nZSB0aGlzAWkBCGFkZEV2ZW50BgRuYW1lC2Rlc2NyaXB0aW9uBHRhZ3MKY2lkRGlzcGxheQdjcmF3bGVyBGRhdGUECyR0MDc4NDg3ODk3CQEMaWRDYWxsZXJEYXRlAQUBaQQHZXZlbnRJZAgFCyR0MDc4NDg3ODk3Al8xBAZjYWxsZXIIBQskdDA3ODQ4Nzg5NwJfMgQJYWRkZWREYXRlCAULJHQwNzg0ODc4OTcCXzMECWNoZWNrVXNlcgkBDHZhbGlkYXRlVXNlcgEFBmNhbGxlcgMJAQIhPQIFCWNoZWNrVXNlcgIACQACAQUJY2hlY2tVc2VyBA12YWxpZGF0ZUV2ZW50CQERdmFsaWRhdGVFdmVudERhdGEGBQZjYWxsZXIFCmNpZERpc3BsYXkFBG5hbWUFC2Rlc2NyaXB0aW9uBQR0YWdzBQRkYXRlAwkBAiE9AgUNdmFsaWRhdGVFdmVudAIACQACAQIVU29tZXRoaW5nIHdlbnQgd3JvbmchCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQERa2V5RXZlbnRBZGRlZERhdGUCBQZjYWxsZXIFB2V2ZW50SWQFCWFkZGVkRGF0ZQkAzAgCCQELU3RyaW5nRW50cnkCCQEMa2V5RXZlbnREYXRlAgUGY2FsbGVyBQdldmVudElkBQRkYXRlCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQxrZXlFdmVudE5hbWUCBQZjYWxsZXIFB2V2ZW50SWQFBG5hbWUJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDGtleUV2ZW50RGVzYwIFBmNhbGxlcgUHZXZlbnRJZAULZGVzY3JpcHRpb24JAMwIAgkBC1N0cmluZ0VudHJ5AgkBEmtleUV2ZW50RGlzcGxheUNpZAIFBmNhbGxlcgUHZXZlbnRJZAUKY2lkRGlzcGxheQkAzAgCCQELU3RyaW5nRW50cnkCCQEMa2V5RXZlbnRUYWdzAgUGY2FsbGVyBQdldmVudElkBQR0YWdzCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ9rZXlFdmVudENyYXdsZXICBQZjYWxsZXIFB2V2ZW50SWQFB2NyYXdsZXIJAMwIAgkBDEludGVnZXJFbnRyeQIJARprZXlFdmVudFRvdGFsVGlja2V0c0lzc3VlZAIFBmNhbGxlcgUHZXZlbnRJZAAACQDMCAIJAQxCb29sZWFuRW50cnkCCQEQa2V5RXZlbnRDYW5jZWxlZAIFBmNhbGxlcgUHZXZlbnRJZAcJAMwIAgkBC1N0cmluZ0VudHJ5AgkBFmtleUV2ZW50T3duZXJCeUV2ZW50SWQBBQdldmVudElkBQZjYWxsZXIFA25pbAFpAQllZGl0RXZlbnQHB2V2ZW50SWQEbmFtZQtkZXNjcmlwdGlvbgR0YWdzCmNpZERpc3BsYXkHY3Jhd2xlcgRkYXRlAwkBASEBBQtkYXBwUnVubmluZwkAAgEFDm1haW50ZW5hbmNlTVNHBAZjYWxsZXIJANgEAQgIBQFpBmNhbGxlcgVieXRlcwQJY2hlY2tVc2VyCQEMdmFsaWRhdGVVc2VyAQUGY2FsbGVyAwkBAiE9AgUJY2hlY2tVc2VyAgAJAAIBBQljaGVja1VzZXIEDXZhbGlkYXRlRXZlbnQJARF2YWxpZGF0ZUV2ZW50RGF0YQYFBmNhbGxlcgUKY2lkRGlzcGxheQUEbmFtZQULZGVzY3JpcHRpb24FBHRhZ3MFBGRhdGUDCQECIT0CBQ12YWxpZGF0ZUV2ZW50AgAJAAIBAhVTb21ldGhpbmcgd2VudCB3cm9uZyEECmVudHJ5RXhpc3QJAQ5nZXRTdHJpbmdCeUtleQEJAQxrZXlFdmVudE5hbWUCBQZjYWxsZXIFB2V2ZW50SWQDCQAAAgUKZW50cnlFeGlzdAIACQACAQIPRW50cnkgbm90IGZvdW5kBARmbGFnCQEOZ2V0U3RyaW5nQnlLZXkBCQEMa2V5RXZlbnRGbGFnAgUGY2FsbGVyBQdldmVudElkAwkAAAIFBGZsYWcCB0lMTEVHQUwJAAIBAhtDYW5ub3QgdXBkYXRlIElMTEVHQUwgRXZlbnQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDGtleUV2ZW50TmFtZQIFBmNhbGxlcgUHZXZlbnRJZAUEbmFtZQkAzAgCCQELU3RyaW5nRW50cnkCCQEMa2V5RXZlbnREYXRlAgUGY2FsbGVyBQdldmVudElkBQRkYXRlCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQxrZXlFdmVudERlc2MCBQZjYWxsZXIFB2V2ZW50SWQFC2Rlc2NyaXB0aW9uCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQxrZXlFdmVudFRhZ3MCBQZjYWxsZXIFB2V2ZW50SWQFBHRhZ3MJAMwIAgkBC1N0cmluZ0VudHJ5AgkBD2tleUV2ZW50Q3Jhd2xlcgIFBmNhbGxlcgUHZXZlbnRJZAUHY3Jhd2xlcgUDbmlsAWkBC2RlbGV0ZUV2ZW50AQdldmVudElkBA0kdDAxMDExNzEwMTYxCQEMaWRDYWxsZXJEYXRlAQUBaQQCaWQIBQ0kdDAxMDExNzEwMTYxAl8xBAZjYWxsZXIIBQ0kdDAxMDExNzEwMTYxAl8yBAlhZGRlZERhdGUIBQ0kdDAxMDExNzEwMTYxAl8zBAljaGVja1VzZXIJAQx2YWxpZGF0ZVVzZXIBBQZjYWxsZXIDCQECIT0CBQljaGVja1VzZXICAAkAAgEFCWNoZWNrVXNlcgMJAQEhAQkBDGlzRXZlbnRPd25lcgIFB2V2ZW50SWQFBmNhbGxlcgkAAgECI1lvdSBhcmUgbm90IHRoZSBvd25lciBvZiB0aGlzIGV2ZW50BA1ldmVudFRvdGFsTkZUCQEPZ2V0SW50ZWdlckJ5S2V5AQkBGmtleUV2ZW50VG90YWxUaWNrZXRzSXNzdWVkAgUGY2FsbGVyBQdldmVudElkAwkBAiE9AgUNZXZlbnRUb3RhbE5GVAAACQACAQItQ2Fubm90IGRlbGV0ZSBldmVudCB3aXRoIGFscmVhZHkgc29sZCB0aWNrZXRzBBd0b3RhbFRpY2tldFR5cGVGb3JFdmVudAkBD2dldEludGVnZXJCeUtleQEJARhrZXlFdmVudFRvdGFsVGlja2V0VHlwZXMCBQZjYWxsZXIFB2V2ZW50SWQDCQBmAgUXdG90YWxUaWNrZXRUeXBlRm9yRXZlbnQAAAkAAgECGERlbGV0ZSBhbGwgdGlja2V0cyBmaXJzdAkAzAgCCQELRGVsZXRlRW50cnkBCQERa2V5RXZlbnRBZGRlZERhdGUCBQZjYWxsZXIFB2V2ZW50SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBDGtleUV2ZW50RGF0ZQIFBmNhbGxlcgUHZXZlbnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEMa2V5RXZlbnROYW1lAgUGY2FsbGVyBQdldmVudElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQxrZXlFdmVudERlc2MCBQZjYWxsZXIFB2V2ZW50SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBEmtleUV2ZW50RGlzcGxheUNpZAIFBmNhbGxlcgUHZXZlbnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEMa2V5RXZlbnRUYWdzAgUGY2FsbGVyBQdldmVudElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQ9rZXlFdmVudENyYXdsZXICBQZjYWxsZXIFB2V2ZW50SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBGmtleUV2ZW50VG90YWxUaWNrZXRzSXNzdWVkAgUGY2FsbGVyBQdldmVudElkCQDMCAIJAQtEZWxldGVFbnRyeQEJARBrZXlFdmVudENhbmNlbGVkAgUGY2FsbGVyBQdldmVudElkCQDMCAIJAQtEZWxldGVFbnRyeQEJARZrZXlFdmVudE93bmVyQnlFdmVudElkAQUHZXZlbnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEYa2V5RXZlbnRUb3RhbFRpY2tldFR5cGVzAgUGY2FsbGVyBQdldmVudElkBQNuaWwBaQELY2FuY2VsRXZlbnQCB2V2ZW50SWQGcmVhc29uBA0kdDAxMTUwMjExNTQ2CQEMaWRDYWxsZXJEYXRlAQUBaQQCaWQIBQ0kdDAxMTUwMjExNTQ2Al8xBAZjYWxsZXIIBQ0kdDAxMTUwMjExNTQ2Al8yBAlhZGRlZERhdGUIBQ0kdDAxMTUwMjExNTQ2Al8zBAljaGVja1VzZXIJAQx2YWxpZGF0ZVVzZXIBBQZjYWxsZXIDCQECIT0CBQljaGVja1VzZXICAAkAAgEFCWNoZWNrVXNlcgMJAQEhAQkBDGlzRXZlbnRPd25lcgIFB2V2ZW50SWQFBmNhbGxlcgkAAgECI1lvdSBhcmUgbm90IHRoZSBvd25lciBvZiB0aGlzIGV2ZW50CQDMCAIJAQxCb29sZWFuRW50cnkCCQEQa2V5RXZlbnRDYW5jZWxlZAIFBmNhbGxlcgUHZXZlbnRJZAYJAMwIAgkBC1N0cmluZ0VudHJ5AgkBFmtleUV2ZW50Q2FuY2VsZWRSZWFzb24CBQZjYWxsZXIFB2V2ZW50SWQFBnJlYXNvbgUDbmlsAWkBCWZsYWdFdmVudAQHZXZlbnRJZARhZGRyBGZsYWcEbm90ZQQNJHQwMTE5ODExMjAxNAkBDGlkQ2FsbGVyRGF0ZQEFAWkEAmlkCAUNJHQwMTE5ODExMjAxNAJfMQQGY2FsbGVyCAUNJHQwMTE5ODExMjAxNAJfMgMJAQ9jb250YWluc0VsZW1lbnQCCQDMCAIFBWNocmlzCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQZjYWxsZXIDCQEPY29udGFpbnNFbGVtZW50AgkAzAgCAgAJAMwIAgIPQ0hBTkdFX1JFUVVJUkVECQDMCAICB0ZMQUdHRUQJAMwIAgIHSUxMRUdBTAUDbmlsBQRmbGFnCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQxrZXlFdmVudEZsYWcCBQRhZGRyBQdldmVudElkBQRmbGFnCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQxrZXlFdmVudE5vdGUCBQRhZGRyBQdldmVudElkBQRub3RlBQNuaWwJAAIBCQCsAgICDlVua25vdyBzdGF0dXMgBQRmbGFnCQACAQITWW91IGFyZSBub3QgYWxsb3dlZAFpAQlhZGRUaWNrZXQGB2V2ZW50SWQEbmFtZQtkZXNjcmlwdGlvbgVwcmljZQxtYXhBdmFpbGFibGUGTWF4VXNlBA0kdDAxMjUxNTEyNTU1CQEMaWRDYWxsZXJEYXRlAQUBaQQCaWQIBQ0kdDAxMjUxNTEyNTU1Al8xBAZjYWxsZXIIBQ0kdDAxMjUxNTEyNTU1Al8yBARkYXRlCAUNJHQwMTI1MTUxMjU1NQJfMwQJY2hlY2tVc2VyCQEMdmFsaWRhdGVVc2VyAQUGY2FsbGVyAwkBAiE9AgUJY2hlY2tVc2VyAgAJAAIBBQljaGVja1VzZXIDCQEPZXZlbnRJc0NhbmNlbGVkAgUGY2FsbGVyBQdldmVudElkCQACAQIYRXZlbnQgaGF2ZSBiZWVuIGNhbmNlbGVkAwkBASEBCQEMaXNFdmVudE93bmVyAgUHZXZlbnRJZAUGY2FsbGVyCQACAQIjWW91IGFyZSBub3QgdGhlIG93bmVyIG9mIHRoaXMgZXZlbnQEDnZhbGlkYXRlVGlja2V0CQESdmFsaWRhdGVUaWNrZXREYXRhBwUHZXZlbnRJZAUGY2FsbGVyBQRuYW1lBQtkZXNjcmlwdGlvbgUFcHJpY2UFDG1heEF2YWlsYWJsZQUGTWF4VXNlAwkBAiE9AgUOdmFsaWRhdGVUaWNrZXQCAAkAAgECFVNvbWV0aGluZyB3ZW50IHdyb25nIQQXdG90YWxUaWNrZXRUeXBlRm9yRXZlbnQJAQ9nZXRJbnRlZ2VyQnlLZXkBCQEYa2V5RXZlbnRUb3RhbFRpY2tldFR5cGVzAgUGY2FsbGVyBQdldmVudElkCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ1rZXlUaWNrZXROYW1lAwUGY2FsbGVyBQdldmVudElkBQJpZAUEbmFtZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBDWtleVRpY2tldERhdGUDBQZjYWxsZXIFB2V2ZW50SWQFAmlkBQRkYXRlCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ1rZXlUaWNrZXREZXNjAwUGY2FsbGVyBQdldmVudElkBQJpZAULZGVzY3JpcHRpb24JAMwIAgkBDEludGVnZXJFbnRyeQIJAQ5rZXlUaWNrZXRQcmljZQMFBmNhbGxlcgUHZXZlbnRJZAUCaWQFBXByaWNlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEVa2V5VGlja2V0TWF4QXZhaWxhYmxlAwUGY2FsbGVyBQdldmVudElkBQJpZAUMbWF4QXZhaWxhYmxlCQDMCAIJAQxCb29sZWFuRW50cnkCCQEPa2V5VGlja2V0T25TYWxlAwUGY2FsbGVyBQdldmVudElkBQJpZAYJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ9rZXlUaWNrZXRNYXhVc2UDBQZjYWxsZXIFB2V2ZW50SWQFAmlkBQZNYXhVc2UJAMwIAgkBDEludGVnZXJFbnRyeQIJARRrZXlUaWNrZXRUb3RhbElzc3VlZAMFBmNhbGxlcgUHZXZlbnRJZAUCaWQAAAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBGGtleUV2ZW50VG90YWxUaWNrZXRUeXBlcwIFBmNhbGxlcgUHZXZlbnRJZAkAZAIFF3RvdGFsVGlja2V0VHlwZUZvckV2ZW50AAEFA25pbAFpAQplZGl0VGlja2V0Bwh0aWNrZXRJZAdldmVudElkBG5hbWULZGVzY3JpcHRpb24FcHJpY2UMbWF4QXZhaWxhYmxlBm1heFVzZQQNJHQwMTM4OTAxMzkzMAkBDGlkQ2FsbGVyRGF0ZQEFAWkEAmlkCAUNJHQwMTM4OTAxMzkzMAJfMQQGY2FsbGVyCAUNJHQwMTM4OTAxMzkzMAJfMgQEZGF0ZQgFDSR0MDEzODkwMTM5MzACXzMECWNoZWNrVXNlcgkBDHZhbGlkYXRlVXNlcgEFBmNhbGxlcgMJAQIhPQIFCWNoZWNrVXNlcgIACQACAQUJY2hlY2tVc2VyAwkBASEBCQEMaXNFdmVudE93bmVyAgUHZXZlbnRJZAUGY2FsbGVyCQACAQIjWW91IGFyZSBub3QgdGhlIG93bmVyIG9mIHRoaXMgZXZlbnQDCQEBIQEJAQt0aWNrZXRFeGlzdAMFBmNhbGxlcgUHZXZlbnRJZAUIdGlja2V0SWQJAAIBAhBUaWNrZXQgbm90IGZvdW5kBA52YWxpZGF0ZVRpY2tldAkBEnZhbGlkYXRlVGlja2V0RGF0YQcFB2V2ZW50SWQFBmNhbGxlcgUEbmFtZQULZGVzY3JpcHRpb24FBXByaWNlBQxtYXhBdmFpbGFibGUFBm1heFVzZQMJAQIhPQIFDnZhbGlkYXRlVGlja2V0AgAJAAIBAhVTb21ldGhpbmcgd2VudCB3cm9uZyEECnRpY2tldFNvbGQJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBDWtleVRpY2tldFNvbGQDBQZjYWxsZXIFB2V2ZW50SWQFCHRpY2tldElkAAADCQBmAgUKdGlja2V0U29sZAUMbWF4QXZhaWxhYmxlCQACAQI+TWF4IHRpY2tldHMgYXZhaWxhYmxlIGNhbm5vdCBiZSBsb3dlciB0aGFuIGFtb3VudCBhbHJlYWR5IHNvbGQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDWtleVRpY2tldE5hbWUDBQZjYWxsZXIFB2V2ZW50SWQFCHRpY2tldElkBQRuYW1lCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ1rZXlUaWNrZXREZXNjAwUGY2FsbGVyBQdldmVudElkBQh0aWNrZXRJZAULZGVzY3JpcHRpb24JAMwIAgkBDEludGVnZXJFbnRyeQIJAQ5rZXlUaWNrZXRQcmljZQMFBmNhbGxlcgUHZXZlbnRJZAUIdGlja2V0SWQFBXByaWNlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEVa2V5VGlja2V0TWF4QXZhaWxhYmxlAwUGY2FsbGVyBQdldmVudElkBQh0aWNrZXRJZAUMbWF4QXZhaWxhYmxlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEPa2V5VGlja2V0TWF4VXNlAwUGY2FsbGVyBQdldmVudElkBQJpZAUGbWF4VXNlBQNuaWwBaQEPcGF1c2VUaWNrZXRTYWxlAwdldmVudElkCHRpY2tldElkBnN0YXR1cwQNJHQwMTUwNjIxNTEwMgkBDGlkQ2FsbGVyRGF0ZQEFAWkEAmlkCAUNJHQwMTUwNjIxNTEwMgJfMQQGY2FsbGVyCAUNJHQwMTUwNjIxNTEwMgJfMgQEZGF0ZQgFDSR0MDE1MDYyMTUxMDICXzMECWNoZWNrVXNlcgkBDHZhbGlkYXRlVXNlcgEFBmNhbGxlcgMJAQIhPQIFCWNoZWNrVXNlcgIACQACAQUJY2hlY2tVc2VyAwkBASEBCQEMaXNFdmVudE93bmVyAgUHZXZlbnRJZAUGY2FsbGVyCQACAQIjWW91IGFyZSBub3QgdGhlIG93bmVyIG9mIHRoaXMgZXZlbnQDCQEBIQEJAQt0aWNrZXRFeGlzdAMFBmNhbGxlcgUHZXZlbnRJZAUIdGlja2V0SWQJAAIBAhBUaWNrZXQgbm90IGZvdW5kCQDMCAIJAQxCb29sZWFuRW50cnkCCQEPa2V5VGlja2V0T25TYWxlAwUGY2FsbGVyBQdldmVudElkBQh0aWNrZXRJZAUGc3RhdHVzBQNuaWwBaQEMZGVsZXRlVGlja2V0Agh0aWNrZXRJZAdldmVudElkBA0kdDAxNTU2NTE1NjA1CQEMaWRDYWxsZXJEYXRlAQUBaQQCaWQIBQ0kdDAxNTU2NTE1NjA1Al8xBAZjYWxsZXIIBQ0kdDAxNTU2NTE1NjA1Al8yBARkYXRlCAUNJHQwMTU1NjUxNTYwNQJfMwQJY2hlY2tVc2VyCQEMdmFsaWRhdGVVc2VyAQUGY2FsbGVyAwkBAiE9AgUJY2hlY2tVc2VyAgAJAAIBBQljaGVja1VzZXIDCQEBIQEJAQxpc0V2ZW50T3duZXICBQdldmVudElkBQZjYWxsZXIJAAIBAiNZb3UgYXJlIG5vdCB0aGUgb3duZXIgb2YgdGhpcyBldmVudAMJAQEhAQkBC3RpY2tldEV4aXN0AwUGY2FsbGVyBQdldmVudElkBQh0aWNrZXRJZAkAAgECEFRpY2tldCBub3QgZm91bmQECmFtb3VudFNvbGQJAQ9nZXRJbnRlZ2VyQnlLZXkBCQENa2V5VGlja2V0U29sZAMFBmNhbGxlcgUHZXZlbnRJZAUIdGlja2V0SWQDCQECIT0CBQphbW91bnRTb2xkAAAJAAIBAiZDYW5ub3QgZGVsZXRlIHRpY2tldCB0aGF0IHNvbGQgYWxyZWFkeQQXdG90YWxUaWNrZXRUeXBlRm9yRXZlbnQJAQ9nZXRJbnRlZ2VyQnlLZXkBCQEYa2V5RXZlbnRUb3RhbFRpY2tldFR5cGVzAgUGY2FsbGVyBQdldmVudElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQ1rZXlUaWNrZXROYW1lAwUGY2FsbGVyBQdldmVudElkBQh0aWNrZXRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQENa2V5VGlja2V0RGF0ZQMFBmNhbGxlcgUHZXZlbnRJZAUIdGlja2V0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBDWtleVRpY2tldERlc2MDBQZjYWxsZXIFB2V2ZW50SWQFCHRpY2tldElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQ5rZXlUaWNrZXRQcmljZQMFBmNhbGxlcgUHZXZlbnRJZAUIdGlja2V0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBFWtleVRpY2tldE1heEF2YWlsYWJsZQMFBmNhbGxlcgUHZXZlbnRJZAUIdGlja2V0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBD2tleVRpY2tldE9uU2FsZQMFBmNhbGxlcgUHZXZlbnRJZAUIdGlja2V0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBD2tleVRpY2tldE1heFVzZQMFBmNhbGxlcgUHZXZlbnRJZAUIdGlja2V0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBFGtleVRpY2tldFRvdGFsSXNzdWVkAwUGY2FsbGVyBQdldmVudElkBQh0aWNrZXRJZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBGGtleUV2ZW50VG90YWxUaWNrZXRUeXBlcwIFBmNhbGxlcgUHZXZlbnRJZAkAZQIFF3RvdGFsVGlja2V0VHlwZUZvckV2ZW50AAEFA25pbAFpAQlidXlUaWNrZXQDCHRpY2tldElkB2V2ZW50SWQGaXNzdWVyBA0kdDAxNjgyOTE2ODY3CQEMaWRDYWxsZXJEYXRlAQUBaQQCaWQIBQ0kdDAxNjgyOTE2ODY3Al8xBAZjYWxsZXIIBQ0kdDAxNjgyOTE2ODY3Al8yBARkYXRlCAUNJHQwMTY4MjkxNjg2NwJfMwQIdG90YWxORlQJAQt2YWx1ZU9yRWxzZQIJAQ9nZXRJbnRlZ2VyQnlLZXkBAhR0b3RhbF90aWNrZXRzX2lzc3VlZAAAAwkBASEBCQEMaXNFdmVudE93bmVyAgUHZXZlbnRJZAUGaXNzdWVyCQACAQIfRXZlbnQgSUQgYW5kIElzc3VlciBkb24ndCBtYXRjaAMJAQEhAQkBC3RpY2tldEV4aXN0AwUGaXNzdWVyBQdldmVudElkBQh0aWNrZXRJZAkAAgECEFRpY2tldCBub3QgZm91bmQECWV2ZW50TmFtZQkBDmdldFN0cmluZ0J5S2V5AQkBDGtleUV2ZW50TmFtZQIFBmlzc3VlcgUHZXZlbnRJZAMJAAACBQlldmVudE5hbWUCAAkAAgECEUFydCBkb2Vzbid0IGV4aXN0AwkBD2V2ZW50SXNDYW5jZWxlZAIFBmlzc3VlcgUHZXZlbnRJZAkAAgECGEV2ZW50IGhhdmUgYmVlbiBjYW5jZWxlZAQIaXNPblNhbGUJAQ9nZXRCb29sZWFuQnlLZXkBCQEPa2V5VGlja2V0T25TYWxlAwUGaXNzdWVyBQdldmVudElkBQh0aWNrZXRJZAMJAQEhAQUIaXNPblNhbGUJAAIBAhRUaWNrZXRzIG5vdCBmb3Igc2FsZQQKYW1vdW50U29sZAkBD2dldEludGVnZXJCeUtleQEJAQ1rZXlUaWNrZXRTb2xkAwUGaXNzdWVyBQdldmVudElkBQh0aWNrZXRJZAQLdGlja2V0UHJpY2UJAQ9nZXRJbnRlZ2VyQnlLZXkBCQEOa2V5VGlja2V0UHJpY2UDBQZpc3N1ZXIFB2V2ZW50SWQFCHRpY2tldElkBAxwcmljZUFzc2V0SWQJANgEAQULc2lnbkFzc2V0SWQEDSR0MDE3NzEzMTc3ODcJARR2YWxpZGF0ZVByaWNlQXNzZXRJZAMFAWkFDHByaWNlQXNzZXRJZAULdGlja2V0UHJpY2UEBmFtb3VudAgFDSR0MDE3NzEzMTc3ODcCXzEEB2Fzc2V0SWQIBQ0kdDAxNzcxMzE3Nzg3Al8yBAptYXhDYW5TZWxsCQEPZ2V0SW50ZWdlckJ5S2V5AQkBFWtleVRpY2tldE1heEF2YWlsYWJsZQMFBmlzc3VlcgUHZXZlbnRJZAUIdGlja2V0SWQEDWFtb3VudEZvclNpZ24JAGsDBQZhbW91bnQFB3NpZ25DdXQAZAQSYW1vdW50Rm9yT3JnYW5pemVyCQBlAgUGYW1vdW50BQ1hbW91bnRGb3JTaWduAwkAAAIFCmFtb3VudFNvbGQFCm1heENhblNlbGwJAAIBAgxBcnQgc29sZCBvdXQEDW5ld0Ftb3VudFNvbGQJAGQCBQphbW91bnRTb2xkAAEECWlzc3VlTWV0YQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICC09yZ2FuaXplcjogBQZpc3N1ZXICDCwKIEV2ZW50SUQ6IAUHZXZlbnRJZAINLAogVGlja2V0SUQ6IAUIdGlja2V0SWQCDiwKIEV2ZW50TmFtZTogBQlldmVudE5hbWUCCiwKIElzc3VlOiAJAKQDAQUNbmV3QW1vdW50U29sZAIBLwkApAMBBQptYXhDYW5TZWxsBAhpc3N1ZU5GVAkAwggFCQCsAgICA1NUXwkApAMBCQBkAgUIdG90YWxORlQAAQUJaXNzdWVNZXRhAAEAAAcEBWlkTkZUCQC4CAEFCGlzc3VlTkZUBApzZWxsU3RhdHVzAwkAAAIFDW5ld0Ftb3VudFNvbGQFCm1heENhblNlbGwHBgQKcmVjZWl2ZU5GVAgFAWkGY2FsbGVyBAdzb2xkS2V5CQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAgx0aWNrZXRfc29sZF8JAKQDAQUNbmV3QW1vdW50U29sZAIEX29mXwkApAMBBQptYXhDYW5TZWxsAgFfBQdldmVudElkAgFfBQZpc3N1ZXICAV8FCHRpY2tldElkBAlzb2xkVmFsdWUJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQClCAEFCnJlY2VpdmVORlQCAV8JAKQDAQUEZGF0ZQIBXwUCaWQCAV8JAKQDAQUGYW1vdW50AgFfCQDYBAEFBWlkTkZUBAhzb2xkRGF0YQkBC1N0cmluZ0VudHJ5AgUHc29sZEtleQUJc29sZFZhbHVlBA1ldmVudFRvdGFsTkZUCQEPZ2V0SW50ZWdlckJ5S2V5AQkBGmtleUV2ZW50VG90YWxUaWNrZXRzSXNzdWVkAgUGaXNzdWVyBQdldmVudElkBA50aWNrZXRUb3RhbE5GVAkBD2dldEludGVnZXJCeUtleQEJARRrZXlUaWNrZXRUb3RhbElzc3VlZAMFBmlzc3VlcgUHZXZlbnRJZAUIdGlja2V0SWQEBmJ1eVJlcwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBDWtleVRpY2tldFNvbGQDBQZpc3N1ZXIFB2V2ZW50SWQFCHRpY2tldElkBQ1uZXdBbW91bnRTb2xkCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgIEbmZ0XwkA2AQBBQVpZE5GVAUHc29sZEtleQkAzAgCCQEMSW50ZWdlckVudHJ5AgIQdG90YWxfbmZ0X2lzc3VlZAkAZAIFCHRvdGFsTkZUAAEJAMwIAgkBDEludGVnZXJFbnRyeQIJARprZXlFdmVudFRvdGFsVGlja2V0c0lzc3VlZAIFBmlzc3VlcgUHZXZlbnRJZAkAZAIFDWV2ZW50VG90YWxORlQAAQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBFGtleVRpY2tldFRvdGFsSXNzdWVkAwUGaXNzdWVyBQdldmVudElkBQh0aWNrZXRJZAkAZAIFDnRpY2tldFRvdGFsTkZUAAEJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgICA1NUXwkApAMBCQBkAgUIdG90YWxORlQAAQIIX2Fzc2V0SWQJANgEAQUFaWRORlQJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAQ9rZXlUaWNrZXRPblNhbGUDBQZpc3N1ZXIFB2V2ZW50SWQFCHRpY2tldElkBQpzZWxsU3RhdHVzCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQETa2V5VGlja2V0QW1vdW50VXNlZAMFBmlzc3VlcgUHZXZlbnRJZAUIdGlja2V0SWQAAAkAzAgCBQhpc3N1ZU5GVAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQUGaXNzdWVyBRJhbW91bnRGb3JPcmdhbml6ZXIFB2Fzc2V0SWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUKcmVjZWl2ZU5GVAABBQVpZE5GVAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQULZmVlUmVjZWl2ZXIFDWFtb3VudEZvclNpZ24FB2Fzc2V0SWQFA25pbAkAzAgCBQhzb2xkRGF0YQUGYnV5UmVzAWkBCXVzZVRpY2tldAIHZXZlbnRJZAZpc3N1ZXIEDSR0MDIwMDY2MjAxMDQJAQxpZENhbGxlckRhdGUBBQFpBAJpZAgFDSR0MDIwMDY2MjAxMDQCXzEEBmNhbGxlcggFDSR0MDIwMDY2MjAxMDQCXzIEBGRhdGUIBQ0kdDAyMDA2NjIwMTA0Al8zBA0kdDAyMDExMDIwMTQ2CQEJaXNQYXltZW50AQUBaQQHcGF5bWVudAgFDSR0MDIwMTEwMjAxNDYCXzEEBmFtb3VudAgFDSR0MDIwMTEwMjAxNDYCXzIDCQEBIQEJAQlpc0RlZmluZWQBCAUHcGF5bWVudAdhc3NldElkCQACAQIUV3JvbmcgYXNzZXQgYXR0YWNoZWQECHRpY2tldElkCQDYBAEJAQV2YWx1ZQEIBQdwYXltZW50B2Fzc2V0SWQDCQEBIQEJAQt0aWNrZXRFeGlzdAMFBmlzc3VlcgUHZXZlbnRJZAUIdGlja2V0SWQJAAIBAhBUaWNrZXQgbm90IGZvdW5kBAphbW91bnRVc2VkCQEPZ2V0SW50ZWdlckJ5S2V5AQkBE2tleVRpY2tldEFtb3VudFVzZWQDBQZpc3N1ZXIFB2V2ZW50SWQFCHRpY2tldElkBAxtYXhVc2luZ1RpbWUJAQ9nZXRJbnRlZ2VyQnlLZXkBCQEPa2V5VGlja2V0TWF4VXNlAwUGaXNzdWVyBQdldmVudElkBQh0aWNrZXRJZAMJAAACBQxtYXhVc2luZ1RpbWUFCmFtb3VudFVzZWQJAAIBCQCsAgIJAKwCAgIMVGlja2V0IHVzZWQgCQCkAwEFCmFtb3VudFVzZWQCDiB0aW1lcyBhbHJlYWR5CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQETa2V5VGlja2V0QW1vdW50VXNlZAMFBmlzc3VlcgUHZXZlbnRJZAUIdGlja2V0SWQJAGQCBQphbW91bnRVc2VkAAEJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFBmNhbGxlcgABCAUHcGF5bWVudAdhc3NldElkBQNuaWwBaQELZGVsZXRlRW50cnkBBWVudHJ5BAZjYWxsZXIJAKUIAQgFAWkGY2FsbGVyAwkAAAIFBmNhbGxlcgUFY2hyaXMJAMwIAgkBC0RlbGV0ZUVudHJ5AQUFZW50cnkFA25pbAkAAgECAm5vACdsWIg=", "height": 2290245, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: D18xoxbLqTha7wG2fC3Dy8j8638yL4Wd2HvFYLpsBrFZ Next: none Diff:
OldNewDifferences
398398
399399 @Callable(i)
400400 func pauseTicketSale (eventId,ticketId,status) = {
401- let $t01505915099 = idCallerDate(i)
402- let id = $t01505915099._1
403- let caller = $t01505915099._2
404- let date = $t01505915099._3
401+ let $t01506215102 = idCallerDate(i)
402+ let id = $t01506215102._1
403+ let caller = $t01506215102._2
404+ let date = $t01506215102._3
405405 let checkUser = validateUser(caller)
406406 if ((checkUser != ""))
407407 then throw(checkUser)
408408 else if (!(isEventOwner(eventId, caller)))
409409 then throw("You are not the owner of this event")
410- else [BooleanEntry(keyTicketOnSale(caller, eventId, id), status)]
410+ else if (!(ticketExist(caller, eventId, ticketId)))
411+ then throw("Ticket not found")
412+ else [BooleanEntry(keyTicketOnSale(caller, eventId, ticketId), status)]
411413 }
412414
413415
414416
415417 @Callable(i)
416418 func deleteTicket (ticketId,eventId) = {
417- let $t01547315513 = idCallerDate(i)
418- let id = $t01547315513._1
419- let caller = $t01547315513._2
420- let date = $t01547315513._3
419+ let $t01556515605 = idCallerDate(i)
420+ let id = $t01556515605._1
421+ let caller = $t01556515605._2
422+ let date = $t01556515605._3
421423 let checkUser = validateUser(caller)
422424 if ((checkUser != ""))
423425 then throw(checkUser)
440442
441443 @Callable(i)
442444 func buyTicket (ticketId,eventId,issuer) = {
443- let $t01673716775 = idCallerDate(i)
444- let id = $t01673716775._1
445- let caller = $t01673716775._2
446- let date = $t01673716775._3
445+ let $t01682916867 = idCallerDate(i)
446+ let id = $t01682916867._1
447+ let caller = $t01682916867._2
448+ let date = $t01682916867._3
447449 let totalNFT = valueOrElse(getIntegerByKey("total_tickets_issued"), 0)
448450 if (!(isEventOwner(eventId, issuer)))
449451 then throw("Event ID and Issuer don't match")
463465 let amountSold = getIntegerByKey(keyTicketSold(issuer, eventId, ticketId))
464466 let ticketPrice = getIntegerByKey(keyTicketPrice(issuer, eventId, ticketId))
465467 let priceAssetId = toBase58String(signAssetId)
466- let $t01762117695 = validatePriceAssetId(i, priceAssetId, ticketPrice)
467- let amount = $t01762117695._1
468- let assetId = $t01762117695._2
468+ let $t01771317787 = validatePriceAssetId(i, priceAssetId, ticketPrice)
469+ let amount = $t01771317787._1
470+ let assetId = $t01771317787._2
469471 let maxCanSell = getIntegerByKey(keyTicketMaxAvailable(issuer, eventId, ticketId))
470472 let amountForSign = fraction(amount, signCut, 100)
471473 let amountForOrganizer = (amount - amountForSign)
501503
502504 @Callable(i)
503505 func useTicket (eventId,issuer) = {
504- let $t01997420012 = idCallerDate(i)
505- let id = $t01997420012._1
506- let caller = $t01997420012._2
507- let date = $t01997420012._3
508- let $t02001820054 = isPayment(i)
509- let payment = $t02001820054._1
510- let amount = $t02001820054._2
506+ let $t02006620104 = idCallerDate(i)
507+ let id = $t02006620104._1
508+ let caller = $t02006620104._2
509+ let date = $t02006620104._3
510+ let $t02011020146 = isPayment(i)
511+ let payment = $t02011020146._1
512+ let amount = $t02011020146._2
511513 if (!(isDefined(payment.assetId)))
512514 then throw("Wrong asset attached")
513515 else {
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let VERSION = "1.0.0"
55
66 func getStringByKey (key) = valueOrElse(getString(this, key), "")
77
88
99 let userDapp = value(addressFromString(getStringByKey("conf_users_dapp")))
1010
1111 let feeReceiver = getStringByKey("conf_fee_receiver")
1212
1313 let signAssetId = fromBase58String(getStringByKey("conf_accepted_asset_SIGN"))
1414
1515 let chris = getStringByKey("conf_admin_1")
1616
1717 func getIntegerByKey (key) = valueOrElse(getInteger(this, key), 0)
1818
1919
2020 func getBooleanByKey (key) = valueOrElse(getBoolean(this, key), false)
2121
2222
2323 let dappRunning = valueOrElse(getBoolean(userDapp, "conf_dapp_is_running"), true)
2424
2525 let maintenanceMSG = valueOrElse(getString(userDapp, "conf_maintenance_msg"), "")
2626
2727 let userSuspended = "SUSPENDED"
2828
2929 let userUnregistered = "UNREGISTERED"
3030
3131 func validateCID (cid) = if (contains(cid, "/"))
3232 then if (if ((76 > size(cid)))
3333 then (size(split(cid, "/")[0]) == 59)
3434 else false)
3535 then (16 > size(split(cid, "/")[1]))
3636 else false
3737 else false
3838
3939
4040 let signCut = 2
4141
4242 func keyUserStatus (caller) = ("user_status_" + caller)
4343
4444
4545 func keyEventOwnerByEventId (eventId) = ("get_event_owner_" + eventId)
4646
4747
4848 func keyEventAddedDate (caller,eventId) = ((("event_addedDate_" + eventId) + "_") + caller)
4949
5050
5151 func keyEventDate (caller,eventId) = ((("event_date_" + eventId) + "_") + caller)
5252
5353
5454 func keyEventName (caller,eventId) = ((("event_name_" + eventId) + "_") + caller)
5555
5656
5757 func keyEventDesc (caller,eventId) = ((("event_desc_" + eventId) + "_") + caller)
5858
5959
6060 func keyEventDisplayCid (caller,eventId) = ((("event_displayCid_" + eventId) + "_") + caller)
6161
6262
6363 func keyEventTags (caller,eventId) = ((("event_tags_" + eventId) + "_") + caller)
6464
6565
6666 func keyEventFlag (caller,eventId) = ((("event_flag_" + eventId) + "_") + caller)
6767
6868
6969 func keyEventNote (caller,eventId) = ((("event_note_" + eventId) + "_") + caller)
7070
7171
7272 func keyEventCrawler (caller,eventId) = ((("event_crawlerCid_" + eventId) + "_") + caller)
7373
7474
7575 func keyEventTotalTicketTypes (caller,eventId) = ((("event_totalTicketTypes_" + eventId) + "_") + caller)
7676
7777
7878 func keyEventTotalTicketsIssued (caller,eventId) = ((("event_totalIssued_" + eventId) + "_") + caller)
7979
8080
8181 func keyEventCanceled (caller,eventId) = ((("event_canceled_" + eventId) + "_") + caller)
8282
8383
8484 func keyEventCanceledReason (caller,eventId) = ((("event_canceledReason_" + eventId) + "_") + caller)
8585
8686
8787 func keyTicketName (caller,eventId,ticketId) = ((((("ticket_name_" + eventId) + "_") + caller) + "_") + ticketId)
8888
8989
9090 func keyTicketDesc (caller,eventId,ticketId) = ((((("ticket_desc_" + eventId) + "_") + caller) + "_") + ticketId)
9191
9292
9393 func keyTicketPrice (caller,eventId,ticketId) = ((((("ticket_price_" + eventId) + "_") + caller) + "_") + ticketId)
9494
9595
9696 func keyTicketDate (caller,eventId,ticketId) = ((((("ticket_date_" + eventId) + "_") + caller) + "_") + ticketId)
9797
9898
9999 func keyTicketMaxAvailable (caller,eventId,ticketId) = ((((("ticket_maxAvailable_" + eventId) + "_") + caller) + "_") + ticketId)
100100
101101
102102 func keyTicketSold (caller,eventId,ticketId) = ((((("ticket_sold_" + eventId) + "_") + caller) + "_") + ticketId)
103103
104104
105105 func keyTicketOnSale (caller,eventId,ticketId) = ((((("ticket_onSale_" + eventId) + "_") + caller) + "_") + ticketId)
106106
107107
108108 func keyTicketAmountUsed (caller,eventId,ticketId) = ((((("ticket_amountUsed_" + eventId) + "_") + caller) + "_") + ticketId)
109109
110110
111111 func keyTicketMaxUse (caller,eventId,ticketId) = ((((("ticket_maxUse_" + eventId) + "_") + caller) + "_") + ticketId)
112112
113113
114114 func keyTicketTotalIssued (caller,eventId,ticketId) = ((((("ticket_totalIssued_" + eventId) + "_") + caller) + "_") + ticketId)
115115
116116
117117 func validateString (str,max) = if ((size(str) == 0))
118118 then throw("Field cannot be is empty")
119119 else if ((size(str) > max))
120120 then throw((str + " is too long"))
121121 else true
122122
123123
124124 func validateInt (num) = (0 > num)
125125
126126
127127 func getEventOwnerByEventId (eventId) = valueOrElse(getString(this, keyEventOwnerByEventId(eventId)), "")
128128
129129
130130 func validateUser (caller) = {
131131 let userStatus = valueOrElse(getString(userDapp, keyUserStatus(caller)), userUnregistered)
132132 if ((userStatus == userUnregistered))
133133 then "Register this account first with \"Account\" tab"
134134 else if ((userStatus == userSuspended))
135135 then "Account suspended"
136136 else ""
137137 }
138138
139139
140140 func validateEventData (caller,cidDisplay,name,description,tags,date) = {
141141 let checkUser = validateUser(caller)
142142 if ((checkUser != ""))
143143 then throw(checkUser)
144144 else if ((size(cidDisplay) == 0))
145145 then throw("Display CID cannot be empty")
146146 else if (!(validateCID(cidDisplay)))
147147 then throw("Problem with CID")
148148 else if (!(validateString(name, 200)))
149149 then throw("100 Char. max name")
150150 else if (!(validateString(description, 1000)))
151151 then throw("1000 Char. max description")
152152 else if (!(validateString(date, 1000)))
153153 then throw("1000 Char. max date")
154154 else if ((size(split(tags, ",")) > 5))
155155 then throw("5 tags max.")
156156 else ""
157157 }
158158
159159
160160 func validateTicketData (eventId,caller,name,description,price,maxAvailable,maxUse) = {
161161 let checkUser = validateUser(caller)
162162 if ((checkUser != ""))
163163 then throw(checkUser)
164164 else if (!(validateString(name, 200)))
165165 then throw("100 Char. max name")
166166 else if (!(validateString(description, 1000)))
167167 then throw("1000 Char. max description")
168168 else if (if (if (validateInt(price))
169169 then true
170170 else validateInt(maxUse))
171171 then true
172172 else validateInt(maxAvailable))
173173 then throw("Positive amount only")
174174 else if (!(validateString(description, 1000)))
175175 then throw("1000 Char. max description")
176176 else ""
177177 }
178178
179179
180180 func idCallerDate (i) = if (!(dappRunning))
181181 then throw(maintenanceMSG)
182182 else $Tuple3(toBase58String(i.transactionId), toBase58String(i.caller.bytes), lastBlock.timestamp)
183183
184184
185185 func isPayment (i) = if ((size(i.payments) == 0))
186186 then throw("No payment attached")
187187 else {
188188 let payment = value(i.payments[0])
189189 let amount = value(payment.amount)
190190 $Tuple2(payment, amount)
191191 }
192192
193193
194194 func validatePriceAssetId (i,priceAssetId,artworkPrice) = {
195195 let $t064836519 = isPayment(i)
196196 let payment = $t064836519._1
197197 let amount = $t064836519._2
198198 if (!(isDefined(payment.assetId)))
199199 then throw("Wrong asset attached")
200200 else {
201201 let assetId = if (if ((size(priceAssetId) > 0))
202202 then (toBase58String(value(payment.assetId)) == priceAssetId)
203203 else false)
204204 then payment.assetId
205205 else throw("Wrong asset attached")
206206 if ((artworkPrice != amount))
207207 then throw("Payment amount don't match")
208208 else $Tuple2(amount, assetId)
209209 }
210210 }
211211
212212
213213 func isEventOwner (eventId,caller) = {
214214 let eventOwner = getEventOwnerByEventId(eventId)
215215 if ((eventOwner == ""))
216216 then throw("Event not found")
217217 else (eventOwner == caller)
218218 }
219219
220220
221221 func ticketExist (caller,eventId,ticketId) = {
222222 let ticket = getStringByKey(keyTicketName(caller, eventId, ticketId))
223223 (size(ticket) != 0)
224224 }
225225
226226
227227 func eventIsCanceled (issuer,eventId) = getBooleanByKey(keyEventCanceled(issuer, eventId))
228228
229229
230230 @Callable(invoke)
231231 func setConf (key,val) = {
232232 let caller = toString(invoke.caller)
233233 if (containsElement([chris, toString(this)], caller))
234234 then if (contains(key, "conf_"))
235235 then [StringEntry(key, val)]
236236 else throw("Entries starting with conf_ only")
237237 else throw("You are not allowed to change this")
238238 }
239239
240240
241241
242242 @Callable(i)
243243 func addEvent (name,description,tags,cidDisplay,crawler,date) = {
244244 let $t078487897 = idCallerDate(i)
245245 let eventId = $t078487897._1
246246 let caller = $t078487897._2
247247 let addedDate = $t078487897._3
248248 let checkUser = validateUser(caller)
249249 if ((checkUser != ""))
250250 then throw(checkUser)
251251 else {
252252 let validateEvent = validateEventData(caller, cidDisplay, name, description, tags, date)
253253 if ((validateEvent != ""))
254254 then throw("Something went wrong!")
255255 else [IntegerEntry(keyEventAddedDate(caller, eventId), addedDate), StringEntry(keyEventDate(caller, eventId), date), StringEntry(keyEventName(caller, eventId), name), StringEntry(keyEventDesc(caller, eventId), description), StringEntry(keyEventDisplayCid(caller, eventId), cidDisplay), StringEntry(keyEventTags(caller, eventId), tags), StringEntry(keyEventCrawler(caller, eventId), crawler), IntegerEntry(keyEventTotalTicketsIssued(caller, eventId), 0), BooleanEntry(keyEventCanceled(caller, eventId), false), StringEntry(keyEventOwnerByEventId(eventId), caller)]
256256 }
257257 }
258258
259259
260260
261261 @Callable(i)
262262 func editEvent (eventId,name,description,tags,cidDisplay,crawler,date) = if (!(dappRunning))
263263 then throw(maintenanceMSG)
264264 else {
265265 let caller = toBase58String(i.caller.bytes)
266266 let checkUser = validateUser(caller)
267267 if ((checkUser != ""))
268268 then throw(checkUser)
269269 else {
270270 let validateEvent = validateEventData(caller, cidDisplay, name, description, tags, date)
271271 if ((validateEvent != ""))
272272 then throw("Something went wrong!")
273273 else {
274274 let entryExist = getStringByKey(keyEventName(caller, eventId))
275275 if ((entryExist == ""))
276276 then throw("Entry not found")
277277 else {
278278 let flag = getStringByKey(keyEventFlag(caller, eventId))
279279 if ((flag == "ILLEGAL"))
280280 then throw("Cannot update ILLEGAL Event")
281281 else [StringEntry(keyEventName(caller, eventId), name), StringEntry(keyEventDate(caller, eventId), date), StringEntry(keyEventDesc(caller, eventId), description), StringEntry(keyEventTags(caller, eventId), tags), StringEntry(keyEventCrawler(caller, eventId), crawler)]
282282 }
283283 }
284284 }
285285 }
286286
287287
288288
289289 @Callable(i)
290290 func deleteEvent (eventId) = {
291291 let $t01011710161 = idCallerDate(i)
292292 let id = $t01011710161._1
293293 let caller = $t01011710161._2
294294 let addedDate = $t01011710161._3
295295 let checkUser = validateUser(caller)
296296 if ((checkUser != ""))
297297 then throw(checkUser)
298298 else if (!(isEventOwner(eventId, caller)))
299299 then throw("You are not the owner of this event")
300300 else {
301301 let eventTotalNFT = getIntegerByKey(keyEventTotalTicketsIssued(caller, eventId))
302302 if ((eventTotalNFT != 0))
303303 then throw("Cannot delete event with already sold tickets")
304304 else {
305305 let totalTicketTypeForEvent = getIntegerByKey(keyEventTotalTicketTypes(caller, eventId))
306306 if ((totalTicketTypeForEvent > 0))
307307 then throw("Delete all tickets first")
308308 else [DeleteEntry(keyEventAddedDate(caller, eventId)), DeleteEntry(keyEventDate(caller, eventId)), DeleteEntry(keyEventName(caller, eventId)), DeleteEntry(keyEventDesc(caller, eventId)), DeleteEntry(keyEventDisplayCid(caller, eventId)), DeleteEntry(keyEventTags(caller, eventId)), DeleteEntry(keyEventCrawler(caller, eventId)), DeleteEntry(keyEventTotalTicketsIssued(caller, eventId)), DeleteEntry(keyEventCanceled(caller, eventId)), DeleteEntry(keyEventOwnerByEventId(eventId)), DeleteEntry(keyEventTotalTicketTypes(caller, eventId))]
309309 }
310310 }
311311 }
312312
313313
314314
315315 @Callable(i)
316316 func cancelEvent (eventId,reason) = {
317317 let $t01150211546 = idCallerDate(i)
318318 let id = $t01150211546._1
319319 let caller = $t01150211546._2
320320 let addedDate = $t01150211546._3
321321 let checkUser = validateUser(caller)
322322 if ((checkUser != ""))
323323 then throw(checkUser)
324324 else if (!(isEventOwner(eventId, caller)))
325325 then throw("You are not the owner of this event")
326326 else [BooleanEntry(keyEventCanceled(caller, eventId), true), StringEntry(keyEventCanceledReason(caller, eventId), reason)]
327327 }
328328
329329
330330
331331 @Callable(i)
332332 func flagEvent (eventId,addr,flag,note) = {
333333 let $t01198112014 = idCallerDate(i)
334334 let id = $t01198112014._1
335335 let caller = $t01198112014._2
336336 if (containsElement([chris, toString(this)], caller))
337337 then if (containsElement(["", "CHANGE_REQUIRED", "FLAGGED", "ILLEGAL"], flag))
338338 then [StringEntry(keyEventFlag(addr, eventId), flag), StringEntry(keyEventNote(addr, eventId), note)]
339339 else throw(("Unknow status " + flag))
340340 else throw("You are not allowed")
341341 }
342342
343343
344344
345345 @Callable(i)
346346 func addTicket (eventId,name,description,price,maxAvailable,MaxUse) = {
347347 let $t01251512555 = idCallerDate(i)
348348 let id = $t01251512555._1
349349 let caller = $t01251512555._2
350350 let date = $t01251512555._3
351351 let checkUser = validateUser(caller)
352352 if ((checkUser != ""))
353353 then throw(checkUser)
354354 else if (eventIsCanceled(caller, eventId))
355355 then throw("Event have been canceled")
356356 else if (!(isEventOwner(eventId, caller)))
357357 then throw("You are not the owner of this event")
358358 else {
359359 let validateTicket = validateTicketData(eventId, caller, name, description, price, maxAvailable, MaxUse)
360360 if ((validateTicket != ""))
361361 then throw("Something went wrong!")
362362 else {
363363 let totalTicketTypeForEvent = getIntegerByKey(keyEventTotalTicketTypes(caller, eventId))
364364 [StringEntry(keyTicketName(caller, eventId, id), name), IntegerEntry(keyTicketDate(caller, eventId, id), date), StringEntry(keyTicketDesc(caller, eventId, id), description), IntegerEntry(keyTicketPrice(caller, eventId, id), price), IntegerEntry(keyTicketMaxAvailable(caller, eventId, id), maxAvailable), BooleanEntry(keyTicketOnSale(caller, eventId, id), true), IntegerEntry(keyTicketMaxUse(caller, eventId, id), MaxUse), IntegerEntry(keyTicketTotalIssued(caller, eventId, id), 0), IntegerEntry(keyEventTotalTicketTypes(caller, eventId), (totalTicketTypeForEvent + 1))]
365365 }
366366 }
367367 }
368368
369369
370370
371371 @Callable(i)
372372 func editTicket (ticketId,eventId,name,description,price,maxAvailable,maxUse) = {
373373 let $t01389013930 = idCallerDate(i)
374374 let id = $t01389013930._1
375375 let caller = $t01389013930._2
376376 let date = $t01389013930._3
377377 let checkUser = validateUser(caller)
378378 if ((checkUser != ""))
379379 then throw(checkUser)
380380 else if (!(isEventOwner(eventId, caller)))
381381 then throw("You are not the owner of this event")
382382 else if (!(ticketExist(caller, eventId, ticketId)))
383383 then throw("Ticket not found")
384384 else {
385385 let validateTicket = validateTicketData(eventId, caller, name, description, price, maxAvailable, maxUse)
386386 if ((validateTicket != ""))
387387 then throw("Something went wrong!")
388388 else {
389389 let ticketSold = valueOrElse(getInteger(keyTicketSold(caller, eventId, ticketId)), 0)
390390 if ((ticketSold > maxAvailable))
391391 then throw("Max tickets available cannot be lower than amount already sold")
392392 else [StringEntry(keyTicketName(caller, eventId, ticketId), name), StringEntry(keyTicketDesc(caller, eventId, ticketId), description), IntegerEntry(keyTicketPrice(caller, eventId, ticketId), price), IntegerEntry(keyTicketMaxAvailable(caller, eventId, ticketId), maxAvailable), IntegerEntry(keyTicketMaxUse(caller, eventId, id), maxUse)]
393393 }
394394 }
395395 }
396396
397397
398398
399399 @Callable(i)
400400 func pauseTicketSale (eventId,ticketId,status) = {
401- let $t01505915099 = idCallerDate(i)
402- let id = $t01505915099._1
403- let caller = $t01505915099._2
404- let date = $t01505915099._3
401+ let $t01506215102 = idCallerDate(i)
402+ let id = $t01506215102._1
403+ let caller = $t01506215102._2
404+ let date = $t01506215102._3
405405 let checkUser = validateUser(caller)
406406 if ((checkUser != ""))
407407 then throw(checkUser)
408408 else if (!(isEventOwner(eventId, caller)))
409409 then throw("You are not the owner of this event")
410- else [BooleanEntry(keyTicketOnSale(caller, eventId, id), status)]
410+ else if (!(ticketExist(caller, eventId, ticketId)))
411+ then throw("Ticket not found")
412+ else [BooleanEntry(keyTicketOnSale(caller, eventId, ticketId), status)]
411413 }
412414
413415
414416
415417 @Callable(i)
416418 func deleteTicket (ticketId,eventId) = {
417- let $t01547315513 = idCallerDate(i)
418- let id = $t01547315513._1
419- let caller = $t01547315513._2
420- let date = $t01547315513._3
419+ let $t01556515605 = idCallerDate(i)
420+ let id = $t01556515605._1
421+ let caller = $t01556515605._2
422+ let date = $t01556515605._3
421423 let checkUser = validateUser(caller)
422424 if ((checkUser != ""))
423425 then throw(checkUser)
424426 else if (!(isEventOwner(eventId, caller)))
425427 then throw("You are not the owner of this event")
426428 else if (!(ticketExist(caller, eventId, ticketId)))
427429 then throw("Ticket not found")
428430 else {
429431 let amountSold = getIntegerByKey(keyTicketSold(caller, eventId, ticketId))
430432 if ((amountSold != 0))
431433 then throw("Cannot delete ticket that sold already")
432434 else {
433435 let totalTicketTypeForEvent = getIntegerByKey(keyEventTotalTicketTypes(caller, eventId))
434436 [DeleteEntry(keyTicketName(caller, eventId, ticketId)), DeleteEntry(keyTicketDate(caller, eventId, ticketId)), DeleteEntry(keyTicketDesc(caller, eventId, ticketId)), DeleteEntry(keyTicketPrice(caller, eventId, ticketId)), DeleteEntry(keyTicketMaxAvailable(caller, eventId, ticketId)), DeleteEntry(keyTicketOnSale(caller, eventId, ticketId)), DeleteEntry(keyTicketMaxUse(caller, eventId, ticketId)), DeleteEntry(keyTicketTotalIssued(caller, eventId, ticketId)), IntegerEntry(keyEventTotalTicketTypes(caller, eventId), (totalTicketTypeForEvent - 1))]
435437 }
436438 }
437439 }
438440
439441
440442
441443 @Callable(i)
442444 func buyTicket (ticketId,eventId,issuer) = {
443- let $t01673716775 = idCallerDate(i)
444- let id = $t01673716775._1
445- let caller = $t01673716775._2
446- let date = $t01673716775._3
445+ let $t01682916867 = idCallerDate(i)
446+ let id = $t01682916867._1
447+ let caller = $t01682916867._2
448+ let date = $t01682916867._3
447449 let totalNFT = valueOrElse(getIntegerByKey("total_tickets_issued"), 0)
448450 if (!(isEventOwner(eventId, issuer)))
449451 then throw("Event ID and Issuer don't match")
450452 else if (!(ticketExist(issuer, eventId, ticketId)))
451453 then throw("Ticket not found")
452454 else {
453455 let eventName = getStringByKey(keyEventName(issuer, eventId))
454456 if ((eventName == ""))
455457 then throw("Art doesn't exist")
456458 else if (eventIsCanceled(issuer, eventId))
457459 then throw("Event have been canceled")
458460 else {
459461 let isOnSale = getBooleanByKey(keyTicketOnSale(issuer, eventId, ticketId))
460462 if (!(isOnSale))
461463 then throw("Tickets not for sale")
462464 else {
463465 let amountSold = getIntegerByKey(keyTicketSold(issuer, eventId, ticketId))
464466 let ticketPrice = getIntegerByKey(keyTicketPrice(issuer, eventId, ticketId))
465467 let priceAssetId = toBase58String(signAssetId)
466- let $t01762117695 = validatePriceAssetId(i, priceAssetId, ticketPrice)
467- let amount = $t01762117695._1
468- let assetId = $t01762117695._2
468+ let $t01771317787 = validatePriceAssetId(i, priceAssetId, ticketPrice)
469+ let amount = $t01771317787._1
470+ let assetId = $t01771317787._2
469471 let maxCanSell = getIntegerByKey(keyTicketMaxAvailable(issuer, eventId, ticketId))
470472 let amountForSign = fraction(amount, signCut, 100)
471473 let amountForOrganizer = (amount - amountForSign)
472474 if ((amountSold == maxCanSell))
473475 then throw("Art sold out")
474476 else {
475477 let newAmountSold = (amountSold + 1)
476478 let issueMeta = ((((((((((("Organizer: " + issuer) + ",
477479 EventID: ") + eventId) + ",
478480 TicketID: ") + ticketId) + ",
479481 EventName: ") + eventName) + ",
480482 Issue: ") + toString(newAmountSold)) + "/") + toString(maxCanSell))
481483 let issueNFT = Issue(("ST_" + toString((totalNFT + 1))), issueMeta, 1, 0, false)
482484 let idNFT = calculateAssetId(issueNFT)
483485 let sellStatus = if ((newAmountSold == maxCanSell))
484486 then false
485487 else true
486488 let receiveNFT = i.caller
487489 let soldKey = ((((((((("ticket_sold_" + toString(newAmountSold)) + "_of_") + toString(maxCanSell)) + "_") + eventId) + "_") + issuer) + "_") + ticketId)
488490 let soldValue = ((((((((toString(receiveNFT) + "_") + toString(date)) + "_") + id) + "_") + toString(amount)) + "_") + toBase58String(idNFT))
489491 let soldData = StringEntry(soldKey, soldValue)
490492 let eventTotalNFT = getIntegerByKey(keyEventTotalTicketsIssued(issuer, eventId))
491493 let ticketTotalNFT = getIntegerByKey(keyTicketTotalIssued(issuer, eventId, ticketId))
492494 let buyRes = [IntegerEntry(keyTicketSold(issuer, eventId, ticketId), newAmountSold), StringEntry(("nft_" + toBase58String(idNFT)), soldKey), IntegerEntry("total_nft_issued", (totalNFT + 1)), IntegerEntry(keyEventTotalTicketsIssued(issuer, eventId), (eventTotalNFT + 1)), IntegerEntry(keyTicketTotalIssued(issuer, eventId, ticketId), (ticketTotalNFT + 1)), StringEntry((("ST_" + toString((totalNFT + 1))) + "_assetId"), toBase58String(idNFT)), BooleanEntry(keyTicketOnSale(issuer, eventId, ticketId), sellStatus), IntegerEntry(keyTicketAmountUsed(issuer, eventId, ticketId), 0), issueNFT, ScriptTransfer(Address(fromBase58String(issuer)), amountForOrganizer, assetId), ScriptTransfer(receiveNFT, 1, idNFT), ScriptTransfer(Address(fromBase58String(feeReceiver)), amountForSign, assetId)]
493495 soldData :: buyRes
494496 }
495497 }
496498 }
497499 }
498500 }
499501
500502
501503
502504 @Callable(i)
503505 func useTicket (eventId,issuer) = {
504- let $t01997420012 = idCallerDate(i)
505- let id = $t01997420012._1
506- let caller = $t01997420012._2
507- let date = $t01997420012._3
508- let $t02001820054 = isPayment(i)
509- let payment = $t02001820054._1
510- let amount = $t02001820054._2
506+ let $t02006620104 = idCallerDate(i)
507+ let id = $t02006620104._1
508+ let caller = $t02006620104._2
509+ let date = $t02006620104._3
510+ let $t02011020146 = isPayment(i)
511+ let payment = $t02011020146._1
512+ let amount = $t02011020146._2
511513 if (!(isDefined(payment.assetId)))
512514 then throw("Wrong asset attached")
513515 else {
514516 let ticketId = toBase58String(value(payment.assetId))
515517 if (!(ticketExist(issuer, eventId, ticketId)))
516518 then throw("Ticket not found")
517519 else {
518520 let amountUsed = getIntegerByKey(keyTicketAmountUsed(issuer, eventId, ticketId))
519521 let maxUsingTime = getIntegerByKey(keyTicketMaxUse(issuer, eventId, ticketId))
520522 if ((maxUsingTime == amountUsed))
521523 then throw((("Ticket used " + toString(amountUsed)) + " times already"))
522524 else [IntegerEntry(keyTicketAmountUsed(issuer, eventId, ticketId), (amountUsed + 1)), ScriptTransfer(Address(fromBase58String(caller)), 1, payment.assetId)]
523525 }
524526 }
525527 }
526528
527529
528530
529531 @Callable(i)
530532 func deleteEntry (entry) = {
531533 let caller = toString(i.caller)
532534 if ((caller == chris))
533535 then [DeleteEntry(entry)]
534536 else throw("no")
535537 }
536538
537539

github/deemru/w8io/3ef1775 
124.71 ms