{ "name": "GGovRegistry", "structs": { "SuperboxMeta": [ { "name": "boxByteLengths", "type": "uint16[]" }, { "name": "totalByteLength", "type": "uint64" }, { "name": "maxBoxSize", "type": "uint64" }, { "name": "valueSize", "type": "uint64" }, { "name": "valueSchema", "type": "string" } ], "CommitteeMetadata": [ { "name": "numericId", "type": "uint16" }, { "name": "periodStart", "type": "uint32" }, { "name": "periodEnd", "type": "uint32" }, { "name": "totalMembers", "type": "uint32" }, { "name": "totalVotes", "type": "uint32" }, { "name": "xGovRegistryId", "type": "uint64" }, { "name": "ingestedVotes", "type": "uint32" } ], "GGovAccount": [ { "name": "accountId", "type": "uint32" }, { "name": "committeeOffsets", "type": "(uint16,uint16)[]" } ], "GGovPeriodSummary": [ { "name": "appId", "type": "uint64" }, { "name": "votingStart", "type": "uint32" }, { "name": "votingEnd", "type": "uint32" }, { "name": "numTopics", "type": "uint32" }, { "name": "ready", "type": "bool" } ] }, "methods": [ { "name": "registerCommittee", "args": [ { "type": "byte[32]", "name": "committeeId", "desc": "Committee ID" }, { "type": "uint32", "name": "periodStart", "desc": "Period start" }, { "type": "uint32", "name": "periodEnd", "desc": "Period end" }, { "type": "uint32", "name": "totalMembers", "desc": "Total xGovs" }, { "type": "uint32", "name": "totalVotes", "desc": "Total votes in committee" }, { "type": "uint64", "name": "xGovRegistryId" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Register a committee", "events": [], "recommendations": {} }, { "name": "unregisterCommittee", "args": [ { "type": "byte[32]", "name": "committeeId", "desc": "committee ID" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Delete committee. Must not have any xGovs", "events": [], "recommendations": {} }, { "name": "ingestXGovs", "args": [ { "type": "byte[32]", "name": "committeeId", "desc": "committee ID" }, { "type": "(address,uint32)[]", "name": "xGovs", "desc": "xGovs to ingest, strictly ascending order by account ID" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Ingest xGovs into a committee", "events": [], "recommendations": {} }, { "name": "uningestXGovs", "args": [ { "type": "byte[32]", "name": "committeeId", "desc": "committee ID" }, { "type": "address[]", "name": "xGovs", "desc": "xGovs to uningest, strictly descending order by account ID" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Uningest last N xGovs from committee", "events": [], "recommendations": {} }, { "name": "setXGovRegistryApp", "args": [ { "type": "uint64", "name": "appId", "desc": "xGov Registry Application ID" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Set the xGov Registry Application ID", "events": [], "recommendations": {} }, { "name": "setAdmin", "args": [ { "type": "address", "name": "newAdmin" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Transfer admin to `newAdmin`. Admin only; zero address rejected.", "events": [], "recommendations": {} }, { "name": "withdrawALGO", "args": [ { "type": "address", "name": "receiver", "desc": "Destination account" }, { "type": "uint64", "name": "amount", "desc": "microALGO to withdraw" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Withdraw ALGO from the registry app account to `receiver`. Admin only.\nThe AVM rejects the inner payment if it would drop the app account below its min\nbalance, so over-withdrawal fails atomically (no explicit balance check needed).", "events": [], "recommendations": {} }, { "name": "verifyAdmin", "args": [ { "type": "address", "name": "account" } ], "returns": { "type": "bool" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Whether `account` is the admin. Called by period contracts via inner txn.", "events": [], "recommendations": {} }, { "name": "setOperator", "args": [ { "type": "address", "name": "account" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Set the `operator` account.", "events": [], "recommendations": {} }, { "name": "verifyOperator", "args": [ { "type": "address", "name": "account" } ], "returns": { "type": "bool" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Whether `account` is the registered operator. Called by period contracts via inner txn.", "events": [], "recommendations": {} }, { "name": "set_voting_account", "args": [ { "type": "address", "name": "xgovAddress" }, { "type": "address", "name": "votingAddress" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "xGov-registry-compatible delegation entrypoint. The ABI selector equals the xGov registry's\n`set_voting_account(address,address)void`, so callers/tooling built for the xGov registry work\nunchanged against gGov. Maps xGov's (xgov_address, voting_address) onto gGov's (delegator,\ndelegatee):\n - `votingAddress === xgovAddress` is xGov's \"vote for self\" (no external delegation) and clears\n any existing gGov delegation.\n - otherwise records the delegation `xgovAddress \u2192 votingAddress`.\nAuthorization matches xGov: the xgov_address itself OR its current delegatee may set it.", "events": [ { "name": "GGovDelegationCleared", "args": [ { "type": "address", "name": "delegator" }, { "type": "address", "name": "previousDelegatee" } ] }, { "name": "GGovDelegationSet", "args": [ { "type": "address", "name": "delegator" }, { "type": "address", "name": "previousDelegatee" }, { "type": "address", "name": "delegatee" } ] } ], "recommendations": {} }, { "name": "mirrorXGovDelegation", "args": [ { "type": "address", "name": "account" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Mirror delegation from the xGov registry's box (if present). Admin only.", "events": [ { "name": "GGovDelegationSet", "args": [ { "type": "address", "name": "delegator" }, { "type": "address", "name": "previousDelegatee" }, { "type": "address", "name": "delegatee" } ] } ], "recommendations": {} }, { "name": "getDelegation", "args": [ { "type": "address", "name": "account" } ], "returns": { "type": "(address,bool)" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Get delegation: [delegatee, exists].", "events": [], "recommendations": {} }, { "name": "getDelegate", "args": [ { "type": "address", "name": "account" } ], "returns": { "type": "address" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Resolve the delegatee address (or zero address if none). Called by period contracts.", "events": [], "recommendations": {} }, { "name": "logDelegators", "args": [ { "type": "address", "name": "delegatee" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Log the addresses that have delegated to `delegatee` (reverse lookup), one per log line.", "events": [], "recommendations": {} }, { "name": "logDelegations", "args": [ { "type": "address[]", "name": "accounts" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Batch log delegations.", "events": [], "recommendations": {} }, { "name": "uploadPeriodApprovalPartial", "args": [ { "type": "uint64", "name": "startOffset" }, { "type": "byte[]", "name": "data" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Upload (or re-upload) a chunk of the GGovPeriod approval bytecode into a registry box.\nAdmin only. `startOffset === 0` deletes the existing box and creates a fresh one at\nthe chunk length; subsequent chunks resize/replace.", "events": [], "recommendations": {} }, { "name": "createPeriod", "args": [ { "type": "byte[32]", "name": "committeeId", "desc": "Committee ID" }, { "type": "uint64", "name": "votingStart", "desc": "Period start timestamp" }, { "type": "uint64", "name": "votingEnd", "desc": "Period end timestamp" }, { "type": "pay", "name": "mbrPayment", "desc": "Payment txn covering the new period app's MBR. Receiver must be this registry's address." } ], "returns": { "type": "(uint32,uint64)", "desc": "[periodId, appId]" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Spawn a fresh ggov-period app for a certain `committeeId`.", "events": [], "recommendations": {} }, { "name": "setLastPeriodId", "args": [ { "type": "uint64", "name": "newLastPeriodId" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Set the period-id counter to `newLastPeriodId`; the next createPeriod issues\n`newLastPeriodId + 1`. Admin only.\n\nPrimary use: continue numbering contiguously after a legacy system \u2014 set to 15 on a fresh\nregistry so new periods start at 16. Can also rewind the counter downward.\n\nSafety: a downward move re-issues the ids in (`newLastPeriodId`, `lastPeriodId`]; refuse if any\nof those still has a live period box, so an existing period can never be overwritten or\norphaned. Periods are only ever created up to the current `lastPeriodId`, so ids above it\ncannot exist \u2014 a forward move therefore reads no boxes.", "events": [], "recommendations": {} }, { "name": "updatePeriodSummary", "args": [ { "type": "uint32", "name": "periodId" }, { "type": "uint32", "name": "votingStart" }, { "type": "uint32", "name": "votingEnd" }, { "type": "uint32", "name": "numTopics" }, { "type": "bool", "name": "ready" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Update period summary. Called as an inner txn from the period app registered for `periodId`\n(the only path that can mutate the summary). Trust boundary: caller-app ID must match\nthe registered appId for that periodId.", "events": [], "recommendations": {} }, { "name": "removePeriodSummary", "args": [ { "type": "uint32", "name": "periodId" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Remove a period's summary box. Called as an inner txn from the period app registered for\n`periodId` while it deletes itself, so deleted periods drop out of `getAllPeriods`/\n`getAllPeriodSummaries` (which filter on `appId === 0`). Trust boundary: caller-app ID must match\nthe registered `appId` for that `periodId` \u2014 same as `updatePeriodSummary`. The period contract\ngates this on admin + !ready before calling (see GGovPeriodContract.deleteApplication).", "events": [], "recommendations": {} }, { "name": "getPeriodApp", "args": [ { "type": "uint64", "name": "periodId" } ], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Get the spawned period app ID for `periodId` (0 if unknown).", "events": [], "recommendations": {} }, { "name": "getPeriodSummary", "args": [ { "type": "uint64", "name": "periodId" } ], "returns": { "type": "(uint64,uint32,uint32,uint32,bool)", "struct": "GGovPeriodSummary" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Get the period summary (or empty if `periodId` is unknown).", "events": [], "recommendations": {} }, { "name": "logPeriodSummaries", "args": [ { "type": "uint64[]", "name": "periodIds" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Batch log period summaries in input order.", "events": [], "recommendations": {} }, { "name": "getCommitteeMetadata", "args": [ { "type": "byte[32]", "name": "committeeId", "desc": "Committee ID" }, { "type": "bool", "name": "mustBeComplete", "desc": "Whether committee must be complete (all votes ingested)" } ], "returns": { "type": "(uint16,uint32,uint32,uint32,uint32,uint64,uint32)", "struct": "CommitteeMetadata", "desc": "CommitteeMetadata" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Get committee metadata", "events": [], "recommendations": {} }, { "name": "logCommitteeMetadata", "args": [ { "type": "byte[32][]", "name": "committeeIds", "desc": "" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Log committee metadata for multiple committees", "events": [], "recommendations": {} }, { "name": "logCommitteePages", "args": [ { "type": "byte[32]", "name": "committeeId", "desc": "Committee ID" }, { "type": "bool", "name": "logMetadata", "desc": "Whether to log committee and superbox metadata before the data pages" }, { "type": "uint64", "name": "startDataPage", "desc": "Index of the first data page to log, starting from 0" }, { "type": "uint64", "name": "dataPageLength", "desc": "Number of consecutive data pages to log" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Facilitates fetching committee in \"one shot\" / parallel queries.\nWhen `logMetadata` is true, logs committee metadata and superbox metadata first.\nThen, logs `dataPageLength` consecutive superbox data pages, starting at `startDataPage`.\nIf a requested page does not exist, logs an empty byte string in its place.", "events": [], "recommendations": {} }, { "name": "getCommitteeSuperboxMeta", "args": [ { "type": "byte[32]", "name": "committeeId", "desc": "" } ], "returns": { "type": "(uint16[],uint64,uint64,uint64,string)", "struct": "SuperboxMeta", "desc": "SuperboxMeta" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Get committee superbox metadata", "events": [], "recommendations": {} }, { "name": "getXGovVotingPower", "args": [ { "type": "byte[32]", "name": "committeeId", "desc": "Committee ID" }, { "type": "address", "name": "account", "desc": "xGov account" } ], "returns": { "type": "uint32", "desc": "xGov voting power" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Get xGov voting power", "events": [], "recommendations": {} }, { "name": "tryGetXGovVotingPower", "args": [ { "type": "byte[32]", "name": "committeeId" }, { "type": "address", "name": "account" } ], "returns": { "type": "uint32" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Non-throwing variant of `getXGovVotingPower`. Returns 0 if account/committee unknown\nor the account is not a member of the committee. Used by ggov-period's `canVote`.", "events": [], "recommendations": {} }, { "name": "getAccount", "args": [ { "type": "address", "name": "account", "desc": "account to look up" } ], "returns": { "type": "(uint32,(uint16,uint16)[])", "struct": "GGovAccount", "desc": "account ID or 0 if not found" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Get account ID if exists, else return 0", "events": [], "recommendations": {} }, { "name": "logAccounts", "args": [ { "type": "address[]", "name": "accounts", "desc": "accounts to log" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Log multiple accounts' IDs (or zero if not found)\nUsed to fetch account>ID quickly off-chain", "events": [], "recommendations": {} }, { "name": "increaseBudget", "args": [ { "type": "uint64", "name": "itxns", "desc": "Number of no-op itxns to perform" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Utility to increase opcode budget by performing $itxns no-op itxns", "events": [], "recommendations": {} } ], "arcs": [ 22, 28 ], "networks": {}, "state": { "schema": { "global": { "ints": 44, "bytes": 20 }, "local": { "ints": 0, "bytes": 0 } }, "keys": { "global": { "xGovRegistryApp": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "eEdvdlJlZ2lzdHJ5QXBw", "desc": "xGov registry application ID" }, "lastCommitteeId": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "bGFzdENvbW1pdHRlZUlk", "desc": "Last committee numeric ID; superbox prefix for committees" }, "admin": { "keyType": "AVMString", "valueType": "address", "key": "YWRtaW4=", "desc": "Admin address; defaults to creator. Rotatable via `setAdmin`." }, "operator": { "keyType": "AVMString", "valueType": "address", "key": "b3BlcmF0b3I=", "desc": "Operator address (manages periods on spawned ggov-period apps)" }, "lastPeriodId": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "bGFzdFBlcmlvZElk", "desc": "Auto-increment period IDs" }, "lastAccountId": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "bGFzdEFjY291bnRJZA==", "desc": "Last account numeric ID" } }, "local": {}, "box": { "periodApprovalBox": { "keyType": "AVMString", "valueType": "AVMBytes", "key": "UGFw", "desc": "GGovPeriod approval program bytecode. Chunk-uploaded by admin; read by createPeriod\nwhen spawning a new period app. Lets admins ship period approval-program upgrades\nwithout redeploying the registry. Existing periods are independent apps and are\nunaffected." } } }, "maps": { "global": {}, "local": {}, "box": { "committees": { "keyType": "byte[32]", "valueType": "CommitteeMetadata", "desc": "Committee metadata box map", "prefix": "Yw==" }, "periods": { "keyType": "uint32", "valueType": "GGovPeriodSummary", "desc": "Per-period summary: periodId \u2192 { appId, votingStart, votingEnd, numTopics }", "prefix": "cA==" }, "delegations": { "keyType": "address", "valueType": "address", "desc": "Delegator \u2192 delegatee mapping (gGov voting delegations)", "prefix": "ZA==" }, "reverseDelegations": { "keyType": "address", "valueType": "address[]", "desc": "Reverse delegation index: delegatee \u2192 delegator addresses. Maintained in lockstep with\n`delegations` so the frontend can answer \"who delegated to me?\" with a single box read\nkeyed by the delegatee, instead of scanning every forward delegation.\n\nTODO this is a plain box holding a dynamic `Account[]`, so a single delegatee's list is\nbounded by the 32KB box ceiling (~1023 addresses) and every add/remove rewrites the whole box.\nIf a delegatee can accrue many delegators, consider migrating this to a superbox.", "prefix": "RA==" }, "accounts": { "keyType": "address", "valueType": "GGovAccount", "desc": "gGov accounts box map", "prefix": "YQ==" } } } }, "bareActions": { "create": [ "NoOp" ], "call": [ "DeleteApplication", "UpdateApplication" ] }, "sourceInfo": { "approval": { "sourceInfo": [ { "pc": [ 1191, 1869, 2121, 2177, 2501, 3083, 3130, 3319, 3389, 3516, 3709, 4114, 4183, 4225, 4265, 4336, 4391, 4410, 4476, 4573, 4641, 4672, 4835, 5194, 5464, 5505, 5563 ], "errorMessage": "Box must have value" }, { "pc": [ 3251 ], "errorMessage": "Bytes has valid prefix" }, { "pc": [ 1769 ], "errorMessage": "ERR:DATALEN" }, { "pc": [ 1245 ], "errorMessage": "ERR:NEMPTY" }, { "pc": [ 1237 ], "errorMessage": "ERR:NEXIST" }, { "pc": [ 791 ], "errorMessage": "ERR:OOB" }, { "pc": [ 1096 ], "errorMessage": "ERR:SBEXISTS" }, { "pc": [ 740 ], "errorMessage": "ERR:SBNEXIST" }, { "pc": [ 255 ], "errorMessage": "OnCompletion must be NoOp" }, { "pc": [ 3841 ], "errorMessage": "application exists" }, { "pc": [ 534 ], "errorMessage": "can only call when creating" }, { "pc": [ 517, 525 ], "errorMessage": "can only call when not creating" }, { "pc": [ 1020, 1048, 1154, 1501, 2975, 3018, 3210, 3655, 3750, 3986, 5110 ], "errorMessage": "check GlobalState exists" }, { "pc": [ 1423, 1623, 2032, 2471, 2581, 3499, 4460, 4905, 5047, 5616 ], "errorMessage": "index access is out of bounds" }, { "pc": [ 2726, 2764, 2838 ], "errorMessage": "index out of bounds" }, { "pc": [ 775, 1276, 1597, 1780, 1911, 2367, 2562, 3469, 3550, 4285, 4430, 4879, 5014, 5425, 5594 ], "errorMessage": "invalid array length header" }, { "pc": [ 4087, 4370, 4514 ], "errorMessage": "invalid number of bytes for arc4.bool" }, { "pc": [ 2380, 3480, 5025 ], "errorMessage": "invalid number of bytes for arc4.dynamic_array" }, { "pc": [ 4441 ], "errorMessage": "invalid number of bytes for arc4.dynamic_array>" }, { "pc": [ 3557 ], "errorMessage": "invalid number of bytes for arc4.dynamic_array" }, { "pc": [ 1290 ], "errorMessage": "invalid number of bytes for arc4.dynamic_array" }, { "pc": [ 4297 ], "errorMessage": "invalid number of bytes for arc4.dynamic_array" }, { "pc": [ 861, 1171, 1267, 2358, 2892, 2921, 2970, 2996, 3013, 3041, 3051, 3178, 3305, 3375, 3410, 3618, 4362, 4506, 4655, 4688, 4696, 4799, 4809, 4998 ], "errorMessage": "invalid number of bytes for arc4.static_array" }, { "pc": [ 3257 ], "errorMessage": "invalid number of bytes for arc4.tuple" }, { "pc": [ 872, 883, 894, 905, 4046, 4057, 4068, 4079, 4162 ], "errorMessage": "invalid number of bytes for arc4.uint32" }, { "pc": [ 914, 2873, 2930, 3542, 3627, 3637, 3973, 4207, 4247, 4526, 4537 ], "errorMessage": "invalid number of bytes for arc4.uint64" }, { "pc": [ 1662, 1929, 2624, 5268, 5294, 5399 ], "errorMessage": "max array length exceeded" }, { "pc": [ 800 ], "errorMessage": "never?" }, { "pc": [ 586, 601, 685 ], "errorMessage": "overflow" }, { "pc": [ 3648 ], "errorMessage": "transaction type is pay" } ], "pcOffsetMethod": "none" }, "clear": { "sourceInfo": [], "pcOffsetMethod": "none" } }, "source": { "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCAxIDMyIDIgNDA5NiA2NTUzNQogICAgYnl0ZWNibG9jayAiIiAweDE1MWY3Yzc1ICJjIiAiUGFwIiAiUyIgIkVSUjpBVVRIIiAiX20iICJwIiAiYSIgImQiICJsYXN0Q29tbWl0dGVlSWQiICJsYXN0UGVyaW9kSWQiICJhZG1pbiIgMHgzMDMxMzIzMzM0MzUzNjM3MzgzOSAweDAwICJFUlI6Q19OWCIgIl8iICJFUlI6QV9OWCIgImxhc3RBY2NvdW50SWQiIDB4MDAwMCAib3BlcmF0b3IiICJEIiBiYXNlNjQoQzRFQlF3PT0pICJFUlI6UEVfTFQiIDB4MDAwNjAwMDAgIkVSUjpPT08iICJFUlI6QU9fTlgiICJ4R292UmVnaXN0cnlBcHAiICJFUlI6Q19OQyIgIkVSUjpHUF9OWCIgIkVSUjpHRF9TRCIKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeUFjY291bnQuYWxnby50czoxNQogICAgLy8gbGFzdEFjY291bnRJZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSkKICAgIGJ5dGVjIDE4IC8vICJsYXN0QWNjb3VudElkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo4NAogICAgLy8gbGFzdENvbW1pdHRlZUlkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCB9KQogICAgYnl0ZWMgMTAgLy8gImxhc3RDb21taXR0ZWVJZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6ODcKICAgIC8vIGFkbWluID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oeyBpbml0aWFsVmFsdWU6IEdsb2JhbC5jcmVhdG9yQWRkcmVzcyB9KQogICAgYnl0ZWMgMTIgLy8gImFkbWluIgogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6OTEKICAgIC8vIGxhc3RQZXJpb2RJZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSkKICAgIGJ5dGVjIDExIC8vICJsYXN0UGVyaW9kSWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6NzctNzgKICAgIC8vIEBjb250cmFjdCh7IG5hbWU6ICdHR292UmVnaXN0cnknLCBzdGF0ZVRvdGFsczogeyBnbG9iYWxCeXRlczogMjAsIGdsb2JhbFVpbnRzOiA0NCB9IH0pCiAgICAvLyBleHBvcnQgY2xhc3MgR0dvdlJlZ2lzdHJ5Q29udHJhY3QgZXh0ZW5kcyBHR292UmVnaXN0cnlBY2NvdW50Q29udHJhY3QgewogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fYmFyZV9yb3V0aW5nQDQyCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIG11c3QgYmUgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydAogICAgcHVzaGJ5dGVzcyAweGQ1MGJjNDNkIDB4ZjMwY2Y4NGQgMHhkMzIxNzlkMiAweGUzZmJjMGRlIDB4ODliMWU4NzYgMHgxNzg2NjkxMiAweDkyOGRkYzVlIDB4M2ViM2FmMjEgMHg0NDBkOTUzYiAweDRkNWE3NWQ3IDB4MGRhMjc4ODUgMHhlNTI1OTc1MiAweGViOGQ5M2M5IDB4YzhkNDYxYWIgMHgzYmJiYTQ1NiAweDk3YTk2ZDY3IDB4MTc5YzkxMzUgMHhjMzI2YmI5YiAweGJkZTk5MDM2IDB4ZWNiNzBjMGUgMHg5OTI5NmIyNSAweGNlNTAxOTdhIDB4ZTY3ZTNiYTEgMHgxMTI5MDQzOSAweDM3OGIyYjUxIDB4NmQ5ODNmMTAgMHgwNTI4NmVhMSAweDM2YmQxNWYyIDB4Y2EyODQ5MDMgMHg2ZjMxOTY3YSAweGM2MDcxM2YyIDB4YTIyMGI5ZjkgMHg0MTE4ZWNiZiAvLyBtZXRob2QgInJlZ2lzdGVyQ29tbWl0dGVlKGJ5dGVbMzJdLHVpbnQzMix1aW50MzIsdWludDMyLHVpbnQzMix1aW50NjQpdm9pZCIsIG1ldGhvZCAidW5yZWdpc3RlckNvbW1pdHRlZShieXRlWzMyXSl2b2lkIiwgbWV0aG9kICJpbmdlc3RYR292cyhieXRlWzMyXSwoYWRkcmVzcyx1aW50MzIpW10pdm9pZCIsIG1ldGhvZCAidW5pbmdlc3RYR292cyhieXRlWzMyXSxhZGRyZXNzW10pdm9pZCIsIG1ldGhvZCAic2V0WEdvdlJlZ2lzdHJ5QXBwKHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJzZXRBZG1pbihhZGRyZXNzKXZvaWQiLCBtZXRob2QgIndpdGhkcmF3QUxHTyhhZGRyZXNzLHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJ2ZXJpZnlBZG1pbihhZGRyZXNzKWJvb2wiLCBtZXRob2QgInNldE9wZXJhdG9yKGFkZHJlc3Mpdm9pZCIsIG1ldGhvZCAidmVyaWZ5T3BlcmF0b3IoYWRkcmVzcylib29sIiwgbWV0aG9kICJzZXRfdm90aW5nX2FjY291bnQoYWRkcmVzcyxhZGRyZXNzKXZvaWQiLCBtZXRob2QgIm1pcnJvclhHb3ZEZWxlZ2F0aW9uKGFkZHJlc3Mpdm9pZCIsIG1ldGhvZCAiZ2V0RGVsZWdhdGlvbihhZGRyZXNzKShhZGRyZXNzLGJvb2wpIiwgbWV0aG9kICJnZXREZWxlZ2F0ZShhZGRyZXNzKWFkZHJlc3MiLCBtZXRob2QgImxvZ0RlbGVnYXRvcnMoYWRkcmVzcyl2b2lkIiwgbWV0aG9kICJsb2dEZWxlZ2F0aW9ucyhhZGRyZXNzW10pdm9pZCIsIG1ldGhvZCAidXBsb2FkUGVyaW9kQXBwcm92YWxQYXJ0aWFsKHVpbnQ2NCxieXRlW10pdm9pZCIsIG1ldGhvZCAiY3JlYXRlUGVyaW9kKGJ5dGVbMzJdLHVpbnQ2NCx1aW50NjQscGF5KSh1aW50MzIsdWludDY0KSIsIG1ldGhvZCAic2V0TGFzdFBlcmlvZElkKHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJ1cGRhdGVQZXJpb2RTdW1tYXJ5KHVpbnQzMix1aW50MzIsdWludDMyLHVpbnQzMixib29sKXZvaWQiLCBtZXRob2QgInJlbW92ZVBlcmlvZFN1bW1hcnkodWludDMyKXZvaWQiLCBtZXRob2QgImdldFBlcmlvZEFwcCh1aW50NjQpdWludDY0IiwgbWV0aG9kICJnZXRQZXJpb2RTdW1tYXJ5KHVpbnQ2NCkodWludDY0LHVpbnQzMix1aW50MzIsdWludDMyLGJvb2wpIiwgbWV0aG9kICJsb2dQZXJpb2RTdW1tYXJpZXModWludDY0W10pdm9pZCIsIG1ldGhvZCAiZ2V0Q29tbWl0dGVlTWV0YWRhdGEoYnl0ZVszMl0sYm9vbCkodWludDE2LHVpbnQzMix1aW50MzIsdWludDMyLHVpbnQzMix1aW50NjQsdWludDMyKSIsIG1ldGhvZCAibG9nQ29tbWl0dGVlTWV0YWRhdGEoYnl0ZVszMl1bXSl2b2lkIiwgbWV0aG9kICJsb2dDb21taXR0ZWVQYWdlcyhieXRlWzMyXSxib29sLHVpbnQ2NCx1aW50NjQpdm9pZCIsIG1ldGhvZCAiZ2V0Q29tbWl0dGVlU3VwZXJib3hNZXRhKGJ5dGVbMzJdKSh1aW50MTZbXSx1aW50NjQsdWludDY0LHVpbnQ2NCxzdHJpbmcpIiwgbWV0aG9kICJnZXRYR292Vm90aW5nUG93ZXIoYnl0ZVszMl0sYWRkcmVzcyl1aW50MzIiLCBtZXRob2QgInRyeUdldFhHb3ZWb3RpbmdQb3dlcihieXRlWzMyXSxhZGRyZXNzKXVpbnQzMiIsIG1ldGhvZCAiZ2V0QWNjb3VudChhZGRyZXNzKSh1aW50MzIsKHVpbnQxNix1aW50MTYpW10pIiwgbWV0aG9kICJsb2dBY2NvdW50cyhhZGRyZXNzW10pdm9pZCIsIG1ldGhvZCAiaW5jcmVhc2VCdWRnZXQodWludDY0KXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCByZWdpc3RlckNvbW1pdHRlZSB1bnJlZ2lzdGVyQ29tbWl0dGVlIGluZ2VzdFhHb3ZzIHVuaW5nZXN0WEdvdnMgc2V0WEdvdlJlZ2lzdHJ5QXBwIHNldEFkbWluIHdpdGhkcmF3QUxHTyB2ZXJpZnlBZG1pbiBzZXRPcGVyYXRvciB2ZXJpZnlPcGVyYXRvciBzZXRWb3RpbmdBY2NvdW50IG1pcnJvclhHb3ZEZWxlZ2F0aW9uIGdldERlbGVnYXRpb24gZ2V0RGVsZWdhdGUgbG9nRGVsZWdhdG9ycyBsb2dEZWxlZ2F0aW9ucyB1cGxvYWRQZXJpb2RBcHByb3ZhbFBhcnRpYWwgY3JlYXRlUGVyaW9kIHNldExhc3RQZXJpb2RJZCB1cGRhdGVQZXJpb2RTdW1tYXJ5IHJlbW92ZVBlcmlvZFN1bW1hcnkgZ2V0UGVyaW9kQXBwIGdldFBlcmlvZFN1bW1hcnkgbG9nUGVyaW9kU3VtbWFyaWVzIGdldENvbW1pdHRlZU1ldGFkYXRhIGxvZ0NvbW1pdHRlZU1ldGFkYXRhIGxvZ0NvbW1pdHRlZVBhZ2VzIGdldENvbW1pdHRlZVN1cGVyYm94TWV0YSBnZXRYR292Vm90aW5nUG93ZXIgdHJ5R2V0WEdvdlZvdGluZ1Bvd2VyIGdldEFjY291bnQgbG9nQWNjb3VudHMgaW5jcmVhc2VCdWRnZXQKCm1haW5fYWZ0ZXJfaWZfZWxzZUA0NzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjc3LTc4CiAgICAvLyBAY29udHJhY3QoeyBuYW1lOiAnR0dvdlJlZ2lzdHJ5Jywgc3RhdGVUb3RhbHM6IHsgZ2xvYmFsQnl0ZXM6IDIwLCBnbG9iYWxVaW50czogNDQgfSB9KQogICAgLy8gZXhwb3J0IGNsYXNzIEdHb3ZSZWdpc3RyeUNvbnRyYWN0IGV4dGVuZHMgR0dvdlJlZ2lzdHJ5QWNjb3VudENvbnRyYWN0IHsKICAgIGVycgoKbWFpbl9iYXJlX3JvdXRpbmdANDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo3Ny03OAogICAgLy8gQGNvbnRyYWN0KHsgbmFtZTogJ0dHb3ZSZWdpc3RyeScsIHN0YXRlVG90YWxzOiB7IGdsb2JhbEJ5dGVzOiAyMCwgZ2xvYmFsVWludHM6IDQ0IH0gfSkKICAgIC8vIGV4cG9ydCBjbGFzcyBHR292UmVnaXN0cnlDb250cmFjdCBleHRlbmRzIEdHb3ZSZWdpc3RyeUFjY291bnRDb250cmFjdCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBzd2l0Y2ggbWFpbl9fX2FsZ290c19fLmRlZmF1bHRDcmVhdGVANDMgbWFpbl9hZnRlcl9pZl9lbHNlQDQ3IG1haW5fYWZ0ZXJfaWZfZWxzZUA0NyBtYWluX2FmdGVyX2lmX2Vsc2VANDcgbWFpbl91cGRhdGVBcHBsaWNhdGlvbkA0NCBtYWluX2RlbGV0ZUFwcGxpY2F0aW9uQDQ1CiAgICBlcnIKCm1haW5fZGVsZXRlQXBwbGljYXRpb25ANDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czozMDAKICAgIC8vIEBiYXJlbWV0aG9kKHsgYWxsb3dBY3Rpb25zOiBbJ0RlbGV0ZUFwcGxpY2F0aW9uJ10gfSkKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6MzAyCiAgICAvLyB0aGlzLmVuc3VyZUNhbGxlcklzQWRtaW4oKQogICAgY2FsbHN1YiBlbnN1cmVDYWxsZXJJc0FkbWluCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czozMDAKICAgIC8vIEBiYXJlbWV0aG9kKHsgYWxsb3dBY3Rpb25zOiBbJ0RlbGV0ZUFwcGxpY2F0aW9uJ10gfSkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fdXBkYXRlQXBwbGljYXRpb25ANDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czoyOTQKICAgIC8vIEBiYXJlbWV0aG9kKHsgYWxsb3dBY3Rpb25zOiBbJ1VwZGF0ZUFwcGxpY2F0aW9uJ10gfSkKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6Mjk2CiAgICAvLyB0aGlzLmVuc3VyZUNhbGxlcklzQWRtaW4oKQogICAgY2FsbHN1YiBlbnN1cmVDYWxsZXJJc0FkbWluCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czoyOTQKICAgIC8vIEBiYXJlbWV0aG9kKHsgYWxsb3dBY3Rpb25zOiBbJ1VwZGF0ZUFwcGxpY2F0aW9uJ10gfSkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fX19hbGdvdHNfXy5kZWZhdWx0Q3JlYXRlQDQzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6NzctNzgKICAgIC8vIEBjb250cmFjdCh7IG5hbWU6ICdHR292UmVnaXN0cnknLCBzdGF0ZVRvdGFsczogeyBnbG9iYWxCeXRlczogMjAsIGdsb2JhbFVpbnRzOiA0NCB9IH0pCiAgICAvLyBleHBvcnQgY2xhc3MgR0dvdlJlZ2lzdHJ5Q29udHJhY3QgZXh0ZW5kcyBHR292UmVnaXN0cnlBY2NvdW50Q29udHJhY3QgewogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBwdXlhLXRzOjppdG9hKGk6IHVpbnQ2NCkgLT4gYnl0ZXM6Cml0b2E6CiAgICBwcm90byAxIDEKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCAxMCAvLyAxMAogICAgPAogICAgYnogaXRvYV9lbHNlX2JvZHlAMgogICAgYnl0ZWMgMTMgLy8gMHgzMDMxMzIzMzM0MzUzNjM3MzgzOQogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMQogICAgZXh0cmFjdDMKICAgIHJldHN1YgoKaXRvYV9lbHNlX2JvZHlAMjoKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCAxMCAvLyAxMAogICAgLwogICAgY2FsbHN1YiBpdG9hCiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgICUKICAgIGJ5dGVjIDEzIC8vIDB4MzAzMTMyMzMzNDM1MzYzNzM4MzkKICAgIHN3YXAKICAgIGludGNfMSAvLyAxCiAgICBleHRyYWN0MwogICAgY29uY2F0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjp1MTYodjogdWludDY0KSAtPiBieXRlczoKdTE2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czo0CiAgICAvLyBleHBvcnQgZnVuY3Rpb24gdTE2KHY6IHVpbnQ2NCkgewogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjUKICAgIC8vIHJldHVybiBuZXcgVWludDE2KHYpCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBleHRyYWN0IDYgMgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czo6dTMyKHY6IHVpbnQ2NCkgLT4gYnl0ZXM6CnUzMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6OAogICAgLy8gZXhwb3J0IGZ1bmN0aW9uIHUzMih2OiB1aW50NjQpIHsKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czo5CiAgICAvLyByZXR1cm4gbmV3IFVpbnQzMih2KQogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGJpdGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBleHRyYWN0IDQgNAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdHlwZXMuYWxnby50czo6Z2V0RW1wdHlDb21taXR0ZWVNZXRhZGF0YSgpIC0+IGJ5dGVzOgpnZXRFbXB0eUNvbW1pdHRlZU1ldGFkYXRhOgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdHlwZXMuYWxnby50czozMQogICAgLy8gcGVyaW9kU3RhcnQ6IHUzMigwKSwKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIHUzMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdHlwZXMuYWxnby50czozMgogICAgLy8gcGVyaW9kRW5kOiB1MzIoMCksCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiB1MzIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3R5cGVzLmFsZ28udHM6MzMKICAgIC8vIHRvdGFsTWVtYmVyczogdTMyKDApLAogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgdTMyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS90eXBlcy5hbGdvLnRzOjM0CiAgICAvLyB0b3RhbFZvdGVzOiB1MzIoMCksCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiB1MzIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3R5cGVzLmFsZ28udHM6MzYKICAgIC8vIGluZ2VzdGVkVm90ZXM6IHUzMigwKSwKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIHUzMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdHlwZXMuYWxnby50czozNwogICAgLy8gbnVtZXJpY0lkOiB1MTYoMCksCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiB1MTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3R5cGVzLmFsZ28udHM6MzAtMzgKICAgIC8vIHJldHVybiB7CiAgICAvLyAgIHBlcmlvZFN0YXJ0OiB1MzIoMCksCiAgICAvLyAgIHBlcmlvZEVuZDogdTMyKDApLAogICAgLy8gICB0b3RhbE1lbWJlcnM6IHUzMigwKSwKICAgIC8vICAgdG90YWxWb3RlczogdTMyKDApLAogICAgLy8gICB4R292UmVnaXN0cnlJZDogMCwKICAgIC8vICAgaW5nZXN0ZWRWb3RlczogdTMyKDApLAogICAgLy8gICBudW1lcmljSWQ6IHUxNigwKSwKICAgIC8vIH0KICAgIHVuY292ZXIgNQogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS90eXBlcy5hbGdvLnRzOjM1CiAgICAvLyB4R292UmVnaXN0cnlJZDogMCwKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS90eXBlcy5hbGdvLnRzOjMwLTM4CiAgICAvLyByZXR1cm4gewogICAgLy8gICBwZXJpb2RTdGFydDogdTMyKDApLAogICAgLy8gICBwZXJpb2RFbmQ6IHUzMigwKSwKICAgIC8vICAgdG90YWxNZW1iZXJzOiB1MzIoMCksCiAgICAvLyAgIHRvdGFsVm90ZXM6IHUzMigwKSwKICAgIC8vICAgeEdvdlJlZ2lzdHJ5SWQ6IDAsCiAgICAvLyAgIGluZ2VzdGVkVm90ZXM6IHUzMigwKSwKICAgIC8vICAgbnVtZXJpY0lkOiB1MTYoMCksCiAgICAvLyB9CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdHlwZXMuYWxnby50czo6Z2V0RW1wdHlHR292UGVyaW9kU3VtbWFyeSgpIC0+IGJ5dGVzOgpnZXRFbXB0eUdHb3ZQZXJpb2RTdW1tYXJ5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdHlwZXMuYWxnby50czoxNTYKICAgIC8vIHZvdGluZ1N0YXJ0OiB1MzIoMCksCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiB1MzIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3R5cGVzLmFsZ28udHM6MTU3CiAgICAvLyB2b3RpbmdFbmQ6IHUzMigwKSwKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIHUzMgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdHlwZXMuYWxnby50czoxNTgKICAgIC8vIG51bVRvcGljczogdTMyKDApLAogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgdTMyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS90eXBlcy5hbGdvLnRzOjE1NQogICAgLy8gYXBwSWQ6IDAsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdHlwZXMuYWxnby50czoxNTQtMTYwCiAgICAvLyByZXR1cm4gewogICAgLy8gICBhcHBJZDogMCwKICAgIC8vICAgdm90aW5nU3RhcnQ6IHUzMigwKSwKICAgIC8vICAgdm90aW5nRW5kOiB1MzIoMCksCiAgICAvLyAgIG51bVRvcGljczogdTMyKDApLAogICAgLy8gICByZWFkeTogZmFsc2UsCiAgICAvLyB9CiAgICBpdG9iCiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWMgMTQgLy8gMHgwMAogICAgY29uY2F0CiAgICByZXRzdWIKCgovLyBAZDEzY28vc3VwZXJib3gvc21hcnRfY29udHJhY3RzL3N1cGVyYm94L2xpYi90eXBlcy5hbGdvLnRzOjphdTE2KG51bTogdWludDY0KSAtPiBieXRlczoKYXUxNjoKICAgIC8vIG5vZGVfbW9kdWxlcy9AZDEzY28vc3VwZXJib3gvc21hcnRfY29udHJhY3RzL3N1cGVyYm94L2xpYi90eXBlcy5hbGdvLnRzOjMwCiAgICAvLyBleHBvcnQgZnVuY3Rpb24gYXUxNihudW06IHVpbnQ2NCkgewogICAgcHJvdG8gMSAxCiAgICAvLyBub2RlX21vZHVsZXMvQGQxM2NvL3N1cGVyYm94L3NtYXJ0X2NvbnRyYWN0cy9zdXBlcmJveC9saWIvdHlwZXMuYWxnby50czozMQogICAgLy8gcmV0dXJuIG5ldyBVaW50MTYobnVtKQogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBkdXAKICAgIGJpdGxlbgogICAgcHVzaGludCAxNiAvLyAxNgogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA2IDIKICAgIHJldHN1YgoKCi8vIEBkMTNjby9zdXBlcmJveC9zbWFydF9jb250cmFjdHMvc3VwZXJib3gvbGliL3V0aWxzLmFsZ28udHM6Oml0b2EoaTogdWludDY0KSAtPiBieXRlczoKQGQxM2NvL3N1cGVyYm94L3NtYXJ0X2NvbnRyYWN0cy9zdXBlcmJveC9saWIvdXRpbHMuYWxnby50czo6aXRvYToKICAgIC8vIG5vZGVfbW9kdWxlcy9AZDEzY28vc3VwZXJib3gvc21hcnRfY29udHJhY3RzL3N1cGVyYm94L2xpYi91dGlscy5hbGdvLnRzOjkKICAgIC8vIGV4cG9ydCBmdW5jdGlvbiBpdG9hKGk6IHVpbnQ2NCk6IHN0cmluZyB7CiAgICBwcm90byAxIDEKICAgIC8vIG5vZGVfbW9kdWxlcy9AZDEzY28vc3VwZXJib3gvc21hcnRfY29udHJhY3RzL3N1cGVyYm94L2xpYi91dGlscy5hbGdvLnRzOjEyCiAgICAvLyBpZiAoaSA8IHJhZGl4KSB7CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG5vZGVfbW9kdWxlcy9AZDEzY28vc3VwZXJib3gvc21hcnRfY29udHJhY3RzL3N1cGVyYm94L2xpYi91dGlscy5hbGdvLnRzOjExCiAgICAvLyBjb25zdCByYWRpeCA9IGRpZ2l0cy5sZW5ndGgKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIC8vIG5vZGVfbW9kdWxlcy9AZDEzY28vc3VwZXJib3gvc21hcnRfY29udHJhY3RzL3N1cGVyYm94L2xpYi91dGlscy5hbGdvLnRzOjEyCiAgICAvLyBpZiAoaSA8IHJhZGl4KSB7CiAgICA8CiAgICBieiBAZDEzY28vc3VwZXJib3gvc21hcnRfY29udHJhY3RzL3N1cGVyYm94L2xpYi91dGlscy5hbGdvLnRzOjppdG9hX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbm9kZV9tb2R1bGVzL0BkMTNjby9zdXBlcmJveC9zbWFydF9jb250cmFjdHMvc3VwZXJib3gvbGliL3V0aWxzLmFsZ28udHM6MTMKICAgIC8vIHJldHVybiBkaWdpdHMuYXQoaSkudG9TdHJpbmcoKQogICAgYnl0ZWMgMTMgLy8gIjAxMjM0NTY3ODkiCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAxCiAgICBleHRyYWN0MwogICAgcmV0c3ViCgpAZDEzY28vc3VwZXJib3gvc21hcnRfY29udHJhY3RzL3N1cGVyYm94L2xpYi91dGlscy5hbGdvLnRzOjppdG9hX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIG5vZGVfbW9kdWxlcy9AZDEzY28vc3VwZXJib3gvc21hcnRfY29udHJhY3RzL3N1cGVyYm94L2xpYi91dGlscy5hbGdvLnRzOjE1CiAgICAvLyByZXR1cm4gaXRvYShpIC8gcmFkaXgpLmNvbmNhdChkaWdpdHMuYXQoaSAlIHJhZGl4KS50b1N0cmluZygpKQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBub2RlX21vZHVsZXMvQGQxM2NvL3N1cGVyYm94L3NtYXJ0X2NvbnRyYWN0cy9zdXBlcmJveC9saWIvdXRpbHMuYWxnby50czoxMQogICAgLy8gY29uc3QgcmFkaXggPSBkaWdpdHMubGVuZ3RoCiAgICBwdXNoaW50IDEwIC8vIDEwCiAgICAvLyBub2RlX21vZHVsZXMvQGQxM2NvL3N1cGVyYm94L3NtYXJ0X2NvbnRyYWN0cy9zdXBlcmJveC9saWIvdXRpbHMuYWxnby50czoxNQogICAgLy8gcmV0dXJuIGl0b2EoaSAvIHJhZGl4KS5jb25jYXQoZGlnaXRzLmF0KGkgJSByYWRpeCkudG9TdHJpbmcoKSkKICAgIC8KICAgIGNhbGxzdWIgQGQxM2NvL3N1cGVyYm94L3NtYXJ0X2NvbnRyYWN0cy9zdXBlcmJveC9saWIvdXRpbHMuYWxnby50czo6aXRvYQogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBub2RlX21vZHVsZXMvQGQxM2NvL3N1cGVyYm94L3NtYXJ0X2NvbnRyYWN0cy9zdXBlcmJveC9saWIvdXRpbHMuYWxnby50czoxMQogICAgLy8gY29uc3QgcmFkaXggPSBkaWdpdHMubGVuZ3RoCiAgICBwdXNoaW50IDEwIC8vIDEwCiAgICAvLyBub2RlX21vZHVsZXMvQGQxM2NvL3N1cGVyYm94L3NtYXJ0X2NvbnRyYWN0cy9zdXBlcmJveC9saWIvdXRpbHMuYWxnby50czoxNQogICAgLy8gcmV0dXJuIGl0b2EoaSAvIHJhZGl4KS5jb25jYXQoZGlnaXRzLmF0KGkgJSByYWRpeCkudG9TdHJpbmcoKSkKICAgICUKICAgIGJ5dGVjIDEzIC8vICIwMTIzNDU2Nzg5IgogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgIGV4dHJhY3QzCiAgICBjb25jYXQKICAgIHJldHN1YgoKCi8vIEBkMTNjby9zdXBlcmJveC9zbWFydF9jb250cmFjdHMvc3VwZXJib3gvbGliL3V0aWxzLmFsZ28udHM6OnNiTWV0YUJveFZhbHVlKG5hbWU6IGJ5dGVzKSAtPiBieXRlczoKc2JNZXRhQm94VmFsdWU6CiAgICAvLyBub2RlX21vZHVsZXMvQGQxM2NvL3N1cGVyYm94L3NtYXJ0X2NvbnRyYWN0cy9zdXBlcmJveC9saWIvdXRpbHMuYWxnby50czo1MgogICAgLy8gZXhwb3J0IGZ1bmN0aW9uIHNiTWV0YUJveFZhbHVlKG5hbWU6IHN0cmluZyk6IFN1cGVyYm94TWV0YSB7CiAgICBwcm90byAxIDEKICAgIC8vIG5vZGVfbW9kdWxlcy9AZDEzY28vc3VwZXJib3gvc21hcnRfY29udHJhY3RzL3N1cGVyYm94L2xpYi91dGlscy5hbGdvLnRzOjQ0CiAgICAvLyByZXR1cm4gQm94PFN1cGVyYm94TWV0YT4oeyBrZXk6IEJ5dGVzKG5hbWUpLmNvbmNhdChCeXRlcygnX20nKSkgfSkKICAgIGZyYW1lX2RpZyAtMQogICAgYnl0ZWMgNiAvLyAiX20iCiAgICBjb25jYXQKICAgIC8vIG5vZGVfbW9kdWxlcy9AZDEzY28vc3VwZXJib3gvc21hcnRfY29udHJhY3RzL3N1cGVyYm94L2xpYi91dGlscy5hbGdvLnRzOjU0CiAgICAvLyBhc3NlcnQobWV0YUJveC5leGlzdHMsICdFUlI6U0JORVhJU1QnKQogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBFUlI6U0JORVhJU1QKICAgIC8vIG5vZGVfbW9kdWxlcy9AZDEzY28vc3VwZXJib3gvc21hcnRfY29udHJhY3RzL3N1cGVyYm94L2xpYi91dGlscy5hbGdvLnRzOjU1CiAgICAvLyByZXR1cm4gbWV0YUJveC52YWx1ZQogICAgYm94X2dldAogICAgcG9wCiAgICByZXRzdWIKCgovLyBAZDEzY28vc3VwZXJib3gvc21hcnRfY29udHJhY3RzL3N1cGVyYm94L2xpYi9zdXBlcmJveC5hbGdvLnRzOjpzYkdldExvY2F0aW9uKG5hbWU6IGJ5dGVzLCB2YWx1ZUluZGV4OiB1aW50NjQpIC0+IGJ5dGVzOgpzYkdldExvY2F0aW9uOgogICAgLy8gbm9kZV9tb2R1bGVzL0BkMTNjby9zdXBlcmJveC9zbWFydF9jb250cmFjdHMvc3VwZXJib3gvbGliL3N1cGVyYm94LmFsZ28udHM6MjE1CiAgICAvLyBleHBvcnQgZnVuY3Rpb24gc2JHZXRMb2NhdGlvbihuYW1lOiBzdHJpbmcsIHZhbHVlSW5kZXg6IHVpbnQ2NCk6IFtCb3hOdW0sIEJ5dGVPZmZzZXRdIHsKICAgIHByb3RvIDIgMQogICAgYnl0ZWNfMCAvLyAiIgogICAgLy8gbm9kZV9tb2R1bGVzL0BkMTNjby9zdXBlcmJveC9zbWFydF9jb250cmFjdHMvc3VwZXJib3gvbGliL3N1cGVyYm94LmFsZ28udHM6MjE2CiAgICAvLyBjb25zdCBtZXRhID0gc2JNZXRhQm94VmFsdWUobmFtZSkKICAgIGZyYW1lX2RpZyAtMgogICAgY2FsbHN1YiBzYk1ldGFCb3hWYWx1ZQogICAgLy8gbm9kZV9tb2R1bGVzL0BkMTNjby9zdXBlcmJveC9zbWFydF9jb250cmFjdHMvc3VwZXJib3gvbGliL3N1cGVyYm94LmFsZ28udHM6MjE3CiAgICAvLyBjb25zdCB2YWx1ZVNpemUgPSBtZXRhLnZhbHVlU2l6ZS5hc1VpbnQ2NCgpCiAgICBkdXAKICAgIHB1c2hpbnQgMTggLy8gMTgKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBub2RlX21vZHVsZXMvQGQxM2NvL3N1cGVyYm94L3NtYXJ0X2NvbnRyYWN0cy9zdXBlcmJveC9saWIvc3VwZXJib3guYWxnby50czoyMTgKICAgIC8vIGNvbnN0IHRvdGFsQm94ZXMgPSBtZXRhLmJveEJ5dGVMZW5ndGhzLmxlbmd0aAogICAgZGlnIDEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIHB1c2hpbnQgMjYgLy8gMjYKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMwogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBjb3ZlciAzCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgY292ZXIgMgogICAgLy8gbm9kZV9tb2R1bGVzL0BkMTNjby9zdXBlcmJveC9zbWFydF9jb250cmFjdHMvc3VwZXJib3gvbGliL3N1cGVyYm94LmFsZ28udHM6MjIxCiAgICAvLyBsZXQgYnl0ZUluZGV4OiB1aW50NjQgPSB2YWx1ZUluZGV4ICogdmFsdWVTaXplCiAgICBmcmFtZV9kaWcgLTEKICAgIGRpZyAxCiAgICAqCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIC8vIG5vZGVfbW9kdWxlcy9AZDEzY28vc3VwZXJib3gvc21hcnRfY29udHJhY3RzL3N1cGVyYm94L2xpYi9zdXBlcmJveC5hbGdvLnRzOjIyNAogICAgLy8gYXNzZXJ0KGJ5dGVJbmRleCArIHZhbHVlU2l6ZSA8PSBtZXRhLnRvdGFsQnl0ZUxlbmd0aC5hc1VpbnQ2NCgpLCAnRVJSOk9PQicpCiAgICArCiAgICBzd2FwCiAgICBpbnRjXzMgLy8gMgogICAgZXh0cmFjdF91aW50NjQKICAgIDw9CiAgICBhc3NlcnQgLy8gRVJSOk9PQgogICAgLy8gbm9kZV9tb2R1bGVzL0BkMTNjby9zdXBlcmJveC9zbWFydF9jb250cmFjdHMvc3VwZXJib3gvbGliL3N1cGVyYm94LmFsZ28udHM6MjI2CiAgICAvLyBsZXQgZWxhcHNlZEJ5dGVzOiB1aW50NjQgPSAwCiAgICBpbnRjXzAgLy8gMAogICAgLy8gbm9kZV9tb2R1bGVzL0BkMTNjby9zdXBlcmJveC9zbWFydF9jb250cmFjdHMvc3VwZXJib3gvbGliL3N1cGVyYm94LmFsZ28udHM6MjI3CiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgdG90YWxCb3hlczsgaSsrKSB7CiAgICBkdXAKCnNiR2V0TG9jYXRpb25fd2hpbGVfdG9wQDE6CiAgICAvLyBub2RlX21vZHVsZXMvQGQxM2NvL3N1cGVyYm94L3NtYXJ0X2NvbnRyYWN0cy9zdXBlcmJveC9saWIvc3VwZXJib3guYWxnby50czoyMjcKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCB0b3RhbEJveGVzOyBpKyspIHsKICAgIGZyYW1lX2RpZyA1CiAgICBkdXAKICAgIGZyYW1lX2RpZyAyCiAgICA8CiAgICBhc3NlcnQgLy8gbmV2ZXI/CiAgICAvLyBub2RlX21vZHVsZXMvQGQxM2NvL3N1cGVyYm94L3NtYXJ0X2NvbnRyYWN0cy9zdXBlcmJveC9saWIvc3VwZXJib3guYWxnby50czoyMjgKICAgIC8vIGNvbnN0IGJveFNpemUgPSBtZXRhLmJveEJ5dGVMZW5ndGhzW2ldLmFzVWludDY0KCkKICAgIGZyYW1lX2RpZyAxCiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgaW50Y18zIC8vIDIKICAgICoKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gbm9kZV9tb2R1bGVzL0BkMTNjby9zdXBlcmJveC9zbWFydF9jb250cmFjdHMvc3VwZXJib3gvbGliL3N1cGVyYm94LmFsZ28udHM6MjI5CiAgICAvLyBpZiAoYm94U2l6ZSArIGVsYXBzZWRCeXRlcyA+IGJ5dGVJbmRleCkgewogICAgZnJhbWVfZGlnIDQKICAgICsKICAgIGZyYW1lX2RpZyAzCiAgICA+CiAgICBieiBzYkdldExvY2F0aW9uX2Vsc2VfYm9keUA0CiAgICAvLyBub2RlX21vZHVsZXMvQGQxM2NvL3N1cGVyYm94L3NtYXJ0X2NvbnRyYWN0cy9zdXBlcmJveC9saWIvc3VwZXJib3guYWxnby50czoyMzEKICAgIC8vIHJldHVybiBbaSwgYnl0ZUluZGV4IC0gZWxhcHNlZEJ5dGVzXQogICAgZnJhbWVfZGlnIDMKICAgIGZyYW1lX2RpZyA0CiAgICAtCiAgICBmcmFtZV9kaWcgNQogICAgaXRvYgogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKc2JHZXRMb2NhdGlvbl9lbHNlX2JvZHlANDoKICAgIC8vIG5vZGVfbW9kdWxlcy9AZDEzY28vc3VwZXJib3gvc21hcnRfY29udHJhY3RzL3N1cGVyYm94L2xpYi9zdXBlcmJveC5hbGdvLnRzOjIzMwogICAgLy8gZWxhcHNlZEJ5dGVzICs9IGJveFNpemUKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9kaWcgMAogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICAvLyBub2RlX21vZHVsZXMvQGQxM2NvL3N1cGVyYm94L3NtYXJ0X2NvbnRyYWN0cy9zdXBlcmJveC9saWIvc3VwZXJib3guYWxnby50czoyMjcKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCB0b3RhbEJveGVzOyBpKyspIHsKICAgIGZyYW1lX2RpZyA1CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSA1CiAgICBiIHNiR2V0TG9jYXRpb25fd2hpbGVfdG9wQDEKCgovLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo6R0dvdlJlZ2lzdHJ5Q29udHJhY3QucmVnaXN0ZXJDb21taXR0ZWVbcm91dGluZ10oKSAtPiB2b2lkOgpyZWdpc3RlckNvbW1pdHRlZToKICAgIGJ5dGVjXzAgLy8gIiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjEyMi0xMjkKICAgIC8vIHB1YmxpYyByZWdpc3RlckNvbW1pdHRlZSgKICAgIC8vICAgY29tbWl0dGVlSWQ6IENvbW1pdHRlZUlkLAogICAgLy8gICBwZXJpb2RTdGFydDogVWludDMyLAogICAgLy8gICBwZXJpb2RFbmQ6IFVpbnQzMiwKICAgIC8vICAgdG90YWxNZW1iZXJzOiBVaW50MzIsCiAgICAvLyAgIHRvdGFsVm90ZXM6IFVpbnQzMiwKICAgIC8vICAgeEdvdlJlZ2lzdHJ5SWQ6IHVpbnQ2NCwKICAgIC8vICk6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwbiAyCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgcHVzaGludCA0IC8vIDQKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDMyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgcHVzaGludCA0IC8vIDQKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDMyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgcHVzaGludCA0IC8vIDQKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDMyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA1CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgcHVzaGludCA0IC8vIDQKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDMyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA2CiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCA4IC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czoxMzAKICAgIC8vIHRoaXMuZW5zdXJlQ2FsbGVySXNBZG1pbigpCiAgICBjYWxsc3ViIGVuc3VyZUNhbGxlcklzQWRtaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjgyCiAgICAvLyBjb21taXR0ZWVzID0gQm94TWFwPENvbW1pdHRlZUlkLCBDb21taXR0ZWVNZXRhZGF0YT4oeyBrZXlQcmVmaXg6ICdjJyB9KQogICAgYnl0ZWNfMiAvLyAiYyIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czoxMzMKICAgIC8vIGVuc3VyZSghY29tbWl0dGVlQm94LmV4aXN0cywgZXJyQ29tbWl0dGVlRXhpc3RzKQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjMzCiAgICAvLyBpZiAoIWNvbmQpIHsKICAgIGJ6IHJlZ2lzdGVyQ29tbWl0dGVlX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6MTMzCiAgICAvLyBlbnN1cmUoIWNvbW1pdHRlZUJveC5leGlzdHMsIGVyckNvbW1pdHRlZUV4aXN0cykKICAgIHB1c2hieXRlcyAiRVJSOkNfRVgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjM0CiAgICAvLyBsb2coY29kZSkKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozNQogICAgLy8gZXJyKCkKICAgIGVycgoKcmVnaXN0ZXJDb21taXR0ZWVfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6MTM0CiAgICAvLyBlbnN1cmUocGVyaW9kRW5kLmFzVWludDY0KCkgPiBwZXJpb2RTdGFydC5hc1VpbnQ2NCgpLCBlcnJQZXJpb2RFbmRMZXNzVGhhblN0YXJ0KQogICAgZGlnIDQKICAgIGJ0b2kKICAgIGRpZyA2CiAgICBidG9pCiAgICA+CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjMzCiAgICAvLyBpZiAoIWNvbmQpIHsKICAgIGJueiByZWdpc3RlckNvbW1pdHRlZV9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjEzNAogICAgLy8gZW5zdXJlKHBlcmlvZEVuZC5hc1VpbnQ2NCgpID4gcGVyaW9kU3RhcnQuYXNVaW50NjQoKSwgZXJyUGVyaW9kRW5kTGVzc1RoYW5TdGFydCkKICAgIGJ5dGVjIDIzIC8vICJFUlI6UEVfTFQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjM0CiAgICAvLyBsb2coY29kZSkKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozNQogICAgLy8gZXJyKCkKICAgIGVycgoKcmVnaXN0ZXJDb21taXR0ZWVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6MTM1CiAgICAvLyBlbnN1cmUodG90YWxNZW1iZXJzLmFzVWludDY0KCkgPiAwLCBlcnJUb3RhbE1lbWJlcnNaZXJvKQogICAgZGlnIDMKICAgIGJ0b2kKICAgIGR1cAogICAgYnVyeSA5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjMzCiAgICAvLyBpZiAoIWNvbmQpIHsKICAgIGJueiByZWdpc3RlckNvbW1pdHRlZV9hZnRlcl9pZl9lbHNlQDExCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czoxMzUKICAgIC8vIGVuc3VyZSh0b3RhbE1lbWJlcnMuYXNVaW50NjQoKSA+IDAsIGVyclRvdGFsTWVtYmVyc1plcm8pCiAgICBwdXNoYnl0ZXMgIkVSUjpUTV9aIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozNAogICAgLy8gbG9nKGNvZGUpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzUKICAgIC8vIGVycigpCiAgICBlcnIKCnJlZ2lzdGVyQ29tbWl0dGVlX2FmdGVyX2lmX2Vsc2VAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czoxMzYKICAgIC8vIGVuc3VyZSh0b3RhbFZvdGVzLmFzVWludDY0KCkgPiAwLCBlcnJUb3RhbFZvdGVzWmVybykKICAgIGRpZyAyCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjMzCiAgICAvLyBpZiAoIWNvbmQpIHsKICAgIGJueiByZWdpc3RlckNvbW1pdHRlZV9hZnRlcl9pZl9lbHNlQDE1CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czoxMzYKICAgIC8vIGVuc3VyZSh0b3RhbFZvdGVzLmFzVWludDY0KCkgPiAwLCBlcnJUb3RhbFZvdGVzWmVybykKICAgIHB1c2hieXRlcyAiRVJSOlRWX1oiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjM0CiAgICAvLyBsb2coY29kZSkKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozNQogICAgLy8gZXJyKCkKICAgIGVycgoKcmVnaXN0ZXJDb21taXR0ZWVfYWZ0ZXJfaWZfZWxzZUAxNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjEzNwogICAgLy8gZW5zdXJlKHRvdGFsTWVtYmVycy5hc1VpbnQ2NCgpIDw9IDY1NTM1LCBlcnJUb3RhbE1lbWJlcnNPdmVyZmxvdykKICAgIGRpZyA3CiAgICBpbnRjIDUgLy8gNjU1MzUKICAgIDw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjMzCiAgICAvLyBpZiAoIWNvbmQpIHsKICAgIGJueiByZWdpc3RlckNvbW1pdHRlZV9hZnRlcl9pZl9lbHNlQDE5CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czoxMzcKICAgIC8vIGVuc3VyZSh0b3RhbE1lbWJlcnMuYXNVaW50NjQoKSA8PSA2NTUzNSwgZXJyVG90YWxNZW1iZXJzT3ZlcmZsb3cpCiAgICBwdXNoYnl0ZXMgIkVSUjpUTV9PViIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzQKICAgIC8vIGxvZyhjb2RlKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjM1CiAgICAvLyBlcnIoKQogICAgZXJyCgpyZWdpc3RlckNvbW1pdHRlZV9hZnRlcl9pZl9lbHNlQDE5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6MTM4CiAgICAvLyBlbnN1cmUodGhpcy5sYXN0Q29tbWl0dGVlSWQudmFsdWUgPD0gNjU1MzUsIGVyckNvbW1pdHRlZUlkT3ZlcmZsb3cpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6ODQKICAgIC8vIGxhc3RDb21taXR0ZWVJZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSkKICAgIGJ5dGVjIDEwIC8vICJsYXN0Q29tbWl0dGVlSWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czoxMzgKICAgIC8vIGVuc3VyZSh0aGlzLmxhc3RDb21taXR0ZWVJZC52YWx1ZSA8PSA2NTUzNSwgZXJyQ29tbWl0dGVlSWRPdmVyZmxvdykKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpbnRjIDUgLy8gNjU1MzUKICAgIDw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjMzCiAgICAvLyBpZiAoIWNvbmQpIHsKICAgIGJueiByZWdpc3RlckNvbW1pdHRlZV9hZnRlcl9pZl9lbHNlQDIzCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czoxMzgKICAgIC8vIGVuc3VyZSh0aGlzLmxhc3RDb21taXR0ZWVJZC52YWx1ZSA8PSA2NTUzNSwgZXJyQ29tbWl0dGVlSWRPdmVyZmxvdykKICAgIHB1c2hieXRlcyAiRVJSOkNJX09WIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozNAogICAgLy8gbG9nKGNvZGUpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzUKICAgIC8vIGVycigpCiAgICBlcnIKCnJlZ2lzdGVyQ29tbWl0dGVlX2FmdGVyX2lmX2Vsc2VAMjM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czoxNDUKICAgIC8vIGluZ2VzdGVkVm90ZXM6IHUzMigwKSwKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIHUzMgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6MTQ2CiAgICAvLyBudW1lcmljSWQ6IHUxNih0aGlzLmxhc3RDb21taXR0ZWVJZC52YWx1ZSksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6ODQKICAgIC8vIGxhc3RDb21taXR0ZWVJZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSkKICAgIGJ5dGVjIDEwIC8vICJsYXN0Q29tbWl0dGVlSWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czoxNDYKICAgIC8vIG51bWVyaWNJZDogdTE2KHRoaXMubGFzdENvbW1pdHRlZUlkLnZhbHVlKSwKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBjYWxsc3ViIHUxNgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6MTM5LTE0NwogICAgLy8gY29tbWl0dGVlQm94LnZhbHVlID0gewogICAgLy8gICBwZXJpb2RTdGFydCwKICAgIC8vICAgcGVyaW9kRW5kLAogICAgLy8gICB0b3RhbE1lbWJlcnMsCiAgICAvLyAgIHRvdGFsVm90ZXMsCiAgICAvLyAgIHhHb3ZSZWdpc3RyeUlkLAogICAgLy8gICBpbmdlc3RlZFZvdGVzOiB1MzIoMCksCiAgICAvLyAgIG51bWVyaWNJZDogdTE2KHRoaXMubGFzdENvbW1pdHRlZUlkLnZhbHVlKSwKICAgIC8vIH0KICAgIGRpZyA3CiAgICBjb25jYXQKICAgIGRpZyA2CiAgICBjb25jYXQKICAgIGRpZyA1CiAgICBjb25jYXQKICAgIGRpZyA0CiAgICBjb25jYXQKICAgIGRpZyAzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjgxNgogICAgLy8gcmV0dXJuIHRoaXMuZ2V0TWV0YWRhdGFTQlByZWZpeCh0aGlzLm11c3RHZXRDb21taXR0ZWVNZXRhZGF0YShjb21taXR0ZWVJZCkpCiAgICBkaWcgNgogICAgY2FsbHN1YiBtdXN0R2V0Q29tbWl0dGVlTWV0YWRhdGEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjgyNAogICAgLy8gcmV0dXJuICdTJyArIG1ldGFkYXRhLm51bWVyaWNJZC5hc1VpbnQ2NCgpLnRvU3RyaW5nKCkKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgY2FsbHN1YiBpdG9hCiAgICBieXRlYyA0IC8vICJTIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBub2RlX21vZHVsZXMvQGQxM2NvL3N1cGVyYm94L3NtYXJ0X2NvbnRyYWN0cy9zdXBlcmJveC9saWIvdXRpbHMuYWxnby50czo0NAogICAgLy8gcmV0dXJuIEJveDxTdXBlcmJveE1ldGE+KHsga2V5OiBCeXRlcyhuYW1lKS5jb25jYXQoQnl0ZXMoJ19tJykpIH0pCiAgICBieXRlYyA2IC8vICJfbSIKICAgIGNvbmNhdAogICAgLy8gbm9kZV9tb2R1bGVzL0BkMTNjby9zdXBlcmJveC9zbWFydF9jb250cmFjdHMvc3VwZXJib3gvbGliL3N1cGVyYm94LmFsZ28udHM6MjIKICAgIC8vIGFzc2VydCghbWV0YUJveC5leGlzdHMsICdFUlI6U0JFWElTVFMnKQogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBFUlI6U0JFWElTVFMKICAgIC8vIG5vZGVfbW9kdWxlcy9AZDEzY28vc3VwZXJib3gvc21hcnRfY29udHJhY3RzL3N1cGVyYm94L2xpYi9zdXBlcmJveC5hbGdvLnRzOjIzCiAgICAvLyBtZXRhQm94LnZhbHVlID0gY2xvbmUobWV0YSkKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBub2RlX21vZHVsZXMvQGQxM2NvL3N1cGVyYm94L3NtYXJ0X2NvbnRyYWN0cy9zdXBlcmJveC9saWIvc3VwZXJib3guYWxnby50czoxNC0yMAogICAgLy8gY29uc3QgbWV0YSA9IG5ldyBTdXBlcmJveE1ldGEoewogICAgLy8gICB0b3RhbEJ5dGVMZW5ndGg6IGF1NjQoMCksCiAgICAvLyAgIG1heEJveFNpemU6IGF1NjQobWF4Qm94U2l6ZSksCiAgICAvLyAgIGJveEJ5dGVMZW5ndGhzOiBuZXcgRHluYW1pY0FycmF5PFVpbnQxNj4oKSwKICAgIC8vICAgdmFsdWVTaXplOiBhdTY0KHZhbHVlU2l6ZSksCiAgICAvLyAgIHZhbHVlU2NoZW1hOiBuZXcgU3RyKHZhbHVlU2NoZW1hKSwKICAgIC8vIH0pCiAgICBwdXNoYnl0ZXMgMHgwMDFjMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA4MDAwMDAwMDAwMDAwMDAwMDA4MDAxZTAwMDAwMDBmNWI3NTY5NmU3NDMzMzIyYzc1Njk2ZTc0MzMzMjVkCiAgICAvLyBub2RlX21vZHVsZXMvQGQxM2NvL3N1cGVyYm94L3NtYXJ0X2NvbnRyYWN0cy9zdXBlcmJveC9saWIvc3VwZXJib3guYWxnby50czoyMwogICAgLy8gbWV0YUJveC52YWx1ZSA9IGNsb25lKG1ldGEpCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czoxNDkKICAgIC8vIHRoaXMubGFzdENvbW1pdHRlZUlkLnZhbHVlID0gdGhpcy5sYXN0Q29tbWl0dGVlSWQudmFsdWUgKyAxCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6ODQKICAgIC8vIGxhc3RDb21taXR0ZWVJZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSkKICAgIGJ5dGVjIDEwIC8vICJsYXN0Q29tbWl0dGVlSWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czoxNDkKICAgIC8vIHRoaXMubGFzdENvbW1pdHRlZUlkLnZhbHVlID0gdGhpcy5sYXN0Q29tbWl0dGVlSWQudmFsdWUgKyAxCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjg0CiAgICAvLyBsYXN0Q29tbWl0dGVlSWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pCiAgICBieXRlYyAxMCAvLyAibGFzdENvbW1pdHRlZUlkIgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6MTQ5CiAgICAvLyB0aGlzLmxhc3RDb21taXR0ZWVJZC52YWx1ZSA9IHRoaXMubGFzdENvbW1pdHRlZUlkLnZhbHVlICsgMQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjEyMi0xMjkKICAgIC8vIHB1YmxpYyByZWdpc3RlckNvbW1pdHRlZSgKICAgIC8vICAgY29tbWl0dGVlSWQ6IENvbW1pdHRlZUlkLAogICAgLy8gICBwZXJpb2RTdGFydDogVWludDMyLAogICAgLy8gICBwZXJpb2RFbmQ6IFVpbnQzMiwKICAgIC8vICAgdG90YWxNZW1iZXJzOiBVaW50MzIsCiAgICAvLyAgIHRvdGFsVm90ZXM6IFVpbnQzMiwKICAgIC8vICAgeEdvdlJlZ2lzdHJ5SWQ6IHVpbnQ2NCwKICAgIC8vICk6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjpHR292UmVnaXN0cnlDb250cmFjdC51bnJlZ2lzdGVyQ29tbWl0dGVlW3JvdXRpbmddKCkgLT4gdm9pZDoKdW5yZWdpc3RlckNvbW1pdHRlZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjE1NgogICAgLy8gcHVibGljIHVucmVnaXN0ZXJDb21taXR0ZWUoY29tbWl0dGVlSWQ6IENvbW1pdHRlZUlkKTogdm9pZCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXBuIDIKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjE1NwogICAgLy8gdGhpcy5lbnN1cmVDYWxsZXJJc0FkbWluKCkKICAgIGNhbGxzdWIgZW5zdXJlQ2FsbGVySXNBZG1pbgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6ODIKICAgIC8vIGNvbW1pdHRlZXMgPSBCb3hNYXA8Q29tbWl0dGVlSWQsIENvbW1pdHRlZU1ldGFkYXRhPih7IGtleVByZWZpeDogJ2MnIH0pCiAgICBieXRlY18yIC8vICJjIgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjE2MAogICAgLy8gZW5zdXJlKGNvbW1pdHRlZUJveC5leGlzdHMsIGVyckNvbW1pdHRlZU5vdEV4aXN0cykKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozMwogICAgLy8gaWYgKCFjb25kKSB7CiAgICBibnogdW5yZWdpc3RlckNvbW1pdHRlZV9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjE2MAogICAgLy8gZW5zdXJlKGNvbW1pdHRlZUJveC5leGlzdHMsIGVyckNvbW1pdHRlZU5vdEV4aXN0cykKICAgIGJ5dGVjIDE1IC8vICJFUlI6Q19OWCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzQKICAgIC8vIGxvZyhjb2RlKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjM1CiAgICAvLyBlcnIoKQogICAgZXJyCgp1bnJlZ2lzdGVyQ29tbWl0dGVlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjE2MQogICAgLy8gZW5zdXJlKGNvbW1pdHRlZUJveC52YWx1ZS5pbmdlc3RlZFZvdGVzID09PSB1MzIoMCksIGVyckluZ2VzdGVkVm90ZXNOb3RaZXJvKQogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgZXh0cmFjdCAyNiA0CiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiB1MzIKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjMzCiAgICAvLyBpZiAoIWNvbmQpIHsKICAgIGJueiB1bnJlZ2lzdGVyQ29tbWl0dGVlX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6MTYxCiAgICAvLyBlbnN1cmUoY29tbWl0dGVlQm94LnZhbHVlLmluZ2VzdGVkVm90ZXMgPT09IHUzMigwKSwgZXJySW5nZXN0ZWRWb3Rlc05vdFplcm8pCiAgICBwdXNoYnl0ZXMgIkVSUjpJVl9OWiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzQKICAgIC8vIGxvZyhjb2RlKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjM1CiAgICAvLyBlcnIoKQogICAgZXJyCgp1bnJlZ2lzdGVyQ29tbWl0dGVlX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjgxNgogICAgLy8gcmV0dXJuIHRoaXMuZ2V0TWV0YWRhdGFTQlByZWZpeCh0aGlzLm11c3RHZXRDb21taXR0ZWVNZXRhZGF0YShjb21taXR0ZWVJZCkpCiAgICBkaWcgMQogICAgY2FsbHN1YiBtdXN0R2V0Q29tbWl0dGVlTWV0YWRhdGEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjgyNAogICAgLy8gcmV0dXJuICdTJyArIG1ldGFkYXRhLm51bWVyaWNJZC5hc1VpbnQ2NCgpLnRvU3RyaW5nKCkKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgY2FsbHN1YiBpdG9hCiAgICBieXRlYyA0IC8vICJTIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBub2RlX21vZHVsZXMvQGQxM2NvL3N1cGVyYm94L3NtYXJ0X2NvbnRyYWN0cy9zdXBlcmJveC9saWIvdXRpbHMuYWxnby50czo0NAogICAgLy8gcmV0dXJuIEJveDxTdXBlcmJveE1ldGE+KHsga2V5OiBCeXRlcyhuYW1lKS5jb25jYXQoQnl0ZXMoJ19tJykpIH0pCiAgICBieXRlYyA2IC8vICJfbSIKICAgIGNvbmNhdAogICAgLy8gbm9kZV9tb2R1bGVzL0BkMTNjby9zdXBlcmJveC9zbWFydF9jb250cmFjdHMvc3VwZXJib3gvbGliL3N1cGVyYm94LmFsZ28udHM6MjAzCiAgICAvLyBhc3NlcnQobWV0YUJveC5leGlzdHMsICdFUlI6TkVYSVNUJykKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gRVJSOk5FWElTVAogICAgLy8gbm9kZV9tb2R1bGVzL0BkMTNjby9zdXBlcmJveC9zbWFydF9jb250cmFjdHMvc3VwZXJib3gvbGliL3N1cGVyYm94LmFsZ28udHM6MjA0CiAgICAvLyBhc3NlcnQobWV0YUJveC52YWx1ZS50b3RhbEJ5dGVMZW5ndGguYXNVaW50NjQoKSA9PT0gMCwgJ0VSUjpORU1QVFknKQogICAgZHVwCiAgICBpbnRjXzMgLy8gMgogICAgcHVzaGludCA4IC8vIDgKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICAhCiAgICBhc3NlcnQgLy8gRVJSOk5FTVBUWQogICAgLy8gbm9kZV9tb2R1bGVzL0BkMTNjby9zdXBlcmJveC9zbWFydF9jb250cmFjdHMvc3VwZXJib3gvbGliL3N1cGVyYm94LmFsZ28udHM6MjA2CiAgICAvLyBtZXRhQm94LmRlbGV0ZSgpCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjE2MwogICAgLy8gY29tbWl0dGVlQm94LmRlbGV0ZSgpCiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6MTU2CiAgICAvLyBwdWJsaWMgdW5yZWdpc3RlckNvbW1pdHRlZShjb21taXR0ZWVJZDogQ29tbWl0dGVlSWQpOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo6R0dvdlJlZ2lzdHJ5Q29udHJhY3QuaW5nZXN0WEdvdnNbcm91dGluZ10oKSAtPiB2b2lkOgppbmdlc3RYR292czoKICAgIGludGNfMCAvLyAwCiAgICBkdXBuIDEzCiAgICBieXRlY18wIC8vICIiCiAgICBkdXBuIDE5CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czoxNzEKICAgIC8vIHB1YmxpYyBpbmdlc3RYR292cyhjb21taXR0ZWVJZDogQ29tbWl0dGVlSWQsIHhHb3ZzOiBBY2NvdW50V2l0aFZvdGVzW10pOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cG4gMgogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGR1cAogICAgcHVzaGludCAzNiAvLyAzNgogICAgKgogICAgaW50Y18zIC8vIDIKICAgICsKICAgIHVuY292ZXIgMgogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8c21hcnRfY29udHJhY3RzL2Jhc2UvdHlwZXMuYWxnby50czo6QWNjb3VudFdpdGhWb3Rlcz4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjE3MgogICAgLy8gdGhpcy5lbnN1cmVDYWxsZXJJc0FkbWluKCkKICAgIGNhbGxzdWIgZW5zdXJlQ2FsbGVySXNBZG1pbgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6MTc0CiAgICAvLyBjb25zdCBjb21taXR0ZWUgPSB0aGlzLm11c3RHZXRDb21taXR0ZWVNZXRhZGF0YShjb21taXR0ZWVJZCkKICAgIHN3YXAKICAgIGNhbGxzdWIgbXVzdEdldENvbW1pdHRlZU1ldGFkYXRhCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjgyNAogICAgLy8gcmV0dXJuICdTJyArIG1ldGFkYXRhLm51bWVyaWNJZC5hc1VpbnQ2NCgpLnRvU3RyaW5nKCkKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGNhbGxzdWIgaXRvYQogICAgYnl0ZWMgNCAvLyAiUyIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBjb3ZlciAzCiAgICAvLyBub2RlX21vZHVsZXMvQGQxM2NvL3N1cGVyYm94L3NtYXJ0X2NvbnRyYWN0cy9zdXBlcmJveC9saWIvdXRpbHMuYWxnby50czo0NAogICAgLy8gcmV0dXJuIEJveDxTdXBlcmJveE1ldGE+KHsga2V5OiBCeXRlcyhuYW1lKS5jb25jYXQoQnl0ZXMoJ19tJykpIH0pCiAgICBieXRlYyA2IC8vICJfbSIKICAgIGNvbmNhdAogICAgZHVwCiAgICBjb3ZlciAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo3MgogICAgLy8gcmV0dXJuIHNiTWV0YS52YWx1ZS50b3RhbEJ5dGVMZW5ndGguYXNVaW50NjQoKSAvIEFDQ09VTlRfSURfV0lUSF9WT1RFU19TVE9SRURfU0laRQogICAgaW50Y18zIC8vIDIKICAgIHB1c2hpbnQgOCAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgcHVzaGludCA4IC8vIDgKICAgIC8KICAgIGR1cAogICAgY292ZXIgMwogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6MTgwCiAgICAvLyBlbnN1cmUoaW5nZXN0ZWRBY2NvdW50cyArIHhHb3ZzLmxlbmd0aCA8PSBjb21taXR0ZWUudG90YWxNZW1iZXJzLmFzVWludDY0KCksIGVyclRvdGFsWEdvdnNFeGNlZWRlZCkKICAgIHVuY292ZXIgMgogICAgKwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIGV4dHJhY3RfdWludDMyCiAgICA8PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozMwogICAgLy8gaWYgKCFjb25kKSB7CiAgICBibnogaW5nZXN0WEdvdnNfYWZ0ZXJfaWZfZWxzZUA3MgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6MTgwCiAgICAvLyBlbnN1cmUoaW5nZXN0ZWRBY2NvdW50cyArIHhHb3ZzLmxlbmd0aCA8PSBjb21taXR0ZWUudG90YWxNZW1iZXJzLmFzVWludDY0KCksIGVyclRvdGFsWEdvdnNFeGNlZWRlZCkKICAgIHB1c2hieXRlcyAiRVJSOlRYX1hDIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozNAogICAgLy8gbG9nKGNvZGUpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzUKICAgIC8vIGVycigpCiAgICBlcnIKCmluZ2VzdFhHb3ZzX2FmdGVyX2lmX2Vsc2VANzI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czoxODIKICAgIC8vIGxldCBsYXN0QWNjb3VudElkID0gdTMyKDApCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiB1MzIKICAgIGJ1cnkgMzMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjE4MwogICAgLy8gaWYgKGluZ2VzdGVkQWNjb3VudHMgPiAwKSB7CiAgICBkaWcgMQogICAgYnogaW5nZXN0WEdvdnNfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czoxODQKICAgIC8vIGNvbnN0IGxhc3RYR292ID0gdGhpcy5nZXRTdG9yZWRYR292QXQoc3VwZXJib3hOYW1lLCBpbmdlc3RlZEFjY291bnRzIC0gMSkKICAgIGRpZyAxCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZGlnIDQKICAgIHN3YXAKICAgIGNhbGxzdWIgZ2V0U3RvcmVkWEdvdkF0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czoxODUKICAgIC8vIGxhc3RBY2NvdW50SWQgPSBsYXN0WEdvdi5hY2NvdW50SWQKICAgIGV4dHJhY3QgMCA0CiAgICBidXJ5IDMzCgppbmdlc3RYR292c19hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czoxODkKICAgIC8vIGxldCBpbmdlc3RlZFZvdGVzID0gY29tbWl0dGVlLmluZ2VzdGVkVm90ZXMuYXNVaW50NjQoKQogICAgZGlnIDUKICAgIHB1c2hpbnQgMjYgLy8gMjYKICAgIGV4dHJhY3RfdWludDMyCiAgICBidXJ5IDE4CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czoxOTAKICAgIC8vIGxldCB3cml0ZUJ1ZmZlciA9IEJ5dGVzYGAKICAgIGJ5dGVjXzAgLy8gIiIKICAgIGJ1cnkgMzAKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDE3CiAgICBkaWcgMQogICAgYnVyeSAyMAoKaW5nZXN0WEdvdnNfZm9yX2hlYWRlckA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6MTkxCiAgICAvLyBmb3IgKGNvbnN0IHhHb3Ygb2YgY2xvbmUoeEdvdnMpKSB7CiAgICBkaWcgMTYKICAgIGRpZyA3CiAgICA8CiAgICBieiBpbmdlc3RYR292c19hZnRlcl9mb3JANwogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6MTkzCiAgICAvLyBlbnN1cmUoeEdvdi52b3Rlcy5hc1VpbnQ2NCgpID4gMCwgZXJyWmVyb1ZvdGVzKQogICAgZGlnIDcKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMTcKICAgIHB1c2hpbnQgMzYgLy8gMzYKICAgICoKICAgIHB1c2hpbnQgMzYgLy8gMzYKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZHVwCiAgICBidXJ5IDQyCiAgICBkdXAKICAgIGV4dHJhY3QgMzIgNAogICAgYnVyeSA0MQogICAgaW50Y18yIC8vIDMyCiAgICBleHRyYWN0X3VpbnQzMgogICAgZHVwCiAgICBidXJ5IDE1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjMzCiAgICAvLyBpZiAoIWNvbmQpIHsKICAgIGJueiBpbmdlc3RYR292c19hZnRlcl9pZl9lbHNlQDY2CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czoxOTMKICAgIC8vIGVuc3VyZSh4R292LnZvdGVzLmFzVWludDY0KCkgPiAwLCBlcnJaZXJvVm90ZXMpCiAgICBwdXNoYnl0ZXMgIkVSUjpWX1oiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjM0CiAgICAvLyBsb2coY29kZSkKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozNQogICAgLy8gZXJyKCkKICAgIGVycgoKaW5nZXN0WEdvdnNfYWZ0ZXJfaWZfZWxzZUA2NjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjE5NAogICAgLy8gY29uc3QgZ0dvdkFjY291bnQgPSB0aGlzLmdldE9yQ3JlYXRlQWNjb3VudCh4R292LmFjY291bnQpCiAgICBkaWcgNDAKICAgIGV4dHJhY3QgMCAzMgogICAgZHVwCiAgICBidXJ5IDQ0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnlBY2NvdW50LmFsZ28udHM6NjgKICAgIC8vIGNvbnN0IGdHb3ZBY2NvdW50ID0gdGhpcy5nZXRBY2NvdW50SWZFeGlzdHMoYWNjb3VudCkKICAgIGNhbGxzdWIgZ2V0QWNjb3VudElmRXhpc3RzCiAgICBkdXAKICAgIGJ1cnkgMzUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeUFjY291bnQuYWxnby50czo2OQogICAgLy8gaWYgKGdHb3ZBY2NvdW50LmFjY291bnRJZC5hc1VpbnQ2NCgpID09PSAwKSB7CiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MzIKICAgIGJueiBpbmdlc3RYR292c19hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeUFjY291bnQuYWxnby50czo6R0dvdlJlZ2lzdHJ5QWNjb3VudENvbnRyYWN0LmdldE9yQ3JlYXRlQWNjb3VudEAzNQogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5QWNjb3VudC5hbGdvLnRzOjE3CiAgICAvLyBhY2NvdW50cyA9IEJveE1hcDxBY2NvdW50LCBHR292QWNjb3VudD4oeyBrZXlQcmVmaXg6ICdhJyB9KQogICAgYnl0ZWMgOCAvLyAiYSIKICAgIGRpZyA0MwogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgMzkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeUFjY291bnQuYWxnby50czoyNwogICAgLy8gZW5zdXJlKCFib3guZXhpc3RzLCBlcnJBY2NvdW50RXhpc3RzKQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjMzCiAgICAvLyBpZiAoIWNvbmQpIHsKICAgIGJ6IGluZ2VzdFhHb3ZzX2FmdGVyX2lmX2Vsc2VANjIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeUFjY291bnQuYWxnby50czoyNwogICAgLy8gZW5zdXJlKCFib3guZXhpc3RzLCBlcnJBY2NvdW50RXhpc3RzKQogICAgcHVzaGJ5dGVzICJFUlI6QV9FWCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzQKICAgIC8vIGxvZyhjb2RlKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjM1CiAgICAvLyBlcnIoKQogICAgZXJyCgppbmdlc3RYR292c19hZnRlcl9pZl9lbHNlQDYyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5QWNjb3VudC5hbGdvLnRzOjI4CiAgICAvLyB0aGlzLmxhc3RBY2NvdW50SWQudmFsdWUrKwogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeUFjY291bnQuYWxnby50czoxNQogICAgLy8gbGFzdEFjY291bnRJZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSkKICAgIGJ5dGVjIDE4IC8vICJsYXN0QWNjb3VudElkIgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5QWNjb3VudC5hbGdvLnRzOjI4CiAgICAvLyB0aGlzLmxhc3RBY2NvdW50SWQudmFsdWUrKwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnlBY2NvdW50LmFsZ28udHM6MTUKICAgIC8vIGxhc3RBY2NvdW50SWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pCiAgICBieXRlYyAxOCAvLyAibGFzdEFjY291bnRJZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeUFjY291bnQuYWxnby50czoyOAogICAgLy8gdGhpcy5sYXN0QWNjb3VudElkLnZhbHVlKysKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5QWNjb3VudC5hbGdvLnRzOjI5CiAgICAvLyBjb25zdCBhY2NvdW50SWQgPSB1MzIodGhpcy5sYXN0QWNjb3VudElkLnZhbHVlKQogICAgY2FsbHN1YiB1MzIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeUFjY291bnQuYWxnby50czo0NwogICAgLy8gcmV0dXJuIHsgYWNjb3VudElkOiBhY2NvdW50SWQsIGNvbW1pdHRlZU9mZnNldHM6IFtdIH0KICAgIGJ5dGVjIDI0IC8vIDB4MDAwNjAwMDAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5QWNjb3VudC5hbGdvLnRzOjMwCiAgICAvLyBib3gudmFsdWUgPSB0aGlzLmdldEVtcHR5R0dvdkFjY291bnQoYWNjb3VudElkKQogICAgZGlnIDM4CiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgZGlnIDEKICAgIGJveF9wdXQKICAgIGJ1cnkgMzQKCmluZ2VzdFhHb3ZzX2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5QWNjb3VudC5hbGdvLnRzOjpHR292UmVnaXN0cnlBY2NvdW50Q29udHJhY3QuZ2V0T3JDcmVhdGVBY2NvdW50QDM1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6MTk1CiAgICAvLyBjb25zdCBhY2NvdW50SWQgPSBnR292QWNjb3VudC5hY2NvdW50SWQKICAgIGRpZyAzMwogICAgZHVwCiAgICBleHRyYWN0IDAgNAogICAgYnVyeSA0MwogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjE5NwogICAgLy8gZW5zdXJlKGFjY291bnRJZC5hc1VpbnQ2NCgpID4gbGFzdEFjY291bnRJZC5hc1VpbnQ2NCgpLCBlcnJPdXRPZk9yZGVyKQogICAgZXh0cmFjdF91aW50MzIKICAgIGRpZyAzMwogICAgYnRvaQogICAgPgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozMwogICAgLy8gaWYgKCFjb25kKSB7CiAgICBibnogaW5nZXN0WEdvdnNfYWZ0ZXJfaWZfZWxzZUA1OAogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6MTk3CiAgICAvLyBlbnN1cmUoYWNjb3VudElkLmFzVWludDY0KCkgPiBsYXN0QWNjb3VudElkLmFzVWludDY0KCksIGVyck91dE9mT3JkZXIpCiAgICBieXRlYyAyNSAvLyAiRVJSOk9PTyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzQKICAgIC8vIGxvZyhjb2RlKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjM1CiAgICAvLyBlcnIoKQogICAgZXJyCgppbmdlc3RYR292c19hZnRlcl9pZl9lbHNlQDU4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6MTk5LTIwMgogICAgLy8gY29uc3QgeEdvdlN0b3JlZDogQWNjb3VudElkV2l0aFZvdGVzID0gewogICAgLy8gICBhY2NvdW50SWQ6IGFjY291bnRJZCwKICAgIC8vICAgdm90ZXM6IHhHb3Yudm90ZXMsCiAgICAvLyB9CiAgICBkaWcgNDEKICAgIGRpZyA0MAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czoyMDQKICAgIC8vIHdyaXRlQnVmZmVyID0gd3JpdGVCdWZmZXIuY29uY2F0KGVuY29kZUFyYzQoeEdvdlN0b3JlZCkpCiAgICBkaWcgMzAKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnVyeSAzMAogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6MjA1CiAgICAvLyB0aGlzLmFkZENvbW1pdHRlZUFjY291bnRPZmZzZXRIaW50KGNvbW1pdHRlZS5udW1lcmljSWQsIHhHb3YuYWNjb3VudCwgZ0dvdkFjY291bnQsIHUxNihpbmdlc3RlZEFjY291bnRDdHIrKykpCiAgICBkaWcgNQogICAgZXh0cmFjdCAwIDIKICAgIGJ1cnkgMzcKICAgIGRpZyAxOQogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAyMAogICAgY2FsbHN1YiB1MTYKICAgIGJ1cnkgMzEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeUFjY291bnQuYWxnby50czo5MwogICAgLy8gZm9yIChjb25zdCBbY051bUlkLCBfXSBvZiBjbG9uZShnR292QWNjb3VudC5jb21taXR0ZWVPZmZzZXRzKSkgewogICAgZGlnIDMzCiAgICBkdXAKICAgIHB1c2hpbnQgNCAvLyA0CiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBidXJ5IDI4CiAgICBkdXAKICAgIGxlbgogICAgc3dhcAogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBidXJ5IDQwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgYnVyeSAyOQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMTYKCmluZ2VzdFhHb3ZzX2Zvcl9oZWFkZXJAMzc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnlBY2NvdW50LmFsZ28udHM6OTMKICAgIC8vIGZvciAoY29uc3QgW2NOdW1JZCwgX10gb2YgY2xvbmUoZ0dvdkFjY291bnQuY29tbWl0dGVlT2Zmc2V0cykpIHsKICAgIGRpZyAxNQogICAgZGlnIDI5CiAgICA8CiAgICBieiBpbmdlc3RYR292c19hZnRlcl9mb3JAMzkKICAgIGRpZyAzOAogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAxNgogICAgcHVzaGludCA0IC8vIDQKICAgICoKICAgIHB1c2hpbnQgNCAvLyA0CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnlBY2NvdW50LmFsZ28udHM6OTQKICAgIC8vIGVuc3VyZShjTnVtSWQuYXNVaW50NjQoKSAhPT0gY29tbWl0dGVlTnVtSWQuYXNVaW50NjQoKSwgZXJyQWNjb3VudE9mZnNldEV4aXN0cykKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgNQogICAgIT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzMKICAgIC8vIGlmICghY29uZCkgewogICAgYm56IGluZ2VzdFhHb3ZzX2FmdGVyX2lmX2Vsc2VANTQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeUFjY291bnQuYWxnby50czo5NAogICAgLy8gZW5zdXJlKGNOdW1JZC5hc1VpbnQ2NCgpICE9PSBjb21taXR0ZWVOdW1JZC5hc1VpbnQ2NCgpLCBlcnJBY2NvdW50T2Zmc2V0RXhpc3RzKQogICAgcHVzaGJ5dGVzICJFUlI6QU9fRVgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjM0CiAgICAvLyBsb2coY29kZSkKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozNQogICAgLy8gZXJyKCkKICAgIGVycgoKaW5nZXN0WEdvdnNfYWZ0ZXJfaWZfZWxzZUA1NDoKICAgIGRpZyAxNQogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMTYKICAgIGIgaW5nZXN0WEdvdnNfZm9yX2hlYWRlckAzNwoKaW5nZXN0WEdvdnNfYWZ0ZXJfZm9yQDM5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5QWNjb3VudC5hbGdvLnRzOjk2CiAgICAvLyBnR292QWNjb3VudC5jb21taXR0ZWVPZmZzZXRzLnB1c2goW2NvbW1pdHRlZU51bUlkLCBvZmZzZXRdKQogICAgZGlnIDM2CiAgICBkaWcgMzEKICAgIGNvbmNhdAogICAgZGlnIDM5CiAgICBzd2FwCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIGRpZyAyOQogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICBkaWcgMzQKICAgIGludGNfMCAvLyAwCiAgICBkaWcgMjgKICAgIGV4dHJhY3QzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeUFjY291bnQuYWxnby50czoxNwogICAgLy8gYWNjb3VudHMgPSBCb3hNYXA8QWNjb3VudCwgR0dvdkFjY291bnQ+KHsga2V5UHJlZml4OiAnYScgfSkKICAgIGJ5dGVjIDggLy8gImEiCiAgICBkaWcgNDQKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5QWNjb3VudC5hbGdvLnRzOjk3CiAgICAvLyB0aGlzLmFjY291bnRzKGFjY291bnQpLnZhbHVlID0gY2xvbmUoZ0dvdkFjY291bnQpCiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6MjA3CiAgICAvLyBpbmdlc3RlZFZvdGVzICs9IHhHb3Yudm90ZXMuYXNVaW50NjQoKQogICAgZGlnIDE3CiAgICBkaWcgMTQKICAgICsKICAgIGJ1cnkgMTgKICAgIGRpZyAxNgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMTcKICAgIGRpZyAxOAogICAgYnVyeSAyMAogICAgZGlnIDQxCiAgICBidXJ5IDMzCiAgICBiIGluZ2VzdFhHb3ZzX2Zvcl9oZWFkZXJANAoKaW5nZXN0WEdvdnNfYWZ0ZXJfZm9yQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czoyMTEKICAgIC8vIGVuc3VyZShpbmdlc3RlZFZvdGVzIDw9IGNvbW1pdHRlZS50b3RhbFZvdGVzLmFzVWludDY0KCksIGVyclRvdGFsVm90ZXNFeGNlZWRlZCkKICAgIGRpZyA1CiAgICBwdXNoaW50IDE0IC8vIDE0CiAgICBleHRyYWN0X3VpbnQzMgogICAgZGlnIDE4CiAgICA+PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozMwogICAgLy8gaWYgKCFjb25kKSB7CiAgICBibnogaW5nZXN0WEdvdnNfYWZ0ZXJfaWZfZWxzZUA1MAogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6MjExCiAgICAvLyBlbnN1cmUoaW5nZXN0ZWRWb3RlcyA8PSBjb21taXR0ZWUudG90YWxWb3Rlcy5hc1VpbnQ2NCgpLCBlcnJUb3RhbFZvdGVzRXhjZWVkZWQpCiAgICBwdXNoYnl0ZXMgIkVSUjpUVl9YQyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzQKICAgIC8vIGxvZyhjb2RlKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjM1CiAgICAvLyBlcnIoKQogICAgZXJyCgppbmdlc3RYR292c19hZnRlcl9pZl9lbHNlQDUwOgogICAgLy8gbm9kZV9tb2R1bGVzL0BkMTNjby9zdXBlcmJveC9zbWFydF9jb250cmFjdHMvc3VwZXJib3gvbGliL3N1cGVyYm94LmFsZ28udHM6MzMKICAgIC8vIGNvbnN0IG1ldGEgPSBzYk1ldGFCb3hWYWx1ZShuYW1lKQogICAgZGlnIDMKICAgIGNhbGxzdWIgc2JNZXRhQm94VmFsdWUKICAgIGR1cAogICAgYnVyeSAzMwogICAgLy8gbm9kZV9tb2R1bGVzL0BkMTNjby9zdXBlcmJveC9zbWFydF9jb250cmFjdHMvc3VwZXJib3gvbGliL3N1cGVyYm94LmFsZ28udHM6MzQKICAgIC8vIGNvbnN0IG1heEJveFNpemUgPSBtZXRhLm1heEJveFNpemUuYXNVaW50NjQoKQogICAgZHVwCiAgICBwdXNoaW50IDEwIC8vIDEwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgYnVyeSAxNgogICAgLy8gbm9kZV9tb2R1bGVzL0BkMTNjby9zdXBlcmJveC9zbWFydF9jb250cmFjdHMvc3VwZXJib3gvbGliL3N1cGVyYm94LmFsZ28udHM6MzUKICAgIC8vIGNvbnN0IHZhbHVlU2l6ZSA9IG1ldGEudmFsdWVTaXplLmFzVWludDY0KCkKICAgIGR1cAogICAgcHVzaGludCAxOCAvLyAxOAogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgYnVyeSAxMgogICAgLy8gbm9kZV9tb2R1bGVzL0BkMTNjby9zdXBlcmJveC9zbWFydF9jb250cmFjdHMvc3VwZXJib3gvbGliL3N1cGVyYm94LmFsZ28udHM6MzgKICAgIC8vIGFzc2VydChkYXRhLmxlbmd0aCAlIHZhbHVlU2l6ZSA9PT0gMCwgJ0VSUjpEQVRBTEVOJykKICAgIGRpZyAzMQogICAgbGVuCiAgICBkdXAKICAgIGJ1cnkgMTQKICAgIHN3YXAKICAgICUKICAgICEKICAgIGFzc2VydCAvLyBFUlI6REFUQUxFTgogICAgLy8gbm9kZV9tb2R1bGVzL0BkMTNjby9zdXBlcmJveC9zbWFydF9jb250cmFjdHMvc3VwZXJib3gvbGliL3N1cGVyYm94LmFsZ28udHM6NDAKICAgIC8vIGxldCBjdXJyZW50Qm94TnVtOiB1aW50NjQgPSBtZXRhLmJveEJ5dGVMZW5ndGhzLmxlbmd0aCA9PT0gMCA/IDAgOiBtZXRhLmJveEJ5dGVMZW5ndGhzLmxlbmd0aCAtIDEKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgcHVzaGludCAyNiAvLyAyNgogICAgZXh0cmFjdF91aW50MTYKICAgIHN1YnN0cmluZzMKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIGJ1cnkgMjkKICAgIGJueiBpbmdlc3RYR292c190ZXJuYXJ5X2ZhbHNlQDEyCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSAyMgoKaW5nZXN0WEdvdnNfdGVybmFyeV9tZXJnZUAxMzoKICAgIC8vIG5vZGVfbW9kdWxlcy9AZDEzY28vc3VwZXJib3gvc21hcnRfY29udHJhY3RzL3N1cGVyYm94L2xpYi9zdXBlcmJveC5hbGdvLnRzOjQyCiAgICAvLyBsZXQgZGF0YVdyaXR0ZW46IHVpbnQ2NCA9IDAKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDIxCgppbmdlc3RYR292c193aGlsZV90b3BAMTQ6CiAgICAvLyBub2RlX21vZHVsZXMvQGQxM2NvL3N1cGVyYm94L3NtYXJ0X2NvbnRyYWN0cy9zdXBlcmJveC9saWIvc3VwZXJib3guYWxnby50czo0NAogICAgLy8gd2hpbGUgKGRhdGFXcml0dGVuIDwgZGF0YS5sZW5ndGgpIHsKICAgIGRpZyAyMAogICAgZGlnIDExCiAgICA8CiAgICAvLyBub2RlX21vZHVsZXMvQGQxM2NvL3N1cGVyYm94L3NtYXJ0X2NvbnRyYWN0cy9zdXBlcmJveC9saWIvc3VwZXJib3guYWxnby50czo0NC01OAogICAgLy8gd2hpbGUgKGRhdGFXcml0dGVuIDwgZGF0YS5sZW5ndGgpIHsKICAgIC8vICAgY29uc3QgZGF0YUJveCA9IHNiRGF0YUJveFJlZihuYW1lLCBjdXJyZW50Qm94TnVtKQogICAgLy8gICBjb25zdCBjaHVua1dyaXR0ZW4gPSBhcHBlbmRCb3goZGF0YUJveCwgZGF0YS5zbGljZShkYXRhV3JpdHRlbiwgZGF0YVdyaXR0ZW4gKyBtYXhCb3hTaXplKSwgbWF4Qm94U2l6ZSwgdmFsdWVTaXplKQogICAgLy8gCiAgICAvLyAgIGlmIChtZXRhLmJveEJ5dGVMZW5ndGhzLmxlbmd0aCA9PT0gY3VycmVudEJveE51bSkgewogICAgLy8gICAgIC8vIG5ldyBib3gKICAgIC8vICAgICBtZXRhLmJveEJ5dGVMZW5ndGhzLnB1c2goYXUxNihjaHVua1dyaXR0ZW4pKQogICAgLy8gICB9IGVsc2UgewogICAgLy8gICAgIC8vIGV4aXN0aW5nIGJveAogICAgLy8gICAgIG1ldGEuYm94Qnl0ZUxlbmd0aHNbY3VycmVudEJveE51bV0gPSBhdTE2KG1ldGEuYm94Qnl0ZUxlbmd0aHNbY3VycmVudEJveE51bV0uYXNVaW50NjQoKSArIGNodW5rV3JpdHRlbikKICAgIC8vICAgfQogICAgLy8gCiAgICAvLyAgIGRhdGFXcml0dGVuICs9IGNodW5rV3JpdHRlbgogICAgLy8gICBjdXJyZW50Qm94TnVtKysKICAgIC8vIH0KICAgIGJ6IGluZ2VzdFhHb3ZzX2FmdGVyX3doaWxlQDMwCiAgICAvLyBub2RlX21vZHVsZXMvQGQxM2NvL3N1cGVyYm94L3NtYXJ0X2NvbnRyYWN0cy9zdXBlcmJveC9saWIvdXRpbHMuYWxnby50czoyNQogICAgLy8gcmV0dXJuIEJ5dGVzKG5hbWUpLmNvbmNhdChCeXRlcygnXycpKS5jb25jYXQoQnl0ZXMoaXRvYShudW0pKSkKICAgIGRpZyAzCiAgICBieXRlYyAxNiAvLyAiXyIKICAgIGNvbmNhdAogICAgZGlnIDIyCiAgICBjYWxsc3ViIEBkMTNjby9zdXBlcmJveC9zbWFydF9jb250cmFjdHMvc3VwZXJib3gvbGliL3V0aWxzLmFsZ28udHM6Oml0b2EKICAgIGNvbmNhdAogICAgZHVwCiAgICBidXJ5IDM2CiAgICAvLyBub2RlX21vZHVsZXMvQGQxM2NvL3N1cGVyYm94L3NtYXJ0X2NvbnRyYWN0cy9zdXBlcmJveC9saWIvc3VwZXJib3guYWxnby50czo0NgogICAgLy8gY29uc3QgY2h1bmtXcml0dGVuID0gYXBwZW5kQm94KGRhdGFCb3gsIGRhdGEuc2xpY2UoZGF0YVdyaXR0ZW4sIGRhdGFXcml0dGVuICsgbWF4Qm94U2l6ZSksIG1heEJveFNpemUsIHZhbHVlU2l6ZSkKICAgIGRpZyAyMQogICAgZHVwCiAgICBkaWcgMTMKICAgIGR1cAogICAgY292ZXIgMwogICAgPj0KICAgIGRpZyAxCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHN3YXAKICAgIGRpZyAxOAogICAgKwogICAgZHVwCiAgICBkaWcgMwogICAgPj0KICAgIHN3YXAKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIGR1cAogICAgZGlnIDIKICAgIDwKICAgIGRpZyAyCiAgICBzd2FwCiAgICBzZWxlY3QKICAgIGRpZyAzMgogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgYnVyeSAzNwogICAgLy8gbm9kZV9tb2R1bGVzL0BkMTNjby9zdXBlcmJveC9zbWFydF9jb250cmFjdHMvc3VwZXJib3gvbGliL3N1cGVyYm94LmFsZ28udHM6NzcKICAgIC8vIGlmIChib3guZXhpc3RzKSB7CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGluZ2VzdFhHb3ZzX2Vsc2VfYm9keUAyMwogICAgLy8gbm9kZV9tb2R1bGVzL0BkMTNjby9zdXBlcmJveC9zbWFydF9jb250cmFjdHMvc3VwZXJib3gvbGliL3N1cGVyYm94LmFsZ28udHM6NzkKICAgIC8vIGxldCBjYXBhY2l0eTogdWludDY0ID0gbWF4Qm94U2l6ZSAtIGJveC5sZW5ndGgKICAgIGRpZyAzNAogICAgYm94X2xlbgogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIGRpZyAxNQogICAgc3dhcAogICAgLQogICAgZHVwCiAgICBidXJ5IDI1CiAgICAvLyBub2RlX21vZHVsZXMvQGQxM2NvL3N1cGVyYm94L3NtYXJ0X2NvbnRyYWN0cy9zdXBlcmJveC9saWIvc3VwZXJib3guYWxnby50czo4MQogICAgLy8gaWYgKGNhcGFjaXR5IDwgdmFsdWVTaXplKSByZXR1cm4gMAogICAgZGlnIDEwCiAgICA8CiAgICBieiBpbmdlc3RYR292c19hZnRlcl9pZl9lbHNlQDE4CiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSAyMwoKaW5nZXN0WEdvdnNfYWZ0ZXJfaW5saW5lZF9AZDEzY28vc3VwZXJib3gvc21hcnRfY29udHJhY3RzL3N1cGVyYm94L2xpYi9zdXBlcmJveC5hbGdvLnRzOjphcHBlbmRCb3hAMjY6CiAgICAvLyBub2RlX21vZHVsZXMvQGQxM2NvL3N1cGVyYm94L3NtYXJ0X2NvbnRyYWN0cy9zdXBlcmJveC9saWIvc3VwZXJib3guYWxnby50czo0OAogICAgLy8gaWYgKG1ldGEuYm94Qnl0ZUxlbmd0aHMubGVuZ3RoID09PSBjdXJyZW50Qm94TnVtKSB7CiAgICBkaWcgMzEKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgMjcKICAgIGR1cAogICAgcHVzaGludCAyNiAvLyAyNgogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgY292ZXIgMwogICAgc3dhcAogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBidXJ5IDMwCiAgICBkaWcgMjQKICAgID09CiAgICBieiBpbmdlc3RYR292c19lbHNlX2JvZHlAMjgKICAgIC8vIG5vZGVfbW9kdWxlcy9AZDEzY28vc3VwZXJib3gvc21hcnRfY29udHJhY3RzL3N1cGVyYm94L2xpYi9zdXBlcmJveC5hbGdvLnRzOjUwCiAgICAvLyBtZXRhLmJveEJ5dGVMZW5ndGhzLnB1c2goYXUxNihjaHVua1dyaXR0ZW4pKQogICAgZGlnIDI0CiAgICBjYWxsc3ViIGF1MTYKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBkaWcgMjgKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcmVwbGFjZTIgMAogICAgZGlnIDMzCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMCAvLyAwCiAgICBkaWcgMjkKICAgIGR1cAogICAgY292ZXIgNQogICAgZXh0cmFjdDMKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGRpZyAyCiAgICBsZW4KICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciA1CiAgICBkdXAKICAgIGNvdmVyIDMKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICB1bmNvdmVyIDQKICAgIC0KICAgIHVuY292ZXIgMwogICAgbGVuCiAgICB1bmNvdmVyIDMKICAgICsKICAgIHN3YXAKICAgIC0KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAyNgogICAgYnVyeSAzMgoKaW5nZXN0WEdvdnNfYWZ0ZXJfaWZfZWxzZUAyOToKICAgIC8vIG5vZGVfbW9kdWxlcy9AZDEzY28vc3VwZXJib3gvc21hcnRfY29udHJhY3RzL3N1cGVyYm94L2xpYi9zdXBlcmJveC5hbGdvLnRzOjU2CiAgICAvLyBkYXRhV3JpdHRlbiArPSBjaHVua1dyaXR0ZW4KICAgIGRpZyAyMAogICAgZGlnIDIzCiAgICArCiAgICBidXJ5IDIxCiAgICAvLyBub2RlX21vZHVsZXMvQGQxM2NvL3N1cGVyYm94L3NtYXJ0X2NvbnRyYWN0cy9zdXBlcmJveC9saWIvc3VwZXJib3guYWxnby50czo1NwogICAgLy8gY3VycmVudEJveE51bSsrCiAgICBkaWcgMjEKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDIyCiAgICBiIGluZ2VzdFhHb3ZzX3doaWxlX3RvcEAxNAoKaW5nZXN0WEdvdnNfZWxzZV9ib2R5QDI4OgogICAgLy8gbm9kZV9tb2R1bGVzL0BkMTNjby9zdXBlcmJveC9zbWFydF9jb250cmFjdHMvc3VwZXJib3gvbGliL3N1cGVyYm94LmFsZ28udHM6NTMKICAgIC8vIG1ldGEuYm94Qnl0ZUxlbmd0aHNbY3VycmVudEJveE51bV0gPSBhdTE2KG1ldGEuYm94Qnl0ZUxlbmd0aHNbY3VycmVudEJveE51bV0uYXNVaW50NjQoKSArIGNodW5rV3JpdHRlbikKICAgIHN3YXAKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAyNAogICAgaW50Y18zIC8vIDIKICAgICoKICAgIHN3YXAKICAgIGRpZyAxCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDI2CiAgICArCiAgICBjYWxsc3ViIGF1MTYKICAgIHN3YXAKICAgIGludGNfMyAvLyAyCiAgICArCiAgICBzd2FwCiAgICByZXBsYWNlMyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAzMwogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzAgLy8gMAogICAgZGlnIDI5CiAgICBkdXAKICAgIGNvdmVyIDUKICAgIGV4dHJhY3QzCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgMgogICAgbGVuCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgNQogICAgZHVwCiAgICBjb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgMQogICAgdW5jb3ZlciA0CiAgICAtCiAgICB1bmNvdmVyIDMKICAgIGxlbgogICAgdW5jb3ZlciAzCiAgICArCiAgICBzd2FwCiAgICAtCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcmVwbGFjZTIgMjYKICAgIGJ1cnkgMzIKICAgIGIgaW5nZXN0WEdvdnNfYWZ0ZXJfaWZfZWxzZUAyOQoKaW5nZXN0WEdvdnNfYWZ0ZXJfaWZfZWxzZUAxODoKICAgIC8vIG5vZGVfbW9kdWxlcy9AZDEzY28vc3VwZXJib3gvc21hcnRfY29udHJhY3RzL3N1cGVyYm94L2xpYi9zdXBlcmJveC5hbGdvLnRzOjgzCiAgICAvLyBpZiAoY2FwYWNpdHkgJSB2YWx1ZVNpemUgIT09IDApIHsKICAgIGRpZyAyMwogICAgZGlnIDEwCiAgICAlCiAgICBkdXAKICAgIGJ1cnkgMTMKICAgIGJ6IGluZ2VzdFhHb3ZzX2FmdGVyX2lmX2Vsc2VAMjAKICAgIC8vIG5vZGVfbW9kdWxlcy9AZDEzY28vc3VwZXJib3gvc21hcnRfY29udHJhY3RzL3N1cGVyYm94L2xpYi9zdXBlcmJveC5hbGdvLnRzOjg0CiAgICAvLyBjYXBhY2l0eSAtPSBjYXBhY2l0eSAlIHZhbHVlU2l6ZQogICAgZGlnIDIzCiAgICBkaWcgMTIKICAgIC0KICAgIGJ1cnkgMjQKCmluZ2VzdFhHb3ZzX2FmdGVyX2lmX2Vsc2VAMjA6CiAgICAvLyBub2RlX21vZHVsZXMvQGQxM2NvL3N1cGVyYm94L3NtYXJ0X2NvbnRyYWN0cy9zdXBlcmJveC9saWIvc3VwZXJib3guYWxnby50czo4NgogICAgLy8gaWYgKGRhdGEubGVuZ3RoID4gY2FwYWNpdHkpIHsKICAgIGRpZyAzNQogICAgbGVuCiAgICBkdXAKICAgIGRpZyAyNQogICAgPgogICAgYnogaW5nZXN0WEdvdnNfZWxzZV9ib2R5QDIyCiAgICAvLyBub2RlX21vZHVsZXMvQGQxM2NvL3N1cGVyYm94L3NtYXJ0X2NvbnRyYWN0cy9zdXBlcmJveC9saWIvc3VwZXJib3guYWxnby50czo4OAogICAgLy8gY29uc3Qgb3JpZ2luYWxCb3hMZW5ndGggPSBib3gubGVuZ3RoCiAgICBkaWcgMzUKICAgIGR1cAogICAgYm94X2xlbgogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIC8vIG5vZGVfbW9kdWxlcy9AZDEzY28vc3VwZXJib3gvc21hcnRfY29udHJhY3RzL3N1cGVyYm94L2xpYi9zdXBlcmJveC5hbGdvLnRzOjg5CiAgICAvLyBib3gucmVzaXplKGJveC5sZW5ndGggKyBjYXBhY2l0eSkKICAgIGR1cAogICAgZGlnIDI3CiAgICBkdXAKICAgIGNvdmVyIDMKICAgICsKICAgIGRpZyAzCiAgICBzd2FwCiAgICBib3hfcmVzaXplCiAgICAvLyBub2RlX21vZHVsZXMvQGQxM2NvL3N1cGVyYm94L3NtYXJ0X2NvbnRyYWN0cy9zdXBlcmJveC9saWIvc3VwZXJib3guYWxnby50czo5MAogICAgLy8gYm94LnJlcGxhY2Uob3JpZ2luYWxCb3hMZW5ndGgsIGRhdGEuc2xpY2UoMCwgY2FwYWNpdHkpKQogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgNAogICAgZHVwCiAgICBjb3ZlciAyCiAgICA+PQogICAgaW50Y18wIC8vIDAKICAgIGRpZyAyCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgZGlnIDMKICAgIGRpZyAyCiAgICA+PQogICAgZGlnIDQKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIGRpZyA0MAogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgdW5jb3ZlciAzCiAgICBjb3ZlciAyCiAgICBib3hfcmVwbGFjZQogICAgYnVyeSAyMwogICAgLy8gbm9kZV9tb2R1bGVzL0BkMTNjby9zdXBlcmJveC9zbWFydF9jb250cmFjdHMvc3VwZXJib3gvbGliL3N1cGVyYm94LmFsZ28udHM6NDYKICAgIC8vIGNvbnN0IGNodW5rV3JpdHRlbiA9IGFwcGVuZEJveChkYXRhQm94LCBkYXRhLnNsaWNlKGRhdGFXcml0dGVuLCBkYXRhV3JpdHRlbiArIG1heEJveFNpemUpLCBtYXhCb3hTaXplLCB2YWx1ZVNpemUpCiAgICBiIGluZ2VzdFhHb3ZzX2FmdGVyX2lubGluZWRfQGQxM2NvL3N1cGVyYm94L3NtYXJ0X2NvbnRyYWN0cy9zdXBlcmJveC9saWIvc3VwZXJib3guYWxnby50czo6YXBwZW5kQm94QDI2Cgppbmdlc3RYR292c19lbHNlX2JvZHlAMjI6CiAgICAvLyBub2RlX21vZHVsZXMvQGQxM2NvL3N1cGVyYm94L3NtYXJ0X2NvbnRyYWN0cy9zdXBlcmJveC9saWIvc3VwZXJib3guYWxnby50czo5NAogICAgLy8gY29uc3Qgb3JpZ2luYWxCb3hMZW5ndGggPSBib3gubGVuZ3RoCiAgICBkaWcgMzUKICAgIGR1cAogICAgYm94X2xlbgogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIC8vIG5vZGVfbW9kdWxlcy9AZDEzY28vc3VwZXJib3gvc21hcnRfY29udHJhY3RzL3N1cGVyYm94L2xpYi9zdXBlcmJveC5hbGdvLnRzOjk1CiAgICAvLyBib3gucmVzaXplKGJveC5sZW5ndGggKyBkYXRhLmxlbmd0aCkKICAgIGR1cAogICAgZGlnIDMKICAgICsKICAgIGRpZyAyCiAgICBzd2FwCiAgICBib3hfcmVzaXplCiAgICAvLyBub2RlX21vZHVsZXMvQGQxM2NvL3N1cGVyYm94L3NtYXJ0X2NvbnRyYWN0cy9zdXBlcmJveC9saWIvc3VwZXJib3guYWxnby50czo5NgogICAgLy8gYm94LnJlcGxhY2Uob3JpZ2luYWxCb3hMZW5ndGgsIGRhdGEpCiAgICBkaWcgMzgKICAgIGJveF9yZXBsYWNlCiAgICBidXJ5IDIzCiAgICAvLyBub2RlX21vZHVsZXMvQGQxM2NvL3N1cGVyYm94L3NtYXJ0X2NvbnRyYWN0cy9zdXBlcmJveC9saWIvc3VwZXJib3guYWxnby50czo0NgogICAgLy8gY29uc3QgY2h1bmtXcml0dGVuID0gYXBwZW5kQm94KGRhdGFCb3gsIGRhdGEuc2xpY2UoZGF0YVdyaXR0ZW4sIGRhdGFXcml0dGVuICsgbWF4Qm94U2l6ZSksIG1heEJveFNpemUsIHZhbHVlU2l6ZSkKICAgIGIgaW5nZXN0WEdvdnNfYWZ0ZXJfaW5saW5lZF9AZDEzY28vc3VwZXJib3gvc21hcnRfY29udHJhY3RzL3N1cGVyYm94L2xpYi9zdXBlcmJveC5hbGdvLnRzOjphcHBlbmRCb3hAMjYKCmluZ2VzdFhHb3ZzX2Vsc2VfYm9keUAyMzoKICAgIC8vIG5vZGVfbW9kdWxlcy9AZDEzY28vc3VwZXJib3gvc21hcnRfY29udHJhY3RzL3N1cGVyYm94L2xpYi9zdXBlcmJveC5hbGdvLnRzOjEwMwogICAgLy8gaWYgKGNhcGFjaXR5ICUgdmFsdWVTaXplICE9PSAwKSB7CiAgICBkaWcgMTQKICAgIGRpZyAxMAogICAgJQogICAgZHVwCiAgICBidXJ5IDE0CiAgICBibnogaW5nZXN0WEdvdnNfaWZfYm9keUAyNAogICAgZGlnIDE0Cgppbmdlc3RYR292c19hZnRlcl9pZl9lbHNlQDI1OgogICAgLy8gbm9kZV9tb2R1bGVzL0BkMTNjby9zdXBlcmJveC9zbWFydF9jb250cmFjdHMvc3VwZXJib3gvbGliL3N1cGVyYm94LmFsZ28udHM6MTA2CiAgICAvLyBjb25zdCBkYXRhVG9Xcml0ZSA9IGRhdGEuc2xpY2UoMCwgY2FwYWNpdHkpCiAgICBkaWcgMzYKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gMAogICAgZGlnIDEKICAgID49CiAgICBpbnRjXzAgLy8gMAogICAgZGlnIDIKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICB1bmNvdmVyIDMKICAgIGR1cAogICAgZGlnIDMKICAgID49CiAgICBzd2FwCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBzdWJzdHJpbmczCiAgICAvLyBub2RlX21vZHVsZXMvQGQxM2NvL3N1cGVyYm94L3NtYXJ0X2NvbnRyYWN0cy9zdXBlcmJveC9saWIvc3VwZXJib3guYWxnby50czoxMDcKICAgIC8vIGJveC52YWx1ZSA9IGRhdGFUb1dyaXRlCiAgICBkaWcgMzUKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBkaWcgMQogICAgYm94X3B1dAogICAgLy8gbm9kZV9tb2R1bGVzL0BkMTNjby9zdXBlcmJveC9zbWFydF9jb250cmFjdHMvc3VwZXJib3gvbGliL3N1cGVyYm94LmFsZ28udHM6MTA4CiAgICAvLyByZXR1cm4gZGF0YVRvV3JpdGUubGVuZ3RoCiAgICBsZW4KICAgIGJ1cnkgMjMKICAgIC8vIG5vZGVfbW9kdWxlcy9AZDEzY28vc3VwZXJib3gvc21hcnRfY29udHJhY3RzL3N1cGVyYm94L2xpYi9zdXBlcmJveC5hbGdvLnRzOjQ2CiAgICAvLyBjb25zdCBjaHVua1dyaXR0ZW4gPSBhcHBlbmRCb3goZGF0YUJveCwgZGF0YS5zbGljZShkYXRhV3JpdHRlbiwgZGF0YVdyaXR0ZW4gKyBtYXhCb3hTaXplKSwgbWF4Qm94U2l6ZSwgdmFsdWVTaXplKQogICAgYiBpbmdlc3RYR292c19hZnRlcl9pbmxpbmVkX0BkMTNjby9zdXBlcmJveC9zbWFydF9jb250cmFjdHMvc3VwZXJib3gvbGliL3N1cGVyYm94LmFsZ28udHM6OmFwcGVuZEJveEAyNgoKaW5nZXN0WEdvdnNfaWZfYm9keUAyNDoKICAgIC8vIG5vZGVfbW9kdWxlcy9AZDEzY28vc3VwZXJib3gvc21hcnRfY29udHJhY3RzL3N1cGVyYm94L2xpYi9zdXBlcmJveC5hbGdvLnRzOjEwNAogICAgLy8gY2FwYWNpdHkgLT0gY2FwYWNpdHkgJSB2YWx1ZVNpemUKICAgIGRpZyAxNAogICAgZGlnIDEzCiAgICAtCiAgICBiIGluZ2VzdFhHb3ZzX2FmdGVyX2lmX2Vsc2VAMjUKCmluZ2VzdFhHb3ZzX2FmdGVyX3doaWxlQDMwOgogICAgLy8gbm9kZV9tb2R1bGVzL0BkMTNjby9zdXBlcmJveC9zbWFydF9jb250cmFjdHMvc3VwZXJib3gvbGliL3N1cGVyYm94LmFsZ28udHM6NTkKICAgIC8vIG1ldGEudG90YWxCeXRlTGVuZ3RoID0gYXU2NChtZXRhLnRvdGFsQnl0ZUxlbmd0aC5hc1VpbnQ2NCgpICsgZGF0YVdyaXR0ZW4pCiAgICBkaWcgMzEKICAgIGR1cAogICAgaW50Y18zIC8vIDIKICAgIGV4dHJhY3RfdWludDY0CiAgICBkaWcgMjIKICAgICsKICAgIC8vIG5vZGVfbW9kdWxlcy9AZDEzY28vc3VwZXJib3gvc21hcnRfY29udHJhY3RzL3N1cGVyYm94L2xpYi90eXBlcy5hbGdvLnRzOjM1CiAgICAvLyByZXR1cm4gbmV3IFVpbnQ2NChudW0pCiAgICBpdG9iCiAgICAvLyBub2RlX21vZHVsZXMvQGQxM2NvL3N1cGVyYm94L3NtYXJ0X2NvbnRyYWN0cy9zdXBlcmJveC9saWIvc3VwZXJib3guYWxnby50czo1OQogICAgLy8gbWV0YS50b3RhbEJ5dGVMZW5ndGggPSBhdTY0KG1ldGEudG90YWxCeXRlTGVuZ3RoLmFzVWludDY0KCkgKyBkYXRhV3JpdHRlbikKICAgIHJlcGxhY2UyIDIKICAgIC8vIG5vZGVfbW9kdWxlcy9AZDEzY28vc3VwZXJib3gvc21hcnRfY29udHJhY3RzL3N1cGVyYm94L2xpYi9zdXBlcmJveC5hbGdvLnRzOjYyCiAgICAvLyBtZXRhQm94LmRlbGV0ZSgpCiAgICBkaWcgMwogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIG5vZGVfbW9kdWxlcy9AZDEzY28vc3VwZXJib3gvc21hcnRfY29udHJhY3RzL3N1cGVyYm94L2xpYi9zdXBlcmJveC5hbGdvLnRzOjYzCiAgICAvLyBtZXRhQm94LnZhbHVlID0gY2xvbmUobWV0YSkKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czoyMTUKICAgIC8vIGNvbW1pdHRlZS5pbmdlc3RlZFZvdGVzID0gdTMyKGluZ2VzdGVkVm90ZXMpCiAgICBkaWcgMTcKICAgIGNhbGxzdWIgdTMyCiAgICBkaWcgNgogICAgc3dhcAogICAgcmVwbGFjZTIgMjYKICAgIGR1cAogICAgYnVyeSA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czoyMTcKICAgIC8vIGlmIChpbmdlc3RlZEFjY291bnRzICsgeEdvdnMubGVuZ3RoID09PSBjb21taXR0ZWUudG90YWxNZW1iZXJzLmFzVWludDY0KCkpIHsKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIGV4dHJhY3RfdWludDMyCiAgICBkaWcgMQogICAgPT0KICAgIGJ6IGluZ2VzdFhHb3ZzX2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6MjE4CiAgICAvLyBlbnN1cmUoY29tbWl0dGVlLmluZ2VzdGVkVm90ZXMgPT09IGNvbW1pdHRlZS50b3RhbFZvdGVzLCBlcnJUb3RhbFZvdGVzTWlzbWF0Y2gpCiAgICBkaWcgNQogICAgZHVwCiAgICBleHRyYWN0IDI2IDQKICAgIHN3YXAKICAgIGV4dHJhY3QgMTQgNAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzMKICAgIC8vIGlmICghY29uZCkgewogICAgYm56IGluZ2VzdFhHb3ZzX2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6MjE4CiAgICAvLyBlbnN1cmUoY29tbWl0dGVlLmluZ2VzdGVkVm90ZXMgPT09IGNvbW1pdHRlZS50b3RhbFZvdGVzLCBlcnJUb3RhbFZvdGVzTWlzbWF0Y2gpCiAgICBwdXNoYnl0ZXMgIkVSUjpUVl9NTSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzQKICAgIC8vIGxvZyhjb2RlKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjM1CiAgICAvLyBlcnIoKQogICAgZXJyCgppbmdlc3RYR292c19hZnRlcl9pZl9lbHNlQDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo4MgogICAgLy8gY29tbWl0dGVlcyA9IEJveE1hcDxDb21taXR0ZWVJZCwgQ29tbWl0dGVlTWV0YWRhdGE+KHsga2V5UHJlZml4OiAnYycgfSkKICAgIGJ5dGVjXzIgLy8gImMiCiAgICBkaWcgOQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czoyMjAKICAgIC8vIHRoaXMuY29tbWl0dGVlcyhjb21taXR0ZWVJZCkudmFsdWUgPSBjbG9uZShjb21taXR0ZWUpCiAgICBkaWcgNgogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6MTcxCiAgICAvLyBwdWJsaWMgaW5nZXN0WEdvdnMoY29tbWl0dGVlSWQ6IENvbW1pdHRlZUlkLCB4R292czogQWNjb3VudFdpdGhWb3Rlc1tdKTogdm9pZCB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgppbmdlc3RYR292c190ZXJuYXJ5X2ZhbHNlQDEyOgogICAgLy8gbm9kZV9tb2R1bGVzL0BkMTNjby9zdXBlcmJveC9zbWFydF9jb250cmFjdHMvc3VwZXJib3gvbGliL3N1cGVyYm94LmFsZ28udHM6NDAKICAgIC8vIGxldCBjdXJyZW50Qm94TnVtOiB1aW50NjQgPSBtZXRhLmJveEJ5dGVMZW5ndGhzLmxlbmd0aCA9PT0gMCA/IDAgOiBtZXRhLmJveEJ5dGVMZW5ndGhzLmxlbmd0aCAtIDEKICAgIGRpZyAyNwogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGJ1cnkgMjIKICAgIGIgaW5nZXN0WEdvdnNfdGVybmFyeV9tZXJnZUAxMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjpHR292UmVnaXN0cnlDb250cmFjdC51bmluZ2VzdFhHb3ZzW3JvdXRpbmddKCkgLT4gdm9pZDoKdW5pbmdlc3RYR292czoKICAgIGludGNfMCAvLyAwCiAgICBkdXBuIDcKICAgIGJ5dGVjXzAgLy8gIiIKICAgIGR1cG4gOQogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6MjI4CiAgICAvLyBwdWJsaWMgdW5pbmdlc3RYR292cyhjb21taXR0ZWVJZDogQ29tbWl0dGVlSWQsIHhHb3ZzOiBBY2NvdW50W10pOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cG4gMgogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGR1cAogICAgaW50Y18yIC8vIDMyCiAgICAqCiAgICBpbnRjXzMgLy8gMgogICAgKwogICAgdW5jb3ZlciAyCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhY2NvdW50PgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6MjI5CiAgICAvLyB0aGlzLmVuc3VyZUNhbGxlcklzQWRtaW4oKQogICAgY2FsbHN1YiBlbnN1cmVDYWxsZXJJc0FkbWluCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czoyMzAKICAgIC8vIGNvbnN0IGNvbW1pdHRlZSA9IHRoaXMubXVzdEdldENvbW1pdHRlZU1ldGFkYXRhKGNvbW1pdHRlZUlkKQogICAgc3dhcAogICAgY2FsbHN1YiBtdXN0R2V0Q29tbWl0dGVlTWV0YWRhdGEKICAgIGR1cAogICAgY292ZXIgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6ODI0CiAgICAvLyByZXR1cm4gJ1MnICsgbWV0YWRhdGEubnVtZXJpY0lkLmFzVWludDY0KCkudG9TdHJpbmcoKQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGNhbGxzdWIgaXRvYQogICAgYnl0ZWMgNCAvLyAiUyIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBjb3ZlciAyCiAgICAvLyBub2RlX21vZHVsZXMvQGQxM2NvL3N1cGVyYm94L3NtYXJ0X2NvbnRyYWN0cy9zdXBlcmJveC9saWIvdXRpbHMuYWxnby50czo0NAogICAgLy8gcmV0dXJuIEJveDxTdXBlcmJveE1ldGE+KHsga2V5OiBCeXRlcyhuYW1lKS5jb25jYXQoQnl0ZXMoJ19tJykpIH0pCiAgICBieXRlYyA2IC8vICJfbSIKICAgIGNvbmNhdAogICAgZHVwCiAgICBjb3ZlciAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo3MgogICAgLy8gcmV0dXJuIHNiTWV0YS52YWx1ZS50b3RhbEJ5dGVMZW5ndGguYXNVaW50NjQoKSAvIEFDQ09VTlRfSURfV0lUSF9WT1RFU19TVE9SRURfU0laRQogICAgaW50Y18zIC8vIDIKICAgIHB1c2hpbnQgOCAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgcHVzaGludCA4IC8vIDgKICAgIC8KICAgIGR1cAogICAgY292ZXIgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6MjM0CiAgICAvLyBlbnN1cmUoeEdvdnMubGVuZ3RoIDw9IHRvdGFsWEdvdnMsIGVyck51bVhHb3ZzRXhjZWVkZWQpCiAgICA8PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozMwogICAgLy8gaWYgKCFjb25kKSB7CiAgICBibnogdW5pbmdlc3RYR292c19hZnRlcl9pZl9lbHNlQDQwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czoyMzQKICAgIC8vIGVuc3VyZSh4R292cy5sZW5ndGggPD0gdG90YWxYR292cywgZXJyTnVtWEdvdnNFeGNlZWRlZCkKICAgIHB1c2hieXRlcyAiRVJSOk5YX1hDIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozNAogICAgLy8gbG9nKGNvZGUpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzUKICAgIC8vIGVycigpCiAgICBlcnIKCnVuaW5nZXN0WEdvdnNfYWZ0ZXJfaWZfZWxzZUA0MDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjIzNQogICAgLy8gbGV0IGluZ2VzdGVkVm90ZXMgPSBjb21taXR0ZWUuaW5nZXN0ZWRWb3Rlcy5hc1VpbnQ2NCgpCiAgICBkaWcgNAogICAgcHVzaGludCAyNiAvLyAyNgogICAgZXh0cmFjdF91aW50MzIKICAgIGJ1cnkgMTMKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDEyCiAgICBkdXAKICAgIGJ1cnkgMTYKCnVuaW5nZXN0WEdvdnNfZm9yX2hlYWRlckAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6MjM3CiAgICAvLyBmb3IgKGNvbnN0IGFjY291bnQgb2YgY2xvbmUoeEdvdnMpKSB7CiAgICBkaWcgMTEKICAgIGRpZyA2CiAgICA8CiAgICBieiB1bmluZ2VzdFhHb3ZzX2FmdGVyX2ZvckA1CiAgICBkaWcgNgogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAxMgogICAgaW50Y18yIC8vIDMyCiAgICAqCiAgICBpbnRjXzIgLy8gMzIKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZHVwCiAgICBidXJ5IDIxCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czoyMzgKICAgIC8vIGV4cGVjdGVkWEdvdk9mZnNldC0tCiAgICBkaWcgMTYKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBidXJ5IDE3CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnlBY2NvdW50LmFsZ28udHM6MTcKICAgIC8vIGFjY291bnRzID0gQm94TWFwPEFjY291bnQsIEdHb3ZBY2NvdW50Pih7IGtleVByZWZpeDogJ2EnIH0pCiAgICBieXRlYyA4IC8vICJhIgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgMjcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeUFjY291bnQuYWxnby50czo1OAogICAgLy8gZW5zdXJlKGFjY291bnRCb3guZXhpc3RzLCBlcnJBY2NvdW50Tm90RXhpc3RzKQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjMzCiAgICAvLyBpZiAoIWNvbmQpIHsKICAgIGJueiB1bmluZ2VzdFhHb3ZzX2FmdGVyX2lmX2Vsc2VAMzAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeUFjY291bnQuYWxnby50czo1OAogICAgLy8gZW5zdXJlKGFjY291bnRCb3guZXhpc3RzLCBlcnJBY2NvdW50Tm90RXhpc3RzKQogICAgYnl0ZWMgMTcgLy8gIkVSUjpBX05YIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozNAogICAgLy8gbG9nKGNvZGUpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzUKICAgIC8vIGVycigpCiAgICBlcnIKCnVuaW5nZXN0WEdvdnNfYWZ0ZXJfaWZfZWxzZUAzMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeUFjY291bnQuYWxnby50czo1OQogICAgLy8gcmV0dXJuIGFjY291bnRCb3gudmFsdWUKICAgIGRpZyAyNQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjI0MAogICAgLy8gY29uc3Qgb2Zmc2V0ID0gdGhpcy5nZXRDb21taXR0ZWVBY2NvdW50T2Zmc2V0SGludChjb21taXR0ZWUubnVtZXJpY0lkLCBnR292QWNjb3VudCkKICAgIGRpZyA1CiAgICBleHRyYWN0IDAgMgogICAgc3dhcAogICAgY2FsbHN1YiBnZXRDb21taXR0ZWVBY2NvdW50T2Zmc2V0SGludAogICAgYnVyeSAyMwogICAgZHVwCiAgICBidXJ5IDEyCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czoyNDEKICAgIC8vIGVuc3VyZUV4dHJhKGV4cGVjdGVkWEdvdk9mZnNldCA9PT0gb2Zmc2V0LCBlcnJPdXRPZk9yZGVyLCBhY2NvdW50LmJ5dGVzKQogICAgZGlnIDE2CiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czo0MAogICAgLy8gaWYgKCFjb25kKSB7CiAgICBibnogdW5pbmdlc3RYR292c19hZnRlcl9pZl9lbHNlQDM0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjQxCiAgICAvLyBsb2coZXh0cmEpCiAgICBkaWcgMTkKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6MjQxCiAgICAvLyBlbnN1cmVFeHRyYShleHBlY3RlZFhHb3ZPZmZzZXQgPT09IG9mZnNldCwgZXJyT3V0T2ZPcmRlciwgYWNjb3VudC5ieXRlcykKICAgIGJ5dGVjIDI1IC8vICJFUlI6T09PIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czo0MgogICAgLy8gbG9nKGNvZGUpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6NDMKICAgIC8vIGVycigpCiAgICBlcnIKCnVuaW5nZXN0WEdvdnNfYWZ0ZXJfaWZfZWxzZUAzNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjI0MgogICAgLy8gY29uc3QgeEdvdlN0b3JlZCA9IHRoaXMuZ2V0U3RvcmVkWEdvdkF0KHN1cGVyYm94TmFtZSwgb2Zmc2V0KQogICAgZGlnIDIKICAgIGRpZyAxMQogICAgY2FsbHN1YiBnZXRTdG9yZWRYR292QXQKICAgIGJ1cnkgMTkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeUFjY291bnQuYWxnby50czoxMDEKICAgIC8vIGxldCBmb3VuZCA9IGZhbHNlCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSAxNQogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5QWNjb3VudC5hbGdvLnRzOjEwMgogICAgLy8gY29uc3QgbmV4dE9mZnNldHM6IFtVaW50MTYsIFVpbnQxNl1bXSA9IFtdCiAgICBieXRlYyAxOSAvLyAweDAwMDAKICAgIGJ1cnkgMjEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeUFjY291bnQuYWxnby50czoxMDMKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBnR292QWNjb3VudC5jb21taXR0ZWVPZmZzZXRzLmxlbmd0aDsgaSsrKSB7CiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSAxNAoKdW5pbmdlc3RYR292c193aGlsZV90b3BAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeUFjY291bnQuYWxnby50czoxMDMKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBnR292QWNjb3VudC5jb21taXR0ZWVPZmZzZXRzLmxlbmd0aDsgaSsrKSB7CiAgICBkaWcgMjEKICAgIGR1cAogICAgcHVzaGludCA0IC8vIDQKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgbGVuCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGJ1cnkgMjYKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkaWcgMTQKICAgID4KICAgIGJ6IHVuaW5nZXN0WEdvdnNfYWZ0ZXJfd2hpbGVAMTQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeUFjY291bnQuYWxnby50czoxMDMtMTA0CiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgZ0dvdkFjY291bnQuY29tbWl0dGVlT2Zmc2V0cy5sZW5ndGg7IGkrKykgewogICAgLy8gICBjb25zdCBbY051bUlkLCBleGlzdGluZ09mZnNldF0gPSBnR292QWNjb3VudC5jb21taXR0ZWVPZmZzZXRzW2ldCiAgICBkaWcgMjQKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMTQKICAgIHB1c2hpbnQgNCAvLyA0CiAgICAqCiAgICBwdXNoaW50IDQgLy8gNAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkdXAKICAgIGV4dHJhY3QgMCAyCiAgICBidXJ5IDI1CiAgICBkdXAKICAgIGV4dHJhY3QgMiAyCiAgICBidXJ5IDI0CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5QWNjb3VudC5hbGdvLnRzOjEwNQogICAgLy8gaWYgKGNOdW1JZC5hc1VpbnQ2NCgpID09PSBjb21taXR0ZWVOdW1JZC5hc1VpbnQ2NCgpKSB7CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDQKICAgID09CiAgICBieiB1bmluZ2VzdFhHb3ZzX2Vsc2VfYm9keUAxMgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5QWNjb3VudC5hbGdvLnRzOjEwNgogICAgLy8gZm91bmQgPSB0cnVlCiAgICBpbnRjXzEgLy8gMQogICAgYnVyeSAxNQoKdW5pbmdlc3RYR292c19hZnRlcl9pZl9lbHNlQDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5QWNjb3VudC5hbGdvLnRzOjEwMwogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IGdHb3ZBY2NvdW50LmNvbW1pdHRlZU9mZnNldHMubGVuZ3RoOyBpKyspIHsKICAgIGRpZyAxMwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMTQKICAgIGIgdW5pbmdlc3RYR292c193aGlsZV90b3BAOQoKdW5pbmdlc3RYR292c19lbHNlX2JvZHlAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnlBY2NvdW50LmFsZ28udHM6MTA4CiAgICAvLyBuZXh0T2Zmc2V0cy5wdXNoKFtjTnVtSWQsIGV4aXN0aW5nT2Zmc2V0XSkKICAgIGRpZyAyMwogICAgZGlnIDIzCiAgICBjb25jYXQKICAgIGRpZyAyMQogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIGJ1cnkgMjEKICAgIGIgdW5pbmdlc3RYR292c19hZnRlcl9pZl9lbHNlQDEzCgp1bmluZ2VzdFhHb3ZzX2FmdGVyX3doaWxlQDE0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozMwogICAgLy8gaWYgKCFjb25kKSB7CiAgICBkaWcgMTQKICAgIGJueiB1bmluZ2VzdFhHb3ZzX2FmdGVyX2lmX2Vsc2VAMjIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeUFjY291bnQuYWxnby50czoxMTEKICAgIC8vIGVuc3VyZShmb3VuZCwgZXJyQWNjb3VudE9mZnNldE5vdEV4aXN0cykKICAgIGJ5dGVjIDI2IC8vICJFUlI6QU9fTlgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjM0CiAgICAvLyBsb2coY29kZSkKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozNQogICAgLy8gZXJyKCkKICAgIGVycgoKdW5pbmdlc3RYR292c19hZnRlcl9pZl9lbHNlQDIyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5QWNjb3VudC5hbGdvLnRzOjExMwogICAgLy8gYWNjb3VudElkOiBnR292QWNjb3VudC5hY2NvdW50SWQsCiAgICBkaWcgMjEKICAgIGV4dHJhY3QgMCA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnlBY2NvdW50LmFsZ28udHM6MTEyLTExNQogICAgLy8gdGhpcy5hY2NvdW50cyhhY2NvdW50KS52YWx1ZSA9IHsKICAgIC8vICAgYWNjb3VudElkOiBnR292QWNjb3VudC5hY2NvdW50SWQsCiAgICAvLyAgIGNvbW1pdHRlZU9mZnNldHM6IGNsb25lKG5leHRPZmZzZXRzKSwKICAgIC8vIH0KICAgIHB1c2hieXRlcyAweDAwMDYKICAgIGNvbmNhdAogICAgZGlnIDIxCiAgICBjb25jYXQKICAgIGRpZyAyNgogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIG5vZGVfbW9kdWxlcy9AZDEzY28vc3VwZXJib3gvc21hcnRfY29udHJhY3RzL3N1cGVyYm94L2xpYi9zdXBlcmJveC5hbGdvLnRzOjE0MgogICAgLy8gY29uc3QgW2JveE51bSwgYnl0ZU9mZnNldF0gPSBzYkdldExvY2F0aW9uKG5hbWUsIHZhbHVlSW5kZXgpCiAgICBkaWcgMgogICAgZHVwCiAgICBkaWcgMTIKICAgIGNhbGxzdWIgc2JHZXRMb2NhdGlvbgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgY292ZXIgMgogICAgY292ZXIgMwogICAgcHVzaGludCA4IC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBidXJ5IDIwCiAgICAvLyBub2RlX21vZHVsZXMvQGQxM2NvL3N1cGVyYm94L3NtYXJ0X2NvbnRyYWN0cy9zdXBlcmJveC9saWIvdXRpbHMuYWxnby50czoyNQogICAgLy8gcmV0dXJuIEJ5dGVzKG5hbWUpLmNvbmNhdChCeXRlcygnXycpKS5jb25jYXQoQnl0ZXMoaXRvYShudW0pKSkKICAgIHN3YXAKICAgIGJ5dGVjIDE2IC8vICJfIgogICAgY29uY2F0CiAgICBkaWcgMQogICAgY2FsbHN1YiBAZDEzY28vc3VwZXJib3gvc21hcnRfY29udHJhY3RzL3N1cGVyYm94L2xpYi91dGlscy5hbGdvLnRzOjppdG9hCiAgICBjb25jYXQKICAgIGNvdmVyIDIKICAgIC8vIG5vZGVfbW9kdWxlcy9AZDEzY28vc3VwZXJib3gvc21hcnRfY29udHJhY3RzL3N1cGVyYm94L2xpYi9zdXBlcmJveC5hbGdvLnRzOjE0NQogICAgLy8gY29uc3QgdmFsdWVTaXplID0gbWV0YS52YWx1ZS52YWx1ZVNpemUuYXNVaW50NjQoKQogICAgZGlnIDQKICAgIGR1cAogICAgcHVzaGludHMgMTggOCAvLyAxOCwgOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGR1cAogICAgY292ZXIgMwogICAgYnVyeSAxNAogICAgLy8gbm9kZV9tb2R1bGVzL0BkMTNjby9zdXBlcmJveC9zbWFydF9jb250cmFjdHMvc3VwZXJib3gvbGliL3N1cGVyYm94LmFsZ28udHM6MTQ2CiAgICAvLyBjb25zdCBwcmV2Qm94Qnl0ZUxlbmd0aCA9IG1ldGEudmFsdWUuYm94Qnl0ZUxlbmd0aHNbYm94TnVtXS5hc1VpbnQ2NCgpCiAgICBkdXAKICAgIHB1c2hpbnQgMjggLy8gMjgKICAgIGludGNfMyAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgZGlnIDIKICAgID4KICAgIGFzc2VydCAvLyBpbmRleCBvdXQgb2YgYm91bmRzCiAgICBzd2FwCiAgICBpbnRjXzMgLy8gMgogICAgKgogICAgcHVzaGludCAzMCAvLyAzMAogICAgKwogICAgZHVwCiAgICBidXJ5IDIzCiAgICBpbnRjXzMgLy8gMgogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGR1cAogICAgYnVyeSAxNAogICAgLy8gbm9kZV9tb2R1bGVzL0BkMTNjby9zdXBlcmJveC9zbWFydF9jb250cmFjdHMvc3VwZXJib3gvbGliL3N1cGVyYm94LmFsZ28udHM6MTQ4CiAgICAvLyBpZiAocHJldkJveEJ5dGVMZW5ndGggPT09IHZhbHVlU2l6ZSkgewogICAgPT0KICAgIGJ6IHVuaW5nZXN0WEdvdnNfZWxzZV9ib2R5QDE4CiAgICAvLyBub2RlX21vZHVsZXMvQGQxM2NvL3N1cGVyYm94L3NtYXJ0X2NvbnRyYWN0cy9zdXBlcmJveC9saWIvc3VwZXJib3guYWxnby50czoxNTAKICAgIC8vIGRhdGFCb3guZGVsZXRlKCkKICAgIHN3YXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gbm9kZV9tb2R1bGVzL0BkMTNjby9zdXBlcmJveC9zbWFydF9jb250cmFjdHMvc3VwZXJib3gvbGliL3N1cGVyYm94LmFsZ28udHM6MTUyCiAgICAvLyBtZXRhLnZhbHVlLmJveEJ5dGVMZW5ndGhzW2JveE51bV0gPSBhdTE2KDApCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBhdTE2CiAgICBkaWcgMwogICAgZHVwCiAgICBwdXNoaW50IDI4IC8vIDI4CiAgICBpbnRjXzMgLy8gMgogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIHVuY292ZXIgMwogICAgPgogICAgYXNzZXJ0IC8vIGluZGV4IG91dCBvZiBib3VuZHMKICAgIGRpZyAxOQogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQoKdW5pbmdlc3RYR292c19hZnRlcl9pZl9lbHNlQDE5OgogICAgLy8gbm9kZV9tb2R1bGVzL0BkMTNjby9zdXBlcmJveC9zbWFydF9jb250cmFjdHMvc3VwZXJib3gvbGliL3N1cGVyYm94LmFsZ28udHM6MTYzCiAgICAvLyBtZXRhLnZhbHVlLnRvdGFsQnl0ZUxlbmd0aCA9IGF1NjQobWV0YS52YWx1ZS50b3RhbEJ5dGVMZW5ndGguYXNVaW50NjQoKSAtIHZhbHVlU2l6ZSkKICAgIGRpZyAxCiAgICBkdXAKICAgIGludGNfMyAvLyAyCiAgICBwdXNoaW50IDggLy8gOAogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGRpZyAxMAogICAgLQogICAgLy8gbm9kZV9tb2R1bGVzL0BkMTNjby9zdXBlcmJveC9zbWFydF9jb250cmFjdHMvc3VwZXJib3gvbGliL3R5cGVzLmFsZ28udHM6MzUKICAgIC8vIHJldHVybiBuZXcgVWludDY0KG51bSkKICAgIGl0b2IKICAgIC8vIG5vZGVfbW9kdWxlcy9AZDEzY28vc3VwZXJib3gvc21hcnRfY29udHJhY3RzL3N1cGVyYm94L2xpYi9zdXBlcmJveC5hbGdvLnRzOjE2MwogICAgLy8gbWV0YS52YWx1ZS50b3RhbEJ5dGVMZW5ndGggPSBhdTY0KG1ldGEudmFsdWUudG90YWxCeXRlTGVuZ3RoLmFzVWludDY0KCkgLSB2YWx1ZVNpemUpCiAgICBpbnRjXzMgLy8gMgogICAgc3dhcAogICAgYm94X3JlcGxhY2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjI0NQogICAgLy8gaW5nZXN0ZWRWb3RlcyAtPSB4R292U3RvcmVkLnZvdGVzLmFzVWludDY0KCkKICAgIGRpZyAxOAogICAgcHVzaGludCA0IC8vIDQKICAgIGV4dHJhY3RfdWludDMyCiAgICBkaWcgMTMKICAgIHN3YXAKICAgIC0KICAgIGJ1cnkgMTMKICAgIGRpZyAxMQogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMTIKICAgIGIgdW5pbmdlc3RYR292c19mb3JfaGVhZGVyQDIKCnVuaW5nZXN0WEdvdnNfZWxzZV9ib2R5QDE4OgogICAgLy8gbm9kZV9tb2R1bGVzL0BkMTNjby9zdXBlcmJveC9zbWFydF9jb250cmFjdHMvc3VwZXJib3gvbGliL3N1cGVyYm94LmFsZ28udHM6MTU1CiAgICAvLyBkYXRhQm94LnNwbGljZShieXRlT2Zmc2V0LCB2YWx1ZVNpemUsIEJ5dGVzYGApCiAgICBzd2FwCiAgICBkdXAKICAgIGRpZyAxOQogICAgZGlnIDEyCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGJ5dGVjXzAgLy8gIiIKICAgIGJveF9zcGxpY2UKICAgIC8vIG5vZGVfbW9kdWxlcy9AZDEzY28vc3VwZXJib3gvc21hcnRfY29udHJhY3RzL3N1cGVyYm94L2xpYi9zdXBlcmJveC5hbGdvLnRzOjE1NwogICAgLy8gZGF0YUJveC5yZXNpemUocHJldkJveEJ5dGVMZW5ndGggLSB2YWx1ZVNpemUpCiAgICBkaWcgMTIKICAgIHN3YXAKICAgIC0KICAgIHN3YXAKICAgIGRpZyAxCiAgICBib3hfcmVzaXplCiAgICAvLyBub2RlX21vZHVsZXMvQGQxM2NvL3N1cGVyYm94L3NtYXJ0X2NvbnRyYWN0cy9zdXBlcmJveC9saWIvc3VwZXJib3guYWxnby50czoxNTkKICAgIC8vIG1ldGEudmFsdWUuYm94Qnl0ZUxlbmd0aHNbYm94TnVtXSA9IGF1MTYocHJldkJveEJ5dGVMZW5ndGggLSB2YWx1ZVNpemUpCiAgICBjYWxsc3ViIGF1MTYKICAgIGRpZyAzCiAgICBkdXAKICAgIHB1c2hpbnQgMjggLy8gMjgKICAgIGludGNfMyAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgdW5jb3ZlciAzCiAgICA+CiAgICBhc3NlcnQgLy8gaW5kZXggb3V0IG9mIGJvdW5kcwogICAgZGlnIDE5CiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICBiIHVuaW5nZXN0WEdvdnNfYWZ0ZXJfaWZfZWxzZUAxOQoKdW5pbmdlc3RYR292c19hZnRlcl9mb3JANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjI0NwogICAgLy8gY29tbWl0dGVlLmluZ2VzdGVkVm90ZXMgPSB1MzIoaW5nZXN0ZWRWb3RlcykKICAgIGRpZyAxMgogICAgY2FsbHN1YiB1MzIKICAgIGRpZyA1CiAgICBzd2FwCiAgICByZXBsYWNlMiAyNgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6ODIKICAgIC8vIGNvbW1pdHRlZXMgPSBCb3hNYXA8Q29tbWl0dGVlSWQsIENvbW1pdHRlZU1ldGFkYXRhPih7IGtleVByZWZpeDogJ2MnIH0pCiAgICBieXRlY18yIC8vICJjIgogICAgZGlnIDkKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6MjQ4CiAgICAvLyB0aGlzLmNvbW1pdHRlZXMoY29tbWl0dGVlSWQpLnZhbHVlID0gY2xvbmUoY29tbWl0dGVlKQogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6MjI4CiAgICAvLyBwdWJsaWMgdW5pbmdlc3RYR292cyhjb21taXR0ZWVJZDogQ29tbWl0dGVlSWQsIHhHb3ZzOiBBY2NvdW50W10pOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo6R0dvdlJlZ2lzdHJ5Q29udHJhY3Quc2V0WEdvdlJlZ2lzdHJ5QXBwW3JvdXRpbmddKCkgLT4gdm9pZDoKc2V0WEdvdlJlZ2lzdHJ5QXBwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6MjU1CiAgICAvLyBwdWJsaWMgc2V0WEdvdlJlZ2lzdHJ5QXBwKGFwcElkOiBBcHBsaWNhdGlvbik6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgOCAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6MjU2CiAgICAvLyB0aGlzLmVuc3VyZUNhbGxlcklzQWRtaW4oKQogICAgY2FsbHN1YiBlbnN1cmVDYWxsZXJJc0FkbWluCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo4MAogICAgLy8geEdvdlJlZ2lzdHJ5QXBwID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBnZ292UmVnaXN0cnlYR292S2V5IH0pCiAgICBieXRlYyAyNyAvLyAieEdvdlJlZ2lzdHJ5QXBwIgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6MjU3CiAgICAvLyB0aGlzLnhHb3ZSZWdpc3RyeUFwcC52YWx1ZSA9IGFwcElkCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6MjU1CiAgICAvLyBwdWJsaWMgc2V0WEdvdlJlZ2lzdHJ5QXBwKGFwcElkOiBBcHBsaWNhdGlvbik6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjpHR292UmVnaXN0cnlDb250cmFjdC5zZXRBZG1pbltyb3V0aW5nXSgpIC0+IHZvaWQ6CnNldEFkbWluOgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6MjY4CiAgICAvLyBwdWJsaWMgc2V0QWRtaW4obmV3QWRtaW46IEFjY291bnQpOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cG4gMgogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6MjY5CiAgICAvLyB0aGlzLmVuc3VyZUNhbGxlcklzQWRtaW4oKQogICAgY2FsbHN1YiBlbnN1cmVDYWxsZXJJc0FkbWluCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czoyNzAKICAgIC8vIGVuc3VyZShuZXdBZG1pbiAhPT0gR2xvYmFsLnplcm9BZGRyZXNzLCBlcnJVbmF1dGhvcml6ZWQpCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjMzCiAgICAvLyBpZiAoIWNvbmQpIHsKICAgIGJueiBzZXRBZG1pbl9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjI3MAogICAgLy8gZW5zdXJlKG5ld0FkbWluICE9PSBHbG9iYWwuemVyb0FkZHJlc3MsIGVyclVuYXV0aG9yaXplZCkKICAgIGJ5dGVjIDUgLy8gIkVSUjpBVVRIIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozNAogICAgLy8gbG9nKGNvZGUpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzUKICAgIC8vIGVycigpCiAgICBlcnIKCnNldEFkbWluX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjg3CiAgICAvLyBhZG1pbiA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KHsgaW5pdGlhbFZhbHVlOiBHbG9iYWwuY3JlYXRvckFkZHJlc3MgfSkKICAgIGJ5dGVjIDEyIC8vICJhZG1pbiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjI3MQogICAgLy8gdGhpcy5hZG1pbi52YWx1ZSA9IG5ld0FkbWluCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjI2OAogICAgLy8gcHVibGljIHNldEFkbWluKG5ld0FkbWluOiBBY2NvdW50KTogdm9pZCB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6OkdHb3ZSZWdpc3RyeUNvbnRyYWN0LndpdGhkcmF3QUxHT1tyb3V0aW5nXSgpIC0+IHZvaWQ6CndpdGhkcmF3QUxHTzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjI4MQogICAgLy8gcHVibGljIHdpdGhkcmF3QUxHTyhyZWNlaXZlcjogQWNjb3VudCwgYW1vdW50OiB1aW50NjQpOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cG4gMgogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgOCAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgc3dhcAogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6MjgyCiAgICAvLyB0aGlzLmVuc3VyZUNhbGxlcklzQWRtaW4oKQogICAgY2FsbHN1YiBlbnN1cmVDYWxsZXJJc0FkbWluCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czoyODMKICAgIC8vIGVuc3VyZShyZWNlaXZlciAhPT0gR2xvYmFsLnplcm9BZGRyZXNzLCBlcnJVbmF1dGhvcml6ZWQpCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjMzCiAgICAvLyBpZiAoIWNvbmQpIHsKICAgIGJueiB3aXRoZHJhd0FMR09fYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czoyODMKICAgIC8vIGVuc3VyZShyZWNlaXZlciAhPT0gR2xvYmFsLnplcm9BZGRyZXNzLCBlcnJVbmF1dGhvcml6ZWQpCiAgICBieXRlYyA1IC8vICJFUlI6QVVUSCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzQKICAgIC8vIGxvZyhjb2RlKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjM1CiAgICAvLyBlcnIoKQogICAgZXJyCgp3aXRoZHJhd0FMR09fYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6Mjg0CiAgICAvLyBpdHhuLnBheW1lbnQoeyByZWNlaXZlciwgYW1vdW50IH0pLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICBkdXAKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICBkaWcgMQogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgaW50Y18xIC8vIDEKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjI4MQogICAgLy8gcHVibGljIHdpdGhkcmF3QUxHTyhyZWNlaXZlcjogQWNjb3VudCwgYW1vdW50OiB1aW50NjQpOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo6R0dvdlJlZ2lzdHJ5Q29udHJhY3QudmVyaWZ5QWRtaW5bcm91dGluZ10oKSAtPiB2b2lkOgp2ZXJpZnlBZG1pbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjI4OAogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjI5MAogICAgLy8gcmV0dXJuIGFjY291bnQgPT09IHRoaXMuYWRtaW4udmFsdWUKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo4NwogICAgLy8gYWRtaW4gPSBHbG9iYWxTdGF0ZTxBY2NvdW50Pih7IGluaXRpYWxWYWx1ZTogR2xvYmFsLmNyZWF0b3JBZGRyZXNzIH0pCiAgICBieXRlYyAxMiAvLyAiYWRtaW4iCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czoyOTAKICAgIC8vIHJldHVybiBhY2NvdW50ID09PSB0aGlzLmFkbWluLnZhbHVlCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjI4OAogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICBieXRlYyAxNCAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo6R0dvdlJlZ2lzdHJ5Q29udHJhY3Quc2V0T3BlcmF0b3Jbcm91dGluZ10oKSAtPiB2b2lkOgpzZXRPcGVyYXRvcjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjMwOAogICAgLy8gcHVibGljIHNldE9wZXJhdG9yKGFjY291bnQ6IEFjY291bnQpOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6MzA5CiAgICAvLyB0aGlzLmVuc3VyZUNhbGxlcklzQWRtaW4oKQogICAgY2FsbHN1YiBlbnN1cmVDYWxsZXJJc0FkbWluCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo4OQogICAgLy8gb3BlcmF0b3IgPSBHbG9iYWxTdGF0ZTxBY2NvdW50PigpCiAgICBieXRlYyAyMCAvLyAib3BlcmF0b3IiCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czozMTAKICAgIC8vIHRoaXMub3BlcmF0b3IudmFsdWUgPSBhY2NvdW50CiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6MzA4CiAgICAvLyBwdWJsaWMgc2V0T3BlcmF0b3IoYWNjb3VudDogQWNjb3VudCk6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjpHR292UmVnaXN0cnlDb250cmFjdC52ZXJpZnlPcGVyYXRvcltyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmeU9wZXJhdG9yOgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6MzE0CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6MzE2CiAgICAvLyByZXR1cm4gYWNjb3VudCA9PT0gdGhpcy5vcGVyYXRvci52YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjg5CiAgICAvLyBvcGVyYXRvciA9IEdsb2JhbFN0YXRlPEFjY291bnQ+KCkKICAgIGJ5dGVjIDIwIC8vICJvcGVyYXRvciIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjMxNgogICAgLy8gcmV0dXJuIGFjY291bnQgPT09IHRoaXMub3BlcmF0b3IudmFsdWUKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6MzE0CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGJ5dGVjIDE0IC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjpHR292UmVnaXN0cnlDb250cmFjdC5zZXRWb3RpbmdBY2NvdW50W3JvdXRpbmddKCkgLT4gdm9pZDoKc2V0Vm90aW5nQWNjb3VudDoKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czozMjkKICAgIC8vIEBhYmltZXRob2QoeyBuYW1lOiAnc2V0X3ZvdGluZ19hY2NvdW50JyB9KQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwbiAyCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeUFjY291bnQuYWxnby50czoxNwogICAgLy8gYWNjb3VudHMgPSBCb3hNYXA8QWNjb3VudCwgR0dvdkFjY291bnQ+KHsga2V5UHJlZml4OiAnYScgfSkKICAgIGJ5dGVjIDggLy8gImEiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjMzMQogICAgLy8gZW5zdXJlKHRoaXMuYWNjb3VudHMoeGdvdkFkZHJlc3MpLmV4aXN0cywgZXJyQWNjb3VudE5vdEV4aXN0cykgLy8geEdvdiBOT1RfWEdPViBhbmFsb2cKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozMwogICAgLy8gaWYgKCFjb25kKSB7CiAgICBibnogc2V0Vm90aW5nQWNjb3VudF9hZnRlcl9pZl9lbHNlQDIxCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czozMzEKICAgIC8vIGVuc3VyZSh0aGlzLmFjY291bnRzKHhnb3ZBZGRyZXNzKS5leGlzdHMsIGVyckFjY291bnROb3RFeGlzdHMpIC8vIHhHb3YgTk9UX1hHT1YgYW5hbG9nCiAgICBieXRlYyAxNyAvLyAiRVJSOkFfTlgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjM0CiAgICAvLyBsb2coY29kZSkKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozNQogICAgLy8gZXJyKCkKICAgIGVycgoKc2V0Vm90aW5nQWNjb3VudF9hZnRlcl9pZl9lbHNlQDIxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6OTUKICAgIC8vIGRlbGVnYXRpb25zID0gQm94TWFwPEFjY291bnQsIEFjY291bnQ+KHsga2V5UHJlZml4OiAnZCcgfSkKICAgIGJ5dGVjIDkgLy8gImQiCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgNAogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6Mzg4CiAgICAvLyBjb25zdCBpc0N1cnJlbnREZWxlZ2F0ZWUgPSBib3guZXhpc3RzICYmIGJveC52YWx1ZSA9PT0gVHhuLnNlbmRlcgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBzZXRWb3RpbmdBY2NvdW50X2Jvb2xfZmFsc2VAMTMKICAgIGRpZyAyCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgdHhuIFNlbmRlcgogICAgPT0KICAgIGJ6IHNldFZvdGluZ0FjY291bnRfYm9vbF9mYWxzZUAxMwogICAgaW50Y18xIC8vIDEKCnNldFZvdGluZ0FjY291bnRfYm9vbF9tZXJnZUAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjM4OQogICAgLy8gZW5zdXJlKFR4bi5zZW5kZXIgPT09IGRlbGVnYXRvciB8fCBpc0N1cnJlbnREZWxlZ2F0ZWUsIGVyclVuYXV0aG9yaXplZCkKICAgIHR4biBTZW5kZXIKICAgIGRpZyAzCiAgICA9PQogICAgfHwKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzMKICAgIC8vIGlmICghY29uZCkgewogICAgYm56IHNldFZvdGluZ0FjY291bnRfYWZ0ZXJfaWZfZWxzZUAxNwogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6Mzg5CiAgICAvLyBlbnN1cmUoVHhuLnNlbmRlciA9PT0gZGVsZWdhdG9yIHx8IGlzQ3VycmVudERlbGVnYXRlZSwgZXJyVW5hdXRob3JpemVkKQogICAgYnl0ZWMgNSAvLyAiRVJSOkFVVEgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjM0CiAgICAvLyBsb2coY29kZSkKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozNQogICAgLy8gZXJyKCkKICAgIGVycgoKc2V0Vm90aW5nQWNjb3VudF9hZnRlcl9pZl9lbHNlQDE3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6MzMzCiAgICAvLyBpZiAodm90aW5nQWRkcmVzcyA9PT0geGdvdkFkZHJlc3MgfHwgdm90aW5nQWRkcmVzcyA9PT0gR2xvYmFsLnplcm9BZGRyZXNzKSB7CiAgICBkdXAKICAgIGRpZyAyCiAgICA9PQogICAgYm56IHNldFZvdGluZ0FjY291bnRfaWZfYm9keUAzCiAgICBkdXAKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgPT0KICAgIGJ6IHNldFZvdGluZ0FjY291bnRfZWxzZV9ib2R5QDQKCnNldFZvdGluZ0FjY291bnRfaWZfYm9keUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6Mzk1CiAgICAvLyBpZiAoIWJveC5leGlzdHMpIHJldHVybgogICAgZGlnIDIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogc2V0Vm90aW5nQWNjb3VudF9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjM5NgogICAgLy8gY29uc3QgcHJldmlvdXNEZWxlZ2F0ZWUgPSBib3gudmFsdWUKICAgIGRpZyAyCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czozOTcKICAgIC8vIHRoaXMucmVtb3ZlUmV2ZXJzZURlbGVnYXRpb24ocHJldmlvdXNEZWxlZ2F0ZWUsIGRlbGVnYXRvcikKICAgIGR1cAogICAgZGlnIDQKICAgIGR1cAogICAgY292ZXIgMgogICAgY2FsbHN1YiByZW1vdmVSZXZlcnNlRGVsZWdhdGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6Mzk4CiAgICAvLyBib3guZGVsZXRlKCkKICAgIHVuY292ZXIgMgogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czozOTkKICAgIC8vIGVtaXQ8R0dvdkRlbGVnYXRpb25DbGVhcmVkPih7IGRlbGVnYXRvciwgcHJldmlvdXNEZWxlZ2F0ZWUgfSkKICAgIHN3YXAKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4MzIzZjIyNDYgLy8gbWV0aG9kICJHR292RGVsZWdhdGlvbkNsZWFyZWQoYWRkcmVzcyxhZGRyZXNzKSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCgpzZXRWb3RpbmdBY2NvdW50X2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjMyOQogICAgLy8gQGFiaW1ldGhvZCh7IG5hbWU6ICdzZXRfdm90aW5nX2FjY291bnQnIH0pCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpzZXRWb3RpbmdBY2NvdW50X2Vsc2VfYm9keUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6MzM2CiAgICAvLyB0aGlzLmFkZERlbGVnYXRpb24oeGdvdkFkZHJlc3MsIHZvdGluZ0FkZHJlc3MpCiAgICBkdXAyCiAgICBjYWxsc3ViIGFkZERlbGVnYXRpb24KICAgIGIgc2V0Vm90aW5nQWNjb3VudF9hZnRlcl9pZl9lbHNlQDUKCnNldFZvdGluZ0FjY291bnRfYm9vbF9mYWxzZUAxMzoKICAgIGludGNfMCAvLyAwCiAgICBiIHNldFZvdGluZ0FjY291bnRfYm9vbF9tZXJnZUAxNAoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjpHR292UmVnaXN0cnlDb250cmFjdC5taXJyb3JYR292RGVsZWdhdGlvbltyb3V0aW5nXSgpIC0+IHZvaWQ6Cm1pcnJvclhHb3ZEZWxlZ2F0aW9uOgogICAgaW50Y18wIC8vIDAKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6MzQxCiAgICAvLyBwdWJsaWMgbWlycm9yWEdvdkRlbGVnYXRpb24oYWNjb3VudDogQWNjb3VudCk6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwbiAyCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czozNDIKICAgIC8vIHRoaXMuZW5zdXJlQ2FsbGVySXNBZG1pbigpCiAgICBjYWxsc3ViIGVuc3VyZUNhbGxlcklzQWRtaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjk1CiAgICAvLyBkZWxlZ2F0aW9ucyA9IEJveE1hcDxBY2NvdW50LCBBY2NvdW50Pih7IGtleVByZWZpeDogJ2QnIH0pCiAgICBieXRlYyA5IC8vICJkIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czozNDQKICAgIC8vIGVuc3VyZSghdGhpcy5kZWxlZ2F0aW9ucyhhY2NvdW50KS5leGlzdHMsIGVyckdHb3ZEZWxlZ2F0aW9uRXhpc3RzKQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjMzCiAgICAvLyBpZiAoIWNvbmQpIHsKICAgIGJ6IG1pcnJvclhHb3ZEZWxlZ2F0aW9uX2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6MzQ0CiAgICAvLyBlbnN1cmUoIXRoaXMuZGVsZWdhdGlvbnMoYWNjb3VudCkuZXhpc3RzLCBlcnJHR292RGVsZWdhdGlvbkV4aXN0cykKICAgIHB1c2hieXRlcyAiRVJSOkdEX0VYIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozNAogICAgLy8gbG9nKGNvZGUpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzUKICAgIC8vIGVycigpCiAgICBlcnIKCm1pcnJvclhHb3ZEZWxlZ2F0aW9uX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjM0Ny0zNTAKICAgIC8vIGNvbnN0IFt4R292Qm94LCBleGlzdHNdID0gcmVnaXN0cnkuY2FsbC5nZXRYR292Qm94KHsKICAgIC8vICAgYXBwSWQ6IHRoaXMueEdvdlJlZ2lzdHJ5QXBwLnZhbHVlLAogICAgLy8gICBhcmdzOiBbYWNjb3VudF0sCiAgICAvLyB9KS5yZXR1cm5WYWx1ZQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6MzQ4CiAgICAvLyBhcHBJZDogdGhpcy54R292UmVnaXN0cnlBcHAudmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6ODAKICAgIC8vIHhHb3ZSZWdpc3RyeUFwcCA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogZ2dvdlJlZ2lzdHJ5WEdvdktleSB9KQogICAgYnl0ZWMgMjcgLy8gInhHb3ZSZWdpc3RyeUFwcCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjM0OAogICAgLy8gYXBwSWQ6IHRoaXMueEdvdlJlZ2lzdHJ5QXBwLnZhbHVlLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjM0Ny0zNTAKICAgIC8vIGNvbnN0IFt4R292Qm94LCBleGlzdHNdID0gcmVnaXN0cnkuY2FsbC5nZXRYR292Qm94KHsKICAgIC8vICAgYXBwSWQ6IHRoaXMueEdvdlJlZ2lzdHJ5QXBwLnZhbHVlLAogICAgLy8gICBhcmdzOiBbYWNjb3VudF0sCiAgICAvLyB9KS5yZXR1cm5WYWx1ZQogICAgcHVzaGJ5dGVzIDB4Mjc2MzBkNjUgLy8gbWV0aG9kICJnZXRfeGdvdl9ib3goYWRkcmVzcykoKGFkZHJlc3MsdWludDY0LHVpbnQ2NCx1aW50NjQpLGJvb2wpIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGRpZyAxCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgYnVyeSAzCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEJ5dGVzIGhhcyB2YWxpZCBwcmVmaXgKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDU3IC8vIDU3CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnR1cGxlPFhHb3ZCb3hWYWx1ZSxhcmM0LmJvb2w+CiAgICBwdXNoaW50IDQ0OCAvLyA0NDgKICAgIGdldGJpdAogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6MzUzCiAgICAvLyBpZiAoZXhpc3RzICYmIHhHb3ZCb3gudm90aW5nQWRkcmVzcyAhPT0gR2xvYmFsLnplcm9BZGRyZXNzICYmIHhHb3ZCb3gudm90aW5nQWRkcmVzcyAhPT0gYWNjb3VudCkgewogICAgYnogbWlycm9yWEdvdkRlbGVnYXRpb25fYWZ0ZXJfaWZfZWxzZUA2CiAgICBkaWcgMQogICAgZXh0cmFjdCA0IDU2CiAgICBleHRyYWN0IDAgMzIKICAgIGR1cAogICAgYnVyeSA0CiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBieiBtaXJyb3JYR292RGVsZWdhdGlvbl9hZnRlcl9pZl9lbHNlQDYKICAgIGRpZyAyCiAgICBkaWcgMQogICAgIT0KICAgIGJ6IG1pcnJvclhHb3ZEZWxlZ2F0aW9uX2FmdGVyX2lmX2Vsc2VANgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6MzU0CiAgICAvLyB0aGlzLmFkZERlbGVnYXRpb24oYWNjb3VudCwgeEdvdkJveC52b3RpbmdBZGRyZXNzKQogICAgZHVwCiAgICBkaWcgMwogICAgY2FsbHN1YiBhZGREZWxlZ2F0aW9uCgptaXJyb3JYR292RGVsZWdhdGlvbl9hZnRlcl9pZl9lbHNlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czozNDEKICAgIC8vIHB1YmxpYyBtaXJyb3JYR292RGVsZWdhdGlvbihhY2NvdW50OiBBY2NvdW50KTogdm9pZCB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6OkdHb3ZSZWdpc3RyeUNvbnRyYWN0LmdldERlbGVnYXRpb25bcm91dGluZ10oKSAtPiB2b2lkOgpnZXREZWxlZ2F0aW9uOgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6NDI5CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6OTUKICAgIC8vIGRlbGVnYXRpb25zID0gQm94TWFwPEFjY291bnQsIEFjY291bnQ+KHsga2V5UHJlZml4OiAnZCcgfSkKICAgIGJ5dGVjIDkgLy8gImQiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6NDMyCiAgICAvLyBpZiAoYm94LmV4aXN0cykgcmV0dXJuIFtib3gudmFsdWUsIHRydWVdCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGdldERlbGVnYXRpb25fYWZ0ZXJfaWZfZWxzZUAzCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBwdXNoYnl0ZXMgMHg4MAogICAgY29uY2F0CgpnZXREZWxlZ2F0aW9uX2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6OkdHb3ZSZWdpc3RyeUNvbnRyYWN0LmdldERlbGVnYXRpb25ANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjQyOQogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpnZXREZWxlZ2F0aW9uX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjQzMwogICAgLy8gcmV0dXJuIFtHbG9iYWwuemVyb0FkZHJlc3MsIGZhbHNlXQogICAgcHVzaGJ5dGVzIGJhc2UzMihBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQSkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjQyOQogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICBiIGdldERlbGVnYXRpb25fYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo6R0dvdlJlZ2lzdHJ5Q29udHJhY3QuZ2V0RGVsZWdhdGlvbkA0CgoKLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6OkdHb3ZSZWdpc3RyeUNvbnRyYWN0LmdldERlbGVnYXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0RGVsZWdhdGU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo0MzcKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo5NQogICAgLy8gZGVsZWdhdGlvbnMgPSBCb3hNYXA8QWNjb3VudCwgQWNjb3VudD4oeyBrZXlQcmVmaXg6ICdkJyB9KQogICAgYnl0ZWMgOSAvLyAiZCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo0NDAKICAgIC8vIGlmIChib3guZXhpc3RzKSByZXR1cm4gYm94LnZhbHVlCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGdldERlbGVnYXRlX2FmdGVyX2lmX2Vsc2VAMwogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQoKZ2V0RGVsZWdhdGVfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo6R0dvdlJlZ2lzdHJ5Q29udHJhY3QuZ2V0RGVsZWdhdGVANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjQzNwogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpnZXREZWxlZ2F0ZV9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo0NDEKICAgIC8vIHJldHVybiBHbG9iYWwuemVyb0FkZHJlc3MKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6NDM3CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGIgZ2V0RGVsZWdhdGVfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo6R0dvdlJlZ2lzdHJ5Q29udHJhY3QuZ2V0RGVsZWdhdGVANAoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjpHR292UmVnaXN0cnlDb250cmFjdC5sb2dEZWxlZ2F0b3JzW3JvdXRpbmddKCkgLT4gdm9pZDoKbG9nRGVsZWdhdG9yczoKICAgIGJ5dGVjXzAgLy8gIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6NDQ1CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6MTA1CiAgICAvLyByZXZlcnNlRGVsZWdhdGlvbnMgPSBCb3hNYXA8QWNjb3VudCwgQWNjb3VudFtdPih7IGtleVByZWZpeDogJ0QnIH0pCiAgICBieXRlYyAyMSAvLyAiRCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo0NTAKICAgIC8vIGlmICghYm94LmV4aXN0cykgcmV0dXJuCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGxvZ0RlbGVnYXRvcnNfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo6R0dvdlJlZ2lzdHJ5Q29udHJhY3QubG9nRGVsZWdhdG9yc0A4CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo0NTEKICAgIC8vIGZvciAoY29uc3QgZGVsZWdhdG9yIG9mIGNsb25lKGJveC52YWx1ZSkpIHsKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGludGNfMyAvLyAyCiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgYnVyeSAzCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSAyCgpsb2dEZWxlZ2F0b3JzX2Zvcl9oZWFkZXJANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjQ1MQogICAgLy8gZm9yIChjb25zdCBkZWxlZ2F0b3Igb2YgY2xvbmUoYm94LnZhbHVlKSkgewogICAgZGlnIDEKICAgIGRpZyAzCiAgICA8CiAgICBieiBsb2dEZWxlZ2F0b3JzX2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6OkdHb3ZSZWdpc3RyeUNvbnRyYWN0LmxvZ0RlbGVnYXRvcnNAOAogICAgZGlnIDEKICAgIGR1cAogICAgaW50Y18yIC8vIDMyCiAgICAqCiAgICBpbnRjXzMgLy8gMgogICAgKwogICAgZGlnIDIKICAgIHN3YXAKICAgIGludGNfMiAvLyAzMgogICAgYm94X2V4dHJhY3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjQ1MgogICAgLy8gbG9nKGVuY29kZUFyYzQoZGVsZWdhdG9yKSkKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMgogICAgYiBsb2dEZWxlZ2F0b3JzX2Zvcl9oZWFkZXJANAoKbG9nRGVsZWdhdG9yc19hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjpHR292UmVnaXN0cnlDb250cmFjdC5sb2dEZWxlZ2F0b3JzQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo0NDUKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjpHR292UmVnaXN0cnlDb250cmFjdC5sb2dEZWxlZ2F0aW9uc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmxvZ0RlbGVnYXRpb25zOgogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjQ1NwogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXBuIDIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMiAvLyAzMgogICAgKgogICAgaW50Y18zIC8vIDIKICAgICsKICAgIHN3YXAKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFjY291bnQ+CiAgICBpbnRjXzAgLy8gMAoKbG9nRGVsZWdhdGlvbnNfZm9yX2hlYWRlckAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6NDU5CiAgICAvLyBmb3IgKGNvbnN0IGFjY291bnQgb2YgYWNjb3VudHMpIHsKICAgIGR1cAogICAgZGlnIDIKICAgIDwKICAgIGJ6IGxvZ0RlbGVnYXRpb25zX2FmdGVyX2ZvckA4CiAgICBkaWcgMgogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAxCiAgICBpbnRjXzIgLy8gMzIKICAgICoKICAgIGludGNfMiAvLyAzMgogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo5NQogICAgLy8gZGVsZWdhdGlvbnMgPSBCb3hNYXA8QWNjb3VudCwgQWNjb3VudD4oeyBrZXlQcmVmaXg6ICdkJyB9KQogICAgYnl0ZWMgOSAvLyAiZCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBidXJ5IDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjQ2MQogICAgLy8gaWYgKGJveC5leGlzdHMpIHsKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogbG9nRGVsZWdhdGlvbnNfZWxzZV9ib2R5QDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjQ2MgogICAgLy8gbG9nKGVuY29kZUFyYzQoYm94LnZhbHVlKSkKICAgIGRpZyAzCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgbG9nCgpsb2dEZWxlZ2F0aW9uc19hZnRlcl9pZl9lbHNlQDY6CiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgbG9nRGVsZWdhdGlvbnNfZm9yX2hlYWRlckAyCgpsb2dEZWxlZ2F0aW9uc19lbHNlX2JvZHlANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjQ2NAogICAgLy8gbG9nKGVuY29kZUFyYzQoR2xvYmFsLnplcm9BZGRyZXNzKSkKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgbG9nCiAgICBiIGxvZ0RlbGVnYXRpb25zX2FmdGVyX2lmX2Vsc2VANgoKbG9nRGVsZWdhdGlvbnNfYWZ0ZXJfZm9yQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo0NTcKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjpHR292UmVnaXN0cnlDb250cmFjdC51cGxvYWRQZXJpb2RBcHByb3ZhbFBhcnRpYWxbcm91dGluZ10oKSAtPiB2b2lkOgp1cGxvYWRQZXJpb2RBcHByb3ZhbFBhcnRpYWw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo0NzYKICAgIC8vIHB1YmxpYyB1cGxvYWRQZXJpb2RBcHByb3ZhbFBhcnRpYWwoc3RhcnRPZmZzZXQ6IHVpbnQ2NCwgZGF0YTogYnl0ZXMpOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDggLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18zIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgY292ZXIgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6NDc3CiAgICAvLyB0aGlzLmVuc3VyZUNhbGxlcklzQWRtaW4oKQogICAgY2FsbHN1YiBlbnN1cmVDYWxsZXJJc0FkbWluCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo0NzkKICAgIC8vIGNvbnN0IHdyaXRlRW5kOiB1aW50NjQgPSBzdGFydE9mZnNldCArIGRhdGEubGVuZ3RoCiAgICBsZW4KICAgIGRpZyAxCiAgICArCiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo0ODAKICAgIC8vIGlmIChzdGFydE9mZnNldCA9PT0gMCkgewogICAgYm56IHVwbG9hZFBlcmlvZEFwcHJvdmFsUGFydGlhbF9lbHNlX2JvZHlAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6NDgxCiAgICAvLyBvcC5Cb3guZGVsZXRlKGJveEtleSkKICAgIGJ5dGVjXzMgLy8gIlBhcCIKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6NDgyCiAgICAvLyBvcC5Cb3guY3JlYXRlKGJveEtleSwgd3JpdGVFbmQpCiAgICBieXRlY18zIC8vICJQYXAiCiAgICBkaWcgMQogICAgYm94X2NyZWF0ZQogICAgcG9wCgp1cGxvYWRQZXJpb2RBcHByb3ZhbFBhcnRpYWxfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6NDg5CiAgICAvLyBvcC5Cb3gucmVwbGFjZShib3hLZXksIHN0YXJ0T2Zmc2V0LCBkYXRhKQogICAgYnl0ZWNfMyAvLyAiUGFwIgogICAgZGlnIDMKICAgIGRpZyAzCiAgICBib3hfcmVwbGFjZQogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6NDc2CiAgICAvLyBwdWJsaWMgdXBsb2FkUGVyaW9kQXBwcm92YWxQYXJ0aWFsKHN0YXJ0T2Zmc2V0OiB1aW50NjQsIGRhdGE6IGJ5dGVzKTogdm9pZCB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgp1cGxvYWRQZXJpb2RBcHByb3ZhbFBhcnRpYWxfZWxzZV9ib2R5QDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo0ODQKICAgIC8vIGNvbnN0IFtib3hMZW5dID0gb3AuQm94Lmxlbmd0aChib3hLZXkpCiAgICBieXRlY18zIC8vICJQYXAiCiAgICBib3hfbGVuCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjQ4NQogICAgLy8gaWYgKHdyaXRlRW5kID4gYm94TGVuKSB7CiAgICBkaWcgMQogICAgPAogICAgYnogdXBsb2FkUGVyaW9kQXBwcm92YWxQYXJ0aWFsX2FmdGVyX2lmX2Vsc2VANgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6NDg2CiAgICAvLyBvcC5Cb3gucmVzaXplKGJveEtleSwgd3JpdGVFbmQpCiAgICBieXRlY18zIC8vICJQYXAiCiAgICBkaWcgMQogICAgYm94X3Jlc2l6ZQogICAgYiB1cGxvYWRQZXJpb2RBcHByb3ZhbFBhcnRpYWxfYWZ0ZXJfaWZfZWxzZUA2CgoKLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6OkdHb3ZSZWdpc3RyeUNvbnRyYWN0LmNyZWF0ZVBlcmlvZFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNyZWF0ZVBlcmlvZDoKICAgIGludGNfMCAvLyAwCiAgICBkdXBuIDIKICAgIGJ5dGVjXzAgLy8gIiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjUwMi01MDcKICAgIC8vIHB1YmxpYyBjcmVhdGVQZXJpb2QoCiAgICAvLyAgIGNvbW1pdHRlZUlkOiBDb21taXR0ZWVJZCwKICAgIC8vICAgdm90aW5nU3RhcnQ6IHVpbnQ2NCwKICAgIC8vICAgdm90aW5nRW5kOiB1aW50NjQsCiAgICAvLyAgIG1iclBheW1lbnQ6IGd0eG4uUGF5bWVudFR4biwKICAgIC8vICk6IFtVaW50MzIsIHVpbnQ2NF0gewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCA4IC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCA4IC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMSAvLyBwYXkKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBwYXkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjUwOAogICAgLy8gZW5zdXJlKFR4bi5zZW5kZXIgPT09IHRoaXMub3BlcmF0b3IudmFsdWUsIGVyclVuYXV0aG9yaXplZCkKICAgIHR4biBTZW5kZXIKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo4OQogICAgLy8gb3BlcmF0b3IgPSBHbG9iYWxTdGF0ZTxBY2NvdW50PigpCiAgICBieXRlYyAyMCAvLyAib3BlcmF0b3IiCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo1MDgKICAgIC8vIGVuc3VyZShUeG4uc2VuZGVyID09PSB0aGlzLm9wZXJhdG9yLnZhbHVlLCBlcnJVbmF1dGhvcml6ZWQpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzMKICAgIC8vIGlmICghY29uZCkgewogICAgYm56IGNyZWF0ZVBlcmlvZF9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjUwOAogICAgLy8gZW5zdXJlKFR4bi5zZW5kZXIgPT09IHRoaXMub3BlcmF0b3IudmFsdWUsIGVyclVuYXV0aG9yaXplZCkKICAgIGJ5dGVjIDUgLy8gIkVSUjpBVVRIIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozNAogICAgLy8gbG9nKGNvZGUpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzUKICAgIC8vIGVycigpCiAgICBlcnIKCmNyZWF0ZVBlcmlvZF9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo1MDkKICAgIC8vIGVuc3VyZSh2b3RpbmdFbmQgPiB2b3RpbmdTdGFydCwgZXJyUGVyaW9kRW5kTGVzc1RoYW5TdGFydCkKICAgIGRpZyAxCiAgICBkaWcgMwogICAgPgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozMwogICAgLy8gaWYgKCFjb25kKSB7CiAgICBibnogY3JlYXRlUGVyaW9kX2FmdGVyX2lmX2Vsc2VAMTEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjUwOQogICAgLy8gZW5zdXJlKHZvdGluZ0VuZCA+IHZvdGluZ1N0YXJ0LCBlcnJQZXJpb2RFbmRMZXNzVGhhblN0YXJ0KQogICAgYnl0ZWMgMjMgLy8gIkVSUjpQRV9MVCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzQKICAgIC8vIGxvZyhjb2RlKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjM1CiAgICAvLyBlcnIoKQogICAgZXJyCgpjcmVhdGVQZXJpb2RfYWZ0ZXJfaWZfZWxzZUAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjUxMAogICAgLy8gZW5zdXJlKG1iclBheW1lbnQucmVjZWl2ZXIgPT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLCBlcnJVbmF1dGhvcml6ZWQpCiAgICBkdXAKICAgIGd0eG5zIFJlY2VpdmVyCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzMKICAgIC8vIGlmICghY29uZCkgewogICAgYm56IGNyZWF0ZVBlcmlvZF9hZnRlcl9pZl9lbHNlQDE1CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo1MTAKICAgIC8vIGVuc3VyZShtYnJQYXltZW50LnJlY2VpdmVyID09PSBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywgZXJyVW5hdXRob3JpemVkKQogICAgYnl0ZWMgNSAvLyAiRVJSOkFVVEgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjM0CiAgICAvLyBsb2coY29kZSkKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozNQogICAgLy8gZXJyKCkKICAgIGVycgoKY3JlYXRlUGVyaW9kX2FmdGVyX2lmX2Vsc2VAMTU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo4MgogICAgLy8gY29tbWl0dGVlcyA9IEJveE1hcDxDb21taXR0ZWVJZCwgQ29tbWl0dGVlTWV0YWRhdGE+KHsga2V5UHJlZml4OiAnYycgfSkKICAgIGJ5dGVjXzIgLy8gImMiCiAgICBkaWcgNAogICAgY29uY2F0CiAgICBkdXAKICAgIGJ1cnkgOQogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6NTEzCiAgICAvLyBlbnN1cmUoY29tbWl0dGVlQm94LmV4aXN0cywgZXJyQ29tbWl0dGVlTm90RXhpc3RzKQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjMzCiAgICAvLyBpZiAoIWNvbmQpIHsKICAgIGJueiBjcmVhdGVQZXJpb2RfYWZ0ZXJfaWZfZWxzZUAxOQogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6NTEzCiAgICAvLyBlbnN1cmUoY29tbWl0dGVlQm94LmV4aXN0cywgZXJyQ29tbWl0dGVlTm90RXhpc3RzKQogICAgYnl0ZWMgMTUgLy8gIkVSUjpDX05YIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozNAogICAgLy8gbG9nKGNvZGUpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzUKICAgIC8vIGVycigpCiAgICBlcnIKCmNyZWF0ZVBlcmlvZF9hZnRlcl9pZl9lbHNlQDE5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6NTE0CiAgICAvLyBlbnN1cmUoY29tbWl0dGVlQm94LnZhbHVlLmluZ2VzdGVkVm90ZXMgPT09IGNvbW1pdHRlZUJveC52YWx1ZS50b3RhbFZvdGVzLCBlcnJDb21taXR0ZWVJbmNvbXBsZXRlKQogICAgZGlnIDcKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBkdXAKICAgIGV4dHJhY3QgMjYgNAogICAgc3dhcAogICAgZXh0cmFjdCAxNCA0CiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozMwogICAgLy8gaWYgKCFjb25kKSB7CiAgICBibnogY3JlYXRlUGVyaW9kX2FmdGVyX2lmX2Vsc2VAMjMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjUxNAogICAgLy8gZW5zdXJlKGNvbW1pdHRlZUJveC52YWx1ZS5pbmdlc3RlZFZvdGVzID09PSBjb21taXR0ZWVCb3gudmFsdWUudG90YWxWb3RlcywgZXJyQ29tbWl0dGVlSW5jb21wbGV0ZSkKICAgIGJ5dGVjIDI4IC8vICJFUlI6Q19OQyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzQKICAgIC8vIGxvZyhjb2RlKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjM1CiAgICAvLyBlcnIoKQogICAgZXJyCgpjcmVhdGVQZXJpb2RfYWZ0ZXJfaWZfZWxzZUAyMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjExMgogICAgLy8gcGVyaW9kQXBwcm92YWxCb3ggPSBCb3g8Ynl0ZXM+KHsga2V5OiAnUGFwJyB9KQogICAgYnl0ZWNfMyAvLyAiUGFwIgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6NTE2CiAgICAvLyBlbnN1cmUodGhpcy5wZXJpb2RBcHByb3ZhbEJveC5leGlzdHMsIGVyclBlcmlvZEFwcE5vdENvbmZpZ3VyZWQpCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzMKICAgIC8vIGlmICghY29uZCkgewogICAgYm56IGNyZWF0ZVBlcmlvZF9hZnRlcl9pZl9lbHNlQDI3CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo1MTYKICAgIC8vIGVuc3VyZSh0aGlzLnBlcmlvZEFwcHJvdmFsQm94LmV4aXN0cywgZXJyUGVyaW9kQXBwTm90Q29uZmlndXJlZCkKICAgIHB1c2hieXRlcyAiRVJSOkdQX05DIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozNAogICAgLy8gbG9nKGNvZGUpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzUKICAgIC8vIGVycigpCiAgICBlcnIKCmNyZWF0ZVBlcmlvZF9hZnRlcl9pZl9lbHNlQDI3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6NTE4CiAgICAvLyB0aGlzLmxhc3RQZXJpb2RJZC52YWx1ZSsrCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6OTEKICAgIC8vIGxhc3RQZXJpb2RJZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSkKICAgIGJ5dGVjIDExIC8vICJsYXN0UGVyaW9kSWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo1MTgKICAgIC8vIHRoaXMubGFzdFBlcmlvZElkLnZhbHVlKysKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6OTEKICAgIC8vIGxhc3RQZXJpb2RJZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSkKICAgIGJ5dGVjIDExIC8vICJsYXN0UGVyaW9kSWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo1MTgKICAgIC8vIHRoaXMubGFzdFBlcmlvZElkLnZhbHVlKysKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6NTE5CiAgICAvLyBjb25zdCBwZXJpb2RJZCA9IHUzMih0aGlzLmxhc3RQZXJpb2RJZC52YWx1ZSkKICAgIGNhbGxzdWIgdTMyCiAgICBidXJ5IDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjUzMwogICAgLy8gY29uc3QgW2FwcHJvdmFsTGVuXSA9IG9wLkJveC5sZW5ndGgoYXBwcm92YWxLZXkpCiAgICBieXRlY18zIC8vICJQYXAiCiAgICBib3hfbGVuCiAgICBwb3AKICAgIGR1cAogICAgYnVyeSA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo1MzUKICAgIC8vIGNvbnN0IHBhZ2UxTGVuOiB1aW50NjQgPSBhcHByb3ZhbExlbiA8PSBQQUdFX1NJWkUgPyBhcHByb3ZhbExlbiA6IFBBR0VfU0laRQogICAgZHVwCiAgICBpbnRjIDQgLy8gNDA5NgogICAgPD0KICAgIGludGMgNCAvLyA0MDk2CiAgICBkaWcgMgogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjUzNgogICAgLy8gY29uc3QgcGFnZTE6IGJ5dGVzID0gb3AuQm94LmV4dHJhY3QoYXBwcm92YWxLZXksIDAsIHBhZ2UxTGVuKQogICAgYnl0ZWNfMyAvLyAiUGFwIgogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgYm94X2V4dHJhY3QKICAgIGJ1cnkgOAogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6NTM4CiAgICAvLyBhcHByb3ZhbExlbiA+IFBBR0VfU0laRSA/IG9wLkJveC5leHRyYWN0KGFwcHJvdmFsS2V5LCBQQUdFX1NJWkUsIGFwcHJvdmFsTGVuIC0gUEFHRV9TSVpFKSA6IEJ5dGVzKCcnKQogICAgaW50YyA0IC8vIDQwOTYKICAgID4KICAgIGJ6IGNyZWF0ZVBlcmlvZF90ZXJuYXJ5X2ZhbHNlQDMKICAgIGRpZyA0CiAgICBpbnRjIDQgLy8gNDA5NgogICAgLQogICAgYnl0ZWNfMyAvLyAiUGFwIgogICAgaW50YyA0IC8vIDQwOTYKICAgIHVuY292ZXIgMgogICAgYm94X2V4dHJhY3QKCmNyZWF0ZVBlcmlvZF90ZXJuYXJ5X21lcmdlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo1NDEtNTQ5CiAgICAvLyBjb25zdCBjcmVhdGVkID0gaXR4bgogICAgLy8gICAuYXBwbGljYXRpb25DYWxsKHsKICAgIC8vICAgICBhcHByb3ZhbFByb2dyYW06IFtwYWdlMSwgcGFnZTJdLAogICAgLy8gICAgIGNsZWFyU3RhdGVQcm9ncmFtOiBjb21waWxlZC5jbGVhclN0YXRlUHJvZ3JhbSwKICAgIC8vICAgICBleHRyYVByb2dyYW1QYWdlczogUEVSSU9EX0VYVFJBX1BST0dSQU1fUEFHRVMsCiAgICAvLyAgICAgZ2xvYmFsTnVtVWludDogUEVSSU9EX0dMT0JBTF9OVU1fVUlOVCwKICAgIC8vICAgICBnbG9iYWxOdW1CeXRlczogUEVSSU9EX0dMT0JBTF9OVU1fQllURVMsCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6NTQ3CiAgICAvLyBnbG9iYWxOdW1CeXRlczogUEVSSU9EX0dMT0JBTF9OVU1fQllURVMsCiAgICBwdXNoaW50IDMgLy8gMwogICAgaXR4bl9maWVsZCBHbG9iYWxOdW1CeXRlU2xpY2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjU0NgogICAgLy8gZ2xvYmFsTnVtVWludDogUEVSSU9EX0dMT0JBTF9OVU1fVUlOVCwKICAgIHB1c2hpbnQgNyAvLyA3CiAgICBpdHhuX2ZpZWxkIEdsb2JhbE51bVVpbnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjU0NQogICAgLy8gZXh0cmFQcm9ncmFtUGFnZXM6IFBFUklPRF9FWFRSQV9QUk9HUkFNX1BBR0VTLAogICAgcHVzaGludCAzIC8vIDMKICAgIGl0eG5fZmllbGQgRXh0cmFQcm9ncmFtUGFnZXMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjU0MAogICAgLy8gY29uc3QgY29tcGlsZWQgPSBjb21waWxlKEdHb3ZQZXJpb2RDb250cmFjdCkgLy8gY2xlYXJTdGF0ZVByb2dyYW0gb25seSDigJQgYXBwcm92YWwgY29tZXMgZnJvbSBib3gKICAgIGJ5dGVjIDIyIC8vIGJhc2U2NChDNEVCUXc9PSkKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW1QYWdlcwogICAgZGlnIDcKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtUGFnZXMKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtUGFnZXMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjU0MS01NDgKICAgIC8vIGNvbnN0IGNyZWF0ZWQgPSBpdHhuCiAgICAvLyAgIC5hcHBsaWNhdGlvbkNhbGwoewogICAgLy8gICAgIGFwcHJvdmFsUHJvZ3JhbTogW3BhZ2UxLCBwYWdlMl0sCiAgICAvLyAgICAgY2xlYXJTdGF0ZVByb2dyYW06IGNvbXBpbGVkLmNsZWFyU3RhdGVQcm9ncmFtLAogICAgLy8gICAgIGV4dHJhUHJvZ3JhbVBhZ2VzOiBQRVJJT0RfRVhUUkFfUFJPR1JBTV9QQUdFUywKICAgIC8vICAgICBnbG9iYWxOdW1VaW50OiBQRVJJT0RfR0xPQkFMX05VTV9VSU5ULAogICAgLy8gICAgIGdsb2JhbE51bUJ5dGVzOiBQRVJJT0RfR0xPQkFMX05VTV9CWVRFUywKICAgIC8vICAgfSkKICAgIHB1c2hpbnQgNiAvLyA2CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjU0MS01NDkKICAgIC8vIGNvbnN0IGNyZWF0ZWQgPSBpdHhuCiAgICAvLyAgIC5hcHBsaWNhdGlvbkNhbGwoewogICAgLy8gICAgIGFwcHJvdmFsUHJvZ3JhbTogW3BhZ2UxLCBwYWdlMl0sCiAgICAvLyAgICAgY2xlYXJTdGF0ZVByb2dyYW06IGNvbXBpbGVkLmNsZWFyU3RhdGVQcm9ncmFtLAogICAgLy8gICAgIGV4dHJhUHJvZ3JhbVBhZ2VzOiBQRVJJT0RfRVhUUkFfUFJPR1JBTV9QQUdFUywKICAgIC8vICAgICBnbG9iYWxOdW1VaW50OiBQRVJJT0RfR0xPQkFMX05VTV9VSU5ULAogICAgLy8gICAgIGdsb2JhbE51bUJ5dGVzOiBQRVJJT0RfR0xPQkFMX05VTV9CWVRFUywKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBDcmVhdGVkQXBwbGljYXRpb25JRAogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6NTUyLTU1NwogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgcmVjZWl2ZXI6IG5ld0FwcElkLmFkZHJlc3MsCiAgICAvLyAgICAgYW1vdW50OiBtYnJQYXltZW50LmFtb3VudCwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo1NTQKICAgIC8vIHJlY2VpdmVyOiBuZXdBcHBJZC5hZGRyZXNzLAogICAgZHVwCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo1NTUKICAgIC8vIGFtb3VudDogbWJyUGF5bWVudC5hbW91bnQsCiAgICBkaWcgMgogICAgZ3R4bnMgQW1vdW50CiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6NTUyLTU1NgogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgcmVjZWl2ZXI6IG5ld0FwcElkLmFkZHJlc3MsCiAgICAvLyAgICAgYW1vdW50OiBtYnJQYXltZW50LmFtb3VudCwKICAgIC8vICAgfSkKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjU1Mi01NTcKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIHJlY2VpdmVyOiBuZXdBcHBJZC5hZGRyZXNzLAogICAgLy8gICAgIGFtb3VudDogbWJyUGF5bWVudC5hbW91bnQsCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjU1OS01NjIKICAgIC8vIGNvbXBpbGVBcmM0KEdHb3ZQZXJpb2RDb250cmFjdCkuY2FsbC5pbml0KHsKICAgIC8vICAgYXBwSWQ6IG5ld0FwcElkLAogICAgLy8gICBhcmdzOiBbR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbklkLCBwZXJpb2RJZCwgY29tbWl0dGVlSWQsIHUzMih2b3RpbmdTdGFydCksIHUzMih2b3RpbmdFbmQpXSwKICAgIC8vIH0pCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo1NjEKICAgIC8vIGFyZ3M6IFtHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uSWQsIHBlcmlvZElkLCBjb21taXR0ZWVJZCwgdTMyKHZvdGluZ1N0YXJ0KSwgdTMyKHZvdGluZ0VuZCldLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbklECiAgICBpdG9iCiAgICBkaWcgNAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBjYWxsc3ViIHUzMgogICAgZGlnIDUKICAgIGR1cAogICAgY292ZXIgNAogICAgY2FsbHN1YiB1MzIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjU1OS01NjIKICAgIC8vIGNvbXBpbGVBcmM0KEdHb3ZQZXJpb2RDb250cmFjdCkuY2FsbC5pbml0KHsKICAgIC8vICAgYXBwSWQ6IG5ld0FwcElkLAogICAgLy8gICBhcmdzOiBbR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbklkLCBwZXJpb2RJZCwgY29tbWl0dGVlSWQsIHUzMih2b3RpbmdTdGFydCksIHUzMih2b3RpbmdFbmQpXSwKICAgIC8vIH0pCiAgICBwdXNoYnl0ZXMgMHhmNTc5Y2FjMiAvLyBtZXRob2QgImluaXQodWludDY0LHVpbnQzMixieXRlWzMyXSx1aW50MzIsdWludDMyKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgdW5jb3ZlciAyCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDEwCiAgICBkdXAKICAgIGNvdmVyIDYKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBkaWcgOQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICBkaWcgMgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6NTY2CiAgICAvLyB2b3RpbmdTdGFydDogdTMyKHZvdGluZ1N0YXJ0KSwKICAgIGNhbGxzdWIgdTMyCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo1NjcKICAgIC8vIHZvdGluZ0VuZDogdTMyKHZvdGluZ0VuZCksCiAgICBzd2FwCiAgICBjYWxsc3ViIHUzMgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6NTY4CiAgICAvLyBudW1Ub3BpY3M6IHUzMigwKSwKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIHUzMgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6NTY0LTU3MAogICAgLy8gdGhpcy5wZXJpb2RzKHBlcmlvZElkKS52YWx1ZSA9IHsKICAgIC8vICAgYXBwSWQ6IG5ld0FwcElkLmlkLAogICAgLy8gICB2b3RpbmdTdGFydDogdTMyKHZvdGluZ1N0YXJ0KSwKICAgIC8vICAgdm90aW5nRW5kOiB1MzIodm90aW5nRW5kKSwKICAgIC8vICAgbnVtVG9waWNzOiB1MzIoMCksCiAgICAvLyAgIHJlYWR5OiBmYWxzZSwKICAgIC8vIH0KICAgIHVuY292ZXIgMwogICAgaXRvYgogICAgZHVwCiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBieXRlYyAxNCAvLyAweDAwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjkzCiAgICAvLyBwZXJpb2RzID0gQm94TWFwPFVpbnQzMiwgR0dvdlBlcmlvZFN1bW1hcnk+KHsga2V5UHJlZml4OiAncCcgfSkKICAgIGJ5dGVjIDcgLy8gInAiCiAgICBkaWcgMwogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo1NjQtNTcwCiAgICAvLyB0aGlzLnBlcmlvZHMocGVyaW9kSWQpLnZhbHVlID0gewogICAgLy8gICBhcHBJZDogbmV3QXBwSWQuaWQsCiAgICAvLyAgIHZvdGluZ1N0YXJ0OiB1MzIodm90aW5nU3RhcnQpLAogICAgLy8gICB2b3RpbmdFbmQ6IHUzMih2b3RpbmdFbmQpLAogICAgLy8gICBudW1Ub3BpY3M6IHUzMigwKSwKICAgIC8vICAgcmVhZHk6IGZhbHNlLAogICAgLy8gfQogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6NTcyCiAgICAvLyByZXR1cm4gW3BlcmlvZElkLCBuZXdBcHBJZC5pZF0KICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6NTAyLTUwNwogICAgLy8gcHVibGljIGNyZWF0ZVBlcmlvZCgKICAgIC8vICAgY29tbWl0dGVlSWQ6IENvbW1pdHRlZUlkLAogICAgLy8gICB2b3RpbmdTdGFydDogdWludDY0LAogICAgLy8gICB2b3RpbmdFbmQ6IHVpbnQ2NCwKICAgIC8vICAgbWJyUGF5bWVudDogZ3R4bi5QYXltZW50VHhuLAogICAgLy8gKTogW1VpbnQzMiwgdWludDY0XSB7CiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpjcmVhdGVQZXJpb2RfdGVybmFyeV9mYWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6NTM4CiAgICAvLyBhcHByb3ZhbExlbiA+IFBBR0VfU0laRSA/IG9wLkJveC5leHRyYWN0KGFwcHJvdmFsS2V5LCBQQUdFX1NJWkUsIGFwcHJvdmFsTGVuIC0gUEFHRV9TSVpFKSA6IEJ5dGVzKCcnKQogICAgYnl0ZWNfMCAvLyAiIgogICAgYiBjcmVhdGVQZXJpb2RfdGVybmFyeV9tZXJnZUA0CgoKLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6OkdHb3ZSZWdpc3RyeUNvbnRyYWN0LnNldExhc3RQZXJpb2RJZFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnNldExhc3RQZXJpb2RJZDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjU4NwogICAgLy8gcHVibGljIHNldExhc3RQZXJpb2RJZChuZXdMYXN0UGVyaW9kSWQ6IHVpbnQ2NCk6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgOCAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo1ODgKICAgIC8vIHRoaXMuZW5zdXJlQ2FsbGVySXNBZG1pbigpCiAgICBjYWxsc3ViIGVuc3VyZUNhbGxlcklzQWRtaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjU4OQogICAgLy8gY29uc3QgY3VyID0gdGhpcy5sYXN0UGVyaW9kSWQudmFsdWUKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo5MQogICAgLy8gbGFzdFBlcmlvZElkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCB9KQogICAgYnl0ZWMgMTEgLy8gImxhc3RQZXJpb2RJZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjU4OQogICAgLy8gY29uc3QgY3VyID0gdGhpcy5sYXN0UGVyaW9kSWQudmFsdWUKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBjb3ZlciAyCiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo1OTAKICAgIC8vIGZvciAobGV0IGlkOiB1aW50NjQgPSBuZXdMYXN0UGVyaW9kSWQgKyAxOyBpZCA8PSBjdXI7IGlkKyspIHsKICAgIGludGNfMSAvLyAxCiAgICArCgpzZXRMYXN0UGVyaW9kSWRfd2hpbGVfdG9wQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo1OTAKICAgIC8vIGZvciAobGV0IGlkOiB1aW50NjQgPSBuZXdMYXN0UGVyaW9kSWQgKyAxOyBpZCA8PSBjdXI7IGlkKyspIHsKICAgIGR1cAogICAgZGlnIDIKICAgIDw9CiAgICBieiBzZXRMYXN0UGVyaW9kSWRfYWZ0ZXJfd2hpbGVANAogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6NTkxCiAgICAvLyBlbnN1cmUoIXRoaXMucGVyaW9kcyh1MzIoaWQpKS5leGlzdHMsIGVyclBlcmlvZEluUmFuZ2UpCiAgICBkdXAKICAgIGNhbGxzdWIgdTMyCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo5MwogICAgLy8gcGVyaW9kcyA9IEJveE1hcDxVaW50MzIsIEdHb3ZQZXJpb2RTdW1tYXJ5Pih7IGtleVByZWZpeDogJ3AnIH0pCiAgICBieXRlYyA3IC8vICJwIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo1OTEKICAgIC8vIGVuc3VyZSghdGhpcy5wZXJpb2RzKHUzMihpZCkpLmV4aXN0cywgZXJyUGVyaW9kSW5SYW5nZSkKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozMwogICAgLy8gaWYgKCFjb25kKSB7CiAgICBieiBzZXRMYXN0UGVyaW9kSWRfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo1OTEKICAgIC8vIGVuc3VyZSghdGhpcy5wZXJpb2RzKHUzMihpZCkpLmV4aXN0cywgZXJyUGVyaW9kSW5SYW5nZSkKICAgIHB1c2hieXRlcyAiRVJSOlBfSVIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjM0CiAgICAvLyBsb2coY29kZSkKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozNQogICAgLy8gZXJyKCkKICAgIGVycgoKc2V0TGFzdFBlcmlvZElkX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjU5MAogICAgLy8gZm9yIChsZXQgaWQ6IHVpbnQ2NCA9IG5ld0xhc3RQZXJpb2RJZCArIDE7IGlkIDw9IGN1cjsgaWQrKykgewogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIHNldExhc3RQZXJpb2RJZF93aGlsZV90b3BAMgoKc2V0TGFzdFBlcmlvZElkX2FmdGVyX3doaWxlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo5MQogICAgLy8gbGFzdFBlcmlvZElkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCB9KQogICAgYnl0ZWMgMTEgLy8gImxhc3RQZXJpb2RJZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjU5MwogICAgLy8gdGhpcy5sYXN0UGVyaW9kSWQudmFsdWUgPSBuZXdMYXN0UGVyaW9kSWQKICAgIGRpZyAzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6NTg3CiAgICAvLyBwdWJsaWMgc2V0TGFzdFBlcmlvZElkKG5ld0xhc3RQZXJpb2RJZDogdWludDY0KTogdm9pZCB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6OkdHb3ZSZWdpc3RyeUNvbnRyYWN0LnVwZGF0ZVBlcmlvZFN1bW1hcnlbcm91dGluZ10oKSAtPiB2b2lkOgp1cGRhdGVQZXJpb2RTdW1tYXJ5OgogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjYwMS02MDcKICAgIC8vIHB1YmxpYyB1cGRhdGVQZXJpb2RTdW1tYXJ5KAogICAgLy8gICBwZXJpb2RJZDogVWludDMyLAogICAgLy8gICB2b3RpbmdTdGFydDogVWludDMyLAogICAgLy8gICB2b3RpbmdFbmQ6IFVpbnQzMiwKICAgIC8vICAgbnVtVG9waWNzOiBVaW50MzIsCiAgICAvLyAgIHJlYWR5OiBib29sZWFuLAogICAgLy8gKTogdm9pZCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCA0IC8vIDQKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDMyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgcHVzaGludCA0IC8vIDQKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDMyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgcHVzaGludCA0IC8vIDQKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDMyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgcHVzaGludCA0IC8vIDQKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDMyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA1CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuYm9vbAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgc3dhcAogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6OTMKICAgIC8vIHBlcmlvZHMgPSBCb3hNYXA8VWludDMyLCBHR292UGVyaW9kU3VtbWFyeT4oeyBrZXlQcmVmaXg6ICdwJyB9KQogICAgYnl0ZWMgNyAvLyAicCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo2MDkKICAgIC8vIGVuc3VyZShib3guZXhpc3RzLCBlcnJHR292UGVyaW9kTm90RXhpc3RzKQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjMzCiAgICAvLyBpZiAoIWNvbmQpIHsKICAgIGJueiB1cGRhdGVQZXJpb2RTdW1tYXJ5X2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6NjA5CiAgICAvLyBlbnN1cmUoYm94LmV4aXN0cywgZXJyR0dvdlBlcmlvZE5vdEV4aXN0cykKICAgIGJ5dGVjIDI5IC8vICJFUlI6R1BfTlgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjM0CiAgICAvLyBsb2coY29kZSkKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozNQogICAgLy8gZXJyKCkKICAgIGVycgoKdXBkYXRlUGVyaW9kU3VtbWFyeV9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo2MTAKICAgIC8vIGNvbnN0IHN1bW1hcnkgPSBjbG9uZShib3gudmFsdWUpCiAgICBkdXAKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgYnVyeSA4CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6NjExCiAgICAvLyBlbnN1cmUoR2xvYmFsLmNhbGxlckFwcGxpY2F0aW9uSWQgPT09IHN1bW1hcnkuYXBwSWQsIGVyclVuYXV0aG9yaXplZCkKICAgIGdsb2JhbCBDYWxsZXJBcHBsaWNhdGlvbklECiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjMzCiAgICAvLyBpZiAoIWNvbmQpIHsKICAgIGJueiB1cGRhdGVQZXJpb2RTdW1tYXJ5X2FmdGVyX2lmX2Vsc2VANwogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6NjExCiAgICAvLyBlbnN1cmUoR2xvYmFsLmNhbGxlckFwcGxpY2F0aW9uSWQgPT09IHN1bW1hcnkuYXBwSWQsIGVyclVuYXV0aG9yaXplZCkKICAgIGJ5dGVjIDUgLy8gIkVSUjpBVVRIIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozNAogICAgLy8gbG9nKGNvZGUpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzUKICAgIC8vIGVycigpCiAgICBlcnIKCnVwZGF0ZVBlcmlvZFN1bW1hcnlfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6NjEyCiAgICAvLyBzdW1tYXJ5LnZvdGluZ1N0YXJ0ID0gdm90aW5nU3RhcnQKICAgIGRpZyA1CiAgICBkaWcgNQogICAgcmVwbGFjZTIgOAogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6NjEzCiAgICAvLyBzdW1tYXJ5LnZvdGluZ0VuZCA9IHZvdGluZ0VuZAogICAgZGlnIDQKICAgIHJlcGxhY2UyIDEyCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo2MTQKICAgIC8vIHN1bW1hcnkubnVtVG9waWNzID0gbnVtVG9waWNzCiAgICBkaWcgMwogICAgcmVwbGFjZTIgMTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjYxNQogICAgLy8gc3VtbWFyeS5yZWFkeSA9IHJlYWR5CiAgICBwdXNoaW50IDE2MCAvLyAxNjAKICAgIGRpZyAzCiAgICBzZXRiaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjYxNgogICAgLy8gYm94LnZhbHVlID0gY2xvbmUoc3VtbWFyeSkKICAgIGRpZyAxCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo2MDEtNjA3CiAgICAvLyBwdWJsaWMgdXBkYXRlUGVyaW9kU3VtbWFyeSgKICAgIC8vICAgcGVyaW9kSWQ6IFVpbnQzMiwKICAgIC8vICAgdm90aW5nU3RhcnQ6IFVpbnQzMiwKICAgIC8vICAgdm90aW5nRW5kOiBVaW50MzIsCiAgICAvLyAgIG51bVRvcGljczogVWludDMyLAogICAgLy8gICByZWFkeTogYm9vbGVhbiwKICAgIC8vICk6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjpHR292UmVnaXN0cnlDb250cmFjdC5yZW1vdmVQZXJpb2RTdW1tYXJ5W3JvdXRpbmddKCkgLT4gdm9pZDoKcmVtb3ZlUGVyaW9kU3VtbWFyeToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjYyNgogICAgLy8gcHVibGljIHJlbW92ZVBlcmlvZFN1bW1hcnkocGVyaW9kSWQ6IFVpbnQzMik6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgNCAvLyA0CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQzMgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6OTMKICAgIC8vIHBlcmlvZHMgPSBCb3hNYXA8VWludDMyLCBHR292UGVyaW9kU3VtbWFyeT4oeyBrZXlQcmVmaXg6ICdwJyB9KQogICAgYnl0ZWMgNyAvLyAicCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo2MjgKICAgIC8vIGVuc3VyZShib3guZXhpc3RzLCBlcnJHR292UGVyaW9kTm90RXhpc3RzKQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjMzCiAgICAvLyBpZiAoIWNvbmQpIHsKICAgIGJueiByZW1vdmVQZXJpb2RTdW1tYXJ5X2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6NjI4CiAgICAvLyBlbnN1cmUoYm94LmV4aXN0cywgZXJyR0dvdlBlcmlvZE5vdEV4aXN0cykKICAgIGJ5dGVjIDI5IC8vICJFUlI6R1BfTlgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjM0CiAgICAvLyBsb2coY29kZSkKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozNQogICAgLy8gZXJyKCkKICAgIGVycgoKcmVtb3ZlUGVyaW9kU3VtbWFyeV9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo2MjkKICAgIC8vIGVuc3VyZShHbG9iYWwuY2FsbGVyQXBwbGljYXRpb25JZCA9PT0gYm94LnZhbHVlLmFwcElkLCBlcnJVbmF1dGhvcml6ZWQpCiAgICBnbG9iYWwgQ2FsbGVyQXBwbGljYXRpb25JRAogICAgZGlnIDEKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjMzCiAgICAvLyBpZiAoIWNvbmQpIHsKICAgIGJueiByZW1vdmVQZXJpb2RTdW1tYXJ5X2FmdGVyX2lmX2Vsc2VANwogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6NjI5CiAgICAvLyBlbnN1cmUoR2xvYmFsLmNhbGxlckFwcGxpY2F0aW9uSWQgPT09IGJveC52YWx1ZS5hcHBJZCwgZXJyVW5hdXRob3JpemVkKQogICAgYnl0ZWMgNSAvLyAiRVJSOkFVVEgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjM0CiAgICAvLyBsb2coY29kZSkKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozNQogICAgLy8gZXJyKCkKICAgIGVycgoKcmVtb3ZlUGVyaW9kU3VtbWFyeV9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo2MzAKICAgIC8vIGJveC5kZWxldGUoKQogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjYyNgogICAgLy8gcHVibGljIHJlbW92ZVBlcmlvZFN1bW1hcnkocGVyaW9kSWQ6IFVpbnQzMik6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjpHR292UmVnaXN0cnlDb250cmFjdC5nZXRQZXJpb2RBcHBbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRQZXJpb2RBcHA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo2MzQKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgOCAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6NjM2CiAgICAvLyBjb25zdCBib3ggPSB0aGlzLnBlcmlvZHModTMyKHBlcmlvZElkKSkKICAgIGNhbGxzdWIgdTMyCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo5MwogICAgLy8gcGVyaW9kcyA9IEJveE1hcDxVaW50MzIsIEdHb3ZQZXJpb2RTdW1tYXJ5Pih7IGtleVByZWZpeDogJ3AnIH0pCiAgICBieXRlYyA3IC8vICJwIgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjYzNwogICAgLy8gaWYgKGJveC5leGlzdHMpIHJldHVybiBib3gudmFsdWUuYXBwSWQKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogZ2V0UGVyaW9kQXBwX2FmdGVyX2lmX2Vsc2VAMwogICAgZHVwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CgpnZXRQZXJpb2RBcHBfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo6R0dvdlJlZ2lzdHJ5Q29udHJhY3QuZ2V0UGVyaW9kQXBwQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo2MzQKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgaXRvYgogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKZ2V0UGVyaW9kQXBwX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjYzOAogICAgLy8gcmV0dXJuIDAKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo2MzQKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgYiBnZXRQZXJpb2RBcHBfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo6R0dvdlJlZ2lzdHJ5Q29udHJhY3QuZ2V0UGVyaW9kQXBwQDQKCgovLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo6R0dvdlJlZ2lzdHJ5Q29udHJhY3QuZ2V0UGVyaW9kU3VtbWFyeVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldFBlcmlvZFN1bW1hcnk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo2NDIKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgOCAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6NjQ0CiAgICAvLyBjb25zdCBib3ggPSB0aGlzLnBlcmlvZHModTMyKHBlcmlvZElkKSkKICAgIGNhbGxzdWIgdTMyCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo5MwogICAgLy8gcGVyaW9kcyA9IEJveE1hcDxVaW50MzIsIEdHb3ZQZXJpb2RTdW1tYXJ5Pih7IGtleVByZWZpeDogJ3AnIH0pCiAgICBieXRlYyA3IC8vICJwIgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjY0NQogICAgLy8gaWYgKGJveC5leGlzdHMpIHJldHVybiBib3gudmFsdWUKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogZ2V0UGVyaW9kU3VtbWFyeV9hZnRlcl9pZl9lbHNlQDMKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKCmdldFBlcmlvZFN1bW1hcnlfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo6R0dvdlJlZ2lzdHJ5Q29udHJhY3QuZ2V0UGVyaW9kU3VtbWFyeUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6NjQyCiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmdldFBlcmlvZFN1bW1hcnlfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6NjQ2CiAgICAvLyByZXR1cm4gZ2V0RW1wdHlHR292UGVyaW9kU3VtbWFyeSgpCiAgICBjYWxsc3ViIGdldEVtcHR5R0dvdlBlcmlvZFN1bW1hcnkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjY0MgogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICBiIGdldFBlcmlvZFN1bW1hcnlfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo6R0dvdlJlZ2lzdHJ5Q29udHJhY3QuZ2V0UGVyaW9kU3VtbWFyeUA0CgoKLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6OkdHb3ZSZWdpc3RyeUNvbnRyYWN0LmxvZ1BlcmlvZFN1bW1hcmllc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmxvZ1BlcmlvZFN1bW1hcmllczoKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo2NTAKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwbiAyCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBwdXNoaW50IDggLy8gOAogICAgKgogICAgaW50Y18zIC8vIDIKICAgICsKICAgIHN3YXAKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PHVpbnQ2ND4KICAgIGludGNfMCAvLyAwCgpsb2dQZXJpb2RTdW1tYXJpZXNfZm9yX2hlYWRlckAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6NjUyCiAgICAvLyBmb3IgKGNvbnN0IHBlcmlvZElkIG9mIHBlcmlvZElkcykgewogICAgZHVwCiAgICBkaWcgMgogICAgPAogICAgYnogbG9nUGVyaW9kU3VtbWFyaWVzX2FmdGVyX2ZvckA4CiAgICBkaWcgMgogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAxCiAgICBwdXNoaW50IDggLy8gOAogICAgKgogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjY1MwogICAgLy8gY29uc3QgYm94ID0gdGhpcy5wZXJpb2RzKHUzMihwZXJpb2RJZCkpCiAgICBjYWxsc3ViIHUzMgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6OTMKICAgIC8vIHBlcmlvZHMgPSBCb3hNYXA8VWludDMyLCBHR292UGVyaW9kU3VtbWFyeT4oeyBrZXlQcmVmaXg6ICdwJyB9KQogICAgYnl0ZWMgNyAvLyAicCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBidXJ5IDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjY1NAogICAgLy8gaWYgKGJveC5leGlzdHMpIHsKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogbG9nUGVyaW9kU3VtbWFyaWVzX2Vsc2VfYm9keUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo2NTUKICAgIC8vIGxvZyhlbmNvZGVBcmM0KGJveC52YWx1ZSkpCiAgICBkaWcgMwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIGxvZwoKbG9nUGVyaW9kU3VtbWFyaWVzX2FmdGVyX2lmX2Vsc2VANjoKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiBsb2dQZXJpb2RTdW1tYXJpZXNfZm9yX2hlYWRlckAyCgpsb2dQZXJpb2RTdW1tYXJpZXNfZWxzZV9ib2R5QDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo2NTcKICAgIC8vIGxvZyhlbmNvZGVBcmM0KGdldEVtcHR5R0dvdlBlcmlvZFN1bW1hcnkoKSkpCiAgICBjYWxsc3ViIGdldEVtcHR5R0dvdlBlcmlvZFN1bW1hcnkKICAgIGxvZwogICAgYiBsb2dQZXJpb2RTdW1tYXJpZXNfYWZ0ZXJfaWZfZWxzZUA2Cgpsb2dQZXJpb2RTdW1tYXJpZXNfYWZ0ZXJfZm9yQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo2NTAKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjpHR292UmVnaXN0cnlDb250cmFjdC5nZXRDb21taXR0ZWVNZXRhZGF0YVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldENvbW1pdHRlZU1ldGFkYXRhOgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6NjcyCiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIHN3YXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjgyCiAgICAvLyBjb21taXR0ZWVzID0gQm94TWFwPENvbW1pdHRlZUlkLCBDb21taXR0ZWVNZXRhZGF0YT4oeyBrZXlQcmVmaXg6ICdjJyB9KQogICAgYnl0ZWNfMiAvLyAiYyIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo2NzUKICAgIC8vIGlmIChjb21taXR0ZWVCb3guZXhpc3RzKSB7CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IGdldENvbW1pdHRlZU1ldGFkYXRhX2FmdGVyX2lmX2Vsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6Njc2CiAgICAvLyBpZiAobXVzdEJlQ29tcGxldGUpIHsKICAgIGRpZyAxCiAgICBieiBnZXRDb21taXR0ZWVNZXRhZGF0YV9hZnRlcl9pZl9lbHNlQDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjY3NwogICAgLy8gZW5zdXJlKGNvbW1pdHRlZUJveC52YWx1ZS5pbmdlc3RlZFZvdGVzID09PSBjb21taXR0ZWVCb3gudmFsdWUudG90YWxWb3RlcywgZXJyQ29tbWl0dGVlSW5jb21wbGV0ZSkKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIGR1cAogICAgZXh0cmFjdCAyNiA0CiAgICBzd2FwCiAgICBleHRyYWN0IDE0IDQKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjMzCiAgICAvLyBpZiAoIWNvbmQpIHsKICAgIGJueiBnZXRDb21taXR0ZWVNZXRhZGF0YV9hZnRlcl9pZl9lbHNlQDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjY3NwogICAgLy8gZW5zdXJlKGNvbW1pdHRlZUJveC52YWx1ZS5pbmdlc3RlZFZvdGVzID09PSBjb21taXR0ZWVCb3gudmFsdWUudG90YWxWb3RlcywgZXJyQ29tbWl0dGVlSW5jb21wbGV0ZSkKICAgIGJ5dGVjIDI4IC8vICJFUlI6Q19OQyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzQKICAgIC8vIGxvZyhjb2RlKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjM1CiAgICAvLyBlcnIoKQogICAgZXJyCgpnZXRDb21taXR0ZWVNZXRhZGF0YV9hZnRlcl9pZl9lbHNlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo2NzkKICAgIC8vIHJldHVybiBjb21taXR0ZWVCb3gudmFsdWUKICAgIGR1cAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKCmdldENvbW1pdHRlZU1ldGFkYXRhX2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6OkdHb3ZSZWdpc3RyeUNvbnRyYWN0LmdldENvbW1pdHRlZU1ldGFkYXRhQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo2NzIKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKZ2V0Q29tbWl0dGVlTWV0YWRhdGFfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6NjgxCiAgICAvLyByZXR1cm4gZ2V0RW1wdHlDb21taXR0ZWVNZXRhZGF0YSgpCiAgICBjYWxsc3ViIGdldEVtcHR5Q29tbWl0dGVlTWV0YWRhdGEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjY3MgogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICBiIGdldENvbW1pdHRlZU1ldGFkYXRhX2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6OkdHb3ZSZWdpc3RyeUNvbnRyYWN0LmdldENvbW1pdHRlZU1ldGFkYXRhQDYKCgovLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo6R0dvdlJlZ2lzdHJ5Q29udHJhY3QubG9nQ29tbWl0dGVlTWV0YWRhdGFbcm91dGluZ10oKSAtPiB2b2lkOgpsb2dDb21taXR0ZWVNZXRhZGF0YToKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo2ODgKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwbiAyCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzIgLy8gMzIKICAgICoKICAgIGludGNfMyAvLyAyCiAgICArCiAgICBzd2FwCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4+CiAgICBpbnRjXzAgLy8gMAoKbG9nQ29tbWl0dGVlTWV0YWRhdGFfZm9yX2hlYWRlckAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6NjkwCiAgICAvLyBmb3IgKGNvbnN0IGNvbW1pdHRlZUlkIG9mIGNvbW1pdHRlZUlkcykgewogICAgZHVwCiAgICBkaWcgMgogICAgPAogICAgYnogbG9nQ29tbWl0dGVlTWV0YWRhdGFfYWZ0ZXJfZm9yQDgKICAgIGRpZyAyCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDEKICAgIGludGNfMiAvLyAzMgogICAgKgogICAgaW50Y18yIC8vIDMyCiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjgyCiAgICAvLyBjb21taXR0ZWVzID0gQm94TWFwPENvbW1pdHRlZUlkLCBDb21taXR0ZWVNZXRhZGF0YT4oeyBrZXlQcmVmaXg6ICdjJyB9KQogICAgYnl0ZWNfMiAvLyAiYyIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBidXJ5IDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjY5MgogICAgLy8gaWYgKG1ldGFkYXRhLmV4aXN0cykgewogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBsb2dDb21taXR0ZWVNZXRhZGF0YV9lbHNlX2JvZHlANQogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6NjkzCiAgICAvLyBsb2coZW5jb2RlQXJjNChtZXRhZGF0YS52YWx1ZSkpCiAgICBkaWcgMwogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIGxvZwoKbG9nQ29tbWl0dGVlTWV0YWRhdGFfYWZ0ZXJfaWZfZWxzZUA2OgogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIGxvZ0NvbW1pdHRlZU1ldGFkYXRhX2Zvcl9oZWFkZXJAMgoKbG9nQ29tbWl0dGVlTWV0YWRhdGFfZWxzZV9ib2R5QDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo2OTUKICAgIC8vIGxvZyhlbmNvZGVBcmM0KGdldEVtcHR5Q29tbWl0dGVlTWV0YWRhdGEoKSkpCiAgICBjYWxsc3ViIGdldEVtcHR5Q29tbWl0dGVlTWV0YWRhdGEKICAgIGxvZwogICAgYiBsb2dDb21taXR0ZWVNZXRhZGF0YV9hZnRlcl9pZl9lbHNlQDYKCmxvZ0NvbW1pdHRlZU1ldGFkYXRhX2FmdGVyX2ZvckA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6Njg4CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo6R0dvdlJlZ2lzdHJ5Q29udHJhY3QubG9nQ29tbWl0dGVlUGFnZXNbcm91dGluZ10oKSAtPiB2b2lkOgpsb2dDb21taXR0ZWVQYWdlczoKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICIiCiAgICBkdXBuIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjcxMAogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBzd2FwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCA4IC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICBzd2FwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCA4IC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo3MTgKICAgIC8vIGNvbnN0IGNvbW1pdHRlZU1ldGFkYXRhID0gdGhpcy5tdXN0R2V0Q29tbWl0dGVlTWV0YWRhdGEoY29tbWl0dGVlSWQpCiAgICBjYWxsc3ViIG11c3RHZXRDb21taXR0ZWVNZXRhZGF0YQogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo4MjQKICAgIC8vIHJldHVybiAnUycgKyBtZXRhZGF0YS5udW1lcmljSWQuYXNVaW50NjQoKS50b1N0cmluZygpCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGNhbGxzdWIgaXRvYQogICAgYnl0ZWMgNCAvLyAiUyIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICAvLyBub2RlX21vZHVsZXMvQGQxM2NvL3N1cGVyYm94L3NtYXJ0X2NvbnRyYWN0cy9zdXBlcmJveC9saWIvdXRpbHMuYWxnby50czo0NAogICAgLy8gcmV0dXJuIEJveDxTdXBlcmJveE1ldGE+KHsga2V5OiBCeXRlcyhuYW1lKS5jb25jYXQoQnl0ZXMoJ19tJykpIH0pCiAgICBieXRlYyA2IC8vICJfbSIKICAgIGNvbmNhdAogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo3MjEKICAgIC8vIGVuc3VyZShzYk1ldGFCb3hSZWYuZXhpc3RzLCBlcnJDb21taXR0ZWVOb3RFeGlzdHMpCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzMKICAgIC8vIGlmICghY29uZCkgewogICAgYm56IGxvZ0NvbW1pdHRlZVBhZ2VzX2FmdGVyX2lmX2Vsc2VAMTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjcyMQogICAgLy8gZW5zdXJlKHNiTWV0YUJveFJlZi5leGlzdHMsIGVyckNvbW1pdHRlZU5vdEV4aXN0cykKICAgIGJ5dGVjIDE1IC8vICJFUlI6Q19OWCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzQKICAgIC8vIGxvZyhjb2RlKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjM1CiAgICAvLyBlcnIoKQogICAgZXJyCgpsb2dDb21taXR0ZWVQYWdlc19hZnRlcl9pZl9lbHNlQDE2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6NzIyCiAgICAvLyBjb25zdCBzYk1ldGEgPSBjbG9uZShzYk1ldGFCb3hSZWYudmFsdWUpCiAgICBkdXAKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGJ1cnkgMTEKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo3MjMKICAgIC8vIGlmIChsb2dNZXRhZGF0YSkgewogICAgZGlnIDUKICAgIGJ6IGxvZ0NvbW1pdHRlZVBhZ2VzX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6NzI0CiAgICAvLyBsb2coZW5jb2RlQXJjNChjb21taXR0ZWVNZXRhZGF0YSkpCiAgICBkaWcgMgogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo3MjUKICAgIC8vIGxvZyhlbmNvZGVBcmM0KHNiTWV0YSkpCiAgICBkaWcgOQogICAgbG9nCgpsb2dDb21taXR0ZWVQYWdlc19hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo3MjkKICAgIC8vIGNvbnN0IG1heERhdGFQYWdlcyA9IHNiTWV0YS5ib3hCeXRlTGVuZ3Rocy5sZW5ndGgKICAgIGR1cAogICAgcHVzaGludCAyOCAvLyAyOAogICAgaW50Y18zIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBidXJ5IDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjczMAogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IGRhdGFQYWdlTGVuZ3RoOyBpKyspIHsKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDkKCmxvZ0NvbW1pdHRlZVBhZ2VzX3doaWxlX3RvcEA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6NzMwCiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgZGF0YVBhZ2VMZW5ndGg7IGkrKykgewogICAgZGlnIDgKICAgIGRpZyA0CiAgICA8CiAgICBieiBsb2dDb21taXR0ZWVQYWdlc19hZnRlcl93aGlsZUA5CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo3MzEKICAgIC8vIGNvbnN0IHBhZ2U6IHVpbnQ2NCA9IHN0YXJ0RGF0YVBhZ2UgKyBpCiAgICBkaWcgNAogICAgZGlnIDkKICAgICsKICAgIGR1cAogICAgYnVyeSA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo3MzIKICAgIC8vIGlmIChwYWdlID49IG1heERhdGFQYWdlcykgewogICAgZGlnIDgKICAgID49CiAgICBieiBsb2dDb21taXR0ZWVQYWdlc19lbHNlX2JvZHlANwogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6NzMzCiAgICAvLyBsb2coQnl0ZXNgYCkgLy8gbm8gcGFnZSBhdCBpbmRleDsgbG9nZ2luZyBlbXB0eQogICAgYnl0ZWNfMCAvLyAiIgogICAgbG9nCgpsb2dDb21taXR0ZWVQYWdlc19hZnRlcl9pZl9lbHNlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo3MzAKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBkYXRhUGFnZUxlbmd0aDsgaSsrKSB7CiAgICBkaWcgOAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgOQogICAgYiBsb2dDb21taXR0ZWVQYWdlc193aGlsZV90b3BANAoKbG9nQ29tbWl0dGVlUGFnZXNfZWxzZV9ib2R5QDc6CiAgICAvLyBub2RlX21vZHVsZXMvQGQxM2NvL3N1cGVyYm94L3NtYXJ0X2NvbnRyYWN0cy9zdXBlcmJveC9saWIvdXRpbHMuYWxnby50czoyNQogICAgLy8gcmV0dXJuIEJ5dGVzKG5hbWUpLmNvbmNhdChCeXRlcygnXycpKS5jb25jYXQoQnl0ZXMoaXRvYShudW0pKSkKICAgIGRpZyAxCiAgICBieXRlYyAxNiAvLyAiXyIKICAgIGNvbmNhdAogICAgZGlnIDcKICAgIGNhbGxzdWIgQGQxM2NvL3N1cGVyYm94L3NtYXJ0X2NvbnRyYWN0cy9zdXBlcmJveC9saWIvdXRpbHMuYWxnby50czo6aXRvYQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo3MzUKICAgIC8vIGxvZyhzYkRhdGFCb3hSZWYoc3VwZXJib3hQcmVmaXgsIHBhZ2UpLnZhbHVlKQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIGxvZwogICAgYiBsb2dDb21taXR0ZWVQYWdlc19hZnRlcl9pZl9lbHNlQDgKCmxvZ0NvbW1pdHRlZVBhZ2VzX2FmdGVyX3doaWxlQDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo3MTAKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjpHR292UmVnaXN0cnlDb250cmFjdC5nZXRDb21taXR0ZWVTdXBlcmJveE1ldGFbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRDb21taXR0ZWVTdXBlcmJveE1ldGE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo3NDUKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo4MTYKICAgIC8vIHJldHVybiB0aGlzLmdldE1ldGFkYXRhU0JQcmVmaXgodGhpcy5tdXN0R2V0Q29tbWl0dGVlTWV0YWRhdGEoY29tbWl0dGVlSWQpKQogICAgY2FsbHN1YiBtdXN0R2V0Q29tbWl0dGVlTWV0YWRhdGEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjgyNAogICAgLy8gcmV0dXJuICdTJyArIG1ldGFkYXRhLm51bWVyaWNJZC5hc1VpbnQ2NCgpLnRvU3RyaW5nKCkKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgY2FsbHN1YiBpdG9hCiAgICBieXRlYyA0IC8vICJTIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBub2RlX21vZHVsZXMvQGQxM2NvL3N1cGVyYm94L3NtYXJ0X2NvbnRyYWN0cy9zdXBlcmJveC9saWIvdXRpbHMuYWxnby50czo0NAogICAgLy8gcmV0dXJuIEJveDxTdXBlcmJveE1ldGE+KHsga2V5OiBCeXRlcyhuYW1lKS5jb25jYXQoQnl0ZXMoJ19tJykpIH0pCiAgICBieXRlYyA2IC8vICJfbSIKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6NzQ4CiAgICAvLyByZXR1cm4gc2JNZXRhQm94KHN1cGVyYm94TmFtZSkudmFsdWUKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo3NDUKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjpHR292UmVnaXN0cnlDb250cmFjdC5nZXRYR292Vm90aW5nUG93ZXJbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRYR292Vm90aW5nUG93ZXI6CiAgICBpbnRjXzAgLy8gMAogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo3NTcKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjc1OQogICAgLy8gY29uc3QgY29tbWl0dGVlTWV0YWRhdGEgPSB0aGlzLm11c3RHZXRDb21taXR0ZWVNZXRhZGF0YShjb21taXR0ZWVJZCkKICAgIHN3YXAKICAgIGNhbGxzdWIgbXVzdEdldENvbW1pdHRlZU1ldGFkYXRhCiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo3NjEKICAgIC8vIGNvbnN0IGdHb3ZBY2NvdW50ID0gdGhpcy5nZXRBY2NvdW50SWZFeGlzdHMoYWNjb3VudCkKICAgIGNhbGxzdWIgZ2V0QWNjb3VudElmRXhpc3RzCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjc2MgogICAgLy8gZW5zdXJlKGdHb3ZBY2NvdW50LmFjY291bnRJZC5hc1VpbnQ2NCgpICE9PSAwLCBlcnJBY2NvdW50Tm90RXhpc3RzKQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDMyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjMzCiAgICAvLyBpZiAoIWNvbmQpIHsKICAgIGJueiBnZXRYR292Vm90aW5nUG93ZXJfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo3NjIKICAgIC8vIGVuc3VyZShnR292QWNjb3VudC5hY2NvdW50SWQuYXNVaW50NjQoKSAhPT0gMCwgZXJyQWNjb3VudE5vdEV4aXN0cykKICAgIGJ5dGVjIDE3IC8vICJFUlI6QV9OWCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzQKICAgIC8vIGxvZyhjb2RlKQogICAgbG9nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjM1CiAgICAvLyBlcnIoKQogICAgZXJyCgpnZXRYR292Vm90aW5nUG93ZXJfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6NzY0CiAgICAvLyBjb25zdCBhY2NvdW50T2Zmc2V0ID0gdGhpcy5nZXRDb21taXR0ZWVBY2NvdW50T2Zmc2V0SGludChjb21taXR0ZWVNZXRhZGF0YS5udW1lcmljSWQsIGdHb3ZBY2NvdW50KQogICAgZGlnIDEKICAgIGR1cAogICAgZXh0cmFjdCAwIDIKICAgIGRpZyAyCiAgICBjYWxsc3ViIGdldENvbW1pdHRlZUFjY291bnRPZmZzZXRIaW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo4MjQKICAgIC8vIHJldHVybiAnUycgKyBtZXRhZGF0YS5udW1lcmljSWQuYXNVaW50NjQoKS50b1N0cmluZygpCiAgICB1bmNvdmVyIDIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgY2FsbHN1YiBpdG9hCiAgICBieXRlYyA0IC8vICJTIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo3NjUKICAgIC8vIGNvbnN0IHhHb3YgPSB0aGlzLmdldFN0b3JlZFhHb3ZBdCh0aGlzLmdldE1ldGFkYXRhU0JQcmVmaXgoY29tbWl0dGVlTWV0YWRhdGEpLCBhY2NvdW50T2Zmc2V0KQogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIGdldFN0b3JlZFhHb3ZBdAogICAgZHVwCiAgICBidXJ5IDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjc2NgogICAgLy8gZW5zdXJlRXh0cmEoeEdvdi5hY2NvdW50SWQgPT09IGdHb3ZBY2NvdW50LmFjY291bnRJZCwgZXJyQWNjb3VudE9mZnNldE1pc21hdGNoLCBnR292QWNjb3VudC5hY2NvdW50SWQuYnl0ZXMpCiAgICBleHRyYWN0IDAgNAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGR1cAogICAgYnVyeSA2CiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czo0MAogICAgLy8gaWYgKCFjb25kKSB7CiAgICBibnogZ2V0WEdvdlZvdGluZ1Bvd2VyX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czo0MQogICAgLy8gbG9nKGV4dHJhKQogICAgZGlnIDMKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6NzY2CiAgICAvLyBlbnN1cmVFeHRyYSh4R292LmFjY291bnRJZCA9PT0gZ0dvdkFjY291bnQuYWNjb3VudElkLCBlcnJBY2NvdW50T2Zmc2V0TWlzbWF0Y2gsIGdHb3ZBY2NvdW50LmFjY291bnRJZC5ieXRlcykKICAgIHB1c2hieXRlcyAiRVJSOkFPX01NIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czo0MgogICAgLy8gbG9nKGNvZGUpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6NDMKICAgIC8vIGVycigpCiAgICBlcnIKCmdldFhHb3ZWb3RpbmdQb3dlcl9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo3NjgKICAgIC8vIHJldHVybiB4R292LnZvdGVzCiAgICBkaWcgMgogICAgZXh0cmFjdCA0IDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjc1NwogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6OkdHb3ZSZWdpc3RyeUNvbnRyYWN0LnRyeUdldFhHb3ZWb3RpbmdQb3dlcltyb3V0aW5nXSgpIC0+IHZvaWQ6CnRyeUdldFhHb3ZWb3RpbmdQb3dlcjoKICAgIGludGNfMCAvLyAwCiAgICBkdXBuIDQKICAgIGJ5dGVjXzAgLy8gIiIKICAgIGR1cG4gNAogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6Nzc1CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo4MgogICAgLy8gY29tbWl0dGVlcyA9IEJveE1hcDxDb21taXR0ZWVJZCwgQ29tbWl0dGVlTWV0YWRhdGE+KHsga2V5UHJlZml4OiAnYycgfSkKICAgIGJ5dGVjXzIgLy8gImMiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6Nzc4CiAgICAvLyBpZiAoIWNvbW1pdHRlZUJveC5leGlzdHMpIHJldHVybiB1MzIoMCkKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYm56IHRyeUdldFhHb3ZWb3RpbmdQb3dlcl9hZnRlcl9pZl9lbHNlQDMKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIHUzMgoKdHJ5R2V0WEdvdlZvdGluZ1Bvd2VyX2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6OkdHb3ZSZWdpc3RyeUNvbnRyYWN0LnRyeUdldFhHb3ZWb3RpbmdQb3dlckAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjc3NQogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgp0cnlHZXRYR292Vm90aW5nUG93ZXJfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6Nzc5CiAgICAvLyBjb25zdCBjb21taXR0ZWVNZXRhZGF0YSA9IGNsb25lKGNvbW1pdHRlZUJveC52YWx1ZSkKICAgIGR1cAogICAgYm94X2dldAogICAgc3dhcAogICAgYnVyeSAxMQogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjc4MQogICAgLy8gY29uc3QgZ0dvdkFjY291bnQgPSB0aGlzLmdldEFjY291bnRJZkV4aXN0cyhhY2NvdW50KQogICAgZGlnIDEKICAgIGNhbGxzdWIgZ2V0QWNjb3VudElmRXhpc3RzCiAgICBkdXAKICAgIGJ1cnkgMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjc4MgogICAgLy8gaWYgKGdHb3ZBY2NvdW50LmFjY291bnRJZC5hc1VpbnQ2NCgpID09PSAwKSByZXR1cm4gdTMyKDApCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MzIKICAgIGR1cAogICAgYnVyeSA0CiAgICBibnogdHJ5R2V0WEdvdlZvdGluZ1Bvd2VyX2FmdGVyX2lmX2Vsc2VANQogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgdTMyCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo3NzUKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgYiB0cnlHZXRYR292Vm90aW5nUG93ZXJfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo6R0dvdlJlZ2lzdHJ5Q29udHJhY3QudHJ5R2V0WEdvdlZvdGluZ1Bvd2VyQDE2Cgp0cnlHZXRYR292Vm90aW5nUG93ZXJfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6Nzg0CiAgICAvLyBsZXQgZm91bmRPZmZzZXQ6IHVpbnQ2NCA9IDAKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjc4NQogICAgLy8gbGV0IGZvdW5kID0gZmFsc2UKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjc4NgogICAgLy8gZm9yIChjb25zdCBbY051bUlkLCBvZmZdIG9mIGNsb25lKGdHb3ZBY2NvdW50LmNvbW1pdHRlZU9mZnNldHMpKSB7CiAgICBkaWcgOAogICAgZHVwCiAgICBwdXNoaW50IDQgLy8gNAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBsZW4KICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgYnVyeSAxMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGJ1cnkgNwogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgNAoKdHJ5R2V0WEdvdlZvdGluZ1Bvd2VyX2Zvcl9oZWFkZXJANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjc4NgogICAgLy8gZm9yIChjb25zdCBbY051bUlkLCBvZmZdIG9mIGNsb25lKGdHb3ZBY2NvdW50LmNvbW1pdHRlZU9mZnNldHMpKSB7CiAgICBkaWcgMwogICAgZGlnIDcKICAgIDwKICAgIGJ6IHRyeUdldFhHb3ZWb3RpbmdQb3dlcl9hZnRlcl9mb3JAMTEKICAgIGRpZyAxMAogICAgZXh0cmFjdCAyIDAKICAgIGRpZyA0CiAgICBwdXNoaW50IDQgLy8gNAogICAgKgogICAgcHVzaGludCA0IC8vIDQKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZHVwCiAgICBidXJ5IDEzCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6Nzg3CiAgICAvLyBpZiAoY051bUlkLmFzVWludDY0KCkgPT09IGNvbW1pdHRlZU1ldGFkYXRhLm51bWVyaWNJZC5hc1VpbnQ2NCgpKSB7CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgID09CiAgICBieiB0cnlHZXRYR292Vm90aW5nUG93ZXJfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo3ODgKICAgIC8vIGZvdW5kT2Zmc2V0ID0gb2ZmLmFzVWludDY0KCkKICAgIGRpZyAxMQogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6Nzg2CiAgICAvLyBmb3IgKGNvbnN0IFtjTnVtSWQsIG9mZl0gb2YgY2xvbmUoZ0dvdkFjY291bnQuY29tbWl0dGVlT2Zmc2V0cykpIHsKICAgIGludGNfMyAvLyAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo3ODgKICAgIC8vIGZvdW5kT2Zmc2V0ID0gb2ZmLmFzVWludDY0KCkKICAgIGV4dHJhY3RfdWludDE2CiAgICBidXJ5IDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjc4OQogICAgLy8gZm91bmQgPSB0cnVlCiAgICBpbnRjXzEgLy8gMQogICAgYnVyeSA2Cgp0cnlHZXRYR292Vm90aW5nUG93ZXJfYWZ0ZXJfaWZfZWxzZUA5OgogICAgZGlnIDMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDQKICAgIGIgdHJ5R2V0WEdvdlZvdGluZ1Bvd2VyX2Zvcl9oZWFkZXJANgoKdHJ5R2V0WEdvdlZvdGluZ1Bvd2VyX2FmdGVyX2ZvckAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjc5MgogICAgLy8gaWYgKCFmb3VuZCkgcmV0dXJuIHUzMigwKQogICAgZGlnIDUKICAgIGJueiB0cnlHZXRYR292Vm90aW5nUG93ZXJfYWZ0ZXJfaWZfZWxzZUAxMwogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgdTMyCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo3NzUKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgYiB0cnlHZXRYR292Vm90aW5nUG93ZXJfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo6R0dvdlJlZ2lzdHJ5Q29udHJhY3QudHJ5R2V0WEdvdlZvdGluZ1Bvd2VyQDE2Cgp0cnlHZXRYR292Vm90aW5nUG93ZXJfYWZ0ZXJfaWZfZWxzZUAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjgyNAogICAgLy8gcmV0dXJuICdTJyArIG1ldGFkYXRhLm51bWVyaWNJZC5hc1VpbnQ2NCgpLnRvU3RyaW5nKCkKICAgIGRpZyA5CiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGNhbGxzdWIgaXRvYQogICAgYnl0ZWMgNCAvLyAiUyIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6Nzk0CiAgICAvLyBjb25zdCB4R292ID0gdGhpcy5nZXRTdG9yZWRYR292QXQodGhpcy5nZXRNZXRhZGF0YVNCUHJlZml4KGNvbW1pdHRlZU1ldGFkYXRhKSwgZm91bmRPZmZzZXQpCiAgICBkaWcgNQogICAgY2FsbHN1YiBnZXRTdG9yZWRYR292QXQKICAgIGR1cAogICAgYnVyeSA5CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo3OTUKICAgIC8vIGlmICh4R292LmFjY291bnRJZC5hc1VpbnQ2NCgpICE9PSBnR292QWNjb3VudC5hY2NvdW50SWQuYXNVaW50NjQoKSkgcmV0dXJuIHUzMigwKQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDMyCiAgICBkaWcgMwogICAgIT0KICAgIGJ6IHRyeUdldFhHb3ZWb3RpbmdQb3dlcl9hZnRlcl9pZl9lbHNlQDE1CiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiB1MzIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjc3NQogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICBiIHRyeUdldFhHb3ZWb3RpbmdQb3dlcl9hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjpHR292UmVnaXN0cnlDb250cmFjdC50cnlHZXRYR292Vm90aW5nUG93ZXJAMTYKCnRyeUdldFhHb3ZWb3RpbmdQb3dlcl9hZnRlcl9pZl9lbHNlQDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6Nzk2CiAgICAvLyByZXR1cm4geEdvdi52b3RlcwogICAgZGlnIDcKICAgIGV4dHJhY3QgNCA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo3NzUKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgYiB0cnlHZXRYR292Vm90aW5nUG93ZXJfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo6R0dvdlJlZ2lzdHJ5Q29udHJhY3QudHJ5R2V0WEdvdlZvdGluZ1Bvd2VyQDE2CgoKLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5QWNjb3VudC5hbGdvLnRzOjpHR292UmVnaXN0cnlBY2NvdW50Q29udHJhY3QuZ2V0QWNjb3VudFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldEFjY291bnQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnlBY2NvdW50LmFsZ28udHM6MTIzCiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5QWNjb3VudC5hbGdvLnRzOjEyNQogICAgLy8gcmV0dXJuIHRoaXMuZ2V0QWNjb3VudElmRXhpc3RzKGFjY291bnQpCiAgICBjYWxsc3ViIGdldEFjY291bnRJZkV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5QWNjb3VudC5hbGdvLnRzOjEyMwogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5QWNjb3VudC5hbGdvLnRzOjpHR292UmVnaXN0cnlBY2NvdW50Q29udHJhY3QubG9nQWNjb3VudHNbcm91dGluZ10oKSAtPiB2b2lkOgpsb2dBY2NvdW50czoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeUFjY291bnQuYWxnby50czoxMzMKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwbiAyCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzIgLy8gMzIKICAgICoKICAgIGludGNfMyAvLyAyCiAgICArCiAgICBzd2FwCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhY2NvdW50PgogICAgaW50Y18wIC8vIDAKCmxvZ0FjY291bnRzX2Zvcl9oZWFkZXJAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeUFjY291bnQuYWxnby50czoxMzUKICAgIC8vIGZvciAoY29uc3QgYWNjb3VudCBvZiBhY2NvdW50cykgewogICAgZHVwCiAgICBkaWcgMgogICAgPAogICAgYnogbG9nQWNjb3VudHNfYWZ0ZXJfZm9yQDUKICAgIGRpZyAyCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18yIC8vIDMyCiAgICAqCiAgICBpbnRjXzIgLy8gMzIKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5QWNjb3VudC5hbGdvLnRzOjEzNgogICAgLy8gbG9nKGVuY29kZUFyYzQodGhpcy5nZXRBY2NvdW50SWZFeGlzdHMoYWNjb3VudCkpKQogICAgY2FsbHN1YiBnZXRBY2NvdW50SWZFeGlzdHMKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiBsb2dBY2NvdW50c19mb3JfaGVhZGVyQDIKCmxvZ0FjY291bnRzX2FmdGVyX2ZvckA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5QWNjb3VudC5hbGdvLnRzOjEzMwogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvYmFzZS5hbGdvLnRzOjpCYXNlQ29udHJhY3QuaW5jcmVhc2VCdWRnZXRbcm91dGluZ10oKSAtPiB2b2lkOgppbmNyZWFzZUJ1ZGdldDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL2Jhc2UuYWxnby50czoyMQogICAgLy8gQGFiaW1ldGhvZCh7IHZhbGlkYXRlRW5jb2Rpbmc6ICd1bnNhZmUtZGlzYWJsZWQnIH0pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS9iYXNlLmFsZ28udHM6MjQKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBpdHhuczsgaSsrKSB7CiAgICBpbnRjXzAgLy8gMAoKaW5jcmVhc2VCdWRnZXRfd2hpbGVfdG9wQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS9iYXNlLmFsZ28udHM6MjQKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBpdHhuczsgaSsrKSB7CiAgICBkdXAKICAgIGRpZyAyCiAgICA8CiAgICBieiBpbmNyZWFzZUJ1ZGdldF9hZnRlcl93aGlsZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS9iYXNlLmFsZ28udHM6MjUtMzEKICAgIC8vIGl0eG4KICAgIC8vICAgLmFwcGxpY2F0aW9uQ2FsbCh7CiAgICAvLyAgICAgYXBwcm92YWxQcm9ncmFtOiBlbXB0eS5jbGVhclN0YXRlUHJvZ3JhbSwgLy8gaW50ZW50aW9uYWxseSB1c2luZyBjbGVhciBzdGF0ZSBwcm9ncmFtIGZvciAicmV0dXJuIHRydWUiCiAgICAvLyAgICAgY2xlYXJTdGF0ZVByb2dyYW06IGVtcHR5LmNsZWFyU3RhdGVQcm9ncmFtLAogICAgLy8gICAgIG9uQ29tcGxldGlvbjogT25Db21wbGV0ZUFjdGlvbi5EZWxldGVBcHBsaWNhdGlvbiwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS9iYXNlLmFsZ28udHM6MjkKICAgIC8vIG9uQ29tcGxldGlvbjogT25Db21wbGV0ZUFjdGlvbi5EZWxldGVBcHBsaWNhdGlvbiwKICAgIHB1c2hpbnQgNSAvLyA1CiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvYmFzZS5hbGdvLnRzOjIzCiAgICAvLyBjb25zdCBlbXB0eSA9IGNvbXBpbGUoRW1wdHlDb250cmFjdCkKICAgIGJ5dGVjIDIyIC8vIGJhc2U2NChDNEVCUXc9PSkKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW1QYWdlcwogICAgYnl0ZWMgMjIgLy8gYmFzZTY0KEM0RUJRdz09KQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW1QYWdlcwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvYmFzZS5hbGdvLnRzOjI1LTMwCiAgICAvLyBpdHhuCiAgICAvLyAgIC5hcHBsaWNhdGlvbkNhbGwoewogICAgLy8gICAgIGFwcHJvdmFsUHJvZ3JhbTogZW1wdHkuY2xlYXJTdGF0ZVByb2dyYW0sIC8vIGludGVudGlvbmFsbHkgdXNpbmcgY2xlYXIgc3RhdGUgcHJvZ3JhbSBmb3IgInJldHVybiB0cnVlIgogICAgLy8gICAgIGNsZWFyU3RhdGVQcm9ncmFtOiBlbXB0eS5jbGVhclN0YXRlUHJvZ3JhbSwKICAgIC8vICAgICBvbkNvbXBsZXRpb246IE9uQ29tcGxldGVBY3Rpb24uRGVsZXRlQXBwbGljYXRpb24sCiAgICAvLyAgIH0pCiAgICBwdXNoaW50IDYgLy8gNgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS9iYXNlLmFsZ28udHM6MjUtMzEKICAgIC8vIGl0eG4KICAgIC8vICAgLmFwcGxpY2F0aW9uQ2FsbCh7CiAgICAvLyAgICAgYXBwcm92YWxQcm9ncmFtOiBlbXB0eS5jbGVhclN0YXRlUHJvZ3JhbSwgLy8gaW50ZW50aW9uYWxseSB1c2luZyBjbGVhciBzdGF0ZSBwcm9ncmFtIGZvciAicmV0dXJuIHRydWUiCiAgICAvLyAgICAgY2xlYXJTdGF0ZVByb2dyYW06IGVtcHR5LmNsZWFyU3RhdGVQcm9ncmFtLAogICAgLy8gICAgIG9uQ29tcGxldGlvbjogT25Db21wbGV0ZUFjdGlvbi5EZWxldGVBcHBsaWNhdGlvbiwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvYmFzZS5hbGdvLnRzOjI0CiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgaXR4bnM7IGkrKykgewogICAgZHVwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIGluY3JlYXNlQnVkZ2V0X3doaWxlX3RvcEAyCgppbmNyZWFzZUJ1ZGdldF9hZnRlcl93aGlsZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvYmFzZS5hbGdvLnRzOjIxCiAgICAvLyBAYWJpbWV0aG9kKHsgdmFsaWRhdGVFbmNvZGluZzogJ3Vuc2FmZS1kaXNhYmxlZCcgfSkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo6R0dvdlJlZ2lzdHJ5Q29udHJhY3QuZW5zdXJlQ2FsbGVySXNBZG1pbigpIC0+IHZvaWQ6CmVuc3VyZUNhbGxlcklzQWRtaW46CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czoyNjQKICAgIC8vIGVuc3VyZShUeG4uc2VuZGVyID09PSB0aGlzLmFkbWluLnZhbHVlLCBlcnJVbmF1dGhvcml6ZWQpCiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6ODcKICAgIC8vIGFkbWluID0gR2xvYmFsU3RhdGU8QWNjb3VudD4oeyBpbml0aWFsVmFsdWU6IEdsb2JhbC5jcmVhdG9yQWRkcmVzcyB9KQogICAgYnl0ZWMgMTIgLy8gImFkbWluIgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6MjY0CiAgICAvLyBlbnN1cmUoVHhuLnNlbmRlciA9PT0gdGhpcy5hZG1pbi52YWx1ZSwgZXJyVW5hdXRob3JpemVkKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjMzCiAgICAvLyBpZiAoIWNvbmQpIHsKICAgIGJueiBlbnN1cmVDYWxsZXJJc0FkbWluX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6MjY0CiAgICAvLyBlbnN1cmUoVHhuLnNlbmRlciA9PT0gdGhpcy5hZG1pbi52YWx1ZSwgZXJyVW5hdXRob3JpemVkKQogICAgYnl0ZWMgNSAvLyAiRVJSOkFVVEgiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjM0CiAgICAvLyBsb2coY29kZSkKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozNQogICAgLy8gZXJyKCkKICAgIGVycgoKZW5zdXJlQ2FsbGVySXNBZG1pbl9hZnRlcl9pZl9lbHNlQDM6CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo6R0dvdlJlZ2lzdHJ5Q29udHJhY3QuYWRkRGVsZWdhdGlvbihkZWxlZ2F0b3I6IGJ5dGVzLCBkZWxlZ2F0ZWU6IGJ5dGVzKSAtPiB2b2lkOgphZGREZWxlZ2F0aW9uOgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6MzY0CiAgICAvLyBwcml2YXRlIGFkZERlbGVnYXRpb24oZGVsZWdhdG9yOiBBY2NvdW50LCBkZWxlZ2F0ZWU6IEFjY291bnQpOiB2b2lkIHsKICAgIHByb3RvIDIgMAogICAgaW50Y18wIC8vIDAKICAgIGR1cG4gMwogICAgYnl0ZWNfMCAvLyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czozNjUKICAgIC8vIGVuc3VyZShkZWxlZ2F0b3IgIT09IGRlbGVnYXRlZSwgZXJyR0dvdlNlbGZEZWxlZ2F0ZSkKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICAhPQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozMwogICAgLy8gaWYgKCFjb25kKSB7CiAgICBibnogYWRkRGVsZWdhdGlvbl9hZnRlcl9pZl9lbHNlQDE0CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czozNjUKICAgIC8vIGVuc3VyZShkZWxlZ2F0b3IgIT09IGRlbGVnYXRlZSwgZXJyR0dvdlNlbGZEZWxlZ2F0ZSkKICAgIGJ5dGVjIDMwIC8vICJFUlI6R0RfU0QiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYmFzZS91dGlscy5hbGdvLnRzOjM0CiAgICAvLyBsb2coY29kZSkKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozNQogICAgLy8gZXJyKCkKICAgIGVycgoKYWRkRGVsZWdhdGlvbl9hZnRlcl9pZl9lbHNlQDE0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6MzY2CiAgICAvLyBlbnN1cmUoZGVsZWdhdG9yICE9PSBHbG9iYWwuemVyb0FkZHJlc3MsIGVyckdHb3ZTZWxmRGVsZWdhdGUpCiAgICBmcmFtZV9kaWcgLTIKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzMKICAgIC8vIGlmICghY29uZCkgewogICAgYm56IGFkZERlbGVnYXRpb25fYWZ0ZXJfaWZfZWxzZUAxOAogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6MzY2CiAgICAvLyBlbnN1cmUoZGVsZWdhdG9yICE9PSBHbG9iYWwuemVyb0FkZHJlc3MsIGVyckdHb3ZTZWxmRGVsZWdhdGUpCiAgICBieXRlYyAzMCAvLyAiRVJSOkdEX1NEIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozNAogICAgLy8gbG9nKGNvZGUpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzUKICAgIC8vIGVycigpCiAgICBlcnIKCmFkZERlbGVnYXRpb25fYWZ0ZXJfaWZfZWxzZUAxODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeUFjY291bnQuYWxnby50czoxNwogICAgLy8gYWNjb3VudHMgPSBCb3hNYXA8QWNjb3VudCwgR0dvdkFjY291bnQ+KHsga2V5UHJlZml4OiAnYScgfSkKICAgIGJ5dGVjIDggLy8gImEiCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6MzY4CiAgICAvLyBlbnN1cmUodGhpcy5hY2NvdW50cyhkZWxlZ2F0b3IpLmV4aXN0cywgZXJyQWNjb3VudE5vdEV4aXN0cykKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozMwogICAgLy8gaWYgKCFjb25kKSB7CiAgICBibnogYWRkRGVsZWdhdGlvbl9hZnRlcl9pZl9lbHNlQDIyCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czozNjgKICAgIC8vIGVuc3VyZSh0aGlzLmFjY291bnRzKGRlbGVnYXRvcikuZXhpc3RzLCBlcnJBY2NvdW50Tm90RXhpc3RzKQogICAgYnl0ZWMgMTcgLy8gIkVSUjpBX05YIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozNAogICAgLy8gbG9nKGNvZGUpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzUKICAgIC8vIGVycigpCiAgICBlcnIKCmFkZERlbGVnYXRpb25fYWZ0ZXJfaWZfZWxzZUAyMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjM2OQogICAgLy8gbGV0IHByZXZpb3VzRGVsZWdhdGVlID0gR2xvYmFsLnplcm9BZGRyZXNzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgIGZyYW1lX2J1cnkgMwogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6OTUKICAgIC8vIGRlbGVnYXRpb25zID0gQm94TWFwPEFjY291bnQsIEFjY291bnQ+KHsga2V5UHJlZml4OiAnZCcgfSkKICAgIGJ5dGVjIDkgLy8gImQiCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjM3MQogICAgLy8gaWYgKGZ3ZEJveC5leGlzdHMpIHsKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogYWRkRGVsZWdhdGlvbl9hZnRlcl9pZl9lbHNlQDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjM3MgogICAgLy8gcHJldmlvdXNEZWxlZ2F0ZWUgPSBmd2RCb3gudmFsdWUKICAgIGZyYW1lX2RpZyAxCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMwogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjM3MwogICAgLy8gaWYgKHByZXZpb3VzRGVsZWdhdGVlID09PSBkZWxlZ2F0ZWUpIHJldHVybiAvLyB1bmNoYW5nZWQ7IHJldmVyc2UgaW5kZXggYWxyZWFkeSBjb3JyZWN0CiAgICBmcmFtZV9kaWcgLTEKICAgID09CiAgICBieiBhZGREZWxlZ2F0aW9uX2FmdGVyX2lmX2Vsc2VAMwogICAgcmV0c3ViCgphZGREZWxlZ2F0aW9uX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjM3NAogICAgLy8gdGhpcy5yZW1vdmVSZXZlcnNlRGVsZWdhdGlvbihwcmV2aW91c0RlbGVnYXRlZSwgZGVsZWdhdG9yKQogICAgZnJhbWVfZGlnIDMKICAgIGZyYW1lX2RpZyAtMgogICAgY2FsbHN1YiByZW1vdmVSZXZlcnNlRGVsZWdhdGlvbgoKYWRkRGVsZWdhdGlvbl9hZnRlcl9pZl9lbHNlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czozNzYKICAgIC8vIGZ3ZEJveC52YWx1ZSA9IGRlbGVnYXRlZQogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6MTA1CiAgICAvLyByZXZlcnNlRGVsZWdhdGlvbnMgPSBCb3hNYXA8QWNjb3VudCwgQWNjb3VudFtdPih7IGtleVByZWZpeDogJ0QnIH0pCiAgICBieXRlYyAyMSAvLyAiRCIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6NDA1CiAgICAvLyBjb25zdCBsaXN0OiBBY2NvdW50W10gPSBbXQogICAgYnl0ZWMgMTkgLy8gMHgwMDAwCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjQwNgogICAgLy8gaWYgKGJveC5leGlzdHMpIHsKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogYWRkRGVsZWdhdGlvbl9hZnRlcl9pZl9lbHNlQDExCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo0MDcKICAgIC8vIGZvciAoY29uc3QgYWRkciBvZiBjbG9uZShib3gudmFsdWUpKSBsaXN0LnB1c2goYWRkcikKICAgIGZyYW1lX2RpZyAwCiAgICBpbnRjXzAgLy8gMAogICAgaW50Y18zIC8vIDIKICAgIGJveF9leHRyYWN0CiAgICBidG9pCiAgICBmcmFtZV9idXJ5IDQKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDUKCmFkZERlbGVnYXRpb25fZm9yX2hlYWRlckA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6NDA3CiAgICAvLyBmb3IgKGNvbnN0IGFkZHIgb2YgY2xvbmUoYm94LnZhbHVlKSkgbGlzdC5wdXNoKGFkZHIpCiAgICBmcmFtZV9kaWcgNQogICAgZnJhbWVfZGlnIDQKICAgIDwKICAgIGJ6IGFkZERlbGVnYXRpb25fYWZ0ZXJfaWZfZWxzZUAxMQogICAgZnJhbWVfZGlnIDUKICAgIGR1cAogICAgaW50Y18yIC8vIDMyCiAgICAqCiAgICBpbnRjXzMgLy8gMgogICAgKwogICAgZnJhbWVfZGlnIDAKICAgIHN3YXAKICAgIGludGNfMiAvLyAzMgogICAgYm94X2V4dHJhY3QKICAgIGZyYW1lX2RpZyAyCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcmVwbGFjZTIgMAogICAgZnJhbWVfYnVyeSAyCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSA1CiAgICBiIGFkZERlbGVnYXRpb25fZm9yX2hlYWRlckA3CgphZGREZWxlZ2F0aW9uX2FmdGVyX2lmX2Vsc2VAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo0MDkKICAgIC8vIGxpc3QucHVzaChkZWxlZ2F0b3IpCiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjQxMAogICAgLy8gYm94LnZhbHVlID0gY2xvbmUobGlzdCkKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6Mzc4CiAgICAvLyBlbWl0PEdHb3ZEZWxlZ2F0aW9uU2V0Pih7IGRlbGVnYXRvciwgcHJldmlvdXNEZWxlZ2F0ZWUsIGRlbGVnYXRlZSB9KQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4M2NlMDdhOWMgLy8gbWV0aG9kICJHR292RGVsZWdhdGlvblNldChhZGRyZXNzLGFkZHJlc3MsYWRkcmVzcykiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6OkdHb3ZSZWdpc3RyeUNvbnRyYWN0LnJlbW92ZVJldmVyc2VEZWxlZ2F0aW9uKGRlbGVnYXRlZTogYnl0ZXMsIGRlbGVnYXRvcjogYnl0ZXMpIC0+IHZvaWQ6CnJlbW92ZVJldmVyc2VEZWxlZ2F0aW9uOgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6NDE0CiAgICAvLyBwcml2YXRlIHJlbW92ZVJldmVyc2VEZWxlZ2F0aW9uKGRlbGVnYXRlZTogQWNjb3VudCwgZGVsZWdhdG9yOiBBY2NvdW50KTogdm9pZCB7CiAgICBwcm90byAyIDAKICAgIGludGNfMCAvLyAwCiAgICBkdXAKICAgIGJ5dGVjXzAgLy8gIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6MTA1CiAgICAvLyByZXZlcnNlRGVsZWdhdGlvbnMgPSBCb3hNYXA8QWNjb3VudCwgQWNjb3VudFtdPih7IGtleVByZWZpeDogJ0QnIH0pCiAgICBieXRlYyAyMSAvLyAiRCIKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjQxNgogICAgLy8gaWYgKCFib3guZXhpc3RzKSByZXR1cm4KICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYm56IHJlbW92ZVJldmVyc2VEZWxlZ2F0aW9uX2FmdGVyX2lmX2Vsc2VAMgogICAgcmV0c3ViCgpyZW1vdmVSZXZlcnNlRGVsZWdhdGlvbl9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo0MTcKICAgIC8vIGNvbnN0IG5leHQ6IEFjY291bnRbXSA9IFtdCiAgICBieXRlYyAxOSAvLyAweDAwMDAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6NDE4CiAgICAvLyBmb3IgKGNvbnN0IGFkZHIgb2YgY2xvbmUoYm94LnZhbHVlKSkgewogICAgZnJhbWVfZGlnIDQKICAgIGludGNfMCAvLyAwCiAgICBpbnRjXzMgLy8gMgogICAgYm94X2V4dHJhY3QKICAgIGJ0b2kKICAgIGZyYW1lX2J1cnkgMgogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgMwoKcmVtb3ZlUmV2ZXJzZURlbGVnYXRpb25fZm9yX2hlYWRlckAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6NDE4CiAgICAvLyBmb3IgKGNvbnN0IGFkZHIgb2YgY2xvbmUoYm94LnZhbHVlKSkgewogICAgZnJhbWVfZGlnIDMKICAgIGZyYW1lX2RpZyAyCiAgICA8CiAgICBieiByZW1vdmVSZXZlcnNlRGVsZWdhdGlvbl9hZnRlcl9mb3JAOAogICAgZnJhbWVfZGlnIDMKICAgIGludGNfMiAvLyAzMgogICAgKgogICAgaW50Y18zIC8vIDIKICAgICsKICAgIGZyYW1lX2RpZyA0CiAgICBzd2FwCiAgICBpbnRjXzIgLy8gMzIKICAgIGJveF9leHRyYWN0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6NDE5CiAgICAvLyBpZiAoYWRkciAhPT0gZGVsZWdhdG9yKSBuZXh0LnB1c2goYWRkcikKICAgIGZyYW1lX2RpZyAtMQogICAgIT0KICAgIGJ6IHJlbW92ZVJldmVyc2VEZWxlZ2F0aW9uX2FmdGVyX2lmX2Vsc2VANgogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgZnJhbWVfZGlnIDEKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIGZyYW1lX2J1cnkgMAoKcmVtb3ZlUmV2ZXJzZURlbGVnYXRpb25fYWZ0ZXJfaWZfZWxzZUA2OgogICAgZnJhbWVfZGlnIDMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDMKICAgIGIgcmVtb3ZlUmV2ZXJzZURlbGVnYXRpb25fZm9yX2hlYWRlckAzCgpyZW1vdmVSZXZlcnNlRGVsZWdhdGlvbl9hZnRlcl9mb3JAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjQyMQogICAgLy8gaWYgKG5leHQubGVuZ3RoID09PSAwKSB7CiAgICBmcmFtZV9kaWcgMAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGJueiByZW1vdmVSZXZlcnNlRGVsZWdhdGlvbl9lbHNlX2JvZHlAMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjQyMgogICAgLy8gYm94LmRlbGV0ZSgpCiAgICBmcmFtZV9kaWcgNAogICAgYm94X2RlbAogICAgcG9wCiAgICByZXRzdWIKCnJlbW92ZVJldmVyc2VEZWxlZ2F0aW9uX2Vsc2VfYm9keUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjQyNAogICAgLy8gYm94LnZhbHVlID0gY2xvbmUobmV4dCkKICAgIGZyYW1lX2RpZyA0CiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgZnJhbWVfZGlnIDAKICAgIGJveF9wdXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjpHR292UmVnaXN0cnlDb250cmFjdC5tdXN0R2V0Q29tbWl0dGVlTWV0YWRhdGEoY29tbWl0dGVlSWQ6IGJ5dGVzKSAtPiBieXRlczoKbXVzdEdldENvbW1pdHRlZU1ldGFkYXRhOgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6ODA0CiAgICAvLyBwcml2YXRlIG11c3RHZXRDb21taXR0ZWVNZXRhZGF0YShjb21taXR0ZWVJZDogQ29tbWl0dGVlSWQpOiBDb21taXR0ZWVNZXRhZGF0YSB7CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjgyCiAgICAvLyBjb21taXR0ZWVzID0gQm94TWFwPENvbW1pdHRlZUlkLCBDb21taXR0ZWVNZXRhZGF0YT4oeyBrZXlQcmVmaXg6ICdjJyB9KQogICAgYnl0ZWNfMiAvLyAiYyIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjgwNgogICAgLy8gZW5zdXJlKGNvbW1pdHRlZUJveC5leGlzdHMsIGVyckNvbW1pdHRlZU5vdEV4aXN0cykKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozMwogICAgLy8gaWYgKCFjb25kKSB7CiAgICBibnogbXVzdEdldENvbW1pdHRlZU1ldGFkYXRhX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6ODA2CiAgICAvLyBlbnN1cmUoY29tbWl0dGVlQm94LmV4aXN0cywgZXJyQ29tbWl0dGVlTm90RXhpc3RzKQogICAgYnl0ZWMgMTUgLy8gIkVSUjpDX05YIgogICAgLy8gc21hcnRfY29udHJhY3RzL2Jhc2UvdXRpbHMuYWxnby50czozNAogICAgLy8gbG9nKGNvZGUpCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9iYXNlL3V0aWxzLmFsZ28udHM6MzUKICAgIC8vIGVycigpCiAgICBlcnIKCm11c3RHZXRDb21taXR0ZWVNZXRhZGF0YV9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnkuYWxnby50czo4MDcKICAgIC8vIHJldHVybiBjb21taXR0ZWVCb3gudmFsdWUKICAgIGZyYW1lX2RpZyAwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgc3dhcAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6OkdHb3ZSZWdpc3RyeUNvbnRyYWN0LmdldFN0b3JlZFhHb3ZBdChzdXBlcmJveE5hbWU6IGJ5dGVzLCBpbmRleDogdWludDY0KSAtPiBieXRlczoKZ2V0U3RvcmVkWEdvdkF0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5LmFsZ28udHM6ODMzCiAgICAvLyBwcml2YXRlIGdldFN0b3JlZFhHb3ZBdChzdXBlcmJveE5hbWU6IHN0cmluZywgaW5kZXg6IHVpbnQ2NCk6IEFjY291bnRJZFdpdGhWb3RlcyB7CiAgICBwcm90byAyIDEKICAgIC8vIG5vZGVfbW9kdWxlcy9AZDEzY28vc3VwZXJib3gvc21hcnRfY29udHJhY3RzL3N1cGVyYm94L2xpYi9zdXBlcmJveC5hbGdvLnRzOjI0NwogICAgLy8gY29uc3QgW2JveE51bSwgYnl0ZU9mZnNldF0gPSBzYkdldExvY2F0aW9uKG5hbWUsIHZhbHVlSW5kZXgpCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBzYkdldExvY2F0aW9uCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgc3dhcAogICAgcHVzaGludCA4IC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBub2RlX21vZHVsZXMvQGQxM2NvL3N1cGVyYm94L3NtYXJ0X2NvbnRyYWN0cy9zdXBlcmJveC9saWIvdXRpbHMuYWxnby50czoyNQogICAgLy8gcmV0dXJuIEJ5dGVzKG5hbWUpLmNvbmNhdChCeXRlcygnXycpKS5jb25jYXQoQnl0ZXMoaXRvYShudW0pKSkKICAgIGZyYW1lX2RpZyAtMgogICAgYnl0ZWMgMTYgLy8gIl8iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiBAZDEzY28vc3VwZXJib3gvc21hcnRfY29udHJhY3RzL3N1cGVyYm94L2xpYi91dGlscy5hbGdvLnRzOjppdG9hCiAgICBjb25jYXQKICAgIC8vIG5vZGVfbW9kdWxlcy9AZDEzY28vc3VwZXJib3gvc21hcnRfY29udHJhY3RzL3N1cGVyYm94L2xpYi9zdXBlcmJveC5hbGdvLnRzOjI0OQogICAgLy8gY29uc3QgdmFsdWVTaXplID0gc2JNZXRhQm94VmFsdWUobmFtZSkudmFsdWVTaXplLmFzVWludDY0KCkKICAgIGZyYW1lX2RpZyAtMgogICAgY2FsbHN1YiBzYk1ldGFCb3hWYWx1ZQogICAgcHVzaGludCAxOCAvLyAxOAogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG5vZGVfbW9kdWxlcy9AZDEzY28vc3VwZXJib3gvc21hcnRfY29udHJhY3RzL3N1cGVyYm94L2xpYi9zdXBlcmJveC5hbGdvLnRzOjI1MAogICAgLy8gcmV0dXJuIGJveC52YWx1ZS5zbGljZShieXRlT2Zmc2V0LCBieXRlT2Zmc2V0ICsgdmFsdWVTaXplKQogICAgc3dhcAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIGR1cAogICAgbGVuCiAgICBkaWcgMwogICAgZGlnIDEKICAgID49CiAgICBkaWcgNAogICAgZGlnIDIKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICB1bmNvdmVyIDQKICAgIHVuY292ZXIgNAogICAgKwogICAgZHVwCiAgICBkaWcgMwogICAgPj0KICAgIHN3YXAKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIGR1cAogICAgZGlnIDIKICAgIDwKICAgIGRpZyAyCiAgICBzd2FwCiAgICBzZWxlY3QKICAgIHN1YnN0cmluZzMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeS5hbGdvLnRzOjgzNQogICAgLy8gcmV0dXJuIGRlY29kZUFyYzQ8QWNjb3VudElkV2l0aFZvdGVzPih4R292RGF0YSkKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeUFjY291bnQuYWxnby50czo6R0dvdlJlZ2lzdHJ5QWNjb3VudENvbnRyYWN0LmdldEFjY291bnRJZkV4aXN0cyhhY2NvdW50OiBieXRlcykgLT4gYnl0ZXM6CmdldEFjY291bnRJZkV4aXN0czoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeUFjY291bnQuYWxnby50czozOQogICAgLy8gcHJvdGVjdGVkIGdldEFjY291bnRJZkV4aXN0cyhhY2NvdW50OiBBY2NvdW50KTogR0dvdkFjY291bnQgewogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnlBY2NvdW50LmFsZ28udHM6MTcKICAgIC8vIGFjY291bnRzID0gQm94TWFwPEFjY291bnQsIEdHb3ZBY2NvdW50Pih7IGtleVByZWZpeDogJ2EnIH0pCiAgICBieXRlYyA4IC8vICJhIgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5QWNjb3VudC5hbGdvLnRzOjQxCiAgICAvLyBpZiAoYm94LmV4aXN0cykgcmV0dXJuIGJveC52YWx1ZQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBnZXRBY2NvdW50SWZFeGlzdHNfZWxzZV9ib2R5QDIKICAgIGZyYW1lX2RpZyAwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgc3dhcAogICAgcmV0c3ViCgpnZXRBY2NvdW50SWZFeGlzdHNfZWxzZV9ib2R5QDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnlBY2NvdW50LmFsZ28udHM6NDIKICAgIC8vIGVsc2UgcmV0dXJuIHRoaXMuZ2V0RW1wdHlHR292QWNjb3VudCh1MzIoMCkpCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiB1MzIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeUFjY291bnQuYWxnby50czo0NwogICAgLy8gcmV0dXJuIHsgYWNjb3VudElkOiBhY2NvdW50SWQsIGNvbW1pdHRlZU9mZnNldHM6IFtdIH0KICAgIGJ5dGVjIDI0IC8vIDB4MDAwNjAwMDAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5QWNjb3VudC5hbGdvLnRzOjQyCiAgICAvLyBlbHNlIHJldHVybiB0aGlzLmdldEVtcHR5R0dvdkFjY291bnQodTMyKDApKQogICAgc3dhcAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5QWNjb3VudC5hbGdvLnRzOjpHR292UmVnaXN0cnlBY2NvdW50Q29udHJhY3QuZ2V0Q29tbWl0dGVlQWNjb3VudE9mZnNldEhpbnQoY29tbWl0dGVlTnVtSWQ6IGJ5dGVzLCBnR292QWNjb3VudDogYnl0ZXMpIC0+IHVpbnQ2NCwgYnl0ZXM6CmdldENvbW1pdHRlZUFjY291bnRPZmZzZXRIaW50OgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5QWNjb3VudC5hbGdvLnRzOjc2CiAgICAvLyBwcm90ZWN0ZWQgZ2V0Q29tbWl0dGVlQWNjb3VudE9mZnNldEhpbnQoY29tbWl0dGVlTnVtSWQ6IFVpbnQxNiwgZ0dvdkFjY291bnQ6IEdHb3ZBY2NvdW50KTogdWludDY0IHsKICAgIHByb3RvIDIgMgogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeUFjY291bnQuYWxnby50czo3NwogICAgLy8gZm9yIChjb25zdCBbY051bUlkLCBvZmZzZXRdIG9mIGNsb25lKGdHb3ZBY2NvdW50LmNvbW1pdHRlZU9mZnNldHMpKSB7CiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgNCAvLyA0CiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGZyYW1lX2RpZyAtMQogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18wIC8vIDAKCmdldENvbW1pdHRlZUFjY291bnRPZmZzZXRIaW50X2Zvcl9oZWFkZXJAMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeUFjY291bnQuYWxnby50czo3NwogICAgLy8gZm9yIChjb25zdCBbY051bUlkLCBvZmZzZXRdIG9mIGNsb25lKGdHb3ZBY2NvdW50LmNvbW1pdHRlZU9mZnNldHMpKSB7CiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfZGlnIDIKICAgIDwKICAgIGJ6IGdldENvbW1pdHRlZUFjY291bnRPZmZzZXRIaW50X2FmdGVyX2ZvckA2CiAgICBmcmFtZV9kaWcgMQogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAzCiAgICBwdXNoaW50IDQgLy8gNAogICAgKgogICAgcHVzaGludCA0IC8vIDQKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnlBY2NvdW50LmFsZ28udHM6NzgKICAgIC8vIGlmIChjTnVtSWQuYXNVaW50NjQoKSA9PT0gY29tbWl0dGVlTnVtSWQuYXNVaW50NjQoKSkgewogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2RpZyAtMgogICAgYnRvaQogICAgPT0KICAgIGJ6IGdldENvbW1pdHRlZUFjY291bnRPZmZzZXRIaW50X2FmdGVyX2lmX2Vsc2VANAogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5QWNjb3VudC5hbGdvLnRzOjc5CiAgICAvLyByZXR1cm4gb2Zmc2V0LmFzVWludDY0KCkKICAgIGZyYW1lX2RpZyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvZ2dvdi1yZWdpc3RyeS9nZ292UmVnaXN0cnlBY2NvdW50LmFsZ28udHM6NzcKICAgIC8vIGZvciAoY29uc3QgW2NOdW1JZCwgb2Zmc2V0XSBvZiBjbG9uZShnR292QWNjb3VudC5jb21taXR0ZWVPZmZzZXRzKSkgewogICAgaW50Y18zIC8vIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeUFjY291bnQuYWxnby50czo3OQogICAgLy8gcmV0dXJuIG9mZnNldC5hc1VpbnQ2NCgpCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9idXJ5IDEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpnZXRDb21taXR0ZWVBY2NvdW50T2Zmc2V0SGludF9hZnRlcl9pZl9lbHNlQDQ6CiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMwogICAgYiBnZXRDb21taXR0ZWVBY2NvdW50T2Zmc2V0SGludF9mb3JfaGVhZGVyQDEKCmdldENvbW1pdHRlZUFjY291bnRPZmZzZXRIaW50X2FmdGVyX2ZvckA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2dnb3YtcmVnaXN0cnkvZ2dvdlJlZ2lzdHJ5QWNjb3VudC5hbGdvLnRzOjgzCiAgICAvLyBsb2coZXJyQWNjb3VudE9mZnNldE5vdEV4aXN0cykKICAgIGJ5dGVjIDI2IC8vICJFUlI6QU9fTlgiCiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9nZ292LXJlZ2lzdHJ5L2dnb3ZSZWdpc3RyeUFjY291bnQuYWxnby50czo4NAogICAgLy8gZXJyKCkKICAgIGVycgo=", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" }, "byteCode": { "approval": "CyAGAAEgAoAg//8DJh8ABBUffHUBYwNQYXABUwhFUlI6QVVUSAJfbQFwAWEBZA9sYXN0Q29tbWl0dGVlSWQMbGFzdFBlcmlvZElkBWFkbWluCjAxMjM0NTY3ODkBAAhFUlI6Q19OWAFfCEVSUjpBX05YDWxhc3RBY2NvdW50SWQCAAAIb3BlcmF0b3IBRAQLgQFDCUVSUjpQRV9MVAQABgAAB0VSUjpPT08JRVJSOkFPX05YD3hHb3ZSZWdpc3RyeUFwcAhFUlI6Q19OQwlFUlI6R1BfTlgJRVJSOkdEX1NEMRhAABEnEiJnJwoiZycMMglnJwsiZzEbQQD2MRkURDEYRIIhBNULxD0E8wz4TQTTIXnSBOP7wN4EibHodgQXhmkSBJKN3F4EPrOvIQREDZU7BE1addcEDaJ4hQTlJZdSBOuNk8kEyNRhqwQ7u6RWBJepbWcEF5yRNQTDJrubBL3pkDYE7LcMDgSZKWslBM5QGXoE5n47oQQRKQQ5BDeLK1EEbZg/EAQFKG6hBDa9FfIEyihJAwRvMZZ6BMYHE/IEoiC5+QRBGOy/NhoAjiEBYwKaAvQHNwlACVMJcAmiCbwJzQnnCm8K8Qs3C1gLlQvdDCYNjA3UDkkOdg6eDsUPEg9WD54QNxBWEMERjhGfEdQAMRmNBgAR/+//7//vAAkAAQAxGESIEecjQzEYRIgR3yNDMRgURCNDigEBi/+BCgxBAAcnDYv/I1iJi/+BCgqI/+aL/4EKGCcNTCNYUImKAQGL/xZJk4EQDkRXBgKJigEBi/8WSZMkDkRXBASJIoj/7SKI/+kiiP/lIoj/4SKI/90iiP/JTwVQTwRQTwNQTwJQIhZQTFCJIoj/wyKI/78iiP+7IhZPA1BPAlBMUCcOUImKAQGL/xZJk4EQDkRXBgKJigEBi/+BCgxBAAcnDYv/I1iJi/+BCgqI/+aL/4EKGCcNTCNYUImKAQGL/ycGUEm9RQFEvkiJigIBKIv+iP/nSYESW0sBIllLAoEaWUsDTgJSSU4DIllOAov/SwELSU4DCEwlWw5EIkmLBUmLAgxEiwFXAgBMJQtZSYwAiwQIiwMNQQAOiwOLBAmLBRZMFlCMAImLBIsACIwEiwUjCIwFQv/GKDYaAUcCFSQSRDYaAklOAhWBBBJENhoDSU4CFYEEEkQ2GgRJTgIVgQQSRDYaBUlOAhWBBBJENhoGSRWBCBJEF0yIEFgqTFBJvUUBQQAMgAhFUlI6Q19FWLAASwQXSwYXDUAABCcXsABLAxdJRQlAAAyACEVSUjpUTV9asABLAhdAAAyACEVSUjpUVl9asABLByEFDkAADYAJRVJSOlRNX09WsAAiJwplRCEFDkAADYAJRVJSOkNJX09WsAAiiP47IicKZUSI/iNLB1BLBlBLBVBLBFBLAxZQTFBLAUy/SwaIEQwiWYj93ScETFAnBlBJvUUBFERJvEiALwAcAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAIAB4AAAAPW3VpbnQzMix1aW50MzJdvyInCmVEIwgnCkxnI0M2GgFHAhUkEkSID1kqTFBJvUUBQAAEJw+wAEm+RFcaBCKI/aASQAANgAlFUlI6SVZfTlqwAEsBiBB+IlmI/U8nBExQJwZQSb1FAURJJYEIuhcURLxISbxII0MiRw0oRxM2GgFHAhUkEkQ2GgJJTgJJIllJTgNJgSQLJQhPAhUSRIgO4kyIEDFJTgJJIllJTgOI/PsnBExQSU4DJwZQSU4DJYEIuheBCApJTgNPAghJTwKBCloOQAANgAlFUlI6VFhfWEOwACKI/PtFIUsBQQAPSwEjCUsETIgP9lcABEUhSwWBGlpFEihFHiJFEUsBRRRLEEsHDEEBMEsHVwIASxGBJAuBJFhJRSpJVyAERSkkWklFD0AAC4AHRVJSOlZfWrAASyhXACBJRSyID/JJRSMiWkAANicISytQSUUnvUUBQQAMgAhFUlI6QV9FWLAAIicSZUQjCCcSSwFniPxnJxhQSyZJvEhLAb9FIkshSVcABEUrIlpLIRcNQAAEJxmwAEspSyhQSx5MUEUeSwVXAAJFJUsTSSMIRRSI/BlFH0shSYEEWUlOAkUcSRVMTgJSSUUoIllFHSJFEEsPSx0MQQArSyZXAgBLEIEEC4EEWCJZSwUTQAANgAlFUlI6QU9fRViwAEsPIwhFEEL/zUskSx9QSydMUEsdIwgWVwYCXABLIiJLHFhMUCcISyxQSbxITL9LEUsOCEUSSxAjCEURSxJFFEspRSFC/shLBYEOWksSD0AADYAJRVJSOlRWX1hDsABLA4j8CElFIUmBCltFEEmBEltJRQxLHxVJRQ5MGBRESSJZSwGBGllSIllJRR1AAiQiRRYiRRVLFEsLDEEBx0sDJxBQSxaI+59QSUUkSxVJSw1JTgMPSwFLA08CTUxLEghJSwMPTE8DTwJNSUsCDEsCTE1LIE4CUkUlvUUBQQFISyK9REsPTAlJRRlLCgxBAM4iRRdLH0kiWUlOAkUbSYEaWUlOA0xOAlJJTgIiWUlFHksYEkEAWEsYiPscTwJMUEscIwgWVwYCXABLIUlOAiJLHUlOBVhLAVBLAhVPA08FSU4DTwJSTwJMUEsBTwQJTwMVTwMITAkWVwYCXBpFIEsUSxcIRRVLFSMIRRZC/yhMSVcCAEsYJQtMSwFZSxoIiPq2TCUITF1LIUlOAiJLHUlOBVhLAVBLAhVPA08FSU4DTwJSTwJMUEsBTwQJTwMVTwMITAkWVwYCXBpFIEL/oEsXSwoYSUUNQQAHSxdLDAlFGEsjFUlLGQ1BADhLI0m9RElLG0lOAwhLA0zTIk8ESU4CDyJLAk8CTUsDSwIPSwRPA08CTUsoTgJSTwNOArtFF0L+4UsjSb1ESUsDCEsCTNNLJrtFF0L+zEsOSwoYSUUOQAArSw5LJEkVIksBDyJLAk8CTU8DSUsDD0xPA08CTVJLI0m8SEsBvxVFF0L+lksOSw0JQv/PSx9JJVtLFggWXAJLA0m8SEm8SEy/SxGI+WVLBkxcGklFB4EKWksBEkEAG0sFSVcaBExXDgQSQAANgAlFUlI6VFZfTU2wACpLCVBLBr8jQ0sbIwlFFkL91iJHByhHCTYaAUcCFSQSRDYaAklOAkkiWUlOA0kkCyUITwIVEkSICqBMiAvvSU4CIllJTgKI+LonBExQSU4CJwZQSU4CJYEIuheBCApJTgIOQAANgAlFUlI6TlhfWEOwAEsEgRpaRQ0iRQxJRRBLC0sGDEEBgksGVwIASwwkCyRYSUUVSxAjCUURJwhMUElFG71FAUAABCcRsABLGb5ESwVXAAJMiAv4RRdJRQxLEBJAAAdLE7AnGbAASwJLC4gLc0UTIkUPJxNFFSJFDksVSYEEWUsBFVJJRRoiWUsODUEASEsYVwIASw6BBAuBBFhJVwACRRlJVwICRRgiWUsEEkEADCNFD0sNIwhFDkL/vksXSxdQSxVJTwJQTCJZIwgWVwYCXABFFUL/3EsOQAAEJxqwAEsVVwAEgAIABlBLFVBLGkm8SEy/SwJJSwyI+HJJIltJTgJOA4EIW0UUTCcQUEsBiPgmUE4CSwRJgwISCLoXSU4DRQ5JgRwluhdLAg1ETCULgR4ISUUXJboXSUUOEkEAO0y8SCKI9+FLA0mBHCW6F08DDURLE08Cu0sBSSWBCLoXSwoJFiVMu0sSgQRaSw1MCUUNSwsjCEUMQv6gTElLE0sMSU4DKNJLDEwJTEsB04j3l0sDSYEcJboXTwMNREsTTwK7Qv+zSwyI9ytLBUxcGipLCVBMvyNDNhoBSRWBCBJEF4gIsicbTGcjQzYaAUcCFSQSRIgIoDIDE0AABCcFsAAnDEsBZyNDNhoBRwIVJBJENhoCSRWBCBJEF0yICHgyAxNAAAQnBbAAsUmyCEsBsgcjshAisgGzI0M2GgFJFSQSRCInDGVEEicOIk8CVClMULAjQzYaAUkVJBJEiAg4JxRMZyNDNhoBSRUkEkQiJxRlRBInDiJPAlQpTFCwI0MiNhoBRwIVJBJENhoCSU4CFSQSRCcITFC9RQFAAAQnEbAAJwlLAlBJRQS9RQFBAFRLAr5EMQASQQBKIzEASwMSEUAABCcFsABJSwISQAAHSTIDEkEAJ0sCvUUBQQAdSwJJvkRJSwRJTgKICI9PArxITFCABDI/IkZMULAjQ0qIB6dC//ciQv+zIkk2GgFHAhUkEkSIB4InCUxQvUUBQQANgAlFUlI6R0RfRViwALEiJxtlRIAEJ2MNZbIaSwGyGiKyGbIYgQayECKyAbO0PklFA0lXBABMVwAEKRJESRWBORJEgcADU0EAH0sBVwQ4VwAgSUUEMgMTQQAOSwJLARNBAAZJSwOIByAjQzYaAUkVJBJEJwlMUEm9RQFBAA1JvkSAAYBQKUxQsCNDgCEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABC/9Q2GgFJFSQSRCcJTFBJvUUBQQAJSb5EKUxQsCNDMgNC//UoSTYaAUkVJBJEJxVMUEm9RQFBACZJIiW6F0UDIkUCSwFLAwxBABRLAUkkCyUISwJMJLqwIwhFAkL/5CNDIjYaAUcCIllJTgIkCyUITBUSRCJJSwIMQQArSwJXAgBLASQLJFgnCUxQSUUFvUUBQQANSwO+RLBJIwhFAUL/1DIDsEL/8iNDNhoBSRWBCBJEF0k2GgJJIlklCEsBFRJEVwIASU4CiAYBFUsBCExAABArvEgrSwG5SCtLA0sDuyNDK71ISwEMQf/vK0sB00L/6CJHAig2GgFJFSQSRDYaAkkVgQgSRBc2GgNJFYEIEkQXMRYjCUk4ECMSRDEAIicUZUQSQAAEJwWwAEsBSwMNQAAEJxewAEk4BzIKEkAABCcFsAAqSwRQSUUJvUUBQAAEJw+wAEsHvkRJVxoETFcOBBJAAAQnHLAAK71FAUAADYAJRVJSOkdQX05DsAAiJwtlRCMIJwtLAWeI855FBiu9SElFBkkhBA4hBEsCTwJNKyJPArpFCCEEDUEAqEsEIQQJKyEETwK6sYEDsjWBB7I0gQOyOCcWskJLB7JAskCBBrIQIrIBs7Q9sUlyCERLAjgIsgiyByOyECKyAbOxMggWSwRJTgKI8zJLBUlOBIjzKoAE9XnKwrIaTwKyGksKSU4GshpLCbIaTLIashoishlLArIYgQayECKyAbOI8vxMiPL4Iojy9E8DFklPBFBPA1BPAlAnDlAnB0sDUEy/UClMULAjQyhC/182GgFJFYEIEkQXSYgEZSInC2VMTgJEIwhJSwIOQQAiSYjyrycHTFC9RQFBAAyACEVSUjpQX0lSsABJIwhFAUL/1ycLSwNnI0MiNhoBSRWBBBJENhoCSU4CFYEEEkQ2GgNJTgIVgQQSRDYaBElOAhWBBBJENhoFSRUjEkQiU0wnB0xQSb1FAUAABCcdsABJvkxJTgJFCEQyDUwiWxJAAAQnBbAASwVLBVwISwRcDEsDXBCBoAFLA1RLAUy/I0M2GgFJFYEEEkQnB0xQSb1FAUAABCcdsAAyDUsBvkQiWxJAAAQnBbAASbxII0M2GgFJFYEIEkQXiPHbJwdMUEm9RQFBAAxJvkQiWxYpTFCwI0MiQv/1NhoBSRWBCBJEF4jxsycHTFBJvUUBQQAJSb5EKUxQsCNDiPHVQv/0IjYaAUcCIllJTgKBCAslCEwVEkQiSUsCDEEAL0sCVwIASwGBCAtbiPFvJwdMUElFBb1FAUEADUsDvkSwSSMIRQFC/9GI8YuwQv/xI0M2GgFJFSQSRDYaAkkVIxJEIlNMKkxQSb1FAUEAIUsBQQATSb5ESVcaBExXDgQSQAAEJxywAEm+RClMULAjQ4jxGkL/9CI2GgFHAiJZSU4CJAslCEwVEkQiSUsCDEEAK0sCVwIASwEkCyRYKkxQSUUFvUUBQQANSwO+RLBJIwhFAUL/1Yjw1bBC//EjQyIoRwI2GgFJFSQSRDYaAkkVIxJEIlNMNhoDSRWBCBJEF0w2GgRJFYEIEkQXTIgDhEkiWYjwVCcETFBJJwZQSb1FAUAABCcPsABJvkxFC0RLBUEABksCsEsJsEmBHCW6F0UIIkUJSwhLBAxBACpLBEsJCElFCEsID0EACyiwSwgjCEUJQv/fSwEnEFBLB4jwk1C+RLBC/+YjQzYaAUkVJBJEiAMQIlmI7+EnBExQJwZQvkQpTFCwI0MiSTYaAUkVJBJENhoCSRUkEkRMiALmTIgDSEkiWkAABCcRsABLAUlXAAJLAogDUU8CIlmI75wnBExQTwKIAtVJRQVXAARMVwAESUUGEkAAEEsDsIAJRVJSOkFPX01NsABLAlcEBClMULAjQyJHBChHBDYaAUkVJBJENhoCSU4CFSQSRCpMUEm9RQFAAAoiiO93KUxQsCNDSb5MRQtESwGIAsBJRQoiWklFBEAAByKI71dC/90iRQUiRQZLCEmBBFlLARVSSUUMIllFByJFBEsDSwcMQQAsSwpXAgBLBIEEC4EEWElFDSJZSwoiWRJBAAlLCyVZRQUjRQZLAyMIRQRC/8xLBUAAByKI7v1C/4NLCSJZiO69JwRMUEsFiAH2SUUJIlpLAxNBAAciiO7bQv9hSwdXBARC/1k2GgFJFSQSRIgCHylMULAjQzYaAUcCIllJTgIkCyUITBUSRCJJSwIMQQAZSwJXAgBLAUlOAiQLJFiIAe6wIwhFAUL/4CNDNhoBFyJJSwIMQQAdsYEFshknFrJCJxayQIEGshAisgGzSSMIRQFC/9wjQzEAIicMZUQSQAAEJwWwAImKAgAiRwMoSYv+i/8TQAAEJx6wAIv+MgMTQAAEJx6wACcIi/5QvUUBQAAEJxGwADIDjAMnCYv+UEmMAb1FAUEAGIsBvkxJTgKMA0SL/xJBAAGJiwOL/ogAeosBi/+/JxWL/1BJjAAnE4wCvUUBQQA5iwAiJboXjAQijAWLBYsEDEEAJosFSSQLJQiLAEwkuosCSU8CUEwiWSMIFlcGAlwAjAIjCIwFQv/SiwJJi/5QTCJZIwgWVwYCXACLAEm8SEy/i/6LA1CL/1CABDzgepxMULCJigIAIkkoSScVi/5QSb1FAUAAAYknE4wAiwQiJboXjAIijAOLA4sCDEEAMIsDJAslCIsETCS6SYwBi/8TQQATiwBJiwFQTCJZIwgWVwYCXACMAIsDIwiMA0L/yIsAIllAAAWLBLxIiYsESbxIiwC/iYoBASqL/1BJvUUBQAAEJw+wAIsAvkRMiYoCAYv+i/+I7YNJIltMgQhbi/4nEFBPAojtPFCL/ojtXIESW0y+REkVSwNLAQ9LBEsCTwJNTwRPBAhJSwMPTE8DTwJNSUsCDEsCTE1SiYoBAScIi/9QSb1FAUEABosAvkRMiSKI7I0nGFBMiYoCAiKL/4EEWYv/FYv/TgJSSSJZIosDiwIMQQAtiwFXAgCLA4EEC4EEWEmMACJZi/4XEkEAC4sAJVmL/4wBjACJiwMjCIwDQv/LJxqwAA==", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, "minor": 3, "patch": 2 } }, "events": [ { "name": "GGovDelegationCleared", "args": [ { "type": "address", "name": "delegator" }, { "type": "address", "name": "previousDelegatee" } ] }, { "name": "GGovDelegationSet", "args": [ { "type": "address", "name": "delegator" }, { "type": "address", "name": "previousDelegatee" }, { "type": "address", "name": "delegatee" } ] } ], "templateVariables": {} }