{ "name": "OrbitalPool", "structs": { "PoolInfo": [ { "name": "n", "type": "uint64" }, { "name": "r_int", "type": "uint64" }, { "name": "s_bound", "type": "uint64" }, { "name": "k_bound", "type": "uint64" }, { "name": "sqrt_n", "type": "uint64" }, { "name": "inv_sqrt_n", "type": "uint64" }, { "name": "num_ticks", "type": "uint64" }, { "name": "fee_bps", "type": "uint64" }, { "name": "virtual_offset", "type": "uint64" }, { "name": "paused", "type": "uint64" }, { "name": "sum_x", "type": "uint64" }, { "name": "sum_x_sq", "type": "uint64" }, { "name": "total_r", "type": "uint64" }, { "name": "amount_scale", "type": "uint64" } ], "PositionInfo": [ { "name": "shares", "type": "uint64" }, { "name": "position_r", "type": "uint64" } ], "TickData": [ { "name": "r", "type": "uint64" }, { "name": "k", "type": "uint64" }, { "name": "state", "type": "uint8" }, { "name": "total_shares", "type": "uint64" } ] }, "methods": [ { "name": "create", "args": [ { "type": "uint64", "name": "n" }, { "type": "uint64", "name": "sqrt_n_scaled" }, { "type": "uint64", "name": "inv_sqrt_n_scaled" } ], "returns": { "type": "void" }, "actions": { "create": [ "NoOp" ], "call": [] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "bootstrap", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Allocate reserves and fee_growth boxes. Idempotent if boxes already exist.", "events": [], "recommendations": {} }, { "name": "budget", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Opcode-budget pooling dummy. SDK groups these before heavy calls.", "events": [], "recommendations": {} }, { "name": "register_token", "args": [ { "type": "uint64", "name": "token_idx" }, { "type": "uint64", "name": "asset_id" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "set_paused", "args": [ { "type": "uint64", "name": "flag" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "set_fee", "args": [ { "type": "uint64", "name": "new_fee_bps" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "add_tick", "args": [ { "type": "uint64", "name": "r" }, { "type": "uint64", "name": "k" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Add a new concentrated-liquidity position.\nCaller must include n asset-transfer transactions immediately before this call in the same atomic group, each sending deposit_per_token of the corresponding registered token to the pool address.\nCreates a position box for (Txn.sender, new_tick_id). Updates total_r, r_int, virtual_offset, sum_x, sum_x_sq.", "events": [], "recommendations": {} }, { "name": "claim_fees", "args": [ { "type": "uint64", "name": "tick_id" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Claim accrued swap fees for position (Txn.sender, tick_id).\nSends each token's claimable fee to Txn.sender, then resets the position's fee_growth checkpoints to the current global values. Calling this does NOT withdraw principal.\nFee safety: checkpoints are updated atomically with the sends. A reverted transaction rolls back all inner sends AND the checkpoint update, leaving the position unchanged. No double-claim is possible.\nOpcode budget: group with \u22652 budget() calls for n=5.", "events": [], "recommendations": {} }, { "name": "remove_liquidity", "args": [ { "type": "uint64", "name": "tick_id" }, { "type": "uint64", "name": "shares" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Remove liquidity from position (Txn.sender, tick_id).\nAuthorization: position box must exist for (Txn.sender, tick_id).\nFlow: 1. Settle outstanding fees via fee_growth checkpoints (atomic). 2. Compute LP's reserve entitlement: pos_r / total_r of each reserve. 3. Update consolidation state (r_int / s_bound / k_bound / total_r). 4. Recompute virtual_offset, sum_x, sum_x_sq from scratch (O(n)). 5. Send principal + fees to caller. 6. Update or delete tick and position boxes.\nPartial withdrawal reduces tick.r and tick.k proportionally. The position checkpoint is reset to prevent future double-claim on the remaining shares.\nOpcode budget: group with \u22652 budget() calls for n=5.", "events": [], "recommendations": {} }, { "name": "swap", "args": [ { "type": "uint64", "name": "token_in_idx" }, { "type": "uint64", "name": "token_out_idx" }, { "type": "uint64", "name": "amount_in" }, { "type": "uint64", "name": "claimed_amount_out" }, { "type": "uint64", "name": "min_amount_out" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Single-segment O(1) swap.\nThe transaction immediately preceding this call in the group must be an asset transfer of amount_in of tokens[token_in_idx] to the pool.\nFee is deducted from amount_in before invariant verification. The fee stays in the contract's ASA balance and is tracked via fee_growth (PRECISION-scaled per-r accumulator), NOT in a fees box.", "events": [], "recommendations": {} }, { "name": "swap_with_crossings", "args": [ { "type": "uint64", "name": "token_in_idx" }, { "type": "uint64", "name": "token_out_idx" }, { "type": "uint64", "name": "total_amount_in" }, { "type": "byte[]", "name": "trade_recipe" }, { "type": "uint64", "name": "min_amount_out" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Multi-segment swap with tick-crossing verification.\ntrade_recipe is an ABI-encoded sequence of TradeSegment structs (each 25 bytes: amount_in_8 + amount_out_8 + tick_crossed_id_8 + new_state_1).\nFor each segment the contract: 1. Updates running reserves and aggregates. 2. If a crossing is claimed, transitions the tick's state and verifies that \u03b1_int_norm \u2248 k/r at the crossing boundary. 3. Verifies the torus invariant after the segment.\nAfter all segments: - Checks total_seg_in == effective_total_in (no input unaccounted). - Checks total_seg_out >= min_amount_out (slippage protection). - Persists final reserves and consolidation state. - Accumulates fee into fee_growth (same as swap()).\nCrossing correctness: the k_norm \u2248 \u03b1_int_norm check is guarded by cur_r_int > 0 (after the transition), so a trade that drives ALL interior ticks to boundary in one segment is also handled.", "events": [], "recommendations": {} }, { "name": "get_pool_info", "args": [], "returns": { "type": "(uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "struct": "PoolInfo" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Full pool parameter snapshot in a single call.\nIncludes total_r (new in v2) alongside all existing consolidation and invariant parameters.", "events": [], "recommendations": {} }, { "name": "get_tick_info", "args": [ { "type": "uint64", "name": "tick_id" } ], "returns": { "type": "(uint64,uint64,uint8,uint64)", "struct": "TickData" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Return TickData for a given tick. Reverts if tick does not exist.", "events": [], "recommendations": {} }, { "name": "get_position", "args": [ { "type": "address", "name": "owner" }, { "type": "uint64", "name": "tick_id" } ], "returns": { "type": "(uint64,uint64)", "struct": "PositionInfo" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Return position summary for (owner, tick_id).\nReverts if the position or tick does not exist. position_r = tick.r \u00d7 shares / tick.total_shares.", "events": [], "recommendations": {} }, { "name": "get_reserves", "args": [], "returns": { "type": "byte[]" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Return raw actual-reserve bytes: n \u00d7 8 bytes, big-endian uint64 per token.\nDoes NOT include accumulated fees (those live in the contract's ASA balance above the reserve level and are accounted via fee_growth).", "events": [], "recommendations": {} }, { "name": "get_fee_growth", "args": [], "returns": { "type": "byte[]" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Return raw fee_growth bytes: n \u00d7 8 bytes, PRECISION-scaled per-r accumulator.\nSDK usage: fee_growth[i] is a monotone value that grows with every swap. To compute claimable fees for a position, use get_fees_for_position().", "events": [], "recommendations": {} }, { "name": "get_registered_tokens", "args": [], "returns": { "type": "byte[]" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Return ASA IDs for all registered tokens: n \u00d7 8 bytes, big-endian uint64.", "events": [], "recommendations": {} }, { "name": "get_fees_for_position", "args": [ { "type": "address", "name": "owner" }, { "type": "uint64", "name": "tick_id" } ], "returns": { "type": "byte[]" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Return claimable fee amounts per token for position (owner, tick_id).\nReturns n \u00d7 8 bytes; decode each 8-byte chunk as a big-endian uint64 claimable amount for the corresponding token index.\nThe returned amounts are what claim_fees() would send at this moment. They are floor-divided so the actual on-chain claim matches exactly.", "events": [], "recommendations": {} }, { "name": "list_ticks", "args": [ { "type": "uint64", "name": "start" }, { "type": "uint64", "name": "limit" } ], "returns": { "type": "(uint64,uint64,uint64,uint8,uint64)[]" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Return up to `limit` ticks starting from tick_id = start.\nOnly existing (non-deleted) ticks are included. Caller should pool budget transactions for large limits.\nExample SDK decode (TypeScript): const entries = result.value.map(e => ({ tickId: e.tick_id, r: e.r, ... }))", "events": [], "recommendations": {} }, { "name": "get_price", "args": [ { "type": "uint64", "name": "token_in_idx" }, { "type": "uint64", "name": "token_out_idx" } ], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Instantaneous spot price of token_out in terms of token_in.\nPRECISION-scaled: result = PRECISION means 1:1 parity.\nNote: This is an interior-tick approximation using r_int as the effective radius. It is accurate near equal-price but less so when significant boundary-tick liquidity is present. Use the off-chain simulator for precise trade sizing.", "events": [], "recommendations": {} } ], "arcs": [ 22, 28 ], "desc": "Orbital AMM pool \u2014 multi-stablecoin concentrated liquidity on Algorand.\n\n v2: multi-LP positions, fee-growth checkpoint accounting, production read API.\n ", "networks": {}, "state": { "schema": { "global": { "ints": 15, "bytes": 1 }, "local": { "ints": 0, "bytes": 0 } }, "keys": { "global": { "n": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "bg==" }, "bootstrapped": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "Ym9vdHN0cmFwcGVk" }, "registered_tokens": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "cmVnaXN0ZXJlZF90b2tlbnM=" }, "sum_x": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "c3VtX3g=" }, "sum_x_sq": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "c3VtX3hfc3E=" }, "r_int": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "cl9pbnQ=" }, "s_bound": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "c19ib3VuZA==" }, "k_bound": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "a19ib3VuZA==" }, "virtual_offset": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "dmlydHVhbF9vZmZzZXQ=" }, "num_ticks": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "bnVtX3RpY2tz" }, "sqrt_n": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "c3FydF9u" }, "inv_sqrt_n": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "aW52X3NxcnRfbg==" }, "paused": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "cGF1c2Vk" }, "fee_bps": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "ZmVlX2Jwcw==" }, "creator": { "keyType": "AVMString", "valueType": "address", "key": "Y3JlYXRvcg==" }, "total_r": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "dG90YWxfcg==" } }, "local": {}, "box": { "reserves": { "keyType": "AVMBytes", "valueType": "AVMBytes", "key": "cmVzZXJ2ZXM=" }, "fee_growth": { "keyType": "AVMBytes", "valueType": "AVMBytes", "key": "ZmVlX2dyb3d0aA==" } } }, "maps": { "global": {}, "local": {}, "box": { "tokens": { "keyType": "uint64", "valueType": "uint64", "prefix": "dG9rZW46" }, "ticks": { "keyType": "uint64", "valueType": "TickData", "prefix": "dGljazo=" }, "positions": { "keyType": "AVMBytes", "valueType": "AVMBytes", "prefix": "cG9zOg==" } } } }, "bareActions": { "create": [], "call": [] }, "sourceInfo": { "approval": { "sourceInfo": [ { "pc": [ 908, 978, 1129, 1564, 1768, 2408, 2829, 3817, 3842, 3867, 4253 ], "errorMessage": "check self.bootstrapped exists" }, { "pc": [ 1052, 1076 ], "errorMessage": "check self.creator exists" }, { "pc": [ 2477, 2894, 3625 ], "errorMessage": "check self.fee_bps exists" }, { "pc": [ 940, 3848 ], "errorMessage": "check self.fee_growth exists" }, { "pc": [ 2656, 2952, 3613 ], "errorMessage": "check self.inv_sqrt_n exists" }, { "pc": [ 2324, 2646, 2984, 3601 ], "errorMessage": "check self.k_bound exists" }, { "pc": [ 914, 985, 1147, 1634, 1786, 2420, 2631, 2841, 2936, 3583, 3874, 4001, 4260 ], "errorMessage": "check self.n exists" }, { "pc": [ 1397, 3225, 3619, 4119 ], "errorMessage": "check self.num_ticks exists" }, { "pc": [ 902, 972, 1123, 1558, 1762, 2402, 2823, 3637 ], "errorMessage": "check self.paused exists" }, { "pc": [ 1493, 2020, 2636, 2968, 3589, 4283 ], "errorMessage": "check self.r_int exists" }, { "pc": [ 1010, 1137, 1776, 2416, 2837 ], "errorMessage": "check self.registered_tokens exists" }, { "pc": [ 926, 3823 ], "errorMessage": "check self.reserves exists" }, { "pc": [ 2309, 2641, 2976, 3595 ], "errorMessage": "check self.s_bound exists" }, { "pc": [ 1160, 1881, 2651, 2944, 3607 ], "errorMessage": "check self.sqrt_n exists" }, { "pc": [ 1523, 2574, 3011, 3643 ], "errorMessage": "check self.sum_x exists" }, { "pc": [ 1258, 2591, 3016, 3649 ], "errorMessage": "check self.sum_x_sq exists" }, { "pc": [ 4164 ], "errorMessage": "check self.ticks entry exists" }, { "pc": [ 1290, 1705, 1994, 2158, 2454, 2464, 2871, 2881, 3893 ], "errorMessage": "check self.tokens entry exists" }, { "pc": [ 1508, 1932, 2032, 2709, 3529, 3655 ], "errorMessage": "check self.total_r exists" }, { "pc": [ 1252, 2063, 2496, 2960, 3631, 4278 ], "errorMessage": "check self.virtual_offset exists" }, { "pc": [ 2799 ], "errorMessage": "invalid array length header" }, { "pc": [ 2807 ], "errorMessage": "invalid number of bytes for arc4.dynamic_array" }, { "pc": [ 3743, 3938 ], "errorMessage": "invalid number of bytes for arc4.static_array" }, { "pc": [ 758, 767, 776, 957, 966, 1044, 1068, 1104, 1117, 1552, 1744, 1753, 2357, 2366, 2375, 2384, 2396, 2774, 2783, 2792, 2815, 3714, 3751, 3946, 4100, 4109, 4239, 4248 ], "errorMessage": "invalid number of bytes for arc4.uint64" }, { "pc": [ 4202 ], "errorMessage": "max array length exceeded" }, { "pc": [ 3322 ], "errorMessage": "overflow" }, { "pc": [ 575, 1281 ], "errorMessage": "transaction type is axfer" } ], "pcOffsetMethod": "none" }, "clear": { "sourceInfo": [], "pcOffsetMethod": "none" } }, "source": { "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDggMSAxMDAwMDAwMDAwIDEwMDAgMTAwMDAKICAgIGJ5dGVjYmxvY2sgMHg3MjY1NzM2NTcyNzY2NTczICJuIiAiYm9vdHN0cmFwcGVkIiAweDY2NjU2NTVmNjc3MjZmNzc3NDY4ICJyX2ludCIgInBhdXNlZCIgInN1bV94IiAic3VtX3hfc3EiICJ2aXJ0dWFsX29mZnNldCIgInRvdGFsX3IiIDB4NzQ2ZjZiNjU2ZTNhIDB4MTUxZjdjNzUgInJlZ2lzdGVyZWRfdG9rZW5zIiAic19ib3VuZCIgImtfYm91bmQiIDB4NzQ2OTYzNmIzYSAibnVtX3RpY2tzIiAic3FydF9uIiAiZmVlX2JwcyIgImludl9zcXJ0X24iIDB4NzA2ZjczM2EgImNyZWF0b3IiCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjM1Mi0zNTMKICAgIC8vICMg4pSA4pSAIFNjYWxhciBnbG9iYWwgc3RhdGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICAvLyBzZWxmLm4gPSBHbG9iYWxTdGF0ZShVSW50NjQoMCkpCiAgICBieXRlY18xIC8vICJuIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjM1NAogICAgLy8gc2VsZi5ib290c3RyYXBwZWQgPSBHbG9iYWxTdGF0ZShVSW50NjQoMCkpCiAgICBieXRlY18yIC8vICJib290c3RyYXBwZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6MzU1CiAgICAvLyBzZWxmLnJlZ2lzdGVyZWRfdG9rZW5zID0gR2xvYmFsU3RhdGUoVUludDY0KDApKQogICAgYnl0ZWMgMTIgLy8gInJlZ2lzdGVyZWRfdG9rZW5zIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjM1NgogICAgLy8gc2VsZi5zdW1feCA9IEdsb2JhbFN0YXRlKFVJbnQ2NCgwKSkKICAgIGJ5dGVjIDYgLy8gInN1bV94IgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjM1NwogICAgLy8gc2VsZi5zdW1feF9zcSA9IEdsb2JhbFN0YXRlKFVJbnQ2NCgwKSkKICAgIGJ5dGVjIDcgLy8gInN1bV94X3NxIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjM1OAogICAgLy8gc2VsZi5yX2ludCA9IEdsb2JhbFN0YXRlKFVJbnQ2NCgwKSkKICAgIGJ5dGVjIDQgLy8gInJfaW50IgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjM1OQogICAgLy8gc2VsZi5zX2JvdW5kID0gR2xvYmFsU3RhdGUoVUludDY0KDApKQogICAgYnl0ZWMgMTMgLy8gInNfYm91bmQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6MzYwCiAgICAvLyBzZWxmLmtfYm91bmQgPSBHbG9iYWxTdGF0ZShVSW50NjQoMCkpCiAgICBieXRlYyAxNCAvLyAia19ib3VuZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTozNjEKICAgIC8vIHNlbGYudmlydHVhbF9vZmZzZXQgPSBHbG9iYWxTdGF0ZShVSW50NjQoMCkpCiAgICBieXRlYyA4IC8vICJ2aXJ0dWFsX29mZnNldCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTozNjIKICAgIC8vIHNlbGYubnVtX3RpY2tzID0gR2xvYmFsU3RhdGUoVUludDY0KDApKQogICAgYnl0ZWMgMTYgLy8gIm51bV90aWNrcyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTozNjMKICAgIC8vIHNlbGYuc3FydF9uID0gR2xvYmFsU3RhdGUoVUludDY0KDApKQogICAgYnl0ZWMgMTcgLy8gInNxcnRfbiIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTozNjQKICAgIC8vIHNlbGYuaW52X3NxcnRfbiA9IEdsb2JhbFN0YXRlKFVJbnQ2NCgwKSkKICAgIGJ5dGVjIDE5IC8vICJpbnZfc3FydF9uIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjM2NQogICAgLy8gc2VsZi5wYXVzZWQgPSBHbG9iYWxTdGF0ZShVSW50NjQoMCkpCiAgICBieXRlYyA1IC8vICJwYXVzZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6MzY2CiAgICAvLyBzZWxmLmZlZV9icHMgPSBHbG9iYWxTdGF0ZShVSW50NjQoMCkpCiAgICBieXRlYyAxOCAvLyAiZmVlX2JwcyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTozNjcKICAgIC8vIHNlbGYuY3JlYXRvciA9IEdsb2JhbFN0YXRlKEFjY291bnQoKSkKICAgIGJ5dGVjIDIxIC8vICJjcmVhdG9yIgogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTozNjgtMzcwCiAgICAvLyAjIE5FVyBpbiB2Mjogc3VtIG9mIHIgZm9yIEFMTCB0aWNrcyAoaW50ZXJpb3IgKyBib3VuZGFyeSkuCiAgICAvLyAjIFVzZWQgZm9yIE8oMSkgcHJvLXJhdGEgcmVzZXJ2ZSBhbmQgZmVlIGRpc3RyaWJ1dGlvbi4KICAgIC8vIHNlbGYudG90YWxfciA9IEdsb2JhbFN0YXRlKFVJbnQ2NCgwKSkKICAgIGJ5dGVjIDkgLy8gInRvdGFsX3IiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTozNDUKICAgIC8vIGNsYXNzIE9yYml0YWxQb29sKEFSQzRDb250cmFjdCk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBieiBtYWluX2NyZWF0ZV9Ob09wQDI1CiAgICBwdXNoYnl0ZXNzIDB4YmVjNzZkODcgMHhlYjE1MGYxMiAweDQyM2E3MTY3IDB4MGE4YTQ2NzYgMHhmYzRiODhiNyAweGNhYWFhYTZiIDB4MjgwYzFjOTMgMHgwM2ZjM2IyYSAweGFlNjQ5NmQyIDB4NzFkODAwMTMgMHhlZTc1MjhjYyAweGIwZGUwMjUyIDB4YTM0Y2RmZDkgMHg5YTEzYzMzMCAweGQzNGRiMmE1IDB4MmE2OGQzZjcgMHg3NDRjNzFjYiAweDRkNDM1MDliIDB4NmY3YTBjZDIgLy8gbWV0aG9kICJib290c3RyYXAoKXZvaWQiLCBtZXRob2QgImJ1ZGdldCgpdm9pZCIsIG1ldGhvZCAicmVnaXN0ZXJfdG9rZW4odWludDY0LHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJzZXRfcGF1c2VkKHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJzZXRfZmVlKHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJhZGRfdGljayh1aW50NjQsdWludDY0KXZvaWQiLCBtZXRob2QgImNsYWltX2ZlZXModWludDY0KXZvaWQiLCBtZXRob2QgInJlbW92ZV9saXF1aWRpdHkodWludDY0LHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJzd2FwKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpdm9pZCIsIG1ldGhvZCAic3dhcF93aXRoX2Nyb3NzaW5ncyh1aW50NjQsdWludDY0LHVpbnQ2NCxieXRlW10sdWludDY0KXZvaWQiLCBtZXRob2QgImdldF9wb29sX2luZm8oKSh1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSIsIG1ldGhvZCAiZ2V0X3RpY2tfaW5mbyh1aW50NjQpKHVpbnQ2NCx1aW50NjQsdWludDgsdWludDY0KSIsIG1ldGhvZCAiZ2V0X3Bvc2l0aW9uKGFkZHJlc3MsdWludDY0KSh1aW50NjQsdWludDY0KSIsIG1ldGhvZCAiZ2V0X3Jlc2VydmVzKClieXRlW10iLCBtZXRob2QgImdldF9mZWVfZ3Jvd3RoKClieXRlW10iLCBtZXRob2QgImdldF9yZWdpc3RlcmVkX3Rva2VucygpYnl0ZVtdIiwgbWV0aG9kICJnZXRfZmVlc19mb3JfcG9zaXRpb24oYWRkcmVzcyx1aW50NjQpYnl0ZVtdIiwgbWV0aG9kICJsaXN0X3RpY2tzKHVpbnQ2NCx1aW50NjQpKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ4LHVpbnQ2NClbXSIsIG1ldGhvZCAiZ2V0X3ByaWNlKHVpbnQ2NCx1aW50NjQpdWludDY0IgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggYm9vdHN0cmFwIG1haW5fYnVkZ2V0X3JvdXRlQDYgcmVnaXN0ZXJfdG9rZW4gc2V0X3BhdXNlZCBzZXRfZmVlIGFkZF90aWNrIGNsYWltX2ZlZXMgcmVtb3ZlX2xpcXVpZGl0eSBzd2FwIHN3YXBfd2l0aF9jcm9zc2luZ3MgZ2V0X3Bvb2xfaW5mbyBnZXRfdGlja19pbmZvIGdldF9wb3NpdGlvbiBnZXRfcmVzZXJ2ZXMgZ2V0X2ZlZV9ncm93dGggZ2V0X3JlZ2lzdGVyZWRfdG9rZW5zIGdldF9mZWVzX2Zvcl9wb3NpdGlvbiBsaXN0X3RpY2tzIGdldF9wcmljZQogICAgZXJyCgptYWluX2J1ZGdldF9yb3V0ZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo0NDAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaW50Y18yIC8vIDEKICAgIHJldHVybgoKbWFpbl9jcmVhdGVfTm9PcEAyNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6MzQ1CiAgICAvLyBjbGFzcyBPcmJpdGFsUG9vbChBUkM0Q29udHJhY3QpOgogICAgcHVzaGJ5dGVzIDB4N2VmZGE0ZDIgLy8gbWV0aG9kICJjcmVhdGUodWludDY0LHVpbnQ2NCx1aW50NjQpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIGNyZWF0ZQogICAgZXJyCgoKLy8gc21hcnRfY29udHJhY3RzLm9yYml0YWxfcG9vbC5jb250cmFjdC5hYnNfZGlmZihsaHM6IHVpbnQ2NCwgcmhzOiB1aW50NjQpIC0+IHVpbnQ2NDoKYWJzX2RpZmY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjIzMS0yMzIKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYWJzX2RpZmYobGhzOiBVSW50NjQsIHJoczogVUludDY0KSAtPiBVSW50NjQ6CiAgICBwcm90byAyIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6MjMzCiAgICAvLyBpZiBsaHMgPj0gcmhzOgogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgID49CiAgICBieiBhYnNfZGlmZl9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6MjM0CiAgICAvLyByZXR1cm4gbGhzIC0gcmhzCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgLQogICAgcmV0c3ViCgphYnNfZGlmZl9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjIzNQogICAgLy8gcmV0dXJuIHJocyAtIGxocwogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9kaWcgLTIKICAgIC0KICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5vcmJpdGFsX3Bvb2wuY29udHJhY3QueF9taW5fZm9yX3RpY2socjogdWludDY0LCBrOiB1aW50NjQsIG46IHVpbnQ2NCwgc3FydF9uOiB1aW50NjQpIC0+IHVpbnQ2NDoKeF9taW5fZm9yX3RpY2s6CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjI1NC0yNTUKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgeF9taW5fZm9yX3RpY2socjogVUludDY0LCBrOiBVSW50NjQsIG46IFVJbnQ2NCwgc3FydF9uOiBVSW50NjQpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDQgMQogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToyNTcKICAgIC8vIGMgPSAobiAqIHIpIC0gbXVsX2Rpdl9mbG9vcihrLCBzcXJ0X24sIFVJbnQ2NChfUFJFQ0lTSU9OKSkKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC00CiAgICAqCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjE4MgogICAgLy8gaGlnaCwgbG93ID0gb3AubXVsdyhsaHMsIHJocykKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIC0xCiAgICBtdWx3CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjI1NwogICAgLy8gYyA9IChuICogcikgLSBtdWxfZGl2X2Zsb29yKGssIHNxcnRfbiwgVUludDY0KF9QUkVDSVNJT04pKQogICAgaW50Y18zIC8vIDEwMDAwMDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6MTgzCiAgICAvLyByZXR1cm4gb3AuZGl2dyhoaWdoLCBsb3csIGRlbm9taW5hdG9yKQogICAgZGl2dwogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToyNTcKICAgIC8vIGMgPSAobiAqIHIpIC0gbXVsX2Rpdl9mbG9vcihrLCBzcXJ0X24sIFVJbnQ2NChfUFJFQ0lTSU9OKSkKICAgIGRpZyAxCiAgICBzd2FwCiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjI1OAogICAgLy8gZGlzY3JpbWluYW50ID0gKG4gLSBVSW50NjQoMSkpICogKChuICogciAqIHIpIC0gKGMgKiBjKSkKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18yIC8vIDEKICAgIC0KICAgIHVuY292ZXIgMgogICAgZnJhbWVfZGlnIC00CiAgICAqCiAgICBkaWcgMgogICAgZGlnIDMKICAgICoKICAgIC0KICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6MjU5CiAgICAvLyByZXR1cm4gciAtICgoYyArIG9wLnNxcnQoZGlzY3JpbWluYW50KSkgLy8gbikKICAgIHNxcnQKICAgICsKICAgIGZyYW1lX2RpZyAtMgogICAgLwogICAgZnJhbWVfZGlnIC00CiAgICBzd2FwCiAgICAtCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMub3JiaXRhbF9wb29sLmNvbnRyYWN0LmJvdW5kYXJ5X3JhZGl1c19jYWxjKHI6IHVpbnQ2NCwgazogdWludDY0LCBzcXJ0X246IHVpbnQ2NCkgLT4gdWludDY0Ogpib3VuZGFyeV9yYWRpdXNfY2FsYzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6MjYyLTI2MwogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBib3VuZGFyeV9yYWRpdXNfY2FsYyhyOiBVSW50NjQsIGs6IFVJbnQ2NCwgc3FydF9uOiBVSW50NjQpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDMgMQogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToxODIKICAgIC8vIGhpZ2gsIGxvdyA9IG9wLm11bHcobGhzLCByaHMpCiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAtMQogICAgbXVsdwogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToyNjUKICAgIC8vIHJfc3FydF9uID0gbXVsX2Rpdl9mbG9vcihyLCBzcXJ0X24sIFVJbnQ2NChfUFJFQ0lTSU9OKSkKICAgIGludGNfMyAvLyAxMDAwMDAwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjE4MwogICAgLy8gcmV0dXJuIG9wLmRpdncoaGlnaCwgbG93LCBkZW5vbWluYXRvcikKICAgIGRpdncKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6MjY2CiAgICAvLyBvZmZzZXQgPSBhYnNfZGlmZihrLCByX3NxcnRfbikKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgY2FsbHN1YiBhYnNfZGlmZgogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToxODkKICAgIC8vIGhpZ2gsIGxvdyA9IG9wLm11bHcodmFsdWUsIHZhbHVlKQogICAgZnJhbWVfZGlnIC0zCiAgICBkdXAKICAgIG11bHcKICAgIGR1cAogICAgY292ZXIgMwogICAgY292ZXIgMwogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToxOTAKICAgIC8vIGFzc2VydCBoaWdoID09IFVJbnQ2NCgwKQogICAgIQogICAgYXNzZXJ0CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjE4OQogICAgLy8gaGlnaCwgbG93ID0gb3AubXVsdyh2YWx1ZSwgdmFsdWUpCiAgICBkdXAKICAgIG11bHcKICAgIGR1cAogICAgY292ZXIgMgogICAgY292ZXIgMwogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToxOTAKICAgIC8vIGFzc2VydCBoaWdoID09IFVJbnQ2NCgwKQogICAgIQogICAgYXNzZXJ0CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjI2OQogICAgLy8gaWYgcl9zcSA+PSBvZmZfc3E6CiAgICA+PQogICAgYnogYm91bmRhcnlfcmFkaXVzX2NhbGNfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjI3MAogICAgLy8gcmV0dXJuIG9wLnNxcnQocl9zcSAtIG9mZl9zcSkKICAgIGZyYW1lX2RpZyAwCiAgICBmcmFtZV9kaWcgMQogICAgLQogICAgc3FydAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmJvdW5kYXJ5X3JhZGl1c19jYWxjX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6MjcxCiAgICAvLyByZXR1cm4gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMub3JiaXRhbF9wb29sLmNvbnRyYWN0LnZlcmlmeV9wcmVjZWRpbmdfdHJhbnNmZXIoYXNzZXRfaWQ6IHVpbnQ2NCwgYW1vdW50OiB1aW50NjQpIC0+IHZvaWQ6CnZlcmlmeV9wcmVjZWRpbmdfdHJhbnNmZXI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjI3NC0yNzUKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgdmVyaWZ5X3ByZWNlZGluZ190cmFuc2Zlcihhc3NldF9pZDogVUludDY0LCBhbW91bnQ6IFVJbnQ2NCkgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToyNzcKICAgIC8vIGFzc2VydCBUeG4uZ3JvdXBfaW5kZXggPiBVSW50NjQoMCkKICAgIHR4biBHcm91cEluZGV4CiAgICBhc3NlcnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6Mjc4CiAgICAvLyB0cmFuc2ZlciA9IGd0eG4uQXNzZXRUcmFuc2ZlclRyYW5zYWN0aW9uKFR4bi5ncm91cF9pbmRleCAtIFVJbnQ2NCgxKSkKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzIgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgcHVzaGludCA0IC8vIGF4ZmVyCiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgYXhmZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6Mjc5CiAgICAvLyBhc3NlcnQgdHJhbnNmZXIuc2VuZGVyID09IFR4bi5zZW5kZXIKICAgIGR1cAogICAgZ3R4bnMgU2VuZGVyCiAgICB0eG4gU2VuZGVyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjI4MAogICAgLy8gYXNzZXJ0IHRyYW5zZmVyLmFzc2V0X3JlY2VpdmVyID09IEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MKICAgIGR1cAogICAgZ3R4bnMgQXNzZXRSZWNlaXZlcgogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6MjgxCiAgICAvLyBhc3NlcnQgdHJhbnNmZXIuYXNzZXRfYW1vdW50ID09IGFtb3VudAogICAgZHVwCiAgICBndHhucyBBc3NldEFtb3VudAogICAgZnJhbWVfZGlnIC0xCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjI4MgogICAgLy8gYXNzZXJ0IHRyYW5zZmVyLnhmZXJfYXNzZXQgPT0gQXNzZXQoYXNzZXRfaWQpCiAgICBndHhucyBYZmVyQXNzZXQKICAgIGZyYW1lX2RpZyAtMgogICAgPT0KICAgIGFzc2VydAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLm9yYml0YWxfcG9vbC5jb250cmFjdC52ZXJpZnlfaW52YXJpYW50KHN1bV94OiB1aW50NjQsIHN1bV94X3NxOiB1aW50NjQsIG46IHVpbnQ2NCwgcl9pbnQ6IHVpbnQ2NCwgc19ib3VuZDogdWludDY0LCBrX2JvdW5kOiB1aW50NjQsIHNxcnRfbjogdWludDY0LCBpbnZfc3FydF9uOiB1aW50NjQpIC0+IHVpbnQ2NDoKdmVyaWZ5X2ludmFyaWFudDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6Mjg1LTI5NQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiB2ZXJpZnlfaW52YXJpYW50KAogICAgLy8gICAgIHN1bV94OiBVSW50NjQsCiAgICAvLyAgICAgc3VtX3hfc3E6IFVJbnQ2NCwKICAgIC8vICAgICBuOiBVSW50NjQsCiAgICAvLyAgICAgcl9pbnQ6IFVJbnQ2NCwKICAgIC8vICAgICBzX2JvdW5kOiBVSW50NjQsCiAgICAvLyAgICAga19ib3VuZDogVUludDY0LAogICAgLy8gICAgIHNxcnRfbjogVUludDY0LAogICAgLy8gICAgIGludl9zcXJ0X246IFVJbnQ2NCwKICAgIC8vICkgLT4gYm9vbDoKICAgIHByb3RvIDggMQogICAgcHVzaGJ5dGVzICIiCiAgICBkdXBuIDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6MTgyCiAgICAvLyBoaWdoLCBsb3cgPSBvcC5tdWx3KGxocywgcmhzKQogICAgZnJhbWVfZGlnIC04CiAgICBmcmFtZV9kaWcgLTEKICAgIG11bHcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6MzAxCiAgICAvLyBhbHBoYV90b3RhbCA9IG11bF9kaXZfZmxvb3Ioc3VtX3gsIGludl9zcXJ0X24sIFVJbnQ2NChfUFJFQ0lTSU9OKSkKICAgIGludGNfMyAvLyAxMDAwMDAwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjE4MwogICAgLy8gcmV0dXJuIG9wLmRpdncoaGlnaCwgbG93LCBkZW5vbWluYXRvcikKICAgIGRpdncKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTozMDIKICAgIC8vIGlmIGFscGhhX3RvdGFsIDwga19ib3VuZDoKICAgIGZyYW1lX2RpZyAtMwogICAgPAogICAgYnogdmVyaWZ5X2ludmFyaWFudF9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6MzAzCiAgICAvLyByZXR1cm4gRmFsc2UKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKdmVyaWZ5X2ludmFyaWFudF9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjMwNAogICAgLy8gYWxwaGFfaW50ID0gYWxwaGFfdG90YWwgLSBrX2JvdW5kCiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfZGlnIC0zCiAgICAtCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6MTgyCiAgICAvLyBoaWdoLCBsb3cgPSBvcC5tdWx3KGxocywgcmhzKQogICAgZnJhbWVfZGlnIC01CiAgICBmcmFtZV9kaWcgLTIKICAgIG11bHcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6MzA1CiAgICAvLyByX2ludF9zcXJ0X24gPSBtdWxfZGl2X2Zsb29yKHJfaW50LCBzcXJ0X24sIFVJbnQ2NChfUFJFQ0lTSU9OKSkKICAgIGludGNfMyAvLyAxMDAwMDAwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjE4MwogICAgLy8gcmV0dXJuIG9wLmRpdncoaGlnaCwgbG93LCBkZW5vbWluYXRvcikKICAgIGRpdncKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToxODIKICAgIC8vIGhpZ2gsIGxvdyA9IG9wLm11bHcobGhzLCByaHMpCiAgICBmcmFtZV9kaWcgLTgKICAgIGR1cAogICAgbXVsdwogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToxODMKICAgIC8vIHJldHVybiBvcC5kaXZ3KGhpZ2gsIGxvdywgZGVub21pbmF0b3IpCiAgICBmcmFtZV9kaWcgLTYKICAgIGRpdncKICAgIGR1cAogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjMwOAogICAgLy8gaWYgc3VtX3hfc3EgPCB2YXJpYW5jZToKICAgIGZyYW1lX2RpZyAtNwogICAgPgogICAgYnogdmVyaWZ5X2ludmFyaWFudF9hZnRlcl9pZl9lbHNlQDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6MzA5CiAgICAvLyByZXR1cm4gRmFsc2UKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKdmVyaWZ5X2ludmFyaWFudF9hZnRlcl9pZl9lbHNlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjMxMAogICAgLy8gd190b3RhbF9zcSA9IHN1bV94X3NxIC0gdmFyaWFuY2UKICAgIGZyYW1lX2RpZyAtNwogICAgZnJhbWVfZGlnIDIKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6MzExCiAgICAvLyB3X3RvdGFsX25vcm0gPSBvcC5zcXJ0KHdfdG90YWxfc3EpCiAgICBzcXJ0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMwogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTozMTIKICAgIC8vIGlmIHdfdG90YWxfbm9ybSA8IHNfYm91bmQ6CiAgICBmcmFtZV9kaWcgLTQKICAgIDwKICAgIGJ6IHZlcmlmeV9pbnZhcmlhbnRfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjMxMwogICAgLy8gcmV0dXJuIEZhbHNlCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCnZlcmlmeV9pbnZhcmlhbnRfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTozMTQKICAgIC8vIHdfaW50X25vcm0gPSB3X3RvdGFsX25vcm0gLSBzX2JvdW5kCiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfZGlnIC00CiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjMxNgogICAgLy8gZGlmZl9hbHBoYSA9IGFic19kaWZmKGFscGhhX2ludCwgcl9pbnRfc3FydF9uKQogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2RpZyAxCiAgICBjYWxsc3ViIGFic19kaWZmCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjE4MgogICAgLy8gaGlnaCwgbG93ID0gb3AubXVsdyhsaHMsIHJocykKICAgIGZyYW1lX2RpZyAtNQogICAgZHVwCiAgICBtdWx3CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjE5NwogICAgLy8gcmV0dXJuIG11bF9kaXZfZmxvb3IodmFsdWUsIHZhbHVlLCBVSW50NjQoX1BSRUNJU0lPTikpCiAgICBpbnRjXzMgLy8gMTAwMDAwMDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToxODMKICAgIC8vIHJldHVybiBvcC5kaXZ3KGhpZ2gsIGxvdywgZGVub21pbmF0b3IpCiAgICBkaXZ3CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjE4MgogICAgLy8gaGlnaCwgbG93ID0gb3AubXVsdyhsaHMsIHJocykKICAgIGRpZyAxCiAgICB1bmNvdmVyIDIKICAgIG11bHcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6MTk3CiAgICAvLyByZXR1cm4gbXVsX2Rpdl9mbG9vcih2YWx1ZSwgdmFsdWUsIFVJbnQ2NChfUFJFQ0lTSU9OKSkKICAgIGludGNfMyAvLyAxMDAwMDAwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjE4MwogICAgLy8gcmV0dXJuIG9wLmRpdncoaGlnaCwgbG93LCBkZW5vbWluYXRvcikKICAgIGRpdncKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6MTgyCiAgICAvLyBoaWdoLCBsb3cgPSBvcC5tdWx3KGxocywgcmhzKQogICAgZGlnIDIKICAgIHVuY292ZXIgMwogICAgbXVsdwogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToxOTcKICAgIC8vIHJldHVybiBtdWxfZGl2X2Zsb29yKHZhbHVlLCB2YWx1ZSwgVUludDY0KF9QUkVDSVNJT04pKQogICAgaW50Y18zIC8vIDEwMDAwMDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6MTgzCiAgICAvLyByZXR1cm4gb3AuZGl2dyhoaWdoLCBsb3csIGRlbm9taW5hdG9yKQogICAgZGl2dwogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTozMTgKICAgIC8vIHJocyA9IHNxdWFyZV9zY2FsZWQoZGlmZl9hbHBoYSkgKyBzcXVhcmVfc2NhbGVkKHdfaW50X25vcm0pCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjMxOQogICAgLy8gcmV0dXJuIGFic19kaWZmKGxocywgcmhzKSA8PSBVSW50NjQoX1RPTEVSQU5DRSkKICAgIGNhbGxzdWIgYWJzX2RpZmYKICAgIGludGMgNCAvLyAxMDAwCiAgICA8PQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMub3JiaXRhbF9wb29sLmNvbnRyYWN0LnNlbmRfdG9rZW5zKGFzc2V0X2lkOiB1aW50NjQsIHJlY2VpdmVyOiBieXRlcywgYW1vdW50OiB1aW50NjQpIC0+IHZvaWQ6CnNlbmRfdG9rZW5zOgogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTozMjItMzIzCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIHNlbmRfdG9rZW5zKGFzc2V0X2lkOiBVSW50NjQsIHJlY2VpdmVyOiBBY2NvdW50LCBhbW91bnQ6IFVJbnQ2NCkgLT4gTm9uZToKICAgIHByb3RvIDMgMAogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTozMjQtMzI5CiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1Bc3NldChhc3NldF9pZCksCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9cmVjZWl2ZXIsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PWFtb3VudCwKICAgIC8vICAgICBmZWU9VUludDY0KDApLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBmcmFtZV9kaWcgLTIKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgZnJhbWVfZGlnIC0zCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTozMjQKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIHB1c2hpbnQgNCAvLyBheGZlcgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTozMjgKICAgIC8vIGZlZT1VSW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6MzI0LTMyOQogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9QXNzZXQoYXNzZXRfaWQpLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPXJlY2VpdmVyLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD1hbW91bnQsCiAgICAvLyAgICAgZmVlPVVJbnQ2NCgwKSwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMub3JiaXRhbF9wb29sLmNvbnRyYWN0Lk9yYml0YWxQb29sLmNyZWF0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNyZWF0ZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6Mzg3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6Mzk0CiAgICAvLyBhc3NlcnQgbiA+IFVJbnQ2NCgxKQogICAgZGlnIDIKICAgIGludGNfMiAvLyAxCiAgICA+CiAgICBhc3NlcnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6Mzk2LTM5NwogICAgLy8gIyBWYWxpZGF0ZSDiiJpuOiAo4oiabl9zY2FsZWQpwrIg4omIIG4gw5cgUFJFQ0lTSU9OwrIgKGZsb29yLXNxcnQgYWxsb3dlZCkuCiAgICAvLyBleHBlY3RlZCA9IG4gKiBVSW50NjQoX1BSRUNJU0lPTikgKiBVSW50NjQoX1BSRUNJU0lPTikKICAgIGRpZyAyCiAgICBwdXNoaW50IDEwMDAwMDAwMDAwMDAwMDAwMDAKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6MTg5CiAgICAvLyBoaWdoLCBsb3cgPSBvcC5tdWx3KHZhbHVlLCB2YWx1ZSkKICAgIGRpZyAyCiAgICBkaWcgMwogICAgbXVsdwogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToxOTAKICAgIC8vIGFzc2VydCBoaWdoID09IFVJbnQ2NCgwKQogICAgc3dhcAogICAgIQogICAgYXNzZXJ0CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjM5OQogICAgLy8gc3FydF90b2xlcmFuY2UgPSAoc3FydF9uX3NjYWxlZCAqIFVJbnQ2NCgyKSkgKyBVSW50NjQoMSkKICAgIGRpZyAzCiAgICBwdXNoaW50IDIKICAgICoKICAgIGludGNfMiAvLyAxCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjQwMAogICAgLy8gYXNzZXJ0IGFic19kaWZmKGFjdHVhbCwgZXhwZWN0ZWQpIDw9IHNxcnRfdG9sZXJhbmNlCiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgYWJzX2RpZmYKICAgID49CiAgICBhc3NlcnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6MTgyCiAgICAvLyBoaWdoLCBsb3cgPSBvcC5tdWx3KGxocywgcmhzKQogICAgZHVwMgogICAgbXVsdwogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo0MDItNDAzCiAgICAvLyAjIFZhbGlkYXRlIGludl/iiJpuOiDiiJpuIMOXIGludl/iiJpuIOKJiCBQUkVDSVNJT07Csi4KICAgIC8vIGludl9jaGVjayA9IG11bF9kaXZfZmxvb3Ioc3FydF9uX3NjYWxlZCwgaW52X3NxcnRfbl9zY2FsZWQsIFVJbnQ2NChfUFJFQ0lTSU9OKSkKICAgIGludGNfMyAvLyAxMDAwMDAwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjE4MwogICAgLy8gcmV0dXJuIG9wLmRpdncoaGlnaCwgbG93LCBkZW5vbWluYXRvcikKICAgIGRpdncKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6NDA0CiAgICAvLyBhc3NlcnQgYWJzX2RpZmYoaW52X2NoZWNrLCBVSW50NjQoX1BSRUNJU0lPTikpIDw9IFVJbnQ2NCgxKQogICAgaW50Y18zIC8vIDEwMDAwMDAwMDAKICAgIGNhbGxzdWIgYWJzX2RpZmYKICAgIGludGNfMiAvLyAxCiAgICA8PQogICAgYXNzZXJ0CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjQwNgogICAgLy8gc2VsZi5uLnZhbHVlID0gbgogICAgYnl0ZWNfMSAvLyAibiIKICAgIHVuY292ZXIgMwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6NDA3CiAgICAvLyBzZWxmLmJvb3RzdHJhcHBlZC52YWx1ZSA9IFVJbnQ2NCgwKQogICAgYnl0ZWNfMiAvLyAiYm9vdHN0cmFwcGVkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjQwOAogICAgLy8gc2VsZi5yZWdpc3RlcmVkX3Rva2Vucy52YWx1ZSA9IFVJbnQ2NCgwKQogICAgYnl0ZWMgMTIgLy8gInJlZ2lzdGVyZWRfdG9rZW5zIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjQwOQogICAgLy8gc2VsZi5zdW1feC52YWx1ZSA9IFVJbnQ2NCgwKQogICAgYnl0ZWMgNiAvLyAic3VtX3giCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6NDEwCiAgICAvLyBzZWxmLnN1bV94X3NxLnZhbHVlID0gVUludDY0KDApCiAgICBieXRlYyA3IC8vICJzdW1feF9zcSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo0MTEKICAgIC8vIHNlbGYucl9pbnQudmFsdWUgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDQgLy8gInJfaW50IgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjQxMgogICAgLy8gc2VsZi5zX2JvdW5kLnZhbHVlID0gVUludDY0KDApCiAgICBieXRlYyAxMyAvLyAic19ib3VuZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo0MTMKICAgIC8vIHNlbGYua19ib3VuZC52YWx1ZSA9IFVJbnQ2NCgwKQogICAgYnl0ZWMgMTQgLy8gImtfYm91bmQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6NDE0CiAgICAvLyBzZWxmLnZpcnR1YWxfb2Zmc2V0LnZhbHVlID0gVUludDY0KDApCiAgICBieXRlYyA4IC8vICJ2aXJ0dWFsX29mZnNldCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo0MTUKICAgIC8vIHNlbGYubnVtX3RpY2tzLnZhbHVlID0gVUludDY0KDApCiAgICBieXRlYyAxNiAvLyAibnVtX3RpY2tzIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjQxNgogICAgLy8gc2VsZi5zcXJ0X24udmFsdWUgPSBzcXJ0X25fc2NhbGVkCiAgICBieXRlYyAxNyAvLyAic3FydF9uIgogICAgdW5jb3ZlciAyCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo0MTcKICAgIC8vIHNlbGYuaW52X3NxcnRfbi52YWx1ZSA9IGludl9zcXJ0X25fc2NhbGVkCiAgICBieXRlYyAxOSAvLyAiaW52X3NxcnRfbiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjQxOAogICAgLy8gc2VsZi5wYXVzZWQudmFsdWUgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDUgLy8gInBhdXNlZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo0MTkKICAgIC8vIHNlbGYuZmVlX2Jwcy52YWx1ZSA9IFVJbnQ2NCgzMCkgICMgZGVmYXVsdCAwLjMwICUKICAgIGJ5dGVjIDE4IC8vICJmZWVfYnBzIgogICAgcHVzaGludCAzMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6NDIwCiAgICAvLyBzZWxmLmNyZWF0b3IudmFsdWUgPSBUeG4uc2VuZGVyCiAgICBieXRlYyAyMSAvLyAiY3JlYXRvciIKICAgIHR4biBTZW5kZXIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjQyMQogICAgLy8gc2VsZi50b3RhbF9yLnZhbHVlID0gVUludDY0KDApCiAgICBieXRlYyA5IC8vICJ0b3RhbF9yIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjM4NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICBpbnRjXzIgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzLm9yYml0YWxfcG9vbC5jb250cmFjdC5PcmJpdGFsUG9vbC5ib290c3RyYXBbcm91dGluZ10oKSAtPiB2b2lkOgpib290c3RyYXA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjQyNgogICAgLy8gYXNzZXJ0IHNlbGYucGF1c2VkLnZhbHVlID09IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gInBhdXNlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wYXVzZWQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6NDI3CiAgICAvLyBhc3NlcnQgc2VsZi5ib290c3RyYXBwZWQudmFsdWUgPT0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiYm9vdHN0cmFwcGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmJvb3RzdHJhcHBlZCBleGlzdHMKICAgICEKICAgIGFzc2VydAogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo0MjkKICAgIC8vIG4gPSBzZWxmLm4udmFsdWUKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJuIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm4gZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjQzMAogICAgLy8gY3JlYXRlZCA9IHNlbGYucmVzZXJ2ZXMuY3JlYXRlKHNpemU9biAqIFVJbnQ2NCg4KSkKICAgIGludGNfMSAvLyA4CiAgICAqCiAgICBkdXAKICAgIGJ5dGVjXzAgLy8gMHg3MjY1NzM2NTcyNzY2NTczCiAgICBzd2FwCiAgICBib3hfY3JlYXRlCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjQzMQogICAgLy8gaWYgbm90IGNyZWF0ZWQ6CiAgICBibnogYm9vdHN0cmFwX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo0MzIKICAgIC8vIGFzc2VydCBzZWxmLnJlc2VydmVzLmxlbmd0aCA9PSBuICogVUludDY0KDgpCiAgICBieXRlY18wIC8vIDB4NzI2NTczNjU3Mjc2NjU3MwogICAgYm94X2xlbgogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZXMgZXhpc3RzCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydAoKYm9vdHN0cmFwX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6NDM0CiAgICAvLyBmZ19jcmVhdGVkID0gc2VsZi5mZWVfZ3Jvd3RoLmNyZWF0ZShzaXplPW4gKiBVSW50NjQoOCkpCiAgICBieXRlY18zIC8vIDB4NjY2NTY1NWY2NzcyNmY3Nzc0NjgKICAgIGRpZyAxCiAgICBib3hfY3JlYXRlCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjQzNQogICAgLy8gaWYgbm90IGZnX2NyZWF0ZWQ6CiAgICBibnogYm9vdHN0cmFwX2FmdGVyX2lmX2Vsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo0MzYKICAgIC8vIGFzc2VydCBzZWxmLmZlZV9ncm93dGgubGVuZ3RoID09IG4gKiBVSW50NjQoOCkKICAgIGJ5dGVjXzMgLy8gMHg2NjY1NjU1ZjY3NzI2Zjc3NzQ2OAogICAgYm94X2xlbgogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZmVlX2dyb3d0aCBleGlzdHMKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0Cgpib290c3RyYXBfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo0MzgKICAgIC8vIHNlbGYuYm9vdHN0cmFwcGVkLnZhbHVlID0gVUludDY0KDEpCiAgICBieXRlY18yIC8vICJib290c3RyYXBwZWQiCiAgICBpbnRjXzIgLy8gMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6NDIzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMiAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMub3JiaXRhbF9wb29sLmNvbnRyYWN0Lk9yYml0YWxQb29sLnJlZ2lzdGVyX3Rva2VuW3JvdXRpbmddKCkgLT4gdm9pZDoKcmVnaXN0ZXJfdG9rZW46CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjQ0NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjQ0NwogICAgLy8gYXNzZXJ0IHNlbGYucGF1c2VkLnZhbHVlID09IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gInBhdXNlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wYXVzZWQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6NDQ4CiAgICAvLyBhc3NlcnQgc2VsZi5ib290c3RyYXBwZWQudmFsdWUgPT0gVUludDY0KDEpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiYm9vdHN0cmFwcGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmJvb3RzdHJhcHBlZCBleGlzdHMKICAgIGludGNfMiAvLyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjQ0OQogICAgLy8gYXNzZXJ0IHRva2VuX2lkeCA8IHNlbGYubi52YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gIm4iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubiBleGlzdHMKICAgIGRpZyAyCiAgICA+CiAgICBhc3NlcnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6NDUwCiAgICAvLyBhc3NlcnQgdG9rZW5faWR4IG5vdCBpbiBzZWxmLnRva2VucwogICAgc3dhcAogICAgaXRvYgogICAgYnl0ZWMgMTAgLy8gMHg3NDZmNmI2NTZlM2EKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydAogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo0NTIKICAgIC8vIHNlbGYudG9rZW5zW3Rva2VuX2lkeF0gPSBhc3NldF9pZAogICAgZGlnIDEKICAgIGl0b2IKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6NDUzCiAgICAvLyBzZWxmLnJlZ2lzdGVyZWRfdG9rZW5zLnZhbHVlICs9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJyZWdpc3RlcmVkX3Rva2VucyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZWdpc3RlcmVkX3Rva2VucyBleGlzdHMKICAgIGludGNfMiAvLyAxCiAgICArCiAgICBieXRlYyAxMiAvLyAicmVnaXN0ZXJlZF90b2tlbnMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTozMzQtMzM5CiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1Bc3NldChhc3NldF9pZCksCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICBhc3NldF9hbW91bnQ9VUludDY0KDApLAogICAgLy8gICAgIGZlZT1VSW50NjQoMCksCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjMzNgogICAgLy8gYXNzZXRfcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjMzNwogICAgLy8gYXNzZXRfYW1vdW50PVVJbnQ2NCgwKSwKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjMzNAogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgcHVzaGludCA0IC8vIGF4ZmVyCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjMzOAogICAgLy8gZmVlPVVJbnQ2NCgwKSwKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTozMzQtMzM5CiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1Bc3NldChhc3NldF9pZCksCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICBhc3NldF9hbW91bnQ9VUludDY0KDApLAogICAgLy8gICAgIGZlZT1VSW50NjQoMCksCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo0NDUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaW50Y18yIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5vcmJpdGFsX3Bvb2wuY29udHJhY3QuT3JiaXRhbFBvb2wuc2V0X3BhdXNlZFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnNldF9wYXVzZWQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjQ1OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjQ2MAogICAgLy8gYXNzZXJ0IFR4bi5zZW5kZXIgPT0gc2VsZi5jcmVhdG9yLnZhbHVlCiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjEgLy8gImNyZWF0b3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3JlYXRvciBleGlzdHMKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6NDYxCiAgICAvLyBzZWxmLnBhdXNlZC52YWx1ZSA9IGZsYWcKICAgIGJ5dGVjIDUgLy8gInBhdXNlZCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjQ1OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpbnRjXzIgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzLm9yYml0YWxfcG9vbC5jb250cmFjdC5PcmJpdGFsUG9vbC5zZXRfZmVlW3JvdXRpbmddKCkgLT4gdm9pZDoKc2V0X2ZlZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6NDYzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6NDY1CiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBzZWxmLmNyZWF0b3IudmFsdWUKICAgIHR4biBTZW5kZXIKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMSAvLyAiY3JlYXRvciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jcmVhdG9yIGV4aXN0cwogICAgPT0KICAgIGFzc2VydAogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo0NjYKICAgIC8vIGFzc2VydCBuZXdfZmVlX2JwcyA8PSBVSW50NjQoNTAwKSAgIyBjYXAgYXQgNSAlCiAgICBkdXAKICAgIHB1c2hpbnQgNTAwCiAgICA8PQogICAgYXNzZXJ0CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjQ2NwogICAgLy8gc2VsZi5mZWVfYnBzLnZhbHVlID0gbmV3X2ZlZV9icHMKICAgIGJ5dGVjIDE4IC8vICJmZWVfYnBzIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6NDYzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMiAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMub3JiaXRhbF9wb29sLmNvbnRyYWN0Lk9yYml0YWxQb29sLmFkZF90aWNrW3JvdXRpbmddKCkgLT4gdm9pZDoKYWRkX3RpY2s6CiAgICBpbnRjXzAgLy8gMAogICAgZHVwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo0NzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwbiAyCiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6NDgyCiAgICAvLyBhc3NlcnQgc2VsZi5wYXVzZWQudmFsdWUgPT0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAicGF1c2VkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnBhdXNlZCBleGlzdHMKICAgICEKICAgIGFzc2VydAogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo0ODMKICAgIC8vIGFzc2VydCBzZWxmLmJvb3RzdHJhcHBlZC52YWx1ZSA9PSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJib290c3RyYXBwZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYm9vdHN0cmFwcGVkIGV4aXN0cwogICAgaW50Y18yIC8vIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6NDg0CiAgICAvLyBhc3NlcnQgc2VsZi5yZWdpc3RlcmVkX3Rva2Vucy52YWx1ZSA9PSBzZWxmLm4udmFsdWUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAicmVnaXN0ZXJlZF90b2tlbnMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVnaXN0ZXJlZF90b2tlbnMgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAibiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGNvdmVyIDUKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm4gZXhpc3RzCiAgICBzd2FwCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo0ODUKICAgIC8vIGFzc2VydCByID4gVUludDY0KDApCiAgICBkaWcgMgogICAgYXNzZXJ0CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjQ4OAogICAgLy8gc3FydF9uID0gc2VsZi5zcXJ0X24udmFsdWUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNyAvLyAic3FydF9uIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNxcnRfbiBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6MjQwCiAgICAvLyByZXR1cm4gbXVsX2Rpdl9mbG9vcihyLCBzcXJ0X24gLSBVSW50NjQoX1BSRUNJU0lPTiksIFVJbnQ2NChfUFJFQ0lTSU9OKSkKICAgIGR1cAogICAgaW50Y18zIC8vIDEwMDAwMDAwMDAKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6MTgyCiAgICAvLyBoaWdoLCBsb3cgPSBvcC5tdWx3KGxocywgcmhzKQogICAgZGlnIDQKICAgIG11bHcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6MjQwCiAgICAvLyByZXR1cm4gbXVsX2Rpdl9mbG9vcihyLCBzcXJ0X24gLSBVSW50NjQoX1BSRUNJU0lPTiksIFVJbnQ2NChfUFJFQ0lTSU9OKSkKICAgIGludGNfMyAvLyAxMDAwMDAwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjE4MwogICAgLy8gcmV0dXJuIG9wLmRpdncoaGlnaCwgbG93LCBkZW5vbWluYXRvcikKICAgIGRpdncKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6MjQ1CiAgICAvLyByZXR1cm4gbXVsX2Rpdl9mbG9vcihyLCAobiAtIFVJbnQ2NCgxKSkgKiBVSW50NjQoX1BSRUNJU0lPTiksIHNxcnRfbikKICAgIGRpZyAyCiAgICBpbnRjXzIgLy8gMQogICAgLQogICAgaW50Y18zIC8vIDEwMDAwMDAwMDAKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6MTgyCiAgICAvLyBoaWdoLCBsb3cgPSBvcC5tdWx3KGxocywgcmhzKQogICAgZGlnIDUKICAgIG11bHcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6MTgzCiAgICAvLyByZXR1cm4gb3AuZGl2dyhoaWdoLCBsb3csIGRlbm9taW5hdG9yKQogICAgZGlnIDMKICAgIGRpdncKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6NDkyCiAgICAvLyBhc3NlcnQgayA+PSBtaW5fawogICAgZGlnIDQKICAgIHVuY292ZXIgMgogICAgPj0KICAgIGFzc2VydAogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo0OTMKICAgIC8vIGFzc2VydCBrIDw9IG1heF9rCiAgICBkaWcgMwogICAgPj0KICAgIGFzc2VydAogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToxODIKICAgIC8vIGhpZ2gsIGxvdyA9IG9wLm11bHcobGhzLCByaHMpCiAgICBkaWcgMwogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToyNTEKICAgIC8vIHJldHVybiByIC0gbXVsX2Rpdl9mbG9vcihyLCBVSW50NjQoX1BSRUNJU0lPTiksIHNxcnRfbikKICAgIGludGNfMyAvLyAxMDAwMDAwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjE4MgogICAgLy8gaGlnaCwgbG93ID0gb3AubXVsdyhsaHMsIHJocykKICAgIG11bHcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6MTgzCiAgICAvLyByZXR1cm4gb3AuZGl2dyhoaWdoLCBsb3csIGRlbm9taW5hdG9yKQogICAgZGlnIDIKICAgIGRpdncKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6MjUxCiAgICAvLyByZXR1cm4gciAtIG11bF9kaXZfZmxvb3IociwgVUludDY0KF9QUkVDSVNJT04pLCBzcXJ0X24pCiAgICBkaWcgNAogICAgc3dhcAogICAgLQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBjb3ZlciA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjQ5NgogICAgLy8geF9taW4gPSB4X21pbl9mb3JfdGljayhyLCBrLCBuLCBzcXJ0X24pCiAgICB1bmNvdmVyIDQKICAgIHVuY292ZXIgNAogICAgZGlnIDQKICAgIHVuY292ZXIgMwogICAgY2FsbHN1YiB4X21pbl9mb3JfdGljawogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo0OTcKICAgIC8vIGFzc2VydCBxID49IHhfbWluCiAgICBkdXAyCiAgICA+PQogICAgYXNzZXJ0CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjQ5OC01MDAKICAgIC8vICMgZGVwb3NpdF9wZXJfdG9rZW5fc2NhbGVkOiBpbiBzY2FsZWQgdW5pdHMgKG1hdGNoZXMgciwgaywgcSwgeF9taW4gc3BhY2UpLgogICAgLy8gIyBkZXBvc2l0X3Blcl90b2tlbl9yYXc6IHdoYXQgY2FsbGVycyBhY3R1YWxseSB0cmFuc2ZlciBpbiBBU0EgbWljcm91bml0cy4KICAgIC8vIGRlcG9zaXRfcGVyX3Rva2VuX3NjYWxlZCA9IHEgLSB4X21pbgogICAgc3dhcAogICAgZGlnIDEKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6NTAxCiAgICAvLyBkZXBvc2l0X3Blcl90b2tlbl9yYXcgPSBkZXBvc2l0X3Blcl90b2tlbl9zY2FsZWQgKiBVSW50NjQoX0FNT1VOVF9TQ0FMRSkKICAgIGludGMgNCAvLyAxMDAwCiAgICAqCiAgICBjb3ZlciAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjUwMwogICAgLy8gYXNzZXJ0IFR4bi5ncm91cF9pbmRleCA+PSBuCiAgICB0eG4gR3JvdXBJbmRleAogICAgZGlnIDIKICAgID49CiAgICBhc3NlcnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6NTA0CiAgICAvLyBzdGFydF9pbmRleCA9IFR4bi5ncm91cF9pbmRleCAtIG4KICAgIHR4biBHcm91cEluZGV4CiAgICB1bmNvdmVyIDIKICAgIC0KICAgIHN3YXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6NTA2LTUwNwogICAgLy8gIyB2aXJ0dWFsX29mZnNldCBhbmQgYWxsIG1hdGggcXVhbnRpdGllcyBhcmUgaW4gc2NhbGVkIHVuaXRzLgogICAgLy8gcHJpb3Jfb2Zmc2V0ID0gc2VsZi52aXJ0dWFsX29mZnNldC52YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDggLy8gInZpcnR1YWxfb2Zmc2V0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgY292ZXIgMwogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudmlydHVhbF9vZmZzZXQgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjUwOAogICAgLy8gbmV3X29mZnNldCA9IHByaW9yX29mZnNldCArIHhfbWluCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjUwOS01MTAKICAgIC8vICMgSW5jcmVtZW50YWxseSB1cGRhdGUgc3VtX3hfc3EgYXMgd2UgdXBkYXRlIGVhY2ggcmVzZXJ2ZS4KICAgIC8vIHVwZGF0ZWRfc3VtX3NxID0gc2VsZi5zdW1feF9zcS52YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gInN1bV94X3NxIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN1bV94X3NxIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo1MTIKICAgIC8vIGZvciBpbmRleCBpbiB1cmFuZ2Uobik6CiAgICBpbnRjXzAgLy8gMAoKYWRkX3RpY2tfZm9yX2hlYWRlckAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo1MTIKICAgIC8vIGZvciBpbmRleCBpbiB1cmFuZ2Uobik6CiAgICBkdXAKICAgIGRpZyA4CiAgICA8CiAgICBieiBhZGRfdGlja19hZnRlcl9mb3JANQogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo1MTMKICAgIC8vIHRyYW5zZmVyID0gZ3R4bi5Bc3NldFRyYW5zZmVyVHJhbnNhY3Rpb24oc3RhcnRfaW5kZXggKyBpbmRleCkKICAgIGRpZyA0CiAgICBkaWcgMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICArCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBheGZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo1MTQKICAgIC8vIGV4cGVjdGVkX2Fzc2V0ID0gc2VsZi50b2tlbnNbaW5kZXhdCiAgICBkaWcgMQogICAgaXRvYgogICAgYnl0ZWMgMTAgLy8gMHg3NDZmNmI2NTZlM2EKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG9rZW5zIGVudHJ5IGV4aXN0cwogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo1MTUKICAgIC8vIGFzc2VydCB0cmFuc2Zlci5zZW5kZXIgPT0gVHhuLnNlbmRlcgogICAgZGlnIDEKICAgIGd0eG5zIFNlbmRlcgogICAgdHhuIFNlbmRlcgogICAgPT0KICAgIGFzc2VydAogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo1MTYKICAgIC8vIGFzc2VydCB0cmFuc2Zlci5hc3NldF9yZWNlaXZlciA9PSBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzCiAgICBkaWcgMQogICAgZ3R4bnMgQXNzZXRSZWNlaXZlcgogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6NTE3CiAgICAvLyBhc3NlcnQgdHJhbnNmZXIuYXNzZXRfYW1vdW50ID09IGRlcG9zaXRfcGVyX3Rva2VuX3JhdwogICAgZGlnIDEKICAgIGd0eG5zIEFzc2V0QW1vdW50CiAgICBkaWcgOQogICAgZHVwCiAgICBjb3ZlciA0CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjUxOAogICAgLy8gYXNzZXJ0IHRyYW5zZmVyLnhmZXJfYXNzZXQgPT0gQXNzZXQoZXhwZWN0ZWRfYXNzZXQpCiAgICBzd2FwCiAgICBndHhucyBYZmVyQXNzZXQKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6MTc2CiAgICAvLyByZXR1cm4gaW5kZXggKiBVSW50NjQoOCkKICAgIGRpZyAxCiAgICBpbnRjXzEgLy8gOAogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo1MjAtNTIxCiAgICAvLyAjIHJlc2VydmVzIGJveCBpcyBpbiByYXcgbWljcm91bml0czsgbWF0aCBzcGFjZSBpcyBzY2FsZWQuCiAgICAvLyBjdXJyZW50X2FjdHVhbF9yYXcgPSByZWFkX3Jlc2VydmUoc2VsZi5yZXNlcnZlcywgaW5kZXgpCiAgICBieXRlY18wIC8vIDB4NzI2NTczNjU3Mjc2NjU3MwogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToyMTMKICAgIC8vIHJldHVybiBvcC5leHRyYWN0X3VpbnQ2NChyZXNlcnZlcy5leHRyYWN0KHJlc2VydmVfb2Zmc2V0KGluZGV4KSwgVUludDY0KDgpKSwgMCkKICAgIGRpZyAxCiAgICBpbnRjXzEgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToyMDgKICAgIC8vIHJldHVybiByYXcgLy8gVUludDY0KF9BTU9VTlRfU0NBTEUpCiAgICBkdXAKICAgIGludGMgNCAvLyAxMDAwCiAgICAvCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjUyMgogICAgLy8gY3VycmVudF9tYXRoID0gdG9fc2NhbGVkKGN1cnJlbnRfYWN0dWFsX3JhdykgKyBwcmlvcl9vZmZzZXQKICAgIGRpZyA4CiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjUyMwogICAgLy8gbmV3X2FjdHVhbF9yYXcgPSBjdXJyZW50X2FjdHVhbF9yYXcgKyBkZXBvc2l0X3Blcl90b2tlbl9yYXcKICAgIHN3YXAKICAgIHVuY292ZXIgMwogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToyMDgKICAgIC8vIHJldHVybiByYXcgLy8gVUludDY0KF9BTU9VTlRfU0NBTEUpCiAgICBkdXAKICAgIGludGMgNCAvLyAxMDAwCiAgICAvCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjUyNAogICAgLy8gbmV3X21hdGggPSB0b19zY2FsZWQobmV3X2FjdHVhbF9yYXcpICsgbmV3X29mZnNldAogICAgZGlnIDcKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6MjE4CiAgICAvLyByZXNlcnZlcy5yZXBsYWNlKHJlc2VydmVfb2Zmc2V0KGluZGV4KSwgb3AuaXRvYih2YWx1ZSkpCiAgICBzd2FwCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjUyNQogICAgLy8gd3JpdGVfcmVzZXJ2ZShzZWxmLnJlc2VydmVzLCBpbmRleCwgbmV3X2FjdHVhbF9yYXcpCiAgICBieXRlY18wIC8vIDB4NzI2NTczNjU3Mjc2NjU3MwogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToyMTgKICAgIC8vIHJlc2VydmVzLnJlcGxhY2UocmVzZXJ2ZV9vZmZzZXQoaW5kZXgpLCBvcC5pdG9iKHZhbHVlKSkKICAgIHVuY292ZXIgNAogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToxODkKICAgIC8vIGhpZ2gsIGxvdyA9IG9wLm11bHcodmFsdWUsIHZhbHVlKQogICAgZHVwCiAgICBtdWx3CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjE5MAogICAgLy8gYXNzZXJ0IGhpZ2ggPT0gVUludDY0KDApCiAgICBzd2FwCiAgICAhCiAgICBhc3NlcnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6NTI2LTUyNwogICAgLy8gIyBPZmZzZXQgY2hhbmdlIGFmZmVjdHMgQUxMIG4gcmVzZXJ2ZXMsIGNvcnJlY3RseSBjYXB0dXJlZCBoZXJlLgogICAgLy8gdXBkYXRlZF9zdW1fc3EgPSB1cGRhdGVkX3N1bV9zcSArIHNxdWFyZV9yYXcobmV3X21hdGgpIC0gc3F1YXJlX3JhdyhjdXJyZW50X21hdGgpCiAgICBkaWcgNAogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToxODkKICAgIC8vIGhpZ2gsIGxvdyA9IG9wLm11bHcodmFsdWUsIHZhbHVlKQogICAgZGlnIDEKICAgIHVuY292ZXIgMgogICAgbXVsdwogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToxOTAKICAgIC8vIGFzc2VydCBoaWdoID09IFVJbnQ2NCgwKQogICAgc3dhcAogICAgIQogICAgYXNzZXJ0CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjUyNi01MjcKICAgIC8vICMgT2Zmc2V0IGNoYW5nZSBhZmZlY3RzIEFMTCBuIHJlc2VydmVzLCBjb3JyZWN0bHkgY2FwdHVyZWQgaGVyZS4KICAgIC8vIHVwZGF0ZWRfc3VtX3NxID0gdXBkYXRlZF9zdW1fc3EgKyBzcXVhcmVfcmF3KG5ld19tYXRoKSAtIHNxdWFyZV9yYXcoY3VycmVudF9tYXRoKQogICAgLQogICAgYnVyeSAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjUxMgogICAgLy8gZm9yIGluZGV4IGluIHVyYW5nZShuKToKICAgIGludGNfMiAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgYWRkX3RpY2tfZm9yX2hlYWRlckAyCgphZGRfdGlja19hZnRlcl9mb3JANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6NTI5CiAgICAvLyB0aWNrX2lkID0gc2VsZi5udW1fdGlja3MudmFsdWUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNiAvLyAibnVtX3RpY2tzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgYnVyeSAxNAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubnVtX3RpY2tzIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo1MzAtNTMxCiAgICAvLyAjIHNoYXJlcyA9IGRlcG9zaXRfcGVyX3Rva2VuX3JhdyDDlyBuLiAgT25lIHNoYXJlID0gMS9uIG9mIGEgZGVwb3NpdGVkIG1pY3JvdW5pdC4KICAgIC8vIHNoYXJlcyA9IGRlcG9zaXRfcGVyX3Rva2VuX3JhdyAqIG4KICAgIGRpZyA2CiAgICBkaWcgOQogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo1MzcKICAgIC8vIHRvdGFsX3NoYXJlcz1hcmM0LlVJbnQ2NChzaGFyZXMpLAogICAgaXRvYgogICAgZHVwCiAgICBidXJ5IDE2CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjUzMy01MzgKICAgIC8vIHNlbGYudGlja3NbdGlja19pZF0gPSBUaWNrRGF0YSgKICAgIC8vICAgICByPWFyYzQuVUludDY0KHIpLAogICAgLy8gICAgIGs9YXJjNC5VSW50NjQoayksCiAgICAvLyAgICAgc3RhdGU9YXJjNC5VSW50OCgwKSwgICAgICAgIyBzdGFydHMgSU5URVJJT1IKICAgIC8vICAgICB0b3RhbF9zaGFyZXM9YXJjNC5VSW50NjQoc2hhcmVzKSwKICAgIC8vICkKICAgIGRpZyAxMgogICAgZGlnIDExCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6NTM2CiAgICAvLyBzdGF0ZT1hcmM0LlVJbnQ4KDApLCAgICAgICAjIHN0YXJ0cyBJTlRFUklPUgogICAgcHVzaGJ5dGVzIDB4MDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6NTMzLTUzOAogICAgLy8gc2VsZi50aWNrc1t0aWNrX2lkXSA9IFRpY2tEYXRhKAogICAgLy8gICAgIHI9YXJjNC5VSW50NjQociksCiAgICAvLyAgICAgaz1hcmM0LlVJbnQ2NChrKSwKICAgIC8vICAgICBzdGF0ZT1hcmM0LlVJbnQ4KDApLCAgICAgICAjIHN0YXJ0cyBJTlRFUklPUgogICAgLy8gICAgIHRvdGFsX3NoYXJlcz1hcmM0LlVJbnQ2NChzaGFyZXMpLAogICAgLy8gKQogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6NTMzCiAgICAvLyBzZWxmLnRpY2tzW3RpY2tfaWRdID0gVGlja0RhdGEoCiAgICBzd2FwCiAgICBpdG9iCiAgICBieXRlYyAxNSAvLyAweDc0Njk2MzZiM2EKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6NTMzLTUzOAogICAgLy8gc2VsZi50aWNrc1t0aWNrX2lkXSA9IFRpY2tEYXRhKAogICAgLy8gICAgIHI9YXJjNC5VSW50NjQociksCiAgICAvLyAgICAgaz1hcmM0LlVJbnQ2NChrKSwKICAgIC8vICAgICBzdGF0ZT1hcmM0LlVJbnQ4KDApLCAgICAgICAjIHN0YXJ0cyBJTlRFUklPUgogICAgLy8gICAgIHRvdGFsX3NoYXJlcz1hcmM0LlVJbnQ2NChzaGFyZXMpLAogICAgLy8gKQogICAgdW5jb3ZlciAyCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjU0MC01NDMKICAgIC8vICMgQ3JlYXRlIHBvc2l0aW9uIGJveDogc2hhcmVzICg4IGJ5dGVzKSArIGZlZV9ncm93dGggY2hlY2twb2ludHMgKG7DlzggYnl0ZXMpLgogICAgLy8gIyBDaGVja3BvaW50cyBhcmUgc2V0IHRvIGN1cnJlbnQgZmVlX2dyb3d0aCB2YWx1ZXMgc28gdGhlIExQIGRvZXMgbm90CiAgICAvLyAjIHJlY2VpdmUgZmVlcyBhY2NydWVkIGJlZm9yZSB0aGVpciBkZXBvc2l0IChubyByZXRyb2FjdGl2ZSBmZWUgY2xhaW0pLgogICAgLy8gcG9zX2tleSA9IFR4bi5zZW5kZXIuYnl0ZXMgKyBvcC5pdG9iKHRpY2tfaWQpCiAgICB0eG4gU2VuZGVyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ1cnkgMTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6NTQ1CiAgICAvLyBmb3IgaWR4IGluIHVyYW5nZShuKToKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDEzCgphZGRfdGlja19mb3JfaGVhZGVyQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjU0NQogICAgLy8gZm9yIGlkeCBpbiB1cmFuZ2Uobik6CiAgICBkaWcgMTIKICAgIGRpZyA4CiAgICA8CiAgICBieiBhZGRfdGlja19hZnRlcl9mb3JAOQogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToxNzYKICAgIC8vIHJldHVybiBpbmRleCAqIFVJbnQ2NCg4KQogICAgZGlnIDEyCiAgICBkdXAKICAgIGludGNfMSAvLyA4CiAgICAqCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjU0NgogICAgLy8gZmcgPSByZWFkX2ZlZV9ncm93dGgoc2VsZi5mZWVfZ3Jvd3RoLCBpZHgpCiAgICBieXRlY18zIC8vIDB4NjY2NTY1NWY2NzcyNmY3Nzc0NjgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6MjIzCiAgICAvLyByZXR1cm4gb3AuZXh0cmFjdF91aW50NjQoZmVlX2dyb3d0aC5leHRyYWN0KHJlc2VydmVfb2Zmc2V0KGluZGV4KSwgVUludDY0KDgpKSwgMCkKICAgIHN3YXAKICAgIGludGNfMSAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo1NDcKICAgIC8vIHBvc192YWx1ZSA9IHBvc192YWx1ZSArIG9wLml0b2IoZmcpCiAgICBleHRyYWN0IDAgOAogICAgZGlnIDE1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ1cnkgMTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6NTQ1CiAgICAvLyBmb3IgaWR4IGluIHVyYW5nZShuKToKICAgIGludGNfMiAvLyAxCiAgICArCiAgICBidXJ5IDEzCiAgICBiIGFkZF90aWNrX2Zvcl9oZWFkZXJANgoKYWRkX3RpY2tfYWZ0ZXJfZm9yQDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjU0OAogICAgLy8gc2VsZi5wb3NpdGlvbnNbcG9zX2tleV0gPSBwb3NfdmFsdWUKICAgIGJ5dGVjIDIwIC8vIDB4NzA2ZjczM2EKICAgIGRpZyAxNQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgZGlnIDE0CiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjU1MAogICAgLy8gc2VsZi5udW1fdGlja3MudmFsdWUgPSB0aWNrX2lkICsgVUludDY0KDEpCiAgICBkaWcgMTEKICAgIGludGNfMiAvLyAxCiAgICArCiAgICBieXRlYyAxNiAvLyAibnVtX3RpY2tzIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6NTUxCiAgICAvLyBzZWxmLnJfaW50LnZhbHVlICs9IHIKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJyX2ludCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yX2ludCBleGlzdHMKICAgIGRpZyAxMAogICAgZHVwCiAgICBjb3ZlciAyCiAgICArCiAgICBieXRlYyA0IC8vICJyX2ludCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjU1MgogICAgLy8gc2VsZi50b3RhbF9yLnZhbHVlICs9IHIKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA5IC8vICJ0b3RhbF9yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3IgZXhpc3RzCiAgICArCiAgICBieXRlYyA5IC8vICJ0b3RhbF9yIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6NTUzCiAgICAvLyBzZWxmLnZpcnR1YWxfb2Zmc2V0LnZhbHVlID0gbmV3X29mZnNldAogICAgYnl0ZWMgOCAvLyAidmlydHVhbF9vZmZzZXQiCiAgICBkaWcgMwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6NTU0LTU1NgogICAgLy8gIyBzdW1feCBpbmNyZWFzZXMgYnkgbsOXcSAocSBhbHJlYWR5IGluIHNjYWxlZCB1bml0cyBzaW5jZSByL2sgYXJlIHNjYWxlZCkuCiAgICAvLyAjIEFmdGVyIGFkZF90aWNrIGVhY2ggbWF0aF9yZXNlcnZlID0gdG9fc2NhbGVkKGFjdHVhbF9yYXcpICsgbmV3X29mZnNldCA9IHEuCiAgICAvLyBzZWxmLnN1bV94LnZhbHVlICs9IG4gKiBxCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAic3VtX3giCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3VtX3ggZXhpc3RzCiAgICBkaWcgOAogICAgZGlnIDgKICAgICoKICAgICsKICAgIGJ5dGVjIDYgLy8gInN1bV94IgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6NTU3CiAgICAvLyBzZWxmLnN1bV94X3NxLnZhbHVlID0gdXBkYXRlZF9zdW1fc3EKICAgIGJ5dGVjIDcgLy8gInN1bV94X3NxIgogICAgZGlnIDIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjQ3MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpbnRjXzIgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzLm9yYml0YWxfcG9vbC5jb250cmFjdC5PcmJpdGFsUG9vbC5jbGFpbV9mZWVzW3JvdXRpbmddKCkgLT4gdm9pZDoKY2xhaW1fZmVlczoKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjU1OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjU3MwogICAgLy8gYXNzZXJ0IHNlbGYucGF1c2VkLnZhbHVlID09IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gInBhdXNlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wYXVzZWQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6NTc0CiAgICAvLyBhc3NlcnQgc2VsZi5ib290c3RyYXBwZWQudmFsdWUgPT0gVUludDY0KDEpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiYm9vdHN0cmFwcGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmJvb3RzdHJhcHBlZCBleGlzdHMKICAgIGludGNfMiAvLyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjU3NQogICAgLy8gYXNzZXJ0IHRpY2tfaWQgaW4gc2VsZi50aWNrcwogICAgaXRvYgogICAgYnl0ZWMgMTUgLy8gMHg3NDY5NjM2YjNhCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjU3NwogICAgLy8gcG9zX2tleSA9IFR4bi5zZW5kZXIuYnl0ZXMgKyBvcC5pdG9iKHRpY2tfaWQpCiAgICB0eG4gU2VuZGVyCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo1NzgKICAgIC8vIGFzc2VydCBwb3Nfa2V5IGluIHNlbGYucG9zaXRpb25zCiAgICBieXRlYyAyMCAvLyAweDcwNmY3MzNhCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgY292ZXIgMgogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydAogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo1ODAKICAgIC8vIHRpY2sgPSBzZWxmLnRpY2tzW3RpY2tfaWRdLmNvcHkoKQogICAgc3dhcAogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjU4MQogICAgLy8gdGlja19yID0gdGljay5yLmFzX3VpbnQ2NCgpCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo1ODIKICAgIC8vIHRpY2tfdG90YWxfc2hhcmVzID0gdGljay50b3RhbF9zaGFyZXMuYXNfdWludDY0KCkKICAgIHN3YXAKICAgIHB1c2hpbnQgMTcKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjU4MwogICAgLy8gYXNzZXJ0IHRpY2tfdG90YWxfc2hhcmVzID4gVUludDY0KDApCiAgICBkdXAKICAgIGFzc2VydAogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo1ODUKICAgIC8vIHBvc19yYXcgPSBzZWxmLnBvc2l0aW9uc1twb3Nfa2V5XQogICAgdW5jb3ZlciAyCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIGR1cAogICAgY292ZXIgMwogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo1ODYKICAgIC8vIHBvc19zaGFyZXMgPSBvcC5leHRyYWN0X3VpbnQ2NChwb3NfcmF3LCAwKQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjU4NwogICAgLy8gYXNzZXJ0IHBvc19zaGFyZXMgPiBVSW50NjQoMCkKICAgIGR1cAogICAgYXNzZXJ0CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjE4MgogICAgLy8gaGlnaCwgbG93ID0gb3AubXVsdyhsaHMsIHJocykKICAgIHVuY292ZXIgMgogICAgZGlnIDEKICAgIG11bHcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6MTgzCiAgICAvLyByZXR1cm4gb3AuZGl2dyhoaWdoLCBsb3csIGRlbm9taW5hdG9yKQogICAgdW5jb3ZlciAzCiAgICBkaXZ3CiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjU5MgogICAgLy8gbiA9IHNlbGYubi52YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gIm4iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgY292ZXIgMgogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubiBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6NTkzLTU5NAogICAgLy8gIyBCdWlsZCBuZXcgcG9zaXRpb24gdmFsdWUgd2l0aCB1cGRhdGVkIGNoZWNrcG9pbnRzOyBzZW5kIGZlZXMgaW4gc2FtZSBwYXNzLgogICAgLy8gbmV3X3Bvc192YWx1ZSA9IG9wLml0b2IocG9zX3NoYXJlcykgICMgc2hhcmVzIHVuY2hhbmdlZAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo1OTYKICAgIC8vIGZvciBpZHggaW4gdXJhbmdlKG4pOgogICAgaW50Y18wIC8vIDAKCmNsYWltX2ZlZXNfZm9yX2hlYWRlckAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo1OTYKICAgIC8vIGZvciBpZHggaW4gdXJhbmdlKG4pOgogICAgZHVwCiAgICBkaWcgMwogICAgPAogICAgYnogY2xhaW1fZmVlc19hZnRlcl9mb3JAOQogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToxNzYKICAgIC8vIHJldHVybiBpbmRleCAqIFVJbnQ2NCg4KQogICAgZHVwCiAgICBpbnRjXzEgLy8gOAogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo1OTcKICAgIC8vIGZnX2dsb2JhbCA9IHJlYWRfZmVlX2dyb3d0aChzZWxmLmZlZV9ncm93dGgsIGlkeCkKICAgIGJ5dGVjXzMgLy8gMHg2NjY1NjU1ZjY3NzI2Zjc3NzQ2OAogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToyMjMKICAgIC8vIHJldHVybiBvcC5leHRyYWN0X3VpbnQ2NChmZWVfZ3Jvd3RoLmV4dHJhY3QocmVzZXJ2ZV9vZmZzZXQoaW5kZXgpLCBVSW50NjQoOCkpLCAwKQogICAgZGlnIDEKICAgIGludGNfMSAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgOQogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo1OTgKICAgIC8vIGZnX2NoZWNrcG9pbnQgPSBvcC5leHRyYWN0X3VpbnQ2NChwb3NfcmF3LCBVSW50NjQoOCkgKyBpZHggKiBVSW50NjQoOCkpCiAgICBpbnRjXzEgLy8gOAogICAgKwogICAgZGlnIDYKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6NTk5LTYwMQogICAgLy8gIyBDaGVja3BvaW50IGFkdmFuY2VzIHRvIGN1cnJlbnQgdmFsdWUgcmVnYXJkbGVzcyAocHJldmVudHMgZG91YmxlLWNsYWltCiAgICAvLyAjIGV2ZW4gaWYgY2xhaW1hYmxlIHJvdW5kcyB0byB6ZXJvIGR1ZSB0byBmaXhlZC1wb2ludCBmbG9vcikuCiAgICAvLyBuZXdfcG9zX3ZhbHVlID0gbmV3X3Bvc192YWx1ZSArIG9wLml0b2IoZmdfZ2xvYmFsKQogICAgZHVwCiAgICBpdG9iCiAgICBkaWcgNAogICAgc3dhcAogICAgY29uY2F0CiAgICBidXJ5IDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6NjAzCiAgICAvLyBpZiBmZ19nbG9iYWwgPiBmZ19jaGVja3BvaW50OgogICAgPAogICAgYnogY2xhaW1fZmVlc19hZnRlcl9pZl9lbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6NjA0CiAgICAvLyBmZWVfZGVsdGEgPSBmZ19nbG9iYWwgLSBmZ19jaGVja3BvaW50CiAgICBkaWcgNgogICAgZGlnIDgKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6MTgyCiAgICAvLyBoaWdoLCBsb3cgPSBvcC5tdWx3KGxocywgcmhzKQogICAgZGlnIDQKICAgIG11bHcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6NjA1CiAgICAvLyBjbGFpbWFibGUgPSBtdWxfZGl2X2Zsb29yKHBvc19yLCBmZWVfZGVsdGEsIFVJbnQ2NChfUFJFQ0lTSU9OKSkKICAgIGludGNfMyAvLyAxMDAwMDAwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjE4MwogICAgLy8gcmV0dXJuIG9wLmRpdncoaGlnaCwgbG93LCBkZW5vbWluYXRvcikKICAgIGRpdncKICAgIGR1cAogICAgYnVyeSAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo2MDYKICAgIC8vIGlmIGNsYWltYWJsZSA+IFVJbnQ2NCgwKToKICAgIGJ6IGNsYWltX2ZlZXNfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjYwNwogICAgLy8gc2VuZF90b2tlbnMoc2VsZi50b2tlbnNbaWR4XSwgVHhuLnNlbmRlciwgY2xhaW1hYmxlKQogICAgZHVwCiAgICBpdG9iCiAgICBieXRlYyAxMCAvLyAweDc0NmY2YjY1NmUzYQogICAgc3dhcAogICAgY29uY2F0CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b2tlbnMgZW50cnkgZXhpc3RzCiAgICBidG9pCiAgICB0eG4gU2VuZGVyCiAgICBkaWcgMTAKICAgIGNhbGxzdWIgc2VuZF90b2tlbnMKCmNsYWltX2ZlZXNfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo1OTYKICAgIC8vIGZvciBpZHggaW4gdXJhbmdlKG4pOgogICAgZHVwCiAgICBpbnRjXzIgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIGNsYWltX2ZlZXNfZm9yX2hlYWRlckAyCgpjbGFpbV9mZWVzX2FmdGVyX2ZvckA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo2MDkKICAgIC8vIHNlbGYucG9zaXRpb25zW3Bvc19rZXldID0gbmV3X3Bvc192YWx1ZQogICAgZGlnIDUKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo1NTkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaW50Y18yIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5vcmJpdGFsX3Bvb2wuY29udHJhY3QuT3JiaXRhbFBvb2wucmVtb3ZlX2xpcXVpZGl0eVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnJlbW92ZV9saXF1aWRpdHk6CiAgICBpbnRjXzAgLy8gMAogICAgcHVzaGJ5dGVzICIiCiAgICBkdXBuIDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6NjExCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgY292ZXIgMgogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo2MzEKICAgIC8vIGFzc2VydCBzZWxmLnBhdXNlZC52YWx1ZSA9PSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJwYXVzZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucGF1c2VkIGV4aXN0cwogICAgIQogICAgYXNzZXJ0CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjYzMgogICAgLy8gYXNzZXJ0IHNlbGYuYm9vdHN0cmFwcGVkLnZhbHVlID09IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImJvb3RzdHJhcHBlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ib290c3RyYXBwZWQgZXhpc3RzCiAgICBpbnRjXzIgLy8gMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo2MzMKICAgIC8vIGFzc2VydCBzZWxmLnJlZ2lzdGVyZWRfdG9rZW5zLnZhbHVlID09IHNlbGYubi52YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJyZWdpc3RlcmVkX3Rva2VucyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZWdpc3RlcmVkX3Rva2VucyBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJuIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgY292ZXIgNQogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubiBleGlzdHMKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6NjM0CiAgICAvLyBhc3NlcnQgc2hhcmVzID4gVUludDY0KDApCiAgICBkdXAKICAgIGFzc2VydAogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo2MzUKICAgIC8vIGFzc2VydCB0aWNrX2lkIGluIHNlbGYudGlja3MKICAgIHN3YXAKICAgIGl0b2IKICAgIGJ5dGVjIDE1IC8vIDB4NzQ2OTYzNmIzYQogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBjb3ZlciAzCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjYzNwogICAgLy8gcG9zX2tleSA9IFR4bi5zZW5kZXIuYnl0ZXMgKyBvcC5pdG9iKHRpY2tfaWQpCiAgICB0eG4gU2VuZGVyCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo2MzgKICAgIC8vIGFzc2VydCBwb3Nfa2V5IGluIHNlbGYucG9zaXRpb25zCiAgICBieXRlYyAyMCAvLyAweDcwNmY3MzNhCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgY292ZXIgMwogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydAogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo2NDAKICAgIC8vIHRpY2sgPSBzZWxmLnRpY2tzW3RpY2tfaWRdLmNvcHkoKQogICAgc3dhcAogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjY0MQogICAgLy8gdGlja19yID0gdGljay5yLmFzX3VpbnQ2NCgpCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBjb3ZlciAzCiAgICBjb3ZlciA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjY0MgogICAgLy8gdGlja19rID0gdGljay5rLmFzX3VpbnQ2NCgpCiAgICBkdXAKICAgIGludGNfMSAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBjb3ZlciA0CiAgICBjb3ZlciA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjY0MwogICAgLy8gdGlja19zdGF0ZSA9IHRpY2suc3RhdGUuYXNfdWludDY0KCkKICAgIGR1cAogICAgZXh0cmFjdCAxNiAxCiAgICBjb3ZlciA1CiAgICBkdXAKICAgIHB1c2hpbnQgMTYKICAgIGdldGJ5dGUKICAgIGNvdmVyIDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6NjQ0CiAgICAvLyB0aWNrX3RvdGFsX3NoYXJlcyA9IHRpY2sudG90YWxfc2hhcmVzLmFzX3VpbnQ2NCgpCiAgICBwdXNoaW50IDE3CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo2NDYKICAgIC8vIHBvc19yYXcgPSBzZWxmLnBvc2l0aW9uc1twb3Nfa2V5XQogICAgc3dhcAogICAgYm94X2dldAogICAgcG9wCiAgICBkdXAKICAgIGNvdmVyIDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6NjQ3CiAgICAvLyBwb3Nfc2hhcmVzID0gb3AuZXh0cmFjdF91aW50NjQocG9zX3JhdywgMCkKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBjb3ZlciA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjY0OAogICAgLy8gYXNzZXJ0IHNoYXJlcyA8PSBwb3Nfc2hhcmVzCiAgICBkaWcgNAogICAgZGlnIDEKICAgIDw9CiAgICBhc3NlcnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6NjUxCiAgICAvLyBzcXJ0X24gPSBzZWxmLnNxcnRfbi52YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE3IC8vICJzcXJ0X24iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgY292ZXIgNgogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3FydF9uIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo2NTIKICAgIC8vIGlzX2Z1bGwgPSBzaGFyZXMgPT0gcG9zX3NoYXJlcwogICAgZGlnIDQKICAgID09CiAgICBjb3ZlciA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjE4MgogICAgLy8gaGlnaCwgbG93ID0gb3AubXVsdyhsaHMsIHJocykKICAgIGRpZyAxCiAgICBkaWcgNAogICAgbXVsdwogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToxODMKICAgIC8vIHJldHVybiBvcC5kaXZ3KGhpZ2gsIGxvdywgZGVub21pbmF0b3IpCiAgICBkaWcgMgogICAgZGl2dwogICAgZHVwCiAgICBjb3ZlciAzCiAgICBjb3ZlciA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjE4MgogICAgLy8gaGlnaCwgbG93ID0gb3AubXVsdyhsaHMsIHJocykKICAgIGRpZyAzCiAgICB1bmNvdmVyIDUKICAgIG11bHcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6MTgzCiAgICAvLyByZXR1cm4gb3AuZGl2dyhoaWdoLCBsb3csIGRlbm9taW5hdG9yKQogICAgdW5jb3ZlciAyCiAgICBkaXZ3CiAgICBkdXAKICAgIGNvdmVyIDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6NjU3CiAgICAvLyByZW1haW5pbmdfciA9IHRpY2tfciAtIHBvc19yCiAgICBzd2FwCiAgICBkaWcgMgogICAgLQogICAgY292ZXIgMwogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo2NTgKICAgIC8vIHJlbWFpbmluZ19rID0gdGlja19rIC0gcG9zX2sKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgLQogICAgc3dhcAogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo2NjAtNjYxCiAgICAvLyAjIFNhdmUgb2xkIHRvdGFsX3IgYmVmb3JlIGFueSBtdXRhdGlvbiAobmVlZGVkIGZvciByZXNlcnZlIHByby1yYXRhKS4KICAgIC8vIG9sZF90b3RhbF9yID0gc2VsZi50b3RhbF9yLnZhbHVlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAidG90YWxfciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGNvdmVyIDMKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX3IgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjY2MgogICAgLy8gYXNzZXJ0IG9sZF90b3RhbF9yID49IHBvc19yCiAgICA8PQogICAgYXNzZXJ0CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjY2NC02NjUKICAgIC8vICMg4pSA4pSAIFN0ZXAgMTogU2V0dGxlIGZlZXMgKHNhbWUgbG9naWMgYXMgY2xhaW1fZmVlcywgaW5saW5lIGZvciBhdG9taWNpdHkpIOKUgOKUgAogICAgLy8gZm9yIGlkeCBpbiB1cmFuZ2Uobik6CiAgICBpbnRjXzAgLy8gMAoKcmVtb3ZlX2xpcXVpZGl0eV9mb3JfaGVhZGVyQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjY2NC02NjUKICAgIC8vICMg4pSA4pSAIFN0ZXAgMTogU2V0dGxlIGZlZXMgKHNhbWUgbG9naWMgYXMgY2xhaW1fZmVlcywgaW5saW5lIGZvciBhdG9taWNpdHkpIOKUgOKUgAogICAgLy8gZm9yIGlkeCBpbiB1cmFuZ2Uobik6CiAgICBkdXAKICAgIGRpZyAxNwogICAgPAogICAgYnogcmVtb3ZlX2xpcXVpZGl0eV9hZnRlcl9mb3JAOQogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToxNzYKICAgIC8vIHJldHVybiBpbmRleCAqIFVJbnQ2NCg4KQogICAgZHVwCiAgICBpbnRjXzEgLy8gOAogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo2NjYKICAgIC8vIGZnX2dsb2JhbCA9IHJlYWRfZmVlX2dyb3d0aChzZWxmLmZlZV9ncm93dGgsIGlkeCkKICAgIGJ5dGVjXzMgLy8gMHg2NjY1NjU1ZjY3NzI2Zjc3NzQ2OAogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToyMjMKICAgIC8vIHJldHVybiBvcC5leHRyYWN0X3VpbnQ2NChmZWVfZ3Jvd3RoLmV4dHJhY3QocmVzZXJ2ZV9vZmZzZXQoaW5kZXgpLCBVSW50NjQoOCkpLCAwKQogICAgZGlnIDEKICAgIGludGNfMSAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgMjcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6NjY3CiAgICAvLyBmZ19jaGVja3BvaW50ID0gb3AuZXh0cmFjdF91aW50NjQocG9zX3JhdywgVUludDY0KDgpICsgaWR4ICogVUludDY0KDgpKQogICAgaW50Y18xIC8vIDgKICAgICsKICAgIGRpZyAxMQogICAgc3dhcAogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgYnVyeSAyOAogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo2NjgKICAgIC8vIGlmIGZnX2dsb2JhbCA+IGZnX2NoZWNrcG9pbnQ6CiAgICA+CiAgICBieiByZW1vdmVfbGlxdWlkaXR5X2FmdGVyX2lmX2Vsc2VANwogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo2NjkKICAgIC8vIGZlZV9kZWx0YSA9IGZnX2dsb2JhbCAtIGZnX2NoZWNrcG9pbnQKICAgIGRpZyAyNAogICAgZGlnIDI2CiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjE4MgogICAgLy8gaGlnaCwgbG93ID0gb3AubXVsdyhsaHMsIHJocykKICAgIGRpZyA2CiAgICBtdWx3CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjY3MAogICAgLy8gY2xhaW1hYmxlID0gbXVsX2Rpdl9mbG9vcihwb3NfciwgZmVlX2RlbHRhLCBVSW50NjQoX1BSRUNJU0lPTikpCiAgICBpbnRjXzMgLy8gMTAwMDAwMDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToxODMKICAgIC8vIHJldHVybiBvcC5kaXZ3KGhpZ2gsIGxvdywgZGVub21pbmF0b3IpCiAgICBkaXZ3CiAgICBkdXAKICAgIGJ1cnkgMjgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6NjcxCiAgICAvLyBpZiBjbGFpbWFibGUgPiBVSW50NjQoMCk6CiAgICBieiByZW1vdmVfbGlxdWlkaXR5X2FmdGVyX2lmX2Vsc2VANwogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo2NzIKICAgIC8vIHNlbmRfdG9rZW5zKHNlbGYudG9rZW5zW2lkeF0sIFR4bi5zZW5kZXIsIGNsYWltYWJsZSkKICAgIGR1cAogICAgaXRvYgogICAgYnl0ZWMgMTAgLy8gMHg3NDZmNmI2NTZlM2EKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG9rZW5zIGVudHJ5IGV4aXN0cwogICAgYnRvaQogICAgdHhuIFNlbmRlcgogICAgZGlnIDI4CiAgICBjYWxsc3ViIHNlbmRfdG9rZW5zCgpyZW1vdmVfbGlxdWlkaXR5X2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6NjY0LTY2NQogICAgLy8gIyDilIDilIAgU3RlcCAxOiBTZXR0bGUgZmVlcyAoc2FtZSBsb2dpYyBhcyBjbGFpbV9mZWVzLCBpbmxpbmUgZm9yIGF0b21pY2l0eSkg4pSA4pSACiAgICAvLyBmb3IgaWR4IGluIHVyYW5nZShuKToKICAgIGR1cAogICAgaW50Y18yIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiByZW1vdmVfbGlxdWlkaXR5X2Zvcl9oZWFkZXJAMgoKcmVtb3ZlX2xpcXVpZGl0eV9hZnRlcl9mb3JAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6Njc0LTY3NQogICAgLy8gIyDilIDilIAgU3RlcCAyOiBVcGRhdGUgY29uc29saWRhdGlvbiBzdGF0ZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIC8vIGlmIHRpY2tfc3RhdGUgPT0gVUludDY0KDApOiAgIyBJTlRFUklPUgogICAgZGlnIDEwCiAgICBibnogcmVtb3ZlX2xpcXVpZGl0eV9lbHNlX2JvZHlAMTEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6Njc2CiAgICAvLyBzZWxmLnJfaW50LnZhbHVlIC09IHBvc19yCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAicl9pbnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucl9pbnQgZXhpc3RzCiAgICBkaWcgNgogICAgLQogICAgYnl0ZWMgNCAvLyAicl9pbnQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKcmVtb3ZlX2xpcXVpZGl0eV9hZnRlcl9pZl9lbHNlQDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo2ODYKICAgIC8vIHNlbGYudG90YWxfci52YWx1ZSAtPSBwb3NfcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gInRvdGFsX3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfciBleGlzdHMKICAgIGRpZyA2CiAgICAtCiAgICBieXRlYyA5IC8vICJ0b3RhbF9yIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6Njg4LTY4OQogICAgLy8gIyDilIDilIAgU3RlcCAzOiBWaXJ0dWFsIG9mZnNldCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIC8vIG9sZF94X21pbiA9IHhfbWluX2Zvcl90aWNrKHRpY2tfciwgdGlja19rLCBuLCBzcXJ0X24pCiAgICBkaWcgMTMKICAgIGRpZyAxMwogICAgZGlnIDE4CiAgICBkaWcgMTAKICAgIGNhbGxzdWIgeF9taW5fZm9yX3RpY2sKICAgIGJ1cnkgMTkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6NjkwCiAgICAvLyBpZiBpc19mdWxsOgogICAgZGlnIDYKICAgIGJ6IHJlbW92ZV9saXF1aWRpdHlfZWxzZV9ib2R5QDE3CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjY5MQogICAgLy8gbmV3X3hfbWluID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAoKcmVtb3ZlX2xpcXVpZGl0eV9hZnRlcl9pZl9lbHNlQDE4OgogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo2OTQKICAgIC8vIG9sZF9vZmZzZXQgPSBzZWxmLnZpcnR1YWxfb2Zmc2V0LnZhbHVlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOCAvLyAidmlydHVhbF9vZmZzZXQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudmlydHVhbF9vZmZzZXQgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjY5NQogICAgLy8gbmV3X29mZnNldCA9IG9sZF9vZmZzZXQgLSAob2xkX3hfbWluIC0gbmV3X3hfbWluKQogICAgZGlnIDIwCiAgICB1bmNvdmVyIDIKICAgIC0KICAgIC0KICAgIGR1cAogICAgYnVyeSAyNAogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo2OTYKICAgIC8vIHNlbGYudmlydHVhbF9vZmZzZXQudmFsdWUgPSBuZXdfb2Zmc2V0CiAgICBieXRlYyA4IC8vICJ2aXJ0dWFsX29mZnNldCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjY5OC03MDEKICAgIC8vICMg4pSA4pSAIFN0ZXAgNCs1OiBSZXNlcnZlIHBheW91dCArIHJlY29tcHV0ZSBhZ2dyZWdhdGVzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgLy8gIyBMUCByZWNlaXZlcyBwb3NfciAvIG9sZF90b3RhbF9yIG9mIGVhY2ggYWN0dWFsIHJlc2VydmUuCiAgICAvLyAjIFJlY29tcHV0ZSBzdW1feCBhbmQgc3VtX3hfc3EgZnJvbSBzY3JhdGNoIGF0IG5ld19vZmZzZXQuCiAgICAvLyBuZXdfc3VtID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSAyMgogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo3MDIKICAgIC8vIG5ld19zdW1fc3EgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDIxCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjcwMwogICAgLy8gZm9yIGlkeCBpbiB1cmFuZ2Uobik6CiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSAxCgpyZW1vdmVfbGlxdWlkaXR5X2Zvcl9oZWFkZXJAMTk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjcwMwogICAgLy8gZm9yIGlkeCBpbiB1cmFuZ2Uobik6CiAgICBkdXAKICAgIGRpZyAxNwogICAgPAogICAgYnogcmVtb3ZlX2xpcXVpZGl0eV9hZnRlcl9mb3JAMjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6MTc2CiAgICAvLyByZXR1cm4gaW5kZXggKiBVSW50NjQoOCkKICAgIGR1cAogICAgaW50Y18xIC8vIDgKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6NzA0CiAgICAvLyBvbGRfYWN0dWFsID0gcmVhZF9yZXNlcnZlKHNlbGYucmVzZXJ2ZXMsIGlkeCkKICAgIGJ5dGVjXzAgLy8gMHg3MjY1NzM2NTcyNzY2NTczCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjIxMwogICAgLy8gcmV0dXJuIG9wLmV4dHJhY3RfdWludDY0KHJlc2VydmVzLmV4dHJhY3QocmVzZXJ2ZV9vZmZzZXQoaW5kZXgpLCBVSW50NjQoOCkpLCAwKQogICAgZGlnIDEKICAgIGludGNfMSAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjE4MgogICAgLy8gaGlnaCwgbG93ID0gb3AubXVsdyhsaHMsIHJocykKICAgIGR1cAogICAgZGlnIDgKICAgIG11bHcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6MTgzCiAgICAvLyByZXR1cm4gb3AuZGl2dyhoaWdoLCBsb3csIGRlbm9taW5hdG9yKQogICAgZGlnIDUKICAgIGRpdncKICAgIGR1cAogICAgYnVyeSAyNwogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo3MDYKICAgIC8vIG5ld19hY3R1YWwgPSBvbGRfYWN0dWFsIC0gbHBfc2hhcmUKICAgIHN3YXAKICAgIGRpZyAxCiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjIxOAogICAgLy8gcmVzZXJ2ZXMucmVwbGFjZShyZXNlcnZlX29mZnNldChpbmRleCksIG9wLml0b2IodmFsdWUpKQogICAgZHVwCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjcwNwogICAgLy8gd3JpdGVfcmVzZXJ2ZShzZWxmLnJlc2VydmVzLCBpZHgsIG5ld19hY3R1YWwpCiAgICBieXRlY18wIC8vIDB4NzI2NTczNjU3Mjc2NjU3MwogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToyMTgKICAgIC8vIHJlc2VydmVzLnJlcGxhY2UocmVzZXJ2ZV9vZmZzZXQoaW5kZXgpLCBvcC5pdG9iKHZhbHVlKSkKICAgIHVuY292ZXIgNAogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToyMDgKICAgIC8vIHJldHVybiByYXcgLy8gVUludDY0KF9BTU9VTlRfU0NBTEUpCiAgICBpbnRjIDQgLy8gMTAwMAogICAgLwogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo3MDgKICAgIC8vIG5ld19tYXRoID0gdG9fc2NhbGVkKG5ld19hY3R1YWwpICsgbmV3X29mZnNldAogICAgZGlnIDI0CiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjcwOQogICAgLy8gbmV3X3N1bSArPSBuZXdfbWF0aAogICAgZGlnIDIzCiAgICBkaWcgMQogICAgKwogICAgYnVyeSAyNAogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToxODkKICAgIC8vIGhpZ2gsIGxvdyA9IG9wLm11bHcodmFsdWUsIHZhbHVlKQogICAgZHVwCiAgICBtdWx3CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjE5MAogICAgLy8gYXNzZXJ0IGhpZ2ggPT0gVUludDY0KDApCiAgICBzd2FwCiAgICAhCiAgICBhc3NlcnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6NzEwCiAgICAvLyBuZXdfc3VtX3NxICs9IHNxdWFyZV9yYXcobmV3X21hdGgpCiAgICBkaWcgMjIKICAgICsKICAgIGJ1cnkgMjIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6NzExCiAgICAvLyBpZiBscF9zaGFyZSA+IFVJbnQ2NCgwKToKICAgIGJ6IHJlbW92ZV9saXF1aWRpdHlfYWZ0ZXJfaWZfZWxzZUAyMgogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo3MTIKICAgIC8vIHNlbmRfdG9rZW5zKHNlbGYudG9rZW5zW2lkeF0sIFR4bi5zZW5kZXIsIGxwX3NoYXJlKQogICAgZHVwCiAgICBpdG9iCiAgICBieXRlYyAxMCAvLyAweDc0NmY2YjY1NmUzYQogICAgc3dhcAogICAgY29uY2F0CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50b2tlbnMgZW50cnkgZXhpc3RzCiAgICBidG9pCiAgICB0eG4gU2VuZGVyCiAgICBkaWcgMjUKICAgIGNhbGxzdWIgc2VuZF90b2tlbnMKCnJlbW92ZV9saXF1aWRpdHlfYWZ0ZXJfaWZfZWxzZUAyMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6NzAzCiAgICAvLyBmb3IgaWR4IGluIHVyYW5nZShuKToKICAgIGR1cAogICAgaW50Y18yIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiByZW1vdmVfbGlxdWlkaXR5X2Zvcl9oZWFkZXJAMTkKCnJlbW92ZV9saXF1aWRpdHlfYWZ0ZXJfZm9yQDI0OgogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo3MTQKICAgIC8vIHNlbGYuc3VtX3gudmFsdWUgPSBuZXdfc3VtCiAgICBieXRlYyA2IC8vICJzdW1feCIKICAgIGRpZyAyMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6NzE1CiAgICAvLyBzZWxmLnN1bV94X3NxLnZhbHVlID0gbmV3X3N1bV9zcQogICAgYnl0ZWMgNyAvLyAic3VtX3hfc3EiCiAgICBkaWcgMjEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjcxNy03MTgKICAgIC8vICMg4pSA4pSAIFN0ZXAgNjogVXBkYXRlIC8gZGVsZXRlIHRpY2sgYW5kIHBvc2l0aW9uIGJveGVzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgLy8gaWYgaXNfZnVsbDoKICAgIGRpZyA2CiAgICBieiByZW1vdmVfbGlxdWlkaXR5X2Vsc2VfYm9keUAyNgogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo3MTkKICAgIC8vIGRlbCBzZWxmLnRpY2tzW3RpY2tfaWRdCiAgICBkaWcgMTUKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo3MjAKICAgIC8vIGRlbCBzZWxmLnBvc2l0aW9uc1twb3Nfa2V5XQogICAgZGlnIDE0CiAgICBib3hfZGVsCiAgICBwb3AKCnJlbW92ZV9saXF1aWRpdHlfYWZ0ZXJfaWZfZWxzZUAzMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6NjExCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMiAvLyAxCiAgICByZXR1cm4KCnJlbW92ZV9saXF1aWRpdHlfZWxzZV9ib2R5QDI2OgogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo3MjIKICAgIC8vIHJlbWFpbmluZ19zaGFyZXMgPSBwb3Nfc2hhcmVzIC0gc2hhcmVzCiAgICBkaWcgOAogICAgZGlnIDE4CiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjcyNAogICAgLy8gcj1hcmM0LlVJbnQ2NChyZW1haW5pbmdfciksCiAgICBkaWcgNAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo3MjUKICAgIC8vIGs9YXJjNC5VSW50NjQocmVtYWluaW5nX2spLAogICAgZGlnIDQKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6NzI3CiAgICAvLyB0b3RhbF9zaGFyZXM9YXJjNC5VSW50NjQocmVtYWluaW5nX3NoYXJlcyksCiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGR1cAogICAgY292ZXIgMwogICAgYnVyeSAzMQogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo3MjMtNzI4CiAgICAvLyBzZWxmLnRpY2tzW3RpY2tfaWRdID0gVGlja0RhdGEoCiAgICAvLyAgICAgcj1hcmM0LlVJbnQ2NChyZW1haW5pbmdfciksCiAgICAvLyAgICAgaz1hcmM0LlVJbnQ2NChyZW1haW5pbmdfayksCiAgICAvLyAgICAgc3RhdGU9dGljay5zdGF0ZSwKICAgIC8vICAgICB0b3RhbF9zaGFyZXM9YXJjNC5VSW50NjQocmVtYWluaW5nX3NoYXJlcyksCiAgICAvLyApCiAgICBjb25jYXQKICAgIGRpZyAxMwogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGRpZyAxNgogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo3MzEKICAgIC8vIGZvciBpZHggaW4gdXJhbmdlKG4pOgogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMQoKcmVtb3ZlX2xpcXVpZGl0eV9mb3JfaGVhZGVyQDI3OgogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo3MzEKICAgIC8vIGZvciBpZHggaW4gdXJhbmdlKG4pOgogICAgZHVwCiAgICBkaWcgMTcKICAgIDwKICAgIGJ6IHJlbW92ZV9saXF1aWRpdHlfYWZ0ZXJfZm9yQDMwCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjE3NgogICAgLy8gcmV0dXJuIGluZGV4ICogVUludDY0KDgpCiAgICBkdXBuIDIKICAgIGludGNfMSAvLyA4CiAgICAqCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjczMgogICAgLy8gZmcgPSByZWFkX2ZlZV9ncm93dGgoc2VsZi5mZWVfZ3Jvd3RoLCBpZHgpCiAgICBieXRlY18zIC8vIDB4NjY2NTY1NWY2NzcyNmY3Nzc0NjgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6MjIzCiAgICAvLyByZXR1cm4gb3AuZXh0cmFjdF91aW50NjQoZmVlX2dyb3d0aC5leHRyYWN0KHJlc2VydmVfb2Zmc2V0KGluZGV4KSwgVUludDY0KDgpKSwgMCkKICAgIHN3YXAKICAgIGludGNfMSAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo3MzMKICAgIC8vIG5ld19wb3NfdmFsdWUgPSBuZXdfcG9zX3ZhbHVlICsgb3AuaXRvYihmZykKICAgIGV4dHJhY3QgMCA4CiAgICBkaWcgMjkKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnVyeSAyOQogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo3MzEKICAgIC8vIGZvciBpZHggaW4gdXJhbmdlKG4pOgogICAgaW50Y18yIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiByZW1vdmVfbGlxdWlkaXR5X2Zvcl9oZWFkZXJAMjcKCnJlbW92ZV9saXF1aWRpdHlfYWZ0ZXJfZm9yQDMwOgogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo3MzQKICAgIC8vIHNlbGYucG9zaXRpb25zW3Bvc19rZXldID0gbmV3X3Bvc192YWx1ZQogICAgZGlnIDE0CiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgZGlnIDI4CiAgICBib3hfcHV0CiAgICBiIHJlbW92ZV9saXF1aWRpdHlfYWZ0ZXJfaWZfZWxzZUAzMQoKcmVtb3ZlX2xpcXVpZGl0eV9lbHNlX2JvZHlAMTc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjY5MwogICAgLy8gbmV3X3hfbWluID0geF9taW5fZm9yX3RpY2socmVtYWluaW5nX3IsIHJlbWFpbmluZ19rLCBuLCBzcXJ0X24pCiAgICBkaWcgMwogICAgZGlnIDMKICAgIGRpZyAxOAogICAgZGlnIDEwCiAgICBjYWxsc3ViIHhfbWluX2Zvcl90aWNrCiAgICBiIHJlbW92ZV9saXF1aWRpdHlfYWZ0ZXJfaWZfZWxzZUAxOAoKcmVtb3ZlX2xpcXVpZGl0eV9lbHNlX2JvZHlAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjY3OAogICAgLy8gb2xkX3MgPSBib3VuZGFyeV9yYWRpdXNfY2FsYyh0aWNrX3IsIHRpY2tfaywgc3FydF9uKQogICAgZGlnIDEzCiAgICBkaWcgMTMKICAgIGRpZyA5CiAgICBjYWxsc3ViIGJvdW5kYXJ5X3JhZGl1c19jYWxjCiAgICBidXJ5IDIwCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjY3OQogICAgLy8gaWYgaXNfZnVsbDoKICAgIGRpZyA2CiAgICBieiByZW1vdmVfbGlxdWlkaXR5X2Vsc2VfYm9keUAxMwogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo2ODAKICAgIC8vIG5ld19zID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAoKcmVtb3ZlX2xpcXVpZGl0eV9hZnRlcl9pZl9lbHNlQDE0OgogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo2ODMKICAgIC8vIHNlbGYuc19ib3VuZC52YWx1ZSAtPSAob2xkX3MgLSBuZXdfcykKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAic19ib3VuZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zX2JvdW5kIGV4aXN0cwogICAgZGlnIDIxCiAgICB1bmNvdmVyIDIKICAgIC0KICAgIC0KICAgIGJ5dGVjIDEzIC8vICJzX2JvdW5kIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6Njg0CiAgICAvLyBzZWxmLmtfYm91bmQudmFsdWUgLT0gcG9zX2sKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNCAvLyAia19ib3VuZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5rX2JvdW5kIGV4aXN0cwogICAgZGlnIDUKICAgIC0KICAgIGJ5dGVjIDE0IC8vICJrX2JvdW5kIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIGIgcmVtb3ZlX2xpcXVpZGl0eV9hZnRlcl9pZl9lbHNlQDE1CgpyZW1vdmVfbGlxdWlkaXR5X2Vsc2VfYm9keUAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6NjgyCiAgICAvLyBuZXdfcyA9IGJvdW5kYXJ5X3JhZGl1c19jYWxjKHJlbWFpbmluZ19yLCByZW1haW5pbmdfaywgc3FydF9uKQogICAgZGlnIDMKICAgIGRpZyAzCiAgICBkaWcgOQogICAgY2FsbHN1YiBib3VuZGFyeV9yYWRpdXNfY2FsYwogICAgYiByZW1vdmVfbGlxdWlkaXR5X2FmdGVyX2lmX2Vsc2VAMTQKCgovLyBzbWFydF9jb250cmFjdHMub3JiaXRhbF9wb29sLmNvbnRyYWN0Lk9yYml0YWxQb29sLnN3YXBbcm91dGluZ10oKSAtPiB2b2lkOgpzd2FwOgogICAgcHVzaGJ5dGVzICIiCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6NzM4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgY292ZXIgNAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo3NTYKICAgIC8vIGFzc2VydCBzZWxmLnBhdXNlZC52YWx1ZSA9PSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJwYXVzZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucGF1c2VkIGV4aXN0cwogICAgIQogICAgYXNzZXJ0CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5Ojc1NwogICAgLy8gYXNzZXJ0IHNlbGYuYm9vdHN0cmFwcGVkLnZhbHVlID09IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImJvb3RzdHJhcHBlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ib290c3RyYXBwZWQgZXhpc3RzCiAgICBpbnRjXzIgLy8gMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo3NTgKICAgIC8vIGFzc2VydCBzZWxmLnJlZ2lzdGVyZWRfdG9rZW5zLnZhbHVlID09IHNlbGYubi52YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJyZWdpc3RlcmVkX3Rva2VucyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZWdpc3RlcmVkX3Rva2VucyBleGlzdHMKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJuIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm4gZXhpc3RzCiAgICBzd2FwCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo3NTkKICAgIC8vIGFzc2VydCB0b2tlbl9pbl9pZHggIT0gdG9rZW5fb3V0X2lkeAogICAgZGlnIDUKICAgIGRpZyA1CiAgICAhPQogICAgYXNzZXJ0CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5Ojc2MAogICAgLy8gYXNzZXJ0IHRva2VuX2luX2lkeCA8IHNlbGYubi52YWx1ZQogICAgZGlnIDUKICAgIGRpZyAxCiAgICA8CiAgICBhc3NlcnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6NzYxCiAgICAvLyBhc3NlcnQgdG9rZW5fb3V0X2lkeCA8IHNlbGYubi52YWx1ZQogICAgZGlnIDQKICAgID4KICAgIGFzc2VydAogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo3NjIKICAgIC8vIGFzc2VydCBjbGFpbWVkX2Ftb3VudF9vdXQgPj0gbWluX2Ftb3VudF9vdXQKICAgIGRpZyAxCiAgICA8PQogICAgYXNzZXJ0CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5Ojc2NAogICAgLy8gdG9rZW5faW5fYXNzZXQgPSBzZWxmLnRva2Vuc1t0b2tlbl9pbl9pZHhdCiAgICBkaWcgMwogICAgaXRvYgogICAgYnl0ZWMgMTAgLy8gMHg3NDZmNmI2NTZlM2EKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG9rZW5zIGVudHJ5IGV4aXN0cwogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo3NjUKICAgIC8vIHRva2VuX291dF9hc3NldCA9IHNlbGYudG9rZW5zW3Rva2VuX291dF9pZHhdCiAgICBkaWcgMwogICAgaXRvYgogICAgYnl0ZWMgMTAgLy8gMHg3NDZmNmI2NTZlM2EKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG9rZW5zIGVudHJ5IGV4aXN0cwogICAgYnRvaQogICAgY292ZXIgNQogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo3NjYKICAgIC8vIHZlcmlmeV9wcmVjZWRpbmdfdHJhbnNmZXIodG9rZW5faW5fYXNzZXQsIGFtb3VudF9pbikKICAgIGRpZyAyCiAgICBjYWxsc3ViIHZlcmlmeV9wcmVjZWRpbmdfdHJhbnNmZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6NzY4CiAgICAvLyBmZWUgPSBtdWxfZGl2X2Zsb29yKGFtb3VudF9pbiwgc2VsZi5mZWVfYnBzLnZhbHVlLCBVSW50NjQoX0ZFRV9ERU5PTUlOQVRPUikpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTggLy8gImZlZV9icHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZmVlX2JwcyBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6MTgyCiAgICAvLyBoaWdoLCBsb3cgPSBvcC5tdWx3KGxocywgcmhzKQogICAgZGlnIDIKICAgIG11bHcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6NzY4CiAgICAvLyBmZWUgPSBtdWxfZGl2X2Zsb29yKGFtb3VudF9pbiwgc2VsZi5mZWVfYnBzLnZhbHVlLCBVSW50NjQoX0ZFRV9ERU5PTUlOQVRPUikpCiAgICBpbnRjIDUgLy8gMTAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6MTgzCiAgICAvLyByZXR1cm4gb3AuZGl2dyhoaWdoLCBsb3csIGRlbm9taW5hdG9yKQogICAgZGl2dwogICAgZHVwCiAgICBjb3ZlciA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5Ojc2OQogICAgLy8gZWZmZWN0aXZlX2luID0gYW1vdW50X2luIC0gZmVlCiAgICB1bmNvdmVyIDIKICAgIGRpZyAxCiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5Ojc3MQogICAgLy8gb2Zmc2V0ID0gc2VsZi52aXJ0dWFsX29mZnNldC52YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDggLy8gInZpcnR1YWxfb2Zmc2V0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnZpcnR1YWxfb2Zmc2V0IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToxNzYKICAgIC8vIHJldHVybiBpbmRleCAqIFVJbnQ2NCg4KQogICAgdW5jb3ZlciA1CiAgICBpbnRjXzEgLy8gOAogICAgKgogICAgZHVwCiAgICBjb3ZlciA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5Ojc3MgogICAgLy8gb2xkX2luX2FjdHVhbCA9IHJlYWRfcmVzZXJ2ZShzZWxmLnJlc2VydmVzLCB0b2tlbl9pbl9pZHgpCiAgICBieXRlY18wIC8vIDB4NzI2NTczNjU3Mjc2NjU3MwogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToyMTMKICAgIC8vIHJldHVybiBvcC5leHRyYWN0X3VpbnQ2NChyZXNlcnZlcy5leHRyYWN0KHJlc2VydmVfb2Zmc2V0KGluZGV4KSwgVUludDY0KDgpKSwgMCkKICAgIGRpZyAxCiAgICBpbnRjXzEgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToxNzYKICAgIC8vIHJldHVybiBpbmRleCAqIFVJbnQ2NCg4KQogICAgdW5jb3ZlciA2CiAgICBpbnRjXzEgLy8gOAogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo3NzMKICAgIC8vIG9sZF9vdXRfYWN0dWFsID0gcmVhZF9yZXNlcnZlKHNlbGYucmVzZXJ2ZXMsIHRva2VuX291dF9pZHgpCiAgICBieXRlY18wIC8vIDB4NzI2NTczNjU3Mjc2NjU3MwogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToyMTMKICAgIC8vIHJldHVybiBvcC5leHRyYWN0X3VpbnQ2NChyZXNlcnZlcy5leHRyYWN0KHJlc2VydmVfb2Zmc2V0KGluZGV4KSwgVUludDY0KDgpKSwgMCkKICAgIGRpZyAxCiAgICBpbnRjXzEgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo3NzQKICAgIC8vIGFzc2VydCBjbGFpbWVkX2Ftb3VudF9vdXQgPD0gb2xkX291dF9hY3R1YWwKICAgIGRpZyA3CiAgICBkaWcgMQogICAgPD0KICAgIGFzc2VydAogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToyMDgKICAgIC8vIHJldHVybiByYXcgLy8gVUludDY0KF9BTU9VTlRfU0NBTEUpCiAgICBkaWcgMgogICAgaW50YyA0IC8vIDEwMDAKICAgIC8KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6Nzc2CiAgICAvLyBvbGRfaW5fbWF0aCA9IHRvX3NjYWxlZChvbGRfaW5fYWN0dWFsKSArIG9mZnNldAogICAgZGlnIDUKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6MjA4CiAgICAvLyByZXR1cm4gcmF3IC8vIFVJbnQ2NChfQU1PVU5UX1NDQUxFKQogICAgZGlnIDEKICAgIGludGMgNCAvLyAxMDAwCiAgICAvCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5Ojc3NwogICAgLy8gb2xkX291dF9tYXRoID0gdG9fc2NhbGVkKG9sZF9vdXRfYWN0dWFsKSArIG9mZnNldAogICAgZGlnIDYKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6Nzc4CiAgICAvLyBuZXdfaW5fYWN0dWFsID0gb2xkX2luX2FjdHVhbCArIGVmZmVjdGl2ZV9pbgogICAgdW5jb3ZlciA0CiAgICBkaWcgNwogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo3NzkKICAgIC8vIG5ld19vdXRfYWN0dWFsID0gb2xkX291dF9hY3R1YWwgLSBjbGFpbWVkX2Ftb3VudF9vdXQKICAgIHVuY292ZXIgMwogICAgZGlnIDkKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6MjA4CiAgICAvLyByZXR1cm4gcmF3IC8vIFVJbnQ2NChfQU1PVU5UX1NDQUxFKQogICAgZGlnIDEKICAgIGludGMgNCAvLyAxMDAwCiAgICAvCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5Ojc4MAogICAgLy8gbmV3X2luX21hdGggPSB0b19zY2FsZWQobmV3X2luX2FjdHVhbCkgKyBvZmZzZXQKICAgIGRpZyA3CiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjIwOAogICAgLy8gcmV0dXJuIHJhdyAvLyBVSW50NjQoX0FNT1VOVF9TQ0FMRSkKICAgIGRpZyAxCiAgICBpbnRjIDQgLy8gMTAwMAogICAgLwogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo3ODEKICAgIC8vIG5ld19vdXRfbWF0aCA9IHRvX3NjYWxlZChuZXdfb3V0X2FjdHVhbCkgKyBvZmZzZXQKICAgIHVuY292ZXIgOAogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo3ODIKICAgIC8vIG5ld19zdW0gPSBzZWxmLnN1bV94LnZhbHVlICsgdG9fc2NhbGVkKGVmZmVjdGl2ZV9pbikgLSB0b19zY2FsZWQoY2xhaW1lZF9hbW91bnRfb3V0KQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gInN1bV94IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN1bV94IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToyMDgKICAgIC8vIHJldHVybiByYXcgLy8gVUludDY0KF9BTU9VTlRfU0NBTEUpCiAgICB1bmNvdmVyIDkKICAgIGludGMgNCAvLyAxMDAwCiAgICAvCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5Ojc4MgogICAgLy8gbmV3X3N1bSA9IHNlbGYuc3VtX3gudmFsdWUgKyB0b19zY2FsZWQoZWZmZWN0aXZlX2luKSAtIHRvX3NjYWxlZChjbGFpbWVkX2Ftb3VudF9vdXQpCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjIwOAogICAgLy8gcmV0dXJuIHJhdyAvLyBVSW50NjQoX0FNT1VOVF9TQ0FMRSkKICAgIHVuY292ZXIgMTAKICAgIGludGMgNCAvLyAxMDAwCiAgICAvCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5Ojc4MgogICAgLy8gbmV3X3N1bSA9IHNlbGYuc3VtX3gudmFsdWUgKyB0b19zY2FsZWQoZWZmZWN0aXZlX2luKSAtIHRvX3NjYWxlZChjbGFpbWVkX2Ftb3VudF9vdXQpCiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5Ojc4NAogICAgLy8gc2VsZi5zdW1feF9zcS52YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gInN1bV94X3NxIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN1bV94X3NxIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToxODkKICAgIC8vIGhpZ2gsIGxvdyA9IG9wLm11bHcodmFsdWUsIHZhbHVlKQogICAgZGlnIDMKICAgIHVuY292ZXIgNAogICAgbXVsdwogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToxOTAKICAgIC8vIGFzc2VydCBoaWdoID09IFVJbnQ2NCgwKQogICAgc3dhcAogICAgIQogICAgYXNzZXJ0CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5Ojc4NC03ODUKICAgIC8vIHNlbGYuc3VtX3hfc3EudmFsdWUKICAgIC8vICsgc3F1YXJlX3JhdyhuZXdfaW5fbWF0aCkKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6MTg5CiAgICAvLyBoaWdoLCBsb3cgPSBvcC5tdWx3KHZhbHVlLCB2YWx1ZSkKICAgIGRpZyA2CiAgICB1bmNvdmVyIDcKICAgIG11bHcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6MTkwCiAgICAvLyBhc3NlcnQgaGlnaCA9PSBVSW50NjQoMCkKICAgIHN3YXAKICAgICEKICAgIGFzc2VydAogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo3ODQtNzg2CiAgICAvLyBzZWxmLnN1bV94X3NxLnZhbHVlCiAgICAvLyArIHNxdWFyZV9yYXcobmV3X2luX21hdGgpCiAgICAvLyAtIHNxdWFyZV9yYXcob2xkX2luX21hdGgpCiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjE4OQogICAgLy8gaGlnaCwgbG93ID0gb3AubXVsdyh2YWx1ZSwgdmFsdWUpCiAgICBkaWcgMgogICAgdW5jb3ZlciAzCiAgICBtdWx3CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjE5MAogICAgLy8gYXNzZXJ0IGhpZ2ggPT0gVUludDY0KDApCiAgICBzd2FwCiAgICAhCiAgICBhc3NlcnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6Nzg0LTc4NwogICAgLy8gc2VsZi5zdW1feF9zcS52YWx1ZQogICAgLy8gKyBzcXVhcmVfcmF3KG5ld19pbl9tYXRoKQogICAgLy8gLSBzcXVhcmVfcmF3KG9sZF9pbl9tYXRoKQogICAgLy8gKyBzcXVhcmVfcmF3KG5ld19vdXRfbWF0aCkKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6MTg5CiAgICAvLyBoaWdoLCBsb3cgPSBvcC5tdWx3KHZhbHVlLCB2YWx1ZSkKICAgIGRpZyA0CiAgICB1bmNvdmVyIDUKICAgIG11bHcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6MTkwCiAgICAvLyBhc3NlcnQgaGlnaCA9PSBVSW50NjQoMCkKICAgIHN3YXAKICAgICEKICAgIGFzc2VydAogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo3ODQtNzg4CiAgICAvLyBzZWxmLnN1bV94X3NxLnZhbHVlCiAgICAvLyArIHNxdWFyZV9yYXcobmV3X2luX21hdGgpCiAgICAvLyAtIHNxdWFyZV9yYXcob2xkX2luX21hdGgpCiAgICAvLyArIHNxdWFyZV9yYXcobmV3X291dF9tYXRoKQogICAgLy8gLSBzcXVhcmVfcmF3KG9sZF9vdXRfbWF0aCkKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6Nzk0CiAgICAvLyBzZWxmLm4udmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAibiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5uIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo3OTUKICAgIC8vIHNlbGYucl9pbnQudmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAicl9pbnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucl9pbnQgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5Ojc5NgogICAgLy8gc2VsZi5zX2JvdW5kLnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJzX2JvdW5kIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNfYm91bmQgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5Ojc5NwogICAgLy8gc2VsZi5rX2JvdW5kLnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE0IC8vICJrX2JvdW5kIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmtfYm91bmQgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5Ojc5OAogICAgLy8gc2VsZi5zcXJ0X24udmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTcgLy8gInNxcnRfbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zcXJ0X24gZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5Ojc5OQogICAgLy8gc2VsZi5pbnZfc3FydF9uLnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE5IC8vICJpbnZfc3FydF9uIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludl9zcXJ0X24gZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5Ojc5MS04MDAKICAgIC8vIGFzc2VydCB2ZXJpZnlfaW52YXJpYW50KAogICAgLy8gICAgIG5ld19zdW0sCiAgICAvLyAgICAgbmV3X3N1bV9zcSwKICAgIC8vICAgICBzZWxmLm4udmFsdWUsCiAgICAvLyAgICAgc2VsZi5yX2ludC52YWx1ZSwKICAgIC8vICAgICBzZWxmLnNfYm91bmQudmFsdWUsCiAgICAvLyAgICAgc2VsZi5rX2JvdW5kLnZhbHVlLAogICAgLy8gICAgIHNlbGYuc3FydF9uLnZhbHVlLAogICAgLy8gICAgIHNlbGYuaW52X3NxcnRfbi52YWx1ZSwKICAgIC8vICkKICAgIGRpZyA3CiAgICBkaWcgNwogICAgY292ZXIgNwogICAgY292ZXIgNwogICAgY2FsbHN1YiB2ZXJpZnlfaW52YXJpYW50CiAgICBhc3NlcnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6MjE4CiAgICAvLyByZXNlcnZlcy5yZXBsYWNlKHJlc2VydmVfb2Zmc2V0KGluZGV4KSwgb3AuaXRvYih2YWx1ZSkpCiAgICB1bmNvdmVyIDMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6ODAyCiAgICAvLyB3cml0ZV9yZXNlcnZlKHNlbGYucmVzZXJ2ZXMsIHRva2VuX2luX2lkeCwgbmV3X2luX2FjdHVhbCkKICAgIGJ5dGVjXzAgLy8gMHg3MjY1NzM2NTcyNzY2NTczCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjIxOAogICAgLy8gcmVzZXJ2ZXMucmVwbGFjZShyZXNlcnZlX29mZnNldChpbmRleCksIG9wLml0b2IodmFsdWUpKQogICAgdW5jb3ZlciA2CiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6ODAzCiAgICAvLyB3cml0ZV9yZXNlcnZlKHNlbGYucmVzZXJ2ZXMsIHRva2VuX291dF9pZHgsIG5ld19vdXRfYWN0dWFsKQogICAgYnl0ZWNfMCAvLyAweDcyNjU3MzY1NzI3NjY1NzMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6MjE4CiAgICAvLyByZXNlcnZlcy5yZXBsYWNlKHJlc2VydmVfb2Zmc2V0KGluZGV4KSwgb3AuaXRvYih2YWx1ZSkpCiAgICB1bmNvdmVyIDQKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6ODA0CiAgICAvLyBzZWxmLnN1bV94LnZhbHVlID0gbmV3X3N1bQogICAgYnl0ZWMgNiAvLyAic3VtX3giCiAgICB1bmNvdmVyIDIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjgwNQogICAgLy8gc2VsZi5zdW1feF9zcS52YWx1ZSA9IG5ld19zdW1fc3EKICAgIGJ5dGVjIDcgLy8gInN1bV94X3NxIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6ODA3LTgxMAogICAgLy8gIyBBY2N1bXVsYXRlIGZlZSBpbnRvIGZlZV9ncm93dGggKFBSRUNJU0lPTi1zY2FsZWQgcGVyLXIpLgogICAgLy8gIyBUaGUgZmVlIHN0YXlzIGluIHRoZSBjb250cmFjdCdzIEFTQSBiYWxhbmNlOyBvbmx5IHRoZSBncm93dGggcmF0ZQogICAgLy8gIyBpcyByZWNvcmRlZCBoZXJlLiAgSWYgdG90YWxfciA9PSAwIChubyBMUHMpLCBmZWUgYmVjb21lcyBwcm90b2NvbCBkdXN0LgogICAgLy8gaWYgZmVlID4gVUludDY0KDApOgogICAgYnogc3dhcF9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6ODExCiAgICAvLyB0b3RhbF9yID0gc2VsZi50b3RhbF9yLnZhbHVlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOSAvLyAidG90YWxfciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgNwogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfciBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6ODEyCiAgICAvLyBpZiB0b3RhbF9yID4gVUludDY0KDApOgogICAgYnogc3dhcF9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6MTgyCiAgICAvLyBoaWdoLCBsb3cgPSBvcC5tdWx3KGxocywgcmhzKQogICAgZGlnIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6ODEzCiAgICAvLyBmZ19pbmNyZW1lbnQgPSBtdWxfZGl2X2Zsb29yKGZlZSwgVUludDY0KF9QUkVDSVNJT04pLCB0b3RhbF9yKQogICAgaW50Y18zIC8vIDEwMDAwMDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6MTgyCiAgICAvLyBoaWdoLCBsb3cgPSBvcC5tdWx3KGxocywgcmhzKQogICAgbXVsdwogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToxODMKICAgIC8vIHJldHVybiBvcC5kaXZ3KGhpZ2gsIGxvdywgZGVub21pbmF0b3IpCiAgICBkaWcgNgogICAgZGl2dwogICAgZHVwCiAgICBidXJ5IDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6ODE0CiAgICAvLyBpZiBmZ19pbmNyZW1lbnQgPiBVSW50NjQoMCk6CiAgICBieiBzd2FwX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo4MTUKICAgIC8vIG9sZF9mZyA9IHJlYWRfZmVlX2dyb3d0aChzZWxmLmZlZV9ncm93dGgsIHRva2VuX2luX2lkeCkKICAgIGJ5dGVjXzMgLy8gMHg2NjY1NjU1ZjY3NzI2Zjc3NzQ2OAogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToyMjMKICAgIC8vIHJldHVybiBvcC5leHRyYWN0X3VpbnQ2NChmZWVfZ3Jvd3RoLmV4dHJhY3QocmVzZXJ2ZV9vZmZzZXQoaW5kZXgpLCBVSW50NjQoOCkpLCAwKQogICAgZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18xIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6ODE2CiAgICAvLyB3cml0ZV9mZWVfZ3Jvd3RoKHNlbGYuZmVlX2dyb3d0aCwgdG9rZW5faW5faWR4LCBvbGRfZmcgKyBmZ19pbmNyZW1lbnQpCiAgICBkaWcgNwogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToyMjgKICAgIC8vIGZlZV9ncm93dGgucmVwbGFjZShyZXNlcnZlX29mZnNldChpbmRleCksIG9wLml0b2IodmFsdWUpKQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo4MTYKICAgIC8vIHdyaXRlX2ZlZV9ncm93dGgoc2VsZi5mZWVfZ3Jvd3RoLCB0b2tlbl9pbl9pZHgsIG9sZF9mZyArIGZnX2luY3JlbWVudCkKICAgIGJ5dGVjXzMgLy8gMHg2NjY1NjU1ZjY3NzI2Zjc3NzQ2OAogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToyMjgKICAgIC8vIGZlZV9ncm93dGgucmVwbGFjZShyZXNlcnZlX29mZnNldChpbmRleCksIG9wLml0b2IodmFsdWUpKQogICAgY292ZXIgMgogICAgYm94X3JlcGxhY2UKCnN3YXBfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo4MTgKICAgIC8vIGlmIGNsYWltZWRfYW1vdW50X291dCA+IFVJbnQ2NCgwKToKICAgIGRpZyAzCiAgICBieiBzd2FwX2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo4MTkKICAgIC8vIHNlbmRfdG9rZW5zKHRva2VuX291dF9hc3NldCwgVHhuLnNlbmRlciwgY2xhaW1lZF9hbW91bnRfb3V0KQogICAgZGlnIDIKICAgIHR4biBTZW5kZXIKICAgIGRpZyA1CiAgICBjYWxsc3ViIHNlbmRfdG9rZW5zCgpzd2FwX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6NzM4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMiAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMub3JiaXRhbF9wb29sLmNvbnRyYWN0Lk9yYml0YWxQb29sLnN3YXBfd2l0aF9jcm9zc2luZ3Nbcm91dGluZ10oKSAtPiB2b2lkOgpzd2FwX3dpdGhfY3Jvc3NpbmdzOgogICAgaW50Y18wIC8vIDAKICAgIGR1cG4gMwogICAgcHVzaGJ5dGVzICIiCiAgICBkdXBuIDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6ODIxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHB1c2hpbnQgMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA1CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICBjb3ZlciA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5Ojg1MQogICAgLy8gYXNzZXJ0IHNlbGYucGF1c2VkLnZhbHVlID09IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gInBhdXNlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wYXVzZWQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6ODUyCiAgICAvLyBhc3NlcnQgc2VsZi5ib290c3RyYXBwZWQudmFsdWUgPT0gVUludDY0KDEpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiYm9vdHN0cmFwcGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmJvb3RzdHJhcHBlZCBleGlzdHMKICAgIGludGNfMiAvLyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5Ojg1MwogICAgLy8gYXNzZXJ0IHNlbGYucmVnaXN0ZXJlZF90b2tlbnMudmFsdWUgPT0gc2VsZi5uLnZhbHVlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTIgLy8gInJlZ2lzdGVyZWRfdG9rZW5zIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlZ2lzdGVyZWRfdG9rZW5zIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gIm4iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubiBleGlzdHMKICAgIHN3YXAKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5Ojg1NAogICAgLy8gYXNzZXJ0IHRva2VuX2luX2lkeCAhPSB0b2tlbl9vdXRfaWR4CiAgICBkaWcgNAogICAgZGlnIDQKICAgICE9CiAgICBhc3NlcnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6ODU1CiAgICAvLyBhc3NlcnQgdG9rZW5faW5faWR4IDwgc2VsZi5uLnZhbHVlCiAgICBkaWcgNAogICAgZGlnIDEKICAgIDwKICAgIGFzc2VydAogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo4NTYKICAgIC8vIGFzc2VydCB0b2tlbl9vdXRfaWR4IDwgc2VsZi5uLnZhbHVlCiAgICBkaWcgMwogICAgPgogICAgYXNzZXJ0CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5Ojg1OAogICAgLy8gdG9rZW5faW5fYXNzZXQgPSBzZWxmLnRva2Vuc1t0b2tlbl9pbl9pZHhdCiAgICBkaWcgMwogICAgaXRvYgogICAgYnl0ZWMgMTAgLy8gMHg3NDZmNmI2NTZlM2EKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG9rZW5zIGVudHJ5IGV4aXN0cwogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo4NTkKICAgIC8vIHRva2VuX291dF9hc3NldCA9IHNlbGYudG9rZW5zW3Rva2VuX291dF9pZHhdCiAgICBkaWcgMwogICAgaXRvYgogICAgYnl0ZWMgMTAgLy8gMHg3NDZmNmI2NTZlM2EKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG9rZW5zIGVudHJ5IGV4aXN0cwogICAgYnRvaQogICAgY292ZXIgNQogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo4NjAKICAgIC8vIHZlcmlmeV9wcmVjZWRpbmdfdHJhbnNmZXIodG9rZW5faW5fYXNzZXQsIHRvdGFsX2Ftb3VudF9pbikKICAgIGRpZyAyCiAgICBjYWxsc3ViIHZlcmlmeV9wcmVjZWRpbmdfdHJhbnNmZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6ODYyCiAgICAvLyBmZWUgPSBtdWxfZGl2X2Zsb29yKHRvdGFsX2Ftb3VudF9pbiwgc2VsZi5mZWVfYnBzLnZhbHVlLCBVSW50NjQoX0ZFRV9ERU5PTUlOQVRPUikpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTggLy8gImZlZV9icHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZmVlX2JwcyBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6MTgyCiAgICAvLyBoaWdoLCBsb3cgPSBvcC5tdWx3KGxocywgcmhzKQogICAgZGlnIDIKICAgIG11bHcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6ODYyCiAgICAvLyBmZWUgPSBtdWxfZGl2X2Zsb29yKHRvdGFsX2Ftb3VudF9pbiwgc2VsZi5mZWVfYnBzLnZhbHVlLCBVSW50NjQoX0ZFRV9ERU5PTUlOQVRPUikpCiAgICBpbnRjIDUgLy8gMTAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6MTgzCiAgICAvLyByZXR1cm4gb3AuZGl2dyhoaWdoLCBsb3csIGRlbm9taW5hdG9yKQogICAgZGl2dwogICAgZHVwCiAgICBjb3ZlciA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5Ojg2MwogICAgLy8gZWZmZWN0aXZlX3RvdGFsX2luID0gdG90YWxfYW1vdW50X2luIC0gZmVlCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIC0KICAgIGNvdmVyIDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6ODY1CiAgICAvLyByZWNpcGVfYnl0ZXMgPSB0cmFkZV9yZWNpcGUubmF0aXZlCiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICBjb3ZlciAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5Ojg2NgogICAgLy8gYXNzZXJ0IHJlY2lwZV9ieXRlcy5sZW5ndGggPiBVSW50NjQoMCkKICAgIGxlbgogICAgZHVwCiAgICBhc3NlcnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6ODY3CiAgICAvLyBhc3NlcnQgcmVjaXBlX2J5dGVzLmxlbmd0aCAlIFVJbnQ2NChfU0VHTUVOVF9TSVpFKSA9PSBVSW50NjQoMCkKICAgIGR1cAogICAgcHVzaGludCAyNQogICAgJQogICAgIQogICAgYXNzZXJ0CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5Ojg2OAogICAgLy8gbnVtX3NlZ21lbnRzID0gcmVjaXBlX2J5dGVzLmxlbmd0aCAvLyBVSW50NjQoX1NFR01FTlRfU0laRSkKICAgIHB1c2hpbnQgMjUKICAgIC8KICAgIGNvdmVyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6ODcwCiAgICAvLyBuID0gc2VsZi5uLnZhbHVlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAibiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBjb3ZlciAzCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5uIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo4NzEKICAgIC8vIHNxcnRfbiA9IHNlbGYuc3FydF9uLnZhbHVlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTcgLy8gInNxcnRfbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBjb3ZlciAzCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zcXJ0X24gZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5Ojg3MgogICAgLy8gaW52X3NxcnRfbiA9IHNlbGYuaW52X3NxcnRfbi52YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE5IC8vICJpbnZfc3FydF9uIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGNvdmVyIDMKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmludl9zcXJ0X24gZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5Ojg3MwogICAgLy8gb2Zmc2V0ID0gc2VsZi52aXJ0dWFsX29mZnNldC52YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDggLy8gInZpcnR1YWxfb2Zmc2V0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGNvdmVyIDMKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnZpcnR1YWxfb2Zmc2V0IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo4NzUKICAgIC8vIGN1cl9yX2ludCA9IHNlbGYucl9pbnQudmFsdWUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJyX2ludCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBjb3ZlciAzCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yX2ludCBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6ODc2CiAgICAvLyBjdXJfc19ib3VuZCA9IHNlbGYuc19ib3VuZC52YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJzX2JvdW5kIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGNvdmVyIDMKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNfYm91bmQgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5Ojg3NwogICAgLy8gY3VyX2tfYm91bmQgPSBzZWxmLmtfYm91bmQudmFsdWUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNCAvLyAia19ib3VuZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBjb3ZlciAzCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5rX2JvdW5kIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToxNzYKICAgIC8vIHJldHVybiBpbmRleCAqIFVJbnQ2NCg4KQogICAgc3dhcAogICAgaW50Y18xIC8vIDgKICAgICoKICAgIGR1cAogICAgY292ZXIgMgogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo4NzkKICAgIC8vIHJ1bm5pbmdfaW5fYWN0dWFsID0gcmVhZF9yZXNlcnZlKHNlbGYucmVzZXJ2ZXMsIHRva2VuX2luX2lkeCkKICAgIGJ5dGVjXzAgLy8gMHg3MjY1NzM2NTcyNzY2NTczCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjIxMwogICAgLy8gcmV0dXJuIG9wLmV4dHJhY3RfdWludDY0KHJlc2VydmVzLmV4dHJhY3QocmVzZXJ2ZV9vZmZzZXQoaW5kZXgpLCBVSW50NjQoOCkpLCAwKQogICAgc3dhcAogICAgaW50Y18xIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIHN3YXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6MTc2CiAgICAvLyByZXR1cm4gaW5kZXggKiBVSW50NjQoOCkKICAgIGludGNfMSAvLyA4CiAgICAqCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6ODgwCiAgICAvLyBydW5uaW5nX291dF9hY3R1YWwgPSByZWFkX3Jlc2VydmUoc2VsZi5yZXNlcnZlcywgdG9rZW5fb3V0X2lkeCkKICAgIGJ5dGVjXzAgLy8gMHg3MjY1NzM2NTcyNzY2NTczCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjIxMwogICAgLy8gcmV0dXJuIG9wLmV4dHJhY3RfdWludDY0KHJlc2VydmVzLmV4dHJhY3QocmVzZXJ2ZV9vZmZzZXQoaW5kZXgpLCBVSW50NjQoOCkpLCAwKQogICAgc3dhcAogICAgaW50Y18xIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6ODgxCiAgICAvLyBydW5uaW5nX3N1bSA9IHNlbGYuc3VtX3gudmFsdWUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJzdW1feCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdW1feCBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6ODgyCiAgICAvLyBydW5uaW5nX3N1bV9zcSA9IHNlbGYuc3VtX3hfc3EudmFsdWUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJzdW1feF9zcSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdW1feF9zcSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6ODg0CiAgICAvLyB0b3RhbF9zZWdfaW4gPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5Ojg4NQogICAgLy8gdG90YWxfc2VnX291dCA9IFVJbnQ2NCgwKQogICAgZHVwbiAyCgpzd2FwX3dpdGhfY3Jvc3NpbmdzX2Zvcl9oZWFkZXJAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6ODg3CiAgICAvLyBmb3Igc2VnX2lkeCBpbiB1cmFuZ2UobnVtX3NlZ21lbnRzKToKICAgIGR1cAogICAgZGlnIDE3CiAgICA8CiAgICBieiBzd2FwX3dpdGhfY3Jvc3NpbmdzX2FmdGVyX2ZvckAxMgogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo4ODgKICAgIC8vIHNlZ19vZmYgPSBzZWdfaWR4ICogVUludDY0KF9TRUdNRU5UX1NJWkUpCiAgICBkdXAKICAgIHB1c2hpbnQgMjUKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6ODg5CiAgICAvLyBzZWdfaW4gPSBvcC5leHRyYWN0X3VpbnQ2NChyZWNpcGVfYnl0ZXMsIHNlZ19vZmYpCiAgICBkaWcgMTgKICAgIGR1cAogICAgY292ZXIgMgogICAgZGlnIDEKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5Ojg5MAogICAgLy8gc2VnX291dCA9IG9wLmV4dHJhY3RfdWludDY0KHJlY2lwZV9ieXRlcywgc2VnX29mZiArIFVJbnQ2NCg4KSkKICAgIGRpZyAxCiAgICBpbnRjXzEgLy8gOAogICAgKwogICAgZGlnIDMKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGNvdmVyIDQKICAgIGJ1cnkgMzEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6ODkxCiAgICAvLyBzZWdfdGlja19pZCA9IG9wLmV4dHJhY3RfdWludDY0KHJlY2lwZV9ieXRlcywgc2VnX29mZiArIFVJbnQ2NCgxNikpCiAgICBkaWcgMQogICAgcHVzaGludCAxNgogICAgKwogICAgZGlnIDMKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGNvdmVyIDUKICAgIGJ1cnkgMzEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6ODkyCiAgICAvLyBzZWdfbmV3X3N0YXRlID0gb3AuZ2V0Ynl0ZShyZWNpcGVfYnl0ZXMsIHNlZ19vZmYgKyBVSW50NjQoMjQpKQogICAgc3dhcAogICAgcHVzaGludCAyNAogICAgKwogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICBnZXRieXRlCiAgICBidXJ5IDMxCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5Ojg5NAogICAgLy8gYXNzZXJ0IHNlZ19pbiA+IFVJbnQ2NCgwKQogICAgZHVwCiAgICBhc3NlcnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6ODk1CiAgICAvLyB0b3RhbF9zZWdfaW4gKz0gc2VnX2luCiAgICBkaWcgNQogICAgZGlnIDEKICAgICsKICAgIGR1cAogICAgYnVyeSA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5Ojg5NgogICAgLy8gYXNzZXJ0IHRvdGFsX3NlZ19pbiA8PSBlZmZlY3RpdmVfdG90YWxfaW4KICAgIGRpZyAyMgogICAgPD0KICAgIGFzc2VydAogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToyMDgKICAgIC8vIHJldHVybiByYXcgLy8gVUludDY0KF9BTU9VTlRfU0NBTEUpCiAgICBkaWcgMTAKICAgIGR1cAogICAgaW50YyA0IC8vIDEwMDAKICAgIC8KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6ODk4CiAgICAvLyBwcmV2X2luX21hdGggPSB0b19zY2FsZWQocnVubmluZ19pbl9hY3R1YWwpICsgb2Zmc2V0CiAgICBkaWcgMTcKICAgIGR1cAogICAgY292ZXIgMgogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToyMDgKICAgIC8vIHJldHVybiByYXcgLy8gVUludDY0KF9BTU9VTlRfU0NBTEUpCiAgICBkaWcgMTEKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50YyA0IC8vIDEwMDAKICAgIC8KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6ODk5CiAgICAvLyBwcmV2X291dF9tYXRoID0gdG9fc2NhbGVkKHJ1bm5pbmdfb3V0X2FjdHVhbCkgKyBvZmZzZXQKICAgIGRpZyAzCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjkwMAogICAgLy8gYXNzZXJ0IHNlZ19vdXQgPD0gcnVubmluZ19vdXRfYWN0dWFsCiAgICBkaWcgNgogICAgZGlnIDMKICAgIDw9CiAgICBhc3NlcnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6OTAyCiAgICAvLyBydW5uaW5nX2luX2FjdHVhbCArPSBzZWdfaW4KICAgIHVuY292ZXIgNAogICAgZGlnIDUKICAgICsKICAgIGR1cAogICAgYnVyeSAxNgogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo5MDMKICAgIC8vIHJ1bm5pbmdfb3V0X2FjdHVhbCAtPSBzZWdfb3V0CiAgICB1bmNvdmVyIDMKICAgIGRpZyA2CiAgICAtCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgMTQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6MjA4CiAgICAvLyByZXR1cm4gcmF3IC8vIFVJbnQ2NChfQU1PVU5UX1NDQUxFKQogICAgaW50YyA0IC8vIDEwMDAKICAgIC8KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6OTA0CiAgICAvLyBuZXdfaW5fbWF0aCA9IHRvX3NjYWxlZChydW5uaW5nX2luX2FjdHVhbCkgKyBvZmZzZXQKICAgIGRpZyA0CiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjIwOAogICAgLy8gcmV0dXJuIHJhdyAvLyBVSW50NjQoX0FNT1VOVF9TQ0FMRSkKICAgIHN3YXAKICAgIGludGMgNCAvLyAxMDAwCiAgICAvCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjkwNQogICAgLy8gbmV3X291dF9tYXRoID0gdG9fc2NhbGVkKHJ1bm5pbmdfb3V0X2FjdHVhbCkgKyBvZmZzZXQKICAgIHVuY292ZXIgNAogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToyMDgKICAgIC8vIHJldHVybiByYXcgLy8gVUludDY0KF9BTU9VTlRfU0NBTEUpCiAgICB1bmNvdmVyIDQKICAgIGludGMgNCAvLyAxMDAwCiAgICAvCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjkwNwogICAgLy8gcnVubmluZ19zdW0gPSBydW5uaW5nX3N1bSArIHRvX3NjYWxlZChzZWdfaW4pIC0gdG9fc2NhbGVkKHNlZ19vdXQpCiAgICBkaWcgMTEKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6MjA4CiAgICAvLyByZXR1cm4gcmF3IC8vIFVJbnQ2NChfQU1PVU5UX1NDQUxFKQogICAgdW5jb3ZlciA1CiAgICBpbnRjIDQgLy8gMTAwMAogICAgLwogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo5MDcKICAgIC8vIHJ1bm5pbmdfc3VtID0gcnVubmluZ19zdW0gKyB0b19zY2FsZWQoc2VnX2luKSAtIHRvX3NjYWxlZChzZWdfb3V0KQogICAgLQogICAgYnVyeSAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToxODkKICAgIC8vIGhpZ2gsIGxvdyA9IG9wLm11bHcodmFsdWUsIHZhbHVlKQogICAgZGlnIDEKICAgIHVuY292ZXIgMgogICAgbXVsdwogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToxOTAKICAgIC8vIGFzc2VydCBoaWdoID09IFVJbnQ2NCgwKQogICAgc3dhcAogICAgIQogICAgYXNzZXJ0CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjkwOS05MTAKICAgIC8vIHJ1bm5pbmdfc3VtX3NxCiAgICAvLyArIHNxdWFyZV9yYXcobmV3X2luX21hdGgpIC0gc3F1YXJlX3JhdyhwcmV2X2luX21hdGgpCiAgICBkaWcgOAogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToxODkKICAgIC8vIGhpZ2gsIGxvdyA9IG9wLm11bHcodmFsdWUsIHZhbHVlKQogICAgZGlnIDMKICAgIHVuY292ZXIgNAogICAgbXVsdwogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToxOTAKICAgIC8vIGFzc2VydCBoaWdoID09IFVJbnQ2NCgwKQogICAgc3dhcAogICAgIQogICAgYXNzZXJ0CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjkwOS05MTAKICAgIC8vIHJ1bm5pbmdfc3VtX3NxCiAgICAvLyArIHNxdWFyZV9yYXcobmV3X2luX21hdGgpIC0gc3F1YXJlX3JhdyhwcmV2X2luX21hdGgpCiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjE4OQogICAgLy8gaGlnaCwgbG93ID0gb3AubXVsdyh2YWx1ZSwgdmFsdWUpCiAgICBkaWcgMQogICAgdW5jb3ZlciAyCiAgICBtdWx3CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjE5MAogICAgLy8gYXNzZXJ0IGhpZ2ggPT0gVUludDY0KDApCiAgICBzd2FwCiAgICAhCiAgICBhc3NlcnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6OTA5LTkxMQogICAgLy8gcnVubmluZ19zdW1fc3EKICAgIC8vICsgc3F1YXJlX3JhdyhuZXdfaW5fbWF0aCkgLSBzcXVhcmVfcmF3KHByZXZfaW5fbWF0aCkKICAgIC8vICsgc3F1YXJlX3JhdyhuZXdfb3V0X21hdGgpIC0gc3F1YXJlX3JhdyhwcmV2X291dF9tYXRoKQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToxODkKICAgIC8vIGhpZ2gsIGxvdyA9IG9wLm11bHcodmFsdWUsIHZhbHVlKQogICAgZGlnIDEKICAgIHVuY292ZXIgMgogICAgbXVsdwogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToxOTAKICAgIC8vIGFzc2VydCBoaWdoID09IFVJbnQ2NCgwKQogICAgc3dhcAogICAgIQogICAgYXNzZXJ0CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjkwOS05MTEKICAgIC8vIHJ1bm5pbmdfc3VtX3NxCiAgICAvLyArIHNxdWFyZV9yYXcobmV3X2luX21hdGgpIC0gc3F1YXJlX3JhdyhwcmV2X2luX21hdGgpCiAgICAvLyArIHNxdWFyZV9yYXcobmV3X291dF9tYXRoKSAtIHNxdWFyZV9yYXcocHJldl9vdXRfbWF0aCkKICAgIC0KICAgIGJ1cnkgNQogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo5MTQtOTE1CiAgICAvLyAjIEhhbmRsZSBjbGFpbWVkIHRpY2sgY3Jvc3NpbmcgaW4gdGhpcyBzZWdtZW50LgogICAgLy8gaWYgc2VnX3RpY2tfaWQgIT0gVUludDY0KF9OT19DUk9TU0lORyk6CiAgICBwdXNoaW50IDE4NDQ2NzQ0MDczNzA5NTUxNjE1CiAgICAhPQogICAgYnogc3dhcF93aXRoX2Nyb3NzaW5nc19hZnRlcl9pZl9lbHNlQDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjkxNgogICAgLy8gYXNzZXJ0IHNlZ190aWNrX2lkIDwgc2VsZi5udW1fdGlja3MudmFsdWUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNiAvLyAibnVtX3RpY2tzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm51bV90aWNrcyBleGlzdHMKICAgIGRpZyAyNgogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIDwKICAgIGFzc2VydAogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo5MTcKICAgIC8vIGFzc2VydCBzZWdfdGlja19pZCBpbiBzZWxmLnRpY2tzCiAgICBpdG9iCiAgICBieXRlYyAxNSAvLyAweDc0Njk2MzZiM2EKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBidXJ5IDMyCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjkxOAogICAgLy8geHRpY2sgPSBzZWxmLnRpY2tzW3NlZ190aWNrX2lkXS5jb3B5KCkKICAgIGJveF9nZXQKICAgIHBvcAogICAgZHVwCiAgICBidXJ5IDMxCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjkxOQogICAgLy8geHRpY2tfciA9IHh0aWNrLnIuYXNfdWludDY0KCkKICAgIGR1cAogICAgZXh0cmFjdCAwIDgKICAgIGJ1cnkgMzQKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBidXJ5IDI0CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjkyMAogICAgLy8geHRpY2tfayA9IHh0aWNrLmsuYXNfdWludDY0KCkKICAgIGR1cAogICAgZXh0cmFjdCA4IDgKICAgIGJ1cnkgMzMKICAgIGR1cAogICAgaW50Y18xIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBidXJ5IDI1CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjkyMQogICAgLy8geHRpY2tfb2xkX3N0YXRlID0geHRpY2suc3RhdGUuYXNfdWludDY0KCkKICAgIHB1c2hpbnQgMTYKICAgIGdldGJ5dGUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6OTIzCiAgICAvLyBpZiBzZWdfbmV3X3N0YXRlID09IFVJbnQ2NCgxKToKICAgIGRpZyAyOAogICAgaW50Y18yIC8vIDEKICAgID09CiAgICBieiBzd2FwX3dpdGhfY3Jvc3NpbmdzX2Vsc2VfYm9keUA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjkyNC05MjUKICAgIC8vICMgSU5URVJJT1Ig4oaSIEJPVU5EQVJZIGNyb3NzaW5nLgogICAgLy8gYXNzZXJ0IHh0aWNrX29sZF9zdGF0ZSA9PSBVSW50NjQoMCkKICAgICEKICAgIGFzc2VydAogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo5MjYKICAgIC8vIGN1cl9yX2ludCAtPSB4dGlja19yCiAgICBkaWcgMTEKICAgIGRpZyAyMwogICAgZHVwCiAgICBjb3ZlciAyCiAgICAtCiAgICBidXJ5IDEzCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjkyNwogICAgLy8gY3VyX3NfYm91bmQgKz0gYm91bmRhcnlfcmFkaXVzX2NhbGMoeHRpY2tfciwgeHRpY2tfaywgc3FydF9uKQogICAgZGlnIDI0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGRpZyAxNwogICAgY2FsbHN1YiBib3VuZGFyeV9yYWRpdXNfY2FsYwogICAgZGlnIDEyCiAgICArCiAgICBidXJ5IDEyCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjkyOAogICAgLy8gY3VyX2tfYm91bmQgKz0geHRpY2tfawogICAgZGlnIDEwCiAgICArCiAgICBidXJ5IDEwCgpzd2FwX3dpdGhfY3Jvc3NpbmdzX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6OTQxCiAgICAvLyBzdGF0ZT1hcmM0LlVJbnQ4KHNlZ19uZXdfc3RhdGUpLAogICAgZGlnIDI3CiAgICBpdG9iCiAgICBkdXAKICAgIGJpdGxlbgogICAgaW50Y18xIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGV4dHJhY3QgNyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5Ojk0MgogICAgLy8gdG90YWxfc2hhcmVzPXh0aWNrLnRvdGFsX3NoYXJlcywKICAgIGRpZyAzMAogICAgZXh0cmFjdCAxNyA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjkzNy05NDMKICAgIC8vICMgUGVyc2lzdCB1cGRhdGVkIHRpY2sgc3RhdGUgKHRvdGFsX3NoYXJlcyB1bmNoYW5nZWQgYnkgY3Jvc3NpbmcpLgogICAgLy8gc2VsZi50aWNrc1tzZWdfdGlja19pZF0gPSBUaWNrRGF0YSgKICAgIC8vICAgICByPXh0aWNrLnIsCiAgICAvLyAgICAgaz14dGljay5rLAogICAgLy8gICAgIHN0YXRlPWFyYzQuVUludDgoc2VnX25ld19zdGF0ZSksCiAgICAvLyAgICAgdG90YWxfc2hhcmVzPXh0aWNrLnRvdGFsX3NoYXJlcywKICAgIC8vICkKICAgIGRpZyAzNAogICAgZGlnIDM0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGRpZyAzMQogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo5NDUtOTQ3CiAgICAvLyAjIEJvdW5kYXJ5IHByb3hpbWl0eSBjaGVjazogzrFfaW50X25vcm0g4omIIGsvciBhdCB0aGUgY3Jvc3NpbmcuCiAgICAvLyAjIE9ubHkgbWVhbmluZ2Z1bCB3aGVuIGludGVyaW9yIHRpY2tzIHN0aWxsIGV4aXN0IGFmdGVyIHRyYW5zaXRpb24uCiAgICAvLyBpZiBjdXJfcl9pbnQgPiBVSW50NjQoMCk6CiAgICBkaWcgMTEKICAgIGJ6IHN3YXBfd2l0aF9jcm9zc2luZ3NfYWZ0ZXJfaWZfZWxzZUAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToxODIKICAgIC8vIGhpZ2gsIGxvdyA9IG9wLm11bHcobGhzLCByaHMpCiAgICBkaWcgNAogICAgZGlnIDE0CiAgICBtdWx3CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5Ojk0OAogICAgLy8gYWxwaGFfdG90YWxfdmFsID0gbXVsX2Rpdl9mbG9vcihydW5uaW5nX3N1bSwgaW52X3NxcnRfbiwgVUludDY0KF9QUkVDSVNJT04pKQogICAgaW50Y18zIC8vIDEwMDAwMDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6MTgzCiAgICAvLyByZXR1cm4gb3AuZGl2dyhoaWdoLCBsb3csIGRlbm9taW5hdG9yKQogICAgZGl2dwogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo5NDkKICAgIC8vIGFzc2VydCBhbHBoYV90b3RhbF92YWwgPj0gY3VyX2tfYm91bmQKICAgIGR1cAogICAgZGlnIDExCiAgICBkdXAKICAgIGNvdmVyIDMKICAgID49CiAgICBhc3NlcnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6OTUwCiAgICAvLyBhbHBoYV9pbnQgPSBhbHBoYV90b3RhbF92YWwgLSBjdXJfa19ib3VuZAogICAgc3dhcAogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo5NTEKICAgIC8vIGFscGhhX2ludF9ub3JtID0gbXVsX2Rpdl9mbG9vcihhbHBoYV9pbnQsIFVJbnQ2NChfUFJFQ0lTSU9OKSwgY3VyX3JfaW50KQogICAgaW50Y18zIC8vIDEwMDAwMDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6MTgyCiAgICAvLyBoaWdoLCBsb3cgPSBvcC5tdWx3KGxocywgcmhzKQogICAgbXVsdwogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToxODMKICAgIC8vIHJldHVybiBvcC5kaXZ3KGhpZ2gsIGxvdywgZGVub21pbmF0b3IpCiAgICBkaWcgMTMKICAgIGRpdncKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6MTgyCiAgICAvLyBoaWdoLCBsb3cgPSBvcC5tdWx3KGxocywgcmhzKQogICAgZGlnIDI0CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5Ojk1MgogICAgLy8ga19ub3JtID0gbXVsX2Rpdl9mbG9vcih4dGlja19rLCBVSW50NjQoX1BSRUNJU0lPTiksIHh0aWNrX3IpCiAgICBpbnRjXzMgLy8gMTAwMDAwMDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToxODIKICAgIC8vIGhpZ2gsIGxvdyA9IG9wLm11bHcobGhzLCByaHMpCiAgICBtdWx3CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjE4MwogICAgLy8gcmV0dXJuIG9wLmRpdncoaGlnaCwgbG93LCBkZW5vbWluYXRvcikKICAgIGRpZyAyNQogICAgZGl2dwogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo5NTMKICAgIC8vIGFzc2VydCBhYnNfZGlmZihhbHBoYV9pbnRfbm9ybSwga19ub3JtKSA8PSBVSW50NjQoX0NST1NTSU5HX1RPTEVSQU5DRSkKICAgIGNhbGxzdWIgYWJzX2RpZmYKICAgIGludGMgNSAvLyAxMDAwMAogICAgPD0KICAgIGFzc2VydAoKc3dhcF93aXRoX2Nyb3NzaW5nc19hZnRlcl9pZl9lbHNlQDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo5NTUtOTY1CiAgICAvLyAjIFZlcmlmeSB0b3J1cyBpbnZhcmlhbnQgYWZ0ZXIgZWFjaCBzZWdtZW50LgogICAgLy8gYXNzZXJ0IHZlcmlmeV9pbnZhcmlhbnQoCiAgICAvLyAgICAgcnVubmluZ19zdW0sCiAgICAvLyAgICAgcnVubmluZ19zdW1fc3EsCiAgICAvLyAgICAgbiwKICAgIC8vICAgICBjdXJfcl9pbnQsCiAgICAvLyAgICAgY3VyX3NfYm91bmQsCiAgICAvLyAgICAgY3VyX2tfYm91bmQsCiAgICAvLyAgICAgc3FydF9uLAogICAgLy8gICAgIGludl9zcXJ0X24sCiAgICAvLyApCiAgICBkaWcgNAogICAgZGlnIDQKICAgIGRpZyAxNwogICAgZGlnIDE0CiAgICBkaWcgMTQKICAgIGRpZyAxNAogICAgZGlnIDIwCiAgICBkaWcgMjAKICAgIGNhbGxzdWIgdmVyaWZ5X2ludmFyaWFudAogICAgYXNzZXJ0CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5Ojk2NwogICAgLy8gdG90YWxfc2VnX291dCArPSBzZWdfb3V0CiAgICBkaWcgMQogICAgZGlnIDI3CiAgICArCiAgICBidXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6ODg3CiAgICAvLyBmb3Igc2VnX2lkeCBpbiB1cmFuZ2UobnVtX3NlZ21lbnRzKToKICAgIGR1cAogICAgaW50Y18yIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiBzd2FwX3dpdGhfY3Jvc3NpbmdzX2Zvcl9oZWFkZXJAMgoKc3dhcF93aXRoX2Nyb3NzaW5nc19lbHNlX2JvZHlANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6OTMwLTkzMQogICAgLy8gIyBCT1VOREFSWSDihpIgSU5URVJJT1IgY3Jvc3NpbmcuCiAgICAvLyBhc3NlcnQgeHRpY2tfb2xkX3N0YXRlID09IFVJbnQ2NCgxKQogICAgaW50Y18yIC8vIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6OTMyCiAgICAvLyBzX2NvbnRyaWIgPSBib3VuZGFyeV9yYWRpdXNfY2FsYyh4dGlja19yLCB4dGlja19rLCBzcXJ0X24pCiAgICBkaWcgMjIKICAgIGR1cAogICAgZGlnIDI1CiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGRpZyAxOAogICAgY2FsbHN1YiBib3VuZGFyeV9yYWRpdXNfY2FsYwogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo5MzMKICAgIC8vIGN1cl9yX2ludCArPSB4dGlja19yCiAgICBkaWcgMTQKICAgIHVuY292ZXIgMgogICAgKwogICAgYnVyeSAxNAogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo5MzQKICAgIC8vIGN1cl9zX2JvdW5kIC09IHNfY29udHJpYgogICAgZGlnIDEyCiAgICBzd2FwCiAgICAtCiAgICBidXJ5IDEyCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjkzNQogICAgLy8gY3VyX2tfYm91bmQgLT0geHRpY2tfawogICAgZGlnIDEwCiAgICBzd2FwCiAgICAtCiAgICBidXJ5IDEwCiAgICBiIHN3YXBfd2l0aF9jcm9zc2luZ3NfYWZ0ZXJfaWZfZWxzZUA3Cgpzd2FwX3dpdGhfY3Jvc3NpbmdzX2FmdGVyX2ZvckAxMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6OTY5LTk3MAogICAgLy8gIyBBbGwgc2VnbWVudHMgcHJvY2Vzc2VkIOKAlCB2ZXJpZnkgdG90YWxzLgogICAgLy8gYXNzZXJ0IHRvdGFsX3NlZ19pbiA9PSBlZmZlY3RpdmVfdG90YWxfaW4KICAgIGRpZyAyCiAgICBkaWcgMTkKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6OTcxCiAgICAvLyBhc3NlcnQgdG90YWxfc2VnX291dCA+PSBtaW5fYW1vdW50X291dAogICAgZGlnIDEKICAgIGRpZyAyMgogICAgPj0KICAgIGFzc2VydAogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToyMTgKICAgIC8vIHJlc2VydmVzLnJlcGxhY2UocmVzZXJ2ZV9vZmZzZXQoaW5kZXgpLCBvcC5pdG9iKHZhbHVlKSkKICAgIGRpZyA3CiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5Ojk3My05NzQKICAgIC8vICMgUGVyc2lzdCBmaW5hbCBzdGF0ZS4KICAgIC8vIHdyaXRlX3Jlc2VydmUoc2VsZi5yZXNlcnZlcywgdG9rZW5faW5faWR4LCBydW5uaW5nX2luX2FjdHVhbCkKICAgIGJ5dGVjXzAgLy8gMHg3MjY1NzM2NTcyNzY2NTczCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjIxOAogICAgLy8gcmVzZXJ2ZXMucmVwbGFjZShyZXNlcnZlX29mZnNldChpbmRleCksIG9wLml0b2IodmFsdWUpKQogICAgZGlnIDEwCiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICBkaWcgNQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo5NzUKICAgIC8vIHdyaXRlX3Jlc2VydmUoc2VsZi5yZXNlcnZlcywgdG9rZW5fb3V0X2lkeCwgcnVubmluZ19vdXRfYWN0dWFsKQogICAgYnl0ZWNfMCAvLyAweDcyNjU3MzY1NzI3NjY1NzMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6MjE4CiAgICAvLyByZXNlcnZlcy5yZXBsYWNlKHJlc2VydmVfb2Zmc2V0KGluZGV4KSwgb3AuaXRvYih2YWx1ZSkpCiAgICBkaWcgOAogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo5NzYKICAgIC8vIHNlbGYuc3VtX3gudmFsdWUgPSBydW5uaW5nX3N1bQogICAgYnl0ZWMgNiAvLyAic3VtX3giCiAgICBkaWcgNQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6OTc3CiAgICAvLyBzZWxmLnN1bV94X3NxLnZhbHVlID0gcnVubmluZ19zdW1fc3EKICAgIGJ5dGVjIDcgLy8gInN1bV94X3NxIgogICAgZGlnIDQKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5Ojk3OAogICAgLy8gc2VsZi5yX2ludC52YWx1ZSA9IGN1cl9yX2ludAogICAgYnl0ZWMgNCAvLyAicl9pbnQiCiAgICBkaWcgMTIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5Ojk3OQogICAgLy8gc2VsZi5zX2JvdW5kLnZhbHVlID0gY3VyX3NfYm91bmQKICAgIGJ5dGVjIDEzIC8vICJzX2JvdW5kIgogICAgZGlnIDExCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo5ODAKICAgIC8vIHNlbGYua19ib3VuZC52YWx1ZSA9IGN1cl9rX2JvdW5kCiAgICBieXRlYyAxNCAvLyAia19ib3VuZCIKICAgIGRpZyAxMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6OTgyLTk4MwogICAgLy8gIyBBY2N1bXVsYXRlIGZlZSBpbnRvIGZlZV9ncm93dGguCiAgICAvLyBpZiBmZWUgPiBVSW50NjQoMCk6CiAgICBkaWcgMTkKICAgIGJ6IHN3YXBfd2l0aF9jcm9zc2luZ3NfYWZ0ZXJfaWZfZWxzZUAxOAogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo5ODQKICAgIC8vIHRvdGFsX3IgPSBzZWxmLnRvdGFsX3IudmFsdWUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA5IC8vICJ0b3RhbF9yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgYnVyeSAyNwogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfciBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6OTg1CiAgICAvLyBpZiB0b3RhbF9yID4gVUludDY0KDApOgogICAgYnogc3dhcF93aXRoX2Nyb3NzaW5nc19hZnRlcl9pZl9lbHNlQDE4CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjE4MgogICAgLy8gaGlnaCwgbG93ID0gb3AubXVsdyhsaHMsIHJocykKICAgIGRpZyAxOQogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo5ODYKICAgIC8vIGZnX2luY3JlbWVudCA9IG11bF9kaXZfZmxvb3IoZmVlLCBVSW50NjQoX1BSRUNJU0lPTiksIHRvdGFsX3IpCiAgICBpbnRjXzMgLy8gMTAwMDAwMDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToxODIKICAgIC8vIGhpZ2gsIGxvdyA9IG9wLm11bHcobGhzLCByaHMpCiAgICBtdWx3CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjE4MwogICAgLy8gcmV0dXJuIG9wLmRpdncoaGlnaCwgbG93LCBkZW5vbWluYXRvcikKICAgIGRpZyAyNgogICAgZGl2dwogICAgZHVwCiAgICBidXJ5IDMwCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5Ojk4NwogICAgLy8gaWYgZmdfaW5jcmVtZW50ID4gVUludDY0KDApOgogICAgYnogc3dhcF93aXRoX2Nyb3NzaW5nc19hZnRlcl9pZl9lbHNlQDE4CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5Ojk4OAogICAgLy8gb2xkX2ZnID0gcmVhZF9mZWVfZ3Jvd3RoKHNlbGYuZmVlX2dyb3d0aCwgdG9rZW5faW5faWR4KQogICAgYnl0ZWNfMyAvLyAweDY2NjU2NTVmNjc3MjZmNzc3NDY4CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjIyMwogICAgLy8gcmV0dXJuIG9wLmV4dHJhY3RfdWludDY0KGZlZV9ncm93dGguZXh0cmFjdChyZXNlcnZlX29mZnNldChpbmRleCksIFVJbnQ2NCg4KSksIDApCiAgICBkaWcgOQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzEgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo5ODkKICAgIC8vIHdyaXRlX2ZlZV9ncm93dGgoc2VsZi5mZWVfZ3Jvd3RoLCB0b2tlbl9pbl9pZHgsIG9sZF9mZyArIGZnX2luY3JlbWVudCkKICAgIGRpZyAzMAogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToyMjgKICAgIC8vIGZlZV9ncm93dGgucmVwbGFjZShyZXNlcnZlX29mZnNldChpbmRleCksIG9wLml0b2IodmFsdWUpKQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo5ODkKICAgIC8vIHdyaXRlX2ZlZV9ncm93dGgoc2VsZi5mZWVfZ3Jvd3RoLCB0b2tlbl9pbl9pZHgsIG9sZF9mZyArIGZnX2luY3JlbWVudCkKICAgIGJ5dGVjXzMgLy8gMHg2NjY1NjU1ZjY3NzI2Zjc3NzQ2OAogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToyMjgKICAgIC8vIGZlZV9ncm93dGgucmVwbGFjZShyZXNlcnZlX29mZnNldChpbmRleCksIG9wLml0b2IodmFsdWUpKQogICAgY292ZXIgMgogICAgYm94X3JlcGxhY2UKCnN3YXBfd2l0aF9jcm9zc2luZ3NfYWZ0ZXJfaWZfZWxzZUAxODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6OTkxCiAgICAvLyBpZiB0b3RhbF9zZWdfb3V0ID4gVUludDY0KDApOgogICAgZGlnIDEKICAgIGJ6IHN3YXBfd2l0aF9jcm9zc2luZ3NfYWZ0ZXJfaWZfZWxzZUAyMAogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weTo5OTIKICAgIC8vIHNlbmRfdG9rZW5zKHRva2VuX291dF9hc3NldCwgVHhuLnNlbmRlciwgdG90YWxfc2VnX291dCkKICAgIGRpZyAyMAogICAgdHhuIFNlbmRlcgogICAgZGlnIDMKICAgIGNhbGxzdWIgc2VuZF90b2tlbnMKCnN3YXBfd2l0aF9jcm9zc2luZ3NfYWZ0ZXJfaWZfZWxzZUAyMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6ODIxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMiAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMub3JiaXRhbF9wb29sLmNvbnRyYWN0Lk9yYml0YWxQb29sLmdldF9wb29sX2luZm9bcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfcG9vbF9pbmZvOgogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToxMDA0CiAgICAvLyBuPWFyYzQuVUludDY0KHNlbGYubi52YWx1ZSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAibiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5uIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToxMDA1CiAgICAvLyByX2ludD1hcmM0LlVJbnQ2NChzZWxmLnJfaW50LnZhbHVlKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJyX2ludCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yX2ludCBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6MTAwNgogICAgLy8gc19ib3VuZD1hcmM0LlVJbnQ2NChzZWxmLnNfYm91bmQudmFsdWUpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJzX2JvdW5kIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNfYm91bmQgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjEwMDcKICAgIC8vIGtfYm91bmQ9YXJjNC5VSW50NjQoc2VsZi5rX2JvdW5kLnZhbHVlKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNCAvLyAia19ib3VuZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5rX2JvdW5kIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToxMDA4CiAgICAvLyBzcXJ0X249YXJjNC5VSW50NjQoc2VsZi5zcXJ0X24udmFsdWUpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE3IC8vICJzcXJ0X24iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3FydF9uIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToxMDA5CiAgICAvLyBpbnZfc3FydF9uPWFyYzQuVUludDY0KHNlbGYuaW52X3NxcnRfbi52YWx1ZSksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTkgLy8gImludl9zcXJ0X24iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuaW52X3NxcnRfbiBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6MTAxMAogICAgLy8gbnVtX3RpY2tzPWFyYzQuVUludDY0KHNlbGYubnVtX3RpY2tzLnZhbHVlKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNiAvLyAibnVtX3RpY2tzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm51bV90aWNrcyBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6MTAxMQogICAgLy8gZmVlX2Jwcz1hcmM0LlVJbnQ2NChzZWxmLmZlZV9icHMudmFsdWUpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE4IC8vICJmZWVfYnBzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZlZV9icHMgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjEwMTIKICAgIC8vIHZpcnR1YWxfb2Zmc2V0PWFyYzQuVUludDY0KHNlbGYudmlydHVhbF9vZmZzZXQudmFsdWUpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDggLy8gInZpcnR1YWxfb2Zmc2V0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnZpcnR1YWxfb2Zmc2V0IGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToxMDEzCiAgICAvLyBwYXVzZWQ9YXJjNC5VSW50NjQoc2VsZi5wYXVzZWQudmFsdWUpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gInBhdXNlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wYXVzZWQgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjEwMTQKICAgIC8vIHN1bV94PWFyYzQuVUludDY0KHNlbGYuc3VtX3gudmFsdWUpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gInN1bV94IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN1bV94IGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToxMDE1CiAgICAvLyBzdW1feF9zcT1hcmM0LlVJbnQ2NChzZWxmLnN1bV94X3NxLnZhbHVlKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJzdW1feF9zcSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdW1feF9zcSBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6MTAxNgogICAgLy8gdG90YWxfcj1hcmM0LlVJbnQ2NChzZWxmLnRvdGFsX3IudmFsdWUpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gInRvdGFsX3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudG90YWxfciBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6MTAxNwogICAgLy8gYW1vdW50X3NjYWxlPWFyYzQuVUludDY0KFVJbnQ2NChfQU1PVU5UX1NDQUxFKSksCiAgICBpbnRjIDQgLy8gMTAwMAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToxMDAzLTEwMTgKICAgIC8vIHJldHVybiBQb29sSW5mbygKICAgIC8vICAgICBuPWFyYzQuVUludDY0KHNlbGYubi52YWx1ZSksCiAgICAvLyAgICAgcl9pbnQ9YXJjNC5VSW50NjQoc2VsZi5yX2ludC52YWx1ZSksCiAgICAvLyAgICAgc19ib3VuZD1hcmM0LlVJbnQ2NChzZWxmLnNfYm91bmQudmFsdWUpLAogICAgLy8gICAgIGtfYm91bmQ9YXJjNC5VSW50NjQoc2VsZi5rX2JvdW5kLnZhbHVlKSwKICAgIC8vICAgICBzcXJ0X249YXJjNC5VSW50NjQoc2VsZi5zcXJ0X24udmFsdWUpLAogICAgLy8gICAgIGludl9zcXJ0X249YXJjNC5VSW50NjQoc2VsZi5pbnZfc3FydF9uLnZhbHVlKSwKICAgIC8vICAgICBudW1fdGlja3M9YXJjNC5VSW50NjQoc2VsZi5udW1fdGlja3MudmFsdWUpLAogICAgLy8gICAgIGZlZV9icHM9YXJjNC5VSW50NjQoc2VsZi5mZWVfYnBzLnZhbHVlKSwKICAgIC8vICAgICB2aXJ0dWFsX29mZnNldD1hcmM0LlVJbnQ2NChzZWxmLnZpcnR1YWxfb2Zmc2V0LnZhbHVlKSwKICAgIC8vICAgICBwYXVzZWQ9YXJjNC5VSW50NjQoc2VsZi5wYXVzZWQudmFsdWUpLAogICAgLy8gICAgIHN1bV94PWFyYzQuVUludDY0KHNlbGYuc3VtX3gudmFsdWUpLAogICAgLy8gICAgIHN1bV94X3NxPWFyYzQuVUludDY0KHNlbGYuc3VtX3hfc3EudmFsdWUpLAogICAgLy8gICAgIHRvdGFsX3I9YXJjNC5VSW50NjQoc2VsZi50b3RhbF9yLnZhbHVlKSwKICAgIC8vICAgICBhbW91bnRfc2NhbGU9YXJjNC5VSW50NjQoVUludDY0KF9BTU9VTlRfU0NBTEUpKSwKICAgIC8vICkKICAgIHVuY292ZXIgMTMKICAgIHVuY292ZXIgMTMKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMgogICAgY29uY2F0CiAgICB1bmNvdmVyIDExCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTAKICAgIGNvbmNhdAogICAgdW5jb3ZlciA5CiAgICBjb25jYXQKICAgIHVuY292ZXIgOAogICAgY29uY2F0CiAgICB1bmNvdmVyIDcKICAgIGNvbmNhdAogICAgdW5jb3ZlciA2CiAgICBjb25jYXQKICAgIHVuY292ZXIgNQogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6OTk2CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjIDExIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzIgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzLm9yYml0YWxfcG9vbC5jb250cmFjdC5PcmJpdGFsUG9vbC5nZXRfdGlja19pbmZvW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X3RpY2tfaW5mbzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6MTAyMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjEwMjMKICAgIC8vIGFzc2VydCB0aWNrX2lkIGluIHNlbGYudGlja3MKICAgIGl0b2IKICAgIGJ5dGVjIDE1IC8vIDB4NzQ2OTYzNmIzYQogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjEwMjQKICAgIC8vIHJldHVybiBzZWxmLnRpY2tzW3RpY2tfaWRdLmNvcHkoKQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjEwMjAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWMgMTEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMiAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMub3JiaXRhbF9wb29sLmNvbnRyYWN0Lk9yYml0YWxQb29sLmdldF9wb3NpdGlvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9wb3NpdGlvbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6MTAyNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjEwMzMKICAgIC8vIHBvc19rZXkgPSBvd25lci5ieXRlcyArIG9wLml0b2IodGlja19pZCkKICAgIGl0b2IKICAgIHN3YXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6MTAzNAogICAgLy8gYXNzZXJ0IHBvc19rZXkgaW4gc2VsZi5wb3NpdGlvbnMKICAgIGJ5dGVjIDIwIC8vIDB4NzA2ZjczM2EKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydAogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToxMDM1CiAgICAvLyBhc3NlcnQgdGlja19pZCBpbiBzZWxmLnRpY2tzCiAgICBieXRlYyAxNSAvLyAweDc0Njk2MzZiM2EKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjEwMzcKICAgIC8vIHRpY2sgPSBzZWxmLnRpY2tzW3RpY2tfaWRdLmNvcHkoKQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjEwMzgKICAgIC8vIHRpY2tfciA9IHRpY2suci5hc191aW50NjQoKQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6MTAzOQogICAgLy8gdGlja190b3RhbF9zaGFyZXMgPSB0aWNrLnRvdGFsX3NoYXJlcy5hc191aW50NjQoKQogICAgc3dhcAogICAgcHVzaGludCAxNwogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6MTA0MAogICAgLy8gYXNzZXJ0IHRpY2tfdG90YWxfc2hhcmVzID4gVUludDY0KDApCiAgICBkdXAKICAgIGFzc2VydAogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToxMDQyCiAgICAvLyBwb3NfcmF3ID0gc2VsZi5wb3NpdGlvbnNbcG9zX2tleV0KICAgIHVuY292ZXIgMgogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjEwNDMKICAgIC8vIHBvc19zaGFyZXMgPSBvcC5leHRyYWN0X3VpbnQ2NChwb3NfcmF3LCAwKQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjE4MgogICAgLy8gaGlnaCwgbG93ID0gb3AubXVsdyhsaHMsIHJocykKICAgIHVuY292ZXIgMgogICAgZGlnIDEKICAgIG11bHcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6MTgzCiAgICAvLyByZXR1cm4gb3AuZGl2dyhoaWdoLCBsb3csIGRlbm9taW5hdG9yKQogICAgdW5jb3ZlciAzCiAgICBkaXZ3CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjEwNDcKICAgIC8vIHNoYXJlcz1hcmM0LlVJbnQ2NChwb3Nfc2hhcmVzKSwKICAgIHN3YXAKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6MTA0OAogICAgLy8gcG9zaXRpb25fcj1hcmM0LlVJbnQ2NChwb3NfciksCiAgICBzd2FwCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjEwNDYtMTA0OQogICAgLy8gcmV0dXJuIFBvc2l0aW9uSW5mbygKICAgIC8vICAgICBzaGFyZXM9YXJjNC5VSW50NjQocG9zX3NoYXJlcyksCiAgICAvLyAgICAgcG9zaXRpb25fcj1hcmM0LlVJbnQ2NChwb3NfciksCiAgICAvLyApCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6MTAyNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlYyAxMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18yIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5vcmJpdGFsX3Bvb2wuY29udHJhY3QuT3JiaXRhbFBvb2wuZ2V0X3Jlc2VydmVzW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X3Jlc2VydmVzOgogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToxMDU4CiAgICAvLyBhc3NlcnQgc2VsZi5ib290c3RyYXBwZWQudmFsdWUgPT0gVUludDY0KDEpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiYm9vdHN0cmFwcGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmJvb3RzdHJhcHBlZCBleGlzdHMKICAgIGludGNfMiAvLyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjEwNTkKICAgIC8vIHJldHVybiBhcmM0LkR5bmFtaWNCeXRlcyhzZWxmLnJlc2VydmVzLnZhbHVlKQogICAgYnl0ZWNfMCAvLyAweDcyNjU3MzY1NzI3NjY1NzMKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVzIGV4aXN0cwogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6MTA1MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlYyAxMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18yIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5vcmJpdGFsX3Bvb2wuY29udHJhY3QuT3JiaXRhbFBvb2wuZ2V0X2ZlZV9ncm93dGhbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfZmVlX2dyb3d0aDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6MTA2OQogICAgLy8gYXNzZXJ0IHNlbGYuYm9vdHN0cmFwcGVkLnZhbHVlID09IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImJvb3RzdHJhcHBlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ib290c3RyYXBwZWQgZXhpc3RzCiAgICBpbnRjXzIgLy8gMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToxMDcwCiAgICAvLyByZXR1cm4gYXJjNC5EeW5hbWljQnl0ZXMoc2VsZi5mZWVfZ3Jvd3RoLnZhbHVlKQogICAgYnl0ZWNfMyAvLyAweDY2NjU2NTVmNjc3MjZmNzc3NDY4CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5mZWVfZ3Jvd3RoIGV4aXN0cwogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6MTA2MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlYyAxMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18yIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5vcmJpdGFsX3Bvb2wuY29udHJhY3QuT3JiaXRhbFBvb2wuZ2V0X3JlZ2lzdGVyZWRfdG9rZW5zW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X3JlZ2lzdGVyZWRfdG9rZW5zOgogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToxMDc1CiAgICAvLyBhc3NlcnQgc2VsZi5ib290c3RyYXBwZWQudmFsdWUgPT0gVUludDY0KDEpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiYm9vdHN0cmFwcGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmJvb3RzdHJhcHBlZCBleGlzdHMKICAgIGludGNfMiAvLyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjEwNzYKICAgIC8vIG4gPSBzZWxmLm4udmFsdWUKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJuIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm4gZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjEwNzcKICAgIC8vIHJlc3VsdCA9IEJ5dGVzKGIiIikKICAgIHB1c2hieXRlcyAweAogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToxMDc4CiAgICAvLyBmb3IgaWR4IGluIHVyYW5nZShuKToKICAgIGludGNfMCAvLyAwCgpnZXRfcmVnaXN0ZXJlZF90b2tlbnNfZm9yX2hlYWRlckAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToxMDc4CiAgICAvLyBmb3IgaWR4IGluIHVyYW5nZShuKToKICAgIGR1cAogICAgZGlnIDMKICAgIDwKICAgIGJ6IGdldF9yZWdpc3RlcmVkX3Rva2Vuc19hZnRlcl9mb3JANQogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToxMDc5CiAgICAvLyByZXN1bHQgPSByZXN1bHQgKyBvcC5pdG9iKHNlbGYudG9rZW5zW2lkeF0pCiAgICBkdXBuIDIKICAgIGl0b2IKICAgIGJ5dGVjIDEwIC8vIDB4NzQ2ZjZiNjU2ZTNhCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRva2VucyBlbnRyeSBleGlzdHMKICAgIGJ0b2kKICAgIGl0b2IKICAgIGRpZyAzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ1cnkgMwogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToxMDc4CiAgICAvLyBmb3IgaWR4IGluIHVyYW5nZShuKToKICAgIGludGNfMiAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgZ2V0X3JlZ2lzdGVyZWRfdG9rZW5zX2Zvcl9oZWFkZXJAMgoKZ2V0X3JlZ2lzdGVyZWRfdG9rZW5zX2FmdGVyX2ZvckA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToxMDgwCiAgICAvLyByZXR1cm4gYXJjNC5EeW5hbWljQnl0ZXMocmVzdWx0KQogICAgZGlnIDEKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjEwNzIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWMgMTEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMiAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMub3JiaXRhbF9wb29sLmNvbnRyYWN0Lk9yYml0YWxQb29sLmdldF9mZWVzX2Zvcl9wb3NpdGlvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9mZWVzX2Zvcl9wb3NpdGlvbjoKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjEwODIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToxMDkyCiAgICAvLyBwb3Nfa2V5ID0gb3duZXIuYnl0ZXMgKyBvcC5pdG9iKHRpY2tfaWQpCiAgICBpdG9iCiAgICBzd2FwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjEwOTMKICAgIC8vIGFzc2VydCBwb3Nfa2V5IGluIHNlbGYucG9zaXRpb25zCiAgICBieXRlYyAyMCAvLyAweDcwNmY3MzNhCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6MTA5NAogICAgLy8gYXNzZXJ0IHRpY2tfaWQgaW4gc2VsZi50aWNrcwogICAgYnl0ZWMgMTUgLy8gMHg3NDY5NjM2YjNhCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydAogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToxMDk2CiAgICAvLyB0aWNrID0gc2VsZi50aWNrc1t0aWNrX2lkXS5jb3B5KCkKICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToxMDk3CiAgICAvLyB0aWNrX3IgPSB0aWNrLnIuYXNfdWludDY0KCkKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjEwOTgKICAgIC8vIHRpY2tfdG90YWxfc2hhcmVzID0gdGljay50b3RhbF9zaGFyZXMuYXNfdWludDY0KCkKICAgIHN3YXAKICAgIHB1c2hpbnQgMTcKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjEwOTkKICAgIC8vIGFzc2VydCB0aWNrX3RvdGFsX3NoYXJlcyA+IFVJbnQ2NCgwKQogICAgZHVwCiAgICBhc3NlcnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6MTEwMQogICAgLy8gcG9zX3JhdyA9IHNlbGYucG9zaXRpb25zW3Bvc19rZXldCiAgICB1bmNvdmVyIDIKICAgIGJveF9nZXQKICAgIHBvcAogICAgZHVwCiAgICBjb3ZlciAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjExMDIKICAgIC8vIHBvc19zaGFyZXMgPSBvcC5leHRyYWN0X3VpbnQ2NChwb3NfcmF3LCAwKQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjE4MgogICAgLy8gaGlnaCwgbG93ID0gb3AubXVsdyhsaHMsIHJocykKICAgIHVuY292ZXIgMgogICAgbXVsdwogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToxODMKICAgIC8vIHJldHVybiBvcC5kaXZ3KGhpZ2gsIGxvdywgZGVub21pbmF0b3IpCiAgICB1bmNvdmVyIDIKICAgIGRpdncKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6MTEwNQogICAgLy8gbiA9IHNlbGYubi52YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gIm4iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubiBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6MTEwNgogICAgLy8gcmVzdWx0ID0gQnl0ZXMoYiIiKQogICAgcHVzaGJ5dGVzIDB4CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjExMDcKICAgIC8vIGZvciBpZHggaW4gdXJhbmdlKG4pOgogICAgaW50Y18wIC8vIDAKCmdldF9mZWVzX2Zvcl9wb3NpdGlvbl9mb3JfaGVhZGVyQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjExMDcKICAgIC8vIGZvciBpZHggaW4gdXJhbmdlKG4pOgogICAgZHVwCiAgICBkaWcgMwogICAgPAogICAgYnogZ2V0X2ZlZXNfZm9yX3Bvc2l0aW9uX2FmdGVyX2ZvckA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjE3NgogICAgLy8gcmV0dXJuIGluZGV4ICogVUludDY0KDgpCiAgICBkdXAKICAgIGludGNfMSAvLyA4CiAgICAqCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjExMDgKICAgIC8vIGZnX2dsb2JhbCA9IHJlYWRfZmVlX2dyb3d0aChzZWxmLmZlZV9ncm93dGgsIGlkeCkKICAgIGJ5dGVjXzMgLy8gMHg2NjY1NjU1ZjY3NzI2Zjc3NzQ2OAogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToyMjMKICAgIC8vIHJldHVybiBvcC5leHRyYWN0X3VpbnQ2NChmZWVfZ3Jvd3RoLmV4dHJhY3QocmVzZXJ2ZV9vZmZzZXQoaW5kZXgpLCBVSW50NjQoOCkpLCAwKQogICAgZGlnIDEKICAgIGludGNfMSAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgOAogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToxMTA5CiAgICAvLyBmZ19jaGVja3BvaW50ID0gb3AuZXh0cmFjdF91aW50NjQocG9zX3JhdywgVUludDY0KDgpICsgaWR4ICogVUludDY0KDgpKQogICAgaW50Y18xIC8vIDgKICAgICsKICAgIGRpZyA2CiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6MTExMAogICAgLy8gY2xhaW1hYmxlID0gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToxMTExCiAgICAvLyBpZiBmZ19nbG9iYWwgPiBmZ19jaGVja3BvaW50OgogICAgPgogICAgYnogZ2V0X2ZlZXNfZm9yX3Bvc2l0aW9uX2FmdGVyX2lmX2Vsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToxMTEyCiAgICAvLyBmZWVfZGVsdGEgPSBmZ19nbG9iYWwgLSBmZ19jaGVja3BvaW50CiAgICBkaWcgNQogICAgZGlnIDcKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6MTgyCiAgICAvLyBoaWdoLCBsb3cgPSBvcC5tdWx3KGxocywgcmhzKQogICAgZGlnIDQKICAgIG11bHcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6MTExMwogICAgLy8gY2xhaW1hYmxlID0gbXVsX2Rpdl9mbG9vcihwb3NfciwgZmVlX2RlbHRhLCBVSW50NjQoX1BSRUNJU0lPTikpCiAgICBpbnRjXzMgLy8gMTAwMDAwMDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToxODMKICAgIC8vIHJldHVybiBvcC5kaXZ3KGhpZ2gsIGxvdywgZGVub21pbmF0b3IpCiAgICBkaXZ3CiAgICBidXJ5IDgKCmdldF9mZWVzX2Zvcl9wb3NpdGlvbl9hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjExMTQKICAgIC8vIHJlc3VsdCA9IHJlc3VsdCArIG9wLml0b2IoY2xhaW1hYmxlKQogICAgZGlnIDcKICAgIGl0b2IKICAgIGRpZyAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ1cnkgMgogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToxMTA3CiAgICAvLyBmb3IgaWR4IGluIHVyYW5nZShuKToKICAgIGR1cAogICAgaW50Y18yIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiBnZXRfZmVlc19mb3JfcG9zaXRpb25fZm9yX2hlYWRlckAyCgpnZXRfZmVlc19mb3JfcG9zaXRpb25fYWZ0ZXJfZm9yQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjExMTUKICAgIC8vIHJldHVybiBhcmM0LkR5bmFtaWNCeXRlcyhyZXN1bHQpCiAgICBkaWcgMQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6MTA4MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlYyAxMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18yIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5vcmJpdGFsX3Bvb2wuY29udHJhY3QuT3JiaXRhbFBvb2wubGlzdF90aWNrc1tyb3V0aW5nXSgpIC0+IHZvaWQ6Cmxpc3RfdGlja3M6CiAgICBpbnRjXzAgLy8gMAogICAgZHVwCiAgICBwdXNoYnl0ZXMgIiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6MTExNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjExMjcKICAgIC8vIHJlc3VsdCA9IGFyYzQuRHluYW1pY0FycmF5W1RpY2tFbnRyeV0oKQogICAgcHVzaGJ5dGVzIDB4MDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToxMTI4CiAgICAvLyBudW1fdGlja3MgPSBzZWxmLm51bV90aWNrcy52YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE2IC8vICJudW1fdGlja3MiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubnVtX3RpY2tzIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToxMTI5CiAgICAvLyBmb3IgaWR4IGluIHVyYW5nZShsaW1pdCk6CiAgICBpbnRjXzAgLy8gMAoKbGlzdF90aWNrc19mb3JfaGVhZGVyQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjExMjkKICAgIC8vIGZvciBpZHggaW4gdXJhbmdlKGxpbWl0KToKICAgIGR1cAogICAgZGlnIDQKICAgIDwKICAgIGJ6IGxpc3RfdGlja3NfYWZ0ZXJfZm9yQDkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6MTEzMAogICAgLy8gdGlja19pZCA9IHN0YXJ0ICsgaWR4CiAgICBkaWcgNAogICAgZGlnIDEKICAgICsKICAgIGR1cAogICAgYnVyeSA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjExMzEKICAgIC8vIGlmIHRpY2tfaWQgPCBudW1fdGlja3M6CiAgICBkaWcgMgogICAgPAogICAgYnogbGlzdF90aWNrc19hZnRlcl9pZl9lbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6MTEzMgogICAgLy8gaWYgdGlja19pZCBpbiBzZWxmLnRpY2tzOgogICAgZGlnIDUKICAgIGl0b2IKICAgIGR1cAogICAgYnVyeSA4CiAgICBieXRlYyAxNSAvLyAweDc0Njk2MzZiM2EKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBidXJ5IDkKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogbGlzdF90aWNrc19hZnRlcl9pZl9lbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6MTEzMwogICAgLy8gdGljayA9IHNlbGYudGlja3NbdGlja19pZF0uY29weSgpCiAgICBkaWcgNwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudGlja3MgZW50cnkgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjExMzcKICAgIC8vIHI9dGljay5yLAogICAgZHVwCiAgICBleHRyYWN0IDAgOAogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToxMTM4CiAgICAvLyBrPXRpY2suaywKICAgIGRpZyAxCiAgICBleHRyYWN0IDggOAogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToxMTM5CiAgICAvLyBzdGF0ZT10aWNrLnN0YXRlLAogICAgZGlnIDIKICAgIGV4dHJhY3QgMTYgMQogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToxMTQwCiAgICAvLyB0b3RhbF9zaGFyZXM9dGljay50b3RhbF9zaGFyZXMsCiAgICB1bmNvdmVyIDMKICAgIGV4dHJhY3QgMTcgOAogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToxMTM1LTExNDEKICAgIC8vIFRpY2tFbnRyeSgKICAgIC8vICAgICB0aWNrX2lkPWFyYzQuVUludDY0KHRpY2tfaWQpLAogICAgLy8gICAgIHI9dGljay5yLAogICAgLy8gICAgIGs9dGljay5rLAogICAgLy8gICAgIHN0YXRlPXRpY2suc3RhdGUsCiAgICAvLyAgICAgdG90YWxfc2hhcmVzPXRpY2sudG90YWxfc2hhcmVzLAogICAgLy8gKQogICAgZGlnIDEwCiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6MTEzNC0xMTQyCiAgICAvLyByZXN1bHQuYXBwZW5kKAogICAgLy8gICAgIFRpY2tFbnRyeSgKICAgIC8vICAgICAgICAgdGlja19pZD1hcmM0LlVJbnQ2NCh0aWNrX2lkKSwKICAgIC8vICAgICAgICAgcj10aWNrLnIsCiAgICAvLyAgICAgICAgIGs9dGljay5rLAogICAgLy8gICAgICAgICBzdGF0ZT10aWNrLnN0YXRlLAogICAgLy8gICAgICAgICB0b3RhbF9zaGFyZXM9dGljay50b3RhbF9zaGFyZXMsCiAgICAvLyAgICAgKQogICAgLy8gKQogICAgZGlnIDMKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIHN3YXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICBidXJ5IDMKCmxpc3RfdGlja3NfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToxMTI5CiAgICAvLyBmb3IgaWR4IGluIHVyYW5nZShsaW1pdCk6CiAgICBkdXAKICAgIGludGNfMiAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgbGlzdF90aWNrc19mb3JfaGVhZGVyQDIKCmxpc3RfdGlja3NfYWZ0ZXJfZm9yQDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjExMTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWMgMTEgLy8gMHgxNTFmN2M3NQogICAgZGlnIDMKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzIgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzLm9yYml0YWxfcG9vbC5jb250cmFjdC5PcmJpdGFsUG9vbC5nZXRfcHJpY2Vbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfcHJpY2U6CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjExNDUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToxMTYwCiAgICAvLyBhc3NlcnQgc2VsZi5ib290c3RyYXBwZWQudmFsdWUgPT0gVUludDY0KDEpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiYm9vdHN0cmFwcGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmJvb3RzdHJhcHBlZCBleGlzdHMKICAgIGludGNfMiAvLyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjExNjEKICAgIC8vIGFzc2VydCB0b2tlbl9pbl9pZHggPCBzZWxmLm4udmFsdWUKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJuIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm4gZXhpc3RzCiAgICBkaWcgMgogICAgZGlnIDEKICAgIDwKICAgIGFzc2VydAogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToxMTYyCiAgICAvLyBhc3NlcnQgdG9rZW5fb3V0X2lkeCA8IHNlbGYubi52YWx1ZQogICAgZGlnIDEKICAgID4KICAgIGFzc2VydAogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToxMTYzCiAgICAvLyBhc3NlcnQgdG9rZW5faW5faWR4ICE9IHRva2VuX291dF9pZHgKICAgIGR1cDIKICAgICE9CiAgICBhc3NlcnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6MTE2NQogICAgLy8gb2Zmc2V0ID0gc2VsZi52aXJ0dWFsX29mZnNldC52YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDggLy8gInZpcnR1YWxfb2Zmc2V0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnZpcnR1YWxfb2Zmc2V0IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToxMTY2CiAgICAvLyByID0gc2VsZi5yX2ludC52YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gInJfaW50IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJfaW50IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToxNzYKICAgIC8vIHJldHVybiBpbmRleCAqIFVJbnQ2NCg4KQogICAgdW5jb3ZlciAzCiAgICBpbnRjXzEgLy8gOAogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToxMTY3CiAgICAvLyB4X2luID0gdG9fc2NhbGVkKHJlYWRfcmVzZXJ2ZShzZWxmLnJlc2VydmVzLCB0b2tlbl9pbl9pZHgpKSArIG9mZnNldAogICAgYnl0ZWNfMCAvLyAweDcyNjU3MzY1NzI3NjY1NzMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6MjEzCiAgICAvLyByZXR1cm4gb3AuZXh0cmFjdF91aW50NjQocmVzZXJ2ZXMuZXh0cmFjdChyZXNlcnZlX29mZnNldChpbmRleCksIFVJbnQ2NCg4KSksIDApCiAgICBzd2FwCiAgICBpbnRjXzEgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToyMDgKICAgIC8vIHJldHVybiByYXcgLy8gVUludDY0KF9BTU9VTlRfU0NBTEUpCiAgICBpbnRjIDQgLy8gMTAwMAogICAgLwogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToxMTY3CiAgICAvLyB4X2luID0gdG9fc2NhbGVkKHJlYWRfcmVzZXJ2ZShzZWxmLnJlc2VydmVzLCB0b2tlbl9pbl9pZHgpKSArIG9mZnNldAogICAgZGlnIDIKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6MTc2CiAgICAvLyByZXR1cm4gaW5kZXggKiBVSW50NjQoOCkKICAgIHVuY292ZXIgMwogICAgaW50Y18xIC8vIDgKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6MTE2OAogICAgLy8geF9vdXQgPSB0b19zY2FsZWQocmVhZF9yZXNlcnZlKHNlbGYucmVzZXJ2ZXMsIHRva2VuX291dF9pZHgpKSArIG9mZnNldAogICAgYnl0ZWNfMCAvLyAweDcyNjU3MzY1NzI3NjY1NzMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6MjEzCiAgICAvLyByZXR1cm4gb3AuZXh0cmFjdF91aW50NjQocmVzZXJ2ZXMuZXh0cmFjdChyZXNlcnZlX29mZnNldChpbmRleCksIFVJbnQ2NCg4KSksIDApCiAgICBzd2FwCiAgICBpbnRjXzEgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToyMDgKICAgIC8vIHJldHVybiByYXcgLy8gVUludDY0KF9BTU9VTlRfU0NBTEUpCiAgICBpbnRjIDQgLy8gMTAwMAogICAgLwogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToxMTY4CiAgICAvLyB4X291dCA9IHRvX3NjYWxlZChyZWFkX3Jlc2VydmUoc2VsZi5yZXNlcnZlcywgdG9rZW5fb3V0X2lkeCkpICsgb2Zmc2V0CiAgICB1bmNvdmVyIDMKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9vcmJpdGFsX3Bvb2wvY29udHJhY3QucHk6MTE3MAogICAgLy8gYXNzZXJ0IHIgPiB4X2luCiAgICBkaWcgMgogICAgZGlnIDIKICAgID4KICAgIGFzc2VydAogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToxMTcxCiAgICAvLyBhc3NlcnQgciA+IHhfb3V0CiAgICBkaWcgMgogICAgZGlnIDEKICAgID4KICAgIGFzc2VydAogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToxMTcyCiAgICAvLyBwcmljZSA9IG11bF9kaXZfZmxvb3IociAtIHhfaW4sIFVJbnQ2NChfUFJFQ0lTSU9OKSwgciAtIHhfb3V0KQogICAgZGlnIDIKICAgIHVuY292ZXIgMgogICAgLQogICAgY292ZXIgMgogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToxODIKICAgIC8vIGhpZ2gsIGxvdyA9IG9wLm11bHcobGhzLCByaHMpCiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjExNzIKICAgIC8vIHByaWNlID0gbXVsX2Rpdl9mbG9vcihyIC0geF9pbiwgVUludDY0KF9QUkVDSVNJT04pLCByIC0geF9vdXQpCiAgICBpbnRjXzMgLy8gMTAwMDAwMDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToxODIKICAgIC8vIGhpZ2gsIGxvdyA9IG9wLm11bHcobGhzLCByaHMpCiAgICBtdWx3CiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjE4MwogICAgLy8gcmV0dXJuIG9wLmRpdncoaGlnaCwgbG93LCBkZW5vbWluYXRvcikKICAgIHVuY292ZXIgMgogICAgZGl2dwogICAgLy8gc21hcnRfY29udHJhY3RzL29yYml0YWxfcG9vbC9jb250cmFjdC5weToxMTczCiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQocHJpY2UpCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvb3JiaXRhbF9wb29sL2NvbnRyYWN0LnB5OjExNDUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWMgMTEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMiAvLyAxCiAgICByZXR1cm4K", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==" }, "byteCode": { "approval": "CyAGAAgBgJTr3APoB5BOJhYIcmVzZXJ2ZXMBbgxib290c3RyYXBwZWQKZmVlX2dyb3d0aAVyX2ludAZwYXVzZWQFc3VtX3gIc3VtX3hfc3EOdmlydHVhbF9vZmZzZXQHdG90YWxfcgZ0b2tlbjoEFR98dRFyZWdpc3RlcmVkX3Rva2VucwdzX2JvdW5kB2tfYm91bmQFdGljazoJbnVtX3RpY2tzBnNxcnRfbgdmZWVfYnBzCmludl9zcXJ0X24EcG9zOgdjcmVhdG9yMRhAAD8pImcqImcnDCJnJwYiZycHImcnBCJnJw0iZycOImcnCCJnJxAiZycRImcnEyJnJwUiZycSImcnFTIDZycJImcxGRREMRhBAI+CEwS+x22HBOsVDxIEQjpxZwQKikZ2BPxLiLcEyqqqawQoDByTBAP8OyoErmSW0gRx2AATBO51KMwEsN4CUgSjTN/ZBJoTwzAE002ypQQqaNP3BHRMccsETUNQmwRvegzSNhoAjhMB3QABAhECaAKAAp4EYAUfB4YJIwxXDNYM8g1BDVoNcw2xDlQO4wAkQ4AEfv2k0jYaAI4BAToAigIBi/6L/w9BAAaL/ov/CYmL/4v+CYmKBAGL/ov8C4v9i/8dJZdLAUwJi/4kCU8Ci/wLSwJLAwsJC5IIi/4Ki/xMCYmKAwGL/Yv/HSWXi/5MiP+si/1JHUlOA04DFERJHUlOAk4DFEQPQQAJiwCLAQmSjACJIowAiYoCADEWRDEWJAlJOBCBBBJESTgAMQASREk4FDIKEkRJOBKL/xJEOBGL/hJEiYoIAYAARwOL+Iv/HSWXSYv9DEEABCKMAImLBIv9CYwAi/uL/h0ll4wBi/hJHYv6l0mMAov5DUEABCKMAImL+YsCCZJJjAOL/AxBAAQijACJiwOL/AmLAIsBiP7+i/tJHSWXSwFPAh0ll0sCTwMdJZcIiP7mIQQOjACJigMAsYv/shKL/rIUi/2yEYEEshAisgGziTYaAUkVIxJEFzYaAkkVIxJEFzYaA0kVIxJEF0sCJA1ESwKBgICQu7rWrfANC0sCSwMdTBRESwOBAgskCExPAoj+hQ9ESh0llyWI/nskDkQpTwNnKiJnJwwiZycGImcnByJnJwQiZycNImcnDiJnJwgiZycQImcnEU8CZycTTGcnBSJnJxKBHmcnFTEAZycJImckQyInBWVEFEQiKmVEFEQiKWVEIwtJKEy5QAAHKL1ESwESRCtLAblAAAcrvURLARJEKiRnJEM2GgFJFSMSRBc2GgJJFSMSRBciJwVlRBREIiplRCQSRCIpZURLAg1ETBYnCkxQSb1FARRESwEWvyInDGVEJAgnDExnsTIKIrISshSyEYEEshAisgGzJEM2GgFJFSMSRBcxACInFWVEEkQnBUxnJEM2GgFJFSMSRBcxACInFWVEEkRJgfQDDkQnEkxnJEMiSYAASTYaAUcCFSMSRBdJNhoCSU4CSRUjEkQXIicFZUQURCIqZUQkEkQiJwxlRCIpZUxJTgJOBURMSwESREsCRCInEWVESSUJSwQdJZdLAiQJJQtLBR1LA5dLBE8CD0RLAw9ESwMlHUsCl0sETAlJTgJOBU8ETwRLBE8DiP0LSg9ETEsBCSEEC04CMRZLAg9EMRZPAglMIicIZUxJTgJOA0QIIicHZUQiSUsIDEEAeEsESwFJTgIISTgQgQQSREsBFicKTFC+RBdLATgAMQASREsBOBQyChJESwE4EksJSU4EEkRMOBESREsBIwsoSwEjuiJbSSEECksICExPAwhJIQQKSwcITBYoTwRPArtJHUwUREsECEsBTwIdTBRECUUDJAhFAUL/gSInEGVMSU4CRQ5ESwZLCQsWSUUQSwxLC1CAAQBQTFBMFicPSwFQTwK/MQBMUEUPIkUNSwxLCAxBABlLDEkjCytMI7pXAAhLD0xQRQ8kCEUNQv/fJxRLD1BJvEhLDr9LCyQIJxBMZyInBGVESwpJTgIIJwRMZyInCWVECCcJTGcnCEsDZyInBmVESwhLCAsIJwZMZycHSwJnJEOAAEcCNhoBSRUjEkQXIicFZUQURCIqZUQkEkQWJw9LAVBJvUUBRDEATwJQJxRMUElOAkm9RQFETL5ISSJbTIERW0lETwK+SElOAyJbSURPAksBHU8Dl0wiKWVMTgJEFiJJSwMMQQBOSSMLK0sBI7oiW0lOAkUJIwhLBkxbSU4CRQpJFksETFBFBAxBACBLBksICUsEHSWXSUUKQQAQSRYnCkxQvkQXMQBLCoj8JEkkCEUBQv+rSwVJvEhLAr8kQyKAAEcINhoBSRUjEkQXNhoCSRUjEkQXSU4CIicFZUQURCIqZUQkEkQiJwxlRCIpZUxJTgJOBUQSRElETBYnD0sBUElOA0m9RQFEMQBPAlAnFExQSU4DSb1FAURMvkhJIltJTgNOBEkjW0lOBE4FSVcQAU4FSYEQVU4FgRFbTL5ISU4FIltJTgVLBEsBDkQiJxFlTE4GREsEEk4ESwFLBB1LApdJTgNOBUsDTwUdTwKXSU4ETEsCCU4DTwJMCUwiJwllTElOAk4DRA5EIklLEQxBAERJIwsrSwEjuiJbSU4CRRsjCEsLTFtJRRwNQQAgSxhLGglLBh0ll0lFHEEAEEkWJwpMUL5EFzEASxyI+wNJJAhFAUL/tUsKQAEQIicEZURLBgknBExnIicJZURLBgknCUxnSw1LDUsSSwqI+cpFE0sGQQDYIiInCGVESxRPAgkJSUUYJwhMZyJFFiJFFSJFAUlLEQxBAFJJIwsoSwEjuiJbSUsIHUsFl0lFG0xLAQlJFihPBE8CuyEECksYCEsXSwEIRRhJHUwUREsWCEUWQQAQSRYnCkxQvkQXMQBLGYj6X0kkCEUBQv+nJwZLFmcnB0sVZ0sGQQAKSw+8SEsOvEgkQ0sISxIJSwQWSwQWTwIWSU4DRR9QSw1QTFBLEEy/IkUBSUsRDEEAGEcCIwsrTCO6VwAISx1MUEUdJAhFAUL/4UsOSbxISxy/Qv+0SwNLA0sSSwqI+OBC/xtLDUsNSwmI+QFFFEsGQQAfIiInDWVESxVPAgkJJw1MZyInDmVESwUJJw5MZ0L+zUsDSwNLCYj40kL/1oAASTYaAUkVIxJEFzYaAkkVIxJEFzYaA0kVIxJEFzYaBEkVIxJEF0lOBDYaBUkVIxJEFyInBWVEFEQiKmVEJBJEIicMZUQiKWVETEsBEkRLBUsFE0RLBUsBDERLBA1ESwEOREsDFicKTFC+RBdLAxYnCkxQvkQXTgVLAoj4hiInEmVESwIdIQWXSU4FTwJLAQkiJwhlRE8FIwtJTgYoSwEjuiJbTwYjCyhLASO6IltLB0sBDkRLAiEECksFCEsBIQQKSwYITwRLBwhPA0sJCUsBIQQKSwcISwEhBApPCAgiJwZlRE8JIQQKCE8KIQQKCSInB2VESwNPBB1MFEQISwZPBx1MFEQJSwJPAx1MFEQISwRPBR1MFEQJIillRCInBGVEIicNZUQiJw5lRCInEWVEIicTZURLB0sHTgdOB4j38ERPAxYoTwZPArtPAhYoTwRPArsnBk8CZycHTGdBAC0iJwllTElOAkUHREEAH0sBJR1LBpdJRQdBABIrSwFJTgIjuiJbSwcIFitOArtLA0EACUsCMQBLBYj4ECRDIkcDgABHBjYaAUkVIxJEFzYaAkkVIxJEFzYaA0kVIxJEFzYaBEkiWYECCEsBFRJENhoFSRUjEkQXTgQiJwVlRBREIiplRCQSRCInDGVEIillRExLARJESwRLBBNESwRLAQxESwMNREsDFicKTFC+RBdLAxYnCkxQvkQXTgVLAoj25SInEmVESwIdIQWXSU4FTwJMCU4DVwIASU4DFUlESYEZGBREgRkKTgIiKWVMTgNEIicRZUxOA0QiJxNlTE4DRCInCGVMTgNEIicEZUxOA0QiJw1lTE4DRCInDmVMTgNETCMLSU4CKEwjuiJbTCMLSShMI7oiWyInBmVEIicHZUQiRwJJSxEMQQGwSYEZC0sSSU4CSwFbSwEjCEsDTFtJTgRFH0sBgRAISwNMW0lOBUUfTIEYCE8CTFVFH0lESwVLAQhJRQdLFg5ESwpJIQQKSxFJTgIISwtJTgIhBApLAwhLBksDDkRPBEsFCElFEE8DSwYJSU4CRQ4hBApLBAhMIQQKTwQITwQhBApLCwhPBSEECglFCksBTwIdTBRESwgISwNPBB1MFEQJSwFPAh1MFEQISwFPAh1MFEQJRQWB////////////ARNBAKUiJxBlREsaSU8CDEQWJw9MUElFIEm9RQFEvkhJRR9JVwAIRSJJIltFGElXCAhFIUkjW0UZgRBVSxwkEkEAihRESwtLF0lOAglFDUsYSU4CSxGI9RFLDAhFDEsKCEUKSxsWSZMjDkRXBwFLHlcRCEsiSyJQTwJQTFBLH0y/SwtBACRLBEsOHSWXSUsLSU4DD0RMCSUdSw2XSxglHUsZl4j0gCEFDkRLBEsESxFLDksOSw5LFEsUiPUPREsBSxsIRQJJJAhFAUL+byQSREsWSUsZSU4DSxKI9I1LDk8CCEUOSwxMCUUMSwpMCUUKQv9wSwJLExJESwFLFg9ESwcWKEsKTwK7SwUWKEsITwK7JwZLBWcnB0sEZycESwxnJw1LC2cnDksKZ0sTQQAtIicJZUxJTgJFG0RBAB9LEyUdSxqXSUUeQQASK0sJSU4CI7oiW0seCBYrTgK7SwFBAAlLFDEASwOI9NwkQyIpZUQWIicEZUQWIicNZUQWIicOZUQWIicRZUQWIicTZUQWIicQZUQWIicSZUQWIicIZUQWIicFZUQWIicGZUQWIicHZUQWIicJZUQWIQQWTw1PDVBPDFBPC1BPClBPCVBPCFBPB1BPBlBPBVBPBFBPA1BPAlBMUCcLTFCwJEM2GgFJFSMSRBcWJw9MUEm9RQFEvkgnC0xQsCRDNhoBSRWBIBJENhoCSRUjEkQXFkxLAVAnFExQSb1FAUQnD08CUEm9RQFEvkhJIltMgRFbSURPAr5IIltPAksBHU8Dl0wWTBZQJwtMULAkQyIqZUQkEkQovkRJFRZXBgJMUCcLTFCwJEMiKmVEJBJEK75ESRUWVwYCTFAnC0xQsCRDIiplRCQSRCIpZUSAACJJSwMMQQAYRwIWJwpMUL5EFxZLA0xQRQMkCEUBQv/hSwFJFRZXBgJMUCcLTFCwJEOAAEcCNhoBSRWBIBJENhoCSRUjEkQXFkxLAVAnFExQSb1FAUQnD08CUEm9RQFEvkhJIltMgRFbSURPAr5ISU4DIltPAh1PApciKWVEgAAiSUsDDEEAPEkjCytLASO6IltJTgJFCCMISwZMW0lFCSJFCg1BAAxLBUsHCUsEHSWXRQhLBxZLAkxQRQJJJAhFAUL/vUsBSRUWVwYCTFAnC0xQsCRDIkmAADYaAUkVIxJEFzYaAkkVIxJEF4ACAAAiJxBlRCJJSwQMQQBgSwRLAQhJRQdLAgxBAEpLBRZJRQgnD0xQSUUJvUUBQQA3Swe+RElXAAhLAVcICEsCVxABTwNXEQhLCk8EUE8DUE8CUExQSwNJTwJQTCJZJAgWVwYCXABFA0kkCEUBQv+ZJwtLA1CwJEM2GgFJFSMSRBc2GgJJFSMSRBciKmVEJBJEIillREsCSwEMREsBDURKE0QiJwhlRCInBGVETwMjCyhMI7oiWyEECksCCE8DIwsoTCO6IlshBApPAwhLAksCDURLAksBDURLAk8CCU4CCUwlHU8ClxYnC0xQsCRD", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, "minor": 7, "patch": 1 } }, "events": [], "templateVariables": {} }