LyoKICogV2luZSBNZXNzYWdlIENvbXBpbGVyIGxhbmd1YWdlIGFuZCBjb2RlcGFnZSBzdXBwb3J0CiAqCiAqIENvcHlyaWdodCAyMDAwIEJlcnRobyBBLiBTdHVsdGllbnMgKEJTKQogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EKICovCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPGFzc2VydC5oPgoKI2luY2x1ZGUgIndtYy5oIgojaW5jbHVkZSAibGFuZy5oIgoKCi8qCiAqIExhbmd1YWdlcyBzdXBwb3J0ZWQKICoKICogTVVTVCBiZSBzb3J0aW5nIGFzY2VuZGluZyBvbiBsYW5ndWFnZSBJRAogKi8Kc3RhdGljIGNvbnN0IGxhbmd1YWdlX3QgbGFuZ3VhZ2VzW10gPSB7CgoJezB4MDAwMCwgNDM3LCAxMjUyLCAiTmV1dHJhbCIsIE5VTEx9LAoJezB4MDAwMiwgODY2LCAxMjUxLCAiQnVsZ2FyaWFuIiwgTlVMTH0sCgl7MHgwMDAzLCA4NTAsIDEyNTIsICJDYXRhbGFuIiwgTlVMTH0sCgl7MHgwMDA1LCA4NTIsIDEyNTAsICJDemVjaCIsIE5VTEx9LAoJezB4MDAwNiwgODUwLCAxMjUyLCAiRGFuaXNoIiwgTlVMTH0sCgl7MHgwMDA3LCA4NTAsIDEyNTIsICJHZXJtYW4iLCBOVUxMfSwKCXsweDAwMDgsIDczNywgMTI1MywgIkdyZWVrIiwgTlVMTH0sCgl7MHgwMDA5LCA0MzcsIDEyNTIsICJFbmdsaXNoIiwgTlVMTH0sCgl7MHgwMDBBLCA4NTAsIDEyNTIsICJTcGFuaXNoIC0gVHJhZGl0aW9uYWwgU29ydCIsIE5VTEx9LAoJezB4MDAwQiwgODUwLCAxMjUyLCAiRmlubmlzaCIsIE5VTEx9LAoJezB4MDAwQywgODUwLCAxMjUyLCAiRnJlbmNoIiwgTlVMTH0sCgl7MHgwMDBFLCA4NTIsIDEyNTAsICJIdW5nYXJpYW4iLCBOVUxMfSwKCXsweDAwMEYsIDg1MCwgMTI1MiwgIkljZWxhbmRpYyIsIE5VTEx9LAoJezB4MDAxMCwgODUwLCAxMjUyLCAiSXRhbGlhbiIsIE5VTEx9LAoJezB4MDAxMSwgOTMyLCAgOTMyLCAiSmFwYW5lc2UiLCBOVUxMfSwKCXsweDAwMTIsIDk0OSwgIDk0OSwgIktvcmVhbiIsIE5VTEx9LAoJezB4MDAxMywgODUwLCAxMjUyLCAiRHV0Y2giLCBOVUxMfSwKCXsweDAwMTQsIDg1MCwgMTI1MiwgIk5vcndlZ2lhbiAoQm9rbeVsKSIsIE5VTEx9LAoJezB4MDAxNSwgODUyLCAxMjUwLCAiUG9saXNoIiwgTlVMTH0sCgl7MHgwMDE2LCA4NTAsIDEyNTIsICJQb3J0dWd1ZXNlIiwgTlVMTH0sCgl7MHgwMDE4LCA4NTIsIDEyNTAsICJSb21hbmlhbiIsIE5VTEx9LAoJezB4MDAxOSwgODY2LCAxMjUxLCAiUnVzc2lhbiIsIE5VTEx9LAoJezB4MDAxQSwgODUyLCAxMjUwLCAiU2VyYmlhbiIsIE5VTEx9LAoJezB4MDAxQiwgODUyLCAxMjUwLCAiU2xvdmFrIiwgTlVMTH0sCgl7MHgwMDFDLCA4NTIsIDEyNTAsICJBbGJhbmlhbiIsIE5VTEx9LAoJezB4MDAxRCwgODUwLCAxMjUyLCAiU3dlZGlzaCIsIE5VTEx9LAoJezB4MDAxRiwgODU3LCAxMjU0LCAiVHVya2lzaCIsIE5VTEx9LAoJezB4MDAyMSwgODUwLCAxMjUyLCAiSW5kb25lc2lhbiIsIE5VTEx9LAoJezB4MDAyMiwgODY2LCAxMjUxLCAiVWtyYWluaWFuIiwgTlVMTH0sCgl7MHgwMDIzLCA4NjYsIDEyNTEsICJCZWxhcnVzaWFuIiwgTlVMTH0sCgl7MHgwMDI0LCA4NTIsIDEyNTAsICJTbG92ZW5lIiwgTlVMTH0sCgl7MHgwMDI1LCA3NzUsIDEyNTcsICJFc3RvbmlhbiIsIE5VTEx9LAoJezB4MDAyNiwgNzc1LCAxMjU3LCAiTGF0dmlhbiIsIE5VTEx9LAoJezB4MDAyNywgNzc1LCAxMjU3LCAiTGl0aHVhbmlhbiIsIE5VTEx9LAoJezB4MDAyQSwxMjU4LCAxMjU4LCAiVmlldG5hbWVzZSIsIE5VTEx9LAoJezB4MDAyRCwgODUwLCAxMjUyLCAiQmFzcXVlIiwgTlVMTH0sCgl7MHgwMDJGLCA4NjYsIDEyNTEsICJNYWNlZG9uaWFuIiwgTlVMTH0sCgl7MHgwMDM2LCA4NTAsIDEyNTIsICJBZnJpa2FhbnMiLCBOVUxMfSwKCXsweDAwMzgsIDg1MiwgMTI1MiwgIkZhcm9lc2UiLCBOVUxMfSwKCXsweDAwM0MsIDQzNywgMTI1MiwgIklyaXNoIiwgTlVMTH0sCgl7MHgwMDNFLCA4NTAsIDEyNTIsICJNYWxheSIsIE5VTEx9LAoJezB4MDQwMiwgODY2LCAxMjUxLCAiQnVsZ2FyaWFuIiwgIkJ1bGdhcmlhIn0sCgl7MHgwNDAzLCA4NTAsIDEyNTIsICJDYXRhbGFuIiwgIlNwYWluIn0sCgl7MHgwNDA1LCA4NTIsIDEyNTAsICJDemVjaCIsICJDemVjaCBSZXB1YmxpYyJ9LAoJezB4MDQwNiwgODUwLCAxMjUyLCAiRGFuaXNoIiwgIkRlbm1hcmsifSwKCXsweDA0MDcsIDg1MCwgMTI1MiwgIkdlcm1hbiIsICJHZXJtYW55In0sCgl7MHgwNDA4LCA3MzcsIDEyNTMsICJHcmVlayIsICJHcmVlY2UifSwKCXsweDA0MDksIDQzNywgMTI1MiwgIkVuZ2xpc2giLCAiVW5pdGVkIFN0YXRlcyJ9LAoJezB4MDQwQSwgODUwLCAxMjUyLCAiU3BhbmlzaCAtIFRyYWRpdGlvbmFsIFNvcnQiLCAiU3BhaW4ifSwKCXsweDA0MEIsIDg1MCwgMTI1MiwgIkZpbm5pc2giLCAiRmlubGFuZCJ9LAoJezB4MDQwQywgODUwLCAxMjUyLCAiRnJlbmNoIiwgIkZyYW5jZSJ9LAoJezB4MDQwRSwgODUyLCAxMjUwLCAiSHVuZ2FyaWFuIiwgIkh1bmdhcnkifSwKCXsweDA0MEYsIDg1MCwgMTI1MiwgIkljZWxhbmRpYyIsICJJY2VsYW5kIn0sCgl7MHgwNDEwLCA4NTAsIDEyNTIsICJJdGFsaWFuIiwgIkl0YWx5In0sCgl7MHgwNDExLCA5MzIsICA5MzIsICJKYXBhbmVzZSIsICJKYXBhbiJ9LAoJezB4MDQxMiwgOTQ5LCAgOTQ5LCAiS29yZWFuIiwgIktvcmVhIChzb3V0aCkifSwKCXsweDA0MTMsIDg1MCwgMTI1MiwgIkR1dGNoIiwgIk5ldGhlcmxhbmRzIn0sCgl7MHgwNDE0LCA4NTAsIDEyNTIsICJOb3J3ZWdpYW4gKEJva23lbCkiLCAiTm9yd2F5In0sCgl7MHgwNDE1LCA4NTIsIDEyNTAsICJQb2xpc2giLCAiUG9sYW5kIn0sCgl7MHgwNDE2LCA4NTAsIDEyNTIsICJQb3J0dWd1ZXNlIiwgIkJyYXppbCJ9LAoJezB4MDQxOCwgODUyLCAxMjUwLCAiUm9tYW5pYW4iLCAiUm9tYW5pYSJ9LAoJezB4MDQxOSwgODY2LCAxMjUxLCAiUnVzc2lhbiIsICJSdXNzaWEifSwKCXsweDA0MUEsIDg1MiwgMTI1MCwgIkNyb2F0aWFuIiwgIkNyb2F0aWEifSwKCXsweDA0MUIsIDg1MiwgMTI1MCwgIlNsb3ZhayIsICJTbG92YWtpYSJ9LAoJezB4MDQxQywgODUyLCAxMjUwLCAiQWxiYW5pYW4iLCAiQWxiYW5pYSJ9LAoJezB4MDQxRCwgODUwLCAxMjUyLCAiU3dlZGlzaCIsICJTd2VkZW4ifSwKCXsweDA0MUYsIDg1NywgMTI1NCwgIlR1cmtpc2giLCAiVHVya2V5In0sCgl7MHgwNDIxLCA4NTAsIDEyNTIsICJJbmRvbmVzaWFuIiwgIkluZG9uZXNpYSJ9LAoJezB4MDQyMiwgODY2LCAxMjUxLCAiVWtyYWluaWFuIiwgIlVrcmFpbmUifSwKCXsweDA0MjMsIDg2NiwgMTI1MSwgIkJlbGFydXNpYW4iLCAiQmVsYXJ1cyJ9LAoJezB4MDQyNCwgODUyLCAxMjUwLCAiU2xvdmVuZSIsICJTbG92ZW5pYSJ9LAoJezB4MDQyNSwgNzc1LCAxMjU3LCAiRXN0b25pYW4iLCAiRXN0b25pYSJ9LAoJezB4MDQyNiwgNzc1LCAxMjU3LCAiTGF0dmlhbiIsICJMYXR2aWEifSwKCXsweDA0MjcsIDc3NSwgMTI1NywgIkxpdGh1YW5pYW4iLCAiTGl0aHVhbmlhIn0sCgl7MHgwNDJBLDEyNTgsIDEyNTgsICJWaWV0bmFtZXNlIiwgIlZpZXRuYW0ifSwKCXsweDA0MkQsIDg1MCwgMTI1MiwgIkJhc3F1ZSIsICJTcGFpbiJ9LAoJezB4MDQyRiwgODY2LCAxMjUxLCAiTWFjZWRvbmlhbiIsICJGb3JtZXIgWXVnb3NsYXYgUmVwdWJsaWMgb2YgTWFjZWRvbmlhIn0sCgl7MHgwNDM2LCA4NTAsIDEyNTIsICJBZnJpa2FhbnMiLCAiU291dGggQWZyaWNhIn0sCgl7MHgwNDM4LCA4NTIsIDEyNTIsICJGYXJvZXNlIiwgIkZhcm9lIElzbGFuZHMifSwKCXsweDA0M0MsIDQzNywgMTI1MiwgIklyaXNoIiwgIklyZWxhbmQifSwKCXsweDA0M0UsIDg1MCwgMTI1MiwgIk1hbGF5IiwgIk1hbGF5c2lhIn0sCi8qCXsweDA0OEYsICAgPywgICAgPywgIkVzcGVyYW50byIsICI8bm9uZT4ifSwqLwoJezB4MDgwNCwgOTM2LCAgOTM2LCAiQ2hpbmVzZSAoUGVvcGxlJ3MgcmVwdWJsaWMgb2YgQ2hpbmEpIiwgIlBlb3BsZSdzIHJlcHVibGljIG9mIENoaW5hIn0sCgl7MHgwODA3LCA4NTAsIDEyNTIsICJHZXJtYW4iLCAiU3dpdHplcmxhbmQifSwKCXsweDA4MDksIDg1MCwgMTI1MiwgIkVuZ2xpc2giLCAiVW5pdGVkIEtpbmdkb20ifSwKCXsweDA4MEEsIDg1MCwgMTI1MiwgIlNwYW5pc2giLCAiTWV4aWNvIn0sCgl7MHgwODBDLCA4NTAsIDEyNTIsICJGcmVuY2giLCAiQmVsZ2l1bSJ9LAoJezB4MDgxMCwgODUwLCAxMjUyLCAiSXRhbGlhbiIsICJTd2l0emVybGFuZCJ9LAoJezB4MDgxMywgODUwLCAxMjUyLCAiRHV0Y2giLCAiQmVsZ2l1bSJ9LAoJezB4MDgxNCwgODUwLCAxMjUyLCAiTm9yd2VnaWFuIChOeW5vcnNrKSIsICJOb3J3YXkifSwKCXsweDA4MTYsIDg1MCwgMTI1MiwgIlBvcnR1Z3Vlc2UiLCAiUG9ydHVnYWwifSwKCXsweDA4MUEsIDg1MiwgMTI1MCwgIlNlcmJpYW4gKGxhdGluKSIsICJZdWdvc2xhdmlhIn0sCgl7MHgwODFELCA4NTAsIDEyNTIsICJTd2VkaXNoIChGaW5sYW5kKSIsICJGaW5sYW5kIn0sCgl7MHgwQzA3LCA4NTAsIDEyNTIsICJHZXJtYW4iLCAiQXVzdHJpYSJ9LAoJezB4MEMwOSwgODUwLCAxMjUyLCAiRW5nbGlzaCIsICJBdXN0cmFsaWEifSwKCXsweDBDMEEsIDg1MCwgMTI1MiwgIlNwYW5pc2ggLSBJbnRlcm5hdGlvbmFsIFNvcnQiLCAiU3BhaW4ifSwKCXsweDBDMEMsIDg1MCwgMTI1MiwgIkZyZW5jaCIsICJDYW5hZGEifSwKCXsweDBDMUEsIDg1NSwgMTI1MSwgIlNlcmJpYW4gKEN5cmlsbGljKSIsICJTZXJiaWEifSwKCXsweDEwMDcsIDg1MCwgMTI1MiwgIkdlcm1hbiIsICJMdXhlbWJvdXJnIn0sCgl7MHgxMDA5LCA4NTAsIDEyNTIsICJFbmdsaXNoIiwgIkNhbmFkYSJ9LAoJezB4MTAwQSwgODUwLCAxMjUyLCAiU3BhbmlzaCIsICJHdWF0ZW1hbGEifSwKCXsweDEwMEMsIDg1MCwgMTI1MiwgIkZyZW5jaCIsICJTd2l0emVybGFuZCJ9LAoJezB4MTQwNywgODUwLCAxMjUyLCAiR2VybWFuIiwgIkxpZWNodGVuc3RlaW4ifSwKCXsweDE0MDksIDg1MCwgMTI1MiwgIkVuZ2xpc2giLCAiTmV3IFplYWxhbmQifSwKCXsweDE0MEEsIDg1MCwgMTI1MiwgIlNwYW5pc2giLCAiQ29zdGEgUmljYSJ9LAoJezB4MTQwQywgODUwLCAxMjUyLCAiRnJlbmNoIiwgIkx1eGVtYm91cmcifSwKCXsweDE4MDksIDg1MCwgMTI1MiwgIkVuZ2xpc2giLCAiSXJlbGFuZCJ9LAoJezB4MTgwQSwgODUwLCAxMjUyLCAiU3BhbmlzaCIsICJQYW5hbWEifSwKCXsweDFDMDksIDQzNywgMTI1MiwgIkVuZ2xpc2giLCAiU291dGggQWZyaWNhIn0sCgl7MHgxQzBBLCA4NTAsIDEyNTIsICJTcGFuaXNoIiwgIkRvbWluaWNhbiBSZXB1YmxpYyJ9LAoJezB4MjAwOSwgODUwLCAxMjUyLCAiRW5nbGlzaCIsICJKYW1haWNhIn0sCgl7MHgyMDBBLCA4NTAsIDEyNTIsICJTcGFuaXNoIiwgIlZlbmV6dWVsYSJ9LAoJezB4MjQwOSwgODUwLCAxMjUyLCAiRW5nbGlzaCIsICJDYXJpYmJlYW4ifSwKCXsweDI0MEEsIDg1MCwgMTI1MiwgIlNwYW5pc2giLCAiQ29sb21iaWEifSwKCXsweDI4MDksIDg1MCwgMTI1MiwgIkVuZ2xpc2giLCAiQmVsaXplIn0sCgl7MHgyODBBLCA4NTAsIDEyNTIsICJTcGFuaXNoIiwgIlBlcnUifSwKCXsweDJDMDksIDQzNywgMTI1MiwgIkVuZ2xpc2giLCAiVHJpbmlkYWQgJiBUb2JhZ28ifSwKCXsweDJDMEEsIDg1MCwgMTI1MiwgIlNwYW5pc2giLCAiQXJnZW50aW5hIn0sCgl7MHgzMDBBLCA4NTAsIDEyNTIsICJTcGFuaXNoIiwgIkVjdWFkb3IifSwKCXsweDM0MEEsIDg1MCwgMTI1MiwgIlNwYW5pc2giLCAiQ2hpbGUifSwKCXsweDM4MEEsIDg1MCwgMTI1MiwgIlNwYW5pc2giLCAiVXJ1Z3VheSJ9LAoJezB4M0MwQSwgODUwLCAxMjUyLCAiU3BhbmlzaCIsICJQYXJhZ3VheSJ9LAoJezB4NDAwQSwgODUwLCAxMjUyLCAiU3BhbmlzaCIsICJCb2xpdmlhIn0sCgl7MHg0NDBBLCA4NTAsIDEyNTIsICJTcGFuaXNoIiwgIkVsIFNhbHZhZG9yIn0sCgl7MHg0ODBBLCA4NTAsIDEyNTIsICJTcGFuaXNoIiwgIkhvbmR1cmFzIn0sCgl7MHg0QzBBLCA4NTAsIDEyNTIsICJTcGFuaXNoIiwgIk5pY2FyYWd1YSJ9LAoJezB4NTAwQSwgODUwLCAxMjUyLCAiU3BhbmlzaCIsICJQdWVydG8gUmljbyJ9Cn07CgojZGVmaW5lIE5MQU4JKHNpemVvZihsYW5ndWFnZXMpL3NpemVvZihsYW5ndWFnZXNbMF0pKQoKdm9pZCBzaG93X2xhbmd1YWdlcyh2b2lkKQp7Cgl1bnNpZ25lZCBpbnQgaTsKCXByaW50ZigiIENvZGUgIHwgRE9TLWNwIHwgV0lOLWNwIHwgICBMYW5ndWFnZSAgIHwgQ291bnRyeVxuIik7CglwcmludGYoIi0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tXG4iKTsKCWZvcihpID0gMDsgaSA8IE5MQU47IGkrKykKCQlwcmludGYoIjB4JTA0eCB8ICU1ZCAgfCAlNWQgICB8ICUtMTJzIHwgJXNcbiIsCgkJCWxhbmd1YWdlc1tpXS5pZCwKCQkJbGFuZ3VhZ2VzW2ldLmRvc2NwLAoJCQlsYW5ndWFnZXNbaV0ud2luY3AsCgkJCWxhbmd1YWdlc1tpXS5uYW1lLAoJCQlsYW5ndWFnZXNbaV0uY291bnRyeSA/IGxhbmd1YWdlc1tpXS5jb3VudHJ5IDogIk5ldXRyYWwiKTsKfQoKc3RhdGljIGludCBsYW5nY21wKGNvbnN0IHZvaWQgKnAxLCBjb25zdCB2b2lkICpwMikKewoJcmV0dXJuICooY29uc3QgdW5zaWduZWQgKilwMSAtICgoY29uc3QgbGFuZ3VhZ2VfdCAqKXAyKS0+aWQ7Cn0KCmNvbnN0IGxhbmd1YWdlX3QgKmZpbmRfbGFuZ3VhZ2UodW5zaWduZWQgaWQpCnsKCXJldHVybiAoY29uc3QgbGFuZ3VhZ2VfdCAqKWJzZWFyY2goJmlkLCBsYW5ndWFnZXMsIE5MQU4sIHNpemVvZihsYW5ndWFnZXNbMF0pLCBsYW5nY21wKTsKfQoKdm9pZCBzaG93X2NvZGVwYWdlcyh2b2lkKQp7Cgl1bnNpZ25lZCBpOwoJY29uc3QgdW5pb24gY3B0YWJsZSAqY3BwOwoJcHJpbnRmKCJDb2RlcGFnZXM6XG4iKTsKCWZvcihpID0gMDsgKGNwcCA9IHdpbmVfY3BfZW51bV90YWJsZShpKSk7IGkrKykKCXsKCQlwcmludGYoIiUtNWQgJXNcbiIsIGNwcC0+aW5mby5jb2RlcGFnZSwgY3BwLT5pbmZvLm5hbWUpOwoJfQp9Cgpjb25zdCB1bmlvbiBjcHRhYmxlICpmaW5kX2NvZGVwYWdlKGludCBpZCkKewoJcmV0dXJuIHdpbmVfY3BfZ2V0X3RhYmxlKGlkKTsKfQo=