{ "name": "AlgoSafe", "structs": { "Object78E87395": [ { "name": "groupId", "type": "uint64" }, { "name": "account", "type": "address" } ], "Object9F556C53": [ { "name": "proposalId", "type": "uint64" }, { "name": "account", "type": "address" } ], "AdminChange": [ { "name": "changeType", "type": "uint64" }, { "name": "targetGroupId", "type": "uint64" }, { "name": "groupName", "type": "string" }, { "name": "memberAddr", "type": "address" }, { "name": "memberType", "type": "uint64" }, { "name": "memberLabel", "type": "string" }, { "name": "threshold", "type": "uint64" }, { "name": "adminPrivileges", "type": "uint64" }, { "name": "allowedActions", "type": "uint64" }, { "name": "limitAssetId", "type": "uint64" }, { "name": "dailyLimit", "type": "uint64" }, { "name": "monthlyLimit", "type": "uint64" }, { "name": "cooldownRounds", "type": "uint64" }, { "name": "activeFlag", "type": "uint64" } ], "Approval": [ { "name": "signer", "type": "address" }, { "name": "round", "type": "uint64" } ], "Member": [ { "name": "accountType", "type": "uint64" }, { "name": "label", "type": "string" }, { "name": "addr", "type": "address" } ], "Proposal": [ { "name": "groupId", "type": "uint64" }, { "name": "status", "type": "uint64" }, { "name": "payloadType", "type": "uint64" }, { "name": "approvalsCount", "type": "uint64" }, { "name": "threshold", "type": "uint64" }, { "name": "expiryRound", "type": "uint64" }, { "name": "proposer", "type": "address" }, { "name": "numPayloads", "type": "uint64" }, { "name": "epochAtCreation", "type": "uint64" } ], "SignerGroup": [ { "name": "name", "type": "string" }, { "name": "threshold", "type": "uint64" }, { "name": "memberCount", "type": "uint64" }, { "name": "adminPrivileges", "type": "uint64" }, { "name": "allowedActions", "type": "uint64" }, { "name": "limitAssetId", "type": "uint64" }, { "name": "dailyLimit", "type": "uint64" }, { "name": "dailyUsage", "type": "uint64" }, { "name": "dailyPeriodStart", "type": "uint64" }, { "name": "monthlyLimit", "type": "uint64" }, { "name": "monthlyUsage", "type": "uint64" }, { "name": "monthlyPeriodStart", "type": "uint64" }, { "name": "cooldownRounds", "type": "uint64" }, { "name": "lastExecutionRound", "type": "uint64" }, { "name": "membershipEpoch", "type": "uint64" }, { "name": "active", "type": "uint64" } ] }, "methods": [ { "name": "createApplication", "args": [ { "type": "string", "name": "name" } ], "returns": { "type": "void" }, "actions": { "create": [ "NoOp" ], "call": [] }, "readonly": false, "desc": "Initialise the safe. The creator becomes the bootstrap admin and must call\n`bootstrap` once (after funding the app account) to create the first admin\nsigner group. The application is intentionally non-updatable and\nnon-deletable for custody safety.", "events": [ { "name": "SafeCreated", "args": [ { "type": "string", "name": "name" }, { "type": "address", "name": "creator" } ] } ], "recommendations": {} }, { "name": "bootstrap", "args": [ { "type": "string", "name": "groupName" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Genesis bootstrap: create the first admin signer group as a 1-of-1 group\nwhose sole member is the creator, with full admin privileges and all\nactions allowed. Callable exactly once, only by the creator. After this,\nevery privileged change must go through governance.\n\nRequires the app account to be funded for box MBR beforehand.", "events": [ { "name": "GroupCreated", "args": [ { "type": "uint64", "name": "groupId" }, { "type": "string", "name": "name" }, { "type": "uint64", "name": "threshold" } ] }, { "name": "MemberAdded", "args": [ { "type": "uint64", "name": "groupId" }, { "type": "address", "name": "member" }, { "type": "uint64", "name": "accountType" } ] } ], "recommendations": {} }, { "name": "proposeTransactionGroup", "args": [ { "type": "uint64", "name": "groupId" }, { "type": "(uint64,byte[])[]", "name": "payload" }, { "type": "uint64", "name": "expiryRound" }, { "type": "bool", "name": "execute" }, { "type": "uint64", "name": "ensureBudgetValue" } ], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Create a transaction-group proposal from the first payload chunk. When the\ntotal number of transactions exceeds the ~2 KB per-ABI-argument limit, call\nappendTransactionGroupPayload (once per extra chunk, slots 2\u20136) before the\nproposal is approved and executed. Stores the payload at slot 1.\n\nWhen `execute` is true, attempts to execute the proposal immediately after\ncreating it \u2014 this only succeeds if the signer group's threshold is 1 (so\nthe proposer's auto-approval alone satisfies it) and the transactions fall\nwithin the group's spending limits, letting a single app call both propose\nand execute a transaction group.", "events": [ { "name": "ProposalCreated", "args": [ { "type": "uint64", "name": "proposalId" }, { "type": "uint64", "name": "groupId" }, { "type": "uint64", "name": "payloadType" }, { "type": "address", "name": "proposer" } ] }, { "name": "ProposalApproved", "args": [ { "type": "uint64", "name": "proposalId" }, { "type": "address", "name": "signer" }, { "type": "uint64", "name": "approvalsCount" } ] }, { "name": "GroupCreated", "args": [ { "type": "uint64", "name": "groupId" }, { "type": "string", "name": "name" }, { "type": "uint64", "name": "threshold" } ] }, { "name": "MemberAdded", "args": [ { "type": "uint64", "name": "groupId" }, { "type": "address", "name": "member" }, { "type": "uint64", "name": "accountType" } ] }, { "name": "MemberRemoved", "args": [ { "type": "uint64", "name": "groupId" }, { "type": "address", "name": "member" } ] }, { "name": "GroupUpdated", "args": [ { "type": "uint64", "name": "groupId" } ] }, { "name": "ProposalExecuted", "args": [ { "type": "uint64", "name": "proposalId" } ] } ], "recommendations": {} }, { "name": "appendTransactionGroupPayload", "args": [ { "type": "uint64", "name": "proposalId" }, { "type": "uint64", "name": "payloadIndex" }, { "type": "(uint64,byte[])[]", "name": "payload" }, { "type": "uint64", "name": "ensureBudgetValue" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Append an additional payload chunk (slots 2\u20136) to an existing transaction-group\nproposal. Callable only by the original proposer while they remain a *current*\nmember of the group, and only while `approvalsCount === 1` (i.e. no one but the\nproposer's own auto-approval has approved yet). This closes the window for a\nmember to alter the executed transaction set after an independent signer has\napproved the proposal as it existed at that time \u2014 see the `approveProposal` /\n`_executeProposalInternal` comments for how approvals are bound to a payload.\nThe membership check also prevents a member removed from the group after\nproposing from continuing to rewrite their own now-orphaned proposal.", "events": [], "recommendations": {} }, { "name": "proposeAdminChange", "args": [ { "type": "uint64", "name": "groupId" }, { "type": "(uint64,uint64,string,address,uint64,string,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "struct": "AdminChange", "name": "change" }, { "type": "uint64", "name": "expiryRound" }, { "type": "uint64", "name": "ensureBudgetValue" } ], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Create a governed signer-group administration proposal.", "events": [ { "name": "ProposalCreated", "args": [ { "type": "uint64", "name": "proposalId" }, { "type": "uint64", "name": "groupId" }, { "type": "uint64", "name": "payloadType" }, { "type": "address", "name": "proposer" } ] }, { "name": "ProposalApproved", "args": [ { "type": "uint64", "name": "proposalId" }, { "type": "address", "name": "signer" }, { "type": "uint64", "name": "approvalsCount" } ] } ], "recommendations": {} }, { "name": "approveProposal", "args": [ { "type": "uint64", "name": "proposalId" }, { "type": "uint64", "name": "ensureBudgetValue" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Record the caller's approval of a proposal.", "events": [ { "name": "ProposalApproved", "args": [ { "type": "uint64", "name": "proposalId" }, { "type": "address", "name": "signer" }, { "type": "uint64", "name": "approvalsCount" } ] } ], "recommendations": {} }, { "name": "executeProposal", "args": [ { "type": "uint64", "name": "proposalId" }, { "type": "uint64", "name": "ensureBudgetValue" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Execute a proposal once its threshold has been met.", "events": [ { "name": "GroupCreated", "args": [ { "type": "uint64", "name": "groupId" }, { "type": "string", "name": "name" }, { "type": "uint64", "name": "threshold" } ] }, { "name": "MemberAdded", "args": [ { "type": "uint64", "name": "groupId" }, { "type": "address", "name": "member" }, { "type": "uint64", "name": "accountType" } ] }, { "name": "MemberRemoved", "args": [ { "type": "uint64", "name": "groupId" }, { "type": "address", "name": "member" } ] }, { "name": "GroupUpdated", "args": [ { "type": "uint64", "name": "groupId" } ] }, { "name": "ProposalExecuted", "args": [ { "type": "uint64", "name": "proposalId" } ] } ], "recommendations": {} }, { "name": "cancelProposal", "args": [ { "type": "uint64", "name": "proposalId" }, { "type": "uint64", "name": "ensureBudgetValue" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Cancel a pending proposal. Allowed for the proposer or any member of the proposal's group.", "events": [ { "name": "ProposalCancelled", "args": [ { "type": "uint64", "name": "proposalId" } ] } ], "recommendations": {} }, { "name": "pruneProposal", "args": [ { "type": "uint64", "name": "proposalId" }, { "type": "uint64", "name": "ensureBudgetValue" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Reclaim box MBR for a proposal that finished (EXECUTED/CANCELLED) and is\npast its expiry round, by deleting its proposal record and any\ntransaction-group/admin payload boxes. Callable by any member of the\nproposal's group. Approval boxes (keyed per-signer, with no on-chain list\nof who approved) are not deleted here.", "events": [], "recommendations": {} }, { "name": "getConfig", "args": [ { "type": "uint64", "name": "ensureBudgetValue" } ], "returns": { "type": "(string,uint64,uint64,uint64,uint64,string)" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "events": [], "recommendations": {} }, { "name": "getSignerGroup", "args": [ { "type": "uint64", "name": "groupId" }, { "type": "uint64", "name": "ensureBudgetValue" } ], "returns": { "type": "(string,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)", "struct": "SignerGroup" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "events": [], "recommendations": {} }, { "name": "getProposal", "args": [ { "type": "uint64", "name": "proposalId" }, { "type": "uint64", "name": "ensureBudgetValue" } ], "returns": { "type": "(uint64,uint64,uint64,uint64,uint64,uint64,address,uint64,uint64)", "struct": "Proposal" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "events": [], "recommendations": {} }, { "name": "getTransactionGroup", "args": [ { "type": "uint64", "name": "proposalId" }, { "type": "uint64", "name": "payloadIndex" }, { "type": "uint64", "name": "ensureBudgetValue" } ], "returns": { "type": "(uint64,byte[])[]" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "events": [], "recommendations": {} }, { "name": "getMember", "args": [ { "type": "uint64", "name": "groupId" }, { "type": "address", "name": "account" }, { "type": "uint64", "name": "ensureBudgetValue" } ], "returns": { "type": "(uint64,string,address)", "struct": "Member" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "events": [], "recommendations": {} }, { "name": "isMember", "args": [ { "type": "uint64", "name": "groupId" }, { "type": "address", "name": "account" }, { "type": "uint64", "name": "ensureBudgetValue" } ], "returns": { "type": "bool" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "events": [], "recommendations": {} }, { "name": "hasApproved", "args": [ { "type": "uint64", "name": "proposalId" }, { "type": "address", "name": "account" }, { "type": "uint64", "name": "ensureBudgetValue" } ], "returns": { "type": "bool" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "events": [], "recommendations": {} }, { "name": "getActivePrivGroupCount", "args": [ { "type": "uint64", "name": "ensureBudgetValue" } ], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Count of active signer groups currently holding PRIV_GROUP. Never reaches 0.", "events": [], "recommendations": {} } ], "arcs": [ 22, 28 ], "networks": {}, "state": { "schema": { "global": { "ints": 6, "bytes": 3 }, "local": { "ints": 0, "bytes": 0 } }, "keys": { "global": { "name": { "keyType": "AVMString", "valueType": "AVMString", "key": "bmFtZQ==" }, "creator": { "keyType": "AVMString", "valueType": "address", "key": "Y3JlYXRvcg==" }, "bootstrapped": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "Ym9vdA==" }, "nextGroupId": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "bmdpZA==" }, "nextProposalId": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "bnBpZA==" }, "groupCount": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "Z2NudA==" }, "paused": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "cGF1c2Vk" }, "version": { "keyType": "AVMString", "valueType": "AVMString", "key": "dmVy" }, "activePrivGroupCount": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "YXBnYw==" } }, "local": {}, "box": {} }, "maps": { "global": {}, "local": {}, "box": { "groups": { "keyType": "uint64", "valueType": "SignerGroup", "prefix": "Zw==" }, "members": { "keyType": "Object78E87395", "valueType": "Member", "prefix": "bQ==" }, "proposals": { "keyType": "uint64", "valueType": "Proposal", "prefix": "cA==" }, "approvals": { "keyType": "Object9F556C53", "valueType": "Approval", "prefix": "YQ==" }, "transactionGroups": { "keyType": "uint64", "valueType": "(uint64,byte[])[]", "prefix": "dHhn" }, "adminPayloads": { "keyType": "uint64", "valueType": "AdminChange", "prefix": "ZHA=" } } } }, "bareActions": { "create": [], "call": [] }, "sourceInfo": { "approval": { "sourceInfo": [ { "pc": [ 1061, 1251, 1593, 1775, 1901, 2182, 2226, 2285, 2341, 2563, 2594, 2759, 3549, 4657, 5148, 5276, 5397, 5534 ], "errorMessage": "Box must have value" }, { "pc": [ 113 ], "errorMessage": "OnCompletion must be NoOp" }, { "pc": [ 3450 ], "errorMessage": "acfg not allowed" }, { "pc": [ 5028 ], "errorMessage": "already a member" }, { "pc": [ 1657 ], "errorMessage": "already approved" }, { "pc": [ 452 ], "errorMessage": "already bootstrapped" }, { "pc": [ 3358 ], "errorMessage": "app args total length exceeded" }, { "pc": [ 3198 ], "errorMessage": "app update not supported" }, { "pc": [ 3185 ], "errorMessage": "appId required" }, { "pc": [ 3180 ], "errorMessage": "appl not allowed" }, { "pc": [ 3036 ], "errorMessage": "asset close target required" }, { "pc": [ 3018 ], "errorMessage": "asset receiver required" }, { "pc": [ 3010 ], "errorMessage": "axfer not allowed" }, { "pc": [ 1111 ], "errorMessage": "cannot modify payload after independent approval" }, { "pc": [ 443, 450, 459, 628, 825, 2053, 2058, 2063, 2068, 2073, 2078, 2499, 2546, 4683, 4941, 4956, 5461, 5514, 5596, 5651, 5685, 6180, 6217 ], "errorMessage": "check GlobalState exists" }, { "pc": [ 2890 ], "errorMessage": "close target required" }, { "pc": [ 1315, 1465 ], "errorMessage": "cooldown too large" }, { "pc": [ 6065 ], "errorMessage": "daily limit exceeded" }, { "pc": [ 1043 ], "errorMessage": "empty payload" }, { "pc": [ 816 ], "errorMessage": "empty tx group" }, { "pc": [ 5673 ], "errorMessage": "expiry must be in the future" }, { "pc": [ 1292 ], "errorMessage": "first member required" }, { "pc": [ 6120 ], "errorMessage": "group admin required" }, { "pc": [ 2688 ], "errorMessage": "group cooldown not elapsed" }, { "pc": [ 844, 1258, 2601 ], "errorMessage": "group disabled" }, { "pc": [ 1672, 2645 ], "errorMessage": "group membership changed since proposal creation" }, { "pc": [ 2520 ], "errorMessage": "group not found" }, { "pc": [ 2831, 2977, 3145, 3319, 3416, 3622, 3762, 3897, 4020, 4091, 4225, 4368 ], "errorMessage": "index access is out of bounds" }, { "pc": [ 1300, 1457 ], "errorMessage": "invalid actions" }, { "pc": [ 718, 952 ], "errorMessage": "invalid array encoding" }, { "pc": [ 317, 426, 688, 745, 922, 979, 1183, 1204, 2814, 2960, 3128, 3219, 3238, 3252, 3266, 3399, 3605, 3745, 3880, 4003, 4069, 4120, 4163, 4208, 4351, 5895 ], "errorMessage": "invalid array length header" }, { "pc": [ 785 ], "errorMessage": "invalid number of bytes for arc4.bool" }, { "pc": [ 324, 433 ], "errorMessage": "invalid number of bytes for arc4.dynamic_array" }, { "pc": [ 766, 1000 ], "errorMessage": "invalid number of bytes for arc4.dynamic_array" }, { "pc": [ 2309, 2365, 2429 ], "errorMessage": "invalid number of bytes for arc4.static_array" }, { "pc": [ 680, 774, 797, 904, 914, 1008, 1158, 1217, 1226, 1554, 1563, 1693, 1702, 1733, 1742, 1859, 1868, 2036, 2153, 2162, 2196, 2205, 2240, 2249, 2258, 2299, 2317, 2355, 2373, 2419, 2437, 2483 ], "errorMessage": "invalid number of bytes for arc4.uint64" }, { "pc": [ 1209 ], "errorMessage": "invalid number of bytes for smart_contracts/algo_safe/contract.algo.ts::AdminChange" }, { "pc": [ 3194 ], "errorMessage": "invalid onCompletion" }, { "pc": [ 1308, 1499 ], "errorMessage": "invalid privileges" }, { "pc": [ 1040 ], "errorMessage": "invalid slot" }, { "pc": [ 741, 975 ], "errorMessage": "invalid tail pointer at index 1 of (uint64,(len+uint8[]))" }, { "pc": [ 1175 ], "errorMessage": "invalid tail pointer at index 2 of (uint64,uint64,(len+utf8[]),uint8[32],uint64,(len+utf8[]),uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)" }, { "pc": [ 1196 ], "errorMessage": "invalid tail pointer at index 5 of (uint64,uint64,(len+utf8[]),uint8[32],uint64,(len+utf8[]),uint64,uint64,uint64,uint64,uint64,uint64,uint64,uint64)" }, { "pc": [ 726, 960 ], "errorMessage": "invalid tail pointer for (len+(uint64,(len+uint8[]))[])" }, { "pc": [ 736, 970, 1170, 1191 ], "errorMessage": "invalid tuple encoding" }, { "pc": [ 3381 ], "errorMessage": "keyreg not allowed" }, { "pc": [ 1370 ], "errorMessage": "member required" }, { "pc": [ 3480 ], "errorMessage": "metadataHash must be 0 or 32 bytes" }, { "pc": [ 6012 ], "errorMessage": "monthly limit exceeded" }, { "pc": [ 1508, 1540, 5415, 5552 ], "errorMessage": "must keep at least one active group admin" }, { "pc": [ 4695 ], "errorMessage": "new group starts with one member" }, { "pc": [ 1643, 2531 ], "errorMessage": "not a group member" }, { "pc": [ 5141 ], "errorMessage": "not a member" }, { "pc": [ 1068 ], "errorMessage": "not a tx group" }, { "pc": [ 1612 ], "errorMessage": "not approvable" }, { "pc": [ 1821 ], "errorMessage": "not authorised to cancel" }, { "pc": [ 1794 ], "errorMessage": "not cancellable" }, { "pc": [ 2569 ], "errorMessage": "not ready to execute" }, { "pc": [ 1934 ], "errorMessage": "not yet expired" }, { "pc": [ 445 ], "errorMessage": "only creator can bootstrap" }, { "pc": [ 1104 ], "errorMessage": "only proposer can append" }, { "pc": [ 2864 ], "errorMessage": "pay not allowed" }, { "pc": [ 6109 ], "errorMessage": "policy admin required" }, { "pc": [ 1624, 2578 ], "errorMessage": "proposal expired" }, { "pc": [ 1087 ], "errorMessage": "proposal not pending" }, { "pc": [ 1922 ], "errorMessage": "proposal not terminal" }, { "pc": [ 2872 ], "errorMessage": "receiver required" }, { "pc": [ 827, 2548 ], "errorMessage": "safe paused" }, { "pc": [ 1362, 1396, 1420, 1449, 1490, 1531 ], "errorMessage": "target group not found" }, { "pc": [ 1284, 1425 ], "errorMessage": "threshold >= 1" }, { "pc": [ 5237 ], "errorMessage": "threshold exceeds members" }, { "pc": [ 2631 ], "errorMessage": "threshold not met" }, { "pc": [ 3278 ], "errorMessage": "too many accounts" }, { "pc": [ 3272 ], "errorMessage": "too many app args" }, { "pc": [ 3283 ], "errorMessage": "too many foreign apps" }, { "pc": [ 3287 ], "errorMessage": "too many foreign assets" }, { "pc": [ 3294 ], "errorMessage": "too many references" }, { "pc": [ 820 ], "errorMessage": "too many txs" }, { "pc": [ 1517 ], "errorMessage": "unknown change type" }, { "pc": [ 3390 ], "errorMessage": "unknown tx type" }, { "pc": [ 5167 ], "errorMessage": "would drop below threshold" } ], "pcOffsetMethod": "none" }, "clear": { "sourceInfo": [], "pcOffsetMethod": "none" } }, "source": { "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCAxIDggMiAxNjggMTAwMDAwMDAKICAgIGJ5dGVjYmxvY2sgImciICIiICJhcGdjIiAweDE1MWY3Yzc1ICJtIiAicCIgIm5naWQiICJnY250IiAidHhnIiAibnBpZCIgInBhdXNlZCIgMHg3YzYwNTllNiAiYm9vdCIgMHhkMDcwNTA3YSAiZHAiICJhIiAweDA2ODEwMSAibmFtZSIgImNyZWF0b3IiICJ2ZXIiIDB4MDAxMiAweDBjZDczNTdjIDB4MDAyYQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjI1OAogICAgLy8gZXhwb3J0IGNsYXNzIEFsZ29TYWZlIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBieiBtYWluX2NyZWF0ZV9Ob09wQDIwCiAgICBwdXNoYnl0ZXNzIDB4OTE0YmE2MzMgMHhhYzNhOWEzMiAweDQ0MjQ0NWY3IDB4ZGNlZTQ0MjcgMHgxZjc2OGM3OSAweGZiNzA4OGU4IDB4N2Y1MWZjMjggMHhkY2FkZmY5NiAweGI2YjdhZWFkIDB4ZDFjYzJiYjYgMHhhYmExMjcyYSAweGY5Y2I0YTM3IDB4NjVhYWEwZWQgMHhjYmQ3MzI0MiAweDUwMzQxNjE3IDB4ZjRmYTU0NGMgLy8gbWV0aG9kICJib290c3RyYXAoc3RyaW5nKXZvaWQiLCBtZXRob2QgInByb3Bvc2VUcmFuc2FjdGlvbkdyb3VwKHVpbnQ2NCwodWludDY0LGJ5dGVbXSlbXSx1aW50NjQsYm9vbCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJhcHBlbmRUcmFuc2FjdGlvbkdyb3VwUGF5bG9hZCh1aW50NjQsdWludDY0LCh1aW50NjQsYnl0ZVtdKVtdLHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJwcm9wb3NlQWRtaW5DaGFuZ2UodWludDY0LCh1aW50NjQsdWludDY0LHN0cmluZyxhZGRyZXNzLHVpbnQ2NCxzdHJpbmcsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCksdWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgImFwcHJvdmVQcm9wb3NhbCh1aW50NjQsdWludDY0KXZvaWQiLCBtZXRob2QgImV4ZWN1dGVQcm9wb3NhbCh1aW50NjQsdWludDY0KXZvaWQiLCBtZXRob2QgImNhbmNlbFByb3Bvc2FsKHVpbnQ2NCx1aW50NjQpdm9pZCIsIG1ldGhvZCAicHJ1bmVQcm9wb3NhbCh1aW50NjQsdWludDY0KXZvaWQiLCBtZXRob2QgImdldENvbmZpZyh1aW50NjQpKHN0cmluZyx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsc3RyaW5nKSIsIG1ldGhvZCAiZ2V0U2lnbmVyR3JvdXAodWludDY0LHVpbnQ2NCkoc3RyaW5nLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSIsIG1ldGhvZCAiZ2V0UHJvcG9zYWwodWludDY0LHVpbnQ2NCkodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsYWRkcmVzcyx1aW50NjQsdWludDY0KSIsIG1ldGhvZCAiZ2V0VHJhbnNhY3Rpb25Hcm91cCh1aW50NjQsdWludDY0LHVpbnQ2NCkodWludDY0LGJ5dGVbXSlbXSIsIG1ldGhvZCAiZ2V0TWVtYmVyKHVpbnQ2NCxhZGRyZXNzLHVpbnQ2NCkodWludDY0LHN0cmluZyxhZGRyZXNzKSIsIG1ldGhvZCAiaXNNZW1iZXIodWludDY0LGFkZHJlc3MsdWludDY0KWJvb2wiLCBtZXRob2QgImhhc0FwcHJvdmVkKHVpbnQ2NCxhZGRyZXNzLHVpbnQ2NClib29sIiwgbWV0aG9kICJnZXRBY3RpdmVQcml2R3JvdXBDb3VudCh1aW50NjQpdWludDY0IgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggYm9vdHN0cmFwIHByb3Bvc2VUcmFuc2FjdGlvbkdyb3VwIGFwcGVuZFRyYW5zYWN0aW9uR3JvdXBQYXlsb2FkIHByb3Bvc2VBZG1pbkNoYW5nZSBhcHByb3ZlUHJvcG9zYWwgZXhlY3V0ZVByb3Bvc2FsIGNhbmNlbFByb3Bvc2FsIHBydW5lUHJvcG9zYWwgZ2V0Q29uZmlnIGdldFNpZ25lckdyb3VwIGdldFByb3Bvc2FsIGdldFRyYW5zYWN0aW9uR3JvdXAgZ2V0TWVtYmVyIGlzTWVtYmVyIGhhc0FwcHJvdmVkIGdldEFjdGl2ZVByaXZHcm91cENvdW50CiAgICBlcnIKCm1haW5fY3JlYXRlX05vT3BAMjA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MjU4CiAgICAvLyBleHBvcnQgY2xhc3MgQWxnb1NhZmUgZXh0ZW5kcyBDb250cmFjdCB7CiAgICBwdXNoYnl0ZXMgMHgxMTU3NTZkYiAvLyBtZXRob2QgImNyZWF0ZUFwcGxpY2F0aW9uKHN0cmluZyl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggY3JlYXRlQXBwbGljYXRpb24KICAgIGVycgoKCi8vIF9wdXlhX2xpYi51dGlsLmVuc3VyZV9idWRnZXQocmVxdWlyZWRfYnVkZ2V0OiB1aW50NjQsIGZlZV9zb3VyY2U6IHVpbnQ2NCkgLT4gdm9pZDoKZW5zdXJlX2J1ZGdldDoKICAgIHByb3RvIDIgMAogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDEwIC8vIDEwCiAgICArCgplbnN1cmVfYnVkZ2V0X3doaWxlX3RvcEAxOgogICAgZnJhbWVfZGlnIDAKICAgIGdsb2JhbCBPcGNvZGVCdWRnZXQKICAgID4KICAgIGJ6IGVuc3VyZV9idWRnZXRfYWZ0ZXJfd2hpbGVANgogICAgaXR4bl9iZWdpbgogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIHB1c2hpbnQgNSAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIGJ5dGVjIDE2IC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbQogICAgYnl0ZWMgMTYgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW0KICAgIGZyYW1lX2RpZyAtMQogICAgc3dpdGNoIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMEAzIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMUA0CgplbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlX25leHRANToKICAgIGl0eG5fc3VibWl0CiAgICBiIGVuc3VyZV9idWRnZXRfd2hpbGVfdG9wQDEKCmVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMUA0OgogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgaXR4bl9maWVsZCBGZWUKICAgIGIgZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV9uZXh0QDUKCmVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMEAzOgogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBiIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfbmV4dEA1CgplbnN1cmVfYnVkZ2V0X2FmdGVyX3doaWxlQDY6CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OkFsZ29TYWZlLmNyZWF0ZUFwcGxpY2F0aW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKY3JlYXRlQXBwbGljYXRpb246CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MjkyCiAgICAvLyBwdWJsaWMgY3JlYXRlQXBwbGljYXRpb24obmFtZTogc3RyaW5nKTogdm9pZCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzMgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjI2MAogICAgLy8gbmFtZSA9IEdsb2JhbFN0YXRlPHN0cmluZz4oeyBrZXk6ICduYW1lJyB9KQogICAgYnl0ZWMgMTcgLy8gIm5hbWUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MjkzCiAgICAvLyB0aGlzLm5hbWUudmFsdWUgPSBuYW1lCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoyNjEKICAgIC8vIGNyZWF0b3IgPSBHbG9iYWxTdGF0ZTxBY2NvdW50Pih7IGtleTogJ2NyZWF0b3InIH0pCiAgICBieXRlYyAxOCAvLyAiY3JlYXRvciIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoyOTQKICAgIC8vIHRoaXMuY3JlYXRvci52YWx1ZSA9IFR4bi5zZW5kZXIKICAgIHR4biBTZW5kZXIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MjYyCiAgICAvLyBib290c3RyYXBwZWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnYm9vdCcgfSkKICAgIGJ5dGVjIDEyIC8vICJib290IgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjI5NQogICAgLy8gdGhpcy5ib290c3RyYXBwZWQudmFsdWUgPSBVaW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjI2MwogICAgLy8gbmV4dEdyb3VwSWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnbmdpZCcgfSkKICAgIGJ5dGVjIDYgLy8gIm5naWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6Mjk2CiAgICAvLyB0aGlzLm5leHRHcm91cElkLnZhbHVlID0gVWludDY0KDEpCiAgICBpbnRjXzEgLy8gMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoyNjQKICAgIC8vIG5leHRQcm9wb3NhbElkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ25waWQnIH0pCiAgICBieXRlYyA5IC8vICJucGlkIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjI5NwogICAgLy8gdGhpcy5uZXh0UHJvcG9zYWxJZC52YWx1ZSA9IFVpbnQ2NCgxKQogICAgaW50Y18xIC8vIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MjY1CiAgICAvLyBncm91cENvdW50ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ2djbnQnIH0pCiAgICBieXRlYyA3IC8vICJnY250IgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjI5OAogICAgLy8gdGhpcy5ncm91cENvdW50LnZhbHVlID0gVWludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoyNjYKICAgIC8vIHBhdXNlZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdwYXVzZWQnIH0pCiAgICBieXRlYyAxMCAvLyAicGF1c2VkIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjI5OQogICAgLy8gdGhpcy5wYXVzZWQudmFsdWUgPSBVaW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjI2NwogICAgLy8gdmVyc2lvbiA9IEdsb2JhbFN0YXRlPHN0cmluZz4oeyBrZXk6ICd2ZXInIH0pCiAgICBieXRlYyAxOSAvLyAidmVyIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjMwMAogICAgLy8gdGhpcy52ZXJzaW9uLnZhbHVlID0gQ09OVFJBQ1RfVkVSU0lPTgogICAgcHVzaGJ5dGVzICJCSUFURUMtQUxHTy1TQUZFLXYxLjQuMiIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MjcxCiAgICAvLyBhY3RpdmVQcml2R3JvdXBDb3VudCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdhcGdjJyB9KQogICAgYnl0ZWNfMiAvLyAiYXBnYyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozMDEKICAgIC8vIHRoaXMuYWN0aXZlUHJpdkdyb3VwQ291bnQudmFsdWUgPSBVaW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjMwMgogICAgLy8gZW1pdDxTYWZlQ3JlYXRlZD4oeyBuYW1lLCBjcmVhdG9yOiBUeG4uc2VuZGVyIH0pCiAgICB0eG4gU2VuZGVyCiAgICBkaWcgMQogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDAwMjIKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweGUyOWM4YjQ3IC8vIG1ldGhvZCAiU2FmZUNyZWF0ZWQoc3RyaW5nLGFkZHJlc3MpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoyOTIKICAgIC8vIHB1YmxpYyBjcmVhdGVBcHBsaWNhdGlvbihuYW1lOiBzdHJpbmcpOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OkFsZ29TYWZlLmJvb3RzdHJhcFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmJvb3RzdHJhcDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozMTMKICAgIC8vIHB1YmxpYyBib290c3RyYXAoZ3JvdXBOYW1lOiBzdHJpbmcpOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMyAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzE0CiAgICAvLyBhc3NlcnQoVHhuLnNlbmRlciA9PT0gdGhpcy5jcmVhdG9yLnZhbHVlLCAnb25seSBjcmVhdG9yIGNhbiBib290c3RyYXAnKQogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoyNjEKICAgIC8vIGNyZWF0b3IgPSBHbG9iYWxTdGF0ZTxBY2NvdW50Pih7IGtleTogJ2NyZWF0b3InIH0pCiAgICBieXRlYyAxOCAvLyAiY3JlYXRvciIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozMTQKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyID09PSB0aGlzLmNyZWF0b3IudmFsdWUsICdvbmx5IGNyZWF0b3IgY2FuIGJvb3RzdHJhcCcpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBvbmx5IGNyZWF0b3IgY2FuIGJvb3RzdHJhcAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjMxNQogICAgLy8gYXNzZXJ0KHRoaXMuYm9vdHN0cmFwcGVkLnZhbHVlID09PSBVaW50NjQoMCksICdhbHJlYWR5IGJvb3RzdHJhcHBlZCcpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjI2MgogICAgLy8gYm9vdHN0cmFwcGVkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ2Jvb3QnIH0pCiAgICBieXRlYyAxMiAvLyAiYm9vdCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozMTUKICAgIC8vIGFzc2VydCh0aGlzLmJvb3RzdHJhcHBlZC52YWx1ZSA9PT0gVWludDY0KDApLCAnYWxyZWFkeSBib290c3RyYXBwZWQnKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBhbHJlYWR5IGJvb3RzdHJhcHBlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjMxNwogICAgLy8gY29uc3Qgbm93ID0gR2xvYmFsLmxhdGVzdFRpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjMxOAogICAgLy8gY29uc3QgZ2lkOiB1aW50NjQgPSB0aGlzLm5leHRHcm91cElkLnZhbHVlCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjI2MwogICAgLy8gbmV4dEdyb3VwSWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnbmdpZCcgfSkKICAgIGJ5dGVjIDYgLy8gIm5naWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzE4CiAgICAvLyBjb25zdCBnaWQ6IHVpbnQ2NCA9IHRoaXMubmV4dEdyb3VwSWQudmFsdWUKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzIwLTMzNwogICAgLy8gY29uc3QgZ3JwOiBTaWduZXJHcm91cCA9IHsKICAgIC8vICAgbmFtZTogZ3JvdXBOYW1lLAogICAgLy8gICB0aHJlc2hvbGQ6IFVpbnQ2NCgxKSwKICAgIC8vICAgbWVtYmVyQ291bnQ6IFVpbnQ2NCgxKSwKICAgIC8vICAgYWRtaW5Qcml2aWxlZ2VzOiBQUklWX0FMTCwKICAgIC8vICAgYWxsb3dlZEFjdGlvbnM6IEFDVF9BTEwsCiAgICAvLyAgIGxpbWl0QXNzZXRJZDogVWludDY0KDApLAogICAgLy8gICBkYWlseUxpbWl0OiBVaW50NjQoMCksCiAgICAvLyAgIGRhaWx5VXNhZ2U6IFVpbnQ2NCgwKSwKICAgIC8vICAgZGFpbHlQZXJpb2RTdGFydDogbm93LAogICAgLy8gICBtb250aGx5TGltaXQ6IFVpbnQ2NCgwKSwKICAgIC8vICAgbW9udGhseVVzYWdlOiBVaW50NjQoMCksCiAgICAvLyAgIG1vbnRobHlQZXJpb2RTdGFydDogbm93LAogICAgLy8gICBjb29sZG93blJvdW5kczogVWludDY0KDApLAogICAgLy8gICBsYXN0RXhlY3V0aW9uUm91bmQ6IFVpbnQ2NCgwKSwKICAgIC8vICAgbWVtYmVyc2hpcEVwb2NoOiBVaW50NjQoMCksCiAgICAvLyAgIGFjdGl2ZTogVWludDY0KDEpLAogICAgLy8gfQogICAgZGlnIDIKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzIyCiAgICAvLyB0aHJlc2hvbGQ6IFVpbnQ2NCgxKSwKICAgIGludGNfMSAvLyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzIwLTMzNwogICAgLy8gY29uc3QgZ3JwOiBTaWduZXJHcm91cCA9IHsKICAgIC8vICAgbmFtZTogZ3JvdXBOYW1lLAogICAgLy8gICB0aHJlc2hvbGQ6IFVpbnQ2NCgxKSwKICAgIC8vICAgbWVtYmVyQ291bnQ6IFVpbnQ2NCgxKSwKICAgIC8vICAgYWRtaW5Qcml2aWxlZ2VzOiBQUklWX0FMTCwKICAgIC8vICAgYWxsb3dlZEFjdGlvbnM6IEFDVF9BTEwsCiAgICAvLyAgIGxpbWl0QXNzZXRJZDogVWludDY0KDApLAogICAgLy8gICBkYWlseUxpbWl0OiBVaW50NjQoMCksCiAgICAvLyAgIGRhaWx5VXNhZ2U6IFVpbnQ2NCgwKSwKICAgIC8vICAgZGFpbHlQZXJpb2RTdGFydDogbm93LAogICAgLy8gICBtb250aGx5TGltaXQ6IFVpbnQ2NCgwKSwKICAgIC8vICAgbW9udGhseVVzYWdlOiBVaW50NjQoMCksCiAgICAvLyAgIG1vbnRobHlQZXJpb2RTdGFydDogbm93LAogICAgLy8gICBjb29sZG93blJvdW5kczogVWludDY0KDApLAogICAgLy8gICBsYXN0RXhlY3V0aW9uUm91bmQ6IFVpbnQ2NCgwKSwKICAgIC8vICAgbWVtYmVyc2hpcEVwb2NoOiBVaW50NjQoMCksCiAgICAvLyAgIGFjdGl2ZTogVWludDY0KDEpLAogICAgLy8gfQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjMyNgogICAgLy8gbGltaXRBc3NldElkOiBVaW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjMyMC0zMzcKICAgIC8vIGNvbnN0IGdycDogU2lnbmVyR3JvdXAgPSB7CiAgICAvLyAgIG5hbWU6IGdyb3VwTmFtZSwKICAgIC8vICAgdGhyZXNob2xkOiBVaW50NjQoMSksCiAgICAvLyAgIG1lbWJlckNvdW50OiBVaW50NjQoMSksCiAgICAvLyAgIGFkbWluUHJpdmlsZWdlczogUFJJVl9BTEwsCiAgICAvLyAgIGFsbG93ZWRBY3Rpb25zOiBBQ1RfQUxMLAogICAgLy8gICBsaW1pdEFzc2V0SWQ6IFVpbnQ2NCgwKSwKICAgIC8vICAgZGFpbHlMaW1pdDogVWludDY0KDApLAogICAgLy8gICBkYWlseVVzYWdlOiBVaW50NjQoMCksCiAgICAvLyAgIGRhaWx5UGVyaW9kU3RhcnQ6IG5vdywKICAgIC8vICAgbW9udGhseUxpbWl0OiBVaW50NjQoMCksCiAgICAvLyAgIG1vbnRobHlVc2FnZTogVWludDY0KDApLAogICAgLy8gICBtb250aGx5UGVyaW9kU3RhcnQ6IG5vdywKICAgIC8vICAgY29vbGRvd25Sb3VuZHM6IFVpbnQ2NCgwKSwKICAgIC8vICAgbGFzdEV4ZWN1dGlvblJvdW5kOiBVaW50NjQoMCksCiAgICAvLyAgIG1lbWJlcnNoaXBFcG9jaDogVWludDY0KDApLAogICAgLy8gICBhY3RpdmU6IFVpbnQ2NCgxKSwKICAgIC8vIH0KICAgIGl0b2IKICAgIHVuY292ZXIgNAogICAgaXRvYgogICAgcHVzaGJ5dGVzIDB4MDA3YTAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwNzAwMDAwMDAwMDAwMDAwMWYwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzM4CiAgICAvLyB0aGlzLmdyb3VwcyhnaWQpLnZhbHVlID0gY2xvbmUoZ3JwKQogICAgZGlnIDMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoyNzQKICAgIC8vIGdyb3VwcyA9IEJveE1hcDx1aW50NjQsIFNpZ25lckdyb3VwPih7IGtleVByZWZpeDogJ2cnIH0pCiAgICBieXRlY18wIC8vICJnIgogICAgZGlnIDEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjMzOAogICAgLy8gdGhpcy5ncm91cHMoZ2lkKS52YWx1ZSA9IGNsb25lKGdycCkKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICB1bmNvdmVyIDIKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozNDAKICAgIC8vIGNvbnN0IG06IE1lbWJlciA9IHsgYWNjb3VudFR5cGU6IFVpbnQ2NCgxKSwgbGFiZWw6ICdjcmVhdG9yJywgYWRkcjogVHhuLnNlbmRlciB9CiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDAxMDAyYQogICAgdHhuIFNlbmRlcgogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHgwMDA3NjM3MjY1NjE3NDZmNzIKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM0MQogICAgLy8gdGhpcy5tZW1iZXJzKHsgZ3JvdXBJZDogZ2lkLCBhY2NvdW50OiBUeG4uc2VuZGVyIH0pLnZhbHVlID0gY2xvbmUobSkKICAgIGRpZyAxCiAgICB0eG4gU2VuZGVyCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoyNzUKICAgIC8vIG1lbWJlcnMgPSBCb3hNYXA8eyBncm91cElkOiB1aW50NjQ7IGFjY291bnQ6IEFjY291bnQgfSwgTWVtYmVyPih7IGtleVByZWZpeDogJ20nIH0pCiAgICBieXRlYyA0IC8vICJtIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzQxCiAgICAvLyB0aGlzLm1lbWJlcnMoeyBncm91cElkOiBnaWQsIGFjY291bnQ6IFR4bi5zZW5kZXIgfSkudmFsdWUgPSBjbG9uZShtKQogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozNDMKICAgIC8vIHRoaXMubmV4dEdyb3VwSWQudmFsdWUgPSBnaWQgKyBVaW50NjQoMSkKICAgIHVuY292ZXIgMwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoyNjMKICAgIC8vIG5leHRHcm91cElkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ25naWQnIH0pCiAgICBieXRlYyA2IC8vICJuZ2lkIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM0MwogICAgLy8gdGhpcy5uZXh0R3JvdXBJZC52YWx1ZSA9IGdpZCArIFVpbnQ2NCgxKQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozNDQKICAgIC8vIHRoaXMuZ3JvdXBDb3VudC52YWx1ZSA9IHRoaXMuZ3JvdXBDb3VudC52YWx1ZSArIFVpbnQ2NCgxKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoyNjUKICAgIC8vIGdyb3VwQ291bnQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnZ2NudCcgfSkKICAgIGJ5dGVjIDcgLy8gImdjbnQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzQ0CiAgICAvLyB0aGlzLmdyb3VwQ291bnQudmFsdWUgPSB0aGlzLmdyb3VwQ291bnQudmFsdWUgKyBVaW50NjQoMSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjI2NQogICAgLy8gZ3JvdXBDb3VudCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdnY250JyB9KQogICAgYnl0ZWMgNyAvLyAiZ2NudCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozNDQKICAgIC8vIHRoaXMuZ3JvdXBDb3VudC52YWx1ZSA9IHRoaXMuZ3JvdXBDb3VudC52YWx1ZSArIFVpbnQ2NCgxKQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoyNjIKICAgIC8vIGJvb3RzdHJhcHBlZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdib290JyB9KQogICAgYnl0ZWMgMTIgLy8gImJvb3QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzQ1CiAgICAvLyB0aGlzLmJvb3RzdHJhcHBlZC52YWx1ZSA9IFVpbnQ2NCgxKQogICAgaW50Y18xIC8vIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MjcxCiAgICAvLyBhY3RpdmVQcml2R3JvdXBDb3VudCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdhcGdjJyB9KQogICAgYnl0ZWNfMiAvLyAiYXBnYyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozNDcKICAgIC8vIHRoaXMuYWN0aXZlUHJpdkdyb3VwQ291bnQudmFsdWUgPSBVaW50NjQoMSkKICAgIGludGNfMSAvLyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM0OQogICAgLy8gZW1pdDxHcm91cENyZWF0ZWQ+KHsgZ3JvdXBJZDogZ2lkLCBuYW1lOiBncm91cE5hbWUsIHRocmVzaG9sZDogVWludDY0KDEpIH0pCiAgICBkdXAKICAgIGJ5dGVjIDIwIC8vIDB4MDAxMgogICAgY29uY2F0CiAgICBkaWcgMgogICAgY29uY2F0CiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgYnl0ZWMgMjEgLy8gbWV0aG9kICJHcm91cENyZWF0ZWQodWludDY0LHN0cmluZyx1aW50NjQpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozNTAKICAgIC8vIGVtaXQ8TWVtYmVyQWRkZWQ+KHsgZ3JvdXBJZDogZ2lkLCBtZW1iZXI6IFR4bi5zZW5kZXIsIGFjY291bnRUeXBlOiBVaW50NjQoMSkgfSkKICAgIHR4biBTZW5kZXIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlYyAxMyAvLyBtZXRob2QgIk1lbWJlckFkZGVkKHVpbnQ2NCxhZGRyZXNzLHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjMxMwogICAgLy8gcHVibGljIGJvb3RzdHJhcChncm91cE5hbWU6IHN0cmluZyk6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo6QWxnb1NhZmUucHJvcG9zZVRyYW5zYWN0aW9uR3JvdXBbcm91dGluZ10oKSAtPiB2b2lkOgpwcm9wb3NlVHJhbnNhY3Rpb25Hcm91cDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICIiCiAgICBkdXBuIDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozNjktMzc1CiAgICAvLyBwdWJsaWMgcHJvcG9zZVRyYW5zYWN0aW9uR3JvdXAoCiAgICAvLyAgIGdyb3VwSWQ6IHVpbnQ2NCwKICAgIC8vICAgcGF5bG9hZDogU2FmZVR4bkdyb3VwLAogICAgLy8gICBleHBpcnlSb3VuZDogdWludDY0LAogICAgLy8gICBleGVjdXRlOiBib29sZWFuLAogICAgLy8gICBlbnN1cmVCdWRnZXRWYWx1ZTogdWludDY0LAogICAgLy8gKTogdWludDY0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cG4gMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18zIC8vIDIKICAgICoKICAgIHN3YXAKICAgIGR1cAogICAgbGVuCiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18wIC8vIDAKCnByb3Bvc2VUcmFuc2FjdGlvbkdyb3VwX2Zvcl9oZWFkZXJAMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozNjktMzc1CiAgICAvLyBwdWJsaWMgcHJvcG9zZVRyYW5zYWN0aW9uR3JvdXAoCiAgICAvLyAgIGdyb3VwSWQ6IHVpbnQ2NCwKICAgIC8vICAgcGF5bG9hZDogU2FmZVR4bkdyb3VwLAogICAgLy8gICBleHBpcnlSb3VuZDogdWludDY0LAogICAgLy8gICBleGVjdXRlOiBib29sZWFuLAogICAgLy8gICBlbnN1cmVCdWRnZXRWYWx1ZTogdWludDY0LAogICAgLy8gKTogdWludDY0IHsKICAgIGR1cAogICAgZGlnIDUKICAgIDwKICAgIGJ6IHByb3Bvc2VUcmFuc2FjdGlvbkdyb3VwX2FmdGVyX2ZvckA0CiAgICBkdXBuIDIKICAgIGludGNfMyAvLyAyCiAgICAqCiAgICBkaWcgMwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGVuY29kaW5nCiAgICBkdXAKICAgIGRpZyA3CiAgICBkdXAKICAgIGNvdmVyIDQKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCB0YWlsIHBvaW50ZXIgZm9yIChsZW4rKHVpbnQ2NCwobGVuK3VpbnQ4W10pKVtdKQogICAgZGlnIDEKICAgIGxlbgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBsZW4KICAgIGRpZyAxCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgdHVwbGUgZW5jb2RpbmcKICAgIGR1cAogICAgcHVzaGludCAxMCAvLyAxMAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIHRhaWwgcG9pbnRlciBhdCBpbmRleCAxIG9mICh1aW50NjQsKGxlbit1aW50OFtdKSkKICAgIHN3YXAKICAgIHN1YnN0cmluZzMKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDEyIC8vIDEyCiAgICArCiAgICArCiAgICBidXJ5IDUKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgcHJvcG9zZVRyYW5zYWN0aW9uR3JvdXBfZm9yX2hlYWRlckAxCgpwcm9wb3NlVHJhbnNhY3Rpb25Hcm91cF9hZnRlcl9mb3JANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozNjktMzc1CiAgICAvLyBwdWJsaWMgcHJvcG9zZVRyYW5zYWN0aW9uR3JvdXAoCiAgICAvLyAgIGdyb3VwSWQ6IHVpbnQ2NCwKICAgIC8vICAgcGF5bG9hZDogU2FmZVR4bkdyb3VwLAogICAgLy8gICBleHBpcnlSb3VuZDogdWludDY0LAogICAgLy8gICBleGVjdXRlOiBib29sZWFuLAogICAgLy8gICBlbnN1cmVCdWRnZXRWYWx1ZTogdWludDY0LAogICAgLy8gKTogdWludDY0IHsKICAgIGRpZyAzCiAgICBpbnRjXzMgLy8gMgogICAgKwogICAgZGlnIDMKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OlNhZmVUeG4+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICBidXJ5IDkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBidXJ5IDEwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA1CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICBkdXAKICAgIGJ1cnkgMTIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozNzYKICAgIC8vIGlmIChlbnN1cmVCdWRnZXRWYWx1ZSA+IFVpbnQ2NCgxKSkgewogICAgaW50Y18xIC8vIDEKICAgID4KICAgIGJ6IHByb3Bvc2VUcmFuc2FjdGlvbkdyb3VwX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM3NwogICAgLy8gZW5zdXJlQnVkZ2V0KGVuc3VyZUJ1ZGdldFZhbHVlKQogICAgZGlnIDEwCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0Cgpwcm9wb3NlVHJhbnNhY3Rpb25Hcm91cF9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6Mzc5CiAgICAvLyBhc3NlcnQocGF5bG9hZC5sZW5ndGggPj0gVWludDY0KDEpLCAnZW1wdHkgdHggZ3JvdXAnKQogICAgZGlnIDQKICAgIGR1cAogICAgYXNzZXJ0IC8vIGVtcHR5IHR4IGdyb3VwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzgwCiAgICAvLyBhc3NlcnQocGF5bG9hZC5sZW5ndGggPD0gTUFYX0dST1VQX1RYTlMsICd0b28gbWFueSB0eHMnKQogICAgcHVzaGludCAxNiAvLyAxNgogICAgPD0KICAgIGFzc2VydCAvLyB0b28gbWFueSB0eHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozODEKICAgIC8vIGFzc2VydCh0aGlzLnBhdXNlZC52YWx1ZSA9PT0gVWludDY0KDApLCAnc2FmZSBwYXVzZWQnKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoyNjYKICAgIC8vIHBhdXNlZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdwYXVzZWQnIH0pCiAgICBieXRlYyAxMCAvLyAicGF1c2VkIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM4MQogICAgLy8gYXNzZXJ0KHRoaXMucGF1c2VkLnZhbHVlID09PSBVaW50NjQoMCksICdzYWZlIHBhdXNlZCcpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIHNhZmUgcGF1c2VkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzgyCiAgICAvLyB0aGlzLl9hc3NlcnRNZW1iZXIoZ3JvdXBJZCkKICAgIGRpZyA2CiAgICBkdXAKICAgIGNhbGxzdWIgX2Fzc2VydE1lbWJlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM4MwogICAgLy8gYXNzZXJ0KHRoaXMuZ3JvdXBzKGdyb3VwSWQpLnZhbHVlLmFjdGl2ZSAhPT0gVWludDY0KDApLCAnZ3JvdXAgZGlzYWJsZWQnKQogICAgZHVwCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6Mjc0CiAgICAvLyBncm91cHMgPSBCb3hNYXA8dWludDY0LCBTaWduZXJHcm91cD4oeyBrZXlQcmVmaXg6ICdnJyB9KQogICAgYnl0ZWNfMCAvLyAiZyIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM4MwogICAgLy8gYXNzZXJ0KHRoaXMuZ3JvdXBzKGdyb3VwSWQpLnZhbHVlLmFjdGl2ZSAhPT0gVWludDY0KDApLCAnZ3JvdXAgZGlzYWJsZWQnKQogICAgcHVzaGludCAxMTQgLy8gMTE0CiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGFzc2VydCAvLyBncm91cCBkaXNhYmxlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM4NAogICAgLy8gY29uc3QgcGlkID0gdGhpcy5fbmV3UHJvcG9zYWwoZ3JvdXBJZCwgUFRfVFJBTlNBQ1RJT05fR1JPVVAsIGV4cGlyeVJvdW5kKQogICAgaW50Y18xIC8vIDEKICAgIGRpZyAxMAogICAgY2FsbHN1YiBfbmV3UHJvcG9zYWwKICAgIGR1cAogICAgYnVyeSA5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6Mzg1CiAgICAvLyB0aGlzLl9zdG9yZVBheWxvYWRHcm91cChwaWQsIFVpbnQ2NCgxKSwgcGF5bG9hZCkKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgIGRpZyA4CiAgICBjYWxsc3ViIF9zdG9yZVBheWxvYWRHcm91cAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6Mzg2CiAgICAvLyBjb25zdCBwID0gY2xvbmUodGhpcy5wcm9wb3NhbHMocGlkKS52YWx1ZSkKICAgIGl0b2IKICAgIGR1cAogICAgYnVyeSAxMwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjI3NgogICAgLy8gcHJvcG9zYWxzID0gQm94TWFwPHVpbnQ2NCwgUHJvcG9zYWw+KHsga2V5UHJlZml4OiAncCcgfSkKICAgIGJ5dGVjIDUgLy8gInAiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czozODcKICAgIC8vIHAubnVtUGF5bG9hZHMgPSBVaW50NjQoMSkKICAgIGludGNfMSAvLyAxCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6Mzg2LTM4OAogICAgLy8gY29uc3QgcCA9IGNsb25lKHRoaXMucHJvcG9zYWxzKHBpZCkudmFsdWUpCiAgICAvLyBwLm51bVBheWxvYWRzID0gVWludDY0KDEpCiAgICAvLyB0aGlzLnByb3Bvc2FscyhwaWQpLnZhbHVlID0gY2xvbmUocCkKICAgIHB1c2hpbnQgODAgLy8gODAKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6Mzg5CiAgICAvLyBpZiAoZXhlY3V0ZSkgewogICAgZGlnIDkKICAgIGJ6IHByb3Bvc2VUcmFuc2FjdGlvbkdyb3VwX2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjM5MAogICAgLy8gdGhpcy5fZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWwocGlkKQogICAgZGlnIDcKICAgIGNhbGxzdWIgX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsCgpwcm9wb3NlVHJhbnNhY3Rpb25Hcm91cF9hZnRlcl9pZl9lbHNlQDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MzY5LTM3NQogICAgLy8gcHVibGljIHByb3Bvc2VUcmFuc2FjdGlvbkdyb3VwKAogICAgLy8gICBncm91cElkOiB1aW50NjQsCiAgICAvLyAgIHBheWxvYWQ6IFNhZmVUeG5Hcm91cCwKICAgIC8vICAgZXhwaXJ5Um91bmQ6IHVpbnQ2NCwKICAgIC8vICAgZXhlY3V0ZTogYm9vbGVhbiwKICAgIC8vICAgZW5zdXJlQnVkZ2V0VmFsdWU6IHVpbnQ2NCwKICAgIC8vICk6IHVpbnQ2NCB7CiAgICBieXRlY18zIC8vIDB4MTUxZjdjNzUKICAgIGRpZyAxMgogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OkFsZ29TYWZlLmFwcGVuZFRyYW5zYWN0aW9uR3JvdXBQYXlsb2FkW3JvdXRpbmddKCkgLT4gdm9pZDoKYXBwZW5kVHJhbnNhY3Rpb25Hcm91cFBheWxvYWQ6CiAgICBpbnRjXzAgLy8gMAogICAgZHVwCiAgICBieXRlY18xIC8vICIiCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0MDYtNDExCiAgICAvLyBwdWJsaWMgYXBwZW5kVHJhbnNhY3Rpb25Hcm91cFBheWxvYWQoCiAgICAvLyAgIHByb3Bvc2FsSWQ6IHVpbnQ2NCwKICAgIC8vICAgcGF5bG9hZEluZGV4OiB1aW50NjQsCiAgICAvLyAgIHBheWxvYWQ6IFNhZmVUeG5Hcm91cCwKICAgIC8vICAgZW5zdXJlQnVkZ2V0VmFsdWU6IHVpbnQ2NCwKICAgIC8vICk6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwbiAyCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwbiAyCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzMgLy8gMgogICAgKgogICAgc3dhcAogICAgZHVwCiAgICBsZW4KICAgIHN3YXAKICAgIGV4dHJhY3QgMiAwCiAgICBpbnRjXzAgLy8gMAoKYXBwZW5kVHJhbnNhY3Rpb25Hcm91cFBheWxvYWRfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQwNi00MTEKICAgIC8vIHB1YmxpYyBhcHBlbmRUcmFuc2FjdGlvbkdyb3VwUGF5bG9hZCgKICAgIC8vICAgcHJvcG9zYWxJZDogdWludDY0LAogICAgLy8gICBwYXlsb2FkSW5kZXg6IHVpbnQ2NCwKICAgIC8vICAgcGF5bG9hZDogU2FmZVR4bkdyb3VwLAogICAgLy8gICBlbnN1cmVCdWRnZXRWYWx1ZTogdWludDY0LAogICAgLy8gKTogdm9pZCB7CiAgICBkdXAKICAgIGRpZyA1CiAgICA8CiAgICBieiBhcHBlbmRUcmFuc2FjdGlvbkdyb3VwUGF5bG9hZF9hZnRlcl9mb3JANAogICAgZHVwbiAyCiAgICBpbnRjXzMgLy8gMgogICAgKgogICAgZGlnIDMKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBlbmNvZGluZwogICAgZHVwCiAgICBkaWcgNwogICAgZHVwCiAgICBjb3ZlciA0CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgdGFpbCBwb2ludGVyIGZvciAobGVuKyh1aW50NjQsKGxlbit1aW50OFtdKSlbXSkKICAgIGRpZyAxCiAgICBsZW4KICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgbGVuCiAgICBkaWcgMQogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIHR1cGxlIGVuY29kaW5nCiAgICBkdXAKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCB0YWlsIHBvaW50ZXIgYXQgaW5kZXggMSBvZiAodWludDY0LChsZW4rdWludDhbXSkpCiAgICBzd2FwCiAgICBzdWJzdHJpbmczCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAxMiAvLyAxMgogICAgKwogICAgKwogICAgYnVyeSA1CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIGFwcGVuZFRyYW5zYWN0aW9uR3JvdXBQYXlsb2FkX2Zvcl9oZWFkZXJAMQoKYXBwZW5kVHJhbnNhY3Rpb25Hcm91cFBheWxvYWRfYWZ0ZXJfZm9yQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDA2LTQxMQogICAgLy8gcHVibGljIGFwcGVuZFRyYW5zYWN0aW9uR3JvdXBQYXlsb2FkKAogICAgLy8gICBwcm9wb3NhbElkOiB1aW50NjQsCiAgICAvLyAgIHBheWxvYWRJbmRleDogdWludDY0LAogICAgLy8gICBwYXlsb2FkOiBTYWZlVHhuR3JvdXAsCiAgICAvLyAgIGVuc3VyZUJ1ZGdldFZhbHVlOiB1aW50NjQsCiAgICAvLyApOiB2b2lkIHsKICAgIGRpZyAzCiAgICBpbnRjXzMgLy8gMgogICAgKwogICAgZGlnIDMKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OlNhZmVUeG4+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICBkdXAKICAgIGJ1cnkgMTIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0MTIKICAgIC8vIGlmIChlbnN1cmVCdWRnZXRWYWx1ZSA+IFVpbnQ2NCgxKSkgewogICAgaW50Y18xIC8vIDEKICAgID4KICAgIGJ6IGFwcGVuZFRyYW5zYWN0aW9uR3JvdXBQYXlsb2FkX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQxMwogICAgLy8gZW5zdXJlQnVkZ2V0KGVuc3VyZUJ1ZGdldFZhbHVlKQogICAgZGlnIDEwCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CgphcHBlbmRUcmFuc2FjdGlvbkdyb3VwUGF5bG9hZF9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDE1CiAgICAvLyBhc3NlcnQocGF5bG9hZEluZGV4ID49IFVpbnQ2NCgyKSAmJiBwYXlsb2FkSW5kZXggPD0gVWludDY0KDYpLCAnaW52YWxpZCBzbG90JykKICAgIGRpZyA2CiAgICBpbnRjXzMgLy8gMgogICAgPj0KICAgIGJ6IGFwcGVuZFRyYW5zYWN0aW9uR3JvdXBQYXlsb2FkX2Jvb2xfZmFsc2VAMTAKICAgIGRpZyA2CiAgICBwdXNoaW50IDYgLy8gNgogICAgPD0KICAgIGJ6IGFwcGVuZFRyYW5zYWN0aW9uR3JvdXBQYXlsb2FkX2Jvb2xfZmFsc2VAMTAKICAgIGludGNfMSAvLyAxCgphcHBlbmRUcmFuc2FjdGlvbkdyb3VwUGF5bG9hZF9ib29sX21lcmdlQDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQxNQogICAgLy8gYXNzZXJ0KHBheWxvYWRJbmRleCA+PSBVaW50NjQoMikgJiYgcGF5bG9hZEluZGV4IDw9IFVpbnQ2NCg2KSwgJ2ludmFsaWQgc2xvdCcpCiAgICBhc3NlcnQgLy8gaW52YWxpZCBzbG90CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDE2CiAgICAvLyBhc3NlcnQocGF5bG9hZC5sZW5ndGggPj0gVWludDY0KDEpLCAnZW1wdHkgcGF5bG9hZCcpCiAgICBkaWcgNAogICAgYXNzZXJ0IC8vIGVtcHR5IHBheWxvYWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0MTcKICAgIC8vIGNvbnN0IHByb3Bvc2FsID0gY2xvbmUodGhpcy5wcm9wb3NhbHMocHJvcG9zYWxJZCkudmFsdWUpCiAgICBkaWcgOAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjI3NgogICAgLy8gcHJvcG9zYWxzID0gQm94TWFwPHVpbnQ2NCwgUHJvcG9zYWw+KHsga2V5UHJlZml4OiAncCcgfSkKICAgIGJ5dGVjIDUgLy8gInAiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSAxNAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQxNwogICAgLy8gY29uc3QgcHJvcG9zYWwgPSBjbG9uZSh0aGlzLnByb3Bvc2Fscyhwcm9wb3NhbElkKS52YWx1ZSkKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgYnVyeSAxNAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0MTgKICAgIC8vIGFzc2VydChwcm9wb3NhbC5wYXlsb2FkVHlwZSA9PT0gUFRfVFJBTlNBQ1RJT05fR1JPVVAsICdub3QgYSB0eCBncm91cCcpCiAgICBkdXAKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBub3QgYSB0eCBncm91cAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQxOQogICAgLy8gYXNzZXJ0KHByb3Bvc2FsLnN0YXR1cyA9PT0gU1RBVFVTX0FDVElWRSB8fCBwcm9wb3NhbC5zdGF0dXMgPT09IFNUQVRVU19SRUFEWSwgJ3Byb3Bvc2FsIG5vdCBwZW5kaW5nJykKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDExCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGJueiBhcHBlbmRUcmFuc2FjdGlvbkdyb3VwUGF5bG9hZF9ib29sX3RydWVAMTMKICAgIGRpZyA5CiAgICBpbnRjXzMgLy8gMgogICAgPT0KICAgIGJ6IGFwcGVuZFRyYW5zYWN0aW9uR3JvdXBQYXlsb2FkX2Jvb2xfZmFsc2VAMTQKCmFwcGVuZFRyYW5zYWN0aW9uR3JvdXBQYXlsb2FkX2Jvb2xfdHJ1ZUAxMzoKICAgIGludGNfMSAvLyAxCgphcHBlbmRUcmFuc2FjdGlvbkdyb3VwUGF5bG9hZF9ib29sX21lcmdlQDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQxOQogICAgLy8gYXNzZXJ0KHByb3Bvc2FsLnN0YXR1cyA9PT0gU1RBVFVTX0FDVElWRSB8fCBwcm9wb3NhbC5zdGF0dXMgPT09IFNUQVRVU19SRUFEWSwgJ3Byb3Bvc2FsIG5vdCBwZW5kaW5nJykKICAgIGFzc2VydCAvLyBwcm9wb3NhbCBub3QgcGVuZGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQyMAogICAgLy8gdGhpcy5fYXNzZXJ0TWVtYmVyKHByb3Bvc2FsLmdyb3VwSWQpCiAgICBkaWcgMTEKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBjYWxsc3ViIF9hc3NlcnRNZW1iZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0MjEKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyID09PSBwcm9wb3NhbC5wcm9wb3NlciwgJ29ubHkgcHJvcG9zZXIgY2FuIGFwcGVuZCcpCiAgICB0eG4gU2VuZGVyCiAgICBkaWcgMQogICAgZXh0cmFjdCA0OCAzMgogICAgPT0KICAgIGFzc2VydCAvLyBvbmx5IHByb3Bvc2VyIGNhbiBhcHBlbmQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0MjIKICAgIC8vIGFzc2VydChwcm9wb3NhbC5hcHByb3ZhbHNDb3VudCA9PT0gVWludDY0KDEpLCAnY2Fubm90IG1vZGlmeSBwYXlsb2FkIGFmdGVyIGluZGVwZW5kZW50IGFwcHJvdmFsJykKICAgIGR1cAogICAgcHVzaGludCAyNCAvLyAyNAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGNhbm5vdCBtb2RpZnkgcGF5bG9hZCBhZnRlciBpbmRlcGVuZGVudCBhcHByb3ZhbAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQyMwogICAgLy8gdGhpcy5fc3RvcmVQYXlsb2FkR3JvdXAocHJvcG9zYWxJZCwgcGF5bG9hZEluZGV4LCBwYXlsb2FkKQogICAgZGlnIDkKICAgIGRpZyA4CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGRpZyA5CiAgICBjYWxsc3ViIF9zdG9yZVBheWxvYWRHcm91cAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDI0CiAgICAvLyBpZiAocGF5bG9hZEluZGV4ID4gcHJvcG9zYWwubnVtUGF5bG9hZHMpIHsKICAgIHN3YXAKICAgIHB1c2hpbnQgODAgLy8gODAKICAgIGV4dHJhY3RfdWludDY0CiAgICA+CiAgICBieiBhcHBlbmRUcmFuc2FjdGlvbkdyb3VwUGF5bG9hZF9hZnRlcl9pZl9lbHNlQDE3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDI2LTQyNwogICAgLy8gdXBkYXRlZC5udW1QYXlsb2FkcyA9IHBheWxvYWRJbmRleAogICAgLy8gdGhpcy5wcm9wb3NhbHMocHJvcG9zYWxJZCkudmFsdWUgPSBjbG9uZSh1cGRhdGVkKQogICAgZGlnIDEyCiAgICBwdXNoaW50IDgwIC8vIDgwCiAgICBkaWcgOQogICAgYm94X3JlcGxhY2UKCmFwcGVuZFRyYW5zYWN0aW9uR3JvdXBQYXlsb2FkX2FmdGVyX2lmX2Vsc2VAMTc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDA2LTQxMQogICAgLy8gcHVibGljIGFwcGVuZFRyYW5zYWN0aW9uR3JvdXBQYXlsb2FkKAogICAgLy8gICBwcm9wb3NhbElkOiB1aW50NjQsCiAgICAvLyAgIHBheWxvYWRJbmRleDogdWludDY0LAogICAgLy8gICBwYXlsb2FkOiBTYWZlVHhuR3JvdXAsCiAgICAvLyAgIGVuc3VyZUJ1ZGdldFZhbHVlOiB1aW50NjQsCiAgICAvLyApOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmFwcGVuZFRyYW5zYWN0aW9uR3JvdXBQYXlsb2FkX2Jvb2xfZmFsc2VAMTQ6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhcHBlbmRUcmFuc2FjdGlvbkdyb3VwUGF5bG9hZF9ib29sX21lcmdlQDE1CgphcHBlbmRUcmFuc2FjdGlvbkdyb3VwUGF5bG9hZF9ib29sX2ZhbHNlQDEwOgogICAgaW50Y18wIC8vIDAKICAgIGIgYXBwZW5kVHJhbnNhY3Rpb25Hcm91cFBheWxvYWRfYm9vbF9tZXJnZUAxMQoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo6QWxnb1NhZmUucHJvcG9zZUFkbWluQ2hhbmdlW3JvdXRpbmddKCkgLT4gdm9pZDoKcHJvcG9zZUFkbWluQ2hhbmdlOgogICAgYnl0ZWNfMSAvLyAiIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQzMi00MzcKICAgIC8vIHB1YmxpYyBwcm9wb3NlQWRtaW5DaGFuZ2UoCiAgICAvLyAgIGdyb3VwSWQ6IHVpbnQ2NCwKICAgIC8vICAgY2hhbmdlOiBBZG1pbkNoYW5nZSwKICAgIC8vICAgZXhwaXJ5Um91bmQ6IHVpbnQ2NCwKICAgIC8vICAgZW5zdXJlQnVkZ2V0VmFsdWU6IHVpbnQ2NCwKICAgIC8vICk6IHVpbnQ2NCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXBuIDIKICAgIGxlbgogICAgZGlnIDEKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIHR1cGxlIGVuY29kaW5nCiAgICBkdXAKICAgIHB1c2hpbnQgMTI0IC8vIDEyNAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIHRhaWwgcG9pbnRlciBhdCBpbmRleCAyIG9mICh1aW50NjQsdWludDY0LChsZW4rdXRmOFtdKSx1aW50OFszMl0sdWludDY0LChsZW4rdXRmOFtdKSx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KQogICAgZGlnIDIKICAgIHN3YXAKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAxMjYgLy8gMTI2CiAgICArCiAgICBkaWcgMgogICAgcHVzaGludCA1OCAvLyA1OAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgdHVwbGUgZW5jb2RpbmcKICAgIGR1cAogICAgZGlnIDIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCB0YWlsIHBvaW50ZXIgYXQgaW5kZXggNSBvZiAodWludDY0LHVpbnQ2NCwobGVuK3V0ZjhbXSksdWludDhbMzJdLHVpbnQ2NCwobGVuK3V0ZjhbXSksdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkKICAgIHVuY292ZXIgMwogICAgc3dhcAogICAgZGlnIDMKICAgIHN1YnN0cmluZzMKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzMgLy8gMgogICAgKwogICAgKwogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3Igc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjpBZG1pbkNoYW5nZQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDM4CiAgICAvLyBpZiAoZW5zdXJlQnVkZ2V0VmFsdWUgPiBVaW50NjQoMSkpIHsKICAgIGludGNfMSAvLyAxCiAgICA+CiAgICBieiBwcm9wb3NlQWRtaW5DaGFuZ2VfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDM5CiAgICAvLyBlbnN1cmVCdWRnZXQoZW5zdXJlQnVkZ2V0VmFsdWUpCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIGVuc3VyZV9idWRnZXQKCnByb3Bvc2VBZG1pbkNoYW5nZV9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDQyCiAgICAvLyB0aGlzLl9hc3NlcnRNZW1iZXIoZ3JvdXBJZCkKICAgIGRpZyAzCiAgICBkdXAKICAgIGNhbGxzdWIgX2Fzc2VydE1lbWJlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQ0MwogICAgLy8gY29uc3QgZ3JvdXAgPSBjbG9uZSh0aGlzLmdyb3Vwcyhncm91cElkKS52YWx1ZSkKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoyNzQKICAgIC8vIGdyb3VwcyA9IEJveE1hcDx1aW50NjQsIFNpZ25lckdyb3VwPih7IGtleVByZWZpeDogJ2cnIH0pCiAgICBieXRlY18wIC8vICJnIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDQzCiAgICAvLyBjb25zdCBncm91cCA9IGNsb25lKHRoaXMuZ3JvdXBzKGdyb3VwSWQpLnZhbHVlKQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQ0My00NDQKICAgIC8vIGNvbnN0IGdyb3VwID0gY2xvbmUodGhpcy5ncm91cHMoZ3JvdXBJZCkudmFsdWUpCiAgICAvLyBhc3NlcnQoZ3JvdXAuYWN0aXZlICE9PSBVaW50NjQoMCksICdncm91cCBkaXNhYmxlZCcpCiAgICBzd2FwCiAgICBwdXNoaW50IDExNCAvLyAxMTQKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQ0NAogICAgLy8gYXNzZXJ0KGdyb3VwLmFjdGl2ZSAhPT0gVWludDY0KDApLCAnZ3JvdXAgZGlzYWJsZWQnKQogICAgYnRvaQogICAgYXNzZXJ0IC8vIGdyb3VwIGRpc2FibGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDQ1CiAgICAvLyB0aGlzLl9hc3NlcnRQcml2aWxlZ2VGb3JDaGFuZ2UoY2hhbmdlLmNoYW5nZVR5cGUsIGdyb3VwKQogICAgZGlnIDMKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDcKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIF9hc3NlcnRQcml2aWxlZ2VGb3JDaGFuZ2UKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEwMzUKICAgIC8vIGlmIChjaGFuZ2UuY2hhbmdlVHlwZSA9PT0gQURNX0NSRUFURV9HUk9VUCkgewogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBieiBwcm9wb3NlQWRtaW5DaGFuZ2VfZWxzZV9ib2R5QDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDM2CiAgICAvLyBhc3NlcnQoY2hhbmdlLnRocmVzaG9sZCA+PSBVaW50NjQoMSksICd0aHJlc2hvbGQgPj0gMScpCiAgICBkaWcgMgogICAgZHVwCiAgICBwdXNoaW50IDYwIC8vIDYwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYXNzZXJ0IC8vIHRocmVzaG9sZCA+PSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTAzNwogICAgLy8gYXNzZXJ0KGNoYW5nZS5tZW1iZXJBZGRyICE9PSBHbG9iYWwuemVyb0FkZHJlc3MsICdmaXJzdCBtZW1iZXIgcmVxdWlyZWQnKQogICAgZHVwCiAgICBleHRyYWN0IDE4IDMyCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBhc3NlcnQgLy8gZmlyc3QgbWVtYmVyIHJlcXVpcmVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTAzOAogICAgLy8gYXNzZXJ0KGNoYW5nZS5hbGxvd2VkQWN0aW9ucyA8PSBBQ1RfQUxMLCAnaW52YWxpZCBhY3Rpb25zJykKICAgIGR1cAogICAgcHVzaGludCA3NiAvLyA3NgogICAgZXh0cmFjdF91aW50NjQKICAgIHB1c2hpbnQgMzEgLy8gMzEKICAgIDw9CiAgICBhc3NlcnQgLy8gaW52YWxpZCBhY3Rpb25zCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTAzOQogICAgLy8gYXNzZXJ0KGNoYW5nZS5hZG1pblByaXZpbGVnZXMgPD0gUFJJVl9BTEwsICdpbnZhbGlkIHByaXZpbGVnZXMnKQogICAgZHVwCiAgICBwdXNoaW50IDY4IC8vIDY4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgcHVzaGludCA3IC8vIDcKICAgIDw9CiAgICBhc3NlcnQgLy8gaW52YWxpZCBwcml2aWxlZ2VzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTA0MAogICAgLy8gYXNzZXJ0KGNoYW5nZS5jb29sZG93blJvdW5kcyA8PSBNQVhfQ09PTERPV05fUk9VTkRTLCAnY29vbGRvd24gdG9vIGxhcmdlJykKICAgIHB1c2hpbnQgMTA4IC8vIDEwOAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGMgNSAvLyAxMDAwMDAwMAogICAgPD0KICAgIGFzc2VydCAvLyBjb29sZG93biB0b28gbGFyZ2UKCnByb3Bvc2VBZG1pbkNoYW5nZV9hZnRlcl9pZl9lbHNlQDIyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQ0OAogICAgLy8gY29uc3QgcGlkID0gdGhpcy5fbmV3UHJvcG9zYWwoZ3JvdXBJZCwgUFRfQURNSU4sIGV4cGlyeVJvdW5kKQogICAgZGlnIDMKICAgIHB1c2hpbnQgNSAvLyA1CiAgICBkaWcgMwogICAgY2FsbHN1YiBfbmV3UHJvcG9zYWwKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0NDkKICAgIC8vIHRoaXMuYWRtaW5QYXlsb2FkcyhwaWQpLnZhbHVlID0gY2xvbmUoY2hhbmdlKQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjI4MAogICAgLy8gYWRtaW5QYXlsb2FkcyA9IEJveE1hcDx1aW50NjQsIEFkbWluQ2hhbmdlPih7IGtleVByZWZpeDogJ2RwJyB9KQogICAgYnl0ZWMgMTQgLy8gImRwIgogICAgZGlnIDEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQ0OQogICAgLy8gdGhpcy5hZG1pblBheWxvYWRzKHBpZCkudmFsdWUgPSBjbG9uZShjaGFuZ2UpCiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgZGlnIDQKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0MzItNDM3CiAgICAvLyBwdWJsaWMgcHJvcG9zZUFkbWluQ2hhbmdlKAogICAgLy8gICBncm91cElkOiB1aW50NjQsCiAgICAvLyAgIGNoYW5nZTogQWRtaW5DaGFuZ2UsCiAgICAvLyAgIGV4cGlyeVJvdW5kOiB1aW50NjQsCiAgICAvLyAgIGVuc3VyZUJ1ZGdldFZhbHVlOiB1aW50NjQsCiAgICAvLyApOiB1aW50NjQgewogICAgYnl0ZWNfMyAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKcHJvcG9zZUFkbWluQ2hhbmdlX2Vsc2VfYm9keUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEwNDEKICAgIC8vIH0gZWxzZSBpZiAoY2hhbmdlLmNoYW5nZVR5cGUgPT09IEFETV9BRERfTUVNQkVSKSB7CiAgICBkaWcgNAogICAgaW50Y18zIC8vIDIKICAgID09CiAgICBieiBwcm9wb3NlQWRtaW5DaGFuZ2VfZWxzZV9ib2R5QDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDQyCiAgICAvLyBhc3NlcnQodGhpcy5ncm91cHMoY2hhbmdlLnRhcmdldEdyb3VwSWQpLmV4aXN0cywgJ3RhcmdldCBncm91cCBub3QgZm91bmQnKQogICAgZGlnIDIKICAgIGR1cAogICAgZXh0cmFjdCA4IDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoyNzQKICAgIC8vIGdyb3VwcyA9IEJveE1hcDx1aW50NjQsIFNpZ25lckdyb3VwPih7IGtleVByZWZpeDogJ2cnIH0pCiAgICBieXRlY18wIC8vICJnIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTA0MgogICAgLy8gYXNzZXJ0KHRoaXMuZ3JvdXBzKGNoYW5nZS50YXJnZXRHcm91cElkKS5leGlzdHMsICd0YXJnZXQgZ3JvdXAgbm90IGZvdW5kJykKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIHRhcmdldCBncm91cCBub3QgZm91bmQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDQzCiAgICAvLyBhc3NlcnQoY2hhbmdlLm1lbWJlckFkZHIgIT09IEdsb2JhbC56ZXJvQWRkcmVzcywgJ21lbWJlciByZXF1aXJlZCcpCiAgICBkdXAKICAgIGV4dHJhY3QgMTggMzIKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIGFzc2VydCAvLyBtZW1iZXIgcmVxdWlyZWQKCnByb3Bvc2VBZG1pbkNoYW5nZV9hZnRlcl9pZl9lbHNlQDIxOgogICAgYnVyeSAzCiAgICBiIHByb3Bvc2VBZG1pbkNoYW5nZV9hZnRlcl9pZl9lbHNlQDIyCgpwcm9wb3NlQWRtaW5DaGFuZ2VfZWxzZV9ib2R5QDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTA0NAogICAgLy8gfSBlbHNlIGlmIChjaGFuZ2UuY2hhbmdlVHlwZSA9PT0gQURNX1JFTU9WRV9NRU1CRVIpIHsKICAgIGRpZyA0CiAgICBwdXNoaW50IDMgLy8gMwogICAgPT0KICAgIGJ6IHByb3Bvc2VBZG1pbkNoYW5nZV9lbHNlX2JvZHlAMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDQ1CiAgICAvLyBhc3NlcnQodGhpcy5ncm91cHMoY2hhbmdlLnRhcmdldEdyb3VwSWQpLmV4aXN0cywgJ3RhcmdldCBncm91cCBub3QgZm91bmQnKQogICAgZGlnIDIKICAgIGR1cAogICAgZXh0cmFjdCA4IDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoyNzQKICAgIC8vIGdyb3VwcyA9IEJveE1hcDx1aW50NjQsIFNpZ25lckdyb3VwPih7IGtleVByZWZpeDogJ2cnIH0pCiAgICBieXRlY18wIC8vICJnIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTA0NQogICAgLy8gYXNzZXJ0KHRoaXMuZ3JvdXBzKGNoYW5nZS50YXJnZXRHcm91cElkKS5leGlzdHMsICd0YXJnZXQgZ3JvdXAgbm90IGZvdW5kJykKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIHRhcmdldCBncm91cCBub3QgZm91bmQKICAgIGIgcHJvcG9zZUFkbWluQ2hhbmdlX2FmdGVyX2lmX2Vsc2VAMjEKCnByb3Bvc2VBZG1pbkNoYW5nZV9lbHNlX2JvZHlAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTA0NgogICAgLy8gfSBlbHNlIGlmIChjaGFuZ2UuY2hhbmdlVHlwZSA9PT0gQURNX0NIQU5HRV9USFJFU0hPTEQpIHsKICAgIGRpZyA0CiAgICBwdXNoaW50IDQgLy8gNAogICAgPT0KICAgIGJ6IHByb3Bvc2VBZG1pbkNoYW5nZV9lbHNlX2JvZHlAMTIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDQ3CiAgICAvLyBhc3NlcnQodGhpcy5ncm91cHMoY2hhbmdlLnRhcmdldEdyb3VwSWQpLmV4aXN0cywgJ3RhcmdldCBncm91cCBub3QgZm91bmQnKQogICAgZGlnIDIKICAgIGR1cAogICAgZXh0cmFjdCA4IDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoyNzQKICAgIC8vIGdyb3VwcyA9IEJveE1hcDx1aW50NjQsIFNpZ25lckdyb3VwPih7IGtleVByZWZpeDogJ2cnIH0pCiAgICBieXRlY18wIC8vICJnIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTA0NwogICAgLy8gYXNzZXJ0KHRoaXMuZ3JvdXBzKGNoYW5nZS50YXJnZXRHcm91cElkKS5leGlzdHMsICd0YXJnZXQgZ3JvdXAgbm90IGZvdW5kJykKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIHRhcmdldCBncm91cCBub3QgZm91bmQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDQ4CiAgICAvLyBhc3NlcnQoY2hhbmdlLnRocmVzaG9sZCA+PSBVaW50NjQoMSksICd0aHJlc2hvbGQgPj0gMScpCiAgICBkdXAKICAgIHB1c2hpbnQgNjAgLy8gNjAKICAgIGV4dHJhY3RfdWludDY0CiAgICBhc3NlcnQgLy8gdGhyZXNob2xkID49IDEKICAgIGIgcHJvcG9zZUFkbWluQ2hhbmdlX2FmdGVyX2lmX2Vsc2VAMjEKCnByb3Bvc2VBZG1pbkNoYW5nZV9lbHNlX2JvZHlAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTA0OQogICAgLy8gfSBlbHNlIGlmIChjaGFuZ2UuY2hhbmdlVHlwZSA9PT0gQURNX1NFVF9QT0xJQ1kpIHsKICAgIGRpZyA0CiAgICBwdXNoaW50IDUgLy8gNQogICAgPT0KICAgIGJ6IHByb3Bvc2VBZG1pbkNoYW5nZV9lbHNlX2JvZHlAMTQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDUwCiAgICAvLyBhc3NlcnQodGhpcy5ncm91cHMoY2hhbmdlLnRhcmdldEdyb3VwSWQpLmV4aXN0cywgJ3RhcmdldCBncm91cCBub3QgZm91bmQnKQogICAgZGlnIDIKICAgIGR1cAogICAgZXh0cmFjdCA4IDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoyNzQKICAgIC8vIGdyb3VwcyA9IEJveE1hcDx1aW50NjQsIFNpZ25lckdyb3VwPih7IGtleVByZWZpeDogJ2cnIH0pCiAgICBieXRlY18wIC8vICJnIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTA1MAogICAgLy8gYXNzZXJ0KHRoaXMuZ3JvdXBzKGNoYW5nZS50YXJnZXRHcm91cElkKS5leGlzdHMsICd0YXJnZXQgZ3JvdXAgbm90IGZvdW5kJykKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIHRhcmdldCBncm91cCBub3QgZm91bmQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDUxCiAgICAvLyBhc3NlcnQoY2hhbmdlLmFsbG93ZWRBY3Rpb25zIDw9IEFDVF9BTEwsICdpbnZhbGlkIGFjdGlvbnMnKQogICAgZHVwCiAgICBwdXNoaW50IDc2IC8vIDc2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgcHVzaGludCAzMSAvLyAzMQogICAgPD0KICAgIGFzc2VydCAvLyBpbnZhbGlkIGFjdGlvbnMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDUyCiAgICAvLyBhc3NlcnQoY2hhbmdlLmNvb2xkb3duUm91bmRzIDw9IE1BWF9DT09MRE9XTl9ST1VORFMsICdjb29sZG93biB0b28gbGFyZ2UnKQogICAgZHVwCiAgICBwdXNoaW50IDEwOCAvLyAxMDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjIDUgLy8gMTAwMDAwMDAKICAgIDw9CiAgICBhc3NlcnQgLy8gY29vbGRvd24gdG9vIGxhcmdlCiAgICBiIHByb3Bvc2VBZG1pbkNoYW5nZV9hZnRlcl9pZl9lbHNlQDIxCgpwcm9wb3NlQWRtaW5DaGFuZ2VfZWxzZV9ib2R5QDE0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEwNTMKICAgIC8vIH0gZWxzZSBpZiAoY2hhbmdlLmNoYW5nZVR5cGUgPT09IEFETV9TRVRfUFJJVklMRUdFUykgewogICAgZGlnIDQKICAgIHB1c2hpbnQgNiAvLyA2CiAgICA9PQogICAgYnogcHJvcG9zZUFkbWluQ2hhbmdlX2Vsc2VfYm9keUAxNgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEwNTQKICAgIC8vIGFzc2VydCh0aGlzLmdyb3VwcyhjaGFuZ2UudGFyZ2V0R3JvdXBJZCkuZXhpc3RzLCAndGFyZ2V0IGdyb3VwIG5vdCBmb3VuZCcpCiAgICBkaWcgMgogICAgZHVwCiAgICBleHRyYWN0IDggOAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjI3NAogICAgLy8gZ3JvdXBzID0gQm94TWFwPHVpbnQ2NCwgU2lnbmVyR3JvdXA+KHsga2V5UHJlZml4OiAnZycgfSkKICAgIGJ5dGVjXzAgLy8gImciCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDU0CiAgICAvLyBhc3NlcnQodGhpcy5ncm91cHMoY2hhbmdlLnRhcmdldEdyb3VwSWQpLmV4aXN0cywgJ3RhcmdldCBncm91cCBub3QgZm91bmQnKQogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyB0YXJnZXQgZ3JvdXAgbm90IGZvdW5kCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTA1NQogICAgLy8gYXNzZXJ0KGNoYW5nZS5hZG1pblByaXZpbGVnZXMgPD0gUFJJVl9BTEwsICdpbnZhbGlkIHByaXZpbGVnZXMnKQogICAgZGlnIDEKICAgIHB1c2hpbnQgNjggLy8gNjgKICAgIGV4dHJhY3RfdWludDY0CiAgICBwdXNoaW50IDcgLy8gNwogICAgPD0KICAgIGFzc2VydCAvLyBpbnZhbGlkIHByaXZpbGVnZXMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDU3CiAgICAvLyAhdGhpcy5fd291bGRSZW1vdmVMYXN0R3JvdXBBZG1pbihjaGFuZ2UsIGNsb25lKHRoaXMuZ3JvdXBzKGNoYW5nZS50YXJnZXRHcm91cElkKS52YWx1ZSkpLAogICAgYm94X2dldAogICAgcG9wCiAgICBjYWxsc3ViIF93b3VsZFJlbW92ZUxhc3RHcm91cEFkbWluCiAgICBwb3AKICAgIHN3YXAKICAgICEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDU2LTEwNTkKICAgIC8vIGFzc2VydCgKICAgIC8vICAgIXRoaXMuX3dvdWxkUmVtb3ZlTGFzdEdyb3VwQWRtaW4oY2hhbmdlLCBjbG9uZSh0aGlzLmdyb3VwcyhjaGFuZ2UudGFyZ2V0R3JvdXBJZCkudmFsdWUpKSwKICAgIC8vICAgJ211c3Qga2VlcCBhdCBsZWFzdCBvbmUgYWN0aXZlIGdyb3VwIGFkbWluJywKICAgIC8vICkKICAgIGFzc2VydCAvLyBtdXN0IGtlZXAgYXQgbGVhc3Qgb25lIGFjdGl2ZSBncm91cCBhZG1pbgogICAgYiBwcm9wb3NlQWRtaW5DaGFuZ2VfYWZ0ZXJfaWZfZWxzZUAyMQoKcHJvcG9zZUFkbWluQ2hhbmdlX2Vsc2VfYm9keUAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDYwCiAgICAvLyB9IGVsc2UgaWYgKGNoYW5nZS5jaGFuZ2VUeXBlID09PSBBRE1fU0VUX0FDVElWRSkgewogICAgZGlnIDQKICAgIHB1c2hpbnQgNyAvLyA3CiAgICA9PQogICAgYXNzZXJ0IC8vIHVua25vd24gY2hhbmdlIHR5cGUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDYxCiAgICAvLyBhc3NlcnQodGhpcy5ncm91cHMoY2hhbmdlLnRhcmdldEdyb3VwSWQpLmV4aXN0cywgJ3RhcmdldCBncm91cCBub3QgZm91bmQnKQogICAgZGlnIDIKICAgIGR1cAogICAgZXh0cmFjdCA4IDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoyNzQKICAgIC8vIGdyb3VwcyA9IEJveE1hcDx1aW50NjQsIFNpZ25lckdyb3VwPih7IGtleVByZWZpeDogJ2cnIH0pCiAgICBieXRlY18wIC8vICJnIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTA2MQogICAgLy8gYXNzZXJ0KHRoaXMuZ3JvdXBzKGNoYW5nZS50YXJnZXRHcm91cElkKS5leGlzdHMsICd0YXJnZXQgZ3JvdXAgbm90IGZvdW5kJykKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gdGFyZ2V0IGdyb3VwIG5vdCBmb3VuZAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEwNjMKICAgIC8vICF0aGlzLl93b3VsZFJlbW92ZUxhc3RHcm91cEFkbWluKGNoYW5nZSwgY2xvbmUodGhpcy5ncm91cHMoY2hhbmdlLnRhcmdldEdyb3VwSWQpLnZhbHVlKSksCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIGNhbGxzdWIgX3dvdWxkUmVtb3ZlTGFzdEdyb3VwQWRtaW4KICAgIHBvcAogICAgc3dhcAogICAgIQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEwNjItMTA2NQogICAgLy8gYXNzZXJ0KAogICAgLy8gICAhdGhpcy5fd291bGRSZW1vdmVMYXN0R3JvdXBBZG1pbihjaGFuZ2UsIGNsb25lKHRoaXMuZ3JvdXBzKGNoYW5nZS50YXJnZXRHcm91cElkKS52YWx1ZSkpLAogICAgLy8gICAnbXVzdCBrZWVwIGF0IGxlYXN0IG9uZSBhY3RpdmUgZ3JvdXAgYWRtaW4nLAogICAgLy8gKQogICAgYXNzZXJ0IC8vIG11c3Qga2VlcCBhdCBsZWFzdCBvbmUgYWN0aXZlIGdyb3VwIGFkbWluCiAgICBiIHByb3Bvc2VBZG1pbkNoYW5nZV9hZnRlcl9pZl9lbHNlQDIxCgoKLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjpBbGdvU2FmZS5hcHByb3ZlUHJvcG9zYWxbcm91dGluZ10oKSAtPiB2b2lkOgphcHByb3ZlUHJvcG9zYWw6CiAgICBpbnRjXzAgLy8gMAogICAgZHVwCiAgICBieXRlY18xIC8vICIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDU4CiAgICAvLyBwdWJsaWMgYXBwcm92ZVByb3Bvc2FsKHByb3Bvc2FsSWQ6IHVpbnQ2NCwgZW5zdXJlQnVkZ2V0VmFsdWU6IHVpbnQ2NCk6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDU5CiAgICAvLyBpZiAoZW5zdXJlQnVkZ2V0VmFsdWUgPiBVaW50NjQoMSkpIHsKICAgIGludGNfMSAvLyAxCiAgICA+CiAgICBieiBhcHByb3ZlUHJvcG9zYWxfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDYwCiAgICAvLyBlbnN1cmVCdWRnZXQoZW5zdXJlQnVkZ2V0VmFsdWUpCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIGVuc3VyZV9idWRnZXQKCmFwcHJvdmVQcm9wb3NhbF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDYyCiAgICAvLyBjb25zdCBwcm9wb3NhbCA9IGNsb25lKHRoaXMucHJvcG9zYWxzKHByb3Bvc2FsSWQpLnZhbHVlKQogICAgZGlnIDEKICAgIGl0b2IKICAgIGR1cAogICAgYnVyeSA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6Mjc2CiAgICAvLyBwcm9wb3NhbHMgPSBCb3hNYXA8dWludDY0LCBQcm9wb3NhbD4oeyBrZXlQcmVmaXg6ICdwJyB9KQogICAgYnl0ZWMgNSAvLyAicCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQ2MgogICAgLy8gY29uc3QgcHJvcG9zYWwgPSBjbG9uZSh0aGlzLnByb3Bvc2Fscyhwcm9wb3NhbElkKS52YWx1ZSkKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgYnVyeSA2CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQ2MwogICAgLy8gYXNzZXJ0KHByb3Bvc2FsLnN0YXR1cyA9PT0gU1RBVFVTX0FDVElWRSB8fCBwcm9wb3NhbC5zdGF0dXMgPT09IFNUQVRVU19SRUFEWSwgJ25vdCBhcHByb3ZhYmxlJykKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDQKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYm56IGFwcHJvdmVQcm9wb3NhbF9ib29sX3RydWVANQogICAgZGlnIDIKICAgIGludGNfMyAvLyAyCiAgICA9PQogICAgYnogYXBwcm92ZVByb3Bvc2FsX2Jvb2xfZmFsc2VANgoKYXBwcm92ZVByb3Bvc2FsX2Jvb2xfdHJ1ZUA1OgogICAgaW50Y18xIC8vIDEKCmFwcHJvdmVQcm9wb3NhbF9ib29sX21lcmdlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDYzCiAgICAvLyBhc3NlcnQocHJvcG9zYWwuc3RhdHVzID09PSBTVEFUVVNfQUNUSVZFIHx8IHByb3Bvc2FsLnN0YXR1cyA9PT0gU1RBVFVTX1JFQURZLCAnbm90IGFwcHJvdmFibGUnKQogICAgYXNzZXJ0IC8vIG5vdCBhcHByb3ZhYmxlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDY0CiAgICAvLyBhc3NlcnQoR2xvYmFsLnJvdW5kIDw9IHByb3Bvc2FsLmV4cGlyeVJvdW5kLCAncHJvcG9zYWwgZXhwaXJlZCcpCiAgICBnbG9iYWwgUm91bmQKICAgIGRpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIHB1c2hpbnQgNDAgLy8gNDAKICAgIGV4dHJhY3RfdWludDY0CiAgICA8PQogICAgYXNzZXJ0IC8vIHByb3Bvc2FsIGV4cGlyZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0NjUKICAgIC8vIGFzc2VydCh0aGlzLm1lbWJlcnMoeyBncm91cElkOiBwcm9wb3NhbC5ncm91cElkLCBhY2NvdW50OiBUeG4uc2VuZGVyIH0pLmV4aXN0cywgJ25vdCBhIGdyb3VwIG1lbWJlcicpCiAgICB0eG4gU2VuZGVyCiAgICBkaWcgMQogICAgZXh0cmFjdCAwIDgKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoyNzUKICAgIC8vIG1lbWJlcnMgPSBCb3hNYXA8eyBncm91cElkOiB1aW50NjQ7IGFjY291bnQ6IEFjY291bnQgfSwgTWVtYmVyPih7IGtleVByZWZpeDogJ20nIH0pCiAgICBieXRlYyA0IC8vICJtIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDY1CiAgICAvLyBhc3NlcnQodGhpcy5tZW1iZXJzKHsgZ3JvdXBJZDogcHJvcG9zYWwuZ3JvdXBJZCwgYWNjb3VudDogVHhuLnNlbmRlciB9KS5leGlzdHMsICdub3QgYSBncm91cCBtZW1iZXInKQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gbm90IGEgZ3JvdXAgbWVtYmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDY2CiAgICAvLyBhc3NlcnQoIXRoaXMuYXBwcm92YWxzKHsgcHJvcG9zYWxJZCwgYWNjb3VudDogVHhuLnNlbmRlciB9KS5leGlzdHMsICdhbHJlYWR5IGFwcHJvdmVkJykKICAgIGRpZyA2CiAgICB0eG4gU2VuZGVyCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoyNzcKICAgIC8vIGFwcHJvdmFscyA9IEJveE1hcDx7IHByb3Bvc2FsSWQ6IHVpbnQ2NDsgYWNjb3VudDogQWNjb3VudCB9LCBBcHByb3ZhbD4oeyBrZXlQcmVmaXg6ICdhJyB9KQogICAgYnl0ZWMgMTUgLy8gImEiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0NjYKICAgIC8vIGFzc2VydCghdGhpcy5hcHByb3ZhbHMoeyBwcm9wb3NhbElkLCBhY2NvdW50OiBUeG4uc2VuZGVyIH0pLmV4aXN0cywgJ2FscmVhZHkgYXBwcm92ZWQnKQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gYWxyZWFkeSBhcHByb3ZlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjI3NAogICAgLy8gZ3JvdXBzID0gQm94TWFwPHVpbnQ2NCwgU2lnbmVyR3JvdXA+KHsga2V5UHJlZml4OiAnZycgfSkKICAgIGJ5dGVjXzAgLy8gImciCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0NjgKICAgIC8vIHRoaXMuZ3JvdXBzKHByb3Bvc2FsLmdyb3VwSWQpLnZhbHVlLm1lbWJlcnNoaXBFcG9jaCA9PT0gcHJvcG9zYWwuZXBvY2hBdENyZWF0aW9uLAogICAgcHVzaGludCAxMDYgLy8gMTA2CiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGRpZyAxCiAgICBwdXNoaW50IDg4IC8vIDg4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0NjctNDcwCiAgICAvLyBhc3NlcnQoCiAgICAvLyAgIHRoaXMuZ3JvdXBzKHByb3Bvc2FsLmdyb3VwSWQpLnZhbHVlLm1lbWJlcnNoaXBFcG9jaCA9PT0gcHJvcG9zYWwuZXBvY2hBdENyZWF0aW9uLAogICAgLy8gICAnZ3JvdXAgbWVtYmVyc2hpcCBjaGFuZ2VkIHNpbmNlIHByb3Bvc2FsIGNyZWF0aW9uJywKICAgIC8vICkKICAgIGFzc2VydCAvLyBncm91cCBtZW1iZXJzaGlwIGNoYW5nZWQgc2luY2UgcHJvcG9zYWwgY3JlYXRpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0NzIKICAgIC8vIHRoaXMuX3JlY29yZEFwcHJvdmFsKHByb3Bvc2FsSWQsIHByb3Bvc2FsKQogICAgZGlnIDIKICAgIHN3YXAKICAgIGNhbGxzdWIgX3JlY29yZEFwcHJvdmFsCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0NTgKICAgIC8vIHB1YmxpYyBhcHByb3ZlUHJvcG9zYWwocHJvcG9zYWxJZDogdWludDY0LCBlbnN1cmVCdWRnZXRWYWx1ZTogdWludDY0KTogdm9pZCB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgphcHByb3ZlUHJvcG9zYWxfYm9vbF9mYWxzZUA2OgogICAgaW50Y18wIC8vIDAKICAgIGIgYXBwcm92ZVByb3Bvc2FsX2Jvb2xfbWVyZ2VANwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo6QWxnb1NhZmUuZXhlY3V0ZVByb3Bvc2FsW3JvdXRpbmddKCkgLT4gdm9pZDoKZXhlY3V0ZVByb3Bvc2FsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQ3NgogICAgLy8gcHVibGljIGV4ZWN1dGVQcm9wb3NhbChwcm9wb3NhbElkOiB1aW50NjQsIGVuc3VyZUJ1ZGdldFZhbHVlOiB1aW50NjQpOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQ3NwogICAgLy8gaWYgKGVuc3VyZUJ1ZGdldFZhbHVlID4gVWludDY0KDEpKSB7CiAgICBpbnRjXzEgLy8gMQogICAgPgogICAgYnogZXhlY3V0ZVByb3Bvc2FsX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQ3OAogICAgLy8gZW5zdXJlQnVkZ2V0KGVuc3VyZUJ1ZGdldFZhbHVlKQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CgpleGVjdXRlUHJvcG9zYWxfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQ4MAogICAgLy8gdGhpcy5fZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWwocHJvcG9zYWxJZCkKICAgIGRpZyAxCiAgICBjYWxsc3ViIF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQ3NgogICAgLy8gcHVibGljIGV4ZWN1dGVQcm9wb3NhbChwcm9wb3NhbElkOiB1aW50NjQsIGVuc3VyZUJ1ZGdldFZhbHVlOiB1aW50NjQpOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OkFsZ29TYWZlLmNhbmNlbFByb3Bvc2FsW3JvdXRpbmddKCkgLT4gdm9pZDoKY2FuY2VsUHJvcG9zYWw6CiAgICBpbnRjXzAgLy8gMAogICAgZHVwbiAyCiAgICBieXRlY18xIC8vICIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDg0CiAgICAvLyBwdWJsaWMgY2FuY2VsUHJvcG9zYWwocHJvcG9zYWxJZDogdWludDY0LCBlbnN1cmVCdWRnZXRWYWx1ZTogdWludDY0KTogdm9pZCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0ODUKICAgIC8vIGlmIChlbnN1cmVCdWRnZXRWYWx1ZSA+IFVpbnQ2NCgxKSkgewogICAgaW50Y18xIC8vIDEKICAgID4KICAgIGJ6IGNhbmNlbFByb3Bvc2FsX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQ4NgogICAgLy8gZW5zdXJlQnVkZ2V0KGVuc3VyZUJ1ZGdldFZhbHVlKQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CgpjYW5jZWxQcm9wb3NhbF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDg4CiAgICAvLyBjb25zdCBwcm9wb3NhbCA9IGNsb25lKHRoaXMucHJvcG9zYWxzKHByb3Bvc2FsSWQpLnZhbHVlKQogICAgZGlnIDEKICAgIGl0b2IKICAgIGR1cAogICAgYnVyeSA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6Mjc2CiAgICAvLyBwcm9wb3NhbHMgPSBCb3hNYXA8dWludDY0LCBQcm9wb3NhbD4oeyBrZXlQcmVmaXg6ICdwJyB9KQogICAgYnl0ZWMgNSAvLyAicCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBidXJ5IDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0ODgKICAgIC8vIGNvbnN0IHByb3Bvc2FsID0gY2xvbmUodGhpcy5wcm9wb3NhbHMocHJvcG9zYWxJZCkudmFsdWUpCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgNgogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0ODkKICAgIC8vIGFzc2VydChwcm9wb3NhbC5zdGF0dXMgPT09IFNUQVRVU19BQ1RJVkUgfHwgcHJvcG9zYWwuc3RhdHVzID09PSBTVEFUVVNfUkVBRFksICdub3QgY2FuY2VsbGFibGUnKQogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGJ1cnkgNAogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBibnogY2FuY2VsUHJvcG9zYWxfYm9vbF90cnVlQDUKICAgIGRpZyAyCiAgICBpbnRjXzMgLy8gMgogICAgPT0KICAgIGJ6IGNhbmNlbFByb3Bvc2FsX2Jvb2xfZmFsc2VANgoKY2FuY2VsUHJvcG9zYWxfYm9vbF90cnVlQDU6CiAgICBpbnRjXzEgLy8gMQoKY2FuY2VsUHJvcG9zYWxfYm9vbF9tZXJnZUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQ4OQogICAgLy8gYXNzZXJ0KHByb3Bvc2FsLnN0YXR1cyA9PT0gU1RBVFVTX0FDVElWRSB8fCBwcm9wb3NhbC5zdGF0dXMgPT09IFNUQVRVU19SRUFEWSwgJ25vdCBjYW5jZWxsYWJsZScpCiAgICBhc3NlcnQgLy8gbm90IGNhbmNlbGxhYmxlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDkwCiAgICAvLyBjb25zdCBpc1Byb3Bvc2VyID0gVHhuLnNlbmRlciA9PT0gcHJvcG9zYWwucHJvcG9zZXIKICAgIHR4biBTZW5kZXIKICAgIGRpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGV4dHJhY3QgNDggMzIKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDkxCiAgICAvLyBjb25zdCBpc01lbWJlciA9IHRoaXMubWVtYmVycyh7IGdyb3VwSWQ6IHByb3Bvc2FsLmdyb3VwSWQsIGFjY291bnQ6IFR4bi5zZW5kZXIgfSkuZXhpc3RzCiAgICBzd2FwCiAgICBleHRyYWN0IDAgOAogICAgdHhuIFNlbmRlcgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6Mjc1CiAgICAvLyBtZW1iZXJzID0gQm94TWFwPHsgZ3JvdXBJZDogdWludDY0OyBhY2NvdW50OiBBY2NvdW50IH0sIE1lbWJlcj4oeyBrZXlQcmVmaXg6ICdtJyB9KQogICAgYnl0ZWMgNCAvLyAibSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQ5MQogICAgLy8gY29uc3QgaXNNZW1iZXIgPSB0aGlzLm1lbWJlcnMoeyBncm91cElkOiBwcm9wb3NhbC5ncm91cElkLCBhY2NvdW50OiBUeG4uc2VuZGVyIH0pLmV4aXN0cwogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDkyCiAgICAvLyBhc3NlcnQoaXNQcm9wb3NlciB8fCBpc01lbWJlciwgJ25vdCBhdXRob3Jpc2VkIHRvIGNhbmNlbCcpCiAgICB8fAogICAgYXNzZXJ0IC8vIG5vdCBhdXRob3Jpc2VkIHRvIGNhbmNlbAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQ5NAogICAgLy8gcHJvcG9zYWwuc3RhdHVzID0gU1RBVFVTX0NBTkNFTExFRAogICAgcHVzaGludCA0IC8vIDQKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo0OTQtNDk1CiAgICAvLyBwcm9wb3NhbC5zdGF0dXMgPSBTVEFUVVNfQ0FOQ0VMTEVECiAgICAvLyB0aGlzLnByb3Bvc2Fscyhwcm9wb3NhbElkKS52YWx1ZSA9IGNsb25lKHByb3Bvc2FsKQogICAgZGlnIDYKICAgIGludGNfMiAvLyA4CiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NDk2CiAgICAvLyBlbWl0PFByb3Bvc2FsQ2FuY2VsbGVkPih7IHByb3Bvc2FsSWQgfSkKICAgIHB1c2hieXRlcyAweGFlMmFiYzA2IC8vIG1ldGhvZCAiUHJvcG9zYWxDYW5jZWxsZWQodWludDY0KSIKICAgIGRpZyA1CiAgICBjb25jYXQKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjQ4NAogICAgLy8gcHVibGljIGNhbmNlbFByb3Bvc2FsKHByb3Bvc2FsSWQ6IHVpbnQ2NCwgZW5zdXJlQnVkZ2V0VmFsdWU6IHVpbnQ2NCk6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKY2FuY2VsUHJvcG9zYWxfYm9vbF9mYWxzZUA2OgogICAgaW50Y18wIC8vIDAKICAgIGIgY2FuY2VsUHJvcG9zYWxfYm9vbF9tZXJnZUA3CgoKLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjpBbGdvU2FmZS5wcnVuZVByb3Bvc2FsW3JvdXRpbmddKCkgLT4gdm9pZDoKcHJ1bmVQcm9wb3NhbDoKICAgIGludGNfMCAvLyAwCiAgICBkdXBuIDQKICAgIGJ5dGVjXzEgLy8gIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjUwNgogICAgLy8gcHVibGljIHBydW5lUHJvcG9zYWwocHJvcG9zYWxJZDogdWludDY0LCBlbnN1cmVCdWRnZXRWYWx1ZTogdWludDY0KTogdm9pZCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1MDcKICAgIC8vIGlmIChlbnN1cmVCdWRnZXRWYWx1ZSA+IFVpbnQ2NCgxKSkgewogICAgaW50Y18xIC8vIDEKICAgID4KICAgIGJ6IHBydW5lUHJvcG9zYWxfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTA4CiAgICAvLyBlbnN1cmVCdWRnZXQoZW5zdXJlQnVkZ2V0VmFsdWUpCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIGVuc3VyZV9idWRnZXQKCnBydW5lUHJvcG9zYWxfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjUxMAogICAgLy8gY29uc3QgcHJvcG9zYWwgPSBjbG9uZSh0aGlzLnByb3Bvc2Fscyhwcm9wb3NhbElkKS52YWx1ZSkKICAgIGRpZyAxCiAgICBpdG9iCiAgICBkdXAKICAgIGJ1cnkgNwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjI3NgogICAgLy8gcHJvcG9zYWxzID0gQm94TWFwPHVpbnQ2NCwgUHJvcG9zYWw+KHsga2V5UHJlZml4OiAncCcgfSkKICAgIGJ5dGVjIDUgLy8gInAiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSAxMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjUxMAogICAgLy8gY29uc3QgcHJvcG9zYWwgPSBjbG9uZSh0aGlzLnByb3Bvc2Fscyhwcm9wb3NhbElkKS52YWx1ZSkKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgYnVyeSA3CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjUxMQogICAgLy8gYXNzZXJ0KHByb3Bvc2FsLnN0YXR1cyA9PT0gU1RBVFVTX0VYRUNVVEVEIHx8IHByb3Bvc2FsLnN0YXR1cyA9PT0gU1RBVFVTX0NBTkNFTExFRCwgJ3Byb3Bvc2FsIG5vdCB0ZXJtaW5hbCcpCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgYnVyeSA0CiAgICBwdXNoaW50IDMgLy8gMwogICAgPT0KICAgIGJueiBwcnVuZVByb3Bvc2FsX2Jvb2xfdHJ1ZUA1CiAgICBkaWcgMgogICAgcHVzaGludCA0IC8vIDQKICAgID09CiAgICBieiBwcnVuZVByb3Bvc2FsX2Jvb2xfZmFsc2VANgoKcHJ1bmVQcm9wb3NhbF9ib29sX3RydWVANToKICAgIGludGNfMSAvLyAxCgpwcnVuZVByb3Bvc2FsX2Jvb2xfbWVyZ2VANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1MTEKICAgIC8vIGFzc2VydChwcm9wb3NhbC5zdGF0dXMgPT09IFNUQVRVU19FWEVDVVRFRCB8fCBwcm9wb3NhbC5zdGF0dXMgPT09IFNUQVRVU19DQU5DRUxMRUQsICdwcm9wb3NhbCBub3QgdGVybWluYWwnKQogICAgYXNzZXJ0IC8vIHByb3Bvc2FsIG5vdCB0ZXJtaW5hbAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjUxMgogICAgLy8gYXNzZXJ0KEdsb2JhbC5yb3VuZCA+IHByb3Bvc2FsLmV4cGlyeVJvdW5kLCAnbm90IHlldCBleHBpcmVkJykKICAgIGdsb2JhbCBSb3VuZAogICAgZGlnIDUKICAgIGR1cAogICAgY292ZXIgMgogICAgcHVzaGludCA0MCAvLyA0MAogICAgZXh0cmFjdF91aW50NjQKICAgID4KICAgIGFzc2VydCAvLyBub3QgeWV0IGV4cGlyZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1MTMKICAgIC8vIHRoaXMuX2Fzc2VydE1lbWJlcihwcm9wb3NhbC5ncm91cElkKQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGNhbGxzdWIgX2Fzc2VydE1lbWJlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjUxNQogICAgLy8gaWYgKHByb3Bvc2FsLnBheWxvYWRUeXBlID09PSBQVF9UUkFOU0FDVElPTl9HUk9VUCkgewogICAgcHVzaGludCAxNiAvLyAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYnogcHJ1bmVQcm9wb3NhbF9lbHNlX2JvZHlAMTQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1MTYKICAgIC8vIGZvciAobGV0IHAgPSBVaW50NjQoMSk7IHAgPD0gcHJvcG9zYWwubnVtUGF5bG9hZHM7IHAgPSBwICsgVWludDY0KDEpKSB7CiAgICBpbnRjXzEgLy8gMQogICAgYnVyeSA0CgpwcnVuZVByb3Bvc2FsX3doaWxlX3RvcEA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjUxNgogICAgLy8gZm9yIChsZXQgcCA9IFVpbnQ2NCgxKTsgcCA8PSBwcm9wb3NhbC5udW1QYXlsb2FkczsgcCA9IHAgKyBVaW50NjQoMSkpIHsKICAgIGRpZyA0CiAgICBwdXNoaW50IDgwIC8vIDgwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZGlnIDQKICAgID49CiAgICBieiBwcnVuZVByb3Bvc2FsX2FmdGVyX2lmX2Vsc2VAMTcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1MTcKICAgIC8vIGNvbnN0IGtleTogdWludDY0ID0gcHJvcG9zYWxJZCAqIFRYR19LRVlfTVVMVCArIHAKICAgIGRpZyAxCiAgICBwdXNoaW50IDcgLy8gNwogICAgKgogICAgZGlnIDQKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1MTgKICAgIC8vIGlmICh0aGlzLnRyYW5zYWN0aW9uR3JvdXBzKGtleSkuZXhpc3RzKSB7CiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6Mjc5CiAgICAvLyB0cmFuc2FjdGlvbkdyb3VwcyA9IEJveE1hcDx1aW50NjQsIFNhZmVUeG5Hcm91cD4oeyBrZXlQcmVmaXg6ICd0eGcnIH0pCiAgICBieXRlYyA4IC8vICJ0eGciCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgYnVyeSA5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTE4CiAgICAvLyBpZiAodGhpcy50cmFuc2FjdGlvbkdyb3VwcyhrZXkpLmV4aXN0cykgewogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBwcnVuZVByb3Bvc2FsX2FmdGVyX2lmX2Vsc2VAMTIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1MTkKICAgIC8vIHRoaXMudHJhbnNhY3Rpb25Hcm91cHMoa2V5KS5kZWxldGUoKQogICAgZGlnIDcKICAgIGJveF9kZWwKICAgIHBvcAoKcHJ1bmVQcm9wb3NhbF9hZnRlcl9pZl9lbHNlQDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjUxNgogICAgLy8gZm9yIChsZXQgcCA9IFVpbnQ2NCgxKTsgcCA8PSBwcm9wb3NhbC5udW1QYXlsb2FkczsgcCA9IHAgKyBVaW50NjQoMSkpIHsKICAgIGRpZyAzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSA0CiAgICBiIHBydW5lUHJvcG9zYWxfd2hpbGVfdG9wQDkKCnBydW5lUHJvcG9zYWxfYWZ0ZXJfaWZfZWxzZUAxNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1MjUKICAgIC8vIHRoaXMucHJvcG9zYWxzKHByb3Bvc2FsSWQpLmRlbGV0ZSgpCiAgICBkaWcgOAogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTA2CiAgICAvLyBwdWJsaWMgcHJ1bmVQcm9wb3NhbChwcm9wb3NhbElkOiB1aW50NjQsIGVuc3VyZUJ1ZGdldFZhbHVlOiB1aW50NjQpOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCnBydW5lUHJvcG9zYWxfZWxzZV9ib2R5QDE0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjI4MAogICAgLy8gYWRtaW5QYXlsb2FkcyA9IEJveE1hcDx1aW50NjQsIEFkbWluQ2hhbmdlPih7IGtleVByZWZpeDogJ2RwJyB9KQogICAgYnl0ZWMgMTQgLy8gImRwIgogICAgZGlnIDYKICAgIGNvbmNhdAogICAgZHVwCiAgICBidXJ5IDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1MjIKICAgIC8vIH0gZWxzZSBpZiAodGhpcy5hZG1pblBheWxvYWRzKHByb3Bvc2FsSWQpLmV4aXN0cykgewogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBwcnVuZVByb3Bvc2FsX2FmdGVyX2lmX2Vsc2VAMTcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1MjMKICAgIC8vIHRoaXMuYWRtaW5QYXlsb2Fkcyhwcm9wb3NhbElkKS5kZWxldGUoKQogICAgZGlnIDYKICAgIGJveF9kZWwKICAgIHBvcAogICAgYiBwcnVuZVByb3Bvc2FsX2FmdGVyX2lmX2Vsc2VAMTcKCnBydW5lUHJvcG9zYWxfYm9vbF9mYWxzZUA2OgogICAgaW50Y18wIC8vIDAKICAgIGIgcHJ1bmVQcm9wb3NhbF9ib29sX21lcmdlQDcKCgovLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OkFsZ29TYWZlLmdldENvbmZpZ1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldENvbmZpZzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1MzIKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTM0CiAgICAvLyBpZiAoZW5zdXJlQnVkZ2V0VmFsdWUgPiBVaW50NjQoMSkpIHsKICAgIGludGNfMSAvLyAxCiAgICA+CiAgICBieiBnZXRDb25maWdfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTM1CiAgICAvLyBlbnN1cmVCdWRnZXQoZW5zdXJlQnVkZ2V0VmFsdWUpCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIGVuc3VyZV9idWRnZXQKCmdldENvbmZpZ19hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTM4CiAgICAvLyB0aGlzLm5hbWUudmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjI2MAogICAgLy8gbmFtZSA9IEdsb2JhbFN0YXRlPHN0cmluZz4oeyBrZXk6ICduYW1lJyB9KQogICAgYnl0ZWMgMTcgLy8gIm5hbWUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTM4CiAgICAvLyB0aGlzLm5hbWUudmFsdWUsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjUzOQogICAgLy8gdGhpcy5ncm91cENvdW50LnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoyNjUKICAgIC8vIGdyb3VwQ291bnQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnZ2NudCcgfSkKICAgIGJ5dGVjIDcgLy8gImdjbnQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTM5CiAgICAvLyB0aGlzLmdyb3VwQ291bnQudmFsdWUsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjU0MAogICAgLy8gdGhpcy5uZXh0R3JvdXBJZC52YWx1ZSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MjYzCiAgICAvLyBuZXh0R3JvdXBJZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICduZ2lkJyB9KQogICAgYnl0ZWMgNiAvLyAibmdpZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1NDAKICAgIC8vIHRoaXMubmV4dEdyb3VwSWQudmFsdWUsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjU0MQogICAgLy8gdGhpcy5uZXh0UHJvcG9zYWxJZC52YWx1ZSwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MjY0CiAgICAvLyBuZXh0UHJvcG9zYWxJZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICducGlkJyB9KQogICAgYnl0ZWMgOSAvLyAibnBpZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1NDEKICAgIC8vIHRoaXMubmV4dFByb3Bvc2FsSWQudmFsdWUsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjU0MgogICAgLy8gdGhpcy5wYXVzZWQudmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjI2NgogICAgLy8gcGF1c2VkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ3BhdXNlZCcgfSkKICAgIGJ5dGVjIDEwIC8vICJwYXVzZWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTQyCiAgICAvLyB0aGlzLnBhdXNlZC52YWx1ZSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTQzCiAgICAvLyB0aGlzLnZlcnNpb24udmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjI2NwogICAgLy8gdmVyc2lvbiA9IEdsb2JhbFN0YXRlPHN0cmluZz4oeyBrZXk6ICd2ZXInIH0pCiAgICBieXRlYyAxOSAvLyAidmVyIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjU0MwogICAgLy8gdGhpcy52ZXJzaW9uLnZhbHVlLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1MzctNTQ0CiAgICAvLyByZXR1cm4gWwogICAgLy8gICB0aGlzLm5hbWUudmFsdWUsCiAgICAvLyAgIHRoaXMuZ3JvdXBDb3VudC52YWx1ZSwKICAgIC8vICAgdGhpcy5uZXh0R3JvdXBJZC52YWx1ZSwKICAgIC8vICAgdGhpcy5uZXh0UHJvcG9zYWxJZC52YWx1ZSwKICAgIC8vICAgdGhpcy5wYXVzZWQudmFsdWUsCiAgICAvLyAgIHRoaXMudmVyc2lvbi52YWx1ZSwKICAgIC8vIF0KICAgIGRpZyA1CiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDYKICAgIGNvbmNhdAogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMzYgLy8gMzYKICAgICsKICAgIHVuY292ZXIgNgogICAgaXRvYgogICAgcHVzaGJ5dGVzIDB4MDAyNAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDYKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA1CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgNAogICAgaXRvYgogICAgY29uY2F0CiAgICBkaWcgMwogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTMyCiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGJ5dGVjXzMgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OkFsZ29TYWZlLmdldFNpZ25lckdyb3VwW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0U2lnbmVyR3JvdXA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTQ3CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjU0OQogICAgLy8gaWYgKGVuc3VyZUJ1ZGdldFZhbHVlID4gVWludDY0KDEpKSB7CiAgICBpbnRjXzEgLy8gMQogICAgPgogICAgYnogZ2V0U2lnbmVyR3JvdXBfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTUwCiAgICAvLyBlbnN1cmVCdWRnZXQoZW5zdXJlQnVkZ2V0VmFsdWUpCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIGVuc3VyZV9idWRnZXQKCmdldFNpZ25lckdyb3VwX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1NTIKICAgIC8vIHJldHVybiBjbG9uZSh0aGlzLmdyb3Vwcyhncm91cElkKS52YWx1ZSkKICAgIGRpZyAxCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6Mjc0CiAgICAvLyBncm91cHMgPSBCb3hNYXA8dWludDY0LCBTaWduZXJHcm91cD4oeyBrZXlQcmVmaXg6ICdnJyB9KQogICAgYnl0ZWNfMCAvLyAiZyIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjU1MgogICAgLy8gcmV0dXJuIGNsb25lKHRoaXMuZ3JvdXBzKGdyb3VwSWQpLnZhbHVlKQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1NDcKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgYnl0ZWNfMyAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo6QWxnb1NhZmUuZ2V0UHJvcG9zYWxbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRQcm9wb3NhbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1NTUKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTU3CiAgICAvLyBpZiAoZW5zdXJlQnVkZ2V0VmFsdWUgPiBVaW50NjQoMSkpIHsKICAgIGludGNfMSAvLyAxCiAgICA+CiAgICBieiBnZXRQcm9wb3NhbF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1NTgKICAgIC8vIGVuc3VyZUJ1ZGdldChlbnN1cmVCdWRnZXRWYWx1ZSkKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAoKZ2V0UHJvcG9zYWxfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjU2MAogICAgLy8gcmV0dXJuIGNsb25lKHRoaXMucHJvcG9zYWxzKHByb3Bvc2FsSWQpLnZhbHVlKQogICAgZGlnIDEKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoyNzYKICAgIC8vIHByb3Bvc2FscyA9IEJveE1hcDx1aW50NjQsIFByb3Bvc2FsPih7IGtleVByZWZpeDogJ3AnIH0pCiAgICBieXRlYyA1IC8vICJwIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTYwCiAgICAvLyByZXR1cm4gY2xvbmUodGhpcy5wcm9wb3NhbHMocHJvcG9zYWxJZCkudmFsdWUpCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjU1NQogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICBieXRlY18zIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjpBbGdvU2FmZS5nZXRUcmFuc2FjdGlvbkdyb3VwW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0VHJhbnNhY3Rpb25Hcm91cDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1NjMKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTY1CiAgICAvLyBpZiAoZW5zdXJlQnVkZ2V0VmFsdWUgPiBVaW50NjQoMSkpIHsKICAgIGludGNfMSAvLyAxCiAgICA+CiAgICBieiBnZXRUcmFuc2FjdGlvbkdyb3VwX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjU2NgogICAgLy8gZW5zdXJlQnVkZ2V0KGVuc3VyZUJ1ZGdldFZhbHVlKQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CgpnZXRUcmFuc2FjdGlvbkdyb3VwX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1NjgKICAgIC8vIHJldHVybiBjbG9uZSh0aGlzLnRyYW5zYWN0aW9uR3JvdXBzKHByb3Bvc2FsSWQgKiBUWEdfS0VZX01VTFQgKyBwYXlsb2FkSW5kZXgpLnZhbHVlKQogICAgZGlnIDIKICAgIHB1c2hpbnQgNyAvLyA3CiAgICAqCiAgICBkaWcgMgogICAgKwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjI3OQogICAgLy8gdHJhbnNhY3Rpb25Hcm91cHMgPSBCb3hNYXA8dWludDY0LCBTYWZlVHhuR3JvdXA+KHsga2V5UHJlZml4OiAndHhnJyB9KQogICAgYnl0ZWMgOCAvLyAidHhnIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTY4CiAgICAvLyByZXR1cm4gY2xvbmUodGhpcy50cmFuc2FjdGlvbkdyb3Vwcyhwcm9wb3NhbElkICogVFhHX0tFWV9NVUxUICsgcGF5bG9hZEluZGV4KS52YWx1ZSkKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTYzCiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGJ5dGVjXzMgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OkFsZ29TYWZlLmdldE1lbWJlcltyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldE1lbWJlcjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1NzEKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTczCiAgICAvLyBpZiAoZW5zdXJlQnVkZ2V0VmFsdWUgPiBVaW50NjQoMSkpIHsKICAgIGludGNfMSAvLyAxCiAgICA+CiAgICBieiBnZXRNZW1iZXJfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTc0CiAgICAvLyBlbnN1cmVCdWRnZXQoZW5zdXJlQnVkZ2V0VmFsdWUpCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIGVuc3VyZV9idWRnZXQKCmdldE1lbWJlcl9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTc2CiAgICAvLyByZXR1cm4gY2xvbmUodGhpcy5tZW1iZXJzKHsgZ3JvdXBJZCwgYWNjb3VudCB9KS52YWx1ZSkKICAgIGRpZyAyCiAgICBpdG9iCiAgICBkaWcgMgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6Mjc1CiAgICAvLyBtZW1iZXJzID0gQm94TWFwPHsgZ3JvdXBJZDogdWludDY0OyBhY2NvdW50OiBBY2NvdW50IH0sIE1lbWJlcj4oeyBrZXlQcmVmaXg6ICdtJyB9KQogICAgYnl0ZWMgNCAvLyAibSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjU3NgogICAgLy8gcmV0dXJuIGNsb25lKHRoaXMubWVtYmVycyh7IGdyb3VwSWQsIGFjY291bnQgfSkudmFsdWUpCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjU3MQogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICBieXRlY18zIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjpBbGdvU2FmZS5pc01lbWJlcltyb3V0aW5nXSgpIC0+IHZvaWQ6CmlzTWVtYmVyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjU3OQogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCAzMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1ODEKICAgIC8vIGlmIChlbnN1cmVCdWRnZXRWYWx1ZSA+IFVpbnQ2NCgxKSkgewogICAgaW50Y18xIC8vIDEKICAgID4KICAgIGJ6IGlzTWVtYmVyX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjU4MgogICAgLy8gZW5zdXJlQnVkZ2V0KGVuc3VyZUJ1ZGdldFZhbHVlKQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0Cgppc01lbWJlcl9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTg0CiAgICAvLyByZXR1cm4gdGhpcy5tZW1iZXJzKHsgZ3JvdXBJZCwgYWNjb3VudCB9KS5leGlzdHMKICAgIGRpZyAyCiAgICBpdG9iCiAgICBkaWcgMgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6Mjc1CiAgICAvLyBtZW1iZXJzID0gQm94TWFwPHsgZ3JvdXBJZDogdWludDY0OyBhY2NvdW50OiBBY2NvdW50IH0sIE1lbWJlcj4oeyBrZXlQcmVmaXg6ICdtJyB9KQogICAgYnl0ZWMgNCAvLyAibSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjU4NAogICAgLy8gcmV0dXJuIHRoaXMubWVtYmVycyh7IGdyb3VwSWQsIGFjY291bnQgfSkuZXhpc3RzCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1NzkKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgcHVzaGJ5dGVzIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMyAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo6QWxnb1NhZmUuaGFzQXBwcm92ZWRbcm91dGluZ10oKSAtPiB2b2lkOgpoYXNBcHByb3ZlZDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1ODcKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTg5CiAgICAvLyBpZiAoZW5zdXJlQnVkZ2V0VmFsdWUgPiBVaW50NjQoMSkpIHsKICAgIGludGNfMSAvLyAxCiAgICA+CiAgICBieiBoYXNBcHByb3ZlZF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1OTAKICAgIC8vIGVuc3VyZUJ1ZGdldChlbnN1cmVCdWRnZXRWYWx1ZSkKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAoKaGFzQXBwcm92ZWRfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjU5MgogICAgLy8gcmV0dXJuIHRoaXMuYXBwcm92YWxzKHsgcHJvcG9zYWxJZCwgYWNjb3VudCB9KS5leGlzdHMKICAgIGRpZyAyCiAgICBpdG9iCiAgICBkaWcgMgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6Mjc3CiAgICAvLyBhcHByb3ZhbHMgPSBCb3hNYXA8eyBwcm9wb3NhbElkOiB1aW50NjQ7IGFjY291bnQ6IEFjY291bnQgfSwgQXBwcm92YWw+KHsga2V5UHJlZml4OiAnYScgfSkKICAgIGJ5dGVjIDE1IC8vICJhIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTkyCiAgICAvLyByZXR1cm4gdGhpcy5hcHByb3ZhbHMoeyBwcm9wb3NhbElkLCBhY2NvdW50IH0pLmV4aXN0cwogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTg3CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIHB1c2hieXRlcyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzMgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OkFsZ29TYWZlLmdldEFjdGl2ZVByaXZHcm91cENvdW50W3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0QWN0aXZlUHJpdkdyb3VwQ291bnQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTk2CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjU5OAogICAgLy8gaWYgKGVuc3VyZUJ1ZGdldFZhbHVlID4gVWludDY0KDEpKSB7CiAgICBpbnRjXzEgLy8gMQogICAgPgogICAgYnogZ2V0QWN0aXZlUHJpdkdyb3VwQ291bnRfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NTk5CiAgICAvLyBlbnN1cmVCdWRnZXQoZW5zdXJlQnVkZ2V0VmFsdWUpCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIGVuc3VyZV9idWRnZXQKCmdldEFjdGl2ZVByaXZHcm91cENvdW50X2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2MDEKICAgIC8vIHJldHVybiB0aGlzLmFjdGl2ZVByaXZHcm91cENvdW50LnZhbHVlCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjI3MQogICAgLy8gYWN0aXZlUHJpdkdyb3VwQ291bnQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnYXBnYycgfSkKICAgIGJ5dGVjXzIgLy8gImFwZ2MiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjAxCiAgICAvLyByZXR1cm4gdGhpcy5hY3RpdmVQcml2R3JvdXBDb3VudC52YWx1ZQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo1OTYKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgaXRvYgogICAgYnl0ZWNfMyAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo6QWxnb1NhZmUuX2Fzc2VydE1lbWJlcihncm91cElkOiB1aW50NjQpIC0+IHZvaWQ6Cl9hc3NlcnRNZW1iZXI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjA4CiAgICAvLyBwcml2YXRlIF9hc3NlcnRNZW1iZXIoZ3JvdXBJZDogdWludDY0KTogdm9pZCB7CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2MDkKICAgIC8vIGFzc2VydCh0aGlzLmdyb3Vwcyhncm91cElkKS5leGlzdHMsICdncm91cCBub3QgZm91bmQnKQogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6Mjc0CiAgICAvLyBncm91cHMgPSBCb3hNYXA8dWludDY0LCBTaWduZXJHcm91cD4oeyBrZXlQcmVmaXg6ICdnJyB9KQogICAgYnl0ZWNfMCAvLyAiZyIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2MDkKICAgIC8vIGFzc2VydCh0aGlzLmdyb3Vwcyhncm91cElkKS5leGlzdHMsICdncm91cCBub3QgZm91bmQnKQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gZ3JvdXAgbm90IGZvdW5kCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjEwCiAgICAvLyBhc3NlcnQodGhpcy5tZW1iZXJzKHsgZ3JvdXBJZCwgYWNjb3VudDogVHhuLnNlbmRlciB9KS5leGlzdHMsICdub3QgYSBncm91cCBtZW1iZXInKQogICAgdHhuIFNlbmRlcgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6Mjc1CiAgICAvLyBtZW1iZXJzID0gQm94TWFwPHsgZ3JvdXBJZDogdWludDY0OyBhY2NvdW50OiBBY2NvdW50IH0sIE1lbWJlcj4oeyBrZXlQcmVmaXg6ICdtJyB9KQogICAgYnl0ZWMgNCAvLyAibSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjYxMAogICAgLy8gYXNzZXJ0KHRoaXMubWVtYmVycyh7IGdyb3VwSWQsIGFjY291bnQ6IFR4bi5zZW5kZXIgfSkuZXhpc3RzLCAnbm90IGEgZ3JvdXAgbWVtYmVyJykKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIG5vdCBhIGdyb3VwIG1lbWJlcgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjpBbGdvU2FmZS5fZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWwocHJvcG9zYWxJZDogdWludDY0KSAtPiB2b2lkOgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjIxCiAgICAvLyBwcml2YXRlIF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbChwcm9wb3NhbElkOiB1aW50NjQpOiB2b2lkIHsKICAgIHByb3RvIDEgMAogICAgaW50Y18wIC8vIDAKICAgIGR1cG4gMzcKICAgIGJ5dGVjXzEgLy8gIiIKICAgIGR1cG4gMzgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2MjIKICAgIC8vIGFzc2VydCh0aGlzLnBhdXNlZC52YWx1ZSA9PT0gVWludDY0KDApLCAnc2FmZSBwYXVzZWQnKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoyNjYKICAgIC8vIHBhdXNlZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdwYXVzZWQnIH0pCiAgICBieXRlYyAxMCAvLyAicGF1c2VkIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjYyMgogICAgLy8gYXNzZXJ0KHRoaXMucGF1c2VkLnZhbHVlID09PSBVaW50NjQoMCksICdzYWZlIHBhdXNlZCcpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIHNhZmUgcGF1c2VkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjIzCiAgICAvLyBjb25zdCBwcm9wb3NhbCA9IGNsb25lKHRoaXMucHJvcG9zYWxzKHByb3Bvc2FsSWQpLnZhbHVlKQogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoyNzYKICAgIC8vIHByb3Bvc2FscyA9IEJveE1hcDx1aW50NjQsIFByb3Bvc2FsPih7IGtleVByZWZpeDogJ3AnIH0pCiAgICBieXRlYyA1IC8vICJwIgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2MjMKICAgIC8vIGNvbnN0IHByb3Bvc2FsID0gY2xvbmUodGhpcy5wcm9wb3NhbHMocHJvcG9zYWxJZCkudmFsdWUpCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2MjQKICAgIC8vIGFzc2VydChwcm9wb3NhbC5zdGF0dXMgPT09IFNUQVRVU19SRUFEWSwgJ25vdCByZWFkeSB0byBleGVjdXRlJykKICAgIGR1cAogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzMgLy8gMgogICAgPT0KICAgIGFzc2VydCAvLyBub3QgcmVhZHkgdG8gZXhlY3V0ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjYyNQogICAgLy8gYXNzZXJ0KEdsb2JhbC5yb3VuZCA8PSBwcm9wb3NhbC5leHBpcnlSb3VuZCwgJ3Byb3Bvc2FsIGV4cGlyZWQnKQogICAgZ2xvYmFsIFJvdW5kCiAgICBkaWcgMQogICAgcHVzaGludCA0MCAvLyA0MAogICAgZXh0cmFjdF91aW50NjQKICAgIDw9CiAgICBhc3NlcnQgLy8gcHJvcG9zYWwgZXhwaXJlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjYyNwogICAgLy8gY29uc3QgZ3JvdXAgPSBjbG9uZSh0aGlzLmdyb3Vwcyhwcm9wb3NhbC5ncm91cElkKS52YWx1ZSkKICAgIGR1cAogICAgZXh0cmFjdCAwIDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoyNzQKICAgIC8vIGdyb3VwcyA9IEJveE1hcDx1aW50NjQsIFNpZ25lckdyb3VwPih7IGtleVByZWZpeDogJ2cnIH0pCiAgICBieXRlY18wIC8vICJnIgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2MjcKICAgIC8vIGNvbnN0IGdyb3VwID0gY2xvbmUodGhpcy5ncm91cHMocHJvcG9zYWwuZ3JvdXBJZCkudmFsdWUpCiAgICBkdXAKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGNvdmVyIDMKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjI3LTYyOAogICAgLy8gY29uc3QgZ3JvdXAgPSBjbG9uZSh0aGlzLmdyb3Vwcyhwcm9wb3NhbC5ncm91cElkKS52YWx1ZSkKICAgIC8vIGFzc2VydChncm91cC5hY3RpdmUgIT09IFVpbnQ2NCgwKSwgJ2dyb3VwIGRpc2FibGVkJykKICAgIGR1cAogICAgcHVzaGludCAxMTQgLy8gMTE0CiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2MjgKICAgIC8vIGFzc2VydChncm91cC5hY3RpdmUgIT09IFVpbnQ2NCgwKSwgJ2dyb3VwIGRpc2FibGVkJykKICAgIGJ0b2kKICAgIGFzc2VydCAvLyBncm91cCBkaXNhYmxlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjYzMwogICAgLy8gY29uc3QgcmVxdWlyZWRUaHJlc2hvbGQ6IHVpbnQ2NCA9IHByb3Bvc2FsLnRocmVzaG9sZCA+PSBncm91cC50aHJlc2hvbGQgPyBwcm9wb3NhbC50aHJlc2hvbGQgOiBncm91cC50aHJlc2hvbGQKICAgIHN3YXAKICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgaW50Y18zIC8vIDIKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgZHVwCiAgICBjb3ZlciAyCiAgICA+PQogICAgYnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX3Rlcm5hcnlfZmFsc2VAMgogICAgZnJhbWVfZGlnIDgyCgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfdGVybmFyeV9tZXJnZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjYzNAogICAgLy8gYXNzZXJ0KHByb3Bvc2FsLmFwcHJvdmFsc0NvdW50ID49IHJlcXVpcmVkVGhyZXNob2xkLCAndGhyZXNob2xkIG5vdCBtZXQnKQogICAgZnJhbWVfZGlnIDc5CiAgICBkdXAKICAgIHB1c2hpbnQgMjQgLy8gMjQKICAgIGV4dHJhY3RfdWludDY0CiAgICB1bmNvdmVyIDIKICAgID49CiAgICBhc3NlcnQgLy8gdGhyZXNob2xkIG5vdCBtZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2MzkKICAgIC8vIGFzc2VydChncm91cC5tZW1iZXJzaGlwRXBvY2ggPT09IHByb3Bvc2FsLmVwb2NoQXRDcmVhdGlvbiwgJ2dyb3VwIG1lbWJlcnNoaXAgY2hhbmdlZCBzaW5jZSBwcm9wb3NhbCBjcmVhdGlvbicpCiAgICBmcmFtZV9kaWcgODAKICAgIHB1c2hpbnQgMTA2IC8vIDEwNgogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkaWcgMQogICAgcHVzaGludCA4OCAvLyA4OAogICAgZXh0cmFjdF91aW50NjQKICAgID09CiAgICBhc3NlcnQgLy8gZ3JvdXAgbWVtYmVyc2hpcCBjaGFuZ2VkIHNpbmNlIHByb3Bvc2FsIGNyZWF0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjQxCiAgICAvLyBpZiAocHJvcG9zYWwucGF5bG9hZFR5cGUgPT09IFBUX1RSQU5TQUNUSU9OX0dST1VQKSB7CiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2NTEKICAgIC8vIGlmIChncm91cC5jb29sZG93blJvdW5kcyAhPT0gVWludDY0KDApICYmIGdyb3VwLmxhc3RFeGVjdXRpb25Sb3VuZCAhPT0gVWludDY0KDApKSB7CiAgICBmcmFtZV9kaWcgODAKICAgIHB1c2hpbnQgOTAgLy8gOTAKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDY3CiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUA3CiAgICBmcmFtZV9kaWcgODAKICAgIHB1c2hpbnQgOTggLy8gOTgKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDY4CiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjUyCiAgICAvLyBhc3NlcnQoR2xvYmFsLnJvdW5kID49IGdyb3VwLmxhc3RFeGVjdXRpb25Sb3VuZCArIGdyb3VwLmNvb2xkb3duUm91bmRzLCAnZ3JvdXAgY29vbGRvd24gbm90IGVsYXBzZWQnKQogICAgZ2xvYmFsIFJvdW5kCiAgICBmcmFtZV9kaWcgNjgKICAgIGZyYW1lX2RpZyA2NwogICAgKwogICAgPj0KICAgIGFzc2VydCAvLyBncm91cCBjb29sZG93biBub3QgZWxhcHNlZAoKX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2NTQKICAgIC8vIHRoaXMuX2V4ZWN1dGVUcmFuc2FjdGlvbkdyb3VwKHByb3Bvc2FsSWQsIHByb3Bvc2FsLmdyb3VwSWQsIGdyb3VwLCBwcm9wb3NhbC5udW1QYXlsb2FkcykKICAgIGZyYW1lX2RpZyA3OQogICAgcHVzaGludCA4MCAvLyA4MAogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2J1cnkgNTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3MzUKICAgIC8vIGZvciAobGV0IHAgPSBVaW50NjQoMSk7IHAgPD0gbnVtUGF5bG9hZHM7IHAgPSBwICsgVWludDY0KDEpKSB7CiAgICBpbnRjXzEgLy8gMQogICAgZnJhbWVfYnVyeSA1NgogICAgZnJhbWVfZGlnIDgxCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMjMKICAgIGZyYW1lX2J1cnkgMjQKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF93aGlsZV90b3BANjE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NzM1CiAgICAvLyBmb3IgKGxldCBwID0gVWludDY0KDEpOyBwIDw9IG51bVBheWxvYWRzOyBwID0gcCArIFVpbnQ2NCgxKSkgewogICAgZnJhbWVfZGlnIDU2CiAgICBmcmFtZV9kaWcgNTUKICAgIDw9CiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfd2hpbGVAMTA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NzM2CiAgICAvLyBjb25zdCBrZXk6IHVpbnQ2NCA9IHByb3Bvc2FsSWQgKiBUWEdfS0VZX01VTFQgKyBwCiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgNyAvLyA3CiAgICAqCiAgICBmcmFtZV9kaWcgNTYKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3MzcKICAgIC8vIGlmICh0aGlzLnRyYW5zYWN0aW9uR3JvdXBzKGtleSkuZXhpc3RzKSB7CiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6Mjc5CiAgICAvLyB0cmFuc2FjdGlvbkdyb3VwcyA9IEJveE1hcDx1aW50NjQsIFNhZmVUeG5Hcm91cD4oeyBrZXlQcmVmaXg6ICd0eGcnIH0pCiAgICBieXRlYyA4IC8vICJ0eGciCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxNgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjczNwogICAgLy8gaWYgKHRoaXMudHJhbnNhY3Rpb25Hcm91cHMoa2V5KS5leGlzdHMpIHsKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYm56IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9pZl9ib2R5QDYzCiAgICBmcmFtZV9kaWcgMjMKICAgIGZyYW1lX2J1cnkgMjUKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDEwNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3MzUKICAgIC8vIGZvciAobGV0IHAgPSBVaW50NjQoMSk7IHAgPD0gbnVtUGF5bG9hZHM7IHAgPSBwICsgVWludDY0KDEpKSB7CiAgICBmcmFtZV9kaWcgNTYKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDU2CiAgICBmcmFtZV9kaWcgMjUKICAgIGZyYW1lX2J1cnkgMjMKICAgIGIgX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX3doaWxlX3RvcEA2MQoKX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2lmX2JvZHlANjM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NzM4CiAgICAvLyBjb25zdCBwYXlsb2FkID0gY2xvbmUodGhpcy50cmFuc2FjdGlvbkdyb3VwcyhrZXkpLnZhbHVlKQogICAgZnJhbWVfZGlnIDE2CiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDI4CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjczOQogICAgLy8gZm9yIChsZXQgaSA9IFVpbnQ2NCgwKTsgaSA8IHBheWxvYWQubGVuZ3RoOyBpID0gaSArIFVpbnQ2NCgxKSkgewogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgNDgKICAgIGZyYW1lX2RpZyAyMwogICAgZnJhbWVfYnVyeSAyNQoKX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX3doaWxlX3RvcEA2NDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3MzgtNzM5CiAgICAvLyBjb25zdCBwYXlsb2FkID0gY2xvbmUodGhpcy50cmFuc2FjdGlvbkdyb3VwcyhrZXkpLnZhbHVlKQogICAgLy8gZm9yIChsZXQgaSA9IFVpbnQ2NCgwKTsgaSA8IHBheWxvYWQubGVuZ3RoOyBpID0gaSArIFVpbnQ2NCgxKSkgewogICAgZnJhbWVfZGlnIDE2CiAgICBpbnRjXzAgLy8gMAogICAgaW50Y18zIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NzM5CiAgICAvLyBmb3IgKGxldCBpID0gVWludDY0KDApOyBpIDwgcGF5bG9hZC5sZW5ndGg7IGkgPSBpICsgVWludDY0KDEpKSB7CiAgICBmcmFtZV9kaWcgNDgKICAgID4KICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDEwNAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjc0MC03NDEKICAgIC8vIGNvbnN0IGVudHJ5ID0gY2xvbmUocGF5bG9hZFtpXSkKICAgIC8vIGlmIChlbnRyeS50eFR5cGUgPT09IFRYX1BBWU1FTlQpIHsKICAgIGludGNfMyAvLyAyCiAgICBmcmFtZV9kaWcgNDgKICAgICoKICAgIGludGNfMyAvLyAyCiAgICArCiAgICBmcmFtZV9kaWcgMTYKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBpbnRjXzMgLy8gMgogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGludGNfMyAvLyAyCiAgICArCiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3NDEKICAgIC8vIGlmIChlbnRyeS50eFR5cGUgPT09IFRYX1BBWU1FTlQpIHsKICAgIGJ0b2kKICAgIGR1cAogICAgZnJhbWVfYnVyeSA2NgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDc0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NzQyCiAgICAvLyBjb25zdCB0eCA9IGRlY29kZUFyYzQ8UGF5bWVudFR4bj4oZW50cnkuZGF0YSkKICAgIGZyYW1lX2RpZyAyOAogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGZyYW1lX2RpZyA0OAogICAgZHVwCiAgICBpbnRjXzMgLy8gMgogICAgKgogICAgZGlnIDMKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgdW5jb3ZlciAyCiAgICBkaWcgMQogICAgLSAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAzCiAgICBsZW4KICAgIHVuY292ZXIgMgogICAgaW50Y18zIC8vIDIKICAgICoKICAgIGRpZyA0CiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgbGVuCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjkxMAogICAgLy8gYXNzZXJ0KChncm91cC5hbGxvd2VkQWN0aW9ucyAmIEFDVF9QQVkpICE9PSBVaW50NjQoMCksICdwYXkgbm90IGFsbG93ZWQnKQogICAgZnJhbWVfZGlnIDI0CiAgICBwdXNoaW50IDI2IC8vIDI2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18xIC8vIDEKICAgICYKICAgIGFzc2VydCAvLyBwYXkgbm90IGFsbG93ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo5MTEKICAgIC8vIGFzc2VydCh0eC5yZWNlaXZlciAhPT0gR2xvYmFsLnplcm9BZGRyZXNzLCAncmVjZWl2ZXIgcmVxdWlyZWQnKQogICAgZHVwCiAgICBleHRyYWN0IDIgMzIKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIGFzc2VydCAvLyByZWNlaXZlciByZXF1aXJlZAogICAgcHVzaGludCA0MiAvLyA0MgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjkxMgogICAgLy8gaWYgKHR4Lmhhc0Nsb3NlICE9PSBVaW50NjQoMCkpIHsKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNzAKICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDE5NwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjkxMwogICAgLy8gYXNzZXJ0KHR4LmNsb3NlUmVtYWluZGVyVG8gIT09IEdsb2JhbC56ZXJvQWRkcmVzcywgJ2Nsb3NlIHRhcmdldCByZXF1aXJlZCcpCiAgICBmcmFtZV9kaWcgMwogICAgZXh0cmFjdCA1MCAzMgogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICAhPQogICAgYXNzZXJ0IC8vIGNsb3NlIHRhcmdldCByZXF1aXJlZAoKX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VAMTk3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjc0NwogICAgLy8gbGV0IGFtb3VudDogdWludDY0ID0gVWludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSA0NQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjc0OAogICAgLy8gaWYgKGdyb3VwLmxpbWl0QXNzZXRJZCA9PT0gVWludDY0KDApKSB7CiAgICBmcmFtZV9kaWcgODEKICAgIHB1c2hpbnQgMzQgLy8gMzQKICAgIGV4dHJhY3RfdWludDY0CiAgICBibnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VANzMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3NDkKICAgIC8vIGFtb3VudCA9IHR4Lmhhc0Nsb3NlICE9PSBVaW50NjQoMCkgPyBvcC5iYWxhbmNlKEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzKSA6IHR4LmFtb3VudAogICAgZnJhbWVfZGlnIDcwCiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfdGVybmFyeV9mYWxzZUA3MQogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIGJhbGFuY2UKICAgIGZyYW1lX2J1cnkgNDUKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDczOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjc1MQogICAgLy8gZ3JvdXAgPSB0aGlzLl9hY2NvdW50U3BlbmQoZ3JvdXAsIGFtb3VudCkKICAgIGZyYW1lX2RpZyA4MQogICAgZnJhbWVfZGlnIDQ1CiAgICBjYWxsc3ViIF9hY2NvdW50U3BlbmQKICAgIHBvcAogICAgZnJhbWVfYnVyeSA4MQogICAgZnJhbWVfZGlnIDI0CiAgICBmcmFtZV9idXJ5IDI1CgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUAxMDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NzM5CiAgICAvLyBmb3IgKGxldCBpID0gVWludDY0KDApOyBpIDwgcGF5bG9hZC5sZW5ndGg7IGkgPSBpICsgVWludDY0KDEpKSB7CiAgICBmcmFtZV9kaWcgNDgKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDQ4CiAgICBiIF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF93aGlsZV90b3BANjQKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF90ZXJuYXJ5X2ZhbHNlQDcxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjc0OQogICAgLy8gYW1vdW50ID0gdHguaGFzQ2xvc2UgIT09IFVpbnQ2NCgwKSA/IG9wLmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MpIDogdHguYW1vdW50CiAgICBmcmFtZV9kaWcgMwogICAgcHVzaGludCAzNCAvLyAzNAogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2J1cnkgNDUKICAgIGIgX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VANzMKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9lbHNlX2JvZHlANzQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NzUyCiAgICAvLyB9IGVsc2UgaWYgKGVudHJ5LnR4VHlwZSA9PT0gVFhfQVNTRVQpIHsKICAgIGZyYW1lX2RpZyA2NgogICAgaW50Y18zIC8vIDIKICAgID09CiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDg3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NzUzCiAgICAvLyBjb25zdCB0eCA9IGRlY29kZUFyYzQ8QXNzZXRUeG4+KGVudHJ5LmRhdGEpCiAgICBmcmFtZV9kaWcgMjgKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBmcmFtZV9kaWcgNDgKICAgIGR1cAogICAgaW50Y18zIC8vIDIKICAgICoKICAgIGRpZyAzCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIHVuY292ZXIgMgogICAgZGlnIDEKICAgIC0gLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMwogICAgbGVuCiAgICB1bmNvdmVyIDIKICAgIGludGNfMyAvLyAyCiAgICAqCiAgICBkaWcgNAogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGxlbgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTE4CiAgICAvLyBhc3NlcnQoKGdyb3VwLmFsbG93ZWRBY3Rpb25zICYgQUNUX0FYRkVSKSAhPT0gVWludDY0KDApLCAnYXhmZXIgbm90IGFsbG93ZWQnKQogICAgZnJhbWVfZGlnIDI0CiAgICBwdXNoaW50IDI2IC8vIDI2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18zIC8vIDIKICAgICYKICAgIGFzc2VydCAvLyBheGZlciBub3QgYWxsb3dlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjkxOQogICAgLy8gYXNzZXJ0KHR4LmFzc2V0UmVjZWl2ZXIgIT09IEdsb2JhbC56ZXJvQWRkcmVzcywgJ2Fzc2V0IHJlY2VpdmVyIHJlcXVpcmVkJykKICAgIGR1cAogICAgZXh0cmFjdCAxMCAzMgogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICAhPQogICAgYXNzZXJ0IC8vIGFzc2V0IHJlY2VpdmVyIHJlcXVpcmVkCiAgICBwdXNoaW50IDUwIC8vIDUwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTIwCiAgICAvLyBpZiAodHguaGFzQXNzZXRDbG9zZSAhPT0gVWludDY0KDApKSB7CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDcwCiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUAxOTMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo5MjEKICAgIC8vIGFzc2VydCh0eC5hc3NldENsb3NlVG8gIT09IEdsb2JhbC56ZXJvQWRkcmVzcywgJ2Fzc2V0IGNsb3NlIHRhcmdldCByZXF1aXJlZCcpCiAgICBmcmFtZV9kaWcgMTAKICAgIGV4dHJhY3QgNTggMzIKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIGFzc2VydCAvLyBhc3NldCBjbG9zZSB0YXJnZXQgcmVxdWlyZWQKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDE5MzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3NTUKICAgIC8vIGNvbnN0IHRyYWNrZWQgPSBncm91cC5saW1pdEFzc2V0SWQgIT09IFVpbnQ2NCgwKSAmJiB0eC54ZmVyQXNzZXQgPT09IGdyb3VwLmxpbWl0QXNzZXRJZAogICAgZnJhbWVfZGlnIDgxCiAgICBwdXNoaW50IDM0IC8vIDM0CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDc1CiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYm9vbF9mYWxzZUA4MAogICAgZnJhbWVfZGlnIDEwCiAgICBpbnRjXzMgLy8gMgogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2RpZyA3NQogICAgPT0KICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9ib29sX2ZhbHNlQDgwCiAgICBpbnRjXzEgLy8gMQoKX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2Jvb2xfbWVyZ2VAODE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NzU4CiAgICAvLyBsZXQgYW1vdW50OiB1aW50NjQgPSBVaW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDQ2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NzU5CiAgICAvLyBpZiAodHJhY2tlZCkgewogICAgYnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VAODYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3NjAKICAgIC8vIGlmICh0eC5oYXNBc3NldENsb3NlICE9PSBVaW50NjQoMCkpIHsKICAgIGZyYW1lX2RpZyA3MAogICAgYnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2Vsc2VfYm9keUA4NAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjc2MQogICAgLy8gY29uc3QgW2JhbF0gPSBvcC5Bc3NldEhvbGRpbmcuYXNzZXRCYWxhbmNlKEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLCB0eC54ZmVyQXNzZXQpCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgZnJhbWVfZGlnIDEwCiAgICBpbnRjXzMgLy8gMgogICAgZXh0cmFjdF91aW50NjQKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgcG9wCiAgICBmcmFtZV9idXJ5IDQ2CgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUA4NjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3NjcKICAgIC8vIGdyb3VwID0gdGhpcy5fYWNjb3VudFNwZW5kKGdyb3VwLCBhbW91bnQpCiAgICBmcmFtZV9kaWcgODEKICAgIGZyYW1lX2RpZyA0NgogICAgY2FsbHN1YiBfYWNjb3VudFNwZW5kCiAgICBwb3AKICAgIGZyYW1lX2J1cnkgODEKICAgIGZyYW1lX2RpZyAyNAogICAgZnJhbWVfYnVyeSAyNQogICAgYiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUAxMDIKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9lbHNlX2JvZHlAODQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NzY0CiAgICAvLyBhbW91bnQgPSB0eC5hc3NldEFtb3VudAogICAgZnJhbWVfZGlnIDEwCiAgICBwdXNoaW50IDQyIC8vIDQyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZnJhbWVfYnVyeSA0NgogICAgYiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUA4NgoKX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2Jvb2xfZmFsc2VAODA6CiAgICBpbnRjXzAgLy8gMAogICAgYiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYm9vbF9tZXJnZUA4MQoKX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2Vsc2VfYm9keUA4NzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3NjgKICAgIC8vIH0gZWxzZSBpZiAoZW50cnkudHhUeXBlID09PSBUWF9BUFApIHsKICAgIGZyYW1lX2RpZyA2NgogICAgcHVzaGludCAzIC8vIDMKICAgID09CiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDkxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NzY5CiAgICAvLyBjb25zdCB0eCA9IGRlY29kZUFyYzQ8QXBwVHhuPihlbnRyeS5kYXRhKQogICAgZnJhbWVfZGlnIDI4CiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZnJhbWVfZGlnIDQ4CiAgICBkdXAKICAgIGludGNfMyAvLyAyCiAgICAqCiAgICBkaWcgMwogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIHN3YXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICB1bmNvdmVyIDIKICAgIGRpZyAxCiAgICAtIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDMKICAgIGxlbgogICAgdW5jb3ZlciAyCiAgICBpbnRjXzMgLy8gMgogICAgKgogICAgZGlnIDQKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBsZW4KICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo5MjYKICAgIC8vIGFzc2VydCgoZ3JvdXAuYWxsb3dlZEFjdGlvbnMgJiBBQ1RfQVBQTCkgIT09IFVpbnQ2NCgwKSwgJ2FwcGwgbm90IGFsbG93ZWQnKQogICAgZnJhbWVfZGlnIDI0CiAgICBwdXNoaW50IDI2IC8vIDI2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgcHVzaGludCA0IC8vIDQKICAgICYKICAgIGFzc2VydCAvLyBhcHBsIG5vdCBhbGxvd2VkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTI3CiAgICAvLyBhc3NlcnQodHguYXBwSWQgIT09IFVpbnQ2NCgwKSwgJ2FwcElkIHJlcXVpcmVkJykgLy8gY3JlYXRlL3VwZGF0ZSBuZWVkIHByb2dyYW1zIGFuZCBhcmUgbm90IHN1cHBvcnRlZCBoZXJlCiAgICBkaWcgMQogICAgaW50Y18zIC8vIDIKICAgIGV4dHJhY3RfdWludDY0CiAgICBhc3NlcnQgLy8gYXBwSWQgcmVxdWlyZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo5MjgKICAgIC8vIGFzc2VydCh0eC5vbkNvbXBsZXRpb24gPD0gVWludDY0KDUpLCAnaW52YWxpZCBvbkNvbXBsZXRpb24nKQogICAgc3dhcAogICAgcHVzaGludCAxMCAvLyAxMAogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgcHVzaGludCA1IC8vIDUKICAgIDw9CiAgICBhc3NlcnQgLy8gaW52YWxpZCBvbkNvbXBsZXRpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo5MjkKICAgIC8vIGFzc2VydCh0eC5vbkNvbXBsZXRpb24gIT09IFVpbnQ2NCg0KSwgJ2FwcCB1cGRhdGUgbm90IHN1cHBvcnRlZCcpCiAgICBwdXNoaW50IDQgLy8gNAogICAgIT0KICAgIGFzc2VydCAvLyBhcHAgdXBkYXRlIG5vdCBzdXBwb3J0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo5MzAKICAgIC8vIGNvbnN0IG51bUFyZ3MgPSBVaW50NjQodHguYXBwQXJncy5sZW5ndGgpCiAgICBkdXAKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgcHVzaGludCAxOCAvLyAxOAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICB1bmNvdmVyIDIKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMTMKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGZyYW1lX2J1cnkgNTQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo5MzEKICAgIC8vIGNvbnN0IG51bUFjY291bnRzID0gVWludDY0KHR4LmFjY291bnRzLmxlbmd0aCkKICAgIGRpZyAxCiAgICBwdXNoaW50IDIwIC8vIDIwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIHVuY292ZXIgMgogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTMyCiAgICAvLyBjb25zdCBudW1BcHBzID0gVWludDY0KHR4LmZvcmVpZ25BcHBzLmxlbmd0aCkKICAgIGRpZyAyCiAgICBwdXNoaW50IDIyIC8vIDIyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDMKICAgIHVuY292ZXIgMwogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTMzCiAgICAvLyBjb25zdCBudW1Bc3NldHMgPSBVaW50NjQodHguZm9yZWlnbkFzc2V0cy5sZW5ndGgpCiAgICBkaWcgMwogICAgcHVzaGludCAyNCAvLyAyNAogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgNAogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTM0CiAgICAvLyBhc3NlcnQobnVtQXJncyA8PSBNQVhfQVBQX0FSR1MsICd0b28gbWFueSBhcHAgYXJncycpCiAgICB1bmNvdmVyIDMKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIDw9CiAgICBhc3NlcnQgLy8gdG9vIG1hbnkgYXBwIGFyZ3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo5MzUKICAgIC8vIGFzc2VydChudW1BY2NvdW50cyA8PSBNQVhfQVBQX0FDQ09VTlRTLCAndG9vIG1hbnkgYWNjb3VudHMnKQogICAgZGlnIDIKICAgIHB1c2hpbnQgNCAvLyA0CiAgICA8PQogICAgYXNzZXJ0IC8vIHRvbyBtYW55IGFjY291bnRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTM2CiAgICAvLyBhc3NlcnQobnVtQXBwcyA8PSBNQVhfQVBQX0ZPUkVJR05fQVBQUywgJ3RvbyBtYW55IGZvcmVpZ24gYXBwcycpCiAgICBkaWcgMQogICAgaW50Y18yIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gdG9vIG1hbnkgZm9yZWlnbiBhcHBzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTM3CiAgICAvLyBhc3NlcnQobnVtQXNzZXRzIDw9IE1BWF9BUFBfRk9SRUlHTl9BU1NFVFMsICd0b28gbWFueSBmb3JlaWduIGFzc2V0cycpCiAgICBkdXAKICAgIGludGNfMiAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIHRvbyBtYW55IGZvcmVpZ24gYXNzZXRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTM4CiAgICAvLyBhc3NlcnQobnVtQWNjb3VudHMgKyBudW1BcHBzICsgbnVtQXNzZXRzIDw9IE1BWF9BUFBfVE9UQUxfUkVGUywgJ3RvbyBtYW55IHJlZmVyZW5jZXMnKQogICAgY292ZXIgMgogICAgKwogICAgKwogICAgaW50Y18yIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gdG9vIG1hbnkgcmVmZXJlbmNlcwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjkzOQogICAgLy8gbGV0IHRvdGFsQXJnTGVuID0gVWludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSA2NAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjk0MAogICAgLy8gZm9yIChsZXQgaSA9IFVpbnQ2NCgwKTsgaSA8IG51bUFyZ3M7IGkgPSBpICsgVWludDY0KDEpKSB7CiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSA0OQoKX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX3doaWxlX3RvcEAxODc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTQwCiAgICAvLyBmb3IgKGxldCBpID0gVWludDY0KDApOyBpIDwgbnVtQXJnczsgaSA9IGkgKyBVaW50NjQoMSkpIHsKICAgIGZyYW1lX2RpZyA0OQogICAgZnJhbWVfZGlnIDU0CiAgICA8CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNjAKICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl93aGlsZUAxODkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo5NDEKICAgIC8vIHRvdGFsQXJnTGVuID0gdG90YWxBcmdMZW4gKyB0eC5hcHBBcmdzW2ldLmxlbmd0aAogICAgZnJhbWVfZGlnIDEzCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDYwCiAgICBhc3NlcnQgLy8gaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGZyYW1lX2RpZyA0OQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzMgLy8gMgogICAgKgogICAgZGlnIDEKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18zIC8vIDIKICAgICsKICAgIGV4dHJhY3QzCiAgICBleHRyYWN0IDIgMAogICAgbGVuCiAgICBmcmFtZV9kaWcgNjQKICAgICsKICAgIGZyYW1lX2J1cnkgNjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo5NDAKICAgIC8vIGZvciAobGV0IGkgPSBVaW50NjQoMCk7IGkgPCBudW1BcmdzOyBpID0gaSArIFVpbnQ2NCgxKSkgewogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgNDkKICAgIGIgX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX3doaWxlX3RvcEAxODcKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl93aGlsZUAxODk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTQzCiAgICAvLyBhc3NlcnQodG90YWxBcmdMZW4gPD0gTUFYX0FQUF9UT1RBTF9BUkdfTEVOLCAnYXBwIGFyZ3MgdG90YWwgbGVuZ3RoIGV4Y2VlZGVkJykKICAgIGZyYW1lX2RpZyA2NAogICAgcHVzaGludCAyMDQ4IC8vIDIwNDgKICAgIDw9CiAgICBhc3NlcnQgLy8gYXBwIGFyZ3MgdG90YWwgbGVuZ3RoIGV4Y2VlZGVkCiAgICBmcmFtZV9kaWcgMjQKICAgIGZyYW1lX2J1cnkgMjUKICAgIGIgX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VAMTAyCgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDkxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjc3MQogICAgLy8gfSBlbHNlIGlmIChlbnRyeS50eFR5cGUgPT09IFRYX0tFWVJFRykgewogICAgZnJhbWVfZGlnIDY2CiAgICBwdXNoaW50IDQgLy8gNAogICAgPT0KICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9lbHNlX2JvZHlAOTMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3NzMKICAgIC8vIGFzc2VydCgoZ3JvdXBJbi5hbGxvd2VkQWN0aW9ucyAmIEFDVF9LRVlSRUcpICE9PSBVaW50NjQoMCksICdrZXlyZWcgbm90IGFsbG93ZWQnKQogICAgZnJhbWVfZGlnIDI0CiAgICBwdXNoaW50IDI2IC8vIDI2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18yIC8vIDgKICAgICYKICAgIGFzc2VydCAvLyBrZXlyZWcgbm90IGFsbG93ZWQKICAgIGIgX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VAMTAyCgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDkzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjc3NAogICAgLy8gfSBlbHNlIGlmIChlbnRyeS50eFR5cGUgPT09IFRYX0FDRkcpIHsKICAgIGZyYW1lX2RpZyA2NgogICAgcHVzaGludCA1IC8vIDUKICAgID09CiAgICBhc3NlcnQgLy8gdW5rbm93biB0eCB0eXBlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6Nzc1CiAgICAvLyBjb25zdCB0eCA9IGRlY29kZUFyYzQ8QXNzZXRDb25maWdUeG4+KGVudHJ5LmRhdGEpCiAgICBmcmFtZV9kaWcgMjgKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBmcmFtZV9kaWcgNDgKICAgIGR1cAogICAgaW50Y18zIC8vIDIKICAgICoKICAgIGRpZyAzCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIHVuY292ZXIgMgogICAgZGlnIDEKICAgIC0gLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMwogICAgbGVuCiAgICB1bmNvdmVyIDIKICAgIGludGNfMyAvLyAyCiAgICAqCiAgICBkaWcgNAogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGxlbgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo5NDcKICAgIC8vIGFzc2VydCgoZ3JvdXAuYWxsb3dlZEFjdGlvbnMgJiBBQ1RfQUNGRykgIT09IFVpbnQ2NCgwKSwgJ2FjZmcgbm90IGFsbG93ZWQnKQogICAgZnJhbWVfZGlnIDI0CiAgICBwdXNoaW50IDI2IC8vIDI2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgcHVzaGludCAxNiAvLyAxNgogICAgJgogICAgYXNzZXJ0IC8vIGFjZmcgbm90IGFsbG93ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo5NDkKICAgIC8vIHR4Lm1ldGFkYXRhSGFzaC5sZW5ndGggPT09IFVpbnQ2NCgwKSB8fCB0eC5tZXRhZGF0YUhhc2gubGVuZ3RoID09PSBVaW50NjQoMzIpLAogICAgZHVwCiAgICBwdXNoaW50IDM4IC8vIDM4CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGludGMgNCAvLyAxNjgKICAgIGV4dHJhY3RfdWludDE2CiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgbGVuCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNjEKICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9ib29sX3RydWVAMTgyCiAgICBmcmFtZV9kaWcgNjEKICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgID09CiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYm9vbF9mYWxzZUAxODMKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9ib29sX3RydWVAMTgyOgogICAgaW50Y18xIC8vIDEKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9ib29sX21lcmdlQDE4NDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo5NDgtOTUxCiAgICAvLyBhc3NlcnQoCiAgICAvLyAgIHR4Lm1ldGFkYXRhSGFzaC5sZW5ndGggPT09IFVpbnQ2NCgwKSB8fCB0eC5tZXRhZGF0YUhhc2gubGVuZ3RoID09PSBVaW50NjQoMzIpLAogICAgLy8gICAnbWV0YWRhdGFIYXNoIG11c3QgYmUgMCBvciAzMiBieXRlcycsCiAgICAvLyApCiAgICBhc3NlcnQgLy8gbWV0YWRhdGFIYXNoIG11c3QgYmUgMCBvciAzMiBieXRlcwogICAgZnJhbWVfZGlnIDI0CiAgICBmcmFtZV9idXJ5IDI1CiAgICBiIF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDEwMgoKX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2Jvb2xfZmFsc2VAMTgzOgogICAgaW50Y18wIC8vIDAKICAgIGIgX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2Jvb2xfbWVyZ2VAMTg0CgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfd2hpbGVAMTA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjc4NAogICAgLy8gZ3JvdXAubGFzdEV4ZWN1dGlvblJvdW5kID0gR2xvYmFsLnJvdW5kCiAgICBnbG9iYWwgUm91bmQKICAgIGl0b2IKICAgIGZyYW1lX2RpZyA4MQogICAgc3dhcAogICAgcmVwbGFjZTIgOTgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3ODUKICAgIC8vIHRoaXMuZ3JvdXBzKGdyb3VwSWQpLnZhbHVlID0gY2xvbmUoZ3JvdXApCiAgICBmcmFtZV9kaWcgODAKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6Nzg3CiAgICAvLyBsZXQgdHhJbmRleCA9IFVpbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgNjUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3ODgKICAgIC8vIGZvciAobGV0IHAgPSBVaW50NjQoMSk7IHAgPD0gbnVtUGF5bG9hZHM7IHAgPSBwICsgVWludDY0KDEpKSB7CiAgICBpbnRjXzEgLy8gMQogICAgZnJhbWVfYnVyeSA1NwoKX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX3doaWxlX3RvcEAxMDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6Nzg4CiAgICAvLyBmb3IgKGxldCBwID0gVWludDY0KDEpOyBwIDw9IG51bVBheWxvYWRzOyBwID0gcCArIFVpbnQ2NCgxKSkgewogICAgZnJhbWVfZGlnIDU3CiAgICBmcmFtZV9kaWcgNTUKICAgIDw9CiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfd2hpbGVAMTI1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6Nzg5CiAgICAvLyBjb25zdCBrZXk6IHVpbnQ2NCA9IHByb3Bvc2FsSWQgKiBUWEdfS0VZX01VTFQgKyBwCiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgNyAvLyA3CiAgICAqCiAgICBmcmFtZV9kaWcgNTcKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3OTAKICAgIC8vIGlmICh0aGlzLnRyYW5zYWN0aW9uR3JvdXBzKGtleSkuZXhpc3RzKSB7CiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6Mjc5CiAgICAvLyB0cmFuc2FjdGlvbkdyb3VwcyA9IEJveE1hcDx1aW50NjQsIFNhZmVUeG5Hcm91cD4oeyBrZXlQcmVmaXg6ICd0eGcnIH0pCiAgICBieXRlYyA4IC8vICJ0eGciCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxOQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjc5MAogICAgLy8gaWYgKHRoaXMudHJhbnNhY3Rpb25Hcm91cHMoa2V5KS5leGlzdHMpIHsKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VAMTI0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NzkxCiAgICAvLyBjb25zdCBwYXlsb2FkID0gY2xvbmUodGhpcy50cmFuc2FjdGlvbkdyb3VwcyhrZXkpLnZhbHVlKQogICAgZnJhbWVfZGlnIDE5CiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDI5CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjc5MgogICAgLy8gZm9yIChsZXQgaSA9IFVpbnQ2NCgwKTsgaSA8IHBheWxvYWQubGVuZ3RoOyBpID0gaSArIFVpbnQ2NCgxKSkgewogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgNTAKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF93aGlsZV90b3BAMTA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjc5MS03OTIKICAgIC8vIGNvbnN0IHBheWxvYWQgPSBjbG9uZSh0aGlzLnRyYW5zYWN0aW9uR3JvdXBzKGtleSkudmFsdWUpCiAgICAvLyBmb3IgKGxldCBpID0gVWludDY0KDApOyBpIDwgcGF5bG9hZC5sZW5ndGg7IGkgPSBpICsgVWludDY0KDEpKSB7CiAgICBmcmFtZV9kaWcgMTkKICAgIGludGNfMCAvLyAwCiAgICBpbnRjXzMgLy8gMgogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3OTIKICAgIC8vIGZvciAobGV0IGkgPSBVaW50NjQoMCk7IGkgPCBwYXlsb2FkLmxlbmd0aDsgaSA9IGkgKyBVaW50NjQoMSkpIHsKICAgIGZyYW1lX2RpZyA1MAogICAgPgogICAgYnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VAMTI0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6Nzk0CiAgICAvLyBjb25zdCBmaXJzdCA9IHR4SW5kZXggPT09IFVpbnQ2NCgwKQogICAgZnJhbWVfZGlnIDY1CiAgICAhCiAgICBmcmFtZV9idXJ5IDQ3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6Nzk1CiAgICAvLyBpZiAoZW50cnkudHhUeXBlID09PSBUWF9QQVlNRU5UKSB7CiAgICBpbnRjXzMgLy8gMgogICAgZnJhbWVfZGlnIDUwCiAgICAqCiAgICBpbnRjXzMgLy8gMgogICAgKwogICAgZnJhbWVfZGlnIDE5CiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgaW50Y18zIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBpbnRjXzMgLy8gMgogICAgKwogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNzEKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2Vsc2VfYm9keUAxMTIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3OTYKICAgIC8vIHRoaXMuX3N0YWdlUGF5bWVudChkZWNvZGVBcmM0PFBheW1lbnRUeG4+KGVudHJ5LmRhdGEpLCBmaXJzdCkKICAgIGZyYW1lX2RpZyAyOQogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGZyYW1lX2RpZyA1MAogICAgZHVwCiAgICBpbnRjXzMgLy8gMgogICAgKgogICAgZGlnIDMKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgdW5jb3ZlciAyCiAgICBkaWcgMQogICAgLSAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAzCiAgICBsZW4KICAgIHVuY292ZXIgMgogICAgaW50Y18zIC8vIDIKICAgICoKICAgIGRpZyA0CiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgbGVuCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNAogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfYnVyeSAzMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjgyNgogICAgLy8gdGhpcy5fYmVnaW5Pck5leHQoZmlyc3QpCiAgICBmcmFtZV9kaWcgNDcKICAgIGNhbGxzdWIgX2JlZ2luT3JOZXh0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODI3CiAgICAvLyBvcC5JVHhuQ3JlYXRlLnNldFR5cGVFbnVtKFVpbnQ2NChUcmFuc2FjdGlvblR5cGUuUGF5bWVudCkpCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjgyOAogICAgLy8gb3AuSVR4bkNyZWF0ZS5zZXRGZWUoVWludDY0KDApKQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODI5CiAgICAvLyBvcC5JVHhuQ3JlYXRlLnNldFJlY2VpdmVyKHR4LnJlY2VpdmVyKQogICAgZHVwCiAgICBleHRyYWN0IDIgMzIKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4MzAKICAgIC8vIG9wLklUeG5DcmVhdGUuc2V0QW1vdW50KHR4LmFtb3VudCkKICAgIGR1cAogICAgcHVzaGludCAzNCAvLyAzNAogICAgZXh0cmFjdF91aW50NjQKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICBwdXNoaW50IDQyIC8vIDQyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODMxCiAgICAvLyBpZiAodHguaGFzQ2xvc2UgIT09IFVpbnQ2NCgwKSkgb3AuSVR4bkNyZWF0ZS5zZXRDbG9zZVJlbWFpbmRlclRvKHR4LmNsb3NlUmVtYWluZGVyVG8pCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VAMTc2CiAgICBmcmFtZV9kaWcgNAogICAgZXh0cmFjdCA1MCAzMgogICAgaXR4bl9maWVsZCBDbG9zZVJlbWFpbmRlclRvCgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUAxNzY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODMyCiAgICAvLyBpZiAodHgubm90ZSAhPT0gJycpIG9wLklUeG5DcmVhdGUuc2V0Tm90ZShCeXRlcyh0eC5ub3RlKSkKICAgIGZyYW1lX2RpZyAzMAogICAgZHVwCiAgICBwdXNoaW50IDgwIC8vIDgwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGxlbgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgZnJhbWVfYnVyeSAzNAogICAgYnl0ZWNfMSAvLyAiIgogICAgIT0KICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDEyMgogICAgZnJhbWVfZGlnIDM0CiAgICBpdHhuX2ZpZWxkIE5vdGUKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDEyMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4MDYKICAgIC8vIHR4SW5kZXggPSB0eEluZGV4ICsgVWludDY0KDEpCiAgICBmcmFtZV9kaWcgNjUKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDY1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NzkyCiAgICAvLyBmb3IgKGxldCBpID0gVWludDY0KDApOyBpIDwgcGF5bG9hZC5sZW5ndGg7IGkgPSBpICsgVWludDY0KDEpKSB7CiAgICBmcmFtZV9kaWcgNTAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDUwCiAgICBiIF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF93aGlsZV90b3BAMTA5CgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDExMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3OTcKICAgIC8vIH0gZWxzZSBpZiAoZW50cnkudHhUeXBlID09PSBUWF9BU1NFVCkgewogICAgZnJhbWVfZGlnIDcxCiAgICBpbnRjXzMgLy8gMgogICAgPT0KICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9lbHNlX2JvZHlAMTE0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6Nzk4CiAgICAvLyB0aGlzLl9zdGFnZUFzc2V0KGRlY29kZUFyYzQ8QXNzZXRUeG4+KGVudHJ5LmRhdGEpLCBmaXJzdCkKICAgIGZyYW1lX2RpZyAyOQogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGZyYW1lX2RpZyA1MAogICAgZHVwCiAgICBpbnRjXzMgLy8gMgogICAgKgogICAgZGlnIDMKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgdW5jb3ZlciAyCiAgICBkaWcgMQogICAgLSAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAzCiAgICBsZW4KICAgIHVuY292ZXIgMgogICAgaW50Y18zIC8vIDIKICAgICoKICAgIGRpZyA0CiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgbGVuCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNQogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfYnVyeSAzMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjgzNgogICAgLy8gdGhpcy5fYmVnaW5Pck5leHQoZmlyc3QpCiAgICBmcmFtZV9kaWcgNDcKICAgIGNhbGxzdWIgX2JlZ2luT3JOZXh0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODM3CiAgICAvLyBvcC5JVHhuQ3JlYXRlLnNldFR5cGVFbnVtKFVpbnQ2NChUcmFuc2FjdGlvblR5cGUuQXNzZXRUcmFuc2ZlcikpCiAgICBwdXNoaW50IDQgLy8gNAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjgzOAogICAgLy8gb3AuSVR4bkNyZWF0ZS5zZXRGZWUoVWludDY0KDApKQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODM5CiAgICAvLyBvcC5JVHhuQ3JlYXRlLnNldFhmZXJBc3NldCh0eC54ZmVyQXNzZXQpCiAgICBkdXAKICAgIGludGNfMyAvLyAyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4NDAKICAgIC8vIG9wLklUeG5DcmVhdGUuc2V0QXNzZXRSZWNlaXZlcih0eC5hc3NldFJlY2VpdmVyKQogICAgZHVwCiAgICBleHRyYWN0IDEwIDMyCiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4NDEKICAgIC8vIG9wLklUeG5DcmVhdGUuc2V0QXNzZXRBbW91bnQodHguYXNzZXRBbW91bnQpCiAgICBkdXAKICAgIHB1c2hpbnQgNDIgLy8gNDIKICAgIGV4dHJhY3RfdWludDY0CiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBwdXNoaW50IDUwIC8vIDUwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODQyCiAgICAvLyBpZiAodHguaGFzQXNzZXRDbG9zZSAhPT0gVWludDY0KDApKSBvcC5JVHhuQ3JlYXRlLnNldEFzc2V0Q2xvc2VUbyh0eC5hc3NldENsb3NlVG8pCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VAMTcwCiAgICBmcmFtZV9kaWcgNQogICAgZXh0cmFjdCA1OCAzMgogICAgaXR4bl9maWVsZCBBc3NldENsb3NlVG8KCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDE3MDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4NDMKICAgIC8vIGlmICh0eC5ub3RlICE9PSAnJykgb3AuSVR4bkNyZWF0ZS5zZXROb3RlKEJ5dGVzKHR4Lm5vdGUpKQogICAgZnJhbWVfZGlnIDMwCiAgICBkdXAKICAgIHB1c2hpbnQgODggLy8gODgKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgbGVuCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDM1CiAgICBieXRlY18xIC8vICIiCiAgICAhPQogICAgYnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VAMTIyCiAgICBmcmFtZV9kaWcgMzUKICAgIGl0eG5fZmllbGQgTm90ZQogICAgYiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUAxMjIKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9lbHNlX2JvZHlAMTE0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjc5OQogICAgLy8gfSBlbHNlIGlmIChlbnRyeS50eFR5cGUgPT09IFRYX0FQUCkgewogICAgZnJhbWVfZGlnIDcxCiAgICBwdXNoaW50IDMgLy8gMwogICAgPT0KICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9lbHNlX2JvZHlAMTE2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODAwCiAgICAvLyB0aGlzLl9zdGFnZUFwcENhbGwoZGVjb2RlQXJjNDxBcHBUeG4+KGVudHJ5LmRhdGEpLCBmaXJzdCkKICAgIGZyYW1lX2RpZyAyOQogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGZyYW1lX2RpZyA1MAogICAgZHVwCiAgICBpbnRjXzMgLy8gMgogICAgKgogICAgZGlnIDMKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgdW5jb3ZlciAyCiAgICBkaWcgMQogICAgLSAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAzCiAgICBsZW4KICAgIHVuY292ZXIgMgogICAgaW50Y18zIC8vIDIKICAgICoKICAgIGRpZyA0CiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgbGVuCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMzAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4NDcKICAgIC8vIHRoaXMuX2JlZ2luT3JOZXh0KGZpcnN0KQogICAgZnJhbWVfZGlnIDQ3CiAgICBjYWxsc3ViIF9iZWdpbk9yTmV4dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjg0OAogICAgLy8gb3AuSVR4bkNyZWF0ZS5zZXRUeXBlRW51bShVaW50NjQoVHJhbnNhY3Rpb25UeXBlLkFwcGxpY2F0aW9uQ2FsbCkpCiAgICBwdXNoaW50IDYgLy8gNgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjg0OQogICAgLy8gb3AuSVR4bkNyZWF0ZS5zZXRGZWUoVWludDY0KDApKQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODUwCiAgICAvLyBvcC5JVHhuQ3JlYXRlLnNldEFwcGxpY2F0aW9uSWQodHguYXBwSWQpCiAgICBkdXAKICAgIGludGNfMyAvLyAyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBwdXNoaW50IDEwIC8vIDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODUxCiAgICAvLyBvcC5JVHhuQ3JlYXRlLnNldE9uQ29tcGxldGlvbih0eC5vbkNvbXBsZXRpb24pCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4NTIKICAgIC8vIGlmICh0eC5ub3RlICE9PSAnJykgb3AuSVR4bkNyZWF0ZS5zZXROb3RlKEJ5dGVzKHR4Lm5vdGUpKQogICAgZHVwCiAgICBwdXNoaW50IDI0IC8vIDI0CiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9idXJ5IDM4CiAgICBkdXAKICAgIGxlbgogICAgc3dhcAogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgZnJhbWVfYnVyeSAzMwogICAgYnl0ZWNfMSAvLyAiIgogICAgIT0KICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDE1NAogICAgZnJhbWVfZGlnIDMzCiAgICBpdHhuX2ZpZWxkIE5vdGUKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDE1NDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4NTMKICAgIC8vIGZvciAobGV0IGkgPSBVaW50NjQoMCk7IGkgPCBVaW50NjQodHguYXBwQXJncy5sZW5ndGgpOyBpID0gaSArIFVpbnQ2NCgxKSkgewogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgNDgKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF93aGlsZV90b3BAMTU1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjg1MwogICAgLy8gZm9yIChsZXQgaSA9IFVpbnQ2NCgwKTsgaSA8IFVpbnQ2NCh0eC5hcHBBcmdzLmxlbmd0aCk7IGkgPSBpICsgVWludDY0KDEpKSB7CiAgICBmcmFtZV9kaWcgMzAKICAgIGR1cAogICAgcHVzaGludCAxNiAvLyAxNgogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBwdXNoaW50IDE4IC8vIDE4CiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDM5CiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGZyYW1lX2RpZyA0OAogICAgPgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDYyCiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfd2hpbGVAMTU3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODUzLTg1NAogICAgLy8gZm9yIChsZXQgaSA9IFVpbnQ2NCgwKTsgaSA8IFVpbnQ2NCh0eC5hcHBBcmdzLmxlbmd0aCk7IGkgPSBpICsgVWludDY0KDEpKSB7CiAgICAvLyAgIG9wLklUeG5DcmVhdGUuc2V0QXBwbGljYXRpb25BcmdzKHR4LmFwcEFyZ3NbaV0pCiAgICBmcmFtZV9kaWcgNgogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyA2MgogICAgYXNzZXJ0IC8vIGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBmcmFtZV9kaWcgNDgKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18zIC8vIDIKICAgICoKICAgIGRpZyAxCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMyAvLyAyCiAgICArCiAgICBleHRyYWN0MwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjg1NAogICAgLy8gb3AuSVR4bkNyZWF0ZS5zZXRBcHBsaWNhdGlvbkFyZ3ModHguYXBwQXJnc1tpXSkKICAgIGV4dHJhY3QgMiAwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjg1MwogICAgLy8gZm9yIChsZXQgaSA9IFVpbnQ2NCgwKTsgaSA8IFVpbnQ2NCh0eC5hcHBBcmdzLmxlbmd0aCk7IGkgPSBpICsgVWludDY0KDEpKSB7CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSA0OAogICAgYiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfd2hpbGVfdG9wQDE1NQoKX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX3doaWxlQDE1NzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4NTYKICAgIC8vIGZvciAobGV0IGkgPSBVaW50NjQoMCk7IGkgPCBVaW50NjQodHguYWNjb3VudHMubGVuZ3RoKTsgaSA9IGkgKyBVaW50NjQoMSkpIHsKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDUxCgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfd2hpbGVfdG9wQDE1ODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4NTYKICAgIC8vIGZvciAobGV0IGkgPSBVaW50NjQoMCk7IGkgPCBVaW50NjQodHguYWNjb3VudHMubGVuZ3RoKTsgaSA9IGkgKyBVaW50NjQoMSkpIHsKICAgIGZyYW1lX2RpZyAzMAogICAgZHVwCiAgICBwdXNoaW50IDIwIC8vIDIwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDQwCiAgICBmcmFtZV9kaWcgMzkKICAgIHN3YXAKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgZnJhbWVfYnVyeSA3CiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZnJhbWVfZGlnIDUxCiAgICA+CiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfd2hpbGVAMTYwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODU2LTg1NwogICAgLy8gZm9yIChsZXQgaSA9IFVpbnQ2NCgwKTsgaSA8IFVpbnQ2NCh0eC5hY2NvdW50cy5sZW5ndGgpOyBpID0gaSArIFVpbnQ2NCgxKSkgewogICAgLy8gICBvcC5JVHhuQ3JlYXRlLnNldEFjY291bnRzKHR4LmFjY291bnRzW2ldKQogICAgZnJhbWVfZGlnIDcKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgNTEKICAgIGR1cAogICAgY292ZXIgMgogICAgcHVzaGludCAzMiAvLyAzMgogICAgKgogICAgcHVzaGludCAzMiAvLyAzMgogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODU3CiAgICAvLyBvcC5JVHhuQ3JlYXRlLnNldEFjY291bnRzKHR4LmFjY291bnRzW2ldKQogICAgaXR4bl9maWVsZCBBY2NvdW50cwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjg1NgogICAgLy8gZm9yIChsZXQgaSA9IFVpbnQ2NCgwKTsgaSA8IFVpbnQ2NCh0eC5hY2NvdW50cy5sZW5ndGgpOyBpID0gaSArIFVpbnQ2NCgxKSkgewogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgNTEKICAgIGIgX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX3doaWxlX3RvcEAxNTgKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl93aGlsZUAxNjA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODU5CiAgICAvLyBmb3IgKGxldCBpID0gVWludDY0KDApOyBpIDwgVWludDY0KHR4LmZvcmVpZ25Bc3NldHMubGVuZ3RoKTsgaSA9IGkgKyBVaW50NjQoMSkpIHsKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDUyCgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfd2hpbGVfdG9wQDE2MToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4NTkKICAgIC8vIGZvciAobGV0IGkgPSBVaW50NjQoMCk7IGkgPCBVaW50NjQodHguZm9yZWlnbkFzc2V0cy5sZW5ndGgpOyBpID0gaSArIFVpbnQ2NCgxKSkgewogICAgZnJhbWVfZGlnIDMwCiAgICBkdXAKICAgIHB1c2hpbnQgMjIgLy8gMjIKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNDEKICAgIGZyYW1lX2RpZyAzOAogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDgKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBmcmFtZV9kaWcgNTIKICAgID4KICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl93aGlsZUAxNjMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4NTktODYwCiAgICAvLyBmb3IgKGxldCBpID0gVWludDY0KDApOyBpIDwgVWludDY0KHR4LmZvcmVpZ25Bc3NldHMubGVuZ3RoKTsgaSA9IGkgKyBVaW50NjQoMSkpIHsKICAgIC8vICAgb3AuSVR4bkNyZWF0ZS5zZXRBc3NldHModHguZm9yZWlnbkFzc2V0c1tpXSkKICAgIGZyYW1lX2RpZyA4CiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDUyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMiAvLyA4CiAgICAqCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODYwCiAgICAvLyBvcC5JVHhuQ3JlYXRlLnNldEFzc2V0cyh0eC5mb3JlaWduQXNzZXRzW2ldKQogICAgZXh0cmFjdF91aW50NjQKICAgIGl0eG5fZmllbGQgQXNzZXRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODU5CiAgICAvLyBmb3IgKGxldCBpID0gVWludDY0KDApOyBpIDwgVWludDY0KHR4LmZvcmVpZ25Bc3NldHMubGVuZ3RoKTsgaSA9IGkgKyBVaW50NjQoMSkpIHsKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDUyCiAgICBiIF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF93aGlsZV90b3BAMTYxCgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfd2hpbGVAMTYzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjg2MgogICAgLy8gZm9yIChsZXQgaSA9IFVpbnQ2NCgwKTsgaSA8IFVpbnQ2NCh0eC5mb3JlaWduQXBwcy5sZW5ndGgpOyBpID0gaSArIFVpbnQ2NCgxKSkgewogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgNTMKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF93aGlsZV90b3BAMTY0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjg2MgogICAgLy8gZm9yIChsZXQgaSA9IFVpbnQ2NCgwKTsgaSA8IFVpbnQ2NCh0eC5mb3JlaWduQXBwcy5sZW5ndGgpOyBpID0gaSArIFVpbnQ2NCgxKSkgewogICAgZnJhbWVfZGlnIDMwCiAgICBmcmFtZV9kaWcgNDAKICAgIGZyYW1lX2RpZyA0MQogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDkKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBmcmFtZV9kaWcgNTMKICAgID4KICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDEyMgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjg2Mi04NjMKICAgIC8vIGZvciAobGV0IGkgPSBVaW50NjQoMCk7IGkgPCBVaW50NjQodHguZm9yZWlnbkFwcHMubGVuZ3RoKTsgaSA9IGkgKyBVaW50NjQoMSkpIHsKICAgIC8vICAgb3AuSVR4bkNyZWF0ZS5zZXRBcHBsaWNhdGlvbnModHguZm9yZWlnbkFwcHNbaV0pCiAgICBmcmFtZV9kaWcgOQogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyA1MwogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzIgLy8gOAogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjg2MwogICAgLy8gb3AuSVR4bkNyZWF0ZS5zZXRBcHBsaWNhdGlvbnModHguZm9yZWlnbkFwcHNbaV0pCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbnMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4NjIKICAgIC8vIGZvciAobGV0IGkgPSBVaW50NjQoMCk7IGkgPCBVaW50NjQodHguZm9yZWlnbkFwcHMubGVuZ3RoKTsgaSA9IGkgKyBVaW50NjQoMSkpIHsKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDUzCiAgICBiIF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF93aGlsZV90b3BAMTY0CgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDExNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4MDEKICAgIC8vIH0gZWxzZSBpZiAoZW50cnkudHhUeXBlID09PSBUWF9LRVlSRUcpIHsKICAgIGZyYW1lX2RpZyA3MQogICAgcHVzaGludCA0IC8vIDQKICAgID09CiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDExOAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjgwMgogICAgLy8gdGhpcy5fc3RhZ2VLZXlSZWcoZGVjb2RlQXJjNDxLZXlSZWdUeG4+KGVudHJ5LmRhdGEpLCBmaXJzdCkKICAgIGZyYW1lX2RpZyAyOQogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGZyYW1lX2RpZyA1MAogICAgZHVwCiAgICBpbnRjXzMgLy8gMgogICAgKgogICAgZGlnIDMKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgdW5jb3ZlciAyCiAgICBkaWcgMQogICAgLSAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAzCiAgICBsZW4KICAgIHVuY292ZXIgMgogICAgaW50Y18zIC8vIDIKICAgICoKICAgIGRpZyA0CiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgbGVuCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMTEKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2J1cnkgMzAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4NjgKICAgIC8vIHRoaXMuX2JlZ2luT3JOZXh0KGZpcnN0KQogICAgZnJhbWVfZGlnIDQ3CiAgICBjYWxsc3ViIF9iZWdpbk9yTmV4dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjg2OQogICAgLy8gb3AuSVR4bkNyZWF0ZS5zZXRUeXBlRW51bShVaW50NjQoVHJhbnNhY3Rpb25UeXBlLktleVJlZ2lzdHJhdGlvbikpCiAgICBpbnRjXzMgLy8gMgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjg3MAogICAgLy8gb3AuSVR4bkNyZWF0ZS5zZXRGZWUoVWludDY0KDApKQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpbnRjXzMgLy8gMgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjg3MQogICAgLy8gaWYgKHR4Lm9ubGluZSAhPT0gVWludDY0KDApKSB7CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VAMTIyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODc0CiAgICAvLyBvcC5JVHhuQ3JlYXRlLnNldFZvdGVQayh0eC52b3RlS2V5KQogICAgZnJhbWVfZGlnIDMwCiAgICBkdXAKICAgIGludGNfMiAvLyA4CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMgogICAgdW5jb3ZlciAyCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIGl0eG5fZmllbGQgVm90ZVBLCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODc1CiAgICAvLyBvcC5JVHhuQ3JlYXRlLnNldFNlbGVjdGlvblBrKHR4LnNlbGVjdGlvbktleSkKICAgIGRpZyAxCiAgICBwdXNoaW50IDEyIC8vIDEyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIHVuY292ZXIgMgogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGV4dHJhY3QgMiAwCiAgICBpdHhuX2ZpZWxkIFNlbGVjdGlvblBLCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODc2CiAgICAvLyBvcC5JVHhuQ3JlYXRlLnNldFN0YXRlUHJvb2ZQayh0eC5zdGF0ZVByb29mS2V5KQogICAgZGlnIDEKICAgIGxlbgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIGl0eG5fZmllbGQgU3RhdGVQcm9vZlBLCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODc3CiAgICAvLyBvcC5JVHhuQ3JlYXRlLnNldFZvdGVGaXJzdCh0eC52b3RlRmlyc3QpCiAgICBmcmFtZV9kaWcgMTEKICAgIGR1cAogICAgcHVzaGludCAxNiAvLyAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIGl0eG5fZmllbGQgVm90ZUZpcnN0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODc4CiAgICAvLyBvcC5JVHhuQ3JlYXRlLnNldFZvdGVMYXN0KHR4LnZvdGVMYXN0KQogICAgZHVwCiAgICBwdXNoaW50IDI0IC8vIDI0CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaXR4bl9maWVsZCBWb3RlTGFzdAogICAgcHVzaGludCAzMiAvLyAzMgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjg3OQogICAgLy8gb3AuSVR4bkNyZWF0ZS5zZXRWb3RlS2V5RGlsdXRpb24odHgudm90ZUtleURpbHV0aW9uKQogICAgZXh0cmFjdF91aW50NjQKICAgIGl0eG5fZmllbGQgVm90ZUtleURpbHV0aW9uCiAgICBiIF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDEyMgoKX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2Vsc2VfYm9keUAxMTg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODA0CiAgICAvLyB0aGlzLl9zdGFnZUFzc2V0Q29uZmlnKGRlY29kZUFyYzQ8QXNzZXRDb25maWdUeG4+KGVudHJ5LmRhdGEpLCBmaXJzdCkKICAgIGZyYW1lX2RpZyAyOQogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGZyYW1lX2RpZyA1MAogICAgZHVwCiAgICBpbnRjXzMgLy8gMgogICAgKgogICAgZGlnIDMKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgdW5jb3ZlciAyCiAgICBkaWcgMQogICAgLSAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAzCiAgICBsZW4KICAgIHVuY292ZXIgMgogICAgaW50Y18zIC8vIDIKICAgICoKICAgIGRpZyA0CiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgbGVuCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMTIKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2J1cnkgMzAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4ODQKICAgIC8vIHRoaXMuX2JlZ2luT3JOZXh0KGZpcnN0KQogICAgZnJhbWVfZGlnIDQ3CiAgICBjYWxsc3ViIF9iZWdpbk9yTmV4dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjg4NQogICAgLy8gb3AuSVR4bkNyZWF0ZS5zZXRUeXBlRW51bShVaW50NjQoVHJhbnNhY3Rpb25UeXBlLkFzc2V0Q29uZmlnKSkKICAgIHB1c2hpbnQgMyAvLyAzCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODg2CiAgICAvLyBvcC5JVHhuQ3JlYXRlLnNldEZlZShVaW50NjQoMCkpCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGludGNfMyAvLyAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODg3CiAgICAvLyBpZiAodHguY29uZmlnQXNzZXQgPT09IFVpbnQ2NCgwKSkgewogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgZnJhbWVfYnVyeSA2NgogICAgYm56IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9lbHNlX2JvZHlAMTQzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODkwCiAgICAvLyBvcC5JVHhuQ3JlYXRlLnNldENvbmZpZ0Fzc2V0VG90YWwodHgudG90YWwpCiAgICBmcmFtZV9kaWcgMTIKICAgIGR1cAogICAgcHVzaGludCAxMCAvLyAxMAogICAgZXh0cmFjdF91aW50NjQKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXRUb3RhbAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjg5MQogICAgLy8gb3AuSVR4bkNyZWF0ZS5zZXRDb25maWdBc3NldERlY2ltYWxzKHR4LmRlY2ltYWxzKQogICAgZHVwCiAgICBwdXNoaW50IDE4IC8vIDE4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaXR4bl9maWVsZCBDb25maWdBc3NldERlY2ltYWxzCiAgICBwdXNoaW50IDI2IC8vIDI2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODkyCiAgICAvLyBvcC5JVHhuQ3JlYXRlLnNldENvbmZpZ0Fzc2V0RGVmYXVsdEZyb3plbih0eC5kZWZhdWx0RnJvemVuICE9PSBVaW50NjQoMCkpCiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18wIC8vIDAKICAgICE9CiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0RGVmYXVsdEZyb3plbgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjg5MwogICAgLy8gaWYgKHR4LnVuaXROYW1lICE9PSAnJykgb3AuSVR4bkNyZWF0ZS5zZXRDb25maWdBc3NldFVuaXROYW1lKEJ5dGVzKHR4LnVuaXROYW1lKSkKICAgIGZyYW1lX2RpZyAzMAogICAgZHVwCiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIHB1c2hpbnQgMzQgLy8gMzQKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNDIKICAgIHN1YnN0cmluZzMKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMzQKICAgIGJ5dGVjXzEgLy8gIiIKICAgICE9CiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUAxMzcKICAgIGZyYW1lX2RpZyAzNAogICAgaXR4bl9maWVsZCBDb25maWdBc3NldFVuaXROYW1lCgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUAxMzc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODk0CiAgICAvLyBpZiAodHguYXNzZXROYW1lICE9PSAnJykgb3AuSVR4bkNyZWF0ZS5zZXRDb25maWdBc3NldE5hbWUoQnl0ZXModHguYXNzZXROYW1lKSkKICAgIGZyYW1lX2RpZyAzMAogICAgZHVwCiAgICBwdXNoaW50IDM2IC8vIDM2CiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDQzCiAgICBmcmFtZV9kaWcgNDIKICAgIHN3YXAKICAgIHN1YnN0cmluZzMKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMzYKICAgIGJ5dGVjXzEgLy8gIiIKICAgICE9CiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUAxMzkKICAgIGZyYW1lX2RpZyAzNgogICAgaXR4bl9maWVsZCBDb25maWdBc3NldE5hbWUKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDEzOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4OTUKICAgIC8vIGlmICh0eC51cmwgIT09ICcnKSBvcC5JVHhuQ3JlYXRlLnNldENvbmZpZ0Fzc2V0VXJsKEJ5dGVzKHR4LnVybCkpCiAgICBmcmFtZV9kaWcgMzAKICAgIGR1cAogICAgcHVzaGludCAzOCAvLyAzOAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgZnJhbWVfYnVyeSA0NAogICAgZnJhbWVfZGlnIDQzCiAgICBzd2FwCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDM3CiAgICBieXRlY18xIC8vICIiCiAgICAhPQogICAgYnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VAMTQxCiAgICBmcmFtZV9kaWcgMzcKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXRVUkwKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDE0MToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4OTYKICAgIC8vIGlmICh0eC5tZXRhZGF0YUhhc2gubGVuZ3RoID09PSBVaW50NjQoMzIpKSBvcC5JVHhuQ3JlYXRlLnNldENvbmZpZ0Fzc2V0TWV0YWRhdGFIYXNoKHR4Lm1ldGFkYXRhSGFzaCkKICAgIGZyYW1lX2RpZyAzMAogICAgZHVwCiAgICBpbnRjIDQgLy8gMTY4CiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfZGlnIDQ0CiAgICBzd2FwCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDMxCiAgICBsZW4KICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgID09CiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUAxNDQKICAgIGZyYW1lX2RpZyAzMQogICAgaXR4bl9maWVsZCBDb25maWdBc3NldE1ldGFkYXRhSGFzaAoKX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VAMTQ0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjkwMgogICAgLy8gb3AuSVR4bkNyZWF0ZS5zZXRDb25maWdBc3NldE1hbmFnZXIodHgubWFuYWdlcikKICAgIGZyYW1lX2RpZyAxMgogICAgZHVwCiAgICBleHRyYWN0IDQyIDMyCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0TWFuYWdlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjkwMwogICAgLy8gb3AuSVR4bkNyZWF0ZS5zZXRDb25maWdBc3NldFJlc2VydmUodHgucmVzZXJ2ZSkKICAgIGR1cAogICAgZXh0cmFjdCA3NCAzMgogICAgaXR4bl9maWVsZCBDb25maWdBc3NldFJlc2VydmUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo5MDQKICAgIC8vIG9wLklUeG5DcmVhdGUuc2V0Q29uZmlnQXNzZXRGcmVlemUodHguZnJlZXplKQogICAgZHVwCiAgICBleHRyYWN0IDEwNiAzMgogICAgaXR4bl9maWVsZCBDb25maWdBc3NldEZyZWV6ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjkwNQogICAgLy8gb3AuSVR4bkNyZWF0ZS5zZXRDb25maWdBc3NldENsYXdiYWNrKHR4LmNsYXdiYWNrKQogICAgZXh0cmFjdCAxMzggMzIKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXRDbGF3YmFjawogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjkwNgogICAgLy8gaWYgKHR4Lm5vdGUgIT09ICcnKSBvcC5JVHhuQ3JlYXRlLnNldE5vdGUoQnl0ZXModHgubm90ZSkpCiAgICBmcmFtZV9kaWcgMzAKICAgIGR1cAogICAgaW50YyA0IC8vIDE2OAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBsZW4KICAgIHN1YnN0cmluZzMKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMzIKICAgIGJ5dGVjXzEgLy8gIiIKICAgICE9CiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUAxMjIKICAgIGZyYW1lX2RpZyAzMgogICAgaXR4bl9maWVsZCBOb3RlCiAgICBiIF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDEyMgoKX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2Vsc2VfYm9keUAxNDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTAwCiAgICAvLyBvcC5JVHhuQ3JlYXRlLnNldENvbmZpZ0Fzc2V0KHR4LmNvbmZpZ0Fzc2V0KQogICAgZnJhbWVfZGlnIDY2CiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0CiAgICBiIF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDE0NAoKX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VAMTI0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjc4OAogICAgLy8gZm9yIChsZXQgcCA9IFVpbnQ2NCgxKTsgcCA8PSBudW1QYXlsb2FkczsgcCA9IHAgKyBVaW50NjQoMSkpIHsKICAgIGZyYW1lX2RpZyA1NwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgNTcKICAgIGIgX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX3doaWxlX3RvcEAxMDYKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl93aGlsZUAxMjU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6ODExCiAgICAvLyBvcC5JVHhuQ3JlYXRlLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAoKX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2NjIKICAgIC8vIHByb3Bvc2FsLnN0YXR1cyA9IFNUQVRVU19FWEVDVVRFRAogICAgcHVzaGludCAzIC8vIDMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2NjItNjYzCiAgICAvLyBwcm9wb3NhbC5zdGF0dXMgPSBTVEFUVVNfRVhFQ1VURUQKICAgIC8vIHRoaXMucHJvcG9zYWxzKHByb3Bvc2FsSWQpLnZhbHVlID0gY2xvbmUocHJvcG9zYWwpCiAgICBmcmFtZV9kaWcgNzgKICAgIGludGNfMiAvLyA4CiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjY0CiAgICAvLyBlbWl0PFByb3Bvc2FsRXhlY3V0ZWQ+KHsgcHJvcG9zYWxJZCB9KQogICAgcHVzaGJ5dGVzIDB4MzVjNjdlZmQgLy8gbWV0aG9kICJQcm9wb3NhbEV4ZWN1dGVkKHVpbnQ2NCkiCiAgICBmcmFtZV9kaWcgNzcKICAgIGNvbmNhdAogICAgbG9nCiAgICByZXRzdWIKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9lbHNlX2JvZHlAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoyODAKICAgIC8vIGFkbWluUGF5bG9hZHMgPSBCb3hNYXA8dWludDY0LCBBZG1pbkNoYW5nZT4oeyBrZXlQcmVmaXg6ICdkcCcgfSkKICAgIGJ5dGVjIDE0IC8vICJkcCIKICAgIGZyYW1lX2RpZyA3NwogICAgY29uY2F0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMTcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2NTcKICAgIC8vIGNvbnN0IGNoYW5nZSA9IGNsb25lKHRoaXMuYWRtaW5QYXlsb2Fkcyhwcm9wb3NhbElkKS52YWx1ZSkKICAgIGR1cAogICAgYm94X2dldAogICAgc3dhcAogICAgZnJhbWVfYnVyeSAyMAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2NTctNjU4CiAgICAvLyBjb25zdCBjaGFuZ2UgPSBjbG9uZSh0aGlzLmFkbWluUGF5bG9hZHMocHJvcG9zYWxJZCkudmFsdWUpCiAgICAvLyB0aGlzLl9hc3NlcnRQcml2aWxlZ2VGb3JDaGFuZ2UoY2hhbmdlLmNoYW5nZVR5cGUsIGdyb3VwKQogICAgaW50Y18wIC8vIDAKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjY1OAogICAgLy8gdGhpcy5fYXNzZXJ0UHJpdmlsZWdlRm9yQ2hhbmdlKGNoYW5nZS5jaGFuZ2VUeXBlLCBncm91cCkKICAgIGJ0b2kKICAgIGR1cAogICAgZnJhbWVfYnVyeSA2OQogICAgZHVwCiAgICBmcmFtZV9kaWcgODEKICAgIGNhbGxzdWIgX2Fzc2VydFByaXZpbGVnZUZvckNoYW5nZQogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTA3MgogICAgLy8gaWYgKGNoYW5nZS5jaGFuZ2VUeXBlID09PSBBRE1fQ1JFQVRFX0dST1VQKSB7CiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9lbHNlX2JvZHlAMTQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTM1CiAgICAvLyBjb25zdCBub3cgPSBHbG9iYWwubGF0ZXN0VGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTEzNgogICAgLy8gY29uc3QgZ2lkOiB1aW50NjQgPSB0aGlzLm5leHRHcm91cElkLnZhbHVlCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjI2MwogICAgLy8gbmV4dEdyb3VwSWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnbmdpZCcgfSkKICAgIGJ5dGVjIDYgLy8gIm5naWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTEzNgogICAgLy8gY29uc3QgZ2lkOiB1aW50NjQgPSB0aGlzLm5leHRHcm91cElkLnZhbHVlCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExMzcKICAgIC8vIGFzc2VydChjaGFuZ2UudGhyZXNob2xkIDw9IFVpbnQ2NCgxKSwgJ25ldyBncm91cCBzdGFydHMgd2l0aCBvbmUgbWVtYmVyJykKICAgIGZyYW1lX2RpZyAxNwogICAgZHVwCiAgICBwdXNoaW50IDYwIC8vIDYwCiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgIDw9CiAgICBhc3NlcnQgLy8gbmV3IGdyb3VwIHN0YXJ0cyB3aXRoIG9uZSBtZW1iZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTQwCiAgICAvLyBuYW1lOiBjaGFuZ2UuZ3JvdXBOYW1lLAogICAgZnJhbWVfZGlnIDIwCiAgICBkdXAKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgcHVzaGludCA1OCAvLyA1OAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICB1bmNvdmVyIDIKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExNDMKICAgIC8vIGFkbWluUHJpdmlsZWdlczogY2hhbmdlLmFkbWluUHJpdmlsZWdlcywKICAgIGRpZyA0CiAgICBwdXNoaW50IDY4IC8vIDY4CiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTQ0CiAgICAvLyBhbGxvd2VkQWN0aW9uczogY2hhbmdlLmFsbG93ZWRBY3Rpb25zLAogICAgZGlnIDUKICAgIHB1c2hpbnQgNzYgLy8gNzYKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExNDUKICAgIC8vIGxpbWl0QXNzZXRJZDogY2hhbmdlLmxpbWl0QXNzZXRJZCwKICAgIGRpZyA2CiAgICBwdXNoaW50IDg0IC8vIDg0CiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTQ2CiAgICAvLyBkYWlseUxpbWl0OiBjaGFuZ2UuZGFpbHlMaW1pdCwKICAgIGRpZyA3CiAgICBwdXNoaW50IDkyIC8vIDkyCiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTQ5CiAgICAvLyBtb250aGx5TGltaXQ6IGNoYW5nZS5tb250aGx5TGltaXQsCiAgICBkaWcgOAogICAgcHVzaGludCAxMDAgLy8gMTAwCiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTUyCiAgICAvLyBjb29sZG93blJvdW5kczogY2hhbmdlLmNvb2xkb3duUm91bmRzLAogICAgZGlnIDkKICAgIHB1c2hpbnQgMTA4IC8vIDEwOAogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTEzOS0xMTU2CiAgICAvLyBjb25zdCBncnA6IFNpZ25lckdyb3VwID0gewogICAgLy8gICBuYW1lOiBjaGFuZ2UuZ3JvdXBOYW1lLAogICAgLy8gICB0aHJlc2hvbGQ6IGNoYW5nZS50aHJlc2hvbGQsCiAgICAvLyAgIG1lbWJlckNvdW50OiBVaW50NjQoMSksCiAgICAvLyAgIGFkbWluUHJpdmlsZWdlczogY2hhbmdlLmFkbWluUHJpdmlsZWdlcywKICAgIC8vICAgYWxsb3dlZEFjdGlvbnM6IGNoYW5nZS5hbGxvd2VkQWN0aW9ucywKICAgIC8vICAgbGltaXRBc3NldElkOiBjaGFuZ2UubGltaXRBc3NldElkLAogICAgLy8gICBkYWlseUxpbWl0OiBjaGFuZ2UuZGFpbHlMaW1pdCwKICAgIC8vICAgZGFpbHlVc2FnZTogVWludDY0KDApLAogICAgLy8gICBkYWlseVBlcmlvZFN0YXJ0OiBub3csCiAgICAvLyAgIG1vbnRobHlMaW1pdDogY2hhbmdlLm1vbnRobHlMaW1pdCwKICAgIC8vICAgbW9udGhseVVzYWdlOiBVaW50NjQoMCksCiAgICAvLyAgIG1vbnRobHlQZXJpb2RTdGFydDogbm93LAogICAgLy8gICBjb29sZG93blJvdW5kczogY2hhbmdlLmNvb2xkb3duUm91bmRzLAogICAgLy8gICBsYXN0RXhlY3V0aW9uUm91bmQ6IFVpbnQ2NCgwKSwKICAgIC8vICAgbWVtYmVyc2hpcEVwb2NoOiBVaW50NjQoMCksCiAgICAvLyAgIGFjdGl2ZTogVWludDY0KDEpLAogICAgLy8gfQogICAgZGlnIDYKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgNwogICAgY29uY2F0CiAgICBkdXAKICAgIGNvdmVyIDgKICAgIGZyYW1lX2J1cnkgMAogICAgdW5jb3ZlciA5CiAgICBpdG9iCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMTQKICAgIHB1c2hieXRlcyAweDAwN2EKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExNDIKICAgIC8vIG1lbWJlckNvdW50OiBVaW50NjQoMSksCiAgICBpbnRjXzEgLy8gMQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExMzktMTE1NgogICAgLy8gY29uc3QgZ3JwOiBTaWduZXJHcm91cCA9IHsKICAgIC8vICAgbmFtZTogY2hhbmdlLmdyb3VwTmFtZSwKICAgIC8vICAgdGhyZXNob2xkOiBjaGFuZ2UudGhyZXNob2xkLAogICAgLy8gICBtZW1iZXJDb3VudDogVWludDY0KDEpLAogICAgLy8gICBhZG1pblByaXZpbGVnZXM6IGNoYW5nZS5hZG1pblByaXZpbGVnZXMsCiAgICAvLyAgIGFsbG93ZWRBY3Rpb25zOiBjaGFuZ2UuYWxsb3dlZEFjdGlvbnMsCiAgICAvLyAgIGxpbWl0QXNzZXRJZDogY2hhbmdlLmxpbWl0QXNzZXRJZCwKICAgIC8vICAgZGFpbHlMaW1pdDogY2hhbmdlLmRhaWx5TGltaXQsCiAgICAvLyAgIGRhaWx5VXNhZ2U6IFVpbnQ2NCgwKSwKICAgIC8vICAgZGFpbHlQZXJpb2RTdGFydDogbm93LAogICAgLy8gICBtb250aGx5TGltaXQ6IGNoYW5nZS5tb250aGx5TGltaXQsCiAgICAvLyAgIG1vbnRobHlVc2FnZTogVWludDY0KDApLAogICAgLy8gICBtb250aGx5UGVyaW9kU3RhcnQ6IG5vdywKICAgIC8vICAgY29vbGRvd25Sb3VuZHM6IGNoYW5nZS5jb29sZG93blJvdW5kcywKICAgIC8vICAgbGFzdEV4ZWN1dGlvblJvdW5kOiBVaW50NjQoMCksCiAgICAvLyAgIG1lbWJlcnNoaXBFcG9jaDogVWludDY0KDApLAogICAgLy8gICBhY3RpdmU6IFVpbnQ2NCgxKSwKICAgIC8vIH0KICAgIGl0b2IKICAgIHN3YXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyA3CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTQ3CiAgICAvLyBkYWlseVVzYWdlOiBVaW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExMzktMTE1NgogICAgLy8gY29uc3QgZ3JwOiBTaWduZXJHcm91cCA9IHsKICAgIC8vICAgbmFtZTogY2hhbmdlLmdyb3VwTmFtZSwKICAgIC8vICAgdGhyZXNob2xkOiBjaGFuZ2UudGhyZXNob2xkLAogICAgLy8gICBtZW1iZXJDb3VudDogVWludDY0KDEpLAogICAgLy8gICBhZG1pblByaXZpbGVnZXM6IGNoYW5nZS5hZG1pblByaXZpbGVnZXMsCiAgICAvLyAgIGFsbG93ZWRBY3Rpb25zOiBjaGFuZ2UuYWxsb3dlZEFjdGlvbnMsCiAgICAvLyAgIGxpbWl0QXNzZXRJZDogY2hhbmdlLmxpbWl0QXNzZXRJZCwKICAgIC8vICAgZGFpbHlMaW1pdDogY2hhbmdlLmRhaWx5TGltaXQsCiAgICAvLyAgIGRhaWx5VXNhZ2U6IFVpbnQ2NCgwKSwKICAgIC8vICAgZGFpbHlQZXJpb2RTdGFydDogbm93LAogICAgLy8gICBtb250aGx5TGltaXQ6IGNoYW5nZS5tb250aGx5TGltaXQsCiAgICAvLyAgIG1vbnRobHlVc2FnZTogVWludDY0KDApLAogICAgLy8gICBtb250aGx5UGVyaW9kU3RhcnQ6IG5vdywKICAgIC8vICAgY29vbGRvd25Sb3VuZHM6IGNoYW5nZS5jb29sZG93blJvdW5kcywKICAgIC8vICAgbGFzdEV4ZWN1dGlvblJvdW5kOiBVaW50NjQoMCksCiAgICAvLyAgIG1lbWJlcnNoaXBFcG9jaDogVWludDY0KDApLAogICAgLy8gICBhY3RpdmU6IFVpbnQ2NCgxKSwKICAgIC8vIH0KICAgIGl0b2IKICAgIHN3YXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTEKICAgIGl0b2IKICAgIHN3YXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIHVuY292ZXIgNQogICAgaXRvYgogICAgY29uY2F0CiAgICBkaWcgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgaXRvYgogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTU3CiAgICAvLyB0aGlzLmdyb3VwcyhnaWQpLnZhbHVlID0gY2xvbmUoZ3JwKQogICAgZGlnIDUKICAgIGl0b2IKICAgIGR1cAogICAgZnJhbWVfYnVyeSAyMQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjI3NAogICAgLy8gZ3JvdXBzID0gQm94TWFwPHVpbnQ2NCwgU2lnbmVyR3JvdXA+KHsga2V5UHJlZml4OiAnZycgfSkKICAgIGJ5dGVjXzAgLy8gImciCiAgICBkaWcgMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTE1NwogICAgLy8gdGhpcy5ncm91cHMoZ2lkKS52YWx1ZSA9IGNsb25lKGdycCkKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICB1bmNvdmVyIDIKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTU5CiAgICAvLyBjb25zdCBtOiBNZW1iZXIgPSB7IGFjY291bnRUeXBlOiBjaGFuZ2UubWVtYmVyVHlwZSwgbGFiZWw6IGNoYW5nZS5tZW1iZXJMYWJlbCwgYWRkcjogY2hhbmdlLm1lbWJlckFkZHIgfQogICAgZGlnIDQKICAgIHB1c2hpbnQgNTAgLy8gNTAKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgZGlnIDQKICAgIGxlbgogICAgdW5jb3ZlciA1CiAgICB1bmNvdmVyIDUKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIHVuY292ZXIgNAogICAgcHVzaGludHMgMTggMzIgLy8gMTgsIDMyCiAgICBib3hfZXh0cmFjdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMTUKICAgIGRpZyAyCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBieXRlYyAyMiAvLyAweDAwMmEKICAgIGNvbmNhdAogICAgZGlnIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTE2MAogICAgLy8gdGhpcy5tZW1iZXJzKHsgZ3JvdXBJZDogZ2lkLCBhY2NvdW50OiBjaGFuZ2UubWVtYmVyQWRkciB9KS52YWx1ZSA9IGNsb25lKG0pCiAgICBjb3ZlciAyCiAgICBjb25jYXQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6Mjc1CiAgICAvLyBtZW1iZXJzID0gQm94TWFwPHsgZ3JvdXBJZDogdWludDY0OyBhY2NvdW50OiBBY2NvdW50IH0sIE1lbWJlcj4oeyBrZXlQcmVmaXg6ICdtJyB9KQogICAgYnl0ZWMgNCAvLyAibSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExNjAKICAgIC8vIHRoaXMubWVtYmVycyh7IGdyb3VwSWQ6IGdpZCwgYWNjb3VudDogY2hhbmdlLm1lbWJlckFkZHIgfSkudmFsdWUgPSBjbG9uZShtKQogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTYyCiAgICAvLyB0aGlzLm5leHRHcm91cElkLnZhbHVlID0gZ2lkICsgVWludDY0KDEpCiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjI2MwogICAgLy8gbmV4dEdyb3VwSWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnbmdpZCcgfSkKICAgIGJ5dGVjIDYgLy8gIm5naWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTE2MgogICAgLy8gdGhpcy5uZXh0R3JvdXBJZC52YWx1ZSA9IGdpZCArIFVpbnQ2NCgxKQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTYzCiAgICAvLyB0aGlzLmdyb3VwQ291bnQudmFsdWUgPSB0aGlzLmdyb3VwQ291bnQudmFsdWUgKyBVaW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MjY1CiAgICAvLyBncm91cENvdW50ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ2djbnQnIH0pCiAgICBieXRlYyA3IC8vICJnY250IgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExNjMKICAgIC8vIHRoaXMuZ3JvdXBDb3VudC52YWx1ZSA9IHRoaXMuZ3JvdXBDb3VudC52YWx1ZSArIFVpbnQ2NCgxKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MjY1CiAgICAvLyBncm91cENvdW50ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ2djbnQnIH0pCiAgICBieXRlYyA3IC8vICJnY250IgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExNjMKICAgIC8vIHRoaXMuZ3JvdXBDb3VudC52YWx1ZSA9IHRoaXMuZ3JvdXBDb3VudC52YWx1ZSArIFVpbnQ2NCgxKQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTY0CiAgICAvLyBpZiAoKGNoYW5nZS5hZG1pblByaXZpbGVnZXMgJiBQUklWX0dST1VQKSAhPT0gVWludDY0KDApKSB7CiAgICBpbnRjXzEgLy8gMQogICAgJgogICAgYnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VAMTMyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTE2NQogICAgLy8gdGhpcy5hY3RpdmVQcml2R3JvdXBDb3VudC52YWx1ZSA9IHRoaXMuYWN0aXZlUHJpdkdyb3VwQ291bnQudmFsdWUgKyBVaW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MjcxCiAgICAvLyBhY3RpdmVQcml2R3JvdXBDb3VudCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdhcGdjJyB9KQogICAgYnl0ZWNfMiAvLyAiYXBnYyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTY1CiAgICAvLyB0aGlzLmFjdGl2ZVByaXZHcm91cENvdW50LnZhbHVlID0gdGhpcy5hY3RpdmVQcml2R3JvdXBDb3VudC52YWx1ZSArIFVpbnQ2NCgxKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MjcxCiAgICAvLyBhY3RpdmVQcml2R3JvdXBDb3VudCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdhcGdjJyB9KQogICAgYnl0ZWNfMiAvLyAiYXBnYyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTY1CiAgICAvLyB0aGlzLmFjdGl2ZVByaXZHcm91cENvdW50LnZhbHVlID0gdGhpcy5hY3RpdmVQcml2R3JvdXBDb3VudC52YWx1ZSArIFVpbnQ2NCgxKQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDEzMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTY4CiAgICAvLyBlbWl0PEdyb3VwQ3JlYXRlZD4oeyBncm91cElkOiBnaWQsIG5hbWU6IGNoYW5nZS5ncm91cE5hbWUsIHRocmVzaG9sZDogY2hhbmdlLnRocmVzaG9sZCB9KQogICAgZnJhbWVfZGlnIDIxCiAgICBieXRlYyAyMCAvLyAweDAwMTIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDE0CiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAwCiAgICBjb25jYXQKICAgIGJ5dGVjIDIxIC8vIG1ldGhvZCAiR3JvdXBDcmVhdGVkKHVpbnQ2NCxzdHJpbmcsdWludDY0KSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTE2OQogICAgLy8gZW1pdDxNZW1iZXJBZGRlZD4oeyBncm91cElkOiBnaWQsIG1lbWJlcjogY2hhbmdlLm1lbWJlckFkZHIsIGFjY291bnRUeXBlOiBjaGFuZ2UubWVtYmVyVHlwZSB9KQogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2RpZyAxNQogICAgY29uY2F0CiAgICBieXRlYyAxMyAvLyBtZXRob2QgIk1lbWJlckFkZGVkKHVpbnQ2NCxhZGRyZXNzLHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgYiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUA5CgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDE0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEwNzQKICAgIC8vIH0gZWxzZSBpZiAoY2hhbmdlLmNoYW5nZVR5cGUgPT09IEFETV9BRERfTUVNQkVSKSB7CiAgICBmcmFtZV9kaWcgNjkKICAgIGludGNfMyAvLyAyCiAgICA9PQogICAgYnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2Vsc2VfYm9keUAxOAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExNzMKICAgIC8vIGNvbnN0IGdpZCA9IGNoYW5nZS50YXJnZXRHcm91cElkCiAgICBmcmFtZV9kaWcgMTcKICAgIGR1cAogICAgaW50Y18yIC8vIDgKICAgIGR1cAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTc0CiAgICAvLyBhc3NlcnQoIXRoaXMubWVtYmVycyh7IGdyb3VwSWQ6IGdpZCwgYWNjb3VudDogY2hhbmdlLm1lbWJlckFkZHIgfSkuZXhpc3RzLCAnYWxyZWFkeSBhIG1lbWJlcicpCiAgICBkaWcgMQogICAgcHVzaGludHMgMTggMzIgLy8gMTgsIDMyCiAgICBib3hfZXh0cmFjdAogICAgc3dhcAogICAgaXRvYgogICAgZHVwCiAgICBkaWcgMgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6Mjc1CiAgICAvLyBtZW1iZXJzID0gQm94TWFwPHsgZ3JvdXBJZDogdWludDY0OyBhY2NvdW50OiBBY2NvdW50IH0sIE1lbWJlcj4oeyBrZXlQcmVmaXg6ICdtJyB9KQogICAgYnl0ZWMgNCAvLyAibSIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTc0CiAgICAvLyBhc3NlcnQoIXRoaXMubWVtYmVycyh7IGdyb3VwSWQ6IGdpZCwgYWNjb3VudDogY2hhbmdlLm1lbWJlckFkZHIgfSkuZXhpc3RzLCAnYWxyZWFkeSBhIG1lbWJlcicpCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIGFscmVhZHkgYSBtZW1iZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTc2CiAgICAvLyBjb25zdCBtOiBNZW1iZXIgPSB7IGFjY291bnRUeXBlOiBjaGFuZ2UubWVtYmVyVHlwZSwgbGFiZWw6IGNoYW5nZS5tZW1iZXJMYWJlbCwgYWRkcjogY2hhbmdlLm1lbWJlckFkZHIgfQogICAgdW5jb3ZlciA0CiAgICBwdXNoaW50IDUwIC8vIDUwCiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGZyYW1lX2RpZyAyMAogICAgZHVwCiAgICBwdXNoaW50IDU4IC8vIDU4CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGxlbgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIHN3YXAKICAgIGl0b2IKICAgIGRpZyAxCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGJ5dGVjIDIyIC8vIDB4MDAyYQogICAgY29uY2F0CiAgICB1bmNvdmVyIDYKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTE3NwogICAgLy8gdGhpcy5tZW1iZXJzKHsgZ3JvdXBJZDogZ2lkLCBhY2NvdW50OiBjaGFuZ2UubWVtYmVyQWRkciB9KS52YWx1ZSA9IGNsb25lKG0pCiAgICBkaWcgMgogICAgYm94X2RlbAogICAgcG9wCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoyNzQKICAgIC8vIGdyb3VwcyA9IEJveE1hcDx1aW50NjQsIFNpZ25lckdyb3VwPih7IGtleVByZWZpeDogJ2cnIH0pCiAgICBieXRlY18wIC8vICJnIgogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTc5LTExODAKICAgIC8vIGNvbnN0IGdyb3VwID0gY2xvbmUodGhpcy5ncm91cHMoZ2lkKS52YWx1ZSkKICAgIC8vIGdyb3VwLm1lbWJlckNvdW50ID0gZ3JvdXAubWVtYmVyQ291bnQgKyBVaW50NjQoMSkKICAgIGR1cAogICAgcHVzaGludCAxMCAvLyAxMAogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTE4MAogICAgLy8gZ3JvdXAubWVtYmVyQ291bnQgPSBncm91cC5tZW1iZXJDb3VudCArIFVpbnQ2NCgxKQogICAgYnRvaQogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTc5LTExODEKICAgIC8vIGNvbnN0IGdyb3VwID0gY2xvbmUodGhpcy5ncm91cHMoZ2lkKS52YWx1ZSkKICAgIC8vIGdyb3VwLm1lbWJlckNvdW50ID0gZ3JvdXAubWVtYmVyQ291bnQgKyBVaW50NjQoMSkKICAgIC8vIHRoaXMuZ3JvdXBzKGdpZCkudmFsdWUgPSBjbG9uZShncm91cCkKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTE4MwogICAgLy8gZW1pdDxNZW1iZXJBZGRlZD4oeyBncm91cElkOiBnaWQsIG1lbWJlcjogY2hhbmdlLm1lbWJlckFkZHIsIGFjY291bnRUeXBlOiBjaGFuZ2UubWVtYmVyVHlwZSB9KQogICAgY29uY2F0CiAgICBieXRlYyAxMyAvLyBtZXRob2QgIk1lbWJlckFkZGVkKHVpbnQ2NCxhZGRyZXNzLHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgYiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUA5CgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDE4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEwNzYKICAgIC8vIH0gZWxzZSBpZiAoY2hhbmdlLmNoYW5nZVR5cGUgPT09IEFETV9SRU1PVkVfTUVNQkVSKSB7CiAgICBmcmFtZV9kaWcgNjkKICAgIHB1c2hpbnQgMyAvLyAzCiAgICA9PQogICAgYnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2Vsc2VfYm9keUAyMgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExODcKICAgIC8vIGNvbnN0IGdpZCA9IGNoYW5nZS50YXJnZXRHcm91cElkCiAgICBmcmFtZV9kaWcgMTcKICAgIGR1cAogICAgaW50Y18yIC8vIDgKICAgIGR1cAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTg4CiAgICAvLyBhc3NlcnQodGhpcy5tZW1iZXJzKHsgZ3JvdXBJZDogZ2lkLCBhY2NvdW50OiBjaGFuZ2UubWVtYmVyQWRkciB9KS5leGlzdHMsICdub3QgYSBtZW1iZXInKQogICAgc3dhcAogICAgcHVzaGludHMgMTggMzIgLy8gMTgsIDMyCiAgICBib3hfZXh0cmFjdAogICAgc3dhcAogICAgaXRvYgogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjI3NQogICAgLy8gbWVtYmVycyA9IEJveE1hcDx7IGdyb3VwSWQ6IHVpbnQ2NDsgYWNjb3VudDogQWNjb3VudCB9LCBNZW1iZXI+KHsga2V5UHJlZml4OiAnbScgfSkKICAgIGJ5dGVjIDQgLy8gIm0iCiAgICBkaWcgMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTE4OAogICAgLy8gYXNzZXJ0KHRoaXMubWVtYmVycyh7IGdyb3VwSWQ6IGdpZCwgYWNjb3VudDogY2hhbmdlLm1lbWJlckFkZHIgfSkuZXhpc3RzLCAnbm90IGEgbWVtYmVyJykKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gbm90IGEgbWVtYmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6Mjc0CiAgICAvLyBncm91cHMgPSBCb3hNYXA8dWludDY0LCBTaWduZXJHcm91cD4oeyBrZXlQcmVmaXg6ICdnJyB9KQogICAgYnl0ZWNfMCAvLyAiZyIKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTE5MAogICAgLy8gY29uc3QgZ3JvdXAgPSBjbG9uZSh0aGlzLmdyb3VwcyhnaWQpLnZhbHVlKQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExOTAtMTE5MQogICAgLy8gY29uc3QgZ3JvdXAgPSBjbG9uZSh0aGlzLmdyb3VwcyhnaWQpLnZhbHVlKQogICAgLy8gYXNzZXJ0KGdyb3VwLm1lbWJlckNvdW50IC0gVWludDY0KDEpID49IGdyb3VwLnRocmVzaG9sZCwgJ3dvdWxkIGRyb3AgYmVsb3cgdGhyZXNob2xkJykKICAgIGRpZyAxCiAgICBwdXNoaW50IDEwIC8vIDEwCiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTkxCiAgICAvLyBhc3NlcnQoZ3JvdXAubWVtYmVyQ291bnQgLSBVaW50NjQoMSkgPj0gZ3JvdXAudGhyZXNob2xkLCAnd291bGQgZHJvcCBiZWxvdyB0aHJlc2hvbGQnKQogICAgYnRvaQogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTkwLTExOTEKICAgIC8vIGNvbnN0IGdyb3VwID0gY2xvbmUodGhpcy5ncm91cHMoZ2lkKS52YWx1ZSkKICAgIC8vIGFzc2VydChncm91cC5tZW1iZXJDb3VudCAtIFVpbnQ2NCgxKSA+PSBncm91cC50aHJlc2hvbGQsICd3b3VsZCBkcm9wIGJlbG93IHRocmVzaG9sZCcpCiAgICBkaWcgMgogICAgaW50Y18zIC8vIDIKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExOTEKICAgIC8vIGFzc2VydChncm91cC5tZW1iZXJDb3VudCAtIFVpbnQ2NCgxKSA+PSBncm91cC50aHJlc2hvbGQsICd3b3VsZCBkcm9wIGJlbG93IHRocmVzaG9sZCcpCiAgICBidG9pCiAgICBkaWcgMQogICAgPD0KICAgIGFzc2VydCAvLyB3b3VsZCBkcm9wIGJlbG93IHRocmVzaG9sZAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExOTMKICAgIC8vIHRoaXMubWVtYmVycyh7IGdyb3VwSWQ6IGdpZCwgYWNjb3VudDogY2hhbmdlLm1lbWJlckFkZHIgfSkuZGVsZXRlKCkKICAgIHVuY292ZXIgMwogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTE5NAogICAgLy8gZ3JvdXAubWVtYmVyQ291bnQgPSBncm91cC5tZW1iZXJDb3VudCAtIFVpbnQ2NCgxKQogICAgaXRvYgogICAgcmVwbGFjZTIgMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTk4CiAgICAvLyBncm91cC5tZW1iZXJzaGlwRXBvY2ggPSBncm91cC5tZW1iZXJzaGlwRXBvY2ggKyBVaW50NjQoMSkKICAgIGR1cAogICAgcHVzaGludCAxMDYgLy8gMTA2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIHJlcGxhY2UyIDEwNgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExOTkKICAgIC8vIHRoaXMuZ3JvdXBzKGdpZCkudmFsdWUgPSBjbG9uZShncm91cCkKICAgIGRpZyAxCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMjAxCiAgICAvLyBlbWl0PE1lbWJlclJlbW92ZWQ+KHsgZ3JvdXBJZDogZ2lkLCBtZW1iZXI6IGNoYW5nZS5tZW1iZXJBZGRyIH0pCiAgICBwdXNoYnl0ZXMgMHgyYjE0YzJjMSAvLyBtZXRob2QgIk1lbWJlclJlbW92ZWQodWludDY0LGFkZHJlc3MpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGIgX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VAOQoKX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2Vsc2VfYm9keUAyMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDc4CiAgICAvLyB9IGVsc2UgaWYgKGNoYW5nZS5jaGFuZ2VUeXBlID09PSBBRE1fQ0hBTkdFX1RIUkVTSE9MRCkgewogICAgZnJhbWVfZGlnIDY5CiAgICBwdXNoaW50IDQgLy8gNAogICAgPT0KICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9lbHNlX2JvZHlAMjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDc5CiAgICAvLyBjb25zdCBncm91cCA9IGNsb25lKHRoaXMuZ3JvdXBzKGNoYW5nZS50YXJnZXRHcm91cElkKS52YWx1ZSkKICAgIGZyYW1lX2RpZyAxNwogICAgZHVwCiAgICBpbnRjXzIgLy8gOAogICAgZHVwCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjI3NAogICAgLy8gZ3JvdXBzID0gQm94TWFwPHVpbnQ2NCwgU2lnbmVyR3JvdXA+KHsga2V5UHJlZml4OiAnZycgfSkKICAgIGJ5dGVjXzAgLy8gImciCiAgICBkaWcgMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTA4MAogICAgLy8gYXNzZXJ0KGNoYW5nZS50aHJlc2hvbGQgPD0gZ3JvdXAubWVtYmVyQ291bnQsICd0aHJlc2hvbGQgZXhjZWVkcyBtZW1iZXJzJykKICAgIHVuY292ZXIgMgogICAgcHVzaGludCA2MCAvLyA2MAogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBkdXAKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDc5LTEwODAKICAgIC8vIGNvbnN0IGdyb3VwID0gY2xvbmUodGhpcy5ncm91cHMoY2hhbmdlLnRhcmdldEdyb3VwSWQpLnZhbHVlKQogICAgLy8gYXNzZXJ0KGNoYW5nZS50aHJlc2hvbGQgPD0gZ3JvdXAubWVtYmVyQ291bnQsICd0aHJlc2hvbGQgZXhjZWVkcyBtZW1iZXJzJykKICAgIGRpZyAyCiAgICBwdXNoaW50IDEwIC8vIDEwCiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDgwCiAgICAvLyBhc3NlcnQoY2hhbmdlLnRocmVzaG9sZCA8PSBncm91cC5tZW1iZXJDb3VudCwgJ3RocmVzaG9sZCBleGNlZWRzIG1lbWJlcnMnKQogICAgYnRvaQogICAgPD0KICAgIGFzc2VydCAvLyB0aHJlc2hvbGQgZXhjZWVkcyBtZW1iZXJzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTA4MS0xMDgyCiAgICAvLyBncm91cC50aHJlc2hvbGQgPSBjaGFuZ2UudGhyZXNob2xkCiAgICAvLyB0aGlzLmdyb3VwcyhjaGFuZ2UudGFyZ2V0R3JvdXBJZCkudmFsdWUgPSBjbG9uZShncm91cCkKICAgIGludGNfMyAvLyAyCiAgICBzd2FwCiAgICBib3hfcmVwbGFjZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEwODMKICAgIC8vIGVtaXQ8R3JvdXBVcGRhdGVkPih7IGdyb3VwSWQ6IGNoYW5nZS50YXJnZXRHcm91cElkIH0pCiAgICBieXRlYyAxMSAvLyBtZXRob2QgIkdyb3VwVXBkYXRlZCh1aW50NjQpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGIgX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VAOQoKX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2Vsc2VfYm9keUAyNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDg0CiAgICAvLyB9IGVsc2UgaWYgKGNoYW5nZS5jaGFuZ2VUeXBlID09PSBBRE1fU0VUX1BPTElDWSkgewogICAgZnJhbWVfZGlnIDY5CiAgICBwdXNoaW50IDUgLy8gNQogICAgPT0KICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9lbHNlX2JvZHlAMjgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDg1CiAgICAvLyBjb25zdCBncm91cCA9IGNsb25lKHRoaXMuZ3JvdXBzKGNoYW5nZS50YXJnZXRHcm91cElkKS52YWx1ZSkKICAgIGZyYW1lX2RpZyAxNwogICAgZHVwCiAgICBpbnRjXzIgLy8gOAogICAgZHVwCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgaXRvYgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6Mjc0CiAgICAvLyBncm91cHMgPSBCb3hNYXA8dWludDY0LCBTaWduZXJHcm91cD4oeyBrZXlQcmVmaXg6ICdnJyB9KQogICAgYnl0ZWNfMCAvLyAiZyIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDE4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTA4NQogICAgLy8gY29uc3QgZ3JvdXAgPSBjbG9uZSh0aGlzLmdyb3VwcyhjaGFuZ2UudGFyZ2V0R3JvdXBJZCkudmFsdWUpCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTA4NS0xMDg2CiAgICAvLyBjb25zdCBncm91cCA9IGNsb25lKHRoaXMuZ3JvdXBzKGNoYW5nZS50YXJnZXRHcm91cElkKS52YWx1ZSkKICAgIC8vIGNvbnN0IGFzc2V0Q2hhbmdlZCA9IGdyb3VwLmxpbWl0QXNzZXRJZCAhPT0gY2hhbmdlLmxpbWl0QXNzZXRJZAogICAgc3dhcAogICAgcHVzaGludCAzNCAvLyAzNAogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTA4NgogICAgLy8gY29uc3QgYXNzZXRDaGFuZ2VkID0gZ3JvdXAubGltaXRBc3NldElkICE9PSBjaGFuZ2UubGltaXRBc3NldElkCiAgICBidG9pCiAgICBkaWcgMgogICAgcHVzaGludCA4NCAvLyA4NAogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBkdXAKICAgIGJ0b2kKICAgIHVuY292ZXIgMgogICAgIT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDg3CiAgICAvLyBncm91cC5hbGxvd2VkQWN0aW9ucyA9IGNoYW5nZS5hbGxvd2VkQWN0aW9ucwogICAgZGlnIDMKICAgIHB1c2hpbnQgNzYgLy8gNzYKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgdW5jb3ZlciAzCiAgICBzd2FwCiAgICByZXBsYWNlMiAyNgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEwODgKICAgIC8vIGdyb3VwLmxpbWl0QXNzZXRJZCA9IGNoYW5nZS5saW1pdEFzc2V0SWQKICAgIHVuY292ZXIgMgogICAgcmVwbGFjZTIgMzQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDg5CiAgICAvLyBncm91cC5kYWlseUxpbWl0ID0gY2hhbmdlLmRhaWx5TGltaXQKICAgIGRpZyAyCiAgICBwdXNoaW50IDkyIC8vIDkyCiAgICBpbnRjXzIgLy8gOAogICAgYm94X2V4dHJhY3QKICAgIHJlcGxhY2UyIDQyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTA5MAogICAgLy8gZ3JvdXAubW9udGhseUxpbWl0ID0gY2hhbmdlLm1vbnRobHlMaW1pdAogICAgZGlnIDIKICAgIHB1c2hpbnQgMTAwIC8vIDEwMAogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICByZXBsYWNlMiA2NgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEwOTEKICAgIC8vIGdyb3VwLmNvb2xkb3duUm91bmRzID0gY2hhbmdlLmNvb2xkb3duUm91bmRzCiAgICB1bmNvdmVyIDIKICAgIHB1c2hpbnQgMTA4IC8vIDEwOAogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICByZXBsYWNlMiA5MAogICAgc3dhcAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEwOTIKICAgIC8vIGlmIChhc3NldENoYW5nZWQpIHsKICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDI3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTA5MwogICAgLy8gY29uc3Qgbm93ID0gR2xvYmFsLmxhdGVzdFRpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEwOTQKICAgIC8vIGdyb3VwLmRhaWx5VXNhZ2UgPSBVaW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBpdG9iCiAgICB1bmNvdmVyIDIKICAgIGRpZyAxCiAgICByZXBsYWNlMiA1MAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEwOTUKICAgIC8vIGdyb3VwLmRhaWx5UGVyaW9kU3RhcnQgPSBub3cKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgc3dhcAogICAgZGlnIDEKICAgIHJlcGxhY2UyIDU4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTA5NgogICAgLy8gZ3JvdXAubW9udGhseVVzYWdlID0gVWludDY0KDApCiAgICB1bmNvdmVyIDIKICAgIHJlcGxhY2UyIDc0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTA5NwogICAgLy8gZ3JvdXAubW9udGhseVBlcmlvZFN0YXJ0ID0gbm93CiAgICBzd2FwCiAgICByZXBsYWNlMiA4MgoKX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2FmdGVyX2lmX2Vsc2VAMjc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTA5OQogICAgLy8gdGhpcy5ncm91cHMoY2hhbmdlLnRhcmdldEdyb3VwSWQpLnZhbHVlID0gY2xvbmUoZ3JvdXApCiAgICBmcmFtZV9kaWcgMTgKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTEwMAogICAgLy8gZW1pdDxHcm91cFVwZGF0ZWQ+KHsgZ3JvdXBJZDogY2hhbmdlLnRhcmdldEdyb3VwSWQgfSkKICAgIGJ5dGVjIDExIC8vIG1ldGhvZCAiR3JvdXBVcGRhdGVkKHVpbnQ2NCkiCiAgICBmcmFtZV9kaWcgMjIKICAgIGNvbmNhdAogICAgbG9nCiAgICBiIF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDkKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9lbHNlX2JvZHlAMjg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTEwMQogICAgLy8gfSBlbHNlIGlmIChjaGFuZ2UuY2hhbmdlVHlwZSA9PT0gQURNX1NFVF9QUklWSUxFR0VTKSB7CiAgICBmcmFtZV9kaWcgNjkKICAgIHB1c2hpbnQgNiAvLyA2CiAgICA9PQogICAgYnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2Vsc2VfYm9keUA0MQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExMDIKICAgIC8vIGNvbnN0IGdyb3VwID0gY2xvbmUodGhpcy5ncm91cHMoY2hhbmdlLnRhcmdldEdyb3VwSWQpLnZhbHVlKQogICAgZnJhbWVfZGlnIDE3CiAgICBpbnRjXzIgLy8gOAogICAgZHVwCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjI3NAogICAgLy8gZ3JvdXBzID0gQm94TWFwPHVpbnQ2NCwgU2lnbmVyR3JvdXA+KHsga2V5UHJlZml4OiAnZycgfSkKICAgIGJ5dGVjXzAgLy8gImciCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTAyCiAgICAvLyBjb25zdCBncm91cCA9IGNsb25lKHRoaXMuZ3JvdXBzKGNoYW5nZS50YXJnZXRHcm91cElkKS52YWx1ZSkKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTEwNQogICAgLy8gYXNzZXJ0KCF0aGlzLl93b3VsZFJlbW92ZUxhc3RHcm91cEFkbWluKGNoYW5nZSwgZ3JvdXApLCAnbXVzdCBrZWVwIGF0IGxlYXN0IG9uZSBhY3RpdmUgZ3JvdXAgYWRtaW4nKQogICAgZnJhbWVfZGlnIDIwCiAgICBzd2FwCiAgICBjYWxsc3ViIF93b3VsZFJlbW92ZUxhc3RHcm91cEFkbWluCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGZyYW1lX2J1cnkgMjYKICAgIGR1cAogICAgY292ZXIgMwogICAgZnJhbWVfYnVyeSAyMAogICAgIQogICAgYXNzZXJ0IC8vIG11c3Qga2VlcCBhdCBsZWFzdCBvbmUgYWN0aXZlIGdyb3VwIGFkbWluCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTEwNgogICAgLy8gY29uc3QgaGFkR3JvdXBQcml2ID0gKGdyb3VwLmFkbWluUHJpdmlsZWdlcyAmIFBSSVZfR1JPVVApICE9PSBVaW50NjQoMCkKICAgIGR1cAogICAgcHVzaGludCAxOCAvLyAxOAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMSAvLyAxCiAgICAmCiAgICBmcmFtZV9idXJ5IDU4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTEwNwogICAgLy8gY29uc3Qgd2lsbEhhdmVHcm91cFByaXYgPSAoY2hhbmdlLmFkbWluUHJpdmlsZWdlcyAmIFBSSVZfR1JPVVApICE9PSBVaW50NjQoMCkKICAgIGRpZyAxCiAgICBleHRyYWN0IDY4IDgKICAgIGZyYW1lX2J1cnkgMQogICAgc3dhcAogICAgcHVzaGludCA2OCAvLyA2OAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMSAvLyAxCiAgICAmCiAgICBmcmFtZV9idXJ5IDU5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTEwOAogICAgLy8gaWYgKGdyb3VwLmFjdGl2ZSAhPT0gVWludDY0KDApICYmIGhhZEdyb3VwUHJpdiAmJiAhd2lsbEhhdmVHcm91cFByaXYpIHsKICAgIHB1c2hpbnQgMTE0IC8vIDExNAogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgZnJhbWVfYnVyeSA3MgogICAgYnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2Vsc2VfYm9keUAzNQogICAgZnJhbWVfZGlnIDU4CiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDM1CiAgICBmcmFtZV9kaWcgNTkKICAgIGJueiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDM1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTEwOQogICAgLy8gdGhpcy5hY3RpdmVQcml2R3JvdXBDb3VudC52YWx1ZSA9IHRoaXMuYWN0aXZlUHJpdkdyb3VwQ291bnQudmFsdWUgLSBVaW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MjcxCiAgICAvLyBhY3RpdmVQcml2R3JvdXBDb3VudCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdhcGdjJyB9KQogICAgYnl0ZWNfMiAvLyAiYXBnYyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTA5CiAgICAvLyB0aGlzLmFjdGl2ZVByaXZHcm91cENvdW50LnZhbHVlID0gdGhpcy5hY3RpdmVQcml2R3JvdXBDb3VudC52YWx1ZSAtIFVpbnQ2NCgxKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MjcxCiAgICAvLyBhY3RpdmVQcml2R3JvdXBDb3VudCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdhcGdjJyB9KQogICAgYnl0ZWNfMiAvLyAiYXBnYyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTA5CiAgICAvLyB0aGlzLmFjdGl2ZVByaXZHcm91cENvdW50LnZhbHVlID0gdGhpcy5hY3RpdmVQcml2R3JvdXBDb3VudC52YWx1ZSAtIFVpbnQ2NCgxKQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDQwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExMTMKICAgIC8vIGdyb3VwLmFkbWluUHJpdmlsZWdlcyA9IGNoYW5nZS5hZG1pblByaXZpbGVnZXMKICAgIGZyYW1lX2RpZyAyNgogICAgZnJhbWVfZGlnIDEKICAgIHJlcGxhY2UyIDE4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTExNAogICAgLy8gdGhpcy5ncm91cHMoY2hhbmdlLnRhcmdldEdyb3VwSWQpLnZhbHVlID0gY2xvbmUoZ3JvdXApCiAgICBmcmFtZV9kaWcgMjAKICAgIGV4dHJhY3QgOCA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6Mjc0CiAgICAvLyBncm91cHMgPSBCb3hNYXA8dWludDY0LCBTaWduZXJHcm91cD4oeyBrZXlQcmVmaXg6ICdnJyB9KQogICAgYnl0ZWNfMCAvLyAiZyIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTE0CiAgICAvLyB0aGlzLmdyb3VwcyhjaGFuZ2UudGFyZ2V0R3JvdXBJZCkudmFsdWUgPSBjbG9uZShncm91cCkKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICB1bmNvdmVyIDIKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTE1CiAgICAvLyBlbWl0PEdyb3VwVXBkYXRlZD4oeyBncm91cElkOiBjaGFuZ2UudGFyZ2V0R3JvdXBJZCB9KQogICAgYnl0ZWMgMTEgLy8gbWV0aG9kICJHcm91cFVwZGF0ZWQodWludDY0KSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBiIF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDkKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9lbHNlX2JvZHlAMzU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTExMAogICAgLy8gfSBlbHNlIGlmIChncm91cC5hY3RpdmUgIT09IFVpbnQ2NCgwKSAmJiAhaGFkR3JvdXBQcml2ICYmIHdpbGxIYXZlR3JvdXBQcml2KSB7CiAgICBmcmFtZV9kaWcgNzIKICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDQwCiAgICBmcmFtZV9kaWcgNTgKICAgIGJueiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUA0MAogICAgZnJhbWVfZGlnIDU5CiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUA0MAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExMTEKICAgIC8vIHRoaXMuYWN0aXZlUHJpdkdyb3VwQ291bnQudmFsdWUgPSB0aGlzLmFjdGl2ZVByaXZHcm91cENvdW50LnZhbHVlICsgVWludDY0KDEpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjI3MQogICAgLy8gYWN0aXZlUHJpdkdyb3VwQ291bnQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnYXBnYycgfSkKICAgIGJ5dGVjXzIgLy8gImFwZ2MiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTExMQogICAgLy8gdGhpcy5hY3RpdmVQcml2R3JvdXBDb3VudC52YWx1ZSA9IHRoaXMuYWN0aXZlUHJpdkdyb3VwQ291bnQudmFsdWUgKyBVaW50NjQoMSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjI3MQogICAgLy8gYWN0aXZlUHJpdkdyb3VwQ291bnQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnYXBnYycgfSkKICAgIGJ5dGVjXzIgLy8gImFwZ2MiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTExMQogICAgLy8gdGhpcy5hY3RpdmVQcml2R3JvdXBDb3VudC52YWx1ZSA9IHRoaXMuYWN0aXZlUHJpdkdyb3VwQ291bnQudmFsdWUgKyBVaW50NjQoMSkKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDQwCgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDQxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExMTgKICAgIC8vIGNvbnN0IGdyb3VwID0gY2xvbmUodGhpcy5ncm91cHMoY2hhbmdlLnRhcmdldEdyb3VwSWQpLnZhbHVlKQogICAgZnJhbWVfZGlnIDE3CiAgICBpbnRjXzIgLy8gOAogICAgZHVwCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjI3NAogICAgLy8gZ3JvdXBzID0gQm94TWFwPHVpbnQ2NCwgU2lnbmVyR3JvdXA+KHsga2V5UHJlZml4OiAnZycgfSkKICAgIGJ5dGVjXzAgLy8gImciCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTE4CiAgICAvLyBjb25zdCBncm91cCA9IGNsb25lKHRoaXMuZ3JvdXBzKGNoYW5nZS50YXJnZXRHcm91cElkKS52YWx1ZSkKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTExOQogICAgLy8gYXNzZXJ0KCF0aGlzLl93b3VsZFJlbW92ZUxhc3RHcm91cEFkbWluKGNoYW5nZSwgZ3JvdXApLCAnbXVzdCBrZWVwIGF0IGxlYXN0IG9uZSBhY3RpdmUgZ3JvdXAgYWRtaW4nKQogICAgZnJhbWVfZGlnIDIwCiAgICBzd2FwCiAgICBjYWxsc3ViIF93b3VsZFJlbW92ZUxhc3RHcm91cEFkbWluCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGZyYW1lX2J1cnkgMjcKICAgIGR1cAogICAgY292ZXIgMwogICAgZnJhbWVfYnVyeSAyMAogICAgIQogICAgYXNzZXJ0IC8vIG11c3Qga2VlcCBhdCBsZWFzdCBvbmUgYWN0aXZlIGdyb3VwIGFkbWluCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTEyMAogICAgLy8gY29uc3QgaGFzR3JvdXBQcml2ID0gKGdyb3VwLmFkbWluUHJpdmlsZWdlcyAmIFBSSVZfR1JPVVApICE9PSBVaW50NjQoMCkKICAgIGR1cAogICAgcHVzaGludCAxOCAvLyAxOAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMSAvLyAxCiAgICAmCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgNjMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTIxCiAgICAvLyBjb25zdCB3YXNBY3RpdmUgPSBncm91cC5hY3RpdmUgIT09IFVpbnQ2NCgwKQogICAgcHVzaGludCAxMTQgLy8gMTE0CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZnJhbWVfYnVyeSA3MwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExMjIKICAgIC8vIGNvbnN0IHdpbGxCZUFjdGl2ZSA9IGNoYW5nZS5hY3RpdmVGbGFnICE9PSBVaW50NjQoMCkKICAgIHN3YXAKICAgIHB1c2hpbnQgMTE2IC8vIDExNgogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgZnJhbWVfYnVyeSA3NAogICAgaW50Y18wIC8vIDAKICAgICE9CiAgICBmcmFtZV9idXJ5IDc2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTEyMwogICAgLy8gaWYgKGhhc0dyb3VwUHJpdiAmJiB3YXNBY3RpdmUgJiYgIXdpbGxCZUFjdGl2ZSkgewogICAgYnogX2V4ZWN1dGVQcm9wb3NhbEludGVybmFsX2Vsc2VfYm9keUA0NwogICAgZnJhbWVfZGlnIDczCiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDQ3CiAgICBmcmFtZV9kaWcgNzQKICAgIGJueiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDQ3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTEyNAogICAgLy8gdGhpcy5hY3RpdmVQcml2R3JvdXBDb3VudC52YWx1ZSA9IHRoaXMuYWN0aXZlUHJpdkdyb3VwQ291bnQudmFsdWUgLSBVaW50NjQoMSkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MjcxCiAgICAvLyBhY3RpdmVQcml2R3JvdXBDb3VudCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdhcGdjJyB9KQogICAgYnl0ZWNfMiAvLyAiYXBnYyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTI0CiAgICAvLyB0aGlzLmFjdGl2ZVByaXZHcm91cENvdW50LnZhbHVlID0gdGhpcy5hY3RpdmVQcml2R3JvdXBDb3VudC52YWx1ZSAtIFVpbnQ2NCgxKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MjcxCiAgICAvLyBhY3RpdmVQcml2R3JvdXBDb3VudCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdhcGdjJyB9KQogICAgYnl0ZWNfMiAvLyAiYXBnYyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMTI0CiAgICAvLyB0aGlzLmFjdGl2ZVByaXZHcm91cENvdW50LnZhbHVlID0gdGhpcy5hY3RpdmVQcml2R3JvdXBDb3VudC52YWx1ZSAtIFVpbnQ2NCgxKQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCl9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDUyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExMjgKICAgIC8vIGdyb3VwLmFjdGl2ZSA9IHdpbGxCZUFjdGl2ZSA/IFVpbnQ2NCgxKSA6IFVpbnQ2NCgwKQogICAgZnJhbWVfZGlnIDc2CiAgICBpdG9iCiAgICBmcmFtZV9kaWcgMjcKICAgIHN3YXAKICAgIHJlcGxhY2UyIDExNAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExMjkKICAgIC8vIHRoaXMuZ3JvdXBzKGNoYW5nZS50YXJnZXRHcm91cElkKS52YWx1ZSA9IGNsb25lKGdyb3VwKQogICAgZnJhbWVfZGlnIDIwCiAgICBleHRyYWN0IDggOAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjI3NAogICAgLy8gZ3JvdXBzID0gQm94TWFwPHVpbnQ2NCwgU2lnbmVyR3JvdXA+KHsga2V5UHJlZml4OiAnZycgfSkKICAgIGJ5dGVjXzAgLy8gImciCiAgICBkaWcgMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTEyOQogICAgLy8gdGhpcy5ncm91cHMoY2hhbmdlLnRhcmdldEdyb3VwSWQpLnZhbHVlID0gY2xvbmUoZ3JvdXApCiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgdW5jb3ZlciAyCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTEzMAogICAgLy8gZW1pdDxHcm91cFVwZGF0ZWQ+KHsgZ3JvdXBJZDogY2hhbmdlLnRhcmdldEdyb3VwSWQgfSkKICAgIGJ5dGVjIDExIC8vIG1ldGhvZCAiR3JvdXBVcGRhdGVkKHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgYiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUA5CgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfZWxzZV9ib2R5QDQ3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExMjUKICAgIC8vIH0gZWxzZSBpZiAoaGFzR3JvdXBQcml2ICYmICF3YXNBY3RpdmUgJiYgd2lsbEJlQWN0aXZlKSB7CiAgICBmcmFtZV9kaWcgNjMKICAgIGJ6IF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDUyCiAgICBmcmFtZV9kaWcgNzMKICAgIGJueiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUA1MgogICAgZnJhbWVfZGlnIDc0CiAgICBieiBfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfYWZ0ZXJfaWZfZWxzZUA1MgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjExMjYKICAgIC8vIHRoaXMuYWN0aXZlUHJpdkdyb3VwQ291bnQudmFsdWUgPSB0aGlzLmFjdGl2ZVByaXZHcm91cENvdW50LnZhbHVlICsgVWludDY0KDEpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjI3MQogICAgLy8gYWN0aXZlUHJpdkdyb3VwQ291bnQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnYXBnYycgfSkKICAgIGJ5dGVjXzIgLy8gImFwZ2MiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTEyNgogICAgLy8gdGhpcy5hY3RpdmVQcml2R3JvdXBDb3VudC52YWx1ZSA9IHRoaXMuYWN0aXZlUHJpdkdyb3VwQ291bnQudmFsdWUgKyBVaW50NjQoMSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjI3MQogICAgLy8gYWN0aXZlUHJpdkdyb3VwQ291bnQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnYXBnYycgfSkKICAgIGJ5dGVjXzIgLy8gImFwZ2MiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTEyNgogICAgLy8gdGhpcy5hY3RpdmVQcml2R3JvdXBDb3VudC52YWx1ZSA9IHRoaXMuYWN0aXZlUHJpdkdyb3VwQ291bnQudmFsdWUgKyBVaW50NjQoMSkKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF9hZnRlcl9pZl9lbHNlQDUyCgpfZXhlY3V0ZVByb3Bvc2FsSW50ZXJuYWxfdGVybmFyeV9mYWxzZUAyOgogICAgZnJhbWVfZGlnIDgzCiAgICBiIF9leGVjdXRlUHJvcG9zYWxJbnRlcm5hbF90ZXJuYXJ5X21lcmdlQDMKCgovLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OkFsZ29TYWZlLl9uZXdQcm9wb3NhbChncm91cElkOiB1aW50NjQsIHBheWxvYWRUeXBlOiB1aW50NjQsIGV4cGlyeVJvdW5kOiB1aW50NjQpIC0+IHVpbnQ2NDoKX25ld1Byb3Bvc2FsOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjY2OAogICAgLy8gcHJpdmF0ZSBfbmV3UHJvcG9zYWwoZ3JvdXBJZDogdWludDY0LCBwYXlsb2FkVHlwZTogdWludDY0LCBleHBpcnlSb3VuZDogdWludDY0KTogdWludDY0IHsKICAgIHByb3RvIDMgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjY2OQogICAgLy8gYXNzZXJ0KGV4cGlyeVJvdW5kID4gR2xvYmFsLnJvdW5kLCAnZXhwaXJ5IG11c3QgYmUgaW4gdGhlIGZ1dHVyZScpCiAgICBmcmFtZV9kaWcgLTEKICAgIGdsb2JhbCBSb3VuZAogICAgPgogICAgYXNzZXJ0IC8vIGV4cGlyeSBtdXN0IGJlIGluIHRoZSBmdXR1cmUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2NzAKICAgIC8vIGNvbnN0IGdyb3VwID0gY2xvbmUodGhpcy5ncm91cHMoZ3JvdXBJZCkudmFsdWUpCiAgICBmcmFtZV9kaWcgLTMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoyNzQKICAgIC8vIGdyb3VwcyA9IEJveE1hcDx1aW50NjQsIFNpZ25lckdyb3VwPih7IGtleVByZWZpeDogJ2cnIH0pCiAgICBieXRlY18wIC8vICJnIgogICAgZGlnIDEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjY3MQogICAgLy8gY29uc3QgcGlkOiB1aW50NjQgPSB0aGlzLm5leHRQcm9wb3NhbElkLnZhbHVlCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjI2NAogICAgLy8gbmV4dFByb3Bvc2FsSWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnbnBpZCcgfSkKICAgIGJ5dGVjIDkgLy8gIm5waWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjcxCiAgICAvLyBjb25zdCBwaWQ6IHVpbnQ2NCA9IHRoaXMubmV4dFByb3Bvc2FsSWQudmFsdWUKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6Njc4CiAgICAvLyB0aHJlc2hvbGQ6IGdyb3VwLnRocmVzaG9sZCwKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gMgogICAgaW50Y18yIC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjgwCiAgICAvLyBwcm9wb3NlcjogVHhuLnNlbmRlciwKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2ODIKICAgIC8vIGVwb2NoQXRDcmVhdGlvbjogZ3JvdXAubWVtYmVyc2hpcEVwb2NoLAogICAgdW5jb3ZlciAzCiAgICBwdXNoaW50IDEwNiAvLyAxMDYKICAgIGludGNfMiAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjY3NQogICAgLy8gc3RhdHVzOiBTVEFUVVNfQUNUSVZFLAogICAgaW50Y18xIC8vIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2NzMtNjgzCiAgICAvLyBjb25zdCBwcm9wb3NhbDogUHJvcG9zYWwgPSB7CiAgICAvLyAgIGdyb3VwSWQsCiAgICAvLyAgIHN0YXR1czogU1RBVFVTX0FDVElWRSwKICAgIC8vICAgcGF5bG9hZFR5cGUsCiAgICAvLyAgIGFwcHJvdmFsc0NvdW50OiBVaW50NjQoMCksCiAgICAvLyAgIHRocmVzaG9sZDogZ3JvdXAudGhyZXNob2xkLAogICAgLy8gICBleHBpcnlSb3VuZCwKICAgIC8vICAgcHJvcG9zZXI6IFR4bi5zZW5kZXIsCiAgICAvLyAgIG51bVBheWxvYWRzOiBVaW50NjQoMCksCiAgICAvLyAgIGVwb2NoQXRDcmVhdGlvbjogZ3JvdXAubWVtYmVyc2hpcEVwb2NoLAogICAgLy8gfQogICAgaXRvYgogICAgZGlnIDUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0yCiAgICBpdG9iCiAgICBzd2FwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6Njc3CiAgICAvLyBhcHByb3ZhbHNDb3VudDogVWludDY0KDApLAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2NzMtNjgzCiAgICAvLyBjb25zdCBwcm9wb3NhbDogUHJvcG9zYWwgPSB7CiAgICAvLyAgIGdyb3VwSWQsCiAgICAvLyAgIHN0YXR1czogU1RBVFVTX0FDVElWRSwKICAgIC8vICAgcGF5bG9hZFR5cGUsCiAgICAvLyAgIGFwcHJvdmFsc0NvdW50OiBVaW50NjQoMCksCiAgICAvLyAgIHRocmVzaG9sZDogZ3JvdXAudGhyZXNob2xkLAogICAgLy8gICBleHBpcnlSb3VuZCwKICAgIC8vICAgcHJvcG9zZXI6IFR4bi5zZW5kZXIsCiAgICAvLyAgIG51bVBheWxvYWRzOiBVaW50NjQoMCksCiAgICAvLyAgIGVwb2NoQXRDcmVhdGlvbjogZ3JvdXAubWVtYmVyc2hpcEVwb2NoLAogICAgLy8gfQogICAgaXRvYgogICAgc3dhcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgdW5jb3ZlciA1CiAgICBpdG9iCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjY4NAogICAgLy8gdGhpcy5wcm9wb3NhbHMocGlkKS52YWx1ZSA9IGNsb25lKHByb3Bvc2FsKQogICAgZGlnIDIKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoyNzYKICAgIC8vIHByb3Bvc2FscyA9IEJveE1hcDx1aW50NjQsIFByb3Bvc2FsPih7IGtleVByZWZpeDogJ3AnIH0pCiAgICBieXRlYyA1IC8vICJwIgogICAgZGlnIDEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjY4NAogICAgLy8gdGhpcy5wcm9wb3NhbHMocGlkKS52YWx1ZSA9IGNsb25lKHByb3Bvc2FsKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2ODUKICAgIC8vIHRoaXMubmV4dFByb3Bvc2FsSWQudmFsdWUgPSBwaWQgKyBVaW50NjQoMSkKICAgIGRpZyAzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjI2NAogICAgLy8gbmV4dFByb3Bvc2FsSWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiAnbnBpZCcgfSkKICAgIGJ5dGVjIDkgLy8gIm5waWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6Njg1CiAgICAvLyB0aGlzLm5leHRQcm9wb3NhbElkLnZhbHVlID0gcGlkICsgVWludDY0KDEpCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjY4NwogICAgLy8gZW1pdDxQcm9wb3NhbENyZWF0ZWQ+KHsgcHJvcG9zYWxJZDogcGlkLCBncm91cElkLCBwYXlsb2FkVHlwZSwgcHJvcG9zZXI6IFR4bi5zZW5kZXIgfSkKICAgIHR4biBTZW5kZXIKICAgIHN3YXAKICAgIHVuY292ZXIgNQogICAgY29uY2F0CiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHhiMzUxZDg1NyAvLyBtZXRob2QgIlByb3Bvc2FsQ3JlYXRlZCh1aW50NjQsdWludDY0LHVpbnQ2NCxhZGRyZXNzKSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjkxCiAgICAvLyB0aGlzLl9yZWNvcmRBcHByb3ZhbChwaWQsIHN0b3JlZCkKICAgIGRpZyAxCiAgICBzd2FwCiAgICBjYWxsc3ViIF9yZWNvcmRBcHByb3ZhbAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NjkyCiAgICAvLyByZXR1cm4gcGlkCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OkFsZ29TYWZlLl9yZWNvcmRBcHByb3ZhbChwcm9wb3NhbElkOiB1aW50NjQsIHByb3Bvc2FsOiBieXRlcykgLT4gYnl0ZXM6Cl9yZWNvcmRBcHByb3ZhbDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2OTYKICAgIC8vIHByaXZhdGUgX3JlY29yZEFwcHJvdmFsKHByb3Bvc2FsSWQ6IHVpbnQ2NCwgcHJvcG9zYWw6IFByb3Bvc2FsKTogdm9pZCB7CiAgICBwcm90byAyIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo2OTcKICAgIC8vIGNvbnN0IHJlY29yZDogQXBwcm92YWwgPSB7IHNpZ25lcjogVHhuLnNlbmRlciwgcm91bmQ6IEdsb2JhbC5yb3VuZCB9CiAgICB0eG4gU2VuZGVyCiAgICBnbG9iYWwgUm91bmQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjY5OAogICAgLy8gdGhpcy5hcHByb3ZhbHMoeyBwcm9wb3NhbElkLCBhY2NvdW50OiBUeG4uc2VuZGVyIH0pLnZhbHVlID0gY2xvbmUocmVjb3JkKQogICAgdHhuIFNlbmRlcgogICAgZnJhbWVfZGlnIC0yCiAgICBpdG9iCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjI3NwogICAgLy8gYXBwcm92YWxzID0gQm94TWFwPHsgcHJvcG9zYWxJZDogdWludDY0OyBhY2NvdW50OiBBY2NvdW50IH0sIEFwcHJvdmFsPih7IGtleVByZWZpeDogJ2EnIH0pCiAgICBieXRlYyAxNSAvLyAiYSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjY5OAogICAgLy8gdGhpcy5hcHByb3ZhbHMoeyBwcm9wb3NhbElkLCBhY2NvdW50OiBUeG4uc2VuZGVyIH0pLnZhbHVlID0gY2xvbmUocmVjb3JkKQogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjcwMQogICAgLy8gdXBkYXRlZC5hcHByb3ZhbHNDb3VudCA9IHVwZGF0ZWQuYXBwcm92YWxzQ291bnQgKyBVaW50NjQoMSkKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCAyNCAvLyAyNAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpdG9iCiAgICBmcmFtZV9kaWcgLTEKICAgIHN3YXAKICAgIHJlcGxhY2UyIDI0CiAgICBkdXBuIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3MDIKICAgIC8vIGlmICh1cGRhdGVkLmFwcHJvdmFsc0NvdW50ID49IHVwZGF0ZWQudGhyZXNob2xkKSB7CiAgICBwdXNoaW50IDI0IC8vIDI0CiAgICBleHRyYWN0X3VpbnQ2NAogICAgc3dhcAogICAgcHVzaGludCAzMiAvLyAzMgogICAgZXh0cmFjdF91aW50NjQKICAgID49CiAgICBieiBfcmVjb3JkQXBwcm92YWxfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NzAzCiAgICAvLyB1cGRhdGVkLnN0YXR1cyA9IFNUQVRVU19SRUFEWQogICAgaW50Y18zIC8vIDIKICAgIGl0b2IKICAgIHJlcGxhY2UyIDgKCl9yZWNvcmRBcHByb3ZhbF9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6Mjc2CiAgICAvLyBwcm9wb3NhbHMgPSBCb3hNYXA8dWludDY0LCBQcm9wb3NhbD4oeyBrZXlQcmVmaXg6ICdwJyB9KQogICAgYnl0ZWMgNSAvLyAicCIKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjcwNQogICAgLy8gdGhpcy5wcm9wb3NhbHMocHJvcG9zYWxJZCkudmFsdWUgPSBjbG9uZSh1cGRhdGVkKQogICAgdW5jb3ZlciAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3MDkKICAgIC8vIHNpZ25lcjogVHhuLnNlbmRlciwKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo3MTAKICAgIC8vIGFwcHJvdmFsc0NvdW50OiB1cGRhdGVkLmFwcHJvdmFsc0NvdW50LAogICAgc3dhcAogICAgZXh0cmFjdCAyNCA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6NzA3LTcxMQogICAgLy8gZW1pdDxQcm9wb3NhbEFwcHJvdmVkPih7CiAgICAvLyAgIHByb3Bvc2FsSWQsCiAgICAvLyAgIHNpZ25lcjogVHhuLnNlbmRlciwKICAgIC8vICAgYXBwcm92YWxzQ291bnQ6IHVwZGF0ZWQuYXBwcm92YWxzQ291bnQsCiAgICAvLyB9KQogICAgY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDk4YjNhYzk0IC8vIG1ldGhvZCAiUHJvcG9zYWxBcHByb3ZlZCh1aW50NjQsYWRkcmVzcyx1aW50NjQpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjpBbGdvU2FmZS5fYmVnaW5Pck5leHQoZmlyc3Q6IHVpbnQ2NCkgLT4gdm9pZDoKX2JlZ2luT3JOZXh0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjgyMAogICAgLy8gcHJpdmF0ZSBfYmVnaW5Pck5leHQoZmlyc3Q6IGJvb2xlYW4pOiB2b2lkIHsKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjgyMQogICAgLy8gaWYgKGZpcnN0KSBvcC5JVHhuQ3JlYXRlLmJlZ2luKCkKICAgIGZyYW1lX2RpZyAtMQogICAgYnogX2JlZ2luT3JOZXh0X2Vsc2VfYm9keUAyCiAgICBpdHhuX2JlZ2luCiAgICByZXRzdWIKCl9iZWdpbk9yTmV4dF9lbHNlX2JvZHlAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo4MjIKICAgIC8vIGVsc2Ugb3AuSVR4bkNyZWF0ZS5uZXh0KCkKICAgIGl0eG5fbmV4dAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjpBbGdvU2FmZS5fc3RvcmVQYXlsb2FkR3JvdXAocHJvcG9zYWxJZDogdWludDY0LCBwYXlsb2FkSW5kZXg6IHVpbnQ2NCwgcGF5bG9hZDogYnl0ZXMpIC0+IGJ5dGVzOgpfc3RvcmVQYXlsb2FkR3JvdXA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTU3CiAgICAvLyBwcml2YXRlIF9zdG9yZVBheWxvYWRHcm91cChwcm9wb3NhbElkOiB1aW50NjQsIHBheWxvYWRJbmRleDogdWludDY0LCBwYXlsb2FkOiBTYWZlVHhuR3JvdXApOiB2b2lkIHsKICAgIHByb3RvIDMgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjk1OAogICAgLy8gaWYgKHBheWxvYWQubGVuZ3RoID4gVWludDY0KDApKSB7CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBieiBfc3RvcmVQYXlsb2FkR3JvdXBfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTU5CiAgICAvLyB0aGlzLnRyYW5zYWN0aW9uR3JvdXBzKHByb3Bvc2FsSWQgKiBUWEdfS0VZX01VTFQgKyBwYXlsb2FkSW5kZXgpLnZhbHVlID0gY2xvbmUocGF5bG9hZCkKICAgIGZyYW1lX2RpZyAtMwogICAgcHVzaGludCA3IC8vIDcKICAgICoKICAgIGZyYW1lX2RpZyAtMgogICAgKwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjI3OQogICAgLy8gdHJhbnNhY3Rpb25Hcm91cHMgPSBCb3hNYXA8dWludDY0LCBTYWZlVHhuR3JvdXA+KHsga2V5UHJlZml4OiAndHhnJyB9KQogICAgYnl0ZWMgOCAvLyAidHhnIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTU5CiAgICAvLyB0aGlzLnRyYW5zYWN0aW9uR3JvdXBzKHByb3Bvc2FsSWQgKiBUWEdfS0VZX01VTFQgKyBwYXlsb2FkSW5kZXgpLnZhbHVlID0gY2xvbmUocGF5bG9hZCkKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9wdXQKCl9zdG9yZVBheWxvYWRHcm91cF9hZnRlcl9pZl9lbHNlQDI6CiAgICBmcmFtZV9kaWcgLTEKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo6QWxnb1NhZmUuX2FjY291bnRTcGVuZChncm91cEluOiBieXRlcywgYW1vdW50OiB1aW50NjQpIC0+IGJ5dGVzLCBieXRlczoKX2FjY291bnRTcGVuZDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo5NzAKICAgIC8vIHByaXZhdGUgX2FjY291bnRTcGVuZChncm91cEluOiBTaWduZXJHcm91cCwgYW1vdW50OiB1aW50NjQpOiBTaWduZXJHcm91cCB7CiAgICBwcm90byAyIDIKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTczCiAgICAvLyBpZiAoYW1vdW50ID09PSBVaW50NjQoMCkpIHsKICAgIGZyYW1lX2RpZyAtMQogICAgYm56IF9hY2NvdW50U3BlbmRfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTc0CiAgICAvLyByZXR1cm4gZ3JvdXAKICAgIGZyYW1lX2RpZyAtMgogICAgZHVwCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMwogICAgcmV0c3ViCgpfYWNjb3VudFNwZW5kX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo5NzcKICAgIC8vIGNvbnN0IG5vdyA9IEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjk3OQogICAgLy8gaWYgKGdyb3VwLmRhaWx5TGltaXQgIT09IFVpbnQ2NCgwKSkgewogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDQyIC8vIDQyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYm56IF9hY2NvdW50U3BlbmRfaWZfYm9keUAzCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2J1cnkgMAoKX2FjY291bnRTcGVuZF9hZnRlcl9pZl9lbHNlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTg4CiAgICAvLyBpZiAoZ3JvdXAubW9udGhseUxpbWl0ICE9PSBVaW50NjQoMCkpIHsKICAgIGZyYW1lX2RpZyAwCiAgICBwdXNoaW50IDY2IC8vIDY2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnogX2FjY291bnRTcGVuZF9hZnRlcl9pZl9lbHNlQDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTg5CiAgICAvLyBpZiAobm93IC0gZ3JvdXAubW9udGhseVBlcmlvZFN0YXJ0ID49IE1PTlRIX1NFQ09ORFMpIHsKICAgIGZyYW1lX2RpZyAwCiAgICBwdXNoaW50IDgyIC8vIDgyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZnJhbWVfZGlnIDEKICAgIHN3YXAKICAgIC0KICAgIHB1c2hpbnQgMjU5MjAwMCAvLyAyNTkyMDAwCiAgICA+PQogICAgYnogX2FjY291bnRTcGVuZF9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo5OTAKICAgIC8vIGdyb3VwLm1vbnRobHlVc2FnZSA9IFVpbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGl0b2IKICAgIGZyYW1lX2RpZyAwCiAgICBzd2FwCiAgICByZXBsYWNlMiA3NAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjk5MQogICAgLy8gZ3JvdXAubW9udGhseVBlcmlvZFN0YXJ0ID0gbm93CiAgICBmcmFtZV9kaWcgMQogICAgaXRvYgogICAgcmVwbGFjZTIgODIKICAgIGZyYW1lX2J1cnkgMAoKX2FjY291bnRTcGVuZF9hZnRlcl9pZl9lbHNlQDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTkzCiAgICAvLyBhc3NlcnQoZ3JvdXAubW9udGhseVVzYWdlICsgYW1vdW50IDw9IGdyb3VwLm1vbnRobHlMaW1pdCwgJ21vbnRobHkgbGltaXQgZXhjZWVkZWQnKQogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgcHVzaGludCA3NCAvLyA3NAogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2RpZyAtMQogICAgKwogICAgZGlnIDEKICAgIHB1c2hpbnQgNjYgLy8gNjYKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMQogICAgPj0KICAgIGFzc2VydCAvLyBtb250aGx5IGxpbWl0IGV4Y2VlZGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTk0CiAgICAvLyBncm91cC5tb250aGx5VXNhZ2UgPSBncm91cC5tb250aGx5VXNhZ2UgKyBhbW91bnQKICAgIGl0b2IKICAgIHJlcGxhY2UyIDc0CiAgICBmcmFtZV9idXJ5IDAKCl9hY2NvdW50U3BlbmRfYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo5OTcKICAgIC8vIHJldHVybiBncm91cAogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2RpZyAtMgogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDMKICAgIHJldHN1YgoKX2FjY291bnRTcGVuZF9pZl9ib2R5QDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTgwCiAgICAvLyBpZiAobm93IC0gZ3JvdXAuZGFpbHlQZXJpb2RTdGFydCA+PSBEQVlfU0VDT05EUykgewogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDU4IC8vIDU4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZnJhbWVfZGlnIDEKICAgIHN3YXAKICAgIC0KICAgIHB1c2hpbnQgODY0MDAgLy8gODY0MDAKICAgID49CiAgICBibnogX2FjY291bnRTcGVuZF9pZl9ib2R5QDQKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfYnVyeSAwCgpfYWNjb3VudFNwZW5kX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo5ODQKICAgIC8vIGFzc2VydChncm91cC5kYWlseVVzYWdlICsgYW1vdW50IDw9IGdyb3VwLmRhaWx5TGltaXQsICdkYWlseSBsaW1pdCBleGNlZWRlZCcpCiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBwdXNoaW50IDUwIC8vIDUwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZnJhbWVfZGlnIC0xCiAgICArCiAgICBkaWcgMQogICAgcHVzaGludCA0MiAvLyA0MgogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAxCiAgICA+PQogICAgYXNzZXJ0IC8vIGRhaWx5IGxpbWl0IGV4Y2VlZGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTg1CiAgICAvLyBncm91cC5kYWlseVVzYWdlID0gZ3JvdXAuZGFpbHlVc2FnZSArIGFtb3VudAogICAgaXRvYgogICAgcmVwbGFjZTIgNTAKICAgIGZyYW1lX2J1cnkgMAogICAgYiBfYWNjb3VudFNwZW5kX2FmdGVyX2lmX2Vsc2VANgoKX2FjY291bnRTcGVuZF9pZl9ib2R5QDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OTgxCiAgICAvLyBncm91cC5kYWlseVVzYWdlID0gVWludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgaXRvYgogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICByZXBsYWNlMiA1MAogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjk4MgogICAgLy8gZ3JvdXAuZGFpbHlQZXJpb2RTdGFydCA9IG5vdwogICAgZnJhbWVfZGlnIDEKICAgIGl0b2IKICAgIHJlcGxhY2UyIDU4CiAgICBmcmFtZV9idXJ5IDAKICAgIGIgX2FjY291bnRTcGVuZF9hZnRlcl9pZl9lbHNlQDUKCgovLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6OkFsZ29TYWZlLl9hc3NlcnRQcml2aWxlZ2VGb3JDaGFuZ2UoY2hhbmdlVHlwZTogdWludDY0LCBncm91cDogYnl0ZXMpIC0+IGJ5dGVzOgpfYXNzZXJ0UHJpdmlsZWdlRm9yQ2hhbmdlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEwMDQKICAgIC8vIHByaXZhdGUgX2Fzc2VydFByaXZpbGVnZUZvckNoYW5nZShjaGFuZ2VUeXBlOiB1aW50NjQsIGdyb3VwOiBTaWduZXJHcm91cCk6IHZvaWQgewogICAgcHJvdG8gMiAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTAwNQogICAgLy8gaWYgKGNoYW5nZVR5cGUgPT09IEFETV9TRVRfUE9MSUNZKSB7CiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgNSAvLyA1CiAgICA9PQogICAgYnogX2Fzc2VydFByaXZpbGVnZUZvckNoYW5nZV9lbHNlX2JvZHlAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEwMDYKICAgIC8vIGFzc2VydCgoZ3JvdXAuYWRtaW5Qcml2aWxlZ2VzICYgUFJJVl9QT0xJQ1kpICE9PSBVaW50NjQoMCksICdwb2xpY3kgYWRtaW4gcmVxdWlyZWQnKQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDE4IC8vIDE4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18zIC8vIDIKICAgICYKICAgIGFzc2VydCAvLyBwb2xpY3kgYWRtaW4gcmVxdWlyZWQKCl9hc3NlcnRQcml2aWxlZ2VGb3JDaGFuZ2VfYWZ0ZXJfaWZfZWxzZUAzOgogICAgZnJhbWVfZGlnIC0xCiAgICByZXRzdWIKCl9hc3NlcnRQcml2aWxlZ2VGb3JDaGFuZ2VfZWxzZV9ib2R5QDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTAwOAogICAgLy8gYXNzZXJ0KChncm91cC5hZG1pblByaXZpbGVnZXMgJiBQUklWX0dST1VQKSAhPT0gVWludDY0KDApLCAnZ3JvdXAgYWRtaW4gcmVxdWlyZWQnKQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDE4IC8vIDE4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaW50Y18xIC8vIDEKICAgICYKICAgIGFzc2VydCAvLyBncm91cCBhZG1pbiByZXF1aXJlZAogICAgYiBfYXNzZXJ0UHJpdmlsZWdlRm9yQ2hhbmdlX2FmdGVyX2lmX2Vsc2VAMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czo6QWxnb1NhZmUuX3dvdWxkUmVtb3ZlTGFzdEdyb3VwQWRtaW4oY2hhbmdlOiBieXRlcywgZ3JvdXA6IGJ5dGVzKSAtPiB1aW50NjQsIGJ5dGVzLCBieXRlczoKX3dvdWxkUmVtb3ZlTGFzdEdyb3VwQWRtaW46CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTAxOAogICAgLy8gcHJpdmF0ZSBfd291bGRSZW1vdmVMYXN0R3JvdXBBZG1pbihjaGFuZ2U6IEFkbWluQ2hhbmdlLCBncm91cDogU2lnbmVyR3JvdXApOiBib29sZWFuIHsKICAgIHByb3RvIDIgMwogICAgYnl0ZWNfMSAvLyAiIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEwMTkKICAgIC8vIGNvbnN0IGhhc0dyb3VwUHJpdiA9IChncm91cC5hZG1pblByaXZpbGVnZXMgJiBQUklWX0dST1VQKSAhPT0gVWludDY0KDApCiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgMTggLy8gMTgKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzEgLy8gMQogICAgJgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEwMjAKICAgIC8vIGlmICghaGFzR3JvdXBQcml2IHx8IGdyb3VwLmFjdGl2ZSA9PT0gVWludDY0KDApKSB7CiAgICBieiBfd291bGRSZW1vdmVMYXN0R3JvdXBBZG1pbl9pZl9ib2R5QDIKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCAxMTQgLy8gMTE0CiAgICBleHRyYWN0X3VpbnQ2NAogICAgYm56IF93b3VsZFJlbW92ZUxhc3RHcm91cEFkbWluX2FmdGVyX2lmX2Vsc2VAMwoKX3dvdWxkUmVtb3ZlTGFzdEdyb3VwQWRtaW5faWZfYm9keUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEwMjEKICAgIC8vIHJldHVybiBmYWxzZQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICB1bmNvdmVyIDMKICAgIHJldHN1YgoKX3dvdWxkUmVtb3ZlTGFzdEdyb3VwQWRtaW5fYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEwMjMKICAgIC8vIGlmIChjaGFuZ2UuY2hhbmdlVHlwZSA9PT0gQURNX1NFVF9QUklWSUxFR0VTKSB7CiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIHB1c2hpbnQgNiAvLyA2CiAgICA9PQogICAgYnogX3dvdWxkUmVtb3ZlTGFzdEdyb3VwQWRtaW5fYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTAyNAogICAgLy8gY29uc3Qgd2lsbEhhdmVHcm91cFByaXYgPSAoY2hhbmdlLmFkbWluUHJpdmlsZWdlcyAmIFBSSVZfR1JPVVApICE9PSBVaW50NjQoMCkKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGludCA2OCAvLyA2OAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMSAvLyAxCiAgICAmCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTAyNQogICAgLy8gcmV0dXJuICF3aWxsSGF2ZUdyb3VwUHJpdiAmJiB0aGlzLmFjdGl2ZVByaXZHcm91cENvdW50LnZhbHVlIDw9IFVpbnQ2NCgxKQogICAgYm56IF93b3VsZFJlbW92ZUxhc3RHcm91cEFkbWluX2Jvb2xfZmFsc2VANwogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoyNzEKICAgIC8vIGFjdGl2ZVByaXZHcm91cENvdW50ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogJ2FwZ2MnIH0pCiAgICBieXRlY18yIC8vICJhcGdjIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEwMjUKICAgIC8vIHJldHVybiAhd2lsbEhhdmVHcm91cFByaXYgJiYgdGhpcy5hY3RpdmVQcml2R3JvdXBDb3VudC52YWx1ZSA8PSBVaW50NjQoMSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgPD0KICAgIGJ6IF93b3VsZFJlbW92ZUxhc3RHcm91cEFkbWluX2Jvb2xfZmFsc2VANwogICAgaW50Y18xIC8vIDEKCl93b3VsZFJlbW92ZUxhc3RHcm91cEFkbWluX2Jvb2xfbWVyZ2VAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDI1CiAgICAvLyByZXR1cm4gIXdpbGxIYXZlR3JvdXBQcml2ICYmIHRoaXMuYWN0aXZlUHJpdkdyb3VwQ291bnQudmFsdWUgPD0gVWludDY0KDEpCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgdW5jb3ZlciAzCiAgICByZXRzdWIKCl93b3VsZFJlbW92ZUxhc3RHcm91cEFkbWluX2Jvb2xfZmFsc2VANzoKICAgIGludGNfMCAvLyAwCiAgICBiIF93b3VsZFJlbW92ZUxhc3RHcm91cEFkbWluX2Jvb2xfbWVyZ2VAOAoKX3dvdWxkUmVtb3ZlTGFzdEdyb3VwQWRtaW5fYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FsZ29fc2FmZS9jb250cmFjdC5hbGdvLnRzOjEwMjcKICAgIC8vIGlmIChjaGFuZ2UuY2hhbmdlVHlwZSA9PT0gQURNX1NFVF9BQ1RJVkUpIHsKICAgIGZyYW1lX2RpZyAwCiAgICBwdXNoaW50IDcgLy8gNwogICAgPT0KICAgIGJ6IF93b3VsZFJlbW92ZUxhc3RHcm91cEFkbWluX2FmdGVyX2lmX2Vsc2VAMTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDI4CiAgICAvLyBjb25zdCB3aWxsQmVBY3RpdmUgPSBjaGFuZ2UuYWN0aXZlRmxhZyAhPT0gVWludDY0KDApCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMTE2IC8vIDExNgogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDI5CiAgICAvLyByZXR1cm4gIXdpbGxCZUFjdGl2ZSAmJiB0aGlzLmFjdGl2ZVByaXZHcm91cENvdW50LnZhbHVlIDw9IFVpbnQ2NCgxKQogICAgYm56IF93b3VsZFJlbW92ZUxhc3RHcm91cEFkbWluX2Jvb2xfZmFsc2VAMTMKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MjcxCiAgICAvLyBhY3RpdmVQcml2R3JvdXBDb3VudCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6ICdhcGdjJyB9KQogICAgYnl0ZWNfMiAvLyAiYXBnYyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hbGdvX3NhZmUvY29udHJhY3QuYWxnby50czoxMDI5CiAgICAvLyByZXR1cm4gIXdpbGxCZUFjdGl2ZSAmJiB0aGlzLmFjdGl2ZVByaXZHcm91cENvdW50LnZhbHVlIDw9IFVpbnQ2NCgxKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICA8PQogICAgYnogX3dvdWxkUmVtb3ZlTGFzdEdyb3VwQWRtaW5fYm9vbF9mYWxzZUAxMwogICAgaW50Y18xIC8vIDEKCl93b3VsZFJlbW92ZUxhc3RHcm91cEFkbWluX2Jvb2xfbWVyZ2VAMTQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTAyOQogICAgLy8gcmV0dXJuICF3aWxsQmVBY3RpdmUgJiYgdGhpcy5hY3RpdmVQcml2R3JvdXBDb3VudC52YWx1ZSA8PSBVaW50NjQoMSkKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICB1bmNvdmVyIDMKICAgIHJldHN1YgoKX3dvdWxkUmVtb3ZlTGFzdEdyb3VwQWRtaW5fYm9vbF9mYWxzZUAxMzoKICAgIGludGNfMCAvLyAwCiAgICBiIF93b3VsZFJlbW92ZUxhc3RHcm91cEFkbWluX2Jvb2xfbWVyZ2VAMTQKCl93b3VsZFJlbW92ZUxhc3RHcm91cEFkbWluX2FmdGVyX2lmX2Vsc2VAMTU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYWxnb19zYWZlL2NvbnRyYWN0LmFsZ28udHM6MTAzMQogICAgLy8gcmV0dXJuIGZhbHNlCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIHVuY292ZXIgMwogICAgcmV0c3ViCg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" }, "byteCode": { "approval": "CyAGAAEIAqgBgK3iBCYXAWcABGFwZ2MEFR98dQFtAXAEbmdpZARnY250A3R4ZwRucGlkBnBhdXNlZAR8YFnmBGJvb3QE0HBQegJkcAFhAwaBAQRuYW1lB2NyZWF0b3IDdmVyAgASBAzXNXwCACoxGRREMRhBAHiCEASRS6YzBKw6mjIERCRF9wTc7kQnBB92jHkE+3CI6AR/UfwoBNyt/5YEtreurQTRzCu2BKuhJyoE+ctKNwRlqqDtBMvXMkIEUDQWFwT0+lRMNhoAjhAAtwGvAo8DkAUaBagFzAZJBv8HdAefB8sIBgg+CH4IvgCABBFXVts2GgCOAQA8AIoCAIv+gQoIiwAyDA1BACqxgQayEIEFshknELIeJxCyH4v/jQIACwAEs0L/2zIAsgFC//UisgFC/++JNhoBSSJZJQhLARUSRFcCACcRSwFnJxIxAGcnDCJnJwYjZycJI2cnByJnJwoiZycTgBdCSUFURUMtQUxHTy1TQUZFLXYxLjQuMmcqImcxAEsBFRZXBgJPAlCAAgAiTwJQTFCABOKci0dMULAjQzYaAUkiWSUISwEVEkRXAgAxACInEmVEEkQiJwxlRBREMgciJwZlREsCFRZXBgJPA1AjFiIWTwQWgDoAegAAAAAAAAABAAAAAAAAAAEAAAAAAAAABwAAAAAAAAAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASwFQSwJQSwJQTFBLAVBLAVBMUEsBUEsCUEsDFihLAVBJvEhPAr+ACgAAAAAAAAABACoxAFCACQAHY3JlYXRvclBLATEAUCcETFBJvEhMv08DIwgnBkxnIicHZUQjCCcHTGcnDCNnKiNnSScUUEsCUE8DUCcVTFCwMQBQTFAnDUxQsCNDIilHAzYaAUkVJBJEFzYaAkcCIllJTgIlC0xJFUxXAgAiSUsFDEEAMkcCJQtLA0lPAllJSwdJTgQSREsBFVJJFUsBJFlJgQoSRExSIlmBDAgIRQUjCEUBQv/HSwMlCEsDEkQ2GgNJFSQSRBdFCTYaBEkVIxJEIlNFCjYaBUkVJBJEF0lFDCMNQQAGSwoiiP3QSwRJRIEQDkQiJwplRBRESwZJiAaJSRYoTFCBciS6F0QjSwqIEs5JRQlJI0sIiBOkSBZJRQ0nBUxQIxaBUEy7SwlBAAVLB4gGbytLDFCwI0MiSSlJNhoBSRUkEkQXNhoCRwIVJBJEFzYaA0cCIllJTgIlC0xJFUxXAgAiSUsFDEEAMkcCJQtLA0lPAllJSwdJTgQSREsBFVJJFUsBJFlJgQoSRExSIlmBDAgIRQUjCEUBQv/HSwMlCEsDEkQ2GgRJFSQSRBdJRQwjDUEABksKIoj8/UsGJQ9BAHNLBoEGDkEAayNESwRESwgWJwVMUElFDr5MSU4CRQ5ESYEQWyMSRCRbSUULIxJAAAdLCSUSQQA4I0RLC0kiW4gFgzEASwFXMCASREmBGFsjEkRLCUsISU4CSwmIEp1ITIFQWw1BAAdLDIFQSwm7I0MiQv/FIkL/kik2GgFJFSQSRBc2GgJHAhVLAYEQWUmBfBJESwJMSwJSIlmBfghLAoE6WUlLAhJETwNMSwNSIlklCAgSRDYaA0kVJBJEFzYaBEkVJBJEF0kjDUEABUkiiPwmSwNJiATuFihMUEm+REyBciS6F0RLAyJbSUUHSU8CiBLTSCMSQQBBSwJJgTxbRElXEiAyAxNESYFMW4EfDkRJgURbgQcORIFsWyEFDkRLA4EFSwOIEPQWJw5LAVBJvEhLBL8rTFCwI0NLBCUSQQAaSwJJVwgIKExQvUUBRElXEiAyAxNERQNC/8RLBIEDEkEAEEsCSVcICChMUL1FAURC/+NLBIEEEkEAFUsCSVcICChMUL1FAURJgTxbREL/xksEgQUSQQAgSwJJVwgIKExQvUUBREmBTFuBHw5ESYFsWyEFDkRC/55LBIEGEkEAI0sCSVcICChMUEm9RQFESwGBRFuBBw5EvkiIEgtITBREQv9zSwSBBxJESwJJVwgIKExQSb1FAUS+SIgR60hMFERC/1MiSSk2GgFJFSQSRBc2GgJJFSQSRBdJIw1BAAVJIoj61UsBFklFBicFTFC+TElOAkUGRCRbSUUEIxJAAAdLAiUSQQBHI0QyBksESU4CgShbDkQxAEsBVwAISU8CUCcETFC9RQFESwYxAFAnD0xQvUUBFEQoTFCBaiS6F0sBgVhbEkRLAkyIEAlII0MiQv+2NhoBSRUkEkQXNhoCSRUkEkQXSSMNQQAFSSKI+kpLAYgDLSNDIkcCKTYaAUkVJBJEFzYaAkkVJBJEF0kjDUEABUkiiPoiSwEWSUUGJwVMUElFB75MSU4CRQZEJFtJRQQjEkAAB0sCJRJBADIjRDEASwRJTgJXMCASTFcACDEAUCcETFC9RQERRIEEFksGJE8Cu4AEriq8BksFULAjQyJC/8siRwQpSTYaAUkVJBJEFzYaAkkVJBJEF0kjDUEABUkiiPmkSwEWSUUHJwVMUElFCr5MSU4CRQdEJFtJRQSBAxJAAAhLAoEEEkEAaCNEMgZLBUlOAoEoWw1ESSJbiAI2gRBbIxJBADcjRQRLBIFQW0sED0EAI0sBgQcLSwQIFicITFBJRQm9RQFBAARLB7xISwMjCEUEQv/SSwi8SCNDJw5LBlBJRQi9RQFB/+xLBrxIQv/lIkL/lTYaAUkVJBJEF0kjDUEABUkiiPj8IicRZUQiJwdlRCInBmVEIicJZUQiJwplRCInE2VESwUVFlcGAk8GUEkVgSQITwYWgAIAJExQTwYWUE8FFlBPBBZQSwMVFlcGAk8EUE8CFlcGAk8CTFBPAlBMUCtMULAjQzYaAUkVJBJEFzYaAkkVJBJEF0kjDUEABUkiiPh+SwEWKExQvkQrTFCwI0M2GgFJFSQSRBc2GgJJFSQSRBdJIw1BAAVJIoj4U0sBFicFTFC+RCtMULAjQzYaAUkVJBJEFzYaAkkVJBJEFzYaA0kVJBJEF0kjDUEABUkiiPgeSwKBBwtLAggWJwhMUL5EK0xQsCNDNhoBSRUkEkQXNhoCSRWBIBJENhoDSRUkEkQXSSMNQQAFSSKI9+NLAhZLAlAnBExQvkQrTFCwI0M2GgFJFSQSRBc2GgJJFYEgEkQ2GgNJFSQSRBdJIw1BAAVJIoj3q0sCFksCUCcETFC9RQGAAQAiTwJUK0xQsCNDNhoBSRUkEkQXNhoCSRWBIBJENhoDSRUkEkQXSSMNQQAFSSKI92tLAhZLAlAnD0xQvUUBgAEAIk8CVCtMULAjQzYaAUkVJBJEF0kjDUEABUkiiPc9IiplRBYrTFCwI0OKAQCL/xYoSwFQvUUBRDEAUCcETFC9RQFEiYoBACJHJSlHJiInCmVEFESL/xZJJwVMUEm+TElPAkRJJFslEkQyBksBgShbDkRJVwAIKExQSU4CSb5MTgNESYFyJLoXREyBIFtJTwIlJLoXSU4CD0EL4ItSi09JgRhbTwIPRItQgWokuhdLAYFYWxJEgRBbIxJBB8aLUIFaJLoXSYxDQQAWi1CBYiS6F0mMREEACTIGi0SLQwgPRItPgVBbjDcjjDiLUUmMF4wYiziLNw5BAwqL/4EHC4s4CBYnCExQSYwQvUUBQAARixeMGYs4IwiMOIsZjBdC/9GLEL5MjBxEIowwixeMGYsQIiW6F4swDUH/2SWLMAslCIsQSU8CJboXJQgkuhdJjEIjEkEAi4scSVcCAEwiWYswSSULSwNMWUwjCE8CSwEJSwMVTwIlC0sETFlPAk1SSSRZSwEVUkmMA4sYgRpbIxpESVcCIDIDE0SBKltJjEZBAAmLA1cyIDIDE0QijC2LUYEiW0AACotGQQAcMgpgjC2LUYstiAu6SIxRixiMGYswIwiMMEL/WIsDgSJbjC1C/9+LQiUSQQCgixxJVwIATCJZizBJJQtLA0xZTCMITwJLAQlLAxVPAiULSwRMWU8CTVJJJFlLARVSSYwKixiBGlslGkRJVwogMgMTRIEyW0mMRkEACYsKVzogMgMTRItRgSJbSYxLQQA8iwolW4tLEkEAMiMijC5BABCLRkEAHDIKiwolW3AASIwui1GLLogLEUiMUYsYjBlC/1SLCoEqW4wuQv/lIkL/y4tCgQMSQQD2ixxJVwIATCJZizBJJQtLA0xZTCMITwJLAQlLAxVPAiULSwRMWU8CTVJJJFlLARVSSVcCAIsYgRpbgQQaREsBJVtETIEKW0mBBQ5EgQQTREmBEFlLAYESWUsCTwJLAlJJjA0iWUlOA4w2SwGBFFlLAk8CSwJSIllLAoEWWUsDTwNLAlIiWUsDgRhZTwRPA08CUiJZTwOBEA5ESwKBBA5ESwEkDkRJJA5ETgIICCQORCKMQCKMMYsxizYMSYw8QQAoiw1XAgCLPESLMUlOAiULSwFMWUpZJQhYVwIAFYtACIxAIwiMMUL/zYtAgYAQDkSLGIwZQv5Ii0KBBBJBAAuLGIEaWyQaREL+NYtCgQUSRIscSVcCAEwiWYswSSULSwNMWUwjCE8CSwEJSwMVTwIlC0sETFlPAk1SSSRZSwEVUlcCAIsYgRpbgRAaREmBJllLASEEWVJXAgAVSYw9QQAIiz2BIBJBAAkjRIsYjBlC/c4iQv/0MgYWi1FMXGKLUEm8SEy/IoxBI4w5izmLNw5BBE6L/4EHC4s5CBYnCExQSYwTvUUBQQQvixO+TIwdRCKMMosTIiW6F4syDUEEGYtBFIwvJYsyCyUIixNJTwIluhclCCS6F0mMRyMSQQCFix1JVwIATCJZizJJJQtLA0xZTCMITwJLAQlLAxVPAiULSwRMWU8CTVJJJFlLARVSSYwESVcCAIweiy+ICKojshAisgFJVwIgsgdJgSJbsgiBKltBAAeLBFcyILIJix5JgVBZSwEVUlcCAEmMIikTQQAEiyKyBYtBIwiMQYsyIwiMMkL/T4tHJRJBAH+LHUlXAgBMIlmLMkklC0sDTFlMIwhPAksBCUsDFU8CJQtLBExZTwJNUkkkWUsBFVJJjAVJVwIAjB6LL4gIHoEEshAisgFJJVuyEUlXCiCyFEmBKluyEoEyW0EAB4sFVzogshWLHkmBWFlLARVSVwIASYwjKRNB/3KLI7IFQv9ri0eBAxJBAUCLHUlXAgBMIlmLMkklC0sDTFlMIwhPAksBCUsDFU8CJQtLBExZTwJNUkkkWUsBFVJJVwIASU4CjB6LL4gHl4EGshAisgFJJVuyGIEKW7IZSYEYWUlOAowmSRVMTgJSVwIASYwhKRNBAASLIbIFIowwix5JgRBZSwGBEllJjCdSSYwGIlmLMA1JjD5BACSLBlcCAIs+RIswSU4CJQtLAUxZSlklCFhXAgCyGiMIjDBC/78ijDOLHkmBFFlJjCiLJ0xSSYwHIlmLMw1BABmLB1cCAIszSU4CgSALgSBYshwjCIwzQv/PIow0ix5JgRZZSYwpiyZSSYwIIlmLNA1BABaLCFcCAIs0SU4CJAtbsjAjCIw0Qv/TIow1ix6LKIspUkmMCSJZizUNQf45iwlXAgCLNUlOAiQLW7IyIwiMNUL/2ItHgQQSQQCPix1JVwIATCJZizJJJQtLA0xZTCMITwJLAQlLAxVPAiULSwRMWU8CTVJJJFlLARVSSYwLSVcCAIweiy+IBk8lshAisgElW0H90oseSSRZSwGBCllLAk8CSwJSVwIAsgpLAYEMWUsCTwJLAlJXAgCyC0sBFVJXAgCyP4sLSYEQW7IMSYEYW7INgSBbsg5C/YyLHUlXAgBMIlmLMkklC0sDTFlMIwhPAksBCUsDFU8CJQtLBExZTwJNUkkkWUsBFVJJjAxJVwIAjB6LL4gFwIEDshAisgElW0mMQkAAu4sMSYEKW7IiSYESW7IjgRpbIhOyJIseSYEgWUsBgSJZSYwqUlcCAEmMIikTQQAEiyKyJYseSYEkWUmMK4sqTFJXAgBJjCQpE0EABIsksiaLHkmBJllJjCyLK0xSVwIASYwlKRNBAASLJbInix5JIQRZiyxMUlcCAEmMHxWBIBJBAASLH7IoiwxJVyogsilJV0ogsipJV2ogsitXiiCyLIseSSEEWUsBFVJXAgBJjCApE0H8i4sgsgVC/ISLQrIhQv/EizkjCIw5Qvuqs4EDFotOJE8Cu4AENcZ+/YtNULCJJw6LTVBJjBFJvkyMFEQiJLoXSYxFSYtRiAWMSCMSQQE6MgciJwZlRIsRSYE8JLoXSSMORIsUSYEQWUsBgTpZSwJPAksCUlcCAEsEgUQkuhdLBYFMJLoXSwaBVCS6F0sHgVwkuhdLCIFkJLoXSwmBbCS6F0sGFRZXBgJPB1BJTgiMAE8JFkmMDoACAHpMUCMWTEsBUEsHFlBPBhZQTwUWUE8EFlAiFkxLAVBPCxZMSwFQTwUWUEsCUExQTwMWUEsBUExQTFBPA1BLBRZJjBUoSwFQSbxITwK/SwSBMiS6F0sEFU8FTwVPAlJXAgBPBIMCEiC6TwIWSU4CjA9LAhUWVwYCTwNQTwInFlBLAlBMUE4CUEmMAicETFBJvEhMv0wjCCcGTGciJwdlRCMIJwdMZyMaQQAJIiplRCMIKkxnixUnFFCLDlCLAFAnFUxQsIsCiw9QJw1MULBC/pGLRSUSQQBrixFJJEm6F0sBgwISILpMFklLAlAnBEsBUEm9RQEURE8EgTIkuheLFEmBOllLARVSVwIATBZLARUWVwYCTwJQSwEnFlBPBlBMUEsCvEhPAky/KE8DUEmBCiS6FyMIFoEKTLtQJw1MULBC/h+LRYEDEkEAWIsRSSRJuhdMgwISILpMFklPAlAnBEsBUEm9RQFEKE8DUEm+REsBgQokuhcjCUsCJSS6F0sBDkRPA7xIFlwKSYFqWyMIFlxqSwG8SL+ABCsUwsFMULBC/b+LRYEEEkEAKIsRSSRJuhcWKEsBUE8CgTwkukkXSwKBCiS6Fw5EJUy7JwtMULBC/Y+LRYEFEkEAeYsRSSRJuhcWSYwWKExQSYwSSb5ETIEiJLoXSwKBVCS6SRdPAhNLA4FMJLpPA0xcGk8CXCJLAoFcJLpcKksCgWQkulxCTwKBbCS6XFpMQQAZMgciFk8CSwFcMk8CFkxLAVw6TwJcSkxcUosSSbxITL8nC4sWULBC/Q6LRYEGEkEAiYsRJEm6FxYoTFC+RIsUTIgC0ElOA4waSU4DjBQUREmBElsjGow6SwFXRAiMAUyBRFsjGow7gXJbSYxIQQAwizpBACuLO0AAJiIqZUQjCSpMZ4saiwFcEosUVwgIKEsBUEm8SE8CvycLTFCwQvyYi0hB/96LOkD/2Ys7Qf/UIiplRCMIKkxnQv/IixEkSboXFihMUL5EixRMiAJHSU4DjBtJTgOMFBRESYESWyMaSU4CjD+BcluMSUyBdFtJjEoiE4xMQQAyi0lBAC2LSkAAKCIqZUQjCSpMZ4tMFosbTFxyixRXCAgoSwFQSbxITwK/JwtMULBC/A+LP0H/3ItJQP/Xi0pB/9IiKmVEIwgqTGdC/8aLU0L0HYoDAYv/MgYNRIv9FihLAVAiJwllREsBJSS6FzEATwOBaiS6FyMWSwVMUIv+FkxLAVAiFkxLAVBPBRZQi/8WUE8EUExQTwIWUEsCFicFSwFQSwK/SwMjCCcJTGcxAExPBVBPA1BMUIAEs1HYV0xQsEsBTIgAAkiJigIBMQAyBhZQMQCL/hZJTgNMUCcPTFBMv4v/gRhbIwgWi/9MXBhHAoEYW0yBIFsPQQAEJRZcCCcFiwBJTgJQTwJJTgK/MQBMVxgITgJQTFCABJizrJRMULCL/0yJigEAi/9BAAKxibaJigMBi/8iWUEAE4v9gQcLi/4IFicITFBJvEiL/7+L/4mKAgIiKYv/QAAIi/5JTwNPA4kyB4wBi/6BKltAAEyL/owAiwCBQltBADeLAIFSW4sBTAmBgJqeAQ9BAA4iFosATFxKiwEWXFKMAIsASYFKW4v/CEsBgUJbSwEPRBZcSowAiwCL/k8DTwOJi/6BOluLAUwJgYCjBQ9AAB6L/owAiwBJgTJbi/8ISwGBKltLAQ9EFlwyjABC/4kiFov+TFwyiwEWXDqMAEL/1YoCAYv+gQUSQQALi/+BElslGkSL/4mL/4ESWyMaREL/8ooCAymL/4ESWyMaQQAIi/+BcltAAAgii/6L/08DiYv+IltJjACBBhJBAB+L/oFEWyMaQAARIiplRCMOQQAII4v+i/9PA4kiQv/1iwCBBxJBAB2L/oF0W0AAESIqZUQjDkEACCOL/ov/TwOJIkL/9SKL/ov/TwOJ", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, "minor": 3, "patch": 2 } }, "events": [ { "name": "SafeCreated", "args": [ { "type": "string", "name": "name" }, { "type": "address", "name": "creator" } ] }, { "name": "GroupCreated", "args": [ { "type": "uint64", "name": "groupId" }, { "type": "string", "name": "name" }, { "type": "uint64", "name": "threshold" } ] }, { "name": "MemberAdded", "args": [ { "type": "uint64", "name": "groupId" }, { "type": "address", "name": "member" }, { "type": "uint64", "name": "accountType" } ] }, { "name": "ProposalCreated", "args": [ { "type": "uint64", "name": "proposalId" }, { "type": "uint64", "name": "groupId" }, { "type": "uint64", "name": "payloadType" }, { "type": "address", "name": "proposer" } ] }, { "name": "ProposalApproved", "args": [ { "type": "uint64", "name": "proposalId" }, { "type": "address", "name": "signer" }, { "type": "uint64", "name": "approvalsCount" } ] }, { "name": "MemberRemoved", "args": [ { "type": "uint64", "name": "groupId" }, { "type": "address", "name": "member" } ] }, { "name": "GroupUpdated", "args": [ { "type": "uint64", "name": "groupId" } ] }, { "name": "ProposalExecuted", "args": [ { "type": "uint64", "name": "proposalId" } ] }, { "name": "ProposalCancelled", "args": [ { "type": "uint64", "name": "proposalId" } ] } ], "templateVariables": {} }