tx · 3Qvtgv2zhZm1XgKLCga3564CwQZtibtMJziJZAJo1GMb

3NBynfbXC2KastUxhukcMUaE58K9cBdB9UY:  -0.02400000 Waves

2023.01.19 10:14 [2411494] smart account 3NBynfbXC2KastUxhukcMUaE58K9cBdB9UY > SELF 0.00000000 Waves

{ "type": 13, "id": "3Qvtgv2zhZm1XgKLCga3564CwQZtibtMJziJZAJo1GMb", "fee": 2400000, "feeAssetId": null, "timestamp": 1674112470838, "version": 2, "chainId": 84, "sender": "3NBynfbXC2KastUxhukcMUaE58K9cBdB9UY", "senderPublicKey": "J9DCtJJxJBWZdtDR12BA1U94Q3cZzMi4R6k5hYkAzmzC", "proofs": [ "Ndmqkpm478qgZpGy8Se5xFRBbQLnz8VVhLYLpR34hS8SDAbjcALqDB7FP5m9LydZ5YeLhMoKsPaDtRb8abre2cR" ], "script": "base64:BgJfCAISBAoCCAgSEAoOCAgICAgICAgICAgIAQgSDwoNCAgICAgICAgICAgBCBIGCgQICAgIEgQKAggIEggKBggBAQgBCBIECgIICBIECgIICBIGCgQICAgIEgYKBAgICAhOAAdWRVJTSU9OAgUxLjEuOQEOZ2V0U3RyaW5nQnlLZXkBA2tleQkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzBQNrZXkCAAAIdW5pdFRlc3QHAAlvcmFjbGVGZWUJAQV2YWx1ZQEJAKYIAQkBDmdldFN0cmluZ0J5S2V5AQIPY29uZl9vcmFjbGVfZmVlAAhzaWduRGFwcAkBBXZhbHVlAQkApggBCQEOZ2V0U3RyaW5nQnlLZXkBAhFjb25mX3NpZ253ZWJfZGFwcAALZmVlUmVjZWl2ZXIJAQ5nZXRTdHJpbmdCeUtleQECEWNvbmZfZmVlX3JlY2VpdmVyAAh1c2VyRGFwcAMFCHVuaXRUZXN0CQEFdmFsdWUBCQCmCAECIzNNdDRSR01FeWpTV1lBb2NUUHFkNTV3ZEhRUUIzUFUyVUNtCQEFdmFsdWUBCQCmCAEJAQ5nZXRTdHJpbmdCeUtleQECD2NvbmZfdXNlcnNfZGFwcAANd2hpdGVsaXN0RGFwcAkBBXZhbHVlAQkApggBCQEOZ2V0U3RyaW5nQnlLZXkBAhNjb25mX3doaXRlbGlzdF9kYXBwAAtzaWduQXNzZXRJZAkA2QQBCQEOZ2V0U3RyaW5nQnlLZXkBAhhjb25mX2FjY2VwdGVkX2Fzc2V0X1NJR04AC3VzZG5Bc3NldElkCQDZBAEJAQ5nZXRTdHJpbmdCeUtleQECGGNvbmZfYWNjZXB0ZWRfYXNzZXRfVVNETgALdXNkdEFzc2V0SWQJANkEAQkBDmdldFN0cmluZ0J5S2V5AQIYY29uZl9hY2NlcHRlZF9hc3NldF9VU0RUAAx3YXZlc0Fzc2V0SWQBAAAFY2hyaXMJAQ5nZXRTdHJpbmdCeUtleQECDGNvbmZfYWRtaW5fMQEZZ2V0SW50ZWdlckJ5S2V5RnJvbU9yYWNsZQEDa2V5CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUJb3JhY2xlRmVlBQNrZXkCH0ludGVnZXIgdW5kZWZpbmUgb3IgMCBpbiBvcmFjbGUBD2dldEludGVnZXJCeUtleQEDa2V5CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFA2tleQAAAQ5jaGVja1doaXRlbGlzdAEDa2V5CQELdmFsdWVPckVsc2UCCQCaCAIFDXdoaXRlbGlzdERhcHAFA2tleQAAAQ9nZXRCb29sZWFuQnlLZXkBA2tleQkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzBQNrZXkHAAdzaWduQ3V0AAcAC3VzZG5XYXZlQ3V0AAoADmRlZmF1bHRMaWNlbmNlCQEOZ2V0U3RyaW5nQnlLZXkBAhRjb25mX2RlZmF1bHRfbGljZW5jZQASZGVmYXVsdEhhc2hMaWNlbmNlCQEOZ2V0U3RyaW5nQnlLZXkBAhljb25mX2RlZmF1bHRfbGljZW5jZV9oYXNoAAtkYXBwUnVubmluZwkBC3ZhbHVlT3JFbHNlAgkAmwgCBQh1c2VyRGFwcAIUY29uZl9kYXBwX2lzX3J1bm5pbmcGAA5tYWludGVuYW5jZU1TRwkBC3ZhbHVlT3JFbHNlAgkAnQgCBQh1c2VyRGFwcAIUY29uZl9tYWludGVuYW5jZV9tc2cCAAANdXNlclN1c3BlbmRlZAIJU1VTUEVOREVEAAt1c2VyUmVtb3ZlZAIHUkVNT1ZFRAAQdXNlclVucmVnaXN0ZXJlZAIMVU5SRUdJU1RFUkVEAAt1c2VyQWxsb3dlZAIHQUxMT1dFRAAZY3VycmVudENlcnRpZmljYXRpb25QcmljZQkBGWdldEludGVnZXJCeUtleUZyb21PcmFjbGUBCQCsAgICEmNlcnRpZmljYXRpb25fZmVlXwkA2AQBBQtzaWduQXNzZXRJZAETZ2V0QXJ0d29ya1JveWFsdGllcwEDa2V5CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFA2tleQDoBwEUY2hlY2tTaWduQ2VydGlmaWNhdGUDBnNpZ25JRAVPd25lcgpzaGEyNTZIYXNoBAckbWF0Y2gwCQCdCAIFCHNpZ25EYXBwCQCsAgIJAKwCAgkArAICAghkYXRhX2ZjXwUGc2lnbklEAgFfBQVPd25lcgMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDADCQEIY29udGFpbnMCBQFhBQpzaGEyNTZIYXNoBgcHAQt2YWxpZGF0ZUNJRAEDY2lkAwkBCGNvbnRhaW5zAgUDY2lkAgEvAwMJAGYCAEwJALECAQUDY2lkCQAAAgkAsQIBCQCRAwIJALUJAgUDY2lkAgEvAAAAOwcJAGYCABAJALECAQkAkQMCCQC1CQIFA2NpZAIBLwABBwcBDHZhbGlkYXRlSGFzaAEEaGFzaAkAAAIJALECAQUEaGFzaABAAQ1rZXlVc2VyU3RhdHVzAQZjYWxsZXIJAKwCAgIMdXNlcl9zdGF0dXNfBQZjYWxsZXIBB2tleURhdGUCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIJYXJ0X2RhdGVfBQVhcnRJZAIBXwUGY2FsbGVyAQdrZXlOYW1lAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICCWFydF9uYW1lXwUFYXJ0SWQCAV8FBmNhbGxlcgEHa2V5RGVzYwIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAglhcnRfZGVzY18FBWFydElkAgFfBQZjYWxsZXIBDWtleURpc3BsYXlDaWQCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIQYXJ0X2Rpc3BsYXlfY2lkXwUFYXJ0SWQCAV8FBmNhbGxlcgENa2V5RXhwb3J0SGFzaAIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAhBhcnRfZXhwb3J0X2hhc2hfBQVhcnRJZAIBXwUGY2FsbGVyAQxrZXlFeHBvcnRDaWQCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIPYXJ0X2V4cG9ydF9jaWRfBQVhcnRJZAIBXwUGY2FsbGVyAQprZXlNYXhNaW50AgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICDGFydF9tYXhtaW50XwUFYXJ0SWQCAV8FBmNhbGxlcgEJa2V5U2lnbklEAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICC2FydF9zaWduaWRfBQVhcnRJZAIBXwUGY2FsbGVyAQlrZXlJc3N1ZWQCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgILYXJ0X2lzc3VlZF8FBWFydElkAgFfBQZjYWxsZXIBCWtleU9uU2FsZQIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAgthcnRfb25zYWxlXwUFYXJ0SWQCAV8FBmNhbGxlcgEOa2V5TGljZW5jZUhhc2gCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIRYXJ0X2xpY2VuY2VfaGFzaF8FBWFydElkAgFfBQZjYWxsZXIBDWtleUxpY2VuY2VDaWQCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIQYXJ0X2xpY2VuY2VfY2lkXwUFYXJ0SWQCAV8FBmNhbGxlcgEHa2V5VGFncwIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAglhcnRfdGFnc18FBWFydElkAgFfBQZjYWxsZXIBB2tleVR5cGUCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIJYXJ0X3R5cGVfBQVhcnRJZAIBXwUGY2FsbGVyAQdrZXlOb3RlAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICCWFydF9ub3RlXwUFYXJ0SWQCAV8FBmNhbGxlcgEKa2V5Q3Jhd2xlcgIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAhBhcnRfY3Jhd2xlcl9jaWRfBQVhcnRJZAIBXwUGY2FsbGVyAQxrZXlSb3lhbHRpZXMCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIOYXJ0X3JveWFsdGllc18FBWFydElkAgFfBQZjYWxsZXIBCGtleVByaWNlAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICCmFydF9wcmljZV8FBWFydElkAgFfBQZjYWxsZXIBCmtleUVuZFNhbGUCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIMYXJ0X2VuZHNhbGVfBQVhcnRJZAIBXwUGY2FsbGVyARJrZXlBc3NldElkQWNjZXB0ZWQCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgISYXJ0X2Fzc2V0QWNjZXB0ZWRfBQVhcnRJZAIBXwUGY2FsbGVyAQdrZXlGbGFnAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICCWFydF9mbGFnXwUFYXJ0SWQCAV8FBmNhbGxlcgESa2V5QXJ0aXN0QWdlbnRBZGRyAQphcnRpc3RBZGRyCQCsAgICDWFydGlzdF9hZ2VudF8FCmFydGlzdEFkZHIBD2tleVByaW1hcnlTaGFyZQEKYXJ0aXN0QWRkcgkArAICAhVhcnRpc3RfYWdlbnRfcHJpbWFyeV8FCmFydGlzdEFkZHIBEWtleUhhc2hCeVR4aWRBZGRyAgZjYWxsZXIEdHhpZAkArAICCQCsAgIJAKwCAgITZ2V0X2hhc2hieXR4aWRhZGRyXwUEdHhpZAIBXwUGY2FsbGVyAQ5rZXlPd25lckJ5SGFzaAEKc2hhMjU2SGFzaAkArAICAhJnZXRfb3duZXJfYnlfaGFzaF8FCnNoYTI1Nkhhc2gBDWtleWlkQnlTaWduaWQCBmNhbGxlcgZzaWduSWQJAKwCAgkArAICCQCsAgICEmdldF9hcnRpZGJ5c2lnbmlkXwUGc2lnbklkAgFfBQZjYWxsZXIBEmtleVR4aWRCeUhhc2hPd25lcgIKc2hhMjU2SGFzaAZjYWxsZXIJAKwCAgIXZ2V0X3R4aWRfYnlfaGFzaF9vd25lcl8JANgEAQkA1BYBCQCbAwEJAKwCAgUKc2hhMjU2SGFzaAUGY2FsbGVyAQ52YWxpZGF0ZUFsbENJRAMKY2lkRGlzcGxheQljaWRFeHBvcnQKY2lkTGljZW5jZQMJAQEhAQkBC3ZhbGlkYXRlQ0lEAQUKY2lkRGlzcGxheQkAAgECEVdyb25nIERpc3BsYXkgQ0lEAwkBASEBCQELdmFsaWRhdGVDSUQBBQljaWRFeHBvcnQJAAIBAhBXcm9uZyBFeHBvcnQgQ0lEAwMJAQIhPQIFCmNpZExpY2VuY2UCAAkBASEBCQELdmFsaWRhdGVDSUQBBQpjaWRMaWNlbmNlBwkAAgECEVdyb25nIExpY2VuY2UgQ0lEBgEPdmFsaWRhdGVBbGxIYXNoAgxzaGEyNTZFeHBvcnQNc2hhMjU2TGljZW5jZQMJAQEhAQkBDHZhbGlkYXRlSGFzaAEFDHNoYTI1NkV4cG9ydAkAAgECGEV4cG9ydCBIYXNoIDY0IGNoYXIuIG1heAMJAQEhAQkBDHZhbGlkYXRlSGFzaAEFDXNoYTI1NkxpY2VuY2UJAAIBAhlMaWNlbmNlIEhhc2ggNjQgY2hhci4gbWF4BgEOdmFsaWRhdGVTdHJpbmcCA3N0cgNtYXgDCQAAAgkAsQIBBQNzdHIAAAkAAgECGEZpZWxkIGNhbm5vdCBiZSBpcyBlbXB0eQMJAGYCCQCxAgEFA3N0cgUDbWF4CQACAQkArAICBQNzdHICDCBpcyB0b28gbG9uZwYBDHZhbGlkYXRlVXNlcgEGY2FsbGVyBAp1c2VyU3RhdHVzCQELdmFsdWVPckVsc2UCCQCdCAIFCHVzZXJEYXBwCQENa2V5VXNlclN0YXR1cwEFBmNhbGxlcgUQdXNlclVucmVnaXN0ZXJlZAMDCQAAAgUKdXNlclN0YXR1cwUQdXNlclVucmVnaXN0ZXJlZAYJAAACBQp1c2VyU3RhdHVzBQt1c2VyQWxsb3dlZAIuUmVnaXN0ZXIgdGhpcyBhY2NvdW50IGZpcnN0IHdpdGggIkFjY291bnQiIHRhYgMJAAACBQp1c2VyU3RhdHVzBQ11c2VyU3VzcGVuZGVkAhFBY2NvdW50IHN1c3BlbmRlZAMJAAACBQp1c2VyU3RhdHVzBQt1c2VyUmVtb3ZlZAIPQWNjb3VudCByZW1vdmVkAgABCnNldExJY2VuY2UCCmNpZExpY2VuY2UNc2hhMjU2TGljZW5jZQQDY2lkAwkAAAIJALECAQUKY2lkTGljZW5jZQAABQ5kZWZhdWx0TGljZW5jZQUKY2lkTGljZW5jZQQEaGFzaAMJAAACCQCxAgEFDXNoYTI1NkxpY2VuY2UAAAUSZGVmYXVsdEhhc2hMaWNlbmNlBQ1zaGEyNTZMaWNlbmNlCQCUCgIFA2NpZAUEaGFzaAETdmFsaWRhdGVBcnR3b3JrRGF0YQoGY2FsbGVyCmNpZERpc3BsYXkJY2lkRXhwb3J0CmxpY2VuY2VDSUQMc2hhMjU2RXhwb3J0C2xpY2VuY2VIYXNoBG5hbWULZGVzY3JpcHRpb24EdGFncwlyb3lhbHRpZXMECWNoZWNrVXNlcgkBDHZhbGlkYXRlVXNlcgEFBmNhbGxlcgMJAQIhPQIFCWNoZWNrVXNlcgIACQACAQUJY2hlY2tVc2VyAwkAAAIJALECAQUKY2lkRGlzcGxheQAACQACAQIbRGlzcGxheSBDSUQgY2Fubm90IGJlIGVtcHR5AwkBASEBCQEOdmFsaWRhdGVBbGxDSUQDBQpjaWREaXNwbGF5BQljaWRFeHBvcnQFCmxpY2VuY2VDSUQJAAIBAhBQcm9ibGVtIHdpdGggQ0lEAwkBASEBCQEPdmFsaWRhdGVBbGxIYXNoAgUMc2hhMjU2RXhwb3J0BQtsaWNlbmNlSGFzaAkAAgECE1Byb2JsZW0gd2l0aCBIYXNoZXMDCQEBIQEJAQ52YWxpZGF0ZVN0cmluZwIFBG5hbWUAZAkAAgECEjEwMCBDaGFyLiBtYXggbmFtZQMJAQEhAQkBDnZhbGlkYXRlU3RyaW5nAgULZGVzY3JpcHRpb24A6AcJAAIBAhoxMDAwIENoYXIuIG1heCBkZXNjcmlwdGlvbgMDCQBmAgAABQlyb3lhbHRpZXMGCQBmAgUJcm95YWx0aWVzAOgHCQACAQIzUm95YWx0aWVzIGNhbm5vdCBiZSBsZXNzIHRoYW4gMCUgb3IgaGlnaGVyIHRoYW4gMTAlAwkAZgIJAJADAQkAtQkCBQR0YWdzAgEsAAUJAAIBAgs1IHRhZ3MgbWF4LgIAAQlpc1BheW1lbnQBAWkDCQAAAgkAkAMBCAUBaQhwYXltZW50cwAACQACAQITTm8gcGF5bWVudCBhdHRhY2hlZAQHcGF5bWVudAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwAABAZhbW91bnQJAQV2YWx1ZQEIBQdwYXltZW50BmFtb3VudAkAlAoCBQdwYXltZW50BQZhbW91bnQBD3ZhbGlkYXRlUGF5bWVudAEBaQQLJHQwODg3Nzg5MTMJAQlpc1BheW1lbnQBBQFpBAdwYXltZW50CAULJHQwODg3Nzg5MTMCXzEEBmFtb3VudAgFCyR0MDg4Nzc4OTEzAl8yBAdhc3NldElkAwMJAQlpc0RlZmluZWQBCAUHcGF5bWVudAdhc3NldElkCQAAAggFB3BheW1lbnQHYXNzZXRJZAULc2lnbkFzc2V0SWQHCAUHcGF5bWVudAdhc3NldElkCQACAQIrT25seSBTSUdOIHRva2VuIGFjY2VwdGVkIGFzIHRyYW5zYWN0aW9uIGZlZQMJAQIhPQIFBmFtb3VudAUZY3VycmVudENlcnRpZmljYXRpb25QcmljZQkAAgEJAKwCAgIZUGF5bWVudCBhbW91bnQgc2hvdWxkIGJlIAkApAMBBRljdXJyZW50Q2VydGlmaWNhdGlvblByaWNlCQCUCgIFBmFtb3VudAUHYXNzZXRJZAELaXNBcnRNaW50ZWQCCWFkZHJUb1VzZQVhcnRJZAQHJG1hdGNoMAkAmggCBQR0aGlzCQEJa2V5SXNzdWVkAgUJYWRkclRvVXNlBQVhcnRJZAMJAAECBQckbWF0Y2gwAgNJbnQEAWIFByRtYXRjaDADCQECIT0CBQFiAAAGBwcBFHZhbGlkYXRlUHJpY2VBc3NldElkAwFpDHByaWNlQXNzZXRJZAxhcnR3b3JrUHJpY2UECyR0MDk1MDE5NTM3CQEJaXNQYXltZW50AQUBaQQHcGF5bWVudAgFCyR0MDk1MDE5NTM3Al8xBAZhbW91bnQIBQskdDA5NTAxOTUzNwJfMgQHYXNzZXRJZAMJAQEhAQkBCWlzRGVmaW5lZAEIBQdwYXltZW50B2Fzc2V0SWQFBHVuaXQDAwkAZgIJALECAQUMcHJpY2VBc3NldElkAAAJAAACCQDYBAEJAQV2YWx1ZQEIBQdwYXltZW50B2Fzc2V0SWQFDHByaWNlQXNzZXRJZAcIBQdwYXltZW50B2Fzc2V0SWQJAAIBAg5Xcm9uZyBhc3NldCBpZAMDCQAAAgUHYXNzZXRJZAUEdW5pdAkBAiE9AgUMcHJpY2VBc3NldElkAgAHCQACAQIOV3JvbmcgYXNzZXQgaWQDCQECIT0CBQxhcnR3b3JrUHJpY2UFBmFtb3VudAkAAgECE1BheW1lbnQgZG9uJ3QgbWF0Y2gJAJQKAgUGYW1vdW50BQdhc3NldElkARBhY2NlcHRlZEFzc2V0SWRzAQdhc3NldElkAwMDAwMJAQIhPQIFB2Fzc2V0SWQJANgEAQULc2lnbkFzc2V0SWQJAQIhPQIFB2Fzc2V0SWQJANgEAQUMd2F2ZXNBc3NldElkBwkBAiE9AgUHYXNzZXRJZAIFV0FWRVMHCQECIT0CBQdhc3NldElkCQDYBAEFC3VzZG5Bc3NldElkBwkBAiE9AgUHYXNzZXRJZAkA2AQBBQt1c2R0QXNzZXRJZAcJAAIBAiZPbmx5IFNJR04sIFVTRE4sVVNEVCBvciBXQVZFUyBhY2NlcHRlZAYBD3ZhbGlkYXRlTWluU2VsbAIHYXNzZXRJZAVwcmljZQQMbWluU2VsbFdhdmVzAwUIdW5pdFRlc3QACgkBGWdldEludGVnZXJCeUtleUZyb21PcmFjbGUBAg53YXZlc19taW5fc2VsbAQLbWluU2VsbFVzZG4AwIQ9BAttaW5TZWxsU2lnbgMFCHVuaXRUZXN0AAEJAGgCBRljdXJyZW50Q2VydGlmaWNhdGlvblByaWNlAAIDAwMDAwMJAAACBQdhc3NldElkCQDYBAEFC3VzZG5Bc3NldElkCQBmAgULbWluU2VsbFVzZG4FBXByaWNlBwkBAiE9AgUFcHJpY2UAAAcGAwMJAAACBQdhc3NldElkCQDYBAEFC3VzZHRBc3NldElkCQBmAgULbWluU2VsbFVzZG4FBXByaWNlBwkBAiE9AgUFcHJpY2UAAAcGAwMJAAACBQdhc3NldElkCQDYBAEFC3NpZ25Bc3NldElkCQBmAgULbWluU2VsbFNpZ24FBXByaWNlBwkBAiE9AgUFcHJpY2UAAAcGAwMDCQAAAgUHYXNzZXRJZAkA2AQBBQx3YXZlc0Fzc2V0SWQGCQAAAgUHYXNzZXRJZAIFV0FWRVMJAGYCBQxtaW5TZWxsV2F2ZXMFBXByaWNlBwkBAiE9AgUFcHJpY2UAAAcJAAIBAhhXcm9uZyBtaW5pbXVtIHNlbGwgcHJpY2UGAQ1nZXRCaWRBc3NldElkAQdhc3NldElkAwkAAAIFB2Fzc2V0SWQCBVdBVkVTBQR1bml0CQDZBAEFB2Fzc2V0SWQBFmdldFByaWNlQXNzZXRJZEZyb21CaWQBCmJpZERhdGFLZXkEB2JpZERhdGEJAQ5nZXRTdHJpbmdCeUtleQEJAKwCAgUKYmlkRGF0YUtleQIFX09QRU4DCQAAAgUHYmlkRGF0YQIACQACAQINQmlkIG5vdCBmb3VuZAQKYmlkRGF0YUFycgkAtQkCBQdiaWREYXRhAgFfBAliaWRBbW91bnQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQpiaWREYXRhQXJyAAEECmJpZEFzc2V0SWQJAQ1nZXRCaWRBc3NldElkAQkAkQMCBQpiaWREYXRhQXJyAAADCQBnAgAABQliaWRBbW91bnQJAAIBAgxXcm9uZyBhbW91bnQJAJQKAgUJYmlkQW1vdW50BQpiaWRBc3NldElkARVpZENhbGxlckRhdGVTcG9uc29yZWQCAWkGcHViS2V5AwkBASEBBQtkYXBwUnVubmluZwkAAgEFDm1haW50ZW5hbmNlTVNHBAZjYWxsZXIDAwkAAAIJANgEAQgIBQFpBmNhbGxlcgVieXRlcwkApQgBBQR0aGlzCQAAAgkAkAMBCAUBaQhwYXltZW50cwAABwkApQgBCQCnCAEJANkEAQUGcHViS2V5CQDYBAEICAUBaQZjYWxsZXIFYnl0ZXMEE2dldF9zcG9uc29yZWRfd2F2ZXMDCQECIT0CBQZwdWJLZXkCAAkA/AcEBQ13aGl0ZWxpc3REYXBwAgl1c2VGcmVlVHgJAMwIAgkApQgBCQCnCAEJANkEAQUGcHViS2V5BQNuaWwFA25pbAUEdW5pdAMJAAACBRNnZXRfc3BvbnNvcmVkX3dhdmVzBRNnZXRfc3BvbnNvcmVkX3dhdmVzCQCVCgMJANgEAQgFAWkNdHJhbnNhY3Rpb25JZAUGY2FsbGVyCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEMaWRDYWxsZXJEYXRlAQFpAwkBASEBBQtkYXBwUnVubmluZwkAAgEFDm1haW50ZW5hbmNlTVNHCQCVCgMJANgEAQgFAWkNdHJhbnNhY3Rpb25JZAkA2AQBCAgFAWkGY2FsbGVyBWJ5dGVzCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAEHYnV5TWludAUBaQVhcnRJZAZpc3N1ZXIFYmlkSWQIYmlkT3duZXIEDSR0MDEyNjU3MTI3MTYJAQxpZENhbGxlckRhdGUBBQFpBAJpZAgFDSR0MDEyNjU3MTI3MTYCXzEEBmNhbGxlcggFDSR0MDEyNjU3MTI3MTYCXzIEBGRhdGUIBQ0kdDAxMjY1NzEyNzE2Al8zBAVpc0JpZAMDAwkAAAIFBmNhbGxlcgUGaXNzdWVyCQECIT0CBQhiaWRPd25lcgIABwkBAiE9AgUFYmlkSWQCAAcGBwQIYmxvY2tFbmQJAQ9nZXRJbnRlZ2VyQnlLZXkBCQEKa2V5RW5kU2FsZQIFBmNhbGxlcgUFYXJ0SWQDAwMJAQIhPQIFCGJsb2NrRW5kAAAJAGcCBQZoZWlnaHQFCGJsb2NrRW5kBwkBASEBBQVpc0JpZAcJAAIBAgtTYWxlIGVuZGVkLgQOY2FsbGVySXNJc3N1ZXIJAAACBQZjYWxsZXIFBmlzc3VlcgQIdG90YWxORlQJAQ9nZXRJbnRlZ2VyQnlLZXkBAhB0b3RhbF9uZnRfaXNzdWVkBAZzaWduSUQJAQ5nZXRTdHJpbmdCeUtleQEJAQlrZXlTaWduSUQCBQZpc3N1ZXIFBWFydElkBAthcnR3b3JrTmFtZQkBDmdldFN0cmluZ0J5S2V5AQkBB2tleU5hbWUCBQZpc3N1ZXIFBWFydElkAwkAAAIFC2FydHdvcmtOYW1lAgAJAAIBAhFBcnQgZG9lc24ndCBleGlzdAQIaXNPblNhbGUJAQ9nZXRCb29sZWFuQnlLZXkBCQEJa2V5T25TYWxlAgUGaXNzdWVyBQVhcnRJZAQKYW1vdW50U29sZAkBD2dldEludGVnZXJCeUtleQEJAQlrZXlJc3N1ZWQCBQZpc3N1ZXIFBWFydElkBAxhcnR3b3JrUHJpY2UDBQ5jYWxsZXJJc0lzc3VlcgkAaAIFGWN1cnJlbnRDZXJ0aWZpY2F0aW9uUHJpY2UAAgkBD2dldEludGVnZXJCeUtleQEJAQhrZXlQcmljZQIFBmlzc3VlcgUFYXJ0SWQEDHByaWNlQXNzZXRJZAMFDmNhbGxlcklzSXNzdWVyCQDYBAEFC3NpZ25Bc3NldElkCQEOZ2V0U3RyaW5nQnlLZXkBCQESa2V5QXNzZXRJZEFjY2VwdGVkAgUGaXNzdWVyBQVhcnRJZAQKbWF4Q2FuU2VsbAkBD2dldEludGVnZXJCeUtleQEJAQprZXlNYXhNaW50AgUGaXNzdWVyBQVhcnRJZAMDAwkBASEBBQVpc0JpZAkBASEBBQ5jYWxsZXJJc0lzc3VlcgcDAwkAZwIAAAUMYXJ0d29ya1ByaWNlBgkBASEBBQhpc09uU2FsZQYJAGcCAAAFCm1heENhblNlbGwHCQACAQIQQXJ0IG5vdCBmb3Igc2FsZQMDAwkBASEBBQVpc0JpZAUOY2FsbGVySXNJc3N1ZXIHCQBnAgAABQptYXhDYW5TZWxsBwkAAgECFE1heCBpc3N1YWJsZSBub3Qgc2V0BAljaGVja1VzZXIJAQx2YWxpZGF0ZVVzZXIBBQZpc3N1ZXIDAwUFaXNCaWQJAQIhPQIFCWNoZWNrVXNlcgIABwkAAgEFCWNoZWNrVXNlcgQKYmlkRGF0YUtleQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAgRiaWRfBQVhcnRJZAIBXwUGaXNzdWVyAgFfBQhiaWRPd25lcgIBXwUFYmlkSWQEDSR0MDE0NDE5MTQ1ODYDBQVpc0JpZAkBFmdldFByaWNlQXNzZXRJZEZyb21CaWQBBQpiaWREYXRhS2V5CQEUdmFsaWRhdGVQcmljZUFzc2V0SWQDBQFpBQxwcmljZUFzc2V0SWQFDGFydHdvcmtQcmljZQQGYW1vdW50CAUNJHQwMTQ0MTkxNDU4NgJfMQQHYXNzZXRJZAgFDSR0MDE0NDE5MTQ1ODYCXzIEBWFnZW50CQELdmFsdWVPckVsc2UCCQCdCAIFCHVzZXJEYXBwCQESa2V5QXJ0aXN0QWdlbnRBZGRyAQUGaXNzdWVyBQtmZWVSZWNlaXZlcgQKYWdlbnRTaGFyZQkBC3ZhbHVlT3JFbHNlAgkAmggCBQh1c2VyRGFwcAkBD2tleVByaW1hcnlTaGFyZQEFBmlzc3VlcgAABA1pc1doaXRlbGlzdGVkCQEOY2hlY2tXaGl0ZWxpc3QBBQZpc3N1ZXIEA2N1dAMJAGYCBQ1pc1doaXRlbGlzdGVkBQZoZWlnaHQAAAMJAAACBQdhc3NldElkBQtzaWduQXNzZXRJZAUHc2lnbkN1dAULdXNkbldhdmVDdXQEDWFtb3VudEZvclNpZ24JAGsDBQZhbW91bnQFA2N1dABkBA5hbW91bnRGb3JBZ2VudAMDAwkBAiE9AgUFYWdlbnQFC2ZlZVJlY2VpdmVyCQBmAgUKYWdlbnRTaGFyZQAABwkAZgIFBmhlaWdodAUNaXNXaGl0ZWxpc3RlZAcJAGsDBQZhbW91bnQFCmFnZW50U2hhcmUAZAAABBBhbW91bnRGb3JDcmVhdG9yCQBlAgUGYW1vdW50BQ1hbW91bnRGb3JTaWduAwkAAAIFCmFtb3VudFNvbGQFCm1heENhblNlbGwJAAIBAgxBcnQgc29sZCBvdXQEDW5ld0Ftb3VudFNvbGQJAGQCBQphbW91bnRTb2xkAAEECWlzc3VlTWV0YQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICCUNyZWF0b3I6IAUGaXNzdWVyAgosCiBBcnRJRDogBQVhcnRJZAILLAogU2lnbklEOiAFBnNpZ25JRAIRLAogQXJ0d29yayBuYW1lOiAFC2FydHdvcmtOYW1lAgosCiBJc3N1ZTogCQCkAwEFDW5ld0Ftb3VudFNvbGQCAS8JAKQDAQUKbWF4Q2FuU2VsbAQIaXNzdWVORlQJAMIIBQkArAICAgNTQV8JAKQDAQkAZAIFCHRvdGFsTkZUAAEFCWlzc3VlTWV0YQABAAAHBAVpZE5GVAkAuAgBBQhpc3N1ZU5GVAQKc2VsbFN0YXR1cwMDCQAAAgUNbmV3QW1vdW50U29sZAUKbWF4Q2FuU2VsbAYJAQEhAQUIaXNPblNhbGUHBgQKcmVjZWl2ZU5GVAMDAwkAAAIFBmNhbGxlcgUGaXNzdWVyCQECIT0CBQhiaWRPd25lcgIABwkBAiE9AgUFYmlkSWQCAAcJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCGJpZE93bmVyCAUBaQZjYWxsZXIECmFzc2V0SWRCaWQDCQEBIQEJAQlpc0RlZmluZWQBBQdhc3NldElkAgVXQVZFUwkA2AQBCQEFdmFsdWUBBQdhc3NldElkBAdiaWREYXRhCQEOZ2V0U3RyaW5nQnlLZXkBCQCsAgIFCmJpZERhdGFLZXkCBV9PUEVOBAliaWREZWxPbGQJAQtEZWxldGVFbnRyeQEJAKwCAgUKYmlkRGF0YUtleQIFX09QRU4ECWJpZFVwZGF0ZQkBC1N0cmluZ0VudHJ5AgkArAICBQpiaWREYXRhS2V5AgdfQ0xPU0VECQCsAgIJAKwCAgUHYmlkRGF0YQIBXwkApAMBBQRkYXRlBAdzb2xkS2V5CQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICCWFydF9zb2xkXwkApAMBBQ1uZXdBbW91bnRTb2xkAgRfb2ZfCQCkAwEFCm1heENhblNlbGwCAV8FBWFydElkAgFfBQZpc3N1ZXIECXNvbGRWYWx1ZQMJAQEhAQUFaXNCaWQJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUGY2FsbGVyAgFfCQCkAwEFBGRhdGUCAV8FAmlkAgFfCQCkAwEFDGFydHdvcmtQcmljZQIBXwUMcHJpY2VBc3NldElkAgFfCQDYBAEFBWlkTkZUCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKUIAQUKcmVjZWl2ZU5GVAIBXwkApAMBBQRkYXRlAgFfBQJpZAIBXwkApAMBBQZhbW91bnQCAV8FCmFzc2V0SWRCaWQCAV8JANgEAQUFaWRORlQECHNvbGREYXRhCQELU3RyaW5nRW50cnkCBQdzb2xkS2V5BQlzb2xkVmFsdWUEC2NvbW1pc3Npb25zAwkBAiE9AgUOYW1vdW50Rm9yQWdlbnQAAAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQULZmVlUmVjZWl2ZXIJAGUCBQ1hbW91bnRGb3JTaWduBQ5hbW91bnRGb3JBZ2VudAUHYXNzZXRJZAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQUFYWdlbnQFDmFtb3VudEZvckFnZW50BQdhc3NldElkBQNuaWwJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFC2ZlZVJlY2VpdmVyBQ1hbW91bnRGb3JTaWduBQdhc3NldElkBQNuaWwEBmJ1eVJlcwkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEJa2V5SXNzdWVkAgUGaXNzdWVyBQVhcnRJZAUNbmV3QW1vdW50U29sZAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgICBG5mdF8JANgEAQUFaWRORlQFB3NvbGRLZXkJAMwIAgkBDEludGVnZXJFbnRyeQICEHRvdGFsX25mdF9pc3N1ZWQJAGQCBQh0b3RhbE5GVAABCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEKa2V5RW5kU2FsZQIFBmlzc3VlcgUFYXJ0SWQAAAkAzAgCCQEMQm9vbGVhbkVudHJ5AgkBCWtleU9uU2FsZQIFBmlzc3VlcgUFYXJ0SWQFCnNlbGxTdGF0dXMJAMwIAgUIaXNzdWVORlQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFBmlzc3VlcgUQYW1vdW50Rm9yQ3JlYXRvcgUHYXNzZXRJZAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQpyZWNlaXZlTkZUAAEFBWlkTkZUBQNuaWwFC2NvbW1pc3Npb25zAwUFaXNCaWQJAMwIAgUIc29sZERhdGEJAMwIAgUJYmlkVXBkYXRlCQDMCAIFCWJpZERlbE9sZAUGYnV5UmVzCQDMCAIFCHNvbGREYXRhBQZidXlSZXMBCGFzU3RyaW5nAQJidgQHJG1hdGNoMAUCYnYDCQABAgUHJG1hdGNoMAIGU3RyaW5nBANidjAFByRtYXRjaDAFA2J2MAkAAgECJFNwb25zb3JlZCBQdWJsaWMgS2V5IFN0cmluZyBleHBlY3RlZAoGaW52b2tlAQdzZXRDb25mAgNrZXkDdmFsBAZjYWxsZXIJAKUIAQgFBmludm9rZQZjYWxsZXIDCQEPY29udGFpbnNFbGVtZW50AgkAzAgCBQVjaHJpcwkAzAgCCQClCAEFBHRoaXMFA25pbAUGY2FsbGVyAwkBCGNvbnRhaW5zAgUDa2V5AgVjb25mXwkAzAgCCQELU3RyaW5nRW50cnkCBQNrZXkFA3ZhbAUDbmlsCQACAQIgRW50cmllcyBzdGFydGluZyB3aXRoIGNvbmZfIG9ubHkJAAIBAiJZb3UgYXJlIG5vdCBhbGxvd2VkIHRvIGNoYW5nZSB0aGlzAWkBCmFkZEFydHdvcmsOCnNoYTI1Nkhhc2gGc2lnbklEBG5hbWULZGVzY3JpcHRpb24EdGFncwR0eXBlCmNpZERpc3BsYXkMc2hhMjU2RXhwb3J0CWNpZEV4cG9ydA1zaGEyNTZMaWNlbmNlCmNpZExpY2VuY2UHY3Jhd2xlcglyb3lhbHRpZXMGcHViS2V5BA0kdDAxODYxOTE4Njc5CQEVaWRDYWxsZXJEYXRlU3BvbnNvcmVkAgUBaQUGcHViS2V5BAVhcnRJZAgFDSR0MDE4NjE5MTg2NzkCXzEEBmNhbGxlcggFDSR0MDE4NjE5MTg2NzkCXzIEBGRhdGUIBQ0kdDAxODYxOTE4Njc5Al8zAwkBASEBCQEMdmFsaWRhdGVIYXNoAQUKc2hhMjU2SGFzaAkAAgECJEhhc2ggc2hvdWxkIGJlIDY0IGNoYXJhY3RlcnMgbWF4aW11bQQNJHQwMTg3ODAxODg0OQkBCnNldExJY2VuY2UCBQpjaWRMaWNlbmNlBQ1zaGEyNTZMaWNlbmNlBApsaWNlbmNlQ0lECAUNJHQwMTg3ODAxODg0OQJfMQQLbGljZW5jZUhhc2gIBQ0kdDAxODc4MDE4ODQ5Al8yBA92YWxpZGF0ZUFydHdvcmsJARN2YWxpZGF0ZUFydHdvcmtEYXRhCgUGY2FsbGVyBQpjaWREaXNwbGF5BQljaWRFeHBvcnQFCmxpY2VuY2VDSUQFDHNoYTI1NkV4cG9ydAULbGljZW5jZUhhc2gFBG5hbWUFC2Rlc2NyaXB0aW9uBQR0YWdzBQlyb3lhbHRpZXMDCQECIT0CBQ92YWxpZGF0ZUFydHdvcmsCAAkAAgECFVNvbWV0aGluZyB3ZW50IHdyb25nIQQQd2hpdGVsaXN0ZWRfZHJvcAkAZgIJAQ5jaGVja1doaXRlbGlzdAEJAKwCAgUGY2FsbGVyAgtfZnJlZV9kcm9wcwAABA0kdDAxOTE0ODE5MjMyAwUQd2hpdGVsaXN0ZWRfZHJvcAkAlAoCAAAFBnNpZ25JRAkBD3ZhbGlkYXRlUGF5bWVudAEFAWkEBmFtb3VudAgFDSR0MDE5MTQ4MTkyMzICXzEEB2Fzc2V0SWQIBQ0kdDAxOTE0ODE5MjMyAl8yAwkBASEBCQEJaXNEZWZpbmVkAQUGYW1vdW50CQACAQIUU29tZXRoaW5nIHdlbnQgd3JvbmcECmVudHJ5RXhpc3QJAQ5nZXRTdHJpbmdCeUtleQEJARJrZXlUeGlkQnlIYXNoT3duZXICBQpzaGEyNTZIYXNoBQZjYWxsZXIDCQECIT0CBQplbnRyeUV4aXN0AgAJAAIBAhRZb3UgYWxyZWFkeSBhZGRlZCBpdAQJaGFzaEV4aXN0CQEOZ2V0U3RyaW5nQnlLZXkBCQEOa2V5T3duZXJCeUhhc2gBBQpzaGEyNTZIYXNoAwkBAiE9AgUJaGFzaEV4aXN0AgAJAAIBAhdIYXNoIGFscmVhZHkgcmVnaXN0ZXJlZAQPaXNTaWduQ2VydGlmaWVkCQEUY2hlY2tTaWduQ2VydGlmaWNhdGUDBQZzaWduSUQFBmNhbGxlcgUKc2hhMjU2SGFzaAMJAQEhAQUPaXNTaWduQ2VydGlmaWVkCQACAQIsU2lnbiBDZXJ0aWZpY2F0ZSBub3QgZm91bmQgZm9yIHRoaXMgYWRkcmVzcy4EF2RlY3JlYXNlX3doaXRlbGlzdF9kcm9wAwUQd2hpdGVsaXN0ZWRfZHJvcAkA/AcEBQ13aGl0ZWxpc3REYXBwAgt1c2VGcmVlRHJvcAkAzAgCCQDYBAEICAUBaQZjYWxsZXIFYnl0ZXMFA25pbAUDbmlsBQR1bml0AwkAAAIFF2RlY3JlYXNlX3doaXRlbGlzdF9kcm9wBRdkZWNyZWFzZV93aGl0ZWxpc3RfZHJvcAkAzAgCCQELU3RyaW5nRW50cnkCCQEOa2V5T3duZXJCeUhhc2gBBQpzaGEyNTZIYXNoBQZjYWxsZXIJAMwIAgkBC1N0cmluZ0VudHJ5AgkBEmtleVR4aWRCeUhhc2hPd25lcgIFCnNoYTI1Nkhhc2gFBmNhbGxlcgUFYXJ0SWQJAMwIAgkBDEludGVnZXJFbnRyeQIJAQdrZXlEYXRlAgUGY2FsbGVyBQVhcnRJZAUEZGF0ZQkAzAgCCQELU3RyaW5nRW50cnkCCQEHa2V5TmFtZQIFBmNhbGxlcgUFYXJ0SWQFBG5hbWUJAMwIAgkBC1N0cmluZ0VudHJ5AgkBB2tleURlc2MCBQZjYWxsZXIFBWFydElkBQtkZXNjcmlwdGlvbgkAzAgCCQELU3RyaW5nRW50cnkCCQENa2V5RGlzcGxheUNpZAIFBmNhbGxlcgUFYXJ0SWQFCmNpZERpc3BsYXkJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDGtleUV4cG9ydENpZAIFBmNhbGxlcgUFYXJ0SWQFCWNpZEV4cG9ydAkAzAgCCQELU3RyaW5nRW50cnkCCQENa2V5RXhwb3J0SGFzaAIFBmNhbGxlcgUFYXJ0SWQFDHNoYTI1NkV4cG9ydAkAzAgCCQELU3RyaW5nRW50cnkCCQEOa2V5TGljZW5jZUhhc2gCBQZjYWxsZXIFBWFydElkBQtsaWNlbmNlSGFzaAkAzAgCCQELU3RyaW5nRW50cnkCCQENa2V5TGljZW5jZUNpZAIFBmNhbGxlcgUFYXJ0SWQFCmxpY2VuY2VDSUQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBB2tleVR5cGUCBQZjYWxsZXIFBWFydElkBQR0eXBlCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQdrZXlUYWdzAgUGY2FsbGVyBQVhcnRJZAUEdGFncwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBCmtleU1heE1pbnQCBQZjYWxsZXIFBWFydElkAAAJAMwIAgkBC1N0cmluZ0VudHJ5AgkBCWtleVNpZ25JRAIFBmNhbGxlcgUFYXJ0SWQFBnNpZ25JRAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBCWtleUlzc3VlZAIFBmNhbGxlcgUFYXJ0SWQAAAkAzAgCCQEMQm9vbGVhbkVudHJ5AgkBCWtleU9uU2FsZQIFBmNhbGxlcgUFYXJ0SWQHCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ1rZXlpZEJ5U2lnbmlkAgUGY2FsbGVyBQZzaWduSUQFBWFydElkCQDMCAIJAQtTdHJpbmdFbnRyeQIJARFrZXlIYXNoQnlUeGlkQWRkcgIFBmNhbGxlcgUFYXJ0SWQFCnNoYTI1Nkhhc2gJAMwIAgkBC1N0cmluZ0VudHJ5AgkBCmtleUNyYXdsZXICBQZjYWxsZXIFBWFydElkBQdjcmF3bGVyCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEMa2V5Um95YWx0aWVzAgUGY2FsbGVyBQVhcnRJZAUJcm95YWx0aWVzCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQtmZWVSZWNlaXZlcgUGYW1vdW50BQtzaWduQXNzZXRJZAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDXVwZGF0ZUFydHdvcmsNBHR4aWQEbmFtZQtkZXNjcmlwdGlvbgR0YWdzBHR5cGUKY2lkRGlzcGxheQxzaGEyNTZFeHBvcnQJY2lkRXhwb3J0DXNoYTI1NkxpY2VuY2UKY2lkTGljZW5jZQdjcmF3bGVyCXJveWFsdGllcwZwdWJLZXkDCQEBIQEFC2RhcHBSdW5uaW5nCQACAQUObWFpbnRlbmFuY2VNU0cEDSR0MDIyMTc0MjIyMzEJARVpZENhbGxlckRhdGVTcG9uc29yZWQCBQFpBQZwdWJLZXkEAmlkCAUNJHQwMjIxNzQyMjIzMQJfMQQGY2FsbGVyCAUNJHQwMjIxNzQyMjIzMQJfMgQEZGF0ZQgFDSR0MDIyMTc0MjIyMzECXzMEDSR0MDIyMjQxMjIzMTAJAQpzZXRMSWNlbmNlAgUKY2lkTGljZW5jZQUNc2hhMjU2TGljZW5jZQQKbGljZW5jZUNJRAgFDSR0MDIyMjQxMjIzMTACXzEEC2xpY2VuY2VIYXNoCAUNJHQwMjIyNDEyMjMxMAJfMgQPdmFsaWRhdGVBcnR3b3JrCQETdmFsaWRhdGVBcnR3b3JrRGF0YQoFBmNhbGxlcgUKY2lkRGlzcGxheQUJY2lkRXhwb3J0BQpsaWNlbmNlQ0lEBQxzaGEyNTZFeHBvcnQFC2xpY2VuY2VIYXNoBQRuYW1lBQtkZXNjcmlwdGlvbgUEdGFncwUJcm95YWx0aWVzAwkBAiE9AgUPdmFsaWRhdGVBcnR3b3JrAgAJAAIBAhVTb21ldGhpbmcgd2VudCB3cm9uZyEECmVudHJ5RXhpc3QJAQ5nZXRTdHJpbmdCeUtleQEJAQdrZXlOYW1lAgUGY2FsbGVyBQR0eGlkAwkAAAIFCmVudHJ5RXhpc3QCAAkAAgECD0VudHJ5IG5vdCBmb3VuZAQEZmxhZwkBDmdldFN0cmluZ0J5S2V5AQkBB2tleUZsYWcCBQZjYWxsZXIFBHR4aWQDCQAAAgUEZmxhZwIHSUxMRUdBTAkAAgECHUNhbm5vdCB1cGRhdGUgSUxMRUdBTCBhcnR3b3JrAwkBASEBCQELaXNBcnRNaW50ZWQCBQZjYWxsZXIFBHR4aWQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBB2tleU5hbWUCBQZjYWxsZXIFBHR4aWQFBG5hbWUJAMwIAgkBC1N0cmluZ0VudHJ5AgkBB2tleURlc2MCBQZjYWxsZXIFBHR4aWQFC2Rlc2NyaXB0aW9uCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ1rZXlEaXNwbGF5Q2lkAgUGY2FsbGVyBQR0eGlkBQpjaWREaXNwbGF5CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQxrZXlFeHBvcnRDaWQCBQZjYWxsZXIFBHR4aWQFCWNpZEV4cG9ydAkAzAgCCQELU3RyaW5nRW50cnkCCQENa2V5RXhwb3J0SGFzaAIFBmNhbGxlcgUEdHhpZAUMc2hhMjU2RXhwb3J0CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ1rZXlMaWNlbmNlQ2lkAgUGY2FsbGVyBQR0eGlkBQpsaWNlbmNlQ0lECQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ5rZXlMaWNlbmNlSGFzaAIFBmNhbGxlcgUEdHhpZAULbGljZW5jZUhhc2gJAMwIAgkBC1N0cmluZ0VudHJ5AgkBB2tleVRhZ3MCBQZjYWxsZXIFBHR4aWQFBHRhZ3MJAMwIAgkBC1N0cmluZ0VudHJ5AgkBB2tleVR5cGUCBQZjYWxsZXIFBHR4aWQFBHR5cGUJAMwIAgkBC1N0cmluZ0VudHJ5AgkBCmtleUNyYXdsZXICBQZjYWxsZXIFBHR4aWQFB2NyYXdsZXIJAMwIAgkBDEludGVnZXJFbnRyeQIJAQxrZXlSb3lhbHRpZXMCBQZjYWxsZXIFBHR4aWQFCXJveWFsdGllcwUDbmlsCQACAQIOQWxyZWFkeSBtaW50ZWQBaQELZmxhZ0FydHdvcmsEBWFydElkBGFkZHIEZmxhZwRub3RlBA0kdDAyMzgxMTIzODQ1CQEMaWRDYWxsZXJEYXRlAQUBaQQCaWQIBQ0kdDAyMzgxMTIzODQ1Al8xBAZjYWxsZXIIBQ0kdDAyMzgxMTIzODQ1Al8yAwkBD2NvbnRhaW5zRWxlbWVudAIJAMwIAgUFY2hyaXMJAMwIAgkApQgBBQR0aGlzBQNuaWwFBmNhbGxlcgMJAQ9jb250YWluc0VsZW1lbnQCCQDMCAICB0NPTlNFTlQJAMwIAgIACQDMCAICD0NIQU5HRV9SRVFVSVJFRAkAzAgCAgdGTEFHR0VECQDMCAICB0lMTEVHQUwFA25pbAUEZmxhZwkAzAgCCQELU3RyaW5nRW50cnkCCQEHa2V5RmxhZwIFBGFkZHIFBWFydElkBQRmbGFnCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQdrZXlOb3RlAgUEYWRkcgUFYXJ0SWQFBG5vdGUFA25pbAkAAgEJAKwCAgIOVW5rbm93IHN0YXR1cyAFBGZsYWcJAAIBAhNZb3UgYXJlIG5vdCBhbGxvd2VkAWkBDWRlbGV0ZUFydHdvcmsCBWFydElkBGFkZHIEDSR0MDI0MjgxMjQzMTUJAQxpZENhbGxlckRhdGUBBQFpBAJpZAgFDSR0MDI0MjgxMjQzMTUCXzEEBmNhbGxlcggFDSR0MDI0MjgxMjQzMTUCXzIECWFkZHJUb1VzZQMJAQ9jb250YWluc0VsZW1lbnQCCQDMCAIFBWNocmlzCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQZjYWxsZXIFBGFkZHIFBmNhbGxlcgQKZW50cnlFeGlzdAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQEOZ2V0U3RyaW5nQnlLZXkBCQEHa2V5TmFtZQIFCWFkZHJUb1VzZQUFYXJ0SWQCIE5vIGFydCBtYXRjaGluZyBmb3IgdGhpcyBhZGRyZXNzAwkAAAIFCmVudHJ5RXhpc3QCAAkAAgECIE5vIGFydCBtYXRjaGluZyBmb3IgdGhpcyBhZGRyZXNzBApzaGEyNTZIYXNoCQEOZ2V0U3RyaW5nQnlLZXkBCQERa2V5SGFzaEJ5VHhpZEFkZHICBQlhZGRyVG9Vc2UFBWFydElkAwkAAAIFCnNoYTI1Nkhhc2gCAAkAAgECJU5vIGFydCBoYXNoIG1hdGNoaW5nIGZvciB0aGlzIGFkZHJlc3MEBnNpZ25JRAkBDmdldFN0cmluZ0J5S2V5AQkBCWtleVNpZ25JRAIFCWFkZHJUb1VzZQUFYXJ0SWQDCQAAAgUGc2lnbklEAgAJAAIBAhNObyBTSUdOIElEIG1hdGNoaW5nBAxkYXRhVG9EZWxldGUJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBB2tleURhdGUCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQdrZXlOYW1lAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEHa2V5RGVzYwIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBDWtleURpc3BsYXlDaWQCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQxrZXlFeHBvcnRDaWQCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQ1rZXlFeHBvcnRIYXNoAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEOa2V5TGljZW5jZUhhc2gCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQ1rZXlMaWNlbmNlQ2lkAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEHa2V5VHlwZQIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBB2tleVRhZ3MCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQprZXlNYXhNaW50AgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEJa2V5U2lnbklEAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEJa2V5SXNzdWVkAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEJa2V5T25TYWxlAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEHa2V5RmxhZwIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBCGtleVByaWNlAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQESa2V5QXNzZXRJZEFjY2VwdGVkAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEOa2V5T3duZXJCeUhhc2gBBQpzaGEyNTZIYXNoCQDMCAIJAQtEZWxldGVFbnRyeQEJAQ1rZXlpZEJ5U2lnbmlkAgUJYWRkclRvVXNlBQZzaWduSUQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBEmtleVR4aWRCeUhhc2hPd25lcgIFCnNoYTI1Nkhhc2gFCWFkZHJUb1VzZQkAzAgCCQELRGVsZXRlRW50cnkBCQEKa2V5RW5kU2FsZQIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBB2tleU5vdGUCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQprZXlDcmF3bGVyAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEMa2V5Um95YWx0aWVzAgUJYWRkclRvVXNlBQVhcnRJZAUDbmlsAwkBASEBCQELaXNBcnRNaW50ZWQCBQlhZGRyVG9Vc2UFBWFydElkAwkBASEBBQtkYXBwUnVubmluZwkAAgEFDm1haW50ZW5hbmNlTVNHBQxkYXRhVG9EZWxldGUDCQEPY29udGFpbnNFbGVtZW50AgkAzAgCBQVjaHJpcwkAzAgCCQClCAEFBHRoaXMFA25pbAUGY2FsbGVyBQxkYXRhVG9EZWxldGUJAAIBAihBcnQgYWxyZWFkeSBtaW50ZWQsIHlvdSBjYW5ub3QgZGVsZXRlIGl0AWkBC3NlbGxBcnR3b3JrBgVhcnRJZAVwcmljZQdtYXhNaW50B2Fzc2V0SWQIYmxvY2tFbmQGcHViS2V5BA0kdDAyNzE1MTI3MjAyCQEVaWRDYWxsZXJEYXRlU3BvbnNvcmVkAgUBaQUGcHViS2V5BAJpZAgFDSR0MDI3MTUxMjcyMDICXzEEBmNhbGxlcggFDSR0MDI3MTUxMjcyMDICXzIEC2FydHdvcmtOYW1lCQEOZ2V0U3RyaW5nQnlLZXkBCQEHa2V5TmFtZQIFBmNhbGxlcgUFYXJ0SWQDCQAAAgULYXJ0d29ya05hbWUCAAkAAgECI1RoaXMgYXJ0IGRvZXNuJ3QgbWF0Y2ggeW91ciBhY2NvdW50BARmbGFnCQEOZ2V0U3RyaW5nQnlLZXkBCQEHa2V5RmxhZwIFBmNhbGxlcgUFYXJ0SWQDCQEPY29udGFpbnNFbGVtZW50AgkAzAgCAg9DSEFOR0VfUkVRVUlSRUQJAMwIAgIHRkxBR0dFRAkAzAgCAgdJTExFR0FMBQNuaWwFBGZsYWcJAAIBAg9GbGFnZ2VkIGFydHdvcmsEBmJpZE5icgkBD2dldEludGVnZXJCeUtleQEJAKwCAgISY3VycmVudF9iaWRhbW91bnRfBQVhcnRJZAMJAGYCAAAFCGJsb2NrRW5kCQACAQIMTmVnYXRpdmUgZW5kAwMJAGYCBQhibG9ja0VuZAAAAwkBAiE9AgUHbWF4TWludAABBgkBAiE9AgUFcHJpY2UAAAcJAAIBAjpUaW1lZCBvZmZlciBvbmx5IGFsbG93ZWQgZm9yIHVuaXF1ZSBlZGl0aW9uIGFuZCBvZmZlciBvbmx5BApiYXNlSGVpZ2h0AwkAAAIFCGJsb2NrRW5kAAAAAAUGaGVpZ2h0AwkBASEBCQEQYWNjZXB0ZWRBc3NldElkcwEFB2Fzc2V0SWQJAAIBAhVTb21ldGhpbmcgd2VudCB3cm9uZyEDCQEBIQEJAQ92YWxpZGF0ZU1pblNlbGwCBQdhc3NldElkBQVwcmljZQkAAgECFVNvbWV0aGluZyB3ZW50IHdyb25nIQQJY2hlY2tVc2VyCQEMdmFsaWRhdGVVc2VyAQUGY2FsbGVyAwkBAiE9AgUJY2hlY2tVc2VyAgAJAAIBBQljaGVja1VzZXIECmFtb3VudFNvbGQJAQ9nZXRJbnRlZ2VyQnlLZXkBCQEJa2V5SXNzdWVkAgUGY2FsbGVyBQVhcnRJZAQKbWF4Q2FuU2VsbAkBD2dldEludGVnZXJCeUtleQEJAQprZXlNYXhNaW50AgUGY2FsbGVyBQVhcnRJZAMJAGYCBQdtYXhNaW50AGQJAAIBAhwxMDAgZWRpdGlvbnMgbWF4IHBlciBhcnR3b3JrAwMJAQIhPQIFCmFtb3VudFNvbGQAAAkAAAIFCmFtb3VudFNvbGQFCm1heENhblNlbGwHCQACAQIUTWF4IGVkaXRpb24gcmVhY2hlZC4DAwkAZgIFCmFtb3VudFNvbGQAAAkBAiE9AgUKbWF4Q2FuU2VsbAUHbWF4TWludAcJAAIBAiZDYW5ub3QgY2hhbmdlIG1heGltdW0gaXNzdWFibGUgYW55bW9yZQMDCQBmAgUGYmlkTmJyAAAJAQIhPQIFCm1heENhblNlbGwFB21heE1pbnQHCQACAQIxQ2Fubm90IGNoYW5nZSBtYXhpbXVtIGlzc3VhYmxlIHdpdGggYWN0aXZlIG9yZGVycwQKc2VsbFN0YXR1cwMDCQBmAgUFcHJpY2UAAAkAZgIFB21heE1pbnQAAAcGBwkAzAgCCQEMQm9vbGVhbkVudHJ5AgkBCWtleU9uU2FsZQIFBmNhbGxlcgUFYXJ0SWQFCnNlbGxTdGF0dXMJAMwIAgkBDEludGVnZXJFbnRyeQIJAQhrZXlQcmljZQIFBmNhbGxlcgUFYXJ0SWQFBXByaWNlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEKa2V5TWF4TWludAIFBmNhbGxlcgUFYXJ0SWQFB21heE1pbnQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBEmtleUFzc2V0SWRBY2NlcHRlZAIFBmNhbGxlcgUFYXJ0SWQFB2Fzc2V0SWQJAMwIAgkBDEludGVnZXJFbnRyeQIJAQprZXlFbmRTYWxlAgUGY2FsbGVyBQVhcnRJZAkAZAIFCmJhc2VIZWlnaHQFCGJsb2NrRW5kBQNuaWwBaQEKYnV5QXJ0d29yawIFYXJ0SWQGaXNzdWVyCQEHYnV5TWludAUFAWkFBWFydElkBQZpc3N1ZXICAAIAAWkBBnNldEJpZAIFYXJ0SWQGaXNzdWVyBA0kdDAyOTQ1OTI5NDk5CQEMaWRDYWxsZXJEYXRlAQUBaQQCaWQIBQ0kdDAyOTQ1OTI5NDk5Al8xBAZjYWxsZXIIBQ0kdDAyOTQ1OTI5NDk5Al8yBARkYXRlCAUNJHQwMjk0NTkyOTQ5OQJfMwQNJHQwMjk1MDQyOTU0MAkBCWlzUGF5bWVudAEFAWkEB3BheW1lbnQIBQ0kdDAyOTUwNDI5NTQwAl8xBAZhbW91bnQIBQ0kdDAyOTUwNDI5NTQwAl8yBAdhc3NldElkAwkBASEBCQEJaXNEZWZpbmVkAQgFB3BheW1lbnQHYXNzZXRJZAIFV0FWRVMJANgEAQkBBXZhbHVlAQgFB3BheW1lbnQHYXNzZXRJZAQIYmxvY2tFbmQJAQ9nZXRJbnRlZ2VyQnlLZXkBCQEKa2V5RW5kU2FsZQIFBmlzc3VlcgUFYXJ0SWQDAwkBAiE9AgUIYmxvY2tFbmQAAAkAZwIFBmhlaWdodAUIYmxvY2tFbmQHCQACAQILU2FsZSBlbmRlZC4EBmJpZE5icgkBD2dldEludGVnZXJCeUtleQEJAKwCAgISY3VycmVudF9iaWRhbW91bnRfBQVhcnRJZAMJAQEhAQkBEGFjY2VwdGVkQXNzZXRJZHMBBQdhc3NldElkCQACAQISYXNzZXQgbm90IGFjY2VwdGVkAwkBASEBCQEPdmFsaWRhdGVNaW5TZWxsAgUHYXNzZXRJZAUGYW1vdW50CQACAQIOV3JvbmcgbWluIHNlbGwECmFtb3VudFNvbGQJAQ9nZXRJbnRlZ2VyQnlLZXkBCQEJa2V5SXNzdWVkAgUGaXNzdWVyBQVhcnRJZAQKbWF4Q2FuU2VsbAkBD2dldEludGVnZXJCeUtleQEJAQprZXlNYXhNaW50AgUGaXNzdWVyBQVhcnRJZAMJAGcCAAAFCm1heENhblNlbGwJAAIBAiNObyBtYXggZWRpdGlvbiBzZXQgZm9yIHRoaXMgYXJ0d29yawMJAGcCBQphbW91bnRTb2xkBQptYXhDYW5TZWxsCQACAQIYU29sZCBvdXQsIHlvdSBjYW5ub3QgYmlkCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAgRiaWRfBQVhcnRJZAIBXwUGaXNzdWVyAgFfBQZjYWxsZXICAV8FAmlkAgVfT1BFTgkArAICCQCsAgIJAKwCAgkArAICBQdhc3NldElkAgFfCQCkAwEFBmFtb3VudAIBXwkApAMBBQRkYXRlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgICEmN1cnJlbnRfYmlkYW1vdW50XwUFYXJ0SWQJAGQCBQZiaWROYnIAAQUDbmlsAWkBCWFjY2VwdEJpZAQFYXJ0SWQGaXNzdWVyBWJpZElkCGJpZE93bmVyBA0kdDAzMDY5ODMwNzM4CQEMaWRDYWxsZXJEYXRlAQUBaQQCaWQIBQ0kdDAzMDY5ODMwNzM4Al8xBAZjYWxsZXIIBQ0kdDAzMDY5ODMwNzM4Al8yBARkYXRlCAUNJHQwMzA2OTgzMDczOAJfMwMJAQIhPQIFBmNhbGxlcgUGaXNzdWVyCQACAQIZWW91IGNhbm5vdCBkbyB0aGlzIGFjdGlvbgkBB2J1eU1pbnQFBQFpBQVhcnRJZAUGaXNzdWVyBQViaWRJZAUIYmlkT3duZXIBaQEJY2FuY2VsQmlkBAVhcnRJZAZpc3N1ZXIFYmlkSWQIYmlkT3duZXIEDSR0MDMwOTY0MzEwMjUJAQxpZENhbGxlckRhdGUBBQFpBAJpZAgFDSR0MDMwOTY0MzEwMjUCXzEEBmNhbGxlcggFDSR0MDMwOTY0MzEwMjUCXzIEBGRhdGUIBQ0kdDAzMDk2NDMxMDI1Al8zAwMJAQIhPQIFBmNhbGxlcgUIYmlkT3duZXIJAQIhPQIFBmNhbGxlcgUGaXNzdWVyBwkAAgECGVlvdSBjYW5ub3QgZG8gdGhpcyBhY3Rpb24EDXJldHVybk1vbmV5VG8DCQAAAgUGY2FsbGVyBQZpc3N1ZXIFCGJpZE93bmVyBQZjYWxsZXIEBmJpZE5icgkBD2dldEludGVnZXJCeUtleQEJAKwCAgISY3VycmVudF9iaWRhbW91bnRfBQVhcnRJZAQKYmlkRGF0YUtleQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAgRiaWRfBQVhcnRJZAIBXwUGaXNzdWVyAgFfBQhiaWRPd25lcgIBXwUFYmlkSWQEB2JpZERhdGEJAQ5nZXRTdHJpbmdCeUtleQEJAKwCAgUKYmlkRGF0YUtleQIFX09QRU4DCQAAAgUHYmlkRGF0YQIACQACAQINQmlkIG5vdCBmb3VuZAQKYmlkRGF0YUFycgkAtQkCBQdiaWREYXRhAgFfBAdhc3NldElkCQENZ2V0QmlkQXNzZXRJZAEJAJEDAgUKYmlkRGF0YUFycgAABAliaWRTdGF0dXMCCENBTkNFTEVECQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgUKYmlkRGF0YUtleQIFX09QRU4JAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIFCmJpZERhdGFLZXkCAV8FCWJpZFN0YXR1cwkArAICCQCsAgIFB2JpZERhdGECAV8JAKQDAQUEZGF0ZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICAhJjdXJyZW50X2JpZGFtb3VudF8FBWFydElkCQBlAgUGYmlkTmJyAAEJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFDXJldHVybk1vbmV5VG8JAQ1wYXJzZUludFZhbHVlAQkAkQMCBQpiaWREYXRhQXJyAAEFB2Fzc2V0SWQFA25pbAECdHgBCHZlcmlmaWVyAAQHJG1hdGNoMAUCdHgDCQABAgUHJG1hdGNoMAIXSW52b2tlU2NyaXB0VHJhbnNhY3Rpb24EA2ludgUHJG1hdGNoMAMDCQAAAggFA2ludghmdW5jdGlvbgIKYWRkQXJ0d29yawkAAAIIBQNpbnYEZEFwcAUEdGhpcwcJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAJANkEAQkBCGFzU3RyaW5nAQkAkQMCCAUDaW52BGFyZ3MADQMDCQAAAggFA2ludghmdW5jdGlvbgINdXBkYXRlQXJ0d29yawkAAAIIBQNpbnYEZEFwcAUEdGhpcwcJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAJANkEAQkBCGFzU3RyaW5nAQkAkQMCCAUDaW52BGFyZ3MADAMDCQAAAggFA2ludghmdW5jdGlvbgILc2VsbEFydHdvcmsJAAACCAUDaW52BGRBcHAFBHRoaXMHCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACQDZBAEJAQhhc1N0cmluZwEJAJEDAggFA2ludgRhcmdzAAUJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAIBQJ0eA9zZW5kZXJQdWJsaWNLZXkJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAIBQJ0eA9zZW5kZXJQdWJsaWNLZXkyjDak", "height": 2411494, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: Hmjh4UhnrxPUBCgF1D96MBPZBfQ1Qo2ihWgUm5N8XAgY Next: 2TSxRZAr4grucmMtpyVGq6XKzud7LrxTdyRBaTR4MBBA Diff:
OldNewDifferences
198198 else true
199199
200200
201-func validateUser (caller) = if (true)
202- then throw(caller)
203- else {
204- let userStatus = valueOrElse(getString(userDapp, keyUserStatus(caller)), userUnregistered)
205- if (if ((userStatus == userUnregistered))
206- then true
207- else (userStatus == userAllowed))
208- then "Register this account first with \"Account\" tab"
209- else if ((userStatus == userSuspended))
210- then "Account suspended"
211- else if ((userStatus == userRemoved))
212- then "Account removed"
213- else ""
214- }
201+func validateUser (caller) = {
202+ let userStatus = valueOrElse(getString(userDapp, keyUserStatus(caller)), userUnregistered)
203+ if (if ((userStatus == userUnregistered))
204+ then true
205+ else (userStatus == userAllowed))
206+ then "Register this account first with \"Account\" tab"
207+ else if ((userStatus == userSuspended))
208+ then "Account suspended"
209+ else if ((userStatus == userRemoved))
210+ then "Account removed"
211+ else ""
212+ }
215213
216214
217215 func setLIcence (cidLicence,sha256Licence) = {
259257
260258
261259 func validatePayment (i) = {
262- let $t089108946 = isPayment(i)
263- let payment = $t089108946._1
264- let amount = $t089108946._2
260+ let $t088778913 = isPayment(i)
261+ let payment = $t088778913._1
262+ let amount = $t088778913._2
265263 let assetId = if (if (isDefined(payment.assetId))
266264 then (payment.assetId == signAssetId)
267265 else false)
284282
285283
286284 func validatePriceAssetId (i,priceAssetId,artworkPrice) = {
287- let $t095349570 = isPayment(i)
288- let payment = $t095349570._1
289- let amount = $t095349570._2
285+ let $t095019537 = isPayment(i)
286+ let payment = $t095019537._1
287+ let amount = $t095019537._2
290288 let assetId = if (!(isDefined(payment.assetId)))
291289 then unit
292290 else if (if ((size(priceAssetId) > 0))
398396
399397
400398 func buyMint (i,artId,issuer,bidId,bidOwner) = {
401- let $t01269012749 = idCallerDate(i)
402- let id = $t01269012749._1
403- let caller = $t01269012749._2
404- let date = $t01269012749._3
399+ let $t01265712716 = idCallerDate(i)
400+ let id = $t01265712716._1
401+ let caller = $t01265712716._2
402+ let date = $t01265712716._3
405403 let isBid = if (if (if ((caller == issuer))
406404 then (bidOwner != "")
407405 else false)
457455 then throw(checkUser)
458456 else {
459457 let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
460- let $t01445214619 = if (isBid)
458+ let $t01441914586 = if (isBid)
461459 then getPriceAssetIdFromBid(bidDataKey)
462460 else validatePriceAssetId(i, priceAssetId, artworkPrice)
463- let amount = $t01445214619._1
464- let assetId = $t01445214619._2
461+ let amount = $t01441914586._1
462+ let assetId = $t01441914586._2
465463 let agent = valueOrElse(getString(userDapp, keyArtistAgentAddr(issuer)), feeReceiver)
466464 let agentShare = valueOrElse(getInteger(userDapp, keyPrimaryShare(issuer)), 0)
467465 let isWhitelisted = checkWhitelist(issuer)
550548
551549 @Callable(i)
552550 func addArtwork (sha256Hash,signID,name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = {
553- let $t01865218712 = idCallerDateSponsored(i, pubKey)
554- let artId = $t01865218712._1
555- let caller = $t01865218712._2
556- let date = $t01865218712._3
557- if (true)
558- then throw(caller)
559- else if (!(validateHash(sha256Hash)))
560- then throw("Hash should be 64 characters maximum")
561- else {
562- let $t01884418913 = setLIcence(cidLicence, sha256Licence)
563- let licenceCID = $t01884418913._1
564- let licenceHash = $t01884418913._2
565- let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
566- if ((validateArtwork != ""))
567- then throw("Something went wrong!")
568- else {
569- let whitelisted_drop = (checkWhitelist((caller + "_free_drops")) > 0)
570- let $t01921219296 = if (whitelisted_drop)
571- then $Tuple2(0, signID)
572- else validatePayment(i)
573- let amount = $t01921219296._1
574- let assetId = $t01921219296._2
575- if (!(isDefined(amount)))
576- then throw("Something went wrong")
577- else {
578- let entryExist = getStringByKey(keyTxidByHashOwner(sha256Hash, caller))
579- if ((entryExist != ""))
580- then throw("You already added it")
581- else {
582- let hashExist = getStringByKey(keyOwnerByHash(sha256Hash))
583- if ((hashExist != ""))
584- then throw("Hash already registered")
585- else {
586- let isSignCertified = checkSignCertificate(signID, caller, sha256Hash)
587- if (!(isSignCertified))
588- then throw("Sign Certificate not found for this address.")
589- else {
590- let decrease_whitelist_drop = if (whitelisted_drop)
591- then invoke(whitelistDapp, "useFreeDrop", [toBase58String(i.caller.bytes)], nil)
592- else unit
593- if ((decrease_whitelist_drop == decrease_whitelist_drop))
594- then [StringEntry(keyOwnerByHash(sha256Hash), caller), StringEntry(keyTxidByHashOwner(sha256Hash, caller), artId), 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), StringEntry(keySignID(caller, artId), signID), IntegerEntry(keyIssued(caller, artId), 0), BooleanEntry(keyOnSale(caller, artId), false), StringEntry(keyidBySignid(caller, signID), artId), StringEntry(keyHashByTxidAddr(caller, artId), sha256Hash), StringEntry(keyCrawler(caller, artId), crawler), IntegerEntry(keyRoyalties(caller, artId), royalties), ScriptTransfer(Address(fromBase58String(feeReceiver)), amount, signAssetId)]
595- else throw("Strict value is not equal to itself.")
596- }
597- }
598- }
599- }
600- }
601- }
551+ let $t01861918679 = idCallerDateSponsored(i, pubKey)
552+ let artId = $t01861918679._1
553+ let caller = $t01861918679._2
554+ let date = $t01861918679._3
555+ if (!(validateHash(sha256Hash)))
556+ then throw("Hash should be 64 characters maximum")
557+ else {
558+ let $t01878018849 = setLIcence(cidLicence, sha256Licence)
559+ let licenceCID = $t01878018849._1
560+ let licenceHash = $t01878018849._2
561+ let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
562+ if ((validateArtwork != ""))
563+ then throw("Something went wrong!")
564+ else {
565+ let whitelisted_drop = (checkWhitelist((caller + "_free_drops")) > 0)
566+ let $t01914819232 = if (whitelisted_drop)
567+ then $Tuple2(0, signID)
568+ else validatePayment(i)
569+ let amount = $t01914819232._1
570+ let assetId = $t01914819232._2
571+ if (!(isDefined(amount)))
572+ then throw("Something went wrong")
573+ else {
574+ let entryExist = getStringByKey(keyTxidByHashOwner(sha256Hash, caller))
575+ if ((entryExist != ""))
576+ then throw("You already added it")
577+ else {
578+ let hashExist = getStringByKey(keyOwnerByHash(sha256Hash))
579+ if ((hashExist != ""))
580+ then throw("Hash already registered")
581+ else {
582+ let isSignCertified = checkSignCertificate(signID, caller, sha256Hash)
583+ if (!(isSignCertified))
584+ then throw("Sign Certificate not found for this address.")
585+ else {
586+ let decrease_whitelist_drop = if (whitelisted_drop)
587+ then invoke(whitelistDapp, "useFreeDrop", [toBase58String(i.caller.bytes)], nil)
588+ else unit
589+ if ((decrease_whitelist_drop == decrease_whitelist_drop))
590+ then [StringEntry(keyOwnerByHash(sha256Hash), caller), StringEntry(keyTxidByHashOwner(sha256Hash, caller), artId), 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), StringEntry(keySignID(caller, artId), signID), IntegerEntry(keyIssued(caller, artId), 0), BooleanEntry(keyOnSale(caller, artId), false), StringEntry(keyidBySignid(caller, signID), artId), StringEntry(keyHashByTxidAddr(caller, artId), sha256Hash), StringEntry(keyCrawler(caller, artId), crawler), IntegerEntry(keyRoyalties(caller, artId), royalties), ScriptTransfer(Address(fromBase58String(feeReceiver)), amount, signAssetId)]
591+ else throw("Strict value is not equal to itself.")
592+ }
593+ }
594+ }
595+ }
596+ }
597+ }
602598 }
603599
604600
607603 func updateArtwork (txid,name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = if (!(dappRunning))
608604 then throw(maintenanceMSG)
609605 else {
610- let $t02223822295 = idCallerDateSponsored(i, pubKey)
611- let id = $t02223822295._1
612- let caller = $t02223822295._2
613- let date = $t02223822295._3
614- let $t02230522374 = setLIcence(cidLicence, sha256Licence)
615- let licenceCID = $t02230522374._1
616- let licenceHash = $t02230522374._2
606+ let $t02217422231 = idCallerDateSponsored(i, pubKey)
607+ let id = $t02217422231._1
608+ let caller = $t02217422231._2
609+ let date = $t02217422231._3
610+ let $t02224122310 = setLIcence(cidLicence, sha256Licence)
611+ let licenceCID = $t02224122310._1
612+ let licenceHash = $t02224122310._2
617613 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
618614 if ((validateArtwork != ""))
619615 then throw("Something went wrong!")
636632
637633 @Callable(i)
638634 func flagArtwork (artId,addr,flag,note) = {
639- let $t02387523909 = idCallerDate(i)
640- let id = $t02387523909._1
641- let caller = $t02387523909._2
635+ let $t02381123845 = idCallerDate(i)
636+ let id = $t02381123845._1
637+ let caller = $t02381123845._2
642638 if (containsElement([chris, toString(this)], caller))
643639 then if (containsElement(["CONSENT", "", "CHANGE_REQUIRED", "FLAGGED", "ILLEGAL"], flag))
644640 then [StringEntry(keyFlag(addr, artId), flag), StringEntry(keyNote(addr, artId), note)]
650646
651647 @Callable(i)
652648 func deleteArtwork (artId,addr) = {
653- let $t02434524379 = idCallerDate(i)
654- let id = $t02434524379._1
655- let caller = $t02434524379._2
649+ let $t02428124315 = idCallerDate(i)
650+ let id = $t02428124315._1
651+ let caller = $t02428124315._2
656652 let addrToUse = if (containsElement([chris, toString(this)], caller))
657653 then addr
658654 else caller
685681
686682 @Callable(i)
687683 func sellArtwork (artId,price,maxMint,assetId,blockEnd,pubKey) = {
688- let $t02721527266 = idCallerDateSponsored(i, pubKey)
689- let id = $t02721527266._1
690- let caller = $t02721527266._2
684+ let $t02715127202 = idCallerDateSponsored(i, pubKey)
685+ let id = $t02715127202._1
686+ let caller = $t02715127202._2
691687 let artworkName = getStringByKey(keyName(caller, artId))
692688 if ((artworkName == ""))
693689 then throw("This art doesn't match your account")
758754
759755 @Callable(i)
760756 func setBid (artId,issuer) = {
761- let $t02952329563 = idCallerDate(i)
762- let id = $t02952329563._1
763- let caller = $t02952329563._2
764- let date = $t02952329563._3
765- let $t02956829604 = isPayment(i)
766- let payment = $t02956829604._1
767- let amount = $t02956829604._2
757+ let $t02945929499 = idCallerDate(i)
758+ let id = $t02945929499._1
759+ let caller = $t02945929499._2
760+ let date = $t02945929499._3
761+ let $t02950429540 = isPayment(i)
762+ let payment = $t02950429540._1
763+ let amount = $t02950429540._2
768764 let assetId = if (!(isDefined(payment.assetId)))
769765 then "WAVES"
770766 else toBase58String(value(payment.assetId))
795791
796792 @Callable(i)
797793 func acceptBid (artId,issuer,bidId,bidOwner) = {
798- let $t03076230802 = idCallerDate(i)
799- let id = $t03076230802._1
800- let caller = $t03076230802._2
801- let date = $t03076230802._3
794+ let $t03069830738 = idCallerDate(i)
795+ let id = $t03069830738._1
796+ let caller = $t03069830738._2
797+ let date = $t03069830738._3
802798 if ((caller != issuer))
803799 then throw("You cannot do this action")
804800 else buyMint(i, artId, issuer, bidId, bidOwner)
808804
809805 @Callable(i)
810806 func cancelBid (artId,issuer,bidId,bidOwner) = {
811- let $t03102831089 = idCallerDate(i)
812- let id = $t03102831089._1
813- let caller = $t03102831089._2
814- let date = $t03102831089._3
807+ let $t03096431025 = idCallerDate(i)
808+ let id = $t03096431025._1
809+ let caller = $t03096431025._2
810+ let date = $t03096431025._3
815811 if (if ((caller != bidOwner))
816812 then (caller != issuer)
817813 else false)
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let VERSION = "1.1.9"
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 signAssetId = fromBase58String(getStringByKey("conf_accepted_asset_SIGN"))
2424
2525 let usdnAssetId = fromBase58String(getStringByKey("conf_accepted_asset_USDN"))
2626
2727 let usdtAssetId = fromBase58String(getStringByKey("conf_accepted_asset_USDT"))
2828
2929 let wavesAssetId = base58''
3030
3131 let chris = getStringByKey("conf_admin_1")
3232
3333 func getIntegerByKeyFromOracle (key) = valueOrErrorMessage(getInteger(oracleFee, key), "Integer undefine or 0 in oracle")
3434
3535
3636 func getIntegerByKey (key) = valueOrElse(getInteger(this, key), 0)
3737
3838
3939 func checkWhitelist (key) = valueOrElse(getInteger(whitelistDapp, key), 0)
4040
4141
4242 func getBooleanByKey (key) = valueOrElse(getBoolean(this, key), false)
4343
4444
4545 let signCut = 7
4646
4747 let usdnWaveCut = 10
4848
4949 let defaultLicence = getStringByKey("conf_default_licence")
5050
5151 let defaultHashLicence = getStringByKey("conf_default_licence_hash")
5252
5353 let dappRunning = valueOrElse(getBoolean(userDapp, "conf_dapp_is_running"), true)
5454
5555 let maintenanceMSG = valueOrElse(getString(userDapp, "conf_maintenance_msg"), "")
5656
5757 let userSuspended = "SUSPENDED"
5858
5959 let userRemoved = "REMOVED"
6060
6161 let userUnregistered = "UNREGISTERED"
6262
6363 let userAllowed = "ALLOWED"
6464
6565 let currentCertificationPrice = getIntegerByKeyFromOracle(("certification_fee_" + toBase58String(signAssetId)))
6666
6767 func getArtworkRoyalties (key) = valueOrElse(getInteger(this, key), 1000)
6868
6969
7070 func checkSignCertificate (signID,Owner,sha256Hash) = match getString(signDapp, ((("data_fc_" + signID) + "_") + Owner)) {
7171 case a: String =>
7272 if (contains(a, sha256Hash))
7373 then true
7474 else false
7575 case _ =>
7676 false
7777 }
7878
7979
8080 func validateCID (cid) = if (contains(cid, "/"))
8181 then if (if ((76 > size(cid)))
8282 then (size(split(cid, "/")[0]) == 59)
8383 else false)
8484 then (16 > size(split(cid, "/")[1]))
8585 else false
8686 else false
8787
8888
8989 func validateHash (hash) = (size(hash) == 64)
9090
9191
9292 func keyUserStatus (caller) = ("user_status_" + caller)
9393
9494
9595 func keyDate (caller,artId) = ((("art_date_" + artId) + "_") + caller)
9696
9797
9898 func keyName (caller,artId) = ((("art_name_" + artId) + "_") + caller)
9999
100100
101101 func keyDesc (caller,artId) = ((("art_desc_" + artId) + "_") + caller)
102102
103103
104104 func keyDisplayCid (caller,artId) = ((("art_display_cid_" + artId) + "_") + caller)
105105
106106
107107 func keyExportHash (caller,artId) = ((("art_export_hash_" + artId) + "_") + caller)
108108
109109
110110 func keyExportCid (caller,artId) = ((("art_export_cid_" + artId) + "_") + caller)
111111
112112
113113 func keyMaxMint (caller,artId) = ((("art_maxmint_" + artId) + "_") + caller)
114114
115115
116116 func keySignID (caller,artId) = ((("art_signid_" + artId) + "_") + caller)
117117
118118
119119 func keyIssued (caller,artId) = ((("art_issued_" + artId) + "_") + caller)
120120
121121
122122 func keyOnSale (caller,artId) = ((("art_onsale_" + artId) + "_") + caller)
123123
124124
125125 func keyLicenceHash (caller,artId) = ((("art_licence_hash_" + artId) + "_") + caller)
126126
127127
128128 func keyLicenceCid (caller,artId) = ((("art_licence_cid_" + artId) + "_") + caller)
129129
130130
131131 func keyTags (caller,artId) = ((("art_tags_" + artId) + "_") + caller)
132132
133133
134134 func keyType (caller,artId) = ((("art_type_" + artId) + "_") + caller)
135135
136136
137137 func keyNote (caller,artId) = ((("art_note_" + artId) + "_") + caller)
138138
139139
140140 func keyCrawler (caller,artId) = ((("art_crawler_cid_" + artId) + "_") + caller)
141141
142142
143143 func keyRoyalties (caller,artId) = ((("art_royalties_" + artId) + "_") + caller)
144144
145145
146146 func keyPrice (caller,artId) = ((("art_price_" + artId) + "_") + caller)
147147
148148
149149 func keyEndSale (caller,artId) = ((("art_endsale_" + artId) + "_") + caller)
150150
151151
152152 func keyAssetIdAccepted (caller,artId) = ((("art_assetAccepted_" + artId) + "_") + caller)
153153
154154
155155 func keyFlag (caller,artId) = ((("art_flag_" + artId) + "_") + caller)
156156
157157
158158 func keyArtistAgentAddr (artistAddr) = ("artist_agent_" + artistAddr)
159159
160160
161161 func keyPrimaryShare (artistAddr) = ("artist_agent_primary_" + artistAddr)
162162
163163
164164 func keyHashByTxidAddr (caller,txid) = ((("get_hashbytxidaddr_" + txid) + "_") + caller)
165165
166166
167167 func keyOwnerByHash (sha256Hash) = ("get_owner_by_hash_" + sha256Hash)
168168
169169
170170 func keyidBySignid (caller,signId) = ((("get_artidbysignid_" + signId) + "_") + caller)
171171
172172
173173 func keyTxidByHashOwner (sha256Hash,caller) = ("get_txid_by_hash_owner_" + toBase58String(sha256_16Kb(toBytes((sha256Hash + caller)))))
174174
175175
176176 func validateAllCID (cidDisplay,cidExport,cidLicence) = if (!(validateCID(cidDisplay)))
177177 then throw("Wrong Display CID")
178178 else if (!(validateCID(cidExport)))
179179 then throw("Wrong Export CID")
180180 else if (if ((cidLicence != ""))
181181 then !(validateCID(cidLicence))
182182 else false)
183183 then throw("Wrong Licence CID")
184184 else true
185185
186186
187187 func validateAllHash (sha256Export,sha256Licence) = if (!(validateHash(sha256Export)))
188188 then throw("Export Hash 64 char. max")
189189 else if (!(validateHash(sha256Licence)))
190190 then throw("Licence Hash 64 char. max")
191191 else true
192192
193193
194194 func validateString (str,max) = if ((size(str) == 0))
195195 then throw("Field cannot be is empty")
196196 else if ((size(str) > max))
197197 then throw((str + " is too long"))
198198 else true
199199
200200
201-func validateUser (caller) = if (true)
202- then throw(caller)
203- else {
204- let userStatus = valueOrElse(getString(userDapp, keyUserStatus(caller)), userUnregistered)
205- if (if ((userStatus == userUnregistered))
206- then true
207- else (userStatus == userAllowed))
208- then "Register this account first with \"Account\" tab"
209- else if ((userStatus == userSuspended))
210- then "Account suspended"
211- else if ((userStatus == userRemoved))
212- then "Account removed"
213- else ""
214- }
201+func validateUser (caller) = {
202+ let userStatus = valueOrElse(getString(userDapp, keyUserStatus(caller)), userUnregistered)
203+ if (if ((userStatus == userUnregistered))
204+ then true
205+ else (userStatus == userAllowed))
206+ then "Register this account first with \"Account\" tab"
207+ else if ((userStatus == userSuspended))
208+ then "Account suspended"
209+ else if ((userStatus == userRemoved))
210+ then "Account removed"
211+ else ""
212+ }
215213
216214
217215 func setLIcence (cidLicence,sha256Licence) = {
218216 let cid = if ((size(cidLicence) == 0))
219217 then defaultLicence
220218 else cidLicence
221219 let hash = if ((size(sha256Licence) == 0))
222220 then defaultHashLicence
223221 else sha256Licence
224222 $Tuple2(cid, hash)
225223 }
226224
227225
228226 func validateArtworkData (caller,cidDisplay,cidExport,licenceCID,sha256Export,licenceHash,name,description,tags,royalties) = {
229227 let checkUser = validateUser(caller)
230228 if ((checkUser != ""))
231229 then throw(checkUser)
232230 else if ((size(cidDisplay) == 0))
233231 then throw("Display CID cannot be empty")
234232 else if (!(validateAllCID(cidDisplay, cidExport, licenceCID)))
235233 then throw("Problem with CID")
236234 else if (!(validateAllHash(sha256Export, licenceHash)))
237235 then throw("Problem with Hashes")
238236 else if (!(validateString(name, 100)))
239237 then throw("100 Char. max name")
240238 else if (!(validateString(description, 1000)))
241239 then throw("1000 Char. max description")
242240 else if (if ((0 > royalties))
243241 then true
244242 else (royalties > 1000))
245243 then throw("Royalties cannot be less than 0% or higher than 10%")
246244 else if ((size(split(tags, ",")) > 5))
247245 then throw("5 tags max.")
248246 else ""
249247 }
250248
251249
252250 func isPayment (i) = if ((size(i.payments) == 0))
253251 then throw("No payment attached")
254252 else {
255253 let payment = value(i.payments[0])
256254 let amount = value(payment.amount)
257255 $Tuple2(payment, amount)
258256 }
259257
260258
261259 func validatePayment (i) = {
262- let $t089108946 = isPayment(i)
263- let payment = $t089108946._1
264- let amount = $t089108946._2
260+ let $t088778913 = isPayment(i)
261+ let payment = $t088778913._1
262+ let amount = $t088778913._2
265263 let assetId = if (if (isDefined(payment.assetId))
266264 then (payment.assetId == signAssetId)
267265 else false)
268266 then payment.assetId
269267 else throw("Only SIGN token accepted as transaction fee")
270268 if ((amount != currentCertificationPrice))
271269 then throw(("Payment amount should be " + toString(currentCertificationPrice)))
272270 else $Tuple2(amount, assetId)
273271 }
274272
275273
276274 func isArtMinted (addrToUse,artId) = match getInteger(this, keyIssued(addrToUse, artId)) {
277275 case b: Int =>
278276 if ((b != 0))
279277 then true
280278 else false
281279 case _ =>
282280 false
283281 }
284282
285283
286284 func validatePriceAssetId (i,priceAssetId,artworkPrice) = {
287- let $t095349570 = isPayment(i)
288- let payment = $t095349570._1
289- let amount = $t095349570._2
285+ let $t095019537 = isPayment(i)
286+ let payment = $t095019537._1
287+ let amount = $t095019537._2
290288 let assetId = if (!(isDefined(payment.assetId)))
291289 then unit
292290 else if (if ((size(priceAssetId) > 0))
293291 then (toBase58String(value(payment.assetId)) == priceAssetId)
294292 else false)
295293 then payment.assetId
296294 else throw("Wrong asset id")
297295 if (if ((assetId == unit))
298296 then (priceAssetId != "")
299297 else false)
300298 then throw("Wrong asset id")
301299 else if ((artworkPrice != amount))
302300 then throw("Payment don't match")
303301 else $Tuple2(amount, assetId)
304302 }
305303
306304
307305 func acceptedAssetIds (assetId) = if (if (if (if (if ((assetId != toBase58String(signAssetId)))
308306 then (assetId != toBase58String(wavesAssetId))
309307 else false)
310308 then (assetId != "WAVES")
311309 else false)
312310 then (assetId != toBase58String(usdnAssetId))
313311 else false)
314312 then (assetId != toBase58String(usdtAssetId))
315313 else false)
316314 then throw("Only SIGN, USDN,USDT or WAVES accepted")
317315 else true
318316
319317
320318 func validateMinSell (assetId,price) = {
321319 let minSellWaves = if (unitTest)
322320 then 10
323321 else getIntegerByKeyFromOracle("waves_min_sell")
324322 let minSellUsdn = 1000000
325323 let minSellSign = if (unitTest)
326324 then 1
327325 else (currentCertificationPrice * 2)
328326 if (if (if (if (if (if ((assetId == toBase58String(usdnAssetId)))
329327 then (minSellUsdn > price)
330328 else false)
331329 then (price != 0)
332330 else false)
333331 then true
334332 else if (if ((assetId == toBase58String(usdtAssetId)))
335333 then (minSellUsdn > price)
336334 else false)
337335 then (price != 0)
338336 else false)
339337 then true
340338 else if (if ((assetId == toBase58String(signAssetId)))
341339 then (minSellSign > price)
342340 else false)
343341 then (price != 0)
344342 else false)
345343 then true
346344 else if (if (if ((assetId == toBase58String(wavesAssetId)))
347345 then true
348346 else (assetId == "WAVES"))
349347 then (minSellWaves > price)
350348 else false)
351349 then (price != 0)
352350 else false)
353351 then throw("Wrong minimum sell price")
354352 else true
355353 }
356354
357355
358356 func getBidAssetId (assetId) = if ((assetId == "WAVES"))
359357 then unit
360358 else fromBase58String(assetId)
361359
362360
363361 func getPriceAssetIdFromBid (bidDataKey) = {
364362 let bidData = getStringByKey((bidDataKey + "_OPEN"))
365363 if ((bidData == ""))
366364 then throw("Bid not found")
367365 else {
368366 let bidDataArr = split(bidData, "_")
369367 let bidAmount = parseIntValue(bidDataArr[1])
370368 let bidAssetId = getBidAssetId(bidDataArr[0])
371369 if ((0 >= bidAmount))
372370 then throw("Wrong amount")
373371 else $Tuple2(bidAmount, bidAssetId)
374372 }
375373 }
376374
377375
378376 func idCallerDateSponsored (i,pubKey) = if (!(dappRunning))
379377 then throw(maintenanceMSG)
380378 else {
381379 let caller = if (if ((toBase58String(i.caller.bytes) == toString(this)))
382380 then (size(i.payments) == 0)
383381 else false)
384382 then toString(addressFromPublicKey(fromBase58String(pubKey)))
385383 else toBase58String(i.caller.bytes)
386384 let get_sponsored_waves = if ((pubKey != ""))
387385 then invoke(whitelistDapp, "useFreeTx", [toString(addressFromPublicKey(fromBase58String(pubKey)))], nil)
388386 else unit
389387 if ((get_sponsored_waves == get_sponsored_waves))
390388 then $Tuple3(toBase58String(i.transactionId), caller, lastBlock.timestamp)
391389 else throw("Strict value is not equal to itself.")
392390 }
393391
394392
395393 func idCallerDate (i) = if (!(dappRunning))
396394 then throw(maintenanceMSG)
397395 else $Tuple3(toBase58String(i.transactionId), toBase58String(i.caller.bytes), lastBlock.timestamp)
398396
399397
400398 func buyMint (i,artId,issuer,bidId,bidOwner) = {
401- let $t01269012749 = idCallerDate(i)
402- let id = $t01269012749._1
403- let caller = $t01269012749._2
404- let date = $t01269012749._3
399+ let $t01265712716 = idCallerDate(i)
400+ let id = $t01265712716._1
401+ let caller = $t01265712716._2
402+ let date = $t01265712716._3
405403 let isBid = if (if (if ((caller == issuer))
406404 then (bidOwner != "")
407405 else false)
408406 then (bidId != "")
409407 else false)
410408 then true
411409 else false
412410 let blockEnd = getIntegerByKey(keyEndSale(caller, artId))
413411 if (if (if ((blockEnd != 0))
414412 then (height >= blockEnd)
415413 else false)
416414 then !(isBid)
417415 else false)
418416 then throw("Sale ended.")
419417 else {
420418 let callerIsIssuer = (caller == issuer)
421419 let totalNFT = getIntegerByKey("total_nft_issued")
422420 let signID = getStringByKey(keySignID(issuer, artId))
423421 let artworkName = getStringByKey(keyName(issuer, artId))
424422 if ((artworkName == ""))
425423 then throw("Art doesn't exist")
426424 else {
427425 let isOnSale = getBooleanByKey(keyOnSale(issuer, artId))
428426 let amountSold = getIntegerByKey(keyIssued(issuer, artId))
429427 let artworkPrice = if (callerIsIssuer)
430428 then (currentCertificationPrice * 2)
431429 else getIntegerByKey(keyPrice(issuer, artId))
432430 let priceAssetId = if (callerIsIssuer)
433431 then toBase58String(signAssetId)
434432 else getStringByKey(keyAssetIdAccepted(issuer, artId))
435433 let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
436434 if (if (if (!(isBid))
437435 then !(callerIsIssuer)
438436 else false)
439437 then if (if ((0 >= artworkPrice))
440438 then true
441439 else !(isOnSale))
442440 then true
443441 else (0 >= maxCanSell)
444442 else false)
445443 then throw("Art not for sale")
446444 else if (if (if (!(isBid))
447445 then callerIsIssuer
448446 else false)
449447 then (0 >= maxCanSell)
450448 else false)
451449 then throw("Max issuable not set")
452450 else {
453451 let checkUser = validateUser(issuer)
454452 if (if (isBid)
455453 then (checkUser != "")
456454 else false)
457455 then throw(checkUser)
458456 else {
459457 let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
460- let $t01445214619 = if (isBid)
458+ let $t01441914586 = if (isBid)
461459 then getPriceAssetIdFromBid(bidDataKey)
462460 else validatePriceAssetId(i, priceAssetId, artworkPrice)
463- let amount = $t01445214619._1
464- let assetId = $t01445214619._2
461+ let amount = $t01441914586._1
462+ let assetId = $t01441914586._2
465463 let agent = valueOrElse(getString(userDapp, keyArtistAgentAddr(issuer)), feeReceiver)
466464 let agentShare = valueOrElse(getInteger(userDapp, keyPrimaryShare(issuer)), 0)
467465 let isWhitelisted = checkWhitelist(issuer)
468466 let cut = if ((isWhitelisted > height))
469467 then 0
470468 else if ((assetId == signAssetId))
471469 then signCut
472470 else usdnWaveCut
473471 let amountForSign = fraction(amount, cut, 100)
474472 let amountForAgent = if (if (if ((agent != feeReceiver))
475473 then (agentShare > 0)
476474 else false)
477475 then (height > isWhitelisted)
478476 else false)
479477 then fraction(amount, agentShare, 100)
480478 else 0
481479 let amountForCreator = (amount - amountForSign)
482480 if ((amountSold == maxCanSell))
483481 then throw("Art sold out")
484482 else {
485483 let newAmountSold = (amountSold + 1)
486484 let issueMeta = ((((((((((("Creator: " + issuer) + ",
487485 ArtID: ") + artId) + ",
488486 SignID: ") + signID) + ",
489487 Artwork name: ") + artworkName) + ",
490488 Issue: ") + toString(newAmountSold)) + "/") + toString(maxCanSell))
491489 let issueNFT = Issue(("SA_" + toString((totalNFT + 1))), issueMeta, 1, 0, false)
492490 let idNFT = calculateAssetId(issueNFT)
493491 let sellStatus = if (if ((newAmountSold == maxCanSell))
494492 then true
495493 else !(isOnSale))
496494 then false
497495 else true
498496 let receiveNFT = if (if (if ((caller == issuer))
499497 then (bidOwner != "")
500498 else false)
501499 then (bidId != "")
502500 else false)
503501 then addressFromStringValue(bidOwner)
504502 else i.caller
505503 let assetIdBid = if (!(isDefined(assetId)))
506504 then "WAVES"
507505 else toBase58String(value(assetId))
508506 let bidData = getStringByKey((bidDataKey + "_OPEN"))
509507 let bidDelOld = DeleteEntry((bidDataKey + "_OPEN"))
510508 let bidUpdate = StringEntry((bidDataKey + "_CLOSED"), ((bidData + "_") + toString(date)))
511509 let soldKey = ((((((("art_sold_" + toString(newAmountSold)) + "_of_") + toString(maxCanSell)) + "_") + artId) + "_") + issuer)
512510 let soldValue = if (!(isBid))
513511 then ((((((((((caller + "_") + toString(date)) + "_") + id) + "_") + toString(artworkPrice)) + "_") + priceAssetId) + "_") + toBase58String(idNFT))
514512 else ((((((((((toString(receiveNFT) + "_") + toString(date)) + "_") + id) + "_") + toString(amount)) + "_") + assetIdBid) + "_") + toBase58String(idNFT))
515513 let soldData = StringEntry(soldKey, soldValue)
516514 let commissions = if ((amountForAgent != 0))
517515 then [ScriptTransfer(Address(fromBase58String(feeReceiver)), (amountForSign - amountForAgent), assetId), ScriptTransfer(Address(fromBase58String(agent)), amountForAgent, assetId)]
518516 else [ScriptTransfer(Address(fromBase58String(feeReceiver)), amountForSign, assetId)]
519517 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(Address(fromBase58String(issuer)), amountForCreator, assetId), ScriptTransfer(receiveNFT, 1, idNFT)] ++ commissions)
520518 if (isBid)
521519 then [soldData, bidUpdate, bidDelOld] :: buyRes
522520 else soldData :: buyRes
523521 }
524522 }
525523 }
526524 }
527525 }
528526 }
529527
530528
531529 func asString (bv) = match bv {
532530 case bv0: String =>
533531 bv0
534532 case _ =>
535533 throw("Sponsored Public Key String expected")
536534 }
537535
538536
539537 @Callable(invoke)
540538 func setConf (key,val) = {
541539 let caller = toString(invoke.caller)
542540 if (containsElement([chris, toString(this)], caller))
543541 then if (contains(key, "conf_"))
544542 then [StringEntry(key, val)]
545543 else throw("Entries starting with conf_ only")
546544 else throw("You are not allowed to change this")
547545 }
548546
549547
550548
551549 @Callable(i)
552550 func addArtwork (sha256Hash,signID,name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = {
553- let $t01865218712 = idCallerDateSponsored(i, pubKey)
554- let artId = $t01865218712._1
555- let caller = $t01865218712._2
556- let date = $t01865218712._3
557- if (true)
558- then throw(caller)
559- else if (!(validateHash(sha256Hash)))
560- then throw("Hash should be 64 characters maximum")
561- else {
562- let $t01884418913 = setLIcence(cidLicence, sha256Licence)
563- let licenceCID = $t01884418913._1
564- let licenceHash = $t01884418913._2
565- let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
566- if ((validateArtwork != ""))
567- then throw("Something went wrong!")
568- else {
569- let whitelisted_drop = (checkWhitelist((caller + "_free_drops")) > 0)
570- let $t01921219296 = if (whitelisted_drop)
571- then $Tuple2(0, signID)
572- else validatePayment(i)
573- let amount = $t01921219296._1
574- let assetId = $t01921219296._2
575- if (!(isDefined(amount)))
576- then throw("Something went wrong")
577- else {
578- let entryExist = getStringByKey(keyTxidByHashOwner(sha256Hash, caller))
579- if ((entryExist != ""))
580- then throw("You already added it")
581- else {
582- let hashExist = getStringByKey(keyOwnerByHash(sha256Hash))
583- if ((hashExist != ""))
584- then throw("Hash already registered")
585- else {
586- let isSignCertified = checkSignCertificate(signID, caller, sha256Hash)
587- if (!(isSignCertified))
588- then throw("Sign Certificate not found for this address.")
589- else {
590- let decrease_whitelist_drop = if (whitelisted_drop)
591- then invoke(whitelistDapp, "useFreeDrop", [toBase58String(i.caller.bytes)], nil)
592- else unit
593- if ((decrease_whitelist_drop == decrease_whitelist_drop))
594- then [StringEntry(keyOwnerByHash(sha256Hash), caller), StringEntry(keyTxidByHashOwner(sha256Hash, caller), artId), 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), StringEntry(keySignID(caller, artId), signID), IntegerEntry(keyIssued(caller, artId), 0), BooleanEntry(keyOnSale(caller, artId), false), StringEntry(keyidBySignid(caller, signID), artId), StringEntry(keyHashByTxidAddr(caller, artId), sha256Hash), StringEntry(keyCrawler(caller, artId), crawler), IntegerEntry(keyRoyalties(caller, artId), royalties), ScriptTransfer(Address(fromBase58String(feeReceiver)), amount, signAssetId)]
595- else throw("Strict value is not equal to itself.")
596- }
597- }
598- }
599- }
600- }
601- }
551+ let $t01861918679 = idCallerDateSponsored(i, pubKey)
552+ let artId = $t01861918679._1
553+ let caller = $t01861918679._2
554+ let date = $t01861918679._3
555+ if (!(validateHash(sha256Hash)))
556+ then throw("Hash should be 64 characters maximum")
557+ else {
558+ let $t01878018849 = setLIcence(cidLicence, sha256Licence)
559+ let licenceCID = $t01878018849._1
560+ let licenceHash = $t01878018849._2
561+ let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
562+ if ((validateArtwork != ""))
563+ then throw("Something went wrong!")
564+ else {
565+ let whitelisted_drop = (checkWhitelist((caller + "_free_drops")) > 0)
566+ let $t01914819232 = if (whitelisted_drop)
567+ then $Tuple2(0, signID)
568+ else validatePayment(i)
569+ let amount = $t01914819232._1
570+ let assetId = $t01914819232._2
571+ if (!(isDefined(amount)))
572+ then throw("Something went wrong")
573+ else {
574+ let entryExist = getStringByKey(keyTxidByHashOwner(sha256Hash, caller))
575+ if ((entryExist != ""))
576+ then throw("You already added it")
577+ else {
578+ let hashExist = getStringByKey(keyOwnerByHash(sha256Hash))
579+ if ((hashExist != ""))
580+ then throw("Hash already registered")
581+ else {
582+ let isSignCertified = checkSignCertificate(signID, caller, sha256Hash)
583+ if (!(isSignCertified))
584+ then throw("Sign Certificate not found for this address.")
585+ else {
586+ let decrease_whitelist_drop = if (whitelisted_drop)
587+ then invoke(whitelistDapp, "useFreeDrop", [toBase58String(i.caller.bytes)], nil)
588+ else unit
589+ if ((decrease_whitelist_drop == decrease_whitelist_drop))
590+ then [StringEntry(keyOwnerByHash(sha256Hash), caller), StringEntry(keyTxidByHashOwner(sha256Hash, caller), artId), 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), StringEntry(keySignID(caller, artId), signID), IntegerEntry(keyIssued(caller, artId), 0), BooleanEntry(keyOnSale(caller, artId), false), StringEntry(keyidBySignid(caller, signID), artId), StringEntry(keyHashByTxidAddr(caller, artId), sha256Hash), StringEntry(keyCrawler(caller, artId), crawler), IntegerEntry(keyRoyalties(caller, artId), royalties), ScriptTransfer(Address(fromBase58String(feeReceiver)), amount, signAssetId)]
591+ else throw("Strict value is not equal to itself.")
592+ }
593+ }
594+ }
595+ }
596+ }
597+ }
602598 }
603599
604600
605601
606602 @Callable(i)
607603 func updateArtwork (txid,name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = if (!(dappRunning))
608604 then throw(maintenanceMSG)
609605 else {
610- let $t02223822295 = idCallerDateSponsored(i, pubKey)
611- let id = $t02223822295._1
612- let caller = $t02223822295._2
613- let date = $t02223822295._3
614- let $t02230522374 = setLIcence(cidLicence, sha256Licence)
615- let licenceCID = $t02230522374._1
616- let licenceHash = $t02230522374._2
606+ let $t02217422231 = idCallerDateSponsored(i, pubKey)
607+ let id = $t02217422231._1
608+ let caller = $t02217422231._2
609+ let date = $t02217422231._3
610+ let $t02224122310 = setLIcence(cidLicence, sha256Licence)
611+ let licenceCID = $t02224122310._1
612+ let licenceHash = $t02224122310._2
617613 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
618614 if ((validateArtwork != ""))
619615 then throw("Something went wrong!")
620616 else {
621617 let entryExist = getStringByKey(keyName(caller, txid))
622618 if ((entryExist == ""))
623619 then throw("Entry not found")
624620 else {
625621 let flag = getStringByKey(keyFlag(caller, txid))
626622 if ((flag == "ILLEGAL"))
627623 then throw("Cannot update ILLEGAL artwork")
628624 else if (!(isArtMinted(caller, txid)))
629625 then [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)]
630626 else throw("Already minted")
631627 }
632628 }
633629 }
634630
635631
636632
637633 @Callable(i)
638634 func flagArtwork (artId,addr,flag,note) = {
639- let $t02387523909 = idCallerDate(i)
640- let id = $t02387523909._1
641- let caller = $t02387523909._2
635+ let $t02381123845 = idCallerDate(i)
636+ let id = $t02381123845._1
637+ let caller = $t02381123845._2
642638 if (containsElement([chris, toString(this)], caller))
643639 then if (containsElement(["CONSENT", "", "CHANGE_REQUIRED", "FLAGGED", "ILLEGAL"], flag))
644640 then [StringEntry(keyFlag(addr, artId), flag), StringEntry(keyNote(addr, artId), note)]
645641 else throw(("Unknow status " + flag))
646642 else throw("You are not allowed")
647643 }
648644
649645
650646
651647 @Callable(i)
652648 func deleteArtwork (artId,addr) = {
653- let $t02434524379 = idCallerDate(i)
654- let id = $t02434524379._1
655- let caller = $t02434524379._2
649+ let $t02428124315 = idCallerDate(i)
650+ let id = $t02428124315._1
651+ let caller = $t02428124315._2
656652 let addrToUse = if (containsElement([chris, toString(this)], caller))
657653 then addr
658654 else caller
659655 let entryExist = valueOrErrorMessage(getStringByKey(keyName(addrToUse, artId)), "No art matching for this address")
660656 if ((entryExist == ""))
661657 then throw("No art matching for this address")
662658 else {
663659 let sha256Hash = getStringByKey(keyHashByTxidAddr(addrToUse, artId))
664660 if ((sha256Hash == ""))
665661 then throw("No art hash matching for this address")
666662 else {
667663 let signID = getStringByKey(keySignID(addrToUse, artId))
668664 if ((signID == ""))
669665 then throw("No SIGN ID matching")
670666 else {
671667 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(keyidBySignid(addrToUse, signID)), DeleteEntry(keyTxidByHashOwner(sha256Hash, addrToUse)), DeleteEntry(keyEndSale(addrToUse, artId)), DeleteEntry(keyNote(addrToUse, artId)), DeleteEntry(keyCrawler(addrToUse, artId)), DeleteEntry(keyRoyalties(addrToUse, artId))]
672668 if (!(isArtMinted(addrToUse, artId)))
673669 then if (!(dappRunning))
674670 then throw(maintenanceMSG)
675671 else dataToDelete
676672 else if (containsElement([chris, toString(this)], caller))
677673 then dataToDelete
678674 else throw("Art already minted, you cannot delete it")
679675 }
680676 }
681677 }
682678 }
683679
684680
685681
686682 @Callable(i)
687683 func sellArtwork (artId,price,maxMint,assetId,blockEnd,pubKey) = {
688- let $t02721527266 = idCallerDateSponsored(i, pubKey)
689- let id = $t02721527266._1
690- let caller = $t02721527266._2
684+ let $t02715127202 = idCallerDateSponsored(i, pubKey)
685+ let id = $t02715127202._1
686+ let caller = $t02715127202._2
691687 let artworkName = getStringByKey(keyName(caller, artId))
692688 if ((artworkName == ""))
693689 then throw("This art doesn't match your account")
694690 else {
695691 let flag = getStringByKey(keyFlag(caller, artId))
696692 if (containsElement(["CHANGE_REQUIRED", "FLAGGED", "ILLEGAL"], flag))
697693 then throw("Flagged artwork")
698694 else {
699695 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
700696 if ((0 > blockEnd))
701697 then throw("Negative end")
702698 else if (if ((blockEnd > 0))
703699 then if ((maxMint != 1))
704700 then true
705701 else (price != 0)
706702 else false)
707703 then throw("Timed offer only allowed for unique edition and offer only")
708704 else {
709705 let baseHeight = if ((blockEnd == 0))
710706 then 0
711707 else height
712708 if (!(acceptedAssetIds(assetId)))
713709 then throw("Something went wrong!")
714710 else if (!(validateMinSell(assetId, price)))
715711 then throw("Something went wrong!")
716712 else {
717713 let checkUser = validateUser(caller)
718714 if ((checkUser != ""))
719715 then throw(checkUser)
720716 else {
721717 let amountSold = getIntegerByKey(keyIssued(caller, artId))
722718 let maxCanSell = getIntegerByKey(keyMaxMint(caller, artId))
723719 if ((maxMint > 100))
724720 then throw("100 editions max per artwork")
725721 else if (if ((amountSold != 0))
726722 then (amountSold == maxCanSell)
727723 else false)
728724 then throw("Max edition reached.")
729725 else if (if ((amountSold > 0))
730726 then (maxCanSell != maxMint)
731727 else false)
732728 then throw("Cannot change maximum issuable anymore")
733729 else if (if ((bidNbr > 0))
734730 then (maxCanSell != maxMint)
735731 else false)
736732 then throw("Cannot change maximum issuable with active orders")
737733 else {
738734 let sellStatus = if (if ((price > 0))
739735 then (maxMint > 0)
740736 else false)
741737 then true
742738 else false
743739 [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))]
744740 }
745741 }
746742 }
747743 }
748744 }
749745 }
750746 }
751747
752748
753749
754750 @Callable(i)
755751 func buyArtwork (artId,issuer) = buyMint(i, artId, issuer, "", "")
756752
757753
758754
759755 @Callable(i)
760756 func setBid (artId,issuer) = {
761- let $t02952329563 = idCallerDate(i)
762- let id = $t02952329563._1
763- let caller = $t02952329563._2
764- let date = $t02952329563._3
765- let $t02956829604 = isPayment(i)
766- let payment = $t02956829604._1
767- let amount = $t02956829604._2
757+ let $t02945929499 = idCallerDate(i)
758+ let id = $t02945929499._1
759+ let caller = $t02945929499._2
760+ let date = $t02945929499._3
761+ let $t02950429540 = isPayment(i)
762+ let payment = $t02950429540._1
763+ let amount = $t02950429540._2
768764 let assetId = if (!(isDefined(payment.assetId)))
769765 then "WAVES"
770766 else toBase58String(value(payment.assetId))
771767 let blockEnd = getIntegerByKey(keyEndSale(issuer, artId))
772768 if (if ((blockEnd != 0))
773769 then (height >= blockEnd)
774770 else false)
775771 then throw("Sale ended.")
776772 else {
777773 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
778774 if (!(acceptedAssetIds(assetId)))
779775 then throw("asset not accepted")
780776 else if (!(validateMinSell(assetId, amount)))
781777 then throw("Wrong min sell")
782778 else {
783779 let amountSold = getIntegerByKey(keyIssued(issuer, artId))
784780 let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
785781 if ((0 >= maxCanSell))
786782 then throw("No max edition set for this artwork")
787783 else if ((amountSold >= maxCanSell))
788784 then throw("Sold out, you cannot bid")
789785 else [StringEntry((((((((("bid_" + artId) + "_") + issuer) + "_") + caller) + "_") + id) + "_OPEN"), ((((assetId + "_") + toString(amount)) + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr + 1))]
790786 }
791787 }
792788 }
793789
794790
795791
796792 @Callable(i)
797793 func acceptBid (artId,issuer,bidId,bidOwner) = {
798- let $t03076230802 = idCallerDate(i)
799- let id = $t03076230802._1
800- let caller = $t03076230802._2
801- let date = $t03076230802._3
794+ let $t03069830738 = idCallerDate(i)
795+ let id = $t03069830738._1
796+ let caller = $t03069830738._2
797+ let date = $t03069830738._3
802798 if ((caller != issuer))
803799 then throw("You cannot do this action")
804800 else buyMint(i, artId, issuer, bidId, bidOwner)
805801 }
806802
807803
808804
809805 @Callable(i)
810806 func cancelBid (artId,issuer,bidId,bidOwner) = {
811- let $t03102831089 = idCallerDate(i)
812- let id = $t03102831089._1
813- let caller = $t03102831089._2
814- let date = $t03102831089._3
807+ let $t03096431025 = idCallerDate(i)
808+ let id = $t03096431025._1
809+ let caller = $t03096431025._2
810+ let date = $t03096431025._3
815811 if (if ((caller != bidOwner))
816812 then (caller != issuer)
817813 else false)
818814 then throw("You cannot do this action")
819815 else {
820816 let returnMoneyTo = if ((caller == issuer))
821817 then bidOwner
822818 else caller
823819 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
824820 let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
825821 let bidData = getStringByKey((bidDataKey + "_OPEN"))
826822 if ((bidData == ""))
827823 then throw("Bid not found")
828824 else {
829825 let bidDataArr = split(bidData, "_")
830826 let assetId = getBidAssetId(bidDataArr[0])
831827 let bidStatus = "CANCELED"
832828 [DeleteEntry((bidDataKey + "_OPEN")), StringEntry(((bidDataKey + "_") + bidStatus), ((bidData + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr - 1)), ScriptTransfer(Address(fromBase58String(returnMoneyTo)), parseIntValue(bidDataArr[1]), assetId)]
833829 }
834830 }
835831 }
836832
837833
838834 @Verifier(tx)
839835 func verifier () = match tx {
840836 case inv: InvokeScriptTransaction =>
841837 if (if ((inv.function == "addArtwork"))
842838 then (inv.dApp == this)
843839 else false)
844840 then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[13])))
845841 else if (if ((inv.function == "updateArtwork"))
846842 then (inv.dApp == this)
847843 else false)
848844 then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[12])))
849845 else if (if ((inv.function == "sellArtwork"))
850846 then (inv.dApp == this)
851847 else false)
852848 then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[5])))
853849 else sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
854850 case _ =>
855851 sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
856852 }
857853

github/deemru/w8io/169f3d6 
98.89 ms