tx · GEPk3fsgfxh3dpYm2pm3AnEw26hq1CTHyUVTL2E7Gky

3NBynfbXC2KastUxhukcMUaE58K9cBdB9UY:  -0.02600000 Waves

2023.10.11 06:39 [2793434] smart account 3NBynfbXC2KastUxhukcMUaE58K9cBdB9UY > SELF 0.00000000 Waves

{ "type": 13, "id": "GEPk3fsgfxh3dpYm2pm3AnEw26hq1CTHyUVTL2E7Gky", "fee": 2600000, "feeAssetId": null, "timestamp": 1696995658829, "version": 2, "chainId": 84, "sender": "3NBynfbXC2KastUxhukcMUaE58K9cBdB9UY", "senderPublicKey": "J9DCtJJxJBWZdtDR12BA1U94Q3cZzMi4R6k5hYkAzmzC", "proofs": [ "5CvAT2uZx3gKkuKdWEB9SA8XSpompeEGGb5dahqnZJTL4kVzbSnQbyHmv39SZvfCxFZFYh7SqFPoF5ovLxekoGoy" ], "script": "base64:BgJeCAISBAoCCAgSDgoMCAgICAgICAgICAEIEg8KDQgICAgICAgICAgIAQgSBgoECAgICBIECgIICBIICgYIAQEIAQgSBAoCCAgSBAoCCAgSBwoFCAgICAgSBgoECAgICFsAB1ZFUlNJT04CBTIuMC4wAQ5nZXRTdHJpbmdCeUtleQEDa2V5CQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMFA2tleQIAAAh1bml0VGVzdAcACW9yYWNsZUZlZQkBBXZhbHVlAQkApggBCQEOZ2V0U3RyaW5nQnlLZXkBAg9jb25mX29yYWNsZV9mZWUACHNpZ25EYXBwCQEFdmFsdWUBCQCmCAEJAQ5nZXRTdHJpbmdCeUtleQECEWNvbmZfc2lnbndlYl9kYXBwAAtmZWVSZWNlaXZlcgkBDmdldFN0cmluZ0J5S2V5AQIRY29uZl9mZWVfcmVjZWl2ZXIACHVzZXJEYXBwAwUIdW5pdFRlc3QJAQV2YWx1ZQEJAKYIAQIjM010NFJHTUV5alNXWUFvY1RQcWQ1NXdkSFFRQjNQVTJVQ20JAQV2YWx1ZQEJAKYIAQkBDmdldFN0cmluZ0J5S2V5AQIPY29uZl91c2Vyc19kYXBwAA13aGl0ZWxpc3REYXBwCQEFdmFsdWUBCQCmCAEJAQ5nZXRTdHJpbmdCeUtleQECE2NvbmZfd2hpdGVsaXN0X2RhcHAAD3B1enpsZV9hcnRfcG9vbAkBDmdldFN0cmluZ0J5S2V5AQIUY29uZl9wdXp6bGVfYXJ0X3Bvb2wAEXVzZHRQUEFzc2V0SWRfc3RyCQEOZ2V0U3RyaW5nQnlLZXkBAhtjb25mX2FjY2VwdGVkX2Fzc2V0X1VTRFRfUFAADmFydEFzc2V0SWRfc3RyCQEOZ2V0U3RyaW5nQnlLZXkBAhdjb25mX2FjY2VwdGVkX2Fzc2V0X0FSVAARdXNkY1BQQXNzZXRJZF9zdHIJAQ5nZXRTdHJpbmdCeUtleQECG2NvbmZfYWNjZXB0ZWRfYXNzZXRfVVNEQ19QUAAPZWFzdEFzc2V0SWRfc3RyCQEOZ2V0U3RyaW5nQnlLZXkBAhhjb25mX2FjY2VwdGVkX2Fzc2V0X0VBU1QAEXB1enpsZUFzc2V0SWRfc3RyCQEOZ2V0U3RyaW5nQnlLZXkBAhpjb25mX2FjY2VwdGVkX2Fzc2V0X1BVWlpMRQAQZXRoUFBBc3NldElkX3N0cgkBDmdldFN0cmluZ0J5S2V5AQIaY29uZl9hY2NlcHRlZF9hc3NldF9FVEhfUFAAEHdhdmVzQXNzZXRJZF9zdHICBVdBVkVTAA11c2R0UFBBc3NldElkCQDZBAEFEXVzZHRQUEFzc2V0SWRfc3RyAAphcnRBc3NldElkCQDZBAEFDmFydEFzc2V0SWRfc3RyAA11c2RjUFBBc3NldElkCQDZBAEFEXVzZGNQUEFzc2V0SWRfc3RyAAtlYXN0QXNzZXRJZAkA2QQBBQ9lYXN0QXNzZXRJZF9zdHIADXB1enpsZUFzc2V0SWQJANkEAQURcHV6emxlQXNzZXRJZF9zdHIADGV0aFBQQXNzZXRJZAkA2QQBBRBldGhQUEFzc2V0SWRfc3RyAAx3YXZlc0Fzc2V0SWQBAAATYWxsX2FjY2VwdGVkX2Fzc2V0cwkAzAgCBRF1c2R0UFBBc3NldElkX3N0cgkAzAgCBQ5hcnRBc3NldElkX3N0cgkAzAgCBRF1c2RjUFBBc3NldElkX3N0cgkAzAgCBQ9lYXN0QXNzZXRJZF9zdHIJAMwIAgURcHV6emxlQXNzZXRJZF9zdHIJAMwIAgUQd2F2ZXNBc3NldElkX3N0cgkAzAgCBRBldGhQUEFzc2V0SWRfc3RyBQNuaWwABWNocmlzCQEOZ2V0U3RyaW5nQnlLZXkBAgxjb25mX2FkbWluXzEBGWdldEludGVnZXJCeUtleUZyb21PcmFjbGUBA2tleQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFCW9yYWNsZUZlZQUDa2V5Ah9JbnRlZ2VyIHVuZGVmaW5lIG9yIDAgaW4gb3JhY2xlAQ9nZXRJbnRlZ2VyQnlLZXkBA2tleQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQNrZXkAAAEOY2hlY2tXaGl0ZWxpc3QBA2tleQkBC3ZhbHVlT3JFbHNlAgkAmggCBQ13aGl0ZWxpc3REYXBwBQNrZXkAAAEPZ2V0Qm9vbGVhbkJ5S2V5AQNrZXkJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwUDa2V5BwAOY29tbWlzc2lvbl9mZWUACAAOZGVmYXVsdExpY2VuY2UJAQ5nZXRTdHJpbmdCeUtleQECFGNvbmZfZGVmYXVsdF9saWNlbmNlABJkZWZhdWx0SGFzaExpY2VuY2UJAQ5nZXRTdHJpbmdCeUtleQECGWNvbmZfZGVmYXVsdF9saWNlbmNlX2hhc2gAC2RhcHBSdW5uaW5nCQELdmFsdWVPckVsc2UCCQCbCAIFCHVzZXJEYXBwAhRjb25mX2RhcHBfaXNfcnVubmluZwYADm1haW50ZW5hbmNlTVNHCQELdmFsdWVPckVsc2UCCQCdCAIFCHVzZXJEYXBwAhRjb25mX21haW50ZW5hbmNlX21zZwIAAA11c2VyU3VzcGVuZGVkAglTVVNQRU5ERUQAC3VzZXJSZW1vdmVkAgdSRU1PVkVEABB1c2VyVW5yZWdpc3RlcmVkAgxVTlJFR0lTVEVSRUQAC3VzZXJBbGxvd2VkAgdBTExPV0VEABljdXJyZW50Q2VydGlmaWNhdGlvblByaWNlCQEZZ2V0SW50ZWdlckJ5S2V5RnJvbU9yYWNsZQEJAKwCAgISY2VydGlmaWNhdGlvbl9mZWVfCQDYBAEFCmFydEFzc2V0SWQACG1pbnRfZmVlCQEZZ2V0SW50ZWdlckJ5S2V5RnJvbU9yYWNsZQEJAKwCAgIJbWludF9mZWVfCQDYBAEFCmFydEFzc2V0SWQBE2dldEFydHdvcmtSb3lhbHRpZXMBA2tleQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQNrZXkA6AcBC3ZhbGlkYXRlQ0lEAQNjaWQDCQEIY29udGFpbnMCBQNjaWQCAS8DAwkAZgIATAkAsQIBBQNjaWQJAAACCQCxAgEJAJEDAgkAtQkCBQNjaWQCAS8AAAA7BwkAZgIAEAkAsQIBCQCRAwIJALUJAgUDY2lkAgEvAAEHBwEMdmFsaWRhdGVIYXNoAQRoYXNoCQAAAgkAsQIBBQRoYXNoAEABDWtleVVzZXJTdGF0dXMBBmNhbGxlcgkArAICAgx1c2VyX3N0YXR1c18FBmNhbGxlcgEHa2V5RGF0ZQIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAglhcnRfZGF0ZV8FBWFydElkAgFfBQZjYWxsZXIBB2tleU5hbWUCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIJYXJ0X25hbWVfBQVhcnRJZAIBXwUGY2FsbGVyAQdrZXlEZXNjAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICCWFydF9kZXNjXwUFYXJ0SWQCAV8FBmNhbGxlcgENa2V5RGlzcGxheUNpZAIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAhBhcnRfZGlzcGxheV9jaWRfBQVhcnRJZAIBXwUGY2FsbGVyAQ1rZXlFeHBvcnRIYXNoAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICEGFydF9leHBvcnRfaGFzaF8FBWFydElkAgFfBQZjYWxsZXIBDGtleUV4cG9ydENpZAIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAg9hcnRfZXhwb3J0X2NpZF8FBWFydElkAgFfBQZjYWxsZXIBCmtleU1heE1pbnQCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIMYXJ0X21heG1pbnRfBQVhcnRJZAIBXwUGY2FsbGVyAQlrZXlTaWduSUQCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgILYXJ0X3NpZ25pZF8FBWFydElkAgFfBQZjYWxsZXIBCWtleUlzc3VlZAIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAgthcnRfaXNzdWVkXwUFYXJ0SWQCAV8FBmNhbGxlcgEJa2V5T25TYWxlAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICC2FydF9vbnNhbGVfBQVhcnRJZAIBXwUGY2FsbGVyAQ5rZXlMaWNlbmNlSGFzaAIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAhFhcnRfbGljZW5jZV9oYXNoXwUFYXJ0SWQCAV8FBmNhbGxlcgENa2V5TGljZW5jZUNpZAIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAhBhcnRfbGljZW5jZV9jaWRfBQVhcnRJZAIBXwUGY2FsbGVyAQdrZXlUYWdzAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICCWFydF90YWdzXwUFYXJ0SWQCAV8FBmNhbGxlcgEHa2V5VHlwZQIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAglhcnRfdHlwZV8FBWFydElkAgFfBQZjYWxsZXIBB2tleU5vdGUCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIJYXJ0X25vdGVfBQVhcnRJZAIBXwUGY2FsbGVyAQprZXlDcmF3bGVyAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICEGFydF9jcmF3bGVyX2NpZF8FBWFydElkAgFfBQZjYWxsZXIBDGtleVJveWFsdGllcwIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAg5hcnRfcm95YWx0aWVzXwUFYXJ0SWQCAV8FBmNhbGxlcgEIa2V5UHJpY2UCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIKYXJ0X3ByaWNlXwUFYXJ0SWQCAV8FBmNhbGxlcgEKa2V5RW5kU2FsZQIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAgxhcnRfZW5kc2FsZV8FBWFydElkAgFfBQZjYWxsZXIBEmtleUFzc2V0SWRBY2NlcHRlZAIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAhJhcnRfYXNzZXRBY2NlcHRlZF8FBWFydElkAgFfBQZjYWxsZXIBB2tleUZsYWcCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIJYXJ0X2ZsYWdfBQVhcnRJZAIBXwUGY2FsbGVyARJrZXlBcnRpc3RBZ2VudEFkZHIBCmFydGlzdEFkZHIJAKwCAgINYXJ0aXN0X2FnZW50XwUKYXJ0aXN0QWRkcgEUa2V5UHJpbWFyeVNoYXJlQWdlbnQBCmFydGlzdEFkZHIJAKwCAgIVYXJ0aXN0X2FnZW50X3ByaW1hcnlfBQphcnRpc3RBZGRyARhrZXlBcnRpc3RQdWJsaWNBZ2VudEFkZHIBCmFydGlzdEFkZHIJAKwCAgIUYXJ0aXN0X3B1YmxpY19hZ2VudF8FCmFydGlzdEFkZHIBGmtleVByaW1hcnlTaGFyZVB1YmxpY0FnZW50AQphcnRpc3RBZGRyCQCsAgICHGFydGlzdF9wdWJsaWNfYWdlbnRfcHJpbWFyeV8FCmFydGlzdEFkZHIBEWtleUhhc2hCeVR4aWRBZGRyAgZjYWxsZXIEdHhpZAkArAICCQCsAgIJAKwCAgITZ2V0X2hhc2hieXR4aWRhZGRyXwUEdHhpZAIBXwUGY2FsbGVyAQ5rZXlPd25lckJ5SGFzaAEKc2hhMjU2SGFzaAkArAICAhJnZXRfb3duZXJfYnlfaGFzaF8FCnNoYTI1Nkhhc2gBDWtleWlkQnlTaWduaWQCBmNhbGxlcgZzaWduSWQJAKwCAgkArAICCQCsAgICEmdldF9hcnRpZGJ5c2lnbmlkXwUGc2lnbklkAgFfBQZjYWxsZXIBDnZhbGlkYXRlQWxsQ0lEAwpjaWREaXNwbGF5CWNpZEV4cG9ydApjaWRMaWNlbmNlAwkBASEBCQELdmFsaWRhdGVDSUQBBQpjaWREaXNwbGF5CQACAQIRV3JvbmcgRGlzcGxheSBDSUQDCQEBIQEJAQt2YWxpZGF0ZUNJRAEFCWNpZEV4cG9ydAkAAgECEFdyb25nIEV4cG9ydCBDSUQDAwkBAiE9AgUKY2lkTGljZW5jZQIACQEBIQEJAQt2YWxpZGF0ZUNJRAEFCmNpZExpY2VuY2UHCQACAQIRV3JvbmcgTGljZW5jZSBDSUQGAQ92YWxpZGF0ZUFsbEhhc2gCDHNoYTI1NkV4cG9ydA1zaGEyNTZMaWNlbmNlAwkBASEBCQEMdmFsaWRhdGVIYXNoAQUMc2hhMjU2RXhwb3J0CQACAQIYRXhwb3J0IEhhc2ggNjQgY2hhci4gbWF4AwkBASEBCQEMdmFsaWRhdGVIYXNoAQUNc2hhMjU2TGljZW5jZQkAAgECGUxpY2VuY2UgSGFzaCA2NCBjaGFyLiBtYXgGAQ52YWxpZGF0ZVN0cmluZwIDc3RyA21heAMJAAACCQCxAgEFA3N0cgAACQACAQIYRmllbGQgY2Fubm90IGJlIGlzIGVtcHR5AwkAZgIJALECAQUDc3RyBQNtYXgJAAIBCQCsAgIFA3N0cgIMIGlzIHRvbyBsb25nBgEMdmFsaWRhdGVVc2VyAQZjYWxsZXIECnVzZXJTdGF0dXMJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUIdXNlckRhcHAJAQ1rZXlVc2VyU3RhdHVzAQUGY2FsbGVyBRB1c2VyVW5yZWdpc3RlcmVkAwMJAAACBQp1c2VyU3RhdHVzBRB1c2VyVW5yZWdpc3RlcmVkBgkAAAIFCnVzZXJTdGF0dXMFC3VzZXJBbGxvd2VkAi5SZWdpc3RlciB0aGlzIGFjY291bnQgZmlyc3Qgd2l0aCAiQWNjb3VudCIgdGFiAwkAAAIFCnVzZXJTdGF0dXMFDXVzZXJTdXNwZW5kZWQCEUFjY291bnQgc3VzcGVuZGVkAwkAAAIFCnVzZXJTdGF0dXMFC3VzZXJSZW1vdmVkAg9BY2NvdW50IHJlbW92ZWQCAAEKc2V0TEljZW5jZQIKY2lkTGljZW5jZQ1zaGEyNTZMaWNlbmNlBANjaWQDCQAAAgkAsQIBBQpjaWRMaWNlbmNlAAAFDmRlZmF1bHRMaWNlbmNlBQpjaWRMaWNlbmNlBARoYXNoAwkAAAIJALECAQUNc2hhMjU2TGljZW5jZQAABRJkZWZhdWx0SGFzaExpY2VuY2UFDXNoYTI1NkxpY2VuY2UJAJQKAgUDY2lkBQRoYXNoARN2YWxpZGF0ZUFydHdvcmtEYXRhCgZjYWxsZXIKY2lkRGlzcGxheQljaWRFeHBvcnQKbGljZW5jZUNJRAxzaGEyNTZFeHBvcnQLbGljZW5jZUhhc2gEbmFtZQtkZXNjcmlwdGlvbgR0YWdzCXJveWFsdGllcwQJY2hlY2tVc2VyCQEMdmFsaWRhdGVVc2VyAQUGY2FsbGVyAwkBAiE9AgUJY2hlY2tVc2VyAgAJAAIBBQljaGVja1VzZXIDCQAAAgkAsQIBBQpjaWREaXNwbGF5AAAJAAIBAhtEaXNwbGF5IENJRCBjYW5ub3QgYmUgZW1wdHkDCQEBIQEJAQ52YWxpZGF0ZUFsbENJRAMFCmNpZERpc3BsYXkFCWNpZEV4cG9ydAUKbGljZW5jZUNJRAkAAgECEFByb2JsZW0gd2l0aCBDSUQDCQEBIQEJAQ92YWxpZGF0ZUFsbEhhc2gCBQxzaGEyNTZFeHBvcnQFC2xpY2VuY2VIYXNoCQACAQITUHJvYmxlbSB3aXRoIEhhc2hlcwMJAQEhAQkBDnZhbGlkYXRlU3RyaW5nAgUEbmFtZQBkCQACAQISMTAwIENoYXIuIG1heCBuYW1lAwkBASEBCQEOdmFsaWRhdGVTdHJpbmcCBQtkZXNjcmlwdGlvbgDoBwkAAgECGjEwMDAgQ2hhci4gbWF4IGRlc2NyaXB0aW9uAwMJAGYCAAAFCXJveWFsdGllcwYJAGYCBQlyb3lhbHRpZXMA6AcJAAIBAjNSb3lhbHRpZXMgY2Fubm90IGJlIGxlc3MgdGhhbiAwJSBvciBoaWdoZXIgdGhhbiAxMCUDCQBmAgkAkAMBCQC1CQIFBHRhZ3MCASwABQkAAgECCzUgdGFncyBtYXguAgABCWlzUGF5bWVudAEBaQMJAAACCQCQAwEIBQFpCHBheW1lbnRzAAAJAAIBAhNObyBwYXltZW50IGF0dGFjaGVkBAdwYXltZW50CQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAAEBmFtb3VudAkBBXZhbHVlAQgFB3BheW1lbnQGYW1vdW50CQCUCgIFB3BheW1lbnQFBmFtb3VudAEPdmFsaWRhdGVQYXltZW50AQFpBA0kdDAxMDE1NjEwMTkyCQEJaXNQYXltZW50AQUBaQQHcGF5bWVudAgFDSR0MDEwMTU2MTAxOTICXzEEBmFtb3VudAgFDSR0MDEwMTU2MTAxOTICXzIEB2Fzc2V0SWQDAwkBCWlzRGVmaW5lZAEIBQdwYXltZW50B2Fzc2V0SWQJAAACCAUHcGF5bWVudAdhc3NldElkBQphcnRBc3NldElkBwgFB3BheW1lbnQHYXNzZXRJZAkAAgECK09ubHkgU0lHTiB0b2tlbiBhY2NlcHRlZCBhcyB0cmFuc2FjdGlvbiBmZWUDCQECIT0CBQZhbW91bnQFGWN1cnJlbnRDZXJ0aWZpY2F0aW9uUHJpY2UJAAIBCQCsAgICGVBheW1lbnQgYW1vdW50IHNob3VsZCBiZSAJAKQDAQUZY3VycmVudENlcnRpZmljYXRpb25QcmljZQkAlAoCBQZhbW91bnQFB2Fzc2V0SWQBC2lzQXJ0TWludGVkAglhZGRyVG9Vc2UFYXJ0SWQEByRtYXRjaDAJAJoIAgUEdGhpcwkBCWtleUlzc3VlZAIFCWFkZHJUb1VzZQUFYXJ0SWQDCQABAgUHJG1hdGNoMAIDSW50BAFiBQckbWF0Y2gwAwkBAiE9AgUBYgAABgcHARR2YWxpZGF0ZVByaWNlQXNzZXRJZAMBaQxwcmljZUFzc2V0SWQMYXJ0d29ya1ByaWNlBA0kdDAxMDc3OTEwODE1CQEJaXNQYXltZW50AQUBaQQHcGF5bWVudAgFDSR0MDEwNzc5MTA4MTUCXzEEBmFtb3VudAgFDSR0MDEwNzc5MTA4MTUCXzIEB2Fzc2V0SWQDCQEBIQEJAQlpc0RlZmluZWQBCAUHcGF5bWVudAdhc3NldElkBQR1bml0AwMJAGYCCQCxAgEFDHByaWNlQXNzZXRJZAAACQAAAgkA2AQBCQEFdmFsdWUBCAUHcGF5bWVudAdhc3NldElkBQxwcmljZUFzc2V0SWQHCAUHcGF5bWVudAdhc3NldElkCQACAQIOV3JvbmcgYXNzZXQgaWQDAwkAAAIFB2Fzc2V0SWQFBHVuaXQJAQIhPQIFDHByaWNlQXNzZXRJZAIABwkAAgECDldyb25nIGFzc2V0IGlkAwkBAiE9AgUMYXJ0d29ya1ByaWNlBQZhbW91bnQJAAIBAhNQYXltZW50IGRvbid0IG1hdGNoCQCUCgIFBmFtb3VudAUHYXNzZXRJZAEQYWNjZXB0ZWRBc3NldElkcwEHYXNzZXRJZAMJAQEhAQkBD2NvbnRhaW5zRWxlbWVudAIFE2FsbF9hY2NlcHRlZF9hc3NldHMFB2Fzc2V0SWQJAAIBAkBPbmx5ICRBUlQsIFVTRFQtUFAsIFVTREMtUFAsIEVBU1QsIFBVWlpMRSwgRVRIIG9yIFdBVkVTIGFjY2VwdGVkBgEPdmFsaWRhdGVNaW5TZWxsAQVwcmljZQMJAGcCAAAFBXByaWNlCQACAQIYV3JvbmcgbWluaW11bSBzZWxsIHByaWNlBgENZ2V0QmlkQXNzZXRJZAEHYXNzZXRJZAMJAAACBQdhc3NldElkAgVXQVZFUwUEdW5pdAkA2QQBBQdhc3NldElkARZnZXRQcmljZUFzc2V0SWRGcm9tQmlkAQpiaWREYXRhS2V5BAdiaWREYXRhCQEOZ2V0U3RyaW5nQnlLZXkBCQCsAgIFCmJpZERhdGFLZXkCBV9PUEVOAwkAAAIFB2JpZERhdGECAAkAAgECDUJpZCBub3QgZm91bmQECmJpZERhdGFBcnIJALUJAgUHYmlkRGF0YQIBXwQJYmlkQW1vdW50CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUKYmlkRGF0YUFycgABBApiaWRBc3NldElkCQENZ2V0QmlkQXNzZXRJZAEJAJEDAgUKYmlkRGF0YUFycgAAAwkAZwIAAAUJYmlkQW1vdW50CQACAQIMV3JvbmcgYW1vdW50CQCUCgIFCWJpZEFtb3VudAUKYmlkQXNzZXRJZAEVaWRDYWxsZXJEYXRlU3BvbnNvcmVkAgFpBnB1YktleQMJAQEhAQULZGFwcFJ1bm5pbmcJAAIBBQ5tYWludGVuYW5jZU1TRwQLaXNTcG9uc29yZWQDCQECIT0CBQZwdWJLZXkCAAkBC3ZhbHVlT3JFbHNlAgkBDmNoZWNrV2hpdGVsaXN0AQkArAICCQClCAEJAKcIAQkA2QQBBQZwdWJLZXkCCV9mcmVlX3R4cwAAAAAEBmNhbGxlcgMDCQAAAgkA2AQBCAgFAWkGY2FsbGVyBWJ5dGVzCQClCAEFBHRoaXMJAGYCBQtpc1Nwb25zb3JlZAAABwkApQgBCQCnCAEJANkEAQUGcHViS2V5CQDYBAEICAUBaQZjYWxsZXIFYnl0ZXMEE2dldF9zcG9uc29yZWRfd2F2ZXMDAwkBAiE9AgUGcHViS2V5AgAJAGYCBQtpc1Nwb25zb3JlZAAABwkA/AcEBQ13aGl0ZWxpc3REYXBwAgl1c2VGcmVlVHgJAMwIAgkApQgBCQCnCAEJANkEAQUGcHViS2V5BQNuaWwFA25pbAUEdW5pdAMJAAACBRNnZXRfc3BvbnNvcmVkX3dhdmVzBRNnZXRfc3BvbnNvcmVkX3dhdmVzCQCWCgQJANgEAQgFAWkNdHJhbnNhY3Rpb25JZAUGY2FsbGVyCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAkAZgIFC2lzU3BvbnNvcmVkAAAJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BDGlkQ2FsbGVyRGF0ZQEBaQMJAQEhAQULZGFwcFJ1bm5pbmcJAAIBBQ5tYWludGVuYW5jZU1TRwkAlQoDCQDYBAEIBQFpDXRyYW5zYWN0aW9uSWQJANgEAQgIBQFpBmNhbGxlcgVieXRlcwgFCWxhc3RCbG9jawl0aW1lc3RhbXABCmdldEJhbGFuY2UBB2Fzc2V0SWQEByRtYXRjaDAFB2Fzc2V0SWQDCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQBYgUHJG1hdGNoMAkA8AcCBQR0aGlzBQFiCAkA7wcBBQR0aGlzCWF2YWlsYWJsZQEHYnV5TWludAYBaQVhcnRJZAZpc3N1ZXIFYmlkSWQIYmlkT3duZXIGcHViS2V5BA0kdDAxMzQyMDEzNTA5CQEVaWRDYWxsZXJEYXRlU3BvbnNvcmVkAgUBaQUGcHViS2V5BAJpZAgFDSR0MDEzNDIwMTM1MDkCXzEEBmNhbGxlcggFDSR0MDEzNDIwMTM1MDkCXzIEBGRhdGUIBQ0kdDAxMzQyMDEzNTA5Al8zBAtpc1Nwb25zb3JlZAgFDSR0MDEzNDIwMTM1MDkCXzQEBWlzQmlkAwMDCQAAAgUGY2FsbGVyBQZpc3N1ZXIJAQIhPQIFCGJpZE93bmVyAgAHCQECIT0CBQViaWRJZAIABwYHAwMFBWlzQmlkCQECIT0CBQZjYWxsZXIFBmlzc3VlcgcJAAIBAhlZb3UgY2Fubm90IGRvIHRoaXMgYWN0aW9uBAhibG9ja0VuZAkBD2dldEludGVnZXJCeUtleQEJAQprZXlFbmRTYWxlAgUGY2FsbGVyBQVhcnRJZAMDAwkBAiE9AgUIYmxvY2tFbmQAAAkAZwIFBmhlaWdodAUIYmxvY2tFbmQHCQEBIQEFBWlzQmlkBwkAAgECC1NhbGUgZW5kZWQuBA5jYWxsZXJJc0lzc3VlcgkAAAIFBmNhbGxlcgUGaXNzdWVyBAh0b3RhbE5GVAkBD2dldEludGVnZXJCeUtleQECEHRvdGFsX25mdF9pc3N1ZWQEC2FydHdvcmtOYW1lCQEOZ2V0U3RyaW5nQnlLZXkBCQEHa2V5TmFtZQIFBmlzc3VlcgUFYXJ0SWQDCQAAAgULYXJ0d29ya05hbWUCAAkAAgECEUFydCBkb2Vzbid0IGV4aXN0BAhpc09uU2FsZQkBD2dldEJvb2xlYW5CeUtleQEJAQlrZXlPblNhbGUCBQZpc3N1ZXIFBWFydElkBAphbW91bnRTb2xkCQEPZ2V0SW50ZWdlckJ5S2V5AQkBCWtleUlzc3VlZAIFBmlzc3VlcgUFYXJ0SWQEDGFydHdvcmtQcmljZQMFDmNhbGxlcklzSXNzdWVyBQhtaW50X2ZlZQkBD2dldEludGVnZXJCeUtleQEJAQhrZXlQcmljZQIFBmlzc3VlcgUFYXJ0SWQEDHByaWNlQXNzZXRJZAMFDmNhbGxlcklzSXNzdWVyCQDYBAEFCmFydEFzc2V0SWQJAQ5nZXRTdHJpbmdCeUtleQEJARJrZXlBc3NldElkQWNjZXB0ZWQCBQZpc3N1ZXIFBWFydElkBAptYXhDYW5TZWxsCQEPZ2V0SW50ZWdlckJ5S2V5AQkBCmtleU1heE1pbnQCBQZpc3N1ZXIFBWFydElkAwMDCQEBIQEFBWlzQmlkCQEBIQEFDmNhbGxlcklzSXNzdWVyBwMDCQBnAgAABQxhcnR3b3JrUHJpY2UGCQEBIQEFCGlzT25TYWxlBgkAZwIAAAUKbWF4Q2FuU2VsbAcJAAIBAhBBcnQgbm90IGZvciBzYWxlAwMDCQEBIQEFBWlzQmlkBQ5jYWxsZXJJc0lzc3VlcgcJAGcCAAAFCm1heENhblNlbGwHCQACAQIUTWF4IGlzc3VhYmxlIG5vdCBzZXQECWNoZWNrVXNlcgkBDHZhbGlkYXRlVXNlcgEFBmlzc3VlcgMDBQVpc0JpZAkBAiE9AgUJY2hlY2tVc2VyAgAHCQACAQUJY2hlY2tVc2VyBApiaWREYXRhS2V5CQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICBGJpZF8FBWFydElkAgFfBQZpc3N1ZXICAV8FCGJpZE93bmVyAgFfBQViaWRJZAQNJHQwMTUwODYxNTI3OAMFBWlzQmlkCQEWZ2V0UHJpY2VBc3NldElkRnJvbUJpZAEFCmJpZERhdGFLZXkJARR2YWxpZGF0ZVByaWNlQXNzZXRJZAMFAWkFDHByaWNlQXNzZXRJZAUMYXJ0d29ya1ByaWNlBAZhbW91bnQIBQ0kdDAxNTA4NjE1Mjc4Al8xBAdhc3NldElkCAUNJHQwMTUwODYxNTI3OAJfMgQFYWdlbnQJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUIdXNlckRhcHAJARJrZXlBcnRpc3RBZ2VudEFkZHIBBQZpc3N1ZXIFC2ZlZVJlY2VpdmVyBAphZ2VudFNoYXJlCQELdmFsdWVPckVsc2UCCQCaCAIFCHVzZXJEYXBwCQEUa2V5UHJpbWFyeVNoYXJlQWdlbnQBBQZpc3N1ZXIAAAQLcHVibGljQWdlbnQJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUIdXNlckRhcHAJARhrZXlBcnRpc3RQdWJsaWNBZ2VudEFkZHIBBQZpc3N1ZXIFC2ZlZVJlY2VpdmVyBBBwdWJsaWNBZ2VudFNoYXJlCQELdmFsdWVPckVsc2UCCQCaCAIFCHVzZXJEYXBwCQEaa2V5UHJpbWFyeVNoYXJlUHVibGljQWdlbnQBBQZpc3N1ZXIAAAQNaXNXaGl0ZWxpc3RlZAkBDmNoZWNrV2hpdGVsaXN0AQUGaXNzdWVyBA1hbW91bnRGb3JTaWduCQBrAwUGYW1vdW50BQ5jb21taXNzaW9uX2ZlZQBkBA5hbW91bnRGb3JBZ2VudAMDAwkBAiE9AgUFYWdlbnQFC2ZlZVJlY2VpdmVyCQBmAgUKYWdlbnRTaGFyZQAABwkAZgIFBmhlaWdodAUNaXNXaGl0ZWxpc3RlZAcJAGsDBQZhbW91bnQFCmFnZW50U2hhcmUAkE4AAAQUYW1vdW50Rm9yUHVibGljQWdlbnQDAwMJAQIhPQIFC3B1YmxpY0FnZW50BQtmZWVSZWNlaXZlcgkAZgIFEHB1YmxpY0FnZW50U2hhcmUAAAcJAGYCBQZoZWlnaHQFDWlzV2hpdGVsaXN0ZWQHCQBrAwUGYW1vdW50BRBwdWJsaWNBZ2VudFNoYXJlAJBOAAAEEGFtb3VudEZvckNyZWF0b3IJAGUCBQZhbW91bnQFDWFtb3VudEZvclNpZ24DCQAAAgUKYW1vdW50U29sZAUKbWF4Q2FuU2VsbAkAAgECDEFydCBzb2xkIG91dAQNbmV3QW1vdW50U29sZAkAZAIFCmFtb3VudFNvbGQAAQQJaXNzdWVNZXRhCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAglDcmVhdG9yOiAFBmlzc3VlcgIKLAogQXJ0SUQ6IAUFYXJ0SWQCESwKIEFydHdvcmsgbmFtZTogBQthcnR3b3JrTmFtZQIKLAogSXNzdWU6IAkApAMBBQ1uZXdBbW91bnRTb2xkAgEvCQCkAwEFCm1heENhblNlbGwECGlzc3VlTkZUCQDCCAUJAKwCAgIDU0FfCQCkAwEJAGQCBQh0b3RhbE5GVAABBQlpc3N1ZU1ldGEAAQAABwQFaWRORlQJALgIAQUIaXNzdWVORlQECnNlbGxTdGF0dXMDAwkAAAIFDW5ld0Ftb3VudFNvbGQFCm1heENhblNlbGwGCQEBIQEFCGlzT25TYWxlBwYECnJlY2VpdmVORlQDAwMJAAACBQZjYWxsZXIFBmlzc3VlcgkBAiE9AgUIYmlkT3duZXICAAcJAQIhPQIFBWJpZElkAgAHCQERQGV4dHJOYXRpdmUoMTA2MikBBQhiaWRPd25lcggFAWkGY2FsbGVyBAphc3NldElkQmlkAwkBASEBCQEJaXNEZWZpbmVkAQUHYXNzZXRJZAIFV0FWRVMJANgEAQkBBXZhbHVlAQUHYXNzZXRJZAQHYmlkRGF0YQkBDmdldFN0cmluZ0J5S2V5AQkArAICBQpiaWREYXRhS2V5AgVfT1BFTgQJYmlkRGVsT2xkCQELRGVsZXRlRW50cnkBCQCsAgIFCmJpZERhdGFLZXkCBV9PUEVOBAliaWRVcGRhdGUJAQtTdHJpbmdFbnRyeQIJAKwCAgUKYmlkRGF0YUtleQIHX0NMT1NFRAkArAICCQCsAgIFB2JpZERhdGECAV8JAKQDAQUEZGF0ZQQHc29sZEtleQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAglhcnRfc29sZF8JAKQDAQUNbmV3QW1vdW50U29sZAIEX29mXwkApAMBBQptYXhDYW5TZWxsAgFfBQVhcnRJZAIBXwUGaXNzdWVyBAlzb2xkVmFsdWUDCQEBIQEFBWlzQmlkCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBmNhbGxlcgIBXwkApAMBBQRkYXRlAgFfBQJpZAIBXwkApAMBBQxhcnR3b3JrUHJpY2UCAV8FDHByaWNlQXNzZXRJZAIBXwkA2AQBBQVpZE5GVAkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQClCAEFCnJlY2VpdmVORlQCAV8JAKQDAQUEZGF0ZQIBXwUCaWQCAV8JAKQDAQUGYW1vdW50AgFfBQphc3NldElkQmlkAgFfCQDYBAEFBWlkTkZUBAhzb2xkRGF0YQkBC1N0cmluZ0VudHJ5AgUHc29sZEtleQUJc29sZFZhbHVlBCJhbW91bnRfY29tbWlzc2lvbl9mb3Jfc2lnbl90b19zd2FwAwkBAiE9AgUOYW1vdW50Rm9yQWdlbnQAAAkAZQIFDWFtb3VudEZvclNpZ24FDmFtb3VudEZvckFnZW50BQ1hbW91bnRGb3JTaWduBBFhbW91bnRfYXJ0X2JlZm9yZQkBCmdldEJhbGFuY2UBBQphcnRBc3NldElkAwkAAAIFEWFtb3VudF9hcnRfYmVmb3JlBRFhbW91bnRfYXJ0X2JlZm9yZQQPc3dhcF9mZWVfdG9fYXJ0AwkBAiE9AgUHYXNzZXRJZAUKYXJ0QXNzZXRJZAkA/AcECQEHQWRkcmVzcwEJANkEAQUPcHV6emxlX2FydF9wb29sAgRzd2FwCQDMCAIFDmFydEFzc2V0SWRfc3RyCQDMCAIAAQUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQdhc3NldElkBSJhbW91bnRfY29tbWlzc2lvbl9mb3Jfc2lnbl90b19zd2FwBQNuaWwFBHVuaXQDCQAAAgUPc3dhcF9mZWVfdG9fYXJ0BQ9zd2FwX2ZlZV90b19hcnQEEGFtb3VudF9hcnRfYWZ0ZXIJAQpnZXRCYWxhbmNlAQUKYXJ0QXNzZXRJZAMJAAACBRBhbW91bnRfYXJ0X2FmdGVyBRBhbW91bnRfYXJ0X2FmdGVyBBRjb21taXNzaW9uc1dpdGhBZ2VudAMJAQIhPQIFDmFtb3VudEZvckFnZW50AAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFC2ZlZVJlY2VpdmVyAwkAAAIFB2Fzc2V0SWQFCmFydEFzc2V0SWQJAGUCBQ1hbW91bnRGb3JTaWduBQ5hbW91bnRGb3JBZ2VudAkAZQIFEGFtb3VudF9hcnRfYWZ0ZXIFEWFtb3VudF9hcnRfYmVmb3JlBQphcnRBc3NldElkCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQVhZ2VudAUOYW1vdW50Rm9yQWdlbnQFB2Fzc2V0SWQFA25pbAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQULZmVlUmVjZWl2ZXIDCQAAAgUHYXNzZXRJZAUKYXJ0QXNzZXRJZAUNYW1vdW50Rm9yU2lnbgkAZQIFEGFtb3VudF9hcnRfYWZ0ZXIFEWFtb3VudF9hcnRfYmVmb3JlBQphcnRBc3NldElkBQNuaWwEGmNvbW1pc3Npb25zV2l0aFB1YmxpY0FnZW50AwkBAiE9AgUUYW1vdW50Rm9yUHVibGljQWdlbnQAAAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQULcHVibGljQWdlbnQFFGFtb3VudEZvclB1YmxpY0FnZW50BQdhc3NldElkCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQZpc3N1ZXIJAGUCBRBhbW91bnRGb3JDcmVhdG9yBRRhbW91bnRGb3JQdWJsaWNBZ2VudAUHYXNzZXRJZAUDbmlsCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQZpc3N1ZXIFEGFtb3VudEZvckNyZWF0b3IFB2Fzc2V0SWQFA25pbAQKdHhUb0NhbGxlcgMFC2lzU3BvbnNvcmVkCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQZjYWxsZXIAAAUEdW5pdAUDbmlsBQNuaWwEBmJ1eVJlcwkAzggCCQDOCAIJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBCWtleUlzc3VlZAIFBmlzc3VlcgUFYXJ0SWQFDW5ld0Ftb3VudFNvbGQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICAgRuZnRfCQDYBAEFBWlkTkZUBQdzb2xkS2V5CQDMCAIJAQxJbnRlZ2VyRW50cnkCAhB0b3RhbF9uZnRfaXNzdWVkCQBkAgUIdG90YWxORlQAAQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBCmtleUVuZFNhbGUCBQZpc3N1ZXIFBWFydElkAAAJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAQlrZXlPblNhbGUCBQZpc3N1ZXIFBWFydElkBQpzZWxsU3RhdHVzCQDMCAIFCGlzc3VlTkZUCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFCnJlY2VpdmVORlQAAQUFaWRORlQFA25pbAUUY29tbWlzc2lvbnNXaXRoQWdlbnQFGmNvbW1pc3Npb25zV2l0aFB1YmxpY0FnZW50BQp0eFRvQ2FsbGVyAwUFaXNCaWQJAMwIAgUIc29sZERhdGEJAMwIAgUJYmlkVXBkYXRlCQDMCAIFCWJpZERlbE9sZAUGYnV5UmVzCQDMCAIFCHNvbGREYXRhBQZidXlSZXMJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BCGFzU3RyaW5nAQJidgQHJG1hdGNoMAUCYnYDCQABAgUHJG1hdGNoMAIGU3RyaW5nBANidjAFByRtYXRjaDAFA2J2MAkAAgECJFNwb25zb3JlZCBQdWJsaWMgS2V5IFN0cmluZyBleHBlY3RlZAoGaW52b2tlAQdzZXRDb25mAgNrZXkDdmFsBAZjYWxsZXIJAKUIAQgFBmludm9rZQZjYWxsZXIDCQEPY29udGFpbnNFbGVtZW50AgkAzAgCBQVjaHJpcwkAzAgCCQClCAEFBHRoaXMFA25pbAUGY2FsbGVyAwkBCGNvbnRhaW5zAgUDa2V5AgVjb25mXwkAzAgCCQELU3RyaW5nRW50cnkCBQNrZXkFA3ZhbAUDbmlsCQACAQIgRW50cmllcyBzdGFydGluZyB3aXRoIGNvbmZfIG9ubHkJAAIBAiJZb3UgYXJlIG5vdCBhbGxvd2VkIHRvIGNoYW5nZSB0aGlzAWkBCmFkZEFydHdvcmsMBG5hbWULZGVzY3JpcHRpb24EdGFncwR0eXBlCmNpZERpc3BsYXkMc2hhMjU2RXhwb3J0CWNpZEV4cG9ydA1zaGEyNTZMaWNlbmNlCmNpZExpY2VuY2UHY3Jhd2xlcglyb3lhbHRpZXMGcHViS2V5BA0kdDAyMTU0NDIxNjE3CQEVaWRDYWxsZXJEYXRlU3BvbnNvcmVkAgUBaQUGcHViS2V5BAVhcnRJZAgFDSR0MDIxNTQ0MjE2MTcCXzEEBmNhbGxlcggFDSR0MDIxNTQ0MjE2MTcCXzIEBGRhdGUIBQ0kdDAyMTU0NDIxNjE3Al8zBAtpc1Nwb25zb3JlZAgFDSR0MDIxNTQ0MjE2MTcCXzQEDSR0MDIxNjI3MjE2OTYJAQpzZXRMSWNlbmNlAgUKY2lkTGljZW5jZQUNc2hhMjU2TGljZW5jZQQKbGljZW5jZUNJRAgFDSR0MDIxNjI3MjE2OTYCXzEEC2xpY2VuY2VIYXNoCAUNJHQwMjE2MjcyMTY5NgJfMgQPdmFsaWRhdGVBcnR3b3JrCQETdmFsaWRhdGVBcnR3b3JrRGF0YQoFBmNhbGxlcgUKY2lkRGlzcGxheQUJY2lkRXhwb3J0BQpsaWNlbmNlQ0lEBQxzaGEyNTZFeHBvcnQFC2xpY2VuY2VIYXNoBQRuYW1lBQtkZXNjcmlwdGlvbgUEdGFncwUJcm95YWx0aWVzAwkBAiE9AgUPdmFsaWRhdGVBcnR3b3JrAgAJAAIBAhVTb21ldGhpbmcgd2VudCB3cm9uZyEEEHdoaXRlbGlzdGVkX2Ryb3AJAGYCCQEOY2hlY2tXaGl0ZWxpc3QBCQCsAgIFBmNhbGxlcgILX2ZyZWVfZHJvcHMAAAQNJHQwMjE5OTUyMjA4MwMFEHdoaXRlbGlzdGVkX2Ryb3AJAJQKAgAABQphcnRBc3NldElkCQEPdmFsaWRhdGVQYXltZW50AQUBaQQGYW1vdW50CAUNJHQwMjE5OTUyMjA4MwJfMQQHYXNzZXRJZAgFDSR0MDIxOTk1MjIwODMCXzIDCQEBIQEJAQlpc0RlZmluZWQBBQZhbW91bnQJAAIBAhRTb21ldGhpbmcgd2VudCB3cm9uZwQXZGVjcmVhc2Vfd2hpdGVsaXN0X2Ryb3ADBRB3aGl0ZWxpc3RlZF9kcm9wCQD8BwQFDXdoaXRlbGlzdERhcHACC3VzZUZyZWVEcm9wCQDMCAIFBmNhbGxlcgUDbmlsBQNuaWwFBHVuaXQDCQAAAgUXZGVjcmVhc2Vfd2hpdGVsaXN0X2Ryb3AFF2RlY3JlYXNlX3doaXRlbGlzdF9kcm9wBAp0eFRvQ2FsbGVyAwULaXNTcG9uc29yZWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFBmNhbGxlcgAABQR1bml0BQNuaWwFA25pbAkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEHa2V5RGF0ZQIFBmNhbGxlcgUFYXJ0SWQFBGRhdGUJAMwIAgkBC1N0cmluZ0VudHJ5AgkBB2tleU5hbWUCBQZjYWxsZXIFBWFydElkBQRuYW1lCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQdrZXlEZXNjAgUGY2FsbGVyBQVhcnRJZAULZGVzY3JpcHRpb24JAMwIAgkBC1N0cmluZ0VudHJ5AgkBDWtleURpc3BsYXlDaWQCBQZjYWxsZXIFBWFydElkBQpjaWREaXNwbGF5CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQxrZXlFeHBvcnRDaWQCBQZjYWxsZXIFBWFydElkBQljaWRFeHBvcnQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDWtleUV4cG9ydEhhc2gCBQZjYWxsZXIFBWFydElkBQxzaGEyNTZFeHBvcnQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDmtleUxpY2VuY2VIYXNoAgUGY2FsbGVyBQVhcnRJZAULbGljZW5jZUhhc2gJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDWtleUxpY2VuY2VDaWQCBQZjYWxsZXIFBWFydElkBQpsaWNlbmNlQ0lECQDMCAIJAQtTdHJpbmdFbnRyeQIJAQdrZXlUeXBlAgUGY2FsbGVyBQVhcnRJZAUEdHlwZQkAzAgCCQELU3RyaW5nRW50cnkCCQEHa2V5VGFncwIFBmNhbGxlcgUFYXJ0SWQFBHRhZ3MJAMwIAgkBDEludGVnZXJFbnRyeQIJAQprZXlNYXhNaW50AgUGY2FsbGVyBQVhcnRJZAAACQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEJa2V5SXNzdWVkAgUGY2FsbGVyBQVhcnRJZAAACQDMCAIJAQxCb29sZWFuRW50cnkCCQEJa2V5T25TYWxlAgUGY2FsbGVyBQVhcnRJZAcJAMwIAgkBC1N0cmluZ0VudHJ5AgkBCmtleUNyYXdsZXICBQZjYWxsZXIFBWFydElkBQdjcmF3bGVyCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEMa2V5Um95YWx0aWVzAgUGY2FsbGVyBQVhcnRJZAUJcm95YWx0aWVzCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQtmZWVSZWNlaXZlcgUGYW1vdW50BQphcnRBc3NldElkBQNuaWwFCnR4VG9DYWxsZXIJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQENdXBkYXRlQXJ0d29yaw0EdHhpZARuYW1lC2Rlc2NyaXB0aW9uBHRhZ3MEdHlwZQpjaWREaXNwbGF5DHNoYTI1NkV4cG9ydAljaWRFeHBvcnQNc2hhMjU2TGljZW5jZQpjaWRMaWNlbmNlB2NyYXdsZXIJcm95YWx0aWVzBnB1YktleQMJAQEhAQULZGFwcFJ1bm5pbmcJAAIBBQ5tYWludGVuYW5jZU1TRwQNJHQwMjM5OTgyNDA2OAkBFWlkQ2FsbGVyRGF0ZVNwb25zb3JlZAIFAWkFBnB1YktleQQCaWQIBQ0kdDAyMzk5ODI0MDY4Al8xBAZjYWxsZXIIBQ0kdDAyMzk5ODI0MDY4Al8yBARkYXRlCAUNJHQwMjM5OTgyNDA2OAJfMwQLaXNTcG9uc29yZWQIBQ0kdDAyMzk5ODI0MDY4Al80BA0kdDAyNDA3ODI0MTQ3CQEKc2V0TEljZW5jZQIFCmNpZExpY2VuY2UFDXNoYTI1NkxpY2VuY2UECmxpY2VuY2VDSUQIBQ0kdDAyNDA3ODI0MTQ3Al8xBAtsaWNlbmNlSGFzaAgFDSR0MDI0MDc4MjQxNDcCXzIED3ZhbGlkYXRlQXJ0d29yawkBE3ZhbGlkYXRlQXJ0d29ya0RhdGEKBQZjYWxsZXIFCmNpZERpc3BsYXkFCWNpZEV4cG9ydAUKbGljZW5jZUNJRAUMc2hhMjU2RXhwb3J0BQtsaWNlbmNlSGFzaAUEbmFtZQULZGVzY3JpcHRpb24FBHRhZ3MFCXJveWFsdGllcwMJAQIhPQIFD3ZhbGlkYXRlQXJ0d29yawIACQACAQIVU29tZXRoaW5nIHdlbnQgd3JvbmchBAplbnRyeUV4aXN0CQEOZ2V0U3RyaW5nQnlLZXkBCQEHa2V5TmFtZQIFBmNhbGxlcgUEdHhpZAMJAAACBQplbnRyeUV4aXN0AgAJAAIBAg9FbnRyeSBub3QgZm91bmQEBGZsYWcJAQ5nZXRTdHJpbmdCeUtleQEJAQdrZXlGbGFnAgUGY2FsbGVyBQR0eGlkAwkAAAIFBGZsYWcCB0lMTEVHQUwJAAIBAh1DYW5ub3QgdXBkYXRlIElMTEVHQUwgYXJ0d29yawMJAQEhAQkBC2lzQXJ0TWludGVkAgUGY2FsbGVyBQR0eGlkBAp0eFRvQ2FsbGVyAwULaXNTcG9uc29yZWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFBmNhbGxlcgAABQR1bml0BQNuaWwFA25pbAkAzggCCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQdrZXlOYW1lAgUGY2FsbGVyBQR0eGlkBQRuYW1lCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQdrZXlEZXNjAgUGY2FsbGVyBQR0eGlkBQtkZXNjcmlwdGlvbgkAzAgCCQELU3RyaW5nRW50cnkCCQENa2V5RGlzcGxheUNpZAIFBmNhbGxlcgUEdHhpZAUKY2lkRGlzcGxheQkAzAgCCQELU3RyaW5nRW50cnkCCQEMa2V5RXhwb3J0Q2lkAgUGY2FsbGVyBQR0eGlkBQljaWRFeHBvcnQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDWtleUV4cG9ydEhhc2gCBQZjYWxsZXIFBHR4aWQFDHNoYTI1NkV4cG9ydAkAzAgCCQELU3RyaW5nRW50cnkCCQENa2V5TGljZW5jZUNpZAIFBmNhbGxlcgUEdHhpZAUKbGljZW5jZUNJRAkAzAgCCQELU3RyaW5nRW50cnkCCQEOa2V5TGljZW5jZUhhc2gCBQZjYWxsZXIFBHR4aWQFC2xpY2VuY2VIYXNoCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQdrZXlUYWdzAgUGY2FsbGVyBQR0eGlkBQR0YWdzCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQdrZXlUeXBlAgUGY2FsbGVyBQR0eGlkBQR0eXBlCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQprZXlDcmF3bGVyAgUGY2FsbGVyBQR0eGlkBQdjcmF3bGVyCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEMa2V5Um95YWx0aWVzAgUGY2FsbGVyBQR0eGlkBQlyb3lhbHRpZXMFA25pbAUKdHhUb0NhbGxlcgkAAgECDkFscmVhZHkgbWludGVkAWkBC2ZsYWdBcnR3b3JrBAVhcnRJZARhZGRyBGZsYWcEbm90ZQQNJHQwMjU3NzQyNTgwOAkBDGlkQ2FsbGVyRGF0ZQEFAWkEAmlkCAUNJHQwMjU3NzQyNTgwOAJfMQQGY2FsbGVyCAUNJHQwMjU3NzQyNTgwOAJfMgMJAQ9jb250YWluc0VsZW1lbnQCCQDMCAIFBWNocmlzCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQZjYWxsZXIDCQEPY29udGFpbnNFbGVtZW50AgkAzAgCAgdDT05TRU5UCQDMCAICAAkAzAgCAg9DSEFOR0VfUkVRVUlSRUQJAMwIAgIHRkxBR0dFRAkAzAgCAgdJTExFR0FMBQNuaWwFBGZsYWcJAMwIAgkBC1N0cmluZ0VudHJ5AgkBB2tleUZsYWcCBQRhZGRyBQVhcnRJZAUEZmxhZwkAzAgCCQELU3RyaW5nRW50cnkCCQEHa2V5Tm90ZQIFBGFkZHIFBWFydElkBQRub3RlBQNuaWwJAAIBCQCsAgICDlVua25vdyBzdGF0dXMgBQRmbGFnCQACAQITWW91IGFyZSBub3QgYWxsb3dlZAFpAQ1kZWxldGVBcnR3b3JrAgVhcnRJZARhZGRyBA0kdDAyNjI0NDI2Mjc4CQEMaWRDYWxsZXJEYXRlAQUBaQQCaWQIBQ0kdDAyNjI0NDI2Mjc4Al8xBAZjYWxsZXIIBQ0kdDAyNjI0NDI2Mjc4Al8yBAlhZGRyVG9Vc2UDCQEPY29udGFpbnNFbGVtZW50AgkAzAgCBQVjaHJpcwkAzAgCCQClCAEFBHRoaXMFA25pbAUGY2FsbGVyBQRhZGRyBQZjYWxsZXIECmVudHJ5RXhpc3QJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkBDmdldFN0cmluZ0J5S2V5AQkBB2tleU5hbWUCBQlhZGRyVG9Vc2UFBWFydElkAiBObyBhcnQgbWF0Y2hpbmcgZm9yIHRoaXMgYWRkcmVzcwMJAAACBQplbnRyeUV4aXN0AgAJAAIBAiBObyBhcnQgbWF0Y2hpbmcgZm9yIHRoaXMgYWRkcmVzcwQKc2hhMjU2SGFzaAkBDmdldFN0cmluZ0J5S2V5AQkBEWtleUhhc2hCeVR4aWRBZGRyAgUJYWRkclRvVXNlBQVhcnRJZAQGc2lnbklEAwkBAiE9AgUKc2hhMjU2SGFzaAIACQEOZ2V0U3RyaW5nQnlLZXkBCQEJa2V5U2lnbklEAgUJYWRkclRvVXNlBQVhcnRJZAIABA1zaWduSURfbGVnYWN5AwkAAAIFBnNpZ25JRAIABQNuaWwJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBDWtleWlkQnlTaWduaWQCBQlhZGRyVG9Vc2UFBnNpZ25JRAUDbmlsBAxkYXRhVG9EZWxldGUJAM4IAgkAzAgCCQELRGVsZXRlRW50cnkBCQEHa2V5RGF0ZQIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBB2tleU5hbWUCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQdrZXlEZXNjAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQENa2V5RGlzcGxheUNpZAIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBDGtleUV4cG9ydENpZAIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBDWtleUV4cG9ydEhhc2gCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQ5rZXlMaWNlbmNlSGFzaAIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBDWtleUxpY2VuY2VDaWQCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQdrZXlUeXBlAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEHa2V5VGFncwIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBCmtleU1heE1pbnQCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQlrZXlTaWduSUQCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQlrZXlJc3N1ZWQCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQlrZXlPblNhbGUCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQdrZXlGbGFnAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEIa2V5UHJpY2UCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJARJrZXlBc3NldElkQWNjZXB0ZWQCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQ5rZXlPd25lckJ5SGFzaAEFCnNoYTI1Nkhhc2gJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBCmtleUVuZFNhbGUCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQdrZXlOb3RlAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEKa2V5Q3Jhd2xlcgIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBDGtleVJveWFsdGllcwIFCWFkZHJUb1VzZQUFYXJ0SWQFA25pbAUNc2lnbklEX2xlZ2FjeQMJAQEhAQkBC2lzQXJ0TWludGVkAgUJYWRkclRvVXNlBQVhcnRJZAMJAQEhAQULZGFwcFJ1bm5pbmcJAAIBBQ5tYWludGVuYW5jZU1TRwUMZGF0YVRvRGVsZXRlAwkBD2NvbnRhaW5zRWxlbWVudAIJAMwIAgUFY2hyaXMJAMwIAgkApQgBBQR0aGlzBQNuaWwFBmNhbGxlcgUMZGF0YVRvRGVsZXRlCQACAQIoQXJ0IGFscmVhZHkgbWludGVkLCB5b3UgY2Fubm90IGRlbGV0ZSBpdAFpAQtzZWxsQXJ0d29yawYFYXJ0SWQFcHJpY2UHbWF4TWludAdhc3NldElkCGJsb2NrRW5kBnB1YktleQQNJHQwMjkwNTcyOTEyNwkBFWlkQ2FsbGVyRGF0ZVNwb25zb3JlZAIFAWkFBnB1YktleQQCaWQIBQ0kdDAyOTA1NzI5MTI3Al8xBAZjYWxsZXIIBQ0kdDAyOTA1NzI5MTI3Al8yBARkYXRlCAUNJHQwMjkwNTcyOTEyNwJfMwQLaXNTcG9uc29yZWQIBQ0kdDAyOTA1NzI5MTI3Al80BAthcnR3b3JrTmFtZQkBDmdldFN0cmluZ0J5S2V5AQkBB2tleU5hbWUCBQZjYWxsZXIFBWFydElkAwkAAAIFC2FydHdvcmtOYW1lAgAJAAIBAiNUaGlzIGFydCBkb2Vzbid0IG1hdGNoIHlvdXIgYWNjb3VudAQEZmxhZwkBDmdldFN0cmluZ0J5S2V5AQkBB2tleUZsYWcCBQZjYWxsZXIFBWFydElkAwkBD2NvbnRhaW5zRWxlbWVudAIJAMwIAgIPQ0hBTkdFX1JFUVVJUkVECQDMCAICB0ZMQUdHRUQJAMwIAgIHSUxMRUdBTAUDbmlsBQRmbGFnCQACAQIPRmxhZ2dlZCBhcnR3b3JrBAZiaWROYnIJAQ9nZXRJbnRlZ2VyQnlLZXkBCQCsAgICEmN1cnJlbnRfYmlkYW1vdW50XwUFYXJ0SWQDCQBmAgAABQhibG9ja0VuZAkAAgECDE5lZ2F0aXZlIGVuZAMDCQBmAgUIYmxvY2tFbmQAAAMJAQIhPQIFB21heE1pbnQAAQYJAQIhPQIFBXByaWNlAAAHCQACAQI6VGltZWQgb2ZmZXIgb25seSBhbGxvd2VkIGZvciB1bmlxdWUgZWRpdGlvbiBhbmQgb2ZmZXIgb25seQQKYmFzZUhlaWdodAMJAAACBQhibG9ja0VuZAAAAAAFBmhlaWdodAMJAQEhAQkBEGFjY2VwdGVkQXNzZXRJZHMBBQdhc3NldElkCQACAQIVU29tZXRoaW5nIHdlbnQgd3JvbmchAwkBASEBCQEPdmFsaWRhdGVNaW5TZWxsAQUFcHJpY2UJAAIBAhVTb21ldGhpbmcgd2VudCB3cm9uZyEECWNoZWNrVXNlcgkBDHZhbGlkYXRlVXNlcgEFBmNhbGxlcgMJAQIhPQIFCWNoZWNrVXNlcgIACQACAQUJY2hlY2tVc2VyBAphbW91bnRTb2xkCQEPZ2V0SW50ZWdlckJ5S2V5AQkBCWtleUlzc3VlZAIFBmNhbGxlcgUFYXJ0SWQECm1heENhblNlbGwJAQ9nZXRJbnRlZ2VyQnlLZXkBCQEKa2V5TWF4TWludAIFBmNhbGxlcgUFYXJ0SWQDCQBmAgUHbWF4TWludABkCQACAQIcMTAwIGVkaXRpb25zIG1heCBwZXIgYXJ0d29yawMDCQECIT0CBQphbW91bnRTb2xkAAAJAAACBQphbW91bnRTb2xkBQptYXhDYW5TZWxsBwkAAgECFE1heCBlZGl0aW9uIHJlYWNoZWQuAwMJAGYCBQphbW91bnRTb2xkAAAJAQIhPQIFCm1heENhblNlbGwFB21heE1pbnQHCQACAQImQ2Fubm90IGNoYW5nZSBtYXhpbXVtIGlzc3VhYmxlIGFueW1vcmUDAwkAZgIFBmJpZE5icgAACQECIT0CBQptYXhDYW5TZWxsBQdtYXhNaW50BwkAAgECMUNhbm5vdCBjaGFuZ2UgbWF4aW11bSBpc3N1YWJsZSB3aXRoIGFjdGl2ZSBvcmRlcnMECnNlbGxTdGF0dXMDAwkAZgIFBXByaWNlAAAJAGYCBQdtYXhNaW50AAAHBgcECnR4VG9DYWxsZXIDBQtpc1Nwb25zb3JlZAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQUGY2FsbGVyAAAFBHVuaXQFA25pbAUDbmlsCQDOCAIJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAQlrZXlPblNhbGUCBQZjYWxsZXIFBWFydElkBQpzZWxsU3RhdHVzCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEIa2V5UHJpY2UCBQZjYWxsZXIFBWFydElkBQVwcmljZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBCmtleU1heE1pbnQCBQZjYWxsZXIFBWFydElkBQdtYXhNaW50CQDMCAIJAQtTdHJpbmdFbnRyeQIJARJrZXlBc3NldElkQWNjZXB0ZWQCBQZjYWxsZXIFBWFydElkBQdhc3NldElkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEKa2V5RW5kU2FsZQIFBmNhbGxlcgUFYXJ0SWQJAGQCBQpiYXNlSGVpZ2h0BQhibG9ja0VuZAUDbmlsBQp0eFRvQ2FsbGVyAWkBCmJ1eUFydHdvcmsCBWFydElkBmlzc3VlcgkBB2J1eU1pbnQGBQFpBQVhcnRJZAUGaXNzdWVyAgACAAIAAWkBBnNldEJpZAIFYXJ0SWQGaXNzdWVyBA0kdDAzMTUwMDMxNTQwCQEMaWRDYWxsZXJEYXRlAQUBaQQCaWQIBQ0kdDAzMTUwMDMxNTQwAl8xBAZjYWxsZXIIBQ0kdDAzMTUwMDMxNTQwAl8yBARkYXRlCAUNJHQwMzE1MDAzMTU0MAJfMwQNJHQwMzE1NDUzMTU4MQkBCWlzUGF5bWVudAEFAWkEB3BheW1lbnQIBQ0kdDAzMTU0NTMxNTgxAl8xBAZhbW91bnQIBQ0kdDAzMTU0NTMxNTgxAl8yBAdhc3NldElkAwkBASEBCQEJaXNEZWZpbmVkAQgFB3BheW1lbnQHYXNzZXRJZAIFV0FWRVMJANgEAQkBBXZhbHVlAQgFB3BheW1lbnQHYXNzZXRJZAQIYmxvY2tFbmQJAQ9nZXRJbnRlZ2VyQnlLZXkBCQEKa2V5RW5kU2FsZQIFBmlzc3VlcgUFYXJ0SWQDAwkBAiE9AgUIYmxvY2tFbmQAAAkAZwIFBmhlaWdodAUIYmxvY2tFbmQHCQACAQILU2FsZSBlbmRlZC4EBmJpZE5icgkBD2dldEludGVnZXJCeUtleQEJAKwCAgISY3VycmVudF9iaWRhbW91bnRfBQVhcnRJZAMJAQEhAQkBEGFjY2VwdGVkQXNzZXRJZHMBBQdhc3NldElkCQACAQISYXNzZXQgbm90IGFjY2VwdGVkAwkBASEBCQEPdmFsaWRhdGVNaW5TZWxsAQUGYW1vdW50CQACAQIOV3JvbmcgbWluIHNlbGwECmFtb3VudFNvbGQJAQ9nZXRJbnRlZ2VyQnlLZXkBCQEJa2V5SXNzdWVkAgUGaXNzdWVyBQVhcnRJZAQKbWF4Q2FuU2VsbAkBD2dldEludGVnZXJCeUtleQEJAQprZXlNYXhNaW50AgUGaXNzdWVyBQVhcnRJZAMJAGcCAAAFCm1heENhblNlbGwJAAIBAiNObyBtYXggZWRpdGlvbiBzZXQgZm9yIHRoaXMgYXJ0d29yawMJAGcCBQphbW91bnRTb2xkBQptYXhDYW5TZWxsCQACAQIYU29sZCBvdXQsIHlvdSBjYW5ub3QgYmlkCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAgRiaWRfBQVhcnRJZAIBXwUGaXNzdWVyAgFfBQZjYWxsZXICAV8FAmlkAgVfT1BFTgkArAICCQCsAgIJAKwCAgkArAICBQdhc3NldElkAgFfCQCkAwEFBmFtb3VudAIBXwkApAMBBQRkYXRlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgICEmN1cnJlbnRfYmlkYW1vdW50XwUFYXJ0SWQJAGQCBQZiaWROYnIAAQUDbmlsAWkBCWFjY2VwdEJpZAUFYXJ0SWQGaXNzdWVyBWJpZElkCGJpZE93bmVyBnB1YktleQkBB2J1eU1pbnQGBQFpBQVhcnRJZAUGaXNzdWVyBQViaWRJZAUIYmlkT3duZXIFBnB1YktleQFpAQljYW5jZWxCaWQEBWFydElkBmlzc3VlcgViaWRJZAhiaWRPd25lcgQNJHQwMzI5MDUzMjk2NgkBDGlkQ2FsbGVyRGF0ZQEFAWkEAmlkCAUNJHQwMzI5MDUzMjk2NgJfMQQGY2FsbGVyCAUNJHQwMzI5MDUzMjk2NgJfMgQEZGF0ZQgFDSR0MDMyOTA1MzI5NjYCXzMDAwkBAiE9AgUGY2FsbGVyBQhiaWRPd25lcgkBAiE9AgUGY2FsbGVyBQZpc3N1ZXIHCQACAQIZWW91IGNhbm5vdCBkbyB0aGlzIGFjdGlvbgQNcmV0dXJuTW9uZXlUbwMJAAACBQZjYWxsZXIFBmlzc3VlcgUIYmlkT3duZXIFBmNhbGxlcgQGYmlkTmJyCQEPZ2V0SW50ZWdlckJ5S2V5AQkArAICAhJjdXJyZW50X2JpZGFtb3VudF8FBWFydElkBApiaWREYXRhS2V5CQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICBGJpZF8FBWFydElkAgFfBQZpc3N1ZXICAV8FCGJpZE93bmVyAgFfBQViaWRJZAQHYmlkRGF0YQkBDmdldFN0cmluZ0J5S2V5AQkArAICBQpiaWREYXRhS2V5AgVfT1BFTgMJAAACBQdiaWREYXRhAgAJAAIBAg1CaWQgbm90IGZvdW5kBApiaWREYXRhQXJyCQC1CQIFB2JpZERhdGECAV8EB2Fzc2V0SWQJAQ1nZXRCaWRBc3NldElkAQkAkQMCBQpiaWREYXRhQXJyAAAECWJpZFN0YXR1cwIIQ0FOQ0VMRUQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICBQpiaWREYXRhS2V5AgVfT1BFTgkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgUKYmlkRGF0YUtleQIBXwUJYmlkU3RhdHVzCQCsAgIJAKwCAgUHYmlkRGF0YQIBXwkApAMBBQRkYXRlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgICEmN1cnJlbnRfYmlkYW1vdW50XwUFYXJ0SWQJAGUCBQZiaWROYnIAAQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQUNcmV0dXJuTW9uZXlUbwkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCmJpZERhdGFBcnIAAQUHYXNzZXRJZAUDbmlsAQJ0eAEIdmVyaWZpZXIABAckbWF0Y2gwBQJ0eAMJAAECBQckbWF0Y2gwAhdJbnZva2VTY3JpcHRUcmFuc2FjdGlvbgQDaW52BQckbWF0Y2gwAwMDAwkAAAIIBQNpbnYIZnVuY3Rpb24CCmFkZEFydHdvcmsJAAACCAUDaW52BGRBcHAFBHRoaXMHCQAAAggFA2ludgNmZWUAoMIeBwkAAAIIBQNpbnYKZmVlQXNzZXRJZAUEdW5pdAcJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAJANkEAQkBCGFzU3RyaW5nAQkAkQMCCAUDaW52BGFyZ3MACwMDAwMJAAACCAUDaW52CGZ1bmN0aW9uAg11cGRhdGVBcnR3b3JrCQAAAggFA2ludgRkQXBwBQR0aGlzBwkAAAIIBQNpbnYDZmVlAKDCHgcJAAACCAUDaW52CmZlZUFzc2V0SWQFBHVuaXQHCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACQDZBAEJAQhhc1N0cmluZwEJAJEDAggFA2ludgRhcmdzAAwDAwMDCQAAAggFA2ludghmdW5jdGlvbgILc2VsbEFydHdvcmsJAAACCAUDaW52BGRBcHAFBHRoaXMHCQAAAggFA2ludgNmZWUAoMIeBwkAAAIIBQNpbnYKZmVlQXNzZXRJZAUEdW5pdAcJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAJANkEAQkBCGFzU3RyaW5nAQkAkQMCCAUDaW52BGFyZ3MABQMDAwMJAAACCAUDaW52CGZ1bmN0aW9uAglhY2NlcHRCaWQJAAACCAUDaW52BGRBcHAFBHRoaXMHCQAAAggFA2ludgNmZWUAoMIeBwkAAAIIBQNpbnYKZmVlQXNzZXRJZAUEdW5pdAcJAMgTAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAJANkEAQkBCGFzU3RyaW5nAQkAkQMCCAUDaW52BGFyZ3MABAkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAgFAnR4D3NlbmRlclB1YmxpY0tleQkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAgFAnR4D3NlbmRlclB1YmxpY0tleac8hv8=", "height": 2793434, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 6diqt1P78YYHi2jTo4LphCSTStrPyqSNRhsUuFPgeszp Next: 9Ujjf3HvnEUzDeRjUJeipCmtCyXnZRwpxJhQj4dvF6Bs Diff:
OldNewDifferences
513513 else amountForSign
514514 let amount_art_before = getBalance(artAssetId)
515515 if ((amount_art_before == amount_art_before))
516- then if ((assetId == unit))
517- then throw(toString(isDefined(assetId)))
518- else {
519- let swap_fee_to_art = if ((assetId != artAssetId))
520- then invoke(Address(fromBase58String(puzzle_art_pool)), "swap", [artAssetId_str, 1], [AttachedPayment(assetId, amount_commission_for_sign_to_swap)])
521- else unit
522- if ((swap_fee_to_art == swap_fee_to_art))
523- then {
524- let amount_art_after = getBalance(artAssetId)
525- if ((amount_art_after == amount_art_after))
526- then {
527- let commissionsWithAgent = if ((amountForAgent != 0))
528- then [ScriptTransfer(Address(fromBase58String(feeReceiver)), if ((assetId == artAssetId))
529- then (amountForSign - amountForAgent)
530- else (amount_art_after - amount_art_before), artAssetId), ScriptTransfer(Address(fromBase58String(agent)), amountForAgent, assetId)]
531- else [ScriptTransfer(Address(fromBase58String(feeReceiver)), if ((assetId == artAssetId))
532- then amountForSign
533- else (amount_art_after - amount_art_before), artAssetId)]
534- let commissionsWithPublicAgent = if ((amountForPublicAgent != 0))
535- then [ScriptTransfer(Address(fromBase58String(publicAgent)), amountForPublicAgent, assetId), ScriptTransfer(Address(fromBase58String(issuer)), (amountForCreator - amountForPublicAgent), assetId)]
536- else [ScriptTransfer(Address(fromBase58String(issuer)), amountForCreator, assetId)]
537- let txToCaller = if (isSponsored)
538- then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
539- else nil
540- 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)
541- if (isBid)
542- then [soldData, bidUpdate, bidDelOld] :: buyRes
543- else soldData :: buyRes
544- }
545- else throw("Strict value is not equal to itself.")
546- }
547- else throw("Strict value is not equal to itself.")
548- }
516+ then {
517+ let swap_fee_to_art = if ((assetId != artAssetId))
518+ then invoke(Address(fromBase58String(puzzle_art_pool)), "swap", [artAssetId_str, 1], [AttachedPayment(assetId, amount_commission_for_sign_to_swap)])
519+ else unit
520+ if ((swap_fee_to_art == swap_fee_to_art))
521+ then {
522+ let amount_art_after = getBalance(artAssetId)
523+ if ((amount_art_after == amount_art_after))
524+ then {
525+ let commissionsWithAgent = if ((amountForAgent != 0))
526+ then [ScriptTransfer(Address(fromBase58String(feeReceiver)), if ((assetId == artAssetId))
527+ then (amountForSign - amountForAgent)
528+ else (amount_art_after - amount_art_before), artAssetId), ScriptTransfer(Address(fromBase58String(agent)), amountForAgent, assetId)]
529+ else [ScriptTransfer(Address(fromBase58String(feeReceiver)), if ((assetId == artAssetId))
530+ then amountForSign
531+ else (amount_art_after - amount_art_before), artAssetId)]
532+ let commissionsWithPublicAgent = if ((amountForPublicAgent != 0))
533+ then [ScriptTransfer(Address(fromBase58String(publicAgent)), amountForPublicAgent, assetId), ScriptTransfer(Address(fromBase58String(issuer)), (amountForCreator - amountForPublicAgent), assetId)]
534+ else [ScriptTransfer(Address(fromBase58String(issuer)), amountForCreator, assetId)]
535+ let txToCaller = if (isSponsored)
536+ then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
537+ else nil
538+ 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)
539+ if (isBid)
540+ then [soldData, bidUpdate, bidDelOld] :: buyRes
541+ else soldData :: buyRes
542+ }
543+ else throw("Strict value is not equal to itself.")
544+ }
545+ else throw("Strict value is not equal to itself.")
546+ }
549547 else throw("Strict value is not equal to itself.")
550548 }
551549 }
578576
579577 @Callable(i)
580578 func addArtwork (name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = {
581- let $t02161721690 = idCallerDateSponsored(i, pubKey)
582- let artId = $t02161721690._1
583- let caller = $t02161721690._2
584- let date = $t02161721690._3
585- let isSponsored = $t02161721690._4
586- let $t02170021769 = setLIcence(cidLicence, sha256Licence)
587- let licenceCID = $t02170021769._1
588- let licenceHash = $t02170021769._2
579+ let $t02154421617 = idCallerDateSponsored(i, pubKey)
580+ let artId = $t02154421617._1
581+ let caller = $t02154421617._2
582+ let date = $t02154421617._3
583+ let isSponsored = $t02154421617._4
584+ let $t02162721696 = setLIcence(cidLicence, sha256Licence)
585+ let licenceCID = $t02162721696._1
586+ let licenceHash = $t02162721696._2
589587 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
590588 if ((validateArtwork != ""))
591589 then throw("Something went wrong!")
592590 else {
593591 let whitelisted_drop = (checkWhitelist((caller + "_free_drops")) > 0)
594- let $t02206822156 = if (whitelisted_drop)
592+ let $t02199522083 = if (whitelisted_drop)
595593 then $Tuple2(0, artAssetId)
596594 else validatePayment(i)
597- let amount = $t02206822156._1
598- let assetId = $t02206822156._2
595+ let amount = $t02199522083._1
596+ let assetId = $t02199522083._2
599597 if (!(isDefined(amount)))
600598 then throw("Something went wrong")
601599 else {
620618 func updateArtwork (txid,name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = if (!(dappRunning))
621619 then throw(maintenanceMSG)
622620 else {
623- let $t02407124141 = idCallerDateSponsored(i, pubKey)
624- let id = $t02407124141._1
625- let caller = $t02407124141._2
626- let date = $t02407124141._3
627- let isSponsored = $t02407124141._4
628- let $t02415124220 = setLIcence(cidLicence, sha256Licence)
629- let licenceCID = $t02415124220._1
630- let licenceHash = $t02415124220._2
621+ let $t02399824068 = idCallerDateSponsored(i, pubKey)
622+ let id = $t02399824068._1
623+ let caller = $t02399824068._2
624+ let date = $t02399824068._3
625+ let isSponsored = $t02399824068._4
626+ let $t02407824147 = setLIcence(cidLicence, sha256Licence)
627+ let licenceCID = $t02407824147._1
628+ let licenceHash = $t02407824147._2
631629 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
632630 if ((validateArtwork != ""))
633631 then throw("Something went wrong!")
655653
656654 @Callable(i)
657655 func flagArtwork (artId,addr,flag,note) = {
658- let $t02584725881 = idCallerDate(i)
659- let id = $t02584725881._1
660- let caller = $t02584725881._2
656+ let $t02577425808 = idCallerDate(i)
657+ let id = $t02577425808._1
658+ let caller = $t02577425808._2
661659 if (containsElement([chris, toString(this)], caller))
662660 then if (containsElement(["CONSENT", "", "CHANGE_REQUIRED", "FLAGGED", "ILLEGAL"], flag))
663661 then [StringEntry(keyFlag(addr, artId), flag), StringEntry(keyNote(addr, artId), note)]
669667
670668 @Callable(i)
671669 func deleteArtwork (artId,addr) = {
672- let $t02631726351 = idCallerDate(i)
673- let id = $t02631726351._1
674- let caller = $t02631726351._2
670+ let $t02624426278 = idCallerDate(i)
671+ let id = $t02624426278._1
672+ let caller = $t02624426278._2
675673 let addrToUse = if (containsElement([chris, toString(this)], caller))
676674 then addr
677675 else caller
701699
702700 @Callable(i)
703701 func sellArtwork (artId,price,maxMint,assetId,blockEnd,pubKey) = {
704- let $t02913029200 = idCallerDateSponsored(i, pubKey)
705- let id = $t02913029200._1
706- let caller = $t02913029200._2
707- let date = $t02913029200._3
708- let isSponsored = $t02913029200._4
702+ let $t02905729127 = idCallerDateSponsored(i, pubKey)
703+ let id = $t02905729127._1
704+ let caller = $t02905729127._2
705+ let date = $t02905729127._3
706+ let isSponsored = $t02905729127._4
709707 let artworkName = getStringByKey(keyName(caller, artId))
710708 if ((artworkName == ""))
711709 then throw("This art doesn't match your account")
779777
780778 @Callable(i)
781779 func setBid (artId,issuer) = {
782- let $t03157331613 = idCallerDate(i)
783- let id = $t03157331613._1
784- let caller = $t03157331613._2
785- let date = $t03157331613._3
786- let $t03161831654 = isPayment(i)
787- let payment = $t03161831654._1
788- let amount = $t03161831654._2
780+ let $t03150031540 = idCallerDate(i)
781+ let id = $t03150031540._1
782+ let caller = $t03150031540._2
783+ let date = $t03150031540._3
784+ let $t03154531581 = isPayment(i)
785+ let payment = $t03154531581._1
786+ let amount = $t03154531581._2
789787 let assetId = if (!(isDefined(payment.assetId)))
790788 then "WAVES"
791789 else toBase58String(value(payment.assetId))
821819
822820 @Callable(i)
823821 func cancelBid (artId,issuer,bidId,bidOwner) = {
824- let $t03297833039 = idCallerDate(i)
825- let id = $t03297833039._1
826- let caller = $t03297833039._2
827- let date = $t03297833039._3
822+ let $t03290532966 = idCallerDate(i)
823+ let id = $t03290532966._1
824+ let caller = $t03290532966._2
825+ let date = $t03290532966._3
828826 if (if ((caller != bidOwner))
829827 then (caller != issuer)
830828 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 usdtPPAssetId_str = getStringByKey("conf_accepted_asset_USDT_PP")
2626
2727 let artAssetId_str = getStringByKey("conf_accepted_asset_ART")
2828
2929 let usdcPPAssetId_str = getStringByKey("conf_accepted_asset_USDC_PP")
3030
3131 let eastAssetId_str = getStringByKey("conf_accepted_asset_EAST")
3232
3333 let puzzleAssetId_str = getStringByKey("conf_accepted_asset_PUZZLE")
3434
3535 let ethPPAssetId_str = getStringByKey("conf_accepted_asset_ETH_PP")
3636
3737 let wavesAssetId_str = "WAVES"
3838
3939 let usdtPPAssetId = fromBase58String(usdtPPAssetId_str)
4040
4141 let artAssetId = fromBase58String(artAssetId_str)
4242
4343 let usdcPPAssetId = fromBase58String(usdcPPAssetId_str)
4444
4545 let eastAssetId = fromBase58String(eastAssetId_str)
4646
4747 let puzzleAssetId = fromBase58String(puzzleAssetId_str)
4848
4949 let ethPPAssetId = fromBase58String(ethPPAssetId_str)
5050
5151 let wavesAssetId = base58''
5252
5353 let all_accepted_assets = [usdtPPAssetId_str, artAssetId_str, usdcPPAssetId_str, eastAssetId_str, puzzleAssetId_str, wavesAssetId_str, ethPPAssetId_str]
5454
5555 let chris = getStringByKey("conf_admin_1")
5656
5757 func getIntegerByKeyFromOracle (key) = valueOrErrorMessage(getInteger(oracleFee, key), "Integer undefine or 0 in oracle")
5858
5959
6060 func getIntegerByKey (key) = valueOrElse(getInteger(this, key), 0)
6161
6262
6363 func checkWhitelist (key) = valueOrElse(getInteger(whitelistDapp, key), 0)
6464
6565
6666 func getBooleanByKey (key) = valueOrElse(getBoolean(this, key), false)
6767
6868
6969 let commission_fee = 8
7070
7171 let defaultLicence = getStringByKey("conf_default_licence")
7272
7373 let defaultHashLicence = getStringByKey("conf_default_licence_hash")
7474
7575 let dappRunning = valueOrElse(getBoolean(userDapp, "conf_dapp_is_running"), true)
7676
7777 let maintenanceMSG = valueOrElse(getString(userDapp, "conf_maintenance_msg"), "")
7878
7979 let userSuspended = "SUSPENDED"
8080
8181 let userRemoved = "REMOVED"
8282
8383 let userUnregistered = "UNREGISTERED"
8484
8585 let userAllowed = "ALLOWED"
8686
8787 let currentCertificationPrice = getIntegerByKeyFromOracle(("certification_fee_" + toBase58String(artAssetId)))
8888
8989 let mint_fee = getIntegerByKeyFromOracle(("mint_fee_" + toBase58String(artAssetId)))
9090
9191 func getArtworkRoyalties (key) = valueOrElse(getInteger(this, key), 1000)
9292
9393
9494 func validateCID (cid) = if (contains(cid, "/"))
9595 then if (if ((76 > size(cid)))
9696 then (size(split(cid, "/")[0]) == 59)
9797 else false)
9898 then (16 > size(split(cid, "/")[1]))
9999 else false
100100 else false
101101
102102
103103 func validateHash (hash) = (size(hash) == 64)
104104
105105
106106 func keyUserStatus (caller) = ("user_status_" + caller)
107107
108108
109109 func keyDate (caller,artId) = ((("art_date_" + artId) + "_") + caller)
110110
111111
112112 func keyName (caller,artId) = ((("art_name_" + artId) + "_") + caller)
113113
114114
115115 func keyDesc (caller,artId) = ((("art_desc_" + artId) + "_") + caller)
116116
117117
118118 func keyDisplayCid (caller,artId) = ((("art_display_cid_" + artId) + "_") + caller)
119119
120120
121121 func keyExportHash (caller,artId) = ((("art_export_hash_" + artId) + "_") + caller)
122122
123123
124124 func keyExportCid (caller,artId) = ((("art_export_cid_" + artId) + "_") + caller)
125125
126126
127127 func keyMaxMint (caller,artId) = ((("art_maxmint_" + artId) + "_") + caller)
128128
129129
130130 func keySignID (caller,artId) = ((("art_signid_" + artId) + "_") + caller)
131131
132132
133133 func keyIssued (caller,artId) = ((("art_issued_" + artId) + "_") + caller)
134134
135135
136136 func keyOnSale (caller,artId) = ((("art_onsale_" + artId) + "_") + caller)
137137
138138
139139 func keyLicenceHash (caller,artId) = ((("art_licence_hash_" + artId) + "_") + caller)
140140
141141
142142 func keyLicenceCid (caller,artId) = ((("art_licence_cid_" + artId) + "_") + caller)
143143
144144
145145 func keyTags (caller,artId) = ((("art_tags_" + artId) + "_") + caller)
146146
147147
148148 func keyType (caller,artId) = ((("art_type_" + artId) + "_") + caller)
149149
150150
151151 func keyNote (caller,artId) = ((("art_note_" + artId) + "_") + caller)
152152
153153
154154 func keyCrawler (caller,artId) = ((("art_crawler_cid_" + artId) + "_") + caller)
155155
156156
157157 func keyRoyalties (caller,artId) = ((("art_royalties_" + artId) + "_") + caller)
158158
159159
160160 func keyPrice (caller,artId) = ((("art_price_" + artId) + "_") + caller)
161161
162162
163163 func keyEndSale (caller,artId) = ((("art_endsale_" + artId) + "_") + caller)
164164
165165
166166 func keyAssetIdAccepted (caller,artId) = ((("art_assetAccepted_" + artId) + "_") + caller)
167167
168168
169169 func keyFlag (caller,artId) = ((("art_flag_" + artId) + "_") + caller)
170170
171171
172172 func keyArtistAgentAddr (artistAddr) = ("artist_agent_" + artistAddr)
173173
174174
175175 func keyPrimaryShareAgent (artistAddr) = ("artist_agent_primary_" + artistAddr)
176176
177177
178178 func keyArtistPublicAgentAddr (artistAddr) = ("artist_public_agent_" + artistAddr)
179179
180180
181181 func keyPrimarySharePublicAgent (artistAddr) = ("artist_public_agent_primary_" + artistAddr)
182182
183183
184184 func keyHashByTxidAddr (caller,txid) = ((("get_hashbytxidaddr_" + txid) + "_") + caller)
185185
186186
187187 func keyOwnerByHash (sha256Hash) = ("get_owner_by_hash_" + sha256Hash)
188188
189189
190190 func keyidBySignid (caller,signId) = ((("get_artidbysignid_" + signId) + "_") + caller)
191191
192192
193193 func validateAllCID (cidDisplay,cidExport,cidLicence) = if (!(validateCID(cidDisplay)))
194194 then throw("Wrong Display CID")
195195 else if (!(validateCID(cidExport)))
196196 then throw("Wrong Export CID")
197197 else if (if ((cidLicence != ""))
198198 then !(validateCID(cidLicence))
199199 else false)
200200 then throw("Wrong Licence CID")
201201 else true
202202
203203
204204 func validateAllHash (sha256Export,sha256Licence) = if (!(validateHash(sha256Export)))
205205 then throw("Export Hash 64 char. max")
206206 else if (!(validateHash(sha256Licence)))
207207 then throw("Licence Hash 64 char. max")
208208 else true
209209
210210
211211 func validateString (str,max) = if ((size(str) == 0))
212212 then throw("Field cannot be is empty")
213213 else if ((size(str) > max))
214214 then throw((str + " is too long"))
215215 else true
216216
217217
218218 func validateUser (caller) = {
219219 let userStatus = valueOrElse(getString(userDapp, keyUserStatus(caller)), userUnregistered)
220220 if (if ((userStatus == userUnregistered))
221221 then true
222222 else (userStatus == userAllowed))
223223 then "Register this account first with \"Account\" tab"
224224 else if ((userStatus == userSuspended))
225225 then "Account suspended"
226226 else if ((userStatus == userRemoved))
227227 then "Account removed"
228228 else ""
229229 }
230230
231231
232232 func setLIcence (cidLicence,sha256Licence) = {
233233 let cid = if ((size(cidLicence) == 0))
234234 then defaultLicence
235235 else cidLicence
236236 let hash = if ((size(sha256Licence) == 0))
237237 then defaultHashLicence
238238 else sha256Licence
239239 $Tuple2(cid, hash)
240240 }
241241
242242
243243 func validateArtworkData (caller,cidDisplay,cidExport,licenceCID,sha256Export,licenceHash,name,description,tags,royalties) = {
244244 let checkUser = validateUser(caller)
245245 if ((checkUser != ""))
246246 then throw(checkUser)
247247 else if ((size(cidDisplay) == 0))
248248 then throw("Display CID cannot be empty")
249249 else if (!(validateAllCID(cidDisplay, cidExport, licenceCID)))
250250 then throw("Problem with CID")
251251 else if (!(validateAllHash(sha256Export, licenceHash)))
252252 then throw("Problem with Hashes")
253253 else if (!(validateString(name, 100)))
254254 then throw("100 Char. max name")
255255 else if (!(validateString(description, 1000)))
256256 then throw("1000 Char. max description")
257257 else if (if ((0 > royalties))
258258 then true
259259 else (royalties > 1000))
260260 then throw("Royalties cannot be less than 0% or higher than 10%")
261261 else if ((size(split(tags, ",")) > 5))
262262 then throw("5 tags max.")
263263 else ""
264264 }
265265
266266
267267 func isPayment (i) = if ((size(i.payments) == 0))
268268 then throw("No payment attached")
269269 else {
270270 let payment = value(i.payments[0])
271271 let amount = value(payment.amount)
272272 $Tuple2(payment, amount)
273273 }
274274
275275
276276 func validatePayment (i) = {
277277 let $t01015610192 = isPayment(i)
278278 let payment = $t01015610192._1
279279 let amount = $t01015610192._2
280280 let assetId = if (if (isDefined(payment.assetId))
281281 then (payment.assetId == artAssetId)
282282 else false)
283283 then payment.assetId
284284 else throw("Only SIGN token accepted as transaction fee")
285285 if ((amount != currentCertificationPrice))
286286 then throw(("Payment amount should be " + toString(currentCertificationPrice)))
287287 else $Tuple2(amount, assetId)
288288 }
289289
290290
291291 func isArtMinted (addrToUse,artId) = match getInteger(this, keyIssued(addrToUse, artId)) {
292292 case b: Int =>
293293 if ((b != 0))
294294 then true
295295 else false
296296 case _ =>
297297 false
298298 }
299299
300300
301301 func validatePriceAssetId (i,priceAssetId,artworkPrice) = {
302302 let $t01077910815 = isPayment(i)
303303 let payment = $t01077910815._1
304304 let amount = $t01077910815._2
305305 let assetId = if (!(isDefined(payment.assetId)))
306306 then unit
307307 else if (if ((size(priceAssetId) > 0))
308308 then (toBase58String(value(payment.assetId)) == priceAssetId)
309309 else false)
310310 then payment.assetId
311311 else throw("Wrong asset id")
312312 if (if ((assetId == unit))
313313 then (priceAssetId != "")
314314 else false)
315315 then throw("Wrong asset id")
316316 else if ((artworkPrice != amount))
317317 then throw("Payment don't match")
318318 else $Tuple2(amount, assetId)
319319 }
320320
321321
322322 func acceptedAssetIds (assetId) = if (!(containsElement(all_accepted_assets, assetId)))
323323 then throw("Only $ART, USDT-PP, USDC-PP, EAST, PUZZLE, ETH or WAVES accepted")
324324 else true
325325
326326
327327 func validateMinSell (price) = if ((0 >= price))
328328 then throw("Wrong minimum sell price")
329329 else true
330330
331331
332332 func getBidAssetId (assetId) = if ((assetId == "WAVES"))
333333 then unit
334334 else fromBase58String(assetId)
335335
336336
337337 func getPriceAssetIdFromBid (bidDataKey) = {
338338 let bidData = getStringByKey((bidDataKey + "_OPEN"))
339339 if ((bidData == ""))
340340 then throw("Bid not found")
341341 else {
342342 let bidDataArr = split(bidData, "_")
343343 let bidAmount = parseIntValue(bidDataArr[1])
344344 let bidAssetId = getBidAssetId(bidDataArr[0])
345345 if ((0 >= bidAmount))
346346 then throw("Wrong amount")
347347 else $Tuple2(bidAmount, bidAssetId)
348348 }
349349 }
350350
351351
352352 func idCallerDateSponsored (i,pubKey) = if (!(dappRunning))
353353 then throw(maintenanceMSG)
354354 else {
355355 let isSponsored = if ((pubKey != ""))
356356 then valueOrElse(checkWhitelist((toString(addressFromPublicKey(fromBase58String(pubKey))) + "_free_txs")), 0)
357357 else 0
358358 let caller = if (if ((toBase58String(i.caller.bytes) == toString(this)))
359359 then (isSponsored > 0)
360360 else false)
361361 then toString(addressFromPublicKey(fromBase58String(pubKey)))
362362 else toBase58String(i.caller.bytes)
363363 let get_sponsored_waves = if (if ((pubKey != ""))
364364 then (isSponsored > 0)
365365 else false)
366366 then invoke(whitelistDapp, "useFreeTx", [toString(addressFromPublicKey(fromBase58String(pubKey)))], nil)
367367 else unit
368368 if ((get_sponsored_waves == get_sponsored_waves))
369369 then $Tuple4(toBase58String(i.transactionId), caller, lastBlock.timestamp, (isSponsored > 0))
370370 else throw("Strict value is not equal to itself.")
371371 }
372372
373373
374374 func idCallerDate (i) = if (!(dappRunning))
375375 then throw(maintenanceMSG)
376376 else $Tuple3(toBase58String(i.transactionId), toBase58String(i.caller.bytes), lastBlock.timestamp)
377377
378378
379379 func getBalance (assetId) = match assetId {
380380 case b: ByteVector =>
381381 assetBalance(this, b)
382382 case _ =>
383383 wavesBalance(this).available
384384 }
385385
386386
387387 func buyMint (i,artId,issuer,bidId,bidOwner,pubKey) = {
388388 let $t01342013509 = idCallerDateSponsored(i, pubKey)
389389 let id = $t01342013509._1
390390 let caller = $t01342013509._2
391391 let date = $t01342013509._3
392392 let isSponsored = $t01342013509._4
393393 let isBid = if (if (if ((caller == issuer))
394394 then (bidOwner != "")
395395 else false)
396396 then (bidId != "")
397397 else false)
398398 then true
399399 else false
400400 if (if (isBid)
401401 then (caller != issuer)
402402 else false)
403403 then throw("You cannot do this action")
404404 else {
405405 let blockEnd = getIntegerByKey(keyEndSale(caller, artId))
406406 if (if (if ((blockEnd != 0))
407407 then (height >= blockEnd)
408408 else false)
409409 then !(isBid)
410410 else false)
411411 then throw("Sale ended.")
412412 else {
413413 let callerIsIssuer = (caller == issuer)
414414 let totalNFT = getIntegerByKey("total_nft_issued")
415415 let artworkName = getStringByKey(keyName(issuer, artId))
416416 if ((artworkName == ""))
417417 then throw("Art doesn't exist")
418418 else {
419419 let isOnSale = getBooleanByKey(keyOnSale(issuer, artId))
420420 let amountSold = getIntegerByKey(keyIssued(issuer, artId))
421421 let artworkPrice = if (callerIsIssuer)
422422 then mint_fee
423423 else getIntegerByKey(keyPrice(issuer, artId))
424424 let priceAssetId = if (callerIsIssuer)
425425 then toBase58String(artAssetId)
426426 else getStringByKey(keyAssetIdAccepted(issuer, artId))
427427 let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
428428 if (if (if (!(isBid))
429429 then !(callerIsIssuer)
430430 else false)
431431 then if (if ((0 >= artworkPrice))
432432 then true
433433 else !(isOnSale))
434434 then true
435435 else (0 >= maxCanSell)
436436 else false)
437437 then throw("Art not for sale")
438438 else if (if (if (!(isBid))
439439 then callerIsIssuer
440440 else false)
441441 then (0 >= maxCanSell)
442442 else false)
443443 then throw("Max issuable not set")
444444 else {
445445 let checkUser = validateUser(issuer)
446446 if (if (isBid)
447447 then (checkUser != "")
448448 else false)
449449 then throw(checkUser)
450450 else {
451451 let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
452452 let $t01508615278 = if (isBid)
453453 then getPriceAssetIdFromBid(bidDataKey)
454454 else validatePriceAssetId(i, priceAssetId, artworkPrice)
455455 let amount = $t01508615278._1
456456 let assetId = $t01508615278._2
457457 let agent = valueOrElse(getString(userDapp, keyArtistAgentAddr(issuer)), feeReceiver)
458458 let agentShare = valueOrElse(getInteger(userDapp, keyPrimaryShareAgent(issuer)), 0)
459459 let publicAgent = valueOrElse(getString(userDapp, keyArtistPublicAgentAddr(issuer)), feeReceiver)
460460 let publicAgentShare = valueOrElse(getInteger(userDapp, keyPrimarySharePublicAgent(issuer)), 0)
461461 let isWhitelisted = checkWhitelist(issuer)
462462 let amountForSign = fraction(amount, commission_fee, 100)
463463 let amountForAgent = if (if (if ((agent != feeReceiver))
464464 then (agentShare > 0)
465465 else false)
466466 then (height > isWhitelisted)
467467 else false)
468468 then fraction(amount, agentShare, 10000)
469469 else 0
470470 let amountForPublicAgent = if (if (if ((publicAgent != feeReceiver))
471471 then (publicAgentShare > 0)
472472 else false)
473473 then (height > isWhitelisted)
474474 else false)
475475 then fraction(amount, publicAgentShare, 10000)
476476 else 0
477477 let amountForCreator = (amount - amountForSign)
478478 if ((amountSold == maxCanSell))
479479 then throw("Art sold out")
480480 else {
481481 let newAmountSold = (amountSold + 1)
482482 let issueMeta = ((((((((("Creator: " + issuer) + ",
483483 ArtID: ") + artId) + ",
484484 Artwork name: ") + artworkName) + ",
485485 Issue: ") + toString(newAmountSold)) + "/") + toString(maxCanSell))
486486 let issueNFT = Issue(("SA_" + toString((totalNFT + 1))), issueMeta, 1, 0, false)
487487 let idNFT = calculateAssetId(issueNFT)
488488 let sellStatus = if (if ((newAmountSold == maxCanSell))
489489 then true
490490 else !(isOnSale))
491491 then false
492492 else true
493493 let receiveNFT = if (if (if ((caller == issuer))
494494 then (bidOwner != "")
495495 else false)
496496 then (bidId != "")
497497 else false)
498498 then addressFromStringValue(bidOwner)
499499 else i.caller
500500 let assetIdBid = if (!(isDefined(assetId)))
501501 then "WAVES"
502502 else toBase58String(value(assetId))
503503 let bidData = getStringByKey((bidDataKey + "_OPEN"))
504504 let bidDelOld = DeleteEntry((bidDataKey + "_OPEN"))
505505 let bidUpdate = StringEntry((bidDataKey + "_CLOSED"), ((bidData + "_") + toString(date)))
506506 let soldKey = ((((((("art_sold_" + toString(newAmountSold)) + "_of_") + toString(maxCanSell)) + "_") + artId) + "_") + issuer)
507507 let soldValue = if (!(isBid))
508508 then ((((((((((caller + "_") + toString(date)) + "_") + id) + "_") + toString(artworkPrice)) + "_") + priceAssetId) + "_") + toBase58String(idNFT))
509509 else ((((((((((toString(receiveNFT) + "_") + toString(date)) + "_") + id) + "_") + toString(amount)) + "_") + assetIdBid) + "_") + toBase58String(idNFT))
510510 let soldData = StringEntry(soldKey, soldValue)
511511 let amount_commission_for_sign_to_swap = if ((amountForAgent != 0))
512512 then (amountForSign - amountForAgent)
513513 else amountForSign
514514 let amount_art_before = getBalance(artAssetId)
515515 if ((amount_art_before == amount_art_before))
516- then if ((assetId == unit))
517- then throw(toString(isDefined(assetId)))
518- else {
519- let swap_fee_to_art = if ((assetId != artAssetId))
520- then invoke(Address(fromBase58String(puzzle_art_pool)), "swap", [artAssetId_str, 1], [AttachedPayment(assetId, amount_commission_for_sign_to_swap)])
521- else unit
522- if ((swap_fee_to_art == swap_fee_to_art))
523- then {
524- let amount_art_after = getBalance(artAssetId)
525- if ((amount_art_after == amount_art_after))
526- then {
527- let commissionsWithAgent = if ((amountForAgent != 0))
528- then [ScriptTransfer(Address(fromBase58String(feeReceiver)), if ((assetId == artAssetId))
529- then (amountForSign - amountForAgent)
530- else (amount_art_after - amount_art_before), artAssetId), ScriptTransfer(Address(fromBase58String(agent)), amountForAgent, assetId)]
531- else [ScriptTransfer(Address(fromBase58String(feeReceiver)), if ((assetId == artAssetId))
532- then amountForSign
533- else (amount_art_after - amount_art_before), artAssetId)]
534- let commissionsWithPublicAgent = if ((amountForPublicAgent != 0))
535- then [ScriptTransfer(Address(fromBase58String(publicAgent)), amountForPublicAgent, assetId), ScriptTransfer(Address(fromBase58String(issuer)), (amountForCreator - amountForPublicAgent), assetId)]
536- else [ScriptTransfer(Address(fromBase58String(issuer)), amountForCreator, assetId)]
537- let txToCaller = if (isSponsored)
538- then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
539- else nil
540- 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)
541- if (isBid)
542- then [soldData, bidUpdate, bidDelOld] :: buyRes
543- else soldData :: buyRes
544- }
545- else throw("Strict value is not equal to itself.")
546- }
547- else throw("Strict value is not equal to itself.")
548- }
516+ then {
517+ let swap_fee_to_art = if ((assetId != artAssetId))
518+ then invoke(Address(fromBase58String(puzzle_art_pool)), "swap", [artAssetId_str, 1], [AttachedPayment(assetId, amount_commission_for_sign_to_swap)])
519+ else unit
520+ if ((swap_fee_to_art == swap_fee_to_art))
521+ then {
522+ let amount_art_after = getBalance(artAssetId)
523+ if ((amount_art_after == amount_art_after))
524+ then {
525+ let commissionsWithAgent = if ((amountForAgent != 0))
526+ then [ScriptTransfer(Address(fromBase58String(feeReceiver)), if ((assetId == artAssetId))
527+ then (amountForSign - amountForAgent)
528+ else (amount_art_after - amount_art_before), artAssetId), ScriptTransfer(Address(fromBase58String(agent)), amountForAgent, assetId)]
529+ else [ScriptTransfer(Address(fromBase58String(feeReceiver)), if ((assetId == artAssetId))
530+ then amountForSign
531+ else (amount_art_after - amount_art_before), artAssetId)]
532+ let commissionsWithPublicAgent = if ((amountForPublicAgent != 0))
533+ then [ScriptTransfer(Address(fromBase58String(publicAgent)), amountForPublicAgent, assetId), ScriptTransfer(Address(fromBase58String(issuer)), (amountForCreator - amountForPublicAgent), assetId)]
534+ else [ScriptTransfer(Address(fromBase58String(issuer)), amountForCreator, assetId)]
535+ let txToCaller = if (isSponsored)
536+ then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
537+ else nil
538+ 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)
539+ if (isBid)
540+ then [soldData, bidUpdate, bidDelOld] :: buyRes
541+ else soldData :: buyRes
542+ }
543+ else throw("Strict value is not equal to itself.")
544+ }
545+ else throw("Strict value is not equal to itself.")
546+ }
549547 else throw("Strict value is not equal to itself.")
550548 }
551549 }
552550 }
553551 }
554552 }
555553 }
556554 }
557555
558556
559557 func asString (bv) = match bv {
560558 case bv0: String =>
561559 bv0
562560 case _ =>
563561 throw("Sponsored Public Key String expected")
564562 }
565563
566564
567565 @Callable(invoke)
568566 func setConf (key,val) = {
569567 let caller = toString(invoke.caller)
570568 if (containsElement([chris, toString(this)], caller))
571569 then if (contains(key, "conf_"))
572570 then [StringEntry(key, val)]
573571 else throw("Entries starting with conf_ only")
574572 else throw("You are not allowed to change this")
575573 }
576574
577575
578576
579577 @Callable(i)
580578 func addArtwork (name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = {
581- let $t02161721690 = idCallerDateSponsored(i, pubKey)
582- let artId = $t02161721690._1
583- let caller = $t02161721690._2
584- let date = $t02161721690._3
585- let isSponsored = $t02161721690._4
586- let $t02170021769 = setLIcence(cidLicence, sha256Licence)
587- let licenceCID = $t02170021769._1
588- let licenceHash = $t02170021769._2
579+ let $t02154421617 = idCallerDateSponsored(i, pubKey)
580+ let artId = $t02154421617._1
581+ let caller = $t02154421617._2
582+ let date = $t02154421617._3
583+ let isSponsored = $t02154421617._4
584+ let $t02162721696 = setLIcence(cidLicence, sha256Licence)
585+ let licenceCID = $t02162721696._1
586+ let licenceHash = $t02162721696._2
589587 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
590588 if ((validateArtwork != ""))
591589 then throw("Something went wrong!")
592590 else {
593591 let whitelisted_drop = (checkWhitelist((caller + "_free_drops")) > 0)
594- let $t02206822156 = if (whitelisted_drop)
592+ let $t02199522083 = if (whitelisted_drop)
595593 then $Tuple2(0, artAssetId)
596594 else validatePayment(i)
597- let amount = $t02206822156._1
598- let assetId = $t02206822156._2
595+ let amount = $t02199522083._1
596+ let assetId = $t02199522083._2
599597 if (!(isDefined(amount)))
600598 then throw("Something went wrong")
601599 else {
602600 let decrease_whitelist_drop = if (whitelisted_drop)
603601 then invoke(whitelistDapp, "useFreeDrop", [caller], nil)
604602 else unit
605603 if ((decrease_whitelist_drop == decrease_whitelist_drop))
606604 then {
607605 let txToCaller = if (isSponsored)
608606 then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
609607 else nil
610608 ([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)
611609 }
612610 else throw("Strict value is not equal to itself.")
613611 }
614612 }
615613 }
616614
617615
618616
619617 @Callable(i)
620618 func updateArtwork (txid,name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = if (!(dappRunning))
621619 then throw(maintenanceMSG)
622620 else {
623- let $t02407124141 = idCallerDateSponsored(i, pubKey)
624- let id = $t02407124141._1
625- let caller = $t02407124141._2
626- let date = $t02407124141._3
627- let isSponsored = $t02407124141._4
628- let $t02415124220 = setLIcence(cidLicence, sha256Licence)
629- let licenceCID = $t02415124220._1
630- let licenceHash = $t02415124220._2
621+ let $t02399824068 = idCallerDateSponsored(i, pubKey)
622+ let id = $t02399824068._1
623+ let caller = $t02399824068._2
624+ let date = $t02399824068._3
625+ let isSponsored = $t02399824068._4
626+ let $t02407824147 = setLIcence(cidLicence, sha256Licence)
627+ let licenceCID = $t02407824147._1
628+ let licenceHash = $t02407824147._2
631629 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
632630 if ((validateArtwork != ""))
633631 then throw("Something went wrong!")
634632 else {
635633 let entryExist = getStringByKey(keyName(caller, txid))
636634 if ((entryExist == ""))
637635 then throw("Entry not found")
638636 else {
639637 let flag = getStringByKey(keyFlag(caller, txid))
640638 if ((flag == "ILLEGAL"))
641639 then throw("Cannot update ILLEGAL artwork")
642640 else if (!(isArtMinted(caller, txid)))
643641 then {
644642 let txToCaller = if (isSponsored)
645643 then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
646644 else nil
647645 ([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)
648646 }
649647 else throw("Already minted")
650648 }
651649 }
652650 }
653651
654652
655653
656654 @Callable(i)
657655 func flagArtwork (artId,addr,flag,note) = {
658- let $t02584725881 = idCallerDate(i)
659- let id = $t02584725881._1
660- let caller = $t02584725881._2
656+ let $t02577425808 = idCallerDate(i)
657+ let id = $t02577425808._1
658+ let caller = $t02577425808._2
661659 if (containsElement([chris, toString(this)], caller))
662660 then if (containsElement(["CONSENT", "", "CHANGE_REQUIRED", "FLAGGED", "ILLEGAL"], flag))
663661 then [StringEntry(keyFlag(addr, artId), flag), StringEntry(keyNote(addr, artId), note)]
664662 else throw(("Unknow status " + flag))
665663 else throw("You are not allowed")
666664 }
667665
668666
669667
670668 @Callable(i)
671669 func deleteArtwork (artId,addr) = {
672- let $t02631726351 = idCallerDate(i)
673- let id = $t02631726351._1
674- let caller = $t02631726351._2
670+ let $t02624426278 = idCallerDate(i)
671+ let id = $t02624426278._1
672+ let caller = $t02624426278._2
675673 let addrToUse = if (containsElement([chris, toString(this)], caller))
676674 then addr
677675 else caller
678676 let entryExist = valueOrErrorMessage(getStringByKey(keyName(addrToUse, artId)), "No art matching for this address")
679677 if ((entryExist == ""))
680678 then throw("No art matching for this address")
681679 else {
682680 let sha256Hash = getStringByKey(keyHashByTxidAddr(addrToUse, artId))
683681 let signID = if ((sha256Hash != ""))
684682 then getStringByKey(keySignID(addrToUse, artId))
685683 else ""
686684 let signID_legacy = if ((signID == ""))
687685 then nil
688686 else [DeleteEntry(keyidBySignid(addrToUse, signID))]
689687 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)
690688 if (!(isArtMinted(addrToUse, artId)))
691689 then if (!(dappRunning))
692690 then throw(maintenanceMSG)
693691 else dataToDelete
694692 else if (containsElement([chris, toString(this)], caller))
695693 then dataToDelete
696694 else throw("Art already minted, you cannot delete it")
697695 }
698696 }
699697
700698
701699
702700 @Callable(i)
703701 func sellArtwork (artId,price,maxMint,assetId,blockEnd,pubKey) = {
704- let $t02913029200 = idCallerDateSponsored(i, pubKey)
705- let id = $t02913029200._1
706- let caller = $t02913029200._2
707- let date = $t02913029200._3
708- let isSponsored = $t02913029200._4
702+ let $t02905729127 = idCallerDateSponsored(i, pubKey)
703+ let id = $t02905729127._1
704+ let caller = $t02905729127._2
705+ let date = $t02905729127._3
706+ let isSponsored = $t02905729127._4
709707 let artworkName = getStringByKey(keyName(caller, artId))
710708 if ((artworkName == ""))
711709 then throw("This art doesn't match your account")
712710 else {
713711 let flag = getStringByKey(keyFlag(caller, artId))
714712 if (containsElement(["CHANGE_REQUIRED", "FLAGGED", "ILLEGAL"], flag))
715713 then throw("Flagged artwork")
716714 else {
717715 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
718716 if ((0 > blockEnd))
719717 then throw("Negative end")
720718 else if (if ((blockEnd > 0))
721719 then if ((maxMint != 1))
722720 then true
723721 else (price != 0)
724722 else false)
725723 then throw("Timed offer only allowed for unique edition and offer only")
726724 else {
727725 let baseHeight = if ((blockEnd == 0))
728726 then 0
729727 else height
730728 if (!(acceptedAssetIds(assetId)))
731729 then throw("Something went wrong!")
732730 else if (!(validateMinSell(price)))
733731 then throw("Something went wrong!")
734732 else {
735733 let checkUser = validateUser(caller)
736734 if ((checkUser != ""))
737735 then throw(checkUser)
738736 else {
739737 let amountSold = getIntegerByKey(keyIssued(caller, artId))
740738 let maxCanSell = getIntegerByKey(keyMaxMint(caller, artId))
741739 if ((maxMint > 100))
742740 then throw("100 editions max per artwork")
743741 else if (if ((amountSold != 0))
744742 then (amountSold == maxCanSell)
745743 else false)
746744 then throw("Max edition reached.")
747745 else if (if ((amountSold > 0))
748746 then (maxCanSell != maxMint)
749747 else false)
750748 then throw("Cannot change maximum issuable anymore")
751749 else if (if ((bidNbr > 0))
752750 then (maxCanSell != maxMint)
753751 else false)
754752 then throw("Cannot change maximum issuable with active orders")
755753 else {
756754 let sellStatus = if (if ((price > 0))
757755 then (maxMint > 0)
758756 else false)
759757 then true
760758 else false
761759 let txToCaller = if (isSponsored)
762760 then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
763761 else nil
764762 ([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)
765763 }
766764 }
767765 }
768766 }
769767 }
770768 }
771769 }
772770
773771
774772
775773 @Callable(i)
776774 func buyArtwork (artId,issuer) = buyMint(i, artId, issuer, "", "", "")
777775
778776
779777
780778 @Callable(i)
781779 func setBid (artId,issuer) = {
782- let $t03157331613 = idCallerDate(i)
783- let id = $t03157331613._1
784- let caller = $t03157331613._2
785- let date = $t03157331613._3
786- let $t03161831654 = isPayment(i)
787- let payment = $t03161831654._1
788- let amount = $t03161831654._2
780+ let $t03150031540 = idCallerDate(i)
781+ let id = $t03150031540._1
782+ let caller = $t03150031540._2
783+ let date = $t03150031540._3
784+ let $t03154531581 = isPayment(i)
785+ let payment = $t03154531581._1
786+ let amount = $t03154531581._2
789787 let assetId = if (!(isDefined(payment.assetId)))
790788 then "WAVES"
791789 else toBase58String(value(payment.assetId))
792790 let blockEnd = getIntegerByKey(keyEndSale(issuer, artId))
793791 if (if ((blockEnd != 0))
794792 then (height >= blockEnd)
795793 else false)
796794 then throw("Sale ended.")
797795 else {
798796 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
799797 if (!(acceptedAssetIds(assetId)))
800798 then throw("asset not accepted")
801799 else if (!(validateMinSell(amount)))
802800 then throw("Wrong min sell")
803801 else {
804802 let amountSold = getIntegerByKey(keyIssued(issuer, artId))
805803 let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
806804 if ((0 >= maxCanSell))
807805 then throw("No max edition set for this artwork")
808806 else if ((amountSold >= maxCanSell))
809807 then throw("Sold out, you cannot bid")
810808 else [StringEntry((((((((("bid_" + artId) + "_") + issuer) + "_") + caller) + "_") + id) + "_OPEN"), ((((assetId + "_") + toString(amount)) + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr + 1))]
811809 }
812810 }
813811 }
814812
815813
816814
817815 @Callable(i)
818816 func acceptBid (artId,issuer,bidId,bidOwner,pubKey) = buyMint(i, artId, issuer, bidId, bidOwner, pubKey)
819817
820818
821819
822820 @Callable(i)
823821 func cancelBid (artId,issuer,bidId,bidOwner) = {
824- let $t03297833039 = idCallerDate(i)
825- let id = $t03297833039._1
826- let caller = $t03297833039._2
827- let date = $t03297833039._3
822+ let $t03290532966 = idCallerDate(i)
823+ let id = $t03290532966._1
824+ let caller = $t03290532966._2
825+ let date = $t03290532966._3
828826 if (if ((caller != bidOwner))
829827 then (caller != issuer)
830828 else false)
831829 then throw("You cannot do this action")
832830 else {
833831 let returnMoneyTo = if ((caller == issuer))
834832 then bidOwner
835833 else caller
836834 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
837835 let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
838836 let bidData = getStringByKey((bidDataKey + "_OPEN"))
839837 if ((bidData == ""))
840838 then throw("Bid not found")
841839 else {
842840 let bidDataArr = split(bidData, "_")
843841 let assetId = getBidAssetId(bidDataArr[0])
844842 let bidStatus = "CANCELED"
845843 [DeleteEntry((bidDataKey + "_OPEN")), StringEntry(((bidDataKey + "_") + bidStatus), ((bidData + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr - 1)), ScriptTransfer(Address(fromBase58String(returnMoneyTo)), parseIntValue(bidDataArr[1]), assetId)]
846844 }
847845 }
848846 }
849847
850848
851849 @Verifier(tx)
852850 func verifier () = match tx {
853851 case inv: InvokeScriptTransaction =>
854852 if (if (if (if ((inv.function == "addArtwork"))
855853 then (inv.dApp == this)
856854 else false)
857855 then (inv.fee == 500000)
858856 else false)
859857 then (inv.feeAssetId == unit)
860858 else false)
861859 then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[11])))
862860 else if (if (if (if ((inv.function == "updateArtwork"))
863861 then (inv.dApp == this)
864862 else false)
865863 then (inv.fee == 500000)
866864 else false)
867865 then (inv.feeAssetId == unit)
868866 else false)
869867 then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[12])))
870868 else if (if (if (if ((inv.function == "sellArtwork"))
871869 then (inv.dApp == this)
872870 else false)
873871 then (inv.fee == 500000)
874872 else false)
875873 then (inv.feeAssetId == unit)
876874 else false)
877875 then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[5])))
878876 else if (if (if (if ((inv.function == "acceptBid"))
879877 then (inv.dApp == this)
880878 else false)
881879 then (inv.fee == 500000)
882880 else false)
883881 then (inv.feeAssetId == unit)
884882 else false)
885883 then sigVerify_128Kb(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[4])))
886884 else sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
887885 case _ =>
888886 sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
889887 }
890888

github/deemru/w8io/c3f4982 
94.29 ms