tx · 7YtfLVRpbiGN3Dc1uuTqV9RS47mUbvj6fWrGgoCDQrSV

3NDCyBG5q85JuaRiigUeEtainyjCQT3XpZm:  -0.10100000 Waves

2024.09.12 19:15 [3280649] smart account 3NDCyBG5q85JuaRiigUeEtainyjCQT3XpZm > SELF 0.00000000 Waves

{ "type": 13, "id": "7YtfLVRpbiGN3Dc1uuTqV9RS47mUbvj6fWrGgoCDQrSV", "fee": 10100000, "feeAssetId": null, "timestamp": 1726157502292, "version": 2, "chainId": 84, "sender": "3NDCyBG5q85JuaRiigUeEtainyjCQT3XpZm", "senderPublicKey": "EVooykMNV691Venwp1dHUTBd7KWequzUcda57Wd3LQEX", "proofs": [ "5uRZtTwVfKpPcY6swos5YJC233KhFBDBHunL5qkt7378VnUFRqRF7UewHJv6hjv6C8MzAPMDVMhhvuXYGRYf57L5" ], "script": "base64:BgLlAQgCEgMKAQgSBAoCCAESAwoBBBIAEgMKAQgSBAoCCAgSBAoCCAgSAwoBCBIAEgMKAQgSBAoCCAgSBAoCCAgSBAoCAQgSBAoCAQgSBAoCAgISBQoDAQEBEgASBAoCCAgSABIDCgEBEgASBAoCAgISABIDCgEIEgQKAggIEgMKARgSBAoCCAgSBAoCCAgSBQoDCAgIEgQKAggIEgcKBQEBAQEBEgMKAQESBQoDAQEIEgMKAQgSAwoBCBIAEgQKAggBEgQKAggBEgMKAQgSAwoBCBIAEgASAwoBCBIDCgEIEgQKAgICEgCeAgAWS1NfU0VQQVJBVEVfUFVCTElDX0tFWQcAGEtTX0FMTE9XX0JJR19JTkZSQV9NRVJHRQcAE0tTX0FMTE9XX1JPQk9fRFVDS1MHAApEQVlfTUlMTElTAIC4mSkABWNoYWluCQDJAQIJAMoBAggFBHRoaXMFYnl0ZXMAAQABAANwdWIEByRtYXRjaDAFBWNoYWluAwkAAAIBAVcFByRtYXRjaDADBRZLU19TRVBBUkFURV9QVUJMSUNfS0VZASCrF1ePFWfjWVRBsNZy62abxKPTZl7VmYZQ35g3H7IJCAEgT1PiGj9UqNadUk4THUYnVb2zU/Mse8lUVLD/Q8G0FCgDCQAAAgEBVAUHJG1hdGNoMAEgT1PiGj9UqNadUk4THUYnVb2zU/Mse8lUVLD/Q8G0FCgJAAIBAg1Vbmtub3duIGNoYWluAAt1c2R0QXNzZXRJZAQHJG1hdGNoMAUFY2hhaW4DCQAAAgEBVwUHJG1hdGNoMAEghNp6sggDP07Ru8qO7ouTvMmC3Qtd+geWqNQj+agP/7kDCQAAAgEBVAUHJG1hdGNoMAEgVbHYn3KHgu/l41uNrAWrZd6aQ6EvFrsF8xq3h6XxxRgJAAIBAg1Vbmtub3duIGNoYWluABVkZWZhdWx0UmVzdEFkZHJlc3NTdHIEByRtYXRjaDAFBWNoYWluAwkAAAIBAVcFByRtYXRjaDACIzNQUUN1dkZidmg0TGtQVW5yblUxejNqbmJBMXA5bTNXTmh2AwkAAAIBAVQFByRtYXRjaDACIzNNdW1rR0d6dENLQVhwV0RxeGtkZG9mcVhTVWJxUWt2U0p5CQACAQINVW5rbm93biBjaGFpbgAQYWNyZXMyQWRkcmVzc1N0cgQHJG1hdGNoMAUFY2hhaW4DCQAAAgEBVwUHJG1hdGNoMAIjM1A0VUgzVDluWHBNTnBVbVNtUWpQbUV6M0c4NXQzem42ZUEDCQAAAgEBVAUHJG1hdGNoMAIjM05CUHgxRmNpdTNKUU5FR1oyMWpTblRkdXRMTkdHQlVTWGgJAAIBAg1Vbmtub3duIGNoYWluABFJbmZyYVVwZ3JhZGVDb3N0UwQHJG1hdGNoMAUFY2hhaW4DCQAAAgEBVwUHJG1hdGNoMACAyK+gJQMJAAACAQFUBQckbWF0Y2gwAIDC1y8JAAIBAg1Vbmtub3duIGNoYWluAA5hcmJpdHJhZ2VEZWxheQQHJG1hdGNoMAUFY2hhaW4DCQAAAgEBVwUHJG1hdGNoMAUKREFZX01JTExJUwMJAAACAQFUBQckbWF0Y2gwAODUAwkAAgECDVVua25vd24gY2hhaW4AA1NFUAICX18ABU1VTFQ2AMCEPQAFTVVMVDgAgMLXLwAFU1NJWkUAGQAFTVNJWkUAZAAFTFNJWkUA4QEABlhMU0laRQCQAwAHWFhMU0laRQDxBAAFSVRFUjYJAMwIAgAACQDMCAIAAQkAzAgCAAIJAMwIAgADCQDMCAIABAkAzAgCAAUFA25pbAEPZ2V0U3RyaW5nT3JGYWlsAgdhZGRyZXNzA2tleQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFB2FkZHJlc3MFA2tleQkAuQkCCQDMCAICCm1hbmRhdG9yeSAJAMwIAgkApQgBBQdhZGRyZXNzCQDMCAICAS4JAMwIAgUDa2V5CQDMCAICDyBpcyBub3QgZGVmaW5lZAUDbmlsAgAAEUlkeENmZ1N0YWtpbmdEYXBwAAEAEUlkeENmZ0Vjb25vbXlEYXBwAAIAFElkeENmZ0dvdmVybmFuY2VEYXBwAAMADUlkeENmZ1dsZ0RhcHAABAAUSWR4Q2ZnVG91cm5hbWVudERhcHAABwAPSWR4Q2ZnQWNyZXNEYXBwAAgBCmtleVJlc3RDZmcAAg4lc19fcmVzdENvbmZpZwEOa2V5UmVzdEFkZHJlc3MAAgwlc19fcmVzdEFkZHIBEXJlYWRSZXN0Q2ZnT3JGYWlsAQRyZXN0CQC8CQIJAQ9nZXRTdHJpbmdPckZhaWwCBQRyZXN0CQEKa2V5UmVzdENmZwAFA1NFUAEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgdyZXN0Q2ZnA2lkeAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUHcmVzdENmZwUDaWR4CQCsAgICKlJlc3QgY2ZnIGRvZXNuJ3QgY29udGFpbiBhZGRyZXNzIGF0IGluZGV4IAkApAMBBQNpZHgADHJlc3RDb250cmFjdAkBEUBleHRyTmF0aXZlKDEwNjIpAQkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQEOa2V5UmVzdEFkZHJlc3MABRVkZWZhdWx0UmVzdEFkZHJlc3NTdHIAB3Jlc3RDZmcJARFyZWFkUmVzdENmZ09yRmFpbAEFDHJlc3RDb250cmFjdAAPc3Rha2luZ0NvbnRyYWN0CQEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgUHcmVzdENmZwURSWR4Q2ZnU3Rha2luZ0RhcHAAD2Vjb25vbXlDb250cmFjdAkBGGdldENvbnRyYWN0QWRkcmVzc09yRmFpbAIFB3Jlc3RDZmcFEUlkeENmZ0Vjb25vbXlEYXBwAAtnb3ZDb250cmFjdAkBGGdldENvbnRyYWN0QWRkcmVzc09yRmFpbAIFB3Jlc3RDZmcFFElkeENmZ0dvdmVybmFuY2VEYXBwAAt3bGdDb250cmFjdAkBGGdldENvbnRyYWN0QWRkcmVzc09yRmFpbAIFB3Jlc3RDZmcFDUlkeENmZ1dsZ0RhcHAAEnRvdXJuYW1lbnRDb250cmFjdAkBGGdldENvbnRyYWN0QWRkcmVzc09yRmFpbAIFB3Jlc3RDZmcFFElkeENmZ1RvdXJuYW1lbnREYXBwAA1hY3Jlc0NvbnRyYWN0CQEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgUHcmVzdENmZwUPSWR4Q2ZnQWNyZXNEYXBwAApyZWNMYW5kTnVtAAAAC3JlY0xhbmRTaXplAAEAC3JlY1RlcnJhaW5zAAIADHJlY0NvbnRpbmVudAADAA13bGdBc3NldElkS2V5Agt3bGdfYXNzZXRJZAAKd2xnQXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCcCAIFC3dsZ0NvbnRyYWN0BQ13bGdBc3NldElkS2V5AhhXTEdPTEQgaXMgbm90IGlzc3VlZCB5ZXQAD2FjcmVzQXNzZXRJZEtleQIMYWNyZXNBc3NldElkAAxhY3Jlc0Fzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnAgCBQ1hY3Jlc0NvbnRyYWN0BQ9hY3Jlc0Fzc2V0SWRLZXkCF0FDUkVTIGlzIG5vdCBpc3N1ZWQgeWV0AAtyYW5kb21EZWxheQACAQlrZXlDb21taXQBB2FkZHJlc3MJAKwCAgIPZmluaXNoQmxvY2tGb3JfBQdhZGRyZXNzARFrZXlSZXNQcm9wb3J0aW9ucwACE3Jlc1R5cGVzUHJvcG9ydGlvbnMBFmtleVJlc1R5cGVzQnlDb250aW5lbnQBCWNvbnRpbmVudAkArAICAhRyZXNUeXBlc0J5Q29udGluZW50XwUJY29udGluZW50ARVrZXlTdGFrZWRMYW5kc0J5T3duZXIBCW93bmVyQWRkcgkArAICAhNzdGFrZWRMYW5kc0J5T3duZXJfBQlvd25lckFkZHIBFmtleVN0YWtlZFBpZWNlc0J5T3duZXIBCW93bmVyQWRkcgkArAICAhRzdGFrZWRQaWVjZXNCeU93bmVyXwUJb3duZXJBZGRyAQhhc1N0cmluZwEBdgQHJG1hdGNoMAUBdgMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXMFByRtYXRjaDAFAXMJAAIBAhhmYWlsIHRvIGNhc3QgaW50byBTdHJpbmcBBWFzSW50AQF2BAckbWF0Y2gwBQF2AwkAAQIFByRtYXRjaDACA0ludAQBbgUHJG1hdGNoMAUBbgkAAgECFWZhaWwgdG8gY2FzdCBpbnRvIEludAEJYXNBbnlMaXN0AQF2BAckbWF0Y2gwBQF2AwkAAQIFByRtYXRjaDACCUxpc3RbQW55XQQBbAUHJG1hdGNoMAUBbAkAAgECG2ZhaWwgdG8gY2FzdCBpbnRvIExpc3RbQW55XQEJYXNCb29sZWFuAQF2BAckbWF0Y2gwBQF2AwkAAQIFByRtYXRjaDACB0Jvb2xlYW4EAXMFByRtYXRjaDAFAXMJAAIBAhlmYWlsIHRvIGNhc3QgaW50byBCb29sZWFuAQ9udW1QaWVjZXNCeVNpemUBCGxhbmRTaXplBAckbWF0Y2gwBQhsYW5kU2l6ZQMJAAACAgFTBQckbWF0Y2gwBQVTU0laRQMJAAACAgFNBQckbWF0Y2gwBQVNU0laRQMJAAACAgFMBQckbWF0Y2gwBQVMU0laRQMJAAACAgJYTAUHJG1hdGNoMAUGWExTSVpFAwkAAAICA1hYTAUHJG1hdGNoMAUHWFhMU0laRQkAAgECEVVua25vd24gbGFuZCBzaXplAQdpc0RpZ2l0AQFzCQEJaXNEZWZpbmVkAQkAtgkBBQFzAQprZXlCbG9ja2VkAAIQY29udHJhY3RzQmxvY2tlZAERa2V5TGFzdFR4SWRCeVVzZXIBBGFkZHIJAKwCAgIPbGFzdFR4SWRCeVVzZXJfBQRhZGRyAQpmaXhlZFBvaW50AgN2YWwIZGVjaW1hbHMEBnRlblBvdwkAbAYACgAABQhkZWNpbWFscwAAAAAFBERPV04EB2xvd1BhcnQJAKQDAQkAagIFA3ZhbAUGdGVuUG93BAZ6ZXJvZXMJALACAgkApAMBBQZ0ZW5Qb3cJAGQCAAEJALECAQUHbG93UGFydAkArAICCQCsAgIJAKwCAgkApAMBCQBpAgUDdmFsBQZ0ZW5Qb3cCAS4FBnplcm9lcwUHbG93UGFydAEPZ2V0UmFuZG9tTnVtYmVyAwhtYXhWYWx1ZQRzYWx0B2VudHJvcHkDCQBnAgAABQhtYXhWYWx1ZQkAAgECFm1heFZhbHVlIHNob3VsZCBiZSA+IDAECnJhbmRvbUhhc2gJAPcDAQkAywECBQRzYWx0BQdlbnRyb3B5CQBqAgkAsQkBBQpyYW5kb21IYXNoBQhtYXhWYWx1ZQEJZmluYWxUaW1lAAkAlwMBCQDMCAIIBQlsYXN0QmxvY2sJdGltZXN0YW1wCQDMCAIAmNCBq6QyBQNuaWwACkxBTkRQUkVGSVgCBExBTkQACkRVQ0tQUkVGSVgCBERVQ0sAC1JPQk9fUFJFRklYAgRST0JPAApBUlRQUkVTQUxFAgdQUkVTQUxFAAZOVU1SRVMABgAYTUFYX0xBTkRTX1NUQUtFRF9CWV9VU0VSABkAD0RBSUxZUkVTQllQSUVDRQCA+NIBAAxXSE1VTFRJUExJRVIAgMivoCUAD0RFRkFVTFRMT0NBVElPTgIPQWZyaWNhX0ZfQWZyaWNhABBSRVNPVVJDRVBSSUNFTUlOANW1AgAKRVNTRUxMQ09FRgAKABVNSU5fVVNEVF9GRUVfREVMSVZFUlkA0IYDABVVU0RUMkFDUkVTX01VTFRJUExJRVIACgASTUlOX1dMR09MRF9ST0JCRVJZAIDC1y8AFkFMTE9XRURfRlJFRV9ST0JCRVJJRVMAAAAZQUNSRVNfRk9SX1JPQkJFUllfQVRURU1QVACAhK9fABdBTExPV0VEX0ZSRUVfREVMSVZFUklFUwAAABpBQ1JFU19GT1JfREVMSVZFUllfQVRURU1QVACAhK9fAAlwcm9kVHlwZXMJAMwIAgIQRmlyc3QgQWlkIEtpdCBMMQkAzAgCAhBGaXJzdCBBaWQgS2l0IEwyCQDMCAICEEZpcnN0IEFpZCBLaXQgTDMJAMwIAgILQmFja3BhY2sgTDEJAMwIAgILQmFja3BhY2sgTDIJAMwIAgILQmFja3BhY2sgTDMJAMwIAgIORm9vZCBSYXRpb24gTDEJAMwIAgIORm9vZCBSYXRpb24gTDIJAMwIAgIORm9vZCBSYXRpb24gTDMJAMwIAgILSmV0IFBhY2sgTDEJAMwIAgILSmV0IFBhY2sgTDIJAMwIAgILSmV0IFBhY2sgTDMJAMwIAgIJU2hpZWxkIEwxCQDMCAICCVNoaWVsZCBMMgkAzAgCAglTaGllbGQgTDMJAMwIAgIHTWluZSBMMQkAzAgCAgdNaW5lIEwyCQDMCAICB01pbmUgTDMJAMwIAgIHVHJhcCBMMQkAzAgCAgdUcmFwIEwyCQDMCAICB1RyYXAgTDMJAMwIAgILQm9vbS1Eb2cgTDEJAMwIAgILQm9vbS1Eb2cgTDIJAMwIAgILQm9vbS1Eb2cgTDMFA25pbAAKY29udGluZW50cwkAzAgCAghBbWVyaWNhcwkAzAgCAgZFdXJvcGUJAMwIAgIEQXNpYQkAzAgCAgZBZnJpY2EJAMwIAgIHT2NlYW5pYQUDbmlsAAlDT0VGRjJNQVQAgK3iBAAQcHJvZHVjdGlvbk1hdHJpeAkAzAgCAiU4XzhfOF8xN18xN180Ml8xMl8wXzMwXzAsMCwwLDAsMCwwLDBfCQDMCAICJThfOF84XzE3XzE3XzQyXzI0XzBfNjBfMCwwLDUsMiwwLDAsMF8JAMwIAgInOF84XzhfMTdfMTdfNDJfMzZfMF8xMjBfMCwwLDEwLDQsMCwwLDBfCQDMCAICKThfMTlfMTlfOF8yN18xOV8yNl8xXzIwXzAsMCwwLDAsMCwwLDBfMDAxCQDMCAICKThfMTlfMTlfOF8yN18xOV81Ml8xXzQwXzAsMCwwLDAsMCwwLDBfMDAxCQDMCAICKThfMTlfMTlfOF8yN18xOV83OF8xXzgwXzAsMCwwLDAsMCwwLDBfMDAxCQDMCAICJThfOF84XzhfOF82MF8xM18yXzJfMCwwLDAsMCwwLDAsMF8wMTEJAMwIAgIlOF84XzhfOF84XzYwXzI2XzJfNF8wLDAsMCwwLDAsMCwwXzAxMQkAzAgCAiU4XzhfOF84XzhfNjBfMzlfMl84XzAsMCwwLDAsMCwwLDBfMDExCQDMCAICKTMwXzMwXzNfMTdfMTdfM18zMF8zXzMwXzAsMCwwLDAsMCwwLDBfMTExCQDMCAICKTMwXzMwXzNfMTdfMTdfM182MF8zXzUwXzAsMCwwLDAsMCwwLDBfMTExCQDMCAICKTMwXzMwXzNfMTdfMTdfM185MF8zXzcwXzAsMCwwLDAsMCwwLDBfMTExCQDMCAICKzE4XzE4XzEwXzE4XzE4XzE4XzExXzRfMTBfMCwwLDAsMCwwLDAsMF8yMDEJAMwIAgIrMThfMThfMTBfMThfMThfMThfMjJfNF8yMF8wLDAsMCwwLDAsMCwwXzIwMQkAzAgCAisxOF8xOF8xMF8xOF8xOF8xOF8zM180XzMwXzAsMCwwLDAsMCwwLDBfMjAxCQDMCAICKjRfMTNfMjJfNF8zNV8yMl8yM18wXzUwLDEsMF8wLDAsMCwwLDAsMCwwXwkAzAgCAio0XzEzXzIyXzRfMzVfMjJfNDZfMF81MCwxLDFfMCwyLDUsMCwwLDAsMF8JAMwIAgIrNF8xM18yMl80XzM1XzIyXzY5XzBfNTAsMiwxXzAsNSwxMCwwLDAsMCwwXwkAzAgCAio1XzI1XzQwXzVfMTBfMTVfMjBfMV8zMCwxLDFfMCwwLDAsMCwwLDAsMF8JAMwIAgIqNV8yNV80MF81XzEwXzE1XzQwXzFfMzAsMSwyXzIsMSwzLDAsMCwwLDBfCQDMCAICKjVfMjVfNDBfNV8xMF8xNV82MF8xXzMwLDEsM181LDIsOCwwLDAsMCwwXwkAzAgCAicyM18yM181XzIwXzIzXzZfMzVfMl8xMDBfMCwwLDAsMCwwLDAsMF8JAMwIAgInMjNfMjNfNV8yMF8yM182XzcwXzJfMTUwXzAsMCwwLDAsMCwwLDBfCQDMCAICKDIzXzIzXzVfMjBfMjNfNl8xMDVfMl8yMDBfMCwwLDAsMCwwLDAsMF8FA25pbAAJcklkeENvZWZmAAYACnJJZHhFZmZlY3QACAAQcklkeFJlcXVpcmVtZW50cwAJAAlySWR4U2xvdHMACgAOUFJPRFVDVFBLR1NJWkUACgALd2hJZHhMZXZlbHMAAAAId2hJZHhSZXMAAQAId2hJZHhNYXQAAgAJd2hJZHhQcm9kAAMACXdoSWR4TE9GVAAEAAl2b2xMb2NrZWQAAAALdm9sT2NjdXBpZWQAAQAHdm9sRnJlZQACAAh2b2xUb3RhbAADAApicElkeExldmVsAAAACGJwSWR4UmVzAAEACGJwSWR4TWF0AAIACWJwSWR4UHJvZAADAA9sb2NJZHhDb250aW5lbnQAAAAKbG9jSWR4VHlwZQABAAhsb2NJZHhJZAACARVrZXlMYW5kQXNzZXRJZFRvT3duZXIBB2Fzc2V0SWQJAKwCAgIDbm9fBQdhc3NldElkARprZXlMYW5kQXNzZXRJZFRvQ3VzdG9tTmFtZQEHYXNzZXRJZAkArAICAgVsY25hXwUHYXNzZXRJZAEWa2V5U3Rha2VkVGltZUJ5QXNzZXRJZAEHYXNzZXRJZAkArAICAgNzdF8FB2Fzc2V0SWQBIGtleUxhbmRBcnRTdGF0dXNCeVR5cGVBbmRBc3NldElkAgR0eXBlB2Fzc2V0SWQJALkJAgkAzAgCAgNsYXMJAMwIAgUEdHlwZQkAzAgCBQdhc3NldElkBQNuaWwCAV8BImtleVN0YWtlZFRpbWVCeVR5cGVBc3NldElkQW5kT3duZXIDB25mdFR5cGUHYXNzZXRJZAlvd25lckFkZHIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAgZzdHRhb18FB25mdFR5cGUCAV8FB2Fzc2V0SWQCAV8FCW93bmVyQWRkcgESa2V5V2FyZWhvdXNlQnlMYW5kAQtsYW5kQXNzZXRJZAkArAICAgN3aF8FC2xhbmRBc3NldElkARZrZXlJbmZyYUxldmVsQnlBc3NldElkAQdhc3NldElkCQCsAgICC2luZnJhTGV2ZWxfBQdhc3NldElkARprZXlEdWNrQXNzZXRJZFRvQ3VzdG9tTmFtZQEHYXNzZXRJZAkArAICAhhkdWNrQ3VzdG9tTmFtZUJ5QXNzZXRJZF8FB2Fzc2V0SWQBFmtleUFkZHJlc3NUb0N1c3RvbU5hbWUBBGFkZHIJAKwCAgIYYWNjb3VudEN1c3RvbU5hbWVCeUFkZHJfBQRhZGRyAQ9rZXlBZGRyZXNzUmVmQnkBBGFkZHIJAKwCAgIJYWNjUmVmQnlfBQRhZGRyARxrZXlPbmJvYXJkQXJ0QWN0aXZhdGVkT25EdWNrAQtkdWNrQXNzZXRJZAkArAICAhpvbmJvYXJkQXJ0QWN0aXZhdGVkT25EdWNrXwULZHVja0Fzc2V0SWQBHGtleU9uYm9hcmRBcnREdWNrQWN0aXZhdGVkQnkBBGFkZHIJAKwCAgIab25ib2FyZEFydEFjdGl2YXRlZER1Y2tCeV8FBGFkZHIBE2tleUFkZHJlc3NSZWZlcnJhbHMBBGFkZHIJAKwCAgINYWNjUmVmZXJyYWxzXwUEYWRkcgEQa2V5RHVja0lkVG9Pd25lcgEHYXNzZXRJZAkArAICAgpkdWNrT3duZXJfBQdhc3NldElkARRrZXlTdGFrZWREdWNrQnlPd25lcgEJb3duZXJBZGRyCQCsAgICEnN0YWtlZER1Y2tCeU93bmVyXwUJb3duZXJBZGRyARFrZXlCYWNrcGFja0J5RHVjawELZHVja0Fzc2V0SWQJAKwCAgIJYmFja1BhY2tfBQtkdWNrQXNzZXRJZAEPa2V5RHVja0xvY2F0aW9uAQtkdWNrQXNzZXRJZAkArAICAg1kdWNrTG9jYXRpb25fBQtkdWNrQXNzZXRJZAEVa2V5VXNlckd3bFJlbGVhc2VUaW1lAQh1c2VyQWRkcgkArAICAholcyVzX191c2VyR3dsUmVsZWFzZVRpbWVfXwUIdXNlckFkZHIBDmtleUVzV2FyZWhvdXNlAAIaZW1lcmdlbmN5V2FyZWhvdXNlUHJvZHVjdHMAD2RlbGl2ZXJ5RnVuZEtleQIMZGVsaXZlcnlGdW5kAA1sYXN0VG91cklkS2V5Ag4lc19fbGFzdFRvdXJJZAEVa2V5VG91clN0YXRpY0RhdGFCeUlkAQN0SWQJAKwCAgIWJXMlZF9fdG91clN0YXRpY0RhdGFfXwkApAMBBQN0SWQBFmtleVRvdXJEeW5hbWljRGF0YUJ5SWQBA3RJZAkArAICAhclcyVkX190b3VyRHluYW1pY0RhdGFfXwkApAMBBQN0SWQBGmtleUJlc3RSZXN1bHRCeVRvdXJBbmREdWNrAgN0SWQLZHVja0Fzc2V0SWQJALkJAgkAzAgCAh8lcyVkJXNfX2Jlc3RSZXN1bHRCeVRvdXJBbmREdWNrCQDMCAIJAKQDAQUDdElkCQDMCAIFC2R1Y2tBc3NldElkBQNuaWwCAl9fAAlpZHhTdGF0aWMAAAAKaWR4RHluYW1pYwABAAp0U3RhdGljRW5kAAYADnREeW5hbWljU3RhdHVzAAEBC2dldFRvdXJEYXRhAgx0b3VyQ29udHJhY3QDdElkBAZzdGF0aWMJALUJAgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFDHRvdXJDb250cmFjdAkBFWtleVRvdXJTdGF0aWNEYXRhQnlJZAEFA3RJZAkArAICCQCsAgICGUVycm9yIHJlYWRpbmcgdG91cm5hbWVudCAJAKQDAQUDdElkAgUgZGF0YQICX18EB2R5bmFtaWMJALwJAgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFDHRvdXJDb250cmFjdAkBFmtleVRvdXJEeW5hbWljRGF0YUJ5SWQBBQN0SWQJAKwCAgkArAICAhlFcnJvciByZWFkaW5nIHRvdXJuYW1lbnQgCQCkAwEFA3RJZAIFIGRhdGECAl9fCQDMCAIFBnN0YXRpYwkAzAgCBQdkeW5hbWljBQNuaWwBDmlzSW5Ub3VybmFtZW50Agx0b3VyQ29udHJhY3QIbG9jYXRpb24EBmxhc3RJZAkBC3ZhbHVlT3JFbHNlAgkAmggCBQx0b3VyQ29udHJhY3QFDWxhc3RUb3VySWRLZXkAAAQDbG9jCQC1CQIFCGxvY2F0aW9uAgFfBANub3cIBQlsYXN0QmxvY2sJdGltZXN0YW1wBAV0RGF0YQkBC2dldFRvdXJEYXRhAgUMdG91ckNvbnRyYWN0BQZsYXN0SWQEBnN0YXRpYwkAkQMCBQV0RGF0YQUJaWR4U3RhdGljBAdkeW5hbWljCQCRAwIFBXREYXRhBQppZHhEeW5hbWljAwMDCQAAAgkAkQMCBQNsb2MFCmxvY0lkeFR5cGUCAVQJAAACCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUDbG9jBQ9sb2NJZHhDb250aW5lbnQFBmxhc3RJZAcJAAACCQCRAwIFB2R5bmFtaWMFDnREeW5hbWljU3RhdHVzAgpJTlBST0dSRVNTBwkAZgIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQZzdGF0aWMFCnRTdGF0aWNFbmQFA25vdwcBCW9uTWlzc2lvbgIMdG91ckNvbnRyYWN0CGxvY2F0aW9uBAZsYXN0SWQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUMdG91ckNvbnRyYWN0BQ1sYXN0VG91cklkS2V5AAAEA2xvYwkAtQkCBQhsb2NhdGlvbgIBXwQDbm93CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAQFdERhdGEJAQtnZXRUb3VyRGF0YQIFDHRvdXJDb250cmFjdAUGbGFzdElkBAZzdGF0aWMJAJEDAgUFdERhdGEFCWlkeFN0YXRpYwQHZHluYW1pYwkAkQMCBQV0RGF0YQUKaWR4RHluYW1pYwQHbG9jVHlwZQkAkQMCBQNsb2MFCmxvY0lkeFR5cGUDAwMJAAACCQCRAwIFA2xvYwUKbG9jSWR4VHlwZQIBVAkAAAIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQNsb2MFD2xvY0lkeENvbnRpbmVudAUGbGFzdElkBwkAAAIJAJEDAgUHZHluYW1pYwUOdER5bmFtaWNTdGF0dXMCCklOUFJPR1JFU1MHCQBmAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBnN0YXRpYwUKdFN0YXRpY0VuZAUDbm93BwESZ2V0UmVjaXBlTWF0ZXJpYWxzAQZyZWNpcGUJAGgCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUGcmVjaXBlBQlySWR4Q29lZmYFCUNPRUZGMk1BVAEMY2hlYXRBdHRlbXB0AwZvbGRMb2MGbmV3TG9jCWNoZWF0Q2FzZQkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAhZDaGVhdCBhdHRlbXB0OiBvbGRMb2M9BQZvbGRMb2MCCSwgbmV3TG9jPQUGbmV3TG9jAgcsIGNhc2U9CQCkAwEFCWNoZWF0Q2FzZQAGU0NBTEU4AIDC1y8ADHhwTGV2ZWxTY2FsZQCAGQAPeHBMZXZlbFJlY2lwUG93AKAfABJudW1Qb2ludHNPbkxldmVsVXAAAwAMcmVxdWlyZW1lbnRzCQDMCAICCFN0cmVuZ3RoCQDMCAICCEFjY3VyYWN5CQDMCAICCUludGVsbGVjdAkAzAgCAglFbmR1cmFuY2UJAMwIAgIJRGV4dGVyaXR5CQDMCAICBUxldmVsCQDMCAICBkhlYWx0aAUDbmlsAAxjaGFyU3RyZW5ndGgAAAAMY2hhckFjY3VyYWN5AAEADWNoYXJJbnRlbGxlY3QAAgANY2hhckVuZHVyYW5jZQADAA1jaGFyRGV4dGVyaXR5AAQAC3NlZ0JhY2twYWNrAAAAC05VTVNFR01FTlRTAAYACk5VTU1BSU5BVVgAAgAITUFYU0xPVFMAAgANTUFYUFJPRElOU0xPVAAeAQ1rZXlEdWNrSGVhbHRoAQtkdWNrQXNzZXRJZAkArAICAgtkdWNrSGVhbHRoXwULZHVja0Fzc2V0SWQBDGtleUR1Y2tDaGFycwELZHVja0Fzc2V0SWQJAKwCAgIKZHVja0NoYXJzXwULZHVja0Fzc2V0SWQBCWtleUR1Y2tYUAELZHVja0Fzc2V0SWQJAKwCAgIHZHVja1hQXwULZHVja0Fzc2V0SWQBDGtleUR1Y2tMZXZlbAELZHVja0Fzc2V0SWQJAKwCAgIKZHVja0xldmVsXwULZHVja0Fzc2V0SWQBEWtleUR1Y2tGcmVlUG9pbnRzAQtkdWNrQXNzZXRJZAkArAICAg9kdWNrRnJlZVBvaW50c18FC2R1Y2tBc3NldElkARBrZXlEdWNrRXF1aXBtZW50AQtkdWNrQXNzZXRJZAkArAICAg5kdWNrRXF1aXBtZW50XwULZHVja0Fzc2V0SWQBCWtleVVzZXJYUAEEYWRkcgkArAICAgd1c2VyWFBfBQRhZGRyAQxrZXlVc2VyTGV2ZWwBBGFkZHIJAKwCAgIKdXNlckxldmVsXwUEYWRkcgERa2V5VXNlckZyZWVQb2ludHMBBGFkZHIJAKwCAgIPdXNlckZyZWVQb2ludHNfBQRhZGRyAQ5rZXlTYXZlZEhlYWx0aAELZHVja0Fzc2V0SWQJAKwCAgIMc2F2ZWRIZWFsdGhfBQtkdWNrQXNzZXRJZAEQa2V5U2F2ZWRMb2NhdGlvbgELZHVja0Fzc2V0SWQJAKwCAgIOc2F2ZWRMb2NhdGlvbl8FC2R1Y2tBc3NldElkAQxrZXlEdWNrQnVmZnMBC2R1Y2tBc3NldElkCQCsAgICCmR1Y2tCdWZmc18FC2R1Y2tBc3NldElkARhrZXlMYXN0Um9iYmVyeVRpbWVCeUR1Y2sBC2R1Y2tBc3NldElkCQCsAgICEGxhc3RSb2JiZXJ5VGltZV8FC2R1Y2tBc3NldElkARNrZXlEdWNrUm9iYmVyeUNvdW50AQtkdWNrQXNzZXRJZAkArAICAhh0b3RhbFJvYmJlcnlDb3VudEJ5RHVja18FC2R1Y2tBc3NldElkARNrZXlVc2VyUm9iYmVyeUNvdW50AQRhZGRyCQCsAgICEXVzZXJSb2JiZXJ5Q291bnRfBQRhZGRyARVrZXlVc2VyTGFzdFJvYmJlcnlEYXkBBGFkZHIJAKwCAgITdXNlckxhc3RSb2JiZXJ5RGF5XwUEYWRkcgEUa2V5RHVja0RlbGl2ZXJ5Q291bnQBC2R1Y2tBc3NldElkCQCsAgICGXRvdGFsRGVsaXZlcnlDb3VudEJ5RHVja18FC2R1Y2tBc3NldElkARRrZXlVc2VyRGVsaXZlcnlDb3VudAEEYWRkcgkArAICAhJ1c2VyRGVsaXZlcnlDb3VudF8FBGFkZHIBFmtleVVzZXJMYXN0RGVsaXZlcnlEYXkBBGFkZHIJAKwCAgIUdXNlckxhc3REZWxpdmVyeURheV8FBGFkZHIAB3hwQ2xhaW0AkE4AD3hwU3VjY2Vzc0ZsaWdodACQTgAMeHBGYWlsRmxpZ2h0ANAPAAx4cFN1Y2Nlc3NSb2IAkE4ACXhwRmFpbFJvYgDQDwAIeHBDYWxsRVMAoI0GAAx4cEN1c3RvbU5hbWUAwIQ9AAp4cE5ld1NMYW5kAMCWsQIADnhwVXBncmFkZUluZnJhAJBOAAd4cE1lcmdlAMCEPQAJeHBPbmJvYXJkAMCEPQAGeHBIZWFsAJBOAQlsZXZlbEJ5WFABAnhwCQBrAwUMeHBMZXZlbFNjYWxlCQBsBgUCeHAABAUPeHBMZXZlbFJlY2lwUG93AAQABAUERE9XTgUGU0NBTEU4AQltYXhIZWFsdGgBBWxldmVsCQBkAgBkBQVsZXZlbAEHbGV2ZWxVcAIJY3VyckxldmVsBW5ld1hQBAhuZXdMZXZlbAkBCWxldmVsQnlYUAEFBW5ld1hQCQDMCAIFCG5ld0xldmVsCQDMCAIJAGgCBRJudW1Qb2ludHNPbkxldmVsVXAJAGUCBQhuZXdMZXZlbAUJY3VyckxldmVsBQNuaWwBDGdldER1Y2tTdGF0cwQPc3Rha2luZ0NvbnRyYWN0C2R1Y2tBc3NldElkCmJ1ZmZFZmZlY3QKZm9yY2VCdWZmcwQFY2hhcnMJALUJAgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJAQxrZXlEdWNrQ2hhcnMBBQtkdWNrQXNzZXRJZAIJMF8wXzBfMF8wAgFfBANsdmwJAQt2YWx1ZU9yRWxzZQIJAJoIAgUPc3Rha2luZ0NvbnRyYWN0CQEMa2V5RHVja0xldmVsAQULZHVja0Fzc2V0SWQAAAQGaGVhbHRoCQELdmFsdWVPckVsc2UCCQCaCAIFD3N0YWtpbmdDb250cmFjdAkBDWtleUR1Y2tIZWFsdGgBBQtkdWNrQXNzZXRJZAkBCW1heEhlYWx0aAEFA2x2bAQKc3RhdGVCdWZmcwkAtQkCCQELdmFsdWVPckVsc2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBDGtleUR1Y2tCdWZmcwEFC2R1Y2tBc3NldElkAgkwXzBfMF8wXzACAV8JAM4IAgkAzAgCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUFY2hhcnMFDGNoYXJTdHJlbmd0aAkAzAgCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUFY2hhcnMFDGNoYXJBY2N1cmFjeQkAzAgCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUFY2hhcnMFDWNoYXJJbnRlbGxlY3QJAMwIAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBWNoYXJzBQ1jaGFyRW5kdXJhbmNlCQDMCAIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQVjaGFycwUNY2hhckRleHRlcml0eQkAzAgCBQNsdmwJAMwIAgUGaGVhbHRoBQNuaWwDBQpmb3JjZUJ1ZmZzCQDMCAIFCmJ1ZmZFZmZlY3QJAMwIAgUKYnVmZkVmZmVjdAkAzAgCBQpidWZmRWZmZWN0CQDMCAIFCmJ1ZmZFZmZlY3QJAMwIAgUKYnVmZkVmZmVjdAUDbmlsCQDMCAIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQpzdGF0ZUJ1ZmZzBQxjaGFyU3RyZW5ndGgJAMwIAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCnN0YXRlQnVmZnMFDGNoYXJBY2N1cmFjeQkAzAgCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUKc3RhdGVCdWZmcwUNY2hhckludGVsbGVjdAkAzAgCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUKc3RhdGVCdWZmcwUNY2hhckVuZHVyYW5jZQkAzAgCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUKc3RhdGVCdWZmcwUNY2hhckRleHRlcml0eQUDbmlsAAlEQVlNSUxMSVMAgLiZKQEUa2V5TGFzdEFyYlRpbWVCeVVzZXIBBGFkZHIJAKwCAgIQbGFzdEFyYlRpbWVVc2VyXwUEYWRkcgEaa2V5QWNyZXNTdGFrZWRBbW91bnRCeVVzZXIBBGFkZHIJAKwCAgIYYWNyZXNTdGFrZWRBbW91bnRCeVVzZXJfBQRhZGRyAA1pbmN1YmF0b3JBZGRyBAckbWF0Y2gwBQVjaGFpbgMJAAACAQFXBQckbWF0Y2gwCQERQGV4dHJOYXRpdmUoMTA2MikBAiMzUEVrdFZ1eDJSaGNoU042M0RzRG80YjRtejRRcXpLU2VEdgMJAAACAQFUBQckbWF0Y2gwBQR0aGlzCQACAQINVW5rbm93biBjaGFpbgALYnJlZWRlckFkZHIEByRtYXRjaDAFBWNoYWluAwkAAAIBAVcFByRtYXRjaDAJARFAZXh0ck5hdGl2ZSgxMDYyKQECIzNQRFZ1VTQ1SDdFaDVkbXROYm5STlJTdEd3VUxBN05ZNkhiAwkAAAIBAVQFByRtYXRjaDAFBHRoaXMJAAIBAg1Vbmtub3duIGNoYWluABFGSVZFTUlOVVRFU01JTExJUwDgpxIADFJFTkFNSU5HQ09TVADAlrECAApNQVhOQU1FTEVOADIAFUluZnJhVXBncmFkZUNvc3RTVXNkdACAreIEAAxFWFBNQVRFUklBTFMEByRtYXRjaDAFBWNoYWluAwkAAAIBAVcFByRtYXRjaDAApt2C7asHAwkAAAIBAVQFByRtYXRjaDAAqqeBswkJAAIBAg1Vbmtub3duIGNoYWluAAdFWFBVU0RUBAckbWF0Y2gwBQVjaGFpbgMJAAACAQFXBQckbWF0Y2gwAIDlmncDCQAAAgEBVAUHJG1hdGNoMACA5Zp3CQACAQINVW5rbm93biBjaGFpbgAOUk9CT19EVUNLX1VTRFQAoI0GAAxTX0NPU1RfQUNSRVMAgPKLqAkABUZJVkVYCQC2AgEABQAHVFdFTlRZWAkAtgIBABQACFRXRU5UWTJYCQC2AgEJAGgCABQAFAAIVFdFTlRZM1gJALYCAQkAaAIJAGgCABQAFAAUAAhUV0VOVFk0WAkAtgIBCQBoAgkAaAIJAGgCABQAFAAUABQACFRXRU5UWTVYCQC2AgEJAGgCCQBoAgkAaAIJAGgCABQAFAAUABQAFAAPUFJFU0FMRU5VTUxBTkRTAPQDARJrZXlOZXh0RnJlZUxhbmROdW0AAgtuZXh0TGFuZE51bQEaa2V5TGFuZEN1c3RvbU5hbWVUb0Fzc2V0SWQBBG5hbWUJAKwCAgIEbGNuXwUEbmFtZQEQa2V5TGFuZFRvQXNzZXRJZAEHbGFuZE51bQkArAICAgNsYV8FB2xhbmROdW0BHmtleUluZnJhTGV2ZWxCeUFzc2V0SWRBbmRPd25lcgIHYXNzZXRJZAlvd25lckFkZHIJAKwCAgkArAICCQCsAgICBWlsYW9fBQdhc3NldElkAgFfBQlvd25lckFkZHIBEWtleUxhbmROdW1Ub093bmVyAQdsYW5kTnVtCQCsAgICA2xvXwUHbGFuZE51bQEaa2V5RHVja0N1c3RvbU5hbWVUb0Fzc2V0SWQBBG5hbWUJAKwCAgIRZHVja0J5Q3VzdG9tTmFtZV8FBG5hbWUBFmtleUN1c3RvbU5hbWVUb0FkZHJlc3MBBG5hbWUJAKwCAgIUYWNjb3VudEJ5Q3VzdG9tTmFtZV8FBG5hbWUBCWtleU9sZGllcwACCm9sZGllc0xpc3QBD2tleU5leHRSb2JvRHVjawACDG5leHRSb2JvRHVjawALY2xhaW1Nb2RlV2gAAAANY2xhaW1Nb2RlRHVjawABABNjbGFpbU1vZGVXaFRoZW5EdWNrAAIACGZsSGVhbHRoAAAAC2ZsVGltZXN0YW1wAAUAB2ZsQm9udXMABgALZmxQcm9kc1VzZWQABwAIcmxIZWFsdGgAAAALcmxQcm9kc1VzZWQAAQAGcmxUeXBlAAAACHJsTGFzdFR4AAIAC3JsVGltZXN0YW1wAAMBB25mdE5hbWUCB2xhbmROdW0IbGFuZFNpemUJAKwCAgkArAICBQpMQU5EUFJFRklYBQdsYW5kTnVtBQhsYW5kU2l6ZQEIdG9Wb2x1bWUCBmFtb3VudAdwa2dTaXplBARwa2dzAwkAZwIFBmFtb3VudAAACQBpAgkAZQIJAGQCBQZhbW91bnQFB3BrZ1NpemUAAQUHcGtnU2l6ZQkBAS0BCQBpAgkAZQIJAGQCCQEBLQEFBmFtb3VudAUHcGtnU2l6ZQABBQdwa2dTaXplCQBoAgUEcGtncwUFTVVMVDgBE2Rpc3RyaWJ1dGVCeVdlaWdodHMCBXRvdGFsB3dlaWdodHMEA3N1bQkAZAIJAGQCCQBkAgkAZAIJAGQCCQCRAwIFB3dlaWdodHMAAAkAkQMCBQd3ZWlnaHRzAAEJAJEDAgUHd2VpZ2h0cwACCQCRAwIFB3dlaWdodHMAAwkAkQMCBQd3ZWlnaHRzAAQJAJEDAgUHd2VpZ2h0cwAFAwkAZwIAAAUDc3VtCQACAQIQWmVybyB3ZWlnaHRzIHN1bQQFbm9ybTYJAGsDBQV0b3RhbAUFTVVMVDYFA3N1bQoBCm5vcm1hbGl6ZXICA2FjYwRlbGVtCQDNCAIFA2FjYwkAawMFBGVsZW0FBW5vcm02BQVNVUxUNgoAAiRsBQd3ZWlnaHRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQpub3JtYWxpemVyAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA2CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGARJnZXROZWVkZWRNYXRlcmlhbHMBBXRvdGFsBAVwcm9wcwkAtQkCCQEFdmFsdWUBCQCiCAEJARFrZXlSZXNQcm9wb3J0aW9ucwACAV8DCQECIT0CCQCQAwEFBXByb3BzBQZOVU1SRVMJAAIBAhZXcm9uZyBwcm9wb3J0aW9ucyBkYXRhBAFyCQDMCAIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQVwcm9wcwAACQDMCAIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQVwcm9wcwABCQDMCAIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQVwcm9wcwACCQDMCAIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQVwcm9wcwADCQDMCAIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQVwcm9wcwAECQDMCAIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQVwcm9wcwAFBQNuaWwJARNkaXN0cmlidXRlQnlXZWlnaHRzAgUFdG90YWwFAXIBEXN1YnRyYWN0TWF0ZXJpYWxzAwxzaG91bGRVc2VNYXQDaGFzCXRvdGFsTmVlZAQEbmVlZAkBEmdldE5lZWRlZE1hdGVyaWFscwEFCXRvdGFsTmVlZAoBCnN1YnRyYWN0b3ICA2FjYwNpZHgEBnJlc3VsdAkAZQIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQNoYXMFA2lkeAkAkQMCBQRuZWVkBQNpZHgDCQBmAgAABQZyZXN1bHQJAAIBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIYTm90IGVub3VnaCBtYXRlcmlhbCBpZHg9CQCkAwEFA2lkeAILLCB5b3UgaGF2ZSAJAJEDAgUDaGFzBQNpZHgCCywgYnV0IG5lZWQgCQCkAwEJAJEDAgUEbmVlZAUDaWR4CQDNCAIFA2FjYwkApAMBBQZyZXN1bHQDBQxzaG91bGRVc2VNYXQKAAIkbAUFSVRFUjYKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCnN1YnRyYWN0b3ICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDYJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYFA2hhcwERc3VidHJhY3RFcXVpcG1lbnQCBW9sZEVxBXBVc2VkAwkAAAIFBXBVc2VkAgAJAJUKAwUFb2xkRXEHBwoBB3N1YlVzZWQCA2FjYwZpZHhBbXQEBXBhcnRzCQC1CQIFBmlkeEFtdAIBLAMJAQIhPQIJAJADAQUFcGFydHMAAgkAAgECKEluY29ycmVjdCBmb3JtYXQsIHNob3VsZCBiZSBpbmRleCxhbW91bnQEA2lkeAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBXBhcnRzAAADAwkAZgIAAAUDaWR4BgkAZwIFA2lkeAkAkAMBBRBwcm9kdWN0aW9uTWF0cml4CQACAQITVW5rbm93biBwcm9kdWN0IGlkeAQDYW10CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUFcGFydHMAAQQHZXFQYXJ0cwkAtQkCCAUDYWNjAl8xCQCsAgIJAJEDAgUFcGFydHMAAAIBOgMJAQIhPQIJAJADAQUHZXFQYXJ0cwACCQACAQkArAICCQCsAgICD1lvdSBkb24ndCBoYXZlIAkAkQMCBQlwcm9kVHlwZXMFA2lkeAIJIGVxdWlwcGVkBAN0bXAJAJEDAgUHZXFQYXJ0cwABBAZudW1MZW4DCQEHaXNEaWdpdAEJAK8CAgkAsAICBQN0bXAAAQABAAIAAQQEY3VycgkBDXBhcnNlSW50VmFsdWUBCQCvAgIFA3RtcAUGbnVtTGVuBAR0YWlsCQCwAgIFA3RtcAUGbnVtTGVuBAZuZXdBbXQDCQBnAgUEY3VycgUDYW10CQBlAgUEY3VycgUDYW10CQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgICDVlvdSBlcXVpcHBlZCAJAKQDAQUEY3VycgIEIG9mIAkAkQMCBQlwcm9kVHlwZXMFA2lkeAITLCBidXQgdHJpZWQgdG8gdXNlIAkApAMBBQNhbXQJAJUKAwkArAICCQCsAgIJAKwCAgkArAICCQCRAwIFB2VxUGFydHMAAAkAkQMCBQVwYXJ0cwAAAgE6CQCkAwEFBm5ld0FtdAUEdGFpbAMIBQNhY2MCXzIGAwMJAGcCBQNpZHgABgkAZwIACAUDaWR4BwkAAAIFBm5ld0FtdAAABwMIBQNhY2MCXzMGAwMJAGcCBQNpZHgAAwkAZwIABQUDaWR4BwkAZgIFA2FtdAAABwoAAiRsCQC1CQIFBXBVc2VkAgFfCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlQoDBQVvbGRFcQcHCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQdzdWJVc2VkAgUCJGEJAJED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CQACAQIrUHJvZHVjdCBpZHggc2hvdWxkIGJlIDIgZGlnaXRzLCB6ZXJvIHBhZGRlZAQKcHJvZHVjdElkeAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBXBhcnRzAAAEBWNvdW50CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUFcGFydHMAAQMDCQBmAgAABQpwcm9kdWN0SWR4BgkAZwIFCnByb2R1Y3RJZHgJAJADAQUQcHJvZHVjdGlvbk1hdHJpeAkAAgECE1Vua25vd24gcHJvZHVjdCBpZHgDCQBmAgAABQVjb3VudAkAAgECF0NvdW50IGNhbid0IGJlIG5lZ2F0aXZlAwkAZgIFBWNvdW50BQ1NQVhQUk9ESU5TTE9UCQACAQkArAICCQCsAgIJAKwCAgIUQ2FuJ3QgcHV0IG1vcmUgdGhhbiAJAKQDAQUNTUFYUFJPRElOU0xPVAIEIG9mIAkAkQMCBQlwcm9kVHlwZXMFCnByb2R1Y3RJZHgDCQAAAgUFY291bnQAAAkAlAoCBQVwTGlzdAcEBGhlYWQJAMkBAgUFcExpc3QJAGgCAAgFCnByb2R1Y3RJZHgEBGN1cnIJALEJAQkAyQECCQDKAQIFBXBMaXN0CQBoAgAIBQpwcm9kdWN0SWR4AAgEBHRhaWwJAMoBAgUFcExpc3QJAGgCAAgJAGQCBQpwcm9kdWN0SWR4AAEEBnJlY2lwZQkAtQkCCQCRAwIFEHByb2R1Y3Rpb25NYXRyaXgFCnByb2R1Y3RJZHgCAV8DAwkBASEBBQppc1Bvc2l0aXZlCQBmAgUFY291bnQFBGN1cnIHCQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgICCVlvdSBoYXZlIAkApAMBBQRjdXJyAgQgb2YgCQCRAwIFCXByb2RUeXBlcwUKcHJvZHVjdElkeAITLCBidXQgdHJpZWQgdG8gdXNlIAkApAMBBQVjb3VudAQJaXNCaWdJdGVtAwMJAQEhAQUKaXNQb3NpdGl2ZQkBFWNoZWNrU3RhdFJlcXVpcmVtZW50cwIFCWR1Y2tTdGF0cwkAtQkCCQCRAwIFBnJlY2lwZQUQcklkeFJlcXVpcmVtZW50cwIBLAcEBmNvbXBhdAkAkQMCBQZyZWNpcGUFCXJJZHhTbG90cwMJAAACBQZjb21wYXQCAAkAAgECF0l0ZW0gY2Fubm90IGJlIGVxdWlwcGVkBAFjCQENcGFyc2VJbnRWYWx1ZQEFBmNvbXBhdAQEY1NlZwkAaQIFAWMAZAMJAQIhPQIFB3NlZ21lbnQFBGNTZWcJAAIBAhRTZWdtZW50IGluY29tcGF0aWJsZQQIY01haW5BdXgJAGkCCQBqAgUBYwBkAAoDCQECIT0CBQdtYWluQXV4BQhjTWFpbkF1eAkAAgECEVNsb3QgaW5jb21wYXRpYmxlBAljTnVtU2xvdHMJAGoCBQFjAAoDAwkBAiE9AgUEc2xvdAAACQBmAgUJY051bVNsb3RzAAEHCQACAQIeQmlnIGl0ZW1zIHNob3VsZCBvY2N1cHkgc2xvdCAwCQBmAgUJY051bVNsb3RzAAEHCQCUCgIJAMsBAgkAywECBQRoZWFkCQCaAwEJAGQCBQRjdXJyAwUKaXNQb3NpdGl2ZQUFY291bnQJAQEtAQUFY291bnQFBHRhaWwFCWlzQmlnSXRlbQELc2xvdHNHcm91cEIGAWcEYnBJbgppc1Bvc2l0aXZlB3NlZ21lbnQHbWFpbkF1eAVzdGF0cwMJAQIhPQIFAWcCAAQFc2xvdHMJALUJAgUBZwIBLAMJAGYCCQCQAwEFBXNsb3RzBQhNQVhTTE9UUwkAAgECEldyb25nIHNsb3RzIGZvcm1hdAQCczAJAJEDAgUFc2xvdHMAAAQCczEDCQBmAgkAkAMBBQVzbG90cwABCQCRAwIFBXNsb3RzAAECAAMDCQAAAgUCczACAAkAAAIFAnMxAgAHBQRicEluBAV0bXBTMAMJAQIhPQIFAnMwAgAJAQhhZGRQcm9kQgcFAnMwBQRicEluBQppc1Bvc2l0aXZlBQdzZWdtZW50BQdtYWluQXV4AAAFBXN0YXRzCQCUCgIFBGJwSW4HAwkBAiE9AgUCczECAAMIBQV0bXBTMAJfMgkAAgECHkJpZyBpdGVtIGFscmVhZHkgb2NjdXBpZXMgc2xvdAgJAQhhZGRQcm9kQgcFAnMxCAUFdG1wUzACXzEFCmlzUG9zaXRpdmUFB3NlZ21lbnQFB21haW5BdXgAAQUFc3RhdHMCXzEIBQV0bXBTMAJfMQUEYnBJbgEGZHJlc3NCBAdzZWdMaXN0BnBCeXRlcwppc1Bvc2l0aXZlBXN0YXRzCgEHc2VnbWVudAIDYWNjA3Nl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AWkEBnJlc3VsdAkAZAIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQhwcm9wTGlzdAUBaQkAaAIJAGgCBQRzaWduCQCRAwIFDXRlcnJhaW5Db3VudHMFAWkFDWxhbmRTaXplSW5kZXgDCQBmAgAABQZyZXN1bHQJAAIBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICFlBhbmljISBQaWVjZXMgb2YgdHlwZT0JAKQDAQUBaQIHLCBzaWduPQkApAMBBQRzaWduAhMsIHRlcnJhaW5Db3VudHNbaV09CQCkAwEJAJEDAgUNdGVycmFpbkNvdW50cwUBaQIQLCBsYW5kU2l6ZUluZGV4PQkApAMBBQ1sYW5kU2l6ZUluZGV4CQDNCAIFA2FjYwkApAMBBQZyZXN1bHQKAAIkbAUFSVRFUjYKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBB3VwZGF0ZXICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDYJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYBEXVwZGF0ZVByb3BvcnRpb25zAw10ZXJyYWluQ291bnRzDWxhbmRTaXplSW5kZXgEc2lnbgQIcHJvcExpc3QJALUJAgkBC3ZhbHVlT3JFbHNlAgkAoggBCQERa2V5UmVzUHJvcG9ydGlvbnMAAgswXzBfMF8wXzBfMAIBXwkAuQkCCQEZdXBkYXRlUHJvcG9ydGlvbnNJbnRlcm5hbAQFCHByb3BMaXN0BQ10ZXJyYWluQ291bnRzBQ1sYW5kU2l6ZUluZGV4BQRzaWduAgFfAQ1jb3VudFRlcnJhaW5zAQh0ZXJyYWlucwkAzAgCCQBlAgkAkAMBCQC1CQIFCHRlcnJhaW5zAgFBAAEJAMwIAgkAZQIJAJADAQkAtQkCBQh0ZXJyYWlucwIBQgABCQDMCAIJAGUCCQCQAwEJALUJAgUIdGVycmFpbnMCAUMAAQkAzAgCCQBlAgkAkAMBCQC1CQIFCHRlcnJhaW5zAgFEAAEJAMwIAgkAZQIJAJADAQkAtQkCBQh0ZXJyYWlucwIBRQABCQDMCAIJAGUCCQCQAwEJALUJAgUIdGVycmFpbnMCAUYAAQUDbmlsAQZhZGRSZXMFCmN1cnJlbnRSZXMNdGVycmFpbkNvdW50cwlkZWx0YVRpbWUNbGFuZFNpemVJbmRleBdkYWlseUJ5UGllY2VXaXRoQm9udXNlcwoBBWFkZGVyAgNhY2MBaQQJcmVzT2ZUeXBlCQBoAgkAaAIJAGsDBQlkZWx0YVRpbWUFF2RhaWx5QnlQaWVjZVdpdGhCb251c2VzBQlEQVlNSUxMSVMJAJEDAgUNdGVycmFpbkNvdW50cwUBaQUNbGFuZFNpemVJbmRleAkAzQgCBQNhY2MJAKQDAQkAZAIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQpjdXJyZW50UmVzBQFpBQlyZXNPZlR5cGUEAXIKAAIkbAUFSVRFUjYKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBBWFkZGVyAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA2CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGCQC5CQIFAXICAV8BD3ZpcnRDbGFpbUFkZFJlcwUKY3VycmVudFJlcw10ZXJyYWluQ291bnRzCWRlbHRhVGltZQ1sYW5kU2l6ZUluZGV4F2RhaWx5QnlQaWVjZVdpdGhCb251c2VzCgEFYWRkZXICA2FjYwFpBAlyZXNPZlR5cGUJAGgCCQBoAgkAawMFCWRlbHRhVGltZQUXZGFpbHlCeVBpZWNlV2l0aEJvbnVzZXMFCURBWU1JTExJUwkAkQMCBQ10ZXJyYWluQ291bnRzBQFpBQ1sYW5kU2l6ZUluZGV4BAx0b3RhbFJlc1R5cGUJAGQCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUKY3VycmVudFJlcwUBaQUJcmVzT2ZUeXBlCQCUCgIJAM0IAggFA2FjYwJfMQUMdG90YWxSZXNUeXBlCQBkAggFA2FjYwJfMgUMdG90YWxSZXNUeXBlCgACJGwFBUlURVI2CgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCBQNuaWwAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEFYWRkZXICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDYJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYBCXZpcnRDbGFpbQQNdGVycmFpbkNvdW50cwlkZWx0YVRpbWUNbGFuZFNpemVJbmRleBdkYWlseUJ5UGllY2VXaXRoQm9udXNlcwoBBWFkZGVyAgNhY2MMdGVycmFpbkNvdW50BAlyZXNPZlR5cGUJAGgCCQBoAgkAawMFCWRlbHRhVGltZQUXZGFpbHlCeVBpZWNlV2l0aEJvbnVzZXMFCURBWU1JTExJUwUMdGVycmFpbkNvdW50BQ1sYW5kU2l6ZUluZGV4CQCUCgIJAM0IAggFA2FjYwJfMQUJcmVzT2ZUeXBlCQBkAggFA2FjYwJfMgUJcmVzT2ZUeXBlCgACJGwFDXRlcnJhaW5Db3VudHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIFA25pbAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQVhZGRlcgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgNgkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgENZGlzdHJpYnV0ZVJlcwQMY3VycmVudFdoUmVzDmN1cnJlbnRQYWNrUmVzCnJlc1RvQ2xhaW0Ld2hTcGFjZUxlZnQEDnJlc0xpc3RUb0NsYWltCAUKcmVzVG9DbGFpbQJfMQQMcmVzQW1Ub0NsYWltCAUKcmVzVG9DbGFpbQJfMgMJAAACBQxyZXNBbVRvQ2xhaW0AAAkAlAoCCQC5CQIFDGN1cnJlbnRXaFJlcwIBXwkAuQkCBQ5jdXJyZW50UGFja1JlcwIBXwMJAGcCBQt3aFNwYWNlTGVmdAUMcmVzQW1Ub0NsYWltCgEIYWRkTGlzdHMCA2FjYwFpCQDNCAIFA2FjYwkApAMBCQBkAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDGN1cnJlbnRXaFJlcwUBaQkAkQMCBQ5yZXNMaXN0VG9DbGFpbQUBaQQBcgoAAiRsBQVJVEVSNgoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEIYWRkTGlzdHMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDYJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYJAJQKAgkAuQkCBQFyAgFfCQC5CQIFDmN1cnJlbnRQYWNrUmVzAgFfCgEMYWRkUGFydExpc3RzAgNhY2MBaQQGd2hQYXJ0CQBrAwkAkQMCBQ5yZXNMaXN0VG9DbGFpbQUBaQULd2hTcGFjZUxlZnQFDHJlc0FtVG9DbGFpbQkAlAoCCQDNCAIIBQNhY2MCXzEJAKQDAQkAZAIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQxjdXJyZW50V2hSZXMFAWkFBndoUGFydAkAzQgCCAUDYWNjAl8yCQCkAwEJAGUCCQBkAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDmN1cnJlbnRQYWNrUmVzBQFpCQCRAwIFDnJlc0xpc3RUb0NsYWltBQFpBQZ3aFBhcnQEAXIKAAIkbAUFSVRFUjYKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIFA25pbAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQxhZGRQYXJ0TGlzdHMCBQIkYQkAkQMC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XzBfMF8wXzBfMDowXzBfMF8wXzBfMDoCAToJAMwIAgkApAMBCQELdmFsdWVPckVsc2UCCQC2CQEJAJEDAgUBcAUKYnBJZHhMZXZlbAAACQDMCAIDCQAAAgkAkAMBCQC1CQIJAJEDAgUBcAUIYnBJZHhSZXMCAV8FBk5VTVJFUwkAkQMCBQFwBQhicElkeFJlcwILMF8wXzBfMF8wXzAJAMwIAgMJAAACCQCQAwEJALUJAgkAkQMCBQFwBQhicElkeE1hdAIBXwUGTlVNUkVTCQCRAwIFAXAFCGJwSWR4TWF0AgswXzBfMF8wXzBfMAkAzAgCCQCRAwIFAXAFCWJwSWR4UHJvZAUDbmlsARdnZXRXYXJlaG91c2VUb3RhbFZvbHVtZQEJdm9sUHJlZml4BAVwYXJ0cwkAtQkCBQl2b2xQcmVmaXgCAV8JAGgCCQBoAgUMV0hNVUxUSVBMSUVSCQBkAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBXBhcnRzAAEAAQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBXBhcnRzAAABF2dldFdhcmVob3VzZU9jY3VwaWVkVm9sAQljdXJyZW50V2gEBWdvb2RzCQCRAwIFCWN1cnJlbnRXaAUJd2hJZHhQcm9kCgEJc3VtUmVzTWF0AgNhY2MEaXRlbQkAZAIFA2FjYwkBDXBhcnNlSW50VmFsdWUBBQRpdGVtCgEHc3VtUHJvZAIDYWNjBGl0ZW0EA2lkeAgFA2FjYwJfMQQEcGtncwkAaQIJAGUCCQBkAgkBDXBhcnNlSW50VmFsdWUBBQRpdGVtBQ5QUk9EVUNUUEtHU0laRQABBQ5QUk9EVUNUUEtHU0laRQkAlAoCCQBkAgUDaWR4AAEJAGQCCAUDYWNjAl8yCQBoAgUEcGtncwUFTVVMVDgECHdoUmVzVm9sCgACJGwJALUJAgkAkQMCBQljdXJyZW50V2gFCHdoSWR4UmVzAgFfCgACJHMJAJADAQUCJGwKAAUkYWNjMAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQlzdW1SZXNNYXQCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDYJAQUkZjBfMgIJ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a2VkBQNvY2MJAMwIAgkApAMBBQd3aFRvdGFsBQNuaWwCAV8JAMwIAgkAkQMCBQJ3aAULd2hJZHhMZXZlbHMJAMwIAgMJAAACCQCQAwEJALUJAgkAkQMCBQJ3aAUId2hJZHhSZXMCAV8FBk5VTVJFUwkAkQMCBQJ3aAUId2hJZHhSZXMCCzBfMF8wXzBfMF8wCQDMCAIDCQAAAgkAkAMBCQC1CQIJAJEDAgUCd2gFCHdoSWR4TWF0AgFfBQZOVU1SRVMJAJEDAgUCd2gFCHdoSWR4TWF0AgswXzBfMF8wXzBfMAkAzAgCCQCRAwIFAndoBQl3aElkeFByb2QJAMwIAgUGd2hMb2Z0BQNuaWwBFWdldFdhcmVob3VzZVNwYWNlTGVmdAEJY3VycmVudFdoBAtvY2N1cGllZFZvbAkBF2dldFdhcmVob3VzZU9jY3VwaWVkVm9sAQUJY3VycmVudFdoBA9jdXJyV2hMb2NrZWRWb2wJAQ1wYXJzZUludFZhbHVlAQkAkQMCCQC1CQIJAJEDAgUJY3VycmVudFdoBQl3aElkeExPRlQCAV8FCXZvbExvY2tlZAkAZQIJAGUCCQEXZ2V0V2FyZWhvdXNlVG90YWxWb2x1bWUBCQCRAwIFCWN1cnJlbnRXaAULd2hJZHhMZXZlbHMFC29jY3VwaWVkVm9sBQ9jdXJyV2hMb2NrZWRWb2wBCW1vdmVTdHVmZgMKY2FyZ29QYXJ0cwljdXJyZW50V2gLY3VycmVudFBhY2sDCQECIT0CCQCQAwEFCmNhcmdvUGFydHMAAwkAAgECNGNhcmdvTGlzdFN0ciBzaG91bGQgY29udGFpbiBleGFjdGx5IDIgJzonIHNlcGFyYXRvcnMECHJlc1BhcnRzCQC1CQIJAJEDAgUKY2FyZ29QYXJ0cwAAAgFfBAhtYXRQYXJ0cwkAtQkCCQCRAwIFCmNhcmdvUGFydHMAAQIBXwQJcHJvZFBhcnRzAwkAAAIJAJEDAgUKY2FyZ29QYXJ0cwACAgAFA25pbAkAvAkCCQCRAwIFCmNhcmdvUGFydHMAAgIBXwMJAQIhPQIJAJADAQUIcmVzUGFydHMFBk5VTVJFUwkAAgECIEFsbCA2IHJlc291cmNlcyBzaG91bGQgYmUgcGFzc2VkAwkBAiE9AgkAkAMBBQhtYXRQYXJ0cwUGTlVNUkVTCQACAQIgQWxsIDYgbWF0ZXJpYWxzIHNob3VsZCBiZSBwYXNzZWQEC3doU3BhY2VMZWZ0CQEVZ2V0V2FyZWhvdXNlU3BhY2VMZWZ0AQUJY3VycmVudFdoBAljdXJyV2hSZXMJALUJAgkAkQMCBQljdXJyZW50V2gFCHdoSWR4UmVzAgFfBAljdXJyV2hNYXQJALUJAgkAkQMCBQljdXJyZW50V2gFCHdoSWR4TWF0AgFfBApjdXJyV2hQcm9kAwkAAAIJAJEDAgUJY3VycmVudFdoBQl3aElkeFByb2QCAAUDbmlsCQC8CQIJAJEDAgUJY3VycmVudFdoBQl3aElkeFByb2QCAV8EDmN1cnJlbnRQYWNrUmVzCQC1CQIJAJEDAgULY3VycmVudFBhY2sFCGJwSWR4UmVzAgFfBA5jdXJyZW50UGFja01hdAkAtQkCCQCRAwIFC2N1cnJlbnRQYWNrBQhicElkeE1hdAIBXwQPY3VycmVudFBhY2tQcm9kAwkAAAIJAJEDAgULY3VycmVudFBhY2sFCWJwSWR4UHJvZAIABQNuaWwJALwJAgkAkQMCBQtjdXJyZW50UGFjawUJYnBJZHhQcm9kAgFfCgEDbXZSAgNhY2MEaXRlbQQBaQgFA2FjYwJfMQQCYW0JAQ1wYXJzZUludFZhbHVlAQUEaXRlbQQDd2hyCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUJY3VycldoUmVzBQFpBANicHIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQ5jdXJyZW50UGFja1JlcwUBaQMJAAACBQJhbQAACQCWCgQJAGQCBQFpAAEJAM0IAggFA2FjYwJfMgkAkQMCBQljdXJyV2hSZXMFAWkJAM0IAggFA2FjYwJfMwkAkQMCBQ5jdXJyZW50UGFja1JlcwUBaQgFA2FjYwJfNAMJAGYCBQJhbQAAAwkAZgIFAmFtBQNicHIJAAIBCQCsAgIJAKwCAgkArAICCQCsAgICEEF0dGVtcHQgdG8gdGFrZSAFBGl0ZW0CGSBmcm9tIGJhY2twYWNrLCBidXQgb25seSAJAKQDAQUDYnByAgogYXZhaWxhYmxlCQCWCgQJAGQCBQFpAAEJAM0IAggFA2FjYwJfMgkApAMBCQBkAgUDd2hyBQJhbQkAzQgCCAUDYWNjAl8zCQCkAwEJ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UwABBAdsYW5kTnVtCQCkAwEFB2ZyZWVOdW0EDGNvbnRpbmVudElkeAkAoAMBCQC7AgIFBmJpZ051bQUFRklWRVgECHRlcnJhaW5zCQELZ2VuVGVycmFpbnMCBQZiaWdOdW0FDGNvbnRpbmVudElkeAQJY29udGluZW50CQCRAwIFCmNvbnRpbmVudHMFDGNvbnRpbmVudElkeAQFaXNzdWUJAMIIBQkBB25mdE5hbWUCBQdsYW5kTnVtAgFTCQC5CQIJAMwIAgUHbGFuZE51bQkAzAgCAgFTCQDMCAIFCHRlcnJhaW5zCQDMCAIFCWNvbnRpbmVudAUDbmlsAgFfAAEAAAcEB2Fzc2V0SWQJALgIAQUFaXNzdWUEAmlkCQDYBAEFB2Fzc2V0SWQJAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBEmtleU5leHRGcmVlTGFuZE51bQAJAGQCBQdmcmVlTnVtAAEJAMwIAgUFaXNzdWUJAMwIAgkBC1N0cmluZ0VudHJ5AgkBEGtleUxhbmRUb0Fzc2V0SWQBBQdsYW5kTnVtBQJpZAkAzAgCCQELU3RyaW5nRW50cnkCCQEVa2V5TGFuZEFzc2V0SWRUb093bmVyAQUCaWQFCHVzZXJBZGRyCQDMCAIJAQtTdHJpbmdFbnRyeQIJARFrZXlMYW5kTnVtVG9Pd25lcgEFB2xhbmROdW0FCHVzZXJBZGRyCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEWa2V5SW5mcmFMZXZlbEJ5QXNzZXRJZAEFAmlkAAAJAMwIAgkBDEludGVnZXJFbnRyeQIJAR5rZXlJbmZyYUxldmVsQnlBc3NldElkQW5kT3duZXICBQJpZAUIdXNlckFkZHIAAAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQZjYWxsZXIAAQUHYXNzZXRJZAUDbmlsCQCUCgIFAmlkBQljb250aW5lbnQBDGZsaWdodENvbW1vbgMIdXNlckFkZHIHbWVzc2FnZQNzaWcDCQEBIQEJAMQTAwUHbWVzc2FnZQUDc2lnBQNwdWIJAAIBAhhzaWduYXR1cmUgZG9lcyBub3QgbWF0Y2gEBXBhcnRzCQC8CQIJALAJAQUHbWVzc2FnZQIBOwQJZmxpZ2h0TG9nCQC8CQIJAJEDAgUFcGFydHMAAAIBfAQCaHAJALUJAgkAkQMCBQlmbGlnaHRMb2cFCGZsSGVhbHRoAgFfBAVjdXJIUAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmhwAAAEBW5ld0hQCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCaHAAAQQLbmV3TG9jVHhWZXIJALUJAgkAkQMCBQVwYXJ0cwABAgE6BAtuZXdMb2NhdGlvbgkAkQMCBQtuZXdMb2NUeFZlcgAABAR0aW1lCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUJZmxpZ2h0TG9nBQtmbFRpbWVzdGFtcAMDCQBmAgUEdGltZQkAZAIIBQlsYXN0QmxvY2sJdGltZXN0YW1wBRFGSVZFTUlOVVRFU01JTExJUwYJAGYCCQBlAggFCWxhc3RCbG9jawl0aW1lc3RhbXAFEUZJVkVNSU5VVEVTTUlMTElTBQR0aW1lCQACAQkArAICCQCsAgIJAKwCAgIcc2lnbmF0dXJlIG91dGRhdGVkOiBsb2dUaW1lPQkApAMBBQR0aW1lAgksIGJjVGltZT0JAKQDAQgFCWxhc3RCbG9jawl0aW1lc3RhbXAECXR4RnJvbU1zZwkAkQMCBQtuZXdMb2NUeFZlcgABBAZsYXN0VHgJAQt2YWx1ZU9yRWxzZQIJAKIIAQkBEWtleUxhc3RUeElkQnlVc2VyAQUIdXNlckFkZHICAAMJAQIhPQIFBmxhc3RUeAUJdHhGcm9tTXNnCQACAQkArAICCQCsAgIJAKwCAgIeVHggaWRzIGRvbid0IG1hdGNoISBJbiBzdGF0ZTogBQZsYXN0VHgCCiwgaW4gbXNnOiAFCXR4RnJvbU1zZwQLZHVja0Fzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAoggBCQEUa2V5U3Rha2VkRHVja0J5T3duZXIBBQh1c2VyQWRkcgIcWW91IGRvbid0IGhhdmUgYSBkdWNrIHN0YWtlZAQJa2V5SGVhbHRoCQENa2V5RHVja0hlYWx0aAEFC2R1Y2tBc3NldElkBAVtYXhIUAkBCW1heEhlYWx0aAEJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBDGtleUR1Y2tMZXZlbAEFC2R1Y2tBc3NldElkAAAEDG9sZEZyb21TdGF0ZQkBC3ZhbHVlT3JFbHNlAgkAnwgBBQlrZXlIZWFsdGgFBW1heEhQAwkBAiE9AgUMb2xkRnJvbVN0YXRlBQVjdXJIUAkAAgEJAKwCAgkArAICCQCsAgICCm9sZEhlYWx0aD0JAKQDAQUMb2xkRnJvbVN0YXRlAi8gZnJvbSBzdGF0ZSBkb2VzIG5vdCBtYXRjaCBvbmUgZnJvbSBmbGlnaHQgbG9nPQkApAMBBQVjdXJIUAMJAGcCAAAFBWN1ckhQCQACAQIeWW91IGNhbid0IGZseSB3aXRoIHplcm8gaGVhbHRoAwkBASEBCQEXY2FuV2VhckN1cnJlbnRFcXVpcG1lbnQBBQtkdWNrQXNzZXRJZAkAAgECFkVxdWlwbWVudCBpbmNvbXBhdGlibGUEBWJvbnVzAwkAZgIJAJADAQUJZmxpZ2h0TG9nBQdmbEJvbnVzCQCRAwIFCWZsaWdodExvZwUHZmxCb251cwIABAhwcm9kVXNlZAMJAGYCCQCQAwEFCWZsaWdodExvZwULZmxQcm9kc1VzZWQJAJEDAgUJZmxpZ2h0TG9nBQtmbFByb2RzVXNlZAIABApzZW50QW1vdW50AwMJAGYCBQVuZXdIUAAACQAAAgUFYm9udXMCASQHCQEFYXNJbnQBCQD8BwQFDHJlc3RDb250cmFjdAINc2VuZFVzZHRQcml6ZQkAzAgCBQh1c2VyQWRkcgUDbmlsBQNuaWwAAAkAlwoFBQVuZXdIUAULZHVja0Fzc2V0SWQFCnNlbnRBbW91bnQFC25ld0xvY2F0aW9uBQhwcm9kVXNlZAEMYXBwbHlCb251c2VzAgtsYW5kQXNzZXRJZAZwaWVjZXMECmluZnJhTGV2ZWwJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBFmtleUluZnJhTGV2ZWxCeUFzc2V0SWQBBQtsYW5kQXNzZXRJZAAABAlhcnRQaWVjZXMJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBIGtleUxhbmRBcnRTdGF0dXNCeVR5cGVBbmRBc3NldElkAgUKQVJUUFJFU0FMRQULbGFuZEFzc2V0SWQAAAQEYWRkNgkAaQIFCmluZnJhTGV2ZWwABgQEYWRkNwkAaQIFCmluZnJhTGV2ZWwABwkAZAIJAGQCBQ9EQUlMWVJFU0JZUElFQ0UJAGsDBQ9EQUlMWVJFU0JZUElFQ0UJAGQCCQBkAgUKaW5mcmFMZXZlbAUEYWRkNgkAaAIAAgUEYWRkNwAFCQBrAwUPREFJTFlSRVNCWVBJRUNFBQlhcnRQaWVjZXMJAGgCBQZwaWVjZXMABQEUY2hlY2tDbGFpbUNvbmRpdGlvbnMDBGFkZHIJY2xhaW1Nb2RlDWxhbmRBc3NldElkSW4EDSR0MDM0MTUzMzQ2OTIDCQAAAgUJY2xhaW1Nb2RlBQtjbGFpbU1vZGVXaAkAlAoCBQ1sYW5kQXNzZXRJZEluCQELdmFsdWVPckVsc2UCCQCiCAEJARRrZXlTdGFrZWREdWNrQnlPd25lcgEFBGFkZHICAAQLZHVja0Fzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAoggBCQEUa2V5U3Rha2VkRHVja0J5T3duZXIBBQRhZGRyAhxZb3UgZG9uJ3QgaGF2ZSBhIGR1Y2sgc3Rha2VkBAtjdXJMb2NhdGlvbgkBC3ZhbHVlT3JFbHNlAgkAoggBCQEPa2V5RHVja0xvY2F0aW9uAQULZHVja0Fzc2V0SWQFD0RFRkFVTFRMT0NBVElPTgQDbG9jCQC1CQIJAQV2YWx1ZQEFC2N1ckxvY2F0aW9uAgFfAwkBAiE9AgkAkQMCBQNsb2MFCmxvY0lkeFR5cGUCAUwJAAIBCQCsAgIJAKwCAgIWRHVjayBsb2NhdGlvbiB0eXBlIGlzIAkAkQMCBQNsb2MFCmxvY0lkeFR5cGUCESwgYnV0IHNob3VsZCBiZSBMCQCUCgIJAJEDAgUDbG9jBQhsb2NJZHhJZAULZHVja0Fzc2V0SWQEC2xhbmRBc3NldElkCAUNJHQwMzQxNTMzNDY5MgJfMQQGZHVja0lkCAUNJHQwMzQxNTMzNDY5MgJfMgQFYXNzZXQJAQV2YWx1ZQEJAOwHAQkA2QQBBQtsYW5kQXNzZXRJZAQHdGltZUtleQkBFmtleVN0YWtlZFRpbWVCeUFzc2V0SWQBBQtsYW5kQXNzZXRJZAQJc2F2ZWRUaW1lCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ8IAQUHdGltZUtleQkArAICCQCsAgICBUxhbmQgCAUFYXNzZXQEbmFtZQIOIGlzIG5vdCBzdGFrZWQEBW93bmVyCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKIIAQkBFWtleUxhbmRBc3NldElkVG9Pd25lcgEFC2xhbmRBc3NldElkCQCsAgIJAKwCAgIETkZUIAgFBWFzc2V0BG5hbWUCDCBpcyBvcnBoYW5lZAMJAQIhPQIFBW93bmVyBQRhZGRyCQACAQkArAICBQpMQU5EUFJFRklYAg0gaXMgbm90IHlvdXJzBAFkCQC1CQIIBQVhc3NldAtkZXNjcmlwdGlvbgIBXwkAlgoEBQZkdWNrSWQFC2xhbmRBc3NldElkBQFkBQlzYXZlZFRpbWUBEGNsYWltUmVzSW50ZXJuYWwEBGFkZHIGYW1vdW50CWNsYWltTW9kZQ1sYW5kQXNzZXRJZEluAwkAZgIAAAUGYW1vdW50CQACAQIPTmVnYXRpdmUgYW1vdW50BAFjCQEUY2hlY2tDbGFpbUNvbmRpdGlvbnMDBQRhZGRyBQljbGFpbU1vZGUFDWxhbmRBc3NldElkSW4ECGxhbmRTaXplCQCRAwIIBQFjAl8zBQtyZWNMYW5kU2l6ZQQNdGVycmFpbkNvdW50cwkBDWNvdW50VGVycmFpbnMBCQCRAwIIBQFjAl8zBQtyZWNUZXJyYWlucwQJZGVsdGFUaW1lCQBlAgkBCWZpbmFsVGltZQAIBQFjAl80AwkAZgIAAAUJZGVsdGFUaW1lCQACAQkArAICCQCsAgIJAKwCAgImU2F2ZWQgdGltZXN0YW1wIGlzIGluIGZ1dHVyZSwgc2F2ZWQgPSAJAKQDAQgFAWMCXzQCCiwgZmluYWwgPSAJAKQDAQkBCWZpbmFsVGltZQAEBnBpZWNlcwkBD251bVBpZWNlc0J5U2l6ZQEFCGxhbmRTaXplBBZkYWlseVByb2R1Y3Rpb25CeVBpZWNlCQEMYXBwbHlCb251c2VzAggFAWMCXzIFBnBpZWNlcwQIYXZhaWxSZXMJAGsDBQlkZWx0YVRpbWUJAGgCBRZkYWlseVByb2R1Y3Rpb25CeVBpZWNlBQZwaWVjZXMFCURBWU1JTExJUwMJAGYCBQZhbW91bnQFCGF2YWlsUmVzCQACAQkArAICCQCsAgIJAKwCAgIiTm90IGVub3VnaCByZXNvdXJjZXMsIGF2YWlsYWJsZSA9IAkApAMBBQhhdmFpbFJlcwIOLCByZXF1ZXN0ZWQgPSAJAKQDAQUGYW1vdW50BAxuZXdEZWx0YVRpbWUJAGsDCQBlAgUIYXZhaWxSZXMFBmFtb3VudAUJREFZTUlMTElTCQBoAgUWZGFpbHlQcm9kdWN0aW9uQnlQaWVjZQUGcGllY2VzBAxuZXdUaW1lc3RhbXAJAGUCCQEJZmluYWxUaW1lAAUMbmV3RGVsdGFUaW1lBAlsYW5kSW5kZXgJAGkCBQZwaWVjZXMFBVNTSVpFBApyZXNUb0NsYWltCQEJdmlydENsYWltBAUNdGVycmFpbkNvdW50cwkAZQIFCWRlbHRhVGltZQUMbmV3RGVsdGFUaW1lBQlsYW5kSW5kZXgFFmRhaWx5UHJvZHVjdGlvbkJ5UGllY2UEBXdoS2V5CQESa2V5V2FyZWhvdXNlQnlMYW5kAQgFAWMCXzIECmluZnJhTGV2ZWwJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBFmtleUluZnJhTGV2ZWxCeUFzc2V0SWQBCAUBYwJfMgAABAljdXJyZW50V2gJAQxnZXRXYXJlaG91c2UDBQV3aEtleQUJbGFuZEluZGV4BQppbmZyYUxldmVsBARsb2Z0CQC1CQIJAJEDAgUJY3VycmVudFdoBQl3aElkeExPRlQCAV8EC3doU3BhY2VMZWZ0CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUEbG9mdAUHdm9sRnJlZQMDCQAAAgUJY2xhaW1Nb2RlBQtjbGFpbU1vZGVXaAkAZgIFBmFtb3VudAULd2hTcGFjZUxlZnQHCQACAQkArAICCQCsAgICBU9ubHkgCQCkAwEFC3doU3BhY2VMZWZ0Ahggc3BhY2UgbGVmdCBpbiB3YXJlaG91c2UEBWJwS2V5CQERa2V5QmFja3BhY2tCeUR1Y2sBCAUBYwJfMQQLY3VycmVudFBhY2sJAQtnZXRCYWNrcGFjawEFBWJwS2V5BA5jdXJyZW50UGFja1JlcwkAtQkCCQCRAwIFC2N1cnJlbnRQYWNrBQhicElkeFJlcwIBXwQMY3VycmVudFdoUmVzCQC1CQIJAJEDAgUJY3VycmVudFdoBQh3aElkeFJlcwIBXwQNJHQwMzcwNjIzNzkzMwMJAAACBQljbGFpbU1vZGUFC2NsYWltTW9kZVdoCQCWCgQJAQZhZGRSZXMFBQxjdXJyZW50V2hSZXMFDXRlcnJhaW5Db3VudHMJAGUCBQlkZWx0YVRpbWUFDG5ld0RlbHRhVGltZQUJbGFuZEluZGV4BRZkYWlseVByb2R1Y3Rpb25CeVBpZWNlCQCRAwIFC2N1cnJlbnRQYWNrBQhicElkeFJlcwkAZAIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQRsb2Z0BQt2b2xPY2N1cGllZAgFCnJlc1RvQ2xhaW0CXzIJAGUCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUEbG9mdAUHdm9sRnJlZQgFCnJlc1RvQ2xhaW0CXzIDCQAAAgUJY2xhaW1Nb2RlBQ1jbGFpbU1vZGVEdWNrCQCWCgQJAJEDAgUJY3VycmVudFdoBQh3aElkeFJlcwkBBmFkZFJlcwUFDmN1cnJlbnRQYWNrUmVzBQ10ZXJyYWluQ291bnRzCQBlAgUJZGVsdGFUaW1lBQxuZXdEZWx0YVRpbWUFCWxhbmRJbmRleAUWZGFpbHlQcm9kdWN0aW9uQnlQaWVjZQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBGxvZnQFC3ZvbE9jY3VwaWVkCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUEbG9mdAUHdm9sRnJlZQQFZGlzdHIJAQ1kaXN0cmlidXRlUmVzBAUMY3VycmVudFdoUmVzBQ5jdXJyZW50UGFja1JlcwUKcmVzVG9DbGFpbQULd2hTcGFjZUxlZnQEBHdoQW0JAJcDAQkAzAgCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUEbG9mdAUHdm9sRnJlZQkAzAgCCAUKcmVzVG9DbGFpbQJfMgUDbmlsCQCWCgQIBQVkaXN0cgJfMQgFBWRpc3RyAl8yCQBkAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBGxvZnQFC3ZvbE9jY3VwaWVkBQR3aEFtCQBlAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBGxvZnQFB3ZvbEZyZWUFBHdoQW0EBXdoUmVzCAUNJHQwMzcwNjIzNzkzMwJfMQQFYnBSZXMIBQ0kdDAzNzA2MjM3OTMzAl8yBAVsb2Z0TwgFDSR0MDM3MDYyMzc5MzMCXzMEBWxvZnRGCAUNJHQwMzcwNjIzNzkzMwJfNAkAlwoFCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEWa2V5U3Rha2VkVGltZUJ5QXNzZXRJZAEIBQFjAl8yBQxuZXdUaW1lc3RhbXAJAMwIAgkBDEludGVnZXJFbnRyeQIJASJrZXlTdGFrZWRUaW1lQnlUeXBlQXNzZXRJZEFuZE93bmVyAwUKTEFORFBSRUZJWAgFAWMCXzIFBGFkZHIFDG5ld1RpbWVzdGFtcAUDbmlsBQVicEtleQkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQpicElkeExldmVsCQDMCAIFBWJwUmVzCQDMCAIJAJEDAgULY3VycmVudFBhY2sFCGJwSWR4TWF0CQDMCAIJAJEDAgULY3VycmVudFBhY2sFCWJwSWR4UHJvZAUDbmlsBQV3aEtleQkAzAgCCQCRAwIFCWN1cnJlbnRXaAULd2hJZHhMZXZlbHMJAMwIAgUFd2hSZXMJAMwIAgkAkQMCBQljdXJyZW50V2gFCHdoSWR4TWF0CQDMCAIJAJEDAgUJY3VycmVudFdoBQl3aElkeFByb2QJAMwIAgkAuQkCCQDMCAIJAJEDAgUEbG9mdAUJdm9sTG9ja2VkCQDMCAIJAKQDAQUFbG9mdE8JAMwIAgkApAMBBQVsb2Z0RgkAzAgCCQCRAwIFBGxvZnQFCHZvbFRvdGFsBQNuaWwCAV8FA25pbAEIY2xhaW1BbGwEBGFkZHILbGFuZEFzc2V0SWQGcGllY2VzCWNsYWltTW9kZQQHdGltZUtleQkBFmtleVN0YWtlZFRpbWVCeUFzc2V0SWQBBQtsYW5kQXNzZXRJZAQJc2F2ZWRUaW1lCQEFdmFsdWUBCQCfCAEFB3RpbWVLZXkECGF2YWlsUmVzCQBoAgkAawMJAGUCCQEJZmluYWxUaW1lAAUJc2F2ZWRUaW1lCQEMYXBwbHlCb251c2VzAgULbGFuZEFzc2V0SWQFBnBpZWNlcwUJREFZTUlMTElTBQZwaWVjZXMJARBjbGFpbVJlc0ludGVybmFsBAUEYWRkcgUIYXZhaWxSZXMFCWNsYWltTW9kZQULbGFuZEFzc2V0SWQBDXVwSW5mcmFDb21tb24EDHNob3VsZFVzZU1hdAZjYWxsZXINcGF5bWVudEFtb3VudAtsYW5kQXNzZXRJZAQEYWRkcgkApQgBBQZjYWxsZXIEAWMJARRjaGVja0NsYWltQ29uZGl0aW9ucwMFBGFkZHIFE2NsYWltTW9kZVdoVGhlbkR1Y2sFC2xhbmRBc3NldElkBAZwaWVjZXMJAQ9udW1QaWVjZXNCeVNpemUBCQCRAwIIBQFjAl8zBQtyZWNMYW5kU2l6ZQQIaW5mcmFLZXkJARZrZXlJbmZyYUxldmVsQnlBc3NldElkAQgFAWMCXzIECGN1ckxldmVsCQELdmFsdWVPckVsc2UCCQCfCAEFCGluZnJhS2V5AAADAwkBASEBBRhLU19BTExPV19CSUdfSU5GUkFfTUVSR0UJAGcCBQhjdXJMZXZlbAADBwkAAgECJkN1cnJlbnRseSBtYXggaW5mcmFzdHJ1Y3R1cmUgbGV2ZWwgPSAzBAhtYXhJbmZyYQkAZAIJAGkCCQEEc3FydAQFBnBpZWNlcwAAAAAFBERPV04ABQACBAhuZXdMZXZlbAkAZAIFCGN1ckxldmVsAAEDAwUYS1NfQUxMT1dfQklHX0lORlJBX01FUkdFCQBmAgUIbmV3TGV2ZWwFCG1heEluZnJhBwkAAgEJAKwCAgIlQ3VycmVudGx5IG1heCBpbmZyYXN0cnVjdHVyZSBsZXZlbCA9IAkApAMBBQhtYXhJbmZyYQQEY29zdAkAawMFFUluZnJhVXBncmFkZUNvc3RTVXNkdAkAaAIFBnBpZWNlcwUIbmV3TGV2ZWwFBVNTSVpFAwMJAQEhAQUMc2hvdWxkVXNlTWF0CQECIT0CBQ1wYXltZW50QW1vdW50BQRjb3N0BwkAAgEJAKwCAgIbUGF5bWVudCBhdHRhY2hlZCBzaG91bGQgYmUgCQCkAwEFBGNvc3QEBWJwS2V5CQERa2V5QmFja3BhY2tCeUR1Y2sBCAUBYwJfMQQLY3VycmVudFBhY2sJAQtnZXRCYWNrcGFjawEFBWJwS2V5BAVtTGlzdAkAtQkCCQCRAwIFC2N1cnJlbnRQYWNrBQhicElkeE1hdAIBXwQHbWF0VXNlZAkAawMFEUluZnJhVXBncmFkZUNvc3RTCQBoAgUGcGllY2VzBQhuZXdMZXZlbAUFU1NJWkUEBm5ld01hdAkAuQkCCQERc3VidHJhY3RNYXRlcmlhbHMDBQxzaG91bGRVc2VNYXQFBW1MaXN0BQdtYXRVc2VkAgFfBAtjbGFpbVJlc3VsdAkBCGNsYWltQWxsBAUEYWRkcggFAWMCXzIFBnBpZWNlcwUTY2xhaW1Nb2RlV2hUaGVuRHVjawQGd2hEYXRhCAULY2xhaW1SZXN1bHQCXzUEBm9sZFZvbAkBF2dldFdhcmVob3VzZVRvdGFsVm9sdW1lAQkAkQMCBQZ3aERhdGEFC3doSWR4TGV2ZWxzBApuZXdWb2xEYXRhCQC5CQIJAMwIAgkAkQMCCQC1CQIJAJEDAgUGd2hEYXRhBQt3aElkeExldmVscwIBXwAACQDMCAIJAKQDAQUIbmV3TGV2ZWwFA25pbAIBXwQGbmV3Vm9sCQEXZ2V0V2FyZWhvdXNlVG90YWxWb2x1bWUBBQpuZXdWb2xEYXRhBARsb2Z0CQC1CQIJAJEDAgUGd2hEYXRhBQl3aElkeExPRlQCAV8ECm5ld0xvZnRTdHIJALkJAgkAzAgCCQCRAwIFBGxvZnQFCXZvbExvY2tlZAkAzAgCCQCRAwIFBGxvZnQFC3ZvbE9jY3VwaWVkCQDMCAIJAKQDAQkAZQIJAGQCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUEbG9mdAUHdm9sRnJlZQUGbmV3Vm9sBQZvbGRWb2wJAMwIAgkApAMBBQZuZXdWb2wFA25pbAIBXwkAlQoDCQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIFCGluZnJhS2V5BQhuZXdMZXZlbAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBHmtleUluZnJhTGV2ZWxCeUFzc2V0SWRBbmRPd25lcgIIBQFjAl8yBQRhZGRyBQhuZXdMZXZlbAkAzAgCCQELU3RyaW5nRW50cnkCBQVicEtleQkAuQkCCQDMCAIJAJEDAgULY3VycmVudFBhY2sFCmJwSWR4TGV2ZWwJAMwIAgkAkQMCCAULY2xhaW1SZXN1bHQCXzMFCGJwSWR4UmVzCQDMCAIFBm5ld01hdAkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQlicElkeFByb2QFA25pbAIBOgkAzAgCCQELU3RyaW5nRW50cnkCCAULY2xhaW1SZXN1bHQCXzQJALkJAgkAzAgCBQpuZXdWb2xEYXRhCQDMCAIJAJEDAgUGd2hEYXRhBQh3aElkeFJlcwkAzAgCCQCRAwIFBndoRGF0YQUId2hJZHhNYXQJAMwIAgkAkQMCBQZ3aERhdGEFCXdoSWR4UHJvZAkAzAgCBQpuZXdMb2Z0U3RyBQNuaWwCAToFA25pbAgFC2NsYWltUmVzdWx0Al8xBQhuZXdMZXZlbAUHbWF0VXNlZAETdXBkYXRlU3RhdHNJbnRlcm5hbAQGbHZsS2V5BXhwS2V5CXBvaW50c0tleQdkZWx0YVhQBAJ4cAkBC3ZhbHVlT3JFbHNlAgkAnwgBBQV4cEtleQAABAVuZXdYUAkAZAIFAnhwBQdkZWx0YVhQBAlsdmxQb2ludHMJAQdsZXZlbFVwAgkBC3ZhbHVlT3JFbHNlAgkAnwgBBQZsdmxLZXkAAAUFbmV3WFAJAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgUGbHZsS2V5CQCRAwIFCWx2bFBvaW50cwAACQDMCAIJAQxJbnRlZ2VyRW50cnkCBQV4cEtleQUFbmV3WFAJAMwIAgkBDEludGVnZXJFbnRyeQIFCXBvaW50c0tleQkAZAIJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUJcG9pbnRzS2V5AAAJAJEDAgUJbHZsUG9pbnRzAAEFA25pbAUFbmV3WFABF3VwZGF0ZUR1Y2tTdGF0c0ludGVybmFsAgtkdWNrQXNzZXRJZAdkZWx0YVhQBAVhc3NldAkBBXZhbHVlAQkA7AcBCQDZBAEFC2R1Y2tBc3NldElkBARhZGRyCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKIIAQkBEGtleUR1Y2tJZFRvT3duZXIBBQtkdWNrQXNzZXRJZAkArAICCQCsAgICBE5GVCAIBQVhc3NldARuYW1lAgwgaXMgb3JwaGFuZWQDAwMFE0tTX0FMTE9XX1JPQk9fRFVDS1MJAAACCAUFYXNzZXQGaXNzdWVyBQR0aGlzBwkBCGNvbnRhaW5zAggFBWFzc2V0BG5hbWUFC1JPQk9fUFJFRklYBwkBE3VwZGF0ZVN0YXRzSW50ZXJuYWwECQEMa2V5VXNlckxldmVsAQUEYWRkcgkBCWtleVVzZXJYUAEFBGFkZHIJARFrZXlVc2VyRnJlZVBvaW50cwEFBGFkZHIFB2RlbHRhWFAJARN1cGRhdGVTdGF0c0ludGVybmFsBAkBDGtleUR1Y2tMZXZlbAEFC2R1Y2tBc3NldElkCQEJa2V5RHVja1hQAQULZHVja0Fzc2V0SWQJARFrZXlEdWNrRnJlZVBvaW50cwEFC2R1Y2tBc3NldElkBQdkZWx0YVhQARZ1cGRhdGVBY2NTdGF0c0ludGVybmFsAgRhZGRyB2RlbHRhWFAJARN1cGRhdGVTdGF0c0ludGVybmFsBAkBDGtleVVzZXJMZXZlbAEFBGFkZHIJAQlrZXlVc2VyWFABBQRhZGRyCQERa2V5VXNlckZyZWVQb2ludHMBBQRhZGRyBQdkZWx0YVhQARJhY3RpdmF0ZU9uYm9hcmRBcnQBBGFkZHIEC2R1Y2tBc3NldElkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKIIAQkBFGtleVN0YWtlZER1Y2tCeU93bmVyAQUEYWRkcgIcWW91IGRvbid0IGhhdmUgYSBkdWNrIHN0YWtlZAQIcmVmQnlLZXkJAQ9rZXlBZGRyZXNzUmVmQnkBBQRhZGRyBAVyZWZCeQkAoggBBQhyZWZCeUtleQMJAQEhAQkBCWlzRGVmaW5lZAEFBXJlZkJ5CQACAQIpWW91IGFyZSBub3QgZWxpZ2libGUgZm9yIE9OQk9BUkQgYXJ0aWZhY3QEBmFydEtleQkBHGtleU9uYm9hcmRBcnREdWNrQWN0aXZhdGVkQnkBBQRhZGRyBAdhcnREdWNrCQCiCAEFBmFydEtleQMJAQlpc0RlZmluZWQBBQdhcnREdWNrCQACAQkArAICAi9Zb3UgYWxyZWFkeSB1c2VkIHlvdXIgT05CT0FSRCBhcnRpZmFjdCBvbiBkdWNrIAkBBXZhbHVlAQUHYXJ0RHVjawQQZHVja0FjdGl2YXRvcktleQkBHGtleU9uYm9hcmRBcnRBY3RpdmF0ZWRPbkR1Y2sBBQtkdWNrQXNzZXRJZAQNZHVja0FjdGl2YXRvcgkAoggBBRBkdWNrQWN0aXZhdG9yS2V5AwkBCWlzRGVmaW5lZAEFDWR1Y2tBY3RpdmF0b3IJAAIBCQCsAgIJAKwCAgkArAICAglUaGUgZHVjayAFC2R1Y2tBc3NldElkAjQgYWxyZWFkeSBnb3QgcG9pbnRzIGZyb20gT05CT0FSRCBhcnRpZmFjdCBmcm9tIHVzZXIgCQEFdmFsdWUBBQ1kdWNrQWN0aXZhdG9yCQDOCAIJAMwIAgkBC1N0cmluZ0VudHJ5AgUGYXJ0S2V5BQtkdWNrQXNzZXRJZAkAzAgCCQELU3RyaW5nRW50cnkCBRBkdWNrQWN0aXZhdG9yS2V5BQRhZGRyBQNuaWwICQEXdXBkYXRlRHVja1N0YXRzSW50ZXJuYWwCBQtkdWNrQXNzZXRJZAUJeHBPbmJvYXJkAl8xARJhY3RpdmF0ZVByZXNhbGVBcnQCBGFkZHINbGFuZEFzc2V0SWRJbgQBYwkBFGNoZWNrQ2xhaW1Db25kaXRpb25zAwUEYWRkcgUTY2xhaW1Nb2RlV2hUaGVuRHVjawUNbGFuZEFzc2V0SWRJbgQLbGFuZEFzc2V0SWQIBQFjAl8yBAZwaWVjZXMJAQ9udW1QaWVjZXNCeVNpemUBCQCRAwIIBQFjAl8zBQtyZWNMYW5kU2l6ZQQNYWN0aXZhdGlvbktleQkBIGtleUxhbmRBcnRTdGF0dXNCeVR5cGVBbmRBc3NldElkAgUKQVJUUFJFU0FMRQULbGFuZEFzc2V0SWQDCQBmAgkBC3ZhbHVlT3JFbHNlAgkAnwgBBQ1hY3RpdmF0aW9uS2V5AAAAAAkAAgECJVByZXNhbGUgYXJ0aWZhY3QgaXMgYWxyZWFkeSBhY3RpdmF0ZWQDCQBmAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIIBQFjAl8zBQpyZWNMYW5kTnVtBQ9QUkVTQUxFTlVNTEFORFMJAAIBCQCsAgIJAKwCAgkArAICBQpMQU5EUFJFRklYAgEgBQtsYW5kQXNzZXRJZAIlIGlzIG5vdCBlbGlnaWJsZSBmb3IgcHJlc2FsZSBhcnRpZmFjdAQLY2xhaW1SZXN1bHQJAQhjbGFpbUFsbAQFBGFkZHIFC2xhbmRBc3NldElkBQZwaWVjZXMFE2NsYWltTW9kZVdoVGhlbkR1Y2sJAM0IAgkAzQgCCQDNCAIIBQtjbGFpbVJlc3VsdAJfMQkBDEludGVnZXJFbnRyeQIFDWFjdGl2YXRpb25LZXkFBnBpZWNlcwkBC1N0cmluZ0VudHJ5AggFC2NsYWltUmVzdWx0Al8yCQC5CQIIBQtjbGFpbVJlc3VsdAJfMwIBOgkBC1N0cmluZ0VudHJ5AggFC2NsYWltUmVzdWx0Al80CQC5CQIIBQtjbGFpbVJlc3VsdAJfNQIBOgEPY2hlY2tUb3VybmFtZW50AQtkdWNrQXNzZXRJZAQGbGFzdElkCQELdmFsdWVPckVsc2UCCQCaCAIFEnRvdXJuYW1lbnRDb250cmFjdAUNbGFzdFRvdXJJZEtleQAABAtjdXJMb2NhdGlvbgkAtQkCCQELdmFsdWVPckVsc2UCCQCiCAEJAQ9rZXlEdWNrTG9jYXRpb24BBQtkdWNrQXNzZXRJZAUPREVGQVVMVExPQ0FUSU9OAgFfBANub3cIBQlsYXN0QmxvY2sJdGltZXN0YW1wBAV0RGF0YQkBC2dldFRvdXJEYXRhAgUSdG91cm5hbWVudENvbnRyYWN0BQZsYXN0SWQEBnN0YXRpYwkAkQMCBQV0RGF0YQUJaWR4U3RhdGljBAdkeW5hbWljCQCRAwIFBXREYXRhBQppZHhEeW5hbWljAwkBAiE9AgkAkQMCBQtjdXJMb2NhdGlvbgUKbG9jSWR4VHlwZQIBVAcDAwMJAAACCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgULY3VyTG9jYXRpb24FD2xvY0lkeENvbnRpbmVudAUGbGFzdElkCQAAAgkAkQMCBQdkeW5hbWljBQ50RHluYW1pY1N0YXR1cwIKSU5QUk9HUkVTUwcJAGYCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUGc3RhdGljBQp0U3RhdGljRW5kBQNub3cHCQACAQIqWW91ciBkdWNrIGlzIHRha2luZyBwYXJ0IGluIHRoZSB0b3VybmFtZW50CQEJYXNCb29sZWFuAQkA/AcEBQR0aGlzAhZleGl0VG91cm5hbWVudEludGVybmFsCQDMCAIFC2R1Y2tBc3NldElkBQNuaWwFA25pbAENbWVyZ2VJbnRlcm5hbAYLbmV3TGFuZFNpemUIbmV3TGV2ZWwHZm9ybXVsYQRhZGRyDGxhbmRBc3NldElkcwduZWVkTWF0BAtkdWNrQXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCiCAEJARRrZXlTdGFrZWREdWNrQnlPd25lcgEFBGFkZHICHFlvdSBkb24ndCBoYXZlIGEgZHVjayBzdGFrZWQDCQEPY2hlY2tUb3VybmFtZW50AQULZHVja0Fzc2V0SWQJAAIBAh1tZXJnZUludGVybmFsX2NoZWNrVG91cm5hbWVudAoBCmNoZWNrTWVyZ2UCA2FjYwtsYW5kQXNzZXRJZAQFYXNzZXQJAQV2YWx1ZQEJAOwHAQkA2QQBBQtsYW5kQXNzZXRJZAQHdGltZUtleQkBFmtleVN0YWtlZFRpbWVCeUFzc2V0SWQBBQtsYW5kQXNzZXRJZAQJc2F2ZWRUaW1lCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ8IAQUHdGltZUtleQkArAICCQCsAgICBE5GVCAIBQVhc3NldARuYW1lAg4gaXMgbm90IHN0YWtlZAQFb3duZXIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAoggBCQEVa2V5TGFuZEFzc2V0SWRUb093bmVyAQULbGFuZEFzc2V0SWQJAKwCAgkArAICAgRORlQgCAUFYXNzZXQEbmFtZQIMIGlzIG9ycGhhbmVkAwkBAiE9AgUFb3duZXIFBGFkZHIJAAIBCQCsAgIFCkxBTkRQUkVGSVgCDSBpcyBub3QgeW91cnMEAWQJALUJAggFBWFzc2V0C2Rlc2NyaXB0aW9uAgFfBAljb250aW5lbnQJAJEDAgUBZAUMcmVjQ29udGluZW50AwMJAQIhPQIIBQNhY2MCXzMCAAkBAiE9AggFA2FjYwJfMwUJY29udGluZW50BwkAAgECLkxhbmRzIHNob3VsZCBiZSBvbiB0aGUgc2FtZSBjb250aW5lbnQgdG8gbWVyZ2UECGxhbmRTaXplCQCRAwIFAWQFC3JlY0xhbmRTaXplBAdzaXplc0luCAUDYWNjAl8xBAFpCQETdmFsdWVPckVycm9yTWVzc2FnZQIJALMJAgUHc2l6ZXNJbgUIbGFuZFNpemUCJ1lvdSBoYXZlbid0IHBhc3NlZCBhbGwgdGhlIGxhbmRzIG5lZWRlZAQIc2l6ZXNPdXQJAKwCAgkArwICBQdzaXplc0luBQFpCQCwAgIFB3NpemVzSW4JAGQCBQFpAAEEBnBpZWNlcwkBD251bVBpZWNlc0J5U2l6ZQEFCGxhbmRTaXplBARhcnRzCQBkAggFA2FjYwJfMgkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEga2V5TGFuZEFydFN0YXR1c0J5VHlwZUFuZEFzc2V0SWQCBQpBUlRQUkVTQUxFBQtsYW5kQXNzZXRJZAAABAppbmZyYUxldmVsCQELdmFsdWVPckVsc2UCCQCfCAEJARZrZXlJbmZyYUxldmVsQnlBc3NldElkAQULbGFuZEFzc2V0SWQAAAQIcmVxTGV2ZWwEByRtYXRjaDAFCGxhbmRTaXplAwkAAAICAVMFByRtYXRjaDAAAwMJAAACAgFNBQckbWF0Y2gwAAQDCQAAAgIBTAUHJG1hdGNoMAAFAwkAAAICAlhMBQckbWF0Y2gwAAYJAAIBAhpPbmx5IFMsIE0sIEwsIFhMIGNhbiBtZXJnZQMJAQIhPQIFCmluZnJhTGV2ZWwFCHJlcUxldmVsCQACAQIiQWxsIGxhbmRzIHNob3VsZCBiZSBtYXhlZCB0byBtZXJnZQQHbGFuZE51bQkAkQMCBQFkBQpyZWNMYW5kTnVtBA10ZXJyYWluQ291bnRzCQENY291bnRUZXJyYWlucwEJAJEDAgUBZAULcmVjVGVycmFpbnMECWRlbHRhVGltZQkAZQIIBQlsYXN0QmxvY2sJdGltZXN0YW1wBQlzYXZlZFRpbWUDCQBmAgAABQlkZWx0YVRpbWUJAAIBCQCsAgIJAKwCAgkArAICAiZTYXZlZCB0aW1lc3RhbXAgaXMgaW4gZnV0dXJlLCBzYXZlZCA9IAkApAMBBQlzYXZlZFRpbWUCDCwgY3VycmVudCA9IAkApAMBCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAQWZGFpbHlQcm9kdWN0aW9uQnlQaWVjZQkBDGFwcGx5Qm9udXNlcwIFC2xhbmRBc3NldElkBQZwaWVjZXMECWxhbmRJbmRleAkAaQIFBnBpZWNlcwUFU1NJWkUEBWJwUmVzCQEGYWRkUmVzBQkAtQkCCAUDYWNjAl80AgFfBQ10ZXJyYWluQ291bnRzBQlkZWx0YVRpbWUFCWxhbmRJbmRleAUWZGFpbHlQcm9kdWN0aW9uQnlQaWVjZQQFcHJvcHMJARl1cGRhdGVQcm9wb3J0aW9uc0ludGVybmFsBAgFA2FjYwJfNgUNdGVycmFpbkNvdW50cwUJbGFuZEluZGV4AP///////////wEEBmNQcm9wcwkBGXVwZGF0ZVByb3BvcnRpb25zSW50ZXJuYWwECAUDYWNjA18xMAUNdGVycmFpbkNvdW50cwUJbGFuZEluZGV4AP///////////wEEC3N1bVRlcnJhaW5zCQEZdXBkYXRlUHJvcG9ydGlvbnNJbnRlcm5hbAQIBQNhY2MCXzkFDXRlcnJhaW5Db3VudHMFCWxhbmRJbmRleAABBAVsYW5kcwgFA2FjYwJfNwQDaWR4CQDPCAIFBWxhbmRzBQtsYW5kQXNzZXRJZAMJAQEhAQkBCWlzRGVmaW5lZAEFA2lkeAkAAgEJAKwCAgIgWW91ciBzdGFrZWQgbGFuZHMgZG9uJ3QgY29udGFpbiAFC2xhbmRBc3NldElkBAljdXN0b21LZXkJARprZXlMYW5kQXNzZXRJZFRvQ3VzdG9tTmFtZQEFC2xhbmRBc3NldElkBApjdXN0b21OYW1lCQELdmFsdWVPckVsc2UCCQCiCAEFCWN1c3RvbUtleQIACQCcCgoFCHNpemVzT3V0BQRhcnRzBQljb250aW5lbnQFBWJwUmVzCQDOCAIJAM0IAgkAzQgCCQDNCAIJAM0IAgkAzQgCCQDNCAIJAM0IAgkAzQgCCQDNCAIJAM0IAgkAzQgCCAUDYWNjAl81CQELRGVsZXRlRW50cnkBCQEWa2V5U3Rha2VkVGltZUJ5QXNzZXRJZAEFC2xhbmRBc3NldElkCQELRGVsZXRlRW50cnkBCQEia2V5U3Rha2VkVGltZUJ5VHlwZUFzc2V0SWRBbmRPd25lcgMFCkxBTkRQUkVGSVgFC2xhbmRBc3NldElkBQRhZGRyCQELRGVsZXRlRW50cnkBCQEQa2V5TGFuZFRvQXNzZXRJZAEFB2xhbmROdW0JAQtEZWxldGVFbnRyeQEJARVrZXlMYW5kQXNzZXRJZFRvT3duZXIBBQtsYW5kQXNzZXRJZAkBC0RlbGV0ZUVudHJ5AQkBFmtleUluZnJhTGV2ZWxCeUFzc2V0SWQBBQtsYW5kQXNzZXRJZAkBC0RlbGV0ZUVudHJ5AQkBHmtleUluZnJhTGV2ZWxCeUFzc2V0SWRBbmRPd25lcgIFC2xhbmRBc3NldElkBQRhZGRyCQELRGVsZXRlRW50cnkBCQEga2V5TGFuZEFydFN0YXR1c0J5VHlwZUFuZEFzc2V0SWQCBQpBUlRQUkVTQUxFBQtsYW5kQXNzZXRJZAkBC0RlbGV0ZUVudHJ5AQkBEWtleUxhbmROdW1Ub093bmVyAQUHbGFuZE51bQkBC0RlbGV0ZUVudHJ5AQkBEmtleVdhcmVob3VzZUJ5TGFuZAEFC2xhbmRBc3NldElkCQELRGVsZXRlRW50cnkBBQljdXN0b21LZXkJAQRCdXJuAgkA2QQBBQtsYW5kQXNzZXRJZAABAwkBAiE9AgUKY3VzdG9tTmFtZQIACQDMCAIJAQtEZWxldGVFbnRyeQEJARprZXlMYW5kQ3VzdG9tTmFtZVRvQXNzZXRJZAEFCmN1c3RvbU5hbWUFA25pbAUDbmlsBQVwcm9wcwkA0QgCBQVsYW5kcwkBBXZhbHVlAQUDaWR4CQBkAggFA2FjYwJfOAUGcGllY2VzBQtzdW1UZXJyYWlucwUGY1Byb3BzBAVicEtleQkBEWtleUJhY2twYWNrQnlEdWNrAQULZHVja0Fzc2V0SWQEC2N1cnJlbnRQYWNrCQELZ2V0QmFja3BhY2sBBQVicEtleQQIcHJvcExpc3QJALUJAgkBC3ZhbHVlT3JFbHNlAgkAoggBCQERa2V5UmVzUHJvcG9ydGlvbnMAAgswXzBfMF8wXzBfMAIBXwQIbGFuZHNLZXkJARVrZXlTdGFrZWRMYW5kc0J5T3duZXIBBQRhZGRyBAhsYW5kc1N0cgkAoggBBQhsYW5kc0tleQQHbGFuZHNJbgMJAQlpc0RlZmluZWQBBQhsYW5kc1N0cgkAvQkCCQEFdmFsdWUBBQhsYW5kc1N0cgIBXwUDbmlsBAVjb250MAkAkQMCCQC1CQIICQEFdmFsdWUBCQDsBwEJANkEAQkAkQMCBQxsYW5kQXNzZXRJZHMAAAtkZXNjcmlwdGlvbgIBXwUMcmVjQ29udGluZW50BAljb250UHJvcHMJALUJAgkBC3ZhbHVlT3JFbHNlAgkAoggBCQEWa2V5UmVzVHlwZXNCeUNvbnRpbmVudAEFBWNvbnQwAgswXzBfMF8wXzBfMAIBXwQBcgoAAiRsBQxsYW5kQXNzZXRJZHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCcCgoFB2Zvcm11bGEAAAIACQCRAwIFC2N1cnJlbnRQYWNrBQhicElkeFJlcwUDbmlsBQhwcm9wTGlzdAUHbGFuZHNJbgAACQC1CQICCzBfMF8wXzBfMF8wAgFfBQljb250UHJvcHMKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCmNoZWNrTWVyZ2UCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDUJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFBAljb250aW5lbnQIBQFyAl8zBAxjb250aW5lbnRJZHgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAzwgCBQpjb250aW5lbnRzBQljb250aW5lbnQJAKwCAgITVW5rbm93biBjb250aW5lbnQ6IAUJY29udGluZW50BAh0ZXJyYWlucwkBE2dlblRlcnJhaW5zRm9yTWVyZ2UCCAUBcgJfOQkAaQIJAQ9udW1QaWVjZXNCeVNpemUBBQtuZXdMYW5kU2l6ZQUFU1NJWkUEB2ZyZWVOdW0JAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBEmtleU5leHRGcmVlTGFuZE51bQAJAGQCBQ9QUkVTQUxFTlVNTEFORFMAAQQKbmV3TGFuZE51bQkApAMBBQdmcmVlTnVtBAVpc3N1ZQkAwggFCQEHbmZ0TmFtZQIFCm5ld0xhbmROdW0FC25ld0xhbmRTaXplCQC5CQIJAMwIAgUKbmV3TGFuZE51bQkAzAgCBQtuZXdMYW5kU2l6ZQkAzAgCBQh0ZXJyYWlucwkAzAgCBQljb250aW5lbnQFA25pbAIBXwABAAAHBAdhc3NldElkCQC4CAEFBWlzc3VlBA5uZXdMYW5kQXNzZXRJZAkA2AQBBQdhc3NldElkBAZuZXdNYXQJALkJAgkBEXN1YnRyYWN0TWF0ZXJpYWxzAwkAZgIFB25lZWRNYXQAAAkAtQkCCQCRAwIFC2N1cnJlbnRQYWNrBQhicElkeE1hdAIBXwUHbmVlZE1hdAIBXwQJcGllY2VzS2V5CQEWa2V5U3Rha2VkUGllY2VzQnlPd25lcgEFBGFkZHIEDHN0YWtlZFBpZWNlcwkBC3ZhbHVlT3JFbHNlAgkAnwgBBQlwaWVjZXNLZXkAAAkAlAoCCQDNCAIJAM0IAgkAzQgCCQDNCAIJAM0IAgkAzQgCCQDNCAIJAM0IAgkAzQgCCQDNCAIJAM0IAgkAzQgCCQDNCAIJAM0IAgkAzQgCCAUBcgJfNQMJAGYCCQCQAwEIBQFyAl83AAAJAQtTdHJpbmdFbnRyeQIFCGxhbmRzS2V5CQC7CQIIBQFyAl83AgFfCQELRGVsZXRlRW50cnkBBQhsYW5kc0tleQkBDEludGVnZXJFbnRyeQIFCXBpZWNlc0tleQMJAGYCCAUBcgJfOAUMc3Rha2VkUGllY2VzAAAJAGUCBQxzdGFrZWRQaWVjZXMIBQFyAl84CQEMSW50ZWdlckVudHJ5AgkBEmtleU5leHRGcmVlTGFuZE51bQAJAGQCBQdmcmVlTnVtAAEFBWlzc3VlCQELU3RyaW5nRW50cnkCCQEQa2V5TGFuZFRvQXNzZXRJZAEFCm5ld0xhbmROdW0FDm5ld0xhbmRBc3NldElkCQELU3RyaW5nRW50cnkCCQEVa2V5TGFuZEFzc2V0SWRUb093bmVyAQUObmV3TGFuZEFzc2V0SWQFBGFkZHIJAQtTdHJpbmdFbnRyeQIJARFrZXlMYW5kTnVtVG9Pd25lcgEFCm5ld0xhbmROdW0FBGFkZHIJAQxJbnRlZ2VyRW50cnkCCQEga2V5TGFuZEFydFN0YXR1c0J5VHlwZUFuZEFzc2V0SWQCBQpBUlRQUkVTQUxFBQ5uZXdMYW5kQXNzZXRJZAgFAXICXzIJAQxJbnRlZ2VyRW50cnkCCQEWa2V5SW5mcmFMZXZlbEJ5QXNzZXRJZAEFDm5ld0xhbmRBc3NldElkBQhuZXdMZXZlbAkBDEludGVnZXJFbnRyeQIJAR5rZXlJbmZyYUxldmVsQnlBc3NldElkQW5kT3duZXICBQ5uZXdMYW5kQXNzZXRJZAUEYWRkcgUIbmV3TGV2ZWwJAQtTdHJpbmdFbnRyeQIFBWJwS2V5CQC5CQIJAMwIAgkAkQMCBQtjdXJyZW50UGFjawUKYnBJZHhMZXZlbAkAzAgCCAUBcgJfNAkAzAgCBQZuZXdNYXQJAMwIAgkAkQMCBQtjdXJyZW50UGFjawUJYnBJZHhQcm9kBQNuaWwCAToJAQtTdHJpbmdFbnRyeQIJARFrZXlSZXNQcm9wb3J0aW9ucwAJALkJAggFAXICXzYCAV8JAQtTdHJpbmdFbnRyeQIJARZrZXlSZXNUeXBlc0J5Q29udGluZW50AQUJY29udGluZW50CQC5CQIIBQFyA18xMAIBXwkBC1N0cmluZ0VudHJ5AgkBD2tleUR1Y2tMb2NhdGlvbgEFC2R1Y2tBc3NldElkCQC5CQIJAMwIAgUJY29udGluZW50CQDMCAICAUwJAMwIAgUObmV3TGFuZEFzc2V0SWQFA25pbAIBXwkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQUEYWRkcgABBQdhc3NldElkBQ5uZXdMYW5kQXNzZXRJZAEDczJtAgRhZGRyDGxhbmRBc3NldElkcwkBDW1lcmdlSW50ZXJuYWwGAgFNAAMCBFNTU1MFBGFkZHIFDGxhbmRBc3NldElkcwAAAQNtMmwCBGFkZHIMbGFuZEFzc2V0SWRzCQENbWVyZ2VJbnRlcm5hbAYCAUwABAIDU01NBQRhZGRyBQxsYW5kQXNzZXRJZHMJAGgCBRFJbmZyYVVwZ3JhZGVDb3N0UwAEAQRsMnhsAgRhZGRyDGxhbmRBc3NldElkcwkBDW1lcmdlSW50ZXJuYWwGAgJYTAAFAgVTU1NNTAUEYWRkcgUMbGFuZEFzc2V0SWRzCQBoAgURSW5mcmFVcGdyYWRlQ29zdFMALwEGeGwyeHhsAgRhZGRyDGxhbmRBc3NldElkcwkBDW1lcmdlSW50ZXJuYWwGAgNYWEwABgIDTFhMBQRhZGRyBQxsYW5kQXNzZXRJZHMJAGgCBRFJbmZyYVVwZ3JhZGVDb3N0UwA2AQttZXJnZUNvbW1vbgIEYWRkcgxsYW5kQXNzZXRJZHMEByRtYXRjaDAJAJADAQUMbGFuZEFzc2V0SWRzAwkAAAIABAUHJG1hdGNoMAkBA3MybQIFBGFkZHIFDGxhbmRBc3NldElkcwMJAAACAAMFByRtYXRjaDAJAQNtMmwCBQRhZGRyBQxsYW5kQXNzZXRJZHMDCQAAAgAFBQckbWF0Y2gwCQEEbDJ4bAIFBGFkZHIFDGxhbmRBc3NldElkcwMJAAACAAIFByRtYXRjaDAJAQZ4bDJ4eGwCBQRhZGRyBQxsYW5kQXNzZXRJZHMJAAIBAg1Vbmtub3duIG1lcmdlAQZwcm9sb2cBAWkDAwkBAiE9AggFAWkMb3JpZ2luQ2FsbGVyBQxyZXN0Q29udHJhY3QJAQt2YWx1ZU9yRWxzZQIJAKAIAQkBCmtleUJsb2NrZWQABwcJAAIBAh9Db250cmFjdHMgYXJlIHVuZGVyIG1haW50ZW5hbmNlCQDMCAIJAQtTdHJpbmdFbnRyeQIJARFrZXlMYXN0VHhJZEJ5VXNlcgEJAKUIAQgFAWkMb3JpZ2luQ2FsbGVyCQDYBAEIBQFpDXRyYW5zYWN0aW9uSWQFA25pbAETdW5zdGFrZUxhbmRJbnRlcm5hbAIEYWRkcgtsYW5kQXNzZXRJZAQFd2hLZXkJARJrZXlXYXJlaG91c2VCeUxhbmQBBQtsYW5kQXNzZXRJZAQIbGFuZEluZm8JALUJAggJAQV2YWx1ZQEJAOwHAQkA2QQBBQtsYW5kQXNzZXRJZAtkZXNjcmlwdGlvbgIBXwQIbGFuZFNpemUJAJEDAgUIbGFuZEluZm8FC3JlY0xhbmRTaXplBAZwaWVjZXMJAQ9udW1QaWVjZXNCeVNpemUBBQhsYW5kU2l6ZQQKaW5mcmFMZXZlbAkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEWa2V5SW5mcmFMZXZlbEJ5QXNzZXRJZAEFC2xhbmRBc3NldElkAAAECWxhbmRJbmRleAkAaQIFBnBpZWNlcwUFU1NJWkUEDXRlcnJhaW5Db3VudHMJAQ1jb3VudFRlcnJhaW5zAQkAkQMCBQhsYW5kSW5mbwULcmVjVGVycmFpbnMECWN1cnJlbnRXaAkBDGdldFdhcmVob3VzZQMFBXdoS2V5BQlsYW5kSW5kZXgFCmluZnJhTGV2ZWwEDGN1cnJlbnRXaFJlcwkAtQkCCQCRAwIFCWN1cnJlbnRXaAUId2hJZHhSZXMCAV8EB3RpbWVLZXkJARZrZXlTdGFrZWRUaW1lQnlBc3NldElkAQULbGFuZEFzc2V0SWQECXNhdmVkVGltZQkBEUBleHRyTmF0aXZlKDEwNTUpAQUHdGltZUtleQQJZGVsdGFUaW1lCQBlAgkBCWZpbmFsVGltZQAFCXNhdmVkVGltZQMJAGYCAAAFCWRlbHRhVGltZQkAAgEJAKwCAgkArAICCQCsAgICJlNhdmVkIHRpbWVzdGFtcCBpcyBpbiBmdXR1cmUsIHNhdmVkID0gCQCkAwEFCXNhdmVkVGltZQIKLCBmaW5hbCA9IAkApAMBCQEJZmluYWxUaW1lAAQWZGFpbHlQcm9kdWN0aW9uQnlQaWVjZQkBDGFwcGx5Qm9udXNlcwIFC2xhbmRBc3NldElkBQZwaWVjZXMEDXJlc0FmdGVyQ2xhaW0JAQ92aXJ0Q2xhaW1BZGRSZXMFBQxjdXJyZW50V2hSZXMFDXRlcnJhaW5Db3VudHMFCWRlbHRhVGltZQUJbGFuZEluZGV4BRZkYWlseVByb2R1Y3Rpb25CeVBpZWNlBAlhcnRQaWVjZXMJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBIGtleUxhbmRBcnRTdGF0dXNCeVR5cGVBbmRBc3NldElkAgUKQVJUUFJFU0FMRQULbGFuZEFzc2V0SWQAAAQPYWNyZXNGcm9tUGllY2VzCQBkAgkAaAIFBnBpZWNlcwUFTVVMVDgJAGkCCQBoAgkAZAIJAGgCBQZwaWVjZXMFCmluZnJhTGV2ZWwFCWFydFBpZWNlcwUFTVVMVDgABQQMYWNyZXNGcm9tUmVzCQBoAgkAawMIBQ1yZXNBZnRlckNsYWltAl8yBRBSRVNPVVJDRVBSSUNFTUlOBQVNVUxUOAUVVVNEVDJBQ1JFU19NVUxUSVBMSUVSCgEGc3VtTWF0AgNhY2MEaXRlbQkAZAIFA2FjYwkBDXBhcnNlSW50VmFsdWUBBQRpdGVtBAV3aE1hdAoAAiRsCQC1CQIJAJEDAgUJY3VycmVudFdoBQh3aElkeE1hdAIBXwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEGc3VtTWF0AgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA2CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGBAxhY3Jlc0Zyb21NYXQJAGgCCQBrAwUFd2hNYXQJAGgCAAIFEFJFU09VUkNFUFJJQ0VNSU4FBU1VTFQ4BRVVU0RUMkFDUkVTX01VTFRJUExJRVIEBXByb2RzAwkAAAIJAJEDAgUJY3VycmVudFdoBQl3aElkeFByb2QCAAUDbmlsCQC8CQIJAJEDAgUJY3VycmVudFdoBQl3aElkeFByb2QCAV8KAQdzdW1Qcm9kAgNhY2MEaXRlbQQBaggFA2FjYwJfMgQLcmVjaXBlQ29lZmYJAQ1wYXJzZUludFZhbHVlAQkAkQMCCQC1CQIJAJEDAgUQcHJvZHVjdGlvbk1hdHJpeAUBagIBXwUJcklkeENvZWZmCQCUCgIJAGQCCAUDYWNjAl8xCQBoAgkAaAIJAQ1wYXJzZUludFZhbHVlAQUEaXRlbQULcmVjaXBlQ29lZmYFBU1VTFQ2CQBkAgUBagABBAZ3aFByb2QKAAIkbAUFcHJvZHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIAAAAACgEFJGYxXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQdzdW1Qcm9kAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYxXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAyNAkBBSRmMV8yAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQAFQAWABcAGAQNYWNyZXNGcm9tUHJvZAkAaAIJAGsDCAUGd2hQcm9kAl8xCQBoAgACBRBSRVNPVVJDRVBSSUNFTUlOBQVNVUxUOAUVVVNEVDJBQ1JFU19NVUxUSVBMSUVSCQCWCgQFD2FjcmVzRnJvbVBpZWNlcwUMYWNyZXNGcm9tUmVzBQxhY3Jlc0Zyb21NYXQFDWFjcmVzRnJvbVByb2QBE3Vuc3Rha2VEdWNrSW50ZXJuYWwCBGFkZHILZHVja0Fzc2V0SWQEBWVxS2V5CQEQa2V5RHVja0VxdWlwbWVudAEFC2R1Y2tBc3NldElkBAtjdXJyZW50U2VncwkAtQkCCQELdmFsdWVPckVsc2UCCQCiCAEFBWVxS2V5AhcsOyxfLDssXyw7LF8sOyxfLDssXyw7LAIBXwQFYnBLZXkJARFrZXlCYWNrcGFja0J5RHVjawEFC2R1Y2tBc3NldElkBAtjdXJyZW50UGFjawkBC2dldEJhY2twYWNrAQUFYnBLZXkECXRlbXBQcm9kQgkBBmRyZXNzQgQFC2N1cnJlbnRTZWdzCQEOcHJvZFN0clRvQnl0ZXMBCQCRAwIFC2N1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Z2VyAgNrZXkGYW1vdW50AwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIgc2F2ZUludGVnZXIgaXMgbm90IHB1YmxpYyBtZXRob2QJAMwIAgkBDEludGVnZXJFbnRyeQIFA2tleQUGYW1vdW50BQNuaWwBaQEKc2V0QmxvY2tlZAEJaXNCbG9ja2VkAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIRcGVybWlzc2lvbiBkZW5pZWQJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAQprZXlCbG9ja2VkAAUJaXNCbG9ja2VkBQNuaWwBaQEJc3Rha2VMYW5kAAQNcHJvbG9nQWN0aW9ucwkBBnByb2xvZwEFAWkDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEJAAIBAhxFeGFjdGx5IG9uZSBwYXltZW50IHJlcXVpcmVkBANwbXQJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAQHYXNzZXRJZAkBBXZhbHVlAQgFA3BtdAdhc3NldElkBAdhZGRyZXNzCQClCAEIBQFpBmNhbGxlcgMJAQIhPQIIBQNwbXQGYW1vdW50AAEJAAIBCQCsAgIJAKwCAgIETkZUIAUKTEFORFBSRUZJWAIkIHRva2VuIHNob3VsZCBiZSBhdHRhY2hlZCBhcyBwYXltZW50BAVhc3NldAkBBXZhbHVlAQkA7AcBBQdhc3NldElkAwkBAiE9AggFBWFzc2V0Bmlzc3VlcgUEdGhpcwkAAgECF1Vua25vd24gaXNzdWVyIG9mIHRva2VuAwkBASEBCQEIY29udGFpbnMCCAUFYXNzZXQEbmFtZQUKTEFORFBSRUZJWAkAAgEJAKwCAgkArAICAglPbmx5IE5GVCAFCkxBTkRQUkVGSVgCFCB0b2tlbnMgYXJlIGFjY2VwdGVkBAtsYW5kTnVtU2l6ZQkAsAICCAUFYXNzZXQEbmFtZQAEBAdsYW5kTnVtAwkBCGNvbnRhaW5zAgULbGFuZE51bVNpemUCA1hYTAkAswICBQtsYW5kTnVtU2l6ZQADAwkBCGNvbnRhaW5zAgULbGFuZE51bVNpemUCAlhMCQCzAgIFC2xhbmROdW1TaXplAAIJALMCAgULbGFuZE51bVNpemUAAQMJAQEhAQkBCWlzRGVmaW5lZAEJALYJAQUHbGFuZE51bQkAAgEJAKwCAgIeQ2Fubm90IHBhcnNlIGxhbmQgbnVtYmVyIGZyb20gCAUFYXNzZXQEbmFtZQQLbGFuZEFzc2V0SWQJANgEAQUHYXNzZXRJZAQHdGltZUtleQkBFmtleVN0YWtlZFRpbWVCeUFzc2V0SWQBBQtsYW5kQXNzZXRJZAMJAQlpc0RlZmluZWQBCQCfCAEFB3RpbWVLZXkJAAIBCQCsAgIJAKwCAgIETkZUIAgFBWFzc2V0BG5hbWUCEiBpcyBhbHJlYWR5IHN0YWtlZAQBZAkAtQkCCAUFYXNzZXQLZGVzY3JpcHRpb24CAV8EDXRlcnJhaW5Db3VudHMJAQ1jb3VudFRlcnJhaW5zAQkAkQMCBQFkBQtyZWNUZXJyYWlucwQGcGllY2VzCQEPbnVtUGllY2VzQnlTaXplAQkAkQMCBQFkBQtyZWNMYW5kU2l6ZQQJbGFuZEluZGV4CQBpAgUGcGllY2VzBQVTU0laRQQFcHJvcHMJARF1cGRhdGVQcm9wb3J0aW9ucwMFDXRlcnJhaW5Db3VudHMFCWxhbmRJbmRleAABBAxyZXNCeUNvbnRLZXkJARZrZXlSZXNUeXBlc0J5Q29udGluZW50AQkAkQMCBQFkBQxyZWNDb250aW5lbnQECWNvbnRQcm9wcwkAtQkCCQELdmFsdWVPckVsc2UCCQCiCAEFDHJlc0J5Q29udEtleQILMF8wXzBfMF8wXzACAV8EEHVwZGF0ZWRDb250UHJvcHMJALkJAgkBGXVwZGF0ZVByb3BvcnRpb25zSW50ZXJuYWwEBQljb250UHJvcHMFDXRlcnJhaW5Db3VudHMFCWxhbmRJbmRleAABAgFfBAhsYW5kc0tleQkBFWtleVN0YWtlZExhbmRzQnlPd25lcgEFB2FkZHJlc3MECGxhbmRzU3RyCQCiCAEFCGxhbmRzS2V5BAVsYW5kcwMJAQlpc0RlZmluZWQBBQhsYW5kc1N0cgkAvQkCCQEFdmFsdWUBBQhsYW5kc1N0cgIBXwUDbmlsAwkBD2NvbnRhaW5zRWxlbWVudAIFBWxhbmRzBQtsYW5kQXNzZXRJZAkAAgEJAKwCAgIiWW91ciBzdGFrZWQgbGFuZHMgYWxyZWFkeSBjb250YWluIAULbGFuZEFzc2V0SWQDCQBnAgkAkAMBBQVsYW5kcwUYTUFYX0xBTkRTX1NUQUtFRF9CWV9VU0VSCQACAQkArAICCQCsAgICGVlvdXIgYWxyZWFkeSBzdGFrZWQgbWF4ICgJAKQDAQUYTUFYX0xBTkRTX1NUQUtFRF9CWV9VU0VSAgcpIGxhbmRzBAppbmZyYUxldmVsCQELdmFsdWVPckVsc2UCCQCfCAEJARZrZXlJbmZyYUxldmVsQnlBc3NldElkAQULbGFuZEFzc2V0SWQAAAQJcGllY2VzS2V5CQEWa2V5U3Rha2VkUGllY2VzQnlPd25lcgEFB2FkZHJlc3MECW9sZFBpZWNlcwkBC3ZhbHVlT3JFbHNlAgkAnwgBBQlwaWVjZXNLZXkAAAQJd2xnUmVzdWx0CQD8BwQFC3dsZ0NvbnRyYWN0AhJvblN0YWtlVW5zdGFrZUxhbmQJAMwIAgUHYWRkcmVzcwUDbmlsBQNuaWwJAJQKAgkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQd0aW1lS2V5CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBImtleVN0YWtlZFRpbWVCeVR5cGVBc3NldElkQW5kT3duZXIDBQpMQU5EUFJFRklYBQtsYW5kQXNzZXRJZAUHYWRkcmVzcwgFCWxhc3RCbG9jawl0aW1lc3RhbXAJAMwIAgkBC1N0cmluZ0VudHJ5AgUIbGFuZHNLZXkJALsJAgkAzQgCBQVsYW5kcwULbGFuZEFzc2V0SWQCAV8JAMwIAgkBDEludGVnZXJFbnRyeQIFCXBpZWNlc0tleQkAZAIFCW9sZFBpZWNlcwUGcGllY2VzCQDMCAIJAQtTdHJpbmdFbnRyeQIJARVrZXlMYW5kQXNzZXRJZFRvT3duZXIBBQtsYW5kQXNzZXRJZAUHYWRkcmVzcwkAzAgCCQELU3RyaW5nRW50cnkCCQERa2V5TGFuZE51bVRvT3duZXIBBQdsYW5kTnVtBQdhZGRyZXNzCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEea2V5SW5mcmFMZXZlbEJ5QXNzZXRJZEFuZE93bmVyAgULbGFuZEFzc2V0SWQFB2FkZHJlc3MFCmluZnJhTGV2ZWwJAMwIAgkBC1N0cmluZ0VudHJ5AgkBEWtleVJlc1Byb3BvcnRpb25zAAUFcHJvcHMJAMwIAgkBC1N0cmluZ0VudHJ5AgUMcmVzQnlDb250S2V5BRB1cGRhdGVkQ29udFByb3BzBQNuaWwFDXByb2xvZ0FjdGlvbnMFCXdsZ1Jlc3VsdAFpAQt1bnN0YWtlTGFuZAENbGFuZEFzc2V0SWRJbgQNcHJvbG9nQWN0aW9ucwkBBnByb2xvZwEFAWkDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAAJAAIBAhRObyBwYXltZW50cyByZXF1aXJlZAQEYWRkcgkApQgBCAUBaQZjYWxsZXIEAWMJARRjaGVja0NsYWltQ29uZGl0aW9ucwMFBGFkZHIFDWNsYWltTW9kZUR1Y2sFDWxhbmRBc3NldElkSW4EC2xhbmRBc3NldElkCAUBYwJfMgQBZAgFAWMCXzMECGxhbmRzS2V5CQEVa2V5U3Rha2VkTGFuZHNCeU93bmVyAQUEYWRkcgQNdGVycmFpbkNvdW50cwkBDWNvdW50VGVycmFpbnMBCQCRAwIFAWQFC3JlY1RlcnJhaW5zBAZwaWVjZXMJAQ9udW1QaWVjZXNCeVNpemUBCQCRAwIFAWQFC3JlY0xhbmRTaXplBAlsYW5kSW5kZXgJAGkCBQZwaWVjZXMFBVNTSVpFBAVwcm9wcwkBEXVwZGF0ZVByb3BvcnRpb25zAwUNdGVycmFpbkNvdW50cwUJbGFuZEluZGV4AP///////////wEEDHJlc0J5Q29udEtleQkBFmtleVJlc1R5cGVzQnlDb250aW5lbnQBCQCRAwIFAWQFDHJlY0NvbnRpbmVudAQJY29udFByb3BzCQC1CQIJAQt2YWx1ZU9yRWxzZQIJAKIIAQUMcmVzQnlDb250S2V5AgswXzBfMF8wXzBfMAIBXwQQdXBkYXRlZENvbnRQcm9wcwkAuQkCCQEZdXBkYXRlUHJvcG9ydGlvbnNJbnRlcm5hbAQFCWNvbnRQcm9wcwUNdGVycmFpbkNvdW50cwUJbGFuZEluZGV4AP///////////wECAV8EC2NsYWltUmVzdWx0CQEIY2xhaW1BbGwEBQRhZGRyBQtsYW5kQXNzZXRJZAUGcGllY2VzBQ1jbGFpbU1vZGVEdWNrBAVsYW5kcwkAvQkCCQELdmFsdWVPckVsc2UCCQCiCAEFCGxhbmRzS2V5AgACAV8EA2lkeAkAzwgCBQVsYW5kcwULbGFuZEFzc2V0SWQDCQEBIQEJAQlpc0RlZmluZWQBBQNpZHgJAAIBCQCsAgICIFlvdXIgc3Rha2VkIGxhbmRzIGRvbid0IGNvbnRhaW4gBQtsYW5kQXNzZXRJZAQDbm93CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAQOZ292UmVsZWFzZVRpbWUJAQt2YWx1ZU9yRWxzZQIJAJoIAgULZ292Q29udHJhY3QJARVrZXlVc2VyR3dsUmVsZWFzZVRpbWUBBQRhZGRyAAADCQBnAgUOZ292UmVsZWFzZVRpbWUFA25vdwkAAgEJAKwCAgI5WW91ciBnV0wgYXJlIHRha2luZyBwYXJ0IGluIHZvdGluZywgY2Fubm90IHVuc3Rha2UgdW50aWwgCQCkAwEFDmdvdlJlbGVhc2VUaW1lBA5hcmJSZWxlYXNlVGltZQkAZAIJAQt2YWx1ZU9yRWxzZQIJAJoIAgULd2xnQ29udHJhY3QJARRrZXlMYXN0QXJiVGltZUJ5VXNlcgEFBGFkZHIAAAUOYXJiaXRyYWdlRGVsYXkDCQBmAgUOYXJiUmVsZWFzZVRpbWUFA25vdwkAAgEJAKwCAgI/WW91ciBzdGFrZWQgbGFuZHMgdG9vayBwYXJ0IGluIGFyYml0cmFnZSwgY2Fubm90IHVuc3Rha2UgdW50aWwgCQCkAwEFDmFyYlJlbGVhc2VUaW1lBAlwaWVjZXNLZXkJARZrZXlTdGFrZWRQaWVjZXNCeU93bmVyAQUEYWRkcgQMc3Rha2VkUGllY2VzCQELdmFsdWVPckVsc2UCCQCfCAEFCXBpZWNlc0tleQAABAluZXdQaWVjZXMDCQBmAgUGcGllY2VzBQxzdGFrZWRQaWVjZXMAAAkAZQIFDHN0YWtlZFBpZWNlcwUGcGllY2VzBAl3bGdSZXN1bHQJAPwHBAULd2xnQ29udHJhY3QCEm9uU3Rha2VVbnN0YWtlTGFuZAkAzAgCBQRhZGRyBQNuaWwFA25pbAkAlAoCCQDOCAIJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyAAEJANkEAQULbGFuZEFzc2V0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBFmtleVN0YWtlZFRpbWVCeUFzc2V0SWQBBQtsYW5kQXNzZXRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEia2V5U3Rha2VkVGltZUJ5VHlwZUFzc2V0SWRBbmRPd25lcgMFCkxBTkRQUkVGSVgFC2xhbmRBc3NldElkBQRhZGRyCQDMCAIJAQtTdHJpbmdFbnRyeQIJARFrZXlSZXNQcm9wb3J0aW9ucwAFBXByb3BzCQDMCAIJAQtTdHJpbmdFbnRyeQIFDHJlc0J5Q29udEtleQUQdXBkYXRlZENvbnRQcm9wcwkAzAgCCQELU3RyaW5nRW50cnkCCAULY2xhaW1SZXN1bHQCXzIJALkJAggFC2NsYWltUmVzdWx0Al8zAgE6CQDMCAIDCQBmAgkAkAMBBQVsYW5kcwABCQELU3RyaW5nRW50cnkCBQhsYW5kc0tleQkAuwkCCQDRCAIFBWxhbmRzCQEFdmFsdWUBBQNpZHgCAV8JAQtEZWxldGVFbnRyeQEFCGxhbmRzS2V5CQDMCAIJAQxJbnRlZ2VyRW50cnkCBQlwaWVjZXNLZXkFCW5ld1BpZWNlcwUDbmlsBQ1wcm9sb2dBY3Rpb25zBQl3bGdSZXN1bHQBaQETdW5zdGFrZUxhbmRDYWxsYmFjawILbGFuZEFzc2V0SWQEYWRkcgMJAQIhPQIJAKUIAQgFAWkGY2FsbGVyBRBhY3JlczJBZGRyZXNzU3RyCQACAQIRUGVybWlzc2lvbiBkZW5pZWQEDXVuc3Rha2VSZXN1bHQJARN1bnN0YWtlTGFuZEludGVybmFsAgUEYWRkcgULbGFuZEFzc2V0SWQECXdsZ1Jlc3VsdAkA/AcEBQt3bGdDb250cmFjdAISb25TdGFrZVVuc3Rha2VMYW5kCQDMCAIFBGFkZHIFA25pbAUDbmlsCQCUCgIJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQUEYWRkcgABCQDZBAEFC2xhbmRBc3NldElkCQDMCAIJAQtEZWxldGVFbnRyeQEJARZrZXlTdGFrZWRUaW1lQnlBc3NldElkAQULbGFuZEFzc2V0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBImtleVN0YWtlZFRpbWVCeVR5cGVBc3NldElkQW5kT3duZXIDBQpMQU5EUFJFRklYBQtsYW5kQXNzZXRJZAUEYWRkcgUDbmlsCQCXCgUIBQ11bnN0YWtlUmVzdWx0Al8xCAUNdW5zdGFrZVJlc3VsdAJfMggFDXVuc3Rha2VSZXN1bHQCXzMIBQ11bnN0YWtlUmVzdWx0Al80BQl3bGdSZXN1bHQBaQETdW5zdGFrZUxhbmRSRUFET05MWQILbGFuZEFzc2V0SWQEYWRkcgQNdW5zdGFrZVJlc3VsdAkBE3Vuc3Rha2VMYW5kSW50ZXJuYWwCBQRhZGRyBQtsYW5kQXNzZXRJZAkAlAoCBQNuaWwFDXVuc3Rha2VSZXN1bHQBaQEcdW5zdGFrZUxhbmRzRmluYWxpemVDYWxsYmFjawEEYWRkcgMJAQIhPQIJAKUIAQgFAWkGY2FsbGVyBRBhY3JlczJBZGRyZXNzU3RyCQACAQIRUGVybWlzc2lvbiBkZW5pZWQJAJQKAgkAzAgCCQELRGVsZXRlRW50cnkBCQEVa2V5U3Rha2VkTGFuZHNCeU93bmVyAQUEYWRkcgkAzAgCCQELRGVsZXRlRW50cnkBCQEWa2V5U3Rha2VkUGllY2VzQnlPd25lcgEFBGFkZHIFA25pbAAAAWkBCXN0YWtlRHVjawAEDXByb2xvZ0FjdGlvbnMJAQZwcm9sb2cBBQFpAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwABCQACAQIcRXhhY3RseSBvbmUgcGF5bWVudCByZXF1aXJlZAQDcG10CQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAAEB2Fzc2V0SWQJAQV2YWx1ZQEIBQNwbXQHYXNzZXRJZAQHYWRkcmVzcwkApQgBCAUBaQZjYWxsZXIDCQECIT0CCAUDcG10BmFtb3VudAABCQACAQkArAICCQCsAgICBE5GVCAFCkRVQ0tQUkVGSVgCJCB0b2tlbiBzaG91bGQgYmUgYXR0YWNoZWQgYXMgcGF5bWVudAQFYXNzZXQJAQV2YWx1ZQEJAOwHAQUHYXNzZXRJZAQGaXNSb2JvAwMFE0tTX0FMTE9XX1JPQk9fRFVDS1MJAAACCAUFYXNzZXQGaXNzdWVyBQR0aGlzBwkBCGNvbnRhaW5zAggFBWFzc2V0BG5hbWUFC1JPQk9fUFJFRklYBwMDAwkBAiE9AggFBWFzc2V0Bmlzc3VlcgUNaW5jdWJhdG9yQWRkcgkBAiE9AggFBWFzc2V0Bmlzc3VlcgULYnJlZWRlckFkZHIHCQEBIQEFBmlzUm9ibwcJAAIBCQCsAgIJAKwCAgkArAICCQCsAgICElVua25vd24gaXNzdWVyIG9mIAUKRFVDS1BSRUZJWAIEIG9yIAULUk9CT19QUkVGSVgCBiB0b2tlbgMDCQEBIQEJAQhjb250YWlucwIIBQVhc3NldARuYW1lBQpEVUNLUFJFRklYCQEBIQEFBmlzUm9ibwcJAAIBCQCsAgIJAKwCAgkArAICCQCsAgICCU9ubHkgTkZUIAUKRFVDS1BSRUZJWAIEIG9yIAULUk9CT19QUkVGSVgCFCB0b2tlbnMgYXJlIGFjY2VwdGVkBAphc3NldElkU3RyCQDYBAEFB2Fzc2V0SWQEB3RpbWVLZXkJARZrZXlTdGFrZWRUaW1lQnlBc3NldElkAQUKYXNzZXRJZFN0cgMJAQlpc0RlZmluZWQBCQCfCAEFB3RpbWVLZXkJAAIBCQCsAgIJAKwCAgIETkZUIAgFBWFzc2V0BG5hbWUCEiBpcyBhbHJlYWR5IHN0YWtlZAMJAQlpc0RlZmluZWQBCQCiCAEJARRrZXlTdGFrZWREdWNrQnlPd25lcgEFB2FkZHJlc3MJAAIBCQCsAgICHVlvdSBhbHJlYWR5IHN0YWtlZCBvbmUgZHVjazogCAUFYXNzZXQEbmFtZQQGbG9jS2V5CQEPa2V5RHVja0xvY2F0aW9uAQUKYXNzZXRJZFN0cgQIbG9jYXRpb24JAKIIAQUGbG9jS2V5BAVicEtleQkBEWtleUJhY2twYWNrQnlEdWNrAQUKYXNzZXRJZFN0cgQIYmFja3BhY2sJAKIIAQUFYnBLZXkECWtleUhlYWx0aAkBDWtleUR1Y2tIZWFsdGgBBQphc3NldElkU3RyBAVtYXhIUAkBCW1heEhlYWx0aAEJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBDGtleUR1Y2tMZXZlbAEFCmFzc2V0SWRTdHIAAAQJY3VySGVhbHRoCQELdmFsdWVPckVsc2UCCQCfCAEFCWtleUhlYWx0aAUFbWF4SFAJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgUHdGltZUtleQgFCWxhc3RCbG9jawl0aW1lc3RhbXAJAMwIAgkBDEludGVnZXJFbnRyeQIJASJrZXlTdGFrZWRUaW1lQnlUeXBlQXNzZXRJZEFuZE93bmVyAwUKRFVDS1BSRUZJWAkA2AQBBQdhc3NldElkBQdhZGRyZXNzCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAkAzAgCCQELU3RyaW5nRW50cnkCCQEQa2V5RHVja0lkVG9Pd25lcgEFCmFzc2V0SWRTdHIFB2FkZHJlc3MJAMwIAgkBC1N0cmluZ0VudHJ5AgkBFGtleVN0YWtlZER1Y2tCeU93bmVyAQUHYWRkcmVzcwUKYXNzZXRJZFN0cgUDbmlsAwkBCWlzRGVmaW5lZAEFCGxvY2F0aW9uBQNuaWwJAM4IAgkAzAgCCQELU3RyaW5nRW50cnkCBQZsb2NLZXkFD0RFRkFVTFRMT0NBVElPTgUDbmlsAwkBCWlzRGVmaW5lZAEFCGJhY2twYWNrBQNuaWwJAM4IAgkAzQgCCQDMCAIJAQtTdHJpbmdFbnRyeQIFBWJwS2V5AhowOjBfMF8wXzBfMF8wOjBfMF8wXzBfMF8wOgUDbmlsCQEMSW50ZWdlckVudHJ5AgUJa2V5SGVhbHRoBQljdXJIZWFsdGgFDXByb2xvZ0FjdGlvbnMBaQELdW5zdGFrZUR1Y2sBCmFzc2V0SWRTdHIEDXByb2xvZ0FjdGlvbnMJAQZwcm9sb2cBBQFpAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwAACQACAQIUTm8gcGF5bWVudHMgcmVxdWlyZWQEB2Fzc2V0SWQJANkEAQUKYXNzZXRJZFN0cgQHYWRkcmVzcwkApQgBCAUBaQZjYWxsZXIEBWFzc2V0CQEFdmFsdWUBCQDsBwEFB2Fzc2V0SWQEB3RpbWVLZXkJARZrZXlTdGFrZWRUaW1lQnlBc3NldElkAQUKYXNzZXRJZFN0cgMJAQEhAQkBCWlzRGVmaW5lZAEJAJ8IAQUHdGltZUtleQkAAgEJAKwCAgkArAICAgRORlQgCAUFYXNzZXQEbmFtZQIOIGlzIG5vdCBzdGFrZWQDCQEBIQEJAQlpc0RlZmluZWQBCQCiCAEJARRrZXlTdGFrZWREdWNrQnlPd25lcgEFB2FkZHJlc3MJAAIBCQCsAgIJAKwCAgIJVGhlIGR1Y2sgCAUFYXNzZXQEbmFtZQIOIGlzIG5vdCBzdGFrZWQEBW93bmVyCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKIIAQkBEGtleUR1Y2tJZFRvT3duZXIBBQphc3NldElkU3RyCQCsAgIJAKwCAgIETkZUIAgFBWFzc2V0BG5hbWUCDCBpcyBvcnBoYW5lZAMJAQIhPQIFBW93bmVyBQdhZGRyZXNzCQACAQIXU3Rha2VkIE5GVCBpcyBub3QgeW91cnMDCQEPY2hlY2tUb3VybmFtZW50AQUKYXNzZXRJZFN0cgkAAgECG3Vuc3Rha2VEdWNrX2NoZWNrVG91cm5hbWVudAQJa2V5SGVhbHRoCQENa2V5RHVja0hlYWx0aAEFCmFzc2V0SWRTdHIEBW1heEhQCQEJbWF4SGVhbHRoAQkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEMa2V5RHVja0xldmVsAQUKYXNzZXRJZFN0cgAABAZoZWFsdGgJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUJa2V5SGVhbHRoBQVtYXhIUAMJAGYCBQVtYXhIUAUGaGVhbHRoCQACAQkArAICCQCsAgICGVBsZWFzZSBoZWFsIHlvdXIgZHVjayB0byAJAKQDAQUFbWF4SFACE2hwIGJlZm9yZSB1bnN0YWtpbmcJAM4IAgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIAAQUHYXNzZXRJZAkAzAgCCQELRGVsZXRlRW50cnkBBQd0aW1lS2V5CQDMCAIJAQtEZWxldGVFbnRyeQEFCWtleUhlYWx0aAkAzAgCCQELRGVsZXRlRW50cnkBCQEPa2V5RHVja0xvY2F0aW9uAQUKYXNzZXRJZFN0cgkAzAgCCQELRGVsZXRlRW50cnkBCQEQa2V5RHVja0lkVG9Pd25lcgEFCmFzc2V0SWRTdHIJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBImtleVN0YWtlZFRpbWVCeVR5cGVBc3NldElkQW5kT3duZXIDBQpEVUNLUFJFRklYBQphc3NldElkU3RyBQdhZGRyZXNzCQDMCAIJAQtEZWxldGVFbnRyeQEJARRrZXlTdGFrZWREdWNrQnlPd25lcgEFB2FkZHJlc3MFA25pbAUNcHJvbG9nQWN0aW9ucwFpARN1bnN0YWtlRHVja0NhbGxiYWNrAgtkdWNrQXNzZXRJZARhZGRyAwkBAiE9AgkApQgBCAUBaQZjYWxsZXIFEGFjcmVzMkFkZHJlc3NTdHIJAAIBAhFQZXJtaXNzaW9uIGRlbmllZAQNdW5zdGFrZVJlc3VsdAkBE3Vuc3Rha2VEdWNrSW50ZXJuYWwCBQRhZGRyBQtkdWNrQXNzZXRJZAkAlAoCCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEFBGFkZHIAAQkA2QQBBQtkdWNrQXNzZXRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEWa2V5U3Rha2VkVGltZUJ5QXNzZXRJZAEFC2R1Y2tBc3NldElkCQDMCAIJAQtEZWxldGVFbnRyeQEJARBrZXlEdWNrSWRUb093bmVyAQULZHVja0Fzc2V0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBImtleVN0YWtlZFRpbWVCeVR5cGVBc3NldElkQW5kT3duZXIDBQpEVUNLUFJFRklYBQtkdWNrQXNzZXRJZAUEYWRkcgkAzAgCCQELRGVsZXRlRW50cnkBCQEUa2V5U3Rha2VkRHVja0J5T3duZXIBBQRhZGRyBQNuaWwFDXVuc3Rha2VSZXN1bHQBaQETdW5zdGFrZUR1Y2tSRUFET05MWQILZHVja0Fzc2V0SWQEYWRkcgQNdW5zdGFrZVJlc3VsdAkBE3Vuc3Rha2VEdWNrSW50ZXJuYWwCBQRhZGRyBQtkdWNrQXNzZXRJZAkAlAoCBQNuaWwFDXVuc3Rha2VSZXN1bHQBaQEIY2xhaW1SZXMCBmFtb3VudA5sYW5kQXNzZXRJZFN0cgQNcHJvbG9nQWN0aW9ucwkBBnByb2xvZwEFAWkDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAAJAAIBAhRObyBwYXltZW50cyByZXF1aXJlZAQEYWRkcgkApQgBCAUBaQxvcmlnaW5DYWxsZXIEBnJlc3VsdAkBEGNsYWltUmVzSW50ZXJuYWwEBQRhZGRyBQZhbW91bnQFDWNsYWltTW9kZUR1Y2sFDmxhbmRBc3NldElkU3RyBAtkdWNrQXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCiCAEJARRrZXlTdGFrZWREdWNrQnlPd25lcgEFBGFkZHICHFlvdSBkb24ndCBoYXZlIGEgZHVjayBzdGFrZWQJAJQKAgkAzggCCQDNCAIJAM0IAgkAzggCCAUGcmVzdWx0Al8xCAkBF3VwZGF0ZUR1Y2tTdGF0c0ludGVybmFsAgULZHVja0Fzc2V0SWQJAGsDBQd4cENsYWltBQZhbW91bnQFBU1VTFQ4Al8xCQELU3RyaW5nRW50cnkCCAUGcmVzdWx0Al8yCQC5CQIIBQZyZXN1bHQCXzMCAToJAQtTdHJpbmdFbnRyeQIIBQZyZXN1bHQCXzQJALkJAggFBnJlc3VsdAJfNQIBOgUNcHJvbG9nQWN0aW9ucwkAkQMCCAUGcmVzdWx0Al8zBQhicElkeFJlcwFpAQxjbGFpbVJlc1RvV0gCBmFtb3VudA5sYW5kQXNzZXRJZFN0cgQNcHJvbG9nQWN0aW9ucwkBBnByb2xvZwEFAWkDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAAJAAIBAhRObyBwYXltZW50cyByZXF1aXJlZAQEYWRkcgkApQgBCAUBaQxvcmlnaW5DYWxsZXIEBnJlc3VsdAkBEGNsYWltUmVzSW50ZXJuYWwEBQRhZGRyBQZhbW91bnQFC2NsYWltTW9kZVdoBQ5sYW5kQXNzZXRJZFN0cgkAlAoCCQDOCAIJAM0IAgkAzQgCCQDOCAIIBQZyZXN1bHQCXzEICQEWdXBkYXRlQWNjU3RhdHNJbnRlcm5hbAIFBGFkZHIJAGsDBQd4cENsYWltBQZhbW91bnQFBU1VTFQ4Al8xCQELU3RyaW5nRW50cnkCCAUGcmVzdWx0Al8yCQC5CQIIBQZyZXN1bHQCXzMCAToJAQtTdHJpbmdFbnRyeQIIBQZyZXN1bHQCXzQJALkJAggFBnJlc3VsdAJfNQIBOgUNcHJvbG9nQWN0aW9ucwkAkQMCCAUGcmVzdWx0Al81BQh3aElkeFJlcwFpAQZmbGlnaHQCB21lc3NhZ2UDc2lnBA1wcm9sb2dBY3Rpb25zCQEGcHJvbG9nAQUBaQMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAAkAAgECFE5vIHBheW1lbnRzIHJlcXVpcmVkBAh1c2VyQWRkcgkApQgBCAUBaQZjYWxsZXIEAWYJAQxmbGlnaHRDb21tb24DBQh1c2VyQWRkcgUHbWVzc2FnZQUDc2lnBAVuZXdIUAgFAWYCXzEEC2R1Y2tBc3NldElkCAUBZgJfMgQGbG9jS2V5CQEPa2V5RHVja0xvY2F0aW9uAQULZHVja0Fzc2V0SWQEC2N1ckxvY2F0aW9uCQELdmFsdWVPckVsc2UCCQCiCAEFBmxvY0tleQUPREVGQVVMVExPQ0FUSU9OBAtuZXdMb2NhdGlvbggFAWYCXzQDCQAAAgULbmV3TG9jYXRpb24FC2N1ckxvY2F0aW9uCQACAQIiWW91IGNhbid0IGZseSB0byB0aGUgc2FtZSBsb2NhdGlvbgQGbmV3TG9jCQC1CQIFC25ld0xvY2F0aW9uAgFfBAZpc1RvdXIJAAACCQCRAwIFBm5ld0xvYwUKbG9jSWR4VHlwZQIBVAQHaXNEZWxpdgkAAAIJAJEDAgUGbmV3TG9jBQpsb2NJZHhUeXBlAgFEBAVlcUtleQkBEGtleUR1Y2tFcXVpcG1lbnQBBQtkdWNrQXNzZXRJZAQJY3VycmVudEVxCQELdmFsdWVPckVsc2UCCQCiCAEFBWVxS2V5AhcsOyxfLDssXyw7LF8sOyxfLDssXyw7LAQNJHQwNzI1MzA3MjYzNgkBEXN1YnRyYWN0RXF1aXBtZW50AgUJY3VycmVudEVxCAUBZgJfNQQFbmV3RXEIBQ0kdDA3MjUzMDcyNjM2Al8xBA9zaG91bGRaZXJvQnVmZnMIBQ0kdDA3MjUzMDcyNjM2Al8yBAdpZ25vcmVkCAUNJHQwNzI1MzA3MjYzNgJfMwQNJHQwNzI2Mzk3NDQ3MQMJAQEhAQkBCW9uTWlzc2lvbgIFEnRvdXJuYW1lbnRDb250cmFjdAULY3VyTG9jYXRpb24DBQZpc1RvdXIJAQxjaGVhdEF0dGVtcHQDBQtjdXJMb2NhdGlvbgULbmV3TG9jYXRpb24ABQMJAQEhAQUHaXNEZWxpdgMJAGYCBQVuZXdIUAAACQCUCgIFC25ld0xvY2F0aW9uBQVuZXdIUAkAlAoCBQtjdXJMb2NhdGlvbgAAAwkAZgIFBW5ld0hQAAAEAXMJAPwHBAUEdGhpcwIPcHJvY2Vzc0RlbGl2ZXJ5CQDMCAIFC2R1Y2tBc3NldElkBQNuaWwFA25pbAMJAAACBQFzBQFzCQCUCgIFC2N1ckxvY2F0aW9uBQVuZXdIUAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAlAoCBQtjdXJMb2NhdGlvbgAAAwkBDmlzSW5Ub3VybmFtZW50AgUSdG91cm5hbWVudENvbnRyYWN0BQtjdXJMb2NhdGlvbgMJAQEhAQkBDmlzSW5Ub3VybmFtZW50AgUSdG91cm5hbWVudENvbnRyYWN0BQtuZXdMb2NhdGlvbgkAAgECKllvdXIgZHVjayBpcyB0YWtpbmcgcGFydCBpbiB0aGUgdG91cm5hbWVudAQFc2NvcmUJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQZuZXdMb2MFCGxvY0lkeElkBAZjdXJMb2MJALUJAgULY3VyTG9jYXRpb24CAV8EBmxhc3RJZAkBC3ZhbHVlT3JFbHNlAgkAmggCBRJ0b3VybmFtZW50Q29udHJhY3QFDWxhc3RUb3VySWRLZXkAAAMJAQIhPQIFBXNjb3JlCQBkAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBmN1ckxvYwUIbG9jSWR4SWQAAQkBDGNoZWF0QXR0ZW1wdAMFC2N1ckxvY2F0aW9uBQtuZXdMb2NhdGlvbgAHAwkAZgIFBW5ld0hQAAAECWxvY2FsQmVzdAkBC3ZhbHVlT3JFbHNlAgkAmggCBRJ0b3VybmFtZW50Q29udHJhY3QJARprZXlCZXN0UmVzdWx0QnlUb3VyQW5kRHVjawIFBmxhc3RJZAULZHVja0Fzc2V0SWQAAAQIdXBkTG9jYWwDCQBmAgUFc2NvcmUFCWxvY2FsQmVzdAkA/AcEBRJ0b3VybmFtZW50Q29udHJhY3QCDnNhdmVEdWNrUmVzdWx0CQDMCAIFC2R1Y2tBc3NldElkCQDMCAIFBXNjb3JlBQNuaWwFA25pbAUEdW5pdAMJAAACBQh1cGRMb2NhbAUIdXBkTG9jYWwJAJQKAgULbmV3TG9jYXRpb24FBW5ld0hQCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQCUCgIFC2N1ckxvY2F0aW9uAAAJAAIBCQCsAgICFFVua25vd24gY3VyTG9jYXRpb246BQtjdXJMb2NhdGlvbgQJbG9jVG9TYXZlCAUNJHQwNzI2Mzk3NDQ3MQJfMQQIaHBUb1NhdmUIBQ0kdDA3MjYzOTc0NDcxAl8yCQCUCgIJAM4IAgkAzggCCQDOCAIJAMwIAgkBC1N0cmluZ0VudHJ5AgUGbG9jS2V5BQlsb2NUb1NhdmUJAMwIAgkBC1N0cmluZ0VudHJ5AgUFZXFLZXkFBW5ld0VxCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQENa2V5RHVja0hlYWx0aAEFC2R1Y2tBc3NldElkBQhocFRvU2F2ZQUDbmlsBQ1wcm9sb2dBY3Rpb25zAwUPc2hvdWxkWmVyb0J1ZmZzCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQxrZXlEdWNrQnVmZnMBBQtkdWNrQXNzZXRJZAIJMF8wXzBfMF8wBQNuaWwFA25pbAgJARd1cGRhdGVEdWNrU3RhdHNJbnRlcm5hbAIFC2R1Y2tBc3NldElkAwkAZgIFBW5ld0hQAAAFD3hwU3VjY2Vzc0ZsaWdodAUMeHBGYWlsRmxpZ2h0Al8xCAUBZgJfMwFpAQRoZWFsAwpxdWFudGl0eUwxCnF1YW50aXR5TDIKcXVhbnRpdHlMMwQNcHJvbG9nQWN0aW9ucwkBBnByb2xvZwEFAWkDAwMJAGYCAAAFCnF1YW50aXR5TDEGCQBmAgAABQpxdWFudGl0eUwyBgkAZgIAAAUKcXVhbnRpdHlMMwkAAgECG1F1YW50aXR5IGNhbm5vdCBiZSBuZWdhdGl2ZQQLZHVja0Fzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAoggBCQEUa2V5U3Rha2VkRHVja0J5T3duZXIBCQClCAEIBQFpBmNhbGxlcgIcWW91IGRvbid0IGhhdmUgYSBkdWNrIHN0YWtlZAMJAQ9jaGVja1RvdXJuYW1lbnQBBQtkdWNrQXNzZXRJZAkAAgECFGhlYWxfY2hlY2tUb3VybmFtZW50BANxdHMJAMwIAgUKcXVhbnRpdHlMMQkAzAgCBQpxdWFudGl0eUwyCQDMCAIFCnF1YW50aXR5TDMFA25pbAQJa2V5SGVhbHRoCQENa2V5RHVja0hlYWx0aAEFC2R1Y2tBc3NldElkBAVtYXhIUAkBCW1heEhlYWx0aAEJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBDGtleUR1Y2tMZXZlbAEFC2R1Y2tBc3NldElkAAAECW9sZEhlYWx0aAkBC3ZhbHVlT3JFbHNlAgkAnwgBBQlrZXlIZWFsdGgFBW1heEhQAwkAZwIFCW9sZEhlYWx0aAUFbWF4SFAJAAIBCQCsAgIJAKwCAgIPSFAg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bnRzAAEJAAIBAhxFeGFjdGx5IG9uZSBwYXltZW50IHJlcXVpcmVkBANwbXQJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAMJAQIhPQIIBQNwbXQHYXNzZXRJZAULdXNkdEFzc2V0SWQJAAIBAhpBbGxvd2VkIFVTRFQgcGF5bWVudCBvbmx5IQQLZHVja0Fzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAoggBCQEUa2V5U3Rha2VkRHVja0J5T3duZXIBCQClCAEIBQFpBmNhbGxlcgIcWW91IGRvbid0IGhhdmUgYSBkdWNrIHN0YWtlZAMJAQ9jaGVja1RvdXJuYW1lbnQBBQtkdWNrQXNzZXRJZAkAAgECFmhlYWxFU19jaGVja1RvdXJuYW1lbnQECWtleUhlYWx0aAkBDWtleUR1Y2tIZWFsdGgBBQtkdWNrQXNzZXRJZAQFbWF4SFAJAQltYXhIZWFsdGgBCQELdmFsdWVPckVsc2UCCQCfCAEJAQxrZXlEdWNrTGV2ZWwBBQtkdWNrQXNzZXRJZAAABAlvbGRIZWFsdGgJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUJa2V5SGVhbHRoBQVtYXhIUAMJAGYCBQlvbGRIZWFsdGgAAAkAAgECKEhQIHNob3VsZCBiZSAwIHRvIGNhbGwgRW1lcmdlbmN5IFNlcnZpY2UEBWJwS2V5CQERa2V5QmFja3BhY2tCeUR1Y2sBBQtkdWNrQXNzZXRJZAQLY3VycmVudFBhY2sJAQtnZXRCYWNrcGFjawEFBWJwS2V5BAhwcm9kTGlzdAMJAAACCQCRAwIFC2N1cnJlbnRQYWNrBQlicElkeFByb2QCAAUDbmlsCQC8CQIJAJEDAgULY3VycmVudFBhY2sFCWJwSWR4UHJvZAIBXwQNbWVkS2l0QW1vdW50MQMJAGYCCQCQAwEFCHByb2RMaXN0AAAJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQhwcm9kTGlzdAAAAAAEDW1lZEtpdEFtb3VudDIDCQBmAgkAkAMBBQhwcm9kTGlzdAABCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUIcHJvZExpc3QAAQAABA1tZWRLaXRBbW91bnQzAwkAZgIJAJADAQUIcHJvZExpc3QAAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCHByb2RMaXN0AAIAAAMDAwkAZgIFDW1lZEtpdEFtb3VudDEAAAYJAGYCBQ1tZWRLaXRBbW91bnQyAAAGCQBmAgUNbWVkS2l0QW1vdW50MwAACQACAQIfWW91IGhhdmUgdG8gdXNlIG93biBNZWRpY2FsIEtpdAQIZXhpc3RTdHIJAJ0IAgUPZWNvbm9teUNvbnRyYWN0CQEOa2V5RXNXYXJlaG91c2UABAxleGlzdEFtb3VudHMDCQEJaXNEZWZpbmVkAQUIZXhpc3RTdHIJALwJAgkBBXZhbHVlAQUIZXhpc3RTdHICAV8FA25pbAQLZXhpc3RBbW91bnQDCQBmAgkAkAMBBQxleGlzdEFtb3VudHMAAAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDGV4aXN0QW1vdW50cwAAAAADCQBnAgAABQtleGlzdEFtb3VudAkAAgECOVRoZXJlIGFyZSBubyBNZWRpY2FsIEtpdHMgTDEgYXQgRW1lcmdlbmN5IFNlcnZpY2Ugc3RvcmFnZQQJbmV3SGVhbHRoCQBkAgUJb2xkSGVhbHRoCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgkAtQkCCQCRAwIFEHByb2R1Y3Rpb25NYXRyaXgAAAIBXwUKcklkeEVmZmVjdAQFbmV3RVMJALkJAgkAzAgCCQCkAwEJAGUCBQtleGlzdEFtb3VudAABCQDRCAIFDGV4aXN0QW1vdW50cwAAAgFfBAZyZWNpcGUJALUJAgkAkQMCBRBwcm9kdWN0aW9uTWF0cml4AAACAV8ECHRvdGFsTWF0CQESZ2V0UmVjaXBlTWF0ZXJpYWxzAQUGcmVjaXBlBAlzZWxsUHJpY2UJAGsDCQBoAgUIdG90YWxNYXQFCkVTU0VMTENPRUYFEFJFU09VUkNFUFJJQ0VNSU4JAGgCBQVNVUxUOAUOUFJPRFVDVFBLR1NJWkUDCQECIT0CCAUDcG10BmFtb3VudAUJc2VsbFByaWNlCQACAQkArAICAhtQYXltZW50IGF0dGFjaGVkIHNob3VsZCBiZSAJAKQDAQUJc2VsbFByaWNlBAZyZXN1bHQJAQhhc1N0cmluZwEJAPwHBAUPZWNvbm9teUNvbnRyYWN0Ag91cGRhdGVFc1N0b3JhZ2UJAMwIAgUFbmV3RVMFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgULdXNkdEFzc2V0SWQFCXNlbGxQcmljZQUDbmlsCQCUCgIJAM4IAgkAzQgCBQ1wcm9sb2dBY3Rpb25zCQEMSW50ZWdlckVudHJ5AgUJa2V5SGVhbHRoBQluZXdIZWFsdGgICQEXdXBkYXRlRHVja1N0YXRzSW50ZXJuYWwCBQtkdWNrQXNzZXRJZAUIeHBDYWxsRVMCXzEFBnJlc3VsdAFpAQ51cGRhdGVCYWNrcGFjawILZHVja0Fzc2V0SWQHbmV3UGFjawMJAQIhPQIIBQFpBmNhbGxlcgUPZWNvbm9teUNvbnRyYWN0CQACAQIRcGVybWlzc2lvbiBkZW5pZWQJAJQKAgkAzAgCCQELU3RyaW5nRW50cnkCCQERa2V5QmFja3BhY2tCeUR1Y2sBBQtkdWNrQXNzZXRJZAUHbmV3UGFjawUDbmlsBQduZXdQYWNrAWkBD2NvbW1pdEZvclJhbmRvbQAEDXByb2xvZ0FjdGlvbnMJAQZwcm9sb2cBBQFpBAtmaW5pc2hCbG9jawkAZAIFBmhlaWdodAULcmFuZG9tRGVsYXkEBGFkZHIJAKUIAQgFAWkGY2FsbGVyCQCUCgIJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBCWtleUNvbW1pdAEFBGFkZHIFC2ZpbmlzaEJsb2NrBQNuaWwFDXByb2xvZ0FjdGlvbnMFC2ZpbmlzaEJsb2NrAWkBDHJldmVhbFJhbmRvbQEIbWF4VmFsdWUEDXByb2xvZ0FjdGlvbnMJAQZwcm9sb2cBBQFpBARhZGRyCQClCAEIBQFpBmNhbGxlcgQJZmluaXNoS2V5CQEJa2V5Q29tbWl0AQUEYWRkcgQLZmluaXNoQmxvY2sJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnwgBBQlmaW5pc2hLZXkCJFlvdSBoYXZlIHRvIGNvbW1pdEZvclJhbmRvbSgpIGZpcnN0IQMJAGYCBQtmaW5pc2hCbG9jawUGaGVpZ2h0CQACAQkArAICAjRSYW5kb20gbnVtYmVyIGlzIG5vdCByZWFkeSB5ZXQsIHdhaXQgdW50aWwgaGVpZ2h0ID0gCQCkAwEFC2ZpbmlzaEJsb2NrBAdlbnRyb3B5CQEFdmFsdWUBCAkBBXZhbHVlAQkA7QcBBQtmaW5pc2hCbG9jawN2cmYEBHNhbHQJAJsDAQkBC3ZhbHVlT3JFbHNlAgkAoggBCQERa2V5TGFzdFR4SWRCeVVzZXIBBQRhZGRyAgAEBHJhbmQJAQ9nZXRSYW5kb21OdW1iZXIDBQhtYXhWYWx1ZQUEc2FsdAUHZW50cm9weQkAlAoCCQDOCAIJAMwIAgkBC0RlbGV0ZUVudHJ5AQUJZmluaXNoS2V5BQNuaWwFDXByb2xvZ0FjdGlvbnMFBHJhbmQBaQEIYnV5U0xhbmQABA1wcm9sb2dBY3Rpb25zCQEGcHJvbG9nAQUBaQMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECHEV4YWN0bHkgb25lIHBheW1lbnQgcmVxdWlyZWQEA3BtdAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwAAAwkBAiE9AggFA3BtdAdhc3NldElkBQt1c2R0QXNzZXRJZAkAAgECGkFsbG93ZWQgVVNEVCBwYXltZW50IG9ubHkhAwkBAiE9AggFA3BtdAZhbW91bnQFB0VYUFVTRFQJAAIBCQCsAgICG1BheW1lbnQgYXR0YWNoZWQgc2hvdWxkIGJlIAkApAMBBQdFWFBVU0RUBAZyZXN1bHQJARJleHBlZGl0aW9uSW50ZXJuYWwCCAUBaQZjYWxsZXIIBQFpDXRyYW5zYWN0aW9uSWQEC2FjcmVzUmVzdWx0CQEFYXNJbnQBCQD8BwQFDWFjcmVzQ29udHJhY3QCCWJ1cm5BY3JlcwkAzAgCBQxTX0NPU1RfQUNSRVMFA25pbAUDbmlsCQCUCgIJAM4IAgkAzggCCQDNCAIIBQZyZXN1bHQCXzEJAQ5TY3JpcHRUcmFuc2ZlcgMFD2Vjb25vbXlDb250cmFjdAgFA3BtdAZhbW91bnQFC3VzZHRBc3NldElkCAkBFnVwZGF0ZUFjY1N0YXRzSW50ZXJuYWwCCQClCAEIBQFpBmNhbGxlcgUKeHBOZXdTTGFuZAJfMQUNcHJvbG9nQWN0aW9ucwkAlAoCCAgFBnJlc3VsdAJfMgJfMQULYWNyZXNSZXN1bHQBaQEKZXhwZWRpdGlvbgIHbWVzc2FnZQNzaWcEDXByb2xvZ0FjdGlvbnMJAQZwcm9sb2cBBQFpAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwAACQACAQIUTm8gcGF5bWVudHMgcmVxdWlyZWQECHVzZXJBZGRyCQClCAEIBQFpBmNhbGxlcgQBZgkBDGZsaWdodENvbW1vbgMFCHVzZXJBZGRyBQdtZXNzYWdlBQNzaWcEC2R1Y2tBc3NldElkCAUBZgJfMgQJa2V5SGVhbHRoCQENa2V5RHVja0hlYWx0aAEFC2R1Y2tBc3NldElkBAVicEtleQkBEWtleUJhY2twYWNrQnlEdWNrAQULZHVja0Fzc2V0SWQEC2N1cnJlbnRQYWNrCQELZ2V0QmFja3BhY2sBBQVicEtleQQFbUxpc3QJALUJAgkAkQMCBQtjdXJyZW50UGFjawUIYnBJZHhNYXQCAV8EBm5ld01hdAkAuQkCCQERc3VidHJhY3RNYXRlcmlhbHMDBgUFbUxpc3QFDEVYUE1BVEVSSUFMUwIBXwQFZXFLZXkJARBrZXlEdWNrRXF1aXBtZW50AQULZHVja0Fzc2V0SWQECWN1cnJlbnRFcQkBC3ZhbHVlT3JFbHNlAgkAoggBBQVlcUtleQIXLDssXyw7LF8sOyxfLDssXyw7LF8sOywEDSR0MDgyMzkxODI0OTcJARFzdWJ0cmFjdEVxdWlwbWVudAIFCWN1cnJlbnRFcQgFAWYCXzUEBW5ld0VxCAUNJHQwODIzOTE4MjQ5NwJfMQQPc2hvdWxkWmVyb0J1ZmZzCAUNJHQwODIzOTE4MjQ5NwJfMgQHaWdub3JlZAgFDSR0MDgyMzkxODI0OTcCXzMEAWUJARJleHBlZGl0aW9uSW50ZXJuYWwCCAUBaQZjYWxsZXIIBQFpDXRyYW5zYWN0aW9uSWQEAmlkCAgFAWUCXzICXzEEBnJlc3VsdAMJAGcCAAAIBQFmAl8xCQCVCgMJAMwIAgkBDEludGVnZXJFbnRyeQIFCWtleUhlYWx0aAAACQDMCAIJAQtTdHJpbmdFbnRyeQIFBWVxS2V5BQVuZXdFcQUDbmlsAgAAAAkAlQoDCQDOCAIIBQFlAl8xAwUPc2hvdWxkWmVyb0J1ZmZzCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQxrZXlEdWNrQnVmZnMBBQtkdWNrQXNzZXRJZAIJMF8wXzBfMF8wBQNuaWwJAM0IAgkAzQgCCQDNCAIJAM0IAgUDbmlsCQELU3RyaW5nRW50cnkCCQEPa2V5RHVja0xvY2F0aW9uAQULZHVja0Fzc2V0SWQJALkJAgkAzAgCCAgFAWUCXzICXzIJAMwIAgIBTAkAzAgCBQJpZAUDbmlsAgFfCQEMSW50ZWdlckVudHJ5AgUJa2V5SGVhbHRoCAUBZgJfMQkBC1N0cmluZ0VudHJ5AgUFZXFLZXkFBW5ld0VxCQELU3RyaW5nRW50cnkCBQVicEtleQkAuQkCCQDMCAIJAJEDAgULY3VycmVudFBhY2sFCmJwSWR4TGV2ZWwJAMwIAgkAkQMCBQtjdXJyZW50UGFjawUIYnBJZHhSZXMJAMwIAgUGbmV3TWF0CQDMCAIJAJEDAgULY3VycmVudFBhY2sFCWJwSWR4UHJvZAUDbmlsAgE6BQJpZAgFAWYCXzMDCQEPY2hlY2tUb3VybmFtZW50AQULZHVja0Fzc2V0SWQJAAIBAhpleHBlZGl0aW9uX2NoZWNrVG91cm5hbWVudAQLYWNyZXNSZXN1bHQJAQVhc0ludAEJAPwHBAUNYWNyZXNDb250cmFjdAIJYnVybkFjcmVzCQDMCAIFDFNfQ09TVF9BQ1JFUwUDbmlsBQNuaWwJAJQKAgkAzggCCQDOCAIIBQZyZXN1bHQCXzEICQEXdXBkYXRlRHVja1N0YXRzSW50ZXJuYWwCBQtkdWNrQXNzZXRJZAUKeHBOZXdTTGFuZAJfMQUNcHJvbG9nQWN0aW9ucwkAlQoDCAUGcmVzdWx0Al8yCAUGcmVzdWx0Al8zBQthY3Jlc1Jlc3VsdAFpARBidXlTTGFuZEZvckFjcmVzAAQNcHJvbG9nQWN0aW9ucwkBBnByb2xvZwEFAWkDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEJAAIBAiJleGFjdGx5IDEgcGF5bWVudCBtdXN0IGJlIGF0dGFjaGVkBANwbXQJAJEDAggFAWkIcGF5bWVudHMAAAQDYW10CAUDcG10BmFtb3VudAMDCQEBIQEJAQlpc0RlZmluZWQBCAUDcG10B2Fzc2V0SWQGCQECIT0CCQEFdmFsdWUBCAUDcG10B2Fzc2V0SWQFDGFjcmVzQXNzZXRJZAkAAgECFEFDUkVTIHBheW1lbnRzIG9ubHkhAwkBAiE9AgUDYW10BQxTX0NPU1RfQUNSRVMJAAIBCQCsAgICG1BheW1lbnQgYXR0YWNoZWQgc2hvdWxkIGJlIAkApAMBBQxTX0NPU1RfQUNSRVMEBnJlc3VsdAkBEmV4cGVkaXRpb25JbnRlcm5hbAIIBQFpBmNhbGxlcggFAWkNdHJhbnNhY3Rpb25JZAQLYWNyZXNSZXN1bHQJAQVhc0ludAEJAPwHBAUNYWNyZXNDb250cmFjdAIJYnVybkFjcmVzCQDMCAIFDFNfQ09TVF9BQ1JFUwUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQxhY3Jlc0Fzc2V0SWQFA2FtdAUDbmlsCQCUCgIJAM4IAgkAzggCCAUGcmVzdWx0Al8xCAkBFnVwZGF0ZUFjY1N0YXRzSW50ZXJuYWwCCQClCAEIBQFpBmNhbGxlcgUKeHBOZXdTTGFuZAJfMQUNcHJvbG9nQWN0aW9ucwkAlAoCCAgFBnJlc3VsdAJfMgJfMQULYWNyZXNSZXN1bHQBaQEMdXBncmFkZUluZnJhAQtsYW5kQXNzZXRJZAQNcHJvbG9nQWN0aW9ucwkBBnByb2xvZwEFAWkDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAAJAAIBAhRObyBwYXltZW50cyByZXF1aXJlZAQGcmVzdWx0CQENdXBJbmZyYUNvbW1vbgQGCAUBaQZjYWxsZXIAAAULbGFuZEFzc2V0SWQEC2R1Y2tBc3NldElkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKIIAQkBFGtleVN0YWtlZER1Y2tCeU93bmVyAQkApQgBCAUBaQZjYWxsZXICHFlvdSBkb24ndCBoYXZlIGEgZHVjayBzdGFrZWQJAJQKAgkAzggCCQDOCAIIBQZyZXN1bHQCXzEFDXByb2xvZ0FjdGlvbnMICQEXdXBkYXRlRHVja1N0YXRzSW50ZXJuYWwCBQtkdWNrQXNzZXRJZAkAawMFDnhwVXBncmFkZUluZnJhCAUGcmVzdWx0Al8zBQVNVUxUOAJfMQgFBnJlc3VsdAJfMgFpARBhY3RpdmF0ZUFydGlmYWN0AgdhcnROYW1lDmxhbmRBc3NldElkT3B0BA1wcm9sb2dBY3Rpb25zCQEGcHJvbG9nAQUBaQMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAAkAAgECFE5vIHBheW1lbnRzIHJlcXVpcmVkBARhZGRyCQClCAEIBQFpBmNhbGxlcgQGcmVzdWx0BAckbWF0Y2gwBQdhcnROYW1lAwkAAAICB1BSRVNBTEUFByRtYXRjaDAJARJhY3RpdmF0ZVByZXNhbGVBcnQCBQRhZGRyBQ5sYW5kQXNzZXRJZE9wdAMJAAACAgdPTkJPQVJEBQckbWF0Y2gwCQESYWN0aXZhdGVPbmJvYXJkQXJ0AQUEYWRkcgkAAgECEFVua25vd24gYXJ0aWZhY3QJAM4IAgUGcmVzdWx0BQ1wcm9sb2dBY3Rpb25zAWkBCm1lcmdlTGFuZHMBDGxhbmRBc3NldElkcwQNcHJvbG9nQWN0aW9ucwkBBnByb2xvZwEFAWkDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAAJAAIBAhRObyBwYXltZW50cyByZXF1aXJlZAQGcmVzdWx0CQELbWVyZ2VDb21tb24CCQClCAEIBQFpBmNhbGxlcgUMbGFuZEFzc2V0SWRzCQCUCgIJAM4IAgkAzggCCAUGcmVzdWx0Al8xBQ1wcm9sb2dBY3Rpb25zCAkBFnVwZGF0ZUFjY1N0YXRzSW50ZXJuYWwCCQClCAEIBQFpBmNhbGxlcgUHeHBNZXJnZQJfMQgFBnJlc3VsdAJfMgFpAQ1jYXJnb0V4Y2hhbmdlAgxjYXJnb0xpc3RTdHILbGFuZEFzc2V0SWQEDXByb2xvZ0FjdGlvbnMJAQZwcm9sb2cBBQFpAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwAACQACAQIUTm8gcGF5bWVudHMgcmVxdWlyZWQECmNhcmdvUGFydHMJALwJAgUMY2FyZ29MaXN0U3RyAgE6BARhZGRyCQClCAEIBQFpDG9yaWdpbkNhbGxlcgQFYXNzZXQJAQV2YWx1ZQEJAOwHAQkA2QQBBQtsYW5kQXNzZXRJZAQHdGltZUtleQkBFmtleVN0YWtlZFRpbWVCeUFzc2V0SWQBBQtsYW5kQXNzZXRJZAMJAQEhAQkBCWlzRGVmaW5lZAEJAJ8IAQUHdGltZUtleQkAAgEJAKwCAggFBWFzc2V0BG5hbWUCDiBpcyBub3Qgc3Rha2VkBAVvd25lcgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCiCAEJARVrZXlMYW5kQXNzZXRJZFRvT3duZXIBBQtsYW5kQXNzZXRJZAkArAICCQCsAgICBE5GVCAIBQVhc3NldARuYW1lAgwgaXMgb3JwaGFuZWQDCQECIT0CBQVvd25lcgUEYWRkcgkAAgEJAKwCAgUKTEFORFBSRUZJWAINIGlzIG5vdCB5b3VycwQJbGFuZEluZGV4CQBpAgkBD251bVBpZWNlc0J5U2l6ZQEJAJEDAgkAtQkCCAUFYXNzZXQLZGVzY3JpcHRpb24CAV8FC3JlY0xhbmRTaXplBQVTU0laRQQKaW5mcmFMZXZlbAkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEWa2V5SW5mcmFMZXZlbEJ5QXNzZXRJZAEFC2xhbmRBc3NldElkAAAEC2R1Y2tBc3NldElkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKIIAQkBFGtleVN0YWtlZER1Y2tCeU93bmVyAQUEYWRkcgIcWW91IGRvbid0IGhhdmUgYSBkdWNrIHN0YWtlZAQLY3VyTG9jYXRpb24JAQt2YWx1ZU9yRWxzZQIJAKIIAQkBD2tleUR1Y2tMb2NhdGlvbgEFC2R1Y2tBc3NldElkBQ9ERUZBVUxUTE9DQVRJT04EA2xvYwkAtQkCCQEFdmFsdWUBBQtjdXJMb2NhdGlvbgIBXwMJAQIhPQIJAJEDAgUDbG9jBQpsb2NJZHhUeXBlAgFMCQACAQkArAICCQCsAgICFkR1Y2sgbG9jYXRpb24gdHlwZSBpcyAJAJEDAgUDbG9jBQpsb2NJZHhUeXBlAhEsIGJ1dCBzaG91bGQgYmUgTAMJAQIhPQIJAJEDAgUDbG9jBQhsb2NJZHhJZAULbGFuZEFzc2V0SWQJAAIBCQCsAgICG0R1Y2sgc2hvdWxkIGJlIG9uIHRoZSBsYW5kIAULbGFuZEFzc2V0SWQEBXdoS2V5CQESa2V5V2FyZWhvdXNlQnlMYW5kAQULbGFuZEFzc2V0SWQECWN1cnJlbnRXaAkBDGdldFdhcmVob3VzZQMFBXdoS2V5BQlsYW5kSW5kZXgFCmluZnJhTGV2ZWwEBWJwS2V5CQERa2V5QmFja3BhY2tCeUR1Y2sBBQtkdWNrQXNzZXRJZAQLY3VycmVudFBhY2sJAQtnZXRCYWNrcGFjawEFBWJwS2V5BAZyZXN1bHQJAQltb3ZlU3R1ZmYDBQpjYXJnb1BhcnRzBQljdXJyZW50V2gFC2N1cnJlbnRQYWNrBARsb2Z0CQC1CQIJAJEDAgUJY3VycmVudFdoBQl3aElkeExPRlQCAV8EBWxvZnRPCQBkAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBGxvZnQFC3ZvbE9jY3VwaWVkCAUGcmVzdWx0Al83BAVsb2Z0RgkAZQIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQRsb2Z0BQd2b2xGcmVlCAUGcmVzdWx0Al83CQDOCAIJAMwIAgkBC1N0cmluZ0VudHJ5AgUFYnBLZXkJALoJAgkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQpicElkeExldmVsCQDMCAIIBQZyZXN1bHQCXzQJAMwIAggFBnJlc3VsdAJfNQkAzAgCCAUGcmVzdWx0Al82BQNuaWwCAToJAMwIAgkBC1N0cmluZ0VudHJ5AgUFd2hLZXkJALoJAgkAzAgCCQCRAwIFCWN1cnJlbnRXaAULd2hJZHhMZXZlbHMJAMwIAggFBnJlc3VsdAJfMQkAzAgCCAUGcmVzdWx0Al8yCQDMCAIIBQZyZXN1bHQCXzMJAMwIAgkAuQkCCQDMCAIJAJEDAgUEbG9mdAUJdm9sTG9ja2VkCQDMCAIJAKQDAQUFbG9mdE8JAMwIAgkApAMBBQVsb2Z0RgkAzAgCCQCRAwIFBGxvZnQFCHZvbFRvdGFsBQNuaWwCAV8FA25pbAIBOgUDbmlsBQ1wcm9sb2dBY3Rpb25zAWkBDXNhdmVXYXJlaG91c2UCBXdoU3RyC2xhbmRBc3NldElkAwkBAiE9AggFAWkGY2FsbGVyBQ9lY29ub215Q29udHJhY3QJAAIBAg1BY2Nlc3MgZGVuaWVkBAV3aEtleQkBEmtleVdhcmVob3VzZUJ5TGFuZAEFC2xhbmRBc3NldElkBAJ3aAkAvAkCBQV3aFN0cgIBOgMJAQIhPQIJAJADAQUCd2gABQkAAgECMHdhcmVob3VzZSBzdHJpbmcgc2hvdWxkIGNvbnRhaW4gNCAnOicgc2VwYXJhdG9ycwQFbG9mdEwJAJEDAgkAtQkCCQCRAwIFAndoBQl3aElkeExPRlQCAV8FCXZvbExvY2tlZAQFbG9mdE8JARdnZXRXYXJlaG91c2VPY2N1cGllZFZvbAEFAndoBAVsb2Z0VAkBF2dldFdhcmVob3VzZVRvdGFsVm9sdW1lAQkAkQMCBQJ3aAULd2hJZHhMZXZlbHMEBWxvZnRGCQBlAgkAZQIFBWxvZnRUCQENcGFyc2VJbnRWYWx1ZQEFBWxvZnRMBQVsb2Z0TwMJAGYCAAAFBWxvZnRGCQACAQIwT3BlcmF0aW9uIGxlYWRzIHRvIG5lZ2F0aXZlIGZyZWUgd2FyZWhvdXNlIHNwYWNlBAhuZXdXaFN0cgkAugkCCQDMCAIJAJEDAgUCd2gFC3doSWR4TGV2ZWxzCQDMCAIJAJEDAgUCd2gFCHdoSWR4UmVzCQDMCAIJAJEDAgUCd2gFCHdoSWR4TWF0CQDMCAIJAJEDAgUCd2gFCXdoSWR4UHJvZAkAzAgCCQC5CQIJAMwIAgUFbG9mdEwJAMwIAgkApAMBBQVsb2Z0TwkAzAgCCQCkAwEFBWxvZnRGCQDMCAIJAKQDAQUFbG9mdFQFA25pbAIBXwUDbmlsAgE6CQCUCgIJAMwIAgkBC1N0cmluZ0VudHJ5AgUFd2hLZXkFCG5ld1doU3RyBQNuaWwFCG5ld1doU3RyAWkBDXNldEN1c3RvbU5hbWUDB2Fzc2V0SWQKY3VzdG9tTmFtZQR0eXBlBA1wcm9sb2dBY3Rpb25zCQEGcHJvbG9nAQUBaQMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECHEV4YWN0bHkgb25lIHBheW1lbnQgcmVxdWlyZWQEA3BtdAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwAAAwkBAiE9AggFA3BtdAdhc3NldElkBQt1c2R0QXNzZXRJZAkAAgECGkFsbG93ZWQgVVNEVCBwYXltZW50IG9ubHkhAwkBAiE9AggFA3BtdAZhbW91bnQFDFJFTkFNSU5HQ09TVAkAAgEJAKwCAgISUGF5bWVudCBzaG91bGQgYmUgCQCkAwEFDFJFTkFNSU5HQ09TVAMJAQhjb250YWlucwIFCmN1c3RvbU5hbWUCAl9fCQACAQkArAICAh5OYW1lIHNob3VsZCBub3QgY29udGFpbiAnX18nOiAFCmN1c3RvbU5hbWUDCQBmAgkAsQIBBQpjdXN0b21OYW1lBQpNQVhOQU1FTEVOCQACAQkArAICAhlOYW1lIHRvbyBsb25nLCBtYXhMZW5ndGg9CQCkAwEFCk1BWE5BTUVMRU4EBGFkZHIJAKUIAQgFAWkMb3JpZ2luQ2FsbGVyBAdhY3Rpb25zBAckbWF0Y2gwBQR0eXBlAwkAAAICB0FDQ09VTlQFByRtYXRjaDAECnJldmVyc2VLZXkJARZrZXlDdXN0b21OYW1lVG9BZGRyZXNzAQUKY3VzdG9tTmFtZQQJbmFtZU93bmVyCQCiCAEFCnJldmVyc2VLZXkDCQEJaXNEZWZpbmVkAQUJbmFtZU93bmVyCQACAQkArAICAhlOYW1lIGFscmVhZHkgcmVnaXN0ZXJlZDogBQpjdXN0b21OYW1lBA1hZGRyVG9OYW1lS2V5CQEWa2V5QWRkcmVzc1RvQ3VzdG9tTmFtZQEFBGFkZHIEB29sZE5hbWUJAKIIAQUNYWRkclRvTmFtZUtleQQHZnJlZU9sZAMJAQlpc0RlZmluZWQBBQdvbGROYW1lCQDMCAIJAQtEZWxldGVFbnRyeQEJARZrZXlDdXN0b21OYW1lVG9BZGRyZXNzAQkBBXZhbHVlAQUHb2xkTmFtZQUDbmlsBQNuaWwJAM4IAgkAzQgCCQDNCAIFB2ZyZWVPbGQJAQtTdHJpbmdFbnRyeQIFDWFkZHJUb05hbWVLZXkFCmN1c3RvbU5hbWUJAQtTdHJpbmdFbnRyeQIFCnJldmVyc2VLZXkFBGFkZHIICQEWdXBkYXRlQWNjU3RhdHNJbnRlcm5hbAIFBGFkZHIFDHhwQ3VzdG9tTmFtZQJfMQMJAAACAgRMQU5EBQckbWF0Y2gwBAVhc3NldAkBBXZhbHVlAQkA7AcBCQDZBAEFB2Fzc2V0SWQEB3RpbWVLZXkJARZrZXlTdGFrZWRUaW1lQnlBc3NldElkAQUHYXNzZXRJZAMJAQEhAQkBCWlzRGVmaW5lZAEJAJ8IAQUHdGltZUtleQkAAgEJAKwCAggFBWFzc2V0BG5hbWUCDiBpcyBub3Qgc3Rha2VkBAVvd25lcgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCiCAEJARVrZXlMYW5kQXNzZXRJZFRvT3duZXIBBQdhc3NldElkCQCsAgIJAKwCAgIETkZUIAgFBWFzc2V0BG5hbWUCDCBpcyBvcnBoYW5lZAMJAQIhPQIFBW93bmVyBQRhZGRyCQACAQkArAICBQpMQU5EUFJFRklYAg0gaXMgbm90IHlvdXJzBApyZXZlcnNlS2V5CQEaa2V5TGFuZEN1c3RvbU5hbWVUb0Fzc2V0SWQBBQpjdXN0b21OYW1lBAluYW1lT3duZXIJAKIIAQUKcmV2ZXJzZUtleQMJAQlpc0RlZmluZWQBBQluYW1lT3duZXIJAAIBCQCsAgICGU5hbWUgYWxyZWFkeSByZWdpc3RlcmVkOiAFCmN1c3RvbU5hbWUEDmFzc2V0VG9OYW1lS2V5CQEaa2V5TGFuZEFzc2V0SWRUb0N1c3RvbU5hbWUBBQdhc3NldElkBAdvbGROYW1lCQCiCAEFDmFzc2V0VG9OYW1lS2V5BAdmcmVlT2xkAwkBCWlzRGVmaW5lZAEFB29sZE5hbWUJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBGmtleUxhbmRDdXN0b21OYW1lVG9Bc3NldElkAQkBBXZhbHVlAQUHb2xkTmFtZQUDbmlsBQNuaWwJAM4IAgkAzQgCCQDNCAIFB2ZyZWVPbGQJAQtTdHJpbmdFbnRyeQIFDmFzc2V0VG9OYW1lS2V5BQpjdXN0b21OYW1lCQELU3RyaW5nRW50cnkCBQpyZXZlcnNlS2V5BQdhc3NldElkCAkBFnVwZGF0ZUFjY1N0YXRzSW50ZXJuYWwCBQRhZGRyBQx4cEN1c3RvbU5hbWUCXzEDCQAAAgIERFVDSwUHJG1hdGNoMAQFYXNzZXQJAQV2YWx1ZQEJAOwHAQkA2QQBBQdhc3NldElkBAd0aW1lS2V5CQEWa2V5U3Rha2VkVGltZUJ5QXNzZXRJZAEFB2Fzc2V0SWQDAwkBASEBCQEJaXNEZWZpbmVkAQkAnwgBBQd0aW1lS2V5BgkBASEBCQEJaXNEZWZpbmVkAQkAoggBCQEUa2V5U3Rha2VkRHVja0J5T3duZXIBBQRhZGRyCQACAQkArAICCAUFYXNzZXQEbmFtZQIOIGlzIG5vdCBzdGFrZWQEBW93bmVyCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKIIAQkBEGtleUR1Y2tJZFRvT3duZXIBBQdhc3NldElkCQCsAgIJAKwCAgIETkZUIAgFBWFzc2V0BG5hbWUCDCBpcyBvcnBoYW5lZAMJAQIhPQIFBW93bmVyBQRhZGRyCQACAQkArAICBQpEVUNLUFJFRklYAg0gaXMgbm90IHlvdXJzBApyZXZlcnNlS2V5CQEaa2V5RHVja0N1c3RvbU5hbWVUb0Fzc2V0SWQBBQpjdXN0b21OYW1lBAluYW1lT3duZXIJAKIIAQUKcmV2ZXJzZUtleQMJAQlpc0RlZmluZWQBBQluYW1lT3duZXIJAAIBCQCsAgICGU5hbWUgYWxyZWFkeSByZWdpc3RlcmVkOiAFCmN1c3RvbU5hbWUEDmFzc2V0VG9OYW1lS2V5CQEaa2V5RHVja0Fzc2V0SWRUb0N1c3RvbU5hbWUBBQdhc3NldElkBAdvbGROYW1lCQCiCAEFDmFzc2V0VG9OYW1lS2V5BAdmcmVlT2xkAwkBCWlzRGVmaW5lZAEFB29sZE5hbWUJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBGmtleUR1Y2tDdXN0b21OYW1lVG9Bc3NldElkAQkBBXZhbHVlAQUHb2xkTmFtZQUDbmlsBQNuaWwJAM4IAgkAzQgCCQDNCAIFB2ZyZWVPbGQJAQtTdHJpbmdFbnRyeQIFDmFzc2V0VG9OYW1lS2V5BQpjdXN0b21OYW1lCQELU3RyaW5nRW50cnkCBQpyZXZlcnNlS2V5BQdhc3NldElkCAkBF3VwZGF0ZUR1Y2tTdGF0c0ludGVybmFsAgUHYXNzZXRJZAUMeHBDdXN0b21OYW1lAl8xCQACAQITVW5rbm93biBlbnRpdHkgdHlwZQkAlAoCCQDOCAIJAM0IAgUHYWN0aW9ucwkBDlNjcmlwdFRyYW5zZmVyAwUPZWNvbm9teUNvbnRyYWN0CAUDcG10BmFtb3VudAULdXNkdEFzc2V0SWQFDXByb2xvZ0FjdGlvbnMAAAFpAQxzZXRSZWZlcnJhbHMCCW9sZFBsYXllcgluZXdQbGF5ZXIDCQECIT0CCAUBaQ9jYWxsZXJQdWJsaWNLZXkFA3B1YgkAAgECEVBlcm1pc3Npb24gZGVuaWVkBA1wcm9sb2dBY3Rpb25zCQEGcHJvbG9nAQUBaQMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAAkAAgECFE5vIHBheW1lbnRzIHJlcXVpcmVkAwkBASEBCQEJaXNEZWZpbmVkAQkApggBBQlvbGRQbGF5ZXIJAAIBCQCsAgICEUludmFsaWQgYWRkcmVzczogBQlvbGRQbGF5ZXIECm5ld2JpZUFkZHIJAKYIAQUJbmV3UGxheWVyAwkBASEBCQEJaXNEZWZpbmVkAQUKbmV3YmllQWRkcgkAAgEJAKwCAgIRSW52YWxpZCBhZGRyZXNzOiAFCW5ld1BsYXllcgQJb2xkTGFzdFR4CQCiCAEJARFrZXlMYXN0VHhJZEJ5VXNlcgEFCW9sZFBsYXllcgMJAQEhAQkBCWlzRGVmaW5lZAEFCW9sZExhc3RUeAkAAgECIm9sZFBsYXllciBkaWRuJ3QgZG8gYW55IHR4IGluIGdhbWUDCQBnAgAACAkA7wcBCQEFdmFsdWUBBQpuZXdiaWVBZGRyCWF2YWlsYWJsZQkAAgECFm5ld1BsYXllciBoYXMgbm8gV0FWRVMEB29sZHNLZXkJAQlrZXlPbGRpZXMABARvbGRzCQCiCAEFB29sZHNLZXkEBm9sZGllcwMJAQlpc0RlZmluZWQBBQRvbGRzCQC8CQIJAQV2YWx1ZQEFBG9sZHMCAV8FA25pbAMJAQ9jb250YWluc0VsZW1lbnQCBQZvbGRpZXMFCW5ld1BsYXllcgkAAgEJAKwCAgUJbmV3UGxheWVyAiYgaXMgbm90IG5ld2JpZSAoYWxyZWFkeSBoYXMgcmVmZXJyYWxzKQQIcmVmQnlLZXkJAQ9rZXlBZGRyZXNzUmVmQnkBBQluZXdQbGF5ZXIEBXJlZkJ5CQCiCAEFCHJlZkJ5S2V5AwMJAQlpc0RlZmluZWQBBQVyZWZCeQkBCWlzRGVmaW5lZAEJAKYIAQkBBXZhbHVlAQUFcmVmQnkHCQACAQkArAICCQCsAgIFCW5ld1BsYXllcgIUIGFscmVhZHkgaGFzIHJlZkJ5OiAJAQV2YWx1ZQEFBXJlZkJ5BAdyZWZzS2V5CQETa2V5QWRkcmVzc1JlZmVycmFscwEFCW9sZFBsYXllcgQEcmVmcwkAoggBBQdyZWZzS2V5BAlyZWZzQXJyYXkDCQEJaXNEZWZpbmVkAQUEcmVmcwkAvAkCCQEFdmFsdWUBBQRyZWZzAgFfBQNuaWwDCQEPY29udGFpbnNFbGVtZW50AgUJcmVmc0FycmF5BQluZXdQbGF5ZXIJAAIBCQCsAgIJAKwCAgkArAICBQlvbGRQbGF5ZXICEiBhbHJlYWR5IGNvbnRhaW5zIAUJbmV3UGxheWVyAhEgd2l0aGluIHJlZmVycmFscwQHbmV3UmVmcwkAugkCCQDNCAIFCXJlZnNBcnJheQUJbmV3UGxheWVyAgFfBAduZXdPbGRzAwkBD2NvbnRhaW5zRWxlbWVudAIFBm9sZGllcwUJb2xkUGxheWVyCQEFdmFsdWUBBQRvbGRzCQC6CQIJAM0IAgUGb2xkaWVzBQlvbGRQbGF5ZXICAV8JAJQKAgkAzggCCQDMCAIJAQtTdHJpbmdFbnRyeQIFCHJlZkJ5S2V5BQlvbGRQbGF5ZXIJAMwIAgkBC1N0cmluZ0VudHJ5AgUHcmVmc0tleQUHbmV3UmVmcwkAzAgCCQELU3RyaW5nRW50cnkCBQdvbGRzS2V5BQduZXdPbGRzBQNuaWwFDXByb2xvZ0FjdGlvbnMAAAFpARBkaXN0cmlidXRlUG9pbnRzBQhzdHJlbmd0aAhhY2N1cmFjeQlpbnRlbGxlY3QJZW5kdXJhbmNlCWRleHRlcml0eQQNcHJvbG9nQWN0aW9ucwkBBnByb2xvZwEFAWkDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAAJAAIBAhRObyBwYXltZW50cyByZXF1aXJlZAQEYWRkcgkApQgBCAUBaQxvcmlnaW5DYWxsZXIEC3ZpcnRXbGdEYXRhCQEJYXNBbnlMaXN0AQkA/AcEBQt3bGdDb250cmFjdAISY2hlY2tXbGdYcFJFQURPTkxZCQDMCAIFBGFkZHIFA25pbAUDbmlsBA12aXJ0V2xnUG9pbnRzCQEFYXNJbnQBCQCRAwIFC3ZpcnRXbGdEYXRhAAEEDSR0MDk4MzA5OTg2OTkDCQBnAgAABQ12aXJ0V2xnUG9pbnRzCQCUCgIAAAUDbmlsBAdkZWx0YVhQCQEFYXNJbnQBCQD8BwQFC3dsZ0NvbnRyYWN0Agl0YWtlV2xnWHAJAMwIAgUEYWRkcgUDbmlsBQNuaWwDCQAAAgUHZGVsdGFYUAUHZGVsdGFYUAkAlAoCBQ12aXJ0V2xnUG9pbnRzCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEMa2V5VXNlckxldmVsAQUEYWRkcgkBBWFzSW50AQkAkQMCBQt2aXJ0V2xnRGF0YQAACQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEJa2V5VXNlclhQAQUEYWRkcgkBBWFzSW50AQkAkQMCBQt2aXJ0V2xnRGF0YQACBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4ECXdsZ1BvaW50cwgFDSR0MDk4MzA5OTg2OTkCXzEECndsZ0FjdGlvbnMIBQ0kdDA5ODMwOTk4Njk5Al8yBAtkdWNrQXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCiCAEJARRrZXlTdGFrZWREdWNrQnlPd25lcgEFBGFkZHICHFlvdSBkb24ndCBoYXZlIGEgZHVjayBzdGFrZWQECmZyZWVLZXlBY2MJARFrZXlVc2VyRnJlZVBvaW50cwEFBGFkZHIEDWZyZWVQb2ludHNBY2MJAGQCCQELdmFsdWVPckVsc2UCCQCfCAEFCmZyZWVLZXlBY2MAAAUJd2xnUG9pbnRzBAtmcmVlS2V5RHVjawkBEWtleUR1Y2tGcmVlUG9pbnRzAQULZHVja0Fzc2V0SWQEDmZyZWVQb2ludHNEdWNrCQELdmFsdWVPckVsc2UCCQCfCAEFC2ZyZWVLZXlEdWNrAAAEB3N1bUZyZWUJAGQCBQ1mcmVlUG9pbnRzQWNjBQ5mcmVlUG9pbnRzRHVjawQPc3VtVG9EaXN0cmlidXRlCQBkAgkAZAIJAGQCCQBkAgUIc3RyZW5ndGgFCGFjY3VyYWN5BQlpbnRlbGxlY3QFCWVuZHVyYW5jZQUJZGV4dGVyaXR5AwkAZgIFD3N1bVRvRGlzdHJpYnV0ZQUHc3VtRnJlZQkAAgEJAKwCAgkArAICAg9UaGVyZSBhcmUgb25seSAJAKQDAQUHc3VtRnJlZQIaIGZyZWUgcG9pbnRzIHRvIGRpc3RyaWJ1dGUECGNoYXJzS2V5CQEMa2V5RHVja0NoYXJzAQULZHVja0Fzc2V0SWQEBWNoYXJzCQC1CQIJAQt2YWx1ZU9yRWxzZQIJAKIIAQUIY2hhcnNLZXkCCTBfMF8wXzBfMAIBXwQGbmV3QWNjCQBlAgUNZnJlZVBvaW50c0FjYwUPc3VtVG9EaXN0cmlidXRlCQCUCgIJAM4IAgkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQpmcmVlS2V5QWNjAwkAZgIAAAUGbmV3QWNjAAAFBm5ld0FjYwkAzAgCCQEMSW50ZWdlckVudHJ5AgULZnJlZUtleUR1Y2sDCQBmAgAABQZuZXdBY2MJAGQCBQ5mcmVlUG9pbnRzRHVjawUGbmV3QWNjBQ5mcmVlUG9pbnRzRHVjawkAzAgCCQELU3RyaW5nRW50cnkCBQhjaGFyc0tleQkAuQkCCQDMCAIJAKQDAQkAZAIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQVjaGFycwUMY2hhclN0cmVuZ3RoBQhzdHJlbmd0aAkAzAgCCQCkAwEJAGQCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUFY2hhcnMFDGNoYXJBY2N1cmFjeQUIYWNjdXJhY3kJAMwIAgkApAMBCQBkAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBWNoYXJzBQ1jaGFySW50ZWxsZWN0BQlpbnRlbGxlY3QJAMwIAgkApAMBCQBkAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBWNoYXJzBQ1jaGFyRW5kdXJhbmNlBQllbmR1cmFuY2UJAMwIAgkApAMBCQBkAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBWNoYXJzBQ1jaGFyRGV4dGVyaXR5BQlkZXh0ZXJpdHkFA25pbAIBXwUDbmlsBQ1wcm9sb2dBY3Rpb25zBQp3bGdBY3Rpb25zAAABaQEcc3BsaXRCeUdsb2JhbFdlaWdodHNSRUFET05MWQEGYW1vdW50CQCUCgIFA25pbAkBEmdldE5lZWRlZE1hdGVyaWFscwEFBmFtb3VudAFpASRzcGxpdEJ5R2xvYmFsQW5kTG9jYWxXZWlnaHRzUkVBRE9OTFkDCW1hdEFtb3VudAlyZXNBbW91bnQIdGVycmFpbnMEDXRlcnJhaW5Db3VudHMJAQ1jb3VudFRlcnJhaW5zAQUIdGVycmFpbnMJAJQKAgUDbmlsCQCUCgIJARJnZXROZWVkZWRNYXRlcmlhbHMBBQltYXRBbW91bnQJARNkaXN0cmlidXRlQnlXZWlnaHRzAgUJcmVzQW1vdW50BQ10ZXJyYWluQ291bnRzAWkBE2dldEJhY2twYWNrUkVBRE9OTFkBC2R1Y2tBc3NldElkCQCUCgIFA25pbAkAuQkCCQELZ2V0QmFja3BhY2sBCQERa2V5QmFja3BhY2tCeUR1Y2sBBQtkdWNrQXNzZXRJZAIBOgFpARRnZXRXYXJlaG91c2VSRUFET05MWQELbGFuZEFzc2V0SWQEBWFzc2V0CQEFdmFsdWUBCQDsBwEJANkEAQULbGFuZEFzc2V0SWQECWxhbmRJbmRleAkAaQIJAQ9udW1QaWVjZXNCeVNpemUBCQCRAwIJALUJAggFBWFzc2V0C2Rlc2NyaXB0aW9uAgFfBQtyZWNMYW5kU2l6ZQUFU1NJWkUECmluZnJhTGV2ZWwJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBFmtleUluZnJhTGV2ZWxCeUFzc2V0SWQBBQtsYW5kQXNzZXRJZAAACQCUCgIFA25pbAkAugkCCQEMZ2V0V2FyZWhvdXNlAwkBEmtleVdhcmVob3VzZUJ5TGFuZAEFC2xhbmRBc3NldElkBQlsYW5kSW5kZXgFCmluZnJhTGV2ZWwCAToBaQEKc2F2ZUxhc3RUeAADCQEBIQEJAQ9jb250YWluc0VsZW1lbnQCCQDMCAIFC3dsZ0NvbnRyYWN0CQDMCAIFD2Vjb25vbXlDb250cmFjdAkAzAgCBRJ0b3VybmFtZW50Q29udHJhY3QJAMwIAgUNYWNyZXNDb250cmFjdAUDbmlsCAUBaQZjYWxsZXIJAAIBAg1BY2Nlc3MgZGVuaWVkCQCUCgIJAQZwcm9sb2cBBQFpACoBaQEPdXBkYXRlRHVja1N0YXRzAgtkdWNrQXNzZXRJZAdkZWx0YVhQAwkBAiE9AggFAWkGY2FsbGVyBQ9lY29ub215Q29udHJhY3QJAAIBAg1BY2Nlc3MgZGVuaWVkCQEXdXBkYXRlRHVja1N0YXRzSW50ZXJuYWwCBQtkdWNrQXNzZXRJZAUHZGVsdGFYUAFpAQ51cGRhdGVBY2NTdGF0cwIEYWRkcgdkZWx0YVhQAwkBASEBCQEPY29udGFpbnNFbGVtZW50AgkAzAgCBQt3bGdDb250cmFjdAkAzAgCBQ9lY29ub215Q29udHJhY3QJAMwIAgUNYWNyZXNDb250cmFjdAUDbmlsCAUBaQZjYWxsZXIJAAIBAg1BY2Nlc3MgZGVuaWVkCQEWdXBkYXRlQWNjU3RhdHNJbnRlcm5hbAIFBGFkZHIFB2RlbHRhWFABaQEJZXF1aXBEdWNrAQllcXVpcG1lbnQEDXByb2xvZ0FjdGlvbnMJAQZwcm9sb2cBBQFpAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwAACQACAQIUTm8gcGF5bWVudHMgcmVxdWlyZWQEBGFkZHIJAKUIAQgFAWkMb3JpZ2luQ2FsbGVyBAtkdWNrQXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCiCAEJARRrZXlTdGFrZWREdWNrQnlPd25lcgEFBGFkZHICHFlvdSBkb24ndCBoYXZlIGEgZHVjayBzdGFrZWQDCQEPY2hlY2tUb3VybmFtZW50AQULZHVja0Fzc2V0SWQJAAIBAhllcXVpcER1Y2tfY2hlY2tUb3VybmFtZW50BAVlcUtleQkBEGtleUR1Y2tFcXVpcG1lbnQBBQtkdWNrQXNzZXRJZAQLY3VycmVudFNlZ3MJALUJAgkBC3ZhbHVlT3JFbHNlAgkAoggBBQVlcUtleQIXLDssXyw7LF8sOyxfLDssXyw7LF8sOywCAV8EBWJwS2V5CQERa2V5QmFja3BhY2tCeUR1Y2sBBQtkdWNrQXNzZXRJZAQLY3VycmVudFBhY2sJAQtnZXRCYWNrcGFjawEFBWJwS2V5BAVuZXdFcQkAtQkCBQllcXVpcG1lbnQCAV8DCQECIT0CCQCQAwEFBW5ld0VxBQtOVU1TRUdNRU5UUwkAAgECFldyb25nIGVxdWlwbWVudCBzdHJpbmcECXRlbXBQcm9kQgkBBmRyZXNzQgQFC2N1cnJlbnRTZWdzCQEOcHJvZFN0clRvQnl0ZXMBCQCRAwIFC2N1cnJlbnRQYWNrBQlicElkeFByb2QGBQNuaWwECHNlZ0JwQXV4CQCRAwIJALUJAgkAkQMCBQVuZXdFcQULc2VnQmFja3BhY2sCATsAAQQKYnVmZkVmZmVjdAMJAAACBQhzZWdCcEF1eAIAAAAEBGF1eDAJAJEDAgkAtQkCBQhzZWdCcEF1eAIBLAAAAwkAAAIFBGF1eDACAAAABAZpZHhDbnQJALUJAgUEYXV4MAIBOgQDaWR4CQCRAwIFBmlkeENudAAABANjbnQJAJEDAgUGaWR4Q250AAEDAwMDAwkAAAIFA2lkeAICMDYGCQAAAgUDaWR4AgIwNwYJAAACBQNpZHgCAjA4CQECIT0CBQNjbnQCAAcJAGYCCQENcGFyc2VJbnRWYWx1ZQEFA2NudAAABwkBDXBhcnNlSW50VmFsdWUBCQCRAwIJALUJAgkAkQMCBRBwcm9kdWN0aW9uTWF0cml4CQENcGFyc2VJbnRWYWx1ZQEFA2lkeAIBXwUKcklkeEVmZmVjdAAABAVzdGF0cwkBDGdldER1Y2tTdGF0cwQFBHRoaXMFC2R1Y2tBc3NldElkBQpidWZmRWZmZWN0BgQIbmV3UHJvZEIJAQZkcmVzc0IEBQVuZXdFcQUJdGVtcFByb2RCBwUFc3RhdHMECm5ld1Byb2RTdHIJAQ5ieXRlc1RvUHJvZFN0cgEFCG5ld1Byb2RCCQCUCgIJAM4IAgkAzAgCCQELU3RyaW5nRW50cnkCBQVlcUtleQUJZXF1aXBtZW50CQDMCAIJAQtTdHJpbmdFbnRyeQIFBWJwS2V5CQC6CQIJAMwIAgkAkQMCBQtjdXJyZW50UGFjawUKYnBJZHhMZXZlbAkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQhicElkeFJlcwkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQhicElkeE1hdAkAzAgCBQpuZXdQcm9kU3RyBQNuaWwCAToJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDGtleUR1Y2tCdWZmcwEFC2R1Y2tBc3NldElkCQC5CQIJAMwIAgkApAMBCQCRAwIFBXN0YXRzAAcJAMwIAgkApAMBCQCRAwIFBXN0YXRzAAgJAMwIAgkApAMBCQCRAwIFBXN0YXRzAAkJAMwIAgkApAMBCQCRAwIFBXN0YXRzAAoJAMwIAgkApAMBCQCRAwIFBXN0YXRzAAsFA25pbAIBXwUDbmlsBQ1wcm9sb2dBY3Rpb25zAAABaQETaW5pdER1Y2tUb3VyQXR0ZW1wdAELZHVja0Fzc2V0SWQDCQECIT0CCAUBaQZjYWxsZXIFEnRvdXJuYW1lbnRDb250cmFjdAkAAgECDUFjY2VzcyBkZW5pZWQECWtleUhlYWx0aAkBDWtleUR1Y2tIZWFsdGgBBQtkdWNrQXNzZXRJZAQFbWF4SFAJAQltYXhIZWFsdGgBCQELdmFsdWVPckVsc2UCCQCfCAEJAQxrZXlEdWNrTGV2ZWwBBQtkdWNrQXNzZXRJZAAABAljdXJIZWFsdGgJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUJa2V5SGVhbHRoBQVtYXhIUAQJY3VyTG9jS2V5CQEPa2V5RHVja0xvY2F0aW9uAQULZHVja0Fzc2V0SWQEC2N1ckxvY2F0aW9uCQELdmFsdWVPckVsc2UCCQCiCAEFCWN1ckxvY0tleQUPREVGQVVMVExPQ0FUSU9OBAZsYXN0SWQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUSdG91cm5hbWVudENvbnRyYWN0BQ1sYXN0VG91cklkS2V5AAAEDHRvdXJMb2NhdGlvbgkArAICCQCkAwEFBmxhc3RJZAIEX1RfMAkAlAoCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEOa2V5U2F2ZWRIZWFsdGgBBQtkdWNrQXNzZXRJZAUJY3VySGVhbHRoCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQlrZXlIZWFsdGgFBW1heEhQCQDMCAIJAQtTdHJpbmdFbnRyeQIJARBrZXlTYXZlZExvY2F0aW9uAQULZHVja0Fzc2V0SWQFC2N1ckxvY2F0aW9uCQDMCAIJAQtTdHJpbmdFbnRyeQIFCWN1ckxvY0tleQUMdG91ckxvY2F0aW9uBQNuaWwFDHRvdXJMb2NhdGlvbgFpAQxicmVha0F0dGVtcHQABA1wcm9sb2dBY3Rpb25zCQEGcHJvbG9nAQUBaQQLZHVja0Fzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAoggBCQEUa2V5U3Rha2VkRHVja0J5T3duZXIBCQClCAEIBQFpBmNhbGxlcgIcWW91IGRvbid0IGhhdmUgYSBkdWNrIHN0YWtlZAQJY3VyTG9jS2V5CQEPa2V5RHVja0xvY2F0aW9uAQULZHVja0Fzc2V0SWQEC2N1ckxvY2F0aW9uCQELdmFsdWVPckVsc2UCCQCiCAEFCWN1ckxvY0tleQUPREVGQVVMVExPQ0FUSU9OAwkBAiE9AgkAkQMCCQC1CQIFC2N1ckxvY2F0aW9uAgFfBQpsb2NJZHhUeXBlAgFUCQACAQIiWW91ciBkdWNrIGlzIG5vdCBpbiB0aGUgdG91cm5hbWVudAQLc2F2ZWRIZWFsdGgJARFAZXh0ck5hdGl2ZSgxMDU1KQEJAQ5rZXlTYXZlZEhlYWx0aAEFC2R1Y2tBc3NldElkBA1zYXZlZExvY2F0aW9uCQERQGV4dHJOYXRpdmUoMTA1OCkBCQEQa2V5U2F2ZWRMb2NhdGlvbgEFC2R1Y2tBc3NldElkCQCUCgIJAM0IAgkAzQgCBQ1wcm9sb2dBY3Rpb25zCQEMSW50ZWdlckVudHJ5AgkBDWtleUR1Y2tIZWFsdGgBBQtkdWNrQXNzZXRJZAULc2F2ZWRIZWFsdGgJAQtTdHJpbmdFbnRyeQIFCWN1ckxvY0tleQUNc2F2ZWRMb2NhdGlvbgULY3VyTG9jYXRpb24BaQEUYnJlYWtBdHRlbXB0Q2FsbGJhY2sAAwkBAiE9AggFAWkGY2FsbGVyBRJ0b3VybmFtZW50Q29udHJhY3QJAAIBAg1BY2Nlc3MgZGVuaWVkBAtkdWNrQXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCiCAEJARRrZXlTdGFrZWREdWNrQnlPd25lcgEJAKUIAQgFAWkMb3JpZ2luQ2FsbGVyAhxZb3UgZG9uJ3QgaGF2ZSBhIGR1Y2sgc3Rha2VkCQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ1rZXlEdWNrSGVhbHRoAQULZHVja0Fzc2V0SWQJARFAZXh0ck5hdGl2ZSgxMDU1KQEJAQ5rZXlTYXZlZEhlYWx0aAEFC2R1Y2tBc3NldElkCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ9rZXlEdWNrTG9jYXRpb24BBQtkdWNrQXNzZXRJZAkBEUBleHRyTmF0aXZlKDEwNTgpAQkBEGtleVNhdmVkTG9jYXRpb24BBQtkdWNrQXNzZXRJZAUDbmlsAhRicmVha0F0dGVtcHRDYWxsYmFjawFpARZleGl0VG91cm5hbWVudEludGVybmFsAQtkdWNrQXNzZXRJZAMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECDUFjY2VzcyBkZW5pZWQEC3NhdmVkSGVhbHRoCQERQGV4dHJOYXRpdmUoMTA1NSkBCQEOa2V5U2F2ZWRIZWFsdGgBBQtkdWNrQXNzZXRJZAQNc2F2ZWRMb2NhdGlvbgkBEUBleHRyTmF0aXZlKDEwNTgpAQkBEGtleVNhdmVkTG9jYXRpb24BBQtkdWNrQXNzZXRJZAkAlAoCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQENa2V5RHVja0hlYWx0aAEFC2R1Y2tBc3NldElkBQtzYXZlZEhlYWx0aAkAzAgCCQELU3RyaW5nRW50cnkCCQEPa2V5RHVja0xvY2F0aW9uAQULZHVja0Fzc2V0SWQFDXNhdmVkTG9jYXRpb24FA25pbAcBaQEPcHJvY2Vzc0RlbGl2ZXJ5AQtkdWNrQXNzZXRJZAMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECDUFjY2VzcyBkZW5pZWQEBGFkZHIJAKUIAQgFAWkMb3JpZ2luQ2FsbGVyBAlmdW5kVG90YWwJAQt2YWx1ZU9yRWxzZQIJAJoIAgUPZWNvbm9teUNvbnRyYWN0BQ9kZWxpdmVyeUZ1bmRLZXkAAAMJAGYCBRVNSU5fVVNEVF9GRUVfREVMSVZFUlkFCWZ1bmRUb3RhbAkAAgEJAKwCAgIgRGVsaXZlcnkgaXMgbm90IGF2YWlsYWJsZSwgZnVuZD0JAQpmaXhlZFBvaW50AgUJZnVuZFRvdGFsAAYEA25vdwgFCWxhc3RCbG9jawl0aW1lc3RhbXAECGNvdW50S2V5CQEUa2V5VXNlckRlbGl2ZXJ5Q291bnQBBQRhZGRyBAdsYXN0RGF5CQELdmFsdWVPckVsc2UCCQCfCAEJARZrZXlVc2VyTGFzdERlbGl2ZXJ5RGF5AQUEYWRkcgAABAV0b2RheQkAaQIFA25vdwUJREFZTUlMTElTBAVjb3VudAMJAAACBQdsYXN0RGF5BQV0b2RheQkBC3ZhbHVlT3JFbHNlAgkAnwgBBQhjb3VudEtleQAAAAAEBWFjcmVzCQELdmFsdWVPckVsc2UCCQCaCAIFDWFjcmVzQ29udHJhY3QJARprZXlBY3Jlc1N0YWtlZEFtb3VudEJ5VXNlcgEFBGFkZHIAAAQRYWxsb3dlZERlbGl2ZXJpZXMJAGQCBRdBTExPV0VEX0ZSRUVfREVMSVZFUklFUwkAaQIFBWFjcmVzBRpBQ1JFU19GT1JfREVMSVZFUllfQVRURU1QVAMJAGcCBQVjb3VudAURYWxsb3dlZERlbGl2ZXJpZXMJAAIBCQCsAgIJAKwCAgIRWW91IGFscmVhZHkgdXNlZCAJAKQDAQURYWxsb3dlZERlbGl2ZXJpZXMCHCBkZWxpdmVyeSBhdHRlbXB0cyBmb3IgdG9kYXkEDmdsb2JhbENvdW50S2V5CQEUa2V5RHVja0RlbGl2ZXJ5Q291bnQBBQtkdWNrQXNzZXRJZAQGcmV3YXJkCQD8BwQFD2Vjb25vbXlDb250cmFjdAISc2VuZERlbGl2ZXJ5UmV3YXJkCQDMCAIFBGFkZHIFA25pbAUDbmlsCQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIFCGNvdW50S2V5CQBkAgUFY291bnQAAQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBFmtleVVzZXJMYXN0RGVsaXZlcnlEYXkBBQRhZGRyBQV0b2RheQkAzAgCCQEMSW50ZWdlckVudHJ5AgUOZ2xvYmFsQ291bnRLZXkJAGQCCQELdmFsdWVPckVsc2UCCQCfCAEFDmdsb2JhbENvdW50S2V5AAAAAQUDbmlsBQZyZXdhcmQBaQEHcm9iTGFuZAIHbWVzc2FnZQNzaWcEDXByb2xvZ0FjdGlvbnMJAQZwcm9sb2cBBQFpAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwABCQACAQIiZXhhY3RseSAxIHBheW1lbnQgbXVzdCBiZSBhdHRhY2hlZAQDcG10CQCRAwIIBQFpCHBheW1lbnRzAAAEBndsZ0FtdAgFA3BtdAZhbW91bnQDAwkBASEBCQEJaXNEZWZpbmVkAQgFA3BtdAdhc3NldElkBgkBAiE9AgkBBXZhbHVlAQgFA3BtdAdhc3NldElkBQp3bGdBc3NldElkCQACAQIVV0xHT0xEIHBheW1lbnRzIG9ubHkhAwkBAiE9AgUGd2xnQW10BRJNSU5fV0xHT0xEX1JPQkJFUlkJAAIBCQCsAgIJAKwCAgISUGF5bWVudCBzaG91bGQgYmUgCQEKZml4ZWRQb2ludAIFEk1JTl9XTEdPTERfUk9CQkVSWQAIAgcgV0xHT0xEBARhZGRyCQClCAEIBQFpBmNhbGxlcgMJAQEhAQkAxBMDBQdtZXNzYWdlBQNzaWcFA3B1YgkAAgECGHNpZ25hdHVyZSBkb2VzIG5vdCBtYXRjaAQFcGFydHMJALwJAgkAsAkBBQdtZXNzYWdlAgE7BAZyb2JMb2cJALwJAgkAkQMCBQVwYXJ0cwAAAgF8BAJocAkAtQkCCQCRAwIFBnJvYkxvZwUIcmxIZWFsdGgCAV8EBWN1ckhQCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCaHAAAAQFbmV3SFAJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJocAABBAhwcm9kVXNlZAkAkQMCBQZyb2JMb2cFC3JsUHJvZHNVc2VkBAhsYXN0UGFydAkAtQkCCQCRAwIFBXBhcnRzAAECAXwEB3JvYlR5cGUJAJEDAgUIbGFzdFBhcnQFBnJsVHlwZQMJAQIhPQIFB3JvYlR5cGUCAUIJAAIBAh5Pbmx5IGJhbmsgcm9iYmVyeSBpcyBzdXBwb3J0ZWQEBHRpbWUJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQhsYXN0UGFydAULcmxUaW1lc3RhbXADAwkAZgIFBHRpbWUJAGQCCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAURRklWRU1JTlVURVNNSUxMSVMGCQBmAgkAZQIIBQlsYXN0QmxvY2sJdGltZXN0YW1wBRFGSVZFTUlOVVRFU01JTExJUwUEdGltZQkAAgEJAKwCAgkArAICCQCsAgICHHNpZ25hdHVyZSBvdXRkYXRlZDogbG9nVGltZT0JAKQDAQUEdGltZQIJLCBiY1RpbWU9CQCkAwEIBQlsYXN0QmxvY2sJdGltZXN0YW1wBAl0eEZyb21Nc2cJAJEDAgUIbGFzdFBhcnQFCHJsTGFzdFR4BAZsYXN0VHgJAQt2YWx1ZU9yRWxzZQIJAKIIAQkBEWtleUxhc3RUeElkQnlVc2VyAQUEYWRkcgIAAwkBAiE9AgUGbGFzdFR4BQl0eEZyb21Nc2cJAAIBCQCsAgIJAKwCAgkArAICAh5UeCBpZHMgZG9uJ3QgbWF0Y2ghIEluIHN0YXRlOiAFBmxhc3RUeAIKLCBpbiBtc2c6IAUJdHhGcm9tTXNnBAtkdWNrQXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCiCAEJARRrZXlTdGFrZWREdWNrQnlPd25lcgEFBGFkZHICHFlvdSBkb24ndCBoYXZlIGEgZHVjayBzdGFrZWQEBWVxS2V5CQEQa2V5RHVja0VxdWlwbWVudAEFC2R1Y2tBc3NldElkBAljdXJyZW50RXEJAQt2YWx1ZU9yRWxzZQIJAKIIAQUFZXFLZXkCFyw7LF8sOyxfLDssXyw7LF8sOyxfLDssBA8kdDAxMTU4NzcxMTU5ODgJARFzdWJ0cmFjdEVxdWlwbWVudAIFCWN1cnJlbnRFcQUIcHJvZFVzZWQEBW5ld0VxCAUPJHQwMTE1ODc3MTE1OTg4Al8xBA9zaG91bGRaZXJvQnVmZnMIBQ8kdDAxMTU4NzcxMTU5ODgCXzIECGlzQnBVc2VkCAUPJHQwMTE1ODc3MTE1OTg4Al8zBAtjdXJMb2NhdGlvbgkBC3ZhbHVlT3JFbHNlAgkAoggBCQEPa2V5RHVja0xvY2F0aW9uAQULZHVja0Fzc2V0SWQFD0RFRkFVTFRMT0NBVElPTgMJAQ5pc0luVG91cm5hbWVudAIFEnRvdXJuYW1lbnRDb250cmFjdAULY3VyTG9jYXRpb24JAAIBAipZb3VyIGR1Y2sgaXMgdGFraW5nIHBhcnQgaW4gdGhlIHRvdXJuYW1lbnQEA25vdwgFCWxhc3RCbG9jawl0aW1lc3RhbXAECGNvdW50S2V5CQETa2V5VXNlclJvYmJlcnlDb3VudAEFBGFkZHIEB2xhc3REYXkJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBFWtleVVzZXJMYXN0Um9iYmVyeURheQEFBGFkZHIAAAQFdG9kYXkJAGkCBQNub3cFCURBWU1JTExJUwQFY291bnQDCQAAAgUHbGFzdERheQUFdG9kYXkJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUIY291bnRLZXkAAAAABAVhY3JlcwkBC3ZhbHVlT3JFbHNlAgkAmggCBQ1hY3Jlc0NvbnRyYWN0CQEaa2V5QWNyZXNTdGFrZWRBbW91bnRCeVVzZXIBBQRhZGRyAAAEEGFsbG93ZWRSb2JiZXJpZXMJAGQCBRZBTExPV0VEX0ZSRUVfUk9CQkVSSUVTCQBpAgUFYWNyZXMFGUFDUkVTX0ZPUl9ST0JCRVJZX0FUVEVNUFQDCQBnAgUFY291bnQFEGFsbG93ZWRSb2JiZXJpZXMJAAIBCQCsAgIJAKwCAgIRWW91IGFscmVhZHkgdXNlZCAJAKQDAQUQYWxsb3dlZFJvYmJlcmllcwIbIHJvYmJlcnkgYXR0ZW1wdHMgZm9yIHRvZGF5BA5nbG9iYWxDb3VudEtleQkBE2tleUR1Y2tSb2JiZXJ5Q291bnQBBQtkdWNrQXNzZXRJZAQEbG9vdAMJAGYCBQVuZXdIUAAABAlmdW5kVG90YWwJAPAHAgUEdGhpcwUKd2xnQXNzZXRJZAQFcHJpemUDBQhpc0JwVXNlZAkAaAIAAgUSTUlOX1dMR09MRF9ST0JCRVJZCQBoAgAFBRJNSU5fV0xHT0xEX1JPQkJFUlkDCQBmAgUFcHJpemUFCWZ1bmRUb3RhbAkAAgEJAKwCAgkArAICCQCsAgICIlJvYmJlcnkgaXMgbm90IGF2YWlsYWJsZSwgZnVuZHMgPSAJAQpmaXhlZFBvaW50AgUJZnVuZFRvdGFsAAgCFCBXTEdPTEQsIHJlcXVpcmVkID0gCQEKZml4ZWRQb2ludAIFBXByaXplAAgJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQVwcml6ZQUKd2xnQXNzZXRJZAUDbmlsBQNuaWwJAJQKAgkAzQgCCQDNCAIJAM0IAgkAzQgCCQDNCAIJAM0IAgkAzggCCQDOCAIJAM4IAgUNcHJvbG9nQWN0aW9ucwUEbG9vdAMFD3Nob3VsZFplcm9CdWZmcwkAzAgCCQELU3RyaW5nRW50cnkCCQEMa2V5RHVja0J1ZmZzAQULZHVja0Fzc2V0SWQCCTBfMF8wXzBfMAUDbmlsBQNuaWwICQEXdXBkYXRlRHVja1N0YXRzSW50ZXJuYWwCBQtkdWNrQXNzZXRJZAMJAGYCBQVuZXdIUAAABQx4cFN1Y2Nlc3NSb2IFCXhwRmFpbFJvYgJfMQkBDEludGVnZXJFbnRyeQIJARhrZXlMYXN0Um9iYmVyeVRpbWVCeUR1Y2sBBQtkdWNrQXNzZXRJZAUDbm93CQEMSW50ZWdlckVudHJ5AgUIY291bnRLZXkJAGQCBQVjb3VudAABCQEMSW50ZWdlckVudHJ5AgkBFWtleVVzZXJMYXN0Um9iYmVyeURheQEFBGFkZHIFBXRvZGF5CQEMSW50ZWdlckVudHJ5AgUOZ2xvYmFsQ291bnRLZXkJAGQCCQELdmFsdWVPckVsc2UCCQCfCAEFDmdsb2JhbENvdW50S2V5AAAAAQkBC1N0cmluZ0VudHJ5AgUFZXFLZXkFBW5ld0VxCQEMSW50ZWdlckVudHJ5AgkBDWtleUR1Y2tIZWFsdGgBBQtkdWNrQXNzZXRJZAkAlgMBCQDMCAIFBW5ld0hQCQDMCAIAAAUDbmlsAAABaQELYnV5Um9ib0R1Y2sAAwkBASEBBRNLU19BTExPV19ST0JPX0RVQ0tTCQACAQIVRmVhdHVyZSBpcyB0dXJuZWQgb2ZmBA1wcm9sb2dBY3Rpb25zCQEGcHJvbG9nAQUBaQMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECHEV4YWN0bHkgb25lIHBheW1lbnQgcmVxdWlyZWQEA3BtdAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwAAAwkBAiE9AggFA3BtdAdhc3NldElkBQt1c2R0QXNzZXRJZAkAAgECGkFsbG93ZWQgVVNEVCBwYXltZW50IG9ubHkhAwkBAiE9AggFA3BtdAZhbW91bnQFDlJPQk9fRFVDS19VU0RUCQACAQkArAICCQCsAgICG1BheW1lbnQgYXR0YWNoZWQgc2hvdWxkIGJlIAkBCmZpeGVkUG9pbnQCBQ5ST0JPX0RVQ0tfVVNEVAAGAgUgVVNEVAQHbmV4dE51bQkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEPa2V5TmV4dFJvYm9EdWNrAAAABAVieXRlegkAmgMBBQduZXh0TnVtBARuYW1lCQCsAgIJAKwCAgULUk9CT19QUkVGSVgCAS0JALICAgkA3AQBBQVieXRlegAIBAVjb2xvcgkAsgICCQDcBAEJANQWAQUFYnl0ZXoABgQFaXNzdWUJAMIIBQUEbmFtZQkArAICAjdSb2JvIER1Y2sgTkZUIGZvciBXYXZlc0xhbmRzIGdhbWUsIGJhY2tncm91bmQgY29sb3IgPSAjBQVjb2xvcgABAAAHBAdhc3NldElkCQC4CAEFBWlzc3VlCQCUCgIJAM0IAgkAzQgCCQDNCAIJAM0IAgUNcHJvbG9nQWN0aW9ucwkBDEludGVnZXJFbnRyeQIJAQ9rZXlOZXh0Um9ib0R1Y2sACQBkAgUHbmV4dE51bQABBQVpc3N1ZQkBDlNjcmlwdFRyYW5zZmVyAwgFAWkMb3JpZ2luQ2FsbGVyAAEFB2Fzc2V0SWQJAQ5TY3JpcHRUcmFuc2ZlcgMFD2Vjb25vbXlDb250cmFjdAgFA3BtdAZhbW91bnQFC3VzZHRBc3NldElkCQCUCgIJANgEAQUHYXNzZXRJZAUFY29sb3IArUgx8A==", "height": 3280649, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 6Ecs2wULeZs81TzNNQfr3ZVrbyYB4eziHytn8vib6ss2 Next: DXTNpodtsUc25pZtwKYtocxkwX2r6zmvEX8AxdTNjwxj Diff:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let DAYMILLIS = 86400000
5-
6-func keyLastArbTimeByUser (addr) = ("lastArbTimeUser_" + addr)
7-
8-
9-func keyAcresStakedAmountByUser (addr) = ("acresStakedAmountByUser_" + addr)
10-
11-
12-let SCALE8 = 100000000
13-
14-let xpLevelScale = 3200
15-
16-let xpLevelRecipPow = 4000
17-
18-let numPointsOnLevelUp = 3
19-
20-let requirements = ["Strength", "Accuracy", "Intellect", "Endurance", "Dexterity", "Level", "Health"]
21-
22-let charStrength = 0
23-
24-let charAccuracy = 1
25-
26-let charIntellect = 2
27-
28-let charEndurance = 3
29-
30-let charDexterity = 4
31-
32-let segBackpack = 0
33-
34-let NUMSEGMENTS = 6
35-
36-let NUMMAINAUX = 2
37-
38-let MAXSLOTS = 2
39-
40-let MAXPRODINSLOT = 30
41-
42-func keyDuckHealth (duckAssetId) = ("duckHealth_" + duckAssetId)
43-
44-
45-func keyDuckChars (duckAssetId) = ("duckChars_" + duckAssetId)
46-
47-
48-func keyDuckXP (duckAssetId) = ("duckXP_" + duckAssetId)
49-
50-
51-func keyDuckLevel (duckAssetId) = ("duckLevel_" + duckAssetId)
52-
53-
54-func keyDuckFreePoints (duckAssetId) = ("duckFreePoints_" + duckAssetId)
55-
56-
57-func keyDuckEquipment (duckAssetId) = ("duckEquipment_" + duckAssetId)
58-
59-
60-func keyUserXP (addr) = ("userXP_" + addr)
61-
62-
63-func keyUserLevel (addr) = ("userLevel_" + addr)
64-
65-
66-func keyUserFreePoints (addr) = ("userFreePoints_" + addr)
67-
68-
69-func keySavedHealth (duckAssetId) = ("savedHealth_" + duckAssetId)
70-
71-
72-func keySavedLocation (duckAssetId) = ("savedLocation_" + duckAssetId)
73-
74-
75-func keyDuckBuffs (duckAssetId) = ("duckBuffs_" + duckAssetId)
76-
77-
78-func keyLastRobberyTimeByDuck (duckAssetId) = ("lastRobberyTime_" + duckAssetId)
79-
80-
81-func keyDuckRobberyCount (duckAssetId) = ("totalRobberyCountByDuck_" + duckAssetId)
82-
83-
84-func keyUserRobberyCount (addr) = ("userRobberyCount_" + addr)
85-
86-
87-func keyUserLastRobberyDay (addr) = ("userLastRobberyDay_" + addr)
88-
89-
90-func keyDuckDeliveryCount (duckAssetId) = ("totalDeliveryCountByDuck_" + duckAssetId)
91-
92-
93-func keyUserDeliveryCount (addr) = ("userDeliveryCount_" + addr)
94-
95-
96-func keyUserLastDeliveryDay (addr) = ("userLastDeliveryDay_" + addr)
97-
98-
99-let xpClaim = 10000
100-
101-let xpSuccessFlight = 10000
102-
103-let xpFailFlight = 2000
104-
105-let xpSuccessRob = 10000
106-
107-let xpFailRob = 2000
108-
109-let xpCallES = 100000
110-
111-let xpCustomName = 1000000
112-
113-let xpNewSLand = 5000000
114-
115-let xpUpgradeInfra = 10000
116-
117-let xpMerge = 1000000
118-
119-let xpOnboard = 1000000
120-
121-let xpHeal = 10000
122-
123-func levelByXP (xp) = fraction(xpLevelScale, pow(xp, 4, xpLevelRecipPow, 4, 4, DOWN), SCALE8)
124-
125-
126-func maxHealth (level) = (100 + level)
127-
128-
129-func levelUp (currLevel,newXP) = {
130- let newLevel = levelByXP(newXP)
131-[newLevel, (numPointsOnLevelUp * (newLevel - currLevel))]
132- }
133-
134-
135-func getDuckStats (stakingContract,duckAssetId,buffEffect,forceBuffs) = {
136- let chars = split(valueOrElse(getString(stakingContract, keyDuckChars(duckAssetId)), "0_0_0_0_0"), "_")
137- let lvl = valueOrElse(getInteger(stakingContract, keyDuckLevel(duckAssetId)), 0)
138- let health = valueOrElse(getInteger(stakingContract, keyDuckHealth(duckAssetId)), maxHealth(lvl))
139- let stateBuffs = split(valueOrElse(getString(stakingContract, keyDuckBuffs(duckAssetId)), "0_0_0_0_0"), "_")
140- ([parseIntValue(chars[charStrength]), parseIntValue(chars[charAccuracy]), parseIntValue(chars[charIntellect]), parseIntValue(chars[charEndurance]), parseIntValue(chars[charDexterity]), lvl, health] ++ (if (forceBuffs)
141- then [buffEffect, buffEffect, buffEffect, buffEffect, buffEffect]
142- else [parseIntValue(stateBuffs[charStrength]), parseIntValue(stateBuffs[charAccuracy]), parseIntValue(stateBuffs[charIntellect]), parseIntValue(stateBuffs[charEndurance]), parseIntValue(stateBuffs[charDexterity])]))
143- }
4+let KS_SEPARATE_PUBLIC_KEY = false
5+
6+let KS_ALLOW_BIG_INFRA_MERGE = false
7+
8+let KS_ALLOW_ROBO_DUCKS = false
9+
10+let DAY_MILLIS = 86400000
11+
12+let chain = take(drop(this.bytes, 1), 1)
13+
14+let pub = match chain {
15+ case _ =>
16+ if ((base58'2W' == $match0))
17+ then if (KS_SEPARATE_PUBLIC_KEY)
18+ then base58'CWsMtTZC5BjjoL4Q1ayW4Wwb1ehGACQB6DrKyPgotKfm'
19+ else base58'6LfPuKJjLgekmncBhMg2LZyMTNVzZBccXR28ySXm9uXD'
20+ else if ((base58'2T' == $match0))
21+ then base58'6LfPuKJjLgekmncBhMg2LZyMTNVzZBccXR28ySXm9uXD'
22+ else throw("Unknown chain")
23+}
24+
25+let usdtAssetId = match chain {
26+ case _ =>
27+ if ((base58'2W' == $match0))
28+ then base58'9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi'
29+ else if ((base58'2T' == $match0))
30+ then base58'6mWwf9mZBjVgkC54idpyaZLQfAosD914wT8fGf2iiY63'
31+ else throw("Unknown chain")
32+}
33+
34+let defaultRestAddressStr = match chain {
35+ case _ =>
36+ if ((base58'2W' == $match0))
37+ then "3PQCuvFbvh4LkPUnrnU1z3jnbA1p9m3WNhv"
38+ else if ((base58'2T' == $match0))
39+ then "3MumkGGztCKAXpWDqxkddofqXSUbqQkvSJy"
40+ else throw("Unknown chain")
41+}
42+
43+let acres2AddressStr = match chain {
44+ case _ =>
45+ if ((base58'2W' == $match0))
46+ then "3P4UH3T9nXpMNpUmSmQjPmEz3G85t3zn6eA"
47+ else if ((base58'2T' == $match0))
48+ then "3NBPx1Fciu3JQNEGZ21jSnTdutLNGGBUSXh"
49+ else throw("Unknown chain")
50+}
51+
52+let InfraUpgradeCostS = match chain {
53+ case _ =>
54+ if ((base58'2W' == $match0))
55+ then 10000000000
56+ else if ((base58'2T' == $match0))
57+ then 100000000
58+ else throw("Unknown chain")
59+}
60+
61+let arbitrageDelay = match chain {
62+ case _ =>
63+ if ((base58'2W' == $match0))
64+ then DAY_MILLIS
65+ else if ((base58'2T' == $match0))
66+ then 60000
67+ else throw("Unknown chain")
68+}
69+
70+let SEP = "__"
71+
72+let MULT6 = 1000000
73+
74+let MULT8 = 100000000
75+
76+let SSIZE = 25
77+
78+let MSIZE = 100
79+
80+let LSIZE = 225
81+
82+let XLSIZE = 400
83+
84+let XXLSIZE = 625
85+
86+let ITER6 = [0, 1, 2, 3, 4, 5]
87+
88+func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
89+
90+
91+let IdxCfgStakingDapp = 1
92+
93+let IdxCfgEconomyDapp = 2
94+
95+let IdxCfgGovernanceDapp = 3
96+
97+let IdxCfgWlgDapp = 4
98+
99+let IdxCfgTournamentDapp = 7
100+
101+let IdxCfgAcresDapp = 8
102+
103+func keyRestCfg () = "%s__restConfig"
104+
105+
106+func keyRestAddress () = "%s__restAddr"
107+
108+
109+func readRestCfgOrFail (rest) = split_4C(getStringOrFail(rest, keyRestCfg()), SEP)
110+
111+
112+func getContractAddressOrFail (restCfg,idx) = valueOrErrorMessage(addressFromString(restCfg[idx]), ("Rest cfg doesn't contain address at index " + toString(idx)))
113+
114+
115+let restContract = addressFromStringValue(valueOrElse(getString(this, keyRestAddress()), defaultRestAddressStr))
116+
117+let restCfg = readRestCfgOrFail(restContract)
118+
119+let stakingContract = getContractAddressOrFail(restCfg, IdxCfgStakingDapp)
120+
121+let economyContract = getContractAddressOrFail(restCfg, IdxCfgEconomyDapp)
122+
123+let govContract = getContractAddressOrFail(restCfg, IdxCfgGovernanceDapp)
124+
125+let wlgContract = getContractAddressOrFail(restCfg, IdxCfgWlgDapp)
126+
127+let tournamentContract = getContractAddressOrFail(restCfg, IdxCfgTournamentDapp)
128+
129+let acresContract = getContractAddressOrFail(restCfg, IdxCfgAcresDapp)
130+
131+let recLandNum = 0
132+
133+let recLandSize = 1
134+
135+let recTerrains = 2
136+
137+let recContinent = 3
138+
139+let wlgAssetIdKey = "wlg_assetId"
140+
141+let wlgAssetId = valueOrErrorMessage(getBinary(wlgContract, wlgAssetIdKey), "WLGOLD is not issued yet")
142+
143+let acresAssetIdKey = "acresAssetId"
144+
145+let acresAssetId = valueOrErrorMessage(getBinary(acresContract, acresAssetIdKey), "ACRES is not issued yet")
146+
147+let randomDelay = 2
148+
149+func keyCommit (address) = ("finishBlockFor_" + address)
150+
151+
152+func keyResProportions () = "resTypesProportions"
153+
154+
155+func keyResTypesByContinent (continent) = ("resTypesByContinent_" + continent)
156+
157+
158+func keyStakedLandsByOwner (ownerAddr) = ("stakedLandsByOwner_" + ownerAddr)
159+
160+
161+func keyStakedPiecesByOwner (ownerAddr) = ("stakedPiecesByOwner_" + ownerAddr)
162+
163+
164+func asString (v) = match v {
165+ case s: String =>
166+ s
167+ case _ =>
168+ throw("fail to cast into String")
169+}
170+
171+
172+func asInt (v) = match v {
173+ case n: Int =>
174+ n
175+ case _ =>
176+ throw("fail to cast into Int")
177+}
178+
179+
180+func asAnyList (v) = match v {
181+ case l: List[Any] =>
182+ l
183+ case _ =>
184+ throw("fail to cast into List[Any]")
185+}
186+
187+
188+func asBoolean (v) = match v {
189+ case s: Boolean =>
190+ s
191+ case _ =>
192+ throw("fail to cast into Boolean")
193+}
194+
195+
196+func numPiecesBySize (landSize) = match landSize {
197+ case _ =>
198+ if (("S" == $match0))
199+ then SSIZE
200+ else if (("M" == $match0))
201+ then MSIZE
202+ else if (("L" == $match0))
203+ then LSIZE
204+ else if (("XL" == $match0))
205+ then XLSIZE
206+ else if (("XXL" == $match0))
207+ then XXLSIZE
208+ else throw("Unknown land size")
209+}
210+
211+
212+func isDigit (s) = isDefined(parseInt(s))
213+
214+
215+func keyBlocked () = "contractsBlocked"
216+
217+
218+func keyLastTxIdByUser (addr) = ("lastTxIdByUser_" + addr)
219+
220+
221+func fixedPoint (val,decimals) = {
222+ let tenPow = pow(10, 0, decimals, 0, 0, DOWN)
223+ let lowPart = toString((val % tenPow))
224+ let zeroes = drop(toString(tenPow), (1 + size(lowPart)))
225+ (((toString((val / tenPow)) + ".") + zeroes) + lowPart)
226+ }
227+
228+
229+func getRandomNumber (maxValue,salt,entropy) = if ((0 >= maxValue))
230+ then throw("maxValue should be > 0")
231+ else {
232+ let randomHash = sha256((salt + entropy))
233+ (toInt(randomHash) % maxValue)
234+ }
235+
236+
237+func finalTime () = min([lastBlock.timestamp, 1727740799000])
144238
145239
146240 let LANDPREFIX = "LAND"
166260 let ESSELLCOEF = 10
167261
168262 let MIN_USDT_FEE_DELIVERY = 50000
263+
264+let USDT2ACRES_MULTIPLIER = 10
169265
170266 let MIN_WLGOLD_ROBBERY = 100000000
171267
353449 func cheatAttempt (oldLoc,newLoc,cheatCase) = throw(((((("Cheat attempt: oldLoc=" + oldLoc) + ", newLoc=") + newLoc) + ", case=") + toString(cheatCase)))
354450
355451
356-let KS_SEPARATE_PUBLIC_KEY = false
357-
358-let KS_ALLOW_BIG_INFRA_MERGE = false
359-
360-let KS_ALLOW_ROBO_DUCKS = false
361-
362-let DAY_MILLIS = 86400000
363-
364-let chain = take(drop(this.bytes, 1), 1)
365-
366-let pub = match chain {
367- case _ =>
368- if ((base58'2W' == $match0))
369- then if (KS_SEPARATE_PUBLIC_KEY)
370- then base58'CWsMtTZC5BjjoL4Q1ayW4Wwb1ehGACQB6DrKyPgotKfm'
371- else base58'6LfPuKJjLgekmncBhMg2LZyMTNVzZBccXR28ySXm9uXD'
372- else if ((base58'2T' == $match0))
373- then base58'6LfPuKJjLgekmncBhMg2LZyMTNVzZBccXR28ySXm9uXD'
374- else throw("Unknown chain")
375-}
376-
377-let usdtAssetId = match chain {
378- case _ =>
379- if ((base58'2W' == $match0))
380- then base58'9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi'
381- else if ((base58'2T' == $match0))
382- then base58'6mWwf9mZBjVgkC54idpyaZLQfAosD914wT8fGf2iiY63'
383- else throw("Unknown chain")
384-}
385-
386-let defaultRestAddressStr = match chain {
387- case _ =>
388- if ((base58'2W' == $match0))
389- then "3PQCuvFbvh4LkPUnrnU1z3jnbA1p9m3WNhv"
390- else if ((base58'2T' == $match0))
391- then "3MumkGGztCKAXpWDqxkddofqXSUbqQkvSJy"
392- else throw("Unknown chain")
393-}
394-
395-let InfraUpgradeCostS = match chain {
396- case _ =>
397- if ((base58'2W' == $match0))
398- then 10000000000
399- else if ((base58'2T' == $match0))
400- then 100000000
401- else throw("Unknown chain")
402-}
403-
404-let arbitrageDelay = match chain {
405- case _ =>
406- if ((base58'2W' == $match0))
407- then DAY_MILLIS
408- else if ((base58'2T' == $match0))
409- then 60000
410- else throw("Unknown chain")
411-}
412-
413-let SEP = "__"
414-
415-let MULT6 = 1000000
416-
417-let MULT8 = 100000000
418-
419-let SSIZE = 25
420-
421-let MSIZE = 100
422-
423-let LSIZE = 225
424-
425-let XLSIZE = 400
426-
427-let XXLSIZE = 625
428-
429-let ITER6 = [0, 1, 2, 3, 4, 5]
430-
431-func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
432-
433-
434-let IdxCfgStakingDapp = 1
435-
436-let IdxCfgEconomyDapp = 2
437-
438-let IdxCfgGovernanceDapp = 3
439-
440-let IdxCfgWlgDapp = 4
441-
442-let IdxCfgTournamentDapp = 7
443-
444-let IdxCfgAcresDapp = 8
445-
446-func keyRestCfg () = "%s__restConfig"
447-
448-
449-func keyRestAddress () = "%s__restAddr"
450-
451-
452-func readRestCfgOrFail (rest) = split_4C(getStringOrFail(rest, keyRestCfg()), SEP)
453-
454-
455-func getContractAddressOrFail (restCfg,idx) = valueOrErrorMessage(addressFromString(restCfg[idx]), ("Rest cfg doesn't contain address at index " + toString(idx)))
456-
457-
458-let restContract = addressFromStringValue(valueOrElse(getString(this, keyRestAddress()), defaultRestAddressStr))
459-
460-let restCfg = readRestCfgOrFail(restContract)
461-
462-let stakingContract = getContractAddressOrFail(restCfg, IdxCfgStakingDapp)
463-
464-let economyContract = getContractAddressOrFail(restCfg, IdxCfgEconomyDapp)
465-
466-let govContract = getContractAddressOrFail(restCfg, IdxCfgGovernanceDapp)
467-
468-let wlgContract = getContractAddressOrFail(restCfg, IdxCfgWlgDapp)
469-
470-let tournamentContract = getContractAddressOrFail(restCfg, IdxCfgTournamentDapp)
471-
472-let acresContract = getContractAddressOrFail(restCfg, IdxCfgAcresDapp)
473-
474-let recLandNum = 0
475-
476-let recLandSize = 1
477-
478-let recTerrains = 2
479-
480-let recContinent = 3
481-
482-let wlgAssetIdKey = "wlg_assetId"
483-
484-let wlgAssetId = valueOrErrorMessage(getBinary(wlgContract, wlgAssetIdKey), "WLGOLD is not issued yet")
485-
486-let acresAssetIdKey = "acresAssetId"
487-
488-let acresAssetId = valueOrErrorMessage(getBinary(acresContract, acresAssetIdKey), "ACRES is not issued yet")
489-
490-let randomDelay = 2
491-
492-func keyCommit (address) = ("finishBlockFor_" + address)
493-
494-
495-func keyResProportions () = "resTypesProportions"
496-
497-
498-func keyResTypesByContinent (continent) = ("resTypesByContinent_" + continent)
499-
500-
501-func keyStakedLandsByOwner (ownerAddr) = ("stakedLandsByOwner_" + ownerAddr)
502-
503-
504-func keyStakedPiecesByOwner (ownerAddr) = ("stakedPiecesByOwner_" + ownerAddr)
505-
506-
507-func asString (v) = match v {
508- case s: String =>
509- s
510- case _ =>
511- throw("fail to cast into String")
512-}
513-
514-
515-func asInt (v) = match v {
516- case n: Int =>
517- n
518- case _ =>
519- throw("fail to cast into Int")
520-}
521-
522-
523-func asAnyList (v) = match v {
524- case l: List[Any] =>
525- l
526- case _ =>
527- throw("fail to cast into List[Any]")
528-}
529-
530-
531-func asBoolean (v) = match v {
532- case s: Boolean =>
533- s
534- case _ =>
535- throw("fail to cast into Boolean")
536-}
537-
538-
539-func numPiecesBySize (landSize) = match landSize {
540- case _ =>
541- if (("S" == $match0))
542- then SSIZE
543- else if (("M" == $match0))
544- then MSIZE
545- else if (("L" == $match0))
546- then LSIZE
547- else if (("XL" == $match0))
548- then XLSIZE
549- else if (("XXL" == $match0))
550- then XXLSIZE
551- else throw("Unknown land size")
552-}
553-
554-
555-func isDigit (s) = isDefined(parseInt(s))
556-
557-
558-func keyBlocked () = "contractsBlocked"
559-
560-
561-func keyLastTxIdByUser (addr) = ("lastTxIdByUser_" + addr)
562-
563-
564-func fixedPoint (val,decimals) = {
565- let tenPow = pow(10, 0, decimals, 0, 0, DOWN)
566- let lowPart = toString((val % tenPow))
567- let zeroes = drop(toString(tenPow), (1 + size(lowPart)))
568- (((toString((val / tenPow)) + ".") + zeroes) + lowPart)
569- }
570-
571-
572-func getRandomNumber (maxValue,salt,entropy) = if ((0 >= maxValue))
573- then throw("maxValue should be > 0")
574- else {
575- let randomHash = sha256((salt + entropy))
576- (toInt(randomHash) % maxValue)
577- }
452+let SCALE8 = 100000000
453+
454+let xpLevelScale = 3200
455+
456+let xpLevelRecipPow = 4000
457+
458+let numPointsOnLevelUp = 3
459+
460+let requirements = ["Strength", "Accuracy", "Intellect", "Endurance", "Dexterity", "Level", "Health"]
461+
462+let charStrength = 0
463+
464+let charAccuracy = 1
465+
466+let charIntellect = 2
467+
468+let charEndurance = 3
469+
470+let charDexterity = 4
471+
472+let segBackpack = 0
473+
474+let NUMSEGMENTS = 6
475+
476+let NUMMAINAUX = 2
477+
478+let MAXSLOTS = 2
479+
480+let MAXPRODINSLOT = 30
481+
482+func keyDuckHealth (duckAssetId) = ("duckHealth_" + duckAssetId)
483+
484+
485+func keyDuckChars (duckAssetId) = ("duckChars_" + duckAssetId)
486+
487+
488+func keyDuckXP (duckAssetId) = ("duckXP_" + duckAssetId)
489+
490+
491+func keyDuckLevel (duckAssetId) = ("duckLevel_" + duckAssetId)
492+
493+
494+func keyDuckFreePoints (duckAssetId) = ("duckFreePoints_" + duckAssetId)
495+
496+
497+func keyDuckEquipment (duckAssetId) = ("duckEquipment_" + duckAssetId)
498+
499+
500+func keyUserXP (addr) = ("userXP_" + addr)
501+
502+
503+func keyUserLevel (addr) = ("userLevel_" + addr)
504+
505+
506+func keyUserFreePoints (addr) = ("userFreePoints_" + addr)
507+
508+
509+func keySavedHealth (duckAssetId) = ("savedHealth_" + duckAssetId)
510+
511+
512+func keySavedLocation (duckAssetId) = ("savedLocation_" + duckAssetId)
513+
514+
515+func keyDuckBuffs (duckAssetId) = ("duckBuffs_" + duckAssetId)
516+
517+
518+func keyLastRobberyTimeByDuck (duckAssetId) = ("lastRobberyTime_" + duckAssetId)
519+
520+
521+func keyDuckRobberyCount (duckAssetId) = ("totalRobberyCountByDuck_" + duckAssetId)
522+
523+
524+func keyUserRobberyCount (addr) = ("userRobberyCount_" + addr)
525+
526+
527+func keyUserLastRobberyDay (addr) = ("userLastRobberyDay_" + addr)
528+
529+
530+func keyDuckDeliveryCount (duckAssetId) = ("totalDeliveryCountByDuck_" + duckAssetId)
531+
532+
533+func keyUserDeliveryCount (addr) = ("userDeliveryCount_" + addr)
534+
535+
536+func keyUserLastDeliveryDay (addr) = ("userLastDeliveryDay_" + addr)
537+
538+
539+let xpClaim = 10000
540+
541+let xpSuccessFlight = 10000
542+
543+let xpFailFlight = 2000
544+
545+let xpSuccessRob = 10000
546+
547+let xpFailRob = 2000
548+
549+let xpCallES = 100000
550+
551+let xpCustomName = 1000000
552+
553+let xpNewSLand = 5000000
554+
555+let xpUpgradeInfra = 10000
556+
557+let xpMerge = 1000000
558+
559+let xpOnboard = 1000000
560+
561+let xpHeal = 10000
562+
563+func levelByXP (xp) = fraction(xpLevelScale, pow(xp, 4, xpLevelRecipPow, 4, 4, DOWN), SCALE8)
564+
565+
566+func maxHealth (level) = (100 + level)
567+
568+
569+func levelUp (currLevel,newXP) = {
570+ let newLevel = levelByXP(newXP)
571+[newLevel, (numPointsOnLevelUp * (newLevel - currLevel))]
572+ }
573+
574+
575+func getDuckStats (stakingContract,duckAssetId,buffEffect,forceBuffs) = {
576+ let chars = split(valueOrElse(getString(stakingContract, keyDuckChars(duckAssetId)), "0_0_0_0_0"), "_")
577+ let lvl = valueOrElse(getInteger(stakingContract, keyDuckLevel(duckAssetId)), 0)
578+ let health = valueOrElse(getInteger(stakingContract, keyDuckHealth(duckAssetId)), maxHealth(lvl))
579+ let stateBuffs = split(valueOrElse(getString(stakingContract, keyDuckBuffs(duckAssetId)), "0_0_0_0_0"), "_")
580+ ([parseIntValue(chars[charStrength]), parseIntValue(chars[charAccuracy]), parseIntValue(chars[charIntellect]), parseIntValue(chars[charEndurance]), parseIntValue(chars[charDexterity]), lvl, health] ++ (if (forceBuffs)
581+ then [buffEffect, buffEffect, buffEffect, buffEffect, buffEffect]
582+ else [parseIntValue(stateBuffs[charStrength]), parseIntValue(stateBuffs[charAccuracy]), parseIntValue(stateBuffs[charIntellect]), parseIntValue(stateBuffs[charEndurance]), parseIntValue(stateBuffs[charDexterity])]))
583+ }
584+
585+
586+let DAYMILLIS = 86400000
587+
588+func keyLastArbTimeByUser (addr) = ("lastArbTimeUser_" + addr)
589+
590+
591+func keyAcresStakedAmountByUser (addr) = ("acresStakedAmountByUser_" + addr)
578592
579593
580594 let incubatorAddr = match chain {
11261140 }
11271141
11281142
1129-func virtClaim (terrainCounts,deltaTime,landSizeIndex,dailyByPieceWithBonuses) = {
1143+func virtClaimAddRes (currentRes,terrainCounts,deltaTime,landSizeIndex,dailyByPieceWithBonuses) = {
11301144 func adder (acc,i) = {
11311145 let resOfType = ((fraction(deltaTime, dailyByPieceWithBonuses, DAYMILLIS) * terrainCounts[i]) * landSizeIndex)
1146+ let totalResType = (parseIntValue(currentRes[i]) + resOfType)
1147+ $Tuple2((acc._1 :+ totalResType), (acc._2 + totalResType))
1148+ }
1149+
1150+ let $l = ITER6
1151+ let $s = size($l)
1152+ let $acc0 = $Tuple2(nil, 0)
1153+ func $f0_1 ($a,$i) = if (($i >= $s))
1154+ then $a
1155+ else adder($a, $l[$i])
1156+
1157+ func $f0_2 ($a,$i) = if (($i >= $s))
1158+ then $a
1159+ else throw("List size exceeds 6")
1160+
1161+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
1162+ }
1163+
1164+
1165+func virtClaim (terrainCounts,deltaTime,landSizeIndex,dailyByPieceWithBonuses) = {
1166+ func adder (acc,terrainCount) = {
1167+ let resOfType = ((fraction(deltaTime, dailyByPieceWithBonuses, DAYMILLIS) * terrainCount) * landSizeIndex)
11321168 $Tuple2((acc._1 :+ resOfType), (acc._2 + resOfType))
11331169 }
11341170
1135- let $l = ITER6
1171+ let $l = terrainCounts
11361172 let $s = size($l)
11371173 let $acc0 = $Tuple2(nil, 0)
11381174 func $f0_1 ($a,$i) = if (($i >= $s))
16481684
16491685
16501686 func checkClaimConditions (addr,claimMode,landAssetIdIn) = {
1651- let $t03367834217 = if ((claimMode == claimModeWh))
1687+ let $t03415334692 = if ((claimMode == claimModeWh))
16521688 then $Tuple2(landAssetIdIn, valueOrElse(getString(keyStakedDuckByOwner(addr)), ""))
16531689 else {
16541690 let duckAssetId = valueOrErrorMessage(getString(keyStakedDuckByOwner(addr)), "You don't have a duck staked")
16581694 then throw((("Duck location type is " + loc[locIdxType]) + ", but should be L"))
16591695 else $Tuple2(loc[locIdxId], duckAssetId)
16601696 }
1661- let landAssetId = $t03367834217._1
1662- let duckId = $t03367834217._2
1697+ let landAssetId = $t03415334692._1
1698+ let duckId = $t03415334692._2
16631699 let asset = value(assetInfo(fromBase58String(landAssetId)))
16641700 let timeKey = keyStakedTimeByAssetId(landAssetId)
16651701 let savedTime = valueOrErrorMessage(getInteger(timeKey), (("Land " + asset.name) + " is not staked"))
16791715 let c = checkClaimConditions(addr, claimMode, landAssetIdIn)
16801716 let landSize = c._3[recLandSize]
16811717 let terrainCounts = countTerrains(c._3[recTerrains])
1682- let deltaTime = (lastBlock.timestamp - c._4)
1718+ let deltaTime = (finalTime() - c._4)
16831719 if ((0 > deltaTime))
1684- then throw(((("Saved timestamp is in future, saved = " + toString(c._4)) + ", current = ") + toString(lastBlock.timestamp)))
1720+ then throw(((("Saved timestamp is in future, saved = " + toString(c._4)) + ", final = ") + toString(finalTime())))
16851721 else {
16861722 let pieces = numPiecesBySize(landSize)
16871723 let dailyProductionByPiece = applyBonuses(c._2, pieces)
16901726 then throw(((("Not enough resources, available = " + toString(availRes)) + ", requested = ") + toString(amount)))
16911727 else {
16921728 let newDeltaTime = fraction((availRes - amount), DAYMILLIS, (dailyProductionByPiece * pieces))
1693- let newTimestamp = (lastBlock.timestamp - newDeltaTime)
1729+ let newTimestamp = (finalTime() - newDeltaTime)
16941730 let landIndex = (pieces / SSIZE)
16951731 let resToClaim = virtClaim(terrainCounts, (deltaTime - newDeltaTime), landIndex, dailyProductionByPiece)
16961732 let whKey = keyWarehouseByLand(c._2)
17071743 let currentPack = getBackpack(bpKey)
17081744 let currentPackRes = split(currentPack[bpIdxRes], "_")
17091745 let currentWhRes = split(currentWh[whIdxRes], "_")
1710- let $t03659137462 = if ((claimMode == claimModeWh))
1746+ let $t03706237933 = if ((claimMode == claimModeWh))
17111747 then $Tuple4(addRes(currentWhRes, terrainCounts, (deltaTime - newDeltaTime), landIndex, dailyProductionByPiece), currentPack[bpIdxRes], (parseIntValue(loft[volOccupied]) + resToClaim._2), (parseIntValue(loft[volFree]) - resToClaim._2))
17121748 else if ((claimMode == claimModeDuck))
17131749 then $Tuple4(currentWh[whIdxRes], addRes(currentPackRes, terrainCounts, (deltaTime - newDeltaTime), landIndex, dailyProductionByPiece), parseIntValue(loft[volOccupied]), parseIntValue(loft[volFree]))
17161752 let whAm = min([parseIntValue(loft[volFree]), resToClaim._2])
17171753 $Tuple4(distr._1, distr._2, (parseIntValue(loft[volOccupied]) + whAm), (parseIntValue(loft[volFree]) - whAm))
17181754 }
1719- let whRes = $t03659137462._1
1720- let bpRes = $t03659137462._2
1721- let loftO = $t03659137462._3
1722- let loftF = $t03659137462._4
1755+ let whRes = $t03706237933._1
1756+ let bpRes = $t03706237933._2
1757+ let loftO = $t03706237933._3
1758+ let loftF = $t03706237933._4
17231759 $Tuple5([IntegerEntry(keyStakedTimeByAssetId(c._2), newTimestamp), IntegerEntry(keyStakedTimeByTypeAssetIdAndOwner(LANDPREFIX, c._2, addr), newTimestamp)], bpKey, [currentPack[bpIdxLevel], bpRes, currentPack[bpIdxMat], currentPack[bpIdxProd]], whKey, [currentWh[whIdxLevels], whRes, currentWh[whIdxMat], currentWh[whIdxProd], makeString([loft[volLocked], toString(loftO), toString(loftF), loft[volTotal]], "_")])
17241760 }
17251761 }
17301766 func claimAll (addr,landAssetId,pieces,claimMode) = {
17311767 let timeKey = keyStakedTimeByAssetId(landAssetId)
17321768 let savedTime = value(getInteger(timeKey))
1733- let availRes = (fraction((lastBlock.timestamp - savedTime), applyBonuses(landAssetId, pieces), DAYMILLIS) * pieces)
1769+ let availRes = (fraction((finalTime() - savedTime), applyBonuses(landAssetId, pieces), DAYMILLIS) * pieces)
17341770 claimResInternal(addr, availRes, claimMode, landAssetId)
17351771 }
17361772
20072043 else [StringEntry(keyLastTxIdByUser(toString(i.originCaller)), toBase58String(i.transactionId))]
20082044
20092045
2046+func unstakeLandInternal (addr,landAssetId) = {
2047+ let whKey = keyWarehouseByLand(landAssetId)
2048+ let landInfo = split(value(assetInfo(fromBase58String(landAssetId))).description, "_")
2049+ let landSize = landInfo[recLandSize]
2050+ let pieces = numPiecesBySize(landSize)
2051+ let infraLevel = valueOrElse(getInteger(keyInfraLevelByAssetId(landAssetId)), 0)
2052+ let landIndex = (pieces / SSIZE)
2053+ let terrainCounts = countTerrains(landInfo[recTerrains])
2054+ let currentWh = getWarehouse(whKey, landIndex, infraLevel)
2055+ let currentWhRes = split(currentWh[whIdxRes], "_")
2056+ let timeKey = keyStakedTimeByAssetId(landAssetId)
2057+ let savedTime = getIntegerValue(timeKey)
2058+ let deltaTime = (finalTime() - savedTime)
2059+ if ((0 > deltaTime))
2060+ then throw(((("Saved timestamp is in future, saved = " + toString(savedTime)) + ", final = ") + toString(finalTime())))
2061+ else {
2062+ let dailyProductionByPiece = applyBonuses(landAssetId, pieces)
2063+ let resAfterClaim = virtClaimAddRes(currentWhRes, terrainCounts, deltaTime, landIndex, dailyProductionByPiece)
2064+ let artPieces = valueOrElse(getInteger(keyLandArtStatusByTypeAndAssetId(ARTPRESALE, landAssetId)), 0)
2065+ let acresFromPieces = ((pieces * MULT8) + ((((pieces * infraLevel) + artPieces) * MULT8) / 5))
2066+ let acresFromRes = (fraction(resAfterClaim._2, RESOURCEPRICEMIN, MULT8) * USDT2ACRES_MULTIPLIER)
2067+ func sumMat (acc,item) = (acc + parseIntValue(item))
2068+
2069+ let whMat = {
2070+ let $l = split(currentWh[whIdxMat], "_")
2071+ let $s = size($l)
2072+ let $acc0 = 0
2073+ func $f0_1 ($a,$i) = if (($i >= $s))
2074+ then $a
2075+ else sumMat($a, $l[$i])
2076+
2077+ func $f0_2 ($a,$i) = if (($i >= $s))
2078+ then $a
2079+ else throw("List size exceeds 6")
2080+
2081+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
2082+ }
2083+ let acresFromMat = (fraction(whMat, (2 * RESOURCEPRICEMIN), MULT8) * USDT2ACRES_MULTIPLIER)
2084+ let prods = if ((currentWh[whIdxProd] == ""))
2085+ then nil
2086+ else split_4C(currentWh[whIdxProd], "_")
2087+ func sumProd (acc,item) = {
2088+ let j = acc._2
2089+ let recipeCoeff = parseIntValue(split(productionMatrix[j], "_")[rIdxCoeff])
2090+ $Tuple2((acc._1 + ((parseIntValue(item) * recipeCoeff) * MULT6)), (j + 1))
2091+ }
2092+
2093+ let whProd = {
2094+ let $l = prods
2095+ let $s = size($l)
2096+ let $acc0 = $Tuple2(0, 0)
2097+ func $f1_1 ($a,$i) = if (($i >= $s))
2098+ then $a
2099+ else sumProd($a, $l[$i])
2100+
2101+ func $f1_2 ($a,$i) = if (($i >= $s))
2102+ then $a
2103+ else throw("List size exceeds 24")
2104+
2105+ $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($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)
2106+ }
2107+ let acresFromProd = (fraction(whProd._1, (2 * RESOURCEPRICEMIN), MULT8) * USDT2ACRES_MULTIPLIER)
2108+ $Tuple4(acresFromPieces, acresFromRes, acresFromMat, acresFromProd)
2109+ }
2110+ }
2111+
2112+
2113+func unstakeDuckInternal (addr,duckAssetId) = {
2114+ let eqKey = keyDuckEquipment(duckAssetId)
2115+ let currentSegs = split(valueOrElse(getString(eqKey), ",;,_,;,_,;,_,;,_,;,_,;,"), "_")
2116+ let bpKey = keyBackpackByDuck(duckAssetId)
2117+ let currentPack = getBackpack(bpKey)
2118+ let tempProdB = dressB(currentSegs, prodStrToBytes(currentPack[bpIdxProd]), true, nil)
2119+ let newProdStr = bytesToProdStr(tempProdB)
2120+ func sumResMat (acc,item) = (acc + parseIntValue(item))
2121+
2122+ let bpRes = {
2123+ let $l = split(currentPack[bpIdxRes], "_")
2124+ let $s = size($l)
2125+ let $acc0 = 0
2126+ func $f0_1 ($a,$i) = if (($i >= $s))
2127+ then $a
2128+ else sumResMat($a, $l[$i])
2129+
2130+ func $f0_2 ($a,$i) = if (($i >= $s))
2131+ then $a
2132+ else throw("List size exceeds 6")
2133+
2134+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
2135+ }
2136+ let acresFromRes = (fraction(bpRes, RESOURCEPRICEMIN, MULT8) * USDT2ACRES_MULTIPLIER)
2137+ let bpMat = {
2138+ let $l = split(currentPack[bpIdxMat], "_")
2139+ let $s = size($l)
2140+ let $acc0 = 0
2141+ func $f1_1 ($a,$i) = if (($i >= $s))
2142+ then $a
2143+ else sumResMat($a, $l[$i])
2144+
2145+ func $f1_2 ($a,$i) = if (($i >= $s))
2146+ then $a
2147+ else throw("List size exceeds 6")
2148+
2149+ $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6)
2150+ }
2151+ let acresFromMat = (fraction(bpMat, (2 * RESOURCEPRICEMIN), MULT8) * USDT2ACRES_MULTIPLIER)
2152+ let prods = if ((newProdStr == ""))
2153+ then nil
2154+ else split_4C(newProdStr, "_")
2155+ func sumProd (acc,item) = {
2156+ let j = acc._2
2157+ let recipeCoeff = parseIntValue(split(productionMatrix[j], "_")[rIdxCoeff])
2158+ $Tuple2((acc._1 + ((parseIntValue(item) * recipeCoeff) * MULT6)), (j + 1))
2159+ }
2160+
2161+ let bpProd = {
2162+ let $l = prods
2163+ let $s = size($l)
2164+ let $acc0 = $Tuple2(0, 0)
2165+ func $f2_1 ($a,$i) = if (($i >= $s))
2166+ then $a
2167+ else sumProd($a, $l[$i])
2168+
2169+ func $f2_2 ($a,$i) = if (($i >= $s))
2170+ then $a
2171+ else throw("List size exceeds 24")
2172+
2173+ $f2_2($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_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)
2174+ }
2175+ let acresFromProd = (fraction(bpProd._1, (2 * RESOURCEPRICEMIN), MULT8) * USDT2ACRES_MULTIPLIER)
2176+ $Tuple3(acresFromRes, acresFromMat, acresFromProd)
2177+ }
2178+
2179+
20102180 @Callable(i)
20112181 func constructorV1 (restAddr) = if ((i.caller != this))
20122182 then throw("Permission denied")
21442314
21452315
21462316 @Callable(i)
2317+func unstakeLandCallback (landAssetId,addr) = if ((toString(i.caller) != acres2AddressStr))
2318+ then throw("Permission denied")
2319+ else {
2320+ let unstakeResult = unstakeLandInternal(addr, landAssetId)
2321+ let wlgResult = invoke(wlgContract, "onStakeUnstakeLand", [addr], nil)
2322+ $Tuple2([ScriptTransfer(addressFromStringValue(addr), 1, fromBase58String(landAssetId)), DeleteEntry(keyStakedTimeByAssetId(landAssetId)), DeleteEntry(keyStakedTimeByTypeAssetIdAndOwner(LANDPREFIX, landAssetId, addr))], $Tuple5(unstakeResult._1, unstakeResult._2, unstakeResult._3, unstakeResult._4, wlgResult))
2323+ }
2324+
2325+
2326+
2327+@Callable(i)
2328+func unstakeLandREADONLY (landAssetId,addr) = {
2329+ let unstakeResult = unstakeLandInternal(addr, landAssetId)
2330+ $Tuple2(nil, unstakeResult)
2331+ }
2332+
2333+
2334+
2335+@Callable(i)
2336+func unstakeLandsFinalizeCallback (addr) = if ((toString(i.caller) != acres2AddressStr))
2337+ then throw("Permission denied")
2338+ else $Tuple2([DeleteEntry(keyStakedLandsByOwner(addr)), DeleteEntry(keyStakedPiecesByOwner(addr))], 0)
2339+
2340+
2341+
2342+@Callable(i)
21472343 func stakeDuck () = {
21482344 let prologActions = prolog(i)
21492345 if ((size(i.payments) != 1))
22342430
22352431
22362432 @Callable(i)
2433+func unstakeDuckCallback (duckAssetId,addr) = if ((toString(i.caller) != acres2AddressStr))
2434+ then throw("Permission denied")
2435+ else {
2436+ let unstakeResult = unstakeDuckInternal(addr, duckAssetId)
2437+ $Tuple2([ScriptTransfer(addressFromStringValue(addr), 1, fromBase58String(duckAssetId)), DeleteEntry(keyStakedTimeByAssetId(duckAssetId)), DeleteEntry(keyDuckIdToOwner(duckAssetId)), DeleteEntry(keyStakedTimeByTypeAssetIdAndOwner(DUCKPREFIX, duckAssetId, addr)), DeleteEntry(keyStakedDuckByOwner(addr))], unstakeResult)
2438+ }
2439+
2440+
2441+
2442+@Callable(i)
2443+func unstakeDuckREADONLY (duckAssetId,addr) = {
2444+ let unstakeResult = unstakeDuckInternal(addr, duckAssetId)
2445+ $Tuple2(nil, unstakeResult)
2446+ }
2447+
2448+
2449+
2450+@Callable(i)
22372451 func claimRes (amount,landAssetIdStr) = {
22382452 let prologActions = prolog(i)
22392453 if ((size(i.payments) != 0))
22832497 let isDeliv = (newLoc[locIdxType] == "D")
22842498 let eqKey = keyDuckEquipment(duckAssetId)
22852499 let currentEq = valueOrElse(getString(eqKey), ",;,_,;,_,;,_,;,_,;,_,;,")
2286- let $t06637066476 = subtractEquipment(currentEq, f._5)
2287- let newEq = $t06637066476._1
2288- let shouldZeroBuffs = $t06637066476._2
2289- let ignored = $t06637066476._3
2290- let $t06647968311 = if (!(onMission(tournamentContract, curLocation)))
2500+ let $t07253072636 = subtractEquipment(currentEq, f._5)
2501+ let newEq = $t07253072636._1
2502+ let shouldZeroBuffs = $t07253072636._2
2503+ let ignored = $t07253072636._3
2504+ let $t07263974471 = if (!(onMission(tournamentContract, curLocation)))
22912505 then if (isTour)
22922506 then cheatAttempt(curLocation, newLocation, 5)
22932507 else if (!(isDeliv))
23242538 else $Tuple2(curLocation, 0)
23252539 }
23262540 else throw(("Unknown curLocation:" + curLocation))
2327- let locToSave = $t06647968311._1
2328- let hpToSave = $t06647968311._2
2541+ let locToSave = $t07263974471._1
2542+ let hpToSave = $t07263974471._2
23292543 $Tuple2(((([StringEntry(locKey, locToSave), StringEntry(eqKey, newEq), IntegerEntry(keyDuckHealth(duckAssetId), hpToSave)] ++ prologActions) ++ (if (shouldZeroBuffs)
23302544 then [StringEntry(keyDuckBuffs(duckAssetId), "0_0_0_0_0")]
23312545 else nil)) ++ updateDuckStatsInternal(duckAssetId, if ((newHP > 0))
25452759 let newMat = makeString(subtractMaterials(true, mList, EXPMATERIALS), "_")
25462760 let eqKey = keyDuckEquipment(duckAssetId)
25472761 let currentEq = valueOrElse(getString(eqKey), ",;,_,;,_,;,_,;,_,;,_,;,")
2548- let $t07623176337 = subtractEquipment(currentEq, f._5)
2549- let newEq = $t07623176337._1
2550- let shouldZeroBuffs = $t07623176337._2
2551- let ignored = $t07623176337._3
2762+ let $t08239182497 = subtractEquipment(currentEq, f._5)
2763+ let newEq = $t08239182497._1
2764+ let shouldZeroBuffs = $t08239182497._2
2765+ let ignored = $t08239182497._3
25522766 let e = expeditionInternal(i.caller, i.transactionId)
25532767 let id = e._2._1
25542768 let result = if ((0 >= f._1))
28713085 let addr = toString(i.originCaller)
28723086 let virtWlgData = asAnyList(invoke(wlgContract, "checkWlgXpREADONLY", [addr], nil))
28733087 let virtWlgPoints = asInt(virtWlgData[1])
2874- let $t09214992539 = if ((0 >= virtWlgPoints))
3088+ let $t09830998699 = if ((0 >= virtWlgPoints))
28753089 then $Tuple2(0, nil)
28763090 else {
28773091 let deltaXP = asInt(invoke(wlgContract, "takeWlgXp", [addr], nil))
28793093 then $Tuple2(virtWlgPoints, [IntegerEntry(keyUserLevel(addr), asInt(virtWlgData[0])), IntegerEntry(keyUserXP(addr), asInt(virtWlgData[2]))])
28803094 else throw("Strict value is not equal to itself.")
28813095 }
2882- let wlgPoints = $t09214992539._1
2883- let wlgActions = $t09214992539._2
3096+ let wlgPoints = $t09830998699._1
3097+ let wlgActions = $t09830998699._2
28843098 let duckAssetId = valueOrErrorMessage(getString(keyStakedDuckByOwner(addr)), "You don't have a duck staked")
28853099 let freeKeyAcc = keyUserFreePoints(addr)
28863100 let freePointsAcc = (valueOrElse(getInteger(freeKeyAcc), 0) + wlgPoints)
31373351 let duckAssetId = valueOrErrorMessage(getString(keyStakedDuckByOwner(addr)), "You don't have a duck staked")
31383352 let eqKey = keyDuckEquipment(duckAssetId)
31393353 let currentEq = valueOrElse(getString(eqKey), ",;,_,;,_,;,_,;,_,;,_,;,")
3140- let $t0109717109828 = subtractEquipment(currentEq, prodUsed)
3141- let newEq = $t0109717109828._1
3142- let shouldZeroBuffs = $t0109717109828._2
3143- let isBpUsed = $t0109717109828._3
3354+ let $t0115877115988 = subtractEquipment(currentEq, prodUsed)
3355+ let newEq = $t0115877115988._1
3356+ let shouldZeroBuffs = $t0115877115988._2
3357+ let isBpUsed = $t0115877115988._3
31443358 let curLocation = valueOrElse(getString(keyDuckLocation(duckAssetId)), DEFAULTLOCATION)
31453359 if (isInTournament(tournamentContract, curLocation))
31463360 then throw("Your duck is taking part in the tournament")
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let DAYMILLIS = 86400000
5-
6-func keyLastArbTimeByUser (addr) = ("lastArbTimeUser_" + addr)
7-
8-
9-func keyAcresStakedAmountByUser (addr) = ("acresStakedAmountByUser_" + addr)
10-
11-
12-let SCALE8 = 100000000
13-
14-let xpLevelScale = 3200
15-
16-let xpLevelRecipPow = 4000
17-
18-let numPointsOnLevelUp = 3
19-
20-let requirements = ["Strength", "Accuracy", "Intellect", "Endurance", "Dexterity", "Level", "Health"]
21-
22-let charStrength = 0
23-
24-let charAccuracy = 1
25-
26-let charIntellect = 2
27-
28-let charEndurance = 3
29-
30-let charDexterity = 4
31-
32-let segBackpack = 0
33-
34-let NUMSEGMENTS = 6
35-
36-let NUMMAINAUX = 2
37-
38-let MAXSLOTS = 2
39-
40-let MAXPRODINSLOT = 30
41-
42-func keyDuckHealth (duckAssetId) = ("duckHealth_" + duckAssetId)
43-
44-
45-func keyDuckChars (duckAssetId) = ("duckChars_" + duckAssetId)
46-
47-
48-func keyDuckXP (duckAssetId) = ("duckXP_" + duckAssetId)
49-
50-
51-func keyDuckLevel (duckAssetId) = ("duckLevel_" + duckAssetId)
52-
53-
54-func keyDuckFreePoints (duckAssetId) = ("duckFreePoints_" + duckAssetId)
55-
56-
57-func keyDuckEquipment (duckAssetId) = ("duckEquipment_" + duckAssetId)
58-
59-
60-func keyUserXP (addr) = ("userXP_" + addr)
61-
62-
63-func keyUserLevel (addr) = ("userLevel_" + addr)
64-
65-
66-func keyUserFreePoints (addr) = ("userFreePoints_" + addr)
67-
68-
69-func keySavedHealth (duckAssetId) = ("savedHealth_" + duckAssetId)
70-
71-
72-func keySavedLocation (duckAssetId) = ("savedLocation_" + duckAssetId)
73-
74-
75-func keyDuckBuffs (duckAssetId) = ("duckBuffs_" + duckAssetId)
76-
77-
78-func keyLastRobberyTimeByDuck (duckAssetId) = ("lastRobberyTime_" + duckAssetId)
79-
80-
81-func keyDuckRobberyCount (duckAssetId) = ("totalRobberyCountByDuck_" + duckAssetId)
82-
83-
84-func keyUserRobberyCount (addr) = ("userRobberyCount_" + addr)
85-
86-
87-func keyUserLastRobberyDay (addr) = ("userLastRobberyDay_" + addr)
88-
89-
90-func keyDuckDeliveryCount (duckAssetId) = ("totalDeliveryCountByDuck_" + duckAssetId)
91-
92-
93-func keyUserDeliveryCount (addr) = ("userDeliveryCount_" + addr)
94-
95-
96-func keyUserLastDeliveryDay (addr) = ("userLastDeliveryDay_" + addr)
97-
98-
99-let xpClaim = 10000
100-
101-let xpSuccessFlight = 10000
102-
103-let xpFailFlight = 2000
104-
105-let xpSuccessRob = 10000
106-
107-let xpFailRob = 2000
108-
109-let xpCallES = 100000
110-
111-let xpCustomName = 1000000
112-
113-let xpNewSLand = 5000000
114-
115-let xpUpgradeInfra = 10000
116-
117-let xpMerge = 1000000
118-
119-let xpOnboard = 1000000
120-
121-let xpHeal = 10000
122-
123-func levelByXP (xp) = fraction(xpLevelScale, pow(xp, 4, xpLevelRecipPow, 4, 4, DOWN), SCALE8)
124-
125-
126-func maxHealth (level) = (100 + level)
127-
128-
129-func levelUp (currLevel,newXP) = {
130- let newLevel = levelByXP(newXP)
131-[newLevel, (numPointsOnLevelUp * (newLevel - currLevel))]
132- }
133-
134-
135-func getDuckStats (stakingContract,duckAssetId,buffEffect,forceBuffs) = {
136- let chars = split(valueOrElse(getString(stakingContract, keyDuckChars(duckAssetId)), "0_0_0_0_0"), "_")
137- let lvl = valueOrElse(getInteger(stakingContract, keyDuckLevel(duckAssetId)), 0)
138- let health = valueOrElse(getInteger(stakingContract, keyDuckHealth(duckAssetId)), maxHealth(lvl))
139- let stateBuffs = split(valueOrElse(getString(stakingContract, keyDuckBuffs(duckAssetId)), "0_0_0_0_0"), "_")
140- ([parseIntValue(chars[charStrength]), parseIntValue(chars[charAccuracy]), parseIntValue(chars[charIntellect]), parseIntValue(chars[charEndurance]), parseIntValue(chars[charDexterity]), lvl, health] ++ (if (forceBuffs)
141- then [buffEffect, buffEffect, buffEffect, buffEffect, buffEffect]
142- else [parseIntValue(stateBuffs[charStrength]), parseIntValue(stateBuffs[charAccuracy]), parseIntValue(stateBuffs[charIntellect]), parseIntValue(stateBuffs[charEndurance]), parseIntValue(stateBuffs[charDexterity])]))
143- }
4+let KS_SEPARATE_PUBLIC_KEY = false
5+
6+let KS_ALLOW_BIG_INFRA_MERGE = false
7+
8+let KS_ALLOW_ROBO_DUCKS = false
9+
10+let DAY_MILLIS = 86400000
11+
12+let chain = take(drop(this.bytes, 1), 1)
13+
14+let pub = match chain {
15+ case _ =>
16+ if ((base58'2W' == $match0))
17+ then if (KS_SEPARATE_PUBLIC_KEY)
18+ then base58'CWsMtTZC5BjjoL4Q1ayW4Wwb1ehGACQB6DrKyPgotKfm'
19+ else base58'6LfPuKJjLgekmncBhMg2LZyMTNVzZBccXR28ySXm9uXD'
20+ else if ((base58'2T' == $match0))
21+ then base58'6LfPuKJjLgekmncBhMg2LZyMTNVzZBccXR28ySXm9uXD'
22+ else throw("Unknown chain")
23+}
24+
25+let usdtAssetId = match chain {
26+ case _ =>
27+ if ((base58'2W' == $match0))
28+ then base58'9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi'
29+ else if ((base58'2T' == $match0))
30+ then base58'6mWwf9mZBjVgkC54idpyaZLQfAosD914wT8fGf2iiY63'
31+ else throw("Unknown chain")
32+}
33+
34+let defaultRestAddressStr = match chain {
35+ case _ =>
36+ if ((base58'2W' == $match0))
37+ then "3PQCuvFbvh4LkPUnrnU1z3jnbA1p9m3WNhv"
38+ else if ((base58'2T' == $match0))
39+ then "3MumkGGztCKAXpWDqxkddofqXSUbqQkvSJy"
40+ else throw("Unknown chain")
41+}
42+
43+let acres2AddressStr = match chain {
44+ case _ =>
45+ if ((base58'2W' == $match0))
46+ then "3P4UH3T9nXpMNpUmSmQjPmEz3G85t3zn6eA"
47+ else if ((base58'2T' == $match0))
48+ then "3NBPx1Fciu3JQNEGZ21jSnTdutLNGGBUSXh"
49+ else throw("Unknown chain")
50+}
51+
52+let InfraUpgradeCostS = match chain {
53+ case _ =>
54+ if ((base58'2W' == $match0))
55+ then 10000000000
56+ else if ((base58'2T' == $match0))
57+ then 100000000
58+ else throw("Unknown chain")
59+}
60+
61+let arbitrageDelay = match chain {
62+ case _ =>
63+ if ((base58'2W' == $match0))
64+ then DAY_MILLIS
65+ else if ((base58'2T' == $match0))
66+ then 60000
67+ else throw("Unknown chain")
68+}
69+
70+let SEP = "__"
71+
72+let MULT6 = 1000000
73+
74+let MULT8 = 100000000
75+
76+let SSIZE = 25
77+
78+let MSIZE = 100
79+
80+let LSIZE = 225
81+
82+let XLSIZE = 400
83+
84+let XXLSIZE = 625
85+
86+let ITER6 = [0, 1, 2, 3, 4, 5]
87+
88+func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
89+
90+
91+let IdxCfgStakingDapp = 1
92+
93+let IdxCfgEconomyDapp = 2
94+
95+let IdxCfgGovernanceDapp = 3
96+
97+let IdxCfgWlgDapp = 4
98+
99+let IdxCfgTournamentDapp = 7
100+
101+let IdxCfgAcresDapp = 8
102+
103+func keyRestCfg () = "%s__restConfig"
104+
105+
106+func keyRestAddress () = "%s__restAddr"
107+
108+
109+func readRestCfgOrFail (rest) = split_4C(getStringOrFail(rest, keyRestCfg()), SEP)
110+
111+
112+func getContractAddressOrFail (restCfg,idx) = valueOrErrorMessage(addressFromString(restCfg[idx]), ("Rest cfg doesn't contain address at index " + toString(idx)))
113+
114+
115+let restContract = addressFromStringValue(valueOrElse(getString(this, keyRestAddress()), defaultRestAddressStr))
116+
117+let restCfg = readRestCfgOrFail(restContract)
118+
119+let stakingContract = getContractAddressOrFail(restCfg, IdxCfgStakingDapp)
120+
121+let economyContract = getContractAddressOrFail(restCfg, IdxCfgEconomyDapp)
122+
123+let govContract = getContractAddressOrFail(restCfg, IdxCfgGovernanceDapp)
124+
125+let wlgContract = getContractAddressOrFail(restCfg, IdxCfgWlgDapp)
126+
127+let tournamentContract = getContractAddressOrFail(restCfg, IdxCfgTournamentDapp)
128+
129+let acresContract = getContractAddressOrFail(restCfg, IdxCfgAcresDapp)
130+
131+let recLandNum = 0
132+
133+let recLandSize = 1
134+
135+let recTerrains = 2
136+
137+let recContinent = 3
138+
139+let wlgAssetIdKey = "wlg_assetId"
140+
141+let wlgAssetId = valueOrErrorMessage(getBinary(wlgContract, wlgAssetIdKey), "WLGOLD is not issued yet")
142+
143+let acresAssetIdKey = "acresAssetId"
144+
145+let acresAssetId = valueOrErrorMessage(getBinary(acresContract, acresAssetIdKey), "ACRES is not issued yet")
146+
147+let randomDelay = 2
148+
149+func keyCommit (address) = ("finishBlockFor_" + address)
150+
151+
152+func keyResProportions () = "resTypesProportions"
153+
154+
155+func keyResTypesByContinent (continent) = ("resTypesByContinent_" + continent)
156+
157+
158+func keyStakedLandsByOwner (ownerAddr) = ("stakedLandsByOwner_" + ownerAddr)
159+
160+
161+func keyStakedPiecesByOwner (ownerAddr) = ("stakedPiecesByOwner_" + ownerAddr)
162+
163+
164+func asString (v) = match v {
165+ case s: String =>
166+ s
167+ case _ =>
168+ throw("fail to cast into String")
169+}
170+
171+
172+func asInt (v) = match v {
173+ case n: Int =>
174+ n
175+ case _ =>
176+ throw("fail to cast into Int")
177+}
178+
179+
180+func asAnyList (v) = match v {
181+ case l: List[Any] =>
182+ l
183+ case _ =>
184+ throw("fail to cast into List[Any]")
185+}
186+
187+
188+func asBoolean (v) = match v {
189+ case s: Boolean =>
190+ s
191+ case _ =>
192+ throw("fail to cast into Boolean")
193+}
194+
195+
196+func numPiecesBySize (landSize) = match landSize {
197+ case _ =>
198+ if (("S" == $match0))
199+ then SSIZE
200+ else if (("M" == $match0))
201+ then MSIZE
202+ else if (("L" == $match0))
203+ then LSIZE
204+ else if (("XL" == $match0))
205+ then XLSIZE
206+ else if (("XXL" == $match0))
207+ then XXLSIZE
208+ else throw("Unknown land size")
209+}
210+
211+
212+func isDigit (s) = isDefined(parseInt(s))
213+
214+
215+func keyBlocked () = "contractsBlocked"
216+
217+
218+func keyLastTxIdByUser (addr) = ("lastTxIdByUser_" + addr)
219+
220+
221+func fixedPoint (val,decimals) = {
222+ let tenPow = pow(10, 0, decimals, 0, 0, DOWN)
223+ let lowPart = toString((val % tenPow))
224+ let zeroes = drop(toString(tenPow), (1 + size(lowPart)))
225+ (((toString((val / tenPow)) + ".") + zeroes) + lowPart)
226+ }
227+
228+
229+func getRandomNumber (maxValue,salt,entropy) = if ((0 >= maxValue))
230+ then throw("maxValue should be > 0")
231+ else {
232+ let randomHash = sha256((salt + entropy))
233+ (toInt(randomHash) % maxValue)
234+ }
235+
236+
237+func finalTime () = min([lastBlock.timestamp, 1727740799000])
144238
145239
146240 let LANDPREFIX = "LAND"
147241
148242 let DUCKPREFIX = "DUCK"
149243
150244 let ROBO_PREFIX = "ROBO"
151245
152246 let ARTPRESALE = "PRESALE"
153247
154248 let NUMRES = 6
155249
156250 let MAX_LANDS_STAKED_BY_USER = 25
157251
158252 let DAILYRESBYPIECE = 3456000
159253
160254 let WHMULTIPLIER = 10000000000
161255
162256 let DEFAULTLOCATION = "Africa_F_Africa"
163257
164258 let RESOURCEPRICEMIN = 39637
165259
166260 let ESSELLCOEF = 10
167261
168262 let MIN_USDT_FEE_DELIVERY = 50000
263+
264+let USDT2ACRES_MULTIPLIER = 10
169265
170266 let MIN_WLGOLD_ROBBERY = 100000000
171267
172268 let ALLOWED_FREE_ROBBERIES = 0
173269
174270 let ACRES_FOR_ROBBERY_ATTEMPT = 200000000
175271
176272 let ALLOWED_FREE_DELIVERIES = 0
177273
178274 let ACRES_FOR_DELIVERY_ATTEMPT = 200000000
179275
180276 let prodTypes = ["First Aid Kit L1", "First Aid Kit L2", "First Aid Kit L3", "Backpack L1", "Backpack L2", "Backpack L3", "Food Ration L1", "Food Ration L2", "Food Ration L3", "Jet Pack L1", "Jet Pack L2", "Jet Pack L3", "Shield L1", "Shield L2", "Shield L3", "Mine L1", "Mine L2", "Mine L3", "Trap L1", "Trap L2", "Trap L3", "Boom-Dog L1", "Boom-Dog L2", "Boom-Dog L3"]
181277
182278 let continents = ["Americas", "Europe", "Asia", "Africa", "Oceania"]
183279
184280 let COEFF2MAT = 10000000
185281
186282 let productionMatrix = ["8_8_8_17_17_42_12_0_30_0,0,0,0,0,0,0_", "8_8_8_17_17_42_24_0_60_0,0,5,2,0,0,0_", "8_8_8_17_17_42_36_0_120_0,0,10,4,0,0,0_", "8_19_19_8_27_19_26_1_20_0,0,0,0,0,0,0_001", "8_19_19_8_27_19_52_1_40_0,0,0,0,0,0,0_001", "8_19_19_8_27_19_78_1_80_0,0,0,0,0,0,0_001", "8_8_8_8_8_60_13_2_2_0,0,0,0,0,0,0_011", "8_8_8_8_8_60_26_2_4_0,0,0,0,0,0,0_011", "8_8_8_8_8_60_39_2_8_0,0,0,0,0,0,0_011", "30_30_3_17_17_3_30_3_30_0,0,0,0,0,0,0_111", "30_30_3_17_17_3_60_3_50_0,0,0,0,0,0,0_111", "30_30_3_17_17_3_90_3_70_0,0,0,0,0,0,0_111", "18_18_10_18_18_18_11_4_10_0,0,0,0,0,0,0_201", "18_18_10_18_18_18_22_4_20_0,0,0,0,0,0,0_201", "18_18_10_18_18_18_33_4_30_0,0,0,0,0,0,0_201", "4_13_22_4_35_22_23_0_50,1,0_0,0,0,0,0,0,0_", "4_13_22_4_35_22_46_0_50,1,1_0,2,5,0,0,0,0_", "4_13_22_4_35_22_69_0_50,2,1_0,5,10,0,0,0,0_", "5_25_40_5_10_15_20_1_30,1,1_0,0,0,0,0,0,0_", "5_25_40_5_10_15_40_1_30,1,2_2,1,3,0,0,0,0_", "5_25_40_5_10_15_60_1_30,1,3_5,2,8,0,0,0,0_", "23_23_5_20_23_6_35_2_100_0,0,0,0,0,0,0_", "23_23_5_20_23_6_70_2_150_0,0,0,0,0,0,0_", "23_23_5_20_23_6_105_2_200_0,0,0,0,0,0,0_"]
187283
188284 let rIdxCoeff = 6
189285
190286 let rIdxEffect = 8
191287
192288 let rIdxRequirements = 9
193289
194290 let rIdxSlots = 10
195291
196292 let PRODUCTPKGSIZE = 10
197293
198294 let whIdxLevels = 0
199295
200296 let whIdxRes = 1
201297
202298 let whIdxMat = 2
203299
204300 let whIdxProd = 3
205301
206302 let whIdxLOFT = 4
207303
208304 let volLocked = 0
209305
210306 let volOccupied = 1
211307
212308 let volFree = 2
213309
214310 let volTotal = 3
215311
216312 let bpIdxLevel = 0
217313
218314 let bpIdxRes = 1
219315
220316 let bpIdxMat = 2
221317
222318 let bpIdxProd = 3
223319
224320 let locIdxContinent = 0
225321
226322 let locIdxType = 1
227323
228324 let locIdxId = 2
229325
230326 func keyLandAssetIdToOwner (assetId) = ("no_" + assetId)
231327
232328
233329 func keyLandAssetIdToCustomName (assetId) = ("lcna_" + assetId)
234330
235331
236332 func keyStakedTimeByAssetId (assetId) = ("st_" + assetId)
237333
238334
239335 func keyLandArtStatusByTypeAndAssetId (type,assetId) = makeString(["las", type, assetId], "_")
240336
241337
242338 func keyStakedTimeByTypeAssetIdAndOwner (nftType,assetId,ownerAddr) = ((((("sttao_" + nftType) + "_") + assetId) + "_") + ownerAddr)
243339
244340
245341 func keyWarehouseByLand (landAssetId) = ("wh_" + landAssetId)
246342
247343
248344 func keyInfraLevelByAssetId (assetId) = ("infraLevel_" + assetId)
249345
250346
251347 func keyDuckAssetIdToCustomName (assetId) = ("duckCustomNameByAssetId_" + assetId)
252348
253349
254350 func keyAddressToCustomName (addr) = ("accountCustomNameByAddr_" + addr)
255351
256352
257353 func keyAddressRefBy (addr) = ("accRefBy_" + addr)
258354
259355
260356 func keyOnboardArtActivatedOnDuck (duckAssetId) = ("onboardArtActivatedOnDuck_" + duckAssetId)
261357
262358
263359 func keyOnboardArtDuckActivatedBy (addr) = ("onboardArtActivatedDuckBy_" + addr)
264360
265361
266362 func keyAddressReferrals (addr) = ("accReferrals_" + addr)
267363
268364
269365 func keyDuckIdToOwner (assetId) = ("duckOwner_" + assetId)
270366
271367
272368 func keyStakedDuckByOwner (ownerAddr) = ("stakedDuckByOwner_" + ownerAddr)
273369
274370
275371 func keyBackpackByDuck (duckAssetId) = ("backPack_" + duckAssetId)
276372
277373
278374 func keyDuckLocation (duckAssetId) = ("duckLocation_" + duckAssetId)
279375
280376
281377 func keyUserGwlReleaseTime (userAddr) = ("%s%s__userGwlReleaseTime__" + userAddr)
282378
283379
284380 func keyEsWarehouse () = "emergencyWarehouseProducts"
285381
286382
287383 let deliveryFundKey = "deliveryFund"
288384
289385 let lastTourIdKey = "%s__lastTourId"
290386
291387 func keyTourStaticDataById (tId) = ("%s%d__tourStaticData__" + toString(tId))
292388
293389
294390 func keyTourDynamicDataById (tId) = ("%s%d__tourDynamicData__" + toString(tId))
295391
296392
297393 func keyBestResultByTourAndDuck (tId,duckAssetId) = makeString(["%s%d%s__bestResultByTourAndDuck", toString(tId), duckAssetId], "__")
298394
299395
300396 let idxStatic = 0
301397
302398 let idxDynamic = 1
303399
304400 let tStaticEnd = 6
305401
306402 let tDynamicStatus = 1
307403
308404 func getTourData (tourContract,tId) = {
309405 let static = split(valueOrErrorMessage(getString(tourContract, keyTourStaticDataById(tId)), (("Error reading tournament " + toString(tId)) + " data")), "__")
310406 let dynamic = split_4C(valueOrErrorMessage(getString(tourContract, keyTourDynamicDataById(tId)), (("Error reading tournament " + toString(tId)) + " data")), "__")
311407 [static, dynamic]
312408 }
313409
314410
315411 func isInTournament (tourContract,location) = {
316412 let lastId = valueOrElse(getInteger(tourContract, lastTourIdKey), 0)
317413 let loc = split(location, "_")
318414 let now = lastBlock.timestamp
319415 let tData = getTourData(tourContract, lastId)
320416 let static = tData[idxStatic]
321417 let dynamic = tData[idxDynamic]
322418 if (if (if ((loc[locIdxType] == "T"))
323419 then (parseIntValue(loc[locIdxContinent]) == lastId)
324420 else false)
325421 then (dynamic[tDynamicStatus] == "INPROGRESS")
326422 else false)
327423 then (parseIntValue(static[tStaticEnd]) > now)
328424 else false
329425 }
330426
331427
332428 func onMission (tourContract,location) = {
333429 let lastId = valueOrElse(getInteger(tourContract, lastTourIdKey), 0)
334430 let loc = split(location, "_")
335431 let now = lastBlock.timestamp
336432 let tData = getTourData(tourContract, lastId)
337433 let static = tData[idxStatic]
338434 let dynamic = tData[idxDynamic]
339435 let locType = loc[locIdxType]
340436 if (if (if ((loc[locIdxType] == "T"))
341437 then (parseIntValue(loc[locIdxContinent]) == lastId)
342438 else false)
343439 then (dynamic[tDynamicStatus] == "INPROGRESS")
344440 else false)
345441 then (parseIntValue(static[tStaticEnd]) > now)
346442 else false
347443 }
348444
349445
350446 func getRecipeMaterials (recipe) = (parseIntValue(recipe[rIdxCoeff]) * COEFF2MAT)
351447
352448
353449 func cheatAttempt (oldLoc,newLoc,cheatCase) = throw(((((("Cheat attempt: oldLoc=" + oldLoc) + ", newLoc=") + newLoc) + ", case=") + toString(cheatCase)))
354450
355451
356-let KS_SEPARATE_PUBLIC_KEY = false
357-
358-let KS_ALLOW_BIG_INFRA_MERGE = false
359-
360-let KS_ALLOW_ROBO_DUCKS = false
361-
362-let DAY_MILLIS = 86400000
363-
364-let chain = take(drop(this.bytes, 1), 1)
365-
366-let pub = match chain {
367- case _ =>
368- if ((base58'2W' == $match0))
369- then if (KS_SEPARATE_PUBLIC_KEY)
370- then base58'CWsMtTZC5BjjoL4Q1ayW4Wwb1ehGACQB6DrKyPgotKfm'
371- else base58'6LfPuKJjLgekmncBhMg2LZyMTNVzZBccXR28ySXm9uXD'
372- else if ((base58'2T' == $match0))
373- then base58'6LfPuKJjLgekmncBhMg2LZyMTNVzZBccXR28ySXm9uXD'
374- else throw("Unknown chain")
375-}
376-
377-let usdtAssetId = match chain {
378- case _ =>
379- if ((base58'2W' == $match0))
380- then base58'9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi'
381- else if ((base58'2T' == $match0))
382- then base58'6mWwf9mZBjVgkC54idpyaZLQfAosD914wT8fGf2iiY63'
383- else throw("Unknown chain")
384-}
385-
386-let defaultRestAddressStr = match chain {
387- case _ =>
388- if ((base58'2W' == $match0))
389- then "3PQCuvFbvh4LkPUnrnU1z3jnbA1p9m3WNhv"
390- else if ((base58'2T' == $match0))
391- then "3MumkGGztCKAXpWDqxkddofqXSUbqQkvSJy"
392- else throw("Unknown chain")
393-}
394-
395-let InfraUpgradeCostS = match chain {
396- case _ =>
397- if ((base58'2W' == $match0))
398- then 10000000000
399- else if ((base58'2T' == $match0))
400- then 100000000
401- else throw("Unknown chain")
402-}
403-
404-let arbitrageDelay = match chain {
405- case _ =>
406- if ((base58'2W' == $match0))
407- then DAY_MILLIS
408- else if ((base58'2T' == $match0))
409- then 60000
410- else throw("Unknown chain")
411-}
412-
413-let SEP = "__"
414-
415-let MULT6 = 1000000
416-
417-let MULT8 = 100000000
418-
419-let SSIZE = 25
420-
421-let MSIZE = 100
422-
423-let LSIZE = 225
424-
425-let XLSIZE = 400
426-
427-let XXLSIZE = 625
428-
429-let ITER6 = [0, 1, 2, 3, 4, 5]
430-
431-func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
432-
433-
434-let IdxCfgStakingDapp = 1
435-
436-let IdxCfgEconomyDapp = 2
437-
438-let IdxCfgGovernanceDapp = 3
439-
440-let IdxCfgWlgDapp = 4
441-
442-let IdxCfgTournamentDapp = 7
443-
444-let IdxCfgAcresDapp = 8
445-
446-func keyRestCfg () = "%s__restConfig"
447-
448-
449-func keyRestAddress () = "%s__restAddr"
450-
451-
452-func readRestCfgOrFail (rest) = split_4C(getStringOrFail(rest, keyRestCfg()), SEP)
453-
454-
455-func getContractAddressOrFail (restCfg,idx) = valueOrErrorMessage(addressFromString(restCfg[idx]), ("Rest cfg doesn't contain address at index " + toString(idx)))
456-
457-
458-let restContract = addressFromStringValue(valueOrElse(getString(this, keyRestAddress()), defaultRestAddressStr))
459-
460-let restCfg = readRestCfgOrFail(restContract)
461-
462-let stakingContract = getContractAddressOrFail(restCfg, IdxCfgStakingDapp)
463-
464-let economyContract = getContractAddressOrFail(restCfg, IdxCfgEconomyDapp)
465-
466-let govContract = getContractAddressOrFail(restCfg, IdxCfgGovernanceDapp)
467-
468-let wlgContract = getContractAddressOrFail(restCfg, IdxCfgWlgDapp)
469-
470-let tournamentContract = getContractAddressOrFail(restCfg, IdxCfgTournamentDapp)
471-
472-let acresContract = getContractAddressOrFail(restCfg, IdxCfgAcresDapp)
473-
474-let recLandNum = 0
475-
476-let recLandSize = 1
477-
478-let recTerrains = 2
479-
480-let recContinent = 3
481-
482-let wlgAssetIdKey = "wlg_assetId"
483-
484-let wlgAssetId = valueOrErrorMessage(getBinary(wlgContract, wlgAssetIdKey), "WLGOLD is not issued yet")
485-
486-let acresAssetIdKey = "acresAssetId"
487-
488-let acresAssetId = valueOrErrorMessage(getBinary(acresContract, acresAssetIdKey), "ACRES is not issued yet")
489-
490-let randomDelay = 2
491-
492-func keyCommit (address) = ("finishBlockFor_" + address)
493-
494-
495-func keyResProportions () = "resTypesProportions"
496-
497-
498-func keyResTypesByContinent (continent) = ("resTypesByContinent_" + continent)
499-
500-
501-func keyStakedLandsByOwner (ownerAddr) = ("stakedLandsByOwner_" + ownerAddr)
502-
503-
504-func keyStakedPiecesByOwner (ownerAddr) = ("stakedPiecesByOwner_" + ownerAddr)
505-
506-
507-func asString (v) = match v {
508- case s: String =>
509- s
510- case _ =>
511- throw("fail to cast into String")
512-}
513-
514-
515-func asInt (v) = match v {
516- case n: Int =>
517- n
518- case _ =>
519- throw("fail to cast into Int")
520-}
521-
522-
523-func asAnyList (v) = match v {
524- case l: List[Any] =>
525- l
526- case _ =>
527- throw("fail to cast into List[Any]")
528-}
529-
530-
531-func asBoolean (v) = match v {
532- case s: Boolean =>
533- s
534- case _ =>
535- throw("fail to cast into Boolean")
536-}
537-
538-
539-func numPiecesBySize (landSize) = match landSize {
540- case _ =>
541- if (("S" == $match0))
542- then SSIZE
543- else if (("M" == $match0))
544- then MSIZE
545- else if (("L" == $match0))
546- then LSIZE
547- else if (("XL" == $match0))
548- then XLSIZE
549- else if (("XXL" == $match0))
550- then XXLSIZE
551- else throw("Unknown land size")
552-}
553-
554-
555-func isDigit (s) = isDefined(parseInt(s))
556-
557-
558-func keyBlocked () = "contractsBlocked"
559-
560-
561-func keyLastTxIdByUser (addr) = ("lastTxIdByUser_" + addr)
562-
563-
564-func fixedPoint (val,decimals) = {
565- let tenPow = pow(10, 0, decimals, 0, 0, DOWN)
566- let lowPart = toString((val % tenPow))
567- let zeroes = drop(toString(tenPow), (1 + size(lowPart)))
568- (((toString((val / tenPow)) + ".") + zeroes) + lowPart)
569- }
570-
571-
572-func getRandomNumber (maxValue,salt,entropy) = if ((0 >= maxValue))
573- then throw("maxValue should be > 0")
574- else {
575- let randomHash = sha256((salt + entropy))
576- (toInt(randomHash) % maxValue)
577- }
452+let SCALE8 = 100000000
453+
454+let xpLevelScale = 3200
455+
456+let xpLevelRecipPow = 4000
457+
458+let numPointsOnLevelUp = 3
459+
460+let requirements = ["Strength", "Accuracy", "Intellect", "Endurance", "Dexterity", "Level", "Health"]
461+
462+let charStrength = 0
463+
464+let charAccuracy = 1
465+
466+let charIntellect = 2
467+
468+let charEndurance = 3
469+
470+let charDexterity = 4
471+
472+let segBackpack = 0
473+
474+let NUMSEGMENTS = 6
475+
476+let NUMMAINAUX = 2
477+
478+let MAXSLOTS = 2
479+
480+let MAXPRODINSLOT = 30
481+
482+func keyDuckHealth (duckAssetId) = ("duckHealth_" + duckAssetId)
483+
484+
485+func keyDuckChars (duckAssetId) = ("duckChars_" + duckAssetId)
486+
487+
488+func keyDuckXP (duckAssetId) = ("duckXP_" + duckAssetId)
489+
490+
491+func keyDuckLevel (duckAssetId) = ("duckLevel_" + duckAssetId)
492+
493+
494+func keyDuckFreePoints (duckAssetId) = ("duckFreePoints_" + duckAssetId)
495+
496+
497+func keyDuckEquipment (duckAssetId) = ("duckEquipment_" + duckAssetId)
498+
499+
500+func keyUserXP (addr) = ("userXP_" + addr)
501+
502+
503+func keyUserLevel (addr) = ("userLevel_" + addr)
504+
505+
506+func keyUserFreePoints (addr) = ("userFreePoints_" + addr)
507+
508+
509+func keySavedHealth (duckAssetId) = ("savedHealth_" + duckAssetId)
510+
511+
512+func keySavedLocation (duckAssetId) = ("savedLocation_" + duckAssetId)
513+
514+
515+func keyDuckBuffs (duckAssetId) = ("duckBuffs_" + duckAssetId)
516+
517+
518+func keyLastRobberyTimeByDuck (duckAssetId) = ("lastRobberyTime_" + duckAssetId)
519+
520+
521+func keyDuckRobberyCount (duckAssetId) = ("totalRobberyCountByDuck_" + duckAssetId)
522+
523+
524+func keyUserRobberyCount (addr) = ("userRobberyCount_" + addr)
525+
526+
527+func keyUserLastRobberyDay (addr) = ("userLastRobberyDay_" + addr)
528+
529+
530+func keyDuckDeliveryCount (duckAssetId) = ("totalDeliveryCountByDuck_" + duckAssetId)
531+
532+
533+func keyUserDeliveryCount (addr) = ("userDeliveryCount_" + addr)
534+
535+
536+func keyUserLastDeliveryDay (addr) = ("userLastDeliveryDay_" + addr)
537+
538+
539+let xpClaim = 10000
540+
541+let xpSuccessFlight = 10000
542+
543+let xpFailFlight = 2000
544+
545+let xpSuccessRob = 10000
546+
547+let xpFailRob = 2000
548+
549+let xpCallES = 100000
550+
551+let xpCustomName = 1000000
552+
553+let xpNewSLand = 5000000
554+
555+let xpUpgradeInfra = 10000
556+
557+let xpMerge = 1000000
558+
559+let xpOnboard = 1000000
560+
561+let xpHeal = 10000
562+
563+func levelByXP (xp) = fraction(xpLevelScale, pow(xp, 4, xpLevelRecipPow, 4, 4, DOWN), SCALE8)
564+
565+
566+func maxHealth (level) = (100 + level)
567+
568+
569+func levelUp (currLevel,newXP) = {
570+ let newLevel = levelByXP(newXP)
571+[newLevel, (numPointsOnLevelUp * (newLevel - currLevel))]
572+ }
573+
574+
575+func getDuckStats (stakingContract,duckAssetId,buffEffect,forceBuffs) = {
576+ let chars = split(valueOrElse(getString(stakingContract, keyDuckChars(duckAssetId)), "0_0_0_0_0"), "_")
577+ let lvl = valueOrElse(getInteger(stakingContract, keyDuckLevel(duckAssetId)), 0)
578+ let health = valueOrElse(getInteger(stakingContract, keyDuckHealth(duckAssetId)), maxHealth(lvl))
579+ let stateBuffs = split(valueOrElse(getString(stakingContract, keyDuckBuffs(duckAssetId)), "0_0_0_0_0"), "_")
580+ ([parseIntValue(chars[charStrength]), parseIntValue(chars[charAccuracy]), parseIntValue(chars[charIntellect]), parseIntValue(chars[charEndurance]), parseIntValue(chars[charDexterity]), lvl, health] ++ (if (forceBuffs)
581+ then [buffEffect, buffEffect, buffEffect, buffEffect, buffEffect]
582+ else [parseIntValue(stateBuffs[charStrength]), parseIntValue(stateBuffs[charAccuracy]), parseIntValue(stateBuffs[charIntellect]), parseIntValue(stateBuffs[charEndurance]), parseIntValue(stateBuffs[charDexterity])]))
583+ }
584+
585+
586+let DAYMILLIS = 86400000
587+
588+func keyLastArbTimeByUser (addr) = ("lastArbTimeUser_" + addr)
589+
590+
591+func keyAcresStakedAmountByUser (addr) = ("acresStakedAmountByUser_" + addr)
578592
579593
580594 let incubatorAddr = match chain {
581595 case _ =>
582596 if ((base58'2W' == $match0))
583597 then addressFromStringValue("3PEktVux2RhchSN63DsDo4b4mz4QqzKSeDv")
584598 else if ((base58'2T' == $match0))
585599 then this
586600 else throw("Unknown chain")
587601 }
588602
589603 let breederAddr = match chain {
590604 case _ =>
591605 if ((base58'2W' == $match0))
592606 then addressFromStringValue("3PDVuU45H7Eh5dmtNbnRNRStGwULA7NY6Hb")
593607 else if ((base58'2T' == $match0))
594608 then this
595609 else throw("Unknown chain")
596610 }
597611
598612 let FIVEMINUTESMILLIS = 300000
599613
600614 let RENAMINGCOST = 5000000
601615
602616 let MAXNAMELEN = 50
603617
604618 let InfraUpgradeCostSUsdt = 10000000
605619
606620 let EXPMATERIALS = match chain {
607621 case _ =>
608622 if ((base58'2W' == $match0))
609623 then 252289527462
610624 else if ((base58'2T' == $match0))
611625 then 2522895274
612626 else throw("Unknown chain")
613627 }
614628
615629 let EXPUSDT = match chain {
616630 case _ =>
617631 if ((base58'2W' == $match0))
618632 then 250000000
619633 else if ((base58'2T' == $match0))
620634 then 250000000
621635 else throw("Unknown chain")
622636 }
623637
624638 let ROBO_DUCK_USDT = 100000
625639
626640 let S_COST_ACRES = 2500000000
627641
628642 let FIVEX = toBigInt(5)
629643
630644 let TWENTYX = toBigInt(20)
631645
632646 let TWENTY2X = toBigInt((20 * 20))
633647
634648 let TWENTY3X = toBigInt(((20 * 20) * 20))
635649
636650 let TWENTY4X = toBigInt((((20 * 20) * 20) * 20))
637651
638652 let TWENTY5X = toBigInt(((((20 * 20) * 20) * 20) * 20))
639653
640654 let PRESALENUMLANDS = 500
641655
642656 func keyNextFreeLandNum () = "nextLandNum"
643657
644658
645659 func keyLandCustomNameToAssetId (name) = ("lcn_" + name)
646660
647661
648662 func keyLandToAssetId (landNum) = ("la_" + landNum)
649663
650664
651665 func keyInfraLevelByAssetIdAndOwner (assetId,ownerAddr) = ((("ilao_" + assetId) + "_") + ownerAddr)
652666
653667
654668 func keyLandNumToOwner (landNum) = ("lo_" + landNum)
655669
656670
657671 func keyDuckCustomNameToAssetId (name) = ("duckByCustomName_" + name)
658672
659673
660674 func keyCustomNameToAddress (name) = ("accountByCustomName_" + name)
661675
662676
663677 func keyOldies () = "oldiesList"
664678
665679
666680 func keyNextRoboDuck () = "nextRoboDuck"
667681
668682
669683 let claimModeWh = 0
670684
671685 let claimModeDuck = 1
672686
673687 let claimModeWhThenDuck = 2
674688
675689 let flHealth = 0
676690
677691 let flTimestamp = 5
678692
679693 let flBonus = 6
680694
681695 let flProdsUsed = 7
682696
683697 let rlHealth = 0
684698
685699 let rlProdsUsed = 1
686700
687701 let rlType = 0
688702
689703 let rlLastTx = 2
690704
691705 let rlTimestamp = 3
692706
693707 func nftName (landNum,landSize) = ((LANDPREFIX + landNum) + landSize)
694708
695709
696710 func toVolume (amount,pkgSize) = {
697711 let pkgs = if ((amount >= 0))
698712 then (((amount + pkgSize) - 1) / pkgSize)
699713 else -((((-(amount) + pkgSize) - 1) / pkgSize))
700714 (pkgs * MULT8)
701715 }
702716
703717
704718 func distributeByWeights (total,weights) = {
705719 let sum = (((((weights[0] + weights[1]) + weights[2]) + weights[3]) + weights[4]) + weights[5])
706720 if ((0 >= sum))
707721 then throw("Zero weights sum")
708722 else {
709723 let norm6 = fraction(total, MULT6, sum)
710724 func normalizer (acc,elem) = (acc :+ fraction(elem, norm6, MULT6))
711725
712726 let $l = weights
713727 let $s = size($l)
714728 let $acc0 = nil
715729 func $f0_1 ($a,$i) = if (($i >= $s))
716730 then $a
717731 else normalizer($a, $l[$i])
718732
719733 func $f0_2 ($a,$i) = if (($i >= $s))
720734 then $a
721735 else throw("List size exceeds 6")
722736
723737 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
724738 }
725739 }
726740
727741
728742 func getNeededMaterials (total) = {
729743 let props = split(value(getString(keyResProportions())), "_")
730744 if ((size(props) != NUMRES))
731745 then throw("Wrong proportions data")
732746 else {
733747 let r = [parseIntValue(props[0]), parseIntValue(props[1]), parseIntValue(props[2]), parseIntValue(props[3]), parseIntValue(props[4]), parseIntValue(props[5])]
734748 distributeByWeights(total, r)
735749 }
736750 }
737751
738752
739753 func subtractMaterials (shouldUseMat,has,totalNeed) = {
740754 let need = getNeededMaterials(totalNeed)
741755 func subtractor (acc,idx) = {
742756 let result = (parseIntValue(has[idx]) - need[idx])
743757 if ((0 > result))
744758 then throw(((((("Not enough material idx=" + toString(idx)) + ", you have ") + has[idx]) + ", but need ") + toString(need[idx])))
745759 else (acc :+ toString(result))
746760 }
747761
748762 if (shouldUseMat)
749763 then {
750764 let $l = ITER6
751765 let $s = size($l)
752766 let $acc0 = nil
753767 func $f0_1 ($a,$i) = if (($i >= $s))
754768 then $a
755769 else subtractor($a, $l[$i])
756770
757771 func $f0_2 ($a,$i) = if (($i >= $s))
758772 then $a
759773 else throw("List size exceeds 6")
760774
761775 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
762776 }
763777 else has
764778 }
765779
766780
767781 func subtractEquipment (oldEq,pUsed) = if ((pUsed == ""))
768782 then $Tuple3(oldEq, false, false)
769783 else {
770784 func subUsed (acc,idxAmt) = {
771785 let parts = split(idxAmt, ",")
772786 if ((size(parts) != 2))
773787 then throw("Incorrect format, should be index,amount")
774788 else {
775789 let idx = parseIntValue(parts[0])
776790 if (if ((0 > idx))
777791 then true
778792 else (idx >= size(productionMatrix)))
779793 then throw("Unknown product idx")
780794 else {
781795 let amt = parseIntValue(parts[1])
782796 let eqParts = split(acc._1, (parts[0] + ":"))
783797 if ((size(eqParts) != 2))
784798 then throw((("You don't have " + prodTypes[idx]) + " equipped"))
785799 else {
786800 let tmp = eqParts[1]
787801 let numLen = if (isDigit(take(drop(tmp, 1), 1)))
788802 then 2
789803 else 1
790804 let curr = parseIntValue(take(tmp, numLen))
791805 let tail = drop(tmp, numLen)
792806 let newAmt = if ((curr >= amt))
793807 then (curr - amt)
794808 else throw(((((("You equipped " + toString(curr)) + " of ") + prodTypes[idx]) + ", but tried to use ") + toString(amt)))
795809 $Tuple3(((((eqParts[0] + parts[0]) + ":") + toString(newAmt)) + tail), if (acc._2)
796810 then true
797811 else if (if ((idx >= 6))
798812 then (8 >= idx)
799813 else false)
800814 then (newAmt == 0)
801815 else false, if (acc._3)
802816 then true
803817 else if (if ((idx >= 3))
804818 then (5 >= idx)
805819 else false)
806820 then (amt > 0)
807821 else false)
808822 }
809823 }
810824 }
811825 }
812826
813827 let $l = split(pUsed, "_")
814828 let $s = size($l)
815829 let $acc0 = $Tuple3(oldEq, false, false)
816830 func $f0_1 ($a,$i) = if (($i >= $s))
817831 then $a
818832 else subUsed($a, $l[$i])
819833
820834 func $f0_2 ($a,$i) = if (($i >= $s))
821835 then $a
822836 else throw("List size exceeds 10")
823837
824838 $f0_2($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)
825839 }
826840
827841
828842 func prodStrToBytes (prodStr) = {
829843 let pList = if ((prodStr == ""))
830844 then nil
831845 else split_4C(prodStr, "_")
832846 func toBV (acc,recipe) = {
833847 let j = (size(acc) / 8)
834848 let curr = if ((size(pList) > j))
835849 then parseIntValue(pList[j])
836850 else 0
837851 (acc + toBytes(curr))
838852 }
839853
840854 let $l = productionMatrix
841855 let $s = size($l)
842856 let $acc0 = base58''
843857 func $f0_1 ($a,$i) = if (($i >= $s))
844858 then $a
845859 else toBV($a, $l[$i])
846860
847861 func $f0_2 ($a,$i) = if (($i >= $s))
848862 then $a
849863 else throw("List size exceeds 50")
850864
851865 $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)
852866 }
853867
854868
855869 func bytesToProdStr (bv) = {
856870 func fromBV (acc,recipe) = {
857871 let j = size(acc)
858872 let b = take(drop(bv, (8 * j)), 8)
859873 (acc :+ toString(toInt(b)))
860874 }
861875
862876 makeString_2C({
863877 let $l = productionMatrix
864878 let $s = size($l)
865879 let $acc0 = nil
866880 func $f0_1 ($a,$i) = if (($i >= $s))
867881 then $a
868882 else fromBV($a, $l[$i])
869883
870884 func $f0_2 ($a,$i) = if (($i >= $s))
871885 then $a
872886 else throw("List size exceeds 50")
873887
874888 $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)
875889 }, "_")
876890 }
877891
878892
879893 func checkStatRequirements (duckStats,reqs) = {
880894 func check (acc,j) = {
881895 let buff = if ((size(duckStats) > (7 + j)))
882896 then duckStats[(7 + j)]
883897 else 0
884898 if ((parseIntValue(reqs[j]) > (duckStats[j] + buff)))
885899 then throw(("Requirement not satisfied: " + requirements[j]))
886900 else true
887901 }
888902
889903 let $l = [0, 1, 2, 3, 4, 5, 6]
890904 let $s = size($l)
891905 let $acc0 = false
892906 func $f0_1 ($a,$i) = if (($i >= $s))
893907 then $a
894908 else check($a, $l[$i])
895909
896910 func $f0_2 ($a,$i) = if (($i >= $s))
897911 then $a
898912 else throw("List size exceeds 7")
899913
900914 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7)
901915 }
902916
903917
904918 func addProdB (idxCnt,pList,isPositive,segment,mainAux,slot,duckStats) = {
905919 let parts = split(idxCnt, ":")
906920 if ((size(parts) != 2))
907921 then throw("Incorrect format, should be index:amount")
908922 else if (if (!(isPositive))
909923 then (size(parts[0]) != 2)
910924 else false)
911925 then throw("Product idx should be 2 digits, zero padded")
912926 else {
913927 let productIdx = parseIntValue(parts[0])
914928 let count = parseIntValue(parts[1])
915929 if (if ((0 > productIdx))
916930 then true
917931 else (productIdx >= size(productionMatrix)))
918932 then throw("Unknown product idx")
919933 else if ((0 > count))
920934 then throw("Count can't be negative")
921935 else if ((count > MAXPRODINSLOT))
922936 then throw(((("Can't put more than " + toString(MAXPRODINSLOT)) + " of ") + prodTypes[productIdx]))
923937 else if ((count == 0))
924938 then $Tuple2(pList, false)
925939 else {
926940 let head = take(pList, (8 * productIdx))
927941 let curr = toInt(take(drop(pList, (8 * productIdx)), 8))
928942 let tail = drop(pList, (8 * (productIdx + 1)))
929943 let recipe = split(productionMatrix[productIdx], "_")
930944 if (if (!(isPositive))
931945 then (count > curr)
932946 else false)
933947 then throw(((((("You have " + toString(curr)) + " of ") + prodTypes[productIdx]) + ", but tried to use ") + toString(count)))
934948 else {
935949 let isBigItem = if (if (!(isPositive))
936950 then checkStatRequirements(duckStats, split(recipe[rIdxRequirements], ","))
937951 else false)
938952 then {
939953 let compat = recipe[rIdxSlots]
940954 if ((compat == ""))
941955 then throw("Item cannot be equipped")
942956 else {
943957 let c = parseIntValue(compat)
944958 let cSeg = (c / 100)
945959 if ((segment != cSeg))
946960 then throw("Segment incompatible")
947961 else {
948962 let cMainAux = ((c % 100) / 10)
949963 if ((mainAux != cMainAux))
950964 then throw("Slot incompatible")
951965 else {
952966 let cNumSlots = (c % 10)
953967 if (if ((slot != 0))
954968 then (cNumSlots > 1)
955969 else false)
956970 then throw("Big items should occupy slot 0")
957971 else (cNumSlots > 1)
958972 }
959973 }
960974 }
961975 }
962976 else false
963977 $Tuple2(((head + toBytes((curr + (if (isPositive)
964978 then count
965979 else -(count))))) + tail), isBigItem)
966980 }
967981 }
968982 }
969983 }
970984
971985
972986 func slotsGroupB (g,bpIn,isPositive,segment,mainAux,stats) = if ((g != ""))
973987 then {
974988 let slots = split(g, ",")
975989 if ((size(slots) > MAXSLOTS))
976990 then throw("Wrong slots format")
977991 else {
978992 let s0 = slots[0]
979993 let s1 = if ((size(slots) > 1))
980994 then slots[1]
981995 else ""
982996 if (if ((s0 == ""))
983997 then (s1 == "")
984998 else false)
985999 then bpIn
9861000 else {
9871001 let tmpS0 = if ((s0 != ""))
9881002 then addProdB(s0, bpIn, isPositive, segment, mainAux, 0, stats)
9891003 else $Tuple2(bpIn, false)
9901004 if ((s1 != ""))
9911005 then if (tmpS0._2)
9921006 then throw("Big item already occupies slot")
9931007 else addProdB(s1, tmpS0._1, isPositive, segment, mainAux, 1, stats)._1
9941008 else tmpS0._1
9951009 }
9961010 }
9971011 }
9981012 else bpIn
9991013
10001014
10011015 func dressB (segList,pBytes,isPositive,stats) = {
10021016 func segment (acc,seg) = {
10031017 let j = acc._1
10041018 let mainAux = split(seg, ";")
10051019 if ((size(mainAux) != NUMMAINAUX))
10061020 then throw("Wrong segment format")
10071021 else {
10081022 let m = mainAux[0]
10091023 let a = mainAux[1]
10101024 if (if ((m == ""))
10111025 then (a == "")
10121026 else false)
10131027 then $Tuple2((j + 1), acc._2)
10141028 else {
10151029 let tmpM = slotsGroupB(m, acc._2, isPositive, j, 0, stats)
10161030 $Tuple2((j + 1), slotsGroupB(a, tmpM, isPositive, j, 1, stats))
10171031 }
10181032 }
10191033 }
10201034
10211035 ( let $l = segList
10221036 let $s = size($l)
10231037 let $acc0 = $Tuple2(0, pBytes)
10241038 func $f0_1 ($a,$i) = if (($i >= $s))
10251039 then $a
10261040 else segment($a, $l[$i])
10271041
10281042 func $f0_2 ($a,$i) = if (($i >= $s))
10291043 then $a
10301044 else throw("List size exceeds 6")
10311045
10321046 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6))._2
10331047 }
10341048
10351049
10361050 func canWearCurrentEquipment (duckAssetId) = {
10371051 let eqKey = keyDuckEquipment(duckAssetId)
10381052 let currEq = split(valueOrElse(getString(eqKey), ",;,_,;,_,;,_,;,_,;,_,;,"), "_")
10391053 let EMPTY_PROD50 = base64'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=='
10401054 let tempProdB = dressB(currEq, EMPTY_PROD50, true, nil)
10411055 let segBpAux = split(currEq[segBackpack], ";")[1]
10421056 let buffEffect = if ((segBpAux == ""))
10431057 then 0
10441058 else {
10451059 let aux0 = split(segBpAux, ",")[0]
10461060 if ((aux0 == ""))
10471061 then 0
10481062 else {
10491063 let idxCnt = split(aux0, ":")
10501064 let idx = idxCnt[0]
10511065 let cnt = idxCnt[1]
10521066 if (if (if (if (if ((idx == "06"))
10531067 then true
10541068 else (idx == "07"))
10551069 then true
10561070 else (idx == "08"))
10571071 then (cnt != "")
10581072 else false)
10591073 then (parseIntValue(cnt) > 0)
10601074 else false)
10611075 then parseIntValue(split(productionMatrix[parseIntValue(idx)], "_")[rIdxEffect])
10621076 else 0
10631077 }
10641078 }
10651079 let stats = getDuckStats(this, duckAssetId, buffEffect, true)
10661080 let newProdB = dressB(currEq, tempProdB, false, stats)
10671081 (newProdB == newProdB)
10681082 }
10691083
10701084
10711085 func updateProportionsInternal (propList,terrainCounts,landSizeIndex,sign) = if ((size(propList) != NUMRES))
10721086 then throw("Wrong proportions data")
10731087 else {
10741088 func updater (acc,i) = {
10751089 let result = (parseIntValue(propList[i]) + ((sign * terrainCounts[i]) * landSizeIndex))
10761090 if ((0 > result))
10771091 then throw(((((((("Panic! Pieces of type=" + toString(i)) + ", sign=") + toString(sign)) + ", terrainCounts[i]=") + toString(terrainCounts[i])) + ", landSizeIndex=") + toString(landSizeIndex)))
10781092 else (acc :+ toString(result))
10791093 }
10801094
10811095 let $l = ITER6
10821096 let $s = size($l)
10831097 let $acc0 = nil
10841098 func $f0_1 ($a,$i) = if (($i >= $s))
10851099 then $a
10861100 else updater($a, $l[$i])
10871101
10881102 func $f0_2 ($a,$i) = if (($i >= $s))
10891103 then $a
10901104 else throw("List size exceeds 6")
10911105
10921106 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
10931107 }
10941108
10951109
10961110 func updateProportions (terrainCounts,landSizeIndex,sign) = {
10971111 let propList = split(valueOrElse(getString(keyResProportions()), "0_0_0_0_0_0"), "_")
10981112 makeString(updateProportionsInternal(propList, terrainCounts, landSizeIndex, sign), "_")
10991113 }
11001114
11011115
11021116 func countTerrains (terrains) = [(size(split(terrains, "A")) - 1), (size(split(terrains, "B")) - 1), (size(split(terrains, "C")) - 1), (size(split(terrains, "D")) - 1), (size(split(terrains, "E")) - 1), (size(split(terrains, "F")) - 1)]
11031117
11041118
11051119 func addRes (currentRes,terrainCounts,deltaTime,landSizeIndex,dailyByPieceWithBonuses) = {
11061120 func adder (acc,i) = {
11071121 let resOfType = ((fraction(deltaTime, dailyByPieceWithBonuses, DAYMILLIS) * terrainCounts[i]) * landSizeIndex)
11081122 (acc :+ toString((parseIntValue(currentRes[i]) + resOfType)))
11091123 }
11101124
11111125 let r = {
11121126 let $l = ITER6
11131127 let $s = size($l)
11141128 let $acc0 = nil
11151129 func $f0_1 ($a,$i) = if (($i >= $s))
11161130 then $a
11171131 else adder($a, $l[$i])
11181132
11191133 func $f0_2 ($a,$i) = if (($i >= $s))
11201134 then $a
11211135 else throw("List size exceeds 6")
11221136
11231137 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
11241138 }
11251139 makeString(r, "_")
11261140 }
11271141
11281142
1129-func virtClaim (terrainCounts,deltaTime,landSizeIndex,dailyByPieceWithBonuses) = {
1143+func virtClaimAddRes (currentRes,terrainCounts,deltaTime,landSizeIndex,dailyByPieceWithBonuses) = {
11301144 func adder (acc,i) = {
11311145 let resOfType = ((fraction(deltaTime, dailyByPieceWithBonuses, DAYMILLIS) * terrainCounts[i]) * landSizeIndex)
1146+ let totalResType = (parseIntValue(currentRes[i]) + resOfType)
1147+ $Tuple2((acc._1 :+ totalResType), (acc._2 + totalResType))
1148+ }
1149+
1150+ let $l = ITER6
1151+ let $s = size($l)
1152+ let $acc0 = $Tuple2(nil, 0)
1153+ func $f0_1 ($a,$i) = if (($i >= $s))
1154+ then $a
1155+ else adder($a, $l[$i])
1156+
1157+ func $f0_2 ($a,$i) = if (($i >= $s))
1158+ then $a
1159+ else throw("List size exceeds 6")
1160+
1161+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
1162+ }
1163+
1164+
1165+func virtClaim (terrainCounts,deltaTime,landSizeIndex,dailyByPieceWithBonuses) = {
1166+ func adder (acc,terrainCount) = {
1167+ let resOfType = ((fraction(deltaTime, dailyByPieceWithBonuses, DAYMILLIS) * terrainCount) * landSizeIndex)
11321168 $Tuple2((acc._1 :+ resOfType), (acc._2 + resOfType))
11331169 }
11341170
1135- let $l = ITER6
1171+ let $l = terrainCounts
11361172 let $s = size($l)
11371173 let $acc0 = $Tuple2(nil, 0)
11381174 func $f0_1 ($a,$i) = if (($i >= $s))
11391175 then $a
11401176 else adder($a, $l[$i])
11411177
11421178 func $f0_2 ($a,$i) = if (($i >= $s))
11431179 then $a
11441180 else throw("List size exceeds 6")
11451181
11461182 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
11471183 }
11481184
11491185
11501186 func distributeRes (currentWhRes,currentPackRes,resToClaim,whSpaceLeft) = {
11511187 let resListToClaim = resToClaim._1
11521188 let resAmToClaim = resToClaim._2
11531189 if ((resAmToClaim == 0))
11541190 then $Tuple2(makeString(currentWhRes, "_"), makeString(currentPackRes, "_"))
11551191 else if ((whSpaceLeft >= resAmToClaim))
11561192 then {
11571193 func addLists (acc,i) = (acc :+ toString((parseIntValue(currentWhRes[i]) + resListToClaim[i])))
11581194
11591195 let r = {
11601196 let $l = ITER6
11611197 let $s = size($l)
11621198 let $acc0 = nil
11631199 func $f0_1 ($a,$i) = if (($i >= $s))
11641200 then $a
11651201 else addLists($a, $l[$i])
11661202
11671203 func $f0_2 ($a,$i) = if (($i >= $s))
11681204 then $a
11691205 else throw("List size exceeds 6")
11701206
11711207 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
11721208 }
11731209 $Tuple2(makeString(r, "_"), makeString(currentPackRes, "_"))
11741210 }
11751211 else {
11761212 func addPartLists (acc,i) = {
11771213 let whPart = fraction(resListToClaim[i], whSpaceLeft, resAmToClaim)
11781214 $Tuple2((acc._1 :+ toString((parseIntValue(currentWhRes[i]) + whPart))), (acc._2 :+ toString(((parseIntValue(currentPackRes[i]) + resListToClaim[i]) - whPart))))
11791215 }
11801216
11811217 let r = {
11821218 let $l = ITER6
11831219 let $s = size($l)
11841220 let $acc0 = $Tuple2(nil, nil)
11851221 func $f0_1 ($a,$i) = if (($i >= $s))
11861222 then $a
11871223 else addPartLists($a, $l[$i])
11881224
11891225 func $f0_2 ($a,$i) = if (($i >= $s))
11901226 then $a
11911227 else throw("List size exceeds 6")
11921228
11931229 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
11941230 }
11951231 $Tuple2(makeString(r._1, "_"), makeString(r._2, "_"))
11961232 }
11971233 }
11981234
11991235
12001236 func abs (x) = if ((x >= toBigInt(0)))
12011237 then x
12021238 else -(x)
12031239
12041240
12051241 let freq = [[6, 9, 14, 15, 16], [5, 8, 13, 14, 15], [1, 4, 9, 10, 15], [1, 6, 7, 15, 19], [4, 7, 8, 13, 18]]
12061242
12071243 func genChar (n,freqs) = {
12081244 let rem = toInt((n % TWENTYX))
12091245 let letter = if ((freqs[0] > rem))
12101246 then "A"
12111247 else if ((freqs[1] > rem))
12121248 then "B"
12131249 else if ((freqs[2] > rem))
12141250 then "C"
12151251 else if ((freqs[3] > rem))
12161252 then "D"
12171253 else if ((freqs[4] > rem))
12181254 then "E"
12191255 else "F"
12201256 letter
12211257 }
12221258
12231259
12241260 func genTerrains (seed,continentIdx) = {
12251261 let f = freq[continentIdx]
12261262 func terrainGenerator (acc,elem) = $Tuple2((((((acc._1 + genChar(acc._2, f)) + genChar((acc._2 / TWENTYX), f)) + genChar((acc._2 / TWENTY2X), f)) + genChar((acc._2 / TWENTY3X), f)) + genChar((acc._2 / TWENTY4X), f)), (acc._2 / TWENTY5X))
12271263
12281264 let t = {
12291265 let $l = [1, 2, 3, 4, 5]
12301266 let $s = size($l)
12311267 let $acc0 = $Tuple2("", (seed / FIVEX))
12321268 func $f0_1 ($a,$i) = if (($i >= $s))
12331269 then $a
12341270 else terrainGenerator($a, $l[$i])
12351271
12361272 func $f0_2 ($a,$i) = if (($i >= $s))
12371273 then $a
12381274 else throw("List size exceeds 5")
12391275
12401276 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
12411277 }
12421278 t._1
12431279 }
12441280
12451281
12461282 let PERM25 = [7, 2, 15, 19, 8, 24, 1, 21, 16, 5, 0, 22, 20, 23, 11, 4, 18, 12, 6, 10, 3, 17, 13, 9, 14]
12471283
12481284 let TCHARS = ["A", "B", "C", "D", "E", "F"]
12491285
12501286 func genTerrainsForMerge (sumTerrains,landSizeIndex) = {
12511287 func step1 (acc,s) = {
12521288 let j = acc._2
12531289 let el = parseIntValue(s)
12541290 let x = if ((el == 0))
12551291 then 0
12561292 else if ((el >= (4 * landSizeIndex)))
12571293 then (el / landSizeIndex)
12581294 else if ((el > (3 * landSizeIndex)))
12591295 then 3
12601296 else (((el - 1) / landSizeIndex) + 1)
12611297 $Tuple3((acc._1 :+ x), (acc._2 + 1), (acc._3 + x))
12621298 }
12631299
12641300 let t = {
12651301 let $l = sumTerrains
12661302 let $s = size($l)
12671303 let $acc0 = $Tuple3(nil, 0, 0)
12681304 func $f0_1 ($a,$i) = if (($i >= $s))
12691305 then $a
12701306 else step1($a, $l[$i])
12711307
12721308 func $f0_2 ($a,$i) = if (($i >= $s))
12731309 then $a
12741310 else throw("List size exceeds 6")
12751311
12761312 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
12771313 }
12781314 let arr = t._1
12791315 let maxIdx = value(indexOf(arr, max(arr)))
12801316 let delta = (t._3 - 25)
12811317 func subber (acc,idx) = {
12821318 let val = if ((idx == maxIdx))
12831319 then (arr[idx] - delta)
12841320 else arr[idx]
12851321 let zeroes = if ((val == 0))
12861322 then nil
12871323 else split(drop(toString(pow(10, 0, val, 0, 0, DOWN)), 1), "")
12881324 let c = TCHARS[idx]
12891325 func listGen (ac,ignored) = (ac :+ c)
12901326
12911327 let z = {
12921328 let $l = zeroes
12931329 let $s = size($l)
12941330 let $acc0 = nil
12951331 func $f1_1 ($a,$i) = if (($i >= $s))
12961332 then $a
12971333 else listGen($a, $l[$i])
12981334
12991335 func $f1_2 ($a,$i) = if (($i >= $s))
13001336 then $a
13011337 else throw("List size exceeds 25")
13021338
13031339 $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($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)
13041340 }
13051341 (acc ++ z)
13061342 }
13071343
13081344 let r = {
13091345 let $l = ITER6
13101346 let $s = size($l)
13111347 let $acc0 = nil
13121348 func $f1_1 ($a,$i) = if (($i >= $s))
13131349 then $a
13141350 else subber($a, $l[$i])
13151351
13161352 func $f1_2 ($a,$i) = if (($i >= $s))
13171353 then $a
13181354 else throw("List size exceeds 6")
13191355
13201356 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6)
13211357 }
13221358 func permut (acc,j) = (acc + r[j])
13231359
13241360 let $l = PERM25
13251361 let $s = size($l)
13261362 let $acc0 = ""
13271363 func $f2_1 ($a,$i) = if (($i >= $s))
13281364 then $a
13291365 else permut($a, $l[$i])
13301366
13311367 func $f2_2 ($a,$i) = if (($i >= $s))
13321368 then $a
13331369 else throw("List size exceeds 25")
13341370
13351371 $f2_2($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_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)
13361372 }
13371373
13381374
13391375 func getBackpack (bpKey) = {
13401376 let p = split(valueOrElse(getString(bpKey), "0:0_0_0_0_0_0:0_0_0_0_0_0:"), ":")
13411377 [toString(valueOrElse(parseInt(p[bpIdxLevel]), 0)), if ((size(split(p[bpIdxRes], "_")) == NUMRES))
13421378 then p[bpIdxRes]
13431379 else "0_0_0_0_0_0", if ((size(split(p[bpIdxMat], "_")) == NUMRES))
13441380 then p[bpIdxMat]
13451381 else "0_0_0_0_0_0", p[bpIdxProd]]
13461382 }
13471383
13481384
13491385 func getWarehouseTotalVolume (volPrefix) = {
13501386 let parts = split(volPrefix, "_")
13511387 ((WHMULTIPLIER * (parseIntValue(parts[1]) + 1)) * parseIntValue(parts[0]))
13521388 }
13531389
13541390
13551391 func getWarehouseOccupiedVol (currentWh) = {
13561392 let goods = currentWh[whIdxProd]
13571393 func sumResMat (acc,item) = (acc + parseIntValue(item))
13581394
13591395 func sumProd (acc,item) = {
13601396 let idx = acc._1
13611397 let pkgs = (((parseIntValue(item) + PRODUCTPKGSIZE) - 1) / PRODUCTPKGSIZE)
13621398 $Tuple2((idx + 1), (acc._2 + (pkgs * MULT8)))
13631399 }
13641400
13651401 let whResVol = {
13661402 let $l = split(currentWh[whIdxRes], "_")
13671403 let $s = size($l)
13681404 let $acc0 = 0
13691405 func $f0_1 ($a,$i) = if (($i >= $s))
13701406 then $a
13711407 else sumResMat($a, $l[$i])
13721408
13731409 func $f0_2 ($a,$i) = if (($i >= $s))
13741410 then $a
13751411 else throw("List size exceeds 6")
13761412
13771413 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
13781414 }
13791415 let whMatVol = {
13801416 let $l = split(currentWh[whIdxMat], "_")
13811417 let $s = size($l)
13821418 let $acc0 = 0
13831419 func $f1_1 ($a,$i) = if (($i >= $s))
13841420 then $a
13851421 else sumResMat($a, $l[$i])
13861422
13871423 func $f1_2 ($a,$i) = if (($i >= $s))
13881424 then $a
13891425 else throw("List size exceeds 6")
13901426
13911427 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6)
13921428 }
13931429 let whGoodsVol = if ((goods == ""))
13941430 then 0
13951431 else ( let $l = split_4C(goods, "_")
13961432 let $s = size($l)
13971433 let $acc0 = $Tuple2(0, 0)
13981434 func $f2_1 ($a,$i) = if (($i >= $s))
13991435 then $a
14001436 else sumProd($a, $l[$i])
14011437
14021438 func $f2_2 ($a,$i) = if (($i >= $s))
14031439 then $a
14041440 else throw("List size exceeds 50")
14051441
14061442 $f2_2($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_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))._2
14071443 ((whResVol + whMatVol) + whGoodsVol)
14081444 }
14091445
14101446
14111447 func getWarehouse (whKey,landIndex,infraLevel) = {
14121448 let volPrefix = ((toString(landIndex) + "_") + toString(infraLevel))
14131449 let whTotal = getWarehouseTotalVolume(volPrefix)
14141450 let whStr = valueOrElse(getString(whKey), (volPrefix + ":0_0_0_0_0_0:0_0_0_0_0_0::0"))
14151451 let wh = split_4C(whStr, ":")
14161452 let whOccupied = getWarehouseOccupiedVol(wh)
14171453 let whLoft = if ((5 > size(wh)))
14181454 then makeString(["0", toString(whOccupied), toString((whTotal - whOccupied)), toString(whTotal)], "_")
14191455 else {
14201456 let loft = split(wh[whIdxLOFT], "_")
14211457 let whLocked = parseIntValue(loft[volLocked])
14221458 let occ = if ((size(loft) > 1))
14231459 then parseIntValue(loft[volOccupied])
14241460 else whOccupied
14251461 makeString([toString(whLocked), toString(occ), toString(((whTotal - whLocked) - occ)), toString(whTotal)], "_")
14261462 }
14271463 [wh[whIdxLevels], if ((size(split(wh[whIdxRes], "_")) == NUMRES))
14281464 then wh[whIdxRes]
14291465 else "0_0_0_0_0_0", if ((size(split(wh[whIdxMat], "_")) == NUMRES))
14301466 then wh[whIdxMat]
14311467 else "0_0_0_0_0_0", wh[whIdxProd], whLoft]
14321468 }
14331469
14341470
14351471 func getWarehouseSpaceLeft (currentWh) = {
14361472 let occupiedVol = getWarehouseOccupiedVol(currentWh)
14371473 let currWhLockedVol = parseIntValue(split(currentWh[whIdxLOFT], "_")[volLocked])
14381474 ((getWarehouseTotalVolume(currentWh[whIdxLevels]) - occupiedVol) - currWhLockedVol)
14391475 }
14401476
14411477
14421478 func moveStuff (cargoParts,currentWh,currentPack) = if ((size(cargoParts) != 3))
14431479 then throw("cargoListStr should contain exactly 2 ':' separators")
14441480 else {
14451481 let resParts = split(cargoParts[0], "_")
14461482 let matParts = split(cargoParts[1], "_")
14471483 let prodParts = if ((cargoParts[2] == ""))
14481484 then nil
14491485 else split_4C(cargoParts[2], "_")
14501486 if ((size(resParts) != NUMRES))
14511487 then throw("All 6 resources should be passed")
14521488 else if ((size(matParts) != NUMRES))
14531489 then throw("All 6 materials should be passed")
14541490 else {
14551491 let whSpaceLeft = getWarehouseSpaceLeft(currentWh)
14561492 let currWhRes = split(currentWh[whIdxRes], "_")
14571493 let currWhMat = split(currentWh[whIdxMat], "_")
14581494 let currWhProd = if ((currentWh[whIdxProd] == ""))
14591495 then nil
14601496 else split_4C(currentWh[whIdxProd], "_")
14611497 let currentPackRes = split(currentPack[bpIdxRes], "_")
14621498 let currentPackMat = split(currentPack[bpIdxMat], "_")
14631499 let currentPackProd = if ((currentPack[bpIdxProd] == ""))
14641500 then nil
14651501 else split_4C(currentPack[bpIdxProd], "_")
14661502 func mvR (acc,item) = {
14671503 let i = acc._1
14681504 let am = parseIntValue(item)
14691505 let whr = parseIntValue(currWhRes[i])
14701506 let bpr = parseIntValue(currentPackRes[i])
14711507 if ((am == 0))
14721508 then $Tuple4((i + 1), (acc._2 :+ currWhRes[i]), (acc._3 :+ currentPackRes[i]), acc._4)
14731509 else if ((am > 0))
14741510 then if ((am > bpr))
14751511 then throw((((("Attempt to take " + item) + " from backpack, but only ") + toString(bpr)) + " available"))
14761512 else $Tuple4((i + 1), (acc._2 :+ toString((whr + am))), (acc._3 :+ toString((bpr - am))), (acc._4 + am))
14771513 else if ((-(am) > whr))
14781514 then throw((((("Attempt to take " + toString(-(am))) + " from warehouse, but only ") + toString(whr)) + " available"))
14791515 else $Tuple4((i + 1), (acc._2 :+ toString((whr + am))), (acc._3 :+ toString((bpr - am))), (acc._4 + am))
14801516 }
14811517
14821518 let r = {
14831519 let $l = resParts
14841520 let $s = size($l)
14851521 let $acc0 = $Tuple4(0, nil, nil, 0)
14861522 func $f0_1 ($a,$i) = if (($i >= $s))
14871523 then $a
14881524 else mvR($a, $l[$i])
14891525
14901526 func $f0_2 ($a,$i) = if (($i >= $s))
14911527 then $a
14921528 else throw("List size exceeds 6")
14931529
14941530 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
14951531 }
14961532 func mvM (acc,item) = {
14971533 let i = acc._1
14981534 let am = parseIntValue(item)
14991535 let whm = parseIntValue(currWhMat[i])
15001536 let bpm = parseIntValue(currentPackMat[i])
15011537 if ((am == 0))
15021538 then $Tuple4((i + 1), (acc._2 :+ currWhMat[i]), (acc._3 :+ currentPackMat[i]), acc._4)
15031539 else if ((am > 0))
15041540 then if ((am > bpm))
15051541 then throw((((("Attempt to take " + item) + " from backpack, but only ") + toString(bpm)) + " available"))
15061542 else $Tuple4((i + 1), (acc._2 :+ toString((whm + am))), (acc._3 :+ toString((bpm - am))), (acc._4 + am))
15071543 else if ((-(am) > whm))
15081544 then throw((((("Attempt to take " + toString(-(am))) + " from warehouse, but only ") + toString(whm)) + " available"))
15091545 else $Tuple4((i + 1), (acc._2 :+ toString((whm + am))), (acc._3 :+ toString((bpm - am))), (acc._4 + am))
15101546 }
15111547
15121548 let m = {
15131549 let $l = matParts
15141550 let $s = size($l)
15151551 let $acc0 = $Tuple4(0, nil, nil, r._4)
15161552 func $f1_1 ($a,$i) = if (($i >= $s))
15171553 then $a
15181554 else mvM($a, $l[$i])
15191555
15201556 func $f1_2 ($a,$i) = if (($i >= $s))
15211557 then $a
15221558 else throw("List size exceeds 6")
15231559
15241560 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6)
15251561 }
15261562 func mvP (acc,item) = {
15271563 let i = acc._1
15281564 let am = parseIntValue(item)
15291565 let whp = if ((size(currWhProd) > i))
15301566 then parseIntValue(currWhProd[i])
15311567 else 0
15321568 let bpp = if ((size(currentPackProd) > i))
15331569 then parseIntValue(currentPackProd[i])
15341570 else 0
15351571 if ((am == 0))
15361572 then $Tuple4((i + 1), (acc._2 :+ toString(whp)), (acc._3 :+ toString(bpp)), acc._4)
15371573 else if ((am > 0))
15381574 then if ((am > bpp))
15391575 then throw((((("Attempt to take " + item) + " from backpack, but only ") + toString(bpp)) + " available"))
15401576 else {
15411577 let deltaVol = (toVolume((whp + am), PRODUCTPKGSIZE) - toVolume(whp, PRODUCTPKGSIZE))
15421578 $Tuple4((i + 1), (acc._2 :+ toString((whp + am))), (acc._3 :+ toString((bpp - am))), (acc._4 + deltaVol))
15431579 }
15441580 else if ((-(am) > whp))
15451581 then throw((((("Attempt to take " + toString(-(am))) + " from warehouse, but only ") + toString(whp)) + " available"))
15461582 else {
15471583 let deltaVol = (toVolume((whp + am), PRODUCTPKGSIZE) - toVolume(whp, PRODUCTPKGSIZE))
15481584 $Tuple4((i + 1), (acc._2 :+ toString((whp + am))), (acc._3 :+ toString((bpp - am))), (acc._4 + deltaVol))
15491585 }
15501586 }
15511587
15521588 let p = if ((size(prodParts) != 0))
15531589 then {
15541590 let $l = prodParts
15551591 let $s = size($l)
15561592 let $acc0 = $Tuple4(0, nil, nil, m._4)
15571593 func $f2_1 ($a,$i) = if (($i >= $s))
15581594 then $a
15591595 else mvP($a, $l[$i])
15601596
15611597 func $f2_2 ($a,$i) = if (($i >= $s))
15621598 then $a
15631599 else throw("List size exceeds 50")
15641600
15651601 $f2_2($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_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)
15661602 }
15671603 else $Tuple4(0, currWhProd, currentPackProd, m._4)
15681604 let volSaldo = p._4
15691605 if ((volSaldo > whSpaceLeft))
15701606 then throw((((("Attempt to put total " + toString(volSaldo)) + " stuff, but only ") + toString(whSpaceLeft)) + " warehouse space left"))
15711607 else $Tuple7(makeString(r._2, "_"), makeString(m._2, "_"), makeString_2C(p._2, "_"), makeString(r._3, "_"), makeString(m._3, "_"), makeString_2C(p._3, "_"), volSaldo)
15721608 }
15731609 }
15741610
15751611
15761612 func expeditionInternal (caller,txId) = {
15771613 let userAddr = toString(caller)
15781614 let bigNum = abs(toBigInt(txId))
15791615 let freeNum = valueOrElse(getInteger(keyNextFreeLandNum()), (PRESALENUMLANDS + 1))
15801616 let landNum = toString(freeNum)
15811617 let continentIdx = toInt((bigNum % FIVEX))
15821618 let terrains = genTerrains(bigNum, continentIdx)
15831619 let continent = continents[continentIdx]
15841620 let issue = Issue(nftName(landNum, "S"), makeString([landNum, "S", terrains, continent], "_"), 1, 0, false)
15851621 let assetId = calculateAssetId(issue)
15861622 let id = toBase58String(assetId)
15871623 $Tuple2([IntegerEntry(keyNextFreeLandNum(), (freeNum + 1)), issue, StringEntry(keyLandToAssetId(landNum), id), StringEntry(keyLandAssetIdToOwner(id), userAddr), StringEntry(keyLandNumToOwner(landNum), userAddr), IntegerEntry(keyInfraLevelByAssetId(id), 0), IntegerEntry(keyInfraLevelByAssetIdAndOwner(id, userAddr), 0), ScriptTransfer(caller, 1, assetId)], $Tuple2(id, continent))
15881624 }
15891625
15901626
15911627 func flightCommon (userAddr,message,sig) = if (!(sigVerify_8Kb(message, sig, pub)))
15921628 then throw("signature does not match")
15931629 else {
15941630 let parts = split_4C(toUtf8String(message), ";")
15951631 let flightLog = split_4C(parts[0], "|")
15961632 let hp = split(flightLog[flHealth], "_")
15971633 let curHP = parseIntValue(hp[0])
15981634 let newHP = parseIntValue(hp[1])
15991635 let newLocTxVer = split(parts[1], ":")
16001636 let newLocation = newLocTxVer[0]
16011637 let time = parseIntValue(flightLog[flTimestamp])
16021638 if (if ((time > (lastBlock.timestamp + FIVEMINUTESMILLIS)))
16031639 then true
16041640 else ((lastBlock.timestamp - FIVEMINUTESMILLIS) > time))
16051641 then throw(((("signature outdated: logTime=" + toString(time)) + ", bcTime=") + toString(lastBlock.timestamp)))
16061642 else {
16071643 let txFromMsg = newLocTxVer[1]
16081644 let lastTx = valueOrElse(getString(keyLastTxIdByUser(userAddr)), "")
16091645 if ((lastTx != txFromMsg))
16101646 then throw(((("Tx ids don't match! In state: " + lastTx) + ", in msg: ") + txFromMsg))
16111647 else {
16121648 let duckAssetId = valueOrErrorMessage(getString(keyStakedDuckByOwner(userAddr)), "You don't have a duck staked")
16131649 let keyHealth = keyDuckHealth(duckAssetId)
16141650 let maxHP = maxHealth(valueOrElse(getInteger(keyDuckLevel(duckAssetId)), 0))
16151651 let oldFromState = valueOrElse(getInteger(keyHealth), maxHP)
16161652 if ((oldFromState != curHP))
16171653 then throw(((("oldHealth=" + toString(oldFromState)) + " from state does not match one from flight log=") + toString(curHP)))
16181654 else if ((0 >= curHP))
16191655 then throw("You can't fly with zero health")
16201656 else if (!(canWearCurrentEquipment(duckAssetId)))
16211657 then throw("Equipment incompatible")
16221658 else {
16231659 let bonus = if ((size(flightLog) > flBonus))
16241660 then flightLog[flBonus]
16251661 else ""
16261662 let prodUsed = if ((size(flightLog) > flProdsUsed))
16271663 then flightLog[flProdsUsed]
16281664 else ""
16291665 let sentAmount = if (if ((newHP > 0))
16301666 then (bonus == "$")
16311667 else false)
16321668 then asInt(invoke(restContract, "sendUsdtPrize", [userAddr], nil))
16331669 else 0
16341670 $Tuple5(newHP, duckAssetId, sentAmount, newLocation, prodUsed)
16351671 }
16361672 }
16371673 }
16381674 }
16391675
16401676
16411677 func applyBonuses (landAssetId,pieces) = {
16421678 let infraLevel = valueOrElse(getInteger(keyInfraLevelByAssetId(landAssetId)), 0)
16431679 let artPieces = valueOrElse(getInteger(keyLandArtStatusByTypeAndAssetId(ARTPRESALE, landAssetId)), 0)
16441680 let add6 = (infraLevel / 6)
16451681 let add7 = (infraLevel / 7)
16461682 ((DAILYRESBYPIECE + fraction(DAILYRESBYPIECE, ((infraLevel + add6) + (2 * add7)), 5)) + fraction(DAILYRESBYPIECE, artPieces, (pieces * 5)))
16471683 }
16481684
16491685
16501686 func checkClaimConditions (addr,claimMode,landAssetIdIn) = {
1651- let $t03367834217 = if ((claimMode == claimModeWh))
1687+ let $t03415334692 = if ((claimMode == claimModeWh))
16521688 then $Tuple2(landAssetIdIn, valueOrElse(getString(keyStakedDuckByOwner(addr)), ""))
16531689 else {
16541690 let duckAssetId = valueOrErrorMessage(getString(keyStakedDuckByOwner(addr)), "You don't have a duck staked")
16551691 let curLocation = valueOrElse(getString(keyDuckLocation(duckAssetId)), DEFAULTLOCATION)
16561692 let loc = split(value(curLocation), "_")
16571693 if ((loc[locIdxType] != "L"))
16581694 then throw((("Duck location type is " + loc[locIdxType]) + ", but should be L"))
16591695 else $Tuple2(loc[locIdxId], duckAssetId)
16601696 }
1661- let landAssetId = $t03367834217._1
1662- let duckId = $t03367834217._2
1697+ let landAssetId = $t03415334692._1
1698+ let duckId = $t03415334692._2
16631699 let asset = value(assetInfo(fromBase58String(landAssetId)))
16641700 let timeKey = keyStakedTimeByAssetId(landAssetId)
16651701 let savedTime = valueOrErrorMessage(getInteger(timeKey), (("Land " + asset.name) + " is not staked"))
16661702 let owner = valueOrErrorMessage(getString(keyLandAssetIdToOwner(landAssetId)), (("NFT " + asset.name) + " is orphaned"))
16671703 if ((owner != addr))
16681704 then throw((LANDPREFIX + " is not yours"))
16691705 else {
16701706 let d = split(asset.description, "_")
16711707 $Tuple4(duckId, landAssetId, d, savedTime)
16721708 }
16731709 }
16741710
16751711
16761712 func claimResInternal (addr,amount,claimMode,landAssetIdIn) = if ((0 > amount))
16771713 then throw("Negative amount")
16781714 else {
16791715 let c = checkClaimConditions(addr, claimMode, landAssetIdIn)
16801716 let landSize = c._3[recLandSize]
16811717 let terrainCounts = countTerrains(c._3[recTerrains])
1682- let deltaTime = (lastBlock.timestamp - c._4)
1718+ let deltaTime = (finalTime() - c._4)
16831719 if ((0 > deltaTime))
1684- then throw(((("Saved timestamp is in future, saved = " + toString(c._4)) + ", current = ") + toString(lastBlock.timestamp)))
1720+ then throw(((("Saved timestamp is in future, saved = " + toString(c._4)) + ", final = ") + toString(finalTime())))
16851721 else {
16861722 let pieces = numPiecesBySize(landSize)
16871723 let dailyProductionByPiece = applyBonuses(c._2, pieces)
16881724 let availRes = fraction(deltaTime, (dailyProductionByPiece * pieces), DAYMILLIS)
16891725 if ((amount > availRes))
16901726 then throw(((("Not enough resources, available = " + toString(availRes)) + ", requested = ") + toString(amount)))
16911727 else {
16921728 let newDeltaTime = fraction((availRes - amount), DAYMILLIS, (dailyProductionByPiece * pieces))
1693- let newTimestamp = (lastBlock.timestamp - newDeltaTime)
1729+ let newTimestamp = (finalTime() - newDeltaTime)
16941730 let landIndex = (pieces / SSIZE)
16951731 let resToClaim = virtClaim(terrainCounts, (deltaTime - newDeltaTime), landIndex, dailyProductionByPiece)
16961732 let whKey = keyWarehouseByLand(c._2)
16971733 let infraLevel = valueOrElse(getInteger(keyInfraLevelByAssetId(c._2)), 0)
16981734 let currentWh = getWarehouse(whKey, landIndex, infraLevel)
16991735 let loft = split(currentWh[whIdxLOFT], "_")
17001736 let whSpaceLeft = parseIntValue(loft[volFree])
17011737 if (if ((claimMode == claimModeWh))
17021738 then (amount > whSpaceLeft)
17031739 else false)
17041740 then throw((("Only " + toString(whSpaceLeft)) + " space left in warehouse"))
17051741 else {
17061742 let bpKey = keyBackpackByDuck(c._1)
17071743 let currentPack = getBackpack(bpKey)
17081744 let currentPackRes = split(currentPack[bpIdxRes], "_")
17091745 let currentWhRes = split(currentWh[whIdxRes], "_")
1710- let $t03659137462 = if ((claimMode == claimModeWh))
1746+ let $t03706237933 = if ((claimMode == claimModeWh))
17111747 then $Tuple4(addRes(currentWhRes, terrainCounts, (deltaTime - newDeltaTime), landIndex, dailyProductionByPiece), currentPack[bpIdxRes], (parseIntValue(loft[volOccupied]) + resToClaim._2), (parseIntValue(loft[volFree]) - resToClaim._2))
17121748 else if ((claimMode == claimModeDuck))
17131749 then $Tuple4(currentWh[whIdxRes], addRes(currentPackRes, terrainCounts, (deltaTime - newDeltaTime), landIndex, dailyProductionByPiece), parseIntValue(loft[volOccupied]), parseIntValue(loft[volFree]))
17141750 else {
17151751 let distr = distributeRes(currentWhRes, currentPackRes, resToClaim, whSpaceLeft)
17161752 let whAm = min([parseIntValue(loft[volFree]), resToClaim._2])
17171753 $Tuple4(distr._1, distr._2, (parseIntValue(loft[volOccupied]) + whAm), (parseIntValue(loft[volFree]) - whAm))
17181754 }
1719- let whRes = $t03659137462._1
1720- let bpRes = $t03659137462._2
1721- let loftO = $t03659137462._3
1722- let loftF = $t03659137462._4
1755+ let whRes = $t03706237933._1
1756+ let bpRes = $t03706237933._2
1757+ let loftO = $t03706237933._3
1758+ let loftF = $t03706237933._4
17231759 $Tuple5([IntegerEntry(keyStakedTimeByAssetId(c._2), newTimestamp), IntegerEntry(keyStakedTimeByTypeAssetIdAndOwner(LANDPREFIX, c._2, addr), newTimestamp)], bpKey, [currentPack[bpIdxLevel], bpRes, currentPack[bpIdxMat], currentPack[bpIdxProd]], whKey, [currentWh[whIdxLevels], whRes, currentWh[whIdxMat], currentWh[whIdxProd], makeString([loft[volLocked], toString(loftO), toString(loftF), loft[volTotal]], "_")])
17241760 }
17251761 }
17261762 }
17271763 }
17281764
17291765
17301766 func claimAll (addr,landAssetId,pieces,claimMode) = {
17311767 let timeKey = keyStakedTimeByAssetId(landAssetId)
17321768 let savedTime = value(getInteger(timeKey))
1733- let availRes = (fraction((lastBlock.timestamp - savedTime), applyBonuses(landAssetId, pieces), DAYMILLIS) * pieces)
1769+ let availRes = (fraction((finalTime() - savedTime), applyBonuses(landAssetId, pieces), DAYMILLIS) * pieces)
17341770 claimResInternal(addr, availRes, claimMode, landAssetId)
17351771 }
17361772
17371773
17381774 func upInfraCommon (shouldUseMat,caller,paymentAmount,landAssetId) = {
17391775 let addr = toString(caller)
17401776 let c = checkClaimConditions(addr, claimModeWhThenDuck, landAssetId)
17411777 let pieces = numPiecesBySize(c._3[recLandSize])
17421778 let infraKey = keyInfraLevelByAssetId(c._2)
17431779 let curLevel = valueOrElse(getInteger(infraKey), 0)
17441780 if (if (!(KS_ALLOW_BIG_INFRA_MERGE))
17451781 then (curLevel >= 3)
17461782 else false)
17471783 then throw("Currently max infrastructure level = 3")
17481784 else {
17491785 let maxInfra = ((sqrt(pieces, 0, 0, DOWN) / 5) + 2)
17501786 let newLevel = (curLevel + 1)
17511787 if (if (KS_ALLOW_BIG_INFRA_MERGE)
17521788 then (newLevel > maxInfra)
17531789 else false)
17541790 then throw(("Currently max infrastructure level = " + toString(maxInfra)))
17551791 else {
17561792 let cost = fraction(InfraUpgradeCostSUsdt, (pieces * newLevel), SSIZE)
17571793 if (if (!(shouldUseMat))
17581794 then (paymentAmount != cost)
17591795 else false)
17601796 then throw(("Payment attached should be " + toString(cost)))
17611797 else {
17621798 let bpKey = keyBackpackByDuck(c._1)
17631799 let currentPack = getBackpack(bpKey)
17641800 let mList = split(currentPack[bpIdxMat], "_")
17651801 let matUsed = fraction(InfraUpgradeCostS, (pieces * newLevel), SSIZE)
17661802 let newMat = makeString(subtractMaterials(shouldUseMat, mList, matUsed), "_")
17671803 let claimResult = claimAll(addr, c._2, pieces, claimModeWhThenDuck)
17681804 let whData = claimResult._5
17691805 let oldVol = getWarehouseTotalVolume(whData[whIdxLevels])
17701806 let newVolData = makeString([split(whData[whIdxLevels], "_")[0], toString(newLevel)], "_")
17711807 let newVol = getWarehouseTotalVolume(newVolData)
17721808 let loft = split(whData[whIdxLOFT], "_")
17731809 let newLoftStr = makeString([loft[volLocked], loft[volOccupied], toString(((parseIntValue(loft[volFree]) + newVol) - oldVol)), toString(newVol)], "_")
17741810 $Tuple3(([IntegerEntry(infraKey, newLevel), IntegerEntry(keyInfraLevelByAssetIdAndOwner(c._2, addr), newLevel), StringEntry(bpKey, makeString([currentPack[bpIdxLevel], claimResult._3[bpIdxRes], newMat, currentPack[bpIdxProd]], ":")), StringEntry(claimResult._4, makeString([newVolData, whData[whIdxRes], whData[whIdxMat], whData[whIdxProd], newLoftStr], ":"))] ++ claimResult._1), newLevel, matUsed)
17751811 }
17761812 }
17771813 }
17781814 }
17791815
17801816
17811817 func updateStatsInternal (lvlKey,xpKey,pointsKey,deltaXP) = {
17821818 let xp = valueOrElse(getInteger(xpKey), 0)
17831819 let newXP = (xp + deltaXP)
17841820 let lvlPoints = levelUp(valueOrElse(getInteger(lvlKey), 0), newXP)
17851821 $Tuple2([IntegerEntry(lvlKey, lvlPoints[0]), IntegerEntry(xpKey, newXP), IntegerEntry(pointsKey, (valueOrElse(getInteger(pointsKey), 0) + lvlPoints[1]))], newXP)
17861822 }
17871823
17881824
17891825 func updateDuckStatsInternal (duckAssetId,deltaXP) = {
17901826 let asset = value(assetInfo(fromBase58String(duckAssetId)))
17911827 let addr = valueOrErrorMessage(getString(keyDuckIdToOwner(duckAssetId)), (("NFT " + asset.name) + " is orphaned"))
17921828 if (if (if (KS_ALLOW_ROBO_DUCKS)
17931829 then (asset.issuer == this)
17941830 else false)
17951831 then contains(asset.name, ROBO_PREFIX)
17961832 else false)
17971833 then updateStatsInternal(keyUserLevel(addr), keyUserXP(addr), keyUserFreePoints(addr), deltaXP)
17981834 else updateStatsInternal(keyDuckLevel(duckAssetId), keyDuckXP(duckAssetId), keyDuckFreePoints(duckAssetId), deltaXP)
17991835 }
18001836
18011837
18021838 func updateAccStatsInternal (addr,deltaXP) = updateStatsInternal(keyUserLevel(addr), keyUserXP(addr), keyUserFreePoints(addr), deltaXP)
18031839
18041840
18051841 func activateOnboardArt (addr) = {
18061842 let duckAssetId = valueOrErrorMessage(getString(keyStakedDuckByOwner(addr)), "You don't have a duck staked")
18071843 let refByKey = keyAddressRefBy(addr)
18081844 let refBy = getString(refByKey)
18091845 if (!(isDefined(refBy)))
18101846 then throw("You are not eligible for ONBOARD artifact")
18111847 else {
18121848 let artKey = keyOnboardArtDuckActivatedBy(addr)
18131849 let artDuck = getString(artKey)
18141850 if (isDefined(artDuck))
18151851 then throw(("You already used your ONBOARD artifact on duck " + value(artDuck)))
18161852 else {
18171853 let duckActivatorKey = keyOnboardArtActivatedOnDuck(duckAssetId)
18181854 let duckActivator = getString(duckActivatorKey)
18191855 if (isDefined(duckActivator))
18201856 then throw(((("The duck " + duckAssetId) + " already got points from ONBOARD artifact from user ") + value(duckActivator)))
18211857 else ([StringEntry(artKey, duckAssetId), StringEntry(duckActivatorKey, addr)] ++ updateDuckStatsInternal(duckAssetId, xpOnboard)._1)
18221858 }
18231859 }
18241860 }
18251861
18261862
18271863 func activatePresaleArt (addr,landAssetIdIn) = {
18281864 let c = checkClaimConditions(addr, claimModeWhThenDuck, landAssetIdIn)
18291865 let landAssetId = c._2
18301866 let pieces = numPiecesBySize(c._3[recLandSize])
18311867 let activationKey = keyLandArtStatusByTypeAndAssetId(ARTPRESALE, landAssetId)
18321868 if ((valueOrElse(getInteger(activationKey), 0) > 0))
18331869 then throw("Presale artifact is already activated")
18341870 else if ((parseIntValue(c._3[recLandNum]) > PRESALENUMLANDS))
18351871 then throw((((LANDPREFIX + " ") + landAssetId) + " is not eligible for presale artifact"))
18361872 else {
18371873 let claimResult = claimAll(addr, landAssetId, pieces, claimModeWhThenDuck)
18381874 (((claimResult._1 :+ IntegerEntry(activationKey, pieces)) :+ StringEntry(claimResult._2, makeString(claimResult._3, ":"))) :+ StringEntry(claimResult._4, makeString(claimResult._5, ":")))
18391875 }
18401876 }
18411877
18421878
18431879 func checkTournament (duckAssetId) = {
18441880 let lastId = valueOrElse(getInteger(tournamentContract, lastTourIdKey), 0)
18451881 let curLocation = split(valueOrElse(getString(keyDuckLocation(duckAssetId)), DEFAULTLOCATION), "_")
18461882 let now = lastBlock.timestamp
18471883 let tData = getTourData(tournamentContract, lastId)
18481884 let static = tData[idxStatic]
18491885 let dynamic = tData[idxDynamic]
18501886 if ((curLocation[locIdxType] != "T"))
18511887 then false
18521888 else if (if (if ((parseIntValue(curLocation[locIdxContinent]) == lastId))
18531889 then (dynamic[tDynamicStatus] == "INPROGRESS")
18541890 else false)
18551891 then (parseIntValue(static[tStaticEnd]) > now)
18561892 else false)
18571893 then throw("Your duck is taking part in the tournament")
18581894 else asBoolean(invoke(this, "exitTournamentInternal", [duckAssetId], nil))
18591895 }
18601896
18611897
18621898 func mergeInternal (newLandSize,newLevel,formula,addr,landAssetIds,needMat) = {
18631899 let duckAssetId = valueOrErrorMessage(getString(keyStakedDuckByOwner(addr)), "You don't have a duck staked")
18641900 if (checkTournament(duckAssetId))
18651901 then throw("mergeInternal_checkTournament")
18661902 else {
18671903 func checkMerge (acc,landAssetId) = {
18681904 let asset = value(assetInfo(fromBase58String(landAssetId)))
18691905 let timeKey = keyStakedTimeByAssetId(landAssetId)
18701906 let savedTime = valueOrErrorMessage(getInteger(timeKey), (("NFT " + asset.name) + " is not staked"))
18711907 let owner = valueOrErrorMessage(getString(keyLandAssetIdToOwner(landAssetId)), (("NFT " + asset.name) + " is orphaned"))
18721908 if ((owner != addr))
18731909 then throw((LANDPREFIX + " is not yours"))
18741910 else {
18751911 let d = split(asset.description, "_")
18761912 let continent = d[recContinent]
18771913 if (if ((acc._3 != ""))
18781914 then (acc._3 != continent)
18791915 else false)
18801916 then throw("Lands should be on the same continent to merge")
18811917 else {
18821918 let landSize = d[recLandSize]
18831919 let sizesIn = acc._1
18841920 let i = valueOrErrorMessage(indexOf(sizesIn, landSize), "You haven't passed all the lands needed")
18851921 let sizesOut = (take(sizesIn, i) + drop(sizesIn, (i + 1)))
18861922 let pieces = numPiecesBySize(landSize)
18871923 let arts = (acc._2 + valueOrElse(getInteger(keyLandArtStatusByTypeAndAssetId(ARTPRESALE, landAssetId)), 0))
18881924 let infraLevel = valueOrElse(getInteger(keyInfraLevelByAssetId(landAssetId)), 0)
18891925 let reqLevel = match landSize {
18901926 case _ =>
18911927 if (("S" == $match0))
18921928 then 3
18931929 else if (("M" == $match0))
18941930 then 4
18951931 else if (("L" == $match0))
18961932 then 5
18971933 else if (("XL" == $match0))
18981934 then 6
18991935 else throw("Only S, M, L, XL can merge")
19001936 }
19011937 if ((infraLevel != reqLevel))
19021938 then throw("All lands should be maxed to merge")
19031939 else {
19041940 let landNum = d[recLandNum]
19051941 let terrainCounts = countTerrains(d[recTerrains])
19061942 let deltaTime = (lastBlock.timestamp - savedTime)
19071943 if ((0 > deltaTime))
19081944 then throw(((("Saved timestamp is in future, saved = " + toString(savedTime)) + ", current = ") + toString(lastBlock.timestamp)))
19091945 else {
19101946 let dailyProductionByPiece = applyBonuses(landAssetId, pieces)
19111947 let landIndex = (pieces / SSIZE)
19121948 let bpRes = addRes(split(acc._4, "_"), terrainCounts, deltaTime, landIndex, dailyProductionByPiece)
19131949 let props = updateProportionsInternal(acc._6, terrainCounts, landIndex, -1)
19141950 let cProps = updateProportionsInternal(acc._10, terrainCounts, landIndex, -1)
19151951 let sumTerrains = updateProportionsInternal(acc._9, terrainCounts, landIndex, 1)
19161952 let lands = acc._7
19171953 let idx = indexOf(lands, landAssetId)
19181954 if (!(isDefined(idx)))
19191955 then throw(("Your staked lands don't contain " + landAssetId))
19201956 else {
19211957 let customKey = keyLandAssetIdToCustomName(landAssetId)
19221958 let customName = valueOrElse(getString(customKey), "")
19231959 $Tuple10(sizesOut, arts, continent, bpRes, ((((((((((((acc._5 :+ DeleteEntry(keyStakedTimeByAssetId(landAssetId))) :+ DeleteEntry(keyStakedTimeByTypeAssetIdAndOwner(LANDPREFIX, landAssetId, addr))) :+ DeleteEntry(keyLandToAssetId(landNum))) :+ DeleteEntry(keyLandAssetIdToOwner(landAssetId))) :+ DeleteEntry(keyInfraLevelByAssetId(landAssetId))) :+ DeleteEntry(keyInfraLevelByAssetIdAndOwner(landAssetId, addr))) :+ DeleteEntry(keyLandArtStatusByTypeAndAssetId(ARTPRESALE, landAssetId))) :+ DeleteEntry(keyLandNumToOwner(landNum))) :+ DeleteEntry(keyWarehouseByLand(landAssetId))) :+ DeleteEntry(customKey)) :+ Burn(fromBase58String(landAssetId), 1)) ++ (if ((customName != ""))
19241960 then [DeleteEntry(keyLandCustomNameToAssetId(customName))]
19251961 else nil)), props, removeByIndex(lands, value(idx)), (acc._8 + pieces), sumTerrains, cProps)
19261962 }
19271963 }
19281964 }
19291965 }
19301966 }
19311967 }
19321968
19331969 let bpKey = keyBackpackByDuck(duckAssetId)
19341970 let currentPack = getBackpack(bpKey)
19351971 let propList = split(valueOrElse(getString(keyResProportions()), "0_0_0_0_0_0"), "_")
19361972 let landsKey = keyStakedLandsByOwner(addr)
19371973 let landsStr = getString(landsKey)
19381974 let landsIn = if (isDefined(landsStr))
19391975 then split_51C(value(landsStr), "_")
19401976 else nil
19411977 let cont0 = split(value(assetInfo(fromBase58String(landAssetIds[0]))).description, "_")[recContinent]
19421978 let contProps = split(valueOrElse(getString(keyResTypesByContinent(cont0)), "0_0_0_0_0_0"), "_")
19431979 let r = {
19441980 let $l = landAssetIds
19451981 let $s = size($l)
19461982 let $acc0 = $Tuple10(formula, 0, "", currentPack[bpIdxRes], nil, propList, landsIn, 0, split("0_0_0_0_0_0", "_"), contProps)
19471983 func $f0_1 ($a,$i) = if (($i >= $s))
19481984 then $a
19491985 else checkMerge($a, $l[$i])
19501986
19511987 func $f0_2 ($a,$i) = if (($i >= $s))
19521988 then $a
19531989 else throw("List size exceeds 5")
19541990
19551991 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
19561992 }
19571993 let continent = r._3
19581994 let continentIdx = valueOrErrorMessage(indexOf(continents, continent), ("Unknown continent: " + continent))
19591995 let terrains = genTerrainsForMerge(r._9, (numPiecesBySize(newLandSize) / SSIZE))
19601996 let freeNum = valueOrElse(getInteger(keyNextFreeLandNum()), (PRESALENUMLANDS + 1))
19611997 let newLandNum = toString(freeNum)
19621998 let issue = Issue(nftName(newLandNum, newLandSize), makeString([newLandNum, newLandSize, terrains, continent], "_"), 1, 0, false)
19631999 let assetId = calculateAssetId(issue)
19642000 let newLandAssetId = toBase58String(assetId)
19652001 let newMat = makeString(subtractMaterials((needMat > 0), split(currentPack[bpIdxMat], "_"), needMat), "_")
19662002 let piecesKey = keyStakedPiecesByOwner(addr)
19672003 let stakedPieces = valueOrElse(getInteger(piecesKey), 0)
19682004 $Tuple2((((((((((((((((r._5 :+ (if ((size(r._7) > 0))
19692005 then StringEntry(landsKey, makeString_11C(r._7, "_"))
19702006 else DeleteEntry(landsKey))) :+ IntegerEntry(piecesKey, if ((r._8 > stakedPieces))
19712007 then 0
19722008 else (stakedPieces - r._8))) :+ IntegerEntry(keyNextFreeLandNum(), (freeNum + 1))) :+ issue) :+ StringEntry(keyLandToAssetId(newLandNum), newLandAssetId)) :+ StringEntry(keyLandAssetIdToOwner(newLandAssetId), addr)) :+ StringEntry(keyLandNumToOwner(newLandNum), addr)) :+ IntegerEntry(keyLandArtStatusByTypeAndAssetId(ARTPRESALE, newLandAssetId), r._2)) :+ IntegerEntry(keyInfraLevelByAssetId(newLandAssetId), newLevel)) :+ IntegerEntry(keyInfraLevelByAssetIdAndOwner(newLandAssetId, addr), newLevel)) :+ StringEntry(bpKey, makeString([currentPack[bpIdxLevel], r._4, newMat, currentPack[bpIdxProd]], ":"))) :+ StringEntry(keyResProportions(), makeString(r._6, "_"))) :+ StringEntry(keyResTypesByContinent(continent), makeString(r._10, "_"))) :+ StringEntry(keyDuckLocation(duckAssetId), makeString([continent, "L", newLandAssetId], "_"))) :+ ScriptTransfer(addressFromStringValue(addr), 1, assetId)), newLandAssetId)
19732009 }
19742010 }
19752011
19762012
19772013 func s2m (addr,landAssetIds) = mergeInternal("M", 3, "SSSS", addr, landAssetIds, 0)
19782014
19792015
19802016 func m2l (addr,landAssetIds) = mergeInternal("L", 4, "SMM", addr, landAssetIds, (InfraUpgradeCostS * 4))
19812017
19822018
19832019 func l2xl (addr,landAssetIds) = mergeInternal("XL", 5, "SSSML", addr, landAssetIds, (InfraUpgradeCostS * 47))
19842020
19852021
19862022 func xl2xxl (addr,landAssetIds) = mergeInternal("XXL", 6, "LXL", addr, landAssetIds, (InfraUpgradeCostS * 54))
19872023
19882024
19892025 func mergeCommon (addr,landAssetIds) = match size(landAssetIds) {
19902026 case _ =>
19912027 if ((4 == $match0))
19922028 then s2m(addr, landAssetIds)
19932029 else if ((3 == $match0))
19942030 then m2l(addr, landAssetIds)
19952031 else if ((5 == $match0))
19962032 then l2xl(addr, landAssetIds)
19972033 else if ((2 == $match0))
19982034 then xl2xxl(addr, landAssetIds)
19992035 else throw("Unknown merge")
20002036 }
20012037
20022038
20032039 func prolog (i) = if (if ((i.originCaller != restContract))
20042040 then valueOrElse(getBoolean(keyBlocked()), false)
20052041 else false)
20062042 then throw("Contracts are under maintenance")
20072043 else [StringEntry(keyLastTxIdByUser(toString(i.originCaller)), toBase58String(i.transactionId))]
20082044
20092045
2046+func unstakeLandInternal (addr,landAssetId) = {
2047+ let whKey = keyWarehouseByLand(landAssetId)
2048+ let landInfo = split(value(assetInfo(fromBase58String(landAssetId))).description, "_")
2049+ let landSize = landInfo[recLandSize]
2050+ let pieces = numPiecesBySize(landSize)
2051+ let infraLevel = valueOrElse(getInteger(keyInfraLevelByAssetId(landAssetId)), 0)
2052+ let landIndex = (pieces / SSIZE)
2053+ let terrainCounts = countTerrains(landInfo[recTerrains])
2054+ let currentWh = getWarehouse(whKey, landIndex, infraLevel)
2055+ let currentWhRes = split(currentWh[whIdxRes], "_")
2056+ let timeKey = keyStakedTimeByAssetId(landAssetId)
2057+ let savedTime = getIntegerValue(timeKey)
2058+ let deltaTime = (finalTime() - savedTime)
2059+ if ((0 > deltaTime))
2060+ then throw(((("Saved timestamp is in future, saved = " + toString(savedTime)) + ", final = ") + toString(finalTime())))
2061+ else {
2062+ let dailyProductionByPiece = applyBonuses(landAssetId, pieces)
2063+ let resAfterClaim = virtClaimAddRes(currentWhRes, terrainCounts, deltaTime, landIndex, dailyProductionByPiece)
2064+ let artPieces = valueOrElse(getInteger(keyLandArtStatusByTypeAndAssetId(ARTPRESALE, landAssetId)), 0)
2065+ let acresFromPieces = ((pieces * MULT8) + ((((pieces * infraLevel) + artPieces) * MULT8) / 5))
2066+ let acresFromRes = (fraction(resAfterClaim._2, RESOURCEPRICEMIN, MULT8) * USDT2ACRES_MULTIPLIER)
2067+ func sumMat (acc,item) = (acc + parseIntValue(item))
2068+
2069+ let whMat = {
2070+ let $l = split(currentWh[whIdxMat], "_")
2071+ let $s = size($l)
2072+ let $acc0 = 0
2073+ func $f0_1 ($a,$i) = if (($i >= $s))
2074+ then $a
2075+ else sumMat($a, $l[$i])
2076+
2077+ func $f0_2 ($a,$i) = if (($i >= $s))
2078+ then $a
2079+ else throw("List size exceeds 6")
2080+
2081+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
2082+ }
2083+ let acresFromMat = (fraction(whMat, (2 * RESOURCEPRICEMIN), MULT8) * USDT2ACRES_MULTIPLIER)
2084+ let prods = if ((currentWh[whIdxProd] == ""))
2085+ then nil
2086+ else split_4C(currentWh[whIdxProd], "_")
2087+ func sumProd (acc,item) = {
2088+ let j = acc._2
2089+ let recipeCoeff = parseIntValue(split(productionMatrix[j], "_")[rIdxCoeff])
2090+ $Tuple2((acc._1 + ((parseIntValue(item) * recipeCoeff) * MULT6)), (j + 1))
2091+ }
2092+
2093+ let whProd = {
2094+ let $l = prods
2095+ let $s = size($l)
2096+ let $acc0 = $Tuple2(0, 0)
2097+ func $f1_1 ($a,$i) = if (($i >= $s))
2098+ then $a
2099+ else sumProd($a, $l[$i])
2100+
2101+ func $f1_2 ($a,$i) = if (($i >= $s))
2102+ then $a
2103+ else throw("List size exceeds 24")
2104+
2105+ $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($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)
2106+ }
2107+ let acresFromProd = (fraction(whProd._1, (2 * RESOURCEPRICEMIN), MULT8) * USDT2ACRES_MULTIPLIER)
2108+ $Tuple4(acresFromPieces, acresFromRes, acresFromMat, acresFromProd)
2109+ }
2110+ }
2111+
2112+
2113+func unstakeDuckInternal (addr,duckAssetId) = {
2114+ let eqKey = keyDuckEquipment(duckAssetId)
2115+ let currentSegs = split(valueOrElse(getString(eqKey), ",;,_,;,_,;,_,;,_,;,_,;,"), "_")
2116+ let bpKey = keyBackpackByDuck(duckAssetId)
2117+ let currentPack = getBackpack(bpKey)
2118+ let tempProdB = dressB(currentSegs, prodStrToBytes(currentPack[bpIdxProd]), true, nil)
2119+ let newProdStr = bytesToProdStr(tempProdB)
2120+ func sumResMat (acc,item) = (acc + parseIntValue(item))
2121+
2122+ let bpRes = {
2123+ let $l = split(currentPack[bpIdxRes], "_")
2124+ let $s = size($l)
2125+ let $acc0 = 0
2126+ func $f0_1 ($a,$i) = if (($i >= $s))
2127+ then $a
2128+ else sumResMat($a, $l[$i])
2129+
2130+ func $f0_2 ($a,$i) = if (($i >= $s))
2131+ then $a
2132+ else throw("List size exceeds 6")
2133+
2134+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
2135+ }
2136+ let acresFromRes = (fraction(bpRes, RESOURCEPRICEMIN, MULT8) * USDT2ACRES_MULTIPLIER)
2137+ let bpMat = {
2138+ let $l = split(currentPack[bpIdxMat], "_")
2139+ let $s = size($l)
2140+ let $acc0 = 0
2141+ func $f1_1 ($a,$i) = if (($i >= $s))
2142+ then $a
2143+ else sumResMat($a, $l[$i])
2144+
2145+ func $f1_2 ($a,$i) = if (($i >= $s))
2146+ then $a
2147+ else throw("List size exceeds 6")
2148+
2149+ $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6)
2150+ }
2151+ let acresFromMat = (fraction(bpMat, (2 * RESOURCEPRICEMIN), MULT8) * USDT2ACRES_MULTIPLIER)
2152+ let prods = if ((newProdStr == ""))
2153+ then nil
2154+ else split_4C(newProdStr, "_")
2155+ func sumProd (acc,item) = {
2156+ let j = acc._2
2157+ let recipeCoeff = parseIntValue(split(productionMatrix[j], "_")[rIdxCoeff])
2158+ $Tuple2((acc._1 + ((parseIntValue(item) * recipeCoeff) * MULT6)), (j + 1))
2159+ }
2160+
2161+ let bpProd = {
2162+ let $l = prods
2163+ let $s = size($l)
2164+ let $acc0 = $Tuple2(0, 0)
2165+ func $f2_1 ($a,$i) = if (($i >= $s))
2166+ then $a
2167+ else sumProd($a, $l[$i])
2168+
2169+ func $f2_2 ($a,$i) = if (($i >= $s))
2170+ then $a
2171+ else throw("List size exceeds 24")
2172+
2173+ $f2_2($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_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)
2174+ }
2175+ let acresFromProd = (fraction(bpProd._1, (2 * RESOURCEPRICEMIN), MULT8) * USDT2ACRES_MULTIPLIER)
2176+ $Tuple3(acresFromRes, acresFromMat, acresFromProd)
2177+ }
2178+
2179+
20102180 @Callable(i)
20112181 func constructorV1 (restAddr) = if ((i.caller != this))
20122182 then throw("Permission denied")
20132183 else [StringEntry(keyRestAddress(), restAddr)]
20142184
20152185
20162186
20172187 @Callable(i)
20182188 func saveInteger (key,amount) = if ((i.caller != this))
20192189 then throw("saveInteger is not public method")
20202190 else [IntegerEntry(key, amount)]
20212191
20222192
20232193
20242194 @Callable(i)
20252195 func setBlocked (isBlocked) = if ((i.caller != this))
20262196 then throw("permission denied")
20272197 else [BooleanEntry(keyBlocked(), isBlocked)]
20282198
20292199
20302200
20312201 @Callable(i)
20322202 func stakeLand () = {
20332203 let prologActions = prolog(i)
20342204 if ((size(i.payments) != 1))
20352205 then throw("Exactly one payment required")
20362206 else {
20372207 let pmt = value(i.payments[0])
20382208 let assetId = value(pmt.assetId)
20392209 let address = toString(i.caller)
20402210 if ((pmt.amount != 1))
20412211 then throw((("NFT " + LANDPREFIX) + " token should be attached as payment"))
20422212 else {
20432213 let asset = value(assetInfo(assetId))
20442214 if ((asset.issuer != this))
20452215 then throw("Unknown issuer of token")
20462216 else if (!(contains(asset.name, LANDPREFIX)))
20472217 then throw((("Only NFT " + LANDPREFIX) + " tokens are accepted"))
20482218 else {
20492219 let landNumSize = drop(asset.name, 4)
20502220 let landNum = if (contains(landNumSize, "XXL"))
20512221 then dropRight(landNumSize, 3)
20522222 else if (contains(landNumSize, "XL"))
20532223 then dropRight(landNumSize, 2)
20542224 else dropRight(landNumSize, 1)
20552225 if (!(isDefined(parseInt(landNum))))
20562226 then throw(("Cannot parse land number from " + asset.name))
20572227 else {
20582228 let landAssetId = toBase58String(assetId)
20592229 let timeKey = keyStakedTimeByAssetId(landAssetId)
20602230 if (isDefined(getInteger(timeKey)))
20612231 then throw((("NFT " + asset.name) + " is already staked"))
20622232 else {
20632233 let d = split(asset.description, "_")
20642234 let terrainCounts = countTerrains(d[recTerrains])
20652235 let pieces = numPiecesBySize(d[recLandSize])
20662236 let landIndex = (pieces / SSIZE)
20672237 let props = updateProportions(terrainCounts, landIndex, 1)
20682238 let resByContKey = keyResTypesByContinent(d[recContinent])
20692239 let contProps = split(valueOrElse(getString(resByContKey), "0_0_0_0_0_0"), "_")
20702240 let updatedContProps = makeString(updateProportionsInternal(contProps, terrainCounts, landIndex, 1), "_")
20712241 let landsKey = keyStakedLandsByOwner(address)
20722242 let landsStr = getString(landsKey)
20732243 let lands = if (isDefined(landsStr))
20742244 then split_51C(value(landsStr), "_")
20752245 else nil
20762246 if (containsElement(lands, landAssetId))
20772247 then throw(("Your staked lands already contain " + landAssetId))
20782248 else if ((size(lands) >= MAX_LANDS_STAKED_BY_USER))
20792249 then throw((("Your already staked max (" + toString(MAX_LANDS_STAKED_BY_USER)) + ") lands"))
20802250 else {
20812251 let infraLevel = valueOrElse(getInteger(keyInfraLevelByAssetId(landAssetId)), 0)
20822252 let piecesKey = keyStakedPiecesByOwner(address)
20832253 let oldPieces = valueOrElse(getInteger(piecesKey), 0)
20842254 let wlgResult = invoke(wlgContract, "onStakeUnstakeLand", [address], nil)
20852255 $Tuple2(([IntegerEntry(timeKey, lastBlock.timestamp), IntegerEntry(keyStakedTimeByTypeAssetIdAndOwner(LANDPREFIX, landAssetId, address), lastBlock.timestamp), StringEntry(landsKey, makeString_11C((lands :+ landAssetId), "_")), IntegerEntry(piecesKey, (oldPieces + pieces)), StringEntry(keyLandAssetIdToOwner(landAssetId), address), StringEntry(keyLandNumToOwner(landNum), address), IntegerEntry(keyInfraLevelByAssetIdAndOwner(landAssetId, address), infraLevel), StringEntry(keyResProportions(), props), StringEntry(resByContKey, updatedContProps)] ++ prologActions), wlgResult)
20862256 }
20872257 }
20882258 }
20892259 }
20902260 }
20912261 }
20922262 }
20932263
20942264
20952265
20962266 @Callable(i)
20972267 func unstakeLand (landAssetIdIn) = {
20982268 let prologActions = prolog(i)
20992269 if ((size(i.payments) != 0))
21002270 then throw("No payments required")
21012271 else {
21022272 let addr = toString(i.caller)
21032273 let c = checkClaimConditions(addr, claimModeDuck, landAssetIdIn)
21042274 let landAssetId = c._2
21052275 let d = c._3
21062276 let landsKey = keyStakedLandsByOwner(addr)
21072277 let terrainCounts = countTerrains(d[recTerrains])
21082278 let pieces = numPiecesBySize(d[recLandSize])
21092279 let landIndex = (pieces / SSIZE)
21102280 let props = updateProportions(terrainCounts, landIndex, -1)
21112281 let resByContKey = keyResTypesByContinent(d[recContinent])
21122282 let contProps = split(valueOrElse(getString(resByContKey), "0_0_0_0_0_0"), "_")
21132283 let updatedContProps = makeString(updateProportionsInternal(contProps, terrainCounts, landIndex, -1), "_")
21142284 let claimResult = claimAll(addr, landAssetId, pieces, claimModeDuck)
21152285 let lands = split_51C(valueOrElse(getString(landsKey), ""), "_")
21162286 let idx = indexOf(lands, landAssetId)
21172287 if (!(isDefined(idx)))
21182288 then throw(("Your staked lands don't contain " + landAssetId))
21192289 else {
21202290 let now = lastBlock.timestamp
21212291 let govReleaseTime = valueOrElse(getInteger(govContract, keyUserGwlReleaseTime(addr)), 0)
21222292 if ((govReleaseTime >= now))
21232293 then throw(("Your gWL are taking part in voting, cannot unstake until " + toString(govReleaseTime)))
21242294 else {
21252295 let arbReleaseTime = (valueOrElse(getInteger(wlgContract, keyLastArbTimeByUser(addr)), 0) + arbitrageDelay)
21262296 if ((arbReleaseTime > now))
21272297 then throw(("Your staked lands took part in arbitrage, cannot unstake until " + toString(arbReleaseTime)))
21282298 else {
21292299 let piecesKey = keyStakedPiecesByOwner(addr)
21302300 let stakedPieces = valueOrElse(getInteger(piecesKey), 0)
21312301 let newPieces = if ((pieces > stakedPieces))
21322302 then 0
21332303 else (stakedPieces - pieces)
21342304 let wlgResult = invoke(wlgContract, "onStakeUnstakeLand", [addr], nil)
21352305 $Tuple2(([ScriptTransfer(i.caller, 1, fromBase58String(landAssetId)), DeleteEntry(keyStakedTimeByAssetId(landAssetId)), DeleteEntry(keyStakedTimeByTypeAssetIdAndOwner(LANDPREFIX, landAssetId, addr)), StringEntry(keyResProportions(), props), StringEntry(resByContKey, updatedContProps), StringEntry(claimResult._2, makeString(claimResult._3, ":")), if ((size(lands) > 1))
21362306 then StringEntry(landsKey, makeString_11C(removeByIndex(lands, value(idx)), "_"))
21372307 else DeleteEntry(landsKey), IntegerEntry(piecesKey, newPieces)] ++ prologActions), wlgResult)
21382308 }
21392309 }
21402310 }
21412311 }
21422312 }
21432313
21442314
21452315
21462316 @Callable(i)
2317+func unstakeLandCallback (landAssetId,addr) = if ((toString(i.caller) != acres2AddressStr))
2318+ then throw("Permission denied")
2319+ else {
2320+ let unstakeResult = unstakeLandInternal(addr, landAssetId)
2321+ let wlgResult = invoke(wlgContract, "onStakeUnstakeLand", [addr], nil)
2322+ $Tuple2([ScriptTransfer(addressFromStringValue(addr), 1, fromBase58String(landAssetId)), DeleteEntry(keyStakedTimeByAssetId(landAssetId)), DeleteEntry(keyStakedTimeByTypeAssetIdAndOwner(LANDPREFIX, landAssetId, addr))], $Tuple5(unstakeResult._1, unstakeResult._2, unstakeResult._3, unstakeResult._4, wlgResult))
2323+ }
2324+
2325+
2326+
2327+@Callable(i)
2328+func unstakeLandREADONLY (landAssetId,addr) = {
2329+ let unstakeResult = unstakeLandInternal(addr, landAssetId)
2330+ $Tuple2(nil, unstakeResult)
2331+ }
2332+
2333+
2334+
2335+@Callable(i)
2336+func unstakeLandsFinalizeCallback (addr) = if ((toString(i.caller) != acres2AddressStr))
2337+ then throw("Permission denied")
2338+ else $Tuple2([DeleteEntry(keyStakedLandsByOwner(addr)), DeleteEntry(keyStakedPiecesByOwner(addr))], 0)
2339+
2340+
2341+
2342+@Callable(i)
21472343 func stakeDuck () = {
21482344 let prologActions = prolog(i)
21492345 if ((size(i.payments) != 1))
21502346 then throw("Exactly one payment required")
21512347 else {
21522348 let pmt = value(i.payments[0])
21532349 let assetId = value(pmt.assetId)
21542350 let address = toString(i.caller)
21552351 if ((pmt.amount != 1))
21562352 then throw((("NFT " + DUCKPREFIX) + " token should be attached as payment"))
21572353 else {
21582354 let asset = value(assetInfo(assetId))
21592355 let isRobo = if (if (KS_ALLOW_ROBO_DUCKS)
21602356 then (asset.issuer == this)
21612357 else false)
21622358 then contains(asset.name, ROBO_PREFIX)
21632359 else false
21642360 if (if (if ((asset.issuer != incubatorAddr))
21652361 then (asset.issuer != breederAddr)
21662362 else false)
21672363 then !(isRobo)
21682364 else false)
21692365 then throw((((("Unknown issuer of " + DUCKPREFIX) + " or ") + ROBO_PREFIX) + " token"))
21702366 else if (if (!(contains(asset.name, DUCKPREFIX)))
21712367 then !(isRobo)
21722368 else false)
21732369 then throw((((("Only NFT " + DUCKPREFIX) + " or ") + ROBO_PREFIX) + " tokens are accepted"))
21742370 else {
21752371 let assetIdStr = toBase58String(assetId)
21762372 let timeKey = keyStakedTimeByAssetId(assetIdStr)
21772373 if (isDefined(getInteger(timeKey)))
21782374 then throw((("NFT " + asset.name) + " is already staked"))
21792375 else if (isDefined(getString(keyStakedDuckByOwner(address))))
21802376 then throw(("You already staked one duck: " + asset.name))
21812377 else {
21822378 let locKey = keyDuckLocation(assetIdStr)
21832379 let location = getString(locKey)
21842380 let bpKey = keyBackpackByDuck(assetIdStr)
21852381 let backpack = getString(bpKey)
21862382 let keyHealth = keyDuckHealth(assetIdStr)
21872383 let maxHP = maxHealth(valueOrElse(getInteger(keyDuckLevel(assetIdStr)), 0))
21882384 let curHealth = valueOrElse(getInteger(keyHealth), maxHP)
21892385 ([IntegerEntry(timeKey, lastBlock.timestamp), IntegerEntry(keyStakedTimeByTypeAssetIdAndOwner(DUCKPREFIX, toBase58String(assetId), address), lastBlock.timestamp), StringEntry(keyDuckIdToOwner(assetIdStr), address), StringEntry(keyStakedDuckByOwner(address), assetIdStr)] ++ (if (isDefined(location))
21902386 then nil
21912387 else ([StringEntry(locKey, DEFAULTLOCATION)] ++ (if (isDefined(backpack))
21922388 then nil
21932389 else (([StringEntry(bpKey, "0:0_0_0_0_0_0:0_0_0_0_0_0:")] :+ IntegerEntry(keyHealth, curHealth)) ++ prologActions)))))
21942390 }
21952391 }
21962392 }
21972393 }
21982394 }
21992395
22002396
22012397
22022398 @Callable(i)
22032399 func unstakeDuck (assetIdStr) = {
22042400 let prologActions = prolog(i)
22052401 if ((size(i.payments) != 0))
22062402 then throw("No payments required")
22072403 else {
22082404 let assetId = fromBase58String(assetIdStr)
22092405 let address = toString(i.caller)
22102406 let asset = value(assetInfo(assetId))
22112407 let timeKey = keyStakedTimeByAssetId(assetIdStr)
22122408 if (!(isDefined(getInteger(timeKey))))
22132409 then throw((("NFT " + asset.name) + " is not staked"))
22142410 else if (!(isDefined(getString(keyStakedDuckByOwner(address)))))
22152411 then throw((("The duck " + asset.name) + " is not staked"))
22162412 else {
22172413 let owner = valueOrErrorMessage(getString(keyDuckIdToOwner(assetIdStr)), (("NFT " + asset.name) + " is orphaned"))
22182414 if ((owner != address))
22192415 then throw("Staked NFT is not yours")
22202416 else if (checkTournament(assetIdStr))
22212417 then throw("unstakeDuck_checkTournament")
22222418 else {
22232419 let keyHealth = keyDuckHealth(assetIdStr)
22242420 let maxHP = maxHealth(valueOrElse(getInteger(keyDuckLevel(assetIdStr)), 0))
22252421 let health = valueOrElse(getInteger(keyHealth), maxHP)
22262422 if ((maxHP > health))
22272423 then throw((("Please heal your duck to " + toString(maxHP)) + "hp before unstaking"))
22282424 else ([ScriptTransfer(i.caller, 1, assetId), DeleteEntry(timeKey), DeleteEntry(keyHealth), DeleteEntry(keyDuckLocation(assetIdStr)), DeleteEntry(keyDuckIdToOwner(assetIdStr)), DeleteEntry(keyStakedTimeByTypeAssetIdAndOwner(DUCKPREFIX, assetIdStr, address)), DeleteEntry(keyStakedDuckByOwner(address))] ++ prologActions)
22292425 }
22302426 }
22312427 }
22322428 }
22332429
22342430
22352431
22362432 @Callable(i)
2433+func unstakeDuckCallback (duckAssetId,addr) = if ((toString(i.caller) != acres2AddressStr))
2434+ then throw("Permission denied")
2435+ else {
2436+ let unstakeResult = unstakeDuckInternal(addr, duckAssetId)
2437+ $Tuple2([ScriptTransfer(addressFromStringValue(addr), 1, fromBase58String(duckAssetId)), DeleteEntry(keyStakedTimeByAssetId(duckAssetId)), DeleteEntry(keyDuckIdToOwner(duckAssetId)), DeleteEntry(keyStakedTimeByTypeAssetIdAndOwner(DUCKPREFIX, duckAssetId, addr)), DeleteEntry(keyStakedDuckByOwner(addr))], unstakeResult)
2438+ }
2439+
2440+
2441+
2442+@Callable(i)
2443+func unstakeDuckREADONLY (duckAssetId,addr) = {
2444+ let unstakeResult = unstakeDuckInternal(addr, duckAssetId)
2445+ $Tuple2(nil, unstakeResult)
2446+ }
2447+
2448+
2449+
2450+@Callable(i)
22372451 func claimRes (amount,landAssetIdStr) = {
22382452 let prologActions = prolog(i)
22392453 if ((size(i.payments) != 0))
22402454 then throw("No payments required")
22412455 else {
22422456 let addr = toString(i.originCaller)
22432457 let result = claimResInternal(addr, amount, claimModeDuck, landAssetIdStr)
22442458 let duckAssetId = valueOrErrorMessage(getString(keyStakedDuckByOwner(addr)), "You don't have a duck staked")
22452459 $Tuple2(((((result._1 ++ updateDuckStatsInternal(duckAssetId, fraction(xpClaim, amount, MULT8))._1) :+ StringEntry(result._2, makeString(result._3, ":"))) :+ StringEntry(result._4, makeString(result._5, ":"))) ++ prologActions), result._3[bpIdxRes])
22462460 }
22472461 }
22482462
22492463
22502464
22512465 @Callable(i)
22522466 func claimResToWH (amount,landAssetIdStr) = {
22532467 let prologActions = prolog(i)
22542468 if ((size(i.payments) != 0))
22552469 then throw("No payments required")
22562470 else {
22572471 let addr = toString(i.originCaller)
22582472 let result = claimResInternal(addr, amount, claimModeWh, landAssetIdStr)
22592473 $Tuple2(((((result._1 ++ updateAccStatsInternal(addr, fraction(xpClaim, amount, MULT8))._1) :+ StringEntry(result._2, makeString(result._3, ":"))) :+ StringEntry(result._4, makeString(result._5, ":"))) ++ prologActions), result._5[whIdxRes])
22602474 }
22612475 }
22622476
22632477
22642478
22652479 @Callable(i)
22662480 func flight (message,sig) = {
22672481 let prologActions = prolog(i)
22682482 if ((size(i.payments) != 0))
22692483 then throw("No payments required")
22702484 else {
22712485 let userAddr = toString(i.caller)
22722486 let f = flightCommon(userAddr, message, sig)
22732487 let newHP = f._1
22742488 let duckAssetId = f._2
22752489 let locKey = keyDuckLocation(duckAssetId)
22762490 let curLocation = valueOrElse(getString(locKey), DEFAULTLOCATION)
22772491 let newLocation = f._4
22782492 if ((newLocation == curLocation))
22792493 then throw("You can't fly to the same location")
22802494 else {
22812495 let newLoc = split(newLocation, "_")
22822496 let isTour = (newLoc[locIdxType] == "T")
22832497 let isDeliv = (newLoc[locIdxType] == "D")
22842498 let eqKey = keyDuckEquipment(duckAssetId)
22852499 let currentEq = valueOrElse(getString(eqKey), ",;,_,;,_,;,_,;,_,;,_,;,")
2286- let $t06637066476 = subtractEquipment(currentEq, f._5)
2287- let newEq = $t06637066476._1
2288- let shouldZeroBuffs = $t06637066476._2
2289- let ignored = $t06637066476._3
2290- let $t06647968311 = if (!(onMission(tournamentContract, curLocation)))
2500+ let $t07253072636 = subtractEquipment(currentEq, f._5)
2501+ let newEq = $t07253072636._1
2502+ let shouldZeroBuffs = $t07253072636._2
2503+ let ignored = $t07253072636._3
2504+ let $t07263974471 = if (!(onMission(tournamentContract, curLocation)))
22912505 then if (isTour)
22922506 then cheatAttempt(curLocation, newLocation, 5)
22932507 else if (!(isDeliv))
22942508 then if ((newHP > 0))
22952509 then $Tuple2(newLocation, newHP)
22962510 else $Tuple2(curLocation, 0)
22972511 else if ((newHP > 0))
22982512 then {
22992513 let s = invoke(this, "processDelivery", [duckAssetId], nil)
23002514 if ((s == s))
23012515 then $Tuple2(curLocation, newHP)
23022516 else throw("Strict value is not equal to itself.")
23032517 }
23042518 else $Tuple2(curLocation, 0)
23052519 else if (isInTournament(tournamentContract, curLocation))
23062520 then if (!(isInTournament(tournamentContract, newLocation)))
23072521 then throw("Your duck is taking part in the tournament")
23082522 else {
23092523 let score = parseIntValue(newLoc[locIdxId])
23102524 let curLoc = split(curLocation, "_")
23112525 let lastId = valueOrElse(getInteger(tournamentContract, lastTourIdKey), 0)
23122526 if ((score != (parseIntValue(curLoc[locIdxId]) + 1)))
23132527 then cheatAttempt(curLocation, newLocation, 7)
23142528 else if ((newHP > 0))
23152529 then {
23162530 let localBest = valueOrElse(getInteger(tournamentContract, keyBestResultByTourAndDuck(lastId, duckAssetId)), 0)
23172531 let updLocal = if ((score > localBest))
23182532 then invoke(tournamentContract, "saveDuckResult", [duckAssetId, score], nil)
23192533 else unit
23202534 if ((updLocal == updLocal))
23212535 then $Tuple2(newLocation, newHP)
23222536 else throw("Strict value is not equal to itself.")
23232537 }
23242538 else $Tuple2(curLocation, 0)
23252539 }
23262540 else throw(("Unknown curLocation:" + curLocation))
2327- let locToSave = $t06647968311._1
2328- let hpToSave = $t06647968311._2
2541+ let locToSave = $t07263974471._1
2542+ let hpToSave = $t07263974471._2
23292543 $Tuple2(((([StringEntry(locKey, locToSave), StringEntry(eqKey, newEq), IntegerEntry(keyDuckHealth(duckAssetId), hpToSave)] ++ prologActions) ++ (if (shouldZeroBuffs)
23302544 then [StringEntry(keyDuckBuffs(duckAssetId), "0_0_0_0_0")]
23312545 else nil)) ++ updateDuckStatsInternal(duckAssetId, if ((newHP > 0))
23322546 then xpSuccessFlight
23332547 else xpFailFlight)._1), f._3)
23342548 }
23352549 }
23362550 }
23372551
23382552
23392553
23402554 @Callable(i)
23412555 func heal (quantityL1,quantityL2,quantityL3) = {
23422556 let prologActions = prolog(i)
23432557 if (if (if ((0 > quantityL1))
23442558 then true
23452559 else (0 > quantityL2))
23462560 then true
23472561 else (0 > quantityL3))
23482562 then throw("Quantity cannot be negative")
23492563 else {
23502564 let duckAssetId = valueOrErrorMessage(getString(keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
23512565 if (checkTournament(duckAssetId))
23522566 then throw("heal_checkTournament")
23532567 else {
23542568 let qts = [quantityL1, quantityL2, quantityL3]
23552569 let keyHealth = keyDuckHealth(duckAssetId)
23562570 let maxHP = maxHealth(valueOrElse(getInteger(keyDuckLevel(duckAssetId)), 0))
23572571 let oldHealth = valueOrElse(getInteger(keyHealth), maxHP)
23582572 if ((oldHealth >= maxHP))
23592573 then throw((("HP should be < " + toString(maxHP)) + " to heal"))
23602574 else {
23612575 let bpKey = keyBackpackByDuck(duckAssetId)
23622576 let currentPack = getBackpack(bpKey)
23632577 let prodList = if ((currentPack[bpIdxProd] == ""))
23642578 then nil
23652579 else split_4C(currentPack[bpIdxProd], "_")
23662580 func iterateProd (acc,recipe) = {
23672581 let n = acc._2
23682582 let x = if ((size(prodList) > n))
23692583 then parseIntValue(prodList[n])
23702584 else 0
23712585 if ((3 > n))
23722586 then {
23732587 let q = qts[n]
23742588 if ((q > x))
23752589 then throw(((("You have only " + toString(x)) + " of ") + prodTypes[n]))
23762590 else $Tuple3((acc._1 :+ toString((x - q))), (n + 1), (acc._3 + (parseIntValue(split(recipe, "_")[rIdxEffect]) * q)))
23772591 }
23782592 else $Tuple3((acc._1 :+ toString(x)), (n + 1), acc._3)
23792593 }
23802594
23812595 let result = {
23822596 let $l = productionMatrix
23832597 let $s = size($l)
23842598 let $acc0 = $Tuple3(nil, 0, 0)
23852599 func $f0_1 ($a,$i) = if (($i >= $s))
23862600 then $a
23872601 else iterateProd($a, $l[$i])
23882602
23892603 func $f0_2 ($a,$i) = if (($i >= $s))
23902604 then $a
23912605 else throw("List size exceeds 50")
23922606
23932607 $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)
23942608 }
23952609 let newHealth = min([maxHP, (oldHealth + result._3)])
23962610 $Tuple2((([IntegerEntry(keyHealth, newHealth), StringEntry(bpKey, makeString_2C([currentPack[bpIdxLevel], currentPack[bpIdxRes], currentPack[bpIdxMat], makeString(result._1, "_")], ":"))] ++ prologActions) ++ updateDuckStatsInternal(duckAssetId, (xpHeal * ((quantityL1 + quantityL2) + quantityL3)))._1), newHealth)
23972611 }
23982612 }
23992613 }
24002614 }
24012615
24022616
24032617
24042618 @Callable(i)
24052619 func healES () = {
24062620 let prologActions = prolog(i)
24072621 if ((size(i.payments) != 1))
24082622 then throw("Exactly one payment required")
24092623 else {
24102624 let pmt = value(i.payments[0])
24112625 if ((pmt.assetId != usdtAssetId))
24122626 then throw("Allowed USDT payment only!")
24132627 else {
24142628 let duckAssetId = valueOrErrorMessage(getString(keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
24152629 if (checkTournament(duckAssetId))
24162630 then throw("healES_checkTournament")
24172631 else {
24182632 let keyHealth = keyDuckHealth(duckAssetId)
24192633 let maxHP = maxHealth(valueOrElse(getInteger(keyDuckLevel(duckAssetId)), 0))
24202634 let oldHealth = valueOrElse(getInteger(keyHealth), maxHP)
24212635 if ((oldHealth > 0))
24222636 then throw("HP should be 0 to call Emergency Service")
24232637 else {
24242638 let bpKey = keyBackpackByDuck(duckAssetId)
24252639 let currentPack = getBackpack(bpKey)
24262640 let prodList = if ((currentPack[bpIdxProd] == ""))
24272641 then nil
24282642 else split_4C(currentPack[bpIdxProd], "_")
24292643 let medKitAmount1 = if ((size(prodList) > 0))
24302644 then parseIntValue(prodList[0])
24312645 else 0
24322646 let medKitAmount2 = if ((size(prodList) > 1))
24332647 then parseIntValue(prodList[1])
24342648 else 0
24352649 let medKitAmount3 = if ((size(prodList) > 2))
24362650 then parseIntValue(prodList[2])
24372651 else 0
24382652 if (if (if ((medKitAmount1 > 0))
24392653 then true
24402654 else (medKitAmount2 > 0))
24412655 then true
24422656 else (medKitAmount3 > 0))
24432657 then throw("You have to use own Medical Kit")
24442658 else {
24452659 let existStr = getString(economyContract, keyEsWarehouse())
24462660 let existAmounts = if (isDefined(existStr))
24472661 then split_4C(value(existStr), "_")
24482662 else nil
24492663 let existAmount = if ((size(existAmounts) > 0))
24502664 then parseIntValue(existAmounts[0])
24512665 else 0
24522666 if ((0 >= existAmount))
24532667 then throw("There are no Medical Kits L1 at Emergency Service storage")
24542668 else {
24552669 let newHealth = (oldHealth + parseIntValue(split(productionMatrix[0], "_")[rIdxEffect]))
24562670 let newES = makeString([toString((existAmount - 1)), removeByIndex(existAmounts, 0)], "_")
24572671 let recipe = split(productionMatrix[0], "_")
24582672 let totalMat = getRecipeMaterials(recipe)
24592673 let sellPrice = fraction((totalMat * ESSELLCOEF), RESOURCEPRICEMIN, (MULT8 * PRODUCTPKGSIZE))
24602674 if ((pmt.amount != sellPrice))
24612675 then throw(("Payment attached should be " + toString(sellPrice)))
24622676 else {
24632677 let result = asString(invoke(economyContract, "updateEsStorage", [newES], [AttachedPayment(usdtAssetId, sellPrice)]))
24642678 $Tuple2(((prologActions :+ IntegerEntry(keyHealth, newHealth)) ++ updateDuckStatsInternal(duckAssetId, xpCallES)._1), result)
24652679 }
24662680 }
24672681 }
24682682 }
24692683 }
24702684 }
24712685 }
24722686 }
24732687
24742688
24752689
24762690 @Callable(i)
24772691 func updateBackpack (duckAssetId,newPack) = if ((i.caller != economyContract))
24782692 then throw("permission denied")
24792693 else $Tuple2([StringEntry(keyBackpackByDuck(duckAssetId), newPack)], newPack)
24802694
24812695
24822696
24832697 @Callable(i)
24842698 func commitForRandom () = {
24852699 let prologActions = prolog(i)
24862700 let finishBlock = (height + randomDelay)
24872701 let addr = toString(i.caller)
24882702 $Tuple2(([IntegerEntry(keyCommit(addr), finishBlock)] ++ prologActions), finishBlock)
24892703 }
24902704
24912705
24922706
24932707 @Callable(i)
24942708 func revealRandom (maxValue) = {
24952709 let prologActions = prolog(i)
24962710 let addr = toString(i.caller)
24972711 let finishKey = keyCommit(addr)
24982712 let finishBlock = valueOrErrorMessage(getInteger(finishKey), "You have to commitForRandom() first!")
24992713 if ((finishBlock > height))
25002714 then throw(("Random number is not ready yet, wait until height = " + toString(finishBlock)))
25012715 else {
25022716 let entropy = value(value(blockInfoByHeight(finishBlock)).vrf)
25032717 let salt = toBytes(valueOrElse(getString(keyLastTxIdByUser(addr)), ""))
25042718 let rand = getRandomNumber(maxValue, salt, entropy)
25052719 $Tuple2(([DeleteEntry(finishKey)] ++ prologActions), rand)
25062720 }
25072721 }
25082722
25092723
25102724
25112725 @Callable(i)
25122726 func buySLand () = {
25132727 let prologActions = prolog(i)
25142728 if ((size(i.payments) != 1))
25152729 then throw("Exactly one payment required")
25162730 else {
25172731 let pmt = value(i.payments[0])
25182732 if ((pmt.assetId != usdtAssetId))
25192733 then throw("Allowed USDT payment only!")
25202734 else if ((pmt.amount != EXPUSDT))
25212735 then throw(("Payment attached should be " + toString(EXPUSDT)))
25222736 else {
25232737 let result = expeditionInternal(i.caller, i.transactionId)
25242738 let acresResult = asInt(invoke(acresContract, "burnAcres", [S_COST_ACRES], nil))
25252739 $Tuple2((((result._1 :+ ScriptTransfer(economyContract, pmt.amount, usdtAssetId)) ++ updateAccStatsInternal(toString(i.caller), xpNewSLand)._1) ++ prologActions), $Tuple2(result._2._1, acresResult))
25262740 }
25272741 }
25282742 }
25292743
25302744
25312745
25322746 @Callable(i)
25332747 func expedition (message,sig) = {
25342748 let prologActions = prolog(i)
25352749 if ((size(i.payments) != 0))
25362750 then throw("No payments required")
25372751 else {
25382752 let userAddr = toString(i.caller)
25392753 let f = flightCommon(userAddr, message, sig)
25402754 let duckAssetId = f._2
25412755 let keyHealth = keyDuckHealth(duckAssetId)
25422756 let bpKey = keyBackpackByDuck(duckAssetId)
25432757 let currentPack = getBackpack(bpKey)
25442758 let mList = split(currentPack[bpIdxMat], "_")
25452759 let newMat = makeString(subtractMaterials(true, mList, EXPMATERIALS), "_")
25462760 let eqKey = keyDuckEquipment(duckAssetId)
25472761 let currentEq = valueOrElse(getString(eqKey), ",;,_,;,_,;,_,;,_,;,_,;,")
2548- let $t07623176337 = subtractEquipment(currentEq, f._5)
2549- let newEq = $t07623176337._1
2550- let shouldZeroBuffs = $t07623176337._2
2551- let ignored = $t07623176337._3
2762+ let $t08239182497 = subtractEquipment(currentEq, f._5)
2763+ let newEq = $t08239182497._1
2764+ let shouldZeroBuffs = $t08239182497._2
2765+ let ignored = $t08239182497._3
25522766 let e = expeditionInternal(i.caller, i.transactionId)
25532767 let id = e._2._1
25542768 let result = if ((0 >= f._1))
25552769 then $Tuple3([IntegerEntry(keyHealth, 0), StringEntry(eqKey, newEq)], "", 0)
25562770 else $Tuple3((e._1 ++ (if (shouldZeroBuffs)
25572771 then [StringEntry(keyDuckBuffs(duckAssetId), "0_0_0_0_0")]
25582772 else ((((nil :+ StringEntry(keyDuckLocation(duckAssetId), makeString([e._2._2, "L", id], "_"))) :+ IntegerEntry(keyHealth, f._1)) :+ StringEntry(eqKey, newEq)) :+ StringEntry(bpKey, makeString([currentPack[bpIdxLevel], currentPack[bpIdxRes], newMat, currentPack[bpIdxProd]], ":"))))), id, f._3)
25592773 if (checkTournament(duckAssetId))
25602774 then throw("expedition_checkTournament")
25612775 else {
25622776 let acresResult = asInt(invoke(acresContract, "burnAcres", [S_COST_ACRES], nil))
25632777 $Tuple2(((result._1 ++ updateDuckStatsInternal(duckAssetId, xpNewSLand)._1) ++ prologActions), $Tuple3(result._2, result._3, acresResult))
25642778 }
25652779 }
25662780 }
25672781
25682782
25692783
25702784 @Callable(i)
25712785 func buySLandForAcres () = {
25722786 let prologActions = prolog(i)
25732787 if ((size(i.payments) != 1))
25742788 then throw("exactly 1 payment must be attached")
25752789 else {
25762790 let pmt = i.payments[0]
25772791 let amt = pmt.amount
25782792 if (if (!(isDefined(pmt.assetId)))
25792793 then true
25802794 else (value(pmt.assetId) != acresAssetId))
25812795 then throw("ACRES payments only!")
25822796 else if ((amt != S_COST_ACRES))
25832797 then throw(("Payment attached should be " + toString(S_COST_ACRES)))
25842798 else {
25852799 let result = expeditionInternal(i.caller, i.transactionId)
25862800 let acresResult = asInt(invoke(acresContract, "burnAcres", [S_COST_ACRES], [AttachedPayment(acresAssetId, amt)]))
25872801 $Tuple2(((result._1 ++ updateAccStatsInternal(toString(i.caller), xpNewSLand)._1) ++ prologActions), $Tuple2(result._2._1, acresResult))
25882802 }
25892803 }
25902804 }
25912805
25922806
25932807
25942808 @Callable(i)
25952809 func upgradeInfra (landAssetId) = {
25962810 let prologActions = prolog(i)
25972811 if ((size(i.payments) != 0))
25982812 then throw("No payments required")
25992813 else {
26002814 let result = upInfraCommon(true, i.caller, 0, landAssetId)
26012815 let duckAssetId = valueOrErrorMessage(getString(keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
26022816 $Tuple2(((result._1 ++ prologActions) ++ updateDuckStatsInternal(duckAssetId, fraction(xpUpgradeInfra, result._3, MULT8))._1), result._2)
26032817 }
26042818 }
26052819
26062820
26072821
26082822 @Callable(i)
26092823 func activateArtifact (artName,landAssetIdOpt) = {
26102824 let prologActions = prolog(i)
26112825 if ((size(i.payments) != 0))
26122826 then throw("No payments required")
26132827 else {
26142828 let addr = toString(i.caller)
26152829 let result = match artName {
26162830 case _ =>
26172831 if (("PRESALE" == $match0))
26182832 then activatePresaleArt(addr, landAssetIdOpt)
26192833 else if (("ONBOARD" == $match0))
26202834 then activateOnboardArt(addr)
26212835 else throw("Unknown artifact")
26222836 }
26232837 (result ++ prologActions)
26242838 }
26252839 }
26262840
26272841
26282842
26292843 @Callable(i)
26302844 func mergeLands (landAssetIds) = {
26312845 let prologActions = prolog(i)
26322846 if ((size(i.payments) != 0))
26332847 then throw("No payments required")
26342848 else {
26352849 let result = mergeCommon(toString(i.caller), landAssetIds)
26362850 $Tuple2(((result._1 ++ prologActions) ++ updateAccStatsInternal(toString(i.caller), xpMerge)._1), result._2)
26372851 }
26382852 }
26392853
26402854
26412855
26422856 @Callable(i)
26432857 func cargoExchange (cargoListStr,landAssetId) = {
26442858 let prologActions = prolog(i)
26452859 if ((size(i.payments) != 0))
26462860 then throw("No payments required")
26472861 else {
26482862 let cargoParts = split_4C(cargoListStr, ":")
26492863 let addr = toString(i.originCaller)
26502864 let asset = value(assetInfo(fromBase58String(landAssetId)))
26512865 let timeKey = keyStakedTimeByAssetId(landAssetId)
26522866 if (!(isDefined(getInteger(timeKey))))
26532867 then throw((asset.name + " is not staked"))
26542868 else {
26552869 let owner = valueOrErrorMessage(getString(keyLandAssetIdToOwner(landAssetId)), (("NFT " + asset.name) + " is orphaned"))
26562870 if ((owner != addr))
26572871 then throw((LANDPREFIX + " is not yours"))
26582872 else {
26592873 let landIndex = (numPiecesBySize(split(asset.description, "_")[recLandSize]) / SSIZE)
26602874 let infraLevel = valueOrElse(getInteger(keyInfraLevelByAssetId(landAssetId)), 0)
26612875 let duckAssetId = valueOrErrorMessage(getString(keyStakedDuckByOwner(addr)), "You don't have a duck staked")
26622876 let curLocation = valueOrElse(getString(keyDuckLocation(duckAssetId)), DEFAULTLOCATION)
26632877 let loc = split(value(curLocation), "_")
26642878 if ((loc[locIdxType] != "L"))
26652879 then throw((("Duck location type is " + loc[locIdxType]) + ", but should be L"))
26662880 else if ((loc[locIdxId] != landAssetId))
26672881 then throw(("Duck should be on the land " + landAssetId))
26682882 else {
26692883 let whKey = keyWarehouseByLand(landAssetId)
26702884 let currentWh = getWarehouse(whKey, landIndex, infraLevel)
26712885 let bpKey = keyBackpackByDuck(duckAssetId)
26722886 let currentPack = getBackpack(bpKey)
26732887 let result = moveStuff(cargoParts, currentWh, currentPack)
26742888 let loft = split(currentWh[whIdxLOFT], "_")
26752889 let loftO = (parseIntValue(loft[volOccupied]) + result._7)
26762890 let loftF = (parseIntValue(loft[volFree]) - result._7)
26772891 ([StringEntry(bpKey, makeString_2C([currentPack[bpIdxLevel], result._4, result._5, result._6], ":")), StringEntry(whKey, makeString_2C([currentWh[whIdxLevels], result._1, result._2, result._3, makeString([loft[volLocked], toString(loftO), toString(loftF), loft[volTotal]], "_")], ":"))] ++ prologActions)
26782892 }
26792893 }
26802894 }
26812895 }
26822896 }
26832897
26842898
26852899
26862900 @Callable(i)
26872901 func saveWarehouse (whStr,landAssetId) = if ((i.caller != economyContract))
26882902 then throw("Access denied")
26892903 else {
26902904 let whKey = keyWarehouseByLand(landAssetId)
26912905 let wh = split_4C(whStr, ":")
26922906 if ((size(wh) != 5))
26932907 then throw("warehouse string should contain 4 ':' separators")
26942908 else {
26952909 let loftL = split(wh[whIdxLOFT], "_")[volLocked]
26962910 let loftO = getWarehouseOccupiedVol(wh)
26972911 let loftT = getWarehouseTotalVolume(wh[whIdxLevels])
26982912 let loftF = ((loftT - parseIntValue(loftL)) - loftO)
26992913 if ((0 > loftF))
27002914 then throw("Operation leads to negative free warehouse space")
27012915 else {
27022916 let newWhStr = makeString_2C([wh[whIdxLevels], wh[whIdxRes], wh[whIdxMat], wh[whIdxProd], makeString([loftL, toString(loftO), toString(loftF), toString(loftT)], "_")], ":")
27032917 $Tuple2([StringEntry(whKey, newWhStr)], newWhStr)
27042918 }
27052919 }
27062920 }
27072921
27082922
27092923
27102924 @Callable(i)
27112925 func setCustomName (assetId,customName,type) = {
27122926 let prologActions = prolog(i)
27132927 if ((size(i.payments) != 1))
27142928 then throw("Exactly one payment required")
27152929 else {
27162930 let pmt = value(i.payments[0])
27172931 if ((pmt.assetId != usdtAssetId))
27182932 then throw("Allowed USDT payment only!")
27192933 else if ((pmt.amount != RENAMINGCOST))
27202934 then throw(("Payment should be " + toString(RENAMINGCOST)))
27212935 else if (contains(customName, "__"))
27222936 then throw(("Name should not contain '__': " + customName))
27232937 else if ((size(customName) > MAXNAMELEN))
27242938 then throw(("Name too long, maxLength=" + toString(MAXNAMELEN)))
27252939 else {
27262940 let addr = toString(i.originCaller)
27272941 let actions = match type {
27282942 case _ =>
27292943 if (("ACCOUNT" == $match0))
27302944 then {
27312945 let reverseKey = keyCustomNameToAddress(customName)
27322946 let nameOwner = getString(reverseKey)
27332947 if (isDefined(nameOwner))
27342948 then throw(("Name already registered: " + customName))
27352949 else {
27362950 let addrToNameKey = keyAddressToCustomName(addr)
27372951 let oldName = getString(addrToNameKey)
27382952 let freeOld = if (isDefined(oldName))
27392953 then [DeleteEntry(keyCustomNameToAddress(value(oldName)))]
27402954 else nil
27412955 (((freeOld :+ StringEntry(addrToNameKey, customName)) :+ StringEntry(reverseKey, addr)) ++ updateAccStatsInternal(addr, xpCustomName)._1)
27422956 }
27432957 }
27442958 else if (("LAND" == $match0))
27452959 then {
27462960 let asset = value(assetInfo(fromBase58String(assetId)))
27472961 let timeKey = keyStakedTimeByAssetId(assetId)
27482962 if (!(isDefined(getInteger(timeKey))))
27492963 then throw((asset.name + " is not staked"))
27502964 else {
27512965 let owner = valueOrErrorMessage(getString(keyLandAssetIdToOwner(assetId)), (("NFT " + asset.name) + " is orphaned"))
27522966 if ((owner != addr))
27532967 then throw((LANDPREFIX + " is not yours"))
27542968 else {
27552969 let reverseKey = keyLandCustomNameToAssetId(customName)
27562970 let nameOwner = getString(reverseKey)
27572971 if (isDefined(nameOwner))
27582972 then throw(("Name already registered: " + customName))
27592973 else {
27602974 let assetToNameKey = keyLandAssetIdToCustomName(assetId)
27612975 let oldName = getString(assetToNameKey)
27622976 let freeOld = if (isDefined(oldName))
27632977 then [DeleteEntry(keyLandCustomNameToAssetId(value(oldName)))]
27642978 else nil
27652979 (((freeOld :+ StringEntry(assetToNameKey, customName)) :+ StringEntry(reverseKey, assetId)) ++ updateAccStatsInternal(addr, xpCustomName)._1)
27662980 }
27672981 }
27682982 }
27692983 }
27702984 else if (("DUCK" == $match0))
27712985 then {
27722986 let asset = value(assetInfo(fromBase58String(assetId)))
27732987 let timeKey = keyStakedTimeByAssetId(assetId)
27742988 if (if (!(isDefined(getInteger(timeKey))))
27752989 then true
27762990 else !(isDefined(getString(keyStakedDuckByOwner(addr)))))
27772991 then throw((asset.name + " is not staked"))
27782992 else {
27792993 let owner = valueOrErrorMessage(getString(keyDuckIdToOwner(assetId)), (("NFT " + asset.name) + " is orphaned"))
27802994 if ((owner != addr))
27812995 then throw((DUCKPREFIX + " is not yours"))
27822996 else {
27832997 let reverseKey = keyDuckCustomNameToAssetId(customName)
27842998 let nameOwner = getString(reverseKey)
27852999 if (isDefined(nameOwner))
27863000 then throw(("Name already registered: " + customName))
27873001 else {
27883002 let assetToNameKey = keyDuckAssetIdToCustomName(assetId)
27893003 let oldName = getString(assetToNameKey)
27903004 let freeOld = if (isDefined(oldName))
27913005 then [DeleteEntry(keyDuckCustomNameToAssetId(value(oldName)))]
27923006 else nil
27933007 (((freeOld :+ StringEntry(assetToNameKey, customName)) :+ StringEntry(reverseKey, assetId)) ++ updateDuckStatsInternal(assetId, xpCustomName)._1)
27943008 }
27953009 }
27963010 }
27973011 }
27983012 else throw("Unknown entity type")
27993013 }
28003014 $Tuple2(((actions :+ ScriptTransfer(economyContract, pmt.amount, usdtAssetId)) ++ prologActions), 0)
28013015 }
28023016 }
28033017 }
28043018
28053019
28063020
28073021 @Callable(i)
28083022 func setReferrals (oldPlayer,newPlayer) = if ((i.callerPublicKey != pub))
28093023 then throw("Permission denied")
28103024 else {
28113025 let prologActions = prolog(i)
28123026 if ((size(i.payments) != 0))
28133027 then throw("No payments required")
28143028 else if (!(isDefined(addressFromString(oldPlayer))))
28153029 then throw(("Invalid address: " + oldPlayer))
28163030 else {
28173031 let newbieAddr = addressFromString(newPlayer)
28183032 if (!(isDefined(newbieAddr)))
28193033 then throw(("Invalid address: " + newPlayer))
28203034 else {
28213035 let oldLastTx = getString(keyLastTxIdByUser(oldPlayer))
28223036 if (!(isDefined(oldLastTx)))
28233037 then throw("oldPlayer didn't do any tx in game")
28243038 else if ((0 >= wavesBalance(value(newbieAddr)).available))
28253039 then throw("newPlayer has no WAVES")
28263040 else {
28273041 let oldsKey = keyOldies()
28283042 let olds = getString(oldsKey)
28293043 let oldies = if (isDefined(olds))
28303044 then split_4C(value(olds), "_")
28313045 else nil
28323046 if (containsElement(oldies, newPlayer))
28333047 then throw((newPlayer + " is not newbie (already has referrals)"))
28343048 else {
28353049 let refByKey = keyAddressRefBy(newPlayer)
28363050 let refBy = getString(refByKey)
28373051 if (if (isDefined(refBy))
28383052 then isDefined(addressFromString(value(refBy)))
28393053 else false)
28403054 then throw(((newPlayer + " already has refBy: ") + value(refBy)))
28413055 else {
28423056 let refsKey = keyAddressReferrals(oldPlayer)
28433057 let refs = getString(refsKey)
28443058 let refsArray = if (isDefined(refs))
28453059 then split_4C(value(refs), "_")
28463060 else nil
28473061 if (containsElement(refsArray, newPlayer))
28483062 then throw((((oldPlayer + " already contains ") + newPlayer) + " within referrals"))
28493063 else {
28503064 let newRefs = makeString_2C((refsArray :+ newPlayer), "_")
28513065 let newOlds = if (containsElement(oldies, oldPlayer))
28523066 then value(olds)
28533067 else makeString_2C((oldies :+ oldPlayer), "_")
28543068 $Tuple2(([StringEntry(refByKey, oldPlayer), StringEntry(refsKey, newRefs), StringEntry(oldsKey, newOlds)] ++ prologActions), 0)
28553069 }
28563070 }
28573071 }
28583072 }
28593073 }
28603074 }
28613075 }
28623076
28633077
28643078
28653079 @Callable(i)
28663080 func distributePoints (strength,accuracy,intellect,endurance,dexterity) = {
28673081 let prologActions = prolog(i)
28683082 if ((size(i.payments) != 0))
28693083 then throw("No payments required")
28703084 else {
28713085 let addr = toString(i.originCaller)
28723086 let virtWlgData = asAnyList(invoke(wlgContract, "checkWlgXpREADONLY", [addr], nil))
28733087 let virtWlgPoints = asInt(virtWlgData[1])
2874- let $t09214992539 = if ((0 >= virtWlgPoints))
3088+ let $t09830998699 = if ((0 >= virtWlgPoints))
28753089 then $Tuple2(0, nil)
28763090 else {
28773091 let deltaXP = asInt(invoke(wlgContract, "takeWlgXp", [addr], nil))
28783092 if ((deltaXP == deltaXP))
28793093 then $Tuple2(virtWlgPoints, [IntegerEntry(keyUserLevel(addr), asInt(virtWlgData[0])), IntegerEntry(keyUserXP(addr), asInt(virtWlgData[2]))])
28803094 else throw("Strict value is not equal to itself.")
28813095 }
2882- let wlgPoints = $t09214992539._1
2883- let wlgActions = $t09214992539._2
3096+ let wlgPoints = $t09830998699._1
3097+ let wlgActions = $t09830998699._2
28843098 let duckAssetId = valueOrErrorMessage(getString(keyStakedDuckByOwner(addr)), "You don't have a duck staked")
28853099 let freeKeyAcc = keyUserFreePoints(addr)
28863100 let freePointsAcc = (valueOrElse(getInteger(freeKeyAcc), 0) + wlgPoints)
28873101 let freeKeyDuck = keyDuckFreePoints(duckAssetId)
28883102 let freePointsDuck = valueOrElse(getInteger(freeKeyDuck), 0)
28893103 let sumFree = (freePointsAcc + freePointsDuck)
28903104 let sumToDistribute = ((((strength + accuracy) + intellect) + endurance) + dexterity)
28913105 if ((sumToDistribute > sumFree))
28923106 then throw((("There are only " + toString(sumFree)) + " free points to distribute"))
28933107 else {
28943108 let charsKey = keyDuckChars(duckAssetId)
28953109 let chars = split(valueOrElse(getString(charsKey), "0_0_0_0_0"), "_")
28963110 let newAcc = (freePointsAcc - sumToDistribute)
28973111 $Tuple2((([IntegerEntry(freeKeyAcc, if ((0 > newAcc))
28983112 then 0
28993113 else newAcc), IntegerEntry(freeKeyDuck, if ((0 > newAcc))
29003114 then (freePointsDuck + newAcc)
29013115 else freePointsDuck), StringEntry(charsKey, makeString([toString((parseIntValue(chars[charStrength]) + strength)), toString((parseIntValue(chars[charAccuracy]) + accuracy)), toString((parseIntValue(chars[charIntellect]) + intellect)), toString((parseIntValue(chars[charEndurance]) + endurance)), toString((parseIntValue(chars[charDexterity]) + dexterity))], "_"))] ++ prologActions) ++ wlgActions), 0)
29023116 }
29033117 }
29043118 }
29053119
29063120
29073121
29083122 @Callable(i)
29093123 func splitByGlobalWeightsREADONLY (amount) = $Tuple2(nil, getNeededMaterials(amount))
29103124
29113125
29123126
29133127 @Callable(i)
29143128 func splitByGlobalAndLocalWeightsREADONLY (matAmount,resAmount,terrains) = {
29153129 let terrainCounts = countTerrains(terrains)
29163130 $Tuple2(nil, $Tuple2(getNeededMaterials(matAmount), distributeByWeights(resAmount, terrainCounts)))
29173131 }
29183132
29193133
29203134
29213135 @Callable(i)
29223136 func getBackpackREADONLY (duckAssetId) = $Tuple2(nil, makeString(getBackpack(keyBackpackByDuck(duckAssetId)), ":"))
29233137
29243138
29253139
29263140 @Callable(i)
29273141 func getWarehouseREADONLY (landAssetId) = {
29283142 let asset = value(assetInfo(fromBase58String(landAssetId)))
29293143 let landIndex = (numPiecesBySize(split(asset.description, "_")[recLandSize]) / SSIZE)
29303144 let infraLevel = valueOrElse(getInteger(keyInfraLevelByAssetId(landAssetId)), 0)
29313145 $Tuple2(nil, makeString_2C(getWarehouse(keyWarehouseByLand(landAssetId), landIndex, infraLevel), ":"))
29323146 }
29333147
29343148
29353149
29363150 @Callable(i)
29373151 func saveLastTx () = if (!(containsElement([wlgContract, economyContract, tournamentContract, acresContract], i.caller)))
29383152 then throw("Access denied")
29393153 else $Tuple2(prolog(i), 42)
29403154
29413155
29423156
29433157 @Callable(i)
29443158 func updateDuckStats (duckAssetId,deltaXP) = if ((i.caller != economyContract))
29453159 then throw("Access denied")
29463160 else updateDuckStatsInternal(duckAssetId, deltaXP)
29473161
29483162
29493163
29503164 @Callable(i)
29513165 func updateAccStats (addr,deltaXP) = if (!(containsElement([wlgContract, economyContract, acresContract], i.caller)))
29523166 then throw("Access denied")
29533167 else updateAccStatsInternal(addr, deltaXP)
29543168
29553169
29563170
29573171 @Callable(i)
29583172 func equipDuck (equipment) = {
29593173 let prologActions = prolog(i)
29603174 if ((size(i.payments) != 0))
29613175 then throw("No payments required")
29623176 else {
29633177 let addr = toString(i.originCaller)
29643178 let duckAssetId = valueOrErrorMessage(getString(keyStakedDuckByOwner(addr)), "You don't have a duck staked")
29653179 if (checkTournament(duckAssetId))
29663180 then throw("equipDuck_checkTournament")
29673181 else {
29683182 let eqKey = keyDuckEquipment(duckAssetId)
29693183 let currentSegs = split(valueOrElse(getString(eqKey), ",;,_,;,_,;,_,;,_,;,_,;,"), "_")
29703184 let bpKey = keyBackpackByDuck(duckAssetId)
29713185 let currentPack = getBackpack(bpKey)
29723186 let newEq = split(equipment, "_")
29733187 if ((size(newEq) != NUMSEGMENTS))
29743188 then throw("Wrong equipment string")
29753189 else {
29763190 let tempProdB = dressB(currentSegs, prodStrToBytes(currentPack[bpIdxProd]), true, nil)
29773191 let segBpAux = split(newEq[segBackpack], ";")[1]
29783192 let buffEffect = if ((segBpAux == ""))
29793193 then 0
29803194 else {
29813195 let aux0 = split(segBpAux, ",")[0]
29823196 if ((aux0 == ""))
29833197 then 0
29843198 else {
29853199 let idxCnt = split(aux0, ":")
29863200 let idx = idxCnt[0]
29873201 let cnt = idxCnt[1]
29883202 if (if (if (if (if ((idx == "06"))
29893203 then true
29903204 else (idx == "07"))
29913205 then true
29923206 else (idx == "08"))
29933207 then (cnt != "")
29943208 else false)
29953209 then (parseIntValue(cnt) > 0)
29963210 else false)
29973211 then parseIntValue(split(productionMatrix[parseIntValue(idx)], "_")[rIdxEffect])
29983212 else 0
29993213 }
30003214 }
30013215 let stats = getDuckStats(this, duckAssetId, buffEffect, true)
30023216 let newProdB = dressB(newEq, tempProdB, false, stats)
30033217 let newProdStr = bytesToProdStr(newProdB)
30043218 $Tuple2(([StringEntry(eqKey, equipment), StringEntry(bpKey, makeString_2C([currentPack[bpIdxLevel], currentPack[bpIdxRes], currentPack[bpIdxMat], newProdStr], ":")), StringEntry(keyDuckBuffs(duckAssetId), makeString([toString(stats[7]), toString(stats[8]), toString(stats[9]), toString(stats[10]), toString(stats[11])], "_"))] ++ prologActions), 0)
30053219 }
30063220 }
30073221 }
30083222 }
30093223
30103224
30113225
30123226 @Callable(i)
30133227 func initDuckTourAttempt (duckAssetId) = if ((i.caller != tournamentContract))
30143228 then throw("Access denied")
30153229 else {
30163230 let keyHealth = keyDuckHealth(duckAssetId)
30173231 let maxHP = maxHealth(valueOrElse(getInteger(keyDuckLevel(duckAssetId)), 0))
30183232 let curHealth = valueOrElse(getInteger(keyHealth), maxHP)
30193233 let curLocKey = keyDuckLocation(duckAssetId)
30203234 let curLocation = valueOrElse(getString(curLocKey), DEFAULTLOCATION)
30213235 let lastId = valueOrElse(getInteger(tournamentContract, lastTourIdKey), 0)
30223236 let tourLocation = (toString(lastId) + "_T_0")
30233237 $Tuple2([IntegerEntry(keySavedHealth(duckAssetId), curHealth), IntegerEntry(keyHealth, maxHP), StringEntry(keySavedLocation(duckAssetId), curLocation), StringEntry(curLocKey, tourLocation)], tourLocation)
30243238 }
30253239
30263240
30273241
30283242 @Callable(i)
30293243 func breakAttempt () = {
30303244 let prologActions = prolog(i)
30313245 let duckAssetId = valueOrErrorMessage(getString(keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
30323246 let curLocKey = keyDuckLocation(duckAssetId)
30333247 let curLocation = valueOrElse(getString(curLocKey), DEFAULTLOCATION)
30343248 if ((split(curLocation, "_")[locIdxType] != "T"))
30353249 then throw("Your duck is not in the tournament")
30363250 else {
30373251 let savedHealth = getIntegerValue(keySavedHealth(duckAssetId))
30383252 let savedLocation = getStringValue(keySavedLocation(duckAssetId))
30393253 $Tuple2(((prologActions :+ IntegerEntry(keyDuckHealth(duckAssetId), savedHealth)) :+ StringEntry(curLocKey, savedLocation)), curLocation)
30403254 }
30413255 }
30423256
30433257
30443258
30453259 @Callable(i)
30463260 func breakAttemptCallback () = if ((i.caller != tournamentContract))
30473261 then throw("Access denied")
30483262 else {
30493263 let duckAssetId = valueOrErrorMessage(getString(keyStakedDuckByOwner(toString(i.originCaller))), "You don't have a duck staked")
30503264 $Tuple2([IntegerEntry(keyDuckHealth(duckAssetId), getIntegerValue(keySavedHealth(duckAssetId))), StringEntry(keyDuckLocation(duckAssetId), getStringValue(keySavedLocation(duckAssetId)))], "breakAttemptCallback")
30513265 }
30523266
30533267
30543268
30553269 @Callable(i)
30563270 func exitTournamentInternal (duckAssetId) = if ((i.caller != this))
30573271 then throw("Access denied")
30583272 else {
30593273 let savedHealth = getIntegerValue(keySavedHealth(duckAssetId))
30603274 let savedLocation = getStringValue(keySavedLocation(duckAssetId))
30613275 $Tuple2([IntegerEntry(keyDuckHealth(duckAssetId), savedHealth), StringEntry(keyDuckLocation(duckAssetId), savedLocation)], false)
30623276 }
30633277
30643278
30653279
30663280 @Callable(i)
30673281 func processDelivery (duckAssetId) = if ((i.caller != this))
30683282 then throw("Access denied")
30693283 else {
30703284 let addr = toString(i.originCaller)
30713285 let fundTotal = valueOrElse(getInteger(economyContract, deliveryFundKey), 0)
30723286 if ((MIN_USDT_FEE_DELIVERY > fundTotal))
30733287 then throw(("Delivery is not available, fund=" + fixedPoint(fundTotal, 6)))
30743288 else {
30753289 let now = lastBlock.timestamp
30763290 let countKey = keyUserDeliveryCount(addr)
30773291 let lastDay = valueOrElse(getInteger(keyUserLastDeliveryDay(addr)), 0)
30783292 let today = (now / DAYMILLIS)
30793293 let count = if ((lastDay == today))
30803294 then valueOrElse(getInteger(countKey), 0)
30813295 else 0
30823296 let acres = valueOrElse(getInteger(acresContract, keyAcresStakedAmountByUser(addr)), 0)
30833297 let allowedDeliveries = (ALLOWED_FREE_DELIVERIES + (acres / ACRES_FOR_DELIVERY_ATTEMPT))
30843298 if ((count >= allowedDeliveries))
30853299 then throw((("You already used " + toString(allowedDeliveries)) + " delivery attempts for today"))
30863300 else {
30873301 let globalCountKey = keyDuckDeliveryCount(duckAssetId)
30883302 let reward = invoke(economyContract, "sendDeliveryReward", [addr], nil)
30893303 $Tuple2([IntegerEntry(countKey, (count + 1)), IntegerEntry(keyUserLastDeliveryDay(addr), today), IntegerEntry(globalCountKey, (valueOrElse(getInteger(globalCountKey), 0) + 1))], reward)
30903304 }
30913305 }
30923306 }
30933307
30943308
30953309
30963310 @Callable(i)
30973311 func robLand (message,sig) = {
30983312 let prologActions = prolog(i)
30993313 if ((size(i.payments) != 1))
31003314 then throw("exactly 1 payment must be attached")
31013315 else {
31023316 let pmt = i.payments[0]
31033317 let wlgAmt = pmt.amount
31043318 if (if (!(isDefined(pmt.assetId)))
31053319 then true
31063320 else (value(pmt.assetId) != wlgAssetId))
31073321 then throw("WLGOLD payments only!")
31083322 else if ((wlgAmt != MIN_WLGOLD_ROBBERY))
31093323 then throw((("Payment should be " + fixedPoint(MIN_WLGOLD_ROBBERY, 8)) + " WLGOLD"))
31103324 else {
31113325 let addr = toString(i.caller)
31123326 if (!(sigVerify_8Kb(message, sig, pub)))
31133327 then throw("signature does not match")
31143328 else {
31153329 let parts = split_4C(toUtf8String(message), ";")
31163330 let robLog = split_4C(parts[0], "|")
31173331 let hp = split(robLog[rlHealth], "_")
31183332 let curHP = parseIntValue(hp[0])
31193333 let newHP = parseIntValue(hp[1])
31203334 let prodUsed = robLog[rlProdsUsed]
31213335 let lastPart = split(parts[1], "|")
31223336 let robType = lastPart[rlType]
31233337 if ((robType != "B"))
31243338 then throw("Only bank robbery is supported")
31253339 else {
31263340 let time = parseIntValue(lastPart[rlTimestamp])
31273341 if (if ((time > (lastBlock.timestamp + FIVEMINUTESMILLIS)))
31283342 then true
31293343 else ((lastBlock.timestamp - FIVEMINUTESMILLIS) > time))
31303344 then throw(((("signature outdated: logTime=" + toString(time)) + ", bcTime=") + toString(lastBlock.timestamp)))
31313345 else {
31323346 let txFromMsg = lastPart[rlLastTx]
31333347 let lastTx = valueOrElse(getString(keyLastTxIdByUser(addr)), "")
31343348 if ((lastTx != txFromMsg))
31353349 then throw(((("Tx ids don't match! In state: " + lastTx) + ", in msg: ") + txFromMsg))
31363350 else {
31373351 let duckAssetId = valueOrErrorMessage(getString(keyStakedDuckByOwner(addr)), "You don't have a duck staked")
31383352 let eqKey = keyDuckEquipment(duckAssetId)
31393353 let currentEq = valueOrElse(getString(eqKey), ",;,_,;,_,;,_,;,_,;,_,;,")
3140- let $t0109717109828 = subtractEquipment(currentEq, prodUsed)
3141- let newEq = $t0109717109828._1
3142- let shouldZeroBuffs = $t0109717109828._2
3143- let isBpUsed = $t0109717109828._3
3354+ let $t0115877115988 = subtractEquipment(currentEq, prodUsed)
3355+ let newEq = $t0115877115988._1
3356+ let shouldZeroBuffs = $t0115877115988._2
3357+ let isBpUsed = $t0115877115988._3
31443358 let curLocation = valueOrElse(getString(keyDuckLocation(duckAssetId)), DEFAULTLOCATION)
31453359 if (isInTournament(tournamentContract, curLocation))
31463360 then throw("Your duck is taking part in the tournament")
31473361 else {
31483362 let now = lastBlock.timestamp
31493363 let countKey = keyUserRobberyCount(addr)
31503364 let lastDay = valueOrElse(getInteger(keyUserLastRobberyDay(addr)), 0)
31513365 let today = (now / DAYMILLIS)
31523366 let count = if ((lastDay == today))
31533367 then valueOrElse(getInteger(countKey), 0)
31543368 else 0
31553369 let acres = valueOrElse(getInteger(acresContract, keyAcresStakedAmountByUser(addr)), 0)
31563370 let allowedRobberies = (ALLOWED_FREE_ROBBERIES + (acres / ACRES_FOR_ROBBERY_ATTEMPT))
31573371 if ((count >= allowedRobberies))
31583372 then throw((("You already used " + toString(allowedRobberies)) + " robbery attempts for today"))
31593373 else {
31603374 let globalCountKey = keyDuckRobberyCount(duckAssetId)
31613375 let loot = if ((newHP > 0))
31623376 then {
31633377 let fundTotal = assetBalance(this, wlgAssetId)
31643378 let prize = if (isBpUsed)
31653379 then (2 * MIN_WLGOLD_ROBBERY)
31663380 else (5 * MIN_WLGOLD_ROBBERY)
31673381 if ((prize > fundTotal))
31683382 then throw(((("Robbery is not available, funds = " + fixedPoint(fundTotal, 8)) + " WLGOLD, required = ") + fixedPoint(prize, 8)))
31693383 else [ScriptTransfer(i.caller, prize, wlgAssetId)]
31703384 }
31713385 else nil
31723386 $Tuple2((((((((((prologActions ++ loot) ++ (if (shouldZeroBuffs)
31733387 then [StringEntry(keyDuckBuffs(duckAssetId), "0_0_0_0_0")]
31743388 else nil)) ++ updateDuckStatsInternal(duckAssetId, if ((newHP > 0))
31753389 then xpSuccessRob
31763390 else xpFailRob)._1) :+ IntegerEntry(keyLastRobberyTimeByDuck(duckAssetId), now)) :+ IntegerEntry(countKey, (count + 1))) :+ IntegerEntry(keyUserLastRobberyDay(addr), today)) :+ IntegerEntry(globalCountKey, (valueOrElse(getInteger(globalCountKey), 0) + 1))) :+ StringEntry(eqKey, newEq)) :+ IntegerEntry(keyDuckHealth(duckAssetId), max([newHP, 0]))), 0)
31773391 }
31783392 }
31793393 }
31803394 }
31813395 }
31823396 }
31833397 }
31843398 }
31853399 }
31863400
31873401
31883402
31893403 @Callable(i)
31903404 func buyRoboDuck () = if (!(KS_ALLOW_ROBO_DUCKS))
31913405 then throw("Feature is turned off")
31923406 else {
31933407 let prologActions = prolog(i)
31943408 if ((size(i.payments) != 1))
31953409 then throw("Exactly one payment required")
31963410 else {
31973411 let pmt = value(i.payments[0])
31983412 if ((pmt.assetId != usdtAssetId))
31993413 then throw("Allowed USDT payment only!")
32003414 else if ((pmt.amount != ROBO_DUCK_USDT))
32013415 then throw((("Payment attached should be " + fixedPoint(ROBO_DUCK_USDT, 6)) + " USDT"))
32023416 else {
32033417 let nextNum = valueOrElse(getInteger(keyNextRoboDuck()), 0)
32043418 let bytez = toBytes(nextNum)
32053419 let name = ((ROBO_PREFIX + "-") + takeRight(toBase16String(bytez), 8))
32063420 let color = takeRight(toBase16String(sha256_16Kb(bytez)), 6)
32073421 let issue = Issue(name, ("Robo Duck NFT for WavesLands game, background color = #" + color), 1, 0, false)
32083422 let assetId = calculateAssetId(issue)
32093423 $Tuple2(((((prologActions :+ IntegerEntry(keyNextRoboDuck(), (nextNum + 1))) :+ issue) :+ ScriptTransfer(i.originCaller, 1, assetId)) :+ ScriptTransfer(economyContract, pmt.amount, usdtAssetId)), $Tuple2(toBase58String(assetId), color))
32103424 }
32113425 }
32123426 }
32133427
32143428

github/deemru/w8io/169f3d6 
324.56 ms