tx · Ew1uyDPcef26jEhYioKmUHAAMEo6kg3itiESQYXKjcFo

3NBynfbXC2KastUxhukcMUaE58K9cBdB9UY:  -0.02600000 Waves

2023.10.12 08:03 [2794939] smart account 3NBynfbXC2KastUxhukcMUaE58K9cBdB9UY > SELF 0.00000000 Waves

{ "type": 13, "id": "Ew1uyDPcef26jEhYioKmUHAAMEo6kg3itiESQYXKjcFo", "fee": 2600000, "feeAssetId": null, "timestamp": 1697087065668, "version": 2, "chainId": 84, "sender": "3NBynfbXC2KastUxhukcMUaE58K9cBdB9UY", "senderPublicKey": "J9DCtJJxJBWZdtDR12BA1U94Q3cZzMi4R6k5hYkAzmzC", "proofs": [ "64PQqJ3WzgVueyiJ7eM1no2SCDJwSDw6RwQVov9WTjKhaZFQVAQidqsnC9d6ZPgfXUioqe1KqP3zqE3m4Km91uMt" ], "script": "base64:BgJeCAISBAoCCAgSDgoMCAgICAgICAgICAEIEg8KDQgICAgICAgICAgIAQgSBgoECAgICBIECgIICBIICgYIAQEIAQgSBAoCCAgSBAoCCAgSBwoFCAgICAgSBgoECAgICFwAB1ZFUlNJT04CBTIuMC4wAQ5nZXRTdHJpbmdCeUtleQEDa2V5CQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMFA2tleQIAAAh1bml0VGVzdAcACW9yYWNsZUZlZQkBBXZhbHVlAQkApggBCQEOZ2V0U3RyaW5nQnlLZXkBAg9jb25mX29yYWNsZV9mZWUACHNpZ25EYXBwCQEFdmFsdWUBCQCmCAEJAQ5nZXRTdHJpbmdCeUtleQECEWNvbmZfc2lnbndlYl9kYXBwAAtmZWVSZWNlaXZlcgkBDmdldFN0cmluZ0J5S2V5AQIRY29uZl9mZWVfcmVjZWl2ZXIACHVzZXJEYXBwAwUIdW5pdFRlc3QJAQV2YWx1ZQEJAKYIAQIjM010NFJHTUV5alNXWUFvY1RQcWQ1NXdkSFFRQjNQVTJVQ20JAQV2YWx1ZQEJAKYIAQkBDmdldFN0cmluZ0J5S2V5AQIPY29uZl91c2Vyc19kYXBwAA13aGl0ZWxpc3REYXBwCQEFdmFsdWUBCQCmCAEJAQ5nZXRTdHJpbmdCeUtleQECE2NvbmZfd2hpdGVsaXN0X2RhcHAAD3B1enpsZV9hcnRfcG9vbAkBDmdldFN0cmluZ0J5S2V5AQIUY29uZl9wdXp6bGVfYXJ0X3Bvb2wACnJlcG9ydERhcHAJAQV2YWx1ZQEJAKYIAQkBDmdldFN0cmluZ0J5S2V5AQIQY29uZl9yZXBvcnRfZGFwcAARdXNkdFBQQXNzZXRJZF9zdHIJAQ5nZXRTdHJpbmdCeUtleQECG2NvbmZfYWNjZXB0ZWRfYXNzZXRfVVNEVF9QUAAOYXJ0QXNzZXRJZF9zdHIJAQ5nZXRTdHJpbmdCeUtleQECF2NvbmZfYWNjZXB0ZWRfYXNzZXRfQVJUABF1c2RjUFBBc3NldElkX3N0cgkBDmdldFN0cmluZ0J5S2V5AQIbY29uZl9hY2NlcHRlZF9hc3NldF9VU0RDX1BQAA9lYXN0QXNzZXRJZF9zdHIJAQ5nZXRTdHJpbmdCeUtleQECGGNvbmZfYWNjZXB0ZWRfYXNzZXRfRUFTVAARcHV6emxlQXNzZXRJZF9zdHIJAQ5nZXRTdHJpbmdCeUtleQECGmNvbmZfYWNjZXB0ZWRfYXNzZXRfUFVaWkxFABBldGhQUEFzc2V0SWRfc3RyCQEOZ2V0U3RyaW5nQnlLZXkBAhpjb25mX2FjY2VwdGVkX2Fzc2V0X0VUSF9QUAAQd2F2ZXNBc3NldElkX3N0cgIFV0FWRVMADXVzZHRQUEFzc2V0SWQJANkEAQURdXNkdFBQQXNzZXRJZF9zdHIACmFydEFzc2V0SWQJANkEAQUOYXJ0QXNzZXRJZF9zdHIADXVzZGNQUEFzc2V0SWQJANkEAQURdXNkY1BQQXNzZXRJZF9zdHIAC2Vhc3RBc3NldElkCQDZBAEFD2Vhc3RBc3NldElkX3N0cgANcHV6emxlQXNzZXRJZAkA2QQBBRFwdXp6bGVBc3NldElkX3N0cgAMZXRoUFBBc3NldElkCQDZBAEFEGV0aFBQQXNzZXRJZF9zdHIADHdhdmVzQXNzZXRJZAEAABNhbGxfYWNjZXB0ZWRfYXNzZXRzCQDMCAIFEXVzZHRQUEFzc2V0SWRfc3RyCQDMCAIFDmFydEFzc2V0SWRfc3RyCQDMCAIFEXVzZGNQUEFzc2V0SWRfc3RyCQDMCAIFD2Vhc3RBc3NldElkX3N0cgkAzAgCBRFwdXp6bGVBc3NldElkX3N0cgkAzAgCBRB3YXZlc0Fzc2V0SWRfc3RyCQDMCAIFEGV0aFBQQXNzZXRJZF9zdHIFA25pbAAFY2hyaXMJAQ5nZXRTdHJpbmdCeUtleQECDGNvbmZfYWRtaW5fMQEZZ2V0SW50ZWdlckJ5S2V5RnJvbU9yYWNsZQEDa2V5CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUJb3JhY2xlRmVlBQNrZXkCH0ludGVnZXIgdW5kZWZpbmUgb3IgMCBpbiBvcmFjbGUBD2dldEludGVnZXJCeUtleQEDa2V5CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFA2tleQAAAQ5jaGVja1doaXRlbGlzdAEDa2V5CQELdmFsdWVPckVsc2UCCQCaCAIFDXdoaXRlbGlzdERhcHAFA2tleQAAAQ9nZXRCb29sZWFuQnlLZXkBA2tleQkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzBQNrZXkHAA5jb21taXNzaW9uX2ZlZQAIAA5kZWZhdWx0TGljZW5jZQkBDmdldFN0cmluZ0J5S2V5AQIUY29uZl9kZWZhdWx0X2xpY2VuY2UAEmRlZmF1bHRIYXNoTGljZW5jZQkBDmdldFN0cmluZ0J5S2V5AQIZY29uZl9kZWZhdWx0X2xpY2VuY2VfaGFzaAALZGFwcFJ1bm5pbmcJAQt2YWx1ZU9yRWxzZQIJAJsIAgUIdXNlckRhcHACFGNvbmZfZGFwcF9pc19ydW5uaW5nBgAObWFpbnRlbmFuY2VNU0cJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUIdXNlckRhcHACFGNvbmZfbWFpbnRlbmFuY2VfbXNnAgAADXVzZXJTdXNwZW5kZWQCCVNVU1BFTkRFRAALdXNlclJlbW92ZWQCB1JFTU9WRUQAEHVzZXJVbnJlZ2lzdGVyZWQCDFVOUkVHSVNURVJFRAALdXNlckFsbG93ZWQCB0FMTE9XRUQAGWN1cnJlbnRDZXJ0aWZpY2F0aW9uUHJpY2UJARlnZXRJbnRlZ2VyQnlLZXlGcm9tT3JhY2xlAQkArAICAhJjZXJ0aWZpY2F0aW9uX2ZlZV8JANgEAQUKYXJ0QXNzZXRJZAAIbWludF9mZWUJARlnZXRJbnRlZ2VyQnlLZXlGcm9tT3JhY2xlAQkArAICAgltaW50X2ZlZV8JANgEAQUKYXJ0QXNzZXRJZAETZ2V0QXJ0d29ya1JveWFsdGllcwEDa2V5CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFA2tleQDoBwELdmFsaWRhdGVDSUQBA2NpZAMJAQhjb250YWlucwIFA2NpZAIBLwMDCQBmAgBMCQCxAgEFA2NpZAkAAAIJALECAQkAkQMCCQC1CQIFA2NpZAIBLwAAADsHCQBmAgAQCQCxAgEJAJEDAgkAtQkCBQNjaWQCAS8AAQcHAQx2YWxpZGF0ZUhhc2gBBGhhc2gJAAACCQCxAgEFBGhhc2gAQAENa2V5VXNlclN0YXR1cwEGY2FsbGVyCQCsAgICDHVzZXJfc3RhdHVzXwUGY2FsbGVyAQdrZXlEYXRlAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICCWFydF9kYXRlXwUFYXJ0SWQCAV8FBmNhbGxlcgEHa2V5TmFtZQIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAglhcnRfbmFtZV8FBWFydElkAgFfBQZjYWxsZXIBB2tleURlc2MCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIJYXJ0X2Rlc2NfBQVhcnRJZAIBXwUGY2FsbGVyAQ1rZXlEaXNwbGF5Q2lkAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICEGFydF9kaXNwbGF5X2NpZF8FBWFydElkAgFfBQZjYWxsZXIBDWtleUV4cG9ydEhhc2gCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIQYXJ0X2V4cG9ydF9oYXNoXwUFYXJ0SWQCAV8FBmNhbGxlcgEMa2V5RXhwb3J0Q2lkAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICD2FydF9leHBvcnRfY2lkXwUFYXJ0SWQCAV8FBmNhbGxlcgEKa2V5TWF4TWludAIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAgxhcnRfbWF4bWludF8FBWFydElkAgFfBQZjYWxsZXIBCWtleVNpZ25JRAIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAgthcnRfc2lnbmlkXwUFYXJ0SWQCAV8FBmNhbGxlcgEJa2V5SXNzdWVkAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICC2FydF9pc3N1ZWRfBQVhcnRJZAIBXwUGY2FsbGVyAQlrZXlPblNhbGUCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgILYXJ0X29uc2FsZV8FBWFydElkAgFfBQZjYWxsZXIBDmtleUxpY2VuY2VIYXNoAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICEWFydF9saWNlbmNlX2hhc2hfBQVhcnRJZAIBXwUGY2FsbGVyAQ1rZXlMaWNlbmNlQ2lkAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICEGFydF9saWNlbmNlX2NpZF8FBWFydElkAgFfBQZjYWxsZXIBB2tleVRhZ3MCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIJYXJ0X3RhZ3NfBQVhcnRJZAIBXwUGY2FsbGVyAQdrZXlUeXBlAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICCWFydF90eXBlXwUFYXJ0SWQCAV8FBmNhbGxlcgEHa2V5Tm90ZQIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAglhcnRfbm90ZV8FBWFydElkAgFfBQZjYWxsZXIBCmtleUNyYXdsZXICBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIQYXJ0X2NyYXdsZXJfY2lkXwUFYXJ0SWQCAV8FBmNhbGxlcgEMa2V5Um95YWx0aWVzAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICDmFydF9yb3lhbHRpZXNfBQVhcnRJZAIBXwUGY2FsbGVyAQhrZXlQcmljZQIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAgphcnRfcHJpY2VfBQVhcnRJZAIBXwUGY2FsbGVyAQprZXlFbmRTYWxlAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICDGFydF9lbmRzYWxlXwUFYXJ0SWQCAV8FBmNhbGxlcgESa2V5QXNzZXRJZEFjY2VwdGVkAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICEmFydF9hc3NldEFjY2VwdGVkXwUFYXJ0SWQCAV8FBmNhbGxlcgEHa2V5RmxhZwIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAglhcnRfZmxhZ18FBWFydElkAgFfBQZjYWxsZXIBEmtleUFydGlzdEFnZW50QWRkcgEKYXJ0aXN0QWRkcgkArAICAg1hcnRpc3RfYWdlbnRfBQphcnRpc3RBZGRyARRrZXlQcmltYXJ5U2hhcmVBZ2VudAEKYXJ0aXN0QWRkcgkArAICAhVhcnRpc3RfYWdlbnRfcHJpbWFyeV8FCmFydGlzdEFkZHIBGGtleUFydGlzdFB1YmxpY0FnZW50QWRkcgEKYXJ0aXN0QWRkcgkArAICAhRhcnRpc3RfcHVibGljX2FnZW50XwUKYXJ0aXN0QWRkcgEaa2V5UHJpbWFyeVNoYXJlUHVibGljQWdlbnQBCmFydGlzdEFkZHIJAKwCAgIcYXJ0aXN0X3B1YmxpY19hZ2VudF9wcmltYXJ5XwUKYXJ0aXN0QWRkcgERa2V5SGFzaEJ5VHhpZEFkZHICBmNhbGxlcgR0eGlkCQCsAgIJAKwCAgkArAICAhNnZXRfaGFzaGJ5dHhpZGFkZHJfBQR0eGlkAgFfBQZjYWxsZXIBDmtleU93bmVyQnlIYXNoAQpzaGEyNTZIYXNoCQCsAgICEmdldF9vd25lcl9ieV9oYXNoXwUKc2hhMjU2SGFzaAENa2V5aWRCeVNpZ25pZAIGY2FsbGVyBnNpZ25JZAkArAICCQCsAgIJAKwCAgISZ2V0X2FydGlkYnlzaWduaWRfBQZzaWduSWQCAV8FBmNhbGxlcgEOdmFsaWRhdGVBbGxDSUQDCmNpZERpc3BsYXkJY2lkRXhwb3J0CmNpZExpY2VuY2UDCQEBIQEJAQt2YWxpZGF0ZUNJRAEFCmNpZERpc3BsYXkJAAIBAhFXcm9uZyBEaXNwbGF5IENJRAMJAQEhAQkBC3ZhbGlkYXRlQ0lEAQUJY2lkRXhwb3J0CQACAQIQV3JvbmcgRXhwb3J0IENJRAMDCQECIT0CBQpjaWRMaWNlbmNlAgAJAQEhAQkBC3ZhbGlkYXRlQ0lEAQUKY2lkTGljZW5jZQcJAAIBAhFXcm9uZyBMaWNlbmNlIENJRAYBD3ZhbGlkYXRlQWxsSGFzaAIMc2hhMjU2RXhwb3J0DXNoYTI1NkxpY2VuY2UDCQEBIQEJAQx2YWxpZGF0ZUhhc2gBBQxzaGEyNTZFeHBvcnQJAAIBAhhFeHBvcnQgSGFzaCA2NCBjaGFyLiBtYXgDCQEBIQEJAQx2YWxpZGF0ZUhhc2gBBQ1zaGEyNTZMaWNlbmNlCQACAQIZTGljZW5jZSBIYXNoIDY0IGNoYXIuIG1heAYBDnZhbGlkYXRlU3RyaW5nAgNzdHIDbWF4AwkAAAIJALECAQUDc3RyAAAJAAIBAhhGaWVsZCBjYW5ub3QgYmUgaXMgZW1wdHkDCQBmAgkAsQIBBQNzdHIFA21heAkAAgEJAKwCAgUDc3RyAgwgaXMgdG9vIGxvbmcGAQx2YWxpZGF0ZVVzZXIBBmNhbGxlcgQKdXNlclN0YXR1cwkBC3ZhbHVlT3JFbHNlAgkAnQgCBQh1c2VyRGFwcAkBDWtleVVzZXJTdGF0dXMBBQZjYWxsZXIFEHVzZXJVbnJlZ2lzdGVyZWQDAwkAAAIFCnVzZXJTdGF0dXMFEHVzZXJVbnJlZ2lzdGVyZWQGCQAAAgUKdXNlclN0YXR1cwULdXNlckFsbG93ZWQCLlJlZ2lzdGVyIHRoaXMgYWNjb3VudCBmaXJzdCB3aXRoICJBY2NvdW50IiB0YWIDCQAAAgUKdXNlclN0YXR1cwUNdXNlclN1c3BlbmRlZAIRQWNjb3VudCBzdXNwZW5kZWQDCQAAAgUKdXNlclN0YXR1cwULdXNlclJlbW92ZWQCD0FjY291bnQgcmVtb3ZlZAIAAQpzZXRMSWNlbmNlAgpjaWRMaWNlbmNlDXNoYTI1NkxpY2VuY2UEA2NpZAMJAAACCQCxAgEFCmNpZExpY2VuY2UAAAUOZGVmYXVsdExpY2VuY2UFCmNpZExpY2VuY2UEBGhhc2gDCQAAAgkAsQIBBQ1zaGEyNTZMaWNlbmNlAAAFEmRlZmF1bHRIYXNoTGljZW5jZQUNc2hhMjU2TGljZW5jZQkAlAoCBQNjaWQFBGhhc2gBE3ZhbGlkYXRlQXJ0d29ya0RhdGEKBmNhbGxlcgpjaWREaXNwbGF5CWNpZEV4cG9ydApsaWNlbmNlQ0lEDHNoYTI1NkV4cG9ydAtsaWNlbmNlSGFzaARuYW1lC2Rlc2NyaXB0aW9uBHRhZ3MJcm95YWx0aWVzBAljaGVja1VzZXIJAQx2YWxpZGF0ZVVzZXIBBQZjYWxsZXIDCQECIT0CBQljaGVja1VzZXICAAkAAgEFCWNoZWNrVXNlcgMJAAACCQCxAgEFCmNpZERpc3BsYXkAAAkAAgECG0Rpc3BsYXkgQ0lEIGNhbm5vdCBiZSBlbXB0eQMJAQEhAQkBDnZhbGlkYXRlQWxsQ0lEAwUKY2lkRGlzcGxheQUJY2lkRXhwb3J0BQpsaWNlbmNlQ0lECQACAQIQUHJvYmxlbSB3aXRoIENJRAMJAQEhAQkBD3ZhbGlkYXRlQWxsSGFzaAIFDHNoYTI1NkV4cG9ydAULbGljZW5jZUhhc2gJAAIBAhNQcm9ibGVtIHdpdGggSGFzaGVzAwkBASEBCQEOdmFsaWRhdGVTdHJpbmcCBQRuYW1lAGQJAAIBAhIxMDAgQ2hhci4gbWF4IG5hbWUDCQEBIQEJAQ52YWxpZGF0ZVN0cmluZwIFC2Rlc2NyaXB0aW9uAOgHCQACAQIaMTAwMCBDaGFyLiBtYXggZGVzY3JpcHRpb24DAwkAZgIAAAUJcm95YWx0aWVzBgkAZgIFCXJveWFsdGllcwDoBwkAAgECM1JveWFsdGllcyBjYW5ub3QgYmUgbGVzcyB0aGFuIDAlIG9yIGhpZ2hlciB0aGFuIDEwJQMJAGYCCQCQAwEJALUJAgUEdGFncwIBLAAFCQACAQILNSB0YWdzIG1heC4CAAEJaXNQYXltZW50AQFpAwkAAAIJAJADAQgFAWkIcGF5bWVudHMAAAkAAgECE05vIHBheW1lbnQgYXR0YWNoZWQEB3BheW1lbnQJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAQGYW1vdW50CQEFdmFsdWUBCAUHcGF5bWVudAZhbW91bnQJAJQKAgUHcGF5bWVudAUGYW1vdW50AQ92YWxpZGF0ZVBheW1lbnQBAWkEDSR0MDEwMjM0MTAyNzAJAQlpc1BheW1lbnQBBQFpBAdwYXltZW50CAUNJHQwMTAyMzQxMDI3MAJfMQQGYW1vdW50CAUNJHQwMTAyMzQxMDI3MAJfMgQHYXNzZXRJZAMDCQEJaXNEZWZpbmVkAQgFB3BheW1lbnQHYXNzZXRJZAkAAAIIBQdwYXltZW50B2Fzc2V0SWQFCmFydEFzc2V0SWQHCAUHcGF5bWVudAdhc3NldElkCQACAQIrT25seSBTSUdOIHRva2VuIGFjY2VwdGVkIGFzIHRyYW5zYWN0aW9uIGZlZQMJAQIhPQIFBmFtb3VudAkAaAIFGWN1cnJlbnRDZXJ0aWZpY2F0aW9uUHJpY2UAAgkAAgEJAKwCAgIZUGF5bWVudCBhbW91bnQgc2hvdWxkIGJlIAkApAMBCQBoAgUZY3VycmVudENlcnRpZmljYXRpb25QcmljZQACCQCUCgIFBmFtb3VudAUHYXNzZXRJZAELaXNBcnRNaW50ZWQCCWFkZHJUb1VzZQVhcnRJZAQHJG1hdGNoMAkAmggCBQR0aGlzCQEJa2V5SXNzdWVkAgUJYWRkclRvVXNlBQVhcnRJZAMJAAECBQckbWF0Y2gwAgNJbnQEAWIFByRtYXRjaDADCQECIT0CBQFiAAAGBwcBFHZhbGlkYXRlUHJpY2VBc3NldElkAwFpDHByaWNlQXNzZXRJZAxhcnR3b3JrUHJpY2UEDSR0MDEwODY3MTA5MDMJAQlpc1BheW1lbnQBBQFpBAdwYXltZW50CAUNJHQwMTA4NjcxMDkwMwJfMQQGYW1vdW50CAUNJHQwMTA4NjcxMDkwMwJfMgQHYXNzZXRJZAMJAQEhAQkBCWlzRGVmaW5lZAEIBQdwYXltZW50B2Fzc2V0SWQFBHVuaXQDAwkAZgIJALECAQUMcHJpY2VBc3NldElkAAAJAAACCQDYBAEJAQV2YWx1ZQEIBQdwYXltZW50B2Fzc2V0SWQFDHByaWNlQXNzZXRJZAcIBQdwYXltZW50B2Fzc2V0SWQJAAIBAg5Xcm9uZyBhc3NldCBpZAMDCQAAAgUHYXNzZXRJZAUEdW5pdAkBAiE9AgUMcHJpY2VBc3NldElkAgAHCQACAQIOV3JvbmcgYXNzZXQgaWQDCQECIT0CBQxhcnR3b3JrUHJpY2UFBmFtb3VudAkAAgECE1BheW1lbnQgZG9uJ3QgbWF0Y2gJAJQKAgUGYW1vdW50BQdhc3NldElkARBhY2NlcHRlZEFzc2V0SWRzAQdhc3NldElkAwkBASEBCQEPY29udGFpbnNFbGVtZW50AgUTYWxsX2FjY2VwdGVkX2Fzc2V0cwUHYXNzZXRJZAkAAgECQE9ubHkgJEFSVCwgVVNEVC1QUCwgVVNEQy1QUCwgRUFTVCwgUFVaWkxFLCBFVEggb3IgV0FWRVMgYWNjZXB0ZWQGAQ92YWxpZGF0ZU1pblNlbGwBBXByaWNlAwkAZwIAAAUFcHJpY2UJAAIBAhhXcm9uZyBtaW5pbXVtIHNlbGwgcHJpY2UGAQ1nZXRCaWRBc3NldElkAQdhc3NldElkAwkAAAIFB2Fzc2V0SWQCBVdBVkVTBQR1bml0CQDZBAEFB2Fzc2V0SWQBFmdldFByaWNlQXNzZXRJZEZyb21CaWQBCmJpZERhdGFLZXkEB2JpZERhdGEJAQ5nZXRTdHJpbmdCeUtleQEJAKwCAgUKYmlkRGF0YUtleQIFX09QRU4DCQAAAgUHYmlkRGF0YQIACQACAQINQmlkIG5vdCBmb3VuZAQKYmlkRGF0YUFycgkAtQkCBQdiaWREYXRhAgFfBAliaWRBbW91bnQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQpiaWREYXRhQXJyAAEECmJpZEFzc2V0SWQJAQ1nZXRCaWRBc3NldElkAQkAkQMCBQpiaWREYXRhQXJyAAADCQBnAgAABQliaWRBbW91bnQJAAIBAgxXcm9uZyBhbW91bnQJAJQKAgUJYmlkQW1vdW50BQpiaWRBc3NldElkARVpZENhbGxlckRhdGVTcG9uc29yZWQCAWkGcHViS2V5AwkBASEBBQtkYXBwUnVubmluZwkAAgEFDm1haW50ZW5hbmNlTVNHBAtpc1Nwb25zb3JlZAMJAQIhPQIFBnB1YktleQIACQELdmFsdWVPckVsc2UCCQEOY2hlY2tXaGl0ZWxpc3QBCQCsAgIJAKUIAQkApwgBCQDZBAEFBnB1YktleQIJX2ZyZWVfdHhzAAAAAAQGY2FsbGVyAwMJAAACCQDYBAEICAUBaQZjYWxsZXIFYnl0ZXMJAKUIAQUEdGhpcwkAZgIFC2lzU3BvbnNvcmVkAAAHCQClCAEJAKcIAQkA2QQBBQZwdWJLZXkJANgEAQgIBQFpBmNhbGxlcgVieXRlcwQTZ2V0X3Nwb25zb3JlZF93YXZlcwMDCQECIT0CBQZwdWJLZXkCAAkAZgIFC2lzU3BvbnNvcmVkAAAHCQD8BwQFDXdoaXRlbGlzdERhcHACCXVzZUZyZWVUeAkAzAgCCQClCAEJAKcIAQkA2QQBBQZwdWJLZXkFA25pbAUDbmlsBQR1bml0AwkAAAIFE2dldF9zcG9uc29yZWRfd2F2ZXMFE2dldF9zcG9uc29yZWRfd2F2ZXMJAJYKBAkA2AQBCAUBaQ10cmFuc2FjdGlvbklkBQZjYWxsZXIIBQlsYXN0QmxvY2sJdGltZXN0YW1wCQBmAgULaXNTcG9uc29yZWQAAAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEMaWRDYWxsZXJEYXRlAQFpAwkBASEBBQtkYXBwUnVubmluZwkAAgEFDm1haW50ZW5hbmNlTVNHCQCVCgMJANgEAQgFAWkNdHJhbnNhY3Rpb25JZAkA2AQBCAgFAWkGY2FsbGVyBWJ5dGVzCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAEKZ2V0QmFsYW5jZQEHYXNzZXRJZAQHJG1hdGNoMAUHYXNzZXRJZAMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAFiBQckbWF0Y2gwCQDwBwIFBHRoaXMFAWIICQDvBwEFBHRoaXMJYXZhaWxhYmxlAQdidXlNaW50BgFpBWFydElkBmlzc3VlcgViaWRJZAhiaWRPd25lcgZwdWJLZXkEDSR0MDEzNTA4MTM1OTcJARVpZENhbGxlckRhdGVTcG9uc29yZWQCBQFpBQZwdWJLZXkEAmlkCAUNJHQwMTM1MDgxMzU5NwJfMQQGY2FsbGVyCAUNJHQwMTM1MDgxMzU5NwJfMgQEZGF0ZQgFDSR0MDEzNTA4MTM1OTcCXzMEC2lzU3BvbnNvcmVkCAUNJHQwMTM1MDgxMzU5NwJfNAQFaXNCaWQDAwMJAAACBQZjYWxsZXIFBmlzc3VlcgkBAiE9AgUIYmlkT3duZXICAAcJAQIhPQIFBWJpZElkAgAHBgcDAwUFaXNCaWQJAQIhPQIFBmNhbGxlcgUGaXNzdWVyBwkAAgECGVlvdSBjYW5ub3QgZG8gdGhpcyBhY3Rpb24ECGJsb2NrRW5kCQEPZ2V0SW50ZWdlckJ5S2V5AQkBCmtleUVuZFNhbGUCBQZjYWxsZXIFBWFydElkAwMDCQECIT0CBQhibG9ja0VuZAAACQBnAgUGaGVpZ2h0BQhibG9ja0VuZAcJAQEhAQUFaXNCaWQHCQACAQILU2FsZSBlbmRlZC4EDmNhbGxlcklzSXNzdWVyCQAAAgUGY2FsbGVyBQZpc3N1ZXIECHRvdGFsTkZUCQEPZ2V0SW50ZWdlckJ5S2V5AQIQdG90YWxfbmZ0X2lzc3VlZAQLYXJ0d29ya05hbWUJAQ5nZXRTdHJpbmdCeUtleQEJAQdrZXlOYW1lAgUGaXNzdWVyBQVhcnRJZAMJAAACBQthcnR3b3JrTmFtZQIACQACAQIRQXJ0IGRvZXNuJ3QgZXhpc3QECGlzT25TYWxlCQEPZ2V0Qm9vbGVhbkJ5S2V5AQkBCWtleU9uU2FsZQIFBmlzc3VlcgUFYXJ0SWQECmFtb3VudFNvbGQJAQ9nZXRJbnRlZ2VyQnlLZXkBCQEJa2V5SXNzdWVkAgUGaXNzdWVyBQVhcnRJZAQMYXJ0d29ya1ByaWNlAwUOY2FsbGVySXNJc3N1ZXIFCG1pbnRfZmVlCQEPZ2V0SW50ZWdlckJ5S2V5AQkBCGtleVByaWNlAgUGaXNzdWVyBQVhcnRJZAQMcHJpY2VBc3NldElkAwUOY2FsbGVySXNJc3N1ZXIJANgEAQUKYXJ0QXNzZXRJZAkBDmdldFN0cmluZ0J5S2V5AQkBEmtleUFzc2V0SWRBY2NlcHRlZAIFBmlzc3VlcgUFYXJ0SWQECm1heENhblNlbGwJAQ9nZXRJbnRlZ2VyQnlLZXkBCQEKa2V5TWF4TWludAIFBmlzc3VlcgUFYXJ0SWQDAwMJAQEhAQUFaXNCaWQJAQEhAQUOY2FsbGVySXNJc3N1ZXIHAwMJAGcCAAAFDGFydHdvcmtQcmljZQYJAQEhAQUIaXNPblNhbGUGCQBnAgAABQptYXhDYW5TZWxsBwkAAgECEEFydCBub3QgZm9yIHNhbGUDAwMJAQEhAQUFaXNCaWQFDmNhbGxlcklzSXNzdWVyBwkAZwIAAAUKbWF4Q2FuU2VsbAcJAAIBAhRNYXggaXNzdWFibGUgbm90IHNldAQJY2hlY2tVc2VyCQEMdmFsaWRhdGVVc2VyAQUGaXNzdWVyAwMFBWlzQmlkCQECIT0CBQljaGVja1VzZXICAAcJAAIBBQljaGVja1VzZXIECmJpZERhdGFLZXkJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIEYmlkXwUFYXJ0SWQCAV8FBmlzc3VlcgIBXwUIYmlkT3duZXICAV8FBWJpZElkBA0kdDAxNTE3NDE1MzY2AwUFaXNCaWQJARZnZXRQcmljZUFzc2V0SWRGcm9tQmlkAQUKYmlkRGF0YUtleQkBFHZhbGlkYXRlUHJpY2VBc3NldElkAwUBaQUMcHJpY2VBc3NldElkBQxhcnR3b3JrUHJpY2UEBmFtb3VudAgFDSR0MDE1MTc0MTUzNjYCXzEEB2Fzc2V0SWQIBQ0kdDAxNTE3NDE1MzY2Al8yBAVhZ2VudAkBC3ZhbHVlT3JFbHNlAgkAnQgCBQh1c2VyRGFwcAkBEmtleUFydGlzdEFnZW50QWRkcgEFBmlzc3VlcgULZmVlUmVjZWl2ZXIECmFnZW50U2hhcmUJAQt2YWx1ZU9yRWxzZQIJAJoIAgUIdXNlckRhcHAJARRrZXlQcmltYXJ5U2hhcmVBZ2VudAEFBmlzc3VlcgAABAtwdWJsaWNBZ2VudAkBC3ZhbHVlT3JFbHNlAgkAnQgCBQh1c2VyRGFwcAkBGGtleUFydGlzdFB1YmxpY0FnZW50QWRkcgEFBmlzc3VlcgULZmVlUmVjZWl2ZXIEEHB1YmxpY0FnZW50U2hhcmUJAQt2YWx1ZU9yRWxzZQIJAJoIAgUIdXNlckRhcHAJARprZXlQcmltYXJ5U2hhcmVQdWJsaWNBZ2VudAEFBmlzc3VlcgAABA1pc1doaXRlbGlzdGVkCQEOY2hlY2tXaGl0ZWxpc3QBBQZpc3N1ZXIEDWFtb3VudEZvclNpZ24JAGsDBQZhbW91bnQFDmNvbW1pc3Npb25fZmVlAGQEDmFtb3VudEZvckFnZW50AwMDCQECIT0CBQVhZ2VudAULZmVlUmVjZWl2ZXIJAGYCBQphZ2VudFNoYXJlAAAHCQBmAgUGaGVpZ2h0BQ1pc1doaXRlbGlzdGVkBwkAawMFBmFtb3VudAUKYWdlbnRTaGFyZQCQTgAABBRhbW91bnRGb3JQdWJsaWNBZ2VudAMDAwkBAiE9AgULcHVibGljQWdlbnQFC2ZlZVJlY2VpdmVyCQBmAgUQcHVibGljQWdlbnRTaGFyZQAABwkAZgIFBmhlaWdodAUNaXNXaGl0ZWxpc3RlZAcJAGsDBQZhbW91bnQFEHB1YmxpY0FnZW50U2hhcmUAkE4AAAQQYW1vdW50Rm9yQ3JlYXRvcgkAZQIFBmFtb3VudAUNYW1vdW50Rm9yU2lnbgMJAAACBQphbW91bnRTb2xkBQptYXhDYW5TZWxsCQACAQIMQXJ0IHNvbGQgb3V0BA1uZXdBbW91bnRTb2xkCQBkAgUKYW1vdW50U29sZAABBAlpc3N1ZU1ldGEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICCUNyZWF0b3I6IAUGaXNzdWVyAgosCiBBcnRJRDogBQVhcnRJZAIRLAogQXJ0d29yayBuYW1lOiAFC2FydHdvcmtOYW1lAgosCiBJc3N1ZTogCQCkAwEFDW5ld0Ftb3VudFNvbGQCAS8JAKQDAQUKbWF4Q2FuU2VsbAQIaXNzdWVORlQJAMIIBQkArAICAgNTQV8JAKQDAQkAZAIFCHRvdGFsTkZUAAEFCWlzc3VlTWV0YQABAAAHBAVpZE5GVAkAuAgBBQhpc3N1ZU5GVAQKc2VsbFN0YXR1cwMDCQAAAgUNbmV3QW1vdW50U29sZAUKbWF4Q2FuU2VsbAYJAQEhAQUIaXNPblNhbGUHBgQKcmVjZWl2ZU5GVAMDAwkAAAIFBmNhbGxlcgUGaXNzdWVyCQECIT0CBQhiaWRPd25lcgIABwkBAiE9AgUFYmlkSWQCAAcJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCGJpZE93bmVyCAUBaQZjYWxsZXIECmFzc2V0SWRCaWQDCQEBIQEJAQlpc0RlZmluZWQBBQdhc3NldElkAgVXQVZFUwkA2AQBCQEFdmFsdWUBBQdhc3NldElkBAdiaWREYXRhCQEOZ2V0U3RyaW5nQnlLZXkBCQCsAgIFCmJpZERhdGFLZXkCBV9PUEVOBAliaWREZWxPbGQJAQtEZWxldGVFbnRyeQEJAKwCAgUKYmlkRGF0YUtleQIFX09QRU4ECWJpZFVwZGF0ZQkBC1N0cmluZ0VudHJ5AgkArAICBQpiaWREYXRhS2V5AgdfQ0xPU0VECQCsAgIJAKwCAgUHYmlkRGF0YQIBXwkApAMBBQRkYXRlBAdzb2xkS2V5CQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICCWFydF9zb2xkXwkApAMBBQ1uZXdBbW91bnRTb2xkAgRfb2ZfCQCkAwEFCm1heENhblNlbGwCAV8FBWFydElkAgFfBQZpc3N1ZXIECXNvbGRWYWx1ZQMJAQEhAQUFaXNCaWQJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUGY2FsbGVyAgFfCQCkAwEFBGRhdGUCAV8FAmlkAgFfCQCkAwEFDGFydHdvcmtQcmljZQIBXwUMcHJpY2VBc3NldElkAgFfCQDYBAEFBWlkTkZUCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKUIAQUKcmVjZWl2ZU5GVAIBXwkApAMBBQRkYXRlAgFfBQJpZAIBXwkApAMBBQZhbW91bnQCAV8FCmFzc2V0SWRCaWQCAV8JANgEAQUFaWRORlQECHNvbGREYXRhCQELU3RyaW5nRW50cnkCBQdzb2xkS2V5BQlzb2xkVmFsdWUEImFtb3VudF9jb21taXNzaW9uX2Zvcl9zaWduX3RvX3N3YXADCQECIT0CBQ5hbW91bnRGb3JBZ2VudAAACQBlAgUNYW1vdW50Rm9yU2lnbgUOYW1vdW50Rm9yQWdlbnQFDWFtb3VudEZvclNpZ24EEWFtb3VudF9hcnRfYmVmb3JlCQEKZ2V0QmFsYW5jZQEFCmFydEFzc2V0SWQDCQAAAgURYW1vdW50X2FydF9iZWZvcmUFEWFtb3VudF9hcnRfYmVmb3JlBA9zd2FwX2ZlZV90b19hcnQDCQECIT0CBQdhc3NldElkBQphcnRBc3NldElkCQD8BwQJAQdBZGRyZXNzAQkA2QQBBQ9wdXp6bGVfYXJ0X3Bvb2wCBHN3YXAJAMwIAgUOYXJ0QXNzZXRJZF9zdHIJAMwIAgABBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFB2Fzc2V0SWQFImFtb3VudF9jb21taXNzaW9uX2Zvcl9zaWduX3RvX3N3YXAFA25pbAUEdW5pdAMJAAACBQ9zd2FwX2ZlZV90b19hcnQFD3N3YXBfZmVlX3RvX2FydAQQYW1vdW50X2FydF9hZnRlcgkBCmdldEJhbGFuY2UBBQphcnRBc3NldElkAwkAAAIFEGFtb3VudF9hcnRfYWZ0ZXIFEGFtb3VudF9hcnRfYWZ0ZXIEFGNvbW1pc3Npb25zV2l0aEFnZW50AwkBAiE9AgUOYW1vdW50Rm9yQWdlbnQAAAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQULZmVlUmVjZWl2ZXIDCQAAAgUHYXNzZXRJZAUKYXJ0QXNzZXRJZAkAZQIFDWFtb3VudEZvclNpZ24FDmFtb3VudEZvckFnZW50CQBlAgUQYW1vdW50X2FydF9hZnRlcgURYW1vdW50X2FydF9iZWZvcmUFCmFydEFzc2V0SWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFBWFnZW50BQ5hbW91bnRGb3JBZ2VudAUHYXNzZXRJZAUDbmlsCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQtmZWVSZWNlaXZlcgMJAAACBQdhc3NldElkBQphcnRBc3NldElkBQ1hbW91bnRGb3JTaWduCQBlAgUQYW1vdW50X2FydF9hZnRlcgURYW1vdW50X2FydF9iZWZvcmUFCmFydEFzc2V0SWQFA25pbAQaY29tbWlzc2lvbnNXaXRoUHVibGljQWdlbnQDCQECIT0CBRRhbW91bnRGb3JQdWJsaWNBZ2VudAAACQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQtwdWJsaWNBZ2VudAUUYW1vdW50Rm9yUHVibGljQWdlbnQFB2Fzc2V0SWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFBmlzc3VlcgkAZQIFEGFtb3VudEZvckNyZWF0b3IFFGFtb3VudEZvclB1YmxpY0FnZW50BQdhc3NldElkBQNuaWwJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFBmlzc3VlcgUQYW1vdW50Rm9yQ3JlYXRvcgUHYXNzZXRJZAUDbmlsBAp0eFRvQ2FsbGVyAwULaXNTcG9uc29yZWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFBmNhbGxlcgAABQR1bml0BQNuaWwFA25pbAQGYnV5UmVzCQDOCAIJAM4IAgkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEJa2V5SXNzdWVkAgUGaXNzdWVyBQVhcnRJZAUNbmV3QW1vdW50U29sZAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgICBG5mdF8JANgEAQUFaWRORlQFB3NvbGRLZXkJAMwIAgkBDEludGVnZXJFbnRyeQICEHRvdGFsX25mdF9pc3N1ZWQJAGQCBQh0b3RhbE5GVAABCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEKa2V5RW5kU2FsZQIFBmlzc3VlcgUFYXJ0SWQAAAkAzAgCCQEMQm9vbGVhbkVudHJ5AgkBCWtleU9uU2FsZQIFBmlzc3VlcgUFYXJ0SWQFCnNlbGxTdGF0dXMJAMwIAgUIaXNzdWVORlQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUKcmVjZWl2ZU5GVAABBQVpZE5GVAUDbmlsBRRjb21taXNzaW9uc1dpdGhBZ2VudAUaY29tbWlzc2lvbnNXaXRoUHVibGljQWdlbnQFCnR4VG9DYWxsZXIDBQVpc0JpZAkAzAgCBQhzb2xkRGF0YQkAzAgCBQliaWRVcGRhdGUJAMwIAgUJYmlkRGVsT2xkBQZidXlSZXMJAMwIAgUIc29sZERhdGEFBmJ1eVJlcwkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEIYXNTdHJpbmcBAmJ2BAckbWF0Y2gwBQJidgMJAAECBQckbWF0Y2gwAgZTdHJpbmcEA2J2MAUHJG1hdGNoMAUDYnYwCQACAQIkU3BvbnNvcmVkIFB1YmxpYyBLZXkgU3RyaW5nIGV4cGVjdGVkCgZpbnZva2UBB3NldENvbmYCA2tleQN2YWwEBmNhbGxlcgkApQgBCAUGaW52b2tlBmNhbGxlcgMJAQ9jb250YWluc0VsZW1lbnQCCQDMCAIFBWNocmlzCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQZjYWxsZXIDCQEIY29udGFpbnMCBQNrZXkCBWNvbmZfCQDMCAIJAQtTdHJpbmdFbnRyeQIFA2tleQUDdmFsBQNuaWwJAAIBAiBFbnRyaWVzIHN0YXJ0aW5nIHdpdGggY29uZl8gb25seQkAAgECIllvdSBhcmUgbm90IGFsbG93ZWQgdG8gY2hhbmdlIHRoaXMBaQEKYWRkQXJ0d29yawwEbmFtZQtkZXNjcmlwdGlvbgR0YWdzBHR5cGUKY2lkRGlzcGxheQxzaGEyNTZFeHBvcnQJY2lkRXhwb3J0DXNoYTI1NkxpY2VuY2UKY2lkTGljZW5jZQdjcmF3bGVyCXJveWFsdGllcwZwdWJLZXkEDSR0MDIxNjMyMjE3MDUJARVpZENhbGxlckRhdGVTcG9uc29yZWQCBQFpBQZwdWJLZXkEBWFydElkCAUNJHQwMjE2MzIyMTcwNQJfMQQGY2FsbGVyCAUNJHQwMjE2MzIyMTcwNQJfMgQEZGF0ZQgFDSR0MDIxNjMyMjE3MDUCXzMEC2lzU3BvbnNvcmVkCAUNJHQwMjE2MzIyMTcwNQJfNAQNJHQwMjE3MTUyMTc4NAkBCnNldExJY2VuY2UCBQpjaWRMaWNlbmNlBQ1zaGEyNTZMaWNlbmNlBApsaWNlbmNlQ0lECAUNJHQwMjE3MTUyMTc4NAJfMQQLbGljZW5jZUhhc2gIBQ0kdDAyMTcxNTIxNzg0Al8yBA92YWxpZGF0ZUFydHdvcmsJARN2YWxpZGF0ZUFydHdvcmtEYXRhCgUGY2FsbGVyBQpjaWREaXNwbGF5BQljaWRFeHBvcnQFCmxpY2VuY2VDSUQFDHNoYTI1NkV4cG9ydAULbGljZW5jZUhhc2gFBG5hbWUFC2Rlc2NyaXB0aW9uBQR0YWdzBQlyb3lhbHRpZXMDCQECIT0CBQ92YWxpZGF0ZUFydHdvcmsCAAkAAgECFVNvbWV0aGluZyB3ZW50IHdyb25nIQQQd2hpdGVsaXN0ZWRfZHJvcAkAZgIJAQ5jaGVja1doaXRlbGlzdAEJAKwCAgUGY2FsbGVyAgtfZnJlZV9kcm9wcwAABA0kdDAyMjA4MzIyMTcxAwUQd2hpdGVsaXN0ZWRfZHJvcAkAlAoCAAAFCmFydEFzc2V0SWQJAQ92YWxpZGF0ZVBheW1lbnQBBQFpBAZhbW91bnQIBQ0kdDAyMjA4MzIyMTcxAl8xBAdhc3NldElkCAUNJHQwMjIwODMyMjE3MQJfMgMJAQEhAQkBCWlzRGVmaW5lZAEFBmFtb3VudAkAAgECFFNvbWV0aGluZyB3ZW50IHdyb25nBBdkZWNyZWFzZV93aGl0ZWxpc3RfZHJvcAMFEHdoaXRlbGlzdGVkX2Ryb3AJAPwHBAUNd2hpdGVsaXN0RGFwcAILdXNlRnJlZURyb3AJAMwIAgUGY2FsbGVyBQNuaWwFA25pbAUEdW5pdAMJAAACBRdkZWNyZWFzZV93aGl0ZWxpc3RfZHJvcAUXZGVjcmVhc2Vfd2hpdGVsaXN0X2Ryb3AECnR4VG9DYWxsZXIDBQtpc1Nwb25zb3JlZAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQUGY2FsbGVyAAAFBHVuaXQFA25pbAUDbmlsCQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIJAQdrZXlEYXRlAgUGY2FsbGVyBQVhcnRJZAUEZGF0ZQkAzAgCCQELU3RyaW5nRW50cnkCCQEHa2V5TmFtZQIFBmNhbGxlcgUFYXJ0SWQFBG5hbWUJAMwIAgkBC1N0cmluZ0VudHJ5AgkBB2tleURlc2MCBQZjYWxsZXIFBWFydElkBQtkZXNjcmlwdGlvbgkAzAgCCQELU3RyaW5nRW50cnkCCQENa2V5RGlzcGxheUNpZAIFBmNhbGxlcgUFYXJ0SWQFCmNpZERpc3BsYXkJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDGtleUV4cG9ydENpZAIFBmNhbGxlcgUFYXJ0SWQFCWNpZEV4cG9ydAkAzAgCCQELU3RyaW5nRW50cnkCCQENa2V5RXhwb3J0SGFzaAIFBmNhbGxlcgUFYXJ0SWQFDHNoYTI1NkV4cG9ydAkAzAgCCQELU3RyaW5nRW50cnkCCQEOa2V5TGljZW5jZUhhc2gCBQZjYWxsZXIFBWFydElkBQtsaWNlbmNlSGFzaAkAzAgCCQELU3RyaW5nRW50cnkCCQENa2V5TGljZW5jZUNpZAIFBmNhbGxlcgUFYXJ0SWQFCmxpY2VuY2VDSUQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBB2tleVR5cGUCBQZjYWxsZXIFBWFydElkBQR0eXBlCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQdrZXlUYWdzAgUGY2FsbGVyBQVhcnRJZAUEdGFncwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBCmtleU1heE1pbnQCBQZjYWxsZXIFBWFydElkAAAJAMwIAgkBDEludGVnZXJFbnRyeQIJAQlrZXlJc3N1ZWQCBQZjYWxsZXIFBWFydElkAAAJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAQlrZXlPblNhbGUCBQZjYWxsZXIFBWFydElkBwkAzAgCCQELU3RyaW5nRW50cnkCCQEKa2V5Q3Jhd2xlcgIFBmNhbGxlcgUFYXJ0SWQFB2NyYXdsZXIJAMwIAgkBDEludGVnZXJFbnRyeQIJAQxrZXlSb3lhbHRpZXMCBQZjYWxsZXIFBWFydElkBQlyb3lhbHRpZXMJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFC2ZlZVJlY2VpdmVyCQBpAgUGYW1vdW50AAIFCmFydEFzc2V0SWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUKcmVwb3J0RGFwcAkAaQIFBmFtb3VudAACBQphcnRBc3NldElkBQNuaWwFCnR4VG9DYWxsZXIJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQENdXBkYXRlQXJ0d29yaw0EdHhpZARuYW1lC2Rlc2NyaXB0aW9uBHRhZ3MEdHlwZQpjaWREaXNwbGF5DHNoYTI1NkV4cG9ydAljaWRFeHBvcnQNc2hhMjU2TGljZW5jZQpjaWRMaWNlbmNlB2NyYXdsZXIJcm95YWx0aWVzBnB1YktleQMJAQEhAQULZGFwcFJ1bm5pbmcJAAIBBQ5tYWludGVuYW5jZU1TRwQNJHQwMjQxNTAyNDIyMAkBFWlkQ2FsbGVyRGF0ZVNwb25zb3JlZAIFAWkFBnB1YktleQQCaWQIBQ0kdDAyNDE1MDI0MjIwAl8xBAZjYWxsZXIIBQ0kdDAyNDE1MDI0MjIwAl8yBARkYXRlCAUNJHQwMjQxNTAyNDIyMAJfMwQLaXNTcG9uc29yZWQIBQ0kdDAyNDE1MDI0MjIwAl80BA0kdDAyNDIzMDI0Mjk5CQEKc2V0TEljZW5jZQIFCmNpZExpY2VuY2UFDXNoYTI1NkxpY2VuY2UECmxpY2VuY2VDSUQIBQ0kdDAyNDIzMDI0Mjk5Al8xBAtsaWNlbmNlSGFzaAgFDSR0MDI0MjMwMjQyOTkCXzIED3ZhbGlkYXRlQXJ0d29yawkBE3ZhbGlkYXRlQXJ0d29ya0RhdGEKBQZjYWxsZXIFCmNpZERpc3BsYXkFCWNpZEV4cG9ydAUKbGljZW5jZUNJRAUMc2hhMjU2RXhwb3J0BQtsaWNlbmNlSGFzaAUEbmFtZQULZGVzY3JpcHRpb24FBHRhZ3MFCXJveWFsdGllcwMJAQIhPQIFD3ZhbGlkYXRlQXJ0d29yawIACQACAQIVU29tZXRoaW5nIHdlbnQgd3JvbmchBAplbnRyeUV4aXN0CQEOZ2V0U3RyaW5nQnlLZXkBCQEHa2V5TmFtZQIFBmNhbGxlcgUEdHhpZAMJAAACBQplbnRyeUV4aXN0AgAJAAIBAg9FbnRyeSBub3QgZm91bmQEBGZsYWcJAQ5nZXRTdHJpbmdCeUtleQEJAQdrZXlGbGFnAgUGY2FsbGVyBQR0eGlkAwkAAAIFBGZsYWcCB0lMTEVHQUwJAAIBAh1DYW5ub3QgdXBkYXRlIElMTEVHQUwgYXJ0d29yawMJAQEhAQkBC2lzQXJ0TWludGVkAgUGY2FsbGVyBQR0eGlkBAp0eFRvQ2FsbGVyAwULaXNTcG9uc29yZWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFBmNhbGxlcgAABQR1bml0BQNuaWwFA25pbAkAzggCCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQdrZXlOYW1lAgUGY2FsbGVyBQR0eGlkBQRuYW1lCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQdrZXlEZXNjAgUGY2FsbGVyBQR0eGlkBQtkZXNjcmlwdGlvbgkAzAgCCQELU3RyaW5nRW50cnkCCQENa2V5RGlzcGxheUNpZAIFBmNhbGxlcgUEdHhpZAUKY2lkRGlzcGxheQkAzAgCCQELU3RyaW5nRW50cnkCCQEMa2V5RXhwb3J0Q2lkAgUGY2FsbGVyBQR0eGlkBQljaWRFeHBvcnQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDWtleUV4cG9ydEhhc2gCBQZjYWxsZXIFBHR4aWQFDHNoYTI1NkV4cG9ydAkAzAgCCQELU3RyaW5nRW50cnkCCQENa2V5TGljZW5jZUNpZAIFBmNhbGxlcgUEdHhpZAUKbGljZW5jZUNJRAkAzAgCCQELU3RyaW5nRW50cnkCCQEOa2V5TGljZW5jZUhhc2gCBQZjYWxsZXIFBHR4aWQFC2xpY2VuY2VIYXNoCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQdrZXlUYWdzAgUGY2FsbGVyBQR0eGlkBQR0YWdzCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQdrZXlUeXBlAgUGY2FsbGVyBQR0eGlkBQR0eXBlCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQprZXlDcmF3bGVyAgUGY2FsbGVyBQR0eGlkBQdjcmF3bGVyCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEMa2V5Um95YWx0aWVzAgUGY2FsbGVyBQR0eGlkBQlyb3lhbHRpZXMFA25pbAUKdHhUb0NhbGxlcgkAAgECDkFscmVhZHkgbWludGVkAWkBC2ZsYWdBcnR3b3JrBAVhcnRJZARhZGRyBGZsYWcEbm90ZQQNJHQwMjU5MjYyNTk2MAkBDGlkQ2FsbGVyRGF0ZQEFAWkEAmlkCAUNJHQwMjU5MjYyNTk2MAJfMQQGY2FsbGVyCAUNJHQwMjU5MjYyNTk2MAJfMgMJAQ9jb250YWluc0VsZW1lbnQCCQDMCAIFBWNocmlzCQDMCAIJAKUIAQUEdGhpcwkAzAgCCQClCAEFCnJlcG9ydERhcHAFA25pbAUGY2FsbGVyAwkBD2NvbnRhaW5zRWxlbWVudAIJAMwIAgIHQ09OU0VOVAkAzAgCAgAJAMwIAgIPQ0hBTkdFX1JFUVVJUkVECQDMCAICB0ZMQUdHRUQJAMwIAgIHSUxMRUdBTAUDbmlsBQRmbGFnCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQdrZXlGbGFnAgUEYWRkcgUFYXJ0SWQFBGZsYWcJAMwIAgkBC1N0cmluZ0VudHJ5AgkBB2tleU5vdGUCBQRhZGRyBQVhcnRJZAUEbm90ZQUDbmlsCQACAQkArAICAg5Vbmtub3cgc3RhdHVzIAUEZmxhZwkAAgECE1lvdSBhcmUgbm90IGFsbG93ZWQBaQENZGVsZXRlQXJ0d29yawIFYXJ0SWQEYWRkcgQNJHQwMjY0MTgyNjQ1MgkBDGlkQ2FsbGVyRGF0ZQEFAWkEAmlkCAUNJHQwMjY0MTgyNjQ1MgJfMQQGY2FsbGVyCAUNJHQwMjY0MTgyNjQ1MgJfMgQJYWRkclRvVXNlAwkBD2NvbnRhaW5zRWxlbWVudAIJAMwIAgUFY2hyaXMJAMwIAgkApQgBBQR0aGlzBQNuaWwFBmNhbGxlcgUEYWRkcgUGY2FsbGVyBAplbnRyeUV4aXN0CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAQ5nZXRTdHJpbmdCeUtleQEJAQdrZXlOYW1lAgUJYWRkclRvVXNlBQVhcnRJZAIgTm8gYXJ0IG1hdGNoaW5nIGZvciB0aGlzIGFkZHJlc3MDCQAAAgUKZW50cnlFeGlzdAIACQACAQIgTm8gYXJ0IG1hdGNoaW5nIGZvciB0aGlzIGFkZHJlc3MECnNoYTI1Nkhhc2gJAQ5nZXRTdHJpbmdCeUtleQEJARFrZXlIYXNoQnlUeGlkQWRkcgIFCWFkZHJUb1VzZQUFYXJ0SWQEBnNpZ25JRAMJAQIhPQIFCnNoYTI1Nkhhc2gCAAkBDmdldFN0cmluZ0J5S2V5AQkBCWtleVNpZ25JRAIFCWFkZHJUb1VzZQUFYXJ0SWQCAAQNc2lnbklEX2xlZ2FjeQMJAAACBQZzaWduSUQCAAUDbmlsCQDMCAIJAQtEZWxldGVFbnRyeQEJAQ1rZXlpZEJ5U2lnbmlkAgUJYWRkclRvVXNlBQZzaWduSUQFA25pbAQMZGF0YVRvRGVsZXRlCQDOCAIJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBB2tleURhdGUCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQdrZXlOYW1lAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEHa2V5RGVzYwIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBDWtleURpc3BsYXlDaWQCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQxrZXlFeHBvcnRDaWQCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQ1rZXlFeHBvcnRIYXNoAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEOa2V5TGljZW5jZUhhc2gCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQ1rZXlMaWNlbmNlQ2lkAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEHa2V5VHlwZQIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBB2tleVRhZ3MCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQprZXlNYXhNaW50AgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEJa2V5U2lnbklEAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEJa2V5SXNzdWVkAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEJa2V5T25TYWxlAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEHa2V5RmxhZwIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBCGtleVByaWNlAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQESa2V5QXNzZXRJZEFjY2VwdGVkAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEOa2V5T3duZXJCeUhhc2gBBQpzaGEyNTZIYXNoCQDMCAIJAQtEZWxldGVFbnRyeQEJAQprZXlFbmRTYWxlAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEHa2V5Tm90ZQIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBCmtleUNyYXdsZXICBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQxrZXlSb3lhbHRpZXMCBQlhZGRyVG9Vc2UFBWFydElkBQNuaWwFDXNpZ25JRF9sZWdhY3kDCQEBIQEJAQtpc0FydE1pbnRlZAIFCWFkZHJUb1VzZQUFYXJ0SWQDCQEBIQEFC2RhcHBSdW5uaW5nCQACAQUObWFpbnRlbmFuY2VNU0cFDGRhdGFUb0RlbGV0ZQMJAQ9jb250YWluc0VsZW1lbnQCCQDMCAIFBWNocmlzCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQZjYWxsZXIFDGRhdGFUb0RlbGV0ZQkAAgECKEFydCBhbHJlYWR5IG1pbnRlZCwgeW91IGNhbm5vdCBkZWxldGUgaXQBaQELc2VsbEFydHdvcmsGBWFydElkBXByaWNlB21heE1pbnQHYXNzZXRJZAhibG9ja0VuZAZwdWJLZXkEDSR0MDI5MjMxMjkzMDEJARVpZENhbGxlckRhdGVTcG9uc29yZWQCBQFpBQZwdWJLZXkEAmlkCAUNJHQwMjkyMzEyOTMwMQJfMQQGY2FsbGVyCAUNJHQwMjkyMzEyOTMwMQJfMgQEZGF0ZQgFDSR0MDI5MjMxMjkzMDECXzMEC2lzU3BvbnNvcmVkCAUNJHQwMjkyMzEyOTMwMQJfNAQLYXJ0d29ya05hbWUJAQ5nZXRTdHJpbmdCeUtleQEJAQdrZXlOYW1lAgUGY2FsbGVyBQVhcnRJZAMJAAACBQthcnR3b3JrTmFtZQIACQACAQIjVGhpcyBhcnQgZG9lc24ndCBtYXRjaCB5b3VyIGFjY291bnQEBGZsYWcJAQ5nZXRTdHJpbmdCeUtleQEJAQdrZXlGbGFnAgUGY2FsbGVyBQVhcnRJZAMJAQ9jb250YWluc0VsZW1lbnQCCQDMCAICD0NIQU5HRV9SRVFVSVJFRAkAzAgCAgdGTEFHR0VECQDMCAICB0lMTEVHQUwFA25pbAUEZmxhZwkAAgECD0ZsYWdnZWQgYXJ0d29yawQGYmlkTmJyCQEPZ2V0SW50ZWdlckJ5S2V5AQkArAICAhJjdXJyZW50X2JpZGFtb3VudF8FBWFydElkAwkAZgIAAAUIYmxvY2tFbmQJAAIBAgxOZWdhdGl2ZSBlbmQDAwkAZgIFCGJsb2NrRW5kAAADCQECIT0CBQdtYXhNaW50AAEGCQECIT0CBQVwcmljZQAABwkAAgECOlRpbWVkIG9mZmVyIG9ubHkgYWxsb3dlZCBmb3IgdW5pcXVlIGVkaXRpb24gYW5kIG9mZmVyIG9ubHkECmJhc2VIZWlnaHQDCQAAAgUIYmxvY2tFbmQAAAAABQZoZWlnaHQDCQEBIQEJARBhY2NlcHRlZEFzc2V0SWRzAQUHYXNzZXRJZAkAAgECFVNvbWV0aGluZyB3ZW50IHdyb25nIQMJAQEhAQkBD3ZhbGlkYXRlTWluU2VsbAEFBXByaWNlCQACAQIVU29tZXRoaW5nIHdlbnQgd3JvbmchBAljaGVja1VzZXIJAQx2YWxpZGF0ZVVzZXIBBQZjYWxsZXIDCQECIT0CBQljaGVja1VzZXICAAkAAgEFCWNoZWNrVXNlcgQKYW1vdW50U29sZAkBD2dldEludGVnZXJCeUtleQEJAQlrZXlJc3N1ZWQCBQZjYWxsZXIFBWFydElkBAptYXhDYW5TZWxsCQEPZ2V0SW50ZWdlckJ5S2V5AQkBCmtleU1heE1pbnQCBQZjYWxsZXIFBWFydElkAwkAZgIFB21heE1pbnQAZAkAAgECHDEwMCBlZGl0aW9ucyBtYXggcGVyIGFydHdvcmsDAwkBAiE9AgUKYW1vdW50U29sZAAACQAAAgUKYW1vdW50U29sZAUKbWF4Q2FuU2VsbAcJAAIBAhRNYXggZWRpdGlvbiByZWFjaGVkLgMDCQBmAgUKYW1vdW50U29sZAAACQECIT0CBQptYXhDYW5TZWxsBQdtYXhNaW50BwkAAgECJkNhbm5vdCBjaGFuZ2UgbWF4aW11bSBpc3N1YWJsZSBhbnltb3JlAwMJAGYCBQZiaWROYnIAAAkBAiE9AgUKbWF4Q2FuU2VsbAUHbWF4TWludAcJAAIBAjFDYW5ub3QgY2hhbmdlIG1heGltdW0gaXNzdWFibGUgd2l0aCBhY3RpdmUgb3JkZXJzBApzZWxsU3RhdHVzAwMJAGYCBQVwcmljZQAACQBmAgUHbWF4TWludAAABwYHBAp0eFRvQ2FsbGVyAwULaXNTcG9uc29yZWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFBmNhbGxlcgAABQR1bml0BQNuaWwFA25pbAkAzggCCQDMCAIJAQxCb29sZWFuRW50cnkCCQEJa2V5T25TYWxlAgUGY2FsbGVyBQVhcnRJZAUKc2VsbFN0YXR1cwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBCGtleVByaWNlAgUGY2FsbGVyBQVhcnRJZAUFcHJpY2UJAMwIAgkBDEludGVnZXJFbnRyeQIJAQprZXlNYXhNaW50AgUGY2FsbGVyBQVhcnRJZAUHbWF4TWludAkAzAgCCQELU3RyaW5nRW50cnkCCQESa2V5QXNzZXRJZEFjY2VwdGVkAgUGY2FsbGVyBQVhcnRJZAUHYXNzZXRJZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBCmtleUVuZFNhbGUCBQZjYWxsZXIFBWFydElkCQBkAgUKYmFzZUhlaWdodAUIYmxvY2tFbmQFA25pbAUKdHhUb0NhbGxlcgFpAQpidXlBcnR3b3JrAgVhcnRJZAZpc3N1ZXIJAQdidXlNaW50BgUBaQUFYXJ0SWQFBmlzc3VlcgIAAgACAAFpAQZzZXRCaWQCBWFydElkBmlzc3VlcgQNJHQwMzE2NzQzMTcxNAkBDGlkQ2FsbGVyRGF0ZQEFAWkEAmlkCAUNJHQwMzE2NzQzMTcxNAJfMQQGY2FsbGVyCAUNJHQwMzE2NzQzMTcxNAJfMgQEZGF0ZQgFDSR0MDMxNjc0MzE3MTQCXzMEDSR0MDMxNzE5MzE3NTUJAQlpc1BheW1lbnQBBQFpBAdwYXltZW50CAUNJHQwMzE3MTkzMTc1NQJfMQQGYW1vdW50CAUNJHQwMzE3MTkzMTc1NQJfMgQHYXNzZXRJZAMJAQEhAQkBCWlzRGVmaW5lZAEIBQdwYXltZW50B2Fzc2V0SWQCBVdBVkVTCQDYBAEJAQV2YWx1ZQEIBQdwYXltZW50B2Fzc2V0SWQECGJsb2NrRW5kCQEPZ2V0SW50ZWdlckJ5S2V5AQkBCmtleUVuZFNhbGUCBQZpc3N1ZXIFBWFydElkAwMJAQIhPQIFCGJsb2NrRW5kAAAJAGcCBQZoZWlnaHQFCGJsb2NrRW5kBwkAAgECC1NhbGUgZW5kZWQuBAZiaWROYnIJAQ9nZXRJbnRlZ2VyQnlLZXkBCQCsAgICEmN1cnJlbnRfYmlkYW1vdW50XwUFYXJ0SWQDCQEBIQEJARBhY2NlcHRlZEFzc2V0SWRzAQUHYXNzZXRJZAkAAgECEmFzc2V0IG5vdCBhY2NlcHRlZAMJAQEhAQkBD3ZhbGlkYXRlTWluU2VsbAEFBmFtb3VudAkAAgECDldyb25nIG1pbiBzZWxsBAphbW91bnRTb2xkCQEPZ2V0SW50ZWdlckJ5S2V5AQkBCWtleUlzc3VlZAIFBmlzc3VlcgUFYXJ0SWQECm1heENhblNlbGwJAQ9nZXRJbnRlZ2VyQnlLZXkBCQEKa2V5TWF4TWludAIFBmlzc3VlcgUFYXJ0SWQDCQBnAgAABQptYXhDYW5TZWxsCQACAQIjTm8gbWF4IGVkaXRpb24gc2V0IGZvciB0aGlzIGFydHdvcmsDCQBnAgUKYW1vdW50U29sZAUKbWF4Q2FuU2VsbAkAAgECGFNvbGQgb3V0LCB5b3UgY2Fubm90IGJpZAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIEYmlkXwUFYXJ0SWQCAV8FBmlzc3VlcgIBXwUGY2FsbGVyAgFfBQJpZAIFX09QRU4JAKwCAgkArAICCQCsAgIJAKwCAgUHYXNzZXRJZAIBXwkApAMBBQZhbW91bnQCAV8JAKQDAQUEZGF0ZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICAhJjdXJyZW50X2JpZGFtb3VudF8FBWFydElkCQBkAgUGYmlkTmJyAAEFA25pbAFpAQlhY2NlcHRCaWQFBWFydElkBmlzc3VlcgViaWRJZAhiaWRPd25lcgZwdWJLZXkJAQdidXlNaW50BgUBaQUFYXJ0SWQFBmlzc3VlcgUFYmlkSWQFCGJpZE93bmVyBQZwdWJLZXkBaQEJY2FuY2VsQmlkBAVhcnRJZAZpc3N1ZXIFYmlkSWQIYmlkT3duZXIEDSR0MDMzMDc5MzMxNDAJAQxpZENhbGxlckRhdGUBBQFpBAJpZAgFDSR0MDMzMDc5MzMxNDACXzEEBmNhbGxlcggFDSR0MDMzMDc5MzMxNDACXzIEBGRhdGUIBQ0kdDAzMzA3OTMzMTQwAl8zAwMJAQIhPQIFBmNhbGxlcgUIYmlkT3duZXIJAQIhPQIFBmNhbGxlcgUGaXNzdWVyBwkAAgECGVlvdSBjYW5ub3QgZG8gdGhpcyBhY3Rpb24EDXJldHVybk1vbmV5VG8DCQAAAgUGY2FsbGVyBQZpc3N1ZXIFCGJpZE93bmVyBQZjYWxsZXIEBmJpZE5icgkBD2dldEludGVnZXJCeUtleQEJAKwCAgISY3VycmVudF9iaWRhbW91bnRfBQVhcnRJZAQKYmlkRGF0YUtleQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAgRiaWRfBQVhcnRJZAIBXwUGaXNzdWVyAgFfBQhiaWRPd25lcgIBXwUFYmlkSWQEB2JpZERhdGEJAQ5nZXRTdHJpbmdCeUtleQEJAKwCAgUKYmlkRGF0YUtleQIFX09QRU4DCQAAAgUHYmlkRGF0YQIACQACAQINQmlkIG5vdCBmb3VuZAQKYmlkRGF0YUFycgkAtQkCBQdiaWREYXRhAgFfBAdhc3NldElkCQENZ2V0QmlkQXNzZXRJZAEJAJEDAgUKYmlkRGF0YUFycgAABAliaWRTdGF0dXMCCENBTkNFTEVECQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgUKYmlkRGF0YUtleQIFX09QRU4JAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIFCmJpZERhdGFLZXkCAV8FCWJpZFN0YXR1cwkArAICCQCsAgIFB2JpZERhdGECAV8JAKQDAQUEZGF0ZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICAhJjdXJyZW50X2JpZGFtb3VudF8FBWFydElkCQBlAgUGYmlkTmJyAAEJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFDXJldHVybk1vbmV5VG8JAQ1wYXJzZUludFZhbHVlAQkAkQMCBQpiaWREYXRhQXJyAAEFB2Fzc2V0SWQFA25pbAECdHgBCHZlcmlmaWVyAAQHJG1hdGNoMAUCdHgDCQABAgUHJG1hdGNoMAIXSW52b2tlU2NyaXB0VHJhbnNhY3Rpb24EA2ludgUHJG1hdGNoMAMDAwMJAAACCAUDaW52CGZ1bmN0aW9uAgphZGRBcnR3b3JrCQAAAggFA2ludgRkQXBwBQR0aGlzBwkAAAIIBQNpbnYDZmVlAKDCHgcJAAACCAUDaW52CmZlZUFzc2V0SWQFBHVuaXQHCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACQDZBAEJAQhhc1N0cmluZwEJAJEDAggFA2ludgRhcmdzAAsDAwMDCQAAAggFA2ludghmdW5jdGlvbgINdXBkYXRlQXJ0d29yawkAAAIIBQNpbnYEZEFwcAUEdGhpcwcJAAACCAUDaW52A2ZlZQCgwh4HCQAAAggFA2ludgpmZWVBc3NldElkBQR1bml0BwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAkA2QQBCQEIYXNTdHJpbmcBCQCRAwIIBQNpbnYEYXJncwAMAwMDAwkAAAIIBQNpbnYIZnVuY3Rpb24CC3NlbGxBcnR3b3JrCQAAAggFA2ludgRkQXBwBQR0aGlzBwkAAAIIBQNpbnYDZmVlAKDCHgcJAAACCAUDaW52CmZlZUFzc2V0SWQFBHVuaXQHCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACQDZBAEJAQhhc1N0cmluZwEJAJEDAggFA2ludgRhcmdzAAUDAwMDCQAAAggFA2ludghmdW5jdGlvbgIJYWNjZXB0QmlkCQAAAggFA2ludgRkQXBwBQR0aGlzBwkAAAIIBQNpbnYDZmVlAKDCHgcJAAACCAUDaW52CmZlZUFzc2V0SWQFBHVuaXQHCQDIEwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACQDZBAEJAQhhc1N0cmluZwEJAJEDAggFA2ludgRhcmdzAAQJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAIBQJ0eA9zZW5kZXJQdWJsaWNLZXkJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAIBQJ0eA9zZW5kZXJQdWJsaWNLZXnqd3+D", "height": 2794939, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 3KKVXa7rpLAwbnoresxHp46ppM2o349MtkAc4MCmgDR5 Next: DoPNT1robSaH6qcNGeeGK5KLsEj7UprszpCQPXnX5hc2 Diff:
OldNewDifferences
658658 let $t02592625960 = idCallerDate(i)
659659 let id = $t02592625960._1
660660 let caller = $t02592625960._2
661- if (containsElement([chris, toString(this)], caller))
661+ if (containsElement([chris, toString(this), toString(reportDapp)], caller))
662662 then if (containsElement(["CONSENT", "", "CHANGE_REQUIRED", "FLAGGED", "ILLEGAL"], flag))
663663 then [StringEntry(keyFlag(addr, artId), flag), StringEntry(keyNote(addr, artId), note)]
664664 else throw(("Unknow status " + flag))
669669
670670 @Callable(i)
671671 func deleteArtwork (artId,addr) = {
672- let $t02639626430 = idCallerDate(i)
673- let id = $t02639626430._1
674- let caller = $t02639626430._2
672+ let $t02641826452 = idCallerDate(i)
673+ let id = $t02641826452._1
674+ let caller = $t02641826452._2
675675 let addrToUse = if (containsElement([chris, toString(this)], caller))
676676 then addr
677677 else caller
701701
702702 @Callable(i)
703703 func sellArtwork (artId,price,maxMint,assetId,blockEnd,pubKey) = {
704- let $t02920929279 = idCallerDateSponsored(i, pubKey)
705- let id = $t02920929279._1
706- let caller = $t02920929279._2
707- let date = $t02920929279._3
708- let isSponsored = $t02920929279._4
704+ let $t02923129301 = idCallerDateSponsored(i, pubKey)
705+ let id = $t02923129301._1
706+ let caller = $t02923129301._2
707+ let date = $t02923129301._3
708+ let isSponsored = $t02923129301._4
709709 let artworkName = getStringByKey(keyName(caller, artId))
710710 if ((artworkName == ""))
711711 then throw("This art doesn't match your account")
779779
780780 @Callable(i)
781781 func setBid (artId,issuer) = {
782- let $t03165231692 = idCallerDate(i)
783- let id = $t03165231692._1
784- let caller = $t03165231692._2
785- let date = $t03165231692._3
786- let $t03169731733 = isPayment(i)
787- let payment = $t03169731733._1
788- let amount = $t03169731733._2
782+ let $t03167431714 = idCallerDate(i)
783+ let id = $t03167431714._1
784+ let caller = $t03167431714._2
785+ let date = $t03167431714._3
786+ let $t03171931755 = isPayment(i)
787+ let payment = $t03171931755._1
788+ let amount = $t03171931755._2
789789 let assetId = if (!(isDefined(payment.assetId)))
790790 then "WAVES"
791791 else toBase58String(value(payment.assetId))
821821
822822 @Callable(i)
823823 func cancelBid (artId,issuer,bidId,bidOwner) = {
824- let $t03305733118 = idCallerDate(i)
825- let id = $t03305733118._1
826- let caller = $t03305733118._2
827- let date = $t03305733118._3
824+ let $t03307933140 = idCallerDate(i)
825+ let id = $t03307933140._1
826+ let caller = $t03307933140._2
827+ let date = $t03307933140._3
828828 if (if ((caller != bidOwner))
829829 then (caller != issuer)
830830 else false)
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let VERSION = "2.0.0"
55
66 func getStringByKey (key) = valueOrElse(getString(this, key), "")
77
88
99 let unitTest = false
1010
1111 let oracleFee = value(addressFromString(getStringByKey("conf_oracle_fee")))
1212
1313 let signDapp = value(addressFromString(getStringByKey("conf_signweb_dapp")))
1414
1515 let feeReceiver = getStringByKey("conf_fee_receiver")
1616
1717 let userDapp = if (unitTest)
1818 then value(addressFromString("3Mt4RGMEyjSWYAocTPqd55wdHQQB3PU2UCm"))
1919 else value(addressFromString(getStringByKey("conf_users_dapp")))
2020
2121 let whitelistDapp = value(addressFromString(getStringByKey("conf_whitelist_dapp")))
2222
2323 let puzzle_art_pool = getStringByKey("conf_puzzle_art_pool")
2424
2525 let reportDapp = value(addressFromString(getStringByKey("conf_report_dapp")))
2626
2727 let usdtPPAssetId_str = getStringByKey("conf_accepted_asset_USDT_PP")
2828
2929 let artAssetId_str = getStringByKey("conf_accepted_asset_ART")
3030
3131 let usdcPPAssetId_str = getStringByKey("conf_accepted_asset_USDC_PP")
3232
3333 let eastAssetId_str = getStringByKey("conf_accepted_asset_EAST")
3434
3535 let puzzleAssetId_str = getStringByKey("conf_accepted_asset_PUZZLE")
3636
3737 let ethPPAssetId_str = getStringByKey("conf_accepted_asset_ETH_PP")
3838
3939 let wavesAssetId_str = "WAVES"
4040
4141 let usdtPPAssetId = fromBase58String(usdtPPAssetId_str)
4242
4343 let artAssetId = fromBase58String(artAssetId_str)
4444
4545 let usdcPPAssetId = fromBase58String(usdcPPAssetId_str)
4646
4747 let eastAssetId = fromBase58String(eastAssetId_str)
4848
4949 let puzzleAssetId = fromBase58String(puzzleAssetId_str)
5050
5151 let ethPPAssetId = fromBase58String(ethPPAssetId_str)
5252
5353 let wavesAssetId = base58''
5454
5555 let all_accepted_assets = [usdtPPAssetId_str, artAssetId_str, usdcPPAssetId_str, eastAssetId_str, puzzleAssetId_str, wavesAssetId_str, ethPPAssetId_str]
5656
5757 let chris = getStringByKey("conf_admin_1")
5858
5959 func getIntegerByKeyFromOracle (key) = valueOrErrorMessage(getInteger(oracleFee, key), "Integer undefine or 0 in oracle")
6060
6161
6262 func getIntegerByKey (key) = valueOrElse(getInteger(this, key), 0)
6363
6464
6565 func checkWhitelist (key) = valueOrElse(getInteger(whitelistDapp, key), 0)
6666
6767
6868 func getBooleanByKey (key) = valueOrElse(getBoolean(this, key), false)
6969
7070
7171 let commission_fee = 8
7272
7373 let defaultLicence = getStringByKey("conf_default_licence")
7474
7575 let defaultHashLicence = getStringByKey("conf_default_licence_hash")
7676
7777 let dappRunning = valueOrElse(getBoolean(userDapp, "conf_dapp_is_running"), true)
7878
7979 let maintenanceMSG = valueOrElse(getString(userDapp, "conf_maintenance_msg"), "")
8080
8181 let userSuspended = "SUSPENDED"
8282
8383 let userRemoved = "REMOVED"
8484
8585 let userUnregistered = "UNREGISTERED"
8686
8787 let userAllowed = "ALLOWED"
8888
8989 let currentCertificationPrice = getIntegerByKeyFromOracle(("certification_fee_" + toBase58String(artAssetId)))
9090
9191 let mint_fee = getIntegerByKeyFromOracle(("mint_fee_" + toBase58String(artAssetId)))
9292
9393 func getArtworkRoyalties (key) = valueOrElse(getInteger(this, key), 1000)
9494
9595
9696 func validateCID (cid) = if (contains(cid, "/"))
9797 then if (if ((76 > size(cid)))
9898 then (size(split(cid, "/")[0]) == 59)
9999 else false)
100100 then (16 > size(split(cid, "/")[1]))
101101 else false
102102 else false
103103
104104
105105 func validateHash (hash) = (size(hash) == 64)
106106
107107
108108 func keyUserStatus (caller) = ("user_status_" + caller)
109109
110110
111111 func keyDate (caller,artId) = ((("art_date_" + artId) + "_") + caller)
112112
113113
114114 func keyName (caller,artId) = ((("art_name_" + artId) + "_") + caller)
115115
116116
117117 func keyDesc (caller,artId) = ((("art_desc_" + artId) + "_") + caller)
118118
119119
120120 func keyDisplayCid (caller,artId) = ((("art_display_cid_" + artId) + "_") + caller)
121121
122122
123123 func keyExportHash (caller,artId) = ((("art_export_hash_" + artId) + "_") + caller)
124124
125125
126126 func keyExportCid (caller,artId) = ((("art_export_cid_" + artId) + "_") + caller)
127127
128128
129129 func keyMaxMint (caller,artId) = ((("art_maxmint_" + artId) + "_") + caller)
130130
131131
132132 func keySignID (caller,artId) = ((("art_signid_" + artId) + "_") + caller)
133133
134134
135135 func keyIssued (caller,artId) = ((("art_issued_" + artId) + "_") + caller)
136136
137137
138138 func keyOnSale (caller,artId) = ((("art_onsale_" + artId) + "_") + caller)
139139
140140
141141 func keyLicenceHash (caller,artId) = ((("art_licence_hash_" + artId) + "_") + caller)
142142
143143
144144 func keyLicenceCid (caller,artId) = ((("art_licence_cid_" + artId) + "_") + caller)
145145
146146
147147 func keyTags (caller,artId) = ((("art_tags_" + artId) + "_") + caller)
148148
149149
150150 func keyType (caller,artId) = ((("art_type_" + artId) + "_") + caller)
151151
152152
153153 func keyNote (caller,artId) = ((("art_note_" + artId) + "_") + caller)
154154
155155
156156 func keyCrawler (caller,artId) = ((("art_crawler_cid_" + artId) + "_") + caller)
157157
158158
159159 func keyRoyalties (caller,artId) = ((("art_royalties_" + artId) + "_") + caller)
160160
161161
162162 func keyPrice (caller,artId) = ((("art_price_" + artId) + "_") + caller)
163163
164164
165165 func keyEndSale (caller,artId) = ((("art_endsale_" + artId) + "_") + caller)
166166
167167
168168 func keyAssetIdAccepted (caller,artId) = ((("art_assetAccepted_" + artId) + "_") + caller)
169169
170170
171171 func keyFlag (caller,artId) = ((("art_flag_" + artId) + "_") + caller)
172172
173173
174174 func keyArtistAgentAddr (artistAddr) = ("artist_agent_" + artistAddr)
175175
176176
177177 func keyPrimaryShareAgent (artistAddr) = ("artist_agent_primary_" + artistAddr)
178178
179179
180180 func keyArtistPublicAgentAddr (artistAddr) = ("artist_public_agent_" + artistAddr)
181181
182182
183183 func keyPrimarySharePublicAgent (artistAddr) = ("artist_public_agent_primary_" + artistAddr)
184184
185185
186186 func keyHashByTxidAddr (caller,txid) = ((("get_hashbytxidaddr_" + txid) + "_") + caller)
187187
188188
189189 func keyOwnerByHash (sha256Hash) = ("get_owner_by_hash_" + sha256Hash)
190190
191191
192192 func keyidBySignid (caller,signId) = ((("get_artidbysignid_" + signId) + "_") + caller)
193193
194194
195195 func validateAllCID (cidDisplay,cidExport,cidLicence) = if (!(validateCID(cidDisplay)))
196196 then throw("Wrong Display CID")
197197 else if (!(validateCID(cidExport)))
198198 then throw("Wrong Export CID")
199199 else if (if ((cidLicence != ""))
200200 then !(validateCID(cidLicence))
201201 else false)
202202 then throw("Wrong Licence CID")
203203 else true
204204
205205
206206 func validateAllHash (sha256Export,sha256Licence) = if (!(validateHash(sha256Export)))
207207 then throw("Export Hash 64 char. max")
208208 else if (!(validateHash(sha256Licence)))
209209 then throw("Licence Hash 64 char. max")
210210 else true
211211
212212
213213 func validateString (str,max) = if ((size(str) == 0))
214214 then throw("Field cannot be is empty")
215215 else if ((size(str) > max))
216216 then throw((str + " is too long"))
217217 else true
218218
219219
220220 func validateUser (caller) = {
221221 let userStatus = valueOrElse(getString(userDapp, keyUserStatus(caller)), userUnregistered)
222222 if (if ((userStatus == userUnregistered))
223223 then true
224224 else (userStatus == userAllowed))
225225 then "Register this account first with \"Account\" tab"
226226 else if ((userStatus == userSuspended))
227227 then "Account suspended"
228228 else if ((userStatus == userRemoved))
229229 then "Account removed"
230230 else ""
231231 }
232232
233233
234234 func setLIcence (cidLicence,sha256Licence) = {
235235 let cid = if ((size(cidLicence) == 0))
236236 then defaultLicence
237237 else cidLicence
238238 let hash = if ((size(sha256Licence) == 0))
239239 then defaultHashLicence
240240 else sha256Licence
241241 $Tuple2(cid, hash)
242242 }
243243
244244
245245 func validateArtworkData (caller,cidDisplay,cidExport,licenceCID,sha256Export,licenceHash,name,description,tags,royalties) = {
246246 let checkUser = validateUser(caller)
247247 if ((checkUser != ""))
248248 then throw(checkUser)
249249 else if ((size(cidDisplay) == 0))
250250 then throw("Display CID cannot be empty")
251251 else if (!(validateAllCID(cidDisplay, cidExport, licenceCID)))
252252 then throw("Problem with CID")
253253 else if (!(validateAllHash(sha256Export, licenceHash)))
254254 then throw("Problem with Hashes")
255255 else if (!(validateString(name, 100)))
256256 then throw("100 Char. max name")
257257 else if (!(validateString(description, 1000)))
258258 then throw("1000 Char. max description")
259259 else if (if ((0 > royalties))
260260 then true
261261 else (royalties > 1000))
262262 then throw("Royalties cannot be less than 0% or higher than 10%")
263263 else if ((size(split(tags, ",")) > 5))
264264 then throw("5 tags max.")
265265 else ""
266266 }
267267
268268
269269 func isPayment (i) = if ((size(i.payments) == 0))
270270 then throw("No payment attached")
271271 else {
272272 let payment = value(i.payments[0])
273273 let amount = value(payment.amount)
274274 $Tuple2(payment, amount)
275275 }
276276
277277
278278 func validatePayment (i) = {
279279 let $t01023410270 = isPayment(i)
280280 let payment = $t01023410270._1
281281 let amount = $t01023410270._2
282282 let assetId = if (if (isDefined(payment.assetId))
283283 then (payment.assetId == artAssetId)
284284 else false)
285285 then payment.assetId
286286 else throw("Only SIGN token accepted as transaction fee")
287287 if ((amount != (currentCertificationPrice * 2)))
288288 then throw(("Payment amount should be " + toString((currentCertificationPrice * 2))))
289289 else $Tuple2(amount, assetId)
290290 }
291291
292292
293293 func isArtMinted (addrToUse,artId) = match getInteger(this, keyIssued(addrToUse, artId)) {
294294 case b: Int =>
295295 if ((b != 0))
296296 then true
297297 else false
298298 case _ =>
299299 false
300300 }
301301
302302
303303 func validatePriceAssetId (i,priceAssetId,artworkPrice) = {
304304 let $t01086710903 = isPayment(i)
305305 let payment = $t01086710903._1
306306 let amount = $t01086710903._2
307307 let assetId = if (!(isDefined(payment.assetId)))
308308 then unit
309309 else if (if ((size(priceAssetId) > 0))
310310 then (toBase58String(value(payment.assetId)) == priceAssetId)
311311 else false)
312312 then payment.assetId
313313 else throw("Wrong asset id")
314314 if (if ((assetId == unit))
315315 then (priceAssetId != "")
316316 else false)
317317 then throw("Wrong asset id")
318318 else if ((artworkPrice != amount))
319319 then throw("Payment don't match")
320320 else $Tuple2(amount, assetId)
321321 }
322322
323323
324324 func acceptedAssetIds (assetId) = if (!(containsElement(all_accepted_assets, assetId)))
325325 then throw("Only $ART, USDT-PP, USDC-PP, EAST, PUZZLE, ETH or WAVES accepted")
326326 else true
327327
328328
329329 func validateMinSell (price) = if ((0 >= price))
330330 then throw("Wrong minimum sell price")
331331 else true
332332
333333
334334 func getBidAssetId (assetId) = if ((assetId == "WAVES"))
335335 then unit
336336 else fromBase58String(assetId)
337337
338338
339339 func getPriceAssetIdFromBid (bidDataKey) = {
340340 let bidData = getStringByKey((bidDataKey + "_OPEN"))
341341 if ((bidData == ""))
342342 then throw("Bid not found")
343343 else {
344344 let bidDataArr = split(bidData, "_")
345345 let bidAmount = parseIntValue(bidDataArr[1])
346346 let bidAssetId = getBidAssetId(bidDataArr[0])
347347 if ((0 >= bidAmount))
348348 then throw("Wrong amount")
349349 else $Tuple2(bidAmount, bidAssetId)
350350 }
351351 }
352352
353353
354354 func idCallerDateSponsored (i,pubKey) = if (!(dappRunning))
355355 then throw(maintenanceMSG)
356356 else {
357357 let isSponsored = if ((pubKey != ""))
358358 then valueOrElse(checkWhitelist((toString(addressFromPublicKey(fromBase58String(pubKey))) + "_free_txs")), 0)
359359 else 0
360360 let caller = if (if ((toBase58String(i.caller.bytes) == toString(this)))
361361 then (isSponsored > 0)
362362 else false)
363363 then toString(addressFromPublicKey(fromBase58String(pubKey)))
364364 else toBase58String(i.caller.bytes)
365365 let get_sponsored_waves = if (if ((pubKey != ""))
366366 then (isSponsored > 0)
367367 else false)
368368 then invoke(whitelistDapp, "useFreeTx", [toString(addressFromPublicKey(fromBase58String(pubKey)))], nil)
369369 else unit
370370 if ((get_sponsored_waves == get_sponsored_waves))
371371 then $Tuple4(toBase58String(i.transactionId), caller, lastBlock.timestamp, (isSponsored > 0))
372372 else throw("Strict value is not equal to itself.")
373373 }
374374
375375
376376 func idCallerDate (i) = if (!(dappRunning))
377377 then throw(maintenanceMSG)
378378 else $Tuple3(toBase58String(i.transactionId), toBase58String(i.caller.bytes), lastBlock.timestamp)
379379
380380
381381 func getBalance (assetId) = match assetId {
382382 case b: ByteVector =>
383383 assetBalance(this, b)
384384 case _ =>
385385 wavesBalance(this).available
386386 }
387387
388388
389389 func buyMint (i,artId,issuer,bidId,bidOwner,pubKey) = {
390390 let $t01350813597 = idCallerDateSponsored(i, pubKey)
391391 let id = $t01350813597._1
392392 let caller = $t01350813597._2
393393 let date = $t01350813597._3
394394 let isSponsored = $t01350813597._4
395395 let isBid = if (if (if ((caller == issuer))
396396 then (bidOwner != "")
397397 else false)
398398 then (bidId != "")
399399 else false)
400400 then true
401401 else false
402402 if (if (isBid)
403403 then (caller != issuer)
404404 else false)
405405 then throw("You cannot do this action")
406406 else {
407407 let blockEnd = getIntegerByKey(keyEndSale(caller, artId))
408408 if (if (if ((blockEnd != 0))
409409 then (height >= blockEnd)
410410 else false)
411411 then !(isBid)
412412 else false)
413413 then throw("Sale ended.")
414414 else {
415415 let callerIsIssuer = (caller == issuer)
416416 let totalNFT = getIntegerByKey("total_nft_issued")
417417 let artworkName = getStringByKey(keyName(issuer, artId))
418418 if ((artworkName == ""))
419419 then throw("Art doesn't exist")
420420 else {
421421 let isOnSale = getBooleanByKey(keyOnSale(issuer, artId))
422422 let amountSold = getIntegerByKey(keyIssued(issuer, artId))
423423 let artworkPrice = if (callerIsIssuer)
424424 then mint_fee
425425 else getIntegerByKey(keyPrice(issuer, artId))
426426 let priceAssetId = if (callerIsIssuer)
427427 then toBase58String(artAssetId)
428428 else getStringByKey(keyAssetIdAccepted(issuer, artId))
429429 let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
430430 if (if (if (!(isBid))
431431 then !(callerIsIssuer)
432432 else false)
433433 then if (if ((0 >= artworkPrice))
434434 then true
435435 else !(isOnSale))
436436 then true
437437 else (0 >= maxCanSell)
438438 else false)
439439 then throw("Art not for sale")
440440 else if (if (if (!(isBid))
441441 then callerIsIssuer
442442 else false)
443443 then (0 >= maxCanSell)
444444 else false)
445445 then throw("Max issuable not set")
446446 else {
447447 let checkUser = validateUser(issuer)
448448 if (if (isBid)
449449 then (checkUser != "")
450450 else false)
451451 then throw(checkUser)
452452 else {
453453 let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
454454 let $t01517415366 = if (isBid)
455455 then getPriceAssetIdFromBid(bidDataKey)
456456 else validatePriceAssetId(i, priceAssetId, artworkPrice)
457457 let amount = $t01517415366._1
458458 let assetId = $t01517415366._2
459459 let agent = valueOrElse(getString(userDapp, keyArtistAgentAddr(issuer)), feeReceiver)
460460 let agentShare = valueOrElse(getInteger(userDapp, keyPrimaryShareAgent(issuer)), 0)
461461 let publicAgent = valueOrElse(getString(userDapp, keyArtistPublicAgentAddr(issuer)), feeReceiver)
462462 let publicAgentShare = valueOrElse(getInteger(userDapp, keyPrimarySharePublicAgent(issuer)), 0)
463463 let isWhitelisted = checkWhitelist(issuer)
464464 let amountForSign = fraction(amount, commission_fee, 100)
465465 let amountForAgent = if (if (if ((agent != feeReceiver))
466466 then (agentShare > 0)
467467 else false)
468468 then (height > isWhitelisted)
469469 else false)
470470 then fraction(amount, agentShare, 10000)
471471 else 0
472472 let amountForPublicAgent = if (if (if ((publicAgent != feeReceiver))
473473 then (publicAgentShare > 0)
474474 else false)
475475 then (height > isWhitelisted)
476476 else false)
477477 then fraction(amount, publicAgentShare, 10000)
478478 else 0
479479 let amountForCreator = (amount - amountForSign)
480480 if ((amountSold == maxCanSell))
481481 then throw("Art sold out")
482482 else {
483483 let newAmountSold = (amountSold + 1)
484484 let issueMeta = ((((((((("Creator: " + issuer) + ",
485485 ArtID: ") + artId) + ",
486486 Artwork name: ") + artworkName) + ",
487487 Issue: ") + toString(newAmountSold)) + "/") + toString(maxCanSell))
488488 let issueNFT = Issue(("SA_" + toString((totalNFT + 1))), issueMeta, 1, 0, false)
489489 let idNFT = calculateAssetId(issueNFT)
490490 let sellStatus = if (if ((newAmountSold == maxCanSell))
491491 then true
492492 else !(isOnSale))
493493 then false
494494 else true
495495 let receiveNFT = if (if (if ((caller == issuer))
496496 then (bidOwner != "")
497497 else false)
498498 then (bidId != "")
499499 else false)
500500 then addressFromStringValue(bidOwner)
501501 else i.caller
502502 let assetIdBid = if (!(isDefined(assetId)))
503503 then "WAVES"
504504 else toBase58String(value(assetId))
505505 let bidData = getStringByKey((bidDataKey + "_OPEN"))
506506 let bidDelOld = DeleteEntry((bidDataKey + "_OPEN"))
507507 let bidUpdate = StringEntry((bidDataKey + "_CLOSED"), ((bidData + "_") + toString(date)))
508508 let soldKey = ((((((("art_sold_" + toString(newAmountSold)) + "_of_") + toString(maxCanSell)) + "_") + artId) + "_") + issuer)
509509 let soldValue = if (!(isBid))
510510 then ((((((((((caller + "_") + toString(date)) + "_") + id) + "_") + toString(artworkPrice)) + "_") + priceAssetId) + "_") + toBase58String(idNFT))
511511 else ((((((((((toString(receiveNFT) + "_") + toString(date)) + "_") + id) + "_") + toString(amount)) + "_") + assetIdBid) + "_") + toBase58String(idNFT))
512512 let soldData = StringEntry(soldKey, soldValue)
513513 let amount_commission_for_sign_to_swap = if ((amountForAgent != 0))
514514 then (amountForSign - amountForAgent)
515515 else amountForSign
516516 let amount_art_before = getBalance(artAssetId)
517517 if ((amount_art_before == amount_art_before))
518518 then {
519519 let swap_fee_to_art = if ((assetId != artAssetId))
520520 then invoke(Address(fromBase58String(puzzle_art_pool)), "swap", [artAssetId_str, 1], [AttachedPayment(assetId, amount_commission_for_sign_to_swap)])
521521 else unit
522522 if ((swap_fee_to_art == swap_fee_to_art))
523523 then {
524524 let amount_art_after = getBalance(artAssetId)
525525 if ((amount_art_after == amount_art_after))
526526 then {
527527 let commissionsWithAgent = if ((amountForAgent != 0))
528528 then [ScriptTransfer(Address(fromBase58String(feeReceiver)), if ((assetId == artAssetId))
529529 then (amountForSign - amountForAgent)
530530 else (amount_art_after - amount_art_before), artAssetId), ScriptTransfer(Address(fromBase58String(agent)), amountForAgent, assetId)]
531531 else [ScriptTransfer(Address(fromBase58String(feeReceiver)), if ((assetId == artAssetId))
532532 then amountForSign
533533 else (amount_art_after - amount_art_before), artAssetId)]
534534 let commissionsWithPublicAgent = if ((amountForPublicAgent != 0))
535535 then [ScriptTransfer(Address(fromBase58String(publicAgent)), amountForPublicAgent, assetId), ScriptTransfer(Address(fromBase58String(issuer)), (amountForCreator - amountForPublicAgent), assetId)]
536536 else [ScriptTransfer(Address(fromBase58String(issuer)), amountForCreator, assetId)]
537537 let txToCaller = if (isSponsored)
538538 then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
539539 else nil
540540 let buyRes = ((([IntegerEntry(keyIssued(issuer, artId), newAmountSold), StringEntry(("nft_" + toBase58String(idNFT)), soldKey), IntegerEntry("total_nft_issued", (totalNFT + 1)), IntegerEntry(keyEndSale(issuer, artId), 0), BooleanEntry(keyOnSale(issuer, artId), sellStatus), issueNFT, ScriptTransfer(receiveNFT, 1, idNFT)] ++ commissionsWithAgent) ++ commissionsWithPublicAgent) ++ txToCaller)
541541 if (isBid)
542542 then [soldData, bidUpdate, bidDelOld] :: buyRes
543543 else soldData :: buyRes
544544 }
545545 else throw("Strict value is not equal to itself.")
546546 }
547547 else throw("Strict value is not equal to itself.")
548548 }
549549 else throw("Strict value is not equal to itself.")
550550 }
551551 }
552552 }
553553 }
554554 }
555555 }
556556 }
557557
558558
559559 func asString (bv) = match bv {
560560 case bv0: String =>
561561 bv0
562562 case _ =>
563563 throw("Sponsored Public Key String expected")
564564 }
565565
566566
567567 @Callable(invoke)
568568 func setConf (key,val) = {
569569 let caller = toString(invoke.caller)
570570 if (containsElement([chris, toString(this)], caller))
571571 then if (contains(key, "conf_"))
572572 then [StringEntry(key, val)]
573573 else throw("Entries starting with conf_ only")
574574 else throw("You are not allowed to change this")
575575 }
576576
577577
578578
579579 @Callable(i)
580580 func addArtwork (name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = {
581581 let $t02163221705 = idCallerDateSponsored(i, pubKey)
582582 let artId = $t02163221705._1
583583 let caller = $t02163221705._2
584584 let date = $t02163221705._3
585585 let isSponsored = $t02163221705._4
586586 let $t02171521784 = setLIcence(cidLicence, sha256Licence)
587587 let licenceCID = $t02171521784._1
588588 let licenceHash = $t02171521784._2
589589 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
590590 if ((validateArtwork != ""))
591591 then throw("Something went wrong!")
592592 else {
593593 let whitelisted_drop = (checkWhitelist((caller + "_free_drops")) > 0)
594594 let $t02208322171 = if (whitelisted_drop)
595595 then $Tuple2(0, artAssetId)
596596 else validatePayment(i)
597597 let amount = $t02208322171._1
598598 let assetId = $t02208322171._2
599599 if (!(isDefined(amount)))
600600 then throw("Something went wrong")
601601 else {
602602 let decrease_whitelist_drop = if (whitelisted_drop)
603603 then invoke(whitelistDapp, "useFreeDrop", [caller], nil)
604604 else unit
605605 if ((decrease_whitelist_drop == decrease_whitelist_drop))
606606 then {
607607 let txToCaller = if (isSponsored)
608608 then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
609609 else nil
610610 ([IntegerEntry(keyDate(caller, artId), date), StringEntry(keyName(caller, artId), name), StringEntry(keyDesc(caller, artId), description), StringEntry(keyDisplayCid(caller, artId), cidDisplay), StringEntry(keyExportCid(caller, artId), cidExport), StringEntry(keyExportHash(caller, artId), sha256Export), StringEntry(keyLicenceHash(caller, artId), licenceHash), StringEntry(keyLicenceCid(caller, artId), licenceCID), StringEntry(keyType(caller, artId), type), StringEntry(keyTags(caller, artId), tags), IntegerEntry(keyMaxMint(caller, artId), 0), IntegerEntry(keyIssued(caller, artId), 0), BooleanEntry(keyOnSale(caller, artId), false), StringEntry(keyCrawler(caller, artId), crawler), IntegerEntry(keyRoyalties(caller, artId), royalties), ScriptTransfer(Address(fromBase58String(feeReceiver)), (amount / 2), artAssetId), ScriptTransfer(reportDapp, (amount / 2), artAssetId)] ++ txToCaller)
611611 }
612612 else throw("Strict value is not equal to itself.")
613613 }
614614 }
615615 }
616616
617617
618618
619619 @Callable(i)
620620 func updateArtwork (txid,name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = if (!(dappRunning))
621621 then throw(maintenanceMSG)
622622 else {
623623 let $t02415024220 = idCallerDateSponsored(i, pubKey)
624624 let id = $t02415024220._1
625625 let caller = $t02415024220._2
626626 let date = $t02415024220._3
627627 let isSponsored = $t02415024220._4
628628 let $t02423024299 = setLIcence(cidLicence, sha256Licence)
629629 let licenceCID = $t02423024299._1
630630 let licenceHash = $t02423024299._2
631631 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
632632 if ((validateArtwork != ""))
633633 then throw("Something went wrong!")
634634 else {
635635 let entryExist = getStringByKey(keyName(caller, txid))
636636 if ((entryExist == ""))
637637 then throw("Entry not found")
638638 else {
639639 let flag = getStringByKey(keyFlag(caller, txid))
640640 if ((flag == "ILLEGAL"))
641641 then throw("Cannot update ILLEGAL artwork")
642642 else if (!(isArtMinted(caller, txid)))
643643 then {
644644 let txToCaller = if (isSponsored)
645645 then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
646646 else nil
647647 ([StringEntry(keyName(caller, txid), name), StringEntry(keyDesc(caller, txid), description), StringEntry(keyDisplayCid(caller, txid), cidDisplay), StringEntry(keyExportCid(caller, txid), cidExport), StringEntry(keyExportHash(caller, txid), sha256Export), StringEntry(keyLicenceCid(caller, txid), licenceCID), StringEntry(keyLicenceHash(caller, txid), licenceHash), StringEntry(keyTags(caller, txid), tags), StringEntry(keyType(caller, txid), type), StringEntry(keyCrawler(caller, txid), crawler), IntegerEntry(keyRoyalties(caller, txid), royalties)] ++ txToCaller)
648648 }
649649 else throw("Already minted")
650650 }
651651 }
652652 }
653653
654654
655655
656656 @Callable(i)
657657 func flagArtwork (artId,addr,flag,note) = {
658658 let $t02592625960 = idCallerDate(i)
659659 let id = $t02592625960._1
660660 let caller = $t02592625960._2
661- if (containsElement([chris, toString(this)], caller))
661+ if (containsElement([chris, toString(this), toString(reportDapp)], caller))
662662 then if (containsElement(["CONSENT", "", "CHANGE_REQUIRED", "FLAGGED", "ILLEGAL"], flag))
663663 then [StringEntry(keyFlag(addr, artId), flag), StringEntry(keyNote(addr, artId), note)]
664664 else throw(("Unknow status " + flag))
665665 else throw("You are not allowed")
666666 }
667667
668668
669669
670670 @Callable(i)
671671 func deleteArtwork (artId,addr) = {
672- let $t02639626430 = idCallerDate(i)
673- let id = $t02639626430._1
674- let caller = $t02639626430._2
672+ let $t02641826452 = idCallerDate(i)
673+ let id = $t02641826452._1
674+ let caller = $t02641826452._2
675675 let addrToUse = if (containsElement([chris, toString(this)], caller))
676676 then addr
677677 else caller
678678 let entryExist = valueOrErrorMessage(getStringByKey(keyName(addrToUse, artId)), "No art matching for this address")
679679 if ((entryExist == ""))
680680 then throw("No art matching for this address")
681681 else {
682682 let sha256Hash = getStringByKey(keyHashByTxidAddr(addrToUse, artId))
683683 let signID = if ((sha256Hash != ""))
684684 then getStringByKey(keySignID(addrToUse, artId))
685685 else ""
686686 let signID_legacy = if ((signID == ""))
687687 then nil
688688 else [DeleteEntry(keyidBySignid(addrToUse, signID))]
689689 let dataToDelete = ([DeleteEntry(keyDate(addrToUse, artId)), DeleteEntry(keyName(addrToUse, artId)), DeleteEntry(keyDesc(addrToUse, artId)), DeleteEntry(keyDisplayCid(addrToUse, artId)), DeleteEntry(keyExportCid(addrToUse, artId)), DeleteEntry(keyExportHash(addrToUse, artId)), DeleteEntry(keyLicenceHash(addrToUse, artId)), DeleteEntry(keyLicenceCid(addrToUse, artId)), DeleteEntry(keyType(addrToUse, artId)), DeleteEntry(keyTags(addrToUse, artId)), DeleteEntry(keyMaxMint(addrToUse, artId)), DeleteEntry(keySignID(addrToUse, artId)), DeleteEntry(keyIssued(addrToUse, artId)), DeleteEntry(keyOnSale(addrToUse, artId)), DeleteEntry(keyFlag(addrToUse, artId)), DeleteEntry(keyPrice(addrToUse, artId)), DeleteEntry(keyAssetIdAccepted(addrToUse, artId)), DeleteEntry(keyOwnerByHash(sha256Hash)), DeleteEntry(keyEndSale(addrToUse, artId)), DeleteEntry(keyNote(addrToUse, artId)), DeleteEntry(keyCrawler(addrToUse, artId)), DeleteEntry(keyRoyalties(addrToUse, artId))] ++ signID_legacy)
690690 if (!(isArtMinted(addrToUse, artId)))
691691 then if (!(dappRunning))
692692 then throw(maintenanceMSG)
693693 else dataToDelete
694694 else if (containsElement([chris, toString(this)], caller))
695695 then dataToDelete
696696 else throw("Art already minted, you cannot delete it")
697697 }
698698 }
699699
700700
701701
702702 @Callable(i)
703703 func sellArtwork (artId,price,maxMint,assetId,blockEnd,pubKey) = {
704- let $t02920929279 = idCallerDateSponsored(i, pubKey)
705- let id = $t02920929279._1
706- let caller = $t02920929279._2
707- let date = $t02920929279._3
708- let isSponsored = $t02920929279._4
704+ let $t02923129301 = idCallerDateSponsored(i, pubKey)
705+ let id = $t02923129301._1
706+ let caller = $t02923129301._2
707+ let date = $t02923129301._3
708+ let isSponsored = $t02923129301._4
709709 let artworkName = getStringByKey(keyName(caller, artId))
710710 if ((artworkName == ""))
711711 then throw("This art doesn't match your account")
712712 else {
713713 let flag = getStringByKey(keyFlag(caller, artId))
714714 if (containsElement(["CHANGE_REQUIRED", "FLAGGED", "ILLEGAL"], flag))
715715 then throw("Flagged artwork")
716716 else {
717717 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
718718 if ((0 > blockEnd))
719719 then throw("Negative end")
720720 else if (if ((blockEnd > 0))
721721 then if ((maxMint != 1))
722722 then true
723723 else (price != 0)
724724 else false)
725725 then throw("Timed offer only allowed for unique edition and offer only")
726726 else {
727727 let baseHeight = if ((blockEnd == 0))
728728 then 0
729729 else height
730730 if (!(acceptedAssetIds(assetId)))
731731 then throw("Something went wrong!")
732732 else if (!(validateMinSell(price)))
733733 then throw("Something went wrong!")
734734 else {
735735 let checkUser = validateUser(caller)
736736 if ((checkUser != ""))
737737 then throw(checkUser)
738738 else {
739739 let amountSold = getIntegerByKey(keyIssued(caller, artId))
740740 let maxCanSell = getIntegerByKey(keyMaxMint(caller, artId))
741741 if ((maxMint > 100))
742742 then throw("100 editions max per artwork")
743743 else if (if ((amountSold != 0))
744744 then (amountSold == maxCanSell)
745745 else false)
746746 then throw("Max edition reached.")
747747 else if (if ((amountSold > 0))
748748 then (maxCanSell != maxMint)
749749 else false)
750750 then throw("Cannot change maximum issuable anymore")
751751 else if (if ((bidNbr > 0))
752752 then (maxCanSell != maxMint)
753753 else false)
754754 then throw("Cannot change maximum issuable with active orders")
755755 else {
756756 let sellStatus = if (if ((price > 0))
757757 then (maxMint > 0)
758758 else false)
759759 then true
760760 else false
761761 let txToCaller = if (isSponsored)
762762 then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
763763 else nil
764764 ([BooleanEntry(keyOnSale(caller, artId), sellStatus), IntegerEntry(keyPrice(caller, artId), price), IntegerEntry(keyMaxMint(caller, artId), maxMint), StringEntry(keyAssetIdAccepted(caller, artId), assetId), IntegerEntry(keyEndSale(caller, artId), (baseHeight + blockEnd))] ++ txToCaller)
765765 }
766766 }
767767 }
768768 }
769769 }
770770 }
771771 }
772772
773773
774774
775775 @Callable(i)
776776 func buyArtwork (artId,issuer) = buyMint(i, artId, issuer, "", "", "")
777777
778778
779779
780780 @Callable(i)
781781 func setBid (artId,issuer) = {
782- let $t03165231692 = idCallerDate(i)
783- let id = $t03165231692._1
784- let caller = $t03165231692._2
785- let date = $t03165231692._3
786- let $t03169731733 = isPayment(i)
787- let payment = $t03169731733._1
788- let amount = $t03169731733._2
782+ let $t03167431714 = idCallerDate(i)
783+ let id = $t03167431714._1
784+ let caller = $t03167431714._2
785+ let date = $t03167431714._3
786+ let $t03171931755 = isPayment(i)
787+ let payment = $t03171931755._1
788+ let amount = $t03171931755._2
789789 let assetId = if (!(isDefined(payment.assetId)))
790790 then "WAVES"
791791 else toBase58String(value(payment.assetId))
792792 let blockEnd = getIntegerByKey(keyEndSale(issuer, artId))
793793 if (if ((blockEnd != 0))
794794 then (height >= blockEnd)
795795 else false)
796796 then throw("Sale ended.")
797797 else {
798798 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
799799 if (!(acceptedAssetIds(assetId)))
800800 then throw("asset not accepted")
801801 else if (!(validateMinSell(amount)))
802802 then throw("Wrong min sell")
803803 else {
804804 let amountSold = getIntegerByKey(keyIssued(issuer, artId))
805805 let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
806806 if ((0 >= maxCanSell))
807807 then throw("No max edition set for this artwork")
808808 else if ((amountSold >= maxCanSell))
809809 then throw("Sold out, you cannot bid")
810810 else [StringEntry((((((((("bid_" + artId) + "_") + issuer) + "_") + caller) + "_") + id) + "_OPEN"), ((((assetId + "_") + toString(amount)) + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr + 1))]
811811 }
812812 }
813813 }
814814
815815
816816
817817 @Callable(i)
818818 func acceptBid (artId,issuer,bidId,bidOwner,pubKey) = buyMint(i, artId, issuer, bidId, bidOwner, pubKey)
819819
820820
821821
822822 @Callable(i)
823823 func cancelBid (artId,issuer,bidId,bidOwner) = {
824- let $t03305733118 = idCallerDate(i)
825- let id = $t03305733118._1
826- let caller = $t03305733118._2
827- let date = $t03305733118._3
824+ let $t03307933140 = idCallerDate(i)
825+ let id = $t03307933140._1
826+ let caller = $t03307933140._2
827+ let date = $t03307933140._3
828828 if (if ((caller != bidOwner))
829829 then (caller != issuer)
830830 else false)
831831 then throw("You cannot do this action")
832832 else {
833833 let returnMoneyTo = if ((caller == issuer))
834834 then bidOwner
835835 else caller
836836 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
837837 let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
838838 let bidData = getStringByKey((bidDataKey + "_OPEN"))
839839 if ((bidData == ""))
840840 then throw("Bid not found")
841841 else {
842842 let bidDataArr = split(bidData, "_")
843843 let assetId = getBidAssetId(bidDataArr[0])
844844 let bidStatus = "CANCELED"
845845 [DeleteEntry((bidDataKey + "_OPEN")), StringEntry(((bidDataKey + "_") + bidStatus), ((bidData + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr - 1)), ScriptTransfer(Address(fromBase58String(returnMoneyTo)), parseIntValue(bidDataArr[1]), assetId)]
846846 }
847847 }
848848 }
849849
850850
851851 @Verifier(tx)
852852 func verifier () = match tx {
853853 case inv: InvokeScriptTransaction =>
854854 if (if (if (if ((inv.function == "addArtwork"))
855855 then (inv.dApp == this)
856856 else false)
857857 then (inv.fee == 500000)
858858 else false)
859859 then (inv.feeAssetId == unit)
860860 else false)
861861 then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[11])))
862862 else if (if (if (if ((inv.function == "updateArtwork"))
863863 then (inv.dApp == this)
864864 else false)
865865 then (inv.fee == 500000)
866866 else false)
867867 then (inv.feeAssetId == unit)
868868 else false)
869869 then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[12])))
870870 else if (if (if (if ((inv.function == "sellArtwork"))
871871 then (inv.dApp == this)
872872 else false)
873873 then (inv.fee == 500000)
874874 else false)
875875 then (inv.feeAssetId == unit)
876876 else false)
877877 then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[5])))
878878 else if (if (if (if ((inv.function == "acceptBid"))
879879 then (inv.dApp == this)
880880 else false)
881881 then (inv.fee == 500000)
882882 else false)
883883 then (inv.feeAssetId == unit)
884884 else false)
885885 then sigVerify_128Kb(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[4])))
886886 else sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
887887 case _ =>
888888 sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
889889 }
890890

github/deemru/w8io/3ef1775 
132.73 ms