tx · 9LVcNq4yYu4tSAK7dib3z1Wimo7hRHSdnK5CvW66kuni

3MsqKJ6o1ABE37676cHHBxJRs6huYTt72ch:  -0.02600000 Waves

2024.05.06 11:51 [3094074] smart account 3MsqKJ6o1ABE37676cHHBxJRs6huYTt72ch > SELF 0.00000000 Waves

{ "type": 13, "id": "9LVcNq4yYu4tSAK7dib3z1Wimo7hRHSdnK5CvW66kuni", "fee": 2600000, "feeAssetId": null, "timestamp": 1714989028000, "version": 1, "sender": "3MsqKJ6o1ABE37676cHHBxJRs6huYTt72ch", "senderPublicKey": "3xjN6fjYDXBGUE1mcRw2Fvr4R6tEZnuJA98QFGF99sXd", "proofs": [ "667jNVhiqAoyKauXofF1k8qrsVHDYBxMaUKpLm9Xtj75XZpiVZd2rMovUm7Dw3UatjDggnU7W6J8gm2rAxC88Xms" ], "script": "base64:CAIlCAISBAoCAgISBQoDAgIBEgUKAwICARIGCgQBAgIBEgMKAQISADUAB0lOVF9NQVgA//////////9/AAVXQVZFUwCAwtcvAAtNSU5fQkFMQU5DRQkAaAIAoJwBBQVXQVZFUwATTUFYX0JMT0NLU19BVF9FUE9DSAAyAANTRVACASwAD0JMT0NLX0hBU0hfU0laRQAgAAxBRERSRVNTX1NJWkUAGgATTUFYX0JMT0NLU19TVFJfU0laRQkAZAIJAGgCAEAFE01BWF9CTE9DS1NfQVRfRVBPQ0gJAGUCBRNNQVhfQkxPQ0tTX0FUX0VQT0NIAAEAEHRoaXNFcG9jaERhdGFLZXkCDXRoaXNFcG9jaERhdGEADGFsbE1pbmVyc0tleQIJYWxsTWluZXJzAA5tYWluQ2hhaW5JZEtleQILbWFpbkNoYWluSWQADmxhc3RDaGFpbklkS2V5AgtsYXN0Q2hhaW5JZAAYbGFzdEVwb2NoQmxvY2tzTnVtYmVyS2V5AhVsYXN0RXBvY2hCbG9ja3NOdW1iZXIADm1pbmVyUmV3YXJkS2V5AgttaW5lclJld2FyZAAKYmxvY2tNZXRhSwIIYmxvY2tfMHgBA3BhZAEBaQQBcwkApAMBBQFpBAckbWF0Y2gwCQCxAgEFAXMDCQAAAgABBQckbWF0Y2gwCQCsAgICBzAwMDAwMDAFAXMDCQAAAgACBQckbWF0Y2gwCQCsAgICBjAwMDAwMAUBcwMJAAACAAMFByRtYXRjaDAJAKwCAgIFMDAwMDAFAXMDCQAAAgAEBQckbWF0Y2gwCQCsAgICBDAwMDAFAXMDCQAAAgAFBQckbWF0Y2gwCQCsAgICAzAwMAUBcwMJAAACAAYFByRtYXRjaDAJAKwCAgICMDAFAXMDCQAAAgAHBQckbWF0Y2gwCQCsAgICATAFAXMFAXMBDGVwb2NoTWV0YUtleQEFZXBvY2gJAKwCAgIGZXBvY2hfCQEDcGFkAQUFZXBvY2gAFnN0YWtpbmdDb250cmFjdEFkZHJlc3MJAQdBZGRyZXNzAQkBEUBleHRyTmF0aXZlKDEwNTIpAgUEdGhpcwIWc3Rha2luZ0NvbnRyYWN0QWRkcmVzcwERZ2VuZXJhdGluZ0JhbGFuY2UBB2FkZHJlc3MEByRtYXRjaDAJAJ0IAgUWc3Rha2luZ0NvbnRyYWN0QWRkcmVzcwkArAICAgQlc19fCQClCAEFB2FkZHJlc3MDCQABAgUHJG1hdGNoMAIGU3RyaW5nBANzdHIFByRtYXRjaDAECXBhcmFtTGlzdAkAtQkCBQNzdHICAl9fBApwcmV2SGVpZ2h0CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUJcGFyYW1MaXN0AAEEC3ByZXZCYWxhbmNlCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUJcGFyYW1MaXN0AAIECm5leHRIZWlnaHQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQlwYXJhbUxpc3QAAwQLbmV4dEJhbGFuY2UJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQlwYXJhbUxpc3QABAMJAGcCBQZoZWlnaHQFCm5leHRIZWlnaHQFC25leHRCYWxhbmNlAwkAZwIFBmhlaWdodAUKcHJldkhlaWdodAULcHJldkJhbGFuY2UAAAAAAQxibG9ja01ldGFLZXkBB2Jsb2NrSWQJAKwCAgIJYmxvY2tNZXRhCQDcBAEFB2Jsb2NrSWQBCmNoYWluSWRLZXkBCWdlbmVyYXRvcgkArAICAgljaGFpbklkT2YJANwEAQUJZ2VuZXJhdG9yAQ5jaGFpbkhlaWdodEtleQEHY2hhaW5JZAkArAICCQCsAgICBWNoYWluCQCkAwEFB2NoYWluSWQCBkhlaWdodAEUY2hhaW5GaXJzdEJsb2NrSWRLZXkBB2NoYWluSWQJAKwCAgkArAICAgVjaGFpbgkApAMBBQdjaGFpbklkAgpGaXJzdEJsb2NrARNjaGFpbkxhc3RCbG9ja0lkS2V5AQdjaGFpbklkCQCsAgIJAKwCAgIFY2hhaW4JAKQDAQUHY2hhaW5JZAIJTGFzdEJsb2NrARNjaGFpbkFsbEJsb2NrSWRzS2V5AgdjaGFpbklkAW4JAKwCAgkArAICCQCsAgICBWNoYWluCQCkAwEFB2NoYWluSWQCCUFsbEJsb2NrcwkApAMBBQFuARhjaGFpbkFsbEJsb2NrSWRzTGFzdE5LZXkBB2NoYWluSWQJAKwCAgkArAICAgVjaGFpbgkApAMBBQdjaGFpbklkAg5BbGxCbG9ja3NMYXN0TgENc3VwcG9ydGVyc0tleQEHY2hhaW5JZAkArAICCQCsAgICBWNoYWluCQCkAwEFB2NoYWluSWQCClN1cHBvcnRlcnMBEm1pbmVyUmV3YXJkQWRkcmVzcwEJbWluZXJBZGRyCQCsAgIJAKwCAgIFbWluZXIFCW1pbmVyQWRkcgINUmV3YXJkQWRkcmVzcwESbWluZXJKb2luSGVpZ2h0S2V5AQltaW5lckFkZHIJAKwCAgkArAICAgVtaW5lcgUJbWluZXJBZGRyAgpKb2luSGVpZ2h0AQptaW5lclBrS2V5AQ1yZXdhcmRBZGRyZXNzCQCsAgIJAKwCAgIFbWluZXIFDXJld2FyZEFkZHJlc3MCAlBLARBsZWF2aW5nTWluZXJzS2V5AQVlcG9jaAkArAICAg9sZWF2aW5nTWluZXJzQXQJAKQDAQUFZXBvY2gAC21haW5DaGFpbklkCQELdmFsdWVPckVsc2UCCQCfCAEFDm1haW5DaGFpbklkS2V5AAAADnRoaXNFcG9jaE1pbmVyBAckbWF0Y2gwCQCiCAEFEHRoaXNFcG9jaERhdGFLZXkDCQABAgUHJG1hdGNoMAIGU3RyaW5nBBByYXdUaGlzRXBvY2hEYXRhBQckbWF0Y2gwBA10aGlzRXBvY2hEYXRhCQC1CQIFEHJhd1RoaXNFcG9jaERhdGEFA1NFUAQJdGhpc0Vwb2NoCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUNdGhpc0Vwb2NoRGF0YQAAAwkAAAIFCXRoaXNFcG9jaAUGaGVpZ2h0CQDZBAEJAJEDAgUNdGhpc0Vwb2NoRGF0YQABBQR1bml0BQR1bml0AAlhbGxNaW5lcnMEByRtYXRjaDAJAKIIAQUMYWxsTWluZXJzS2V5AwkAAQIFByRtYXRjaDACBlN0cmluZwQDcmF3BQckbWF0Y2gwCQC8CQIFA3JhdwUDU0VQBQNuaWwAEGFsbExlYXZpbmdNaW5lcnMEByRtYXRjaDAJAKIIAQkBEGxlYXZpbmdNaW5lcnNLZXkBBQZoZWlnaHQDCQABAgUHJG1hdGNoMAIGU3RyaW5nBANyYXcFByRtYXRjaDAJALwJAgUDcmF3BQNTRVAFA25pbAEJYmxvY2tNZXRhAQdibG9ja0lkBARtZXRhCQERQGV4dHJOYXRpdmUoMTA1NykBCQEMYmxvY2tNZXRhS2V5AQUHYmxvY2tJZAQRbWV0YVdpdGhvdXRIZWlnaHQJAMoBAgUEbWV0YQAIBBZtZXRhV2l0aG91dEhlaWdodEVwb2NoCQDKAQIFEW1ldGFXaXRob3V0SGVpZ2h0AAgEC2Jsb2NrSGVpZ2h0CQCxCQEJAMkBAgUEbWV0YQAIBApibG9ja0Vwb2NoCQCxCQEJAMkBAgURbWV0YVdpdGhvdXRIZWlnaHQACAQLYmxvY2tQYXJlbnQJAMkBAgUWbWV0YVdpdGhvdXRIZWlnaHRFcG9jaAUPQkxPQ0tfSEFTSF9TSVpFBA5ibG9ja0dlbmVyYXRvcgkAzAECBQRtZXRhBQxBRERSRVNTX1NJWkUJAJYKBAULYmxvY2tIZWlnaHQFCmJsb2NrRXBvY2gFC2Jsb2NrUGFyZW50BQ5ibG9ja0dlbmVyYXRvcgEMc2V0RXBvY2hEYXRhAQlnZW5lcmF0b3IJAQtTdHJpbmdFbnRyeQIFEHRoaXNFcG9jaERhdGFLZXkJAKwCAgkArAICCQCkAwEFBmhlaWdodAUDU0VQCQDYBAEIBQlnZW5lcmF0b3IFYnl0ZXMACyR0MDQwNDY1MTAzBAloaXRTb3VyY2UEByRtYXRjaDAIBQlsYXN0QmxvY2sDdnJmAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEA3ZyZgUHJG1hdGNoMAUDdnJmCAUJbGFzdEJsb2NrE2dlbmVyYXRpb25TaWduYXR1cmUKAQxwcm9jZXNzTWluZXICBHByZXYFbWluZXIECyR0MDQzNDQ0NDA3BQRwcmV2BAlwcmV2RGVsYXkIBQskdDA0MzQ0NDQwNwJfMQQJcHJldk1pbmVyCAULJHQwNDM0NDQ0MDcCXzIEEHByZXZUb3RhbEJhbGFuY2UIBQskdDA0MzQ0NDQwNwJfMwQKcHJldk1pbmVycwgFCyR0MDQzNDQ0NDA3Al80BAxtaW5lckFkZHJlc3MJARFAZXh0ck5hdGl2ZSgxMDYyKQEFBW1pbmVyBA93YXZlc0dlbkJhbGFuY2UICQDvBwEFDG1pbmVyQWRkcmVzcwpnZW5lcmF0aW5nBAxtaW5lckJhbGFuY2UJARFnZW5lcmF0aW5nQmFsYW5jZQEFDG1pbmVyQWRkcmVzcwMDAwkAZgIFC01JTl9CQUxBTkNFBQ93YXZlc0dlbkJhbGFuY2UGCQBnAgAABQxtaW5lckJhbGFuY2UGCQBmAgkBC3ZhbHVlT3JFbHNlAgkAnwgBCQESbWluZXJKb2luSGVpZ2h0S2V5AQUFbWluZXIFB0lOVF9NQVgFBmhlaWdodAUEcHJldgQJbmV4dERlbGF5CQCFBwIFDG1pbmVyQWRkcmVzcwUMbWluZXJCYWxhbmNlAwkAZgIFCXByZXZEZWxheQUJbmV4dERlbGF5CQCWCgQFCW5leHREZWxheQUFbWluZXIJAGQCBRBwcmV2VG90YWxCYWxhbmNlBQxtaW5lckJhbGFuY2UJAM0IAgUKcHJldk1pbmVycwUFbWluZXIJAJYKBAUJcHJldkRlbGF5BQlwcmV2TWluZXIJAGQCBRBwcmV2VG90YWxCYWxhbmNlBQxtaW5lckJhbGFuY2UJAM0IAgUKcHJldk1pbmVycwUFbWluZXIKAAIkbAkAzggCBQlhbGxNaW5lcnMFEGFsbExlYXZpbmdNaW5lcnMKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCWCgQFB0lOVF9NQVgCAAAABQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBDHByb2Nlc3NNaW5lcgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgNTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUABUAFgAXABgAGQAaABsAHAAdAB4AHwAgACEAIgAjACQAJQAmACcAKAApACoAKwAsAC0ALgAvADAAMQAyAA1jb21wdXRlZERlbGF5CAULJHQwNDA0NjUxMDMCXzEAEWNvbXB1dGVkR2VuZXJhdG9yCAULJHQwNDA0NjUxMDMCXzIAFGNvbXB1dGVkVG90YWxCYWxhbmNlCAULJHQwNDA0NjUxMDMCXzMADmZpbHRlcmVkTWluZXJzCAULJHQwNDA0NjUxMDMCXzQAEnNhZmVSb2xsYmFja0hlaWdodAoBCmFkZEJhbGFuY2UCA2FjYwpibG9ja0lkU3RyBAskdDA1MjE3NTI2MQUDYWNjBAx0b3RhbEJhbGFuY2UIBQskdDA1MjE3NTI2MQJfMQQGcHJldklkCAULJHQwNTIxNzUyNjECXzIECmdlbmVyYXRvcnMIBQskdDA1MjE3NTI2MQJfMwMJAGYCBQx0b3RhbEJhbGFuY2UJAGkCBRRjb21wdXRlZFRvdGFsQmFsYW5jZQACBQNhY2MEB2Jsb2NrSWQJAN0EAQUKYmxvY2tJZFN0cgQJZ2VuZXJhdG9yCQEHQWRkcmVzcwEICQEJYmxvY2tNZXRhAQUHYmxvY2tJZAJfNAMJAQ9jb250YWluc0VsZW1lbnQCBQpnZW5lcmF0b3JzBQlnZW5lcmF0b3IFA2FjYwQHYmFsYW5jZQkBEWdlbmVyYXRpbmdCYWxhbmNlAQUJZ2VuZXJhdG9yCQCVCgMJAGQCBQx0b3RhbEJhbGFuY2UFB2JhbGFuY2UFB2Jsb2NrSWQJAM0IAgUKZ2VuZXJhdG9ycwUJZ2VuZXJhdG9yCgELZ2V0QmxvY2tJZHMBAW4EBnJhd1N0cgkBC3ZhbHVlT3JFbHNlAgkAoggBCQETY2hhaW5BbGxCbG9ja0lkc0tleQIFC21haW5DaGFpbklkBQFuAgADCQAAAgUGcmF3U3RyAgAFA25pbAkAvAkCBQZyYXdTdHIFA1NFUAQFbGFzdE4JAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBGGNoYWluQWxsQmxvY2tJZHNMYXN0TktleQEFC21haW5DaGFpbklkAAAEDGFsbEJsb2Nrc0lkcwkAzggCCQDOCAIJAM4IAgkBC2dldEJsb2NrSWRzAQUFbGFzdE4JAQtnZXRCbG9ja0lkcwEJAGUCBQVsYXN0TgABCQELZ2V0QmxvY2tJZHMBCQBlAgUFbGFzdE4AAgkBC2dldEJsb2NrSWRzAQkAZQIFBWxhc3ROAAMECyR0MDYwMjk2MTAzCgACJGwFDGFsbEJsb2Nrc0lkcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJUKAwAAAQAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEKYWRkQmFsYW5jZQIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIVTGlzdCBzaXplIGV4Y2VlZHMgMjAwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAAVABYAFwAYABkAGgAbABwAHQAeAB8AIAAhACIAIwAkACUAJgAnACgAKQAqACsALAAtAC4ALwAwADEAMgAzADQANQA2ADcAOAA5ADoAOwA8AD0APgA/AEAAQQBCAEMARABFAEYARwBIAEkASgBLAEwATQBOAE8AUABRAFIAUwBUAFUAVgBXAFgAWQBaAFsAXABdAF4AXwBgAGEAYgBjAGQAZQBmAGcAaABpAGoAawBsAG0AbgBvAHAAcQByAHMAdAB1AHYAdwB4AHkAegB7AHwAfQB+AH8AgAEAgQEAggEAgwEAhAEAhQEAhgEAhwEAiAEAiQEAigEAiwEAjAEAjQEAjgEAjwEAkAEAkQEAkgEAkwEAlAEAlQEAlgEAlwEAmAEAmQEAmgEAmwEAnAEAnQEAngEAnwEAoAEAoQEAogEAowEApAEApQEApgEApwEAqAEAqQEAqgEAqwEArAEArQEArgEArwEAsAEAsQEAsgEAswEAtAEAtQEAtgEAtwEAuAEAuQEAugEAuwEAvAEAvQEAvgEAvwEAwAEAwQEAwgEAwwEAxAEAxQEAxgEAxwEAyAEEAl9iCAULJHQwNjAyOTYxMDMCXzEEB2Jsb2NrSWQIBQskdDA2MDI5NjEwMwJfMggJAQlibG9ja01ldGEBBQdibG9ja0lkAl8xARFzdXBwb3J0aW5nQmFsYW5jZQEHY2hhaW5JZAoBCmFkZEJhbGFuY2UCA2FjYwxnZW5lcmF0b3JTdHIECyR0MDYyNDg2Mjg0BQNhY2MEDHRvdGFsQmFsYW5jZQgFCyR0MDYyNDg2Mjg0Al8xBApnZW5lcmF0b3JzCAULJHQwNjI0ODYyODQCXzIECWdlbmVyYXRvcgkBEUBleHRyTmF0aXZlKDEwNjIpAQUMZ2VuZXJhdG9yU3RyAwkBD2NvbnRhaW5zRWxlbWVudAIFCmdlbmVyYXRvcnMFCWdlbmVyYXRvcgUDYWNjBAdiYWxhbmNlCQERZ2VuZXJhdGluZ0JhbGFuY2UBBQlnZW5lcmF0b3IJAJQKAgkAZAIFDHRvdGFsQmFsYW5jZQUHYmFsYW5jZQkAzQgCBQpnZW5lcmF0b3JzBQlnZW5lcmF0b3IEDWFsbEdlbmVyYXRvcnMJALwJAgkBEUBleHRyTmF0aXZlKDEwNTgpAQkBDXN1cHBvcnRlcnNLZXkBBQdjaGFpbklkBQNTRVAECyR0MDY2MDY2NjcxCgACJGwFDWFsbEdlbmVyYXRvcnMKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIAAAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQphZGRCYWxhbmNlAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhVMaXN0IHNpemUgZXhjZWVkcyAxMDAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUABUAFgAXABgAGQAaABsAHAAdAB4AHwAgACEAIgAjACQAJQAmACcAKAApACoAKwAsAC0ALgAvADAAMQAyADMANAA1ADYANwA4ADkAOgA7ADwAPQA+AD8AQABBAEIAQwBEAEUARgBHAEgASQBKAEsATABNAE4ATwBQAFEAUgBTAFQAVQBWAFcAWABZAFoAWwBcAF0AXgBfAGAAYQBiAGMAZAQHYmFsYW5jZQgFCyR0MDY2MDY2NjcxAl8xBAJfZwgFCyR0MDY2MDY2NjcxAl8yBQdiYWxhbmNlARFlbnN1cmVNaW5pbmdFcG9jaAEJZ2VuZXJhdG9yAwkBAiE9AgkApQgBBQlnZW5lcmF0b3IFEWNvbXB1dGVkR2VuZXJhdG9yCQACAQkArAICCQCsAgIJAKwCAgkArAICCQDYBAEIBQlnZW5lcmF0b3IFYnl0ZXMCGyBpcyBub3QgYWxsb3dlZCB0byBtaW5lIGluIAkApAMBBQZoZWlnaHQCESBlcG9jaC4gRXhwZWN0ZWQgBRFjb21wdXRlZEdlbmVyYXRvcgUEdW5pdAESaXNSZWZlcmVuY2VDb3JyZWN0AglyZWZlcmVuY2UJbGFzdEJsb2NrBAckbWF0Y2gwBQlsYXN0QmxvY2sDCQABAgUHJG1hdGNoMAIEVW5pdAUEdW5pdAMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAJsYgUHJG1hdGNoMAMJAAACBQlyZWZlcmVuY2UFAmxiBQR1bml0CQACAQkArAICCQCsAgIJAKwCAgIuRXhwZWN0ZWQgYSByZWZlcmVuY2UgdG8gdGhlIGNoYWluIGxhc3QgYmxvY2s6IAkA3AQBBQJsYgIHLiBHb3Q6IAkA3AQBBQlyZWZlcmVuY2UJAAIBAgtNYXRjaCBlcnJvcgEPY2hhaW5Jc0luYWN0aXZlAQdjaGFpbklkBAxmaXJzdEJsb2NrSWQJARFAZXh0ck5hdGl2ZSgxMDU3KQEJARRjaGFpbkZpcnN0QmxvY2tJZEtleQEFB2NoYWluSWQJAGYCBRJzYWZlUm9sbGJhY2tIZWlnaHQICQEJYmxvY2tNZXRhAQUMZmlyc3RCbG9ja0lkAl8xARllbnN1cmVNYWluT3JJbmFjdGl2ZUNoYWluAQlnZW5lcmF0b3IEByRtYXRjaDAJAJ8IAQkBCmNoYWluSWRLZXkBCAUJZ2VuZXJhdG9yBWJ5dGVzAwkAAQIFByRtYXRjaDACA0ludAQJY3VycmVudElkBQckbWF0Y2gwAwMJAAACBQljdXJyZW50SWQFC21haW5DaGFpbklkBgkBD2NoYWluSXNJbmFjdGl2ZQEFCWN1cnJlbnRJZAUEdW5pdAkAAgEJAKwCAgIcbWluZXIgaXMgbWluaW5nIG90aGVyIGNoYWluIAkApAMBBQljdXJyZW50SWQFBHVuaXQBF2Vuc3VyZUFsdENoYWluRXh0ZW5zaW9uAglnZW5lcmF0b3IHY2hhaW5JZAQHJG1hdGNoMAkAnwgBCQEKY2hhaW5JZEtleQEIBQlnZW5lcmF0b3IFYnl0ZXMDCQABAgUHJG1hdGNoMAIDSW50BAljdXJyZW50SWQFByRtYXRjaDADCQAAAgUJY3VycmVudElkBQdjaGFpbklkBQR1bml0BBVleHRlbmRpbmdGaXJzdEJsb2NrSWQJARFAZXh0ck5hdGl2ZSgxMDU3KQEJARRjaGFpbkZpcnN0QmxvY2tJZEtleQEFB2NoYWluSWQEGG1pbmVyQ3VycmVudEZpcnN0QmxvY2tJZAkBEUBleHRyTmF0aXZlKDEwNTcpAQkBFGNoYWluRmlyc3RCbG9ja0lkS2V5AQUJY3VycmVudElkBBlleHRlbmRpbmdGaXJzdEJsb2NrSGVpZ2h0CAkBCWJsb2NrTWV0YQEFFWV4dGVuZGluZ0ZpcnN0QmxvY2tJZAJfMQQcbWluZXJDdXJyZW50Rmlyc3RCbG9ja0hlaWdodAgJAQlibG9ja01ldGEBBRhtaW5lckN1cnJlbnRGaXJzdEJsb2NrSWQCXzEDCQBmAgUZZXh0ZW5kaW5nRmlyc3RCbG9ja0hlaWdodAUcbWluZXJDdXJyZW50Rmlyc3RCbG9ja0hlaWdodAUEdW5pdAkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAhxtaW5lciBpcyBtaW5pbmcgb3RoZXIgY2hhaW4gCQCkAwEFCWN1cnJlbnRJZAImLCBoZWlnaHQgb2YgdGhlIGFsdCBjaGFpbiBmaXJzdCBibG9jayAJAKQDAQUZZXh0ZW5kaW5nRmlyc3RCbG9ja0hlaWdodAI/IGlzIG5vdCBsZXNzIHRoYW4gaGVpZ2h0IG9mIHRoZSBtaW5lciBhY3RpdmUgY2hhaW4gZmlyc3QgYmxvY2sgCQCkAwEFHG1pbmVyQ3VycmVudEZpcnN0QmxvY2tIZWlnaHQFBHVuaXQBIGVuc3VyZVJlZmVyZW5jZUlzU2FmZUZvclJvbGxiYWNrAQlyZWZlcmVuY2UEC3N0YXJ0SGVpZ2h0CAkBCWJsb2NrTWV0YQEFCXJlZmVyZW5jZQJfMQMJAGYCBRJzYWZlUm9sbGJhY2tIZWlnaHQFC3N0YXJ0SGVpZ2h0CQACAQkArAICCQCsAgIJAKwCAgINc3RhcnQgaGVpZ2h0IAkApAMBBQtzdGFydEhlaWdodAIdIGlzIGxlc3MgdGhhbiBtaW5pbXVtIGhlaWdodCAJAKQDAQUSc2FmZVJvbGxiYWNrSGVpZ2h0BQR1bml0ARJlbnN1cmVDb3JyZWN0RXBvY2gBBWVwb2NoAwkAAAIFBWVwb2NoBQZoZWlnaHQFBHVuaXQJAAIBCQCsAgIJAKwCAgkArAICAhpFeHBlY3RlZCBibG9jayBmcm9tIGVwb2NoIAkApAMBBQZoZWlnaHQCBi4gR290IAkApAMBBQVlcG9jaAERY2hlY2tCbG9ja3NOdW1iZXIAAwkAZgIFE01BWF9CTE9DS1NfQVRfRVBPQ0gJARFAZXh0ck5hdGl2ZSgxMDU1KQEFGGxhc3RFcG9jaEJsb2Nrc051bWJlcktleQUEdW5pdAkAAgECIk1heCBibG9ja3MgbnVtYmVyIGF0IGVwb2NoIHJlYWNoZWQBDGFkZFN1cHBvcnRlcgIHY2hhaW5JZAlnZW5lcmF0b3IEDXN1cHBvcnRlcnNTdHIJARFAZXh0ck5hdGl2ZSgxMDU4KQEJAQ1zdXBwb3J0ZXJzS2V5AQUHY2hhaW5JZAQKc3VwcG9ydGVycwkAtQkCBQ1zdXBwb3J0ZXJzU3RyBQNTRVADCQEPY29udGFpbnNFbGVtZW50AgUKc3VwcG9ydGVycwkApQgBBQlnZW5lcmF0b3IFA25pbAkAzAgCCQELU3RyaW5nRW50cnkCCQENc3VwcG9ydGVyc0tleQEFB2NoYWluSWQJAKwCAgkArAICBQ1zdXBwb3J0ZXJzU3RyBQNTRVAJAKUIAQUJZ2VuZXJhdG9yBQNuaWwGAWkBC2FwcGVuZEJsb2NrAglibG9ja0hhc2gJcmVmZXJlbmNlBAVjaGVjawkBEWNoZWNrQmxvY2tzTnVtYmVyAAMJAAACBQVjaGVjawUFY2hlY2sDCQECIT0CBQ50aGlzRXBvY2hNaW5lcggIBQFpDG9yaWdpbkNhbGxlcgVieXRlcwQHJG1hdGNoMAUOdGhpc0Vwb2NoTWluZXIDCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQKZXBvY2hNaW5lcgUHJG1hdGNoMAkAAgEJAKwCAgI5bm90IGFsbG93ZWQgdG8gZm9yZ2UgYmxvY2tzIGluIHRoaXMgZXBvY2gsIGV4cGVjdGVkIGZyb20gCQDYBAEFCmVwb2NoTWluZXIJAAIBAkBub3QgYWxsb3dlZCB0byBmb3JnZSBibG9ja3MgaW4gdGhpcyBlcG9jaCwgZXBvY2ggbWluZXIgaXMgYWJzZW50BAdjaGFpbklkCQELdmFsdWVPckVsc2UCCQCfCAEJAQpjaGFpbklkS2V5AQgIBQFpDG9yaWdpbkNhbGxlcgVieXRlcwULbWFpbkNoYWluSWQEC2xhc3RCbG9ja0lkCQERQGV4dHJOYXRpdmUoMTA1NykBCQETY2hhaW5MYXN0QmxvY2tJZEtleQEFB2NoYWluSWQEBmNoZWNrMgkBEmlzUmVmZXJlbmNlQ29ycmVjdAIFCXJlZmVyZW5jZQULbGFzdEJsb2NrSWQDCQAAAgUGY2hlY2syBQZjaGVjazIEC2NoYWluSGVpZ2h0CQELdmFsdWVPckVsc2UCCQCfCAEJAQ5jaGFpbkhlaWdodEtleQEFB2NoYWluSWQAAAQJbmV3SGVpZ2h0CQBkAgULY2hhaW5IZWlnaHQAAQQMYmxvY2tzTnVtYmVyCQELdmFsdWVPckVsc2UCCQCfCAEFGGxhc3RFcG9jaEJsb2Nrc051bWJlcktleQAABAxuZXdCbG9ja01ldGEJAMsBAgkAywECCQDLAQIJAJoDAQUJbmV3SGVpZ2h0CQCaAwEFBmhlaWdodAULbGFzdEJsb2NrSWQICAUBaQxvcmlnaW5DYWxsZXIFYnl0ZXMJAMwIAgkBC0JpbmFyeUVudHJ5AgkBDGJsb2NrTWV0YUtleQEFCWJsb2NrSGFzaAUMbmV3QmxvY2tNZXRhCQDMCAIJAQtCaW5hcnlFbnRyeQIJAKwCAgUKYmxvY2tNZXRhSwkA3AQBBQlibG9ja0hhc2gFDG5ld0Jsb2NrTWV0YQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBDmNoYWluSGVpZ2h0S2V5AQUHY2hhaW5JZAUJbmV3SGVpZ2h0CQDMCAIJAQtCaW5hcnlFbnRyeQIJARNjaGFpbkxhc3RCbG9ja0lkS2V5AQUHY2hhaW5JZAUJYmxvY2tIYXNoCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRhsYXN0RXBvY2hCbG9ja3NOdW1iZXJLZXkJAGQCBQxibG9ja3NOdW1iZXIAAQkAzAgCCQELU3RyaW5nRW50cnkCCQEMZXBvY2hNZXRhS2V5AQUGaGVpZ2h0CQCsAgIJAKwCAgkApQgBCAUBaQxvcmlnaW5DYWxsZXICAywwLAkA3AQBBQlibG9ja0hhc2gFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQ9leHRlbmRNYWluQ2hhaW4DCWJsb2NrSGFzaAlyZWZlcmVuY2UFZXBvY2gECmNoZWNrRXBvY2gJARJlbnN1cmVDb3JyZWN0RXBvY2gBBQVlcG9jaAMJAAACBQpjaGVja0Vwb2NoBQpjaGVja0Vwb2NoBA5jaGVja0dlbmVyYXRvcgkBEWVuc3VyZU1pbmluZ0Vwb2NoAQgFAWkMb3JpZ2luQ2FsbGVyAwkAAAIFDmNoZWNrR2VuZXJhdG9yBQ5jaGVja0dlbmVyYXRvcgQKY2hlY2tDaGFpbgkBGWVuc3VyZU1haW5PckluYWN0aXZlQ2hhaW4BCAUBaQxvcmlnaW5DYWxsZXIDCQAAAgUKY2hlY2tDaGFpbgUKY2hlY2tDaGFpbgQLY2hhaW5IZWlnaHQJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBDmNoYWluSGVpZ2h0S2V5AQULbWFpbkNoYWluSWQAAAQQbGFzdFZhbGlkQmxvY2tJZAkAoQgBCQETY2hhaW5MYXN0QmxvY2tJZEtleQEFC21haW5DaGFpbklkBA5jaGVja1JlZmVyZW5jZQkBEmlzUmVmZXJlbmNlQ29ycmVjdAIFCXJlZmVyZW5jZQUQbGFzdFZhbGlkQmxvY2tJZAMJAAACBQ5jaGVja1JlZmVyZW5jZQUOY2hlY2tSZWZlcmVuY2UEDWJsb2NrSWRzTGFzdE4JAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBGGNoYWluQWxsQmxvY2tJZHNMYXN0TktleQEFC21haW5DaGFpbklkAAAECGJsb2NrSWRzCQELdmFsdWVPckVsc2UCCQCiCAEJARNjaGFpbkFsbEJsb2NrSWRzS2V5AgULbWFpbkNoYWluSWQFDWJsb2NrSWRzTGFzdE4CAAQJbmV3SGVpZ2h0CQBkAgULY2hhaW5IZWlnaHQAAQQRdXBkYXRlQWxsQmxvY2tJZHMDCQBnAgkAsQIBBQhibG9ja0lkcwUTTUFYX0JMT0NLU19TVFJfU0laRQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBGGNoYWluQWxsQmxvY2tJZHNMYXN0TktleQEFC21haW5DaGFpbklkCQBkAgUNYmxvY2tJZHNMYXN0TgABCQDMCAIJAQtTdHJpbmdFbnRyeQIJARNjaGFpbkFsbEJsb2NrSWRzS2V5AgULbWFpbkNoYWluSWQJAGQCBQ1ibG9ja0lkc0xhc3ROAAEJANwEAQUJYmxvY2tIYXNoBQNuaWwEC25ld0Jsb2NrSWRzAwkAAAIFCGJsb2NrSWRzAgAJANwEAQUJYmxvY2tIYXNoCQCsAgIJAKwCAgkA3AQBBQlibG9ja0hhc2gFA1NFUAUIYmxvY2tJZHMJAMwIAgkBC1N0cmluZ0VudHJ5AgkBE2NoYWluQWxsQmxvY2tJZHNLZXkCBQttYWluQ2hhaW5JZAUNYmxvY2tJZHNMYXN0TgULbmV3QmxvY2tJZHMFA25pbAQMZmlyc3RCbG9ja0lkBAckbWF0Y2gwBRBsYXN0VmFsaWRCbG9ja0lkAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAmlkBQckbWF0Y2gwBQNuaWwJAMwIAgkBC0JpbmFyeUVudHJ5AgkBFGNoYWluRmlyc3RCbG9ja0lkS2V5AQULbWFpbkNoYWluSWQFCWJsb2NrSGFzaAUDbmlsBAxuZXdCbG9ja01ldGEJAMsBAgkAywECCQDLAQIJAJoDAQUJbmV3SGVpZ2h0CQCaAwEFBmhlaWdodAUJcmVmZXJlbmNlCAgFAWkMb3JpZ2luQ2FsbGVyBWJ5dGVzCQDOCAIJAM4IAgkAzAgCCQELQmluYXJ5RW50cnkCCQEMYmxvY2tNZXRhS2V5AQUJYmxvY2tIYXNoBQxuZXdCbG9ja01ldGEJAMwIAgkBC0JpbmFyeUVudHJ5AgkArAICBQpibG9ja01ldGFLCQDcBAEFCWJsb2NrSGFzaAUMbmV3QmxvY2tNZXRhCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEOY2hhaW5IZWlnaHRLZXkBBQttYWluQ2hhaW5JZAUJbmV3SGVpZ2h0CQDMCAIJAQtCaW5hcnlFbnRyeQIJARNjaGFpbkxhc3RCbG9ja0lkS2V5AQULbWFpbkNoYWluSWQFCWJsb2NrSGFzaAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBCmNoYWluSWRLZXkBCAgFAWkMb3JpZ2luQ2FsbGVyBWJ5dGVzBQttYWluQ2hhaW5JZAkAzAgCCQEMc2V0RXBvY2hEYXRhAQgFAWkMb3JpZ2luQ2FsbGVyCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRhsYXN0RXBvY2hCbG9ja3NOdW1iZXJLZXkAAQkAzAgCCQELU3RyaW5nRW50cnkCCQEMZXBvY2hNZXRhS2V5AQUGaGVpZ2h0CQCsAgIJAKwCAgkApQgBCAUBaQxvcmlnaW5DYWxsZXICAywwLAkA3AQBBQlibG9ja0hhc2gFA25pbAUMZmlyc3RCbG9ja0lkBRF1cGRhdGVBbGxCbG9ja0lkcwkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQ1zdGFydEFsdENoYWluAwlibG9ja0hhc2gJcmVmZXJlbmNlBWVwb2NoBApjaGVja0Vwb2NoCQESZW5zdXJlQ29ycmVjdEVwb2NoAQUFZXBvY2gDCQAAAgUKY2hlY2tFcG9jaAUKY2hlY2tFcG9jaAQOY2hlY2tSZWZlcmVuY2UJASBlbnN1cmVSZWZlcmVuY2VJc1NhZmVGb3JSb2xsYmFjawEFCXJlZmVyZW5jZQMJAAACBQ5jaGVja1JlZmVyZW5jZQUOY2hlY2tSZWZlcmVuY2UEDmNoZWNrR2VuZXJhdG9yCQERZW5zdXJlTWluaW5nRXBvY2gBCAUBaQxvcmlnaW5DYWxsZXIDCQAAAgUOY2hlY2tHZW5lcmF0b3IFDmNoZWNrR2VuZXJhdG9yBApjaGVja0NoYWluCQEZZW5zdXJlTWFpbk9ySW5hY3RpdmVDaGFpbgEIBQFpDG9yaWdpbkNhbGxlcgMJAAACBQpjaGVja0NoYWluBQpjaGVja0NoYWluBApuZXdDaGFpbklkCQBkAgkBC3ZhbHVlT3JFbHNlAgkAnwgBBQ5sYXN0Q2hhaW5JZEtleQAAAAEECW5ld0hlaWdodAkAZAIICQEJYmxvY2tNZXRhAQUJcmVmZXJlbmNlAl8xAAEEDG5ld0Jsb2NrTWV0YQkAywECCQDLAQIJAMsBAgkAmgMBBQluZXdIZWlnaHQJAJoDAQUGaGVpZ2h0BQlyZWZlcmVuY2UICAUBaQxvcmlnaW5DYWxsZXIFYnl0ZXMJAMwIAgkBC0JpbmFyeUVudHJ5AgkBDGJsb2NrTWV0YUtleQEFCWJsb2NrSGFzaAUMbmV3QmxvY2tNZXRhCQDMCAIJAQtCaW5hcnlFbnRyeQIJAKwCAgUKYmxvY2tNZXRhSwkA3AQBBQlibG9ja0hhc2gFDG5ld0Jsb2NrTWV0YQkAzAgCCQELQmluYXJ5RW50cnkCCQEUY2hhaW5GaXJzdEJsb2NrSWRLZXkBBQpuZXdDaGFpbklkBQlibG9ja0hhc2gJAMwIAgkBC0JpbmFyeUVudHJ5AgkBE2NoYWluTGFzdEJsb2NrSWRLZXkBBQpuZXdDaGFpbklkBQlibG9ja0hhc2gJAMwIAgkBC1N0cmluZ0VudHJ5AgkBE2NoYWluQWxsQmxvY2tJZHNLZXkCBQpuZXdDaGFpbklkAAAJANwEAQUJYmxvY2tIYXNoCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEOY2hhaW5IZWlnaHRLZXkBBQpuZXdDaGFpbklkBQluZXdIZWlnaHQJAMwIAgkBDEludGVnZXJFbnRyeQIJAQpjaGFpbklkS2V5AQgIBQFpDG9yaWdpbkNhbGxlcgVieXRlcwUKbmV3Q2hhaW5JZAkAzAgCCQEMc2V0RXBvY2hEYXRhAQgFAWkMb3JpZ2luQ2FsbGVyCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ1zdXBwb3J0ZXJzS2V5AQUKbmV3Q2hhaW5JZAkApQgBCAUBaQxvcmlnaW5DYWxsZXIJAMwIAgkBDEludGVnZXJFbnRyeQIFGGxhc3RFcG9jaEJsb2Nrc051bWJlcktleQABCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ5sYXN0Q2hhaW5JZEtleQUKbmV3Q2hhaW5JZAkAzAgCCQELU3RyaW5nRW50cnkCCQEMZXBvY2hNZXRhS2V5AQUGaGVpZ2h0CQCsAgIJAKwCAgkApQgBCAUBaQxvcmlnaW5DYWxsZXICAywwLAkA3AQBBQlibG9ja0hhc2gFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQ5leHRlbmRBbHRDaGFpbgQHY2hhaW5JZAlibG9ja0hhc2gJcmVmZXJlbmNlBWVwb2NoBApjaGVja0Vwb2NoCQESZW5zdXJlQ29ycmVjdEVwb2NoAQUFZXBvY2gDCQAAAgUKY2hlY2tFcG9jaAUKY2hlY2tFcG9jaAQOY2hlY2tHZW5lcmF0b3IJARFlbnN1cmVNaW5pbmdFcG9jaAEIBQFpDG9yaWdpbkNhbGxlcgMJAAACBQ5jaGVja0dlbmVyYXRvcgUOY2hlY2tHZW5lcmF0b3IECmNoZWNrQ2hhaW4JARdlbnN1cmVBbHRDaGFpbkV4dGVuc2lvbgIIBQFpDG9yaWdpbkNhbGxlcgUHY2hhaW5JZAMJAAACBQpjaGVja0NoYWluBQpjaGVja0NoYWluBA5jaGVja1JlZmVyZW5jZQkBEmlzUmVmZXJlbmNlQ29ycmVjdAIFCXJlZmVyZW5jZQkAoQgBCQETY2hhaW5MYXN0QmxvY2tJZEtleQEFB2NoYWluSWQDCQAAAgUOY2hlY2tSZWZlcmVuY2UFDmNoZWNrUmVmZXJlbmNlBAtjaGFpbkhlaWdodAkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEOY2hhaW5IZWlnaHRLZXkBBQdjaGFpbklkAAAEDWJsb2NrSWRzTGFzdE4JAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBGGNoYWluQWxsQmxvY2tJZHNMYXN0TktleQEFB2NoYWluSWQAAAQIYmxvY2tJZHMJARFAZXh0ck5hdGl2ZSgxMDU4KQEJARNjaGFpbkFsbEJsb2NrSWRzS2V5AgUHY2hhaW5JZAUNYmxvY2tJZHNMYXN0TgQJbmV3SGVpZ2h0CQBkAgULY2hhaW5IZWlnaHQAAQQRdXBkYXRlQWxsQmxvY2tJZHMDCQBnAgkAsQIBBQhibG9ja0lkcwUTTUFYX0JMT0NLU19TVFJfU0laRQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBGGNoYWluQWxsQmxvY2tJZHNMYXN0TktleQEFB2NoYWluSWQJAGQCBQ1ibG9ja0lkc0xhc3ROAAEJAMwIAgkBC1N0cmluZ0VudHJ5AgkBE2NoYWluQWxsQmxvY2tJZHNLZXkCBQdjaGFpbklkCQBkAgUNYmxvY2tJZHNMYXN0TgABCQDcBAEFCWJsb2NrSGFzaAUDbmlsBAtuZXdCbG9ja0lkcwkArAICCQCsAgIJANwEAQUJYmxvY2tIYXNoBQNTRVAFCGJsb2NrSWRzCQDMCAIJAQtTdHJpbmdFbnRyeQIJARNjaGFpbkFsbEJsb2NrSWRzS2V5AgUHY2hhaW5JZAUNYmxvY2tJZHNMYXN0TgULbmV3QmxvY2tJZHMFA25pbAQObWFpbkNoYWluRW50cnkDCQBmAgkBEXN1cHBvcnRpbmdCYWxhbmNlAQUHY2hhaW5JZAkAaQIFFGNvbXB1dGVkVG90YWxCYWxhbmNlAAIJAMwIAgkBDEludGVnZXJFbnRyeQIFDm1haW5DaGFpbklkS2V5BQdjaGFpbklkBQNuaWwFA25pbAQMbmV3QmxvY2tNZXRhCQDLAQIJAMsBAgkAywECCQCaAwEFCW5ld0hlaWdodAkAmgMBBQZoZWlnaHQFCXJlZmVyZW5jZQgIBQFpDG9yaWdpbkNhbGxlcgVieXRlcwkAzggCCQDOCAIJAM4IAgkAzAgCCQELQmluYXJ5RW50cnkCCQEMYmxvY2tNZXRhS2V5AQUJYmxvY2tIYXNoBQxuZXdCbG9ja01ldGEJAMwIAgkBC0JpbmFyeUVudHJ5AgkArAICBQpibG9ja01ldGFLCQDcBAEFCWJsb2NrSGFzaAUMbmV3QmxvY2tNZXRhCQDMCAIJAQtCaW5hcnlFbnRyeQIJARNjaGFpbkxhc3RCbG9ja0lkS2V5AQUHY2hhaW5JZAUJYmxvY2tIYXNoCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEOY2hhaW5IZWlnaHRLZXkBBQdjaGFpbklkBQluZXdIZWlnaHQJAMwIAgkBDHNldEVwb2NoRGF0YQEIBQFpDG9yaWdpbkNhbGxlcgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBCmNoYWluSWRLZXkBCAgFAWkMb3JpZ2luQ2FsbGVyBWJ5dGVzBQdjaGFpbklkCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRhsYXN0RXBvY2hCbG9ja3NOdW1iZXJLZXkAAQkAzAgCCQELU3RyaW5nRW50cnkCCQEMZXBvY2hNZXRhS2V5AQUGaGVpZ2h0CQCsAgIJAKwCAgkApQgBCAUBaQxvcmlnaW5DYWxsZXICAywwLAkA3AQBBQlibG9ja0hhc2gFA25pbAUObWFpbkNoYWluRW50cnkJAQxhZGRTdXBwb3J0ZXICBQdjaGFpbklkCAUBaQxvcmlnaW5DYWxsZXIFEXVwZGF0ZUFsbEJsb2NrSWRzCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBBGpvaW4BDXJld2FyZEFkZHJlc3MKARJjaGVja1Jld2FyZEFkZHJlc3MBB2FkZHJlc3MEByRtYXRjaDAJAKEIAQkBCm1pbmVyUGtLZXkBBQdhZGRyZXNzAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAnBrBQckbWF0Y2gwAwkAAAIFAnBrCAUBaRVvcmlnaW5DYWxsZXJQdWJsaWNLZXkFBHVuaXQJAAIBCQCsAgIJAKwCAgkArAICAhFMMiBtaW5lciBhZGRyZXNzIAUHYWRkcmVzcwIYIGlzIGFscmVhZHkgbGlua2VkIHdpdGggCQDYBAEFAnBrBQR1bml0AwkAZgIFC01JTl9CQUxBTkNFCAkA7wcBCAUBaQxvcmlnaW5DYWxsZXIKZ2VuZXJhdGluZwkAAgEJAKwCAgkArAICCQCsAgICIUluc3VmZmljaWVudCBnZW5lcmF0aW5nIGJhbGFuY2U6IAkApAMBCAkA7wcBCAUBaQxvcmlnaW5DYWxsZXIKZ2VuZXJhdGluZwIMLiBSZXF1aXJlZDogCQCkAwEFC01JTl9CQUxBTkNFAwkBAiE9AgkAyAEBBQ1yZXdhcmRBZGRyZXNzABQJAAIBAiVyZXdhcmRBZGRyZXNzIHNob3VsZCBiZSBhbiBMMiBhZGRyZXNzCgEOY2hlY2tFeGlzdGVuY2UCBmV4aXN0cwVtaW5lcgMFBmV4aXN0cwYJAAACBQVtaW5lcgkApQgBCAUBaQxvcmlnaW5DYWxsZXIEDWFscmVhZHlFeGlzdHMKAAIkbAUJYWxsTWluZXJzCgACJHMJAJADAQUCJGwKAAUkYWNjMAcKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBDmNoZWNrRXhpc3RlbmNlAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyA1MAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQAFQAWABcAGAAZABoAGwAcAB0AHgAfACAAIQAiACMAJAAlACYAJwAoACkAKgArACwALQAuAC8AMAAxADIDBQ1hbHJlYWR5RXhpc3RzBQNuaWwECG5ld01pbmVyCQClCAEIBQFpDG9yaWdpbkNhbGxlcgQQcmV3YXJkQWRkcmVzc0hleAkA3AQBBQ1yZXdhcmRBZGRyZXNzBAVjaGVjawkBEmNoZWNrUmV3YXJkQWRkcmVzcwEFEHJld2FyZEFkZHJlc3NIZXgDCQAAAgUFY2hlY2sFBWNoZWNrCgENZmlsdGVyTGVhdmluZwIDYWNjBW1pbmVyBA0kdDAxNzgxMjE3ODQ0BQNhY2MECWFjY01pbmVycwgFDSR0MDE3ODEyMTc4NDQCXzEECWlzVXBkYXRlZAgFDSR0MDE3ODEyMTc4NDQCXzIDCQAAAgUFbWluZXIFCG5ld01pbmVyCQCUCgIFCWFjY01pbmVycwYJAJQKAgkAzQgCBQlhY2NNaW5lcnMFBW1pbmVyBQlpc1VwZGF0ZWQECW5ld01pbmVycwMJAAACCQCQAwEFCWFsbE1pbmVycwAABQhuZXdNaW5lcgkArAICCQCsAgIJALoJAgUJYWxsTWluZXJzBQNTRVAFA1NFUAUIbmV3TWluZXIEDSR0MDE4MTA4MTgxOTgKAAIkbAUQYWxsTGVhdmluZ01pbmVycwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgUDbmlsBwoBBSRmMV8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQENZmlsdGVyTGVhdmluZwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMV8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgNTAJAQUkZjFfMgIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUABUAFgAXABgAGQAaABsAHAAdAB4AHwAgACEAIgAjACQAJQAmACcAKAApACoAKwAsAC0ALgAvADAAMQAyBBBuZXdMZWF2aW5nTWluZXJzCAUNJHQwMTgxMDgxODE5OAJfMQQJaXNVcGRhdGVkCAUNJHQwMTgxMDgxODE5OAJfMgQWbmV3TGVhdmluZ01pbmVyc0FjdGlvbgMJAQIhPQIFEG5ld0xlYXZpbmdNaW5lcnMFA25pbAkAzAgCCQELU3RyaW5nRW50cnkCCQEQbGVhdmluZ01pbmVyc0tleQEFBmhlaWdodAkAugkCBRBuZXdMZWF2aW5nTWluZXJzBQNTRVAFA25pbAMJAQIhPQIFEGFsbExlYXZpbmdNaW5lcnMFA25pbAkAzAgCCQELRGVsZXRlRW50cnkBCQEQbGVhdmluZ01pbmVyc0tleQEFBmhlaWdodAUDbmlsBQNuaWwECmpvaW5IZWlnaHQDBQlpc1VwZGF0ZWQFBmhlaWdodAkAZAIFBmhlaWdodAABBBhkZWxldGVPbGRSZXdhcmRBZGRyZXNzUGsEByRtYXRjaDAJAKEIAQkBEm1pbmVyUmV3YXJkQWRkcmVzcwEFCG5ld01pbmVyAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IECm9sZEFkZHJlc3MFByRtYXRjaDADCQAAAgUKb2xkQWRkcmVzcwUNcmV3YXJkQWRkcmVzcwUDbmlsCQDMCAIJAQtEZWxldGVFbnRyeQEJAQptaW5lclBrS2V5AQkA3AQBBQpvbGRBZGRyZXNzBQNuaWwFA25pbAkAzggCCQDOCAIJAMwIAgkBC1N0cmluZ0VudHJ5AgUMYWxsTWluZXJzS2V5BQluZXdNaW5lcnMJAMwIAgkBDEludGVnZXJFbnRyeQIJARJtaW5lckpvaW5IZWlnaHRLZXkBBQhuZXdNaW5lcgUKam9pbkhlaWdodAkAzAgCCQELQmluYXJ5RW50cnkCCQESbWluZXJSZXdhcmRBZGRyZXNzAQUIbmV3TWluZXIFDXJld2FyZEFkZHJlc3MJAMwIAgkBC0JpbmFyeUVudHJ5AgkBCm1pbmVyUGtLZXkBBRByZXdhcmRBZGRyZXNzSGV4CAUBaRVvcmlnaW5DYWxsZXJQdWJsaWNLZXkFA25pbAUWbmV3TGVhdmluZ01pbmVyc0FjdGlvbgUYZGVsZXRlT2xkUmV3YXJkQWRkcmVzc1BrCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBBWxlYXZlAAQMbGVhdmluZ01pbmVyCQClCAEIBQFpDG9yaWdpbkNhbGxlcgoBC2ZpbHRlck1pbmVyAgNhY2MFbWluZXIDCQAAAgUFbWluZXIFDGxlYXZpbmdNaW5lcgUDYWNjCQDNCAIFA2FjYwUFbWluZXIECnJlc3RNaW5lcnMKAAIkbAUJYWxsTWluZXJzCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQtmaWx0ZXJNaW5lcgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgNTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUABUAFgAXABgAGQAaABsAHAAdAB4AHwAgACEAIgAjACQAJQAmACcAKAApACoAKwAsAC0ALgAvADAAMQAyAwkAAAIFDnRoaXNFcG9jaE1pbmVyCAgFAWkMb3JpZ2luQ2FsbGVyBWJ5dGVzCQACAQIcZGVzaWduYXRlZCBtaW5lciBjYW4ndCBsZWF2ZQQHJG1hdGNoMAkAnwgBCQESbWluZXJKb2luSGVpZ2h0S2V5AQUMbGVhdmluZ01pbmVyAwkAAQIFByRtYXRjaDACA0ludAQLbWluZXJIZWlnaHQFByRtYXRjaDADCQBmAgULbWluZXJIZWlnaHQFBmhlaWdodAkAzAgCCQELU3RyaW5nRW50cnkCBQxhbGxNaW5lcnNLZXkJALoJAgUKcmVzdE1pbmVycwUDU0VQCQDMCAIJAQtEZWxldGVFbnRyeQEJARJtaW5lckpvaW5IZWlnaHRLZXkBBQxsZWF2aW5nTWluZXIFA25pbAQQb2xkTGVhdmluZ01pbmVycwkBC3ZhbHVlT3JFbHNlAgkAoggBCQEQbGVhdmluZ01pbmVyc0tleQEFBmhlaWdodAIABBBuZXdMZWF2aW5nTWluZXJzAwkAAAIFEG9sZExlYXZpbmdNaW5lcnMCAAUMbGVhdmluZ01pbmVyCQCsAgIJAKwCAgUQb2xkTGVhdmluZ01pbmVycwUDU0VQBQxsZWF2aW5nTWluZXIJAMwIAgkBC1N0cmluZ0VudHJ5AgUMYWxsTWluZXJzS2V5CQC6CQIFCnJlc3RNaW5lcnMFA1NFUAkAzAgCCQELRGVsZXRlRW50cnkBCQESbWluZXJKb2luSGVpZ2h0S2V5AQUMbGVhdmluZ01pbmVyCQDMCAIJAQtTdHJpbmdFbnRyeQIJARBsZWF2aW5nTWluZXJzS2V5AQUGaGVpZ2h0BRBuZXdMZWF2aW5nTWluZXJzBQNuaWwJAMwIAgkBC1N0cmluZ0VudHJ5AgUMYWxsTWluZXJzS2V5CQC6CQIFCnJlc3RNaW5lcnMFA1NFUAUDbmlsANtczgE=", "chainId": 84, "height": 3094074, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: EuXdBSC64ERnDjXwNWTLZ8E4i7NvL3ZhBhtv2he8MwkJ Next: n6cwhqFoj5W2LDqTeQBXhskSaZsYjiPmX6BiU1YrYc3 Diff:
OldNewDifferences
2828 let lastEpochBlocksNumberKey = "lastEpochBlocksNumber"
2929
3030 let minerRewardKey = "minerReward"
31+
32+let blockMetaK = "block_0x"
33+
34+func pad (i) = {
35+ let s = toString(i)
36+ match size(s) {
37+ case _ =>
38+ if ((1 == $match0))
39+ then ("0000000" + s)
40+ else if ((2 == $match0))
41+ then ("000000" + s)
42+ else if ((3 == $match0))
43+ then ("00000" + s)
44+ else if ((4 == $match0))
45+ then ("0000" + s)
46+ else if ((5 == $match0))
47+ then ("000" + s)
48+ else if ((6 == $match0))
49+ then ("00" + s)
50+ else if ((7 == $match0))
51+ then ("0" + s)
52+ else s
53+ }
54+ }
55+
56+
57+func epochMetaKey (epoch) = ("epoch_" + pad(epoch))
58+
3159
3260 let stakingContractAddress = Address(getBinaryValue(this, "stakingContractAddress"))
3361
126154 func setEpochData (generator) = StringEntry(thisEpochDataKey, ((toString(height) + SEP) + toBase58String(generator.bytes)))
127155
128156
129-let $t036534710 = {
157+let $t040465103 = {
130158 let hitSource = match lastBlock.vrf {
131159 case vrf: ByteVector =>
132160 vrf
134162 lastBlock.generationSignature
135163 }
136164 func processMiner (prev,miner) = {
137- let $t039514014 = prev
138- let prevDelay = $t039514014._1
139- let prevMiner = $t039514014._2
140- let prevTotalBalance = $t039514014._3
141- let prevMiners = $t039514014._4
165+ let $t043444407 = prev
166+ let prevDelay = $t043444407._1
167+ let prevMiner = $t043444407._2
168+ let prevTotalBalance = $t043444407._3
169+ let prevMiners = $t043444407._4
142170 let minerAddress = addressFromStringValue(miner)
143171 let wavesGenBalance = wavesBalance(minerAddress).generating
144172 let minerBalance = generatingBalance(minerAddress)
170198 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50)
171199 }
172200
173-let computedDelay = $t036534710._1
201+let computedDelay = $t040465103._1
174202
175-let computedGenerator = $t036534710._2
203+let computedGenerator = $t040465103._2
176204
177-let computedTotalBalance = $t036534710._3
205+let computedTotalBalance = $t040465103._3
178206
179-let filteredMiners = $t036534710._4
207+let filteredMiners = $t040465103._4
180208
181209 let safeRollbackHeight = {
182210 func addBalance (acc,blockIdStr) = {
183- let $t048244868 = acc
184- let totalBalance = $t048244868._1
185- let prevId = $t048244868._2
186- let generators = $t048244868._3
211+ let $t052175261 = acc
212+ let totalBalance = $t052175261._1
213+ let prevId = $t052175261._2
214+ let generators = $t052175261._3
187215 if ((totalBalance > (computedTotalBalance / 2)))
188216 then acc
189217 else {
207235
208236 let lastN = valueOrElse(getInteger(chainAllBlockIdsLastNKey(mainChainId)), 0)
209237 let allBlocksIds = (((getBlockIds(lastN) ++ getBlockIds((lastN - 1))) ++ getBlockIds((lastN - 2))) ++ getBlockIds((lastN - 3)))
210- let $t056365710 = {
238+ let $t060296103 = {
211239 let $l = allBlocksIds
212240 let $s = size($l)
213241 let $acc0 = $Tuple3(0, base58'', nil)
221249
222250 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63), 64), 65), 66), 67), 68), 69), 70), 71), 72), 73), 74), 75), 76), 77), 78), 79), 80), 81), 82), 83), 84), 85), 86), 87), 88), 89), 90), 91), 92), 93), 94), 95), 96), 97), 98), 99), 100), 101), 102), 103), 104), 105), 106), 107), 108), 109), 110), 111), 112), 113), 114), 115), 116), 117), 118), 119), 120), 121), 122), 123), 124), 125), 126), 127), 128), 129), 130), 131), 132), 133), 134), 135), 136), 137), 138), 139), 140), 141), 142), 143), 144), 145), 146), 147), 148), 149), 150), 151), 152), 153), 154), 155), 156), 157), 158), 159), 160), 161), 162), 163), 164), 165), 166), 167), 168), 169), 170), 171), 172), 173), 174), 175), 176), 177), 178), 179), 180), 181), 182), 183), 184), 185), 186), 187), 188), 189), 190), 191), 192), 193), 194), 195), 196), 197), 198), 199), 200)
223251 }
224- let _b = $t056365710._1
225- let blockId = $t056365710._2
252+ let _b = $t060296103._1
253+ let blockId = $t060296103._2
226254 blockMeta(blockId)._1
227255 }
228256
229257 func supportingBalance (chainId) = {
230258 func addBalance (acc,generatorStr) = {
231- let $t058555891 = acc
232- let totalBalance = $t058555891._1
233- let generators = $t058555891._2
259+ let $t062486284 = acc
260+ let totalBalance = $t062486284._1
261+ let generators = $t062486284._2
234262 let generator = addressFromStringValue(generatorStr)
235263 if (containsElement(generators, generator))
236264 then acc
241269 }
242270
243271 let allGenerators = split_4C(getStringValue(supportersKey(chainId)), SEP)
244- let $t062136278 = {
272+ let $t066066671 = {
245273 let $l = allGenerators
246274 let $s = size($l)
247275 let $acc0 = $Tuple2(0, nil)
255283
256284 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63), 64), 65), 66), 67), 68), 69), 70), 71), 72), 73), 74), 75), 76), 77), 78), 79), 80), 81), 82), 83), 84), 85), 86), 87), 88), 89), 90), 91), 92), 93), 94), 95), 96), 97), 98), 99), 100)
257285 }
258- let balance = $t062136278._1
259- let _g = $t062136278._2
286+ let balance = $t066066671._1
287+ let _g = $t066066671._2
260288 balance
261289 }
262290
362390 let newHeight = (chainHeight + 1)
363391 let blocksNumber = valueOrElse(getInteger(lastEpochBlocksNumberKey), 0)
364392 let newBlockMeta = (((toBytes(newHeight) + toBytes(height)) + lastBlockId) + i.originCaller.bytes)
365-[BinaryEntry(blockMetaKey(blockHash), newBlockMeta), IntegerEntry(chainHeightKey(chainId), newHeight), BinaryEntry(chainLastBlockIdKey(chainId), blockHash), IntegerEntry(lastEpochBlocksNumberKey, (blocksNumber + 1))]
393+[BinaryEntry(blockMetaKey(blockHash), newBlockMeta), BinaryEntry((blockMetaK + toBase16String(blockHash)), newBlockMeta), IntegerEntry(chainHeightKey(chainId), newHeight), BinaryEntry(chainLastBlockIdKey(chainId), blockHash), IntegerEntry(lastEpochBlocksNumberKey, (blocksNumber + 1)), StringEntry(epochMetaKey(height), ((toString(i.originCaller) + ",0,") + toBase16String(blockHash)))]
366394 }
367395 else throw("Strict value is not equal to itself.")
368396 }
405433 [BinaryEntry(chainFirstBlockIdKey(mainChainId), blockHash)]
406434 }
407435 let newBlockMeta = (((toBytes(newHeight) + toBytes(height)) + reference) + i.originCaller.bytes)
408- (([BinaryEntry(blockMetaKey(blockHash), newBlockMeta), IntegerEntry(chainHeightKey(mainChainId), newHeight), BinaryEntry(chainLastBlockIdKey(mainChainId), blockHash), IntegerEntry(chainIdKey(i.originCaller.bytes), mainChainId), setEpochData(i.originCaller), IntegerEntry(lastEpochBlocksNumberKey, 1)] ++ firstBlockId) ++ updateAllBlockIds)
436+ (([BinaryEntry(blockMetaKey(blockHash), newBlockMeta), BinaryEntry((blockMetaK + toBase16String(blockHash)), newBlockMeta), IntegerEntry(chainHeightKey(mainChainId), newHeight), BinaryEntry(chainLastBlockIdKey(mainChainId), blockHash), IntegerEntry(chainIdKey(i.originCaller.bytes), mainChainId), setEpochData(i.originCaller), IntegerEntry(lastEpochBlocksNumberKey, 1), StringEntry(epochMetaKey(height), ((toString(i.originCaller) + ",0,") + toBase16String(blockHash)))] ++ firstBlockId) ++ updateAllBlockIds)
409437 }
410438 else throw("Strict value is not equal to itself.")
411439 }
435463 let newChainId = (valueOrElse(getInteger(lastChainIdKey), 0) + 1)
436464 let newHeight = (blockMeta(reference)._1 + 1)
437465 let newBlockMeta = (((toBytes(newHeight) + toBytes(height)) + reference) + i.originCaller.bytes)
438-[BinaryEntry(blockMetaKey(blockHash), newBlockMeta), BinaryEntry(chainFirstBlockIdKey(newChainId), blockHash), BinaryEntry(chainLastBlockIdKey(newChainId), blockHash), StringEntry(chainAllBlockIdsKey(newChainId, 0), toBase16String(blockHash)), IntegerEntry(chainHeightKey(newChainId), newHeight), IntegerEntry(chainIdKey(i.originCaller.bytes), newChainId), setEpochData(i.originCaller), StringEntry(supportersKey(newChainId), toString(i.originCaller)), IntegerEntry(lastEpochBlocksNumberKey, 1), IntegerEntry(lastChainIdKey, newChainId)]
466+[BinaryEntry(blockMetaKey(blockHash), newBlockMeta), BinaryEntry((blockMetaK + toBase16String(blockHash)), newBlockMeta), BinaryEntry(chainFirstBlockIdKey(newChainId), blockHash), BinaryEntry(chainLastBlockIdKey(newChainId), blockHash), StringEntry(chainAllBlockIdsKey(newChainId, 0), toBase16String(blockHash)), IntegerEntry(chainHeightKey(newChainId), newHeight), IntegerEntry(chainIdKey(i.originCaller.bytes), newChainId), setEpochData(i.originCaller), StringEntry(supportersKey(newChainId), toString(i.originCaller)), IntegerEntry(lastEpochBlocksNumberKey, 1), IntegerEntry(lastChainIdKey, newChainId), StringEntry(epochMetaKey(height), ((toString(i.originCaller) + ",0,") + toBase16String(blockHash)))]
439467 }
440468 else throw("Strict value is not equal to itself.")
441469 }
476504 then [IntegerEntry(mainChainIdKey, chainId)]
477505 else nil
478506 let newBlockMeta = (((toBytes(newHeight) + toBytes(height)) + reference) + i.originCaller.bytes)
479- ((([BinaryEntry(blockMetaKey(blockHash), newBlockMeta), BinaryEntry(chainLastBlockIdKey(chainId), blockHash), IntegerEntry(chainHeightKey(chainId), newHeight), setEpochData(i.originCaller), IntegerEntry(chainIdKey(i.originCaller.bytes), chainId), IntegerEntry(lastEpochBlocksNumberKey, 1)] ++ mainChainEntry) ++ addSupporter(chainId, i.originCaller)) ++ updateAllBlockIds)
507+ ((([BinaryEntry(blockMetaKey(blockHash), newBlockMeta), BinaryEntry((blockMetaK + toBase16String(blockHash)), newBlockMeta), BinaryEntry(chainLastBlockIdKey(chainId), blockHash), IntegerEntry(chainHeightKey(chainId), newHeight), setEpochData(i.originCaller), IntegerEntry(chainIdKey(i.originCaller.bytes), chainId), IntegerEntry(lastEpochBlocksNumberKey, 1), StringEntry(epochMetaKey(height), ((toString(i.originCaller) + ",0,") + toBase16String(blockHash)))] ++ mainChainEntry) ++ addSupporter(chainId, i.originCaller)) ++ updateAllBlockIds)
480508 }
481509 else throw("Strict value is not equal to itself.")
482510 }
532560 if ((check == check))
533561 then {
534562 func filterLeaving (acc,miner) = {
535- let $t01671516747 = acc
536- let accMiners = $t01671516747._1
537- let isUpdated = $t01671516747._2
563+ let $t01781217844 = acc
564+ let accMiners = $t01781217844._1
565+ let isUpdated = $t01781217844._2
538566 if ((miner == newMiner))
539567 then $Tuple2(accMiners, true)
540568 else $Tuple2((accMiners :+ miner), isUpdated)
543571 let newMiners = if ((size(allMiners) == 0))
544572 then newMiner
545573 else ((makeString_2C(allMiners, SEP) + SEP) + newMiner)
546- let $t01701117101 = {
574+ let $t01810818198 = {
547575 let $l = allLeavingMiners
548576 let $s = size($l)
549577 let $acc0 = $Tuple2(nil, false)
557585
558586 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50)
559587 }
560- let newLeavingMiners = $t01701117101._1
561- let isUpdated = $t01701117101._2
588+ let newLeavingMiners = $t01810818198._1
589+ let isUpdated = $t01810818198._2
562590 let newLeavingMinersAction = if ((newLeavingMiners != nil))
563591 then [StringEntry(leavingMinersKey(height), makeString_2C(newLeavingMiners, SEP))]
564592 else if ((allLeavingMiners != nil))
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 8 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let INT_MAX = 9223372036854775807
55
66 let WAVES = 100000000
77
88 let MIN_BALANCE = (20000 * WAVES)
99
1010 let MAX_BLOCKS_AT_EPOCH = 50
1111
1212 let SEP = ","
1313
1414 let BLOCK_HASH_SIZE = 32
1515
1616 let ADDRESS_SIZE = 26
1717
1818 let MAX_BLOCKS_STR_SIZE = ((64 * MAX_BLOCKS_AT_EPOCH) + (MAX_BLOCKS_AT_EPOCH - 1))
1919
2020 let thisEpochDataKey = "thisEpochData"
2121
2222 let allMinersKey = "allMiners"
2323
2424 let mainChainIdKey = "mainChainId"
2525
2626 let lastChainIdKey = "lastChainId"
2727
2828 let lastEpochBlocksNumberKey = "lastEpochBlocksNumber"
2929
3030 let minerRewardKey = "minerReward"
31+
32+let blockMetaK = "block_0x"
33+
34+func pad (i) = {
35+ let s = toString(i)
36+ match size(s) {
37+ case _ =>
38+ if ((1 == $match0))
39+ then ("0000000" + s)
40+ else if ((2 == $match0))
41+ then ("000000" + s)
42+ else if ((3 == $match0))
43+ then ("00000" + s)
44+ else if ((4 == $match0))
45+ then ("0000" + s)
46+ else if ((5 == $match0))
47+ then ("000" + s)
48+ else if ((6 == $match0))
49+ then ("00" + s)
50+ else if ((7 == $match0))
51+ then ("0" + s)
52+ else s
53+ }
54+ }
55+
56+
57+func epochMetaKey (epoch) = ("epoch_" + pad(epoch))
58+
3159
3260 let stakingContractAddress = Address(getBinaryValue(this, "stakingContractAddress"))
3361
3462 func generatingBalance (address) = match getString(stakingContractAddress, ("%s__" + toString(address))) {
3563 case str: String =>
3664 let paramList = split(str, "__")
3765 let prevHeight = parseIntValue(paramList[1])
3866 let prevBalance = parseIntValue(paramList[2])
3967 let nextHeight = parseIntValue(paramList[3])
4068 let nextBalance = parseIntValue(paramList[4])
4169 if ((height >= nextHeight))
4270 then nextBalance
4371 else if ((height >= prevHeight))
4472 then prevBalance
4573 else 0
4674 case _ =>
4775 0
4876 }
4977
5078
5179 func blockMetaKey (blockId) = ("blockMeta" + toBase16String(blockId))
5280
5381
5482 func chainIdKey (generator) = ("chainIdOf" + toBase16String(generator))
5583
5684
5785 func chainHeightKey (chainId) = (("chain" + toString(chainId)) + "Height")
5886
5987
6088 func chainFirstBlockIdKey (chainId) = (("chain" + toString(chainId)) + "FirstBlock")
6189
6290
6391 func chainLastBlockIdKey (chainId) = (("chain" + toString(chainId)) + "LastBlock")
6492
6593
6694 func chainAllBlockIdsKey (chainId,n) = ((("chain" + toString(chainId)) + "AllBlocks") + toString(n))
6795
6896
6997 func chainAllBlockIdsLastNKey (chainId) = (("chain" + toString(chainId)) + "AllBlocksLastN")
7098
7199
72100 func supportersKey (chainId) = (("chain" + toString(chainId)) + "Supporters")
73101
74102
75103 func minerRewardAddress (minerAddr) = (("miner" + minerAddr) + "RewardAddress")
76104
77105
78106 func minerJoinHeightKey (minerAddr) = (("miner" + minerAddr) + "JoinHeight")
79107
80108
81109 func minerPkKey (rewardAddress) = (("miner" + rewardAddress) + "PK")
82110
83111
84112 func leavingMinersKey (epoch) = ("leavingMinersAt" + toString(epoch))
85113
86114
87115 let mainChainId = valueOrElse(getInteger(mainChainIdKey), 0)
88116
89117 let thisEpochMiner = match getString(thisEpochDataKey) {
90118 case rawThisEpochData: String =>
91119 let thisEpochData = split(rawThisEpochData, SEP)
92120 let thisEpoch = parseIntValue(thisEpochData[0])
93121 if ((thisEpoch == height))
94122 then fromBase58String(thisEpochData[1])
95123 else unit
96124 case _ =>
97125 unit
98126 }
99127
100128 let allMiners = match getString(allMinersKey) {
101129 case raw: String =>
102130 split_4C(raw, SEP)
103131 case _ =>
104132 nil
105133 }
106134
107135 let allLeavingMiners = match getString(leavingMinersKey(height)) {
108136 case raw: String =>
109137 split_4C(raw, SEP)
110138 case _ =>
111139 nil
112140 }
113141
114142 func blockMeta (blockId) = {
115143 let meta = getBinaryValue(blockMetaKey(blockId))
116144 let metaWithoutHeight = drop(meta, 8)
117145 let metaWithoutHeightEpoch = drop(metaWithoutHeight, 8)
118146 let blockHeight = toInt(take(meta, 8))
119147 let blockEpoch = toInt(take(metaWithoutHeight, 8))
120148 let blockParent = take(metaWithoutHeightEpoch, BLOCK_HASH_SIZE)
121149 let blockGenerator = takeRight(meta, ADDRESS_SIZE)
122150 $Tuple4(blockHeight, blockEpoch, blockParent, blockGenerator)
123151 }
124152
125153
126154 func setEpochData (generator) = StringEntry(thisEpochDataKey, ((toString(height) + SEP) + toBase58String(generator.bytes)))
127155
128156
129-let $t036534710 = {
157+let $t040465103 = {
130158 let hitSource = match lastBlock.vrf {
131159 case vrf: ByteVector =>
132160 vrf
133161 case _ =>
134162 lastBlock.generationSignature
135163 }
136164 func processMiner (prev,miner) = {
137- let $t039514014 = prev
138- let prevDelay = $t039514014._1
139- let prevMiner = $t039514014._2
140- let prevTotalBalance = $t039514014._3
141- let prevMiners = $t039514014._4
165+ let $t043444407 = prev
166+ let prevDelay = $t043444407._1
167+ let prevMiner = $t043444407._2
168+ let prevTotalBalance = $t043444407._3
169+ let prevMiners = $t043444407._4
142170 let minerAddress = addressFromStringValue(miner)
143171 let wavesGenBalance = wavesBalance(minerAddress).generating
144172 let minerBalance = generatingBalance(minerAddress)
145173 if (if (if ((MIN_BALANCE > wavesGenBalance))
146174 then true
147175 else (0 >= minerBalance))
148176 then true
149177 else (valueOrElse(getInteger(minerJoinHeightKey(miner)), INT_MAX) > height))
150178 then prev
151179 else {
152180 let nextDelay = calculateDelay(minerAddress, minerBalance)
153181 if ((prevDelay > nextDelay))
154182 then $Tuple4(nextDelay, miner, (prevTotalBalance + minerBalance), (prevMiners :+ miner))
155183 else $Tuple4(prevDelay, prevMiner, (prevTotalBalance + minerBalance), (prevMiners :+ miner))
156184 }
157185 }
158186
159187 let $l = (allMiners ++ allLeavingMiners)
160188 let $s = size($l)
161189 let $acc0 = $Tuple4(INT_MAX, "", 0, nil)
162190 func $f0_1 ($a,$i) = if (($i >= $s))
163191 then $a
164192 else processMiner($a, $l[$i])
165193
166194 func $f0_2 ($a,$i) = if (($i >= $s))
167195 then $a
168196 else throw("List size exceeds 50")
169197
170198 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50)
171199 }
172200
173-let computedDelay = $t036534710._1
201+let computedDelay = $t040465103._1
174202
175-let computedGenerator = $t036534710._2
203+let computedGenerator = $t040465103._2
176204
177-let computedTotalBalance = $t036534710._3
205+let computedTotalBalance = $t040465103._3
178206
179-let filteredMiners = $t036534710._4
207+let filteredMiners = $t040465103._4
180208
181209 let safeRollbackHeight = {
182210 func addBalance (acc,blockIdStr) = {
183- let $t048244868 = acc
184- let totalBalance = $t048244868._1
185- let prevId = $t048244868._2
186- let generators = $t048244868._3
211+ let $t052175261 = acc
212+ let totalBalance = $t052175261._1
213+ let prevId = $t052175261._2
214+ let generators = $t052175261._3
187215 if ((totalBalance > (computedTotalBalance / 2)))
188216 then acc
189217 else {
190218 let blockId = fromBase16String(blockIdStr)
191219 let generator = Address(blockMeta(blockId)._4)
192220 if (containsElement(generators, generator))
193221 then acc
194222 else {
195223 let balance = generatingBalance(generator)
196224 $Tuple3((totalBalance + balance), blockId, (generators :+ generator))
197225 }
198226 }
199227 }
200228
201229 func getBlockIds (n) = {
202230 let rawStr = valueOrElse(getString(chainAllBlockIdsKey(mainChainId, n)), "")
203231 if ((rawStr == ""))
204232 then nil
205233 else split_4C(rawStr, SEP)
206234 }
207235
208236 let lastN = valueOrElse(getInteger(chainAllBlockIdsLastNKey(mainChainId)), 0)
209237 let allBlocksIds = (((getBlockIds(lastN) ++ getBlockIds((lastN - 1))) ++ getBlockIds((lastN - 2))) ++ getBlockIds((lastN - 3)))
210- let $t056365710 = {
238+ let $t060296103 = {
211239 let $l = allBlocksIds
212240 let $s = size($l)
213241 let $acc0 = $Tuple3(0, base58'', nil)
214242 func $f0_1 ($a,$i) = if (($i >= $s))
215243 then $a
216244 else addBalance($a, $l[$i])
217245
218246 func $f0_2 ($a,$i) = if (($i >= $s))
219247 then $a
220248 else throw("List size exceeds 200")
221249
222250 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63), 64), 65), 66), 67), 68), 69), 70), 71), 72), 73), 74), 75), 76), 77), 78), 79), 80), 81), 82), 83), 84), 85), 86), 87), 88), 89), 90), 91), 92), 93), 94), 95), 96), 97), 98), 99), 100), 101), 102), 103), 104), 105), 106), 107), 108), 109), 110), 111), 112), 113), 114), 115), 116), 117), 118), 119), 120), 121), 122), 123), 124), 125), 126), 127), 128), 129), 130), 131), 132), 133), 134), 135), 136), 137), 138), 139), 140), 141), 142), 143), 144), 145), 146), 147), 148), 149), 150), 151), 152), 153), 154), 155), 156), 157), 158), 159), 160), 161), 162), 163), 164), 165), 166), 167), 168), 169), 170), 171), 172), 173), 174), 175), 176), 177), 178), 179), 180), 181), 182), 183), 184), 185), 186), 187), 188), 189), 190), 191), 192), 193), 194), 195), 196), 197), 198), 199), 200)
223251 }
224- let _b = $t056365710._1
225- let blockId = $t056365710._2
252+ let _b = $t060296103._1
253+ let blockId = $t060296103._2
226254 blockMeta(blockId)._1
227255 }
228256
229257 func supportingBalance (chainId) = {
230258 func addBalance (acc,generatorStr) = {
231- let $t058555891 = acc
232- let totalBalance = $t058555891._1
233- let generators = $t058555891._2
259+ let $t062486284 = acc
260+ let totalBalance = $t062486284._1
261+ let generators = $t062486284._2
234262 let generator = addressFromStringValue(generatorStr)
235263 if (containsElement(generators, generator))
236264 then acc
237265 else {
238266 let balance = generatingBalance(generator)
239267 $Tuple2((totalBalance + balance), (generators :+ generator))
240268 }
241269 }
242270
243271 let allGenerators = split_4C(getStringValue(supportersKey(chainId)), SEP)
244- let $t062136278 = {
272+ let $t066066671 = {
245273 let $l = allGenerators
246274 let $s = size($l)
247275 let $acc0 = $Tuple2(0, nil)
248276 func $f0_1 ($a,$i) = if (($i >= $s))
249277 then $a
250278 else addBalance($a, $l[$i])
251279
252280 func $f0_2 ($a,$i) = if (($i >= $s))
253281 then $a
254282 else throw("List size exceeds 100")
255283
256284 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63), 64), 65), 66), 67), 68), 69), 70), 71), 72), 73), 74), 75), 76), 77), 78), 79), 80), 81), 82), 83), 84), 85), 86), 87), 88), 89), 90), 91), 92), 93), 94), 95), 96), 97), 98), 99), 100)
257285 }
258- let balance = $t062136278._1
259- let _g = $t062136278._2
286+ let balance = $t066066671._1
287+ let _g = $t066066671._2
260288 balance
261289 }
262290
263291
264292 func ensureMiningEpoch (generator) = if ((toString(generator) != computedGenerator))
265293 then throw(((((toBase58String(generator.bytes) + " is not allowed to mine in ") + toString(height)) + " epoch. Expected ") + computedGenerator))
266294 else unit
267295
268296
269297 func isReferenceCorrect (reference,lastBlock) = match lastBlock {
270298 case _: Unit =>
271299 unit
272300 case lb: ByteVector =>
273301 if ((reference == lb))
274302 then unit
275303 else throw(((("Expected a reference to the chain last block: " + toBase16String(lb)) + ". Got: ") + toBase16String(reference)))
276304 case _ =>
277305 throw("Match error")
278306 }
279307
280308
281309 func chainIsInactive (chainId) = {
282310 let firstBlockId = getBinaryValue(chainFirstBlockIdKey(chainId))
283311 (safeRollbackHeight > blockMeta(firstBlockId)._1)
284312 }
285313
286314
287315 func ensureMainOrInactiveChain (generator) = match getInteger(chainIdKey(generator.bytes)) {
288316 case currentId: Int =>
289317 if (if ((currentId == mainChainId))
290318 then true
291319 else chainIsInactive(currentId))
292320 then unit
293321 else throw(("miner is mining other chain " + toString(currentId)))
294322 case _ =>
295323 unit
296324 }
297325
298326
299327 func ensureAltChainExtension (generator,chainId) = match getInteger(chainIdKey(generator.bytes)) {
300328 case currentId: Int =>
301329 if ((currentId == chainId))
302330 then unit
303331 else {
304332 let extendingFirstBlockId = getBinaryValue(chainFirstBlockIdKey(chainId))
305333 let minerCurrentFirstBlockId = getBinaryValue(chainFirstBlockIdKey(currentId))
306334 let extendingFirstBlockHeight = blockMeta(extendingFirstBlockId)._1
307335 let minerCurrentFirstBlockHeight = blockMeta(minerCurrentFirstBlockId)._1
308336 if ((extendingFirstBlockHeight > minerCurrentFirstBlockHeight))
309337 then unit
310338 else throw(((((("miner is mining other chain " + toString(currentId)) + ", height of the alt chain first block ") + toString(extendingFirstBlockHeight)) + " is not less than height of the miner active chain first block ") + toString(minerCurrentFirstBlockHeight)))
311339 }
312340 case _ =>
313341 unit
314342 }
315343
316344
317345 func ensureReferenceIsSafeForRollback (reference) = {
318346 let startHeight = blockMeta(reference)._1
319347 if ((safeRollbackHeight > startHeight))
320348 then throw(((("start height " + toString(startHeight)) + " is less than minimum height ") + toString(safeRollbackHeight)))
321349 else unit
322350 }
323351
324352
325353 func ensureCorrectEpoch (epoch) = if ((epoch == height))
326354 then unit
327355 else throw(((("Expected block from epoch " + toString(height)) + ". Got ") + toString(epoch)))
328356
329357
330358 func checkBlocksNumber () = if ((MAX_BLOCKS_AT_EPOCH > getIntegerValue(lastEpochBlocksNumberKey)))
331359 then unit
332360 else throw("Max blocks number at epoch reached")
333361
334362
335363 func addSupporter (chainId,generator) = {
336364 let supportersStr = getStringValue(supportersKey(chainId))
337365 let supporters = split(supportersStr, SEP)
338366 if (containsElement(supporters, toString(generator)))
339367 then nil
340368 else [StringEntry(supportersKey(chainId), ((supportersStr + SEP) + toString(generator)))]
341369 }
342370
343371
344372 @Callable(i)
345373 func appendBlock (blockHash,reference) = {
346374 let check = checkBlocksNumber()
347375 if ((check == check))
348376 then if ((thisEpochMiner != i.originCaller.bytes))
349377 then match thisEpochMiner {
350378 case epochMiner: ByteVector =>
351379 throw(("not allowed to forge blocks in this epoch, expected from " + toBase58String(epochMiner)))
352380 case _ =>
353381 throw("not allowed to forge blocks in this epoch, epoch miner is absent")
354382 }
355383 else {
356384 let chainId = valueOrElse(getInteger(chainIdKey(i.originCaller.bytes)), mainChainId)
357385 let lastBlockId = getBinaryValue(chainLastBlockIdKey(chainId))
358386 let check2 = isReferenceCorrect(reference, lastBlockId)
359387 if ((check2 == check2))
360388 then {
361389 let chainHeight = valueOrElse(getInteger(chainHeightKey(chainId)), 0)
362390 let newHeight = (chainHeight + 1)
363391 let blocksNumber = valueOrElse(getInteger(lastEpochBlocksNumberKey), 0)
364392 let newBlockMeta = (((toBytes(newHeight) + toBytes(height)) + lastBlockId) + i.originCaller.bytes)
365-[BinaryEntry(blockMetaKey(blockHash), newBlockMeta), IntegerEntry(chainHeightKey(chainId), newHeight), BinaryEntry(chainLastBlockIdKey(chainId), blockHash), IntegerEntry(lastEpochBlocksNumberKey, (blocksNumber + 1))]
393+[BinaryEntry(blockMetaKey(blockHash), newBlockMeta), BinaryEntry((blockMetaK + toBase16String(blockHash)), newBlockMeta), IntegerEntry(chainHeightKey(chainId), newHeight), BinaryEntry(chainLastBlockIdKey(chainId), blockHash), IntegerEntry(lastEpochBlocksNumberKey, (blocksNumber + 1)), StringEntry(epochMetaKey(height), ((toString(i.originCaller) + ",0,") + toBase16String(blockHash)))]
366394 }
367395 else throw("Strict value is not equal to itself.")
368396 }
369397 else throw("Strict value is not equal to itself.")
370398 }
371399
372400
373401
374402 @Callable(i)
375403 func extendMainChain (blockHash,reference,epoch) = {
376404 let checkEpoch = ensureCorrectEpoch(epoch)
377405 if ((checkEpoch == checkEpoch))
378406 then {
379407 let checkGenerator = ensureMiningEpoch(i.originCaller)
380408 if ((checkGenerator == checkGenerator))
381409 then {
382410 let checkChain = ensureMainOrInactiveChain(i.originCaller)
383411 if ((checkChain == checkChain))
384412 then {
385413 let chainHeight = valueOrElse(getInteger(chainHeightKey(mainChainId)), 0)
386414 let lastValidBlockId = getBinary(chainLastBlockIdKey(mainChainId))
387415 let checkReference = isReferenceCorrect(reference, lastValidBlockId)
388416 if ((checkReference == checkReference))
389417 then {
390418 let blockIdsLastN = valueOrElse(getInteger(chainAllBlockIdsLastNKey(mainChainId)), 0)
391419 let blockIds = valueOrElse(getString(chainAllBlockIdsKey(mainChainId, blockIdsLastN)), "")
392420 let newHeight = (chainHeight + 1)
393421 let updateAllBlockIds = if ((size(blockIds) >= MAX_BLOCKS_STR_SIZE))
394422 then [IntegerEntry(chainAllBlockIdsLastNKey(mainChainId), (blockIdsLastN + 1)), StringEntry(chainAllBlockIdsKey(mainChainId, (blockIdsLastN + 1)), toBase16String(blockHash))]
395423 else {
396424 let newBlockIds = if ((blockIds == ""))
397425 then toBase16String(blockHash)
398426 else ((toBase16String(blockHash) + SEP) + blockIds)
399427 [StringEntry(chainAllBlockIdsKey(mainChainId, blockIdsLastN), newBlockIds)]
400428 }
401429 let firstBlockId = match lastValidBlockId {
402430 case id: ByteVector =>
403431 nil
404432 case _ =>
405433 [BinaryEntry(chainFirstBlockIdKey(mainChainId), blockHash)]
406434 }
407435 let newBlockMeta = (((toBytes(newHeight) + toBytes(height)) + reference) + i.originCaller.bytes)
408- (([BinaryEntry(blockMetaKey(blockHash), newBlockMeta), IntegerEntry(chainHeightKey(mainChainId), newHeight), BinaryEntry(chainLastBlockIdKey(mainChainId), blockHash), IntegerEntry(chainIdKey(i.originCaller.bytes), mainChainId), setEpochData(i.originCaller), IntegerEntry(lastEpochBlocksNumberKey, 1)] ++ firstBlockId) ++ updateAllBlockIds)
436+ (([BinaryEntry(blockMetaKey(blockHash), newBlockMeta), BinaryEntry((blockMetaK + toBase16String(blockHash)), newBlockMeta), IntegerEntry(chainHeightKey(mainChainId), newHeight), BinaryEntry(chainLastBlockIdKey(mainChainId), blockHash), IntegerEntry(chainIdKey(i.originCaller.bytes), mainChainId), setEpochData(i.originCaller), IntegerEntry(lastEpochBlocksNumberKey, 1), StringEntry(epochMetaKey(height), ((toString(i.originCaller) + ",0,") + toBase16String(blockHash)))] ++ firstBlockId) ++ updateAllBlockIds)
409437 }
410438 else throw("Strict value is not equal to itself.")
411439 }
412440 else throw("Strict value is not equal to itself.")
413441 }
414442 else throw("Strict value is not equal to itself.")
415443 }
416444 else throw("Strict value is not equal to itself.")
417445 }
418446
419447
420448
421449 @Callable(i)
422450 func startAltChain (blockHash,reference,epoch) = {
423451 let checkEpoch = ensureCorrectEpoch(epoch)
424452 if ((checkEpoch == checkEpoch))
425453 then {
426454 let checkReference = ensureReferenceIsSafeForRollback(reference)
427455 if ((checkReference == checkReference))
428456 then {
429457 let checkGenerator = ensureMiningEpoch(i.originCaller)
430458 if ((checkGenerator == checkGenerator))
431459 then {
432460 let checkChain = ensureMainOrInactiveChain(i.originCaller)
433461 if ((checkChain == checkChain))
434462 then {
435463 let newChainId = (valueOrElse(getInteger(lastChainIdKey), 0) + 1)
436464 let newHeight = (blockMeta(reference)._1 + 1)
437465 let newBlockMeta = (((toBytes(newHeight) + toBytes(height)) + reference) + i.originCaller.bytes)
438-[BinaryEntry(blockMetaKey(blockHash), newBlockMeta), BinaryEntry(chainFirstBlockIdKey(newChainId), blockHash), BinaryEntry(chainLastBlockIdKey(newChainId), blockHash), StringEntry(chainAllBlockIdsKey(newChainId, 0), toBase16String(blockHash)), IntegerEntry(chainHeightKey(newChainId), newHeight), IntegerEntry(chainIdKey(i.originCaller.bytes), newChainId), setEpochData(i.originCaller), StringEntry(supportersKey(newChainId), toString(i.originCaller)), IntegerEntry(lastEpochBlocksNumberKey, 1), IntegerEntry(lastChainIdKey, newChainId)]
466+[BinaryEntry(blockMetaKey(blockHash), newBlockMeta), BinaryEntry((blockMetaK + toBase16String(blockHash)), newBlockMeta), BinaryEntry(chainFirstBlockIdKey(newChainId), blockHash), BinaryEntry(chainLastBlockIdKey(newChainId), blockHash), StringEntry(chainAllBlockIdsKey(newChainId, 0), toBase16String(blockHash)), IntegerEntry(chainHeightKey(newChainId), newHeight), IntegerEntry(chainIdKey(i.originCaller.bytes), newChainId), setEpochData(i.originCaller), StringEntry(supportersKey(newChainId), toString(i.originCaller)), IntegerEntry(lastEpochBlocksNumberKey, 1), IntegerEntry(lastChainIdKey, newChainId), StringEntry(epochMetaKey(height), ((toString(i.originCaller) + ",0,") + toBase16String(blockHash)))]
439467 }
440468 else throw("Strict value is not equal to itself.")
441469 }
442470 else throw("Strict value is not equal to itself.")
443471 }
444472 else throw("Strict value is not equal to itself.")
445473 }
446474 else throw("Strict value is not equal to itself.")
447475 }
448476
449477
450478
451479 @Callable(i)
452480 func extendAltChain (chainId,blockHash,reference,epoch) = {
453481 let checkEpoch = ensureCorrectEpoch(epoch)
454482 if ((checkEpoch == checkEpoch))
455483 then {
456484 let checkGenerator = ensureMiningEpoch(i.originCaller)
457485 if ((checkGenerator == checkGenerator))
458486 then {
459487 let checkChain = ensureAltChainExtension(i.originCaller, chainId)
460488 if ((checkChain == checkChain))
461489 then {
462490 let checkReference = isReferenceCorrect(reference, getBinary(chainLastBlockIdKey(chainId)))
463491 if ((checkReference == checkReference))
464492 then {
465493 let chainHeight = valueOrElse(getInteger(chainHeightKey(chainId)), 0)
466494 let blockIdsLastN = valueOrElse(getInteger(chainAllBlockIdsLastNKey(chainId)), 0)
467495 let blockIds = getStringValue(chainAllBlockIdsKey(chainId, blockIdsLastN))
468496 let newHeight = (chainHeight + 1)
469497 let updateAllBlockIds = if ((size(blockIds) >= MAX_BLOCKS_STR_SIZE))
470498 then [IntegerEntry(chainAllBlockIdsLastNKey(chainId), (blockIdsLastN + 1)), StringEntry(chainAllBlockIdsKey(chainId, (blockIdsLastN + 1)), toBase16String(blockHash))]
471499 else {
472500 let newBlockIds = ((toBase16String(blockHash) + SEP) + blockIds)
473501 [StringEntry(chainAllBlockIdsKey(chainId, blockIdsLastN), newBlockIds)]
474502 }
475503 let mainChainEntry = if ((supportingBalance(chainId) > (computedTotalBalance / 2)))
476504 then [IntegerEntry(mainChainIdKey, chainId)]
477505 else nil
478506 let newBlockMeta = (((toBytes(newHeight) + toBytes(height)) + reference) + i.originCaller.bytes)
479- ((([BinaryEntry(blockMetaKey(blockHash), newBlockMeta), BinaryEntry(chainLastBlockIdKey(chainId), blockHash), IntegerEntry(chainHeightKey(chainId), newHeight), setEpochData(i.originCaller), IntegerEntry(chainIdKey(i.originCaller.bytes), chainId), IntegerEntry(lastEpochBlocksNumberKey, 1)] ++ mainChainEntry) ++ addSupporter(chainId, i.originCaller)) ++ updateAllBlockIds)
507+ ((([BinaryEntry(blockMetaKey(blockHash), newBlockMeta), BinaryEntry((blockMetaK + toBase16String(blockHash)), newBlockMeta), BinaryEntry(chainLastBlockIdKey(chainId), blockHash), IntegerEntry(chainHeightKey(chainId), newHeight), setEpochData(i.originCaller), IntegerEntry(chainIdKey(i.originCaller.bytes), chainId), IntegerEntry(lastEpochBlocksNumberKey, 1), StringEntry(epochMetaKey(height), ((toString(i.originCaller) + ",0,") + toBase16String(blockHash)))] ++ mainChainEntry) ++ addSupporter(chainId, i.originCaller)) ++ updateAllBlockIds)
480508 }
481509 else throw("Strict value is not equal to itself.")
482510 }
483511 else throw("Strict value is not equal to itself.")
484512 }
485513 else throw("Strict value is not equal to itself.")
486514 }
487515 else throw("Strict value is not equal to itself.")
488516 }
489517
490518
491519
492520 @Callable(i)
493521 func join (rewardAddress) = {
494522 func checkRewardAddress (address) = match getBinary(minerPkKey(address)) {
495523 case pk: ByteVector =>
496524 if ((pk == i.originCallerPublicKey))
497525 then unit
498526 else throw(((("L2 miner address " + address) + " is already linked with ") + toBase58String(pk)))
499527 case _ =>
500528 unit
501529 }
502530
503531 if ((MIN_BALANCE > wavesBalance(i.originCaller).generating))
504532 then throw(((("Insufficient generating balance: " + toString(wavesBalance(i.originCaller).generating)) + ". Required: ") + toString(MIN_BALANCE)))
505533 else if ((size(rewardAddress) != 20))
506534 then throw("rewardAddress should be an L2 address")
507535 else {
508536 func checkExistence (exists,miner) = if (exists)
509537 then true
510538 else (miner == toString(i.originCaller))
511539
512540 let alreadyExists = {
513541 let $l = allMiners
514542 let $s = size($l)
515543 let $acc0 = false
516544 func $f0_1 ($a,$i) = if (($i >= $s))
517545 then $a
518546 else checkExistence($a, $l[$i])
519547
520548 func $f0_2 ($a,$i) = if (($i >= $s))
521549 then $a
522550 else throw("List size exceeds 50")
523551
524552 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50)
525553 }
526554 if (alreadyExists)
527555 then nil
528556 else {
529557 let newMiner = toString(i.originCaller)
530558 let rewardAddressHex = toBase16String(rewardAddress)
531559 let check = checkRewardAddress(rewardAddressHex)
532560 if ((check == check))
533561 then {
534562 func filterLeaving (acc,miner) = {
535- let $t01671516747 = acc
536- let accMiners = $t01671516747._1
537- let isUpdated = $t01671516747._2
563+ let $t01781217844 = acc
564+ let accMiners = $t01781217844._1
565+ let isUpdated = $t01781217844._2
538566 if ((miner == newMiner))
539567 then $Tuple2(accMiners, true)
540568 else $Tuple2((accMiners :+ miner), isUpdated)
541569 }
542570
543571 let newMiners = if ((size(allMiners) == 0))
544572 then newMiner
545573 else ((makeString_2C(allMiners, SEP) + SEP) + newMiner)
546- let $t01701117101 = {
574+ let $t01810818198 = {
547575 let $l = allLeavingMiners
548576 let $s = size($l)
549577 let $acc0 = $Tuple2(nil, false)
550578 func $f1_1 ($a,$i) = if (($i >= $s))
551579 then $a
552580 else filterLeaving($a, $l[$i])
553581
554582 func $f1_2 ($a,$i) = if (($i >= $s))
555583 then $a
556584 else throw("List size exceeds 50")
557585
558586 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50)
559587 }
560- let newLeavingMiners = $t01701117101._1
561- let isUpdated = $t01701117101._2
588+ let newLeavingMiners = $t01810818198._1
589+ let isUpdated = $t01810818198._2
562590 let newLeavingMinersAction = if ((newLeavingMiners != nil))
563591 then [StringEntry(leavingMinersKey(height), makeString_2C(newLeavingMiners, SEP))]
564592 else if ((allLeavingMiners != nil))
565593 then [DeleteEntry(leavingMinersKey(height))]
566594 else nil
567595 let joinHeight = if (isUpdated)
568596 then height
569597 else (height + 1)
570598 let deleteOldRewardAddressPk = match getBinary(minerRewardAddress(newMiner)) {
571599 case oldAddress: ByteVector =>
572600 if ((oldAddress == rewardAddress))
573601 then nil
574602 else [DeleteEntry(minerPkKey(toBase16String(oldAddress)))]
575603 case _ =>
576604 nil
577605 }
578606 (([StringEntry(allMinersKey, newMiners), IntegerEntry(minerJoinHeightKey(newMiner), joinHeight), BinaryEntry(minerRewardAddress(newMiner), rewardAddress), BinaryEntry(minerPkKey(rewardAddressHex), i.originCallerPublicKey)] ++ newLeavingMinersAction) ++ deleteOldRewardAddressPk)
579607 }
580608 else throw("Strict value is not equal to itself.")
581609 }
582610 }
583611 }
584612
585613
586614
587615 @Callable(i)
588616 func leave () = {
589617 let leavingMiner = toString(i.originCaller)
590618 func filterMiner (acc,miner) = if ((miner == leavingMiner))
591619 then acc
592620 else (acc :+ miner)
593621
594622 let restMiners = {
595623 let $l = allMiners
596624 let $s = size($l)
597625 let $acc0 = nil
598626 func $f0_1 ($a,$i) = if (($i >= $s))
599627 then $a
600628 else filterMiner($a, $l[$i])
601629
602630 func $f0_2 ($a,$i) = if (($i >= $s))
603631 then $a
604632 else throw("List size exceeds 50")
605633
606634 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50)
607635 }
608636 if ((thisEpochMiner == i.originCaller.bytes))
609637 then throw("designated miner can't leave")
610638 else match getInteger(minerJoinHeightKey(leavingMiner)) {
611639 case minerHeight: Int =>
612640 if ((minerHeight > height))
613641 then [StringEntry(allMinersKey, makeString_2C(restMiners, SEP)), DeleteEntry(minerJoinHeightKey(leavingMiner))]
614642 else {
615643 let oldLeavingMiners = valueOrElse(getString(leavingMinersKey(height)), "")
616644 let newLeavingMiners = if ((oldLeavingMiners == ""))
617645 then leavingMiner
618646 else ((oldLeavingMiners + SEP) + leavingMiner)
619647 [StringEntry(allMinersKey, makeString_2C(restMiners, SEP)), DeleteEntry(minerJoinHeightKey(leavingMiner)), StringEntry(leavingMinersKey(height), newLeavingMiners)]
620648 }
621649 case _ =>
622650 [StringEntry(allMinersKey, makeString_2C(restMiners, SEP))]
623651 }
624652 }
625653
626654

github/deemru/w8io/6500d08 
141.44 ms