{ "name": "ReputationRegistry", "structs": { "Score": [ { "name": "agent_id", "type": "uint64" }, { "name": "jobs_paid", "type": "uint64" }, { "name": "volume_micro", "type": "uint64" }, { "name": "validated", "type": "uint64" }, { "name": "disputed", "type": "uint64" }, { "name": "first_at", "type": "uint64" }, { "name": "last_at", "type": "uint64" } ] }, "methods": [ { "name": "bootstrap", "args": [ { "type": "uint64", "name": "identity_app" }, { "type": "uint64", "name": "usdc_asset" } ], "returns": { "type": "bool" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Point at the Identity Registry and fix the settlement asset.\nThe asset is set once and never changed, so a score always means the same thing. Without it accept_feedback would have to trust whatever asset a caller transferred, and reputation could be bought with a worthless one minted for the purpose.", "events": [], "recommendations": {} }, { "name": "set_validation_app", "args": [ { "type": "uint64", "name": "validation_app" } ], "returns": { "type": "bool" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Name the contract allowed to write verdicts. Once, by the creator.\nSeparate from bootstrap purely because of deployment order: the ValidationRegistry does not exist yet when this one is bootstrapped, so it cannot be named there.", "events": [], "recommendations": {} }, { "name": "accept_feedback", "args": [ { "type": "pay", "name": "mbr" }, { "type": "axfer", "name": "payment" }, { "type": "uint64", "name": "server_agent_id" }, { "type": "uint64", "name": "client_agent_id" } ], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Credit a server agent for one settled payment. Returns its new count.\nThe payment is passed as a TRANSACTION IN THIS GROUP, not as an id and an amount the caller supplies. That distinction is the whole point.\nThe previous signature took a 32-byte id and a number, and checked only that the id was 32 bytes long and unseen. Nothing tied either value to a transfer that had actually happened, so any 32 bytes bought a point of reputation \u2014 an audit found two counted payments on TestNet that resolve to no transaction at all, one of them 32 zero bytes. The docstring claiming a score \"cannot be inflated by anything that did not move USDC\" was simply untrue.\nNow the amount and the id are READ OFF the transfer the AVM has already validated, so they cannot be fabricated: to earn a point you must move the asset, in the same atomic group, in the same round.", "events": [], "recommendations": {} }, { "name": "recent", "args": [ { "type": "uint64", "name": "agent_id" }, { "type": "uint64", "name": "window_secs" } ], "returns": { "type": "bool" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Has this agent been paid inside the last `window_secs`?\nDeliberately a boolean, not a windowed count. A real rolling window needs per-payment timestamps, and storing one box per payment is the `pd_` ledger this contract removed for being circular and unnecessary. Returning a count that silently meant \"lifetime\" would be worse than returning the one fact the stored data actually supports.\nReputation here does not decay, and that is a choice worth stating: a payment happened or it did not, and an agent that earned trust and then went quiet has not become untrustworthy. What a reader usually wants to know is whether it is still ACTIVE, which is this.", "events": [], "recommendations": {} }, { "name": "record_validation", "args": [ { "type": "uint64", "name": "job_id" }, { "type": "uint64", "name": "server_agent_id" }, { "type": "bool", "name": "passed" } ], "returns": { "type": "bool" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Record a verdict against an agent's score. ValidationRegistry only.\nThe caller is checked against the app id set at deployment \u2014 an address calling directly has a caller_application_id of 0 and is refused.\n`job_id` makes the write idempotent. The verdict is no longer recorded inside validation_response (an unfunded score box there could revert the whole call and let expire_verdict force a pass); it is driven by a separate, funded, retryable ValidationRegistry call, so this must reject a second recording of the same job or the counters could be inflated by replaying it.", "events": [], "recommendations": {} }, { "name": "get_score", "args": [ { "type": "uint64", "name": "agent_id" } ], "returns": { "type": "(uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "struct": "Score" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "events": [], "recommendations": {} } ], "arcs": [ 22, 28 ], "networks": {}, "state": { "schema": { "global": { "ints": 3, "bytes": 0 }, "local": { "ints": 0, "bytes": 0 } }, "keys": { "global": { "identity_app": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "aWRlbnRpdHlfYXBw" }, "usdc_asset": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "dXNkY19hc3NldA==" }, "validation_app": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "dmFsaWRhdGlvbl9hcHA=" } }, "local": {}, "box": {} }, "maps": { "global": {}, "local": {}, "box": { "scores": { "keyType": "uint64", "valueType": "Score", "prefix": "c2Nf" }, "recorded_jobs": { "keyType": "uint64", "valueType": "uint64", "prefix": "cnZf" } } } }, "bareActions": { "create": [ "NoOp" ], "call": [ "DeleteApplication" ] }, "sourceInfo": { "approval": { "sourceInfo": [ { "pc": [ 291 ], "errorMessage": "a zero-value payment earns nothing" }, { "pc": [ 407, 469 ], "errorMessage": "account funded" }, { "pc": [ 199 ], "errorMessage": "already bootstrapped" }, { "pc": [ 236 ], "errorMessage": "already set" }, { "pc": [ 312 ], "errorMessage": "an agent cannot pay itself into a reputation" }, { "pc": [ 345, 387 ], "errorMessage": "application log value is not the result of an ABI return" }, { "pc": [ 197, 317 ], "errorMessage": "check self.identity_app exists" }, { "pc": [ 526, 679, 735 ], "errorMessage": "check self.scores entry exists" }, { "pc": [ 300 ], "errorMessage": "check self.usdc_asset exists" }, { "pc": [ 234, 576 ], "errorMessage": "check self.validation_app exists" }, { "pc": [ 193 ], "errorMessage": "creator only" }, { "pc": [ 572 ], "errorMessage": "invalid number of bytes for arc4.bool" }, { "pc": [ 353, 395 ], "errorMessage": "invalid number of bytes for arc4.static_array" }, { "pc": [ 179, 187, 224, 277, 285, 491, 501, 556, 564, 663 ], "errorMessage": "invalid number of bytes for arc4.uint64" }, { "pc": [ 578 ], "errorMessage": "no validation app is set, so no verdict can be trusted" }, { "pc": [ 582 ], "errorMessage": "only the ValidationRegistry may record a verdict" }, { "pc": [ 165 ], "errorMessage": "only the creator may delete" }, { "pc": [ 230 ], "errorMessage": "only the creator may set this" }, { "pc": [ 474 ], "errorMessage": "payment must cover the score box this credit may add" }, { "pc": [ 302 ], "errorMessage": "reputation is denominated in one asset; this transfer is not it" }, { "pc": [ 452 ], "errorMessage": "storage payment must be sent to this app" }, { "pc": [ 401 ], "errorMessage": "the payment did not come from the agent being credited as the client" }, { "pc": [ 359 ], "errorMessage": "the payment did not go to the agent being credited" }, { "pc": [ 202 ], "errorMessage": "the settlement asset must be set" }, { "pc": [ 599 ], "errorMessage": "this job's verdict was already recorded" }, { "pc": [ 269 ], "errorMessage": "transaction type is axfer" }, { "pc": [ 258 ], "errorMessage": "transaction type is pay" }, { "pc": [ 239 ], "errorMessage": "validation app id required" }, { "pc": [ 460 ], "errorMessage": "you must pay for the storage you create" } ], "pcOffsetMethod": "none" }, "clear": { "sourceInfo": [], "pcOffsetMethod": "none" } }, "source": { "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgOCAzMgogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1IDB4NzM2MzVmICJpZGVudGl0eV9hcHAiICJ2YWxpZGF0aW9uX2FwcCIgInVzZGNfYXNzZXQiIDB4MTUxZjdjNzU4MCAweGM3Yjk3MDYzCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBjb250cmFjdHMvcmVwdXRhdGlvbl9yZWdpc3RyeS5weTo1MAogICAgLy8gc2VsZi5pZGVudGl0eV9hcHAgPSBVSW50NjQoMCkKICAgIGJ5dGVjXzIgLy8gImlkZW50aXR5X2FwcCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gY29udHJhY3RzL3JlcHV0YXRpb25fcmVnaXN0cnkucHk6NTEtNTMKICAgIC8vICMgV2hpY2ggYXNzZXQgY291bnRzLiBTZXQgYXQgYm9vdHN0cmFwOyBhIHRyYW5zZmVyIG9mIGFueXRoaW5nIGVsc2UKICAgIC8vICMgaXMgcmVmdXNlZCByYXRoZXIgdGhhbiBzaWxlbnRseSBjcmVkaXRlZC4KICAgIC8vIHNlbGYudXNkY19hc3NldCA9IFVJbnQ2NCgwKQogICAgYnl0ZWMgNCAvLyAidXNkY19hc3NldCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gY29udHJhY3RzL3JlcHV0YXRpb25fcmVnaXN0cnkucHk6NTUtNTgKICAgIC8vICMgVGhlIFZhbGlkYXRpb25SZWdpc3RyeSwgYW5kIHRoZSBPTkxZIGNhbGxlciBhbGxvd2VkIHRvIHdyaXRlIGEKICAgIC8vICMgdmVyZGljdC4gU2V0IHNlcGFyYXRlbHkgZnJvbSBib290c3RyYXAgYmVjYXVzZSB2YWxpZGF0aW9uIGlzIGRlcGxveWVkCiAgICAvLyAjIGFmdGVyIHRoaXMgY29udHJhY3QgYW5kIGNhbm5vdCBuYW1lIGl0c2VsZiBiZWZvcmUgaXQgZXhpc3RzLgogICAgLy8gc2VsZi52YWxpZGF0aW9uX2FwcCA9IFVJbnQ2NCgwKQogICAgYnl0ZWNfMyAvLyAidmFsaWRhdGlvbl9hcHAiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gY29udHJhY3RzL3JlcHV0YXRpb25fcmVnaXN0cnkucHk6NDgKICAgIC8vIGNsYXNzIFJlcHV0YXRpb25SZWdpc3RyeShBUkM0Q29udHJhY3QpOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fYmFyZV9yb3V0aW5nQDE1CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQKICAgIHB1c2hieXRlc3MgMHg1ZjA2ZTJkZSAweDRmNjY2OWY5IDB4NWViMDY3NTggMHhiMzhhM2UxZCAweDU4ZmQ4OGM1IDB4MjQ3ZTkwYTAgLy8gbWV0aG9kICJib290c3RyYXAodWludDY0LHVpbnQ2NClib29sIiwgbWV0aG9kICJzZXRfdmFsaWRhdGlvbl9hcHAodWludDY0KWJvb2wiLCBtZXRob2QgImFjY2VwdF9mZWVkYmFjayhwYXksYXhmZXIsdWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInJlY2VudCh1aW50NjQsdWludDY0KWJvb2wiLCBtZXRob2QgInJlY29yZF92YWxpZGF0aW9uKHVpbnQ2NCx1aW50NjQsYm9vbClib29sIiwgbWV0aG9kICJnZXRfc2NvcmUodWludDY0KSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggYm9vdHN0cmFwIHNldF92YWxpZGF0aW9uX2FwcCBhY2NlcHRfZmVlZGJhY2sgcmVjZW50IHJlY29yZF92YWxpZGF0aW9uIGdldF9zY29yZQogICAgZXJyCgptYWluX2JhcmVfcm91dGluZ0AxNToKICAgIC8vIGNvbnRyYWN0cy9yZXB1dGF0aW9uX3JlZ2lzdHJ5LnB5OjQ4CiAgICAvLyBjbGFzcyBSZXB1dGF0aW9uUmVnaXN0cnkoQVJDNENvbnRyYWN0KToKICAgIGludGNfMCAvLyBOb09wCiAgICBwdXNoaW50IDUgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgIHR4biBPbkNvbXBsZXRpb24KICAgIG1hdGNoIG1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAMTYgbWFpbl9kZWxldGVAMTcKICAgIGVycgoKbWFpbl9kZWxldGVAMTc6CiAgICAvLyBjb250cmFjdHMvcmVwdXRhdGlvbl9yZWdpc3RyeS5weToyMTMKICAgIC8vIEBhcmM0LmJhcmVtZXRob2QoYWxsb3dfYWN0aW9ucz1bIkRlbGV0ZUFwcGxpY2F0aW9uIl0pCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0CiAgICAvLyBjb250cmFjdHMvcmVwdXRhdGlvbl9yZWdpc3RyeS5weToyMjEKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IEdsb2JhbC5jcmVhdG9yX2FkZHJlc3MsICJvbmx5IHRoZSBjcmVhdG9yIG1heSBkZWxldGUiCiAgICB0eG4gU2VuZGVyCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgID09CiAgICBhc3NlcnQgLy8gb25seSB0aGUgY3JlYXRvciBtYXkgZGVsZXRlCiAgICAvLyBjb250cmFjdHMvcmVwdXRhdGlvbl9yZWdpc3RyeS5weToyMTMKICAgIC8vIEBhcmM0LmJhcmVtZXRob2QoYWxsb3dfYWN0aW9ucz1bIkRlbGV0ZUFwcGxpY2F0aW9uIl0pCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDE2OgogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIHJldHVybgoKCi8vIHJlcHV0YXRpb25fcmVnaXN0cnkuUmVwdXRhdGlvblJlZ2lzdHJ5LmJvb3RzdHJhcFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmJvb3RzdHJhcDoKICAgIC8vIGNvbnRyYWN0cy9yZXB1dGF0aW9uX3JlZ2lzdHJ5LnB5OjczCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIC8vIGNvbnRyYWN0cy9yZXB1dGF0aW9uX3JlZ2lzdHJ5LnB5OjgyCiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBHbG9iYWwuY3JlYXRvcl9hZGRyZXNzLCAiY3JlYXRvciBvbmx5IgogICAgdHhuIFNlbmRlcgogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIGNyZWF0b3Igb25seQogICAgLy8gY29udHJhY3RzL3JlcHV0YXRpb25fcmVnaXN0cnkucHk6ODMKICAgIC8vIGFzc2VydCBzZWxmLmlkZW50aXR5X2FwcCA9PSAwLCAiYWxyZWFkeSBib290c3RyYXBwZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiaWRlbnRpdHlfYXBwIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmlkZW50aXR5X2FwcCBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBhbHJlYWR5IGJvb3RzdHJhcHBlZAogICAgLy8gY29udHJhY3RzL3JlcHV0YXRpb25fcmVnaXN0cnkucHk6ODQKICAgIC8vIGFzc2VydCB1c2RjX2Fzc2V0Lm5hdGl2ZSAhPSAwLCAidGhlIHNldHRsZW1lbnQgYXNzZXQgbXVzdCBiZSBzZXQiCiAgICBidG9pCiAgICBkdXAKICAgIGFzc2VydCAvLyB0aGUgc2V0dGxlbWVudCBhc3NldCBtdXN0IGJlIHNldAogICAgLy8gY29udHJhY3RzL3JlcHV0YXRpb25fcmVnaXN0cnkucHk6ODUKICAgIC8vIHNlbGYuaWRlbnRpdHlfYXBwID0gaWRlbnRpdHlfYXBwLm5hdGl2ZQogICAgc3dhcAogICAgYnRvaQogICAgYnl0ZWNfMiAvLyAiaWRlbnRpdHlfYXBwIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIGNvbnRyYWN0cy9yZXB1dGF0aW9uX3JlZ2lzdHJ5LnB5Ojg2CiAgICAvLyBzZWxmLnVzZGNfYXNzZXQgPSB1c2RjX2Fzc2V0Lm5hdGl2ZQogICAgYnl0ZWMgNCAvLyAidXNkY19hc3NldCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBjb250cmFjdHMvcmVwdXRhdGlvbl9yZWdpc3RyeS5weTo3MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlYyA1IC8vIDB4MTUxZjdjNzU4MAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gcmVwdXRhdGlvbl9yZWdpc3RyeS5SZXB1dGF0aW9uUmVnaXN0cnkuc2V0X3ZhbGlkYXRpb25fYXBwW3JvdXRpbmddKCkgLT4gdm9pZDoKc2V0X3ZhbGlkYXRpb25fYXBwOgogICAgLy8gY29udHJhY3RzL3JlcHV0YXRpb25fcmVnaXN0cnkucHk6ODkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgLy8gY29udHJhY3RzL3JlcHV0YXRpb25fcmVnaXN0cnkucHk6OTcKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IEdsb2JhbC5jcmVhdG9yX2FkZHJlc3MsICJvbmx5IHRoZSBjcmVhdG9yIG1heSBzZXQgdGhpcyIKICAgIHR4biBTZW5kZXIKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgPT0KICAgIGFzc2VydCAvLyBvbmx5IHRoZSBjcmVhdG9yIG1heSBzZXQgdGhpcwogICAgLy8gY29udHJhY3RzL3JlcHV0YXRpb25fcmVnaXN0cnkucHk6OTgKICAgIC8vIGFzc2VydCBzZWxmLnZhbGlkYXRpb25fYXBwID09IDAsICJhbHJlYWR5IHNldCIKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJ2YWxpZGF0aW9uX2FwcCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi52YWxpZGF0aW9uX2FwcCBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBhbHJlYWR5IHNldAogICAgLy8gY29udHJhY3RzL3JlcHV0YXRpb25fcmVnaXN0cnkucHk6OTkKICAgIC8vIGFzc2VydCB2YWxpZGF0aW9uX2FwcC5uYXRpdmUgPiAwLCAidmFsaWRhdGlvbiBhcHAgaWQgcmVxdWlyZWQiCiAgICBidG9pCiAgICBkdXAKICAgIGFzc2VydCAvLyB2YWxpZGF0aW9uIGFwcCBpZCByZXF1aXJlZAogICAgLy8gY29udHJhY3RzL3JlcHV0YXRpb25fcmVnaXN0cnkucHk6MTAwCiAgICAvLyBzZWxmLnZhbGlkYXRpb25fYXBwID0gdmFsaWRhdGlvbl9hcHAubmF0aXZlCiAgICBieXRlY18zIC8vICJ2YWxpZGF0aW9uX2FwcCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBjb250cmFjdHMvcmVwdXRhdGlvbl9yZWdpc3RyeS5weTo4OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlYyA1IC8vIDB4MTUxZjdjNzU4MAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gcmVwdXRhdGlvbl9yZWdpc3RyeS5SZXB1dGF0aW9uUmVnaXN0cnkuYWNjZXB0X2ZlZWRiYWNrW3JvdXRpbmddKCkgLT4gdm9pZDoKYWNjZXB0X2ZlZWRiYWNrOgogICAgLy8gY29udHJhY3RzL3JlcHV0YXRpb25fcmVnaXN0cnkucHk6MTE4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBHcm91cEluZGV4CiAgICBwdXNoaW50IDIKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMSAvLyBwYXkKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBwYXkKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgcHVzaGludCA0IC8vIGF4ZmVyCiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgYXhmZXIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIC8vIGNvbnRyYWN0cy9yZXB1dGF0aW9uX3JlZ2lzdHJ5LnB5OjE0MwogICAgLy8gYXNzZXJ0IHBheW1lbnQuYXNzZXRfYW1vdW50ID4gMCwgImEgemVyby12YWx1ZSBwYXltZW50IGVhcm5zIG5vdGhpbmciCiAgICBkaWcgMgogICAgZ3R4bnMgQXNzZXRBbW91bnQKICAgIGR1cAogICAgYXNzZXJ0IC8vIGEgemVyby12YWx1ZSBwYXltZW50IGVhcm5zIG5vdGhpbmcKICAgIC8vIGNvbnRyYWN0cy9yZXB1dGF0aW9uX3JlZ2lzdHJ5LnB5OjE0NQogICAgLy8gcGF5bWVudC54ZmVyX2Fzc2V0LmlkID09IHNlbGYudXNkY19hc3NldAogICAgZGlnIDMKICAgIGd0eG5zIFhmZXJBc3NldAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gInVzZGNfYXNzZXQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudXNkY19hc3NldCBleGlzdHMKICAgID09CiAgICAvLyBjb250cmFjdHMvcmVwdXRhdGlvbl9yZWdpc3RyeS5weToxNDQtMTQ2CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHBheW1lbnQueGZlcl9hc3NldC5pZCA9PSBzZWxmLnVzZGNfYXNzZXQKICAgIC8vICksICJyZXB1dGF0aW9uIGlzIGRlbm9taW5hdGVkIGluIG9uZSBhc3NldDsgdGhpcyB0cmFuc2ZlciBpcyBub3QgaXQiCiAgICBhc3NlcnQgLy8gcmVwdXRhdGlvbiBpcyBkZW5vbWluYXRlZCBpbiBvbmUgYXNzZXQ7IHRoaXMgdHJhbnNmZXIgaXMgbm90IGl0CiAgICAvLyBjb250cmFjdHMvcmVwdXRhdGlvbl9yZWdpc3RyeS5weToxNDgKICAgIC8vIHNlcnZlcl9hZ2VudF9pZC5uYXRpdmUgIT0gY2xpZW50X2FnZW50X2lkLm5hdGl2ZQogICAgZGlnIDIKICAgIGJ0b2kKICAgIGRpZyAyCiAgICBidG9pCiAgICBkaWcgMQogICAgIT0KICAgIC8vIGNvbnRyYWN0cy9yZXB1dGF0aW9uX3JlZ2lzdHJ5LnB5OjE0Ny0xNDkKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgc2VydmVyX2FnZW50X2lkLm5hdGl2ZSAhPSBjbGllbnRfYWdlbnRfaWQubmF0aXZlCiAgICAvLyApLCAiYW4gYWdlbnQgY2Fubm90IHBheSBpdHNlbGYgaW50byBhIHJlcHV0YXRpb24iCiAgICBhc3NlcnQgLy8gYW4gYWdlbnQgY2Fubm90IHBheSBpdHNlbGYgaW50byBhIHJlcHV0YXRpb24KICAgIC8vIGNvbnRyYWN0cy9yZXB1dGF0aW9uX3JlZ2lzdHJ5LnB5OjE1MS0xNjcKICAgIC8vICMgVEhFIG1vbmV5IG11c3QgaGF2ZSBnb25lIHRvIFRIRSBhZ2VudCBiZWluZyBjcmVkaXRlZC4KICAgIC8vICMKICAgIC8vICMgUmVhZGluZyB0aGUgYW1vdW50IG9mZiBhIHJlYWwgdHJhbnNmZXIgc3RvcHBlZCBzY29yZXMgYmVpbmcgbWludGVkIGZyb20KICAgIC8vICMgaW52ZW50ZWQgYnl0ZXMsIGJ1dCBvbiBpdHMgb3duIGl0IHN0aWxsIGNyZWRpdGVkIHdoaWNoZXZlciBpZCB0aGUgY2FsbGVyCiAgICAvLyAjIG5hbWVkLiBBbnlvbmUgY291bGQgbW92ZSBvbmUgbWljcm9VU0RDIGJldHdlZW4gdHdvIGFkZHJlc3NlcyB0aGV5IG93bmVkCiAgICAvLyAjIGFuZCBjcmVkaXQgYSBzdHJhbmdlcidzIGFnZW50IOKAlCBvciwgd2l0aCB0d28gaWRzLCB0aGVtc2VsdmVzLiBUaGUKICAgIC8vICMgaWQtaW5lcXVhbGl0eSBjaGVjayBhYm92ZSBkb2VzIG5vdCBoZWxwOiBpZHMgYXJlIG5vdCBpZGVudGl0aWVzLgogICAgLy8gIwogICAgLy8gIyBTbyByZXNvbHZlIGJvdGggZW5kcyBhZ2FpbnN0IHRoZSBJZGVudGl0eVJlZ2lzdHJ5LCB3aGljaCBpcyB0aGUgb25seQogICAgLy8gIyBwbGFjZSBhbiBhZGRyZXNzLXRvLWlkIGJpbmRpbmcgaXMgYXV0aGVudGljYXRlZCAobmV3X2FnZW50IHRha2VzIHRoZQogICAgLy8gIyBvd25lciBmcm9tIFR4bi5zZW5kZXIpLiBBIGNyZWRpdCBub3cgcmVxdWlyZXMgdGhlIHBheW1lbnQgdG8gaGF2ZSBiZWVuCiAgICAvLyAjIHNlbnQgQlkgdGhlIGNsaWVudCdzIHJlZ2lzdGVyZWQgYWRkcmVzcyBUTyB0aGUgc2VydmVyJ3MuCiAgICAvLyBzZXJ2ZXJfYWRkciwgX3R4biA9IGFyYzQuYWJpX2NhbGxbYXJjNC5BZGRyZXNzXSgKICAgIC8vICAgICAiYWdlbnRfYWRkcmVzcyh1aW50NjQpYWRkcmVzcyIsCiAgICAvLyAgICAgc2VydmVyX2FnZW50X2lkLAogICAgLy8gICAgIGFwcF9pZD1zZWxmLmlkZW50aXR5X2FwcCwKICAgIC8vICkKICAgIGl0eG5fYmVnaW4KICAgIC8vIGNvbnRyYWN0cy9yZXB1dGF0aW9uX3JlZ2lzdHJ5LnB5OjE2NgogICAgLy8gYXBwX2lkPXNlbGYuaWRlbnRpdHlfYXBwLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImlkZW50aXR5X2FwcCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5pZGVudGl0eV9hcHAgZXhpc3RzCiAgICBkdXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgLy8gY29udHJhY3RzL3JlcHV0YXRpb25fcmVnaXN0cnkucHk6MTUxLTE2NwogICAgLy8gIyBUSEUgbW9uZXkgbXVzdCBoYXZlIGdvbmUgdG8gVEhFIGFnZW50IGJlaW5nIGNyZWRpdGVkLgogICAgLy8gIwogICAgLy8gIyBSZWFkaW5nIHRoZSBhbW91bnQgb2ZmIGEgcmVhbCB0cmFuc2ZlciBzdG9wcGVkIHNjb3JlcyBiZWluZyBtaW50ZWQgZnJvbQogICAgLy8gIyBpbnZlbnRlZCBieXRlcywgYnV0IG9uIGl0cyBvd24gaXQgc3RpbGwgY3JlZGl0ZWQgd2hpY2hldmVyIGlkIHRoZSBjYWxsZXIKICAgIC8vICMgbmFtZWQuIEFueW9uZSBjb3VsZCBtb3ZlIG9uZSBtaWNyb1VTREMgYmV0d2VlbiB0d28gYWRkcmVzc2VzIHRoZXkgb3duZWQKICAgIC8vICMgYW5kIGNyZWRpdCBhIHN0cmFuZ2VyJ3MgYWdlbnQg4oCUIG9yLCB3aXRoIHR3byBpZHMsIHRoZW1zZWx2ZXMuIFRoZQogICAgLy8gIyBpZC1pbmVxdWFsaXR5IGNoZWNrIGFib3ZlIGRvZXMgbm90IGhlbHA6IGlkcyBhcmUgbm90IGlkZW50aXRpZXMuCiAgICAvLyAjCiAgICAvLyAjIFNvIHJlc29sdmUgYm90aCBlbmRzIGFnYWluc3QgdGhlIElkZW50aXR5UmVnaXN0cnksIHdoaWNoIGlzIHRoZSBvbmx5CiAgICAvLyAjIHBsYWNlIGFuIGFkZHJlc3MtdG8taWQgYmluZGluZyBpcyBhdXRoZW50aWNhdGVkIChuZXdfYWdlbnQgdGFrZXMgdGhlCiAgICAvLyAjIG93bmVyIGZyb20gVHhuLnNlbmRlcikuIEEgY3JlZGl0IG5vdyByZXF1aXJlcyB0aGUgcGF5bWVudCB0byBoYXZlIGJlZW4KICAgIC8vICMgc2VudCBCWSB0aGUgY2xpZW50J3MgcmVnaXN0ZXJlZCBhZGRyZXNzIFRPIHRoZSBzZXJ2ZXIncy4KICAgIC8vIHNlcnZlcl9hZGRyLCBfdHhuID0gYXJjNC5hYmlfY2FsbFthcmM0LkFkZHJlc3NdKAogICAgLy8gICAgICJhZ2VudF9hZGRyZXNzKHVpbnQ2NClhZGRyZXNzIiwKICAgIC8vICAgICBzZXJ2ZXJfYWdlbnRfaWQsCiAgICAvLyAgICAgYXBwX2lkPXNlbGYuaWRlbnRpdHlfYXBwLAogICAgLy8gKQogICAgYnl0ZWMgNiAvLyBtZXRob2QgImFnZW50X2FkZHJlc3ModWludDY0KWFkZHJlc3MiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgdW5jb3ZlciA0CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGxvZyB2YWx1ZSBpcyBub3QgdGhlIHJlc3VsdCBvZiBhbiBBQkkgcmV0dXJuCiAgICBleHRyYWN0IDQgMAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBjb250cmFjdHMvcmVwdXRhdGlvbl9yZWdpc3RyeS5weToxNjkKICAgIC8vIHBheW1lbnQuYXNzZXRfcmVjZWl2ZXIgPT0gc2VydmVyX2FkZHIubmF0aXZlCiAgICBkaWcgNQogICAgZ3R4bnMgQXNzZXRSZWNlaXZlcgogICAgPT0KICAgIC8vIGNvbnRyYWN0cy9yZXB1dGF0aW9uX3JlZ2lzdHJ5LnB5OjE2OC0xNzAKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgcGF5bWVudC5hc3NldF9yZWNlaXZlciA9PSBzZXJ2ZXJfYWRkci5uYXRpdmUKICAgIC8vICksICJ0aGUgcGF5bWVudCBkaWQgbm90IGdvIHRvIHRoZSBhZ2VudCBiZWluZyBjcmVkaXRlZCIKICAgIGFzc2VydCAvLyB0aGUgcGF5bWVudCBkaWQgbm90IGdvIHRvIHRoZSBhZ2VudCBiZWluZyBjcmVkaXRlZAogICAgLy8gY29udHJhY3RzL3JlcHV0YXRpb25fcmVnaXN0cnkucHk6MTcyLTE3NgogICAgLy8gY2xpZW50X2FkZHIsIF90eG4yID0gYXJjNC5hYmlfY2FsbFthcmM0LkFkZHJlc3NdKAogICAgLy8gICAgICJhZ2VudF9hZGRyZXNzKHVpbnQ2NClhZGRyZXNzIiwKICAgIC8vICAgICBjbGllbnRfYWdlbnRfaWQsCiAgICAvLyAgICAgYXBwX2lkPXNlbGYuaWRlbnRpdHlfYXBwLAogICAgLy8gKQogICAgaXR4bl9iZWdpbgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBieXRlYyA2IC8vIG1ldGhvZCAiYWdlbnRfYWRkcmVzcyh1aW50NjQpYWRkcmVzcyIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICB1bmNvdmVyIDIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gbG9nIHZhbHVlIGlzIG5vdCB0aGUgcmVzdWx0IG9mIGFuIEFCSSByZXR1cm4KICAgIGV4dHJhY3QgNCAwCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIGNvbnRyYWN0cy9yZXB1dGF0aW9uX3JlZ2lzdHJ5LnB5OjE3OAogICAgLy8gcGF5bWVudC5zZW5kZXIgPT0gY2xpZW50X2FkZHIubmF0aXZlCiAgICB1bmNvdmVyIDMKICAgIGd0eG5zIFNlbmRlcgogICAgPT0KICAgIC8vIGNvbnRyYWN0cy9yZXB1dGF0aW9uX3JlZ2lzdHJ5LnB5OjE3Ny0xNzkKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgcGF5bWVudC5zZW5kZXIgPT0gY2xpZW50X2FkZHIubmF0aXZlCiAgICAvLyApLCAidGhlIHBheW1lbnQgZGlkIG5vdCBjb21lIGZyb20gdGhlIGFnZW50IGJlaW5nIGNyZWRpdGVkIGFzIHRoZSBjbGllbnQiCiAgICBhc3NlcnQgLy8gdGhlIHBheW1lbnQgZGlkIG5vdCBjb21lIGZyb20gdGhlIGFnZW50IGJlaW5nIGNyZWRpdGVkIGFzIHRoZSBjbGllbnQKICAgIC8vIGNvbnRyYWN0cy9yZXB1dGF0aW9uX3JlZ2lzdHJ5LnB5OjE5MgogICAgLy8gYXBwID0gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcwogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIGNvbnRyYWN0cy9yZXB1dGF0aW9uX3JlZ2lzdHJ5LnB5OjE5MwogICAgLy8gbWJyX2JlZm9yZSA9IGFwcC5taW5fYmFsYW5jZQogICAgZHVwCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdE1pbkJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IGZ1bmRlZAogICAgLy8gY29udHJhY3RzL3JlcHV0YXRpb25fcmVnaXN0cnkucHk6MTk2CiAgICAvLyBzID0gc2VsZi5fdG91Y2goc2lkKQogICAgZGlnIDIKICAgIGNhbGxzdWIgX3RvdWNoCiAgICAvLyBjb250cmFjdHMvcmVwdXRhdGlvbl9yZWdpc3RyeS5weToxOTcKICAgIC8vIHMuam9ic19wYWlkID0gYXJjNC5VSW50NjQocy5qb2JzX3BhaWQubmF0aXZlICsgMSkKICAgIGR1cAogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgcmVwbGFjZTIgOAogICAgLy8gY29udHJhY3RzL3JlcHV0YXRpb25fcmVnaXN0cnkucHk6MTk4CiAgICAvLyBzLnZvbHVtZV9taWNybyA9IGFyYzQuVUludDY0KHMudm9sdW1lX21pY3JvLm5hdGl2ZSArIHBheW1lbnQuYXNzZXRfYW1vdW50KQogICAgZHVwCiAgICBwdXNoaW50IDE2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgdW5jb3ZlciA1CiAgICArCiAgICBpdG9iCiAgICByZXBsYWNlMiAxNgogICAgLy8gY29udHJhY3RzL3JlcHV0YXRpb25fcmVnaXN0cnkucHk6MTk5CiAgICAvLyBzLmxhc3RfYXQgPSBhcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCkKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGl0b2IKICAgIHJlcGxhY2UyIDQ4CiAgICAvLyBjb250cmFjdHMvcmVwdXRhdGlvbl9yZWdpc3RyeS5weToyMDAKICAgIC8vIHNlbGYuc2NvcmVzW3NpZF0gPSBzLmNvcHkoKQogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICBieXRlY18xIC8vIDB4NzM2MzVmCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBib3hfcHV0CiAgICAvLyBjb250cmFjdHMvcmVwdXRhdGlvbl9yZWdpc3RyeS5weToyMDItMjA1CiAgICAvLyAjIEEgZmlyc3QgY3JlZGl0IGZvciBhbiBhZ2VudCBjcmVhdGVzIGl0cyBzY29yZSBib3gsIHdob3NlIG1pbmltdW0KICAgIC8vICMgYmFsYW5jZSBpcyBjaGFyZ2VkIHRvIFRISVMgYXBwLiBIYXZlIHRoZSBjYWxsZXIgY292ZXIgdGhhdCBncm93dGggc28gYQogICAgLy8gIyBzdHJhbmdlciBjYW5ub3QgZHJhaW4gdGhlIGFwcCdzIG93biBiYWxhbmNlIG9uZSBzY29yZSBib3ggYXQgYSB0aW1lLgogICAgLy8gYXNzZXJ0IG1ici5yZWNlaXZlciA9PSBhcHAsICJzdG9yYWdlIHBheW1lbnQgbXVzdCBiZSBzZW50IHRvIHRoaXMgYXBwIgogICAgZGlnIDMKICAgIGd0eG5zIFJlY2VpdmVyCiAgICBkaWcgMwogICAgPT0KICAgIGFzc2VydCAvLyBzdG9yYWdlIHBheW1lbnQgbXVzdCBiZSBzZW50IHRvIHRoaXMgYXBwCiAgICAvLyBjb250cmFjdHMvcmVwdXRhdGlvbl9yZWdpc3RyeS5weToyMDYKICAgIC8vIGFzc2VydCBtYnIuc2VuZGVyID09IFR4bi5zZW5kZXIsICJ5b3UgbXVzdCBwYXkgZm9yIHRoZSBzdG9yYWdlIHlvdSBjcmVhdGUiCiAgICBkaWcgMwogICAgZ3R4bnMgU2VuZGVyCiAgICB0eG4gU2VuZGVyCiAgICA9PQogICAgYXNzZXJ0IC8vIHlvdSBtdXN0IHBheSBmb3IgdGhlIHN0b3JhZ2UgeW91IGNyZWF0ZQogICAgLy8gY29udHJhY3RzL3JlcHV0YXRpb25fcmVnaXN0cnkucHk6MjA4CiAgICAvLyBtYnIuYW1vdW50ID49IGFwcC5taW5fYmFsYW5jZSAtIG1icl9iZWZvcmUKICAgIHVuY292ZXIgMwogICAgZ3R4bnMgQW1vdW50CiAgICB1bmNvdmVyIDMKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0TWluQmFsYW5jZQogICAgYXNzZXJ0IC8vIGFjY291bnQgZnVuZGVkCiAgICB1bmNvdmVyIDMKICAgIC0KICAgID49CiAgICAvLyBjb250cmFjdHMvcmVwdXRhdGlvbl9yZWdpc3RyeS5weToyMDctMjA5CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIG1ici5hbW91bnQgPj0gYXBwLm1pbl9iYWxhbmNlIC0gbWJyX2JlZm9yZQogICAgLy8gKSwgInBheW1lbnQgbXVzdCBjb3ZlciB0aGUgc2NvcmUgYm94IHRoaXMgY3JlZGl0IG1heSBhZGQiCiAgICBhc3NlcnQgLy8gcGF5bWVudCBtdXN0IGNvdmVyIHRoZSBzY29yZSBib3ggdGhpcyBjcmVkaXQgbWF5IGFkZAogICAgLy8gY29udHJhY3RzL3JlcHV0YXRpb25fcmVnaXN0cnkucHk6MjExCiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQocy5qb2JzX3BhaWQubmF0aXZlKQogICAgZXh0cmFjdCA4IDgKICAgIC8vIGNvbnRyYWN0cy9yZXB1dGF0aW9uX3JlZ2lzdHJ5LnB5OjExOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gcmVwdXRhdGlvbl9yZWdpc3RyeS5SZXB1dGF0aW9uUmVnaXN0cnkucmVjZW50W3JvdXRpbmddKCkgLT4gdm9pZDoKcmVjZW50OgogICAgLy8gY29udHJhY3RzL3JlcHV0YXRpb25fcmVnaXN0cnkucHk6MjIzCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIC8vIGNvbnRyYWN0cy9yZXB1dGF0aW9uX3JlZ2lzdHJ5LnB5OjIzOAogICAgLy8gYWlkID0gYWdlbnRfaWQubmF0aXZlCiAgICBidG9pCiAgICAvLyBjb250cmFjdHMvcmVwdXRhdGlvbl9yZWdpc3RyeS5weToyMzkKICAgIC8vIGlmIGFpZCBub3QgaW4gc2VsZi5zY29yZXM6CiAgICBpdG9iCiAgICBieXRlY18xIC8vIDB4NzM2MzVmCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBibnogcmVjZW50X2FmdGVyX2lmX2Vsc2VAMwogICAgcG9wbiAyCiAgICAvLyBjb250cmFjdHMvcmVwdXRhdGlvbl9yZWdpc3RyeS5weToyNDAKICAgIC8vIHJldHVybiBhcmM0LkJvb2woRmFsc2UpICAjIG5vcWE6IEZCVDAwMwogICAgcHVzaGJ5dGVzIDB4MDAKCnJlY2VudF9hZnRlcl9pbmxpbmVkX3JlcHV0YXRpb25fcmVnaXN0cnkuUmVwdXRhdGlvblJlZ2lzdHJ5LnJlY2VudEA0OgogICAgLy8gY29udHJhY3RzL3JlcHV0YXRpb25fcmVnaXN0cnkucHk6MjIzCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCnJlY2VudF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBjb250cmFjdHMvcmVwdXRhdGlvbl9yZWdpc3RyeS5weToyNDEKICAgIC8vIGxhc3QgPSBzZWxmLnNjb3Jlc1thaWRdLmxhc3RfYXQubmF0aXZlCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zY29yZXMgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDQ4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gY29udHJhY3RzL3JlcHV0YXRpb25fcmVnaXN0cnkucHk6MjQyCiAgICAvLyByZXR1cm4gYXJjNC5Cb29sKEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wIDw9IGxhc3QgKyB3aW5kb3dfc2Vjcy5uYXRpdmUpCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICB1bmNvdmVyIDIKICAgIGJ0b2kKICAgIHVuY292ZXIgMgogICAgKwogICAgPD0KICAgIHB1c2hieXRlcyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIC8vIGNvbnRyYWN0cy9yZXB1dGF0aW9uX3JlZ2lzdHJ5LnB5OjIyMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJlY2VudF9hZnRlcl9pbmxpbmVkX3JlcHV0YXRpb25fcmVnaXN0cnkuUmVwdXRhdGlvblJlZ2lzdHJ5LnJlY2VudEA0CgoKLy8gcmVwdXRhdGlvbl9yZWdpc3RyeS5SZXB1dGF0aW9uUmVnaXN0cnkucmVjb3JkX3ZhbGlkYXRpb25bcm91dGluZ10oKSAtPiB2b2lkOgpyZWNvcmRfdmFsaWRhdGlvbjoKICAgIC8vIGNvbnRyYWN0cy9yZXB1dGF0aW9uX3JlZ2lzdHJ5LnB5OjI0NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuYm9vbAogICAgLy8gY29udHJhY3RzL3JlcHV0YXRpb25fcmVnaXN0cnkucHk6MjYwCiAgICAvLyBhc3NlcnQgc2VsZi52YWxpZGF0aW9uX2FwcCAhPSAwLCAibm8gdmFsaWRhdGlvbiBhcHAgaXMgc2V0LCBzbyBubyB2ZXJkaWN0IGNhbiBiZSB0cnVzdGVkIgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInZhbGlkYXRpb25fYXBwIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnZhbGlkYXRpb25fYXBwIGV4aXN0cwogICAgZHVwCiAgICBhc3NlcnQgLy8gbm8gdmFsaWRhdGlvbiBhcHAgaXMgc2V0LCBzbyBubyB2ZXJkaWN0IGNhbiBiZSB0cnVzdGVkCiAgICAvLyBjb250cmFjdHMvcmVwdXRhdGlvbl9yZWdpc3RyeS5weToyNjIKICAgIC8vIEdsb2JhbC5jYWxsZXJfYXBwbGljYXRpb25faWQgPT0gc2VsZi52YWxpZGF0aW9uX2FwcAogICAgZ2xvYmFsIENhbGxlckFwcGxpY2F0aW9uSUQKICAgID09CiAgICAvLyBjb250cmFjdHMvcmVwdXRhdGlvbl9yZWdpc3RyeS5weToyNjEtMjYzCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIEdsb2JhbC5jYWxsZXJfYXBwbGljYXRpb25faWQgPT0gc2VsZi52YWxpZGF0aW9uX2FwcAogICAgLy8gKSwgIm9ubHkgdGhlIFZhbGlkYXRpb25SZWdpc3RyeSBtYXkgcmVjb3JkIGEgdmVyZGljdCIKICAgIGFzc2VydCAvLyBvbmx5IHRoZSBWYWxpZGF0aW9uUmVnaXN0cnkgbWF5IHJlY29yZCBhIHZlcmRpY3QKICAgIC8vIGNvbnRyYWN0cy9yZXB1dGF0aW9uX3JlZ2lzdHJ5LnB5OjI2NAogICAgLy8gamlkID0gam9iX2lkLm5hdGl2ZQogICAgdW5jb3ZlciAyCiAgICBidG9pCiAgICAvLyBjb250cmFjdHMvcmVwdXRhdGlvbl9yZWdpc3RyeS5weToyNjUKICAgIC8vIGFzc2VydCBqaWQgbm90IGluIHNlbGYucmVjb3JkZWRfam9icywgInRoaXMgam9iJ3MgdmVyZGljdCB3YXMgYWxyZWFkeSByZWNvcmRlZCIKICAgIGl0b2IKICAgIHB1c2hieXRlcyAweDcyNzY1ZgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIHRoaXMgam9iJ3MgdmVyZGljdCB3YXMgYWxyZWFkeSByZWNvcmRlZAogICAgLy8gY29udHJhY3RzL3JlcHV0YXRpb25fcmVnaXN0cnkucHk6MjY2CiAgICAvLyBzZWxmLnJlY29yZGVkX2pvYnNbamlkXSA9IFRydWUKICAgIGludGNfMSAvLyAxCiAgICBpdG9iCiAgICBib3hfcHV0CiAgICAvLyBjb250cmFjdHMvcmVwdXRhdGlvbl9yZWdpc3RyeS5weToyNjcKICAgIC8vIHNpZCA9IHNlcnZlcl9hZ2VudF9pZC5uYXRpdmUKICAgIHN3YXAKICAgIGJ0b2kKICAgIGR1cAogICAgY292ZXIgMgogICAgLy8gY29udHJhY3RzL3JlcHV0YXRpb25fcmVnaXN0cnkucHk6MjY4CiAgICAvLyBzID0gc2VsZi5fdG91Y2goc2lkKQogICAgY2FsbHN1YiBfdG91Y2gKICAgIHN3YXAKICAgIC8vIGNvbnRyYWN0cy9yZXB1dGF0aW9uX3JlZ2lzdHJ5LnB5OjI2OQogICAgLy8gaWYgcGFzc2VkLm5hdGl2ZToKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIGJ6IHJlY29yZF92YWxpZGF0aW9uX2Vsc2VfYm9keUAzCiAgICAvLyBjb250cmFjdHMvcmVwdXRhdGlvbl9yZWdpc3RyeS5weToyNzAKICAgIC8vIHMudmFsaWRhdGVkID0gYXJjNC5VSW50NjQocy52YWxpZGF0ZWQubmF0aXZlICsgMSkKICAgIGR1cAogICAgcHVzaGludCAyNAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpdG9iCiAgICByZXBsYWNlMiAyNAoKcmVjb3JkX3ZhbGlkYXRpb25fYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gY29udHJhY3RzL3JlcHV0YXRpb25fcmVnaXN0cnkucHk6MjczCiAgICAvLyBzLmxhc3RfYXQgPSBhcmM0LlVJbnQ2NChHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCkKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGl0b2IKICAgIHJlcGxhY2UyIDQ4CiAgICAvLyBjb250cmFjdHMvcmVwdXRhdGlvbl9yZWdpc3RyeS5weToyNzQKICAgIC8vIHNlbGYuc2NvcmVzW3NpZF0gPSBzLmNvcHkoKQogICAgZGlnIDEKICAgIGl0b2IKICAgIGJ5dGVjXzEgLy8gMHg3MzYzNWYKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gY29udHJhY3RzL3JlcHV0YXRpb25fcmVnaXN0cnkucHk6MjQ0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGJ5dGVjIDUgLy8gMHgxNTFmN2M3NTgwCiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCnJlY29yZF92YWxpZGF0aW9uX2Vsc2VfYm9keUAzOgogICAgLy8gY29udHJhY3RzL3JlcHV0YXRpb25fcmVnaXN0cnkucHk6MjcyCiAgICAvLyBzLmRpc3B1dGVkID0gYXJjNC5VSW50NjQocy5kaXNwdXRlZC5uYXRpdmUgKyAxKQogICAgZHVwCiAgICBpbnRjXzMgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgcmVwbGFjZTIgMzIKICAgIGIgcmVjb3JkX3ZhbGlkYXRpb25fYWZ0ZXJfaWZfZWxzZUA0CgoKLy8gcmVwdXRhdGlvbl9yZWdpc3RyeS5SZXB1dGF0aW9uUmVnaXN0cnkuZ2V0X3Njb3JlW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X3Njb3JlOgogICAgLy8gY29udHJhY3RzL3JlcHV0YXRpb25fcmVnaXN0cnkucHk6Mjc3CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cG4gMgogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIC8vIGNvbnRyYWN0cy9yZXB1dGF0aW9uX3JlZ2lzdHJ5LnB5OjI3OQogICAgLy8gYWlkID0gYWdlbnRfaWQubmF0aXZlCiAgICBidG9pCiAgICAvLyBjb250cmFjdHMvcmVwdXRhdGlvbl9yZWdpc3RyeS5weToyODAKICAgIC8vIGlmIGFpZCBpbiBzZWxmLnNjb3JlczoKICAgIGl0b2IKICAgIGJ5dGVjXzEgLy8gMHg3MzYzNWYKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGdldF9zY29yZV9hZnRlcl9pZl9lbHNlQDMKICAgIGJ1cnkgMQogICAgLy8gY29udHJhY3RzL3JlcHV0YXRpb25fcmVnaXN0cnkucHk6MjgxCiAgICAvLyByZXR1cm4gc2VsZi5zY29yZXNbYWlkXQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NvcmVzIGVudHJ5IGV4aXN0cwoKZ2V0X3Njb3JlX2FmdGVyX2lubGluZWRfcmVwdXRhdGlvbl9yZWdpc3RyeS5SZXB1dGF0aW9uUmVnaXN0cnkuZ2V0X3Njb3JlQDQ6CiAgICAvLyBjb250cmFjdHMvcmVwdXRhdGlvbl9yZWdpc3RyeS5weToyNzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKZ2V0X3Njb3JlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIHBvcAogICAgLy8gY29udHJhY3RzL3JlcHV0YXRpb25fcmVnaXN0cnkucHk6MjgyCiAgICAvLyBub3cgPSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gY29udHJhY3RzL3JlcHV0YXRpb25fcmVnaXN0cnkucHk6Mjg3CiAgICAvLyBqb2JzX3BhaWQ9YXJjNC5VSW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgaXRvYgogICAgLy8gY29udHJhY3RzL3JlcHV0YXRpb25fcmVnaXN0cnkucHk6MjkxCiAgICAvLyBmaXJzdF9hdD1hcmM0LlVJbnQ2NChub3cpLAogICAgc3dhcAogICAgaXRvYgogICAgLy8gY29udHJhY3RzL3JlcHV0YXRpb25fcmVnaXN0cnkucHk6MjgzLTI5MwogICAgLy8gIyBBbiB1bmtub3duIGFnZW50IHJlYWRzIGFzIGFsbC16ZXJvIHJhdGhlciB0aGFuIGVycm9yaW5nOiAibm8gcmVjb3JkIiBpcwogICAgLy8gIyBhIHJlYWwgYW5zd2VyIGFuZCB0aGUgY2FsbGVyIHNob3VsZCByZW5kZXIgaXQgYXMgc3VjaC4KICAgIC8vIHJldHVybiBTY29yZSgKICAgIC8vICAgICBhZ2VudF9pZD1hcmM0LlVJbnQ2NChhaWQpLAogICAgLy8gICAgIGpvYnNfcGFpZD1hcmM0LlVJbnQ2NCgwKSwKICAgIC8vICAgICB2b2x1bWVfbWljcm89YXJjNC5VSW50NjQoMCksCiAgICAvLyAgICAgdmFsaWRhdGVkPWFyYzQuVUludDY0KDApLAogICAgLy8gICAgIGRpc3B1dGVkPWFyYzQuVUludDY0KDApLAogICAgLy8gICAgIGZpcnN0X2F0PWFyYzQuVUludDY0KG5vdyksCiAgICAvLyAgICAgbGFzdF9hdD1hcmM0LlVJbnQ2NChub3cpLAogICAgLy8gKQogICAgdW5jb3ZlciAyCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkaWcgMgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcmVwdXRhdGlvbl9yZWdpc3RyeS5weToyNzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiBnZXRfc2NvcmVfYWZ0ZXJfaW5saW5lZF9yZXB1dGF0aW9uX3JlZ2lzdHJ5LlJlcHV0YXRpb25SZWdpc3RyeS5nZXRfc2NvcmVANAoKCi8vIHJlcHV0YXRpb25fcmVnaXN0cnkuUmVwdXRhdGlvblJlZ2lzdHJ5Ll90b3VjaChhZ2VudF9pZDogdWludDY0KSAtPiBieXRlczoKX3RvdWNoOgogICAgLy8gY29udHJhY3RzL3JlcHV0YXRpb25fcmVnaXN0cnkucHk6MTAzLTEwNAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBfdG91Y2goc2VsZiwgYWdlbnRfaWQ6IFVJbnQ2NCkgLT4gU2NvcmU6CiAgICBwcm90byAxIDEKICAgIC8vIGNvbnRyYWN0cy9yZXB1dGF0aW9uX3JlZ2lzdHJ5LnB5OjEwNQogICAgLy8gbm93ID0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIGNvbnRyYWN0cy9yZXB1dGF0aW9uX3JlZ2lzdHJ5LnB5OjEwNgogICAgLy8gaWYgYWdlbnRfaWQgaW4gc2VsZi5zY29yZXM6CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGR1cAogICAgYnl0ZWNfMSAvLyAweDczNjM1ZgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogX3RvdWNoX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gY29udHJhY3RzL3JlcHV0YXRpb25fcmVnaXN0cnkucHk6MTA3CiAgICAvLyByZXR1cm4gc2VsZi5zY29yZXNbYWdlbnRfaWRdLmNvcHkoKQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc2NvcmVzIGVudHJ5IGV4aXN0cwogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCl90b3VjaF9hZnRlcl9pZl9lbHNlQDI6CiAgICBwb3AKICAgIC8vIGNvbnRyYWN0cy9yZXB1dGF0aW9uX3JlZ2lzdHJ5LnB5OjExMAogICAgLy8gam9ic19wYWlkPWFyYzQuVUludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIGl0b2IKICAgIC8vIGNvbnRyYWN0cy9yZXB1dGF0aW9uX3JlZ2lzdHJ5LnB5OjExNAogICAgLy8gZmlyc3RfYXQ9YXJjNC5VSW50NjQobm93KSwKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgLy8gY29udHJhY3RzL3JlcHV0YXRpb25fcmVnaXN0cnkucHk6MTA4LTExNgogICAgLy8gcmV0dXJuIFNjb3JlKAogICAgLy8gICAgIGFnZW50X2lkPWFyYzQuVUludDY0KGFnZW50X2lkKSwKICAgIC8vICAgICBqb2JzX3BhaWQ9YXJjNC5VSW50NjQoMCksCiAgICAvLyAgICAgdm9sdW1lX21pY3JvPWFyYzQuVUludDY0KDApLAogICAgLy8gICAgIHZhbGlkYXRlZD1hcmM0LlVJbnQ2NCgwKSwKICAgIC8vICAgICBkaXNwdXRlZD1hcmM0LlVJbnQ2NCgwKSwKICAgIC8vICAgICBmaXJzdF9hdD1hcmM0LlVJbnQ2NChub3cpLAogICAgLy8gICAgIGxhc3RfYXQ9YXJjNC5VSW50NjQobm93KSwKICAgIC8vICkKICAgIHVuY292ZXIgMgogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZGlnIDIKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgcmV0c3ViCg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==" }, "byteCode": { "approval": "CyAEAAEIICYHBBUffHUDc2NfDGlkZW50aXR5X2FwcA52YWxpZGF0aW9uX2FwcAp1c2RjX2Fzc2V0BRUffHWABMe5cGMxGEAACioiZycEImcrImcxG0EAOTEZFEQxGESCBgRfBuLeBE9mafkEXrBnWASzij4dBFj9iMUEJH6QoDYaAI4GABwASQBoAVQBlQH/ACKBBTEZjgIADAABADEYRDEAMgkSRCNDMRgUQzYaAUkVJBJENhoCSRUkEkQxADIJEkQiKmVEFEQXSURMFypMZycETGcnBbAjQzYaAUkVJBJEMQAyCRJEIitlRBREF0lEK0xnJwWwI0MxFoECCUk4ECMSRDEWIwlJOBCBBBJENhoBSRUkEkQ2GgJJFSQSREsCOBJJREsDOBEiJwRlRBJESwIXSwIXSwETRLEiKmVESbIYJwayGk8EshqBBrIQIrIBs7Q+SVcABCgSRFcEAEkVJRJESwU4FBJEsbIYJwayGk8CshqBBrIQIrIBs7Q+SVcABCgSRFcEAEkVJRJETwM4ABJEMgpJcwFESwKIAS5JJFsjCBZcCEmBEFtPBQgWXBAyBxZcME8DFilMUEsBv0sDOAdLAxJESwM4ADEAEkRPAzgITwNzAURPAwkPRFcICChMULAjQzYaAUkVJBJENhoCSU4CFSQSRBcWKUxQSb1FAUAAC0YCgAEAKExQsCNDvkSBMFsyB08CF08CCA6AAQAiTwJUQv/iNhoBSRUkEkQ2GgJJFSQSRDYaA0kVIxJEIitlRElEMg0SRE8CFxaAA3J2X0xQSb1FARREIxa/TBdJTgKIAGhMIlNBABtJgRhbIwgWXBgyBxZcMEsBFilMUEy/JwWwI0NJJVsjCBZcIEL/4zYaAUcCFSQSRBcWKUxQSb1FAUEACkUBvkQoTFCwI0NIMgciFkwWTwJLAlBLAlBLAlBPAlBLAVBMUEL/3YoBATIHi/8WSSlMUEm9RQFBAAW+RIwAiUgiFk8CFk8CSwJQSwJQSwJQTwJQSwFQTFCJ", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, "minor": 9, "patch": 0 } }, "events": [], "templateVariables": {} }