tx · 3KKVXa7rpLAwbnoresxHp46ppM2o349MtkAc4MCmgDR5

3NBynfbXC2KastUxhukcMUaE58K9cBdB9UY:  -0.02600000 Waves

2023.10.12 07:20 [2794895] smart account 3NBynfbXC2KastUxhukcMUaE58K9cBdB9UY > SELF 0.00000000 Waves

{ "type": 13, "id": "3KKVXa7rpLAwbnoresxHp46ppM2o349MtkAc4MCmgDR5", "fee": 2600000, "feeAssetId": null, "timestamp": 1697084498033, "version": 2, "chainId": 84, "sender": "3NBynfbXC2KastUxhukcMUaE58K9cBdB9UY", "senderPublicKey": "J9DCtJJxJBWZdtDR12BA1U94Q3cZzMi4R6k5hYkAzmzC", "proofs": [ "548GrNiED4jCCfMD7ur4MJUkCoqErs1bJyAGDybRww5ybQAn9BwWMFDB9WotvX4KTpM8x9dLEkGxvWmQBXn9NHVE" ], "script": "base64:BgJeCAISBAoCCAgSDgoMCAgICAgICAgICAEIEg8KDQgICAgICAgICAgIAQgSBgoECAgICBIECgIICBIICgYIAQEIAQgSBAoCCAgSBAoCCAgSBwoFCAgICAgSBgoECAgICFwAB1ZFUlNJT04CBTIuMC4wAQ5nZXRTdHJpbmdCeUtleQEDa2V5CQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMFA2tleQIAAAh1bml0VGVzdAcACW9yYWNsZUZlZQkBBXZhbHVlAQkApggBCQEOZ2V0U3RyaW5nQnlLZXkBAg9jb25mX29yYWNsZV9mZWUACHNpZ25EYXBwCQEFdmFsdWUBCQCmCAEJAQ5nZXRTdHJpbmdCeUtleQECEWNvbmZfc2lnbndlYl9kYXBwAAtmZWVSZWNlaXZlcgkBDmdldFN0cmluZ0J5S2V5AQIRY29uZl9mZWVfcmVjZWl2ZXIACHVzZXJEYXBwAwUIdW5pdFRlc3QJAQV2YWx1ZQEJAKYIAQIjM010NFJHTUV5alNXWUFvY1RQcWQ1NXdkSFFRQjNQVTJVQ20JAQV2YWx1ZQEJAKYIAQkBDmdldFN0cmluZ0J5S2V5AQIPY29uZl91c2Vyc19kYXBwAA13aGl0ZWxpc3REYXBwCQEFdmFsdWUBCQCmCAEJAQ5nZXRTdHJpbmdCeUtleQECE2NvbmZfd2hpdGVsaXN0X2RhcHAAD3B1enpsZV9hcnRfcG9vbAkBDmdldFN0cmluZ0J5S2V5AQIUY29uZl9wdXp6bGVfYXJ0X3Bvb2wACnJlcG9ydERhcHAJAQV2YWx1ZQEJAKYIAQkBDmdldFN0cmluZ0J5S2V5AQIQY29uZl9yZXBvcnRfZGFwcAARdXNkdFBQQXNzZXRJZF9zdHIJAQ5nZXRTdHJpbmdCeUtleQECG2NvbmZfYWNjZXB0ZWRfYXNzZXRfVVNEVF9QUAAOYXJ0QXNzZXRJZF9zdHIJAQ5nZXRTdHJpbmdCeUtleQECF2NvbmZfYWNjZXB0ZWRfYXNzZXRfQVJUABF1c2RjUFBBc3NldElkX3N0cgkBDmdldFN0cmluZ0J5S2V5AQIbY29uZl9hY2NlcHRlZF9hc3NldF9VU0RDX1BQAA9lYXN0QXNzZXRJZF9zdHIJAQ5nZXRTdHJpbmdCeUtleQECGGNvbmZfYWNjZXB0ZWRfYXNzZXRfRUFTVAARcHV6emxlQXNzZXRJZF9zdHIJAQ5nZXRTdHJpbmdCeUtleQECGmNvbmZfYWNjZXB0ZWRfYXNzZXRfUFVaWkxFABBldGhQUEFzc2V0SWRfc3RyCQEOZ2V0U3RyaW5nQnlLZXkBAhpjb25mX2FjY2VwdGVkX2Fzc2V0X0VUSF9QUAAQd2F2ZXNBc3NldElkX3N0cgIFV0FWRVMADXVzZHRQUEFzc2V0SWQJANkEAQURdXNkdFBQQXNzZXRJZF9zdHIACmFydEFzc2V0SWQJANkEAQUOYXJ0QXNzZXRJZF9zdHIADXVzZGNQUEFzc2V0SWQJANkEAQURdXNkY1BQQXNzZXRJZF9zdHIAC2Vhc3RBc3NldElkCQDZBAEFD2Vhc3RBc3NldElkX3N0cgANcHV6emxlQXNzZXRJZAkA2QQBBRFwdXp6bGVBc3NldElkX3N0cgAMZXRoUFBBc3NldElkCQDZBAEFEGV0aFBQQXNzZXRJZF9zdHIADHdhdmVzQXNzZXRJZAEAABNhbGxfYWNjZXB0ZWRfYXNzZXRzCQDMCAIFEXVzZHRQUEFzc2V0SWRfc3RyCQDMCAIFDmFydEFzc2V0SWRfc3RyCQDMCAIFEXVzZGNQUEFzc2V0SWRfc3RyCQDMCAIFD2Vhc3RBc3NldElkX3N0cgkAzAgCBRFwdXp6bGVBc3NldElkX3N0cgkAzAgCBRB3YXZlc0Fzc2V0SWRfc3RyCQDMCAIFEGV0aFBQQXNzZXRJZF9zdHIFA25pbAAFY2hyaXMJAQ5nZXRTdHJpbmdCeUtleQECDGNvbmZfYWRtaW5fMQEZZ2V0SW50ZWdlckJ5S2V5RnJvbU9yYWNsZQEDa2V5CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUJb3JhY2xlRmVlBQNrZXkCH0ludGVnZXIgdW5kZWZpbmUgb3IgMCBpbiBvcmFjbGUBD2dldEludGVnZXJCeUtleQEDa2V5CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFA2tleQAAAQ5jaGVja1doaXRlbGlzdAEDa2V5CQELdmFsdWVPckVsc2UCCQCaCAIFDXdoaXRlbGlzdERhcHAFA2tleQAAAQ9nZXRCb29sZWFuQnlLZXkBA2tleQkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzBQNrZXkHAA5jb21taXNzaW9uX2ZlZQAIAA5kZWZhdWx0TGljZW5jZQkBDmdldFN0cmluZ0J5S2V5AQIUY29uZl9kZWZhdWx0X2xpY2VuY2UAEmRlZmF1bHRIYXNoTGljZW5jZQkBDmdldFN0cmluZ0J5S2V5AQIZY29uZl9kZWZhdWx0X2xpY2VuY2VfaGFzaAALZGFwcFJ1bm5pbmcJAQt2YWx1ZU9yRWxzZQIJAJsIAgUIdXNlckRhcHACFGNvbmZfZGFwcF9pc19ydW5uaW5nBgAObWFpbnRlbmFuY2VNU0cJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUIdXNlckRhcHACFGNvbmZfbWFpbnRlbmFuY2VfbXNnAgAADXVzZXJTdXNwZW5kZWQCCVNVU1BFTkRFRAALdXNlclJlbW92ZWQCB1JFTU9WRUQAEHVzZXJVbnJlZ2lzdGVyZWQCDFVOUkVHSVNURVJFRAALdXNlckFsbG93ZWQCB0FMTE9XRUQAGWN1cnJlbnRDZXJ0aWZpY2F0aW9uUHJpY2UJARlnZXRJbnRlZ2VyQnlLZXlGcm9tT3JhY2xlAQkArAICAhJjZXJ0aWZpY2F0aW9uX2ZlZV8JANgEAQUKYXJ0QXNzZXRJZAAIbWludF9mZWUJARlnZXRJbnRlZ2VyQnlLZXlGcm9tT3JhY2xlAQkArAICAgltaW50X2ZlZV8JANgEAQUKYXJ0QXNzZXRJZAETZ2V0QXJ0d29ya1JveWFsdGllcwEDa2V5CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFA2tleQDoBwELdmFsaWRhdGVDSUQBA2NpZAMJAQhjb250YWlucwIFA2NpZAIBLwMDCQBmAgBMCQCxAgEFA2NpZAkAAAIJALECAQkAkQMCCQC1CQIFA2NpZAIBLwAAADsHCQBmAgAQCQCxAgEJAJEDAgkAtQkCBQNjaWQCAS8AAQcHAQx2YWxpZGF0ZUhhc2gBBGhhc2gJAAACCQCxAgEFBGhhc2gAQAENa2V5VXNlclN0YXR1cwEGY2FsbGVyCQCsAgICDHVzZXJfc3RhdHVzXwUGY2FsbGVyAQdrZXlEYXRlAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICCWFydF9kYXRlXwUFYXJ0SWQCAV8FBmNhbGxlcgEHa2V5TmFtZQIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAglhcnRfbmFtZV8FBWFydElkAgFfBQZjYWxsZXIBB2tleURlc2MCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIJYXJ0X2Rlc2NfBQVhcnRJZAIBXwUGY2FsbGVyAQ1rZXlEaXNwbGF5Q2lkAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICEGFydF9kaXNwbGF5X2NpZF8FBWFydElkAgFfBQZjYWxsZXIBDWtleUV4cG9ydEhhc2gCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIQYXJ0X2V4cG9ydF9oYXNoXwUFYXJ0SWQCAV8FBmNhbGxlcgEMa2V5RXhwb3J0Q2lkAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICD2FydF9leHBvcnRfY2lkXwUFYXJ0SWQCAV8FBmNhbGxlcgEKa2V5TWF4TWludAIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAgxhcnRfbWF4bWludF8FBWFydElkAgFfBQZjYWxsZXIBCWtleVNpZ25JRAIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAgthcnRfc2lnbmlkXwUFYXJ0SWQCAV8FBmNhbGxlcgEJa2V5SXNzdWVkAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICC2FydF9pc3N1ZWRfBQVhcnRJZAIBXwUGY2FsbGVyAQlrZXlPblNhbGUCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgILYXJ0X29uc2FsZV8FBWFydElkAgFfBQZjYWxsZXIBDmtleUxpY2VuY2VIYXNoAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICEWFydF9saWNlbmNlX2hhc2hfBQVhcnRJZAIBXwUGY2FsbGVyAQ1rZXlMaWNlbmNlQ2lkAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICEGFydF9saWNlbmNlX2NpZF8FBWFydElkAgFfBQZjYWxsZXIBB2tleVRhZ3MCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIJYXJ0X3RhZ3NfBQVhcnRJZAIBXwUGY2FsbGVyAQdrZXlUeXBlAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICCWFydF90eXBlXwUFYXJ0SWQCAV8FBmNhbGxlcgEHa2V5Tm90ZQIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAglhcnRfbm90ZV8FBWFydElkAgFfBQZjYWxsZXIBCmtleUNyYXdsZXICBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIQYXJ0X2NyYXdsZXJfY2lkXwUFYXJ0SWQCAV8FBmNhbGxlcgEMa2V5Um95YWx0aWVzAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICDmFydF9yb3lhbHRpZXNfBQVhcnRJZAIBXwUGY2FsbGVyAQhrZXlQcmljZQIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAgphcnRfcHJpY2VfBQVhcnRJZAIBXwUGY2FsbGVyAQprZXlFbmRTYWxlAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICDGFydF9lbmRzYWxlXwUFYXJ0SWQCAV8FBmNhbGxlcgESa2V5QXNzZXRJZEFjY2VwdGVkAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICEmFydF9hc3NldEFjY2VwdGVkXwUFYXJ0SWQCAV8FBmNhbGxlcgEHa2V5RmxhZwIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAglhcnRfZmxhZ18FBWFydElkAgFfBQZjYWxsZXIBEmtleUFydGlzdEFnZW50QWRkcgEKYXJ0aXN0QWRkcgkArAICAg1hcnRpc3RfYWdlbnRfBQphcnRpc3RBZGRyARRrZXlQcmltYXJ5U2hhcmVBZ2VudAEKYXJ0aXN0QWRkcgkArAICAhVhcnRpc3RfYWdlbnRfcHJpbWFyeV8FCmFydGlzdEFkZHIBGGtleUFydGlzdFB1YmxpY0FnZW50QWRkcgEKYXJ0aXN0QWRkcgkArAICAhRhcnRpc3RfcHVibGljX2FnZW50XwUKYXJ0aXN0QWRkcgEaa2V5UHJpbWFyeVNoYXJlUHVibGljQWdlbnQBCmFydGlzdEFkZHIJAKwCAgIcYXJ0aXN0X3B1YmxpY19hZ2VudF9wcmltYXJ5XwUKYXJ0aXN0QWRkcgERa2V5SGFzaEJ5VHhpZEFkZHICBmNhbGxlcgR0eGlkCQCsAgIJAKwCAgkArAICAhNnZXRfaGFzaGJ5dHhpZGFkZHJfBQR0eGlkAgFfBQZjYWxsZXIBDmtleU93bmVyQnlIYXNoAQpzaGEyNTZIYXNoCQCsAgICEmdldF9vd25lcl9ieV9oYXNoXwUKc2hhMjU2SGFzaAENa2V5aWRCeVNpZ25pZAIGY2FsbGVyBnNpZ25JZAkArAICCQCsAgIJAKwCAgISZ2V0X2FydGlkYnlzaWduaWRfBQZzaWduSWQCAV8FBmNhbGxlcgEOdmFsaWRhdGVBbGxDSUQDCmNpZERpc3BsYXkJY2lkRXhwb3J0CmNpZExpY2VuY2UDCQEBIQEJAQt2YWxpZGF0ZUNJRAEFCmNpZERpc3BsYXkJAAIBAhFXcm9uZyBEaXNwbGF5IENJRAMJAQEhAQkBC3ZhbGlkYXRlQ0lEAQUJY2lkRXhwb3J0CQACAQIQV3JvbmcgRXhwb3J0IENJRAMDCQECIT0CBQpjaWRMaWNlbmNlAgAJAQEhAQkBC3ZhbGlkYXRlQ0lEAQUKY2lkTGljZW5jZQcJAAIBAhFXcm9uZyBMaWNlbmNlIENJRAYBD3ZhbGlkYXRlQWxsSGFzaAIMc2hhMjU2RXhwb3J0DXNoYTI1NkxpY2VuY2UDCQEBIQEJAQx2YWxpZGF0ZUhhc2gBBQxzaGEyNTZFeHBvcnQJAAIBAhhFeHBvcnQgSGFzaCA2NCBjaGFyLiBtYXgDCQEBIQEJAQx2YWxpZGF0ZUhhc2gBBQ1zaGEyNTZMaWNlbmNlCQACAQIZTGljZW5jZSBIYXNoIDY0IGNoYXIuIG1heAYBDnZhbGlkYXRlU3RyaW5nAgNzdHIDbWF4AwkAAAIJALECAQUDc3RyAAAJAAIBAhhGaWVsZCBjYW5ub3QgYmUgaXMgZW1wdHkDCQBmAgkAsQIBBQNzdHIFA21heAkAAgEJAKwCAgUDc3RyAgwgaXMgdG9vIGxvbmcGAQx2YWxpZGF0ZVVzZXIBBmNhbGxlcgQKdXNlclN0YXR1cwkBC3ZhbHVlT3JFbHNlAgkAnQgCBQh1c2VyRGFwcAkBDWtleVVzZXJTdGF0dXMBBQZjYWxsZXIFEHVzZXJVbnJlZ2lzdGVyZWQDAwkAAAIFCnVzZXJTdGF0dXMFEHVzZXJVbnJlZ2lzdGVyZWQGCQAAAgUKdXNlclN0YXR1cwULdXNlckFsbG93ZWQCLlJlZ2lzdGVyIHRoaXMgYWNjb3VudCBmaXJzdCB3aXRoICJBY2NvdW50IiB0YWIDCQAAAgUKdXNlclN0YXR1cwUNdXNlclN1c3BlbmRlZAIRQWNjb3VudCBzdXNwZW5kZWQDCQAAAgUKdXNlclN0YXR1cwULdXNlclJlbW92ZWQCD0FjY291bnQgcmVtb3ZlZAIAAQpzZXRMSWNlbmNlAgpjaWRMaWNlbmNlDXNoYTI1NkxpY2VuY2UEA2NpZAMJAAACCQCxAgEFCmNpZExpY2VuY2UAAAUOZGVmYXVsdExpY2VuY2UFCmNpZExpY2VuY2UEBGhhc2gDCQAAAgkAsQIBBQ1zaGEyNTZMaWNlbmNlAAAFEmRlZmF1bHRIYXNoTGljZW5jZQUNc2hhMjU2TGljZW5jZQkAlAoCBQNjaWQFBGhhc2gBE3ZhbGlkYXRlQXJ0d29ya0RhdGEKBmNhbGxlcgpjaWREaXNwbGF5CWNpZEV4cG9ydApsaWNlbmNlQ0lEDHNoYTI1NkV4cG9ydAtsaWNlbmNlSGFzaARuYW1lC2Rlc2NyaXB0aW9uBHRhZ3MJcm95YWx0aWVzBAljaGVja1VzZXIJAQx2YWxpZGF0ZVVzZXIBBQZjYWxsZXIDCQECIT0CBQljaGVja1VzZXICAAkAAgEFCWNoZWNrVXNlcgMJAAACCQCxAgEFCmNpZERpc3BsYXkAAAkAAgECG0Rpc3BsYXkgQ0lEIGNhbm5vdCBiZSBlbXB0eQMJAQEhAQkBDnZhbGlkYXRlQWxsQ0lEAwUKY2lkRGlzcGxheQUJY2lkRXhwb3J0BQpsaWNlbmNlQ0lECQACAQIQUHJvYmxlbSB3aXRoIENJRAMJAQEhAQkBD3ZhbGlkYXRlQWxsSGFzaAIFDHNoYTI1NkV4cG9ydAULbGljZW5jZUhhc2gJAAIBAhNQcm9ibGVtIHdpdGggSGFzaGVzAwkBASEBCQEOdmFsaWRhdGVTdHJpbmcCBQRuYW1lAGQJAAIBAhIxMDAgQ2hhci4gbWF4IG5hbWUDCQEBIQEJAQ52YWxpZGF0ZVN0cmluZwIFC2Rlc2NyaXB0aW9uAOgHCQACAQIaMTAwMCBDaGFyLiBtYXggZGVzY3JpcHRpb24DAwkAZgIAAAUJcm95YWx0aWVzBgkAZgIFCXJveWFsdGllcwDoBwkAAgECM1JveWFsdGllcyBjYW5ub3QgYmUgbGVzcyB0aGFuIDAlIG9yIGhpZ2hlciB0aGFuIDEwJQMJAGYCCQCQAwEJALUJAgUEdGFncwIBLAAFCQACAQILNSB0YWdzIG1heC4CAAEJaXNQYXltZW50AQFpAwkAAAIJAJADAQgFAWkIcGF5bWVudHMAAAkAAgECE05vIHBheW1lbnQgYXR0YWNoZWQEB3BheW1lbnQJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAQGYW1vdW50CQEFdmFsdWUBCAUHcGF5bWVudAZhbW91bnQJAJQKAgUHcGF5bWVudAUGYW1vdW50AQ92YWxpZGF0ZVBheW1lbnQBAWkEDSR0MDEwMjM0MTAyNzAJAQlpc1BheW1lbnQBBQFpBAdwYXltZW50CAUNJHQwMTAyMzQxMDI3MAJfMQQGYW1vdW50CAUNJHQwMTAyMzQxMDI3MAJfMgQHYXNzZXRJZAMDCQEJaXNEZWZpbmVkAQgFB3BheW1lbnQHYXNzZXRJZAkAAAIIBQdwYXltZW50B2Fzc2V0SWQFCmFydEFzc2V0SWQHCAUHcGF5bWVudAdhc3NldElkCQACAQIrT25seSBTSUdOIHRva2VuIGFjY2VwdGVkIGFzIHRyYW5zYWN0aW9uIGZlZQMJAQIhPQIFBmFtb3VudAkAaAIFGWN1cnJlbnRDZXJ0aWZpY2F0aW9uUHJpY2UAAgkAAgEJAKwCAgIZUGF5bWVudCBhbW91bnQgc2hvdWxkIGJlIAkApAMBCQBoAgUZY3VycmVudENlcnRpZmljYXRpb25QcmljZQACCQCUCgIFBmFtb3VudAUHYXNzZXRJZAELaXNBcnRNaW50ZWQCCWFkZHJUb1VzZQVhcnRJZAQHJG1hdGNoMAkAmggCBQR0aGlzCQEJa2V5SXNzdWVkAgUJYWRkclRvVXNlBQVhcnRJZAMJAAECBQckbWF0Y2gwAgNJbnQEAWIFByRtYXRjaDADCQECIT0CBQFiAAAGBwcBFHZhbGlkYXRlUHJpY2VBc3NldElkAwFpDHByaWNlQXNzZXRJZAxhcnR3b3JrUHJpY2UEDSR0MDEwODY3MTA5MDMJAQlpc1BheW1lbnQBBQFpBAdwYXltZW50CAUNJHQwMTA4NjcxMDkwMwJfMQQGYW1vdW50CAUNJHQwMTA4NjcxMDkwMwJfMgQHYXNzZXRJZAMJAQEhAQkBCWlzRGVmaW5lZAEIBQdwYXltZW50B2Fzc2V0SWQFBHVuaXQDAwkAZgIJALECAQUMcHJpY2VBc3NldElkAAAJAAACCQDYBAEJAQV2YWx1ZQEIBQdwYXltZW50B2Fzc2V0SWQFDHByaWNlQXNzZXRJZAcIBQdwYXltZW50B2Fzc2V0SWQJAAIBAg5Xcm9uZyBhc3NldCBpZAMDCQAAAgUHYXNzZXRJZAUEdW5pdAkBAiE9AgUMcHJpY2VBc3NldElkAgAHCQACAQIOV3JvbmcgYXNzZXQgaWQDCQECIT0CBQxhcnR3b3JrUHJpY2UFBmFtb3VudAkAAgECE1BheW1lbnQgZG9uJ3QgbWF0Y2gJAJQKAgUGYW1vdW50BQdhc3NldElkARBhY2NlcHRlZEFzc2V0SWRzAQdhc3NldElkAwkBASEBCQEPY29udGFpbnNFbGVtZW50AgUTYWxsX2FjY2VwdGVkX2Fzc2V0cwUHYXNzZXRJZAkAAgECQE9ubHkgJEFSVCwgVVNEVC1QUCwgVVNEQy1QUCwgRUFTVCwgUFVaWkxFLCBFVEggb3IgV0FWRVMgYWNjZXB0ZWQGAQ92YWxpZGF0ZU1pblNlbGwBBXByaWNlAwkAZwIAAAUFcHJpY2UJAAIBAhhXcm9uZyBtaW5pbXVtIHNlbGwgcHJpY2UGAQ1nZXRCaWRBc3NldElkAQdhc3NldElkAwkAAAIFB2Fzc2V0SWQCBVdBVkVTBQR1bml0CQDZBAEFB2Fzc2V0SWQBFmdldFByaWNlQXNzZXRJZEZyb21CaWQBCmJpZERhdGFLZXkEB2JpZERhdGEJAQ5nZXRTdHJpbmdCeUtleQEJAKwCAgUKYmlkRGF0YUtleQIFX09QRU4DCQAAAgUHYmlkRGF0YQIACQACAQINQmlkIG5vdCBmb3VuZAQKYmlkRGF0YUFycgkAtQkCBQdiaWREYXRhAgFfBAliaWRBbW91bnQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQpiaWREYXRhQXJyAAEECmJpZEFzc2V0SWQJAQ1nZXRCaWRBc3NldElkAQkAkQMCBQpiaWREYXRhQXJyAAADCQBnAgAABQliaWRBbW91bnQJAAIBAgxXcm9uZyBhbW91bnQJAJQKAgUJYmlkQW1vdW50BQpiaWRBc3NldElkARVpZENhbGxlckRhdGVTcG9uc29yZWQCAWkGcHViS2V5AwkBASEBBQtkYXBwUnVubmluZwkAAgEFDm1haW50ZW5hbmNlTVNHBAtpc1Nwb25zb3JlZAMJAQIhPQIFBnB1YktleQIACQELdmFsdWVPckVsc2UCCQEOY2hlY2tXaGl0ZWxpc3QBCQCsAgIJAKUIAQkApwgBCQDZBAEFBnB1YktleQIJX2ZyZWVfdHhzAAAAAAQGY2FsbGVyAwMJAAACCQDYBAEICAUBaQZjYWxsZXIFYnl0ZXMJAKUIAQUEdGhpcwkAZgIFC2lzU3BvbnNvcmVkAAAHCQClCAEJAKcIAQkA2QQBBQZwdWJLZXkJANgEAQgIBQFpBmNhbGxlcgVieXRlcwQTZ2V0X3Nwb25zb3JlZF93YXZlcwMDCQECIT0CBQZwdWJLZXkCAAkAZgIFC2lzU3BvbnNvcmVkAAAHCQD8BwQFDXdoaXRlbGlzdERhcHACCXVzZUZyZWVUeAkAzAgCCQClCAEJAKcIAQkA2QQBBQZwdWJLZXkFA25pbAUDbmlsBQR1bml0AwkAAAIFE2dldF9zcG9uc29yZWRfd2F2ZXMFE2dldF9zcG9uc29yZWRfd2F2ZXMJAJYKBAkA2AQBCAUBaQ10cmFuc2FjdGlvbklkBQZjYWxsZXIIBQlsYXN0QmxvY2sJdGltZXN0YW1wCQBmAgULaXNTcG9uc29yZWQAAAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEMaWRDYWxsZXJEYXRlAQFpAwkBASEBBQtkYXBwUnVubmluZwkAAgEFDm1haW50ZW5hbmNlTVNHCQCVCgMJANgEAQgFAWkNdHJhbnNhY3Rpb25JZAkA2AQBCAgFAWkGY2FsbGVyBWJ5dGVzCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAEKZ2V0QmFsYW5jZQEHYXNzZXRJZAQHJG1hdGNoMAUHYXNzZXRJZAMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAFiBQckbWF0Y2gwCQDwBwIFBHRoaXMFAWIICQDvBwEFBHRoaXMJYXZhaWxhYmxlAQdidXlNaW50BgFpBWFydElkBmlzc3VlcgViaWRJZAhiaWRPd25lcgZwdWJLZXkEDSR0MDEzNTA4MTM1OTcJARVpZENhbGxlckRhdGVTcG9uc29yZWQCBQFpBQZwdWJLZXkEAmlkCAUNJHQwMTM1MDgxMzU5NwJfMQQGY2FsbGVyCAUNJHQwMTM1MDgxMzU5NwJfMgQEZGF0ZQgFDSR0MDEzNTA4MTM1OTcCXzMEC2lzU3BvbnNvcmVkCAUNJHQwMTM1MDgxMzU5NwJfNAQFaXNCaWQDAwMJAAACBQZjYWxsZXIFBmlzc3VlcgkBAiE9AgUIYmlkT3duZXICAAcJAQIhPQIFBWJpZElkAgAHBgcDAwUFaXNCaWQJAQIhPQIFBmNhbGxlcgUGaXNzdWVyBwkAAgECGVlvdSBjYW5ub3QgZG8gdGhpcyBhY3Rpb24ECGJsb2NrRW5kCQEPZ2V0SW50ZWdlckJ5S2V5AQkBCmtleUVuZFNhbGUCBQZjYWxsZXIFBWFydElkAwMDCQECIT0CBQhibG9ja0VuZAAACQBnAgUGaGVpZ2h0BQhibG9ja0VuZAcJAQEhAQUFaXNCaWQHCQACAQILU2FsZSBlbmRlZC4EDmNhbGxlcklzSXNzdWVyCQAAAgUGY2FsbGVyBQZpc3N1ZXIECHRvdGFsTkZUCQEPZ2V0SW50ZWdlckJ5S2V5AQIQdG90YWxfbmZ0X2lzc3VlZAQLYXJ0d29ya05hbWUJAQ5nZXRTdHJpbmdCeUtleQEJAQdrZXlOYW1lAgUGaXNzdWVyBQVhcnRJZAMJAAACBQthcnR3b3JrTmFtZQIACQACAQIRQXJ0IGRvZXNuJ3QgZXhpc3QECGlzT25TYWxlCQEPZ2V0Qm9vbGVhbkJ5S2V5AQkBCWtleU9uU2FsZQIFBmlzc3VlcgUFYXJ0SWQECmFtb3VudFNvbGQJAQ9nZXRJbnRlZ2VyQnlLZXkBCQEJa2V5SXNzdWVkAgUGaXNzdWVyBQVhcnRJZAQMYXJ0d29ya1ByaWNlAwUOY2FsbGVySXNJc3N1ZXIFCG1pbnRfZmVlCQEPZ2V0SW50ZWdlckJ5S2V5AQkBCGtleVByaWNlAgUGaXNzdWVyBQVhcnRJZAQMcHJpY2VBc3NldElkAwUOY2FsbGVySXNJc3N1ZXIJANgEAQUKYXJ0QXNzZXRJZAkBDmdldFN0cmluZ0J5S2V5AQkBEmtleUFzc2V0SWRBY2NlcHRlZAIFBmlzc3VlcgUFYXJ0SWQECm1heENhblNlbGwJAQ9nZXRJbnRlZ2VyQnlLZXkBCQEKa2V5TWF4TWludAIFBmlzc3VlcgUFYXJ0SWQDAwMJAQEhAQUFaXNCaWQJAQEhAQUOY2FsbGVySXNJc3N1ZXIHAwMJAGcCAAAFDGFydHdvcmtQcmljZQYJAQEhAQUIaXNPblNhbGUGCQBnAgAABQptYXhDYW5TZWxsBwkAAgECEEFydCBub3QgZm9yIHNhbGUDAwMJAQEhAQUFaXNCaWQFDmNhbGxlcklzSXNzdWVyBwkAZwIAAAUKbWF4Q2FuU2VsbAcJAAIBAhRNYXggaXNzdWFibGUgbm90IHNldAQJY2hlY2tVc2VyCQEMdmFsaWRhdGVVc2VyAQUGaXNzdWVyAwMFBWlzQmlkCQECIT0CBQljaGVja1VzZXICAAcJAAIBBQljaGVja1VzZXIECmJpZERhdGFLZXkJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIEYmlkXwUFYXJ0SWQCAV8FBmlzc3VlcgIBXwUIYmlkT3duZXICAV8FBWJpZElkBA0kdDAxNTE3NDE1MzY2AwUFaXNCaWQJARZnZXRQcmljZUFzc2V0SWRGcm9tQmlkAQUKYmlkRGF0YUtleQkBFHZhbGlkYXRlUHJpY2VBc3NldElkAwUBaQUMcHJpY2VBc3NldElkBQxhcnR3b3JrUHJpY2UEBmFtb3VudAgFDSR0MDE1MTc0MTUzNjYCXzEEB2Fzc2V0SWQIBQ0kdDAxNTE3NDE1MzY2Al8yBAVhZ2VudAkBC3ZhbHVlT3JFbHNlAgkAnQgCBQh1c2VyRGFwcAkBEmtleUFydGlzdEFnZW50QWRkcgEFBmlzc3VlcgULZmVlUmVjZWl2ZXIECmFnZW50U2hhcmUJAQt2YWx1ZU9yRWxzZQIJAJoIAgUIdXNlckRhcHAJARRrZXlQcmltYXJ5U2hhcmVBZ2VudAEFBmlzc3VlcgAABAtwdWJsaWNBZ2VudAkBC3ZhbHVlT3JFbHNlAgkAnQgCBQh1c2VyRGFwcAkBGGtleUFydGlzdFB1YmxpY0FnZW50QWRkcgEFBmlzc3VlcgULZmVlUmVjZWl2ZXIEEHB1YmxpY0FnZW50U2hhcmUJAQt2YWx1ZU9yRWxzZQIJAJoIAgUIdXNlckRhcHAJARprZXlQcmltYXJ5U2hhcmVQdWJsaWNBZ2VudAEFBmlzc3VlcgAABA1pc1doaXRlbGlzdGVkCQEOY2hlY2tXaGl0ZWxpc3QBBQZpc3N1ZXIEDWFtb3VudEZvclNpZ24JAGsDBQZhbW91bnQFDmNvbW1pc3Npb25fZmVlAGQEDmFtb3VudEZvckFnZW50AwMDCQECIT0CBQVhZ2VudAULZmVlUmVjZWl2ZXIJAGYCBQphZ2VudFNoYXJlAAAHCQBmAgUGaGVpZ2h0BQ1pc1doaXRlbGlzdGVkBwkAawMFBmFtb3VudAUKYWdlbnRTaGFyZQCQTgAABBRhbW91bnRGb3JQdWJsaWNBZ2VudAMDAwkBAiE9AgULcHVibGljQWdlbnQFC2ZlZVJlY2VpdmVyCQBmAgUQcHVibGljQWdlbnRTaGFyZQAABwkAZgIFBmhlaWdodAUNaXNXaGl0ZWxpc3RlZAcJAGsDBQZhbW91bnQFEHB1YmxpY0FnZW50U2hhcmUAkE4AAAQQYW1vdW50Rm9yQ3JlYXRvcgkAZQIFBmFtb3VudAUNYW1vdW50Rm9yU2lnbgMJAAACBQphbW91bnRTb2xkBQptYXhDYW5TZWxsCQACAQIMQXJ0IHNvbGQgb3V0BA1uZXdBbW91bnRTb2xkCQBkAgUKYW1vdW50U29sZAABBAlpc3N1ZU1ldGEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICCUNyZWF0b3I6IAUGaXNzdWVyAgosCiBBcnRJRDogBQVhcnRJZAIRLAogQXJ0d29yayBuYW1lOiAFC2FydHdvcmtOYW1lAgosCiBJc3N1ZTogCQCkAwEFDW5ld0Ftb3VudFNvbGQCAS8JAKQDAQUKbWF4Q2FuU2VsbAQIaXNzdWVORlQJAMIIBQkArAICAgNTQV8JAKQDAQkAZAIFCHRvdGFsTkZUAAEFCWlzc3VlTWV0YQABAAAHBAVpZE5GVAkAuAgBBQhpc3N1ZU5GVAQKc2VsbFN0YXR1cwMDCQAAAgUNbmV3QW1vdW50U29sZAUKbWF4Q2FuU2VsbAYJAQEhAQUIaXNPblNhbGUHBgQKcmVjZWl2ZU5GVAMDAwkAAAIFBmNhbGxlcgUGaXNzdWVyCQECIT0CBQhiaWRPd25lcgIABwkBAiE9AgUFYmlkSWQCAAcJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCGJpZE93bmVyCAUBaQZjYWxsZXIECmFzc2V0SWRCaWQDCQEBIQEJAQlpc0RlZmluZWQBBQdhc3NldElkAgVXQVZFUwkA2AQBCQEFdmFsdWUBBQdhc3NldElkBAdiaWREYXRhCQEOZ2V0U3RyaW5nQnlLZXkBCQCsAgIFCmJpZERhdGFLZXkCBV9PUEVOBAliaWREZWxPbGQJAQtEZWxldGVFbnRyeQEJAKwCAgUKYmlkRGF0YUtleQIFX09QRU4ECWJpZFVwZGF0ZQkBC1N0cmluZ0VudHJ5AgkArAICBQpiaWREYXRhS2V5AgdfQ0xPU0VECQCsAgIJAKwCAgUHYmlkRGF0YQIBXwkApAMBBQRkYXRlBAdzb2xkS2V5CQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICCWFydF9zb2xkXwkApAMBBQ1uZXdBbW91bnRTb2xkAgRfb2ZfCQCkAwEFCm1heENhblNlbGwCAV8FBWFydElkAgFfBQZpc3N1ZXIECXNvbGRWYWx1ZQMJAQEhAQUFaXNCaWQJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUGY2FsbGVyAgFfCQCkAwEFBGRhdGUCAV8FAmlkAgFfCQCkAwEFDGFydHdvcmtQcmljZQIBXwUMcHJpY2VBc3NldElkAgFfCQDYBAEFBWlkTkZUCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKUIAQUKcmVjZWl2ZU5GVAIBXwkApAMBBQRkYXRlAgFfBQJpZAIBXwkApAMBBQZhbW91bnQCAV8FCmFzc2V0SWRCaWQCAV8JANgEAQUFaWRORlQECHNvbGREYXRhCQELU3RyaW5nRW50cnkCBQdzb2xkS2V5BQlzb2xkVmFsdWUEImFtb3VudF9jb21taXNzaW9uX2Zvcl9zaWduX3RvX3N3YXADCQECIT0CBQ5hbW91bnRGb3JBZ2VudAAACQBlAgUNYW1vdW50Rm9yU2lnbgUOYW1vdW50Rm9yQWdlbnQFDWFtb3VudEZvclNpZ24EEWFtb3VudF9hcnRfYmVmb3JlCQEKZ2V0QmFsYW5jZQEFCmFydEFzc2V0SWQDCQAAAgURYW1vdW50X2FydF9iZWZvcmUFEWFtb3VudF9hcnRfYmVmb3JlBA9zd2FwX2ZlZV90b19hcnQDCQECIT0CBQdhc3NldElkBQphcnRBc3NldElkCQD8BwQJAQdBZGRyZXNzAQkA2QQBBQ9wdXp6bGVfYXJ0X3Bvb2wCBHN3YXAJAMwIAgUOYXJ0QXNzZXRJZF9zdHIJAMwIAgABBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFB2Fzc2V0SWQFImFtb3VudF9jb21taXNzaW9uX2Zvcl9zaWduX3RvX3N3YXAFA25pbAUEdW5pdAMJAAACBQ9zd2FwX2ZlZV90b19hcnQFD3N3YXBfZmVlX3RvX2FydAQQYW1vdW50X2FydF9hZnRlcgkBCmdldEJhbGFuY2UBBQphcnRBc3NldElkAwkAAAIFEGFtb3VudF9hcnRfYWZ0ZXIFEGFtb3VudF9hcnRfYWZ0ZXIEFGNvbW1pc3Npb25zV2l0aEFnZW50AwkBAiE9AgUOYW1vdW50Rm9yQWdlbnQAAAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQULZmVlUmVjZWl2ZXIDCQAAAgUHYXNzZXRJZAUKYXJ0QXNzZXRJZAkAZQIFDWFtb3VudEZvclNpZ24FDmFtb3VudEZvckFnZW50CQBlAgUQYW1vdW50X2FydF9hZnRlcgURYW1vdW50X2FydF9iZWZvcmUFCmFydEFzc2V0SWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFBWFnZW50BQ5hbW91bnRGb3JBZ2VudAUHYXNzZXRJZAUDbmlsCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQtmZWVSZWNlaXZlcgMJAAACBQdhc3NldElkBQphcnRBc3NldElkBQ1hbW91bnRGb3JTaWduCQBlAgUQYW1vdW50X2FydF9hZnRlcgURYW1vdW50X2FydF9iZWZvcmUFCmFydEFzc2V0SWQFA25pbAQaY29tbWlzc2lvbnNXaXRoUHVibGljQWdlbnQDCQECIT0CBRRhbW91bnRGb3JQdWJsaWNBZ2VudAAACQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQtwdWJsaWNBZ2VudAUUYW1vdW50Rm9yUHVibGljQWdlbnQFB2Fzc2V0SWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFBmlzc3VlcgkAZQIFEGFtb3VudEZvckNyZWF0b3IFFGFtb3VudEZvclB1YmxpY0FnZW50BQdhc3NldElkBQNuaWwJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFBmlzc3VlcgUQYW1vdW50Rm9yQ3JlYXRvcgUHYXNzZXRJZAUDbmlsBAp0eFRvQ2FsbGVyAwULaXNTcG9uc29yZWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFBmNhbGxlcgAABQR1bml0BQNuaWwFA25pbAQGYnV5UmVzCQDOCAIJAM4IAgkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEJa2V5SXNzdWVkAgUGaXNzdWVyBQVhcnRJZAUNbmV3QW1vdW50U29sZAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgICBG5mdF8JANgEAQUFaWRORlQFB3NvbGRLZXkJAMwIAgkBDEludGVnZXJFbnRyeQICEHRvdGFsX25mdF9pc3N1ZWQJAGQCBQh0b3RhbE5GVAABCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEKa2V5RW5kU2FsZQIFBmlzc3VlcgUFYXJ0SWQAAAkAzAgCCQEMQm9vbGVhbkVudHJ5AgkBCWtleU9uU2FsZQIFBmlzc3VlcgUFYXJ0SWQFCnNlbGxTdGF0dXMJAMwIAgUIaXNzdWVORlQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUKcmVjZWl2ZU5GVAABBQVpZE5GVAUDbmlsBRRjb21taXNzaW9uc1dpdGhBZ2VudAUaY29tbWlzc2lvbnNXaXRoUHVibGljQWdlbnQFCnR4VG9DYWxsZXIDBQVpc0JpZAkAzAgCBQhzb2xkRGF0YQkAzAgCBQliaWRVcGRhdGUJAMwIAgUJYmlkRGVsT2xkBQZidXlSZXMJAMwIAgUIc29sZERhdGEFBmJ1eVJlcwkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEIYXNTdHJpbmcBAmJ2BAckbWF0Y2gwBQJidgMJAAECBQckbWF0Y2gwAgZTdHJpbmcEA2J2MAUHJG1hdGNoMAUDYnYwCQACAQIkU3BvbnNvcmVkIFB1YmxpYyBLZXkgU3RyaW5nIGV4cGVjdGVkCgZpbnZva2UBB3NldENvbmYCA2tleQN2YWwEBmNhbGxlcgkApQgBCAUGaW52b2tlBmNhbGxlcgMJAQ9jb250YWluc0VsZW1lbnQCCQDMCAIFBWNocmlzCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQZjYWxsZXIDCQEIY29udGFpbnMCBQNrZXkCBWNvbmZfCQDMCAIJAQtTdHJpbmdFbnRyeQIFA2tleQUDdmFsBQNuaWwJAAIBAiBFbnRyaWVzIHN0YXJ0aW5nIHdpdGggY29uZl8gb25seQkAAgECIllvdSBhcmUgbm90IGFsbG93ZWQgdG8gY2hhbmdlIHRoaXMBaQEKYWRkQXJ0d29yawwEbmFtZQtkZXNjcmlwdGlvbgR0YWdzBHR5cGUKY2lkRGlzcGxheQxzaGEyNTZFeHBvcnQJY2lkRXhwb3J0DXNoYTI1NkxpY2VuY2UKY2lkTGljZW5jZQdjcmF3bGVyCXJveWFsdGllcwZwdWJLZXkEDSR0MDIxNjMyMjE3MDUJARVpZENhbGxlckRhdGVTcG9uc29yZWQCBQFpBQZwdWJLZXkEBWFydElkCAUNJHQwMjE2MzIyMTcwNQJfMQQGY2FsbGVyCAUNJHQwMjE2MzIyMTcwNQJfMgQEZGF0ZQgFDSR0MDIxNjMyMjE3MDUCXzMEC2lzU3BvbnNvcmVkCAUNJHQwMjE2MzIyMTcwNQJfNAQNJHQwMjE3MTUyMTc4NAkBCnNldExJY2VuY2UCBQpjaWRMaWNlbmNlBQ1zaGEyNTZMaWNlbmNlBApsaWNlbmNlQ0lECAUNJHQwMjE3MTUyMTc4NAJfMQQLbGljZW5jZUhhc2gIBQ0kdDAyMTcxNTIxNzg0Al8yBA92YWxpZGF0ZUFydHdvcmsJARN2YWxpZGF0ZUFydHdvcmtEYXRhCgUGY2FsbGVyBQpjaWREaXNwbGF5BQljaWRFeHBvcnQFCmxpY2VuY2VDSUQFDHNoYTI1NkV4cG9ydAULbGljZW5jZUhhc2gFBG5hbWUFC2Rlc2NyaXB0aW9uBQR0YWdzBQlyb3lhbHRpZXMDCQECIT0CBQ92YWxpZGF0ZUFydHdvcmsCAAkAAgECFVNvbWV0aGluZyB3ZW50IHdyb25nIQQQd2hpdGVsaXN0ZWRfZHJvcAkAZgIJAQ5jaGVja1doaXRlbGlzdAEJAKwCAgUGY2FsbGVyAgtfZnJlZV9kcm9wcwAABA0kdDAyMjA4MzIyMTcxAwUQd2hpdGVsaXN0ZWRfZHJvcAkAlAoCAAAFCmFydEFzc2V0SWQJAQ92YWxpZGF0ZVBheW1lbnQBBQFpBAZhbW91bnQIBQ0kdDAyMjA4MzIyMTcxAl8xBAdhc3NldElkCAUNJHQwMjIwODMyMjE3MQJfMgMJAQEhAQkBCWlzRGVmaW5lZAEFBmFtb3VudAkAAgECFFNvbWV0aGluZyB3ZW50IHdyb25nBBdkZWNyZWFzZV93aGl0ZWxpc3RfZHJvcAMFEHdoaXRlbGlzdGVkX2Ryb3AJAPwHBAUNd2hpdGVsaXN0RGFwcAILdXNlRnJlZURyb3AJAMwIAgUGY2FsbGVyBQNuaWwFA25pbAUEdW5pdAMJAAACBRdkZWNyZWFzZV93aGl0ZWxpc3RfZHJvcAUXZGVjcmVhc2Vfd2hpdGVsaXN0X2Ryb3AECnR4VG9DYWxsZXIDBQtpc1Nwb25zb3JlZAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQUGY2FsbGVyAAAFBHVuaXQFA25pbAUDbmlsCQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIJAQdrZXlEYXRlAgUGY2FsbGVyBQVhcnRJZAUEZGF0ZQkAzAgCCQELU3RyaW5nRW50cnkCCQEHa2V5TmFtZQIFBmNhbGxlcgUFYXJ0SWQFBG5hbWUJAMwIAgkBC1N0cmluZ0VudHJ5AgkBB2tleURlc2MCBQZjYWxsZXIFBWFydElkBQtkZXNjcmlwdGlvbgkAzAgCCQELU3RyaW5nRW50cnkCCQENa2V5RGlzcGxheUNpZAIFBmNhbGxlcgUFYXJ0SWQFCmNpZERpc3BsYXkJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDGtleUV4cG9ydENpZAIFBmNhbGxlcgUFYXJ0SWQFCWNpZEV4cG9ydAkAzAgCCQELU3RyaW5nRW50cnkCCQENa2V5RXhwb3J0SGFzaAIFBmNhbGxlcgUFYXJ0SWQFDHNoYTI1NkV4cG9ydAkAzAgCCQELU3RyaW5nRW50cnkCCQEOa2V5TGljZW5jZUhhc2gCBQZjYWxsZXIFBWFydElkBQtsaWNlbmNlSGFzaAkAzAgCCQELU3RyaW5nRW50cnkCCQENa2V5TGljZW5jZUNpZAIFBmNhbGxlcgUFYXJ0SWQFCmxpY2VuY2VDSUQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBB2tleVR5cGUCBQZjYWxsZXIFBWFydElkBQR0eXBlCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQdrZXlUYWdzAgUGY2FsbGVyBQVhcnRJZAUEdGFncwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBCmtleU1heE1pbnQCBQZjYWxsZXIFBWFydElkAAAJAMwIAgkBDEludGVnZXJFbnRyeQIJAQlrZXlJc3N1ZWQCBQZjYWxsZXIFBWFydElkAAAJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAQlrZXlPblNhbGUCBQZjYWxsZXIFBWFydElkBwkAzAgCCQELU3RyaW5nRW50cnkCCQEKa2V5Q3Jhd2xlcgIFBmNhbGxlcgUFYXJ0SWQFB2NyYXdsZXIJAMwIAgkBDEludGVnZXJFbnRyeQIJAQxrZXlSb3lhbHRpZXMCBQZjYWxsZXIFBWFydElkBQlyb3lhbHRpZXMJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFC2ZlZVJlY2VpdmVyCQBpAgUGYW1vdW50AAIFCmFydEFzc2V0SWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUKcmVwb3J0RGFwcAkAaQIFBmFtb3VudAACBQphcnRBc3NldElkBQNuaWwFCnR4VG9DYWxsZXIJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQENdXBkYXRlQXJ0d29yaw0EdHhpZARuYW1lC2Rlc2NyaXB0aW9uBHRhZ3MEdHlwZQpjaWREaXNwbGF5DHNoYTI1NkV4cG9ydAljaWRFeHBvcnQNc2hhMjU2TGljZW5jZQpjaWRMaWNlbmNlB2NyYXdsZXIJcm95YWx0aWVzBnB1YktleQMJAQEhAQULZGFwcFJ1bm5pbmcJAAIBBQ5tYWludGVuYW5jZU1TRwQNJHQwMjQxNTAyNDIyMAkBFWlkQ2FsbGVyRGF0ZVNwb25zb3JlZAIFAWkFBnB1YktleQQCaWQIBQ0kdDAyNDE1MDI0MjIwAl8xBAZjYWxsZXIIBQ0kdDAyNDE1MDI0MjIwAl8yBARkYXRlCAUNJHQwMjQxNTAyNDIyMAJfMwQLaXNTcG9uc29yZWQIBQ0kdDAyNDE1MDI0MjIwAl80BA0kdDAyNDIzMDI0Mjk5CQEKc2V0TEljZW5jZQIFCmNpZExpY2VuY2UFDXNoYTI1NkxpY2VuY2UECmxpY2VuY2VDSUQIBQ0kdDAyNDIzMDI0Mjk5Al8xBAtsaWNlbmNlSGFzaAgFDSR0MDI0MjMwMjQyOTkCXzIED3ZhbGlkYXRlQXJ0d29yawkBE3ZhbGlkYXRlQXJ0d29ya0RhdGEKBQZjYWxsZXIFCmNpZERpc3BsYXkFCWNpZEV4cG9ydAUKbGljZW5jZUNJRAUMc2hhMjU2RXhwb3J0BQtsaWNlbmNlSGFzaAUEbmFtZQULZGVzY3JpcHRpb24FBHRhZ3MFCXJveWFsdGllcwMJAQIhPQIFD3ZhbGlkYXRlQXJ0d29yawIACQACAQIVU29tZXRoaW5nIHdlbnQgd3JvbmchBAplbnRyeUV4aXN0CQEOZ2V0U3RyaW5nQnlLZXkBCQEHa2V5TmFtZQIFBmNhbGxlcgUEdHhpZAMJAAACBQplbnRyeUV4aXN0AgAJAAIBAg9FbnRyeSBub3QgZm91bmQEBGZsYWcJAQ5nZXRTdHJpbmdCeUtleQEJAQdrZXlGbGFnAgUGY2FsbGVyBQR0eGlkAwkAAAIFBGZsYWcCB0lMTEVHQUwJAAIBAh1DYW5ub3QgdXBkYXRlIElMTEVHQUwgYXJ0d29yawMJAQEhAQkBC2lzQXJ0TWludGVkAgUGY2FsbGVyBQR0eGlkBAp0eFRvQ2FsbGVyAwULaXNTcG9uc29yZWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFBmNhbGxlcgAABQR1bml0BQNuaWwFA25pbAkAzggCCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQdrZXlOYW1lAgUGY2FsbGVyBQR0eGlkBQRuYW1lCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQdrZXlEZXNjAgUGY2FsbGVyBQR0eGlkBQtkZXNjcmlwdGlvbgkAzAgCCQELU3RyaW5nRW50cnkCCQENa2V5RGlzcGxheUNpZAIFBmNhbGxlcgUEdHhpZAUKY2lkRGlzcGxheQkAzAgCCQELU3RyaW5nRW50cnkCCQEMa2V5RXhwb3J0Q2lkAgUGY2FsbGVyBQR0eGlkBQljaWRFeHBvcnQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDWtleUV4cG9ydEhhc2gCBQZjYWxsZXIFBHR4aWQFDHNoYTI1NkV4cG9ydAkAzAgCCQELU3RyaW5nRW50cnkCCQENa2V5TGljZW5jZUNpZAIFBmNhbGxlcgUEdHhpZAUKbGljZW5jZUNJRAkAzAgCCQELU3RyaW5nRW50cnkCCQEOa2V5TGljZW5jZUhhc2gCBQZjYWxsZXIFBHR4aWQFC2xpY2VuY2VIYXNoCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQdrZXlUYWdzAgUGY2FsbGVyBQR0eGlkBQR0YWdzCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQdrZXlUeXBlAgUGY2FsbGVyBQR0eGlkBQR0eXBlCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQprZXlDcmF3bGVyAgUGY2FsbGVyBQR0eGlkBQdjcmF3bGVyCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEMa2V5Um95YWx0aWVzAgUGY2FsbGVyBQR0eGlkBQlyb3lhbHRpZXMFA25pbAUKdHhUb0NhbGxlcgkAAgECDkFscmVhZHkgbWludGVkAWkBC2ZsYWdBcnR3b3JrBAVhcnRJZARhZGRyBGZsYWcEbm90ZQQNJHQwMjU5MjYyNTk2MAkBDGlkQ2FsbGVyRGF0ZQEFAWkEAmlkCAUNJHQwMjU5MjYyNTk2MAJfMQQGY2FsbGVyCAUNJHQwMjU5MjYyNTk2MAJfMgMJAQ9jb250YWluc0VsZW1lbnQCCQDMCAIFBWNocmlzCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQZjYWxsZXIDCQEPY29udGFpbnNFbGVtZW50AgkAzAgCAgdDT05TRU5UCQDMCAICAAkAzAgCAg9DSEFOR0VfUkVRVUlSRUQJAMwIAgIHRkxBR0dFRAkAzAgCAgdJTExFR0FMBQNuaWwFBGZsYWcJAMwIAgkBC1N0cmluZ0VudHJ5AgkBB2tleUZsYWcCBQRhZGRyBQVhcnRJZAUEZmxhZwkAzAgCCQELU3RyaW5nRW50cnkCCQEHa2V5Tm90ZQIFBGFkZHIFBWFydElkBQRub3RlBQNuaWwJAAIBCQCsAgICDlVua25vdyBzdGF0dXMgBQRmbGFnCQACAQITWW91IGFyZSBub3QgYWxsb3dlZAFpAQ1kZWxldGVBcnR3b3JrAgVhcnRJZARhZGRyBA0kdDAyNjM5NjI2NDMwCQEMaWRDYWxsZXJEYXRlAQUBaQQCaWQIBQ0kdDAyNjM5NjI2NDMwAl8xBAZjYWxsZXIIBQ0kdDAyNjM5NjI2NDMwAl8yBAlhZGRyVG9Vc2UDCQEPY29udGFpbnNFbGVtZW50AgkAzAgCBQVjaHJpcwkAzAgCCQClCAEFBHRoaXMFA25pbAUGY2FsbGVyBQRhZGRyBQZjYWxsZXIECmVudHJ5RXhpc3QJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkBDmdldFN0cmluZ0J5S2V5AQkBB2tleU5hbWUCBQlhZGRyVG9Vc2UFBWFydElkAiBObyBhcnQgbWF0Y2hpbmcgZm9yIHRoaXMgYWRkcmVzcwMJAAACBQplbnRyeUV4aXN0AgAJAAIBAiBObyBhcnQgbWF0Y2hpbmcgZm9yIHRoaXMgYWRkcmVzcwQKc2hhMjU2SGFzaAkBDmdldFN0cmluZ0J5S2V5AQkBEWtleUhhc2hCeVR4aWRBZGRyAgUJYWRkclRvVXNlBQVhcnRJZAQGc2lnbklEAwkBAiE9AgUKc2hhMjU2SGFzaAIACQEOZ2V0U3RyaW5nQnlLZXkBCQEJa2V5U2lnbklEAgUJYWRkclRvVXNlBQVhcnRJZAIABA1zaWduSURfbGVnYWN5AwkAAAIFBnNpZ25JRAIABQNuaWwJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBDWtleWlkQnlTaWduaWQCBQlhZGRyVG9Vc2UFBnNpZ25JRAUDbmlsBAxkYXRhVG9EZWxldGUJAM4IAgkAzAgCCQELRGVsZXRlRW50cnkBCQEHa2V5RGF0ZQIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBB2tleU5hbWUCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQdrZXlEZXNjAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQENa2V5RGlzcGxheUNpZAIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBDGtleUV4cG9ydENpZAIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBDWtleUV4cG9ydEhhc2gCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQ5rZXlMaWNlbmNlSGFzaAIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBDWtleUxpY2VuY2VDaWQCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQdrZXlUeXBlAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEHa2V5VGFncwIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBCmtleU1heE1pbnQCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQlrZXlTaWduSUQCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQlrZXlJc3N1ZWQCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQlrZXlPblNhbGUCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQdrZXlGbGFnAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEIa2V5UHJpY2UCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJARJrZXlBc3NldElkQWNjZXB0ZWQCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQ5rZXlPd25lckJ5SGFzaAEFCnNoYTI1Nkhhc2gJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBCmtleUVuZFNhbGUCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQdrZXlOb3RlAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEKa2V5Q3Jhd2xlcgIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBDGtleVJveWFsdGllcwIFCWFkZHJUb1VzZQUFYXJ0SWQFA25pbAUNc2lnbklEX2xlZ2FjeQMJAQEhAQkBC2lzQXJ0TWludGVkAgUJYWRkclRvVXNlBQVhcnRJZAMJAQEhAQULZGFwcFJ1bm5pbmcJAAIBBQ5tYWludGVuYW5jZU1TRwUMZGF0YVRvRGVsZXRlAwkBD2NvbnRhaW5zRWxlbWVudAIJAMwIAgUFY2hyaXMJAMwIAgkApQgBBQR0aGlzBQNuaWwFBmNhbGxlcgUMZGF0YVRvRGVsZXRlCQACAQIoQXJ0IGFscmVhZHkgbWludGVkLCB5b3UgY2Fubm90IGRlbGV0ZSBpdAFpAQtzZWxsQXJ0d29yawYFYXJ0SWQFcHJpY2UHbWF4TWludAdhc3NldElkCGJsb2NrRW5kBnB1YktleQQNJHQwMjkyMDkyOTI3OQkBFWlkQ2FsbGVyRGF0ZVNwb25zb3JlZAIFAWkFBnB1YktleQQCaWQIBQ0kdDAyOTIwOTI5Mjc5Al8xBAZjYWxsZXIIBQ0kdDAyOTIwOTI5Mjc5Al8yBARkYXRlCAUNJHQwMjkyMDkyOTI3OQJfMwQLaXNTcG9uc29yZWQIBQ0kdDAyOTIwOTI5Mjc5Al80BAthcnR3b3JrTmFtZQkBDmdldFN0cmluZ0J5S2V5AQkBB2tleU5hbWUCBQZjYWxsZXIFBWFydElkAwkAAAIFC2FydHdvcmtOYW1lAgAJAAIBAiNUaGlzIGFydCBkb2Vzbid0IG1hdGNoIHlvdXIgYWNjb3VudAQEZmxhZwkBDmdldFN0cmluZ0J5S2V5AQkBB2tleUZsYWcCBQZjYWxsZXIFBWFydElkAwkBD2NvbnRhaW5zRWxlbWVudAIJAMwIAgIPQ0hBTkdFX1JFUVVJUkVECQDMCAICB0ZMQUdHRUQJAMwIAgIHSUxMRUdBTAUDbmlsBQRmbGFnCQACAQIPRmxhZ2dlZCBhcnR3b3JrBAZiaWROYnIJAQ9nZXRJbnRlZ2VyQnlLZXkBCQCsAgICEmN1cnJlbnRfYmlkYW1vdW50XwUFYXJ0SWQDCQBmAgAABQhibG9ja0VuZAkAAgECDE5lZ2F0aXZlIGVuZAMDCQBmAgUIYmxvY2tFbmQAAAMJAQIhPQIFB21heE1pbnQAAQYJAQIhPQIFBXByaWNlAAAHCQACAQI6VGltZWQgb2ZmZXIgb25seSBhbGxvd2VkIGZvciB1bmlxdWUgZWRpdGlvbiBhbmQgb2ZmZXIgb25seQQKYmFzZUhlaWdodAMJAAACBQhibG9ja0VuZAAAAAAFBmhlaWdodAMJAQEhAQkBEGFjY2VwdGVkQXNzZXRJZHMBBQdhc3NldElkCQACAQIVU29tZXRoaW5nIHdlbnQgd3JvbmchAwkBASEBCQEPdmFsaWRhdGVNaW5TZWxsAQUFcHJpY2UJAAIBAhVTb21ldGhpbmcgd2VudCB3cm9uZyEECWNoZWNrVXNlcgkBDHZhbGlkYXRlVXNlcgEFBmNhbGxlcgMJAQIhPQIFCWNoZWNrVXNlcgIACQACAQUJY2hlY2tVc2VyBAphbW91bnRTb2xkCQEPZ2V0SW50ZWdlckJ5S2V5AQkBCWtleUlzc3VlZAIFBmNhbGxlcgUFYXJ0SWQECm1heENhblNlbGwJAQ9nZXRJbnRlZ2VyQnlLZXkBCQEKa2V5TWF4TWludAIFBmNhbGxlcgUFYXJ0SWQDCQBmAgUHbWF4TWludABkCQACAQIcMTAwIGVkaXRpb25zIG1heCBwZXIgYXJ0d29yawMDCQECIT0CBQphbW91bnRTb2xkAAAJAAACBQphbW91bnRTb2xkBQptYXhDYW5TZWxsBwkAAgECFE1heCBlZGl0aW9uIHJlYWNoZWQuAwMJAGYCBQphbW91bnRTb2xkAAAJAQIhPQIFCm1heENhblNlbGwFB21heE1pbnQHCQACAQImQ2Fubm90IGNoYW5nZSBtYXhpbXVtIGlzc3VhYmxlIGFueW1vcmUDAwkAZgIFBmJpZE5icgAACQECIT0CBQptYXhDYW5TZWxsBQdtYXhNaW50BwkAAgECMUNhbm5vdCBjaGFuZ2UgbWF4aW11bSBpc3N1YWJsZSB3aXRoIGFjdGl2ZSBvcmRlcnMECnNlbGxTdGF0dXMDAwkAZgIFBXByaWNlAAAJAGYCBQdtYXhNaW50AAAHBgcECnR4VG9DYWxsZXIDBQtpc1Nwb25zb3JlZAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQUGY2FsbGVyAAAFBHVuaXQFA25pbAUDbmlsCQDOCAIJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAQlrZXlPblNhbGUCBQZjYWxsZXIFBWFydElkBQpzZWxsU3RhdHVzCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEIa2V5UHJpY2UCBQZjYWxsZXIFBWFydElkBQVwcmljZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBCmtleU1heE1pbnQCBQZjYWxsZXIFBWFydElkBQdtYXhNaW50CQDMCAIJAQtTdHJpbmdFbnRyeQIJARJrZXlBc3NldElkQWNjZXB0ZWQCBQZjYWxsZXIFBWFydElkBQdhc3NldElkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEKa2V5RW5kU2FsZQIFBmNhbGxlcgUFYXJ0SWQJAGQCBQpiYXNlSGVpZ2h0BQhibG9ja0VuZAUDbmlsBQp0eFRvQ2FsbGVyAWkBCmJ1eUFydHdvcmsCBWFydElkBmlzc3VlcgkBB2J1eU1pbnQGBQFpBQVhcnRJZAUGaXNzdWVyAgACAAIAAWkBBnNldEJpZAIFYXJ0SWQGaXNzdWVyBA0kdDAzMTY1MjMxNjkyCQEMaWRDYWxsZXJEYXRlAQUBaQQCaWQIBQ0kdDAzMTY1MjMxNjkyAl8xBAZjYWxsZXIIBQ0kdDAzMTY1MjMxNjkyAl8yBARkYXRlCAUNJHQwMzE2NTIzMTY5MgJfMwQNJHQwMzE2OTczMTczMwkBCWlzUGF5bWVudAEFAWkEB3BheW1lbnQIBQ0kdDAzMTY5NzMxNzMzAl8xBAZhbW91bnQIBQ0kdDAzMTY5NzMxNzMzAl8yBAdhc3NldElkAwkBASEBCQEJaXNEZWZpbmVkAQgFB3BheW1lbnQHYXNzZXRJZAIFV0FWRVMJANgEAQkBBXZhbHVlAQgFB3BheW1lbnQHYXNzZXRJZAQIYmxvY2tFbmQJAQ9nZXRJbnRlZ2VyQnlLZXkBCQEKa2V5RW5kU2FsZQIFBmlzc3VlcgUFYXJ0SWQDAwkBAiE9AgUIYmxvY2tFbmQAAAkAZwIFBmhlaWdodAUIYmxvY2tFbmQHCQACAQILU2FsZSBlbmRlZC4EBmJpZE5icgkBD2dldEludGVnZXJCeUtleQEJAKwCAgISY3VycmVudF9iaWRhbW91bnRfBQVhcnRJZAMJAQEhAQkBEGFjY2VwdGVkQXNzZXRJZHMBBQdhc3NldElkCQACAQISYXNzZXQgbm90IGFjY2VwdGVkAwkBASEBCQEPdmFsaWRhdGVNaW5TZWxsAQUGYW1vdW50CQACAQIOV3JvbmcgbWluIHNlbGwECmFtb3VudFNvbGQJAQ9nZXRJbnRlZ2VyQnlLZXkBCQEJa2V5SXNzdWVkAgUGaXNzdWVyBQVhcnRJZAQKbWF4Q2FuU2VsbAkBD2dldEludGVnZXJCeUtleQEJAQprZXlNYXhNaW50AgUGaXNzdWVyBQVhcnRJZAMJAGcCAAAFCm1heENhblNlbGwJAAIBAiNObyBtYXggZWRpdGlvbiBzZXQgZm9yIHRoaXMgYXJ0d29yawMJAGcCBQphbW91bnRTb2xkBQptYXhDYW5TZWxsCQACAQIYU29sZCBvdXQsIHlvdSBjYW5ub3QgYmlkCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAgRiaWRfBQVhcnRJZAIBXwUGaXNzdWVyAgFfBQZjYWxsZXICAV8FAmlkAgVfT1BFTgkArAICCQCsAgIJAKwCAgkArAICBQdhc3NldElkAgFfCQCkAwEFBmFtb3VudAIBXwkApAMBBQRkYXRlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgICEmN1cnJlbnRfYmlkYW1vdW50XwUFYXJ0SWQJAGQCBQZiaWROYnIAAQUDbmlsAWkBCWFjY2VwdEJpZAUFYXJ0SWQGaXNzdWVyBWJpZElkCGJpZE93bmVyBnB1YktleQkBB2J1eU1pbnQGBQFpBQVhcnRJZAUGaXNzdWVyBQViaWRJZAUIYmlkT3duZXIFBnB1YktleQFpAQljYW5jZWxCaWQEBWFydElkBmlzc3VlcgViaWRJZAhiaWRPd25lcgQNJHQwMzMwNTczMzExOAkBDGlkQ2FsbGVyRGF0ZQEFAWkEAmlkCAUNJHQwMzMwNTczMzExOAJfMQQGY2FsbGVyCAUNJHQwMzMwNTczMzExOAJfMgQEZGF0ZQgFDSR0MDMzMDU3MzMxMTgCXzMDAwkBAiE9AgUGY2FsbGVyBQhiaWRPd25lcgkBAiE9AgUGY2FsbGVyBQZpc3N1ZXIHCQACAQIZWW91IGNhbm5vdCBkbyB0aGlzIGFjdGlvbgQNcmV0dXJuTW9uZXlUbwMJAAACBQZjYWxsZXIFBmlzc3VlcgUIYmlkT3duZXIFBmNhbGxlcgQGYmlkTmJyCQEPZ2V0SW50ZWdlckJ5S2V5AQkArAICAhJjdXJyZW50X2JpZGFtb3VudF8FBWFydElkBApiaWREYXRhS2V5CQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICBGJpZF8FBWFydElkAgFfBQZpc3N1ZXICAV8FCGJpZE93bmVyAgFfBQViaWRJZAQHYmlkRGF0YQkBDmdldFN0cmluZ0J5S2V5AQkArAICBQpiaWREYXRhS2V5AgVfT1BFTgMJAAACBQdiaWREYXRhAgAJAAIBAg1CaWQgbm90IGZvdW5kBApiaWREYXRhQXJyCQC1CQIFB2JpZERhdGECAV8EB2Fzc2V0SWQJAQ1nZXRCaWRBc3NldElkAQkAkQMCBQpiaWREYXRhQXJyAAAECWJpZFN0YXR1cwIIQ0FOQ0VMRUQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICBQpiaWREYXRhS2V5AgVfT1BFTgkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgUKYmlkRGF0YUtleQIBXwUJYmlkU3RhdHVzCQCsAgIJAKwCAgUHYmlkRGF0YQIBXwkApAMBBQRkYXRlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgICEmN1cnJlbnRfYmlkYW1vdW50XwUFYXJ0SWQJAGUCBQZiaWROYnIAAQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQUNcmV0dXJuTW9uZXlUbwkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCmJpZERhdGFBcnIAAQUHYXNzZXRJZAUDbmlsAQJ0eAEIdmVyaWZpZXIABAckbWF0Y2gwBQJ0eAMJAAECBQckbWF0Y2gwAhdJbnZva2VTY3JpcHRUcmFuc2FjdGlvbgQDaW52BQckbWF0Y2gwAwMDAwkAAAIIBQNpbnYIZnVuY3Rpb24CCmFkZEFydHdvcmsJAAACCAUDaW52BGRBcHAFBHRoaXMHCQAAAggFA2ludgNmZWUAoMIeBwkAAAIIBQNpbnYKZmVlQXNzZXRJZAUEdW5pdAcJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAJANkEAQkBCGFzU3RyaW5nAQkAkQMCCAUDaW52BGFyZ3MACwMDAwMJAAACCAUDaW52CGZ1bmN0aW9uAg11cGRhdGVBcnR3b3JrCQAAAggFA2ludgRkQXBwBQR0aGlzBwkAAAIIBQNpbnYDZmVlAKDCHgcJAAACCAUDaW52CmZlZUFzc2V0SWQFBHVuaXQHCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACQDZBAEJAQhhc1N0cmluZwEJAJEDAggFA2ludgRhcmdzAAwDAwMDCQAAAggFA2ludghmdW5jdGlvbgILc2VsbEFydHdvcmsJAAACCAUDaW52BGRBcHAFBHRoaXMHCQAAAggFA2ludgNmZWUAoMIeBwkAAAIIBQNpbnYKZmVlQXNzZXRJZAUEdW5pdAcJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAJANkEAQkBCGFzU3RyaW5nAQkAkQMCCAUDaW52BGFyZ3MABQMDAwMJAAACCAUDaW52CGZ1bmN0aW9uAglhY2NlcHRCaWQJAAACCAUDaW52BGRBcHAFBHRoaXMHCQAAAggFA2ludgNmZWUAoMIeBwkAAAIIBQNpbnYKZmVlQXNzZXRJZAUEdW5pdAcJAMgTAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAJANkEAQkBCGFzU3RyaW5nAQkAkQMCCAUDaW52BGFyZ3MABAkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAgFAnR4D3NlbmRlclB1YmxpY0tleQkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAgFAnR4D3NlbmRlclB1YmxpY0tleYBdqVs=", "height": 2794895, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: CbQLzQEJwXAJmvjWUej5pNRxUcd4WS4CjNC8qhTo5ufj Next: Ew1uyDPcef26jEhYioKmUHAAMEo6kg3itiESQYXKjcFo Diff:
OldNewDifferences
2121 let whitelistDapp = value(addressFromString(getStringByKey("conf_whitelist_dapp")))
2222
2323 let puzzle_art_pool = getStringByKey("conf_puzzle_art_pool")
24+
25+let reportDapp = value(addressFromString(getStringByKey("conf_report_dapp")))
2426
2527 let usdtPPAssetId_str = getStringByKey("conf_accepted_asset_USDT_PP")
2628
274276
275277
276278 func validatePayment (i) = {
277- let $t01015610192 = isPayment(i)
278- let payment = $t01015610192._1
279- let amount = $t01015610192._2
279+ let $t01023410270 = isPayment(i)
280+ let payment = $t01023410270._1
281+ let amount = $t01023410270._2
280282 let assetId = if (if (isDefined(payment.assetId))
281283 then (payment.assetId == artAssetId)
282284 else false)
299301
300302
301303 func validatePriceAssetId (i,priceAssetId,artworkPrice) = {
302- let $t01078910825 = isPayment(i)
303- let payment = $t01078910825._1
304- let amount = $t01078910825._2
304+ let $t01086710903 = isPayment(i)
305+ let payment = $t01086710903._1
306+ let amount = $t01086710903._2
305307 let assetId = if (!(isDefined(payment.assetId)))
306308 then unit
307309 else if (if ((size(priceAssetId) > 0))
385387
386388
387389 func buyMint (i,artId,issuer,bidId,bidOwner,pubKey) = {
388- let $t01343013519 = idCallerDateSponsored(i, pubKey)
389- let id = $t01343013519._1
390- let caller = $t01343013519._2
391- let date = $t01343013519._3
392- let isSponsored = $t01343013519._4
390+ let $t01350813597 = idCallerDateSponsored(i, pubKey)
391+ let id = $t01350813597._1
392+ let caller = $t01350813597._2
393+ let date = $t01350813597._3
394+ let isSponsored = $t01350813597._4
393395 let isBid = if (if (if ((caller == issuer))
394396 then (bidOwner != "")
395397 else false)
449451 then throw(checkUser)
450452 else {
451453 let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
452- let $t01509615288 = if (isBid)
454+ let $t01517415366 = if (isBid)
453455 then getPriceAssetIdFromBid(bidDataKey)
454456 else validatePriceAssetId(i, priceAssetId, artworkPrice)
455- let amount = $t01509615288._1
456- let assetId = $t01509615288._2
457+ let amount = $t01517415366._1
458+ let assetId = $t01517415366._2
457459 let agent = valueOrElse(getString(userDapp, keyArtistAgentAddr(issuer)), feeReceiver)
458460 let agentShare = valueOrElse(getInteger(userDapp, keyPrimaryShareAgent(issuer)), 0)
459461 let publicAgent = valueOrElse(getString(userDapp, keyArtistPublicAgentAddr(issuer)), feeReceiver)
576578
577579 @Callable(i)
578580 func addArtwork (name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = {
579- let $t02155421627 = idCallerDateSponsored(i, pubKey)
580- let artId = $t02155421627._1
581- let caller = $t02155421627._2
582- let date = $t02155421627._3
583- let isSponsored = $t02155421627._4
584- let $t02163721706 = setLIcence(cidLicence, sha256Licence)
585- let licenceCID = $t02163721706._1
586- let licenceHash = $t02163721706._2
581+ let $t02163221705 = idCallerDateSponsored(i, pubKey)
582+ let artId = $t02163221705._1
583+ let caller = $t02163221705._2
584+ let date = $t02163221705._3
585+ let isSponsored = $t02163221705._4
586+ let $t02171521784 = setLIcence(cidLicence, sha256Licence)
587+ let licenceCID = $t02171521784._1
588+ let licenceHash = $t02171521784._2
587589 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
588590 if ((validateArtwork != ""))
589591 then throw("Something went wrong!")
590592 else {
591593 let whitelisted_drop = (checkWhitelist((caller + "_free_drops")) > 0)
592- let $t02200522093 = if (whitelisted_drop)
594+ let $t02208322171 = if (whitelisted_drop)
593595 then $Tuple2(0, artAssetId)
594596 else validatePayment(i)
595- let amount = $t02200522093._1
596- let assetId = $t02200522093._2
597+ let amount = $t02208322171._1
598+ let assetId = $t02208322171._2
597599 if (!(isDefined(amount)))
598600 then throw("Something went wrong")
599601 else {
605607 let txToCaller = if (isSponsored)
606608 then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
607609 else nil
608- ([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, artAssetId)] ++ txToCaller)
610+ ([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)
609611 }
610612 else throw("Strict value is not equal to itself.")
611613 }
618620 func updateArtwork (txid,name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = if (!(dappRunning))
619621 then throw(maintenanceMSG)
620622 else {
621- let $t02400824078 = idCallerDateSponsored(i, pubKey)
622- let id = $t02400824078._1
623- let caller = $t02400824078._2
624- let date = $t02400824078._3
625- let isSponsored = $t02400824078._4
626- let $t02408824157 = setLIcence(cidLicence, sha256Licence)
627- let licenceCID = $t02408824157._1
628- let licenceHash = $t02408824157._2
623+ let $t02415024220 = idCallerDateSponsored(i, pubKey)
624+ let id = $t02415024220._1
625+ let caller = $t02415024220._2
626+ let date = $t02415024220._3
627+ let isSponsored = $t02415024220._4
628+ let $t02423024299 = setLIcence(cidLicence, sha256Licence)
629+ let licenceCID = $t02423024299._1
630+ let licenceHash = $t02423024299._2
629631 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
630632 if ((validateArtwork != ""))
631633 then throw("Something went wrong!")
653655
654656 @Callable(i)
655657 func flagArtwork (artId,addr,flag,note) = {
656- let $t02578425818 = idCallerDate(i)
657- let id = $t02578425818._1
658- let caller = $t02578425818._2
658+ let $t02592625960 = idCallerDate(i)
659+ let id = $t02592625960._1
660+ let caller = $t02592625960._2
659661 if (containsElement([chris, toString(this)], caller))
660662 then if (containsElement(["CONSENT", "", "CHANGE_REQUIRED", "FLAGGED", "ILLEGAL"], flag))
661663 then [StringEntry(keyFlag(addr, artId), flag), StringEntry(keyNote(addr, artId), note)]
667669
668670 @Callable(i)
669671 func deleteArtwork (artId,addr) = {
670- let $t02625426288 = idCallerDate(i)
671- let id = $t02625426288._1
672- let caller = $t02625426288._2
672+ let $t02639626430 = idCallerDate(i)
673+ let id = $t02639626430._1
674+ let caller = $t02639626430._2
673675 let addrToUse = if (containsElement([chris, toString(this)], caller))
674676 then addr
675677 else caller
699701
700702 @Callable(i)
701703 func sellArtwork (artId,price,maxMint,assetId,blockEnd,pubKey) = {
702- let $t02906729137 = idCallerDateSponsored(i, pubKey)
703- let id = $t02906729137._1
704- let caller = $t02906729137._2
705- let date = $t02906729137._3
706- let isSponsored = $t02906729137._4
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
707709 let artworkName = getStringByKey(keyName(caller, artId))
708710 if ((artworkName == ""))
709711 then throw("This art doesn't match your account")
777779
778780 @Callable(i)
779781 func setBid (artId,issuer) = {
780- let $t03151031550 = idCallerDate(i)
781- let id = $t03151031550._1
782- let caller = $t03151031550._2
783- let date = $t03151031550._3
784- let $t03155531591 = isPayment(i)
785- let payment = $t03155531591._1
786- let amount = $t03155531591._2
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
787789 let assetId = if (!(isDefined(payment.assetId)))
788790 then "WAVES"
789791 else toBase58String(value(payment.assetId))
819821
820822 @Callable(i)
821823 func cancelBid (artId,issuer,bidId,bidOwner) = {
822- let $t03291532976 = idCallerDate(i)
823- let id = $t03291532976._1
824- let caller = $t03291532976._2
825- let date = $t03291532976._3
824+ let $t03305733118 = idCallerDate(i)
825+ let id = $t03305733118._1
826+ let caller = $t03305733118._2
827+ let date = $t03305733118._3
826828 if (if ((caller != bidOwner))
827829 then (caller != issuer)
828830 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")
24+
25+let reportDapp = value(addressFromString(getStringByKey("conf_report_dapp")))
2426
2527 let usdtPPAssetId_str = getStringByKey("conf_accepted_asset_USDT_PP")
2628
2729 let artAssetId_str = getStringByKey("conf_accepted_asset_ART")
2830
2931 let usdcPPAssetId_str = getStringByKey("conf_accepted_asset_USDC_PP")
3032
3133 let eastAssetId_str = getStringByKey("conf_accepted_asset_EAST")
3234
3335 let puzzleAssetId_str = getStringByKey("conf_accepted_asset_PUZZLE")
3436
3537 let ethPPAssetId_str = getStringByKey("conf_accepted_asset_ETH_PP")
3638
3739 let wavesAssetId_str = "WAVES"
3840
3941 let usdtPPAssetId = fromBase58String(usdtPPAssetId_str)
4042
4143 let artAssetId = fromBase58String(artAssetId_str)
4244
4345 let usdcPPAssetId = fromBase58String(usdcPPAssetId_str)
4446
4547 let eastAssetId = fromBase58String(eastAssetId_str)
4648
4749 let puzzleAssetId = fromBase58String(puzzleAssetId_str)
4850
4951 let ethPPAssetId = fromBase58String(ethPPAssetId_str)
5052
5153 let wavesAssetId = base58''
5254
5355 let all_accepted_assets = [usdtPPAssetId_str, artAssetId_str, usdcPPAssetId_str, eastAssetId_str, puzzleAssetId_str, wavesAssetId_str, ethPPAssetId_str]
5456
5557 let chris = getStringByKey("conf_admin_1")
5658
5759 func getIntegerByKeyFromOracle (key) = valueOrErrorMessage(getInteger(oracleFee, key), "Integer undefine or 0 in oracle")
5860
5961
6062 func getIntegerByKey (key) = valueOrElse(getInteger(this, key), 0)
6163
6264
6365 func checkWhitelist (key) = valueOrElse(getInteger(whitelistDapp, key), 0)
6466
6567
6668 func getBooleanByKey (key) = valueOrElse(getBoolean(this, key), false)
6769
6870
6971 let commission_fee = 8
7072
7173 let defaultLicence = getStringByKey("conf_default_licence")
7274
7375 let defaultHashLicence = getStringByKey("conf_default_licence_hash")
7476
7577 let dappRunning = valueOrElse(getBoolean(userDapp, "conf_dapp_is_running"), true)
7678
7779 let maintenanceMSG = valueOrElse(getString(userDapp, "conf_maintenance_msg"), "")
7880
7981 let userSuspended = "SUSPENDED"
8082
8183 let userRemoved = "REMOVED"
8284
8385 let userUnregistered = "UNREGISTERED"
8486
8587 let userAllowed = "ALLOWED"
8688
8789 let currentCertificationPrice = getIntegerByKeyFromOracle(("certification_fee_" + toBase58String(artAssetId)))
8890
8991 let mint_fee = getIntegerByKeyFromOracle(("mint_fee_" + toBase58String(artAssetId)))
9092
9193 func getArtworkRoyalties (key) = valueOrElse(getInteger(this, key), 1000)
9294
9395
9496 func validateCID (cid) = if (contains(cid, "/"))
9597 then if (if ((76 > size(cid)))
9698 then (size(split(cid, "/")[0]) == 59)
9799 else false)
98100 then (16 > size(split(cid, "/")[1]))
99101 else false
100102 else false
101103
102104
103105 func validateHash (hash) = (size(hash) == 64)
104106
105107
106108 func keyUserStatus (caller) = ("user_status_" + caller)
107109
108110
109111 func keyDate (caller,artId) = ((("art_date_" + artId) + "_") + caller)
110112
111113
112114 func keyName (caller,artId) = ((("art_name_" + artId) + "_") + caller)
113115
114116
115117 func keyDesc (caller,artId) = ((("art_desc_" + artId) + "_") + caller)
116118
117119
118120 func keyDisplayCid (caller,artId) = ((("art_display_cid_" + artId) + "_") + caller)
119121
120122
121123 func keyExportHash (caller,artId) = ((("art_export_hash_" + artId) + "_") + caller)
122124
123125
124126 func keyExportCid (caller,artId) = ((("art_export_cid_" + artId) + "_") + caller)
125127
126128
127129 func keyMaxMint (caller,artId) = ((("art_maxmint_" + artId) + "_") + caller)
128130
129131
130132 func keySignID (caller,artId) = ((("art_signid_" + artId) + "_") + caller)
131133
132134
133135 func keyIssued (caller,artId) = ((("art_issued_" + artId) + "_") + caller)
134136
135137
136138 func keyOnSale (caller,artId) = ((("art_onsale_" + artId) + "_") + caller)
137139
138140
139141 func keyLicenceHash (caller,artId) = ((("art_licence_hash_" + artId) + "_") + caller)
140142
141143
142144 func keyLicenceCid (caller,artId) = ((("art_licence_cid_" + artId) + "_") + caller)
143145
144146
145147 func keyTags (caller,artId) = ((("art_tags_" + artId) + "_") + caller)
146148
147149
148150 func keyType (caller,artId) = ((("art_type_" + artId) + "_") + caller)
149151
150152
151153 func keyNote (caller,artId) = ((("art_note_" + artId) + "_") + caller)
152154
153155
154156 func keyCrawler (caller,artId) = ((("art_crawler_cid_" + artId) + "_") + caller)
155157
156158
157159 func keyRoyalties (caller,artId) = ((("art_royalties_" + artId) + "_") + caller)
158160
159161
160162 func keyPrice (caller,artId) = ((("art_price_" + artId) + "_") + caller)
161163
162164
163165 func keyEndSale (caller,artId) = ((("art_endsale_" + artId) + "_") + caller)
164166
165167
166168 func keyAssetIdAccepted (caller,artId) = ((("art_assetAccepted_" + artId) + "_") + caller)
167169
168170
169171 func keyFlag (caller,artId) = ((("art_flag_" + artId) + "_") + caller)
170172
171173
172174 func keyArtistAgentAddr (artistAddr) = ("artist_agent_" + artistAddr)
173175
174176
175177 func keyPrimaryShareAgent (artistAddr) = ("artist_agent_primary_" + artistAddr)
176178
177179
178180 func keyArtistPublicAgentAddr (artistAddr) = ("artist_public_agent_" + artistAddr)
179181
180182
181183 func keyPrimarySharePublicAgent (artistAddr) = ("artist_public_agent_primary_" + artistAddr)
182184
183185
184186 func keyHashByTxidAddr (caller,txid) = ((("get_hashbytxidaddr_" + txid) + "_") + caller)
185187
186188
187189 func keyOwnerByHash (sha256Hash) = ("get_owner_by_hash_" + sha256Hash)
188190
189191
190192 func keyidBySignid (caller,signId) = ((("get_artidbysignid_" + signId) + "_") + caller)
191193
192194
193195 func validateAllCID (cidDisplay,cidExport,cidLicence) = if (!(validateCID(cidDisplay)))
194196 then throw("Wrong Display CID")
195197 else if (!(validateCID(cidExport)))
196198 then throw("Wrong Export CID")
197199 else if (if ((cidLicence != ""))
198200 then !(validateCID(cidLicence))
199201 else false)
200202 then throw("Wrong Licence CID")
201203 else true
202204
203205
204206 func validateAllHash (sha256Export,sha256Licence) = if (!(validateHash(sha256Export)))
205207 then throw("Export Hash 64 char. max")
206208 else if (!(validateHash(sha256Licence)))
207209 then throw("Licence Hash 64 char. max")
208210 else true
209211
210212
211213 func validateString (str,max) = if ((size(str) == 0))
212214 then throw("Field cannot be is empty")
213215 else if ((size(str) > max))
214216 then throw((str + " is too long"))
215217 else true
216218
217219
218220 func validateUser (caller) = {
219221 let userStatus = valueOrElse(getString(userDapp, keyUserStatus(caller)), userUnregistered)
220222 if (if ((userStatus == userUnregistered))
221223 then true
222224 else (userStatus == userAllowed))
223225 then "Register this account first with \"Account\" tab"
224226 else if ((userStatus == userSuspended))
225227 then "Account suspended"
226228 else if ((userStatus == userRemoved))
227229 then "Account removed"
228230 else ""
229231 }
230232
231233
232234 func setLIcence (cidLicence,sha256Licence) = {
233235 let cid = if ((size(cidLicence) == 0))
234236 then defaultLicence
235237 else cidLicence
236238 let hash = if ((size(sha256Licence) == 0))
237239 then defaultHashLicence
238240 else sha256Licence
239241 $Tuple2(cid, hash)
240242 }
241243
242244
243245 func validateArtworkData (caller,cidDisplay,cidExport,licenceCID,sha256Export,licenceHash,name,description,tags,royalties) = {
244246 let checkUser = validateUser(caller)
245247 if ((checkUser != ""))
246248 then throw(checkUser)
247249 else if ((size(cidDisplay) == 0))
248250 then throw("Display CID cannot be empty")
249251 else if (!(validateAllCID(cidDisplay, cidExport, licenceCID)))
250252 then throw("Problem with CID")
251253 else if (!(validateAllHash(sha256Export, licenceHash)))
252254 then throw("Problem with Hashes")
253255 else if (!(validateString(name, 100)))
254256 then throw("100 Char. max name")
255257 else if (!(validateString(description, 1000)))
256258 then throw("1000 Char. max description")
257259 else if (if ((0 > royalties))
258260 then true
259261 else (royalties > 1000))
260262 then throw("Royalties cannot be less than 0% or higher than 10%")
261263 else if ((size(split(tags, ",")) > 5))
262264 then throw("5 tags max.")
263265 else ""
264266 }
265267
266268
267269 func isPayment (i) = if ((size(i.payments) == 0))
268270 then throw("No payment attached")
269271 else {
270272 let payment = value(i.payments[0])
271273 let amount = value(payment.amount)
272274 $Tuple2(payment, amount)
273275 }
274276
275277
276278 func validatePayment (i) = {
277- let $t01015610192 = isPayment(i)
278- let payment = $t01015610192._1
279- let amount = $t01015610192._2
279+ let $t01023410270 = isPayment(i)
280+ let payment = $t01023410270._1
281+ let amount = $t01023410270._2
280282 let assetId = if (if (isDefined(payment.assetId))
281283 then (payment.assetId == artAssetId)
282284 else false)
283285 then payment.assetId
284286 else throw("Only SIGN token accepted as transaction fee")
285287 if ((amount != (currentCertificationPrice * 2)))
286288 then throw(("Payment amount should be " + toString((currentCertificationPrice * 2))))
287289 else $Tuple2(amount, assetId)
288290 }
289291
290292
291293 func isArtMinted (addrToUse,artId) = match getInteger(this, keyIssued(addrToUse, artId)) {
292294 case b: Int =>
293295 if ((b != 0))
294296 then true
295297 else false
296298 case _ =>
297299 false
298300 }
299301
300302
301303 func validatePriceAssetId (i,priceAssetId,artworkPrice) = {
302- let $t01078910825 = isPayment(i)
303- let payment = $t01078910825._1
304- let amount = $t01078910825._2
304+ let $t01086710903 = isPayment(i)
305+ let payment = $t01086710903._1
306+ let amount = $t01086710903._2
305307 let assetId = if (!(isDefined(payment.assetId)))
306308 then unit
307309 else if (if ((size(priceAssetId) > 0))
308310 then (toBase58String(value(payment.assetId)) == priceAssetId)
309311 else false)
310312 then payment.assetId
311313 else throw("Wrong asset id")
312314 if (if ((assetId == unit))
313315 then (priceAssetId != "")
314316 else false)
315317 then throw("Wrong asset id")
316318 else if ((artworkPrice != amount))
317319 then throw("Payment don't match")
318320 else $Tuple2(amount, assetId)
319321 }
320322
321323
322324 func acceptedAssetIds (assetId) = if (!(containsElement(all_accepted_assets, assetId)))
323325 then throw("Only $ART, USDT-PP, USDC-PP, EAST, PUZZLE, ETH or WAVES accepted")
324326 else true
325327
326328
327329 func validateMinSell (price) = if ((0 >= price))
328330 then throw("Wrong minimum sell price")
329331 else true
330332
331333
332334 func getBidAssetId (assetId) = if ((assetId == "WAVES"))
333335 then unit
334336 else fromBase58String(assetId)
335337
336338
337339 func getPriceAssetIdFromBid (bidDataKey) = {
338340 let bidData = getStringByKey((bidDataKey + "_OPEN"))
339341 if ((bidData == ""))
340342 then throw("Bid not found")
341343 else {
342344 let bidDataArr = split(bidData, "_")
343345 let bidAmount = parseIntValue(bidDataArr[1])
344346 let bidAssetId = getBidAssetId(bidDataArr[0])
345347 if ((0 >= bidAmount))
346348 then throw("Wrong amount")
347349 else $Tuple2(bidAmount, bidAssetId)
348350 }
349351 }
350352
351353
352354 func idCallerDateSponsored (i,pubKey) = if (!(dappRunning))
353355 then throw(maintenanceMSG)
354356 else {
355357 let isSponsored = if ((pubKey != ""))
356358 then valueOrElse(checkWhitelist((toString(addressFromPublicKey(fromBase58String(pubKey))) + "_free_txs")), 0)
357359 else 0
358360 let caller = if (if ((toBase58String(i.caller.bytes) == toString(this)))
359361 then (isSponsored > 0)
360362 else false)
361363 then toString(addressFromPublicKey(fromBase58String(pubKey)))
362364 else toBase58String(i.caller.bytes)
363365 let get_sponsored_waves = if (if ((pubKey != ""))
364366 then (isSponsored > 0)
365367 else false)
366368 then invoke(whitelistDapp, "useFreeTx", [toString(addressFromPublicKey(fromBase58String(pubKey)))], nil)
367369 else unit
368370 if ((get_sponsored_waves == get_sponsored_waves))
369371 then $Tuple4(toBase58String(i.transactionId), caller, lastBlock.timestamp, (isSponsored > 0))
370372 else throw("Strict value is not equal to itself.")
371373 }
372374
373375
374376 func idCallerDate (i) = if (!(dappRunning))
375377 then throw(maintenanceMSG)
376378 else $Tuple3(toBase58String(i.transactionId), toBase58String(i.caller.bytes), lastBlock.timestamp)
377379
378380
379381 func getBalance (assetId) = match assetId {
380382 case b: ByteVector =>
381383 assetBalance(this, b)
382384 case _ =>
383385 wavesBalance(this).available
384386 }
385387
386388
387389 func buyMint (i,artId,issuer,bidId,bidOwner,pubKey) = {
388- let $t01343013519 = idCallerDateSponsored(i, pubKey)
389- let id = $t01343013519._1
390- let caller = $t01343013519._2
391- let date = $t01343013519._3
392- let isSponsored = $t01343013519._4
390+ let $t01350813597 = idCallerDateSponsored(i, pubKey)
391+ let id = $t01350813597._1
392+ let caller = $t01350813597._2
393+ let date = $t01350813597._3
394+ let isSponsored = $t01350813597._4
393395 let isBid = if (if (if ((caller == issuer))
394396 then (bidOwner != "")
395397 else false)
396398 then (bidId != "")
397399 else false)
398400 then true
399401 else false
400402 if (if (isBid)
401403 then (caller != issuer)
402404 else false)
403405 then throw("You cannot do this action")
404406 else {
405407 let blockEnd = getIntegerByKey(keyEndSale(caller, artId))
406408 if (if (if ((blockEnd != 0))
407409 then (height >= blockEnd)
408410 else false)
409411 then !(isBid)
410412 else false)
411413 then throw("Sale ended.")
412414 else {
413415 let callerIsIssuer = (caller == issuer)
414416 let totalNFT = getIntegerByKey("total_nft_issued")
415417 let artworkName = getStringByKey(keyName(issuer, artId))
416418 if ((artworkName == ""))
417419 then throw("Art doesn't exist")
418420 else {
419421 let isOnSale = getBooleanByKey(keyOnSale(issuer, artId))
420422 let amountSold = getIntegerByKey(keyIssued(issuer, artId))
421423 let artworkPrice = if (callerIsIssuer)
422424 then mint_fee
423425 else getIntegerByKey(keyPrice(issuer, artId))
424426 let priceAssetId = if (callerIsIssuer)
425427 then toBase58String(artAssetId)
426428 else getStringByKey(keyAssetIdAccepted(issuer, artId))
427429 let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
428430 if (if (if (!(isBid))
429431 then !(callerIsIssuer)
430432 else false)
431433 then if (if ((0 >= artworkPrice))
432434 then true
433435 else !(isOnSale))
434436 then true
435437 else (0 >= maxCanSell)
436438 else false)
437439 then throw("Art not for sale")
438440 else if (if (if (!(isBid))
439441 then callerIsIssuer
440442 else false)
441443 then (0 >= maxCanSell)
442444 else false)
443445 then throw("Max issuable not set")
444446 else {
445447 let checkUser = validateUser(issuer)
446448 if (if (isBid)
447449 then (checkUser != "")
448450 else false)
449451 then throw(checkUser)
450452 else {
451453 let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
452- let $t01509615288 = if (isBid)
454+ let $t01517415366 = if (isBid)
453455 then getPriceAssetIdFromBid(bidDataKey)
454456 else validatePriceAssetId(i, priceAssetId, artworkPrice)
455- let amount = $t01509615288._1
456- let assetId = $t01509615288._2
457+ let amount = $t01517415366._1
458+ let assetId = $t01517415366._2
457459 let agent = valueOrElse(getString(userDapp, keyArtistAgentAddr(issuer)), feeReceiver)
458460 let agentShare = valueOrElse(getInteger(userDapp, keyPrimaryShareAgent(issuer)), 0)
459461 let publicAgent = valueOrElse(getString(userDapp, keyArtistPublicAgentAddr(issuer)), feeReceiver)
460462 let publicAgentShare = valueOrElse(getInteger(userDapp, keyPrimarySharePublicAgent(issuer)), 0)
461463 let isWhitelisted = checkWhitelist(issuer)
462464 let amountForSign = fraction(amount, commission_fee, 100)
463465 let amountForAgent = if (if (if ((agent != feeReceiver))
464466 then (agentShare > 0)
465467 else false)
466468 then (height > isWhitelisted)
467469 else false)
468470 then fraction(amount, agentShare, 10000)
469471 else 0
470472 let amountForPublicAgent = if (if (if ((publicAgent != feeReceiver))
471473 then (publicAgentShare > 0)
472474 else false)
473475 then (height > isWhitelisted)
474476 else false)
475477 then fraction(amount, publicAgentShare, 10000)
476478 else 0
477479 let amountForCreator = (amount - amountForSign)
478480 if ((amountSold == maxCanSell))
479481 then throw("Art sold out")
480482 else {
481483 let newAmountSold = (amountSold + 1)
482484 let issueMeta = ((((((((("Creator: " + issuer) + ",
483485 ArtID: ") + artId) + ",
484486 Artwork name: ") + artworkName) + ",
485487 Issue: ") + toString(newAmountSold)) + "/") + toString(maxCanSell))
486488 let issueNFT = Issue(("SA_" + toString((totalNFT + 1))), issueMeta, 1, 0, false)
487489 let idNFT = calculateAssetId(issueNFT)
488490 let sellStatus = if (if ((newAmountSold == maxCanSell))
489491 then true
490492 else !(isOnSale))
491493 then false
492494 else true
493495 let receiveNFT = if (if (if ((caller == issuer))
494496 then (bidOwner != "")
495497 else false)
496498 then (bidId != "")
497499 else false)
498500 then addressFromStringValue(bidOwner)
499501 else i.caller
500502 let assetIdBid = if (!(isDefined(assetId)))
501503 then "WAVES"
502504 else toBase58String(value(assetId))
503505 let bidData = getStringByKey((bidDataKey + "_OPEN"))
504506 let bidDelOld = DeleteEntry((bidDataKey + "_OPEN"))
505507 let bidUpdate = StringEntry((bidDataKey + "_CLOSED"), ((bidData + "_") + toString(date)))
506508 let soldKey = ((((((("art_sold_" + toString(newAmountSold)) + "_of_") + toString(maxCanSell)) + "_") + artId) + "_") + issuer)
507509 let soldValue = if (!(isBid))
508510 then ((((((((((caller + "_") + toString(date)) + "_") + id) + "_") + toString(artworkPrice)) + "_") + priceAssetId) + "_") + toBase58String(idNFT))
509511 else ((((((((((toString(receiveNFT) + "_") + toString(date)) + "_") + id) + "_") + toString(amount)) + "_") + assetIdBid) + "_") + toBase58String(idNFT))
510512 let soldData = StringEntry(soldKey, soldValue)
511513 let amount_commission_for_sign_to_swap = if ((amountForAgent != 0))
512514 then (amountForSign - amountForAgent)
513515 else amountForSign
514516 let amount_art_before = getBalance(artAssetId)
515517 if ((amount_art_before == amount_art_before))
516518 then {
517519 let swap_fee_to_art = if ((assetId != artAssetId))
518520 then invoke(Address(fromBase58String(puzzle_art_pool)), "swap", [artAssetId_str, 1], [AttachedPayment(assetId, amount_commission_for_sign_to_swap)])
519521 else unit
520522 if ((swap_fee_to_art == swap_fee_to_art))
521523 then {
522524 let amount_art_after = getBalance(artAssetId)
523525 if ((amount_art_after == amount_art_after))
524526 then {
525527 let commissionsWithAgent = if ((amountForAgent != 0))
526528 then [ScriptTransfer(Address(fromBase58String(feeReceiver)), if ((assetId == artAssetId))
527529 then (amountForSign - amountForAgent)
528530 else (amount_art_after - amount_art_before), artAssetId), ScriptTransfer(Address(fromBase58String(agent)), amountForAgent, assetId)]
529531 else [ScriptTransfer(Address(fromBase58String(feeReceiver)), if ((assetId == artAssetId))
530532 then amountForSign
531533 else (amount_art_after - amount_art_before), artAssetId)]
532534 let commissionsWithPublicAgent = if ((amountForPublicAgent != 0))
533535 then [ScriptTransfer(Address(fromBase58String(publicAgent)), amountForPublicAgent, assetId), ScriptTransfer(Address(fromBase58String(issuer)), (amountForCreator - amountForPublicAgent), assetId)]
534536 else [ScriptTransfer(Address(fromBase58String(issuer)), amountForCreator, assetId)]
535537 let txToCaller = if (isSponsored)
536538 then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
537539 else nil
538540 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)
539541 if (isBid)
540542 then [soldData, bidUpdate, bidDelOld] :: buyRes
541543 else soldData :: buyRes
542544 }
543545 else throw("Strict value is not equal to itself.")
544546 }
545547 else throw("Strict value is not equal to itself.")
546548 }
547549 else throw("Strict value is not equal to itself.")
548550 }
549551 }
550552 }
551553 }
552554 }
553555 }
554556 }
555557
556558
557559 func asString (bv) = match bv {
558560 case bv0: String =>
559561 bv0
560562 case _ =>
561563 throw("Sponsored Public Key String expected")
562564 }
563565
564566
565567 @Callable(invoke)
566568 func setConf (key,val) = {
567569 let caller = toString(invoke.caller)
568570 if (containsElement([chris, toString(this)], caller))
569571 then if (contains(key, "conf_"))
570572 then [StringEntry(key, val)]
571573 else throw("Entries starting with conf_ only")
572574 else throw("You are not allowed to change this")
573575 }
574576
575577
576578
577579 @Callable(i)
578580 func addArtwork (name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = {
579- let $t02155421627 = idCallerDateSponsored(i, pubKey)
580- let artId = $t02155421627._1
581- let caller = $t02155421627._2
582- let date = $t02155421627._3
583- let isSponsored = $t02155421627._4
584- let $t02163721706 = setLIcence(cidLicence, sha256Licence)
585- let licenceCID = $t02163721706._1
586- let licenceHash = $t02163721706._2
581+ let $t02163221705 = idCallerDateSponsored(i, pubKey)
582+ let artId = $t02163221705._1
583+ let caller = $t02163221705._2
584+ let date = $t02163221705._3
585+ let isSponsored = $t02163221705._4
586+ let $t02171521784 = setLIcence(cidLicence, sha256Licence)
587+ let licenceCID = $t02171521784._1
588+ let licenceHash = $t02171521784._2
587589 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
588590 if ((validateArtwork != ""))
589591 then throw("Something went wrong!")
590592 else {
591593 let whitelisted_drop = (checkWhitelist((caller + "_free_drops")) > 0)
592- let $t02200522093 = if (whitelisted_drop)
594+ let $t02208322171 = if (whitelisted_drop)
593595 then $Tuple2(0, artAssetId)
594596 else validatePayment(i)
595- let amount = $t02200522093._1
596- let assetId = $t02200522093._2
597+ let amount = $t02208322171._1
598+ let assetId = $t02208322171._2
597599 if (!(isDefined(amount)))
598600 then throw("Something went wrong")
599601 else {
600602 let decrease_whitelist_drop = if (whitelisted_drop)
601603 then invoke(whitelistDapp, "useFreeDrop", [caller], nil)
602604 else unit
603605 if ((decrease_whitelist_drop == decrease_whitelist_drop))
604606 then {
605607 let txToCaller = if (isSponsored)
606608 then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
607609 else nil
608- ([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, artAssetId)] ++ txToCaller)
610+ ([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)
609611 }
610612 else throw("Strict value is not equal to itself.")
611613 }
612614 }
613615 }
614616
615617
616618
617619 @Callable(i)
618620 func updateArtwork (txid,name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = if (!(dappRunning))
619621 then throw(maintenanceMSG)
620622 else {
621- let $t02400824078 = idCallerDateSponsored(i, pubKey)
622- let id = $t02400824078._1
623- let caller = $t02400824078._2
624- let date = $t02400824078._3
625- let isSponsored = $t02400824078._4
626- let $t02408824157 = setLIcence(cidLicence, sha256Licence)
627- let licenceCID = $t02408824157._1
628- let licenceHash = $t02408824157._2
623+ let $t02415024220 = idCallerDateSponsored(i, pubKey)
624+ let id = $t02415024220._1
625+ let caller = $t02415024220._2
626+ let date = $t02415024220._3
627+ let isSponsored = $t02415024220._4
628+ let $t02423024299 = setLIcence(cidLicence, sha256Licence)
629+ let licenceCID = $t02423024299._1
630+ let licenceHash = $t02423024299._2
629631 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
630632 if ((validateArtwork != ""))
631633 then throw("Something went wrong!")
632634 else {
633635 let entryExist = getStringByKey(keyName(caller, txid))
634636 if ((entryExist == ""))
635637 then throw("Entry not found")
636638 else {
637639 let flag = getStringByKey(keyFlag(caller, txid))
638640 if ((flag == "ILLEGAL"))
639641 then throw("Cannot update ILLEGAL artwork")
640642 else if (!(isArtMinted(caller, txid)))
641643 then {
642644 let txToCaller = if (isSponsored)
643645 then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
644646 else nil
645647 ([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)
646648 }
647649 else throw("Already minted")
648650 }
649651 }
650652 }
651653
652654
653655
654656 @Callable(i)
655657 func flagArtwork (artId,addr,flag,note) = {
656- let $t02578425818 = idCallerDate(i)
657- let id = $t02578425818._1
658- let caller = $t02578425818._2
658+ let $t02592625960 = idCallerDate(i)
659+ let id = $t02592625960._1
660+ let caller = $t02592625960._2
659661 if (containsElement([chris, toString(this)], caller))
660662 then if (containsElement(["CONSENT", "", "CHANGE_REQUIRED", "FLAGGED", "ILLEGAL"], flag))
661663 then [StringEntry(keyFlag(addr, artId), flag), StringEntry(keyNote(addr, artId), note)]
662664 else throw(("Unknow status " + flag))
663665 else throw("You are not allowed")
664666 }
665667
666668
667669
668670 @Callable(i)
669671 func deleteArtwork (artId,addr) = {
670- let $t02625426288 = idCallerDate(i)
671- let id = $t02625426288._1
672- let caller = $t02625426288._2
672+ let $t02639626430 = idCallerDate(i)
673+ let id = $t02639626430._1
674+ let caller = $t02639626430._2
673675 let addrToUse = if (containsElement([chris, toString(this)], caller))
674676 then addr
675677 else caller
676678 let entryExist = valueOrErrorMessage(getStringByKey(keyName(addrToUse, artId)), "No art matching for this address")
677679 if ((entryExist == ""))
678680 then throw("No art matching for this address")
679681 else {
680682 let sha256Hash = getStringByKey(keyHashByTxidAddr(addrToUse, artId))
681683 let signID = if ((sha256Hash != ""))
682684 then getStringByKey(keySignID(addrToUse, artId))
683685 else ""
684686 let signID_legacy = if ((signID == ""))
685687 then nil
686688 else [DeleteEntry(keyidBySignid(addrToUse, signID))]
687689 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)
688690 if (!(isArtMinted(addrToUse, artId)))
689691 then if (!(dappRunning))
690692 then throw(maintenanceMSG)
691693 else dataToDelete
692694 else if (containsElement([chris, toString(this)], caller))
693695 then dataToDelete
694696 else throw("Art already minted, you cannot delete it")
695697 }
696698 }
697699
698700
699701
700702 @Callable(i)
701703 func sellArtwork (artId,price,maxMint,assetId,blockEnd,pubKey) = {
702- let $t02906729137 = idCallerDateSponsored(i, pubKey)
703- let id = $t02906729137._1
704- let caller = $t02906729137._2
705- let date = $t02906729137._3
706- let isSponsored = $t02906729137._4
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
707709 let artworkName = getStringByKey(keyName(caller, artId))
708710 if ((artworkName == ""))
709711 then throw("This art doesn't match your account")
710712 else {
711713 let flag = getStringByKey(keyFlag(caller, artId))
712714 if (containsElement(["CHANGE_REQUIRED", "FLAGGED", "ILLEGAL"], flag))
713715 then throw("Flagged artwork")
714716 else {
715717 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
716718 if ((0 > blockEnd))
717719 then throw("Negative end")
718720 else if (if ((blockEnd > 0))
719721 then if ((maxMint != 1))
720722 then true
721723 else (price != 0)
722724 else false)
723725 then throw("Timed offer only allowed for unique edition and offer only")
724726 else {
725727 let baseHeight = if ((blockEnd == 0))
726728 then 0
727729 else height
728730 if (!(acceptedAssetIds(assetId)))
729731 then throw("Something went wrong!")
730732 else if (!(validateMinSell(price)))
731733 then throw("Something went wrong!")
732734 else {
733735 let checkUser = validateUser(caller)
734736 if ((checkUser != ""))
735737 then throw(checkUser)
736738 else {
737739 let amountSold = getIntegerByKey(keyIssued(caller, artId))
738740 let maxCanSell = getIntegerByKey(keyMaxMint(caller, artId))
739741 if ((maxMint > 100))
740742 then throw("100 editions max per artwork")
741743 else if (if ((amountSold != 0))
742744 then (amountSold == maxCanSell)
743745 else false)
744746 then throw("Max edition reached.")
745747 else if (if ((amountSold > 0))
746748 then (maxCanSell != maxMint)
747749 else false)
748750 then throw("Cannot change maximum issuable anymore")
749751 else if (if ((bidNbr > 0))
750752 then (maxCanSell != maxMint)
751753 else false)
752754 then throw("Cannot change maximum issuable with active orders")
753755 else {
754756 let sellStatus = if (if ((price > 0))
755757 then (maxMint > 0)
756758 else false)
757759 then true
758760 else false
759761 let txToCaller = if (isSponsored)
760762 then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
761763 else nil
762764 ([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)
763765 }
764766 }
765767 }
766768 }
767769 }
768770 }
769771 }
770772
771773
772774
773775 @Callable(i)
774776 func buyArtwork (artId,issuer) = buyMint(i, artId, issuer, "", "", "")
775777
776778
777779
778780 @Callable(i)
779781 func setBid (artId,issuer) = {
780- let $t03151031550 = idCallerDate(i)
781- let id = $t03151031550._1
782- let caller = $t03151031550._2
783- let date = $t03151031550._3
784- let $t03155531591 = isPayment(i)
785- let payment = $t03155531591._1
786- let amount = $t03155531591._2
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
787789 let assetId = if (!(isDefined(payment.assetId)))
788790 then "WAVES"
789791 else toBase58String(value(payment.assetId))
790792 let blockEnd = getIntegerByKey(keyEndSale(issuer, artId))
791793 if (if ((blockEnd != 0))
792794 then (height >= blockEnd)
793795 else false)
794796 then throw("Sale ended.")
795797 else {
796798 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
797799 if (!(acceptedAssetIds(assetId)))
798800 then throw("asset not accepted")
799801 else if (!(validateMinSell(amount)))
800802 then throw("Wrong min sell")
801803 else {
802804 let amountSold = getIntegerByKey(keyIssued(issuer, artId))
803805 let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
804806 if ((0 >= maxCanSell))
805807 then throw("No max edition set for this artwork")
806808 else if ((amountSold >= maxCanSell))
807809 then throw("Sold out, you cannot bid")
808810 else [StringEntry((((((((("bid_" + artId) + "_") + issuer) + "_") + caller) + "_") + id) + "_OPEN"), ((((assetId + "_") + toString(amount)) + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr + 1))]
809811 }
810812 }
811813 }
812814
813815
814816
815817 @Callable(i)
816818 func acceptBid (artId,issuer,bidId,bidOwner,pubKey) = buyMint(i, artId, issuer, bidId, bidOwner, pubKey)
817819
818820
819821
820822 @Callable(i)
821823 func cancelBid (artId,issuer,bidId,bidOwner) = {
822- let $t03291532976 = idCallerDate(i)
823- let id = $t03291532976._1
824- let caller = $t03291532976._2
825- let date = $t03291532976._3
824+ let $t03305733118 = idCallerDate(i)
825+ let id = $t03305733118._1
826+ let caller = $t03305733118._2
827+ let date = $t03305733118._3
826828 if (if ((caller != bidOwner))
827829 then (caller != issuer)
828830 else false)
829831 then throw("You cannot do this action")
830832 else {
831833 let returnMoneyTo = if ((caller == issuer))
832834 then bidOwner
833835 else caller
834836 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
835837 let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
836838 let bidData = getStringByKey((bidDataKey + "_OPEN"))
837839 if ((bidData == ""))
838840 then throw("Bid not found")
839841 else {
840842 let bidDataArr = split(bidData, "_")
841843 let assetId = getBidAssetId(bidDataArr[0])
842844 let bidStatus = "CANCELED"
843845 [DeleteEntry((bidDataKey + "_OPEN")), StringEntry(((bidDataKey + "_") + bidStatus), ((bidData + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr - 1)), ScriptTransfer(Address(fromBase58String(returnMoneyTo)), parseIntValue(bidDataArr[1]), assetId)]
844846 }
845847 }
846848 }
847849
848850
849851 @Verifier(tx)
850852 func verifier () = match tx {
851853 case inv: InvokeScriptTransaction =>
852854 if (if (if (if ((inv.function == "addArtwork"))
853855 then (inv.dApp == this)
854856 else false)
855857 then (inv.fee == 500000)
856858 else false)
857859 then (inv.feeAssetId == unit)
858860 else false)
859861 then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[11])))
860862 else if (if (if (if ((inv.function == "updateArtwork"))
861863 then (inv.dApp == this)
862864 else false)
863865 then (inv.fee == 500000)
864866 else false)
865867 then (inv.feeAssetId == unit)
866868 else false)
867869 then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[12])))
868870 else if (if (if (if ((inv.function == "sellArtwork"))
869871 then (inv.dApp == this)
870872 else false)
871873 then (inv.fee == 500000)
872874 else false)
873875 then (inv.feeAssetId == unit)
874876 else false)
875877 then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[5])))
876878 else if (if (if (if ((inv.function == "acceptBid"))
877879 then (inv.dApp == this)
878880 else false)
879881 then (inv.fee == 500000)
880882 else false)
881883 then (inv.feeAssetId == unit)
882884 else false)
883885 then sigVerify_128Kb(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[4])))
884886 else sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
885887 case _ =>
886888 sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
887889 }
888890

github/deemru/w8io/3ef1775 
201.72 ms