{ "name": "staking", "structs": { "StakeInfoRecord": [ { "name": "stake", "type": "uint64" }, { "name": "rewardDebt", "type": "uint64" } ] }, "methods": [ { "name": "createApplication", "args": [ { "type": "address", "name": "adminAddress" }, { "type": "uint64", "name": "masterRepoApp" } ], "returns": { "type": "void" }, "actions": { "create": [ "NoOp" ], "call": [] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "initApplication", "args": [ { "type": "uint64", "name": "stakedAssetId" }, { "type": "uint64", "name": "rewardAssetId" }, { "type": "uint64", "name": "rewardAmount" }, { "type": "uint64", "name": "startTime" }, { "type": "uint64", "name": "endTime" }, { "type": "pay", "name": "initialBalanceTxn" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "fundRewards", "args": [ { "type": "axfer", "name": "rewardFundingTxn" }, { "type": "uint64", "name": "rewardAmount" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "fundMoreRewards", "args": [ { "type": "axfer", "name": "rewardFundingTxn" }, { "type": "uint64", "name": "rewardAmount" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "removeRewards", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "setContractActive", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "setContractInactive", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "updateAdminAddress", "args": [ { "type": "address", "name": "adminAddress" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "withdrawPlatformFees", "args": [ { "type": "address", "name": "receiver" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "stake", "args": [ { "type": "axfer", "name": "stakeTxn" }, { "type": "uint64", "name": "quantity" }, { "type": "pay", "name": "mbrTxn" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "claimRewards", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "unstake", "args": [ { "type": "uint64", "name": "quantity" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "deleteApplication", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "DeleteApplication" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "gas", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} } ], "arcs": [ 22, 28 ], "networks": {}, "state": { "schema": { "global": { "ints": 1, "bytes": 20 }, "local": { "ints": 0, "bytes": 0 } }, "keys": { "global": { "staked_asset_id": { "keyType": "AVMString", "valueType": "uint64", "key": "c3Rha2VkX2Fzc2V0X2lk" }, "reward_asset_id": { "keyType": "AVMString", "valueType": "uint64", "key": "cmV3YXJkX2Fzc2V0X2lk" }, "total_staked": { "keyType": "AVMString", "valueType": "uint64", "key": "dG90YWxfc3Rha2Vk" }, "reward_per_token": { "keyType": "AVMString", "valueType": "uint64", "key": "cmV3YXJkX3Blcl90b2tlbg==" }, "start_time": { "keyType": "AVMString", "valueType": "uint64", "key": "c3RhcnRfdGltZQ==" }, "end_time": { "keyType": "AVMString", "valueType": "uint64", "key": "ZW5kX3RpbWU=" }, "last_update_time": { "keyType": "AVMString", "valueType": "uint64", "key": "bGFzdF91cGRhdGVfdGltZQ==" }, "total_rewards": { "keyType": "AVMString", "valueType": "uint64", "key": "dG90YWxfcmV3YXJkcw==" }, "accrued_rewards": { "keyType": "AVMString", "valueType": "uint64", "key": "YWNjcnVlZF9yZXdhcmRz" }, "rewards_exhausted": { "keyType": "AVMString", "valueType": "uint64", "key": "cmV3YXJkc19leGhhdXN0ZWQ=" }, "rewards_paid": { "keyType": "AVMString", "valueType": "uint64", "key": "cmV3YXJkc19wYWlk" }, "rewards_funded": { "keyType": "AVMString", "valueType": "uint64", "key": "cmV3YXJkc19mdW5kZWQ=" }, "initialized": { "keyType": "AVMString", "valueType": "uint64", "key": "aW5pdGlhbGl6ZWQ=" }, "admin_address": { "keyType": "AVMString", "valueType": "address", "key": "YWRtaW5fYWRkcmVzcw==" }, "super_admin_address": { "keyType": "AVMString", "valueType": "address", "key": "c3VwZXJfYWRtaW5fYWRkcmVzcw==" }, "num_stakers": { "keyType": "AVMString", "valueType": "uint64", "key": "bnVtX3N0YWtlcnM=" }, "contract_version": { "keyType": "AVMString", "valueType": "uint64", "key": "Y29udHJhY3RfdmVyc2lvbg==" }, "contract_state": { "keyType": "AVMString", "valueType": "uint64", "key": "Y29udHJhY3Rfc3RhdGU=" }, "master_repo_app": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "bWFzdGVyX3JlcG9fYXBw" }, "platform_fee_bps": { "keyType": "AVMString", "valueType": "uint64", "key": "cGxhdGZvcm1fZmVlX2Jwcw==" }, "platform_fees_accrued": { "keyType": "AVMString", "valueType": "uint64", "key": "cGxhdGZvcm1fZmVlc19hY2NydWVk" } }, "local": {}, "box": {} }, "maps": { "global": {}, "local": {}, "box": { "stakers": { "keyType": "address", "valueType": "StakeInfoRecord", "prefix": "c3Q=" } } } }, "bareActions": { "create": [], "call": [] }, "sourceInfo": { "approval": { "sourceInfo": [ { "pc": [ 666 ], "errorMessage": "Already initialized" }, { "pc": [ 1553, 1568, 1849, 2089 ], "errorMessage": "Box must have value" }, { "pc": [ 1210, 1258 ], "errorMessage": "Bytes has valid prefix" }, { "pc": [ 1172 ], "errorMessage": "Insufficient reward balance" }, { "pc": [ 1269 ], "errorMessage": "Invalid platform fee" }, { "pc": [ 1431 ], "errorMessage": "Invalid quantity" }, { "pc": [ 692, 998 ], "errorMessage": "Invalid reward amount" }, { "pc": [ 718 ], "errorMessage": "Invalid reward asset" }, { "pc": [ 710 ], "errorMessage": "Invalid staked asset" }, { "pc": [ 705 ], "errorMessage": "Invalid time range" }, { "pc": [ 1360 ], "errorMessage": "No fees accrued" }, { "pc": [ 1101 ], "errorMessage": "No rewards to remove" }, { "pc": [ 1862, 2097 ], "errorMessage": "No stake" }, { "pc": [ 1833, 2082 ], "errorMessage": "No stake found for user" }, { "pc": [ 489 ], "errorMessage": "OnCompletion must be DeleteApplication && can only call when not creating" }, { "pc": [ 367 ], "errorMessage": "OnCompletion must be NoOp" }, { "pc": [ 898, 996, 1078 ], "errorMessage": "Only admin can fund rewards" }, { "pc": [ 658 ], "errorMessage": "Only admin can init application" }, { "pc": [ 1146 ], "errorMessage": "Only admin can set active" }, { "pc": [ 1303 ], "errorMessage": "Only admin can set inactive" }, { "pc": [ 1330 ], "errorMessage": "Only admin can update admin address" }, { "pc": [ 2422 ], "errorMessage": "Only super admin can delete application" }, { "pc": [ 1353 ], "errorMessage": "Only super admin can withdraw fees" }, { "pc": [ 1440, 1842 ], "errorMessage": "Pool is inactive" }, { "pc": [ 674, 906, 1086 ], "errorMessage": "Pool must be inactive" }, { "pc": [ 924 ], "errorMessage": "Reward amount mismatch" }, { "pc": [ 914 ], "errorMessage": "Rewards already started" }, { "pc": [ 1448 ], "errorMessage": "Rewards exhausted" }, { "pc": [ 1155 ], "errorMessage": "Rewards not funded" }, { "pc": [ 682, 2430 ], "errorMessage": "Staked assets still exist" }, { "pc": [ 690, 2438 ], "errorMessage": "Stakers exist" }, { "pc": [ 1008 ], "errorMessage": "Staking period ended" }, { "pc": [ 2117 ], "errorMessage": "Unstake amount exceeds balance" }, { "pc": [ 734 ], "errorMessage": "Unsupported asset decimals" }, { "pc": [ 810, 958, 1049, 1484, 1506 ], "errorMessage": "assert target is match for conditions" }, { "pc": [ 656, 663, 671, 679, 687, 893, 903, 911, 919, 946, 994, 1005, 1019, 1037, 1054, 1073, 1083, 1091, 1097, 1107, 1144, 1151, 1160, 1165, 1178, 1226, 1286, 1297, 1328, 1351, 1357, 1369, 1436, 1445, 1472, 1577, 1605, 1610, 1651, 1689, 1701, 1715, 1750, 1764, 1792, 1838, 1870, 1896, 1901, 1942, 1980, 1992, 2006, 2033, 2122, 2148, 2153, 2194, 2232, 2244, 2258, 2286, 2316, 2347, 2382, 2420, 2427, 2435, 2444, 2450, 2473, 2483, 2488, 2520, 2536, 2544, 2558, 2577, 2642, 2680, 2686, 2762, 2779, 2794, 2813, 2819, 2849, 2863, 2875, 2902 ], "errorMessage": "check GlobalState exists" }, { "pc": [ 501, 1216, 1322, 1344 ], "errorMessage": "invalid number of bytes for arc4.static_array" }, { "pc": [ 509, 591, 601, 611, 620, 635, 886, 987, 1263, 1414, 2072 ], "errorMessage": "invalid number of bytes for arc4.uint64" }, { "pc": [ 2701, 2782 ], "errorMessage": "mulDivW: division by zero" }, { "pc": [ 878, 979, 1406 ], "errorMessage": "transaction type is axfer" }, { "pc": [ 650, 1428 ], "errorMessage": "transaction type is pay" } ], "pcOffsetMethod": "none" }, "clear": { "sourceInfo": [], "pcOffsetMethod": "none" } }, "source": { "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCAxIDggNCAxMDAwMDAwMDAwMDAwMDAwIDEwMDAwIDIyNTAwCiAgICBieXRlY2Jsb2NrIDB4MDAwMDAwMDAwMDAwMDAwMCAiYWRtaW5fYWRkcmVzcyIgInJld2FyZHNfcGFpZCIgInBsYXRmb3JtX2ZlZXNfYWNjcnVlZCIgInJld2FyZF9hc3NldF9pZCIgInN0IiAidG90YWxfc3Rha2VkIiAiYWNjcnVlZF9yZXdhcmRzIiAiY29udHJhY3Rfc3RhdGUiICJyZXdhcmRfcGVyX3Rva2VuIiAicmV3YXJkc19leGhhdXN0ZWQiICJ0b3RhbF9yZXdhcmRzIiAibGFzdF91cGRhdGVfdGltZSIgIm51bV9zdGFrZXJzIiAweDAwMDAwMDAwMDAwMDAwMDEgInBsYXRmb3JtX2ZlZV9icHMiICJyZXdhcmRzX2Z1bmRlZCIgInN0YWtlZF9hc3NldF9pZCIgInN1cGVyX2FkbWluX2FkZHJlc3MiICJtYXN0ZXJfcmVwb19hcHAiICJpbml0aWFsaXplZCIgImVuZF90aW1lIiAic3RhcnRfdGltZSIgMHgxNTFmN2M3NQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjIyLTIzCiAgICAvLyBAY29udHJhY3QoeyBuYW1lOiAic3Rha2luZyIsIGF2bVZlcnNpb246IDExIH0pCiAgICAvLyBleHBvcnQgY2xhc3MgU3Rha2luZyBleHRlbmRzIENvbnRyYWN0IHsKICAgIHB1c2hieXRlcyAweDI0ODdjMzJjIC8vIG1ldGhvZCAiZGVsZXRlQXBwbGljYXRpb24oKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX2RlbGV0ZUFwcGxpY2F0aW9uX3JvdXRlQDIKCm1haW5fc3dpdGNoX2Nhc2VfbmV4dEAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjIyLTIzCiAgICAvLyBAY29udHJhY3QoeyBuYW1lOiAic3Rha2luZyIsIGF2bVZlcnNpb246IDExIH0pCiAgICAvLyBleHBvcnQgY2xhc3MgU3Rha2luZyBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gbXVzdCBiZSBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYnogbWFpbl9jcmVhdGVfTm9PcEAxOAogICAgcHVzaGJ5dGVzcyAweDc3YmMyM2NhIDB4ODI2NGM5OGUgMHg3MWJmZmYxMSAweDU2MTM0NDExIDB4YzNiZDdlZDQgMHhkYTI3MDA0YSAweGEzZmVhNDBmIDB4OTA3ZGYzZjYgMHg3YTllZTE4OSAweGE1YWU2YmQxIDB4ODEzY2U4OWEgMHgzMTcyY2E5ZCAvLyBtZXRob2QgImluaXRBcHBsaWNhdGlvbih1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHBheSl2b2lkIiwgbWV0aG9kICJmdW5kUmV3YXJkcyhheGZlcix1aW50NjQpdm9pZCIsIG1ldGhvZCAiZnVuZE1vcmVSZXdhcmRzKGF4ZmVyLHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJyZW1vdmVSZXdhcmRzKCl2b2lkIiwgbWV0aG9kICJzZXRDb250cmFjdEFjdGl2ZSgpdm9pZCIsIG1ldGhvZCAic2V0Q29udHJhY3RJbmFjdGl2ZSgpdm9pZCIsIG1ldGhvZCAidXBkYXRlQWRtaW5BZGRyZXNzKGFkZHJlc3Mpdm9pZCIsIG1ldGhvZCAid2l0aGRyYXdQbGF0Zm9ybUZlZXMoYWRkcmVzcyl2b2lkIiwgbWV0aG9kICJzdGFrZShheGZlcix1aW50NjQscGF5KXZvaWQiLCBtZXRob2QgImNsYWltUmV3YXJkcygpdm9pZCIsIG1ldGhvZCAidW5zdGFrZSh1aW50NjQpdm9pZCIsIG1ldGhvZCAiZ2FzKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggaW5pdEFwcGxpY2F0aW9uIGZ1bmRSZXdhcmRzIGZ1bmRNb3JlUmV3YXJkcyByZW1vdmVSZXdhcmRzIHNldENvbnRyYWN0QWN0aXZlIHNldENvbnRyYWN0SW5hY3RpdmUgdXBkYXRlQWRtaW5BZGRyZXNzIHdpdGhkcmF3UGxhdGZvcm1GZWVzIHN0YWtlIGNsYWltUmV3YXJkcyB1bnN0YWtlIG1haW5fZ2FzX3JvdXRlQDE2CiAgICBlcnIKCm1haW5fZ2FzX3JvdXRlQDE2OgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjU0MgogICAgLy8gQGFiaW1ldGhvZCh7IGFsbG93QWN0aW9uczogIk5vT3AiIH0pCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2NyZWF0ZV9Ob09wQDE4OgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjIyLTIzCiAgICAvLyBAY29udHJhY3QoeyBuYW1lOiAic3Rha2luZyIsIGF2bVZlcnNpb246IDExIH0pCiAgICAvLyBleHBvcnQgY2xhc3MgU3Rha2luZyBleHRlbmRzIENvbnRyYWN0IHsKICAgIHB1c2hieXRlcyAweGNkMTlmMWE2IC8vIG1ldGhvZCAiY3JlYXRlQXBwbGljYXRpb24oYWRkcmVzcyx1aW50NjQpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIGNyZWF0ZUFwcGxpY2F0aW9uCiAgICBlcnIKCm1haW5fZGVsZXRlQXBwbGljYXRpb25fcm91dGVAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czo1MTMKICAgIC8vIEBhYmltZXRob2QoeyBhbGxvd0FjdGlvbnM6ICJEZWxldGVBcHBsaWNhdGlvbiIgfSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIHB1c2hpbnQgNSAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgPT0KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAmJgogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIERlbGV0ZUFwcGxpY2F0aW9uICYmIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGIgZGVsZXRlQXBwbGljYXRpb24KCgovLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6OlN0YWtpbmcuY3JlYXRlQXBwbGljYXRpb25bcm91dGluZ10oKSAtPiB2b2lkOgpjcmVhdGVBcHBsaWNhdGlvbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czo1MgogICAgLy8gQGFiaW1ldGhvZCh7IGFsbG93QWN0aW9uczogIk5vT3AiLCBvbkNyZWF0ZTogInJlcXVpcmUiIH0pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCAzMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6NDMKICAgIC8vIGFkbWluX2FkZHJlc3MgPSBHbG9iYWxTdGF0ZTxBY2NvdW50PigpOwogICAgYnl0ZWNfMSAvLyAiYWRtaW5fYWRkcmVzcyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czo1NAogICAgLy8gdGhpcy5hZG1pbl9hZGRyZXNzLnZhbHVlID0gYWRtaW5BZGRyZXNzLm5hdGl2ZTsKICAgIHVuY292ZXIgMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czo0NgogICAgLy8gY29udHJhY3RfdmVyc2lvbiA9IEdsb2JhbFN0YXRlPFVpbnQ2ND4oKTsKICAgIHB1c2hieXRlc3MgImNvbnRyYWN0X3ZlcnNpb24iIDB4MDAwMDAwMDAwMDAwMGZhMCAvLyAiY29udHJhY3RfdmVyc2lvbiIsIDB4MDAwMDAwMDAwMDAwMGZhMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjU1CiAgICAvLyB0aGlzLmNvbnRyYWN0X3ZlcnNpb24udmFsdWUgPSBuZXcgVWludDY0KFZFUlNJT04pOwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czo0NwogICAgLy8gY29udHJhY3Rfc3RhdGUgPSBHbG9iYWxTdGF0ZTxVaW50NjQ+KCk7IC8vIDAgPSBpbmFjdGl2ZSwgMSA9IGFjdGl2ZQogICAgYnl0ZWMgOCAvLyAiY29udHJhY3Rfc3RhdGUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6NTYKICAgIC8vIHRoaXMuY29udHJhY3Rfc3RhdGUudmFsdWUgPSBuZXcgVWludDY0KDApOwogICAgYnl0ZWNfMCAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6NDgKICAgIC8vIG1hc3Rlcl9yZXBvX2FwcCA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPigpOwogICAgYnl0ZWMgMTkgLy8gIm1hc3Rlcl9yZXBvX2FwcCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czo1NwogICAgLy8gdGhpcy5tYXN0ZXJfcmVwb19hcHAudmFsdWUgPSBtYXN0ZXJSZXBvQXBwOwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czo0OQogICAgLy8gcGxhdGZvcm1fZmVlX2JwcyA9IEdsb2JhbFN0YXRlPFVpbnQ2ND4oKTsKICAgIGJ5dGVjIDE1IC8vICJwbGF0Zm9ybV9mZWVfYnBzIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjU4CiAgICAvLyB0aGlzLnBsYXRmb3JtX2ZlZV9icHMudmFsdWUgPSBuZXcgVWludDY0KDApOwogICAgYnl0ZWNfMCAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6NTAKICAgIC8vIHBsYXRmb3JtX2ZlZXNfYWNjcnVlZCA9IEdsb2JhbFN0YXRlPFVpbnQ2ND4oKTsKICAgIGJ5dGVjXzMgLy8gInBsYXRmb3JtX2ZlZXNfYWNjcnVlZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czo1OQogICAgLy8gdGhpcy5wbGF0Zm9ybV9mZWVzX2FjY3J1ZWQudmFsdWUgPSBuZXcgVWludDY0KDApOwogICAgYnl0ZWNfMCAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MzkKICAgIC8vIHJld2FyZHNfcGFpZCA9IEdsb2JhbFN0YXRlPFVpbnQ2ND4oKTsKICAgIGJ5dGVjXzIgLy8gInJld2FyZHNfcGFpZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czo2MAogICAgLy8gdGhpcy5yZXdhcmRzX3BhaWQudmFsdWUgPSBuZXcgVWludDY0KDApOwogICAgYnl0ZWNfMCAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6NDAKICAgIC8vIHJld2FyZHNfZnVuZGVkID0gR2xvYmFsU3RhdGU8VWludDY0PigpOwogICAgYnl0ZWMgMTYgLy8gInJld2FyZHNfZnVuZGVkIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjYxCiAgICAvLyB0aGlzLnJld2FyZHNfZnVuZGVkLnZhbHVlID0gbmV3IFVpbnQ2NCgwKTsKICAgIGJ5dGVjXzAgLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjQxCiAgICAvLyBpbml0aWFsaXplZCA9IEdsb2JhbFN0YXRlPFVpbnQ2ND4oKTsKICAgIGJ5dGVjIDIwIC8vICJpbml0aWFsaXplZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czo2MgogICAgLy8gdGhpcy5pbml0aWFsaXplZC52YWx1ZSA9IG5ldyBVaW50NjQoMCk7CiAgICBieXRlY18wIC8vIDB4MDAwMDAwMDAwMDAwMDAwMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czoyOQogICAgLy8gdG90YWxfc3Rha2VkID0gR2xvYmFsU3RhdGU8VWludDY0PigpOwogICAgYnl0ZWMgNiAvLyAidG90YWxfc3Rha2VkIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjYzCiAgICAvLyB0aGlzLnRvdGFsX3N0YWtlZC52YWx1ZSA9IG5ldyBVaW50NjQoMCk7CiAgICBieXRlY18wIC8vIDB4MDAwMDAwMDAwMDAwMDAwMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czo0NQogICAgLy8gbnVtX3N0YWtlcnMgPSBHbG9iYWxTdGF0ZTxVaW50NjQ+KCk7CiAgICBieXRlYyAxMyAvLyAibnVtX3N0YWtlcnMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6NjQKICAgIC8vIHRoaXMubnVtX3N0YWtlcnMudmFsdWUgPSBuZXcgVWludDY0KDApOwogICAgYnl0ZWNfMCAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6NTIKICAgIC8vIEBhYmltZXRob2QoeyBhbGxvd0FjdGlvbnM6ICJOb09wIiwgb25DcmVhdGU6ICJyZXF1aXJlIiB9KQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czo6U3Rha2luZy5pbml0QXBwbGljYXRpb25bcm91dGluZ10oKSAtPiB2b2lkOgppbml0QXBwbGljYXRpb246CiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjY3CiAgICAvLyBAYWJpbWV0aG9kKHsgYWxsb3dBY3Rpb25zOiAiTm9PcCIgfSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cG4gMgogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cG4gMgogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cG4gMgogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgY292ZXIgMgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNQogICAgZHVwCiAgICBjb3ZlciAzCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICBjb3ZlciAyCiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGR1cAogICAgY292ZXIgMwogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMSAvLyBwYXkKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBwYXkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czo3NgogICAgLy8gYXNzZXJ0KG9wLlR4bi5zZW5kZXIgPT09IHRoaXMuYWRtaW5fYWRkcmVzcy52YWx1ZSwgIk9ubHkgYWRtaW4gY2FuIGluaXQgYXBwbGljYXRpb24iKTsKICAgIHR4biBTZW5kZXIKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6NDMKICAgIC8vIGFkbWluX2FkZHJlc3MgPSBHbG9iYWxTdGF0ZTxBY2NvdW50PigpOwogICAgYnl0ZWNfMSAvLyAiYWRtaW5fYWRkcmVzcyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czo3NgogICAgLy8gYXNzZXJ0KG9wLlR4bi5zZW5kZXIgPT09IHRoaXMuYWRtaW5fYWRkcmVzcy52YWx1ZSwgIk9ubHkgYWRtaW4gY2FuIGluaXQgYXBwbGljYXRpb24iKTsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICA9PQogICAgYXNzZXJ0IC8vIE9ubHkgYWRtaW4gY2FuIGluaXQgYXBwbGljYXRpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czo3NwogICAgLy8gYXNzZXJ0KHRoaXMuaW5pdGlhbGl6ZWQudmFsdWUuYXNVaW50NjQoKSA9PT0gMCwgIkFscmVhZHkgaW5pdGlhbGl6ZWQiKTsKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6NDEKICAgIC8vIGluaXRpYWxpemVkID0gR2xvYmFsU3RhdGU8VWludDY0PigpOwogICAgYnl0ZWMgMjAgLy8gImluaXRpYWxpemVkIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjc3CiAgICAvLyBhc3NlcnQodGhpcy5pbml0aWFsaXplZC52YWx1ZS5hc1VpbnQ2NCgpID09PSAwLCAiQWxyZWFkeSBpbml0aWFsaXplZCIpOwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGJ0b2kKICAgICEKICAgIGFzc2VydCAvLyBBbHJlYWR5IGluaXRpYWxpemVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6NzgKICAgIC8vIGFzc2VydCh0aGlzLmNvbnRyYWN0X3N0YXRlLnZhbHVlLmFzVWludDY0KCkgPT09IDAsICJQb29sIG11c3QgYmUgaW5hY3RpdmUiKTsKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6NDcKICAgIC8vIGNvbnRyYWN0X3N0YXRlID0gR2xvYmFsU3RhdGU8VWludDY0PigpOyAvLyAwID0gaW5hY3RpdmUsIDEgPSBhY3RpdmUKICAgIGJ5dGVjIDggLy8gImNvbnRyYWN0X3N0YXRlIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjc4CiAgICAvLyBhc3NlcnQodGhpcy5jb250cmFjdF9zdGF0ZS52YWx1ZS5hc1VpbnQ2NCgpID09PSAwLCAiUG9vbCBtdXN0IGJlIGluYWN0aXZlIik7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYnRvaQogICAgIQogICAgYXNzZXJ0IC8vIFBvb2wgbXVzdCBiZSBpbmFjdGl2ZQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjc5CiAgICAvLyBhc3NlcnQodGhpcy50b3RhbF9zdGFrZWQudmFsdWUuYXNVaW50NjQoKSA9PT0gMCwgIlN0YWtlZCBhc3NldHMgc3RpbGwgZXhpc3QiKTsKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MjkKICAgIC8vIHRvdGFsX3N0YWtlZCA9IEdsb2JhbFN0YXRlPFVpbnQ2ND4oKTsKICAgIGJ5dGVjIDYgLy8gInRvdGFsX3N0YWtlZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czo3OQogICAgLy8gYXNzZXJ0KHRoaXMudG90YWxfc3Rha2VkLnZhbHVlLmFzVWludDY0KCkgPT09IDAsICJTdGFrZWQgYXNzZXRzIHN0aWxsIGV4aXN0Iik7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYnRvaQogICAgIQogICAgYXNzZXJ0IC8vIFN0YWtlZCBhc3NldHMgc3RpbGwgZXhpc3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czo4MAogICAgLy8gYXNzZXJ0KHRoaXMubnVtX3N0YWtlcnMudmFsdWUuYXNVaW50NjQoKSA9PT0gMCwgIlN0YWtlcnMgZXhpc3QiKTsKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6NDUKICAgIC8vIG51bV9zdGFrZXJzID0gR2xvYmFsU3RhdGU8VWludDY0PigpOwogICAgYnl0ZWMgMTMgLy8gIm51bV9zdGFrZXJzIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjgwCiAgICAvLyBhc3NlcnQodGhpcy5udW1fc3Rha2Vycy52YWx1ZS5hc1VpbnQ2NCgpID09PSAwLCAiU3Rha2VycyBleGlzdCIpOwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGJ0b2kKICAgICEKICAgIGFzc2VydCAvLyBTdGFrZXJzIGV4aXN0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6ODEKICAgIC8vIGFzc2VydChyZXdhcmRBbW91bnQgPiAwLCAiSW52YWxpZCByZXdhcmQgYW1vdW50Iik7CiAgICBzd2FwCiAgICBhc3NlcnQgLy8gSW52YWxpZCByZXdhcmQgYW1vdW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6ODMKICAgIC8vIGNvbnN0IHN0YXJ0OiB1aW50NjQgPSBzdGFydFRpbWUgPT09IDAgPyBHbG9iYWwubGF0ZXN0VGltZXN0YW1wIDogc3RhcnRUaW1lOwogICAgYm56IGluaXRBcHBsaWNhdGlvbl90ZXJuYXJ5X2ZhbHNlQDMKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGJ1cnkgMTAKCmluaXRBcHBsaWNhdGlvbl90ZXJuYXJ5X21lcmdlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6ODUKICAgIC8vIGFzc2VydChlbmQgPiBzdGFydCwgIkludmFsaWQgdGltZSByYW5nZSIpOwogICAgZGlnIDEKICAgIGRpZyAxMAogICAgPgogICAgYXNzZXJ0IC8vIEludmFsaWQgdGltZSByYW5nZQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjg2CiAgICAvLyBjb25zdCBbc3Rha2VEZWNpbWFscywgaGFzU3Rha2VEZWNpbWFsc10gPSBvcC5Bc3NldFBhcmFtcy5hc3NldERlY2ltYWxzKEFzc2V0KHN0YWtlZEFzc2V0SWQpKTsKICAgIGRpZyA3CiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0RGVjaW1hbHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czo4NwogICAgLy8gYXNzZXJ0KGhhc1N0YWtlRGVjaW1hbHMsICJJbnZhbGlkIHN0YWtlZCBhc3NldCIpOwogICAgYXNzZXJ0IC8vIEludmFsaWQgc3Rha2VkIGFzc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6ODgKICAgIC8vIGNvbnN0IFtyZXdhcmREZWNpbWFscywgaGFzUmV3YXJkRGVjaW1hbHNdID0gb3AuQXNzZXRQYXJhbXMuYXNzZXREZWNpbWFscyhBc3NldChyZXdhcmRBc3NldElkKSk7CiAgICBkaWcgNgogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldERlY2ltYWxzCiAgICBzd2FwCiAgICBidXJ5IDEzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6ODkKICAgIC8vIGFzc2VydChoYXNSZXdhcmREZWNpbWFscywgIkludmFsaWQgcmV3YXJkIGFzc2V0Iik7CiAgICBhc3NlcnQgLy8gSW52YWxpZCByZXdhcmQgYXNzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czo5MAogICAgLy8gYXNzZXJ0KHN0YWtlRGVjaW1hbHMgPD0gMTkgJiYgcmV3YXJkRGVjaW1hbHMgPD0gMTksICJVbnN1cHBvcnRlZCBhc3NldCBkZWNpbWFscyIpOwogICAgcHVzaGludCAxOSAvLyAxOQogICAgPD0KICAgIGJ6IGluaXRBcHBsaWNhdGlvbl9ib29sX2ZhbHNlQDcKICAgIGRpZyAxMAogICAgcHVzaGludCAxOSAvLyAxOQogICAgPD0KICAgIGJ6IGluaXRBcHBsaWNhdGlvbl9ib29sX2ZhbHNlQDcKICAgIGludGNfMSAvLyAxCgppbml0QXBwbGljYXRpb25fYm9vbF9tZXJnZUA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjkwCiAgICAvLyBhc3NlcnQoc3Rha2VEZWNpbWFscyA8PSAxOSAmJiByZXdhcmREZWNpbWFscyA8PSAxOSwgIlVuc3VwcG9ydGVkIGFzc2V0IGRlY2ltYWxzIik7CiAgICBhc3NlcnQgLy8gVW5zdXBwb3J0ZWQgYXNzZXQgZGVjaW1hbHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czoyNgogICAgLy8gc3Rha2VkX2Fzc2V0X2lkID0gR2xvYmFsU3RhdGU8VWludDY0PigpOwogICAgYnl0ZWMgMTcgLy8gInN0YWtlZF9hc3NldF9pZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czo5MgogICAgLy8gdGhpcy5zdGFrZWRfYXNzZXRfaWQudmFsdWUgPSBuZXcgVWludDY0KHN0YWtlZEFzc2V0SWQpOwogICAgZGlnIDkKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MjcKICAgIC8vIHJld2FyZF9hc3NldF9pZCA9IEdsb2JhbFN0YXRlPFVpbnQ2ND4oKTsKICAgIGJ5dGVjIDQgLy8gInJld2FyZF9hc3NldF9pZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czo5MwogICAgLy8gdGhpcy5yZXdhcmRfYXNzZXRfaWQudmFsdWUgPSBuZXcgVWludDY0KHJld2FyZEFzc2V0SWQpOwogICAgZGlnIDcKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MzYKICAgIC8vIHRvdGFsX3Jld2FyZHMgPSBHbG9iYWxTdGF0ZTxVaW50NjQ+KCk7CiAgICBieXRlYyAxMSAvLyAidG90YWxfcmV3YXJkcyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czo5NAogICAgLy8gdGhpcy50b3RhbF9yZXdhcmRzLnZhbHVlID0gbmV3IFVpbnQ2NChyZXdhcmRBbW91bnQpOwogICAgZGlnIDUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6OTUKICAgIC8vIHRoaXMuc3RhcnRfdGltZS52YWx1ZSA9IG5ldyBVaW50NjQoc3RhcnQpOwogICAgZGlnIDkKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czozMgogICAgLy8gc3RhcnRfdGltZSA9IEdsb2JhbFN0YXRlPFVpbnQ2ND4oKTsKICAgIGJ5dGVjIDIyIC8vICJzdGFydF90aW1lIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjk1CiAgICAvLyB0aGlzLnN0YXJ0X3RpbWUudmFsdWUgPSBuZXcgVWludDY0KHN0YXJ0KTsKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjMzCiAgICAvLyBlbmRfdGltZSA9IEdsb2JhbFN0YXRlPFVpbnQ2ND4oKTsKICAgIGJ5dGVjIDIxIC8vICJlbmRfdGltZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czo5NgogICAgLy8gdGhpcy5lbmRfdGltZS52YWx1ZSA9IG5ldyBVaW50NjQoZW5kKTsKICAgIGRpZyA0CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjM0CiAgICAvLyBsYXN0X3VwZGF0ZV90aW1lID0gR2xvYmFsU3RhdGU8VWludDY0PigpOwogICAgYnl0ZWMgMTIgLy8gImxhc3RfdXBkYXRlX3RpbWUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6OTcKICAgIC8vIHRoaXMubGFzdF91cGRhdGVfdGltZS52YWx1ZSA9IG5ldyBVaW50NjQoc3RhcnQpOwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czozMAogICAgLy8gcmV3YXJkX3Blcl90b2tlbiA9IEdsb2JhbFN0YXRlPFVpbnQ2ND4oKTsKICAgIGJ5dGVjIDkgLy8gInJld2FyZF9wZXJfdG9rZW4iCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6OTgKICAgIC8vIHRoaXMucmV3YXJkX3Blcl90b2tlbi52YWx1ZSA9IG5ldyBVaW50NjQoMCk7CiAgICBieXRlY18wIC8vIDB4MDAwMDAwMDAwMDAwMDAwMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czozNwogICAgLy8gYWNjcnVlZF9yZXdhcmRzID0gR2xvYmFsU3RhdGU8VWludDY0PigpOwogICAgYnl0ZWMgNyAvLyAiYWNjcnVlZF9yZXdhcmRzIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjk5CiAgICAvLyB0aGlzLmFjY3J1ZWRfcmV3YXJkcy52YWx1ZSA9IG5ldyBVaW50NjQoMCk7CiAgICBieXRlY18wIC8vIDB4MDAwMDAwMDAwMDAwMDAwMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czo1MAogICAgLy8gcGxhdGZvcm1fZmVlc19hY2NydWVkID0gR2xvYmFsU3RhdGU8VWludDY0PigpOwogICAgYnl0ZWNfMyAvLyAicGxhdGZvcm1fZmVlc19hY2NydWVkIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjEwMAogICAgLy8gdGhpcy5wbGF0Zm9ybV9mZWVzX2FjY3J1ZWQudmFsdWUgPSBuZXcgVWludDY0KDApOwogICAgYnl0ZWNfMCAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MzgKICAgIC8vIHJld2FyZHNfZXhoYXVzdGVkID0gR2xvYmFsU3RhdGU8VWludDY0PigpOwogICAgYnl0ZWMgMTAgLy8gInJld2FyZHNfZXhoYXVzdGVkIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjEwMQogICAgLy8gdGhpcy5yZXdhcmRzX2V4aGF1c3RlZC52YWx1ZSA9IG5ldyBVaW50NjQoMCk7CiAgICBieXRlY18wIC8vIDB4MDAwMDAwMDAwMDAwMDAwMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czozOQogICAgLy8gcmV3YXJkc19wYWlkID0gR2xvYmFsU3RhdGU8VWludDY0PigpOwogICAgYnl0ZWNfMiAvLyAicmV3YXJkc19wYWlkIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjEwMgogICAgLy8gdGhpcy5yZXdhcmRzX3BhaWQudmFsdWUgPSBuZXcgVWludDY0KDApOwogICAgYnl0ZWNfMCAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6NDAKICAgIC8vIHJld2FyZHNfZnVuZGVkID0gR2xvYmFsU3RhdGU8VWludDY0PigpOwogICAgYnl0ZWMgMTYgLy8gInJld2FyZHNfZnVuZGVkIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjEwMwogICAgLy8gdGhpcy5yZXdhcmRzX2Z1bmRlZC52YWx1ZSA9IG5ldyBVaW50NjQoMCk7CiAgICBieXRlY18wIC8vIDB4MDAwMDAwMDAwMDAwMDAwMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czo0MQogICAgLy8gaW5pdGlhbGl6ZWQgPSBHbG9iYWxTdGF0ZTxVaW50NjQ+KCk7CiAgICBieXRlYyAyMCAvLyAiaW5pdGlhbGl6ZWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MTA0CiAgICAvLyB0aGlzLmluaXRpYWxpemVkLnZhbHVlID0gbmV3IFVpbnQ2NCgxKTsKICAgIGJ5dGVjIDE0IC8vIDB4MDAwMDAwMDAwMDAwMDAwMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czoxMDYtMTA5CiAgICAvLyBhc3NlcnRNYXRjaChpbml0aWFsQmFsYW5jZVR4biwgewogICAgLy8gICByZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgIGFtb3VudDogSU5JVElBTF9QQVlfQU1PVU5ULAogICAgLy8gfSk7CiAgICBkdXBuIDIKICAgIGd0eG5zIFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MTA3CiAgICAvLyByZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjEwNi0xMDkKICAgIC8vIGFzc2VydE1hdGNoKGluaXRpYWxCYWxhbmNlVHhuLCB7CiAgICAvLyAgIHJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgYW1vdW50OiBJTklUSUFMX1BBWV9BTU9VTlQsCiAgICAvLyB9KTsKICAgID09CiAgICBzd2FwCiAgICBndHhucyBBbW91bnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czoxMDgKICAgIC8vIGFtb3VudDogSU5JVElBTF9QQVlfQU1PVU5ULAogICAgcHVzaGludCA0MDAwMDAgLy8gNDAwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MTA2LTEwOQogICAgLy8gYXNzZXJ0TWF0Y2goaW5pdGlhbEJhbGFuY2VUeG4sIHsKICAgIC8vICAgcmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICBhbW91bnQ6IElOSVRJQUxfUEFZX0FNT1VOVCwKICAgIC8vIH0pOwogICAgPT0KICAgICYmCiAgICBhc3NlcnQgLy8gYXNzZXJ0IHRhcmdldCBpcyBtYXRjaCBmb3IgY29uZGl0aW9ucwogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjExMS0xMTgKICAgIC8vIGl0eG4KICAgIC8vICAgLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgIHhmZXJBc3NldDogc3Rha2VkQXNzZXRJZCwKICAgIC8vICAgICBhc3NldFJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgICBhc3NldEFtb3VudDogMCwKICAgIC8vICAgICBmZWU6IDAsCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKTsKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czoxMTQKICAgIC8vIGFzc2V0UmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czoxMTUKICAgIC8vIGFzc2V0QW1vdW50OiAwLAogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgZGlnIDcKICAgIGR1cAogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czoxMTEtMTE3CiAgICAvLyBpdHhuCiAgICAvLyAgIC5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgICB4ZmVyQXNzZXQ6IHN0YWtlZEFzc2V0SWQsCiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IDAsCiAgICAvLyAgICAgZmVlOiAwLAogICAgLy8gICB9KQogICAgaW50Y18zIC8vIDQKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czoxMTYKICAgIC8vIGZlZTogMCwKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjExMS0xMTgKICAgIC8vIGl0eG4KICAgIC8vICAgLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgIHhmZXJBc3NldDogc3Rha2VkQXNzZXRJZCwKICAgIC8vICAgICBhc3NldFJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgICBhc3NldEFtb3VudDogMCwKICAgIC8vICAgICBmZWU6IDAsCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKTsKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MTIwCiAgICAvLyBpZiAocmV3YXJkQXNzZXRJZCAhPT0gc3Rha2VkQXNzZXRJZCkgewogICAgZGlnIDYKICAgICE9CiAgICBieiBpbml0QXBwbGljYXRpb25fYWZ0ZXJfaWZfZWxzZUAxMgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjEyMS0xMjgKICAgIC8vIGl0eG4KICAgIC8vICAgLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgIHhmZXJBc3NldDogcmV3YXJkQXNzZXRJZCwKICAgIC8vICAgICBhc3NldFJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgICBhc3NldEFtb3VudDogMCwKICAgIC8vICAgICBmZWU6IDAsCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKTsKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czoxMjQKICAgIC8vIGFzc2V0UmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czoxMjUKICAgIC8vIGFzc2V0QW1vdW50OiAwLAogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgZGlnIDUKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MTIxLTEyNwogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgeGZlckFzc2V0OiByZXdhcmRBc3NldElkLAogICAgLy8gICAgIGFzc2V0UmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIGFzc2V0QW1vdW50OiAwLAogICAgLy8gICAgIGZlZTogMCwKICAgIC8vICAgfSkKICAgIGludGNfMyAvLyA0CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MTI2CiAgICAvLyBmZWU6IDAsCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czoxMjEtMTI4CiAgICAvLyBpdHhuCiAgICAvLyAgIC5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgICB4ZmVyQXNzZXQ6IHJld2FyZEFzc2V0SWQsCiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IDAsCiAgICAvLyAgICAgZmVlOiAwLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCk7CiAgICBpdHhuX3N1Ym1pdAoKaW5pdEFwcGxpY2F0aW9uX2FmdGVyX2lmX2Vsc2VAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6NjcKICAgIC8vIEBhYmltZXRob2QoeyBhbGxvd0FjdGlvbnM6ICJOb09wIiB9KQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKaW5pdEFwcGxpY2F0aW9uX2Jvb2xfZmFsc2VANzoKICAgIGludGNfMCAvLyAwCiAgICBiIGluaXRBcHBsaWNhdGlvbl9ib29sX21lcmdlQDgKCmluaXRBcHBsaWNhdGlvbl90ZXJuYXJ5X2ZhbHNlQDM6CiAgICBkaWcgMwogICAgYnVyeSAxMAogICAgYiBpbml0QXBwbGljYXRpb25fdGVybmFyeV9tZXJnZUA0CgoKLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjpTdGFraW5nLmZ1bmRSZXdhcmRzW3JvdXRpbmddKCkgLT4gdm9pZDoKZnVuZFJld2FyZHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MTMyCiAgICAvLyBAYWJpbWV0aG9kKHsgYWxsb3dBY3Rpb25zOiAiTm9PcCIgfSkKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18zIC8vIGF4ZmVyCiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgYXhmZXIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czoxMzQKICAgIC8vIGFzc2VydChvcC5UeG4uc2VuZGVyID09PSB0aGlzLmFkbWluX2FkZHJlc3MudmFsdWUsICJPbmx5IGFkbWluIGNhbiBmdW5kIHJld2FyZHMiKTsKICAgIHR4biBTZW5kZXIKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6NDMKICAgIC8vIGFkbWluX2FkZHJlc3MgPSBHbG9iYWxTdGF0ZTxBY2NvdW50PigpOwogICAgYnl0ZWNfMSAvLyAiYWRtaW5fYWRkcmVzcyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czoxMzQKICAgIC8vIGFzc2VydChvcC5UeG4uc2VuZGVyID09PSB0aGlzLmFkbWluX2FkZHJlc3MudmFsdWUsICJPbmx5IGFkbWluIGNhbiBmdW5kIHJld2FyZHMiKTsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBzd2FwCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydCAvLyBPbmx5IGFkbWluIGNhbiBmdW5kIHJld2FyZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czoxMzUKICAgIC8vIGFzc2VydCh0aGlzLmNvbnRyYWN0X3N0YXRlLnZhbHVlID09PSBuZXcgVWludDY0KDApLCAiUG9vbCBtdXN0IGJlIGluYWN0aXZlIik7CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjQ3CiAgICAvLyBjb250cmFjdF9zdGF0ZSA9IEdsb2JhbFN0YXRlPFVpbnQ2ND4oKTsgLy8gMCA9IGluYWN0aXZlLCAxID0gYWN0aXZlCiAgICBieXRlYyA4IC8vICJjb250cmFjdF9zdGF0ZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czoxMzUKICAgIC8vIGFzc2VydCh0aGlzLmNvbnRyYWN0X3N0YXRlLnZhbHVlID09PSBuZXcgVWludDY0KDApLCAiUG9vbCBtdXN0IGJlIGluYWN0aXZlIik7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYnl0ZWNfMCAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgID09CiAgICBhc3NlcnQgLy8gUG9vbCBtdXN0IGJlIGluYWN0aXZlCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MTM2CiAgICAvLyBhc3NlcnQodGhpcy5hY2NydWVkX3Jld2FyZHMudmFsdWUuYXNVaW50NjQoKSA9PT0gMCwgIlJld2FyZHMgYWxyZWFkeSBzdGFydGVkIik7CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjM3CiAgICAvLyBhY2NydWVkX3Jld2FyZHMgPSBHbG9iYWxTdGF0ZTxVaW50NjQ+KCk7CiAgICBieXRlYyA3IC8vICJhY2NydWVkX3Jld2FyZHMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MTM2CiAgICAvLyBhc3NlcnQodGhpcy5hY2NydWVkX3Jld2FyZHMudmFsdWUuYXNVaW50NjQoKSA9PT0gMCwgIlJld2FyZHMgYWxyZWFkeSBzdGFydGVkIik7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYnRvaQogICAgIQogICAgYXNzZXJ0IC8vIFJld2FyZHMgYWxyZWFkeSBzdGFydGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MTM3CiAgICAvLyBhc3NlcnQocmV3YXJkQW1vdW50ID09PSB0aGlzLnRvdGFsX3Jld2FyZHMudmFsdWUuYXNVaW50NjQoKSwgIlJld2FyZCBhbW91bnQgbWlzbWF0Y2giKTsKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MzYKICAgIC8vIHRvdGFsX3Jld2FyZHMgPSBHbG9iYWxTdGF0ZTxVaW50NjQ+KCk7CiAgICBieXRlYyAxMSAvLyAidG90YWxfcmV3YXJkcyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czoxMzcKICAgIC8vIGFzc2VydChyZXdhcmRBbW91bnQgPT09IHRoaXMudG90YWxfcmV3YXJkcy52YWx1ZS5hc1VpbnQ2NCgpLCAiUmV3YXJkIGFtb3VudCBtaXNtYXRjaCIpOwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGJ0b2kKICAgIGRpZyAyCiAgICA9PQogICAgYXNzZXJ0IC8vIFJld2FyZCBhbW91bnQgbWlzbWF0Y2gKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czoxMzktMTQ0CiAgICAvLyBhc3NlcnRNYXRjaChyZXdhcmRGdW5kaW5nVHhuLCB7CiAgICAvLyAgIHNlbmRlcjogdGhpcy5hZG1pbl9hZGRyZXNzLnZhbHVlLAogICAgLy8gICBhc3NldFJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgeGZlckFzc2V0OiBBc3NldCh0aGlzLnJld2FyZF9hc3NldF9pZC52YWx1ZS5hc1VpbnQ2NCgpKSwKICAgIC8vICAgYXNzZXRBbW91bnQ6IHJld2FyZEFtb3VudCwKICAgIC8vIH0pOwogICAgZGlnIDIKICAgIGd0eG5zIFNlbmRlcgogICAgPT0KICAgIGRpZyAyCiAgICBndHhucyBBc3NldFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MTQxCiAgICAvLyBhc3NldFJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MTM5LTE0NAogICAgLy8gYXNzZXJ0TWF0Y2gocmV3YXJkRnVuZGluZ1R4biwgewogICAgLy8gICBzZW5kZXI6IHRoaXMuYWRtaW5fYWRkcmVzcy52YWx1ZSwKICAgIC8vICAgYXNzZXRSZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgIHhmZXJBc3NldDogQXNzZXQodGhpcy5yZXdhcmRfYXNzZXRfaWQudmFsdWUuYXNVaW50NjQoKSksCiAgICAvLyAgIGFzc2V0QW1vdW50OiByZXdhcmRBbW91bnQsCiAgICAvLyB9KTsKICAgID09CiAgICAmJgogICAgZGlnIDIKICAgIGd0eG5zIFhmZXJBc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjE0MgogICAgLy8geGZlckFzc2V0OiBBc3NldCh0aGlzLnJld2FyZF9hc3NldF9pZC52YWx1ZS5hc1VpbnQ2NCgpKSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MjcKICAgIC8vIHJld2FyZF9hc3NldF9pZCA9IEdsb2JhbFN0YXRlPFVpbnQ2ND4oKTsKICAgIGJ5dGVjIDQgLy8gInJld2FyZF9hc3NldF9pZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czoxNDIKICAgIC8vIHhmZXJBc3NldDogQXNzZXQodGhpcy5yZXdhcmRfYXNzZXRfaWQudmFsdWUuYXNVaW50NjQoKSksCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjEzOS0xNDQKICAgIC8vIGFzc2VydE1hdGNoKHJld2FyZEZ1bmRpbmdUeG4sIHsKICAgIC8vICAgc2VuZGVyOiB0aGlzLmFkbWluX2FkZHJlc3MudmFsdWUsCiAgICAvLyAgIGFzc2V0UmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICB4ZmVyQXNzZXQ6IEFzc2V0KHRoaXMucmV3YXJkX2Fzc2V0X2lkLnZhbHVlLmFzVWludDY0KCkpLAogICAgLy8gICBhc3NldEFtb3VudDogcmV3YXJkQW1vdW50LAogICAgLy8gfSk7CiAgICA9PQogICAgJiYKICAgIHVuY292ZXIgMgogICAgZ3R4bnMgQXNzZXRBbW91bnQKICAgIHVuY292ZXIgMgogICAgPT0KICAgICYmCiAgICBhc3NlcnQgLy8gYXNzZXJ0IHRhcmdldCBpcyBtYXRjaCBmb3IgY29uZGl0aW9ucwogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjM4CiAgICAvLyByZXdhcmRzX2V4aGF1c3RlZCA9IEdsb2JhbFN0YXRlPFVpbnQ2ND4oKTsKICAgIGJ5dGVjIDEwIC8vICJyZXdhcmRzX2V4aGF1c3RlZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czoxNDUKICAgIC8vIHRoaXMucmV3YXJkc19leGhhdXN0ZWQudmFsdWUgPSBuZXcgVWludDY0KDApOwogICAgYnl0ZWNfMCAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6NDAKICAgIC8vIHJld2FyZHNfZnVuZGVkID0gR2xvYmFsU3RhdGU8VWludDY0PigpOwogICAgYnl0ZWMgMTYgLy8gInJld2FyZHNfZnVuZGVkIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjE0NgogICAgLy8gdGhpcy5yZXdhcmRzX2Z1bmRlZC52YWx1ZSA9IG5ldyBVaW50NjQoMSk7CiAgICBieXRlYyAxNCAvLyAweDAwMDAwMDAwMDAwMDAwMDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MTMyCiAgICAvLyBAYWJpbWV0aG9kKHsgYWxsb3dBY3Rpb25zOiAiTm9PcCIgfSkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6OlN0YWtpbmcuZnVuZE1vcmVSZXdhcmRzW3JvdXRpbmddKCkgLT4gdm9pZDoKZnVuZE1vcmVSZXdhcmRzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjE0OQogICAgLy8gQGFiaW1ldGhvZCh7IGFsbG93QWN0aW9uczogIk5vT3AiIH0pCiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMyAvLyBheGZlcgogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIGF4ZmVyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MTUxCiAgICAvLyBhc3NlcnQob3AuVHhuLnNlbmRlciA9PT0gdGhpcy5hZG1pbl9hZGRyZXNzLnZhbHVlLCAiT25seSBhZG1pbiBjYW4gZnVuZCByZXdhcmRzIik7CiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjQzCiAgICAvLyBhZG1pbl9hZGRyZXNzID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oKTsKICAgIGJ5dGVjXzEgLy8gImFkbWluX2FkZHJlc3MiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MTUxCiAgICAvLyBhc3NlcnQob3AuVHhuLnNlbmRlciA9PT0gdGhpcy5hZG1pbl9hZGRyZXNzLnZhbHVlLCAiT25seSBhZG1pbiBjYW4gZnVuZCByZXdhcmRzIik7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBPbmx5IGFkbWluIGNhbiBmdW5kIHJld2FyZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czoxNTIKICAgIC8vIGFzc2VydChyZXdhcmRBbW91bnQgPiAwLCAiSW52YWxpZCByZXdhcmQgYW1vdW50Iik7CiAgICBkdXAKICAgIGFzc2VydCAvLyBJbnZhbGlkIHJld2FyZCBhbW91bnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czoxNTMKICAgIC8vIGFzc2VydChHbG9iYWwubGF0ZXN0VGltZXN0YW1wIDwgdGhpcy5lbmRfdGltZS52YWx1ZS5hc1VpbnQ2NCgpLCAiU3Rha2luZyBwZXJpb2QgZW5kZWQiKTsKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MzMKICAgIC8vIGVuZF90aW1lID0gR2xvYmFsU3RhdGU8VWludDY0PigpOwogICAgYnl0ZWMgMjEgLy8gImVuZF90aW1lIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjE1MwogICAgLy8gYXNzZXJ0KEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAgPCB0aGlzLmVuZF90aW1lLnZhbHVlLmFzVWludDY0KCksICJTdGFraW5nIHBlcmlvZCBlbmRlZCIpOwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGJ0b2kKICAgIDwKICAgIGFzc2VydCAvLyBTdGFraW5nIHBlcmlvZCBlbmRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjE1NQogICAgLy8gdGhpcy51cGRhdGVQb29sKCk7CiAgICBjYWxsc3ViIHVwZGF0ZVBvb2wKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czoxNTctMTYyCiAgICAvLyBhc3NlcnRNYXRjaChyZXdhcmRGdW5kaW5nVHhuLCB7CiAgICAvLyAgIHNlbmRlcjogdGhpcy5hZG1pbl9hZGRyZXNzLnZhbHVlLAogICAgLy8gICBhc3NldFJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgeGZlckFzc2V0OiBBc3NldCh0aGlzLnJld2FyZF9hc3NldF9pZC52YWx1ZS5hc1VpbnQ2NCgpKSwKICAgIC8vICAgYXNzZXRBbW91bnQ6IHJld2FyZEFtb3VudCwKICAgIC8vIH0pOwogICAgZGlnIDEKICAgIGd0eG5zIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjE1OAogICAgLy8gc2VuZGVyOiB0aGlzLmFkbWluX2FkZHJlc3MudmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjQzCiAgICAvLyBhZG1pbl9hZGRyZXNzID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oKTsKICAgIGJ5dGVjXzEgLy8gImFkbWluX2FkZHJlc3MiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MTU4CiAgICAvLyBzZW5kZXI6IHRoaXMuYWRtaW5fYWRkcmVzcy52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MTU3LTE2MgogICAgLy8gYXNzZXJ0TWF0Y2gocmV3YXJkRnVuZGluZ1R4biwgewogICAgLy8gICBzZW5kZXI6IHRoaXMuYWRtaW5fYWRkcmVzcy52YWx1ZSwKICAgIC8vICAgYXNzZXRSZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgIHhmZXJBc3NldDogQXNzZXQodGhpcy5yZXdhcmRfYXNzZXRfaWQudmFsdWUuYXNVaW50NjQoKSksCiAgICAvLyAgIGFzc2V0QW1vdW50OiByZXdhcmRBbW91bnQsCiAgICAvLyB9KTsKICAgID09CiAgICBkaWcgMgogICAgZ3R4bnMgQXNzZXRSZWNlaXZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjE1OQogICAgLy8gYXNzZXRSZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjE1Ny0xNjIKICAgIC8vIGFzc2VydE1hdGNoKHJld2FyZEZ1bmRpbmdUeG4sIHsKICAgIC8vICAgc2VuZGVyOiB0aGlzLmFkbWluX2FkZHJlc3MudmFsdWUsCiAgICAvLyAgIGFzc2V0UmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICB4ZmVyQXNzZXQ6IEFzc2V0KHRoaXMucmV3YXJkX2Fzc2V0X2lkLnZhbHVlLmFzVWludDY0KCkpLAogICAgLy8gICBhc3NldEFtb3VudDogcmV3YXJkQW1vdW50LAogICAgLy8gfSk7CiAgICA9PQogICAgJiYKICAgIGRpZyAyCiAgICBndHhucyBYZmVyQXNzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czoxNjAKICAgIC8vIHhmZXJBc3NldDogQXNzZXQodGhpcy5yZXdhcmRfYXNzZXRfaWQudmFsdWUuYXNVaW50NjQoKSksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjI3CiAgICAvLyByZXdhcmRfYXNzZXRfaWQgPSBHbG9iYWxTdGF0ZTxVaW50NjQ+KCk7CiAgICBieXRlYyA0IC8vICJyZXdhcmRfYXNzZXRfaWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MTYwCiAgICAvLyB4ZmVyQXNzZXQ6IEFzc2V0KHRoaXMucmV3YXJkX2Fzc2V0X2lkLnZhbHVlLmFzVWludDY0KCkpLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czoxNTctMTYyCiAgICAvLyBhc3NlcnRNYXRjaChyZXdhcmRGdW5kaW5nVHhuLCB7CiAgICAvLyAgIHNlbmRlcjogdGhpcy5hZG1pbl9hZGRyZXNzLnZhbHVlLAogICAgLy8gICBhc3NldFJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgeGZlckFzc2V0OiBBc3NldCh0aGlzLnJld2FyZF9hc3NldF9pZC52YWx1ZS5hc1VpbnQ2NCgpKSwKICAgIC8vICAgYXNzZXRBbW91bnQ6IHJld2FyZEFtb3VudCwKICAgIC8vIH0pOwogICAgPT0KICAgICYmCiAgICB1bmNvdmVyIDIKICAgIGd0eG5zIEFzc2V0QW1vdW50CiAgICBkaWcgMgogICAgPT0KICAgICYmCiAgICBhc3NlcnQgLy8gYXNzZXJ0IHRhcmdldCBpcyBtYXRjaCBmb3IgY29uZGl0aW9ucwogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjE2NAogICAgLy8gdGhpcy50b3RhbF9yZXdhcmRzLnZhbHVlID0gbmV3IFVpbnQ2NCh0aGlzLnRvdGFsX3Jld2FyZHMudmFsdWUuYXNVaW50NjQoKSArIHJld2FyZEFtb3VudCk7CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjM2CiAgICAvLyB0b3RhbF9yZXdhcmRzID0gR2xvYmFsU3RhdGU8VWludDY0PigpOwogICAgYnl0ZWMgMTEgLy8gInRvdGFsX3Jld2FyZHMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MTY0CiAgICAvLyB0aGlzLnRvdGFsX3Jld2FyZHMudmFsdWUgPSBuZXcgVWludDY0KHRoaXMudG90YWxfcmV3YXJkcy52YWx1ZS5hc1VpbnQ2NCgpICsgcmV3YXJkQW1vdW50KTsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBidG9pCiAgICArCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MzYKICAgIC8vIHRvdGFsX3Jld2FyZHMgPSBHbG9iYWxTdGF0ZTxVaW50NjQ+KCk7CiAgICBieXRlYyAxMSAvLyAidG90YWxfcmV3YXJkcyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czoxNjQKICAgIC8vIHRoaXMudG90YWxfcmV3YXJkcy52YWx1ZSA9IG5ldyBVaW50NjQodGhpcy50b3RhbF9yZXdhcmRzLnZhbHVlLmFzVWludDY0KCkgKyByZXdhcmRBbW91bnQpOwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czozOAogICAgLy8gcmV3YXJkc19leGhhdXN0ZWQgPSBHbG9iYWxTdGF0ZTxVaW50NjQ+KCk7CiAgICBieXRlYyAxMCAvLyAicmV3YXJkc19leGhhdXN0ZWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MTY1CiAgICAvLyB0aGlzLnJld2FyZHNfZXhoYXVzdGVkLnZhbHVlID0gbmV3IFVpbnQ2NCgwKTsKICAgIGJ5dGVjXzAgLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjE0OQogICAgLy8gQGFiaW1ldGhvZCh7IGFsbG93QWN0aW9uczogIk5vT3AiIH0pCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjpTdGFraW5nLnJlbW92ZVJld2FyZHNbcm91dGluZ10oKSAtPiB2b2lkOgpyZW1vdmVSZXdhcmRzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjE3MAogICAgLy8gYXNzZXJ0KG9wLlR4bi5zZW5kZXIgPT09IHRoaXMuYWRtaW5fYWRkcmVzcy52YWx1ZSwgIk9ubHkgYWRtaW4gY2FuIGZ1bmQgcmV3YXJkcyIpOwogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czo0MwogICAgLy8gYWRtaW5fYWRkcmVzcyA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KCk7CiAgICBieXRlY18xIC8vICJhZG1pbl9hZGRyZXNzIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjE3MAogICAgLy8gYXNzZXJ0KG9wLlR4bi5zZW5kZXIgPT09IHRoaXMuYWRtaW5fYWRkcmVzcy52YWx1ZSwgIk9ubHkgYWRtaW4gY2FuIGZ1bmQgcmV3YXJkcyIpOwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIHN3YXAKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIE9ubHkgYWRtaW4gY2FuIGZ1bmQgcmV3YXJkcwogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjE3MQogICAgLy8gYXNzZXJ0KHRoaXMuY29udHJhY3Rfc3RhdGUudmFsdWUgPT09IG5ldyBVaW50NjQoMCksICJQb29sIG11c3QgYmUgaW5hY3RpdmUiKTsKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6NDcKICAgIC8vIGNvbnRyYWN0X3N0YXRlID0gR2xvYmFsU3RhdGU8VWludDY0PigpOyAvLyAwID0gaW5hY3RpdmUsIDEgPSBhY3RpdmUKICAgIGJ5dGVjIDggLy8gImNvbnRyYWN0X3N0YXRlIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjE3MQogICAgLy8gYXNzZXJ0KHRoaXMuY29udHJhY3Rfc3RhdGUudmFsdWUgPT09IG5ldyBVaW50NjQoMCksICJQb29sIG11c3QgYmUgaW5hY3RpdmUiKTsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBieXRlY18wIC8vIDB4MDAwMDAwMDAwMDAwMDAwMAogICAgPT0KICAgIGFzc2VydCAvLyBQb29sIG11c3QgYmUgaW5hY3RpdmUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czoxNzMKICAgIC8vIGNvbnN0IGF2YWlsYWJsZTogdWludDY0ID0gdGhpcy50b3RhbF9yZXdhcmRzLnZhbHVlLmFzVWludDY0KCkgLSB0aGlzLmFjY3J1ZWRfcmV3YXJkcy52YWx1ZS5hc1VpbnQ2NCgpOwogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czozNgogICAgLy8gdG90YWxfcmV3YXJkcyA9IEdsb2JhbFN0YXRlPFVpbnQ2ND4oKTsKICAgIGJ5dGVjIDExIC8vICJ0b3RhbF9yZXdhcmRzIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjE3MwogICAgLy8gY29uc3QgYXZhaWxhYmxlOiB1aW50NjQgPSB0aGlzLnRvdGFsX3Jld2FyZHMudmFsdWUuYXNVaW50NjQoKSAtIHRoaXMuYWNjcnVlZF9yZXdhcmRzLnZhbHVlLmFzVWludDY0KCk7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYnRvaQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czozNwogICAgLy8gYWNjcnVlZF9yZXdhcmRzID0gR2xvYmFsU3RhdGU8VWludDY0PigpOwogICAgYnl0ZWMgNyAvLyAiYWNjcnVlZF9yZXdhcmRzIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjE3MwogICAgLy8gY29uc3QgYXZhaWxhYmxlOiB1aW50NjQgPSB0aGlzLnRvdGFsX3Jld2FyZHMudmFsdWUuYXNVaW50NjQoKSAtIHRoaXMuYWNjcnVlZF9yZXdhcmRzLnZhbHVlLmFzVWludDY0KCk7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYnRvaQogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjE3NAogICAgLy8gYXNzZXJ0KGF2YWlsYWJsZSA+IDAsICJObyByZXdhcmRzIHRvIHJlbW92ZSIpOwogICAgZHVwCiAgICBhc3NlcnQgLy8gTm8gcmV3YXJkcyB0byByZW1vdmUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czoxNzUtMTgzCiAgICAvLyBpdHhuCiAgICAvLyAgIC5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgICB4ZmVyQXNzZXQ6IHRoaXMucmV3YXJkX2Fzc2V0X2lkLnZhbHVlLmFzVWludDY0KCksCiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogdGhpcy5hZG1pbl9hZGRyZXNzLnZhbHVlLAogICAgLy8gICAgIHNlbmRlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IGF2YWlsYWJsZSwKICAgIC8vICAgICBmZWU6IDAsCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKTsKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czoxNzcKICAgIC8vIHhmZXJBc3NldDogdGhpcy5yZXdhcmRfYXNzZXRfaWQudmFsdWUuYXNVaW50NjQoKSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MjcKICAgIC8vIHJld2FyZF9hc3NldF9pZCA9IEdsb2JhbFN0YXRlPFVpbnQ2ND4oKTsKICAgIGJ5dGVjIDQgLy8gInJld2FyZF9hc3NldF9pZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czoxNzcKICAgIC8vIHhmZXJBc3NldDogdGhpcy5yZXdhcmRfYXNzZXRfaWQudmFsdWUuYXNVaW50NjQoKSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MTc5CiAgICAvLyBzZW5kZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIHVuY292ZXIgMgogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBTZW5kZXIKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czoxNzUtMTgyCiAgICAvLyBpdHhuCiAgICAvLyAgIC5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgICB4ZmVyQXNzZXQ6IHRoaXMucmV3YXJkX2Fzc2V0X2lkLnZhbHVlLmFzVWludDY0KCksCiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogdGhpcy5hZG1pbl9hZGRyZXNzLnZhbHVlLAogICAgLy8gICAgIHNlbmRlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IGF2YWlsYWJsZSwKICAgIC8vICAgICBmZWU6IDAsCiAgICAvLyAgIH0pCiAgICBpbnRjXzMgLy8gNAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjE4MQogICAgLy8gZmVlOiAwLAogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MTc1LTE4MwogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgeGZlckFzc2V0OiB0aGlzLnJld2FyZF9hc3NldF9pZC52YWx1ZS5hc1VpbnQ2NCgpLAogICAgLy8gICAgIGFzc2V0UmVjZWl2ZXI6IHRoaXMuYWRtaW5fYWRkcmVzcy52YWx1ZSwKICAgIC8vICAgICBzZW5kZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIGFzc2V0QW1vdW50OiBhdmFpbGFibGUsCiAgICAvLyAgICAgZmVlOiAwLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCk7CiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjM4CiAgICAvLyByZXdhcmRzX2V4aGF1c3RlZCA9IEdsb2JhbFN0YXRlPFVpbnQ2ND4oKTsKICAgIGJ5dGVjIDEwIC8vICJyZXdhcmRzX2V4aGF1c3RlZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czoxODQKICAgIC8vIHRoaXMucmV3YXJkc19leGhhdXN0ZWQudmFsdWUgPSBuZXcgVWludDY0KDEpOwogICAgYnl0ZWMgMTQgLy8gMHgwMDAwMDAwMDAwMDAwMDAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjQwCiAgICAvLyByZXdhcmRzX2Z1bmRlZCA9IEdsb2JhbFN0YXRlPFVpbnQ2ND4oKTsKICAgIGJ5dGVjIDE2IC8vICJyZXdhcmRzX2Z1bmRlZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czoxODUKICAgIC8vIHRoaXMucmV3YXJkc19mdW5kZWQudmFsdWUgPSBuZXcgVWludDY0KDApOwogICAgYnl0ZWNfMCAvLyAweDAwMDAwMDAwMDAwMDAwMDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MTY4CiAgICAvLyBAYWJpbWV0aG9kKHsgYWxsb3dBY3Rpb25zOiAiTm9PcCIgfSkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6OlN0YWtpbmcuc2V0Q29udHJhY3RBY3RpdmVbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRDb250cmFjdEFjdGl2ZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czoxOTAKICAgIC8vIGFzc2VydChvcC5UeG4uc2VuZGVyID09PSB0aGlzLmFkbWluX2FkZHJlc3MudmFsdWUsICJPbmx5IGFkbWluIGNhbiBzZXQgYWN0aXZlIik7CiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjQzCiAgICAvLyBhZG1pbl9hZGRyZXNzID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oKTsKICAgIGJ5dGVjXzEgLy8gImFkbWluX2FkZHJlc3MiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MTkwCiAgICAvLyBhc3NlcnQob3AuVHhuLnNlbmRlciA9PT0gdGhpcy5hZG1pbl9hZGRyZXNzLnZhbHVlLCAiT25seSBhZG1pbiBjYW4gc2V0IGFjdGl2ZSIpOwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gT25seSBhZG1pbiBjYW4gc2V0IGFjdGl2ZQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjE5MQogICAgLy8gYXNzZXJ0KHRoaXMucmV3YXJkc19mdW5kZWQudmFsdWUuYXNVaW50NjQoKSA9PT0gMSwgIlJld2FyZHMgbm90IGZ1bmRlZCIpOwogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czo0MAogICAgLy8gcmV3YXJkc19mdW5kZWQgPSBHbG9iYWxTdGF0ZTxVaW50NjQ+KCk7CiAgICBieXRlYyAxNiAvLyAicmV3YXJkc19mdW5kZWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MTkxCiAgICAvLyBhc3NlcnQodGhpcy5yZXdhcmRzX2Z1bmRlZC52YWx1ZS5hc1VpbnQ2NCgpID09PSAxLCAiUmV3YXJkcyBub3QgZnVuZGVkIik7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYnRvaQogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gUmV3YXJkcyBub3QgZnVuZGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MTkyCiAgICAvLyBjb25zdCByZXF1aXJlZFJld2FyZEJhbGFuY2U6IHVpbnQ2NCA9IHRoaXMudG90YWxfcmV3YXJkcy52YWx1ZS5hc1VpbnQ2NCgpIC0gdGhpcy5yZXdhcmRzX3BhaWQudmFsdWUuYXNVaW50NjQoKTsKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MzYKICAgIC8vIHRvdGFsX3Jld2FyZHMgPSBHbG9iYWxTdGF0ZTxVaW50NjQ+KCk7CiAgICBieXRlYyAxMSAvLyAidG90YWxfcmV3YXJkcyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czoxOTIKICAgIC8vIGNvbnN0IHJlcXVpcmVkUmV3YXJkQmFsYW5jZTogdWludDY0ID0gdGhpcy50b3RhbF9yZXdhcmRzLnZhbHVlLmFzVWludDY0KCkgLSB0aGlzLnJld2FyZHNfcGFpZC52YWx1ZS5hc1VpbnQ2NCgpOwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGJ0b2kKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MzkKICAgIC8vIHJld2FyZHNfcGFpZCA9IEdsb2JhbFN0YXRlPFVpbnQ2ND4oKTsKICAgIGJ5dGVjXzIgLy8gInJld2FyZHNfcGFpZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czoxOTIKICAgIC8vIGNvbnN0IHJlcXVpcmVkUmV3YXJkQmFsYW5jZTogdWludDY0ID0gdGhpcy50b3RhbF9yZXdhcmRzLnZhbHVlLmFzVWludDY0KCkgLSB0aGlzLnJld2FyZHNfcGFpZC52YWx1ZS5hc1VpbnQ2NCgpOwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGJ0b2kKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czoxOTMKICAgIC8vIGFzc2VydCh0aGlzLmF2YWlsYWJsZVJld2FyZExpcXVpZGl0eSgpID49IHJlcXVpcmVkUmV3YXJkQmFsYW5jZSwgIkluc3VmZmljaWVudCByZXdhcmQgYmFsYW5jZSIpOwogICAgY2FsbHN1YiBhdmFpbGFibGVSZXdhcmRMaXF1aWRpdHkKICAgIDw9CiAgICBhc3NlcnQgLy8gSW5zdWZmaWNpZW50IHJld2FyZCBiYWxhbmNlCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MTk0LTE5OQogICAgLy8gY29uc3Qgc3VwZXJBZG1pblJlc3VsdCA9IGFiaUNhbGwoewogICAgLy8gICBhcHBJZDogdGhpcy5tYXN0ZXJfcmVwb19hcHAudmFsdWUsCiAgICAvLyAgIG1ldGhvZDogTWFzdGVyUmVwb1N0dWIucHJvdG90eXBlLmdldFN1cGVyQWRtaW5BZGRyZXNzLAogICAgLy8gICBhcmdzOiBbXSwKICAgIC8vICAgZmVlOiAwLAogICAgLy8gfSkucmV0dXJuVmFsdWU7CiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MTk1CiAgICAvLyBhcHBJZDogdGhpcy5tYXN0ZXJfcmVwb19hcHAudmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjQ4CiAgICAvLyBtYXN0ZXJfcmVwb19hcHAgPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oKTsKICAgIGJ5dGVjIDE5IC8vICJtYXN0ZXJfcmVwb19hcHAiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MTk1CiAgICAvLyBhcHBJZDogdGhpcy5tYXN0ZXJfcmVwb19hcHAudmFsdWUsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjE5NC0xOTkKICAgIC8vIGNvbnN0IHN1cGVyQWRtaW5SZXN1bHQgPSBhYmlDYWxsKHsKICAgIC8vICAgYXBwSWQ6IHRoaXMubWFzdGVyX3JlcG9fYXBwLnZhbHVlLAogICAgLy8gICBtZXRob2Q6IE1hc3RlclJlcG9TdHViLnByb3RvdHlwZS5nZXRTdXBlckFkbWluQWRkcmVzcywKICAgIC8vICAgYXJnczogW10sCiAgICAvLyAgIGZlZTogMCwKICAgIC8vIH0pLnJldHVyblZhbHVlOwogICAgcHVzaGJ5dGVzIDB4YjNiM2I3ZTIgLy8gbWV0aG9kICJnZXRTdXBlckFkbWluQWRkcmVzcygpYWRkcmVzcyIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MTk4CiAgICAvLyBmZWU6IDAsCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czoxOTQtMTk5CiAgICAvLyBjb25zdCBzdXBlckFkbWluUmVzdWx0ID0gYWJpQ2FsbCh7CiAgICAvLyAgIGFwcElkOiB0aGlzLm1hc3Rlcl9yZXBvX2FwcC52YWx1ZSwKICAgIC8vICAgbWV0aG9kOiBNYXN0ZXJSZXBvU3R1Yi5wcm90b3R5cGUuZ2V0U3VwZXJBZG1pbkFkZHJlc3MsCiAgICAvLyAgIGFyZ3M6IFtdLAogICAgLy8gICBmZWU6IDAsCiAgICAvLyB9KS5yZXR1cm5WYWx1ZTsKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlYyAyMyAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEJ5dGVzIGhhcyB2YWxpZCBwcmVmaXgKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czo0NAogICAgLy8gc3VwZXJfYWRtaW5fYWRkcmVzcyA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KCk7CiAgICBieXRlYyAxOCAvLyAic3VwZXJfYWRtaW5fYWRkcmVzcyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czoyMDAKICAgIC8vIHRoaXMuc3VwZXJfYWRtaW5fYWRkcmVzcy52YWx1ZSA9IHN1cGVyQWRtaW5SZXN1bHQ7CiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjIwMi0yMDcKICAgIC8vIGNvbnN0IHBsYXRmb3JtRmVlUmVzdWx0ID0gYWJpQ2FsbCh7CiAgICAvLyAgIGFwcElkOiB0aGlzLm1hc3Rlcl9yZXBvX2FwcC52YWx1ZSwKICAgIC8vICAgbWV0aG9kOiBNYXN0ZXJSZXBvU3R1Yi5wcm90b3R5cGUuZ2V0UGxhdGZvcm1GZWVCcHMsCiAgICAvLyAgIGFyZ3M6IFtdLAogICAgLy8gICBmZWU6IDAsCiAgICAvLyB9KS5yZXR1cm5WYWx1ZTsKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czoyMDMKICAgIC8vIGFwcElkOiB0aGlzLm1hc3Rlcl9yZXBvX2FwcC52YWx1ZSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6NDgKICAgIC8vIG1hc3Rlcl9yZXBvX2FwcCA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPigpOwogICAgYnl0ZWMgMTkgLy8gIm1hc3Rlcl9yZXBvX2FwcCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czoyMDMKICAgIC8vIGFwcElkOiB0aGlzLm1hc3Rlcl9yZXBvX2FwcC52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MjAyLTIwNwogICAgLy8gY29uc3QgcGxhdGZvcm1GZWVSZXN1bHQgPSBhYmlDYWxsKHsKICAgIC8vICAgYXBwSWQ6IHRoaXMubWFzdGVyX3JlcG9fYXBwLnZhbHVlLAogICAgLy8gICBtZXRob2Q6IE1hc3RlclJlcG9TdHViLnByb3RvdHlwZS5nZXRQbGF0Zm9ybUZlZUJwcywKICAgIC8vICAgYXJnczogW10sCiAgICAvLyAgIGZlZTogMCwKICAgIC8vIH0pLnJldHVyblZhbHVlOwogICAgcHVzaGJ5dGVzIDB4ZjEzMzAzOGQgLy8gbWV0aG9kICJnZXRQbGF0Zm9ybUZlZUJwcygpdWludDY0IgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czoyMDYKICAgIC8vIGZlZTogMCwKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjIwMi0yMDcKICAgIC8vIGNvbnN0IHBsYXRmb3JtRmVlUmVzdWx0ID0gYWJpQ2FsbCh7CiAgICAvLyAgIGFwcElkOiB0aGlzLm1hc3Rlcl9yZXBvX2FwcC52YWx1ZSwKICAgIC8vICAgbWV0aG9kOiBNYXN0ZXJSZXBvU3R1Yi5wcm90b3R5cGUuZ2V0UGxhdGZvcm1GZWVCcHMsCiAgICAvLyAgIGFyZ3M6IFtdLAogICAgLy8gICBmZWU6IDAsCiAgICAvLyB9KS5yZXR1cm5WYWx1ZTsKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlYyAyMyAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEJ5dGVzIGhhcyB2YWxpZCBwcmVmaXgKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czoyMDgKICAgIC8vIGFzc2VydChwbGF0Zm9ybUZlZVJlc3VsdC5hc1VpbnQ2NCgpIDw9IDEwXzAwMCwgIkludmFsaWQgcGxhdGZvcm0gZmVlIik7CiAgICBkdXAKICAgIGJ0b2kKICAgIGludGMgNSAvLyAxMDAwMAogICAgPD0KICAgIGFzc2VydCAvLyBJbnZhbGlkIHBsYXRmb3JtIGZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjQ5CiAgICAvLyBwbGF0Zm9ybV9mZWVfYnBzID0gR2xvYmFsU3RhdGU8VWludDY0PigpOwogICAgYnl0ZWMgMTUgLy8gInBsYXRmb3JtX2ZlZV9icHMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MjA5CiAgICAvLyB0aGlzLnBsYXRmb3JtX2ZlZV9icHMudmFsdWUgPSBwbGF0Zm9ybUZlZVJlc3VsdDsKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6NDcKICAgIC8vIGNvbnRyYWN0X3N0YXRlID0gR2xvYmFsU3RhdGU8VWludDY0PigpOyAvLyAwID0gaW5hY3RpdmUsIDEgPSBhY3RpdmUKICAgIGJ5dGVjIDggLy8gImNvbnRyYWN0X3N0YXRlIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjIxMAogICAgLy8gdGhpcy5jb250cmFjdF9zdGF0ZS52YWx1ZSA9IG5ldyBVaW50NjQoMSk7CiAgICBieXRlYyAxNCAvLyAweDAwMDAwMDAwMDAwMDAwMDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MTg4CiAgICAvLyBAYWJpbWV0aG9kKHsgYWxsb3dBY3Rpb25zOiAiTm9PcCIgfSkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6OlN0YWtpbmcuc2V0Q29udHJhY3RJbmFjdGl2ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnNldENvbnRyYWN0SW5hY3RpdmU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MjE1CiAgICAvLyBhc3NlcnQob3AuVHhuLnNlbmRlciA9PT0gdGhpcy5hZG1pbl9hZGRyZXNzLnZhbHVlIHx8IG9wLlR4bi5zZW5kZXIgPT09IHRoaXMuc3VwZXJfYWRtaW5fYWRkcmVzcy52YWx1ZSwgIk9ubHkgYWRtaW4gY2FuIHNldCBpbmFjdGl2ZSIpOwogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czo0MwogICAgLy8gYWRtaW5fYWRkcmVzcyA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KCk7CiAgICBieXRlY18xIC8vICJhZG1pbl9hZGRyZXNzIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjIxNQogICAgLy8gYXNzZXJ0KG9wLlR4bi5zZW5kZXIgPT09IHRoaXMuYWRtaW5fYWRkcmVzcy52YWx1ZSB8fCBvcC5UeG4uc2VuZGVyID09PSB0aGlzLnN1cGVyX2FkbWluX2FkZHJlc3MudmFsdWUsICJPbmx5IGFkbWluIGNhbiBzZXQgaW5hY3RpdmUiKTsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICA9PQogICAgYm56IHNldENvbnRyYWN0SW5hY3RpdmVfYm9vbF90cnVlQDMKICAgIHR4biBTZW5kZXIKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6NDQKICAgIC8vIHN1cGVyX2FkbWluX2FkZHJlc3MgPSBHbG9iYWxTdGF0ZTxBY2NvdW50PigpOwogICAgYnl0ZWMgMTggLy8gInN1cGVyX2FkbWluX2FkZHJlc3MiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MjE1CiAgICAvLyBhc3NlcnQob3AuVHhuLnNlbmRlciA9PT0gdGhpcy5hZG1pbl9hZGRyZXNzLnZhbHVlIHx8IG9wLlR4bi5zZW5kZXIgPT09IHRoaXMuc3VwZXJfYWRtaW5fYWRkcmVzcy52YWx1ZSwgIk9ubHkgYWRtaW4gY2FuIHNldCBpbmFjdGl2ZSIpOwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgID09CiAgICBieiBzZXRDb250cmFjdEluYWN0aXZlX2Jvb2xfZmFsc2VANAoKc2V0Q29udHJhY3RJbmFjdGl2ZV9ib29sX3RydWVAMzoKICAgIGludGNfMSAvLyAxCgpzZXRDb250cmFjdEluYWN0aXZlX2Jvb2xfbWVyZ2VANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czoyMTUKICAgIC8vIGFzc2VydChvcC5UeG4uc2VuZGVyID09PSB0aGlzLmFkbWluX2FkZHJlc3MudmFsdWUgfHwgb3AuVHhuLnNlbmRlciA9PT0gdGhpcy5zdXBlcl9hZG1pbl9hZGRyZXNzLnZhbHVlLCAiT25seSBhZG1pbiBjYW4gc2V0IGluYWN0aXZlIik7CiAgICBhc3NlcnQgLy8gT25seSBhZG1pbiBjYW4gc2V0IGluYWN0aXZlCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6NDcKICAgIC8vIGNvbnRyYWN0X3N0YXRlID0gR2xvYmFsU3RhdGU8VWludDY0PigpOyAvLyAwID0gaW5hY3RpdmUsIDEgPSBhY3RpdmUKICAgIGJ5dGVjIDggLy8gImNvbnRyYWN0X3N0YXRlIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjIxNgogICAgLy8gdGhpcy5jb250cmFjdF9zdGF0ZS52YWx1ZSA9IG5ldyBVaW50NjQoMCk7CiAgICBieXRlY18wIC8vIDB4MDAwMDAwMDAwMDAwMDAwMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czoyMTMKICAgIC8vIEBhYmltZXRob2QoeyBhbGxvd0FjdGlvbnM6ICJOb09wIiB9KQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKc2V0Q29udHJhY3RJbmFjdGl2ZV9ib29sX2ZhbHNlQDQ6CiAgICBpbnRjXzAgLy8gMAogICAgYiBzZXRDb250cmFjdEluYWN0aXZlX2Jvb2xfbWVyZ2VANQoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czo6U3Rha2luZy51cGRhdGVBZG1pbkFkZHJlc3Nbcm91dGluZ10oKSAtPiB2b2lkOgp1cGRhdGVBZG1pbkFkZHJlc3M6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MjE5CiAgICAvLyBAYWJpbWV0aG9kKHsgYWxsb3dBY3Rpb25zOiAiTm9PcCIgfSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czoyMjEKICAgIC8vIGFzc2VydChvcC5UeG4uc2VuZGVyID09PSB0aGlzLmFkbWluX2FkZHJlc3MudmFsdWUsICJPbmx5IGFkbWluIGNhbiB1cGRhdGUgYWRtaW4gYWRkcmVzcyIpOwogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czo0MwogICAgLy8gYWRtaW5fYWRkcmVzcyA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KCk7CiAgICBieXRlY18xIC8vICJhZG1pbl9hZGRyZXNzIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjIyMQogICAgLy8gYXNzZXJ0KG9wLlR4bi5zZW5kZXIgPT09IHRoaXMuYWRtaW5fYWRkcmVzcy52YWx1ZSwgIk9ubHkgYWRtaW4gY2FuIHVwZGF0ZSBhZG1pbiBhZGRyZXNzIik7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBPbmx5IGFkbWluIGNhbiB1cGRhdGUgYWRtaW4gYWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjQzCiAgICAvLyBhZG1pbl9hZGRyZXNzID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oKTsKICAgIGJ5dGVjXzEgLy8gImFkbWluX2FkZHJlc3MiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MjIyCiAgICAvLyB0aGlzLmFkbWluX2FkZHJlc3MudmFsdWUgPSBhZG1pbkFkZHJlc3M7CiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjIxOQogICAgLy8gQGFiaW1ldGhvZCh7IGFsbG93QWN0aW9uczogIk5vT3AiIH0pCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjpTdGFraW5nLndpdGhkcmF3UGxhdGZvcm1GZWVzW3JvdXRpbmddKCkgLT4gdm9pZDoKd2l0aGRyYXdQbGF0Zm9ybUZlZXM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MjI1CiAgICAvLyBAYWJpbWV0aG9kKHsgYWxsb3dBY3Rpb25zOiAiTm9PcCIgfSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czoyMjcKICAgIC8vIGFzc2VydChvcC5UeG4uc2VuZGVyID09PSB0aGlzLnN1cGVyX2FkbWluX2FkZHJlc3MudmFsdWUsICJPbmx5IHN1cGVyIGFkbWluIGNhbiB3aXRoZHJhdyBmZWVzIik7CiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjQ0CiAgICAvLyBzdXBlcl9hZG1pbl9hZGRyZXNzID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oKTsKICAgIGJ5dGVjIDE4IC8vICJzdXBlcl9hZG1pbl9hZGRyZXNzIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjIyNwogICAgLy8gYXNzZXJ0KG9wLlR4bi5zZW5kZXIgPT09IHRoaXMuc3VwZXJfYWRtaW5fYWRkcmVzcy52YWx1ZSwgIk9ubHkgc3VwZXIgYWRtaW4gY2FuIHdpdGhkcmF3IGZlZXMiKTsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICA9PQogICAgYXNzZXJ0IC8vIE9ubHkgc3VwZXIgYWRtaW4gY2FuIHdpdGhkcmF3IGZlZXMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czoyMjgKICAgIC8vIGNvbnN0IGFjY3J1ZWQ6IHVpbnQ2NCA9IHRoaXMucGxhdGZvcm1fZmVlc19hY2NydWVkLnZhbHVlLmFzVWludDY0KCk7CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjUwCiAgICAvLyBwbGF0Zm9ybV9mZWVzX2FjY3J1ZWQgPSBHbG9iYWxTdGF0ZTxVaW50NjQ+KCk7CiAgICBieXRlY18zIC8vICJwbGF0Zm9ybV9mZWVzX2FjY3J1ZWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MjI4CiAgICAvLyBjb25zdCBhY2NydWVkOiB1aW50NjQgPSB0aGlzLnBsYXRmb3JtX2ZlZXNfYWNjcnVlZC52YWx1ZS5hc1VpbnQ2NCgpOwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czoyMjkKICAgIC8vIGFzc2VydChhY2NydWVkID4gMCwgIk5vIGZlZXMgYWNjcnVlZCIpOwogICAgZHVwCiAgICBhc3NlcnQgLy8gTm8gZmVlcyBhY2NydWVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6NTAKICAgIC8vIHBsYXRmb3JtX2ZlZXNfYWNjcnVlZCA9IEdsb2JhbFN0YXRlPFVpbnQ2ND4oKTsKICAgIGJ5dGVjXzMgLy8gInBsYXRmb3JtX2ZlZXNfYWNjcnVlZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czoyMzEKICAgIC8vIHRoaXMucGxhdGZvcm1fZmVlc19hY2NydWVkLnZhbHVlID0gbmV3IFVpbnQ2NCgwKTsKICAgIGJ5dGVjXzAgLy8gMHgwMDAwMDAwMDAwMDAwMDAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjIzMi0yNDAKICAgIC8vIGl0eG4KICAgIC8vICAgLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgIHhmZXJBc3NldDogdGhpcy5yZXdhcmRfYXNzZXRfaWQudmFsdWUuYXNVaW50NjQoKSwKICAgIC8vICAgICBhc3NldFJlY2VpdmVyOiByZWNlaXZlciwKICAgIC8vICAgICBzZW5kZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIGFzc2V0QW1vdW50OiBhY2NydWVkLAogICAgLy8gICAgIGZlZTogMCwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpOwogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjIzNAogICAgLy8geGZlckFzc2V0OiB0aGlzLnJld2FyZF9hc3NldF9pZC52YWx1ZS5hc1VpbnQ2NCgpLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czoyNwogICAgLy8gcmV3YXJkX2Fzc2V0X2lkID0gR2xvYmFsU3RhdGU8VWludDY0PigpOwogICAgYnl0ZWMgNCAvLyAicmV3YXJkX2Fzc2V0X2lkIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjIzNAogICAgLy8geGZlckFzc2V0OiB0aGlzLnJld2FyZF9hc3NldF9pZC52YWx1ZS5hc1VpbnQ2NCgpLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czoyMzYKICAgIC8vIHNlbmRlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgdW5jb3ZlciAyCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBpdHhuX2ZpZWxkIFNlbmRlcgogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjIzMi0yMzkKICAgIC8vIGl0eG4KICAgIC8vICAgLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgIHhmZXJBc3NldDogdGhpcy5yZXdhcmRfYXNzZXRfaWQudmFsdWUuYXNVaW50NjQoKSwKICAgIC8vICAgICBhc3NldFJlY2VpdmVyOiByZWNlaXZlciwKICAgIC8vICAgICBzZW5kZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIGFzc2V0QW1vdW50OiBhY2NydWVkLAogICAgLy8gICAgIGZlZTogMCwKICAgIC8vICAgfSkKICAgIGludGNfMyAvLyA0CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MjM4CiAgICAvLyBmZWU6IDAsCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czoyMzItMjQwCiAgICAvLyBpdHhuCiAgICAvLyAgIC5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgICB4ZmVyQXNzZXQ6IHRoaXMucmV3YXJkX2Fzc2V0X2lkLnZhbHVlLmFzVWludDY0KCksCiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogcmVjZWl2ZXIsCiAgICAvLyAgICAgc2VuZGVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgICBhc3NldEFtb3VudDogYWNjcnVlZCwKICAgIC8vICAgICBmZWU6IDAsCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKTsKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MjI1CiAgICAvLyBAYWJpbWV0aG9kKHsgYWxsb3dBY3Rpb25zOiAiTm9PcCIgfSkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6OlN0YWtpbmcuc3Rha2Vbcm91dGluZ10oKSAtPiB2b2lkOgpzdGFrZToKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MzA5CiAgICAvLyBAYWJpbWV0aG9kKHsgYWxsb3dBY3Rpb25zOiAiTm9PcCIgfSkKICAgIHR4biBHcm91cEluZGV4CiAgICBwdXNoaW50IDIgLy8gMgogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18zIC8vIGF4ZmVyCiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgYXhmZXIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgY292ZXIgMgogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzEgLy8gcGF5CiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgcGF5CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MzExCiAgICAvLyBhc3NlcnQocXVhbnRpdHkgPiAwLCAiSW52YWxpZCBxdWFudGl0eSIpOwogICAgZGlnIDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIHF1YW50aXR5CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MzEyCiAgICAvLyBhc3NlcnQodGhpcy5jb250cmFjdF9zdGF0ZS52YWx1ZS5hc1VpbnQ2NCgpID09PSAxLCAiUG9vbCBpcyBpbmFjdGl2ZSIpOwogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czo0NwogICAgLy8gY29udHJhY3Rfc3RhdGUgPSBHbG9iYWxTdGF0ZTxVaW50NjQ+KCk7IC8vIDAgPSBpbmFjdGl2ZSwgMSA9IGFjdGl2ZQogICAgYnl0ZWMgOCAvLyAiY29udHJhY3Rfc3RhdGUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MzEyCiAgICAvLyBhc3NlcnQodGhpcy5jb250cmFjdF9zdGF0ZS52YWx1ZS5hc1VpbnQ2NCgpID09PSAxLCAiUG9vbCBpcyBpbmFjdGl2ZSIpOwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGJ0b2kKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIFBvb2wgaXMgaW5hY3RpdmUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czozMTMKICAgIC8vIGFzc2VydCh0aGlzLnJld2FyZHNfZXhoYXVzdGVkLnZhbHVlLmFzVWludDY0KCkgPT09IDAsICJSZXdhcmRzIGV4aGF1c3RlZCIpOwogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czozOAogICAgLy8gcmV3YXJkc19leGhhdXN0ZWQgPSBHbG9iYWxTdGF0ZTxVaW50NjQ+KCk7CiAgICBieXRlYyAxMCAvLyAicmV3YXJkc19leGhhdXN0ZWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MzEzCiAgICAvLyBhc3NlcnQodGhpcy5yZXdhcmRzX2V4aGF1c3RlZC52YWx1ZS5hc1VpbnQ2NCgpID09PSAwLCAiUmV3YXJkcyBleGhhdXN0ZWQiKTsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBidG9pCiAgICAhCiAgICBhc3NlcnQgLy8gUmV3YXJkcyBleGhhdXN0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czozMTQtMzE5CiAgICAvLyBhc3NlcnRNYXRjaChzdGFrZVR4biwgewogICAgLy8gICBzZW5kZXI6IG9wLlR4bi5zZW5kZXIsCiAgICAvLyAgIGFzc2V0UmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICB4ZmVyQXNzZXQ6IEFzc2V0KHRoaXMuc3Rha2VkX2Fzc2V0X2lkLnZhbHVlLmFzVWludDY0KCkpLAogICAgLy8gICBhc3NldEFtb3VudDogcXVhbnRpdHksCiAgICAvLyB9KTsKICAgIGRpZyAyCiAgICBndHhucyBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czozMTUKICAgIC8vIHNlbmRlcjogb3AuVHhuLnNlbmRlciwKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czozMTQtMzE5CiAgICAvLyBhc3NlcnRNYXRjaChzdGFrZVR4biwgewogICAgLy8gICBzZW5kZXI6IG9wLlR4bi5zZW5kZXIsCiAgICAvLyAgIGFzc2V0UmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICB4ZmVyQXNzZXQ6IEFzc2V0KHRoaXMuc3Rha2VkX2Fzc2V0X2lkLnZhbHVlLmFzVWludDY0KCkpLAogICAgLy8gICBhc3NldEFtb3VudDogcXVhbnRpdHksCiAgICAvLyB9KTsKICAgID09CiAgICBkaWcgMwogICAgZ3R4bnMgQXNzZXRSZWNlaXZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjMxNgogICAgLy8gYXNzZXRSZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjMxNC0zMTkKICAgIC8vIGFzc2VydE1hdGNoKHN0YWtlVHhuLCB7CiAgICAvLyAgIHNlbmRlcjogb3AuVHhuLnNlbmRlciwKICAgIC8vICAgYXNzZXRSZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgIHhmZXJBc3NldDogQXNzZXQodGhpcy5zdGFrZWRfYXNzZXRfaWQudmFsdWUuYXNVaW50NjQoKSksCiAgICAvLyAgIGFzc2V0QW1vdW50OiBxdWFudGl0eSwKICAgIC8vIH0pOwogICAgPT0KICAgICYmCiAgICBkaWcgMwogICAgZ3R4bnMgWGZlckFzc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MzE3CiAgICAvLyB4ZmVyQXNzZXQ6IEFzc2V0KHRoaXMuc3Rha2VkX2Fzc2V0X2lkLnZhbHVlLmFzVWludDY0KCkpLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czoyNgogICAgLy8gc3Rha2VkX2Fzc2V0X2lkID0gR2xvYmFsU3RhdGU8VWludDY0PigpOwogICAgYnl0ZWMgMTcgLy8gInN0YWtlZF9hc3NldF9pZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czozMTcKICAgIC8vIHhmZXJBc3NldDogQXNzZXQodGhpcy5zdGFrZWRfYXNzZXRfaWQudmFsdWUuYXNVaW50NjQoKSksCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjMxNC0zMTkKICAgIC8vIGFzc2VydE1hdGNoKHN0YWtlVHhuLCB7CiAgICAvLyAgIHNlbmRlcjogb3AuVHhuLnNlbmRlciwKICAgIC8vICAgYXNzZXRSZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgIHhmZXJBc3NldDogQXNzZXQodGhpcy5zdGFrZWRfYXNzZXRfaWQudmFsdWUuYXNVaW50NjQoKSksCiAgICAvLyAgIGFzc2V0QW1vdW50OiBxdWFudGl0eSwKICAgIC8vIH0pOwogICAgPT0KICAgICYmCiAgICB1bmNvdmVyIDMKICAgIGd0eG5zIEFzc2V0QW1vdW50CiAgICB1bmNvdmVyIDMKICAgID09CiAgICAmJgogICAgYXNzZXJ0IC8vIGFzc2VydCB0YXJnZXQgaXMgbWF0Y2ggZm9yIGNvbmRpdGlvbnMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czozMjAtMzI0CiAgICAvLyBhc3NlcnRNYXRjaChtYnJUeG4sIHsKICAgIC8vICAgc2VuZGVyOiBvcC5UeG4uc2VuZGVyLAogICAgLy8gICByZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgIGFtb3VudDogQk9YX0ZFRSwKICAgIC8vIH0pOwogICAgZHVwCiAgICBndHhucyBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czozMjEKICAgIC8vIHNlbmRlcjogb3AuVHhuLnNlbmRlciwKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czozMjAtMzI0CiAgICAvLyBhc3NlcnRNYXRjaChtYnJUeG4sIHsKICAgIC8vICAgc2VuZGVyOiBvcC5UeG4uc2VuZGVyLAogICAgLy8gICByZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgIGFtb3VudDogQk9YX0ZFRSwKICAgIC8vIH0pOwogICAgPT0KICAgIGRpZyAxCiAgICBndHhucyBSZWNlaXZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjMyMgogICAgLy8gcmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czozMjAtMzI0CiAgICAvLyBhc3NlcnRNYXRjaChtYnJUeG4sIHsKICAgIC8vICAgc2VuZGVyOiBvcC5UeG4uc2VuZGVyLAogICAgLy8gICByZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgIGFtb3VudDogQk9YX0ZFRSwKICAgIC8vIH0pOwogICAgPT0KICAgICYmCiAgICBzd2FwCiAgICBndHhucyBBbW91bnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czozMjMKICAgIC8vIGFtb3VudDogQk9YX0ZFRSwKICAgIGludGMgNiAvLyAyMjUwMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjMyMC0zMjQKICAgIC8vIGFzc2VydE1hdGNoKG1iclR4biwgewogICAgLy8gICBzZW5kZXI6IG9wLlR4bi5zZW5kZXIsCiAgICAvLyAgIHJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgYW1vdW50OiBCT1hfRkVFLAogICAgLy8gfSk7CiAgICA9PQogICAgJiYKICAgIGFzc2VydCAvLyBhc3NlcnQgdGFyZ2V0IGlzIG1hdGNoIGZvciBjb25kaXRpb25zCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MjQKICAgIC8vIHN0YWtlcnMgPSBCb3hNYXA8QWNjb3VudCwgU3Rha2VJbmZvUmVjb3JkPih7IGtleVByZWZpeDogInN0IiB9KTsKICAgIGJ5dGVjIDUgLy8gInN0IgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjMyNQogICAgLy8gY29uc3QgZXhpc3RzID0gdGhpcy5zdGFrZXJzKG9wLlR4bi5zZW5kZXIpLmV4aXN0czsKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czoyNAogICAgLy8gc3Rha2VycyA9IEJveE1hcDxBY2NvdW50LCBTdGFrZUluZm9SZWNvcmQ+KHsga2V5UHJlZml4OiAic3QiIH0pOwogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MzI1CiAgICAvLyBjb25zdCBleGlzdHMgPSB0aGlzLnN0YWtlcnMob3AuVHhuLnNlbmRlcikuZXhpc3RzOwogICAgYm94X2xlbgogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjMyNgogICAgLy8gaWYgKGV4aXN0cykgewogICAgYnogc3Rha2VfYWZ0ZXJfaWZfZWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MzI4LTMzNQogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgcmVjZWl2ZXI6IG9wLlR4bi5zZW5kZXIsCiAgICAvLyAgICAgYW1vdW50OiBCT1hfRkVFLAogICAgLy8gICAgIHNlbmRlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgZmVlOiAwLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCk7CiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MzMwCiAgICAvLyByZWNlaXZlcjogb3AuVHhuLnNlbmRlciwKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czozMzIKICAgIC8vIHNlbmRlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgaXR4bl9maWVsZCBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czozMzEKICAgIC8vIGFtb3VudDogQk9YX0ZFRSwKICAgIGludGMgNiAvLyAyMjUwMAogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czozMjgtMzM0CiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICByZWNlaXZlcjogb3AuVHhuLnNlbmRlciwKICAgIC8vICAgICBhbW91bnQ6IEJPWF9GRUUsCiAgICAvLyAgICAgc2VuZGVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgICBmZWU6IDAsCiAgICAvLyAgIH0pCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjMzMwogICAgLy8gZmVlOiAwLAogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MzI4LTMzNQogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgcmVjZWl2ZXI6IG9wLlR4bi5zZW5kZXIsCiAgICAvLyAgICAgYW1vdW50OiBCT1hfRkVFLAogICAgLy8gICAgIHNlbmRlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgZmVlOiAwLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCk7CiAgICBpdHhuX3N1Ym1pdAoKc3Rha2VfYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjMzOAogICAgLy8gdGhpcy51cGRhdGVQb29sKCk7CiAgICBjYWxsc3ViIHVwZGF0ZVBvb2wKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czozNDAKICAgIC8vIGNvbnN0IHByZXZTdGFrZTogdWludDY0ID0gZXhpc3RzID8gdGhpcy5zdGFrZXJzKG9wLlR4bi5zZW5kZXIpLnZhbHVlLnN0YWtlLmFzVWludDY0KCkgOiAwOwogICAgZHVwCiAgICBieiBzdGFrZV90ZXJuYXJ5X2ZhbHNlQDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czoyNAogICAgLy8gc3Rha2VycyA9IEJveE1hcDxBY2NvdW50LCBTdGFrZUluZm9SZWNvcmQ+KHsga2V5UHJlZml4OiAic3QiIH0pOwogICAgYnl0ZWMgNSAvLyAic3QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MzQwCiAgICAvLyBjb25zdCBwcmV2U3Rha2U6IHVpbnQ2NCA9IGV4aXN0cyA/IHRoaXMuc3Rha2VycyhvcC5UeG4uc2VuZGVyKS52YWx1ZS5zdGFrZS5hc1VpbnQ2NCgpIDogMDsKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czoyNAogICAgLy8gc3Rha2VycyA9IEJveE1hcDxBY2NvdW50LCBTdGFrZUluZm9SZWNvcmQ+KHsga2V5UHJlZml4OiAic3QiIH0pOwogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MzQwCiAgICAvLyBjb25zdCBwcmV2U3Rha2U6IHVpbnQ2NCA9IGV4aXN0cyA/IHRoaXMuc3Rha2VycyhvcC5UeG4uc2VuZGVyKS52YWx1ZS5zdGFrZS5hc1VpbnQ2NCgpIDogMDsKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ1cnkgMwoKc3Rha2VfdGVybmFyeV9tZXJnZUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjM0MQogICAgLy8gY29uc3QgcHJldkRlYnQ6IHVpbnQ2NCA9IGV4aXN0cyA/IHRoaXMuc3Rha2VycyhvcC5UeG4uc2VuZGVyKS52YWx1ZS5yZXdhcmREZWJ0LmFzVWludDY0KCkgOiAwOwogICAgZHVwCiAgICBieiBzdGFrZV90ZXJuYXJ5X2ZhbHNlQDkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czoyNAogICAgLy8gc3Rha2VycyA9IEJveE1hcDxBY2NvdW50LCBTdGFrZUluZm9SZWNvcmQ+KHsga2V5UHJlZml4OiAic3QiIH0pOwogICAgYnl0ZWMgNSAvLyAic3QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MzQxCiAgICAvLyBjb25zdCBwcmV2RGVidDogdWludDY0ID0gZXhpc3RzID8gdGhpcy5zdGFrZXJzKG9wLlR4bi5zZW5kZXIpLnZhbHVlLnJld2FyZERlYnQuYXNVaW50NjQoKSA6IDA7CiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MjQKICAgIC8vIHN0YWtlcnMgPSBCb3hNYXA8QWNjb3VudCwgU3Rha2VJbmZvUmVjb3JkPih7IGtleVByZWZpeDogInN0IiB9KTsKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjM0MQogICAgLy8gY29uc3QgcHJldkRlYnQ6IHVpbnQ2NCA9IGV4aXN0cyA/IHRoaXMuc3Rha2VycyhvcC5UeG4uc2VuZGVyKS52YWx1ZS5yZXdhcmREZWJ0LmFzVWludDY0KCkgOiAwOwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnVyeSA0CgpzdGFrZV90ZXJuYXJ5X21lcmdlQDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjM0MgogICAgLy8gY29uc3QgYWNjcnVlZCA9IG11bERpdlcocHJldlN0YWtlLCB0aGlzLnJld2FyZF9wZXJfdG9rZW4udmFsdWUuYXNVaW50NjQoKSwgUFJFQ0lTSU9OKTsKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MzAKICAgIC8vIHJld2FyZF9wZXJfdG9rZW4gPSBHbG9iYWxTdGF0ZTxVaW50NjQ+KCk7CiAgICBieXRlYyA5IC8vICJyZXdhcmRfcGVyX3Rva2VuIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjM0MgogICAgLy8gY29uc3QgYWNjcnVlZCA9IG11bERpdlcocHJldlN0YWtlLCB0aGlzLnJld2FyZF9wZXJfdG9rZW4udmFsdWUuYXNVaW50NjQoKSwgUFJFQ0lTSU9OKTsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb25maWcuYWxnby50czoyOAogICAgLy8gY29uc3QgW2hpLCBsb10gPSBtdWx3KGEsIGIpOwogICAgZGlnIDMKICAgIG11bHcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czozNDIKICAgIC8vIGNvbnN0IGFjY3J1ZWQgPSBtdWxEaXZXKHByZXZTdGFrZSwgdGhpcy5yZXdhcmRfcGVyX3Rva2VuLnZhbHVlLmFzVWludDY0KCksIFBSRUNJU0lPTik7CiAgICBpbnRjIDQgLy8gMTAwMDAwMDAwMDAwMDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29uZmlnLmFsZ28udHM6MjkKICAgIC8vIHJldHVybiBkaXZ3KGhpLCBsbywgYyk7CiAgICBkaXZ3CiAgICBkdXAKICAgIGJ1cnkgMTEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czozNDMKICAgIC8vIGxldCBwZW5kaW5nOiB1aW50NjQgPSBhY2NydWVkID4gcHJldkRlYnQgPyBhY2NydWVkIC0gcHJldkRlYnQgOiAwOwogICAgZGlnIDQKICAgID4KICAgIGJ6IHN0YWtlX3Rlcm5hcnlfZmFsc2VAMTIKICAgIGRpZyA5CiAgICBkaWcgNAogICAgLQogICAgYnVyeSA1CgpzdGFrZV90ZXJuYXJ5X21lcmdlQDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjM0NAogICAgLy8gY29uc3QgcGF5YWJsZTogdWludDY0ID0gdGhpcy5hY2NydWVkX3Jld2FyZHMudmFsdWUuYXNVaW50NjQoKSAtIHRoaXMucmV3YXJkc19wYWlkLnZhbHVlLmFzVWludDY0KCk7CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjM3CiAgICAvLyBhY2NydWVkX3Jld2FyZHMgPSBHbG9iYWxTdGF0ZTxVaW50NjQ+KCk7CiAgICBieXRlYyA3IC8vICJhY2NydWVkX3Jld2FyZHMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MzQ0CiAgICAvLyBjb25zdCBwYXlhYmxlOiB1aW50NjQgPSB0aGlzLmFjY3J1ZWRfcmV3YXJkcy52YWx1ZS5hc1VpbnQ2NCgpIC0gdGhpcy5yZXdhcmRzX3BhaWQudmFsdWUuYXNVaW50NjQoKTsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBidG9pCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjM5CiAgICAvLyByZXdhcmRzX3BhaWQgPSBHbG9iYWxTdGF0ZTxVaW50NjQ+KCk7CiAgICBieXRlY18yIC8vICJyZXdhcmRzX3BhaWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MzQ0CiAgICAvLyBjb25zdCBwYXlhYmxlOiB1aW50NjQgPSB0aGlzLmFjY3J1ZWRfcmV3YXJkcy52YWx1ZS5hc1VpbnQ2NCgpIC0gdGhpcy5yZXdhcmRzX3BhaWQudmFsdWUuYXNVaW50NjQoKTsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBidG9pCiAgICAtCiAgICBkdXAKICAgIGJ1cnkgNwogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjM0NQogICAgLy8gaWYgKHBlbmRpbmcgPiBwYXlhYmxlKSB7CiAgICBkaWcgNQogICAgPAogICAgYnogc3Rha2VfYWZ0ZXJfaWZfZWxzZUAxNQogICAgZGlnIDUKICAgIGJ1cnkgNQoKc3Rha2VfYWZ0ZXJfaWZfZWxzZUAxNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czozNDgKICAgIC8vIGNvbnN0IGxpcXVpZFJld2FyZHMgPSB0aGlzLmF2YWlsYWJsZVJld2FyZExpcXVpZGl0eSgpOwogICAgY2FsbHN1YiBhdmFpbGFibGVSZXdhcmRMaXF1aWRpdHkKICAgIGR1cAogICAgYnVyeSA5CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MzQ5CiAgICAvLyBpZiAocGVuZGluZyA+IGxpcXVpZFJld2FyZHMpIHsKICAgIGRpZyA1CiAgICA8CiAgICBieiBzdGFrZV9hZnRlcl9pZl9lbHNlQDE3CiAgICBkaWcgNwogICAgYnVyeSA1CgpzdGFrZV9hZnRlcl9pZl9lbHNlQDE3OgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjM1MwogICAgLy8gaWYgKHBlbmRpbmcgPiAwKSB7CiAgICBkaWcgNAogICAgYnogc3Rha2VfYWZ0ZXJfaWZfZWxzZUAyNAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjM1NAogICAgLy8gbGV0IGZlZTogdWludDY0ID0gbXVsRGl2VyhwZW5kaW5nLCB0aGlzLnBsYXRmb3JtX2ZlZV9icHMudmFsdWUuYXNVaW50NjQoKSwgMTBfMDAwKTsKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6NDkKICAgIC8vIHBsYXRmb3JtX2ZlZV9icHMgPSBHbG9iYWxTdGF0ZTxVaW50NjQ+KCk7CiAgICBieXRlYyAxNSAvLyAicGxhdGZvcm1fZmVlX2JwcyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czozNTQKICAgIC8vIGxldCBmZWU6IHVpbnQ2NCA9IG11bERpdlcocGVuZGluZywgdGhpcy5wbGF0Zm9ybV9mZWVfYnBzLnZhbHVlLmFzVWludDY0KCksIDEwXzAwMCk7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29uZmlnLmFsZ28udHM6MjgKICAgIC8vIGNvbnN0IFtoaSwgbG9dID0gbXVsdyhhLCBiKTsKICAgIGRpZyA1CiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgbXVsdwogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjM1NAogICAgLy8gbGV0IGZlZTogdWludDY0ID0gbXVsRGl2VyhwZW5kaW5nLCB0aGlzLnBsYXRmb3JtX2ZlZV9icHMudmFsdWUuYXNVaW50NjQoKSwgMTBfMDAwKTsKICAgIGludGMgNSAvLyAxMDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29uZmlnLmFsZ28udHM6MjkKICAgIC8vIHJldHVybiBkaXZ3KGhpLCBsbywgYyk7CiAgICBkaXZ3CiAgICBkdXAKICAgIGJ1cnkgMTEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czozNTUKICAgIC8vIGlmIChmZWUgPiBwZW5kaW5nKSB7CiAgICA8CiAgICBieiBzdGFrZV9hZnRlcl9pZl9lbHNlQDIwCiAgICBkaWcgNAogICAgYnVyeSA5CgpzdGFrZV9hZnRlcl9pZl9lbHNlQDIwOgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjM1OAogICAgLy8gY29uc3QgbmV0OiB1aW50NjQgPSBwZW5kaW5nIC0gZmVlOwogICAgZGlnIDQKICAgIGRpZyA5CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIC0KICAgIGJ1cnkgOAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjM1OQogICAgLy8gaWYgKGZlZSA+IDApIHsKICAgIGJ6IHN0YWtlX2FmdGVyX2lmX2Vsc2VAMjIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czozNjAKICAgIC8vIHRoaXMucGxhdGZvcm1fZmVlc19hY2NydWVkLnZhbHVlID0gbmV3IFVpbnQ2NCh0aGlzLnBsYXRmb3JtX2ZlZXNfYWNjcnVlZC52YWx1ZS5hc1VpbnQ2NCgpICsgZmVlKTsKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6NTAKICAgIC8vIHBsYXRmb3JtX2ZlZXNfYWNjcnVlZCA9IEdsb2JhbFN0YXRlPFVpbnQ2ND4oKTsKICAgIGJ5dGVjXzMgLy8gInBsYXRmb3JtX2ZlZXNfYWNjcnVlZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czozNjAKICAgIC8vIHRoaXMucGxhdGZvcm1fZmVlc19hY2NydWVkLnZhbHVlID0gbmV3IFVpbnQ2NCh0aGlzLnBsYXRmb3JtX2ZlZXNfYWNjcnVlZC52YWx1ZS5hc1VpbnQ2NCgpICsgZmVlKTsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBidG9pCiAgICBkaWcgOQogICAgKwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjUwCiAgICAvLyBwbGF0Zm9ybV9mZWVzX2FjY3J1ZWQgPSBHbG9iYWxTdGF0ZTxVaW50NjQ+KCk7CiAgICBieXRlY18zIC8vICJwbGF0Zm9ybV9mZWVzX2FjY3J1ZWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MzYwCiAgICAvLyB0aGlzLnBsYXRmb3JtX2ZlZXNfYWNjcnVlZC52YWx1ZSA9IG5ldyBVaW50NjQodGhpcy5wbGF0Zm9ybV9mZWVzX2FjY3J1ZWQudmFsdWUuYXNVaW50NjQoKSArIGZlZSk7CiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKc3Rha2VfYWZ0ZXJfaWZfZWxzZUAyMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czozNjIKICAgIC8vIHRoaXMucmV3YXJkc19wYWlkLnZhbHVlID0gbmV3IFVpbnQ2NCh0aGlzLnJld2FyZHNfcGFpZC52YWx1ZS5hc1VpbnQ2NCgpICsgcGVuZGluZyk7CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjM5CiAgICAvLyByZXdhcmRzX3BhaWQgPSBHbG9iYWxTdGF0ZTxVaW50NjQ+KCk7CiAgICBieXRlY18yIC8vICJyZXdhcmRzX3BhaWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MzYyCiAgICAvLyB0aGlzLnJld2FyZHNfcGFpZC52YWx1ZSA9IG5ldyBVaW50NjQodGhpcy5yZXdhcmRzX3BhaWQudmFsdWUuYXNVaW50NjQoKSArIHBlbmRpbmcpOwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGJ0b2kKICAgIGRpZyA1CiAgICArCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MzkKICAgIC8vIHJld2FyZHNfcGFpZCA9IEdsb2JhbFN0YXRlPFVpbnQ2ND4oKTsKICAgIGJ5dGVjXzIgLy8gInJld2FyZHNfcGFpZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czozNjIKICAgIC8vIHRoaXMucmV3YXJkc19wYWlkLnZhbHVlID0gbmV3IFVpbnQ2NCh0aGlzLnJld2FyZHNfcGFpZC52YWx1ZS5hc1VpbnQ2NCgpICsgcGVuZGluZyk7CiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjM2My0zNzEKICAgIC8vIGl0eG4KICAgIC8vICAgLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgIHhmZXJBc3NldDogdGhpcy5yZXdhcmRfYXNzZXRfaWQudmFsdWUuYXNVaW50NjQoKSwKICAgIC8vICAgICBhc3NldFJlY2VpdmVyOiBvcC5UeG4uc2VuZGVyLAogICAgLy8gICAgIHNlbmRlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IG5ldCwKICAgIC8vICAgICBmZWU6IDAsCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKTsKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czozNjUKICAgIC8vIHhmZXJBc3NldDogdGhpcy5yZXdhcmRfYXNzZXRfaWQudmFsdWUuYXNVaW50NjQoKSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MjcKICAgIC8vIHJld2FyZF9hc3NldF9pZCA9IEdsb2JhbFN0YXRlPFVpbnQ2ND4oKTsKICAgIGJ5dGVjIDQgLy8gInJld2FyZF9hc3NldF9pZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czozNjUKICAgIC8vIHhmZXJBc3NldDogdGhpcy5yZXdhcmRfYXNzZXRfaWQudmFsdWUuYXNVaW50NjQoKSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MzY2CiAgICAvLyBhc3NldFJlY2VpdmVyOiBvcC5UeG4uc2VuZGVyLAogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjM2NwogICAgLy8gc2VuZGVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBkaWcgOQogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBTZW5kZXIKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czozNjMtMzcwCiAgICAvLyBpdHhuCiAgICAvLyAgIC5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgICB4ZmVyQXNzZXQ6IHRoaXMucmV3YXJkX2Fzc2V0X2lkLnZhbHVlLmFzVWludDY0KCksCiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogb3AuVHhuLnNlbmRlciwKICAgIC8vICAgICBzZW5kZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIGFzc2V0QW1vdW50OiBuZXQsCiAgICAvLyAgICAgZmVlOiAwLAogICAgLy8gICB9KQogICAgaW50Y18zIC8vIDQKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czozNjkKICAgIC8vIGZlZTogMCwKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjM2My0zNzEKICAgIC8vIGl0eG4KICAgIC8vICAgLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgIHhmZXJBc3NldDogdGhpcy5yZXdhcmRfYXNzZXRfaWQudmFsdWUuYXNVaW50NjQoKSwKICAgIC8vICAgICBhc3NldFJlY2VpdmVyOiBvcC5UeG4uc2VuZGVyLAogICAgLy8gICAgIHNlbmRlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IG5ldCwKICAgIC8vICAgICBmZWU6IDAsCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKTsKICAgIGl0eG5fc3VibWl0CgpzdGFrZV9hZnRlcl9pZl9lbHNlQDI0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjM3NAogICAgLy8gY29uc3QgbmV3U3Rha2U6IHVpbnQ2NCA9IHByZXZTdGFrZSArIHF1YW50aXR5OwogICAgZGlnIDIKICAgIGRpZyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czozNzUKICAgIC8vIHRoaXMudG90YWxfc3Rha2VkLnZhbHVlID0gbmV3IFVpbnQ2NCh0aGlzLnRvdGFsX3N0YWtlZC52YWx1ZS5hc1VpbnQ2NCgpICsgcXVhbnRpdHkpOwogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czoyOQogICAgLy8gdG90YWxfc3Rha2VkID0gR2xvYmFsU3RhdGU8VWludDY0PigpOwogICAgYnl0ZWMgNiAvLyAidG90YWxfc3Rha2VkIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjM3NQogICAgLy8gdGhpcy50b3RhbF9zdGFrZWQudmFsdWUgPSBuZXcgVWludDY0KHRoaXMudG90YWxfc3Rha2VkLnZhbHVlLmFzVWludDY0KCkgKyBxdWFudGl0eSk7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYnRvaQogICAgdW5jb3ZlciAyCiAgICArCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MjkKICAgIC8vIHRvdGFsX3N0YWtlZCA9IEdsb2JhbFN0YXRlPFVpbnQ2ND4oKTsKICAgIGJ5dGVjIDYgLy8gInRvdGFsX3N0YWtlZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czozNzUKICAgIC8vIHRoaXMudG90YWxfc3Rha2VkLnZhbHVlID0gbmV3IFVpbnQ2NCh0aGlzLnRvdGFsX3N0YWtlZC52YWx1ZS5hc1VpbnQ2NCgpICsgcXVhbnRpdHkpOwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czozNzcKICAgIC8vIGNvbnN0IG5ld0RlYnQgPSBtdWxEaXZXKG5ld1N0YWtlLCB0aGlzLnJld2FyZF9wZXJfdG9rZW4udmFsdWUuYXNVaW50NjQoKSwgUFJFQ0lTSU9OKTsKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MzAKICAgIC8vIHJld2FyZF9wZXJfdG9rZW4gPSBHbG9iYWxTdGF0ZTxVaW50NjQ+KCk7CiAgICBieXRlYyA5IC8vICJyZXdhcmRfcGVyX3Rva2VuIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjM3NwogICAgLy8gY29uc3QgbmV3RGVidCA9IG11bERpdlcobmV3U3Rha2UsIHRoaXMucmV3YXJkX3Blcl90b2tlbi52YWx1ZS5hc1VpbnQ2NCgpLCBQUkVDSVNJT04pOwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbmZpZy5hbGdvLnRzOjI4CiAgICAvLyBjb25zdCBbaGksIGxvXSA9IG11bHcoYSwgYik7CiAgICBkaWcgMQogICAgbXVsdwogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjM3NwogICAgLy8gY29uc3QgbmV3RGVidCA9IG11bERpdlcobmV3U3Rha2UsIHRoaXMucmV3YXJkX3Blcl90b2tlbi52YWx1ZS5hc1VpbnQ2NCgpLCBQUkVDSVNJT04pOwogICAgaW50YyA0IC8vIDEwMDAwMDAwMDAwMDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbmZpZy5hbGdvLnRzOjI5CiAgICAvLyByZXR1cm4gZGl2dyhoaSwgbG8sIGMpOwogICAgZGl2dwogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjM3OQogICAgLy8gc3Rha2U6IG5ldyBVaW50NjQobmV3U3Rha2UpLAogICAgc3dhcAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjM4MAogICAgLy8gcmV3YXJkRGVidDogbmV3IFVpbnQ2NChuZXdEZWJ0KSwKICAgIHN3YXAKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czozNzgtMzgxCiAgICAvLyB0aGlzLnN0YWtlcnMob3AuVHhuLnNlbmRlcikudmFsdWUgPSBuZXcgU3Rha2VJbmZvUmVjb3JkKHsKICAgIC8vICAgc3Rha2U6IG5ldyBVaW50NjQobmV3U3Rha2UpLAogICAgLy8gICByZXdhcmREZWJ0OiBuZXcgVWludDY0KG5ld0RlYnQpLAogICAgLy8gfSk7CiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czoyNAogICAgLy8gc3Rha2VycyA9IEJveE1hcDxBY2NvdW50LCBTdGFrZUluZm9SZWNvcmQ+KHsga2V5UHJlZml4OiAic3QiIH0pOwogICAgYnl0ZWMgNSAvLyAic3QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6Mzc4CiAgICAvLyB0aGlzLnN0YWtlcnMob3AuVHhuLnNlbmRlcikudmFsdWUgPSBuZXcgU3Rha2VJbmZvUmVjb3JkKHsKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czoyNAogICAgLy8gc3Rha2VycyA9IEJveE1hcDxBY2NvdW50LCBTdGFrZUluZm9SZWNvcmQ+KHsga2V5UHJlZml4OiAic3QiIH0pOwogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6Mzc4LTM4MQogICAgLy8gdGhpcy5zdGFrZXJzKG9wLlR4bi5zZW5kZXIpLnZhbHVlID0gbmV3IFN0YWtlSW5mb1JlY29yZCh7CiAgICAvLyAgIHN0YWtlOiBuZXcgVWludDY0KG5ld1N0YWtlKSwKICAgIC8vICAgcmV3YXJkRGVidDogbmV3IFVpbnQ2NChuZXdEZWJ0KSwKICAgIC8vIH0pOwogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjM4MwogICAgLy8gaWYgKCFleGlzdHMpIHsKICAgIGR1cAogICAgYm56IHN0YWtlX2FmdGVyX2lmX2Vsc2VAMjYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czozODQKICAgIC8vIHRoaXMubnVtX3N0YWtlcnMudmFsdWUgPSBuZXcgVWludDY0KHRoaXMubnVtX3N0YWtlcnMudmFsdWUuYXNVaW50NjQoKSArIDEpOwogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czo0NQogICAgLy8gbnVtX3N0YWtlcnMgPSBHbG9iYWxTdGF0ZTxVaW50NjQ+KCk7CiAgICBieXRlYyAxMyAvLyAibnVtX3N0YWtlcnMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6Mzg0CiAgICAvLyB0aGlzLm51bV9zdGFrZXJzLnZhbHVlID0gbmV3IFVpbnQ2NCh0aGlzLm51bV9zdGFrZXJzLnZhbHVlLmFzVWludDY0KCkgKyAxKTsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBidG9pCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjQ1CiAgICAvLyBudW1fc3Rha2VycyA9IEdsb2JhbFN0YXRlPFVpbnQ2ND4oKTsKICAgIGJ5dGVjIDEzIC8vICJudW1fc3Rha2VycyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czozODQKICAgIC8vIHRoaXMubnVtX3N0YWtlcnMudmFsdWUgPSBuZXcgVWludDY0KHRoaXMubnVtX3N0YWtlcnMudmFsdWUuYXNVaW50NjQoKSArIDEpOwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCnN0YWtlX2FmdGVyX2lmX2Vsc2VAMjY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MzA5CiAgICAvLyBAYWJpbWV0aG9kKHsgYWxsb3dBY3Rpb25zOiAiTm9PcCIgfSkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCnN0YWtlX3Rlcm5hcnlfZmFsc2VAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MzQzCiAgICAvLyBsZXQgcGVuZGluZzogdWludDY0ID0gYWNjcnVlZCA+IHByZXZEZWJ0ID8gYWNjcnVlZCAtIHByZXZEZWJ0IDogMDsKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDUKICAgIGIgc3Rha2VfdGVybmFyeV9tZXJnZUAxMwoKc3Rha2VfdGVybmFyeV9mYWxzZUA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjM0MQogICAgLy8gY29uc3QgcHJldkRlYnQ6IHVpbnQ2NCA9IGV4aXN0cyA/IHRoaXMuc3Rha2VycyhvcC5UeG4uc2VuZGVyKS52YWx1ZS5yZXdhcmREZWJ0LmFzVWludDY0KCkgOiAwOwogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNAogICAgYiBzdGFrZV90ZXJuYXJ5X21lcmdlQDEwCgpzdGFrZV90ZXJuYXJ5X2ZhbHNlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MzQwCiAgICAvLyBjb25zdCBwcmV2U3Rha2U6IHVpbnQ2NCA9IGV4aXN0cyA/IHRoaXMuc3Rha2VycyhvcC5UeG4uc2VuZGVyKS52YWx1ZS5zdGFrZS5hc1VpbnQ2NCgpIDogMDsKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDMKICAgIGIgc3Rha2VfdGVybmFyeV9tZXJnZUA3CgoKLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjpTdGFraW5nLmNsYWltUmV3YXJkc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmNsYWltUmV3YXJkczoKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MjQKICAgIC8vIHN0YWtlcnMgPSBCb3hNYXA8QWNjb3VudCwgU3Rha2VJbmZvUmVjb3JkPih7IGtleVByZWZpeDogInN0IiB9KTsKICAgIGJ5dGVjIDUgLy8gInN0IgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjM5MAogICAgLy8gYXNzZXJ0KHRoaXMuc3Rha2VycyhvcC5UeG4uc2VuZGVyKS5leGlzdHMsICJObyBzdGFrZSBmb3VuZCBmb3IgdXNlciIpOwogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjI0CiAgICAvLyBzdGFrZXJzID0gQm94TWFwPEFjY291bnQsIFN0YWtlSW5mb1JlY29yZD4oeyBrZXlQcmVmaXg6ICJzdCIgfSk7CiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czozOTAKICAgIC8vIGFzc2VydCh0aGlzLnN0YWtlcnMob3AuVHhuLnNlbmRlcikuZXhpc3RzLCAiTm8gc3Rha2UgZm91bmQgZm9yIHVzZXIiKTsKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIE5vIHN0YWtlIGZvdW5kIGZvciB1c2VyCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MzkxCiAgICAvLyBhc3NlcnQodGhpcy5jb250cmFjdF9zdGF0ZS52YWx1ZS5hc1VpbnQ2NCgpID09PSAxLCAiUG9vbCBpcyBpbmFjdGl2ZSIpOwogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czo0NwogICAgLy8gY29udHJhY3Rfc3RhdGUgPSBHbG9iYWxTdGF0ZTxVaW50NjQ+KCk7IC8vIDAgPSBpbmFjdGl2ZSwgMSA9IGFjdGl2ZQogICAgYnl0ZWMgOCAvLyAiY29udHJhY3Rfc3RhdGUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MzkxCiAgICAvLyBhc3NlcnQodGhpcy5jb250cmFjdF9zdGF0ZS52YWx1ZS5hc1VpbnQ2NCgpID09PSAxLCAiUG9vbCBpcyBpbmFjdGl2ZSIpOwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGJ0b2kKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIFBvb2wgaXMgaW5hY3RpdmUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czoyNAogICAgLy8gc3Rha2VycyA9IEJveE1hcDxBY2NvdW50LCBTdGFrZUluZm9SZWNvcmQ+KHsga2V5UHJlZml4OiAic3QiIH0pOwogICAgYnl0ZWMgNSAvLyAic3QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MzkyCiAgICAvLyBjb25zdCBzdGFrZXIgPSBjbG9uZSh0aGlzLnN0YWtlcnMob3AuVHhuLnNlbmRlcikudmFsdWUpOwogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjI0CiAgICAvLyBzdGFrZXJzID0gQm94TWFwPEFjY291bnQsIFN0YWtlSW5mb1JlY29yZD4oeyBrZXlQcmVmaXg6ICJzdCIgfSk7CiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czozOTIKICAgIC8vIGNvbnN0IHN0YWtlciA9IGNsb25lKHRoaXMuc3Rha2VycyhvcC5UeG4uc2VuZGVyKS52YWx1ZSk7CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjM5MwogICAgLy8gYXNzZXJ0KHN0YWtlci5zdGFrZS5hc1VpbnQ2NCgpID4gMCwgIk5vIHN0YWtlIik7CiAgICBkdXAKICAgIGV4dHJhY3QgMCA4CiAgICBzd2FwCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkdXAKICAgIGFzc2VydCAvLyBObyBzdGFrZQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjM5NQogICAgLy8gdGhpcy51cGRhdGVQb29sKCk7CiAgICBjYWxsc3ViIHVwZGF0ZVBvb2wKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czozOTcKICAgIC8vIGNvbnN0IGFjY3J1ZWQgPSBtdWxEaXZXKHN0YWtlci5zdGFrZS5hc1VpbnQ2NCgpLCB0aGlzLnJld2FyZF9wZXJfdG9rZW4udmFsdWUuYXNVaW50NjQoKSwgUFJFQ0lTSU9OKTsKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MzAKICAgIC8vIHJld2FyZF9wZXJfdG9rZW4gPSBHbG9iYWxTdGF0ZTxVaW50NjQ+KCk7CiAgICBieXRlYyA5IC8vICJyZXdhcmRfcGVyX3Rva2VuIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjM5NwogICAgLy8gY29uc3QgYWNjcnVlZCA9IG11bERpdlcoc3Rha2VyLnN0YWtlLmFzVWludDY0KCksIHRoaXMucmV3YXJkX3Blcl90b2tlbi52YWx1ZS5hc1VpbnQ2NCgpLCBQUkVDSVNJT04pOwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbmZpZy5hbGdvLnRzOjI4CiAgICAvLyBjb25zdCBbaGksIGxvXSA9IG11bHcoYSwgYik7CiAgICBtdWx3CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6Mzk3CiAgICAvLyBjb25zdCBhY2NydWVkID0gbXVsRGl2VyhzdGFrZXIuc3Rha2UuYXNVaW50NjQoKSwgdGhpcy5yZXdhcmRfcGVyX3Rva2VuLnZhbHVlLmFzVWludDY0KCksIFBSRUNJU0lPTik7CiAgICBpbnRjIDQgLy8gMTAwMDAwMDAwMDAwMDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29uZmlnLmFsZ28udHM6MjkKICAgIC8vIHJldHVybiBkaXZ3KGhpLCBsbywgYyk7CiAgICBkaXZ3CiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjM5OAogICAgLy8gbGV0IHBlbmRpbmc6IHVpbnQ2NCA9IGFjY3J1ZWQgPiBzdGFrZXIucmV3YXJkRGVidC5hc1VpbnQ2NCgpID8gYWNjcnVlZCAtIHN0YWtlci5yZXdhcmREZWJ0LmFzVWludDY0KCkgOiAwOwogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgID4KICAgIGJ6IGNsYWltUmV3YXJkc190ZXJuYXJ5X2ZhbHNlQDMKICAgIGR1cDIKICAgIC0KICAgIGJ1cnkgNQoKY2xhaW1SZXdhcmRzX3Rlcm5hcnlfbWVyZ2VANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czozOTkKICAgIC8vIGNvbnN0IHBheWFibGU6IHVpbnQ2NCA9IHRoaXMuYWNjcnVlZF9yZXdhcmRzLnZhbHVlLmFzVWludDY0KCkgLSB0aGlzLnJld2FyZHNfcGFpZC52YWx1ZS5hc1VpbnQ2NCgpOwogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czozNwogICAgLy8gYWNjcnVlZF9yZXdhcmRzID0gR2xvYmFsU3RhdGU8VWludDY0PigpOwogICAgYnl0ZWMgNyAvLyAiYWNjcnVlZF9yZXdhcmRzIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjM5OQogICAgLy8gY29uc3QgcGF5YWJsZTogdWludDY0ID0gdGhpcy5hY2NydWVkX3Jld2FyZHMudmFsdWUuYXNVaW50NjQoKSAtIHRoaXMucmV3YXJkc19wYWlkLnZhbHVlLmFzVWludDY0KCk7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYnRvaQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czozOQogICAgLy8gcmV3YXJkc19wYWlkID0gR2xvYmFsU3RhdGU8VWludDY0PigpOwogICAgYnl0ZWNfMiAvLyAicmV3YXJkc19wYWlkIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjM5OQogICAgLy8gY29uc3QgcGF5YWJsZTogdWludDY0ID0gdGhpcy5hY2NydWVkX3Jld2FyZHMudmFsdWUuYXNVaW50NjQoKSAtIHRoaXMucmV3YXJkc19wYWlkLnZhbHVlLmFzVWludDY0KCk7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYnRvaQogICAgLQogICAgZHVwCiAgICBidXJ5IDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czo0MDAKICAgIC8vIGlmIChwZW5kaW5nID4gcGF5YWJsZSkgewogICAgZGlnIDUKICAgIDwKICAgIGJ6IGNsYWltUmV3YXJkc19hZnRlcl9pZl9lbHNlQDYKICAgIGRpZyA1CiAgICBidXJ5IDUKCmNsYWltUmV3YXJkc19hZnRlcl9pZl9lbHNlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6NDAzCiAgICAvLyBjb25zdCBsaXF1aWRSZXdhcmRzID0gdGhpcy5hdmFpbGFibGVSZXdhcmRMaXF1aWRpdHkoKTsKICAgIGNhbGxzdWIgYXZhaWxhYmxlUmV3YXJkTGlxdWlkaXR5CiAgICBkdXAKICAgIGJ1cnkgOQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjQwNAogICAgLy8gaWYgKHBlbmRpbmcgPiBsaXF1aWRSZXdhcmRzKSB7CiAgICBkaWcgNQogICAgPAogICAgYnogY2xhaW1SZXdhcmRzX2FmdGVyX2lmX2Vsc2VAOAogICAgZGlnIDcKICAgIGJ1cnkgNQoKY2xhaW1SZXdhcmRzX2FmdGVyX2lmX2Vsc2VAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czo0MDgKICAgIC8vIGlmIChwZW5kaW5nID4gMCkgewogICAgZGlnIDQKICAgIGJ6IGNsYWltUmV3YXJkc19hZnRlcl9pZl9lbHNlQDE1CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6NDA5CiAgICAvLyBsZXQgZmVlOiB1aW50NjQgPSBtdWxEaXZXKHBlbmRpbmcsIHRoaXMucGxhdGZvcm1fZmVlX2Jwcy52YWx1ZS5hc1VpbnQ2NCgpLCAxMF8wMDApOwogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czo0OQogICAgLy8gcGxhdGZvcm1fZmVlX2JwcyA9IEdsb2JhbFN0YXRlPFVpbnQ2ND4oKTsKICAgIGJ5dGVjIDE1IC8vICJwbGF0Zm9ybV9mZWVfYnBzIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjQwOQogICAgLy8gbGV0IGZlZTogdWludDY0ID0gbXVsRGl2VyhwZW5kaW5nLCB0aGlzLnBsYXRmb3JtX2ZlZV9icHMudmFsdWUuYXNVaW50NjQoKSwgMTBfMDAwKTsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb25maWcuYWxnby50czoyOAogICAgLy8gY29uc3QgW2hpLCBsb10gPSBtdWx3KGEsIGIpOwogICAgZGlnIDUKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBtdWx3CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6NDA5CiAgICAvLyBsZXQgZmVlOiB1aW50NjQgPSBtdWxEaXZXKHBlbmRpbmcsIHRoaXMucGxhdGZvcm1fZmVlX2Jwcy52YWx1ZS5hc1VpbnQ2NCgpLCAxMF8wMDApOwogICAgaW50YyA1IC8vIDEwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb25maWcuYWxnby50czoyOQogICAgLy8gcmV0dXJuIGRpdncoaGksIGxvLCBjKTsKICAgIGRpdncKICAgIGR1cAogICAgYnVyeSAxMQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjQxMAogICAgLy8gaWYgKGZlZSA+IHBlbmRpbmcpIHsKICAgIDwKICAgIGJ6IGNsYWltUmV3YXJkc19hZnRlcl9pZl9lbHNlQDExCiAgICBkaWcgNAogICAgYnVyeSA5CgpjbGFpbVJld2FyZHNfYWZ0ZXJfaWZfZWxzZUAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czo0MTMKICAgIC8vIGNvbnN0IG5ldDogdWludDY0ID0gcGVuZGluZyAtIGZlZTsKICAgIGRpZyA0CiAgICBkaWcgOQogICAgZHVwCiAgICBjb3ZlciAyCiAgICAtCiAgICBidXJ5IDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czo0MTQKICAgIC8vIGlmIChmZWUgPiAwKSB7CiAgICBieiBjbGFpbVJld2FyZHNfYWZ0ZXJfaWZfZWxzZUAxMwogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjQxNQogICAgLy8gdGhpcy5wbGF0Zm9ybV9mZWVzX2FjY3J1ZWQudmFsdWUgPSBuZXcgVWludDY0KHRoaXMucGxhdGZvcm1fZmVlc19hY2NydWVkLnZhbHVlLmFzVWludDY0KCkgKyBmZWUpOwogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czo1MAogICAgLy8gcGxhdGZvcm1fZmVlc19hY2NydWVkID0gR2xvYmFsU3RhdGU8VWludDY0PigpOwogICAgYnl0ZWNfMyAvLyAicGxhdGZvcm1fZmVlc19hY2NydWVkIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjQxNQogICAgLy8gdGhpcy5wbGF0Zm9ybV9mZWVzX2FjY3J1ZWQudmFsdWUgPSBuZXcgVWludDY0KHRoaXMucGxhdGZvcm1fZmVlc19hY2NydWVkLnZhbHVlLmFzVWludDY0KCkgKyBmZWUpOwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGJ0b2kKICAgIGRpZyA5CiAgICArCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6NTAKICAgIC8vIHBsYXRmb3JtX2ZlZXNfYWNjcnVlZCA9IEdsb2JhbFN0YXRlPFVpbnQ2ND4oKTsKICAgIGJ5dGVjXzMgLy8gInBsYXRmb3JtX2ZlZXNfYWNjcnVlZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czo0MTUKICAgIC8vIHRoaXMucGxhdGZvcm1fZmVlc19hY2NydWVkLnZhbHVlID0gbmV3IFVpbnQ2NCh0aGlzLnBsYXRmb3JtX2ZlZXNfYWNjcnVlZC52YWx1ZS5hc1VpbnQ2NCgpICsgZmVlKTsKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgpjbGFpbVJld2FyZHNfYWZ0ZXJfaWZfZWxzZUAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czo0MTcKICAgIC8vIHRoaXMucmV3YXJkc19wYWlkLnZhbHVlID0gbmV3IFVpbnQ2NCh0aGlzLnJld2FyZHNfcGFpZC52YWx1ZS5hc1VpbnQ2NCgpICsgcGVuZGluZyk7CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjM5CiAgICAvLyByZXdhcmRzX3BhaWQgPSBHbG9iYWxTdGF0ZTxVaW50NjQ+KCk7CiAgICBieXRlY18yIC8vICJyZXdhcmRzX3BhaWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6NDE3CiAgICAvLyB0aGlzLnJld2FyZHNfcGFpZC52YWx1ZSA9IG5ldyBVaW50NjQodGhpcy5yZXdhcmRzX3BhaWQudmFsdWUuYXNVaW50NjQoKSArIHBlbmRpbmcpOwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGJ0b2kKICAgIGRpZyA1CiAgICArCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MzkKICAgIC8vIHJld2FyZHNfcGFpZCA9IEdsb2JhbFN0YXRlPFVpbnQ2ND4oKTsKICAgIGJ5dGVjXzIgLy8gInJld2FyZHNfcGFpZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czo0MTcKICAgIC8vIHRoaXMucmV3YXJkc19wYWlkLnZhbHVlID0gbmV3IFVpbnQ2NCh0aGlzLnJld2FyZHNfcGFpZC52YWx1ZS5hc1VpbnQ2NCgpICsgcGVuZGluZyk7CiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjQxOC00MjYKICAgIC8vIGl0eG4KICAgIC8vICAgLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgIHhmZXJBc3NldDogdGhpcy5yZXdhcmRfYXNzZXRfaWQudmFsdWUuYXNVaW50NjQoKSwKICAgIC8vICAgICBhc3NldFJlY2VpdmVyOiBvcC5UeG4uc2VuZGVyLAogICAgLy8gICAgIHNlbmRlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IG5ldCwKICAgIC8vICAgICBmZWU6IDAsCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKTsKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czo0MjAKICAgIC8vIHhmZXJBc3NldDogdGhpcy5yZXdhcmRfYXNzZXRfaWQudmFsdWUuYXNVaW50NjQoKSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MjcKICAgIC8vIHJld2FyZF9hc3NldF9pZCA9IEdsb2JhbFN0YXRlPFVpbnQ2ND4oKTsKICAgIGJ5dGVjIDQgLy8gInJld2FyZF9hc3NldF9pZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czo0MjAKICAgIC8vIHhmZXJBc3NldDogdGhpcy5yZXdhcmRfYXNzZXRfaWQudmFsdWUuYXNVaW50NjQoKSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6NDIxCiAgICAvLyBhc3NldFJlY2VpdmVyOiBvcC5UeG4uc2VuZGVyLAogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjQyMgogICAgLy8gc2VuZGVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBkaWcgOQogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBTZW5kZXIKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czo0MTgtNDI1CiAgICAvLyBpdHhuCiAgICAvLyAgIC5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgICB4ZmVyQXNzZXQ6IHRoaXMucmV3YXJkX2Fzc2V0X2lkLnZhbHVlLmFzVWludDY0KCksCiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogb3AuVHhuLnNlbmRlciwKICAgIC8vICAgICBzZW5kZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIGFzc2V0QW1vdW50OiBuZXQsCiAgICAvLyAgICAgZmVlOiAwLAogICAgLy8gICB9KQogICAgaW50Y18zIC8vIDQKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czo0MjQKICAgIC8vIGZlZTogMCwKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjQxOC00MjYKICAgIC8vIGl0eG4KICAgIC8vICAgLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgIHhmZXJBc3NldDogdGhpcy5yZXdhcmRfYXNzZXRfaWQudmFsdWUuYXNVaW50NjQoKSwKICAgIC8vICAgICBhc3NldFJlY2VpdmVyOiBvcC5UeG4uc2VuZGVyLAogICAgLy8gICAgIHNlbmRlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IG5ldCwKICAgIC8vICAgICBmZWU6IDAsCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKTsKICAgIGl0eG5fc3VibWl0CgpjbGFpbVJld2FyZHNfYWZ0ZXJfaWZfZWxzZUAxNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czo0MjkKICAgIC8vIGNvbnN0IG5ld0RlYnQgPSBtdWxEaXZXKHN0YWtlci5zdGFrZS5hc1VpbnQ2NCgpLCB0aGlzLnJld2FyZF9wZXJfdG9rZW4udmFsdWUuYXNVaW50NjQoKSwgUFJFQ0lTSU9OKTsKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MzAKICAgIC8vIHJld2FyZF9wZXJfdG9rZW4gPSBHbG9iYWxTdGF0ZTxVaW50NjQ+KCk7CiAgICBieXRlYyA5IC8vICJyZXdhcmRfcGVyX3Rva2VuIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjQyOQogICAgLy8gY29uc3QgbmV3RGVidCA9IG11bERpdlcoc3Rha2VyLnN0YWtlLmFzVWludDY0KCksIHRoaXMucmV3YXJkX3Blcl90b2tlbi52YWx1ZS5hc1VpbnQ2NCgpLCBQUkVDSVNJT04pOwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbmZpZy5hbGdvLnRzOjI4CiAgICAvLyBjb25zdCBbaGksIGxvXSA9IG11bHcoYSwgYik7CiAgICBkaWcgMwogICAgbXVsdwogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjQyOQogICAgLy8gY29uc3QgbmV3RGVidCA9IG11bERpdlcoc3Rha2VyLnN0YWtlLmFzVWludDY0KCksIHRoaXMucmV3YXJkX3Blcl90b2tlbi52YWx1ZS5hc1VpbnQ2NCgpLCBQUkVDSVNJT04pOwogICAgaW50YyA0IC8vIDEwMDAwMDAwMDAwMDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbmZpZy5hbGdvLnRzOjI5CiAgICAvLyByZXR1cm4gZGl2dyhoaSwgbG8sIGMpOwogICAgZGl2dwogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjQzMgogICAgLy8gcmV3YXJkRGVidDogbmV3IFVpbnQ2NChuZXdEZWJ0KSwKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czo0MzAtNDMzCiAgICAvLyB0aGlzLnN0YWtlcnMob3AuVHhuLnNlbmRlcikudmFsdWUgPSBuZXcgU3Rha2VJbmZvUmVjb3JkKHsKICAgIC8vICAgc3Rha2U6IHN0YWtlci5zdGFrZSwKICAgIC8vICAgcmV3YXJkRGVidDogbmV3IFVpbnQ2NChuZXdEZWJ0KSwKICAgIC8vIH0pOwogICAgZGlnIDQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjI0CiAgICAvLyBzdGFrZXJzID0gQm94TWFwPEFjY291bnQsIFN0YWtlSW5mb1JlY29yZD4oeyBrZXlQcmVmaXg6ICJzdCIgfSk7CiAgICBieXRlYyA1IC8vICJzdCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czo0MzAKICAgIC8vIHRoaXMuc3Rha2VycyhvcC5UeG4uc2VuZGVyKS52YWx1ZSA9IG5ldyBTdGFrZUluZm9SZWNvcmQoewogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjI0CiAgICAvLyBzdGFrZXJzID0gQm94TWFwPEFjY291bnQsIFN0YWtlSW5mb1JlY29yZD4oeyBrZXlQcmVmaXg6ICJzdCIgfSk7CiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czo0MzAtNDMzCiAgICAvLyB0aGlzLnN0YWtlcnMob3AuVHhuLnNlbmRlcikudmFsdWUgPSBuZXcgU3Rha2VJbmZvUmVjb3JkKHsKICAgIC8vICAgc3Rha2U6IHN0YWtlci5zdGFrZSwKICAgIC8vICAgcmV3YXJkRGVidDogbmV3IFVpbnQ2NChuZXdEZWJ0KSwKICAgIC8vIH0pOwogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjM4OAogICAgLy8gQGFiaW1ldGhvZCh7IGFsbG93QWN0aW9uczogIk5vT3AiIH0pCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpjbGFpbVJld2FyZHNfdGVybmFyeV9mYWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjM5OAogICAgLy8gbGV0IHBlbmRpbmc6IHVpbnQ2NCA9IGFjY3J1ZWQgPiBzdGFrZXIucmV3YXJkRGVidC5hc1VpbnQ2NCgpID8gYWNjcnVlZCAtIHN0YWtlci5yZXdhcmREZWJ0LmFzVWludDY0KCkgOiAwOwogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNQogICAgYiBjbGFpbVJld2FyZHNfdGVybmFyeV9tZXJnZUA0CgoKLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjpTdGFraW5nLnVuc3Rha2Vbcm91dGluZ10oKSAtPiB2b2lkOgp1bnN0YWtlOgogICAgcHVzaGJ5dGVzICIiCiAgICBkdXBuIDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czo0MzYKICAgIC8vIEBhYmltZXRob2QoeyBhbGxvd0FjdGlvbnM6ICJOb09wIiB9KQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjI0CiAgICAvLyBzdGFrZXJzID0gQm94TWFwPEFjY291bnQsIFN0YWtlSW5mb1JlY29yZD4oeyBrZXlQcmVmaXg6ICJzdCIgfSk7CiAgICBieXRlYyA1IC8vICJzdCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czo0MzgKICAgIC8vIGFzc2VydCh0aGlzLnN0YWtlcnMob3AuVHhuLnNlbmRlcikuZXhpc3RzLCAiTm8gc3Rha2UgZm91bmQgZm9yIHVzZXIiKTsKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czoyNAogICAgLy8gc3Rha2VycyA9IEJveE1hcDxBY2NvdW50LCBTdGFrZUluZm9SZWNvcmQ+KHsga2V5UHJlZml4OiAic3QiIH0pOwogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6NDM4CiAgICAvLyBhc3NlcnQodGhpcy5zdGFrZXJzKG9wLlR4bi5zZW5kZXIpLmV4aXN0cywgIk5vIHN0YWtlIGZvdW5kIGZvciB1c2VyIik7CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBObyBzdGFrZSBmb3VuZCBmb3IgdXNlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjI0CiAgICAvLyBzdGFrZXJzID0gQm94TWFwPEFjY291bnQsIFN0YWtlSW5mb1JlY29yZD4oeyBrZXlQcmVmaXg6ICJzdCIgfSk7CiAgICBieXRlYyA1IC8vICJzdCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czo0MzkKICAgIC8vIGNvbnN0IHJlYyA9IGNsb25lKHRoaXMuc3Rha2VycyhvcC5UeG4uc2VuZGVyKS52YWx1ZSk7CiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MjQKICAgIC8vIHN0YWtlcnMgPSBCb3hNYXA8QWNjb3VudCwgU3Rha2VJbmZvUmVjb3JkPih7IGtleVByZWZpeDogInN0IiB9KTsKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjQzOQogICAgLy8gY29uc3QgcmVjID0gY2xvbmUodGhpcy5zdGFrZXJzKG9wLlR4bi5zZW5kZXIpLnZhbHVlKTsKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6NDQwCiAgICAvLyBjb25zdCBzdGFrZU5vdzogdWludDY0ID0gcmVjLnN0YWtlLmFzVWludDY0KCk7CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBjb3ZlciAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6NDQxCiAgICAvLyBhc3NlcnQoc3Rha2VOb3cgPiAwLCAiTm8gc3Rha2UiKTsKICAgIGR1cAogICAgYXNzZXJ0IC8vIE5vIHN0YWtlCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6NDQzCiAgICAvLyB0aGlzLnVwZGF0ZVBvb2woKTsKICAgIGNhbGxzdWIgdXBkYXRlUG9vbAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjQ0NQogICAgLy8gY29uc3QgYW1vdW50VG9XaXRoZHJhdzogdWludDY0ID0gcXVhbnRpdHkgPT09IDAgPyBzdGFrZU5vdyA6IHF1YW50aXR5OwogICAgZGlnIDIKICAgICEKICAgIHVuY292ZXIgMwogICAgZGlnIDIKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBkdXAKICAgIGNvdmVyIDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czo0NDYKICAgIC8vIGFzc2VydChzdGFrZU5vdyA+PSBhbW91bnRUb1dpdGhkcmF3LCAiVW5zdGFrZSBhbW91bnQgZXhjZWVkcyBiYWxhbmNlIik7CiAgICBkaWcgMQogICAgPD0KICAgIGFzc2VydCAvLyBVbnN0YWtlIGFtb3VudCBleGNlZWRzIGJhbGFuY2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czo0NDgKICAgIC8vIGNvbnN0IGFjY3J1ZWQgPSBtdWxEaXZXKHN0YWtlTm93LCB0aGlzLnJld2FyZF9wZXJfdG9rZW4udmFsdWUuYXNVaW50NjQoKSwgUFJFQ0lTSU9OKTsKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MzAKICAgIC8vIHJld2FyZF9wZXJfdG9rZW4gPSBHbG9iYWxTdGF0ZTxVaW50NjQ+KCk7CiAgICBieXRlYyA5IC8vICJyZXdhcmRfcGVyX3Rva2VuIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjQ0OAogICAgLy8gY29uc3QgYWNjcnVlZCA9IG11bERpdlcoc3Rha2VOb3csIHRoaXMucmV3YXJkX3Blcl90b2tlbi52YWx1ZS5hc1VpbnQ2NCgpLCBQUkVDSVNJT04pOwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbmZpZy5hbGdvLnRzOjI4CiAgICAvLyBjb25zdCBbaGksIGxvXSA9IG11bHcoYSwgYik7CiAgICBtdWx3CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6NDQ4CiAgICAvLyBjb25zdCBhY2NydWVkID0gbXVsRGl2VyhzdGFrZU5vdywgdGhpcy5yZXdhcmRfcGVyX3Rva2VuLnZhbHVlLmFzVWludDY0KCksIFBSRUNJU0lPTik7CiAgICBpbnRjIDQgLy8gMTAwMDAwMDAwMDAwMDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29uZmlnLmFsZ28udHM6MjkKICAgIC8vIHJldHVybiBkaXZ3KGhpLCBsbywgYyk7CiAgICBkaXZ3CiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjQ0OQogICAgLy8gbGV0IHBlbmRpbmc6IHVpbnQ2NCA9IGFjY3J1ZWQgPiByZWMucmV3YXJkRGVidC5hc1VpbnQ2NCgpID8gYWNjcnVlZCAtIHJlYy5yZXdhcmREZWJ0LmFzVWludDY0KCkgOiAwOwogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgID4KICAgIGJ6IHVuc3Rha2VfdGVybmFyeV9mYWxzZUAzCiAgICBkdXAyCiAgICAtCiAgICBidXJ5IDYKCnVuc3Rha2VfdGVybmFyeV9tZXJnZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjQ1MAogICAgLy8gY29uc3QgcGF5YWJsZTogdWludDY0ID0gdGhpcy5hY2NydWVkX3Jld2FyZHMudmFsdWUuYXNVaW50NjQoKSAtIHRoaXMucmV3YXJkc19wYWlkLnZhbHVlLmFzVWludDY0KCk7CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjM3CiAgICAvLyBhY2NydWVkX3Jld2FyZHMgPSBHbG9iYWxTdGF0ZTxVaW50NjQ+KCk7CiAgICBieXRlYyA3IC8vICJhY2NydWVkX3Jld2FyZHMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6NDUwCiAgICAvLyBjb25zdCBwYXlhYmxlOiB1aW50NjQgPSB0aGlzLmFjY3J1ZWRfcmV3YXJkcy52YWx1ZS5hc1VpbnQ2NCgpIC0gdGhpcy5yZXdhcmRzX3BhaWQudmFsdWUuYXNVaW50NjQoKTsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBidG9pCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjM5CiAgICAvLyByZXdhcmRzX3BhaWQgPSBHbG9iYWxTdGF0ZTxVaW50NjQ+KCk7CiAgICBieXRlY18yIC8vICJyZXdhcmRzX3BhaWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6NDUwCiAgICAvLyBjb25zdCBwYXlhYmxlOiB1aW50NjQgPSB0aGlzLmFjY3J1ZWRfcmV3YXJkcy52YWx1ZS5hc1VpbnQ2NCgpIC0gdGhpcy5yZXdhcmRzX3BhaWQudmFsdWUuYXNVaW50NjQoKTsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBidG9pCiAgICAtCiAgICBkdXAKICAgIGJ1cnkgOAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjQ1MQogICAgLy8gaWYgKHBlbmRpbmcgPiBwYXlhYmxlKSB7CiAgICBkaWcgNgogICAgPAogICAgYnogdW5zdGFrZV9hZnRlcl9pZl9lbHNlQDYKICAgIGRpZyA2CiAgICBidXJ5IDYKCnVuc3Rha2VfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjQ1NAogICAgLy8gY29uc3QgbGlxdWlkUmV3YXJkcyA9IHRoaXMuYXZhaWxhYmxlUmV3YXJkTGlxdWlkaXR5KCk7CiAgICBjYWxsc3ViIGF2YWlsYWJsZVJld2FyZExpcXVpZGl0eQogICAgZHVwCiAgICBidXJ5IDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6NDU1CiAgICAvLyBpZiAocGVuZGluZyA+IGxpcXVpZFJld2FyZHMpIHsKICAgIGRpZyA2CiAgICA8CiAgICBieiB1bnN0YWtlX2FmdGVyX2lmX2Vsc2VAOAogICAgZGlnIDgKICAgIGJ1cnkgNgoKdW5zdGFrZV9hZnRlcl9pZl9lbHNlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6NDU5CiAgICAvLyBpZiAocGVuZGluZyA+IDApIHsKICAgIGRpZyA1CiAgICBieiB1bnN0YWtlX2FmdGVyX2lmX2Vsc2VAMTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czo0NjAKICAgIC8vIGxldCBmZWU6IHVpbnQ2NCA9IG11bERpdlcocGVuZGluZywgdGhpcy5wbGF0Zm9ybV9mZWVfYnBzLnZhbHVlLmFzVWludDY0KCksIDEwXzAwMCk7CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjQ5CiAgICAvLyBwbGF0Zm9ybV9mZWVfYnBzID0gR2xvYmFsU3RhdGU8VWludDY0PigpOwogICAgYnl0ZWMgMTUgLy8gInBsYXRmb3JtX2ZlZV9icHMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6NDYwCiAgICAvLyBsZXQgZmVlOiB1aW50NjQgPSBtdWxEaXZXKHBlbmRpbmcsIHRoaXMucGxhdGZvcm1fZmVlX2Jwcy52YWx1ZS5hc1VpbnQ2NCgpLCAxMF8wMDApOwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbmZpZy5hbGdvLnRzOjI4CiAgICAvLyBjb25zdCBbaGksIGxvXSA9IG11bHcoYSwgYik7CiAgICBkaWcgNgogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIG11bHcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czo0NjAKICAgIC8vIGxldCBmZWU6IHVpbnQ2NCA9IG11bERpdlcocGVuZGluZywgdGhpcy5wbGF0Zm9ybV9mZWVfYnBzLnZhbHVlLmFzVWludDY0KCksIDEwXzAwMCk7CiAgICBpbnRjIDUgLy8gMTAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbmZpZy5hbGdvLnRzOjI5CiAgICAvLyByZXR1cm4gZGl2dyhoaSwgbG8sIGMpOwogICAgZGl2dwogICAgZHVwCiAgICBidXJ5IDEyCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6NDYxCiAgICAvLyBpZiAoZmVlID4gcGVuZGluZykgewogICAgPAogICAgYnogdW5zdGFrZV9hZnRlcl9pZl9lbHNlQDExCiAgICBkaWcgNQogICAgYnVyeSAxMAoKdW5zdGFrZV9hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjQ2NAogICAgLy8gY29uc3QgbmV0OiB1aW50NjQgPSBwZW5kaW5nIC0gZmVlOwogICAgZGlnIDUKICAgIGRpZyAxMAogICAgZHVwCiAgICBjb3ZlciAyCiAgICAtCiAgICBidXJ5IDkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czo0NjUKICAgIC8vIGlmIChmZWUgPiAwKSB7CiAgICBieiB1bnN0YWtlX2FmdGVyX2lmX2Vsc2VAMTMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czo0NjYKICAgIC8vIHRoaXMucGxhdGZvcm1fZmVlc19hY2NydWVkLnZhbHVlID0gbmV3IFVpbnQ2NCh0aGlzLnBsYXRmb3JtX2ZlZXNfYWNjcnVlZC52YWx1ZS5hc1VpbnQ2NCgpICsgZmVlKTsKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6NTAKICAgIC8vIHBsYXRmb3JtX2ZlZXNfYWNjcnVlZCA9IEdsb2JhbFN0YXRlPFVpbnQ2ND4oKTsKICAgIGJ5dGVjXzMgLy8gInBsYXRmb3JtX2ZlZXNfYWNjcnVlZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czo0NjYKICAgIC8vIHRoaXMucGxhdGZvcm1fZmVlc19hY2NydWVkLnZhbHVlID0gbmV3IFVpbnQ2NCh0aGlzLnBsYXRmb3JtX2ZlZXNfYWNjcnVlZC52YWx1ZS5hc1VpbnQ2NCgpICsgZmVlKTsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBidG9pCiAgICBkaWcgMTAKICAgICsKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czo1MAogICAgLy8gcGxhdGZvcm1fZmVlc19hY2NydWVkID0gR2xvYmFsU3RhdGU8VWludDY0PigpOwogICAgYnl0ZWNfMyAvLyAicGxhdGZvcm1fZmVlc19hY2NydWVkIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjQ2NgogICAgLy8gdGhpcy5wbGF0Zm9ybV9mZWVzX2FjY3J1ZWQudmFsdWUgPSBuZXcgVWludDY0KHRoaXMucGxhdGZvcm1fZmVlc19hY2NydWVkLnZhbHVlLmFzVWludDY0KCkgKyBmZWUpOwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCnVuc3Rha2VfYWZ0ZXJfaWZfZWxzZUAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czo0NjgKICAgIC8vIHRoaXMucmV3YXJkc19wYWlkLnZhbHVlID0gbmV3IFVpbnQ2NCh0aGlzLnJld2FyZHNfcGFpZC52YWx1ZS5hc1VpbnQ2NCgpICsgcGVuZGluZyk7CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjM5CiAgICAvLyByZXdhcmRzX3BhaWQgPSBHbG9iYWxTdGF0ZTxVaW50NjQ+KCk7CiAgICBieXRlY18yIC8vICJyZXdhcmRzX3BhaWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6NDY4CiAgICAvLyB0aGlzLnJld2FyZHNfcGFpZC52YWx1ZSA9IG5ldyBVaW50NjQodGhpcy5yZXdhcmRzX3BhaWQudmFsdWUuYXNVaW50NjQoKSArIHBlbmRpbmcpOwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGJ0b2kKICAgIGRpZyA2CiAgICArCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MzkKICAgIC8vIHJld2FyZHNfcGFpZCA9IEdsb2JhbFN0YXRlPFVpbnQ2ND4oKTsKICAgIGJ5dGVjXzIgLy8gInJld2FyZHNfcGFpZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czo0NjgKICAgIC8vIHRoaXMucmV3YXJkc19wYWlkLnZhbHVlID0gbmV3IFVpbnQ2NCh0aGlzLnJld2FyZHNfcGFpZC52YWx1ZS5hc1VpbnQ2NCgpICsgcGVuZGluZyk7CiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjQ2OS00NzcKICAgIC8vIGl0eG4KICAgIC8vICAgLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgIHhmZXJBc3NldDogdGhpcy5yZXdhcmRfYXNzZXRfaWQudmFsdWUuYXNVaW50NjQoKSwKICAgIC8vICAgICBhc3NldFJlY2VpdmVyOiBvcC5UeG4uc2VuZGVyLAogICAgLy8gICAgIHNlbmRlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IG5ldCwKICAgIC8vICAgICBmZWU6IDAsCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKTsKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czo0NzEKICAgIC8vIHhmZXJBc3NldDogdGhpcy5yZXdhcmRfYXNzZXRfaWQudmFsdWUuYXNVaW50NjQoKSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MjcKICAgIC8vIHJld2FyZF9hc3NldF9pZCA9IEdsb2JhbFN0YXRlPFVpbnQ2ND4oKTsKICAgIGJ5dGVjIDQgLy8gInJld2FyZF9hc3NldF9pZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czo0NzEKICAgIC8vIHhmZXJBc3NldDogdGhpcy5yZXdhcmRfYXNzZXRfaWQudmFsdWUuYXNVaW50NjQoKSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6NDcyCiAgICAvLyBhc3NldFJlY2VpdmVyOiBvcC5UeG4uc2VuZGVyLAogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjQ3MwogICAgLy8gc2VuZGVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBkaWcgMTAKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIGl0eG5fZmllbGQgU2VuZGVyCiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6NDY5LTQ3NgogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgeGZlckFzc2V0OiB0aGlzLnJld2FyZF9hc3NldF9pZC52YWx1ZS5hc1VpbnQ2NCgpLAogICAgLy8gICAgIGFzc2V0UmVjZWl2ZXI6IG9wLlR4bi5zZW5kZXIsCiAgICAvLyAgICAgc2VuZGVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgICBhc3NldEFtb3VudDogbmV0LAogICAgLy8gICAgIGZlZTogMCwKICAgIC8vICAgfSkKICAgIGludGNfMyAvLyA0CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6NDc1CiAgICAvLyBmZWU6IDAsCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czo0NjktNDc3CiAgICAvLyBpdHhuCiAgICAvLyAgIC5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgICB4ZmVyQXNzZXQ6IHRoaXMucmV3YXJkX2Fzc2V0X2lkLnZhbHVlLmFzVWludDY0KCksCiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogb3AuVHhuLnNlbmRlciwKICAgIC8vICAgICBzZW5kZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIGFzc2V0QW1vdW50OiBuZXQsCiAgICAvLyAgICAgZmVlOiAwLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCk7CiAgICBpdHhuX3N1Ym1pdAoKdW5zdGFrZV9hZnRlcl9pZl9lbHNlQDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjQ4MC00ODgKICAgIC8vIGl0eG4KICAgIC8vICAgLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgIHhmZXJBc3NldDogdGhpcy5zdGFrZWRfYXNzZXRfaWQudmFsdWUuYXNVaW50NjQoKSwKICAgIC8vICAgICBhc3NldFJlY2VpdmVyOiBvcC5UeG4uc2VuZGVyLAogICAgLy8gICAgIHNlbmRlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IGFtb3VudFRvV2l0aGRyYXcsCiAgICAvLyAgICAgZmVlOiAwLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCk7CiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6NDgyCiAgICAvLyB4ZmVyQXNzZXQ6IHRoaXMuc3Rha2VkX2Fzc2V0X2lkLnZhbHVlLmFzVWludDY0KCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjI2CiAgICAvLyBzdGFrZWRfYXNzZXRfaWQgPSBHbG9iYWxTdGF0ZTxVaW50NjQ+KCk7CiAgICBieXRlYyAxNyAvLyAic3Rha2VkX2Fzc2V0X2lkIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjQ4MgogICAgLy8geGZlckFzc2V0OiB0aGlzLnN0YWtlZF9hc3NldF9pZC52YWx1ZS5hc1VpbnQ2NCgpLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czo0ODMKICAgIC8vIGFzc2V0UmVjZWl2ZXI6IG9wLlR4bi5zZW5kZXIsCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6NDg0CiAgICAvLyBzZW5kZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIGRpZyA1CiAgICBkdXAKICAgIGNvdmVyIDQKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIGl0eG5fZmllbGQgU2VuZGVyCiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6NDgwLTQ4NwogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgeGZlckFzc2V0OiB0aGlzLnN0YWtlZF9hc3NldF9pZC52YWx1ZS5hc1VpbnQ2NCgpLAogICAgLy8gICAgIGFzc2V0UmVjZWl2ZXI6IG9wLlR4bi5zZW5kZXIsCiAgICAvLyAgICAgc2VuZGVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgICBhc3NldEFtb3VudDogYW1vdW50VG9XaXRoZHJhdywKICAgIC8vICAgICBmZWU6IDAsCiAgICAvLyAgIH0pCiAgICBpbnRjXzMgLy8gNAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjQ4NgogICAgLy8gZmVlOiAwLAogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6NDgwLTQ4OAogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgeGZlckFzc2V0OiB0aGlzLnN0YWtlZF9hc3NldF9pZC52YWx1ZS5hc1VpbnQ2NCgpLAogICAgLy8gICAgIGFzc2V0UmVjZWl2ZXI6IG9wLlR4bi5zZW5kZXIsCiAgICAvLyAgICAgc2VuZGVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgICBhc3NldEFtb3VudDogYW1vdW50VG9XaXRoZHJhdywKICAgIC8vICAgICBmZWU6IDAsCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKTsKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6NDkwCiAgICAvLyB0aGlzLnRvdGFsX3N0YWtlZC52YWx1ZSA9IG5ldyBVaW50NjQodGhpcy50b3RhbF9zdGFrZWQudmFsdWUuYXNVaW50NjQoKSAtIGFtb3VudFRvV2l0aGRyYXcpOwogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czoyOQogICAgLy8gdG90YWxfc3Rha2VkID0gR2xvYmFsU3RhdGU8VWludDY0PigpOwogICAgYnl0ZWMgNiAvLyAidG90YWxfc3Rha2VkIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjQ5MAogICAgLy8gdGhpcy50b3RhbF9zdGFrZWQudmFsdWUgPSBuZXcgVWludDY0KHRoaXMudG90YWxfc3Rha2VkLnZhbHVlLmFzVWludDY0KCkgLSBhbW91bnRUb1dpdGhkcmF3KTsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBidG9pCiAgICBkaWcgMQogICAgLQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjI5CiAgICAvLyB0b3RhbF9zdGFrZWQgPSBHbG9iYWxTdGF0ZTxVaW50NjQ+KCk7CiAgICBieXRlYyA2IC8vICJ0b3RhbF9zdGFrZWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6NDkwCiAgICAvLyB0aGlzLnRvdGFsX3N0YWtlZC52YWx1ZSA9IG5ldyBVaW50NjQodGhpcy50b3RhbF9zdGFrZWQudmFsdWUuYXNVaW50NjQoKSAtIGFtb3VudFRvV2l0aGRyYXcpOwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czo0OTIKICAgIC8vIGNvbnN0IHJlbWFpbmluZzogdWludDY0ID0gc3Rha2VOb3cgLSBhbW91bnRUb1dpdGhkcmF3OwogICAgZGlnIDQKICAgIHN3YXAKICAgIC0KICAgIGR1cAogICAgYnVyeSA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6NDkzCiAgICAvLyBpZiAocmVtYWluaW5nID09PSAwKSB7CiAgICBibnogdW5zdGFrZV9lbHNlX2JvZHlAMTkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czoyNAogICAgLy8gc3Rha2VycyA9IEJveE1hcDxBY2NvdW50LCBTdGFrZUluZm9SZWNvcmQ+KHsga2V5UHJlZml4OiAic3QiIH0pOwogICAgYnl0ZWMgNSAvLyAic3QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6NDk0CiAgICAvLyB0aGlzLnN0YWtlcnMob3AuVHhuLnNlbmRlcikuZGVsZXRlKCk7CiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MjQKICAgIC8vIHN0YWtlcnMgPSBCb3hNYXA8QWNjb3VudCwgU3Rha2VJbmZvUmVjb3JkPih7IGtleVByZWZpeDogInN0IiB9KTsKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjQ5NAogICAgLy8gdGhpcy5zdGFrZXJzKG9wLlR4bi5zZW5kZXIpLmRlbGV0ZSgpOwogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6NDk1CiAgICAvLyB0aGlzLm51bV9zdGFrZXJzLnZhbHVlID0gbmV3IFVpbnQ2NCh0aGlzLm51bV9zdGFrZXJzLnZhbHVlLmFzVWludDY0KCkgLSAxKTsKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6NDUKICAgIC8vIG51bV9zdGFrZXJzID0gR2xvYmFsU3RhdGU8VWludDY0PigpOwogICAgYnl0ZWMgMTMgLy8gIm51bV9zdGFrZXJzIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjQ5NQogICAgLy8gdGhpcy5udW1fc3Rha2Vycy52YWx1ZSA9IG5ldyBVaW50NjQodGhpcy5udW1fc3Rha2Vycy52YWx1ZS5hc1VpbnQ2NCgpIC0gMSk7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYnRvaQogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czo0NQogICAgLy8gbnVtX3N0YWtlcnMgPSBHbG9iYWxTdGF0ZTxVaW50NjQ+KCk7CiAgICBieXRlYyAxMyAvLyAibnVtX3N0YWtlcnMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6NDk1CiAgICAvLyB0aGlzLm51bV9zdGFrZXJzLnZhbHVlID0gbmV3IFVpbnQ2NCh0aGlzLm51bV9zdGFrZXJzLnZhbHVlLmFzVWludDY0KCkgLSAxKTsKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6NDk2LTUwMwogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgcmVjZWl2ZXI6IG9wLlR4bi5zZW5kZXIsCiAgICAvLyAgICAgYW1vdW50OiBCT1hfRkVFLAogICAgLy8gICAgIHNlbmRlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgZmVlOiAwLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCk7CiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6NDk4CiAgICAvLyByZWNlaXZlcjogb3AuVHhuLnNlbmRlciwKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czo1MDAKICAgIC8vIHNlbmRlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgaXR4bl9maWVsZCBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czo0OTkKICAgIC8vIGFtb3VudDogQk9YX0ZFRSwKICAgIGludGMgNiAvLyAyMjUwMAogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czo0OTYtNTAyCiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICByZWNlaXZlcjogb3AuVHhuLnNlbmRlciwKICAgIC8vICAgICBhbW91bnQ6IEJPWF9GRUUsCiAgICAvLyAgICAgc2VuZGVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgICBmZWU6IDAsCiAgICAvLyAgIH0pCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjUwMQogICAgLy8gZmVlOiAwLAogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6NDk2LTUwMwogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgcmVjZWl2ZXI6IG9wLlR4bi5zZW5kZXIsCiAgICAvLyAgICAgYW1vdW50OiBCT1hfRkVFLAogICAgLy8gICAgIHNlbmRlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgZmVlOiAwLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCk7CiAgICBpdHhuX3N1Ym1pdAoKdW5zdGFrZV9hZnRlcl9pZl9lbHNlQDIwOgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjQzNgogICAgLy8gQGFiaW1ldGhvZCh7IGFsbG93QWN0aW9uczogIk5vT3AiIH0pCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgp1bnN0YWtlX2Vsc2VfYm9keUAxOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czo1MDUKICAgIC8vIGNvbnN0IG5ld0RlYnQgPSBtdWxEaXZXKHJlbWFpbmluZywgdGhpcy5yZXdhcmRfcGVyX3Rva2VuLnZhbHVlLmFzVWludDY0KCksIFBSRUNJU0lPTik7CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjMwCiAgICAvLyByZXdhcmRfcGVyX3Rva2VuID0gR2xvYmFsU3RhdGU8VWludDY0PigpOwogICAgYnl0ZWMgOSAvLyAicmV3YXJkX3Blcl90b2tlbiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czo1MDUKICAgIC8vIGNvbnN0IG5ld0RlYnQgPSBtdWxEaXZXKHJlbWFpbmluZywgdGhpcy5yZXdhcmRfcGVyX3Rva2VuLnZhbHVlLmFzVWludDY0KCksIFBSRUNJU0lPTik7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29uZmlnLmFsZ28udHM6MjgKICAgIC8vIGNvbnN0IFtoaSwgbG9dID0gbXVsdyhhLCBiKTsKICAgIGRpZyA1CiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgbXVsdwogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjUwNQogICAgLy8gY29uc3QgbmV3RGVidCA9IG11bERpdlcocmVtYWluaW5nLCB0aGlzLnJld2FyZF9wZXJfdG9rZW4udmFsdWUuYXNVaW50NjQoKSwgUFJFQ0lTSU9OKTsKICAgIGludGMgNCAvLyAxMDAwMDAwMDAwMDAwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb25maWcuYWxnby50czoyOQogICAgLy8gcmV0dXJuIGRpdncoaGksIGxvLCBjKTsKICAgIGRpdncKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czo1MDcKICAgIC8vIHN0YWtlOiBuZXcgVWludDY0KHJlbWFpbmluZyksCiAgICBzd2FwCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6NTA4CiAgICAvLyByZXdhcmREZWJ0OiBuZXcgVWludDY0KG5ld0RlYnQpLAogICAgc3dhcAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjUwNi01MDkKICAgIC8vIHRoaXMuc3Rha2VycyhvcC5UeG4uc2VuZGVyKS52YWx1ZSA9IG5ldyBTdGFrZUluZm9SZWNvcmQoewogICAgLy8gICBzdGFrZTogbmV3IFVpbnQ2NChyZW1haW5pbmcpLAogICAgLy8gICByZXdhcmREZWJ0OiBuZXcgVWludDY0KG5ld0RlYnQpLAogICAgLy8gfSk7CiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czoyNAogICAgLy8gc3Rha2VycyA9IEJveE1hcDxBY2NvdW50LCBTdGFrZUluZm9SZWNvcmQ+KHsga2V5UHJlZml4OiAic3QiIH0pOwogICAgYnl0ZWMgNSAvLyAic3QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6NTA2CiAgICAvLyB0aGlzLnN0YWtlcnMob3AuVHhuLnNlbmRlcikudmFsdWUgPSBuZXcgU3Rha2VJbmZvUmVjb3JkKHsKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czoyNAogICAgLy8gc3Rha2VycyA9IEJveE1hcDxBY2NvdW50LCBTdGFrZUluZm9SZWNvcmQ+KHsga2V5UHJlZml4OiAic3QiIH0pOwogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6NTA2LTUwOQogICAgLy8gdGhpcy5zdGFrZXJzKG9wLlR4bi5zZW5kZXIpLnZhbHVlID0gbmV3IFN0YWtlSW5mb1JlY29yZCh7CiAgICAvLyAgIHN0YWtlOiBuZXcgVWludDY0KHJlbWFpbmluZyksCiAgICAvLyAgIHJld2FyZERlYnQ6IG5ldyBVaW50NjQobmV3RGVidCksCiAgICAvLyB9KTsKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIGIgdW5zdGFrZV9hZnRlcl9pZl9lbHNlQDIwCgp1bnN0YWtlX3Rlcm5hcnlfZmFsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czo0NDkKICAgIC8vIGxldCBwZW5kaW5nOiB1aW50NjQgPSBhY2NydWVkID4gcmVjLnJld2FyZERlYnQuYXNVaW50NjQoKSA/IGFjY3J1ZWQgLSByZWMucmV3YXJkRGVidC5hc1VpbnQ2NCgpIDogMDsKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDYKICAgIGIgdW5zdGFrZV90ZXJuYXJ5X21lcmdlQDQKCgovLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6OlN0YWtpbmcuZGVsZXRlQXBwbGljYXRpb25bcm91dGluZ10oKSAtPiB2b2lkOgpkZWxldGVBcHBsaWNhdGlvbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czo1MTUKICAgIC8vIGFzc2VydChvcC5UeG4uc2VuZGVyID09PSB0aGlzLnN1cGVyX2FkbWluX2FkZHJlc3MudmFsdWUsICJPbmx5IHN1cGVyIGFkbWluIGNhbiBkZWxldGUgYXBwbGljYXRpb24iKTsKICAgIHR4biBTZW5kZXIKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6NDQKICAgIC8vIHN1cGVyX2FkbWluX2FkZHJlc3MgPSBHbG9iYWxTdGF0ZTxBY2NvdW50PigpOwogICAgYnl0ZWMgMTggLy8gInN1cGVyX2FkbWluX2FkZHJlc3MiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6NTE1CiAgICAvLyBhc3NlcnQob3AuVHhuLnNlbmRlciA9PT0gdGhpcy5zdXBlcl9hZG1pbl9hZGRyZXNzLnZhbHVlLCAiT25seSBzdXBlciBhZG1pbiBjYW4gZGVsZXRlIGFwcGxpY2F0aW9uIik7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBPbmx5IHN1cGVyIGFkbWluIGNhbiBkZWxldGUgYXBwbGljYXRpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czo1MTYKICAgIC8vIGFzc2VydCh0aGlzLnRvdGFsX3N0YWtlZC52YWx1ZS5hc1VpbnQ2NCgpID09PSAwLCAiU3Rha2VkIGFzc2V0cyBzdGlsbCBleGlzdCIpOwogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czoyOQogICAgLy8gdG90YWxfc3Rha2VkID0gR2xvYmFsU3RhdGU8VWludDY0PigpOwogICAgYnl0ZWMgNiAvLyAidG90YWxfc3Rha2VkIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjUxNgogICAgLy8gYXNzZXJ0KHRoaXMudG90YWxfc3Rha2VkLnZhbHVlLmFzVWludDY0KCkgPT09IDAsICJTdGFrZWQgYXNzZXRzIHN0aWxsIGV4aXN0Iik7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYnRvaQogICAgIQogICAgYXNzZXJ0IC8vIFN0YWtlZCBhc3NldHMgc3RpbGwgZXhpc3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czo1MTcKICAgIC8vIGFzc2VydCh0aGlzLm51bV9zdGFrZXJzLnZhbHVlLmFzVWludDY0KCkgPT09IDAsICJTdGFrZXJzIGV4aXN0Iik7CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjQ1CiAgICAvLyBudW1fc3Rha2VycyA9IEdsb2JhbFN0YXRlPFVpbnQ2ND4oKTsKICAgIGJ5dGVjIDEzIC8vICJudW1fc3Rha2VycyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czo1MTcKICAgIC8vIGFzc2VydCh0aGlzLm51bV9zdGFrZXJzLnZhbHVlLmFzVWludDY0KCkgPT09IDAsICJTdGFrZXJzIGV4aXN0Iik7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYnRvaQogICAgIQogICAgYXNzZXJ0IC8vIFN0YWtlcnMgZXhpc3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czo1MTktNTI3CiAgICAvLyBpdHhuCiAgICAvLyAgIC5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgICB4ZmVyQXNzZXQ6IHRoaXMuc3Rha2VkX2Fzc2V0X2lkLnZhbHVlLmFzVWludDY0KCksCiAgICAvLyAgICAgYXNzZXRDbG9zZVRvOiB0aGlzLmFkbWluX2FkZHJlc3MudmFsdWUsCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IDAsCiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgZmVlOiAwLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCk7CiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6NTIxCiAgICAvLyB4ZmVyQXNzZXQ6IHRoaXMuc3Rha2VkX2Fzc2V0X2lkLnZhbHVlLmFzVWludDY0KCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjI2CiAgICAvLyBzdGFrZWRfYXNzZXRfaWQgPSBHbG9iYWxTdGF0ZTxVaW50NjQ+KCk7CiAgICBieXRlYyAxNyAvLyAic3Rha2VkX2Fzc2V0X2lkIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjUyMQogICAgLy8geGZlckFzc2V0OiB0aGlzLnN0YWtlZF9hc3NldF9pZC52YWx1ZS5hc1VpbnQ2NCgpLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGR1cAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjUyMgogICAgLy8gYXNzZXRDbG9zZVRvOiB0aGlzLmFkbWluX2FkZHJlc3MudmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjQzCiAgICAvLyBhZG1pbl9hZGRyZXNzID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oKTsKICAgIGJ5dGVjXzEgLy8gImFkbWluX2FkZHJlc3MiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6NTIyCiAgICAvLyBhc3NldENsb3NlVG86IHRoaXMuYWRtaW5fYWRkcmVzcy52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6NTI0CiAgICAvLyBhc3NldFJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czo1MjMKICAgIC8vIGFzc2V0QW1vdW50OiAwLAogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIGl0eG5fZmllbGQgQXNzZXRDbG9zZVRvCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjUxOS01MjYKICAgIC8vIGl0eG4KICAgIC8vICAgLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgIHhmZXJBc3NldDogdGhpcy5zdGFrZWRfYXNzZXRfaWQudmFsdWUuYXNVaW50NjQoKSwKICAgIC8vICAgICBhc3NldENsb3NlVG86IHRoaXMuYWRtaW5fYWRkcmVzcy52YWx1ZSwKICAgIC8vICAgICBhc3NldEFtb3VudDogMCwKICAgIC8vICAgICBhc3NldFJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgICBmZWU6IDAsCiAgICAvLyAgIH0pCiAgICBpbnRjXzMgLy8gNAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjUyNQogICAgLy8gZmVlOiAwLAogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6NTE5LTUyNwogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgeGZlckFzc2V0OiB0aGlzLnN0YWtlZF9hc3NldF9pZC52YWx1ZS5hc1VpbnQ2NCgpLAogICAgLy8gICAgIGFzc2V0Q2xvc2VUbzogdGhpcy5hZG1pbl9hZGRyZXNzLnZhbHVlLAogICAgLy8gICAgIGFzc2V0QW1vdW50OiAwLAogICAgLy8gICAgIGFzc2V0UmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIGZlZTogMCwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpOwogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czo1MjkKICAgIC8vIGlmICh0aGlzLnN0YWtlZF9hc3NldF9pZC52YWx1ZSAhPT0gdGhpcy5yZXdhcmRfYXNzZXRfaWQudmFsdWUpIHsKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MjcKICAgIC8vIHJld2FyZF9hc3NldF9pZCA9IEdsb2JhbFN0YXRlPFVpbnQ2ND4oKTsKICAgIGJ5dGVjIDQgLy8gInJld2FyZF9hc3NldF9pZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czo1MjkKICAgIC8vIGlmICh0aGlzLnN0YWtlZF9hc3NldF9pZC52YWx1ZSAhPT0gdGhpcy5yZXdhcmRfYXNzZXRfaWQudmFsdWUpIHsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAhPQogICAgYnogZGVsZXRlQXBwbGljYXRpb25fYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6NTMwLTUzOAogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgeGZlckFzc2V0OiB0aGlzLnJld2FyZF9hc3NldF9pZC52YWx1ZS5hc1VpbnQ2NCgpLAogICAgLy8gICAgIGFzc2V0Q2xvc2VUbzogdGhpcy5hZG1pbl9hZGRyZXNzLnZhbHVlLAogICAgLy8gICAgIGFzc2V0QW1vdW50OiAwLAogICAgLy8gICAgIGFzc2V0UmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIGZlZTogMCwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpOwogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjUzMgogICAgLy8geGZlckFzc2V0OiB0aGlzLnJld2FyZF9hc3NldF9pZC52YWx1ZS5hc1VpbnQ2NCgpLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czoyNwogICAgLy8gcmV3YXJkX2Fzc2V0X2lkID0gR2xvYmFsU3RhdGU8VWludDY0PigpOwogICAgYnl0ZWMgNCAvLyAicmV3YXJkX2Fzc2V0X2lkIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjUzMgogICAgLy8geGZlckFzc2V0OiB0aGlzLnJld2FyZF9hc3NldF9pZC52YWx1ZS5hc1VpbnQ2NCgpLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czo1MzMKICAgIC8vIGFzc2V0Q2xvc2VUbzogdGhpcy5hZG1pbl9hZGRyZXNzLnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czo0MwogICAgLy8gYWRtaW5fYWRkcmVzcyA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KCk7CiAgICBieXRlY18xIC8vICJhZG1pbl9hZGRyZXNzIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjUzMwogICAgLy8gYXNzZXRDbG9zZVRvOiB0aGlzLmFkbWluX2FkZHJlc3MudmFsdWUsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjUzNQogICAgLy8gYXNzZXRSZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6NTM0CiAgICAvLyBhc3NldEFtb3VudDogMCwKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBpdHhuX2ZpZWxkIEFzc2V0Q2xvc2VUbwogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czo1MzAtNTM3CiAgICAvLyBpdHhuCiAgICAvLyAgIC5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgICB4ZmVyQXNzZXQ6IHRoaXMucmV3YXJkX2Fzc2V0X2lkLnZhbHVlLmFzVWludDY0KCksCiAgICAvLyAgICAgYXNzZXRDbG9zZVRvOiB0aGlzLmFkbWluX2FkZHJlc3MudmFsdWUsCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IDAsCiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgZmVlOiAwLAogICAgLy8gICB9KQogICAgaW50Y18zIC8vIDQKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czo1MzYKICAgIC8vIGZlZTogMCwKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjUzMC01MzgKICAgIC8vIGl0eG4KICAgIC8vICAgLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgIHhmZXJBc3NldDogdGhpcy5yZXdhcmRfYXNzZXRfaWQudmFsdWUuYXNVaW50NjQoKSwKICAgIC8vICAgICBhc3NldENsb3NlVG86IHRoaXMuYWRtaW5fYWRkcmVzcy52YWx1ZSwKICAgIC8vICAgICBhc3NldEFtb3VudDogMCwKICAgIC8vICAgICBhc3NldFJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgICBmZWU6IDAsCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKTsKICAgIGl0eG5fc3VibWl0CgpkZWxldGVBcHBsaWNhdGlvbl9hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6NTEzCiAgICAvLyBAYWJpbWV0aG9kKHsgYWxsb3dBY3Rpb25zOiAiRGVsZXRlQXBwbGljYXRpb24iIH0pCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjpTdGFraW5nLnVwZGF0ZVBvb2woKSAtPiB2b2lkOgp1cGRhdGVQb29sOgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjI0MwogICAgLy8gcHJpdmF0ZSB1cGRhdGVQb29sKCk6IHZvaWQgewogICAgcHJvdG8gMCAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cG4gOAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjI0NAogICAgLy8gaWYgKHRoaXMuY29udHJhY3Rfc3RhdGUudmFsdWUgPT09IG5ldyBVaW50NjQoMCkpIHsKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6NDcKICAgIC8vIGNvbnRyYWN0X3N0YXRlID0gR2xvYmFsU3RhdGU8VWludDY0PigpOyAvLyAwID0gaW5hY3RpdmUsIDEgPSBhY3RpdmUKICAgIGJ5dGVjIDggLy8gImNvbnRyYWN0X3N0YXRlIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjI0NAogICAgLy8gaWYgKHRoaXMuY29udHJhY3Rfc3RhdGUudmFsdWUgPT09IG5ldyBVaW50NjQoMCkpIHsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBieXRlY18wIC8vIDB4MDAwMDAwMDAwMDAwMDAwMAogICAgPT0KICAgIGJ6IHVwZGF0ZVBvb2xfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MjQ1CiAgICAvLyByZXR1cm47CiAgICByZXRzdWIKCnVwZGF0ZVBvb2xfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjI0OAogICAgLy8gY29uc3Qgbm93OiB1aW50NjQgPSBHbG9iYWwubGF0ZXN0VGltZXN0YW1wOwogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czoyNDkKICAgIC8vIGNvbnN0IHN0YXJ0OiB1aW50NjQgPSB0aGlzLnN0YXJ0X3RpbWUudmFsdWUuYXNVaW50NjQoKTsKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MzIKICAgIC8vIHN0YXJ0X3RpbWUgPSBHbG9iYWxTdGF0ZTxVaW50NjQ+KCk7CiAgICBieXRlYyAyMiAvLyAic3RhcnRfdGltZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czoyNDkKICAgIC8vIGNvbnN0IHN0YXJ0OiB1aW50NjQgPSB0aGlzLnN0YXJ0X3RpbWUudmFsdWUuYXNVaW50NjQoKTsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBidG9pCiAgICBmcmFtZV9idXJ5IDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czoyNTAKICAgIC8vIGNvbnN0IGxhc3Q6IHVpbnQ2NCA9IHRoaXMubGFzdF91cGRhdGVfdGltZS52YWx1ZS5hc1VpbnQ2NCgpOwogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czozNAogICAgLy8gbGFzdF91cGRhdGVfdGltZSA9IEdsb2JhbFN0YXRlPFVpbnQ2ND4oKTsKICAgIGJ5dGVjIDEyIC8vICJsYXN0X3VwZGF0ZV90aW1lIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjI1MAogICAgLy8gY29uc3QgbGFzdDogdWludDY0ID0gdGhpcy5sYXN0X3VwZGF0ZV90aW1lLnZhbHVlLmFzVWludDY0KCk7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYnRvaQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czoyNTIKICAgIC8vIGlmIChub3cgPD0gbGFzdCkgewogICAgPD0KICAgIGJ6IHVwZGF0ZVBvb2xfYWZ0ZXJfaWZfZWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MjUzCiAgICAvLyByZXR1cm47CiAgICByZXRzdWIKCnVwZGF0ZVBvb2xfYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjI1NgogICAgLy8gaWYgKHRoaXMucmV3YXJkc19leGhhdXN0ZWQudmFsdWUuYXNVaW50NjQoKSA9PT0gMSkgewogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czozOAogICAgLy8gcmV3YXJkc19leGhhdXN0ZWQgPSBHbG9iYWxTdGF0ZTxVaW50NjQ+KCk7CiAgICBieXRlYyAxMCAvLyAicmV3YXJkc19leGhhdXN0ZWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MjU2CiAgICAvLyBpZiAodGhpcy5yZXdhcmRzX2V4aGF1c3RlZC52YWx1ZS5hc1VpbnQ2NCgpID09PSAxKSB7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYnRvaQogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBieiB1cGRhdGVQb29sX2FmdGVyX2lmX2Vsc2VANgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjI1NwogICAgLy8gdGhpcy5sYXN0X3VwZGF0ZV90aW1lLnZhbHVlID0gbmV3IFVpbnQ2NChub3cpOwogICAgZnJhbWVfZGlnIDQKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czozNAogICAgLy8gbGFzdF91cGRhdGVfdGltZSA9IEdsb2JhbFN0YXRlPFVpbnQ2ND4oKTsKICAgIGJ5dGVjIDEyIC8vICJsYXN0X3VwZGF0ZV90aW1lIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjI1NwogICAgLy8gdGhpcy5sYXN0X3VwZGF0ZV90aW1lLnZhbHVlID0gbmV3IFVpbnQ2NChub3cpOwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czoyNTgKICAgIC8vIHJldHVybjsKICAgIHJldHN1YgoKdXBkYXRlUG9vbF9hZnRlcl9pZl9lbHNlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MjYxCiAgICAvLyBjb25zdCBlbmQ6IHVpbnQ2NCA9IHRoaXMuZW5kX3RpbWUudmFsdWUuYXNVaW50NjQoKTsKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MzMKICAgIC8vIGVuZF90aW1lID0gR2xvYmFsU3RhdGU8VWludDY0PigpOwogICAgYnl0ZWMgMjEgLy8gImVuZF90aW1lIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjI2MQogICAgLy8gY29uc3QgZW5kOiB1aW50NjQgPSB0aGlzLmVuZF90aW1lLnZhbHVlLmFzVWludDY0KCk7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYnRvaQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czoyNjIKICAgIC8vIGNvbnN0IGNhcHBlZFRpbWU6IHVpbnQ2NCA9IG5vdyA+IGVuZCA/IGVuZCA6IG5vdzsKICAgIGZyYW1lX2RpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGRpZyAxCiAgICA+CiAgICBzZWxlY3QKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MjYzCiAgICAvLyBpZiAoY2FwcGVkVGltZSA8PSBzdGFydCkgewogICAgZnJhbWVfZGlnIDcKICAgIDw9CiAgICBieiB1cGRhdGVQb29sX2FmdGVyX2lmX2Vsc2VAOAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjI2NAogICAgLy8gdGhpcy5sYXN0X3VwZGF0ZV90aW1lLnZhbHVlID0gbmV3IFVpbnQ2NChjYXBwZWRUaW1lKTsKICAgIGZyYW1lX2RpZyAwCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MzQKICAgIC8vIGxhc3RfdXBkYXRlX3RpbWUgPSBHbG9iYWxTdGF0ZTxVaW50NjQ+KCk7CiAgICBieXRlYyAxMiAvLyAibGFzdF91cGRhdGVfdGltZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czoyNjQKICAgIC8vIHRoaXMubGFzdF91cGRhdGVfdGltZS52YWx1ZSA9IG5ldyBVaW50NjQoY2FwcGVkVGltZSk7CiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjI2NQogICAgLy8gcmV0dXJuOwogICAgcmV0c3ViCgp1cGRhdGVQb29sX2FmdGVyX2lmX2Vsc2VAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czoyNjgKICAgIC8vIGNvbnN0IGVmZmVjdGl2ZUxhc3Q6IHVpbnQ2NCA9IGxhc3QgPCBzdGFydCA/IHN0YXJ0IDogbGFzdDsKICAgIGZyYW1lX2RpZyAzCiAgICBkdXAKICAgIGZyYW1lX2RpZyA3CiAgICBkdXAKICAgIGNvdmVyIDMKICAgIDwKICAgIHN3YXAKICAgIGNvdmVyIDIKICAgIHNlbGVjdAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czoyNjkKICAgIC8vIGlmIChjYXBwZWRUaW1lIDw9IGVmZmVjdGl2ZUxhc3QpIHsKICAgIGZyYW1lX2RpZyAwCiAgICA+PQogICAgYnogdXBkYXRlUG9vbF9hZnRlcl9pZl9lbHNlQDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MjcwCiAgICAvLyB0aGlzLmxhc3RfdXBkYXRlX3RpbWUudmFsdWUgPSBuZXcgVWludDY0KGNhcHBlZFRpbWUpOwogICAgZnJhbWVfZGlnIDAKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czozNAogICAgLy8gbGFzdF91cGRhdGVfdGltZSA9IEdsb2JhbFN0YXRlPFVpbnQ2ND4oKTsKICAgIGJ5dGVjIDEyIC8vICJsYXN0X3VwZGF0ZV90aW1lIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjI3MAogICAgLy8gdGhpcy5sYXN0X3VwZGF0ZV90aW1lLnZhbHVlID0gbmV3IFVpbnQ2NChjYXBwZWRUaW1lKTsKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MjcxCiAgICAvLyByZXR1cm47CiAgICByZXRzdWIKCnVwZGF0ZVBvb2xfYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czoyNzQKICAgIC8vIGlmICh0aGlzLnRvdGFsX3N0YWtlZC52YWx1ZS5hc1VpbnQ2NCgpID09PSAwKSB7CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjI5CiAgICAvLyB0b3RhbF9zdGFrZWQgPSBHbG9iYWxTdGF0ZTxVaW50NjQ+KCk7CiAgICBieXRlYyA2IC8vICJ0b3RhbF9zdGFrZWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6Mjc0CiAgICAvLyBpZiAodGhpcy50b3RhbF9zdGFrZWQudmFsdWUuYXNVaW50NjQoKSA9PT0gMCkgewogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGJ0b2kKICAgIGJueiB1cGRhdGVQb29sX2FmdGVyX2lmX2Vsc2VAMTQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czoyNzUKICAgIC8vIHRoaXMubGFzdF91cGRhdGVfdGltZS52YWx1ZSA9IG5ldyBVaW50NjQoY2FwcGVkVGltZSk7CiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MzQKICAgIC8vIGxhc3RfdXBkYXRlX3RpbWUgPSBHbG9iYWxTdGF0ZTxVaW50NjQ+KCk7CiAgICBieXRlYyAxMiAvLyAibGFzdF91cGRhdGVfdGltZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czoyNzUKICAgIC8vIHRoaXMubGFzdF91cGRhdGVfdGltZS52YWx1ZSA9IG5ldyBVaW50NjQoY2FwcGVkVGltZSk7CiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjI3NgogICAgLy8gaWYgKGNhcHBlZFRpbWUgPT09IGVuZCkgewogICAgZnJhbWVfZGlnIDIKICAgID09CiAgICBieiB1cGRhdGVQb29sX2FmdGVyX2lmX2Vsc2VAMTMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czozOAogICAgLy8gcmV3YXJkc19leGhhdXN0ZWQgPSBHbG9iYWxTdGF0ZTxVaW50NjQ+KCk7CiAgICBieXRlYyAxMCAvLyAicmV3YXJkc19leGhhdXN0ZWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6Mjc3CiAgICAvLyB0aGlzLnJld2FyZHNfZXhoYXVzdGVkLnZhbHVlID0gbmV3IFVpbnQ2NCgxKTsKICAgIGJ5dGVjIDE0IC8vIDB4MDAwMDAwMDAwMDAwMDAwMQogICAgYXBwX2dsb2JhbF9wdXQKCnVwZGF0ZVBvb2xfYWZ0ZXJfaWZfZWxzZUAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czoyNzkKICAgIC8vIHJldHVybjsKICAgIHJldHN1YgoKdXBkYXRlUG9vbF9hZnRlcl9pZl9lbHNlQDE0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjI4MgogICAgLy8gY29uc3QgZHVyYXRpb246IHVpbnQ2NCA9IGNhcHBlZFRpbWUgLSBlZmZlY3RpdmVMYXN0OwogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjI4MwogICAgLy8gY29uc3QgcmVtYWluaW5nOiB1aW50NjQgPSB0aGlzLnRvdGFsX3Jld2FyZHMudmFsdWUuYXNVaW50NjQoKSAtIHRoaXMuYWNjcnVlZF9yZXdhcmRzLnZhbHVlLmFzVWludDY0KCk7CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjM2CiAgICAvLyB0b3RhbF9yZXdhcmRzID0gR2xvYmFsU3RhdGU8VWludDY0PigpOwogICAgYnl0ZWMgMTEgLy8gInRvdGFsX3Jld2FyZHMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MjgzCiAgICAvLyBjb25zdCByZW1haW5pbmc6IHVpbnQ2NCA9IHRoaXMudG90YWxfcmV3YXJkcy52YWx1ZS5hc1VpbnQ2NCgpIC0gdGhpcy5hY2NydWVkX3Jld2FyZHMudmFsdWUuYXNVaW50NjQoKTsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBidG9pCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjM3CiAgICAvLyBhY2NydWVkX3Jld2FyZHMgPSBHbG9iYWxTdGF0ZTxVaW50NjQ+KCk7CiAgICBieXRlYyA3IC8vICJhY2NydWVkX3Jld2FyZHMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MjgzCiAgICAvLyBjb25zdCByZW1haW5pbmc6IHVpbnQ2NCA9IHRoaXMudG90YWxfcmV3YXJkcy52YWx1ZS5hc1VpbnQ2NCgpIC0gdGhpcy5hY2NydWVkX3Jld2FyZHMudmFsdWUuYXNVaW50NjQoKTsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBidG9pCiAgICAtCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjI4NAogICAgLy8gY29uc3QgcmVtYWluaW5nVGltZTogdWludDY0ID0gZW5kIC0gZWZmZWN0aXZlTGFzdDsKICAgIGZyYW1lX2RpZyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIHVuY292ZXIgNAogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29uZmlnLmFsZ28udHM6MjcKICAgIC8vIGFzc2VydChjID4gMCwgIm11bERpdlc6IGRpdmlzaW9uIGJ5IHplcm8iKTsKICAgIGR1cAogICAgYXNzZXJ0IC8vIG11bERpdlc6IGRpdmlzaW9uIGJ5IHplcm8KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbmZpZy5hbGdvLnRzOjI4CiAgICAvLyBjb25zdCBbaGksIGxvXSA9IG11bHcoYSwgYik7CiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMgogICAgbXVsdwogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29uZmlnLmFsZ28udHM6MjkKICAgIC8vIHJldHVybiBkaXZ3KGhpLCBsbywgYyk7CiAgICB1bmNvdmVyIDIKICAgIGRpdncKICAgIGZyYW1lX2J1cnkgNgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjI4NgogICAgLy8gaWYgKGNhcHBlZFRpbWUgPT09IGVuZCkgewogICAgPT0KICAgIGR1cAogICAgZnJhbWVfYnVyeSA4CiAgICBieiB1cGRhdGVQb29sX2FmdGVyX2lmX2Vsc2VAMTYKICAgIGZyYW1lX2RpZyA1CiAgICBmcmFtZV9idXJ5IDYKCnVwZGF0ZVBvb2xfYWZ0ZXJfaWZfZWxzZUAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czoyODkKICAgIC8vIGlmIChyZXdhcmQgPiByZW1haW5pbmcpIHsKICAgIGZyYW1lX2RpZyA2CiAgICBmcmFtZV9kaWcgNQogICAgPgogICAgYnogdXBkYXRlUG9vbF9hZnRlcl9pZl9lbHNlQDE4CiAgICBmcmFtZV9kaWcgNQogICAgZnJhbWVfYnVyeSA2Cgp1cGRhdGVQb29sX2FmdGVyX2lmX2Vsc2VAMTg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MjkyCiAgICAvLyBpZiAocmV3YXJkID09PSAwKSB7CiAgICBmcmFtZV9kaWcgNgogICAgYm56IHVwZGF0ZVBvb2xfYWZ0ZXJfaWZfZWxzZUAyMgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjI5MwogICAgLy8gaWYgKHJlbWFpbmluZyA9PT0gMCkgewogICAgZnJhbWVfZGlnIDUKICAgIGJueiB1cGRhdGVQb29sX2FmdGVyX2lmX2Vsc2VAMjEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czozOAogICAgLy8gcmV3YXJkc19leGhhdXN0ZWQgPSBHbG9iYWxTdGF0ZTxVaW50NjQ+KCk7CiAgICBieXRlYyAxMCAvLyAicmV3YXJkc19leGhhdXN0ZWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6Mjk0CiAgICAvLyB0aGlzLnJld2FyZHNfZXhoYXVzdGVkLnZhbHVlID0gbmV3IFVpbnQ2NCgxKTsKICAgIGJ5dGVjIDE0IC8vIDB4MDAwMDAwMDAwMDAwMDAwMQogICAgYXBwX2dsb2JhbF9wdXQKCnVwZGF0ZVBvb2xfYWZ0ZXJfaWZfZWxzZUAyMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czoyOTYKICAgIC8vIHRoaXMubGFzdF91cGRhdGVfdGltZS52YWx1ZSA9IG5ldyBVaW50NjQoY2FwcGVkVGltZSk7CiAgICBmcmFtZV9kaWcgMAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjM0CiAgICAvLyBsYXN0X3VwZGF0ZV90aW1lID0gR2xvYmFsU3RhdGU8VWludDY0PigpOwogICAgYnl0ZWMgMTIgLy8gImxhc3RfdXBkYXRlX3RpbWUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6Mjk2CiAgICAvLyB0aGlzLmxhc3RfdXBkYXRlX3RpbWUudmFsdWUgPSBuZXcgVWludDY0KGNhcHBlZFRpbWUpOwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czoyOTcKICAgIC8vIHJldHVybjsKICAgIHJldHN1YgoKdXBkYXRlUG9vbF9hZnRlcl9pZl9lbHNlQDIyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjMwMAogICAgLy8gdGhpcy5hY2NydWVkX3Jld2FyZHMudmFsdWUgPSBuZXcgVWludDY0KHRoaXMuYWNjcnVlZF9yZXdhcmRzLnZhbHVlLmFzVWludDY0KCkgKyByZXdhcmQpOwogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czozNwogICAgLy8gYWNjcnVlZF9yZXdhcmRzID0gR2xvYmFsU3RhdGU8VWludDY0PigpOwogICAgYnl0ZWMgNyAvLyAiYWNjcnVlZF9yZXdhcmRzIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjMwMAogICAgLy8gdGhpcy5hY2NydWVkX3Jld2FyZHMudmFsdWUgPSBuZXcgVWludDY0KHRoaXMuYWNjcnVlZF9yZXdhcmRzLnZhbHVlLmFzVWludDY0KCkgKyByZXdhcmQpOwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGJ0b2kKICAgIGZyYW1lX2RpZyA2CiAgICBkdXAKICAgIGNvdmVyIDIKICAgICsKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czozNwogICAgLy8gYWNjcnVlZF9yZXdhcmRzID0gR2xvYmFsU3RhdGU8VWludDY0PigpOwogICAgYnl0ZWMgNyAvLyAiYWNjcnVlZF9yZXdhcmRzIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjMwMAogICAgLy8gdGhpcy5hY2NydWVkX3Jld2FyZHMudmFsdWUgPSBuZXcgVWludDY0KHRoaXMuYWNjcnVlZF9yZXdhcmRzLnZhbHVlLmFzVWludDY0KCkgKyByZXdhcmQpOwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czozMDEKICAgIC8vIGNvbnN0IGRlbHRhUlBUID0gbXVsRGl2VyhyZXdhcmQsIFBSRUNJU0lPTiwgdGhpcy50b3RhbF9zdGFrZWQudmFsdWUuYXNVaW50NjQoKSk7CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjI5CiAgICAvLyB0b3RhbF9zdGFrZWQgPSBHbG9iYWxTdGF0ZTxVaW50NjQ+KCk7CiAgICBieXRlYyA2IC8vICJ0b3RhbF9zdGFrZWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MzAxCiAgICAvLyBjb25zdCBkZWx0YVJQVCA9IG11bERpdlcocmV3YXJkLCBQUkVDSVNJT04sIHRoaXMudG90YWxfc3Rha2VkLnZhbHVlLmFzVWludDY0KCkpOwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL2NvbmZpZy5hbGdvLnRzOjI3CiAgICAvLyBhc3NlcnQoYyA+IDAsICJtdWxEaXZXOiBkaXZpc2lvbiBieSB6ZXJvIik7CiAgICBkdXAKICAgIGFzc2VydCAvLyBtdWxEaXZXOiBkaXZpc2lvbiBieSB6ZXJvCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb25maWcuYWxnby50czoyOAogICAgLy8gY29uc3QgW2hpLCBsb10gPSBtdWx3KGEsIGIpOwogICAgc3dhcAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjMwMQogICAgLy8gY29uc3QgZGVsdGFSUFQgPSBtdWxEaXZXKHJld2FyZCwgUFJFQ0lTSU9OLCB0aGlzLnRvdGFsX3N0YWtlZC52YWx1ZS5hc1VpbnQ2NCgpKTsKICAgIGludGMgNCAvLyAxMDAwMDAwMDAwMDAwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9jb25maWcuYWxnby50czoyOAogICAgLy8gY29uc3QgW2hpLCBsb10gPSBtdWx3KGEsIGIpOwogICAgbXVsdwogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvY29uZmlnLmFsZ28udHM6MjkKICAgIC8vIHJldHVybiBkaXZ3KGhpLCBsbywgYyk7CiAgICB1bmNvdmVyIDIKICAgIGRpdncKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czozMDIKICAgIC8vIHRoaXMucmV3YXJkX3Blcl90b2tlbi52YWx1ZSA9IG5ldyBVaW50NjQodGhpcy5yZXdhcmRfcGVyX3Rva2VuLnZhbHVlLmFzVWludDY0KCkgKyBkZWx0YVJQVCk7CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjMwCiAgICAvLyByZXdhcmRfcGVyX3Rva2VuID0gR2xvYmFsU3RhdGU8VWludDY0PigpOwogICAgYnl0ZWMgOSAvLyAicmV3YXJkX3Blcl90b2tlbiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czozMDIKICAgIC8vIHRoaXMucmV3YXJkX3Blcl90b2tlbi52YWx1ZSA9IG5ldyBVaW50NjQodGhpcy5yZXdhcmRfcGVyX3Rva2VuLnZhbHVlLmFzVWludDY0KCkgKyBkZWx0YVJQVCk7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYnRvaQogICAgKwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjMwCiAgICAvLyByZXdhcmRfcGVyX3Rva2VuID0gR2xvYmFsU3RhdGU8VWludDY0PigpOwogICAgYnl0ZWMgOSAvLyAicmV3YXJkX3Blcl90b2tlbiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czozMDIKICAgIC8vIHRoaXMucmV3YXJkX3Blcl90b2tlbi52YWx1ZSA9IG5ldyBVaW50NjQodGhpcy5yZXdhcmRfcGVyX3Rva2VuLnZhbHVlLmFzVWludDY0KCkgKyBkZWx0YVJQVCk7CiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjMwMwogICAgLy8gdGhpcy5sYXN0X3VwZGF0ZV90aW1lLnZhbHVlID0gbmV3IFVpbnQ2NChjYXBwZWRUaW1lKTsKICAgIGZyYW1lX2RpZyAwCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MzQKICAgIC8vIGxhc3RfdXBkYXRlX3RpbWUgPSBHbG9iYWxTdGF0ZTxVaW50NjQ+KCk7CiAgICBieXRlYyAxMiAvLyAibGFzdF91cGRhdGVfdGltZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czozMDMKICAgIC8vIHRoaXMubGFzdF91cGRhdGVfdGltZS52YWx1ZSA9IG5ldyBVaW50NjQoY2FwcGVkVGltZSk7CiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjMwNAogICAgLy8gaWYgKHRoaXMuYWNjcnVlZF9yZXdhcmRzLnZhbHVlLmFzVWludDY0KCkgPT09IHRoaXMudG90YWxfcmV3YXJkcy52YWx1ZS5hc1VpbnQ2NCgpIHx8IGNhcHBlZFRpbWUgPT09IGVuZCkgewogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czozNwogICAgLy8gYWNjcnVlZF9yZXdhcmRzID0gR2xvYmFsU3RhdGU8VWludDY0PigpOwogICAgYnl0ZWMgNyAvLyAiYWNjcnVlZF9yZXdhcmRzIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjMwNAogICAgLy8gaWYgKHRoaXMuYWNjcnVlZF9yZXdhcmRzLnZhbHVlLmFzVWludDY0KCkgPT09IHRoaXMudG90YWxfcmV3YXJkcy52YWx1ZS5hc1VpbnQ2NCgpIHx8IGNhcHBlZFRpbWUgPT09IGVuZCkgewogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGJ0b2kKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MzYKICAgIC8vIHRvdGFsX3Jld2FyZHMgPSBHbG9iYWxTdGF0ZTxVaW50NjQ+KCk7CiAgICBieXRlYyAxMSAvLyAidG90YWxfcmV3YXJkcyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czozMDQKICAgIC8vIGlmICh0aGlzLmFjY3J1ZWRfcmV3YXJkcy52YWx1ZS5hc1VpbnQ2NCgpID09PSB0aGlzLnRvdGFsX3Jld2FyZHMudmFsdWUuYXNVaW50NjQoKSB8fCBjYXBwZWRUaW1lID09PSBlbmQpIHsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBidG9pCiAgICA9PQogICAgYm56IHVwZGF0ZVBvb2xfaWZfYm9keUAyNAogICAgZnJhbWVfZGlnIDgKICAgIGJ6IHVwZGF0ZVBvb2xfYWZ0ZXJfaWZfZWxzZUAyNQoKdXBkYXRlUG9vbF9pZl9ib2R5QDI0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjM4CiAgICAvLyByZXdhcmRzX2V4aGF1c3RlZCA9IEdsb2JhbFN0YXRlPFVpbnQ2ND4oKTsKICAgIGJ5dGVjIDEwIC8vICJyZXdhcmRzX2V4aGF1c3RlZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czozMDUKICAgIC8vIHRoaXMucmV3YXJkc19leGhhdXN0ZWQudmFsdWUgPSBuZXcgVWludDY0KDEpOwogICAgYnl0ZWMgMTQgLy8gMHgwMDAwMDAwMDAwMDAwMDAxCiAgICBhcHBfZ2xvYmFsX3B1dAoKdXBkYXRlUG9vbF9hZnRlcl9pZl9lbHNlQDI1OgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjpTdGFraW5nLmF2YWlsYWJsZVJld2FyZExpcXVpZGl0eSgpIC0+IHVpbnQ2NDoKYXZhaWxhYmxlUmV3YXJkTGlxdWlkaXR5OgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjU0NQogICAgLy8gcHJpdmF0ZSBhdmFpbGFibGVSZXdhcmRMaXF1aWRpdHkoKTogdWludDY0IHsKICAgIHByb3RvIDAgMQogICAgcHVzaGJ5dGVzICIiCiAgICBkdXBuIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czo1NDYKICAgIC8vIGNvbnN0IHJld2FyZEJhbGFuY2UgPSBvcC5Bc3NldEhvbGRpbmcuYXNzZXRCYWxhbmNlKEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLCBBc3NldCh0aGlzLnJld2FyZF9hc3NldF9pZC52YWx1ZS5hc1VpbnQ2NCgpKSlbMF07CiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czoyNwogICAgLy8gcmV3YXJkX2Fzc2V0X2lkID0gR2xvYmFsU3RhdGU8VWludDY0PigpOwogICAgYnl0ZWMgNCAvLyAicmV3YXJkX2Fzc2V0X2lkIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjU0NgogICAgLy8gY29uc3QgcmV3YXJkQmFsYW5jZSA9IG9wLkFzc2V0SG9sZGluZy5hc3NldEJhbGFuY2UoR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsIEFzc2V0KHRoaXMucmV3YXJkX2Fzc2V0X2lkLnZhbHVlLmFzVWludDY0KCkpKVswXTsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBkdXAKICAgIGJ0b2kKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBwb3AKICAgIHN3YXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czo1NDkKICAgIC8vIGlmICh0aGlzLnJld2FyZF9hc3NldF9pZC52YWx1ZSA9PT0gdGhpcy5zdGFrZWRfYXNzZXRfaWQudmFsdWUpIHsKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6MjYKICAgIC8vIHN0YWtlZF9hc3NldF9pZCA9IEdsb2JhbFN0YXRlPFVpbnQ2ND4oKTsKICAgIGJ5dGVjIDE3IC8vICJzdGFrZWRfYXNzZXRfaWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6NTQ5CiAgICAvLyBpZiAodGhpcy5yZXdhcmRfYXNzZXRfaWQudmFsdWUgPT09IHRoaXMuc3Rha2VkX2Fzc2V0X2lkLnZhbHVlKSB7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgPT0KICAgIGJueiBhdmFpbGFibGVSZXdhcmRMaXF1aWRpdHlfaWZfYm9keUAxCiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfYnVyeSAwCgphdmFpbGFibGVSZXdhcmRMaXF1aWRpdHlfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjU1NAogICAgLy8gY29uc3QgcmVzZXJ2ZWRQbGF0Zm9ybUZlZXM6IHVpbnQ2NCA9IHRoaXMucGxhdGZvcm1fZmVlc19hY2NydWVkLnZhbHVlLmFzVWludDY0KCk7CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjUwCiAgICAvLyBwbGF0Zm9ybV9mZWVzX2FjY3J1ZWQgPSBHbG9iYWxTdGF0ZTxVaW50NjQ+KCk7CiAgICBieXRlY18zIC8vICJwbGF0Zm9ybV9mZWVzX2FjY3J1ZWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6NTU0CiAgICAvLyBjb25zdCByZXNlcnZlZFBsYXRmb3JtRmVlczogdWludDY0ID0gdGhpcy5wbGF0Zm9ybV9mZWVzX2FjY3J1ZWQudmFsdWUuYXNVaW50NjQoKTsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBidG9pCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjU1NQogICAgLy8gcmV0dXJuIGF2YWlsYWJsZSA+IHJlc2VydmVkUGxhdGZvcm1GZWVzID8gYXZhaWxhYmxlIC0gcmVzZXJ2ZWRQbGF0Zm9ybUZlZXMgOiAwOwogICAgZnJhbWVfZGlnIDAKICAgIDwKICAgIGJ6IGF2YWlsYWJsZVJld2FyZExpcXVpZGl0eV90ZXJuYXJ5X2ZhbHNlQDcKICAgIGZyYW1lX2RpZyAwCiAgICBmcmFtZV9kaWcgMgogICAgLQoKYXZhaWxhYmxlUmV3YXJkTGlxdWlkaXR5X3Rlcm5hcnlfbWVyZ2VAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czo1NTUKICAgIC8vIHJldHVybiBhdmFpbGFibGUgPiByZXNlcnZlZFBsYXRmb3JtRmVlcyA/IGF2YWlsYWJsZSAtIHJlc2VydmVkUGxhdGZvcm1GZWVzIDogMDsKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgphdmFpbGFibGVSZXdhcmRMaXF1aWRpdHlfdGVybmFyeV9mYWxzZUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjU1NQogICAgLy8gcmV0dXJuIGF2YWlsYWJsZSA+IHJlc2VydmVkUGxhdGZvcm1GZWVzID8gYXZhaWxhYmxlIC0gcmVzZXJ2ZWRQbGF0Zm9ybUZlZXMgOiAwOwogICAgaW50Y18wIC8vIDAKICAgIGIgYXZhaWxhYmxlUmV3YXJkTGlxdWlkaXR5X3Rlcm5hcnlfbWVyZ2VAOAoKYXZhaWxhYmxlUmV3YXJkTGlxdWlkaXR5X2lmX2JvZHlAMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czo1NTAKICAgIC8vIGNvbnN0IGxvY2tlZFN0YWtlOiB1aW50NjQgPSB0aGlzLnRvdGFsX3N0YWtlZC52YWx1ZS5hc1VpbnQ2NCgpOwogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czoyOQogICAgLy8gdG90YWxfc3Rha2VkID0gR2xvYmFsU3RhdGU8VWludDY0PigpOwogICAgYnl0ZWMgNiAvLyAidG90YWxfc3Rha2VkIgogICAgLy8gc21hcnRfY29udHJhY3RzL3N0YWtpbmcvc3Rha2luZy5hbGdvLnRzOjU1MAogICAgLy8gY29uc3QgbG9ja2VkU3Rha2U6IHVpbnQ2NCA9IHRoaXMudG90YWxfc3Rha2VkLnZhbHVlLmFzVWludDY0KCk7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYnRvaQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdGFraW5nL3N0YWtpbmcuYWxnby50czo1NTEKICAgIC8vIGF2YWlsYWJsZSA9IGF2YWlsYWJsZSA+IGxvY2tlZFN0YWtlID8gYXZhaWxhYmxlIC0gbG9ja2VkU3Rha2UgOiAwOwogICAgZnJhbWVfZGlnIDMKICAgIDwKICAgIGJ6IGF2YWlsYWJsZVJld2FyZExpcXVpZGl0eV90ZXJuYXJ5X2ZhbHNlQDMKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMQogICAgLQogICAgZnJhbWVfYnVyeSAwCiAgICBiIGF2YWlsYWJsZVJld2FyZExpcXVpZGl0eV9hZnRlcl9pZl9lbHNlQDUKCmF2YWlsYWJsZVJld2FyZExpcXVpZGl0eV90ZXJuYXJ5X2ZhbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Rha2luZy9zdGFraW5nLmFsZ28udHM6NTUxCiAgICAvLyBhdmFpbGFibGUgPSBhdmFpbGFibGUgPiBsb2NrZWRTdGFrZSA/IGF2YWlsYWJsZSAtIGxvY2tlZFN0YWtlIDogMDsKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDAKICAgIGIgYXZhaWxhYmxlUmV3YXJkTGlxdWlkaXR5X2FmdGVyX2lmX2Vsc2VANQo=", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" }, "byteCode": { "approval": "CyAHAAEIBICAmqbqr+MBkE7krwEmGAgAAAAAAAAAAA1hZG1pbl9hZGRyZXNzDHJld2FyZHNfcGFpZBVwbGF0Zm9ybV9mZWVzX2FjY3J1ZWQPcmV3YXJkX2Fzc2V0X2lkAnN0DHRvdGFsX3N0YWtlZA9hY2NydWVkX3Jld2FyZHMOY29udHJhY3Rfc3RhdGUQcmV3YXJkX3Blcl90b2tlbhFyZXdhcmRzX2V4aGF1c3RlZA10b3RhbF9yZXdhcmRzEGxhc3RfdXBkYXRlX3RpbWULbnVtX3N0YWtlcnMIAAAAAAAAAAEQcGxhdGZvcm1fZmVlX2Jwcw5yZXdhcmRzX2Z1bmRlZA9zdGFrZWRfYXNzZXRfaWQTc3VwZXJfYWRtaW5fYWRkcmVzcw9tYXN0ZXJfcmVwb19hcHALaW5pdGlhbGl6ZWQIZW5kX3RpbWUKc3RhcnRfdGltZQQVH3x1gAQkh8MsNhoAjgEAdTEZFEQxGEEAXoIMBHe8I8oEgmTJjgRxv/8RBFYTRBEEw71+1ATaJwBKBKP+pA8EkH3z9gR6nuGJBKWua9EEgTzomgQxcsqdNhoAjgwAdAGVAfoCXAKjAzEDUgNoA6AFTQY9AAEAI0OABM0Z8aY2GgCOAQANADEZgQUSMRgQREIHgTYaAUkVgSASRDYaAkkVJBJEFylPAmeCAhBjb250cmFjdF92ZXJzaW9uCAAAAAAAAA+gZycIKGcnE0xnJw8oZysoZyooZycQKGcnFChnJwYoZycNKGcjQ4AASTYaAUcCFSQSRBc2GgJHAhUkEkQXNhoDRwIVJBJEFzYaBEkVJBJEF0lOAjYaBUlOA0kVJBJEF04CMRYjCUlOAzgQIxJEMQAiKWVEEkQiJxRlRBcURCInCGVEFxREIicGZUQXFEQiJw1lRBcURExEQACmMgdFCksBSwoNREsHcQFESwZxAUxFDUSBEw5BAIVLCoETDkEAfSNEJxFLCWcnBEsHZycLSwVnSwkWJxZLAWcnFUsEZycMTGcnCShnJwcoZysoZycKKGcqKGcnEChnJxQnDmdHAjgHMgoSTDgIgYC1GBIQRLEyCiKyErIUSwdJshElshAisgGzSwYTQQATsTIKIrISshRLBbIRJbIQIrIBsyNDIkL/gEsDRQpC/1cxFiMJSTgQJRJENhoBSRUkEkQXMQAiKWVETEsBEkQiJwhlRCgSRCInB2VEFxREIicLZUQXSwISREsCOAASSwI4FDIKEhBLAjgRIicEZUQXEhBPAjgSTwISEEQnCihnJxAnDmcjQzEWIwlJOBAlEkQ2GgFJFSQSRBcxACIpZUQSRElEMgciJxVlRBcMRIgF2UsBOAAiKWVEEksCOBQyChIQSwI4ESInBGVEFxIQTwI4EksCEhBEIicLZUQXCBYnC0xnJwooZyNDMQAiKWVETEsBEkQiJwhlRCgSRCInC2VEFyInB2VEFwlJRLEiJwRlRBcyCk8CshKyALIRshQlshAisgGzJwonDmcnEChnI0MxACIpZUQSRCInEGVEFyMSRCInC2VEFyIqZUQXCYgGgQ5EsSInE2VEgASzs7fishqyGIEGshAisgGztD5JVwQATFcABCcXEkRJFYEgEkQnEkxnsSInE2VEgATxMwONshqyGIEGshAisgGztD5JVwQATFcABCcXEkRJFSQSREkXIQUORCcPTGcnCCcOZyNDMQAiKWVEEkAACzEAIicSZUQSQQAII0QnCChnI0MiQv/1NhoBSRWBIBJEMQAiKWVEEkQpTGcjQzYaAUkVgSASRDEAIicSZUQSRCIrZUQXSUQrKGexIicEZUQXMgpPArISsgCyEbIUJbIQIrIBsyNDgABHBzEWgQIJSTgQJRJENhoBSRUkEkQXSU4CMRYjCUk4ECMSREsBRCInCGVEFyMSRCInCmVEFxRESwI4ADEAEksDOBQyChIQSwM4ESInEWVEFxIQTwM4Ek8DEhBESTgAMQASSwE4BzIKEhBMOAghBhIQRCcFMQBQvUlPAkhBABSxMQAyCrIAIQayCLIHI7IQIrIBs4gDxklBAQwnBTEAUL5EIltFA0lBAPcnBTEAUL5EJFtFBCInCWVEF0sDHSEEl0lFC0sEDUEA0UsJSwQJRQUiJwdlRBciKmVEFwlJRQdLBQxBAARLBUUFiAS3SUUJSwUMQQAESwdFBUsEQQBbIicPZUQXSwVJTwIdIQWXSUULDEEABEsERQlLBEsJSU4CCUUIQQAMIitlRBdLCQgWK0xnIiplRBdLBQgWKkxnsSInBGVEFzEAMgpLCbISsgCyFLIRJbIQIrIBs0sCSwJJTgIIIicGZUQXTwIIFicGTGciJwllRBdLAR0hBJdMFkwWUCcFMQBQTL9JQAANIicNZUQXIwgWJw1MZyNDIkUFQv8wIkUEQv8OIkUDQv75gABHBCcFMQBQvUUBRCInCGVEFyMSRCcFMQBQvkRJVwAITEkiW0lOAklEiAKDIicJZUQXHSEEl0lPAiRbSU4CDUEAp0oJRQUiJwdlRBciKmVEFwlJRQdLBQxBAARLBUUFiAOUSUUJSwUMQQAESwdFBUsEQQBbIicPZUQXSwVJTwIdIQWXSUULDEEABEsERQlLBEsJSU4CCUUIQQAMIitlRBdLCQgWK0xnIiplRBdLBQgWKkxnsSInBGVEFzEAMgpLCbISsgCyFLIRJbIQIrIBsyInCWVEF0sDHSEElxZLBExQJwUxAFBMvyNDIkUFQv9XgABHBTYaAUkVJBJEFycFMQBQvUUBRCcFMQBQvkRJIltJTgNJRIgBmEsCFE8DSwJPAk1JTgNLAQ5EIicJZUQXHSEEl0lPAiRbSU4CDUEBDEoJRQYiJwdlRBciKmVEFwlJRQhLBgxBAARLBkUGiAKYSUUKSwYMQQAESwhFBksFQQBbIicPZUQXSwZJTwIdIQWXSUUMDEEABEsFRQpLBUsKSU4CCUUJQQAMIitlRBdLCggWK0xnIiplRBdLBggWKkxnsSInBGVEFzEAMgpLCrISsgCyFLIRJbIQIrIBs7EiJxFlRBcxADIKSwVJTgSyErIAshSyESWyECKyAbMiJwZlRBdLAQkWJwZMZ0sETAlJRQZAAConBTEAULxIIicNZUQXIwkWJw1MZ7ExADIKsgAhBrIIsgcjshAisgGzI0MiJwllRBdLBUlPAh0hBJdMFkwWUCcFMQBQTL9C/+AiRQZC/vIxACInEmVEEkQiJwZlRBcURCInDWVEFxREsSInEWVESRciKWVEMgqyFCKyErIVshElshAisgGzIicEZUQTQQAdsSInBGVEFyIpZUQyCrIUIrISshWyESWyECKyAbMjQ4oAAIAARwgiJwhlRCgSQQABiTIHSYwEIicWZUQXjAciJwxlRBdJjAMOQQABiSInCmVEFyMSQQAIiwQWJwxMZ4kiJxVlRBdJjAKLBElOAksBDU1JjACLBw5BAAiLABYnDExniYsDSYsHSU4DDExOAk1JjAGLAA9BAAiLABYnDExniSInBmVEF0AAFIsASRYnDExniwISQQAFJwonDmeJiwBJiwFJTgIJIicLZUQXIicHZUQXCUmMBYsCSU4CTwQJSURPA08CHU8Cl4wGEkmMCEEABIsFjAaLBosFDUEABIsFjAaLBkAAEosFQAAFJwonDmeLABYnDExniSInB2VEF4sGSU4CCBYnB0xnIicGZUQXSURMIQQdTwKXIicJZUQXCBYnCUxniwAWJwxMZyInB2VEFyInC2VEFxJAAAWLCEEABScKJw5niYoAAYAARwIyCiInBGVESRdPAkxwAEhMIicRZUQSQAAeiwOMACIrZUQXSYwCiwAMQQAIiwCLAgmMAIkiQv/5IicGZUQXSYwBiwMMQQAKiwOLAQmMAEL/zSKMAEL/xw==", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, "minor": 3, "patch": 2 } }, "events": [], "templateVariables": {} }