IyEvdXNyL2Jpbi9lbnYgcHl0aG9uCiMgLSotIGNvZGluZzogaXNvLTg4NTktMSAtKi0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyB0YXJmaWxlLnB5CiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgQ29weXJpZ2h0IChDKSAyMDAyIExhcnMgR3VzdORiZWwgPGxhcnNAZ3VzdGFlYmVsLmRlPgojIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiMKIyBQZXJtaXNzaW9uICBpcyAgaGVyZWJ5IGdyYW50ZWQsICBmcmVlICBvZiBjaGFyZ2UsICB0byAgYW55IHBlcnNvbgojIG9idGFpbmluZyBhICBjb3B5IG9mICB0aGlzIHNvZnR3YXJlICBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCiMgZmlsZXMgICh0aGUgICJTb2Z0d2FyZSIpLCAgdG8gICBkZWFsICBpbiAgdGhlICBTb2Z0d2FyZSAgIHdpdGhvdXQKIyByZXN0cmljdGlvbiwgIGluY2x1ZGluZyAgd2l0aG91dCBsaW1pdGF0aW9uICB0aGUgIHJpZ2h0cyB0byAgdXNlLAojIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCiMgY29waWVzICBvZiAgdGhlICBTb2Z0d2FyZSwgIGFuZCB0byAgcGVybWl0ICBwZXJzb25zICB0byAgd2hvbSB0aGUKIyBTb2Z0d2FyZSAgaXMgIGZ1cm5pc2hlZCAgdG8gIGRvICBzbywgIHN1YmplY3QgIHRvICB0aGUgIGZvbGxvd2luZwojIGNvbmRpdGlvbnM6CiMKIyBUaGUgYWJvdmUgY29weXJpZ2h0ICBub3RpY2UgYW5kIHRoaXMgIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsICBiZQojIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgojCiMgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyAgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSAgS0lORCwKIyBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyAgQlVUIE5PVCBMSU1JVEVEIFRPICBUSEUgV0FSUkFOVElFUwojIE9GICBNRVJDSEFOVEFCSUxJVFksICBGSVRORVNTICAgRk9SICBBICBQQVJUSUNVTEFSICAgUFVSUE9TRSAgQU5ECiMgTk9OSU5GUklOR0VNRU5ULiAgSU4gIE5PICBFVkVOVCBTSEFMTCAgVEhFICBBVVRIT1JTICBPUiBDT1BZUklHSFQKIyBIT0xERVJTICBCRSBMSUFCTEUgIEZPUiBBTlkgIENMQUlNLCBEQU1BR0VTICBPUiBPVEhFUiAgTElBQklMSVRZLAojIFdIRVRIRVIgIElOIEFOICBBQ1RJT04gT0YgIENPTlRSQUNULCBUT1JUICBPUiBPVEhFUldJU0UsICBBUklTSU5HCiMgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgojIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KIwoiIiJSZWFkIGZyb20gYW5kIHdyaXRlIHRvIHRhciBmb3JtYXQgYXJjaGl2ZXMuCiIiIgoKX192ZXJzaW9uX18gPSAiJFJldmlzaW9uJCIKIyAkU291cmNlJAoKdmVyc2lvbiAgICAgPSAiMC42LjQiCl9fYXV0aG9yX18gID0gIkxhcnMgR3VzdORiZWwgKGxhcnNAZ3VzdGFlYmVsLmRlKSIKX19kYXRlX18gICAgPSAiJERhdGUkIgpfX2N2c2lkX18gICA9ICIkSWQkIgpfX2NyZWRpdHNfXyA9ICJHdXN0YXZvIE5pZW1leWVyLCBOaWVscyBHdXN05GJlbCwgUmljaGFyZCBUb3duc2VuZC4iCgojLS0tLS0tLS0tCiMgSW1wb3J0cwojLS0tLS0tLS0tCmltcG9ydCBzeXMKaW1wb3J0IG9zCmltcG9ydCBzaHV0aWwKaW1wb3J0IHN0YXQKaW1wb3J0IGVycm5vCmltcG9ydCB0aW1lCmltcG9ydCBzdHJ1Y3QKCmlmIHN5cy5wbGF0Zm9ybSA9PSAnbWFjJzoKICAgICMgVGhpcyBtb2R1bGUgbmVlZHMgd29yayBmb3IgTWFjT1M5LCBlc3BlY2lhbGx5IGluIHRoZSBhcmVhIG9mIHBhdGhuYW1lCiAgICAjIGhhbmRsaW5nLiBJbiBtYW55IHBsYWNlcyBpdCBpcyBhc3N1bWVkIGEgc2ltcGxlIHN1YnN0aXR1dGlvbiBvZiAvIGJ5IHRoZQogICAgIyBsb2NhbCBvcy5wYXRoLnNlcCBpcyBnb29kIGVub3VnaCB0byBjb252ZXJ0IHBhdGhuYW1lcywgYnV0IHRoaXMgZG9lcyBub3QKICAgICMgd29yayB3aXRoIHRoZSBtYWMgcm9vdGVkOnBhdGg6bmFtZSB2ZXJzdXMgOm5vbnJvb3RlZDpwYXRoOm5hbWUgc3ludGF4CiAgICByYWlzZSBJbXBvcnRFcnJvciwgInRhcmZpbGUgZG9lcyBub3Qgd29yayBmb3IgcGxhdGZvcm09PW1hYyIKCnRyeToKICAgIGltcG9ydCBncnAsIHB3ZApleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBncnAgPSBwd2QgPSBOb25lCgojIGZyb20gdGFyZmlsZSBpbXBvcnQgKgpfX2FsbF9fID0gWyJUYXJGaWxlIiwgIlRhckluZm8iLCAiaXNfdGFyZmlsZSIsICJUYXJFcnJvciJdCgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgdGFyIGNvbnN0YW50cwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCk5VTCAgICAgICAgPSAiXDAiICAgICAgICAgICAgICAgIyB0aGUgbnVsbCBjaGFyYWN0ZXIKQkxPQ0tTSVpFICA9IDUxMiAgICAgICAgICAgICAgICAjIGxlbmd0aCBvZiBwcm9jZXNzaW5nIGJsb2NrcwpSRUNPUkRTSVpFID0gQkxPQ0tTSVpFICogMjAgICAgICMgbGVuZ3RoIG9mIHJlY29yZHMKTUFHSUMgICAgICA9ICJ1c3RhciIgICAgICAgICAgICAjIG1hZ2ljIHRhciBzdHJpbmcKVkVSU0lPTiAgICA9ICIwMCIgICAgICAgICAgICAgICAjIHZlcnNpb24gbnVtYmVyCgpMRU5HVEhfTkFNRSAgICA9IDEwMCAgICAgICAgICAgICMgbWF4aW11bSBsZW5ndGggb2YgYSBmaWxlbmFtZQpMRU5HVEhfTElOSyAgICA9IDEwMCAgICAgICAgICAgICMgbWF4aW11bSBsZW5ndGggb2YgYSBsaW5rbmFtZQpMRU5HVEhfUFJFRklYICA9IDE1NSAgICAgICAgICAgICMgbWF4aW11bSBsZW5ndGggb2YgdGhlIHByZWZpeCBmaWVsZApNQVhTSVpFX01FTUJFUiA9IDA3Nzc3Nzc3Nzc3N0wgICMgbWF4aW11bSBzaXplIG9mIGEgZmlsZSAoMTEgb2N0YWwgZGlnaXRzKQoKUkVHVFlQRSAgPSAiMCIgICAgICAgICAgICAgICAgICAjIHJlZ3VsYXIgZmlsZQpBUkVHVFlQRSA9ICJcMCIgICAgICAgICAgICAgICAgICMgcmVndWxhciBmaWxlCkxOS1RZUEUgID0gIjEiICAgICAgICAgICAgICAgICAgIyBsaW5rIChpbnNpZGUgdGFyZmlsZSkKU1lNVFlQRSAgPSAiMiIgICAgICAgICAgICAgICAgICAjIHN5bWJvbGljIGxpbmsKQ0hSVFlQRSAgPSAiMyIgICAgICAgICAgICAgICAgICAjIGNoYXJhY3RlciBzcGVjaWFsIGRldmljZQpCTEtUWVBFICA9ICI0IiAgICAgICAgICAgICAgICAgICMgYmxvY2sgc3BlY2lhbCBkZXZpY2UKRElSVFlQRSAgPSAiNSIgICAgICAgICAgICAgICAgICAjIGRpcmVjdG9yeQpGSUZPVFlQRSA9ICI2IiAgICAgICAgICAgICAgICAgICMgZmlmbyBzcGVjaWFsIGRldmljZQpDT05UVFlQRSA9ICI3IiAgICAgICAgICAgICAgICAgICMgY29udGlndW91cyBmaWxlCgpHTlVUWVBFX0xPTkdOQU1FID0gIkwiICAgICAgICAgICMgR05VIHRhciBleHRlbnNpb24gZm9yIGxvbmduYW1lcwpHTlVUWVBFX0xPTkdMSU5LID0gIksiICAgICAgICAgICMgR05VIHRhciBleHRlbnNpb24gZm9yIGxvbmdsaW5rCkdOVVRZUEVfU1BBUlNFICAgPSAiUyIgICAgICAgICAgIyBHTlUgdGFyIGV4dGVuc2lvbiBmb3Igc3BhcnNlIGZpbGUKCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyB0YXJmaWxlIGNvbnN0YW50cwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClNVUFBPUlRFRF9UWVBFUyA9IChSRUdUWVBFLCBBUkVHVFlQRSwgTE5LVFlQRSwgICMgZmlsZSB0eXBlcyB0aGF0IHRhcmZpbGUKICAgICAgICAgICAgICAgICAgIFNZTVRZUEUsIERJUlRZUEUsIEZJRk9UWVBFLCAgIyBjYW4gY29wZSB3aXRoLgogICAgICAgICAgICAgICAgICAgQ09OVFRZUEUsIENIUlRZUEUsIEJMS1RZUEUsCiAgICAgICAgICAgICAgICAgICBHTlVUWVBFX0xPTkdOQU1FLCBHTlVUWVBFX0xPTkdMSU5LLAogICAgICAgICAgICAgICAgICAgR05VVFlQRV9TUEFSU0UpCgpSRUdVTEFSX1RZUEVTID0gKFJFR1RZUEUsIEFSRUdUWVBFLCAgICAgICAgICAgICAjIGZpbGUgdHlwZXMgdGhhdCBzb21laG93CiAgICAgICAgICAgICAgICAgQ09OVFRZUEUsIEdOVVRZUEVfU1BBUlNFKSAgICAgICMgcmVwcmVzZW50IHJlZ3VsYXIgZmlsZXMKCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBCaXRzIHVzZWQgaW4gdGhlIG1vZGUgZmllbGQsIHZhbHVlcyBpbiBvY3RhbC4KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpTX0lGTE5LID0gMDEyMDAwMCAgICAgICAgIyBzeW1ib2xpYyBsaW5rClNfSUZSRUcgPSAwMTAwMDAwICAgICAgICAjIHJlZ3VsYXIgZmlsZQpTX0lGQkxLID0gMDA2MDAwMCAgICAgICAgIyBibG9jayBkZXZpY2UKU19JRkRJUiA9IDAwNDAwMDAgICAgICAgICMgZGlyZWN0b3J5ClNfSUZDSFIgPSAwMDIwMDAwICAgICAgICAjIGNoYXJhY3RlciBkZXZpY2UKU19JRklGTyA9IDAwMTAwMDAgICAgICAgICMgZmlmbwoKVFNVSUQgICA9IDA0MDAwICAgICAgICAgICMgc2V0IFVJRCBvbiBleGVjdXRpb24KVFNHSUQgICA9IDAyMDAwICAgICAgICAgICMgc2V0IEdJRCBvbiBleGVjdXRpb24KVFNWVFggICA9IDAxMDAwICAgICAgICAgICMgcmVzZXJ2ZWQKClRVUkVBRCAgPSAwNDAwICAgICAgICAgICAjIHJlYWQgYnkgb3duZXIKVFVXUklURSA9IDAyMDAgICAgICAgICAgICMgd3JpdGUgYnkgb3duZXIKVFVFWEVDICA9IDAxMDAgICAgICAgICAgICMgZXhlY3V0ZS9zZWFyY2ggYnkgb3duZXIKVEdSRUFEICA9IDAwNDAgICAgICAgICAgICMgcmVhZCBieSBncm91cApUR1dSSVRFID0gMDAyMCAgICAgICAgICAgIyB3cml0ZSBieSBncm91cApUR0VYRUMgID0gMDAxMCAgICAgICAgICAgIyBleGVjdXRlL3NlYXJjaCBieSBncm91cApUT1JFQUQgID0gMDAwNCAgICAgICAgICAgIyByZWFkIGJ5IG90aGVyClRPV1JJVEUgPSAwMDAyICAgICAgICAgICAjIHdyaXRlIGJ5IG90aGVyClRPRVhFQyAgPSAwMDAxICAgICAgICAgICAjIGV4ZWN1dGUvc2VhcmNoIGJ5IG90aGVyCgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgU29tZSB1c2VmdWwgZnVuY3Rpb25zCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGVmIG50cyhzKToKICAgICIiIkNvbnZlcnQgYSBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nIGJ1ZmZlciB0byBhIHB5dGhvbiBzdHJpbmcuCiAgICAiIiIKICAgIHJldHVybiBzLnJzdHJpcChOVUwpCgpkZWYgY2FsY19jaGtzdW0oYnVmKToKICAgICIiIkNhbGN1bGF0ZSB0aGUgY2hlY2tzdW0gZm9yIGEgbWVtYmVyJ3MgaGVhZGVyLiBJdCdzIGEgc2ltcGxlIGFkZGl0aW9uCiAgICAgICBvZiBhbGwgYnl0ZXMsIHRyZWF0aW5nIHRoZSBjaGtzdW0gZmllbGQgYXMgaWYgZmlsbGVkIHdpdGggc3BhY2VzLgogICAgICAgYnVmIGlzIGEgNTEyIGJ5dGUgbG9uZyBzdHJpbmcgYnVmZmVyIHdoaWNoIGhvbGRzIHRoZSBoZWFkZXIuCiAgICAiIiIKICAgIGNoayA9IDI1NiAgICAgICAgICAgICAgICAgICAgICAgICAgICMgY2hrc3VtIGZpZWxkIGlzIHRyZWF0ZWQgYXMgYmxhbmtzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBzbyB0aGUgaW5pdGlhbCB2YWx1ZSBpcyA4ICogb3JkKCIgIikKICAgIGZvciBjIGluIGJ1Zls6MTQ4XTogY2hrICs9IG9yZChjKSAgICMgc3VtIHVwIGFsbCBieXRlcyBiZWZvcmUgY2hrc3VtCiAgICBmb3IgYyBpbiBidWZbMTU2Ol06IGNoayArPSBvcmQoYykgICAjIHN1bSB1cCBhbGwgYnl0ZXMgYWZ0ZXIgY2hrc3VtCiAgICByZXR1cm4gY2hrCgpkZWYgY29weWZpbGVvYmooc3JjLCBkc3QsIGxlbmd0aD1Ob25lKToKICAgICIiIkNvcHkgbGVuZ3RoIGJ5dGVzIGZyb20gZmlsZW9iaiBzcmMgdG8gZmlsZW9iaiBkc3QuCiAgICAgICBJZiBsZW5ndGggaXMgTm9uZSwgY29weSB0aGUgZW50aXJlIGNvbnRlbnQuCiAgICAiIiIKICAgIGlmIGxlbmd0aCA9PSAwOgogICAgICAgIHJldHVybgogICAgaWYgbGVuZ3RoIGlzIE5vbmU6CiAgICAgICAgc2h1dGlsLmNvcHlmaWxlb2JqKHNyYywgZHN0KQogICAgICAgIHJldHVybgoKICAgIEJVRlNJWkUgPSAxNiAqIDEwMjQKICAgIGJsb2NrcywgcmVtYWluZGVyID0gZGl2bW9kKGxlbmd0aCwgQlVGU0laRSkKICAgIGZvciBiIGluIHhyYW5nZShibG9ja3MpOgogICAgICAgIGJ1ZiA9IHNyYy5yZWFkKEJVRlNJWkUpCiAgICAgICAgaWYgbGVuKGJ1ZikgPCBCVUZTSVpFOgogICAgICAgICAgICByYWlzZSBJT0Vycm9yLCAiZW5kIG9mIGZpbGUgcmVhY2hlZCIKICAgICAgICBkc3Qud3JpdGUoYnVmKQoKICAgIGlmIHJlbWFpbmRlciAhPSAwOgogICAgICAgIGJ1ZiA9IHNyYy5yZWFkKHJlbWFpbmRlcikKICAgICAgICBpZiBsZW4oYnVmKSA8IHJlbWFpbmRlcjoKICAgICAgICAgICAgcmFpc2UgSU9FcnJvciwgImVuZCBvZiBmaWxlIHJlYWNoZWQiCiAgICAgICAgZHN0LndyaXRlKGJ1ZikKICAgIHJldHVybgoKZmlsZW1vZGVfdGFibGUgPSAoCiAgICAoU19JRkxOSywgImwiLAogICAgIFNfSUZSRUcsICItIiwKICAgICBTX0lGQkxLLCAiYiIsCiAgICAgU19JRkRJUiwgImQiLAogICAgIFNfSUZDSFIsICJjIiwKICAgICBTX0lGSUZPLCAicCIpLAogICAgKFRVUkVBRCwgICJyIiksCiAgICAoVFVXUklURSwgInciKSwKICAgIChUVUVYRUMsICAieCIsIFRTVUlELCAiUyIsIFRVRVhFQ3xUU1VJRCwgInMiKSwKICAgIChUR1JFQUQsICAiciIpLAogICAgKFRHV1JJVEUsICJ3IiksCiAgICAoVEdFWEVDLCAgIngiLCBUU0dJRCwgIlMiLCBUR0VYRUN8VFNHSUQsICJzIiksCiAgICAoVE9SRUFELCAgInIiKSwKICAgIChUT1dSSVRFLCAidyIpLAogICAgKFRPRVhFQywgICJ4IiwgVFNWVFgsICJUIiwgVE9FWEVDfFRTVlRYLCAidCIpKQoKZGVmIGZpbGVtb2RlKG1vZGUpOgogICAgIiIiQ29udmVydCBhIGZpbGUncyBtb2RlIHRvIGEgc3RyaW5nIG9mIHRoZSBmb3JtCiAgICAgICAtcnd4cnd4cnd4LgogICAgICAgVXNlZCBieSBUYXJGaWxlLmxpc3QoKQogICAgIiIiCiAgICBzID0gIiIKICAgIGZvciB0IGluIGZpbGVtb2RlX3RhYmxlOgogICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgIGlmIG1vZGUgJiB0WzBdID09IHRbMF06CiAgICAgICAgICAgICAgICBzICs9IHRbMV0KICAgICAgICAgICAgZWxpZiBsZW4odCkgPiAyOgogICAgICAgICAgICAgICAgdCA9IHRbMjpdCiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcyArPSAiLSIKICAgICAgICAgICAgYnJlYWsKICAgIHJldHVybiBzCgppZiBvcy5zZXAgIT0gIi8iOgogICAgbm9ybXBhdGggPSBsYW1iZGEgcGF0aDogb3MucGF0aC5ub3JtcGF0aChwYXRoKS5yZXBsYWNlKG9zLnNlcCwgIi8iKQplbHNlOgogICAgbm9ybXBhdGggPSBvcy5wYXRoLm5vcm1wYXRoCgpjbGFzcyBUYXJFcnJvcihFeGNlcHRpb24pOgogICAgIiIiQmFzZSBleGNlcHRpb24uIiIiCiAgICBwYXNzCmNsYXNzIEV4dHJhY3RFcnJvcihUYXJFcnJvcik6CiAgICAiIiJHZW5lcmFsIGV4Y2VwdGlvbiBmb3IgZXh0cmFjdCBlcnJvcnMuIiIiCiAgICBwYXNzCmNsYXNzIFJlYWRFcnJvcihUYXJFcnJvcik6CiAgICAiIiJFeGNlcHRpb24gZm9yIHVucmVhZGJsZSB0YXIgYXJjaGl2ZXMuIiIiCiAgICBwYXNzCmNsYXNzIENvbXByZXNzaW9uRXJyb3IoVGFyRXJyb3IpOgogICAgIiIiRXhjZXB0aW9uIGZvciB1bmF2YWlsYWJsZSBjb21wcmVzc2lvbiBtZXRob2RzLiIiIgogICAgcGFzcwpjbGFzcyBTdHJlYW1FcnJvcihUYXJFcnJvcik6CiAgICAiIiJFeGNlcHRpb24gZm9yIHVuc3VwcG9ydGVkIG9wZXJhdGlvbnMgb24gc3RyZWFtLWxpa2UgVGFyRmlsZXMuIiIiCiAgICBwYXNzCgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgaW50ZXJuYWwgc3RyZWFtIGludGVyZmFjZQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmNsYXNzIF9Mb3dMZXZlbEZpbGU6CiAgICAiIiJMb3ctbGV2ZWwgZmlsZSBvYmplY3QuIFN1cHBvcnRzIHJlYWRpbmcgYW5kIHdyaXRpbmcuCiAgICAgICBJdCBpcyB1c2VkIGluc3RlYWQgb2YgYSByZWd1bGFyIGZpbGUgb2JqZWN0IGZvciBzdHJlYW1pbmcKICAgICAgIGFjY2Vzcy4KICAgICIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCBtb2RlKToKICAgICAgICBtb2RlID0gewogICAgICAgICAgICAiciI6IG9zLk9fUkRPTkxZLAogICAgICAgICAgICAidyI6IG9zLk9fV1JPTkxZIHwgb3MuT19DUkVBVCB8IG9zLk9fVFJVTkMsCiAgICAgICAgfVttb2RlXQogICAgICAgIGlmIGhhc2F0dHIob3MsICJPX0JJTkFSWSIpOgogICAgICAgICAgICBtb2RlIHw9IG9zLk9fQklOQVJZCiAgICAgICAgc2VsZi5mZCA9IG9zLm9wZW4obmFtZSwgbW9kZSkKCiAgICBkZWYgY2xvc2Uoc2VsZik6CiAgICAgICAgb3MuY2xvc2Uoc2VsZi5mZCkKCiAgICBkZWYgcmVhZChzZWxmLCBzaXplKToKICAgICAgICByZXR1cm4gb3MucmVhZChzZWxmLmZkLCBzaXplKQoKICAgIGRlZiB3cml0ZShzZWxmLCBzKToKICAgICAgICBvcy53cml0ZShzZWxmLmZkLCBzKQoKY2xhc3MgX1N0cmVhbToKICAgICIiIkNsYXNzIHRoYXQgc2VydmVzIGFzIGFuIGFkYXB0ZXIgYmV0d2VlbiBUYXJGaWxlIGFuZAogICAgICAgYSBzdHJlYW0tbGlrZSBvYmplY3QuICBUaGUgc3RyZWFtLWxpa2Ugb2JqZWN0IG9ubHkKICAgICAgIG5lZWRzIHRvIGhhdmUgYSByZWFkKCkgb3Igd3JpdGUoKSBtZXRob2QgYW5kIGlzIGFjY2Vzc2VkCiAgICAgICBibG9ja3dpc2UuICBVc2Ugb2YgZ3ppcCBvciBiemlwMiBjb21wcmVzc2lvbiBpcyBwb3NzaWJsZS4KICAgICAgIEEgc3RyZWFtLWxpa2Ugb2JqZWN0IGNvdWxkIGJlIGZvciBleGFtcGxlOiBzeXMuc3RkaW4sCiAgICAgICBzeXMuc3Rkb3V0LCBhIHNvY2tldCwgYSB0YXBlIGRldmljZSBldGMuCgogICAgICAgX1N0cmVhbSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9ubHkgaW50ZXJuYWxseS4KICAgICIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCBtb2RlLCB0eXBlLCBmaWxlb2JqLCBidWZzaXplKToKICAgICAgICAiIiJDb25zdHJ1Y3QgYSBfU3RyZWFtIG9iamVjdC4KICAgICAgICAiIiIKICAgICAgICBzZWxmLl9leHRmaWxlb2JqID0gVHJ1ZQogICAgICAgIGlmIGZpbGVvYmogaXMgTm9uZToKICAgICAgICAgICAgZmlsZW9iaiA9IF9Mb3dMZXZlbEZpbGUobmFtZSwgbW9kZSkKICAgICAgICAgICAgc2VsZi5fZXh0ZmlsZW9iaiA9IEZhbHNlCgogICAgICAgIHNlbGYubmFtZSAgICA9IG5hbWUgb3IgIiIKICAgICAgICBzZWxmLm1vZGUgICAgPSBtb2RlCiAgICAgICAgc2VsZi50eXBlICAgID0gdHlwZQogICAgICAgIHNlbGYuZmlsZW9iaiA9IGZpbGVvYmoKICAgICAgICBzZWxmLmJ1ZnNpemUgPSBidWZzaXplCiAgICAgICAgc2VsZi5idWYgICAgID0gIiIKICAgICAgICBzZWxmLnBvcyAgICAgPSAwTAogICAgICAgIHNlbGYuY2xvc2VkICA9IEZhbHNlCgogICAgICAgIGlmIHR5cGUgPT0gImd6IjoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgaW1wb3J0IHpsaWIKICAgICAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgICAgICAgICAgcmFpc2UgQ29tcHJlc3Npb25FcnJvciwgInpsaWIgbW9kdWxlIGlzIG5vdCBhdmFpbGFibGUiCiAgICAgICAgICAgIHNlbGYuemxpYiA9IHpsaWIKICAgICAgICAgICAgc2VsZi5jcmMgPSB6bGliLmNyYzMyKCIiKQogICAgICAgICAgICBpZiBtb2RlID09ICJyIjoKICAgICAgICAgICAgICAgIHNlbGYuX2luaXRfcmVhZF9neigpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLl9pbml0X3dyaXRlX2d6KCkKCiAgICAgICAgaWYgdHlwZSA9PSAiYnoyIjoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgaW1wb3J0IGJ6MgogICAgICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgICAgICAgICByYWlzZSBDb21wcmVzc2lvbkVycm9yLCAiYnoyIG1vZHVsZSBpcyBub3QgYXZhaWxhYmxlIgogICAgICAgICAgICBpZiBtb2RlID09ICJyIjoKICAgICAgICAgICAgICAgIHNlbGYuZGJ1ZiA9ICIiCiAgICAgICAgICAgICAgICBzZWxmLmNtcCA9IGJ6Mi5CWjJEZWNvbXByZXNzb3IoKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2VsZi5jbXAgPSBiejIuQloyQ29tcHJlc3NvcigpCgogICAgZGVmIF9fZGVsX18oc2VsZik6CiAgICAgICAgaWYgbm90IHNlbGYuY2xvc2VkOgogICAgICAgICAgICBzZWxmLmNsb3NlKCkKCiAgICBkZWYgX2luaXRfd3JpdGVfZ3ooc2VsZik6CiAgICAgICAgIiIiSW5pdGlhbGl6ZSBmb3Igd3JpdGluZyB3aXRoIGd6aXAgY29tcHJlc3Npb24uCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5jbXAgPSBzZWxmLnpsaWIuY29tcHJlc3NvYmooOSwgc2VsZi56bGliLkRFRkxBVEVELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1zZWxmLnpsaWIuTUFYX1dCSVRTLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuemxpYi5ERUZfTUVNX0xFVkVMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApCiAgICAgICAgdGltZXN0YW1wID0gc3RydWN0LnBhY2soIjxMIiwgbG9uZyh0aW1lLnRpbWUoKSkpCiAgICAgICAgc2VsZi5fX3dyaXRlKCJcMDM3XDIxM1wwMTBcMDEwJXNcMDAyXDM3NyIgJSB0aW1lc3RhbXApCiAgICAgICAgaWYgc2VsZi5uYW1lLmVuZHN3aXRoKCIuZ3oiKToKICAgICAgICAgICAgc2VsZi5uYW1lID0gc2VsZi5uYW1lWzotM10KICAgICAgICBzZWxmLl9fd3JpdGUoc2VsZi5uYW1lICsgTlVMKQoKICAgIGRlZiB3cml0ZShzZWxmLCBzKToKICAgICAgICAiIiJXcml0ZSBzdHJpbmcgcyB0byB0aGUgc3RyZWFtLgogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYudHlwZSA9PSAiZ3oiOgogICAgICAgICAgICBzZWxmLmNyYyA9IHNlbGYuemxpYi5jcmMzMihzLCBzZWxmLmNyYykKICAgICAgICBzZWxmLnBvcyArPSBsZW4ocykKICAgICAgICBpZiBzZWxmLnR5cGUgIT0gInRhciI6CiAgICAgICAgICAgIHMgPSBzZWxmLmNtcC5jb21wcmVzcyhzKQogICAgICAgIHNlbGYuX193cml0ZShzKQoKICAgIGRlZiBfX3dyaXRlKHNlbGYsIHMpOgogICAgICAgICIiIldyaXRlIHN0cmluZyBzIHRvIHRoZSBzdHJlYW0gaWYgYSB3aG9sZSBuZXcgYmxvY2sKICAgICAgICAgICBpcyByZWFkeSB0byBiZSB3cml0dGVuLgogICAgICAgICIiIgogICAgICAgIHNlbGYuYnVmICs9IHMKICAgICAgICB3aGlsZSBsZW4oc2VsZi5idWYpID4gc2VsZi5idWZzaXplOgogICAgICAgICAgICBzZWxmLmZpbGVvYmoud3JpdGUoc2VsZi5idWZbOnNlbGYuYnVmc2l6ZV0pCiAgICAgICAgICAgIHNlbGYuYnVmID0gc2VsZi5idWZbc2VsZi5idWZzaXplOl0KCiAgICBkZWYgY2xvc2Uoc2VsZik6CiAgICAgICAgIiIiQ2xvc2UgdGhlIF9TdHJlYW0gb2JqZWN0LiBObyBvcGVyYXRpb24gc2hvdWxkIGJlCiAgICAgICAgICAgZG9uZSBvbiBpdCBhZnRlcndhcmRzLgogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYuY2xvc2VkOgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgaWYgc2VsZi5tb2RlID09ICJ3IiBhbmQgc2VsZi50eXBlICE9ICJ0YXIiOgogICAgICAgICAgICBzZWxmLmJ1ZiArPSBzZWxmLmNtcC5mbHVzaCgpCiAgICAgICAgaWYgc2VsZi5tb2RlID09ICJ3IiBhbmQgc2VsZi5idWY6CiAgICAgICAgICAgIHNlbGYuZmlsZW9iai53cml0ZShzZWxmLmJ1ZikKICAgICAgICAgICAgc2VsZi5idWYgPSAiIgogICAgICAgICAgICBpZiBzZWxmLnR5cGUgPT0gImd6IjoKICAgICAgICAgICAgICAgIHNlbGYuZmlsZW9iai53cml0ZShzdHJ1Y3QucGFjaygiPGwiLCBzZWxmLmNyYykpCiAgICAgICAgICAgICAgICBzZWxmLmZpbGVvYmoud3JpdGUoc3RydWN0LnBhY2soIjxMIiwgc2VsZi5wb3MgJiAweGZmZmZGRkZGTCkpCgogICAgICAgIGlmIG5vdCBzZWxmLl9leHRmaWxlb2JqOgogICAgICAgICAgICBzZWxmLmZpbGVvYmouY2xvc2UoKQoKICAgICAgICBzZWxmLmNsb3NlZCA9IFRydWUKCiAgICBkZWYgX2luaXRfcmVhZF9neihzZWxmKToKICAgICAgICAiIiJJbml0aWFsaXplIGZvciByZWFkaW5nIGEgZ3ppcCBjb21wcmVzc2VkIGZpbGVvYmouCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5jbXAgPSBzZWxmLnpsaWIuZGVjb21wcmVzc29iaigtc2VsZi56bGliLk1BWF9XQklUUykKICAgICAgICBzZWxmLmRidWYgPSAiIgoKICAgICAgICAjIHRha2VuIGZyb20gZ3ppcC5HemlwRmlsZSB3aXRoIHNvbWUgYWx0ZXJhdGlvbnMKICAgICAgICBpZiBzZWxmLl9fcmVhZCgyKSAhPSAiXDAzN1wyMTMiOgogICAgICAgICAgICByYWlzZSBSZWFkRXJyb3IsICJub3QgYSBnemlwIGZpbGUiCiAgICAgICAgaWYgc2VsZi5fX3JlYWQoMSkgIT0gIlwwMTAiOgogICAgICAgICAgICByYWlzZSBDb21wcmVzc2lvbkVycm9yLCAidW5zdXBwb3J0ZWQgY29tcHJlc3Npb24gbWV0aG9kIgoKICAgICAgICBmbGFnID0gb3JkKHNlbGYuX19yZWFkKDEpKQogICAgICAgIHNlbGYuX19yZWFkKDYpCgogICAgICAgIGlmIGZsYWcgJiA0OgogICAgICAgICAgICB4bGVuID0gb3JkKHNlbGYuX19yZWFkKDEpKSArIDI1NiAqIG9yZChzZWxmLl9fcmVhZCgxKSkKICAgICAgICAgICAgc2VsZi5yZWFkKHhsZW4pCiAgICAgICAgaWYgZmxhZyAmIDg6CiAgICAgICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgICAgICBzID0gc2VsZi5fX3JlYWQoMSkKICAgICAgICAgICAgICAgIGlmIG5vdCBzIG9yIHMgPT0gTlVMOgogICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgaWYgZmxhZyAmIDE2OgogICAgICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICAgICAgcyA9IHNlbGYuX19yZWFkKDEpCiAgICAgICAgICAgICAgICBpZiBub3QgcyBvciBzID09IE5VTDoKICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgIGlmIGZsYWcgJiAyOgogICAgICAgICAgICBzZWxmLl9fcmVhZCgyKQoKICAgIGRlZiB0ZWxsKHNlbGYpOgogICAgICAgICIiIlJldHVybiB0aGUgc3RyZWFtJ3MgZmlsZSBwb2ludGVyIHBvc2l0aW9uLgogICAgICAgICIiIgogICAgICAgIHJldHVybiBzZWxmLnBvcwoKICAgIGRlZiBzZWVrKHNlbGYsIHBvcz0wKToKICAgICAgICAiIiJTZXQgdGhlIHN0cmVhbSdzIGZpbGUgcG9pbnRlciB0byBwb3MuIE5lZ2F0aXZlIHNlZWtpbmcKICAgICAgICAgICBpcyBmb3JiaWRkZW4uCiAgICAgICAgIiIiCiAgICAgICAgaWYgcG9zIC0gc2VsZi5wb3MgPj0gMDoKICAgICAgICAgICAgYmxvY2tzLCByZW1haW5kZXIgPSBkaXZtb2QocG9zIC0gc2VsZi5wb3MsIHNlbGYuYnVmc2l6ZSkKICAgICAgICAgICAgZm9yIGkgaW4geHJhbmdlKGJsb2Nrcyk6CiAgICAgICAgICAgICAgICBzZWxmLnJlYWQoc2VsZi5idWZzaXplKQogICAgICAgICAgICBzZWxmLnJlYWQocmVtYWluZGVyKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJhaXNlIFN0cmVhbUVycm9yLCAic2Vla2luZyBiYWNrd2FyZHMgaXMgbm90IGFsbG93ZWQiCiAgICAgICAgcmV0dXJuIHNlbGYucG9zCgogICAgZGVmIHJlYWQoc2VsZiwgc2l6ZT1Ob25lKToKICAgICAgICAiIiJSZXR1cm4gdGhlIG5leHQgc2l6ZSBudW1iZXIgb2YgYnl0ZXMgZnJvbSB0aGUgc3RyZWFtLgogICAgICAgICAgIElmIHNpemUgaXMgbm90IGRlZmluZWQsIHJldHVybiBhbGwgYnl0ZXMgb2YgdGhlIHN0cmVhbQogICAgICAgICAgIHVwIHRvIEVPRi4KICAgICAgICAiIiIKICAgICAgICBpZiBzaXplIGlzIE5vbmU6CiAgICAgICAgICAgIHQgPSBbXQogICAgICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICAgICAgYnVmID0gc2VsZi5fcmVhZChzZWxmLmJ1ZnNpemUpCiAgICAgICAgICAgICAgICBpZiBub3QgYnVmOgogICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICB0LmFwcGVuZChidWYpCiAgICAgICAgICAgIGJ1ZiA9ICIiLmpvaW4odCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBidWYgPSBzZWxmLl9yZWFkKHNpemUpCiAgICAgICAgc2VsZi5wb3MgKz0gbGVuKGJ1ZikKICAgICAgICByZXR1cm4gYnVmCgogICAgZGVmIF9yZWFkKHNlbGYsIHNpemUpOgogICAgICAgICIiIlJldHVybiBzaXplIGJ5dGVzIGZyb20gdGhlIHN0cmVhbS4KICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLnR5cGUgPT0gInRhciI6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9fcmVhZChzaXplKQoKICAgICAgICBjID0gbGVuKHNlbGYuZGJ1ZikKICAgICAgICB0ID0gW3NlbGYuZGJ1Zl0KICAgICAgICB3aGlsZSBjIDwgc2l6ZToKICAgICAgICAgICAgYnVmID0gc2VsZi5fX3JlYWQoc2VsZi5idWZzaXplKQogICAgICAgICAgICBpZiBub3QgYnVmOgogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgYnVmID0gc2VsZi5jbXAuZGVjb21wcmVzcyhidWYpCiAgICAgICAgICAgIHQuYXBwZW5kKGJ1ZikKICAgICAgICAgICAgYyArPSBsZW4oYnVmKQogICAgICAgIHQgPSAiIi5qb2luKHQpCiAgICAgICAgc2VsZi5kYnVmID0gdFtzaXplOl0KICAgICAgICByZXR1cm4gdFs6c2l6ZV0KCiAgICBkZWYgX19yZWFkKHNlbGYsIHNpemUpOgogICAgICAgICIiIlJldHVybiBzaXplIGJ5dGVzIGZyb20gc3RyZWFtLiBJZiBpbnRlcm5hbCBidWZmZXIgaXMgZW1wdHksCiAgICAgICAgICAgcmVhZCBhbm90aGVyIGJsb2NrIGZyb20gdGhlIHN0cmVhbS4KICAgICAgICAiIiIKICAgICAgICBjID0gbGVuKHNlbGYuYnVmKQogICAgICAgIHQgPSBbc2VsZi5idWZdCiAgICAgICAgd2hpbGUgYyA8IHNpemU6CiAgICAgICAgICAgIGJ1ZiA9IHNlbGYuZmlsZW9iai5yZWFkKHNlbGYuYnVmc2l6ZSkKICAgICAgICAgICAgaWYgbm90IGJ1ZjoKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIHQuYXBwZW5kKGJ1ZikKICAgICAgICAgICAgYyArPSBsZW4oYnVmKQogICAgICAgIHQgPSAiIi5qb2luKHQpCiAgICAgICAgc2VsZi5idWYgPSB0W3NpemU6XQogICAgICAgIHJldHVybiB0WzpzaXplXQojIGNsYXNzIF9TdHJlYW0KCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBFeHRyYWN0aW9uIGZpbGUgb2JqZWN0CiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KY2xhc3MgRXhGaWxlT2JqZWN0KG9iamVjdCk6CiAgICAiIiJGaWxlLWxpa2Ugb2JqZWN0IGZvciByZWFkaW5nIGFuIGFyY2hpdmUgbWVtYmVyLgogICAgICAgSXMgcmV0dXJuZWQgYnkgVGFyRmlsZS5leHRyYWN0ZmlsZSgpLiBTdXBwb3J0IGZvcgogICAgICAgc3BhcnNlIGZpbGVzIGluY2x1ZGVkLgogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHRhcmZpbGUsIHRhcmluZm8pOgogICAgICAgIHNlbGYuZmlsZW9iaiA9IHRhcmZpbGUuZmlsZW9iagogICAgICAgIHNlbGYubmFtZSAgICA9IHRhcmluZm8ubmFtZQogICAgICAgIHNlbGYubW9kZSAgICA9ICJyIgogICAgICAgIHNlbGYuY2xvc2VkICA9IEZhbHNlCiAgICAgICAgc2VsZi5vZmZzZXQgID0gdGFyaW5mby5vZmZzZXRfZGF0YQogICAgICAgIHNlbGYuc2l6ZSAgICA9IHRhcmluZm8uc2l6ZQogICAgICAgIHNlbGYucG9zICAgICA9IDBMCiAgICAgICAgc2VsZi5saW5lYnVmZmVyID0gIiIKICAgICAgICBpZiB0YXJpbmZvLmlzc3BhcnNlKCk6CiAgICAgICAgICAgIHNlbGYuc3BhcnNlID0gdGFyaW5mby5zcGFyc2UKICAgICAgICAgICAgc2VsZi5yZWFkID0gc2VsZi5fcmVhZHNwYXJzZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYucmVhZCA9IHNlbGYuX3JlYWRub3JtYWwKCiAgICBkZWYgX19yZWFkKHNlbGYsIHNpemUpOgogICAgICAgICIiIk92ZXJsb2FkYWJsZSByZWFkIG1ldGhvZC4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gc2VsZi5maWxlb2JqLnJlYWQoc2l6ZSkKCiAgICBkZWYgcmVhZGxpbmUoc2VsZiwgc2l6ZT0tMSk6CiAgICAgICAgIiIiUmVhZCBhIGxpbmUgd2l0aCBhcHByb3guIHNpemUuIElmIHNpemUgaXMgbmVnYXRpdmUsCiAgICAgICAgICAgcmVhZCBhIHdob2xlIGxpbmUuIHJlYWRsaW5lKCkgYW5kIHJlYWQoKSBtdXN0IG5vdAogICAgICAgICAgIGJlIG1peGVkIHVwICghKS4KICAgICAgICAiIiIKICAgICAgICBpZiBzaXplIDwgMDoKICAgICAgICAgICAgc2l6ZSA9IHN5cy5tYXhpbnQKCiAgICAgICAgbmwgPSBzZWxmLmxpbmVidWZmZXIuZmluZCgiXG4iKQogICAgICAgIGlmIG5sID49IDA6CiAgICAgICAgICAgIG5sID0gbWluKG5sLCBzaXplKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNpemUgLT0gbGVuKHNlbGYubGluZWJ1ZmZlcikKICAgICAgICAgICAgd2hpbGUgKG5sIDwgMCBhbmQgc2l6ZSA+IDApOgogICAgICAgICAgICAgICAgYnVmID0gc2VsZi5yZWFkKG1pbihzaXplLCAxMDApKQogICAgICAgICAgICAgICAgaWYgbm90IGJ1ZjoKICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgc2VsZi5saW5lYnVmZmVyICs9IGJ1ZgogICAgICAgICAgICAgICAgc2l6ZSAtPSBsZW4oYnVmKQogICAgICAgICAgICAgICAgbmwgPSBzZWxmLmxpbmVidWZmZXIuZmluZCgiXG4iKQogICAgICAgICAgICBpZiBubCA9PSAtMToKICAgICAgICAgICAgICAgIHMgPSBzZWxmLmxpbmVidWZmZXIKICAgICAgICAgICAgICAgIHNlbGYubGluZWJ1ZmZlciA9ICIiCiAgICAgICAgICAgICAgICByZXR1cm4gcwogICAgICAgIGJ1ZiA9IHNlbGYubGluZWJ1ZmZlcls6bmxdCiAgICAgICAgc2VsZi5saW5lYnVmZmVyID0gc2VsZi5saW5lYnVmZmVyW25sICsgMTpdCiAgICAgICAgd2hpbGUgYnVmWy0xOl0gPT0gIlxyIjoKICAgICAgICAgICAgYnVmID0gYnVmWzotMV0KICAgICAgICByZXR1cm4gYnVmICsgIlxuIgoKICAgIGRlZiByZWFkbGluZXMoc2VsZik6CiAgICAgICAgIiIiUmV0dXJuIGEgbGlzdCB3aXRoIGFsbCAoZm9sbG93aW5nKSBsaW5lcy4KICAgICAgICAiIiIKICAgICAgICByZXN1bHQgPSBbXQogICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgIGxpbmUgPSBzZWxmLnJlYWRsaW5lKCkKICAgICAgICAgICAgaWYgbm90IGxpbmU6IGJyZWFrCiAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQobGluZSkKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgZGVmIF9yZWFkbm9ybWFsKHNlbGYsIHNpemU9Tm9uZSk6CiAgICAgICAgIiIiUmVhZCBvcGVyYXRpb24gZm9yIHJlZ3VsYXIgZmlsZXMuCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi5jbG9zZWQ6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICJmaWxlIGlzIGNsb3NlZCIKICAgICAgICBzZWxmLmZpbGVvYmouc2VlayhzZWxmLm9mZnNldCArIHNlbGYucG9zKQogICAgICAgIGJ5dGVzbGVmdCA9IHNlbGYuc2l6ZSAtIHNlbGYucG9zCiAgICAgICAgaWYgc2l6ZSBpcyBOb25lOgogICAgICAgICAgICBieXRlc3RvcmVhZCA9IGJ5dGVzbGVmdAogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGJ5dGVzdG9yZWFkID0gbWluKHNpemUsIGJ5dGVzbGVmdCkKICAgICAgICBzZWxmLnBvcyArPSBieXRlc3RvcmVhZAogICAgICAgIHJldHVybiBzZWxmLl9fcmVhZChieXRlc3RvcmVhZCkKCiAgICBkZWYgX3JlYWRzcGFyc2Uoc2VsZiwgc2l6ZT1Ob25lKToKICAgICAgICAiIiJSZWFkIG9wZXJhdGlvbiBmb3Igc3BhcnNlIGZpbGVzLgogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYuY2xvc2VkOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAiZmlsZSBpcyBjbG9zZWQiCgogICAgICAgIGlmIHNpemUgaXMgTm9uZToKICAgICAgICAgICAgc2l6ZSA9IHNlbGYuc2l6ZSAtIHNlbGYucG9zCgogICAgICAgIGRhdGEgPSBbXQogICAgICAgIHdoaWxlIHNpemUgPiAwOgogICAgICAgICAgICBidWYgPSBzZWxmLl9yZWFkc3BhcnNlc2VjdGlvbihzaXplKQogICAgICAgICAgICBpZiBub3QgYnVmOgogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgc2l6ZSAtPSBsZW4oYnVmKQogICAgICAgICAgICBkYXRhLmFwcGVuZChidWYpCiAgICAgICAgcmV0dXJuICIiLmpvaW4oZGF0YSkKCiAgICBkZWYgX3JlYWRzcGFyc2VzZWN0aW9uKHNlbGYsIHNpemUpOgogICAgICAgICIiIlJlYWQgYSBzaW5nbGUgc2VjdGlvbiBvZiBhIHNwYXJzZSBmaWxlLgogICAgICAgICIiIgogICAgICAgIHNlY3Rpb24gPSBzZWxmLnNwYXJzZS5maW5kKHNlbGYucG9zKQoKICAgICAgICBpZiBzZWN0aW9uIGlzIE5vbmU6CiAgICAgICAgICAgIHJldHVybiAiIgoKICAgICAgICB0b3JlYWQgPSBtaW4oc2l6ZSwgc2VjdGlvbi5vZmZzZXQgKyBzZWN0aW9uLnNpemUgLSBzZWxmLnBvcykKICAgICAgICBpZiBpc2luc3RhbmNlKHNlY3Rpb24sIF9kYXRhKToKICAgICAgICAgICAgcmVhbHBvcyA9IHNlY3Rpb24ucmVhbHBvcyArIHNlbGYucG9zIC0gc2VjdGlvbi5vZmZzZXQKICAgICAgICAgICAgc2VsZi5wb3MgKz0gdG9yZWFkCiAgICAgICAgICAgIHNlbGYuZmlsZW9iai5zZWVrKHNlbGYub2Zmc2V0ICsgcmVhbHBvcykKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX19yZWFkKHRvcmVhZCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLnBvcyArPSB0b3JlYWQKICAgICAgICAgICAgcmV0dXJuIE5VTCAqIHRvcmVhZAoKICAgIGRlZiB0ZWxsKHNlbGYpOgogICAgICAgICIiIlJldHVybiB0aGUgY3VycmVudCBmaWxlIHBvc2l0aW9uLgogICAgICAgICIiIgogICAgICAgIHJldHVybiBzZWxmLnBvcwoKICAgIGRlZiBzZWVrKHNlbGYsIHBvcywgd2hlbmNlPTApOgogICAgICAgICIiIlNlZWsgdG8gYSBwb3NpdGlvbiBpbiB0aGUgZmlsZS4KICAgICAgICAiIiIKICAgICAgICBzZWxmLmxpbmVidWZmZXIgPSAiIgogICAgICAgIGlmIHdoZW5jZSA9PSAwOgogICAgICAgICAgICBzZWxmLnBvcyA9IG1pbihtYXgocG9zLCAwKSwgc2VsZi5zaXplKQogICAgICAgIGlmIHdoZW5jZSA9PSAxOgogICAgICAgICAgICBpZiBwb3MgPCAwOgogICAgICAgICAgICAgICAgc2VsZi5wb3MgPSBtYXgoc2VsZi5wb3MgKyBwb3MsIDApCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLnBvcyA9IG1pbihzZWxmLnBvcyArIHBvcywgc2VsZi5zaXplKQogICAgICAgIGlmIHdoZW5jZSA9PSAyOgogICAgICAgICAgICBzZWxmLnBvcyA9IG1heChtaW4oc2VsZi5zaXplICsgcG9zLCBzZWxmLnNpemUpLCAwKQoKICAgIGRlZiBjbG9zZShzZWxmKToKICAgICAgICAiIiJDbG9zZSB0aGUgZmlsZSBvYmplY3QuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5jbG9zZWQgPSBUcnVlCiNjbGFzcyBFeEZpbGVPYmplY3QKCiMtLS0tLS0tLS0tLS0tLS0tLS0KIyBFeHBvcnRlZCBDbGFzc2VzCiMtLS0tLS0tLS0tLS0tLS0tLS0KY2xhc3MgVGFySW5mbyhvYmplY3QpOgogICAgIiIiSW5mb3JtYXRpb25hbCBjbGFzcyB3aGljaCBob2xkcyB0aGUgZGV0YWlscyBhYm91dCBhbgogICAgICAgYXJjaGl2ZSBtZW1iZXIgZ2l2ZW4gYnkgYSB0YXIgaGVhZGVyIGJsb2NrLgogICAgICAgVGFySW5mbyBvYmplY3RzIGFyZSByZXR1cm5lZCBieSBUYXJGaWxlLmdldG1lbWJlcigpLAogICAgICAgVGFyRmlsZS5nZXRtZW1iZXJzKCkgYW5kIFRhckZpbGUuZ2V0dGFyaW5mbygpIGFuZCBhcmUKICAgICAgIHVzdWFsbHkgY3JlYXRlZCBpbnRlcm5hbGx5LgogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWU9IiIpOgogICAgICAgICIiIkNvbnN0cnVjdCBhIFRhckluZm8gb2JqZWN0LiBuYW1lIGlzIHRoZSBvcHRpb25hbCBuYW1lCiAgICAgICAgICAgb2YgdGhlIG1lbWJlci4KICAgICAgICAiIiIKCiAgICAgICAgc2VsZi5uYW1lICAgICA9IG5hbWUgICAgICAgIyBtZW1iZXIgbmFtZSAoZGlybmFtZXMgbXVzdCBlbmQgd2l0aCAnLycpCiAgICAgICAgc2VsZi5tb2RlICAgICA9IDA2NjYgICAgICAgIyBmaWxlIHBlcm1pc3Npb25zCiAgICAgICAgc2VsZi51aWQgICAgICA9IDAgICAgICAgICAgIyB1c2VyIGlkCiAgICAgICAgc2VsZi5naWQgICAgICA9IDAgICAgICAgICAgIyBncm91cCBpZAogICAgICAgIHNlbGYuc2l6ZSAgICAgPSAwICAgICAgICAgICMgZmlsZSBzaXplCiAgICAgICAgc2VsZi5tdGltZSAgICA9IDAgICAgICAgICAgIyBtb2RpZmljYXRpb24gdGltZQogICAgICAgIHNlbGYuY2hrc3VtICAgPSAwICAgICAgICAgICMgaGVhZGVyIGNoZWNrc3VtCiAgICAgICAgc2VsZi50eXBlICAgICA9IFJFR1RZUEUgICAgIyBtZW1iZXIgdHlwZQogICAgICAgIHNlbGYubGlua25hbWUgPSAiIiAgICAgICAgICMgbGluayBuYW1lCiAgICAgICAgc2VsZi51bmFtZSAgICA9ICJ1c2VyIiAgICAgIyB1c2VyIG5hbWUKICAgICAgICBzZWxmLmduYW1lICAgID0gImdyb3VwIiAgICAjIGdyb3VwIG5hbWUKICAgICAgICBzZWxmLmRldm1ham9yID0gMCAgICAgICAgICAjLQogICAgICAgIHNlbGYuZGV2bWlub3IgPSAwICAgICAgICAgICMtZm9yIHVzZSB3aXRoIENIUlRZUEUgYW5kIEJMS1RZUEUKICAgICAgICBzZWxmLnByZWZpeCAgID0gIiIgICAgICAgICAjIHByZWZpeCB0byBmaWxlbmFtZSBvciBob2xkaW5nIGluZm9ybWF0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBhYm91dCBzcGFyc2UgZmlsZXMKCiAgICAgICAgc2VsZi5vZmZzZXQgICA9IDAgICAgICAgICAgIyB0aGUgdGFyIGhlYWRlciBzdGFydHMgaGVyZQogICAgICAgIHNlbGYub2Zmc2V0X2RhdGEgPSAwICAgICAgICMgdGhlIGZpbGUncyBkYXRhIHN0YXJ0cyBoZXJlCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiAiPCVzICVyIGF0ICUjeD4iICUgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLHNlbGYubmFtZSxpZChzZWxmKSkKCiAgICBkZWYgZnJvbWJ1ZihjbHMsIGJ1Zik6CiAgICAgICAgIiIiQ29uc3RydWN0IGEgVGFySW5mbyBvYmplY3QgZnJvbSBhIDUxMiBieXRlIHN0cmluZyBidWZmZXIuCiAgICAgICAgIiIiCiAgICAgICAgdGFyaW5mbyA9IGNscygpCiAgICAgICAgdGFyaW5mby5uYW1lICAgPSBudHMoYnVmWzA6MTAwXSkKICAgICAgICB0YXJpbmZvLm1vZGUgICA9IGludChidWZbMTAwOjEwOF0sIDgpCiAgICAgICAgdGFyaW5mby51aWQgICAgPSBpbnQoYnVmWzEwODoxMTZdLDgpCiAgICAgICAgdGFyaW5mby5naWQgICAgPSBpbnQoYnVmWzExNjoxMjRdLDgpCgogICAgICAgICMgVGhlcmUgYXJlIHR3byBwb3NzaWJsZSBjb2RpbmdzIGZvciB0aGUgc2l6ZSBmaWVsZCB3ZQogICAgICAgICMgaGF2ZSB0byBkaXNjcmltaW5hdGUsIHNlZSBjb21tZW50IGluIHRvYnVmKCkgYmVsb3cuCiAgICAgICAgaWYgYnVmWzEyNF0gIT0gY2hyKDAyMDApOgogICAgICAgICAgICB0YXJpbmZvLnNpemUgPSBsb25nKGJ1ZlsxMjQ6MTM2XSwgOCkKICAgICAgICBlbHNlOgogICAgICAgICAgICB0YXJpbmZvLnNpemUgPSAwTAogICAgICAgICAgICBmb3IgaSBpbiByYW5nZSgxMSk6CiAgICAgICAgICAgICAgICB0YXJpbmZvLnNpemUgPDw9IDgKICAgICAgICAgICAgICAgIHRhcmluZm8uc2l6ZSArPSBvcmQoYnVmWzEyNSArIGldKQoKICAgICAgICB0YXJpbmZvLm10aW1lICA9IGxvbmcoYnVmWzEzNjoxNDhdLCA4KQogICAgICAgIHRhcmluZm8uY2hrc3VtID0gaW50KGJ1ZlsxNDg6MTU2XSwgOCkKICAgICAgICB0YXJpbmZvLnR5cGUgICA9IGJ1ZlsxNTY6MTU3XQogICAgICAgIHRhcmluZm8ubGlua25hbWUgPSBudHMoYnVmWzE1NzoyNTddKQogICAgICAgIHRhcmluZm8udW5hbWUgID0gbnRzKGJ1ZlsyNjU6Mjk3XSkKICAgICAgICB0YXJpbmZvLmduYW1lICA9IG50cyhidWZbMjk3OjMyOV0pCiAgICAgICAgdHJ5OgogICAgICAgICAgICB0YXJpbmZvLmRldm1ham9yID0gaW50KGJ1ZlszMjk6MzM3XSwgOCkKICAgICAgICAgICAgdGFyaW5mby5kZXZtaW5vciA9IGludChidWZbMzM3OjM0NV0sIDgpCiAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgIHRhcmluZm8uZGV2bWFqb3IgPSB0YXJpbmZvLmRldm1ham9yID0gMAogICAgICAgIHRhcmluZm8ucHJlZml4ID0gYnVmWzM0NTo1MDBdCgogICAgICAgICMgVGhlIHByZWZpeCBmaWVsZCBpcyB1c2VkIGZvciBmaWxlbmFtZXMgPiAxMDAgaW4KICAgICAgICAjIHRoZSBQT1NJWCBzdGFuZGFyZC4KICAgICAgICAjIG5hbWUgPSBwcmVmaXggKyAnLycgKyBuYW1lCiAgICAgICAgaWYgdGFyaW5mby50eXBlICE9IEdOVVRZUEVfU1BBUlNFOgogICAgICAgICAgICB0YXJpbmZvLm5hbWUgPSBub3JtcGF0aChvcy5wYXRoLmpvaW4obnRzKHRhcmluZm8ucHJlZml4KSwgdGFyaW5mby5uYW1lKSkKCiAgICAgICAgIyBEaXJlY3RvcnkgbmFtZXMgc2hvdWxkIGhhdmUgYSAnLycgYXQgdGhlIGVuZC4KICAgICAgICBpZiB0YXJpbmZvLmlzZGlyKCkgYW5kIHRhcmluZm8ubmFtZVstMTpdICE9ICIvIjoKICAgICAgICAgICAgdGFyaW5mby5uYW1lICs9ICIvIgogICAgICAgIHJldHVybiB0YXJpbmZvCgogICAgZnJvbWJ1ZiA9IGNsYXNzbWV0aG9kKGZyb21idWYpCgogICAgZGVmIHRvYnVmKHNlbGYpOgogICAgICAgICIiIlJldHVybiBhIHRhciBoZWFkZXIgYmxvY2sgYXMgYSA1MTIgYnl0ZSBzdHJpbmcuCiAgICAgICAgIiIiCiAgICAgICAgIyBQcmVmZXIgdGhlIHNpemUgdG8gYmUgZW5jb2RlZCBhcyAxMSBvY3RhbCBhc2NpaSBkaWdpdHMKICAgICAgICAjIHdoaWNoIGlzIHRoZSBtb3N0IHBvcnRhYmxlLiBJZiB0aGUgc2l6ZSBleGNlZWRzIHRoaXMKICAgICAgICAjIGxpbWl0ICg+PSA4IEdCKSwgZW5jb2RlIGl0IGFzIGFuIDg4LWJpdCB2YWx1ZSB3aGljaCBpcwogICAgICAgICMgYSBHTlUgdGFyIGZlYXR1cmUuCiAgICAgICAgaWYgc2VsZi5zaXplIDw9IE1BWFNJWkVfTUVNQkVSOgogICAgICAgICAgICBzaXplID0gIiUwMTFvIiAlIHNlbGYuc2l6ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHMgPSBzZWxmLnNpemUKICAgICAgICAgICAgc2l6ZSA9ICIiCiAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKDExKToKICAgICAgICAgICAgICAgIHNpemUgPSBjaHIocyAmIDAzNzcpICsgc2l6ZQogICAgICAgICAgICAgICAgcyA+Pj0gOAogICAgICAgICAgICBzaXplID0gY2hyKDAyMDApICsgc2l6ZQoKICAgICAgICAjIFRoZSBmb2xsb3dpbmcgY29kZSB3YXMgY29udHJpYnV0ZWQgYnkgRGV0bGVmIExhbm5lcnQuCiAgICAgICAgcGFydHMgPSBbXQogICAgICAgIGZvciB2YWx1ZSwgZmllbGRzaXplIGluICgKICAgICAgICAgICAgICAgIChzZWxmLm5hbWUsIDEwMCksCiAgICAgICAgICAgICAgICAoIiUwN28iICUgKHNlbGYubW9kZSAmIDA3Nzc3KSwgOCksCiAgICAgICAgICAgICAgICAoIiUwN28iICUgc2VsZi51aWQsIDgpLAogICAgICAgICAgICAgICAgKCIlMDdvIiAlIHNlbGYuZ2lkLCA4KSwKICAgICAgICAgICAgICAgIChzaXplLCAxMiksCiAgICAgICAgICAgICAgICAoIiUwMTFvIiAlIHNlbGYubXRpbWUsIDEyKSwKICAgICAgICAgICAgICAgICgiICAgICAgICAiLCA4KSwKICAgICAgICAgICAgICAgIChzZWxmLnR5cGUsIDEpLAogICAgICAgICAgICAgICAgKHNlbGYubGlua25hbWUsIDEwMCksCiAgICAgICAgICAgICAgICAoTUFHSUMsIDYpLAogICAgICAgICAgICAgICAgKFZFUlNJT04sIDIpLAogICAgICAgICAgICAgICAgKHNlbGYudW5hbWUsIDMyKSwKICAgICAgICAgICAgICAgIChzZWxmLmduYW1lLCAzMiksCiAgICAgICAgICAgICAgICAoIiUwN28iICUgc2VsZi5kZXZtYWpvciwgOCksCiAgICAgICAgICAgICAgICAoIiUwN28iICUgc2VsZi5kZXZtaW5vciwgOCksCiAgICAgICAgICAgICAgICAoc2VsZi5wcmVmaXgsIDE1NSkKICAgICAgICAgICAgKToKICAgICAgICAgICAgbCA9IGxlbih2YWx1ZSkKICAgICAgICAgICAgcGFydHMuYXBwZW5kKHZhbHVlWzpmaWVsZHNpemVdICsgKGZpZWxkc2l6ZSAtIGwpICogTlVMKQoKICAgICAgICBidWYgPSAiIi5qb2luKHBhcnRzKQogICAgICAgIGNoa3N1bSA9IGNhbGNfY2hrc3VtKGJ1ZikKICAgICAgICBidWYgPSBidWZbOjE0OF0gKyAiJTA2b1wwIiAlIGNoa3N1bSArIGJ1ZlsxNTU6XQogICAgICAgIGJ1ZiArPSAoQkxPQ0tTSVpFIC0gbGVuKGJ1ZikpICogTlVMCiAgICAgICAgc2VsZi5idWYgPSBidWYKICAgICAgICByZXR1cm4gYnVmCgogICAgZGVmIGlzcmVnKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLnR5cGUgaW4gUkVHVUxBUl9UWVBFUwogICAgZGVmIGlzZmlsZShzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5pc3JlZygpCiAgICBkZWYgaXNkaXIoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYudHlwZSA9PSBESVJUWVBFCiAgICBkZWYgaXNzeW0oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYudHlwZSA9PSBTWU1UWVBFCiAgICBkZWYgaXNsbmsoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYudHlwZSA9PSBMTktUWVBFCiAgICBkZWYgaXNjaHIoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYudHlwZSA9PSBDSFJUWVBFCiAgICBkZWYgaXNibGsoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYudHlwZSA9PSBCTEtUWVBFCiAgICBkZWYgaXNmaWZvKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLnR5cGUgPT0gRklGT1RZUEUKICAgIGRlZiBpc3NwYXJzZShzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi50eXBlID09IEdOVVRZUEVfU1BBUlNFCiAgICBkZWYgaXNkZXYoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYudHlwZSBpbiAoQ0hSVFlQRSwgQkxLVFlQRSwgRklGT1RZUEUpCiMgY2xhc3MgVGFySW5mbwoKY2xhc3MgVGFyRmlsZShvYmplY3QpOgogICAgIiIiVGhlIFRhckZpbGUgQ2xhc3MgcHJvdmlkZXMgYW4gaW50ZXJmYWNlIHRvIHRhciBhcmNoaXZlcy4KICAgICIiIgoKICAgIGRlYnVnID0gMCAgICAgICAgICAgICAgICAgICAjIE1heSBiZSBzZXQgZnJvbSAwIChubyBtc2dzKSB0byAzIChhbGwgbXNncykKCiAgICBkZXJlZmVyZW5jZSA9IEZhbHNlICAgICAgICAgIyBJZiB0cnVlLCBhZGQgY29udGVudCBvZiBsaW5rZWQgZmlsZSB0byB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHRhciBmaWxlLCBlbHNlIHRoZSBsaW5rLgoKICAgIGlnbm9yZV96ZXJvcyA9IEZhbHNlICAgICAgICAjIElmIHRydWUsIHNraXBzIGVtcHR5IG9yIGludmFsaWQgYmxvY2tzIGFuZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgY29udGludWVzIHByb2Nlc3NpbmcuCgogICAgZXJyb3JsZXZlbCA9IDAgICAgICAgICAgICAgICMgSWYgMCwgZmF0YWwgZXJyb3JzIG9ubHkgYXBwZWFyIGluIGRlYnVnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBtZXNzYWdlcyAoaWYgZGVidWcgPj0gMCkuIElmID4gMCwgZXJyb3JzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBhcmUgcGFzc2VkIHRvIHRoZSBjYWxsZXIgYXMgZXhjZXB0aW9ucy4KCiAgICBwb3NpeCA9IEZhbHNlICAgICAgICAgICAgICAgIyBJZiBUcnVlLCBnZW5lcmF0ZXMgUE9TSVguMS0xOTkwLWNvbXBsaWFudAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYXJjaGl2ZXMgKG5vIEdOVSBleHRlbnNpb25zISkKCiAgICBmaWxlb2JqZWN0ID0gRXhGaWxlT2JqZWN0CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWU9Tm9uZSwgbW9kZT0iciIsIGZpbGVvYmo9Tm9uZSk6CiAgICAgICAgIiIiT3BlbiBhbiAodW5jb21wcmVzc2VkKSB0YXIgYXJjaGl2ZSBgbmFtZScuIGBtb2RlJyBpcyBlaXRoZXIgJ3InIHRvCiAgICAgICAgICAgcmVhZCBmcm9tIGFuIGV4aXN0aW5nIGFyY2hpdmUsICdhJyB0byBhcHBlbmQgZGF0YSB0byBhbiBleGlzdGluZwogICAgICAgICAgIGZpbGUgb3IgJ3cnIHRvIGNyZWF0ZSBhIG5ldyBmaWxlIG92ZXJ3cml0aW5nIGFuIGV4aXN0aW5nIG9uZS4gYG1vZGUnCiAgICAgICAgICAgZGVmYXVsdHMgdG8gJ3InLgogICAgICAgICAgIElmIGBmaWxlb2JqJyBpcyBnaXZlbiwgaXQgaXMgdXNlZCBmb3IgcmVhZGluZyBvciB3cml0aW5nIGRhdGEuIElmIGl0CiAgICAgICAgICAgY2FuIGJlIGRldGVybWluZWQsIGBtb2RlJyBpcyBvdmVycmlkZGVuIGJ5IGBmaWxlb2JqJ3MgbW9kZS4KICAgICAgICAgICBgZmlsZW9iaicgaXMgbm90IGNsb3NlZCwgd2hlbiBUYXJGaWxlIGlzIGNsb3NlZC4KICAgICAgICAiIiIKICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCgogICAgICAgIGlmIGxlbihtb2RlKSA+IDEgb3IgbW9kZSBub3QgaW4gInJhdyI6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICJtb2RlIG11c3QgYmUgJ3InLCAnYScgb3IgJ3cnIgogICAgICAgIHNlbGYuX21vZGUgPSBtb2RlCiAgICAgICAgc2VsZi5tb2RlID0geyJyIjogInJiIiwgImEiOiAicitiIiwgInciOiAid2IifVttb2RlXQoKICAgICAgICBpZiBub3QgZmlsZW9iajoKICAgICAgICAgICAgZmlsZW9iaiA9IGZpbGUoc2VsZi5uYW1lLCBzZWxmLm1vZGUpCiAgICAgICAgICAgIHNlbGYuX2V4dGZpbGVvYmogPSBGYWxzZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGlmIHNlbGYubmFtZSBpcyBOb25lIGFuZCBoYXNhdHRyKGZpbGVvYmosICJuYW1lIik6CiAgICAgICAgICAgICAgICBzZWxmLm5hbWUgPSBmaWxlb2JqLm5hbWUKICAgICAgICAgICAgaWYgaGFzYXR0cihmaWxlb2JqLCAibW9kZSIpOgogICAgICAgICAgICAgICAgc2VsZi5tb2RlID0gZmlsZW9iai5tb2RlCiAgICAgICAgICAgIHNlbGYuX2V4dGZpbGVvYmogPSBUcnVlCiAgICAgICAgc2VsZi5maWxlb2JqID0gZmlsZW9iagoKICAgICAgICAjIEluaXQgZGF0YXN0cnVjdHVyZXMKICAgICAgICBzZWxmLmNsb3NlZCAgICAgID0gRmFsc2UKICAgICAgICBzZWxmLm1lbWJlcnMgICAgID0gW10gICAgICAgIyBsaXN0IG9mIG1lbWJlcnMgYXMgVGFySW5mbyBvYmplY3RzCiAgICAgICAgc2VsZi5fbG9hZGVkICAgICA9IEZhbHNlICAgICMgZmxhZyBpZiBhbGwgbWVtYmVycyBoYXZlIGJlZW4gcmVhZAogICAgICAgIHNlbGYub2Zmc2V0ICAgICAgPSAwTCAgICAgICAjIGN1cnJlbnQgcG9zaXRpb24gaW4gdGhlIGFyY2hpdmUgZmlsZQogICAgICAgIHNlbGYuaW5vZGVzICAgICAgPSB7fSAgICAgICAjIGRpY3Rpb25hcnkgY2FjaGluZyB0aGUgaW5vZGVzIG9mCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYXJjaGl2ZSBtZW1iZXJzIGFscmVhZHkgYWRkZWQKCiAgICAgICAgaWYgc2VsZi5fbW9kZSA9PSAiciI6CiAgICAgICAgICAgIHNlbGYuZmlyc3RtZW1iZXIgPSBOb25lCiAgICAgICAgICAgIHNlbGYuZmlyc3RtZW1iZXIgPSBzZWxmLm5leHQoKQoKICAgICAgICBpZiBzZWxmLl9tb2RlID09ICJhIjoKICAgICAgICAgICAgIyBNb3ZlIHRvIHRoZSBlbmQgb2YgdGhlIGFyY2hpdmUsCiAgICAgICAgICAgICMgYmVmb3JlIHRoZSBmaXJzdCBlbXB0eSBibG9jay4KICAgICAgICAgICAgc2VsZi5maXJzdG1lbWJlciA9IE5vbmUKICAgICAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICB0YXJpbmZvID0gc2VsZi5uZXh0KCkKICAgICAgICAgICAgICAgIGV4Y2VwdCBSZWFkRXJyb3I6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5maWxlb2JqLnNlZWsoMCkKICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgaWYgdGFyaW5mbyBpcyBOb25lOgogICAgICAgICAgICAgICAgICAgIHNlbGYuZmlsZW9iai5zZWVrKC0gQkxPQ0tTSVpFLCAxKQogICAgICAgICAgICAgICAgICAgIGJyZWFrCgogICAgICAgIGlmIHNlbGYuX21vZGUgaW4gImF3IjoKICAgICAgICAgICAgc2VsZi5fbG9hZGVkID0gVHJ1ZQoKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIyBCZWxvdyBhcmUgdGhlIGNsYXNzbWV0aG9kcyB3aGljaCBhY3QgYXMgYWx0ZXJuYXRlIGNvbnN0cnVjdG9ycyB0byB0aGUKICAgICMgVGFyRmlsZSBjbGFzcy4gVGhlIG9wZW4oKSBtZXRob2QgaXMgdGhlIG9ubHkgb25lIHRoYXQgaXMgbmVlZGVkIGZvcgogICAgIyBwdWJsaWMgdXNlOyBpdCBpcyB0aGUgInN1cGVyIi1jb25zdHJ1Y3RvciBhbmQgaXMgYWJsZSB0byBzZWxlY3QgYW4KICAgICMgYWRlcXVhdGUgInN1YiItY29uc3RydWN0b3IgZm9yIGEgcGFydGljdWxhciBjb21wcmVzc2lvbiB1c2luZyB0aGUgbWFwcGluZwogICAgIyBmcm9tIE9QRU5fTUVUSC4KICAgICMKICAgICMgVGhpcyBjb25jZXB0IGFsbG93cyBvbmUgdG8gc3ViY2xhc3MgVGFyRmlsZSB3aXRob3V0IGxvc2luZyB0aGUgY29tZm9ydCBvZgogICAgIyB0aGUgc3VwZXItY29uc3RydWN0b3IuIEEgc3ViLWNvbnN0cnVjdG9yIGlzIHJlZ2lzdGVyZWQgYW5kIG1hZGUgYXZhaWxhYmxlCiAgICAjIGJ5IGFkZGluZyBpdCB0byB0aGUgbWFwcGluZyBpbiBPUEVOX01FVEguCgogICAgZGVmIG9wZW4oY2xzLCBuYW1lPU5vbmUsIG1vZGU9InIiLCBmaWxlb2JqPU5vbmUsIGJ1ZnNpemU9MjAqNTEyKToKICAgICAgICAiIiJPcGVuIGEgdGFyIGFyY2hpdmUgZm9yIHJlYWRpbmcsIHdyaXRpbmcgb3IgYXBwZW5kaW5nLiBSZXR1cm4KICAgICAgICAgICBhbiBhcHByb3ByaWF0ZSBUYXJGaWxlIGNsYXNzLgoKICAgICAgICAgICBtb2RlOgogICAgICAgICAgICdyJyAgICAgICAgICBvcGVuIGZvciByZWFkaW5nIHdpdGggdHJhbnNwYXJlbnQgY29tcHJlc3Npb24KICAgICAgICAgICAncjonICAgICAgICAgb3BlbiBmb3IgcmVhZGluZyBleGNsdXNpdmVseSB1bmNvbXByZXNzZWQKICAgICAgICAgICAncjpneicgICAgICAgb3BlbiBmb3IgcmVhZGluZyB3aXRoIGd6aXAgY29tcHJlc3Npb24KICAgICAgICAgICAncjpiejInICAgICAgb3BlbiBmb3IgcmVhZGluZyB3aXRoIGJ6aXAyIGNvbXByZXNzaW9uCiAgICAgICAgICAgJ2EnIG9yICdhOicgIG9wZW4gZm9yIGFwcGVuZGluZwogICAgICAgICAgICd3JyBvciAndzonICBvcGVuIGZvciB3cml0aW5nIHdpdGhvdXQgY29tcHJlc3Npb24KICAgICAgICAgICAndzpneicgICAgICAgb3BlbiBmb3Igd3JpdGluZyB3aXRoIGd6aXAgY29tcHJlc3Npb24KICAgICAgICAgICAndzpiejInICAgICAgb3BlbiBmb3Igd3JpdGluZyB3aXRoIGJ6aXAyIGNvbXByZXNzaW9uCiAgICAgICAgICAgJ3J8JyAgICAgICAgIG9wZW4gYW4gdW5jb21wcmVzc2VkIHN0cmVhbSBvZiB0YXIgYmxvY2tzIGZvciByZWFkaW5nCiAgICAgICAgICAgJ3J8Z3onICAgICAgIG9wZW4gYSBnemlwIGNvbXByZXNzZWQgc3RyZWFtIG9mIHRhciBibG9ja3MKICAgICAgICAgICAncnxiejInICAgICAgb3BlbiBhIGJ6aXAyIGNvbXByZXNzZWQgc3RyZWFtIG9mIHRhciBibG9ja3MKICAgICAgICAgICAnd3wnICAgICAgICAgb3BlbiBhbiB1bmNvbXByZXNzZWQgc3RyZWFtIGZvciB3cml0aW5nCiAgICAgICAgICAgJ3d8Z3onICAgICAgIG9wZW4gYSBnemlwIGNvbXByZXNzZWQgc3RyZWFtIGZvciB3cml0aW5nCiAgICAgICAgICAgJ3d8YnoyJyAgICAgIG9wZW4gYSBiemlwMiBjb21wcmVzc2VkIHN0cmVhbSBmb3Igd3JpdGluZwogICAgICAgICIiIgoKICAgICAgICBpZiBub3QgbmFtZSBhbmQgbm90IGZpbGVvYmo6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICJub3RoaW5nIHRvIG9wZW4iCgogICAgICAgIGlmICI6IiBpbiBtb2RlOgogICAgICAgICAgICBmaWxlbW9kZSwgY29tcHR5cGUgPSBtb2RlLnNwbGl0KCI6IiwgMSkKICAgICAgICAgICAgZmlsZW1vZGUgPSBmaWxlbW9kZSBvciAiciIKICAgICAgICAgICAgY29tcHR5cGUgPSBjb21wdHlwZSBvciAidGFyIgoKICAgICAgICAgICAgIyBTZWxlY3QgdGhlICpvcGVuKCkgZnVuY3Rpb24gYWNjb3JkaW5nIHRvCiAgICAgICAgICAgICMgZ2l2ZW4gY29tcHJlc3Npb24uCiAgICAgICAgICAgIGlmIGNvbXB0eXBlIGluIGNscy5PUEVOX01FVEg6CiAgICAgICAgICAgICAgICBmdW5jID0gZ2V0YXR0cihjbHMsIGNscy5PUEVOX01FVEhbY29tcHR5cGVdKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmFpc2UgQ29tcHJlc3Npb25FcnJvciwgInVua25vd24gY29tcHJlc3Npb24gdHlwZSAlciIgJSBjb21wdHlwZQogICAgICAgICAgICByZXR1cm4gZnVuYyhuYW1lLCBmaWxlbW9kZSwgZmlsZW9iaikKCiAgICAgICAgZWxpZiAifCIgaW4gbW9kZToKICAgICAgICAgICAgZmlsZW1vZGUsIGNvbXB0eXBlID0gbW9kZS5zcGxpdCgifCIsIDEpCiAgICAgICAgICAgIGZpbGVtb2RlID0gZmlsZW1vZGUgb3IgInIiCiAgICAgICAgICAgIGNvbXB0eXBlID0gY29tcHR5cGUgb3IgInRhciIKCiAgICAgICAgICAgIGlmIGZpbGVtb2RlIG5vdCBpbiAicnciOgogICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgIm1vZGUgbXVzdCBiZSAncicgb3IgJ3cnIgoKICAgICAgICAgICAgdCA9IGNscyhuYW1lLCBmaWxlbW9kZSwKICAgICAgICAgICAgICAgICAgICBfU3RyZWFtKG5hbWUsIGZpbGVtb2RlLCBjb21wdHlwZSwgZmlsZW9iaiwgYnVmc2l6ZSkpCiAgICAgICAgICAgIHQuX2V4dGZpbGVvYmogPSBGYWxzZQogICAgICAgICAgICByZXR1cm4gdAoKICAgICAgICBlbGlmIG1vZGUgPT0gInIiOgogICAgICAgICAgICAjIEZpbmQgb3V0IHdoaWNoICpvcGVuKCkgaXMgYXBwcm9wcmlhdGUgZm9yIG9wZW5pbmcgdGhlIGZpbGUuCiAgICAgICAgICAgIGZvciBjb21wdHlwZSBpbiBjbHMuT1BFTl9NRVRIOgogICAgICAgICAgICAgICAgZnVuYyA9IGdldGF0dHIoY2xzLCBjbHMuT1BFTl9NRVRIW2NvbXB0eXBlXSkKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuYyhuYW1lLCAiciIsIGZpbGVvYmopCiAgICAgICAgICAgICAgICBleGNlcHQgKFJlYWRFcnJvciwgQ29tcHJlc3Npb25FcnJvcik6CiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgcmFpc2UgUmVhZEVycm9yLCAiZmlsZSBjb3VsZCBub3QgYmUgb3BlbmVkIHN1Y2Nlc3NmdWxseSIKCiAgICAgICAgZWxpZiBtb2RlIGluICJhdyI6CiAgICAgICAgICAgIHJldHVybiBjbHMudGFyb3BlbihuYW1lLCBtb2RlLCBmaWxlb2JqKQoKICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAidW5kaXNjZXJuaWJsZSBtb2RlIgoKICAgIG9wZW4gPSBjbGFzc21ldGhvZChvcGVuKQoKICAgIGRlZiB0YXJvcGVuKGNscywgbmFtZSwgbW9kZT0iciIsIGZpbGVvYmo9Tm9uZSk6CiAgICAgICAgIiIiT3BlbiB1bmNvbXByZXNzZWQgdGFyIGFyY2hpdmUgbmFtZSBmb3IgcmVhZGluZyBvciB3cml0aW5nLgogICAgICAgICIiIgogICAgICAgIGlmIGxlbihtb2RlKSA+IDEgb3IgbW9kZSBub3QgaW4gInJhdyI6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICJtb2RlIG11c3QgYmUgJ3InLCAnYScgb3IgJ3cnIgogICAgICAgIHJldHVybiBjbHMobmFtZSwgbW9kZSwgZmlsZW9iaikKCiAgICB0YXJvcGVuID0gY2xhc3NtZXRob2QodGFyb3BlbikKCiAgICBkZWYgZ3pvcGVuKGNscywgbmFtZSwgbW9kZT0iciIsIGZpbGVvYmo9Tm9uZSwgY29tcHJlc3NsZXZlbD05KToKICAgICAgICAiIiJPcGVuIGd6aXAgY29tcHJlc3NlZCB0YXIgYXJjaGl2ZSBuYW1lIGZvciByZWFkaW5nIG9yIHdyaXRpbmcuCiAgICAgICAgICAgQXBwZW5kaW5nIGlzIG5vdCBhbGxvd2VkLgogICAgICAgICIiIgogICAgICAgIGlmIGxlbihtb2RlKSA+IDEgb3IgbW9kZSBub3QgaW4gInJ3IjoKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgIm1vZGUgbXVzdCBiZSAncicgb3IgJ3cnIgoKICAgICAgICB0cnk6CiAgICAgICAgICAgIGltcG9ydCBnemlwCiAgICAgICAgICAgIGd6aXAuR3ppcEZpbGUKICAgICAgICBleGNlcHQgKEltcG9ydEVycm9yLCBBdHRyaWJ1dGVFcnJvcik6CiAgICAgICAgICAgIHJhaXNlIENvbXByZXNzaW9uRXJyb3IsICJnemlwIG1vZHVsZSBpcyBub3QgYXZhaWxhYmxlIgoKICAgICAgICBwcmUsIGV4dCA9IG9zLnBhdGguc3BsaXRleHQobmFtZSkKICAgICAgICBwcmUgPSBvcy5wYXRoLmJhc2VuYW1lKHByZSkKICAgICAgICBpZiBleHQgPT0gIi50Z3oiOgogICAgICAgICAgICBleHQgPSAiLnRhciIKICAgICAgICBpZiBleHQgPT0gIi5neiI6CiAgICAgICAgICAgIGV4dCA9ICIiCiAgICAgICAgdGFybmFtZSA9IHByZSArIGV4dAoKICAgICAgICBpZiBmaWxlb2JqIGlzIE5vbmU6CiAgICAgICAgICAgIGZpbGVvYmogPSBmaWxlKG5hbWUsIG1vZGUgKyAiYiIpCgogICAgICAgIGlmIG1vZGUgIT0gInIiOgogICAgICAgICAgICBuYW1lID0gdGFybmFtZQoKICAgICAgICB0cnk6CiAgICAgICAgICAgIHQgPSBjbHMudGFyb3Blbih0YXJuYW1lLCBtb2RlLAogICAgICAgICAgICAgICAgZ3ppcC5HemlwRmlsZShuYW1lLCBtb2RlLCBjb21wcmVzc2xldmVsLCBmaWxlb2JqKQogICAgICAgICAgICApCiAgICAgICAgZXhjZXB0IElPRXJyb3I6CiAgICAgICAgICAgIHJhaXNlIFJlYWRFcnJvciwgIm5vdCBhIGd6aXAgZmlsZSIKICAgICAgICB0Ll9leHRmaWxlb2JqID0gRmFsc2UKICAgICAgICByZXR1cm4gdAoKICAgIGd6b3BlbiA9IGNsYXNzbWV0aG9kKGd6b3BlbikKCiAgICBkZWYgYnoyb3BlbihjbHMsIG5hbWUsIG1vZGU9InIiLCBmaWxlb2JqPU5vbmUsIGNvbXByZXNzbGV2ZWw9OSk6CiAgICAgICAgIiIiT3BlbiBiemlwMiBjb21wcmVzc2VkIHRhciBhcmNoaXZlIG5hbWUgZm9yIHJlYWRpbmcgb3Igd3JpdGluZy4KICAgICAgICAgICBBcHBlbmRpbmcgaXMgbm90IGFsbG93ZWQuCiAgICAgICAgIiIiCiAgICAgICAgaWYgbGVuKG1vZGUpID4gMSBvciBtb2RlIG5vdCBpbiAicnciOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAibW9kZSBtdXN0IGJlICdyJyBvciAndycuIgoKICAgICAgICB0cnk6CiAgICAgICAgICAgIGltcG9ydCBiejIKICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgICAgIHJhaXNlIENvbXByZXNzaW9uRXJyb3IsICJiejIgbW9kdWxlIGlzIG5vdCBhdmFpbGFibGUiCgogICAgICAgIHByZSwgZXh0ID0gb3MucGF0aC5zcGxpdGV4dChuYW1lKQogICAgICAgIHByZSA9IG9zLnBhdGguYmFzZW5hbWUocHJlKQogICAgICAgIGlmIGV4dCA9PSAiLnRiejIiOgogICAgICAgICAgICBleHQgPSAiLnRhciIKICAgICAgICBpZiBleHQgPT0gIi5iejIiOgogICAgICAgICAgICBleHQgPSAiIgogICAgICAgIHRhcm5hbWUgPSBwcmUgKyBleHQKCiAgICAgICAgaWYgZmlsZW9iaiBpcyBub3QgTm9uZToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgIm5vIHN1cHBvcnQgZm9yIGV4dGVybmFsIGZpbGUgb2JqZWN0cyIKCiAgICAgICAgdHJ5OgogICAgICAgICAgICB0ID0gY2xzLnRhcm9wZW4odGFybmFtZSwgbW9kZSwgYnoyLkJaMkZpbGUobmFtZSwgbW9kZSwgY29tcHJlc3NsZXZlbD1jb21wcmVzc2xldmVsKSkKICAgICAgICBleGNlcHQgSU9FcnJvcjoKICAgICAgICAgICAgcmFpc2UgUmVhZEVycm9yLCAibm90IGEgYnppcDIgZmlsZSIKICAgICAgICB0Ll9leHRmaWxlb2JqID0gRmFsc2UKICAgICAgICByZXR1cm4gdAoKICAgIGJ6Mm9wZW4gPSBjbGFzc21ldGhvZChiejJvcGVuKQoKICAgICMgQWxsICpvcGVuKCkgbWV0aG9kcyBhcmUgcmVnaXN0ZXJlZCBoZXJlLgogICAgT1BFTl9NRVRIID0gewogICAgICAgICJ0YXIiOiAidGFyb3BlbiIsICAgIyB1bmNvbXByZXNzZWQgdGFyCiAgICAgICAgImd6IjogICJnem9wZW4iLCAgICAjIGd6aXAgY29tcHJlc3NlZCB0YXIKICAgICAgICAiYnoyIjogImJ6Mm9wZW4iICAgICMgYnppcDIgY29tcHJlc3NlZCB0YXIKICAgIH0KCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICMgVGhlIHB1YmxpYyBtZXRob2RzIHdoaWNoIFRhckZpbGUgcHJvdmlkZXM6CgogICAgZGVmIGNsb3NlKHNlbGYpOgogICAgICAgICIiIkNsb3NlIHRoZSBUYXJGaWxlLiBJbiB3cml0ZS1tb2RlLCB0d28gZmluaXNoaW5nIHplcm8gYmxvY2tzIGFyZQogICAgICAgICAgIGFwcGVuZGVkIHRvIHRoZSBhcmNoaXZlLgogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYuY2xvc2VkOgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgaWYgc2VsZi5fbW9kZSBpbiAiYXciOgogICAgICAgICAgICBzZWxmLmZpbGVvYmoud3JpdGUoTlVMICogKEJMT0NLU0laRSAqIDIpKQogICAgICAgICAgICBzZWxmLm9mZnNldCArPSAoQkxPQ0tTSVpFICogMikKICAgICAgICAgICAgIyBmaWxsIHVwIHRoZSBlbmQgd2l0aCB6ZXJvLWJsb2NrcwogICAgICAgICAgICAjIChsaWtlIG9wdGlvbiAtYjIwIGZvciB0YXIgZG9lcykKICAgICAgICAgICAgYmxvY2tzLCByZW1haW5kZXIgPSBkaXZtb2Qoc2VsZi5vZmZzZXQsIFJFQ09SRFNJWkUpCiAgICAgICAgICAgIGlmIHJlbWFpbmRlciA+IDA6CiAgICAgICAgICAgICAgICBzZWxmLmZpbGVvYmoud3JpdGUoTlVMICogKFJFQ09SRFNJWkUgLSByZW1haW5kZXIpKQoKICAgICAgICBpZiBub3Qgc2VsZi5fZXh0ZmlsZW9iajoKICAgICAgICAgICAgc2VsZi5maWxlb2JqLmNsb3NlKCkKICAgICAgICBzZWxmLmNsb3NlZCA9IFRydWUKCiAgICBkZWYgZ2V0bWVtYmVyKHNlbGYsIG5hbWUpOgogICAgICAgICIiIlJldHVybiBhIFRhckluZm8gb2JqZWN0IGZvciBtZW1iZXIgYG5hbWUnLiBJZiBgbmFtZScgY2FuIG5vdCBiZQogICAgICAgICAgIGZvdW5kIGluIHRoZSBhcmNoaXZlLCBLZXlFcnJvciBpcyByYWlzZWQuIElmIGEgbWVtYmVyIG9jY3VycyBtb3JlCiAgICAgICAgICAgdGhhbiBvbmNlIGluIHRoZSBhcmNoaXZlLCBpdHMgbGFzdCBvY2N1cmVuY2UgaXMgYXNzdW1lZCB0byBiZSB0aGUKICAgICAgICAgICBtb3N0IHVwLXRvLWRhdGUgdmVyc2lvbi4KICAgICAgICAiIiIKICAgICAgICB0YXJpbmZvID0gc2VsZi5fZ2V0bWVtYmVyKG5hbWUpCiAgICAgICAgaWYgdGFyaW5mbyBpcyBOb25lOgogICAgICAgICAgICByYWlzZSBLZXlFcnJvciwgImZpbGVuYW1lICVyIG5vdCBmb3VuZCIgJSBuYW1lCiAgICAgICAgcmV0dXJuIHRhcmluZm8KCiAgICBkZWYgZ2V0bWVtYmVycyhzZWxmKToKICAgICAgICAiIiJSZXR1cm4gdGhlIG1lbWJlcnMgb2YgdGhlIGFyY2hpdmUgYXMgYSBsaXN0IG9mIFRhckluZm8gb2JqZWN0cy4gVGhlCiAgICAgICAgICAgbGlzdCBoYXMgdGhlIHNhbWUgb3JkZXIgYXMgdGhlIG1lbWJlcnMgaW4gdGhlIGFyY2hpdmUuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5fY2hlY2soKQogICAgICAgIGlmIG5vdCBzZWxmLl9sb2FkZWQ6ICAgICMgaWYgd2Ugd2FudCB0byBvYnRhaW4gYSBsaXN0IG9mCiAgICAgICAgICAgIHNlbGYuX2xvYWQoKSAgICAgICAgIyBhbGwgbWVtYmVycywgd2UgZmlyc3QgaGF2ZSB0bwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgc2NhbiB0aGUgd2hvbGUgYXJjaGl2ZS4KICAgICAgICByZXR1cm4gc2VsZi5tZW1iZXJzCgogICAgZGVmIGdldG5hbWVzKHNlbGYpOgogICAgICAgICIiIlJldHVybiB0aGUgbWVtYmVycyBvZiB0aGUgYXJjaGl2ZSBhcyBhIGxpc3Qgb2YgdGhlaXIgbmFtZXMuIEl0IGhhcwogICAgICAgICAgIHRoZSBzYW1lIG9yZGVyIGFzIHRoZSBsaXN0IHJldHVybmVkIGJ5IGdldG1lbWJlcnMoKS4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gW3RhcmluZm8ubmFtZSBmb3IgdGFyaW5mbyBpbiBzZWxmLmdldG1lbWJlcnMoKV0KCiAgICBkZWYgZ2V0dGFyaW5mbyhzZWxmLCBuYW1lPU5vbmUsIGFyY25hbWU9Tm9uZSwgZmlsZW9iaj1Ob25lKToKICAgICAgICAiIiJDcmVhdGUgYSBUYXJJbmZvIG9iamVjdCBmb3IgZWl0aGVyIHRoZSBmaWxlIGBuYW1lJyBvciB0aGUgZmlsZQogICAgICAgICAgIG9iamVjdCBgZmlsZW9iaicgKHVzaW5nIG9zLmZzdGF0IG9uIGl0cyBmaWxlIGRlc2NyaXB0b3IpLiBZb3UgY2FuCiAgICAgICAgICAgbW9kaWZ5IHNvbWUgb2YgdGhlIFRhckluZm8ncyBhdHRyaWJ1dGVzIGJlZm9yZSB5b3UgYWRkIGl0IHVzaW5nCiAgICAgICAgICAgYWRkZmlsZSgpLiBJZiBnaXZlbiwgYGFyY25hbWUnIHNwZWNpZmllcyBhbiBhbHRlcm5hdGl2ZSBuYW1lIGZvciB0aGUKICAgICAgICAgICBmaWxlIGluIHRoZSBhcmNoaXZlLgogICAgICAgICIiIgogICAgICAgIHNlbGYuX2NoZWNrKCJhdyIpCgogICAgICAgICMgV2hlbiBmaWxlb2JqIGlzIGdpdmVuLCByZXBsYWNlIG5hbWUgYnkKICAgICAgICAjIGZpbGVvYmoncyByZWFsIG5hbWUuCiAgICAgICAgaWYgZmlsZW9iaiBpcyBub3QgTm9uZToKICAgICAgICAgICAgbmFtZSA9IGZpbGVvYmoubmFtZQoKICAgICAgICAjIEJ1aWxkaW5nIHRoZSBuYW1lIG9mIHRoZSBtZW1iZXIgaW4gdGhlIGFyY2hpdmUuCiAgICAgICAgIyBCYWNrd2FyZCBzbGFzaGVzIGFyZSBjb252ZXJ0ZWQgdG8gZm9yd2FyZCBzbGFzaGVzLAogICAgICAgICMgQWJzb2x1dGUgcGF0aHMgYXJlIHR1cm5lZCB0byByZWxhdGl2ZSBwYXRocy4KICAgICAgICBpZiBhcmNuYW1lIGlzIE5vbmU6CiAgICAgICAgICAgIGFyY25hbWUgPSBuYW1lCiAgICAgICAgYXJjbmFtZSA9IG5vcm1wYXRoKGFyY25hbWUpCiAgICAgICAgZHJ2LCBhcmNuYW1lID0gb3MucGF0aC5zcGxpdGRyaXZlKGFyY25hbWUpCiAgICAgICAgd2hpbGUgYXJjbmFtZVswOjFdID09ICIvIjoKICAgICAgICAgICAgYXJjbmFtZSA9IGFyY25hbWVbMTpdCgogICAgICAgICMgTm93LCBmaWxsIHRoZSBUYXJJbmZvIG9iamVjdCB3aXRoCiAgICAgICAgIyBpbmZvcm1hdGlvbiBzcGVjaWZpYyBmb3IgdGhlIGZpbGUuCiAgICAgICAgdGFyaW5mbyA9IFRhckluZm8oKQoKICAgICAgICAjIFVzZSBvcy5zdGF0IG9yIG9zLmxzdGF0LCBkZXBlbmRpbmcgb24gcGxhdGZvcm0KICAgICAgICAjIGFuZCBpZiBzeW1saW5rcyBzaGFsbCBiZSByZXNvbHZlZC4KICAgICAgICBpZiBmaWxlb2JqIGlzIE5vbmU6CiAgICAgICAgICAgIGlmIGhhc2F0dHIob3MsICJsc3RhdCIpIGFuZCBub3Qgc2VsZi5kZXJlZmVyZW5jZToKICAgICAgICAgICAgICAgIHN0YXRyZXMgPSBvcy5sc3RhdChuYW1lKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc3RhdHJlcyA9IG9zLnN0YXQobmFtZSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBzdGF0cmVzID0gb3MuZnN0YXQoZmlsZW9iai5maWxlbm8oKSkKICAgICAgICBsaW5rbmFtZSA9ICIiCgogICAgICAgIHN0bWQgPSBzdGF0cmVzLnN0X21vZGUKICAgICAgICBpZiBzdGF0LlNfSVNSRUcoc3RtZCk6CiAgICAgICAgICAgIGlub2RlID0gKHN0YXRyZXMuc3RfaW5vLCBzdGF0cmVzLnN0X2RldikKICAgICAgICAgICAgaWYgaW5vZGUgaW4gc2VsZi5pbm9kZXMgYW5kIG5vdCBzZWxmLmRlcmVmZXJlbmNlOgogICAgICAgICAgICAgICAgIyBJcyBpdCBhIGhhcmRsaW5rIHRvIGFuIGFscmVhZHkKICAgICAgICAgICAgICAgICMgYXJjaGl2ZWQgZmlsZT8KICAgICAgICAgICAgICAgIHR5cGUgPSBMTktUWVBFCiAgICAgICAgICAgICAgICBsaW5rbmFtZSA9IHNlbGYuaW5vZGVzW2lub2RlXQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBUaGUgaW5vZGUgaXMgYWRkZWQgb25seSBpZiBpdHMgdmFsaWQuCiAgICAgICAgICAgICAgICAjIEZvciB3aW4zMiBpdCBpcyBhbHdheXMgMC4KICAgICAgICAgICAgICAgIHR5cGUgPSBSRUdUWVBFCiAgICAgICAgICAgICAgICBpZiBpbm9kZVswXToKICAgICAgICAgICAgICAgICAgICBzZWxmLmlub2Rlc1tpbm9kZV0gPSBhcmNuYW1lCiAgICAgICAgZWxpZiBzdGF0LlNfSVNESVIoc3RtZCk6CiAgICAgICAgICAgIHR5cGUgPSBESVJUWVBFCiAgICAgICAgICAgIGlmIGFyY25hbWVbLTE6XSAhPSAiLyI6CiAgICAgICAgICAgICAgICBhcmNuYW1lICs9ICIvIgogICAgICAgIGVsaWYgc3RhdC5TX0lTRklGTyhzdG1kKToKICAgICAgICAgICAgdHlwZSA9IEZJRk9UWVBFCiAgICAgICAgZWxpZiBzdGF0LlNfSVNMTksoc3RtZCk6CiAgICAgICAgICAgIHR5cGUgPSBTWU1UWVBFCiAgICAgICAgICAgIGxpbmtuYW1lID0gb3MucmVhZGxpbmsobmFtZSkKICAgICAgICBlbGlmIHN0YXQuU19JU0NIUihzdG1kKToKICAgICAgICAgICAgdHlwZSA9IENIUlRZUEUKICAgICAgICBlbGlmIHN0YXQuU19JU0JMSyhzdG1kKToKICAgICAgICAgICAgdHlwZSA9IEJMS1RZUEUKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gTm9uZQoKICAgICAgICAjIEZpbGwgdGhlIFRhckluZm8gb2JqZWN0IHdpdGggYWxsCiAgICAgICAgIyBpbmZvcm1hdGlvbiB3ZSBjYW4gZ2V0LgogICAgICAgIHRhcmluZm8ubmFtZSAgPSBhcmNuYW1lCiAgICAgICAgdGFyaW5mby5tb2RlICA9IHN0bWQKICAgICAgICB0YXJpbmZvLnVpZCAgID0gc3RhdHJlcy5zdF91aWQKICAgICAgICB0YXJpbmZvLmdpZCAgID0gc3RhdHJlcy5zdF9naWQKICAgICAgICBpZiBzdGF0LlNfSVNESVIoc3RtZCk6CiAgICAgICAgICAgICMgRm9yIGEgZGlyZWN0b3J5LCB0aGUgc2l6ZSBtdXN0IGJlIDAKICAgICAgICAgICAgdGFyaW5mby5zaXplICA9IDAKICAgICAgICBlbHNlOgogICAgICAgICAgICB0YXJpbmZvLnNpemUgPSBzdGF0cmVzLnN0X3NpemUKICAgICAgICB0YXJpbmZvLm10aW1lID0gc3RhdHJlcy5zdF9tdGltZQogICAgICAgIHRhcmluZm8udHlwZSAgPSB0eXBlCiAgICAgICAgdGFyaW5mby5saW5rbmFtZSA9IGxpbmtuYW1lCiAgICAgICAgaWYgcHdkOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICB0YXJpbmZvLnVuYW1lID0gcHdkLmdldHB3dWlkKHRhcmluZm8udWlkKVswXQogICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgaWYgZ3JwOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICB0YXJpbmZvLmduYW1lID0gZ3JwLmdldGdyZ2lkKHRhcmluZm8uZ2lkKVswXQogICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgICAgICBwYXNzCgogICAgICAgIGlmIHR5cGUgaW4gKENIUlRZUEUsIEJMS1RZUEUpOgogICAgICAgICAgICBpZiBoYXNhdHRyKG9zLCAibWFqb3IiKSBhbmQgaGFzYXR0cihvcywgIm1pbm9yIik6CiAgICAgICAgICAgICAgICB0YXJpbmZvLmRldm1ham9yID0gb3MubWFqb3Ioc3RhdHJlcy5zdF9yZGV2KQogICAgICAgICAgICAgICAgdGFyaW5mby5kZXZtaW5vciA9IG9zLm1pbm9yKHN0YXRyZXMuc3RfcmRldikKICAgICAgICByZXR1cm4gdGFyaW5mbwoKICAgIGRlZiBsaXN0KHNlbGYsIHZlcmJvc2U9VHJ1ZSk6CiAgICAgICAgIiIiUHJpbnQgYSB0YWJsZSBvZiBjb250ZW50cyB0byBzeXMuc3Rkb3V0LiBJZiBgdmVyYm9zZScgaXMgRmFsc2UsIG9ubHkKICAgICAgICAgICB0aGUgbmFtZXMgb2YgdGhlIG1lbWJlcnMgYXJlIHByaW50ZWQuIElmIGl0IGlzIFRydWUsIGFuIGBscyAtbCctbGlrZQogICAgICAgICAgIG91dHB1dCBpcyBwcm9kdWNlZC4KICAgICAgICAiIiIKICAgICAgICBzZWxmLl9jaGVjaygpCgogICAgICAgIGZvciB0YXJpbmZvIGluIHNlbGY6CiAgICAgICAgICAgIGlmIHZlcmJvc2U6CiAgICAgICAgICAgICAgICBwcmludCBmaWxlbW9kZSh0YXJpbmZvLm1vZGUpLAogICAgICAgICAgICAgICAgcHJpbnQgIiVzLyVzIiAlICh0YXJpbmZvLnVuYW1lIG9yIHRhcmluZm8udWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJpbmZvLmduYW1lIG9yIHRhcmluZm8uZ2lkKSwKICAgICAgICAgICAgICAgIGlmIHRhcmluZm8uaXNjaHIoKSBvciB0YXJpbmZvLmlzYmxrKCk6CiAgICAgICAgICAgICAgICAgICAgcHJpbnQgIiUxMHMiICUgKCIlZCwlZCIgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlICh0YXJpbmZvLmRldm1ham9yLCB0YXJpbmZvLmRldm1pbm9yKSksCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHByaW50ICIlMTBkIiAlIHRhcmluZm8uc2l6ZSwKICAgICAgICAgICAgICAgIHByaW50ICIlZC0lMDJkLSUwMmQgJTAyZDolMDJkOiUwMmQiIFwKICAgICAgICAgICAgICAgICAgICAgICUgdGltZS5sb2NhbHRpbWUodGFyaW5mby5tdGltZSlbOjZdLAoKICAgICAgICAgICAgcHJpbnQgdGFyaW5mby5uYW1lLAoKICAgICAgICAgICAgaWYgdmVyYm9zZToKICAgICAgICAgICAgICAgIGlmIHRhcmluZm8uaXNzeW0oKToKICAgICAgICAgICAgICAgICAgICBwcmludCAiLT4iLCB0YXJpbmZvLmxpbmtuYW1lLAogICAgICAgICAgICAgICAgaWYgdGFyaW5mby5pc2xuaygpOgogICAgICAgICAgICAgICAgICAgIHByaW50ICJsaW5rIHRvIiwgdGFyaW5mby5saW5rbmFtZSwKICAgICAgICAgICAgcHJpbnQKCiAgICBkZWYgYWRkKHNlbGYsIG5hbWUsIGFyY25hbWU9Tm9uZSwgcmVjdXJzaXZlPVRydWUpOgogICAgICAgICIiIkFkZCB0aGUgZmlsZSBgbmFtZScgdG8gdGhlIGFyY2hpdmUuIGBuYW1lJyBtYXkgYmUgYW55IHR5cGUgb2YgZmlsZQogICAgICAgICAgIChkaXJlY3RvcnksIGZpZm8sIHN5bWJvbGljIGxpbmssIGV0Yy4pLiBJZiBnaXZlbiwgYGFyY25hbWUnCiAgICAgICAgICAgc3BlY2lmaWVzIGFuIGFsdGVybmF0aXZlIG5hbWUgZm9yIHRoZSBmaWxlIGluIHRoZSBhcmNoaXZlLgogICAgICAgICAgIERpcmVjdG9yaWVzIGFyZSBhZGRlZCByZWN1cnNpdmVseSBieSBkZWZhdWx0LiBUaGlzIGNhbiBiZSBhdm9pZGVkIGJ5CiAgICAgICAgICAgc2V0dGluZyBgcmVjdXJzaXZlJyB0byBGYWxzZS4KICAgICAgICAiIiIKICAgICAgICBzZWxmLl9jaGVjaygiYXciKQoKICAgICAgICBpZiBhcmNuYW1lIGlzIE5vbmU6CiAgICAgICAgICAgIGFyY25hbWUgPSBuYW1lCgogICAgICAgICMgU2tpcCBpZiBzb21lYm9keSB0cmllcyB0byBhcmNoaXZlIHRoZSBhcmNoaXZlLi4uCiAgICAgICAgaWYgc2VsZi5uYW1lIGlzIG5vdCBOb25lIFwKICAgICAgICAgICAgYW5kIG9zLnBhdGguYWJzcGF0aChuYW1lKSA9PSBvcy5wYXRoLmFic3BhdGgoc2VsZi5uYW1lKToKICAgICAgICAgICAgc2VsZi5fZGJnKDIsICJ0YXJmaWxlOiBTa2lwcGVkICVyIiAlIG5hbWUpCiAgICAgICAgICAgIHJldHVybgoKICAgICAgICAjIFNwZWNpYWwgY2FzZTogVGhlIHVzZXIgd2FudHMgdG8gYWRkIHRoZSBjdXJyZW50CiAgICAgICAgIyB3b3JraW5nIGRpcmVjdG9yeS4KICAgICAgICBpZiBuYW1lID09ICIuIjoKICAgICAgICAgICAgaWYgcmVjdXJzaXZlOgogICAgICAgICAgICAgICAgaWYgYXJjbmFtZSA9PSAiLiI6CiAgICAgICAgICAgICAgICAgICAgYXJjbmFtZSA9ICIiCiAgICAgICAgICAgICAgICBmb3IgZiBpbiBvcy5saXN0ZGlyKCIuIik6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5hZGQoZiwgb3MucGF0aC5qb2luKGFyY25hbWUsIGYpKQogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgc2VsZi5fZGJnKDEsIG5hbWUpCgogICAgICAgICMgQ3JlYXRlIGEgVGFySW5mbyBvYmplY3QgZnJvbSB0aGUgZmlsZS4KICAgICAgICB0YXJpbmZvID0gc2VsZi5nZXR0YXJpbmZvKG5hbWUsIGFyY25hbWUpCgogICAgICAgIGlmIHRhcmluZm8gaXMgTm9uZToKICAgICAgICAgICAgc2VsZi5fZGJnKDEsICJ0YXJmaWxlOiBVbnN1cHBvcnRlZCB0eXBlICVyIiAlIG5hbWUpCiAgICAgICAgICAgIHJldHVybgoKICAgICAgICAjIEFwcGVuZCB0aGUgdGFyIGhlYWRlciBhbmQgZGF0YSB0byB0aGUgYXJjaGl2ZS4KICAgICAgICBpZiB0YXJpbmZvLmlzcmVnKCk6CiAgICAgICAgICAgIGYgPSBmaWxlKG5hbWUsICJyYiIpCiAgICAgICAgICAgIHNlbGYuYWRkZmlsZSh0YXJpbmZvLCBmKQogICAgICAgICAgICBmLmNsb3NlKCkKCiAgICAgICAgaWYgdGFyaW5mby50eXBlIGluIChMTktUWVBFLCBTWU1UWVBFLCBGSUZPVFlQRSwgQ0hSVFlQRSwgQkxLVFlQRSk6CiAgICAgICAgICAgIHRhcmluZm8uc2l6ZSA9IDBMCiAgICAgICAgICAgIHNlbGYuYWRkZmlsZSh0YXJpbmZvKQoKICAgICAgICBpZiB0YXJpbmZvLmlzZGlyKCk6CiAgICAgICAgICAgIHNlbGYuYWRkZmlsZSh0YXJpbmZvKQogICAgICAgICAgICBpZiByZWN1cnNpdmU6CiAgICAgICAgICAgICAgICBmb3IgZiBpbiBvcy5saXN0ZGlyKG5hbWUpOgogICAgICAgICAgICAgICAgICAgIHNlbGYuYWRkKG9zLnBhdGguam9pbihuYW1lLCBmKSwgb3MucGF0aC5qb2luKGFyY25hbWUsIGYpKQoKICAgIGRlZiBhZGRmaWxlKHNlbGYsIHRhcmluZm8sIGZpbGVvYmo9Tm9uZSk6CiAgICAgICAgIiIiQWRkIHRoZSBUYXJJbmZvIG9iamVjdCBgdGFyaW5mbycgdG8gdGhlIGFyY2hpdmUuIElmIGBmaWxlb2JqJyBpcwogICAgICAgICAgIGdpdmVuLCB0YXJpbmZvLnNpemUgYnl0ZXMgYXJlIHJlYWQgZnJvbSBpdCBhbmQgYWRkZWQgdG8gdGhlIGFyY2hpdmUuCiAgICAgICAgICAgWW91IGNhbiBjcmVhdGUgVGFySW5mbyBvYmplY3RzIHVzaW5nIGdldHRhcmluZm8oKS4KICAgICAgICAgICBPbiBXaW5kb3dzIHBsYXRmb3JtcywgYGZpbGVvYmonIHNob3VsZCBhbHdheXMgYmUgb3BlbmVkIHdpdGggbW9kZQogICAgICAgICAgICdyYicgdG8gYXZvaWQgaXJyaXRhdGlvbiBhYm91dCB0aGUgZmlsZSBzaXplLgogICAgICAgICIiIgogICAgICAgIHNlbGYuX2NoZWNrKCJhdyIpCgogICAgICAgIHRhcmluZm8ubmFtZSA9IG5vcm1wYXRoKHRhcmluZm8ubmFtZSkKICAgICAgICBpZiB0YXJpbmZvLmlzZGlyKCk6CiAgICAgICAgICAgICMgZGlyZWN0b3JpZXMgc2hvdWxkIGVuZCB3aXRoICcvJwogICAgICAgICAgICB0YXJpbmZvLm5hbWUgKz0gIi8iCgogICAgICAgIGlmIHRhcmluZm8ubGlua25hbWU6CiAgICAgICAgICAgIHRhcmluZm8ubGlua25hbWUgPSBub3JtcGF0aCh0YXJpbmZvLmxpbmtuYW1lKQoKICAgICAgICBpZiB0YXJpbmZvLnNpemUgPiBNQVhTSVpFX01FTUJFUjoKICAgICAgICAgICAgaWYgc2VsZi5wb3NpeDoKICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICJmaWxlIGlzIHRvbyBsYXJnZSAoPj0gOCBHQikiCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLl9kYmcoMiwgInRhcmZpbGU6IENyZWF0ZWQgR05VIHRhciBsYXJnZWZpbGUgaGVhZGVyIikKCgogICAgICAgIGlmIGxlbih0YXJpbmZvLmxpbmtuYW1lKSA+IExFTkdUSF9MSU5LOgogICAgICAgICAgICBpZiBzZWxmLnBvc2l4OgogICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgImxpbmtuYW1lIGlzIHRvbyBsb25nICg+JWQpIiBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIChMRU5HVEhfTElOSykKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNlbGYuX2NyZWF0ZV9nbnVsb25nKHRhcmluZm8ubGlua25hbWUsIEdOVVRZUEVfTE9OR0xJTkspCiAgICAgICAgICAgICAgICB0YXJpbmZvLmxpbmtuYW1lID0gdGFyaW5mby5saW5rbmFtZVs6TEVOR1RIX0xJTksgLTFdCiAgICAgICAgICAgICAgICBzZWxmLl9kYmcoMiwgInRhcmZpbGU6IENyZWF0ZWQgR05VIHRhciBleHRlbnNpb24gTE9OR0xJTksiKQoKICAgICAgICBpZiBsZW4odGFyaW5mby5uYW1lKSA+IExFTkdUSF9OQU1FOgogICAgICAgICAgICBpZiBzZWxmLnBvc2l4OgogICAgICAgICAgICAgICAgcHJlZml4ID0gdGFyaW5mby5uYW1lWzpMRU5HVEhfUFJFRklYICsgMV0KICAgICAgICAgICAgICAgIHdoaWxlIHByZWZpeCBhbmQgcHJlZml4Wy0xXSAhPSAiLyI6CiAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gcHJlZml4WzotMV0KCiAgICAgICAgICAgICAgICBuYW1lID0gdGFyaW5mby5uYW1lW2xlbihwcmVmaXgpOl0KICAgICAgICAgICAgICAgIHByZWZpeCA9IHByZWZpeFs6LTFdCgogICAgICAgICAgICAgICAgaWYgbm90IHByZWZpeCBvciBsZW4obmFtZSkgPiBMRU5HVEhfTkFNRToKICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAibmFtZSBpcyB0b28gbG9uZyAoPiVkKSIgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgKExFTkdUSF9OQU1FKQoKICAgICAgICAgICAgICAgIHRhcmluZm8ubmFtZSAgID0gbmFtZQogICAgICAgICAgICAgICAgdGFyaW5mby5wcmVmaXggPSBwcmVmaXgKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNlbGYuX2NyZWF0ZV9nbnVsb25nKHRhcmluZm8ubmFtZSwgR05VVFlQRV9MT05HTkFNRSkKICAgICAgICAgICAgICAgIHRhcmluZm8ubmFtZSA9IHRhcmluZm8ubmFtZVs6TEVOR1RIX05BTUUgLSAxXQogICAgICAgICAgICAgICAgc2VsZi5fZGJnKDIsICJ0YXJmaWxlOiBDcmVhdGVkIEdOVSB0YXIgZXh0ZW5zaW9uIExPTkdOQU1FIikKCiAgICAgICAgc2VsZi5maWxlb2JqLndyaXRlKHRhcmluZm8udG9idWYoKSkKICAgICAgICBzZWxmLm9mZnNldCArPSBCTE9DS1NJWkUKCiAgICAgICAgIyBJZiB0aGVyZSdzIGRhdGEgdG8gZm9sbG93LCBhcHBlbmQgaXQuCiAgICAgICAgaWYgZmlsZW9iaiBpcyBub3QgTm9uZToKICAgICAgICAgICAgY29weWZpbGVvYmooZmlsZW9iaiwgc2VsZi5maWxlb2JqLCB0YXJpbmZvLnNpemUpCiAgICAgICAgICAgIGJsb2NrcywgcmVtYWluZGVyID0gZGl2bW9kKHRhcmluZm8uc2l6ZSwgQkxPQ0tTSVpFKQogICAgICAgICAgICBpZiByZW1haW5kZXIgPiAwOgogICAgICAgICAgICAgICAgc2VsZi5maWxlb2JqLndyaXRlKE5VTCAqIChCTE9DS1NJWkUgLSByZW1haW5kZXIpKQogICAgICAgICAgICAgICAgYmxvY2tzICs9IDEKICAgICAgICAgICAgc2VsZi5vZmZzZXQgKz0gYmxvY2tzICogQkxPQ0tTSVpFCgogICAgICAgIHNlbGYubWVtYmVycy5hcHBlbmQodGFyaW5mbykKCiAgICBkZWYgZXh0cmFjdChzZWxmLCBtZW1iZXIsIHBhdGg9IiIpOgogICAgICAgICIiIkV4dHJhY3QgYSBtZW1iZXIgZnJvbSB0aGUgYXJjaGl2ZSB0byB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSwKICAgICAgICAgICB1c2luZyBpdHMgZnVsbCBuYW1lLiBJdHMgZmlsZSBpbmZvcm1hdGlvbiBpcyBleHRyYWN0ZWQgYXMgYWNjdXJhdGVseQogICAgICAgICAgIGFzIHBvc3NpYmxlLiBgbWVtYmVyJyBtYXkgYmUgYSBmaWxlbmFtZSBvciBhIFRhckluZm8gb2JqZWN0LiBZb3UgY2FuCiAgICAgICAgICAgc3BlY2lmeSBhIGRpZmZlcmVudCBkaXJlY3RvcnkgdXNpbmcgYHBhdGgnLgogICAgICAgICIiIgogICAgICAgIHNlbGYuX2NoZWNrKCJyIikKCiAgICAgICAgaWYgaXNpbnN0YW5jZShtZW1iZXIsIFRhckluZm8pOgogICAgICAgICAgICB0YXJpbmZvID0gbWVtYmVyCiAgICAgICAgZWxzZToKICAgICAgICAgICAgdGFyaW5mbyA9IHNlbGYuZ2V0bWVtYmVyKG1lbWJlcikKCiAgICAgICAgIyBQcmVwYXJlIHRoZSBsaW5rIHRhcmdldCBmb3IgbWFrZWxpbmsoKS4KICAgICAgICBpZiB0YXJpbmZvLmlzbG5rKCk6CiAgICAgICAgICAgIHRhcmluZm8uX2xpbmtfdGFyZ2V0ID0gb3MucGF0aC5qb2luKHBhdGgsIHRhcmluZm8ubGlua25hbWUpCgogICAgICAgIHRyeToKICAgICAgICAgICAgc2VsZi5fZXh0cmFjdF9tZW1iZXIodGFyaW5mbywgb3MucGF0aC5qb2luKHBhdGgsIHRhcmluZm8ubmFtZSkpCiAgICAgICAgZXhjZXB0IEVudmlyb25tZW50RXJyb3IsIGU6CiAgICAgICAgICAgIGlmIHNlbGYuZXJyb3JsZXZlbCA+IDA6CiAgICAgICAgICAgICAgICByYWlzZQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgaWYgZS5maWxlbmFtZSBpcyBOb25lOgogICAgICAgICAgICAgICAgICAgIHNlbGYuX2RiZygxLCAidGFyZmlsZTogJXMiICUgZS5zdHJlcnJvcikKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5fZGJnKDEsICJ0YXJmaWxlOiAlcyAlciIgJSAoZS5zdHJlcnJvciwgZS5maWxlbmFtZSkpCiAgICAgICAgZXhjZXB0IEV4dHJhY3RFcnJvciwgZToKICAgICAgICAgICAgaWYgc2VsZi5lcnJvcmxldmVsID4gMToKICAgICAgICAgICAgICAgIHJhaXNlCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLl9kYmcoMSwgInRhcmZpbGU6ICVzIiAlIGUpCgogICAgZGVmIGV4dHJhY3RmaWxlKHNlbGYsIG1lbWJlcik6CiAgICAgICAgIiIiRXh0cmFjdCBhIG1lbWJlciBmcm9tIHRoZSBhcmNoaXZlIGFzIGEgZmlsZSBvYmplY3QuIGBtZW1iZXInIG1heSBiZQogICAgICAgICAgIGEgZmlsZW5hbWUgb3IgYSBUYXJJbmZvIG9iamVjdC4gSWYgYG1lbWJlcicgaXMgYSByZWd1bGFyIGZpbGUsIGEKICAgICAgICAgICBmaWxlLWxpa2Ugb2JqZWN0IGlzIHJldHVybmVkLiBJZiBgbWVtYmVyJyBpcyBhIGxpbmssIGEgZmlsZS1saWtlCiAgICAgICAgICAgb2JqZWN0IGlzIGNvbnN0cnVjdGVkIGZyb20gdGhlIGxpbmsncyB0YXJnZXQuIElmIGBtZW1iZXInIGlzIG5vbmUgb2YKICAgICAgICAgICB0aGUgYWJvdmUsIE5vbmUgaXMgcmV0dXJuZWQuCiAgICAgICAgICAgVGhlIGZpbGUtbGlrZSBvYmplY3QgaXMgcmVhZC1vbmx5IGFuZCBwcm92aWRlcyB0aGUgZm9sbG93aW5nCiAgICAgICAgICAgbWV0aG9kczogcmVhZCgpLCByZWFkbGluZSgpLCByZWFkbGluZXMoKSwgc2VlaygpIGFuZCB0ZWxsKCkKICAgICAgICAiIiIKICAgICAgICBzZWxmLl9jaGVjaygiciIpCgogICAgICAgIGlmIGlzaW5zdGFuY2UobWVtYmVyLCBUYXJJbmZvKToKICAgICAgICAgICAgdGFyaW5mbyA9IG1lbWJlcgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHRhcmluZm8gPSBzZWxmLmdldG1lbWJlcihtZW1iZXIpCgogICAgICAgIGlmIHRhcmluZm8uaXNyZWcoKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuZmlsZW9iamVjdChzZWxmLCB0YXJpbmZvKQoKICAgICAgICBlbGlmIHRhcmluZm8udHlwZSBub3QgaW4gU1VQUE9SVEVEX1RZUEVTOgogICAgICAgICAgICAjIElmIGEgbWVtYmVyJ3MgdHlwZSBpcyB1bmtub3duLCBpdCBpcyB0cmVhdGVkIGFzIGEKICAgICAgICAgICAgIyByZWd1bGFyIGZpbGUuCiAgICAgICAgICAgIHJldHVybiBzZWxmLmZpbGVvYmplY3Qoc2VsZiwgdGFyaW5mbykKCiAgICAgICAgZWxpZiB0YXJpbmZvLmlzbG5rKCkgb3IgdGFyaW5mby5pc3N5bSgpOgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKHNlbGYuZmlsZW9iaiwgX1N0cmVhbSk6CiAgICAgICAgICAgICAgICAjIEEgc21hbGwgYnV0IHVnbHkgd29ya2Fyb3VuZCBmb3IgdGhlIGNhc2UgdGhhdCBzb21lb25lIHRyaWVzCiAgICAgICAgICAgICAgICAjIHRvIGV4dHJhY3QgYSAoc3ltKWxpbmsgYXMgYSBmaWxlLW9iamVjdCBmcm9tIGEgbm9uLXNlZWthYmxlCiAgICAgICAgICAgICAgICAjIHN0cmVhbSBvZiB0YXIgYmxvY2tzLgogICAgICAgICAgICAgICAgcmFpc2UgU3RyZWFtRXJyb3IsICJjYW5ub3QgZXh0cmFjdCAoc3ltKWxpbmsgYXMgZmlsZSBvYmplY3QiCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIEEgKHN5bSlsaW5rJ3MgZmlsZSBvYmplY3QgaXMgaXQncyB0YXJnZXQncyBmaWxlIG9iamVjdC4KICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmV4dHJhY3RmaWxlKHNlbGYuX2dldG1lbWJlcih0YXJpbmZvLmxpbmtuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmluZm8pKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgSWYgdGhlcmUncyBubyBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWVtYmVyIChkaXJlY3RvcnksIGNocmRldiwKICAgICAgICAgICAgIyBibGtkZXYsIGV0Yy4pLCByZXR1cm4gTm9uZSBpbnN0ZWFkIG9mIGEgZmlsZSBvYmplY3QuCiAgICAgICAgICAgIHJldHVybiBOb25lCgogICAgZGVmIF9leHRyYWN0X21lbWJlcihzZWxmLCB0YXJpbmZvLCB0YXJnZXRwYXRoKToKICAgICAgICAiIiJFeHRyYWN0IHRoZSBUYXJJbmZvIG9iamVjdCB0YXJpbmZvIHRvIGEgcGh5c2ljYWwKICAgICAgICAgICBmaWxlIGNhbGxlZCB0YXJnZXRwYXRoLgogICAgICAgICIiIgogICAgICAgICMgRmV0Y2ggdGhlIFRhckluZm8gb2JqZWN0IGZvciB0aGUgZ2l2ZW4gbmFtZQogICAgICAgICMgYW5kIGJ1aWxkIHRoZSBkZXN0aW5hdGlvbiBwYXRobmFtZSwgcmVwbGFjaW5nCiAgICAgICAgIyBmb3J3YXJkIHNsYXNoZXMgdG8gcGxhdGZvcm0gc3BlY2lmaWMgc2VwYXJhdG9ycy4KICAgICAgICBpZiB0YXJnZXRwYXRoWy0xOl0gPT0gIi8iOgogICAgICAgICAgICB0YXJnZXRwYXRoID0gdGFyZ2V0cGF0aFs6LTFdCiAgICAgICAgdGFyZ2V0cGF0aCA9IG9zLnBhdGgubm9ybXBhdGgodGFyZ2V0cGF0aCkKCiAgICAgICAgIyBDcmVhdGUgYWxsIHVwcGVyIGRpcmVjdG9yaWVzLgogICAgICAgIHVwcGVyZGlycyA9IG9zLnBhdGguZGlybmFtZSh0YXJnZXRwYXRoKQogICAgICAgIGlmIHVwcGVyZGlycyBhbmQgbm90IG9zLnBhdGguZXhpc3RzKHVwcGVyZGlycyk6CiAgICAgICAgICAgIHRpID0gVGFySW5mbygpCiAgICAgICAgICAgIHRpLm5hbWUgID0gdXBwZXJkaXJzCiAgICAgICAgICAgIHRpLnR5cGUgID0gRElSVFlQRQogICAgICAgICAgICB0aS5tb2RlICA9IDA3NzcKICAgICAgICAgICAgdGkubXRpbWUgPSB0YXJpbmZvLm10aW1lCiAgICAgICAgICAgIHRpLnVpZCAgID0gdGFyaW5mby51aWQKICAgICAgICAgICAgdGkuZ2lkICAgPSB0YXJpbmZvLmdpZAogICAgICAgICAgICB0aS51bmFtZSA9IHRhcmluZm8udW5hbWUKICAgICAgICAgICAgdGkuZ25hbWUgPSB0YXJpbmZvLmduYW1lCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHNlbGYuX2V4dHJhY3RfbWVtYmVyKHRpLCB0aS5uYW1lKQogICAgICAgICAgICBleGNlcHQ6CiAgICAgICAgICAgICAgICBwYXNzCgogICAgICAgIGlmIHRhcmluZm8uaXNsbmsoKSBvciB0YXJpbmZvLmlzc3ltKCk6CiAgICAgICAgICAgIHNlbGYuX2RiZygxLCAiJXMgLT4gJXMiICUgKHRhcmluZm8ubmFtZSwgdGFyaW5mby5saW5rbmFtZSkpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5fZGJnKDEsIHRhcmluZm8ubmFtZSkKCiAgICAgICAgaWYgdGFyaW5mby5pc3JlZygpOgogICAgICAgICAgICBzZWxmLm1ha2VmaWxlKHRhcmluZm8sIHRhcmdldHBhdGgpCiAgICAgICAgZWxpZiB0YXJpbmZvLmlzZGlyKCk6CiAgICAgICAgICAgIHNlbGYubWFrZWRpcih0YXJpbmZvLCB0YXJnZXRwYXRoKQogICAgICAgIGVsaWYgdGFyaW5mby5pc2ZpZm8oKToKICAgICAgICAgICAgc2VsZi5tYWtlZmlmbyh0YXJpbmZvLCB0YXJnZXRwYXRoKQogICAgICAgIGVsaWYgdGFyaW5mby5pc2NocigpIG9yIHRhcmluZm8uaXNibGsoKToKICAgICAgICAgICAgc2VsZi5tYWtlZGV2KHRhcmluZm8sIHRhcmdldHBhdGgpCiAgICAgICAgZWxpZiB0YXJpbmZvLmlzbG5rKCkgb3IgdGFyaW5mby5pc3N5bSgpOgogICAgICAgICAgICBzZWxmLm1ha2VsaW5rKHRhcmluZm8sIHRhcmdldHBhdGgpCiAgICAgICAgZWxpZiB0YXJpbmZvLnR5cGUgbm90IGluIFNVUFBPUlRFRF9UWVBFUzoKICAgICAgICAgICAgc2VsZi5tYWtldW5rbm93bih0YXJpbmZvLCB0YXJnZXRwYXRoKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYubWFrZWZpbGUodGFyaW5mbywgdGFyZ2V0cGF0aCkKCiAgICAgICAgc2VsZi5jaG93bih0YXJpbmZvLCB0YXJnZXRwYXRoKQogICAgICAgIGlmIG5vdCB0YXJpbmZvLmlzc3ltKCk6CiAgICAgICAgICAgIHNlbGYuY2htb2QodGFyaW5mbywgdGFyZ2V0cGF0aCkKICAgICAgICAgICAgc2VsZi51dGltZSh0YXJpbmZvLCB0YXJnZXRwYXRoKQoKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIyBCZWxvdyBhcmUgdGhlIGRpZmZlcmVudCBmaWxlIG1ldGhvZHMuIFRoZXkgYXJlIGNhbGxlZCB2aWEKICAgICMgX2V4dHJhY3RfbWVtYmVyKCkgd2hlbiBleHRyYWN0KCkgaXMgY2FsbGVkLiBUaGV5IGNhbiBiZSByZXBsYWNlZCBpbiBhCiAgICAjIHN1YmNsYXNzIHRvIGltcGxlbWVudCBvdGhlciBmdW5jdGlvbmFsaXR5LgoKICAgIGRlZiBtYWtlZGlyKHNlbGYsIHRhcmluZm8sIHRhcmdldHBhdGgpOgogICAgICAgICIiIk1ha2UgYSBkaXJlY3RvcnkgY2FsbGVkIHRhcmdldHBhdGguCiAgICAgICAgIiIiCiAgICAgICAgdHJ5OgogICAgICAgICAgICBvcy5ta2Rpcih0YXJnZXRwYXRoKQogICAgICAgIGV4Y2VwdCBFbnZpcm9ubWVudEVycm9yLCBlOgogICAgICAgICAgICBpZiBlLmVycm5vICE9IGVycm5vLkVFWElTVDoKICAgICAgICAgICAgICAgIHJhaXNlCgogICAgZGVmIG1ha2VmaWxlKHNlbGYsIHRhcmluZm8sIHRhcmdldHBhdGgpOgogICAgICAgICIiIk1ha2UgYSBmaWxlIGNhbGxlZCB0YXJnZXRwYXRoLgogICAgICAgICIiIgogICAgICAgIHNvdXJjZSA9IHNlbGYuZXh0cmFjdGZpbGUodGFyaW5mbykKICAgICAgICB0YXJnZXQgPSBmaWxlKHRhcmdldHBhdGgsICJ3YiIpCiAgICAgICAgY29weWZpbGVvYmooc291cmNlLCB0YXJnZXQpCiAgICAgICAgc291cmNlLmNsb3NlKCkKICAgICAgICB0YXJnZXQuY2xvc2UoKQoKICAgIGRlZiBtYWtldW5rbm93bihzZWxmLCB0YXJpbmZvLCB0YXJnZXRwYXRoKToKICAgICAgICAiIiJNYWtlIGEgZmlsZSBmcm9tIGEgVGFySW5mbyBvYmplY3Qgd2l0aCBhbiB1bmtub3duIHR5cGUKICAgICAgICAgICBhdCB0YXJnZXRwYXRoLgogICAgICAgICIiIgogICAgICAgIHNlbGYubWFrZWZpbGUodGFyaW5mbywgdGFyZ2V0cGF0aCkKICAgICAgICBzZWxmLl9kYmcoMSwgInRhcmZpbGU6IFVua25vd24gZmlsZSB0eXBlICVyLCAiIFwKICAgICAgICAgICAgICAgICAgICAgImV4dHJhY3RlZCBhcyByZWd1bGFyIGZpbGUuIiAlIHRhcmluZm8udHlwZSkKCiAgICBkZWYgbWFrZWZpZm8oc2VsZiwgdGFyaW5mbywgdGFyZ2V0cGF0aCk6CiAgICAgICAgIiIiTWFrZSBhIGZpZm8gY2FsbGVkIHRhcmdldHBhdGguCiAgICAgICAgIiIiCiAgICAgICAgaWYgaGFzYXR0cihvcywgIm1rZmlmbyIpOgogICAgICAgICAgICBvcy5ta2ZpZm8odGFyZ2V0cGF0aCkKICAgICAgICBlbHNlOgogICAgICAgICAgICByYWlzZSBFeHRyYWN0RXJyb3IsICJmaWZvIG5vdCBzdXBwb3J0ZWQgYnkgc3lzdGVtIgoKICAgIGRlZiBtYWtlZGV2KHNlbGYsIHRhcmluZm8sIHRhcmdldHBhdGgpOgogICAgICAgICIiIk1ha2UgYSBjaGFyYWN0ZXIgb3IgYmxvY2sgZGV2aWNlIGNhbGxlZCB0YXJnZXRwYXRoLgogICAgICAgICIiIgogICAgICAgIGlmIG5vdCBoYXNhdHRyKG9zLCAibWtub2QiKSBvciBub3QgaGFzYXR0cihvcywgIm1ha2VkZXYiKToKICAgICAgICAgICAgcmFpc2UgRXh0cmFjdEVycm9yLCAic3BlY2lhbCBkZXZpY2VzIG5vdCBzdXBwb3J0ZWQgYnkgc3lzdGVtIgoKICAgICAgICBtb2RlID0gdGFyaW5mby5tb2RlCiAgICAgICAgaWYgdGFyaW5mby5pc2JsaygpOgogICAgICAgICAgICBtb2RlIHw9IHN0YXQuU19JRkJMSwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIG1vZGUgfD0gc3RhdC5TX0lGQ0hSCgogICAgICAgIG9zLm1rbm9kKHRhcmdldHBhdGgsIG1vZGUsCiAgICAgICAgICAgICAgICAgb3MubWFrZWRldih0YXJpbmZvLmRldm1ham9yLCB0YXJpbmZvLmRldm1pbm9yKSkKCiAgICBkZWYgbWFrZWxpbmsoc2VsZiwgdGFyaW5mbywgdGFyZ2V0cGF0aCk6CiAgICAgICAgIiIiTWFrZSBhIChzeW1ib2xpYykgbGluayBjYWxsZWQgdGFyZ2V0cGF0aC4gSWYgaXQgY2Fubm90IGJlIGNyZWF0ZWQKICAgICAgICAgIChwbGF0Zm9ybSBsaW1pdGF0aW9uKSwgd2UgdHJ5IHRvIG1ha2UgYSBjb3B5IG9mIHRoZSByZWZlcmVuY2VkIGZpbGUKICAgICAgICAgIGluc3RlYWQgb2YgYSBsaW5rLgogICAgICAgICIiIgogICAgICAgIGxpbmtwYXRoID0gdGFyaW5mby5saW5rbmFtZQogICAgICAgIHRyeToKICAgICAgICAgICAgaWYgdGFyaW5mby5pc3N5bSgpOgogICAgICAgICAgICAgICAgb3Muc3ltbGluayhsaW5rcGF0aCwgdGFyZ2V0cGF0aCkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgU2VlIGV4dHJhY3QoKS4KICAgICAgICAgICAgICAgIG9zLmxpbmsodGFyaW5mby5fbGlua190YXJnZXQsIHRhcmdldHBhdGgpCiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICBpZiB0YXJpbmZvLmlzc3ltKCk6CiAgICAgICAgICAgICAgICBsaW5rcGF0aCA9IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUodGFyaW5mby5uYW1lKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtwYXRoKQogICAgICAgICAgICAgICAgbGlua3BhdGggPSBub3JtcGF0aChsaW5rcGF0aCkKCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHNlbGYuX2V4dHJhY3RfbWVtYmVyKHNlbGYuZ2V0bWVtYmVyKGxpbmtwYXRoKSwgdGFyZ2V0cGF0aCkKICAgICAgICAgICAgZXhjZXB0IChFbnZpcm9ubWVudEVycm9yLCBLZXlFcnJvciksIGU6CiAgICAgICAgICAgICAgICBsaW5rcGF0aCA9IG9zLnBhdGgubm9ybXBhdGgobGlua3BhdGgpCiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgc2h1dGlsLmNvcHkyKGxpbmtwYXRoLCB0YXJnZXRwYXRoKQogICAgICAgICAgICAgICAgZXhjZXB0IEVudmlyb25tZW50RXJyb3IsIGU6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgSU9FcnJvciwgImxpbmsgY291bGQgbm90IGJlIGNyZWF0ZWQiCgogICAgZGVmIGNob3duKHNlbGYsIHRhcmluZm8sIHRhcmdldHBhdGgpOgogICAgICAgICIiIlNldCBvd25lciBvZiB0YXJnZXRwYXRoIGFjY29yZGluZyB0byB0YXJpbmZvLgogICAgICAgICIiIgogICAgICAgIGlmIHB3ZCBhbmQgaGFzYXR0cihvcywgImdldGV1aWQiKSBhbmQgb3MuZ2V0ZXVpZCgpID09IDA6CiAgICAgICAgICAgICMgV2UgaGF2ZSB0byBiZSByb290IHRvIGRvIHNvLgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBnID0gZ3JwLmdldGdybmFtKHRhcmluZm8uZ25hbWUpWzJdCiAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICBnID0gZ3JwLmdldGdyZ2lkKHRhcmluZm8uZ2lkKVsyXQogICAgICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICAgICAgICAgIGcgPSBvcy5nZXRnaWQoKQogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICB1ID0gcHdkLmdldHB3bmFtKHRhcmluZm8udW5hbWUpWzJdCiAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICB1ID0gcHdkLmdldHB3dWlkKHRhcmluZm8udWlkKVsyXQogICAgICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICAgICAgICAgIHUgPSBvcy5nZXR1aWQoKQogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBpZiB0YXJpbmZvLmlzc3ltKCkgYW5kIGhhc2F0dHIob3MsICJsY2hvd24iKToKICAgICAgICAgICAgICAgICAgICBvcy5sY2hvd24odGFyZ2V0cGF0aCwgdSwgZykKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgaWYgc3lzLnBsYXRmb3JtICE9ICJvczJlbXgiOgogICAgICAgICAgICAgICAgICAgICAgICBvcy5jaG93bih0YXJnZXRwYXRoLCB1LCBnKQogICAgICAgICAgICBleGNlcHQgRW52aXJvbm1lbnRFcnJvciwgZToKICAgICAgICAgICAgICAgIHJhaXNlIEV4dHJhY3RFcnJvciwgImNvdWxkIG5vdCBjaGFuZ2Ugb3duZXIiCgogICAgZGVmIGNobW9kKHNlbGYsIHRhcmluZm8sIHRhcmdldHBhdGgpOgogICAgICAgICIiIlNldCBmaWxlIHBlcm1pc3Npb25zIG9mIHRhcmdldHBhdGggYWNjb3JkaW5nIHRvIHRhcmluZm8uCiAgICAgICAgIiIiCiAgICAgICAgaWYgaGFzYXR0cihvcywgJ2NobW9kJyk6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIG9zLmNobW9kKHRhcmdldHBhdGgsIHRhcmluZm8ubW9kZSkKICAgICAgICAgICAgZXhjZXB0IEVudmlyb25tZW50RXJyb3IsIGU6CiAgICAgICAgICAgICAgICByYWlzZSBFeHRyYWN0RXJyb3IsICJjb3VsZCBub3QgY2hhbmdlIG1vZGUiCgogICAgZGVmIHV0aW1lKHNlbGYsIHRhcmluZm8sIHRhcmdldHBhdGgpOgogICAgICAgICIiIlNldCBtb2RpZmljYXRpb24gdGltZSBvZiB0YXJnZXRwYXRoIGFjY29yZGluZyB0byB0YXJpbmZvLgogICAgICAgICIiIgogICAgICAgIGlmIG5vdCBoYXNhdHRyKG9zLCAndXRpbWUnKToKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgaWYgc3lzLnBsYXRmb3JtID09ICJ3aW4zMiIgYW5kIHRhcmluZm8uaXNkaXIoKToKICAgICAgICAgICAgIyBBY2NvcmRpbmcgdG8gbXNkbi5taWNyb3NvZnQuY29tLCBpdCBpcyBhbiBlcnJvciAoRUFDQ0VTKQogICAgICAgICAgICAjIHRvIHVzZSB1dGltZSgpIG9uIGRpcmVjdG9yaWVzLgogICAgICAgICAgICByZXR1cm4KICAgICAgICB0cnk6CiAgICAgICAgICAgIG9zLnV0aW1lKHRhcmdldHBhdGgsICh0YXJpbmZvLm10aW1lLCB0YXJpbmZvLm10aW1lKSkKICAgICAgICBleGNlcHQgRW52aXJvbm1lbnRFcnJvciwgZToKICAgICAgICAgICAgcmFpc2UgRXh0cmFjdEVycm9yLCAiY291bGQgbm90IGNoYW5nZSBtb2RpZmljYXRpb24gdGltZSIKCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICBkZWYgbmV4dChzZWxmKToKICAgICAgICAiIiJSZXR1cm4gdGhlIG5leHQgbWVtYmVyIG9mIHRoZSBhcmNoaXZlIGFzIGEgVGFySW5mbyBvYmplY3QsIHdoZW4KICAgICAgICAgICBUYXJGaWxlIGlzIG9wZW5lZCBmb3IgcmVhZGluZy4gUmV0dXJuIE5vbmUgaWYgdGhlcmUgaXMgbm8gbW9yZQogICAgICAgICAgIGF2YWlsYWJsZS4KICAgICAgICAiIiIKICAgICAgICBzZWxmLl9jaGVjaygicmEiKQogICAgICAgIGlmIHNlbGYuZmlyc3RtZW1iZXIgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIG0gPSBzZWxmLmZpcnN0bWVtYmVyCiAgICAgICAgICAgIHNlbGYuZmlyc3RtZW1iZXIgPSBOb25lCiAgICAgICAgICAgIHJldHVybiBtCgogICAgICAgICMgUmVhZCB0aGUgbmV4dCBibG9jay4KICAgICAgICBzZWxmLmZpbGVvYmouc2VlayhzZWxmLm9mZnNldCkKICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICBidWYgPSBzZWxmLmZpbGVvYmoucmVhZChCTE9DS1NJWkUpCiAgICAgICAgICAgIGlmIG5vdCBidWY6CiAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICB0YXJpbmZvID0gVGFySW5mby5mcm9tYnVmKGJ1ZikKICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgICAgICBpZiBzZWxmLmlnbm9yZV96ZXJvczoKICAgICAgICAgICAgICAgICAgICBpZiBidWYuY291bnQoTlVMKSA9PSBCTE9DS1NJWkU6CiAgICAgICAgICAgICAgICAgICAgICAgIGFkaiA9ICJlbXB0eSIKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBhZGogPSAiaW52YWxpZCIKICAgICAgICAgICAgICAgICAgICBzZWxmLl9kYmcoMiwgIjB4JVg6ICVzIGJsb2NrIiAlIChzZWxmLm9mZnNldCwgYWRqKSkKICAgICAgICAgICAgICAgICAgICBzZWxmLm9mZnNldCArPSBCTE9DS1NJWkUKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAjIEJsb2NrIGlzIGVtcHR5IG9yIHVucmVhZGFibGUuCiAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5vZmZzZXQgPT0gMDoKICAgICAgICAgICAgICAgICAgICAgICAgIyBJZiB0aGUgZmlyc3QgYmxvY2sgaXMgaW52YWxpZC4gVGhhdCBkb2VzIG5vdAogICAgICAgICAgICAgICAgICAgICAgICAjIGxvb2sgbGlrZSBhIHRhciBhcmNoaXZlIHdlIGNhbiBoYW5kbGUuCiAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIFJlYWRFcnJvciwiZW1wdHksIHVucmVhZGFibGUgb3IgY29tcHJlc3NlZCBmaWxlIgogICAgICAgICAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgICAgIGJyZWFrCgogICAgICAgICMgV2Ugc2hvdWxkbid0IHJlbHkgb24gdGhpcyBjaGVja3N1bSwgYmVjYXVzZSBzb21lIHRhciBwcm9ncmFtcwogICAgICAgICMgY2FsY3VsYXRlIGl0IGRpZmZlcmVudGx5IGFuZCBpdCBpcyBtZXJlbHkgdmFsaWRhdGluZyB0aGUKICAgICAgICAjIGhlYWRlciBibG9jay4gV2UgY291bGQganVzdCBhcyB3ZWxsIHNraXAgdGhpcyBwYXJ0LCB3aGljaCB3b3VsZAogICAgICAgICMgaGF2ZSBhIHNsaWdodCBlZmZlY3Qgb24gcGVyZm9ybWFuY2UuLi4KICAgICAgICBpZiB0YXJpbmZvLmNoa3N1bSAhPSBjYWxjX2Noa3N1bShidWYpOgogICAgICAgICAgICBzZWxmLl9kYmcoMSwgInRhcmZpbGU6IEJhZCBDaGVja3N1bSAlciIgJSB0YXJpbmZvLm5hbWUpCgogICAgICAgICMgU2V0IHRoZSBUYXJJbmZvIG9iamVjdCdzIG9mZnNldCB0byB0aGUgY3VycmVudCBwb3NpdGlvbiBvZiB0aGUKICAgICAgICAjIFRhckZpbGUgYW5kIHNldCBzZWxmLm9mZnNldCB0byB0aGUgcG9zaXRpb24gd2hlcmUgdGhlIGRhdGEgYmxvY2tzCiAgICAgICAgIyBzaG91bGQgYmVnaW4uCiAgICAgICAgdGFyaW5mby5vZmZzZXQgPSBzZWxmLm9mZnNldAogICAgICAgIHNlbGYub2Zmc2V0ICs9IEJMT0NLU0laRQoKICAgICAgICAjIENoZWNrIGlmIHRoZSBUYXJJbmZvIG9iamVjdCBoYXMgYSB0eXBlZmxhZyBmb3Igd2hpY2ggYSBjYWxsYmFjawogICAgICAgICMgbWV0aG9kIGlzIHJlZ2lzdGVyZWQgaW4gdGhlIFRZUEVfTUVUSC4gSWYgc28sIHRoZW4gY2FsbCBpdC4KICAgICAgICBpZiB0YXJpbmZvLnR5cGUgaW4gc2VsZi5UWVBFX01FVEg6CiAgICAgICAgICAgIHJldHVybiBzZWxmLlRZUEVfTUVUSFt0YXJpbmZvLnR5cGVdKHNlbGYsIHRhcmluZm8pCgogICAgICAgIHRhcmluZm8ub2Zmc2V0X2RhdGEgPSBzZWxmLm9mZnNldAogICAgICAgIGlmIHRhcmluZm8uaXNyZWcoKSBvciB0YXJpbmZvLnR5cGUgbm90IGluIFNVUFBPUlRFRF9UWVBFUzoKICAgICAgICAgICAgIyBTa2lwIHRoZSBmb2xsb3dpbmcgZGF0YSBibG9ja3MuCiAgICAgICAgICAgIHNlbGYub2Zmc2V0ICs9IHNlbGYuX2Jsb2NrKHRhcmluZm8uc2l6ZSkKCiAgICAgICAgaWYgdGFyaW5mby5pc3JlZygpIGFuZCB0YXJpbmZvLm5hbWVbOi0xXSA9PSAiLyI6CiAgICAgICAgICAgICMgc29tZSBvbGQgdGFyIHByb2dyYW1zIGRvbid0IGtub3cgRElSVFlQRQogICAgICAgICAgICB0YXJpbmZvLnR5cGUgPSBESVJUWVBFCgogICAgICAgIHNlbGYubWVtYmVycy5hcHBlbmQodGFyaW5mbykKICAgICAgICByZXR1cm4gdGFyaW5mbwoKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIyBCZWxvdyBhcmUgc29tZSBtZXRob2RzIHdoaWNoIGFyZSBjYWxsZWQgZm9yIHNwZWNpYWwgdHlwZWZsYWdzIGluIHRoZQogICAgIyBuZXh0KCkgbWV0aG9kLCBlLmcuIGZvciB1bndyYXBwaW5nIEdOVSBsb25nbmFtZS9sb25nbGluayBibG9ja3MuIFRoZXkKICAgICMgYXJlIHJlZ2lzdGVyZWQgaW4gVFlQRV9NRVRIIGJlbG93LiBZb3UgY2FuIHJlZ2lzdGVyIHlvdXIgb3duIG1ldGhvZHMKICAgICMgd2l0aCB0aGlzIG1hcHBpbmcuCiAgICAjIEEgcmVnaXN0ZXJlZCBtZXRob2QgaXMgY2FsbGVkIHdpdGggYSBUYXJJbmZvIG9iamVjdCBhcyBvbmx5IGFyZ3VtZW50LgogICAgIwogICAgIyBEdXJpbmcgaXRzIGV4ZWN1dGlvbiB0aGUgbWV0aG9kIE1VU1QgcGVyZm9ybSB0aGUgZm9sbG93aW5nIHRhc2tzOgogICAgIyAxLiBzZXQgdGFyaW5mby5vZmZzZXRfZGF0YSB0byB0aGUgcG9zaXRpb24gd2hlcmUgdGhlIGRhdGEgYmxvY2tzIGJlZ2luLAogICAgIyAgICBpZiB0aGVyZSBpcyBkYXRhIHRvIGZvbGxvdy4KICAgICMgMi4gc2V0IHNlbGYub2Zmc2V0IHRvIHRoZSBwb3NpdGlvbiB3aGVyZSB0aGUgbmV4dCBtZW1iZXIncyBoZWFkZXIgd2lsbAogICAgIyAgICBiZWdpbi4KICAgICMgMy4gYXBwZW5kIHRoZSB0YXJpbmZvIG9iamVjdCB0byBzZWxmLm1lbWJlcnMsIGlmIGl0IGlzIHN1cHBvc2VkIHRvIGFwcGVhcgogICAgIyAgICBhcyBhIG1lbWJlciBvZiB0aGUgVGFyRmlsZSBvYmplY3QuCiAgICAjIDQuIHJldHVybiB0YXJpbmZvIG9yIGFub3RoZXIgdmFsaWQgVGFySW5mbyBvYmplY3QuCgogICAgZGVmIHByb2NfZ251bG9uZyhzZWxmLCB0YXJpbmZvKToKICAgICAgICAiIiJFdmFsdWF0ZSB0aGUgYmxvY2tzIHRoYXQgaG9sZCBhIEdOVSBsb25nbmFtZQogICAgICAgICAgIG9yIGxvbmdsaW5rIG1lbWJlci4KICAgICAgICAiIiIKICAgICAgICBidWYgPSAiIgogICAgICAgIGNvdW50ID0gdGFyaW5mby5zaXplCiAgICAgICAgd2hpbGUgY291bnQgPiAwOgogICAgICAgICAgICBibG9jayA9IHNlbGYuZmlsZW9iai5yZWFkKEJMT0NLU0laRSkKICAgICAgICAgICAgYnVmICs9IGJsb2NrCiAgICAgICAgICAgIHNlbGYub2Zmc2V0ICs9IEJMT0NLU0laRQogICAgICAgICAgICBjb3VudCAtPSBCTE9DS1NJWkUKCiAgICAgICAgIyBGZXRjaCB0aGUgbmV4dCBoZWFkZXIKICAgICAgICBuZXh0ID0gc2VsZi5uZXh0KCkKCiAgICAgICAgbmV4dC5vZmZzZXQgPSB0YXJpbmZvLm9mZnNldAogICAgICAgIGlmIHRhcmluZm8udHlwZSA9PSBHTlVUWVBFX0xPTkdOQU1FOgogICAgICAgICAgICBuZXh0Lm5hbWUgPSBudHMoYnVmKQogICAgICAgIGVsaWYgdGFyaW5mby50eXBlID09IEdOVVRZUEVfTE9OR0xJTks6CiAgICAgICAgICAgIG5leHQubGlua25hbWUgPSBudHMoYnVmKQoKICAgICAgICByZXR1cm4gbmV4dAoKICAgIGRlZiBwcm9jX3NwYXJzZShzZWxmLCB0YXJpbmZvKToKICAgICAgICAiIiJBbmFseXplIGEgR05VIHNwYXJzZSBoZWFkZXIgcGx1cyBleHRyYSBoZWFkZXJzLgogICAgICAgICIiIgogICAgICAgIGJ1ZiA9IHRhcmluZm8udG9idWYoKQogICAgICAgIHNwID0gX3JpbmdidWZmZXIoKQogICAgICAgIHBvcyA9IDM4NgogICAgICAgIGxhc3Rwb3MgPSAwTAogICAgICAgIHJlYWxwb3MgPSAwTAogICAgICAgICMgVGhlcmUgYXJlIDQgcG9zc2libGUgc3BhcnNlIHN0cnVjdHMgaW4gdGhlCiAgICAgICAgIyBmaXJzdCBoZWFkZXIuCiAgICAgICAgZm9yIGkgaW4geHJhbmdlKDQpOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBvZmZzZXQgPSBpbnQoYnVmW3Bvczpwb3MgKyAxMl0sIDgpCiAgICAgICAgICAgICAgICBudW1ieXRlcyA9IGludChidWZbcG9zICsgMTI6cG9zICsgMjRdLCA4KQogICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIGlmIG9mZnNldCA+IGxhc3Rwb3M6CiAgICAgICAgICAgICAgICBzcC5hcHBlbmQoX2hvbGUobGFzdHBvcywgb2Zmc2V0IC0gbGFzdHBvcykpCiAgICAgICAgICAgIHNwLmFwcGVuZChfZGF0YShvZmZzZXQsIG51bWJ5dGVzLCByZWFscG9zKSkKICAgICAgICAgICAgcmVhbHBvcyArPSBudW1ieXRlcwogICAgICAgICAgICBsYXN0cG9zID0gb2Zmc2V0ICsgbnVtYnl0ZXMKICAgICAgICAgICAgcG9zICs9IDI0CgogICAgICAgIGlzZXh0ZW5kZWQgPSBvcmQoYnVmWzQ4Ml0pCiAgICAgICAgb3JpZ3NpemUgPSBpbnQoYnVmWzQ4Mzo0OTVdLCA4KQoKICAgICAgICAjIElmIHRoZSBpc2V4dGVuZGVkIGZsYWcgaXMgZ2l2ZW4sCiAgICAgICAgIyB0aGVyZSBhcmUgZXh0cmEgaGVhZGVycyB0byBwcm9jZXNzLgogICAgICAgIHdoaWxlIGlzZXh0ZW5kZWQgPT0gMToKICAgICAgICAgICAgYnVmID0gc2VsZi5maWxlb2JqLnJlYWQoQkxPQ0tTSVpFKQogICAgICAgICAgICBzZWxmLm9mZnNldCArPSBCTE9DS1NJWkUKICAgICAgICAgICAgcG9zID0gMAogICAgICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoMjEpOgogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IGludChidWZbcG9zOnBvcyArIDEyXSwgOCkKICAgICAgICAgICAgICAgICAgICBudW1ieXRlcyA9IGludChidWZbcG9zICsgMTI6cG9zICsgMjRdLCA4KQogICAgICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgIGlmIG9mZnNldCA+IGxhc3Rwb3M6CiAgICAgICAgICAgICAgICAgICAgc3AuYXBwZW5kKF9ob2xlKGxhc3Rwb3MsIG9mZnNldCAtIGxhc3Rwb3MpKQogICAgICAgICAgICAgICAgc3AuYXBwZW5kKF9kYXRhKG9mZnNldCwgbnVtYnl0ZXMsIHJlYWxwb3MpKQogICAgICAgICAgICAgICAgcmVhbHBvcyArPSBudW1ieXRlcwogICAgICAgICAgICAgICAgbGFzdHBvcyA9IG9mZnNldCArIG51bWJ5dGVzCiAgICAgICAgICAgICAgICBwb3MgKz0gMjQKICAgICAgICAgICAgaXNleHRlbmRlZCA9IG9yZChidWZbNTA0XSkKCiAgICAgICAgaWYgbGFzdHBvcyA8IG9yaWdzaXplOgogICAgICAgICAgICBzcC5hcHBlbmQoX2hvbGUobGFzdHBvcywgb3JpZ3NpemUgLSBsYXN0cG9zKSkKCiAgICAgICAgdGFyaW5mby5zcGFyc2UgPSBzcAoKICAgICAgICB0YXJpbmZvLm9mZnNldF9kYXRhID0gc2VsZi5vZmZzZXQKICAgICAgICBzZWxmLm9mZnNldCArPSBzZWxmLl9ibG9jayh0YXJpbmZvLnNpemUpCiAgICAgICAgdGFyaW5mby5zaXplID0gb3JpZ3NpemUKCiAgICAgICAgc2VsZi5tZW1iZXJzLmFwcGVuZCh0YXJpbmZvKQogICAgICAgIHJldHVybiB0YXJpbmZvCgogICAgIyBUaGUgdHlwZSBtYXBwaW5nIGZvciB0aGUgbmV4dCgpIG1ldGhvZC4gVGhlIGtleXMgYXJlIHNpbmdsZSBjaGFyYWN0ZXIKICAgICMgc3RyaW5ncywgdGhlIHR5cGVmbGFnLiBUaGUgdmFsdWVzIGFyZSBtZXRob2RzIHdoaWNoIGFyZSBjYWxsZWQgd2hlbgogICAgIyBuZXh0KCkgZW5jb3VudGVycyBzdWNoIGEgdHlwZWZsYWcuCiAgICBUWVBFX01FVEggPSB7CiAgICAgICAgR05VVFlQRV9MT05HTkFNRTogcHJvY19nbnVsb25nLAogICAgICAgIEdOVVRZUEVfTE9OR0xJTks6IHByb2NfZ251bG9uZywKICAgICAgICBHTlVUWVBFX1NQQVJTRTogICBwcm9jX3NwYXJzZQogICAgfQoKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIyBMaXR0bGUgaGVscGVyIG1ldGhvZHM6CgogICAgZGVmIF9ibG9jayhzZWxmLCBjb3VudCk6CiAgICAgICAgIiIiUm91bmQgdXAgYSBieXRlIGNvdW50IGJ5IEJMT0NLU0laRSBhbmQgcmV0dXJuIGl0LAogICAgICAgICAgIGUuZy4gX2Jsb2NrKDgzNCkgPT4gMTAyNC4KICAgICAgICAiIiIKICAgICAgICBibG9ja3MsIHJlbWFpbmRlciA9IGRpdm1vZChjb3VudCwgQkxPQ0tTSVpFKQogICAgICAgIGlmIHJlbWFpbmRlcjoKICAgICAgICAgICAgYmxvY2tzICs9IDEKICAgICAgICByZXR1cm4gYmxvY2tzICogQkxPQ0tTSVpFCgogICAgZGVmIF9nZXRtZW1iZXIoc2VsZiwgbmFtZSwgdGFyaW5mbz1Ob25lKToKICAgICAgICAiIiJGaW5kIGFuIGFyY2hpdmUgbWVtYmVyIGJ5IG5hbWUgZnJvbSBib3R0b20gdG8gdG9wLgogICAgICAgICAgIElmIHRhcmluZm8gaXMgZ2l2ZW4sIGl0IGlzIHVzZWQgYXMgdGhlIHN0YXJ0aW5nIHBvaW50LgogICAgICAgICIiIgogICAgICAgICMgRW5zdXJlIHRoYXQgYWxsIG1lbWJlcnMgaGF2ZSBiZWVuIGxvYWRlZC4KICAgICAgICBtZW1iZXJzID0gc2VsZi5nZXRtZW1iZXJzKCkKCiAgICAgICAgaWYgdGFyaW5mbyBpcyBOb25lOgogICAgICAgICAgICBlbmQgPSBsZW4obWVtYmVycykKICAgICAgICBlbHNlOgogICAgICAgICAgICBlbmQgPSBtZW1iZXJzLmluZGV4KHRhcmluZm8pCgogICAgICAgIGZvciBpIGluIHhyYW5nZShlbmQgLSAxLCAtMSwgLTEpOgogICAgICAgICAgICBpZiBuYW1lID09IG1lbWJlcnNbaV0ubmFtZToKICAgICAgICAgICAgICAgIHJldHVybiBtZW1iZXJzW2ldCgogICAgZGVmIF9sb2FkKHNlbGYpOgogICAgICAgICIiIlJlYWQgdGhyb3VnaCB0aGUgZW50aXJlIGFyY2hpdmUgZmlsZSBhbmQgbG9vayBmb3IgcmVhZGFibGUKICAgICAgICAgICBtZW1iZXJzLgogICAgICAgICIiIgogICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgIHRhcmluZm8gPSBzZWxmLm5leHQoKQogICAgICAgICAgICBpZiB0YXJpbmZvIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBicmVhawogICAgICAgIHNlbGYuX2xvYWRlZCA9IFRydWUKCiAgICBkZWYgX2NoZWNrKHNlbGYsIG1vZGU9Tm9uZSk6CiAgICAgICAgIiIiQ2hlY2sgaWYgVGFyRmlsZSBpcyBzdGlsbCBvcGVuLCBhbmQgaWYgdGhlIG9wZXJhdGlvbidzIG1vZGUKICAgICAgICAgICBjb3JyZXNwb25kcyB0byBUYXJGaWxlJ3MgbW9kZS4KICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLmNsb3NlZDoKICAgICAgICAgICAgcmFpc2UgSU9FcnJvciwgIiVzIGlzIGNsb3NlZCIgJSBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXwogICAgICAgIGlmIG1vZGUgaXMgbm90IE5vbmUgYW5kIHNlbGYuX21vZGUgbm90IGluIG1vZGU6CiAgICAgICAgICAgIHJhaXNlIElPRXJyb3IsICJiYWQgb3BlcmF0aW9uIGZvciBtb2RlICVyIiAlIHNlbGYuX21vZGUKCiAgICBkZWYgX19pdGVyX18oc2VsZik6CiAgICAgICAgIiIiUHJvdmlkZSBhbiBpdGVyYXRvciBvYmplY3QuCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi5fbG9hZGVkOgogICAgICAgICAgICByZXR1cm4gaXRlcihzZWxmLm1lbWJlcnMpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIFRhckl0ZXIoc2VsZikKCiAgICBkZWYgX2NyZWF0ZV9nbnVsb25nKHNlbGYsIG5hbWUsIHR5cGUpOgogICAgICAgICIiIldyaXRlIGEgR05VIGxvbmduYW1lL2xvbmdsaW5rIG1lbWJlciB0byB0aGUgVGFyRmlsZS4KICAgICAgICAgICBJdCBjb25zaXN0cyBvZiBhbiBleHRlbmRlZCB0YXIgaGVhZGVyLCB3aXRoIHRoZSBsZW5ndGgKICAgICAgICAgICBvZiB0aGUgbG9uZ25hbWUgYXMgc2l6ZSwgZm9sbG93ZWQgYnkgZGF0YSBibG9ja3MsCiAgICAgICAgICAgd2hpY2ggY29udGFpbiB0aGUgbG9uZ25hbWUgYXMgYSBudWxsIHRlcm1pbmF0ZWQgc3RyaW5nLgogICAgICAgICIiIgogICAgICAgIG5hbWUgKz0gTlVMCgogICAgICAgIHRhcmluZm8gPSBUYXJJbmZvKCkKICAgICAgICB0YXJpbmZvLm5hbWUgPSAiLi8uL0BMb25nTGluayIKICAgICAgICB0YXJpbmZvLnR5cGUgPSB0eXBlCiAgICAgICAgdGFyaW5mby5tb2RlID0gMAogICAgICAgIHRhcmluZm8uc2l6ZSA9IGxlbihuYW1lKQoKICAgICAgICAjIHdyaXRlIGV4dGVuZGVkIGhlYWRlcgogICAgICAgIHNlbGYuZmlsZW9iai53cml0ZSh0YXJpbmZvLnRvYnVmKCkpCiAgICAgICAgc2VsZi5vZmZzZXQgKz0gQkxPQ0tTSVpFCiAgICAgICAgIyB3cml0ZSBuYW1lIGJsb2NrcwogICAgICAgIHNlbGYuZmlsZW9iai53cml0ZShuYW1lKQogICAgICAgIGJsb2NrcywgcmVtYWluZGVyID0gZGl2bW9kKHRhcmluZm8uc2l6ZSwgQkxPQ0tTSVpFKQogICAgICAgIGlmIHJlbWFpbmRlciA+IDA6CiAgICAgICAgICAgIHNlbGYuZmlsZW9iai53cml0ZShOVUwgKiAoQkxPQ0tTSVpFIC0gcmVtYWluZGVyKSkKICAgICAgICAgICAgYmxvY2tzICs9IDEKICAgICAgICBzZWxmLm9mZnNldCArPSBibG9ja3MgKiBCTE9DS1NJWkUKCiAgICBkZWYgX2RiZyhzZWxmLCBsZXZlbCwgbXNnKToKICAgICAgICAiIiJXcml0ZSBkZWJ1Z2dpbmcgb3V0cHV0IHRvIHN5cy5zdGRlcnIuCiAgICAgICAgIiIiCiAgICAgICAgaWYgbGV2ZWwgPD0gc2VsZi5kZWJ1ZzoKICAgICAgICAgICAgcHJpbnQgPj4gc3lzLnN0ZGVyciwgbXNnCiMgY2xhc3MgVGFyRmlsZQoKY2xhc3MgVGFySXRlcjoKICAgICIiIkl0ZXJhdG9yIENsYXNzLgoKICAgICAgIGZvciB0YXJpbmZvIGluIFRhckZpbGUoLi4uKToKICAgICAgICAgICBzdWl0ZS4uLgogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHRhcmZpbGUpOgogICAgICAgICIiIkNvbnN0cnVjdCBhIFRhckl0ZXIgb2JqZWN0LgogICAgICAgICIiIgogICAgICAgIHNlbGYudGFyZmlsZSA9IHRhcmZpbGUKICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKICAgICAgICAiIiJSZXR1cm4gaXRlcmF0b3Igb2JqZWN0LgogICAgICAgICIiIgogICAgICAgIHJldHVybiBzZWxmCiAgICBkZWYgbmV4dChzZWxmKToKICAgICAgICAiIiJSZXR1cm4gdGhlIG5leHQgaXRlbSB1c2luZyBUYXJGaWxlJ3MgbmV4dCgpIG1ldGhvZC4KICAgICAgICAgICBXaGVuIGFsbCBtZW1iZXJzIGhhdmUgYmVlbiByZWFkLCBzZXQgVGFyRmlsZSBhcyBfbG9hZGVkLgogICAgICAgICIiIgogICAgICAgIHRhcmluZm8gPSBzZWxmLnRhcmZpbGUubmV4dCgpCiAgICAgICAgaWYgbm90IHRhcmluZm86CiAgICAgICAgICAgIHNlbGYudGFyZmlsZS5fbG9hZGVkID0gVHJ1ZQogICAgICAgICAgICByYWlzZSBTdG9wSXRlcmF0aW9uCiAgICAgICAgcmV0dXJuIHRhcmluZm8KCiMgSGVscGVyIGNsYXNzZXMgZm9yIHNwYXJzZSBmaWxlIHN1cHBvcnQKY2xhc3MgX3NlY3Rpb246CiAgICAiIiJCYXNlIGNsYXNzIGZvciBfZGF0YSBhbmQgX2hvbGUuCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBvZmZzZXQsIHNpemUpOgogICAgICAgIHNlbGYub2Zmc2V0ID0gb2Zmc2V0CiAgICAgICAgc2VsZi5zaXplID0gc2l6ZQogICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLCBvZmZzZXQpOgogICAgICAgIHJldHVybiBzZWxmLm9mZnNldCA8PSBvZmZzZXQgPCBzZWxmLm9mZnNldCArIHNlbGYuc2l6ZQoKY2xhc3MgX2RhdGEoX3NlY3Rpb24pOgogICAgIiIiUmVwcmVzZW50IGEgZGF0YSBzZWN0aW9uIGluIGEgc3BhcnNlIGZpbGUuCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBvZmZzZXQsIHNpemUsIHJlYWxwb3MpOgogICAgICAgIF9zZWN0aW9uLl9faW5pdF9fKHNlbGYsIG9mZnNldCwgc2l6ZSkKICAgICAgICBzZWxmLnJlYWxwb3MgPSByZWFscG9zCgpjbGFzcyBfaG9sZShfc2VjdGlvbik6CiAgICAiIiJSZXByZXNlbnQgYSBob2xlIHNlY3Rpb24gaW4gYSBzcGFyc2UgZmlsZS4KICAgICIiIgogICAgcGFzcwoKY2xhc3MgX3JpbmdidWZmZXIobGlzdCk6CiAgICAiIiJSaW5nYnVmZmVyIGNsYXNzIHdoaWNoIGluY3JlYXNlcyBwZXJmb3JtYW5jZQogICAgICAgb3ZlciBhIHJlZ3VsYXIgbGlzdC4KICAgICIiIgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHNlbGYuaWR4ID0gMAogICAgZGVmIGZpbmQoc2VsZiwgb2Zmc2V0KToKICAgICAgICBpZHggPSBzZWxmLmlkeAogICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgIGl0ZW0gPSBzZWxmW2lkeF0KICAgICAgICAgICAgaWYgb2Zmc2V0IGluIGl0ZW06CiAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICBpZHggKz0gMQogICAgICAgICAgICBpZiBpZHggPT0gbGVuKHNlbGYpOgogICAgICAgICAgICAgICAgaWR4ID0gMAogICAgICAgICAgICBpZiBpZHggPT0gc2VsZi5pZHg6CiAgICAgICAgICAgICAgICAjIEVuZCBvZiBGaWxlCiAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgIHNlbGYuaWR4ID0gaWR4CiAgICAgICAgcmV0dXJuIGl0ZW0KCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyB6aXBmaWxlIGNvbXBhdGlibGUgVGFyRmlsZSBjbGFzcwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClRBUl9QTEFJTiA9IDAgICAgICAgICAgICMgemlwZmlsZS5aSVBfU1RPUkVEClRBUl9HWklQUEVEID0gOCAgICAgICAgICMgemlwZmlsZS5aSVBfREVGTEFURUQKY2xhc3MgVGFyRmlsZUNvbXBhdDoKICAgICIiIlRhckZpbGUgY2xhc3MgY29tcGF0aWJsZSB3aXRoIHN0YW5kYXJkIG1vZHVsZSB6aXBmaWxlJ3MKICAgICAgIFppcEZpbGUgY2xhc3MuCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaWxlLCBtb2RlPSJyIiwgY29tcHJlc3Npb249VEFSX1BMQUlOKToKICAgICAgICBpZiBjb21wcmVzc2lvbiA9PSBUQVJfUExBSU46CiAgICAgICAgICAgIHNlbGYudGFyZmlsZSA9IFRhckZpbGUudGFyb3BlbihmaWxlLCBtb2RlKQogICAgICAgIGVsaWYgY29tcHJlc3Npb24gPT0gVEFSX0daSVBQRUQ6CiAgICAgICAgICAgIHNlbGYudGFyZmlsZSA9IFRhckZpbGUuZ3pvcGVuKGZpbGUsIG1vZGUpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgInVua25vd24gY29tcHJlc3Npb24gY29uc3RhbnQiCiAgICAgICAgaWYgbW9kZVswOjFdID09ICJyIjoKICAgICAgICAgICAgbWVtYmVycyA9IHNlbGYudGFyZmlsZS5nZXRtZW1iZXJzKCkKICAgICAgICAgICAgZm9yIGkgaW4geHJhbmdlKGxlbihtZW1iZXJzKSk6CiAgICAgICAgICAgICAgICBtID0gbWVtYmVyc1tpXQogICAgICAgICAgICAgICAgbS5maWxlbmFtZSA9IG0ubmFtZQogICAgICAgICAgICAgICAgbS5maWxlX3NpemUgPSBtLnNpemUKICAgICAgICAgICAgICAgIG0uZGF0ZV90aW1lID0gdGltZS5nbXRpbWUobS5tdGltZSlbOjZdCiAgICBkZWYgbmFtZWxpc3Qoc2VsZik6CiAgICAgICAgcmV0dXJuIG1hcChsYW1iZGEgbTogbS5uYW1lLCBzZWxmLmluZm9saXN0KCkpCiAgICBkZWYgaW5mb2xpc3Qoc2VsZik6CiAgICAgICAgcmV0dXJuIGZpbHRlcihsYW1iZGEgbTogbS50eXBlIGluIFJFR1VMQVJfVFlQRVMsCiAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRhcmZpbGUuZ2V0bWVtYmVycygpKQogICAgZGVmIHByaW50ZGlyKHNlbGYpOgogICAgICAgIHNlbGYudGFyZmlsZS5saXN0KCkKICAgIGRlZiB0ZXN0emlwKHNlbGYpOgogICAgICAgIHJldHVybgogICAgZGVmIGdldGluZm8oc2VsZiwgbmFtZSk6CiAgICAgICAgcmV0dXJuIHNlbGYudGFyZmlsZS5nZXRtZW1iZXIobmFtZSkKICAgIGRlZiByZWFkKHNlbGYsIG5hbWUpOgogICAgICAgIHJldHVybiBzZWxmLnRhcmZpbGUuZXh0cmFjdGZpbGUoc2VsZi50YXJmaWxlLmdldG1lbWJlcihuYW1lKSkucmVhZCgpCiAgICBkZWYgd3JpdGUoc2VsZiwgZmlsZW5hbWUsIGFyY25hbWU9Tm9uZSwgY29tcHJlc3NfdHlwZT1Ob25lKToKICAgICAgICBzZWxmLnRhcmZpbGUuYWRkKGZpbGVuYW1lLCBhcmNuYW1lKQogICAgZGVmIHdyaXRlc3RyKHNlbGYsIHppbmZvLCBieXRlcyk6CiAgICAgICAgaW1wb3J0IFN0cmluZ0lPCiAgICAgICAgaW1wb3J0IGNhbGVuZGFyCiAgICAgICAgemluZm8ubmFtZSA9IHppbmZvLmZpbGVuYW1lCiAgICAgICAgemluZm8uc2l6ZSA9IHppbmZvLmZpbGVfc2l6ZQogICAgICAgIHppbmZvLm10aW1lID0gY2FsZW5kYXIudGltZWdtKHppbmZvLmRhdGVfdGltZSkKICAgICAgICBzZWxmLnRhcmZpbGUuYWRkZmlsZSh6aW5mbywgU3RyaW5nSU8uU3RyaW5nSU8oYnl0ZXMpKQogICAgZGVmIGNsb3NlKHNlbGYpOgogICAgICAgIHNlbGYudGFyZmlsZS5jbG9zZSgpCiNjbGFzcyBUYXJGaWxlQ29tcGF0CgojLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBleHBvcnRlZCBmdW5jdGlvbnMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tCmRlZiBpc190YXJmaWxlKG5hbWUpOgogICAgIiIiUmV0dXJuIFRydWUgaWYgbmFtZSBwb2ludHMgdG8gYSB0YXIgYXJjaGl2ZSB0aGF0IHdlCiAgICAgICBhcmUgYWJsZSB0byBoYW5kbGUsIGVsc2UgcmV0dXJuIEZhbHNlLgogICAgIiIiCiAgICB0cnk6CiAgICAgICAgdCA9IG9wZW4obmFtZSkKICAgICAgICB0LmNsb3NlKCkKICAgICAgICByZXR1cm4gVHJ1ZQogICAgZXhjZXB0IFRhckVycm9yOgogICAgICAgIHJldHVybiBGYWxzZQoKb3BlbiA9IFRhckZpbGUub3Blbgo=