{ "name": "IdentityRegistry", "structs": { "AgentInfo": [ { "name": "agent_id", "type": "uint64" }, { "name": "agent_domain", "type": "string" }, { "name": "agent_address", "type": "address" }, { "name": "registered_at", "type": "uint64" }, { "name": "updated_at", "type": "uint64" } ] }, "methods": [ { "name": "new_agent", "args": [ { "type": "pay", "name": "mbr" }, { "type": "string", "name": "agent_domain" } ], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Register the caller as an agent and return its new id.\nThe address is taken from the sender rather than an argument: a registration that anyone could make on anyone's behalf is not identity, it is a phone book.\nThe caller funds the storage. Each registration creates three boxes whose minimum balance is charged to THIS app's account; the docstring used to claim the caller contributed it but the code never took it, so one unfunded registration could push the app below its minimum balance and refuse every later registrant. `mbr` is a payment, in the same group, from the registrant to this app covering exactly the box storage it adds. deregister_agent returns it.", "events": [], "recommendations": {} }, { "name": "update_agent", "args": [ { "type": "pay", "name": "mbr" }, { "type": "uint64", "name": "agent_id" }, { "type": "string", "name": "new_domain" } ], "returns": { "type": "bool" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Move an agent to a new domain. Only its own address may do this.\n`mbr` covers any GROWTH in box storage when the new domain is longer than the old one; a shorter domain simply returns its saving to the app.", "events": [], "recommendations": {} }, { "name": "get_agent", "args": [ { "type": "uint64", "name": "agent_id" } ], "returns": { "type": "(uint64,string,address,uint64,uint64)", "struct": "AgentInfo" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "events": [], "recommendations": {} }, { "name": "rotate_address", "args": [ { "type": "uint64", "name": "agent_id" }, { "type": "address", "name": "new_address" } ], "returns": { "type": "bool" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "PROPOSE a new controlling address. Current owner only; nothing moves yet.\nWithout a way to move an identity, a compromised or lost key is terminal: new_agent asserts one identity per address, so the owner cannot re-register, and the id \u2014 with every score and job that references it \u2014 is stranded with a key somebody else may hold.\nBut a one-step rotation let an attacker BIND their own identity onto a stranger's address without consent: register scam.example, rotate it onto a victim's payout address, and now resolve_by_address(victim) returns the attacker's record and the victim cannot register their own. So rotation is two steps: this proposes, and claim_address lets the proposed address accept. An address can never be handed an identity it did not ask for.", "events": [], "recommendations": {} }, { "name": "claim_address", "args": [ { "type": "uint64", "name": "agent_id" } ], "returns": { "type": "bool" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Accept a proposed rotation. Only the proposed address may call this,\nwhich is what turns a rotation into consent rather than a shove.", "events": [], "recommendations": {} }, { "name": "cancel_rotation", "args": [ { "type": "uint64", "name": "agent_id" } ], "returns": { "type": "bool" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Withdraw a proposed rotation. Current owner only.", "events": [], "recommendations": {} }, { "name": "deregister_agent", "args": [ { "type": "uint64", "name": "agent_id" } ], "returns": { "type": "bool" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Remove your own agent, freeing the three boxes it occupies.\nOnly the controlling address, because new_agent took the owner from Txn.sender and this has to be the same authority in reverse. Without it a typo'd domain is permanent: new_agent asserts one identity per address, so the owner cannot re-register and cannot remove the old one either \u2014 the id is stranded and the box minimum-balance with it.\nThe id is NOT reused. agent_count only ever climbs, so a stale reference resolves to nothing rather than silently pointing at whoever registered next.", "events": [], "recommendations": {} }, { "name": "agent_address", "args": [ { "type": "uint64", "name": "agent_id" } ], "returns": { "type": "address" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Just the controlling address. Exists for cross-contract callers.\n`get_agent` returns the whole record, including a dynamic string, which another contract would have to decode to reach the one field it wants. This returns a fixed 32 bytes, so ReputationRegistry can bind a payment to the agent it credits in a single inner call.\nAsserts rather than returning the zero address: a caller that treated \"not found\" as an address would compare it against a real one and get a silent mismatch instead of a reason.", "events": [], "recommendations": {} }, { "name": "resolve_by_domain", "args": [ { "type": "string", "name": "agent_domain" } ], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "0 means not found \u2014 callers must check rather than trust the id.", "events": [], "recommendations": {} }, { "name": "resolve_by_address", "args": [ { "type": "address", "name": "agent_address" } ], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "events": [], "recommendations": {} }, { "name": "total_agents", "args": [], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "events": [], "recommendations": {} } ], "arcs": [ 22, 28 ], "networks": {}, "state": { "schema": { "global": { "ints": 1, "bytes": 0 }, "local": { "ints": 0, "bytes": 0 } }, "keys": { "global": { "agent_count": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "YWdlbnRfY291bnQ=" } }, "local": {}, "box": {} }, "maps": { "global": {}, "local": {}, "box": { "agents": { "keyType": "uint64", "valueType": "AgentInfo", "prefix": "YWdf" }, "by_domain": { "keyType": "AVMString", "valueType": "uint64", "prefix": "ZG1f" }, "by_address": { "keyType": "address", "valueType": "uint64", "prefix": "YWRf" }, "pending": { "keyType": "uint64", "valueType": "address", "prefix": "cHJf" } } } }, "bareActions": { "create": [ "NoOp" ], "call": [ "DeleteApplication" ] }, "sourceInfo": { "approval": { "sourceInfo": [ { "pc": [ 245, 325, 425, 491, 798, 852 ], "errorMessage": "account funded" }, { "pc": [ 220 ], "errorMessage": "address already registered" }, { "pc": [ 594 ], "errorMessage": "cannot rotate to the zero address" }, { "pc": [ 250, 990 ], "errorMessage": "check self.agent_count exists" }, { "pc": [ 971 ], "errorMessage": "check self.by_address entry exists" }, { "pc": [ 937 ], "errorMessage": "check self.by_domain entry exists" }, { "pc": [ 235, 413 ], "errorMessage": "domain already registered" }, { "pc": [ 1070 ], "errorMessage": "domain must be ascii" }, { "pc": [ 1087 ], "errorMessage": "domain must be lower-case" }, { "pc": [ 1065 ], "errorMessage": "domain must not contain spaces or control characters" }, { "pc": [ 1107 ], "errorMessage": "domain must not end with a dot" }, { "pc": [ 1008 ], "errorMessage": "domain required" }, { "pc": [ 1012 ], "errorMessage": "domain too long (dm_ + domain must fit 64 bytes)" }, { "pc": [ 391, 583, 674, 736, 782, 902 ], "errorMessage": "index out of bounds" }, { "pc": [ 200, 361, 914 ], "errorMessage": "invalid array length header" }, { "pc": [ 208, 369, 922 ], "errorMessage": "invalid number of bytes for arc4.dynamic_array" }, { "pc": [ 567, 959 ], "errorMessage": "invalid number of bytes for arc4.static_array" }, { "pc": [ 355, 533, 559, 626, 721, 766, 888 ], "errorMessage": "invalid number of bytes for arc4.uint64" }, { "pc": [ 647, 749 ], "errorMessage": "no rotation is pending" }, { "pc": [ 740 ], "errorMessage": "only the agent may cancel" }, { "pc": [ 395 ], "errorMessage": "only the agent may update itself" }, { "pc": [ 787 ], "errorMessage": "only the controlling address may deregister" }, { "pc": [ 178 ], "errorMessage": "only the creator may delete" }, { "pc": [ 588 ], "errorMessage": "only the current address may rotate" }, { "pc": [ 654 ], "errorMessage": "only the proposed address may claim" }, { "pc": [ 330 ], "errorMessage": "payment must cover the box storage this registration adds" }, { "pc": [ 520 ], "errorMessage": "payment must cover the larger domain's box storage" }, { "pc": [ 308, 497 ], "errorMessage": "storage payment must be sent to this app" }, { "pc": [ 598 ], "errorMessage": "that is already the controlling address" }, { "pc": [ 607, 663 ], "errorMessage": "the new address already controls another agent" }, { "pc": [ 194, 347 ], "errorMessage": "transaction type is pay" }, { "pc": [ 381, 543, 579, 637, 732, 777, 898 ], "errorMessage": "unknown agent" }, { "pc": [ 316 ], "errorMessage": "you must pay for your own registration" }, { "pc": [ 505 ], "errorMessage": "you must pay for your own update" } ], "pcOffsetMethod": "none" }, "clear": { "sourceInfo": [], "pcOffsetMethod": "none" } }, "source": { "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAgMzIgOAogICAgYnl0ZWNibG9jayAweDYxNjc1ZiAweDYxNjQ1ZiAweDE1MWY3Yzc1IDB4NjQ2ZDVmIDB4MTUxZjdjNzU4MCAiYWdlbnRfY291bnQiIDB4NzA3MjVmIDB4MDY4MTAxCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBjb250cmFjdHMvaWRlbnRpdHlfcmVnaXN0cnkucHk6NDktNTAKICAgIC8vICMgSWRzIHN0YXJ0IGF0IDEgc28gdGhhdCAwIGNhbiBtZWFuICJub3QgZm91bmQiIGluIHRoZSByZXZlcnNlIGluZGV4ZXMuCiAgICAvLyBzZWxmLmFnZW50X2NvdW50ID0gVUludDY0KDApCiAgICBieXRlYyA1IC8vICJhZ2VudF9jb3VudCIKICAgIGludGNfMSAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBjb250cmFjdHMvaWRlbnRpdHlfcmVnaXN0cnkucHk6NDcKICAgIC8vIGNsYXNzIElkZW50aXR5UmVnaXN0cnkoQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX2JhcmVfcm91dGluZ0AyMAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0CiAgICBwdXNoYnl0ZXNzIDB4NjVlNGM3YjIgMHg1YjMxZTEzZiAweGVjZDdhNzdmIDB4YWM3NmI3OTUgMHg5YzgxMDAzMyAweGIxMGE2OTc3IDB4NTIwOGUxNTAgMHhjN2I5NzA2MyAweDdmZjc2MzAyIDB4ZDI3MzYwZjYgMHhhODNlY2YzOSAvLyBtZXRob2QgIm5ld19hZ2VudChwYXksc3RyaW5nKXVpbnQ2NCIsIG1ldGhvZCAidXBkYXRlX2FnZW50KHBheSx1aW50NjQsc3RyaW5nKWJvb2wiLCBtZXRob2QgImdldF9hZ2VudCh1aW50NjQpKHVpbnQ2NCxzdHJpbmcsYWRkcmVzcyx1aW50NjQsdWludDY0KSIsIG1ldGhvZCAicm90YXRlX2FkZHJlc3ModWludDY0LGFkZHJlc3MpYm9vbCIsIG1ldGhvZCAiY2xhaW1fYWRkcmVzcyh1aW50NjQpYm9vbCIsIG1ldGhvZCAiY2FuY2VsX3JvdGF0aW9uKHVpbnQ2NClib29sIiwgbWV0aG9kICJkZXJlZ2lzdGVyX2FnZW50KHVpbnQ2NClib29sIiwgbWV0aG9kICJhZ2VudF9hZGRyZXNzKHVpbnQ2NClhZGRyZXNzIiwgbWV0aG9kICJyZXNvbHZlX2J5X2RvbWFpbihzdHJpbmcpdWludDY0IiwgbWV0aG9kICJyZXNvbHZlX2J5X2FkZHJlc3MoYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgInRvdGFsX2FnZW50cygpdWludDY0IgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbmV3X2FnZW50IHVwZGF0ZV9hZ2VudCBnZXRfYWdlbnQgcm90YXRlX2FkZHJlc3MgY2xhaW1fYWRkcmVzcyBjYW5jZWxfcm90YXRpb24gZGVyZWdpc3Rlcl9hZ2VudCBhZ2VudF9hZGRyZXNzIHJlc29sdmVfYnlfZG9tYWluIHJlc29sdmVfYnlfYWRkcmVzcyB0b3RhbF9hZ2VudHMKICAgIGVycgoKbWFpbl9iYXJlX3JvdXRpbmdAMjA6CiAgICAvLyBjb250cmFjdHMvaWRlbnRpdHlfcmVnaXN0cnkucHk6NDcKICAgIC8vIGNsYXNzIElkZW50aXR5UmVnaXN0cnkoQVJDNENvbnRyYWN0KToKICAgIGludGNfMSAvLyBOb09wCiAgICBwdXNoaW50IDUgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgIHR4biBPbkNvbXBsZXRpb24KICAgIG1hdGNoIG1haW5fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAMjEgbWFpbl9kZWxldGVAMjIKICAgIGVycgoKbWFpbl9kZWxldGVAMjI6CiAgICAvLyBjb250cmFjdHMvaWRlbnRpdHlfcmVnaXN0cnkucHk6Mjk2CiAgICAvLyBAYXJjNC5iYXJlbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJEZWxldGVBcHBsaWNhdGlvbiJdKQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydAogICAgLy8gY29udHJhY3RzL2lkZW50aXR5X3JlZ2lzdHJ5LnB5OjMwOQogICAgLy8gYXNzZXJ0IFR4bi5zZW5kZXIgPT0gR2xvYmFsLmNyZWF0b3JfYWRkcmVzcywgIm9ubHkgdGhlIGNyZWF0b3IgbWF5IGRlbGV0ZSIKICAgIHR4biBTZW5kZXIKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgPT0KICAgIGFzc2VydCAvLyBvbmx5IHRoZSBjcmVhdG9yIG1heSBkZWxldGUKICAgIC8vIGNvbnRyYWN0cy9pZGVudGl0eV9yZWdpc3RyeS5weToyOTYKICAgIC8vIEBhcmM0LmJhcmVtZXRob2QoYWxsb3dfYWN0aW9ucz1bIkRlbGV0ZUFwcGxpY2F0aW9uIl0pCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgptYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDIxOgogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIHJldHVybgoKCi8vIGlkZW50aXR5X3JlZ2lzdHJ5LklkZW50aXR5UmVnaXN0cnkubmV3X2FnZW50W3JvdXRpbmddKCkgLT4gdm9pZDoKbmV3X2FnZW50OgogICAgLy8gY29udHJhY3RzL2lkZW50aXR5X3JlZ2lzdHJ5LnB5OjEwMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMCAvLyBwYXkKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBwYXkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHB1c2hpbnQgMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICAvLyBjb250cmFjdHMvaWRlbnRpdHlfcmVnaXN0cnkucHk6MTE5CiAgICAvLyBzZW5kZXIgPSBUeG4uc2VuZGVyCiAgICB0eG4gU2VuZGVyCiAgICAvLyBjb250cmFjdHMvaWRlbnRpdHlfcmVnaXN0cnkucHk6MTIxLTEyMwogICAgLy8gIyBPbmUgaWRlbnRpdHkgcGVyIGFkZHJlc3MsIGFuZCBvbmUgcGVyIGRvbWFpbi4gUmUtcmVnaXN0ZXJpbmcgc2hvdWxkIGJlCiAgICAvLyAjIGFuIGV4cGxpY2l0IHVwZGF0ZSBzbyB0aGF0IGEgdHlwbyBjYW5ub3Qgc2lsZW50bHkgb3JwaGFuIGFuIGlkLgogICAgLy8gYXNzZXJ0IHNlbmRlciBub3QgaW4gc2VsZi5ieV9hZGRyZXNzLCAiYWRkcmVzcyBhbHJlYWR5IHJlZ2lzdGVyZWQiCiAgICBieXRlY18xIC8vIDB4NjE2NDVmCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIGFkZHJlc3MgYWxyZWFkeSByZWdpc3RlcmVkCiAgICAvLyBjb250cmFjdHMvaWRlbnRpdHlfcmVnaXN0cnkucHk6MTI0CiAgICAvLyBhc3NlcnQgYWdlbnRfZG9tYWluLm5hdGl2ZSBub3QgaW4gc2VsZi5ieV9kb21haW4sICJkb21haW4gYWxyZWFkeSByZWdpc3RlcmVkIgogICAgZGlnIDIKICAgIGV4dHJhY3QgMiAwCiAgICBieXRlY18zIC8vIDB4NjQ2ZDVmCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIGRvbWFpbiBhbHJlYWR5IHJlZ2lzdGVyZWQKICAgIC8vIGNvbnRyYWN0cy9pZGVudGl0eV9yZWdpc3RyeS5weToxMjUKICAgIC8vIHNlbGYuX2Fzc2VydF9jYW5vbmljYWxfZG9tYWluKGFnZW50X2RvbWFpbi5uYXRpdmUpCiAgICBzd2FwCiAgICBjYWxsc3ViIF9hc3NlcnRfY2Fub25pY2FsX2RvbWFpbgogICAgLy8gY29udHJhY3RzL2lkZW50aXR5X3JlZ2lzdHJ5LnB5OjEyNwogICAgLy8gYXBwID0gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcwogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIGNvbnRyYWN0cy9pZGVudGl0eV9yZWdpc3RyeS5weToxMjgKICAgIC8vIG1icl9iZWZvcmUgPSBhcHAubWluX2JhbGFuY2UKICAgIGR1cAogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RNaW5CYWxhbmNlCiAgICBhc3NlcnQgLy8gYWNjb3VudCBmdW5kZWQKICAgIC8vIGNvbnRyYWN0cy9pZGVudGl0eV9yZWdpc3RyeS5weToxMzAKICAgIC8vIHNlbGYuYWdlbnRfY291bnQgKz0gMQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDUgLy8gImFnZW50X2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFnZW50X2NvdW50IGV4aXN0cwogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGJ5dGVjIDUgLy8gImFnZW50X2NvdW50IgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBjb250cmFjdHMvaWRlbnRpdHlfcmVnaXN0cnkucHk6NjEKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gY29udHJhY3RzL2lkZW50aXR5X3JlZ2lzdHJ5LnB5OjEzNQogICAgLy8gYWdlbnRfaWQ9YXJjNC5VSW50NjQoYWdlbnRfaWQpLAogICAgc3dhcAogICAgaXRvYgogICAgLy8gY29udHJhY3RzL2lkZW50aXR5X3JlZ2lzdHJ5LnB5OjEzOAogICAgLy8gcmVnaXN0ZXJlZF9hdD1hcmM0LlVJbnQ2NChub3cpLAogICAgc3dhcAogICAgaXRvYgogICAgLy8gY29udHJhY3RzL2lkZW50aXR5X3JlZ2lzdHJ5LnB5OjEzNC0xNDAKICAgIC8vIHNlbGYuYWdlbnRzW2FnZW50X2lkXSA9IEFnZW50SW5mbygKICAgIC8vICAgICBhZ2VudF9pZD1hcmM0LlVJbnQ2NChhZ2VudF9pZCksCiAgICAvLyAgICAgYWdlbnRfZG9tYWluPWFnZW50X2RvbWFpbiwKICAgIC8vICAgICBhZ2VudF9hZGRyZXNzPWFyYzQuQWRkcmVzcyhzZW5kZXIpLAogICAgLy8gICAgIHJlZ2lzdGVyZWRfYXQ9YXJjNC5VSW50NjQobm93KSwKICAgIC8vICAgICB1cGRhdGVkX2F0PWFyYzQuVUludDY0KG5vdyksCiAgICAvLyApCiAgICBkaWcgMQogICAgcHVzaGJ5dGVzIDB4MDAzYQogICAgY29uY2F0CiAgICBkaWcgNwogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHVuY292ZXIgNwogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvaWRlbnRpdHlfcmVnaXN0cnkucHk6MTM0CiAgICAvLyBzZWxmLmFnZW50c1thZ2VudF9pZF0gPSBBZ2VudEluZm8oCiAgICBieXRlY18wIC8vIDB4NjE2NzVmCiAgICBkaWcgMgogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvaWRlbnRpdHlfcmVnaXN0cnkucHk6MTM0LTE0MAogICAgLy8gc2VsZi5hZ2VudHNbYWdlbnRfaWRdID0gQWdlbnRJbmZvKAogICAgLy8gICAgIGFnZW50X2lkPWFyYzQuVUludDY0KGFnZW50X2lkKSwKICAgIC8vICAgICBhZ2VudF9kb21haW49YWdlbnRfZG9tYWluLAogICAgLy8gICAgIGFnZW50X2FkZHJlc3M9YXJjNC5BZGRyZXNzKHNlbmRlciksCiAgICAvLyAgICAgcmVnaXN0ZXJlZF9hdD1hcmM0LlVJbnQ2NChub3cpLAogICAgLy8gICAgIHVwZGF0ZWRfYXQ9YXJjNC5VSW50NjQobm93KSwKICAgIC8vICkKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBjb250cmFjdHMvaWRlbnRpdHlfcmVnaXN0cnkucHk6MTQxCiAgICAvLyBzZWxmLmJ5X2RvbWFpblthZ2VudF9kb21haW4ubmF0aXZlXSA9IGFnZW50X2lkCiAgICB1bmNvdmVyIDMKICAgIGRpZyAxCiAgICBib3hfcHV0CiAgICAvLyBjb250cmFjdHMvaWRlbnRpdHlfcmVnaXN0cnkucHk6MTQyCiAgICAvLyBzZWxmLmJ5X2FkZHJlc3Nbc2VuZGVyXSA9IGFnZW50X2lkCiAgICB1bmNvdmVyIDMKICAgIGRpZyAxCiAgICBib3hfcHV0CiAgICAvLyBjb250cmFjdHMvaWRlbnRpdHlfcmVnaXN0cnkucHk6MTQ0LTE0NQogICAgLy8gIyBUaGUgdGhyZWUgYm94ZXMgbm93IGV4aXN0LCBzbyBhcHAubWluX2JhbGFuY2UgcmVmbGVjdHMgdGhlaXIgY29zdC4KICAgIC8vIGFzc2VydCBtYnIucmVjZWl2ZXIgPT0gYXBwLCAic3RvcmFnZSBwYXltZW50IG11c3QgYmUgc2VudCB0byB0aGlzIGFwcCIKICAgIGRpZyA0CiAgICBndHhucyBSZWNlaXZlcgogICAgZGlnIDMKICAgID09CiAgICBhc3NlcnQgLy8gc3RvcmFnZSBwYXltZW50IG11c3QgYmUgc2VudCB0byB0aGlzIGFwcAogICAgLy8gY29udHJhY3RzL2lkZW50aXR5X3JlZ2lzdHJ5LnB5OjE0NgogICAgLy8gYXNzZXJ0IG1ici5zZW5kZXIgPT0gc2VuZGVyLCAieW91IG11c3QgcGF5IGZvciB5b3VyIG93biByZWdpc3RyYXRpb24iCiAgICBkaWcgNAogICAgZ3R4bnMgU2VuZGVyCiAgICB1bmNvdmVyIDQKICAgID09CiAgICBhc3NlcnQgLy8geW91IG11c3QgcGF5IGZvciB5b3VyIG93biByZWdpc3RyYXRpb24KICAgIC8vIGNvbnRyYWN0cy9pZGVudGl0eV9yZWdpc3RyeS5weToxNDgKICAgIC8vIG1ici5hbW91bnQgPj0gYXBwLm1pbl9iYWxhbmNlIC0gbWJyX2JlZm9yZQogICAgdW5jb3ZlciAzCiAgICBndHhucyBBbW91bnQKICAgIHVuY292ZXIgMwogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RNaW5CYWxhbmNlCiAgICBhc3NlcnQgLy8gYWNjb3VudCBmdW5kZWQKICAgIHVuY292ZXIgMwogICAgLQogICAgPj0KICAgIC8vIGNvbnRyYWN0cy9pZGVudGl0eV9yZWdpc3RyeS5weToxNDctMTQ5CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIG1ici5hbW91bnQgPj0gYXBwLm1pbl9iYWxhbmNlIC0gbWJyX2JlZm9yZQogICAgLy8gKSwgInBheW1lbnQgbXVzdCBjb3ZlciB0aGUgYm94IHN0b3JhZ2UgdGhpcyByZWdpc3RyYXRpb24gYWRkcyIKICAgIGFzc2VydCAvLyBwYXltZW50IG11c3QgY292ZXIgdGhlIGJveCBzdG9yYWdlIHRoaXMgcmVnaXN0cmF0aW9uIGFkZHMKICAgIC8vIGNvbnRyYWN0cy9pZGVudGl0eV9yZWdpc3RyeS5weToxMDMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgYnl0ZWNfMiAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIGlkZW50aXR5X3JlZ2lzdHJ5LklkZW50aXR5UmVnaXN0cnkudXBkYXRlX2FnZW50W3JvdXRpbmddKCkgLT4gdm9pZDoKdXBkYXRlX2FnZW50OgogICAgLy8gY29udHJhY3RzL2lkZW50aXR5X3JlZ2lzdHJ5LnB5OjE1MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIGR1cG4gMgogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMCAvLyBwYXkKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBwYXkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHB1c2hpbnQgMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICAvLyBjb250cmFjdHMvaWRlbnRpdHlfcmVnaXN0cnkucHk6MTYyCiAgICAvLyBhaWQgPSBhZ2VudF9pZC5uYXRpdmUKICAgIHN3YXAKICAgIGJ0b2kKICAgIC8vIGNvbnRyYWN0cy9pZGVudGl0eV9yZWdpc3RyeS5weToxNjMKICAgIC8vIGFzc2VydCBhaWQgaW4gc2VsZi5hZ2VudHMsICJ1bmtub3duIGFnZW50IgogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDYxNjc1ZgogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyB1bmtub3duIGFnZW50CiAgICAvLyBjb250cmFjdHMvaWRlbnRpdHlfcmVnaXN0cnkucHk6MTY1CiAgICAvLyBpbmZvID0gc2VsZi5hZ2VudHNbYWlkXS5jb3B5KCkKICAgIGR1cAogICAgYm94X2dldAogICAgcG9wCiAgICBjb3ZlciAyCiAgICAvLyBjb250cmFjdHMvaWRlbnRpdHlfcmVnaXN0cnkucHk6MTY1LTE2NgogICAgLy8gaW5mbyA9IHNlbGYuYWdlbnRzW2FpZF0uY29weSgpCiAgICAvLyBhc3NlcnQgaW5mby5hZ2VudF9hZGRyZXNzLm5hdGl2ZSA9PSBUeG4uc2VuZGVyLCAib25seSB0aGUgYWdlbnQgbWF5IHVwZGF0ZSBpdHNlbGYiCiAgICBkdXAKICAgIHB1c2hpbnQgMTAKICAgIGludGNfMiAvLyAzMgogICAgYm94X2V4dHJhY3QgLy8gb24gZXJyb3I6IGluZGV4IG91dCBvZiBib3VuZHMKICAgIC8vIGNvbnRyYWN0cy9pZGVudGl0eV9yZWdpc3RyeS5weToxNjYKICAgIC8vIGFzc2VydCBpbmZvLmFnZW50X2FkZHJlc3MubmF0aXZlID09IFR4bi5zZW5kZXIsICJvbmx5IHRoZSBhZ2VudCBtYXkgdXBkYXRlIGl0c2VsZiIKICAgIHR4biBTZW5kZXIKICAgID09CiAgICBhc3NlcnQgLy8gb25seSB0aGUgYWdlbnQgbWF5IHVwZGF0ZSBpdHNlbGYKICAgIC8vIGNvbnRyYWN0cy9pZGVudGl0eV9yZWdpc3RyeS5weToxNjcKICAgIC8vIHNlbGYuX2Fzc2VydF9jYW5vbmljYWxfZG9tYWluKG5ld19kb21haW4ubmF0aXZlKQogICAgZGlnIDMKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGNhbGxzdWIgX2Fzc2VydF9jYW5vbmljYWxfZG9tYWluCiAgICAvLyBjb250cmFjdHMvaWRlbnRpdHlfcmVnaXN0cnkucHk6MTY4CiAgICAvLyBhc3NlcnQgbmV3X2RvbWFpbi5uYXRpdmUgbm90IGluIHNlbGYuYnlfZG9tYWluLCAiZG9tYWluIGFscmVhZHkgcmVnaXN0ZXJlZCIKICAgIGJ5dGVjXzMgLy8gMHg2NDZkNWYKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBkb21haW4gYWxyZWFkeSByZWdpc3RlcmVkCiAgICAvLyBjb250cmFjdHMvaWRlbnRpdHlfcmVnaXN0cnkucHk6MTcwCiAgICAvLyBhcHAgPSBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgLy8gY29udHJhY3RzL2lkZW50aXR5X3JlZ2lzdHJ5LnB5OjE3MQogICAgLy8gbWJyX2JlZm9yZSA9IGFwcC5taW5fYmFsYW5jZQogICAgZHVwCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdE1pbkJhbGFuY2UKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgNwogICAgY292ZXIgOQogICAgYXNzZXJ0IC8vIGFjY291bnQgZnVuZGVkCiAgICAvLyBjb250cmFjdHMvaWRlbnRpdHlfcmVnaXN0cnkucHk6MTczLTE3NQogICAgLy8gIyBEcm9wIHRoZSBzdGFsZSByZXZlcnNlIGluZGV4IG9yIHRoZSBvbGQgZG9tYWluIHdvdWxkIGtlZXAgcmVzb2x2aW5nIHRvCiAgICAvLyAjIHRoaXMgYWdlbnQgZm9yZXZlci4KICAgIC8vIGRlbCBzZWxmLmJ5X2RvbWFpbltpbmZvLmFnZW50X2RvbWFpbi5uYXRpdmVdCiAgICBkaWcgMgogICAgcHVzaGludHMgNTggMgogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIHB1c2hpbnQgMgogICAgKwogICAgZGlnIDMKICAgIHB1c2hpbnQgNTgKICAgIHVuY292ZXIgMgogICAgYm94X2V4dHJhY3QKICAgIGV4dHJhY3QgMiAwCiAgICBieXRlY18zIC8vIDB4NjQ2ZDVmCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gY29udHJhY3RzL2lkZW50aXR5X3JlZ2lzdHJ5LnB5OjE3NwogICAgLy8gaW5mby5hZ2VudF9kb21haW4gPSBuZXdfZG9tYWluCiAgICBkaWcgNAogICAgaW50Y18zIC8vIDgKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDUKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIGV4dHJhY3QzCiAgICB1bmNvdmVyIDYKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL2lkZW50aXR5X3JlZ2lzdHJ5LnB5OjYxCiAgICAvLyByZXR1cm4gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIC8vIGNvbnRyYWN0cy9pZGVudGl0eV9yZWdpc3RyeS5weToxNzgKICAgIC8vIGluZm8udXBkYXRlZF9hdCA9IGFyYzQuVUludDY0KHNlbGYuX25vdygpKQogICAgaXRvYgogICAgcmVwbGFjZTIgNTAKICAgIC8vIGNvbnRyYWN0cy9pZGVudGl0eV9yZWdpc3RyeS5weToxNzkKICAgIC8vIHNlbGYuYWdlbnRzW2FpZF0gPSBpbmZvLmNvcHkoKQogICAgZGlnIDMKICAgIGJveF9kZWwKICAgIHBvcAogICAgdW5jb3ZlciAzCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBjb250cmFjdHMvaWRlbnRpdHlfcmVnaXN0cnkucHk6MTgwCiAgICAvLyBzZWxmLmJ5X2RvbWFpbltuZXdfZG9tYWluLm5hdGl2ZV0gPSBhaWQKICAgIHN3YXAKICAgIHVuY292ZXIgMgogICAgYm94X3B1dAogICAgLy8gY29udHJhY3RzL2lkZW50aXR5X3JlZ2lzdHJ5LnB5OjE4MgogICAgLy8gbWJyX2FmdGVyID0gYXBwLm1pbl9iYWxhbmNlCiAgICBkdXAKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0TWluQmFsYW5jZQogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAzCiAgICBjb3ZlciA1CiAgICBhc3NlcnQgLy8gYWNjb3VudCBmdW5kZWQKICAgIC8vIGNvbnRyYWN0cy9pZGVudGl0eV9yZWdpc3RyeS5weToxODMKICAgIC8vIGFzc2VydCBtYnIucmVjZWl2ZXIgPT0gYXBwLCAic3RvcmFnZSBwYXltZW50IG11c3QgYmUgc2VudCB0byB0aGlzIGFwcCIKICAgIGRpZyAzCiAgICBndHhucyBSZWNlaXZlcgogICAgPT0KICAgIGFzc2VydCAvLyBzdG9yYWdlIHBheW1lbnQgbXVzdCBiZSBzZW50IHRvIHRoaXMgYXBwCiAgICAvLyBjb250cmFjdHMvaWRlbnRpdHlfcmVnaXN0cnkucHk6MTg0CiAgICAvLyBhc3NlcnQgbWJyLnNlbmRlciA9PSBUeG4uc2VuZGVyLCAieW91IG11c3QgcGF5IGZvciB5b3VyIG93biB1cGRhdGUiCiAgICB1bmNvdmVyIDIKICAgIGd0eG5zIFNlbmRlcgogICAgdHhuIFNlbmRlcgogICAgPT0KICAgIGFzc2VydCAvLyB5b3UgbXVzdCBwYXkgZm9yIHlvdXIgb3duIHVwZGF0ZQogICAgLy8gY29udHJhY3RzL2lkZW50aXR5X3JlZ2lzdHJ5LnB5OjE4NQogICAgLy8gaWYgbWJyX2FmdGVyID4gbWJyX2JlZm9yZToKICAgIDwKICAgIGJ6IHVwZGF0ZV9hZ2VudF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIGNvbnRyYWN0cy9pZGVudGl0eV9yZWdpc3RyeS5weToxODcKICAgIC8vIG1ici5hbW91bnQgPj0gbWJyX2FmdGVyIC0gbWJyX2JlZm9yZQogICAgZGlnIDIKICAgIGd0eG5zIEFtb3VudAogICAgZGlnIDEKICAgIGRpZyAzCiAgICAtCiAgICA+PQogICAgLy8gY29udHJhY3RzL2lkZW50aXR5X3JlZ2lzdHJ5LnB5OjE4Ni0xODgKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgbWJyLmFtb3VudCA+PSBtYnJfYWZ0ZXIgLSBtYnJfYmVmb3JlCiAgICAvLyApLCAicGF5bWVudCBtdXN0IGNvdmVyIHRoZSBsYXJnZXIgZG9tYWluJ3MgYm94IHN0b3JhZ2UiCiAgICBhc3NlcnQgLy8gcGF5bWVudCBtdXN0IGNvdmVyIHRoZSBsYXJnZXIgZG9tYWluJ3MgYm94IHN0b3JhZ2UKCnVwZGF0ZV9hZ2VudF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBjb250cmFjdHMvaWRlbnRpdHlfcmVnaXN0cnkucHk6MTUzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGJ5dGVjIDQgLy8gMHgxNTFmN2M3NTgwCiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBpZGVudGl0eV9yZWdpc3RyeS5JZGVudGl0eVJlZ2lzdHJ5LmdldF9hZ2VudFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9hZ2VudDoKICAgIC8vIGNvbnRyYWN0cy9pZGVudGl0eV9yZWdpc3RyeS5weToxOTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgLy8gY29udHJhY3RzL2lkZW50aXR5X3JlZ2lzdHJ5LnB5OjE5NAogICAgLy8gYWlkID0gYWdlbnRfaWQubmF0aXZlCiAgICBidG9pCiAgICAvLyBjb250cmFjdHMvaWRlbnRpdHlfcmVnaXN0cnkucHk6MTk1CiAgICAvLyBhc3NlcnQgYWlkIGluIHNlbGYuYWdlbnRzLCAidW5rbm93biBhZ2VudCIKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHg2MTY3NWYKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyB1bmtub3duIGFnZW50CiAgICAvLyBjb250cmFjdHMvaWRlbnRpdHlfcmVnaXN0cnkucHk6MTk2CiAgICAvLyByZXR1cm4gc2VsZi5hZ2VudHNbYWlkXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBjb250cmFjdHMvaWRlbnRpdHlfcmVnaXN0cnkucHk6MTkyCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzIgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBpZGVudGl0eV9yZWdpc3RyeS5JZGVudGl0eVJlZ2lzdHJ5LnJvdGF0ZV9hZGRyZXNzW3JvdXRpbmddKCkgLT4gdm9pZDoKcm90YXRlX2FkZHJlc3M6CiAgICAvLyBjb250cmFjdHMvaWRlbnRpdHlfcmVnaXN0cnkucHk6MTk4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gY29udHJhY3RzL2lkZW50aXR5X3JlZ2lzdHJ5LnB5OjIxNAogICAgLy8gYWlkID0gYWdlbnRfaWQubmF0aXZlCiAgICBzd2FwCiAgICBidG9pCiAgICAvLyBjb250cmFjdHMvaWRlbnRpdHlfcmVnaXN0cnkucHk6MjE1CiAgICAvLyBhc3NlcnQgYWlkIGluIHNlbGYuYWdlbnRzLCAidW5rbm93biBhZ2VudCIKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHg2MTY3NWYKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gdW5rbm93biBhZ2VudAogICAgLy8gY29udHJhY3RzL2lkZW50aXR5X3JlZ2lzdHJ5LnB5OjIxNi0yMTcKICAgIC8vIGluZm8gPSBzZWxmLmFnZW50c1thaWRdLmNvcHkoKQogICAgLy8gYXNzZXJ0IGluZm8uYWdlbnRfYWRkcmVzcy5uYXRpdmUgPT0gVHhuLnNlbmRlciwgIm9ubHkgdGhlIGN1cnJlbnQgYWRkcmVzcyBtYXkgcm90YXRlIgogICAgcHVzaGludCAxMAogICAgaW50Y18yIC8vIDMyCiAgICBib3hfZXh0cmFjdCAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgLy8gY29udHJhY3RzL2lkZW50aXR5X3JlZ2lzdHJ5LnB5OjIxNwogICAgLy8gYXNzZXJ0IGluZm8uYWdlbnRfYWRkcmVzcy5uYXRpdmUgPT0gVHhuLnNlbmRlciwgIm9ubHkgdGhlIGN1cnJlbnQgYWRkcmVzcyBtYXkgcm90YXRlIgogICAgZHVwCiAgICB0eG4gU2VuZGVyCiAgICA9PQogICAgYXNzZXJ0IC8vIG9ubHkgdGhlIGN1cnJlbnQgYWRkcmVzcyBtYXkgcm90YXRlCiAgICAvLyBjb250cmFjdHMvaWRlbnRpdHlfcmVnaXN0cnkucHk6MjIwCiAgICAvLyBhc3NlcnQgbmV3X2FkZHIgIT0gR2xvYmFsLnplcm9fYWRkcmVzcywgImNhbm5vdCByb3RhdGUgdG8gdGhlIHplcm8gYWRkcmVzcyIKICAgIGRpZyAyCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBhc3NlcnQgLy8gY2Fubm90IHJvdGF0ZSB0byB0aGUgemVybyBhZGRyZXNzCiAgICAvLyBjb250cmFjdHMvaWRlbnRpdHlfcmVnaXN0cnkucHk6MjIxCiAgICAvLyBhc3NlcnQgbmV3X2FkZHIgIT0gaW5mby5hZ2VudF9hZGRyZXNzLm5hdGl2ZSwgInRoYXQgaXMgYWxyZWFkeSB0aGUgY29udHJvbGxpbmcgYWRkcmVzcyIKICAgIGRpZyAyCiAgICAhPQogICAgYXNzZXJ0IC8vIHRoYXQgaXMgYWxyZWFkeSB0aGUgY29udHJvbGxpbmcgYWRkcmVzcwogICAgLy8gY29udHJhY3RzL2lkZW50aXR5X3JlZ2lzdHJ5LnB5OjIyMgogICAgLy8gYXNzZXJ0IG5ld19hZGRyIG5vdCBpbiBzZWxmLmJ5X2FkZHJlc3MsICJ0aGUgbmV3IGFkZHJlc3MgYWxyZWFkeSBjb250cm9scyBhbm90aGVyIGFnZW50IgogICAgYnl0ZWNfMSAvLyAweDYxNjQ1ZgogICAgZGlnIDIKICAgIGNvbmNhdAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gdGhlIG5ldyBhZGRyZXNzIGFscmVhZHkgY29udHJvbHMgYW5vdGhlciBhZ2VudAogICAgLy8gY29udHJhY3RzL2lkZW50aXR5X3JlZ2lzdHJ5LnB5OjIyNAogICAgLy8gc2VsZi5wZW5kaW5nW2FpZF0gPSBuZXdfYWRkcgogICAgYnl0ZWMgNiAvLyAweDcwNzI1ZgogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBjb250cmFjdHMvaWRlbnRpdHlfcmVnaXN0cnkucHk6MTk4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGJ5dGVjIDQgLy8gMHgxNTFmN2M3NTgwCiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBpZGVudGl0eV9yZWdpc3RyeS5JZGVudGl0eVJlZ2lzdHJ5LmNsYWltX2FkZHJlc3Nbcm91dGluZ10oKSAtPiB2b2lkOgpjbGFpbV9hZGRyZXNzOgogICAgLy8gY29udHJhY3RzL2lkZW50aXR5X3JlZ2lzdHJ5LnB5OjIyNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICAvLyBjb250cmFjdHMvaWRlbnRpdHlfcmVnaXN0cnkucHk6MjMxCiAgICAvLyBhaWQgPSBhZ2VudF9pZC5uYXRpdmUKICAgIGJ0b2kKICAgIC8vIGNvbnRyYWN0cy9pZGVudGl0eV9yZWdpc3RyeS5weToyMzIKICAgIC8vIGFzc2VydCBhaWQgaW4gc2VsZi5hZ2VudHMsICJ1bmtub3duIGFnZW50IgogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDYxNjc1ZgogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyB1bmtub3duIGFnZW50CiAgICAvLyBjb250cmFjdHMvaWRlbnRpdHlfcmVnaXN0cnkucHk6MjMzCiAgICAvLyBhc3NlcnQgYWlkIGluIHNlbGYucGVuZGluZywgIm5vIHJvdGF0aW9uIGlzIHBlbmRpbmciCiAgICBieXRlYyA2IC8vIDB4NzA3MjVmCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIG5vIHJvdGF0aW9uIGlzIHBlbmRpbmcKICAgIC8vIGNvbnRyYWN0cy9pZGVudGl0eV9yZWdpc3RyeS5weToyMzQKICAgIC8vIGFzc2VydCBzZWxmLnBlbmRpbmdbYWlkXSA9PSBUeG4uc2VuZGVyLCAib25seSB0aGUgcHJvcG9zZWQgYWRkcmVzcyBtYXkgY2xhaW0iCiAgICBkdXAKICAgIGJveF9nZXQKICAgIHBvcAogICAgdHhuIFNlbmRlcgogICAgPT0KICAgIGFzc2VydCAvLyBvbmx5IHRoZSBwcm9wb3NlZCBhZGRyZXNzIG1heSBjbGFpbQogICAgLy8gY29udHJhY3RzL2lkZW50aXR5X3JlZ2lzdHJ5LnB5OjIzNQogICAgLy8gYXNzZXJ0IFR4bi5zZW5kZXIgbm90IGluIHNlbGYuYnlfYWRkcmVzcywgInRoZSBuZXcgYWRkcmVzcyBhbHJlYWR5IGNvbnRyb2xzIGFub3RoZXIgYWdlbnQiCiAgICBieXRlY18xIC8vIDB4NjE2NDVmCiAgICB0eG4gU2VuZGVyCiAgICBjb25jYXQKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIHRoZSBuZXcgYWRkcmVzcyBhbHJlYWR5IGNvbnRyb2xzIGFub3RoZXIgYWdlbnQKICAgIC8vIGNvbnRyYWN0cy9pZGVudGl0eV9yZWdpc3RyeS5weToyMzcKICAgIC8vIGluZm8gPSBzZWxmLmFnZW50c1thaWRdLmNvcHkoKQogICAgZGlnIDEKICAgIGJveF9nZXQKICAgIHBvcAogICAgc3dhcAogICAgLy8gY29udHJhY3RzL2lkZW50aXR5X3JlZ2lzdHJ5LnB5OjIzOC0yNDEKICAgIC8vICMgVGhlIHJldmVyc2UgaW5kZXggbW92ZXMgd2l0aCBjb250cm9sLCBvciB0aGUgT0xEIGFkZHJlc3Mgd291bGQga2VlcAogICAgLy8gIyByZXNvbHZpbmcgdG8gdGhpcyBhZ2VudCBhbmQgYSBwYXllciBjaGVja2luZyAiZG9lcyB0aGUgY2FyZCdzIGFkZHJlc3MKICAgIC8vICMgbWF0Y2ggdGhlIHJlZ2lzdHJ5IiB3b3VsZCBzdGlsbCBtYXRjaCBhIGtleSB0aGF0IG5vIGxvbmdlciBjb250cm9scyBpdC4KICAgIC8vIGRlbCBzZWxmLmJ5X2FkZHJlc3NbaW5mby5hZ2VudF9hZGRyZXNzLm5hdGl2ZV0KICAgIGRpZyAyCiAgICBwdXNoaW50IDEwCiAgICBpbnRjXzIgLy8gMzIKICAgIGJveF9leHRyYWN0IC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBieXRlY18xIC8vIDB4NjE2NDVmCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gY29udHJhY3RzL2lkZW50aXR5X3JlZ2lzdHJ5LnB5OjI0MgogICAgLy8gaW5mby5hZ2VudF9hZGRyZXNzID0gYXJjNC5BZGRyZXNzKFR4bi5zZW5kZXIpCiAgICB0eG4gU2VuZGVyCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIHJlcGxhY2UyIDEwCiAgICAvLyBjb250cmFjdHMvaWRlbnRpdHlfcmVnaXN0cnkucHk6NjEKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gY29udHJhY3RzL2lkZW50aXR5X3JlZ2lzdHJ5LnB5OjI0MwogICAgLy8gaW5mby51cGRhdGVkX2F0ID0gYXJjNC5VSW50NjQoc2VsZi5fbm93KCkpCiAgICBpdG9iCiAgICByZXBsYWNlMiA1MAogICAgLy8gY29udHJhY3RzL2lkZW50aXR5X3JlZ2lzdHJ5LnB5OjI0NAogICAgLy8gc2VsZi5hZ2VudHNbYWlkXSA9IGluZm8uY29weSgpCiAgICBkaWcgMgogICAgYm94X2RlbAogICAgcG9wCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIGNvbnRyYWN0cy9pZGVudGl0eV9yZWdpc3RyeS5weToyNDUKICAgIC8vIHNlbGYuYnlfYWRkcmVzc1tUeG4uc2VuZGVyXSA9IGFpZAogICAgYnl0ZWNfMSAvLyAweDYxNjQ1ZgogICAgdHhuIFNlbmRlcgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGJveF9wdXQKICAgIC8vIGNvbnRyYWN0cy9pZGVudGl0eV9yZWdpc3RyeS5weToyNDYKICAgIC8vIGRlbCBzZWxmLnBlbmRpbmdbYWlkXQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBjb250cmFjdHMvaWRlbnRpdHlfcmVnaXN0cnkucHk6MjI3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGJ5dGVjIDQgLy8gMHgxNTFmN2M3NTgwCiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBpZGVudGl0eV9yZWdpc3RyeS5JZGVudGl0eVJlZ2lzdHJ5LmNhbmNlbF9yb3RhdGlvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CmNhbmNlbF9yb3RhdGlvbjoKICAgIC8vIGNvbnRyYWN0cy9pZGVudGl0eV9yZWdpc3RyeS5weToyNDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgLy8gY29udHJhY3RzL2lkZW50aXR5X3JlZ2lzdHJ5LnB5OjI1MgogICAgLy8gYWlkID0gYWdlbnRfaWQubmF0aXZlCiAgICBidG9pCiAgICAvLyBjb250cmFjdHMvaWRlbnRpdHlfcmVnaXN0cnkucHk6MjUzCiAgICAvLyBhc3NlcnQgYWlkIGluIHNlbGYuYWdlbnRzLCAidW5rbm93biBhZ2VudCIKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHg2MTY3NWYKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gdW5rbm93biBhZ2VudAogICAgLy8gY29udHJhY3RzL2lkZW50aXR5X3JlZ2lzdHJ5LnB5OjI1NAogICAgLy8gYXNzZXJ0IHNlbGYuYWdlbnRzW2FpZF0uYWdlbnRfYWRkcmVzcy5uYXRpdmUgPT0gVHhuLnNlbmRlciwgIm9ubHkgdGhlIGFnZW50IG1heSBjYW5jZWwiCiAgICBwdXNoaW50IDEwCiAgICBpbnRjXzIgLy8gMzIKICAgIGJveF9leHRyYWN0IC8vIG9uIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCiAgICB0eG4gU2VuZGVyCiAgICA9PQogICAgYXNzZXJ0IC8vIG9ubHkgdGhlIGFnZW50IG1heSBjYW5jZWwKICAgIC8vIGNvbnRyYWN0cy9pZGVudGl0eV9yZWdpc3RyeS5weToyNTUKICAgIC8vIGFzc2VydCBhaWQgaW4gc2VsZi5wZW5kaW5nLCAibm8gcm90YXRpb24gaXMgcGVuZGluZyIKICAgIGJ5dGVjIDYgLy8gMHg3MDcyNWYKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBubyByb3RhdGlvbiBpcyBwZW5kaW5nCiAgICAvLyBjb250cmFjdHMvaWRlbnRpdHlfcmVnaXN0cnkucHk6MjU2CiAgICAvLyBkZWwgc2VsZi5wZW5kaW5nW2FpZF0KICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gY29udHJhY3RzL2lkZW50aXR5X3JlZ2lzdHJ5LnB5OjI0OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBieXRlYyA0IC8vIDB4MTUxZjdjNzU4MAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gaWRlbnRpdHlfcmVnaXN0cnkuSWRlbnRpdHlSZWdpc3RyeS5kZXJlZ2lzdGVyX2FnZW50W3JvdXRpbmddKCkgLT4gdm9pZDoKZGVyZWdpc3Rlcl9hZ2VudDoKICAgIHB1c2hieXRlcyAiIgogICAgLy8gY29udHJhY3RzL2lkZW50aXR5X3JlZ2lzdHJ5LnB5OjI1OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICAvLyBjb250cmFjdHMvaWRlbnRpdHlfcmVnaXN0cnkucHk6MjczCiAgICAvLyBhaWQgPSBhZ2VudF9pZC5uYXRpdmUKICAgIGJ0b2kKICAgIC8vIGNvbnRyYWN0cy9pZGVudGl0eV9yZWdpc3RyeS5weToyNzQKICAgIC8vIGFzc2VydCBhaWQgaW4gc2VsZi5hZ2VudHMsICJ1bmtub3duIGFnZW50IgogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDYxNjc1ZgogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyB1bmtub3duIGFnZW50CiAgICAvLyBjb250cmFjdHMvaWRlbnRpdHlfcmVnaXN0cnkucHk6Mjc1LTI3NgogICAgLy8gaW5mbyA9IHNlbGYuYWdlbnRzW2FpZF0uY29weSgpCiAgICAvLyBhc3NlcnQgaW5mby5hZ2VudF9hZGRyZXNzLm5hdGl2ZSA9PSBUeG4uc2VuZGVyLCAib25seSB0aGUgY29udHJvbGxpbmcgYWRkcmVzcyBtYXkgZGVyZWdpc3RlciIKICAgIGR1cAogICAgcHVzaGludCAxMAogICAgaW50Y18yIC8vIDMyCiAgICBib3hfZXh0cmFjdCAvLyBvbiBlcnJvcjogaW5kZXggb3V0IG9mIGJvdW5kcwogICAgLy8gY29udHJhY3RzL2lkZW50aXR5X3JlZ2lzdHJ5LnB5OjI3NgogICAgLy8gYXNzZXJ0IGluZm8uYWdlbnRfYWRkcmVzcy5uYXRpdmUgPT0gVHhuLnNlbmRlciwgIm9ubHkgdGhlIGNvbnRyb2xsaW5nIGFkZHJlc3MgbWF5IGRlcmVnaXN0ZXIiCiAgICBkdXAKICAgIHR4biBTZW5kZXIKICAgID09CiAgICBhc3NlcnQgLy8gb25seSB0aGUgY29udHJvbGxpbmcgYWRkcmVzcyBtYXkgZGVyZWdpc3RlcgogICAgLy8gY29udHJhY3RzL2lkZW50aXR5X3JlZ2lzdHJ5LnB5OjI3OAogICAgLy8gYXBwID0gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcwogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIGR1cAogICAgY292ZXIgNAogICAgLy8gY29udHJhY3RzL2lkZW50aXR5X3JlZ2lzdHJ5LnB5OjI3OQogICAgLy8gbWJyX2JlZm9yZSA9IGFwcC5taW5fYmFsYW5jZQogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RNaW5CYWxhbmNlCiAgICBzd2FwCiAgICBjb3ZlciA0CiAgICBhc3NlcnQgLy8gYWNjb3VudCBmdW5kZWQKICAgIC8vIGNvbnRyYWN0cy9pZGVudGl0eV9yZWdpc3RyeS5weToyODEKICAgIC8vIGRlbCBzZWxmLmJ5X2RvbWFpbltpbmZvLmFnZW50X2RvbWFpbi5uYXRpdmVdCiAgICBkaWcgMQogICAgcHVzaGludHMgNTggMgogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIHB1c2hpbnQgMgogICAgKwogICAgZGlnIDIKICAgIHB1c2hpbnQgNTgKICAgIHVuY292ZXIgMgogICAgYm94X2V4dHJhY3QKICAgIGV4dHJhY3QgMiAwCiAgICBieXRlY18zIC8vIDB4NjQ2ZDVmCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gY29udHJhY3RzL2lkZW50aXR5X3JlZ2lzdHJ5LnB5OjI4MgogICAgLy8gZGVsIHNlbGYuYnlfYWRkcmVzc1tpbmZvLmFnZW50X2FkZHJlc3MubmF0aXZlXQogICAgYnl0ZWNfMSAvLyAweDYxNjQ1ZgogICAgc3dhcAogICAgY29uY2F0CiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIGNvbnRyYWN0cy9pZGVudGl0eV9yZWdpc3RyeS5weToyODMKICAgIC8vIGRlbCBzZWxmLmFnZW50c1thaWRdCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIGNvbnRyYWN0cy9pZGVudGl0eV9yZWdpc3RyeS5weToyODQtMjg1CiAgICAvLyAjIEEgcHJvcG9zZWQtYnV0LXVuY2xhaW1lZCByb3RhdGlvbiB3b3VsZCBvdGhlcndpc2Ugb3V0bGl2ZSB0aGUgYWdlbnQuCiAgICAvLyBpZiBhaWQgaW4gc2VsZi5wZW5kaW5nOgogICAgYnl0ZWMgNiAvLyAweDcwNzI1ZgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogZGVyZWdpc3Rlcl9hZ2VudF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIGNvbnRyYWN0cy9pZGVudGl0eV9yZWdpc3RyeS5weToyODYKICAgIC8vIGRlbCBzZWxmLnBlbmRpbmdbYWlkXQogICAgZGlnIDIKICAgIGJveF9kZWwKICAgIHBvcAoKZGVyZWdpc3Rlcl9hZ2VudF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBjb250cmFjdHMvaWRlbnRpdHlfcmVnaXN0cnkucHk6Mjg4LTI5MAogICAgLy8gIyBSZXR1cm4gdGhlIHN0b3JhZ2UgZGVwb3NpdCBuZXdfYWdlbnQgdG9vay4gVGhlIGJveGVzIGFyZSBnb25lLCBzbwogICAgLy8gIyBtaW5fYmFsYW5jZSBoYXMgZHJvcHBlZCBieSB3aGF0IHJlZ2lzdHJhdGlvbiAoYW5kIGFueSBwZW5kaW5nKSBoZWxkLgogICAgLy8gZnJlZWQgPSBtYnJfYmVmb3JlIC0gYXBwLm1pbl9iYWxhbmNlCiAgICBzd2FwCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdE1pbkJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IGZ1bmRlZAogICAgLQogICAgZHVwCiAgICBidXJ5IDMKICAgIC8vIGNvbnRyYWN0cy9pZGVudGl0eV9yZWdpc3RyeS5weToyOTEKICAgIC8vIGlmIGZyZWVkID4gMDoKICAgIGJ6IGRlcmVnaXN0ZXJfYWdlbnRfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBjb250cmFjdHMvaWRlbnRpdHlfcmVnaXN0cnkucHk6MjkyCiAgICAvLyBpdHhuLlBheW1lbnQocmVjZWl2ZXI9VHhuLnNlbmRlciwgYW1vdW50PWZyZWVkLCBmZWU9MCkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIHR4biBTZW5kZXIKICAgIGRpZyAyCiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgaW50Y18wIC8vIHBheQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18xIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAoKZGVyZWdpc3Rlcl9hZ2VudF9hZnRlcl9pZl9lbHNlQDY6CiAgICAvLyBjb250cmFjdHMvaWRlbnRpdHlfcmVnaXN0cnkucHk6MjU5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGJ5dGVjIDQgLy8gMHgxNTFmN2M3NTgwCiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBpZGVudGl0eV9yZWdpc3RyeS5JZGVudGl0eVJlZ2lzdHJ5LmFnZW50X2FkZHJlc3Nbcm91dGluZ10oKSAtPiB2b2lkOgphZ2VudF9hZGRyZXNzOgogICAgLy8gY29udHJhY3RzL2lkZW50aXR5X3JlZ2lzdHJ5LnB5OjMxMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICAvLyBjb250cmFjdHMvaWRlbnRpdHlfcmVnaXN0cnkucHk6MzI0CiAgICAvLyBhaWQgPSBhZ2VudF9pZC5uYXRpdmUKICAgIGJ0b2kKICAgIC8vIGNvbnRyYWN0cy9pZGVudGl0eV9yZWdpc3RyeS5weTozMjUKICAgIC8vIGFzc2VydCBhaWQgaW4gc2VsZi5hZ2VudHMsICJ1bmtub3duIGFnZW50IgogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDYxNjc1ZgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIHVua25vd24gYWdlbnQKICAgIC8vIGNvbnRyYWN0cy9pZGVudGl0eV9yZWdpc3RyeS5weTozMjYKICAgIC8vIHJldHVybiBzZWxmLmFnZW50c1thaWRdLmFnZW50X2FkZHJlc3MKICAgIHB1c2hpbnQgMTAKICAgIGludGNfMiAvLyAzMgogICAgYm94X2V4dHJhY3QgLy8gb24gZXJyb3I6IGluZGV4IG91dCBvZiBib3VuZHMKICAgIC8vIGNvbnRyYWN0cy9pZGVudGl0eV9yZWdpc3RyeS5weTozMTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMiAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIGlkZW50aXR5X3JlZ2lzdHJ5LklkZW50aXR5UmVnaXN0cnkucmVzb2x2ZV9ieV9kb21haW5bcm91dGluZ10oKSAtPiB2b2lkOgpyZXNvbHZlX2J5X2RvbWFpbjoKICAgIC8vIGNvbnRyYWN0cy9pZGVudGl0eV9yZWdpc3RyeS5weTozMjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIC8vIGNvbnRyYWN0cy9pZGVudGl0eV9yZWdpc3RyeS5weTozMzEKICAgIC8vIGQgPSBhZ2VudF9kb21haW4ubmF0aXZlCiAgICBleHRyYWN0IDIgMAogICAgLy8gY29udHJhY3RzL2lkZW50aXR5X3JlZ2lzdHJ5LnB5OjMzMgogICAgLy8gaWYgZCBpbiBzZWxmLmJ5X2RvbWFpbjoKICAgIGJ5dGVjXzMgLy8gMHg2NDZkNWYKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IHJlc29sdmVfYnlfZG9tYWluX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gY29udHJhY3RzL2lkZW50aXR5X3JlZ2lzdHJ5LnB5OjMzMwogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KHNlbGYuYnlfZG9tYWluW2RdKQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYnlfZG9tYWluIGVudHJ5IGV4aXN0cwogICAgYnRvaQogICAgaXRvYgoKcmVzb2x2ZV9ieV9kb21haW5fYWZ0ZXJfaW5saW5lZF9pZGVudGl0eV9yZWdpc3RyeS5JZGVudGl0eVJlZ2lzdHJ5LnJlc29sdmVfYnlfZG9tYWluQDQ6CiAgICAvLyBjb250cmFjdHMvaWRlbnRpdHlfcmVnaXN0cnkucHk6MzI4CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzIgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCnJlc29sdmVfYnlfZG9tYWluX2FmdGVyX2lmX2Vsc2VAMzoKICAgIHBvcAogICAgLy8gY29udHJhY3RzL2lkZW50aXR5X3JlZ2lzdHJ5LnB5OjMzNAogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KDApCiAgICBpbnRjXzEgLy8gMAogICAgaXRvYgogICAgLy8gY29udHJhY3RzL2lkZW50aXR5X3JlZ2lzdHJ5LnB5OjMyOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJlc29sdmVfYnlfZG9tYWluX2FmdGVyX2lubGluZWRfaWRlbnRpdHlfcmVnaXN0cnkuSWRlbnRpdHlSZWdpc3RyeS5yZXNvbHZlX2J5X2RvbWFpbkA0CgoKLy8gaWRlbnRpdHlfcmVnaXN0cnkuSWRlbnRpdHlSZWdpc3RyeS5yZXNvbHZlX2J5X2FkZHJlc3Nbcm91dGluZ10oKSAtPiB2b2lkOgpyZXNvbHZlX2J5X2FkZHJlc3M6CiAgICAvLyBjb250cmFjdHMvaWRlbnRpdHlfcmVnaXN0cnkucHk6MzM2CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gY29udHJhY3RzL2lkZW50aXR5X3JlZ2lzdHJ5LnB5OjMzOQogICAgLy8gaWYgYSBpbiBzZWxmLmJ5X2FkZHJlc3M6CiAgICBieXRlY18xIC8vIDB4NjE2NDVmCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiByZXNvbHZlX2J5X2FkZHJlc3NfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBjb250cmFjdHMvaWRlbnRpdHlfcmVnaXN0cnkucHk6MzQwCiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoc2VsZi5ieV9hZGRyZXNzW2FdKQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYnlfYWRkcmVzcyBlbnRyeSBleGlzdHMKICAgIGJ0b2kKICAgIGl0b2IKCnJlc29sdmVfYnlfYWRkcmVzc19hZnRlcl9pbmxpbmVkX2lkZW50aXR5X3JlZ2lzdHJ5LklkZW50aXR5UmVnaXN0cnkucmVzb2x2ZV9ieV9hZGRyZXNzQDQ6CiAgICAvLyBjb250cmFjdHMvaWRlbnRpdHlfcmVnaXN0cnkucHk6MzM2CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzIgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCnJlc29sdmVfYnlfYWRkcmVzc19hZnRlcl9pZl9lbHNlQDM6CiAgICBwb3AKICAgIC8vIGNvbnRyYWN0cy9pZGVudGl0eV9yZWdpc3RyeS5weTozNDEKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NCgwKQogICAgaW50Y18xIC8vIDAKICAgIGl0b2IKICAgIC8vIGNvbnRyYWN0cy9pZGVudGl0eV9yZWdpc3RyeS5weTozMzYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByZXNvbHZlX2J5X2FkZHJlc3NfYWZ0ZXJfaW5saW5lZF9pZGVudGl0eV9yZWdpc3RyeS5JZGVudGl0eVJlZ2lzdHJ5LnJlc29sdmVfYnlfYWRkcmVzc0A0CgoKLy8gaWRlbnRpdHlfcmVnaXN0cnkuSWRlbnRpdHlSZWdpc3RyeS50b3RhbF9hZ2VudHNbcm91dGluZ10oKSAtPiB2b2lkOgp0b3RhbF9hZ2VudHM6CiAgICAvLyBjb250cmFjdHMvaWRlbnRpdHlfcmVnaXN0cnkucHk6MzQ1CiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoc2VsZi5hZ2VudF9jb3VudCkKICAgIGludGNfMSAvLyAwCiAgICBieXRlYyA1IC8vICJhZ2VudF9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hZ2VudF9jb3VudCBleGlzdHMKICAgIGl0b2IKICAgIC8vIGNvbnRyYWN0cy9pZGVudGl0eV9yZWdpc3RyeS5weTozNDMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMiAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIGlkZW50aXR5X3JlZ2lzdHJ5LklkZW50aXR5UmVnaXN0cnkuX2Fzc2VydF9jYW5vbmljYWxfZG9tYWluKGRvbWFpbjogYnl0ZXMpIC0+IHZvaWQ6Cl9hc3NlcnRfY2Fub25pY2FsX2RvbWFpbjoKICAgIC8vIGNvbnRyYWN0cy9pZGVudGl0eV9yZWdpc3RyeS5weTo2My02NAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBfYXNzZXJ0X2Nhbm9uaWNhbF9kb21haW4oc2VsZiwgZG9tYWluOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIHB1c2hieXRlcyAiIgogICAgLy8gY29udHJhY3RzL2lkZW50aXR5X3JlZ2lzdHJ5LnB5Ojc3CiAgICAvLyBsZW5ndGggPSBiLmxlbmd0aAogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGR1cG4gMgogICAgLy8gY29udHJhY3RzL2lkZW50aXR5X3JlZ2lzdHJ5LnB5Ojc4CiAgICAvLyBhc3NlcnQgbGVuZ3RoID4gMCwgImRvbWFpbiByZXF1aXJlZCIKICAgIGFzc2VydCAvLyBkb21haW4gcmVxdWlyZWQKICAgIC8vIGNvbnRyYWN0cy9pZGVudGl0eV9yZWdpc3RyeS5weTo3OQogICAgLy8gYXNzZXJ0IGxlbmd0aCA8PSA2MSwgImRvbWFpbiB0b28gbG9uZyAoZG1fICsgZG9tYWluIG11c3QgZml0IDY0IGJ5dGVzKSIKICAgIHB1c2hpbnQgNjEKICAgIDw9CiAgICBhc3NlcnQgLy8gZG9tYWluIHRvbyBsb25nIChkbV8gKyBkb21haW4gbXVzdCBmaXQgNjQgYnl0ZXMpCgpfYXNzZXJ0X2Nhbm9uaWNhbF9kb21haW5fd2hpbGVfdG9wQDk6CiAgICBwdXNoaW50IDI0MTAKICAgIGdsb2JhbCBPcGNvZGVCdWRnZXQKICAgID4KICAgIGJ6IF9hc3NlcnRfY2Fub25pY2FsX2RvbWFpbl9hZnRlcl93aGlsZUAxNAogICAgaXR4bl9iZWdpbgogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIHB1c2hpbnQgNSAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIGJ5dGVjIDcgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtCiAgICBieXRlYyA3IC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtCiAgICBpbnRjXzEgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBiIF9hc3NlcnRfY2Fub25pY2FsX2RvbWFpbl93aGlsZV90b3BAOQoKX2Fzc2VydF9jYW5vbmljYWxfZG9tYWluX2FmdGVyX3doaWxlQDE0OgogICAgLy8gY29udHJhY3RzL2lkZW50aXR5X3JlZ2lzdHJ5LnB5Ojk0CiAgICAvLyBpID0gVUludDY0KDApCiAgICBpbnRjXzEgLy8gMAoKX2Fzc2VydF9jYW5vbmljYWxfZG9tYWluX3doaWxlX3RvcEAxOgogICAgLy8gY29udHJhY3RzL2lkZW50aXR5X3JlZ2lzdHJ5LnB5Ojk1CiAgICAvLyB3aGlsZSBpIDwgbGVuZ3RoOgogICAgZHVwCiAgICBkaWcgMgogICAgPAogICAgYnogX2Fzc2VydF9jYW5vbmljYWxfZG9tYWluX2FmdGVyX3doaWxlQDcKICAgIC8vIGNvbnRyYWN0cy9pZGVudGl0eV9yZWdpc3RyeS5weTo5NgogICAgLy8gYyA9IG9wLmdldGJ5dGUoYiwgaSkKICAgIGZyYW1lX2RpZyAtMQogICAgZGlnIDEKICAgIGdldGJ5dGUKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBjb250cmFjdHMvaWRlbnRpdHlfcmVnaXN0cnkucHk6OTcKICAgIC8vIGFzc2VydCBjID4gMzIsICJkb21haW4gbXVzdCBub3QgY29udGFpbiBzcGFjZXMgb3IgY29udHJvbCBjaGFyYWN0ZXJzIgogICAgZHVwCiAgICBpbnRjXzIgLy8gMzIKICAgID4KICAgIGFzc2VydCAvLyBkb21haW4gbXVzdCBub3QgY29udGFpbiBzcGFjZXMgb3IgY29udHJvbCBjaGFyYWN0ZXJzCiAgICAvLyBjb250cmFjdHMvaWRlbnRpdHlfcmVnaXN0cnkucHk6OTgKICAgIC8vIGFzc2VydCBjIDwgMTI3LCAiZG9tYWluIG11c3QgYmUgYXNjaWkiCiAgICBkdXAKICAgIHB1c2hpbnQgMTI3CiAgICA8CiAgICBhc3NlcnQgLy8gZG9tYWluIG11c3QgYmUgYXNjaWkKICAgIC8vIGNvbnRyYWN0cy9pZGVudGl0eV9yZWdpc3RyeS5weTo5OQogICAgLy8gYXNzZXJ0IG5vdCAoYyA+PSA2NSBhbmQgYyA8PSA5MCksICJkb21haW4gbXVzdCBiZSBsb3dlci1jYXNlIgogICAgcHVzaGludCA2NQogICAgPj0KICAgIGJ6IF9hc3NlcnRfY2Fub25pY2FsX2RvbWFpbl9ib29sX2ZhbHNlQDUKICAgIGZyYW1lX2RpZyAwCiAgICBwdXNoaW50IDkwCiAgICA8PQogICAgYnogX2Fzc2VydF9jYW5vbmljYWxfZG9tYWluX2Jvb2xfZmFsc2VANQogICAgaW50Y18wIC8vIDEKCl9hc3NlcnRfY2Fub25pY2FsX2RvbWFpbl9ib29sX21lcmdlQDY6CiAgICAvLyBjb250cmFjdHMvaWRlbnRpdHlfcmVnaXN0cnkucHk6OTkKICAgIC8vIGFzc2VydCBub3QgKGMgPj0gNjUgYW5kIGMgPD0gOTApLCAiZG9tYWluIG11c3QgYmUgbG93ZXItY2FzZSIKICAgICEKICAgIGFzc2VydCAvLyBkb21haW4gbXVzdCBiZSBsb3dlci1jYXNlCiAgICAvLyBjb250cmFjdHMvaWRlbnRpdHlfcmVnaXN0cnkucHk6MTAwCiAgICAvLyBpICs9IDEKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBiIF9hc3NlcnRfY2Fub25pY2FsX2RvbWFpbl93aGlsZV90b3BAMQoKX2Fzc2VydF9jYW5vbmljYWxfZG9tYWluX2Jvb2xfZmFsc2VANToKICAgIGludGNfMSAvLyAwCiAgICBiIF9hc3NlcnRfY2Fub25pY2FsX2RvbWFpbl9ib29sX21lcmdlQDYKCl9hc3NlcnRfY2Fub25pY2FsX2RvbWFpbl9hZnRlcl93aGlsZUA3OgogICAgcG9wCiAgICAvLyBjb250cmFjdHMvaWRlbnRpdHlfcmVnaXN0cnkucHk6MTAxCiAgICAvLyBhc3NlcnQgb3AuZ2V0Ynl0ZShiLCBsZW5ndGggLSAxKSAhPSA0NiwgImRvbWFpbiBtdXN0IG5vdCBlbmQgd2l0aCBhIGRvdCIKICAgIGludGNfMCAvLyAxCiAgICAtCiAgICBmcmFtZV9kaWcgLTEKICAgIHN3YXAKICAgIGdldGJ5dGUKICAgIHB1c2hpbnQgNDYKICAgICE9CiAgICBhc3NlcnQgLy8gZG9tYWluIG11c3Qgbm90IGVuZCB3aXRoIGEgZG90CiAgICByZXRzdWIK", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==" }, "byteCode": { "approval": "CyAEAQAgCCYIA2FnXwNhZF8EFR98dQNkbV8FFR98dYALYWdlbnRfY291bnQDcHJfAwaBATEYQAAEJwUjZzEbQQBcMRkURDEYRIILBGXkx7IEWzHhPwTs16d/BKx2t5UEnIEAMwSxCml3BFII4VAEx7lwYwR/92MCBNJzYPYEqD7POTYaAI4LABwAtAFxAYsBzgItAlgC1ALwAxsDPQAjgQUxGY4CAAwAAQAxGEQxADIJEkQiQzEYFEMxFiIJSTgQIhJENhoBSSNZgQIISwEVEkQxAClLAVBJvUUBFERLAlcCACtLAVBJvUUBFERMiAL2MgpJcwFEIycFZUQiCCcFSwFnMgdMFkwWSwGAAgA6UEsHUEsBUExQTwdQKEsCUEm8SEy/TwNLAb9PA0sBv0sEOAdLAxJESwQ4AE8EEkRPAzgITwNzAURPAwkPRCpMULAiQzEWIglHAjgQIhJENhoBSRUlEkQ2GgJJI1mBAghLARUSREwXFihLAVBJvUUBREm+SE4CSYEKJLoxABJESwNXAgBJiAJRK0xQSb1FARREMgpJcwFMSU4HTglESwKDAjoCuheBAghLA4E6TwK6VwIAK0xQvEhLBCVZTwUjTwJYTwZQMgcWXDJLA7xITwNMv0xPAr9JcwFMSU4DTgVESwM4BxJETwI4ADEAEkQMQQALSwI4CEsBSwMJD0QnBLAiQzYaAUkVJRJEFxYoTFBJvUUBRL5IKkxQsCJDNhoBSRUlEkQ2GgJJFSQSREwXFihLAVBJvUUBRIEKJLpJMQASREsCMgMTREsCE0QpSwJQvUUBFEQnBkxQTL8nBLAiQzYaAUkVJRJEFxYoSwFQSb1FAUQnBksCUEm9RQFESb5IMQASRCkxAFC9RQEUREsBvkhMSwKBCiS6KUxQvEgxAE8CTFwKMgcWXDJLArxITwJMvykxAFBPAr+8SCcEsCJDNhoBSRUlEkQXFihLAVBJvUUBRIEKJLoxABJEJwZMUEm9RQFEvEgnBLAiQ4AANhoBSRUlEkQXFihLAVBJvUUBREmBCiS6STEAEkQyCklOBHMBTE4EREsBgwI6AroXgQIISwKBOk8CulcCACtMULxIKUxQvEi8SCcGTFBJTgO9RQFBAARLArxITHMBRAlJRQNBABCxMQBLArIIsgcishAjsgGzJwSwIkM2GgFJFSUSRBcWKExQSb1FAUSBCiS6KkxQsCJDNhoBSSNZgQIISwEVEkRXAgArTFBJvUUBQQAKvkQXFipMULAiQ0gjFkL/9DYaAUkVJBJEKUxQSb1FAUEACr5EFxYqTFCwIkNIIxZC//QjJwVlRBYqTFCwIkOKAQCAAIv/FUcCRIE9DkSB6hIyDA1BABixgQayEIEFshknB7IeJweyHyOyAbNC/98jSUsCDEEAK4v/SwFVSYwASSQNREmBfwxEgUEPQQAQiwCBWg5BAAgiFEQiCEL/0iNC//VIIgmL/0xVgS4TRIk=", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, "minor": 9, "patch": 0 } }, "events": [], "templateVariables": {} }