tx · 2hqLBjMjQiUBMheEZRrqugtQLKxhucdDV9Tp6eQ4dhna

3N6PvAL6whpaLE48xjeZbmU7vRWQmuz8AA5:  -0.02100000 Waves

2024.11.27 20:33 [3390126] smart account 3N6PvAL6whpaLE48xjeZbmU7vRWQmuz8AA5 > SELF 0.00000000 Waves

{ "type": 13, "id": "2hqLBjMjQiUBMheEZRrqugtQLKxhucdDV9Tp6eQ4dhna", "fee": 2100000, "feeAssetId": null, "timestamp": 1732728832061, "version": 2, "chainId": 84, "sender": "3N6PvAL6whpaLE48xjeZbmU7vRWQmuz8AA5", "senderPublicKey": "3ZB9kd3fTB7j5xvuxZe67A7aT4cNTs2gUk1tyFaCdWJ6", "proofs": [ "4gadYedrPR5CUezLpySWKpQfKcC5pECq9TexQ87SNXrBFLjEQDWYQie25U27wQBp2TMHFtbE8fbMLqXLW5wZsUxz" ], "script": "base64:BgIcCAISAwoBCBIDCgEIEgMKAQgSAwoBCBIECgIICDIBFHRyeUdldFN0cmluZ0V4dGVybmFsAgdhZGRyZXNzA2tleQQHJG1hdGNoMAkAnQgCBQdhZGRyZXNzBQNrZXkDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwBQFhAgABEXRyeUdldEludEV4dGVybmFsAgdhZGRyZXNzA2tleQQHJG1hdGNoMAkAmggCBQdhZGRyZXNzBQNrZXkDCQABAgUHJG1hdGNoMAIDSW50BAFhBQckbWF0Y2gwBQFhCQACAQIbUlRHSUU6IFNvbWV0aGluZyB3ZW50IHdyb25nAQlhc0Jvb2xlYW4BBXZhbHVlBAckbWF0Y2gwBQV2YWx1ZQMJAAECBQckbWF0Y2gwAgdCb29sZWFuBAdib29sZWFuBQckbWF0Y2gwBQdib29sZWFuCQACAQIiRkFCOiB3cm9uZyB0eXBlLCBleHBlY3RlZDogQm9vbGVhbgEMdHJ5R2V0U3RyaW5nAQNrZXkJARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIFBHRoaXMFA2tleQAQZGVsYXlGb3JIYXRjaGluZwACARdzdGF0aWNLZXlfb3JhY2xlQWRkcmVzcwACFHN0YXRpY19vcmFjbGVBZGRyZXNzARRzdGF0aWNLZXlfZWdnQXNzZXRJZAACEXN0YXRpY19lZ2dBc3NldElkARpzdGF0aWNLZXlfaW5jdWJhdG9yQWRkcmVzcwACF3N0YXRpY19pbmN1YmF0b3JBZGRyZXNzARhzdGF0aWNLZXlfYnJlZWRlckFkZHJlc3MAAhVzdGF0aWNfYnJlZWRlckFkZHJlc3MBGHN0YXRpY0tleV9mYXJtaW5nQWRkcmVzcwACGHN0YXRpY19mYXJtaW5nQWRkcmVzc05ldwEZc3RhdGljS2V5X2JhYnlEdWNrQWRkcmVzcwACFnN0YXRpY19iYWJ5RHVja0FkZHJlc3MBGXN0YXRpY0tleV9nYW1lRGFwcEFkZHJlc3MAAhZzdGF0aWNfZ2FtZURhcHBBZGRyZXNzARZzdGF0aWNLZXlfaXRlbXNBZGRyZXNzAAITc3RhdGljX2l0ZW1zQWRkcmVzcwEYc3RhdGljS2V5X2NvdXBvbnNBZGRyZXNzAAIVc3RhdGljX2NvdXBvbnNBZGRyZXNzARVzdGF0aWNLZXlfaHVudEFkZHJlc3MAAhJzdGF0aWNfaHVudEFkZHJlc3MBFXN0YXRpY0tleV9idXJuQWRkcmVzcwACEnN0YXRpY19idXJuQWRkcmVzcwEcc3RhdGljS2V5X3JlZkNvbnRyYWN0QWRkcmVzcwACGXN0YXRpY19yZWZDb250cmFjdEFkZHJlc3MBEnN0YXRpY0tleV9leHRyYUZlZQACD3N0YXRpY19leHRyYUZlZQEXc3RhdGljS2V5X2ZlZUFnZ3JlZ2F0b3IAAhRzdGF0aWNfZmVlQWdncmVnYXRvcgEJZ2V0T3JhY2xlAAkBB0FkZHJlc3MBCQDZBAEJAQx0cnlHZXRTdHJpbmcBCQEXc3RhdGljS2V5X29yYWNsZUFkZHJlc3MAAQ1nZXRFZ2dBc3NldElkAAkA2QQBCQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCCQEJZ2V0T3JhY2xlAAkBFHN0YXRpY0tleV9lZ2dBc3NldElkAAETZ2V0SW5jdWJhdG9yQWRkcmVzcwAJAQdBZGRyZXNzAQkA2QQBCQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCCQEJZ2V0T3JhY2xlAAkBGnN0YXRpY0tleV9pbmN1YmF0b3JBZGRyZXNzAAERZ2V0QnJlZWRlckFkZHJlc3MACQEHQWRkcmVzcwEJANkEAQkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgkBCWdldE9yYWNsZQAJARhzdGF0aWNLZXlfYnJlZWRlckFkZHJlc3MAARFnZXRGYXJtaW5nQWRkcmVzcwAJAQdBZGRyZXNzAQkA2QQBCQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCCQEJZ2V0T3JhY2xlAAkBGHN0YXRpY0tleV9mYXJtaW5nQWRkcmVzcwABEmdldEJhYnlEdWNrQWRkcmVzcwAJAQdBZGRyZXNzAQkA2QQBCQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCCQEJZ2V0T3JhY2xlAAkBGXN0YXRpY0tleV9iYWJ5RHVja0FkZHJlc3MAARJnZXRHYW1lRGFwcEFkZHJlc3MACQEHQWRkcmVzcwEJANkEAQkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgkBCWdldE9yYWNsZQAJARlzdGF0aWNLZXlfZ2FtZURhcHBBZGRyZXNzAAEPZ2V0SXRlbXNBZGRyZXNzAAkBB0FkZHJlc3MBCQDZBAEJARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIJAQlnZXRPcmFjbGUACQEWc3RhdGljS2V5X2l0ZW1zQWRkcmVzcwABEWdldENvdXBvbnNBZGRyZXNzAAkBB0FkZHJlc3MBCQDZBAEJARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIJAQlnZXRPcmFjbGUACQEYc3RhdGljS2V5X2NvdXBvbnNBZGRyZXNzAAEOZ2V0SHVudEFkZHJlc3MACQEHQWRkcmVzcwEJANkEAQkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgkBCWdldE9yYWNsZQAJARVzdGF0aWNLZXlfaHVudEFkZHJlc3MAAQ5nZXRCdXJuQWRkcmVzcwAJAQdBZGRyZXNzAQkA2QQBCQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCCQEJZ2V0T3JhY2xlAAkBFXN0YXRpY0tleV9idXJuQWRkcmVzcwABFWdldFJlZkNvbnRyYWN0QWRkcmVzcwAJAQdBZGRyZXNzAQkA2QQBCQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCCQEJZ2V0T3JhY2xlAAkBHHN0YXRpY0tleV9yZWZDb250cmFjdEFkZHJlc3MAARBnZXRGZWVBZ2dyZWdhdG9yAAkBB0FkZHJlc3MBCQDZBAEJARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIJAQlnZXRPcmFjbGUACQEXc3RhdGljS2V5X2ZlZUFnZ3JlZ2F0b3IAAQljaGVja1JlYWwBB2Fzc2V0SWQDAwkAAAIICQEFdmFsdWUBCQDsBwEFB2Fzc2V0SWQGaXNzdWVyCQERZ2V0QnJlZWRlckFkZHJlc3MABgkAAAIICQEFdmFsdWUBCQDsBwEFB2Fzc2V0SWQGaXNzdWVyCQETZ2V0SW5jdWJhdG9yQWRkcmVzcwAICQEFdmFsdWUBCQDsBwEFB2Fzc2V0SWQGaXNzdWVyCQACAQINbm90IHZhbGlkIE5GVAEWY2hlY2tBZGRpdGlvbmFsUGF5bWVudAEHcGF5bWVudAMJAQlpc0RlZmluZWQBCAUHcGF5bWVudAdhc3NldElkCQACAQIZUkNBUDogUGxlYXNlIGF0dGFjaCB3YXZlcwQJZmVlQW1vdW50CQERQGV4dHJOYXRpdmUoMTA1MCkCCQEJZ2V0T3JhY2xlAAkBEnN0YXRpY0tleV9leHRyYUZlZQADCQECIT0CCAUHcGF5bWVudAZhbW91bnQFCWZlZUFtb3VudAkAAgEJAKwCAgkArAICAhxSQ0FQOiBQbGVhc2UgYXR0YWNoIGV4YWN0bHkgCQCkAwEFCWZlZUFtb3VudAITIGFtb3VudCBvZiB3YXZlbGV0cwkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEQZ2V0RmVlQWdncmVnYXRvcgAFCWZlZUFtb3VudAUEdW5pdAUDbmlsABJQSE9FTklYQkFTRU9QVElPTlMA6AcBDXRyeUdldEludGVnZXIBA2tleQQHJG1hdGNoMAkAmggCBQR0aGlzBQNrZXkDCQABAgUHJG1hdGNoMAIDSW50BAFiBQckbWF0Y2gwBQFiAAABCGFzU3RyaW5nAQV2YWx1ZQQHJG1hdGNoMAUFdmFsdWUDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFzBQckbWF0Y2gwBQFzAwkAAQIFByRtYXRjaDACA0ludAQBcwUHJG1hdGNoMAkAAgECJndyb25nIHR5cGUsIGV4cGVjdGVkOiBTdHJpbmcsIGdvdDogSW50AwkAAQIFByRtYXRjaDACBFVuaXQEAXMFByRtYXRjaDAJAAIBAid3cm9uZyB0eXBlLCBleHBlY3RlZDogU3RyaW5nLCBnb3Q6IFVuaXQJAAIBAhx3cm9uZyB0eXBlLCBleHBlY3RlZDogU3RyaW5nAAlmZWVBbW91bnQJAQ10cnlHZXRJbnRlZ2VyAQIMY3VycmVudFByaWNlARBnZXRBbW91bnRPckNsZWFyAQZhbW91bnQDCQEIY29udGFpbnMCBQZhbW91bnQCATACAAUGYW1vdW50AQ5nZXRBc3NldE9yaWdpbgEKZ2VuZXJhdGlvbgMJAAACBQpnZW5lcmF0aW9uAgFHCQETZ2V0SW5jdWJhdG9yQWRkcmVzcwAJARFnZXRCcmVlZGVyQWRkcmVzcwABDmdldEFzc2V0UmFyaXR5AghnZW5vdHlwZQpnZW5lcmF0aW9uBAhxdWFudGl0eQkBEUBleHRyTmF0aXZlKDEwNTApAgkBDmdldEFzc2V0T3JpZ2luAQUKZ2VuZXJhdGlvbgkArAICCQCsAgICBnN0YXRzXwUIZ2Vub3R5cGUCCV9xdWFudGl0eQQFcG93ZXIJAGwGCQBpAgCQTgUIcXVhbnRpdHkABAAFAAEAAgUFRkxPT1IDCQBmAgUFcG93ZXIAAAUFcG93ZXIAAgEUZ2V0QXNzZXRGYXJtaW5nUG93ZXIBB2Fzc2V0SWQDAwkAAAIICQEFdmFsdWUBCQDsBwEFB2Fzc2V0SWQGaXNzdWVyCQERZ2V0QnJlZWRlckFkZHJlc3MABgkAAAIICQEFdmFsdWUBCQDsBwEFB2Fzc2V0SWQGaXNzdWVyCQETZ2V0SW5jdWJhdG9yQWRkcmVzcwAECWFzc2V0TmFtZQgJAQV2YWx1ZQEJAOwHAQUHYXNzZXRJZARuYW1lBApnZW5lcmF0aW9uCQCvAgIJALICAgUJYXNzZXROYW1lAAIAAQQHZmFybUdlbgkBCGFzU3RyaW5nAQkA/AcECQERZ2V0QnJlZWRlckFkZHJlc3MAAg5nZXRHZW5Gcm9tTmFtZQkAzAgCBQlhc3NldE5hbWUFA25pbAUDbmlsAwkAAAIFB2Zhcm1HZW4FB2Zhcm1HZW4JAJQKAgUHZmFybUdlbgkBDmdldEFzc2V0UmFyaXR5AgUHZmFybUdlbgUKZ2VuZXJhdGlvbgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECDW5vdCB2YWxpZCBORlQBD2dldFJhbmRvbU51bWJlcgQHb3B0aW9ucwR0eElkFGhhdGNoaW5nRmluaXNoSGVpZ2h0Bm9mZnNldAQPcmFuZG9tU2VlZEJsb2NrCQEFdmFsdWUBCQDtBwEJAGUCBRRoYXRjaGluZ0ZpbmlzaEhlaWdodAABBApyYW5kb21IYXNoCQD3AwEJAMsBAgUEdHhJZAkBBXZhbHVlAQgFD3JhbmRvbVNlZWRCbG9jawN2cmYJAGoCCQCyCQIFCnJhbmRvbUhhc2gJAGgCBQZvZmZzZXQACAUHb3B0aW9ucwEMZ2V0UmFuZG9tV2luBAJ0eAxmaW5pc2hIZWlnaHQLYXNzZXRSYXJpdHkNYmxhY2tsaXN0Q29kZQQOcGhvZW5peE9wdGlvbnMJAGUCBRJQSE9FTklYQkFTRU9QVElPTlMJAGsDCQBpAgUSUEhPRU5JWEJBU0VPUFRJT05TAAIFC2Fzc2V0UmFyaXR5AGQEDWphY2twb3RSYW5kb20JAQ9nZXRSYW5kb21OdW1iZXIEBQ5waG9lbml4T3B0aW9ucwUCdHgFDGZpbmlzaEhlaWdodAABAwkAAAIFDWphY2twb3RSYW5kb20AAQIHcGhvZW5peAQBbgkBD2dldFJhbmRvbU51bWJlcgQA6AcFAnR4BQxmaW5pc2hIZWlnaHQAAAMDCQBmAgAKBQFuCQECIT0CBQ1ibGFja2xpc3RDb2RlAhFpdGVtIUFSVC1GUkVFR0VORQcCEWl0ZW0hQVJULUZSRUVHRU5FAwMJAGYCAH4FAW4JAQIhPQIFDWJsYWNrbGlzdENvZGUCAmFyBwICYXIDAwkAZgIAugEFAW4JAQIhPQIFDWJsYWNrbGlzdENvZGUCFGl0ZW0hQVJULUZJUkVfQVJNT1VSBwIUaXRlbSFBUlQtRklSRV9BUk1PVVIDAwkAZgIAzgEFAW4JAQIhPQIFDWJsYWNrbGlzdENvZGUCDml0ZW0hQVJULUZFRUQ1BwIOaXRlbSFBUlQtRkVFRDUDAwkAZgIA4gEFAW4JAQIhPQIFDWJsYWNrbGlzdENvZGUCD2l0ZW0hQVJULUZFRUQxMAcCD2l0ZW0hQVJULUZFRUQxMAMDCQBmAgD2AQUBbgkBAiE9AgUNYmxhY2tsaXN0Q29kZQIPaXRlbSFBUlQtRkVFRDE1BwIPaXRlbSFBUlQtRkVFRDE1AwMJAGYCAIoCBQFuCQECIT0CBQ1ibGFja2xpc3RDb2RlAg9pdGVtIUFSVC1GRUVEMjAHAg9pdGVtIUFSVC1GRUVEMjADAwkAZgIAngIFAW4JAQIhPQIFDWJsYWNrbGlzdENvZGUCD2l0ZW0hQVJULUZFRUQyNQcCD2l0ZW0hQVJULUZFRUQyNQMDCQBmAgCoAgUBbgkBAiE9AgUNYmxhY2tsaXN0Q29kZQIPaXRlbSFBUlQtRkVFRDUwBwIPaXRlbSFBUlQtRkVFRDUwAwMJAGYCAKwCBQFuCQECIT0CBQ1ibGFja2xpc3RDb2RlAhBpdGVtIUFSVC1GRUVEMTAwBwIQaXRlbSFBUlQtRkVFRDEwMAMDCQBmAgC2AgUBbgkBAiE9AgUNYmxhY2tsaXN0Q29kZQIOaXRlbSFBUlQtQ1JPV04HAg5pdGVtIUFSVC1DUk9XTgMDCQBmAgDeAgUBbgkBAiE9AgUNYmxhY2tsaXN0Q29kZQIJaW5jdWJhdG9yBwIJaW5jdWJhdG9yAwMJAGYCAMwDBQFuCQECIT0CBQ1ibGFja2xpc3RDb2RlAhJpdGVtIUFSVC1CVUlMVEJPRFkHAwkAZgIAMgULYXNzZXRSYXJpdHkCEml0ZW0hQVJULUJVSUxUQk9EWQITaXRlbSFBUlQtTVVUQVJJVU0tRAMDCQBmAgDgAwUBbgkBAiE9AgUNYmxhY2tsaXN0Q29kZQIOaXRlbSFBUlQtU05BS0UHAg5pdGVtIUFSVC1TTkFLRQMDCQBmAgD+AwUBbgkBAiE9AgUNYmxhY2tsaXN0Q29kZQIRaXRlbSFBUlQtUk9CT0RVQ0sHAhFpdGVtIUFSVC1ST0JPRFVDSwMDCQBmAgDYBAUBbgkBAiE9AgUNYmxhY2tsaXN0Q29kZQIPaXRlbSFBUlQtS0FUQU5BBwIPaXRlbSFBUlQtS0FUQU5BAwMJAGYCAIoFBQFuCQECIT0CBQ1ibGFja2xpc3RDb2RlAhBpdGVtIUFSVC1TQ0VQVEVSBwMJAGYCADIFC2Fzc2V0UmFyaXR5AhBpdGVtIUFSVC1TQ0VQVEVSAhNpdGVtIUFSVC1NVVRBUklVTS1EAwMJAGYCAMYFBQFuCQECIT0CBQ1ibGFja2xpc3RDb2RlAhNpdGVtIUFSVC1NVVRBUklVTS1EBwITaXRlbSFBUlQtTVVUQVJJVU0tRAMDCQBmAgDQBQUBbgkBAiE9AgUNYmxhY2tsaXN0Q29kZQITaXRlbSFBUlQtTVVUQVJJVU0tRwcCE2l0ZW0hQVJULU1VVEFSSVVNLUcDAwkAZgIA+gYFAW4JAQIhPQIFDWJsYWNrbGlzdENvZGUCC2R1Y2tsaW5nXzEwBwILZHVja2xpbmdfMTADAwkAZgIAwAcFAW4JAQIhPQIFDWJsYWNrbGlzdENvZGUCC2R1Y2tsaW5nXzIwBwILZHVja2xpbmdfMjACC2R1Y2tsaW5nXzQwAQ9nZXRSYW5kb21SZXR1cm4CAnR4DGZpbmlzaEhlaWdodAQBbgkBD2dldFJhbmRvbU51bWJlcgQAAgUCdHgFDGZpbmlzaEhlaWdodAABAwkAAAIFAW4AAAYHAQlnZXRPcmlnaW4BB2Fzc2V0SWQECWFzc2V0TmFtZQgJAQV2YWx1ZQEJAOwHAQUHYXNzZXRJZARuYW1lBApnZW5lcmF0aW9uCQCvAgIJALICAgUJYXNzZXROYW1lAAIAAQMDCQAAAgUKZ2VuZXJhdGlvbgIBRwYJAAACBQpnZW5lcmF0aW9uAgFKCQETZ2V0SW5jdWJhdG9yQWRkcmVzcwAJARFnZXRCcmVlZGVyQWRkcmVzcwABBWFzSW50AQV2YWx1ZQQHJG1hdGNoMAUFdmFsdWUDCQABAgUHJG1hdGNoMAIDSW50BANpbnQFByRtYXRjaDAFA2ludAMJAAECBQckbWF0Y2gwAgZTdHJpbmcEBnN0cmluZwUHJG1hdGNoMAkAAgEJAKwCAgIpUkFJOiB3cm9uZyB0eXBlLCBleHBlY3RlZDogSW50LCBidXQgZ290OiAFBnN0cmluZwkAAgECHlJBSTogd3JvbmcgdHlwZSwgZXhwZWN0ZWQ6IEludAEHZ2V0Qm9vbAEDa2V5BAckbWF0Y2gwCQCbCAIFBHRoaXMFA2tleQMJAAECBQckbWF0Y2gwAgdCb29sZWFuBAFiBQckbWF0Y2gwBQFiBwEJaXNUZXN0RW52AAkBB2dldEJvb2wBAgdURVNURU5WARVmaW5pc2hSZWJpcnRoSW50ZXJuYWwGBmluaXRUeAdhZGRyZXNzEWFkZGl0aW9uYWxQYXltZW50BmRvdWJsZQ1ibGFja2xpc3RDb2RlBnJlc2N1ZQQLZmluaXNoQmxvY2sJAQ10cnlHZXRJbnRlZ2VyAQkArAICCQCsAgIJAKwCAgkArAICAghhZGRyZXNzXwUHYWRkcmVzcwIIX2luaXRUeF8FBmluaXRUeAIMX2ZpbmlzaEJsb2NrBAthc3NldFJhcml0eQkBDXRyeUdldEludGVnZXIBCQCsAgIJAKwCAgkArAICCQCsAgICCGFkZHJlc3NfBQdhZGRyZXNzAghfaW5pdFR4XwUGaW5pdFR4AgxfYXNzZXRSYXJpdHkEBnN0YXR1cwkBDHRyeUdldFN0cmluZwEJAKwCAgkArAICCQCsAgIJAKwCAgIIYWRkcmVzc18FB2FkZHJlc3MCCF9pbml0VHhfBQZpbml0VHgCB19zdGF0dXMEDHZhbGlkUGF5bWVudAkBFmNoZWNrQWRkaXRpb25hbFBheW1lbnQBBRFhZGRpdGlvbmFsUGF5bWVudAMJAAACBQx2YWxpZFBheW1lbnQFDHZhbGlkUGF5bWVudAQMcmVjb3JkQWN0aW9uCQD8BwQJARFnZXRDb3Vwb25zQWRkcmVzcwACDHJlY29yZEFjdGlvbgkAzAgCAgdSRUJJUlRIBQNuaWwFA25pbAMJAAACBQxyZWNvcmRBY3Rpb24FDHJlY29yZEFjdGlvbgoBFGdldEFjY2Vzc0l0ZW1Bc3NldElkAQdhZGRyZXNzCQDZBAEJARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIFB2FkZHJlc3MCGHN0YXRpY19hY2Nlc3NJdGVtQXNzZXRJZAoBEmdldEFjY2Vzc0l0ZW1QcmljZQEHYWRkcmVzcwkBEXRyeUdldEludEV4dGVybmFsAgUHYWRkcmVzcwIWc3RhdGljX2FjY2Vzc0l0ZW1QcmljZQMJAQIhPQIFBnN0YXR1cwIEb3BlbgkAAgECH3JlYmlydGggaXMgZmluaXNoZWQgb3Igbm90IG9wZW4DCQBmAgULZmluaXNoQmxvY2sFBmhlaWdodAkAAgECHnlvdSBjYW5ub3QgZmluaXNoIHJlYmlydGgsIHlldAQDd2luCQEMZ2V0UmFuZG9tV2luBAkA2QQBBQZpbml0VHgFC2ZpbmlzaEJsb2NrBQthc3NldFJhcml0eQUNYmxhY2tsaXN0Q29kZQQEdHhJZAUGaW5pdFR4BAZyZXN1bHQDCQECIT0CCQCzCQIFA3dpbgIFcGVyY2gFBHVuaXQEBWNvbG9yCQCyAgIFA3dpbgABBAZyZXN1bHQDCQEBIQEFBmRvdWJsZQQFZmlyc3QJAPwHBAkBEWdldEZhcm1pbmdBZGRyZXNzAAIMYWRkRnJlZVBlcmNoCQDMCAIFB2FkZHJlc3MJAMwIAgUFY29sb3IJAMwIAgABBQNuaWwFA25pbAMJAAACBQVmaXJzdAUFZmlyc3QJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAKwCAgkArAICAghhZGRyZXNzXwUHYWRkcmVzcwIIX2luaXRUeF8FBmluaXRUeAIHX3Jlc3VsdAkBCGFzU3RyaW5nAQUFZmlyc3QFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgQFZmlyc3QJAPwHBAkBEWdldEZhcm1pbmdBZGRyZXNzAAIMYWRkRnJlZVBlcmNoCQDMCAIFB2FkZHJlc3MJAMwIAgUFY29sb3IJAMwIAgACBQNuaWwFA25pbAMJAAACBQVmaXJzdAUFZmlyc3QJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAKwCAgkArAICAghhZGRyZXNzXwUHYWRkcmVzcwIIX2luaXRUeF8FBmluaXRUeAIHX3Jlc3VsdAkBCGFzU3RyaW5nAQUFZmlyc3QJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAKwCAgkArAICAghhZGRyZXNzXwUHYWRkcmVzcwIIX2luaXRUeF8FBmluaXRUeAIIX3Jlc3VsdDEJAQhhc1N0cmluZwEFBWZpcnN0CQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgIIYWRkcmVzc18FB2FkZHJlc3MCCF9pbml0VHhfBQZpbml0VHgCBV93aW4xBQN3aW4FA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgMJAAACBQZyZXN1bHQFBnJlc3VsdAUGcmVzdWx0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAwkAAAIFA3dpbgIJaW5jdWJhdG9yBAZyZXN1bHQDCQEBIQEFBmRvdWJsZQQFZmlyc3QJAPwHBAkBE2dldEluY3ViYXRvckFkZHJlc3MAAg1pc3N1ZUZyZWVEdWNrCQDMCAIFB2FkZHJlc3MJAMwIAgUEdHhJZAUDbmlsBQNuaWwDCQAAAgUFZmlyc3QFBWZpcnN0CQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgIIYWRkcmVzc18FB2FkZHJlc3MCCF9pbml0VHhfBQZpbml0VHgCB19yZXN1bHQJAQhhc1N0cmluZwEFBWZpcnN0BQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4EBWZpcnN0CQD8BwQJARNnZXRJbmN1YmF0b3JBZGRyZXNzAAINaXNzdWVGcmVlRHVjawkAzAgCBQdhZGRyZXNzCQDMCAIFBHR4SWQFA25pbAUDbmlsAwkAAAIFBWZpcnN0BQVmaXJzdAQGc2Vjb25kCQD8BwQJARJnZXRCYWJ5RHVja0FkZHJlc3MAAhFpc3N1ZUZyZWVEdWNrbGluZwkAzAgCBQdhZGRyZXNzCQDMCAIFBHR4SWQJAMwIAgBkBQNuaWwFA25pbAMJAAACBQZzZWNvbmQFBnNlY29uZAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgICCGFkZHJlc3NfBQdhZGRyZXNzAghfaW5pdFR4XwUGaW5pdFR4AgdfcmVzdWx0CQEIYXNTdHJpbmcBBQVmaXJzdAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgICCGFkZHJlc3NfBQdhZGRyZXNzAghfaW5pdFR4XwUGaW5pdFR4AghfcmVzdWx0MQkBCGFzU3RyaW5nAQUGc2Vjb25kCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgIIYWRkcmVzc18FB2FkZHJlc3MCCF9pbml0VHhfBQZpbml0VHgCBV93aW4xAgxkdWNrbGluZ18xMDAFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgMJAAACBQZyZXN1bHQFBnJlc3VsdAUGcmVzdWx0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAwkAAAIFA3dpbgICYXIEB2Fzc2V0SWQJARRnZXRBY2Nlc3NJdGVtQXNzZXRJZAEJAQ5nZXRIdW50QWRkcmVzcwAEBXByaWNlCQESZ2V0QWNjZXNzSXRlbVByaWNlAQkBDmdldEh1bnRBZGRyZXNzAAQEY2FsbAkA/AcECQEOZ2V0SHVudEFkZHJlc3MAAhJidXlBY2Nlc3NJdGVtT3RoZXIJAMwIAgUHYWRkcmVzcwUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQdhc3NldElkBQVwcmljZQUDbmlsAwkAAAIFBGNhbGwFBGNhbGwJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAKwCAgkArAICAghhZGRyZXNzXwUHYWRkcmVzcwIIX2luaXRUeF8FBmluaXRUeAIHX3Jlc3VsdAkBCGFzU3RyaW5nAQUEY2FsbAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAwkAAAIFA3dpbgIHcGhvZW5peAQEY2FsbAkA/AcECQETZ2V0SW5jdWJhdG9yQWRkcmVzcwACDGlzc3VlSmFja3BvdAkAzAgCBQdhZGRyZXNzCQDMCAIFBHR4SWQJAMwIAgIIV1dXV1dXV1AFA25pbAUDbmlsAwkAAAIFBGNhbGwFBGNhbGwJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAKwCAgkArAICAghhZGRyZXNzXwUHYWRkcmVzcwIIX2luaXRUeF8FBmluaXRUeAIHX3Jlc3VsdAkBCGFzU3RyaW5nAQUEY2FsbAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAwkBAiE9AgkAswkCBQN3aW4CCGR1Y2tsaW5nBQR1bml0BAVsZXZlbAkBDXBhcnNlSW50VmFsdWUBCQCRAwIJALUJAgUDd2luAgFfAAEECmxldmVsRmluYWwDBQZkb3VibGUJAGgCAAIFBWxldmVsBQVsZXZlbAQEY2FsbAkA/AcECQESZ2V0QmFieUR1Y2tBZGRyZXNzAAIRaXNzdWVGcmVlRHVja2xpbmcJAMwIAgUHYWRkcmVzcwkAzAgCBQR0eElkCQDMCAIFCmxldmVsRmluYWwFA25pbAUDbmlsAwkAAAIFBGNhbGwFBGNhbGwJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAKwCAgkArAICAghhZGRyZXNzXwUHYWRkcmVzcwIIX2luaXRUeF8FBmluaXRUeAIHX3Jlc3VsdAkBCGFzU3RyaW5nAQUEY2FsbAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAwkBAiE9AgkAswkCBQN3aW4CBGl0ZW0FBHVuaXQECGl0ZW1OYW1lCQCRAwIJALUJAgUDd2luAgEhAAEEBnJlc3VsdAMJAQEhAQUGZG91YmxlBAVmaXJzdAkA/AcECQEPZ2V0SXRlbXNBZGRyZXNzAAISaXNzdWVBcnRlZmFjdEluZGV4CQDMCAIFCGl0ZW1OYW1lCQDMCAIFB2FkZHJlc3MJAMwIAgAABQNuaWwFA25pbAMJAAACBQVmaXJzdAUFZmlyc3QJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAKwCAgkArAICAghhZGRyZXNzXwUHYWRkcmVzcwIIX2luaXRUeF8FBmluaXRUeAIHX3Jlc3VsdAkBCGFzU3RyaW5nAQUFZmlyc3QFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgQFZmlyc3QJAPwHBAkBD2dldEl0ZW1zQWRkcmVzcwACEmlzc3VlQXJ0ZWZhY3RJbmRleAkAzAgCBQhpdGVtTmFtZQkAzAgCBQdhZGRyZXNzCQDMCAIAAAUDbmlsBQNuaWwDCQAAAgUFZmlyc3QFBWZpcnN0BAZzZWNvbmQJAPwHBAkBD2dldEl0ZW1zQWRkcmVzcwACEmlzc3VlQXJ0ZWZhY3RJbmRleAkAzAgCBQhpdGVtTmFtZQkAzAgCBQdhZGRyZXNzCQDMCAIAAQUDbmlsBQNuaWwDCQAAAgUGc2Vjb25kBQZzZWNvbmQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAKwCAgkArAICAghhZGRyZXNzXwUHYWRkcmVzcwIIX2luaXRUeF8FBmluaXRUeAIHX3Jlc3VsdAkBCGFzU3RyaW5nAQUFZmlyc3QJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAKwCAgkArAICAghhZGRyZXNzXwUHYWRkcmVzcwIIX2luaXRUeF8FBmluaXRUeAIHX3Jlc3VsdAkBCGFzU3RyaW5nAQUGc2Vjb25kCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgIIYWRkcmVzc18FB2FkZHJlc3MCCF9pbml0VHhfBQZpbml0VHgCBV93aW4xBQN3aW4FA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgMJAAACBQZyZXN1bHQFBnJlc3VsdAUGcmVzdWx0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIzUkZCOiBTb21lIGVycm9yIG9jY3VyZWQsIHBsZWFzZSBjb250YWN0IHRoZSBhZG1pbnMhBA5yZXR1cm5Ub1NlbmRlcgMFBnJlc2N1ZQkBD2dldFJhbmRvbVJldHVybgIJANkEAQUGaW5pdFR4BQtmaW5pc2hCbG9jawcEDXJldHVyblBheWxvYWQDBQ5yZXR1cm5Ub1NlbmRlcgQHYXNzZXRJZAkA2QQBCQERQGV4dHJOYXRpdmUoMTA1OCkBCQCsAgIJAKwCAgkArAICCQCsAgICCGFkZHJlc3NfBQdhZGRyZXNzAghfaW5pdFR4XwUGaW5pdFR4AghfYXNzZXRJZAQGaXNzdWVyCQEJY2hlY2tSZWFsAQUHYXNzZXRJZAQDZ2VuCQEIYXNTdHJpbmcBCQD8BwQJARFnZXRCcmVlZGVyQWRkcmVzcwACDmdldEdlbkZyb21OYW1lCQDMCAIICQEFdmFsdWUBCQDsBwEFB2Fzc2V0SWQEbmFtZQUDbmlsBQNuaWwDCQAAAgUDZ2VuBQNnZW4EBGNhbGwJAPwHBAUGaXNzdWVyAg5pbmNyZWFzZVJhcml0eQkAzAgCCQDYBAEFB2Fzc2V0SWQJAMwIAgUDZ2VuBQNuaWwFA25pbAMJAAACBQRjYWxsBQRjYWxsCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEFB2FkZHJlc3MAAQUHYXNzZXRJZAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBQNuaWwJAM4IAgkAzggCBQZyZXN1bHQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAKwCAgkArAICAghhZGRyZXNzXwUHYWRkcmVzcwIIX2luaXRUeF8FBmluaXRUeAIEX3dpbgUDd2luCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgIIYWRkcmVzc18FB2FkZHJlc3MCCF9pbml0VHhfBQZpbml0VHgCB19zdGF0dXMCBmZpbmlzaAUDbmlsBQx2YWxpZFBheW1lbnQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4FAWkBD2NvbmZpZ3VyZU9yYWNsZQEGb3JhY2xlAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIPUkNVOiBhZG1pbiBvbmx5CQDMCAIJAQtTdHJpbmdFbnRyeQICFHN0YXRpY19vcmFjbGVBZGRyZXNzBQZvcmFjbGUFA25pbAFpAQtpbml0UmViaXJ0aAEOcmVmZXJlckFkZHJlc3MEA3BtdAkAkQMCCAUBaQhwYXltZW50cwAABAdhc3NldElkCQEFdmFsdWUBCAUDcG10B2Fzc2V0SWQEBmluaXRUeAkA2AQBCAUBaQ10cmFuc2FjdGlvbklkBAdhZGRyZXNzCQClCAEIBQFpBmNhbGxlcgMJAQIhPQIIBQNwbXQGYW1vdW50AAEJAAIBAhNORlQgaXMgbm90IGF0dGFjaGVkBBNhbW91bnRQYWlkQnlDb3Vwb25zCQEFYXNJbnQBCQD8BwQJARFnZXRDb3Vwb25zQWRkcmVzcwACCnVzZUNvdXBvbnMJAMwIAgUJZmVlQW1vdW50BQNuaWwFA25pbAMJAAACBRNhbW91bnRQYWlkQnlDb3Vwb25zBRNhbW91bnRQYWlkQnlDb3Vwb25zBAlsZWZ0VG9QYXkJAGUCBQlmZWVBbW91bnQFE2Ftb3VudFBhaWRCeUNvdXBvbnMEDHZhbGlkUGF5bWVudAkBFmNoZWNrQWRkaXRpb25hbFBheW1lbnQBCQCRAwIIBQFpCHBheW1lbnRzAAEDCQAAAgUMdmFsaWRQYXltZW50BQx2YWxpZFBheW1lbnQEB3BheW1lbnQDCQECIT0CBQlsZWZ0VG9QYXkAAAQKZmVlUGF5bWVudAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwACAwkBAiE9AggFCmZlZVBheW1lbnQHYXNzZXRJZAkBDWdldEVnZ0Fzc2V0SWQACQACAQIkWW91IG5lZWQgdG8gYXR0YWNoIEVHRyB0b2tlbnMgYXMgZmVlAwkAZgIFCWxlZnRUb1BheQgFCmZlZVBheW1lbnQGYW1vdW50CQACAQkArAICAkBZb3UgbmVlZCB0byBhdHRhY2ggdGhlIGZvbGxvd2luZyBhbW91bnQgb2YgRUdHIHRva2VucyBhcyBmZWU6IDAuCQCkAwEFCWxlZnRUb1BheQQVcmVmZXJlclJld2FyZEZvclBlcmNoCQBrAwUJbGVmdFRvUGF5AAUAZAQHcmVmQ2FsbAkBCWFzQm9vbGVhbgEJAPwHBAkBFWdldFJlZkNvbnRyYWN0QWRkcmVzcwACCnJlZlBheW1lbnQJAMwIAgUOcmVmZXJlckFkZHJlc3MFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBDWdldEVnZ0Fzc2V0SWQABRVyZWZlcmVyUmV3YXJkRm9yUGVyY2gFA25pbAMJAAACBQdyZWZDYWxsBQdyZWZDYWxsBAZ0b0J1cm4DBQdyZWZDYWxsCQBlAgUJbGVmdFRvUGF5BRVyZWZlcmVyUmV3YXJkRm9yUGVyY2gFCWxlZnRUb1BheQQIYnVybkNhbGwJAPwHBAkBDmdldEJ1cm5BZGRyZXNzAAIUYnVybkF0dGFjaGVkUGF5bWVudHMFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBDWdldEVnZ0Fzc2V0SWQABQZ0b0J1cm4FA25pbAMJAAACBQhidXJuQ2FsbAUIYnVybkNhbGwFCWxlZnRUb1BheQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgAAAwkAAAIFB3BheW1lbnQFB3BheW1lbnQEDSR0MDE1NzUzMTU4MDIJARRnZXRBc3NldEZhcm1pbmdQb3dlcgEFB2Fzc2V0SWQEA2dlbggFDSR0MDE1NzUzMTU4MDICXzEEBnJhcml0eQgFDSR0MDE1NzUzMTU4MDICXzIEBGNhbGwJAPwHBAkBCWdldE9yaWdpbgEFB2Fzc2V0SWQCDHJlZHVjZVJhcml0eQkAzAgCCQDYBAEFB2Fzc2V0SWQJAMwIAgUDZ2VuBQNuaWwFA25pbAMJAAACBQRjYWxsBQRjYWxsCQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgIIYWRkcmVzc18FB2FkZHJlc3MCCF9pbml0VHhfBQZpbml0VHgCDF9maW5pc2hCbG9jawkAZAIFBmhlaWdodAUQZGVsYXlGb3JIYXRjaGluZwkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgICCGFkZHJlc3NfBQdhZGRyZXNzAghfaW5pdFR4XwUGaW5pdFR4Agdfc3RhdHVzAgRvcGVuCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgICCGFkZHJlc3NfBQdhZGRyZXNzAghfaW5pdFR4XwUGaW5pdFR4AgxfYXNzZXRSYXJpdHkFBnJhcml0eQkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgICCGFkZHJlc3NfBQdhZGRyZXNzAghfaW5pdFR4XwUGaW5pdFR4AghfYXNzZXRJZAkA2AQBBQdhc3NldElkBQNuaWwFDHZhbGlkUGF5bWVudAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQ1maW5pc2hSZWJpcnRoAQZpbml0VHgJARVmaW5pc2hSZWJpcnRoSW50ZXJuYWwGBQZpbml0VHgJAKUIAQgFAWkGY2FsbGVyCQCRAwIIBQFpCHBheW1lbnRzAAAHAgAHAWkBE2ZpbmlzaFJlYmlydGhEb3VibGUBBmluaXRUeAMJAQEhAQMJAAACCQCQAwEIBQFpCHBheW1lbnRzAAIJAAACCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAABBwkAAgECD0ludmFsaWQgcGF5bWVudAQHYXNzZXRJZAkBBXZhbHVlAQgJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBAtib29zdGVyVHlwZQkBCGFzU3RyaW5nAQkA/AcECQEPZ2V0SXRlbXNBZGRyZXNzAAIUY2hlY2tBcnRlZmFjdERldGFpbHMJAMwIAgkA2AQBBQdhc3NldElkBQNuaWwFA25pbAMJAAACBQtib29zdGVyVHlwZQULYm9vc3RlclR5cGUDCQAAAgULYm9vc3RlclR5cGUCDkFSVC1HSUZUX0RPVUJMCQDOCAIJAMwIAgkBBEJ1cm4CBQdhc3NldElkAAEFA25pbAkBFWZpbmlzaFJlYmlydGhJbnRlcm5hbAYFBmluaXRUeAkApQgBCAUBaQZjYWxsZXIJAJEDAggFAWkIcGF5bWVudHMAAQYCAAcJAAIBAi1FcnJvciEgV3JvbmcgaXRlbSBhdHRhY2hlZCB0byBkb3VibGUgcmV3YXJkcyEJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQERZmluaXNoUmViaXJ0aEl0ZW0CBmluaXRUeAhpdGVtQ29kZQMDCQAAAgkAkAMBCAUBaQhwYXltZW50cwACCQAAAggJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQAAQcEB2Fzc2V0SWQJAQV2YWx1ZQEICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAQLYm9vc3RlclR5cGUJAQhhc1N0cmluZwEJAPwHBAkBD2dldEl0ZW1zQWRkcmVzcwACFGNoZWNrQXJ0ZWZhY3REZXRhaWxzCQDMCAIJANgEAQUHYXNzZXRJZAUDbmlsBQNuaWwDCQAAAgULYm9vc3RlclR5cGUFC2Jvb3N0ZXJUeXBlAwkAAAIFC2Jvb3N0ZXJUeXBlAgtBUlQtSFdFUkFTRQkAzggCCQDMCAIJAQRCdXJuAgUHYXNzZXRJZAABBQNuaWwJARVmaW5pc2hSZWJpcnRoSW50ZXJuYWwGBQZpbml0VHgJAKUIAQgFAWkGY2FsbGVyCQCRAwIIBQFpCHBheW1lbnRzAAEHBQhpdGVtQ29kZQcDCQAAAgULYm9vc3RlclR5cGUCDEFSVC1IV1JFU0NVRQkAzggCCQDMCAIJAQRCdXJuAgUHYXNzZXRJZAABBQNuaWwJARVmaW5pc2hSZWJpcnRoSW50ZXJuYWwGBQZpbml0VHgJAKUIAQgFAWkGY2FsbGVyCQCRAwIIBQFpCHBheW1lbnRzAAEHAgAGAwkAAAIFC2Jvb3N0ZXJUeXBlAg5BUlQtR0lGVF9ET1VCTAkAzggCCQDMCAIJAQRCdXJuAgUHYXNzZXRJZAABBQNuaWwJARVmaW5pc2hSZWJpcnRoSW50ZXJuYWwGBQZpbml0VHgJAKUIAQgFAWkGY2FsbGVyCQCRAwIIBQFpCHBheW1lbnRzAAEGAgAHCQACAQIbRXJyb3IhIFdyb25nIGl0ZW0gYXR0YWNoZWQgCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAwkAAAIJAJADAQgFAWkIcGF5bWVudHMAAQkBFWZpbmlzaFJlYmlydGhJbnRlcm5hbAYFBmluaXRUeAkApQgBCAUBaQZjYWxsZXIJAJEDAggFAWkIcGF5bWVudHMAAAcCAAcJAAIBAhBJbnZhbGlkIHBheW1lbnRzAQJ0eAEGdmVyaWZ5AAMJAQlpc1Rlc3RFbnYACQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACAUCdHgPc2VuZGVyUHVibGljS2V5BAlmaXJzdFVzZXIBIFEc5P1m/xJp0vFaFJ87suL0O3/By2gnojRebDjXV91tBApzZWNvbmRVc2VyASBccg5LrvEhT2bmGUX6aqKx7bE2KVlfGczMsOFNQYhqfQQJdGhpcmRVc2VyASCgr5HlLXlDYWEyEq2OufoYWVGdLVNJNsPQo/eoYBk7TgQPZmlyc3RVc2VyU2lnbmVkAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAUJZmlyc3RVc2VyAAEDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwABBQlmaXJzdFVzZXIAAQMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAIFCWZpcnN0VXNlcgABAAAEEHNlY29uZFVzZXJTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABQpzZWNvbmRVc2VyAAEDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwABBQpzZWNvbmRVc2VyAAEDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwACBQpzZWNvbmRVc2VyAAEAAAQPdGhpcmRVc2VyU2lnbmVkAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAUJdGhpcmRVc2VyAAEDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwABBQl0aGlyZFVzZXIAAQMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAIFCXRoaXJkVXNlcgABAAAED3NpZ25hdHVyZXNDb3VudAkAZAIJAGQCBQ9maXJzdFVzZXJTaWduZWQFEHNlY29uZFVzZXJTaWduZWQFD3RoaXJkVXNlclNpZ25lZAQHJG1hdGNoMAUCdHgJAGcCBQ9zaWduYXR1cmVzQ291bnQAAam7lJY=", "height": 3390126, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 56XrT1RJsvEiWBSyi8XFbe73xbnuVTuEp1weMNWgpuSj Next: none Diff:
OldNewDifferences
111111 func getFeeAggregator () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_feeAggregator())))
112112
113113
114+func checkReal (assetId) = if (if ((value(assetInfo(assetId)).issuer == getBreederAddress()))
115+ then true
116+ else (value(assetInfo(assetId)).issuer == getIncubatorAddress()))
117+ then value(assetInfo(assetId)).issuer
118+ else throw("not valid NFT")
119+
120+
114121 func checkAdditionalPayment (payment) = if (isDefined(payment.assetId))
115122 then throw("RCAP: Please attach waves")
116123 else {
185192 }
186193
187194
188-func getRandomWin (tx,finishHeight,assetRarity) = {
189- let jackpotRandom = getRandomNumber(200, tx, finishHeight, 1)
195+func getRandomWin (tx,finishHeight,assetRarity,blacklistCode) = {
196+ let phoenixOptions = (PHOENIXBASEOPTIONS - fraction((PHOENIXBASEOPTIONS / 2), assetRarity, 100))
197+ let jackpotRandom = getRandomNumber(phoenixOptions, tx, finishHeight, 1)
190198 if ((jackpotRandom == 1))
191199 then "phoenix"
192200 else {
193201 let n = getRandomNumber(1000, tx, finishHeight, 0)
194- if ((500 > n))
195- then "item!ART-MUTARIUM-D"
196- else "item!ART-MUTARIUM-G"
202+ if (if ((10 > n))
203+ then (blacklistCode != "item!ART-FREEGENE")
204+ else false)
205+ then "item!ART-FREEGENE"
206+ else if (if ((126 > n))
207+ then (blacklistCode != "ar")
208+ else false)
209+ then "ar"
210+ else if (if ((186 > n))
211+ then (blacklistCode != "item!ART-FIRE_ARMOUR")
212+ else false)
213+ then "item!ART-FIRE_ARMOUR"
214+ else if (if ((206 > n))
215+ then (blacklistCode != "item!ART-FEED5")
216+ else false)
217+ then "item!ART-FEED5"
218+ else if (if ((226 > n))
219+ then (blacklistCode != "item!ART-FEED10")
220+ else false)
221+ then "item!ART-FEED10"
222+ else if (if ((246 > n))
223+ then (blacklistCode != "item!ART-FEED15")
224+ else false)
225+ then "item!ART-FEED15"
226+ else if (if ((266 > n))
227+ then (blacklistCode != "item!ART-FEED20")
228+ else false)
229+ then "item!ART-FEED20"
230+ else if (if ((286 > n))
231+ then (blacklistCode != "item!ART-FEED25")
232+ else false)
233+ then "item!ART-FEED25"
234+ else if (if ((296 > n))
235+ then (blacklistCode != "item!ART-FEED50")
236+ else false)
237+ then "item!ART-FEED50"
238+ else if (if ((300 > n))
239+ then (blacklistCode != "item!ART-FEED100")
240+ else false)
241+ then "item!ART-FEED100"
242+ else if (if ((310 > n))
243+ then (blacklistCode != "item!ART-CROWN")
244+ else false)
245+ then "item!ART-CROWN"
246+ else if (if ((350 > n))
247+ then (blacklistCode != "incubator")
248+ else false)
249+ then "incubator"
250+ else if (if ((460 > n))
251+ then (blacklistCode != "item!ART-BUILTBODY")
252+ else false)
253+ then if ((50 > assetRarity))
254+ then "item!ART-BUILTBODY"
255+ else "item!ART-MUTARIUM-D"
256+ else if (if ((480 > n))
257+ then (blacklistCode != "item!ART-SNAKE")
258+ else false)
259+ then "item!ART-SNAKE"
260+ else if (if ((510 > n))
261+ then (blacklistCode != "item!ART-ROBODUCK")
262+ else false)
263+ then "item!ART-ROBODUCK"
264+ else if (if ((600 > n))
265+ then (blacklistCode != "item!ART-KATANA")
266+ else false)
267+ then "item!ART-KATANA"
268+ else if (if ((650 > n))
269+ then (blacklistCode != "item!ART-SCEPTER")
270+ else false)
271+ then if ((50 > assetRarity))
272+ then "item!ART-SCEPTER"
273+ else "item!ART-MUTARIUM-D"
274+ else if (if ((710 > n))
275+ then (blacklistCode != "item!ART-MUTARIUM-D")
276+ else false)
277+ then "item!ART-MUTARIUM-D"
278+ else if (if ((720 > n))
279+ then (blacklistCode != "item!ART-MUTARIUM-G")
280+ else false)
281+ then "item!ART-MUTARIUM-G"
282+ else if (if ((890 > n))
283+ then (blacklistCode != "duckling_10")
284+ else false)
285+ then "duckling_10"
286+ else if (if ((960 > n))
287+ then (blacklistCode != "duckling_20")
288+ else false)
289+ then "duckling_20"
290+ else "duckling_40"
197291 }
292+ }
293+
294+
295+func getRandomReturn (tx,finishHeight) = {
296+ let n = getRandomNumber(2, tx, finishHeight, 1)
297+ if ((n == 0))
298+ then true
299+ else false
198300 }
199301
200302
230332 func isTestEnv () = getBool("TESTENV")
231333
232334
233-func finishRebirthInternal (initTx,address,payment,double) = {
335+func finishRebirthInternal (initTx,address,additionalPayment,double,blacklistCode,rescue) = {
234336 let finishBlock = tryGetInteger((((("address_" + address) + "_initTx_") + initTx) + "_finishBlock"))
235337 let assetRarity = tryGetInteger((((("address_" + address) + "_initTx_") + initTx) + "_assetRarity"))
236338 let status = tryGetString((((("address_" + address) + "_initTx_") + initTx) + "_status"))
237- let validPayment = checkAdditionalPayment(payment)
339+ let validPayment = checkAdditionalPayment(additionalPayment)
238340 if ((validPayment == validPayment))
239341 then {
240342 let recordAction = invoke(getCouponsAddress(), "recordAction", ["REBIRTH"], nil)
249351 else if ((finishBlock > height))
250352 then throw("you cannot finish rebirth, yet")
251353 else {
252- let win = getRandomWin(fromBase58String(initTx), finishBlock, assetRarity)
354+ let win = getRandomWin(fromBase58String(initTx), finishBlock, assetRarity, blacklistCode)
253355 let txId = initTx
254356 let result = if ((indexOf(win, "perch") != unit))
255357 then {
306408 }
307409 else if ((win == "phoenix"))
308410 then {
309- let call = invoke(getIncubatorAddress(), "issueJackpot", [address, txId, "WWWWHWTF"], nil)
411+ let call = invoke(getIncubatorAddress(), "issueJackpot", [address, txId, "WWWWWWWP"], nil)
310412 if ((call == call))
311413 then [StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_result"), asString(call))]
312414 else throw("Strict value is not equal to itself.")
348450 else throw("Strict value is not equal to itself.")
349451 }
350452 else throw("RFB: Some error occured, please contact the admins!")
453+ let returnToSender = if (rescue)
454+ then getRandomReturn(fromBase58String(initTx), finishBlock)
455+ else false
456+ let returnPayload = if (returnToSender)
457+ then {
458+ let assetId = fromBase58String(getStringValue((((("address_" + address) + "_initTx_") + initTx) + "_assetId")))
459+ let issuer = checkReal(assetId)
460+ let gen = asString(invoke(getBreederAddress(), "getGenFromName", [value(assetInfo(assetId)).name], nil))
461+ if ((gen == gen))
462+ then {
463+ let call = invoke(issuer, "increaseRarity", [toBase58String(assetId), gen], nil)
464+ if ((call == call))
465+ then [ScriptTransfer(addressFromStringValue(address), 1, assetId)]
466+ else throw("Strict value is not equal to itself.")
467+ }
468+ else throw("Strict value is not equal to itself.")
469+ }
470+ else nil
351471 ((result ++ [StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_win"), win), StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_status"), "finish")]) ++ validPayment)
352472 }
353473 }
406526 else 0
407527 if ((payment == payment))
408528 then {
409- let $t01275612805 = getAssetFarmingPower(assetId)
410- let gen = $t01275612805._1
411- let rarity = $t01275612805._2
529+ let $t01575315802 = getAssetFarmingPower(assetId)
530+ let gen = $t01575315802._1
531+ let rarity = $t01575315802._2
412532 let call = invoke(getOrigin(assetId), "reduceRarity", [toBase58String(assetId), gen], nil)
413533 if ((call == call))
414534 then ([IntegerEntry((((("address_" + address) + "_initTx_") + initTx) + "_finishBlock"), (height + delayForHatching)), StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_status"), "open"), IntegerEntry((((("address_" + address) + "_initTx_") + initTx) + "_assetRarity"), rarity), StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_assetId"), toBase58String(assetId))] ++ validPayment)
425545
426546
427547 @Callable(i)
428-func finishRebirth (initTx) = finishRebirthInternal(initTx, toString(i.caller), i.payments[0], false)
548+func finishRebirth (initTx) = finishRebirthInternal(initTx, toString(i.caller), i.payments[0], false, "", false)
429549
430550
431551
439559 let boosterType = asString(invoke(getItemsAddress(), "checkArtefactDetails", [toBase58String(assetId)], nil))
440560 if ((boosterType == boosterType))
441561 then if ((boosterType == "ART-GIFT_DOUBL"))
442- then ([Burn(assetId, 1)] ++ finishRebirthInternal(initTx, toString(i.caller), i.payments[1], true))
562+ then ([Burn(assetId, 1)] ++ finishRebirthInternal(initTx, toString(i.caller), i.payments[1], true, "", false))
443563 else throw("Error! Wrong item attached to double rewards!")
444564 else throw("Strict value is not equal to itself.")
445565 }
566+
567+
568+
569+@Callable(i)
570+func finishRebirthItem (initTx,itemCode) = if (if ((size(i.payments) == 2))
571+ then (i.payments[0].amount == 1)
572+ else false)
573+ then {
574+ let assetId = value(i.payments[0].assetId)
575+ let boosterType = asString(invoke(getItemsAddress(), "checkArtefactDetails", [toBase58String(assetId)], nil))
576+ if ((boosterType == boosterType))
577+ then if ((boosterType == "ART-HWERASE"))
578+ then ([Burn(assetId, 1)] ++ finishRebirthInternal(initTx, toString(i.caller), i.payments[1], false, itemCode, false))
579+ else if ((boosterType == "ART-HWRESCUE"))
580+ then ([Burn(assetId, 1)] ++ finishRebirthInternal(initTx, toString(i.caller), i.payments[1], false, "", true))
581+ else if ((boosterType == "ART-GIFT_DOUBL"))
582+ then ([Burn(assetId, 1)] ++ finishRebirthInternal(initTx, toString(i.caller), i.payments[1], true, "", false))
583+ else throw("Error! Wrong item attached ")
584+ else throw("Strict value is not equal to itself.")
585+ }
586+ else if ((size(i.payments) == 1))
587+ then finishRebirthInternal(initTx, toString(i.caller), i.payments[0], false, "", false)
588+ else throw("Invalid payments")
446589
447590
448591 @Verifier(tx)
476619 let signaturesCount = ((firstUserSigned + secondUserSigned) + thirdUserSigned)
477620 match tx {
478621 case _ =>
479- (signaturesCount >= 2)
622+ (signaturesCount >= 1)
480623 }
481624 }
482625
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 func tryGetStringExternal (address,key) = match getString(address, key) {
55 case a: String =>
66 a
77 case _ =>
88 ""
99 }
1010
1111
1212 func tryGetIntExternal (address,key) = match getInteger(address, key) {
1313 case a: Int =>
1414 a
1515 case _ =>
1616 throw("RTGIE: Something went wrong")
1717 }
1818
1919
2020 func asBoolean (value) = match value {
2121 case boolean: Boolean =>
2222 boolean
2323 case _ =>
2424 throw("FAB: wrong type, expected: Boolean")
2525 }
2626
2727
2828 func tryGetString (key) = tryGetStringExternal(this, key)
2929
3030
3131 let delayForHatching = 2
3232
3333 func staticKey_oracleAddress () = "static_oracleAddress"
3434
3535
3636 func staticKey_eggAssetId () = "static_eggAssetId"
3737
3838
3939 func staticKey_incubatorAddress () = "static_incubatorAddress"
4040
4141
4242 func staticKey_breederAddress () = "static_breederAddress"
4343
4444
4545 func staticKey_farmingAddress () = "static_farmingAddressNew"
4646
4747
4848 func staticKey_babyDuckAddress () = "static_babyDuckAddress"
4949
5050
5151 func staticKey_gameDappAddress () = "static_gameDappAddress"
5252
5353
5454 func staticKey_itemsAddress () = "static_itemsAddress"
5555
5656
5757 func staticKey_couponsAddress () = "static_couponsAddress"
5858
5959
6060 func staticKey_huntAddress () = "static_huntAddress"
6161
6262
6363 func staticKey_burnAddress () = "static_burnAddress"
6464
6565
6666 func staticKey_refContractAddress () = "static_refContractAddress"
6767
6868
6969 func staticKey_extraFee () = "static_extraFee"
7070
7171
7272 func staticKey_feeAggregator () = "static_feeAggregator"
7373
7474
7575 func getOracle () = Address(fromBase58String(tryGetString(staticKey_oracleAddress())))
7676
7777
7878 func getEggAssetId () = fromBase58String(tryGetStringExternal(getOracle(), staticKey_eggAssetId()))
7979
8080
8181 func getIncubatorAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_incubatorAddress())))
8282
8383
8484 func getBreederAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_breederAddress())))
8585
8686
8787 func getFarmingAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_farmingAddress())))
8888
8989
9090 func getBabyDuckAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_babyDuckAddress())))
9191
9292
9393 func getGameDappAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_gameDappAddress())))
9494
9595
9696 func getItemsAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_itemsAddress())))
9797
9898
9999 func getCouponsAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_couponsAddress())))
100100
101101
102102 func getHuntAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_huntAddress())))
103103
104104
105105 func getBurnAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_burnAddress())))
106106
107107
108108 func getRefContractAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_refContractAddress())))
109109
110110
111111 func getFeeAggregator () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_feeAggregator())))
112112
113113
114+func checkReal (assetId) = if (if ((value(assetInfo(assetId)).issuer == getBreederAddress()))
115+ then true
116+ else (value(assetInfo(assetId)).issuer == getIncubatorAddress()))
117+ then value(assetInfo(assetId)).issuer
118+ else throw("not valid NFT")
119+
120+
114121 func checkAdditionalPayment (payment) = if (isDefined(payment.assetId))
115122 then throw("RCAP: Please attach waves")
116123 else {
117124 let feeAmount = getIntegerValue(getOracle(), staticKey_extraFee())
118125 if ((payment.amount != feeAmount))
119126 then throw((("RCAP: Please attach exactly " + toString(feeAmount)) + " amount of wavelets"))
120127 else [ScriptTransfer(getFeeAggregator(), feeAmount, unit)]
121128 }
122129
123130
124131 let PHOENIXBASEOPTIONS = 1000
125132
126133 func tryGetInteger (key) = match getInteger(this, key) {
127134 case b: Int =>
128135 b
129136 case _ =>
130137 0
131138 }
132139
133140
134141 func asString (value) = match value {
135142 case s: String =>
136143 s
137144 case s: Int =>
138145 throw("wrong type, expected: String, got: Int")
139146 case s: Unit =>
140147 throw("wrong type, expected: String, got: Unit")
141148 case _ =>
142149 throw("wrong type, expected: String")
143150 }
144151
145152
146153 let feeAmount = tryGetInteger("currentPrice")
147154
148155 func getAmountOrClear (amount) = if (contains(amount, "0"))
149156 then ""
150157 else amount
151158
152159
153160 func getAssetOrigin (generation) = if ((generation == "G"))
154161 then getIncubatorAddress()
155162 else getBreederAddress()
156163
157164
158165 func getAssetRarity (genotype,generation) = {
159166 let quantity = getIntegerValue(getAssetOrigin(generation), (("stats_" + genotype) + "_quantity"))
160167 let power = pow((10000 / quantity), 4, 5, 1, 2, FLOOR)
161168 if ((power > 0))
162169 then power
163170 else 2
164171 }
165172
166173
167174 func getAssetFarmingPower (assetId) = if (if ((value(assetInfo(assetId)).issuer == getBreederAddress()))
168175 then true
169176 else (value(assetInfo(assetId)).issuer == getIncubatorAddress()))
170177 then {
171178 let assetName = value(assetInfo(assetId)).name
172179 let generation = take(takeRight(assetName, 2), 1)
173180 let farmGen = asString(invoke(getBreederAddress(), "getGenFromName", [assetName], nil))
174181 if ((farmGen == farmGen))
175182 then $Tuple2(farmGen, getAssetRarity(farmGen, generation))
176183 else throw("Strict value is not equal to itself.")
177184 }
178185 else throw("not valid NFT")
179186
180187
181188 func getRandomNumber (options,txId,hatchingFinishHeight,offset) = {
182189 let randomSeedBlock = value(blockInfoByHeight((hatchingFinishHeight - 1)))
183190 let randomHash = sha256((txId + value(randomSeedBlock.vrf)))
184191 (toInt(randomHash, (offset * 8)) % options)
185192 }
186193
187194
188-func getRandomWin (tx,finishHeight,assetRarity) = {
189- let jackpotRandom = getRandomNumber(200, tx, finishHeight, 1)
195+func getRandomWin (tx,finishHeight,assetRarity,blacklistCode) = {
196+ let phoenixOptions = (PHOENIXBASEOPTIONS - fraction((PHOENIXBASEOPTIONS / 2), assetRarity, 100))
197+ let jackpotRandom = getRandomNumber(phoenixOptions, tx, finishHeight, 1)
190198 if ((jackpotRandom == 1))
191199 then "phoenix"
192200 else {
193201 let n = getRandomNumber(1000, tx, finishHeight, 0)
194- if ((500 > n))
195- then "item!ART-MUTARIUM-D"
196- else "item!ART-MUTARIUM-G"
202+ if (if ((10 > n))
203+ then (blacklistCode != "item!ART-FREEGENE")
204+ else false)
205+ then "item!ART-FREEGENE"
206+ else if (if ((126 > n))
207+ then (blacklistCode != "ar")
208+ else false)
209+ then "ar"
210+ else if (if ((186 > n))
211+ then (blacklistCode != "item!ART-FIRE_ARMOUR")
212+ else false)
213+ then "item!ART-FIRE_ARMOUR"
214+ else if (if ((206 > n))
215+ then (blacklistCode != "item!ART-FEED5")
216+ else false)
217+ then "item!ART-FEED5"
218+ else if (if ((226 > n))
219+ then (blacklistCode != "item!ART-FEED10")
220+ else false)
221+ then "item!ART-FEED10"
222+ else if (if ((246 > n))
223+ then (blacklistCode != "item!ART-FEED15")
224+ else false)
225+ then "item!ART-FEED15"
226+ else if (if ((266 > n))
227+ then (blacklistCode != "item!ART-FEED20")
228+ else false)
229+ then "item!ART-FEED20"
230+ else if (if ((286 > n))
231+ then (blacklistCode != "item!ART-FEED25")
232+ else false)
233+ then "item!ART-FEED25"
234+ else if (if ((296 > n))
235+ then (blacklistCode != "item!ART-FEED50")
236+ else false)
237+ then "item!ART-FEED50"
238+ else if (if ((300 > n))
239+ then (blacklistCode != "item!ART-FEED100")
240+ else false)
241+ then "item!ART-FEED100"
242+ else if (if ((310 > n))
243+ then (blacklistCode != "item!ART-CROWN")
244+ else false)
245+ then "item!ART-CROWN"
246+ else if (if ((350 > n))
247+ then (blacklistCode != "incubator")
248+ else false)
249+ then "incubator"
250+ else if (if ((460 > n))
251+ then (blacklistCode != "item!ART-BUILTBODY")
252+ else false)
253+ then if ((50 > assetRarity))
254+ then "item!ART-BUILTBODY"
255+ else "item!ART-MUTARIUM-D"
256+ else if (if ((480 > n))
257+ then (blacklistCode != "item!ART-SNAKE")
258+ else false)
259+ then "item!ART-SNAKE"
260+ else if (if ((510 > n))
261+ then (blacklistCode != "item!ART-ROBODUCK")
262+ else false)
263+ then "item!ART-ROBODUCK"
264+ else if (if ((600 > n))
265+ then (blacklistCode != "item!ART-KATANA")
266+ else false)
267+ then "item!ART-KATANA"
268+ else if (if ((650 > n))
269+ then (blacklistCode != "item!ART-SCEPTER")
270+ else false)
271+ then if ((50 > assetRarity))
272+ then "item!ART-SCEPTER"
273+ else "item!ART-MUTARIUM-D"
274+ else if (if ((710 > n))
275+ then (blacklistCode != "item!ART-MUTARIUM-D")
276+ else false)
277+ then "item!ART-MUTARIUM-D"
278+ else if (if ((720 > n))
279+ then (blacklistCode != "item!ART-MUTARIUM-G")
280+ else false)
281+ then "item!ART-MUTARIUM-G"
282+ else if (if ((890 > n))
283+ then (blacklistCode != "duckling_10")
284+ else false)
285+ then "duckling_10"
286+ else if (if ((960 > n))
287+ then (blacklistCode != "duckling_20")
288+ else false)
289+ then "duckling_20"
290+ else "duckling_40"
197291 }
292+ }
293+
294+
295+func getRandomReturn (tx,finishHeight) = {
296+ let n = getRandomNumber(2, tx, finishHeight, 1)
297+ if ((n == 0))
298+ then true
299+ else false
198300 }
199301
200302
201303 func getOrigin (assetId) = {
202304 let assetName = value(assetInfo(assetId)).name
203305 let generation = take(takeRight(assetName, 2), 1)
204306 if (if ((generation == "G"))
205307 then true
206308 else (generation == "J"))
207309 then getIncubatorAddress()
208310 else getBreederAddress()
209311 }
210312
211313
212314 func asInt (value) = match value {
213315 case int: Int =>
214316 int
215317 case string: String =>
216318 throw(("RAI: wrong type, expected: Int, but got: " + string))
217319 case _ =>
218320 throw("RAI: wrong type, expected: Int")
219321 }
220322
221323
222324 func getBool (key) = match getBoolean(this, key) {
223325 case b: Boolean =>
224326 b
225327 case _ =>
226328 false
227329 }
228330
229331
230332 func isTestEnv () = getBool("TESTENV")
231333
232334
233-func finishRebirthInternal (initTx,address,payment,double) = {
335+func finishRebirthInternal (initTx,address,additionalPayment,double,blacklistCode,rescue) = {
234336 let finishBlock = tryGetInteger((((("address_" + address) + "_initTx_") + initTx) + "_finishBlock"))
235337 let assetRarity = tryGetInteger((((("address_" + address) + "_initTx_") + initTx) + "_assetRarity"))
236338 let status = tryGetString((((("address_" + address) + "_initTx_") + initTx) + "_status"))
237- let validPayment = checkAdditionalPayment(payment)
339+ let validPayment = checkAdditionalPayment(additionalPayment)
238340 if ((validPayment == validPayment))
239341 then {
240342 let recordAction = invoke(getCouponsAddress(), "recordAction", ["REBIRTH"], nil)
241343 if ((recordAction == recordAction))
242344 then {
243345 func getAccessItemAssetId (address) = fromBase58String(tryGetStringExternal(address, "static_accessItemAssetId"))
244346
245347 func getAccessItemPrice (address) = tryGetIntExternal(address, "static_accessItemPrice")
246348
247349 if ((status != "open"))
248350 then throw("rebirth is finished or not open")
249351 else if ((finishBlock > height))
250352 then throw("you cannot finish rebirth, yet")
251353 else {
252- let win = getRandomWin(fromBase58String(initTx), finishBlock, assetRarity)
354+ let win = getRandomWin(fromBase58String(initTx), finishBlock, assetRarity, blacklistCode)
253355 let txId = initTx
254356 let result = if ((indexOf(win, "perch") != unit))
255357 then {
256358 let color = takeRight(win, 1)
257359 let result = if (!(double))
258360 then {
259361 let first = invoke(getFarmingAddress(), "addFreePerch", [address, color, 1], nil)
260362 if ((first == first))
261363 then [StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_result"), asString(first))]
262364 else throw("Strict value is not equal to itself.")
263365 }
264366 else {
265367 let first = invoke(getFarmingAddress(), "addFreePerch", [address, color, 2], nil)
266368 if ((first == first))
267369 then [StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_result"), asString(first)), StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_result1"), asString(first)), StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_win1"), win)]
268370 else throw("Strict value is not equal to itself.")
269371 }
270372 if ((result == result))
271373 then result
272374 else throw("Strict value is not equal to itself.")
273375 }
274376 else if ((win == "incubator"))
275377 then {
276378 let result = if (!(double))
277379 then {
278380 let first = invoke(getIncubatorAddress(), "issueFreeDuck", [address, txId], nil)
279381 if ((first == first))
280382 then [StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_result"), asString(first))]
281383 else throw("Strict value is not equal to itself.")
282384 }
283385 else {
284386 let first = invoke(getIncubatorAddress(), "issueFreeDuck", [address, txId], nil)
285387 if ((first == first))
286388 then {
287389 let second = invoke(getBabyDuckAddress(), "issueFreeDuckling", [address, txId, 100], nil)
288390 if ((second == second))
289391 then [StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_result"), asString(first)), StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_result1"), asString(second)), StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_win1"), "duckling_100")]
290392 else throw("Strict value is not equal to itself.")
291393 }
292394 else throw("Strict value is not equal to itself.")
293395 }
294396 if ((result == result))
295397 then result
296398 else throw("Strict value is not equal to itself.")
297399 }
298400 else if ((win == "ar"))
299401 then {
300402 let assetId = getAccessItemAssetId(getHuntAddress())
301403 let price = getAccessItemPrice(getHuntAddress())
302404 let call = invoke(getHuntAddress(), "buyAccessItemOther", [address], [AttachedPayment(assetId, price)])
303405 if ((call == call))
304406 then [StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_result"), asString(call))]
305407 else throw("Strict value is not equal to itself.")
306408 }
307409 else if ((win == "phoenix"))
308410 then {
309- let call = invoke(getIncubatorAddress(), "issueJackpot", [address, txId, "WWWWHWTF"], nil)
411+ let call = invoke(getIncubatorAddress(), "issueJackpot", [address, txId, "WWWWWWWP"], nil)
310412 if ((call == call))
311413 then [StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_result"), asString(call))]
312414 else throw("Strict value is not equal to itself.")
313415 }
314416 else if ((indexOf(win, "duckling") != unit))
315417 then {
316418 let level = parseIntValue(split(win, "_")[1])
317419 let levelFinal = if (double)
318420 then (2 * level)
319421 else level
320422 let call = invoke(getBabyDuckAddress(), "issueFreeDuckling", [address, txId, levelFinal], nil)
321423 if ((call == call))
322424 then [StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_result"), asString(call))]
323425 else throw("Strict value is not equal to itself.")
324426 }
325427 else if ((indexOf(win, "item") != unit))
326428 then {
327429 let itemName = split(win, "!")[1]
328430 let result = if (!(double))
329431 then {
330432 let first = invoke(getItemsAddress(), "issueArtefactIndex", [itemName, address, 0], nil)
331433 if ((first == first))
332434 then [StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_result"), asString(first))]
333435 else throw("Strict value is not equal to itself.")
334436 }
335437 else {
336438 let first = invoke(getItemsAddress(), "issueArtefactIndex", [itemName, address, 0], nil)
337439 if ((first == first))
338440 then {
339441 let second = invoke(getItemsAddress(), "issueArtefactIndex", [itemName, address, 1], nil)
340442 if ((second == second))
341443 then [StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_result"), asString(first)), StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_result"), asString(second)), StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_win1"), win)]
342444 else throw("Strict value is not equal to itself.")
343445 }
344446 else throw("Strict value is not equal to itself.")
345447 }
346448 if ((result == result))
347449 then result
348450 else throw("Strict value is not equal to itself.")
349451 }
350452 else throw("RFB: Some error occured, please contact the admins!")
453+ let returnToSender = if (rescue)
454+ then getRandomReturn(fromBase58String(initTx), finishBlock)
455+ else false
456+ let returnPayload = if (returnToSender)
457+ then {
458+ let assetId = fromBase58String(getStringValue((((("address_" + address) + "_initTx_") + initTx) + "_assetId")))
459+ let issuer = checkReal(assetId)
460+ let gen = asString(invoke(getBreederAddress(), "getGenFromName", [value(assetInfo(assetId)).name], nil))
461+ if ((gen == gen))
462+ then {
463+ let call = invoke(issuer, "increaseRarity", [toBase58String(assetId), gen], nil)
464+ if ((call == call))
465+ then [ScriptTransfer(addressFromStringValue(address), 1, assetId)]
466+ else throw("Strict value is not equal to itself.")
467+ }
468+ else throw("Strict value is not equal to itself.")
469+ }
470+ else nil
351471 ((result ++ [StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_win"), win), StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_status"), "finish")]) ++ validPayment)
352472 }
353473 }
354474 else throw("Strict value is not equal to itself.")
355475 }
356476 else throw("Strict value is not equal to itself.")
357477 }
358478
359479
360480 @Callable(i)
361481 func configureOracle (oracle) = if ((i.caller != this))
362482 then throw("RCU: admin only")
363483 else [StringEntry("static_oracleAddress", oracle)]
364484
365485
366486
367487 @Callable(i)
368488 func initRebirth (refererAddress) = {
369489 let pmt = i.payments[0]
370490 let assetId = value(pmt.assetId)
371491 let initTx = toBase58String(i.transactionId)
372492 let address = toString(i.caller)
373493 if ((pmt.amount != 1))
374494 then throw("NFT is not attached")
375495 else {
376496 let amountPaidByCoupons = asInt(invoke(getCouponsAddress(), "useCoupons", [feeAmount], nil))
377497 if ((amountPaidByCoupons == amountPaidByCoupons))
378498 then {
379499 let leftToPay = (feeAmount - amountPaidByCoupons)
380500 let validPayment = checkAdditionalPayment(i.payments[1])
381501 if ((validPayment == validPayment))
382502 then {
383503 let payment = if ((leftToPay != 0))
384504 then {
385505 let feePayment = value(i.payments[2])
386506 if ((feePayment.assetId != getEggAssetId()))
387507 then throw("You need to attach EGG tokens as fee")
388508 else if ((leftToPay > feePayment.amount))
389509 then throw(("You need to attach the following amount of EGG tokens as fee: 0." + toString(leftToPay)))
390510 else {
391511 let refererRewardForPerch = fraction(leftToPay, 5, 100)
392512 let refCall = asBoolean(invoke(getRefContractAddress(), "refPayment", [refererAddress], [AttachedPayment(getEggAssetId(), refererRewardForPerch)]))
393513 if ((refCall == refCall))
394514 then {
395515 let toBurn = if (refCall)
396516 then (leftToPay - refererRewardForPerch)
397517 else leftToPay
398518 let burnCall = invoke(getBurnAddress(), "burnAttachedPayments", nil, [AttachedPayment(getEggAssetId(), toBurn)])
399519 if ((burnCall == burnCall))
400520 then leftToPay
401521 else throw("Strict value is not equal to itself.")
402522 }
403523 else throw("Strict value is not equal to itself.")
404524 }
405525 }
406526 else 0
407527 if ((payment == payment))
408528 then {
409- let $t01275612805 = getAssetFarmingPower(assetId)
410- let gen = $t01275612805._1
411- let rarity = $t01275612805._2
529+ let $t01575315802 = getAssetFarmingPower(assetId)
530+ let gen = $t01575315802._1
531+ let rarity = $t01575315802._2
412532 let call = invoke(getOrigin(assetId), "reduceRarity", [toBase58String(assetId), gen], nil)
413533 if ((call == call))
414534 then ([IntegerEntry((((("address_" + address) + "_initTx_") + initTx) + "_finishBlock"), (height + delayForHatching)), StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_status"), "open"), IntegerEntry((((("address_" + address) + "_initTx_") + initTx) + "_assetRarity"), rarity), StringEntry((((("address_" + address) + "_initTx_") + initTx) + "_assetId"), toBase58String(assetId))] ++ validPayment)
415535 else throw("Strict value is not equal to itself.")
416536 }
417537 else throw("Strict value is not equal to itself.")
418538 }
419539 else throw("Strict value is not equal to itself.")
420540 }
421541 else throw("Strict value is not equal to itself.")
422542 }
423543 }
424544
425545
426546
427547 @Callable(i)
428-func finishRebirth (initTx) = finishRebirthInternal(initTx, toString(i.caller), i.payments[0], false)
548+func finishRebirth (initTx) = finishRebirthInternal(initTx, toString(i.caller), i.payments[0], false, "", false)
429549
430550
431551
432552 @Callable(i)
433553 func finishRebirthDouble (initTx) = if (!(if ((size(i.payments) == 2))
434554 then (i.payments[0].amount == 1)
435555 else false))
436556 then throw("Invalid payment")
437557 else {
438558 let assetId = value(i.payments[0].assetId)
439559 let boosterType = asString(invoke(getItemsAddress(), "checkArtefactDetails", [toBase58String(assetId)], nil))
440560 if ((boosterType == boosterType))
441561 then if ((boosterType == "ART-GIFT_DOUBL"))
442- then ([Burn(assetId, 1)] ++ finishRebirthInternal(initTx, toString(i.caller), i.payments[1], true))
562+ then ([Burn(assetId, 1)] ++ finishRebirthInternal(initTx, toString(i.caller), i.payments[1], true, "", false))
443563 else throw("Error! Wrong item attached to double rewards!")
444564 else throw("Strict value is not equal to itself.")
445565 }
566+
567+
568+
569+@Callable(i)
570+func finishRebirthItem (initTx,itemCode) = if (if ((size(i.payments) == 2))
571+ then (i.payments[0].amount == 1)
572+ else false)
573+ then {
574+ let assetId = value(i.payments[0].assetId)
575+ let boosterType = asString(invoke(getItemsAddress(), "checkArtefactDetails", [toBase58String(assetId)], nil))
576+ if ((boosterType == boosterType))
577+ then if ((boosterType == "ART-HWERASE"))
578+ then ([Burn(assetId, 1)] ++ finishRebirthInternal(initTx, toString(i.caller), i.payments[1], false, itemCode, false))
579+ else if ((boosterType == "ART-HWRESCUE"))
580+ then ([Burn(assetId, 1)] ++ finishRebirthInternal(initTx, toString(i.caller), i.payments[1], false, "", true))
581+ else if ((boosterType == "ART-GIFT_DOUBL"))
582+ then ([Burn(assetId, 1)] ++ finishRebirthInternal(initTx, toString(i.caller), i.payments[1], true, "", false))
583+ else throw("Error! Wrong item attached ")
584+ else throw("Strict value is not equal to itself.")
585+ }
586+ else if ((size(i.payments) == 1))
587+ then finishRebirthInternal(initTx, toString(i.caller), i.payments[0], false, "", false)
588+ else throw("Invalid payments")
446589
447590
448591 @Verifier(tx)
449592 func verify () = if (isTestEnv())
450593 then sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
451594 else {
452595 let firstUser = base58'6TdaXEfhnjYquvPf3yV7MFxt2CbgFmaqsvGwkKfXtKi4'
453596 let secondUser = base58'7DsP2WaMLocbHuUxux7pbXRjTrrZ1TFQPsi5QumS3gr8'
454597 let thirdUser = base58'BpFWP3p3JgYrrP45xfrKzeMcWMEXoinj4FVPPkUiA8D3'
455598 let firstUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], firstUser))
456599 then 1
457600 else if (sigVerify(tx.bodyBytes, tx.proofs[1], firstUser))
458601 then 1
459602 else if (sigVerify(tx.bodyBytes, tx.proofs[2], firstUser))
460603 then 1
461604 else 0
462605 let secondUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], secondUser))
463606 then 1
464607 else if (sigVerify(tx.bodyBytes, tx.proofs[1], secondUser))
465608 then 1
466609 else if (sigVerify(tx.bodyBytes, tx.proofs[2], secondUser))
467610 then 1
468611 else 0
469612 let thirdUserSigned = if (sigVerify(tx.bodyBytes, tx.proofs[0], thirdUser))
470613 then 1
471614 else if (sigVerify(tx.bodyBytes, tx.proofs[1], thirdUser))
472615 then 1
473616 else if (sigVerify(tx.bodyBytes, tx.proofs[2], thirdUser))
474617 then 1
475618 else 0
476619 let signaturesCount = ((firstUserSigned + secondUserSigned) + thirdUserSigned)
477620 match tx {
478621 case _ =>
479- (signaturesCount >= 2)
622+ (signaturesCount >= 1)
480623 }
481624 }
482625

github/deemru/w8io/026f985 
63.04 ms