IyEvYmluL3NoCi4gIiR7c3JjZGlyPS59L2luaXQuc2giOyBwYXRoX3ByZXBlbmRfIC4gLi4vc3JjCiMKIyBNb3JlIHRlc3RzIGZvciBqYXZhIHN1cHBvcnQKIwoKY2F0IDw8XEVPRiA+IHhnLWotMi5qYXZhCmNsYXNzIFRlc3RDYXNlIHsKICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nW10gYXJncykgewogICAgLy8gVGVzdCByZWNvZ25pdGlvbiBvZiBcdSBlc2NhcGVzOiBC9nNlIEL8YmNoZW4KICAgIGdldHRleHQgKCJCXHUwMGY2c2UgQlx1MDBmY2JjaGVuIik7CiAgICAvLyBUZXN0IHJlY29nbml0aW9uIG9mIFx1IGVzY2FwZXMgd2l0aCBkaWZmZXJlbnQgbnVtYmVyIG9mIHUKICAgIGdldHRleHQgKCJKYXBhbmVzZTogXHV1NjVlNVx1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dTY3MmNcdThBOWUiKTsKICAgIC8vIFRlc3QgcmVjb2duaXRpb24gb2YgXHUgZXNjYXBlcyB3aGVuIHRoZXkgZm9ybSBVVEYtMTYgc3Vycm9nYXRlcwogICAgLy8gSGVyZTogVSsxRDQ5RSBNQVRIRU1BVElDQUwgU0NSSVBUIENBUElUQUwgQwogICAgZ2V0dGV4dCAoInNjcmlwdCBcdWQ4MzVcdWRjOWUgPSAuLi4iKTsKICAgIC8vIFRlc3QgaW52YWxpZCBzdXJyb2dhdGVzLgogICAgZ2V0dGV4dCAoImludmFsaWQgc3Vycm9nYXRlIFx1ZDgzNSBmaXJzdCBoYWxmIik7CiAgICBnZXR0ZXh0ICgiaW52YWxpZCBzdXJyb2dhdGUgXHVkYzllIHNlY29uZCBoYWxmIik7CiAgICAvLyBEb24ndCBsZXQgdGhlIGxpbmUgbnVtYmVycyBiZSBjb25mdXNlZCBieSBcdSBuZXdsaW5lcy4KICAgIFx1MDAwYSBcdTAwMGQgXHUwMDBkXHUwMDBhCiAgICBnZXR0ZXh0ICgiZW1iZWRkZWRcbm5ld2xpbmUiKTsKICAgIC8vIFNwYWNlcyBmcm9tIGVuZCBvZiBjb21tZW50IGFyZSByZW1vdmVkLiAgICBcdTAwMGFnZXR0ZXh0KCJkdW1teSIpOwogICAgLy8gVmFyaW91cyB3YXlzIHRvIHdyaXRlIGEgYmFja3NsYXNoIGFyZSBlcXVpdmFsZW50LgogICAgZ2V0dGV4dCAoIlx1MDA1Y1x1MDA1YyIpOwogICAgZ2V0dGV4dCAoIlx1MDA1Y1wiKTsKICAgIGdldHRleHQgKCJcXHUwMDVjIik7CiAgICBnZXR0ZXh0ICgiXFwiKTsKICAgIGdldHRleHQgKCJcMTM0Iik7CiAgICAvLyBFc2NhcGUgc2VxdWVuY2VzIGluIHN0cmluZ3MuCiAgICBnZXR0ZXh0ICgidCAtPiBcdCwgYiAtPiBcYiwgbiAtPiBcbiwgZHF1b3RlIC0+IFwiLCBzcXVvdGUgLT4gXCcgLi4uIik7CiAgICAvLyBPY3RhbCBlc2NhcGVzIGhhdmUgMiBvciAzIGRpZ2l0cywgZGVwZW5kaW5nIG9uIHRoZSBpbml0aWFsIGRpZ2l0LgogICAgZ2V0dGV4dCAoImJlbDogXDdcbm5ld2xpbmU6IFwxMmJhY2tzbGFzaDogXDEzNFxuZHF1b3RlLXplcm86IFw0MjBcbiIpOwogICAgLy8gSGV4IGVzY2FwZXMgYXJlIG5vdCByZWNvZ25pemVkCiAgICBnZXR0ZXh0ICgibm8gYmVsOiBceDA3XG4iKTsKICAgIGdldHRleHQgLy8gUmVjb2duaXplZCBkZXNwaXRlIGNvbW1lbnRzCiAgICAgICAoIC8qIEV2ZW4gYWNyb3NzIG11bHRpbGluZQpjb21tZW50ISAqLyAidGhpcyBpcyBhIHNpbmdsZSAiIC8qIG5vdyBjb21lcyB0aGUgY29uY2F0ZW5hdGlvbiEgKi8gKyAvLyBhZnRlciArCiAgICAgICAgICJsb25nIGxpbmUiKTsKICAgIC8vIENoYXJhY3RlciBsaXRlcmFscyBhcmUgbm90IGV4dHJhY3RlZC4KICAgIGdldHRleHQgKCd4Jyk7CiAgICAvLyBJbnZhbGlkIGNvbmNhdGVuYXRpb25zIGFyZSBub3QgY29uY2F0ZW5hdGVkLgogICAgZ2V0dGV4dCAoImZvb2JhIisncicpOwogICAgLy8gVmVyaWZ5IHRoYXQgdGhlIHN0YXRpYyBmdW5jdGlvbiBuYW1lIGhhcyBwcmlvcml0eS4KICAgIEdldHRleHRSZXNvdXJjZS5nZXR0ZXh0KCJOT1QgZXh0cmFjdGVkIiwgInRoaXMgb25lIGlzIGV4dHJhY3RlZCIpOwogICAgLy8gVmVyaWZ5IHRoYXQgYSBjb21tYSBpbnNpZGUgYnJhY2VzIGlzIGhpZGRlbi4KICAgIEdldHRleHRSZXNvdXJjZS5nZXR0ZXh0KAogICAgICAgIG5ldyBPYmplY3QoKSB7CiAgICAgICAgICBwdWJsaWMgaW50IGZvbyAoKSB7CiAgICAgICAgICAgIHJldHVybiA1LCA4OwogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgInRoaXMgaXMgdGhlIHNlY29uZCBhcmd1bWVudCIpOwogICAgLy8gVGV4dCBibG9ja3MgYXJlIGV4dHJhY3RlZC4KICAgIGdldHRleHQgKCIiIgogICAgICAgIGEgb25lLWxpbmVyIGJsb2NrICIiIik7CiAgICBnZXR0ZXh0ICgiIiIKICAgICAgICBpYmFtIGZvcnRlIHZpYSBzYWNyYSBzaWN1dCBtZXVzIGVzdCBtb3MKICAgICAgICBuZXNjaW8gcXVpZCBtZWRpdGFucyBudWdhcnVtIHRvdHVzIGluIGlsbGlzCiAgICAgICAgICAgIAogICAgICAgIGFjY3Vycml0IHF1aWRhbSBub3R1cyBtaWhpIG5vbWluZSB0YW50dW0KICAgICAgICBhcnJlcHRhcXVlIG1hbnUgInF1aWQgYWdpcywgZHVsY2lzc2ltZSByZXJ1bT8iCiAgICAgICAgICAgICAiIiIpOwogICAgZ2V0dGV4dCAoIiIiCiAgICAgICAgXCIiImEgdGV4dCBibG9jayBpbiBhIHRleHQgYmxvY2tcIiIiICIiIik7CiAgICBnZXR0ZXh0ICgiIiIKICAgICAgICB0ZXN0aW5nIG1peGVkIEFTQ0lJIGFuZCBVbmljb2RlIHdoaXRlc3BhY2UKICAgICAgXHUwMDIwIGxpbmUgMgogICAgICAgXHUwMDIwbGluZSAzCiAgICAgICAgXHUwMDIwbGluZSA0CiAgICAgICAgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UgIAogICAgICAgIGFzIHdlbGwgXHUwMDIwCiAgICAgICAgYWxzbyBpbiB0aGUgbGFzdCBsaW5lXHUwMDIwIiIiCiAgICAgICAgKTsKICB9Cn0KRU9GCgo6ICR7WEdFVFRFWFQ9eGdldHRleHR9CiR7WEdFVFRFWFR9IC0tZnJvbS1jb2RlPUlTTy04ODU5LTEgLWMgLW8geGctai0yLnRtcCB4Zy1qLTIuamF2YSAyPi9kZXYvbnVsbCB8fCBFeGl0IDEKZnVuY19maWx0ZXJfUE9UX0NyZWF0aW9uX0RhdGUgeGctai0yLnRtcCB4Zy1qLTIucG90CgpjYXQgPDxcRU9GID4geGctai0yLm9rCiMgU09NRSBERVNDUklQVElWRSBUSVRMRS4KIyBDb3B5cmlnaHQgKEMpIFlFQVIgVEhFIFBBQ0tBR0UnUyBDT1BZUklHSFQgSE9MREVSCiMgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBzYW1lIGxpY2Vuc2UgYXMgdGhlIFBBQ0tBR0UgcGFja2FnZS4KIyBGSVJTVCBBVVRIT1IgPEVNQUlMQEFERFJFU1M+LCBZRUFSLgojCiMsIGZ1enp5Cm1zZ2lkICIiCm1zZ3N0ciAiIgoiUHJvamVjdC1JZC1WZXJzaW9uOiBQQUNLQUdFIFZFUlNJT05cbiIKIlJlcG9ydC1Nc2dpZC1CdWdzLVRvOiBcbiIKIlBPLVJldmlzaW9uLURhdGU6IFlFQVItTU8tREEgSE86TUkrWk9ORVxuIgoiTGFzdC1UcmFuc2xhdG9yOiBGVUxMIE5BTUUgPEVNQUlMQEFERFJFU1M+XG4iCiJMYW5ndWFnZS1UZWFtOiBMQU5HVUFHRSA8TExAbGkub3JnPlxuIgoiTGFuZ3VhZ2U6IFxuIgoiTUlNRS1WZXJzaW9uOiAxLjBcbiIKIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1VVEYtOFxuIgoiQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdFxuIgoKIy4gVGVzdCByZWNvZ25pdGlvbiBvZiBcdSBlc2NhcGVzOiBCw7ZzZSBCw7xiY2hlbgojOiB4Zy1qLTIuamF2YTo0Cm1zZ2lkICJCw7ZzZSBCw7xiY2hlbiIKbXNnc3RyICIiCgojLiBUZXN0IHJlY29nbml0aW9uIG9mIFx1IGVzY2FwZXMgd2l0aCBkaWZmZXJlbnQgbnVtYmVyIG9mIHUKIzogeGctai0yLmphdmE6Ngptc2dpZCAiSmFwYW5lc2U6IOaXpeacrOiqniIKbXNnc3RyICIiCgojLiBUZXN0IHJlY29nbml0aW9uIG9mIFx1IGVzY2FwZXMgd2hlbiB0aGV5IGZvcm0gVVRGLTE2IHN1cnJvZ2F0ZXMKIy4gSGVyZTogVSsxRDQ5RSBNQVRIRU1BVElDQUwgU0NSSVBUIENBUElUQUwgQwojOiB4Zy1qLTIuamF2YTo5Cm1zZ2lkICJzY3JpcHQg8J2SniA9IC4uLiIKbXNnc3RyICIiCgojLiBUZXN0IGludmFsaWQgc3Vycm9nYXRlcy4KIzogeGctai0yLmphdmE6MTEKbXNnaWQgImludmFsaWQgc3Vycm9nYXRlIO+/vSBmaXJzdCBoYWxmIgptc2dzdHIgIiIKCiM6IHhnLWotMi5qYXZhOjEyCm1zZ2lkICJpbnZhbGlkIHN1cnJvZ2F0ZSDvv70gc2Vjb25kIGhhbGYiCm1zZ3N0ciAiIgoKIy4gRG9uJ3QgbGV0IHRoZSBsaW5lIG51bWJlcnMgYmUgY29uZnVzZWQgYnkgXHUgbmV3bGluZXMuCiM6IHhnLWotMi5qYXZhOjE1Cm1zZ2lkICIiCiJlbWJlZGRlZFxuIgoibmV3bGluZSIKbXNnc3RyICIiCgojLiBTcGFjZXMgZnJvbSBlbmQgb2YgY29tbWVudCBhcmUgcmVtb3ZlZC4KIzogeGctai0yLmphdmE6MTYKbXNnaWQgImR1bW15Igptc2dzdHIgIiIKCiMuIFZhcmlvdXMgd2F5cyB0byB3cml0ZSBhIGJhY2tzbGFzaCBhcmUgZXF1aXZhbGVudC4KIzogeGctai0yLmphdmE6MTggeGctai0yLmphdmE6MTkgeGctai0yLmphdmE6MjAgeGctai0yLmphdmE6MjEgeGctai0yLmphdmE6MjIKbXNnaWQgIlxcIgptc2dzdHIgIiIKCiMuIEVzY2FwZSBzZXF1ZW5jZXMgaW4gc3RyaW5ncy4KIzogeGctai0yLmphdmE6MjQKbXNnaWQgIiIKInQgLT4gXHQsIGIgLT4gXGIsIG4gLT4gXG4iCiIsIGRxdW90ZSAtPiBcIiwgc3F1b3RlIC0+ICcgLi4uIgptc2dzdHIgIiIKCiMuIE9jdGFsIGVzY2FwZXMgaGF2ZSAyIG9yIDMgZGlnaXRzLCBkZXBlbmRpbmcgb24gdGhlIGluaXRpYWwgZGlnaXQuCiM6IHhnLWotMi5qYXZhOjI2Cm1zZ2lkICIiCiJiZWw6IFxhXG4iCiJuZXdsaW5lOiBcbiIKImJhY2tzbGFzaDogXFxcbiIKImRxdW90ZS16ZXJvOiBcIjBcbiIKbXNnc3RyICIiCgojLiBIZXggZXNjYXBlcyBhcmUgbm90IHJlY29nbml6ZWQKIzogeGctai0yLmphdmE6MjgKbXNnaWQgIm5vIGJlbDogXFx4MDdcbiIKbXNnc3RyICIiCgojLiBSZWNvZ25pemVkIGRlc3BpdGUgY29tbWVudHMKIy4gRXZlbiBhY3Jvc3MgbXVsdGlsaW5lCiMuIGNvbW1lbnQhCiM6IHhnLWotMi5qYXZhOjMxCm1zZ2lkICJ0aGlzIGlzIGEgc2luZ2xlIGxvbmcgbGluZSIKbXNnc3RyICIiCgojLiBJbnZhbGlkIGNvbmNhdGVuYXRpb25zIGFyZSBub3QgY29uY2F0ZW5hdGVkLgojOiB4Zy1qLTIuamF2YTozNgptc2dpZCAiZm9vYmEiCm1zZ3N0ciAiIgoKIy4gVmVyaWZ5IHRoYXQgdGhlIHN0YXRpYyBmdW5jdGlvbiBuYW1lIGhhcyBwcmlvcml0eS4KIzogeGctai0yLmphdmE6MzgKbXNnaWQgInRoaXMgb25lIGlzIGV4dHJhY3RlZCIKbXNnc3RyICIiCgojOiB4Zy1qLTIuamF2YTo0Ngptc2dpZCAidGhpcyBpcyB0aGUgc2Vjb25kIGFyZ3VtZW50Igptc2dzdHIgIiIKCiMuIFRleHQgYmxvY2tzIGFyZSBleHRyYWN0ZWQuCiM6IHhnLWotMi5qYXZhOjQ4Cm1zZ2lkICJhIG9uZS1saW5lciBibG9jayIKbXNnc3RyICIiCgojOiB4Zy1qLTIuamF2YTo1MAptc2dpZCAiIgoiaWJhbSBmb3J0ZSB2aWEgc2FjcmEgc2ljdXQgbWV1cyBlc3QgbW9zXG4iCiJuZXNjaW8gcXVpZCBtZWRpdGFucyBudWdhcnVtIHRvdHVzIGluIGlsbGlzXG4iCiJcbiIKImFjY3Vycml0IHF1aWRhbSBub3R1cyBtaWhpIG5vbWluZSB0YW50dW1cbiIKImFycmVwdGFxdWUgbWFudSBcInF1aWQgYWdpcywgZHVsY2lzc2ltZSByZXJ1bT9cIlxuIgptc2dzdHIgIiIKCiM6IHhnLWotMi5qYXZhOjU3Cm1zZ2lkICJcIlwiXCJhIHRleHQgYmxvY2sgaW4gYSB0ZXh0IGJsb2NrXCJcIlwiIgptc2dzdHIgIiIKCiM6IHhnLWotMi5qYXZhOjU5Cm1zZ2lkICIiCiJ0ZXN0aW5nIG1peGVkIEFTQ0lJIGFuZCBVbmljb2RlIHdoaXRlc3BhY2VcbiIKImxpbmUgMlxuIgoibGluZSAzXG4iCiIgbGluZSA0XG4iCiJhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZVxuIgoiYXMgd2VsbFxuIgoiYWxzbyBpbiB0aGUgbGFzdCBsaW5lIgptc2dzdHIgIiIKRU9GCgo6ICR7RElGRj1kaWZmfQoke0RJRkZ9IHhnLWotMi5vayB4Zy1qLTIucG90CnJlc3VsdD0kPwoKZXhpdCAkcmVzdWx0Cg==