tx · Fz3garjVGrjr9DDgv3AVf6FpmjwR5vfs1ctvEm2uz481

3NAefciWv6f9fWvEXdGgpHfanJFG8HqfjuT:  -0.03300000 Waves

2022.11.30 10:24 [2339550] smart account 3NAefciWv6f9fWvEXdGgpHfanJFG8HqfjuT > SELF 0.00000000 Waves

{ "type": 13, "id": "Fz3garjVGrjr9DDgv3AVf6FpmjwR5vfs1ctvEm2uz481", "fee": 3300000, "feeAssetId": null, "timestamp": 1669793062843, "version": 1, "sender": "3NAefciWv6f9fWvEXdGgpHfanJFG8HqfjuT", "senderPublicKey": "D1BL65meykxFZTCuq7jq9HSGLLnWvQamQPUNrguW5w39", "proofs": [ "ds1nASTUk86SdBqQ64QPZ2MAfd6xeKt4fiKHLtwPcDdC7rm68Ydc1bR54SgTdzjxjpXAeStUP8HkPje3nmxMnVA" ], "script": "base64:BgLZJggCEgMKAQgSAwoBCBIAEgQKAgEEEgQKAgEEEgMKAQESABIECgIIARIAEgQKAggBEgQKAggBEgQKAgEBEgMKAQESBQoDAQEBEgUKAwEIARIECgIBCBIECgIBCBIECgIICBIECgIICBIECgIIARIAEgMKAQgSBQoDAQEBEgQKAggBEgQKAgEBEgQKAggIEgsKCQgBAQIBAggEBBIGCgQICAEIEgAiBnNjYWxlOCIMc2NhbGU4QmlnSW50IgdzY2FsZTE4Igp6ZXJvQmlnSW50IgRiaWcwIgRiaWcxIgRiaWcyIgpzbGlwcGFnZTREIgt3YXZlc1N0cmluZyIFQW11bHQiBURjb252IgNTRVAiBUVNUFRZIgpQb29sQWN0aXZlIgpQb29sUHV0RGlzIg5Qb29sTWF0Y2hlckRpcyIMUG9vbFNodXRkb3duIg5pZHhQb29sQWRkcmVzcyIJaWR4UG9vbFN0IglpZHhMUEFzSWQiCWlkeEFtQXNJZCIJaWR4UHJBc0lkIgtpZHhBbXRBc0RjbSINaWR4UHJpY2VBc0RjbSILaWR4SUFtdEFzSWQiDWlkeElQcmljZUFzSWQiD2lkeEZhY3RTdGFrQ250ciISaWR4RmFjdG9yeVJlc3RDbnRyIhBpZHhGYWN0U2xpcHBDbnRyIhFpZHhGYWN0R3d4UmV3Q250ciIKZmVlRGVmYXVsdCICdDEiB29yaWdWYWwiDW9yaWdTY2FsZU11bHQiAmYxIgN2YWwiD3Jlc3VsdFNjYWxlTXVsdCICdHMiA2FtdCIIcmVzU2NhbGUiCGN1clNjYWxlIgNhYnMiCWFic0JpZ0ludCICZmMiA21wayIEcG1wayICcGwiAnBoIgFoIgF0IgNwYXUiAnVhIgR0eElkIgNnYXUiAmFhIgJwYSIDYW1wIgNhZGEiBmtleUZlZSIDZmVlIgZrZXlETHAiFWtleURMcFJlZnJlc2hlZEhlaWdodCISa2V5RExwUmVmcmVzaERlbGF5IhZkTHBSZWZyZXNoRGVsYXlEZWZhdWx0Ig9kTHBSZWZyZXNoRGVsYXkiBGZjZmciBG10cGsiAnBjIgZpQW10QXMiBWlQckFzIgNtYmEiBWJBU3RyIgNhcHMiHGtleUFsbG93ZWRMcFN0YWJsZVNjcmlwdEhhc2giFmtleUZlZUNvbGxlY3RvckFkZHJlc3MiA3RvZSIDb3JWIgZzZW5kclYiBm1hdGNoViIDc3RyIgckbWF0Y2gwIgZ2YWxTdHIiBHN0cmYiBGFkZHIiA2tleSIEaW50ZiIIdGhyb3dFcnIiA21zZyIGZm10RXJyIgNmY2EiAUEiA2lncyICbXAiE2ZlZUNvbGxlY3RvckFkZHJlc3MiA2dwYyIFYW10QXMiB3ByaWNlQXMiCGlQcmljZUFzIgxwYXJzZUFzc2V0SWQiBWlucHV0Ig9hc3NldElkVG9TdHJpbmciD3BhcnNlUG9vbENvbmZpZyIKcG9vbENvbmZpZyIQcG9vbENvbmZpZ1BhcnNlZCILJHQwNzIwODczOTQiDmNmZ1Bvb2xBZGRyZXNzIg1jZmdQb29sU3RhdHVzIgxjZmdMcEFzc2V0SWQiEGNmZ0Ftb3VudEFzc2V0SWQiD2NmZ1ByaWNlQXNzZXRJZCIWY2ZnQW1vdW50QXNzZXREZWNpbWFscyIVY2ZnUHJpY2VBc3NldERlY2ltYWxzIgNnZmMiDWZhY3RvcnlDb25maWciD3N0YWtpbmdDb250cmFjdCIPc2xpcGFnZUNvbnRyYWN0Igtnd3hDb250cmFjdCIMcmVzdENvbnRyYWN0IhFkYXRhUHV0QWN0aW9uSW5mbyINaW5BbXRBc3NldEFtdCIPaW5QcmljZUFzc2V0QW10IghvdXRMcEFtdCIFcHJpY2UiCnNsaXBCeVVzZXIiDHNsaXBwYWdlUmVhbCIIdHhIZWlnaHQiC3R4VGltZXN0YW1wIgxzbGlwYWdlQW1BbXQiDHNsaXBhZ2VQckFtdCIRZGF0YUdldEFjdGlvbkluZm8iDm91dEFtdEFzc2V0QW10IhBvdXRQcmljZUFzc2V0QW10IgdpbkxwQW10Ig1nZXRBY2NCYWxhbmNlIgdhc3NldElkIgRjcGJpIghwckFtdFgxOCIIYW1BbXRYMTgiA3ZhZCICQTEiAkEyIghzbGlwcGFnZSIEZGlmZiIEcGFzcyICdmQiAkQxIgJEMCIEc2xwZyIEZmFpbCIDcGNwIgphbUFzc2V0RGNtIgpwckFzc2V0RGNtIgVhbUFtdCIFcHJBbXQiC2FtdEFzQW10WDE4IgpwckFzQW10WDE4IgpjYWxjUHJpY2VzIgVscEFtdCIDY2ZnIghhbXRBc0RjbSIHcHJBc0RjbSIIcHJpY2VYMTgiCGxwQW10WDE4Ig1scFBySW5BbUFzWDE4Ig1scFBySW5QckFzWDE4Ig9jYWxjdWxhdGVQcmljZXMiAXAiB3Rha2VGZWUiBmFtb3VudCIJZmVlQW1vdW50IgNlZ28iBnR4SWQ1OCIKcG10QXNzZXRJZCIIcG10THBBbXQiC3VzZXJBZGRyZXNzIgRscElkIgRhbUlkIgRwcklkIgVhbURjbSIFcHJEY20iA3N0cyIHbHBFbWlzcyIJYW1CYWxhbmNlIgxhbUJhbGFuY2VYMTgiCXByQmFsYW5jZSIMcHJCYWxhbmNlWDE4IgtjdXJQcmljZVgxOCIIY3VyUHJpY2UiC3BtdExwQW10WDE4IgpscEVtaXNzWDE4IgtvdXRBbUFtdFgxOCILb3V0UHJBbXRYMTgiCG91dEFtQW10IghvdXRQckFtdCIFc3RhdGUiA2VwbyIHaW5BbUFtdCIGaW5BbUlkIgdpblByQW10IgZpblBySWQiBmlzRXZhbCIGZW1pdExwIgppc09uZUFzc2V0IhB2YWxpZGF0ZVNsaXBwYWdlIgZwbXRBbXQiBXBtdElkIgdhbUlkU3RyIgdwcklkU3RyIglpbkFtSWRTdHIiCWluUHJJZFN0ciIGYW10RGNtIghwcmljZURjbSIEbHBFbSIPaW5BbUFzc2V0QW10WDE4Ig9pblByQXNzZXRBbXRYMTgiDHVzZXJQcmljZVgxOCIBciILc2xpcHBhZ2VYMTgiD3NsaXBwYWdlUmVhbFgxOCINbHBFbWlzc2lvblgxOCIKcHJWaWFBbVgxOCIKYW1WaWFQclgxOCIMZXhwZWN0ZWRBbXRzIhFleHBBbXRBc3NldEFtdFgxOCITZXhwUHJpY2VBc3NldEFtdFgxOCIJY2FsY0xwQW10Ig5jYWxjQW1Bc3NldFBtdCIOY2FsY1ByQXNzZXRQbXQiDHNsaXBwYWdlQ2FsYyIJZW1pdExwQW10IgZhbURpZmYiBnByRGlmZiINJHQwMTc4MjUxODE3MCIKd3JpdGVBbUFtdCIKd3JpdGVQckFtdCILY29tbW9uU3RhdGUiB2NhbGNETHAiDWFtb3VudEJhbGFuY2UiDHByaWNlQmFsYW5jZSIKbHBFbWlzc2lvbiIKdXBkYXRlZERMcCIScmVmcmVzaERMcEludGVybmFsIhdhbW91bnRBc3NldEJhbGFuY2VEZWx0YSIWcHJpY2VBc3NldEJhbGFuY2VEZWx0YSIUbHBBc3NldEVtaXNzaW9uRGVsdGEiEmFtb3VudEFzc2V0QmFsYW5jZSIRcHJpY2VBc3NldEJhbGFuY2UiD2xwQXNzZXRFbWlzc2lvbiIHYWN0aW9ucyIDbW9hIgVvcmRlciIRYW1vdW50QXNzZXRBbW91bnQiEHByaWNlQXNzZXRBbW91bnQiDSR0MDIwMTE5MjAzMzEiA2RMcCINJHQwMjA3NTgyMDg1OCINdW51c2VkQWN0aW9ucyIGZExwTmV3Igxpc09yZGVyVmFsaWQiAmNnIgFpIgNwbXQiAmNwIgZjYWxsZXIiB2FtQXNQbXQiB3ByQXNQbXQiBGdldEQiAnhwIgFuIgN4cDAiA3hwMSIKYVByZWNpc2lvbiIBYSIBcyIDYW5uIgt4cDBfeHAxX25fbiIQYW5uX3NfYVByZWNpc2lvbiIOYW5uX2FQcmVjaXNpb24iAm4xIgRjYWxjIgNhY2MiA2N1ciINJHQwMjMwMTEyMzAzMSIBZCIFZm91bmQiAmRwIgVkTmV4dCIFZERpZmYiA2FyciINJHQwMjM0NTIyMzQ5OSICJGwiAiRzIgUkYWNjMCIFJGYwXzEiAiRhIgIkaSIFJGYwXzIiBWdldFlEIgFEIgF4IgFjIgFiIg0kdDAyMzk5OTI0MDE5IgF5IgV5TmV4dCIFeURpZmYiDSR0MDI0MzI2MjQzNzMiDWNhbGNQdXRPbmVUa24iCXBtdEFtdFJhdyILd2l0aFRha2VGZWUiDWNoZWNoRW1pc3Npb24iDSR0MDI1MTU2MjU2MTgiDGFtQmFsYW5jZU9sZCIMcHJCYWxhbmNlT2xkIg0kdDAyNTYyNDI1ODAwIgthbUFtb3VudFJhdyILcHJBbW91bnRSYXciDSR0MDI1ODA0MjYwNDMiCGFtQW1vdW50IghwckFtb3VudCIMYW1CYWxhbmNlTmV3IgxwckJhbGFuY2VOZXciBmNoZWNrRCIIbHBBbW91bnQiDnBvb2xQcm9wb3J0aW9uIg9hbW91bnRBc3NldFBhcnQiDnByaWNlQXNzZXRQYXJ0IglscEFtdEJvdGgiBWJvbnVzIhNnZXRPbmVUa25WMkludGVybmFsIgpvdXRBc3NldElkIgxtaW5PdXRBbW91bnQiCHBheW1lbnRzIgxvcmlnaW5DYWxsZXIiDXRyYW5zYWN0aW9uSWQiCmFtRGVjaW1hbHMiCnByRGVjaW1hbHMiCnBvb2xTdGF0dXMiDSR0MDI4MDQ1MjgxNTYiAUAiCHRvdGFsR2V0Igt0b3RhbEFtb3VudCINJHQwMjgzNDYyODY1MyIFb3V0QW0iBW91dFByIghjdXJQclgxOCIFY3VyUHIiEW91dEFzc2V0SWRPcldhdmVzIhBzZW5kRmVlVG9NYXRjaGVyIgRidXJuIg0kdDAyOTQzODI5Nzg4IhBmZWVBbW91bnRGb3JDYWxjIhBvdXRJbkFtb3VudEFzc2V0Ig0kdDAyOTc5MTI5ODk5IhFyZWZyZXNoRExwQWN0aW9ucyIBbSICcG0iAnBkIglpc01hbmFnZXIiAnBrIgJtbSIXcGVuZGluZ01hbmFnZXJQdWJsaWNLZXkiAmNtIgNocG0iA2NwbSIEc2xpcCIJYXV0b1N0YWtlIgdmYWN0Q2ZnIgtzdGFraW5nQ250ciIIc2xpcENudHIiAWUiCWxwQXNzZXRJZCICZWwiBmxlZ2FjeSICc2EiAnNwIghscFRybnNmciICc3MiDSR0MDMzNDgxMzM1NDYiIGlzUG9vbE9uZVRva2VuT3BlcmF0aW9uc0Rpc2FibGVkIg1pc1B1dERpc2FibGVkIgZjaGVja3MiDSR0MDM0NjA4MzQ3NjYiB2VzdGltTFAiDSR0MDM1NTgxMzU5MzAiFHBheW1lbnRJbkFtb3VudEFzc2V0Ig0kdDAzNTkzMzM2MDQxIgdtYXhTbHBnIgZlc3RQdXQiDSR0MDM2Nzk3MzY4NjIiCnVwZGF0ZWRLTHAiCW91dEFtdEFtdCINJHQwMzc0OTQzNzU3NiINaXNHZXREaXNhYmxlZCINJHQwMzgxMjEzODI3NiIYbGFzdFJlZnJlc2hlZEJsb2NrSGVpZ2h0Ih1jaGVja0xhc3RSZWZyZXNoZWRCbG9ja0hlaWdodCINJHQwMzg2NzQzODcyOSINbHBBc3NldEFtb3VudCIFaW5kZXgiBG5ld1kiAmR5Igt0b3RhbEdldFJhdyINJHQwMzk1MzEzOTU4MCINJHQwMzk5MjU0MDA0MCIOc3VtT2ZHZXRBc3NldHMiEm5vTGVzc1RoZW5BbXRBc3NldCIUbm9MZXNzVGhlblByaWNlQXNzZXQiFGJ1cm5MUEFzc2V0T25GYWN0b3J5Ig0kdDA0MTEyNjQxMjA3Ig1jaGVja1BheW1lbnRzIgpmYWN0b3J5Q2ZnIgdzdGFraW5nIgp1bnN0YWtlSW52IgF2IgVidXJuQSINJHQwNDIxMjA0MjIwMSINdW5zdGFrZUFtb3VudCIVbm9MZXNzVGhlbkFtb3VudEFzc2V0IgNyZXMiDGNoZWNrQW1vdW50cyINJHQwNDMyOTk0MzM4MCINJHQwNDQyNDE0NDQyOSIQcGF5bWVudEFtb3VudFJhdyIOcGF5bWVudEFzc2V0SWQiDSR0MDQ0Njg4NDQ3OTEiDSR0MDQ1MDcwNDUxNzQiCGFtdEFzU3RyIgdwckFzU3RyIgFrIgJwciIMcmVzU2NhbGVNdWx0Igd1c3JBZGRyIgdwbXRBc0lkIgJ0eCIGdmVyaWZ5Ig90YXJnZXRQdWJsaWNLZXkiCm1hdGNoZXJQdWIiCm9yZGVyVmFsaWQiC3NlbmRlclZhbGlkIgxtYXRjaGVyVmFsaWQiB25ld0hhc2giC2FsbG93ZWRIYXNoIgtjdXJyZW50SGFzaHUAAWEAgMLXLwABYgkAtgIBAIDC1y8AAWMJALYCAQCAgJC7utat8A0AAWQJALYCAQAAAAFlCQC2AgEAAAABZgkAtgIBAAEAAWcJALYCAQACAAFoCQC2AgEJAGUCBQFhCQBpAgkAaAIFAWEAAQUBYQABaQIFV0FWRVMAAWoCAzEwMAABawIBMQABbAICX18AAW0CAAABbgABAAFvAAIAAXAAAwABcQAEAAFyAAEAAXMAAgABdAADAAF1AAQAAXYABQABdwAGAAF4AAcAAXkACAABegAJAAFBAAEAAUIABgABQwAHAAFEAAoAAUUJAGsDAAoFAWEAkE4BAUYCAUcBSAkAvAIDCQC2AgEFAUcFAWMJALYCAQUBSAEBSQIBSgFLCQCgAwEJALwCAwUBSgkAtgIBBQFLBQFjAQFMAwFNAU4BTwkAawMFAU0FAU4FAU8BAVABAUoDCQC/AgIFAWQFAUoJAL4CAQUBSgUBSgEBUQEBSgMJAL8CAgUBZAUBSgkAvgIBBQFKBQFKAQFSAAITJXNfX2ZhY3RvcnlDb250cmFjdAEBUwACFCVzX19tYW5hZ2VyUHVibGljS2V5AQFUAAIbJXNfX3BlbmRpbmdNYW5hZ2VyUHVibGljS2V5AQFVAAIRJXMlc19fcHJpY2VfX2xhc3QBAVYCAVcBWAkAuQkCCQDMCAICGCVzJXMlZCVkX19wcmljZV9faGlzdG9yeQkAzAgCCQCkAwEFAVcJAMwIAgkApAMBBQFYBQNuaWwFAWwBAVkCAVoCYWEJAKwCAgkArAICCQCsAgICCyVzJXMlc19fUF9fBQFaAgJfXwUCYWEBAmFiAgFaAmFhCQCsAgIJAKwCAgkArAICAgslcyVzJXNfX0dfXwUBWgICX18FAmFhAQJhYwACDyVzX19hbW91bnRBc3NldAECYWQAAg4lc19fcHJpY2VBc3NldAECYWUAAgclc19fYW1wAQJhZgACDSVzX19hZGRvbkFkZHIAAmFnAgclc19fZmVlAAJhaAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQJhZwUBRQACYWkJALkJAgkAzAgCAgIlcwkAzAgCAgNkTHAFA25pbAUBbAACYWoJALkJAgkAzAgCAgIlcwkAzAgCAhJkTHBSZWZyZXNoZWRIZWlnaHQFA25pbAUBbAACYWsJALkJAgkAzAgCAgIlcwkAzAgCAg9yZWZyZXNoRExwRGVsYXkFA25pbAUBbAACYWwAHgACYW0JAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUCYWsFAmFsAQJhbgACESVzX19mYWN0b3J5Q29uZmlnAQJhbwACGCVzJXNfX21hdGNoZXJfX3B1YmxpY0tleQECYXACAmFxAmFyCQCsAgIJAKwCAgkArAICCQCsAgICCCVkJWQlc19fBQJhcQICX18FAmFyAghfX2NvbmZpZwECYXMBAmF0CQCsAgICKCVzJXMlc19fbWFwcGluZ3NfX2Jhc2VBc3NldDJpbnRlcm5hbElkX18FAmF0AQJhdQACDCVzX19zaHV0ZG93bgECYXYAAh0lc19fYWxsb3dlZExwU3RhYmxlU2NyaXB0SGFzaAECYXcAAhclc19fZmVlQ29sbGVjdG9yQWRkcmVzcwECYXgDAmF5AmF6AmFBCQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgICEUZhaWxlZDogb3JkVmFsaWQ9CQClAwEFAmF5Agsgc25kclZhbGlkPQkApQMBBQJhegIMIG10Y2hy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CAIJAKQDAQUCYncFA25pbAUBbAECYkQBAmJFAwkAAAIFAmJFAgVXQVZFUwgJAO8HAQUEdGhpcwlhdmFpbGFibGUJAPAHAgUEdGhpcwkA2QQBBQJiRQECYkYCAmJHAmJICQC8AgMFAmJHBQFjBQJiSAECYkkDAmJKAmJLAmJMBAJiTQkAvAIDCQC4AgIFAmJKBQJiSwUBYgUCYksEAmJOCQC/AgIJALgCAgUCYkwJAQFQAQUCYk0FAWQDCQEBIQEFAmJOCQACAQkArAICAgpCaWcgc2xwZzogCQCmAwEFAmJNCQCUCgIFAmJOCQCZAwEJAMwIAgUCYkoJAMwIAgUCYksFA25pbAECYk8DAmJQAmJRAmJSBAJiTQkAvAIDBQJiUQUBYgUCYlAEAmJTCQC/AgIFAmJSBQJiTQMDBQJiUwYJAL8CAgUCYlEFAmJQCQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkApgMBBQJiUQIBIAkApgMBBQJiUAIBIAkApgMBBQJiTQIBIAkApgMBBQJiUgUCYlMBAmJUBAJiVQJiVgJiVwJiWAQCYlkJAQFGAgUCYlcFAmJVBAJiWgkBAUYCBQJiWAUCYlYJAQJiRgIFAmJaBQJiWQECY2EDAmJXAmJYAmNiBAJjYwkBAmFRAAQCY2QJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJjYwUBdwQCY2UJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJjYwUBeAQCY2YJAQJiVAQFAmNkBQJjZQUCYlcFAmJYBAJiSAkBAUYCBQJiVwUCY2QEAmJHCQEBRgIFAmJYBQJjZQQCY2cJAQFGAgUCY2IFAWEEAmNoCQECYkYCBQJiSAUCY2cEAmNpCQECYkYCBQJiRwUCY2cJAMwIAgUCY2YJAMwIAgUCY2gJAMwIAgUCY2kFA25pbAECY2oDAmJXAmJYAmNiBAJjawkBAmNhAwUCYlcFAmJYBQJjYgkAzAgCCQEBSQIJAJEDAgUCY2sAAAUBYQkAzAgCCQEBSQIJAJEDAgUCY2sAAQUBYQkAzAgCCQEBSQIJAJEDAgUCY2sAAgUBYQUDbmlsAQJjbAECY20EAmNuCQBrAwUCY20FAmFoBQFhCQCUCgIJAGUCBQJjbQUCY24FAmNuAQJjbwQCY3ACY3ECY3ICY3MEAmNjCQECYVEABAJjdAkAkQMCBQJjYwUBdAQCY3UJAJEDAgUCY2MFAXUEAmN2CQCRAwIFAmNjBQF2BAJjdwkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmNjBQF3BAJjeAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmNjBQF4BAJjeQkAkQMCBQJjYwUBcwQCY3oICQETdmFsdWVPckVycm9yTWVzc2FnZQIJAOwHAQkA2QQBBQJjdAILV3JvbmcgTFAgaWQIcXVhbnRpdHkDCQECIT0CBQJjdAUCY3EJAAIBAg9Xcm9uZyBwbXQgYXNzZXQEAmNBCQECYkQBBQJjdQQCY0IJAQFGAgUCY0EFAmN3BAJjQwkBAmJEAQUCY3YEAmNECQEBRgIFAmNDBQJjeAQCY0UJAQJiRgIFAmNEBQJjQgQCY0YJAQFJAgUCY0UFAWEEAmNHCQEBRgIFAmNyBQFhBAJjSAkBAUYCBQJjegUBYQQCY0kJALwCAwUCY0IFAmNHBQJjSAQCY0oJALwCAwUCY0QFAmNHBQJjSAQCY0sJAQFJAgUCY0kFAmN3BAJjTAkBAUkCBQJjSgUCY3gEAmNNAwkAAAIFAmNwAgAFA25pbAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQJjcwUCY0sDCQAAAgUCY3UCBVdBVkVTBQR1bml0CQDZBAEFAmN1CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFAmNzBQJjTAMJAAACBQJjdgIFV0FWRVMFBHVuaXQJANkEAQUCY3YJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFiAgkApQgBBQJjcwUCY3AJAQJiegYFAmNLBQJjTAUCY3IFAmNGBQZoZWlnaHQIBQlsYXN0QmxvY2sJdGltZXN0YW1wCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBVQAFAmNGCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBVgIFBmhlaWdodAgFCWxhc3RCbG9jawl0aW1lc3RhbXAFAmNGBQNuaWwJAJwKCgUCY0sFAmNMBQJjdQUCY3YFAmNBBQJjQwUCY3oFAmNFBQJjeQUCY00BAmNODQJjcAJiTAJjTwJjUAJjUQJjUgJjcwJjUwJjVAJjVQJjVgJjVwJjWAQCY2MJAQJhUQAEAmN0CQDZBAEJAJEDAgUCY2MFAXQEAmNZCQCRAwIFAmNjBQF1BAJjWgkAkQMCBQJjYwUBdgQCZGEJAJEDAgUCY2MFAXkEAmRiCQCRAwIFAmNjBQF6BAJkYwkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmNjBQF3BAJkZAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmNjBQF4BAJjeQkAkQMCBQJjYwUBcwQCZGUICQETdmFsdWVPckVycm9yTWVzc2FnZQIJAOwHAQUCY3QCCFdyIGxwIGFzCHF1YW50aXR5BAJjQQMFAmNTCQECYkQBBQJjWQMDBQJjVQkAAAIFAmNYBQJjWQcJAGUCCQECYkQBBQJjWQUCY1cDBQJjVQkBAmJEAQUCY1kJAGUCCQECYkQBBQJjWQUCY08EAmNDAwUCY1MJAQJiRAEFAmNaAwMFAmNVCQAAAgUCY1gFAmNaBwkAZQIJAQJiRAEFAmNaBQJjVwMFAmNVCQECYkQBBQJjWgkAZQIJAQJiRAEFAmNaBQJjUQQCZGYJAQFGAgUCY08FAmRjBAJkZwkBAUYCBQJjUQUCZGQEAmRoCQECYkYCBQJkZwUCZGYEAmNCCQEBRgIFAmNBBQJkYwQCY0QJAQFGAgUCY0MFAmRkBAJkaQMJAAACBQJkZQAABAJjRQUBZAQCZGoFAWQEAmNnCQB2BgkAuQICBQJkZgUCZGcAAAkAtgIBAAUAAQAABQRET1dOCQCXCgUJAQFJAgUCY2cFAWEJAQFJAgUCZGYFAmRjCQEBSQIFAmRnBQJkZAkBAmJGAgkAtwICBQJjRAUCZGcJALcCAgUCY0IFAmRmBQJkagQCY0UJAQJiRgIFAmNEBQJjQgQCZGsJALwCAwkBAVABCQC4AgIFAmNFBQJkaAUBYwUCY0UEAmRqCQEBRgIFAmJMBQFhAwMDBQJjVgkBAiE9AgUCY0UFAWQHCQC/AgIFAmRrBQJkagcJAAIBCQCsAgIJAKwCAgkArAICAg9QcmljZSBzbGlwcGFnZSAJAKYDAQUCZGsCAyA+IAkApgMBBQJkagQCZGwJAQFGAgUCZGUFAWEEAmRtCQC8AgMFAmRmBQJjRQUBYwQCZG4JALwCAwUCZGcFAWMFAmNFBAJkbwMJAL8CAgUCZG0FAmRnCQCUCgIFAmRuBQJkZwkAlAoCBQJkZgUCZG0EAmRwCAUCZG8CXzEEAmRxCAUCZG8CXzIEAmNnCQC8AgMFAmRsBQJkcQUCY0QJAJcKBQkBAUkCBQJjZwUBYQkBAUkCBQJkcAUCZGMJAQFJAgUCZHEFAmRkBQJjRQUCZGoEAmRyCAUCZGkCXzEEAmRzCAUCZGkCXzIEAmR0CAUCZGkCXzMEAmNGCQEBSQIIBQJkaQJfNAUBYQQCZHUJAQFJAggFAmRpAl81BQFhAwkAZwIAAAUCZHIJAAIBAgdMUCA8PSAwBAJkdgMJAQEhAQUCY1QAAAUCZHIEAmR3CQBlAgUCY08FAmRzBAJkeAkAZQIFAmNRBQJkdAQCZHkDAwUCY1UJAAACBQJjWAUCY1kHCQCUCgIFAmNXAAADAwUCY1UJAAACBQJjWAUCY1oHCQCUCgIAAAUCY1cJAJQKAgUCZHMFAmR0BAJkeggFAmR5Al8xBAJkQQgFAmR5Al8yBAJkQgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAVUABQJjRgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAVYCBQZoZWlnaHQIBQlsYXN0QmxvY2sJdGltZXN0YW1wBQJjRgkAzAgCCQELU3RyaW5nRW50cnkCCQEBWQIFAmNzBQJjcAkBAmJvCgUCZHoFAmRBBQJkdgUCY0YFAmJMBQJkdQUGaGVpZ2h0CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAUCZHcFAmR4BQNuaWwJAJ8KDQUCZHIFAmR2BQJjRgUCY0EFAmNDBQJkZQUCY3QFAmN5BQJkQgUCZHcFAmR4BQJjUAUCY1IBAmRDAwJkRAJkRQJkRgQCZEcJALwCAwkAuQICBQJkRAUCZEUFAWMFAmRGBQJkRwECZEgDAmRJAmRKAmRLBAJkTAkAZAIJAQJiRAEJAQJhVwEFAmJlBQJkSQQCZE0JAGQCCQECYkQBCQECYVcBBQJiZgUCZEoEAmROCQBkAggJAQV2YWx1ZQEJAOwHAQUCYmQIcXVhbnRpdHkFAmRLBAJkRwkBAmRDAwkAtgIBBQJkTAkAtgIBBQJkTQkAtgIBBQJkTgQCZE8JAMwIAgkBDEludGVnZXJFbnRyeQIFAmFqBQZoZWlnaHQJAMwIAgkBC1N0cmluZ0VudHJ5AgUCYWkJAKYDAQUCZEcFA25pbAkAlAoCBQJkTwUCZEcBAmRQAQJkUQQCZFIIBQJkUQZhbW91bnQEAmRTCQBrAwgFAmRRBmFtb3VudAgFAmRRBXByaWNlBQFhBAJkVAMJAAACCAUCZFEJb3JkZXJUeXBlBQNCdXkJAJQKAgUCZFIJAQEtAQUCZFMJAJQKAgkBAS0BBQJkUgUCZFMEAmRJCAUCZFQCXzEEAmRKCAUCZFQCXzIDAwMJAQJhTgAGCQAAAgUCYmMFAXAGCQAAAgUCYmMFAXEJAAIBAg1BZG1pbiBibG9ja2VkAwMJAQIhPQIICAUCZFEJYXNzZXRQYWlyC2Ftb3VudEFzc2V0BQJiZQYJAQIhPQIICAUCZFEJYXNzZXRQYWlyCnByaWNlQXNzZXQFAmJmCQACAQIJV3IgYXNzZXRzBAJkVQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCoAwEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzBQJhaQkBAmFLAQIPZExwIGlzIHJlcXVpcmVkCQECYUsBAgtpbnZhbGlkIGRMcAQCZFYJAQJkSAMFAmRJBQJkSgAABAJkVwgFAmRWAl8xBAJkWAgFAmRWAl8yBAJkWQkAvwICBQJkWAUCZFUFAmRZAQJkWgECZWEDCQECIT0CCQCQAwEIBQJlYQhwYXltZW50cwABCQACAQIKMSBwbW50IGV4cAQCZWIJAQV2YWx1ZQEJAJEDAggFAmVhCHBheW1lbnRzAAAEAmNxCQEFdmFsdWUBCAUCZWIHYXNzZXRJZAQCY1cIBQJlYgZhbW91bnQEAmRpCQECY28ECQDYBAEIBQJlYQ10cmFuc2FjdGlvbklkCQDYBAEFAmNxBQJjVwgFAmVhBmNhbGxlcgQCY0sIBQJkaQJfMQQCY0wIBQJkaQJfMgQCY3kJAQ1wYXJzZUludFZhbHVlAQgFAmRpAl85BAJjTQgFAmRpA18xMAMDCQECYU4ABgkAAAIFAmN5BQFxCQACAQkArAICAg9BZG1pbiBibG9ja2VkOiAJAKQDAQUCY3kJAJcKBQUCY0sFAmNMBQJjVwUCY3EFAmNNAQJlYwoCZWQCYWECZWUCZWYCYkwCY1QCY1UCY1YCY1cCY1gEAmRpCQECY04NBQJhYQUCYkwICQEFdmFsdWUBBQJlZQZhbW91bnQICQEFdmFsdWUBBQJlZQdhc3NldElkCAkBBXZhbHVlAQUCZWYGYW1vdW50CAkBBXZhbHVlAQUCZWYHYXNzZXRJZAUCZWQJAAACBQJhYQIABQJjVAUCY1UFAmNWBQJjVwUCY1gEAmN5CQENcGFyc2VJbnRWYWx1ZQEIBQJkaQJfOAMDAwkBAmFOAAYJAAACBQJjeQUBbwYJAAACBQJjeQUBcQkAAgEJAKwCAgIIQmxvY2tlZDoJAKQDAQUCY3kFAmRpAQJlZwECZWgEAmVpBQFnBAJlagkAkQMCBQJlaAAABAJlawkAkQMCBQJlaAABBAJlbAkApwMBBQFqBAJlbQkAuQICCQCnAwEFAmFNBQJlbAQCZW4JALcCAgUCZWoFAmVrAwkAAAIFAmVuBQFlBQFlBAJlbwkAuQICBQJlbQUCZWkEAmVwCQC5AgIJALkCAgkAuQICBQJlagUCZWsFAmVpBQJlaQQCZXEJALoCAgkAuQICBQJlbwUCZW4FAmVsBAJlcgkAuAICBQJlbwUCZWwEAmVzCQC3AgIFAmVpBQFmCgECZXQCAmV1AmV2BAJldwUCZXUEAmV4CAUCZXcCXzEEAmV5CAUCZXcCXzIDCQECIT0CBQJleQUEdW5pdAUCZXUEAmV6CQC6AgIJALkCAgkAuQICBQJleAUCZXgFAmV4BQJlcAQCZUEJALoCAgkAuQICCQC3AgIFAmVxCQC5AgIFAmV6BQJlaQUCZXgJALcCAgkAugICCQC5AgIFAmVyBQJleAUCZWwJALkCAgUCZXMFAmV6BAJlQgkBAVEBCQC4AgIFAmVBCQEFdmFsdWUBBQJleAMJAMACAgUBZgUCZUIJAJQKAgUCZUEFAmV2CQCUCgIFAmVBBQR1bml0BAJlQwkAzAgCAAAJAMwIAgABCQDMCAIAAgkAzAgCAAMJAMwIAgAECQDMCAIABQkAzAgCAAYJAMwIAgAHCQDMCAIACAkAzAgCAAkJAMwIAgAKCQDMCAIACwkAzAgCAAwJAMwIAgANCQDMCAIADgUDbmlsBAJlRAoAAmVFBQJlQwoAAmVGCQCQAwEFAmVFCgACZUcJAJQKAgUCZW4FBHVuaXQKAQJlSAICZUkCZUoDCQBnAgUCZUoFAmVGBQJlSQkBAmV0AgUCZUkJAJEDAgUCZUUFAmVKCgECZUsCAmVJAmVKAwkAZwIFAmVKBQJlRgUCZUkJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxNQkBAmVLAgkBAmVIAgkBAmVIAgkBAmVIAgkBAmVIAgkBAmVIAgkBAmVIAgkBAmVIAgkBAmVIAgkBAmVIAgkBAmVIAgkBAmVIAgkBAmVIAgkBAmVIAgkBAmVIAgkBAmVIAgUCZUcAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwQCZXgIBQJlRAJfMQQCZXkIBQJlRAJfMgMJAQIhPQIFAmV5BQR1bml0BQJleAkAAgEJAKwCAgIZRCBjYWxjdWxhdGlvbiBlcnJvciwgRCA9IAkApgMBBQJleAECZUwDAmVoAmVhAmVNBAJlaQUBZwQCZU4JAJEDAgUCZWgDCQAAAgUCZWEAAAABAAAEAmVsCQCnAwEFAWoEAmVtCQC5AgIJAKcDAQUCYU0FAmVsBAJlbgUCZU4EAmVvCQC5AgIFAmVtBQJlaQQCZU8JALoCAgkAuQICCQC5AgIJALoCAgkAuQICBQJlTQUCZU0JALkCAgUCZU4FAmVpBQJlTQUCZWwJALkCAgUCZW8FAmVpBAJlUAkAuAICCQC3AgIFAmVuCQC6AgIJALkCAgUCZU0FAmVsBQJlbwUCZU0KAQJldAICZXUCZXYEAmVRBQJldQQCZVIIBQJlUQJfMQQCZXkIBQJlUQJfMgMJAQIhPQIFAmV5BQR1bml0BQJldQQCZVMJALoCAgkAtwICCQC5AgIFAmVSBQJlUgUCZU8JALcCAgkAuQICBQFnBQJlUgUCZVAEAmVUCQEBUQEJALgCAgUCZVMJAQV2YWx1ZQEFAmVSAwkAwAICBQFmBQJlVAkAlAoCBQJlUwUCZXYJAJQKAgUCZVMFBHVuaXQEAmVDCQDMCAIAAAkAzAgCAAEJAMwIAgACCQDMCAIAAwkAzAgCAAQJAMwIAgAFCQDMCAIABgkAzAgCAAcJAMwIAgAICQDMCAIACQkAzAgCAAoJAMwIAgALCQDMCAIADAkAzAgCAA0JAMwIAgAOBQNuaWwEAmVVCgACZUUFAmVDCgACZUYJAJADAQUCZUUKAAJlRwkAlAoCBQJlTQUEdW5pdAoBAmVIAgJlSQJlSgMJAGcCBQJlSgUCZUYFAmVJCQECZXQCBQJlSQkAkQMCBQJlRQUCZUoKAQJlSwICZUkCZUoDCQBnAgUCZUoFAmVGBQJlSQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDE1CQECZUsCCQECZUgCCQECZUgCCQECZUgCCQECZUgCCQECZUgCCQECZUgCCQECZUgCCQECZUgCCQECZUgCCQECZUgCCQECZUgCCQECZUgCCQECZUgCCQECZUgCCQECZUgCBQJlRwAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPBAJlUggFAmVVAl8xBAJleQgFAmVVAl8yAwkBAiE9AgUCZXkFBHVuaXQFAmVSCQACAQkArAICAhlZIGNhbGN1bGF0aW9uIGVycm9yLCBZID0gCQCmAwEFAmVSAQJlVgUCZVcCY3ECY3MCYWECZVgEAmFZCQECYVEABAJjdQkAkQMCBQJhWQUBdQQCY3YJAJEDAgUCYVkFAXYEAmN0CQCRAwIFAmFZBQF0BAJkYwkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmFZBQF3BAJkZAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmFZBQF4BAJkTgkAtgIBCAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDsBwEJANkEAQUCY3QCEGludmFsaWQgbHAgYXNzZXQIcXVhbnRpdHkEAmVZAwkAvwICBQJkTgUBZQYJAAIBAiJpbml0aWFsIGRlcG9zaXQgcmVxdWlyZXMgYWxsIGNvaW5zAwkAAAIFAmVZBQJlWQQCY0EJAQJiRAEFAmN1BAJjQwkBAmJEAQUCY3YEAmVaAwkAAAIFAmFhAgAJAJQKAgUCY0EFAmNDAwkAAAIFAmNxBQJjdQMJAGYCBQJlVwUCY0EJAAIBAhZpbnZhbGlkIHBheW1lbnQgYW1vdW50CQCUCgIJAGUCBQJjQQUCZVcFAmNDAwkAAAIFAmNxBQJjdgMJAGYCBQJlVwUCY0MJAAIBAhZpbnZhbGlkIHBheW1lbnQgYW1vdW50CQCUCgIFAmNBCQBlAgUCY0MFAmVXCQACAQIQd3JvbmcgcG10QXNzZXRJZAQCZmEIBQJlWgJfMQQCZmIIBQJlWgJfMgQCZmMDCQAAAgUCY3EFAmN1CQCUCgIFAmVXAAADCQAAAgUCY3EFAmN2CQCUCgIAAAUCZVcJAAIBAg9pbnZhbGlkIHBheW1lbnQEAmZkCAUCZmMCXzEEAmZlCAUCZmMCXzIEAmZmAwUCZVgJAJUKAwgJAQJjbAEFAmZkAl8xCAkBAmNsAQUCZmUCXzEICQECY2wBBQJlVwJfMgkAlQoDBQJmZAUCZmUAAAQCZmcIBQJmZgJfMQQCZmgIBQJmZgJfMgQCY24IBQJmZgJfMwQCZmkJAGQCBQJmYQUCZmcEAmZqCQBkAgUCZmIFAmZoBAJiUQkBAmVnAQkAzAgCCQC2AgEFAmZhCQDMCAIJALYCAQUCZmIFA25pbAQCYlAJAQJlZwEJAMwIAgkAtgIBBQJmaQkAzAgCCQC2AgEFAmZqBQNuaWwEAmZrAwkAvwICBQJiUAUCYlEGCQEFdGhyb3cAAwkAAAIFAmZrBQJmawQCZmwJALwCAwUCZE4JALgCAgUCYlAFAmJRBQJiUQQCY0YJAQFJAgkBAmJGAgkBAUYCBQJmagUCZGQJAQFGAgUCZmkFAmRjBQFhBAJkQgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAVUABQJjRgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAVYCBQZoZWlnaHQIBQlsYXN0QmxvY2sJdGltZXN0YW1wBQJjRgkAzAgCCQELU3RyaW5nRW50cnkCCQEBWQIFAmNzBQJhYQkBAmJvCgUCZmQFAmZlCQCgAwEFAmZsBQJjRgAAAAAFBmhlaWdodAgFCWxhc3RCbG9jawl0aW1lc3RhbXAAAAAABQNuaWwEAmZtCQBrAwUCZmIFAWEFAmZhBAJmbgkAawMFAmVXBQFhCQBkAgUCZm0FAWEEAmZvCQBlAgUCZVcFAmZuBAJmcAkAvAIDBQJkTgkAtgIBBQJmbwkAtgIBBQJmYgQCZnEJAKADAQkAvAIDCQC4AgIFAmZsBQJmcAUBYgUCZnAJAJYKBAkAoAMBBQJmbAUCZEIFAmNuBQJmcQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgECZnIGAmZzAmZ0AmZ1AmVkAmZ2AmZ3BAJhWQkBAmFRAAQCY3QJAJEDAgUCYVkFAXQEAmN1CQCRAwIFAmFZBQF1BAJjdgkAkQMCBQJhWQUBdgQCZngJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJhWQUBdwQCZnkJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJhWQUBeAQCZnoJAJEDAgUCYVkFAXMEAmNzAwkAAAIFAmVkBQJibgUCZnYFAmVkBAJlYgkBBXZhbHVlAQkA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BgUCZlQDCQABAgUCYUMCBFVuaXQDCQAAAggFAmVhBmNhbGxlcgUEdGhpcwYFAmZUCQACAQILTWF0Y2ggZXJyb3IdAmVhAQtjb25zdHJ1Y3RvcgEBUgQCZU8JAQJmVwEFAmVhAwkAAAIFAmVPBQJlTwkAzAgCCQELU3RyaW5nRW50cnkCCQEBUgAFAVIFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJlYQEKc2V0TWFuYWdlcgECZlgEAmVPCQECZlcBBQJlYQMJAAACBQJlTwUCZU8EAmZZCQDZBAEFAmZYAwkAAAIFAmZZBQJmWQkAzAgCCQELU3RyaW5nRW50cnkCCQEBVAAFAmZYBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CZWEBDmNvbmZpcm1NYW5hZ2VyAAQCY2sJAQJmUwAEAmZaAwkBCWlzRGVmaW5lZAEFAmNrBgkAAgECEk5vIHBlbmRpbmcgbWFuYWdlcgMJAAACBQJmWgUCZloEAmdhAwkAAAIIBQJlYQ9jYWxsZXJQdWJsaWNLZXkJAQV2YWx1ZQEFAmNrBgkAAgECG1lvdSBhcmUgbm90IHBlbmRpbmcgbWFuYWdlcgMJAAACBQJnYQUCZ2EJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVMACQDYBAEJAQV2YWx1ZQEFAmNrCQDMCAIJAQtEZWxldGVFbnRyeQEJAQFUAAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmVhAQNwdXQCAmdiAmdjBAJnZAkBAmJpAAQCZ2UJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIFAmdkBQFBAgpXciBzdCBhZGRyBAJnZgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUCZ2QFAUMCCldyIHNsIGFkZHIDCQBmAgAABQJnYgkAAgECDldyb25nIHNsaXBwYWdlAwkBAiE9AgkAkAMBCAUCZWEIcGF5bWVudHMAAgkAAgECDDIgcG1udHMgZXhwZAQCZ2cJAQJlYwoJAKUIAQgFAmVhBmNhbGxlcgkA2AQBCAUCZWENdHJhbnNhY3Rpb25JZAkBD0F0dGFjaGVkUGF5bWVudAIICQEFdmFsdWUBCQCRAwIIBQJlYQhwYXltZW50cwAAB2Fzc2V0SWQICQEFdmFsdWUBCQCRAwIIBQJlYQhwYXltZW50cwAABmFtb3VudAkAkQMCCAUCZWEIcGF5bWVudHMAAQUCZ2IGBwYAAAIABAJkdggFAmdnAl8yBAJnaAgFAmdnAl83BAJjTQgFAmdnAl85BAJkdwgFAmdnA18xMAQCZHgIBQJnZwNfMTEEAmN1CAUCZ2cDXzEyBAJjdggFAmdnA18xMwQCZGkJAPwHBAUCYUwCBGVtaXQJAMwIAgUCZHYFA25pbAUDbmlsAwkAAAIFAmRpBQJkaQQCZ2kEAmFDBQJkaQMJAAECBQJhQwIHQWRkcmVzcwQCZ2oFAmFDCQD8BwQFAmdqAgRlbWl0CQDMCAIFAmR2BQNuaWwFA25pbAUEdW5pdAMJAAACBQJnaQUCZ2kEAmdrAwkAZgIFAmR3AAAJAPwHBAUCZ2YCA3B1dAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQJjdQUCZHcFA25pbAUDbmlsAwkAAAIFAmdrBQJnawQCZ2wDCQBmAgUCZHgAAAkA/AcEBQJnZgIDcHV0BQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFAmN2BQJkeAUDbmlsBQNuaWwDCQAAAgUCZ2wFAmdsBAJnbQMFAmdjBAJnbgkA/AcEBQJnZQIFc3Rha2UFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUCZ2gFAmR2BQNuaWwDCQAAAgUCZ24FAmduBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAmVhBmNhbGxlcgUCZHYFAmdoBQNuaWwEAmdvCQECZEgDAAAAAAAABAJmUQgFAmdvAl8xBAJkRwgFAmdvAl8yCQDOCAIJAM4IAgUCY00FAmdtBQJmUQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJlYQELcHV0T25lVGtuVjICAmZ0AmdjBAJncAoAAmZCCQD8BwQFAmFMAihpc1Bvb2xPbmVUb2tlbk9wZXJhdGlvbnNEaXNhYmxlZFJFQURPTkxZCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQNuaWwDCQABAgUCZkICB0Jvb2xlYW4FAmZCCQACAQkArAICCQADAQUCZkICHCBjb3VsZG4ndCBiZSBjYXN0IHRvIEJvb2xlYW4EAmdxAwMDCQECYU4ABgkAAAIFAmJjBQFvBgkAAAIFAmJjBQFxBgUCZ3AEAmdyCQDMCAIDAwkBASEBBQJncQYJAQJmVQEFAmVhBgkBAmFJAQIhcHV0IG9wZXJhdGlvbiBpcyBibG9ja2VkIGJ5IGFkbWluCQDMCAIDCQAAAgkAkAMBCAUCZWEIcGF5bWVudHMAAQYJAQJhSQECHmV4YWN0bHkgMSBwYXltZW50IGFyZSBleHBlY3RlZAUDbmlsAwkAAAIFAmdyBQJncgQCYVkJAQJhUQAEAmN1CQCRAwIFAmFZBQF1BAJjdgkAkQMCBQJhWQUBdgQCY3QJANkEAQkAkQMCBQJhWQUBdAQCZngJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJhWQUBdwQCZnkJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJhWQUBeAQCY3MDCQAAAggFAmVhBmNhbGxlcgUEdGhpcwgFAmVhDG9yaWdpbkNhbGxlcggFAmVhBmNhbGxlcgQCZWIJAQV2YWx1ZQEJAJEDAggFAmVhCHBheW1lbnRzAAAEAmNxCQDYBAEJAQV2YWx1ZQEIBQJlYgdhc3NldElkBAJjVwgFAmViBmFtb3VudAQCZ3MJAQJlVgUFAmNXBQJjcQkApQgBBQJjcwkA2AQBCAUCZWENdHJhbnNhY3Rpb25JZAYDCQAAAgUCZ3MFAmdzBAJjbggFAmdzAl8zBAJjTQgFAmdzAl8yBAJndAgFAmdzAl8xBAJkdgMDCQBmAgUCZnQAAAkAZgIFAmZ0BQJndAcJAQJhSQEJALkJAgkAzAgCAh9hbW91bnQgdG8gcmVjZWl2ZSBpcyBsZXNzIHRoYW4gCQDMCAIJAKQDAQUCZnQFA25pbAIABQJndAQCZ2cJAPwHBAUCYUwCBGVtaXQJAMwIAgUCZHYFA25pbAUDbmlsAwkAAAIFAmdnBQJnZwQCZ2kEAmFDBQJnZwMJAAECBQJhQwIHQWRkcmVzcwQCZ2oFAmFDCQD8BwQFAmdqAgRlbWl0CQDMCAIFAmR2BQNuaWwFA25pbAUEdW5pdAMJAAACBQJnaQUCZ2kEAmdtAwUCZ2MEAmduCQD8BwQFAmJrAgVzdGFrZQUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQJjdAUCZHYFA25pbAMJAAACBQJnbgUCZ24FA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUCZWEGY2FsbGVyBQJkdgUCY3QFA25pbAQCZksDCQBmAgUCY24AAAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQJhUAUCY24JANkEAQUCY3EFA25pbAUDbmlsBAJndQMJAAACBQR0aGlzBQJhUAkAlAoCAAAAAAQCZ3YDCQAAAggFAmViB2Fzc2V0SWQFAmJlBgcDBQJndgkAlAoCCQEBLQEFAmNuAAAJAJQKAgAACQEBLQEFAmNuBAJkSQgFAmd1Al8xBAJkSggFAmd1Al8yBAJndwkBAmRIAwUCZEkFAmRKAAAEAmZRCAUCZ3cCXzEEAmRHCAUCZ3cCXzIJAJQKAgkAzggCCQDOCAIJAM4IAgUCY00FAmdtBQJmSwUCZlEFAmR2CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmVhAQpwdXRGb3JGcmVlAQJneAMJAGYCAAAFAmd4CQACAQIKV3Jvbmcgc2xwZwMJAQIhPQIJAJADAQgFAmVhCHBheW1lbnRzAAIJAAIBAgwyIHBtbnRzIGV4cGQEAmd5CQECZWMKCQClCAEIBQJlYQZjYWxsZXIJANgEAQgFAmVhDXRyYW5zYWN0aW9uSWQJAQ9BdHRhY2hlZFBheW1lbnQCCAkBBXZhbHVlAQkAkQMCCAUCZWEIcGF5bWVudHMAAAdhc3NldElkCAkBBXZhbHVlAQkAkQMCCAUCZWEIcGF5bWVudHMAAAZhbW91bnQJAJEDAggFAmVhCHBheW1lbnRzAAEFAmd4BwcGAAACAAQCY00IBQJneQJfOQQCZ3oJAQJkSAMAAAAAAAAEAmZRCAUCZ3oCXzEEAmdBCAUCZ3oCXzIJAM4IAgUCY00FAmZRAmVhAQNnZXQABAJkaQkBAmRaAQUCZWEEAmdCCAUCZGkCXzEEAmNMCAUCZGkCXzIEAmNXCAUCZGkCXzMEAmNxCAUCZGkCXzQEAmNNCAUCZGkCXzUEAmVQCQD8BwQFAmFMAgRidXJuCQDMCAIFAmNXBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFAmNxBQJjVwUDbmlsAwkAAAIFAmVQBQJlUAQCZ0MJAQJkSAMJAQEtAQUCZ0IJAQEtAQUCY0wAAAQCZlEIBQJnQwJfMQQCZEcIBQJnQwJfMgkAzggCBQJjTQUCZlEJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CZWEBC2dldE9uZVRrblYyAgJmcwJmdAQCZ3AKAAJmQgkA/AcEBQJhTAIoaXNQb29sT25lVG9rZW5PcGVyYXRpb25zRGlzYWJsZWRSRUFET05MWQkAzAgCCQClCAEFBHRoaXMFA25pbAUDbmlsAwkAAQIFAmZCAgdCb29sZWFuBQJmQgkAAgEJAKwCAgkAAwEFAmZCAhwgY291bGRuJ3QgYmUgY2FzdCB0byBCb29sZWFuBAJnRAMDCQECYU4ABgkAAAIFAmJjBQFxBgUCZ3AEAmdyCQDMCAIDAwkBASEBBQJnRAYJAQJmVQEFAmVhBgkBAmFJAQIhZ2V0IG9wZXJhdGlvbiBpcyBibG9ja2VkIGJ5IGFkbWluCQDMCAIDCQAAAgkAkAMBCAUCZWEIcGF5bWVudHMAAQYJAQJhSQECHmV4YWN0bHkgMSBwYXltZW50IGFyZSBleHBlY3RlZAUDbmlsAwkA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IGl0c2VsZi4CZWEBDXVuc3Rha2VBbmRHZXQBAmNtBAJnVQMJAQIhPQIJAJADAQgFAmVhCHBheW1lbnRzAAAJAAIBAg1ObyBwbW50cyBleHBkBgMJAAACBQJnVQUCZ1UEAmNjCQECYVEABAJnVgkBAmJpAAQCZ2gJANkEAQkAkQMCBQJjYwUBdAQCZ1cJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIFAmdWBQFBAgpXciBzdCBhZGRyBAJnWAkA/AcEBQJnVwIHdW5zdGFrZQkAzAgCCQDYBAEFAmdoCQDMCAIFAmNtBQNuaWwFA25pbAMJAAACBQJnWAUCZ1gEAmRpCQECY28ECQDYBAEIBQJlYQ10cmFuc2FjdGlvbklkCQDYBAEFAmdoBQJjbQgFAmVhBmNhbGxlcgQCY0sIBQJkaQJfMQQCY0wIBQJkaQJfMgQCY3kJAQ1wYXJzZUludFZhbHVlAQgFAmRpAl85BAJjTQgFAmRpA18xMAQCZ1kDAwkBAmFOAAYJAAACBQJjeQUBcQkAAgEJAKwCAgIJQmxvY2tlZDogCQCkAwEFAmN5BgMJAAACBQJnWQUCZ1kEAmdaCQD8BwQFAmFMAgRidXJuCQDMCAIFAmNtBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFAmdoBQJjbQUDbmlsAwkAAAIFAmdaBQJnWgQCaGEJAQJkSAMJAQEtAQUCY0sJAQEtAQUCY0wAAAQCZlEIBQJoYQJfMQQCZEcIBQJoYQJfMgkAzggCBQJjTQUCZlEJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CZWEBE3Vuc3Rha2VBbmRHZXROb0xlc3MDAmhiAmhjAmdSBAJnRAMJAQJhTgAGCQAAAgUCYmMFAXEEAmdyCQDMCAIDCQEBIQEFAmdEBgkAAgECIWdldCBvcGVyYXRpb24gaXMgYmxvY2tlZCBieSBhZG1pbgkAzAgCAwkAAAIJAJADAQgFAmVhCHBheW1lbnRzAAAGCQACAQIYbm8gcGF5bWVudHMgYXJlIGV4cGVjdGVkBQNuaWwDCQAAAgUCZ3IFAmdyBAJnWAkA/AcEBQJiawIHdW5zdGFrZQkAzAgCCQDYBAEFAmJkCQDMCAIFAmhiBQNuaWwFA25pbAMJAAACBQJnWAUCZ1gEAmhkCQECY28ECQDYBAEIBQJlYQ10cmFuc2FjdGlvbklkCQDYBAEFAmJkBQJoYggFAmVhBmNhbGxlcgQCY0sIBQJoZAJfMQQCY0wIBQJoZAJfMgQCY00IBQJoZANfMTAEAmhlCQDMCAIDCQBnAgUCY0sFAmhjBgkAAgEJALkJAgkAzAgCAixhbW91bnQgYXNzZXQgYW1vdW50IHRvIHJlY2VpdmUgaXMgbGVzcyB0aGFuIAkAzAgCCQCkAwEFAmhjBQNuaWwCAAkAzAgCAwkAZwIFAmNMBQJnUgYJAAIBCQC5CQIJAMwIAgIrcHJpY2UgYXNzZXQgYW1vdW50IHRvIHJlY2VpdmUgaXMgbGVzcyB0aGFuIAkAzAgCCQCkAwEFAmdSBQNuaWwCAAUDbmlsAwkAAAIFAmhlBQJoZQQCZ1MJAPwHBAUCYUwCBGJ1cm4JAMwIAgUCaGIFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUCYmQFAmhiBQNuaWwDCQAAAgUCZ1MFAmdTBAJoZgkBAmRIAwkBAS0BBQJjSwkBAS0BBQJjTAAABAJmUQgFAmhmAl8xBAJkRwgFAmhmAl8yCQDOCAIFAmNNBQJmUQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJlYQEVdW5zdGFrZUFuZEdldE9uZVRrblYyAwJoYgJmcwJmdAQCZ3AKAAJmQgkA/AcEBQJhTAIoaXNQb29sT25lVG9rZW5PcGVyYXRpb25zRGlzYWJsZWRSRUFET05MWQkAzAgCCQClCAEFBHRoaXMFA25pbAUDbmlsAwkAAQIFAmZCAgdCb29sZWFuBQJmQgkAAgEJAKwCAgkAAwEFAmZCAhwgY291bGRuJ3QgYmUgY2FzdCB0byBCb29sZWFuBAJnRAMDCQECYU4ABgkAAAIFAmJjBQFxBgUCZ3AEAmdyCQDMCAIDAwkBASEBBQJnRAYJAQJmVQEFAmVhBgkBAmFJAQIhZ2V0IG9wZXJhdGlvbiBpcyBibG9ja2VkIGJ5IGFkbWluCQDMCAIDCQAAAgkAkAMBCAUCZWEIcGF5bWVudHMAAAYJAQJhSQECGG5vIHBheW1lbnRzIGFyZSBleHBlY3RlZAUDbmlsAwkAAAIFAmdyBQJncgQCY2MJAQJhUQAEAmdWCQECYmkABAJnaAkA2QQBCQCRAwIFAmNjBQF0BAJnVwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUCZ1YFAUECCldyIHN0IGFkZHIEAmdYCQD8BwQFAmdXAgd1bnN0YWtlCQDMCAIJANgEAQUCZ2gJAMwIAgUCaGIFA25pbAUDbmlsAwkAAAIFAmdYBQJnWAQCaGcJAQJmcgYFAmZzBQJmdAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUCZ2gFAmhiBQNuaWwIBQJlYQZjYWxsZXIIBQJlYQxvcmlnaW5DYWxsZXIIBQJlYQ10cmFuc2FjdGlvbklkBAJjTQgFAmhnAl8xBAJmRAgFAmhnAl8yCQCUCgIFAmNNBQJmRAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJlYQEccHV0T25lVGtuVjJXaXRoQm9udXNSRUFET05MWQICaGgCaGkEAmFZCQECYVEABAJjdQkAkQMCBQJhWQUBdQQCY3YJAJEDAgUCYVkFAXYEAmN0CQCRAwIFAmFZBQF0BAJoagkBAmVWBQUCaGgFAmhpAgACAAYEAmZsCAUCaGoCXzEEAmNNCAUCaGoCXzIEAmNuCAUCaGoCXzMEAmZxCAUCaGoCXzQJAJQKAgUDbmlsCQCVCgMFAmZsBQJjbgUCZnECZWEBIXB1dE9uZVRrblYyV2l0aG91dFRha2VGZWVSRUFET05MWQICaGgCaGkEAmFZCQECYVEABAJjdQkAkQMCBQJhWQUBdQQCY3YJAJEDAgUCYVkFAXYEAmN0CQCRAwIFAmFZBQF0BAJoawkBAmVWBQUCaGgFAmhpAgACAAcEAmZsCAUCaGsCXzEEAmNNCAUCaGsCXzIEAmNuCAUCaGsCXzMEAmZxCAUCaGsCXzQJAJQKAgUDbmlsCQCVCgMFAmZsBQJjbgUCZnECZWEBCGFjdGl2YXRlAgJobAJobQMJAQIhPQIJAKUIAQgFAmVhBmNhbGxlcgkApQgBBQJhTAkAAgECBmRlbmllZAkAlAoCCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhYwAFAmhsCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhZAAFAmhtBQNuaWwCB3N1Y2Nlc3MCZWEBBHNldFMCAmhuAmdZAwkBAiE9AgkApQgBCAUCZWEGY2FsbGVyCQECYUUCBQR0aGlzCQECYWYABQJmVAkAzAgCCQELU3RyaW5nRW50cnkCBQJobgUCZ1kFA25pbAJlYQEEc2V0SQICaG4CZ1kDCQECIT0CCQClCAEIBQJlYQZjYWxsZXIJAQJhRQIFBHRoaXMJAQJhZgAFAmZUCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQJobgUCZ1kFA25pbAJlYQEcZ2V0UG9vbENvbmZpZ1dyYXBwZXJSRUFET05MWQAJAJQKAgUDbmlsCQECYVEAAmVhARxnZXRBY2NCYWxhbmNlV3JhcHBlclJFQURPTkxZAQJiRQkAlAoCBQNuaWwJAQJiRAEFAmJFAmVhARljYWxjUHJpY2VzV3JhcHBlclJFQURPTkxZAwJiVwJiWAJjYgQCaG8JAQJjYQMFAmJXBQJiWAUCY2IJAJQKAgUDbmlsCQDMCAIJAKYDAQkAkQMCBQJobwAACQDMCAIJAKYDAQkAkQMCBQJobwABCQDMCAIJAKYDAQkAkQMCBQJobwACBQNuaWwCZWEBFmZyb21YMThXcmFwcGVyUkVBRE9OTFkCAUoCaHAJAJQKAgUDbmlsCQEBSQIJAKcDAQUBSgUCaHACZWEBFHRvWDE4V3JhcHBlclJFQURPTkxZAgFHAUgJAJQKAgUDbmlsCQCmAwEJAQFGAgUBRwUBSAJlYQEeY2FsY1ByaWNlQmlnSW50V3JhcHBlclJFQURPTkxZAgJiRwJiSAkAlAoCBQNuaWwJAKYDAQkBAmJGAgkApwMBBQJiRwkApwMBBQJiSAJlYQEjZXN0aW1hdGVQdXRPcGVyYXRpb25XcmFwcGVyUkVBRE9OTFkJAmNwAmJMAmNPAmNQAmNRAmNSAmhxAmNTAmNUCQCUCgIFA25pbAkBAmNODQUCY3AFAmJMBQJjTwUCY1AFAmNRBQJjUgUCaHEFAmNTBQJjVAYHAAACAAJlYQEjZXN0aW1hdGVHZXRPcGVyYXRpb25XcmFwcGVyUkVBRE9OTFkEAmNwAmhyAmNyAmhxBAJkaQkBAmNvBAUCY3AFAmhyBQJjcgkBEUBleHRyTmF0aXZlKDEwNjIpAQUCaHEJAJQKAgUDbmlsCQCcCgoIBQJkaQJfMQgFAmRpAl8yCAUCZGkCXzMIBQJkaQJfNAgFAmRpAl81CAUCZGkCXzYIBQJkaQJfNwkApgMBCAUCZGkCXzgIBQJkaQJfOQgFAmRpA18xMAJlYQEOZ2V0RmVlUkVBRE9OTFkACQCUCgIFA25pbAUCYWgBAmhzAQJodAAEAmh1BAJhQwkBAmZSAAMJAAECBQJhQwIKQnl0ZVZlY3RvcgQCZlYFAmFDBQJmVgMJAAECBQJhQwIEVW5pdAgFAmhzD3NlbmRlclB1YmxpY0tleQkAAgECC01hdGNoIGVycm9yBAJhQwUCaHMDCQABAgUCYUMCBU9yZGVyBAJkUQUCYUMEAmh2CQECYU8ABAJodwkBAmRQAQUCZFEEAmh4CQD0AwMIBQJkUQlib2R5Qnl0ZXMJAJEDAggFAmRRBnByb29mcwAACAUCZFEPc2VuZGVyUHVibGljS2V5BAJoeQkA9AMDCAUCZFEJYm9keUJ5dGVzCQCRAwIIBQJkUQZwcm9vZnMAAQUCaHYDAwMFAmh3BQJoeAcFAmh5BwYJAQJheAMFAmh3BQJoeAUCaHkDCQABAgUCYUMCFFNldFNjcmlwdFRyYW5zYWN0aW9uBAJlbgUCYUMEAmh6CQD2AwEJAQV2YWx1ZQEIBQJlbgZzY3JpcHQEAmhBCQDbBAEJAQV2YWx1ZQEJAJ0IAgUCYUwJAQJhdgAEAmhCCQDxBwEFBHRoaXMDAwkAAAIFAmhBBQJoegkBAiE9AgUCaEIFAmh6BwYJAPQDAwgFAmhzCWJvZHlCeXRlcwkAkQMCCAUCaHMGcHJvb2ZzAAAFAmh1CQD0AwMIBQJocwlib2R5Qnl0ZXMJAJEDAggFAmhzBnByb29mcwAABQJodU+D3yE=", "chainId": 84, "height": 2339550, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 8rK5KoYi8F3fGjzvSu5FwGmBFHYG6WoL3ToAbYnfgLoC Next: EiUzic1cRvSiLn447aA6A9RydyLZ5jD47RPBFvkTWguY Diff:
OldNewDifferences
739739 then {
740740 let burn = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
741741 if ((burn == burn))
742- then $Tuple2(state, totalAmount)
742+ then {
743+ let $t02943829788 = {
744+ let feeAmountForCalc = if ((this == feeCollectorAddress))
745+ then 0
746+ else feeAmount
747+ let outInAmountAsset = if ((parseAssetId(outAssetId) == cfgAmountAssetId))
748+ then true
749+ else false
750+ if (outInAmountAsset)
751+ then $Tuple2(-((totalGet + feeAmountForCalc)), 0)
752+ else $Tuple2(0, -((totalGet + feeAmountForCalc)))
753+ }
754+ let amountAssetBalanceDelta = $t02943829788._1
755+ let priceAssetBalanceDelta = $t02943829788._2
756+ let $t02979129899 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
757+ let refreshDLpActions = $t02979129899._1
758+ let updatedDLp = $t02979129899._2
759+ $Tuple2((state ++ refreshDLpActions), totalAmount)
760+ }
743761 else throw("Strict value is not equal to itself.")
744762 }
745763 else throw("Strict value is not equal to itself.")
887905 else throw("Strict value is not equal to itself.")
888906 }
889907 else [ScriptTransfer(i.caller, emitLpAmt, lpAssetId)]
890- (state ++ lpTrnsfr)
908+ let $t03348133546 = refreshDLpInternal(0, 0, 0)
909+ let refreshDLpActions = $t03348133546._1
910+ let updatedDLp = $t03348133546._2
911+ ((state ++ lpTrnsfr) ++ refreshDLpActions)
891912 }
892913 else throw("Strict value is not equal to itself.")
893914 }
937958 let pmt = value(i.payments[0])
938959 let pmtAssetId = toBase58String(value(pmt.assetId))
939960 let pmtAmt = pmt.amount
940- let $t03401534173 = calcPutOneTkn(pmtAmt, pmtAssetId, toString(userAddress), toBase58String(i.transactionId), true)
941- if (($t03401534173 == $t03401534173))
961+ let $t03460834766 = calcPutOneTkn(pmtAmt, pmtAssetId, toString(userAddress), toBase58String(i.transactionId), true)
962+ if (($t03460834766 == $t03460834766))
942963 then {
943- let feeAmount = $t03401534173._3
944- let state = $t03401534173._2
945- let estimLP = $t03401534173._1
964+ let feeAmount = $t03460834766._3
965+ let state = $t03460834766._2
966+ let estimLP = $t03460834766._1
946967 let emitLpAmt = if (if ((minOutAmount > 0))
947968 then (minOutAmount > estimLP)
948969 else false)
970991 let sendFeeToMatcher = if ((feeAmount > 0))
971992 then [ScriptTransfer(feeCollectorAddress, feeAmount, fromBase58String(pmtAssetId))]
972993 else nil
973- $Tuple2(((state ++ lpTrnsfr) ++ sendFeeToMatcher), emitLpAmt)
994+ let $t03558135930 = if ((this == feeCollectorAddress))
995+ then $Tuple2(0, 0)
996+ else {
997+ let paymentInAmountAsset = if ((pmt.assetId == cfgAmountAssetId))
998+ then true
999+ else false
1000+ if (paymentInAmountAsset)
1001+ then $Tuple2(-(feeAmount), 0)
1002+ else $Tuple2(0, -(feeAmount))
1003+ }
1004+ let amountAssetBalanceDelta = $t03558135930._1
1005+ let priceAssetBalanceDelta = $t03558135930._2
1006+ let $t03593336041 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
1007+ let refreshDLpActions = $t03593336041._1
1008+ let updatedDLp = $t03593336041._2
1009+ $Tuple2((((state ++ lpTrnsfr) ++ sendFeeToMatcher) ++ refreshDLpActions), emitLpAmt)
9741010 }
9751011 else throw("Strict value is not equal to itself.")
9761012 }
9901026 then throw("2 pmnts expd")
9911027 else {
9921028 let estPut = cp(toString(i.caller), toBase58String(i.transactionId), AttachedPayment(value(i.payments[0]).assetId, value(i.payments[0]).amount), i.payments[1], maxSlpg, false, false, true, 0, "")
993- estPut._9
1029+ let state = estPut._9
1030+ let $t03679736862 = refreshDLpInternal(0, 0, 0)
1031+ let refreshDLpActions = $t03679736862._1
1032+ let updatedKLp = $t03679736862._2
1033+ (state ++ refreshDLpActions)
9941034 }
9951035
9961036
10051045 let state = r._5
10061046 let b = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
10071047 if ((b == b))
1008- then state
1048+ then {
1049+ let $t03749437576 = refreshDLpInternal(-(outAmtAmt), -(outPrAmt), 0)
1050+ let refreshDLpActions = $t03749437576._1
1051+ let updatedDLp = $t03749437576._2
1052+ (state ++ refreshDLpActions)
1053+ }
10091054 else throw("Strict value is not equal to itself.")
10101055 }
10111056
10331078 else throwErr("exactly 1 payment are expected")]
10341079 if ((checks == checks))
10351080 then {
1036- let $t03679536950 = getOneTknV2Internal(outAssetId, minOutAmount, i.payments, i.caller, i.originCaller, i.transactionId)
1037- let state = $t03679536950._1
1038- let totalAmount = $t03679536950._2
1081+ let $t03812138276 = getOneTknV2Internal(outAssetId, minOutAmount, i.payments, i.caller, i.originCaller, i.transactionId)
1082+ let state = $t03812138276._1
1083+ let totalAmount = $t03812138276._2
10391084 $Tuple2(state, totalAmount)
10401085 }
10411086 else throw("Strict value is not equal to itself.")
10511096 else throwErr(makeString([toString(dLpRefreshDelay), " blocks have not passed since the previous call"], ""))
10521097 if ((checkLastRefreshedBlockHeight == checkLastRefreshedBlockHeight))
10531098 then {
1054- let $t03734837403 = refreshDLpInternal(0, 0, 0)
1055- let actions = $t03734837403._1
1056- let updatedKLp = $t03734837403._2
1099+ let $t03867438729 = refreshDLpInternal(0, 0, 0)
1100+ let actions = $t03867438729._1
1101+ let updatedKLp = $t03867438729._2
10571102 $Tuple2(actions, toString(updatedKLp))
10581103 }
10591104 else throw("Strict value is not equal to itself.")
10791124 let newY = getYD(xp, index, D1)
10801125 let dy = (xp[index] - newY)
10811126 let totalGetRaw = max([0, toInt((dy - big1))])
1082- let $t03820538254 = takeFee(totalGetRaw)
1083- let totalGet = $t03820538254._1
1084- let feeAmount = $t03820538254._2
1127+ let $t03953139580 = takeFee(totalGetRaw)
1128+ let totalGet = $t03953139580._1
1129+ let feeAmount = $t03953139580._2
10851130 $Tuple2(nil, $Tuple2(totalGet, feeAmount))
10861131 }
10871132
10951140 let lpId = poolConfig[idxLPAsId]
10961141 let amBalance = getAccBalance(amId)
10971142 let prBalance = getAccBalance(prId)
1098- let $t03859938714 = {
1143+ let $t03992540040 = {
10991144 let @ = invoke(this, "getOneTknV2READONLY", [outAssetId, lpAssetAmount], nil)
11001145 if ($isInstanceOf(@, "(Int, Int)"))
11011146 then @
11021147 else throw(($getType(@) + " couldn't be cast to (Int, Int)"))
11031148 }
1104- let totalGet = $t03859938714._1
1105- let feeAmount = $t03859938714._2
1149+ let totalGet = $t03992540040._1
1150+ let feeAmount = $t03992540040._2
11061151 let r = ego("", lpId, lpAssetAmount, this)
11071152 let outAmAmt = r._1
11081153 let outPrAmt = r._2
11321177 else {
11331178 let burnLPAssetOnFactory = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
11341179 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
1135- then state
1180+ then {
1181+ let $t04112641207 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1182+ let refreshDLpActions = $t04112641207._1
1183+ let updatedDLp = $t04112641207._2
1184+ (state ++ refreshDLpActions)
1185+ }
11361186 else throw("Strict value is not equal to itself.")
11371187 }
11381188 }
11541204 if ((unstakeInv == unstakeInv))
11551205 then {
11561206 let r = ego(toBase58String(i.transactionId), toBase58String(lpAssetId), amount, i.caller)
1207+ let outAmAmt = r._1
1208+ let outPrAmt = r._2
11571209 let sts = parseIntValue(r._9)
11581210 let state = r._10
11591211 let v = if (if (igs())
11651217 then {
11661218 let burnA = invoke(fca, "burn", [amount], [AttachedPayment(lpAssetId, amount)])
11671219 if ((burnA == burnA))
1168- then state
1220+ then {
1221+ let $t04212042201 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1222+ let refreshDLpActions = $t04212042201._1
1223+ let updatedDLp = $t04212042201._2
1224+ (state ++ refreshDLpActions)
1225+ }
11691226 else throw("Strict value is not equal to itself.")
11701227 }
11711228 else throw("Strict value is not equal to itself.")
12051262 then {
12061263 let burnLPAssetOnFactory = invoke(fca, "burn", [unstakeAmount], [AttachedPayment(cfgLpAssetId, unstakeAmount)])
12071264 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
1208- then state
1265+ then {
1266+ let $t04329943380 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1267+ let refreshDLpActions = $t04329943380._1
1268+ let updatedDLp = $t04329943380._2
1269+ (state ++ refreshDLpActions)
1270+ }
12091271 else throw("Strict value is not equal to itself.")
12101272 }
12111273 else throw("Strict value is not equal to itself.")
12461308 let unstakeInv = invoke(staking, "unstake", [toBase58String(lpAssetId), unstakeAmount], nil)
12471309 if ((unstakeInv == unstakeInv))
12481310 then {
1249- let $t04255242740 = getOneTknV2Internal(outAssetId, minOutAmount, [AttachedPayment(lpAssetId, unstakeAmount)], i.caller, i.originCaller, i.transactionId)
1250- let state = $t04255242740._1
1251- let totalAmount = $t04255242740._2
1311+ let $t04424144429 = getOneTknV2Internal(outAssetId, minOutAmount, [AttachedPayment(lpAssetId, unstakeAmount)], i.caller, i.originCaller, i.transactionId)
1312+ let state = $t04424144429._1
1313+ let totalAmount = $t04424144429._2
12521314 $Tuple2(state, totalAmount)
12531315 }
12541316 else throw("Strict value is not equal to itself.")
12641326 let amId = poolConfig[idxAmAsId]
12651327 let prId = poolConfig[idxPrAsId]
12661328 let lpId = poolConfig[idxLPAsId]
1267- let $t04299943102 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "", true)
1268- let lpAmount = $t04299943102._1
1269- let state = $t04299943102._2
1270- let feeAmount = $t04299943102._3
1271- let bonus = $t04299943102._4
1329+ let $t04468844791 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "", true)
1330+ let lpAmount = $t04468844791._1
1331+ let state = $t04468844791._2
1332+ let feeAmount = $t04468844791._3
1333+ let bonus = $t04468844791._4
12721334 $Tuple2(nil, $Tuple3(lpAmount, feeAmount, bonus))
12731335 }
12741336
12801342 let amId = poolConfig[idxAmAsId]
12811343 let prId = poolConfig[idxPrAsId]
12821344 let lpId = poolConfig[idxLPAsId]
1283- let $t04338143485 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "", false)
1284- let lpAmount = $t04338143485._1
1285- let state = $t04338143485._2
1286- let feeAmount = $t04338143485._3
1287- let bonus = $t04338143485._4
1345+ let $t04507045174 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "", false)
1346+ let lpAmount = $t04507045174._1
1347+ let state = $t04507045174._2
1348+ let feeAmount = $t04507045174._3
1349+ let bonus = $t04507045174._4
12881350 $Tuple2(nil, $Tuple3(lpAmount, feeAmount, bonus))
12891351 }
12901352
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let scale8 = 100000000
55
66 let scale8BigInt = toBigInt(100000000)
77
88 let scale18 = toBigInt(1000000000000000000)
99
1010 let zeroBigInt = toBigInt(0)
1111
1212 let big0 = toBigInt(0)
1313
1414 let big1 = toBigInt(1)
1515
1616 let big2 = toBigInt(2)
1717
1818 let slippage4D = toBigInt((scale8 - ((scale8 * 1) / scale8)))
1919
2020 let wavesString = "WAVES"
2121
2222 let Amult = "100"
2323
2424 let Dconv = "1"
2525
2626 let SEP = "__"
2727
2828 let EMPTY = ""
2929
3030 let PoolActive = 1
3131
3232 let PoolPutDis = 2
3333
3434 let PoolMatcherDis = 3
3535
3636 let PoolShutdown = 4
3737
3838 let idxPoolAddress = 1
3939
4040 let idxPoolSt = 2
4141
4242 let idxLPAsId = 3
4343
4444 let idxAmAsId = 4
4545
4646 let idxPrAsId = 5
4747
4848 let idxAmtAsDcm = 6
4949
5050 let idxPriceAsDcm = 7
5151
5252 let idxIAmtAsId = 8
5353
5454 let idxIPriceAsId = 9
5555
5656 let idxFactStakCntr = 1
5757
5858 let idxFactoryRestCntr = 6
5959
6060 let idxFactSlippCntr = 7
6161
6262 let idxFactGwxRewCntr = 10
6363
6464 let feeDefault = fraction(10, scale8, 10000)
6565
6666 func t1 (origVal,origScaleMult) = fraction(toBigInt(origVal), scale18, toBigInt(origScaleMult))
6767
6868
6969 func f1 (val,resultScaleMult) = toInt(fraction(val, toBigInt(resultScaleMult), scale18))
7070
7171
7272 func ts (amt,resScale,curScale) = fraction(amt, resScale, curScale)
7373
7474
7575 func abs (val) = if ((zeroBigInt > val))
7676 then -(val)
7777 else val
7878
7979
8080 func absBigInt (val) = if ((zeroBigInt > val))
8181 then -(val)
8282 else val
8383
8484
8585 func fc () = "%s__factoryContract"
8686
8787
8888 func mpk () = "%s__managerPublicKey"
8989
9090
9191 func pmpk () = "%s__pendingManagerPublicKey"
9292
9393
9494 func pl () = "%s%s__price__last"
9595
9696
9797 func ph (h,t) = makeString(["%s%s%d%d__price__history", toString(h), toString(t)], SEP)
9898
9999
100100 func pau (ua,txId) = ((("%s%s%s__P__" + ua) + "__") + txId)
101101
102102
103103 func gau (ua,txId) = ((("%s%s%s__G__" + ua) + "__") + txId)
104104
105105
106106 func aa () = "%s__amountAsset"
107107
108108
109109 func pa () = "%s__priceAsset"
110110
111111
112112 func amp () = "%s__amp"
113113
114114
115115 func ada () = "%s__addonAddr"
116116
117117
118118 let keyFee = "%s__fee"
119119
120120 let fee = valueOrElse(getInteger(this, keyFee), feeDefault)
121121
122122 let keyDLp = makeString(["%s", "dLp"], SEP)
123123
124124 let keyDLpRefreshedHeight = makeString(["%s", "dLpRefreshedHeight"], SEP)
125125
126126 let keyDLpRefreshDelay = makeString(["%s", "refreshDLpDelay"], SEP)
127127
128128 let dLpRefreshDelayDefault = 30
129129
130130 let dLpRefreshDelay = valueOrElse(getInteger(this, keyDLpRefreshDelay), dLpRefreshDelayDefault)
131131
132132 func fcfg () = "%s__factoryConfig"
133133
134134
135135 func mtpk () = "%s%s__matcher__publicKey"
136136
137137
138138 func pc (iAmtAs,iPrAs) = (((("%d%d%s__" + iAmtAs) + "__") + iPrAs) + "__config")
139139
140140
141141 func mba (bAStr) = ("%s%s%s__mappings__baseAsset2internalId__" + bAStr)
142142
143143
144144 func aps () = "%s__shutdown"
145145
146146
147147 func keyAllowedLpStableScriptHash () = "%s__allowedLpStableScriptHash"
148148
149149
150150 func keyFeeCollectorAddress () = "%s__feeCollectorAddress"
151151
152152
153153 func toe (orV,sendrV,matchV) = throw(((((("Failed: ordValid=" + toString(orV)) + " sndrValid=") + toString(sendrV)) + " mtchrValid=") + toString(matchV)))
154154
155155
156156 func str (val) = match val {
157157 case valStr: String =>
158158 valStr
159159 case _ =>
160160 throw("fail cast to String")
161161 }
162162
163163
164164 func strf (addr,key) = valueOrErrorMessage(getString(addr, key), makeString(["mandatory ", toString(addr), ".", key, " not defined"], ""))
165165
166166
167167 func intf (addr,key) = valueOrErrorMessage(getInteger(addr, key), makeString(["mandatory ", toString(addr), ".", key, " not defined"], ""))
168168
169169
170170 func throwErr (msg) = throw(makeString(["lp_stable.ride:", msg], " "))
171171
172172
173173 func fmtErr (msg) = makeString(["lp_stable.ride:", msg], " ")
174174
175175
176176 let fca = addressFromStringValue(strf(this, fc()))
177177
178178 let A = strf(this, amp())
179179
180180 func igs () = valueOrElse(getBoolean(fca, aps()), false)
181181
182182
183183 func mp () = fromBase58String(strf(fca, mtpk()))
184184
185185
186186 let feeCollectorAddress = addressFromStringValue(strf(fca, keyFeeCollectorAddress()))
187187
188188 func gpc () = {
189189 let amtAs = strf(this, aa())
190190 let priceAs = strf(this, pa())
191191 let iPriceAs = intf(fca, mba(priceAs))
192192 let iAmtAs = intf(fca, mba(amtAs))
193193 split(strf(fca, pc(toString(iAmtAs), toString(iPriceAs))), SEP)
194194 }
195195
196196
197197 func parseAssetId (input) = if ((input == wavesString))
198198 then unit
199199 else fromBase58String(input)
200200
201201
202202 func assetIdToString (input) = if ((input == unit))
203203 then wavesString
204204 else toBase58String(value(input))
205205
206206
207207 func parsePoolConfig (poolConfig) = $Tuple7(addressFromStringValue(poolConfig[idxPoolAddress]), parseIntValue(poolConfig[idxPoolSt]), fromBase58String(poolConfig[idxLPAsId]), parseAssetId(poolConfig[idxAmAsId]), parseAssetId(poolConfig[idxPrAsId]), parseIntValue(poolConfig[idxAmtAsDcm]), parseIntValue(poolConfig[idxPriceAsDcm]))
208208
209209
210210 let poolConfigParsed = parsePoolConfig(gpc())
211211
212212 let $t072087394 = poolConfigParsed
213213
214214 let cfgPoolAddress = $t072087394._1
215215
216216 let cfgPoolStatus = $t072087394._2
217217
218218 let cfgLpAssetId = $t072087394._3
219219
220220 let cfgAmountAssetId = $t072087394._4
221221
222222 let cfgPriceAssetId = $t072087394._5
223223
224224 let cfgAmountAssetDecimals = $t072087394._6
225225
226226 let cfgPriceAssetDecimals = $t072087394._7
227227
228228 func gfc () = split(strf(fca, fcfg()), SEP)
229229
230230
231231 let factoryConfig = gfc()
232232
233233 let stakingContract = valueOrErrorMessage(addressFromString(factoryConfig[idxFactStakCntr]), "Invalid staking contract address")
234234
235235 let slipageContract = valueOrErrorMessage(addressFromString(factoryConfig[idxFactSlippCntr]), "Invalid slipage contract address")
236236
237237 let gwxContract = valueOrErrorMessage(addressFromString(factoryConfig[idxFactGwxRewCntr]), "Invalid gwx contract address")
238238
239239 let restContract = valueOrErrorMessage(addressFromString(factoryConfig[idxFactoryRestCntr]), "Invalid gwx contract address")
240240
241241 func dataPutActionInfo (inAmtAssetAmt,inPriceAssetAmt,outLpAmt,price,slipByUser,slippageReal,txHeight,txTimestamp,slipageAmAmt,slipagePrAmt) = makeString(["%d%d%d%d%d%d%d%d%d%d", toString(inAmtAssetAmt), toString(inPriceAssetAmt), toString(outLpAmt), toString(price), toString(slipByUser), toString(slippageReal), toString(txHeight), toString(txTimestamp), toString(slipageAmAmt), toString(slipagePrAmt)], SEP)
242242
243243
244244 func dataGetActionInfo (outAmtAssetAmt,outPriceAssetAmt,inLpAmt,price,txHeight,txTimestamp) = makeString(["%d%d%d%d%d%d", toString(outAmtAssetAmt), toString(outPriceAssetAmt), toString(inLpAmt), toString(price), toString(txHeight), toString(txTimestamp)], SEP)
245245
246246
247247 func getAccBalance (assetId) = if ((assetId == "WAVES"))
248248 then wavesBalance(this).available
249249 else assetBalance(this, fromBase58String(assetId))
250250
251251
252252 func cpbi (prAmtX18,amAmtX18) = fraction(prAmtX18, scale18, amAmtX18)
253253
254254
255255 func vad (A1,A2,slippage) = {
256256 let diff = fraction((A1 - A2), scale8BigInt, A2)
257257 let pass = ((slippage - abs(diff)) > zeroBigInt)
258258 if (!(pass))
259259 then throw(("Big slpg: " + toString(diff)))
260260 else $Tuple2(pass, min([A1, A2]))
261261 }
262262
263263
264264 func vd (D1,D0,slpg) = {
265265 let diff = fraction(D0, scale8BigInt, D1)
266266 let fail = (slpg > diff)
267267 if (if (fail)
268268 then true
269269 else (D0 > D1))
270270 then throw(((((((toString(D0) + " ") + toString(D1)) + " ") + toString(diff)) + " ") + toString(slpg)))
271271 else fail
272272 }
273273
274274
275275 func pcp (amAssetDcm,prAssetDcm,amAmt,prAmt) = {
276276 let amtAsAmtX18 = t1(amAmt, amAssetDcm)
277277 let prAsAmtX18 = t1(prAmt, prAssetDcm)
278278 cpbi(prAsAmtX18, amtAsAmtX18)
279279 }
280280
281281
282282 func calcPrices (amAmt,prAmt,lpAmt) = {
283283 let cfg = gpc()
284284 let amtAsDcm = parseIntValue(cfg[idxAmtAsDcm])
285285 let prAsDcm = parseIntValue(cfg[idxPriceAsDcm])
286286 let priceX18 = pcp(amtAsDcm, prAsDcm, amAmt, prAmt)
287287 let amAmtX18 = t1(amAmt, amtAsDcm)
288288 let prAmtX18 = t1(prAmt, prAsDcm)
289289 let lpAmtX18 = t1(lpAmt, scale8)
290290 let lpPrInAmAsX18 = cpbi(amAmtX18, lpAmtX18)
291291 let lpPrInPrAsX18 = cpbi(prAmtX18, lpAmtX18)
292292 [priceX18, lpPrInAmAsX18, lpPrInPrAsX18]
293293 }
294294
295295
296296 func calculatePrices (amAmt,prAmt,lpAmt) = {
297297 let p = calcPrices(amAmt, prAmt, lpAmt)
298298 [f1(p[0], scale8), f1(p[1], scale8), f1(p[2], scale8)]
299299 }
300300
301301
302302 func takeFee (amount) = {
303303 let feeAmount = fraction(amount, fee, scale8)
304304 $Tuple2((amount - feeAmount), feeAmount)
305305 }
306306
307307
308308 func ego (txId58,pmtAssetId,pmtLpAmt,userAddress) = {
309309 let cfg = gpc()
310310 let lpId = cfg[idxLPAsId]
311311 let amId = cfg[idxAmAsId]
312312 let prId = cfg[idxPrAsId]
313313 let amDcm = parseIntValue(cfg[idxAmtAsDcm])
314314 let prDcm = parseIntValue(cfg[idxPriceAsDcm])
315315 let sts = cfg[idxPoolSt]
316316 let lpEmiss = valueOrErrorMessage(assetInfo(fromBase58String(lpId)), "Wrong LP id").quantity
317317 if ((lpId != pmtAssetId))
318318 then throw("Wrong pmt asset")
319319 else {
320320 let amBalance = getAccBalance(amId)
321321 let amBalanceX18 = t1(amBalance, amDcm)
322322 let prBalance = getAccBalance(prId)
323323 let prBalanceX18 = t1(prBalance, prDcm)
324324 let curPriceX18 = cpbi(prBalanceX18, amBalanceX18)
325325 let curPrice = f1(curPriceX18, scale8)
326326 let pmtLpAmtX18 = t1(pmtLpAmt, scale8)
327327 let lpEmissX18 = t1(lpEmiss, scale8)
328328 let outAmAmtX18 = fraction(amBalanceX18, pmtLpAmtX18, lpEmissX18)
329329 let outPrAmtX18 = fraction(prBalanceX18, pmtLpAmtX18, lpEmissX18)
330330 let outAmAmt = f1(outAmAmtX18, amDcm)
331331 let outPrAmt = f1(outPrAmtX18, prDcm)
332332 let state = if ((txId58 == ""))
333333 then nil
334334 else [ScriptTransfer(userAddress, outAmAmt, if ((amId == "WAVES"))
335335 then unit
336336 else fromBase58String(amId)), ScriptTransfer(userAddress, outPrAmt, if ((prId == "WAVES"))
337337 then unit
338338 else fromBase58String(prId)), StringEntry(gau(toString(userAddress), txId58), dataGetActionInfo(outAmAmt, outPrAmt, pmtLpAmt, curPrice, height, lastBlock.timestamp)), IntegerEntry(pl(), curPrice), IntegerEntry(ph(height, lastBlock.timestamp), curPrice)]
339339 $Tuple10(outAmAmt, outPrAmt, amId, prId, amBalance, prBalance, lpEmiss, curPriceX18, sts, state)
340340 }
341341 }
342342
343343
344344 func epo (txId58,slippage,inAmAmt,inAmId,inPrAmt,inPrId,userAddress,isEval,emitLp,isOneAsset,validateSlippage,pmtAmt,pmtId) = {
345345 let cfg = gpc()
346346 let lpId = fromBase58String(cfg[idxLPAsId])
347347 let amIdStr = cfg[idxAmAsId]
348348 let prIdStr = cfg[idxPrAsId]
349349 let inAmIdStr = cfg[idxIAmtAsId]
350350 let inPrIdStr = cfg[idxIPriceAsId]
351351 let amtDcm = parseIntValue(cfg[idxAmtAsDcm])
352352 let priceDcm = parseIntValue(cfg[idxPriceAsDcm])
353353 let sts = cfg[idxPoolSt]
354354 let lpEm = valueOrErrorMessage(assetInfo(lpId), "Wr lp as").quantity
355355 let amBalance = if (isEval)
356356 then getAccBalance(amIdStr)
357357 else if (if (isOneAsset)
358358 then (pmtId == amIdStr)
359359 else false)
360360 then (getAccBalance(amIdStr) - pmtAmt)
361361 else if (isOneAsset)
362362 then getAccBalance(amIdStr)
363363 else (getAccBalance(amIdStr) - inAmAmt)
364364 let prBalance = if (isEval)
365365 then getAccBalance(prIdStr)
366366 else if (if (isOneAsset)
367367 then (pmtId == prIdStr)
368368 else false)
369369 then (getAccBalance(prIdStr) - pmtAmt)
370370 else if (isOneAsset)
371371 then getAccBalance(prIdStr)
372372 else (getAccBalance(prIdStr) - inPrAmt)
373373 let inAmAssetAmtX18 = t1(inAmAmt, amtDcm)
374374 let inPrAssetAmtX18 = t1(inPrAmt, priceDcm)
375375 let userPriceX18 = cpbi(inPrAssetAmtX18, inAmAssetAmtX18)
376376 let amBalanceX18 = t1(amBalance, amtDcm)
377377 let prBalanceX18 = t1(prBalance, priceDcm)
378378 let r = if ((lpEm == 0))
379379 then {
380380 let curPriceX18 = zeroBigInt
381381 let slippageX18 = zeroBigInt
382382 let lpAmtX18 = pow((inAmAssetAmtX18 * inPrAssetAmtX18), 0, toBigInt(5), 1, 0, DOWN)
383383 $Tuple5(f1(lpAmtX18, scale8), f1(inAmAssetAmtX18, amtDcm), f1(inPrAssetAmtX18, priceDcm), cpbi((prBalanceX18 + inPrAssetAmtX18), (amBalanceX18 + inAmAssetAmtX18)), slippageX18)
384384 }
385385 else {
386386 let curPriceX18 = cpbi(prBalanceX18, amBalanceX18)
387387 let slippageRealX18 = fraction(abs((curPriceX18 - userPriceX18)), scale18, curPriceX18)
388388 let slippageX18 = t1(slippage, scale8)
389389 if (if (if (validateSlippage)
390390 then (curPriceX18 != zeroBigInt)
391391 else false)
392392 then (slippageRealX18 > slippageX18)
393393 else false)
394394 then throw(((("Price slippage " + toString(slippageRealX18)) + " > ") + toString(slippageX18)))
395395 else {
396396 let lpEmissionX18 = t1(lpEm, scale8)
397397 let prViaAmX18 = fraction(inAmAssetAmtX18, curPriceX18, scale18)
398398 let amViaPrX18 = fraction(inPrAssetAmtX18, scale18, curPriceX18)
399399 let expectedAmts = if ((prViaAmX18 > inPrAssetAmtX18))
400400 then $Tuple2(amViaPrX18, inPrAssetAmtX18)
401401 else $Tuple2(inAmAssetAmtX18, prViaAmX18)
402402 let expAmtAssetAmtX18 = expectedAmts._1
403403 let expPriceAssetAmtX18 = expectedAmts._2
404404 let lpAmtX18 = fraction(lpEmissionX18, expPriceAssetAmtX18, prBalanceX18)
405405 $Tuple5(f1(lpAmtX18, scale8), f1(expAmtAssetAmtX18, amtDcm), f1(expPriceAssetAmtX18, priceDcm), curPriceX18, slippageX18)
406406 }
407407 }
408408 let calcLpAmt = r._1
409409 let calcAmAssetPmt = r._2
410410 let calcPrAssetPmt = r._3
411411 let curPrice = f1(r._4, scale8)
412412 let slippageCalc = f1(r._5, scale8)
413413 if ((0 >= calcLpAmt))
414414 then throw("LP <= 0")
415415 else {
416416 let emitLpAmt = if (!(emitLp))
417417 then 0
418418 else calcLpAmt
419419 let amDiff = (inAmAmt - calcAmAssetPmt)
420420 let prDiff = (inPrAmt - calcPrAssetPmt)
421421 let $t01782518170 = if (if (isOneAsset)
422422 then (pmtId == amIdStr)
423423 else false)
424424 then $Tuple2(pmtAmt, 0)
425425 else if (if (isOneAsset)
426426 then (pmtId == prIdStr)
427427 else false)
428428 then $Tuple2(0, pmtAmt)
429429 else $Tuple2(calcAmAssetPmt, calcPrAssetPmt)
430430 let writeAmAmt = $t01782518170._1
431431 let writePrAmt = $t01782518170._2
432432 let commonState = [IntegerEntry(pl(), curPrice), IntegerEntry(ph(height, lastBlock.timestamp), curPrice), StringEntry(pau(userAddress, txId58), dataPutActionInfo(writeAmAmt, writePrAmt, emitLpAmt, curPrice, slippage, slippageCalc, height, lastBlock.timestamp, amDiff, prDiff))]
433433 $Tuple13(calcLpAmt, emitLpAmt, curPrice, amBalance, prBalance, lpEm, lpId, sts, commonState, amDiff, prDiff, inAmId, inPrId)
434434 }
435435 }
436436
437437
438438 func calcDLp (amountBalance,priceBalance,lpEmission) = {
439439 let updatedDLp = fraction((amountBalance * priceBalance), scale18, lpEmission)
440440 updatedDLp
441441 }
442442
443443
444444 func refreshDLpInternal (amountAssetBalanceDelta,priceAssetBalanceDelta,lpAssetEmissionDelta) = {
445445 let amountAssetBalance = (getAccBalance(assetIdToString(cfgAmountAssetId)) + amountAssetBalanceDelta)
446446 let priceAssetBalance = (getAccBalance(assetIdToString(cfgPriceAssetId)) + priceAssetBalanceDelta)
447447 let lpAssetEmission = (value(assetInfo(cfgLpAssetId)).quantity + lpAssetEmissionDelta)
448448 let updatedDLp = calcDLp(toBigInt(amountAssetBalance), toBigInt(priceAssetBalance), toBigInt(lpAssetEmission))
449449 let actions = [IntegerEntry(keyDLpRefreshedHeight, height), StringEntry(keyDLp, toString(updatedDLp))]
450450 $Tuple2(actions, updatedDLp)
451451 }
452452
453453
454454 func moa (order) = {
455455 let amountAssetAmount = order.amount
456456 let priceAssetAmount = fraction(order.amount, order.price, scale8)
457457 let $t02011920331 = if ((order.orderType == Buy))
458458 then $Tuple2(amountAssetAmount, -(priceAssetAmount))
459459 else $Tuple2(-(amountAssetAmount), priceAssetAmount)
460460 let amountAssetBalanceDelta = $t02011920331._1
461461 let priceAssetBalanceDelta = $t02011920331._2
462462 if (if (if (igs())
463463 then true
464464 else (cfgPoolStatus == PoolMatcherDis))
465465 then true
466466 else (cfgPoolStatus == PoolShutdown))
467467 then throw("Admin blocked")
468468 else if (if ((order.assetPair.amountAsset != cfgAmountAssetId))
469469 then true
470470 else (order.assetPair.priceAsset != cfgPriceAssetId))
471471 then throw("Wr assets")
472472 else {
473473 let dLp = valueOrErrorMessage(parseBigInt(valueOrErrorMessage(getString(this, keyDLp), fmtErr("dLp is required"))), fmtErr("invalid dLp"))
474474 let $t02075820858 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
475475 let unusedActions = $t02075820858._1
476476 let dLpNew = $t02075820858._2
477477 let isOrderValid = (dLpNew > dLp)
478478 isOrderValid
479479 }
480480 }
481481
482482
483483 func cg (i) = if ((size(i.payments) != 1))
484484 then throw("1 pmnt exp")
485485 else {
486486 let pmt = value(i.payments[0])
487487 let pmtAssetId = value(pmt.assetId)
488488 let pmtAmt = pmt.amount
489489 let r = ego(toBase58String(i.transactionId), toBase58String(pmtAssetId), pmtAmt, i.caller)
490490 let outAmAmt = r._1
491491 let outPrAmt = r._2
492492 let sts = parseIntValue(r._9)
493493 let state = r._10
494494 if (if (igs())
495495 then true
496496 else (sts == PoolShutdown))
497497 then throw(("Admin blocked: " + toString(sts)))
498498 else $Tuple5(outAmAmt, outPrAmt, pmtAmt, pmtAssetId, state)
499499 }
500500
501501
502502 func cp (caller,txId,amAsPmt,prAsPmt,slippage,emitLp,isOneAsset,validateSlippage,pmtAmt,pmtId) = {
503503 let r = epo(txId, slippage, value(amAsPmt).amount, value(amAsPmt).assetId, value(prAsPmt).amount, value(prAsPmt).assetId, caller, (txId == ""), emitLp, isOneAsset, validateSlippage, pmtAmt, pmtId)
504504 let sts = parseIntValue(r._8)
505505 if (if (if (igs())
506506 then true
507507 else (sts == PoolPutDis))
508508 then true
509509 else (sts == PoolShutdown))
510510 then throw(("Blocked:" + toString(sts)))
511511 else r
512512 }
513513
514514
515515 func getD (xp) = {
516516 let n = big2
517517 let xp0 = xp[0]
518518 let xp1 = xp[1]
519519 let aPrecision = parseBigIntValue(Amult)
520520 let a = (parseBigIntValue(A) * aPrecision)
521521 let s = (xp0 + xp1)
522522 if ((s == big0))
523523 then big0
524524 else {
525525 let ann = (a * n)
526526 let xp0_xp1_n_n = (((xp0 * xp1) * n) * n)
527527 let ann_s_aPrecision = ((ann * s) / aPrecision)
528528 let ann_aPrecision = (ann - aPrecision)
529529 let n1 = (n + big1)
530530 func calc (acc,cur) = {
531531 let $t02301123031 = acc
532532 let d = $t02301123031._1
533533 let found = $t02301123031._2
534534 if ((found != unit))
535535 then acc
536536 else {
537537 let dp = (((d * d) * d) / xp0_xp1_n_n)
538538 let dNext = (((ann_s_aPrecision + (dp * n)) * d) / (((ann_aPrecision * d) / aPrecision) + (n1 * dp)))
539539 let dDiff = absBigInt((dNext - value(d)))
540540 if ((big1 >= dDiff))
541541 then $Tuple2(dNext, cur)
542542 else $Tuple2(dNext, unit)
543543 }
544544 }
545545
546546 let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
547547 let $t02345223499 = {
548548 let $l = arr
549549 let $s = size($l)
550550 let $acc0 = $Tuple2(s, unit)
551551 func $f0_1 ($a,$i) = if (($i >= $s))
552552 then $a
553553 else calc($a, $l[$i])
554554
555555 func $f0_2 ($a,$i) = if (($i >= $s))
556556 then $a
557557 else throw("List size exceeds 15")
558558
559559 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
560560 }
561561 let d = $t02345223499._1
562562 let found = $t02345223499._2
563563 if ((found != unit))
564564 then d
565565 else throw(("D calculation error, D = " + toString(d)))
566566 }
567567 }
568568
569569
570570 func getYD (xp,i,D) = {
571571 let n = big2
572572 let x = xp[if ((i == 0))
573573 then 1
574574 else 0]
575575 let aPrecision = parseBigIntValue(Amult)
576576 let a = (parseBigIntValue(A) * aPrecision)
577577 let s = x
578578 let ann = (a * n)
579579 let c = (((((D * D) / (x * n)) * D) * aPrecision) / (ann * n))
580580 let b = ((s + ((D * aPrecision) / ann)) - D)
581581 func calc (acc,cur) = {
582582 let $t02399924019 = acc
583583 let y = $t02399924019._1
584584 let found = $t02399924019._2
585585 if ((found != unit))
586586 then acc
587587 else {
588588 let yNext = (((y * y) + c) / ((big2 * y) + b))
589589 let yDiff = absBigInt((yNext - value(y)))
590590 if ((big1 >= yDiff))
591591 then $Tuple2(yNext, cur)
592592 else $Tuple2(yNext, unit)
593593 }
594594 }
595595
596596 let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
597597 let $t02432624373 = {
598598 let $l = arr
599599 let $s = size($l)
600600 let $acc0 = $Tuple2(D, unit)
601601 func $f0_1 ($a,$i) = if (($i >= $s))
602602 then $a
603603 else calc($a, $l[$i])
604604
605605 func $f0_2 ($a,$i) = if (($i >= $s))
606606 then $a
607607 else throw("List size exceeds 15")
608608
609609 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
610610 }
611611 let y = $t02432624373._1
612612 let found = $t02432624373._2
613613 if ((found != unit))
614614 then y
615615 else throw(("Y calculation error, Y = " + toString(y)))
616616 }
617617
618618
619619 func calcPutOneTkn (pmtAmtRaw,pmtAssetId,userAddress,txId,withTakeFee) = {
620620 let poolConfig = gpc()
621621 let amId = poolConfig[idxAmAsId]
622622 let prId = poolConfig[idxPrAsId]
623623 let lpId = poolConfig[idxLPAsId]
624624 let amtDcm = parseIntValue(poolConfig[idxAmtAsDcm])
625625 let priceDcm = parseIntValue(poolConfig[idxPriceAsDcm])
626626 let lpAssetEmission = toBigInt(valueOrErrorMessage(assetInfo(fromBase58String(lpId)), "invalid lp asset").quantity)
627627 let chechEmission = if ((lpAssetEmission > big0))
628628 then true
629629 else throw("initial deposit requires all coins")
630630 if ((chechEmission == chechEmission))
631631 then {
632632 let amBalance = getAccBalance(amId)
633633 let prBalance = getAccBalance(prId)
634634 let $t02515625618 = if ((txId == ""))
635635 then $Tuple2(amBalance, prBalance)
636636 else if ((pmtAssetId == amId))
637637 then if ((pmtAmtRaw > amBalance))
638638 then throw("invalid payment amount")
639639 else $Tuple2((amBalance - pmtAmtRaw), prBalance)
640640 else if ((pmtAssetId == prId))
641641 then if ((pmtAmtRaw > prBalance))
642642 then throw("invalid payment amount")
643643 else $Tuple2(amBalance, (prBalance - pmtAmtRaw))
644644 else throw("wrong pmtAssetId")
645645 let amBalanceOld = $t02515625618._1
646646 let prBalanceOld = $t02515625618._2
647647 let $t02562425800 = if ((pmtAssetId == amId))
648648 then $Tuple2(pmtAmtRaw, 0)
649649 else if ((pmtAssetId == prId))
650650 then $Tuple2(0, pmtAmtRaw)
651651 else throw("invalid payment")
652652 let amAmountRaw = $t02562425800._1
653653 let prAmountRaw = $t02562425800._2
654654 let $t02580426043 = if (withTakeFee)
655655 then $Tuple3(takeFee(amAmountRaw)._1, takeFee(prAmountRaw)._1, takeFee(pmtAmtRaw)._2)
656656 else $Tuple3(amAmountRaw, prAmountRaw, 0)
657657 let amAmount = $t02580426043._1
658658 let prAmount = $t02580426043._2
659659 let feeAmount = $t02580426043._3
660660 let amBalanceNew = (amBalanceOld + amAmount)
661661 let prBalanceNew = (prBalanceOld + prAmount)
662662 let D0 = getD([toBigInt(amBalanceOld), toBigInt(prBalanceOld)])
663663 let D1 = getD([toBigInt(amBalanceNew), toBigInt(prBalanceNew)])
664664 let checkD = if ((D1 > D0))
665665 then true
666666 else throw()
667667 if ((checkD == checkD))
668668 then {
669669 let lpAmount = fraction(lpAssetEmission, (D1 - D0), D0)
670670 let curPrice = f1(cpbi(t1(prBalanceNew, priceDcm), t1(amBalanceNew, amtDcm)), scale8)
671671 let commonState = [IntegerEntry(pl(), curPrice), IntegerEntry(ph(height, lastBlock.timestamp), curPrice), StringEntry(pau(userAddress, txId), dataPutActionInfo(amAmountRaw, prAmountRaw, toInt(lpAmount), curPrice, 0, 0, height, lastBlock.timestamp, 0, 0))]
672672 let poolProportion = fraction(prBalanceOld, scale8, amBalanceOld)
673673 let amountAssetPart = fraction(pmtAmtRaw, scale8, (poolProportion + scale8))
674674 let priceAssetPart = (pmtAmtRaw - amountAssetPart)
675675 let lpAmtBoth = fraction(lpAssetEmission, toBigInt(priceAssetPart), toBigInt(prBalanceOld))
676676 let bonus = toInt(fraction((lpAmount - lpAmtBoth), scale8BigInt, lpAmtBoth))
677677 $Tuple4(toInt(lpAmount), commonState, feeAmount, bonus)
678678 }
679679 else throw("Strict value is not equal to itself.")
680680 }
681681 else throw("Strict value is not equal to itself.")
682682 }
683683
684684
685685 func getOneTknV2Internal (outAssetId,minOutAmount,payments,caller,originCaller,transactionId) = {
686686 let poolConfig = gpc()
687687 let lpId = poolConfig[idxLPAsId]
688688 let amId = poolConfig[idxAmAsId]
689689 let prId = poolConfig[idxPrAsId]
690690 let amDecimals = parseIntValue(poolConfig[idxAmtAsDcm])
691691 let prDecimals = parseIntValue(poolConfig[idxPriceAsDcm])
692692 let poolStatus = poolConfig[idxPoolSt]
693693 let userAddress = if ((caller == restContract))
694694 then originCaller
695695 else caller
696696 let pmt = value(payments[0])
697697 let pmtAssetId = value(pmt.assetId)
698698 let pmtAmt = pmt.amount
699699 let txId58 = toBase58String(transactionId)
700700 if ((lpId != toBase58String(pmtAssetId)))
701701 then throw("Wrong LP")
702702 else {
703703 let amBalance = getAccBalance(amId)
704704 let prBalance = getAccBalance(prId)
705705 let $t02804528156 = {
706706 let @ = invoke(this, "getOneTknV2READONLY", [outAssetId, pmtAmt], nil)
707707 if ($isInstanceOf(@, "(Int, Int)"))
708708 then @
709709 else throw(($getType(@) + " couldn't be cast to (Int, Int)"))
710710 }
711711 if (($t02804528156 == $t02804528156))
712712 then {
713713 let feeAmount = $t02804528156._2
714714 let totalGet = $t02804528156._1
715715 let totalAmount = if (if ((minOutAmount > 0))
716716 then (minOutAmount > totalGet)
717717 else false)
718718 then throwErr(makeString(["amount to receive is less than ", toString(minOutAmount)], ""))
719719 else totalGet
720720 let $t02834628653 = if ((outAssetId == amId))
721721 then $Tuple4(totalAmount, 0, ((amBalance - totalAmount) - feeAmount), prBalance)
722722 else if ((outAssetId == prId))
723723 then $Tuple4(0, totalAmount, amBalance, ((prBalance - totalAmount) - feeAmount))
724724 else throw("invalid out asset id")
725725 let outAm = $t02834628653._1
726726 let outPr = $t02834628653._2
727727 let amBalanceNew = $t02834628653._3
728728 let prBalanceNew = $t02834628653._4
729729 let curPrX18 = cpbi(t1(prBalanceNew, prDecimals), t1(amBalanceNew, amDecimals))
730730 let curPr = f1(curPrX18, scale8)
731731 let outAssetIdOrWaves = if ((outAssetId == "WAVES"))
732732 then unit
733733 else fromBase58String(outAssetId)
734734 let sendFeeToMatcher = if ((feeAmount > 0))
735735 then [ScriptTransfer(feeCollectorAddress, feeAmount, outAssetIdOrWaves)]
736736 else nil
737737 let state = ([ScriptTransfer(userAddress, totalAmount, outAssetIdOrWaves), StringEntry(gau(toString(userAddress), txId58), dataGetActionInfo(outAm, outPr, pmtAmt, curPr, height, lastBlock.timestamp)), IntegerEntry(pl(), curPr), IntegerEntry(ph(height, lastBlock.timestamp), curPr)] ++ sendFeeToMatcher)
738738 if ((state == state))
739739 then {
740740 let burn = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
741741 if ((burn == burn))
742- then $Tuple2(state, totalAmount)
742+ then {
743+ let $t02943829788 = {
744+ let feeAmountForCalc = if ((this == feeCollectorAddress))
745+ then 0
746+ else feeAmount
747+ let outInAmountAsset = if ((parseAssetId(outAssetId) == cfgAmountAssetId))
748+ then true
749+ else false
750+ if (outInAmountAsset)
751+ then $Tuple2(-((totalGet + feeAmountForCalc)), 0)
752+ else $Tuple2(0, -((totalGet + feeAmountForCalc)))
753+ }
754+ let amountAssetBalanceDelta = $t02943829788._1
755+ let priceAssetBalanceDelta = $t02943829788._2
756+ let $t02979129899 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
757+ let refreshDLpActions = $t02979129899._1
758+ let updatedDLp = $t02979129899._2
759+ $Tuple2((state ++ refreshDLpActions), totalAmount)
760+ }
743761 else throw("Strict value is not equal to itself.")
744762 }
745763 else throw("Strict value is not equal to itself.")
746764 }
747765 else throw("Strict value is not equal to itself.")
748766 }
749767 }
750768
751769
752770 func m () = match getString(mpk()) {
753771 case s: String =>
754772 fromBase58String(s)
755773 case _: Unit =>
756774 unit
757775 case _ =>
758776 throw("Match error")
759777 }
760778
761779
762780 func pm () = match getString(pmpk()) {
763781 case s: String =>
764782 fromBase58String(s)
765783 case _: Unit =>
766784 unit
767785 case _ =>
768786 throw("Match error")
769787 }
770788
771789
772790 let pd = throw("Permission denied")
773791
774792 func isManager (i) = match m() {
775793 case pk: ByteVector =>
776794 (i.callerPublicKey == pk)
777795 case _: Unit =>
778796 (i.caller == this)
779797 case _ =>
780798 throw("Match error")
781799 }
782800
783801
784802 func mm (i) = match m() {
785803 case pk: ByteVector =>
786804 if ((i.callerPublicKey == pk))
787805 then true
788806 else pd
789807 case _: Unit =>
790808 if ((i.caller == this))
791809 then true
792810 else pd
793811 case _ =>
794812 throw("Match error")
795813 }
796814
797815
798816 @Callable(i)
799817 func constructor (fc) = {
800818 let c = mm(i)
801819 if ((c == c))
802820 then [StringEntry(fc(), fc)]
803821 else throw("Strict value is not equal to itself.")
804822 }
805823
806824
807825
808826 @Callable(i)
809827 func setManager (pendingManagerPublicKey) = {
810828 let c = mm(i)
811829 if ((c == c))
812830 then {
813831 let cm = fromBase58String(pendingManagerPublicKey)
814832 if ((cm == cm))
815833 then [StringEntry(pmpk(), pendingManagerPublicKey)]
816834 else throw("Strict value is not equal to itself.")
817835 }
818836 else throw("Strict value is not equal to itself.")
819837 }
820838
821839
822840
823841 @Callable(i)
824842 func confirmManager () = {
825843 let p = pm()
826844 let hpm = if (isDefined(p))
827845 then true
828846 else throw("No pending manager")
829847 if ((hpm == hpm))
830848 then {
831849 let cpm = if ((i.callerPublicKey == value(p)))
832850 then true
833851 else throw("You are not pending manager")
834852 if ((cpm == cpm))
835853 then [StringEntry(mpk(), toBase58String(value(p))), DeleteEntry(pmpk())]
836854 else throw("Strict value is not equal to itself.")
837855 }
838856 else throw("Strict value is not equal to itself.")
839857 }
840858
841859
842860
843861 @Callable(i)
844862 func put (slip,autoStake) = {
845863 let factCfg = gfc()
846864 let stakingCntr = valueOrErrorMessage(addressFromString(factCfg[idxFactStakCntr]), "Wr st addr")
847865 let slipCntr = valueOrErrorMessage(addressFromString(factCfg[idxFactSlippCntr]), "Wr sl addr")
848866 if ((0 > slip))
849867 then throw("Wrong slippage")
850868 else if ((size(i.payments) != 2))
851869 then throw("2 pmnts expd")
852870 else {
853871 let e = cp(toString(i.caller), toBase58String(i.transactionId), AttachedPayment(value(i.payments[0]).assetId, value(i.payments[0]).amount), i.payments[1], slip, true, false, true, 0, "")
854872 let emitLpAmt = e._2
855873 let lpAssetId = e._7
856874 let state = e._9
857875 let amDiff = e._10
858876 let prDiff = e._11
859877 let amId = e._12
860878 let prId = e._13
861879 let r = invoke(fca, "emit", [emitLpAmt], nil)
862880 if ((r == r))
863881 then {
864882 let el = match r {
865883 case legacy: Address =>
866884 invoke(legacy, "emit", [emitLpAmt], nil)
867885 case _ =>
868886 unit
869887 }
870888 if ((el == el))
871889 then {
872890 let sa = if ((amDiff > 0))
873891 then invoke(slipCntr, "put", nil, [AttachedPayment(amId, amDiff)])
874892 else nil
875893 if ((sa == sa))
876894 then {
877895 let sp = if ((prDiff > 0))
878896 then invoke(slipCntr, "put", nil, [AttachedPayment(prId, prDiff)])
879897 else nil
880898 if ((sp == sp))
881899 then {
882900 let lpTrnsfr = if (autoStake)
883901 then {
884902 let ss = invoke(stakingCntr, "stake", nil, [AttachedPayment(lpAssetId, emitLpAmt)])
885903 if ((ss == ss))
886904 then nil
887905 else throw("Strict value is not equal to itself.")
888906 }
889907 else [ScriptTransfer(i.caller, emitLpAmt, lpAssetId)]
890- (state ++ lpTrnsfr)
908+ let $t03348133546 = refreshDLpInternal(0, 0, 0)
909+ let refreshDLpActions = $t03348133546._1
910+ let updatedDLp = $t03348133546._2
911+ ((state ++ lpTrnsfr) ++ refreshDLpActions)
891912 }
892913 else throw("Strict value is not equal to itself.")
893914 }
894915 else throw("Strict value is not equal to itself.")
895916 }
896917 else throw("Strict value is not equal to itself.")
897918 }
898919 else throw("Strict value is not equal to itself.")
899920 }
900921 }
901922
902923
903924
904925 @Callable(i)
905926 func putOneTknV2 (minOutAmount,autoStake) = {
906927 let isPoolOneTokenOperationsDisabled = {
907928 let @ = invoke(fca, "isPoolOneTokenOperationsDisabledREADONLY", [toString(this)], nil)
908929 if ($isInstanceOf(@, "Boolean"))
909930 then @
910931 else throw(($getType(@) + " couldn't be cast to Boolean"))
911932 }
912933 let isPutDisabled = if (if (if (igs())
913934 then true
914935 else (cfgPoolStatus == PoolPutDis))
915936 then true
916937 else (cfgPoolStatus == PoolShutdown))
917938 then true
918939 else isPoolOneTokenOperationsDisabled
919940 let checks = [if (if (!(isPutDisabled))
920941 then true
921942 else isManager(i))
922943 then true
923944 else throwErr("put operation is blocked by admin"), if ((size(i.payments) == 1))
924945 then true
925946 else throwErr("exactly 1 payment are expected")]
926947 if ((checks == checks))
927948 then {
928949 let poolConfig = gpc()
929950 let amId = poolConfig[idxAmAsId]
930951 let prId = poolConfig[idxPrAsId]
931952 let lpId = fromBase58String(poolConfig[idxLPAsId])
932953 let amDecimals = parseIntValue(poolConfig[idxAmtAsDcm])
933954 let prDecimals = parseIntValue(poolConfig[idxPriceAsDcm])
934955 let userAddress = if ((i.caller == this))
935956 then i.originCaller
936957 else i.caller
937958 let pmt = value(i.payments[0])
938959 let pmtAssetId = toBase58String(value(pmt.assetId))
939960 let pmtAmt = pmt.amount
940- let $t03401534173 = calcPutOneTkn(pmtAmt, pmtAssetId, toString(userAddress), toBase58String(i.transactionId), true)
941- if (($t03401534173 == $t03401534173))
961+ let $t03460834766 = calcPutOneTkn(pmtAmt, pmtAssetId, toString(userAddress), toBase58String(i.transactionId), true)
962+ if (($t03460834766 == $t03460834766))
942963 then {
943- let feeAmount = $t03401534173._3
944- let state = $t03401534173._2
945- let estimLP = $t03401534173._1
964+ let feeAmount = $t03460834766._3
965+ let state = $t03460834766._2
966+ let estimLP = $t03460834766._1
946967 let emitLpAmt = if (if ((minOutAmount > 0))
947968 then (minOutAmount > estimLP)
948969 else false)
949970 then throwErr(makeString(["amount to receive is less than ", toString(minOutAmount)], ""))
950971 else estimLP
951972 let e = invoke(fca, "emit", [emitLpAmt], nil)
952973 if ((e == e))
953974 then {
954975 let el = match e {
955976 case legacy: Address =>
956977 invoke(legacy, "emit", [emitLpAmt], nil)
957978 case _ =>
958979 unit
959980 }
960981 if ((el == el))
961982 then {
962983 let lpTrnsfr = if (autoStake)
963984 then {
964985 let ss = invoke(stakingContract, "stake", nil, [AttachedPayment(lpId, emitLpAmt)])
965986 if ((ss == ss))
966987 then nil
967988 else throw("Strict value is not equal to itself.")
968989 }
969990 else [ScriptTransfer(i.caller, emitLpAmt, lpId)]
970991 let sendFeeToMatcher = if ((feeAmount > 0))
971992 then [ScriptTransfer(feeCollectorAddress, feeAmount, fromBase58String(pmtAssetId))]
972993 else nil
973- $Tuple2(((state ++ lpTrnsfr) ++ sendFeeToMatcher), emitLpAmt)
994+ let $t03558135930 = if ((this == feeCollectorAddress))
995+ then $Tuple2(0, 0)
996+ else {
997+ let paymentInAmountAsset = if ((pmt.assetId == cfgAmountAssetId))
998+ then true
999+ else false
1000+ if (paymentInAmountAsset)
1001+ then $Tuple2(-(feeAmount), 0)
1002+ else $Tuple2(0, -(feeAmount))
1003+ }
1004+ let amountAssetBalanceDelta = $t03558135930._1
1005+ let priceAssetBalanceDelta = $t03558135930._2
1006+ let $t03593336041 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
1007+ let refreshDLpActions = $t03593336041._1
1008+ let updatedDLp = $t03593336041._2
1009+ $Tuple2((((state ++ lpTrnsfr) ++ sendFeeToMatcher) ++ refreshDLpActions), emitLpAmt)
9741010 }
9751011 else throw("Strict value is not equal to itself.")
9761012 }
9771013 else throw("Strict value is not equal to itself.")
9781014 }
9791015 else throw("Strict value is not equal to itself.")
9801016 }
9811017 else throw("Strict value is not equal to itself.")
9821018 }
9831019
9841020
9851021
9861022 @Callable(i)
9871023 func putForFree (maxSlpg) = if ((0 > maxSlpg))
9881024 then throw("Wrong slpg")
9891025 else if ((size(i.payments) != 2))
9901026 then throw("2 pmnts expd")
9911027 else {
9921028 let estPut = cp(toString(i.caller), toBase58String(i.transactionId), AttachedPayment(value(i.payments[0]).assetId, value(i.payments[0]).amount), i.payments[1], maxSlpg, false, false, true, 0, "")
993- estPut._9
1029+ let state = estPut._9
1030+ let $t03679736862 = refreshDLpInternal(0, 0, 0)
1031+ let refreshDLpActions = $t03679736862._1
1032+ let updatedKLp = $t03679736862._2
1033+ (state ++ refreshDLpActions)
9941034 }
9951035
9961036
9971037
9981038 @Callable(i)
9991039 func get () = {
10001040 let r = cg(i)
10011041 let outAmtAmt = r._1
10021042 let outPrAmt = r._2
10031043 let pmtAmt = r._3
10041044 let pmtAssetId = r._4
10051045 let state = r._5
10061046 let b = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
10071047 if ((b == b))
1008- then state
1048+ then {
1049+ let $t03749437576 = refreshDLpInternal(-(outAmtAmt), -(outPrAmt), 0)
1050+ let refreshDLpActions = $t03749437576._1
1051+ let updatedDLp = $t03749437576._2
1052+ (state ++ refreshDLpActions)
1053+ }
10091054 else throw("Strict value is not equal to itself.")
10101055 }
10111056
10121057
10131058
10141059 @Callable(i)
10151060 func getOneTknV2 (outAssetId,minOutAmount) = {
10161061 let isPoolOneTokenOperationsDisabled = {
10171062 let @ = invoke(fca, "isPoolOneTokenOperationsDisabledREADONLY", [toString(this)], nil)
10181063 if ($isInstanceOf(@, "Boolean"))
10191064 then @
10201065 else throw(($getType(@) + " couldn't be cast to Boolean"))
10211066 }
10221067 let isGetDisabled = if (if (igs())
10231068 then true
10241069 else (cfgPoolStatus == PoolShutdown))
10251070 then true
10261071 else isPoolOneTokenOperationsDisabled
10271072 let checks = [if (if (!(isGetDisabled))
10281073 then true
10291074 else isManager(i))
10301075 then true
10311076 else throwErr("get operation is blocked by admin"), if ((size(i.payments) == 1))
10321077 then true
10331078 else throwErr("exactly 1 payment are expected")]
10341079 if ((checks == checks))
10351080 then {
1036- let $t03679536950 = getOneTknV2Internal(outAssetId, minOutAmount, i.payments, i.caller, i.originCaller, i.transactionId)
1037- let state = $t03679536950._1
1038- let totalAmount = $t03679536950._2
1081+ let $t03812138276 = getOneTknV2Internal(outAssetId, minOutAmount, i.payments, i.caller, i.originCaller, i.transactionId)
1082+ let state = $t03812138276._1
1083+ let totalAmount = $t03812138276._2
10391084 $Tuple2(state, totalAmount)
10401085 }
10411086 else throw("Strict value is not equal to itself.")
10421087 }
10431088
10441089
10451090
10461091 @Callable(i)
10471092 func refreshDLp () = {
10481093 let lastRefreshedBlockHeight = valueOrElse(getInteger(keyDLpRefreshedHeight), 0)
10491094 let checkLastRefreshedBlockHeight = if (((height - lastRefreshedBlockHeight) >= dLpRefreshDelay))
10501095 then unit
10511096 else throwErr(makeString([toString(dLpRefreshDelay), " blocks have not passed since the previous call"], ""))
10521097 if ((checkLastRefreshedBlockHeight == checkLastRefreshedBlockHeight))
10531098 then {
1054- let $t03734837403 = refreshDLpInternal(0, 0, 0)
1055- let actions = $t03734837403._1
1056- let updatedKLp = $t03734837403._2
1099+ let $t03867438729 = refreshDLpInternal(0, 0, 0)
1100+ let actions = $t03867438729._1
1101+ let updatedKLp = $t03867438729._2
10571102 $Tuple2(actions, toString(updatedKLp))
10581103 }
10591104 else throw("Strict value is not equal to itself.")
10601105 }
10611106
10621107
10631108
10641109 @Callable(i)
10651110 func getOneTknV2READONLY (outAssetId,lpAssetAmount) = {
10661111 let poolConfig = gpc()
10671112 let amId = poolConfig[idxAmAsId]
10681113 let prId = poolConfig[idxPrAsId]
10691114 let lpId = poolConfig[idxLPAsId]
10701115 let xp = [toBigInt(getAccBalance(amId)), toBigInt(getAccBalance(prId))]
10711116 let lpEmission = toBigInt(valueOrErrorMessage(assetInfo(fromBase58String(lpId)), "invalid lp asset").quantity)
10721117 let D0 = getD(xp)
10731118 let D1 = (D0 - fraction(toBigInt(lpAssetAmount), D0, lpEmission))
10741119 let index = if ((outAssetId == amId))
10751120 then 0
10761121 else if ((outAssetId == prId))
10771122 then 1
10781123 else throw("invalid out asset id")
10791124 let newY = getYD(xp, index, D1)
10801125 let dy = (xp[index] - newY)
10811126 let totalGetRaw = max([0, toInt((dy - big1))])
1082- let $t03820538254 = takeFee(totalGetRaw)
1083- let totalGet = $t03820538254._1
1084- let feeAmount = $t03820538254._2
1127+ let $t03953139580 = takeFee(totalGetRaw)
1128+ let totalGet = $t03953139580._1
1129+ let feeAmount = $t03953139580._2
10851130 $Tuple2(nil, $Tuple2(totalGet, feeAmount))
10861131 }
10871132
10881133
10891134
10901135 @Callable(i)
10911136 func getOneTknV2WithBonusREADONLY (outAssetId,lpAssetAmount) = {
10921137 let poolConfig = gpc()
10931138 let amId = poolConfig[idxAmAsId]
10941139 let prId = poolConfig[idxPrAsId]
10951140 let lpId = poolConfig[idxLPAsId]
10961141 let amBalance = getAccBalance(amId)
10971142 let prBalance = getAccBalance(prId)
1098- let $t03859938714 = {
1143+ let $t03992540040 = {
10991144 let @ = invoke(this, "getOneTknV2READONLY", [outAssetId, lpAssetAmount], nil)
11001145 if ($isInstanceOf(@, "(Int, Int)"))
11011146 then @
11021147 else throw(($getType(@) + " couldn't be cast to (Int, Int)"))
11031148 }
1104- let totalGet = $t03859938714._1
1105- let feeAmount = $t03859938714._2
1149+ let totalGet = $t03992540040._1
1150+ let feeAmount = $t03992540040._2
11061151 let r = ego("", lpId, lpAssetAmount, this)
11071152 let outAmAmt = r._1
11081153 let outPrAmt = r._2
11091154 let sumOfGetAssets = (outAmAmt + outPrAmt)
11101155 let bonus = if ((sumOfGetAssets == 0))
11111156 then if ((totalGet == 0))
11121157 then 0
11131158 else throw("bonus calculation error")
11141159 else fraction((totalGet - sumOfGetAssets), scale8, sumOfGetAssets)
11151160 $Tuple2(nil, $Tuple3(totalGet, feeAmount, bonus))
11161161 }
11171162
11181163
11191164
11201165 @Callable(i)
11211166 func getNoLess (noLessThenAmtAsset,noLessThenPriceAsset) = {
11221167 let r = cg(i)
11231168 let outAmAmt = r._1
11241169 let outPrAmt = r._2
11251170 let pmtAmt = r._3
11261171 let pmtAssetId = r._4
11271172 let state = r._5
11281173 if ((noLessThenAmtAsset > outAmAmt))
11291174 then throw(((("Failed: " + toString(outAmAmt)) + " < ") + toString(noLessThenAmtAsset)))
11301175 else if ((noLessThenPriceAsset > outPrAmt))
11311176 then throw(((("Failed: " + toString(outPrAmt)) + " < ") + toString(noLessThenPriceAsset)))
11321177 else {
11331178 let burnLPAssetOnFactory = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
11341179 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
1135- then state
1180+ then {
1181+ let $t04112641207 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1182+ let refreshDLpActions = $t04112641207._1
1183+ let updatedDLp = $t04112641207._2
1184+ (state ++ refreshDLpActions)
1185+ }
11361186 else throw("Strict value is not equal to itself.")
11371187 }
11381188 }
11391189
11401190
11411191
11421192 @Callable(i)
11431193 func unstakeAndGet (amount) = {
11441194 let checkPayments = if ((size(i.payments) != 0))
11451195 then throw("No pmnts expd")
11461196 else true
11471197 if ((checkPayments == checkPayments))
11481198 then {
11491199 let cfg = gpc()
11501200 let factoryCfg = gfc()
11511201 let lpAssetId = fromBase58String(cfg[idxLPAsId])
11521202 let staking = valueOrErrorMessage(addressFromString(factoryCfg[idxFactStakCntr]), "Wr st addr")
11531203 let unstakeInv = invoke(staking, "unstake", [toBase58String(lpAssetId), amount], nil)
11541204 if ((unstakeInv == unstakeInv))
11551205 then {
11561206 let r = ego(toBase58String(i.transactionId), toBase58String(lpAssetId), amount, i.caller)
1207+ let outAmAmt = r._1
1208+ let outPrAmt = r._2
11571209 let sts = parseIntValue(r._9)
11581210 let state = r._10
11591211 let v = if (if (igs())
11601212 then true
11611213 else (sts == PoolShutdown))
11621214 then throw(("Blocked: " + toString(sts)))
11631215 else true
11641216 if ((v == v))
11651217 then {
11661218 let burnA = invoke(fca, "burn", [amount], [AttachedPayment(lpAssetId, amount)])
11671219 if ((burnA == burnA))
1168- then state
1220+ then {
1221+ let $t04212042201 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1222+ let refreshDLpActions = $t04212042201._1
1223+ let updatedDLp = $t04212042201._2
1224+ (state ++ refreshDLpActions)
1225+ }
11691226 else throw("Strict value is not equal to itself.")
11701227 }
11711228 else throw("Strict value is not equal to itself.")
11721229 }
11731230 else throw("Strict value is not equal to itself.")
11741231 }
11751232 else throw("Strict value is not equal to itself.")
11761233 }
11771234
11781235
11791236
11801237 @Callable(i)
11811238 func unstakeAndGetNoLess (unstakeAmount,noLessThenAmountAsset,noLessThenPriceAsset) = {
11821239 let isGetDisabled = if (igs())
11831240 then true
11841241 else (cfgPoolStatus == PoolShutdown)
11851242 let checks = [if (!(isGetDisabled))
11861243 then true
11871244 else throw("get operation is blocked by admin"), if ((size(i.payments) == 0))
11881245 then true
11891246 else throw("no payments are expected")]
11901247 if ((checks == checks))
11911248 then {
11921249 let unstakeInv = invoke(stakingContract, "unstake", [toBase58String(cfgLpAssetId), unstakeAmount], nil)
11931250 if ((unstakeInv == unstakeInv))
11941251 then {
11951252 let res = ego(toBase58String(i.transactionId), toBase58String(cfgLpAssetId), unstakeAmount, i.caller)
11961253 let outAmAmt = res._1
11971254 let outPrAmt = res._2
11981255 let state = res._10
11991256 let checkAmounts = [if ((outAmAmt >= noLessThenAmountAsset))
12001257 then true
12011258 else throw(makeString(["amount asset amount to receive is less than ", toString(noLessThenAmountAsset)], "")), if ((outPrAmt >= noLessThenPriceAsset))
12021259 then true
12031260 else throw(makeString(["price asset amount to receive is less than ", toString(noLessThenPriceAsset)], ""))]
12041261 if ((checkAmounts == checkAmounts))
12051262 then {
12061263 let burnLPAssetOnFactory = invoke(fca, "burn", [unstakeAmount], [AttachedPayment(cfgLpAssetId, unstakeAmount)])
12071264 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
1208- then state
1265+ then {
1266+ let $t04329943380 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1267+ let refreshDLpActions = $t04329943380._1
1268+ let updatedDLp = $t04329943380._2
1269+ (state ++ refreshDLpActions)
1270+ }
12091271 else throw("Strict value is not equal to itself.")
12101272 }
12111273 else throw("Strict value is not equal to itself.")
12121274 }
12131275 else throw("Strict value is not equal to itself.")
12141276 }
12151277 else throw("Strict value is not equal to itself.")
12161278 }
12171279
12181280
12191281
12201282 @Callable(i)
12211283 func unstakeAndGetOneTknV2 (unstakeAmount,outAssetId,minOutAmount) = {
12221284 let isPoolOneTokenOperationsDisabled = {
12231285 let @ = invoke(fca, "isPoolOneTokenOperationsDisabledREADONLY", [toString(this)], nil)
12241286 if ($isInstanceOf(@, "Boolean"))
12251287 then @
12261288 else throw(($getType(@) + " couldn't be cast to Boolean"))
12271289 }
12281290 let isGetDisabled = if (if (igs())
12291291 then true
12301292 else (cfgPoolStatus == PoolShutdown))
12311293 then true
12321294 else isPoolOneTokenOperationsDisabled
12331295 let checks = [if (if (!(isGetDisabled))
12341296 then true
12351297 else isManager(i))
12361298 then true
12371299 else throwErr("get operation is blocked by admin"), if ((size(i.payments) == 0))
12381300 then true
12391301 else throwErr("no payments are expected")]
12401302 if ((checks == checks))
12411303 then {
12421304 let cfg = gpc()
12431305 let factoryCfg = gfc()
12441306 let lpAssetId = fromBase58String(cfg[idxLPAsId])
12451307 let staking = valueOrErrorMessage(addressFromString(factoryCfg[idxFactStakCntr]), "Wr st addr")
12461308 let unstakeInv = invoke(staking, "unstake", [toBase58String(lpAssetId), unstakeAmount], nil)
12471309 if ((unstakeInv == unstakeInv))
12481310 then {
1249- let $t04255242740 = getOneTknV2Internal(outAssetId, minOutAmount, [AttachedPayment(lpAssetId, unstakeAmount)], i.caller, i.originCaller, i.transactionId)
1250- let state = $t04255242740._1
1251- let totalAmount = $t04255242740._2
1311+ let $t04424144429 = getOneTknV2Internal(outAssetId, minOutAmount, [AttachedPayment(lpAssetId, unstakeAmount)], i.caller, i.originCaller, i.transactionId)
1312+ let state = $t04424144429._1
1313+ let totalAmount = $t04424144429._2
12521314 $Tuple2(state, totalAmount)
12531315 }
12541316 else throw("Strict value is not equal to itself.")
12551317 }
12561318 else throw("Strict value is not equal to itself.")
12571319 }
12581320
12591321
12601322
12611323 @Callable(i)
12621324 func putOneTknV2WithBonusREADONLY (paymentAmountRaw,paymentAssetId) = {
12631325 let poolConfig = gpc()
12641326 let amId = poolConfig[idxAmAsId]
12651327 let prId = poolConfig[idxPrAsId]
12661328 let lpId = poolConfig[idxLPAsId]
1267- let $t04299943102 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "", true)
1268- let lpAmount = $t04299943102._1
1269- let state = $t04299943102._2
1270- let feeAmount = $t04299943102._3
1271- let bonus = $t04299943102._4
1329+ let $t04468844791 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "", true)
1330+ let lpAmount = $t04468844791._1
1331+ let state = $t04468844791._2
1332+ let feeAmount = $t04468844791._3
1333+ let bonus = $t04468844791._4
12721334 $Tuple2(nil, $Tuple3(lpAmount, feeAmount, bonus))
12731335 }
12741336
12751337
12761338
12771339 @Callable(i)
12781340 func putOneTknV2WithoutTakeFeeREADONLY (paymentAmountRaw,paymentAssetId) = {
12791341 let poolConfig = gpc()
12801342 let amId = poolConfig[idxAmAsId]
12811343 let prId = poolConfig[idxPrAsId]
12821344 let lpId = poolConfig[idxLPAsId]
1283- let $t04338143485 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "", false)
1284- let lpAmount = $t04338143485._1
1285- let state = $t04338143485._2
1286- let feeAmount = $t04338143485._3
1287- let bonus = $t04338143485._4
1345+ let $t04507045174 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "", false)
1346+ let lpAmount = $t04507045174._1
1347+ let state = $t04507045174._2
1348+ let feeAmount = $t04507045174._3
1349+ let bonus = $t04507045174._4
12881350 $Tuple2(nil, $Tuple3(lpAmount, feeAmount, bonus))
12891351 }
12901352
12911353
12921354
12931355 @Callable(i)
12941356 func activate (amtAsStr,prAsStr) = if ((toString(i.caller) != toString(fca)))
12951357 then throw("denied")
12961358 else $Tuple2([StringEntry(aa(), amtAsStr), StringEntry(pa(), prAsStr)], "success")
12971359
12981360
12991361
13001362 @Callable(i)
13011363 func setS (k,v) = if ((toString(i.caller) != strf(this, ada())))
13021364 then pd
13031365 else [StringEntry(k, v)]
13041366
13051367
13061368
13071369 @Callable(i)
13081370 func setI (k,v) = if ((toString(i.caller) != strf(this, ada())))
13091371 then pd
13101372 else [IntegerEntry(k, v)]
13111373
13121374
13131375
13141376 @Callable(i)
13151377 func getPoolConfigWrapperREADONLY () = $Tuple2(nil, gpc())
13161378
13171379
13181380
13191381 @Callable(i)
13201382 func getAccBalanceWrapperREADONLY (assetId) = $Tuple2(nil, getAccBalance(assetId))
13211383
13221384
13231385
13241386 @Callable(i)
13251387 func calcPricesWrapperREADONLY (amAmt,prAmt,lpAmt) = {
13261388 let pr = calcPrices(amAmt, prAmt, lpAmt)
13271389 $Tuple2(nil, [toString(pr[0]), toString(pr[1]), toString(pr[2])])
13281390 }
13291391
13301392
13311393
13321394 @Callable(i)
13331395 func fromX18WrapperREADONLY (val,resScaleMult) = $Tuple2(nil, f1(parseBigIntValue(val), resScaleMult))
13341396
13351397
13361398
13371399 @Callable(i)
13381400 func toX18WrapperREADONLY (origVal,origScaleMult) = $Tuple2(nil, toString(t1(origVal, origScaleMult)))
13391401
13401402
13411403
13421404 @Callable(i)
13431405 func calcPriceBigIntWrapperREADONLY (prAmtX18,amAmtX18) = $Tuple2(nil, toString(cpbi(parseBigIntValue(prAmtX18), parseBigIntValue(amAmtX18))))
13441406
13451407
13461408
13471409 @Callable(i)
13481410 func estimatePutOperationWrapperREADONLY (txId58,slippage,inAmAmt,inAmId,inPrAmt,inPrId,usrAddr,isEval,emitLp) = $Tuple2(nil, epo(txId58, slippage, inAmAmt, inAmId, inPrAmt, inPrId, usrAddr, isEval, emitLp, true, false, 0, ""))
13491411
13501412
13511413
13521414 @Callable(i)
13531415 func estimateGetOperationWrapperREADONLY (txId58,pmtAsId,pmtLpAmt,usrAddr) = {
13541416 let r = ego(txId58, pmtAsId, pmtLpAmt, addressFromStringValue(usrAddr))
13551417 $Tuple2(nil, $Tuple10(r._1, r._2, r._3, r._4, r._5, r._6, r._7, toString(r._8), r._9, r._10))
13561418 }
13571419
13581420
13591421
13601422 @Callable(i)
13611423 func getFeeREADONLY () = $Tuple2(nil, fee)
13621424
13631425
13641426 @Verifier(tx)
13651427 func verify () = {
13661428 let targetPublicKey = match m() {
13671429 case pk: ByteVector =>
13681430 pk
13691431 case _: Unit =>
13701432 tx.senderPublicKey
13711433 case _ =>
13721434 throw("Match error")
13731435 }
13741436 match tx {
13751437 case order: Order =>
13761438 let matcherPub = mp()
13771439 let orderValid = moa(order)
13781440 let senderValid = sigVerify(order.bodyBytes, order.proofs[0], order.senderPublicKey)
13791441 let matcherValid = sigVerify(order.bodyBytes, order.proofs[1], matcherPub)
13801442 if (if (if (orderValid)
13811443 then senderValid
13821444 else false)
13831445 then matcherValid
13841446 else false)
13851447 then true
13861448 else toe(orderValid, senderValid, matcherValid)
13871449 case s: SetScriptTransaction =>
13881450 let newHash = blake2b256(value(s.script))
13891451 let allowedHash = fromBase64String(value(getString(fca, keyAllowedLpStableScriptHash())))
13901452 let currentHash = scriptHash(this)
13911453 if (if ((allowedHash == newHash))
13921454 then (currentHash != newHash)
13931455 else false)
13941456 then true
13951457 else sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
13961458 case _ =>
13971459 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
13981460 }
13991461 }
14001462

github/deemru/w8io/873ac7e 
169.78 ms