LyoKICogV2luZSBNZXNzYWdlIENvbXBpbGVyIGxhbmd1YWdlIGFuZCBjb2RlcGFnZSBzdXBwb3J0CiAqCiAqIENvcHlyaWdodCAyMDAwIEJlcnRobyBBLiBTdHVsdGllbnMgKEJTKQogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICovCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPGFzc2VydC5oPgoKI2luY2x1ZGUgIndtYy5oIgojaW5jbHVkZSAibGFuZy5oIgoKCi8qCiAqIExhbmd1YWdlcyBzdXBwb3J0ZWQKICoKICogTVVTVCBiZSBzb3J0aW5nIGFzY2VuZGluZyBvbiBsYW5ndWFnZSBJRAogKi8Kc3RhdGljIGNvbnN0IGxhbmd1YWdlX3QgbGFuZ3VhZ2VzW10gPSB7CgoJezB4MDAwMCwgNDM3LCAxMjUyLCAiTmV1dHJhbCIsICJOZXV0cmFsIn0sCgl7MHgwNDAyLCA4NjYsIDEyNTEsICJCdWxnYXJpYW4iLCAiQnVsZ2FyaWEifSwKCXsweDA0MDMsIDg1MCwgMTI1MiwgIkNhdGFsYW4iLCAiU3BhaW4ifSwKCXsweDA0MDUsIDg1MiwgMTI1MCwgIkN6ZWNoIiwgIkN6ZWNoIFJlcHVibGljIn0sCgl7MHgwNDA2LCA4NTAsIDEyNTIsICJEYW5pc2giLCAiRGVubWFyayJ9LAoJezB4MDQwNywgODUwLCAxMjUyLCAiR2VybWFuIiwgIkdlcm1hbnkifSwKCXsweDA0MDgsIDczNywgMTI1MywgIkdyZWVrIiwgIkdyZWVjZSJ9LAoJezB4MDQwOSwgNDM3LCAxMjUyLCAiRW5nbGlzaCIsICJVbml0ZWQgU3RhdGVzIn0sCgl7MHgwNDBBLCA4NTAsIDEyNTIsICJTcGFuaXNoIC0gVHJhZGl0aW9uYWwgU29ydCIsICJTcGFpbiJ9LAoJezB4MDQwQiwgODUwLCAxMjUyLCAiRmlubmlzaCIsICJGaW5sYW5kIn0sCgl7MHgwNDBDLCA4NTAsIDEyNTIsICJGcmVuY2giLCAiRnJhbmNlIn0sCgl7MHgwNDBFLCA4NTIsIDEyNTAsICJIdW5nYXJpYW4iLCAiSHVuZ2FyeSJ9LAoJezB4MDQwRiwgODUwLCAxMjUyLCAiSWNlbGFuZGljIiwgIkljZWxhbmQifSwKCXsweDA0MTAsIDg1MCwgMTI1MiwgIkl0YWxpYW4iLCAiSXRhbHkifSwKCXsweDA0MTEsIDkzMiwgIDkzMiwgIkphcGFuZXNlIiwgIkphcGFuIn0sCgl7MHgwNDEyLCA5NDksICA5NDksICJLb3JlYW4iLCAiS29yZWEgKHNvdXRoKSJ9LAoJezB4MDQxMywgODUwLCAxMjUyLCAiRHV0Y2giLCAiTmV0aGVybGFuZHMifSwKCXsweDA0MTQsIDg1MCwgMTI1MiwgIk5vcndlZ2lhbiAoQm9rbeVsKSIsICJOb3J3YXkifSwKCXsweDA0MTUsIDg1MiwgMTI1MCwgIlBvbGlzaCIsICJQb2xhbmQifSwKCXsweDA0MTYsIDg1MCwgMTI1MiwgIlBvcnR1Z3Vlc2UiLCAiQnJhemlsIn0sCgl7MHgwNDE4LCA4NTIsIDEyNTAsICJSb21hbmlhbiIsICJSb21hbmlhIn0sCgl7MHgwNDE5LCA4NjYsIDEyNTEsICJSdXNzaWFuIiwgIlJ1c3NpYSJ9LAoJezB4MDQxQSwgODUyLCAxMjUwLCAiQ3JvYXRpYW4iLCAiQ3JvYXRpYSJ9LAoJezB4MDQxQiwgODUyLCAxMjUwLCAiU2xvdmFrIiwgIlNsb3Zha2lhIn0sCgl7MHgwNDFDLCA4NTIsIDEyNTAsICJBbGJhbmlhbiIsICJBbGJhbmlhIn0sCgl7MHgwNDFELCA4NTAsIDEyNTIsICJTd2VkaXNoIiwgIlN3ZWRlbiJ9LAoJezB4MDQxRiwgODU3LCAxMjU0LCAiVHVya2lzaCIsICJUdXJrZXkifSwKCXsweDA0MjEsIDg1MCwgMTI1MiwgIkluZG9uZXNpYW4iLCAiSW5kb25lc2lhIn0sCgl7MHgwNDIyLCA4NjYsIDEyNTEsICJVa3JhaW5pYW4iLCAiVWtyYWluZSJ9LAoJezB4MDQyMywgODY2LCAxMjUxLCAiQmVsYXJ1c2lhbiIsICJCZWxhcnVzIn0sCgl7MHgwNDI0LCA4NTIsIDEyNTAsICJTbG92ZW5lIiwgIlNsb3ZlbmlhIn0sCgl7MHgwNDI1LCA3NzUsIDEyNTcsICJFc3RvbmlhbiIsICJFc3RvbmlhIn0sCgl7MHgwNDI2LCA3NzUsIDEyNTcsICJMYXR2aWFuIiwgIkxhdHZpYSJ9LAoJezB4MDQyNywgNzc1LCAxMjU3LCAiTGl0aHVhbmlhbiIsICJMaXRodWFuaWEifSwKLyoJezB4MDQyQSwgICA/LCAgICA/LCAiVmlldG5hbWVzZSIsICJWaWV0bmFtIn0sKi8KCXsweDA0MkQsIDg1MCwgMTI1MiwgIkJhc3F1ZSIsICJTcGFpbiJ9LAoJezB4MDQyRiwgODY2LCAxMjUxLCAiTWFjZWRvbmlhbiIsICJGb3JtZXIgWXVnb3NsYXYgUmVwdWJsaWMgb2YgTWFjZWRvbmlhIn0sCgl7MHgwNDM2LCA4NTAsIDEyNTIsICJBZnJpa2FhbnMiLCAiU291dGggQWZyaWNhIn0sCi8qCXsweDA0MzgsIDg1MiwgMTI1MiwgIkZhcm9lc2UiLCAiRmFyb2UgSXNsYW5kcyJ9LCBGSVhNRTogTm90IHN1cmUgYWJvdXQgY29kZXBhZ2VzICovCgl7MHgwNDNDLCA0MzcsIDEyNTIsICJJcmlzaCIsICJJcmVsYW5kIn0sCgl7MHgwNDNFLCA4NTAsIDEyNTIsICJNYWxheSIsICJNYWxheXNpYSJ9LAovKgl7MHgwNDhGLCAgID8sICAgID8sICJFc3BlcmFudG8iLCAiPG5vbmU+In0sKi8KCXsweDA4MDQsIDkzNiwgIDkzNiwgIkNoaW5lc2UgKFBlb3BsZSdzIHJlcHVibGljIG9mIENoaW5hKSIsICJQZW9wbGUncyByZXB1YmxpYyBvZiBDaGluYSJ9LAoJezB4MDgwNywgODUwLCAxMjUyLCAiR2VybWFuIiwgIlN3aXR6ZXJsYW5kIn0sCgl7MHgwODA5LCA4NTAsIDEyNTIsICJFbmdsaXNoIiwgIlVuaXRlZCBLaW5nZG9tIn0sCgl7MHgwODBBLCA4NTAsIDEyNTIsICJTcGFuaXNoIiwgIk1leGljbyJ9LAoJezB4MDgwQywgODUwLCAxMjUyLCAiRnJlbmNoIiwgIkJlbGdpdW0ifSwKCXsweDA4MTAsIDg1MCwgMTI1MiwgIkl0YWxpYW4iLCAiU3dpdHplcmxhbmQifSwKCXsweDA4MTMsIDg1MCwgMTI1MiwgIkR1dGNoIiwgIkJlbGdpdW0ifSwKCXsweDA4MTQsIDg1MCwgMTI1MiwgIk5vcndlZ2lhbiAoTnlub3JzaykiLCAiTm9yd2F5In0sCgl7MHgwODE2LCA4NTAsIDEyNTIsICJQb3J0dWd1ZXNlIiwgIlBvcnR1Z2FsIn0sCi8qCXsweDA4MUEsICAgPywgICAgPywgIlNlcmJpYW4gKGxhdGluKSIsICJZdWdvc2xhdmlhIn0sKi8KCXsweDA4MUQsIDg1MCwgMTI1MiwgIlN3ZWRpc2ggKEZpbmxhbmQpIiwgIkZpbmxhbmQifSwKCXsweDBDMDcsIDg1MCwgMTI1MiwgIkdlcm1hbiIsICJBdXN0cmlhIn0sCgl7MHgwQzA5LCA4NTAsIDEyNTIsICJFbmdsaXNoIiwgIkF1c3RyYWxpYSJ9LAoJezB4MEMwQSwgODUwLCAxMjUyLCAiU3BhbmlzaCAtIEludGVybmF0aW9uYWwgU29ydCIsICJTcGFpbiJ9LAoJezB4MEMwQywgODUwLCAxMjUyLCAiRnJlbmNoIiwgIkNhbmFkYSJ9LAoJezB4MEMxQSwgODU1LCAxMjUxLCAiU2VyYmlhbiAoQ3lyaWxsaWMpIiwgIlNlcmJpYSJ9LAoJezB4MTAwNywgODUwLCAxMjUyLCAiR2VybWFuIiwgIkx1eGVtYm91cmcifSwKCXsweDEwMDksIDg1MCwgMTI1MiwgIkVuZ2xpc2giLCAiQ2FuYWRhIn0sCgl7MHgxMDBBLCA4NTAsIDEyNTIsICJTcGFuaXNoIiwgIkd1YXRlbWFsYSJ9LAoJezB4MTAwQywgODUwLCAxMjUyLCAiRnJlbmNoIiwgIlN3aXR6ZXJsYW5kIn0sCgl7MHgxNDA3LCA4NTAsIDEyNTIsICJHZXJtYW4iLCAiTGllY2h0ZW5zdGVpbiJ9LAoJezB4MTQwOSwgODUwLCAxMjUyLCAiRW5nbGlzaCIsICJOZXcgWmVhbGFuZCJ9LAoJezB4MTQwQSwgODUwLCAxMjUyLCAiU3BhbmlzaCIsICJDb3N0YSBSaWNhIn0sCgl7MHgxNDBDLCA4NTAsIDEyNTIsICJGcmVuY2giLCAiTHV4ZW1ib3VyZyJ9LAoJezB4MTgwOSwgODUwLCAxMjUyLCAiRW5nbGlzaCIsICJJcmVsYW5kIn0sCgl7MHgxODBBLCA4NTAsIDEyNTIsICJTcGFuaXNoIiwgIlBhbmFtYSJ9LAoJezB4MUMwOSwgNDM3LCAxMjUyLCAiRW5nbGlzaCIsICJTb3V0aCBBZnJpY2EifSwKCXsweDFDMEEsIDg1MCwgMTI1MiwgIlNwYW5pc2giLCAiRG9taW5pY2FuIFJlcHVibGljIn0sCgl7MHgyMDA5LCA4NTAsIDEyNTIsICJFbmdsaXNoIiwgIkphbWFpY2EifSwKCXsweDIwMEEsIDg1MCwgMTI1MiwgIlNwYW5pc2giLCAiVmVuZXp1ZWxhIn0sCgl7MHgyNDA5LCA4NTAsIDEyNTIsICJFbmdsaXNoIiwgIkNhcmliYmVhbiJ9LAoJezB4MjQwQSwgODUwLCAxMjUyLCAiU3BhbmlzaCIsICJDb2xvbWJpYSJ9LAoJezB4MjgwOSwgODUwLCAxMjUyLCAiRW5nbGlzaCIsICJCZWxpemUifSwKCXsweDI4MEEsIDg1MCwgMTI1MiwgIlNwYW5pc2giLCAiUGVydSJ9LAoJezB4MkMwOSwgNDM3LCAxMjUyLCAiRW5nbGlzaCIsICJUcmluaWRhZCAmIFRvYmFnbyJ9LAoJezB4MkMwQSwgODUwLCAxMjUyLCAiU3BhbmlzaCIsICJBcmdlbnRpbmEifSwKCXsweDMwMEEsIDg1MCwgMTI1MiwgIlNwYW5pc2giLCAiRWN1YWRvciJ9LAoJezB4MzQwQSwgODUwLCAxMjUyLCAiU3BhbmlzaCIsICJDaGlsZSJ9LAoJezB4MzgwQSwgODUwLCAxMjUyLCAiU3BhbmlzaCIsICJVcnVndWF5In0sCgl7MHgzQzBBLCA4NTAsIDEyNTIsICJTcGFuaXNoIiwgIlBhcmFndWF5In0sCgl7MHg0MDBBLCA4NTAsIDEyNTIsICJTcGFuaXNoIiwgIkJvbGl2aWEifSwKCXsweDQ0MEEsIDg1MCwgMTI1MiwgIlNwYW5pc2giLCAiRWwgU2FsdmFkb3IifSwKCXsweDQ4MEEsIDg1MCwgMTI1MiwgIlNwYW5pc2giLCAiSG9uZHVyYXMifSwKCXsweDRDMEEsIDg1MCwgMTI1MiwgIlNwYW5pc2giLCAiTmljYXJhZ3VhIn0sCgl7MHg1MDBBLCA4NTAsIDEyNTIsICJTcGFuaXNoIiwgIlB1ZXJ0byBSaWNvIn0KfTsKCiNkZWZpbmUgTkxBTgkoc2l6ZW9mKGxhbmd1YWdlcykvc2l6ZW9mKGxhbmd1YWdlc1swXSkpCgp2b2lkIHNob3dfbGFuZ3VhZ2VzKHZvaWQpCnsKCXVuc2lnbmVkIGludCBpOwoJcHJpbnRmKCIgQ29kZSAgfCBET1MtY3AgfCBXSU4tY3AgfCAgIExhbmd1YWdlICAgfCBDb3VudHJ5XG4iKTsKCXByaW50ZigiLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLS0tLS0tLSstLS0tLS0tLS1cbiIpOwoJZm9yKGkgPSAwOyBpIDwgTkxBTjsgaSsrKQoJCXByaW50ZigiMHglMDR4IHwgJTVkICB8ICU1ZCAgIHwgJS0xMnMgfCAlc1xuIiwKCQkJbGFuZ3VhZ2VzW2ldLmlkLAoJCQlsYW5ndWFnZXNbaV0uZG9zY3AsCgkJCWxhbmd1YWdlc1tpXS53aW5jcCwKCQkJbGFuZ3VhZ2VzW2ldLm5hbWUsCgkJCWxhbmd1YWdlc1tpXS5jb3VudHJ5KTsKfQoKc3RhdGljIGludCBsYW5nY21wKGNvbnN0IHZvaWQgKnAxLCBjb25zdCB2b2lkICpwMikKewoJcmV0dXJuICoodW5zaWduZWQgKilwMSAtICgobGFuZ3VhZ2VfdCAqKXAyKS0+aWQ7Cn0KCmNvbnN0IGxhbmd1YWdlX3QgKmZpbmRfbGFuZ3VhZ2UodW5zaWduZWQgaWQpCnsKCXJldHVybiAoY29uc3QgbGFuZ3VhZ2VfdCAqKWJzZWFyY2goJmlkLCBsYW5ndWFnZXMsIE5MQU4sIHNpemVvZihsYW5ndWFnZXNbMF0pLCBsYW5nY21wKTsKfQoKdm9pZCBzaG93X2NvZGVwYWdlcyh2b2lkKQp7Cgl1bnNpZ25lZCBpOwoJY29uc3QgdW5pb24gY3B0YWJsZSAqY3BwOwoJcHJpbnRmKCJDb2RlcGFnZXM6XG4iKTsKCWZvcihpID0gMDsgKGNwcCA9IHdpbmVfY3BfZW51bV90YWJsZShpKSk7IGkrKykKCXsKCQlwcmludGYoIiUtNWQgJXNcbiIsIGNwcC0+aW5mby5jb2RlcGFnZSwgY3BwLT5pbmZvLm5hbWUpOwoJfQp9Cgpjb25zdCB1bmlvbiBjcHRhYmxlICpmaW5kX2NvZGVwYWdlKGludCBpZCkKewoJcmV0dXJuIHdpbmVfY3BfZ2V0X3RhYmxlKGlkKTsKfQo=