{ "name": "Crowdfund", "structs": {}, "methods": [ { "name": "create", "args": [ { "type": "address", "name": "admin" }, { "type": "uint64", "name": "goal" }, { "type": "uint64", "name": "tokens_per_bundle" }, { "type": "uint64", "name": "days" }, { "type": "uint64", "name": "algo_per_bundle" }, { "type": "pay", "name": "fee_pay" } ], "returns": { "type": "void" }, "actions": { "create": [ "NoOp" ], "call": [] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "app_opt_in_asa", "args": [ { "type": "uint64", "name": "asset" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "setup", "args": [ { "type": "uint64", "name": "asset" }, { "type": "axfer", "name": "token_pay" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "contribute", "args": [ { "type": "pay", "name": "pay" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "finalize", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "creator_claim", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "admin_fee_claim", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "refund", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "creator_reclaim_asa", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "recover_stray_asa", "args": [ { "type": "uint64", "name": "asset" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "admin_sweep_asa", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "admin_claim", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "admin_cancel", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "delete", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "DeleteApplication" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "closeout", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "CloseOut" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "optin", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "OptIn" ] }, "readonly": false, "events": [], "recommendations": {} } ], "arcs": [ 22, 28 ], "networks": {}, "state": { "schema": { "global": { "ints": 13, "bytes": 2 }, "local": { "ints": 1, "bytes": 0 } }, "keys": { "global": { "goal": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "Z29hbA==" }, "tpb": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "dHBi" }, "apb": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "YXBi" }, "dec_factor": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "ZGVjX2ZhY3Rvcg==" }, "deadline": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "ZGVhZGxpbmU=" }, "days": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "ZGF5cw==" }, "asa_id": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "YXNhX2lk" }, "raised": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "cmFpc2Vk" }, "funded_round": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "ZnVuZGVkX3JvdW5k" }, "cancelled": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "Y2FuY2VsbGVk" }, "creator_claimed": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "Y3JlYXRvcl9jbGFpbWVk" }, "admin_fee_claimed": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "YWRtaW5fZmVlX2NsYWltZWQ=" }, "admin_claimed": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "YWRtaW5fY2xhaW1lZA==" }, "creator": { "keyType": "AVMString", "valueType": "address", "key": "Y3JlYXRvcg==" }, "admin": { "keyType": "AVMString", "valueType": "address", "key": "YWRtaW4=" } }, "local": { "contrib": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "Y29udHJpYg==" } }, "box": {} }, "maps": { "global": {}, "local": {}, "box": {} } }, "bareActions": { "create": [], "call": [] }, "sourceInfo": { "approval": { "sourceInfo": [ { "pc": [ 1245, 1621, 1767 ], "errorMessage": "check self.admin exists" }, { "pc": [ 1582, 1715 ], "errorMessage": "check self.admin_claimed exists" }, { "pc": [ 1226, 1597 ], "errorMessage": "check self.admin_fee_claimed exists" }, { "pc": [ 797, 1090 ], "errorMessage": "check self.apb exists" }, { "pc": [ 610, 683, 904, 1074, 1111, 1320, 1382, 1425, 1533, 1553 ], "errorMessage": "check self.asa_id exists" }, { "pc": [ 616, 689, 877, 1046, 1152, 1217, 1439, 1518, 1691, 1735, 1825 ], "errorMessage": "check self.cancelled exists" }, { "pc": [ 1727 ], "errorMessage": "check self.contrib exists for account" }, { "pc": [ 1182, 1328, 1394, 1479, 1644, 1758 ], "errorMessage": "check self.creator exists" }, { "pc": [ 1161 ], "errorMessage": "check self.creator_claimed exists" }, { "pc": [ 1776, 1809, 1837 ], "errorMessage": "check self.deadline exists" }, { "pc": [ 1099 ], "errorMessage": "check self.dec_factor exists" }, { "pc": [ 1018, 1041, 1147, 1212, 1432, 1511, 1699, 1782, 1791, 1818 ], "errorMessage": "check self.funded_round exists" }, { "pc": [ 781, 890, 977, 1010, 1167, 1232, 1604 ], "errorMessage": "check self.goal exists" }, { "pc": [ 702, 886, 970 ], "errorMessage": "check self.raised exists" }, { "pc": [ 774, 786, 897, 1067, 1082 ], "errorMessage": "check self.tpb exists" }, { "pc": [ 1473, 1589 ], "errorMessage": "grace not expired" }, { "pc": [ 356 ], "errorMessage": "invalid number of bytes for arc4.static_array" }, { "pc": [ 364, 373, 382, 391, 601, 656, 1358 ], "errorMessage": "invalid number of bytes for arc4.uint64" }, { "pc": [ 671 ], "errorMessage": "transaction type is axfer" }, { "pc": [ 402, 865 ], "errorMessage": "transaction type is pay" } ], "pcOffsetMethod": "none" }, "clear": { "sourceInfo": [], "pcOffsetMethod": "none" } }, "source": { "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgNCA4IDEwMDAwMDAgMTAwMDAwMDAgMTgyNjIyNzY2MzI5NzI0NTU5MzYgNTU4MDg2NgogICAgYnl0ZWNibG9jayAiYXNhX2lkIiAiY2FuY2VsbGVkIiAiZnVuZGVkX3JvdW5kIiAiZ29hbCIgImNvbnRyaWIiICJjcmVhdG9yIiAidHBiIiAicmFpc2VkIiAiYWRtaW5fZmVlX2NsYWltZWQiICJhZG1pbiIgImRlYWRsaW5lIiAiYWRtaW5fY2xhaW1lZCIgImFwYiIgImRlY19mYWN0b3IiICJjcmVhdG9yX2NsYWltZWQiCiAgICAvLyBjcm93ZGZ1bmQucHk6OTUKICAgIC8vIGNsYXNzIENyb3dkZnVuZChBUkM0Q29udHJhY3QpOgogICAgcHVzaGJ5dGVzcyAweDI0Mzc4ZDNjIDB4NDQxYjBjZmUgMHhkYzBkZTdlYiAvLyBtZXRob2QgImRlbGV0ZSgpdm9pZCIsIG1ldGhvZCAiY2xvc2VvdXQoKXZvaWQiLCBtZXRob2QgIm9wdGluKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9kZWxldGVfcm91dGVANCBtYWluX2Nsb3Nlb3V0X3JvdXRlQDUgbWFpbl9vcHRpbl9yb3V0ZUA2CgptYWluX3N3aXRjaF9jYXNlX25leHRANzoKICAgIC8vIGNyb3dkZnVuZC5weTo5NQogICAgLy8gY2xhc3MgQ3Jvd2RmdW5kKEFSQzRDb250cmFjdCk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBieiBtYWluX2NyZWF0ZV9Ob09wQDIyCiAgICBwdXNoYnl0ZXNzIDB4ODg1ZjhmM2EgMHgyM2FhZmRhOCAweGZlNzE3YjZkIDB4MjNkOGI3Y2UgMHgyOGZmYjAzNCAweDU3ZGVjM2FiIDB4MjNlNjI5ZjcgMHg1Yjg2MzEzNiAweDAwMTBlZWUwIDB4OTliZjk3YWQgMHg4YjA4MTRiZSAweDM2ZDlkZjQ2IC8vIG1ldGhvZCAiYXBwX29wdF9pbl9hc2EodWludDY0KXZvaWQiLCBtZXRob2QgInNldHVwKHVpbnQ2NCxheGZlcil2b2lkIiwgbWV0aG9kICJjb250cmlidXRlKHBheSl2b2lkIiwgbWV0aG9kICJmaW5hbGl6ZSgpdm9pZCIsIG1ldGhvZCAiY3JlYXRvcl9jbGFpbSgpdm9pZCIsIG1ldGhvZCAiYWRtaW5fZmVlX2NsYWltKCl2b2lkIiwgbWV0aG9kICJyZWZ1bmQoKXZvaWQiLCBtZXRob2QgImNyZWF0b3JfcmVjbGFpbV9hc2EoKXZvaWQiLCBtZXRob2QgInJlY292ZXJfc3RyYXlfYXNhKHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJhZG1pbl9zd2VlcF9hc2EoKXZvaWQiLCBtZXRob2QgImFkbWluX2NsYWltKCl2b2lkIiwgbWV0aG9kICJhZG1pbl9jYW5jZWwoKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBhcHBfb3B0X2luX2FzYSBzZXR1cCBjb250cmlidXRlIGZpbmFsaXplIGNyZWF0b3JfY2xhaW0gYWRtaW5fZmVlX2NsYWltIHJlZnVuZCBjcmVhdG9yX3JlY2xhaW1fYXNhIHJlY292ZXJfc3RyYXlfYXNhIGFkbWluX3N3ZWVwX2FzYSBhZG1pbl9jbGFpbSBhZG1pbl9jYW5jZWwKICAgIGVycgoKbWFpbl9jcmVhdGVfTm9PcEAyMjoKICAgIC8vIGNyb3dkZnVuZC5weTo5NQogICAgLy8gY2xhc3MgQ3Jvd2RmdW5kKEFSQzRDb250cmFjdCk6CiAgICBwdXNoYnl0ZXMgMHg3MGEyMTlkNCAvLyBtZXRob2QgImNyZWF0ZShhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCxwYXkpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIGNyZWF0ZQogICAgZXJyCgptYWluX29wdGluX3JvdXRlQDY6CiAgICAvLyBjcm93ZGZ1bmQucHk6NjQ2LTY0NwogICAgLy8gIyDilIDilIAgb25fb3B0aW4g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICAvLyBAYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJPcHRJbiJdKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgaW50Y18xIC8vIE9wdEluCiAgICA9PQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICYmCiAgICBhc3NlcnQKICAgIGIgb3B0aW4KCm1haW5fY2xvc2VvdXRfcm91dGVANToKICAgIC8vIGNyb3dkZnVuZC5weTo2NDEtNjQyCiAgICAvLyAjIOKUgOKUgCBvbl9jbG9zZW91dCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIC8vIEBhYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIkNsb3NlT3V0Il0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBwdXNoaW50IDIgLy8gQ2xvc2VPdXQKICAgID09CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgJiYKICAgIGFzc2VydAogICAgYiBjbG9zZW91dAoKbWFpbl9kZWxldGVfcm91dGVANDoKICAgIC8vIGNyb3dkZnVuZC5weTo2MzEtNjMyCiAgICAvLyAjIOKUgOKUgCBvbl9kZWxldGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICAvLyBAYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJEZWxldGVBcHBsaWNhdGlvbiJdKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgcHVzaGludCA1IC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICA9PQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICYmCiAgICBhc3NlcnQKICAgIGIgZGVsZXRlCgoKLy8gY3Jvd2RmdW5kLkNyb3dkZnVuZC5jcmVhdGVbcm91dGluZ10oKSAtPiB2b2lkOgpjcmVhdGU6CiAgICAvLyBjcm93ZGZ1bmQucHk6MTIyLTEyOQogICAgLy8gIyDilIDilIAgb25fY3JlYXRlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgLy8gIyBBcmdzOiBhZG1pbigzMiBieXRlcyksIGdvYWwobWljcm9BbGdvcyksIHRva2Vuc19wZXJfYnVuZGxlLCBkYXlzKDEtMTAwKSwKICAgIC8vICMgICAgICAgYWxnb19wZXJfYnVuZGxlCiAgICAvLyAjIEdyb3VwOiBbMF09QXBwbGljYXRpb25DcmVhdGUsIFsxXT1QYXltZW50KGxpc3RpbmdfZmVlKSBmcm9tIGNyZWF0b3IgdG8gYWRtaW4KICAgIC8vICMgdHBiID09IDAgc2lnbmFscyBhIGRvbmF0aW9uIGNhbXBhaWduIChubyB0b2tlbiBkaXN0cmlidXRpb24pLgogICAgLy8gIyBhcGIgbXVzdCBiZSA+IDAgYWx3YXlzIChpdCBpcyBhIGRpdmlzb3IgaW4gdGhlIHBheW91dCBtYXRoKS4KICAgIC8vICMgQWxsIGNhbXBhaWducyBoYXZlIGEgbWluaW11bSBsaXN0aW5nIGZlZSBvZiAxMCBBTEdPIHJlZ2FyZGxlc3Mgb2YgZ29hbC9kYXlzLgogICAgLy8gQGFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzEgLy8gcGF5CiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgcGF5CiAgICAvLyBjcm93ZGZ1bmQucHk6MTM5CiAgICAvLyBsaXN0aW5nX2ZlZSA9IChnb2FsICogZGF5cykgLy8gVUludDY0KDEwMF8wMDApCiAgICBkaWcgNAogICAgZGlnIDMKICAgICoKICAgIHB1c2hpbnQgMTAwMDAwCiAgICAvCiAgICAvLyBjcm93ZGZ1bmQucHk6MTQxCiAgICAvLyBVSW50NjQoTUlOX0xJU1RJTkdfRkVFKSBpZiBsaXN0aW5nX2ZlZSA8IE1JTl9MSVNUSU5HX0ZFRSBlbHNlIGxpc3RpbmdfZmVlCiAgICBkdXAKICAgIGludGMgNSAvLyAxMDAwMDAwMAogICAgPAogICAgaW50YyA1IC8vIDEwMDAwMDAwCiAgICBzd2FwCiAgICBzZWxlY3QKICAgIC8vIGNyb3dkZnVuZC5weToxNDMKICAgIC8vIGRlYWRsaW5lX3JvdW5kcyA9IEdsb2JhbC5yb3VuZCArIChkYXlzICogUk9VTkRTX1BFUl9EQVkpCiAgICBnbG9iYWwgUm91bmQKICAgIGRpZyA0CiAgICBwdXNoaW50IDMwODU3CiAgICAqCiAgICArCiAgICAvLyBjcm93ZGZ1bmQucHk6MTQ2CiAgICAvLyBhc3NlcnQgZ29hbCA+IDAKICAgIGRpZyA2CiAgICBhc3NlcnQKICAgIC8vIGNyb3dkZnVuZC5weToxNDcKICAgIC8vIGFzc2VydCBnb2FsICUgVUludDY0KDFfMDAwXzAwMCkgPT0gMAogICAgZGlnIDYKICAgIGludGMgNCAvLyAxMDAwMDAwCiAgICAlCiAgICAhCiAgICBhc3NlcnQKICAgIC8vIGNyb3dkZnVuZC5weToxNDgKICAgIC8vIGFzc2VydCBnb2FsID49IFVJbnQ2NCgxMF8wMDBfMDAwKQogICAgZGlnIDYKICAgIGludGMgNSAvLyAxMDAwMDAwMAogICAgPj0KICAgIGFzc2VydAogICAgLy8gY3Jvd2RmdW5kLnB5OjE0OQogICAgLy8gYXNzZXJ0IGdvYWwgPD0gTUFYX0dPQUwKICAgIGRpZyA2CiAgICBwdXNoaW50IDEwMDAwMDAwMDAwMDAwMAogICAgPD0KICAgIGFzc2VydAogICAgLy8gY3Jvd2RmdW5kLnB5OjE1MC0xNTIKICAgIC8vICMgdHBiID09IDAgaXMgYWxsb3dlZCAoZG9uYXRpb24pOyA+IDAgZm9yIHRva2VuIGNhbXBhaWducy4KICAgIC8vICMgYXBiIG11c3QgYWx3YXlzIGJlID4gMCDigJQgaXQgaXMgYSBkaXZpc29yIGF0IHBheW91dCB0aW1lLgogICAgLy8gYXNzZXJ0IGFsZ29fcGVyX2J1bmRsZSA+IDAKICAgIGRpZyAzCiAgICBhc3NlcnQKICAgIC8vIGNyb3dkZnVuZC5weToxNTMKICAgIC8vIGFzc2VydCBkYXlzID49IE1JTl9EQVlTCiAgICBkaWcgNAogICAgYXNzZXJ0CiAgICAvLyBjcm93ZGZ1bmQucHk6MTU0CiAgICAvLyBhc3NlcnQgZGF5cyA8PSBNQVhfREFZUwogICAgZGlnIDQKICAgIHB1c2hpbnQgMTAwCiAgICA8PQogICAgYXNzZXJ0CiAgICAvLyBjcm93ZGZ1bmQucHk6MTU1LTE1OQogICAgLy8gIyBMaXN0aW5nIGZlZSBwYXltZW50OiBncm91cGVkIFBheW1lbnQgZnJvbSBjcmVhdG9yIHRvIGFkbWluLgogICAgLy8gIyBVbmRlciBBUkMtNCB0aGUgdHJhbnNhY3Rpb24gYXJnIChmZWVfcGF5KSBpcyBwbGFjZWQgaW1tZWRpYXRlbHkgQkVGT1JFCiAgICAvLyAjIHRoaXMgYXBwIGNhbGwgaW4gdGhlIGdyb3VwLCBzbyB0aGUgYXBwIGNhbGwgaXMgYXQgaW5kZXggMSBhbmQgZmVlX3BheSBhdAogICAgLy8gIyBpbmRleCAwLiBBc3NlcnQgdGhhdCByZWxhdGlvbnNoaXAgcmF0aGVyIHRoYW4gYSBmaXhlZCBhYnNvbHV0ZSBpbmRleC4KICAgIC8vIGFzc2VydCBHbG9iYWwuZ3JvdXBfc2l6ZSA9PSAyCiAgICBnbG9iYWwgR3JvdXBTaXplCiAgICBwdXNoaW50IDIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGNyb3dkZnVuZC5weToxNjAKICAgIC8vIGFzc2VydCBmZWVfcGF5Lmdyb3VwX2luZGV4ID09IFR4bi5ncm91cF9pbmRleCAtIDEKICAgIGRpZyAyCiAgICBndHhucyBHcm91cEluZGV4CiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgID09CiAgICBhc3NlcnQKICAgIC8vIGNyb3dkZnVuZC5weToxNjEKICAgIC8vIGFzc2VydCBmZWVfcGF5LnNlbmRlciA9PSBUeG4uc2VuZGVyCiAgICBkaWcgMgogICAgZ3R4bnMgU2VuZGVyCiAgICB0eG4gU2VuZGVyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBjcm93ZGZ1bmQucHk6MTYyCiAgICAvLyBhc3NlcnQgZmVlX3BheS5yZWNlaXZlciA9PSBhZG1pbgogICAgZGlnIDIKICAgIGd0eG5zIFJlY2VpdmVyCiAgICBkaWcgOAogICAgPT0KICAgIGFzc2VydAogICAgLy8gY3Jvd2RmdW5kLnB5OjE2MwogICAgLy8gYXNzZXJ0IGZlZV9wYXkuYW1vdW50ID49IGVmZmVjdGl2ZV9saXN0aW5nX2ZlZQogICAgZGlnIDIKICAgIGd0eG5zIEFtb3VudAogICAgdW5jb3ZlciAyCiAgICA+PQogICAgYXNzZXJ0CiAgICAvLyBjcm93ZGZ1bmQucHk6MTY0CiAgICAvLyBhc3NlcnQgZmVlX3BheS5jbG9zZV9yZW1haW5kZXJfdG8gPT0gR2xvYmFsLnplcm9fYWRkcmVzcwogICAgZGlnIDEKICAgIGd0eG5zIENsb3NlUmVtYWluZGVyVG8KICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgPT0KICAgIGFzc2VydAogICAgLy8gY3Jvd2RmdW5kLnB5OjE2NQogICAgLy8gYXNzZXJ0IGZlZV9wYXkucmVrZXlfdG8gPT0gR2xvYmFsLnplcm9fYWRkcmVzcwogICAgc3dhcAogICAgZ3R4bnMgUmVrZXlUbwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBjcm93ZGZ1bmQucHk6MTY3CiAgICAvLyBzZWxmLmNyZWF0b3IudmFsdWUgPSBUeG4uc2VuZGVyCiAgICBieXRlYyA1IC8vICJjcmVhdG9yIgogICAgdHhuIFNlbmRlcgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIGNyb3dkZnVuZC5weToxNjgKICAgIC8vIHNlbGYuYWRtaW4udmFsdWUgPSBhZG1pbgogICAgYnl0ZWMgOSAvLyAiYWRtaW4iCiAgICB1bmNvdmVyIDYKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBjcm93ZGZ1bmQucHk6MTY5CiAgICAvLyBzZWxmLmdvYWwudmFsdWUgPSBnb2FsCiAgICBieXRlY18zIC8vICJnb2FsIgogICAgdW5jb3ZlciA1CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gY3Jvd2RmdW5kLnB5OjE3MAogICAgLy8gc2VsZi50cGIudmFsdWUgPSB0b2tlbnNfcGVyX2J1bmRsZQogICAgYnl0ZWMgNiAvLyAidHBiIgogICAgdW5jb3ZlciA0CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gY3Jvd2RmdW5kLnB5OjE3MQogICAgLy8gc2VsZi5hcGIudmFsdWUgPSBhbGdvX3Blcl9idW5kbGUKICAgIGJ5dGVjIDEyIC8vICJhcGIiCiAgICB1bmNvdmVyIDIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBjcm93ZGZ1bmQucHk6MTcyCiAgICAvLyBzZWxmLmRheXMudmFsdWUgPSBkYXlzCiAgICBwdXNoYnl0ZXMgImRheXMiCiAgICB1bmNvdmVyIDIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBjcm93ZGZ1bmQucHk6MTczCiAgICAvLyBzZWxmLmRlYWRsaW5lLnZhbHVlID0gZGVhZGxpbmVfcm91bmRzCiAgICBieXRlYyAxMCAvLyAiZGVhZGxpbmUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gY3Jvd2RmdW5kLnB5OjE3NAogICAgLy8gc2VsZi5yYWlzZWQudmFsdWUgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDcgLy8gInJhaXNlZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gY3Jvd2RmdW5kLnB5OjE3NQogICAgLy8gc2VsZi5hc2FfaWQudmFsdWUgPSBVSW50NjQoMCkKICAgIGJ5dGVjXzAgLy8gImFzYV9pZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gY3Jvd2RmdW5kLnB5OjE3NgogICAgLy8gc2VsZi5kZWNfZmFjdG9yLnZhbHVlID0gVUludDY0KDApCiAgICBieXRlYyAxMyAvLyAiZGVjX2ZhY3RvciIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gY3Jvd2RmdW5kLnB5OjE3NwogICAgLy8gc2VsZi5mdW5kZWRfcm91bmQudmFsdWUgPSBVSW50NjQoMCkKICAgIGJ5dGVjXzIgLy8gImZ1bmRlZF9yb3VuZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gY3Jvd2RmdW5kLnB5OjE3OAogICAgLy8gc2VsZi5jYW5jZWxsZWQudmFsdWUgPSBVSW50NjQoMCkKICAgIGJ5dGVjXzEgLy8gImNhbmNlbGxlZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gY3Jvd2RmdW5kLnB5OjE3OQogICAgLy8gc2VsZi5jcmVhdG9yX2NsYWltZWQudmFsdWUgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDE0IC8vICJjcmVhdG9yX2NsYWltZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIGNyb3dkZnVuZC5weToxODAKICAgIC8vIHNlbGYuYWRtaW5fZmVlX2NsYWltZWQudmFsdWUgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDggLy8gImFkbWluX2ZlZV9jbGFpbWVkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBjcm93ZGZ1bmQucHk6MTgxCiAgICAvLyBzZWxmLmFkbWluX2NsYWltZWQudmFsdWUgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDExIC8vICJhZG1pbl9jbGFpbWVkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBjcm93ZGZ1bmQucHk6MTIyLTEyOQogICAgLy8gIyDilIDilIAgb25fY3JlYXRlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgLy8gIyBBcmdzOiBhZG1pbigzMiBieXRlcyksIGdvYWwobWljcm9BbGdvcyksIHRva2Vuc19wZXJfYnVuZGxlLCBkYXlzKDEtMTAwKSwKICAgIC8vICMgICAgICAgYWxnb19wZXJfYnVuZGxlCiAgICAvLyAjIEdyb3VwOiBbMF09QXBwbGljYXRpb25DcmVhdGUsIFsxXT1QYXltZW50KGxpc3RpbmdfZmVlKSBmcm9tIGNyZWF0b3IgdG8gYWRtaW4KICAgIC8vICMgdHBiID09IDAgc2lnbmFscyBhIGRvbmF0aW9uIGNhbXBhaWduIChubyB0b2tlbiBkaXN0cmlidXRpb24pLgogICAgLy8gIyBhcGIgbXVzdCBiZSA+IDAgYWx3YXlzIChpdCBpcyBhIGRpdmlzb3IgaW4gdGhlIHBheW91dCBtYXRoKS4KICAgIC8vICMgQWxsIGNhbXBhaWducyBoYXZlIGEgbWluaW11bSBsaXN0aW5nIGZlZSBvZiAxMCBBTEdPIHJlZ2FyZGxlc3Mgb2YgZ29hbC9kYXlzLgogICAgLy8gQGFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIGNyb3dkZnVuZC5Dcm93ZGZ1bmQuYXBwX29wdF9pbl9hc2Fbcm91dGluZ10oKSAtPiB2b2lkOgphcHBfb3B0X2luX2FzYToKICAgIC8vIGNyb3dkZnVuZC5weToyMzQtMjUyCiAgICAvLyAjIOKUgOKUgCBhcHBfb3B0X2luX2FzYSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIC8vICMgT3B0cyB0aGUgQVBQIGFjY291bnQgaW50byB0aGUgcHJvamVjdCBBU0EgaW4gSVRTIE9XTiB0cmFuc2FjdGlvbiwgc3VibWl0dGVkCiAgICAvLyAjIGFuZCBjb25maXJtZWQgQkVGT1JFIHRoZSBzZXR1cCBncm91cC4KICAgIC8vICMKICAgIC8vICMgV2h5IHRoaXMgZXhpc3RzIChzdWJ0bGUgYnV0IGxvYWQtYmVhcmluZyk6IFB1eWEgYmluZHMgYSBtZXRob2QncyB0cmFuc2FjdGlvbgogICAgLy8gIyBhcmd1bWVudCB0byB0aGUgZ3JvdXAgc2xvdCBpbW1lZGlhdGVseSBCRUZPUkUgdGhlIGNhbGwgKEdyb3VwSW5kZXggLSAxKS4gU28gaW4KICAgIC8vICMgdGhlIHNldHVwIGdyb3VwIFtBc3NldFRyYW5zZmVyLCBzZXR1cF0sIHRoZSB0b2tlbi1wb29sIHRyYW5zZmVyIGV4ZWN1dGVzIGZpcnN0LAogICAgLy8gIyBiZWZvcmUgc2V0dXAncyBib2R5IHJ1bnMuIElmIHRoZSBhcHAgb3B0ZWQgaW50byB0aGUgQVNBIGluc2lkZSBzZXR1cCAoYXMgaXQgZGlkCiAgICAvLyAjIG9yaWdpbmFsbHkpLCB0aGUgdHJhbnNmZXIgd291bGQgYXJyaXZlIGF0IGFuIGFwcCB0aGF0IGlzbid0IG9wdGVkIGluIHlldCBhbmQKICAgIC8vICMgZmFpbCB3aXRoICJyZWNlaXZlciBlcnJvcjogbXVzdCBvcHRpbiIuIE9wdGluZyBpbiBoZXJlLCBpbiBhIHNlcGFyYXRlIHByaW9yCiAgICAvLyAjIHRyYW5zYWN0aW9uLCBndWFyYW50ZWVzIHRoZSBhcHAgY2FuIHJlY2VpdmUgdGhlIHBvb2wgd2hlbiBzZXR1cCBydW5zLgogICAgLy8gIwogICAgLy8gIyAoVGhlIG9yaWdpbmFsIFB5VGVhbCB1c2VkIGdyb3VwIG9yZGVyIFthcHBDYWxsLCB0cmFuc2Zlcl0sIHNvIGl0cyBpbm5lciBvcHQtaW4KICAgIC8vICMgcmFuIGJlZm9yZSB0aGUgdHJhbnNmZXIg4oCUIHRoZSBBUkMtNCBwb3J0J3MgbWFuZGF0b3J5IHJlb3JkZXJpbmcgaXMgd2hhdCBtYWRlIGEKICAgIC8vICMgZGVkaWNhdGVkIG9wdC1pbiBuZWNlc3NhcnkuKQogICAgLy8gIwogICAgLy8gIyBHYXRlZCB0byBydW4gb25seSBiZWZvcmUgc2V0dXAgY29tcGxldGVzIChhc2FfaWQgc3RpbGwgMCksIGNyZWF0b3Itb25seSwgYmVmb3JlCiAgICAvLyAjIHRoZSBkZWFkbGluZS4gRmVlIDIwMDAgb24gdGhlIGNhbGwgY292ZXJzIHRoZSBzaW5nbGUgcG9vbGVkIGlubmVyIG9wdC1pbi4KICAgIC8vIEBhYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIC8vIGNyb3dkZnVuZC5weToyNTQKICAgIC8vIGFzc2VydCBzZWxmLl9pc19jcmVhdG9yKCkKICAgIGNhbGxzdWIgX2lzX2NyZWF0b3IKICAgIGFzc2VydAogICAgLy8gY3Jvd2RmdW5kLnB5OjI1NQogICAgLy8gYXNzZXJ0IHNlbGYuYXNhX2lkLnZhbHVlID09IDAgICAgICAgICMgb25seSBiZWZvcmUgc2V0dXAgd3JpdGVzIGFzYV9pZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gImFzYV9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc2FfaWQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQKICAgIC8vIGNyb3dkZnVuZC5weToyMDIKICAgIC8vIHJldHVybiBzZWxmLmNhbmNlbGxlZC52YWx1ZSA9PSAxCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAiY2FuY2VsbGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNhbmNlbGxlZCBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgLy8gY3Jvd2RmdW5kLnB5OjI1NgogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLl9pc19jYW5jZWxsZWQoKQogICAgIQogICAgYXNzZXJ0CiAgICAvLyBjcm93ZGZ1bmQucHk6MjU3CiAgICAvLyBhc3NlcnQgc2VsZi5fYmVmb3JlX2RlYWRsaW5lKCkKICAgIGNhbGxzdWIgX2JlZm9yZV9kZWFkbGluZQogICAgYXNzZXJ0CiAgICAvLyBjcm93ZGZ1bmQucHk6MjU4CiAgICAvLyBhc3NlcnQgVHhuLm51bV9hc3NldHMgPT0gMQogICAgdHhuIE51bUFzc2V0cwogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGNyb3dkZnVuZC5weToyNTktMjY0CiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1hc3NldCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD0wLAogICAgLy8gICAgIGZlZT0wLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gY3Jvd2RmdW5kLnB5OjI2MQogICAgLy8gYXNzZXRfcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICAvLyBjcm93ZGZ1bmQucHk6MjYyCiAgICAvLyBhc3NldF9hbW91bnQ9MCwKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBjcm93ZGZ1bmQucHk6MjU5CiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICBpbnRjXzIgLy8gYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIC8vIGNyb3dkZnVuZC5weToyNjMKICAgIC8vIGZlZT0wLAogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBjcm93ZGZ1bmQucHk6MjU5LTI2NAogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9YXNzZXQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICBhc3NldF9hbW91bnQ9MCwKICAgIC8vICAgICBmZWU9MCwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBjcm93ZGZ1bmQucHk6MjM0LTI1MgogICAgLy8gIyDilIDilIAgYXBwX29wdF9pbl9hc2Eg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICAvLyAjIE9wdHMgdGhlIEFQUCBhY2NvdW50IGludG8gdGhlIHByb2plY3QgQVNBIGluIElUUyBPV04gdHJhbnNhY3Rpb24sIHN1Ym1pdHRlZAogICAgLy8gIyBhbmQgY29uZmlybWVkIEJFRk9SRSB0aGUgc2V0dXAgZ3JvdXAuCiAgICAvLyAjCiAgICAvLyAjIFdoeSB0aGlzIGV4aXN0cyAoc3VidGxlIGJ1dCBsb2FkLWJlYXJpbmcpOiBQdXlhIGJpbmRzIGEgbWV0aG9kJ3MgdHJhbnNhY3Rpb24KICAgIC8vICMgYXJndW1lbnQgdG8gdGhlIGdyb3VwIHNsb3QgaW1tZWRpYXRlbHkgQkVGT1JFIHRoZSBjYWxsIChHcm91cEluZGV4IC0gMSkuIFNvIGluCiAgICAvLyAjIHRoZSBzZXR1cCBncm91cCBbQXNzZXRUcmFuc2Zlciwgc2V0dXBdLCB0aGUgdG9rZW4tcG9vbCB0cmFuc2ZlciBleGVjdXRlcyBmaXJzdCwKICAgIC8vICMgYmVmb3JlIHNldHVwJ3MgYm9keSBydW5zLiBJZiB0aGUgYXBwIG9wdGVkIGludG8gdGhlIEFTQSBpbnNpZGUgc2V0dXAgKGFzIGl0IGRpZAogICAgLy8gIyBvcmlnaW5hbGx5KSwgdGhlIHRyYW5zZmVyIHdvdWxkIGFycml2ZSBhdCBhbiBhcHAgdGhhdCBpc24ndCBvcHRlZCBpbiB5ZXQgYW5kCiAgICAvLyAjIGZhaWwgd2l0aCAicmVjZWl2ZXIgZXJyb3I6IG11c3Qgb3B0aW4iLiBPcHRpbmcgaW4gaGVyZSwgaW4gYSBzZXBhcmF0ZSBwcmlvcgogICAgLy8gIyB0cmFuc2FjdGlvbiwgZ3VhcmFudGVlcyB0aGUgYXBwIGNhbiByZWNlaXZlIHRoZSBwb29sIHdoZW4gc2V0dXAgcnVucy4KICAgIC8vICMKICAgIC8vICMgKFRoZSBvcmlnaW5hbCBQeVRlYWwgdXNlZCBncm91cCBvcmRlciBbYXBwQ2FsbCwgdHJhbnNmZXJdLCBzbyBpdHMgaW5uZXIgb3B0LWluCiAgICAvLyAjIHJhbiBiZWZvcmUgdGhlIHRyYW5zZmVyIOKAlCB0aGUgQVJDLTQgcG9ydCdzIG1hbmRhdG9yeSByZW9yZGVyaW5nIGlzIHdoYXQgbWFkZSBhCiAgICAvLyAjIGRlZGljYXRlZCBvcHQtaW4gbmVjZXNzYXJ5LikKICAgIC8vICMKICAgIC8vICMgR2F0ZWQgdG8gcnVuIG9ubHkgYmVmb3JlIHNldHVwIGNvbXBsZXRlcyAoYXNhX2lkIHN0aWxsIDApLCBjcmVhdG9yLW9ubHksIGJlZm9yZQogICAgLy8gIyB0aGUgZGVhZGxpbmUuIEZlZSAyMDAwIG9uIHRoZSBjYWxsIGNvdmVycyB0aGUgc2luZ2xlIHBvb2xlZCBpbm5lciBvcHQtaW4uCiAgICAvLyBAYWJpbWV0aG9kCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gY3Jvd2RmdW5kLkNyb3dkZnVuZC5zZXR1cFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnNldHVwOgogICAgLy8gY3Jvd2RmdW5kLnB5OjI2Ni0yNzIKICAgIC8vICMg4pSA4pSAIHNldHVwIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgLy8gIyBBUkMtNCBncm91cDogWzBdIEFzc2V0VHJhbnNmZXIodG9rZW5zIGZyb20gY3JlYXRvciB0byBhcHApLCBbMV0gQXBwQ2FsbCgic2V0dXAiKS4KICAgIC8vICMgVGhlIHRva2VuIHRyYW5zZmVyIGlzIHBhc3NlZCBhcyB0aGUgbWV0aG9kJ3MgdHJhbnNhY3Rpb24gYXJndW1lbnQsIHNvIFB1eWEKICAgIC8vICMgcGxhY2VzIGl0IGltbWVkaWF0ZWx5IGJlZm9yZSB0aGlzIGFwcCBjYWxsIChHcm91cEluZGV4IC0gMSkgYW5kIHRoZSB0cmFuc2ZlcgogICAgLy8gIyBleGVjdXRlcyBmaXJzdC4gVGhlIGFwcCBNVVNUIGFscmVhZHkgYmUgb3B0ZWQgaW50byB0aGUgQVNBIGJ5IHRoZW4g4oCUIGNhbGwKICAgIC8vICMgYXBwX29wdF9pbl9hc2EgaW4gYSBwcmlvciB0cmFuc2FjdGlvbiAoc2VlIHRoYXQgbWV0aG9kIGZvciB0aGUgZnVsbCByYXRpb25hbGUpLgogICAgLy8gQGFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGR1cAogICAgY292ZXIgMgogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18yIC8vIGF4ZmVyCiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgYXhmZXIKICAgIC8vIGNyb3dkZnVuZC5weToyNzQKICAgIC8vIGFwcF9hZGRyID0gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcwogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIGNvdmVyIDIKICAgIC8vIGNyb3dkZnVuZC5weToyNzUKICAgIC8vIGFzc2VydCBzZWxmLl9pc19jcmVhdG9yKCkKICAgIGNhbGxzdWIgX2lzX2NyZWF0b3IKICAgIGFzc2VydAogICAgLy8gY3Jvd2RmdW5kLnB5OjI3NgogICAgLy8gYXNzZXJ0IHNlbGYuYXNhX2lkLnZhbHVlID09IDAgICMgb25lLXRpbWUgb25seQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gImFzYV9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc2FfaWQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQKICAgIC8vIGNyb3dkZnVuZC5weToyMDIKICAgIC8vIHJldHVybiBzZWxmLmNhbmNlbGxlZC52YWx1ZSA9PSAxCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAiY2FuY2VsbGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNhbmNlbGxlZCBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgLy8gY3Jvd2RmdW5kLnB5OjI3NwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLl9pc19jYW5jZWxsZWQoKQogICAgIQogICAgYXNzZXJ0CiAgICAvLyBjcm93ZGZ1bmQucHk6Mjc4CiAgICAvLyBhc3NlcnQgc2VsZi5fYmVmb3JlX2RlYWRsaW5lKCkgICMgY2Fubm90IHNldCB1cCBhZnRlciB0aGUgY2FtcGFpZ24gZW5kcwogICAgY2FsbHN1YiBfYmVmb3JlX2RlYWRsaW5lCiAgICBhc3NlcnQKICAgIC8vIGNyb3dkZnVuZC5weToyNzkKICAgIC8vIGFzc2VydCBzZWxmLnJhaXNlZC52YWx1ZSA9PSAwICAjIGNhbm5vdCBzZXQgdXAgYWZ0ZXIgY29udHJpYnV0aW9ucyBiZWdpbgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gInJhaXNlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yYWlzZWQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQKICAgIC8vIGNyb3dkZnVuZC5weToyODAKICAgIC8vIGFzc2VydCBUeG4ubnVtX2Fzc2V0cyA9PSAxCiAgICB0eG4gTnVtQXNzZXRzCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gY3Jvd2RmdW5kLnB5OjI4MQogICAgLy8gc2VsZi5hc2FfaWQudmFsdWUgPSBhc3NldC5pZAogICAgYnl0ZWNfMCAvLyAiYXNhX2lkIgogICAgZGlnIDIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBjcm93ZGZ1bmQucHk6MjgyCiAgICAvLyBhc3NlcnQgR2xvYmFsLmdyb3VwX3NpemUgPT0gMgogICAgZ2xvYmFsIEdyb3VwU2l6ZQogICAgcHVzaGludCAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBjcm93ZGZ1bmQucHk6MjgzCiAgICAvLyBhc3NlcnQgdG9rZW5fcGF5Lmdyb3VwX2luZGV4ID09IFR4bi5ncm91cF9pbmRleCAtIDEKICAgIGd0eG5zIEdyb3VwSW5kZXgKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgPT0KICAgIGFzc2VydAogICAgLy8gY3Jvd2RmdW5kLnB5OjI4NC0yODYKICAgIC8vICMgUmVhZCB0aGUgQVNBIGRlY2ltYWxzIG9uLWNoYWluIChubyB0cnVzdCBpbiBjYWxsZXItc3VwcGxpZWQgdmFsdWUpIGFuZAogICAgLy8gIyBzdG9yZSBkZWNfZmFjdG9yID0gMTBeZGVjaW1hbHMgZm9yIHVzZSBhdCBmaW5hbGl6ZS4KICAgIC8vIGRlY2ltYWxzLCBkZWNfb2sgPSBvcC5Bc3NldFBhcmFtc0dldC5hc3NldF9kZWNpbWFscyhhc3NldCkKICAgIGR1cAogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldERlY2ltYWxzCiAgICAvLyBjcm93ZGZ1bmQucHk6Mjg3CiAgICAvLyBhc3NlcnQgZGVjX29rCiAgICBhc3NlcnQKICAgIC8vIGNyb3dkZnVuZC5weToyODgtMjk0CiAgICAvLyAjIFJlamVjdCBydWctY2FwYWJsZSB0b2tlbnM6IGNsYXdiYWNrIGFuZCBmcmVlemUgbXVzdCBiZSBwZXJtYW5lbnRseQogICAgLy8gIyBkaXNhYmxlZCAoYSB6ZXJvIGNsYXdiYWNrL2ZyZWV6ZSBhZGRyZXNzIGlzIGltbXV0YWJsZSBvbiBBbGdvcmFuZCksIGFuZAogICAgLy8gIyB0aGUgYXNzZXQgbXVzdCBub3QgYmUgZGVmYXVsdC1mcm96ZW4uIFdpdGhvdXQgdGhlc2UgYSBjcmVhdG9yIGNvdWxkIGNsYXcKICAgIC8vICMgYmFjayB0aGUgcG9vbCBhZnRlciBmdW5kaW5nLCBvciBmcmVlemUgdGhlIGFwcCdzIGhvbGRpbmcg4oCUIHdoaWNoIGJsb2NrcwogICAgLy8gIyBhc3NldF9jbG9zZV90bywgc28gYXNhX2lkIGNvdWxkIG5ldmVyIHJlc2V0IHRvIDAgYW5kIHRoZSBBTEdPIGNsb3NlIHdvdWxkCiAgICAvLyAjIGJlIHRyYXBwZWQgZm9yZXZlci4KICAgIC8vIGNsYXdiYWNrLCBjbGF3X29rID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfY2xhd2JhY2soYXNzZXQpCiAgICBkaWcgMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldENsYXdiYWNrCiAgICAvLyBjcm93ZGZ1bmQucHk6Mjk1CiAgICAvLyBhc3NlcnQgY2xhd19vawogICAgYXNzZXJ0CiAgICAvLyBjcm93ZGZ1bmQucHk6Mjk2CiAgICAvLyBhc3NlcnQgY2xhd2JhY2sgPT0gR2xvYmFsLnplcm9fYWRkcmVzcwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBjcm93ZGZ1bmQucHk6Mjk3CiAgICAvLyBmcmVlemUsIGZyZWV6ZV9vayA9IG9wLkFzc2V0UGFyYW1zR2V0LmFzc2V0X2ZyZWV6ZShhc3NldCkKICAgIGRpZyAxCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0RnJlZXplCiAgICAvLyBjcm93ZGZ1bmQucHk6Mjk4CiAgICAvLyBhc3NlcnQgZnJlZXplX29rCiAgICBhc3NlcnQKICAgIC8vIGNyb3dkZnVuZC5weToyOTkKICAgIC8vIGFzc2VydCBmcmVlemUgPT0gR2xvYmFsLnplcm9fYWRkcmVzcwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBjcm93ZGZ1bmQucHk6MzAwCiAgICAvLyBkZnJvemVuLCBkZnJvemVuX29rID0gb3AuQXNzZXRQYXJhbXNHZXQuYXNzZXRfZGVmYXVsdF9mcm96ZW4oYXNzZXQpCiAgICBzd2FwCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0RGVmYXVsdEZyb3plbgogICAgLy8gY3Jvd2RmdW5kLnB5OjMwMQogICAgLy8gYXNzZXJ0IGRmcm96ZW5fb2sKICAgIGFzc2VydAogICAgLy8gY3Jvd2RmdW5kLnB5OjMwMgogICAgLy8gYXNzZXJ0IG5vdCBkZnJvemVuCiAgICAhCiAgICBhc3NlcnQKICAgIC8vIGNyb3dkZnVuZC5weTozMDQKICAgIC8vIGRmID0gb3AuZXhwKFVJbnQ2NCgxMCksIGRlY2ltYWxzKSAgIyAxMF5kZWNpbWFscwogICAgcHVzaGludCAxMAogICAgc3dhcAogICAgZXhwCiAgICBkdXAKICAgIGNvdmVyIDQKICAgIC8vIGNyb3dkZnVuZC5weTozMDUKICAgIC8vIHNlbGYuZGVjX2ZhY3Rvci52YWx1ZSA9IGRmCiAgICBieXRlYyAxMyAvLyAiZGVjX2ZhY3RvciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBjcm93ZGZ1bmQucHk6MzA2LTMxMAogICAgLy8gIyBPdmVyZmxvdyBndWFyZCAodG9rZW4gY2FtcGFpZ25zIG9ubHkpOiBwcm92ZSBubyBmaW5hbGl6ZSBpbnRlcm1lZGlhdGUgY2FuCiAgICAvLyAjIGV4Y2VlZCB1aW50NjQgYXQgdGhlIHdvcnN0IGNhc2Ugb2Ygb25lIGJhY2tlciBjb250cmlidXRpbmcgdGhlIHdob2xlIGdvYWwuCiAgICAvLyAjICAgbnVtZXJfbWF4ID0gZ29hbCAqIHRwYiA7IHdob2xlX2NhcCA9IG51bWVyX21heCAvIChhcGIgKiAxZTYpIDsKICAgIC8vICMgICBwb29sL2Jhc2VfbWF4ID0gd2hvbGVfY2FwICogZGVjX2ZhY3Rvci4gQm90aCBtdXN0IHN0YXkgdW5kZXIgU0FGRV9DRUlMLgogICAgLy8gcG9vbF9uZWVkZWQgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBjb3ZlciAzCiAgICAvLyBjcm93ZGZ1bmQucHk6MzExCiAgICAvLyBpZiBzZWxmLnRwYi52YWx1ZSAhPSAwOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gInRwYiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50cGIgZXhpc3RzCiAgICBieiBzZXR1cF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIGNyb3dkZnVuZC5weTozMTIKICAgIC8vIGFzc2VydCBzZWxmLmdvYWwudmFsdWUgKiBzZWxmLnRwYi52YWx1ZSA8PSBTQUZFX0NFSUwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJnb2FsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmdvYWwgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAidHBiIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRwYiBleGlzdHMKICAgICoKICAgIGR1cAogICAgaW50YyA2IC8vIDE4MjYyMjc2NjMyOTcyNDU1OTM2CiAgICA8PQogICAgYXNzZXJ0CiAgICAvLyBjcm93ZGZ1bmQucHk6MzE0CiAgICAvLyBzZWxmLmFwYi52YWx1ZSAqIFVJbnQ2NCgxXzAwMF8wMDApCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTIgLy8gImFwYiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hcGIgZXhpc3RzCiAgICBpbnRjIDQgLy8gMTAwMDAwMAogICAgKgogICAgLy8gY3Jvd2RmdW5kLnB5OjMxMy0zMTUKICAgIC8vIHdob2xlX2NhcCA9IChzZWxmLmdvYWwudmFsdWUgKiBzZWxmLnRwYi52YWx1ZSkgLy8gKAogICAgLy8gICAgIHNlbGYuYXBiLnZhbHVlICogVUludDY0KDFfMDAwXzAwMCkKICAgIC8vICkKICAgIC8KICAgIC8vIGNyb3dkZnVuZC5weTozMTYKICAgIC8vIHBvb2xfbmVlZGVkID0gd2hvbGVfY2FwICogZGYKICAgIGRpZyA1CiAgICAqCiAgICBkdXAKICAgIGJ1cnkgNQogICAgLy8gY3Jvd2RmdW5kLnB5OjMxNwogICAgLy8gYXNzZXJ0IHBvb2xfbmVlZGVkIDw9IFNBRkVfQ0VJTAogICAgaW50YyA2IC8vIDE4MjYyMjc2NjMyOTcyNDU1OTM2CiAgICA8PQogICAgYXNzZXJ0CgpzZXR1cF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBjcm93ZGZ1bmQucHk6MzI0LTMyNgogICAgLy8gIyBWYWxpZGF0ZSBBU0EgdG9rZW4gcG9vbCB0cmFuc2ZlciBjb3ZlcnMgdGhlIHdob2xlLXRva2VuIGRpc3RyaWJ1dGlvbiBhdAogICAgLy8gIyBmdWxsIGdvYWwgKGZsb29yLXRvLXdob2xlLXRva2Vucywgc2NhbGVkIHRvIGJhc2UgdW5pdHMpLgogICAgLy8gYXNzZXJ0IHRva2VuX3BheS5zZW5kZXIgPT0gVHhuLnNlbmRlcgogICAgc3dhcAogICAgZHVwCiAgICBndHhucyBTZW5kZXIKICAgIHR4biBTZW5kZXIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGNyb3dkZnVuZC5weTozMjcKICAgIC8vIGFzc2VydCB0b2tlbl9wYXkuYXNzZXRfcmVjZWl2ZXIgPT0gYXBwX2FkZHIKICAgIGR1cAogICAgZ3R4bnMgQXNzZXRSZWNlaXZlcgogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBjcm93ZGZ1bmQucHk6MzI4CiAgICAvLyBhc3NlcnQgdG9rZW5fcGF5LnhmZXJfYXNzZXQgPT0gYXNzZXQKICAgIGR1cAogICAgZ3R4bnMgWGZlckFzc2V0CiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGNyb3dkZnVuZC5weTozMjkKICAgIC8vIGFzc2VydCB0b2tlbl9wYXkuYXNzZXRfYW1vdW50ID49IHBvb2xfbmVlZGVkCiAgICBkdXAKICAgIGd0eG5zIEFzc2V0QW1vdW50CiAgICBkaWcgMgogICAgPj0KICAgIGFzc2VydAogICAgLy8gY3Jvd2RmdW5kLnB5OjMzMAogICAgLy8gYXNzZXJ0IHRva2VuX3BheS5hc3NldF9jbG9zZV90byA9PSBHbG9iYWwuemVyb19hZGRyZXNzCiAgICBkdXAKICAgIGd0eG5zIEFzc2V0Q2xvc2VUbwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBjcm93ZGZ1bmQucHk6MzMxCiAgICAvLyBhc3NlcnQgdG9rZW5fcGF5LnJla2V5X3RvID09IEdsb2JhbC56ZXJvX2FkZHJlc3MKICAgIGd0eG5zIFJla2V5VG8KICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgPT0KICAgIGFzc2VydAogICAgLy8gY3Jvd2RmdW5kLnB5OjI2Ni0yNzIKICAgIC8vICMg4pSA4pSAIHNldHVwIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgLy8gIyBBUkMtNCBncm91cDogWzBdIEFzc2V0VHJhbnNmZXIodG9rZW5zIGZyb20gY3JlYXRvciB0byBhcHApLCBbMV0gQXBwQ2FsbCgic2V0dXAiKS4KICAgIC8vICMgVGhlIHRva2VuIHRyYW5zZmVyIGlzIHBhc3NlZCBhcyB0aGUgbWV0aG9kJ3MgdHJhbnNhY3Rpb24gYXJndW1lbnQsIHNvIFB1eWEKICAgIC8vICMgcGxhY2VzIGl0IGltbWVkaWF0ZWx5IGJlZm9yZSB0aGlzIGFwcCBjYWxsIChHcm91cEluZGV4IC0gMSkgYW5kIHRoZSB0cmFuc2ZlcgogICAgLy8gIyBleGVjdXRlcyBmaXJzdC4gVGhlIGFwcCBNVVNUIGFscmVhZHkgYmUgb3B0ZWQgaW50byB0aGUgQVNBIGJ5IHRoZW4g4oCUIGNhbGwKICAgIC8vICMgYXBwX29wdF9pbl9hc2EgaW4gYSBwcmlvciB0cmFuc2FjdGlvbiAoc2VlIHRoYXQgbWV0aG9kIGZvciB0aGUgZnVsbCByYXRpb25hbGUpLgogICAgLy8gQGFiaW1ldGhvZAogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIGNyb3dkZnVuZC5Dcm93ZGZ1bmQuY29udHJpYnV0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNvbnRyaWJ1dGU6CiAgICAvLyBjcm93ZGZ1bmQucHk6MzMzLTMzNwogICAgLy8gIyDilIDilIAgY29udHJpYnV0ZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIC8vICMgcmFpc2VkIG1vdmVzIFVQIGJ5IHRoZSBjb250cmlidXRpb24gYW5kIGlzIG5ldmVyIGRlY3JlbWVudGVkLiBQZXItaW52ZXN0b3IKICAgIC8vICMgYGNvbnRyaWJgIGxvY2FsIHN0YXRlIHJlY29yZHMgdGhlIGluZGl2aWR1YWwgc3Rha2UgKHNldHRsZWQgdG8gemVybyBvbgogICAgLy8gIyBmaW5hbGl6ZS9yZWZ1bmQpLiBEb25hdGlvbiBjYW1wYWlnbnMgKHRwYj09MCk6IG5vIGFzYV9pZCwgbm8gZGlzdHJpYnV0aW9uLgogICAgLy8gQGFiaW1ldGhvZAogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzEgLy8gcGF5CiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgcGF5CiAgICAvLyBjcm93ZGZ1bmQucHk6MzM5CiAgICAvLyBpbnZlc3RvciA9IFR4bi5zZW5kZXIKICAgIHR4biBTZW5kZXIKICAgIC8vIGNyb3dkZnVuZC5weTozNDAKICAgIC8vIGFwcF9hZGRyID0gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcwogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIGNyb3dkZnVuZC5weTozNDEKICAgIC8vIGFzc2VydCBzZWxmLl9iZWZvcmVfZGVhZGxpbmUoKQogICAgY2FsbHN1YiBfYmVmb3JlX2RlYWRsaW5lCiAgICBhc3NlcnQKICAgIC8vIGNyb3dkZnVuZC5weToyMDIKICAgIC8vIHJldHVybiBzZWxmLmNhbmNlbGxlZC52YWx1ZSA9PSAxCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAiY2FuY2VsbGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNhbmNlbGxlZCBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgLy8gY3Jvd2RmdW5kLnB5OjM0MgogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLl9pc19jYW5jZWxsZWQoKQogICAgIQogICAgYXNzZXJ0CiAgICAvLyBjcm93ZGZ1bmQucHk6MzQzCiAgICAvLyBhc3NlcnQgc2VsZi5yYWlzZWQudmFsdWUgPCBzZWxmLmdvYWwudmFsdWUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJyYWlzZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucmFpc2VkIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gImdvYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZ29hbCBleGlzdHMKICAgIDwKICAgIGFzc2VydAogICAgLy8gY3Jvd2RmdW5kLnB5OjM0NC0zNDUKICAgIC8vICMgVG9rZW4gY2FtcGFpZ25zIHJlcXVpcmUgc2V0dXAgKGFzYV9pZCAhPSAwKTsgZG9uYXRpb24gY2FtcGFpZ25zIHNraXAgaXQuCiAgICAvLyBpZiBzZWxmLnRwYi52YWx1ZSAhPSAwOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gInRwYiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50cGIgZXhpc3RzCiAgICBieiBjb250cmlidXRlX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gY3Jvd2RmdW5kLnB5OjM0NgogICAgLy8gYXNzZXJ0IHNlbGYuYXNhX2lkLnZhbHVlICE9IDAKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJhc2FfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNhX2lkIGV4aXN0cwogICAgYXNzZXJ0Cgpjb250cmlidXRlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIGNyb3dkZnVuZC5weTozNDcKICAgIC8vIGFzc2VydCBHbG9iYWwuZ3JvdXBfc2l6ZSA9PSAyCiAgICBnbG9iYWwgR3JvdXBTaXplCiAgICBwdXNoaW50IDIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGNyb3dkZnVuZC5weTozNDgKICAgIC8vIGFzc2VydCBwYXkuZ3JvdXBfaW5kZXggPT0gVHhuLmdyb3VwX2luZGV4IC0gMQogICAgdW5jb3ZlciAyCiAgICBkdXAKICAgIGd0eG5zIEdyb3VwSW5kZXgKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgPT0KICAgIGFzc2VydAogICAgLy8gY3Jvd2RmdW5kLnB5OjM0OQogICAgLy8gYXNzZXJ0IHBheS5zZW5kZXIgPT0gaW52ZXN0b3IKICAgIGR1cAogICAgZ3R4bnMgU2VuZGVyCiAgICB1bmNvdmVyIDMKICAgIGR1cAogICAgY292ZXIgMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gY3Jvd2RmdW5kLnB5OjM1MAogICAgLy8gYXNzZXJ0IHBheS5yZWNlaXZlciA9PSBhcHBfYWRkcgogICAgZHVwCiAgICBndHhucyBSZWNlaXZlcgogICAgdW5jb3ZlciAzCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBjcm93ZGZ1bmQucHk6MzUxCiAgICAvLyBhc3NlcnQgcGF5LmFtb3VudCA+IDAKICAgIGR1cAogICAgZ3R4bnMgQW1vdW50CiAgICBkdXAKICAgIGFzc2VydAogICAgLy8gY3Jvd2RmdW5kLnB5OjM1MgogICAgLy8gYXNzZXJ0IHBheS5hbW91bnQgJSBVSW50NjQoMV8wMDBfMDAwKSA9PSAwCiAgICBkdXAKICAgIGludGMgNCAvLyAxMDAwMDAwCiAgICAlCiAgICAhCiAgICBhc3NlcnQKICAgIC8vIGNyb3dkZnVuZC5weTozNTMKICAgIC8vIGFzc2VydCBwYXkuY2xvc2VfcmVtYWluZGVyX3RvID09IEdsb2JhbC56ZXJvX2FkZHJlc3MKICAgIGRpZyAxCiAgICBndHhucyBDbG9zZVJlbWFpbmRlclRvCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGNyb3dkZnVuZC5weTozNTQKICAgIC8vIGFzc2VydCBwYXkucmVrZXlfdG8gPT0gR2xvYmFsLnplcm9fYWRkcmVzcwogICAgc3dhcAogICAgZ3R4bnMgUmVrZXlUbwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBjcm93ZGZ1bmQucHk6MzU1CiAgICAvLyBhc3NlcnQgc2VsZi5yYWlzZWQudmFsdWUgKyBwYXkuYW1vdW50IDw9IHNlbGYuZ29hbC52YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gInJhaXNlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yYWlzZWQgZXhpc3RzCiAgICBkaWcgMQogICAgKwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gImdvYWwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZ29hbCBleGlzdHMKICAgIGRpZyAxCiAgICA+PQogICAgYXNzZXJ0CiAgICAvLyBjcm93ZGZ1bmQucHk6MzU2CiAgICAvLyBzZWxmLmNvbnRyaWJbaW52ZXN0b3JdID0gc2VsZi5jb250cmliLmdldChpbnZlc3RvciwgZGVmYXVsdD1VSW50NjQoMCkpICsgcGF5LmFtb3VudAogICAgZGlnIDIKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJjb250cmliIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgaW50Y18wIC8vIDAKICAgIGNvdmVyIDIKICAgIHNlbGVjdAogICAgdW5jb3ZlciAyCiAgICArCiAgICB1bmNvdmVyIDIKICAgIGJ5dGVjIDQgLy8gImNvbnRyaWIiCiAgICB1bmNvdmVyIDIKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIGNyb3dkZnVuZC5weTozNTgKICAgIC8vIHNlbGYucmFpc2VkLnZhbHVlID0gbmV3X3JhaXNlZAogICAgYnl0ZWMgNyAvLyAicmFpc2VkIgogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBjcm93ZGZ1bmQucHk6MzU5CiAgICAvLyBpZiBuZXdfcmFpc2VkID49IHNlbGYuZ29hbC52YWx1ZSBhbmQgc2VsZi5mdW5kZWRfcm91bmQudmFsdWUgPT0gMDoKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJnb2FsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmdvYWwgZXhpc3RzCiAgICA+PQogICAgYnogY29udHJpYnV0ZV9hZnRlcl9pZl9lbHNlQDYKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJmdW5kZWRfcm91bmQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZnVuZGVkX3JvdW5kIGV4aXN0cwogICAgYm56IGNvbnRyaWJ1dGVfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBjcm93ZGZ1bmQucHk6MzYwCiAgICAvLyBzZWxmLmZ1bmRlZF9yb3VuZC52YWx1ZSA9IEdsb2JhbC5yb3VuZAogICAgYnl0ZWNfMiAvLyAiZnVuZGVkX3JvdW5kIgogICAgZ2xvYmFsIFJvdW5kCiAgICBhcHBfZ2xvYmFsX3B1dAoKY29udHJpYnV0ZV9hZnRlcl9pZl9lbHNlQDY6CiAgICAvLyBjcm93ZGZ1bmQucHk6MzMzLTMzNwogICAgLy8gIyDilIDilIAgY29udHJpYnV0ZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIC8vICMgcmFpc2VkIG1vdmVzIFVQIGJ5IHRoZSBjb250cmlidXRpb24gYW5kIGlzIG5ldmVyIGRlY3JlbWVudGVkLiBQZXItaW52ZXN0b3IKICAgIC8vICMgYGNvbnRyaWJgIGxvY2FsIHN0YXRlIHJlY29yZHMgdGhlIGluZGl2aWR1YWwgc3Rha2UgKHNldHRsZWQgdG8gemVybyBvbgogICAgLy8gIyBmaW5hbGl6ZS9yZWZ1bmQpLiBEb25hdGlvbiBjYW1wYWlnbnMgKHRwYj09MCk6IG5vIGFzYV9pZCwgbm8gZGlzdHJpYnV0aW9uLgogICAgLy8gQGFiaW1ldGhvZAogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIGNyb3dkZnVuZC5Dcm93ZGZ1bmQuZmluYWxpemVbcm91dGluZ10oKSAtPiB2b2lkOgpmaW5hbGl6ZToKICAgIHB1c2hieXRlcyAiIgogICAgLy8gY3Jvd2RmdW5kLnB5OjM2NwogICAgLy8gaW52ZXN0b3IgPSBUeG4uc2VuZGVyCiAgICB0eG4gU2VuZGVyCiAgICBkdXAKICAgIC8vIGNyb3dkZnVuZC5weTozNjgKICAgIC8vIGFzc2VydCBHbG9iYWwuZ3JvdXBfc2l6ZSA9PSAxCiAgICBnbG9iYWwgR3JvdXBTaXplCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gY3Jvd2RmdW5kLnB5OjIyNgogICAgLy8gcmV0dXJuIHNlbGYuZnVuZGVkX3JvdW5kLnZhbHVlID4gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZnVuZGVkX3JvdW5kIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZ1bmRlZF9yb3VuZCBleGlzdHMKICAgIC8vIGNyb3dkZnVuZC5weTozNjkKICAgIC8vIGFzc2VydCBzZWxmLl9zdWNjZWVkZWQoKQogICAgYXNzZXJ0CiAgICAvLyBjcm93ZGZ1bmQucHk6MjAyCiAgICAvLyByZXR1cm4gc2VsZi5jYW5jZWxsZWQudmFsdWUgPT0gMQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gImNhbmNlbGxlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jYW5jZWxsZWQgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIC8vIGNyb3dkZnVuZC5weTozNzAKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5faXNfY2FuY2VsbGVkKCkKICAgICEKICAgIGFzc2VydAogICAgLy8gY3Jvd2RmdW5kLnB5OjM3MQogICAgLy8gY29udHJpYl9hbXQgPSBzZWxmLmNvbnRyaWIuZ2V0KGludmVzdG9yLCBkZWZhdWx0PVVJbnQ2NCgwKSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJjb250cmliIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgaW50Y18wIC8vIDAKICAgIGNvdmVyIDIKICAgIHNlbGVjdAogICAgZHVwCiAgICBjb3ZlciAyCiAgICAvLyBjcm93ZGZ1bmQucHk6MzcyCiAgICAvLyBhc3NlcnQgY29udHJpYl9hbXQgPiAwCiAgICBhc3NlcnQKICAgIC8vIGNyb3dkZnVuZC5weTozNzMtMzgwCiAgICAvLyAjIFRva2VuIGNhbXBhaWduczogZmxvb3IgdG8gV0hPTEUgdG9rZW5zIGZpcnN0LCB0aGVuIHNjYWxlIHRvIGJhc2UgdW5pdHMuCiAgICAvLyAjICAgd2hvbGVfdG9rZW5zID0gZmxvb3IoIGNvbnRyaWIgKiB0cGIgLyAoYXBiICogMWU2KSApCiAgICAvLyAjICAgdG9rZW5zX2R1ZSAgID0gd2hvbGVfdG9rZW5zICogZGVjX2ZhY3RvcgogICAgLy8gIyBEb25hdGlvbiBjYW1wYWlnbnMgKHRwYj09MCk6IHNraXAgdG9rZW4gZGlzdHJpYnV0aW9uLgogICAgLy8gIyBTa2lwIHRva2VuIGRpc3RyaWJ1dGlvbiBpZiB0aGUgQVNBIGhvbGRpbmcgaGFzIGFscmVhZHkgYmVlbiBzd2VwdAogICAgLy8gIyAoYXNhX2lkIHJlc2V0IHRvIDAgcG9zdC1ncmFjZSkg4oCUIHRva2VucyBhcmUgZm9yZmVpdGVkIHBlciB0aGUgZ3JhY2UKICAgIC8vICMgcnVsZXMsIGJ1dCBjb250cmliIG11c3Qgc3RpbGwgemVybyBzbyB0aGUgaW52ZXN0b3IgY2FuIGNsb3NlIG91dC4KICAgIC8vIGlmIHNlbGYudHBiLnZhbHVlICE9IDAgYW5kIHNlbGYuYXNhX2lkLnZhbHVlICE9IDA6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAidHBiIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRwYiBleGlzdHMKICAgIGJ6IGZpbmFsaXplX2FmdGVyX2lmX2Vsc2VANwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gImFzYV9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc2FfaWQgZXhpc3RzCiAgICBieiBmaW5hbGl6ZV9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIGNyb3dkZnVuZC5weTozODEKICAgIC8vIHdob2xlX3Rva2VucyA9IChjb250cmliX2FtdCAqIHNlbGYudHBiLnZhbHVlKSAvLyAoCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAidHBiIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRwYiBleGlzdHMKICAgIGRpZyAyCiAgICAqCiAgICAvLyBjcm93ZGZ1bmQucHk6MzgyCiAgICAvLyBzZWxmLmFwYi52YWx1ZSAqIFVJbnQ2NCgxXzAwMF8wMDApCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTIgLy8gImFwYiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hcGIgZXhpc3RzCiAgICBpbnRjIDQgLy8gMTAwMDAwMAogICAgKgogICAgLy8gY3Jvd2RmdW5kLnB5OjM4MS0zODMKICAgIC8vIHdob2xlX3Rva2VucyA9IChjb250cmliX2FtdCAqIHNlbGYudHBiLnZhbHVlKSAvLyAoCiAgICAvLyAgICAgc2VsZi5hcGIudmFsdWUgKiBVSW50NjQoMV8wMDBfMDAwKQogICAgLy8gKQogICAgLwogICAgLy8gY3Jvd2RmdW5kLnB5OjM4NAogICAgLy8gdG9rZW5zX2R1ZSA9IHdob2xlX3Rva2VucyAqIHNlbGYuZGVjX2ZhY3Rvci52YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEzIC8vICJkZWNfZmFjdG9yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmRlY19mYWN0b3IgZXhpc3RzCiAgICAqCiAgICBkdXAKICAgIGJ1cnkgNAogICAgLy8gY3Jvd2RmdW5kLnB5OjM4NQogICAgLy8gaWYgdG9rZW5zX2R1ZSA+IDA6CiAgICBieiBmaW5hbGl6ZV9hZnRlcl9pZl9lbHNlQDcKICAgIC8vIGNyb3dkZnVuZC5weTozODYtMzkxCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLmFzYV9pZC52YWx1ZSwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1pbnZlc3RvciwKICAgIC8vICAgICBhc3NldF9hbW91bnQ9dG9rZW5zX2R1ZSwKICAgIC8vICAgICBmZWU9MCwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIGNyb3dkZnVuZC5weTozODcKICAgIC8vIHhmZXJfYXNzZXQ9c2VsZi5hc2FfaWQudmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAiYXNhX2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzYV9pZCBleGlzdHMKICAgIGRpZyAzCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBkaWcgMQogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gY3Jvd2RmdW5kLnB5OjM4NgogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgaW50Y18yIC8vIGF4ZmVyCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICAvLyBjcm93ZGZ1bmQucHk6MzkwCiAgICAvLyBmZWU9MCwKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gY3Jvd2RmdW5kLnB5OjM4Ni0zOTEKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuYXNhX2lkLnZhbHVlLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPWludmVzdG9yLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD10b2tlbnNfZHVlLAogICAgLy8gICAgIGZlZT0wLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKCmZpbmFsaXplX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIGNyb3dkZnVuZC5weTozOTIKICAgIC8vIHNlbGYuY29udHJpYltpbnZlc3Rvcl0gPSBVSW50NjQoMCkKICAgIGJ5dGVjIDQgLy8gImNvbnRyaWIiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gY3Jvd2RmdW5kLnB5OjM2Mi0zNjUKICAgIC8vICMg4pSA4pSAIGZpbmFsaXplIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgLy8gIyBTdWNjZXNzIG9ubHkuIEludmVzdG9yIGNsYWltcyB0b2tlbnM7IHRoZWlyIGxvY2FsIGNvbnRyaWIgaXMgemVyb2VkLgogICAgLy8gIyBEb25hdGlvbiBjYW1wYWlnbnMgKHRwYj09MCk6IG5vIHRva2VucyBkaXN0cmlidXRlZCwgY29udHJpYiB6ZXJvZWQgYXQgb25jZS4KICAgIC8vIEBhYmltZXRob2QKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBjcm93ZGZ1bmQuQ3Jvd2RmdW5kLmNyZWF0b3JfY2xhaW1bcm91dGluZ10oKSAtPiB2b2lkOgpjcmVhdG9yX2NsYWltOgogICAgLy8gY3Jvd2RmdW5kLnB5OjM5OQogICAgLy8gYXNzZXJ0IEdsb2JhbC5ncm91cF9zaXplID09IDEKICAgIGdsb2JhbCBHcm91cFNpemUKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBjcm93ZGZ1bmQucHk6NDAwCiAgICAvLyBhc3NlcnQgc2VsZi5faXNfY3JlYXRvcigpCiAgICBjYWxsc3ViIF9pc19jcmVhdG9yCiAgICBhc3NlcnQKICAgIC8vIGNyb3dkZnVuZC5weToyMjYKICAgIC8vIHJldHVybiBzZWxmLmZ1bmRlZF9yb3VuZC52YWx1ZSA+IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImZ1bmRlZF9yb3VuZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5mdW5kZWRfcm91bmQgZXhpc3RzCiAgICAvLyBjcm93ZGZ1bmQucHk6NDAxCiAgICAvLyBhc3NlcnQgc2VsZi5fc3VjY2VlZGVkKCkKICAgIGFzc2VydAogICAgLy8gY3Jvd2RmdW5kLnB5OjIwMgogICAgLy8gcmV0dXJuIHNlbGYuY2FuY2VsbGVkLnZhbHVlID09IDEKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJjYW5jZWxsZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2FuY2VsbGVkIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgID09CiAgICAvLyBjcm93ZGZ1bmQucHk6NDAyCiAgICAvLyBhc3NlcnQgbm90IHNlbGYuX2lzX2NhbmNlbGxlZCgpCiAgICAhCiAgICBhc3NlcnQKICAgIC8vIGNyb3dkZnVuZC5weTo0MDMKICAgIC8vIGFzc2VydCBzZWxmLmNyZWF0b3JfY2xhaW1lZC52YWx1ZSA9PSAwCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTQgLy8gImNyZWF0b3JfY2xhaW1lZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jcmVhdG9yX2NsYWltZWQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQKICAgIC8vIGNyb3dkZnVuZC5weTo0MDQKICAgIC8vIGFkbWluX2ZlZSA9IChzZWxmLmdvYWwudmFsdWUgKiBTVUNDRVNTX0ZFRV9QQ1QpIC8vIFVJbnQ2NCgxMDApCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAiZ29hbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5nb2FsIGV4aXN0cwogICAgZHVwCiAgICBpbnRjXzIgLy8gNAogICAgKgogICAgcHVzaGludCAxMDAKICAgIC8KICAgIC8vIGNyb3dkZnVuZC5weTo0MDUKICAgIC8vIGNyZWF0b3JfcGF5b3V0ID0gc2VsZi5nb2FsLnZhbHVlIC0gYWRtaW5fZmVlCiAgICAtCiAgICAvLyBjcm93ZGZ1bmQucHk6NDA2CiAgICAvLyBhc3NlcnQgY3JlYXRvcl9wYXlvdXQgPiAwCiAgICBkdXAKICAgIGFzc2VydAogICAgLy8gY3Jvd2RmdW5kLnB5OjQwNy00MTEKICAgIC8vIGl0eG4uUGF5bWVudCgKICAgIC8vICAgICByZWNlaXZlcj1zZWxmLmNyZWF0b3IudmFsdWUsCiAgICAvLyAgICAgYW1vdW50PWNyZWF0b3JfcGF5b3V0LAogICAgLy8gICAgIGZlZT0wLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gY3Jvd2RmdW5kLnB5OjQwOAogICAgLy8gcmVjZWl2ZXI9c2VsZi5jcmVhdG9yLnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImNyZWF0b3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3JlYXRvciBleGlzdHMKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICAvLyBjcm93ZGZ1bmQucHk6NDA3CiAgICAvLyBpdHhuLlBheW1lbnQoCiAgICBpbnRjXzEgLy8gcGF5CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICAvLyBjcm93ZGZ1bmQucHk6NDEwCiAgICAvLyBmZWU9MCwKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gY3Jvd2RmdW5kLnB5OjQwNy00MTEKICAgIC8vIGl0eG4uUGF5bWVudCgKICAgIC8vICAgICByZWNlaXZlcj1zZWxmLmNyZWF0b3IudmFsdWUsCiAgICAvLyAgICAgYW1vdW50PWNyZWF0b3JfcGF5b3V0LAogICAgLy8gICAgIGZlZT0wLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIGNyb3dkZnVuZC5weTo0MTIKICAgIC8vIHNlbGYuY3JlYXRvcl9jbGFpbWVkLnZhbHVlID0gVUludDY0KDEpCiAgICBieXRlYyAxNCAvLyAiY3JlYXRvcl9jbGFpbWVkIgogICAgaW50Y18xIC8vIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBjcm93ZGZ1bmQucHk6Mzk0LTM5NwogICAgLy8gIyDilIDilIAgY3JlYXRvcl9jbGFpbSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIC8vICMgU3VjY2VzcyBvbmx5LiBDcmVhdG9yIHdpdGhkcmF3cyAoZ29hbCAtIDQlIGZlZSkgQUxHTy4gQ2FsbGFibGUgYXMgc29vbiBhcwogICAgLy8gIyB0aGUgZ29hbCBpcyBtZXQsIGluZGVwZW5kZW50IG9mIGludmVzdG9yIGZpbmFsaXphdGlvbi4KICAgIC8vIEBhYmltZXRob2QKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBjcm93ZGZ1bmQuQ3Jvd2RmdW5kLmFkbWluX2ZlZV9jbGFpbVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmFkbWluX2ZlZV9jbGFpbToKICAgIC8vIGNyb3dkZnVuZC5weTo0MjIKICAgIC8vIGFzc2VydCBHbG9iYWwuZ3JvdXBfc2l6ZSA9PSAxCiAgICBnbG9iYWwgR3JvdXBTaXplCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gY3Jvd2RmdW5kLnB5OjQyMwogICAgLy8gYXNzZXJ0IHNlbGYuX2lzX2FkbWluKCkKICAgIGNhbGxzdWIgX2lzX2FkbWluCiAgICBhc3NlcnQKICAgIC8vIGNyb3dkZnVuZC5weToyMjYKICAgIC8vIHJldHVybiBzZWxmLmZ1bmRlZF9yb3VuZC52YWx1ZSA+IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImZ1bmRlZF9yb3VuZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5mdW5kZWRfcm91bmQgZXhpc3RzCiAgICAvLyBjcm93ZGZ1bmQucHk6NDI0CiAgICAvLyBhc3NlcnQgc2VsZi5fc3VjY2VlZGVkKCkKICAgIGFzc2VydAogICAgLy8gY3Jvd2RmdW5kLnB5OjIwMgogICAgLy8gcmV0dXJuIHNlbGYuY2FuY2VsbGVkLnZhbHVlID09IDEKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJjYW5jZWxsZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2FuY2VsbGVkIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgID09CiAgICAvLyBjcm93ZGZ1bmQucHk6NDI1CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuX2lzX2NhbmNlbGxlZCgpCiAgICAhCiAgICBhc3NlcnQKICAgIC8vIGNyb3dkZnVuZC5weTo0MjYKICAgIC8vIGFzc2VydCBzZWxmLmFkbWluX2ZlZV9jbGFpbWVkLnZhbHVlID09IDAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA4IC8vICJhZG1pbl9mZWVfY2xhaW1lZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hZG1pbl9mZWVfY2xhaW1lZCBleGlzdHMKICAgICEKICAgIGFzc2VydAogICAgLy8gY3Jvd2RmdW5kLnB5OjQyNwogICAgLy8gYWRtaW5fZmVlID0gKHNlbGYuZ29hbC52YWx1ZSAqIFNVQ0NFU1NfRkVFX1BDVCkgLy8gVUludDY0KDEwMCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJnb2FsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmdvYWwgZXhpc3RzCiAgICBpbnRjXzIgLy8gNAogICAgKgogICAgcHVzaGludCAxMDAKICAgIC8KICAgIC8vIGNyb3dkZnVuZC5weTo0MjgKICAgIC8vIGFzc2VydCBhZG1pbl9mZWUgPiAwCiAgICBkdXAKICAgIGFzc2VydAogICAgLy8gY3Jvd2RmdW5kLnB5OjQyOS00MzMKICAgIC8vIGl0eG4uUGF5bWVudCgKICAgIC8vICAgICByZWNlaXZlcj1zZWxmLmFkbWluLnZhbHVlLAogICAgLy8gICAgIGFtb3VudD1hZG1pbl9mZWUsCiAgICAvLyAgICAgZmVlPTAsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBjcm93ZGZ1bmQucHk6NDMwCiAgICAvLyByZWNlaXZlcj1zZWxmLmFkbWluLnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gImFkbWluIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFkbWluIGV4aXN0cwogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIC8vIGNyb3dkZnVuZC5weTo0MjkKICAgIC8vIGl0eG4uUGF5bWVudCgKICAgIGludGNfMSAvLyBwYXkKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIC8vIGNyb3dkZnVuZC5weTo0MzIKICAgIC8vIGZlZT0wLAogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBjcm93ZGZ1bmQucHk6NDI5LTQzMwogICAgLy8gaXR4bi5QYXltZW50KAogICAgLy8gICAgIHJlY2VpdmVyPXNlbGYuYWRtaW4udmFsdWUsCiAgICAvLyAgICAgYW1vdW50PWFkbWluX2ZlZSwKICAgIC8vICAgICBmZWU9MCwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBjcm93ZGZ1bmQucHk6NDM0CiAgICAvLyBzZWxmLmFkbWluX2ZlZV9jbGFpbWVkLnZhbHVlID0gVUludDY0KDEpCiAgICBieXRlYyA4IC8vICJhZG1pbl9mZWVfY2xhaW1lZCIKICAgIGludGNfMSAvLyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gY3Jvd2RmdW5kLnB5OjQxNC00MjAKICAgIC8vICMg4pSA4pSAIGFkbWluX2ZlZV9jbGFpbSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIC8vICMgU3VjY2VzcyBvbmx5LiBBZG1pbiBjb2xsZWN0cyB0aGUgNCUgc3VjY2VzcyBmZWUgSU1NRURJQVRFTFkgb25jZSB0aGUgZ29hbCBpcwogICAgLy8gIyBtZXQg4oCUIG5vIDYtbW9udGggZ3JhY2Ugd2FpdC4gRnVsbHkgaW5kZXBlbmRlbnQgb2YgY3JlYXRvcl9jbGFpbTogdGhlIGFkbWluJ3MKICAgIC8vICMgZmVlIGFuZCB0aGUgY3JlYXRvcidzIDk2JSBwYXlvdXQgYXJlIHNldHRsZWQgb24gc2VwYXJhdGUgY2FsbHMgaW4gYW55IG9yZGVyLgogICAgLy8gIyBDYWxsLW9uY2UgKGFkbWluX2ZlZV9jbGFpbWVkIGZsYWcpLiBUaGUgZmluYWwgY2xvc2UgKGFkbWluX2NsYWltKSBjaGVja3MgdGhpcwogICAgLy8gIyBmbGFnIHNvIHRoZSBmZWUgaXMgbmV2ZXIgcGFpZCB0d2ljZS4KICAgIC8vIEBhYmltZXRob2QKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBjcm93ZGZ1bmQuQ3Jvd2RmdW5kLnJlZnVuZFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnJlZnVuZDoKICAgIC8vIGNyb3dkZnVuZC5weTo0NDIKICAgIC8vIGludmVzdG9yID0gVHhuLnNlbmRlcgogICAgdHhuIFNlbmRlcgogICAgLy8gY3Jvd2RmdW5kLnB5OjQ0MwogICAgLy8gYXNzZXJ0IEdsb2JhbC5ncm91cF9zaXplID09IDEKICAgIGdsb2JhbCBHcm91cFNpemUKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBjcm93ZGZ1bmQucHk6NDQ0CiAgICAvLyBhc3NlcnQgc2VsZi5fZmFpbGVkKCkKICAgIGNhbGxzdWIgX2ZhaWxlZAogICAgYXNzZXJ0CiAgICAvLyBjcm93ZGZ1bmQucHk6NDQ1CiAgICAvLyBjb250cmliX2FtdCA9IHNlbGYuY29udHJpYi5nZXQoaW52ZXN0b3IsIGRlZmF1bHQ9VUludDY0KDApKQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAiY29udHJpYiIKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGludGNfMCAvLyAwCiAgICBjb3ZlciAyCiAgICBzZWxlY3QKICAgIC8vIGNyb3dkZnVuZC5weTo0NDYKICAgIC8vIGFzc2VydCBjb250cmliX2FtdCA+IDAKICAgIGR1cAogICAgYXNzZXJ0CiAgICAvLyBjcm93ZGZ1bmQucHk6NDQ3LTQ1MQogICAgLy8gaXR4bi5QYXltZW50KAogICAgLy8gICAgIHJlY2VpdmVyPWludmVzdG9yLAogICAgLy8gICAgIGFtb3VudD1jb250cmliX2FtdCwKICAgIC8vICAgICBmZWU9MCwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICBkdXAKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIC8vIGNyb3dkZnVuZC5weTo0NDcKICAgIC8vIGl0eG4uUGF5bWVudCgKICAgIGludGNfMSAvLyBwYXkKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIC8vIGNyb3dkZnVuZC5weTo0NTAKICAgIC8vIGZlZT0wLAogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBjcm93ZGZ1bmQucHk6NDQ3LTQ1MQogICAgLy8gaXR4bi5QYXltZW50KAogICAgLy8gICAgIHJlY2VpdmVyPWludmVzdG9yLAogICAgLy8gICAgIGFtb3VudD1jb250cmliX2FtdCwKICAgIC8vICAgICBmZWU9MCwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBjcm93ZGZ1bmQucHk6NDUyCiAgICAvLyBzZWxmLmNvbnRyaWJbaW52ZXN0b3JdID0gVUludDY0KDApCiAgICBieXRlYyA0IC8vICJjb250cmliIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIGNyb3dkZnVuZC5weTo0MzYtNDQwCiAgICAvLyAjIOKUgOKUgCByZWZ1bmQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICAvLyAjIEZhaWx1cmUgb25seS4gSW52ZXN0b3IgcmVjbGFpbXMgdGhlaXIgQUxHTy4gS2V5ZWQgb24gYGZhaWxlZGAsIHdoaWNoCiAgICAvLyAjIHJlcXVpcmVzIGZ1bmRlZF9yb3VuZCA9PSAwIOKAlCBjYW4gTkVWRVIgb3BlbiBvbmNlIHRoZSBnb2FsIGlzIGhpdC4KICAgIC8vICMgQXZhaWxhYmxlIGltbWVkaWF0ZWx5IG9uIGZhaWx1cmUvY2FuY2VsOyBubyBncmFjZSB3YWl0IGZvciBpbnZlc3RvcnMuCiAgICAvLyBAYWJpbWV0aG9kCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gY3Jvd2RmdW5kLkNyb3dkZnVuZC5jcmVhdG9yX3JlY2xhaW1fYXNhW3JvdXRpbmddKCkgLT4gdm9pZDoKY3JlYXRvcl9yZWNsYWltX2FzYToKICAgIC8vIGNyb3dkZnVuZC5weTo0NjIKICAgIC8vIGFzc2VydCBHbG9iYWwuZ3JvdXBfc2l6ZSA9PSAxCiAgICBnbG9iYWwgR3JvdXBTaXplCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gY3Jvd2RmdW5kLnB5OjQ2MwogICAgLy8gYXNzZXJ0IHNlbGYuX2lzX2NyZWF0b3IoKQogICAgY2FsbHN1YiBfaXNfY3JlYXRvcgogICAgYXNzZXJ0CiAgICAvLyBjcm93ZGZ1bmQucHk6NDY0CiAgICAvLyBhc3NlcnQgc2VsZi5fZmFpbGVkKCkKICAgIGNhbGxzdWIgX2ZhaWxlZAogICAgYXNzZXJ0CiAgICAvLyBjcm93ZGZ1bmQucHk6NDY1CiAgICAvLyBhc3NlcnQgc2VsZi5hc2FfaWQudmFsdWUgIT0gMAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gImFzYV9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc2FfaWQgZXhpc3RzCiAgICBkdXAKICAgIGFzc2VydAogICAgLy8gY3Jvd2RmdW5kLnB5OjQ2Ni00NzIKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PXNlbGYuYXNhX2lkLnZhbHVlLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPXNlbGYuY3JlYXRvci52YWx1ZSwKICAgIC8vICAgICBhc3NldF9hbW91bnQ9MCwKICAgIC8vICAgICBhc3NldF9jbG9zZV90bz1zZWxmLmNyZWF0b3IudmFsdWUsICAjIGNsb3NlcyB0aGUgYXBwJ3MgZnVsbCBBU0EgYmFsYW5jZQogICAgLy8gICAgIGZlZT0wLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gY3Jvd2RmdW5kLnB5OjQ2OAogICAgLy8gYXNzZXRfcmVjZWl2ZXI9c2VsZi5jcmVhdG9yLnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImNyZWF0b3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3JlYXRvciBleGlzdHMKICAgIGR1cAogICAgaXR4bl9maWVsZCBBc3NldENsb3NlVG8KICAgIC8vIGNyb3dkZnVuZC5weTo0NjkKICAgIC8vIGFzc2V0X2Ftb3VudD0wLAogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIGNyb3dkZnVuZC5weTo0NjYKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIGludGNfMiAvLyBheGZlcgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgLy8gY3Jvd2RmdW5kLnB5OjQ3MQogICAgLy8gZmVlPTAsCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIGNyb3dkZnVuZC5weTo0NjYtNDcyCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1zZWxmLmFzYV9pZC52YWx1ZSwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1zZWxmLmNyZWF0b3IudmFsdWUsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PTAsCiAgICAvLyAgICAgYXNzZXRfY2xvc2VfdG89c2VsZi5jcmVhdG9yLnZhbHVlLCAgIyBjbG9zZXMgdGhlIGFwcCdzIGZ1bGwgQVNBIGJhbGFuY2UKICAgIC8vICAgICBmZWU9MCwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBjcm93ZGZ1bmQucHk6NDczCiAgICAvLyBzZWxmLmFzYV9pZC52YWx1ZSA9IFVJbnQ2NCgwKSAgIyBhcHAgbm8gbG9uZ2VyIGhvbGRzIHRoZSBBU0EKICAgIGJ5dGVjXzAgLy8gImFzYV9pZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gY3Jvd2RmdW5kLnB5OjQ1NC00NjAKICAgIC8vICMg4pSA4pSAIGNyZWF0b3JfcmVjbGFpbV9hc2Eg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICAvLyAjIEZhaWx1cmUgb25seS4gVGhlIGNyZWF0b3IncyBmYWlsdXJlLXNpZGUgY291bnRlcnBhcnQgdG8gcmVmdW5kOiBjbG9zZXMgdGhlCiAgICAvLyAjIGFwcCdzIGVudGlyZSBkZXBvc2l0ZWQgcHJvamVjdC10b2tlbiBob2xkaW5nIGJhY2sgdG8gdGhlIENSRUFUT1IuCiAgICAvLyAjIEF2YWlsYWJsZSBJTU1FRElBVEVMWSBvbiBmYWlsdXJlL2NhbmNlbCDigJQgbm8gZ3JhY2Ugd2FpdCwgc3ltbWV0cmljIHdpdGggdGhlCiAgICAvLyAjIGludmVzdG9yIHJlZnVuZC4gQ2xvc2luZyB0aGUgQVNBIGFsc28gc2F0aXNmaWVzIGFkbWluX2NsYWltJ3MgYXNhX2lkID09IDAKICAgIC8vICMgcHJlY29uZGl0aW9uLCBzbyBvbiBmYWlsdXJlIHRoZSBhZG1pbiBuZXZlciBuZWVkcyBhZG1pbl9zd2VlcF9hc2EuCiAgICAvLyBAYWJpbWV0aG9kCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gY3Jvd2RmdW5kLkNyb3dkZnVuZC5yZWNvdmVyX3N0cmF5X2FzYVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnJlY292ZXJfc3RyYXlfYXNhOgogICAgLy8gY3Jvd2RmdW5kLnB5OjQ3NS00OTcKICAgIC8vICMg4pSA4pSAIHJlY292ZXJfc3RyYXlfYXNhIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgLy8gIyBSRUNPVkVSWSBIQVRDSCBmb3IgdGhlIGRvdWJsZS1vcHQtaW4gZWRnZSBjYXNlLgogICAgLy8gIwogICAgLy8gIyBCZWNhdXNlIGFwcF9vcHRfaW5fYXNhIGNhbiBydW4gbW9yZSB0aGFuIG9uY2UgYmVmb3JlIHNldHVwIHdyaXRlcyBhc2FfaWQgKGJvdGgKICAgIC8vICMgZ2F0ZSBvbmx5IG9uIGFzYV9pZCA9PSAwKSwgYSBjcmVhdG9yIGNhbiBvcHQgdGhlIGFwcCBpbnRvIGFzc2V0IEEsIHRoZW4gaW50bwogICAgLy8gIyBhc3NldCBCLCB0aGVuIHNldHVwIHdpdGggQi4gVGhlIGFwcCB0aGVuIGhvbGRzIFRXTyBhc3NldCBvcHQtaW5zIGJ1dCBhc2FfaWQKICAgIC8vICMgb25seSB0cmFja3MgQi4gVGhlIG5vcm1hbCBjbG9zZS1vdXQgKGFkbWluX3N3ZWVwX2FzYSAvIGNyZWF0b3JfcmVjbGFpbV9hc2EpCiAgICAvLyAjIG9ubHkgY2xvc2VzIGFzYV9pZCwgbGVhdmluZyB0aGUgc3RyYXkgYXNzZXQgQSBoZWxkIGZvcmV2ZXIg4oCUIHdoaWNoIGJsb2NrcyB0aGUKICAgIC8vICMgQUxHTyBjbG9zZSAoYW4gYWNjb3VudCBob2xkaW5nIGFueSBBU0EgY2Fubm90IGJlIGNsb3NlZCksIHdlZGdpbmcgdGhlIGFwcC4KICAgIC8vICMKICAgIC8vICMgVGhpcyBtZXRob2QgY2xvc2VzIG91dCBPTkUgc3RyYXkgYXNzZXQgKGFueSBhc3NldCB0aGF0IGlzIE5PVCB0aGUgbGl2ZSBhc2FfaWQpCiAgICAvLyAjIGJhY2sgdG8gdGhlIENSRUFUT1IsIGZyZWVpbmcgdGhlIGFwcCB0byBldmVudHVhbGx5IGNsb3NlLiBDb25zdHJhaW50cyB0aGF0CiAgICAvLyAjIGtlZXAgaXQgc2FmZToKICAgIC8vICMgICDigKIgYXNzZXQgIT0gYXNhX2lkIOKAlCBpdCBjYW4gTkVWRVIgdG91Y2ggdGhlIGxpdmUgY2FtcGFpZ24gdG9rZW4gKHRoYXQgaGFzIGl0cwogICAgLy8gIyAgICAgb3duIHByb3BlciBjbG9zZS1vdXQgcGF0aCBhbmQgaXMgb3dlZCB0byBiYWNrZXJzKSwgc28gdGhpcyBjYW5ub3QgYmUgdXNlZAogICAgLy8gIyAgICAgdG8gcnVnIHRoZSBwb29sLgogICAgLy8gIyAgIOKAoiBwcm9jZWVkcyBhbHdheXMgZ28gdG8gdGhlIENSRUFUT1IgKHdobyBvcHRlZCB0aGUgYXBwIGludG8gdGhlIHN0cmF5IGFzc2V0KSwKICAgIC8vICMgICAgIG5ldmVyIHRvIHRoZSBjYWxsZXIg4oCUIHNvIGFuIGFkbWluIGNhbGxlciBjYW5ub3QgcHJvZml0LgogICAgLy8gIyAgIOKAoiBjYWxsYWJsZSBieSBhZG1pbiBPUiBjcmVhdG9yLCBzbyBhIHN0dWNrIGFwcCBjYW4gYmUgY2xlYXJlZCBldmVuIGlmIHRoZQogICAgLy8gIyAgICAgY3JlYXRvciBoYXMgdmFuaXNoZWQuCiAgICAvLyAjIElmIHRoZSBhcHAgaXNuJ3QgYWN0dWFsbHkgb3B0ZWQgaW50byBgYXNzZXRgLCB0aGUgaW5uZXIgY2xvc2Utb3V0IHJldmVydHMgYW5kCiAgICAvLyAjIG5vdGhpbmcgY2hhbmdlcyAoc2FmZSBuby1vcCBvbiBhIGJhZCBhcmd1bWVudCkuCiAgICAvLyBAYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBjcm93ZGZ1bmQucHk6NDk5CiAgICAvLyBhc3NlcnQgR2xvYmFsLmdyb3VwX3NpemUgPT0gMQogICAgZ2xvYmFsIEdyb3VwU2l6ZQogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGNyb3dkZnVuZC5weTo1MDAKICAgIC8vIGFzc2VydCBzZWxmLl9pc19hZG1pbigpIG9yIHNlbGYuX2lzX2NyZWF0b3IoKQogICAgY2FsbHN1YiBfaXNfYWRtaW4KICAgIGJueiByZWNvdmVyX3N0cmF5X2FzYV9ib29sX3RydWVAMwogICAgY2FsbHN1YiBfaXNfY3JlYXRvcgogICAgYnogcmVjb3Zlcl9zdHJheV9hc2FfYm9vbF9mYWxzZUA0CgpyZWNvdmVyX3N0cmF5X2FzYV9ib29sX3RydWVAMzoKICAgIGludGNfMSAvLyAxCgpyZWNvdmVyX3N0cmF5X2FzYV9ib29sX21lcmdlQDU6CiAgICAvLyBjcm93ZGZ1bmQucHk6NTAwCiAgICAvLyBhc3NlcnQgc2VsZi5faXNfYWRtaW4oKSBvciBzZWxmLl9pc19jcmVhdG9yKCkKICAgIGFzc2VydAogICAgLy8gY3Jvd2RmdW5kLnB5OjUwMS01MDIKICAgIC8vICMgTmV2ZXIgYWxsb3cgY2xvc2luZyB0aGUgbGl2ZSBjYW1wYWlnbiB0b2tlbiB0aHJvdWdoIHRoaXMgcGF0aC4KICAgIC8vIGFzc2VydCBhc3NldC5pZCAhPSBzZWxmLmFzYV9pZC52YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gImFzYV9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc2FfaWQgZXhpc3RzCiAgICBkaWcgMQogICAgIT0KICAgIGFzc2VydAogICAgLy8gY3Jvd2RmdW5kLnB5OjUwMwogICAgLy8gYXNzZXJ0IGFzc2V0LmlkICE9IDAKICAgIGR1cAogICAgYXNzZXJ0CiAgICAvLyBjcm93ZGZ1bmQucHk6NTA0LTUxMAogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9YXNzZXQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9c2VsZi5jcmVhdG9yLnZhbHVlLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD0wLAogICAgLy8gICAgIGFzc2V0X2Nsb3NlX3RvPXNlbGYuY3JlYXRvci52YWx1ZSwgICMgcmV0dXJuIHRoZSBzdHJheSBob2xkaW5nIHRvIGNyZWF0b3IKICAgIC8vICAgICBmZWU9MCwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIGNyb3dkZnVuZC5weTo1MDYKICAgIC8vIGFzc2V0X3JlY2VpdmVyPXNlbGYuY3JlYXRvci52YWx1ZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJjcmVhdG9yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNyZWF0b3IgZXhpc3RzCiAgICBkdXAKICAgIGl0eG5fZmllbGQgQXNzZXRDbG9zZVRvCiAgICAvLyBjcm93ZGZ1bmQucHk6NTA3CiAgICAvLyBhc3NldF9hbW91bnQ9MCwKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBjcm93ZGZ1bmQucHk6NTA0CiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICBpbnRjXzIgLy8gYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIC8vIGNyb3dkZnVuZC5weTo1MDkKICAgIC8vIGZlZT0wLAogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBjcm93ZGZ1bmQucHk6NTA0LTUxMAogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9YXNzZXQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9c2VsZi5jcmVhdG9yLnZhbHVlLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD0wLAogICAgLy8gICAgIGFzc2V0X2Nsb3NlX3RvPXNlbGYuY3JlYXRvci52YWx1ZSwgICMgcmV0dXJuIHRoZSBzdHJheSBob2xkaW5nIHRvIGNyZWF0b3IKICAgIC8vICAgICBmZWU9MCwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBjcm93ZGZ1bmQucHk6NDc1LTQ5NwogICAgLy8gIyDilIDilIAgcmVjb3Zlcl9zdHJheV9hc2Eg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICAvLyAjIFJFQ09WRVJZIEhBVENIIGZvciB0aGUgZG91YmxlLW9wdC1pbiBlZGdlIGNhc2UuCiAgICAvLyAjCiAgICAvLyAjIEJlY2F1c2UgYXBwX29wdF9pbl9hc2EgY2FuIHJ1biBtb3JlIHRoYW4gb25jZSBiZWZvcmUgc2V0dXAgd3JpdGVzIGFzYV9pZCAoYm90aAogICAgLy8gIyBnYXRlIG9ubHkgb24gYXNhX2lkID09IDApLCBhIGNyZWF0b3IgY2FuIG9wdCB0aGUgYXBwIGludG8gYXNzZXQgQSwgdGhlbiBpbnRvCiAgICAvLyAjIGFzc2V0IEIsIHRoZW4gc2V0dXAgd2l0aCBCLiBUaGUgYXBwIHRoZW4gaG9sZHMgVFdPIGFzc2V0IG9wdC1pbnMgYnV0IGFzYV9pZAogICAgLy8gIyBvbmx5IHRyYWNrcyBCLiBUaGUgbm9ybWFsIGNsb3NlLW91dCAoYWRtaW5fc3dlZXBfYXNhIC8gY3JlYXRvcl9yZWNsYWltX2FzYSkKICAgIC8vICMgb25seSBjbG9zZXMgYXNhX2lkLCBsZWF2aW5nIHRoZSBzdHJheSBhc3NldCBBIGhlbGQgZm9yZXZlciDigJQgd2hpY2ggYmxvY2tzIHRoZQogICAgLy8gIyBBTEdPIGNsb3NlIChhbiBhY2NvdW50IGhvbGRpbmcgYW55IEFTQSBjYW5ub3QgYmUgY2xvc2VkKSwgd2VkZ2luZyB0aGUgYXBwLgogICAgLy8gIwogICAgLy8gIyBUaGlzIG1ldGhvZCBjbG9zZXMgb3V0IE9ORSBzdHJheSBhc3NldCAoYW55IGFzc2V0IHRoYXQgaXMgTk9UIHRoZSBsaXZlIGFzYV9pZCkKICAgIC8vICMgYmFjayB0byB0aGUgQ1JFQVRPUiwgZnJlZWluZyB0aGUgYXBwIHRvIGV2ZW50dWFsbHkgY2xvc2UuIENvbnN0cmFpbnRzIHRoYXQKICAgIC8vICMga2VlcCBpdCBzYWZlOgogICAgLy8gIyAgIOKAoiBhc3NldCAhPSBhc2FfaWQg4oCUIGl0IGNhbiBORVZFUiB0b3VjaCB0aGUgbGl2ZSBjYW1wYWlnbiB0b2tlbiAodGhhdCBoYXMgaXRzCiAgICAvLyAjICAgICBvd24gcHJvcGVyIGNsb3NlLW91dCBwYXRoIGFuZCBpcyBvd2VkIHRvIGJhY2tlcnMpLCBzbyB0aGlzIGNhbm5vdCBiZSB1c2VkCiAgICAvLyAjICAgICB0byBydWcgdGhlIHBvb2wuCiAgICAvLyAjICAg4oCiIHByb2NlZWRzIGFsd2F5cyBnbyB0byB0aGUgQ1JFQVRPUiAod2hvIG9wdGVkIHRoZSBhcHAgaW50byB0aGUgc3RyYXkgYXNzZXQpLAogICAgLy8gIyAgICAgbmV2ZXIgdG8gdGhlIGNhbGxlciDigJQgc28gYW4gYWRtaW4gY2FsbGVyIGNhbm5vdCBwcm9maXQuCiAgICAvLyAjICAg4oCiIGNhbGxhYmxlIGJ5IGFkbWluIE9SIGNyZWF0b3IsIHNvIGEgc3R1Y2sgYXBwIGNhbiBiZSBjbGVhcmVkIGV2ZW4gaWYgdGhlCiAgICAvLyAjICAgICBjcmVhdG9yIGhhcyB2YW5pc2hlZC4KICAgIC8vICMgSWYgdGhlIGFwcCBpc24ndCBhY3R1YWxseSBvcHRlZCBpbnRvIGBhc3NldGAsIHRoZSBpbm5lciBjbG9zZS1vdXQgcmV2ZXJ0cyBhbmQKICAgIC8vICMgbm90aGluZyBjaGFuZ2VzIChzYWZlIG5vLW9wIG9uIGEgYmFkIGFyZ3VtZW50KS4KICAgIC8vIEBhYmltZXRob2QKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCnJlY292ZXJfc3RyYXlfYXNhX2Jvb2xfZmFsc2VANDoKICAgIGludGNfMCAvLyAwCiAgICBiIHJlY292ZXJfc3RyYXlfYXNhX2Jvb2xfbWVyZ2VANQoKCi8vIGNyb3dkZnVuZC5Dcm93ZGZ1bmQuYWRtaW5fc3dlZXBfYXNhW3JvdXRpbmddKCkgLT4gdm9pZDoKYWRtaW5fc3dlZXBfYXNhOgogICAgLy8gY3Jvd2RmdW5kLnB5OjUyOQogICAgLy8gYXNhX2lkID0gc2VsZi5hc2FfaWQudmFsdWUKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJhc2FfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzYV9pZCBleGlzdHMKICAgIC8vIGNyb3dkZnVuZC5weTo1MzAtNTMzCiAgICAvLyBhc2Ffc3dlZXBfb2sgPSBhc2FfaWQgIT0gMCBhbmQgKAogICAgLy8gICAgIChzZWxmLl9zdWNjZWVkZWQoKSBhbmQgbm90IHNlbGYuX2lzX2NhbmNlbGxlZCgpIGFuZCBzZWxmLl9zdWNjZXNzX2dyYWNlX2V4cGlyZWQoKSkKICAgIC8vICAgICBvciAoc2VsZi5fZmFpbGVkKCkgYW5kIHNlbGYuX2ZhaWx1cmVfZ3JhY2VfZXhwaXJlZCgpKQogICAgLy8gKQogICAgYnogYWRtaW5fc3dlZXBfYXNhX2Jvb2xfZmFsc2VAOAogICAgLy8gY3Jvd2RmdW5kLnB5OjIyNgogICAgLy8gcmV0dXJuIHNlbGYuZnVuZGVkX3JvdW5kLnZhbHVlID4gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiZnVuZGVkX3JvdW5kIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmZ1bmRlZF9yb3VuZCBleGlzdHMKICAgIC8vIGNyb3dkZnVuZC5weTo1MzEKICAgIC8vIChzZWxmLl9zdWNjZWVkZWQoKSBhbmQgbm90IHNlbGYuX2lzX2NhbmNlbGxlZCgpIGFuZCBzZWxmLl9zdWNjZXNzX2dyYWNlX2V4cGlyZWQoKSkKICAgIGJ6IGFkbWluX3N3ZWVwX2FzYV9vcl9jb250ZEA1CiAgICAvLyBjcm93ZGZ1bmQucHk6MjAyCiAgICAvLyByZXR1cm4gc2VsZi5jYW5jZWxsZWQudmFsdWUgPT0gMQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gImNhbmNlbGxlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jYW5jZWxsZWQgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIC8vIGNyb3dkZnVuZC5weTo1MzEKICAgIC8vIChzZWxmLl9zdWNjZWVkZWQoKSBhbmQgbm90IHNlbGYuX2lzX2NhbmNlbGxlZCgpIGFuZCBzZWxmLl9zdWNjZXNzX2dyYWNlX2V4cGlyZWQoKSkKICAgIGJueiBhZG1pbl9zd2VlcF9hc2Ffb3JfY29udGRANQogICAgY2FsbHN1YiBfc3VjY2Vzc19ncmFjZV9leHBpcmVkCiAgICBibnogYWRtaW5fc3dlZXBfYXNhX2Jvb2xfdHJ1ZUA3CgphZG1pbl9zd2VlcF9hc2Ffb3JfY29udGRANToKICAgIC8vIGNyb3dkZnVuZC5weTo1MzIKICAgIC8vIG9yIChzZWxmLl9mYWlsZWQoKSBhbmQgc2VsZi5fZmFpbHVyZV9ncmFjZV9leHBpcmVkKCkpCiAgICBjYWxsc3ViIF9mYWlsZWQKICAgIGJ6IGFkbWluX3N3ZWVwX2FzYV9ib29sX2ZhbHNlQDgKICAgIGNhbGxzdWIgX2ZhaWx1cmVfZ3JhY2VfZXhwaXJlZAogICAgYnogYWRtaW5fc3dlZXBfYXNhX2Jvb2xfZmFsc2VAOAoKYWRtaW5fc3dlZXBfYXNhX2Jvb2xfdHJ1ZUA3OgogICAgaW50Y18xIC8vIDEKCmFkbWluX3N3ZWVwX2FzYV9ib29sX21lcmdlQDk6CiAgICAvLyBjcm93ZGZ1bmQucHk6NTM0CiAgICAvLyBhc3NlcnQgR2xvYmFsLmdyb3VwX3NpemUgPT0gMQogICAgZ2xvYmFsIEdyb3VwU2l6ZQogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGNyb3dkZnVuZC5weTo1MzUKICAgIC8vIGFzc2VydCBzZWxmLl9pc19hZG1pbigpCiAgICBjYWxsc3ViIF9pc19hZG1pbgogICAgYXNzZXJ0CiAgICAvLyBjcm93ZGZ1bmQucHk6NTM2CiAgICAvLyBhc3NlcnQgYXNhX3N3ZWVwX29rLCAiZ3JhY2Ugbm90IGV4cGlyZWQiCiAgICBhc3NlcnQgLy8gZ3JhY2Ugbm90IGV4cGlyZWQKICAgIC8vIGNyb3dkZnVuZC5weTo1MzctNTQ5CiAgICAvLyAjIFN3ZXB0IHRva2VucyByZXR1cm4gdG8gdGhlIENSRUFUT1IgKG5vdCB0aGUgYWRtaW4pOiB0aGUgY3JlYXRvciBwcm92aWRlZAogICAgLy8gIyB0aGUgdG9rZW4gcG9vbCwgc28gdW5jbGFpbWVkL2xlZnRvdmVyIHRva2VucyBhcmUgdGhlaXJzLiBUaGlzIGlzIHN5bW1ldHJpYwogICAgLy8gIyB3aXRoIGNyZWF0b3JfcmVjbGFpbV9hc2EgKGZhaWx1cmUgcGF0aCkgYW5kIHdpdGggYWRtaW5fY2xhaW0ncyBBTEdPIGNsb3NlLAogICAgLy8gIyB3aGljaCBhbHNvIHJldHVybnMgcmVzaWR1YWwgdmFsdWUgdG8gdGhlIGNyZWF0b3IuIFRoZSBhZG1pbidzIG9ubHkgdGFrZSBpcwogICAgLy8gIyB0aGUgNCUgQUxHTyBzdWNjZXNzIGZlZSAoaGFuZGxlZCBzZXBhcmF0ZWx5IGluIGFkbWluX2ZlZV9jbGFpbS9hZG1pbl9jbGFpbSk7CiAgICAvLyAjIHRoZSBBU0Egc3dlZXAgaGFzIG5vIGZlZSBkZXBlbmRlbmN5LgogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9YXNhX2lkLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPXNlbGYuY3JlYXRvci52YWx1ZSwKICAgIC8vICAgICBhc3NldF9hbW91bnQ9MCwKICAgIC8vICAgICBhc3NldF9jbG9zZV90bz1zZWxmLmNyZWF0b3IudmFsdWUsICAjIGNsb3NlcyB0aGUgYXBwJ3MgZnVsbCBBU0EgYmFsYW5jZSB0byB0aGUgY3JlYXRvcgogICAgLy8gICAgIGZlZT0wLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gY3Jvd2RmdW5kLnB5OjU0NQogICAgLy8gYXNzZXRfcmVjZWl2ZXI9c2VsZi5jcmVhdG9yLnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImNyZWF0b3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3JlYXRvciBleGlzdHMKICAgIGR1cAogICAgaXR4bl9maWVsZCBBc3NldENsb3NlVG8KICAgIC8vIGNyb3dkZnVuZC5weTo1NDYKICAgIC8vIGFzc2V0X2Ftb3VudD0wLAogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIGNyb3dkZnVuZC5weTo1MzctNTQzCiAgICAvLyAjIFN3ZXB0IHRva2VucyByZXR1cm4gdG8gdGhlIENSRUFUT1IgKG5vdCB0aGUgYWRtaW4pOiB0aGUgY3JlYXRvciBwcm92aWRlZAogICAgLy8gIyB0aGUgdG9rZW4gcG9vbCwgc28gdW5jbGFpbWVkL2xlZnRvdmVyIHRva2VucyBhcmUgdGhlaXJzLiBUaGlzIGlzIHN5bW1ldHJpYwogICAgLy8gIyB3aXRoIGNyZWF0b3JfcmVjbGFpbV9hc2EgKGZhaWx1cmUgcGF0aCkgYW5kIHdpdGggYWRtaW5fY2xhaW0ncyBBTEdPIGNsb3NlLAogICAgLy8gIyB3aGljaCBhbHNvIHJldHVybnMgcmVzaWR1YWwgdmFsdWUgdG8gdGhlIGNyZWF0b3IuIFRoZSBhZG1pbidzIG9ubHkgdGFrZSBpcwogICAgLy8gIyB0aGUgNCUgQUxHTyBzdWNjZXNzIGZlZSAoaGFuZGxlZCBzZXBhcmF0ZWx5IGluIGFkbWluX2ZlZV9jbGFpbS9hZG1pbl9jbGFpbSk7CiAgICAvLyAjIHRoZSBBU0Egc3dlZXAgaGFzIG5vIGZlZSBkZXBlbmRlbmN5LgogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgaW50Y18yIC8vIGF4ZmVyCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICAvLyBjcm93ZGZ1bmQucHk6NTQ4CiAgICAvLyBmZWU9MCwKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gY3Jvd2RmdW5kLnB5OjUzNy01NDkKICAgIC8vICMgU3dlcHQgdG9rZW5zIHJldHVybiB0byB0aGUgQ1JFQVRPUiAobm90IHRoZSBhZG1pbik6IHRoZSBjcmVhdG9yIHByb3ZpZGVkCiAgICAvLyAjIHRoZSB0b2tlbiBwb29sLCBzbyB1bmNsYWltZWQvbGVmdG92ZXIgdG9rZW5zIGFyZSB0aGVpcnMuIFRoaXMgaXMgc3ltbWV0cmljCiAgICAvLyAjIHdpdGggY3JlYXRvcl9yZWNsYWltX2FzYSAoZmFpbHVyZSBwYXRoKSBhbmQgd2l0aCBhZG1pbl9jbGFpbSdzIEFMR08gY2xvc2UsCiAgICAvLyAjIHdoaWNoIGFsc28gcmV0dXJucyByZXNpZHVhbCB2YWx1ZSB0byB0aGUgY3JlYXRvci4gVGhlIGFkbWluJ3Mgb25seSB0YWtlIGlzCiAgICAvLyAjIHRoZSA0JSBBTEdPIHN1Y2Nlc3MgZmVlIChoYW5kbGVkIHNlcGFyYXRlbHkgaW4gYWRtaW5fZmVlX2NsYWltL2FkbWluX2NsYWltKTsKICAgIC8vICMgdGhlIEFTQSBzd2VlcCBoYXMgbm8gZmVlIGRlcGVuZGVuY3kuCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1hc2FfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9c2VsZi5jcmVhdG9yLnZhbHVlLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD0wLAogICAgLy8gICAgIGFzc2V0X2Nsb3NlX3RvPXNlbGYuY3JlYXRvci52YWx1ZSwgICMgY2xvc2VzIHRoZSBhcHAncyBmdWxsIEFTQSBiYWxhbmNlIHRvIHRoZSBjcmVhdG9yCiAgICAvLyAgICAgZmVlPTAsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gY3Jvd2RmdW5kLnB5OjU1MAogICAgLy8gc2VsZi5hc2FfaWQudmFsdWUgPSBVSW50NjQoMCkgICMgYXBwIG5vIGxvbmdlciBob2xkcyB0aGUgQVNBCiAgICBieXRlY18wIC8vICJhc2FfaWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIGNyb3dkZnVuZC5weTo1MTItNTI3CiAgICAvLyAjIOKUgOKUgCBhZG1pbl9zd2VlcF9hc2Eg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICAvLyAjIERlY291cGxlZCBBU0EgY2xvc2Utb3V0LCBrZXB0IHNlcGFyYXRlIGZyb20gdGhlIEFMR08gY2xvc2UuIEFkbWluLXRyaWdnZXJlZCwKICAgIC8vICMgYnV0IHRoZSB0b2tlbnMgY2xvc2UgdG8gdGhlIENSRUFUT1IgKHNlZSBib2R5KSDigJQgdGhlIGFkbWluIGlzIG9ubHkgdGhlIHBhcnR5CiAgICAvLyAjIHdobyBjYW4gZmlyZSBpdCBhZnRlciB0aGUgZ3JhY2UsIG5vdCB0aGUgcmVjaXBpZW50LgogICAgLy8gIyAgIFNVQ0NFU1MgKHN1Y2Nlc3NfZ3JhY2VfZXhwaXJlZCk6IHN3ZWVwcyB0b2tlbnMgb2YgaW52ZXN0b3JzIHdobyBuZXZlcgogICAgLy8gIyAgICAgZmluYWxpemVkOyB1bmNsYWltZWQgdG9rZW5zIHJldHVybiB0byB0aGUgY3JlYXRvciAod2hvIHByb3ZpZGVkIHRoZSBwb29sKS4KICAgIC8vICMgICBGQUlMVVJFIChmYWlsdXJlX2dyYWNlX2V4cGlyZWQpOiBmYWxsYmFjayBvbmx5OyBpZiB0aGUgY3JlYXRvciBuZXZlcgogICAgLy8gIyAgICAgcmVjbGFpbXMgd2l0aGluIHRoZSA2LW1vbnRoIGZhaWx1cmUgZ3JhY2UsIHRoZSBhZG1pbiBmaXJlcyB0aGUgc3dlZXAgYW5kCiAgICAvLyAjICAgICB0aGUgdG9rZW5zIHN0aWxsIHJldHVybiB0byB0aGUgY3JlYXRvciDigJQgc3ltbWV0cmljIHdpdGggdGhlIHN1Y2Nlc3Mgc2lkZSwKICAgIC8vICMgICAgIGFuZCBpdCBwcmV2ZW50cyBhIG5vbi1yZWNsYWltaW5nIGNyZWF0b3IgbG9ja2luZyB0aGUgQUxHTyBjbG9zZSAod2hpY2gKICAgIC8vICMgICAgIHJlcXVpcmVzIGFzYV9pZCA9PSAwKS4KICAgIC8vICMgUFJPQ0VEVVJFOiB0aGUgdG9rZW5zIGNsb3NlIHRvIHRoZSBDUkVBVE9SLCBzbyB0aGUgQ1JFQVRPUiBtdXN0IGJlIG9wdGVkCiAgICAvLyAjIGludG8gYXNhX2lkIEJFRk9SRSB0aGlzIGlzIGNhbGxlZCwgb3IgdGhlIGlubmVyIGFzc2V0X2Nsb3NlX3RvIHJldmVydHMuIChUaGUKICAgIC8vICMgYWRtaW4gaXMgb25seSB0aGUgY2FsbGVyLCBub3QgdGhlIHJlY2lwaWVudCwgYW5kIGRvZXMgbm90IG5lZWQgdG8gb3B0IGluLikKICAgIC8vICMgT24gcmV2ZXJ0IG5vdGhpbmcgaXMgbG9zdCDigJQgZW5zdXJlIHRoZSBjcmVhdG9yIGlzIG9wdGVkIGluIGFuZCByZXRyeS4KICAgIC8vIEBhYmltZXRob2QKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmFkbWluX3N3ZWVwX2FzYV9ib29sX2ZhbHNlQDg6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhZG1pbl9zd2VlcF9hc2FfYm9vbF9tZXJnZUA5CgoKLy8gY3Jvd2RmdW5kLkNyb3dkZnVuZC5hZG1pbl9jbGFpbVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmFkbWluX2NsYWltOgogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBjcm93ZGZ1bmQucHk6MjI2CiAgICAvLyByZXR1cm4gc2VsZi5mdW5kZWRfcm91bmQudmFsdWUgPiBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJmdW5kZWRfcm91bmQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZnVuZGVkX3JvdW5kIGV4aXN0cwogICAgLy8gY3Jvd2RmdW5kLnB5OjU4NS01ODgKICAgIC8vIHNlbGYuX3N1Y2NlZWRlZCgpCiAgICAvLyBhbmQgbm90IHNlbGYuX2lzX2NhbmNlbGxlZCgpCiAgICAvLyBhbmQgc2VsZi5fc3VjY2Vzc19ncmFjZV9leHBpcmVkKCkKICAgIC8vIGFuZCBzZWxmLmFzYV9pZC52YWx1ZSA9PSAwCiAgICBieiBhZG1pbl9jbGFpbV9ib29sX2ZhbHNlQDYKICAgIC8vIGNyb3dkZnVuZC5weToyMDIKICAgIC8vIHJldHVybiBzZWxmLmNhbmNlbGxlZC52YWx1ZSA9PSAxCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAiY2FuY2VsbGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNhbmNlbGxlZCBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgLy8gY3Jvd2RmdW5kLnB5OjU4NgogICAgLy8gYW5kIG5vdCBzZWxmLl9pc19jYW5jZWxsZWQoKQogICAgYm56IGFkbWluX2NsYWltX2Jvb2xfZmFsc2VANgogICAgLy8gY3Jvd2RmdW5kLnB5OjU4NwogICAgLy8gYW5kIHNlbGYuX3N1Y2Nlc3NfZ3JhY2VfZXhwaXJlZCgpCiAgICBjYWxsc3ViIF9zdWNjZXNzX2dyYWNlX2V4cGlyZWQKICAgIC8vIGNyb3dkZnVuZC5weTo1ODUtNTg4CiAgICAvLyBzZWxmLl9zdWNjZWVkZWQoKQogICAgLy8gYW5kIG5vdCBzZWxmLl9pc19jYW5jZWxsZWQoKQogICAgLy8gYW5kIHNlbGYuX3N1Y2Nlc3NfZ3JhY2VfZXhwaXJlZCgpCiAgICAvLyBhbmQgc2VsZi5hc2FfaWQudmFsdWUgPT0gMAogICAgYnogYWRtaW5fY2xhaW1fYm9vbF9mYWxzZUA2CiAgICAvLyBjcm93ZGZ1bmQucHk6NTg4CiAgICAvLyBhbmQgc2VsZi5hc2FfaWQudmFsdWUgPT0gMAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gImFzYV9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc2FfaWQgZXhpc3RzCiAgICAvLyBjcm93ZGZ1bmQucHk6NTg1LTU4OAogICAgLy8gc2VsZi5fc3VjY2VlZGVkKCkKICAgIC8vIGFuZCBub3Qgc2VsZi5faXNfY2FuY2VsbGVkKCkKICAgIC8vIGFuZCBzZWxmLl9zdWNjZXNzX2dyYWNlX2V4cGlyZWQoKQogICAgLy8gYW5kIHNlbGYuYXNhX2lkLnZhbHVlID09IDAKICAgIGJueiBhZG1pbl9jbGFpbV9ib29sX2ZhbHNlQDYKICAgIGludGNfMSAvLyAxCgphZG1pbl9jbGFpbV9ib29sX21lcmdlQDc6CiAgICAvLyBjcm93ZGZ1bmQucHk6NTkxCiAgICAvLyBzZWxmLl9mYWlsZWQoKQogICAgY2FsbHN1YiBfZmFpbGVkCiAgICAvLyBjcm93ZGZ1bmQucHk6NTkxLTU5MwogICAgLy8gc2VsZi5fZmFpbGVkKCkKICAgIC8vIGFuZCBzZWxmLl9mYWlsdXJlX2dyYWNlX2V4cGlyZWQoKQogICAgLy8gYW5kIHNlbGYuYXNhX2lkLnZhbHVlID09IDAKICAgIGJ6IGFkbWluX2NsYWltX2Jvb2xfZmFsc2VAMTEKICAgIC8vIGNyb3dkZnVuZC5weTo1OTIKICAgIC8vIGFuZCBzZWxmLl9mYWlsdXJlX2dyYWNlX2V4cGlyZWQoKQogICAgY2FsbHN1YiBfZmFpbHVyZV9ncmFjZV9leHBpcmVkCiAgICAvLyBjcm93ZGZ1bmQucHk6NTkxLTU5MwogICAgLy8gc2VsZi5fZmFpbGVkKCkKICAgIC8vIGFuZCBzZWxmLl9mYWlsdXJlX2dyYWNlX2V4cGlyZWQoKQogICAgLy8gYW5kIHNlbGYuYXNhX2lkLnZhbHVlID09IDAKICAgIGJ6IGFkbWluX2NsYWltX2Jvb2xfZmFsc2VAMTEKICAgIC8vIGNyb3dkZnVuZC5weTo1OTMKICAgIC8vIGFuZCBzZWxmLmFzYV9pZC52YWx1ZSA9PSAwCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAiYXNhX2lkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzYV9pZCBleGlzdHMKICAgIC8vIGNyb3dkZnVuZC5weTo1OTEtNTkzCiAgICAvLyBzZWxmLl9mYWlsZWQoKQogICAgLy8gYW5kIHNlbGYuX2ZhaWx1cmVfZ3JhY2VfZXhwaXJlZCgpCiAgICAvLyBhbmQgc2VsZi5hc2FfaWQudmFsdWUgPT0gMAogICAgYm56IGFkbWluX2NsYWltX2Jvb2xfZmFsc2VAMTEKICAgIGludGNfMSAvLyAxCiAgICBzd2FwCgphZG1pbl9jbGFpbV9ib29sX21lcmdlQDEyOgogICAgLy8gY3Jvd2RmdW5kLnB5OjU5NQogICAgLy8gYXNzZXJ0IEdsb2JhbC5ncm91cF9zaXplID09IDEKICAgIGdsb2JhbCBHcm91cFNpemUKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBjcm93ZGZ1bmQucHk6NTk2CiAgICAvLyBhc3NlcnQgc2VsZi5faXNfYWRtaW4oKSBvciBzZWxmLl9pc19jcmVhdG9yKCkKICAgIGNhbGxzdWIgX2lzX2FkbWluCiAgICBibnogYWRtaW5fY2xhaW1fYm9vbF90cnVlQDE0CiAgICBjYWxsc3ViIF9pc19jcmVhdG9yCiAgICBieiBhZG1pbl9jbGFpbV9ib29sX2ZhbHNlQDE1CgphZG1pbl9jbGFpbV9ib29sX3RydWVAMTQ6CiAgICBpbnRjXzEgLy8gMQoKYWRtaW5fY2xhaW1fYm9vbF9tZXJnZUAxNjoKICAgIC8vIGNyb3dkZnVuZC5weTo1OTYKICAgIC8vIGFzc2VydCBzZWxmLl9pc19hZG1pbigpIG9yIHNlbGYuX2lzX2NyZWF0b3IoKQogICAgYXNzZXJ0CiAgICAvLyBjcm93ZGZ1bmQucHk6NTk3CiAgICAvLyBhc3NlcnQgc2VsZi5hZG1pbl9jbGFpbWVkLnZhbHVlID09IDAKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAiYWRtaW5fY2xhaW1lZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hZG1pbl9jbGFpbWVkIGV4aXN0cwogICAgIQogICAgYXNzZXJ0CiAgICAvLyBjcm93ZGZ1bmQucHk6NTk4CiAgICAvLyBhc3NlcnQgc3VjY2Vzc19jbG9zZV9vayBvciBmYWlsdXJlX2Nsb3NlX29rLCAiZ3JhY2Ugbm90IGV4cGlyZWQiCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgfHwKICAgIGFzc2VydCAvLyBncmFjZSBub3QgZXhwaXJlZAogICAgLy8gY3Jvd2RmdW5kLnB5OjU5OS02MDIKICAgIC8vICMgT24gYSBzdWNjZXNzIGNsb3NlIHdoZXJlIHRoZSA0JSBmZWUgd2FzIG5ldmVyIGNvbGxlY3RlZCwgcGF5IHRoZSBhZG1pbgogICAgLy8gIyB0aGVpciBmZWUgRklSU1QgKGEgbm9ybWFsIHRyYW5zZmVyIOKAlCBtdXN0IHByZWNlZGUgdGhlIGNsb3NlLCBzaW5jZSBhZnRlcgogICAgLy8gIyB0aGUgY2xvc2UgdGhlcmUgaXMgbm8gYmFsYW5jZSBsZWZ0IHRvIHBheSBmcm9tKSwgdGhlbiBtYXJrIGl0IGNsYWltZWQuCiAgICAvLyBpZiBzdWNjZXNzX2Nsb3NlX29rIGFuZCBzZWxmLmFkbWluX2ZlZV9jbGFpbWVkLnZhbHVlID09IDA6CiAgICBieiBhZG1pbl9jbGFpbV9hZnRlcl9pZl9lbHNlQDIyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOCAvLyAiYWRtaW5fZmVlX2NsYWltZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWRtaW5fZmVlX2NsYWltZWQgZXhpc3RzCiAgICBibnogYWRtaW5fY2xhaW1fYWZ0ZXJfaWZfZWxzZUAyMgogICAgLy8gY3Jvd2RmdW5kLnB5OjYwMwogICAgLy8gYWRtaW5fZmVlID0gKHNlbGYuZ29hbC52YWx1ZSAqIFNVQ0NFU1NfRkVFX1BDVCkgLy8gVUludDY0KDEwMCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJnb2FsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmdvYWwgZXhpc3RzCiAgICBpbnRjXzIgLy8gNAogICAgKgogICAgcHVzaGludCAxMDAKICAgIC8KICAgIGR1cAogICAgYnVyeSAyCiAgICAvLyBjcm93ZGZ1bmQucHk6NjA0CiAgICAvLyBpZiBhZG1pbl9mZWUgPiAwOgogICAgYnogYWRtaW5fY2xhaW1fYWZ0ZXJfaWZfZWxzZUAyMQogICAgLy8gY3Jvd2RmdW5kLnB5OjYwNS02MDkKICAgIC8vIGl0eG4uUGF5bWVudCgKICAgIC8vICAgICByZWNlaXZlcj1zZWxmLmFkbWluLnZhbHVlLAogICAgLy8gICAgIGFtb3VudD1hZG1pbl9mZWUsCiAgICAvLyAgICAgZmVlPTAsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBjcm93ZGZ1bmQucHk6NjA2CiAgICAvLyByZWNlaXZlcj1zZWxmLmFkbWluLnZhbHVlLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gImFkbWluIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFkbWluIGV4aXN0cwogICAgZGlnIDEKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICAvLyBjcm93ZGZ1bmQucHk6NjA1CiAgICAvLyBpdHhuLlBheW1lbnQoCiAgICBpbnRjXzEgLy8gcGF5CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICAvLyBjcm93ZGZ1bmQucHk6NjA4CiAgICAvLyBmZWU9MCwKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gY3Jvd2RmdW5kLnB5OjYwNS02MDkKICAgIC8vIGl0eG4uUGF5bWVudCgKICAgIC8vICAgICByZWNlaXZlcj1zZWxmLmFkbWluLnZhbHVlLAogICAgLy8gICAgIGFtb3VudD1hZG1pbl9mZWUsCiAgICAvLyAgICAgZmVlPTAsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAoKYWRtaW5fY2xhaW1fYWZ0ZXJfaWZfZWxzZUAyMToKICAgIC8vIGNyb3dkZnVuZC5weTo2MTAKICAgIC8vIHNlbGYuYWRtaW5fZmVlX2NsYWltZWQudmFsdWUgPSBVSW50NjQoMSkKICAgIGJ5dGVjIDggLy8gImFkbWluX2ZlZV9jbGFpbWVkIgogICAgaW50Y18xIC8vIDEKICAgIGFwcF9nbG9iYWxfcHV0CgphZG1pbl9jbGFpbV9hZnRlcl9pZl9lbHNlQDIyOgogICAgLy8gY3Jvd2RmdW5kLnB5OjYxMS02MTgKICAgIC8vICMgQ2xvc2UgdGhlIGZ1bGwgcmVtYWluaW5nIGJhbGFuY2UgdG8gdGhlIENSRUFUT1IuIElkZW50aWNhbCBpbm5lciB0eG4gZm9yCiAgICAvLyAjIGJvdGggc3VjY2VzcyBhbmQgZmFpbHVyZSBwYXRocy4KICAgIC8vIGl0eG4uUGF5bWVudCgKICAgIC8vICAgICByZWNlaXZlcj1zZWxmLmNyZWF0b3IudmFsdWUsCiAgICAvLyAgICAgYW1vdW50PTAsCiAgICAvLyAgICAgY2xvc2VfcmVtYWluZGVyX3RvPXNlbGYuY3JlYXRvci52YWx1ZSwKICAgIC8vICAgICBmZWU9MCwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIGNyb3dkZnVuZC5weTo2MTQKICAgIC8vIHJlY2VpdmVyPXNlbGYuY3JlYXRvci52YWx1ZSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJjcmVhdG9yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNyZWF0b3IgZXhpc3RzCiAgICBkdXAKICAgIGl0eG5fZmllbGQgQ2xvc2VSZW1haW5kZXJUbwogICAgLy8gY3Jvd2RmdW5kLnB5OjYxNQogICAgLy8gYW1vdW50PTAsCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIC8vIGNyb3dkZnVuZC5weTo2MTEtNjEzCiAgICAvLyAjIENsb3NlIHRoZSBmdWxsIHJlbWFpbmluZyBiYWxhbmNlIHRvIHRoZSBDUkVBVE9SLiBJZGVudGljYWwgaW5uZXIgdHhuIGZvcgogICAgLy8gIyBib3RoIHN1Y2Nlc3MgYW5kIGZhaWx1cmUgcGF0aHMuCiAgICAvLyBpdHhuLlBheW1lbnQoCiAgICBpbnRjXzEgLy8gcGF5CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICAvLyBjcm93ZGZ1bmQucHk6NjE3CiAgICAvLyBmZWU9MCwKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gY3Jvd2RmdW5kLnB5OjYxMS02MTgKICAgIC8vICMgQ2xvc2UgdGhlIGZ1bGwgcmVtYWluaW5nIGJhbGFuY2UgdG8gdGhlIENSRUFUT1IuIElkZW50aWNhbCBpbm5lciB0eG4gZm9yCiAgICAvLyAjIGJvdGggc3VjY2VzcyBhbmQgZmFpbHVyZSBwYXRocy4KICAgIC8vIGl0eG4uUGF5bWVudCgKICAgIC8vICAgICByZWNlaXZlcj1zZWxmLmNyZWF0b3IudmFsdWUsCiAgICAvLyAgICAgYW1vdW50PTAsCiAgICAvLyAgICAgY2xvc2VfcmVtYWluZGVyX3RvPXNlbGYuY3JlYXRvci52YWx1ZSwKICAgIC8vICAgICBmZWU9MCwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBjcm93ZGZ1bmQucHk6NjE5CiAgICAvLyBzZWxmLmFkbWluX2NsYWltZWQudmFsdWUgPSBVSW50NjQoMSkKICAgIGJ5dGVjIDExIC8vICJhZG1pbl9jbGFpbWVkIgogICAgaW50Y18xIC8vIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBjcm93ZGZ1bmQucHk6NTUyLTU4MgogICAgLy8gIyDilIDilIAgYWRtaW5fY2xhaW0g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICAvLyAjIEdSQUNFLU9OTFkgQUxHTyBjbG9zZSwgdXNlZCB0byByZXRpcmUgU1RBTEUgY29udHJhY3RzLiBObyBlYXJseS9gb3dlZGAtYmFzZWQKICAgIC8vICMgcGF0aCwgc28gbm90aGluZyB0aGUgY2xvc2UgZGVwZW5kcyBvbiBjYW4gYmUgZGVzeW5jaHJvbml6ZWQgYnkgQ2xlYXJTdGF0ZS4KICAgIC8vICMKICAgIC8vICMgUmVjaXBpZW50IGNoYW5nZSB2cyB0aGUgb3JpZ2luYWw6IHRoZSByZXNpZHVhbCBub3cgY2xvc2VzIHRvIHRoZSBDUkVBVE9SLCBub3QKICAgIC8vICMgdGhlIGFkbWluLiBUaGUgYWRtaW4ncyBlYXJuZWQgbW9uZXkgaXMgdGhlIDQlIHN1Y2Nlc3MgZmVlLCB3aGljaCBpcyBub3cKICAgIC8vICMgY29sbGVjdGVkIHVwLWZyb250IGFuZCBpbmRlcGVuZGVudGx5IHZpYSBhZG1pbl9mZWVfY2xhaW0uIFdoYXRldmVyIGlzIGxlZnQgaW4KICAgIC8vICMgdGhlIGNvbnRyYWN0IGF0IGNsb3NlIHRpbWUgaXMgdW5jbGFpbWVkIENSRUFUT1IgdmFsdWUgKGEgOTYlIHBheW91dCB0aGUKICAgIC8vICMgY3JlYXRvciBuZXZlciBjbGFpbWVkKSBwbHVzIGR1c3Qgb24gc3VjY2Vzcywgb3IgdW5jbGFpbWVkIHJlZnVuZHMvc2VlZCBvbgogICAgLy8gIyBmYWlsdXJlIOKAlCBub25lIG9mIHdoaWNoIGlzIHRoZSBhZG1pbidzLCBzbyBpdCByZXR1cm5zIHRvIHRoZSBjcmVhdG9yLgogICAgLy8gIwogICAgLy8gIyBDYWxsYWJsZSBieSBFSVRIRVIgdGhlIGFkbWluIG9yIHRoZSBjcmVhdG9yOiB0aGUgcmVjaXBpZW50IGlzIGZpeGVkIHRvIHRoZQogICAgLy8gIyBjcmVhdG9yIHJlZ2FyZGxlc3Mgb2Ygd2hvIHRyaWdnZXJzIGl0LCBzbyBsZXR0aW5nIGVpdGhlciBwYXJ0eSBjYWxsIGl0IG1lYW5zCiAgICAvLyAjIGEgdmFuaXNoZWQgY3JlYXRvciBjYW4ndCBibG9jayBjbGVhbnVwIHdoaWxlIGEgdmFuaXNoZWQgYWRtaW4gY2FuJ3QgZWl0aGVyLgogICAgLy8gIwogICAgLy8gIyBQcmVjb25kaXRpb246IHRoZSBhcHAgbXVzdCBOT1Qgc3RpbGwgaG9sZCB0aGUgcHJvamVjdCBBU0EgKGFzYV9pZCA9PSAwKSwgc28KICAgIC8vICMgdGhlIEFMR08gY2xvc2UgY2FycmllcyBubyBpbm5lciBhc3NldCB0cmFuc2ZlciB0aGF0IGNvdWxkIHJldmVydC4KICAgIC8vICMKICAgIC8vICMgICBTdWNjZXNzIGNsb3NlOiBzdWNjZWVkZWQsIG5vdCBjYW5jZWxsZWQsIHN1Y2Nlc3NfZ3JhY2VfZXhwaXJlZAogICAgLy8gIyAgICAg4oaSIGlmIHRoZSBhZG1pbiBuZXZlciB0b29rIHRoZSA0JSBmZWUgKGFkbWluX2ZlZV9jbGFpbWVkID09IDApLCBwYXkgaXQgdG8KICAgIC8vICMgICAgICAgdGhlIGFkbWluIEZJUlNULCB0aGVuIGNsb3NlIHRoZSBmdWxsIHJlbWFpbmRlciB0byB0aGUgQ1JFQVRPUi4gSWYgdGhlCiAgICAvLyAjICAgICAgIGZlZSB3YXMgYWxyZWFkeSBjbGFpbWVkLCBqdXN0IGNsb3NlIHRoZSByZW1haW5kZXIgdG8gdGhlIGNyZWF0b3IuCiAgICAvLyAjICAgRmFpbHVyZSBjbG9zZTogZmFpbGVkLCBmYWlsdXJlX2dyYWNlX2V4cGlyZWQKICAgIC8vICMgICAgIOKGkiBjbG9zZSByZXNpZHVhbCBBTEdPIHRvIHRoZSBDUkVBVE9SLiBObyBmZWUgaXMgZXZlciB0YWtlbiBvbiBmYWlsdXJlLgogICAgLy8gIwogICAgLy8gIyBJbm5lci10eG4gY291bnQ6IHRoZSBzdWNjZXNzIGNsb3NlIGNhbiBmaXJlIFRXTyBpbm5lciB0eG5zIChvdXRzdGFuZGluZyBmZWUgKwogICAgLy8gIyBjbG9zZSkgaW4gdGhlIHdvcnN0IGNhc2U7IHRoZSBmYWlsdXJlIGNsb3NlIGZpcmVzIG9uZS4gQWxsIGlubmVyIGZlZXMgYXJlIDAKICAgIC8vICMgKGNhbGxlci1wb29sZWQpLCBzbyB0aGUgdHJpZ2dlcmluZyBhcHAtY2FsbCBtdXN0IGNhcnJ5IGZlZSA+PSAzeCBtaW4gZmVlIHRvCiAgICAvLyAjIGNvdmVyIHRoZSBhcHAgY2FsbCBwbHVzIHR3byBpbm5lcnMuIExvbmUgdHJhbnNhY3Rpb24gKGdyb3VwX3NpemUgPT0gMSkgc28gdGhlCiAgICAvLyAjIHBvb2xlZC1mZWUgYnVkZ2V0IGNhbid0IGJlIG1hbmlwdWxhdGVkIGJ5IHNpYmxpbmcgdHJhbnNhY3Rpb25zLgogICAgLy8gQGFiaW1ldGhvZAogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKYWRtaW5fY2xhaW1fYm9vbF9mYWxzZUAxNToKICAgIGludGNfMCAvLyAwCiAgICBiIGFkbWluX2NsYWltX2Jvb2xfbWVyZ2VAMTYKCmFkbWluX2NsYWltX2Jvb2xfZmFsc2VAMTE6CiAgICBpbnRjXzAgLy8gMAogICAgc3dhcAogICAgYiBhZG1pbl9jbGFpbV9ib29sX21lcmdlQDEyCgphZG1pbl9jbGFpbV9ib29sX2ZhbHNlQDY6CiAgICBpbnRjXzAgLy8gMAogICAgYiBhZG1pbl9jbGFpbV9ib29sX21lcmdlQDcKCgovLyBjcm93ZGZ1bmQuQ3Jvd2RmdW5kLmFkbWluX2NhbmNlbFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmFkbWluX2NhbmNlbDoKICAgIC8vIGNyb3dkZnVuZC5weTo2MjUKICAgIC8vIGFzc2VydCBHbG9iYWwuZ3JvdXBfc2l6ZSA9PSAxCiAgICBnbG9iYWwgR3JvdXBTaXplCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gY3Jvd2RmdW5kLnB5OjYyNgogICAgLy8gYXNzZXJ0IHNlbGYuX2lzX2FkbWluKCkKICAgIGNhbGxzdWIgX2lzX2FkbWluCiAgICBhc3NlcnQKICAgIC8vIGNyb3dkZnVuZC5weToyMDIKICAgIC8vIHJldHVybiBzZWxmLmNhbmNlbGxlZC52YWx1ZSA9PSAxCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAiY2FuY2VsbGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNhbmNlbGxlZCBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgLy8gY3Jvd2RmdW5kLnB5OjYyNwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLl9pc19jYW5jZWxsZWQoKQogICAgIQogICAgYXNzZXJ0CiAgICAvLyBjcm93ZGZ1bmQucHk6NjI4CiAgICAvLyBhc3NlcnQgc2VsZi5mdW5kZWRfcm91bmQudmFsdWUgPT0gMAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImZ1bmRlZF9yb3VuZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5mdW5kZWRfcm91bmQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQKICAgIC8vIGNyb3dkZnVuZC5weTo2MjkKICAgIC8vIHNlbGYuY2FuY2VsbGVkLnZhbHVlID0gVUludDY0KDEpCiAgICBieXRlY18xIC8vICJjYW5jZWxsZWQiCiAgICBpbnRjXzEgLy8gMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIGNyb3dkZnVuZC5weTo2MjEtNjIzCiAgICAvLyAjIOKUgOKUgCBhZG1pbl9jYW5jZWwg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICAvLyAjIE9ubHkgYmVmb3JlIHN1Y2Nlc3MuIENhbm5vdCBjYW5jZWwgYSBmdW5kZWQgY2FtcGFpZ24uCiAgICAvLyBAYWJpbWV0aG9kCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gY3Jvd2RmdW5kLkNyb3dkZnVuZC5kZWxldGVbcm91dGluZ10oKSAtPiB2b2lkOgpkZWxldGU6CiAgICAvLyBjcm93ZGZ1bmQucHk6NjM0CiAgICAvLyBhc3NlcnQgc2VsZi5faXNfYWRtaW4oKQogICAgY2FsbHN1YiBfaXNfYWRtaW4KICAgIGFzc2VydAogICAgLy8gY3Jvd2RmdW5kLnB5OjYzNQogICAgLy8gYXNzZXJ0IHNlbGYuYWRtaW5fY2xhaW1lZC52YWx1ZSA9PSAxCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTEgLy8gImFkbWluX2NsYWltZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWRtaW5fY2xhaW1lZCBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBjcm93ZGZ1bmQucHk6NjMxLTYzMgogICAgLy8gIyDilIDilIAgb25fZGVsZXRlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgLy8gQGFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiRGVsZXRlQXBwbGljYXRpb24iXSkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBjcm93ZGZ1bmQuQ3Jvd2RmdW5kLmNsb3Nlb3V0W3JvdXRpbmddKCkgLT4gdm9pZDoKY2xvc2VvdXQ6CiAgICAvLyBjcm93ZGZ1bmQucHk6NjQ0CiAgICAvLyBhc3NlcnQgc2VsZi5jb250cmliW1R4bi5zZW5kZXJdID09IDAKICAgIHR4biBTZW5kZXIKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJjb250cmliIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY29udHJpYiBleGlzdHMgZm9yIGFjY291bnQKICAgICEKICAgIGFzc2VydAogICAgLy8gY3Jvd2RmdW5kLnB5OjY0MS02NDIKICAgIC8vICMg4pSA4pSAIG9uX2Nsb3Nlb3V0IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgLy8gQGFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiQ2xvc2VPdXQiXSkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBjcm93ZGZ1bmQuQ3Jvd2RmdW5kLm9wdGluW3JvdXRpbmddKCkgLT4gdm9pZDoKb3B0aW46CiAgICAvLyBjcm93ZGZ1bmQucHk6MjAyCiAgICAvLyByZXR1cm4gc2VsZi5jYW5jZWxsZWQudmFsdWUgPT0gMQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gImNhbmNlbGxlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jYW5jZWxsZWQgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIC8vIGNyb3dkZnVuZC5weTo2NDkKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5faXNfY2FuY2VsbGVkKCkKICAgICEKICAgIGFzc2VydAogICAgLy8gY3Jvd2RmdW5kLnB5OjY1MAogICAgLy8gYXNzZXJ0IHNlbGYuX2JlZm9yZV9kZWFkbGluZSgpCiAgICBjYWxsc3ViIF9iZWZvcmVfZGVhZGxpbmUKICAgIGFzc2VydAogICAgLy8gY3Jvd2RmdW5kLnB5OjY1MQogICAgLy8gc2VsZi5jb250cmliW1R4bi5zZW5kZXJdID0gVUludDY0KDApCiAgICB0eG4gU2VuZGVyCiAgICBieXRlYyA0IC8vICJjb250cmliIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIGNyb3dkZnVuZC5weTo2NDYtNjQ3CiAgICAvLyAjIOKUgOKUgCBvbl9vcHRpbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIC8vIEBhYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIk9wdEluIl0pCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gY3Jvd2RmdW5kLkNyb3dkZnVuZC5faXNfY3JlYXRvcigpIC0+IHVpbnQ2NDoKX2lzX2NyZWF0b3I6CiAgICAvLyBjcm93ZGZ1bmQucHk6MTg2CiAgICAvLyByZXR1cm4gVHhuLnNlbmRlciA9PSBzZWxmLmNyZWF0b3IudmFsdWUKICAgIHR4biBTZW5kZXIKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJjcmVhdG9yIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNyZWF0b3IgZXhpc3RzCiAgICA9PQogICAgcmV0c3ViCgoKLy8gY3Jvd2RmdW5kLkNyb3dkZnVuZC5faXNfYWRtaW4oKSAtPiB1aW50NjQ6Cl9pc19hZG1pbjoKICAgIC8vIGNyb3dkZnVuZC5weToxOTAKICAgIC8vIHJldHVybiBUeG4uc2VuZGVyID09IHNlbGYuYWRtaW4udmFsdWUKICAgIHR4biBTZW5kZXIKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA5IC8vICJhZG1pbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hZG1pbiBleGlzdHMKICAgID09CiAgICByZXRzdWIKCgovLyBjcm93ZGZ1bmQuQ3Jvd2RmdW5kLl9iZWZvcmVfZGVhZGxpbmUoKSAtPiB1aW50NjQ6Cl9iZWZvcmVfZGVhZGxpbmU6CiAgICAvLyBjcm93ZGZ1bmQucHk6MTk0CiAgICAvLyByZXR1cm4gR2xvYmFsLnJvdW5kIDw9IHNlbGYuZGVhZGxpbmUudmFsdWUKICAgIGdsb2JhbCBSb3VuZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJkZWFkbGluZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kZWFkbGluZSBleGlzdHMKICAgIDw9CiAgICByZXRzdWIKCgovLyBjcm93ZGZ1bmQuQ3Jvd2RmdW5kLl9zdWNjZXNzX2dyYWNlX2V4cGlyZWQoKSAtPiB1aW50NjQ6Cl9zdWNjZXNzX2dyYWNlX2V4cGlyZWQ6CiAgICAvLyBjcm93ZGZ1bmQucHk6MjA4CiAgICAvLyBzZWxmLmZ1bmRlZF9yb3VuZC52YWx1ZSA+IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImZ1bmRlZF9yb3VuZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5mdW5kZWRfcm91bmQgZXhpc3RzCiAgICAvLyBjcm93ZGZ1bmQucHk6MjA4LTIwOQogICAgLy8gc2VsZi5mdW5kZWRfcm91bmQudmFsdWUgPiBVSW50NjQoMCkKICAgIC8vIGFuZCBHbG9iYWwucm91bmQgPiBzZWxmLmZ1bmRlZF9yb3VuZC52YWx1ZSArIEdSQUNFX1BFUklPRF9ST1VORFMKICAgIGJ6IF9zdWNjZXNzX2dyYWNlX2V4cGlyZWRfYm9vbF9mYWxzZUAzCiAgICAvLyBjcm93ZGZ1bmQucHk6MjA5CiAgICAvLyBhbmQgR2xvYmFsLnJvdW5kID4gc2VsZi5mdW5kZWRfcm91bmQudmFsdWUgKyBHUkFDRV9QRVJJT0RfUk9VTkRTCiAgICBnbG9iYWwgUm91bmQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJmdW5kZWRfcm91bmQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZnVuZGVkX3JvdW5kIGV4aXN0cwogICAgaW50YyA3IC8vIDU1ODA4NjYKICAgICsKICAgID4KICAgIC8vIGNyb3dkZnVuZC5weToyMDgtMjA5CiAgICAvLyBzZWxmLmZ1bmRlZF9yb3VuZC52YWx1ZSA+IFVJbnQ2NCgwKQogICAgLy8gYW5kIEdsb2JhbC5yb3VuZCA+IHNlbGYuZnVuZGVkX3JvdW5kLnZhbHVlICsgR1JBQ0VfUEVSSU9EX1JPVU5EUwogICAgYnogX3N1Y2Nlc3NfZ3JhY2VfZXhwaXJlZF9ib29sX2ZhbHNlQDMKICAgIGludGNfMSAvLyAxCiAgICAvLyBjcm93ZGZ1bmQucHk6MjA2LTIxMAogICAgLy8gIyBzdWNjZXNzOiBtZWFzdXJlZCBmcm9tIHRoZSByb3VuZCB0aGUgZ29hbCB3YXMgbWV0IChmdW5kZWRfcm91bmQpLgogICAgLy8gcmV0dXJuICgKICAgIC8vICAgICBzZWxmLmZ1bmRlZF9yb3VuZC52YWx1ZSA+IFVJbnQ2NCgwKQogICAgLy8gICAgIGFuZCBHbG9iYWwucm91bmQgPiBzZWxmLmZ1bmRlZF9yb3VuZC52YWx1ZSArIEdSQUNFX1BFUklPRF9ST1VORFMKICAgIC8vICkKICAgIHJldHN1YgoKX3N1Y2Nlc3NfZ3JhY2VfZXhwaXJlZF9ib29sX2ZhbHNlQDM6CiAgICBpbnRjXzAgLy8gMAogICAgLy8gY3Jvd2RmdW5kLnB5OjIwNi0yMTAKICAgIC8vICMgc3VjY2VzczogbWVhc3VyZWQgZnJvbSB0aGUgcm91bmQgdGhlIGdvYWwgd2FzIG1ldCAoZnVuZGVkX3JvdW5kKS4KICAgIC8vIHJldHVybiAoCiAgICAvLyAgICAgc2VsZi5mdW5kZWRfcm91bmQudmFsdWUgPiBVSW50NjQoMCkKICAgIC8vICAgICBhbmQgR2xvYmFsLnJvdW5kID4gc2VsZi5mdW5kZWRfcm91bmQudmFsdWUgKyBHUkFDRV9QRVJJT0RfUk9VTkRTCiAgICAvLyApCiAgICByZXRzdWIKCgovLyBjcm93ZGZ1bmQuQ3Jvd2RmdW5kLl9mYWlsdXJlX2dyYWNlX2V4cGlyZWQoKSAtPiB1aW50NjQ6Cl9mYWlsdXJlX2dyYWNlX2V4cGlyZWQ6CiAgICAvLyBjcm93ZGZ1bmQucHk6MjE0LTIxNwogICAgLy8gIyBmYWlsdXJlOiBtZWFzdXJlZCBmcm9tIHRoZSBkZWFkbGluZSAoZnVuZGVkX3JvdW5kID09IDAgb24gZmFpbHVyZSwgc28gYQogICAgLy8gIyBmdW5kZWRfcm91bmQtYmFzZWQgY2xvY2sgd291bGQgcmVhZCAiYWxyZWFkeSBleHBpcmVkIjsga2V5aW5nIG9mZiB0aGUKICAgIC8vICMgZGVhZGxpbmUgZ2l2ZXMgaW52ZXN0b3JzIGEgcmVhbCA2LW1vbnRoIHdpbmRvdyB0byByZWZ1bmQpLgogICAgLy8gcmV0dXJuIEdsb2JhbC5yb3VuZCA+IHNlbGYuZGVhZGxpbmUudmFsdWUgKyBHUkFDRV9QRVJJT0RfUk9VTkRTCiAgICBnbG9iYWwgUm91bmQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAiZGVhZGxpbmUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZGVhZGxpbmUgZXhpc3RzCiAgICBpbnRjIDcgLy8gNTU4MDg2NgogICAgKwogICAgPgogICAgcmV0c3ViCgoKLy8gY3Jvd2RmdW5kLkNyb3dkZnVuZC5fZmFpbGVkKCkgLT4gdWludDY0OgpfZmFpbGVkOgogICAgLy8gY3Jvd2RmdW5kLnB5OjIzMAogICAgLy8gcmV0dXJuIHNlbGYuZnVuZGVkX3JvdW5kLnZhbHVlID09IFVJbnQ2NCgwKSBhbmQgKAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImZ1bmRlZF9yb3VuZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5mdW5kZWRfcm91bmQgZXhpc3RzCiAgICAvLyBjcm93ZGZ1bmQucHk6MjMwLTIzMgogICAgLy8gcmV0dXJuIHNlbGYuZnVuZGVkX3JvdW5kLnZhbHVlID09IFVJbnQ2NCgwKSBhbmQgKAogICAgLy8gICAgIHNlbGYuX2lzX2NhbmNlbGxlZCgpIG9yIHNlbGYuX2FmdGVyX2RlYWRsaW5lKCkKICAgIC8vICkKICAgIGJueiBfZmFpbGVkX2Jvb2xfZmFsc2VANAogICAgLy8gY3Jvd2RmdW5kLnB5OjIwMgogICAgLy8gcmV0dXJuIHNlbGYuY2FuY2VsbGVkLnZhbHVlID09IDEKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJjYW5jZWxsZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2FuY2VsbGVkIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgID09CiAgICAvLyBjcm93ZGZ1bmQucHk6MjMxCiAgICAvLyBzZWxmLl9pc19jYW5jZWxsZWQoKSBvciBzZWxmLl9hZnRlcl9kZWFkbGluZSgpCiAgICBibnogX2ZhaWxlZF9ib29sX3RydWVAMwogICAgLy8gY3Jvd2RmdW5kLnB5OjE5OAogICAgLy8gcmV0dXJuIEdsb2JhbC5yb3VuZCA+IHNlbGYuZGVhZGxpbmUudmFsdWUKICAgIGdsb2JhbCBSb3VuZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJkZWFkbGluZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kZWFkbGluZSBleGlzdHMKICAgID4KICAgIC8vIGNyb3dkZnVuZC5weToyMzEKICAgIC8vIHNlbGYuX2lzX2NhbmNlbGxlZCgpIG9yIHNlbGYuX2FmdGVyX2RlYWRsaW5lKCkKICAgIGJ6IF9mYWlsZWRfYm9vbF9mYWxzZUA0CgpfZmFpbGVkX2Jvb2xfdHJ1ZUAzOgogICAgaW50Y18xIC8vIDEKICAgIC8vIGNyb3dkZnVuZC5weToyMzAtMjMyCiAgICAvLyByZXR1cm4gc2VsZi5mdW5kZWRfcm91bmQudmFsdWUgPT0gVUludDY0KDApIGFuZCAoCiAgICAvLyAgICAgc2VsZi5faXNfY2FuY2VsbGVkKCkgb3Igc2VsZi5fYWZ0ZXJfZGVhZGxpbmUoKQogICAgLy8gKQogICAgcmV0c3ViCgpfZmFpbGVkX2Jvb2xfZmFsc2VANDoKICAgIGludGNfMCAvLyAwCiAgICAvLyBjcm93ZGZ1bmQucHk6MjMwLTIzMgogICAgLy8gcmV0dXJuIHNlbGYuZnVuZGVkX3JvdW5kLnZhbHVlID09IFVJbnQ2NCgwKSBhbmQgKAogICAgLy8gICAgIHNlbGYuX2lzX2NhbmNlbGxlZCgpIG9yIHNlbGYuX2FmdGVyX2RlYWRsaW5lKCkKICAgIC8vICkKICAgIHJldHN1Ygo=", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==" }, "byteCode": { "approval": "CyAIAAEECMCEPYCt4gSA4PXR8PqouP0BwtDUAiYPBmFzYV9pZAljYW5jZWxsZWQMZnVuZGVkX3JvdW5kBGdvYWwHY29udHJpYgdjcmVhdG9yA3RwYgZyYWlzZWQRYWRtaW5fZmVlX2NsYWltZWQFYWRtaW4IZGVhZGxpbmUNYWRtaW5fY2xhaW1lZANhcGIKZGVjX2ZhY3Rvcg9jcmVhdG9yX2NsYWltZWSCAwQkN408BEQbDP4E3A3n6zYaAI4DAIoAfgBzMRkURDEYQQBcggwEiF+POgQjqv2oBP5xe20EI9i3zgQo/7A0BFfew6sEI+Yp9wRbhjE2BAAQ7uAEmb+XrQSLCBS+BDbZ30Y2GgCODAEoAV8CLgLaA0UDhgPFA+4EHQRgBLgFZQCABHCiGdQ2GgCOAQAkADEZIxIxGBBEQgWAMRmBAhIxGBBEQgVpMRmBBRIxGBBEQgVPNhoBSRWBIBJENhoCSRUlEkQXNhoDSRUlEkQXNhoESRUlEkQXNhoFSRUlEkQXMRYjCUk4ECMSREsESwMLgaCNBgpJIQUMIQVMTTIGSwSBifEBCwhLBkRLBiEEGBRESwYhBQ9ESwaBgIDpg7HeFg5ESwNESwRESwSBZA5EMgSBAhJESwI4FjEWIwkSREsCOAAxABJESwI4B0sIEkRLAjgITwIPREsBOAkyAxJETDggMgMSRCcFMQBnJwlPBmcrTwVnJwZPBGcnDE8CZ4AEZGF5c08CZycKTGcnByJnKCJnJw0iZyoiZykiZycOImcnCCJnJwsiZyNDNhoBSRUlEkQXiAR6RCIoZUQURCIpZUQjEhREiAR6RDExIxJEsTIKIrISshSyESSyECKyAbMjQzYaAUkVJRJEF0kxFiMJSU4CSTgQJBJEMgpOAogEMUQiKGVEFEQiKWVEIxIURIgEMUQiJwdlRBREMTEjEkQoSwJnMgSBAhJEOBYxFiMJEkRJcQFESwFxCkQyAxJESwFxCUQyAxJETHECRBREgQpMlElOBCcNTGciTgMiJwZlREEAIiIrZUQiJwZlRAtJIQYORCInDGVEIQQLCksFC0lFBSEGDkRMSTgAMQASREk4FE8CEkRJOBFPAhJESTgSSwIPREk4FTIDEkQ4IDIDEkQjQzEWIwlJOBAjEkQxADIKiAOBRCIpZUQjEhREIicHZUQiK2VEDEQiJwZlREEABSIoZUREMgSBAhJETwJJOBYxFiMJEkRJOABPA0lOAxJESTgHTwMSREk4CElESSEEGBRESwE4CTIDEkRMOCAyAxJEIicHZURLAQgiK2VESwEPREsCIicEYyJOAk1PAghPAicETwJmJwdLAWciK2VED0EACyIqZURAAAQqMgZnI0OAADEASTIEIxJEIiplREQiKWVEIxIURCInBGMiTgJNSU4CRCInBmVEQQA6IihlREEAMyInBmVESwILIicMZUQhBAsKIicNZUQLSUUEQQAWsSIoZURLA7ISSwGyFLIRJLIQIrIBsycEImYjQzIEIxJEiAJhRCIqZUREIillRCMSFEQiJw5lRBREIitlREkkC4FkCglJRLEiJwVlRLIHsggjshAisgGzJw4jZyNDMgQjEkSIAilEIiplREQiKWVEIxIURCInCGVEFEQiK2VEJAuBZApJRLEiJwllRLIHsggjshAisgGzJwgjZyNDMQAyBCMSRIgCHkRJIicEYyJOAk1JRLGyCEmyByOyECKyAbMnBCJmI0MyBCMSRIgBuESIAfNEIihlRElEsSInBWVESbIVIrISshSyESSyECKyAbMoImcjQzYaAUkVJRJEFzIEIxJEiAGJQAAGiAF6QQAlI0QiKGVESwETRElEsSInBWVESbIVIrISshSyESSyECKyAbMjQyJC/9giKGVMSU8CREEASSIqZURBAA8iKWVEIxJAAAaIAUtAAAyIAWlBAC2IAVdBACcjMgQjEkSIASFERLEiJwVlREmyFSKyErIUshEkshAisgGzKCJnI0MiQv/WgAAiKmVEQQCgIillRCMSQACXiAD8QQCRIihlREAAiiOIARJBAH6IAQBBAHgiKGVEQABxI0wyBCMSRIgAwkAABogAs0EAWiNEIicLZUQURElPAhFEQQAuIicIZURAACYiK2VEJAuBZApJRQJBABOxIicJZURLAbIIsgcjshAisgGzJwgjZ7EiJwVlREmyCSKyCLIHI7IQIrIBsycLI2cjQyJC/6MiTEL/jCJC/3MyBCMSRIgASkQiKWVEIxIURCIqZUQURCkjZyNDiAAzRCInC2VEIxJEI0MxACInBGNEFEQjQyIpZUQjEhREiAAbRDEAJwQiZiNDMQAiJwVlRBKJMQAiJwllRBKJMgYiJwplRA6JIiplREEADzIGIiplRCEHCA1BAAIjiSKJMgYiJwplRCEHCA2JIiplREAAFiIpZUQjEkAACzIGIicKZUQNQQACI4kiiQ==", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, "minor": 10, "patch": 1 } }, "events": [], "templateVariables": {} }