tx · HAGsL4fpNExrNrUFy56Uzdu7CoXiuTm41bsu4FxS18dw

3N7HtrKeFFLz5oy6PfGv1Lg3GwPk4gCPdGy:  -0.03500000 Waves

2024.12.03 23:12 [3398925] smart account 3N7HtrKeFFLz5oy6PfGv1Lg3GwPk4gCPdGy > SELF 0.00000000 Waves

{ "type": 13, "id": "HAGsL4fpNExrNrUFy56Uzdu7CoXiuTm41bsu4FxS18dw", "fee": 3500000, "feeAssetId": null, "timestamp": 1733256773451, "version": 2, "chainId": 84, "sender": "3N7HtrKeFFLz5oy6PfGv1Lg3GwPk4gCPdGy", "senderPublicKey": "FsR18761ZAsUqsTd7TK3XmR6bhihs1UXVmpHYxz5JzQ1", "proofs": [ "4Dt3ys1pJJ94BgkGW22L88Wyikkxi7Sy73hJSdeqgquGKGieJ86YeP4xba7dFZCaFeCY98qsTVjt9TuKEYfAwwim" ], "script": "base64:BgJOCAISBgoECAgICBIDCgEIEgMKAQESBAoCCAESAwoBARIECgIIARIAEgQKAggEEgMKAQESAwoBARIDCgEIEgMKAQgSAwoBARIAEgQKAggBtwEAA1NFUAICX18ABU1VTFQ2AMCEPQAFTVVMVDgAgMLXLwAOTUlOU0hPUFBBWU1FTlQAoI0GAApEQVlfTUlMTElTAIC4mSkABWNoYWluCQDJAQIJAMoBAggFBHRoaXMFYnl0ZXMAAQABAApEQVlfQkxPQ0tTBAckbWF0Y2gwBQVjaGFpbgMJAAACAQFXBQckbWF0Y2gwAKALAwkAAAIBAVQFByRtYXRjaDAAPAkAAgECDVVua25vd24gY2hhaW4AC1dFRUtfQkxPQ0tTBAckbWF0Y2gwBQVjaGFpbgMJAAACAQFXBQckbWF0Y2gwAOBOAwkAAAIBAVQFByRtYXRjaDAAtAEJAAIBAg1Vbmtub3duIGNoYWluAApWUkZfT0ZGU0VUBAckbWF0Y2gwBQVjaGFpbgMJAAACAQFXBQckbWF0Y2gwAAADCQAAAgEBVAUHJG1hdGNoMACQ+UUJAAIBAg1Vbmtub3duIGNoYWluAAt1c2R0QXNzZXRJZAQHJG1hdGNoMAUFY2hhaW4DCQAAAgEBVwUHJG1hdGNoMAEghNp6sggDP07Ru8qO7ouTvMmC3Qtd+geWqNQj+agP/7kDCQAAAgEBVAUHJG1hdGNoMAEgVbHYn3KHgu/l41uNrAWrZd6aQ6EvFrsF8xq3h6XxxRgJAAIBAg1Vbmtub3duIGNoYWluABZkZWZhdWx0UmVzdDJBZGRyZXNzU3RyBAckbWF0Y2gwBQVjaGFpbgMJAAACAQFXBQckbWF0Y2gwAiMzUEZ3WXRhOGJpRXozMXpwZUZlNURKSzh3RTV0clNwUVZGOAMJAAACAQFUBQckbWF0Y2gwAiMzTjdVdVlhcjYyNjRQNThGQmhWV0tQUUFoNFl1YTJoZ25ndgkAAgECDVVua25vd24gY2hhaW4AFWRlZmF1bHRSZXN0QWRkcmVzc1N0cgQHJG1hdGNoMAUFY2hhaW4DCQAAAgEBVwUHJG1hdGNoMAIjM1BRQ3V2RmJ2aDRMa1BVbnJuVTF6M2puYkExcDltM1dOaHYDCQAAAgEBVAUHJG1hdGNoMAIjM011bWtHR3p0Q0tBWHBXRHF4a2Rkb2ZxWFNVYnFRa3ZTSnkJAAIBAg1Vbmtub3duIGNoYWluABJlY29ub215Q29udHJhY3RTdHIEByRtYXRjaDAFBWNoYWluAwkAAAIBAVcFByRtYXRjaDACIzNQMnNrMUtuY1N4UmFaczhiNENXR1B3MmprdnZhdjc0dTREAwkAAAIBAVQFByRtYXRjaDACIzNOOHk0d3hYM0pDNFRkckNKQlhYMTZTaldmNlgyNTZocmVwCQACAQINVW5rbm93biBjaGFpbgEPZ2V0U3RyaW5nT3JGYWlsAgdhZGRyZXNzA2tleQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFB2FkZHJlc3MFA2tleQkAuQkCCQDMCAICCm1hbmRhdG9yeSAJAMwIAgkApQgBBQdhZGRyZXNzCQDMCAICAS4JAMwIAgUDa2V5CQDMCAICDyBpcyBub3QgZGVmaW5lZAUDbmlsAgAAEElkeENmZ0FjcmVzMkRhcHAAAQANSWR4Q2ZnV2xnRGFwcAACABRJZHhDZmdQdXp6bGVQb29sRGFwcAAEABRJZHhDZmdJbnZlc3RGdW5kRGFwcAAFAQprZXlSZXN0Q2ZnAAIOJXNfX3Jlc3RDb25maWcBD2tleVJlc3QyQWRkcmVzcwACDSVzX19yZXN0MkFkZHIBDmtleVJlc3RBZGRyZXNzAAIMJXNfX3Jlc3RBZGRyAAxyZXN0Q29udHJhY3QJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwkBDmtleVJlc3RBZGRyZXNzAAUVZGVmYXVsdFJlc3RBZGRyZXNzU3RyARFyZWFkUmVzdENmZ09yRmFpbAEEcmVzdAkAvAkCCQEPZ2V0U3RyaW5nT3JGYWlsAgUEcmVzdAkBCmtleVJlc3RDZmcABQNTRVABGGdldENvbnRyYWN0QWRkcmVzc09yRmFpbAIIcmVzdDJDZmcDaWR4CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkAkQMCBQhyZXN0MkNmZwUDaWR4CQCsAgICKlJlc3QgY2ZnIGRvZXNuJ3QgY29udGFpbiBhZGRyZXNzIGF0IGluZGV4IAkApAMBBQNpZHgAEUlkeENmZ1N0YWtpbmdEYXBwAAEAD0lkeENmZ0FjcmVzRGFwcAAIAAdyZXN0Q2ZnCQERcmVhZFJlc3RDZmdPckZhaWwBBQxyZXN0Q29udHJhY3QAD3N0YWtpbmdDb250cmFjdAkBGGdldENvbnRyYWN0QWRkcmVzc09yRmFpbAIFB3Jlc3RDZmcFEUlkeENmZ1N0YWtpbmdEYXBwAA1hY3Jlc0NvbnRyYWN0CQEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgUHcmVzdENmZwUPSWR4Q2ZnQWNyZXNEYXBwAA1yZXN0MkNvbnRyYWN0CQERQGV4dHJOYXRpdmUoMTA2MikBCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMJAQ9rZXlSZXN0MkFkZHJlc3MABRZkZWZhdWx0UmVzdDJBZGRyZXNzU3RyAAhyZXN0MkNmZwkBEXJlYWRSZXN0Q2ZnT3JGYWlsAQUNcmVzdDJDb250cmFjdAAOYWNyZXMyQ29udHJhY3QJARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCBQhyZXN0MkNmZwUQSWR4Q2ZnQWNyZXMyRGFwcAALd2xnQ29udHJhY3QJARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCBQhyZXN0MkNmZwUNSWR4Q2ZnV2xnRGFwcAAScHV6emxlUG9vbENvbnRyYWN0CQEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgUIcmVzdDJDZmcFFElkeENmZ1B1enpsZVBvb2xEYXBwABJpbnZlc3RGdW5kQ29udHJhY3QJARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCBQhyZXN0MkNmZwUUSWR4Q2ZnSW52ZXN0RnVuZERhcHABFWtleUxhc3RXZWVrVHhJZEJ5VXNlcgEEYWRkcgkArAICAhNsYXN0V2Vla1R4SWRCeVVzZXJfBQRhZGRyAA13bGdBc3NldElkS2V5Agt3bGdfYXNzZXRJZAAKd2xnQXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCcCAIFC3dsZ0NvbnRyYWN0BQ13bGdBc3NldElkS2V5AhhXTEdPTEQgaXMgbm90IGlzc3VlZCB5ZXQBCmtleVVzZXJCZXQBBGFkZHIJAKwCAgIIdXNlckJldF8FBGFkZHIBEmtleVVzZXJXZWVrVGlja2V0cwIEYWRkcgR3ZWVrCQCsAgIJAKwCAgkArAICAhB1c2VyV2Vla1RpY2tldHNfBQRhZGRyAgFfCQCkAwEFBHdlZWsBE2tleVRvdGFsV2Vla1RpY2tldHMBBHdlZWsJAKwCAgIRdG90YWxXZWVrVGlja2V0c18JAKQDAQUEd2VlawEYa2V5VG90YWxXZWVrUGFydGljaXBhbnRzAQR3ZWVrCQCsAgICFnRvdGFsV2Vla1BhcnRpY2lwYW50c18JAKQDAQUEd2VlawEOa2V5TnVtTkZUMkRyYXcBBHdlZWsJAKwCAgIMbnVtTkZUMkRyYXdfCQCkAwEFBHdlZWsBDmtleU51bU5GVERyYXduAQR3ZWVrCQCsAgICDG51bU5GVERyYXduXwkApAMBBQR3ZWVrAQ5rZXlXZWVrV2lubmVycwEEd2VlawkArAICAgx3ZWVrV2lubmVyc18JAKQDAQUEd2VlawEKd2lubmluZ0JldAEDZGF5BAFiCQBoAgUDZGF5BQpEQVlfQkxPQ0tTBAFoAwkAZgIFAWIFClZSRl9PRkZTRVQFAWIJAGQCBQFiBQpWUkZfT0ZGU0VUCQBqAgkAsQkBCQEFdmFsdWUBCAkBBXZhbHVlAQkA7QcBBQFoA3ZyZgAEAAtpeFdsZ0Ftb3VudAAAAAhpeFdsZ1dsZwABAAppeFdsZ1ByaWNlAAIADml4V2xnSXNzdWVUaW1lAAgAD2l4V2xnVGVhbUFtTGVmdAALABNpeFdsZ1RlYW1BbUF2YWlsTm93AAwADml4V2xnQWN0QW1MZWZ0AA8AEml4V2xnQWN0QW1BdmFpbE5vdwAQABBpeFdsZ0FtTGVmdFRvdGFsABMAE2l4V2xnVXNlckFtQXZhaWxOb3cAFwAQaXhXbGdFZmZVc2VyVGltZQAYABJpeFdsZ0lzc3VlMTBBbW91bnQAGQAbaXhXbGdNYXJrZXRpbmdJc3N1ZTEwQW1vdW50ABoAFml4V2xnVGVhbUlzc3VlMTBBbW91bnQAGwAPaXhXbGdVc2VyMTBwYXJ0ABwAEGl4V2xnSXNzdWUxMFRpbWUAHQEFYXNJbnQBAXYEByRtYXRjaDAFAXYDCQABAgUHJG1hdGNoMAIDSW50BAFuBQckbWF0Y2gwBQFuCQACAQIVZmFpbCB0byBjYXN0IGludG8gSW50AQpmaXhlZFBvaW50AgN2YWwIZGVjaW1hbHMEBnRlblBvdwkAbAYACgAABQhkZWNpbWFscwAAAAAFBERPV04EB2xvd1BhcnQJAKQDAQkAagIFA3ZhbAUGdGVuUG93BAZ6ZXJvZXMJALACAgkApAMBBQZ0ZW5Qb3cJAGQCAAEJALECAQUHbG93UGFydAkArAICCQCsAgIJAKwCAgkApAMBCQBpAgUDdmFsBQZ0ZW5Qb3cCAS4FBnplcm9lcwUHbG93UGFydAEPZ2V0UmFuZG9tTnVtYmVyAwhtYXhWYWx1ZQRzYWx0B2VudHJvcHkDCQBnAgAABQhtYXhWYWx1ZQkAAgECFm1heFZhbHVlIHNob3VsZCBiZSA+IDAECnJhbmRvbUhhc2gJANQWAQkAywECBQRzYWx0BQdlbnRyb3B5CQBqAgkAsQkBBQpyYW5kb21IYXNoBQhtYXhWYWx1ZQAGU0NBTEU4AIDC1y8ADHhwTGV2ZWxTY2FsZQCAGQAPeHBMZXZlbFJlY2lwUG93AKAfABJudW1Qb2ludHNPbkxldmVsVXAAAwAPd2xnQmFzZUFtb3VudFhwAIDQ28P0AgEJa2V5VXNlclhQAQRhZGRyCQCsAgICB3VzZXJYUF8FBGFkZHIBDGtleVVzZXJMZXZlbAEEYWRkcgkArAICAgp1c2VyTGV2ZWxfBQRhZGRyAAV4cFdsZwCQTgEJbGV2ZWxCeVhQAQJ4cAkAawMFDHhwTGV2ZWxTY2FsZQkAbAYFAnhwAAQFD3hwTGV2ZWxSZWNpcFBvdwAEAAQFBERPV04FBlNDQUxFOAEHbGV2ZWxVcAIJY3VyckxldmVsBW5ld1hQBAhuZXdMZXZlbAkBCWxldmVsQnlYUAEFBW5ld1hQCQDMCAIFCG5ld0xldmVsCQDMCAIJAGgCBRJudW1Qb2ludHNPbkxldmVsVXAJAGUCBQhuZXdMZXZlbAUJY3VyckxldmVsBQNuaWwAAk02AMCEPQACTTgAgMLXLwAITUlMTElPTjYAgIDpg7HeFgAJVEVBTVNIQVJFAMCaDAANQUNUSVZJVFlTSEFSRQCgjQYAC1BMQVlFUlNIQVJFAIC1GAAKWUVBUk1JTExJUwCAhuvHdQAJREFZTUlMTElTAIC4mSkACEJBTktfRkVFANCGAwACY2gJAMkBAgkAygECCAUEdGhpcwVieXRlcwABAAEAE1VTRFRfVFZMX0NPUlJFQ1RJT04EByRtYXRjaDAFAmNoAwkAAAIBAVcFByRtYXRjaDAA8PWowAQDCQAAAgEBVAUHJG1hdGNoMAAACQACAQINVW5rbm93biBjaGFpbgALdGVhbUFkZHJLZXkCCHRlYW1BZGRyAA9sYXN0VGVhbVRpbWVLZXkCFGxhc3RDbGFpbWVkVGltZV90ZWFtABF0ZWFtQW1vdW50TGVmdEtleQIOdGVhbUFtb3VudExlZnQAFWxhc3RBY3Rpdml0aWVzVGltZUtleQIabGFzdENsYWltZWRUaW1lX2FjdGl2aXRpZXMAEGFjdEFtb3VudExlZnRLZXkCFGFjdGl2aXRpZXNBbW91bnRMZWZ0ABRzdGFrZXJzQW1vdW50TGVmdEtleQIRc3Rha2Vyc0Ftb3VudExlZnQBGGtleUxhc3RDbGFpbWVkVGltZUJ5VXNlcgEEYWRkcgkArAICAhRsYXN0Q2xhaW1lZFRpbWVVc2VyXwUEYWRkcgEZa2V5TGFzdFdsZ1RyYWRlVGltZUJ5VXNlcgEEYWRkcgkArAICAhBsYXN0QXJiVGltZVVzZXJfBQRhZGRyARprZXlMYXN0V2xnVHJhZGVMaW1pdEJ5VXNlcgEEYWRkcgkArAICAhFsYXN0V2xnTGltaXRVc2VyXwUEYWRkcgEUZGlzdHJpYnV0aW9uQnlQZXJpb2QBBnBlcmlvZAkAawMFCE1JTExJT042CQBoAgULUExBWUVSU0hBUkUJAGQCBQZwZXJpb2QAAQkAaAIABgUCTTYAD3dsZ0lzc3VlVGltZUtleQINd2xnX2lzc3VlVGltZQASd2xnSXNzdWVkQW1vdW50S2V5AhB3bGdfaXNzdWVkQW1vdW50ABF6Yklzc3VlZEFtb3VudEtleQISemJpbGxfaXNzdWVkQW1vdW50ARprZXlBY3Jlc1N0YWtlZEFtb3VudEJ5VXNlcgEEYWRkcgkArAICAhhhY3Jlc1N0YWtlZEFtb3VudEJ5VXNlcl8FBGFkZHIAE2FjcmVzU3Rha2VkVG90YWxLZXkCFmFjcmVzU3Rha2VkQW1vdW50VG90YWwBGGtleVdsZ1N0YWtlZEFtb3VudEJ5VXNlcgEEYWRkcgkArAICAhZ3bGdTdGFrZWRBbW91bnRCeVVzZXJfBQRhZGRyABF3bGdTdGFrZWRUb3RhbEtleQIUd2xnU3Rha2VkQW1vdW50VG90YWwBFmtleVdsZ1N0YWtlZFRpbWVCeVVzZXIBBGFkZHIJAKwCAgIUd2xnU3Rha2VkVGltZUJ5VXNlcl8FBGFkZHIACGRhcHBSZXN0AAAAC2RhcHBTdGFraW5nAAEAC2RhcHBFY29ub215AAIAB2RhcHBXbGcAAwAKZGFwcFB1enpsZQAEAA5kYXBwSW52ZXN0RnVuZAAFAAlkYXBwQWNyZXMABgEIZ2V0TGFuZHMDEnVzZXJBZGRyU3RyT3JFbXB0eQ9zdGFraW5nQ29udHJhY3QNYWNyZXNDb250cmFjdAQFcHJvcHMJALUJAgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QCE3Jlc1R5cGVzUHJvcG9ydGlvbnMCCzBfMF8wXzBfMF8wAgFfCgEFYWRkZXICA2FjYwRpdGVtCQBkAgUDYWNjCQENcGFyc2VJbnRWYWx1ZQEFBGl0ZW0EC3RvdGFsUGllY2VzCgACJGwFBXByb3BzCgACJHMJAJADAQUCJGwKAAUkYWNjMAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQVhZGRlcgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgNgkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgQKdXNlclBpZWNlcwkBC3ZhbHVlT3JFbHNlAgkAmggCBQ9zdGFraW5nQ29udHJhY3QJAKwCAgIUc3Rha2VkUGllY2VzQnlPd25lcl8FEnVzZXJBZGRyU3RyT3JFbXB0eQAABAp0b3RhbEFjcmVzCQELdmFsdWVPckVsc2UCCQCaCAIFDWFjcmVzQ29udHJhY3QFE2FjcmVzU3Rha2VkVG90YWxLZXkAAAQJdXNlckFjcmVzCQELdmFsdWVPckVsc2UCCQCaCAIFDWFjcmVzQ29udHJhY3QJARprZXlBY3Jlc1N0YWtlZEFtb3VudEJ5VXNlcgEFEnVzZXJBZGRyU3RyT3JFbXB0eQAACQDMCAIFC3RvdGFsUGllY2VzCQDMCAIFCnVzZXJQaWVjZXMJAMwIAgUKdG90YWxBY3JlcwkAzAgCBQl1c2VyQWNyZXMFA25pbAAOaWR4VG90YWxQaWVjZXMAAAANaWR4VXNlclBpZWNlcwABAA1pZHhUb3RhbEFjcmVzAAIADGlkeFVzZXJBY3JlcwADAQtnZXRXbGdTdGF0cwULdXNlckFkZHJPcHQJY29udHJhY3RzBnVzZHRJZBV1c2R0QmFsYW5jZUNvcnJlY3Rpb24PdXNlclByb3BvcnRpb242BAxpc3N1ZWRBbW91bnQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCCQCRAwIFCWNvbnRyYWN0cwUHZGFwcFdsZwUSd2xnSXNzdWVkQW1vdW50S2V5AhhXTEdPTEQgaXMgbm90IGlzc3VlZCB5ZXQECmVjb25vbXlVc2QJAPAHAgkAkQMCBQljb250cmFjdHMFC2RhcHBFY29ub215BQZ1c2R0SWQEB3Jlc3RVc2QJAPAHAgkAkQMCBQljb250cmFjdHMFCGRhcHBSZXN0BQZ1c2R0SWQEBndsZ1VzZAkAZQIJAPAHAgkAkQMCBQljb250cmFjdHMFB2RhcHBXbGcFBnVzZHRJZAUVdXNkdEJhbGFuY2VDb3JyZWN0aW9uBAlwdXp6bGVVc2QJAPAHAgkAkQMCBQljb250cmFjdHMFCmRhcHBQdXp6bGUFBnVzZHRJZAQRaW52ZXN0Rm5kQ29udHJhY3QJAJEDAgUJY29udHJhY3RzBQ5kYXBwSW52ZXN0RnVuZAQPaW52ZXN0RnVuZFRvdGFsCQBkAgkA8AcCBRFpbnZlc3RGbmRDb250cmFjdAUGdXNkdElkCQELdmFsdWVPckVsc2UCCQCaCAIFEWludmVzdEZuZENvbnRyYWN0BRF6Yklzc3VlZEFtb3VudEtleQAABA10b3RhbEZ1bmRzVXNkCQBkAgkAZAIFCmVjb25vbXlVc2QFBndsZ1VzZAUPaW52ZXN0RnVuZFRvdGFsBAV3bGdJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCcCAIJAJEDAgUJY29udHJhY3RzBQdkYXBwV2xnAgt3bGdfYXNzZXRJZAITTm90IGluaXRpYWxpemVkIHlldAQDbm93CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAQJaXNzdWVUaW1lCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgkAkQMCBQljb250cmFjdHMFB2RhcHBXbGcFD3dsZ0lzc3VlVGltZUtleQIPTm90IGluaXRpYWxpemVkBApiYW5rV2xnb2xkCQDwBwIJAJEDAgUJY29udHJhY3RzBQtkYXBwU3Rha2luZwUFd2xnSWQECXRlYW1Ub3RhbAkAawMFCE1JTExJT042BQlURUFNU0hBUkUFAk02BA50ZWFtQW1vdW50TGVmdAkBC3ZhbHVlT3JFbHNlAgkAmggCCQCRAwIFCWNvbnRyYWN0cwUHZGFwcFdsZwURdGVhbUFtb3VudExlZnRLZXkFCXRlYW1Ub3RhbAQMbGFzdFRlYW1UaW1lCQELdmFsdWVPckVsc2UCCQCaCAIJAJEDAgUJY29udHJhY3RzBQdkYXBwV2xnBQ9sYXN0VGVhbVRpbWVLZXkFCWlzc3VlVGltZQQIdGVhbUFkZHIJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQV2YWx1ZQEJAJ0IAgkAkQMCBQljb250cmFjdHMFB2RhcHBXbGcFC3RlYW1BZGRyS2V5BBZ0ZWFtQW1vdW50QXZhaWxhYmxlTm93CQCXAwEJAMwIAgkAawMFCXRlYW1Ub3RhbAkAZQIFA25vdwUMbGFzdFRlYW1UaW1lCQBoAgADBQpZRUFSTUlMTElTCQDMCAIFDnRlYW1BbW91bnRMZWZ0BQNuaWwECnRlYW1XbGdvbGQJAPAHAgUIdGVhbUFkZHIFBXdsZ0lkBAhhY3RUb3RhbAkAawMFCE1JTExJT042BQ1BQ1RJVklUWVNIQVJFBQJNNgQNYWN0QW1vdW50TGVmdAkBC3ZhbHVlT3JFbHNlAgkAmggCCQCRAwIFCWNvbnRyYWN0cwUHZGFwcFdsZwUQYWN0QW1vdW50TGVmdEtleQUIYWN0VG90YWwEEmxhc3RBY3Rpdml0aWVzVGltZQkBC3ZhbHVlT3JFbHNlAgkAmggCCQCRAwIFCWNvbnRyYWN0cwUHZGFwcFdsZwUVbGFzdEFjdGl2aXRpZXNUaW1lS2V5BQlpc3N1ZVRpbWUEFWFjdEFtb3VudEF2YWlsYWJsZU5vdwkAlwMBCQDMCAIJAGsDBQhhY3RUb3RhbAkAZQIFA25vdwUSbGFzdEFjdGl2aXRpZXNUaW1lCQBoAgADBQpZRUFSTUlMTElTCQDMCAIFDWFjdEFtb3VudExlZnQFA25pbAQJYWN0V2xnb2xkCQDwBwIJAJEDAgUJY29udHJhY3RzBQhkYXBwUmVzdAUFd2xnSWQEDGxhc3RVc2VyVGltZQkBC3ZhbHVlT3JFbHNlAgkAmggCCQCRAwIFCWNvbnRyYWN0cwUHZGFwcFdsZwkBGGtleUxhc3RDbGFpbWVkVGltZUJ5VXNlcgEFC3VzZXJBZGRyT3B0BQlpc3N1ZVRpbWUEDmxhc3RVc2VyUGVyaW9kCQBpAgkAZQIFDGxhc3RVc2VyVGltZQUJaXNzdWVUaW1lBQpZRUFSTUlMTElTBApub3dMaW1pdGVkCQCXAwEJAMwIAgUDbm93CQDMCAIJAGQCBQlpc3N1ZVRpbWUJAGgCAAMFCllFQVJNSUxMSVMFA25pbAQJY3VyUGVyaW9kCQCXAwEJAMwIAgkAaQIJAGUCBQNub3cFCWlzc3VlVGltZQUKWUVBUk1JTExJUwkAzAgCAAIFA25pbAQDZWZmCQEIZ2V0TGFuZHMDBQt1c2VyQWRkck9wdAkAkQMCBQljb250cmFjdHMFC2RhcHBTdGFraW5nCQCRAwIFCWNvbnRyYWN0cwUJZGFwcEFjcmVzBBVjdXJQZXJpb2REaXN0cmlidXRpb24JARRkaXN0cmlidXRpb25CeVBlcmlvZAEFCWN1clBlcmlvZAQIJHQwNzkxNDMDCQAAAgUObGFzdFVzZXJQZXJpb2QFCWN1clBlcmlvZAQCYTAJAGsDBRVjdXJQZXJpb2REaXN0cmlidXRpb24JAGUCBQpub3dMaW1pdGVkBQxsYXN0VXNlclRpbWUFCllFQVJNSUxMSVMECHVzZXJQYXJ0CQBrAwUCYTAFD3VzZXJQcm9wb3J0aW9uNgUCTTYEB2VmZlRpbWUJAGQCBQxsYXN0VXNlclRpbWUJAGsDCQBlAgUKbm93TGltaXRlZAUMbGFzdFVzZXJUaW1lBQ91c2VyUHJvcG9ydGlvbjYFAk02CQCVCgMFCHVzZXJQYXJ0BQJhMAUHZWZmVGltZQMJAAACBQ5sYXN0VXNlclBlcmlvZAkAZQIFCWN1clBlcmlvZAABBAJhMQkAawMJARRkaXN0cmlidXRpb25CeVBlcmlvZAEJAGUCBQljdXJQZXJpb2QAAQkAZQIJAGQCBQlpc3N1ZVRpbWUJAGgCBQpZRUFSTUlMTElTBQljdXJQZXJpb2QFDGxhc3RVc2VyVGltZQUKWUVBUk1JTExJUwQCYTAJAGsDBRVjdXJQZXJpb2REaXN0cmlidXRpb24JAGUCBQpub3dMaW1pdGVkCQBkAgUJaXNzdWVUaW1lCQBoAgUKWUVBUk1JTExJUwUJY3VyUGVyaW9kBQpZRUFSTUlMTElTBAVhdmFpbAkAZAIFAmExBQJhMAQIdXNlclBhcnQJAGsDBQVhdmFpbAUPdXNlclByb3BvcnRpb242BQJNNgQHZWZmVGltZQMJAGcCBQJhMQUIdXNlclBhcnQJAGQCBQxsYXN0VXNlclRpbWUJAGsDBQpZRUFSTUlMTElTBQh1c2VyUGFydAkBFGRpc3RyaWJ1dGlvbkJ5UGVyaW9kAQkAZQIFCWN1clBlcmlvZAABCQBkAgkAZAIFCWlzc3VlVGltZQkAaAIFCllFQVJNSUxMSVMFCWN1clBlcmlvZAkAawMFCllFQVJNSUxMSVMJAGUCBQh1c2VyUGFydAUCYTEFFWN1clBlcmlvZERpc3RyaWJ1dGlvbgkAlQoDBQh1c2VyUGFydAUFYXZhaWwFB2VmZlRpbWUEAmEyCQBrAwkBFGRpc3RyaWJ1dGlvbkJ5UGVyaW9kAQkAZQIFCWN1clBlcmlvZAACCQBlAgkAZAIFCWlzc3VlVGltZQkAaAIFCllFQVJNSUxMSVMJAGUCBQljdXJQZXJpb2QAAQUMbGFzdFVzZXJUaW1lBQpZRUFSTUlMTElTBAJhMQkBFGRpc3RyaWJ1dGlvbkJ5UGVyaW9kAQkAZQIFCWN1clBlcmlvZAABBAJhMAkAawMFFWN1clBlcmlvZERpc3RyaWJ1dGlvbgkAZQIFCm5vd0xpbWl0ZWQJAGQCBQlpc3N1ZVRpbWUJAGgCBQpZRUFSTUlMTElTBQljdXJQZXJpb2QFCllFQVJNSUxMSVMEBWF2YWlsCQBkAgkAZAIFAmEyBQJhMQUCYTAECHVzZXJQYXJ0CQBrAwUFYXZhaWwFD3VzZXJQcm9wb3J0aW9uNgUCTTYEB2VmZlRpbWUDCQBnAgUCYTIFCHVzZXJQYXJ0CQBkAgUMbGFzdFVzZXJUaW1lCQBrAwUKWUVBUk1JTExJUwUIdXNlclBhcnQJARRkaXN0cmlidXRpb25CeVBlcmlvZAEJAGUCBQljdXJQZXJpb2QAAgMJAGcCCQBkAgUCYTIFAmExBQh1c2VyUGFydAkAZAIJAGQCBQlpc3N1ZVRpbWUJAGgCBQpZRUFSTUlMTElTCQBlAgUJY3VyUGVyaW9kAAEJAGsDBQpZRUFSTUlMTElTCQBlAgUIdXNlclBhcnQFAmEyCQEUZGlzdHJpYnV0aW9uQnlQZXJpb2QBCQBlAgUJY3VyUGVyaW9kAAEJAGQCCQBkAgUJaXNzdWVUaW1lCQBoAgUKWUVBUk1JTExJUwUJY3VyUGVyaW9kCQBrAwUKWUVBUk1JTExJUwkAZQIJAGUCBQh1c2VyUGFydAUCYTIFAmExBRVjdXJQZXJpb2REaXN0cmlidXRpb24JAJUKAwUIdXNlclBhcnQFBWF2YWlsBQdlZmZUaW1lBAp1c2VyQW1vdW50CAUIJHQwNzkxNDMCXzEEDXVzZXJBdmFpbGFibGUIBQgkdDA3OTE0MwJfMgQLZWZmTGFzdFRpbWUIBQgkdDA3OTE0MwJfMwQQc0xhbmREYWlseUFtb3VudAkAawMJAGsDBRVjdXJQZXJpb2REaXN0cmlidXRpb24FCURBWU1JTExJUwUKWUVBUk1JTExJUwAZCQCRAwIFA2VmZgUOaWR4VG90YWxQaWVjZXMED2Ftb3VudExlZnRUb3RhbAkBC3ZhbHVlT3JFbHNlAgkAmggCCQCRAwIFCWNvbnRyYWN0cwUHZGFwcFdsZwUUc3Rha2Vyc0Ftb3VudExlZnRLZXkAAAQIdXNlclRlbXAJAGsDBQp1c2VyQW1vdW50CQBkAgkAaAIJAJEDAgUDZWZmBQ1pZHhVc2VyUGllY2VzBQJNOAkAkQMCBQNlZmYFDGlkeFVzZXJBY3JlcwkAZAIJAGgCCQCRAwIFA2VmZgUOaWR4VG90YWxQaWVjZXMFAk04CQCRAwIFA2VmZgUNaWR4VG90YWxBY3JlcwQMYmFua0Zyb21Vc2VyCQBrAwUIdXNlclRlbXAFCEJBTktfRkVFBQJNNgQKcm9iYmVkVXNlcgkAZQIFCHVzZXJUZW1wBQxiYW5rRnJvbVVzZXIEDHVucm9iYmVkVXNlcgkAawMFDXVzZXJBdmFpbGFibGUJAGQCCQBoAgkAkQMCBQNlZmYFDWlkeFVzZXJQaWVjZXMFAk04CQCRAwIFA2VmZgUMaWR4VXNlckFjcmVzCQBkAgkAaAIJAJEDAgUDZWZmBQ5pZHhUb3RhbFBpZWNlcwUCTTgJAJEDAgUDZWZmBQ1pZHhUb3RhbEFjcmVzCQDMCAIFDGlzc3VlZEFtb3VudAkAzAgCCQBrAwkAZQIFDXRvdGFsRnVuZHNVc2QFE1VTRFRfVFZMX0NPUlJFQ1RJT04FAk04BQxpc3N1ZWRBbW91bnQJAMwIAgUNdG90YWxGdW5kc1VzZAkAzAgCBQplY29ub215VXNkCQDMCAIFB3Jlc3RVc2QJAMwIAgUGd2xnVXNkCQDMCAIFCXB1enpsZVVzZAkAzAgCBQlpc3N1ZVRpbWUJAMwIAgUMbGFzdFRlYW1UaW1lCQDMCAIFCXRlYW1Ub3RhbAkAzAgCBQ50ZWFtQW1vdW50TGVmdAkAzAgCBRZ0ZWFtQW1vdW50QXZhaWxhYmxlTm93CQDMCAIFCnRlYW1XbGdvbGQJAMwIAgUIYWN0VG90YWwJAMwIAgUNYWN0QW1vdW50TGVmdAkAzAgCBRVhY3RBbW91bnRBdmFpbGFibGVOb3cJAMwIAgUJYWN0V2xnb2xkCQDMCAIFCWN1clBlcmlvZAkAzAgCBQ9hbW91bnRMZWZ0VG90YWwJAMwIAgUVY3VyUGVyaW9kRGlzdHJpYnV0aW9uCQDMCAIFDGxhc3RVc2VyVGltZQkAzAgCBQpyb2JiZWRVc2VyCQDMCAIFEHNMYW5kRGFpbHlBbW91bnQJAMwIAgUPaW52ZXN0RnVuZFRvdGFsCQDMCAIFDHVucm9iYmVkVXNlcgkAzAgCBQtlZmZMYXN0VGltZQkAzAgCBQpiYW5rV2xnb2xkBQNuaWwAA002XwDAhD0AA004XwCAwtcvAApURUFNX1NIQVJFAMCaDAAOQUNUSVZJVFlfU0hBUkUAoI0GAAxQTEFZRVJfU0hBUkUAgLUYAAtZRUFSX01JTExJUwCAhuvHdQAGREFZX01TAIC4mSkAB0lTU1VFMTAAgJTr3AMAD1BMQVlFUlMxMF9TSEFSRQCA6jAAEU1BUktFVElORzEwX1NIQVJFAKCNBgAMVEVBTTEwX1NIQVJFAKCNBgARTkVXX1NUQUtJTkdfU1RBUlQAgPO4wrEyABBtYXJrZXRpbmdBZGRyS2V5Ag1tYXJrZXRpbmdBZGRyAAp0ZWFtQWRyS2V5Agh0ZWFtQWRkcgAObGFzdFRlYW1UaW1LZXkCFGxhc3RDbGFpbWVkVGltZV90ZWFtAA50ZWFtQW10TGVmdEtleQIOdGVhbUFtb3VudExlZnQAFGxhc3RBY3Rpdml0aWVzVGltS2V5AhpsYXN0Q2xhaW1lZFRpbWVfYWN0aXZpdGllcwANYWN0QW10TGVmdEtleQIUYWN0aXZpdGllc0Ftb3VudExlZnQAEXN0YWtlcnNBbXRMZWZ0S2V5AhFzdGFrZXJzQW1vdW50TGVmdAEWa2V5TGFzdENsYWltVGltZUJ5VXNlcgEEYWRkcgkArAICAhRsYXN0Q2xhaW1lZFRpbWVVc2VyXwUEYWRkcgENZGlzdHJCeVBlcmlvZAIMaXNzdWVkQW1vdW50BnBlcmlvZAkAawMFDGlzc3VlZEFtb3VudAkAaAIFDFBMQVlFUl9TSEFSRQkAZAIFBnBlcmlvZAABCQBoAgAGBQNNNl8AEXdsZ0lzc3VlMTBUaW1lS2V5Ag93bGdfaXNzdWUxMFRpbWUADndsZ0lzc3VlVGltS2V5Ag13bGdfaXNzdWVUaW1lAA93bGdJc3N1ZWRBbXRLZXkCEHdsZ19pc3N1ZWRBbW91bnQADnpiSXNzdWVkQW10S2V5AhJ6YmlsbF9pc3N1ZWRBbW91bnQBF2tleUFjcmVzU3Rha2VkQW10QnlVc2VyAQRhZGRyCQCsAgICGGFjcmVzU3Rha2VkQW1vdW50QnlVc2VyXwUEYWRkcgASYWNyZXNTdGFrZFRvdGFsS2V5AhZhY3Jlc1N0YWtlZEFtb3VudFRvdGFsABR0b3RhbEZhcm1pbmdQb3dlcktleQIRdG90YWxGYXJtaW5nUG93ZXIACWRhcHAyUmVzdAAAAAxkYXBwMlN0YWtpbmcAAQAIZGFwcDJXbGcAAgALZGFwcDJQdXp6bGUAAwAPZGFwcDJJbnZlc3RGdW5kAAQAFURFRkFVTFRfV0VFS0xZX1BSSVpFUwAFAA1BQ1JFU19GT1JfQkVUAIDC1y8AEWtleU5mdFRvdGFsSXNzdWVkAg5uZnRUb3RhbElzc3VlZAARa2V5TmZ0VG90YWxCdXJuZWQCDm5mdFRvdGFsQnVybmVkABNrZXlXbE5mdFRvdGFsU3Rha2VkAhBXbE5mdFRvdGFsU3Rha2VkARJrZXlVc2VyV2xOZnROdW1iZXIBBGFkZHIJAKwCAgIQdXNlcldsTmZ0TnVtYmVyXwUEYWRkcgEQa2V5VXNlckZ1bGxCb251cwEEYWRkcgkArAICAg51c2VyRnVsbEJvbnVzXwUEYWRkcgAKbGV2ZWxBY3JlcwkAzAgCAAAJAMwIAgAKCQDMCAIAFAkAzAgCACgJAMwIAgBQCQDMCAIAlgEJAMwIAgD6AQkAzAgCAJADCQDMCAIAvAUJAMwIAgDoBwUDbmlsAQ9nZXRMZXZlbEJ5QWNyZXMBBWFjcmVzBANhY3IJAGkCCQBkAgUFYWNyZXMA/8HXLwUDTThfCgEHY2hlY2tlcgIDYWNjBGl0ZW0DCQBnAgUEaXRlbQUDYWNyBQNhY2MJAGQCBQNhY2MAAQoAAiRsBQpsZXZlbEFjcmVzCgACJHMJAJADAQUCJGwKAAUkYWNjMAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQdjaGVja2VyAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKARZnZXRGYXJtaW5nUG93ZXJCeUFjcmVzAQVhY3JlcwkAaAIJAGgCBQVhY3JlcwAUCQBkAgkBD2dldExldmVsQnlBY3JlcwEFBWFjcmVzAAQBHmdldEZhcm1pbmdQb3dlckJ5QWNyZXNBbmRCb251cwIFYWNyZXMGYm9udXM2BApub3RCb251c2VkCQEWZ2V0RmFybWluZ1Bvd2VyQnlBY3JlcwEFBWFjcmVzCQCUCgIJAGsDBQpub3RCb251c2VkCQBkAgUDTTZfBQZib251czYFA002XwUKbm90Qm9udXNlZAEQZ2V0RmFybWluZ1Bvd2VycwISdXNlckFkZHJTdHJPckVtcHR5DmFjcmVzMkNvbnRyYWN0BAd0b3RhbEZQCQELdmFsdWVPckVsc2UCCQCaCAIFDmFjcmVzMkNvbnRyYWN0BRR0b3RhbEZhcm1pbmdQb3dlcktleQAABAl1c2VyQWNyZXMJAQt2YWx1ZU9yRWxzZQIJAJoIAgUOYWNyZXMyQ29udHJhY3QJARdrZXlBY3Jlc1N0YWtlZEFtdEJ5VXNlcgEFEnVzZXJBZGRyU3RyT3JFbXB0eQAABAl1c2VyQm9udXMJAQt2YWx1ZU9yRWxzZQIJAJoIAgUOYWNyZXMyQ29udHJhY3QJARBrZXlVc2VyRnVsbEJvbnVzAQUSdXNlckFkZHJTdHJPckVtcHR5AAAECCR0MDc5MTQzCQEeZ2V0RmFybWluZ1Bvd2VyQnlBY3Jlc0FuZEJvbnVzAgUJdXNlckFjcmVzBQl1c2VyQm9udXMEDXVzZXJGUGJvbnVzZWQIBQgkdDA3OTE0MwJfMQQQdXNlckZQbm90Qm9udXNlZAgFCCR0MDc5MTQzAl8yCQDMCAIFB3RvdGFsRlAJAMwIAgUNdXNlckZQYm9udXNlZAkAzAgCBRB1c2VyRlBub3RCb251c2VkCQDMCAIFCXVzZXJCb251cwUDbmlsAAppZHhUb3RhbEZQAAAAEGlkeFVzZXJGUGJvbnVzZWQAAQEMZ2V0V2xnU3RhdHMyBAt1c2VyQWRkck9wdAljb250cmFjdHMGdXNkdElkFXVzZHRCYWxhbmNlQ29ycmVjdGlvbgQMaXNzdWVkQW1vdW50CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgkAkQMCBQljb250cmFjdHMFCGRhcHAyV2xnBQ93bGdJc3N1ZWRBbXRLZXkCGFdMR09MRCBpcyBub3QgaXNzdWVkIHlldAQHcmVzdFVzZAkA8AcCCQCRAwIFCWNvbnRyYWN0cwUJZGFwcDJSZXN0BQZ1c2R0SWQEBndsZ1VzZAkAZQIJAPAHAgkAkQMCBQljb250cmFjdHMFCGRhcHAyV2xnBQZ1c2R0SWQFFXVzZHRCYWxhbmNlQ29ycmVjdGlvbgQJcHV6emxlVXNkCQDwBwIJAJEDAgUJY29udHJhY3RzBQtkYXBwMlB1enpsZQUGdXNkdElkBAlhY3JlczJVc2QJAPAHAgkAkQMCBQljb250cmFjdHMFDGRhcHAyU3Rha2luZwUGdXNkdElkBBFpbnZlc3RGbmRDb250cmFjdAkAkQMCBQljb250cmFjdHMFD2RhcHAySW52ZXN0RnVuZAQPaW52ZXN0RnVuZFRvdGFsCQBkAgkA8AcCBRFpbnZlc3RGbmRDb250cmFjdAUGdXNkdElkCQELdmFsdWVPckVsc2UCCQCaCAIFEWludmVzdEZuZENvbnRyYWN0BQ56Yklzc3VlZEFtdEtleQAABA10b3RhbEZ1bmRzVXNkCQBkAgkAZAIFCWFjcmVzMlVzZAUGd2xnVXNkBQ9pbnZlc3RGdW5kVG90YWwEBXdsZ0lkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJwIAgkAkQMCBQljb250cmFjdHMFCGRhcHAyV2xnAgt3bGdfYXNzZXRJZAITTm90IGluaXRpYWxpemVkIHlldAQDbm93CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAQJaXNzdWVUaW1lCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgkAkQMCBQljb250cmFjdHMFCGRhcHAyV2xnBQ53bGdJc3N1ZVRpbUtleQIPTm90IGluaXRpYWxpemVkBAZ3bGdXbGcJAPAHAgkAkQMCBQljb250cmFjdHMFCGRhcHAyV2xnBQV3bGdJZAQJdGVhbVRvdGFsCQBrAwUMaXNzdWVkQW1vdW50BQpURUFNX1NIQVJFBQNNNl8EDnRlYW1BbW91bnRMZWZ0CQELdmFsdWVPckVsc2UCCQCaCAIJAJEDAgUJY29udHJhY3RzBQhkYXBwMldsZwUOdGVhbUFtdExlZnRLZXkFCXRlYW1Ub3RhbAQMbGFzdFRlYW1UaW1lCQELdmFsdWVPckVsc2UCCQCaCAIJAJEDAgUJY29udHJhY3RzBQhkYXBwMldsZwUObGFzdFRlYW1UaW1LZXkFCWlzc3VlVGltZQQIdGVhbUFkZHIJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQV2YWx1ZQEJAJ0IAgkAkQMCBQljb250cmFjdHMFCGRhcHAyV2xnBQp0ZWFtQWRyS2V5BBZ0ZWFtQW1vdW50QXZhaWxhYmxlTm93CQCXAwEJAMwIAgkAawMFCXRlYW1Ub3RhbAkAZQIFA25vdwUMbGFzdFRlYW1UaW1lCQBoAgADBQtZRUFSX01JTExJUwkAzAgCBQ50ZWFtQW1vdW50TGVmdAUDbmlsBAp0ZWFtV2xnb2xkCQDwBwIFCHRlYW1BZGRyBQV3bGdJZAQIYWN0VG90YWwJAGsDBQxpc3N1ZWRBbW91bnQFDkFDVElWSVRZX1NIQVJFBQNNNl8EDWFjdEFtb3VudExlZnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgkAkQMCBQljb250cmFjdHMFCGRhcHAyV2xnBQ1hY3RBbXRMZWZ0S2V5BQhhY3RUb3RhbAQSbGFzdEFjdGl2aXRpZXNUaW1lCQELdmFsdWVPckVsc2UCCQCaCAIJAJEDAgUJY29udHJhY3RzBQhkYXBwMldsZwUUbGFzdEFjdGl2aXRpZXNUaW1LZXkFCWlzc3VlVGltZQQVYWN0QW1vdW50QXZhaWxhYmxlTm93CQCXAwEJAMwIAgkAawMFCGFjdFRvdGFsCQBlAgUDbm93BRJsYXN0QWN0aXZpdGllc1RpbWUJAGgCAAMFC1lFQVJfTUlMTElTCQDMCAIFDWFjdEFtb3VudExlZnQFA25pbAQJYWN0V2xnb2xkCQDwBwIJAJEDAgUJY29udHJhY3RzBQlkYXBwMlJlc3QFBXdsZ0lkBAxsYXN0VXNlclRpbWUJAQt2YWx1ZU9yRWxzZQIJAJoIAgkAkQMCBQljb250cmFjdHMFCGRhcHAyV2xnCQEWa2V5TGFzdENsYWltVGltZUJ5VXNlcgEFC3VzZXJBZGRyT3B0BQlpc3N1ZVRpbWUEDmxhc3RVc2VyUGVyaW9kCQBpAgkAZQIFDGxhc3RVc2VyVGltZQUJaXNzdWVUaW1lBQtZRUFSX01JTExJUwQKbm93TGltaXRlZAkAlwMBCQDMCAIFA25vdwkAzAgCCQBkAgUJaXNzdWVUaW1lCQBoAgADBQtZRUFSX01JTExJUwUDbmlsBAljdXJQZXJpb2QJAJcDAQkAzAgCCQBpAgkAZQIFA25vdwUJaXNzdWVUaW1lBQtZRUFSX01JTExJUwkAzAgCAAIFA25pbAQDZWZmCQEQZ2V0RmFybWluZ1Bvd2VycwIFC3VzZXJBZGRyT3B0CQCRAwIFCWNvbnRyYWN0cwUMZGFwcDJTdGFraW5nBBVjdXJQZXJpb2REaXN0cmlidXRpb24JAQ1kaXN0ckJ5UGVyaW9kAgUMaXNzdWVkQW1vdW50BQljdXJQZXJpb2QEDXByZXZQZXJpb2RFbmQJAGQCBQlpc3N1ZVRpbWUJAGgCBQtZRUFSX01JTExJUwUJY3VyUGVyaW9kBBFwcmV2UHJldlBlcmlvZEVuZAkAZAIFCWlzc3VlVGltZQkAaAIFC1lFQVJfTUlMTElTCQBlAgUJY3VyUGVyaW9kAAEEAmEwCQBrAwUVY3VyUGVyaW9kRGlzdHJpYnV0aW9uCQBlAgUKbm93TGltaXRlZAUMbGFzdFVzZXJUaW1lBQtZRUFSX01JTExJUwQNdXNlckF2YWlsYWJsZQMJAAACBQ5sYXN0VXNlclBlcmlvZAUJY3VyUGVyaW9kBQJhMAMJAAACBQ5sYXN0VXNlclBlcmlvZAkAZQIFCWN1clBlcmlvZAABBAJhMQkAawMJAQ1kaXN0ckJ5UGVyaW9kAgUMaXNzdWVkQW1vdW50CQBlAgUJY3VyUGVyaW9kAAEJAGUCBQ1wcmV2UGVyaW9kRW5kBQxsYXN0VXNlclRpbWUFC1lFQVJfTUlMTElTCQBkAgUCYTEFAmEwBAJhMgkAawMJAQ1kaXN0ckJ5UGVyaW9kAgUMaXNzdWVkQW1vdW50CQBlAgUJY3VyUGVyaW9kAAIJAGUCBRFwcmV2UHJldlBlcmlvZEVuZAUMbGFzdFVzZXJUaW1lBQtZRUFSX01JTExJUwQCYTEJAQ1kaXN0ckJ5UGVyaW9kAgUMaXNzdWVkQW1vdW50CQBlAgUJY3VyUGVyaW9kAAEJAGQCCQBkAgUCYTIFAmExBQJhMAQPYW1vdW50TGVmdFRvdGFsCQELdmFsdWVPckVsc2UCCQCaCAIJAJEDAgUJY29udHJhY3RzBQhkYXBwMldsZwURc3Rha2Vyc0FtdExlZnRLZXkAAAQKdXNlckFtb3VudAMJAQIhPQIJAJEDAgUDZWZmBQppZHhUb3RhbEZQAAAJAGsDBQ11c2VyQXZhaWxhYmxlCQCRAwIFA2VmZgUQaWR4VXNlckZQYm9udXNlZAkAkQMCBQNlZmYFCmlkeFRvdGFsRlAAAAQPbGFzdElzc3VlMTBUaW1lCQELdmFsdWVPckVsc2UCCQCaCAIJAJEDAgUJY29udHJhY3RzBQhkYXBwMldsZwURd2xnSXNzdWUxMFRpbWVLZXkFEU5FV19TVEFLSU5HX1NUQVJUBA1pc3N1ZTEwQW1vdW50CQBrAwUHSVNTVUUxMAkAlgMBCQDMCAIJAGUCBQNub3cFD2xhc3RJc3N1ZTEwVGltZQkAzAgCAAAFA25pbAUGREFZX01TBBZtYXJrZXRpbmdJc3N1ZTEwQW1vdW50CQBrAwUNaXNzdWUxMEFtb3VudAURTUFSS0VUSU5HMTBfU0hBUkUFA002XwQRdGVhbUlzc3VlMTBBbW91bnQJAGsDBQ1pc3N1ZTEwQW1vdW50BQxURUFNMTBfU0hBUkUFA002XwQOdXNlcjEwSW50ZXJ2YWwJAJYDAQkAzAgCCQBlAgUDbm93CQCWAwEJAMwIAgURTkVXX1NUQUtJTkdfU1RBUlQJAMwIAgUMbGFzdFVzZXJUaW1lBQNuaWwJAMwIAgAABQNuaWwECnVzZXIxMHBhcnQDCQECIT0CCQCRAwIFA2VmZgUKaWR4VG90YWxGUAAACQBrAwkAawMJAGsDBQdJU1NVRTEwBQ51c2VyMTBJbnRlcnZhbAUGREFZX01TCQCRAwIFA2VmZgUQaWR4VXNlckZQYm9udXNlZAkAkQMCBQNlZmYFCmlkeFRvdGFsRlAFD1BMQVlFUlMxMF9TSEFSRQUDTTZfAAAEDm5ld0lzc3VlMTBUaW1lCQCWAwEJAMwIAgURTkVXX1NUQUtJTkdfU1RBUlQJAMwIAgUDbm93BQNuaWwEEGFjcmVzU3Rha2VkVG90YWwJAQt2YWx1ZU9yRWxzZQIJAJoIAgkAkQMCBQljb250cmFjdHMFDGRhcHAyU3Rha2luZwUSYWNyZXNTdGFrZFRvdGFsS2V5AAAEDm5mdFRvdGFsSXNzdWVkCQELdmFsdWVPckVsc2UCCQCaCAIJAJEDAgUJY29udHJhY3RzBQxkYXBwMlN0YWtpbmcFEWtleU5mdFRvdGFsSXNzdWVkAAAEDm5mdFRvdGFsQnVybmVkCQELdmFsdWVPckVsc2UCCQCaCAIJAJEDAgUJY29udHJhY3RzBQxkYXBwMlN0YWtpbmcFEWtleU5mdFRvdGFsQnVybmVkAAAEEHdsTmZ0VG90YWxTdGFrZWQJAQt2YWx1ZU9yRWxzZQIJAJoIAgkAkQMCBQljb250cmFjdHMFDGRhcHAyU3Rha2luZwUTa2V5V2xOZnRUb3RhbFN0YWtlZAAABA93bE5mdFVzZXJTdGFrZWQJAQt2YWx1ZU9yRWxzZQIJAJoIAgkAkQMCBQljb250cmFjdHMFDGRhcHAyU3Rha2luZwkBEmtleVVzZXJXbE5mdE51bWJlcgEJAQt2YWx1ZU9yRWxzZQIFC3VzZXJBZGRyT3B0AgAAAAkAzAgCBQxpc3N1ZWRBbW91bnQJAMwIAgUGd2xnV2xnCQDMCAIJAGsDBQ10b3RhbEZ1bmRzVXNkBQNNOF8FDGlzc3VlZEFtb3VudAkAzAgCBQ10b3RhbEZ1bmRzVXNkCQDMCAIFB3Jlc3RVc2QJAMwIAgUJYWNyZXMyVXNkCQDMCAIFBndsZ1VzZAkAzAgCBQlwdXp6bGVVc2QJAMwIAgUJaXNzdWVUaW1lCQDMCAIFDGxhc3RUZWFtVGltZQkAzAgCBQl0ZWFtVG90YWwJAMwIAgUOdGVhbUFtb3VudExlZnQJAMwIAgUWdGVhbUFtb3VudEF2YWlsYWJsZU5vdwkAzAgCBQp0ZWFtV2xnb2xkCQDMCAIFCGFjdFRvdGFsCQDMCAIFDWFjdEFtb3VudExlZnQJAMwIAgUVYWN0QW1vdW50QXZhaWxhYmxlTm93CQDMCAIFCWFjdFdsZ29sZAkAzAgCBQljdXJQZXJpb2QJAMwIAgUPYW1vdW50TGVmdFRvdGFsCQDMCAIFFWN1clBlcmlvZERpc3RyaWJ1dGlvbgkAzAgCBQxsYXN0VXNlclRpbWUJAMwIAgUPaW52ZXN0RnVuZFRvdGFsCQDMCAIFCnVzZXJBbW91bnQJAMwIAgUKbm93TGltaXRlZAkAzAgCBQ1pc3N1ZTEwQW1vdW50CQDMCAIFFm1hcmtldGluZ0lzc3VlMTBBbW91bnQJAMwIAgURdGVhbUlzc3VlMTBBbW91bnQJAMwIAgUKdXNlcjEwcGFydAkAzAgCBQ5uZXdJc3N1ZTEwVGltZQkAzAgCCQCRAwIFA2VmZgUKaWR4VG90YWxGUAkAzAgCBRBhY3Jlc1N0YWtlZFRvdGFsCQDMCAIFDm5mdFRvdGFsSXNzdWVkCQDMCAIFDm5mdFRvdGFsQnVybmVkCQDMCAIFEHdsTmZ0VG90YWxTdGFrZWQJAMwIAgUPd2xOZnRVc2VyU3Rha2VkBQNuaWwADXByb2ZpdEFkZHJLZXkCCnByb2ZpdEFkZHIAGXN0YWtlcnNBbW91bnRQYWlkVG90YWxLZXkCFnN0YWtlcnNBbW91bnRQYWlkVG90YWwBGGtleVN0YWtlcnNBbW91bnRQYWlkVXNlcgEEYWRkcgkArAICAhZzdGFrZXJzQW1vdW50UGFpZFVzZXJfBQRhZGRyAQdwcm9sb2cyAAkBBWFzSW50AQkA/QcEBQ5hY3JlczJDb250cmFjdAIKc2F2ZUxhc3RUeAUDbmlsBQNuaWwBEmdldFN3YXBMaW1pdFdsZ29sZAEEYWRkcgQIbGFzdFRpbWUJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBGWtleUxhc3RXbGdUcmFkZVRpbWVCeVVzZXIBBQRhZGRyAAAEDGRlZmF1bHRMaW1pdAkBC3ZhbHVlT3JFbHNlAgkAmggCBQ5hY3JlczJDb250cmFjdAkBGmtleUFjcmVzU3Rha2VkQW1vdW50QnlVc2VyAQUEYWRkcgAABA1sYXN0TGltaXRMZWZ0CQELdmFsdWVPckVsc2UCCQCfCAEJARprZXlMYXN0V2xnVHJhZGVMaW1pdEJ5VXNlcgEFBGFkZHIFDGRlZmF1bHRMaW1pdAQMY3VycmVudExpbWl0CQBkAgUNbGFzdExpbWl0TGVmdAkAawMFDGRlZmF1bHRMaW1pdAkAZQIIBQlsYXN0QmxvY2sJdGltZXN0YW1wBQhsYXN0VGltZQUKREFZX01JTExJUwkAlwMBCQDMCAIFDGN1cnJlbnRMaW1pdAkAzAgCBQxkZWZhdWx0TGltaXQFA25pbAAQaWR4V2xnVGVhbUFtTGVmdAAKABRpZHhXbGdUZWFtQW1BdmFpbE5vdwALAA9pZHhXbGdBY3RBbUxlZnQADgATaWR4V2xnQWN0QW1BdmFpbE5vdwAPABFpZHhXbGdBbUxlZnRUb3RhbAASABRpZHhXbGdVc2VyQW1BdmFpbE5vdwAVABRpZHhXbGdVc2VyVG90YWxBdmFpbAAYABFpZHhXbGdFZmZVc2VyVGltZQAZAQ1jbGFpbUludGVybmFsAQRhZGRyBAZjYWxsZXIJARFAZXh0ck5hdGl2ZSgxMDYyKQEFBGFkZHIED2Vjb25vbXlDb250cmFjdAkBEUBleHRyTmF0aXZlKDEwNjIpAQUSZWNvbm9teUNvbnRyYWN0U3RyBAhjdXJTdGF0cwkBC2dldFdsZ1N0YXRzBQUEYWRkcgkAzAgCBQxyZXN0Q29udHJhY3QJAMwIAgUPc3Rha2luZ0NvbnRyYWN0CQDMCAIFD2Vjb25vbXlDb250cmFjdAkAzAgCBQt3bGdDb250cmFjdAkAzAgCBRJwdXp6bGVQb29sQ29udHJhY3QJAMwIAgUSaW52ZXN0RnVuZENvbnRyYWN0CQDMCAIFDWFjcmVzQ29udHJhY3QFA25pbAULdXNkdEFzc2V0SWQAAAUFTVVMVDYEA25vdwgFCWxhc3RCbG9jawl0aW1lc3RhbXAEDnRlYW1BbW91bnRMZWZ0CQCRAwIFCGN1clN0YXRzBRBpZHhXbGdUZWFtQW1MZWZ0BAp0ZWFtQW1vdW50CQCRAwIFCGN1clN0YXRzBRRpZHhXbGdUZWFtQW1BdmFpbE5vdwQNYWN0QW1vdW50TGVmdAkAkQMCBQhjdXJTdGF0cwUPaWR4V2xnQWN0QW1MZWZ0BAlhY3RBbW91bnQJAJEDAgUIY3VyU3RhdHMFE2lkeFdsZ0FjdEFtQXZhaWxOb3cECnVzZXJBbW91bnQJAJEDAgUIY3VyU3RhdHMFFGlkeFdsZ1VzZXJBbUF2YWlsTm93BAd1c2VyS2V5CQEYa2V5U3Rha2Vyc0Ftb3VudFBhaWRVc2VyAQUEYWRkcgQJdXNlclRvdGFsCQCRAwIFCGN1clN0YXRzBRRpZHhXbGdVc2VyVG90YWxBdmFpbAQLdXNlckVmZlRpbWUJAJEDAgUIY3VyU3RhdHMFEWlkeFdsZ0VmZlVzZXJUaW1lCQCUCgIJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQkBBXZhbHVlAQkAoggBBQt0ZWFtQWRkcktleQUKdGVhbUFtb3VudAUKd2xnQXNzZXRJZAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQxyZXN0Q29udHJhY3QFCWFjdEFtb3VudAUKd2xnQXNzZXRJZAkAzAgCCQEMSW50ZWdlckVudHJ5AgUHdXNlcktleQkAZAIJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUHdXNlcktleQAABQp1c2VyQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRlzdGFrZXJzQW1vdW50UGFpZFRvdGFsS2V5CQBkAgkBC3ZhbHVlT3JFbHNlAgkAnwgBBRlzdGFrZXJzQW1vdW50UGFpZFRvdGFsS2V5AAAFCXVzZXJUb3RhbAkAzAgCCQEMSW50ZWdlckVudHJ5AgUUc3Rha2Vyc0Ftb3VudExlZnRLZXkJAGUCCQCRAwIFCGN1clN0YXRzBRFpZHhXbGdBbUxlZnRUb3RhbAUJdXNlclRvdGFsCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRF0ZWFtQW1vdW50TGVmdEtleQkAZQIFDnRlYW1BbW91bnRMZWZ0BQp0ZWFtQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ9sYXN0VGVhbVRpbWVLZXkFA25vdwkAzAgCCQEMSW50ZWdlckVudHJ5AgUQYWN0QW1vdW50TGVmdEtleQkAZQIFDWFjdEFtb3VudExlZnQFCWFjdEFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgUVbGFzdEFjdGl2aXRpZXNUaW1lS2V5BQNub3cJAMwIAgkBDEludGVnZXJFbnRyeQIJARhrZXlMYXN0Q2xhaW1lZFRpbWVCeVVzZXIBBQRhZGRyBQt1c2VyRWZmVGltZQUDbmlsBQp1c2VyQW1vdW50AQ5jbGFpbUludGVybmFsMgEEYWRkcgQIY3VyU3RhdHMJAQxnZXRXbGdTdGF0czIEBQRhZGRyCQDMCAIFDXJlc3QyQ29udHJhY3QJAMwIAgUOYWNyZXMyQ29udHJhY3QJAMwIAgULd2xnQ29udHJhY3QJAMwIAgUScHV6emxlUG9vbENvbnRyYWN0CQDMCAIFEmludmVzdEZ1bmRDb250cmFjdAUDbmlsBQt1c2R0QXNzZXRJZAAABAt1c2VyVGltZUtleQkBFmtleUxhc3RDbGFpbVRpbWVCeVVzZXIBBQRhZGRyBAxsYXN0VXNlclRpbWUJAQt2YWx1ZU9yRWxzZQIJAJ8IAQULdXNlclRpbWVLZXkAAAQLdXNlckVmZlRpbWUJAJEDAgUIY3VyU3RhdHMFEGl4V2xnRWZmVXNlclRpbWUDCQAAAgUMbGFzdFVzZXJUaW1lBQt1c2VyRWZmVGltZQkAlAoCBQNuaWwAAAQDbm93CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAQJaXNzdWVUaW1lCQCRAwIFCGN1clN0YXRzBQ5peFdsZ0lzc3VlVGltZQQOdGVhbUFtb3VudExlZnQJAJEDAgUIY3VyU3RhdHMFD2l4V2xnVGVhbUFtTGVmdAQKdGVhbUFtb3VudAkAZAIJAJEDAgUIY3VyU3RhdHMFE2l4V2xnVGVhbUFtQXZhaWxOb3cJAJEDAgUIY3VyU3RhdHMFFml4V2xnVGVhbUlzc3VlMTBBbW91bnQEDHRlYW1UcmFuc2ZlcgMJAGYCBQp0ZWFtQW1vdW50AAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQkBBXZhbHVlAQkAoggBBQt0ZWFtQWRkcktleQUKdGVhbUFtb3VudAUKd2xnQXNzZXRJZAUDbmlsBQNuaWwEDWFjdEFtb3VudExlZnQJAJEDAgUIY3VyU3RhdHMFDml4V2xnQWN0QW1MZWZ0BAlhY3RBbW91bnQJAJEDAgUIY3VyU3RhdHMFEml4V2xnQWN0QW1BdmFpbE5vdwQLYWN0VHJhbnNmZXIDCQBmAgUJYWN0QW1vdW50AAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUMcmVzdENvbnRyYWN0BQlhY3RBbW91bnQFCndsZ0Fzc2V0SWQFA25pbAUDbmlsBA9tYXJrZXRpbmdBbW91bnQJAJEDAgUIY3VyU3RhdHMFG2l4V2xnTWFya2V0aW5nSXNzdWUxMEFtb3VudAQRbWFya2V0aW5nVHJhbnNmZXIDCQBmAgUPbWFya2V0aW5nQW1vdW50AAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQkBBXZhbHVlAQkAoggBBRBtYXJrZXRpbmdBZGRyS2V5BQ9tYXJrZXRpbmdBbW91bnQFCndsZ0Fzc2V0SWQFA25pbAUDbmlsBAp1c2VyQW1vdW50CQCRAwIFCGN1clN0YXRzBRNpeFdsZ1VzZXJBbUF2YWlsTm93BAd1c2VyS2V5CQEYa2V5U3Rha2Vyc0Ftb3VudFBhaWRVc2VyAQUEYWRkcgQJdXNlclRvdGFsCQBkAgUKdXNlckFtb3VudAkAkQMCBQhjdXJTdGF0cwUPaXhXbGdVc2VyMTBwYXJ0BA5pc3N1ZWQxMEFtb3VudAkAkQMCBQhjdXJTdGF0cwUSaXhXbGdJc3N1ZTEwQW1vdW50CQCUCgIJAM4IAgkAzggCCQDOCAIJAMwIAgkBB1JlaXNzdWUDBQp3bGdBc3NldElkBQ5pc3N1ZWQxMEFtb3VudAYJAMwIAgkBDEludGVnZXJFbnRyeQIFEndsZ0lzc3VlZEFtb3VudEtleQkAZAIJAJEDAgUIY3VyU3RhdHMFC2l4V2xnQW1vdW50BQ5pc3N1ZWQxMEFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgURd2xnSXNzdWUxMFRpbWVLZXkJAJEDAgUIY3VyU3RhdHMFEGl4V2xnSXNzdWUxMFRpbWUJAMwIAgkBDEludGVnZXJFbnRyeQIFB3VzZXJLZXkJAGQCCQELdmFsdWVPckVsc2UCCQCfCAEFB3VzZXJLZXkAAAUKdXNlckFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgUZc3Rha2Vyc0Ftb3VudFBhaWRUb3RhbEtleQkAZAIJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUZc3Rha2Vyc0Ftb3VudFBhaWRUb3RhbEtleQAABQp1c2VyQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRRzdGFrZXJzQW1vdW50TGVmdEtleQkAZQIJAJEDAgUIY3VyU3RhdHMFEGl4V2xnQW1MZWZ0VG90YWwFCnVzZXJBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIFEXRlYW1BbW91bnRMZWZ0S2V5CQBkAgkAZQIFDnRlYW1BbW91bnRMZWZ0BQp0ZWFtQW1vdW50CQCRAwIFCGN1clN0YXRzBRZpeFdsZ1RlYW1Jc3N1ZTEwQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ9sYXN0VGVhbVRpbWVLZXkFA25vdwkAzAgCCQEMSW50ZWdlckVudHJ5AgUQYWN0QW1vdW50TGVmdEtleQkAZQIFDWFjdEFtb3VudExlZnQFCWFjdEFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgUVbGFzdEFjdGl2aXRpZXNUaW1lS2V5BQNub3cJAMwIAgkBDEludGVnZXJFbnRyeQIFC3VzZXJUaW1lS2V5BQt1c2VyRWZmVGltZQUDbmlsBQx0ZWFtVHJhbnNmZXIFC2FjdFRyYW5zZmVyBRFtYXJrZXRpbmdUcmFuc2ZlcgUJdXNlclRvdGFsAQ50YWtlWHBJbnRlcm5hbAIEYWRkcgVkZWx0YQQDbm93CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAQHdGltZUtleQkBFmtleVdsZ1N0YWtlZFRpbWVCeVVzZXIBBQRhZGRyBAlhbW91bnRLZXkJARhrZXlXbGdTdGFrZWRBbW91bnRCeVVzZXIBBQRhZGRyBAhsYXN0VGltZQkBC3ZhbHVlT3JFbHNlAgkAnwgBBQd0aW1lS2V5AAAEB29sZFVzZXIJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUJYW1vdW50S2V5AAAECG9sZFRvdGFsCQELdmFsdWVPckVsc2UCCQCfCAEFEXdsZ1N0YWtlZFRvdGFsS2V5AAAEAnhwCQBrAwkAawMFBXhwV2xnBQdvbGRVc2VyBQ93bGdCYXNlQW1vdW50WHAJAGUCBQhsYXN0VGltZQUDbm93BQlEQVlNSUxMSVMJAJUKAwkAzAgCCQEMSW50ZWdlckVudHJ5AgUHdGltZUtleQUDbm93CQDMCAIJAQxJbnRlZ2VyRW50cnkCBQlhbW91bnRLZXkJAGQCBQdvbGRVc2VyBQVkZWx0YQkAzAgCCQEMSW50ZWdlckVudHJ5AgURd2xnU3Rha2VkVG90YWxLZXkJAGQCBQhvbGRUb3RhbAUFZGVsdGEFA25pbAUCeHAFB29sZFVzZXIBEW9wZW5DaGVzdEludGVybmFsAQRhZGRyBAR3ZWVrCQBpAgUGaGVpZ2h0BQtXRUVLX0JMT0NLUwQIZHJhd1dlZWsJAGUCBQR3ZWVrAAEECW51bVByaXplcwkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEOa2V5TnVtTkZUMkRyYXcBBQhkcmF3V2VlawUVREVGQVVMVF9XRUVLTFlfUFJJWkVTBAtwcml6ZXNEcmF3bgkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEOa2V5TnVtTkZURHJhd24BBQhkcmF3V2VlawAABAt1c2VyVGlja2V0cwkBC3ZhbHVlT3JFbHNlAgkAnwgBCQESa2V5VXNlcldlZWtUaWNrZXRzAgUEYWRkcgUIZHJhd1dlZWsAAAMJAGcCAAAFC3VzZXJUaWNrZXRzCQCUCgIFA25pbAUEdW5pdAQLd2Vla1RpY2tldHMJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBE2tleVRvdGFsV2Vla1RpY2tldHMBBQhkcmF3V2VlawAAAwkAZwIAAAULd2Vla1RpY2tldHMJAJQKAgkAzAgCCQELRGVsZXRlRW50cnkBCQESa2V5VXNlcldlZWtUaWNrZXRzAgUEYWRkcgUIZHJhd1dlZWsFA25pbAUEdW5pdAQHZW50cm9weQkBBXZhbHVlAQgJAQV2YWx1ZQEJAO0HAQkAaAIFBHdlZWsFC1dFRUtfQkxPQ0tTA3ZyZgQEc2FsdAkA2QQBCQCRAwIJALUJAgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQ5hY3JlczJDb250cmFjdAkBFWtleUxhc3RXZWVrVHhJZEJ5VXNlcgEFBGFkZHICCjQyX0RFRkFVTFQCAV8AAQQGcmFuZG9tCQEPZ2V0UmFuZG9tTnVtYmVyAwULd2Vla1RpY2tldHMFBHNhbHQFB2VudHJvcHkDCQBmAgkAaAIFC3VzZXJUaWNrZXRzBQludW1Qcml6ZXMFBnJhbmRvbQQLaXNzdWVSZXN1bHQJAPwHBAUOYWNyZXMyQ29udHJhY3QCC2lzc3VlUGlja0MxCQDMCAIFBGFkZHIFA25pbAUDbmlsBAd3aW5uZXJzCQCiCAEJAQ5rZXlXZWVrV2lubmVycwEFCGRyYXdXZWVrBApuZXdXaW5uZXJzAwkBCWlzRGVmaW5lZAEFB3dpbm5lcnMJAKwCAgkArAICCQEFdmFsdWUBBQd3aW5uZXJzAgFfBQRhZGRyBQRhZGRyCQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ5rZXlOdW1ORlREcmF3bgEFCGRyYXdXZWVrCQBkAgULcHJpemVzRHJhd24AAQkAzAgCCQELRGVsZXRlRW50cnkBCQESa2V5VXNlcldlZWtUaWNrZXRzAgUEYWRkcgUIZHJhd1dlZWsJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDmtleVdlZWtXaW5uZXJzAQUIZHJhd1dlZWsFCm5ld1dpbm5lcnMFA25pbAULaXNzdWVSZXN1bHQEB3JhbmRvbTEJAGQCCQEPZ2V0UmFuZG9tTnVtYmVyAwAJCQDLAQIBAUIFBHNhbHQFB2VudHJvcHkAAQQLY29uc1RpY2tldHMJAGsDBQt1c2VyVGlja2V0cwUHcmFuZG9tMQAKBAp0aWNrZXRzS2V5CQESa2V5VXNlcldlZWtUaWNrZXRzAgUEYWRkcgUEd2VlawQKb2xkVGlja2V0cwkBC3ZhbHVlT3JFbHNlAgkAnwgBBQp0aWNrZXRzS2V5AAAJAJQKAgkAzQgCAwkAAAIFC2NvbnNUaWNrZXRzAAAFA25pbAQNY29tbW9uQWN0aW9ucwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBE2tleVRvdGFsV2Vla1RpY2tldHMBBQR3ZWVrCQBkAgkBC3ZhbHVlT3JFbHNlAgkAnwgBCQETa2V5VG90YWxXZWVrVGlja2V0cwEFBHdlZWsAAAULY29uc1RpY2tldHMJAMwIAgkBDEludGVnZXJFbnRyeQIFCnRpY2tldHNLZXkJAGQCBQpvbGRUaWNrZXRzBQtjb25zVGlja2V0cwUDbmlsAwkAZgIFCm9sZFRpY2tldHMAAAUNY29tbW9uQWN0aW9ucwkAzQgCBQ1jb21tb25BY3Rpb25zCQEMSW50ZWdlckVudHJ5AgkBGGtleVRvdGFsV2Vla1BhcnRpY2lwYW50cwEFBHdlZWsJAGQCCQELdmFsdWVPckVsc2UCCQCfCAEJARhrZXlUb3RhbFdlZWtQYXJ0aWNpcGFudHMBBQR3ZWVrAAAAAQkBC0RlbGV0ZUVudHJ5AQkBEmtleVVzZXJXZWVrVGlja2V0cwIFBGFkZHIFCGRyYXdXZWVrBQtjb25zVGlja2V0cwEUY2xhaW1UaWNrZXRzSW50ZXJuYWwCBGFkZHIKdXNlckJldFN0cgQEd2VlawkAaQIFBmhlaWdodAULV0VFS19CTE9DS1MECnRpY2tldHNLZXkJARJrZXlVc2VyV2Vla1RpY2tldHMCBQRhZGRyBQR3ZWVrBAZkYXlCZXQJALUJAgUKdXNlckJldFN0cgIBXwQPb2xkVG90YWxUaWNrZXRzCQELdmFsdWVPckVsc2UCCQCfCAEJARNrZXlUb3RhbFdlZWtUaWNrZXRzAQUEd2VlawAABApvbGRUaWNrZXRzCQELdmFsdWVPckVsc2UCCQCfCAEFCnRpY2tldHNLZXkAAAQMZGVsdGFUaWNrZXRzAwkAAAIJAQp3aW5uaW5nQmV0AQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBmRheUJldAAACQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUGZGF5QmV0AAEAAQAABA9vbGRQYXJ0aWNpcGFudHMJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBGGtleVRvdGFsV2Vla1BhcnRpY2lwYW50cwEFBHdlZWsAAAQSdXBkYXRlUGFydGljaXBhbnRzAwMJAAACBQpvbGRUaWNrZXRzAAAJAAACBQxkZWx0YVRpY2tldHMAAQcJAMwIAgkBDEludGVnZXJFbnRyeQIJARhrZXlUb3RhbFdlZWtQYXJ0aWNpcGFudHMBBQR3ZWVrCQBkAgUPb2xkUGFydGljaXBhbnRzAAEFA25pbAUDbmlsCQCUCgIDCQAAAgUMZGVsdGFUaWNrZXRzAAAFA25pbAkAzQgCCQDNCAIFEnVwZGF0ZVBhcnRpY2lwYW50cwkBDEludGVnZXJFbnRyeQIFCnRpY2tldHNLZXkJAGQCBQpvbGRUaWNrZXRzBQxkZWx0YVRpY2tldHMJAQxJbnRlZ2VyRW50cnkCCQETa2V5VG90YWxXZWVrVGlja2V0cwEFBHdlZWsJAGQCBQ9vbGRUb3RhbFRpY2tldHMFDGRlbHRhVGlja2V0cwUMZGVsdGFUaWNrZXRzDwFpAQ1jb25zdHJ1Y3RvclYxBAhyZXN0QWRkcg1tYXJrZXRpbmdBZGRyCHRlYW1BZGRyCnByb2ZpdEFkZHIDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAhFQZXJtaXNzaW9uIGRlbmllZAMJAQlpc0RlZmluZWQBCQChCAEFDXdsZ0Fzc2V0SWRLZXkJAAIBAhNBbHJlYWR5IGluaXRpYWxpemVkBAxpc3N1ZWRBbW91bnQFCE1JTExJT042BAVpc3N1ZQkAwwgHAgZXTEdPTEQCIFdhdmVzTGFuZHMgR29sZCBpbnZlc3RtZW50IHRva2VuBQxpc3N1ZWRBbW91bnQACAYFBHVuaXQAAAQHYXNzZXRJZAkAuAgBBQVpc3N1ZQkAzAgCBQVpc3N1ZQkAzAgCCQEMSW50ZWdlckVudHJ5AgUPd2xnSXNzdWVUaW1lS2V5CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAkAzAgCCQEMSW50ZWdlckVudHJ5AgUSd2xnSXNzdWVkQW1vdW50S2V5BQxpc3N1ZWRBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIFGXN0YWtlcnNBbW91bnRQYWlkVG90YWxLZXkAAAkAzAgCCQEMSW50ZWdlckVudHJ5AgUUc3Rha2Vyc0Ftb3VudExlZnRLZXkJAGsDBQhNSUxMSU9ONgULUExBWUVSU0hBUkUFBU1VTFQ2CQDMCAIJAQtCaW5hcnlFbnRyeQIFDXdsZ0Fzc2V0SWRLZXkFB2Fzc2V0SWQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDmtleVJlc3RBZGRyZXNzAAUIcmVzdEFkZHIJAMwIAgkBC1N0cmluZ0VudHJ5AgUQbWFya2V0aW5nQWRkcktleQUNbWFya2V0aW5nQWRkcgkAzAgCCQELU3RyaW5nRW50cnkCBQt0ZWFtQWRkcktleQUIdGVhbUFkZHIJAMwIAgkBC1N0cmluZ0VudHJ5AgUNcHJvZml0QWRkcktleQUKcHJvZml0QWRkcgUDbmlsAWkBDWNvbnN0cnVjdG9yVjIBCXJlc3QyQWRkcgMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECEVBlcm1pc3Npb24gZGVuaWVkCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ9rZXlSZXN0MkFkZHJlc3MABQlyZXN0MkFkZHIFA25pbAFpAQZidXlXbGcBDG1pblRvUmVjZWl2ZQQMcHJvbG9nUmVzdWx0CQEHcHJvbG9nMgADCQAAAgUMcHJvbG9nUmVzdWx0BQxwcm9sb2dSZXN1bHQDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEJAAIBAiJleGFjdGx5IDEgcGF5bWVudCBtdXN0IGJlIGF0dGFjaGVkBANwbXQJAJEDAggFAWkIcGF5bWVudHMAAAQHdXNkdEFtdAgFA3BtdAZhbW91bnQDAwkBASEBCQEJaXNEZWZpbmVkAQgFA3BtdAdhc3NldElkBgkBAiE9AgkBBXZhbHVlAQgFA3BtdAdhc3NldElkBQt1c2R0QXNzZXRJZAkAAgECE1VTRFQgcGF5bWVudHMgb25seSEEBmNhbGxlcggFAWkGY2FsbGVyBARhZGRyCQClCAEFBmNhbGxlcgMJAGYCBQ5NSU5TSE9QUEFZTUVOVAUHdXNkdEFtdAkAAgEJAKwCAgkArAICAhJZb3UgY2FuIHRyYWRlIG1pbiAJAQpmaXhlZFBvaW50AgUOTUlOU0hPUFBBWU1FTlQABgIFIFVTRFQECGN1clN0YXRzCQEMZ2V0V2xnU3RhdHMyBAIACQDMCAIFDXJlc3QyQ29udHJhY3QJAMwIAgUOYWNyZXMyQ29udHJhY3QJAMwIAgULd2xnQ29udHJhY3QJAMwIAgUScHV6emxlUG9vbENvbnRyYWN0CQDMCAIFEmludmVzdEZ1bmRDb250cmFjdAUDbmlsBQt1c2R0QXNzZXRJZAUHdXNkdEFtdAQMY3VyV2xnQW1vdW50CQCRAwIFCGN1clN0YXRzBQtpeFdsZ0Ftb3VudAQId2xnUHJpY2UJAJEDAgUIY3VyU3RhdHMFCml4V2xnUHJpY2UECGJ1eVByaWNlCQBuBAUId2xnUHJpY2UABgAFBQdDRUlMSU5HBAl3bGdBbW91bnQJAGsDBQd1c2R0QW10BQVNVUxUOAUIYnV5UHJpY2UEBm1heFdsZwkBEmdldFN3YXBMaW1pdFdsZ29sZAEFBGFkZHIDCQBmAgUJd2xnQW1vdW50BQZtYXhXbGcJAAIBCQCsAgIJAKwCAgIQWW91IGNhbiBnZXQgbWF4IAkBCmZpeGVkUG9pbnQCBQZtYXhXbGcACAIVIFdMR09MRCBhdCB0aGUgbW9tZW50AwkAZgIFDG1pblRvUmVjZWl2ZQUJd2xnQW1vdW50CQACAQIwUHJpY2UgY2hhbmdlZCBkdXJpbmcgb3BlcmF0aW9uLCBwbGVhc2UgdHJ5IGFnYWluBAxwcm9maXRBbW91bnQJAGkCBQd1c2R0QW10AAYJAJQKAgkAzAgCCQEHUmVpc3N1ZQMFCndsZ0Fzc2V0SWQFCXdsZ0Ftb3VudAYJAMwIAgkBDEludGVnZXJFbnRyeQIFEndsZ0lzc3VlZEFtb3VudEtleQkAZAIFDGN1cldsZ0Ftb3VudAUJd2xnQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEZa2V5TGFzdFdsZ1RyYWRlVGltZUJ5VXNlcgEFBGFkZHIIBQlsYXN0QmxvY2sJdGltZXN0YW1wCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEaa2V5TGFzdFdsZ1RyYWRlTGltaXRCeVVzZXIBBQRhZGRyCQBlAgUGbWF4V2xnBQl3bGdBbW91bnQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQkBBXZhbHVlAQkAoggBBQ1wcm9maXRBZGRyS2V5BQxwcm9maXRBbW91bnQFC3VzZHRBc3NldElkCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFBmNhbGxlcgUJd2xnQW1vdW50BQp3bGdBc3NldElkBQNuaWwFDHByb2xvZ1Jlc3VsdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQ5idXlXbGdSRUFET05MWQIHYWRkcmVzcwd1c2R0QW10BAhjdXJTdGF0cwkBDGdldFdsZ1N0YXRzMgQCAAkAzAgCBQ1yZXN0MkNvbnRyYWN0CQDMCAIFDmFjcmVzMkNvbnRyYWN0CQDMCAIFC3dsZ0NvbnRyYWN0CQDMCAIFEnB1enpsZVBvb2xDb250cmFjdAkAzAgCBRJpbnZlc3RGdW5kQ29udHJhY3QFA25pbAULdXNkdEFzc2V0SWQFB3VzZHRBbXQECHdsZ1ByaWNlCQCRAwIFCGN1clN0YXRzBQppeFdsZ1ByaWNlBAhidXlQcmljZQkAbgQFCHdsZ1ByaWNlAAYABQUHQ0VJTElORwQJd2xnQW1vdW50CQBrAwUHdXNkdEFtdAUFTVVMVDgFCGJ1eVByaWNlBAZtYXhXbGcJARJnZXRTd2FwTGltaXRXbGdvbGQBBQdhZGRyZXNzBAdtYXhVc2R0CQBrAwUGbWF4V2xnBQhidXlQcmljZQUFTVVMVDgEDHByb2ZpdEFtb3VudAkAaQIFB3VzZHRBbXQABgkAlAoCBQNuaWwJAMwIAgUJd2xnQW1vdW50CQDMCAIFDk1JTlNIT1BQQVlNRU5UCQDMCAIFB21heFVzZHQJAMwIAgUMcHJvZml0QW1vdW50BQNuaWwBaQEHc2VsbFdsZwEJbWluQW1vdW50BAxwcm9sb2dSZXN1bHQJAQdwcm9sb2cyAAMJAAACBQxwcm9sb2dSZXN1bHQFDHByb2xvZ1Jlc3VsdAMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECImV4YWN0bHkgMSBwYXltZW50IG11c3QgYmUgYXR0YWNoZWQEA3BtdAkAkQMCCAUBaQhwYXltZW50cwAABAZ3bGdBbXQIBQNwbXQGYW1vdW50BAZjYWxsZXIIBQFpBmNhbGxlcgQEYWRkcgkApQgBBQZjYWxsZXIEBm1heFdsZwkBEmdldFN3YXBMaW1pdFdsZ29sZAEFBGFkZHIDCQBmAgUGd2xnQW10BQZtYXhXbGcJAAIBCQCsAgIJAKwCAgISWW91IGNhbiBzcGVuZCBtYXggCQEKZml4ZWRQb2ludAIFBm1heFdsZwAIAhUgV0xHT0xEIGF0IHRoZSBtb21lbnQDAwkBASEBCQEJaXNEZWZpbmVkAQgFA3BtdAdhc3NldElkBgkBAiE9AgkBBXZhbHVlAQgFA3BtdAdhc3NldElkBQp3bGdBc3NldElkCQACAQIVV0xHT0xEIHBheW1lbnRzIG9ubHkhBAhjdXJTdGF0cwkBDGdldFdsZ1N0YXRzMgQCAAkAzAgCBQ1yZXN0MkNvbnRyYWN0CQDMCAIFDmFjcmVzMkNvbnRyYWN0CQDMCAIFC3dsZ0NvbnRyYWN0CQDMCAIFEnB1enpsZVBvb2xDb250cmFjdAkAzAgCBRJpbnZlc3RGdW5kQ29udHJhY3QFA25pbAULdXNkdEFzc2V0SWQAAAQMY3VyV2xnQW1vdW50CQCRAwIFCGN1clN0YXRzBQtpeFdsZ0Ftb3VudAQJc2VsbFByaWNlCQBpAgkAkQMCBQhjdXJTdGF0cwUKaXhXbGdQcmljZQACBAd1c2R0QW10CQBrAwUGd2xnQW10BQlzZWxsUHJpY2UFBU1VTFQ4AwkAZgIFDk1JTlNIT1BQQVlNRU5UBQd1c2R0QW10CQACAQkArAICCQCsAgICEllvdSBjYW4gdHJhZGUgbWluIAkBCmZpeGVkUG9pbnQCBQ5NSU5TSE9QUEFZTUVOVAAGAgUgVVNEVAMJAGYCBQltaW5BbW91bnQFB3VzZHRBbXQJAAIBAjBQcmljZSBjaGFuZ2VkIGR1cmluZyBvcGVyYXRpb24sIHBsZWFzZSB0cnkgYWdhaW4EDHByb2ZpdEFtb3VudAkAaQIFB3VzZHRBbXQABQkAlAoCCQDMCAIJAQRCdXJuAgUKd2xnQXNzZXRJZAUGd2xnQW10CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRJ3bGdJc3N1ZWRBbW91bnRLZXkJAGUCBQxjdXJXbGdBbW91bnQFBndsZ0FtdAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBGWtleUxhc3RXbGdUcmFkZVRpbWVCeVVzZXIBBQRhZGRyCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBGmtleUxhc3RXbGdUcmFkZUxpbWl0QnlVc2VyAQUEYWRkcgkAZQIFBm1heFdsZwUGd2xnQW10CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQV2YWx1ZQEJAKIIAQUNcHJvZml0QWRkcktleQUMcHJvZml0QW1vdW50BQt1c2R0QXNzZXRJZAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQZjYWxsZXIFB3VzZHRBbXQFC3VzZHRBc3NldElkBQNuaWwFDHByb2xvZ1Jlc3VsdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQ9zZWxsV2xnUkVBRE9OTFkCB2FkZHJlc3MGd2xnQW10BAZtYXhXbGcJARJnZXRTd2FwTGltaXRXbGdvbGQBBQdhZGRyZXNzBAhjdXJTdGF0cwkBDGdldFdsZ1N0YXRzMgQCAAkAzAgCBQ1yZXN0MkNvbnRyYWN0CQDMCAIFDmFjcmVzMkNvbnRyYWN0CQDMCAIFC3dsZ0NvbnRyYWN0CQDMCAIFEnB1enpsZVBvb2xDb250cmFjdAkAzAgCBRJpbnZlc3RGdW5kQ29udHJhY3QFA25pbAULdXNkdEFzc2V0SWQAAAQJc2VsbFByaWNlCQBpAgkAkQMCBQhjdXJTdGF0cwUKaXhXbGdQcmljZQACBAd1c2R0QW10CQBrAwUGd2xnQW10BQlzZWxsUHJpY2UFBU1VTFQ4BAZtaW5XbGcJAGsDBQ5NSU5TSE9QUEFZTUVOVAUFTVVMVDgFCXNlbGxQcmljZQQMcHJvZml0QW1vdW50CQBpAgUHdXNkdEFtdAAFCQCUCgIFA25pbAkAzAgCBQd1c2R0QW10CQDMCAIFBm1pbldsZwkAzAgCBQZtYXhXbGcJAMwIAgUMcHJvZml0QW1vdW50BQNuaWwBaQEFY2xhaW0ABAxwcm9sb2dSZXN1bHQJAQdwcm9sb2cyAAMJAAACBQxwcm9sb2dSZXN1bHQFDHByb2xvZ1Jlc3VsdAMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAAkAAgECFE5vIHBheW1lbnRzIHJlcXVpcmVkBA0kdDAxNjM5NzE2NDY2CQEOY2xhaW1JbnRlcm5hbDIBCQClCAEIBQFpBmNhbGxlcgQHYWN0aW9ucwgFDSR0MDE2Mzk3MTY0NjYCXzEEEHdsZ0NsYWltZWRBbW91bnQIBQ0kdDAxNjM5NzE2NDY2Al8yCQCUCgIJAM0IAgUHYWN0aW9ucwkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBRB3bGdDbGFpbWVkQW1vdW50BQp3bGdBc3NldElkBQxwcm9sb2dSZXN1bHQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQESb25TdGFrZVVuc3Rha2VMYW5kAgRhZGRyBWlzTmV3AwMDCQECIT0CCAUBaQZjYWxsZXIFD3N0YWtpbmdDb250cmFjdAkBAiE9AggFAWkGY2FsbGVyBQ1hY3Jlc0NvbnRyYWN0BwkBAiE9AggFAWkGY2FsbGVyBQ5hY3JlczJDb250cmFjdAcJAAIBAhFQZXJtaXNzaW9uIGRlbmllZAQNJHQwMTY4MDIxNjg5NwMFBWlzTmV3CQEOY2xhaW1JbnRlcm5hbDIBBQRhZGRyCQENY2xhaW1JbnRlcm5hbAEFBGFkZHIEB2FjdGlvbnMIBQ0kdDAxNjgwMjE2ODk3Al8xBBB3bGdDbGFpbWVkQW1vdW50CAUNJHQwMTY4MDIxNjg5NwJfMgkAlAoCAwkAZgIFEHdsZ0NsYWltZWRBbW91bnQAAAkAzQgCBQdhY3Rpb25zCQEOU2NyaXB0VHJhbnNmZXIDCQERQGV4dHJOYXRpdmUoMTA2MikBBQRhZGRyBRB3bGdDbGFpbWVkQW1vdW50BQp3bGdBc3NldElkBQdhY3Rpb25zBRB3bGdDbGFpbWVkQW1vdW50AWkBCmJ1cm5XbGdvbGQBBndsZ0FtdAMJAQIhPQIIBQFpBmNhbGxlcgUOYWNyZXMyQ29udHJhY3QJAAIBAhFQZXJtaXNzaW9uIGRlbmllZAQIY3VyU3RhdHMJAQxnZXRXbGdTdGF0czIEAgAJAMwIAgUNcmVzdDJDb250cmFjdAkAzAgCBQ5hY3JlczJDb250cmFjdAkAzAgCBQt3bGdDb250cmFjdAkAzAgCBRJwdXp6bGVQb29sQ29udHJhY3QJAMwIAgUSaW52ZXN0RnVuZENvbnRyYWN0BQNuaWwFC3VzZHRBc3NldElkAAADCQBmAgUGd2xnQW10CQCRAwIFCGN1clN0YXRzBQhpeFdsZ1dsZwkAAgEJAKwCAgkArAICCQCsAgICBU9ubHkgCQEKZml4ZWRQb2ludAIJAJEDAgUIY3VyU3RhdHMFCGl4V2xnV2xnAAgCJSBXTEdPTEQgbGVmdCBvbiBjb250cmFjdCwgY2FuJ3QgYnVybiAJAQpmaXhlZFBvaW50AgUGd2xnQW10AAgEDXdsZ0Ftb3VudExlZnQJAGUCCQCRAwIFCGN1clN0YXRzBQtpeFdsZ0Ftb3VudAUGd2xnQW10CQCUCgIJAMwIAgkBBEJ1cm4CBQp3bGdBc3NldElkBQZ3bGdBbXQJAMwIAgkBDEludGVnZXJFbnRyeQIFEndsZ0lzc3VlZEFtb3VudEtleQUNd2xnQW1vdW50TGVmdAUDbmlsBQ13bGdBbW91bnRMZWZ0AWkBDGJldEZvclRpY2tldAEDYmV0BAxwcm9sb2dSZXN1bHQJAQdwcm9sb2cyAAMJAAACBQxwcm9sb2dSZXN1bHQFDHByb2xvZ1Jlc3VsdAMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAAkAAgECFE5vIHBheW1lbnRzIHJlcXVpcmVkBARhZGRyCQClCAEIBQFpBmNhbGxlcgQIZHJhd1dlZWsJAGUCCQBpAgUGaGVpZ2h0BQtXRUVLX0JMT0NLUwABBAt1c2VyVGlja2V0cwkBC3ZhbHVlT3JFbHNlAgkAnwgBCQESa2V5VXNlcldlZWtUaWNrZXRzAgUEYWRkcgUIZHJhd1dlZWsAAAQLd2Vla1RpY2tldHMJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBE2tleVRvdGFsV2Vla1RpY2tldHMBBQhkcmF3V2VlawAAAwMJAGYCBQt1c2VyVGlja2V0cwAACQBmAgULd2Vla1RpY2tldHMAAAcJAAIBAhtQbGVhc2Ugb3BlbiB0aGUgY2hlc3QgZmlyc3QDCQECIT0CCQBpAgUDYmV0AAQAAAkAAgECG0ludmFsaWQgYmV0OiBzaG91bGQgYmUgMC4uMwQGbW9tZW50CQBqAgUGaGVpZ2h0BQpEQVlfQkxPQ0tTAwkAZgIFBm1vbWVudAkAZQIFCkRBWV9CTE9DS1MAAwkAAgEJAKwCAgkArAICAjFDYW5ub3QgYmV0OiB0aGUgZGF5IGlzIGFsbW9zdCBlbmRlZCwgcGxlYXNlIHdhaXQgCQCkAwEJAGUCBQpEQVlfQkxPQ0tTBQZtb21lbnQCByBibG9ja3MEC3N0YWtlZEFjcmVzCQELdmFsdWVPckVsc2UCCQCaCAIFDmFjcmVzMkNvbnRyYWN0CQEXa2V5QWNyZXNTdGFrZWRBbXRCeVVzZXIBBQRhZGRyAAADCQBmAgUNQUNSRVNfRk9SX0JFVAULc3Rha2VkQWNyZXMJAAIBCQCsAgIJAKwCAgIbWW91IG5lZWQgdG8gc3Rha2UgYXQgbGVhc3QgCQEKZml4ZWRQb2ludAIFDUFDUkVTX0ZPUl9CRVQACAINIEFDUkVTIHRvIGJldAQIdG9tb3Jyb3cJAGQCCQBpAgUGaGVpZ2h0BQpEQVlfQkxPQ0tTAAEEBmJldEtleQkBCmtleVVzZXJCZXQBBQRhZGRyBA1vbGRVc2VyQmV0U3RyCQCiCAEFBmJldEtleQQLbmV3QmV0RW50cnkJAQtTdHJpbmdFbnRyeQIFBmJldEtleQkArAICCQCsAgIJAKQDAQUIdG9tb3Jyb3cCAV8JAKQDAQUDYmV0AwkBCWlzRGVmaW5lZAEFDW9sZFVzZXJCZXRTdHIEB3VzZXJCZXQJAQV2YWx1ZQEFDW9sZFVzZXJCZXRTdHIDCQAAAgkAkQMCCQC1CQIFB3VzZXJCZXQCAV8AAAkApAMBBQh0b21vcnJvdwkAAgECHFlvdSBhbHJlYWR5IGJldCBmb3IgdG9tb3Jyb3cEAXIJARRjbGFpbVRpY2tldHNJbnRlcm5hbAIFBGFkZHIFB3VzZXJCZXQJAJQKAgkAzQgCCAUBcgJfMQULbmV3QmV0RW50cnkIBQFyAl8yCQCUCgIJAMwIAgULbmV3QmV0RW50cnkFA25pbAAACQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCXRha2VXbGdYcAEEYWRkcgMJAQIhPQIIBQFpBmNhbGxlcgUPc3Rha2luZ0NvbnRyYWN0CQACAQIRUGVybWlzc2lvbiBkZW5pZWQEDSR0MDE5NTA3MTk1NTAJAQ50YWtlWHBJbnRlcm5hbAIFBGFkZHIAAAQHYWN0aW9ucwgFDSR0MDE5NTA3MTk1NTACXzEEAnhwCAUNJHQwMTk1MDcxOTU1MAJfMgkAlAoCBQdhY3Rpb25zBQJ4cAFpARJjaGVja1dsZ1hwUkVBRE9OTFkBBGFkZHIEDSR0MDE5NjI3MTk2NzUJAQ50YWtlWHBJbnRlcm5hbAIFBGFkZHIAAAQHaWdub3JlZAgFDSR0MDE5NjI3MTk2NzUCXzEEB2RlbHRhWFAIBQ0kdDAxOTYyNzE5Njc1Al8yBAVuZXdYUAkAZAIJAQt2YWx1ZU9yRWxzZQIJAJoIAgUPc3Rha2luZ0NvbnRyYWN0CQEJa2V5VXNlclhQAQUEYWRkcgAABQdkZWx0YVhQBAlsdmxQb2ludHMJAQdsZXZlbFVwAgkBC3ZhbHVlT3JFbHNlAgkAmggCBQ9zdGFraW5nQ29udHJhY3QJAQxrZXlVc2VyTGV2ZWwBBQRhZGRyAAAFBW5ld1hQCQCUCgIFA25pbAkAzQgCBQlsdmxQb2ludHMFBW5ld1hQAWkBDHNldE51bVByaXplcwEJbnVtUHJpemVzAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIRUGVybWlzc2lvbiBkZW5pZWQEBHdlZWsJAGkCBQZoZWlnaHQFC1dFRUtfQkxPQ0tTCQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ5rZXlOdW1ORlQyRHJhdwEFBHdlZWsFCW51bVByaXplcwUDbmlsBQludW1Qcml6ZXMBaQEJb3BlbkNoZXN0AAQMcHJvbG9nUmVzdWx0CQEHcHJvbG9nMgADCQAAAgUMcHJvbG9nUmVzdWx0BQxwcm9sb2dSZXN1bHQDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAAJAAIBAhRObyBwYXltZW50cyByZXF1aXJlZAQIZHJhd1dlZWsJAGUCCQBpAgUGaGVpZ2h0BQtXRUVLX0JMT0NLUwABBARhZGRyCQClCAEIBQFpBmNhbGxlcgQLdXNlclRpY2tldHMJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBEmtleVVzZXJXZWVrVGlja2V0cwIFBGFkZHIFCGRyYXdXZWVrAAADCQBnAgAABQt1c2VyVGlja2V0cwkAAgECGU5vIGdlbXMgdG8gb3BlbiB0aGUgY2hlc3QJARFvcGVuQ2hlc3RJbnRlcm5hbAEFBGFkZHIJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEKYWRkR2Vtc0ZvcgIEYWRkcgxkZWx0YVRpY2tldHMDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAhFQZXJtaXNzaW9uIGRlbmllZAQEd2VlawkAaQIFBmhlaWdodAULV0VFS19CTE9DS1MECnRpY2tldHNLZXkJARJrZXlVc2VyV2Vla1RpY2tldHMCBQRhZGRyBQR3ZWVrBA9vbGRUb3RhbFRpY2tldHMJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBE2tleVRvdGFsV2Vla1RpY2tldHMBBQR3ZWVrAAAECm9sZFRpY2tldHMJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUKdGlja2V0c0tleQAABA9vbGRQYXJ0aWNpcGFudHMJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBGGtleVRvdGFsV2Vla1BhcnRpY2lwYW50cwEFBHdlZWsAAAQSdXBkYXRlUGFydGljaXBhbnRzAwMJAAACBQpvbGRUaWNrZXRzAAAJAAACBQxkZWx0YVRpY2tldHMAAQcJAMwIAgkBDEludGVnZXJFbnRyeQIJARhrZXlUb3RhbFdlZWtQYXJ0aWNpcGFudHMBBQR3ZWVrCQBkAgUPb2xkUGFydGljaXBhbnRzAAEFA25pbAUDbmlsCQCUCgIJAM0IAgkAzQgCBRJ1cGRhdGVQYXJ0aWNpcGFudHMJAQxJbnRlZ2VyRW50cnkCBQp0aWNrZXRzS2V5CQBkAgUKb2xkVGlja2V0cwUMZGVsdGFUaWNrZXRzCQEMSW50ZWdlckVudHJ5AgkBE2tleVRvdGFsV2Vla1RpY2tldHMBBQR3ZWVrCQBkAgUPb2xkVG90YWxUaWNrZXRzBQxkZWx0YVRpY2tldHMFDGRlbHRhVGlja2V0cwCnVvsI", "height": 3398925, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: H5jV4BXSNdN5bSydrLtnQfRExvrpMaVoKtWNiYmYbqd7 Next: DjvJTxECEqNT2eT1T1BYXAFRmrwEgFHFQoaR7up1QfP6 Diff:
OldNewDifferences
6464 then "3PQCuvFbvh4LkPUnrnU1z3jnbA1p9m3WNhv"
6565 else if ((base58'2T' == $match0))
6666 then "3MumkGGztCKAXpWDqxkddofqXSUbqQkvSJy"
67+ else throw("Unknown chain")
68+}
69+
70+let economyContractStr = match chain {
71+ case _ =>
72+ if ((base58'2W' == $match0))
73+ then "3P2sk1KncSxRaZs8b4CWGPw2jkvvav74u4D"
74+ else if ((base58'2T' == $match0))
75+ then "3N8y4wxX3JC4TdrCJBXX16SjWf6X256hrep"
6776 else throw("Unknown chain")
6877 }
6978
237246 }
238247
239248
249+let M6 = 1000000
250+
251+let M8 = 100000000
252+
240253 let MILLION6 = 100000000000000
254+
255+let TEAMSHARE = 200000
256+
257+let ACTIVITYSHARE = 100000
241258
242259 let PLAYERSHARE = 400000
243260
261+let YEARMILLIS = 31557600000
262+
244263 let DAYMILLIS = 86400000
264+
265+let BANK_FEE = 50000
266+
267+let ch = take(drop(this.bytes, 1), 1)
268+
269+let USDT_TVL_CORRECTION = match ch {
270+ case _ =>
271+ if ((base58'2W' == $match0))
272+ then 1208630000
273+ else if ((base58'2T' == $match0))
274+ then 0
275+ else throw("Unknown chain")
276+}
245277
246278 let teamAddrKey = "teamAddr"
247279
255287
256288 let stakersAmountLeftKey = "stakersAmountLeft"
257289
290+func keyLastClaimedTimeByUser (addr) = ("lastClaimedTimeUser_" + addr)
291+
292+
258293 func keyLastWlgTradeTimeByUser (addr) = ("lastArbTimeUser_" + addr)
259294
260295
261296 func keyLastWlgTradeLimitByUser (addr) = ("lastWlgLimitUser_" + addr)
262297
263298
299+func distributionByPeriod (period) = fraction(MILLION6, (PLAYERSHARE * (period + 1)), (6 * M6))
300+
301+
264302 let wlgIssueTimeKey = "wlg_issueTime"
265303
266304 let wlgIssuedAmountKey = "wlg_issuedAmount"
267305
306+let zbIssuedAmountKey = "zbill_issuedAmount"
307+
268308 func keyAcresStakedAmountByUser (addr) = ("acresStakedAmountByUser_" + addr)
269309
310+
311+let acresStakedTotalKey = "acresStakedAmountTotal"
270312
271313 func keyWlgStakedAmountByUser (addr) = ("wlgStakedAmountByUser_" + addr)
272314
274316 let wlgStakedTotalKey = "wlgStakedAmountTotal"
275317
276318 func keyWlgStakedTimeByUser (addr) = ("wlgStakedTimeByUser_" + addr)
319+
320+
321+let dappRest = 0
322+
323+let dappStaking = 1
324+
325+let dappEconomy = 2
326+
327+let dappWlg = 3
328+
329+let dappPuzzle = 4
330+
331+let dappInvestFund = 5
332+
333+let dappAcres = 6
334+
335+func getLands (userAddrStrOrEmpty,stakingContract,acresContract) = {
336+ let props = split(valueOrElse(getString(stakingContract, "resTypesProportions"), "0_0_0_0_0_0"), "_")
337+ func adder (acc,item) = (acc + parseIntValue(item))
338+
339+ let totalPieces = {
340+ let $l = props
341+ let $s = size($l)
342+ let $acc0 = 0
343+ func $f0_1 ($a,$i) = if (($i >= $s))
344+ then $a
345+ else adder($a, $l[$i])
346+
347+ func $f0_2 ($a,$i) = if (($i >= $s))
348+ then $a
349+ else throw("List size exceeds 6")
350+
351+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
352+ }
353+ let userPieces = valueOrElse(getInteger(stakingContract, ("stakedPiecesByOwner_" + userAddrStrOrEmpty)), 0)
354+ let totalAcres = valueOrElse(getInteger(acresContract, acresStakedTotalKey), 0)
355+ let userAcres = valueOrElse(getInteger(acresContract, keyAcresStakedAmountByUser(userAddrStrOrEmpty)), 0)
356+[totalPieces, userPieces, totalAcres, userAcres]
357+ }
358+
359+
360+let idxTotalPieces = 0
361+
362+let idxUserPieces = 1
363+
364+let idxTotalAcres = 2
365+
366+let idxUserAcres = 3
367+
368+func getWlgStats (userAddrOpt,contracts,usdtId,usdtBalanceCorrection,userProportion6) = {
369+ let issuedAmount = valueOrErrorMessage(getInteger(contracts[dappWlg], wlgIssuedAmountKey), "WLGOLD is not issued yet")
370+ let economyUsd = assetBalance(contracts[dappEconomy], usdtId)
371+ let restUsd = assetBalance(contracts[dappRest], usdtId)
372+ let wlgUsd = (assetBalance(contracts[dappWlg], usdtId) - usdtBalanceCorrection)
373+ let puzzleUsd = assetBalance(contracts[dappPuzzle], usdtId)
374+ let investFndContract = contracts[dappInvestFund]
375+ let investFundTotal = (assetBalance(investFndContract, usdtId) + valueOrElse(getInteger(investFndContract, zbIssuedAmountKey), 0))
376+ let totalFundsUsd = ((economyUsd + wlgUsd) + investFundTotal)
377+ let wlgId = valueOrErrorMessage(getBinary(contracts[dappWlg], "wlg_assetId"), "Not initialized yet")
378+ let now = lastBlock.timestamp
379+ let issueTime = valueOrErrorMessage(getInteger(contracts[dappWlg], wlgIssueTimeKey), "Not initialized")
380+ let bankWlgold = assetBalance(contracts[dappStaking], wlgId)
381+ let teamTotal = fraction(MILLION6, TEAMSHARE, M6)
382+ let teamAmountLeft = valueOrElse(getInteger(contracts[dappWlg], teamAmountLeftKey), teamTotal)
383+ let lastTeamTime = valueOrElse(getInteger(contracts[dappWlg], lastTeamTimeKey), issueTime)
384+ let teamAddr = addressFromStringValue(value(getString(contracts[dappWlg], teamAddrKey)))
385+ let teamAmountAvailableNow = min([fraction(teamTotal, (now - lastTeamTime), (3 * YEARMILLIS)), teamAmountLeft])
386+ let teamWlgold = assetBalance(teamAddr, wlgId)
387+ let actTotal = fraction(MILLION6, ACTIVITYSHARE, M6)
388+ let actAmountLeft = valueOrElse(getInteger(contracts[dappWlg], actAmountLeftKey), actTotal)
389+ let lastActivitiesTime = valueOrElse(getInteger(contracts[dappWlg], lastActivitiesTimeKey), issueTime)
390+ let actAmountAvailableNow = min([fraction(actTotal, (now - lastActivitiesTime), (3 * YEARMILLIS)), actAmountLeft])
391+ let actWlgold = assetBalance(contracts[dappRest], wlgId)
392+ let lastUserTime = valueOrElse(getInteger(contracts[dappWlg], keyLastClaimedTimeByUser(userAddrOpt)), issueTime)
393+ let lastUserPeriod = ((lastUserTime - issueTime) / YEARMILLIS)
394+ let nowLimited = min([now, (issueTime + (3 * YEARMILLIS))])
395+ let curPeriod = min([((now - issueTime) / YEARMILLIS), 2])
396+ let eff = getLands(userAddrOpt, contracts[dappStaking], contracts[dappAcres])
397+ let curPeriodDistribution = distributionByPeriod(curPeriod)
398+ let $t079143 = if ((lastUserPeriod == curPeriod))
399+ then {
400+ let a0 = fraction(curPeriodDistribution, (nowLimited - lastUserTime), YEARMILLIS)
401+ let userPart = fraction(a0, userProportion6, M6)
402+ let effTime = (lastUserTime + fraction((nowLimited - lastUserTime), userProportion6, M6))
403+ $Tuple3(userPart, a0, effTime)
404+ }
405+ else if ((lastUserPeriod == (curPeriod - 1)))
406+ then {
407+ let a1 = fraction(distributionByPeriod((curPeriod - 1)), ((issueTime + (YEARMILLIS * curPeriod)) - lastUserTime), YEARMILLIS)
408+ let a0 = fraction(curPeriodDistribution, (nowLimited - (issueTime + (YEARMILLIS * curPeriod))), YEARMILLIS)
409+ let avail = (a1 + a0)
410+ let userPart = fraction(avail, userProportion6, M6)
411+ let effTime = if ((a1 >= userPart))
412+ then (lastUserTime + fraction(YEARMILLIS, userPart, distributionByPeriod((curPeriod - 1))))
413+ else ((issueTime + (YEARMILLIS * curPeriod)) + fraction(YEARMILLIS, (userPart - a1), curPeriodDistribution))
414+ $Tuple3(userPart, avail, effTime)
415+ }
416+ else {
417+ let a2 = fraction(distributionByPeriod((curPeriod - 2)), ((issueTime + (YEARMILLIS * (curPeriod - 1))) - lastUserTime), YEARMILLIS)
418+ let a1 = distributionByPeriod((curPeriod - 1))
419+ let a0 = fraction(curPeriodDistribution, (nowLimited - (issueTime + (YEARMILLIS * curPeriod))), YEARMILLIS)
420+ let avail = ((a2 + a1) + a0)
421+ let userPart = fraction(avail, userProportion6, M6)
422+ let effTime = if ((a2 >= userPart))
423+ then (lastUserTime + fraction(YEARMILLIS, userPart, distributionByPeriod((curPeriod - 2))))
424+ else if (((a2 + a1) >= userPart))
425+ then ((issueTime + (YEARMILLIS * (curPeriod - 1))) + fraction(YEARMILLIS, (userPart - a2), distributionByPeriod((curPeriod - 1))))
426+ else ((issueTime + (YEARMILLIS * curPeriod)) + fraction(YEARMILLIS, ((userPart - a2) - a1), curPeriodDistribution))
427+ $Tuple3(userPart, avail, effTime)
428+ }
429+ let userAmount = $t079143._1
430+ let userAvailable = $t079143._2
431+ let effLastTime = $t079143._3
432+ let sLandDailyAmount = fraction(fraction(curPeriodDistribution, DAYMILLIS, YEARMILLIS), 25, eff[idxTotalPieces])
433+ let amountLeftTotal = valueOrElse(getInteger(contracts[dappWlg], stakersAmountLeftKey), 0)
434+ let userTemp = fraction(userAmount, ((eff[idxUserPieces] * M8) + eff[idxUserAcres]), ((eff[idxTotalPieces] * M8) + eff[idxTotalAcres]))
435+ let bankFromUser = fraction(userTemp, BANK_FEE, M6)
436+ let robbedUser = (userTemp - bankFromUser)
437+ let unrobbedUser = fraction(userAvailable, ((eff[idxUserPieces] * M8) + eff[idxUserAcres]), ((eff[idxTotalPieces] * M8) + eff[idxTotalAcres]))
438+[issuedAmount, fraction((totalFundsUsd - USDT_TVL_CORRECTION), M8, issuedAmount), totalFundsUsd, economyUsd, restUsd, wlgUsd, puzzleUsd, issueTime, lastTeamTime, teamTotal, teamAmountLeft, teamAmountAvailableNow, teamWlgold, actTotal, actAmountLeft, actAmountAvailableNow, actWlgold, curPeriod, amountLeftTotal, curPeriodDistribution, lastUserTime, robbedUser, sLandDailyAmount, investFundTotal, unrobbedUser, effLastTime, bankWlgold]
439+ }
277440
278441
279442 let M6_ = 1000000
491654 let lastLimitLeft = valueOrElse(getInteger(keyLastWlgTradeLimitByUser(addr)), defaultLimit)
492655 let currentLimit = (lastLimitLeft + fraction(defaultLimit, (lastBlock.timestamp - lastTime), DAY_MILLIS))
493656 min([currentLimit, defaultLimit])
657+ }
658+
659+
660+let idxWlgTeamAmLeft = 10
661+
662+let idxWlgTeamAmAvailNow = 11
663+
664+let idxWlgActAmLeft = 14
665+
666+let idxWlgActAmAvailNow = 15
667+
668+let idxWlgAmLeftTotal = 18
669+
670+let idxWlgUserAmAvailNow = 21
671+
672+let idxWlgUserTotalAvail = 24
673+
674+let idxWlgEffUserTime = 25
675+
676+func claimInternal (addr) = {
677+ let caller = addressFromStringValue(addr)
678+ let economyContract = addressFromStringValue(economyContractStr)
679+ let curStats = getWlgStats(addr, [restContract, stakingContract, economyContract, wlgContract, puzzlePoolContract, investFundContract, acresContract], usdtAssetId, 0, MULT6)
680+ let now = lastBlock.timestamp
681+ let teamAmountLeft = curStats[idxWlgTeamAmLeft]
682+ let teamAmount = curStats[idxWlgTeamAmAvailNow]
683+ let actAmountLeft = curStats[idxWlgActAmLeft]
684+ let actAmount = curStats[idxWlgActAmAvailNow]
685+ let userAmount = curStats[idxWlgUserAmAvailNow]
686+ let userKey = keyStakersAmountPaidUser(addr)
687+ let userTotal = curStats[idxWlgUserTotalAvail]
688+ let userEffTime = curStats[idxWlgEffUserTime]
689+ $Tuple2([ScriptTransfer(addressFromStringValue(value(getString(teamAddrKey))), teamAmount, wlgAssetId), ScriptTransfer(restContract, actAmount, wlgAssetId), IntegerEntry(userKey, (valueOrElse(getInteger(userKey), 0) + userAmount)), IntegerEntry(stakersAmountPaidTotalKey, (valueOrElse(getInteger(stakersAmountPaidTotalKey), 0) + userTotal)), IntegerEntry(stakersAmountLeftKey, (curStats[idxWlgAmLeftTotal] - userTotal)), IntegerEntry(teamAmountLeftKey, (teamAmountLeft - teamAmount)), IntegerEntry(lastTeamTimeKey, now), IntegerEntry(actAmountLeftKey, (actAmountLeft - actAmount)), IntegerEntry(lastActivitiesTimeKey, now), IntegerEntry(keyLastClaimedTimeByUser(addr), userEffTime)], userAmount)
494690 }
495691
496692
738934 then if ((size(i.payments) != 0))
739935 then throw("No payments required")
740936 else {
741- let $t01421414283 = claimInternal2(toString(i.caller))
742- let actions = $t01421414283._1
743- let wlgClaimedAmount = $t01421414283._2
937+ let $t01639716466 = claimInternal2(toString(i.caller))
938+ let actions = $t01639716466._1
939+ let wlgClaimedAmount = $t01639716466._2
744940 $Tuple2((actions :+ ScriptTransfer(i.caller, wlgClaimedAmount, wlgAssetId)), prologResult)
745941 }
746942 else throw("Strict value is not equal to itself.")
749945
750946
751947 @Callable(i)
752-func onStakeUnstakeLand (addr) = if (if (if ((i.caller != stakingContract))
948+func onStakeUnstakeLand (addr,isNew) = if (if (if ((i.caller != stakingContract))
753949 then (i.caller != acresContract)
754950 else false)
755951 then (i.caller != acres2Contract)
756952 else false)
757953 then throw("Permission denied")
758954 else {
759- let $t01460214656 = claimInternal2(addr)
760- let actions = $t01460214656._1
761- let wlgClaimedAmount = $t01460214656._2
955+ let $t01680216897 = if (isNew)
956+ then claimInternal2(addr)
957+ else claimInternal(addr)
958+ let actions = $t01680216897._1
959+ let wlgClaimedAmount = $t01680216897._2
762960 $Tuple2(if ((wlgClaimedAmount > 0))
763961 then (actions :+ ScriptTransfer(addressFromStringValue(addr), wlgClaimedAmount, wlgAssetId))
764962 else actions, wlgClaimedAmount)
8351033 func takeWlgXp (addr) = if ((i.caller != stakingContract))
8361034 then throw("Permission denied")
8371035 else {
838- let $t01726617309 = takeXpInternal(addr, 0)
839- let actions = $t01726617309._1
840- let xp = $t01726617309._2
1036+ let $t01950719550 = takeXpInternal(addr, 0)
1037+ let actions = $t01950719550._1
1038+ let xp = $t01950719550._2
8411039 $Tuple2(actions, xp)
8421040 }
8431041
8451043
8461044 @Callable(i)
8471045 func checkWlgXpREADONLY (addr) = {
848- let $t01738617434 = takeXpInternal(addr, 0)
849- let ignored = $t01738617434._1
850- let deltaXP = $t01738617434._2
1046+ let $t01962719675 = takeXpInternal(addr, 0)
1047+ let ignored = $t01962719675._1
1048+ let deltaXP = $t01962719675._2
8511049 let newXP = (valueOrElse(getInteger(stakingContract, keyUserXP(addr)), 0) + deltaXP)
8521050 let lvlPoints = levelUp(valueOrElse(getInteger(stakingContract, keyUserLevel(addr)), 0), newXP)
8531051 $Tuple2(nil, (lvlPoints :+ newXP))
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let SEP = "__"
55
66 let MULT6 = 1000000
77
88 let MULT8 = 100000000
99
1010 let MINSHOPPAYMENT = 100000
1111
1212 let DAY_MILLIS = 86400000
1313
1414 let chain = take(drop(this.bytes, 1), 1)
1515
1616 let DAY_BLOCKS = match chain {
1717 case _ =>
1818 if ((base58'2W' == $match0))
1919 then 1440
2020 else if ((base58'2T' == $match0))
2121 then 60
2222 else throw("Unknown chain")
2323 }
2424
2525 let WEEK_BLOCKS = match chain {
2626 case _ =>
2727 if ((base58'2W' == $match0))
2828 then 10080
2929 else if ((base58'2T' == $match0))
3030 then 180
3131 else throw("Unknown chain")
3232 }
3333
3434 let VRF_OFFSET = match chain {
3535 case _ =>
3636 if ((base58'2W' == $match0))
3737 then 0
3838 else if ((base58'2T' == $match0))
3939 then 1146000
4040 else throw("Unknown chain")
4141 }
4242
4343 let usdtAssetId = match chain {
4444 case _ =>
4545 if ((base58'2W' == $match0))
4646 then base58'9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi'
4747 else if ((base58'2T' == $match0))
4848 then base58'6mWwf9mZBjVgkC54idpyaZLQfAosD914wT8fGf2iiY63'
4949 else throw("Unknown chain")
5050 }
5151
5252 let defaultRest2AddressStr = match chain {
5353 case _ =>
5454 if ((base58'2W' == $match0))
5555 then "3PFwYta8biEz31zpeFe5DJK8wE5trSpQVF8"
5656 else if ((base58'2T' == $match0))
5757 then "3N7UuYar6264P58FBhVWKPQAh4Yua2hgngv"
5858 else throw("Unknown chain")
5959 }
6060
6161 let defaultRestAddressStr = match chain {
6262 case _ =>
6363 if ((base58'2W' == $match0))
6464 then "3PQCuvFbvh4LkPUnrnU1z3jnbA1p9m3WNhv"
6565 else if ((base58'2T' == $match0))
6666 then "3MumkGGztCKAXpWDqxkddofqXSUbqQkvSJy"
67+ else throw("Unknown chain")
68+}
69+
70+let economyContractStr = match chain {
71+ case _ =>
72+ if ((base58'2W' == $match0))
73+ then "3P2sk1KncSxRaZs8b4CWGPw2jkvvav74u4D"
74+ else if ((base58'2T' == $match0))
75+ then "3N8y4wxX3JC4TdrCJBXX16SjWf6X256hrep"
6776 else throw("Unknown chain")
6877 }
6978
7079 func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
7180
7281
7382 let IdxCfgAcres2Dapp = 1
7483
7584 let IdxCfgWlgDapp = 2
7685
7786 let IdxCfgPuzzlePoolDapp = 4
7887
7988 let IdxCfgInvestFundDapp = 5
8089
8190 func keyRestCfg () = "%s__restConfig"
8291
8392
8493 func keyRest2Address () = "%s__rest2Addr"
8594
8695
8796 func keyRestAddress () = "%s__restAddr"
8897
8998
9099 let restContract = addressFromStringValue(valueOrElse(getString(this, keyRestAddress()), defaultRestAddressStr))
91100
92101 func readRestCfgOrFail (rest) = split_4C(getStringOrFail(rest, keyRestCfg()), SEP)
93102
94103
95104 func getContractAddressOrFail (rest2Cfg,idx) = valueOrErrorMessage(addressFromString(rest2Cfg[idx]), ("Rest cfg doesn't contain address at index " + toString(idx)))
96105
97106
98107 let IdxCfgStakingDapp = 1
99108
100109 let IdxCfgAcresDapp = 8
101110
102111 let restCfg = readRestCfgOrFail(restContract)
103112
104113 let stakingContract = getContractAddressOrFail(restCfg, IdxCfgStakingDapp)
105114
106115 let acresContract = getContractAddressOrFail(restCfg, IdxCfgAcresDapp)
107116
108117 let rest2Contract = addressFromStringValue(valueOrElse(getString(this, keyRest2Address()), defaultRest2AddressStr))
109118
110119 let rest2Cfg = readRestCfgOrFail(rest2Contract)
111120
112121 let acres2Contract = getContractAddressOrFail(rest2Cfg, IdxCfgAcres2Dapp)
113122
114123 let wlgContract = getContractAddressOrFail(rest2Cfg, IdxCfgWlgDapp)
115124
116125 let puzzlePoolContract = getContractAddressOrFail(rest2Cfg, IdxCfgPuzzlePoolDapp)
117126
118127 let investFundContract = getContractAddressOrFail(rest2Cfg, IdxCfgInvestFundDapp)
119128
120129 func keyLastWeekTxIdByUser (addr) = ("lastWeekTxIdByUser_" + addr)
121130
122131
123132 let wlgAssetIdKey = "wlg_assetId"
124133
125134 let wlgAssetId = valueOrErrorMessage(getBinary(wlgContract, wlgAssetIdKey), "WLGOLD is not issued yet")
126135
127136 func keyUserBet (addr) = ("userBet_" + addr)
128137
129138
130139 func keyUserWeekTickets (addr,week) = ((("userWeekTickets_" + addr) + "_") + toString(week))
131140
132141
133142 func keyTotalWeekTickets (week) = ("totalWeekTickets_" + toString(week))
134143
135144
136145 func keyTotalWeekParticipants (week) = ("totalWeekParticipants_" + toString(week))
137146
138147
139148 func keyNumNFT2Draw (week) = ("numNFT2Draw_" + toString(week))
140149
141150
142151 func keyNumNFTDrawn (week) = ("numNFTDrawn_" + toString(week))
143152
144153
145154 func keyWeekWinners (week) = ("weekWinners_" + toString(week))
146155
147156
148157 func winningBet (day) = {
149158 let b = (day * DAY_BLOCKS)
150159 let h = if ((b > VRF_OFFSET))
151160 then b
152161 else (b + VRF_OFFSET)
153162 (toInt(value(value(blockInfoByHeight(h)).vrf)) % 4)
154163 }
155164
156165
157166 let ixWlgAmount = 0
158167
159168 let ixWlgWlg = 1
160169
161170 let ixWlgPrice = 2
162171
163172 let ixWlgIssueTime = 8
164173
165174 let ixWlgTeamAmLeft = 11
166175
167176 let ixWlgTeamAmAvailNow = 12
168177
169178 let ixWlgActAmLeft = 15
170179
171180 let ixWlgActAmAvailNow = 16
172181
173182 let ixWlgAmLeftTotal = 19
174183
175184 let ixWlgUserAmAvailNow = 23
176185
177186 let ixWlgEffUserTime = 24
178187
179188 let ixWlgIssue10Amount = 25
180189
181190 let ixWlgMarketingIssue10Amount = 26
182191
183192 let ixWlgTeamIssue10Amount = 27
184193
185194 let ixWlgUser10part = 28
186195
187196 let ixWlgIssue10Time = 29
188197
189198 func asInt (v) = match v {
190199 case n: Int =>
191200 n
192201 case _ =>
193202 throw("fail to cast into Int")
194203 }
195204
196205
197206 func fixedPoint (val,decimals) = {
198207 let tenPow = pow(10, 0, decimals, 0, 0, DOWN)
199208 let lowPart = toString((val % tenPow))
200209 let zeroes = drop(toString(tenPow), (1 + size(lowPart)))
201210 (((toString((val / tenPow)) + ".") + zeroes) + lowPart)
202211 }
203212
204213
205214 func getRandomNumber (maxValue,salt,entropy) = if ((0 >= maxValue))
206215 then throw("maxValue should be > 0")
207216 else {
208217 let randomHash = sha256_16Kb((salt + entropy))
209218 (toInt(randomHash) % maxValue)
210219 }
211220
212221
213222 let SCALE8 = 100000000
214223
215224 let xpLevelScale = 3200
216225
217226 let xpLevelRecipPow = 4000
218227
219228 let numPointsOnLevelUp = 3
220229
221230 let wlgBaseAmountXp = 100000000000
222231
223232 func keyUserXP (addr) = ("userXP_" + addr)
224233
225234
226235 func keyUserLevel (addr) = ("userLevel_" + addr)
227236
228237
229238 let xpWlg = 10000
230239
231240 func levelByXP (xp) = fraction(xpLevelScale, pow(xp, 4, xpLevelRecipPow, 4, 4, DOWN), SCALE8)
232241
233242
234243 func levelUp (currLevel,newXP) = {
235244 let newLevel = levelByXP(newXP)
236245 [newLevel, (numPointsOnLevelUp * (newLevel - currLevel))]
237246 }
238247
239248
249+let M6 = 1000000
250+
251+let M8 = 100000000
252+
240253 let MILLION6 = 100000000000000
254+
255+let TEAMSHARE = 200000
256+
257+let ACTIVITYSHARE = 100000
241258
242259 let PLAYERSHARE = 400000
243260
261+let YEARMILLIS = 31557600000
262+
244263 let DAYMILLIS = 86400000
264+
265+let BANK_FEE = 50000
266+
267+let ch = take(drop(this.bytes, 1), 1)
268+
269+let USDT_TVL_CORRECTION = match ch {
270+ case _ =>
271+ if ((base58'2W' == $match0))
272+ then 1208630000
273+ else if ((base58'2T' == $match0))
274+ then 0
275+ else throw("Unknown chain")
276+}
245277
246278 let teamAddrKey = "teamAddr"
247279
248280 let lastTeamTimeKey = "lastClaimedTime_team"
249281
250282 let teamAmountLeftKey = "teamAmountLeft"
251283
252284 let lastActivitiesTimeKey = "lastClaimedTime_activities"
253285
254286 let actAmountLeftKey = "activitiesAmountLeft"
255287
256288 let stakersAmountLeftKey = "stakersAmountLeft"
257289
290+func keyLastClaimedTimeByUser (addr) = ("lastClaimedTimeUser_" + addr)
291+
292+
258293 func keyLastWlgTradeTimeByUser (addr) = ("lastArbTimeUser_" + addr)
259294
260295
261296 func keyLastWlgTradeLimitByUser (addr) = ("lastWlgLimitUser_" + addr)
262297
263298
299+func distributionByPeriod (period) = fraction(MILLION6, (PLAYERSHARE * (period + 1)), (6 * M6))
300+
301+
264302 let wlgIssueTimeKey = "wlg_issueTime"
265303
266304 let wlgIssuedAmountKey = "wlg_issuedAmount"
267305
306+let zbIssuedAmountKey = "zbill_issuedAmount"
307+
268308 func keyAcresStakedAmountByUser (addr) = ("acresStakedAmountByUser_" + addr)
269309
310+
311+let acresStakedTotalKey = "acresStakedAmountTotal"
270312
271313 func keyWlgStakedAmountByUser (addr) = ("wlgStakedAmountByUser_" + addr)
272314
273315
274316 let wlgStakedTotalKey = "wlgStakedAmountTotal"
275317
276318 func keyWlgStakedTimeByUser (addr) = ("wlgStakedTimeByUser_" + addr)
319+
320+
321+let dappRest = 0
322+
323+let dappStaking = 1
324+
325+let dappEconomy = 2
326+
327+let dappWlg = 3
328+
329+let dappPuzzle = 4
330+
331+let dappInvestFund = 5
332+
333+let dappAcres = 6
334+
335+func getLands (userAddrStrOrEmpty,stakingContract,acresContract) = {
336+ let props = split(valueOrElse(getString(stakingContract, "resTypesProportions"), "0_0_0_0_0_0"), "_")
337+ func adder (acc,item) = (acc + parseIntValue(item))
338+
339+ let totalPieces = {
340+ let $l = props
341+ let $s = size($l)
342+ let $acc0 = 0
343+ func $f0_1 ($a,$i) = if (($i >= $s))
344+ then $a
345+ else adder($a, $l[$i])
346+
347+ func $f0_2 ($a,$i) = if (($i >= $s))
348+ then $a
349+ else throw("List size exceeds 6")
350+
351+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
352+ }
353+ let userPieces = valueOrElse(getInteger(stakingContract, ("stakedPiecesByOwner_" + userAddrStrOrEmpty)), 0)
354+ let totalAcres = valueOrElse(getInteger(acresContract, acresStakedTotalKey), 0)
355+ let userAcres = valueOrElse(getInteger(acresContract, keyAcresStakedAmountByUser(userAddrStrOrEmpty)), 0)
356+[totalPieces, userPieces, totalAcres, userAcres]
357+ }
358+
359+
360+let idxTotalPieces = 0
361+
362+let idxUserPieces = 1
363+
364+let idxTotalAcres = 2
365+
366+let idxUserAcres = 3
367+
368+func getWlgStats (userAddrOpt,contracts,usdtId,usdtBalanceCorrection,userProportion6) = {
369+ let issuedAmount = valueOrErrorMessage(getInteger(contracts[dappWlg], wlgIssuedAmountKey), "WLGOLD is not issued yet")
370+ let economyUsd = assetBalance(contracts[dappEconomy], usdtId)
371+ let restUsd = assetBalance(contracts[dappRest], usdtId)
372+ let wlgUsd = (assetBalance(contracts[dappWlg], usdtId) - usdtBalanceCorrection)
373+ let puzzleUsd = assetBalance(contracts[dappPuzzle], usdtId)
374+ let investFndContract = contracts[dappInvestFund]
375+ let investFundTotal = (assetBalance(investFndContract, usdtId) + valueOrElse(getInteger(investFndContract, zbIssuedAmountKey), 0))
376+ let totalFundsUsd = ((economyUsd + wlgUsd) + investFundTotal)
377+ let wlgId = valueOrErrorMessage(getBinary(contracts[dappWlg], "wlg_assetId"), "Not initialized yet")
378+ let now = lastBlock.timestamp
379+ let issueTime = valueOrErrorMessage(getInteger(contracts[dappWlg], wlgIssueTimeKey), "Not initialized")
380+ let bankWlgold = assetBalance(contracts[dappStaking], wlgId)
381+ let teamTotal = fraction(MILLION6, TEAMSHARE, M6)
382+ let teamAmountLeft = valueOrElse(getInteger(contracts[dappWlg], teamAmountLeftKey), teamTotal)
383+ let lastTeamTime = valueOrElse(getInteger(contracts[dappWlg], lastTeamTimeKey), issueTime)
384+ let teamAddr = addressFromStringValue(value(getString(contracts[dappWlg], teamAddrKey)))
385+ let teamAmountAvailableNow = min([fraction(teamTotal, (now - lastTeamTime), (3 * YEARMILLIS)), teamAmountLeft])
386+ let teamWlgold = assetBalance(teamAddr, wlgId)
387+ let actTotal = fraction(MILLION6, ACTIVITYSHARE, M6)
388+ let actAmountLeft = valueOrElse(getInteger(contracts[dappWlg], actAmountLeftKey), actTotal)
389+ let lastActivitiesTime = valueOrElse(getInteger(contracts[dappWlg], lastActivitiesTimeKey), issueTime)
390+ let actAmountAvailableNow = min([fraction(actTotal, (now - lastActivitiesTime), (3 * YEARMILLIS)), actAmountLeft])
391+ let actWlgold = assetBalance(contracts[dappRest], wlgId)
392+ let lastUserTime = valueOrElse(getInteger(contracts[dappWlg], keyLastClaimedTimeByUser(userAddrOpt)), issueTime)
393+ let lastUserPeriod = ((lastUserTime - issueTime) / YEARMILLIS)
394+ let nowLimited = min([now, (issueTime + (3 * YEARMILLIS))])
395+ let curPeriod = min([((now - issueTime) / YEARMILLIS), 2])
396+ let eff = getLands(userAddrOpt, contracts[dappStaking], contracts[dappAcres])
397+ let curPeriodDistribution = distributionByPeriod(curPeriod)
398+ let $t079143 = if ((lastUserPeriod == curPeriod))
399+ then {
400+ let a0 = fraction(curPeriodDistribution, (nowLimited - lastUserTime), YEARMILLIS)
401+ let userPart = fraction(a0, userProportion6, M6)
402+ let effTime = (lastUserTime + fraction((nowLimited - lastUserTime), userProportion6, M6))
403+ $Tuple3(userPart, a0, effTime)
404+ }
405+ else if ((lastUserPeriod == (curPeriod - 1)))
406+ then {
407+ let a1 = fraction(distributionByPeriod((curPeriod - 1)), ((issueTime + (YEARMILLIS * curPeriod)) - lastUserTime), YEARMILLIS)
408+ let a0 = fraction(curPeriodDistribution, (nowLimited - (issueTime + (YEARMILLIS * curPeriod))), YEARMILLIS)
409+ let avail = (a1 + a0)
410+ let userPart = fraction(avail, userProportion6, M6)
411+ let effTime = if ((a1 >= userPart))
412+ then (lastUserTime + fraction(YEARMILLIS, userPart, distributionByPeriod((curPeriod - 1))))
413+ else ((issueTime + (YEARMILLIS * curPeriod)) + fraction(YEARMILLIS, (userPart - a1), curPeriodDistribution))
414+ $Tuple3(userPart, avail, effTime)
415+ }
416+ else {
417+ let a2 = fraction(distributionByPeriod((curPeriod - 2)), ((issueTime + (YEARMILLIS * (curPeriod - 1))) - lastUserTime), YEARMILLIS)
418+ let a1 = distributionByPeriod((curPeriod - 1))
419+ let a0 = fraction(curPeriodDistribution, (nowLimited - (issueTime + (YEARMILLIS * curPeriod))), YEARMILLIS)
420+ let avail = ((a2 + a1) + a0)
421+ let userPart = fraction(avail, userProportion6, M6)
422+ let effTime = if ((a2 >= userPart))
423+ then (lastUserTime + fraction(YEARMILLIS, userPart, distributionByPeriod((curPeriod - 2))))
424+ else if (((a2 + a1) >= userPart))
425+ then ((issueTime + (YEARMILLIS * (curPeriod - 1))) + fraction(YEARMILLIS, (userPart - a2), distributionByPeriod((curPeriod - 1))))
426+ else ((issueTime + (YEARMILLIS * curPeriod)) + fraction(YEARMILLIS, ((userPart - a2) - a1), curPeriodDistribution))
427+ $Tuple3(userPart, avail, effTime)
428+ }
429+ let userAmount = $t079143._1
430+ let userAvailable = $t079143._2
431+ let effLastTime = $t079143._3
432+ let sLandDailyAmount = fraction(fraction(curPeriodDistribution, DAYMILLIS, YEARMILLIS), 25, eff[idxTotalPieces])
433+ let amountLeftTotal = valueOrElse(getInteger(contracts[dappWlg], stakersAmountLeftKey), 0)
434+ let userTemp = fraction(userAmount, ((eff[idxUserPieces] * M8) + eff[idxUserAcres]), ((eff[idxTotalPieces] * M8) + eff[idxTotalAcres]))
435+ let bankFromUser = fraction(userTemp, BANK_FEE, M6)
436+ let robbedUser = (userTemp - bankFromUser)
437+ let unrobbedUser = fraction(userAvailable, ((eff[idxUserPieces] * M8) + eff[idxUserAcres]), ((eff[idxTotalPieces] * M8) + eff[idxTotalAcres]))
438+[issuedAmount, fraction((totalFundsUsd - USDT_TVL_CORRECTION), M8, issuedAmount), totalFundsUsd, economyUsd, restUsd, wlgUsd, puzzleUsd, issueTime, lastTeamTime, teamTotal, teamAmountLeft, teamAmountAvailableNow, teamWlgold, actTotal, actAmountLeft, actAmountAvailableNow, actWlgold, curPeriod, amountLeftTotal, curPeriodDistribution, lastUserTime, robbedUser, sLandDailyAmount, investFundTotal, unrobbedUser, effLastTime, bankWlgold]
439+ }
277440
278441
279442 let M6_ = 1000000
280443
281444 let M8_ = 100000000
282445
283446 let TEAM_SHARE = 200000
284447
285448 let ACTIVITY_SHARE = 100000
286449
287450 let PLAYER_SHARE = 400000
288451
289452 let YEAR_MILLIS = 31557600000
290453
291454 let DAY_MS = 86400000
292455
293456 let ISSUE10 = 1000000000
294457
295458 let PLAYERS10_SHARE = 800000
296459
297460 let MARKETING10_SHARE = 100000
298461
299462 let TEAM10_SHARE = 100000
300463
301464 let NEW_STAKING_START = 1731279600000
302465
303466 let marketingAddrKey = "marketingAddr"
304467
305468 let teamAdrKey = "teamAddr"
306469
307470 let lastTeamTimKey = "lastClaimedTime_team"
308471
309472 let teamAmtLeftKey = "teamAmountLeft"
310473
311474 let lastActivitiesTimKey = "lastClaimedTime_activities"
312475
313476 let actAmtLeftKey = "activitiesAmountLeft"
314477
315478 let stakersAmtLeftKey = "stakersAmountLeft"
316479
317480 func keyLastClaimTimeByUser (addr) = ("lastClaimedTimeUser_" + addr)
318481
319482
320483 func distrByPeriod (issuedAmount,period) = fraction(issuedAmount, (PLAYER_SHARE * (period + 1)), (6 * M6_))
321484
322485
323486 let wlgIssue10TimeKey = "wlg_issue10Time"
324487
325488 let wlgIssueTimKey = "wlg_issueTime"
326489
327490 let wlgIssuedAmtKey = "wlg_issuedAmount"
328491
329492 let zbIssuedAmtKey = "zbill_issuedAmount"
330493
331494 func keyAcresStakedAmtByUser (addr) = ("acresStakedAmountByUser_" + addr)
332495
333496
334497 let acresStakdTotalKey = "acresStakedAmountTotal"
335498
336499 let totalFarmingPowerKey = "totalFarmingPower"
337500
338501 let dapp2Rest = 0
339502
340503 let dapp2Staking = 1
341504
342505 let dapp2Wlg = 2
343506
344507 let dapp2Puzzle = 3
345508
346509 let dapp2InvestFund = 4
347510
348511 let DEFAULT_WEEKLY_PRIZES = 5
349512
350513 let ACRES_FOR_BET = 100000000
351514
352515 let keyNftTotalIssued = "nftTotalIssued"
353516
354517 let keyNftTotalBurned = "nftTotalBurned"
355518
356519 let keyWlNftTotalStaked = "WlNftTotalStaked"
357520
358521 func keyUserWlNftNumber (addr) = ("userWlNftNumber_" + addr)
359522
360523
361524 func keyUserFullBonus (addr) = ("userFullBonus_" + addr)
362525
363526
364527 let levelAcres = [0, 10, 20, 40, 80, 150, 250, 400, 700, 1000]
365528
366529 func getLevelByAcres (acres) = {
367530 let acr = ((acres + 99999999) / M8_)
368531 func checker (acc,item) = if ((item >= acr))
369532 then acc
370533 else (acc + 1)
371534
372535 let $l = levelAcres
373536 let $s = size($l)
374537 let $acc0 = 0
375538 func $f0_1 ($a,$i) = if (($i >= $s))
376539 then $a
377540 else checker($a, $l[$i])
378541
379542 func $f0_2 ($a,$i) = if (($i >= $s))
380543 then $a
381544 else throw("List size exceeds 10")
382545
383546 $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)
384547 }
385548
386549
387550 func getFarmingPowerByAcres (acres) = ((acres * 20) * (getLevelByAcres(acres) + 4))
388551
389552
390553 func getFarmingPowerByAcresAndBonus (acres,bonus6) = {
391554 let notBonused = getFarmingPowerByAcres(acres)
392555 $Tuple2(fraction(notBonused, (M6_ + bonus6), M6_), notBonused)
393556 }
394557
395558
396559 func getFarmingPowers (userAddrStrOrEmpty,acres2Contract) = {
397560 let totalFP = valueOrElse(getInteger(acres2Contract, totalFarmingPowerKey), 0)
398561 let userAcres = valueOrElse(getInteger(acres2Contract, keyAcresStakedAmtByUser(userAddrStrOrEmpty)), 0)
399562 let userBonus = valueOrElse(getInteger(acres2Contract, keyUserFullBonus(userAddrStrOrEmpty)), 0)
400563 let $t079143 = getFarmingPowerByAcresAndBonus(userAcres, userBonus)
401564 let userFPbonused = $t079143._1
402565 let userFPnotBonused = $t079143._2
403566 [totalFP, userFPbonused, userFPnotBonused, userBonus]
404567 }
405568
406569
407570 let idxTotalFP = 0
408571
409572 let idxUserFPbonused = 1
410573
411574 func getWlgStats2 (userAddrOpt,contracts,usdtId,usdtBalanceCorrection) = {
412575 let issuedAmount = valueOrErrorMessage(getInteger(contracts[dapp2Wlg], wlgIssuedAmtKey), "WLGOLD is not issued yet")
413576 let restUsd = assetBalance(contracts[dapp2Rest], usdtId)
414577 let wlgUsd = (assetBalance(contracts[dapp2Wlg], usdtId) - usdtBalanceCorrection)
415578 let puzzleUsd = assetBalance(contracts[dapp2Puzzle], usdtId)
416579 let acres2Usd = assetBalance(contracts[dapp2Staking], usdtId)
417580 let investFndContract = contracts[dapp2InvestFund]
418581 let investFundTotal = (assetBalance(investFndContract, usdtId) + valueOrElse(getInteger(investFndContract, zbIssuedAmtKey), 0))
419582 let totalFundsUsd = ((acres2Usd + wlgUsd) + investFundTotal)
420583 let wlgId = valueOrErrorMessage(getBinary(contracts[dapp2Wlg], "wlg_assetId"), "Not initialized yet")
421584 let now = lastBlock.timestamp
422585 let issueTime = valueOrErrorMessage(getInteger(contracts[dapp2Wlg], wlgIssueTimKey), "Not initialized")
423586 let wlgWlg = assetBalance(contracts[dapp2Wlg], wlgId)
424587 let teamTotal = fraction(issuedAmount, TEAM_SHARE, M6_)
425588 let teamAmountLeft = valueOrElse(getInteger(contracts[dapp2Wlg], teamAmtLeftKey), teamTotal)
426589 let lastTeamTime = valueOrElse(getInteger(contracts[dapp2Wlg], lastTeamTimKey), issueTime)
427590 let teamAddr = addressFromStringValue(value(getString(contracts[dapp2Wlg], teamAdrKey)))
428591 let teamAmountAvailableNow = min([fraction(teamTotal, (now - lastTeamTime), (3 * YEAR_MILLIS)), teamAmountLeft])
429592 let teamWlgold = assetBalance(teamAddr, wlgId)
430593 let actTotal = fraction(issuedAmount, ACTIVITY_SHARE, M6_)
431594 let actAmountLeft = valueOrElse(getInteger(contracts[dapp2Wlg], actAmtLeftKey), actTotal)
432595 let lastActivitiesTime = valueOrElse(getInteger(contracts[dapp2Wlg], lastActivitiesTimKey), issueTime)
433596 let actAmountAvailableNow = min([fraction(actTotal, (now - lastActivitiesTime), (3 * YEAR_MILLIS)), actAmountLeft])
434597 let actWlgold = assetBalance(contracts[dapp2Rest], wlgId)
435598 let lastUserTime = valueOrElse(getInteger(contracts[dapp2Wlg], keyLastClaimTimeByUser(userAddrOpt)), issueTime)
436599 let lastUserPeriod = ((lastUserTime - issueTime) / YEAR_MILLIS)
437600 let nowLimited = min([now, (issueTime + (3 * YEAR_MILLIS))])
438601 let curPeriod = min([((now - issueTime) / YEAR_MILLIS), 2])
439602 let eff = getFarmingPowers(userAddrOpt, contracts[dapp2Staking])
440603 let curPeriodDistribution = distrByPeriod(issuedAmount, curPeriod)
441604 let prevPeriodEnd = (issueTime + (YEAR_MILLIS * curPeriod))
442605 let prevPrevPeriodEnd = (issueTime + (YEAR_MILLIS * (curPeriod - 1)))
443606 let a0 = fraction(curPeriodDistribution, (nowLimited - lastUserTime), YEAR_MILLIS)
444607 let userAvailable = if ((lastUserPeriod == curPeriod))
445608 then a0
446609 else if ((lastUserPeriod == (curPeriod - 1)))
447610 then {
448611 let a1 = fraction(distrByPeriod(issuedAmount, (curPeriod - 1)), (prevPeriodEnd - lastUserTime), YEAR_MILLIS)
449612 (a1 + a0)
450613 }
451614 else {
452615 let a2 = fraction(distrByPeriod(issuedAmount, (curPeriod - 2)), (prevPrevPeriodEnd - lastUserTime), YEAR_MILLIS)
453616 let a1 = distrByPeriod(issuedAmount, (curPeriod - 1))
454617 ((a2 + a1) + a0)
455618 }
456619 let amountLeftTotal = valueOrElse(getInteger(contracts[dapp2Wlg], stakersAmtLeftKey), 0)
457620 let userAmount = if ((eff[idxTotalFP] != 0))
458621 then fraction(userAvailable, eff[idxUserFPbonused], eff[idxTotalFP])
459622 else 0
460623 let lastIssue10Time = valueOrElse(getInteger(contracts[dapp2Wlg], wlgIssue10TimeKey), NEW_STAKING_START)
461624 let issue10Amount = fraction(ISSUE10, max([(now - lastIssue10Time), 0]), DAY_MS)
462625 let marketingIssue10Amount = fraction(issue10Amount, MARKETING10_SHARE, M6_)
463626 let teamIssue10Amount = fraction(issue10Amount, TEAM10_SHARE, M6_)
464627 let user10Interval = max([(now - max([NEW_STAKING_START, lastUserTime])), 0])
465628 let user10part = if ((eff[idxTotalFP] != 0))
466629 then fraction(fraction(fraction(ISSUE10, user10Interval, DAY_MS), eff[idxUserFPbonused], eff[idxTotalFP]), PLAYERS10_SHARE, M6_)
467630 else 0
468631 let newIssue10Time = max([NEW_STAKING_START, now])
469632 let acresStakedTotal = valueOrElse(getInteger(contracts[dapp2Staking], acresStakdTotalKey), 0)
470633 let nftTotalIssued = valueOrElse(getInteger(contracts[dapp2Staking], keyNftTotalIssued), 0)
471634 let nftTotalBurned = valueOrElse(getInteger(contracts[dapp2Staking], keyNftTotalBurned), 0)
472635 let wlNftTotalStaked = valueOrElse(getInteger(contracts[dapp2Staking], keyWlNftTotalStaked), 0)
473636 let wlNftUserStaked = valueOrElse(getInteger(contracts[dapp2Staking], keyUserWlNftNumber(valueOrElse(userAddrOpt, ""))), 0)
474637 [issuedAmount, wlgWlg, fraction(totalFundsUsd, M8_, issuedAmount), totalFundsUsd, restUsd, acres2Usd, wlgUsd, puzzleUsd, issueTime, lastTeamTime, teamTotal, teamAmountLeft, teamAmountAvailableNow, teamWlgold, actTotal, actAmountLeft, actAmountAvailableNow, actWlgold, curPeriod, amountLeftTotal, curPeriodDistribution, lastUserTime, investFundTotal, userAmount, nowLimited, issue10Amount, marketingIssue10Amount, teamIssue10Amount, user10part, newIssue10Time, eff[idxTotalFP], acresStakedTotal, nftTotalIssued, nftTotalBurned, wlNftTotalStaked, wlNftUserStaked]
475638 }
476639
477640
478641 let profitAddrKey = "profitAddr"
479642
480643 let stakersAmountPaidTotalKey = "stakersAmountPaidTotal"
481644
482645 func keyStakersAmountPaidUser (addr) = ("stakersAmountPaidUser_" + addr)
483646
484647
485648 func prolog2 () = asInt(reentrantInvoke(acres2Contract, "saveLastTx", nil, nil))
486649
487650
488651 func getSwapLimitWlgold (addr) = {
489652 let lastTime = valueOrElse(getInteger(keyLastWlgTradeTimeByUser(addr)), 0)
490653 let defaultLimit = valueOrElse(getInteger(acres2Contract, keyAcresStakedAmountByUser(addr)), 0)
491654 let lastLimitLeft = valueOrElse(getInteger(keyLastWlgTradeLimitByUser(addr)), defaultLimit)
492655 let currentLimit = (lastLimitLeft + fraction(defaultLimit, (lastBlock.timestamp - lastTime), DAY_MILLIS))
493656 min([currentLimit, defaultLimit])
657+ }
658+
659+
660+let idxWlgTeamAmLeft = 10
661+
662+let idxWlgTeamAmAvailNow = 11
663+
664+let idxWlgActAmLeft = 14
665+
666+let idxWlgActAmAvailNow = 15
667+
668+let idxWlgAmLeftTotal = 18
669+
670+let idxWlgUserAmAvailNow = 21
671+
672+let idxWlgUserTotalAvail = 24
673+
674+let idxWlgEffUserTime = 25
675+
676+func claimInternal (addr) = {
677+ let caller = addressFromStringValue(addr)
678+ let economyContract = addressFromStringValue(economyContractStr)
679+ let curStats = getWlgStats(addr, [restContract, stakingContract, economyContract, wlgContract, puzzlePoolContract, investFundContract, acresContract], usdtAssetId, 0, MULT6)
680+ let now = lastBlock.timestamp
681+ let teamAmountLeft = curStats[idxWlgTeamAmLeft]
682+ let teamAmount = curStats[idxWlgTeamAmAvailNow]
683+ let actAmountLeft = curStats[idxWlgActAmLeft]
684+ let actAmount = curStats[idxWlgActAmAvailNow]
685+ let userAmount = curStats[idxWlgUserAmAvailNow]
686+ let userKey = keyStakersAmountPaidUser(addr)
687+ let userTotal = curStats[idxWlgUserTotalAvail]
688+ let userEffTime = curStats[idxWlgEffUserTime]
689+ $Tuple2([ScriptTransfer(addressFromStringValue(value(getString(teamAddrKey))), teamAmount, wlgAssetId), ScriptTransfer(restContract, actAmount, wlgAssetId), IntegerEntry(userKey, (valueOrElse(getInteger(userKey), 0) + userAmount)), IntegerEntry(stakersAmountPaidTotalKey, (valueOrElse(getInteger(stakersAmountPaidTotalKey), 0) + userTotal)), IntegerEntry(stakersAmountLeftKey, (curStats[idxWlgAmLeftTotal] - userTotal)), IntegerEntry(teamAmountLeftKey, (teamAmountLeft - teamAmount)), IntegerEntry(lastTeamTimeKey, now), IntegerEntry(actAmountLeftKey, (actAmountLeft - actAmount)), IntegerEntry(lastActivitiesTimeKey, now), IntegerEntry(keyLastClaimedTimeByUser(addr), userEffTime)], userAmount)
494690 }
495691
496692
497693 func claimInternal2 (addr) = {
498694 let curStats = getWlgStats2(addr, [rest2Contract, acres2Contract, wlgContract, puzzlePoolContract, investFundContract], usdtAssetId, 0)
499695 let userTimeKey = keyLastClaimTimeByUser(addr)
500696 let lastUserTime = valueOrElse(getInteger(userTimeKey), 0)
501697 let userEffTime = curStats[ixWlgEffUserTime]
502698 if ((lastUserTime == userEffTime))
503699 then $Tuple2(nil, 0)
504700 else {
505701 let now = lastBlock.timestamp
506702 let issueTime = curStats[ixWlgIssueTime]
507703 let teamAmountLeft = curStats[ixWlgTeamAmLeft]
508704 let teamAmount = (curStats[ixWlgTeamAmAvailNow] + curStats[ixWlgTeamIssue10Amount])
509705 let teamTransfer = if ((teamAmount > 0))
510706 then [ScriptTransfer(addressFromStringValue(value(getString(teamAddrKey))), teamAmount, wlgAssetId)]
511707 else nil
512708 let actAmountLeft = curStats[ixWlgActAmLeft]
513709 let actAmount = curStats[ixWlgActAmAvailNow]
514710 let actTransfer = if ((actAmount > 0))
515711 then [ScriptTransfer(restContract, actAmount, wlgAssetId)]
516712 else nil
517713 let marketingAmount = curStats[ixWlgMarketingIssue10Amount]
518714 let marketingTransfer = if ((marketingAmount > 0))
519715 then [ScriptTransfer(addressFromStringValue(value(getString(marketingAddrKey))), marketingAmount, wlgAssetId)]
520716 else nil
521717 let userAmount = curStats[ixWlgUserAmAvailNow]
522718 let userKey = keyStakersAmountPaidUser(addr)
523719 let userTotal = (userAmount + curStats[ixWlgUser10part])
524720 let issued10Amount = curStats[ixWlgIssue10Amount]
525721 $Tuple2(((([Reissue(wlgAssetId, issued10Amount, true), IntegerEntry(wlgIssuedAmountKey, (curStats[ixWlgAmount] + issued10Amount)), IntegerEntry(wlgIssue10TimeKey, curStats[ixWlgIssue10Time]), IntegerEntry(userKey, (valueOrElse(getInteger(userKey), 0) + userAmount)), IntegerEntry(stakersAmountPaidTotalKey, (valueOrElse(getInteger(stakersAmountPaidTotalKey), 0) + userAmount)), IntegerEntry(stakersAmountLeftKey, (curStats[ixWlgAmLeftTotal] - userAmount)), IntegerEntry(teamAmountLeftKey, ((teamAmountLeft - teamAmount) + curStats[ixWlgTeamIssue10Amount])), IntegerEntry(lastTeamTimeKey, now), IntegerEntry(actAmountLeftKey, (actAmountLeft - actAmount)), IntegerEntry(lastActivitiesTimeKey, now), IntegerEntry(userTimeKey, userEffTime)] ++ teamTransfer) ++ actTransfer) ++ marketingTransfer), userTotal)
526722 }
527723 }
528724
529725
530726 func takeXpInternal (addr,delta) = {
531727 let now = lastBlock.timestamp
532728 let timeKey = keyWlgStakedTimeByUser(addr)
533729 let amountKey = keyWlgStakedAmountByUser(addr)
534730 let lastTime = valueOrElse(getInteger(timeKey), 0)
535731 let oldUser = valueOrElse(getInteger(amountKey), 0)
536732 let oldTotal = valueOrElse(getInteger(wlgStakedTotalKey), 0)
537733 let xp = fraction(fraction(xpWlg, oldUser, wlgBaseAmountXp), (lastTime - now), DAYMILLIS)
538734 $Tuple3([IntegerEntry(timeKey, now), IntegerEntry(amountKey, (oldUser + delta)), IntegerEntry(wlgStakedTotalKey, (oldTotal + delta))], xp, oldUser)
539735 }
540736
541737
542738 func openChestInternal (addr) = {
543739 let week = (height / WEEK_BLOCKS)
544740 let drawWeek = (week - 1)
545741 let numPrizes = valueOrElse(getInteger(keyNumNFT2Draw(drawWeek)), DEFAULT_WEEKLY_PRIZES)
546742 let prizesDrawn = valueOrElse(getInteger(keyNumNFTDrawn(drawWeek)), 0)
547743 let userTickets = valueOrElse(getInteger(keyUserWeekTickets(addr, drawWeek)), 0)
548744 if ((0 >= userTickets))
549745 then $Tuple2(nil, unit)
550746 else {
551747 let weekTickets = valueOrElse(getInteger(keyTotalWeekTickets(drawWeek)), 0)
552748 if ((0 >= weekTickets))
553749 then $Tuple2([DeleteEntry(keyUserWeekTickets(addr, drawWeek))], unit)
554750 else {
555751 let entropy = value(value(blockInfoByHeight((week * WEEK_BLOCKS))).vrf)
556752 let salt = fromBase58String(split(valueOrElse(getString(acres2Contract, keyLastWeekTxIdByUser(addr)), "42_DEFAULT"), "_")[1])
557753 let random = getRandomNumber(weekTickets, salt, entropy)
558754 if (((userTickets * numPrizes) > random))
559755 then {
560756 let issueResult = invoke(acres2Contract, "issuePickC1", [addr], nil)
561757 let winners = getString(keyWeekWinners(drawWeek))
562758 let newWinners = if (isDefined(winners))
563759 then ((value(winners) + "_") + addr)
564760 else addr
565761 $Tuple2([IntegerEntry(keyNumNFTDrawn(drawWeek), (prizesDrawn + 1)), DeleteEntry(keyUserWeekTickets(addr, drawWeek)), StringEntry(keyWeekWinners(drawWeek), newWinners)], issueResult)
566762 }
567763 else {
568764 let random1 = (getRandomNumber(9, (base58'29' + salt), entropy) + 1)
569765 let consTickets = fraction(userTickets, random1, 10)
570766 let ticketsKey = keyUserWeekTickets(addr, week)
571767 let oldTickets = valueOrElse(getInteger(ticketsKey), 0)
572768 $Tuple2(((if ((consTickets == 0))
573769 then nil
574770 else {
575771 let commonActions = [IntegerEntry(keyTotalWeekTickets(week), (valueOrElse(getInteger(keyTotalWeekTickets(week)), 0) + consTickets)), IntegerEntry(ticketsKey, (oldTickets + consTickets))]
576772 if ((oldTickets > 0))
577773 then commonActions
578774 else (commonActions :+ IntegerEntry(keyTotalWeekParticipants(week), (valueOrElse(getInteger(keyTotalWeekParticipants(week)), 0) + 1)))
579775 }) :+ DeleteEntry(keyUserWeekTickets(addr, drawWeek))), consTickets)
580776 }
581777 }
582778 }
583779 }
584780
585781
586782 func claimTicketsInternal (addr,userBetStr) = {
587783 let week = (height / WEEK_BLOCKS)
588784 let ticketsKey = keyUserWeekTickets(addr, week)
589785 let dayBet = split(userBetStr, "_")
590786 let oldTotalTickets = valueOrElse(getInteger(keyTotalWeekTickets(week)), 0)
591787 let oldTickets = valueOrElse(getInteger(ticketsKey), 0)
592788 let deltaTickets = if ((winningBet(parseIntValue(dayBet[0])) == parseIntValue(dayBet[1])))
593789 then 1
594790 else 0
595791 let oldParticipants = valueOrElse(getInteger(keyTotalWeekParticipants(week)), 0)
596792 let updateParticipants = if (if ((oldTickets == 0))
597793 then (deltaTickets == 1)
598794 else false)
599795 then [IntegerEntry(keyTotalWeekParticipants(week), (oldParticipants + 1))]
600796 else nil
601797 $Tuple2(if ((deltaTickets == 0))
602798 then nil
603799 else ((updateParticipants :+ IntegerEntry(ticketsKey, (oldTickets + deltaTickets))) :+ IntegerEntry(keyTotalWeekTickets(week), (oldTotalTickets + deltaTickets))), deltaTickets)
604800 }
605801
606802
607803 @Callable(i)
608804 func constructorV1 (restAddr,marketingAddr,teamAddr,profitAddr) = if ((i.caller != this))
609805 then throw("Permission denied")
610806 else if (isDefined(getBinary(wlgAssetIdKey)))
611807 then throw("Already initialized")
612808 else {
613809 let issuedAmount = MILLION6
614810 let issue = Issue("WLGOLD", "WavesLands Gold investment token", issuedAmount, 8, true, unit, 0)
615811 let assetId = calculateAssetId(issue)
616812 [issue, IntegerEntry(wlgIssueTimeKey, lastBlock.timestamp), IntegerEntry(wlgIssuedAmountKey, issuedAmount), IntegerEntry(stakersAmountPaidTotalKey, 0), IntegerEntry(stakersAmountLeftKey, fraction(MILLION6, PLAYERSHARE, MULT6)), BinaryEntry(wlgAssetIdKey, assetId), StringEntry(keyRestAddress(), restAddr), StringEntry(marketingAddrKey, marketingAddr), StringEntry(teamAddrKey, teamAddr), StringEntry(profitAddrKey, profitAddr)]
617813 }
618814
619815
620816
621817 @Callable(i)
622818 func constructorV2 (rest2Addr) = if ((i.caller != this))
623819 then throw("Permission denied")
624820 else [StringEntry(keyRest2Address(), rest2Addr)]
625821
626822
627823
628824 @Callable(i)
629825 func buyWlg (minToReceive) = {
630826 let prologResult = prolog2()
631827 if ((prologResult == prologResult))
632828 then if ((size(i.payments) != 1))
633829 then throw("exactly 1 payment must be attached")
634830 else {
635831 let pmt = i.payments[0]
636832 let usdtAmt = pmt.amount
637833 if (if (!(isDefined(pmt.assetId)))
638834 then true
639835 else (value(pmt.assetId) != usdtAssetId))
640836 then throw("USDT payments only!")
641837 else {
642838 let caller = i.caller
643839 let addr = toString(caller)
644840 if ((MINSHOPPAYMENT > usdtAmt))
645841 then throw((("You can trade min " + fixedPoint(MINSHOPPAYMENT, 6)) + " USDT"))
646842 else {
647843 let curStats = getWlgStats2("", [rest2Contract, acres2Contract, wlgContract, puzzlePoolContract, investFundContract], usdtAssetId, usdtAmt)
648844 let curWlgAmount = curStats[ixWlgAmount]
649845 let wlgPrice = curStats[ixWlgPrice]
650846 let buyPrice = fraction(wlgPrice, 6, 5, CEILING)
651847 let wlgAmount = fraction(usdtAmt, MULT8, buyPrice)
652848 let maxWlg = getSwapLimitWlgold(addr)
653849 if ((wlgAmount > maxWlg))
654850 then throw((("You can get max " + fixedPoint(maxWlg, 8)) + " WLGOLD at the moment"))
655851 else if ((minToReceive > wlgAmount))
656852 then throw("Price changed during operation, please try again")
657853 else {
658854 let profitAmount = (usdtAmt / 6)
659855 $Tuple2([Reissue(wlgAssetId, wlgAmount, true), IntegerEntry(wlgIssuedAmountKey, (curWlgAmount + wlgAmount)), IntegerEntry(keyLastWlgTradeTimeByUser(addr), lastBlock.timestamp), IntegerEntry(keyLastWlgTradeLimitByUser(addr), (maxWlg - wlgAmount)), ScriptTransfer(addressFromStringValue(value(getString(profitAddrKey))), profitAmount, usdtAssetId), ScriptTransfer(caller, wlgAmount, wlgAssetId)], prologResult)
660856 }
661857 }
662858 }
663859 }
664860 else throw("Strict value is not equal to itself.")
665861 }
666862
667863
668864
669865 @Callable(i)
670866 func buyWlgREADONLY (address,usdtAmt) = {
671867 let curStats = getWlgStats2("", [rest2Contract, acres2Contract, wlgContract, puzzlePoolContract, investFundContract], usdtAssetId, usdtAmt)
672868 let wlgPrice = curStats[ixWlgPrice]
673869 let buyPrice = fraction(wlgPrice, 6, 5, CEILING)
674870 let wlgAmount = fraction(usdtAmt, MULT8, buyPrice)
675871 let maxWlg = getSwapLimitWlgold(address)
676872 let maxUsdt = fraction(maxWlg, buyPrice, MULT8)
677873 let profitAmount = (usdtAmt / 6)
678874 $Tuple2(nil, [wlgAmount, MINSHOPPAYMENT, maxUsdt, profitAmount])
679875 }
680876
681877
682878
683879 @Callable(i)
684880 func sellWlg (minAmount) = {
685881 let prologResult = prolog2()
686882 if ((prologResult == prologResult))
687883 then if ((size(i.payments) != 1))
688884 then throw("exactly 1 payment must be attached")
689885 else {
690886 let pmt = i.payments[0]
691887 let wlgAmt = pmt.amount
692888 let caller = i.caller
693889 let addr = toString(caller)
694890 let maxWlg = getSwapLimitWlgold(addr)
695891 if ((wlgAmt > maxWlg))
696892 then throw((("You can spend max " + fixedPoint(maxWlg, 8)) + " WLGOLD at the moment"))
697893 else if (if (!(isDefined(pmt.assetId)))
698894 then true
699895 else (value(pmt.assetId) != wlgAssetId))
700896 then throw("WLGOLD payments only!")
701897 else {
702898 let curStats = getWlgStats2("", [rest2Contract, acres2Contract, wlgContract, puzzlePoolContract, investFundContract], usdtAssetId, 0)
703899 let curWlgAmount = curStats[ixWlgAmount]
704900 let sellPrice = (curStats[ixWlgPrice] / 2)
705901 let usdtAmt = fraction(wlgAmt, sellPrice, MULT8)
706902 if ((MINSHOPPAYMENT > usdtAmt))
707903 then throw((("You can trade min " + fixedPoint(MINSHOPPAYMENT, 6)) + " USDT"))
708904 else if ((minAmount > usdtAmt))
709905 then throw("Price changed during operation, please try again")
710906 else {
711907 let profitAmount = (usdtAmt / 5)
712908 $Tuple2([Burn(wlgAssetId, wlgAmt), IntegerEntry(wlgIssuedAmountKey, (curWlgAmount - wlgAmt)), IntegerEntry(keyLastWlgTradeTimeByUser(addr), lastBlock.timestamp), IntegerEntry(keyLastWlgTradeLimitByUser(addr), (maxWlg - wlgAmt)), ScriptTransfer(addressFromStringValue(value(getString(profitAddrKey))), profitAmount, usdtAssetId), ScriptTransfer(caller, usdtAmt, usdtAssetId)], prologResult)
713909 }
714910 }
715911 }
716912 else throw("Strict value is not equal to itself.")
717913 }
718914
719915
720916
721917 @Callable(i)
722918 func sellWlgREADONLY (address,wlgAmt) = {
723919 let maxWlg = getSwapLimitWlgold(address)
724920 let curStats = getWlgStats2("", [rest2Contract, acres2Contract, wlgContract, puzzlePoolContract, investFundContract], usdtAssetId, 0)
725921 let sellPrice = (curStats[ixWlgPrice] / 2)
726922 let usdtAmt = fraction(wlgAmt, sellPrice, MULT8)
727923 let minWlg = fraction(MINSHOPPAYMENT, MULT8, sellPrice)
728924 let profitAmount = (usdtAmt / 5)
729925 $Tuple2(nil, [usdtAmt, minWlg, maxWlg, profitAmount])
730926 }
731927
732928
733929
734930 @Callable(i)
735931 func claim () = {
736932 let prologResult = prolog2()
737933 if ((prologResult == prologResult))
738934 then if ((size(i.payments) != 0))
739935 then throw("No payments required")
740936 else {
741- let $t01421414283 = claimInternal2(toString(i.caller))
742- let actions = $t01421414283._1
743- let wlgClaimedAmount = $t01421414283._2
937+ let $t01639716466 = claimInternal2(toString(i.caller))
938+ let actions = $t01639716466._1
939+ let wlgClaimedAmount = $t01639716466._2
744940 $Tuple2((actions :+ ScriptTransfer(i.caller, wlgClaimedAmount, wlgAssetId)), prologResult)
745941 }
746942 else throw("Strict value is not equal to itself.")
747943 }
748944
749945
750946
751947 @Callable(i)
752-func onStakeUnstakeLand (addr) = if (if (if ((i.caller != stakingContract))
948+func onStakeUnstakeLand (addr,isNew) = if (if (if ((i.caller != stakingContract))
753949 then (i.caller != acresContract)
754950 else false)
755951 then (i.caller != acres2Contract)
756952 else false)
757953 then throw("Permission denied")
758954 else {
759- let $t01460214656 = claimInternal2(addr)
760- let actions = $t01460214656._1
761- let wlgClaimedAmount = $t01460214656._2
955+ let $t01680216897 = if (isNew)
956+ then claimInternal2(addr)
957+ else claimInternal(addr)
958+ let actions = $t01680216897._1
959+ let wlgClaimedAmount = $t01680216897._2
762960 $Tuple2(if ((wlgClaimedAmount > 0))
763961 then (actions :+ ScriptTransfer(addressFromStringValue(addr), wlgClaimedAmount, wlgAssetId))
764962 else actions, wlgClaimedAmount)
765963 }
766964
767965
768966
769967 @Callable(i)
770968 func burnWlgold (wlgAmt) = if ((i.caller != acres2Contract))
771969 then throw("Permission denied")
772970 else {
773971 let curStats = getWlgStats2("", [rest2Contract, acres2Contract, wlgContract, puzzlePoolContract, investFundContract], usdtAssetId, 0)
774972 if ((wlgAmt > curStats[ixWlgWlg]))
775973 then throw(((("Only " + fixedPoint(curStats[ixWlgWlg], 8)) + " WLGOLD left on contract, can't burn ") + fixedPoint(wlgAmt, 8)))
776974 else {
777975 let wlgAmountLeft = (curStats[ixWlgAmount] - wlgAmt)
778976 $Tuple2([Burn(wlgAssetId, wlgAmt), IntegerEntry(wlgIssuedAmountKey, wlgAmountLeft)], wlgAmountLeft)
779977 }
780978 }
781979
782980
783981
784982 @Callable(i)
785983 func betForTicket (bet) = {
786984 let prologResult = prolog2()
787985 if ((prologResult == prologResult))
788986 then if ((size(i.payments) != 0))
789987 then throw("No payments required")
790988 else {
791989 let addr = toString(i.caller)
792990 let drawWeek = ((height / WEEK_BLOCKS) - 1)
793991 let userTickets = valueOrElse(getInteger(keyUserWeekTickets(addr, drawWeek)), 0)
794992 let weekTickets = valueOrElse(getInteger(keyTotalWeekTickets(drawWeek)), 0)
795993 if (if ((userTickets > 0))
796994 then (weekTickets > 0)
797995 else false)
798996 then throw("Please open the chest first")
799997 else if (((bet / 4) != 0))
800998 then throw("Invalid bet: should be 0..3")
801999 else {
8021000 let moment = (height % DAY_BLOCKS)
8031001 if ((moment > (DAY_BLOCKS - 3)))
8041002 then throw((("Cannot bet: the day is almost ended, please wait " + toString((DAY_BLOCKS - moment))) + " blocks"))
8051003 else {
8061004 let stakedAcres = valueOrElse(getInteger(acres2Contract, keyAcresStakedAmtByUser(addr)), 0)
8071005 if ((ACRES_FOR_BET > stakedAcres))
8081006 then throw((("You need to stake at least " + fixedPoint(ACRES_FOR_BET, 8)) + " ACRES to bet"))
8091007 else {
8101008 let tomorrow = ((height / DAY_BLOCKS) + 1)
8111009 let betKey = keyUserBet(addr)
8121010 let oldUserBetStr = getString(betKey)
8131011 let newBetEntry = StringEntry(betKey, ((toString(tomorrow) + "_") + toString(bet)))
8141012 if (isDefined(oldUserBetStr))
8151013 then {
8161014 let userBet = value(oldUserBetStr)
8171015 if ((split(userBet, "_")[0] == toString(tomorrow)))
8181016 then throw("You already bet for tomorrow")
8191017 else {
8201018 let r = claimTicketsInternal(addr, userBet)
8211019 $Tuple2((r._1 :+ newBetEntry), r._2)
8221020 }
8231021 }
8241022 else $Tuple2([newBetEntry], 0)
8251023 }
8261024 }
8271025 }
8281026 }
8291027 else throw("Strict value is not equal to itself.")
8301028 }
8311029
8321030
8331031
8341032 @Callable(i)
8351033 func takeWlgXp (addr) = if ((i.caller != stakingContract))
8361034 then throw("Permission denied")
8371035 else {
838- let $t01726617309 = takeXpInternal(addr, 0)
839- let actions = $t01726617309._1
840- let xp = $t01726617309._2
1036+ let $t01950719550 = takeXpInternal(addr, 0)
1037+ let actions = $t01950719550._1
1038+ let xp = $t01950719550._2
8411039 $Tuple2(actions, xp)
8421040 }
8431041
8441042
8451043
8461044 @Callable(i)
8471045 func checkWlgXpREADONLY (addr) = {
848- let $t01738617434 = takeXpInternal(addr, 0)
849- let ignored = $t01738617434._1
850- let deltaXP = $t01738617434._2
1046+ let $t01962719675 = takeXpInternal(addr, 0)
1047+ let ignored = $t01962719675._1
1048+ let deltaXP = $t01962719675._2
8511049 let newXP = (valueOrElse(getInteger(stakingContract, keyUserXP(addr)), 0) + deltaXP)
8521050 let lvlPoints = levelUp(valueOrElse(getInteger(stakingContract, keyUserLevel(addr)), 0), newXP)
8531051 $Tuple2(nil, (lvlPoints :+ newXP))
8541052 }
8551053
8561054
8571055
8581056 @Callable(i)
8591057 func setNumPrizes (numPrizes) = if ((i.caller != this))
8601058 then throw("Permission denied")
8611059 else {
8621060 let week = (height / WEEK_BLOCKS)
8631061 $Tuple2([IntegerEntry(keyNumNFT2Draw(week), numPrizes)], numPrizes)
8641062 }
8651063
8661064
8671065
8681066 @Callable(i)
8691067 func openChest () = {
8701068 let prologResult = prolog2()
8711069 if ((prologResult == prologResult))
8721070 then if ((size(i.payments) != 0))
8731071 then throw("No payments required")
8741072 else {
8751073 let drawWeek = ((height / WEEK_BLOCKS) - 1)
8761074 let addr = toString(i.caller)
8771075 let userTickets = valueOrElse(getInteger(keyUserWeekTickets(addr, drawWeek)), 0)
8781076 if ((0 >= userTickets))
8791077 then throw("No gems to open the chest")
8801078 else openChestInternal(addr)
8811079 }
8821080 else throw("Strict value is not equal to itself.")
8831081 }
8841082
8851083
8861084
8871085 @Callable(i)
8881086 func addGemsFor (addr,deltaTickets) = if ((i.caller != this))
8891087 then throw("Permission denied")
8901088 else {
8911089 let week = (height / WEEK_BLOCKS)
8921090 let ticketsKey = keyUserWeekTickets(addr, week)
8931091 let oldTotalTickets = valueOrElse(getInteger(keyTotalWeekTickets(week)), 0)
8941092 let oldTickets = valueOrElse(getInteger(ticketsKey), 0)
8951093 let oldParticipants = valueOrElse(getInteger(keyTotalWeekParticipants(week)), 0)
8961094 let updateParticipants = if (if ((oldTickets == 0))
8971095 then (deltaTickets == 1)
8981096 else false)
8991097 then [IntegerEntry(keyTotalWeekParticipants(week), (oldParticipants + 1))]
9001098 else nil
9011099 $Tuple2(((updateParticipants :+ IntegerEntry(ticketsKey, (oldTickets + deltaTickets))) :+ IntegerEntry(keyTotalWeekTickets(week), (oldTotalTickets + deltaTickets))), deltaTickets)
9021100 }
9031101
9041102

github/deemru/w8io/026f985 
106.95 ms