{ "name": "CappedSmartAsa", "structs": { "AssetConfig": [ { "name": "total", "type": "uint64" }, { "name": "decimals", "type": "uint32" }, { "name": "default_frozen", "type": "bool" }, { "name": "unit_name", "type": "string" }, { "name": "name", "type": "string" }, { "name": "url", "type": "string" }, { "name": "metadata_hash", "type": "byte[]" }, { "name": "manager_addr", "type": "address" }, { "name": "reserve_addr", "type": "address" }, { "name": "freeze_addr", "type": "address" }, { "name": "clawback_addr", "type": "address" } ] }, "methods": [ { "name": "asset_create", "args": [ { "type": "uint64", "name": "total", "desc": "The total number of base units of the Smart ASA to create" }, { "type": "uint32", "name": "decimals", "desc": "The number of digits to use after the decimal point when displaying the Smart ASA" }, { "type": "bool", "name": "default_frozen", "desc": "Smart ASA default frozen (True to freeze holdings by default)" }, { "type": "string", "name": "unit_name", "desc": "The name of a unit of Smart ASA" }, { "type": "string", "name": "name", "desc": "The name of the Smart ASA" }, { "type": "string", "name": "url", "desc": "Smart ASA external URL" }, { "type": "byte[]", "name": "metadata_hash", "desc": "Smart ASA metadata hash" }, { "type": "address", "name": "manager_addr", "desc": "Account that can manage the configuration of the Smart ASA and destroy it" }, { "type": "address", "name": "reserve_addr", "desc": "Account that can issue and redeem units of the Smart ASA" }, { "type": "address", "name": "freeze_addr", "desc": "Account that can freeze/unfreeze holdings of the Smart ASA globally or locally" }, { "type": "address", "name": "clawback_addr", "desc": "Account that can clawback holdings of the Smart ASA" } ], "returns": { "type": "uint64", "desc": "Controlled ASA ID" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Create the Controlled ASA", "events": [], "recommendations": {} }, { "name": "asset_config", "args": [ { "type": "asset", "name": "config_asset", "desc": "Smart ASA ID to configure" }, { "type": "uint64", "name": "total", "desc": "Total number of base units of the Smart ASA. It can not be less than current circulating supply" }, { "type": "uint32", "name": "decimals", "desc": "The number of digits to use after the decimal point when displaying the Smart ASA" }, { "type": "bool", "name": "default_frozen", "desc": "Ignored, as for native ASA (set on creation only)" }, { "type": "string", "name": "unit_name", "desc": "The name of a unit of Smart ASA" }, { "type": "string", "name": "name", "desc": "The name of the Smart ASA" }, { "type": "string", "name": "url", "desc": "Smart ASA external URL" }, { "type": "byte[]", "name": "metadata_hash", "desc": "Smart ASA metadata hash" }, { "type": "address", "name": "manager_addr", "desc": "Account that can manage the configuration of the Smart ASA and destroy it" }, { "type": "address", "name": "reserve_addr", "desc": "Account that can issue and redeem units of the Smart ASA" }, { "type": "address", "name": "freeze_addr", "desc": "Account that can freeze/unfreeze holdings of the Smart ASA globally or locally" }, { "type": "address", "name": "clawback_addr", "desc": "Account that can clawback holdings of the Smart ASA" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Configure Smart ASA (for unchanged parameters use existing value - no optional args on AVM)", "events": [], "recommendations": {} }, { "name": "asset_transfer", "args": [ { "type": "asset", "name": "xfer_asset", "desc": "Smart ASA ID to transfer" }, { "type": "uint64", "name": "asset_amount", "desc": "Amount to transfer" }, { "type": "account", "name": "asset_sender", "desc": "Smart ASA sender" }, { "type": "account", "name": "asset_receiver", "desc": "Smart ASA receiver" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Smart ASA transfers: regular, clawback, issue, redeem", "events": [], "recommendations": {} }, { "name": "asset_freeze", "args": [ { "type": "asset", "name": "freeze_asset", "desc": "Smart ASA ID to globally freeze/unfreeze" }, { "type": "bool", "name": "asset_frozen", "desc": "Smart ASA frozen status" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Smart ASA global freeze (all accounts)", "events": [], "recommendations": {} }, { "name": "account_freeze", "args": [ { "type": "asset", "name": "freeze_asset", "desc": "Smart ASA ID to locally freeze/unfreeze" }, { "type": "account", "name": "freeze_account", "desc": "Account to freeze/unfreeze" }, { "type": "bool", "name": "asset_frozen", "desc": "Smart ASA frozen status" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Smart ASA local freeze (account specific)", "events": [], "recommendations": {} }, { "name": "asset_destroy", "args": [ { "type": "asset", "name": "destroy_asset", "desc": "Smart ASA ID to destroy" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "DeleteApplication" ] }, "readonly": false, "desc": "Destroy the Smart ASA", "events": [], "recommendations": {} }, { "name": "withdraw_excess_algo", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Withdraw the App ALGO above its MBR to the Manager (non-normative)", "events": [], "recommendations": {} }, { "name": "get_asset_config", "args": [ { "type": "asset", "name": "asset", "desc": "Smart ASA ID" } ], "returns": { "type": "(uint64,uint32,bool,string,string,string,byte[],address,address,address,address)", "struct": "AssetConfig", "desc": "Smart ASA configuration parameters" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Get Smart ASA configuration", "events": [], "recommendations": {} }, { "name": "get_asset_is_frozen", "args": [ { "type": "asset", "name": "freeze_asset", "desc": "Smart ASA ID" } ], "returns": { "type": "bool", "desc": "Smart ASA global frozen status" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Get Smart ASA global frozen status", "events": [], "recommendations": {} }, { "name": "get_account_is_frozen", "args": [ { "type": "asset", "name": "freeze_asset", "desc": "Smart ASA ID" }, { "type": "account", "name": "freeze_account", "desc": "Account to check" } ], "returns": { "type": "bool", "desc": "Smart ASA account frozen status" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Get Smart ASA account frozen status", "events": [], "recommendations": {} }, { "name": "get_circulating_supply", "args": [ { "type": "asset", "name": "asset", "desc": "Smart ASA ID" } ], "returns": { "type": "uint64", "desc": "Smart ASA circulating supply" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Get Smart ASA circulating supply", "events": [], "recommendations": {} } ], "arcs": [ 22, 28 ], "desc": "\n Example extension of the Smart ASA: regular transfers can't take a holding above a cap\n ", "networks": {}, "state": { "schema": { "global": { "ints": 5, "bytes": 8 }, "local": { "ints": 0, "bytes": 0 } }, "keys": { "global": { "total": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "dG90YWw=" }, "decimals": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "ZGVjaW1hbHM=" }, "default_frozen": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "ZGVmYXVsdF9mcm96ZW4=" }, "unit_name": { "keyType": "AVMString", "valueType": "AVMString", "key": "dW5pdF9uYW1l" }, "name": { "keyType": "AVMString", "valueType": "AVMString", "key": "bmFtZQ==" }, "url": { "keyType": "AVMString", "valueType": "AVMString", "key": "dXJs" }, "metadata_hash": { "keyType": "AVMString", "valueType": "AVMBytes", "key": "bWV0YWRhdGFfaGFzaA==" }, "manager_addr": { "keyType": "AVMString", "valueType": "address", "key": "bWFuYWdlcl9hZGRy" }, "reserve_addr": { "keyType": "AVMString", "valueType": "address", "key": "cmVzZXJ2ZV9hZGRy" }, "freeze_addr": { "keyType": "AVMString", "valueType": "address", "key": "ZnJlZXplX2FkZHI=" }, "clawback_addr": { "keyType": "AVMString", "valueType": "address", "key": "Y2xhd2JhY2tfYWRkcg==" }, "smart_asa_id": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "c21hcnRfYXNhX2lk" }, "global_frozen": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "Z2xvYmFsX2Zyb3plbg==" } }, "local": {}, "box": {} }, "maps": { "global": {}, "local": {}, "box": { "freeze_exceptions": { "keyType": "address", "valueType": "AVMBytes", "prefix": "Zg==" } } } }, "bareActions": { "create": [ "NoOp" ], "call": [] }, "sourceInfo": { "approval": { "sourceInfo": [ { "pc": [ 1889, 1931 ], "errorMessage": "ERR:boxMbrUnfunded" }, { "pc": [ 1236 ], "errorMessage": "ERR:clawbackDisabled" }, { "pc": [ 1568 ], "errorMessage": "ERR:clawbackRedeem" }, { "pc": [ 814 ], "errorMessage": "ERR:ctrlAsaExist" }, { "pc": [ 2478 ], "errorMessage": "ERR:ctrlAsaInvalid" }, { "pc": [ 2446 ], "errorMessage": "ERR:ctrlAsaNotExist" }, { "pc": [ 2021 ], "errorMessage": "ERR:freezeBoxesLeft" }, { "pc": [ 1190 ], "errorMessage": "ERR:freezeDisabled" }, { "pc": [ 1463, 1536, 1633 ], "errorMessage": "ERR:globalFrozen" }, { "pc": [ 1718 ], "errorMessage": "ERR:holdingCapExceeded" }, { "pc": [ 2567 ], "errorMessage": "ERR:metadataHashInvalid" }, { "pc": [ 1451 ], "errorMessage": "ERR:overIssue" }, { "pc": [ 1477, 1672 ], "errorMessage": "ERR:receiverFrozen" }, { "pc": [ 1148 ], "errorMessage": "ERR:reserveDisabled" }, { "pc": [ 2528 ], "errorMessage": "ERR:reserveFrozen" }, { "pc": [ 1415 ], "errorMessage": "ERR:selfIssue" }, { "pc": [ 1661 ], "errorMessage": "ERR:senderFrozen" }, { "pc": [ 1267 ], "errorMessage": "ERR:totalInvalid" }, { "pc": [ 1621 ], "errorMessage": "ERR:unauthorizedClawback" }, { "pc": [ 787 ], "errorMessage": "ERR:unauthorizedCreator" }, { "pc": [ 1757, 1819 ], "errorMessage": "ERR:unauthorizedFreeze" }, { "pc": [ 1100, 1964, 2066 ], "errorMessage": "ERR:unauthorizedManager" }, { "pc": [ 1391, 1524 ], "errorMessage": "ERR:unauthorizedReserve" }, { "pc": [ 1990 ], "errorMessage": "ERR:unitsIssued" }, { "pc": [ 332 ], "errorMessage": "ERR:wrongGlobalBytes" }, { "pc": [ 364 ], "errorMessage": "ERR:wrongGlobalUints" }, { "pc": [ 392 ], "errorMessage": "ERR:wrongLocalBytes" }, { "pc": [ 420 ], "errorMessage": "ERR:wrongLocalUints" }, { "pc": [ 1830, 1852, 1875, 1995, 2075, 2080 ], "errorMessage": "account funded" }, { "pc": [ 2408 ], "errorMessage": "account opted into asset" }, { "pc": [ 1195, 1206, 1581, 2161 ], "errorMessage": "check self.clawback_addr exists" }, { "pc": [ 2110 ], "errorMessage": "check self.decimals exists" }, { "pc": [ 1835, 2124, 2487 ], "errorMessage": "check self.default_frozen exists" }, { "pc": [ 1152, 1162, 1749, 1811, 2156 ], "errorMessage": "check self.freeze_addr exists" }, { "pc": [ 1456, 1529, 1626, 2317 ], "errorMessage": "check self.global_frozen exists" }, { "pc": [ 1092, 1956, 2058, 2148 ], "errorMessage": "check self.manager_addr exists" }, { "pc": [ 2144 ], "errorMessage": "check self.metadata_hash exists" }, { "pc": [ 2134 ], "errorMessage": "check self.name exists" }, { "pc": [ 1109, 1119, 1383, 1516, 1540, 2152, 2501 ], "errorMessage": "check self.reserve_addr exists" }, { "pc": [ 791, 923, 1419, 1676, 2420, 2450 ], "errorMessage": "check self.smart_asa_id exists" }, { "pc": [ 1430, 2105 ], "errorMessage": "check self.total exists" }, { "pc": [ 2129 ], "errorMessage": "check self.unit_name exists" }, { "pc": [ 2139 ], "errorMessage": "check self.url exists" }, { "pc": [ 654, 670, 686, 702, 978, 996, 1014, 1032 ], "errorMessage": "invalid array length header" }, { "pc": [ 646, 972, 1737, 1799 ], "errorMessage": "invalid number of bytes for arc4.bool" }, { "pc": [ 661, 677, 693, 709, 985, 1003, 1021, 1039 ], "errorMessage": "invalid number of bytes for arc4.dynamic_array" }, { "pc": [ 722, 732, 742, 752, 1053, 1063, 1073, 1083 ], "errorMessage": "invalid number of bytes for arc4.static_array" }, { "pc": [ 638, 965 ], "errorMessage": "invalid number of bytes for arc4.uint32" }, { "pc": [ 628, 952, 1338 ], "errorMessage": "invalid number of bytes for arc4.uint64" }, { "pc": [ 939, 1325, 1348, 1362, 1726, 1776, 1787, 1943, 2094, 2306, 2338, 2349, 2380 ], "errorMessage": "invalid number of bytes for arc4.uint8" }, { "pc": [ 2116 ], "errorMessage": "overflow" } ], "pcOffsetMethod": "none" }, "clear": { "sourceInfo": [], "pcOffsetMethod": "none" } }, "source": { "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgMzIgMiAxODQ0Njc0NDA3MzcwOTU1MTYxNQogICAgYnl0ZWNibG9jayAicmVzZXJ2ZV9hZGRyIiAiZnJlZXplX2FkZHIiICJzbWFydF9hc2FfaWQiICJtYW5hZ2VyX2FkZHIiICJjbGF3YmFja19hZGRyIiAiZ2xvYmFsX2Zyb3plbiIgInRvdGFsIiAiZGVmYXVsdF9mcm96ZW4iIDB4MTUxZjdjNzUgImRlY2ltYWxzIiAidW5pdF9uYW1lIiAibmFtZSIgInVybCIgIm1ldGFkYXRhX2hhc2giICJFUlI6dW5hdXRob3JpemVkTWFuYWdlciIgIkVSUjpnbG9iYWxGcm96ZW4iIDB4NjYgMHgwMCAiRVJSOnVuYXV0aG9yaXplZFJlc2VydmUiICJFUlI6cmVjZWl2ZXJGcm96ZW4iICJFUlI6dW5hdXRob3JpemVkRnJlZXplIiAiRVJSOmJveE1iclVuZnVuZGVkIgogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo0NwogICAgLy8gVHhuLmdsb2JhbF9udW1fYnl0ZV9zbGljZSA9PSBjZmcuR0xPQkFMX0JZVEVTLCBlcnIuV1JPTkdfR0xPQkFMX0JZVEVTCiAgICB0eG4gR2xvYmFsTnVtQnl0ZVNsaWNlCiAgICBwdXNoaW50IDgKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjQ1LTQ4CiAgICAvLyAjIFByZWNvbmRpdGlvbnMKICAgIC8vIGxvZ2dlZF9hc3NlcnQoCiAgICAvLyAgICAgVHhuLmdsb2JhbF9udW1fYnl0ZV9zbGljZSA9PSBjZmcuR0xPQkFMX0JZVEVTLCBlcnIuV1JPTkdfR0xPQkFMX0JZVEVTCiAgICAvLyApCiAgICBibnogbWFpbl9hZnRlcl9hc3NlcnRAMjYKICAgIHB1c2hieXRlcyAiRVJSOndyb25nR2xvYmFsQnl0ZXMiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6d3JvbmdHbG9iYWxCeXRlcwoKbWFpbl9hZnRlcl9hc3NlcnRAMjY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjQ5CiAgICAvLyBsb2dnZWRfYXNzZXJ0KFR4bi5nbG9iYWxfbnVtX3VpbnQgPT0gY2ZnLkdMT0JBTF9VSU5UUywgZXJyLldST05HX0dMT0JBTF9VSU5UUykKICAgIHR4biBHbG9iYWxOdW1VaW50CiAgICBwdXNoaW50IDUKICAgID09CiAgICBibnogbWFpbl9hZnRlcl9hc3NlcnRAMjgKICAgIHB1c2hieXRlcyAiRVJSOndyb25nR2xvYmFsVWludHMiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6d3JvbmdHbG9iYWxVaW50cwoKbWFpbl9hZnRlcl9hc3NlcnRAMjg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBUeG4ubG9jYWxfbnVtX2J5dGVfc2xpY2UgPT0gY2ZnLkxPQ0FMX0JZVEVTLCBlcnIuV1JPTkdfTE9DQUxfQllURVMKICAgIHR4biBMb2NhbE51bUJ5dGVTbGljZQogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo1MC01MgogICAgLy8gbG9nZ2VkX2Fzc2VydCgKICAgIC8vICAgICBUeG4ubG9jYWxfbnVtX2J5dGVfc2xpY2UgPT0gY2ZnLkxPQ0FMX0JZVEVTLCBlcnIuV1JPTkdfTE9DQUxfQllURVMKICAgIC8vICkKICAgIGJ6IG1haW5fYWZ0ZXJfYXNzZXJ0QDMwCiAgICBwdXNoYnl0ZXMgIkVSUjp3cm9uZ0xvY2FsQnl0ZXMiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6d3JvbmdMb2NhbEJ5dGVzCgptYWluX2FmdGVyX2Fzc2VydEAzMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NTMKICAgIC8vIGxvZ2dlZF9hc3NlcnQoVHhuLmxvY2FsX251bV91aW50ID09IGNmZy5MT0NBTF9VSU5UUywgZXJyLldST05HX0xPQ0FMX1VJTlRTKQogICAgdHhuIExvY2FsTnVtVWludAogICAgYnogbWFpbl9hZnRlcl9hc3NlcnRAMzIKICAgIHB1c2hieXRlcyAiRVJSOndyb25nTG9jYWxVaW50cyIKICAgIGxvZwogICAgZXJyIC8vIEVSUjp3cm9uZ0xvY2FsVWludHMKCm1haW5fYWZ0ZXJfYXNzZXJ0QDMyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo1NS01NwogICAgLy8gIyBHTE9CQUwgU1RBVEUKICAgIC8vICMgQVNBIEZpZWxkcwogICAgLy8gc2VsZi50b3RhbCA9IFVJbnQ2NCgpCiAgICBieXRlYyA2IC8vICJ0b3RhbCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo1OAogICAgLy8gc2VsZi5kZWNpbWFscyA9IFVJbnQ2NCgpCiAgICBieXRlYyA5IC8vICJkZWNpbWFscyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo1OQogICAgLy8gc2VsZi5kZWZhdWx0X2Zyb3plbiA9IEZhbHNlCiAgICBieXRlYyA3IC8vICJkZWZhdWx0X2Zyb3plbiIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo2MAogICAgLy8gc2VsZi51bml0X25hbWUgPSBTdHJpbmcoKQogICAgYnl0ZWMgMTAgLy8gInVuaXRfbmFtZSIKICAgIHB1c2hieXRlcyAiIgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NjEKICAgIC8vIHNlbGYubmFtZSA9IFN0cmluZygpCiAgICBieXRlYyAxMSAvLyAibmFtZSIKICAgIHB1c2hieXRlcyAiIgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NjIKICAgIC8vIHNlbGYudXJsID0gU3RyaW5nKCkKICAgIGJ5dGVjIDEyIC8vICJ1cmwiCiAgICBwdXNoYnl0ZXMgIiIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjYzCiAgICAvLyBzZWxmLm1ldGFkYXRhX2hhc2ggPSBCeXRlcygpCiAgICBieXRlYyAxMyAvLyAibWV0YWRhdGFfaGFzaCIKICAgIHB1c2hieXRlcyAweAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NjQKICAgIC8vIHNlbGYubWFuYWdlcl9hZGRyID0gQWNjb3VudCgpCiAgICBieXRlY18zIC8vICJtYW5hZ2VyX2FkZHIiCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjY1CiAgICAvLyBzZWxmLnJlc2VydmVfYWRkciA9IEFjY291bnQoKQogICAgYnl0ZWNfMCAvLyAicmVzZXJ2ZV9hZGRyIgogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo2NgogICAgLy8gc2VsZi5mcmVlemVfYWRkciA9IEFjY291bnQoKQogICAgYnl0ZWNfMSAvLyAiZnJlZXplX2FkZHIiCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjY3CiAgICAvLyBzZWxmLmNsYXdiYWNrX2FkZHIgPSBBY2NvdW50KCkKICAgIGJ5dGVjIDQgLy8gImNsYXdiYWNrX2FkZHIiCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjY4LTY5CiAgICAvLyAjIFNtYXJ0IEFTQSBGaWVsZHMKICAgIC8vIHNlbGYuc21hcnRfYXNhX2lkID0gVUludDY0KCkKICAgIGJ5dGVjXzIgLy8gInNtYXJ0X2FzYV9pZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo3MAogICAgLy8gc2VsZi5nbG9iYWxfZnJvemVuID0gRmFsc2UKICAgIGJ5dGVjIDUgLy8gImdsb2JhbF9mcm96ZW4iCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NhcHBlZF9zbWFydF9hc2EvY29udHJhY3QucHk6MTAtMTkKICAgIC8vIGNsYXNzIENhcHBlZFNtYXJ0QXNhKAogICAgLy8gICAgIFNtYXJ0QXNhLAogICAgLy8gICAgICMgU2FtZSBzY2hlbWEgYXMgdGhlIFNtYXJ0IEFTQTogY3VzdG9tIHN0YXRlIGdvZXMgaW4gYm94ZXMKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMoCiAgICAvLyAgICAgICAgIGdsb2JhbF9ieXRlcz1jZmcuR0xPQkFMX0JZVEVTLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9Y2ZnLkdMT0JBTF9VSU5UUywKICAgIC8vICAgICAgICAgbG9jYWxfYnl0ZXM9Y2ZnLkxPQ0FMX0JZVEVTLAogICAgLy8gICAgICAgICBsb2NhbF91aW50cz1jZmcuTE9DQUxfVUlOVFMsCiAgICAvLyAgICAgKSwKICAgIC8vICk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAyMQogICAgcHVzaGJ5dGVzIDB4NGIxN2JmMjAgLy8gbWV0aG9kICJhc3NldF9kZXN0cm95KGFzc2V0KXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX2Fzc2V0X2Rlc3Ryb3lfcm91dGVANQoKbWFpbl9zd2l0Y2hfY2FzZV9uZXh0QDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY2FwcGVkX3NtYXJ0X2FzYS9jb250cmFjdC5weToxMC0xOQogICAgLy8gY2xhc3MgQ2FwcGVkU21hcnRBc2EoCiAgICAvLyAgICAgU21hcnRBc2EsCiAgICAvLyAgICAgIyBTYW1lIHNjaGVtYSBhcyB0aGUgU21hcnQgQVNBOiBjdXN0b20gc3RhdGUgZ29lcyBpbiBib3hlcwogICAgLy8gICAgIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscygKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPWNmZy5HTE9CQUxfQllURVMsCiAgICAvLyAgICAgICAgIGdsb2JhbF91aW50cz1jZmcuR0xPQkFMX1VJTlRTLAogICAgLy8gICAgICAgICBsb2NhbF9ieXRlcz1jZmcuTE9DQUxfQllURVMsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPWNmZy5MT0NBTF9VSU5UUywKICAgIC8vICAgICApLAogICAgLy8gKToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydAogICAgcHVzaGJ5dGVzcyAweGU3ZWNkNWE4IDB4ZWU2YTg0YWEgMHgyZmM3NDNhOCAweDE1Y2YyYmEzIDB4N2IzNTFjZTUgMHg5ZjYwZjM4ZiAweGNlMmYwNWYzIDB4MTI3ZmI3MTcgMHgwMjZmOGE5ZCAweGU5NzQ4M2JmIC8vIG1ldGhvZCAiYXNzZXRfY3JlYXRlKHVpbnQ2NCx1aW50MzIsYm9vbCxzdHJpbmcsc3RyaW5nLHN0cmluZyxieXRlW10sYWRkcmVzcyxhZGRyZXNzLGFkZHJlc3MsYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgImFzc2V0X2NvbmZpZyhhc3NldCx1aW50NjQsdWludDMyLGJvb2wsc3RyaW5nLHN0cmluZyxzdHJpbmcsYnl0ZVtdLGFkZHJlc3MsYWRkcmVzcyxhZGRyZXNzLGFkZHJlc3Mpdm9pZCIsIG1ldGhvZCAiYXNzZXRfdHJhbnNmZXIoYXNzZXQsdWludDY0LGFjY291bnQsYWNjb3VudCl2b2lkIiwgbWV0aG9kICJhc3NldF9mcmVlemUoYXNzZXQsYm9vbCl2b2lkIiwgbWV0aG9kICJhY2NvdW50X2ZyZWV6ZShhc3NldCxhY2NvdW50LGJvb2wpdm9pZCIsIG1ldGhvZCAid2l0aGRyYXdfZXhjZXNzX2FsZ28oKXZvaWQiLCBtZXRob2QgImdldF9hc3NldF9jb25maWcoYXNzZXQpKHVpbnQ2NCx1aW50MzIsYm9vbCxzdHJpbmcsc3RyaW5nLHN0cmluZyxieXRlW10sYWRkcmVzcyxhZGRyZXNzLGFkZHJlc3MsYWRkcmVzcykiLCBtZXRob2QgImdldF9hc3NldF9pc19mcm96ZW4oYXNzZXQpYm9vbCIsIG1ldGhvZCAiZ2V0X2FjY291bnRfaXNfZnJvemVuKGFzc2V0LGFjY291bnQpYm9vbCIsIG1ldGhvZCAiZ2V0X2NpcmN1bGF0aW5nX3N1cHBseShhc3NldCl1aW50NjQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBhc3NldF9jcmVhdGUgYXNzZXRfY29uZmlnIGFzc2V0X3RyYW5zZmVyIGFzc2V0X2ZyZWV6ZSBhY2NvdW50X2ZyZWV6ZSB3aXRoZHJhd19leGNlc3NfYWxnbyBnZXRfYXNzZXRfY29uZmlnIGdldF9hc3NldF9pc19mcm96ZW4gZ2V0X2FjY291bnRfaXNfZnJvemVuIGdldF9jaXJjdWxhdGluZ19zdXBwbHkKICAgIGVycgoKbWFpbl9hc3NldF9kZXN0cm95X3JvdXRlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjQxMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJEZWxldGVBcHBsaWNhdGlvbiJdLCByZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgcHVzaGludCA1IC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICA9PQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICYmCiAgICBhc3NlcnQKICAgIGIgYXNzZXRfZGVzdHJveQoKbWFpbl9fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUAyMToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICAmJgogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzLmF2bV9saWJyYXJ5LmlubmVyX3BheW1lbnQocmVjZWl2ZXI6IGJ5dGVzLCBhbW91bnQ6IHVpbnQ2NCkgLT4gdm9pZDoKaW5uZXJfcGF5bWVudDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdm1fbGlicmFyeS5weToxMDEtMTAyCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGlubmVyX3BheW1lbnQoKiwgcmVjZWl2ZXI6IEFjY291bnQsIGFtb3VudDogVUludDY0KSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXZtX2xpYnJhcnkucHk6MTAzLTEwNgogICAgLy8gaXR4bi5QYXltZW50KAogICAgLy8gICAgIHJlY2VpdmVyPXJlY2VpdmVyLAogICAgLy8gICAgIGFtb3VudD1hbW91bnQsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICBmcmFtZV9kaWcgLTIKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdm1fbGlicmFyeS5weToxMDMKICAgIC8vIGl0eG4uUGF5bWVudCgKICAgIGludGNfMSAvLyBwYXkKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL2F2bV9saWJyYXJ5LnB5OjEwMy0xMDYKICAgIC8vIGl0eG4uUGF5bWVudCgKICAgIC8vICAgICByZWNlaXZlcj1yZWNlaXZlciwKICAgIC8vICAgICBhbW91bnQ9YW1vdW50LAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5zbWFydF9hc2EuY29udHJhY3QuU21hcnRBc2EuYXNzZXRfY3JlYXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKYXNzZXRfY3JlYXRlOgogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToxODUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDQKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDMyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuYm9vbAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18zIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDUKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMyAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA2CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzMgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18zIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDgKICAgIGR1cAogICAgY292ZXIgNAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgOQogICAgZHVwCiAgICBjb3ZlciA0CiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxMAogICAgZHVwCiAgICBjb3ZlciA0CiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxMQogICAgZHVwCiAgICBjb3ZlciA0CiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjIyMC0yMjEKICAgIC8vICMgUHJlY29uZGl0aW9ucwogICAgLy8gbG9nZ2VkX2Fzc2VydChUeG4uc2VuZGVyID09IEdsb2JhbC5jcmVhdG9yX2FkZHJlc3MsIGVyci5VTkFVVEhPUklaRURfQ1JFQVRPUikKICAgIHR4biBTZW5kZXIKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgPT0KICAgIGJueiBhc3NldF9jcmVhdGVfYWZ0ZXJfYXNzZXJ0QDMKICAgIHB1c2hieXRlcyAiRVJSOnVuYXV0aG9yaXplZENyZWF0b3IiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6dW5hdXRob3JpemVkQ3JlYXRvcgoKYXNzZXRfY3JlYXRlX2FmdGVyX2Fzc2VydEAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToyMjIKICAgIC8vIGxvZ2dlZF9hc3NlcnQobm90IHNlbGYuc21hcnRfYXNhX2lkLCBlcnIuRVhJU1RJTkdfQ1RSTF9BU0EpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAic21hcnRfYXNhX2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnNtYXJ0X2FzYV9pZCBleGlzdHMKICAgIGJ6IGFzc2V0X2NyZWF0ZV9hZnRlcl9hc3NlcnRANQogICAgcHVzaGJ5dGVzICJFUlI6Y3RybEFzYUV4aXN0IgogICAgbG9nCiAgICBlcnIgLy8gRVJSOmN0cmxBc2FFeGlzdAoKYXNzZXRfY3JlYXRlX2FmdGVyX2Fzc2VydEA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToyMjMKICAgIC8vIHNlbGYuX2Fzc2VydF92YWxpZF9tZXRhZGF0YV9oYXNoKG1ldGFkYXRhX2hhc2gpCiAgICBkdXAKICAgIGNhbGxzdWIgX2Fzc2VydF92YWxpZF9tZXRhZGF0YV9oYXNoCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjIzNAogICAgLy8gbWFuYWdlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MjM1LTIzNwogICAgLy8gcmVzZXJ2ZT1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gZnJlZXplPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyBjbGF3YmFjaz1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgZHVwbiAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXZtX2xpYnJhcnkucHk6NDItNTUKICAgIC8vIGl0eG4uQXNzZXRDb25maWcoCiAgICAvLyAgICAgdG90YWw9dG90YWwsCiAgICAvLyAgICAgZGVjaW1hbHM9ZGVjaW1hbHMsCiAgICAvLyAgICAgZGVmYXVsdF9mcm96ZW49ZGVmYXVsdF9mcm96ZW4sCiAgICAvLyAgICAgdW5pdF9uYW1lPXVuaXRfbmFtZSwKICAgIC8vICAgICBhc3NldF9uYW1lPW5hbWUsCiAgICAvLyAgICAgdXJsPXVybCwKICAgIC8vICAgICBtZXRhZGF0YV9oYXNoPW1ldGFkYXRhX2hhc2gsCiAgICAvLyAgICAgbWFuYWdlcj1tYW5hZ2VyLAogICAgLy8gICAgIHJlc2VydmU9cmVzZXJ2ZSwKICAgIC8vICAgICBmcmVlemU9ZnJlZXplLAogICAgLy8gICAgIGNsYXdiYWNrPWNsYXdiYWNrLAogICAgLy8gKQogICAgLy8gLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0Q2xhd2JhY2sKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXRGcmVlemUKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXRSZXNlcnZlCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0TWFuYWdlcgogICAgZHVwCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0TWV0YWRhdGFIYXNoCiAgICBzd2FwCiAgICBkdXAKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXRVUkwKICAgIHVuY292ZXIgMgogICAgZHVwCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0TmFtZQogICAgdW5jb3ZlciA3CiAgICBkdXAKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXRVbml0TmFtZQogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToyMjkKICAgIC8vIGRlZmF1bHRfZnJvemVuPWNmZy5ERUZBVUxUX0ZST1pFTiwKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0RGVmYXVsdEZyb3plbgogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToyMjgKICAgIC8vIGRlY2ltYWxzPVVJbnQ2NChjZmcuREVDSU1BTFMpLAogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXREZWNpbWFscwogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToyMjcKICAgIC8vIHRvdGFsPVVJbnQ2NChjZmcuVE9UQUwpLAogICAgaW50YyA0IC8vIDE4NDQ2NzQ0MDczNzA5NTUxNjE1CiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0VG90YWwKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdm1fbGlicmFyeS5weTo0MgogICAgLy8gaXR4bi5Bc3NldENvbmZpZygKICAgIHB1c2hpbnQgMyAvLyBhY2ZnCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdm1fbGlicmFyeS5weTo0Mi01NQogICAgLy8gaXR4bi5Bc3NldENvbmZpZygKICAgIC8vICAgICB0b3RhbD10b3RhbCwKICAgIC8vICAgICBkZWNpbWFscz1kZWNpbWFscywKICAgIC8vICAgICBkZWZhdWx0X2Zyb3plbj1kZWZhdWx0X2Zyb3plbiwKICAgIC8vICAgICB1bml0X25hbWU9dW5pdF9uYW1lLAogICAgLy8gICAgIGFzc2V0X25hbWU9bmFtZSwKICAgIC8vICAgICB1cmw9dXJsLAogICAgLy8gICAgIG1ldGFkYXRhX2hhc2g9bWV0YWRhdGFfaGFzaCwKICAgIC8vICAgICBtYW5hZ2VyPW1hbmFnZXIsCiAgICAvLyAgICAgcmVzZXJ2ZT1yZXNlcnZlLAogICAgLy8gICAgIGZyZWV6ZT1mcmVlemUsCiAgICAvLyAgICAgY2xhd2JhY2s9Y2xhd2JhY2ssCiAgICAvLyApCiAgICAvLyAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjIyNS0yMjYKICAgIC8vICMgQ3JlYXRlIHRoZSB1bmRlcmx5aW5nIENvbnRyb2xsZWQgQVNBCiAgICAvLyBzZWxmLnNtYXJ0X2FzYV9pZCA9IGlubmVyX2Fzc2V0X2NyZWF0ZSgKICAgIGJ5dGVjXzIgLy8gInNtYXJ0X2FzYV9pZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdm1fbGlicmFyeS5weTo0Mi01NgogICAgLy8gaXR4bi5Bc3NldENvbmZpZygKICAgIC8vICAgICB0b3RhbD10b3RhbCwKICAgIC8vICAgICBkZWNpbWFscz1kZWNpbWFscywKICAgIC8vICAgICBkZWZhdWx0X2Zyb3plbj1kZWZhdWx0X2Zyb3plbiwKICAgIC8vICAgICB1bml0X25hbWU9dW5pdF9uYW1lLAogICAgLy8gICAgIGFzc2V0X25hbWU9bmFtZSwKICAgIC8vICAgICB1cmw9dXJsLAogICAgLy8gICAgIG1ldGFkYXRhX2hhc2g9bWV0YWRhdGFfaGFzaCwKICAgIC8vICAgICBtYW5hZ2VyPW1hbmFnZXIsCiAgICAvLyAgICAgcmVzZXJ2ZT1yZXNlcnZlLAogICAgLy8gICAgIGZyZWV6ZT1mcmVlemUsCiAgICAvLyAgICAgY2xhd2JhY2s9Y2xhd2JhY2ssCiAgICAvLyApCiAgICAvLyAuc3VibWl0KCkKICAgIC8vIC5jcmVhdGVkX2Fzc2V0LmlkCiAgICBpdHhuIENyZWF0ZWRBc3NldElECiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjIyNS0yMzgKICAgIC8vICMgQ3JlYXRlIHRoZSB1bmRlcmx5aW5nIENvbnRyb2xsZWQgQVNBCiAgICAvLyBzZWxmLnNtYXJ0X2FzYV9pZCA9IGlubmVyX2Fzc2V0X2NyZWF0ZSgKICAgIC8vICAgICB0b3RhbD1VSW50NjQoY2ZnLlRPVEFMKSwKICAgIC8vICAgICBkZWNpbWFscz1VSW50NjQoY2ZnLkRFQ0lNQUxTKSwKICAgIC8vICAgICBkZWZhdWx0X2Zyb3plbj1jZmcuREVGQVVMVF9GUk9aRU4sCiAgICAvLyAgICAgdW5pdF9uYW1lPXVuaXRfbmFtZSwKICAgIC8vICAgICBuYW1lPW5hbWUsCiAgICAvLyAgICAgdXJsPXVybCwKICAgIC8vICAgICBtZXRhZGF0YV9oYXNoPW1ldGFkYXRhX2hhc2gsCiAgICAvLyAgICAgbWFuYWdlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIHJlc2VydmU9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICBmcmVlemU9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICBjbGF3YmFjaz1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gKQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MjQwLTI0MQogICAgLy8gIyBDb25maWd1cmUgU21hcnQgQVNBIChgZGVmYXVsdF9mcm96ZW5gIGlzIHNldCBvbiBjcmVhdGlvbiBvbmx5KQogICAgLy8gc2VsZi5kZWZhdWx0X2Zyb3plbiA9IGRlZmF1bHRfZnJvemVuCiAgICBieXRlYyA3IC8vICJkZWZhdWx0X2Zyb3plbiIKICAgIHVuY292ZXIgOQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MjQ0CiAgICAvLyBkZWNpbWFscz1kZWNpbWFscy5hc191aW50NjQoKSwKICAgIHVuY292ZXIgOAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToxNzQKICAgIC8vIHNlbGYudG90YWwgPSB0b3RhbAogICAgYnl0ZWMgNiAvLyAidG90YWwiCiAgICB1bmNvdmVyIDEwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToxNzUKICAgIC8vIHNlbGYuZGVjaW1hbHMgPSBkZWNpbWFscwogICAgYnl0ZWMgOSAvLyAiZGVjaW1hbHMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToxNzYKICAgIC8vIHNlbGYudW5pdF9uYW1lID0gdW5pdF9uYW1lCiAgICBieXRlYyAxMCAvLyAidW5pdF9uYW1lIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MTc3CiAgICAvLyBzZWxmLm5hbWUgPSBuYW1lCiAgICBieXRlYyAxMSAvLyAibmFtZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjE3OAogICAgLy8gc2VsZi51cmwgPSB1cmwKICAgIGJ5dGVjIDEyIC8vICJ1cmwiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToxNzkKICAgIC8vIHNlbGYubWV0YWRhdGFfaGFzaCA9IG1ldGFkYXRhX2hhc2gKICAgIGJ5dGVjIDEzIC8vICJtZXRhZGF0YV9oYXNoIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MTgwCiAgICAvLyBzZWxmLm1hbmFnZXJfYWRkciA9IG1hbmFnZXJfYWRkcgogICAgYnl0ZWNfMyAvLyAibWFuYWdlcl9hZGRyIgogICAgdW5jb3ZlciA0CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToxODEKICAgIC8vIHNlbGYucmVzZXJ2ZV9hZGRyID0gcmVzZXJ2ZV9hZGRyCiAgICBieXRlY18wIC8vICJyZXNlcnZlX2FkZHIiCiAgICB1bmNvdmVyIDMKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjE4MgogICAgLy8gc2VsZi5mcmVlemVfYWRkciA9IGZyZWV6ZV9hZGRyCiAgICBieXRlY18xIC8vICJmcmVlemVfYWRkciIKICAgIHVuY292ZXIgMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MTgzCiAgICAvLyBzZWxmLmNsYXdiYWNrX2FkZHIgPSBjbGF3YmFja19hZGRyCiAgICBieXRlYyA0IC8vICJjbGF3YmFja19hZGRyIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MjU1CiAgICAvLyByZXR1cm4gc2VsZi5zbWFydF9hc2FfaWQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJzbWFydF9hc2FfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc21hcnRfYXNhX2lkIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToxODUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaXRvYgogICAgYnl0ZWMgOCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5zbWFydF9hc2EuY29udHJhY3QuU21hcnRBc2EuYXNzZXRfY29uZmlnW3JvdXRpbmddKCkgLT4gdm9pZDoKYXNzZXRfY29uZmlnOgogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToyNTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIGR1cAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHN3YXAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMwogICAgbGVuCiAgICBwdXNoaW50IDQKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDMyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmJvb2wKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDUKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMyAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICBjb3ZlciAzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA2CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzMgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgY292ZXIgMwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18zIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIGNvdmVyIDMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDgKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMyAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA5CiAgICBkdXAKICAgIGNvdmVyIDUKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEwCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDExCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MjkxLTI5MgogICAgLy8gIyBQcmVjb25kaXRpb25zCiAgICAvLyBzZWxmLl9hc3NlcnRfY29tbW9uX3ByZWNvbmRpdGlvbnMoY29uZmlnX2Fzc2V0KQogICAgY2FsbHN1YiBfYXNzZXJ0X2NvbW1vbl9wcmVjb25kaXRpb25zCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjI5MwogICAgLy8gbG9nZ2VkX2Fzc2VydChUeG4uc2VuZGVyID09IHNlbGYubWFuYWdlcl9hZGRyLCBlcnIuVU5BVVRIT1JJWkVEX01BTkFHRVIpCiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAibWFuYWdlcl9hZGRyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1hbmFnZXJfYWRkciBleGlzdHMKICAgID09CiAgICBibnogYXNzZXRfY29uZmlnX2FmdGVyX2Fzc2VydEAzCiAgICBieXRlYyAxNCAvLyAiRVJSOnVuYXV0aG9yaXplZE1hbmFnZXIiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6dW5hdXRob3JpemVkTWFuYWdlcgoKYXNzZXRfY29uZmlnX2FmdGVyX2Fzc2VydEAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToyOTQKICAgIC8vIHNlbGYuX2Fzc2VydF92YWxpZF9tZXRhZGF0YV9oYXNoKG1ldGFkYXRhX2hhc2gpCiAgICBkaWcgMgogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX21ldGFkYXRhX2hhc2gKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6Mjk1CiAgICAvLyBpZiByZXNlcnZlX2FkZHIubmF0aXZlICE9IHNlbGYucmVzZXJ2ZV9hZGRyOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gInJlc2VydmVfYWRkciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlX2FkZHIgZXhpc3RzCiAgICBkaWcgNAogICAgIT0KICAgIGJ6IGFzc2V0X2NvbmZpZ19hZnRlcl9pZl9lbHNlQDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6Mjk3CiAgICAvLyBzZWxmLnJlc2VydmVfYWRkciAhPSBHbG9iYWwuemVyb19hZGRyZXNzLCBlcnIuRElTQUJMRURfUkVTRVJWRQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gInJlc2VydmVfYWRkciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlX2FkZHIgZXhpc3RzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjI5Ni0yOTgKICAgIC8vIGxvZ2dlZF9hc3NlcnQoCiAgICAvLyAgICAgc2VsZi5yZXNlcnZlX2FkZHIgIT0gR2xvYmFsLnplcm9fYWRkcmVzcywgZXJyLkRJU0FCTEVEX1JFU0VSVkUKICAgIC8vICkKICAgIGJueiBhc3NldF9jb25maWdfYWZ0ZXJfaWZfZWxzZUA3CiAgICBwdXNoYnl0ZXMgIkVSUjpyZXNlcnZlRGlzYWJsZWQiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6cmVzZXJ2ZURpc2FibGVkCgphc3NldF9jb25maWdfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToyOTkKICAgIC8vIGlmIGZyZWV6ZV9hZGRyLm5hdGl2ZSAhPSBzZWxmLmZyZWV6ZV9hZGRyOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gImZyZWV6ZV9hZGRyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZyZWV6ZV9hZGRyIGV4aXN0cwogICAgZGlnIDIKICAgICE9CiAgICBieiBhc3NldF9jb25maWdfYWZ0ZXJfaWZfZWxzZUAxMQogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTozMDAKICAgIC8vIGxvZ2dlZF9hc3NlcnQoc2VsZi5mcmVlemVfYWRkciAhPSBHbG9iYWwuemVyb19hZGRyZXNzLCBlcnIuRElTQUJMRURfRlJFRVpFKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gImZyZWV6ZV9hZGRyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZyZWV6ZV9hZGRyIGV4aXN0cwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICAhPQogICAgYm56IGFzc2V0X2NvbmZpZ19hZnRlcl9pZl9lbHNlQDExCiAgICBwdXNoYnl0ZXMgIkVSUjpmcmVlemVEaXNhYmxlZCIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpmcmVlemVEaXNhYmxlZAoKYXNzZXRfY29uZmlnX2FmdGVyX2lmX2Vsc2VAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjMwMQogICAgLy8gaWYgY2xhd2JhY2tfYWRkci5uYXRpdmUgIT0gc2VsZi5jbGF3YmFja19hZGRyOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gImNsYXdiYWNrX2FkZHIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2xhd2JhY2tfYWRkciBleGlzdHMKICAgIGRpZyAxCiAgICAhPQogICAgYnogYXNzZXRfY29uZmlnX2FmdGVyX2lmX2Vsc2VAMTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MzAzCiAgICAvLyBzZWxmLmNsYXdiYWNrX2FkZHIgIT0gR2xvYmFsLnplcm9fYWRkcmVzcywgZXJyLkRJU0FCTEVEX0NMQVdCQUNLCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAiY2xhd2JhY2tfYWRkciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jbGF3YmFja19hZGRyIGV4aXN0cwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICAhPQogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTozMDItMzA0CiAgICAvLyBsb2dnZWRfYXNzZXJ0KAogICAgLy8gICAgIHNlbGYuY2xhd2JhY2tfYWRkciAhPSBHbG9iYWwuemVyb19hZGRyZXNzLCBlcnIuRElTQUJMRURfQ0xBV0JBQ0sKICAgIC8vICkKICAgIGJueiBhc3NldF9jb25maWdfYWZ0ZXJfaWZfZWxzZUAxNQogICAgcHVzaGJ5dGVzICJFUlI6Y2xhd2JhY2tEaXNhYmxlZCIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpjbGF3YmFja0Rpc2FibGVkCgphc3NldF9jb25maWdfYWZ0ZXJfaWZfZWxzZUAxNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MzA1CiAgICAvLyBsb2dnZWRfYXNzZXJ0KHRvdGFsID49IHNlbGYuX2lzc3VlZF9zdXBwbHkoY29uZmlnX2Fzc2V0KSwgZXJyLklOVkFMSURfVE9UQUwpCiAgICB1bmNvdmVyIDEwCiAgICBjYWxsc3ViIF9pc3N1ZWRfc3VwcGx5CiAgICBkaWcgNQogICAgPD0KICAgIGJueiBhc3NldF9jb25maWdfYWZ0ZXJfYXNzZXJ0QDE3CiAgICBwdXNoYnl0ZXMgIkVSUjp0b3RhbEludmFsaWQiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6dG90YWxJbnZhbGlkCgphc3NldF9jb25maWdfYWZ0ZXJfYXNzZXJ0QDE3OgogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTozMTAKICAgIC8vIGRlY2ltYWxzPWRlY2ltYWxzLmFzX3VpbnQ2NCgpLAogICAgdW5jb3ZlciA1CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjE3NAogICAgLy8gc2VsZi50b3RhbCA9IHRvdGFsCiAgICBieXRlYyA2IC8vICJ0b3RhbCIKICAgIHVuY292ZXIgNgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MTc1CiAgICAvLyBzZWxmLmRlY2ltYWxzID0gZGVjaW1hbHMKICAgIGJ5dGVjIDkgLy8gImRlY2ltYWxzIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MTc2CiAgICAvLyBzZWxmLnVuaXRfbmFtZSA9IHVuaXRfbmFtZQogICAgYnl0ZWMgMTAgLy8gInVuaXRfbmFtZSIKICAgIHVuY292ZXIgOAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MTc3CiAgICAvLyBzZWxmLm5hbWUgPSBuYW1lCiAgICBieXRlYyAxMSAvLyAibmFtZSIKICAgIHVuY292ZXIgNwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MTc4CiAgICAvLyBzZWxmLnVybCA9IHVybAogICAgYnl0ZWMgMTIgLy8gInVybCIKICAgIHVuY292ZXIgNgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MTc5CiAgICAvLyBzZWxmLm1ldGFkYXRhX2hhc2ggPSBtZXRhZGF0YV9oYXNoCiAgICBieXRlYyAxMyAvLyAibWV0YWRhdGFfaGFzaCIKICAgIHVuY292ZXIgMwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MTgwCiAgICAvLyBzZWxmLm1hbmFnZXJfYWRkciA9IG1hbmFnZXJfYWRkcgogICAgYnl0ZWNfMyAvLyAibWFuYWdlcl9hZGRyIgogICAgdW5jb3ZlciA0CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToxODEKICAgIC8vIHNlbGYucmVzZXJ2ZV9hZGRyID0gcmVzZXJ2ZV9hZGRyCiAgICBieXRlY18wIC8vICJyZXNlcnZlX2FkZHIiCiAgICB1bmNvdmVyIDMKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjE4MgogICAgLy8gc2VsZi5mcmVlemVfYWRkciA9IGZyZWV6ZV9hZGRyCiAgICBieXRlY18xIC8vICJmcmVlemVfYWRkciIKICAgIHVuY292ZXIgMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MTgzCiAgICAvLyBzZWxmLmNsYXdiYWNrX2FkZHIgPSBjbGF3YmFja19hZGRyCiAgICBieXRlYyA0IC8vICJjbGF3YmFja19hZGRyIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MjU3CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMuc21hcnRfYXNhLmNvbnRyYWN0LlNtYXJ0QXNhLmFzc2V0X3RyYW5zZmVyW3JvdXRpbmddKCkgLT4gdm9pZDoKYXNzZXRfdHJhbnNmZXI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjMyMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgZHVwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgc3dhcAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgZHVwCiAgICBjb3ZlciAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICBjb3ZlciAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjMzOS0zNDAKICAgIC8vICMgUHJlY29uZGl0aW9ucwogICAgLy8gc2VsZi5fYXNzZXJ0X2NvbW1vbl9wcmVjb25kaXRpb25zKHhmZXJfYXNzZXQpCiAgICBzd2FwCiAgICBjYWxsc3ViIF9hc3NlcnRfY29tbW9uX3ByZWNvbmRpdGlvbnMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MzQxCiAgICAvLyBpZiBhc3NldF9zZW5kZXIgPT0gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzczoKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgYnogYXNzZXRfdHJhbnNmZXJfZWxzZV9ib2R5QDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MTExLTExMgogICAgLy8gIyBJc3N1ZSBwZXJtaXNzaW9uIHJlc3RyaWN0ZWQgdG8gUmVzZXJ2ZS4KICAgIC8vIGxvZ2dlZF9hc3NlcnQoVHhuLnNlbmRlciA9PSBzZWxmLnJlc2VydmVfYWRkciwgZXJyLlVOQVVUSE9SSVpFRF9SRVNFUlZFKQogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gInJlc2VydmVfYWRkciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXNlcnZlX2FkZHIgZXhpc3RzCiAgICA9PQogICAgYm56IGFzc2V0X3RyYW5zZmVyX2FmdGVyX2Fzc2VydEAzNwogICAgYnl0ZWMgMTggLy8gIkVSUjp1bmF1dGhvcml6ZWRSZXNlcnZlIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOnVuYXV0aG9yaXplZFJlc2VydmUKCmFzc2V0X3RyYW5zZmVyX2FmdGVyX2Fzc2VydEAzNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MTE1CiAgICAvLyBhc3NldF9yZWNlaXZlciAhPSBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLCBlcnIuU0VMRl9JU1NVRQogICAgZHVwCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgIT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MTEzLTExNgogICAgLy8gIyBGb3JiaWRkZW4gc2VsZi1pc3N1ZSAodG8gQ3JlYXRvcikgYW5kIG92ZXItaXNzdWUgKD4gdG90YWwpLgogICAgLy8gbG9nZ2VkX2Fzc2VydCgKICAgIC8vICAgICBhc3NldF9yZWNlaXZlciAhPSBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLCBlcnIuU0VMRl9JU1NVRQogICAgLy8gKQogICAgYm56IGFzc2V0X3RyYW5zZmVyX2FmdGVyX2Fzc2VydEAzOQogICAgcHVzaGJ5dGVzICJFUlI6c2VsZklzc3VlIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOnNlbGZJc3N1ZQoKYXNzZXRfdHJhbnNmZXJfYWZ0ZXJfYXNzZXJ0QDM5OgogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToxMTgKICAgIC8vIGFzc2V0X2Ftb3VudCArIHNlbGYuX2lzc3VlZF9zdXBwbHkoQXNzZXQoc2VsZi5zbWFydF9hc2FfaWQpKSA8PSBzZWxmLnRvdGFsLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInNtYXJ0X2FzYV9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zbWFydF9hc2FfaWQgZXhpc3RzCiAgICBjYWxsc3ViIF9pc3N1ZWRfc3VwcGx5CiAgICBkaWcgMwogICAgKwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gInRvdGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsIGV4aXN0cwogICAgPD0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MTE3LTEyMAogICAgLy8gbG9nZ2VkX2Fzc2VydCgKICAgIC8vICAgICBhc3NldF9hbW91bnQgKyBzZWxmLl9pc3N1ZWRfc3VwcGx5KEFzc2V0KHNlbGYuc21hcnRfYXNhX2lkKSkgPD0gc2VsZi50b3RhbCwKICAgIC8vICAgICBlcnIuT1ZFUl9JU1NVRSwKICAgIC8vICkKICAgIGJueiBhc3NldF90cmFuc2Zlcl9hZnRlcl9hc3NlcnRANDEKICAgIHB1c2hieXRlcyAiRVJSOm92ZXJJc3N1ZSIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpvdmVySXNzdWUKCmFzc2V0X3RyYW5zZmVyX2FmdGVyX2Fzc2VydEA0MToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MTIxCiAgICAvLyBsb2dnZWRfYXNzZXJ0KG5vdCBzZWxmLmdsb2JhbF9mcm96ZW4sIGVyci5HTE9CQUxfRlJPWkVOKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImdsb2JhbF9mcm96ZW4iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZ2xvYmFsX2Zyb3plbiBleGlzdHMKICAgIGJ6IGFzc2V0X3RyYW5zZmVyX2FmdGVyX2Fzc2VydEA0MwogICAgYnl0ZWMgMTUgLy8gIkVSUjpnbG9iYWxGcm96ZW4iCiAgICBsb2cKICAgIGVyciAvLyBFUlI6Z2xvYmFsRnJvemVuCgphc3NldF90cmFuc2Zlcl9hZnRlcl9hc3NlcnRANDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjEyMgogICAgLy8gc2VsZi5fYXNzZXJ0X3Jlc2VydmVfbm90X2Zyb3plbigpCiAgICBjYWxsc3ViIF9hc3NlcnRfcmVzZXJ2ZV9ub3RfZnJvemVuCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjEyMwogICAgLy8gbG9nZ2VkX2Fzc2VydChub3Qgc2VsZi5faXNfZnJvemVuKGFzc2V0X3JlY2VpdmVyKSwgZXJyLlJFQ0VJVkVSX0ZST1pFTikKICAgIGR1cAogICAgY2FsbHN1YiBfaXNfZnJvemVuCiAgICBieiBhc3NldF90cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDEwCiAgICBieXRlYyAxOSAvLyAiRVJSOnJlY2VpdmVyRnJvemVuIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOnJlY2VpdmVyRnJvemVuCgphc3NldF90cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2F2bV9saWJyYXJ5LnB5Ojg2LTkxCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD14ZmVyX2Fzc2V0LmlkLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD1hc3NldF9hbW91bnQsCiAgICAvLyAgICAgYXNzZXRfc2VuZGVyPWFzc2V0X3NlbmRlciwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1hc3NldF9yZWNlaXZlciwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIGR1cAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBkaWcgMQogICAgaXR4bl9maWVsZCBBc3NldFNlbmRlcgogICAgZGlnIDIKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIGRpZyAzCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL2F2bV9saWJyYXJ5LnB5Ojg2CiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL2F2bV9saWJyYXJ5LnB5Ojg2LTkxCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD14ZmVyX2Fzc2V0LmlkLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD1hc3NldF9hbW91bnQsCiAgICAvLyAgICAgYXNzZXRfc2VuZGVyPWFzc2V0X3NlbmRlciwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1hc3NldF9yZWNlaXZlciwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjMyMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgphc3NldF90cmFuc2Zlcl9lbHNlX2JvZHlAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MzQ1CiAgICAvLyBlbGlmIGFzc2V0X3JlY2VpdmVyID09IEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3M6CiAgICBkdXAKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgYnogYXNzZXRfdHJhbnNmZXJfZWxzZV9ib2R5QDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MTI2LTEyNwogICAgLy8gIyBSZWRlZW0gcGVybWlzc2lvbiByZXN0cmljdGVkIHRvIFJlc2VydmUuCiAgICAvLyBsb2dnZWRfYXNzZXJ0KFR4bi5zZW5kZXIgPT0gc2VsZi5yZXNlcnZlX2FkZHIsIGVyci5VTkFVVEhPUklaRURfUkVTRVJWRSkKICAgIHR4biBTZW5kZXIKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJyZXNlcnZlX2FkZHIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZV9hZGRyIGV4aXN0cwogICAgPT0KICAgIGJueiBhc3NldF90cmFuc2Zlcl9hZnRlcl9hc3NlcnRAMjkKICAgIGJ5dGVjIDE4IC8vICJFUlI6dW5hdXRob3JpemVkUmVzZXJ2ZSIKICAgIGxvZwogICAgZXJyIC8vIEVSUjp1bmF1dGhvcml6ZWRSZXNlcnZlCgphc3NldF90cmFuc2Zlcl9hZnRlcl9hc3NlcnRAMjk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjEyOAogICAgLy8gbG9nZ2VkX2Fzc2VydChub3Qgc2VsZi5nbG9iYWxfZnJvemVuLCBlcnIuR0xPQkFMX0ZST1pFTikKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJnbG9iYWxfZnJvemVuIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmdsb2JhbF9mcm96ZW4gZXhpc3RzCiAgICBieiBhc3NldF90cmFuc2Zlcl9hZnRlcl9hc3NlcnRAMzEKICAgIGJ5dGVjIDE1IC8vICJFUlI6Z2xvYmFsRnJvemVuIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOmdsb2JhbEZyb3plbgoKYXNzZXRfdHJhbnNmZXJfYWZ0ZXJfYXNzZXJ0QDMxOgogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToxMjktMTMwCiAgICAvLyAjIEZvcmJpZGRlbiBjbGF3YmFjayB0aHJvdWdoIHJlZGVlbWluZyAocmVkZWVtZWQgYW1vdW50IG5vdCBmcm9tIFJlc2VydmUpLgogICAgLy8gbG9nZ2VkX2Fzc2VydChhc3NldF9zZW5kZXIgPT0gc2VsZi5yZXNlcnZlX2FkZHIsIGVyci5DTEFXQkFDS19SRURFRU0pCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAicmVzZXJ2ZV9hZGRyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlc2VydmVfYWRkciBleGlzdHMKICAgIGRpZyAyCiAgICA9PQogICAgYm56IGFzc2V0X3RyYW5zZmVyX2FmdGVyX2Fzc2VydEAzMwogICAgcHVzaGJ5dGVzICJFUlI6Y2xhd2JhY2tSZWRlZW0iCiAgICBsb2cKICAgIGVyciAvLyBFUlI6Y2xhd2JhY2tSZWRlZW0KCmFzc2V0X3RyYW5zZmVyX2FmdGVyX2Fzc2VydEAzMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MTMxCiAgICAvLyBzZWxmLl9hc3NlcnRfcmVzZXJ2ZV9ub3RfZnJvemVuKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9yZXNlcnZlX25vdF9mcm96ZW4KICAgIGIgYXNzZXRfdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUAxMAoKYXNzZXRfdHJhbnNmZXJfZWxzZV9ib2R5QDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjM0NwogICAgLy8gZWxpZiBUeG4uc2VuZGVyID09IHNlbGYuY2xhd2JhY2tfYWRkcjoKICAgIHR4biBTZW5kZXIKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJjbGF3YmFja19hZGRyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNsYXdiYWNrX2FkZHIgZXhpc3RzCiAgICA9PQogICAgYm56IGFzc2V0X3RyYW5zZmVyX2FmdGVyX2lmX2Vsc2VAMTAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MTQwCiAgICAvLyBsb2dnZWRfYXNzZXJ0KFR4bi5zZW5kZXIgPT0gYXNzZXRfc2VuZGVyLCBlcnIuVU5BVVRIT1JJWkVEX0NMQVdCQUNLKQogICAgdHhuIFNlbmRlcgogICAgZGlnIDIKICAgID09CiAgICBibnogYXNzZXRfdHJhbnNmZXJfYWZ0ZXJfYXNzZXJ0QDE1CiAgICBwdXNoYnl0ZXMgIkVSUjp1bmF1dGhvcml6ZWRDbGF3YmFjayIKICAgIGxvZwogICAgZXJyIC8vIEVSUjp1bmF1dGhvcml6ZWRDbGF3YmFjawoKYXNzZXRfdHJhbnNmZXJfYWZ0ZXJfYXNzZXJ0QDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToxNDEKICAgIC8vIGxvZ2dlZF9hc3NlcnQobm90IHNlbGYuZ2xvYmFsX2Zyb3plbiwgZXJyLkdMT0JBTF9GUk9aRU4pCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiZ2xvYmFsX2Zyb3plbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5nbG9iYWxfZnJvemVuIGV4aXN0cwogICAgYnogYXNzZXRfdHJhbnNmZXJfYWZ0ZXJfYXNzZXJ0QDE3CiAgICBieXRlYyAxNSAvLyAiRVJSOmdsb2JhbEZyb3plbiIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpnbG9iYWxGcm96ZW4KCmFzc2V0X3RyYW5zZmVyX2FmdGVyX2Fzc2VydEAxNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MTQyCiAgICAvLyBsb2dnZWRfYXNzZXJ0KG5vdCBzZWxmLl9pc19mcm96ZW4oYXNzZXRfc2VuZGVyKSwgZXJyLlNFTkRFUl9GUk9aRU4pCiAgICBkaWcgMQogICAgY2FsbHN1YiBfaXNfZnJvemVuCiAgICBieiBhc3NldF90cmFuc2Zlcl9hZnRlcl9hc3NlcnRAMTkKICAgIHB1c2hieXRlcyAiRVJSOnNlbmRlckZyb3plbiIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpzZW5kZXJGcm96ZW4KCmFzc2V0X3RyYW5zZmVyX2FmdGVyX2Fzc2VydEAxOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MTQzCiAgICAvLyBsb2dnZWRfYXNzZXJ0KG5vdCBzZWxmLl9pc19mcm96ZW4oYXNzZXRfcmVjZWl2ZXIpLCBlcnIuUkVDRUlWRVJfRlJPWkVOKQogICAgZHVwCiAgICBjYWxsc3ViIF9pc19mcm96ZW4KICAgIGJ6IGFzc2V0X3RyYW5zZmVyX2FmdGVyX2Fzc2VydEAyMQogICAgYnl0ZWMgMTkgLy8gIkVSUjpyZWNlaXZlckZyb3plbiIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpyZWNlaXZlckZyb3plbgoKYXNzZXRfdHJhbnNmZXJfYWZ0ZXJfYXNzZXJ0QDIxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NhcHBlZF9zbWFydF9hc2EvY29udHJhY3QucHk6MzAKICAgIC8vIGFzc2V0X3JlY2VpdmVyLCBzZWxmLnNtYXJ0X2FzYV9pZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInNtYXJ0X2FzYV9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zbWFydF9hc2FfaWQgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY2FwcGVkX3NtYXJ0X2FzYS9jb250cmFjdC5weToyNy0zMQogICAgLy8gIyBSdW5zIGFmdGVyIHRoZSBidWlsdC1pbiBjaGVja3MuIEEgbm9uLWhvbGRlciBob2xkcyAwIHVuaXRzOiB0aGUgcHJvdG9jb2wgdGhlbgogICAgLy8gIyByZWplY3RzIGFueSBhbW91bnQgYnV0IDAKICAgIC8vIGhvbGRpbmcsIF9ob2xkcyA9IG9wLkFzc2V0SG9sZGluZ0dldC5hc3NldF9iYWxhbmNlKAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyLCBzZWxmLnNtYXJ0X2FzYV9pZAogICAgLy8gKQogICAgZGlnIDEKICAgIHN3YXAKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvY2FwcGVkX3NtYXJ0X2FzYS9jb250cmFjdC5weTozMwogICAgLy8gaG9sZGluZyArIGFzc2V0X2Ftb3VudCA8PSBjYXBwZWRfY2ZnLk1BWF9IT0xESU5HLAogICAgZGlnIDMKICAgICsKICAgIHB1c2hpbnQgMTAwMAogICAgPD0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jYXBwZWRfc21hcnRfYXNhL2NvbnRyYWN0LnB5OjMyLTM1CiAgICAvLyBsb2dnZWRfYXNzZXJ0KAogICAgLy8gICAgIGhvbGRpbmcgKyBhc3NldF9hbW91bnQgPD0gY2FwcGVkX2NmZy5NQVhfSE9MRElORywKICAgIC8vICAgICBjYXBwZWRfZXJyLkhPTERJTkdfQ0FQX0VYQ0VFREVELAogICAgLy8gKQogICAgYm56IGFzc2V0X3RyYW5zZmVyX2FmdGVyX2lmX2Vsc2VAMTAKICAgIHB1c2hieXRlcyAiRVJSOmhvbGRpbmdDYXBFeGNlZWRlZCIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpob2xkaW5nQ2FwRXhjZWVkZWQKCgovLyBzbWFydF9jb250cmFjdHMuc21hcnRfYXNhLmNvbnRyYWN0LlNtYXJ0QXNhLmFzc2V0X2ZyZWV6ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmFzc2V0X2ZyZWV6ZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MzY3CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50OAogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuYm9vbAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgc3dhcAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTozNzYtMzc3CiAgICAvLyAjIFByZWNvbmRpdGlvbnMKICAgIC8vIHNlbGYuX2Fzc2VydF9jb21tb25fcHJlY29uZGl0aW9ucyhmcmVlemVfYXNzZXQpCiAgICBjYWxsc3ViIF9hc3NlcnRfY29tbW9uX3ByZWNvbmRpdGlvbnMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6Mzc4CiAgICAvLyBsb2dnZWRfYXNzZXJ0KFR4bi5zZW5kZXIgPT0gc2VsZi5mcmVlemVfYWRkciwgZXJyLlVOQVVUSE9SSVpFRF9GUkVFWkUpCiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAiZnJlZXplX2FkZHIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZnJlZXplX2FkZHIgZXhpc3RzCiAgICA9PQogICAgYm56IGFzc2V0X2ZyZWV6ZV9hZnRlcl9hc3NlcnRAMwogICAgYnl0ZWMgMjAgLy8gIkVSUjp1bmF1dGhvcml6ZWRGcmVlemUiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6dW5hdXRob3JpemVkRnJlZXplCgphc3NldF9mcmVlemVfYWZ0ZXJfYXNzZXJ0QDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjM4MC0zODEKICAgIC8vICMgRWZmZWN0cwogICAgLy8gc2VsZi5nbG9iYWxfZnJvemVuID0gYXNzZXRfZnJvemVuCiAgICBieXRlYyA1IC8vICJnbG9iYWxfZnJvemVuIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MzY3CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMuc21hcnRfYXNhLmNvbnRyYWN0LlNtYXJ0QXNhLmFjY291bnRfZnJlZXplW3JvdXRpbmddKCkgLT4gdm9pZDoKYWNjb3VudF9mcmVlemU6CiAgICBpbnRjXzAgLy8gMAogICAgcHVzaGJ5dGVzICIiCiAgICBkdXBuIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MzgzCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50OAogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICBzd2FwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuYm9vbAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgc3dhcAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTozOTUtMzk2CiAgICAvLyAjIFByZWNvbmRpdGlvbnMKICAgIC8vIHNlbGYuX2Fzc2VydF9jb21tb25fcHJlY29uZGl0aW9ucyhmcmVlemVfYXNzZXQpCiAgICBjYWxsc3ViIF9hc3NlcnRfY29tbW9uX3ByZWNvbmRpdGlvbnMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6Mzk3CiAgICAvLyBsb2dnZWRfYXNzZXJ0KFR4bi5zZW5kZXIgPT0gc2VsZi5mcmVlemVfYWRkciwgZXJyLlVOQVVUSE9SSVpFRF9GUkVFWkUpCiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAiZnJlZXplX2FkZHIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZnJlZXplX2FkZHIgZXhpc3RzCiAgICA9PQogICAgYm56IGFjY291bnRfZnJlZXplX2FmdGVyX2Fzc2VydEAzCiAgICBieXRlYyAyMCAvLyAiRVJSOnVuYXV0aG9yaXplZEZyZWV6ZSIKICAgIGxvZwogICAgZXJyIC8vIEVSUjp1bmF1dGhvcml6ZWRGcmVlemUKCmFjY291bnRfZnJlZXplX2FmdGVyX2Fzc2VydEAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTozOTktNDAyCiAgICAvLyAjIEVmZmVjdHMKICAgIC8vICMgT25seSB0aGUgZXhjZXB0aW9ucyB0byB0aGUgZGVmYXVsdCBmcmVlemUgc3RhdGUgaGF2ZSBhIGJveCwgZGVwb3NpdGVkIGJ5CiAgICAvLyAjIGFueW9uZSBvbiBjcmVhdGlvbiBhbmQgcmVmdW5kZWQgdG8gRnJlZXplIG9uIGRlbGV0aW9uCiAgICAvLyBhcHAgPSBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgZHVwCiAgICBidXJ5IDcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NDAzCiAgICAvLyBtaW5fYmFsYW5jZSA9IGFwcC5taW5fYmFsYW5jZQogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RNaW5CYWxhbmNlCiAgICBzd2FwCiAgICBidXJ5IDQKICAgIGFzc2VydCAvLyBhY2NvdW50IGZ1bmRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo0MDQKICAgIC8vIGlmIGFzc2V0X2Zyb3plbiA9PSBzZWxmLmRlZmF1bHRfZnJvemVuOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gImRlZmF1bHRfZnJvemVuIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRlZmF1bHRfZnJvemVuIGV4aXN0cwogICAgPT0KICAgIGJ6IGFjY291bnRfZnJlZXplX2Vsc2VfYm9keUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjQwNS00MDYKICAgIC8vICMgYm94X2RlbCBkb2Vzbid0IGZhaWw6IGFuIGFjY291bnQgd2l0aG91dCBhIGJveCBnZXRzIGEgMCByZWZ1bmQKICAgIC8vIGRlbCBzZWxmLmZyZWV6ZV9leGNlcHRpb25zW2ZyZWV6ZV9hY2NvdW50XQogICAgYnl0ZWMgMTYgLy8gMHg2NgogICAgc3dhcAogICAgY29uY2F0CiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NDA3CiAgICAvLyBpbm5lcl9wYXltZW50KHJlY2VpdmVyPVR4bi5zZW5kZXIsIGFtb3VudD1taW5fYmFsYW5jZSAtIGFwcC5taW5fYmFsYW5jZSkKICAgIHR4biBTZW5kZXIKICAgIGRpZyA0CiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdE1pbkJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IGZ1bmRlZAogICAgZGlnIDIKICAgIHN3YXAKICAgIC0KICAgIGNhbGxzdWIgaW5uZXJfcGF5bWVudAoKYWNjb3VudF9mcmVlemVfYWZ0ZXJfaWZfZWxzZUA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTozODMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKYWNjb3VudF9mcmVlemVfZWxzZV9ib2R5QDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjQwOQogICAgLy8gY3JlYXRlZCA9IHNlbGYuZnJlZXplX2V4Y2VwdGlvbnMuYm94KGtleT1mcmVlemVfYWNjb3VudCkuY3JlYXRlKHNpemU9MCkKICAgIGJ5dGVjIDE2IC8vIDB4NjYKICAgIHN3YXAKICAgIGNvbmNhdAogICAgaW50Y18wIC8vIDAKICAgIGJveF9jcmVhdGUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NDEwCiAgICAvLyBpZiBjcmVhdGVkOgogICAgYnogYWNjb3VudF9mcmVlemVfYWZ0ZXJfaWZfZWxzZUA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjQxMQogICAgLy8gc2VsZi5fYXNzZXJ0X2JveF9kZXBvc2l0KGJveF9tYnI9YXBwLm1pbl9iYWxhbmNlIC0gbWluX2JhbGFuY2UpCiAgICBkaWcgMwogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RNaW5CYWxhbmNlCiAgICBhc3NlcnQgLy8gYWNjb3VudCBmdW5kZWQKICAgIGRpZyAxCiAgICAtCiAgICBidXJ5IDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6OTgtOTkKICAgIC8vICMgQSBwYXltZW50IG9mIGF0IGxlYXN0IHRoZSBib3ggTUJSIHRvIHRoZSBBcHAganVzdCBiZWZvcmUgdGhpcyBjYWxsLCBieSBhbnlvbmUKICAgIC8vIGxvZ2dlZF9hc3NlcnQoVHhuLmdyb3VwX2luZGV4ID4gMCwgZXJyLkJPWF9NQlJfVU5GVU5ERUQpCiAgICB0eG4gR3JvdXBJbmRleAogICAgYm56IGFjY291bnRfZnJlZXplX2FmdGVyX2Fzc2VydEAxMQogICAgYnl0ZWMgMjEgLy8gIkVSUjpib3hNYnJVbmZ1bmRlZCIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpib3hNYnJVbmZ1bmRlZAoKYWNjb3VudF9mcmVlemVfYWZ0ZXJfYXNzZXJ0QDExOgogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToxMDAKICAgIC8vIGRlcG9zaXQgPSBndHhuLlRyYW5zYWN0aW9uKFR4bi5ncm91cF9pbmRleCAtIDEpCiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGR1cAogICAgYnVyeSAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjEwMgogICAgLy8gZGVwb3NpdC50eXBlID09IFRyYW5zYWN0aW9uVHlwZS5QYXltZW50CiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18xIC8vIHBheQogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MTAyLTEwNAogICAgLy8gZGVwb3NpdC50eXBlID09IFRyYW5zYWN0aW9uVHlwZS5QYXltZW50CiAgICAvLyBhbmQgZGVwb3NpdC5yZWNlaXZlciA9PSBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzCiAgICAvLyBhbmQgZGVwb3NpdC5hbW91bnQgPj0gYm94X21iciwKICAgIGJ6IGFjY291bnRfZnJlZXplX2Jvb2xfZmFsc2VAMTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MTAzCiAgICAvLyBhbmQgZGVwb3NpdC5yZWNlaXZlciA9PSBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzCiAgICBkaWcgMQogICAgZ3R4bnMgUmVjZWl2ZXIKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToxMDItMTA0CiAgICAvLyBkZXBvc2l0LnR5cGUgPT0gVHJhbnNhY3Rpb25UeXBlLlBheW1lbnQKICAgIC8vIGFuZCBkZXBvc2l0LnJlY2VpdmVyID09IEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MKICAgIC8vIGFuZCBkZXBvc2l0LmFtb3VudCA+PSBib3hfbWJyLAogICAgYnogYWNjb3VudF9mcmVlemVfYm9vbF9mYWxzZUAxNQogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToxMDQKICAgIC8vIGFuZCBkZXBvc2l0LmFtb3VudCA+PSBib3hfbWJyLAogICAgZGlnIDEKICAgIGd0eG5zIEFtb3VudAogICAgZGlnIDMKICAgID49CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjEwMi0xMDQKICAgIC8vIGRlcG9zaXQudHlwZSA9PSBUcmFuc2FjdGlvblR5cGUuUGF5bWVudAogICAgLy8gYW5kIGRlcG9zaXQucmVjZWl2ZXIgPT0gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcwogICAgLy8gYW5kIGRlcG9zaXQuYW1vdW50ID49IGJveF9tYnIsCiAgICBieiBhY2NvdW50X2ZyZWV6ZV9ib29sX2ZhbHNlQDE1CiAgICBpbnRjXzEgLy8gMQoKYWNjb3VudF9mcmVlemVfYm9vbF9tZXJnZUAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MTAxLTEwNgogICAgLy8gbG9nZ2VkX2Fzc2VydCgKICAgIC8vICAgICBkZXBvc2l0LnR5cGUgPT0gVHJhbnNhY3Rpb25UeXBlLlBheW1lbnQKICAgIC8vICAgICBhbmQgZGVwb3NpdC5yZWNlaXZlciA9PSBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzCiAgICAvLyAgICAgYW5kIGRlcG9zaXQuYW1vdW50ID49IGJveF9tYnIsCiAgICAvLyAgICAgZXJyLkJPWF9NQlJfVU5GVU5ERUQsCiAgICAvLyApCiAgICBibnogYWNjb3VudF9mcmVlemVfYWZ0ZXJfaWZfZWxzZUA4CiAgICBieXRlYyAyMSAvLyAiRVJSOmJveE1iclVuZnVuZGVkIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOmJveE1iclVuZnVuZGVkCgphY2NvdW50X2ZyZWV6ZV9ib29sX2ZhbHNlQDE1OgogICAgaW50Y18wIC8vIDAKICAgIGIgYWNjb3VudF9mcmVlemVfYm9vbF9tZXJnZUAxNgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5zbWFydF9hc2EuY29udHJhY3QuU21hcnRBc2EuYXNzZXRfZGVzdHJveVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmFzc2V0X2Rlc3Ryb3k6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjQxMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJEZWxldGVBcHBsaWNhdGlvbiJdLCByZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo0MjEtNDIyCiAgICAvLyAjIFByZWNvbmRpdGlvbnMKICAgIC8vIHNlbGYuX2Fzc2VydF9jb21tb25fcHJlY29uZGl0aW9ucyhkZXN0cm95X2Fzc2V0KQogICAgY2FsbHN1YiBfYXNzZXJ0X2NvbW1vbl9wcmVjb25kaXRpb25zCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjQyMwogICAgLy8gbG9nZ2VkX2Fzc2VydChUeG4uc2VuZGVyID09IHNlbGYubWFuYWdlcl9hZGRyLCBlcnIuVU5BVVRIT1JJWkVEX01BTkFHRVIpCiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAibWFuYWdlcl9hZGRyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1hbmFnZXJfYWRkciBleGlzdHMKICAgID09CiAgICBibnogYXNzZXRfZGVzdHJveV9hZnRlcl9hc3NlcnRAMwogICAgYnl0ZWMgMTQgLy8gIkVSUjp1bmF1dGhvcml6ZWRNYW5hZ2VyIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOnVuYXV0aG9yaXplZE1hbmFnZXIKCmFzc2V0X2Rlc3Ryb3lfYWZ0ZXJfYXNzZXJ0QDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjQyNAogICAgLy8gbG9nZ2VkX2Fzc2VydChzZWxmLl9pc3N1ZWRfc3VwcGx5KGRlc3Ryb3lfYXNzZXQpID09IDAsIGVyci5VTklUU19JU1NVRUQpCiAgICBkdXAKICAgIGNhbGxzdWIgX2lzc3VlZF9zdXBwbHkKICAgIGJ6IGFzc2V0X2Rlc3Ryb3lfYWZ0ZXJfYXNzZXJ0QDUKICAgIHB1c2hieXRlcyAiRVJSOnVuaXRzSXNzdWVkIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOnVuaXRzSXNzdWVkCgphc3NldF9kZXN0cm95X2FmdGVyX2Fzc2VydEA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo0MjcKICAgIC8vIEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MudG90YWxfYm94ZXMgPT0gMCwgZXJyLkZSRUVaRV9CT1hFU19MRUZUCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RUb3RhbEJveGVzCiAgICBhc3NlcnQgLy8gYWNjb3VudCBmdW5kZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NDI1LTQyOAogICAgLy8gIyBEZWxldGluZyB0aGUgQXBwIHdpdGggYm94ZXMgbGVmdCB3b3VsZCBvcnBoYW4gdGhlbSwgbG9ja2luZyB0aGVpciBNQlIKICAgIC8vIGxvZ2dlZF9hc3NlcnQoCiAgICAvLyAgICAgR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcy50b3RhbF9ib3hlcyA9PSAwLCBlcnIuRlJFRVpFX0JPWEVTX0xFRlQKICAgIC8vICkKICAgIGJ6IGFzc2V0X2Rlc3Ryb3lfYWZ0ZXJfYXNzZXJ0QDcKICAgIHB1c2hieXRlcyAiRVJSOmZyZWV6ZUJveGVzTGVmdCIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpmcmVlemVCb3hlc0xlZnQKCmFzc2V0X2Rlc3Ryb3lfYWZ0ZXJfYXNzZXJ0QDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXZtX2xpYnJhcnkucHk6OTYtOTgKICAgIC8vIGl0eG4uQXNzZXRDb25maWcoCiAgICAvLyAgICAgY29uZmlnX2Fzc2V0PWRlc3Ryb3lfYXNzZXQsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvYXZtX2xpYnJhcnkucHk6OTYKICAgIC8vIGl0eG4uQXNzZXRDb25maWcoCiAgICBwdXNoaW50IDMgLy8gYWNmZwogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXZtX2xpYnJhcnkucHk6OTYtOTgKICAgIC8vIGl0eG4uQXNzZXRDb25maWcoCiAgICAvLyAgICAgY29uZmlnX2Fzc2V0PWRlc3Ryb3lfYXNzZXQsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo0MzItNDMzCiAgICAvLyAjIFRoZSBBcHAgaXMgZGVsZXRlZCB3aXRoIHRoaXMgY2FsbDogY2xvc2UgaXRzIGFjY291bnQgdG8gdGhlIE1hbmFnZXIKICAgIC8vIGlubmVyX2Nsb3NlX2FjY291bnQoY2xvc2VfcmVtYWluZGVyX3RvPVR4bi5zZW5kZXIpCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXZtX2xpYnJhcnkucHk6MTExLTExNQogICAgLy8gaXR4bi5QYXltZW50KAogICAgLy8gICAgIHJlY2VpdmVyPWNsb3NlX3JlbWFpbmRlcl90bywKICAgIC8vICAgICBhbW91bnQ9MCwKICAgIC8vICAgICBjbG9zZV9yZW1haW5kZXJfdG89Y2xvc2VfcmVtYWluZGVyX3RvLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgZHVwCiAgICBpdHhuX2ZpZWxkIENsb3NlUmVtYWluZGVyVG8KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdm1fbGlicmFyeS5weToxMTMKICAgIC8vIGFtb3VudD0wLAogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvYXZtX2xpYnJhcnkucHk6MTExCiAgICAvLyBpdHhuLlBheW1lbnQoCiAgICBpbnRjXzEgLy8gcGF5CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9hdm1fbGlicmFyeS5weToxMTEtMTE1CiAgICAvLyBpdHhuLlBheW1lbnQoCiAgICAvLyAgICAgcmVjZWl2ZXI9Y2xvc2VfcmVtYWluZGVyX3RvLAogICAgLy8gICAgIGFtb3VudD0wLAogICAgLy8gICAgIGNsb3NlX3JlbWFpbmRlcl90bz1jbG9zZV9yZW1haW5kZXJfdG8sCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo0MTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiRGVsZXRlQXBwbGljYXRpb24iXSwgcmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMuc21hcnRfYXNhLmNvbnRyYWN0LlNtYXJ0QXNhLndpdGhkcmF3X2V4Y2Vzc19hbGdvW3JvdXRpbmddKCkgLT4gdm9pZDoKd2l0aGRyYXdfZXhjZXNzX2FsZ286CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjQ0MC00NDEKICAgIC8vICMgUHJlY29uZGl0aW9ucwogICAgLy8gbG9nZ2VkX2Fzc2VydChUeG4uc2VuZGVyID09IHNlbGYubWFuYWdlcl9hZGRyLCBlcnIuVU5BVVRIT1JJWkVEX01BTkFHRVIpCiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAibWFuYWdlcl9hZGRyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1hbmFnZXJfYWRkciBleGlzdHMKICAgID09CiAgICBibnogd2l0aGRyYXdfZXhjZXNzX2FsZ29fYWZ0ZXJfYXNzZXJ0QDMKICAgIGJ5dGVjIDE0IC8vICJFUlI6dW5hdXRob3JpemVkTWFuYWdlciIKICAgIGxvZwogICAgZXJyIC8vIEVSUjp1bmF1dGhvcml6ZWRNYW5hZ2VyCgp3aXRoZHJhd19leGNlc3NfYWxnb19hZnRlcl9hc3NlcnRAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NDQzLTQ0NAogICAgLy8gIyBFZmZlY3RzCiAgICAvLyBhcHAgPSBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo0NDUKICAgIC8vIGlubmVyX3BheW1lbnQocmVjZWl2ZXI9VHhuLnNlbmRlciwgYW1vdW50PWFwcC5iYWxhbmNlIC0gYXBwLm1pbl9iYWxhbmNlKQogICAgdHhuIFNlbmRlcgogICAgZGlnIDEKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0QmFsYW5jZQogICAgYXNzZXJ0IC8vIGFjY291bnQgZnVuZGVkCiAgICB1bmNvdmVyIDIKICAgIGFjY3RfcGFyYW1zX2dldCBBY2N0TWluQmFsYW5jZQogICAgYXNzZXJ0IC8vIGFjY291bnQgZnVuZGVkCiAgICAtCiAgICBjYWxsc3ViIGlubmVyX3BheW1lbnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NDM1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMuc21hcnRfYXNhLmNvbnRyYWN0LlNtYXJ0QXNhLmdldF9hc3NldF9jb25maWdbcm91dGluZ10oKSAtPiB2b2lkOgpnZXRfYXNzZXRfY29uZmlnOgogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo0NDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlLCByZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NDU4LTQ1OQogICAgLy8gIyBQcmVjb25kaXRpb25zCiAgICAvLyBzZWxmLl9hc3NlcnRfY29tbW9uX3ByZWNvbmRpdGlvbnMoYXNzZXQpCiAgICBjYWxsc3ViIF9hc3NlcnRfY29tbW9uX3ByZWNvbmRpdGlvbnMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NDYzCiAgICAvLyB0b3RhbD1zZWxmLnRvdGFsLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gInRvdGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo0NjQKICAgIC8vIGRlY2ltYWxzPWFyYzQuVUludDMyKHNlbGYuZGVjaW1hbHMpLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gImRlY2ltYWxzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRlY2ltYWxzIGV4aXN0cwogICAgaXRvYgogICAgZHVwCiAgICBiaXRsZW4KICAgIGludGNfMiAvLyAzMgogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZXh0cmFjdCA0IDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NDY1CiAgICAvLyBkZWZhdWx0X2Zyb3plbj1zZWxmLmRlZmF1bHRfZnJvemVuLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gImRlZmF1bHRfZnJvemVuIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRlZmF1bHRfZnJvemVuIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo0NjYKICAgIC8vIHVuaXRfbmFtZT1zZWxmLnVuaXRfbmFtZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAidW5pdF9uYW1lIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnVuaXRfbmFtZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NDY3CiAgICAvLyBuYW1lPXNlbGYubmFtZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAibmFtZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5uYW1lIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo0NjgKICAgIC8vIHVybD1zZWxmLnVybCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMiAvLyAidXJsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnVybCBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NDY5CiAgICAvLyBtZXRhZGF0YV9oYXNoPXNlbGYubWV0YWRhdGFfaGFzaCwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAibWV0YWRhdGFfaGFzaCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tZXRhZGF0YV9oYXNoIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo0NzAKICAgIC8vIG1hbmFnZXJfYWRkcj1zZWxmLm1hbmFnZXJfYWRkciwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJtYW5hZ2VyX2FkZHIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWFuYWdlcl9hZGRyIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo0NzEKICAgIC8vIHJlc2VydmVfYWRkcj1zZWxmLnJlc2VydmVfYWRkciwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJyZXNlcnZlX2FkZHIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZV9hZGRyIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo0NzIKICAgIC8vIGZyZWV6ZV9hZGRyPXNlbGYuZnJlZXplX2FkZHIsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAiZnJlZXplX2FkZHIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZnJlZXplX2FkZHIgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjQ3MwogICAgLy8gY2xhd2JhY2tfYWRkcj1zZWxmLmNsYXdiYWNrX2FkZHIsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAiY2xhd2JhY2tfYWRkciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jbGF3YmFja19hZGRyIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo0NjEtNDc0CiAgICAvLyAjIEVmZmVjdHMKICAgIC8vIHJldHVybiBBc3NldENvbmZpZygKICAgIC8vICAgICB0b3RhbD1zZWxmLnRvdGFsLAogICAgLy8gICAgIGRlY2ltYWxzPWFyYzQuVUludDMyKHNlbGYuZGVjaW1hbHMpLAogICAgLy8gICAgIGRlZmF1bHRfZnJvemVuPXNlbGYuZGVmYXVsdF9mcm96ZW4sCiAgICAvLyAgICAgdW5pdF9uYW1lPXNlbGYudW5pdF9uYW1lLAogICAgLy8gICAgIG5hbWU9c2VsZi5uYW1lLAogICAgLy8gICAgIHVybD1zZWxmLnVybCwKICAgIC8vICAgICBtZXRhZGF0YV9oYXNoPXNlbGYubWV0YWRhdGFfaGFzaCwKICAgIC8vICAgICBtYW5hZ2VyX2FkZHI9c2VsZi5tYW5hZ2VyX2FkZHIsCiAgICAvLyAgICAgcmVzZXJ2ZV9hZGRyPXNlbGYucmVzZXJ2ZV9hZGRyLAogICAgLy8gICAgIGZyZWV6ZV9hZGRyPXNlbGYuZnJlZXplX2FkZHIsCiAgICAvLyAgICAgY2xhd2JhY2tfYWRkcj1zZWxmLmNsYXdiYWNrX2FkZHIsCiAgICAvLyApCiAgICB1bmNvdmVyIDEwCiAgICBpdG9iCiAgICB1bmNvdmVyIDEwCiAgICBjb25jYXQKICAgIGJ5dGVjIDE3IC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDExCiAgICBzZXRiaXQKICAgIGNvbmNhdAogICAgZGlnIDgKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgOQogICAgY29uY2F0CiAgICBzd2FwCiAgICBwdXNoYnl0ZXMgMHgwMDk1CiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBsZW4KICAgIHB1c2hpbnQgMTQ5CiAgICArCiAgICBkaWcgOQogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAxMAogICAgY29uY2F0CiAgICBkaWcgMQogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMwogICAgc3dhcAogICAgY29uY2F0CiAgICBkaWcgMQogICAgbGVuCiAgICB1bmNvdmVyIDMKICAgICsKICAgIGRpZyA5CiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDEwCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAzCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBsZW4KICAgIHVuY292ZXIgMwogICAgKwogICAgZGlnIDkKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMTAKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDgKICAgIGNvbmNhdAogICAgdW5jb3ZlciA3CiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjQ0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUsIHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICBieXRlYyA4IC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzLnNtYXJ0X2FzYS5jb250cmFjdC5TbWFydEFzYS5nZXRfYXNzZXRfaXNfZnJvemVuW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2Fzc2V0X2lzX2Zyb3plbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NDc2CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSwgcmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50OAogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjQ4Ny00ODgKICAgIC8vICMgUHJlY29uZGl0aW9ucwogICAgLy8gc2VsZi5fYXNzZXJ0X2NvbW1vbl9wcmVjb25kaXRpb25zKGZyZWV6ZV9hc3NldCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jb21tb25fcHJlY29uZGl0aW9ucwogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo0OTAtNDkxCiAgICAvLyAjIEVmZmVjdHMKICAgIC8vIHJldHVybiBzZWxmLmdsb2JhbF9mcm96ZW4KICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJnbG9iYWxfZnJvemVuIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmdsb2JhbF9mcm96ZW4gZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjQ3NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUsIHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICBieXRlYyAxNyAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjIDggLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMuc21hcnRfYXNhLmNvbnRyYWN0LlNtYXJ0QXNhLmdldF9hY2NvdW50X2lzX2Zyb3plbltyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9hY2NvdW50X2lzX2Zyb3plbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NDkzCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSwgcmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50OAogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIGJ0b2kKICAgIHR4bmFzIEFjY291bnRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjUwNy01MDgKICAgIC8vICMgUHJlY29uZGl0aW9ucwogICAgLy8gc2VsZi5fYXNzZXJ0X2NvbW1vbl9wcmVjb25kaXRpb25zKGZyZWV6ZV9hc3NldCkKICAgIHN3YXAKICAgIGNhbGxzdWIgX2Fzc2VydF9jb21tb25fcHJlY29uZGl0aW9ucwogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo1MTAtNTExCiAgICAvLyAjIEVmZmVjdHMKICAgIC8vIHJldHVybiBzZWxmLl9pc19mcm96ZW4oZnJlZXplX2FjY291bnQpCiAgICBjYWxsc3ViIF9pc19mcm96ZW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NDkzCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSwgcmVzb3VyY2VfZW5jb2Rpbmc9ImluZGV4IikKICAgIGJ5dGVjIDE3IC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWMgOCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5zbWFydF9hc2EuY29udHJhY3QuU21hcnRBc2EuZ2V0X2NpcmN1bGF0aW5nX3N1cHBseVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmdldF9jaXJjdWxhdGluZ19zdXBwbHk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjUxMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUsIHJlc291cmNlX2VuY29kaW5nPSJpbmRleCIpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo1MjQtNTI1CiAgICAvLyAjIFByZWNvbmRpdGlvbnMKICAgIC8vIHNlbGYuX2Fzc2VydF9jb21tb25fcHJlY29uZGl0aW9ucyhhc3NldCkKICAgIGR1cAogICAgY2FsbHN1YiBfYXNzZXJ0X2NvbW1vbl9wcmVjb25kaXRpb25zCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5Ojg3CiAgICAvLyByZXR1cm4gc2VsZi5faXNzdWVkX3N1cHBseShjdHJsX2Fzc2V0KQogICAgY2FsbHN1YiBfaXNzdWVkX3N1cHBseQogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo1MTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlLCByZXNvdXJjZV9lbmNvZGluZz0iaW5kZXgiKQogICAgaXRvYgogICAgYnl0ZWMgOCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5zbWFydF9hc2EuY29udHJhY3QuU21hcnRBc2EuX2lzc3VlZF9zdXBwbHkoY3RybF9hc3NldDogdWludDY0KSAtPiB1aW50NjQ6Cl9pc3N1ZWRfc3VwcGx5OgogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo3OAogICAgLy8gZGVmIF9pc3N1ZWRfc3VwcGx5KHNlbGYsIGN0cmxfYXNzZXQ6IEFzc2V0KSAtPiBVSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6NzktODAKICAgIC8vICMgVGhlIEFwcCBob2xkcyB0aGUgdW5pdHMgbm90IGlzc3VlZCB5ZXQ6IHRoZSB0b3RhbCBjYXBzIHRoZSBpc3N1ZWQgb25lcwogICAgLy8gcmV0dXJuIGNmZy5UT1RBTCAtIGN0cmxfYXNzZXQuYmFsYW5jZShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBhc3NlcnQgLy8gYWNjb3VudCBvcHRlZCBpbnRvIGFzc2V0CiAgICBpbnRjIDQgLy8gMTg0NDY3NDQwNzM3MDk1NTE2MTUKICAgIHN3YXAKICAgIC0KICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5zbWFydF9hc2EuY29udHJhY3QuU21hcnRBc2EuX2Fzc2VydF9jb21tb25fcHJlY29uZGl0aW9ucyhhc3NldDogdWludDY0KSAtPiB2b2lkOgpfYXNzZXJ0X2NvbW1vbl9wcmVjb25kaXRpb25zOgogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weTo4OQogICAgLy8gZGVmIF9hc3NlcnRfY29tbW9uX3ByZWNvbmRpdGlvbnMoc2VsZiwgYXNzZXQ6IEFzc2V0KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjkwCiAgICAvLyBsb2dnZWRfYXNzZXJ0KHNlbGYuc21hcnRfYXNhX2lkICE9IDAsIGVyci5NSVNTSU5HX0NUUkxfQVNBKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInNtYXJ0X2FzYV9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zbWFydF9hc2FfaWQgZXhpc3RzCiAgICBibnogX2Fzc2VydF9jb21tb25fcHJlY29uZGl0aW9uc19hZnRlcl9hc3NlcnRAMgogICAgcHVzaGJ5dGVzICJFUlI6Y3RybEFzYU5vdEV4aXN0IgogICAgbG9nCiAgICBlcnIgLy8gRVJSOmN0cmxBc2FOb3RFeGlzdAoKX2Fzc2VydF9jb21tb25fcHJlY29uZGl0aW9uc19hZnRlcl9hc3NlcnRAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6OTEKICAgIC8vIGxvZ2dlZF9hc3NlcnQoc2VsZi5zbWFydF9hc2FfaWQgPT0gYXNzZXQuaWQsIGVyci5JTlZBTElEX0NUUkxfQVNBKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInNtYXJ0X2FzYV9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zbWFydF9hc2FfaWQgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTEKICAgID09CiAgICBibnogX2Fzc2VydF9jb21tb25fcHJlY29uZGl0aW9uc19hZnRlcl9hc3NlcnRANAogICAgcHVzaGJ5dGVzICJFUlI6Y3RybEFzYUludmFsaWQiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6Y3RybEFzYUludmFsaWQKCl9hc3NlcnRfY29tbW9uX3ByZWNvbmRpdGlvbnNfYWZ0ZXJfYXNzZXJ0QDQ6CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMuc21hcnRfYXNhLmNvbnRyYWN0LlNtYXJ0QXNhLl9pc19mcm96ZW4oYWNjb3VudDogYnl0ZXMpIC0+IHVpbnQ2NDoKX2lzX2Zyb3plbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6OTMKICAgIC8vIGRlZiBfaXNfZnJvemVuKHNlbGYsIGFjY291bnQ6IEFjY291bnQpIC0+IGJvb2w6CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6OTQtOTUKICAgIC8vICMgQSBib3ggZmxpcHMgdGhlIGRlZmF1bHQgZnJlZXplIHN0YXRlIG9mIGl0cyBhY2NvdW50CiAgICAvLyByZXR1cm4gc2VsZi5kZWZhdWx0X2Zyb3plbiAhPSAoYWNjb3VudCBpbiBzZWxmLmZyZWV6ZV9leGNlcHRpb25zKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gImRlZmF1bHRfZnJvemVuIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRlZmF1bHRfZnJvemVuIGV4aXN0cwogICAgYnl0ZWMgMTYgLy8gMHg2NgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIT0KICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5zbWFydF9hc2EuY29udHJhY3QuU21hcnRBc2EuX2Fzc2VydF9yZXNlcnZlX25vdF9mcm96ZW4oKSAtPiB2b2lkOgpfYXNzZXJ0X3Jlc2VydmVfbm90X2Zyb3plbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zbWFydF9hc2EvY29udHJhY3QucHk6MTM0LTEzNQogICAgLy8gIyBUaGUgUmVzZXJ2ZSBvYmV5cyBhY2NvdW50IGZyZWV6ZXMsIGV2ZW4gaWYgaXQgaXMgYWxzbyB0aGUgQ2xhd2JhY2sKICAgIC8vIGxvZ2dlZF9hc3NlcnQobm90IHNlbGYuX2lzX2Zyb3plbihzZWxmLnJlc2VydmVfYWRkciksIGVyci5SRVNFUlZFX0ZST1pFTikKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJyZXNlcnZlX2FkZHIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmVzZXJ2ZV9hZGRyIGV4aXN0cwogICAgY2FsbHN1YiBfaXNfZnJvemVuCiAgICBieiBfYXNzZXJ0X3Jlc2VydmVfbm90X2Zyb3plbl9hZnRlcl9hc3NlcnRAMgogICAgcHVzaGJ5dGVzICJFUlI6cmVzZXJ2ZUZyb3plbiIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpyZXNlcnZlRnJvemVuCgpfYXNzZXJ0X3Jlc2VydmVfbm90X2Zyb3plbl9hZnRlcl9hc3NlcnRAMjoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5zbWFydF9hc2EuY29udHJhY3QuU21hcnRBc2EuX2Fzc2VydF92YWxpZF9tZXRhZGF0YV9oYXNoKG1ldGFkYXRhX2hhc2g6IGJ5dGVzKSAtPiB2b2lkOgpfYXNzZXJ0X3ZhbGlkX21ldGFkYXRhX2hhc2g6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjE1MwogICAgLy8gZGVmIF9hc3NlcnRfdmFsaWRfbWV0YWRhdGFfaGFzaChzZWxmLCBtZXRhZGF0YV9oYXNoOiBCeXRlcykgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL3NtYXJ0X2FzYS9jb250cmFjdC5weToxNTYKICAgIC8vIG1ldGFkYXRhX2hhc2gubGVuZ3RoID09IGNmZy5NRVRBREFUQV9IQVNIX0xFTkdUSCwKICAgIGZyYW1lX2RpZyAtMQogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvc21hcnRfYXNhL2NvbnRyYWN0LnB5OjE1NC0xNTgKICAgIC8vICMgTm9uLW5vcm1hdGl2ZTogc3RyaWN0ZXIgdGhhbiBBUkMtMjAsIHdoaWNoIGFsbG93cyBhbnkgYGJ5dGVbXWAgbGVuZ3RoCiAgICAvLyBsb2dnZWRfYXNzZXJ0KAogICAgLy8gICAgIG1ldGFkYXRhX2hhc2gubGVuZ3RoID09IGNmZy5NRVRBREFUQV9IQVNIX0xFTkdUSCwKICAgIC8vICAgICBlcnIuSU5WQUxJRF9NRVRBREFUQV9IQVNIX0xFTkdUSCwKICAgIC8vICkKICAgIGJueiBfYXNzZXJ0X3ZhbGlkX21ldGFkYXRhX2hhc2hfYWZ0ZXJfYXNzZXJ0QDIKICAgIHB1c2hieXRlcyAiRVJSOm1ldGFkYXRhSGFzaEludmFsaWQiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6bWV0YWRhdGFIYXNoSW52YWxpZAoKX2Fzc2VydF92YWxpZF9tZXRhZGF0YV9oYXNoX2FmdGVyX2Fzc2VydEAyOgogICAgcmV0c3ViCg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==" }, "byteCode": { "approval": "CyAFAAEgAv///////////wEmFgxyZXNlcnZlX2FkZHILZnJlZXplX2FkZHIMc21hcnRfYXNhX2lkDG1hbmFnZXJfYWRkcg1jbGF3YmFja19hZGRyDWdsb2JhbF9mcm96ZW4FdG90YWwOZGVmYXVsdF9mcm96ZW4EFR98dQhkZWNpbWFscwl1bml0X25hbWUEbmFtZQN1cmwNbWV0YWRhdGFfaGFzaBdFUlI6dW5hdXRob3JpemVkTWFuYWdlchBFUlI6Z2xvYmFsRnJvemVuAWYBABdFUlI6dW5hdXRob3JpemVkUmVzZXJ2ZRJFUlI6cmVjZWl2ZXJGcm96ZW4WRVJSOnVuYXV0aG9yaXplZEZyZWV6ZRJFUlI6Ym94TWJyVW5mdW5kZWQxGEAAsDE1gQgSQAAYgBRFUlI6d3JvbmdHbG9iYWxCeXRlc7AAMTSBBRJAABiAFEVSUjp3cm9uZ0dsb2JhbFVpbnRzsAAxN0EAF4ATRVJSOndyb25nTG9jYWxCeXRlc7AAMTZBABeAE0VSUjp3cm9uZ0xvY2FsVWludHOwACcGImcnCSJnJwciZycKgABnJwuAAGcnDIAAZycNgABnKzIDZygyA2cpMgNnJwQyA2cqImcnBSJnMRtBAG6ABEsXvyA2GgCOAQBVMRkURDEYRIIKBOfs1agE7mqEqgQvx0OoBBXPK6MEezUc5QSfYPOPBM4vBfMEEn+3FwQCb4qdBOl0g782GgCOCgApAWEC4wR0BKEFwgXkBrgG2AcCADEZgQUSMRgQREIFQDEZFDEYFBBDigIAsYv/sgiL/rIHI7IQIrIBs4k2GgFJFYEIEkQXNhoCSRWBBBJENhoDSRUjEkQiUzYaBEkiWSUISwEVEkRXAgA2GgVJIlklCEsBFRJEVwIANhoGSSJZJQhLARUSRFcCADYaB0kiWSUISwEVEkRXAgA2GghJTgQVJBJENhoJSU4EFSQSRDYaCklOBBUkEkQ2GgtJTgQVJBJEMQAyCRJAABuAF0VSUjp1bmF1dGhvcml6ZWRDcmVhdG9ysAAiKmVEQQAUgBBFUlI6Y3RybEFzYUV4aXN0sABJiAavMgpHA7GyLLIrsiqyKUmyKExJsidPAkmyJk8HSbIlI7IkIrIjIQSyIoEDshAisgGzKrQ8ZycHTwlnTwgXJwZPCmcnCUxnJwpMZycLTGcnDExnJw1MZytPBGcoTwNnKU8CZycETGciKmVEFicITFCwI0M2GgFJFSMSRBfAMEk2GgJJFYEIEkQXTDYaA0lOAxWBBBJENhoEFSMSRDYaBUkiWSUISwEVEkRXAgBOAzYaBkkiWSUISwEVEkRXAgBOAzYaB0kiWSUISwEVEkRXAgBOAzYaCEkiWSUISwEVEkRXAgBMNhoJSU4FFSQSRDYaCklOAxUkEkQ2GgtJTgIVJBJENhoMSU4CFSQSRIgFLzEAIitlRBJAAAQnDrAASwKIBZAiKGVESwQTQQAhIihlRDIDE0AAF4ATRVJSOnJlc2VydmVEaXNhYmxlZLAAIillREsCE0EAICIpZUQyAxNAABaAEkVSUjpmcmVlemVEaXNhYmxlZLAAIicEZURLARNBACMiJwRlRDIDE0AAGIAURVJSOmNsYXdiYWNrRGlzYWJsZWSwAE8KiASFSwUOQAAUgBBFUlI6dG90YWxJbnZhbGlksABPBRcnBk8GZycJTGcnCk8IZycLTwdnJwxPBmcnDU8DZytPBGcoTwNnKU8CZycETGcjQzYaAUkVIxJEF8AwSTYaAkkVgQgSRBdMNhoDSRUjEkQXwBxJTgI2GgRJFSMSRBfAHE4CTIgEEjIKEkEAfjEAIihlRBJAAAQnErAASTIKE0AAEYANRVJSOnNlbGZJc3N1ZbAAIiplRIgD0EsDCCInBmVEDkAAEYANRVJSOm92ZXJJc3N1ZbAAIicFZURBAAQnD7AAiAQHSYgD8UEABCcTsACxSbIUSwGyE0sCshJLA7IRgQSyECKyAbMjQ0kyChJBAEAxACIoZUQSQAAEJxKwACInBWVEQQAEJw+wACIoZURLAhJAABaAEkVSUjpjbGF3YmFja1JlZGVlbbAAiAOeQv+fMQAiJwRlRBJA/5QxAEsCEkAAHIAYRVJSOnVuYXV0aG9yaXplZENsYXdiYWNrsAAiJwVlREEABCcPsABLAYgDSUEAFIAQRVJSOnNlbmRlckZyb3plbrAASYgDLkEABCcTsAAiKmVESwFMcABISwMIgegHDkD/KYAWRVJSOmhvbGRpbmdDYXBFeGNlZWRlZLAANhoBSRUjEkQXwDA2GgJJFSMSRCJTTIgCnjEAIillRBJAAAQnFLAAJwVMZyNDIoAARwI2GgFJFSMSRBfAMDYaAkkVIxJEF8AcTDYaA0kVIxJEIlNMiAJgMQAiKWVEEkAABCcUsAAyCklFB3MBTEUERCInB2VEEkEAFicQTFC8SDEASwRzAURLAkwJiPsUI0MnEExQIrlB//VLA3MBREsBCUUDMRZAAAQnFbAAMRYjCUlFAzgQIxJBABxLATgHMgoSQQASSwE4CEsDD0EACCNA/7wnFbAAIkL/9TYaAUkVIxJEF8AwSYgBzzEAIitlRBJAAAQnDrAASYgBrkEAE4APRVJSOnVuaXRzSXNzdWVksAAyCnMKREEAF4ATRVJSOmZyZWV6ZUJveGVzTGVmdLAAsbIhgQOyECKyAbMxALFJsgkisgiyByOyECKyAbMjQzEAIitlRBJAAAQnDrAAMgoxAEsBcwBETwJzAUQJiPozI0M2GgFJFSMSRBfAMIgBOSInBmVEIicJZUQWSZMkDkRXBAQiJwdlRCInCmVEIicLZUQiJwxlRCInDWVEIitlRCIoZUQiKWVEIicEZURPChZPClAnESJPC1RQSwgVFlcGAk8JUEyAAgCVUEsBFYGVAQhLCRUWVwYCTwpQSwEWVwYCTwNMUEsBFU8DCEsJFRZXBgJPClBLARZXBgJPA0xQSwEVTwMISwkVFlcGAk8KUEwWVwYCTwJMUE8IUE8HUE8GUE8FUE8EUE8DUE8CUExQJwhMULAjQzYaAUkVIxJEF8AwiABlIicFZUQnESJPAlQnCExQsCNDNhoBSRUjEkQXwDA2GgJJFSMSRBfAHEyIADmIAHgnESJPAlQnCExQsCNDNhoBSRUjEkQXwDBJiAAaiAAIFicITFCwI0OKAQEyCov/cABEIQRMCYmKAQAiKmVEQAAXgBNFUlI6Y3RybEFzYU5vdEV4aXN0sAAiKmVEi/8SQAAWgBJFUlI6Y3RybEFzYUludmFsaWSwAImKAQEiJwdlRCcQi/9QvUUBE4kiKGVEiP/nQQAVgBFFUlI6cmVzZXJ2ZUZyb3plbrAAiYoBAIv/FSQSQAAbgBdFUlI6bWV0YWRhdGFIYXNoSW52YWxpZLAAiQ==", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, "minor": 10, "patch": 1 } }, "events": [], "templateVariables": {} }