{ "name": "GovernanceContract", "structs": {}, "methods": [ { "name": "initialize", "args": [ { "type": "uint64", "name": "staking_app" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Set reference to the staking contract app ID.\nOnly callable by the application creator.", "events": [], "recommendations": {} }, { "name": "create_proposal", "args": [ { "type": "string", "name": "title" }, { "type": "string", "name": "description" }, { "type": "uint64", "name": "proposal_type" } ], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Create a new governance proposal.\nproposal_type values: 0 = parameter change 1 = treasury allocation 2 = protocol upgrade 3 = emergency action\nCurrently restricted to the application creator. In production, Senator agents will be authorized to propose. Returns the new proposal ID.", "events": [], "recommendations": {} }, { "name": "advance_to_voting", "args": [ { "type": "uint64", "name": "proposal_id" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Advance a proposal from the discussion phase to the voting phase.\nCan only be called after the discussion period (48h) has elapsed.", "events": [], "recommendations": {} }, { "name": "finalize_proposal", "args": [ { "type": "uint64", "name": "proposal_id" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Finalize a proposal after the voting period has ended.\nChecks if quorum was met and if supermajority threshold was reached. Sets status to passed (2) or rejected (3).", "events": [], "recommendations": {} }, { "name": "execute_proposal", "args": [ { "type": "uint64", "name": "proposal_id" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Mark a passed proposal as executed after the timelock period.\nThe actual execution of the proposal action is handled off-chain or via a separate transaction group.", "events": [], "recommendations": {} }, { "name": "cancel_proposal", "args": [ { "type": "uint64", "name": "proposal_id" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Cancel a proposal. Only callable by the creator (emergency).\nCan only cancel proposals in discussion or voting phase.", "events": [], "recommendations": {} }, { "name": "cast_vote", "args": [ { "type": "uint64", "name": "proposal_id" }, { "type": "uint64", "name": "vote" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Cast a veCORTEX-weighted vote on a proposal.\nvote: 1 = yes, 0 = no\nEach address can only vote once per proposal. In production, voting weight comes from the staking contract; currently uses a placeholder weight of 1.", "events": [], "recommendations": {} }, { "name": "get_proposal", "args": [ { "type": "uint64", "name": "proposal_id" } ], "returns": { "type": "byte[]" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Get full proposal data (80 bytes).\nReturns empty bytes if proposal doesn't exist.", "events": [], "recommendations": {} }, { "name": "get_proposal_status", "args": [ { "type": "uint64", "name": "proposal_id" } ], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Get the status code of a proposal.\nReturns 99 if proposal doesn't exist.", "events": [], "recommendations": {} }, { "name": "get_vote_tally", "args": [ { "type": "uint64", "name": "proposal_id" } ], "returns": { "type": "byte[]" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Get yes and no vote counts for a proposal.\nReturns 16 bytes: yes_votes(8) + no_votes(8). Returns empty bytes if proposal doesn't exist.", "events": [], "recommendations": {} }, { "name": "get_proposal_count", "args": [], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Get the total number of proposals created.", "events": [], "recommendations": {} }, { "name": "has_voted", "args": [ { "type": "uint64", "name": "proposal_id" }, { "type": "address", "name": "voter" } ], "returns": { "type": "bool" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Check if an account has voted on a proposal.", "events": [], "recommendations": {} }, { "name": "update_governance_parameters", "args": [ { "type": "uint64", "name": "discussion_period" }, { "type": "uint64", "name": "voting_period" }, { "type": "uint64", "name": "timelock_period" }, { "type": "uint64", "name": "quorum_bps" }, { "type": "uint64", "name": "supermajority_bps" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Update governance timing and threshold parameters.\nOnly callable by the creator. In production, this would require a governance proposal itself.", "events": [], "recommendations": {} } ], "arcs": [ 22, 28 ], "desc": "\n On-chain governance for PURECORTEX.\n\n Proposal lifecycle:\n propose -> discuss (48h) -> vote (5 days) -> timelock (7 days) -> execute\n\n Proposals are created by authorized addresses (initially creator only,\n later Senator agents). Votes are weighted by veCORTEX power from the\n staking contract.\n\n Proposal status codes:\n 0 = discussion\n 1 = voting\n 2 = passed\n 3 = rejected\n 4 = executed\n 5 = cancelled\n\n Proposal data encoding (80 bytes):\n proposer(32) + created_round(8) + type(8) + yes_votes(8) +\n no_votes(8) + status(8) + total_voters(8)\n ", "networks": {}, "state": { "schema": { "global": { "ints": 7, "bytes": 0 }, "local": { "ints": 0, "bytes": 0 } }, "keys": { "global": { "staking_app": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "c3Rha2luZ19hcHA=" }, "proposal_count": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "cHJvcG9zYWxfY291bnQ=" }, "DISCUSSION_PERIOD": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "RElTQ1VTU0lPTl9QRVJJT0Q=" }, "VOTING_PERIOD": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "Vk9USU5HX1BFUklPRA==" }, "TIMELOCK_PERIOD": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "VElNRUxPQ0tfUEVSSU9E" }, "QUORUM_BPS": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "UVVPUlVNX0JQUw==" }, "SUPERMAJORITY_BPS": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "U1VQRVJNQUpPUklUWV9CUFM=" } }, "local": {}, "box": {} }, "maps": { "global": {}, "local": {}, "box": { "proposals": { "keyType": "uint64", "valueType": "AVMBytes", "prefix": "" }, "votes": { "keyType": "AVMBytes", "valueType": "AVMBytes", "prefix": "" } } } }, "bareActions": { "create": [ "NoOp" ], "call": [] }, "sourceInfo": { "approval": { "sourceInfo": [ { "pc": [ 302 ], "errorMessage": "Already initialized" }, { "pc": [ 775 ], "errorMessage": "Already voted" }, { "pc": [ 678 ], "errorMessage": "Can only cancel active proposals" }, { "pc": [ 1073 ], "errorMessage": "Discussion period must be positive" }, { "pc": [ 436 ], "errorMessage": "Discussion period not over" }, { "pc": [ 1096 ], "errorMessage": "Majority cannot exceed 100%" }, { "pc": [ 1091 ], "errorMessage": "Majority must be at least 50%" }, { "pc": [ 425 ], "errorMessage": "Not in discussion phase" }, { "pc": [ 501, 745 ], "errorMessage": "Not in voting phase" }, { "pc": [ 349 ], "errorMessage": "Only Senator can propose" }, { "pc": [ 413, 473, 593, 670, 728 ], "errorMessage": "Proposal not found" }, { "pc": [ 607 ], "errorMessage": "Proposal not passed" }, { "pc": [ 1085 ], "errorMessage": "Quorum cannot exceed 100%" }, { "pc": [ 1079 ], "errorMessage": "Timelock must be positive" }, { "pc": [ 627 ], "errorMessage": "Timelock period not over" }, { "pc": [ 295, 587, 664, 1070 ], "errorMessage": "Unauthorized" }, { "pc": [ 766 ], "errorMessage": "Voting period expired" }, { "pc": [ 1076 ], "errorMessage": "Voting period must be positive" }, { "pc": [ 519 ], "errorMessage": "Voting period not over" }, { "pc": [ 431, 505, 611, 754 ], "errorMessage": "check self.DISCUSSION_PERIOD exists" }, { "pc": [ 537 ], "errorMessage": "check self.SUPERMAJORITY_BPS exists" }, { "pc": [ 622 ], "errorMessage": "check self.TIMELOCK_PERIOD exists" }, { "pc": [ 514, 616, 761 ], "errorMessage": "check self.VOTING_PERIOD exists" }, { "pc": [ 353, 974 ], "errorMessage": "check self.proposal_count exists" }, { "pc": [ 891, 923 ], "errorMessage": "check self.proposals entry exists" }, { "pc": [ 300 ], "errorMessage": "check self.staking_app exists" }, { "pc": [ 314, 327 ], "errorMessage": "invalid array length header" }, { "pc": [ 321, 334 ], "errorMessage": "invalid number of bytes for arc4.dynamic_array" }, { "pc": [ 999 ], "errorMessage": "invalid number of bytes for arc4.static_array" }, { "pc": [ 288, 342, 406, 465, 580, 657, 708, 717, 863, 902, 936, 989, 1027, 1036, 1045, 1054, 1063 ], "errorMessage": "invalid number of bytes for arc4.uint64" } ], "pcOffsetMethod": "none" }, "clear": { "sourceInfo": [], "pcOffsetMethod": "none" } }, "source": { "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgOCA2NCAxMDAwMAogICAgYnl0ZWNibG9jayAiRElTQ1VTU0lPTl9QRVJJT0QiIDB4MTUxZjdjNzUgIlZPVElOR19QRVJJT0QiICJwcm9wb3NhbF9jb3VudCIgInN0YWtpbmdfYXBwIiAiVElNRUxPQ0tfUEVSSU9EIiAiU1VQRVJNQUpPUklUWV9CUFMiICJRVU9SVU1fQlBTIgogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2dvdmVybmFuY2UvY29udHJhY3QucHk6NDAKICAgIC8vIHNlbGYuc3Rha2luZ19hcHAgPSBVSW50NjQoMCkgICMgUmVmZXJlbmNlIHRvIFZlQ29ydGV4U3Rha2luZyBhcHAgSUQKICAgIGJ5dGVjIDQgLy8gInN0YWtpbmdfYXBwIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ292ZXJuYW5jZS9jb250cmFjdC5weTo0MQogICAgLy8gc2VsZi5wcm9wb3NhbF9jb3VudCA9IFVJbnQ2NCgwKQogICAgYnl0ZWNfMyAvLyAicHJvcG9zYWxfY291bnQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nb3Zlcm5hbmNlL2NvbnRyYWN0LnB5OjUxLTUyCiAgICAvLyAjIEdvdmVybmFuY2UgdGltaW5nIHBhcmFtZXRlcnMgKGluIHJvdW5kcywgfjMgcm91bmRzL21pbnV0ZSkKICAgIC8vIHNlbGYuRElTQ1VTU0lPTl9QRVJJT0QgPSBVSW50NjQoODY0MCkgICMgNDggaG91cnMgKDQ4ICogNjAgKiAzKQogICAgYnl0ZWNfMCAvLyAiRElTQ1VTU0lPTl9QRVJJT0QiCiAgICBwdXNoaW50IDg2NDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ292ZXJuYW5jZS9jb250cmFjdC5weTo1MwogICAgLy8gc2VsZi5WT1RJTkdfUEVSSU9EID0gVUludDY0KDIxNjAwKSAgIyA1IGRheXMgKDUgKiAyNCAqIDYwICogMykKICAgIGJ5dGVjXzIgLy8gIlZPVElOR19QRVJJT0QiCiAgICBwdXNoaW50IDIxNjAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2dvdmVybmFuY2UvY29udHJhY3QucHk6NTQKICAgIC8vIHNlbGYuVElNRUxPQ0tfUEVSSU9EID0gVUludDY0KDMwMjQwKSAgIyA3IGRheXMgKDcgKiAyNCAqIDYwICogMykKICAgIGJ5dGVjIDUgLy8gIlRJTUVMT0NLX1BFUklPRCIKICAgIHB1c2hpbnQgMzAyNDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ292ZXJuYW5jZS9jb250cmFjdC5weTo1Ni01NwogICAgLy8gIyBRdW9ydW0gYW5kIG1ham9yaXR5IHRocmVzaG9sZHMgKGJhc2lzIHBvaW50cykKICAgIC8vIHNlbGYuUVVPUlVNX0JQUyA9IFVJbnQ2NCgyNTAwKSAgIyAyNSUgb2YgdG90YWwgdmVDT1JURVggbXVzdCBwYXJ0aWNpcGF0ZQogICAgYnl0ZWMgNyAvLyAiUVVPUlVNX0JQUyIKICAgIHB1c2hpbnQgMjUwMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nb3Zlcm5hbmNlL2NvbnRyYWN0LnB5OjU4CiAgICAvLyBzZWxmLlNVUEVSTUFKT1JJVFlfQlBTID0gVUludDY0KDY3MDApICAjIDY3JSB5ZXMgdm90ZXMgcmVxdWlyZWQgdG8gcGFzcwogICAgYnl0ZWMgNiAvLyAiU1VQRVJNQUpPUklUWV9CUFMiCiAgICBwdXNoaW50IDY3MDAKICAgIGFwcF9nbG9iYWxfcHV0CgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nb3Zlcm5hbmNlL2NvbnRyYWN0LnB5OjE1CiAgICAvLyBjbGFzcyBHb3Zlcm5hbmNlQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDIyCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQKICAgIHB1c2hieXRlc3MgMHgwODU0OWFkNyAweGVlYjI3NzAyIDB4NzhmZDE0ZTQgMHhmNTkxMDc1NiAweDMzOGJlYzIzIDB4ZDhjNzkwODMgMHhiYTc3NDZhYyAweGRkMzNiYzI5IDB4MGJiMGJhYWYgMHg5MjVhMTI3MSAweDZkOGZiYTc0IDB4ZWFjMmQ5MTMgMHhjMzc2NDhlMiAvLyBtZXRob2QgImluaXRpYWxpemUodWludDY0KXZvaWQiLCBtZXRob2QgImNyZWF0ZV9wcm9wb3NhbChzdHJpbmcsc3RyaW5nLHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgImFkdmFuY2VfdG9fdm90aW5nKHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJmaW5hbGl6ZV9wcm9wb3NhbCh1aW50NjQpdm9pZCIsIG1ldGhvZCAiZXhlY3V0ZV9wcm9wb3NhbCh1aW50NjQpdm9pZCIsIG1ldGhvZCAiY2FuY2VsX3Byb3Bvc2FsKHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJjYXN0X3ZvdGUodWludDY0LHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJnZXRfcHJvcG9zYWwodWludDY0KWJ5dGVbXSIsIG1ldGhvZCAiZ2V0X3Byb3Bvc2FsX3N0YXR1cyh1aW50NjQpdWludDY0IiwgbWV0aG9kICJnZXRfdm90ZV90YWxseSh1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJnZXRfcHJvcG9zYWxfY291bnQoKXVpbnQ2NCIsIG1ldGhvZCAiaGFzX3ZvdGVkKHVpbnQ2NCxhZGRyZXNzKWJvb2wiLCBtZXRob2QgInVwZGF0ZV9nb3Zlcm5hbmNlX3BhcmFtZXRlcnModWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggaW5pdGlhbGl6ZSBjcmVhdGVfcHJvcG9zYWwgYWR2YW5jZV90b192b3RpbmcgZmluYWxpemVfcHJvcG9zYWwgZXhlY3V0ZV9wcm9wb3NhbCBjYW5jZWxfcHJvcG9zYWwgY2FzdF92b3RlIGdldF9wcm9wb3NhbCBnZXRfcHJvcG9zYWxfc3RhdHVzIGdldF92b3RlX3RhbGx5IGdldF9wcm9wb3NhbF9jb3VudCBoYXNfdm90ZWQgdXBkYXRlX2dvdmVybmFuY2VfcGFyYW1ldGVycwogICAgZXJyCgptYWluX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDIyOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMuZ292ZXJuYW5jZS5jb250cmFjdC5Hb3Zlcm5hbmNlQ29udHJhY3QuaW5pdGlhbGl6ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmluaXRpYWxpemU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ292ZXJuYW5jZS9jb250cmFjdC5weTo2NAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ292ZXJuYW5jZS9jb250cmFjdC5weTo3MAogICAgLy8gYXNzZXJ0IFR4bi5zZW5kZXIgPT0gR2xvYmFsLmNyZWF0b3JfYWRkcmVzcywgIlVuYXV0aG9yaXplZCIKICAgIHR4biBTZW5kZXIKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgPT0KICAgIGFzc2VydCAvLyBVbmF1dGhvcml6ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nb3Zlcm5hbmNlL2NvbnRyYWN0LnB5OjcxCiAgICAvLyBhc3NlcnQgc2VsZi5zdGFraW5nX2FwcCA9PSBVSW50NjQoMCksICJBbHJlYWR5IGluaXRpYWxpemVkIgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gInN0YWtpbmdfYXBwIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YWtpbmdfYXBwIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIEFscmVhZHkgaW5pdGlhbGl6ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nb3Zlcm5hbmNlL2NvbnRyYWN0LnB5OjcyCiAgICAvLyBzZWxmLnN0YWtpbmdfYXBwID0gc3Rha2luZ19hcHAKICAgIGJ5dGVjIDQgLy8gInN0YWtpbmdfYXBwIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nb3Zlcm5hbmNlL2NvbnRyYWN0LnB5OjY0CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMuZ292ZXJuYW5jZS5jb250cmFjdC5Hb3Zlcm5hbmNlQ29udHJhY3QuY3JlYXRlX3Byb3Bvc2FsW3JvdXRpbmddKCkgLT4gdm9pZDoKY3JlYXRlX3Byb3Bvc2FsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2dvdmVybmFuY2UvY29udHJhY3QucHk6NzgKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAyCiAgICArCiAgICBzd2FwCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAyCiAgICArCiAgICBzd2FwCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2dvdmVybmFuY2UvY29udHJhY3QucHk6OTgKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IEdsb2JhbC5jcmVhdG9yX2FkZHJlc3MsICJPbmx5IFNlbmF0b3IgY2FuIHByb3Bvc2UiCiAgICB0eG4gU2VuZGVyCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgID09CiAgICBhc3NlcnQgLy8gT25seSBTZW5hdG9yIGNhbiBwcm9wb3NlCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ292ZXJuYW5jZS9jb250cmFjdC5weToxMDAKICAgIC8vIHByb3Bvc2FsX2lkID0gc2VsZi5wcm9wb3NhbF9jb3VudCArIFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInByb3Bvc2FsX2NvdW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByb3Bvc2FsX2NvdW50IGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nb3Zlcm5hbmNlL2NvbnRyYWN0LnB5OjEwMQogICAgLy8gc2VsZi5wcm9wb3NhbF9jb3VudCA9IHByb3Bvc2FsX2lkCiAgICBieXRlY18zIC8vICJwcm9wb3NhbF9jb3VudCIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2dvdmVybmFuY2UvY29udHJhY3QucHk6MTA3CiAgICAvLyBUeG4uc2VuZGVyLmJ5dGVzCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ292ZXJuYW5jZS9jb250cmFjdC5weToxMDgKICAgIC8vICsgb3AuaXRvYihHbG9iYWwucm91bmQpCiAgICBnbG9iYWwgUm91bmQKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nb3Zlcm5hbmNlL2NvbnRyYWN0LnB5OjEwNy0xMDgKICAgIC8vIFR4bi5zZW5kZXIuYnl0ZXMKICAgIC8vICsgb3AuaXRvYihHbG9iYWwucm91bmQpCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nb3Zlcm5hbmNlL2NvbnRyYWN0LnB5OjEwOQogICAgLy8gKyBvcC5pdG9iKHByb3Bvc2FsX3R5cGUpCiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nb3Zlcm5hbmNlL2NvbnRyYWN0LnB5OjEwNy0xMDkKICAgIC8vIFR4bi5zZW5kZXIuYnl0ZXMKICAgIC8vICsgb3AuaXRvYihHbG9iYWwucm91bmQpCiAgICAvLyArIG9wLml0b2IocHJvcG9zYWxfdHlwZSkKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2dvdmVybmFuY2UvY29udHJhY3QucHk6MTEwCiAgICAvLyArIG9wLml0b2IoVUludDY0KDApKSAgIyB5ZXNfdm90ZXMKICAgIGludGNfMCAvLyAwCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ292ZXJuYW5jZS9jb250cmFjdC5weToxMDctMTEwCiAgICAvLyBUeG4uc2VuZGVyLmJ5dGVzCiAgICAvLyArIG9wLml0b2IoR2xvYmFsLnJvdW5kKQogICAgLy8gKyBvcC5pdG9iKHByb3Bvc2FsX3R5cGUpCiAgICAvLyArIG9wLml0b2IoVUludDY0KDApKSAgIyB5ZXNfdm90ZXMKICAgIHN3YXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nb3Zlcm5hbmNlL2NvbnRyYWN0LnB5OjEwNy0xMTEKICAgIC8vIFR4bi5zZW5kZXIuYnl0ZXMKICAgIC8vICsgb3AuaXRvYihHbG9iYWwucm91bmQpCiAgICAvLyArIG9wLml0b2IocHJvcG9zYWxfdHlwZSkKICAgIC8vICsgb3AuaXRvYihVSW50NjQoMCkpICAjIHllc192b3RlcwogICAgLy8gKyBvcC5pdG9iKFVJbnQ2NCgwKSkgICMgbm9fdm90ZXMKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nb3Zlcm5hbmNlL2NvbnRyYWN0LnB5OjEwNy0xMTIKICAgIC8vIFR4bi5zZW5kZXIuYnl0ZXMKICAgIC8vICsgb3AuaXRvYihHbG9iYWwucm91bmQpCiAgICAvLyArIG9wLml0b2IocHJvcG9zYWxfdHlwZSkKICAgIC8vICsgb3AuaXRvYihVSW50NjQoMCkpICAjIHllc192b3RlcwogICAgLy8gKyBvcC5pdG9iKFVJbnQ2NCgwKSkgICMgbm9fdm90ZXMKICAgIC8vICsgb3AuaXRvYihVSW50NjQoMCkpICAjIHN0YXR1czogZGlzY3Vzc2lvbgogICAgZGlnIDEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2dvdmVybmFuY2UvY29udHJhY3QucHk6MTA3LTExMwogICAgLy8gVHhuLnNlbmRlci5ieXRlcwogICAgLy8gKyBvcC5pdG9iKEdsb2JhbC5yb3VuZCkKICAgIC8vICsgb3AuaXRvYihwcm9wb3NhbF90eXBlKQogICAgLy8gKyBvcC5pdG9iKFVJbnQ2NCgwKSkgICMgeWVzX3ZvdGVzCiAgICAvLyArIG9wLml0b2IoVUludDY0KDApKSAgIyBub192b3RlcwogICAgLy8gKyBvcC5pdG9iKFVJbnQ2NCgwKSkgICMgc3RhdHVzOiBkaXNjdXNzaW9uCiAgICAvLyArIG9wLml0b2IoVUludDY0KDApKSAgIyB0b3RhbF92b3RlcnMKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2dvdmVybmFuY2UvY29udHJhY3QucHk6MTE1CiAgICAvLyBzZWxmLnByb3Bvc2Fsc1twcm9wb3NhbF9pZF0gPSBwcm9wb3NhbF9kYXRhCiAgICBzd2FwCiAgICBpdG9iCiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nb3Zlcm5hbmNlL2NvbnRyYWN0LnB5Ojc4CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMuZ292ZXJuYW5jZS5jb250cmFjdC5Hb3Zlcm5hbmNlQ29udHJhY3QuYWR2YW5jZV90b192b3Rpbmdbcm91dGluZ10oKSAtPiB2b2lkOgphZHZhbmNlX3RvX3ZvdGluZzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nb3Zlcm5hbmNlL2NvbnRyYWN0LnB5OjEyMwogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ292ZXJuYW5jZS9jb250cmFjdC5weToxMjkKICAgIC8vIGFzc2VydCBvcC5Cb3guZ2V0KG9wLml0b2IocHJvcG9zYWxfaWQpKVsxXSwgIlByb3Bvc2FsIG5vdCBmb3VuZCIKICAgIGl0b2IKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gUHJvcG9zYWwgbm90IGZvdW5kCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ292ZXJuYW5jZS9jb250cmFjdC5weToxMzAKICAgIC8vIHByb3Bvc2FsX2RhdGEgPSBzZWxmLnByb3Bvc2Fsc1twcm9wb3NhbF9pZF0KICAgIGR1cAogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ292ZXJuYW5jZS9jb250cmFjdC5weToxMzIKICAgIC8vIGNyZWF0ZWRfcm91bmQgPSBvcC5idG9pKG9wLmV4dHJhY3QocHJvcG9zYWxfZGF0YSwgMzIsIDgpKQogICAgZHVwCiAgICBwdXNoaW50IDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL2dvdmVybmFuY2UvY29udHJhY3QucHk6MTMzCiAgICAvLyBjdXJyZW50X3N0YXR1cyA9IG9wLmJ0b2kob3AuZXh0cmFjdChwcm9wb3NhbF9kYXRhLCA2NCwgOCkpCiAgICBzd2FwCiAgICBpbnRjXzMgLy8gNjQKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ292ZXJuYW5jZS9jb250cmFjdC5weToxMzUKICAgIC8vIGFzc2VydCBjdXJyZW50X3N0YXR1cyA9PSBVSW50NjQoMCksICJOb3QgaW4gZGlzY3Vzc2lvbiBwaGFzZSIKICAgICEKICAgIGFzc2VydCAvLyBOb3QgaW4gZGlzY3Vzc2lvbiBwaGFzZQogICAgLy8gc21hcnRfY29udHJhY3RzL2dvdmVybmFuY2UvY29udHJhY3QucHk6MTM3CiAgICAvLyBHbG9iYWwucm91bmQgPj0gY3JlYXRlZF9yb3VuZCArIHNlbGYuRElTQ1VTU0lPTl9QRVJJT0QKICAgIGdsb2JhbCBSb3VuZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gIkRJU0NVU1NJT05fUEVSSU9EIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLkRJU0NVU1NJT05fUEVSSU9EIGV4aXN0cwogICAgdW5jb3ZlciAyCiAgICArCiAgICA+PQogICAgLy8gc21hcnRfY29udHJhY3RzL2dvdmVybmFuY2UvY29udHJhY3QucHk6MTM2LTEzOAogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBHbG9iYWwucm91bmQgPj0gY3JlYXRlZF9yb3VuZCArIHNlbGYuRElTQ1VTU0lPTl9QRVJJT0QKICAgIC8vICksICJEaXNjdXNzaW9uIHBlcmlvZCBub3Qgb3ZlciIKICAgIGFzc2VydCAvLyBEaXNjdXNzaW9uIHBlcmlvZCBub3Qgb3ZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2dvdmVybmFuY2UvY29udHJhY3QucHk6MTQyCiAgICAvLyBvcC5leHRyYWN0KHByb3Bvc2FsX2RhdGEsIDAsIDY0KQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgaW50Y18zIC8vIDY0CiAgICBib3hfZXh0cmFjdAogICAgLy8gc21hcnRfY29udHJhY3RzL2dvdmVybmFuY2UvY29udHJhY3QucHk6MTQzCiAgICAvLyArIG9wLml0b2IoVUludDY0KDEpKQogICAgaW50Y18xIC8vIDEKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nb3Zlcm5hbmNlL2NvbnRyYWN0LnB5OjE0Mi0xNDMKICAgIC8vIG9wLmV4dHJhY3QocHJvcG9zYWxfZGF0YSwgMCwgNjQpCiAgICAvLyArIG9wLml0b2IoVUludDY0KDEpKQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ292ZXJuYW5jZS9jb250cmFjdC5weToxNDQKICAgIC8vICsgb3AuZXh0cmFjdChwcm9wb3NhbF9kYXRhLCA3MiwgOCkKICAgIGRpZyAxCiAgICBwdXNoaW50IDcyCiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nb3Zlcm5hbmNlL2NvbnRyYWN0LnB5OjE0Mi0xNDQKICAgIC8vIG9wLmV4dHJhY3QocHJvcG9zYWxfZGF0YSwgMCwgNjQpCiAgICAvLyArIG9wLml0b2IoVUludDY0KDEpKQogICAgLy8gKyBvcC5leHRyYWN0KHByb3Bvc2FsX2RhdGEsIDcyLCA4KQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ292ZXJuYW5jZS9jb250cmFjdC5weToxNDYKICAgIC8vIHNlbGYucHJvcG9zYWxzW3Byb3Bvc2FsX2lkXSA9IG5ld19kYXRhCiAgICBkaWcgMQogICAgYm94X2RlbAogICAgcG9wCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ292ZXJuYW5jZS9jb250cmFjdC5weToxMjMKICAgIC8vIEBhYmltZXRob2QoKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5nb3Zlcm5hbmNlLmNvbnRyYWN0LkdvdmVybmFuY2VDb250cmFjdC5maW5hbGl6ZV9wcm9wb3NhbFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmZpbmFsaXplX3Byb3Bvc2FsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2dvdmVybmFuY2UvY29udHJhY3QucHk6MTQ4CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nb3Zlcm5hbmNlL2NvbnRyYWN0LnB5OjE1NQogICAgLy8gYXNzZXJ0IG9wLkJveC5nZXQob3AuaXRvYihwcm9wb3NhbF9pZCkpWzFdLCAiUHJvcG9zYWwgbm90IGZvdW5kIgogICAgaXRvYgogICAgZHVwbiAyCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBQcm9wb3NhbCBub3QgZm91bmQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nb3Zlcm5hbmNlL2NvbnRyYWN0LnB5OjE1NgogICAgLy8gcHJvcG9zYWxfZGF0YSA9IHNlbGYucHJvcG9zYWxzW3Byb3Bvc2FsX2lkXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ292ZXJuYW5jZS9jb250cmFjdC5weToxNTgKICAgIC8vIGNyZWF0ZWRfcm91bmQgPSBvcC5idG9pKG9wLmV4dHJhY3QocHJvcG9zYWxfZGF0YSwgMzIsIDgpKQogICAgZHVwCiAgICBwdXNoaW50IDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL2dvdmVybmFuY2UvY29udHJhY3QucHk6MTU5CiAgICAvLyB5ZXNfdm90ZXMgPSBvcC5idG9pKG9wLmV4dHJhY3QocHJvcG9zYWxfZGF0YSwgNDgsIDgpKQogICAgZGlnIDEKICAgIHB1c2hpbnQgNDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGNvdmVyIDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nb3Zlcm5hbmNlL2NvbnRyYWN0LnB5OjE2MAogICAgLy8gbm9fdm90ZXMgPSBvcC5idG9pKG9wLmV4dHJhY3QocHJvcG9zYWxfZGF0YSwgNTYsIDgpKQogICAgZGlnIDEKICAgIHB1c2hpbnQgNTYKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ292ZXJuYW5jZS9jb250cmFjdC5weToxNjEKICAgIC8vIGN1cnJlbnRfc3RhdHVzID0gb3AuYnRvaShvcC5leHRyYWN0KHByb3Bvc2FsX2RhdGEsIDY0LCA4KSkKICAgIHVuY292ZXIgMgogICAgaW50Y18zIC8vIDY0CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL2dvdmVybmFuY2UvY29udHJhY3QucHk6MTYzCiAgICAvLyBhc3NlcnQgY3VycmVudF9zdGF0dXMgPT0gVUludDY0KDEpLCAiTm90IGluIHZvdGluZyBwaGFzZSIKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIE5vdCBpbiB2b3RpbmcgcGhhc2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nb3Zlcm5hbmNlL2NvbnRyYWN0LnB5OjE2NQogICAgLy8gdm90aW5nX3N0YXJ0ID0gY3JlYXRlZF9yb3VuZCArIHNlbGYuRElTQ1VTU0lPTl9QRVJJT0QKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJESVNDVVNTSU9OX1BFUklPRCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ESVNDVVNTSU9OX1BFUklPRCBleGlzdHMKICAgIHVuY292ZXIgMgogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2dvdmVybmFuY2UvY29udHJhY3QucHk6MTY3CiAgICAvLyBHbG9iYWwucm91bmQgPj0gdm90aW5nX3N0YXJ0ICsgc2VsZi5WT1RJTkdfUEVSSU9ECiAgICBnbG9iYWwgUm91bmQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJWT1RJTkdfUEVSSU9EIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLlZPVElOR19QRVJJT0QgZXhpc3RzCiAgICB1bmNvdmVyIDIKICAgICsKICAgID49CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ292ZXJuYW5jZS9jb250cmFjdC5weToxNjYtMTY4CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIEdsb2JhbC5yb3VuZCA+PSB2b3Rpbmdfc3RhcnQgKyBzZWxmLlZPVElOR19QRVJJT0QKICAgIC8vICksICJWb3RpbmcgcGVyaW9kIG5vdCBvdmVyIgogICAgYXNzZXJ0IC8vIFZvdGluZyBwZXJpb2Qgbm90IG92ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nb3Zlcm5hbmNlL2NvbnRyYWN0LnB5OjE3MAogICAgLy8gdG90YWxfdm90ZXMgPSB5ZXNfdm90ZXMgKyBub192b3RlcwogICAgKwogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ292ZXJuYW5jZS9jb250cmFjdC5weToxNzItMTc0CiAgICAvLyAjIERldGVybWluZSBvdXRjb21lIOKAlCBzdXBlcm1ham9yaXR5IGNoZWNrCiAgICAvLyAjIHBhc3NlZCA9IHllc192b3RlcyAqIDEwMDAwID49IHRvdGFsX3ZvdGVzICogU1VQRVJNQUpPUklUWV9CUFMKICAgIC8vIG5ld19zdGF0dXMgPSBVSW50NjQoMykgICMgZGVmYXVsdDogcmVqZWN0ZWQKICAgIHB1c2hpbnQgMwogICAgc3dhcAogICAgLy8gc21hcnRfY29udHJhY3RzL2dvdmVybmFuY2UvY29udHJhY3QucHk6MTc1CiAgICAvLyBpZiB0b3RhbF92b3RlcyA+IFVJbnQ2NCgwKToKICAgIGJ6IGZpbmFsaXplX3Byb3Bvc2FsX2FmdGVyX2lmX2Vsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL2dvdmVybmFuY2UvY29udHJhY3QucHk6MTc2CiAgICAvLyBpZiB5ZXNfdm90ZXMgKiBVSW50NjQoMTAwMDApID49IHRvdGFsX3ZvdGVzICogc2VsZi5TVVBFUk1BSk9SSVRZX0JQUzoKICAgIGRpZyAyCiAgICBpbnRjIDQgLy8gMTAwMDAKICAgICoKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJTVVBFUk1BSk9SSVRZX0JQUyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5TVVBFUk1BSk9SSVRZX0JQUyBleGlzdHMKICAgIGRpZyAzCiAgICAqCiAgICA+PQogICAgYnogZmluYWxpemVfcHJvcG9zYWxfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ292ZXJuYW5jZS9jb250cmFjdC5weToxNzcKICAgIC8vIG5ld19zdGF0dXMgPSBVSW50NjQoMikgICMgcGFzc2VkCiAgICBwdXNoaW50IDIKICAgIGJ1cnkgMQoKZmluYWxpemVfcHJvcG9zYWxfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2dvdmVybmFuY2UvY29udHJhY3QucHk6MTgwCiAgICAvLyBvcC5leHRyYWN0KHByb3Bvc2FsX2RhdGEsIDAsIDY0KQogICAgZGlnIDMKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGludGNfMyAvLyA2NAogICAgYm94X2V4dHJhY3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nb3Zlcm5hbmNlL2NvbnRyYWN0LnB5OjE4MQogICAgLy8gKyBvcC5pdG9iKG5ld19zdGF0dXMpCiAgICBkaWcgMgogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2dvdmVybmFuY2UvY29udHJhY3QucHk6MTgwLTE4MQogICAgLy8gb3AuZXh0cmFjdChwcm9wb3NhbF9kYXRhLCAwLCA2NCkKICAgIC8vICsgb3AuaXRvYihuZXdfc3RhdHVzKQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ292ZXJuYW5jZS9jb250cmFjdC5weToxODIKICAgIC8vICsgb3AuZXh0cmFjdChwcm9wb3NhbF9kYXRhLCA3MiwgOCkKICAgIGRpZyAxCiAgICBwdXNoaW50IDcyCiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nb3Zlcm5hbmNlL2NvbnRyYWN0LnB5OjE4MC0xODIKICAgIC8vIG9wLmV4dHJhY3QocHJvcG9zYWxfZGF0YSwgMCwgNjQpCiAgICAvLyArIG9wLml0b2IobmV3X3N0YXR1cykKICAgIC8vICsgb3AuZXh0cmFjdChwcm9wb3NhbF9kYXRhLCA3MiwgOCkKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2dvdmVybmFuY2UvY29udHJhY3QucHk6MTg0CiAgICAvLyBzZWxmLnByb3Bvc2Fsc1twcm9wb3NhbF9pZF0gPSBuZXdfZGF0YQogICAgZGlnIDEKICAgIGJveF9kZWwKICAgIHBvcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2dvdmVybmFuY2UvY29udHJhY3QucHk6MTQ4CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMuZ292ZXJuYW5jZS5jb250cmFjdC5Hb3Zlcm5hbmNlQ29udHJhY3QuZXhlY3V0ZV9wcm9wb3NhbFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmV4ZWN1dGVfcHJvcG9zYWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ292ZXJuYW5jZS9jb250cmFjdC5weToxODYKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2dvdmVybmFuY2UvY29udHJhY3QucHk6MTkzCiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBHbG9iYWwuY3JlYXRvcl9hZGRyZXNzLCAiVW5hdXRob3JpemVkIgogICAgdHhuIFNlbmRlcgogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIFVuYXV0aG9yaXplZAogICAgLy8gc21hcnRfY29udHJhY3RzL2dvdmVybmFuY2UvY29udHJhY3QucHk6MTk0CiAgICAvLyBhc3NlcnQgb3AuQm94LmdldChvcC5pdG9iKHByb3Bvc2FsX2lkKSlbMV0sICJQcm9wb3NhbCBub3QgZm91bmQiCiAgICBpdG9iCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIFByb3Bvc2FsIG5vdCBmb3VuZAogICAgLy8gc21hcnRfY29udHJhY3RzL2dvdmVybmFuY2UvY29udHJhY3QucHk6MTk1CiAgICAvLyBwcm9wb3NhbF9kYXRhID0gc2VsZi5wcm9wb3NhbHNbcHJvcG9zYWxfaWRdCiAgICBkdXAKICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL2dvdmVybmFuY2UvY29udHJhY3QucHk6MTk3CiAgICAvLyBjcmVhdGVkX3JvdW5kID0gb3AuYnRvaShvcC5leHRyYWN0KHByb3Bvc2FsX2RhdGEsIDMyLCA4KSkKICAgIGR1cAogICAgcHVzaGludCAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nb3Zlcm5hbmNlL2NvbnRyYWN0LnB5OjE5OAogICAgLy8gY3VycmVudF9zdGF0dXMgPSBvcC5idG9pKG9wLmV4dHJhY3QocHJvcG9zYWxfZGF0YSwgNjQsIDgpKQogICAgc3dhcAogICAgaW50Y18zIC8vIDY0CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL2dvdmVybmFuY2UvY29udHJhY3QucHk6MjAwCiAgICAvLyBhc3NlcnQgY3VycmVudF9zdGF0dXMgPT0gVUludDY0KDIpLCAiUHJvcG9zYWwgbm90IHBhc3NlZCIKICAgIHB1c2hpbnQgMgogICAgPT0KICAgIGFzc2VydCAvLyBQcm9wb3NhbCBub3QgcGFzc2VkCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ292ZXJuYW5jZS9jb250cmFjdC5weToyMDUKICAgIC8vICsgc2VsZi5ESVNDVVNTSU9OX1BFUklPRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gIkRJU0NVU1NJT05fUEVSSU9EIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLkRJU0NVU1NJT05fUEVSSU9EIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2dvdmVybmFuY2UvY29udHJhY3QucHk6MjA0LTIwNQogICAgLy8gY3JlYXRlZF9yb3VuZAogICAgLy8gKyBzZWxmLkRJU0NVU1NJT05fUEVSSU9ECiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ292ZXJuYW5jZS9jb250cmFjdC5weToyMDYKICAgIC8vICsgc2VsZi5WT1RJTkdfUEVSSU9ECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiVk9USU5HX1BFUklPRCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5WT1RJTkdfUEVSSU9EIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2dvdmVybmFuY2UvY29udHJhY3QucHk6MjA0LTIwNgogICAgLy8gY3JlYXRlZF9yb3VuZAogICAgLy8gKyBzZWxmLkRJU0NVU1NJT05fUEVSSU9ECiAgICAvLyArIHNlbGYuVk9USU5HX1BFUklPRAogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2dvdmVybmFuY2UvY29udHJhY3QucHk6MjA3CiAgICAvLyArIHNlbGYuVElNRUxPQ0tfUEVSSU9ECiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiVElNRUxPQ0tfUEVSSU9EIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLlRJTUVMT0NLX1BFUklPRCBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nb3Zlcm5hbmNlL2NvbnRyYWN0LnB5OjIwNC0yMDcKICAgIC8vIGNyZWF0ZWRfcm91bmQKICAgIC8vICsgc2VsZi5ESVNDVVNTSU9OX1BFUklPRAogICAgLy8gKyBzZWxmLlZPVElOR19QRVJJT0QKICAgIC8vICsgc2VsZi5USU1FTE9DS19QRVJJT0QKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nb3Zlcm5hbmNlL2NvbnRyYWN0LnB5OjIwOQogICAgLy8gYXNzZXJ0IEdsb2JhbC5yb3VuZCA+PSBleGVjdXRpb25fcm91bmQsICJUaW1lbG9jayBwZXJpb2Qgbm90IG92ZXIiCiAgICBnbG9iYWwgUm91bmQKICAgIDw9CiAgICBhc3NlcnQgLy8gVGltZWxvY2sgcGVyaW9kIG5vdCBvdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ292ZXJuYW5jZS9jb250cmFjdC5weToyMTMKICAgIC8vIG9wLmV4dHJhY3QocHJvcG9zYWxfZGF0YSwgMCwgNjQpCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBpbnRjXzMgLy8gNjQKICAgIGJveF9leHRyYWN0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ292ZXJuYW5jZS9jb250cmFjdC5weToyMTQKICAgIC8vICsgb3AuaXRvYihVSW50NjQoNCkpCiAgICBwdXNoaW50IDQKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nb3Zlcm5hbmNlL2NvbnRyYWN0LnB5OjIxMy0yMTQKICAgIC8vIG9wLmV4dHJhY3QocHJvcG9zYWxfZGF0YSwgMCwgNjQpCiAgICAvLyArIG9wLml0b2IoVUludDY0KDQpKQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ292ZXJuYW5jZS9jb250cmFjdC5weToyMTUKICAgIC8vICsgb3AuZXh0cmFjdChwcm9wb3NhbF9kYXRhLCA3MiwgOCkKICAgIGRpZyAxCiAgICBwdXNoaW50IDcyCiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nb3Zlcm5hbmNlL2NvbnRyYWN0LnB5OjIxMy0yMTUKICAgIC8vIG9wLmV4dHJhY3QocHJvcG9zYWxfZGF0YSwgMCwgNjQpCiAgICAvLyArIG9wLml0b2IoVUludDY0KDQpKQogICAgLy8gKyBvcC5leHRyYWN0KHByb3Bvc2FsX2RhdGEsIDcyLCA4KQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ292ZXJuYW5jZS9jb250cmFjdC5weToyMTcKICAgIC8vIHNlbGYucHJvcG9zYWxzW3Byb3Bvc2FsX2lkXSA9IG5ld19kYXRhCiAgICBkaWcgMQogICAgYm94X2RlbAogICAgcG9wCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ292ZXJuYW5jZS9jb250cmFjdC5weToxODYKICAgIC8vIEBhYmltZXRob2QoKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5nb3Zlcm5hbmNlLmNvbnRyYWN0LkdvdmVybmFuY2VDb250cmFjdC5jYW5jZWxfcHJvcG9zYWxbcm91dGluZ10oKSAtPiB2b2lkOgpjYW5jZWxfcHJvcG9zYWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ292ZXJuYW5jZS9jb250cmFjdC5weToyMTkKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2dvdmVybmFuY2UvY29udHJhY3QucHk6MjI1CiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBHbG9iYWwuY3JlYXRvcl9hZGRyZXNzLCAiVW5hdXRob3JpemVkIgogICAgdHhuIFNlbmRlcgogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIFVuYXV0aG9yaXplZAogICAgLy8gc21hcnRfY29udHJhY3RzL2dvdmVybmFuY2UvY29udHJhY3QucHk6MjI2CiAgICAvLyBhc3NlcnQgb3AuQm94LmdldChvcC5pdG9iKHByb3Bvc2FsX2lkKSlbMV0sICJQcm9wb3NhbCBub3QgZm91bmQiCiAgICBpdG9iCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIFByb3Bvc2FsIG5vdCBmb3VuZAogICAgLy8gc21hcnRfY29udHJhY3RzL2dvdmVybmFuY2UvY29udHJhY3QucHk6MjI3CiAgICAvLyBwcm9wb3NhbF9kYXRhID0gc2VsZi5wcm9wb3NhbHNbcHJvcG9zYWxfaWRdCiAgICBkdXAKICAgIGJveF9nZXQKICAgIHBvcAogICAgaW50Y18zIC8vIDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ292ZXJuYW5jZS9jb250cmFjdC5weToyMjkKICAgIC8vIGN1cnJlbnRfc3RhdHVzID0gb3AuYnRvaShvcC5leHRyYWN0KHByb3Bvc2FsX2RhdGEsIDY0LCA4KSkKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ292ZXJuYW5jZS9jb250cmFjdC5weToyMzAKICAgIC8vIGFzc2VydCBjdXJyZW50X3N0YXR1cyA8PSBVSW50NjQoMSksICJDYW4gb25seSBjYW5jZWwgYWN0aXZlIHByb3Bvc2FscyIKICAgIGludGNfMSAvLyAxCiAgICA8PQogICAgYXNzZXJ0IC8vIENhbiBvbmx5IGNhbmNlbCBhY3RpdmUgcHJvcG9zYWxzCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ292ZXJuYW5jZS9jb250cmFjdC5weToyMzQKICAgIC8vIG9wLmV4dHJhY3QocHJvcG9zYWxfZGF0YSwgMCwgNjQpCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBpbnRjXzMgLy8gNjQKICAgIGJveF9leHRyYWN0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ292ZXJuYW5jZS9jb250cmFjdC5weToyMzUKICAgIC8vICsgb3AuaXRvYihVSW50NjQoNSkpCiAgICBwdXNoaW50IDUKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nb3Zlcm5hbmNlL2NvbnRyYWN0LnB5OjIzNC0yMzUKICAgIC8vIG9wLmV4dHJhY3QocHJvcG9zYWxfZGF0YSwgMCwgNjQpCiAgICAvLyArIG9wLml0b2IoVUludDY0KDUpKQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ292ZXJuYW5jZS9jb250cmFjdC5weToyMzYKICAgIC8vICsgb3AuZXh0cmFjdChwcm9wb3NhbF9kYXRhLCA3MiwgOCkKICAgIGRpZyAxCiAgICBwdXNoaW50IDcyCiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nb3Zlcm5hbmNlL2NvbnRyYWN0LnB5OjIzNC0yMzYKICAgIC8vIG9wLmV4dHJhY3QocHJvcG9zYWxfZGF0YSwgMCwgNjQpCiAgICAvLyArIG9wLml0b2IoVUludDY0KDUpKQogICAgLy8gKyBvcC5leHRyYWN0KHByb3Bvc2FsX2RhdGEsIDcyLCA4KQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ292ZXJuYW5jZS9jb250cmFjdC5weToyMzgKICAgIC8vIHNlbGYucHJvcG9zYWxzW3Byb3Bvc2FsX2lkXSA9IG5ld19kYXRhCiAgICBkaWcgMQogICAgYm94X2RlbAogICAgcG9wCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ292ZXJuYW5jZS9jb250cmFjdC5weToyMTkKICAgIC8vIEBhYmltZXRob2QoKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5nb3Zlcm5hbmNlLmNvbnRyYWN0LkdvdmVybmFuY2VDb250cmFjdC5jYXN0X3ZvdGVbcm91dGluZ10oKSAtPiB2b2lkOgpjYXN0X3ZvdGU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ292ZXJuYW5jZS9jb250cmFjdC5weToyNDQKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2dvdmVybmFuY2UvY29udHJhY3QucHk6MjU1CiAgICAvLyBhc3NlcnQgb3AuQm94LmdldChvcC5pdG9iKHByb3Bvc2FsX2lkKSlbMV0sICJQcm9wb3NhbCBub3QgZm91bmQiCiAgICBzd2FwCiAgICBpdG9iCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gUHJvcG9zYWwgbm90IGZvdW5kCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ292ZXJuYW5jZS9jb250cmFjdC5weToyNTYKICAgIC8vIHByb3Bvc2FsX2RhdGEgPSBzZWxmLnByb3Bvc2Fsc1twcm9wb3NhbF9pZF0KICAgIGR1cAogICAgYm94X2dldAogICAgcG9wCiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ292ZXJuYW5jZS9jb250cmFjdC5weToyNTgKICAgIC8vIGN1cnJlbnRfc3RhdHVzID0gb3AuYnRvaShvcC5leHRyYWN0KHByb3Bvc2FsX2RhdGEsIDY0LCA4KSkKICAgIGR1cAogICAgaW50Y18zIC8vIDY0CiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGNvdmVyIDMKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gNjQKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ292ZXJuYW5jZS9jb250cmFjdC5weToyNTkKICAgIC8vIGFzc2VydCBjdXJyZW50X3N0YXR1cyA9PSBVSW50NjQoMSksICJOb3QgaW4gdm90aW5nIHBoYXNlIgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gTm90IGluIHZvdGluZyBwaGFzZQogICAgLy8gc21hcnRfY29udHJhY3RzL2dvdmVybmFuY2UvY29udHJhY3QucHk6MjYxLTI2MgogICAgLy8gIyBDaGVjayB2b3RpbmcgcGVyaW9kIGhhc24ndCBleHBpcmVkCiAgICAvLyBjcmVhdGVkX3JvdW5kID0gb3AuYnRvaShvcC5leHRyYWN0KHByb3Bvc2FsX2RhdGEsIDMyLCA4KSkKICAgIGRpZyAxCiAgICBwdXNoaW50IDMyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL2dvdmVybmFuY2UvY29udHJhY3QucHk6MjYzCiAgICAvLyB2b3Rpbmdfc3RhcnQgPSBjcmVhdGVkX3JvdW5kICsgc2VsZi5ESVNDVVNTSU9OX1BFUklPRAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gIkRJU0NVU1NJT05fUEVSSU9EIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLkRJU0NVU1NJT05fUEVSSU9EIGV4aXN0cwogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2dvdmVybmFuY2UvY29udHJhY3QucHk6MjY1CiAgICAvLyBHbG9iYWwucm91bmQgPD0gdm90aW5nX3N0YXJ0ICsgc2VsZi5WT1RJTkdfUEVSSU9ECiAgICBnbG9iYWwgUm91bmQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJWT1RJTkdfUEVSSU9EIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLlZPVElOR19QRVJJT0QgZXhpc3RzCiAgICB1bmNvdmVyIDIKICAgICsKICAgIDw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ292ZXJuYW5jZS9jb250cmFjdC5weToyNjQtMjY2CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIEdsb2JhbC5yb3VuZCA8PSB2b3Rpbmdfc3RhcnQgKyBzZWxmLlZPVElOR19QRVJJT0QKICAgIC8vICksICJWb3RpbmcgcGVyaW9kIGV4cGlyZWQiCiAgICBhc3NlcnQgLy8gVm90aW5nIHBlcmlvZCBleHBpcmVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ292ZXJuYW5jZS9jb250cmFjdC5weToyNjgtMjY5CiAgICAvLyAjIEVuc3VyZSB2b3RlciBoYXNuJ3QgYWxyZWFkeSB2b3RlZAogICAgLy8gdm90ZV9rZXkgPSBvcC5pdG9iKHByb3Bvc2FsX2lkKSArIFR4bi5zZW5kZXIuYnl0ZXMKICAgIHR4biBTZW5kZXIKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2dvdmVybmFuY2UvY29udHJhY3QucHk6MjcwCiAgICAvLyBhc3NlcnQgbm90IG9wLkJveC5nZXQodm90ZV9rZXkpWzFdLCAiQWxyZWFkeSB2b3RlZCIKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gQWxyZWFkeSB2b3RlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2dvdmVybmFuY2UvY29udHJhY3QucHk6Mjc3LTI3OAogICAgLy8gIyBSZWNvcmQgdGhlIHZvdGUKICAgIC8vIHNlbGYudm90ZXNbdm90ZV9rZXldID0gb3AuaXRvYih2b3RlKSArIG9wLml0b2IodmVfcG93ZXIpCiAgICBkaWcgMgogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2dvdmVybmFuY2UvY29udHJhY3QucHk6MjcyLTI3NQogICAgLy8gIyBHZXQgdm90ZXIncyB2ZUNPUlRFWCBwb3dlcgogICAgLy8gIyBJbiBwcm9kdWN0aW9uOiBjcm9zcy1hcHAgY2FsbCB0byBzdGFraW5nIGNvbnRyYWN0CiAgICAvLyAjIFBsYWNlaG9sZGVyOiBlYWNoIHZvdGVyIGdldHMgd2VpZ2h0IG9mIDEKICAgIC8vIHZlX3Bvd2VyID0gVUludDY0KDEpCiAgICBpbnRjXzEgLy8gMQogICAgLy8gc21hcnRfY29udHJhY3RzL2dvdmVybmFuY2UvY29udHJhY3QucHk6Mjc3LTI3OAogICAgLy8gIyBSZWNvcmQgdGhlIHZvdGUKICAgIC8vIHNlbGYudm90ZXNbdm90ZV9rZXldID0gb3AuaXRvYih2b3RlKSArIG9wLml0b2IodmVfcG93ZXIpCiAgICBpdG9iCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nb3Zlcm5hbmNlL2NvbnRyYWN0LnB5OjI4MC0yODEKICAgIC8vICMgVXBkYXRlIHRhbGxpZXMKICAgIC8vIHllc192b3RlcyA9IG9wLmJ0b2kob3AuZXh0cmFjdChwcm9wb3NhbF9kYXRhLCA0OCwgOCkpCiAgICBkdXAKICAgIHB1c2hpbnQgNDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBjb3ZlciAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ292ZXJuYW5jZS9jb250cmFjdC5weToyODIKICAgIC8vIG5vX3ZvdGVzID0gb3AuYnRvaShvcC5leHRyYWN0KHByb3Bvc2FsX2RhdGEsIDU2LCA4KSkKICAgIGR1cAogICAgcHVzaGludCA1NgogICAgZXh0cmFjdF91aW50NjQKICAgIGNvdmVyIDIKICAgIHB1c2hpbnQgNzIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nb3Zlcm5hbmNlL2NvbnRyYWN0LnB5OjI4MwogICAgLy8gdG90YWxfdm90ZXJzID0gb3AuYnRvaShvcC5leHRyYWN0KHByb3Bvc2FsX2RhdGEsIDcyLCA4KSkKICAgIGV4dHJhY3RfdWludDY0CiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ292ZXJuYW5jZS9jb250cmFjdC5weToyODUKICAgIC8vIGlmIHZvdGUgPT0gVUludDY0KDEpOgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBieiBjYXN0X3ZvdGVfZWxzZV9ib2R5QDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nb3Zlcm5hbmNlL2NvbnRyYWN0LnB5OjI4NgogICAgLy8geWVzX3ZvdGVzID0geWVzX3ZvdGVzICsgdmVfcG93ZXIKICAgIGRpZyAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ292ZXJuYW5jZS9jb250cmFjdC5weToyNzItMjc1CiAgICAvLyAjIEdldCB2b3RlcidzIHZlQ09SVEVYIHBvd2VyCiAgICAvLyAjIEluIHByb2R1Y3Rpb246IGNyb3NzLWFwcCBjYWxsIHRvIHN0YWtpbmcgY29udHJhY3QKICAgIC8vICMgUGxhY2Vob2xkZXI6IGVhY2ggdm90ZXIgZ2V0cyB3ZWlnaHQgb2YgMQogICAgLy8gdmVfcG93ZXIgPSBVSW50NjQoMSkKICAgIGludGNfMSAvLyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ292ZXJuYW5jZS9jb250cmFjdC5weToyODYKICAgIC8vIHllc192b3RlcyA9IHllc192b3RlcyArIHZlX3Bvd2VyCiAgICArCiAgICBidXJ5IDMKCmNhc3Rfdm90ZV9hZnRlcl9pZl9lbHNlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ292ZXJuYW5jZS9jb250cmFjdC5weToyOTAKICAgIC8vIHRvdGFsX3ZvdGVycyA9IHRvdGFsX3ZvdGVycyArIFVJbnQ2NCgxKQogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2dvdmVybmFuY2UvY29udHJhY3QucHk6MjkzCiAgICAvLyBvcC5leHRyYWN0KHByb3Bvc2FsX2RhdGEsIDAsIDQ4KQogICAgZGlnIDUKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18wIC8vIDAKICAgIHB1c2hpbnQgNDgKICAgIGJveF9leHRyYWN0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ292ZXJuYW5jZS9jb250cmFjdC5weToyOTQKICAgIC8vICsgb3AuaXRvYih5ZXNfdm90ZXMpCiAgICBkaWcgNQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2dvdmVybmFuY2UvY29udHJhY3QucHk6MjkzLTI5NAogICAgLy8gb3AuZXh0cmFjdChwcm9wb3NhbF9kYXRhLCAwLCA0OCkKICAgIC8vICsgb3AuaXRvYih5ZXNfdm90ZXMpCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nb3Zlcm5hbmNlL2NvbnRyYWN0LnB5OjI5NQogICAgLy8gKyBvcC5pdG9iKG5vX3ZvdGVzKQogICAgZGlnIDQKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nb3Zlcm5hbmNlL2NvbnRyYWN0LnB5OjI5My0yOTUKICAgIC8vIG9wLmV4dHJhY3QocHJvcG9zYWxfZGF0YSwgMCwgNDgpCiAgICAvLyArIG9wLml0b2IoeWVzX3ZvdGVzKQogICAgLy8gKyBvcC5pdG9iKG5vX3ZvdGVzKQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ292ZXJuYW5jZS9jb250cmFjdC5weToyOTMtMjk2CiAgICAvLyBvcC5leHRyYWN0KHByb3Bvc2FsX2RhdGEsIDAsIDQ4KQogICAgLy8gKyBvcC5pdG9iKHllc192b3RlcykKICAgIC8vICsgb3AuaXRvYihub192b3RlcykKICAgIC8vICsgb3AuZXh0cmFjdChwcm9wb3NhbF9kYXRhLCA2NCwgOCkKICAgIGRpZyA2CiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nb3Zlcm5hbmNlL2NvbnRyYWN0LnB5OjI5NwogICAgLy8gKyBvcC5pdG9iKHRvdGFsX3ZvdGVycykKICAgIHN3YXAKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nb3Zlcm5hbmNlL2NvbnRyYWN0LnB5OjI5My0yOTcKICAgIC8vIG9wLmV4dHJhY3QocHJvcG9zYWxfZGF0YSwgMCwgNDgpCiAgICAvLyArIG9wLml0b2IoeWVzX3ZvdGVzKQogICAgLy8gKyBvcC5pdG9iKG5vX3ZvdGVzKQogICAgLy8gKyBvcC5leHRyYWN0KHByb3Bvc2FsX2RhdGEsIDY0LCA4KQogICAgLy8gKyBvcC5pdG9iKHRvdGFsX3ZvdGVycykKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2dvdmVybmFuY2UvY29udHJhY3QucHk6Mjk5CiAgICAvLyBzZWxmLnByb3Bvc2Fsc1twcm9wb3NhbF9pZF0gPSBuZXdfZGF0YQogICAgZGlnIDEKICAgIGJveF9kZWwKICAgIHBvcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2dvdmVybmFuY2UvY29udHJhY3QucHk6MjQ0CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmNhc3Rfdm90ZV9lbHNlX2JvZHlAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nb3Zlcm5hbmNlL2NvbnRyYWN0LnB5OjI4OAogICAgLy8gbm9fdm90ZXMgPSBub192b3RlcyArIHZlX3Bvd2VyCiAgICBkaWcgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2dvdmVybmFuY2UvY29udHJhY3QucHk6MjcyLTI3NQogICAgLy8gIyBHZXQgdm90ZXIncyB2ZUNPUlRFWCBwb3dlcgogICAgLy8gIyBJbiBwcm9kdWN0aW9uOiBjcm9zcy1hcHAgY2FsbCB0byBzdGFraW5nIGNvbnRyYWN0CiAgICAvLyAjIFBsYWNlaG9sZGVyOiBlYWNoIHZvdGVyIGdldHMgd2VpZ2h0IG9mIDEKICAgIC8vIHZlX3Bvd2VyID0gVUludDY0KDEpCiAgICBpbnRjXzEgLy8gMQogICAgLy8gc21hcnRfY29udHJhY3RzL2dvdmVybmFuY2UvY29udHJhY3QucHk6Mjg4CiAgICAvLyBub192b3RlcyA9IG5vX3ZvdGVzICsgdmVfcG93ZXIKICAgICsKICAgIGJ1cnkgMgogICAgYiBjYXN0X3ZvdGVfYWZ0ZXJfaWZfZWxzZUA0CgoKLy8gc21hcnRfY29udHJhY3RzLmdvdmVybmFuY2UuY29udHJhY3QuR292ZXJuYW5jZUNvbnRyYWN0LmdldF9wcm9wb3NhbFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9wcm9wb3NhbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nb3Zlcm5hbmNlL2NvbnRyYWN0LnB5OjMwNQogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2dvdmVybmFuY2UvY29udHJhY3QucHk6MzExCiAgICAvLyBpZiBub3Qgb3AuQm94LmdldChvcC5pdG9iKHByb3Bvc2FsX2lkKSlbMV06CiAgICBpdG9iCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYm56IGdldF9wcm9wb3NhbF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nb3Zlcm5hbmNlL2NvbnRyYWN0LnB5OjMxMgogICAgLy8gcmV0dXJuIEJ5dGVzKGIiIikKICAgIHB1c2hieXRlcyAweAoKZ2V0X3Byb3Bvc2FsX2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzLmdvdmVybmFuY2UuY29udHJhY3QuR292ZXJuYW5jZUNvbnRyYWN0LmdldF9wcm9wb3NhbEA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2dvdmVybmFuY2UvY29udHJhY3QucHk6MzA1CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKZ2V0X3Byb3Bvc2FsX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nb3Zlcm5hbmNlL2NvbnRyYWN0LnB5OjMxMwogICAgLy8gcmV0dXJuIHNlbGYucHJvcG9zYWxzW3Byb3Bvc2FsX2lkXQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcm9wb3NhbHMgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ292ZXJuYW5jZS9jb250cmFjdC5weTozMDUKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgZ2V0X3Byb3Bvc2FsX2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzLmdvdmVybmFuY2UuY29udHJhY3QuR292ZXJuYW5jZUNvbnRyYWN0LmdldF9wcm9wb3NhbEA0CgoKLy8gc21hcnRfY29udHJhY3RzLmdvdmVybmFuY2UuY29udHJhY3QuR292ZXJuYW5jZUNvbnRyYWN0LmdldF9wcm9wb3NhbF9zdGF0dXNbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfcHJvcG9zYWxfc3RhdHVzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2dvdmVybmFuY2UvY29udHJhY3QucHk6MzE1CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ292ZXJuYW5jZS9jb250cmFjdC5weTozMjEKICAgIC8vIGlmIG5vdCBvcC5Cb3guZ2V0KG9wLml0b2IocHJvcG9zYWxfaWQpKVsxXToKICAgIGl0b2IKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBibnogZ2V0X3Byb3Bvc2FsX3N0YXR1c19hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nb3Zlcm5hbmNlL2NvbnRyYWN0LnB5OjMyMgogICAgLy8gcmV0dXJuIFVJbnQ2NCg5OSkKICAgIHB1c2hpbnQgOTkKCmdldF9wcm9wb3NhbF9zdGF0dXNfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMuZ292ZXJuYW5jZS5jb250cmFjdC5Hb3Zlcm5hbmNlQ29udHJhY3QuZ2V0X3Byb3Bvc2FsX3N0YXR1c0A0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2dvdmVybmFuY2UvY29udHJhY3QucHk6MzE1CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBpdG9iCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpnZXRfcHJvcG9zYWxfc3RhdHVzX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nb3Zlcm5hbmNlL2NvbnRyYWN0LnB5OjMyMwogICAgLy8gcHJvcG9zYWxfZGF0YSA9IHNlbGYucHJvcG9zYWxzW3Byb3Bvc2FsX2lkXQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcm9wb3NhbHMgZW50cnkgZXhpc3RzCiAgICBpbnRjXzMgLy8gNjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nb3Zlcm5hbmNlL2NvbnRyYWN0LnB5OjMyNAogICAgLy8gcmV0dXJuIG9wLmJ0b2kob3AuZXh0cmFjdChwcm9wb3NhbF9kYXRhLCA2NCwgOCkpCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL2dvdmVybmFuY2UvY29udHJhY3QucHk6MzE1CiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIGdldF9wcm9wb3NhbF9zdGF0dXNfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMuZ292ZXJuYW5jZS5jb250cmFjdC5Hb3Zlcm5hbmNlQ29udHJhY3QuZ2V0X3Byb3Bvc2FsX3N0YXR1c0A0CgoKLy8gc21hcnRfY29udHJhY3RzLmdvdmVybmFuY2UuY29udHJhY3QuR292ZXJuYW5jZUNvbnRyYWN0LmdldF92b3RlX3RhbGx5W3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X3ZvdGVfdGFsbHk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ292ZXJuYW5jZS9jb250cmFjdC5weTozMjYKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nb3Zlcm5hbmNlL2NvbnRyYWN0LnB5OjMzMwogICAgLy8gaWYgbm90IG9wLkJveC5nZXQob3AuaXRvYihwcm9wb3NhbF9pZCkpWzFdOgogICAgaXRvYgogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJueiBnZXRfdm90ZV90YWxseV9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nb3Zlcm5hbmNlL2NvbnRyYWN0LnB5OjMzNAogICAgLy8gcmV0dXJuIEJ5dGVzKGIiIikKICAgIHB1c2hieXRlcyAweAoKZ2V0X3ZvdGVfdGFsbHlfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMuZ292ZXJuYW5jZS5jb250cmFjdC5Hb3Zlcm5hbmNlQ29udHJhY3QuZ2V0X3ZvdGVfdGFsbHlANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nb3Zlcm5hbmNlL2NvbnRyYWN0LnB5OjMyNgogICAgLy8gQGFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmdldF92b3RlX3RhbGx5X2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nb3Zlcm5hbmNlL2NvbnRyYWN0LnB5OjMzNS0zMzYKICAgIC8vIHByb3Bvc2FsX2RhdGEgPSBzZWxmLnByb3Bvc2Fsc1twcm9wb3NhbF9pZF0KICAgIC8vIHJldHVybiBvcC5leHRyYWN0KHByb3Bvc2FsX2RhdGEsIDQ4LCAxNikKICAgIGR1cAogICAgcHVzaGludHMgNDggMTYKICAgIGJveF9leHRyYWN0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ292ZXJuYW5jZS9jb250cmFjdC5weTozMjYKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgZ2V0X3ZvdGVfdGFsbHlfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMuZ292ZXJuYW5jZS5jb250cmFjdC5Hb3Zlcm5hbmNlQ29udHJhY3QuZ2V0X3ZvdGVfdGFsbHlANAoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5nb3Zlcm5hbmNlLmNvbnRyYWN0LkdvdmVybmFuY2VDb250cmFjdC5nZXRfcHJvcG9zYWxfY291bnRbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfcHJvcG9zYWxfY291bnQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ292ZXJuYW5jZS9jb250cmFjdC5weTozNDEKICAgIC8vIHJldHVybiBzZWxmLnByb3Bvc2FsX2NvdW50CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAicHJvcG9zYWxfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJvcG9zYWxfY291bnQgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ292ZXJuYW5jZS9jb250cmFjdC5weTozMzgKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGl0b2IKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMuZ292ZXJuYW5jZS5jb250cmFjdC5Hb3Zlcm5hbmNlQ29udHJhY3QuaGFzX3ZvdGVkW3JvdXRpbmddKCkgLT4gdm9pZDoKaGFzX3ZvdGVkOgogICAgLy8gc21hcnRfY29udHJhY3RzL2dvdmVybmFuY2UvY29udHJhY3QucHk6MzQzCiAgICAvLyBAYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ292ZXJuYW5jZS9jb250cmFjdC5weTozNDYKICAgIC8vIHZvdGVfa2V5ID0gb3AuaXRvYihwcm9wb3NhbF9pZCkgKyB2b3Rlci5ieXRlcwogICAgc3dhcAogICAgaXRvYgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ292ZXJuYW5jZS9jb250cmFjdC5weTozNDcKICAgIC8vIHJldHVybiBvcC5Cb3guZ2V0KHZvdGVfa2V5KVsxXQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ292ZXJuYW5jZS9jb250cmFjdC5weTozNDMKICAgIC8vIEBhYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHB1c2hieXRlcyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMuZ292ZXJuYW5jZS5jb250cmFjdC5Hb3Zlcm5hbmNlQ29udHJhY3QudXBkYXRlX2dvdmVybmFuY2VfcGFyYW1ldGVyc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnVwZGF0ZV9nb3Zlcm5hbmNlX3BhcmFtZXRlcnM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ292ZXJuYW5jZS9jb250cmFjdC5weTozNTMKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2dvdmVybmFuY2UvY29udHJhY3QucHk6MzY3CiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBHbG9iYWwuY3JlYXRvcl9hZGRyZXNzLCAiVW5hdXRob3JpemVkIgogICAgdHhuIFNlbmRlcgogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIFVuYXV0aG9yaXplZAogICAgLy8gc21hcnRfY29udHJhY3RzL2dvdmVybmFuY2UvY29udHJhY3QucHk6MzY4CiAgICAvLyBhc3NlcnQgZGlzY3Vzc2lvbl9wZXJpb2QgPiBVSW50NjQoMCksICJEaXNjdXNzaW9uIHBlcmlvZCBtdXN0IGJlIHBvc2l0aXZlIgogICAgZGlnIDQKICAgIGFzc2VydCAvLyBEaXNjdXNzaW9uIHBlcmlvZCBtdXN0IGJlIHBvc2l0aXZlCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ292ZXJuYW5jZS9jb250cmFjdC5weTozNjkKICAgIC8vIGFzc2VydCB2b3RpbmdfcGVyaW9kID4gVUludDY0KDApLCAiVm90aW5nIHBlcmlvZCBtdXN0IGJlIHBvc2l0aXZlIgogICAgZGlnIDMKICAgIGFzc2VydCAvLyBWb3RpbmcgcGVyaW9kIG11c3QgYmUgcG9zaXRpdmUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nb3Zlcm5hbmNlL2NvbnRyYWN0LnB5OjM3MAogICAgLy8gYXNzZXJ0IHRpbWVsb2NrX3BlcmlvZCA+IFVJbnQ2NCgwKSwgIlRpbWVsb2NrIG11c3QgYmUgcG9zaXRpdmUiCiAgICBkaWcgMgogICAgYXNzZXJ0IC8vIFRpbWVsb2NrIG11c3QgYmUgcG9zaXRpdmUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nb3Zlcm5hbmNlL2NvbnRyYWN0LnB5OjM3MQogICAgLy8gYXNzZXJ0IHF1b3J1bV9icHMgPD0gVUludDY0KDEwMDAwKSwgIlF1b3J1bSBjYW5ub3QgZXhjZWVkIDEwMCUiCiAgICBkaWcgMQogICAgaW50YyA0IC8vIDEwMDAwCiAgICA8PQogICAgYXNzZXJ0IC8vIFF1b3J1bSBjYW5ub3QgZXhjZWVkIDEwMCUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nb3Zlcm5hbmNlL2NvbnRyYWN0LnB5OjM3MgogICAgLy8gYXNzZXJ0IHN1cGVybWFqb3JpdHlfYnBzID49IFVJbnQ2NCg1MDAwKSwgIk1ham9yaXR5IG11c3QgYmUgYXQgbGVhc3QgNTAlIgogICAgZHVwCiAgICBwdXNoaW50IDUwMDAKICAgID49CiAgICBhc3NlcnQgLy8gTWFqb3JpdHkgbXVzdCBiZSBhdCBsZWFzdCA1MCUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nb3Zlcm5hbmNlL2NvbnRyYWN0LnB5OjM3MwogICAgLy8gYXNzZXJ0IHN1cGVybWFqb3JpdHlfYnBzIDw9IFVJbnQ2NCgxMDAwMCksICJNYWpvcml0eSBjYW5ub3QgZXhjZWVkIDEwMCUiCiAgICBkdXAKICAgIGludGMgNCAvLyAxMDAwMAogICAgPD0KICAgIGFzc2VydCAvLyBNYWpvcml0eSBjYW5ub3QgZXhjZWVkIDEwMCUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nb3Zlcm5hbmNlL2NvbnRyYWN0LnB5OjM3NQogICAgLy8gc2VsZi5ESVNDVVNTSU9OX1BFUklPRCA9IGRpc2N1c3Npb25fcGVyaW9kCiAgICBieXRlY18wIC8vICJESVNDVVNTSU9OX1BFUklPRCIKICAgIHVuY292ZXIgNQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nb3Zlcm5hbmNlL2NvbnRyYWN0LnB5OjM3NgogICAgLy8gc2VsZi5WT1RJTkdfUEVSSU9EID0gdm90aW5nX3BlcmlvZAogICAgYnl0ZWNfMiAvLyAiVk9USU5HX1BFUklPRCIKICAgIHVuY292ZXIgNAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nb3Zlcm5hbmNlL2NvbnRyYWN0LnB5OjM3NwogICAgLy8gc2VsZi5USU1FTE9DS19QRVJJT0QgPSB0aW1lbG9ja19wZXJpb2QKICAgIGJ5dGVjIDUgLy8gIlRJTUVMT0NLX1BFUklPRCIKICAgIHVuY292ZXIgMwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nb3Zlcm5hbmNlL2NvbnRyYWN0LnB5OjM3OAogICAgLy8gc2VsZi5RVU9SVU1fQlBTID0gcXVvcnVtX2JwcwogICAgYnl0ZWMgNyAvLyAiUVVPUlVNX0JQUyIKICAgIHVuY292ZXIgMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nb3Zlcm5hbmNlL2NvbnRyYWN0LnB5OjM3OQogICAgLy8gc2VsZi5TVVBFUk1BSk9SSVRZX0JQUyA9IHN1cGVybWFqb3JpdHlfYnBzCiAgICBieXRlYyA2IC8vICJTVVBFUk1BSk9SSVRZX0JQUyIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ292ZXJuYW5jZS9jb250cmFjdC5weTozNTMKICAgIC8vIEBhYmltZXRob2QoKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgo=", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==" }, "byteCode": { "approval": "CyAFAAEIQJBOJggRRElTQ1VTU0lPTl9QRVJJT0QEFR98dQ1WT1RJTkdfUEVSSU9EDnByb3Bvc2FsX2NvdW50C3N0YWtpbmdfYXBwD1RJTUVMT0NLX1BFUklPRBFTVVBFUk1BSk9SSVRZX0JQUwpRVU9SVU1fQlBTMRhAACUnBCJnKyJnKIHAQ2cqgeCoAWcnBYGg7AFnJweBxBNnJwaBrDRnMRtBAGoxGRREMRhEgg0ECFSa1wTusncCBHj9FOQE9ZEHVgQzi+wjBNjHkIMEundGrATdM7wpBAuwuq8EkloScQRtj7p0BOrC2RMEw3ZI4jYaAI4NAAkAJQB/ALoBLQF6Aa0CSAJvApECuwLGAuwAMRkUMRgUEEM2GgFJFSQSRBcxADIJEkQiJwRlRBREJwRMZyNDNhoBSSJZgQIITBUSRDYaAkkiWYECCEwVEkQ2GgNJFSQSRBcxADIJEkQiK2VEIwgrSwFnMQAyBhZQTwIWUCIWTEsBUEsBUEsBUExQTBZJvEhJTwK/KUxQsCNDNhoBSRUkEkQXFkm9RQFESb5ISYEgW0wlWxREMgYiKGVETwIID0RJIiW6IxZQSwGBSCS6UEsBvEi/I0M2GgFJFSQSRBcWRwK9RQFEvkhJgSBbSwGBMFtJTgNOA0sBgThbTwIlWyMSRCIoZURPAggyBiIqZURPAggPRAhJgQNMQQAVSwIhBAsiJwZlREsDCw9BAASBAkUBSwNJIiW6SwIWUEsBgUgkulBLAbxIvyNDNhoBSRUkEkQXMQAyCRJEFkm9RQFESb5ISYEgW0wlW4ECEkQiKGVECCIqZUQIIicFZUQIMgYOREkiJbqBBBZQSwGBSCS6UEsBvEi/I0M2GgFJFSQSRBcxADIJEkQWSb1FAURJvkglWyMOREkiJbqBBRZQSwGBSCS6UEsBvEi/I0M2GgFJFSQSRBc2GgJJFSQSRBdMFklOAkm9RQFESb5ITEklJLpOA0sBJVsjEkRLAYEgWyIoZUQIMgYiKmVETwIIDkQxAFBJvUUBFERLAhYjFlBLAbxIv0mBMFtOAkmBOFtOAoFIW0wjEkEAJ0sCIwhFA0kjCEsFSU4CIoEwuksFFlBLBBZQSwZQTBZQSwG8SL8jQ0sBIwhFAkL/1jYaAUkVJBJEFxZJvUUBQAAQgABJFRZXBgJMUClMULAjQ0m+REL/7DYaAUkVJBJEFxZJvUUBQAAJgWMWKUxQsCNDSb5EJVtC//E2GgFJFSQSRBcWSb1FAUAAEIAASRUWVwYCTFApTFCwI0NJgwIwELpC/+kiK2VEFilMULAjQzYaAUkVJBJEFzYaAkkVgSASREwWTFC9RQGAAQAiTwJUKUxQsCNDNhoBSRUkEkQXNhoCSRUkEkQXNhoDSRUkEkQXNhoESRUkEkQXNhoFSRUkEkQXMQAyCRJESwRESwNESwJESwEhBA5ESYGIJw9ESSEEDkQoTwVnKk8EZycFTwNnJwdPAmcnBkxnI0M=", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, "minor": 7, "patch": 1 } }, "events": [], "templateVariables": {} }