{ "name": "AsaMetadataRegistry", "structs": { "MbrDelta": [ { "name": "sign", "type": "uint8" }, { "name": "amount", "type": "uint64" } ], "MetadataExistence": [ { "name": "asa_exists", "type": "bool" }, { "name": "metadata_exists", "type": "bool" } ], "MetadataHeader": [ { "name": "identifiers", "type": "byte" }, { "name": "reversible_flags", "type": "byte" }, { "name": "irreversible_flags", "type": "byte" }, { "name": "hash", "type": "byte[32]" }, { "name": "last_modified_round", "type": "uint64" }, { "name": "deprecated_by", "type": "uint64" } ], "MutableFlag": [ { "name": "flag", "type": "bool" }, { "name": "last_modified_round", "type": "uint64" } ], "PaginatedMetadata": [ { "name": "has_next_page", "type": "bool" }, { "name": "last_modified_round", "type": "uint64" }, { "name": "page_content", "type": "byte[]" } ], "Pagination": [ { "name": "metadata_size", "type": "uint16" }, { "name": "page_size", "type": "uint16" }, { "name": "total_pages", "type": "uint8" } ], "RegistryParameters": [ { "name": "key_size", "type": "uint8" }, { "name": "header_size", "type": "uint16" }, { "name": "max_metadata_size", "type": "uint16" }, { "name": "short_metadata_size", "type": "uint16" }, { "name": "page_size", "type": "uint16" }, { "name": "first_payload_max_size", "type": "uint16" }, { "name": "extra_payload_max_size", "type": "uint16" }, { "name": "replace_payload_max_size", "type": "uint16" }, { "name": "flat_mbr", "type": "uint64" }, { "name": "byte_mbr", "type": "uint64" } ] }, "methods": [ { "name": "arc89_create_metadata", "args": [ { "type": "uint64", "name": "asset_id", "desc": "The Asset ID to create the Asset Metadata for" }, { "type": "byte", "name": "reversible_flags", "desc": "The Reversible Flags. WARNING: LSB and 1 can by set only at creation time" }, { "type": "byte", "name": "irreversible_flags", "desc": "The Irreversible Flags. WARNING: if the MSB is True the Asset Metadata is IMMUTABLE" }, { "type": "uint16", "name": "metadata_size", "desc": "The Metadata byte size to be created" }, { "type": "byte[]", "name": "payload", "desc": "The Metadata payload (without Header). WARNING: Payload larger than args capacity must be provided with arc89_extra_payload calls in the Group" }, { "type": "pay", "name": "mbr_delta_payment", "desc": "Payment of the MBR Delta amount (microALGO) for the Asset Metadata Box creation" } ], "returns": { "type": "(uint8,uint64)", "struct": "MbrDelta", "desc": "MBR Delta: tuple of (sign enum, amount in microALGO)" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Create Asset Metadata for an existing ASA, restricted to the ASA Manager Address.", "events": [ { "name": "Arc89MetadataUpdated", "args": [ { "type": "uint64", "name": "asset_id" }, { "type": "uint64", "name": "round" }, { "type": "uint64", "name": "timestamp" }, { "type": "byte", "name": "reversible_flags" }, { "type": "byte", "name": "irreversible_flags" }, { "type": "bool", "name": "is_short" }, { "type": "byte[32]", "name": "hash" } ], "desc": "Event emitted when Asset Metadata is created or updated" } ], "recommendations": {} }, { "name": "arc89_replace_metadata", "args": [ { "type": "uint64", "name": "asset_id", "desc": "The Asset ID to replace the Asset Metadata for" }, { "type": "uint16", "name": "metadata_size", "desc": "The new Metadata byte size, must be less than or equal to the existing" }, { "type": "byte[]", "name": "payload", "desc": "The Metadata payload (without Header). WARNING: Payload larger than args capacity must be provided with arc89_extra_payload calls in the Group" } ], "returns": { "type": "(uint8,uint64)", "struct": "MbrDelta", "desc": "MBR Delta: tuple of (sign enum, amount in microALGO)" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Replace mutable Metadata with a smaller or equal size payload for an existing ASA,\nrestricted to the ASA Manager Address.", "events": [ { "name": "Arc89MetadataUpdated", "args": [ { "type": "uint64", "name": "asset_id" }, { "type": "uint64", "name": "round" }, { "type": "uint64", "name": "timestamp" }, { "type": "byte", "name": "reversible_flags" }, { "type": "byte", "name": "irreversible_flags" }, { "type": "bool", "name": "is_short" }, { "type": "byte[32]", "name": "hash" } ], "desc": "Event emitted when Asset Metadata is created or updated" } ], "recommendations": {} }, { "name": "arc89_replace_metadata_larger", "args": [ { "type": "uint64", "name": "asset_id", "desc": "The Asset ID to replace the Asset Metadata for" }, { "type": "uint16", "name": "metadata_size", "desc": "The new Metadata byte size, must be larger than the existing" }, { "type": "byte[]", "name": "payload", "desc": "The Metadata payload (without Header). WARNING: Payload larger than args capacity must be provided with arc89_extra_payload calls in the Group" }, { "type": "pay", "name": "mbr_delta_payment", "desc": "Payment of the MBR Delta amount (microALGO) for the larger Asset Metadata Box replace" } ], "returns": { "type": "(uint8,uint64)", "struct": "MbrDelta", "desc": "MBR Delta: tuple of (sign enum, amount in microALGO)" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Replace mutable Metadata with a larger size payload for an existing ASA,\nrestricted to the ASA Manager Address.", "events": [ { "name": "Arc89MetadataUpdated", "args": [ { "type": "uint64", "name": "asset_id" }, { "type": "uint64", "name": "round" }, { "type": "uint64", "name": "timestamp" }, { "type": "byte", "name": "reversible_flags" }, { "type": "byte", "name": "irreversible_flags" }, { "type": "bool", "name": "is_short" }, { "type": "byte[32]", "name": "hash" } ], "desc": "Event emitted when Asset Metadata is created or updated" } ], "recommendations": {} }, { "name": "arc89_replace_metadata_slice", "args": [ { "type": "uint64", "name": "asset_id", "desc": "The Asset ID to replace the Asset Metadata slice for" }, { "type": "uint16", "name": "offset", "desc": "The 0-based byte offset within the Metadata (body) bytes" }, { "type": "byte[]", "name": "payload", "desc": "The slice payload" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Replace a slice of the Asset Metadata for an ASA with a payload of the same size,\nrestricted to the ASA Manager Address.", "events": [ { "name": "Arc89MetadataUpdated", "args": [ { "type": "uint64", "name": "asset_id" }, { "type": "uint64", "name": "round" }, { "type": "uint64", "name": "timestamp" }, { "type": "byte", "name": "reversible_flags" }, { "type": "byte", "name": "irreversible_flags" }, { "type": "bool", "name": "is_short" }, { "type": "byte[32]", "name": "hash" } ], "desc": "Event emitted when Asset Metadata is created or updated" } ], "recommendations": {} }, { "name": "arc89_migrate_metadata", "args": [ { "type": "uint64", "name": "asset_id", "desc": "The Asset ID to migrate the Asset Metadata for" }, { "type": "uint64", "name": "new_registry_id", "desc": "The Application ID of the new ASA Metadata Registry version" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Migrate the Asset Metadata for an ASA to a new ASA Metadata Registry version,\nrestricted to the ASA Manager Address", "events": [ { "name": "Arc89MetadataMigrated", "args": [ { "type": "uint64", "name": "asset_id" }, { "type": "uint64", "name": "new_registry_id" }, { "type": "uint64", "name": "round" }, { "type": "uint64", "name": "timestamp" } ], "desc": "Event emitted when Asset Metadata has been migrated to a new ASA Metadata Registry version" } ], "recommendations": {} }, { "name": "arc89_delete_metadata", "args": [ { "type": "uint64", "name": "asset_id", "desc": "The Asset ID to delete the Asset Metadata for" } ], "returns": { "type": "(uint8,uint64)", "struct": "MbrDelta", "desc": "MBR Delta: tuple of (sign enum, amount in microALGO)" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Delete Asset Metadata for an ASA, restricted to the ASA Manager Address (if the ASA still exists).", "events": [ { "name": "Arc89MetadataDeleted", "args": [ { "type": "uint64", "name": "asset_id" }, { "type": "uint64", "name": "round" }, { "type": "uint64", "name": "timestamp" } ], "desc": "Event emitted when Asset Metadata is deleted" } ], "recommendations": {} }, { "name": "arc89_extra_payload", "args": [ { "type": "uint64", "name": "asset_id", "desc": "The Asset ID to provide Metadata extra payload for" }, { "type": "byte[]", "name": "payload", "desc": "The Metadata extra payload to concatenate" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Concatenate extra payload to Asset Metadata head call methods (creation or replacement).", "events": [], "recommendations": {} }, { "name": "arc89_set_reversible_flag", "args": [ { "type": "uint64", "name": "asset_id", "desc": "The Asset ID to set the Metadata Flag for" }, { "type": "uint8", "name": "flag", "desc": "The reversible flag index to set" }, { "type": "bool", "name": "value", "desc": "The flag value to set" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Set a reversible Asset Metadata Flag, restricted to the ASA Manager Address", "events": [ { "name": "Arc89MetadataUpdated", "args": [ { "type": "uint64", "name": "asset_id" }, { "type": "uint64", "name": "round" }, { "type": "uint64", "name": "timestamp" }, { "type": "byte", "name": "reversible_flags" }, { "type": "byte", "name": "irreversible_flags" }, { "type": "bool", "name": "is_short" }, { "type": "byte[32]", "name": "hash" } ], "desc": "Event emitted when Asset Metadata is created or updated" } ], "recommendations": {} }, { "name": "arc89_set_irreversible_flag", "args": [ { "type": "uint64", "name": "asset_id", "desc": "The Asset ID to set the Metadata Flag for" }, { "type": "uint8", "name": "flag", "desc": "The irreversible flag index to set. WARNING: must be in 2 ... 6" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Set an irreversible Asset Metadata Flag, restricted to the ASA Manager Address", "events": [ { "name": "Arc89MetadataUpdated", "args": [ { "type": "uint64", "name": "asset_id" }, { "type": "uint64", "name": "round" }, { "type": "uint64", "name": "timestamp" }, { "type": "byte", "name": "reversible_flags" }, { "type": "byte", "name": "irreversible_flags" }, { "type": "bool", "name": "is_short" }, { "type": "byte[32]", "name": "hash" } ], "desc": "Event emitted when Asset Metadata is created or updated" } ], "recommendations": {} }, { "name": "arc89_set_immutable", "args": [ { "type": "uint64", "name": "asset_id", "desc": "The Asset ID to set immutable Asset Metadata for" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Set Asset Metadata as immutable, restricted to the ASA Manager Address.", "events": [ { "name": "Arc89MetadataUpdated", "args": [ { "type": "uint64", "name": "asset_id" }, { "type": "uint64", "name": "round" }, { "type": "uint64", "name": "timestamp" }, { "type": "byte", "name": "reversible_flags" }, { "type": "byte", "name": "irreversible_flags" }, { "type": "bool", "name": "is_short" }, { "type": "byte[32]", "name": "hash" } ], "desc": "Event emitted when Asset Metadata is created or updated" } ], "recommendations": {} }, { "name": "arc89_get_metadata_registry_parameters", "args": [], "returns": { "type": "(uint8,uint16,uint16,uint16,uint16,uint16,uint16,uint16,uint64,uint64)", "struct": "RegistryParameters", "desc": "Tuple of (ASSET_METADATA_BOX_KEY_SIZE, HEADER_SIZE, MAX_METADATA_SIZE, SHORT_METADATA_SIZE, PAGE_SIZE, FIRST_PAYLOAD_MAX_SIZE, EXTRA_PAYLOAD_MAX_SIZE, REPLACE_PAYLOAD_MAX_SIZE, FLAT_MBR, BYTE_MBR)" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Return the ASA Metadata Registry parameters.", "events": [], "recommendations": {} }, { "name": "arc89_get_metadata_partial_uri", "args": [], "returns": { "type": "string", "desc": "Asset Metadata ARC-90 partial URI, without compliance fragment" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Return the Asset Metadata ARC-90 partial URI, without compliance fragment (optional)", "events": [], "recommendations": {} }, { "name": "arc89_get_metadata_mbr_delta", "args": [ { "type": "uint64", "name": "asset_id", "desc": "The Asset ID to calculate the Asset Metadata MBR Delta for" }, { "type": "uint16", "name": "new_metadata_size", "desc": "The new Asset Metadata byte size" } ], "returns": { "type": "(uint8,uint64)", "struct": "MbrDelta", "desc": "MBR Delta: tuple of (sign enum, amount in microALGO)" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Return the Asset Metadata Box MBR Delta for an ASA, given a new Asset Metadata byte size.\nIf the Asset Metadata Box does not exist, the creation MBR Delta is returned.", "events": [], "recommendations": {} }, { "name": "arc89_check_metadata_exists", "args": [ { "type": "uint64", "name": "asset_id", "desc": "The Asset ID to check the ASA and Asset Metadata existence for" } ], "returns": { "type": "(bool,bool)", "struct": "MetadataExistence", "desc": "Tuple of (ASA exists, Asset Metadata exists)" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Checks whether the specified ASA exists and whether its associated Asset Metadata is available.", "events": [], "recommendations": {} }, { "name": "arc89_is_metadata_immutable", "args": [ { "type": "uint64", "name": "asset_id", "desc": "The Asset ID to check the Asset Metadata immutability for" } ], "returns": { "type": "bool", "desc": "Asset Metadata for the ASA is immutable" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Return True if the Asset Metadata for an ASA is immutable, False otherwise.", "events": [], "recommendations": {} }, { "name": "arc89_is_metadata_short", "args": [ { "type": "uint64", "name": "asset_id", "desc": "The Asset ID to check the Asset Metadata size classification for" } ], "returns": { "type": "(bool,uint64)", "struct": "MutableFlag", "desc": "Tuple of (is short metadata, Metadata Last Modified Round)" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Return True if Asset Metadata for an ASA is short (up to 4096 bytes), False otherwise.", "events": [], "recommendations": {} }, { "name": "arc89_get_metadata_header", "args": [ { "type": "uint64", "name": "asset_id", "desc": "The Asset ID to get the Asset Metadata Header for" } ], "returns": { "type": "(byte,byte,byte,byte[32],uint64,uint64)", "struct": "MetadataHeader", "desc": "Asset Metadata Header: (Identifiers, Reversible Flags, Irreversible Flags, Hash, Last Modified Round, Deprecated By)" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Return the Asset Metadata Header for an ASA.", "events": [], "recommendations": {} }, { "name": "arc89_get_metadata_pagination", "args": [ { "type": "uint64", "name": "asset_id", "desc": "The Asset ID to get the Asset Metadata pagination for" } ], "returns": { "type": "(uint16,uint16,uint8)", "struct": "Pagination", "desc": "Tuple of (total metadata byte size, PAGE_SIZE, total number of pages)" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Return the Asset Metadata pagination for an ASA.", "events": [], "recommendations": {} }, { "name": "arc89_get_metadata", "args": [ { "type": "uint64", "name": "asset_id", "desc": "The Asset ID to get the Asset Metadata for" }, { "type": "uint8", "name": "page", "desc": "The 0-based Metadata page number" } ], "returns": { "type": "(bool,uint64,byte[])", "struct": "PaginatedMetadata", "desc": "Tuple of (has next page, Metadata Last Modified Round, page content)" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Return paginated Asset Metadata (without Header) for an ASA.", "events": [], "recommendations": {} }, { "name": "arc89_get_metadata_slice", "args": [ { "type": "uint64", "name": "asset_id", "desc": "The Asset ID to get the Asset Metadata slice for" }, { "type": "uint16", "name": "offset", "desc": "The 0-based byte offset within the Metadata (body) bytes" }, { "type": "uint16", "name": "size", "desc": "The slice bytes size to return" } ], "returns": { "type": "byte[]", "desc": "Asset Metadata slice (size limited to PAGE_SIZE)" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Return a slice of the Asset Metadata for an ASA.", "events": [], "recommendations": {} }, { "name": "arc89_get_metadata_header_hash", "args": [ { "type": "uint64", "name": "asset_id", "desc": "The Asset ID to get the Metadata Header Hash for" } ], "returns": { "type": "byte[32]", "desc": "Asset Metadata Header Hash" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Return the Metadata Header Hash for an ASA.", "events": [], "recommendations": {} }, { "name": "arc89_get_metadata_page_hash", "args": [ { "type": "uint64", "name": "asset_id", "desc": "The Asset ID to get the Asset Metadata page hash for" }, { "type": "uint8", "name": "page", "desc": "The 0-based Metadata page number" } ], "returns": { "type": "byte[32]", "desc": "The SHA512-256 of the Metadata page" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Return the SHA512-256 of a Metadata page for an ASA.", "events": [], "recommendations": {} }, { "name": "arc89_get_metadata_hash", "args": [ { "type": "uint64", "name": "asset_id", "desc": "The Asset ID to get the Metadata Hash for" } ], "returns": { "type": "byte[32]", "desc": "Asset Metadata Hash" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Return the Metadata Hash for an ASA.", "events": [], "recommendations": {} }, { "name": "arc89_get_metadata_string_by_key", "args": [ { "type": "uint64", "name": "asset_id", "desc": "The Asset ID to get the key value for" }, { "type": "string", "name": "key", "desc": "The top level JSON key whose string value to fetch" } ], "returns": { "type": "string", "desc": "The string value from valid UTF-8 JSON Metadata (size limited to PAGE_SIZE)" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Return the UTF-8 string value for a top-level JSON key of type JSON String\nfrom short Metadata for an ASA; errors if the key does not exist or is not a JSON String", "events": [], "recommendations": {} }, { "name": "arc89_get_metadata_uint64_by_key", "args": [ { "type": "uint64", "name": "asset_id", "desc": "The Asset ID to get the key value for" }, { "type": "string", "name": "key", "desc": "The top level JSON key whose uint64 value to fetch" } ], "returns": { "type": "uint64", "desc": "The uint64 value from valid UTF-8 JSON Metadata" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Return the uint64 value for a top-level JSON key of type JSON Uint64 from\nshort Metadata for an ASA; errors if the key does not exist or is not a JSON Uint64", "events": [], "recommendations": {} }, { "name": "arc89_get_metadata_object_by_key", "args": [ { "type": "uint64", "name": "asset_id", "desc": "The Asset ID to get the key value for" }, { "type": "string", "name": "key", "desc": "The top level JSON key whose object value to fetch" } ], "returns": { "type": "string", "desc": "The object value from valid UTF-8 JSON Metadata (size limited to PAGE_SIZE)" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Return the UTF-8 object value for a top-level JSON key of type JSON Object\nfrom short Metadata for an ASA; errors if the key does not exist or is not a JSON Object", "events": [], "recommendations": {} }, { "name": "arc89_get_metadata_b64_bytes_by_key", "args": [ { "type": "uint64", "name": "asset_id", "desc": "The Asset ID to get the key value for" }, { "type": "string", "name": "key", "desc": "The top-level JSON key whose base64 string value to fetch and decode" }, { "type": "uint8", "name": "b64_encoding", "desc": "base64 encoding enum: 0 = URLEncoding, 1 = StdEncoding" } ], "returns": { "type": "byte[]", "desc": "The base64-decoded bytes from valid UTF-8 JSON Metadata (size limited to PAGE_SIZE)" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Return the base64-decoded bytes for a top-level JSON key of type JSON String\nfrom short Metadata for an ASA; errors if the key does not exist, is not a JSON String, or is not valid base64 for the chosen encoding", "events": [], "recommendations": {} }, { "name": "extra_resources", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Non-normative placeholder method to acquire AVM extra resources.", "events": [], "recommendations": {} }, { "name": "withdraw_balance_excess", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Non-normative method to withdraw balance excess due to accidental deposits\n(it should never happen if deposits match exactly the required MBR. Deleted metadata MBR is not included in the excess, since it is immediately returned on delete).", "events": [], "recommendations": {} } ], "arcs": [ 22, 28 ], "desc": "\n Singleton Application providing ASA metadata via Algod API and AVM\n ", "networks": {}, "state": { "schema": { "global": { "ints": 0, "bytes": 0 }, "local": { "ints": 0, "bytes": 0 } }, "keys": { "global": {}, "local": {}, "box": {} }, "maps": { "global": {}, "local": {}, "box": { "asset_metadata": { "keyType": "uint64", "valueType": "AVMBytes", "prefix": "" } } } }, "bareActions": { "create": [ "NoOp" ], "call": [] }, "sourceInfo": { "approval": { "sourceInfo": [ { "pc": [ 1116 ], "errorMessage": "ERR:asaMetadataHashMismatch" }, { "pc": [ 962 ], "errorMessage": "ERR:asaNotArc3Compliant" }, { "pc": [ 984, 2226 ], "errorMessage": "ERR:asaNotArc54Compliant" }, { "pc": [ 1059 ], "errorMessage": "ERR:asaNotArc89Compliant" }, { "pc": [ 2012, 3993, 4072 ], "errorMessage": "ERR:asaNotExist" }, { "pc": [ 701 ], "errorMessage": "ERR:assetMetadataExist" }, { "pc": [ 1845, 2023, 4041, 4084 ], "errorMessage": "ERR:assetMetadataNotExist" }, { "pc": [ 3296 ], "errorMessage": "ERR:b64EncodingInvalid" }, { "pc": [ 3019 ], "errorMessage": "ERR:emptyMetadata" }, { "pc": [ 2307, 4017 ], "errorMessage": "ERR:exceedsMaxMetadataSize" }, { "pc": [ 1681, 2862 ], "errorMessage": "ERR:exceedsMetadataSize" }, { "pc": [ 2840, 3100, 3208, 3330 ], "errorMessage": "ERR:exceedsPageSize" }, { "pc": [ 2084, 2174 ], "errorMessage": "ERR:flagIdxInvalid" }, { "pc": [ 1867, 4055, 4120 ], "errorMessage": "ERR:immutable" }, { "pc": [ 1336 ], "errorMessage": "ERR:largerMetadataSize" }, { "pc": [ 1146, 1598 ], "errorMessage": "ERR:mbrDeltaAmountInvalid" }, { "pc": [ 715, 1539 ], "errorMessage": "ERR:mbrDeltaReceiverInvalid" }, { "pc": [ 3724 ], "errorMessage": "ERR:metadataNotShort" }, { "pc": [ 1372, 1575, 3628 ], "errorMessage": "ERR:metadataSizeMismatch" }, { "pc": [ 1777 ], "errorMessage": "ERR:newRegistryIdInvalid" }, { "pc": [ 2000 ], "errorMessage": "ERR:noPayloadHeadCall" }, { "pc": [ 2724, 2788, 2969 ], "errorMessage": "ERR:pageIdxInvalid" }, { "pc": [ 3470, 3574, 3596 ], "errorMessage": "ERR:payloadOverflow" }, { "pc": [ 864 ], "errorMessage": "ERR:requiresImmutable" }, { "pc": [ 1525 ], "errorMessage": "ERR:smallerMetadataSize" }, { "pc": [ 1879, 2034, 4005, 4105 ], "errorMessage": "ERR:unauthorized" }, { "pc": [ 304 ], "errorMessage": "ERR:untrustedDeployer" }, { "pc": [ 723, 1128, 1344, 1377, 1547, 1580, 1884, 1896, 3357, 3362 ], "errorMessage": "account funded" }, { "pc": [ 789, 915, 921, 1014, 1416, 2468, 4249 ], "errorMessage": "asset exists" }, { "pc": [ 3408, 3421 ], "errorMessage": "check Box exists" }, { "pc": [ 2571, 2909, 2992, 3044 ], "errorMessage": "expected bytes to be length 32" }, { "pc": [ 633, 1282, 1458, 1634, 1962, 3065, 3129, 3173, 3240 ], "errorMessage": "invalid array length header" }, { "pc": [ 2064 ], "errorMessage": "invalid number of bytes for arc4.bool" }, { "pc": [ 640, 1289, 1465, 1641, 1968, 3072, 3136, 3180, 3247 ], "errorMessage": "invalid number of bytes for arc4.dynamic_array" }, { "pc": [ 627, 1276, 1452, 1628, 2295, 2816, 2824 ], "errorMessage": "invalid number of bytes for arc4.uint16" }, { "pc": [ 597, 1266, 1442, 1618, 1726, 1736, 1832, 1955, 2046, 2138, 2240, 2286, 2415, 2449, 2498, 2538, 2617, 2679, 2804, 2895, 2924, 3027, 3058, 3122, 3166, 3232 ], "errorMessage": "invalid number of bytes for arc4.uint64" }, { "pc": [ 609, 619, 2056, 2148, 2691, 2936, 3259 ], "errorMessage": "invalid number of bytes for arc4.uint8" }, { "pc": [ 1394, 2351, 2633, 2652, 4142, 4157 ], "errorMessage": "overflow" }, { "pc": [ 657, 1482 ], "errorMessage": "transaction type is pay" } ], "pcOffsetMethod": "cblocks" }, "clear": { "sourceInfo": [], "pcOffsetMethod": "none" } }, "source": { "approval": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAgOCAyIDEwMDcgMTAwNiAzMDUwNgogICAgYnl0ZWNibG9jayAweCAweDE1MWY3Yzc1IDB4MDAgIkVSUjphc3NldE1ldGFkYXRhTm90RXhpc3QiICJFUlI6dW5hdXRob3JpemVkIiAiRVJSOmV4Y2VlZHNQYWdlU2l6ZSIgIkVSUjptZXRhZGF0YVNpemVNaXNtYXRjaCIgIkVSUjppbW11dGFibGUiICJFUlI6YXNhTm90RXhpc3QiICJFUlI6cGFnZUlkeEludmFsaWQiICJFUlI6cGF5bG9hZE92ZXJmbG93IiAweDM3YWM3NTVkIDB4MDY4MTAxICJFUlI6bWJyRGVsdGFSZWNlaXZlckludmFsaWQiICJFUlI6YXNhTm90QXJjNTRDb21wbGlhbnQiICJFUlI6bWJyRGVsdGFBbW91bnRJbnZhbGlkIiAweDE1MWY3Yzc1MDEgIkVSUjpleGNlZWRzTWV0YWRhdGFTaXplIiAiRVJSOmZsYWdJZHhJbnZhbGlkIiAiRVJSOmV4Y2VlZHNNYXhNZXRhZGF0YVNpemUiIFRNUExfVFJVU1RFRF9ERVBMT1lFUiBUTVBMX0FSQzkwX05FVEFVVEgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6NDAKICAgIC8vIGNsYXNzIEFzYU1ldGFkYXRhUmVnaXN0cnkoQXJjODlJbnRlcmZhY2UsIEFzYVZhbGlkYXRpb24pOgogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fZGVwbG95QDM4CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQKICAgIHB1c2hieXRlc3MgMHg3ODQwNzgzMSAweGI4MmVhN2VmIDB4MTI0NWZhZmIgMHgwNDVmMmU2ZSAweGRkZmZjYjkyIDB4MTViMjc1YjIgLy8gbWV0aG9kICJhcmM4OV9jcmVhdGVfbWV0YWRhdGEodWludDY0LGJ5dGUsYnl0ZSx1aW50MTYsYnl0ZVtdLHBheSkodWludDgsdWludDY0KSIsIG1ldGhvZCAiYXJjODlfcmVwbGFjZV9tZXRhZGF0YSh1aW50NjQsdWludDE2LGJ5dGVbXSkodWludDgsdWludDY0KSIsIG1ldGhvZCAiYXJjODlfcmVwbGFjZV9tZXRhZGF0YV9sYXJnZXIodWludDY0LHVpbnQxNixieXRlW10scGF5KSh1aW50OCx1aW50NjQpIiwgbWV0aG9kICJhcmM4OV9yZXBsYWNlX21ldGFkYXRhX3NsaWNlKHVpbnQ2NCx1aW50MTYsYnl0ZVtdKXZvaWQiLCBtZXRob2QgImFyYzg5X21pZ3JhdGVfbWV0YWRhdGEodWludDY0LHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJhcmM4OV9kZWxldGVfbWV0YWRhdGEodWludDY0KSh1aW50OCx1aW50NjQpIgogICAgYnl0ZWMgMTEgLy8gbWV0aG9kICJhcmM4OV9leHRyYV9wYXlsb2FkKHVpbnQ2NCxieXRlW10pdm9pZCIKICAgIHB1c2hieXRlc3MgMHhiNTEyMWQ4YSAweDQ5ZmJhZTkxIDB4MGI1MzhjZTMgMHgwMTVlNTc5YiAweDA4OWZhZWExIDB4OGU1ZTEwMjQgMHgyNDRjNDdjNCAweDJkNTlmNmUwIDB4ZWU4NWI0NzMgMHhiNzU5MzFiYyAweDhmMjVlZjcyIDB4MTFjMzg0NzYgMHhiMGFiZjY1YiAweGNlOWRiZWQ3IDB4Y2E1MmZiMWUgMHgyMjYzOTFiOSAweDdhMTNkNTMyIDB4NTNjMjIyMDMgMHhkMzc3MmFkMyAweDdkYTJhZjQwIDB4MDA1NmQ5YzEgMHhiOTJlMjY3YSAvLyBtZXRob2QgImFyYzg5X3NldF9yZXZlcnNpYmxlX2ZsYWcodWludDY0LHVpbnQ4LGJvb2wpdm9pZCIsIG1ldGhvZCAiYXJjODlfc2V0X2lycmV2ZXJzaWJsZV9mbGFnKHVpbnQ2NCx1aW50OCl2b2lkIiwgbWV0aG9kICJhcmM4OV9zZXRfaW1tdXRhYmxlKHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJhcmM4OV9nZXRfbWV0YWRhdGFfcmVnaXN0cnlfcGFyYW1ldGVycygpKHVpbnQ4LHVpbnQxNix1aW50MTYsdWludDE2LHVpbnQxNix1aW50MTYsdWludDE2LHVpbnQxNix1aW50NjQsdWludDY0KSIsIG1ldGhvZCAiYXJjODlfZ2V0X21ldGFkYXRhX3BhcnRpYWxfdXJpKClzdHJpbmciLCBtZXRob2QgImFyYzg5X2dldF9tZXRhZGF0YV9tYnJfZGVsdGEodWludDY0LHVpbnQxNikodWludDgsdWludDY0KSIsIG1ldGhvZCAiYXJjODlfY2hlY2tfbWV0YWRhdGFfZXhpc3RzKHVpbnQ2NCkoYm9vbCxib29sKSIsIG1ldGhvZCAiYXJjODlfaXNfbWV0YWRhdGFfaW1tdXRhYmxlKHVpbnQ2NClib29sIiwgbWV0aG9kICJhcmM4OV9pc19tZXRhZGF0YV9zaG9ydCh1aW50NjQpKGJvb2wsdWludDY0KSIsIG1ldGhvZCAiYXJjODlfZ2V0X21ldGFkYXRhX2hlYWRlcih1aW50NjQpKGJ5dGUsYnl0ZSxieXRlLGJ5dGVbMzJdLHVpbnQ2NCx1aW50NjQpIiwgbWV0aG9kICJhcmM4OV9nZXRfbWV0YWRhdGFfcGFnaW5hdGlvbih1aW50NjQpKHVpbnQxNix1aW50MTYsdWludDgpIiwgbWV0aG9kICJhcmM4OV9nZXRfbWV0YWRhdGEodWludDY0LHVpbnQ4KShib29sLHVpbnQ2NCxieXRlW10pIiwgbWV0aG9kICJhcmM4OV9nZXRfbWV0YWRhdGFfc2xpY2UodWludDY0LHVpbnQxNix1aW50MTYpYnl0ZVtdIiwgbWV0aG9kICJhcmM4OV9nZXRfbWV0YWRhdGFfaGVhZGVyX2hhc2godWludDY0KWJ5dGVbMzJdIiwgbWV0aG9kICJhcmM4OV9nZXRfbWV0YWRhdGFfcGFnZV9oYXNoKHVpbnQ2NCx1aW50OClieXRlWzMyXSIsIG1ldGhvZCAiYXJjODlfZ2V0X21ldGFkYXRhX2hhc2godWludDY0KWJ5dGVbMzJdIiwgbWV0aG9kICJhcmM4OV9nZXRfbWV0YWRhdGFfc3RyaW5nX2J5X2tleSh1aW50NjQsc3RyaW5nKXN0cmluZyIsIG1ldGhvZCAiYXJjODlfZ2V0X21ldGFkYXRhX3VpbnQ2NF9ieV9rZXkodWludDY0LHN0cmluZyl1aW50NjQiLCBtZXRob2QgImFyYzg5X2dldF9tZXRhZGF0YV9vYmplY3RfYnlfa2V5KHVpbnQ2NCxzdHJpbmcpc3RyaW5nIiwgbWV0aG9kICJhcmM4OV9nZXRfbWV0YWRhdGFfYjY0X2J5dGVzX2J5X2tleSh1aW50NjQsc3RyaW5nLHVpbnQ4KWJ5dGVbXSIsIG1ldGhvZCAiZXh0cmFfcmVzb3VyY2VzKCl2b2lkIiwgbWV0aG9kICJ3aXRoZHJhd19iYWxhbmNlX2V4Y2Vzcygpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIGFyYzg5X2NyZWF0ZV9tZXRhZGF0YSBhcmM4OV9yZXBsYWNlX21ldGFkYXRhIGFyYzg5X3JlcGxhY2VfbWV0YWRhdGFfbGFyZ2VyIGFyYzg5X3JlcGxhY2VfbWV0YWRhdGFfc2xpY2UgYXJjODlfbWlncmF0ZV9tZXRhZGF0YSBhcmM4OV9kZWxldGVfbWV0YWRhdGEgYXJjODlfZXh0cmFfcGF5bG9hZCBhcmM4OV9zZXRfcmV2ZXJzaWJsZV9mbGFnIGFyYzg5X3NldF9pcnJldmVyc2libGVfZmxhZyBhcmM4OV9zZXRfaW1tdXRhYmxlIG1haW5fYXJjODlfZ2V0X21ldGFkYXRhX3JlZ2lzdHJ5X3BhcmFtZXRlcnNfcm91dGVAMTYgYXJjODlfZ2V0X21ldGFkYXRhX3BhcnRpYWxfdXJpIGFyYzg5X2dldF9tZXRhZGF0YV9tYnJfZGVsdGEgYXJjODlfY2hlY2tfbWV0YWRhdGFfZXhpc3RzIGFyYzg5X2lzX21ldGFkYXRhX2ltbXV0YWJsZSBhcmM4OV9pc19tZXRhZGF0YV9zaG9ydCBhcmM4OV9nZXRfbWV0YWRhdGFfaGVhZGVyIGFyYzg5X2dldF9tZXRhZGF0YV9wYWdpbmF0aW9uIGFyYzg5X2dldF9tZXRhZGF0YSBhcmM4OV9nZXRfbWV0YWRhdGFfc2xpY2UgYXJjODlfZ2V0X21ldGFkYXRhX2hlYWRlcl9oYXNoIGFyYzg5X2dldF9tZXRhZGF0YV9wYWdlX2hhc2ggYXJjODlfZ2V0X21ldGFkYXRhX2hhc2ggYXJjODlfZ2V0X21ldGFkYXRhX3N0cmluZ19ieV9rZXkgYXJjODlfZ2V0X21ldGFkYXRhX3VpbnQ2NF9ieV9rZXkgYXJjODlfZ2V0X21ldGFkYXRhX29iamVjdF9ieV9rZXkgYXJjODlfZ2V0X21ldGFkYXRhX2I2NF9ieXRlc19ieV9rZXkgbWFpbl9leHRyYV9yZXNvdXJjZXNfcm91dGVAMzMgd2l0aGRyYXdfYmFsYW5jZV9leGNlc3MKICAgIGVycgoKbWFpbl9leHRyYV9yZXNvdXJjZXNfcm91dGVAMzM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjEzMDMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9hcmM4OV9nZXRfbWV0YWRhdGFfcmVnaXN0cnlfcGFyYW1ldGVyc19yb3V0ZUAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6ODIwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHB1c2hieXRlcyAweDE1MWY3Yzc1MDgwMDMzNzcyYTEwMDAwM2VmMDdlZTA3ZjIwN2YwMDAwMDAwMDAwMDAwMDljNDAwMDAwMDAwMDAwMDAxOTAKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9kZXBsb3lAMzg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjM4MgogICAgLy8gQGFyYzQuYmFyZW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICBhc3NlcnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6Mzg5CiAgICAvLyBUeG4uc2VuZGVyID09IFRlbXBsYXRlVmFyW0FjY291bnRdKFRSVVNURURfREVQTE9ZRVIpLAogICAgdHhuIFNlbmRlcgogICAgYnl0ZWMgMjAgLy8gVE1QTF9UUlVTVEVEX0RFUExPWUVSCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTozODctMzkxCiAgICAvLyAjIFByZWNvbmRpdGlvbnMKICAgIC8vIGxvZ2dlZF9hc3NlcnQoCiAgICAvLyAgICAgVHhuLnNlbmRlciA9PSBUZW1wbGF0ZVZhcltBY2NvdW50XShUUlVTVEVEX0RFUExPWUVSKSwKICAgIC8vICAgICBlcnIuVU5UUlVTVEVEX0RFUExPWUVSLAogICAgLy8gKQogICAgYm56IG1haW5fYWZ0ZXJfYXNzZXJ0QDQxCiAgICBwdXNoYnl0ZXMgIkVSUjp1bnRydXN0ZWREZXBsb3llciIKICAgIGxvZwogICAgZXJyIC8vIEVSUjp1bnRydXN0ZWREZXBsb3llcgoKbWFpbl9hZnRlcl9hc3NlcnRANDE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjM4MgogICAgLy8gQGFyYzQuYmFyZW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIF9wdXlhX2xpYi51dGlsLmVuc3VyZV9idWRnZXQocmVxdWlyZWRfYnVkZ2V0OiB1aW50NjQsIGZlZV9zb3VyY2U6IHVpbnQ2NCkgLT4gdm9pZDoKZW5zdXJlX2J1ZGdldDoKICAgIHByb3RvIDIgMAogICAgZnJhbWVfZGlnIC0yCiAgICBwdXNoaW50IDEwCiAgICArCgplbnN1cmVfYnVkZ2V0X3doaWxlX3RvcEAxOgogICAgZnJhbWVfZGlnIDAKICAgIGdsb2JhbCBPcGNvZGVCdWRnZXQKICAgID4KICAgIGJ6IGVuc3VyZV9idWRnZXRfYWZ0ZXJfd2hpbGVANgogICAgaXR4bl9iZWdpbgogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIHB1c2hpbnQgNSAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIGJ5dGVjIDEyIC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbQogICAgYnl0ZWMgMTIgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW0KICAgIGZyYW1lX2RpZyAtMQogICAgc3dpdGNoIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMEAzIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMUA0CgplbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlX25leHRANToKICAgIGl0eG5fc3VibWl0CiAgICBiIGVuc3VyZV9idWRnZXRfd2hpbGVfdG9wQDEKCmVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMUA0OgogICAgZ2xvYmFsIE1pblR4bkZlZQogICAgaXR4bl9maWVsZCBGZWUKICAgIGIgZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV9uZXh0QDUKCmVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMEAzOgogICAgaW50Y18xIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBiIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfbmV4dEA1CgplbnN1cmVfYnVkZ2V0X2FmdGVyX3doaWxlQDY6CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXZtX2xpYnJhcnkuZW5kc3dpdGgoczogYnl0ZXMsIHN1ZmZpeDogYnl0ZXMpIC0+IHVpbnQ2NDoKZW5kc3dpdGg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXZtX2xpYnJhcnkucHk6NTMtNTQKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgZW5kc3dpdGgoczogQnl0ZXMsIHN1ZmZpeDogQnl0ZXMpIC0+IGJvb2w6CiAgICBwcm90byAyIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdm1fbGlicmFyeS5weTo1NQogICAgLy8gYXNzZXJ0IHN1ZmZpeC5sZW5ndGggPD0gcy5sZW5ndGgKICAgIGZyYW1lX2RpZyAtMQogICAgbGVuCiAgICBmcmFtZV9kaWcgLTIKICAgIGxlbgogICAgZHVwMgogICAgPD0KICAgIGFzc2VydAogICAgLy8gc21hcnRfY29udHJhY3RzL2F2bV9saWJyYXJ5LnB5OjU2CiAgICAvLyByZXR1cm4gc1tzLmxlbmd0aCAtIHN1ZmZpeC5sZW5ndGggOl0gPT0gc3VmZml4CiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgLQogICAgZHVwCiAgICBkaWcgMgogICAgPj0KICAgIGRpZyAyCiAgICBzd2FwCiAgICBzZWxlY3QKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBmcmFtZV9kaWcgLTEKICAgID09CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXZtX2xpYnJhcnkuYXJjOTBfYm94X3F1ZXJ5KGFwcF9pZDogdWludDY0LCBib3hfbmFtZTogYnl0ZXMpIC0+IGJ5dGVzOgphcmM5MF9ib3hfcXVlcnk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXZtX2xpYnJhcnkucHk6NTktNjAKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYXJjOTBfYm94X3F1ZXJ5KGFwcF9pZDogVUludDY0LCBib3hfbmFtZTogQnl0ZXMpIC0+IEJ5dGVzOgogICAgcHJvdG8gMiAxCiAgICBpbnRjXzEgLy8gMAogICAgZHVwCiAgICBieXRlY18wIC8vICIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXZtX2xpYnJhcnkucHk6NjEKICAgIC8vIGlmIEdsb2JhbC5nZW5lc2lzX2hhc2ggPT0gQnl0ZXMuZnJvbV9iYXNlNjQoTUFJTk5FVF9HSF9CNjQpOgogICAgZ2xvYmFsIEdlbmVzaXNIYXNoCiAgICBwdXNoYnl0ZXMgYmFzZTY0KHdHSEUyUHdkdmQ3UzEyQkw1RmFPUDIwRUdZZXNONzNrdGlDMXF6a2tpdDg9KQogICAgPT0KICAgIGJ6IGFyYzkwX2JveF9xdWVyeV9lbHNlX2JvZHlAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2F2bV9saWJyYXJ5LnB5OjYyCiAgICAvLyBhcmM5MF9uZXRhdXRoID0gQnl0ZXMoKQogICAgYnl0ZWNfMCAvLyAweAoKYXJjOTBfYm94X3F1ZXJ5X2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdm1fbGlicmFyeS5weTo2NgogICAgLy8gQVJDOTBfVVJJX1NDSEVNRQogICAgcHVzaGJ5dGVzIDB4NjE2YzY3NmY3MjYxNmU2NDNhMmYyZgogICAgLy8gc21hcnRfY29udHJhY3RzL2F2bV9saWJyYXJ5LnB5OjY2LTY3CiAgICAvLyBBUkM5MF9VUklfU0NIRU1FCiAgICAvLyArIGFyYzkwX25ldGF1dGgKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2F2bV9saWJyYXJ5LnB5OjY4CiAgICAvLyArIEFSQzkwX1VSSV9BUFBfUEFUSAogICAgcHVzaGJ5dGVzIDB4NjE3MDcwMmYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdm1fbGlicmFyeS5weTo2Ni02OAogICAgLy8gQVJDOTBfVVJJX1NDSEVNRQogICAgLy8gKyBhcmM5MF9uZXRhdXRoCiAgICAvLyArIEFSQzkwX1VSSV9BUFBfUEFUSAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdm1fbGlicmFyeS5weTozNwogICAgLy8gYWNjID0gQnl0ZXMoYiIiKQogICAgYnl0ZWNfMCAvLyAweAogICAgZnJhbWVfYnVyeSAwCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2J1cnkgMgoKYXJjOTBfYm94X3F1ZXJ5X3doaWxlX3RvcEA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2F2bV9saWJyYXJ5LnB5OjM5CiAgICAvLyB3aGlsZSBpID4gMDoKICAgIGZyYW1lX2RpZyAyCiAgICBieiBhcmM5MF9ib3hfcXVlcnlfYWZ0ZXJfd2hpbGVANwogICAgLy8gc21hcnRfY29udHJhY3RzL2F2bV9saWJyYXJ5LnB5OjQwCiAgICAvLyBkID0gaSAlIFVJbnQ2NCgxMCkKICAgIGZyYW1lX2RpZyAyCiAgICBkdXAKICAgIHB1c2hpbnQgMTAKICAgICUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdm1fbGlicmFyeS5weTo0MQogICAgLy8gYWNjID0gZGlnaXRzW2QgOiBkICsgVUludDY0KDEpXSArIGFjYwogICAgZHVwCiAgICBwdXNoaW50IDEwCiAgICA+PQogICAgZGlnIDEKICAgIHB1c2hpbnQgMTAKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZHVwCiAgICBwdXNoaW50IDEwCiAgICA+PQogICAgcHVzaGludCAxMAogICAgc3dhcAogICAgc2VsZWN0CiAgICBkdXAKICAgIGRpZyAyCiAgICA8CiAgICBkaWcgMgogICAgc3dhcAogICAgc2VsZWN0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXZtX2xpYnJhcnkucHk6MzUtMzYKICAgIC8vICMgQVNDSUkgZGlnaXRzICh2YWxpZCBVVEYtOCkKICAgIC8vIGRpZ2l0cyA9IEJ5dGVzKGIiMDEyMzQ1Njc4OSIpCiAgICBwdXNoYnl0ZXMgMHgzMDMxMzIzMzM0MzUzNjM3MzgzOQogICAgLy8gc21hcnRfY29udHJhY3RzL2F2bV9saWJyYXJ5LnB5OjQxCiAgICAvLyBhY2MgPSBkaWdpdHNbZCA6IGQgKyBVSW50NjQoMSldICsgYWNjCiAgICBjb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBmcmFtZV9kaWcgMAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdm1fbGlicmFyeS5weTo0MgogICAgLy8gaSAvLz0gVUludDY0KDEwKQogICAgcHVzaGludCAxMAogICAgLwogICAgZnJhbWVfYnVyeSAyCiAgICBiIGFyYzkwX2JveF9xdWVyeV93aGlsZV90b3BANQoKYXJjOTBfYm94X3F1ZXJ5X2FmdGVyX3doaWxlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXZtX2xpYnJhcnkucHk6NDQKICAgIC8vIHJldHVybiBhY2Mgb3IgQnl0ZXMoYiIwIikKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGJ5dGVzIDB4MzAKICAgIGNvdmVyIDIKICAgIHNlbGVjdAogICAgLy8gc21hcnRfY29udHJhY3RzL2F2bV9saWJyYXJ5LnB5OjY2LTY5CiAgICAvLyBBUkM5MF9VUklfU0NIRU1FCiAgICAvLyArIGFyYzkwX25ldGF1dGgKICAgIC8vICsgQVJDOTBfVVJJX0FQUF9QQVRICiAgICAvLyArIGl0b2EoYXBwX2lkKQogICAgZnJhbWVfZGlnIDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2F2bV9saWJyYXJ5LnB5OjcwCiAgICAvLyArIEFSQzkwX1VSSV9CT1hfUVVFUlkKICAgIHB1c2hieXRlcyAweDNmNjI2Zjc4M2QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdm1fbGlicmFyeS5weTo2Ni03MAogICAgLy8gQVJDOTBfVVJJX1NDSEVNRQogICAgLy8gKyBhcmM5MF9uZXRhdXRoCiAgICAvLyArIEFSQzkwX1VSSV9BUFBfUEFUSAogICAgLy8gKyBpdG9hKGFwcF9pZCkKICAgIC8vICsgQVJDOTBfVVJJX0JPWF9RVUVSWQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXZtX2xpYnJhcnkucHk6NjYtNzEKICAgIC8vIEFSQzkwX1VSSV9TQ0hFTUUKICAgIC8vICsgYXJjOTBfbmV0YXV0aAogICAgLy8gKyBBUkM5MF9VUklfQVBQX1BBVEgKICAgIC8vICsgaXRvYShhcHBfaWQpCiAgICAvLyArIEFSQzkwX1VSSV9CT1hfUVVFUlkKICAgIC8vICsgYm94X25hbWUKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXZtX2xpYnJhcnkucHk6NjUtNzIKICAgIC8vIHJldHVybiAoCiAgICAvLyAgICAgQVJDOTBfVVJJX1NDSEVNRQogICAgLy8gICAgICsgYXJjOTBfbmV0YXV0aAogICAgLy8gICAgICsgQVJDOTBfVVJJX0FQUF9QQVRICiAgICAvLyAgICAgKyBpdG9hKGFwcF9pZCkKICAgIC8vICAgICArIEFSQzkwX1VSSV9CT1hfUVVFUlkKICAgIC8vICAgICArIGJveF9uYW1lCiAgICAvLyApCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKYXJjOTBfYm94X3F1ZXJ5X2Vsc2VfYm9keUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2F2bV9saWJyYXJ5LnB5OjY0CiAgICAvLyBhcmM5MF9uZXRhdXRoID0gVGVtcGxhdGVWYXJbQnl0ZXNdKEFSQzkwX05FVEFVVEgpICsgQVJDOTBfVVJJX1BBVEhfU0VQCiAgICBieXRlYyAyMSAvLyBUTVBMX0FSQzkwX05FVEFVVEgKICAgIHB1c2hieXRlcyAweDJmCiAgICBjb25jYXQKICAgIGIgYXJjOTBfYm94X3F1ZXJ5X2FmdGVyX2lmX2Vsc2VAMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc2FfbWV0YWRhdGFfcmVnaXN0cnkuY29udHJhY3QuQXNhTWV0YWRhdGFSZWdpc3RyeS5hcmM4OV9jcmVhdGVfbWV0YWRhdGFbcm91dGluZ10oKSAtPiB2b2lkOgphcmM4OV9jcmVhdGVfbWV0YWRhdGE6CiAgICBpbnRjXzEgLy8gMAogICAgZHVwbiA0CiAgICBieXRlY18wIC8vICIiCiAgICBkdXBuIDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MzkzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50MTYKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDUKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMyAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICBjb3ZlciAyCiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIGR1cAogICAgY292ZXIgMwogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMCAvLyBwYXkKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBwYXkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6NDE5LTQyMAogICAgLy8gIyBQcmVjb25kaXRpb25zCiAgICAvLyBzZWxmLl9jaGVja19iYXNlX3ByZWNvbmRpdGlvbnMoYXNzZXRfaWQsIG1ldGFkYXRhX3NpemUuYXNfdWludDY0KCkpCiAgICBidG9pCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGRpZyAxCiAgICBzd2FwCiAgICBjYWxsc3ViIF9jaGVja19iYXNlX3ByZWNvbmRpdGlvbnMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6NDkKICAgIC8vIHJldHVybiBhc2EgaW4gc2VsZi5hc3NldF9tZXRhZGF0YQogICAgaXRvYgogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6NDIxCiAgICAvLyBsb2dnZWRfYXNzZXJ0KG5vdCBzZWxmLl9tZXRhZGF0YV9leGlzdHMoYXNzZXRfaWQpLCBlcnIuQVNTRVRfTUVUQURBVEFfRVhJU1QpCiAgICBieiBhcmM4OV9jcmVhdGVfbWV0YWRhdGFfYWZ0ZXJfYXNzZXJ0QDMKICAgIHB1c2hieXRlcyAiRVJSOmFzc2V0TWV0YWRhdGFFeGlzdCIKICAgIGxvZwogICAgZXJyIC8vIEVSUjphc3NldE1ldGFkYXRhRXhpc3QKCmFyYzg5X2NyZWF0ZV9tZXRhZGF0YV9hZnRlcl9hc3NlcnRAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6NDIzCiAgICAvLyBtYnJfZGVsdGFfcGF5bWVudC5yZWNlaXZlciA9PSBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgZGlnIDIKICAgIGd0eG5zIFJlY2VpdmVyCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6NDIyLTQyNQogICAgLy8gbG9nZ2VkX2Fzc2VydCgKICAgIC8vICAgICBtYnJfZGVsdGFfcGF5bWVudC5yZWNlaXZlciA9PSBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIGVyci5NQlJfREVMVEFfUkVDRUlWRVJfSU5WQUxJRCwKICAgIC8vICkKICAgIGJueiBhcmM4OV9jcmVhdGVfbWV0YWRhdGFfYWZ0ZXJfYXNzZXJ0QDUKICAgIGJ5dGVjIDEzIC8vICJFUlI6bWJyRGVsdGFSZWNlaXZlckludmFsaWQiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6bWJyRGVsdGFSZWNlaXZlckludmFsaWQKCmFyYzg5X2NyZWF0ZV9tZXRhZGF0YV9hZnRlcl9hc3NlcnRANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6NDI3LTQyOAogICAgLy8gIyBJbml0aWFsaXplIGVtcHR5IEFzc2V0IE1ldGFkYXRhIEJveAogICAgLy8gbWJyX2kgPSBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLm1pbl9iYWxhbmNlCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RNaW5CYWxhbmNlCiAgICBzd2FwCiAgICBidXJ5IDExCiAgICBhc3NlcnQgLy8gYWNjb3VudCBmdW5kZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6NDI5CiAgICAvLyBfZXhpc3RzID0gc2VsZi5hc3NldF9tZXRhZGF0YS5ib3goYXNzZXRfaWQpLmNyZWF0ZShzaXplPVVJbnQ2NCgwKSkKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIGJveF9jcmVhdGUKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTo0MzEtNDMyCiAgICAvLyAjIFNldCBNZXRhZGF0YSBCb2R5CiAgICAvLyBpZiBwYXlsb2FkLmxlbmd0aCA+IDA6CiAgICBkaWcgMwogICAgbGVuCiAgICBieiBhcmM4OV9jcmVhdGVfbWV0YWRhdGFfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjQzMwogICAgLy8gZW5zdXJlX2J1ZGdldChyZXF1aXJlZF9idWRnZXQ9Y29uc3QuQVBQX0NBTExfT1BfQlVER0VUKQogICAgcHVzaGludCA3MDAKICAgIGludGNfMSAvLyAwCiAgICBjYWxsc3ViIGVuc3VyZV9idWRnZXQKCmFyYzg5X2NyZWF0ZV9tZXRhZGF0YV9hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjQzNAogICAgLy8gc2VsZi5fc2V0X21ldGFkYXRhX3BheWxvYWQoYXNzZXRfaWQsIG1ldGFkYXRhX3NpemUuYXNfdWludDY0KCksIHBheWxvYWQpCiAgICBkaWcgNgogICAgZHVwCiAgICBkaWcgMwogICAgZGlnIDYKICAgIGNhbGxzdWIgX3NldF9tZXRhZGF0YV9wYXlsb2FkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjQzNi00MzcKICAgIC8vICMgVXBkYXRlIE1ldGFkYXRhIEhlYWRlcgogICAgLy8gc2VsZi5faWRlbnRpZnlfbWV0YWRhdGEoYXNzZXRfaWQpCiAgICBkdXAKICAgIGNhbGxzdWIgX2lkZW50aWZ5X21ldGFkYXRhCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjQ0MQogICAgLy8gdWludD1yZXZlcnNpYmxlX2ZsYWdzLmFzX3VpbnQ2NCgpLCBzaXplPVVJbnQ2NChjb25zdC5CWVRFX1NJWkUpCiAgICBkaWcgNgogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2F2bV9saWJyYXJ5LnB5OjIwCiAgICAvLyByZXR1cm4gb3AuZXh0cmFjdChvcC5pdG9iKHVpbnQpLCBzdGFydCwgc2l6ZSkKICAgIGl0b2IKICAgIGV4dHJhY3QgNyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5Ojk0LTk2CiAgICAvLyBzZWxmLmFzc2V0X21ldGFkYXRhLmJveChhc2EpLnJlcGxhY2UoCiAgICAvLyAgICAgc3RhcnRfaW5kZXg9Y29uc3QuSURYX1JFVkVSU0lCTEVfRkxBR1MsIHZhbHVlPWZsYWdzCiAgICAvLyApCiAgICBkaWcgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5Ojk1CiAgICAvLyBzdGFydF9pbmRleD1jb25zdC5JRFhfUkVWRVJTSUJMRV9GTEFHUywgdmFsdWU9ZmxhZ3MKICAgIGludGNfMCAvLyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5Ojk0LTk2CiAgICAvLyBzZWxmLmFzc2V0X21ldGFkYXRhLmJveChhc2EpLnJlcGxhY2UoCiAgICAvLyAgICAgc3RhcnRfaW5kZXg9Y29uc3QuSURYX1JFVkVSU0lCTEVfRkxBR1MsIHZhbHVlPWZsYWdzCiAgICAvLyApCiAgICB1bmNvdmVyIDIKICAgIGJveF9yZXBsYWNlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjQ0NwogICAgLy8gdWludD1pcnJldmVyc2libGVfZmxhZ3MuYXNfdWludDY0KCksIHNpemU9VUludDY0KGNvbnN0LkJZVEVfU0laRSkKICAgIGRpZyA2CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXZtX2xpYnJhcnkucHk6MjAKICAgIC8vIHJldHVybiBvcC5leHRyYWN0KG9wLml0b2IodWludCksIHN0YXJ0LCBzaXplKQogICAgaXRvYgogICAgZXh0cmFjdCA3IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MTA2CiAgICAvLyBzdGFydF9pbmRleD1jb25zdC5JRFhfSVJSRVZFUlNJQkxFX0ZMQUdTLCB2YWx1ZT1mbGFncwogICAgaW50Y18zIC8vIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MTA1LTEwNwogICAgLy8gc2VsZi5hc3NldF9tZXRhZGF0YS5ib3goYXNhKS5yZXBsYWNlKAogICAgLy8gICAgIHN0YXJ0X2luZGV4PWNvbnN0LklEWF9JUlJFVkVSU0lCTEVfRkxBR1MsIHZhbHVlPWZsYWdzCiAgICAvLyApCiAgICBzd2FwCiAgICBib3hfcmVwbGFjZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTo0NTEKICAgIC8vIGFzYV9tZXRhZGF0YV9oYXNoID0gYXNzZXRfaWQubWV0YWRhdGFfaGFzaAogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldE1ldGFkYXRhSGFzaAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBidXJ5IDE4CiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjQ1MgogICAgLy8gaGFzX2FtID0gYXNhX21ldGFkYXRhX2hhc2ggIT0gQnl0ZXMoY29uc3QuQllURVMzMl9TSVpFICogYiJceDAwIikKICAgIHB1c2hieXRlcyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgICE9CiAgICBkdXAKICAgIGJ1cnkgMTMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6NDUzCiAgICAvLyBpZiBoYXNfYW06CiAgICBieiBhcmM4OV9jcmVhdGVfbWV0YWRhdGFfZWxzZV9ib2R5QDExCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5Ojk5LTEwMgogICAgLy8gcmV0dXJuIHNlbGYuYXNzZXRfbWV0YWRhdGEuYm94KGFzYSkuZXh0cmFjdCgKICAgIC8vICAgICBzdGFydF9pbmRleD1jb25zdC5JRFhfSVJSRVZFUlNJQkxFX0ZMQUdTLAogICAgLy8gICAgIGxlbmd0aD1jb25zdC5JUlJFVkVSU0lCTEVfRkxBR1NfU0laRSwKICAgIC8vICkKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weToxMDAKICAgIC8vIHN0YXJ0X2luZGV4PWNvbnN0LklEWF9JUlJFVkVSU0lCTEVfRkxBR1MsCiAgICBpbnRjXzMgLy8gMgogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weToxMDEKICAgIC8vIGxlbmd0aD1jb25zdC5JUlJFVkVSU0lCTEVfRkxBR1NfU0laRSwKICAgIGludGNfMCAvLyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5Ojk5LTEwMgogICAgLy8gcmV0dXJuIHNlbGYuYXNzZXRfbWV0YWRhdGEuYm94KGFzYSkuZXh0cmFjdCgKICAgIC8vICAgICBzdGFydF9pbmRleD1jb25zdC5JRFhfSVJSRVZFUlNJQkxFX0ZMQUdTLAogICAgLy8gICAgIGxlbmd0aD1jb25zdC5JUlJFVkVSU0lCTEVfRkxBR1NfU0laRSwKICAgIC8vICkKICAgIGJveF9leHRyYWN0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjExMgogICAgLy8gY29uc3QuQklUX1JJR0hUTU9TVF9JUlJfRkxBRyAtIGZsYWcsCiAgICBpbnRjXzEgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weToxMTAtMTEzCiAgICAvLyByZXR1cm4gb3AuZ2V0Yml0KAogICAgLy8gICAgIHNlbGYuX2dldF9pcnJldmVyc2libGVfZmxhZ3MoYXNhKSwKICAgIC8vICAgICBjb25zdC5CSVRfUklHSFRNT1NUX0lSUl9GTEFHIC0gZmxhZywKICAgIC8vICkKICAgIGdldGJpdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTo0NTQKICAgIC8vIGxvZ2dlZF9hc3NlcnQoc2VsZi5faXNfaW1tdXRhYmxlKGFzc2V0X2lkKSwgZXJyLlJFUVVJUkVTX0lNTVVUQUJMRSkKICAgIGJueiBhcmM4OV9jcmVhdGVfbWV0YWRhdGFfYWZ0ZXJfYXNzZXJ0QDEwCiAgICBwdXNoYnl0ZXMgIkVSUjpyZXF1aXJlc0ltbXV0YWJsZSIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpyZXF1aXJlc0ltbXV0YWJsZQoKYXJjODlfY3JlYXRlX21ldGFkYXRhX2FmdGVyX2Fzc2VydEAxMDoKICAgIGRpZyAxNQogICAgYnVyeSAxMwoKYXJjODlfY3JlYXRlX21ldGFkYXRhX2FmdGVyX2lmX2Vsc2VAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjEyOS0xMzEKICAgIC8vIHNlbGYuYXNzZXRfbWV0YWRhdGEuYm94KGFzYSkucmVwbGFjZSgKICAgIC8vICAgICBzdGFydF9pbmRleD1jb25zdC5JRFhfTUVUQURBVEFfSEFTSCwgdmFsdWU9bWV0YWRhdGFfaGFzaAogICAgLy8gKQogICAgZHVwbiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjEzMAogICAgLy8gc3RhcnRfaW5kZXg9Y29uc3QuSURYX01FVEFEQVRBX0hBU0gsIHZhbHVlPW1ldGFkYXRhX2hhc2gKICAgIHB1c2hpbnQgMwogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weToxMjktMTMxCiAgICAvLyBzZWxmLmFzc2V0X21ldGFkYXRhLmJveChhc2EpLnJlcGxhY2UoCiAgICAvLyAgICAgc3RhcnRfaW5kZXg9Y29uc3QuSURYX01FVEFEQVRBX0hBU0gsIHZhbHVlPW1ldGFkYXRhX2hhc2gKICAgIC8vICkKICAgIGRpZyAxNQogICAgYm94X3JlcGxhY2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6NDU5CiAgICAvLyBzZWxmLl9zZXRfbGFzdF9tb2RpZmllZF9yb3VuZChhc3NldF9pZCwgR2xvYmFsLnJvdW5kKQogICAgZ2xvYmFsIFJvdW5kCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjE0NAogICAgLy8gdmFsdWU9b3AuaXRvYihsYXN0X21vZGlmaWVkX3JvdW5kKSwKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MTQyLTE0NQogICAgLy8gc2VsZi5hc3NldF9tZXRhZGF0YS5ib3goYXNhKS5yZXBsYWNlKAogICAgLy8gICAgIHN0YXJ0X2luZGV4PWNvbnN0LklEWF9MQVNUX01PRElGSUVEX1JPVU5ELAogICAgLy8gICAgIHZhbHVlPW9wLml0b2IobGFzdF9tb2RpZmllZF9yb3VuZCksCiAgICAvLyApCiAgICBkaWcgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weToxNDMKICAgIC8vIHN0YXJ0X2luZGV4PWNvbnN0LklEWF9MQVNUX01PRElGSUVEX1JPVU5ELAogICAgcHVzaGludCAzNQogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weToxNDItMTQ1CiAgICAvLyBzZWxmLmFzc2V0X21ldGFkYXRhLmJveChhc2EpLnJlcGxhY2UoCiAgICAvLyAgICAgc3RhcnRfaW5kZXg9Y29uc3QuSURYX0xBU1RfTU9ESUZJRURfUk9VTkQsCiAgICAvLyAgICAgdmFsdWU9b3AuaXRvYihsYXN0X21vZGlmaWVkX3JvdW5kKSwKICAgIC8vICkKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6NDYwCiAgICAvLyBzZWxmLl9zZXRfZGVwcmVjYXRlZF9ieShhc3NldF9pZCwgVUludDY0KDApKQogICAgaW50Y18xIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MTU4CiAgICAvLyB2YWx1ZT1vcC5pdG9iKGRlcHJlY2F0ZWRfYnkpLAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weToxNTYtMTU5CiAgICAvLyBzZWxmLmFzc2V0X21ldGFkYXRhLmJveChhc2EpLnJlcGxhY2UoCiAgICAvLyAgICAgc3RhcnRfaW5kZXg9Y29uc3QuSURYX0RFUFJFQ0FURURfQlksCiAgICAvLyAgICAgdmFsdWU9b3AuaXRvYihkZXByZWNhdGVkX2J5KSwKICAgIC8vICkKICAgIGRpZyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjE1NwogICAgLy8gc3RhcnRfaW5kZXg9Y29uc3QuSURYX0RFUFJFQ0FURURfQlksCiAgICBwdXNoaW50IDQzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjE1Ni0xNTkKICAgIC8vIHNlbGYuYXNzZXRfbWV0YWRhdGEuYm94KGFzYSkucmVwbGFjZSgKICAgIC8vICAgICBzdGFydF9pbmRleD1jb25zdC5JRFhfREVQUkVDQVRFRF9CWSwKICAgIC8vICAgICB2YWx1ZT1vcC5pdG9iKGRlcHJlY2F0ZWRfYnkpLAogICAgLy8gKQogICAgdW5jb3ZlciAyCiAgICBib3hfcmVwbGFjZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weToxMDAKICAgIC8vIHN0YXJ0X2luZGV4PWNvbnN0LklEWF9JUlJFVkVSU0lCTEVfRkxBR1MsCiAgICBpbnRjXzMgLy8gMgogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weToxMDEKICAgIC8vIGxlbmd0aD1jb25zdC5JUlJFVkVSU0lCTEVfRkxBR1NfU0laRSwKICAgIGludGNfMCAvLyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5Ojk5LTEwMgogICAgLy8gcmV0dXJuIHNlbGYuYXNzZXRfbWV0YWRhdGEuYm94KGFzYSkuZXh0cmFjdCgKICAgIC8vICAgICBzdGFydF9pbmRleD1jb25zdC5JRFhfSVJSRVZFUlNJQkxFX0ZMQUdTLAogICAgLy8gICAgIGxlbmd0aD1jb25zdC5JUlJFVkVSU0lCTEVfRkxBR1NfU0laRSwKICAgIC8vICkKICAgIGJveF9leHRyYWN0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjExMgogICAgLy8gY29uc3QuQklUX1JJR0hUTU9TVF9JUlJfRkxBRyAtIGZsYWcsCiAgICBwdXNoaW50IDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MTEwLTExMwogICAgLy8gcmV0dXJuIG9wLmdldGJpdCgKICAgIC8vICAgICBzZWxmLl9nZXRfaXJyZXZlcnNpYmxlX2ZsYWdzKGFzYSksCiAgICAvLyAgICAgY29uc3QuQklUX1JJR0hUTU9TVF9JUlJfRkxBRyAtIGZsYWcsCiAgICAvLyApCiAgICBnZXRiaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6NDYyLTQ2MwogICAgLy8gIyBQb3N0Y29uZGl0aW9ucwogICAgLy8gaWYgc2VsZi5faXNfYXJjM19tZXRhZGF0YShhc3NldF9pZCk6CiAgICBieiBhcmM4OV9jcmVhdGVfbWV0YWRhdGFfYWZ0ZXJfaWZfZWxzZUAxNgogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV92YWxpZGF0aW9uLnB5OjIyCiAgICAvLyBhc2FfbmFtZSA9IGFzYS5uYW1lCiAgICBkaWcgNgogICAgZHVwCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0TmFtZQogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAzCiAgICBidXJ5IDE4CiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX3ZhbGlkYXRpb24ucHk6MjMKICAgIC8vIGFzYV91cmwgPSBhc2EudXJsCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VVJMCiAgICBzd2FwCiAgICBidXJ5IDE2CiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX3ZhbGlkYXRpb24ucHk6MjcKICAgIC8vIGlmIGFzYV9uYW1lID09IEFSQzNfTkFNRToKICAgIHB1c2hieXRlcyAweDYxNzI2MzMzCiAgICA9PQogICAgYnogYXJjODlfY3JlYXRlX21ldGFkYXRhX2FmdGVyX2lmX2Vsc2VANDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfdmFsaWRhdGlvbi5weToyOAogICAgLy8gcmV0dXJuIFRydWUKICAgIGludGNfMCAvLyAxCgphcmM4OV9jcmVhdGVfbWV0YWRhdGFfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMuYXNhX3ZhbGlkYXRpb24uQXNhVmFsaWRhdGlvbi5faXNfYXJjM19jb21wbGlhbnRANDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjQ2NAogICAgLy8gbG9nZ2VkX2Fzc2VydChzZWxmLl9pc19hcmMzX2NvbXBsaWFudChhc3NldF9pZCksIGVyci5BU0FfTk9UX0FSQzNfQ09NUExJQU5UKQogICAgYm56IGFyYzg5X2NyZWF0ZV9tZXRhZGF0YV9hZnRlcl9pZl9lbHNlQDE2CiAgICBwdXNoYnl0ZXMgIkVSUjphc2FOb3RBcmMzQ29tcGxpYW50IgogICAgbG9nCiAgICBlcnIgLy8gRVJSOmFzYU5vdEFyYzNDb21wbGlhbnQKCmFyYzg5X2NyZWF0ZV9tZXRhZGF0YV9hZnRlcl9pZl9lbHNlQDE2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTo5OS0xMDIKICAgIC8vIHJldHVybiBzZWxmLmFzc2V0X21ldGFkYXRhLmJveChhc2EpLmV4dHJhY3QoCiAgICAvLyAgICAgc3RhcnRfaW5kZXg9Y29uc3QuSURYX0lSUkVWRVJTSUJMRV9GTEFHUywKICAgIC8vICAgICBsZW5ndGg9Y29uc3QuSVJSRVZFUlNJQkxFX0ZMQUdTX1NJWkUsCiAgICAvLyApCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MTAwCiAgICAvLyBzdGFydF9pbmRleD1jb25zdC5JRFhfSVJSRVZFUlNJQkxFX0ZMQUdTLAogICAgaW50Y18zIC8vIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MTAxCiAgICAvLyBsZW5ndGg9Y29uc3QuSVJSRVZFUlNJQkxFX0ZMQUdTX1NJWkUsCiAgICBpbnRjXzAgLy8gMQogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTo5OS0xMDIKICAgIC8vIHJldHVybiBzZWxmLmFzc2V0X21ldGFkYXRhLmJveChhc2EpLmV4dHJhY3QoCiAgICAvLyAgICAgc3RhcnRfaW5kZXg9Y29uc3QuSURYX0lSUkVWRVJTSUJMRV9GTEFHUywKICAgIC8vICAgICBsZW5ndGg9Y29uc3QuSVJSRVZFUlNJQkxFX0ZMQUdTX1NJWkUsCiAgICAvLyApCiAgICBib3hfZXh0cmFjdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weToxMTIKICAgIC8vIGNvbnN0LkJJVF9SSUdIVE1PU1RfSVJSX0ZMQUcgLSBmbGFnLAogICAgcHVzaGludCA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjExMC0xMTMKICAgIC8vIHJldHVybiBvcC5nZXRiaXQoCiAgICAvLyAgICAgc2VsZi5fZ2V0X2lycmV2ZXJzaWJsZV9mbGFncyhhc2EpLAogICAgLy8gICAgIGNvbnN0LkJJVF9SSUdIVE1PU1RfSVJSX0ZMQUcgLSBmbGFnLAogICAgLy8gKQogICAgZ2V0Yml0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjQ2NQogICAgLy8gaWYgc2VsZi5faXNfYXJjNTRfYnVybmFibGUoYXNzZXRfaWQpOgogICAgYnogYXJjODlfY3JlYXRlX21ldGFkYXRhX2FmdGVyX2lmX2Vsc2VAMjAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6NDY3CiAgICAvLyBzZWxmLl9pc19hcmM1NF9jb21wbGlhbnQoYXNzZXRfaWQpLCBlcnIuQVNBX05PVF9BUkM1NF9DT01QTElBTlQKICAgIGRpZyA2CiAgICBjYWxsc3ViIF9pc19hcmM1NF9jb21wbGlhbnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6NDY2LTQ2OAogICAgLy8gbG9nZ2VkX2Fzc2VydCgKICAgIC8vICAgICBzZWxmLl9pc19hcmM1NF9jb21wbGlhbnQoYXNzZXRfaWQpLCBlcnIuQVNBX05PVF9BUkM1NF9DT01QTElBTlQKICAgIC8vICkKICAgIGJueiBhcmM4OV9jcmVhdGVfbWV0YWRhdGFfYWZ0ZXJfaWZfZWxzZUAyMAogICAgYnl0ZWMgMTQgLy8gIkVSUjphc2FOb3RBcmM1NENvbXBsaWFudCIKICAgIGxvZwogICAgZXJyIC8vIEVSUjphc2FOb3RBcmM1NENvbXBsaWFudAoKYXJjODlfY3JlYXRlX21ldGFkYXRhX2FmdGVyX2lmX2Vsc2VAMjA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5Ojk5LTEwMgogICAgLy8gcmV0dXJuIHNlbGYuYXNzZXRfbWV0YWRhdGEuYm94KGFzYSkuZXh0cmFjdCgKICAgIC8vICAgICBzdGFydF9pbmRleD1jb25zdC5JRFhfSVJSRVZFUlNJQkxFX0ZMQUdTLAogICAgLy8gICAgIGxlbmd0aD1jb25zdC5JUlJFVkVSU0lCTEVfRkxBR1NfU0laRSwKICAgIC8vICkKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weToxMDAKICAgIC8vIHN0YXJ0X2luZGV4PWNvbnN0LklEWF9JUlJFVkVSU0lCTEVfRkxBR1MsCiAgICBpbnRjXzMgLy8gMgogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weToxMDEKICAgIC8vIGxlbmd0aD1jb25zdC5JUlJFVkVSU0lCTEVfRkxBR1NfU0laRSwKICAgIGludGNfMCAvLyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5Ojk5LTEwMgogICAgLy8gcmV0dXJuIHNlbGYuYXNzZXRfbWV0YWRhdGEuYm94KGFzYSkuZXh0cmFjdCgKICAgIC8vICAgICBzdGFydF9pbmRleD1jb25zdC5JRFhfSVJSRVZFUlNJQkxFX0ZMQUdTLAogICAgLy8gICAgIGxlbmd0aD1jb25zdC5JUlJFVkVSU0lCTEVfRkxBR1NfU0laRSwKICAgIC8vICkKICAgIGJveF9leHRyYWN0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjExMgogICAgLy8gY29uc3QuQklUX1JJR0hUTU9TVF9JUlJfRkxBRyAtIGZsYWcsCiAgICBwdXNoaW50IDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MTEwLTExMwogICAgLy8gcmV0dXJuIG9wLmdldGJpdCgKICAgIC8vICAgICBzZWxmLl9nZXRfaXJyZXZlcnNpYmxlX2ZsYWdzKGFzYSksCiAgICAvLyAgICAgY29uc3QuQklUX1JJR0hUTU9TVF9JUlJfRkxBRyAtIGZsYWcsCiAgICAvLyApCiAgICBnZXRiaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6NDY5CiAgICAvLyBpZiBzZWxmLl9pc19hcmM4OV9uYXRpdmUoYXNzZXRfaWQpOgogICAgYnogYXJjODlfY3JlYXRlX21ldGFkYXRhX2FmdGVyX2lmX2Vsc2VAMjkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfdmFsaWRhdGlvbi5weTo0NS00NgogICAgLy8gIyBUaGlzIHZhbGlkYXRpb24gZG9lcyBub3QgZW5mb3JjZSBBUkMtOTAgY29tcGxpYW5jZSBmcmFnbWVudHMgKG9wdGlvbmFsKQogICAgLy8gYXJjODlfcGFydGlhbF91cmkgPSBhcmM5MF9ib3hfcXVlcnkoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25faWQuaWQsIEJ5dGVzKCkpCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uSUQKICAgIGJ5dGVjXzAgLy8gMHgKICAgIGNhbGxzdWIgYXJjOTBfYm94X3F1ZXJ5CiAgICBkdXAKICAgIGJ1cnkgMTgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfdmFsaWRhdGlvbi5weTo0NwogICAgLy8gYXNhX3VybCA9IGFzYS51cmwKICAgIGRpZyA3CiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0VVJMCiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgMTcKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfdmFsaWRhdGlvbi5weTo0OQogICAgLy8gaWYgYXNhX3VybC5sZW5ndGggPCBhcmM4OV9wYXJ0aWFsX3VyaS5sZW5ndGg6CiAgICBsZW4KICAgIGR1cAogICAgYnVyeSAxMQogICAgc3dhcAogICAgbGVuCiAgICBkdXAKICAgIGJ1cnkgMTAKICAgIDwKICAgIGJ6IGFyYzg5X2NyZWF0ZV9tZXRhZGF0YV9hZnRlcl9pZl9lbHNlQDM0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX3ZhbGlkYXRpb24ucHk6NTAKICAgIC8vIHJldHVybiBGYWxzZQogICAgaW50Y18xIC8vIDAKCmFyYzg5X2NyZWF0ZV9tZXRhZGF0YV9hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy5hc2FfdmFsaWRhdGlvbi5Bc2FWYWxpZGF0aW9uLl9pc19hcmM4OV9jb21wbGlhbnRAMzU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjQ3MC00NzIKICAgIC8vIGxvZ2dlZF9hc3NlcnQoCiAgICAvLyAgICAgc2VsZi5faXNfYXJjODlfY29tcGxpYW50KGFzc2V0X2lkKSwgZXJyLkFTQV9OT1RfQVJDODlfQ09NUExJQU5UCiAgICAvLyApCiAgICBibnogYXJjODlfY3JlYXRlX21ldGFkYXRhX2FmdGVyX2Fzc2VydEAyMwogICAgcHVzaGJ5dGVzICJFUlI6YXNhTm90QXJjODlDb21wbGlhbnQiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6YXNhTm90QXJjODlDb21wbGlhbnQKCmFyYzg5X2NyZWF0ZV9tZXRhZGF0YV9hZnRlcl9hc3NlcnRAMjM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjQ3MwogICAgLy8gaWYgaGFzX2FtIGFuZCBub3Qgc2VsZi5faXNfYXJjM19tZXRhZGF0YShhc3NldF9pZCk6CiAgICBkaWcgMTEKICAgIGJ6IGFyYzg5X2NyZWF0ZV9tZXRhZGF0YV9hZnRlcl9pZl9lbHNlQDI5CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5Ojk5LTEwMgogICAgLy8gcmV0dXJuIHNlbGYuYXNzZXRfbWV0YWRhdGEuYm94KGFzYSkuZXh0cmFjdCgKICAgIC8vICAgICBzdGFydF9pbmRleD1jb25zdC5JRFhfSVJSRVZFUlNJQkxFX0ZMQUdTLAogICAgLy8gICAgIGxlbmd0aD1jb25zdC5JUlJFVkVSU0lCTEVfRkxBR1NfU0laRSwKICAgIC8vICkKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weToxMDAKICAgIC8vIHN0YXJ0X2luZGV4PWNvbnN0LklEWF9JUlJFVkVSU0lCTEVfRkxBR1MsCiAgICBpbnRjXzMgLy8gMgogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weToxMDEKICAgIC8vIGxlbmd0aD1jb25zdC5JUlJFVkVSU0lCTEVfRkxBR1NfU0laRSwKICAgIGludGNfMCAvLyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5Ojk5LTEwMgogICAgLy8gcmV0dXJuIHNlbGYuYXNzZXRfbWV0YWRhdGEuYm94KGFzYSkuZXh0cmFjdCgKICAgIC8vICAgICBzdGFydF9pbmRleD1jb25zdC5JRFhfSVJSRVZFUlNJQkxFX0ZMQUdTLAogICAgLy8gICAgIGxlbmd0aD1jb25zdC5JUlJFVkVSU0lCTEVfRkxBR1NfU0laRSwKICAgIC8vICkKICAgIGJveF9leHRyYWN0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjExMgogICAgLy8gY29uc3QuQklUX1JJR0hUTU9TVF9JUlJfRkxBRyAtIGZsYWcsCiAgICBwdXNoaW50IDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MTEwLTExMwogICAgLy8gcmV0dXJuIG9wLmdldGJpdCgKICAgIC8vICAgICBzZWxmLl9nZXRfaXJyZXZlcnNpYmxlX2ZsYWdzKGFzYSksCiAgICAvLyAgICAgY29uc3QuQklUX1JJR0hUTU9TVF9JUlJfRkxBRyAtIGZsYWcsCiAgICAvLyApCiAgICBnZXRiaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6NDczCiAgICAvLyBpZiBoYXNfYW0gYW5kIG5vdCBzZWxmLl9pc19hcmMzX21ldGFkYXRhKGFzc2V0X2lkKToKICAgIGJueiBhcmM4OV9jcmVhdGVfbWV0YWRhdGFfYWZ0ZXJfaWZfZWxzZUAyOQogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTo0NzUKICAgIC8vIGFzYV9tZXRhZGF0YV9oYXNoID09IHNlbGYuX2NvbXB1dGVfbWV0YWRhdGFfaGFzaChhc3NldF9pZCksCiAgICBkaWcgNgogICAgY2FsbHN1YiBfY29tcHV0ZV9tZXRhZGF0YV9oYXNoCiAgICBkaWcgMTYKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjQ3NC00NzcKICAgIC8vIGxvZ2dlZF9hc3NlcnQoCiAgICAvLyAgICAgYXNhX21ldGFkYXRhX2hhc2ggPT0gc2VsZi5fY29tcHV0ZV9tZXRhZGF0YV9oYXNoKGFzc2V0X2lkKSwKICAgIC8vICAgICBlcnIuQVNBX01FVEFEQVRBX0hBU0hfTUlTTUFUQ0gsCiAgICAvLyApCiAgICBibnogYXJjODlfY3JlYXRlX21ldGFkYXRhX2FmdGVyX2lmX2Vsc2VAMjkKICAgIHB1c2hieXRlcyAiRVJSOmFzYU1ldGFkYXRhSGFzaE1pc21hdGNoIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOmFzYU1ldGFkYXRhSGFzaE1pc21hdGNoCgphcmM4OV9jcmVhdGVfbWV0YWRhdGFfYWZ0ZXJfaWZfZWxzZUAyOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6NDc5CiAgICAvLyBzZWxmLl9lbWl0X3VwZGF0ZWRfZXZlbnQoYXNzZXRfaWQsIG1ldGFkYXRhX2hhc2gpCiAgICBkaWcgNgogICAgZGlnIDEzCiAgICBjYWxsc3ViIF9lbWl0X3VwZGF0ZWRfZXZlbnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6NDgxCiAgICAvLyBtYnJfZGVsdGFfYW1vdW50ID0gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcy5taW5fYmFsYW5jZSAtIG1icl9pCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RNaW5CYWxhbmNlCiAgICBhc3NlcnQgLy8gYWNjb3VudCBmdW5kZWQKICAgIGRpZyAxMAogICAgLQogICAgZHVwCiAgICBidXJ5IDEyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjQ4MwogICAgLy8gbWJyX2RlbHRhX3BheW1lbnQuYW1vdW50ID49IG1icl9kZWx0YV9hbW91bnQsCiAgICBkaWcgMwogICAgZ3R4bnMgQW1vdW50CiAgICA8PQogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTo0ODItNDg1CiAgICAvLyBsb2dnZWRfYXNzZXJ0KAogICAgLy8gICAgIG1icl9kZWx0YV9wYXltZW50LmFtb3VudCA+PSBtYnJfZGVsdGFfYW1vdW50LAogICAgLy8gICAgIGVyci5NQlJfREVMVEFfQU1PVU5UX0lOVkFMSUQsCiAgICAvLyApCiAgICBibnogYXJjODlfY3JlYXRlX21ldGFkYXRhX2FmdGVyX2Fzc2VydEAzMQogICAgYnl0ZWMgMTUgLy8gIkVSUjptYnJEZWx0YUFtb3VudEludmFsaWQiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6bWJyRGVsdGFBbW91bnRJbnZhbGlkCgphcmM4OV9jcmVhdGVfbWV0YWRhdGFfYWZ0ZXJfYXNzZXJ0QDMxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTo0ODctNDg5CiAgICAvLyByZXR1cm4gYWJpLk1ickRlbHRhKAogICAgLy8gICAgIHNpZ249YXJjNC5VSW50OChlbnVtcy5NQlJfREVMVEFfUE9TKSwgYW1vdW50PW1icl9kZWx0YV9hbW91bnQKICAgIC8vICkKICAgIGRpZyAxMAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTozOTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgYnl0ZWMgMTYgLy8gMHgxNTFmN2M3NTAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKYXJjODlfY3JlYXRlX21ldGFkYXRhX2FmdGVyX2lmX2Vsc2VAMzQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXZtX2xpYnJhcnkucHk6NDkKICAgIC8vIGFzc2VydCBwcmVmaXgubGVuZ3RoIDw9IHMubGVuZ3RoCiAgICBkaWcgNwogICAgZHVwCiAgICBkaWcgMTAKICAgIGR1cAogICAgY292ZXIgMwogICAgPD0KICAgIGFzc2VydAogICAgLy8gc21hcnRfY29udHJhY3RzL2F2bV9saWJyYXJ5LnB5OjUwCiAgICAvLyByZXR1cm4gc1s6IHByZWZpeC5sZW5ndGhdID09IHByZWZpeAogICAgZHVwCiAgICBkaWcgMgogICAgPj0KICAgIHN3YXAKICAgIGNvdmVyIDIKICAgIHNlbGVjdAogICAgZGlnIDE0CiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBkaWcgMTcKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjQ3MQogICAgLy8gc2VsZi5faXNfYXJjODlfY29tcGxpYW50KGFzc2V0X2lkKSwgZXJyLkFTQV9OT1RfQVJDODlfQ09NUExJQU5UCiAgICBiIGFyYzg5X2NyZWF0ZV9tZXRhZGF0YV9hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy5hc2FfdmFsaWRhdGlvbi5Bc2FWYWxpZGF0aW9uLl9pc19hcmM4OV9jb21wbGlhbnRAMzUKCmFyYzg5X2NyZWF0ZV9tZXRhZGF0YV9hZnRlcl9pZl9lbHNlQDQwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV92YWxpZGF0aW9uLnB5OjMwCiAgICAvLyBpZiBhc2FfbmFtZS5sZW5ndGggPj0gYXJjM19uYW1lX3N1ZmZpeC5sZW5ndGg6CiAgICBkaWcgMTQKICAgIGxlbgogICAgcHVzaGludCA1CiAgICA+PQogICAgYnogYXJjODlfY3JlYXRlX21ldGFkYXRhX2FmdGVyX2lmX2Vsc2VANDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfdmFsaWRhdGlvbi5weTozMQogICAgLy8gaWYgZW5kc3dpdGgoYXNhX25hbWUsIGFyYzNfbmFtZV9zdWZmaXgpOgogICAgZGlnIDE0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX3ZhbGlkYXRpb24ucHk6MjQKICAgIC8vIGFyYzNfbmFtZV9zdWZmaXggPSBCeXRlcyhBUkMzX05BTUVfU1VGRklYKQogICAgcHVzaGJ5dGVzIDB4NDA2MTcyNjMzMwogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV92YWxpZGF0aW9uLnB5OjMxCiAgICAvLyBpZiBlbmRzd2l0aChhc2FfbmFtZSwgYXJjM19uYW1lX3N1ZmZpeCk6CiAgICBjYWxsc3ViIGVuZHN3aXRoCiAgICBieiBhcmM4OV9jcmVhdGVfbWV0YWRhdGFfYWZ0ZXJfaWZfZWxzZUA0MwogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV92YWxpZGF0aW9uLnB5OjMyCiAgICAvLyByZXR1cm4gVHJ1ZQogICAgaW50Y18wIC8vIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6NDY0CiAgICAvLyBsb2dnZWRfYXNzZXJ0KHNlbGYuX2lzX2FyYzNfY29tcGxpYW50KGFzc2V0X2lkKSwgZXJyLkFTQV9OT1RfQVJDM19DT01QTElBTlQpCiAgICBiIGFyYzg5X2NyZWF0ZV9tZXRhZGF0YV9hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy5hc2FfdmFsaWRhdGlvbi5Bc2FWYWxpZGF0aW9uLl9pc19hcmMzX2NvbXBsaWFudEA0NwoKYXJjODlfY3JlYXRlX21ldGFkYXRhX2FmdGVyX2lmX2Vsc2VANDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX3ZhbGlkYXRpb24ucHk6MzQKICAgIC8vIGlmIGFzYV91cmwubGVuZ3RoID49IGFyYzNfdXJsX3N1ZmZpeC5sZW5ndGg6CiAgICBkaWcgMTMKICAgIGxlbgogICAgcHVzaGludCA1CiAgICA+PQogICAgYnogYXJjODlfY3JlYXRlX21ldGFkYXRhX2FmdGVyX2lmX2Vsc2VANDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfdmFsaWRhdGlvbi5weTozNQogICAgLy8gaWYgZW5kc3dpdGgoYXNhX3VybCwgYXJjM191cmxfc3VmZml4KToKICAgIGRpZyAxMwogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV92YWxpZGF0aW9uLnB5OjI1CiAgICAvLyBhcmMzX3VybF9zdWZmaXggPSBCeXRlcyhBUkMzX1VSTF9TVUZGSVgpCiAgICBwdXNoYnl0ZXMgMHgyMzYxNzI2MzMzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX3ZhbGlkYXRpb24ucHk6MzUKICAgIC8vIGlmIGVuZHN3aXRoKGFzYV91cmwsIGFyYzNfdXJsX3N1ZmZpeCk6CiAgICBjYWxsc3ViIGVuZHN3aXRoCiAgICBieiBhcmM4OV9jcmVhdGVfbWV0YWRhdGFfYWZ0ZXJfaWZfZWxzZUA0NgogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV92YWxpZGF0aW9uLnB5OjM2CiAgICAvLyByZXR1cm4gVHJ1ZQogICAgaW50Y18wIC8vIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6NDY0CiAgICAvLyBsb2dnZWRfYXNzZXJ0KHNlbGYuX2lzX2FyYzNfY29tcGxpYW50KGFzc2V0X2lkKSwgZXJyLkFTQV9OT1RfQVJDM19DT01QTElBTlQpCiAgICBiIGFyYzg5X2NyZWF0ZV9tZXRhZGF0YV9hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy5hc2FfdmFsaWRhdGlvbi5Bc2FWYWxpZGF0aW9uLl9pc19hcmMzX2NvbXBsaWFudEA0NwoKYXJjODlfY3JlYXRlX21ldGFkYXRhX2FmdGVyX2lmX2Vsc2VANDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX3ZhbGlkYXRpb24ucHk6MzgKICAgIC8vIHJldHVybiBGYWxzZQogICAgaW50Y18xIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6NDY0CiAgICAvLyBsb2dnZWRfYXNzZXJ0KHNlbGYuX2lzX2FyYzNfY29tcGxpYW50KGFzc2V0X2lkKSwgZXJyLkFTQV9OT1RfQVJDM19DT01QTElBTlQpCiAgICBiIGFyYzg5X2NyZWF0ZV9tZXRhZGF0YV9hZnRlcl9pbmxpbmVkX3NtYXJ0X2NvbnRyYWN0cy5hc2FfdmFsaWRhdGlvbi5Bc2FWYWxpZGF0aW9uLl9pc19hcmMzX2NvbXBsaWFudEA0NwoKYXJjODlfY3JlYXRlX21ldGFkYXRhX2Vsc2VfYm9keUAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6NDU3CiAgICAvLyBtZXRhZGF0YV9oYXNoID0gc2VsZi5fY29tcHV0ZV9tZXRhZGF0YV9oYXNoKGFzc2V0X2lkKQogICAgZGlnIDYKICAgIGNhbGxzdWIgX2NvbXB1dGVfbWV0YWRhdGFfaGFzaAogICAgYnVyeSAxMwogICAgYiBhcmM4OV9jcmVhdGVfbWV0YWRhdGFfYWZ0ZXJfaWZfZWxzZUAxMgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc2FfbWV0YWRhdGFfcmVnaXN0cnkuY29udHJhY3QuQXNhTWV0YWRhdGFSZWdpc3RyeS5hcmM4OV9yZXBsYWNlX21ldGFkYXRhW3JvdXRpbmddKCkgLT4gdm9pZDoKYXJjODlfcmVwbGFjZV9tZXRhZGF0YToKICAgIGJ5dGVjXzAgLy8gIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTo0OTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDE2CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzMgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgY292ZXIgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTo1MTItNTEzCiAgICAvLyAjIFByZWNvbmRpdGlvbnMKICAgIC8vIHNlbGYuX2NoZWNrX3VwZGF0ZV9wcmVjb25kaXRpb25zKGFzc2V0X2lkLCBtZXRhZGF0YV9zaXplLmFzX3VpbnQ2NCgpKQogICAgYnRvaQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkdXAyCiAgICBjYWxsc3ViIF9jaGVja191cGRhdGVfcHJlY29uZGl0aW9ucwogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTo1MTUKICAgIC8vIG1ldGFkYXRhX3NpemUuYXNfdWludDY0KCkgPD0gc2VsZi5fZ2V0X21ldGFkYXRhX3NpemUoYXNzZXRfaWQpLAogICAgc3dhcAogICAgY2FsbHN1YiBfZ2V0X21ldGFkYXRhX3NpemUKICAgIDw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjUxNC01MTcKICAgIC8vIGxvZ2dlZF9hc3NlcnQoCiAgICAvLyAgICAgbWV0YWRhdGFfc2l6ZS5hc191aW50NjQoKSA8PSBzZWxmLl9nZXRfbWV0YWRhdGFfc2l6ZShhc3NldF9pZCksCiAgICAvLyAgICAgZXJyLkxBUkdFUl9NRVRBREFUQV9TSVpFLAogICAgLy8gKQogICAgYm56IGFyYzg5X3JlcGxhY2VfbWV0YWRhdGFfYWZ0ZXJfYXNzZXJ0QDMKICAgIHB1c2hieXRlcyAiRVJSOmxhcmdlck1ldGFkYXRhU2l6ZSIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpsYXJnZXJNZXRhZGF0YVNpemUKCmFyYzg5X3JlcGxhY2VfbWV0YWRhdGFfYWZ0ZXJfYXNzZXJ0QDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjUxOS01MjAKICAgIC8vICMgVXBkYXRlIE1ldGFkYXRhIEJvZHkKICAgIC8vIG1icl9pID0gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcy5taW5fYmFsYW5jZQogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0TWluQmFsYW5jZQogICAgc3dhcAogICAgYnVyeSA1CiAgICBhc3NlcnQgLy8gYWNjb3VudCBmdW5kZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6NTIxCiAgICAvLyBzZWxmLl9zZXRfbWV0YWRhdGFfcGF5bG9hZChhc3NldF9pZCwgbWV0YWRhdGFfc2l6ZS5hc191aW50NjQoKSwgcGF5bG9hZCkKICAgIGRpZyAyCiAgICBkdXAKICAgIGRpZyAyCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGRpZyA1CiAgICBjYWxsc3ViIF9zZXRfbWV0YWRhdGFfcGF5bG9hZAogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTo1MjMtNTI0CiAgICAvLyAjIFVwZGF0ZSBNZXRhZGF0YSBIZWFkZXIKICAgIC8vIHNlbGYuX3VwZGF0ZV9oZWFkZXJfZXhjbHVkaW5nX2ZsYWdzX2FuZF9lbWl0KGFzc2V0X2lkKQogICAgZHVwCiAgICBjYWxsc3ViIF91cGRhdGVfaGVhZGVyX2V4Y2x1ZGluZ19mbGFnc19hbmRfZW1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTo1MjgKICAgIC8vIHNlbGYuX2dldF9tZXRhZGF0YV9zaXplKGFzc2V0X2lkKSA9PSBtZXRhZGF0YV9zaXplLmFzX3VpbnQ2NCgpLAogICAgY2FsbHN1YiBfZ2V0X21ldGFkYXRhX3NpemUKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjUyNi01MzAKICAgIC8vICMgUG9zdGNvbmRpdGlvbnMKICAgIC8vIGxvZ2dlZF9hc3NlcnQoCiAgICAvLyAgICAgc2VsZi5fZ2V0X21ldGFkYXRhX3NpemUoYXNzZXRfaWQpID09IG1ldGFkYXRhX3NpemUuYXNfdWludDY0KCksCiAgICAvLyAgICAgZXJyLk1FVEFEQVRBX1NJWkVfTUlTTUFUQ0gsCiAgICAvLyApCiAgICBibnogYXJjODlfcmVwbGFjZV9tZXRhZGF0YV9hZnRlcl9hc3NlcnRANQogICAgYnl0ZWMgNiAvLyAiRVJSOm1ldGFkYXRhU2l6ZU1pc21hdGNoIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOm1ldGFkYXRhU2l6ZU1pc21hdGNoCgphcmM4OV9yZXBsYWNlX21ldGFkYXRhX2FmdGVyX2Fzc2VydEA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTo1MzIKICAgIC8vIG1icl9kZWx0YV9hbW91bnQgPSBtYnJfaSAtIEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MubWluX2JhbGFuY2UKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdE1pbkJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IGZ1bmRlZAogICAgZGlnIDQKICAgIHN3YXAKICAgIC0KICAgIGR1cAogICAgYnVyeSA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjUzMwogICAgLy8gaWYgbWJyX2RlbHRhX2Ftb3VudCA9PSBVSW50NjQoMCk6CiAgICBibnogYXJjODlfcmVwbGFjZV9tZXRhZGF0YV9lbHNlX2JvZHlANwogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTo1MzQKICAgIC8vIHNpZ24gPSBVSW50NjQoZW51bXMuTUJSX0RFTFRBX05VTEwpCiAgICBpbnRjXzEgLy8gMAoKYXJjODlfcmVwbGFjZV9tZXRhZGF0YV9hZnRlcl9pZl9lbHNlQDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjU0MgogICAgLy8gcmV0dXJuIGFiaS5NYnJEZWx0YShzaWduPWFyYzQuVUludDgoc2lnbiksIGFtb3VudD1tYnJfZGVsdGFfYW1vdW50KQogICAgaXRvYgogICAgZHVwCiAgICBiaXRsZW4KICAgIGludGNfMiAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBleHRyYWN0IDcgMQogICAgZGlnIDUKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTo0OTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKYXJjODlfcmVwbGFjZV9tZXRhZGF0YV9lbHNlX2JvZHlANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6NTM2CiAgICAvLyBzaWduID0gVUludDY0KGVudW1zLk1CUl9ERUxUQV9ORUcpCiAgICBwdXNoaW50IDI1NQogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTo1MzctNTQwCiAgICAvLyBpdHhuLlBheW1lbnQoCiAgICAvLyAgICAgcmVjZWl2ZXI9YXNzZXRfaWQubWFuYWdlciwKICAgIC8vICAgICBhbW91bnQ9bWJyX2RlbHRhX2Ftb3VudCwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6NTM4CiAgICAvLyByZWNlaXZlcj1hc3NldF9pZC5tYW5hZ2VyLAogICAgZGlnIDMKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRNYW5hZ2VyCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBkaWcgNgogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6NTM3CiAgICAvLyBpdHhuLlBheW1lbnQoCiAgICBpbnRjXzAgLy8gcGF5CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzEgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6NTM3LTU0MAogICAgLy8gaXR4bi5QYXltZW50KAogICAgLy8gICAgIHJlY2VpdmVyPWFzc2V0X2lkLm1hbmFnZXIsCiAgICAvLyAgICAgYW1vdW50PW1icl9kZWx0YV9hbW91bnQsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgYiBhcmM4OV9yZXBsYWNlX21ldGFkYXRhX2FmdGVyX2lmX2Vsc2VAOQoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc2FfbWV0YWRhdGFfcmVnaXN0cnkuY29udHJhY3QuQXNhTWV0YWRhdGFSZWdpc3RyeS5hcmM4OV9yZXBsYWNlX21ldGFkYXRhX2xhcmdlcltyb3V0aW5nXSgpIC0+IHZvaWQ6CmFyYzg5X3JlcGxhY2VfbWV0YWRhdGFfbGFyZ2VyOgogICAgYnl0ZWNfMCAvLyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjU0NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICBkdXAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50MTYKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMyAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICBjb3ZlciAyCiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIGR1cAogICAgY292ZXIgMwogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMCAvLyBwYXkKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBwYXkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6NTY3LTU2OAogICAgLy8gIyBQcmVjb25kaXRpb25zCiAgICAvLyBzZWxmLl9jaGVja191cGRhdGVfcHJlY29uZGl0aW9ucyhhc3NldF9pZCwgbWV0YWRhdGFfc2l6ZS5hc191aW50NjQoKSkKICAgIGJ0b2kKICAgIGR1cAogICAgY292ZXIgMgogICAgZHVwMgogICAgY2FsbHN1YiBfY2hlY2tfdXBkYXRlX3ByZWNvbmRpdGlvbnMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6NTcwCiAgICAvLyBtZXRhZGF0YV9zaXplLmFzX3VpbnQ2NCgpID4gc2VsZi5fZ2V0X21ldGFkYXRhX3NpemUoYXNzZXRfaWQpLAogICAgc3dhcAogICAgY2FsbHN1YiBfZ2V0X21ldGFkYXRhX3NpemUKICAgID4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6NTY5LTU3MgogICAgLy8gbG9nZ2VkX2Fzc2VydCgKICAgIC8vICAgICBtZXRhZGF0YV9zaXplLmFzX3VpbnQ2NCgpID4gc2VsZi5fZ2V0X21ldGFkYXRhX3NpemUoYXNzZXRfaWQpLAogICAgLy8gICAgIGVyci5TTUFMTEVSX01FVEFEQVRBX1NJWkUsCiAgICAvLyApCiAgICBibnogYXJjODlfcmVwbGFjZV9tZXRhZGF0YV9sYXJnZXJfYWZ0ZXJfYXNzZXJ0QDMKICAgIHB1c2hieXRlcyAiRVJSOnNtYWxsZXJNZXRhZGF0YVNpemUiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6c21hbGxlck1ldGFkYXRhU2l6ZQoKYXJjODlfcmVwbGFjZV9tZXRhZGF0YV9sYXJnZXJfYWZ0ZXJfYXNzZXJ0QDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjU3NAogICAgLy8gbWJyX2RlbHRhX3BheW1lbnQucmVjZWl2ZXIgPT0gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIGRpZyAxCiAgICBndHhucyBSZWNlaXZlcgogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjU3My01NzYKICAgIC8vIGxvZ2dlZF9hc3NlcnQoCiAgICAvLyAgICAgbWJyX2RlbHRhX3BheW1lbnQucmVjZWl2ZXIgPT0gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICBlcnIuTUJSX0RFTFRBX1JFQ0VJVkVSX0lOVkFMSUQsCiAgICAvLyApCiAgICBibnogYXJjODlfcmVwbGFjZV9tZXRhZGF0YV9sYXJnZXJfYWZ0ZXJfYXNzZXJ0QDUKICAgIGJ5dGVjIDEzIC8vICJFUlI6bWJyRGVsdGFSZWNlaXZlckludmFsaWQiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6bWJyRGVsdGFSZWNlaXZlckludmFsaWQKCmFyYzg5X3JlcGxhY2VfbWV0YWRhdGFfbGFyZ2VyX2FmdGVyX2Fzc2VydEA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTo1NzgtNTc5CiAgICAvLyAjIFVwZGF0ZSBNZXRhZGF0YSBCb2R5CiAgICAvLyBtYnJfaSA9IEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MubWluX2JhbGFuY2UKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdE1pbkJhbGFuY2UKICAgIHN3YXAKICAgIGJ1cnkgNgogICAgYXNzZXJ0IC8vIGFjY291bnQgZnVuZGVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjU4MAogICAgLy8gc2VsZi5fc2V0X21ldGFkYXRhX3BheWxvYWQoYXNzZXRfaWQsIG1ldGFkYXRhX3NpemUuYXNfdWludDY0KCksIHBheWxvYWQpCiAgICBkaWcgMwogICAgZHVwCiAgICBkaWcgMgogICAgZHVwCiAgICBjb3ZlciAzCiAgICBkaWcgNgogICAgY2FsbHN1YiBfc2V0X21ldGFkYXRhX3BheWxvYWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6NTgyLTU4MwogICAgLy8gIyBVcGRhdGUgTWV0YWRhdGEgSGVhZGVyCiAgICAvLyBzZWxmLl91cGRhdGVfaGVhZGVyX2V4Y2x1ZGluZ19mbGFnc19hbmRfZW1pdChhc3NldF9pZCkKICAgIGR1cAogICAgY2FsbHN1YiBfdXBkYXRlX2hlYWRlcl9leGNsdWRpbmdfZmxhZ3NfYW5kX2VtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6NTg3CiAgICAvLyBzZWxmLl9nZXRfbWV0YWRhdGFfc2l6ZShhc3NldF9pZCkgPT0gbWV0YWRhdGFfc2l6ZS5hc191aW50NjQoKSwKICAgIGNhbGxzdWIgX2dldF9tZXRhZGF0YV9zaXplCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTo1ODUtNTg5CiAgICAvLyAjIFBvc3Rjb25kaXRpb25zCiAgICAvLyBsb2dnZWRfYXNzZXJ0KAogICAgLy8gICAgIHNlbGYuX2dldF9tZXRhZGF0YV9zaXplKGFzc2V0X2lkKSA9PSBtZXRhZGF0YV9zaXplLmFzX3VpbnQ2NCgpLAogICAgLy8gICAgIGVyci5NRVRBREFUQV9TSVpFX01JU01BVENILAogICAgLy8gKQogICAgYm56IGFyYzg5X3JlcGxhY2VfbWV0YWRhdGFfbGFyZ2VyX2FmdGVyX2Fzc2VydEA3CiAgICBieXRlYyA2IC8vICJFUlI6bWV0YWRhdGFTaXplTWlzbWF0Y2giCiAgICBsb2cKICAgIGVyciAvLyBFUlI6bWV0YWRhdGFTaXplTWlzbWF0Y2gKCmFyYzg5X3JlcGxhY2VfbWV0YWRhdGFfbGFyZ2VyX2FmdGVyX2Fzc2VydEA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTo1OTEKICAgIC8vIG1icl9kZWx0YV9hbW91bnQgPSBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLm1pbl9iYWxhbmNlIC0gbWJyX2kKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdE1pbkJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IGZ1bmRlZAogICAgZGlnIDUKICAgIC0KICAgIGR1cAogICAgYnVyeSA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjU5MwogICAgLy8gbWJyX2RlbHRhX3BheW1lbnQuYW1vdW50ID49IG1icl9kZWx0YV9hbW91bnQsCiAgICBkaWcgMgogICAgZ3R4bnMgQW1vdW50CiAgICA8PQogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTo1OTItNTk1CiAgICAvLyBsb2dnZWRfYXNzZXJ0KAogICAgLy8gICAgIG1icl9kZWx0YV9wYXltZW50LmFtb3VudCA+PSBtYnJfZGVsdGFfYW1vdW50LAogICAgLy8gICAgIGVyci5NQlJfREVMVEFfQU1PVU5UX0lOVkFMSUQsCiAgICAvLyApCiAgICBibnogYXJjODlfcmVwbGFjZV9tZXRhZGF0YV9sYXJnZXJfYWZ0ZXJfYXNzZXJ0QDkKICAgIGJ5dGVjIDE1IC8vICJFUlI6bWJyRGVsdGFBbW91bnRJbnZhbGlkIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOm1ickRlbHRhQW1vdW50SW52YWxpZAoKYXJjODlfcmVwbGFjZV9tZXRhZGF0YV9sYXJnZXJfYWZ0ZXJfYXNzZXJ0QDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjU5Ny01OTkKICAgIC8vIHJldHVybiBhYmkuTWJyRGVsdGEoCiAgICAvLyAgICAgc2lnbj1hcmM0LlVJbnQ4KGVudW1zLk1CUl9ERUxUQV9QT1MpLCBhbW91bnQ9bWJyX2RlbHRhX2Ftb3VudAogICAgLy8gKQogICAgZGlnIDUKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6NTQ0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGJ5dGVjIDE2IC8vIDB4MTUxZjdjNzUwMQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMuYXNhX21ldGFkYXRhX3JlZ2lzdHJ5LmNvbnRyYWN0LkFzYU1ldGFkYXRhUmVnaXN0cnkuYXJjODlfcmVwbGFjZV9tZXRhZGF0YV9zbGljZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmFyYzg5X3JlcGxhY2VfbWV0YWRhdGFfc2xpY2U6CiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMCAvLyAiIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTo2MDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDE2CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzMgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICBjb3ZlciAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjYxOC02MTkKICAgIC8vICMgUHJlY29uZGl0aW9ucwogICAgLy8gc2VsZi5fY2hlY2tfdXBkYXRlX3ByZWNvbmRpdGlvbnMoYXNzZXRfaWQsIHNlbGYuX2dldF9tZXRhZGF0YV9zaXplKGFzc2V0X2lkKSkKICAgIGRpZyAyCiAgICBjYWxsc3ViIF9nZXRfbWV0YWRhdGFfc2l6ZQogICAgZGlnIDMKICAgIHN3YXAKICAgIGNhbGxzdWIgX2NoZWNrX3VwZGF0ZV9wcmVjb25kaXRpb25zCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjYyMQogICAgLy8gb2Zmc2V0LmFzX3VpbnQ2NCgpICsgcGF5bG9hZC5sZW5ndGggPD0gc2VsZi5fZ2V0X21ldGFkYXRhX3NpemUoYXNzZXRfaWQpLAogICAgc3dhcAogICAgYnRvaQogICAgZHVwCiAgICBjb3ZlciAzCiAgICBzd2FwCiAgICBsZW4KICAgIGR1cAogICAgY292ZXIgMwogICAgKwogICAgc3dhcAogICAgY2FsbHN1YiBfZ2V0X21ldGFkYXRhX3NpemUKICAgIDw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjYyMC02MjMKICAgIC8vIGxvZ2dlZF9hc3NlcnQoCiAgICAvLyAgICAgb2Zmc2V0LmFzX3VpbnQ2NCgpICsgcGF5bG9hZC5sZW5ndGggPD0gc2VsZi5fZ2V0X21ldGFkYXRhX3NpemUoYXNzZXRfaWQpLAogICAgLy8gICAgIGVyci5FWENFRURTX01FVEFEQVRBX1NJWkUsCiAgICAvLyApCiAgICBibnogYXJjODlfcmVwbGFjZV9tZXRhZGF0YV9zbGljZV9hZnRlcl9hc3NlcnRAMwogICAgYnl0ZWMgMTcgLy8gIkVSUjpleGNlZWRzTWV0YWRhdGFTaXplIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOmV4Y2VlZHNNZXRhZGF0YVNpemUKCmFyYzg5X3JlcGxhY2VfbWV0YWRhdGFfc2xpY2VfYWZ0ZXJfYXNzZXJ0QDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjI3MQogICAgLy8gcmV0dXJuIHNlbGYuYXNzZXRfbWV0YWRhdGEuYm94KGFzYSkuZXh0cmFjdCgKICAgIGRpZyAzCiAgICBpdG9iCiAgICBkdXAKICAgIGJ1cnkgNwogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weToyNzIKICAgIC8vIHN0YXJ0X2luZGV4PWNvbnN0LklEWF9NRVRBREFUQSArIG9mZnNldCwgbGVuZ3RoPXNpemUKICAgIHB1c2hpbnQgNTEKICAgIGRpZyAzCiAgICArCiAgICBkdXAKICAgIGJ1cnkgNwogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weToyNzEtMjczCiAgICAvLyByZXR1cm4gc2VsZi5hc3NldF9tZXRhZGF0YS5ib3goYXNhKS5leHRyYWN0KAogICAgLy8gICAgIHN0YXJ0X2luZGV4PWNvbnN0LklEWF9NRVRBREFUQSArIG9mZnNldCwgbGVuZ3RoPXNpemUKICAgIC8vICkKICAgIGRpZyAyCiAgICBib3hfZXh0cmFjdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTo2MjcKICAgIC8vIGlmIHBheWxvYWQgIT0gZXhpc3Rpbmdfc2xpY2U6CiAgICBkaWcgMwogICAgIT0KICAgIGJ6IGFyYzg5X3JlcGxhY2VfbWV0YWRhdGFfc2xpY2VfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjYyOC02MzIKICAgIC8vICMgVXBkYXRlIE1ldGFkYXRhIEJvZHkKICAgIC8vIHNlbGYuYXNzZXRfbWV0YWRhdGEuYm94KGFzc2V0X2lkKS5yZXBsYWNlKAogICAgLy8gICAgIHN0YXJ0X2luZGV4PWNvbnN0LklEWF9NRVRBREFUQSArIG9mZnNldC5hc191aW50NjQoKSwKICAgIC8vICAgICB2YWx1ZT1wYXlsb2FkLAogICAgLy8gKQogICAgZGlnIDUKICAgIGRpZyA1CiAgICBkaWcgNAogICAgYm94X3JlcGxhY2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6NjM0LTYzNQogICAgLy8gIyBVcGRhdGUgTWV0YWRhdGEgSGVhZGVyCiAgICAvLyBzZWxmLl91cGRhdGVfaGVhZGVyX2V4Y2x1ZGluZ19mbGFnc19hbmRfZW1pdChhc3NldF9pZCkKICAgIGRpZyAzCiAgICBjYWxsc3ViIF91cGRhdGVfaGVhZGVyX2V4Y2x1ZGluZ19mbGFnc19hbmRfZW1pdAoKYXJjODlfcmVwbGFjZV9tZXRhZGF0YV9zbGljZV9hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjYwMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzLmFzYV9tZXRhZGF0YV9yZWdpc3RyeS5jb250cmFjdC5Bc2FNZXRhZGF0YVJlZ2lzdHJ5LmFyYzg5X21pZ3JhdGVfbWV0YWRhdGFbcm91dGluZ10oKSAtPiB2b2lkOgphcmM4OV9taWdyYXRlX21ldGFkYXRhOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTo2MzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTo2NTItNjUzCiAgICAvLyAjIFByZWNvbmRpdGlvbnMKICAgIC8vIHNlbGYuX2NoZWNrX3NldF9mbGFnX3ByZWNvbmRpdGlvbnMoYXNzZXRfaWQpCiAgICBjYWxsc3ViIF9jaGVja19zZXRfZmxhZ19wcmVjb25kaXRpb25zCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjY1NQogICAgLy8gbmV3X3JlZ2lzdHJ5X2lkICE9IEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2lkLmlkLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbklECiAgICAhPQogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTo2NTQtNjU3CiAgICAvLyBsb2dnZWRfYXNzZXJ0KAogICAgLy8gICAgIG5ld19yZWdpc3RyeV9pZCAhPSBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwKICAgIC8vICAgICBlcnIuTkVXX1JFR0lTVFJZX0lEX0lOVkFMSUQsCiAgICAvLyApCiAgICBibnogYXJjODlfbWlncmF0ZV9tZXRhZGF0YV9hZnRlcl9hc3NlcnRAMwogICAgcHVzaGJ5dGVzICJFUlI6bmV3UmVnaXN0cnlJZEludmFsaWQiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6bmV3UmVnaXN0cnlJZEludmFsaWQKCmFyYzg5X21pZ3JhdGVfbWV0YWRhdGFfYWZ0ZXJfYXNzZXJ0QDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjE1NgogICAgLy8gc2VsZi5hc3NldF9tZXRhZGF0YS5ib3goYXNhKS5yZXBsYWNlKAogICAgZGlnIDEKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MTU4CiAgICAvLyB2YWx1ZT1vcC5pdG9iKGRlcHJlY2F0ZWRfYnkpLAogICAgZGlnIDEKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MTU2LTE1OQogICAgLy8gc2VsZi5hc3NldF9tZXRhZGF0YS5ib3goYXNhKS5yZXBsYWNlKAogICAgLy8gICAgIHN0YXJ0X2luZGV4PWNvbnN0LklEWF9ERVBSRUNBVEVEX0JZLAogICAgLy8gICAgIHZhbHVlPW9wLml0b2IoZGVwcmVjYXRlZF9ieSksCiAgICAvLyApCiAgICBkaWcgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weToxNTcKICAgIC8vIHN0YXJ0X2luZGV4PWNvbnN0LklEWF9ERVBSRUNBVEVEX0JZLAogICAgcHVzaGludCA0MwogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weToxNTYtMTU5CiAgICAvLyBzZWxmLmFzc2V0X21ldGFkYXRhLmJveChhc2EpLnJlcGxhY2UoCiAgICAvLyAgICAgc3RhcnRfaW5kZXg9Y29uc3QuSURYX0RFUFJFQ0FURURfQlksCiAgICAvLyAgICAgdmFsdWU9b3AuaXRvYihkZXByZWNhdGVkX2J5KSwKICAgIC8vICkKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6NjY1CiAgICAvLyByb3VuZD1HbG9iYWwucm91bmQsCiAgICBnbG9iYWwgUm91bmQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6NjY2CiAgICAvLyB0aW1lc3RhbXA9R2xvYmFsLmxhdGVzdF90aW1lc3RhbXAsCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjE0OS0xNTIKICAgIC8vIHNlbGYuYXNzZXRfbWV0YWRhdGEuYm94KGFzYSkuZXh0cmFjdCgKICAgIC8vICAgICBzdGFydF9pbmRleD1jb25zdC5JRFhfREVQUkVDQVRFRF9CWSwKICAgIC8vICAgICBsZW5ndGg9Y29uc3QuREVQUkVDQVRFRF9CWV9TSVpFLAogICAgLy8gKQogICAgZGlnIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MTUwCiAgICAvLyBzdGFydF9pbmRleD1jb25zdC5JRFhfREVQUkVDQVRFRF9CWSwKICAgIHB1c2hpbnQgNDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MTUxCiAgICAvLyBsZW5ndGg9Y29uc3QuREVQUkVDQVRFRF9CWV9TSVpFLAogICAgaW50Y18yIC8vIDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MTQ5LTE1MgogICAgLy8gc2VsZi5hc3NldF9tZXRhZGF0YS5ib3goYXNhKS5leHRyYWN0KAogICAgLy8gICAgIHN0YXJ0X2luZGV4PWNvbnN0LklEWF9ERVBSRUNBVEVEX0JZLAogICAgLy8gICAgIGxlbmd0aD1jb25zdC5ERVBSRUNBVEVEX0JZX1NJWkUsCiAgICAvLyApCiAgICBib3hfZXh0cmFjdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weToxNDgtMTUzCiAgICAvLyByZXR1cm4gb3AuYnRvaSgKICAgIC8vICAgICBzZWxmLmFzc2V0X21ldGFkYXRhLmJveChhc2EpLmV4dHJhY3QoCiAgICAvLyAgICAgICAgIHN0YXJ0X2luZGV4PWNvbnN0LklEWF9ERVBSRUNBVEVEX0JZLAogICAgLy8gICAgICAgICBsZW5ndGg9Y29uc3QuREVQUkVDQVRFRF9CWV9TSVpFLAogICAgLy8gICAgICkKICAgIC8vICkKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6NjYzLTY2OAogICAgLy8gYWJpLkFyYzg5TWV0YWRhdGFNaWdyYXRlZCgKICAgIC8vICAgICBhc3NldF9pZD1hc3NldF9pZC5pZCwKICAgIC8vICAgICByb3VuZD1HbG9iYWwucm91bmQsCiAgICAvLyAgICAgdGltZXN0YW1wPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgLy8gICAgIG5ld19yZWdpc3RyeV9pZD1zZWxmLl9nZXRfZGVwcmVjYXRlZF9ieShhc3NldF9pZCksCiAgICAvLyApCiAgICBpdG9iCiAgICB1bmNvdmVyIDMKICAgIHN3YXAKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTo2NjItNjY5CiAgICAvLyBhcmM0LmVtaXQoCiAgICAvLyAgICAgYWJpLkFyYzg5TWV0YWRhdGFNaWdyYXRlZCgKICAgIC8vICAgICAgICAgYXNzZXRfaWQ9YXNzZXRfaWQuaWQsCiAgICAvLyAgICAgICAgIHJvdW5kPUdsb2JhbC5yb3VuZCwKICAgIC8vICAgICAgICAgdGltZXN0YW1wPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgLy8gICAgICAgICBuZXdfcmVnaXN0cnlfaWQ9c2VsZi5fZ2V0X2RlcHJlY2F0ZWRfYnkoYXNzZXRfaWQpLAogICAgLy8gICAgICkKICAgIC8vICkKICAgIHB1c2hieXRlcyAweGM4NzAyM2JmIC8vIG1ldGhvZCAiQXJjODlNZXRhZGF0YU1pZ3JhdGVkKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTo2MzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc2FfbWV0YWRhdGFfcmVnaXN0cnkuY29udHJhY3QuQXNhTWV0YWRhdGFSZWdpc3RyeS5hcmM4OV9kZWxldGVfbWV0YWRhdGFbcm91dGluZ10oKSAtPiB2b2lkOgphcmM4OV9kZWxldGVfbWV0YWRhdGE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjY3MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6NDkKICAgIC8vIHJldHVybiBhc2EgaW4gc2VsZi5hc3NldF9tZXRhZGF0YQogICAgaXRvYgogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6Njg2LTY4NwogICAgLy8gIyBQcmVjb25kaXRpb25zCiAgICAvLyBsb2dnZWRfYXNzZXJ0KHNlbGYuX21ldGFkYXRhX2V4aXN0cyhhc3NldF9pZCksIGVyci5BU1NFVF9NRVRBREFUQV9OT1RfRVhJU1QpCiAgICBibnogYXJjODlfZGVsZXRlX21ldGFkYXRhX2FmdGVyX2Fzc2VydEAzCiAgICBieXRlY18zIC8vICJFUlI6YXNzZXRNZXRhZGF0YU5vdEV4aXN0IgogICAgbG9nCiAgICBlcnIgLy8gRVJSOmFzc2V0TWV0YWRhdGFOb3RFeGlzdAoKYXJjODlfZGVsZXRlX21ldGFkYXRhX2FmdGVyX2Fzc2VydEAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV92YWxpZGF0aW9uLnB5OjE1CiAgICAvLyBfY3JlYXRvciwgZXhpc3RzID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfY3JlYXRvcihhc2EpCiAgICBkaWcgMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldENyZWF0b3IKICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTo2ODgKICAgIC8vIGlmIHNlbGYuX2FzYV9leGlzdHMoYXNzZXRfaWQpOgogICAgYnogYXJjODlfZGVsZXRlX21ldGFkYXRhX2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTo5OS0xMDIKICAgIC8vIHJldHVybiBzZWxmLmFzc2V0X21ldGFkYXRhLmJveChhc2EpLmV4dHJhY3QoCiAgICAvLyAgICAgc3RhcnRfaW5kZXg9Y29uc3QuSURYX0lSUkVWRVJTSUJMRV9GTEFHUywKICAgIC8vICAgICBsZW5ndGg9Y29uc3QuSVJSRVZFUlNJQkxFX0ZMQUdTX1NJWkUsCiAgICAvLyApCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MTAwCiAgICAvLyBzdGFydF9pbmRleD1jb25zdC5JRFhfSVJSRVZFUlNJQkxFX0ZMQUdTLAogICAgaW50Y18zIC8vIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MTAxCiAgICAvLyBsZW5ndGg9Y29uc3QuSVJSRVZFUlNJQkxFX0ZMQUdTX1NJWkUsCiAgICBpbnRjXzAgLy8gMQogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTo5OS0xMDIKICAgIC8vIHJldHVybiBzZWxmLmFzc2V0X21ldGFkYXRhLmJveChhc2EpLmV4dHJhY3QoCiAgICAvLyAgICAgc3RhcnRfaW5kZXg9Y29uc3QuSURYX0lSUkVWRVJTSUJMRV9GTEFHUywKICAgIC8vICAgICBsZW5ndGg9Y29uc3QuSVJSRVZFUlNJQkxFX0ZMQUdTX1NJWkUsCiAgICAvLyApCiAgICBib3hfZXh0cmFjdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weToxMTIKICAgIC8vIGNvbnN0LkJJVF9SSUdIVE1PU1RfSVJSX0ZMQUcgLSBmbGFnLAogICAgaW50Y18xIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MTEwLTExMwogICAgLy8gcmV0dXJuIG9wLmdldGJpdCgKICAgIC8vICAgICBzZWxmLl9nZXRfaXJyZXZlcnNpYmxlX2ZsYWdzKGFzYSksCiAgICAvLyAgICAgY29uc3QuQklUX1JJR0hUTU9TVF9JUlJfRkxBRyAtIGZsYWcsCiAgICAvLyApCiAgICBnZXRiaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6Njg5CiAgICAvLyBsb2dnZWRfYXNzZXJ0KG5vdCBzZWxmLl9pc19pbW11dGFibGUoYXNzZXRfaWQpLCBlcnIuSU1NVVRBQkxFKQogICAgYnogYXJjODlfZGVsZXRlX21ldGFkYXRhX2FmdGVyX2Fzc2VydEA2CiAgICBieXRlYyA3IC8vICJFUlI6aW1tdXRhYmxlIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOmltbXV0YWJsZQoKYXJjODlfZGVsZXRlX21ldGFkYXRhX2FmdGVyX2Fzc2VydEA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTo2OTAKICAgIC8vIGxvZ2dlZF9hc3NlcnQoc2VsZi5faXNfYXNhX21hbmFnZXIoYXNzZXRfaWQpLCBlcnIuVU5BVVRIT1JJWkVEKQogICAgZGlnIDEKICAgIGNhbGxzdWIgX2lzX2FzYV9tYW5hZ2VyCiAgICBibnogYXJjODlfZGVsZXRlX21ldGFkYXRhX2FmdGVyX2lmX2Vsc2VAOQogICAgYnl0ZWMgNCAvLyAiRVJSOnVuYXV0aG9yaXplZCIKICAgIGxvZwogICAgZXJyIC8vIEVSUjp1bmF1dGhvcml6ZWQKCmFyYzg5X2RlbGV0ZV9tZXRhZGF0YV9hZnRlcl9pZl9lbHNlQDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjY5Mi02OTMKICAgIC8vICMgRGVsZXRlIE1ldGFkYXRhIGFuZCByZWZ1bmQgTUJSCiAgICAvLyBtYnJfaSA9IEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MubWluX2JhbGFuY2UKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdE1pbkJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IGZ1bmRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTo2OTQKICAgIC8vIGRlbCBzZWxmLmFzc2V0X21ldGFkYXRhW2Fzc2V0X2lkXQogICAgZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjY5NQogICAgLy8gbWJyX2RlbHRhX2Ftb3VudCA9IG1icl9pIC0gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcy5taW5fYmFsYW5jZQogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0TWluQmFsYW5jZQogICAgYXNzZXJ0IC8vIGFjY291bnQgZnVuZGVkCiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjY5NgogICAgLy8gaXR4bi5QYXltZW50KHJlY2VpdmVyPVR4bi5zZW5kZXIsIGFtb3VudD1tYnJfZGVsdGFfYW1vdW50KS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgdHhuIFNlbmRlcgogICAgZGlnIDEKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICBpbnRjXzAgLy8gcGF5CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzEgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjcwMgogICAgLy8gdGltZXN0YW1wPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTo3MDEKICAgIC8vIHJvdW5kPUdsb2JhbC5yb3VuZCwKICAgIGdsb2JhbCBSb3VuZAogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTo2OTktNzAzCiAgICAvLyBhYmkuQXJjODlNZXRhZGF0YURlbGV0ZWQoCiAgICAvLyAgICAgYXNzZXRfaWQ9YXNzZXRfaWQuaWQsCiAgICAvLyAgICAgcm91bmQ9R2xvYmFsLnJvdW5kLAogICAgLy8gICAgIHRpbWVzdGFtcD1HbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCwKICAgIC8vICkKICAgIGl0b2IKICAgIHVuY292ZXIgMwogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6Njk4LTcwNAogICAgLy8gYXJjNC5lbWl0KAogICAgLy8gICAgIGFiaS5BcmM4OU1ldGFkYXRhRGVsZXRlZCgKICAgIC8vICAgICAgICAgYXNzZXRfaWQ9YXNzZXRfaWQuaWQsCiAgICAvLyAgICAgICAgIHJvdW5kPUdsb2JhbC5yb3VuZCwKICAgIC8vICAgICAgICAgdGltZXN0YW1wPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgLy8gICAgICkKICAgIC8vICkKICAgIHB1c2hieXRlcyAweGJjM2YyMGQxIC8vIG1ldGhvZCAiQXJjODlNZXRhZGF0YURlbGV0ZWQodWludDY0LHVpbnQ2NCx1aW50NjQpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6NzA2LTcwOAogICAgLy8gcmV0dXJuIGFiaS5NYnJEZWx0YSgKICAgIC8vICAgICBzaWduPWFyYzQuVUludDgoZW51bXMuTUJSX0RFTFRBX05FRyksIGFtb3VudD1tYnJfZGVsdGFfYW1vdW50CiAgICAvLyApCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjY3MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBwdXNoYnl0ZXMgMHgxNTFmN2M3NWZmCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc2FfbWV0YWRhdGFfcmVnaXN0cnkuY29udHJhY3QuQXNhTWV0YWRhdGFSZWdpc3RyeS5hcmM4OV9leHRyYV9wYXlsb2FkW3JvdXRpbmddKCkgLT4gdm9pZDoKYXJjODlfZXh0cmFfcGF5bG9hZDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6NzEwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMyAvLyAyCiAgICArCiAgICBzd2FwCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTo3MjQtNzI1CiAgICAvLyAjIFByZWNvbmRpdGlvbnMKICAgIC8vIGxvZ2dlZF9hc3NlcnQoR2xvYmFsLmdyb3VwX3NpemUgPj0gMiwgZXJyLk5PX1BBWUxPQURfSEVBRF9DQUxMKQogICAgZ2xvYmFsIEdyb3VwU2l6ZQogICAgaW50Y18zIC8vIDIKICAgID49CiAgICBibnogYXJjODlfZXh0cmFfcGF5bG9hZF9hZnRlcl9hc3NlcnRAMwogICAgcHVzaGJ5dGVzICJFUlI6bm9QYXlsb2FkSGVhZENhbGwiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6bm9QYXlsb2FkSGVhZENhbGwKCmFyYzg5X2V4dHJhX3BheWxvYWRfYWZ0ZXJfYXNzZXJ0QDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX3ZhbGlkYXRpb24ucHk6MTUKICAgIC8vIF9jcmVhdG9yLCBleGlzdHMgPSBvcC5Bc3NldFBhcmFtc0dldC5hc3NldF9jcmVhdG9yKGFzYSkKICAgIGR1cAogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldENyZWF0b3IKICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTo3MjYKICAgIC8vIGxvZ2dlZF9hc3NlcnQoc2VsZi5fYXNhX2V4aXN0cyhhc3NldF9pZCksIGVyci5BU0FfTk9UX0VYSVNUKQogICAgYm56IGFyYzg5X2V4dHJhX3BheWxvYWRfYWZ0ZXJfYXNzZXJ0QDUKICAgIGJ5dGVjIDggLy8gIkVSUjphc2FOb3RFeGlzdCIKICAgIGxvZwogICAgZXJyIC8vIEVSUjphc2FOb3RFeGlzdAoKYXJjODlfZXh0cmFfcGF5bG9hZF9hZnRlcl9hc3NlcnRANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6NDkKICAgIC8vIHJldHVybiBhc2EgaW4gc2VsZi5hc3NldF9tZXRhZGF0YQogICAgZHVwCiAgICBpdG9iCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6NzI3CiAgICAvLyBsb2dnZWRfYXNzZXJ0KHNlbGYuX21ldGFkYXRhX2V4aXN0cyhhc3NldF9pZCksIGVyci5BU1NFVF9NRVRBREFUQV9OT1RfRVhJU1QpCiAgICBibnogYXJjODlfZXh0cmFfcGF5bG9hZF9hZnRlcl9hc3NlcnRANwogICAgYnl0ZWNfMyAvLyAiRVJSOmFzc2V0TWV0YWRhdGFOb3RFeGlzdCIKICAgIGxvZwogICAgZXJyIC8vIEVSUjphc3NldE1ldGFkYXRhTm90RXhpc3QKCmFyYzg5X2V4dHJhX3BheWxvYWRfYWZ0ZXJfYXNzZXJ0QDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjcyOAogICAgLy8gbG9nZ2VkX2Fzc2VydChzZWxmLl9pc19hc2FfbWFuYWdlcihhc3NldF9pZCksIGVyci5VTkFVVEhPUklaRUQpCiAgICBkdXAKICAgIGNhbGxzdWIgX2lzX2FzYV9tYW5hZ2VyCiAgICBibnogYXJjODlfZXh0cmFfcGF5bG9hZF9hZnRlcl9hc3NlcnRAOQogICAgYnl0ZWMgNCAvLyAiRVJSOnVuYXV0aG9yaXplZCIKICAgIGxvZwogICAgZXJyIC8vIEVSUjp1bmF1dGhvcml6ZWQKCmFyYzg5X2V4dHJhX3BheWxvYWRfYWZ0ZXJfYXNzZXJ0QDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjcxMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzLmFzYV9tZXRhZGF0YV9yZWdpc3RyeS5jb250cmFjdC5Bc2FNZXRhZGF0YVJlZ2lzdHJ5LmFyYzg5X3NldF9yZXZlcnNpYmxlX2ZsYWdbcm91dGluZ10oKSAtPiB2b2lkOgphcmM4OV9zZXRfcmV2ZXJzaWJsZV9mbGFnOgogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjXzAgLy8gIiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6NzMwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuYm9vbAogICAgaW50Y18xIC8vIDAKICAgIGdldGJpdAogICAgY292ZXIgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTo3NDYtNzQ3CiAgICAvLyAjIFByZWNvbmRpdGlvbnMKICAgIC8vIHNlbGYuX2NoZWNrX3NldF9mbGFnX3ByZWNvbmRpdGlvbnMoYXNzZXRfaWQpCiAgICBzd2FwCiAgICBjYWxsc3ViIF9jaGVja19zZXRfZmxhZ19wcmVjb25kaXRpb25zCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5Ojc0OQogICAgLy8gZmxhZy5hc191aW50NjQoKSA8PSBmbGcuUkVWX0ZMR19SRVNFUlZFRF83LAogICAgYnRvaQogICAgZHVwCiAgICBwdXNoaW50IDcKICAgIDw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5Ojc0OC03NTEKICAgIC8vIGxvZ2dlZF9hc3NlcnQoCiAgICAvLyAgICAgZmxhZy5hc191aW50NjQoKSA8PSBmbGcuUkVWX0ZMR19SRVNFUlZFRF83LAogICAgLy8gICAgIGVyci5GTEFHX0lEWF9JTlZBTElELAogICAgLy8gKQogICAgYm56IGFyYzg5X3NldF9yZXZlcnNpYmxlX2ZsYWdfYWZ0ZXJfYXNzZXJ0QDMKICAgIGJ5dGVjIDE4IC8vICJFUlI6ZmxhZ0lkeEludmFsaWQiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6ZmxhZ0lkeEludmFsaWQKCmFyYzg5X3NldF9yZXZlcnNpYmxlX2ZsYWdfYWZ0ZXJfYXNzZXJ0QDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5Ojc1CiAgICAvLyByZXR1cm4gc2VsZi5hc3NldF9tZXRhZGF0YS5ib3goYXNhKS5leHRyYWN0KAogICAgZGlnIDIKICAgIGl0b2IKICAgIGR1cAogICAgYnVyeSA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5Ojc2CiAgICAvLyBzdGFydF9pbmRleD1jb25zdC5JRFhfUkVWRVJTSUJMRV9GTEFHUywgbGVuZ3RoPWNvbnN0LlJFVkVSU0lCTEVfRkxBR1NfU0laRQogICAgaW50Y18wIC8vIDEKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTo3NS03NwogICAgLy8gcmV0dXJuIHNlbGYuYXNzZXRfbWV0YWRhdGEuYm94KGFzYSkuZXh0cmFjdCgKICAgIC8vICAgICBzdGFydF9pbmRleD1jb25zdC5JRFhfUkVWRVJTSUJMRV9GTEFHUywgbGVuZ3RoPWNvbnN0LlJFVkVSU0lCTEVfRkxBR1NfU0laRQogICAgLy8gKQogICAgYm94X2V4dHJhY3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6ODIKICAgIC8vIGNvbnN0LkJJVF9SSUdIVE1PU1RfUkVWX0ZMQUcgLSBmbGFnLAogICAgcHVzaGludCA3CiAgICBkaWcgMgogICAgLQogICAgZHVwCiAgICBidXJ5IDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6ODAtODMKICAgIC8vIHJldHVybiBvcC5nZXRiaXQoCiAgICAvLyAgICAgc2VsZi5fZ2V0X3JldmVyc2libGVfZmxhZ3MoYXNhKSwKICAgIC8vICAgICBjb25zdC5CSVRfUklHSFRNT1NUX1JFVl9GTEFHIC0gZmxhZywKICAgIC8vICkKICAgIGdldGJpdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTo3NTUKICAgIC8vIGlmIHZhbHVlICE9IGV4aXN0aW5nX3ZhbHVlOgogICAgZGlnIDIKICAgICE9CiAgICBieiBhcmM4OV9zZXRfcmV2ZXJzaWJsZV9mbGFnX2FmdGVyX2lmX2Vsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTo3NS03NwogICAgLy8gcmV0dXJuIHNlbGYuYXNzZXRfbWV0YWRhdGEuYm94KGFzYSkuZXh0cmFjdCgKICAgIC8vICAgICBzdGFydF9pbmRleD1jb25zdC5JRFhfUkVWRVJTSUJMRV9GTEFHUywgbGVuZ3RoPWNvbnN0LlJFVkVSU0lCTEVfRkxBR1NfU0laRQogICAgLy8gKQogICAgZGlnIDQKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTo3NgogICAgLy8gc3RhcnRfaW5kZXg9Y29uc3QuSURYX1JFVkVSU0lCTEVfRkxBR1MsIGxlbmd0aD1jb25zdC5SRVZFUlNJQkxFX0ZMQUdTX1NJWkUKICAgIGludGNfMCAvLyAxCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6NzUtNzcKICAgIC8vIHJldHVybiBzZWxmLmFzc2V0X21ldGFkYXRhLmJveChhc2EpLmV4dHJhY3QoCiAgICAvLyAgICAgc3RhcnRfaW5kZXg9Y29uc3QuSURYX1JFVkVSU0lCTEVfRkxBR1MsIGxlbmd0aD1jb25zdC5SRVZFUlNJQkxFX0ZMQUdTX1NJWkUKICAgIC8vICkKICAgIGJveF9leHRyYWN0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5Ojg4LTkwCiAgICAvLyB1cGRhdGVkX2ZsYWdzID0gb3Auc2V0Yml0X2J5dGVzKAogICAgLy8gICAgIHNlbGYuX2dldF9yZXZlcnNpYmxlX2ZsYWdzKGFzYSksIGNvbnN0LkJJVF9SSUdIVE1PU1RfUkVWX0ZMQUcgLSBmbGFnLCB2YWx1ZQogICAgLy8gKQogICAgZGlnIDUKICAgIGRpZyA0CiAgICBzZXRiaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6OTUKICAgIC8vIHN0YXJ0X2luZGV4PWNvbnN0LklEWF9SRVZFUlNJQkxFX0ZMQUdTLCB2YWx1ZT1mbGFncwogICAgaW50Y18wIC8vIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6OTQtOTYKICAgIC8vIHNlbGYuYXNzZXRfbWV0YWRhdGEuYm94KGFzYSkucmVwbGFjZSgKICAgIC8vICAgICBzdGFydF9pbmRleD1jb25zdC5JRFhfUkVWRVJTSUJMRV9GTEFHUywgdmFsdWU9ZmxhZ3MKICAgIC8vICkKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5Ojc1OS03NjAKICAgIC8vICMgVXBkYXRlIE1ldGFkYXRhIEhlYWRlcgogICAgLy8gc2VsZi5fdXBkYXRlX2hlYWRlcl9leGNsdWRpbmdfZmxhZ3NfYW5kX2VtaXQoYXNzZXRfaWQpCiAgICBkaWcgMgogICAgY2FsbHN1YiBfdXBkYXRlX2hlYWRlcl9leGNsdWRpbmdfZmxhZ3NfYW5kX2VtaXQKCmFyYzg5X3NldF9yZXZlcnNpYmxlX2ZsYWdfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTo3MzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc2FfbWV0YWRhdGFfcmVnaXN0cnkuY29udHJhY3QuQXNhTWV0YWRhdGFSZWdpc3RyeS5hcmM4OV9zZXRfaXJyZXZlcnNpYmxlX2ZsYWdbcm91dGluZ10oKSAtPiB2b2lkOgphcmM4OV9zZXRfaXJyZXZlcnNpYmxlX2ZsYWc6CiAgICBpbnRjXzEgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTo3NjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6Nzc2LTc3NwogICAgLy8gIyBQcmVjb25kaXRpb25zCiAgICAvLyBzZWxmLl9jaGVja19zZXRfZmxhZ19wcmVjb25kaXRpb25zKGFzc2V0X2lkKQogICAgc3dhcAogICAgY2FsbHN1YiBfY2hlY2tfc2V0X2ZsYWdfcHJlY29uZGl0aW9ucwogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTo3NzkKICAgIC8vIGZsZy5JUlJfRkxHX0FSQzU0IDw9IGZsYWcuYXNfdWludDY0KCkgPD0gZmxnLklSUl9GTEdfUkVTRVJWRURfNiwKICAgIGJ0b2kKICAgIGR1cAogICAgaW50Y18zIC8vIDIKICAgID49CiAgICBieiBhcmM4OV9zZXRfaXJyZXZlcnNpYmxlX2ZsYWdfYm9vbF9mYWxzZUA0CiAgICBkdXAKICAgIHB1c2hpbnQgNgogICAgPD0KICAgIGJ6IGFyYzg5X3NldF9pcnJldmVyc2libGVfZmxhZ19ib29sX2ZhbHNlQDQKICAgIGludGNfMCAvLyAxCgphcmM4OV9zZXRfaXJyZXZlcnNpYmxlX2ZsYWdfYm9vbF9tZXJnZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTo3NzgtNzgxCiAgICAvLyBsb2dnZWRfYXNzZXJ0KAogICAgLy8gICAgIGZsZy5JUlJfRkxHX0FSQzU0IDw9IGZsYWcuYXNfdWludDY0KCkgPD0gZmxnLklSUl9GTEdfUkVTRVJWRURfNiwKICAgIC8vICAgICBlcnIuRkxBR19JRFhfSU5WQUxJRCwKICAgIC8vICkKICAgIGJueiBhcmM4OV9zZXRfaXJyZXZlcnNpYmxlX2ZsYWdfYWZ0ZXJfYXNzZXJ0QDcKICAgIGJ5dGVjIDE4IC8vICJFUlI6ZmxhZ0lkeEludmFsaWQiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6ZmxhZ0lkeEludmFsaWQKCmFyYzg5X3NldF9pcnJldmVyc2libGVfZmxhZ19hZnRlcl9hc3NlcnRANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6OTkKICAgIC8vIHJldHVybiBzZWxmLmFzc2V0X21ldGFkYXRhLmJveChhc2EpLmV4dHJhY3QoCiAgICBkaWcgMQogICAgaXRvYgogICAgZHVwCiAgICBidXJ5IDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MTAwCiAgICAvLyBzdGFydF9pbmRleD1jb25zdC5JRFhfSVJSRVZFUlNJQkxFX0ZMQUdTLAogICAgaW50Y18zIC8vIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MTAxCiAgICAvLyBsZW5ndGg9Y29uc3QuSVJSRVZFUlNJQkxFX0ZMQUdTX1NJWkUsCiAgICBpbnRjXzAgLy8gMQogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTo5OS0xMDIKICAgIC8vIHJldHVybiBzZWxmLmFzc2V0X21ldGFkYXRhLmJveChhc2EpLmV4dHJhY3QoCiAgICAvLyAgICAgc3RhcnRfaW5kZXg9Y29uc3QuSURYX0lSUkVWRVJTSUJMRV9GTEFHUywKICAgIC8vICAgICBsZW5ndGg9Y29uc3QuSVJSRVZFUlNJQkxFX0ZMQUdTX1NJWkUsCiAgICAvLyApCiAgICBib3hfZXh0cmFjdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weToxMTIKICAgIC8vIGNvbnN0LkJJVF9SSUdIVE1PU1RfSVJSX0ZMQUcgLSBmbGFnLAogICAgcHVzaGludCA3CiAgICBkaWcgMgogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weToxMTAtMTEzCiAgICAvLyByZXR1cm4gb3AuZ2V0Yml0KAogICAgLy8gICAgIHNlbGYuX2dldF9pcnJldmVyc2libGVfZmxhZ3MoYXNhKSwKICAgIC8vICAgICBjb25zdC5CSVRfUklHSFRNT1NUX0lSUl9GTEFHIC0gZmxhZywKICAgIC8vICkKICAgIGdldGJpdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTo3ODUKICAgIC8vIGlmIG5vdCBhbHJlYWR5X3NldDoKICAgIGJueiBhcmM4OV9zZXRfaXJyZXZlcnNpYmxlX2ZsYWdfYWZ0ZXJfaWZfZWxzZUAxMwogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTo3ODYtNzg3CiAgICAvLyAjIFNldCBJcnJldmVyc2libGUgRmxhZwogICAgLy8gc2VsZi5fc2V0X2lycmV2ZXJzaWJsZV9mbGFnX3ZhbHVlKGFzc2V0X2lkLCBmbGFnLmFzX3VpbnQ2NCgpKQogICAgZGlnIDEKICAgIGR1cAogICAgZGlnIDIKICAgIGNhbGxzdWIgX3NldF9pcnJldmVyc2libGVfZmxhZ192YWx1ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTo3ODktNzkwCiAgICAvLyAjIFVwZGF0ZSBNZXRhZGF0YSBIZWFkZXIKICAgIC8vIHNlbGYuX3VwZGF0ZV9oZWFkZXJfZXhjbHVkaW5nX2ZsYWdzX2FuZF9lbWl0KGFzc2V0X2lkKQogICAgY2FsbHN1YiBfdXBkYXRlX2hlYWRlcl9leGNsdWRpbmdfZmxhZ3NfYW5kX2VtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6OTktMTAyCiAgICAvLyByZXR1cm4gc2VsZi5hc3NldF9tZXRhZGF0YS5ib3goYXNhKS5leHRyYWN0KAogICAgLy8gICAgIHN0YXJ0X2luZGV4PWNvbnN0LklEWF9JUlJFVkVSU0lCTEVfRkxBR1MsCiAgICAvLyAgICAgbGVuZ3RoPWNvbnN0LklSUkVWRVJTSUJMRV9GTEFHU19TSVpFLAogICAgLy8gKQogICAgZGlnIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MTAwCiAgICAvLyBzdGFydF9pbmRleD1jb25zdC5JRFhfSVJSRVZFUlNJQkxFX0ZMQUdTLAogICAgaW50Y18zIC8vIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MTAxCiAgICAvLyBsZW5ndGg9Y29uc3QuSVJSRVZFUlNJQkxFX0ZMQUdTX1NJWkUsCiAgICBpbnRjXzAgLy8gMQogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTo5OS0xMDIKICAgIC8vIHJldHVybiBzZWxmLmFzc2V0X21ldGFkYXRhLmJveChhc2EpLmV4dHJhY3QoCiAgICAvLyAgICAgc3RhcnRfaW5kZXg9Y29uc3QuSURYX0lSUkVWRVJTSUJMRV9GTEFHUywKICAgIC8vICAgICBsZW5ndGg9Y29uc3QuSVJSRVZFUlNJQkxFX0ZMQUdTX1NJWkUsCiAgICAvLyApCiAgICBib3hfZXh0cmFjdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weToxMTIKICAgIC8vIGNvbnN0LkJJVF9SSUdIVE1PU1RfSVJSX0ZMQUcgLSBmbGFnLAogICAgcHVzaGludCA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjExMC0xMTMKICAgIC8vIHJldHVybiBvcC5nZXRiaXQoCiAgICAvLyAgICAgc2VsZi5fZ2V0X2lycmV2ZXJzaWJsZV9mbGFncyhhc2EpLAogICAgLy8gICAgIGNvbnN0LkJJVF9SSUdIVE1PU1RfSVJSX0ZMQUcgLSBmbGFnLAogICAgLy8gKQogICAgZ2V0Yml0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5Ojc5Mi03OTMKICAgIC8vICMgUG9zdGNvbmRpdGlvbnMKICAgIC8vIGlmIHNlbGYuX2lzX2FyYzU0X2J1cm5hYmxlKGFzc2V0X2lkKToKICAgIGJ6IGFyYzg5X3NldF9pcnJldmVyc2libGVfZmxhZ19hZnRlcl9pZl9lbHNlQDEzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5Ojc5NQogICAgLy8gc2VsZi5faXNfYXJjNTRfY29tcGxpYW50KGFzc2V0X2lkKSwKICAgIGRpZyAxCiAgICBjYWxsc3ViIF9pc19hcmM1NF9jb21wbGlhbnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6Nzk0LTc5NwogICAgLy8gbG9nZ2VkX2Fzc2VydCgKICAgIC8vICAgICBzZWxmLl9pc19hcmM1NF9jb21wbGlhbnQoYXNzZXRfaWQpLAogICAgLy8gICAgIGVyci5BU0FfTk9UX0FSQzU0X0NPTVBMSUFOVCwKICAgIC8vICkKICAgIGJueiBhcmM4OV9zZXRfaXJyZXZlcnNpYmxlX2ZsYWdfYWZ0ZXJfaWZfZWxzZUAxMwogICAgYnl0ZWMgMTQgLy8gIkVSUjphc2FOb3RBcmM1NENvbXBsaWFudCIKICAgIGxvZwogICAgZXJyIC8vIEVSUjphc2FOb3RBcmM1NENvbXBsaWFudAoKYXJjODlfc2V0X2lycmV2ZXJzaWJsZV9mbGFnX2FmdGVyX2lmX2Vsc2VAMTM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5Ojc2MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgphcmM4OV9zZXRfaXJyZXZlcnNpYmxlX2ZsYWdfYm9vbF9mYWxzZUA0OgogICAgaW50Y18xIC8vIDAKICAgIGIgYXJjODlfc2V0X2lycmV2ZXJzaWJsZV9mbGFnX2Jvb2xfbWVyZ2VANQoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc2FfbWV0YWRhdGFfcmVnaXN0cnkuY29udHJhY3QuQXNhTWV0YWRhdGFSZWdpc3RyeS5hcmM4OV9zZXRfaW1tdXRhYmxlW3JvdXRpbmddKCkgLT4gdm9pZDoKYXJjODlfc2V0X2ltbXV0YWJsZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6Nzk5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6ODExLTgxMgogICAgLy8gIyBQcmVjb25kaXRpb25zCiAgICAvLyBzZWxmLl9jaGVja19zZXRfZmxhZ19wcmVjb25kaXRpb25zKGFzc2V0X2lkKQogICAgZHVwCiAgICBjYWxsc3ViIF9jaGVja19zZXRfZmxhZ19wcmVjb25kaXRpb25zCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjgxNC04MTUKICAgIC8vICMgU2V0IEltbXV0YWJsZSBGbGFnCiAgICAvLyBzZWxmLl9zZXRfaXJyZXZlcnNpYmxlX2ZsYWdfdmFsdWUoYXNzZXRfaWQsIFVJbnQ2NChmbGcuSVJSX0ZMR19JTU1VVEFCTEUpKQogICAgZHVwCiAgICBwdXNoaW50IDcKICAgIGNhbGxzdWIgX3NldF9pcnJldmVyc2libGVfZmxhZ192YWx1ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTo4MTctODE4CiAgICAvLyAjIFVwZGF0ZSBNZXRhZGF0YSBIZWFkZXIKICAgIC8vIHNlbGYuX3VwZGF0ZV9oZWFkZXJfZXhjbHVkaW5nX2ZsYWdzX2FuZF9lbWl0KGFzc2V0X2lkKQogICAgY2FsbHN1YiBfdXBkYXRlX2hlYWRlcl9leGNsdWRpbmdfZmxhZ3NfYW5kX2VtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6Nzk5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMuYXNhX21ldGFkYXRhX3JlZ2lzdHJ5LmNvbnRyYWN0LkFzYU1ldGFkYXRhUmVnaXN0cnkuYXJjODlfZ2V0X21ldGFkYXRhX3BhcnRpYWxfdXJpW3JvdXRpbmddKCkgLT4gdm9pZDoKYXJjODlfZ2V0X21ldGFkYXRhX3BhcnRpYWxfdXJpOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTo4NTIKICAgIC8vIGFyYzkwX2JveF9xdWVyeShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCwgQnl0ZXMoKSkKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25JRAogICAgYnl0ZWNfMCAvLyAweAogICAgY2FsbHN1YiBhcmM5MF9ib3hfcXVlcnkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6ODQzCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzLmFzYV9tZXRhZGF0YV9yZWdpc3RyeS5jb250cmFjdC5Bc2FNZXRhZGF0YVJlZ2lzdHJ5LmFyYzg5X2dldF9tZXRhZGF0YV9tYnJfZGVsdGFbcm91dGluZ10oKSAtPiB2b2lkOgphcmM4OV9nZXRfbWV0YWRhdGFfbWJyX2RlbHRhOgogICAgYnl0ZWNfMCAvLyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5Ojg1NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDE2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5Ojg3NQogICAgLy8gbmV3X21ldGFkYXRhX3NpemUuYXNfdWludDY0KCkgPD0gY29uc3QuTUFYX01FVEFEQVRBX1NJWkUsCiAgICBidG9pCiAgICBkdXAKICAgIGludGMgNiAvLyAzMDUwNgogICAgPD0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6ODczLTg3NwogICAgLy8gIyBQcmVjb25kaXRpb25zCiAgICAvLyBsb2dnZWRfYXNzZXJ0KAogICAgLy8gICAgIG5ld19tZXRhZGF0YV9zaXplLmFzX3VpbnQ2NCgpIDw9IGNvbnN0Lk1BWF9NRVRBREFUQV9TSVpFLAogICAgLy8gICAgIGVyci5FWENFRURTX01BWF9NRVRBREFUQV9TSVpFLAogICAgLy8gKQogICAgYm56IGFyYzg5X2dldF9tZXRhZGF0YV9tYnJfZGVsdGFfYWZ0ZXJfYXNzZXJ0QDMKICAgIGJ5dGVjIDE5IC8vICJFUlI6ZXhjZWVkc01heE1ldGFkYXRhU2l6ZSIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpleGNlZWRzTWF4TWV0YWRhdGFTaXplCgphcmM4OV9nZXRfbWV0YWRhdGFfbWJyX2RlbHRhX2FmdGVyX2Fzc2VydEAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTo0OQogICAgLy8gcmV0dXJuIGFzYSBpbiBzZWxmLmFzc2V0X21ldGFkYXRhCiAgICBkaWcgMQogICAgaXRvYgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5Ojg3OQogICAgLy8gaWYgc2VsZi5fbWV0YWRhdGFfZXhpc3RzKGFzc2V0X2lkKToKICAgIGJ6IGFyYzg5X2dldF9tZXRhZGF0YV9tYnJfZGVsdGFfZWxzZV9ib2R5QDExCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5Ojg4MAogICAgLy8gbWV0YWRhdGFfc2l6ZSA9IHNlbGYuX2dldF9tZXRhZGF0YV9zaXplKGFzc2V0X2lkKQogICAgZGlnIDEKICAgIGNhbGxzdWIgX2dldF9tZXRhZGF0YV9zaXplCiAgICBkdXAKICAgIGJ1cnkgNAogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTo4ODEKICAgIC8vIGZsYXRfbWJyID0gVUludDY0KDApCiAgICBpbnRjXzEgLy8gMAogICAgYnVyeSA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5Ojg4MgogICAgLy8gaWYgbmV3X21ldGFkYXRhX3NpemUuYXNfdWludDY0KCkgPT0gbWV0YWRhdGFfc2l6ZToKICAgIGRpZyAxCiAgICA9PQogICAgYnogYXJjODlfZ2V0X21ldGFkYXRhX21icl9kZWx0YV9lbHNlX2JvZHlANgogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTo4ODQKICAgIC8vIGRlbHRhX3NpemUgPSBVSW50NjQoMCkKICAgIGludGNfMSAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5Ojg4MwogICAgLy8gc2lnbiA9IFVJbnQ2NChlbnVtcy5NQlJfREVMVEFfTlVMTCkKICAgIGR1cAoKYXJjODlfZ2V0X21ldGFkYXRhX21icl9kZWx0YV9hZnRlcl9pZl9lbHNlQDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTo5MDAKICAgIC8vIGRlbHRhX2Ftb3VudCA9IGZsYXRfbWJyICsgY29uc3QuQllURV9NQlIgKiBkZWx0YV9zaXplCiAgICBwdXNoaW50IDQwMAogICAgdW5jb3ZlciAyCiAgICAqCiAgICBkaWcgNQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTo5MDIKICAgIC8vIHJldHVybiBhYmkuTWJyRGVsdGEoc2lnbj1hcmM0LlVJbnQ4KHNpZ24pLCBhbW91bnQ9ZGVsdGFfYW1vdW50KQogICAgc3dhcAogICAgaXRvYgogICAgZHVwCiAgICBiaXRsZW4KICAgIGludGNfMiAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBleHRyYWN0IDcgMQogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5Ojg1NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgphcmM4OV9nZXRfbWV0YWRhdGFfbWJyX2RlbHRhX2Vsc2VfYm9keUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTo4ODUKICAgIC8vIGVsaWYgbmV3X21ldGFkYXRhX3NpemUuYXNfdWludDY0KCkgPiBtZXRhZGF0YV9zaXplOgogICAgZHVwCiAgICBkaWcgMwogICAgPgogICAgYnogYXJjODlfZ2V0X21ldGFkYXRhX21icl9kZWx0YV9lbHNlX2JvZHlAOAogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTo4ODYKICAgIC8vIHNpZ24gPSBVSW50NjQoZW51bXMuTUJSX0RFTFRBX1BPUykKICAgIGludGNfMCAvLyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5Ojg4NwogICAgLy8gZGVsdGFfc2l6ZSA9IG5ld19tZXRhZGF0YV9zaXplLmFzX3VpbnQ2NCgpIC0gbWV0YWRhdGFfc2l6ZQogICAgZGlnIDEKICAgIGRpZyA0CiAgICAtCiAgICBzd2FwCiAgICBiIGFyYzg5X2dldF9tZXRhZGF0YV9tYnJfZGVsdGFfYWZ0ZXJfaWZfZWxzZUAxMgoKYXJjODlfZ2V0X21ldGFkYXRhX21icl9kZWx0YV9lbHNlX2JvZHlAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6ODg5CiAgICAvLyBzaWduID0gVUludDY0KGVudW1zLk1CUl9ERUxUQV9ORUcpCiAgICBwdXNoaW50IDI1NQogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTo4OTAKICAgIC8vIGRlbHRhX3NpemUgPSBtZXRhZGF0YV9zaXplIC0gbmV3X21ldGFkYXRhX3NpemUuYXNfdWludDY0KCkKICAgIGRpZyAzCiAgICBkaWcgMgogICAgLQogICAgc3dhcAogICAgYiBhcmM4OV9nZXRfbWV0YWRhdGFfbWJyX2RlbHRhX2FmdGVyX2lmX2Vsc2VAMTIKCmFyYzg5X2dldF9tZXRhZGF0YV9tYnJfZGVsdGFfZWxzZV9ib2R5QDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTo4OTIKICAgIC8vIGZsYXRfbWJyID0gVUludDY0KGNvbnN0LkZMQVRfTUJSKQogICAgcHVzaGludCAyNTAwCiAgICBidXJ5IDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6ODkzCiAgICAvLyBzaWduID0gVUludDY0KGVudW1zLk1CUl9ERUxUQV9QT1MpCiAgICBpbnRjXzAgLy8gMQogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTo4OTUtODk2CiAgICAvLyBjb25zdC5BU1NFVF9NRVRBREFUQV9CT1hfS0VZX1NJWkUKICAgIC8vICsgY29uc3QuSEVBREVSX1NJWkUKICAgIHB1c2hpbnQgNTkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6ODk1LTg5NwogICAgLy8gY29uc3QuQVNTRVRfTUVUQURBVEFfQk9YX0tFWV9TSVpFCiAgICAvLyArIGNvbnN0LkhFQURFUl9TSVpFCiAgICAvLyArIG5ld19tZXRhZGF0YV9zaXplLmFzX3VpbnQ2NCgpCiAgICBkaWcgMgogICAgKwogICAgc3dhcAogICAgYiBhcmM4OV9nZXRfbWV0YWRhdGFfbWJyX2RlbHRhX2FmdGVyX2lmX2Vsc2VAMTIKCgovLyBzbWFydF9jb250cmFjdHMuYXNhX21ldGFkYXRhX3JlZ2lzdHJ5LmNvbnRyYWN0LkFzYU1ldGFkYXRhUmVnaXN0cnkuYXJjODlfY2hlY2tfbWV0YWRhdGFfZXhpc3RzW3JvdXRpbmddKCkgLT4gdm9pZDoKYXJjODlfY2hlY2tfbWV0YWRhdGFfZXhpc3RzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTo5MDQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV92YWxpZGF0aW9uLnB5OjE1CiAgICAvLyBfY3JlYXRvciwgZXhpc3RzID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfY3JlYXRvcihhc2EpCiAgICBkdXAKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRDcmVhdG9yCiAgICBjb3ZlciAyCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6NDkKICAgIC8vIHJldHVybiBhc2EgaW4gc2VsZi5hc3NldF9tZXRhZGF0YQogICAgaXRvYgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjkxOS05MjIKICAgIC8vIHJldHVybiBhYmkuTWV0YWRhdGFFeGlzdGVuY2UoCiAgICAvLyAgICAgYXNhX2V4aXN0cz1zZWxmLl9hc2FfZXhpc3RzKGFzc2V0X2lkKSwKICAgIC8vICAgICBtZXRhZGF0YV9leGlzdHM9c2VsZi5fbWV0YWRhdGFfZXhpc3RzKGFzc2V0X2lkKSwKICAgIC8vICkKICAgIGJ5dGVjXzIgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMwogICAgc2V0Yml0CiAgICBpbnRjXzAgLy8gMQogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6OTA0CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMuYXNhX21ldGFkYXRhX3JlZ2lzdHJ5LmNvbnRyYWN0LkFzYU1ldGFkYXRhUmVnaXN0cnkuYXJjODlfaXNfbWV0YWRhdGFfaW1tdXRhYmxlW3JvdXRpbmddKCkgLT4gdm9pZDoKYXJjODlfaXNfbWV0YWRhdGFfaW1tdXRhYmxlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTo5MjQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwbiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjkzOS05NDAKICAgIC8vICMgUHJlY29uZGl0aW9ucwogICAgLy8gc2VsZi5fY2hlY2tfZXhpc3RlbmNlX3ByZWNvbmRpdGlvbnMoYXNzZXRfaWQpCiAgICBjYWxsc3ViIF9jaGVja19leGlzdGVuY2VfcHJlY29uZGl0aW9ucwogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTo5OQogICAgLy8gcmV0dXJuIHNlbGYuYXNzZXRfbWV0YWRhdGEuYm94KGFzYSkuZXh0cmFjdCgKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MTAwCiAgICAvLyBzdGFydF9pbmRleD1jb25zdC5JRFhfSVJSRVZFUlNJQkxFX0ZMQUdTLAogICAgaW50Y18zIC8vIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MTAxCiAgICAvLyBsZW5ndGg9Y29uc3QuSVJSRVZFUlNJQkxFX0ZMQUdTX1NJWkUsCiAgICBpbnRjXzAgLy8gMQogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTo5OS0xMDIKICAgIC8vIHJldHVybiBzZWxmLmFzc2V0X21ldGFkYXRhLmJveChhc2EpLmV4dHJhY3QoCiAgICAvLyAgICAgc3RhcnRfaW5kZXg9Y29uc3QuSURYX0lSUkVWRVJTSUJMRV9GTEFHUywKICAgIC8vICAgICBsZW5ndGg9Y29uc3QuSVJSRVZFUlNJQkxFX0ZMQUdTX1NJWkUsCiAgICAvLyApCiAgICBib3hfZXh0cmFjdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weToxMTIKICAgIC8vIGNvbnN0LkJJVF9SSUdIVE1PU1RfSVJSX0ZMQUcgLSBmbGFnLAogICAgaW50Y18xIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MTEwLTExMwogICAgLy8gcmV0dXJuIG9wLmdldGJpdCgKICAgIC8vICAgICBzZWxmLl9nZXRfaXJyZXZlcnNpYmxlX2ZsYWdzKGFzYSksCiAgICAvLyAgICAgY29uc3QuQklUX1JJR0hUTU9TVF9JUlJfRkxBRyAtIGZsYWcsCiAgICAvLyApCiAgICBnZXRiaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6OTQyCiAgICAvLyByZXR1cm4gc2VsZi5faXNfaW1tdXRhYmxlKGFzc2V0X2lkKSBvciBhc3NldF9pZC5tYW5hZ2VyID09IEdsb2JhbC56ZXJvX2FkZHJlc3MKICAgIGJueiBhcmM4OV9pc19tZXRhZGF0YV9pbW11dGFibGVfYm9vbF90cnVlQDMKICAgIGR1cAogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldE1hbmFnZXIKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgPT0KICAgIGJ6IGFyYzg5X2lzX21ldGFkYXRhX2ltbXV0YWJsZV9ib29sX2ZhbHNlQDQKCmFyYzg5X2lzX21ldGFkYXRhX2ltbXV0YWJsZV9ib29sX3RydWVAMzoKICAgIGludGNfMCAvLyAxCgphcmM4OV9pc19tZXRhZGF0YV9pbW11dGFibGVfYm9vbF9tZXJnZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTo5MjQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMiAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCmFyYzg5X2lzX21ldGFkYXRhX2ltbXV0YWJsZV9ib29sX2ZhbHNlQDQ6CiAgICBpbnRjXzEgLy8gMAogICAgYiBhcmM4OV9pc19tZXRhZGF0YV9pbW11dGFibGVfYm9vbF9tZXJnZUA1CgoKLy8gc21hcnRfY29udHJhY3RzLmFzYV9tZXRhZGF0YV9yZWdpc3RyeS5jb250cmFjdC5Bc2FNZXRhZGF0YVJlZ2lzdHJ5LmFyYzg5X2lzX21ldGFkYXRhX3Nob3J0W3JvdXRpbmddKCkgLT4gdm9pZDoKYXJjODlfaXNfbWV0YWRhdGFfc2hvcnQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5Ojk0NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5Ojk1OS05NjAKICAgIC8vICMgUHJlY29uZGl0aW9ucwogICAgLy8gc2VsZi5fY2hlY2tfZXhpc3RlbmNlX3ByZWNvbmRpdGlvbnMoYXNzZXRfaWQpCiAgICBkdXAKICAgIGNhbGxzdWIgX2NoZWNrX2V4aXN0ZW5jZV9wcmVjb25kaXRpb25zCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjU4CiAgICAvLyByZXR1cm4gc2VsZi5hc3NldF9tZXRhZGF0YS5ib3goYXNhKS5leHRyYWN0KAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTo1OC02MQogICAgLy8gcmV0dXJuIHNlbGYuYXNzZXRfbWV0YWRhdGEuYm94KGFzYSkuZXh0cmFjdCgKICAgIC8vICAgICBzdGFydF9pbmRleD1jb25zdC5JRFhfTUVUQURBVEFfSURFTlRJRklFUlMsCiAgICAvLyAgICAgbGVuZ3RoPWNvbnN0Lk1FVEFEQVRBX0lERU5USUZJRVJTX1NJWkUsCiAgICAvLyApCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6NTkKICAgIC8vIHN0YXJ0X2luZGV4PWNvbnN0LklEWF9NRVRBREFUQV9JREVOVElGSUVSUywKICAgIGludGNfMSAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjYwCiAgICAvLyBsZW5ndGg9Y29uc3QuTUVUQURBVEFfSURFTlRJRklFUlNfU0laRSwKICAgIGludGNfMCAvLyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjU4LTYxCiAgICAvLyByZXR1cm4gc2VsZi5hc3NldF9tZXRhZGF0YS5ib3goYXNhKS5leHRyYWN0KAogICAgLy8gICAgIHN0YXJ0X2luZGV4PWNvbnN0LklEWF9NRVRBREFUQV9JREVOVElGSUVSUywKICAgIC8vICAgICBsZW5ndGg9Y29uc3QuTUVUQURBVEFfSURFTlRJRklFUlNfU0laRSwKICAgIC8vICkKICAgIGJveF9leHRyYWN0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjcxCiAgICAvLyBjb25zdC5CSVRfUklHSFRNT1NUX0lERU5USUZJRVIgLSBmbGcuSURfU0hPUlQsCiAgICBpbnRjXzEgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTo2OS03MgogICAgLy8gcmV0dXJuIG9wLmdldGJpdCgKICAgIC8vICAgICBzZWxmLl9nZXRfbWV0YWRhdGFfaWRlbnRpZmllcnMoYXNhKSwKICAgIC8vICAgICBjb25zdC5CSVRfUklHSFRNT1NUX0lERU5USUZJRVIgLSBmbGcuSURfU0hPUlQsCiAgICAvLyApCiAgICBnZXRiaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MTM1LTEzOAogICAgLy8gc2VsZi5hc3NldF9tZXRhZGF0YS5ib3goYXNhKS5leHRyYWN0KAogICAgLy8gICAgIHN0YXJ0X2luZGV4PWNvbnN0LklEWF9MQVNUX01PRElGSUVEX1JPVU5ELAogICAgLy8gICAgIGxlbmd0aD1jb25zdC5MQVNUX01PRElGSUVEX1JPVU5EX1NJWkUsCiAgICAvLyApCiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjEzNgogICAgLy8gc3RhcnRfaW5kZXg9Y29uc3QuSURYX0xBU1RfTU9ESUZJRURfUk9VTkQsCiAgICBwdXNoaW50IDM1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjEzNwogICAgLy8gbGVuZ3RoPWNvbnN0LkxBU1RfTU9ESUZJRURfUk9VTkRfU0laRSwKICAgIGludGNfMiAvLyA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjEzNS0xMzgKICAgIC8vIHNlbGYuYXNzZXRfbWV0YWRhdGEuYm94KGFzYSkuZXh0cmFjdCgKICAgIC8vICAgICBzdGFydF9pbmRleD1jb25zdC5JRFhfTEFTVF9NT0RJRklFRF9ST1VORCwKICAgIC8vICAgICBsZW5ndGg9Y29uc3QuTEFTVF9NT0RJRklFRF9ST1VORF9TSVpFLAogICAgLy8gKQogICAgYm94X2V4dHJhY3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MTM0LTEzOQogICAgLy8gcmV0dXJuIG9wLmJ0b2koCiAgICAvLyAgICAgc2VsZi5hc3NldF9tZXRhZGF0YS5ib3goYXNhKS5leHRyYWN0KAogICAgLy8gICAgICAgICBzdGFydF9pbmRleD1jb25zdC5JRFhfTEFTVF9NT0RJRklFRF9ST1VORCwKICAgIC8vICAgICAgICAgbGVuZ3RoPWNvbnN0LkxBU1RfTU9ESUZJRURfUk9VTkRfU0laRSwKICAgIC8vICAgICApCiAgICAvLyApCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5Ojk2Mi05NjUKICAgIC8vIHJldHVybiBhYmkuTXV0YWJsZUZsYWcoCiAgICAvLyAgICAgZmxhZz1zZWxmLl9pc19zaG9ydChhc3NldF9pZCksCiAgICAvLyAgICAgbGFzdF9tb2RpZmllZF9yb3VuZD1zZWxmLl9nZXRfbGFzdF9tb2RpZmllZF9yb3VuZChhc3NldF9pZCksCiAgICAvLyApCiAgICBieXRlY18yIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5Ojk0NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzLmFzYV9tZXRhZGF0YV9yZWdpc3RyeS5jb250cmFjdC5Bc2FNZXRhZGF0YVJlZ2lzdHJ5LmFyYzg5X2dldF9tZXRhZGF0YV9oZWFkZXJbcm91dGluZ10oKSAtPiB2b2lkOgphcmM4OV9nZXRfbWV0YWRhdGFfaGVhZGVyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTo5NjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTo5ODMtOTg0CiAgICAvLyAjIFByZWNvbmRpdGlvbnMKICAgIC8vIHNlbGYuX2NoZWNrX2V4aXN0ZW5jZV9wcmVjb25kaXRpb25zKGFzc2V0X2lkKQogICAgZHVwCiAgICBjYWxsc3ViIF9jaGVja19leGlzdGVuY2VfcHJlY29uZGl0aW9ucwogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTo1OAogICAgLy8gcmV0dXJuIHNlbGYuYXNzZXRfbWV0YWRhdGEuYm94KGFzYSkuZXh0cmFjdCgKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6NTgtNjEKICAgIC8vIHJldHVybiBzZWxmLmFzc2V0X21ldGFkYXRhLmJveChhc2EpLmV4dHJhY3QoCiAgICAvLyAgICAgc3RhcnRfaW5kZXg9Y29uc3QuSURYX01FVEFEQVRBX0lERU5USUZJRVJTLAogICAgLy8gICAgIGxlbmd0aD1jb25zdC5NRVRBREFUQV9JREVOVElGSUVSU19TSVpFLAogICAgLy8gKQogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjU5CiAgICAvLyBzdGFydF9pbmRleD1jb25zdC5JRFhfTUVUQURBVEFfSURFTlRJRklFUlMsCiAgICBpbnRjXzEgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTo2MAogICAgLy8gbGVuZ3RoPWNvbnN0Lk1FVEFEQVRBX0lERU5USUZJRVJTX1NJWkUsCiAgICBpbnRjXzAgLy8gMQogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTo1OC02MQogICAgLy8gcmV0dXJuIHNlbGYuYXNzZXRfbWV0YWRhdGEuYm94KGFzYSkuZXh0cmFjdCgKICAgIC8vICAgICBzdGFydF9pbmRleD1jb25zdC5JRFhfTUVUQURBVEFfSURFTlRJRklFUlMsCiAgICAvLyAgICAgbGVuZ3RoPWNvbnN0Lk1FVEFEQVRBX0lERU5USUZJRVJTX1NJWkUsCiAgICAvLyApCiAgICBib3hfZXh0cmFjdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTo3NS03NwogICAgLy8gcmV0dXJuIHNlbGYuYXNzZXRfbWV0YWRhdGEuYm94KGFzYSkuZXh0cmFjdCgKICAgIC8vICAgICBzdGFydF9pbmRleD1jb25zdC5JRFhfUkVWRVJTSUJMRV9GTEFHUywgbGVuZ3RoPWNvbnN0LlJFVkVSU0lCTEVfRkxBR1NfU0laRQogICAgLy8gKQogICAgZGlnIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6NzYKICAgIC8vIHN0YXJ0X2luZGV4PWNvbnN0LklEWF9SRVZFUlNJQkxFX0ZMQUdTLCBsZW5ndGg9Y29uc3QuUkVWRVJTSUJMRV9GTEFHU19TSVpFCiAgICBpbnRjXzAgLy8gMQogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5Ojc1LTc3CiAgICAvLyByZXR1cm4gc2VsZi5hc3NldF9tZXRhZGF0YS5ib3goYXNhKS5leHRyYWN0KAogICAgLy8gICAgIHN0YXJ0X2luZGV4PWNvbnN0LklEWF9SRVZFUlNJQkxFX0ZMQUdTLCBsZW5ndGg9Y29uc3QuUkVWRVJTSUJMRV9GTEFHU19TSVpFCiAgICAvLyApCiAgICBib3hfZXh0cmFjdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTo5OS0xMDIKICAgIC8vIHJldHVybiBzZWxmLmFzc2V0X21ldGFkYXRhLmJveChhc2EpLmV4dHJhY3QoCiAgICAvLyAgICAgc3RhcnRfaW5kZXg9Y29uc3QuSURYX0lSUkVWRVJTSUJMRV9GTEFHUywKICAgIC8vICAgICBsZW5ndGg9Y29uc3QuSVJSRVZFUlNJQkxFX0ZMQUdTX1NJWkUsCiAgICAvLyApCiAgICBkaWcgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weToxMDAKICAgIC8vIHN0YXJ0X2luZGV4PWNvbnN0LklEWF9JUlJFVkVSU0lCTEVfRkxBR1MsCiAgICBpbnRjXzMgLy8gMgogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weToxMDEKICAgIC8vIGxlbmd0aD1jb25zdC5JUlJFVkVSU0lCTEVfRkxBR1NfU0laRSwKICAgIGludGNfMCAvLyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5Ojk5LTEwMgogICAgLy8gcmV0dXJuIHNlbGYuYXNzZXRfbWV0YWRhdGEuYm94KGFzYSkuZXh0cmFjdCgKICAgIC8vICAgICBzdGFydF9pbmRleD1jb25zdC5JRFhfSVJSRVZFUlNJQkxFX0ZMQUdTLAogICAgLy8gICAgIGxlbmd0aD1jb25zdC5JUlJFVkVSU0lCTEVfRkxBR1NfU0laRSwKICAgIC8vICkKICAgIGJveF9leHRyYWN0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjEyNC0xMjYKICAgIC8vIHJldHVybiBzZWxmLmFzc2V0X21ldGFkYXRhLmJveChhc2EpLmV4dHJhY3QoCiAgICAvLyAgICAgc3RhcnRfaW5kZXg9Y29uc3QuSURYX01FVEFEQVRBX0hBU0gsIGxlbmd0aD1jb25zdC5NRVRBREFUQV9IQVNIX1NJWkUKICAgIC8vICkKICAgIGRpZyAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjEyNQogICAgLy8gc3RhcnRfaW5kZXg9Y29uc3QuSURYX01FVEFEQVRBX0hBU0gsIGxlbmd0aD1jb25zdC5NRVRBREFUQV9IQVNIX1NJWkUKICAgIHB1c2hpbnRzIDMgMzIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MTI0LTEyNgogICAgLy8gcmV0dXJuIHNlbGYuYXNzZXRfbWV0YWRhdGEuYm94KGFzYSkuZXh0cmFjdCgKICAgIC8vICAgICBzdGFydF9pbmRleD1jb25zdC5JRFhfTUVUQURBVEFfSEFTSCwgbGVuZ3RoPWNvbnN0Lk1FVEFEQVRBX0hBU0hfU0laRQogICAgLy8gKQogICAgYm94X2V4dHJhY3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6OTkyCiAgICAvLyBoYXNoPWFiaS5IYXNoKHNlbGYuX2dldF9tZXRhZGF0YV9oYXNoKGFzc2V0X2lkKSksCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCAzMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBieXRlcyB0byBiZSBsZW5ndGggMzIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MTM1LTEzOAogICAgLy8gc2VsZi5hc3NldF9tZXRhZGF0YS5ib3goYXNhKS5leHRyYWN0KAogICAgLy8gICAgIHN0YXJ0X2luZGV4PWNvbnN0LklEWF9MQVNUX01PRElGSUVEX1JPVU5ELAogICAgLy8gICAgIGxlbmd0aD1jb25zdC5MQVNUX01PRElGSUVEX1JPVU5EX1NJWkUsCiAgICAvLyApCiAgICBkaWcgNAogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weToxMzYKICAgIC8vIHN0YXJ0X2luZGV4PWNvbnN0LklEWF9MQVNUX01PRElGSUVEX1JPVU5ELAogICAgcHVzaGludCAzNQogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weToxMzcKICAgIC8vIGxlbmd0aD1jb25zdC5MQVNUX01PRElGSUVEX1JPVU5EX1NJWkUsCiAgICBpbnRjXzIgLy8gOAogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weToxMzUtMTM4CiAgICAvLyBzZWxmLmFzc2V0X21ldGFkYXRhLmJveChhc2EpLmV4dHJhY3QoCiAgICAvLyAgICAgc3RhcnRfaW5kZXg9Y29uc3QuSURYX0xBU1RfTU9ESUZJRURfUk9VTkQsCiAgICAvLyAgICAgbGVuZ3RoPWNvbnN0LkxBU1RfTU9ESUZJRURfUk9VTkRfU0laRSwKICAgIC8vICkKICAgIGJveF9leHRyYWN0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjEzNC0xMzkKICAgIC8vIHJldHVybiBvcC5idG9pKAogICAgLy8gICAgIHNlbGYuYXNzZXRfbWV0YWRhdGEuYm94KGFzYSkuZXh0cmFjdCgKICAgIC8vICAgICAgICAgc3RhcnRfaW5kZXg9Y29uc3QuSURYX0xBU1RfTU9ESUZJRURfUk9VTkQsCiAgICAvLyAgICAgICAgIGxlbmd0aD1jb25zdC5MQVNUX01PRElGSUVEX1JPVU5EX1NJWkUsCiAgICAvLyAgICAgKQogICAgLy8gKQogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weToxNDktMTUyCiAgICAvLyBzZWxmLmFzc2V0X21ldGFkYXRhLmJveChhc2EpLmV4dHJhY3QoCiAgICAvLyAgICAgc3RhcnRfaW5kZXg9Y29uc3QuSURYX0RFUFJFQ0FURURfQlksCiAgICAvLyAgICAgbGVuZ3RoPWNvbnN0LkRFUFJFQ0FURURfQllfU0laRSwKICAgIC8vICkKICAgIHVuY292ZXIgNQogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weToxNTAKICAgIC8vIHN0YXJ0X2luZGV4PWNvbnN0LklEWF9ERVBSRUNBVEVEX0JZLAogICAgcHVzaGludCA0MwogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weToxNTEKICAgIC8vIGxlbmd0aD1jb25zdC5ERVBSRUNBVEVEX0JZX1NJWkUsCiAgICBpbnRjXzIgLy8gOAogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weToxNDktMTUyCiAgICAvLyBzZWxmLmFzc2V0X21ldGFkYXRhLmJveChhc2EpLmV4dHJhY3QoCiAgICAvLyAgICAgc3RhcnRfaW5kZXg9Y29uc3QuSURYX0RFUFJFQ0FURURfQlksCiAgICAvLyAgICAgbGVuZ3RoPWNvbnN0LkRFUFJFQ0FURURfQllfU0laRSwKICAgIC8vICkKICAgIGJveF9leHRyYWN0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjE0OC0xNTMKICAgIC8vIHJldHVybiBvcC5idG9pKAogICAgLy8gICAgIHNlbGYuYXNzZXRfbWV0YWRhdGEuYm94KGFzYSkuZXh0cmFjdCgKICAgIC8vICAgICAgICAgc3RhcnRfaW5kZXg9Y29uc3QuSURYX0RFUFJFQ0FURURfQlksCiAgICAvLyAgICAgICAgIGxlbmd0aD1jb25zdC5ERVBSRUNBVEVEX0JZX1NJWkUsCiAgICAvLyAgICAgKQogICAgLy8gKQogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTo5ODYtOTk1CiAgICAvLyByZXR1cm4gYWJpLk1ldGFkYXRhSGVhZGVyKAogICAgLy8gICAgIGlkZW50aWZpZXJzPWFyYzQuQnl0ZS5mcm9tX2J5dGVzKHNlbGYuX2dldF9tZXRhZGF0YV9pZGVudGlmaWVycyhhc3NldF9pZCkpLAogICAgLy8gICAgIHJldmVyc2libGVfZmxhZ3M9YXJjNC5CeXRlLmZyb21fYnl0ZXMoc2VsZi5fZ2V0X3JldmVyc2libGVfZmxhZ3MoYXNzZXRfaWQpKSwKICAgIC8vICAgICBpcnJldmVyc2libGVfZmxhZ3M9YXJjNC5CeXRlLmZyb21fYnl0ZXMoCiAgICAvLyAgICAgICAgIHNlbGYuX2dldF9pcnJldmVyc2libGVfZmxhZ3MoYXNzZXRfaWQpCiAgICAvLyAgICAgKSwKICAgIC8vICAgICBoYXNoPWFiaS5IYXNoKHNlbGYuX2dldF9tZXRhZGF0YV9oYXNoKGFzc2V0X2lkKSksCiAgICAvLyAgICAgbGFzdF9tb2RpZmllZF9yb3VuZD1zZWxmLl9nZXRfbGFzdF9tb2RpZmllZF9yb3VuZChhc3NldF9pZCksCiAgICAvLyAgICAgZGVwcmVjYXRlZF9ieT1zZWxmLl9nZXRfZGVwcmVjYXRlZF9ieShhc3NldF9pZCksCiAgICAvLyApCiAgICB1bmNvdmVyIDUKICAgIHVuY292ZXIgNQogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6OTY3CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMuYXNhX21ldGFkYXRhX3JlZ2lzdHJ5LmNvbnRyYWN0LkFzYU1ldGFkYXRhUmVnaXN0cnkuYXJjODlfZ2V0X21ldGFkYXRhX3BhZ2luYXRpb25bcm91dGluZ10oKSAtPiB2b2lkOgphcmM4OV9nZXRfbWV0YWRhdGFfcGFnaW5hdGlvbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6OTk3CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MTAxMS0xMDEyCiAgICAvLyAjIFByZWNvbmRpdGlvbnMKICAgIC8vIHNlbGYuX2NoZWNrX2V4aXN0ZW5jZV9wcmVjb25kaXRpb25zKGFzc2V0X2lkKQogICAgZHVwCiAgICBjYWxsc3ViIF9jaGVja19leGlzdGVuY2VfcHJlY29uZGl0aW9ucwogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weToxMDE1CiAgICAvLyBtZXRhZGF0YV9zaXplPWFyYzQuVUludDE2KHNlbGYuX2dldF9tZXRhZGF0YV9zaXplKGFzc2V0X2lkKSksCiAgICBkdXAKICAgIGNhbGxzdWIgX2dldF9tZXRhZGF0YV9zaXplCiAgICBpdG9iCiAgICBkdXAKICAgIGJpdGxlbgogICAgcHVzaGludCAxNgogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA2IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MjQ1CiAgICAvLyBuID0gc2VsZi5fZ2V0X21ldGFkYXRhX3NpemUoYXNhKQogICAgc3dhcAogICAgY2FsbHN1YiBfZ2V0X21ldGFkYXRhX3NpemUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdm1fbGlicmFyeS5weTozMAogICAgLy8gcmV0dXJuIChudW0gKyAoZGVuIC0gMSkpIC8vIGRlbgogICAgaW50YyA1IC8vIDEwMDYKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MjQ2CiAgICAvLyByZXR1cm4gY2VpbF9kaXYobnVtPW4sIGRlbj1VSW50NjQoY29uc3QuUEFHRV9TSVpFKSkKICAgIGludGMgNCAvLyAxMDA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXZtX2xpYnJhcnkucHk6MzAKICAgIC8vIHJldHVybiAobnVtICsgKGRlbiAtIDEpKSAvLyBkZW4KICAgIC8KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MTAxNwogICAgLy8gdG90YWxfcGFnZXM9YXJjNC5VSW50OChzZWxmLl9nZXRfdG90YWxfcGFnZXMoYXNzZXRfaWQpKSwKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBpbnRjXzIgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA3IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MTAxNC0xMDE4CiAgICAvLyByZXR1cm4gYWJpLlBhZ2luYXRpb24oCiAgICAvLyAgICAgbWV0YWRhdGFfc2l6ZT1hcmM0LlVJbnQxNihzZWxmLl9nZXRfbWV0YWRhdGFfc2l6ZShhc3NldF9pZCkpLAogICAgLy8gICAgIHBhZ2Vfc2l6ZT1hcmM0LlVJbnQxNihjb25zdC5QQUdFX1NJWkUpLAogICAgLy8gICAgIHRvdGFsX3BhZ2VzPWFyYzQuVUludDgoc2VsZi5fZ2V0X3RvdGFsX3BhZ2VzKGFzc2V0X2lkKSksCiAgICAvLyApCiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjEwMTYKICAgIC8vIHBhZ2Vfc2l6ZT1hcmM0LlVJbnQxNihjb25zdC5QQUdFX1NJWkUpLAogICAgcHVzaGJ5dGVzIDB4MDNlZgogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weToxMDE0LTEwMTgKICAgIC8vIHJldHVybiBhYmkuUGFnaW5hdGlvbigKICAgIC8vICAgICBtZXRhZGF0YV9zaXplPWFyYzQuVUludDE2KHNlbGYuX2dldF9tZXRhZGF0YV9zaXplKGFzc2V0X2lkKSksCiAgICAvLyAgICAgcGFnZV9zaXplPWFyYzQuVUludDE2KGNvbnN0LlBBR0VfU0laRSksCiAgICAvLyAgICAgdG90YWxfcGFnZXM9YXJjNC5VSW50OChzZWxmLl9nZXRfdG90YWxfcGFnZXMoYXNzZXRfaWQpKSwKICAgIC8vICkKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5Ojk5NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzLmFzYV9tZXRhZGF0YV9yZWdpc3RyeS5jb250cmFjdC5Bc2FNZXRhZGF0YVJlZ2lzdHJ5LmFyYzg5X2dldF9tZXRhZGF0YVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmFyYzg5X2dldF9tZXRhZGF0YToKICAgIGJ5dGVjXzAgLy8gIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weToxMDIwCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjEwMzctMTAzOAogICAgLy8gIyBQcmVjb25kaXRpb25zCiAgICAvLyBzZWxmLl9jaGVja19leGlzdGVuY2VfcHJlY29uZGl0aW9ucyhhc3NldF9pZCkKICAgIGR1cAogICAgY2FsbHN1YiBfY2hlY2tfZXhpc3RlbmNlX3ByZWNvbmRpdGlvbnMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MjQ1CiAgICAvLyBuID0gc2VsZi5fZ2V0X21ldGFkYXRhX3NpemUoYXNhKQogICAgY2FsbHN1YiBfZ2V0X21ldGFkYXRhX3NpemUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdm1fbGlicmFyeS5weTozMAogICAgLy8gcmV0dXJuIChudW0gKyAoZGVuIC0gMSkpIC8vIGRlbgogICAgaW50YyA1IC8vIDEwMDYKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MjQ2CiAgICAvLyByZXR1cm4gY2VpbF9kaXYobnVtPW4sIGRlbj1VSW50NjQoY29uc3QuUEFHRV9TSVpFKSkKICAgIGludGMgNCAvLyAxMDA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXZtX2xpYnJhcnkucHk6MzAKICAgIC8vIHJldHVybiAobnVtICsgKGRlbiAtIDEpKSAvLyBkZW4KICAgIC8KICAgIGR1cAogICAgY292ZXIgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weToxMDQwCiAgICAvLyBpZiB0b3RhbF9wYWdlcyA+IDA6CiAgICBieiBhcmM4OV9nZXRfbWV0YWRhdGFfZWxzZV9ib2R5QDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MTA0MQogICAgLy8gbG9nZ2VkX2Fzc2VydChwYWdlLmFzX3VpbnQ2NCgpIDwgdG90YWxfcGFnZXMsIGVyci5QQUdFX0lEWF9JTlZBTElEKQogICAgYnRvaQogICAgZHVwCiAgICBidXJ5IDQKICAgIGRpZyAxCiAgICA8CiAgICBibnogYXJjODlfZ2V0X21ldGFkYXRhX2FmdGVyX2Fzc2VydEA0CiAgICBieXRlYyA5IC8vICJFUlI6cGFnZUlkeEludmFsaWQiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6cGFnZUlkeEludmFsaWQKCmFyYzg5X2dldF9tZXRhZGF0YV9hZnRlcl9hc3NlcnRANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MTA0MgogICAgLy8gaGFzX25leHRfcGFnZSA9IHBhZ2UuYXNfdWludDY0KCkgPCB0b3RhbF9wYWdlcyAtIDEKICAgIGR1cAogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIGRpZyAzCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgPAogICAgYnVyeSA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjEwNDMKICAgIC8vIHBhZ2VfY29udGVudCA9IHNlbGYuX2dldF9tZXRhZGF0YV9wYWdlKGFzc2V0X2lkLCBwYWdlLmFzX3VpbnQ2NCgpKQogICAgZGlnIDIKICAgIHN3YXAKICAgIGNhbGxzdWIgX2dldF9tZXRhZGF0YV9wYWdlCgphcmM4OV9nZXRfbWV0YWRhdGFfYWZ0ZXJfaWZfZWxzZUA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weToxMzUKICAgIC8vIHNlbGYuYXNzZXRfbWV0YWRhdGEuYm94KGFzYSkuZXh0cmFjdCgKICAgIGRpZyAyCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjEzNgogICAgLy8gc3RhcnRfaW5kZXg9Y29uc3QuSURYX0xBU1RfTU9ESUZJRURfUk9VTkQsCiAgICBwdXNoaW50IDM1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjEzNwogICAgLy8gbGVuZ3RoPWNvbnN0LkxBU1RfTU9ESUZJRURfUk9VTkRfU0laRSwKICAgIGludGNfMiAvLyA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjEzNS0xMzgKICAgIC8vIHNlbGYuYXNzZXRfbWV0YWRhdGEuYm94KGFzYSkuZXh0cmFjdCgKICAgIC8vICAgICBzdGFydF9pbmRleD1jb25zdC5JRFhfTEFTVF9NT0RJRklFRF9ST1VORCwKICAgIC8vICAgICBsZW5ndGg9Y29uc3QuTEFTVF9NT0RJRklFRF9ST1VORF9TSVpFLAogICAgLy8gKQogICAgYm94X2V4dHJhY3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MTM0LTEzOQogICAgLy8gcmV0dXJuIG9wLmJ0b2koCiAgICAvLyAgICAgc2VsZi5hc3NldF9tZXRhZGF0YS5ib3goYXNhKS5leHRyYWN0KAogICAgLy8gICAgICAgICBzdGFydF9pbmRleD1jb25zdC5JRFhfTEFTVF9NT0RJRklFRF9ST1VORCwKICAgIC8vICAgICAgICAgbGVuZ3RoPWNvbnN0LkxBU1RfTU9ESUZJRURfUk9VTkRfU0laRSwKICAgIC8vICAgICApCiAgICAvLyApCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjEwNDktMTA1MwogICAgLy8gcmV0dXJuIGFiaS5QYWdpbmF0ZWRNZXRhZGF0YSgKICAgIC8vICAgICBoYXNfbmV4dF9wYWdlPWhhc19uZXh0X3BhZ2UsCiAgICAvLyAgICAgbGFzdF9tb2RpZmllZF9yb3VuZD1zZWxmLl9nZXRfbGFzdF9tb2RpZmllZF9yb3VuZChhc3NldF9pZCksCiAgICAvLyAgICAgcGFnZV9jb250ZW50PXBhZ2VfY29udGVudCwKICAgIC8vICkKICAgIGJ5dGVjXzIgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIGRpZyA3CiAgICBzZXRiaXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgc3dhcAogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHN3YXAKICAgIHB1c2hieXRlcyAweDAwMGIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjEwMjAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKYXJjODlfZ2V0X21ldGFkYXRhX2Vsc2VfYm9keUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weToxMDQ1CiAgICAvLyBsb2dnZWRfYXNzZXJ0KHBhZ2UuYXNfdWludDY0KCkgPT0gMCwgZXJyLlBBR0VfSURYX0lOVkFMSUQpCiAgICBidG9pCiAgICBieiBhcmM4OV9nZXRfbWV0YWRhdGFfYWZ0ZXJfYXNzZXJ0QDcKICAgIGJ5dGVjIDkgLy8gIkVSUjpwYWdlSWR4SW52YWxpZCIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpwYWdlSWR4SW52YWxpZAoKYXJjODlfZ2V0X21ldGFkYXRhX2FmdGVyX2Fzc2VydEA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weToxMDQ2CiAgICAvLyBoYXNfbmV4dF9wYWdlID0gRmFsc2UKICAgIGludGNfMSAvLyAwCiAgICBidXJ5IDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MTA0NwogICAgLy8gcGFnZV9jb250ZW50ID0gQnl0ZXMoKQogICAgYnl0ZWNfMCAvLyAweAogICAgYiBhcmM4OV9nZXRfbWV0YWRhdGFfYWZ0ZXJfaWZfZWxzZUA4CgoKLy8gc21hcnRfY29udHJhY3RzLmFzYV9tZXRhZGF0YV9yZWdpc3RyeS5jb250cmFjdC5Bc2FNZXRhZGF0YVJlZ2lzdHJ5LmFyYzg5X2dldF9tZXRhZGF0YV9zbGljZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmFyYzg5X2dldF9tZXRhZGF0YV9zbGljZToKICAgIGJ5dGVjXzAgLy8gIiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MTA1NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICBkdXAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgbGVuCiAgICBpbnRjXzMgLy8gMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50MTYKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50MTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MTA3NC0xMDc1CiAgICAvLyAjIFByZWNvbmRpdGlvbnMKICAgIC8vIHNlbGYuX2NoZWNrX2V4aXN0ZW5jZV9wcmVjb25kaXRpb25zKGFzc2V0X2lkKQogICAgc3dhcAogICAgY2FsbHN1YiBfY2hlY2tfZXhpc3RlbmNlX3ByZWNvbmRpdGlvbnMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MTA3NgogICAgLy8gbG9nZ2VkX2Fzc2VydChzaXplLmFzX3VpbnQ2NCgpIDw9IGNvbnN0LlBBR0VfU0laRSwgZXJyLkVYQ0VFRFNfUEFHRV9TSVpFKQogICAgYnRvaQogICAgZHVwCiAgICBpbnRjIDQgLy8gMTAwNwogICAgPD0KICAgIGJueiBhcmM4OV9nZXRfbWV0YWRhdGFfc2xpY2VfYWZ0ZXJfYXNzZXJ0QDMKICAgIGJ5dGVjIDUgLy8gIkVSUjpleGNlZWRzUGFnZVNpemUiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6ZXhjZWVkc1BhZ2VTaXplCgphcmM4OV9nZXRfbWV0YWRhdGFfc2xpY2VfYWZ0ZXJfYXNzZXJ0QDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjEwNzgKICAgIC8vIG9mZnNldC5hc191aW50NjQoKSArIHNpemUuYXNfdWludDY0KCkgPD0gc2VsZi5fZ2V0X21ldGFkYXRhX3NpemUoYXNzZXRfaWQpLAogICAgZGlnIDEKICAgIGJ0b2kKICAgIGR1cAogICAgYnVyeSA1CiAgICBkaWcgMQogICAgKwogICAgZGlnIDMKICAgIGNhbGxzdWIgX2dldF9tZXRhZGF0YV9zaXplCiAgICA8PQogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weToxMDc3LTEwODAKICAgIC8vIGxvZ2dlZF9hc3NlcnQoCiAgICAvLyAgICAgb2Zmc2V0LmFzX3VpbnQ2NCgpICsgc2l6ZS5hc191aW50NjQoKSA8PSBzZWxmLl9nZXRfbWV0YWRhdGFfc2l6ZShhc3NldF9pZCksCiAgICAvLyAgICAgZXJyLkVYQ0VFRFNfTUVUQURBVEFfU0laRSwKICAgIC8vICkKICAgIGJueiBhcmM4OV9nZXRfbWV0YWRhdGFfc2xpY2VfYWZ0ZXJfYXNzZXJ0QDUKICAgIGJ5dGVjIDE3IC8vICJFUlI6ZXhjZWVkc01ldGFkYXRhU2l6ZSIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpleGNlZWRzTWV0YWRhdGFTaXplCgphcmM4OV9nZXRfbWV0YWRhdGFfc2xpY2VfYWZ0ZXJfYXNzZXJ0QDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjEwODIKICAgIC8vIG1ldGFkYXRhX3NsaWNlID0gc2VsZi5hc3NldF9tZXRhZGF0YS5ib3goYXNzZXRfaWQpLmV4dHJhY3QoCiAgICBkaWcgMgogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weToxMDgzCiAgICAvLyBzdGFydF9pbmRleD1jb25zdC5JRFhfTUVUQURBVEEgKyBvZmZzZXQuYXNfdWludDY0KCksIGxlbmd0aD1zaXplLmFzX3VpbnQ2NCgpCiAgICBwdXNoaW50IDUxCiAgICBkaWcgNQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weToxMDgyLTEwODQKICAgIC8vIG1ldGFkYXRhX3NsaWNlID0gc2VsZi5hc3NldF9tZXRhZGF0YS5ib3goYXNzZXRfaWQpLmV4dHJhY3QoCiAgICAvLyAgICAgc3RhcnRfaW5kZXg9Y29uc3QuSURYX01FVEFEQVRBICsgb2Zmc2V0LmFzX3VpbnQ2NCgpLCBsZW5ndGg9c2l6ZS5hc191aW50NjQoKQogICAgLy8gKQogICAgZGlnIDIKICAgIGJveF9leHRyYWN0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjEwNTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMuYXNhX21ldGFkYXRhX3JlZ2lzdHJ5LmNvbnRyYWN0LkFzYU1ldGFkYXRhUmVnaXN0cnkuYXJjODlfZ2V0X21ldGFkYXRhX2hlYWRlcl9oYXNoW3JvdXRpbmddKCkgLT4gdm9pZDoKYXJjODlfZ2V0X21ldGFkYXRhX2hlYWRlcl9oYXNoOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weToxMDg3CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MTEwMi0xMTAzCiAgICAvLyAjIFByZWNvbmRpdGlvbnMKICAgIC8vIHNlbGYuX2NoZWNrX2V4aXN0ZW5jZV9wcmVjb25kaXRpb25zKGFzc2V0X2lkKQogICAgZHVwCiAgICBjYWxsc3ViIF9jaGVja19leGlzdGVuY2VfcHJlY29uZGl0aW9ucwogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weToxMTA1CiAgICAvLyByZXR1cm4gYWJpLkhhc2goc2VsZi5fY29tcHV0ZV9oZWFkZXJfaGFzaChhc3NldF9pZCkpCiAgICBjYWxsc3ViIF9jb21wdXRlX2hlYWRlcl9oYXNoCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCAzMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBieXRlcyB0byBiZSBsZW5ndGggMzIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MTA4NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzLmFzYV9tZXRhZGF0YV9yZWdpc3RyeS5jb250cmFjdC5Bc2FNZXRhZGF0YVJlZ2lzdHJ5LmFyYzg5X2dldF9tZXRhZGF0YV9wYWdlX2hhc2hbcm91dGluZ10oKSAtPiB2b2lkOgphcmM4OV9nZXRfbWV0YWRhdGFfcGFnZV9oYXNoOgogICAgYnl0ZWNfMCAvLyAiIgogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weToxMTA3CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjExMjQtMTEyNQogICAgLy8gIyBQcmVjb25kaXRpb25zCiAgICAvLyBzZWxmLl9jaGVja19leGlzdGVuY2VfcHJlY29uZGl0aW9ucyhhc3NldF9pZCkKICAgIGR1cAogICAgY2FsbHN1YiBfY2hlY2tfZXhpc3RlbmNlX3ByZWNvbmRpdGlvbnMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MjQ1CiAgICAvLyBuID0gc2VsZi5fZ2V0X21ldGFkYXRhX3NpemUoYXNhKQogICAgY2FsbHN1YiBfZ2V0X21ldGFkYXRhX3NpemUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdm1fbGlicmFyeS5weTozMAogICAgLy8gcmV0dXJuIChudW0gKyAoZGVuIC0gMSkpIC8vIGRlbgogICAgaW50YyA1IC8vIDEwMDYKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MjQ2CiAgICAvLyByZXR1cm4gY2VpbF9kaXYobnVtPW4sIGRlbj1VSW50NjQoY29uc3QuUEFHRV9TSVpFKSkKICAgIGludGMgNCAvLyAxMDA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXZtX2xpYnJhcnkucHk6MzAKICAgIC8vIHJldHVybiAobnVtICsgKGRlbiAtIDEpKSAvLyBkZW4KICAgIC8KICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weToxMTI3CiAgICAvLyBpZiB0b3RhbF9wYWdlcyA+IDA6CiAgICBieiBhcmM4OV9nZXRfbWV0YWRhdGFfcGFnZV9oYXNoX2Vsc2VfYm9keUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjExMjgKICAgIC8vIGxvZ2dlZF9hc3NlcnQocGFnZS5hc191aW50NjQoKSA8IHRvdGFsX3BhZ2VzLCBlcnIuUEFHRV9JRFhfSU5WQUxJRCkKICAgIGRpZyAxCiAgICBidG9pCiAgICBkdXAKICAgIGJ1cnkgNQogICAgZGlnIDEKICAgIDwKICAgIGJueiBhcmM4OV9nZXRfbWV0YWRhdGFfcGFnZV9oYXNoX2FmdGVyX2Fzc2VydEA0CiAgICBieXRlYyA5IC8vICJFUlI6cGFnZUlkeEludmFsaWQiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6cGFnZUlkeEludmFsaWQKCmFyYzg5X2dldF9tZXRhZGF0YV9wYWdlX2hhc2hfYWZ0ZXJfYXNzZXJ0QDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjExMzIKICAgIC8vIHBhZ2VfY29udGVudCA9IHNlbGYuX2dldF9tZXRhZGF0YV9wYWdlKGFzc2V0X2lkLCBwYWdlLmFzX3VpbnQ2NCgpKQogICAgZGlnIDIKICAgIGR1cAogICAgZGlnIDUKICAgIGR1cAogICAgY292ZXIgMwogICAgY2FsbHN1YiBfZ2V0X21ldGFkYXRhX3BhZ2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MTEzMwogICAgLy8gcGFnZV9oYXNoID0gc2VsZi5fY29tcHV0ZV9wYWdlX2hhc2goYXNzZXRfaWQsIHBhZ2UuYXNfdWludDY0KCksIHBhZ2VfY29udGVudCkKICAgIHN3YXAKICAgIGNvdmVyIDIKICAgIGNhbGxzdWIgX2NvbXB1dGVfcGFnZV9oYXNoCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjExMzQKICAgIC8vIHJldHVybiBhYmkuSGFzaChwYWdlX2hhc2gpCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCAzMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBieXRlcyB0byBiZSBsZW5ndGggMzIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MTEwNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgphcmM4OV9nZXRfbWV0YWRhdGFfcGFnZV9oYXNoX2Vsc2VfYm9keUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weToxMTMwCiAgICAvLyBsb2dnZWRfZXJyKGVyci5FTVBUWV9NRVRBREFUQSkKICAgIHB1c2hieXRlcyAiRVJSOmVtcHR5TWV0YWRhdGEiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6ZW1wdHlNZXRhZGF0YQoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc2FfbWV0YWRhdGFfcmVnaXN0cnkuY29udHJhY3QuQXNhTWV0YWRhdGFSZWdpc3RyeS5hcmM4OV9nZXRfbWV0YWRhdGFfaGFzaFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmFyYzg5X2dldF9tZXRhZGF0YV9oYXNoOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weToxMTM2CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MTE1MS0xMTUyCiAgICAvLyAjIFByZWNvbmRpdGlvbnMKICAgIC8vIHNlbGYuX2NoZWNrX2V4aXN0ZW5jZV9wcmVjb25kaXRpb25zKGFzc2V0X2lkKQogICAgZHVwCiAgICBjYWxsc3ViIF9jaGVja19leGlzdGVuY2VfcHJlY29uZGl0aW9ucwogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weToxMjQKICAgIC8vIHJldHVybiBzZWxmLmFzc2V0X21ldGFkYXRhLmJveChhc2EpLmV4dHJhY3QoCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjEyNQogICAgLy8gc3RhcnRfaW5kZXg9Y29uc3QuSURYX01FVEFEQVRBX0hBU0gsIGxlbmd0aD1jb25zdC5NRVRBREFUQV9IQVNIX1NJWkUKICAgIHB1c2hpbnRzIDMgMzIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MTI0LTEyNgogICAgLy8gcmV0dXJuIHNlbGYuYXNzZXRfbWV0YWRhdGEuYm94KGFzYSkuZXh0cmFjdCgKICAgIC8vICAgICBzdGFydF9pbmRleD1jb25zdC5JRFhfTUVUQURBVEFfSEFTSCwgbGVuZ3RoPWNvbnN0Lk1FVEFEQVRBX0hBU0hfU0laRQogICAgLy8gKQogICAgYm94X2V4dHJhY3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MTE1NAogICAgLy8gcmV0dXJuIGFiaS5IYXNoKHNlbGYuX2dldF9tZXRhZGF0YV9oYXNoKGFzc2V0X2lkKSkKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGJ5dGVzIHRvIGJlIGxlbmd0aCAzMgogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weToxMTM2CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMuYXNhX21ldGFkYXRhX3JlZ2lzdHJ5LmNvbnRyYWN0LkFzYU1ldGFkYXRhUmVnaXN0cnkuYXJjODlfZ2V0X21ldGFkYXRhX3N0cmluZ19ieV9rZXlbcm91dGluZ10oKSAtPiB2b2lkOgphcmM4OV9nZXRfbWV0YWRhdGFfc3RyaW5nX2J5X2tleToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MTE1NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzMgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weToxMTc1LTExNzYKICAgIC8vICMgUHJlY29uZGl0aW9ucwogICAgLy8gc2VsZi5fY2hlY2tfZXhpc3RlbmNlX3ByZWNvbmRpdGlvbnMoYXNzZXRfaWQpCiAgICBkaWcgMQogICAgY2FsbHN1YiBfY2hlY2tfZXhpc3RlbmNlX3ByZWNvbmRpdGlvbnMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MTE3OC0xMTgzCiAgICAvLyAjIEZldGNoIGtleSdzIHZhbHVlCiAgICAvLyAjIOKaoO+4jyBXQVJOSU5HOiBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgY2F1c2UgQVZNIHJ1bnRpbWUgZXJyb3I6CiAgICAvLyAjIC0gVGhlIHNob3J0IE1ldGFkYXRhIGlzIG5vdCBhIHZhbGlkIFVURi04IGVuY29kZWQgSlNPTiBvYmplY3QKICAgIC8vICMgLSBUaGUgdG9wLWxldmVsIGtleSBkb2VzIG5vdCBleGlzdAogICAgLy8gIyAtIFRoZSB0b3AtbGV2ZWwga2V5J3MgdmFsdWUgaXMgbm90IGEgSlNPTiBTdHJpbmcKICAgIC8vIG9iaiA9IHNlbGYuX2dldF9zaG9ydF9tZXRhZGF0YShhc3NldF9pZCkKICAgIHN3YXAKICAgIGNhbGxzdWIgX2dldF9zaG9ydF9tZXRhZGF0YQogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weToxMTg0CiAgICAvLyB2YWx1ZSA9IG9wLkpzb25SZWYuanNvbl9zdHJpbmcob2JqLCBrZXkuYnl0ZXMpCiAgICBzd2FwCiAgICBqc29uX3JlZiBKU09OU3RyaW5nCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MTE4Ni0xMTg3CiAgICAvLyAjIFBvc3Rjb25kaXRpb25zCiAgICAvLyBsb2dnZWRfYXNzZXJ0KHZhbHVlLmxlbmd0aCA8PSBjb25zdC5QQUdFX1NJWkUsIGVyci5FWENFRURTX1BBR0VfU0laRSkKICAgIGxlbgogICAgZHVwCiAgICBpbnRjIDQgLy8gMTAwNwogICAgPD0KICAgIGJueiBhcmM4OV9nZXRfbWV0YWRhdGFfc3RyaW5nX2J5X2tleV9hZnRlcl9hc3NlcnRAMwogICAgYnl0ZWMgNSAvLyAiRVJSOmV4Y2VlZHNQYWdlU2l6ZSIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpleGNlZWRzUGFnZVNpemUKCmFyYzg5X2dldF9tZXRhZGF0YV9zdHJpbmdfYnlfa2V5X2FmdGVyX2Fzc2VydEAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weToxMTU2CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGR1cAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMuYXNhX21ldGFkYXRhX3JlZ2lzdHJ5LmNvbnRyYWN0LkFzYU1ldGFkYXRhUmVnaXN0cnkuYXJjODlfZ2V0X21ldGFkYXRhX3VpbnQ2NF9ieV9rZXlbcm91dGluZ10oKSAtPiB2b2lkOgphcmM4OV9nZXRfbWV0YWRhdGFfdWludDY0X2J5X2tleToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MTE5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzMgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weToxMjEwLTEyMTEKICAgIC8vICMgUHJlY29uZGl0aW9ucwogICAgLy8gc2VsZi5fY2hlY2tfZXhpc3RlbmNlX3ByZWNvbmRpdGlvbnMoYXNzZXRfaWQpCiAgICBkaWcgMQogICAgY2FsbHN1YiBfY2hlY2tfZXhpc3RlbmNlX3ByZWNvbmRpdGlvbnMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MTIxMy0xMjE4CiAgICAvLyAjIEZldGNoIGtleSdzIHZhbHVlCiAgICAvLyAjIOKaoO+4jyBXQVJOSU5HOiBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgY2F1c2UgQVZNIHJ1bnRpbWUgZXJyb3I6CiAgICAvLyAjIC0gVGhlIHNob3J0IE1ldGFkYXRhIGlzIG5vdCBhIHZhbGlkIFVURi04IGVuY29kZWQgSlNPTiBvYmplY3QKICAgIC8vICMgLSBUaGUgdG9wLWxldmVsIGtleSBkb2VzIG5vdCBleGlzdAogICAgLy8gIyAtIFRoZSB0b3AtbGV2ZWwga2V5J3MgdmFsdWUgaXMgbm90IGEgSlNPTiBVaW50NjQKICAgIC8vIG9iaiA9IHNlbGYuX2dldF9zaG9ydF9tZXRhZGF0YShhc3NldF9pZCkKICAgIHN3YXAKICAgIGNhbGxzdWIgX2dldF9zaG9ydF9tZXRhZGF0YQogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weToxMjE5CiAgICAvLyB2YWx1ZSA9IG9wLkpzb25SZWYuanNvbl91aW50NjQob2JqLCBrZXkuYnl0ZXMpCiAgICBzd2FwCiAgICBqc29uX3JlZiBKU09OVWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjExOTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgaXRvYgogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc2FfbWV0YWRhdGFfcmVnaXN0cnkuY29udHJhY3QuQXNhTWV0YWRhdGFSZWdpc3RyeS5hcmM4OV9nZXRfbWV0YWRhdGFfb2JqZWN0X2J5X2tleVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmFyYzg5X2dldF9tZXRhZGF0YV9vYmplY3RfYnlfa2V5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weToxMjIzCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMyAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjEyNDItMTI0MwogICAgLy8gIyBQcmVjb25kaXRpb25zCiAgICAvLyBzZWxmLl9jaGVja19leGlzdGVuY2VfcHJlY29uZGl0aW9ucyhhc3NldF9pZCkKICAgIGRpZyAxCiAgICBjYWxsc3ViIF9jaGVja19leGlzdGVuY2VfcHJlY29uZGl0aW9ucwogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weToxMjQ1LTEyNTAKICAgIC8vICMgRmV0Y2gga2V5J3MgdmFsdWUKICAgIC8vICMg4pqg77iPIFdBUk5JTkc6IFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBjYXVzZSBBVk0gcnVudGltZSBlcnJvcjoKICAgIC8vICMgLSBUaGUgc2hvcnQgTWV0YWRhdGEgaXMgbm90IGEgdmFsaWQgVVRGLTggZW5jb2RlZCBKU09OIG9iamVjdAogICAgLy8gIyAtIFRoZSB0b3AtbGV2ZWwga2V5IGRvZXMgbm90IGV4aXN0CiAgICAvLyAjIC0gVGhlIHRvcC1sZXZlbCBrZXkncyB2YWx1ZSBpcyBub3QgYSBKU09OIE9iamVjdAogICAgLy8gb2JqID0gc2VsZi5fZ2V0X3Nob3J0X21ldGFkYXRhKGFzc2V0X2lkKQogICAgc3dhcAogICAgY2FsbHN1YiBfZ2V0X3Nob3J0X21ldGFkYXRhCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjEyNTEKICAgIC8vIHZhbHVlID0gb3AuSnNvblJlZi5qc29uX29iamVjdChvYmosIGtleS5ieXRlcykKICAgIHN3YXAKICAgIGpzb25fcmVmIEpTT05PYmplY3QKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weToxMjUzLTEyNTQKICAgIC8vICMgUG9zdGNvbmRpdGlvbnMKICAgIC8vIGxvZ2dlZF9hc3NlcnQodmFsdWUubGVuZ3RoIDw9IGNvbnN0LlBBR0VfU0laRSwgZXJyLkVYQ0VFRFNfUEFHRV9TSVpFKQogICAgbGVuCiAgICBkdXAKICAgIGludGMgNCAvLyAxMDA3CiAgICA8PQogICAgYm56IGFyYzg5X2dldF9tZXRhZGF0YV9vYmplY3RfYnlfa2V5X2FmdGVyX2Fzc2VydEAzCiAgICBieXRlYyA1IC8vICJFUlI6ZXhjZWVkc1BhZ2VTaXplIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOmV4Y2VlZHNQYWdlU2l6ZQoKYXJjODlfZ2V0X21ldGFkYXRhX29iamVjdF9ieV9rZXlfYWZ0ZXJfYXNzZXJ0QDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjEyMjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgZHVwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZGlnIDIKICAgIGNvbmNhdAogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc2FfbWV0YWRhdGFfcmVnaXN0cnkuY29udHJhY3QuQXNhTWV0YWRhdGFSZWdpc3RyeS5hcmM4OV9nZXRfbWV0YWRhdGFfYjY0X2J5dGVzX2J5X2tleVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmFyYzg5X2dldF9tZXRhZGF0YV9iNjRfYnl0ZXNfYnlfa2V5OgogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjXzAgLy8gIiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MTI1OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICBkdXAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMyAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MTI3NS0xMjc2CiAgICAvLyAjIFByZWNvbmRpdGlvbnMKICAgIC8vIHNlbGYuX2NoZWNrX2V4aXN0ZW5jZV9wcmVjb25kaXRpb25zKGFzc2V0X2lkKQogICAgc3dhcAogICAgY2FsbHN1YiBfY2hlY2tfZXhpc3RlbmNlX3ByZWNvbmRpdGlvbnMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MTI3OAogICAgLy8gYjY0X2VuY29kaW5nLmFzX3VpbnQ2NCgpIDw9IGVudW1zLkI2NF9TVERfRU5DT0RJTkcsIGVyci5CNjRfRU5DT0RJTkdfSU5WQUxJRAogICAgYnRvaQogICAgZHVwCiAgICBpbnRjXzAgLy8gMQogICAgPD0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MTI3Ny0xMjc5CiAgICAvLyBsb2dnZWRfYXNzZXJ0KAogICAgLy8gICAgIGI2NF9lbmNvZGluZy5hc191aW50NjQoKSA8PSBlbnVtcy5CNjRfU1REX0VOQ09ESU5HLCBlcnIuQjY0X0VOQ09ESU5HX0lOVkFMSUQKICAgIC8vICkKICAgIGJueiBhcmM4OV9nZXRfbWV0YWRhdGFfYjY0X2J5dGVzX2J5X2tleV9hZnRlcl9hc3NlcnRAMwogICAgcHVzaGJ5dGVzICJFUlI6YjY0RW5jb2RpbmdJbnZhbGlkIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOmI2NEVuY29kaW5nSW52YWxpZAoKYXJjODlfZ2V0X21ldGFkYXRhX2I2NF9ieXRlc19ieV9rZXlfYWZ0ZXJfYXNzZXJ0QDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjEyODEtMTI4NgogICAgLy8gIyBGZXRjaCBrZXkncyB2YWx1ZQogICAgLy8gIyDimqDvuI8gV0FSTklORzogVGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGNhdXNlIEFWTSBydW50aW1lIGVycm9yOgogICAgLy8gIyAtIFRoZSBzaG9ydCBNZXRhZGF0YSBpcyBub3QgYSB2YWxpZCBVVEYtOCBlbmNvZGVkIEpTT04gb2JqZWN0CiAgICAvLyAjIC0gVGhlIHRvcC1sZXZlbCBrZXkgZG9lcyBub3QgZXhpc3QKICAgIC8vICMgLSBUaGUgdG9wLWxldmVsIGtleSdzIHZhbHVlIGlzIG5vdCBhIEpTT04gU3RyaW5nCiAgICAvLyBvYmogPSBzZWxmLl9nZXRfc2hvcnRfbWV0YWRhdGEoYXNzZXRfaWQpCiAgICBkaWcgMgogICAgY2FsbHN1YiBfZ2V0X3Nob3J0X21ldGFkYXRhCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjEyODcKICAgIC8vIHZhbHVlID0gb3AuSnNvblJlZi5qc29uX3N0cmluZyhvYmosIGtleS5ieXRlcykKICAgIGRpZyAyCiAgICBqc29uX3JlZiBKU09OU3RyaW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjEyODktMTI5MwogICAgLy8gIyBEZWNvZGUgdmFsdWUKICAgIC8vICMg4pqg77iPIFdBUk5JTkc6IFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBjYXVzZSBBVk0gcnVudGltZSBlcnJvcjoKICAgIC8vICMgLSBUaGUgdG9wLWxldmVsIGtleSdzIHZhbHVlIGlzIG5vdCBhIHZhbGlkIGJhc2U2NC1lbmNvZGluZyBzdHJpbmcgZm9yCiAgICAvLyAjIHRoZSBjaG9zZW4gZW5jb2RpbmcuCiAgICAvLyBpZiBiNjRfZW5jb2RpbmcuYXNfdWludDY0KCkgPT0gZW51bXMuQjY0X1VSTF9FTkNPRElORzoKICAgIGRpZyAxCiAgICBibnogYXJjODlfZ2V0X21ldGFkYXRhX2I2NF9ieXRlc19ieV9rZXlfZWxzZV9ib2R5QDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MTI5NAogICAgLy8gZGVjb2RlZF92YWx1ZSA9IG9wLmJhc2U2NF9kZWNvZGUob3AuQmFzZTY0LlVSTEVuY29kaW5nLCB2YWx1ZSkKICAgIGJhc2U2NF9kZWNvZGUgVVJMRW5jb2RpbmcKICAgIGJ1cnkgNQoKYXJjODlfZ2V0X21ldGFkYXRhX2I2NF9ieXRlc19ieV9rZXlfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weToxMjk4LTEyOTkKICAgIC8vICMgUG9zdGNvbmRpdGlvbnMKICAgIC8vIGxvZ2dlZF9hc3NlcnQoZGVjb2RlZF92YWx1ZS5sZW5ndGggPD0gY29uc3QuUEFHRV9TSVpFLCBlcnIuRVhDRUVEU19QQUdFX1NJWkUpCiAgICBkaWcgNAogICAgbGVuCiAgICBkdXAKICAgIGJ1cnkgNQogICAgaW50YyA0IC8vIDEwMDcKICAgIDw9CiAgICBibnogYXJjODlfZ2V0X21ldGFkYXRhX2I2NF9ieXRlc19ieV9rZXlfYWZ0ZXJfYXNzZXJ0QDgKICAgIGJ5dGVjIDUgLy8gIkVSUjpleGNlZWRzUGFnZVNpemUiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6ZXhjZWVkc1BhZ2VTaXplCgphcmM4OV9nZXRfbWV0YWRhdGFfYjY0X2J5dGVzX2J5X2tleV9hZnRlcl9hc3NlcnRAODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MTI1OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBkaWcgMwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGRpZyA1CiAgICBjb25jYXQKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCmFyYzg5X2dldF9tZXRhZGF0YV9iNjRfYnl0ZXNfYnlfa2V5X2Vsc2VfYm9keUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weToxMjk2CiAgICAvLyBkZWNvZGVkX3ZhbHVlID0gb3AuYmFzZTY0X2RlY29kZShvcC5CYXNlNjQuU3RkRW5jb2RpbmcsIHZhbHVlKQogICAgYmFzZTY0X2RlY29kZSBTdGRFbmNvZGluZwogICAgYnVyeSA1CiAgICBiIGFyYzg5X2dldF9tZXRhZGF0YV9iNjRfYnl0ZXNfYnlfa2V5X2FmdGVyX2lmX2Vsc2VANgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc2FfbWV0YWRhdGFfcmVnaXN0cnkuY29udHJhY3QuQXNhTWV0YWRhdGFSZWdpc3RyeS53aXRoZHJhd19iYWxhbmNlX2V4Y2Vzc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CndpdGhkcmF3X2JhbGFuY2VfZXhjZXNzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weToxMzE5CiAgICAvLyBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLmJhbGFuY2UKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IGZ1bmRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weToxMzIwCiAgICAvLyAtIEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MubWluX2JhbGFuY2UKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdE1pbkJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IGZ1bmRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weToxMzE5LTEzMjAKICAgIC8vIEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MuYmFsYW5jZQogICAgLy8gLSBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLm1pbl9iYWxhbmNlCiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjEzMjItMTMyNQogICAgLy8gaXR4bi5QYXltZW50KAogICAgLy8gICAgIHJlY2VpdmVyPUdsb2JhbC5jcmVhdG9yX2FkZHJlc3MsCiAgICAvLyAgICAgYW1vdW50PWV4Y2Vzc19iYWxhbmNlLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weToxMzIzCiAgICAvLyByZWNlaXZlcj1HbG9iYWwuY3JlYXRvcl9hZGRyZXNzLAogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weToxMzIyCiAgICAvLyBpdHhuLlBheW1lbnQoCiAgICBpbnRjXzAgLy8gcGF5CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzEgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MTMyMi0xMzI1CiAgICAvLyBpdHhuLlBheW1lbnQoCiAgICAvLyAgICAgcmVjZWl2ZXI9R2xvYmFsLmNyZWF0b3JfYWRkcmVzcywKICAgIC8vICAgICBhbW91bnQ9ZXhjZXNzX2JhbGFuY2UsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weToxMzEwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMuYXNhX21ldGFkYXRhX3JlZ2lzdHJ5LmNvbnRyYWN0LkFzYU1ldGFkYXRhUmVnaXN0cnkuX3NldF9pcnJldmVyc2libGVfZmxhZ192YWx1ZShhc2E6IHVpbnQ2NCwgZmxhZzogdWludDY0KSAtPiB2b2lkOgpfc2V0X2lycmV2ZXJzaWJsZV9mbGFnX3ZhbHVlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weToxMTUKICAgIC8vIGRlZiBfc2V0X2lycmV2ZXJzaWJsZV9mbGFnX3ZhbHVlKHNlbGYsIGFzYTogQXNzZXQsIGZsYWc6IFVJbnQ2NCkgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTo5OQogICAgLy8gcmV0dXJuIHNlbGYuYXNzZXRfbWV0YWRhdGEuYm94KGFzYSkuZXh0cmFjdCgKICAgIGZyYW1lX2RpZyAtMgogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTo5OS0xMDIKICAgIC8vIHJldHVybiBzZWxmLmFzc2V0X21ldGFkYXRhLmJveChhc2EpLmV4dHJhY3QoCiAgICAvLyAgICAgc3RhcnRfaW5kZXg9Y29uc3QuSURYX0lSUkVWRVJTSUJMRV9GTEFHUywKICAgIC8vICAgICBsZW5ndGg9Y29uc3QuSVJSRVZFUlNJQkxFX0ZMQUdTX1NJWkUsCiAgICAvLyApCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MTAwCiAgICAvLyBzdGFydF9pbmRleD1jb25zdC5JRFhfSVJSRVZFUlNJQkxFX0ZMQUdTLAogICAgaW50Y18zIC8vIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MTAxCiAgICAvLyBsZW5ndGg9Y29uc3QuSVJSRVZFUlNJQkxFX0ZMQUdTX1NJWkUsCiAgICBpbnRjXzAgLy8gMQogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTo5OS0xMDIKICAgIC8vIHJldHVybiBzZWxmLmFzc2V0X21ldGFkYXRhLmJveChhc2EpLmV4dHJhY3QoCiAgICAvLyAgICAgc3RhcnRfaW5kZXg9Y29uc3QuSURYX0lSUkVWRVJTSUJMRV9GTEFHUywKICAgIC8vICAgICBsZW5ndGg9Y29uc3QuSVJSRVZFUlNJQkxFX0ZMQUdTX1NJWkUsCiAgICAvLyApCiAgICBib3hfZXh0cmFjdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weToxMTgKICAgIC8vIGNvbnN0LkJJVF9SSUdIVE1PU1RfSVJSX0ZMQUcgLSBmbGFnLAogICAgcHVzaGludCA3CiAgICBmcmFtZV9kaWcgLTEKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MTE5CiAgICAvLyBUcnVlLCAgIyBub3FhOiBGQlQwMDMKICAgIGludGNfMCAvLyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjExNi0xMjAKICAgIC8vIHVwZGF0ZWRfZmxhZ3MgPSBvcC5zZXRiaXRfYnl0ZXMoCiAgICAvLyAgICAgc2VsZi5fZ2V0X2lycmV2ZXJzaWJsZV9mbGFncyhhc2EpLAogICAgLy8gICAgIGNvbnN0LkJJVF9SSUdIVE1PU1RfSVJSX0ZMQUcgLSBmbGFnLAogICAgLy8gICAgIFRydWUsICAjIG5vcWE6IEZCVDAwMwogICAgLy8gKQogICAgc2V0Yml0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjEwNgogICAgLy8gc3RhcnRfaW5kZXg9Y29uc3QuSURYX0lSUkVWRVJTSUJMRV9GTEFHUywgdmFsdWU9ZmxhZ3MKICAgIGludGNfMyAvLyAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjEwNS0xMDcKICAgIC8vIHNlbGYuYXNzZXRfbWV0YWRhdGEuYm94KGFzYSkucmVwbGFjZSgKICAgIC8vICAgICBzdGFydF9pbmRleD1jb25zdC5JRFhfSVJSRVZFUlNJQkxFX0ZMQUdTLCB2YWx1ZT1mbGFncwogICAgLy8gKQogICAgc3dhcAogICAgYm94X3JlcGxhY2UKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc2FfbWV0YWRhdGFfcmVnaXN0cnkuY29udHJhY3QuQXNhTWV0YWRhdGFSZWdpc3RyeS5fZ2V0X21ldGFkYXRhX3NpemUoYXNhOiB1aW50NjQpIC0+IHVpbnQ2NDoKX2dldF9tZXRhZGF0YV9zaXplOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weToxNjEKICAgIC8vIGRlZiBfZ2V0X21ldGFkYXRhX3NpemUoc2VsZiwgYXNhOiBBc3NldCkgLT4gVUludDY0OgogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjE2MgogICAgLy8gcmV0dXJuIHNlbGYuYXNzZXRfbWV0YWRhdGEuYm94KGFzYSkubGVuZ3RoIC0gY29uc3QuSEVBREVSX1NJWkUKICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgYm94X2xlbgogICAgYXNzZXJ0IC8vIGNoZWNrIEJveCBleGlzdHMKICAgIHB1c2hpbnQgNTEKICAgIC0KICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc2FfbWV0YWRhdGFfcmVnaXN0cnkuY29udHJhY3QuQXNhTWV0YWRhdGFSZWdpc3RyeS5fYXBwZW5kX3BheWxvYWQoYXNhOiB1aW50NjQsIHBheWxvYWQ6IGJ5dGVzKSAtPiB2b2lkOgpfYXBwZW5kX3BheWxvYWQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjE2NAogICAgLy8gZGVmIF9hcHBlbmRfcGF5bG9hZChzZWxmLCBhc2E6IEFzc2V0LCBwYXlsb2FkOiBCeXRlcykgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weToxNjUKICAgIC8vIG9sZF9hc3NldF9tZXRhZGF0YV9ib3hfc2l6ZSA9IHNlbGYuYXNzZXRfbWV0YWRhdGEuYm94KGFzYSkubGVuZ3RoCiAgICBmcmFtZV9kaWcgLTIKICAgIGl0b2IKICAgIGR1cAogICAgYm94X2xlbgogICAgYXNzZXJ0IC8vIGNoZWNrIEJveCBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MTY3CiAgICAvLyBuZXdfc2l6ZT1vbGRfYXNzZXRfbWV0YWRhdGFfYm94X3NpemUgKyBwYXlsb2FkLmxlbmd0aAogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGRpZyAxCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjE2Ni0xNjgKICAgIC8vIHNlbGYuYXNzZXRfbWV0YWRhdGEuYm94KGFzYSkucmVzaXplKAogICAgLy8gICAgIG5ld19zaXplPW9sZF9hc3NldF9tZXRhZGF0YV9ib3hfc2l6ZSArIHBheWxvYWQubGVuZ3RoCiAgICAvLyApCiAgICBkaWcgMgogICAgc3dhcAogICAgYm94X3Jlc2l6ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weToxNjktMTcxCiAgICAvLyBzZWxmLmFzc2V0X21ldGFkYXRhLmJveChhc2EpLnJlcGxhY2UoCiAgICAvLyAgICAgc3RhcnRfaW5kZXg9b2xkX2Fzc2V0X21ldGFkYXRhX2JveF9zaXplLCB2YWx1ZT1wYXlsb2FkCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9yZXBsYWNlCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNhX21ldGFkYXRhX3JlZ2lzdHJ5LmNvbnRyYWN0LkFzYU1ldGFkYXRhUmVnaXN0cnkuX3NldF9tZXRhZGF0YV9wYXlsb2FkKGFzYTogdWludDY0LCBtZXRhZGF0YV9zaXplOiB1aW50NjQsIHBheWxvYWQ6IGJ5dGVzKSAtPiB2b2lkOgpfc2V0X21ldGFkYXRhX3BheWxvYWQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjIwNi0yMDgKICAgIC8vIGRlZiBfc2V0X21ldGFkYXRhX3BheWxvYWQoCiAgICAvLyAgICAgc2VsZiwgYXNhOiBBc3NldCwgbWV0YWRhdGFfc2l6ZTogVUludDY0LCBwYXlsb2FkOiBCeXRlcwogICAgLy8gKSAtPiBOb25lOgogICAgcHJvdG8gMyAwCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMCAvLyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjIwOS0yMTAKICAgIC8vICMgRXJhc2UgZXhpc3RpbmcgbWV0YWRhdGEgcGF5bG9hZAogICAgLy8gc2VsZi5hc3NldF9tZXRhZGF0YS5ib3goYXNhKS5yZXNpemUobmV3X3NpemU9VUludDY0KGNvbnN0LkhFQURFUl9TSVpFKSkKICAgIGZyYW1lX2RpZyAtMwogICAgaXRvYgogICAgZHVwCiAgICBwdXNoaW50IDUxCiAgICBib3hfcmVzaXplCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjIxMi0yMTMKICAgIC8vICMgQXBwZW5kIHByb3ZpZGVkIHBheWxvYWQKICAgIC8vIHNlbGYuX2FwcGVuZF9wYXlsb2FkKGFzYSwgcGF5bG9hZCkKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIF9hcHBlbmRfcGF5bG9hZAogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weToyMTUKICAgIC8vIHNlbGYuX2dldF9tZXRhZGF0YV9zaXplKGFzYSkgPD0gbWV0YWRhdGFfc2l6ZSwgZXJyLlBBWUxPQURfT1ZFUkZMT1cKICAgIGZyYW1lX2RpZyAtMwogICAgY2FsbHN1YiBfZ2V0X21ldGFkYXRhX3NpemUKICAgIGZyYW1lX2RpZyAtMgogICAgPD0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MjE0LTIxNgogICAgLy8gbG9nZ2VkX2Fzc2VydCgKICAgIC8vICAgICBzZWxmLl9nZXRfbWV0YWRhdGFfc2l6ZShhc2EpIDw9IG1ldGFkYXRhX3NpemUsIGVyci5QQVlMT0FEX09WRVJGTE9XCiAgICAvLyApCiAgICBibnogX3NldF9tZXRhZGF0YV9wYXlsb2FkX2FmdGVyX2Fzc2VydEAyCiAgICBieXRlYyAxMCAvLyAiRVJSOnBheWxvYWRPdmVyZmxvdyIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpwYXlsb2FkT3ZlcmZsb3cKCl9zZXRfbWV0YWRhdGFfcGF5bG9hZF9hZnRlcl9hc3NlcnRAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MjE4LTIxOQogICAgLy8gIyBBcHBlbmQgc3RhZ2VkIGV4dHJhIHBheWxvYWQgKGluIHRoZSBzYW1lIEdyb3VwLCBpZiBhbnkpCiAgICAvLyBncm91cF9zaXplID0gR2xvYmFsLmdyb3VwX3NpemUKICAgIGdsb2JhbCBHcm91cFNpemUKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weToyMjAKICAgIC8vIGdyb3VwX2luZGV4ID0gVHhuLmdyb3VwX2luZGV4CiAgICB0eG4gR3JvdXBJbmRleAogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weToyMjEKICAgIC8vIGZvciBpZHggaW4gdXJhbmdlKGdyb3VwX2luZGV4ICsgMSwgZ3JvdXBfc2l6ZSk6CiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAyCgpfc2V0X21ldGFkYXRhX3BheWxvYWRfZm9yX2hlYWRlckAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weToyMjEKICAgIC8vIGZvciBpZHggaW4gdXJhbmdlKGdyb3VwX2luZGV4ICsgMSwgZ3JvdXBfc2l6ZSk6CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDEKICAgIDwKICAgIGJ6IF9zZXRfbWV0YWRhdGFfcGF5bG9hZF9hZnRlcl9mb3JAMTIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MTg3CiAgICAvLyB0eG4udHlwZSA9PSBUcmFuc2FjdGlvblR5cGUuQXBwbGljYXRpb25DYWxsCiAgICBmcmFtZV9kaWcgMgogICAgZ3R4bnMgVHlwZUVudW0KICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weToxODctMTg5CiAgICAvLyB0eG4udHlwZSA9PSBUcmFuc2FjdGlvblR5cGUuQXBwbGljYXRpb25DYWxsCiAgICAvLyBhbmQgdHhuLmFwcF9pZCA9PSBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZAogICAgLy8gYW5kIHR4bi5vbl9jb21wbGV0aW9uID09IE9uQ29tcGxldGVBY3Rpb24uTm9PcAogICAgYnogX3NldF9tZXRhZGF0YV9wYXlsb2FkX2Jvb2xfZmFsc2VAMjEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MTg4CiAgICAvLyBhbmQgdHhuLmFwcF9pZCA9PSBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZAogICAgZnJhbWVfZGlnIDIKICAgIGd0eG5zIEFwcGxpY2F0aW9uSUQKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25JRAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MTg3LTE4OQogICAgLy8gdHhuLnR5cGUgPT0gVHJhbnNhY3Rpb25UeXBlLkFwcGxpY2F0aW9uQ2FsbAogICAgLy8gYW5kIHR4bi5hcHBfaWQgPT0gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25faWQKICAgIC8vIGFuZCB0eG4ub25fY29tcGxldGlvbiA9PSBPbkNvbXBsZXRlQWN0aW9uLk5vT3AKICAgIGJ6IF9zZXRfbWV0YWRhdGFfcGF5bG9hZF9ib29sX2ZhbHNlQDIxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjE4OQogICAgLy8gYW5kIHR4bi5vbl9jb21wbGV0aW9uID09IE9uQ29tcGxldGVBY3Rpb24uTm9PcAogICAgZnJhbWVfZGlnIDIKICAgIGd0eG5zIE9uQ29tcGxldGlvbgogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weToxODctMTg5CiAgICAvLyB0eG4udHlwZSA9PSBUcmFuc2FjdGlvblR5cGUuQXBwbGljYXRpb25DYWxsCiAgICAvLyBhbmQgdHhuLmFwcF9pZCA9PSBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZAogICAgLy8gYW5kIHR4bi5vbl9jb21wbGV0aW9uID09IE9uQ29tcGxldGVBY3Rpb24uTm9PcAogICAgYm56IF9zZXRfbWV0YWRhdGFfcGF5bG9hZF9ib29sX2ZhbHNlQDIxCiAgICBpbnRjXzAgLy8gMQoKX3NldF9tZXRhZGF0YV9wYXlsb2FkX2Jvb2xfbWVyZ2VAMjI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjE5NC0xOTcKICAgIC8vIHNlbGYuX2lzX3JlZ2lzdHJ5X2NhbGwodHhuKQogICAgLy8gYW5kIHR4bi5hcHBfYXJncyhjb25zdC5BUkM0X01FVEhPRF9TRUxFQ1RPUl9BUkcpCiAgICAvLyA9PSBhcmM0LmFyYzRfc2lnbmF0dXJlKEFyYzg5SW50ZXJmYWNlLmFyYzg5X2V4dHJhX3BheWxvYWQpCiAgICAvLyBhbmQgdHhuLmFwcF9hcmdzKGNvbnN0LkFSQzg5X0VYVFJBX1BBWUxPQURfQVJHX0FTU0VUX0lEKSA9PSBvcC5pdG9iKGFzYS5pZCkKICAgIGJ6IF9zZXRfbWV0YWRhdGFfcGF5bG9hZF9ib29sX2ZhbHNlQDI2CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjE5NQogICAgLy8gYW5kIHR4bi5hcHBfYXJncyhjb25zdC5BUkM0X01FVEhPRF9TRUxFQ1RPUl9BUkcpCiAgICBmcmFtZV9kaWcgMgogICAgaW50Y18xIC8vIDAKICAgIGd0eG5zYXMgQXBwbGljYXRpb25BcmdzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjE5NgogICAgLy8gPT0gYXJjNC5hcmM0X3NpZ25hdHVyZShBcmM4OUludGVyZmFjZS5hcmM4OV9leHRyYV9wYXlsb2FkKQogICAgYnl0ZWMgMTEgLy8gbWV0aG9kICJhcmM4OV9leHRyYV9wYXlsb2FkKHVpbnQ2NCxieXRlW10pdm9pZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MTk1LTE5NgogICAgLy8gYW5kIHR4bi5hcHBfYXJncyhjb25zdC5BUkM0X01FVEhPRF9TRUxFQ1RPUl9BUkcpCiAgICAvLyA9PSBhcmM0LmFyYzRfc2lnbmF0dXJlKEFyYzg5SW50ZXJmYWNlLmFyYzg5X2V4dHJhX3BheWxvYWQpCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weToxOTQtMTk3CiAgICAvLyBzZWxmLl9pc19yZWdpc3RyeV9jYWxsKHR4bikKICAgIC8vIGFuZCB0eG4uYXBwX2FyZ3MoY29uc3QuQVJDNF9NRVRIT0RfU0VMRUNUT1JfQVJHKQogICAgLy8gPT0gYXJjNC5hcmM0X3NpZ25hdHVyZShBcmM4OUludGVyZmFjZS5hcmM4OV9leHRyYV9wYXlsb2FkKQogICAgLy8gYW5kIHR4bi5hcHBfYXJncyhjb25zdC5BUkM4OV9FWFRSQV9QQVlMT0FEX0FSR19BU1NFVF9JRCkgPT0gb3AuaXRvYihhc2EuaWQpCiAgICBieiBfc2V0X21ldGFkYXRhX3BheWxvYWRfYm9vbF9mYWxzZUAyNgogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weToxOTcKICAgIC8vIGFuZCB0eG4uYXBwX2FyZ3MoY29uc3QuQVJDODlfRVhUUkFfUEFZTE9BRF9BUkdfQVNTRVRfSUQpID09IG9wLml0b2IoYXNhLmlkKQogICAgZnJhbWVfZGlnIDIKICAgIGludGNfMCAvLyAxCiAgICBndHhuc2FzIEFwcGxpY2F0aW9uQXJncwogICAgZnJhbWVfZGlnIDMKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjE5NC0xOTcKICAgIC8vIHNlbGYuX2lzX3JlZ2lzdHJ5X2NhbGwodHhuKQogICAgLy8gYW5kIHR4bi5hcHBfYXJncyhjb25zdC5BUkM0X01FVEhPRF9TRUxFQ1RPUl9BUkcpCiAgICAvLyA9PSBhcmM0LmFyYzRfc2lnbmF0dXJlKEFyYzg5SW50ZXJmYWNlLmFyYzg5X2V4dHJhX3BheWxvYWQpCiAgICAvLyBhbmQgdHhuLmFwcF9hcmdzKGNvbnN0LkFSQzg5X0VYVFJBX1BBWUxPQURfQVJHX0FTU0VUX0lEKSA9PSBvcC5pdG9iKGFzYS5pZCkKICAgIGJ6IF9zZXRfbWV0YWRhdGFfcGF5bG9hZF9ib29sX2ZhbHNlQDI2CiAgICBpbnRjXzAgLy8gMQoKX3NldF9tZXRhZGF0YV9wYXlsb2FkX2Jvb2xfbWVyZ2VAMjc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjIyMwogICAgLy8gaWYgc2VsZi5faXNfZXh0cmFfcGF5bG9hZF9jYWxsKGFzYSwgdHhuKToKICAgIGJ6IF9zZXRfbWV0YWRhdGFfcGF5bG9hZF9hZnRlcl9pZl9lbHNlQDEwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjIwMS0yMDQKICAgIC8vICMgVGhpcyBzdWJyb3V0aW5lIGFzc3VtZXMgdHhuIGlzIGFscmVhZHkgdmFsaWRhdGVkIGFzIGFuIGV4dHJhIHBheWxvYWQgdHhuCiAgICAvLyByZXR1cm4gYXJjNC5EeW5hbWljQnl0ZXMuZnJvbV9ieXRlcygKICAgIC8vICAgICB0eG4uYXBwX2FyZ3MoY29uc3QuQVJDODlfRVhUUkFfUEFZTE9BRF9BUkdfUEFZTE9BRCkKICAgIC8vICkubmF0aXZlCiAgICBmcmFtZV9kaWcgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weToyMDMKICAgIC8vIHR4bi5hcHBfYXJncyhjb25zdC5BUkM4OV9FWFRSQV9QQVlMT0FEX0FSR19QQVlMT0FEKQogICAgaW50Y18zIC8vIDIKICAgIGd0eG5zYXMgQXBwbGljYXRpb25BcmdzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjIwMS0yMDQKICAgIC8vICMgVGhpcyBzdWJyb3V0aW5lIGFzc3VtZXMgdHhuIGlzIGFscmVhZHkgdmFsaWRhdGVkIGFzIGFuIGV4dHJhIHBheWxvYWQgdHhuCiAgICAvLyByZXR1cm4gYXJjNC5EeW5hbWljQnl0ZXMuZnJvbV9ieXRlcygKICAgIC8vICAgICB0eG4uYXBwX2FyZ3MoY29uc3QuQVJDODlfRVhUUkFfUEFZTE9BRF9BUkdfUEFZTE9BRCkKICAgIC8vICkubmF0aXZlCiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MjI2CiAgICAvLyBzZWxmLl9nZXRfbWV0YWRhdGFfc2l6ZShhc2EpICsgZXh0cmFfcGF5bG9hZC5sZW5ndGgKICAgIGZyYW1lX2RpZyAtMwogICAgY2FsbHN1YiBfZ2V0X21ldGFkYXRhX3NpemUKICAgIHN3YXAKICAgIGxlbgogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weToyMjYtMjI3CiAgICAvLyBzZWxmLl9nZXRfbWV0YWRhdGFfc2l6ZShhc2EpICsgZXh0cmFfcGF5bG9hZC5sZW5ndGgKICAgIC8vIDw9IG1ldGFkYXRhX3NpemUsCiAgICBmcmFtZV9kaWcgLTIKICAgIDw9CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjIyNS0yMjkKICAgIC8vIGxvZ2dlZF9hc3NlcnQoCiAgICAvLyAgICAgc2VsZi5fZ2V0X21ldGFkYXRhX3NpemUoYXNhKSArIGV4dHJhX3BheWxvYWQubGVuZ3RoCiAgICAvLyAgICAgPD0gbWV0YWRhdGFfc2l6ZSwKICAgIC8vICAgICBlcnIuUEFZTE9BRF9PVkVSRkxPVywKICAgIC8vICkKICAgIGJueiBfc2V0X21ldGFkYXRhX3BheWxvYWRfYWZ0ZXJfYXNzZXJ0QDcKICAgIGJ5dGVjIDEwIC8vICJFUlI6cGF5bG9hZE92ZXJmbG93IgogICAgbG9nCiAgICBlcnIgLy8gRVJSOnBheWxvYWRPdmVyZmxvdwoKX3NldF9tZXRhZGF0YV9wYXlsb2FkX2FmdGVyX2Fzc2VydEA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weToyMzAKICAgIC8vIHNlbGYuX2FwcGVuZF9wYXlsb2FkKGFzYSwgZXh0cmFfcGF5bG9hZCkKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIDAKICAgIGNhbGxzdWIgX2FwcGVuZF9wYXlsb2FkCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjIzMgogICAgLy8gc2VsZi5fZ2V0X21ldGFkYXRhX3NpemUoYXNhKSA8PSBtZXRhZGF0YV9zaXplLAogICAgZnJhbWVfZGlnIC0zCiAgICBjYWxsc3ViIF9nZXRfbWV0YWRhdGFfc2l6ZQogICAgZnJhbWVfZGlnIC0yCiAgICA8PQogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weToyMzEtMjM0CiAgICAvLyBsb2dnZWRfYXNzZXJ0KAogICAgLy8gICAgIHNlbGYuX2dldF9tZXRhZGF0YV9zaXplKGFzYSkgPD0gbWV0YWRhdGFfc2l6ZSwKICAgIC8vICAgICBlcnIuUEFZTE9BRF9PVkVSRkxPVywKICAgIC8vICkKICAgIGJueiBfc2V0X21ldGFkYXRhX3BheWxvYWRfYWZ0ZXJfaWZfZWxzZUAxMAogICAgYnl0ZWMgMTAgLy8gIkVSUjpwYXlsb2FkT3ZlcmZsb3ciCiAgICBsb2cKICAgIGVyciAvLyBFUlI6cGF5bG9hZE92ZXJmbG93Cgpfc2V0X21ldGFkYXRhX3BheWxvYWRfYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MjIxCiAgICAvLyBmb3IgaWR4IGluIHVyYW5nZShncm91cF9pbmRleCArIDEsIGdyb3VwX3NpemUpOgogICAgZnJhbWVfZGlnIDIKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDIKICAgIGIgX3NldF9tZXRhZGF0YV9wYXlsb2FkX2Zvcl9oZWFkZXJAMwoKX3NldF9tZXRhZGF0YV9wYXlsb2FkX2Jvb2xfZmFsc2VAMjY6CiAgICBpbnRjXzEgLy8gMAogICAgYiBfc2V0X21ldGFkYXRhX3BheWxvYWRfYm9vbF9tZXJnZUAyNwoKX3NldF9tZXRhZGF0YV9wYXlsb2FkX2Jvb2xfZmFsc2VAMjE6CiAgICBpbnRjXzEgLy8gMAogICAgYiBfc2V0X21ldGFkYXRhX3BheWxvYWRfYm9vbF9tZXJnZUAyMgoKX3NldF9tZXRhZGF0YV9wYXlsb2FkX2FmdGVyX2ZvckAxMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MjM2CiAgICAvLyBzZWxmLl9nZXRfbWV0YWRhdGFfc2l6ZShhc2EpID09IG1ldGFkYXRhX3NpemUsCiAgICBmcmFtZV9kaWcgLTMKICAgIGNhbGxzdWIgX2dldF9tZXRhZGF0YV9zaXplCiAgICBmcmFtZV9kaWcgLTIKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjIzNS0yMzgKICAgIC8vIGxvZ2dlZF9hc3NlcnQoCiAgICAvLyAgICAgc2VsZi5fZ2V0X21ldGFkYXRhX3NpemUoYXNhKSA9PSBtZXRhZGF0YV9zaXplLAogICAgLy8gICAgIGVyci5NRVRBREFUQV9TSVpFX01JU01BVENILAogICAgLy8gKQogICAgYm56IF9zZXRfbWV0YWRhdGFfcGF5bG9hZF9hZnRlcl9hc3NlcnRAMTQKICAgIGJ5dGVjIDYgLy8gIkVSUjptZXRhZGF0YVNpemVNaXNtYXRjaCIKICAgIGxvZwogICAgZXJyIC8vIEVSUjptZXRhZGF0YVNpemVNaXNtYXRjaAoKX3NldF9tZXRhZGF0YV9wYXlsb2FkX2FmdGVyX2Fzc2VydEAxNDoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc2FfbWV0YWRhdGFfcmVnaXN0cnkuY29udHJhY3QuQXNhTWV0YWRhdGFSZWdpc3RyeS5fZ2V0X21ldGFkYXRhX3BhZ2UoYXNhOiB1aW50NjQsIHBhZ2VfaW5kZXg6IHVpbnQ2NCkgLT4gYnl0ZXM6Cl9nZXRfbWV0YWRhdGFfcGFnZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MjQ4CiAgICAvLyBkZWYgX2dldF9tZXRhZGF0YV9wYWdlKHNlbGYsIGFzYTogQXNzZXQsIHBhZ2VfaW5kZXg6IFVJbnQ2NCkgLT4gQnl0ZXM6CiAgICBwcm90byAyIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MjU2CiAgICAvLyBuID0gc2VsZi5fZ2V0X21ldGFkYXRhX3NpemUoYXNhKQogICAgZnJhbWVfZGlnIC0yCiAgICBjYWxsc3ViIF9nZXRfbWV0YWRhdGFfc2l6ZQogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjI1OAogICAgLy8gc3RhcnQgPSBwYWdlX2luZGV4ICogcHMKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weToyNTUKICAgIC8vIHBzID0gVUludDY0KGNvbnN0LlBBR0VfU0laRSkKICAgIGludGMgNCAvLyAxMDA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjI1OAogICAgLy8gc3RhcnQgPSBwYWdlX2luZGV4ICogcHMKICAgICoKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjI1OQogICAgLy8gaWYgc3RhcnQgPj0gbjoKICAgID49CiAgICBieiBfZ2V0X21ldGFkYXRhX3BhZ2VfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjI2MC0yNjEKICAgIC8vICMgT3V0LW9mLXJhbmdlIHBhZ2UgKGluY2x1ZGluZyBlbXB0eSBtZXRhZGF0YSB3aXRoIHBhZ2VfaW5kZXggPiAwKQogICAgLy8gcmV0dXJuIEJ5dGVzKGIiIikKICAgIGJ5dGVjXzAgLy8gMHgKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpfZ2V0X21ldGFkYXRhX3BhZ2VfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weToyNjMKICAgIC8vIHJlbWFpbmluZyA9IG4gLSBzdGFydAogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MjU1CiAgICAvLyBwcyA9IFVJbnQ2NChjb25zdC5QQUdFX1NJWkUpCiAgICBpbnRjIDQgLy8gMTAwNwogICAgLy8gc21hcnRfY29udHJhY3RzL2F2bV9saWJyYXJ5LnB5OjI1CiAgICAvLyByZXR1cm4gYSBpZiBhIDwgYiBlbHNlIGIKICAgIGRpZyAxCiAgICA8CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjI1NQogICAgLy8gcHMgPSBVSW50NjQoY29uc3QuUEFHRV9TSVpFKQogICAgaW50YyA0IC8vIDEwMDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdm1fbGlicmFyeS5weToyNQogICAgLy8gcmV0dXJuIGEgaWYgYSA8IGIgZWxzZSBiCiAgICBzd2FwCiAgICBzZWxlY3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MjY2CiAgICAvLyByZXR1cm4gc2VsZi5hc3NldF9tZXRhZGF0YS5ib3goYXNhKS5leHRyYWN0KAogICAgZnJhbWVfZGlnIC0yCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjI2NwogICAgLy8gc3RhcnRfaW5kZXg9Y29uc3QuSURYX01FVEFEQVRBICsgc3RhcnQsIGxlbmd0aD1sZW5ndGgKICAgIHB1c2hpbnQgNTEKICAgIHVuY292ZXIgMwogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weToyNjYtMjY4CiAgICAvLyByZXR1cm4gc2VsZi5hc3NldF9tZXRhZGF0YS5ib3goYXNhKS5leHRyYWN0KAogICAgLy8gICAgIHN0YXJ0X2luZGV4PWNvbnN0LklEWF9NRVRBREFUQSArIHN0YXJ0LCBsZW5ndGg9bGVuZ3RoCiAgICAvLyApCiAgICB1bmNvdmVyIDIKICAgIGJveF9leHRyYWN0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc2FfbWV0YWRhdGFfcmVnaXN0cnkuY29udHJhY3QuQXNhTWV0YWRhdGFSZWdpc3RyeS5fZ2V0X3Nob3J0X21ldGFkYXRhKGFzYTogdWludDY0KSAtPiBieXRlczoKX2dldF9zaG9ydF9tZXRhZGF0YToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6Mjc1CiAgICAvLyBkZWYgX2dldF9zaG9ydF9tZXRhZGF0YShzZWxmLCBhc2E6IEFzc2V0KSAtPiBCeXRlczoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTo1OAogICAgLy8gcmV0dXJuIHNlbGYuYXNzZXRfbWV0YWRhdGEuYm94KGFzYSkuZXh0cmFjdCgKICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjU5CiAgICAvLyBzdGFydF9pbmRleD1jb25zdC5JRFhfTUVUQURBVEFfSURFTlRJRklFUlMsCiAgICBpbnRjXzEgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTo2MAogICAgLy8gbGVuZ3RoPWNvbnN0Lk1FVEFEQVRBX0lERU5USUZJRVJTX1NJWkUsCiAgICBpbnRjXzAgLy8gMQogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTo1OC02MQogICAgLy8gcmV0dXJuIHNlbGYuYXNzZXRfbWV0YWRhdGEuYm94KGFzYSkuZXh0cmFjdCgKICAgIC8vICAgICBzdGFydF9pbmRleD1jb25zdC5JRFhfTUVUQURBVEFfSURFTlRJRklFUlMsCiAgICAvLyAgICAgbGVuZ3RoPWNvbnN0Lk1FVEFEQVRBX0lERU5USUZJRVJTX1NJWkUsCiAgICAvLyApCiAgICBib3hfZXh0cmFjdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTo3MQogICAgLy8gY29uc3QuQklUX1JJR0hUTU9TVF9JREVOVElGSUVSIC0gZmxnLklEX1NIT1JULAogICAgaW50Y18xIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6NjktNzIKICAgIC8vIHJldHVybiBvcC5nZXRiaXQoCiAgICAvLyAgICAgc2VsZi5fZ2V0X21ldGFkYXRhX2lkZW50aWZpZXJzKGFzYSksCiAgICAvLyAgICAgY29uc3QuQklUX1JJR0hUTU9TVF9JREVOVElGSUVSIC0gZmxnLklEX1NIT1JULAogICAgLy8gKQogICAgZ2V0Yml0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjI3NgogICAgLy8gbG9nZ2VkX2Fzc2VydChzZWxmLl9pc19zaG9ydChhc2EpLCBlcnIuTUVUQURBVEFfTk9UX1NIT1JUKQogICAgYm56IF9nZXRfc2hvcnRfbWV0YWRhdGFfYWZ0ZXJfYXNzZXJ0QDIKICAgIHB1c2hieXRlcyAiRVJSOm1ldGFkYXRhTm90U2hvcnQiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6bWV0YWRhdGFOb3RTaG9ydAoKX2dldF9zaG9ydF9tZXRhZGF0YV9hZnRlcl9hc3NlcnRAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6Mjc3CiAgICAvLyByZXR1cm4gc2VsZi5fZ2V0X3NsaWNlKGFzYSwgVUludDY0KDApLCBzZWxmLl9nZXRfbWV0YWRhdGFfc2l6ZShhc2EpKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIF9nZXRfbWV0YWRhdGFfc2l6ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weToyNzEtMjczCiAgICAvLyByZXR1cm4gc2VsZi5hc3NldF9tZXRhZGF0YS5ib3goYXNhKS5leHRyYWN0KAogICAgLy8gICAgIHN0YXJ0X2luZGV4PWNvbnN0LklEWF9NRVRBREFUQSArIG9mZnNldCwgbGVuZ3RoPXNpemUKICAgIC8vICkKICAgIGZyYW1lX2RpZyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjI3MgogICAgLy8gc3RhcnRfaW5kZXg9Y29uc3QuSURYX01FVEFEQVRBICsgb2Zmc2V0LCBsZW5ndGg9c2l6ZQogICAgcHVzaGludCA1MQogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weToyNzEtMjczCiAgICAvLyByZXR1cm4gc2VsZi5hc3NldF9tZXRhZGF0YS5ib3goYXNhKS5leHRyYWN0KAogICAgLy8gICAgIHN0YXJ0X2luZGV4PWNvbnN0LklEWF9NRVRBREFUQSArIG9mZnNldCwgbGVuZ3RoPXNpemUKICAgIC8vICkKICAgIHVuY292ZXIgMgogICAgYm94X2V4dHJhY3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6Mjc3CiAgICAvLyByZXR1cm4gc2VsZi5fZ2V0X3NsaWNlKGFzYSwgVUludDY0KDApLCBzZWxmLl9nZXRfbWV0YWRhdGFfc2l6ZShhc2EpKQogICAgc3dhcAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzYV9tZXRhZGF0YV9yZWdpc3RyeS5jb250cmFjdC5Bc2FNZXRhZGF0YVJlZ2lzdHJ5Ll9pZGVudGlmeV9tZXRhZGF0YShhc2E6IHVpbnQ2NCkgLT4gdm9pZDoKX2lkZW50aWZ5X21ldGFkYXRhOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weToyNzkKICAgIC8vIGRlZiBfaWRlbnRpZnlfbWV0YWRhdGEoc2VsZiwgYXNhOiBBc3NldCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weToyODAKICAgIC8vIG1ldGFkYXRhX3NpemUgPSBzZWxmLl9nZXRfbWV0YWRhdGFfc2l6ZShhc2EpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgX2dldF9tZXRhZGF0YV9zaXplCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjU4CiAgICAvLyByZXR1cm4gc2VsZi5hc3NldF9tZXRhZGF0YS5ib3goYXNhKS5leHRyYWN0KAogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjU4LTYxCiAgICAvLyByZXR1cm4gc2VsZi5hc3NldF9tZXRhZGF0YS5ib3goYXNhKS5leHRyYWN0KAogICAgLy8gICAgIHN0YXJ0X2luZGV4PWNvbnN0LklEWF9NRVRBREFUQV9JREVOVElGSUVSUywKICAgIC8vICAgICBsZW5ndGg9Y29uc3QuTUVUQURBVEFfSURFTlRJRklFUlNfU0laRSwKICAgIC8vICkKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTo1OQogICAgLy8gc3RhcnRfaW5kZXg9Y29uc3QuSURYX01FVEFEQVRBX0lERU5USUZJRVJTLAogICAgaW50Y18xIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6NjAKICAgIC8vIGxlbmd0aD1jb25zdC5NRVRBREFUQV9JREVOVElGSUVSU19TSVpFLAogICAgaW50Y18wIC8vIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6NTgtNjEKICAgIC8vIHJldHVybiBzZWxmLmFzc2V0X21ldGFkYXRhLmJveChhc2EpLmV4dHJhY3QoCiAgICAvLyAgICAgc3RhcnRfaW5kZXg9Y29uc3QuSURYX01FVEFEQVRBX0lERU5USUZJRVJTLAogICAgLy8gICAgIGxlbmd0aD1jb25zdC5NRVRBREFUQV9JREVOVElGSUVSU19TSVpFLAogICAgLy8gKQogICAgYm94X2V4dHJhY3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6NTUKICAgIC8vIHJldHVybiBtZXRhZGF0YV9zaXplIDw9IGNvbnN0LlNIT1JUX01FVEFEQVRBX1NJWkUKICAgIHVuY292ZXIgMgogICAgcHVzaGludCA0MDk2CiAgICA8PQogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weToyODMKICAgIC8vIGNvbnN0LkJJVF9SSUdIVE1PU1RfSURFTlRJRklFUiAtIGZsZy5JRF9TSE9SVCwKICAgIGludGNfMSAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjI4MS0yODUKICAgIC8vIGlkZW50aWZpZXJzID0gb3Auc2V0Yml0X2J5dGVzKAogICAgLy8gICAgIHNlbGYuX2dldF9tZXRhZGF0YV9pZGVudGlmaWVycyhhc2EpLAogICAgLy8gICAgIGNvbnN0LkJJVF9SSUdIVE1PU1RfSURFTlRJRklFUiAtIGZsZy5JRF9TSE9SVCwKICAgIC8vICAgICBzZWxmLl9pc19zaG9ydF9tZXRhZGF0YV9zaXplKG1ldGFkYXRhX3NpemUpLAogICAgLy8gKQogICAgc3dhcAogICAgc2V0Yml0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjY1CiAgICAvLyBzdGFydF9pbmRleD1jb25zdC5JRFhfTUVUQURBVEFfSURFTlRJRklFUlMsIHZhbHVlPWlkZW50aWZpZXJzCiAgICBpbnRjXzEgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTo2NC02NgogICAgLy8gc2VsZi5hc3NldF9tZXRhZGF0YS5ib3goYXNhKS5yZXBsYWNlKAogICAgLy8gICAgIHN0YXJ0X2luZGV4PWNvbnN0LklEWF9NRVRBREFUQV9JREVOVElGSUVSUywgdmFsdWU9aWRlbnRpZmllcnMKICAgIC8vICkKICAgIHN3YXAKICAgIGJveF9yZXBsYWNlCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNhX21ldGFkYXRhX3JlZ2lzdHJ5LmNvbnRyYWN0LkFzYU1ldGFkYXRhUmVnaXN0cnkuX2NvbXB1dGVfaGVhZGVyX2hhc2goYXNhOiB1aW50NjQpIC0+IGJ5dGVzOgpfY29tcHV0ZV9oZWFkZXJfaGFzaDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6Mjg4CiAgICAvLyBkZWYgX2NvbXB1dGVfaGVhZGVyX2hhc2goc2VsZiwgYXNhOiBBc3NldCkgLT4gQnl0ZXM6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6Mjg5LTI5MQogICAgLy8gIyBoaCA9IFNIQS01MTIvMjU2KCJhcmMwMDg5L2hlYWRlciIgfHwgQXNzZXQgSUQgfHwgTWV0YWRhdGEgSWRlbnRpZmllcnMKICAgIC8vICMgfHwgUmV2ZXJzaWJsZSBGbGFncyB8fCBJcnJldmVyc2libGUgRmxhZ3MgfHwgTWV0YWRhdGEgU2l6ZSkKICAgIC8vIGVuc3VyZV9idWRnZXQocmVxdWlyZWRfYnVkZ2V0PWNvbnN0LkhFQURFUl9IQVNIX09QX0JVREdFVCkKICAgIHB1c2hpbnQgMTEwCiAgICBpbnRjXzEgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjI5MwogICAgLy8gYXNzZXRfaWQgPSBvcC5pdG9iKGFzYS5pZCkKICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTo1OC02MQogICAgLy8gcmV0dXJuIHNlbGYuYXNzZXRfbWV0YWRhdGEuYm94KGFzYSkuZXh0cmFjdCgKICAgIC8vICAgICBzdGFydF9pbmRleD1jb25zdC5JRFhfTUVUQURBVEFfSURFTlRJRklFUlMsCiAgICAvLyAgICAgbGVuZ3RoPWNvbnN0Lk1FVEFEQVRBX0lERU5USUZJRVJTX1NJWkUsCiAgICAvLyApCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6NTkKICAgIC8vIHN0YXJ0X2luZGV4PWNvbnN0LklEWF9NRVRBREFUQV9JREVOVElGSUVSUywKICAgIGludGNfMSAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjYwCiAgICAvLyBsZW5ndGg9Y29uc3QuTUVUQURBVEFfSURFTlRJRklFUlNfU0laRSwKICAgIGludGNfMCAvLyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjU4LTYxCiAgICAvLyByZXR1cm4gc2VsZi5hc3NldF9tZXRhZGF0YS5ib3goYXNhKS5leHRyYWN0KAogICAgLy8gICAgIHN0YXJ0X2luZGV4PWNvbnN0LklEWF9NRVRBREFUQV9JREVOVElGSUVSUywKICAgIC8vICAgICBsZW5ndGg9Y29uc3QuTUVUQURBVEFfSURFTlRJRklFUlNfU0laRSwKICAgIC8vICkKICAgIGJveF9leHRyYWN0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5Ojc1LTc3CiAgICAvLyByZXR1cm4gc2VsZi5hc3NldF9tZXRhZGF0YS5ib3goYXNhKS5leHRyYWN0KAogICAgLy8gICAgIHN0YXJ0X2luZGV4PWNvbnN0LklEWF9SRVZFUlNJQkxFX0ZMQUdTLCBsZW5ndGg9Y29uc3QuUkVWRVJTSUJMRV9GTEFHU19TSVpFCiAgICAvLyApCiAgICBkaWcgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTo3NgogICAgLy8gc3RhcnRfaW5kZXg9Y29uc3QuSURYX1JFVkVSU0lCTEVfRkxBR1MsIGxlbmd0aD1jb25zdC5SRVZFUlNJQkxFX0ZMQUdTX1NJWkUKICAgIGludGNfMCAvLyAxCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6NzUtNzcKICAgIC8vIHJldHVybiBzZWxmLmFzc2V0X21ldGFkYXRhLmJveChhc2EpLmV4dHJhY3QoCiAgICAvLyAgICAgc3RhcnRfaW5kZXg9Y29uc3QuSURYX1JFVkVSU0lCTEVfRkxBR1MsIGxlbmd0aD1jb25zdC5SRVZFUlNJQkxFX0ZMQUdTX1NJWkUKICAgIC8vICkKICAgIGJveF9leHRyYWN0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5Ojk5LTEwMgogICAgLy8gcmV0dXJuIHNlbGYuYXNzZXRfbWV0YWRhdGEuYm94KGFzYSkuZXh0cmFjdCgKICAgIC8vICAgICBzdGFydF9pbmRleD1jb25zdC5JRFhfSVJSRVZFUlNJQkxFX0ZMQUdTLAogICAgLy8gICAgIGxlbmd0aD1jb25zdC5JUlJFVkVSU0lCTEVfRkxBR1NfU0laRSwKICAgIC8vICkKICAgIGRpZyAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjEwMAogICAgLy8gc3RhcnRfaW5kZXg9Y29uc3QuSURYX0lSUkVWRVJTSUJMRV9GTEFHUywKICAgIGludGNfMyAvLyAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjEwMQogICAgLy8gbGVuZ3RoPWNvbnN0LklSUkVWRVJTSUJMRV9GTEFHU19TSVpFLAogICAgaW50Y18wIC8vIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6OTktMTAyCiAgICAvLyByZXR1cm4gc2VsZi5hc3NldF9tZXRhZGF0YS5ib3goYXNhKS5leHRyYWN0KAogICAgLy8gICAgIHN0YXJ0X2luZGV4PWNvbnN0LklEWF9JUlJFVkVSU0lCTEVfRkxBR1MsCiAgICAvLyAgICAgbGVuZ3RoPWNvbnN0LklSUkVWRVJTSUJMRV9GTEFHU19TSVpFLAogICAgLy8gKQogICAgYm94X2V4dHJhY3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6Mjk4CiAgICAvLyB1aW50PXNlbGYuX2dldF9tZXRhZGF0YV9zaXplKGFzYSksCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgX2dldF9tZXRhZGF0YV9zaXplCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXZtX2xpYnJhcnkucHk6MjAKICAgIC8vIHJldHVybiBvcC5leHRyYWN0KG9wLml0b2IodWludCksIHN0YXJ0LCBzaXplKQogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MjkyCiAgICAvLyBkb21haW4gPSBCeXRlcyhjb25zdC5IQVNIX0RPTUFJTl9IRUFERVIpCiAgICBwdXNoYnl0ZXMgMHg2MTcyNjMzMDMwMzgzOTJmNjg2NTYxNjQ2NTcyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjMwMi0zMDMKICAgIC8vIGRvbWFpbgogICAgLy8gKyBhc3NldF9pZAogICAgdW5jb3ZlciA1CiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MzAyLTMwNAogICAgLy8gZG9tYWluCiAgICAvLyArIGFzc2V0X2lkCiAgICAvLyArIG1ldGFkYXRhX2lkZW50aWZpZXJzCiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTozMDItMzA1CiAgICAvLyBkb21haW4KICAgIC8vICsgYXNzZXRfaWQKICAgIC8vICsgbWV0YWRhdGFfaWRlbnRpZmllcnMKICAgIC8vICsgcmV2ZXJzaWJsZV9mbGFncwogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MzAyLTMwNgogICAgLy8gZG9tYWluCiAgICAvLyArIGFzc2V0X2lkCiAgICAvLyArIG1ldGFkYXRhX2lkZW50aWZpZXJzCiAgICAvLyArIHJldmVyc2libGVfZmxhZ3MKICAgIC8vICsgaXJyZXZlcnNpYmxlX2ZsYWdzCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTozMDItMzA3CiAgICAvLyBkb21haW4KICAgIC8vICsgYXNzZXRfaWQKICAgIC8vICsgbWV0YWRhdGFfaWRlbnRpZmllcnMKICAgIC8vICsgcmV2ZXJzaWJsZV9mbGFncwogICAgLy8gKyBpcnJldmVyc2libGVfZmxhZ3MKICAgIC8vICsgbWV0YWRhdGFfc2l6ZQogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjMwMS0zMDgKICAgIC8vIHJldHVybiBvcC5zaGE1MTJfMjU2KAogICAgLy8gICAgIGRvbWFpbgogICAgLy8gICAgICsgYXNzZXRfaWQKICAgIC8vICAgICArIG1ldGFkYXRhX2lkZW50aWZpZXJzCiAgICAvLyAgICAgKyByZXZlcnNpYmxlX2ZsYWdzCiAgICAvLyAgICAgKyBpcnJldmVyc2libGVfZmxhZ3MKICAgIC8vICAgICArIG1ldGFkYXRhX3NpemUKICAgIC8vICkKICAgIHNoYTUxMl8yNTYKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc2FfbWV0YWRhdGFfcmVnaXN0cnkuY29udHJhY3QuQXNhTWV0YWRhdGFSZWdpc3RyeS5fY29tcHV0ZV9wYWdlX2hhc2goYXNhOiB1aW50NjQsIHBhZ2VfaW5kZXg6IHVpbnQ2NCwgcGFnZV9jb250ZW50OiBieXRlcykgLT4gYnl0ZXM6Cl9jb21wdXRlX3BhZ2VfaGFzaDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MzEwLTMxMgogICAgLy8gZGVmIF9jb21wdXRlX3BhZ2VfaGFzaCgKICAgIC8vICAgICBzZWxmLCBhc2E6IEFzc2V0LCBwYWdlX2luZGV4OiBVSW50NjQsIHBhZ2VfY29udGVudDogQnl0ZXMKICAgIC8vICkgLT4gQnl0ZXM6CiAgICBwcm90byAzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MzEzLTMxNAogICAgLy8gIyBwaFtpXSA9IFNIQS01MTIvMjU2KCJhcmMwMDg5L3BhZ2UiIHx8IEFzc2V0IElEIHx8IFBhZ2UgSW5kZXggfHwgUGFnZSBTaXplIHx8IFBhZ2UgQ29udGVudCkKICAgIC8vIGVuc3VyZV9idWRnZXQocmVxdWlyZWRfYnVkZ2V0PWNvbnN0LlBBR0VfSEFTSF9PUF9CVURHRVQpCiAgICBwdXNoaW50IDIzMAogICAgaW50Y18xIC8vIDAKICAgIGNhbGxzdWIgZW5zdXJlX2J1ZGdldAogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTozMTYKICAgIC8vIGFzc2V0X2lkID0gb3AuaXRvYihhc2EuaWQpCiAgICBmcmFtZV9kaWcgLTMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdm1fbGlicmFyeS5weToyMAogICAgLy8gcmV0dXJuIG9wLmV4dHJhY3Qob3AuaXRvYih1aW50KSwgc3RhcnQsIHNpemUpCiAgICBmcmFtZV9kaWcgLTIKICAgIGl0b2IKICAgIGV4dHJhY3QgNyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjMxOQogICAgLy8gdWludD1wYWdlX2NvbnRlbnQubGVuZ3RoLCBzaXplPVVJbnQ2NChjb25zdC5VSU5UMTZfU0laRSkKICAgIGZyYW1lX2RpZyAtMQogICAgbGVuCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXZtX2xpYnJhcnkucHk6MjAKICAgIC8vIHJldHVybiBvcC5leHRyYWN0KG9wLml0b2IodWludCksIHN0YXJ0LCBzaXplKQogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MzE1CiAgICAvLyBkb21haW4gPSBCeXRlcyhjb25zdC5IQVNIX0RPTUFJTl9QQUdFKQogICAgcHVzaGJ5dGVzIDB4NjE3MjYzMzAzMDM4MzkyZjcwNjE2NzY1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjMyMQogICAgLy8gcmV0dXJuIG9wLnNoYTUxMl8yNTYoZG9tYWluICsgYXNzZXRfaWQgKyBwYWdlX2lkeCArIHBhZ2Vfc2l6ZSArIHBhZ2VfY29udGVudCkKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgc2hhNTEyXzI1NgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzYV9tZXRhZGF0YV9yZWdpc3RyeS5jb250cmFjdC5Bc2FNZXRhZGF0YVJlZ2lzdHJ5Ll9jb21wdXRlX21ldGFkYXRhX2hhc2goYXNhOiB1aW50NjQpIC0+IGJ5dGVzOgpfY29tcHV0ZV9tZXRhZGF0YV9oYXNoOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTozMjMKICAgIC8vIGRlZiBfY29tcHV0ZV9tZXRhZGF0YV9oYXNoKHNlbGYsIGFzYTogQXNzZXQpIC0+IEJ5dGVzOgogICAgcHJvdG8gMSAxCiAgICBieXRlY18wIC8vICIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjMyNwogICAgLy8gaGggPSBzZWxmLl9jb21wdXRlX2hlYWRlcl9oYXNoKGFzYSkKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBfY29tcHV0ZV9oZWFkZXJfaGFzaAogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weToyNDUKICAgIC8vIG4gPSBzZWxmLl9nZXRfbWV0YWRhdGFfc2l6ZShhc2EpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgX2dldF9tZXRhZGF0YV9zaXplCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXZtX2xpYnJhcnkucHk6MzAKICAgIC8vIHJldHVybiAobnVtICsgKGRlbiAtIDEpKSAvLyBkZW4KICAgIGludGMgNSAvLyAxMDA2CiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjI0NgogICAgLy8gcmV0dXJuIGNlaWxfZGl2KG51bT1uLCBkZW49VUludDY0KGNvbnN0LlBBR0VfU0laRSkpCiAgICBpbnRjIDQgLy8gMTAwNwogICAgLy8gc21hcnRfY29udHJhY3RzL2F2bV9saWJyYXJ5LnB5OjMwCiAgICAvLyByZXR1cm4gKG51bSArIChkZW4gLSAxKSkgLy8gZGVuCiAgICAvCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MzI5CiAgICAvLyBjb25jYXRlbmF0ZWRfcGggPSBCeXRlcygpCiAgICBieXRlY18wIC8vIDB4CiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjMzMAogICAgLy8gaWYgdG90YWxfcGFnZXMgPiAwOgogICAgYnogX2NvbXB1dGVfbWV0YWRhdGFfaGFzaF9hZnRlcl9pZl9lbHNlQDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MzMxCiAgICAvLyBmb3IgcGFnZV9pbmRleCBpbiB1cmFuZ2UoMCwgdG90YWxfcGFnZXMpOgogICAgaW50Y18xIC8vIDAKICAgIGZyYW1lX2J1cnkgMAoKX2NvbXB1dGVfbWV0YWRhdGFfaGFzaF9mb3JfaGVhZGVyQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjMzMQogICAgLy8gZm9yIHBhZ2VfaW5kZXggaW4gdXJhbmdlKDAsIHRvdGFsX3BhZ2VzKToKICAgIGZyYW1lX2RpZyAwCiAgICBmcmFtZV9kaWcgMgogICAgPAogICAgYnogX2NvbXB1dGVfbWV0YWRhdGFfaGFzaF9hZnRlcl9pZl9lbHNlQDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MzMyCiAgICAvLyBwYWdlX2NvbnRlbnQgPSBzZWxmLl9nZXRfbWV0YWRhdGFfcGFnZShhc2EsIHBhZ2VfaW5kZXgpCiAgICBmcmFtZV9kaWcgLTEKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGNhbGxzdWIgX2dldF9tZXRhZGF0YV9wYWdlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjMzMwogICAgLy8gcGggPSBzZWxmLl9jb21wdXRlX3BhZ2VfaGFzaChhc2EsIHBhZ2VfaW5kZXgsIHBhZ2VfY29udGVudCkKICAgIGZyYW1lX2RpZyAtMQogICAgZGlnIDIKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiBfY29tcHV0ZV9wYWdlX2hhc2gKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MzM0CiAgICAvLyBjb25jYXRlbmF0ZWRfcGggKz0gcGgKICAgIGZyYW1lX2RpZyAzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMwogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTozMzEKICAgIC8vIGZvciBwYWdlX2luZGV4IGluIHVyYW5nZSgwLCB0b3RhbF9wYWdlcyk6CiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAwCiAgICBiIF9jb21wdXRlX21ldGFkYXRhX2hhc2hfZm9yX2hlYWRlckAyCgpfY29tcHV0ZV9tZXRhZGF0YV9oYXNoX2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MzI0LTMyNgogICAgLy8gIyBhbSA9IFNIQS01MTIvMjU2KCJhcmMwMDg5L2FtIiB8fCBoaCB8fCBwaFswXSB8fCBwaFsxXSB8fCAuLi4gfHwgcGhbdG90YWxfcGFnZXMgLSAxXSkgb3IKICAgIC8vICMgYW0gPSBTSEEtNTEyLzI1NigiYXJjMDA4OS9hbSIgfHwgaGgpLCBpZiBubyBwYWdlcwogICAgLy8gZG9tYWluID0gQnl0ZXMoY29uc3QuSEFTSF9ET01BSU5fTUVUQURBVEEpCiAgICBwdXNoYnl0ZXMgMHg2MTcyNjMzMDMwMzgzOTJmNjE2ZAogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTozMzUKICAgIC8vIHJldHVybiBvcC5zaGE1MTJfMjU2KGRvbWFpbiArIGhoICsgY29uY2F0ZW5hdGVkX3BoKQogICAgZnJhbWVfZGlnIDEKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDMKICAgIGNvbmNhdAogICAgc2hhNTEyXzI1NgogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuYXNhX21ldGFkYXRhX3JlZ2lzdHJ5LmNvbnRyYWN0LkFzYU1ldGFkYXRhUmVnaXN0cnkuX2NoZWNrX2Jhc2VfcHJlY29uZGl0aW9ucyhhc2E6IHVpbnQ2NCwgbWV0YWRhdGFfc2l6ZTogdWludDY0KSAtPiB2b2lkOgpfY2hlY2tfYmFzZV9wcmVjb25kaXRpb25zOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTozMzcKICAgIC8vIGRlZiBfY2hlY2tfYmFzZV9wcmVjb25kaXRpb25zKHNlbGYsIGFzYTogQXNzZXQsIG1ldGFkYXRhX3NpemU6IFVJbnQ2NCkgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV92YWxpZGF0aW9uLnB5OjE1CiAgICAvLyBfY3JlYXRvciwgZXhpc3RzID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfY3JlYXRvcihhc2EpCiAgICBmcmFtZV9kaWcgLTIKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRDcmVhdG9yCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MzM4CiAgICAvLyBsb2dnZWRfYXNzZXJ0KHNlbGYuX2FzYV9leGlzdHMoYXNhKSwgZXJyLkFTQV9OT1RfRVhJU1QpCiAgICBibnogX2NoZWNrX2Jhc2VfcHJlY29uZGl0aW9uc19hZnRlcl9hc3NlcnRAMgogICAgYnl0ZWMgOCAvLyAiRVJSOmFzYU5vdEV4aXN0IgogICAgbG9nCiAgICBlcnIgLy8gRVJSOmFzYU5vdEV4aXN0CgpfY2hlY2tfYmFzZV9wcmVjb25kaXRpb25zX2FmdGVyX2Fzc2VydEAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTozMzkKICAgIC8vIGxvZ2dlZF9hc3NlcnQoc2VsZi5faXNfYXNhX21hbmFnZXIoYXNhKSwgZXJyLlVOQVVUSE9SSVpFRCkKICAgIGZyYW1lX2RpZyAtMgogICAgY2FsbHN1YiBfaXNfYXNhX21hbmFnZXIKICAgIGJueiBfY2hlY2tfYmFzZV9wcmVjb25kaXRpb25zX2FmdGVyX2Fzc2VydEA0CiAgICBieXRlYyA0IC8vICJFUlI6dW5hdXRob3JpemVkIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOnVuYXV0aG9yaXplZAoKX2NoZWNrX2Jhc2VfcHJlY29uZGl0aW9uc19hZnRlcl9hc3NlcnRANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6NTIKICAgIC8vIHJldHVybiBtZXRhZGF0YV9zaXplIDw9IGNvbnN0Lk1BWF9NRVRBREFUQV9TSVpFCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGMgNiAvLyAzMDUwNgogICAgPD0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MzQwLTM0MwogICAgLy8gbG9nZ2VkX2Fzc2VydCgKICAgIC8vICAgICBzZWxmLl9pc192YWxpZF9tYXhfbWV0YWRhdGFfc2l6ZShtZXRhZGF0YV9zaXplKSwKICAgIC8vICAgICBlcnIuRVhDRUVEU19NQVhfTUVUQURBVEFfU0laRSwKICAgIC8vICkKICAgIGJueiBfY2hlY2tfYmFzZV9wcmVjb25kaXRpb25zX2FmdGVyX2Fzc2VydEA2CiAgICBieXRlYyAxOSAvLyAiRVJSOmV4Y2VlZHNNYXhNZXRhZGF0YVNpemUiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6ZXhjZWVkc01heE1ldGFkYXRhU2l6ZQoKX2NoZWNrX2Jhc2VfcHJlY29uZGl0aW9uc19hZnRlcl9hc3NlcnRANjoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc2FfbWV0YWRhdGFfcmVnaXN0cnkuY29udHJhY3QuQXNhTWV0YWRhdGFSZWdpc3RyeS5fY2hlY2tfdXBkYXRlX3ByZWNvbmRpdGlvbnMoYXNhOiB1aW50NjQsIG1ldGFkYXRhX3NpemU6IHVpbnQ2NCkgLT4gdm9pZDoKX2NoZWNrX3VwZGF0ZV9wcmVjb25kaXRpb25zOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTozNDUKICAgIC8vIGRlZiBfY2hlY2tfdXBkYXRlX3ByZWNvbmRpdGlvbnMoc2VsZiwgYXNhOiBBc3NldCwgbWV0YWRhdGFfc2l6ZTogVUludDY0KSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjM0NgogICAgLy8gc2VsZi5fY2hlY2tfYmFzZV9wcmVjb25kaXRpb25zKGFzYSwgbWV0YWRhdGFfc2l6ZSkKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIF9jaGVja19iYXNlX3ByZWNvbmRpdGlvbnMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6NDkKICAgIC8vIHJldHVybiBhc2EgaW4gc2VsZi5hc3NldF9tZXRhZGF0YQogICAgZnJhbWVfZGlnIC0yCiAgICBpdG9iCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTozNDcKICAgIC8vIGxvZ2dlZF9hc3NlcnQoc2VsZi5fbWV0YWRhdGFfZXhpc3RzKGFzYSksIGVyci5BU1NFVF9NRVRBREFUQV9OT1RfRVhJU1QpCiAgICBibnogX2NoZWNrX3VwZGF0ZV9wcmVjb25kaXRpb25zX2FmdGVyX2Fzc2VydEAyCiAgICBieXRlY18zIC8vICJFUlI6YXNzZXRNZXRhZGF0YU5vdEV4aXN0IgogICAgbG9nCiAgICBlcnIgLy8gRVJSOmFzc2V0TWV0YWRhdGFOb3RFeGlzdAoKX2NoZWNrX3VwZGF0ZV9wcmVjb25kaXRpb25zX2FmdGVyX2Fzc2VydEAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTo5OS0xMDIKICAgIC8vIHJldHVybiBzZWxmLmFzc2V0X21ldGFkYXRhLmJveChhc2EpLmV4dHJhY3QoCiAgICAvLyAgICAgc3RhcnRfaW5kZXg9Y29uc3QuSURYX0lSUkVWRVJTSUJMRV9GTEFHUywKICAgIC8vICAgICBsZW5ndGg9Y29uc3QuSVJSRVZFUlNJQkxFX0ZMQUdTX1NJWkUsCiAgICAvLyApCiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weToxMDAKICAgIC8vIHN0YXJ0X2luZGV4PWNvbnN0LklEWF9JUlJFVkVSU0lCTEVfRkxBR1MsCiAgICBpbnRjXzMgLy8gMgogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weToxMDEKICAgIC8vIGxlbmd0aD1jb25zdC5JUlJFVkVSU0lCTEVfRkxBR1NfU0laRSwKICAgIGludGNfMCAvLyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5Ojk5LTEwMgogICAgLy8gcmV0dXJuIHNlbGYuYXNzZXRfbWV0YWRhdGEuYm94KGFzYSkuZXh0cmFjdCgKICAgIC8vICAgICBzdGFydF9pbmRleD1jb25zdC5JRFhfSVJSRVZFUlNJQkxFX0ZMQUdTLAogICAgLy8gICAgIGxlbmd0aD1jb25zdC5JUlJFVkVSU0lCTEVfRkxBR1NfU0laRSwKICAgIC8vICkKICAgIGJveF9leHRyYWN0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjExMgogICAgLy8gY29uc3QuQklUX1JJR0hUTU9TVF9JUlJfRkxBRyAtIGZsYWcsCiAgICBpbnRjXzEgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weToxMTAtMTEzCiAgICAvLyByZXR1cm4gb3AuZ2V0Yml0KAogICAgLy8gICAgIHNlbGYuX2dldF9pcnJldmVyc2libGVfZmxhZ3MoYXNhKSwKICAgIC8vICAgICBjb25zdC5CSVRfUklHSFRNT1NUX0lSUl9GTEFHIC0gZmxhZywKICAgIC8vICkKICAgIGdldGJpdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTozNDgKICAgIC8vIGxvZ2dlZF9hc3NlcnQobm90IHNlbGYuX2lzX2ltbXV0YWJsZShhc2EpLCBlcnIuSU1NVVRBQkxFKQogICAgYnogX2NoZWNrX3VwZGF0ZV9wcmVjb25kaXRpb25zX2FmdGVyX2Fzc2VydEA0CiAgICBieXRlYyA3IC8vICJFUlI6aW1tdXRhYmxlIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOmltbXV0YWJsZQoKX2NoZWNrX3VwZGF0ZV9wcmVjb25kaXRpb25zX2FmdGVyX2Fzc2VydEA0OgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzYV9tZXRhZGF0YV9yZWdpc3RyeS5jb250cmFjdC5Bc2FNZXRhZGF0YVJlZ2lzdHJ5Ll9jaGVja19leGlzdGVuY2VfcHJlY29uZGl0aW9ucyhhc2E6IHVpbnQ2NCkgLT4gdm9pZDoKX2NoZWNrX2V4aXN0ZW5jZV9wcmVjb25kaXRpb25zOgogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTozNTAKICAgIC8vIGRlZiBfY2hlY2tfZXhpc3RlbmNlX3ByZWNvbmRpdGlvbnMoc2VsZiwgYXNhOiBBc3NldCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV92YWxpZGF0aW9uLnB5OjE1CiAgICAvLyBfY3JlYXRvciwgZXhpc3RzID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfY3JlYXRvcihhc2EpCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXRDcmVhdG9yCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MzUxCiAgICAvLyBsb2dnZWRfYXNzZXJ0KHNlbGYuX2FzYV9leGlzdHMoYXNhKSwgZXJyLkFTQV9OT1RfRVhJU1QpCiAgICBibnogX2NoZWNrX2V4aXN0ZW5jZV9wcmVjb25kaXRpb25zX2FmdGVyX2Fzc2VydEAyCiAgICBieXRlYyA4IC8vICJFUlI6YXNhTm90RXhpc3QiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6YXNhTm90RXhpc3QKCl9jaGVja19leGlzdGVuY2VfcHJlY29uZGl0aW9uc19hZnRlcl9hc3NlcnRAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6NDkKICAgIC8vIHJldHVybiBhc2EgaW4gc2VsZi5hc3NldF9tZXRhZGF0YQogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MzUyCiAgICAvLyBsb2dnZWRfYXNzZXJ0KHNlbGYuX21ldGFkYXRhX2V4aXN0cyhhc2EpLCBlcnIuQVNTRVRfTUVUQURBVEFfTk9UX0VYSVNUKQogICAgYm56IF9jaGVja19leGlzdGVuY2VfcHJlY29uZGl0aW9uc19hZnRlcl9hc3NlcnRANAogICAgYnl0ZWNfMyAvLyAiRVJSOmFzc2V0TWV0YWRhdGFOb3RFeGlzdCIKICAgIGxvZwogICAgZXJyIC8vIEVSUjphc3NldE1ldGFkYXRhTm90RXhpc3QKCl9jaGVja19leGlzdGVuY2VfcHJlY29uZGl0aW9uc19hZnRlcl9hc3NlcnRANDoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc2FfbWV0YWRhdGFfcmVnaXN0cnkuY29udHJhY3QuQXNhTWV0YWRhdGFSZWdpc3RyeS5fY2hlY2tfc2V0X2ZsYWdfcHJlY29uZGl0aW9ucyhhc2E6IHVpbnQ2NCkgLT4gdm9pZDoKX2NoZWNrX3NldF9mbGFnX3ByZWNvbmRpdGlvbnM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjM1NAogICAgLy8gZGVmIF9jaGVja19zZXRfZmxhZ19wcmVjb25kaXRpb25zKHNlbGYsIGFzYTogQXNzZXQpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MzU1CiAgICAvLyBzZWxmLl9jaGVja19leGlzdGVuY2VfcHJlY29uZGl0aW9ucyhhc2EpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgX2NoZWNrX2V4aXN0ZW5jZV9wcmVjb25kaXRpb25zCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjM1NgogICAgLy8gbG9nZ2VkX2Fzc2VydChzZWxmLl9pc19hc2FfbWFuYWdlcihhc2EpLCBlcnIuVU5BVVRIT1JJWkVEKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIF9pc19hc2FfbWFuYWdlcgogICAgYm56IF9jaGVja19zZXRfZmxhZ19wcmVjb25kaXRpb25zX2FmdGVyX2Fzc2VydEAyCiAgICBieXRlYyA0IC8vICJFUlI6dW5hdXRob3JpemVkIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOnVuYXV0aG9yaXplZAoKX2NoZWNrX3NldF9mbGFnX3ByZWNvbmRpdGlvbnNfYWZ0ZXJfYXNzZXJ0QDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5Ojk5CiAgICAvLyByZXR1cm4gc2VsZi5hc3NldF9tZXRhZGF0YS5ib3goYXNhKS5leHRyYWN0KAogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjEwMAogICAgLy8gc3RhcnRfaW5kZXg9Y29uc3QuSURYX0lSUkVWRVJTSUJMRV9GTEFHUywKICAgIGludGNfMyAvLyAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjEwMQogICAgLy8gbGVuZ3RoPWNvbnN0LklSUkVWRVJTSUJMRV9GTEFHU19TSVpFLAogICAgaW50Y18wIC8vIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6OTktMTAyCiAgICAvLyByZXR1cm4gc2VsZi5hc3NldF9tZXRhZGF0YS5ib3goYXNhKS5leHRyYWN0KAogICAgLy8gICAgIHN0YXJ0X2luZGV4PWNvbnN0LklEWF9JUlJFVkVSU0lCTEVfRkxBR1MsCiAgICAvLyAgICAgbGVuZ3RoPWNvbnN0LklSUkVWRVJTSUJMRV9GTEFHU19TSVpFLAogICAgLy8gKQogICAgYm94X2V4dHJhY3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MTEyCiAgICAvLyBjb25zdC5CSVRfUklHSFRNT1NUX0lSUl9GTEFHIC0gZmxhZywKICAgIGludGNfMSAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjExMC0xMTMKICAgIC8vIHJldHVybiBvcC5nZXRiaXQoCiAgICAvLyAgICAgc2VsZi5fZ2V0X2lycmV2ZXJzaWJsZV9mbGFncyhhc2EpLAogICAgLy8gICAgIGNvbnN0LkJJVF9SSUdIVE1PU1RfSVJSX0ZMQUcgLSBmbGFnLAogICAgLy8gKQogICAgZ2V0Yml0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjM1NwogICAgLy8gbG9nZ2VkX2Fzc2VydChub3Qgc2VsZi5faXNfaW1tdXRhYmxlKGFzYSksIGVyci5JTU1VVEFCTEUpCiAgICBieiBfY2hlY2tfc2V0X2ZsYWdfcHJlY29uZGl0aW9uc19hZnRlcl9hc3NlcnRANAogICAgYnl0ZWMgNyAvLyAiRVJSOmltbXV0YWJsZSIKICAgIGxvZwogICAgZXJyIC8vIEVSUjppbW11dGFibGUKCl9jaGVja19zZXRfZmxhZ19wcmVjb25kaXRpb25zX2FmdGVyX2Fzc2VydEA0OgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzYV9tZXRhZGF0YV9yZWdpc3RyeS5jb250cmFjdC5Bc2FNZXRhZGF0YVJlZ2lzdHJ5Ll9lbWl0X3VwZGF0ZWRfZXZlbnQoYXNhOiB1aW50NjQsIG1ldGFkYXRhX2hhc2g6IGJ5dGVzKSAtPiB2b2lkOgpfZW1pdF91cGRhdGVkX2V2ZW50OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTozNTkKICAgIC8vIGRlZiBfZW1pdF91cGRhdGVkX2V2ZW50KHNlbGYsIGFzYTogQXNzZXQsIG1ldGFkYXRhX2hhc2g6IEJ5dGVzKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjM2MwogICAgLy8gcm91bmQ9R2xvYmFsLnJvdW5kLAogICAgZ2xvYmFsIFJvdW5kCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjM2NAogICAgLy8gdGltZXN0YW1wPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTo3NQogICAgLy8gcmV0dXJuIHNlbGYuYXNzZXRfbWV0YWRhdGEuYm94KGFzYSkuZXh0cmFjdCgKICAgIGZyYW1lX2RpZyAtMgogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTo3NS03NwogICAgLy8gcmV0dXJuIHNlbGYuYXNzZXRfbWV0YWRhdGEuYm94KGFzYSkuZXh0cmFjdCgKICAgIC8vICAgICBzdGFydF9pbmRleD1jb25zdC5JRFhfUkVWRVJTSUJMRV9GTEFHUywgbGVuZ3RoPWNvbnN0LlJFVkVSU0lCTEVfRkxBR1NfU0laRQogICAgLy8gKQogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5Ojc2CiAgICAvLyBzdGFydF9pbmRleD1jb25zdC5JRFhfUkVWRVJTSUJMRV9GTEFHUywgbGVuZ3RoPWNvbnN0LlJFVkVSU0lCTEVfRkxBR1NfU0laRQogICAgaW50Y18wIC8vIDEKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTo3NS03NwogICAgLy8gcmV0dXJuIHNlbGYuYXNzZXRfbWV0YWRhdGEuYm94KGFzYSkuZXh0cmFjdCgKICAgIC8vICAgICBzdGFydF9pbmRleD1jb25zdC5JRFhfUkVWRVJTSUJMRV9GTEFHUywgbGVuZ3RoPWNvbnN0LlJFVkVSU0lCTEVfRkxBR1NfU0laRQogICAgLy8gKQogICAgYm94X2V4dHJhY3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MzY1CiAgICAvLyByZXZlcnNpYmxlX2ZsYWdzPWFyYzQuQnl0ZShvcC5idG9pKHNlbGYuX2dldF9yZXZlcnNpYmxlX2ZsYWdzKGFzYSkpKSwKICAgIGJ0b2kKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBpbnRjXzIgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA3IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6OTktMTAyCiAgICAvLyByZXR1cm4gc2VsZi5hc3NldF9tZXRhZGF0YS5ib3goYXNhKS5leHRyYWN0KAogICAgLy8gICAgIHN0YXJ0X2luZGV4PWNvbnN0LklEWF9JUlJFVkVSU0lCTEVfRkxBR1MsCiAgICAvLyAgICAgbGVuZ3RoPWNvbnN0LklSUkVWRVJTSUJMRV9GTEFHU19TSVpFLAogICAgLy8gKQogICAgZGlnIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MTAwCiAgICAvLyBzdGFydF9pbmRleD1jb25zdC5JRFhfSVJSRVZFUlNJQkxFX0ZMQUdTLAogICAgaW50Y18zIC8vIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MTAxCiAgICAvLyBsZW5ndGg9Y29uc3QuSVJSRVZFUlNJQkxFX0ZMQUdTX1NJWkUsCiAgICBpbnRjXzAgLy8gMQogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTo5OS0xMDIKICAgIC8vIHJldHVybiBzZWxmLmFzc2V0X21ldGFkYXRhLmJveChhc2EpLmV4dHJhY3QoCiAgICAvLyAgICAgc3RhcnRfaW5kZXg9Y29uc3QuSURYX0lSUkVWRVJTSUJMRV9GTEFHUywKICAgIC8vICAgICBsZW5ndGg9Y29uc3QuSVJSRVZFUlNJQkxFX0ZMQUdTX1NJWkUsCiAgICAvLyApCiAgICBib3hfZXh0cmFjdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTozNjcKICAgIC8vIG9wLmJ0b2koc2VsZi5fZ2V0X2lycmV2ZXJzaWJsZV9mbGFncyhhc2EpKQogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTozNjYtMzY4CiAgICAvLyBpcnJldmVyc2libGVfZmxhZ3M9YXJjNC5CeXRlKAogICAgLy8gICAgIG9wLmJ0b2koc2VsZi5fZ2V0X2lycmV2ZXJzaWJsZV9mbGFncyhhc2EpKQogICAgLy8gKSwKICAgIGl0b2IKICAgIGR1cAogICAgYml0bGVuCiAgICBpbnRjXzIgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA3IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6NTgtNjEKICAgIC8vIHJldHVybiBzZWxmLmFzc2V0X21ldGFkYXRhLmJveChhc2EpLmV4dHJhY3QoCiAgICAvLyAgICAgc3RhcnRfaW5kZXg9Y29uc3QuSURYX01FVEFEQVRBX0lERU5USUZJRVJTLAogICAgLy8gICAgIGxlbmd0aD1jb25zdC5NRVRBREFUQV9JREVOVElGSUVSU19TSVpFLAogICAgLy8gKQogICAgZGlnIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6NTkKICAgIC8vIHN0YXJ0X2luZGV4PWNvbnN0LklEWF9NRVRBREFUQV9JREVOVElGSUVSUywKICAgIGludGNfMSAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjYwCiAgICAvLyBsZW5ndGg9Y29uc3QuTUVUQURBVEFfSURFTlRJRklFUlNfU0laRSwKICAgIGludGNfMCAvLyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjU4LTYxCiAgICAvLyByZXR1cm4gc2VsZi5hc3NldF9tZXRhZGF0YS5ib3goYXNhKS5leHRyYWN0KAogICAgLy8gICAgIHN0YXJ0X2luZGV4PWNvbnN0LklEWF9NRVRBREFUQV9JREVOVElGSUVSUywKICAgIC8vICAgICBsZW5ndGg9Y29uc3QuTUVUQURBVEFfSURFTlRJRklFUlNfU0laRSwKICAgIC8vICkKICAgIGJveF9leHRyYWN0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjcxCiAgICAvLyBjb25zdC5CSVRfUklHSFRNT1NUX0lERU5USUZJRVIgLSBmbGcuSURfU0hPUlQsCiAgICBpbnRjXzEgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTo2OS03MgogICAgLy8gcmV0dXJuIG9wLmdldGJpdCgKICAgIC8vICAgICBzZWxmLl9nZXRfbWV0YWRhdGFfaWRlbnRpZmllcnMoYXNhKSwKICAgIC8vICAgICBjb25zdC5CSVRfUklHSFRNT1NUX0lERU5USUZJRVIgLSBmbGcuSURfU0hPUlQsCiAgICAvLyApCiAgICBnZXRiaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MzYxLTM3MQogICAgLy8gYWJpLkFyYzg5TWV0YWRhdGFVcGRhdGVkKAogICAgLy8gICAgIGFzc2V0X2lkPWFzYS5pZCwKICAgIC8vICAgICByb3VuZD1HbG9iYWwucm91bmQsCiAgICAvLyAgICAgdGltZXN0YW1wPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgLy8gICAgIHJldmVyc2libGVfZmxhZ3M9YXJjNC5CeXRlKG9wLmJ0b2koc2VsZi5fZ2V0X3JldmVyc2libGVfZmxhZ3MoYXNhKSkpLAogICAgLy8gICAgIGlycmV2ZXJzaWJsZV9mbGFncz1hcmM0LkJ5dGUoCiAgICAvLyAgICAgICAgIG9wLmJ0b2koc2VsZi5fZ2V0X2lycmV2ZXJzaWJsZV9mbGFncyhhc2EpKQogICAgLy8gICAgICksCiAgICAvLyAgICAgaXNfc2hvcnQ9c2VsZi5faXNfc2hvcnQoYXNhKSwKICAgIC8vICAgICBoYXNoPWFiaS5IYXNoLmZyb21fYnl0ZXMobWV0YWRhdGFfaGFzaCksICAjIE5vIGxlbmd0aCB2YWxpZGF0aW9uCiAgICAvLyApCiAgICB1bmNvdmVyIDUKICAgIGl0b2IKICAgIHVuY292ZXIgNAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBieXRlY18yIC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDMKICAgIHNldGJpdAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTozNjAtMzcyCiAgICAvLyBhcmM0LmVtaXQoCiAgICAvLyAgICAgYWJpLkFyYzg5TWV0YWRhdGFVcGRhdGVkKAogICAgLy8gICAgICAgICBhc3NldF9pZD1hc2EuaWQsCiAgICAvLyAgICAgICAgIHJvdW5kPUdsb2JhbC5yb3VuZCwKICAgIC8vICAgICAgICAgdGltZXN0YW1wPUdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLAogICAgLy8gICAgICAgICByZXZlcnNpYmxlX2ZsYWdzPWFyYzQuQnl0ZShvcC5idG9pKHNlbGYuX2dldF9yZXZlcnNpYmxlX2ZsYWdzKGFzYSkpKSwKICAgIC8vICAgICAgICAgaXJyZXZlcnNpYmxlX2ZsYWdzPWFyYzQuQnl0ZSgKICAgIC8vICAgICAgICAgICAgIG9wLmJ0b2koc2VsZi5fZ2V0X2lycmV2ZXJzaWJsZV9mbGFncyhhc2EpKQogICAgLy8gICAgICAgICApLAogICAgLy8gICAgICAgICBpc19zaG9ydD1zZWxmLl9pc19zaG9ydChhc2EpLAogICAgLy8gICAgICAgICBoYXNoPWFiaS5IYXNoLmZyb21fYnl0ZXMobWV0YWRhdGFfaGFzaCksICAjIE5vIGxlbmd0aCB2YWxpZGF0aW9uCiAgICAvLyAgICAgKQogICAgLy8gKQogICAgcHVzaGJ5dGVzIDB4OGIwMzUwODQgLy8gbWV0aG9kICJBcmM4OU1ldGFkYXRhVXBkYXRlZCh1aW50NjQsdWludDY0LHVpbnQ2NCxieXRlLGJ5dGUsYm9vbCxieXRlWzMyXSkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzLmFzYV9tZXRhZGF0YV9yZWdpc3RyeS5jb250cmFjdC5Bc2FNZXRhZGF0YVJlZ2lzdHJ5Ll91cGRhdGVfaGVhZGVyX2V4Y2x1ZGluZ19mbGFnc19hbmRfZW1pdChhc2E6IHVpbnQ2NCkgLT4gdm9pZDoKX3VwZGF0ZV9oZWFkZXJfZXhjbHVkaW5nX2ZsYWdzX2FuZF9lbWl0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTozNzQKICAgIC8vIGRlZiBfdXBkYXRlX2hlYWRlcl9leGNsdWRpbmdfZmxhZ3NfYW5kX2VtaXQoc2VsZiwgYXNhOiBBc3NldCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weTozNzUtMzc2CiAgICAvLyAjIOKaoO+4jyBUaGUgc3Vicm91dGluZSBhc3N1bWVzIHRoYXQgTWV0YWRhdGEgRmxhZ3MgaGF2ZSBhbHJlYWR5IGJlZW4gc2V0CiAgICAvLyBzZWxmLl9pZGVudGlmeV9tZXRhZGF0YShhc2EpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgX2lkZW50aWZ5X21ldGFkYXRhCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjM3NwogICAgLy8gbWV0YWRhdGFfaGFzaCA9IHNlbGYuX2NvbXB1dGVfbWV0YWRhdGFfaGFzaChhc2EpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgX2NvbXB1dGVfbWV0YWRhdGFfaGFzaAogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weToxMjkKICAgIC8vIHNlbGYuYXNzZXRfbWV0YWRhdGEuYm94KGFzYSkucmVwbGFjZSgKICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weToxMjktMTMxCiAgICAvLyBzZWxmLmFzc2V0X21ldGFkYXRhLmJveChhc2EpLnJlcGxhY2UoCiAgICAvLyAgICAgc3RhcnRfaW5kZXg9Y29uc3QuSURYX01FVEFEQVRBX0hBU0gsIHZhbHVlPW1ldGFkYXRhX2hhc2gKICAgIC8vICkKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weToxMzAKICAgIC8vIHN0YXJ0X2luZGV4PWNvbnN0LklEWF9NRVRBREFUQV9IQVNILCB2YWx1ZT1tZXRhZGF0YV9oYXNoCiAgICBwdXNoaW50IDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MTI5LTEzMQogICAgLy8gc2VsZi5hc3NldF9tZXRhZGF0YS5ib3goYXNhKS5yZXBsYWNlKAogICAgLy8gICAgIHN0YXJ0X2luZGV4PWNvbnN0LklEWF9NRVRBREFUQV9IQVNILCB2YWx1ZT1tZXRhZGF0YV9oYXNoCiAgICAvLyApCiAgICBkaWcgMwogICAgYm94X3JlcGxhY2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6Mzc5CiAgICAvLyBzZWxmLl9zZXRfbGFzdF9tb2RpZmllZF9yb3VuZChhc2EsIEdsb2JhbC5yb3VuZCkKICAgIGdsb2JhbCBSb3VuZAogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV9tZXRhZGF0YV9yZWdpc3RyeS9jb250cmFjdC5weToxNDQKICAgIC8vIHZhbHVlPW9wLml0b2IobGFzdF9tb2RpZmllZF9yb3VuZCksCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjE0MwogICAgLy8gc3RhcnRfaW5kZXg9Y29uc3QuSURYX0xBU1RfTU9ESUZJRURfUk9VTkQsCiAgICBwdXNoaW50IDM1CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX21ldGFkYXRhX3JlZ2lzdHJ5L2NvbnRyYWN0LnB5OjE0Mi0xNDUKICAgIC8vIHNlbGYuYXNzZXRfbWV0YWRhdGEuYm94KGFzYSkucmVwbGFjZSgKICAgIC8vICAgICBzdGFydF9pbmRleD1jb25zdC5JRFhfTEFTVF9NT0RJRklFRF9ST1VORCwKICAgIC8vICAgICB2YWx1ZT1vcC5pdG9iKGxhc3RfbW9kaWZpZWRfcm91bmQpLAogICAgLy8gKQogICAgc3dhcAogICAgYm94X3JlcGxhY2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfbWV0YWRhdGFfcmVnaXN0cnkvY29udHJhY3QucHk6MzgwCiAgICAvLyBzZWxmLl9lbWl0X3VwZGF0ZWRfZXZlbnQoYXNhLCBtZXRhZGF0YV9oYXNoKQogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICBjYWxsc3ViIF9lbWl0X3VwZGF0ZWRfZXZlbnQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc2FfdmFsaWRhdGlvbi5Bc2FWYWxpZGF0aW9uLl9pc19hc2FfbWFuYWdlcihhc2E6IHVpbnQ2NCkgLT4gdWludDY0OgpfaXNfYXNhX21hbmFnZXI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXNhX3ZhbGlkYXRpb24ucHk6MTgKICAgIC8vIGRlZiBfaXNfYXNhX21hbmFnZXIoc2VsZiwgYXNhOiBBc3NldCkgLT4gYm9vbDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV92YWxpZGF0aW9uLnB5OjE5CiAgICAvLyByZXR1cm4gVHhuLnNlbmRlciA9PSBhc2EubWFuYWdlcgogICAgdHhuIFNlbmRlcgogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0TWFuYWdlcgogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgPT0KICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5hc2FfdmFsaWRhdGlvbi5Bc2FWYWxpZGF0aW9uLl9pc19hcmM1NF9jb21wbGlhbnQoYXNhOiB1aW50NjQpIC0+IHVpbnQ2NDoKX2lzX2FyYzU0X2NvbXBsaWFudDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfdmFsaWRhdGlvbi5weTo0MAogICAgLy8gZGVmIF9pc19hcmM1NF9jb21wbGlhbnQoc2VsZiwgYXNhOiBBc3NldCkgLT4gYm9vbDoKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV92YWxpZGF0aW9uLnB5OjQxCiAgICAvLyBjbGF3YmFjaywgZXhpc3RzID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfY2xhd2JhY2soYXNhKQogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0Q2xhd2JhY2sKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hc2FfdmFsaWRhdGlvbi5weTo0MgogICAgLy8gcmV0dXJuIGV4aXN0cyBhbmQgY2xhd2JhY2sgPT0gR2xvYmFsLnplcm9fYWRkcmVzcwogICAgYnogX2lzX2FyYzU0X2NvbXBsaWFudF9ib29sX2ZhbHNlQDMKICAgIGZyYW1lX2RpZyAwCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgID09CiAgICBieiBfaXNfYXJjNTRfY29tcGxpYW50X2Jvb2xfZmFsc2VAMwogICAgaW50Y18wIC8vIDEKCl9pc19hcmM1NF9jb21wbGlhbnRfYm9vbF9tZXJnZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2FzYV92YWxpZGF0aW9uLnB5OjQyCiAgICAvLyByZXR1cm4gZXhpc3RzIGFuZCBjbGF3YmFjayA9PSBHbG9iYWwuemVyb19hZGRyZXNzCiAgICBzd2FwCiAgICByZXRzdWIKCl9pc19hcmM1NF9jb21wbGlhbnRfYm9vbF9mYWxzZUAzOgogICAgaW50Y18xIC8vIDAKICAgIGIgX2lzX2FyYzU0X2NvbXBsaWFudF9ib29sX21lcmdlQDQK", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEyCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==" }, "byteCode": { "approval": "DCAHAQAIAu8H7geq7gEmFgAEFR98dQEAGUVSUjphc3NldE1ldGFkYXRhTm90RXhpc3QQRVJSOnVuYXV0aG9yaXplZBNFUlI6ZXhjZWVkc1BhZ2VTaXplGEVSUjptZXRhZGF0YVNpemVNaXNtYXRjaA1FUlI6aW1tdXRhYmxlD0VSUjphc2FOb3RFeGlzdBJFUlI6cGFnZUlkeEludmFsaWQTRVJSOnBheWxvYWRPdmVyZmxvdwQ3rHVdAwaBARtFUlI6bWJyRGVsdGFSZWNlaXZlckludmFsaWQYRVJSOmFzYU5vdEFyYzU0Q29tcGxpYW50GUVSUjptYnJEZWx0YUFtb3VudEludmFsaWQFFR98dQEXRVJSOmV4Y2VlZHNNZXRhZGF0YVNpemUSRVJSOmZsYWdJZHhJbnZhbGlkGkVSUjpleGNlZWRzTWF4TWV0YWRhdGFTaXplAAAxG0EBAzEZFEQxGESCBgR4QHgxBLgup+8EEkX6+wQEXy5uBN3/y5IEFbJ1sicLghYEtRIdigRJ+66RBAtTjOMEAV5XmwQIn66hBI5eECQEJExHxAQtWfbgBO6FtHMEt1kxvASPJe9yBBHDhHYEsKv2WwTOnb7XBMpS+x4EImORuQR6E9UyBFPCIgME03cq0wR9oq9ABABW2cEEuS4mejYaAI4dAWsEDAS8BWwF2gZEBr8HGAd1B9wAAwf0CAgIiwitCN4JBglVCZEKDwprCocK7wsOC04Legu6AAEMPAAiQ4AjFR98dQgAM3cqEAAD7wfuB/IH8AAAAAAAAAnEAAAAAAAAAZCwIkMxGRQxGBQQRDEAJxQSQAAZgBVFUlI6dW50cnVzdGVkRGVwbG95ZXKwACJDigIAi/6BCgiLADIMDUEAKrGBBrIQgQWyGScMsh4nDLIfi/+NAgALAASzQv/bMgCyAUL/9SOyAUL/74mKAgGL/xWL/hVKDkRJTwIJSUsCD0sCTE2L/kxPAlKL/xKJigIBI0koMhGAIMBhxNj8Hb3e0tdgS+RWjj9tBBmHrDe95LYgtas5JIrfEkEAgSiAC2FsZ29yYW5kOi8vTFCABGFwcC9QjAEojACL/owCiwJBAECLAkmBChhJgQoPSwGBCk8CTUwiCEmBCg+BCkxNSUsCDEsCTE2ACjAxMjM0NTY3ODlOAlKLAFCMAIEKCowCQv+7iwBJFYABME4CTYsBTFCABT9ib3g9UIv/UIwAiScVgAEvUEL/dyNHBChHBDYaAUkVJBJEF0k2GgJJTgIVIhJENhoDSU4CFSISRDYaBEkVJRJENhoFSSNZJQhLARUSRFcCAE4CMRYiCUlOAzgQIhJEF0lOAksBTIgM7hZJvUUBQQAagBZFUlI6YXNzZXRNZXRhZGF0YUV4aXN0sABLAjgHMgoSQAAEJw2wADIKcwFMRQtESSO5SEsDFUEAB4G8BSOI/k5LBklLA0sGiAp9SYgLqEsGFxZXBwFLAklOAiJPArtLBhcWVwcBJUy7cQZMSU4CRRJEgCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABNJRQ1BAaBJJSK6I1NAABmAFUVSUjpyZXF1aXJlc0ltbXV0YWJsZbAASw9FDUcCgQNLD7syBhZLAYEjTwK7IxZLAYErTwK7JSK6gQdTQQA7SwZJcQRMSU4DRRJEcQVMRRBEgARhcmMzEkEA/yJAABuAF0VSUjphc2FOb3RBcmMzQ29tcGxpYW50sABJJSK6gQVTQQAMSwaIDMpAAAQnDrAASSUiuoEGU0EAejIIKIj9p0lFEksHcQVMSU4CRRFEFUlFC0wVSUUKDEEAgSNAAByAGEVSUjphc2FOb3RBcmM4OUNvbXBsaWFudLAASwtBADRJJSK6gQdTQAAqSwaICvdLEBJAAB+AG0VSUjphc2FNZXRhZGF0YUhhc2hNaXNtYXRjaLAASwZLDYgLtjIKcwFESwoJSUUMSwM4CA5AAAQnD7AASwoWJxBMULAiQ0sHSUsKSU4DDkRJSwIPTE4CTUsOI08CUksREkL/YksOFYEFD0EAE0sOgAVAYXJjM4j8tkEABCJC/uZLDRWBBQ9BABNLDYAFI2FyYzOI/JpBAAQiQv7KI0L+xksGiApLRQ1C/nwoSTYaAUkVJBJEF0k2GgJJFSUSRDYaA0kjWSUISwEVEkRXAgBOAhdJTgJKiAqcTIgILg5AABqAFkVSUjpsYXJnZXJNZXRhZGF0YVNpemWwADIKcwFMRQVESwJJSwJJTgNLBYgIHkmICxqIB/QSQAAEJwawADIKcwFESwRMCUlFBkAAFCMWSZMkDkRXBwFLBRZQKUxQsCJDgf8BsUsDcQdESwayCLIHIrIQI7IBs0L/1ChJNhoBSRUkEkQXSTYaAkkVJRJENhoDSSNZJQhLARUSRFcCAE4CMRYiCUlOAzgQIhJEF0lOAkqICeBMiAdyDUAAG4AXRVJSOnNtYWxsZXJNZXRhZGF0YVNpemWwAEsBOAcyChJAAAQnDbAAMgpzAUxFBkRLA0lLAklOA0sGiAdTSYgKT4gHKRJAAAQnBrAAMgpzAURLBQlJRQdLAjgIDkAABCcPsABLBRYnEExQsCJDIyg2GgFJFSQSRBdJNhoCSRUlEkQ2GgNJI1klCEsBFRJEVwIASU4DSwKIBtRLA0yICThMF0lOA0wVSU4DCEyIBr8OQAAEJxGwAEsDFklFB4EzSwMISUUHSwK6SwMTQQAMSwVLBUsEu0sDiAm3IkM2GgFJFSQSRBdJNhoCSRUkEkQXSU8CiAkmMggTQAAcgBhFUlI6bmV3UmVnaXN0cnlJZEludmFsaWSwAEsBFksBFksBgStPArsyBjIHSwKBKyS6FxZPA0xQTwIWUEwWUIAEyHAjv0xQsCJDNhoBSRUkEkQXSRZJvUUBQAADK7AASwFxC0UBQQAZSSUiuiNTQQAEJwewAEsBiAk/QAAEJwSwADIKcwFESwFJTgK8SDIKcwFECbExAEsBsgiyByKyECOyAbMyBzIGFk8DTFBMFlCABLw/INFMULAWgAUVH3x1/0xQsCJDNhoBSRUkEkQXNhoCSSNZJQhMFRJEMgQlD0AAGYAVRVJSOm5vUGF5bG9hZEhlYWRDYWxssABJcQtFAUAABCcIsABJFr1FAUAAAyuwAEmICKRAAAQnBLAAIkMjKDYaAUkVJBJEF0k2GgJJFSISRDYaA0kVIhJEI1NOAkyIB90XSYEHDkAABCcSsABLAhZJRQYiSbqBB0sCCUlFBlNLAhNBABNLBEkiSbpLBUsEVCJMu0sCiAgcIkMjNhoBSRUkEkQXSTYaAkkVIhJETIgHjRdJJQ9BAEVJgQYOQQA+IkAABCcSsABLARZJRQQlIrqBB0sCCVNAACJLAUlLAogEm4gH0EsCJSK6gQVTQQAMSwGIB/BAAAQnDrAAIkMjQv+/NhoBSRUkEkQXSYgHMEmBB4gEaIgHnSJDMggoiPi5SRUWVwYCTFApTFCwIkMoSTYaAUkVJBJEFzYaAkkVJRJEF0khBg5AAAQnE7AASwEWvUUBQQBMSwGIBDdJRQQjRQVLARJBAB4jSYGQA08CC0sFCEwWSZMkDkRXBwFMFlApTFCwIkNJSwMNQQAKIksBSwQJTEL/04H/AUsDSwIJTEL/x4HEE0UEIoE7SwIITEL/uDYaAUkVJBJEF0lxC04CSBa9RQEqI08DVCJPAlQpTFCwIkM2GgFJFSQSRBdHAogGQRYlIrojU0AACklxB0QyAxJBAAwiKiNPAlQpTFCwIkMjQv/xNhoBSRUkEkQXSYgGERZJIyK6I1NMgSMkuhcqI08DVEwWUClMULAiQzYaAUkVJBJEF0mIBekWSSMiuksBIkm6SwIlIrpLA4MCAyC6SRWBIBJESwSBIyS6F08FgSskuhdPBU8FUE8EUE8DUE8CFlBMFlApTFCwIkM2GgFJFSQSRBdJiAWaSYgDBhZJk4EQDkRXBgJMiAL4IQUIIQQKFkmTJA5EVwcBTIACA+9QTFApTFCwIkMoSTYaAUkVJBJEF0k2GgJJTgIVIhJESYgFUYgCviEFCCEECklOAkEARhdJRQRLAQxAAAQnCbAASSIJSwNJTwIMRQVLAkyIA3hLAhaBIyS6FyojSwdUTBZQTEkVFlcGAkxQTIACAAtQTFApTFCwIkMXQQAEJwmwACNFBChC/8ooNhoBSRUkEkQXSTYaAklOAhUlEkQ2GgNJFSUSREyIBMwXSSEEDkAABCcFsABLARdJRQVLAQhLA4gCIg5AAAQnEbAASwIWgTNLBQhLArpJFRZXBgJMUClMULAiQzYaAUkVJBJEF0mIBISIA19JFYEgEkQpTFCwIkMoNhoBSRUkEkQXSTYaAklOAhUiEkRJiARciAHJIQUIIQQKSUEALUsBF0lFBUsBDEAABCcJsABLAklLBUlOA4gCiUxOAogDT0kVgSASRClMULAiQ4ARRVJSOmVtcHR5TWV0YWRhdGGwADYaAUkVJBJEF0mIBAAWgwIDILpJFYEgEkQpTFCwIkM2GgFJFSQSRBc2GgJJI1klCEsBFRJEVwIASwGIA9BMiAJZTF8ASRVJIQQOQAAEJwWwAEkWVwYCSwJQKUxQsCJDNhoBSRUkEkQXNhoCSSNZJQhLARUSRFcCAEsBiAOQTIgCGUxfARYpTFCwIkM2GgFJFSQSRBc2GgJJI1klCEsBFRJEVwIASwGIA2RMiAHtTF8CSRVJIQQOQAAEJwWwAEkWVwYCSwJQKUxQsCJDIyg2GgFJFSQSRBdJNhoCSSNZJQhLARUSRFcCAEw2GgNJFSISREyIAxkXSSIOQAAagBZFUlI6YjY0RW5jb2RpbmdJbnZhbGlksABLAogBgEsCXwBLAUAAI14ARQVLBBVJRQUhBA5AAAQnBbAASwMWVwYCSwVQKUxQsCJDXgFFBUL/2jIKcwBEMgpzAUQJsTIJsgeyCCKyECOyAbMiQ4oCAIv+FkklIrqBB4v/CSJUJUy7iYoBAYv/Fr1EgTMJiYoCAIv+Fkm9RIv/FUsBCEsCTNOL/7uJigMAIyhJi/0WSYEz04v9i/+I/9WL/Yj/xIv+DkAABCcKsAAyBIwBMRYiCIwCiwKLAQxBAH2LAjgQgQYSQQBviwI4GDIIEkEAZYsCOBlAAF4iQQBWiwIjwhonCxJBAEuLAiLCGosDEkEAQCJBADOLAiXCGlcCAEmMAIv9iP9fTBUIi/4OQAAEJwqwAIv9iwCI/1eL/Yj/Rov+DkAABCcKsACLAiIIjAJC/4MjQv+9I0L/n4v9iP8mi/4SQAAEJwawAImKAgGL/oj/E0mL/yEEC0lPAg9BAAQojACJiwCLAUlOAgkhBEsBDCEETE2L/haBM08DCE8CuowAiYoBAYv/FkkjIrojU0AAGIAURVJSOm1ldGFkYXRhTm90U2hvcnSwAIv/iP63iwCBM08CukyJigEAi/+I/qaL/xZJIyK6TwKBgCAOI0xUI0y7iYoBAYFuI4jyc4v/FkkjIrpLASJJuksCJSK6i/+I/nMWVwYCgA5hcmMwMDg5L2hlYWRlck8FUE8EUE8DUE8CUExQA4mKAwGB5gEjiPIvi/0Wi/4WVwcBi/8VFlcGAoAMYXJjMDA4OS9wYWdlTwNQTwJQTFCL/1ADiYoBASiL/4j/f4v/iP4MIQUIIQQKSShMQQArI4wAiwCLAgxBACCL/4sASU4CiP7Qi/9LAk8CiP+TiwNMUIwDIgiMAEL/2IAKYXJjMDA4OS9hbYsBUIsDUAOMAImKAgCL/nELRQFAAAQnCLAAi/6IAPFAAAQnBLAAi/8hBg5AAAQnE7AAiYoCAIv+i/+I/82L/hZJvUUBQAADK7AAiwAlIrojU0EABCcHsACJigEAi/9xC0UBQAAEJwiwAIv/Fr1FAUAAAyuwAImKAQCL/4j/24v/iACNQAAEJwSwAIv/FiUiuiNTQQAEJwewAImKAgAyBjIHi/4WSSJJuhcWSZMkDkRXBwFLASUiuhcWSZMkDkRXBwFLAiMiuiNTTwUWTwRMUE8EFlBPA1BPAlAqI08DVFCL/1CABIsDUIRMULCJigEAi/+I/ieL/4j+tov/FkmBA0sDuzIGFoEjTLuL/0yI/4uJigEBMQCL/3EHRBKJigEBi/9xCkEAC4sAMgMSQQADIkyJI0L/+g==", "clear": "DIEBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, "minor": 8, "patch": 1 } }, "events": [ { "name": "Arc89MetadataUpdated", "args": [ { "type": "uint64", "name": "asset_id" }, { "type": "uint64", "name": "round" }, { "type": "uint64", "name": "timestamp" }, { "type": "byte", "name": "reversible_flags" }, { "type": "byte", "name": "irreversible_flags" }, { "type": "bool", "name": "is_short" }, { "type": "byte[32]", "name": "hash" } ], "desc": "Event emitted when Asset Metadata is created or updated" }, { "name": "Arc89MetadataMigrated", "args": [ { "type": "uint64", "name": "asset_id" }, { "type": "uint64", "name": "new_registry_id" }, { "type": "uint64", "name": "round" }, { "type": "uint64", "name": "timestamp" } ], "desc": "Event emitted when Asset Metadata has been migrated to a new ASA Metadata Registry version" }, { "name": "Arc89MetadataDeleted", "args": [ { "type": "uint64", "name": "asset_id" }, { "type": "uint64", "name": "round" }, { "type": "uint64", "name": "timestamp" } ], "desc": "Event emitted when Asset Metadata is deleted" } ], "templateVariables": { "TRUSTED_DEPLOYER": { "type": "address" }, "ARC90_NETAUTH": { "type": "AVMBytes" } } }