LyoqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBAZmlsZSAgICBzdG0zMmw0eHhfaGFsX3N3cG1pLmMKICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCiAgKiBAYnJpZWYgICBTV1BNSSBIQUwgbW9kdWxlIGRyaXZlci4KICAqICAgICAgICAgIFRoaXMgZmlsZSBwcm92aWRlcyBmaXJtd2FyZSBmdW5jdGlvbnMgdG8gbWFuYWdlIHRoZSBmb2xsb3dpbmcKICAqICAgICAgICAgIGZ1bmN0aW9uYWxpdGllcyBvZiB0aGUgU2luZ2xlIFdpcmUgUHJvdG9jb2wgTWFzdGVyIEludGVyZmFjZSAoU1dQTUkpLgogICogICAgICAgICAgICsgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24KICAqICAgICAgICAgICArIERhdGEgdHJhbnNmZXJzIGZ1bmN0aW9ucwogICogICAgICAgICAgICsgRE1BIHRyYW5zZmVycyBtYW5hZ2VtZW50CiAgKiAgICAgICAgICAgKyBJbnRlcnJ1cHRzIGFuZCBmbGFncyBtYW5hZ2VtZW50CiAgQHZlcmJhdGltCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIEhvdyB0byB1c2UgdGhpcyBkcml2ZXIgIyMjIyMKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBbLi5dCiAgICAgVGhlIFNXUE1JIEhBTCBkcml2ZXIgY2FuIGJlIHVzZWQgYXMgZm9sbG93czoKCiAgICAoIykgRGVjbGFyZSBhIFNXUE1JX0hhbmRsZVR5cGVEZWYgaGFuZGxlIHN0cnVjdHVyZSAoZWcuIFNXUE1JX0hhbmRsZVR5cGVEZWYgaHN3cG1pKS4KCiAgICAoIykgSW5pdGlhbGl6ZSB0aGUgU1dQTUkgbG93IGxldmVsIHJlc291cmNlcyBieSBpbXBsZW1lbnRpbmcgdGhlIEhBTF9TV1BNSV9Nc3BJbml0KCkgQVBJOgogICAgICAgICgjIykgRW5hYmxlIHRoZSBTV1BNSXggaW50ZXJmYWNlIGNsb2NrIHdpdGggX19IQUxfUkNDX1NXUE1JeF9DTEtfRU5BQkxFKCkuCiAgICAgICAgKCMjKSBTV1BNSSBJTyBjb25maWd1cmF0aW9uOgogICAgICAgICAgICAoKysrKSBFbmFibGUgdGhlIGNsb2NrIGZvciB0aGUgU1dQTUkgR1BJTy4KICAgICAgICAgICAgKCsrKykgQ29uZmlndXJlIHRoZXNlIFNXUE1JIHBpbnMgYXMgYWx0ZXJuYXRlIGZ1bmN0aW9uIHB1bGwtdXAuCiAgICAgICAgKCMjKSBOVklDIGNvbmZpZ3VyYXRpb24gaWYgeW91IG5lZWQgdG8gdXNlIGludGVycnVwdCBwcm9jZXNzIChIQUxfU1dQTUlfVHJhbnNtaXRfSVQoKQogICAgICAgICAgICAgYW5kIEhBTF9TV1BNSV9SZWNlaXZlX0lUKCkgQVBJcyk6CiAgICAgICAgICAgICgrKyspIENvbmZpZ3VyZSB0aGUgU1dQTUl4IGludGVycnVwdCBwcmlvcml0eSB3aXRoIEhBTF9OVklDX1NldFByaW9yaXR5KCkuCiAgICAgICAgICAgICgrKyspIEVuYWJsZSB0aGUgTlZJQyBTV1BNSSBJUlEgaGFuZGxlIHdpdGggSEFMX05WSUNfRW5hYmxlSVJRKCkuCgogICAgICAgICgjIykgRE1BIENvbmZpZ3VyYXRpb24gaWYgeW91IG5lZWQgdG8gdXNlIERNQSBwcm9jZXNzIChIQUxfU1dQTUlfVHJhbnNtaXRfRE1BKCkKICAgICAgICAgICAgIGFuZCBIQUxfU1dQTUlfUmVjZWl2ZV9ETUEoKSBBUElzKToKICAgICAgICAgICAgKCsrKykgRGVjbGFyZSBhIERNQSBoYW5kbGUgc3RydWN0dXJlIGZvciB0aGUgVHgvUnggY2hhbm5lbHMuCiAgICAgICAgICAgICgrKyspIEVuYWJsZSB0aGUgRE1BeCBpbnRlcmZhY2UgY2xvY2suCiAgICAgICAgICAgICgrKyspIENvbmZpZ3VyZSB0aGUgZGVjbGFyZWQgRE1BIGhhbmRsZSBzdHJ1Y3R1cmUgd2l0aCB0aGUgcmVxdWlyZWQKICAgICAgICAgICAgICAgICAgVHgvUnggcGFyYW1ldGVycy4KICAgICAgICAgICAgKCsrKykgQ29uZmlndXJlIHRoZSBETUEgVHgvUnggY2hhbm5lbHMgYW5kIHJlcXVlc3RzLgogICAgICAgICAgICAoKysrKSBBc3NvY2lhdGUgdGhlIGluaXRpYWxpemVkIERNQSBoYW5kbGUgdG8gdGhlIFNXUE1JIERNQSBUeC9SeCBoYW5kbGUuCiAgICAgICAgICAgICgrKyspIENvbmZpZ3VyZSB0aGUgcHJpb3JpdHkgYW5kIGVuYWJsZSB0aGUgTlZJQyBmb3IgdGhlIHRyYW5zZmVyIGNvbXBsZXRlCiAgICAgICAgICAgICAgICAgIGludGVycnVwdCBvbiB0aGUgRE1BIFR4L1J4IGNoYW5uZWxzLgoKICAgICgjKSBQcm9ncmFtIHRoZSBCaXRlIFJhdGUsIFR4IEJ1ZmZlcmluZyBtb2RlLCBSeCBCdWZmZXJpbmcgbW9kZSBpbiB0aGUgSW5pdCBzdHJ1Y3R1cmUuCgogICAgKCMpIEVuYWJsZSB0aGUgU1dQTUkgcGVyaXBoZXJhbCBieSBjYWxsaW5nIHRoZSBIQUxfU1dQTUlfSW5pdCgpIGZ1bmN0aW9uLgoKICBbLi5dCiAgICBUaHJlZSBvcGVyYXRpb24gbW9kZXMgYXJlIGF2YWlsYWJsZSB3aXRoaW4gdGhpcyBkcml2ZXIgOgoKICAgICoqKiBQb2xsaW5nIG1vZGUgSU8gb3BlcmF0aW9uICoqKgogICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICBbLi5dCiAgICAgICgrKSBTZW5kIGFuIGFtb3VudCBvZiBkYXRhIGluIGJsb2NraW5nIG1vZGUgdXNpbmcgSEFMX1NXUE1JX1RyYW5zbWl0KCkKICAgICAgKCspIFJlY2VpdmUgYW4gYW1vdW50IG9mIGRhdGEgaW4gYmxvY2tpbmcgbW9kZSB1c2luZyBIQUxfU1dQTUlfUmVjZWl2ZSgpCgogICAgKioqIEludGVycnVwdCBtb2RlIElPIG9wZXJhdGlvbiAqKioKICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICBbLi5dCiAgICAgICgrKSBTZW5kIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlIHVzaW5nIEhBTF9TV1BNSV9UcmFuc21pdF9JVCgpCiAgICAgICgrKSBBdCB0cmFuc21pc3Npb24gZW5kIG9mIHRyYW5zZmVyIEhBTF9TV1BNSV9UeENwbHRDYWxsYmFjaygpIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbgogICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgSEFMX1NXUE1JX1R4Q3BsdENhbGxiYWNrKCkKICAgICAgKCspIFJlY2VpdmUgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uLWJsb2NraW5nIG1vZGUgdXNpbmcgSEFMX1NXUE1JX1JlY2VpdmVfSVQoKQogICAgICAoKykgQXQgcmVjZXB0aW9uIGVuZCBvZiB0cmFuc2ZlciBIQUxfU1dQTUlfUnhDcGx0Q2FsbGJhY2soKSBpcyBleGVjdXRlZCBhbmQgdXNlciBjYW4KICAgICAgICAgIGFkZCBoaXMgb3duIGNvZGUgYnkgY3VzdG9taXphdGlvbiBvZiBmdW5jdGlvbiBwb2ludGVyIEhBTF9TV1BNSV9SeENwbHRDYWxsYmFjaygpCiAgICAgICgrKSBJbiBjYXNlIG9mIGZsYWcgZXJyb3IsIEhBTF9TV1BNSV9FcnJvckNhbGxiYWNrKCkgZnVuY3Rpb24gaXMgZXhlY3V0ZWQgYW5kIHVzZXIgY2FuCiAgICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgZnVuY3Rpb24gcG9pbnRlciBIQUxfU1dQTUlfRXJyb3JDYWxsYmFjaygpCgogICAgKioqIERNQSBtb2RlIElPIG9wZXJhdGlvbiAqKioKICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICBbLi5dCiAgICAgICgrKSBTZW5kIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlIChETUEpIHVzaW5nIEhBTF9TV1BNSV9UcmFuc21pdF9ETUEoKQogICAgICAoKykgQXQgdHJhbnNtaXNzaW9uIGVuZCBvZiB0cmFuc2ZlciBIQUxfU1dQTUlfVHhDcGx0Q2FsbGJhY2soKSBpcyBleGVjdXRlZCBhbmQgdXNlciBjYW4KICAgICAgICAgIGFkZCBoaXMgb3duIGNvZGUgYnkgY3VzdG9taXphdGlvbiBvZiBmdW5jdGlvbiBwb2ludGVyIEhBTF9TV1BNSV9UeENwbHRDYWxsYmFjaygpCiAgICAgICgrKSBSZWNlaXZlIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlIChETUEpIHVzaW5nIEhBTF9TV1BNSV9SZWNlaXZlX0RNQSgpCiAgICAgICgrKSBBdCByZWNlcHRpb24gZW5kIG9mIHRyYW5zZmVyIEhBTF9TV1BNSV9SeENwbHRDYWxsYmFjaygpIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbgogICAgICAgICAgYWRkIGhpcyBvd24gY29kZSBieSBjdXN0b21pemF0aW9uIG9mIGZ1bmN0aW9uIHBvaW50ZXIgSEFMX1NXUE1JX1J4Q3BsdENhbGxiYWNrKCkKICAgICAgKCspIEluIGNhc2Ugb2YgZmxhZyBlcnJvciwgSEFMX1NXUE1JX0Vycm9yQ2FsbGJhY2soKSBmdW5jdGlvbiBpcyBleGVjdXRlZCBhbmQgdXNlciBjYW4KICAgICAgICAgIGFkZCBoaXMgb3duIGNvZGUgYnkgY3VzdG9taXphdGlvbiBvZiBmdW5jdGlvbiBwb2ludGVyIEhBTF9TV1BNSV9FcnJvckNhbGxiYWNrKCkKICAgICAgKCspIFN0b3AgdGhlIERNQSBUcmFuc2ZlciB1c2luZyBIQUxfU1dQTUlfRE1BU3RvcCgpCgogICAgKioqIFNXUE1JIEhBTCBkcml2ZXIgYWRkaXRpb25hbCBmdW5jdGlvbiBsaXN0ICoqKgogICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIFsuLl0KICAgICAgQmVsb3cgdGhlIGxpc3QgdGhlIG90aGVycyBBUEkgYXZhaWxhYmxlIFNXUE1JIEhBTCBkcml2ZXIgOgoKICAgICAgKCspIEhBTF9TV1BNSV9FbmFibGVMb29wYmFjaygpOiBFbmFibGUgdGhlIGxvb3BiYWNrIG1vZGUgZm9yIHRlc3QgcHVycG9zZSBvbmx5CiAgICAgICgrKSBIQUxfU1dQTUlfRGlzYWJsZUxvb3BiYWNrKCk6IERpc2FibGUgdGhlIGxvb3BiYWNrIG1vZGUKCiAgICAqKiogU1dQTUkgSEFMIGRyaXZlciBtYWNyb3MgbGlzdCAqKioKICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIFsuLl0KICAgICAgQmVsb3cgdGhlIGxpc3Qgb2YgbW9zdCB1c2VkIG1hY3JvcyBpbiBTV1BNSSBIQUwgZHJpdmVyIDoKCiAgICAgICgrKSBfX0hBTF9TV1BNSV9FTkFCTEUoKTogRW5hYmxlIHRoZSBTV1BNSSBwZXJpcGhlcmFsCiAgICAgICgrKSBfX0hBTF9TV1BNSV9ESVNBQkxFKCk6IERpc2FibGUgdGhlIFNXUE1JIHBlcmlwaGVyYWwKICAgICAgKCspIF9fSEFMX1NXUE1JX0VOQUJMRV9JVCgpOiBFbmFibGUgdGhlIHNwZWNpZmllZCBTV1BNSSBpbnRlcnJ1cHRzCiAgICAgICgrKSBfX0hBTF9TV1BNSV9ESVNBQkxFX0lUKCk6IERpc2FibGUgdGhlIHNwZWNpZmllZCBTV1BNSSBpbnRlcnJ1cHRzCiAgICAgICgrKSBfX0hBTF9TV1BNSV9HRVRfSVRfU09VUkNFKCk6IENoZWNrIGlmIHRoZSBzcGVjaWZpZWQgU1dQTUkgaW50ZXJydXB0IHNvdXJjZSBpcwogICAgICAgICAgZW5hYmxlZCBvciBkaXNhYmxlZAogICAgICAoKykgX19IQUxfU1dQTUlfR0VUX0ZMQUcoKTogQ2hlY2sgd2hldGhlciB0aGUgc3BlY2lmaWVkIFNXUE1JIGZsYWcgaXMgc2V0IG9yIG5vdAoKICAgICoqKiBDYWxsYmFjayByZWdpc3RyYXRpb24gKioqCiAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgWy4uXQogICAgICBUaGUgY29tcGlsYXRpb24gZGVmaW5lIFVTRV9IQUxfU1dQTUlfUkVHSVNURVJfQ0FMTEJBQ0tTIHdoZW4gc2V0IHRvIDEKICAgICAgYWxsb3dzIHRoZSB1c2VyIHRvIGNvbmZpZ3VyZSBkeW5hbWljYWxseSB0aGUgZHJpdmVyIGNhbGxiYWNrcy4KICAgIFsuLl0KICAgICAgVXNlIGZ1bmN0aW9uIEhBTF9TV1BNSV9SZWdpc3RlckNhbGxiYWNrKCkgdG8gcmVnaXN0ZXIgYSB1c2VyIGNhbGxiYWNrLiBJdCBhbGxvd3MKICAgICAgdG8gcmVnaXN0ZXIgdGhlIGZvbGxvd2luZyBjYWxsYmFja3M6CiAgICAgICgrKSBSeENwbHRDYWxsYmFjayAgICAgOiBTV1BNSSByZWNlaXZlIGNvbXBsZXRlLgogICAgICAoKykgUnhIYWxmQ3BsdENhbGxiYWNrIDogU1dQTUkgcmVjZWl2ZSBoYWxmIGNvbXBsZXRlLgogICAgICAoKykgVHhDcGx0Q2FsbGJhY2sgICAgIDogU1dQTUkgdHJhbnNtaXQgY29tcGxldGUuCiAgICAgICgrKSBUeEhhbGZDcGx0Q2FsbGJhY2sgOiBTV1BNSSB0cmFuc21pdCBoYWxmIGNvbXBsZXRlLgogICAgICAoKykgRXJyb3JDYWxsYmFjayAgICAgIDogU1dQTUkgZXJyb3IuCiAgICAgICgrKSBNc3BJbml0Q2FsbGJhY2sgICAgOiBTV1BNSSBNc3BJbml0LgogICAgICAoKykgTXNwRGVJbml0Q2FsbGJhY2sgIDogU1dQTUkgTXNwRGVJbml0LgogICAgWy4uXQogICAgVGhpcyBmdW5jdGlvbiB0YWtlcyBhcyBwYXJhbWV0ZXJzIHRoZSBIQUwgcGVyaXBoZXJhbCBoYW5kbGUsIHRoZSBjYWxsYmFjayBJRAogICAgYW5kIGEgcG9pbnRlciB0byB0aGUgdXNlciBjYWxsYmFjayBmdW5jdGlvbi4KICAgIFsuLl0KICAgIFVzZSBmdW5jdGlvbiBIQUxfU1dQTUlfVW5SZWdpc3RlckNhbGxiYWNrKCkgdG8gcmVzZXQgYSBjYWxsYmFjayB0byB0aGUgZGVmYXVsdAogICAgd2VhayAoc3VyY2hhcmdlZCkgZnVuY3Rpb24uCiAgICBIQUxfU1dQTUlfVW5SZWdpc3RlckNhbGxiYWNrKCkgdGFrZXMgYXMgcGFyYW1ldGVycyB0aGUgSEFMIHBlcmlwaGVyYWwgaGFuZGxlLAogICAgYW5kIHRoZSBjYWxsYmFjayBJRC4KICAgIFRoaXMgZnVuY3Rpb24gYWxsb3dzIHRvIHJlc2V0IGZvbGxvd2luZyBjYWxsYmFja3M6CiAgICAgICgrKSBSeENwbHRDYWxsYmFjayAgICAgOiBTV1BNSSByZWNlaXZlIGNvbXBsZXRlLgogICAgICAoKykgUnhIYWxmQ3BsdENhbGxiYWNrIDogU1dQTUkgcmVjZWl2ZSBoYWxmIGNvbXBsZXRlLgogICAgICAoKykgVHhDcGx0Q2FsbGJhY2sgICAgIDogU1dQTUkgdHJhbnNtaXQgY29tcGxldGUuCiAgICAgICgrKSBUeEhhbGZDcGx0Q2FsbGJhY2sgOiBTV1BNSSB0cmFuc21pdCBoYWxmIGNvbXBsZXRlLgogICAgICAoKykgRXJyb3JDYWxsYmFjayAgICAgIDogU1dQTUkgZXJyb3IuCiAgICAgICgrKSBNc3BJbml0Q2FsbGJhY2sgICAgOiBTV1BNSSBNc3BJbml0LgogICAgICAoKykgTXNwRGVJbml0Q2FsbGJhY2sgIDogU1dQTUkgTXNwRGVJbml0LgogICAgWy4uXQogICAgQnkgZGVmYXVsdCwgYWZ0ZXIgdGhlIEhBTF9TV1BNSV9Jbml0IGFuZCBpZiB0aGUgc3RhdGUgaXMgSEFMX1NXUE1JX1NUQVRFX1JFU0VUCiAgICBhbGwgY2FsbGJhY2tzIGFyZSByZXNldCB0byB0aGUgY29ycmVzcG9uZGluZyBsZWdhY3kgd2VhayAoc3VyY2hhcmdlZCkgZnVuY3Rpb25zOgogICAgZXhhbXBsZXMgSEFMX1NXUE1JX1J4Q3BsdENhbGxiYWNrKCksIEhBTF9TV1BNSV9FcnJvckNhbGxiYWNrKCkuCiAgICBFeGNlcHRpb24gZG9uZSBmb3IgTXNwSW5pdCBhbmQgTXNwRGVJbml0IGNhbGxiYWNrcyB0aGF0IGFyZSByZXNwZWN0aXZlbHkKICAgIHJlc2V0IHRvIHRoZSBsZWdhY3kgd2VhayAoc3VyY2hhcmdlZCkgZnVuY3Rpb25zIGluIHRoZSBIQUxfU1dQTUlfSW5pdAogICAgYW5kIEhBTF9TV1BNSV9EZUluaXQgb25seSB3aGVuIHRoZXNlIGNhbGxiYWNrcyBhcmUgbnVsbCAobm90IHJlZ2lzdGVyZWQgYmVmb3JlaGFuZCkuCiAgICBJZiBub3QsIE1zcEluaXQgb3IgTXNwRGVJbml0IGFyZSBub3QgbnVsbCwgdGhlIEhBTF9TV1BNSV9Jbml0IGFuZCBIQUxfU1dQTUlfRGVJbml0CiAgICBrZWVwIGFuZCB1c2UgdGhlIHVzZXIgTXNwSW5pdC9Nc3BEZUluaXQgY2FsbGJhY2tzIChyZWdpc3RlcmVkIGJlZm9yZWhhbmQpLgogICAgWy4uXQogICAgQ2FsbGJhY2tzIGNhbiBiZSByZWdpc3RlcmVkL3VucmVnaXN0ZXJlZCBpbiBSRUFEWSBzdGF0ZSBvbmx5LgogICAgRXhjZXB0aW9uIGRvbmUgZm9yIE1zcEluaXQvTXNwRGVJbml0IGNhbGxiYWNrcyB0aGF0IGNhbiBiZSByZWdpc3RlcmVkL3VucmVnaXN0ZXJlZAogICAgaW4gUkVBRFkgb3IgUkVTRVQgc3RhdGUsIHRodXMgcmVnaXN0ZXJlZCAodXNlcikgTXNwSW5pdC9EZUluaXQgY2FsbGJhY2tzIGNhbiBiZSB1c2VkCiAgICBkdXJpbmcgdGhlIEluaXQvRGVJbml0LgogICAgSW4gdGhhdCBjYXNlIGZpcnN0IHJlZ2lzdGVyIHRoZSBNc3BJbml0L01zcERlSW5pdCB1c2VyIGNhbGxiYWNrcwogICAgdXNpbmcgSEFMX1NXUE1JX1JlZ2lzdGVyQ2FsbGJhY2sgYmVmb3JlIGNhbGxpbmcgQHJlZiBIQUxfU1dQTUlfRGVJbml0CiAgICBvciBIQUxfU1dQTUlfSW5pdCBmdW5jdGlvbi4KICAgIFsuLl0KICAgIFdoZW4gdGhlIGNvbXBpbGF0aW9uIGRlZmluZSBVU0VfSEFMX1NXUE1JX1JFR0lTVEVSX0NBTExCQUNLUyBpcyBzZXQgdG8gMCBvcgogICAgbm90IGRlZmluZWQsIHRoZSBjYWxsYmFjayByZWdpc3RlcmluZyBmZWF0dXJlIGlzIG5vdCBhdmFpbGFibGUKICAgIGFuZCB3ZWFrIChzdXJjaGFyZ2VkKSBjYWxsYmFja3MgYXJlIHVzZWQuCgogIEBlbmR2ZXJiYXRpbQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogQGF0dGVudGlvbgogICoKICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTcgU1RNaWNyb2VsZWN0cm9uaWNzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgogICoKICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAogICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZQogICogTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgogICogICAgICAgICAgICAgICAgICAgICAgICBvcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKi8KCi8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiNpbmNsdWRlICJzdG0zMmw0eHhfaGFsLmgiCgovKiogQGFkZHRvZ3JvdXAgU1RNMzJMNHh4X0hBTF9Ecml2ZXIKICAqIEB7CiAgKi8KCiNpZiBkZWZpbmVkKFNXUE1JMSkKCi8qKiBAZGVmZ3JvdXAgU1dQTUkgU1dQTUkKICAqIEBicmllZiBIQUwgU1dQTUkgbW9kdWxlIGRyaXZlcgogICogQHsKICAqLwojaWZkZWYgSEFMX1NXUE1JX01PRFVMRV9FTkFCTEVECgovKiBQcml2YXRlIHR5cGVkZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwovKiBQcml2YXRlIGRlZmluZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwovKiBQcml2YXRlIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwovKiogQGFkZHRvZ3JvdXAgU1dQTUlfUHJpdmF0ZV9Db25zdGFudHMgU1dQTUkgUHJpdmF0ZSBDb25zdGFudHMKICAqIEB7CiAgKi8KI2RlZmluZSBTV1BNSV9USU1FT1VUX1ZBTFVFICAgICAgICAgICAgICAgICAgIDIyMDAwVSAgIC8qIEVuZCBvZiB0cmFuc21pc3Npb24gdGltZW91dCAqLwoKLyoqCiAgKiBAfQogICovCgovKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwovKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwovKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpzdGF0aWMgdm9pZCBTV1BNSV9ETUFUcmFuc21pdENwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOwpzdGF0aWMgdm9pZCBTV1BNSV9ETUFUeEhhbGZDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKc3RhdGljIHZvaWQgU1dQTUlfRE1BUmVjZWl2ZUNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOwpzdGF0aWMgdm9pZCBTV1BNSV9ETUFSeEhhbGZDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsKc3RhdGljIHZvaWQgU1dQTUlfRE1BRXJyb3IoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOwpzdGF0aWMgdm9pZCBTV1BNSV9ETUFBYm9ydE9uRXJyb3IoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOwpzdGF0aWMgdm9pZCBTV1BNSV9UcmFuc21pdF9JVChTV1BNSV9IYW5kbGVUeXBlRGVmICpoc3dwbWkpOwpzdGF0aWMgdm9pZCBTV1BNSV9FbmRUcmFuc21pdF9JVChTV1BNSV9IYW5kbGVUeXBlRGVmICpoc3dwbWkpOwpzdGF0aWMgdm9pZCBTV1BNSV9SZWNlaXZlX0lUKFNXUE1JX0hhbmRsZVR5cGVEZWYgKmhzd3BtaSk7CnN0YXRpYyB2b2lkIFNXUE1JX0VuZFJlY2VpdmVfSVQoU1dQTUlfSGFuZGxlVHlwZURlZiAqaHN3cG1pKTsKc3RhdGljIHZvaWQgU1dQTUlfRW5kVHJhbnNtaXRSZWNlaXZlX0lUKFNXUE1JX0hhbmRsZVR5cGVEZWYgKmhzd3BtaSk7CnN0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBTV1BNSV9XYWl0T25GbGFnU2V0VW50aWxUaW1lb3V0KFNXUE1JX0hhbmRsZVR5cGVEZWYgKmhzd3BtaSwgdWludDMyX3QgRmxhZywgdWludDMyX3QgVGlja3N0YXJ0LCB1aW50MzJfdCBUaW1lb3V0KTsKCi8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgovKiogQGRlZmdyb3VwIFNXUE1JX0V4cG9ydGVkX0Z1bmN0aW9ucyBTV1BNSSBFeHBvcnRlZCBGdW5jdGlvbnMKICAqIEB7CiAgKi8KCi8qKiBAZGVmZ3JvdXAgU1dQTUlfRXhwb3J0ZWRfR3JvdXAxIEluaXRpYWxpemF0aW9uL2RlLWluaXRpYWxpemF0aW9uIG1ldGhvZHMKICAqICBAYnJpZWYgICAgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zCiAgKgpAdmVyYmF0aW0KID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAgICAgICAgIyMjIyMgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zICMjIyMjCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICBbLi5dICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvOgogICAgICAoKykgSW5pdGlhbGl6ZSBhbmQgY29uZmlndXJlIHRoZSBTV1BNSSBwZXJpcGhlcmFsLgogICAgICAoKykgRGUtaW5pdGlhbGl6ZSB0aGUgU1dQTUkgcGVyaXBoZXJhbC4KCkBlbmR2ZXJiYXRpbQogICogQHsKICAqLwoKLyoqCiAgKiBAYnJpZWYgSW5pdGlhbGl6ZSB0aGUgU1dQTUkgcGVyaXBoZXJhbCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzIGluIHRoZSBTV1BNSV9Jbml0VHlwZURlZi4KICAqIEBwYXJhbSBoc3dwbWkgU1dQTUkgaGFuZGxlCiAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAqLwpIQUxfU3RhdHVzVHlwZURlZiBIQUxfU1dQTUlfSW5pdChTV1BNSV9IYW5kbGVUeXBlRGVmICpoc3dwbWkpCnsKICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CiAgX19JTyB1aW50MzJfdCB3YWl0X2xvb3BfaW5kZXggPSAwVTsKCiAgLyogQ2hlY2sgdGhlIFNXUE1JIGhhbmRsZSBhbGxvY2F0aW9uICovCiAgaWYoaHN3cG1pID09IE5VTEwpCiAgewogICAgc3RhdHVzID0gSEFMX0VSUk9SOwogIH0KICBlbHNlCiAgewogICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KICAgIGFzc2VydF9wYXJhbShJU19TV1BNSV9WT0xUQUdFX0NMQVNTKGhzd3BtaS0+SW5pdC5Wb2x0YWdlQ2xhc3MpKTsKICAgIGFzc2VydF9wYXJhbShJU19TV1BNSV9CSVRSQVRFX1ZBTFVFKGhzd3BtaS0+SW5pdC5CaXRSYXRlKSk7CiAgICBhc3NlcnRfcGFyYW0oSVNfU1dQTUlfVFhfQlVGRkVSSU5HX01PREUoaHN3cG1pLT5Jbml0LlR4QnVmZmVyaW5nTW9kZSkpOwogICAgYXNzZXJ0X3BhcmFtKElTX1NXUE1JX1JYX0JVRkZFUklOR19NT0RFKGhzd3BtaS0+SW5pdC5SeEJ1ZmZlcmluZ01vZGUpKTsKCiAgICBpZihoc3dwbWktPlN0YXRlID09IEhBTF9TV1BNSV9TVEFURV9SRVNFVCkKICAgIHsKICAgICAgLyogQWxsb2NhdGUgbG9jayByZXNvdXJjZSBhbmQgaW5pdGlhbGl6ZSBpdCAqLwogICAgICBoc3dwbWktPkxvY2sgPSBIQUxfVU5MT0NLRUQ7CgojaWYgKFVTRV9IQUxfU1dQTUlfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCiAgICAgIC8qIFJlc2V0IGNhbGxiYWNrIHBvaW50ZXJzIHRvIHRoZSB3ZWFrIHByZWRlZmluZWQgY2FsbGJhY2tzICovCiAgICAgIGhzd3BtaS0+UnhDcGx0Q2FsbGJhY2sgICAgID0gSEFMX1NXUE1JX1J4Q3BsdENhbGxiYWNrOwogICAgICBoc3dwbWktPlJ4SGFsZkNwbHRDYWxsYmFjayA9IEhBTF9TV1BNSV9SeEhhbGZDcGx0Q2FsbGJhY2s7CiAgICAgIGhzd3BtaS0+VHhDcGx0Q2FsbGJhY2sgICAgID0gSEFMX1NXUE1JX1R4Q3BsdENhbGxiYWNrOwogICAgICBoc3dwbWktPlR4SGFsZkNwbHRDYWxsYmFjayA9IEhBTF9TV1BNSV9UeEhhbGZDcGx0Q2FsbGJhY2s7CiAgICAgIGhzd3BtaS0+RXJyb3JDYWxsYmFjayAgICAgID0gSEFMX1NXUE1JX0Vycm9yQ2FsbGJhY2s7CgogICAgICAvKiBJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgOiBHUElPLCBDTE9DSywgTlZJQyBhbmQgRE1BICovCiAgICAgIGlmKGhzd3BtaS0+TXNwSW5pdENhbGxiYWNrID09IE5VTEwpCiAgICAgIHsKICAgICAgICBoc3dwbWktPk1zcEluaXRDYWxsYmFjayA9IEhBTF9TV1BNSV9Nc3BJbml0OwogICAgICB9CiAgICAgIGhzd3BtaS0+TXNwSW5pdENhbGxiYWNrKGhzd3BtaSk7CiNlbHNlCiAgICAgIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSA6IEdQSU8sIENMT0NLLCBOVklDIGFuZCBETUEgKi8KICAgICAgSEFMX1NXUE1JX01zcEluaXQoaHN3cG1pKTsKI2VuZGlmCiAgICB9CgogICAgaHN3cG1pLT5TdGF0ZSA9IEhBTF9TV1BNSV9TVEFURV9CVVNZOwoKICAgIC8qIERpc2FibGUgU1dQTUkgaW50ZXJmYWNlICovCiAgICBDTEVBUl9CSVQoaHN3cG1pLT5JbnN0YW5jZS0+Q1IsIFNXUE1JX0NSX1NXUEFDVCk7CgogICAgLyogQ2xlYXIgYWxsIFNXUE1JIGludGVyZmFjZSBmbGFncyAqLwogICAgV1JJVEVfUkVHKGhzd3BtaS0+SW5zdGFuY2UtPklDUiwgMHgwMTlGKTsKCiAgICAvKiBBcHBseSBWb2x0YWdlIGNsYXNzIHNlbGVjdGlvbiAqLwogICAgTU9ESUZZX1JFRyhoc3dwbWktPkluc3RhbmNlLT5PUiwgU1dQTUlfT1JfQ0xBU1MsIGhzd3BtaS0+SW5pdC5Wb2x0YWdlQ2xhc3MpOwoKICAgIC8qIElmIFZvbHRhZ2UgY2xhc3MgQiwgYXBwbHkgMzAwILVzIGRlbGF5ICovCiAgICBpZihoc3dwbWktPkluaXQuVm9sdGFnZUNsYXNzID09IFNXUE1JX1ZPTFRBR0VfQ0xBU1NfQikKICAgIHsKICAgICAgLyogSW5zdXJlIDMwMCC1cyB3YWl0IHRvIGluc3VyZSBTV1BNSV9JTyBvdXRwdXQgbm90IGhpZ2hlciB0aGFuIDEuOFYgKi8KICAgICAgLyogV2FpdCBsb29wIGluaXRpYWxpemF0aW9uIGFuZCBleGVjdXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgLyogTm90ZTogVmFyaWFibGUgZGl2aWRlZCBieSA0IHRvIGNvbXBlbnNhdGUgcGFydGlhbGx5IENQVSBwcm9jZXNzaW5nIGN5Y2xlcy4gKi8KICAgICAgd2FpdF9sb29wX2luZGV4ID0gKDMwMFUgKiAoU3lzdGVtQ29yZUNsb2NrIC8gKDEwMDAwMDBVICogNFUpKSkgKyAxNTBVOwogICAgICB3aGlsZSh3YWl0X2xvb3BfaW5kZXggIT0gMFUpCiAgICAgIHsKICAgICAgICB3YWl0X2xvb3BfaW5kZXgtLTsKICAgICAgfQogICAgfQoKICAgIC8qIENvbmZpZ3VyZSB0aGUgQlJSIHJlZ2lzdGVyIChCaXRyYXRlKSAqLwogICAgV1JJVEVfUkVHKGhzd3BtaS0+SW5zdGFuY2UtPkJSUiwgaHN3cG1pLT5Jbml0LkJpdFJhdGUpOwoKICAgIC8qIEFwcGx5IFNXUE1JIENSIGNvbmZpZ3VyYXRpb24gKi8KICAgIE1PRElGWV9SRUcoaHN3cG1pLT5JbnN0YW5jZS0+Q1IsIFwKICAgICAgICAgICAgICAgU1dQTUlfQ1JfUlhETUEgfCBTV1BNSV9DUl9UWERNQSAgfCBTV1BNSV9DUl9SWE1PREUgfCBTV1BNSV9DUl9UWE1PREUsIFwKICAgICAgICAgICAgICAgaHN3cG1pLT5Jbml0LlR4QnVmZmVyaW5nTW9kZSB8IGhzd3BtaS0+SW5pdC5SeEJ1ZmZlcmluZ01vZGUpOwoKICAgIGhzd3BtaS0+RXJyb3JDb2RlID0gSEFMX1NXUE1JX0VSUk9SX05PTkU7CiAgICBoc3dwbWktPlN0YXRlID0gSEFMX1NXUE1JX1NUQVRFX1JFQURZOwoKICAgIC8qIEVuYWJsZSBTV1BNSSBwZXJpcGhlcmFsICovCiAgICBTRVRfQklUKGhzd3BtaS0+SW5zdGFuY2UtPkNSLCBTV1BNSV9DUl9TV1BBQ1QpOwogIH0KCiAgcmV0dXJuIHN0YXR1czsKfQoKLyoqCiAgKiBAYnJpZWYgRGUtaW5pdGlhbGl6ZSB0aGUgU1dQTUkgcGVyaXBoZXJhbC4KICAqIEBwYXJhbSBoc3dwbWkgU1dQTUkgaGFuZGxlCiAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAqLwpIQUxfU3RhdHVzVHlwZURlZiBIQUxfU1dQTUlfRGVJbml0KFNXUE1JX0hhbmRsZVR5cGVEZWYgKmhzd3BtaSkKewogIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKCiAgLyogQ2hlY2sgdGhlIFNXUE1JIGhhbmRsZSBhbGxvY2F0aW9uICovCiAgaWYoaHN3cG1pID09IE5VTEwpCiAgewogICAgc3RhdHVzID0gSEFMX0VSUk9SOwogIH0KICBlbHNlCiAgewogICAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8KICAgIGFzc2VydF9wYXJhbShJU19TV1BNSV9JTlNUQU5DRShoc3dwbWktPkluc3RhbmNlKSk7CgogICAgaHN3cG1pLT5TdGF0ZSA9IEhBTF9TV1BNSV9TVEFURV9CVVNZOwoKICAgIC8qIERpc2FibGUgU1dQTUkgaW50ZXJmYWNlICovCiAgICBDTEVBUl9CSVQoaHN3cG1pLT5JbnN0YW5jZS0+Q1IsIFNXUE1JX0NSX1NXUEFDVCk7CgogICAgLyogRGlzYWJsZSBMb29wYmFjayBtb2RlICovCiAgICBDTEVBUl9CSVQoaHN3cG1pLT5JbnN0YW5jZS0+Q1IsIFNXUE1JX0NSX0xQQkspOwoKCiAgICAvKiBEZUluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZTogR1BJTywgQ0xPQ0ssIE5WSUMgYW5kIERNQSAqLwojaWYgKFVTRV9IQUxfU1dQTUlfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCiAgICBpZihoc3dwbWktPk1zcERlSW5pdENhbGxiYWNrID09IE5VTEwpCiAgICB7CiAgICAgIGhzd3BtaS0+TXNwRGVJbml0Q2FsbGJhY2sgPSBIQUxfU1dQTUlfTXNwRGVJbml0OwogICAgfQogICAgaHN3cG1pLT5Nc3BEZUluaXRDYWxsYmFjayhoc3dwbWkpOwojZWxzZQogICAgSEFMX1NXUE1JX01zcERlSW5pdChoc3dwbWkpOwojZW5kaWYKCiAgICBoc3dwbWktPkVycm9yQ29kZSA9IEhBTF9TV1BNSV9FUlJPUl9OT05FOwogICAgaHN3cG1pLT5TdGF0ZSA9IEhBTF9TV1BNSV9TVEFURV9SRVNFVDsKCiAgICAvKiBSZWxlYXNlIExvY2sgKi8KICAgIF9fSEFMX1VOTE9DSyhoc3dwbWkpOwogIH0KCiAgcmV0dXJuIHN0YXR1czsKfQoKLyoqCiAgKiBAYnJpZWYgSW5pdGlhbGl6ZSB0aGUgU1dQTUkgTVNQLgogICogQHBhcmFtIGhzd3BtaSBTV1BNSSBoYW5kbGUKICAqIEByZXR2YWwgTm9uZQogICovCl9fd2VhayB2b2lkIEhBTF9TV1BNSV9Nc3BJbml0KFNXUE1JX0hhbmRsZVR5cGVEZWYgKmhzd3BtaSkKewogIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KICBVTlVTRUQoaHN3cG1pKTsKCiAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAogICAgICAgICAgICB0aGUgSEFMX1NXUE1JX01zcEluaXQgY2FuIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKICAgKi8KfQoKLyoqCiAgKiBAYnJpZWYgRGVJbml0aWFsaXplIHRoZSBTV1BNSSBNU1AuCiAgKiBAcGFyYW0gaHN3cG1pIFNXUE1JIGhhbmRsZQogICogQHJldHZhbCBOb25lCiAgKi8KX193ZWFrIHZvaWQgSEFMX1NXUE1JX01zcERlSW5pdChTV1BNSV9IYW5kbGVUeXBlRGVmICpoc3dwbWkpCnsKICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCiAgVU5VU0VEKGhzd3BtaSk7CgogIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKICAgICAgICAgICAgdGhlIEhBTF9TV1BNSV9Nc3BEZUluaXQgY2FuIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKICAgKi8KfQoKI2lmIChVU0VfSEFMX1NXUE1JX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQovKioKICAqIEBicmllZiAgUmVnaXN0ZXIgYSB1c2VyIFNXUE1JIGNhbGxiYWNrCiAgKiAgICAgICAgIHRvIGJlIHVzZWQgaW5zdGVhZCBvZiB0aGUgd2VhayBwcmVkZWZpbmVkIGNhbGxiYWNrLgogICogQHBhcmFtICBoc3dwbWkgU1dQTUkgaGFuZGxlLgogICogQHBhcmFtICBDYWxsYmFja0lEIElEIG9mIHRoZSBjYWxsYmFjayB0byBiZSByZWdpc3RlcmVkLgogICogICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgogICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfU1dQTUlfUlhfQ09NUExFVEVfQ0JfSUQgcmVjZWl2ZSBjb21wbGV0ZSBjYWxsYmFjayBJRC4KICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1NXUE1JX1JYX0hBTEZDT01QTEVURV9DQl9JRCByZWNlaXZlIGhhbGYgY29tcGxldGUgY2FsbGJhY2sgSUQuCiAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9TV1BNSV9UWF9DT01QTEVURV9DQl9JRCB0cmFuc21pdCBjb21wbGV0ZSBjYWxsYmFjayBJRC4KICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1NXUE1JX1RYX0hBTEZDT01QTEVURV9DQl9JRCB0cmFuc21pdCBoYWxmIGNvbXBsZXRlIGNhbGxiYWNrIElELgogICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfU1dQTUlfRVJST1JfQ0JfSUQgZXJyb3IgY2FsbGJhY2sgSUQuCiAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9TV1BNSV9NU1BJTklUX0NCX0lEIE1TUCBpbml0IGNhbGxiYWNrIElELgogICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfU1dQTUlfTVNQREVJTklUX0NCX0lEIE1TUCBkZS1pbml0IGNhbGxiYWNrIElELgogICogQHBhcmFtICBwQ2FsbGJhY2sgcG9pbnRlciB0byB0aGUgY2FsbGJhY2sgZnVuY3Rpb24uCiAgKiBAcmV0dmFsIEhBTCBzdGF0dXMuCiAgKi8KSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NXUE1JX1JlZ2lzdGVyQ2FsbGJhY2soU1dQTUlfSGFuZGxlVHlwZURlZiAgICAgICAgKmhzd3BtaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9TV1BNSV9DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNXUE1JX0NhbGxiYWNrVHlwZURlZiAgICAgIHBDYWxsYmFjaykKewogIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKCiAgaWYocENhbGxiYWNrID09IE5VTEwpCiAgewogICAgLyogdXBkYXRlIHRoZSBlcnJvciBjb2RlICovCiAgICBoc3dwbWktPkVycm9yQ29kZSB8PSBIQUxfU1dQTUlfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKICAgIC8qIHVwZGF0ZSByZXR1cm4gc3RhdHVzICovCiAgICBzdGF0dXMgPSBIQUxfRVJST1I7CiAgfQogIGVsc2UKICB7CiAgICBpZihoc3dwbWktPlN0YXRlID09IEhBTF9TV1BNSV9TVEFURV9SRUFEWSkKICAgIHsKICAgICAgc3dpdGNoIChDYWxsYmFja0lEKQogICAgICB7CiAgICAgIGNhc2UgSEFMX1NXUE1JX1JYX0NPTVBMRVRFX0NCX0lEIDoKICAgICAgICBoc3dwbWktPlJ4Q3BsdENhbGxiYWNrID0gcENhbGxiYWNrOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIEhBTF9TV1BNSV9SWF9IQUxGQ09NUExFVEVfQ0JfSUQgOgogICAgICAgIGhzd3BtaS0+UnhIYWxmQ3BsdENhbGxiYWNrID0gcENhbGxiYWNrOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIEhBTF9TV1BNSV9UWF9DT01QTEVURV9DQl9JRCA6CiAgICAgICAgaHN3cG1pLT5UeENwbHRDYWxsYmFjayA9IHBDYWxsYmFjazsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBIQUxfU1dQTUlfVFhfSEFMRkNPTVBMRVRFX0NCX0lEIDoKICAgICAgICBoc3dwbWktPlR4SGFsZkNwbHRDYWxsYmFjayA9IHBDYWxsYmFjazsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBIQUxfU1dQTUlfRVJST1JfQ0JfSUQgOgogICAgICAgIGhzd3BtaS0+RXJyb3JDYWxsYmFjayA9IHBDYWxsYmFjazsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBIQUxfU1dQTUlfTVNQSU5JVF9DQl9JRCA6CiAgICAgICAgaHN3cG1pLT5Nc3BJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgSEFMX1NXUE1JX01TUERFSU5JVF9DQl9JRCA6CiAgICAgICAgaHN3cG1pLT5Nc3BEZUluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKICAgICAgICBicmVhazsKICAgICAgZGVmYXVsdCA6CiAgICAgICAgLyogdXBkYXRlIHRoZSBlcnJvciBjb2RlICovCiAgICAgICAgaHN3cG1pLT5FcnJvckNvZGUgfD0gSEFMX1NXUE1JX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CiAgICAgICAgLyogdXBkYXRlIHJldHVybiBzdGF0dXMgKi8KICAgICAgICBzdGF0dXMgPSBIQUxfRVJST1I7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIGVsc2UgaWYoaHN3cG1pLT5TdGF0ZSA9PSBIQUxfU1dQTUlfU1RBVEVfUkVTRVQpCiAgICB7CiAgICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkKICAgICAgewogICAgICBjYXNlIEhBTF9TV1BNSV9NU1BJTklUX0NCX0lEIDoKICAgICAgICBoc3dwbWktPk1zcEluaXRDYWxsYmFjayA9IHBDYWxsYmFjazsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBIQUxfU1dQTUlfTVNQREVJTklUX0NCX0lEIDoKICAgICAgICBoc3dwbWktPk1zcERlSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOwogICAgICAgIGJyZWFrOwogICAgICBkZWZhdWx0IDoKICAgICAgICAvKiB1cGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KICAgICAgICBoc3dwbWktPkVycm9yQ29kZSB8PSBIQUxfU1dQTUlfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKICAgICAgICAvKiB1cGRhdGUgcmV0dXJuIHN0YXR1cyAqLwogICAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgZWxzZQogICAgewogICAgICAvKiB1cGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KICAgICAgaHN3cG1pLT5FcnJvckNvZGUgfD0gSEFMX1NXUE1JX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CiAgICAgIC8qIHVwZGF0ZSByZXR1cm4gc3RhdHVzICovCiAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKICAgIH0KICB9CiAgcmV0dXJuIHN0YXR1czsKfQoKLyoqCiAgKiBAYnJpZWYgIFVucmVnaXN0ZXIgYSB1c2VyIFNXUE1JIGNhbGxiYWNrLgogICogICAgICAgICBTV1BNSSBjYWxsYmFjayBpcyByZWRpcmVjdGVkIHRvIHRoZSB3ZWFrIHByZWRlZmluZWQgY2FsbGJhY2suCiAgKiBAcGFyYW0gIGhzd3BtaSBTV1BNSSBoYW5kbGUuCiAgKiBAcGFyYW0gIENhbGxiYWNrSUQgSUQgb2YgdGhlIGNhbGxiYWNrIHRvIGJlIHVucmVnaXN0ZXJlZC4KICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1NXUE1JX1JYX0NPTVBMRVRFX0NCX0lEIHJlY2VpdmUgY29tcGxldGUgY2FsbGJhY2sgSUQuCiAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9TV1BNSV9SWF9IQUxGQ09NUExFVEVfQ0JfSUQgcmVjZWl2ZSBoYWxmIGNvbXBsZXRlIGNhbGxiYWNrIElELgogICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfU1dQTUlfVFhfQ09NUExFVEVfQ0JfSUQgdHJhbnNtaXQgY29tcGxldGUgY2FsbGJhY2sgSUQuCiAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9TV1BNSV9UWF9IQUxGQ09NUExFVEVfQ0JfSUQgdHJhbnNtaXQgaGFsZiBjb21wbGV0ZSBjYWxsYmFjayBJRC4KICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1NXUE1JX0VSUk9SX0NCX0lEIGVycm9yIGNhbGxiYWNrIElELgogICogICAgICAgICAgIEBhcmcgQHJlZiBIQUxfU1dQTUlfTVNQSU5JVF9DQl9JRCBNU1AgaW5pdCBjYWxsYmFjayBJRC4KICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1NXUE1JX01TUERFSU5JVF9DQl9JRCBNU1AgZGUtaW5pdCBjYWxsYmFjayBJRC4KICAqIEByZXR2YWwgSEFMIHN0YXR1cy4KICAqLwpIQUxfU3RhdHVzVHlwZURlZiBIQUxfU1dQTUlfVW5SZWdpc3RlckNhbGxiYWNrKFNXUE1JX0hhbmRsZVR5cGVEZWYgICAgICAgICpoc3dwbWksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9TV1BNSV9DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lEKQp7CiAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOwoKICBpZihoc3dwbWktPlN0YXRlID09IEhBTF9TV1BNSV9TVEFURV9SRUFEWSkKICB7CiAgICBzd2l0Y2ggKENhbGxiYWNrSUQpCiAgICB7CiAgICBjYXNlIEhBTF9TV1BNSV9SWF9DT01QTEVURV9DQl9JRCA6CiAgICAgIGhzd3BtaS0+UnhDcGx0Q2FsbGJhY2sgPSBIQUxfU1dQTUlfUnhDcGx0Q2FsbGJhY2s7CiAgICAgIGJyZWFrOwogICAgY2FzZSBIQUxfU1dQTUlfUlhfSEFMRkNPTVBMRVRFX0NCX0lEIDoKICAgICAgaHN3cG1pLT5SeEhhbGZDcGx0Q2FsbGJhY2sgPSBIQUxfU1dQTUlfUnhIYWxmQ3BsdENhbGxiYWNrOwogICAgICBicmVhazsKICAgIGNhc2UgSEFMX1NXUE1JX1RYX0NPTVBMRVRFX0NCX0lEIDoKICAgICAgaHN3cG1pLT5UeENwbHRDYWxsYmFjayA9IEhBTF9TV1BNSV9UeENwbHRDYWxsYmFjazsKICAgICAgYnJlYWs7CiAgICBjYXNlIEhBTF9TV1BNSV9UWF9IQUxGQ09NUExFVEVfQ0JfSUQgOgogICAgICBoc3dwbWktPlR4SGFsZkNwbHRDYWxsYmFjayA9IEhBTF9TV1BNSV9UeEhhbGZDcGx0Q2FsbGJhY2s7CiAgICAgIGJyZWFrOwogICAgY2FzZSBIQUxfU1dQTUlfRVJST1JfQ0JfSUQgOgogICAgICBoc3dwbWktPkVycm9yQ2FsbGJhY2sgPSBIQUxfU1dQTUlfRXJyb3JDYWxsYmFjazsKICAgICAgYnJlYWs7CiAgICBjYXNlIEhBTF9TV1BNSV9NU1BJTklUX0NCX0lEIDoKICAgICAgaHN3cG1pLT5Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfU1dQTUlfTXNwSW5pdDsKICAgICAgYnJlYWs7CiAgICBjYXNlIEhBTF9TV1BNSV9NU1BERUlOSVRfQ0JfSUQgOgogICAgICBoc3dwbWktPk1zcERlSW5pdENhbGxiYWNrID0gSEFMX1NXUE1JX01zcERlSW5pdDsKICAgICAgYnJlYWs7CiAgICBkZWZhdWx0IDoKICAgICAgLyogdXBkYXRlIHRoZSBlcnJvciBjb2RlICovCiAgICAgIGhzd3BtaS0+RXJyb3JDb2RlIHw9IEhBTF9TV1BNSV9FUlJPUl9JTlZBTElEX0NBTExCQUNLOwogICAgICAvKiB1cGRhdGUgcmV0dXJuIHN0YXR1cyAqLwogICAgICBzdGF0dXMgPSBIQUxfRVJST1I7CiAgICAgIGJyZWFrOwogICAgfQogIH0KICBlbHNlIGlmKGhzd3BtaS0+U3RhdGUgPT0gSEFMX1NXUE1JX1NUQVRFX1JFU0VUKQogIHsKICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkKICAgIHsKICAgIGNhc2UgSEFMX1NXUE1JX01TUElOSVRfQ0JfSUQgOgogICAgICBoc3dwbWktPk1zcEluaXRDYWxsYmFjayA9IEhBTF9TV1BNSV9Nc3BJbml0OwogICAgICBicmVhazsKICAgIGNhc2UgSEFMX1NXUE1JX01TUERFSU5JVF9DQl9JRCA6CiAgICAgIGhzd3BtaS0+TXNwRGVJbml0Q2FsbGJhY2sgPSBIQUxfU1dQTUlfTXNwRGVJbml0OwogICAgICBicmVhazsKICAgIGRlZmF1bHQgOgogICAgICAvKiB1cGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KICAgICAgaHN3cG1pLT5FcnJvckNvZGUgfD0gSEFMX1NXUE1JX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CiAgICAgIC8qIHVwZGF0ZSByZXR1cm4gc3RhdHVzICovCiAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKICAgICAgYnJlYWs7CiAgICB9CiAgfQogIGVsc2UKICB7CiAgICAvKiB1cGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KICAgIGhzd3BtaS0+RXJyb3JDb2RlIHw9IEhBTF9TV1BNSV9FUlJPUl9JTlZBTElEX0NBTExCQUNLOwogICAgLyogdXBkYXRlIHJldHVybiBzdGF0dXMgKi8KICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKICB9CiAgcmV0dXJuIHN0YXR1czsKfQojZW5kaWYgLyogVVNFX0hBTF9TV1BNSV9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KCi8qKgogICogQH0KICAqLwoKLyoqIEBkZWZncm91cCBTV1BNSV9FeHBvcnRlZF9Hcm91cDIgSU8gb3BlcmF0aW9uIG1ldGhvZHMKICAqICBAYnJpZWYgU1dQTUkgVHJhbnNtaXQvUmVjZWl2ZSBmdW5jdGlvbnMKICAqCkB2ZXJiYXRpbQogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSU8gb3BlcmF0aW9uIG1ldGhvZHMgIyMjIyMKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIFsuLl0KICAgIFRoaXMgc3Vic2VjdGlvbiBwcm92aWRlcyBhIHNldCBvZiBmdW5jdGlvbnMgYWxsb3dpbmcgdG8gbWFuYWdlIHRoZSBTV1BNSQogICAgIGRhdGEgdHJhbnNmZXJzLgoKICAgICgjKSBUaGVyZSBhcmUgdHdvIG1vZGVzIG9mIHRyYW5zZmVyOgogICAgICAgKCsrKSBCbG9ja2luZyBtb2RlOiBUaGUgY29tbXVuaWNhdGlvbiBpcyBwZXJmb3JtZWQgaW4gcG9sbGluZyBtb2RlLgogICAgICAgICAgICBUaGUgSEFMIHN0YXR1cyBvZiBhbGwgZGF0YSBwcm9jZXNzaW5nIGlzIHJldHVybmVkIGJ5IHRoZSBzYW1lIGZ1bmN0aW9uCiAgICAgICAgICAgIGFmdGVyIGZpbmlzaGluZyB0cmFuc2Zlci4KICAgICAgICgrKykgTm9uLUJsb2NraW5nIG1vZGU6IFRoZSBjb21tdW5pY2F0aW9uIGlzIHBlcmZvcm1lZCB1c2luZyBJbnRlcnJ1cHRzCiAgICAgICAgICAgb3IgRE1BLiBUaGUgZW5kIG9mIHRoZSBkYXRhIHByb2Nlc3Npbmcgd2lsbCBiZSBpbmRpY2F0ZWQgdGhyb3VnaCB0aGUKICAgICAgICAgICBkZWRpY2F0ZWQgU1dQTUkgSW50ZXJydXB0IGhhbmRsZXIgKEhBTF9TV1BNSV9JUlFIYW5kbGVyKCkpIHdoZW4gdXNpbmcgSW50ZXJydXB0IG1vZGUgb3IKICAgICAgICAgICB0aGUgc2VsZWN0ZWQgRE1BIGNoYW5uZWwgaW50ZXJydXB0IGhhbmRsZXIgd2hlbiB1c2luZyBETUEgbW9kZS4KICAgICAgICAgICBUaGUgSEFMX1NXUE1JX1R4Q3BsdENhbGxiYWNrKCksIEhBTF9TV1BNSV9SeENwbHRDYWxsYmFjaygpIHVzZXIgY2FsbGJhY2tzCiAgICAgICAgICAgd2lsbCBiZSBleGVjdXRlZCByZXNwZWN0aXZlbHkgYXQgdGhlIGVuZCBvZiB0aGUgdHJhbnNtaXQgb3IgcmVjZWl2ZSBwcm9jZXNzLgogICAgICAgICAgIFRoZSBIQUxfU1dQTUlfRXJyb3JDYWxsYmFjaygpIHVzZXIgY2FsbGJhY2sgd2lsbCBiZSBleGVjdXRlZCB3aGVuIGEgY29tbXVuaWNhdGlvbiBlcnJvciBpcyBkZXRlY3RlZC4KCiAgICAoIykgQmxvY2tpbmcgbW9kZSBBUEkncyBhcmU6CiAgICAgICAgKCsrKSBIQUxfU1dQTUlfVHJhbnNtaXQoKQogICAgICAgICgrKykgSEFMX1NXUE1JX1JlY2VpdmUoKQoKICAgICgjKSBOb24tQmxvY2tpbmcgbW9kZSBBUEkncyB3aXRoIEludGVycnVwdCBhcmU6CiAgICAgICAgKCsrKSBIQUxfU1dQTUlfVHJhbnNtaXRfSVQoKQogICAgICAgICgrKykgSEFMX1NXUE1JX1JlY2VpdmVfSVQoKQogICAgICAgICgrKykgSEFMX1NXUE1JX0lSUUhhbmRsZXIoKQoKICAgICgjKSBOb24tQmxvY2tpbmcgbW9kZSBBUEkncyB3aXRoIERNQSBhcmU6CiAgICAgICAgKCsrKSBIQUxfU1dQTUlfVHJhbnNtaXRfRE1BKCkKICAgICAgICAoKyspIEhBTF9TV1BNSV9SZWNlaXZlX0RNQSgpCiAgICAgICAgKCsrKSBIQUxfU1dQTUlfRE1BUGF1c2UoKQogICAgICAgICgrKykgSEFMX1NXUE1JX0RNQVJlc3VtZSgpCiAgICAgICAgKCsrKSBIQUxfU1dQTUlfRE1BU3RvcCgpCgogICAgKCMpIEEgc2V0IG9mIFRyYW5zZmVyIENvbXBsZXRlIENhbGxiYWNrcyBhcmUgcHJvdmlkZWQgaW4gTm9uLUJsb2NraW5nIG1vZGU6CiAgICAgICAgKCsrKSBIQUxfU1dQTUlfVHhIYWxmQ3BsdENhbGxiYWNrKCkKICAgICAgICAoKyspIEhBTF9TV1BNSV9UeENwbHRDYWxsYmFjaygpCiAgICAgICAgKCsrKSBIQUxfU1dQTUlfUnhIYWxmQ3BsdENhbGxiYWNrKCkKICAgICAgICAoKyspIEhBTF9TV1BNSV9SeENwbHRDYWxsYmFjaygpCiAgICAgICAgKCsrKSBIQUxfU1dQTUlfRXJyb3JDYWxsYmFjaygpCgogICAgKCMpIFRoZSBjYXBhYmlsaXR5IHRvIGxhdW5jaCB0aGUgYWJvdmUgSU8gb3BlcmF0aW9ucyBpbiBsb29wYmFjayBtb2RlIGZvcgogICAgICAgIHVzZXIgYXBwbGljYXRpb24gdmVyaWZpY2F0aW9uOgogICAgICAgICgrKykgSEFMX1NXUE1JX0VuYWJsZUxvb3BiYWNrKCkKICAgICAgICAoKyspIEhBTF9TV1BNSV9EaXNhYmxlTG9vcGJhY2soKQoKQGVuZHZlcmJhdGltCiAgKiBAewogICovCgovKioKICAqIEBicmllZiAgVHJhbnNtaXQgYW4gYW1vdW50IG9mIGRhdGEgaW4gYmxvY2tpbmcgbW9kZS4KICAqIEBwYXJhbSAgaHN3cG1pIHBvaW50ZXIgdG8gYSBTV1BNSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCiAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1dQTUkgbW9kdWxlLgogICogQHBhcmFtICBwRGF0YSBQb2ludGVyIHRvIGRhdGEgYnVmZmVyCiAgKiBAcGFyYW0gIFNpemUgQW1vdW50IG9mIGRhdGEgdG8gYmUgc2VudAogICogQHBhcmFtICBUaW1lb3V0IFRpbWVvdXQgZHVyYXRpb24KICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICovCkhBTF9TdGF0dXNUeXBlRGVmIEhBTF9TV1BNSV9UcmFuc21pdChTV1BNSV9IYW5kbGVUeXBlRGVmICpoc3dwbWksIHVpbnQzMl90KiBwRGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgVGltZW91dCkKewogIHVpbnQzMl90IHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CiAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOwogIEhBTF9TV1BNSV9TdGF0ZVR5cGVEZWYgdG1wX3N0YXRlOwogIHVpbnQzMl90ICpwdG1wX2RhdGE7CiAgdWludDMyX3QgdG1wX3NpemU7CgogIGlmKChwRGF0YSA9PSBOVUxMICkgfHwgKFNpemUgPT0gMFUpKQogIHsKICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKICB9CiAgZWxzZQogIHsKICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCiAgICBfX0hBTF9MT0NLKGhzd3BtaSk7CgogICAgdG1wX3N0YXRlID0gaHN3cG1pLT5TdGF0ZTsKICAgIGlmKCh0bXBfc3RhdGUgPT0gSEFMX1NXUE1JX1NUQVRFX1JFQURZKSB8fCAodG1wX3N0YXRlID09IEhBTF9TV1BNSV9TVEFURV9CVVNZX1JYKSkKICAgIHsKICAgICAgLyogQ2hlY2sgaWYgYSBub24tYmxvY2tpbmcgcmVjZWl2ZSBwcm9jZXNzIGlzIG9uZ29pbmcgb3Igbm90ICovCiAgICAgIGlmKHRtcF9zdGF0ZSA9PSBIQUxfU1dQTUlfU1RBVEVfUkVBRFkpCiAgICAgIHsKICAgICAgICBoc3dwbWktPlN0YXRlID0gSEFMX1NXUE1JX1NUQVRFX0JVU1lfVFg7CgogICAgICAgIC8qIERpc2FibGUgYW55IHRyYW5zbWl0dGVyIGludGVycnVwdHMgKi8KICAgICAgICBfX0hBTF9TV1BNSV9ESVNBQkxFX0lUKGhzd3BtaSwgU1dQTUlfSVRfVENJRSB8IFNXUE1JX0lUX1RJRSB8IFNXUE1JX0lUX1RYVU5SSUUgfCBTV1BNSV9JVF9UWEJFSUUpOwoKICAgICAgICAvKiBEaXNhYmxlIGFueSB0cmFuc21pdHRlciBmbGFncyAqLwogICAgICAgIF9fSEFMX1NXUE1JX0NMRUFSX0ZMQUcoaHN3cG1pLCBTV1BNSV9GTEFHX1RYQkVGIHwgU1dQTUlfRkxBR19UWFVOUkYgfCBTV1BNSV9GTEFHX1RDRik7CgogICAgICAgIC8qIEVuYWJsZSBTV1BNSSBwZXJpcGhlcmFsIGlmIG5vdCAqLwogICAgICAgIFNFVF9CSVQoaHN3cG1pLT5JbnN0YW5jZS0+Q1IsIFNXUE1JX0NSX1NXUEFDVCk7CiAgICAgIH0KICAgICAgZWxzZQogICAgICB7CiAgICAgICAgaHN3cG1pLT5TdGF0ZSA9IEhBTF9TV1BNSV9TVEFURV9CVVNZX1RYX1JYOwogICAgICB9CgogICAgICBwdG1wX2RhdGEgPSBwRGF0YTsKICAgICAgdG1wX3NpemUgPSBTaXplOwogICAgICBkbwogICAgICB7CiAgICAgICAgLyogV2FpdCB0aGUgVFhFIHRvIHdyaXRlIGRhdGEgKi8KICAgICAgICBpZihIQUxfSVNfQklUX1NFVChoc3dwbWktPkluc3RhbmNlLT5JU1IsIFNXUE1JX0ZMQUdfVFhFKSkKICAgICAgICB7CiAgICAgICAgICBoc3dwbWktPkluc3RhbmNlLT5URFIgPSAqcHRtcF9kYXRhOwogICAgICAgICAgcHRtcF9kYXRhKys7CiAgICAgICAgICB0bXBfc2l6ZS0tOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgLyogQ2hlY2sgZm9yIHRoZSBUaW1lb3V0ICovCiAgICAgICAgICBpZihUaW1lb3V0ICE9IEhBTF9NQVhfREVMQVkpCiAgICAgICAgICB7CiAgICAgICAgICAgIGlmKCgoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCkgPiBUaW1lb3V0KSB8fCAoVGltZW91dCA9PSAwVSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICBzdGF0dXMgPSBIQUxfVElNRU9VVDsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSB3aGlsZSh0bXBfc2l6ZSAhPSAwVSk7CgogICAgICAvKiBXYWl0IG9uIFRYQkVGIGZsYWcgdG8gYmUgYWJsZSB0byBzdGFydCBhIHNlY29uZCB0cmFuc2ZlciAqLwogICAgICBpZihTV1BNSV9XYWl0T25GbGFnU2V0VW50aWxUaW1lb3V0KGhzd3BtaSwgU1dQTUlfRkxBR19UWEJFRiwgdGlja3N0YXJ0LCBUaW1lb3V0KSAhPSBIQUxfT0spCiAgICAgIHsKICAgICAgICAvKiBUaW1lb3V0IG9jY3VycmVkICovCiAgICAgICAgaHN3cG1pLT5FcnJvckNvZGUgfD0gSEFMX1NXUE1JX0VSUk9SX1RYQkVGX1RJTUVPVVQ7CgogICAgICAgIHN0YXR1cyA9IEhBTF9USU1FT1VUOwogICAgICB9CgogICAgICBpZihzdGF0dXMgPT0gSEFMX09LKQogICAgICB7CiAgICAgICAgLyogQ2hlY2sgaWYgYSBub24tYmxvY2tpbmcgcmVjZWl2ZSBQcm9jZXNzIGlzIG9uZ29pbmcgb3Igbm90ICovCiAgICAgICAgaWYoaHN3cG1pLT5TdGF0ZSA9PSBIQUxfU1dQTUlfU1RBVEVfQlVTWV9UWF9SWCkKICAgICAgICB7CiAgICAgICAgICBoc3dwbWktPlN0YXRlID0gSEFMX1NXUE1JX1NUQVRFX0JVU1lfUlg7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICBoc3dwbWktPlN0YXRlID0gSEFMX1NXUE1JX1NUQVRFX1JFQURZOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgZWxzZQogICAgewogICAgICBzdGF0dXMgPSBIQUxfQlVTWTsKICAgIH0KICB9CgogIGlmKChzdGF0dXMgIT0gSEFMX09LKSAmJiAoc3RhdHVzICE9IEhBTF9CVVNZKSkKICB7CiAgICBoc3dwbWktPlN0YXRlID0gSEFMX1NXUE1JX1NUQVRFX1JFQURZOwogIH0KICAvKiBQcm9jZXNzIFVubG9ja2VkICovCiAgX19IQUxfVU5MT0NLKGhzd3BtaSk7CgogIHJldHVybiBzdGF0dXM7Cn0KCi8qKgogICogQGJyaWVmICBSZWNlaXZlIGFuIGFtb3VudCBvZiBkYXRhIGluIGJsb2NraW5nIG1vZGUuCiAgKiBAcGFyYW0gIGhzd3BtaSBwb2ludGVyIHRvIGEgU1dQTUlfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucwogICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNXUE1JIG1vZHVsZS4KICAqIEBwYXJhbSAgcERhdGEgUG9pbnRlciB0byBkYXRhIGJ1ZmZlcgogICogQHBhcmFtICBTaXplIEFtb3VudCBvZiBkYXRhIHRvIGJlIHJlY2VpdmVkCiAgKiBAcGFyYW0gIFRpbWVvdXQgVGltZW91dCBkdXJhdGlvbgogICogQHJldHZhbCBIQUwgc3RhdHVzCiAgKi8KSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NXUE1JX1JlY2VpdmUoU1dQTUlfSGFuZGxlVHlwZURlZiAqaHN3cG1pLCB1aW50MzJfdCAqcERhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQzMl90IFRpbWVvdXQpCnsKICB1aW50MzJfdCB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOwogIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKICBIQUxfU1dQTUlfU3RhdGVUeXBlRGVmIHRtcF9zdGF0ZTsKICB1aW50MzJfdCAqcHRtcF9kYXRhOwogIHVpbnQzMl90IHRtcF9zaXplOwoKICBpZigocERhdGEgPT0gTlVMTCApIHx8IChTaXplID09IDBVKSkKICB7CiAgICBzdGF0dXMgPSBIQUxfRVJST1I7CiAgfQogIGVsc2UKICB7CiAgICAvKiBQcm9jZXNzIExvY2tlZCAqLwogICAgX19IQUxfTE9DSyhoc3dwbWkpOwoKICAgIHRtcF9zdGF0ZSA9IGhzd3BtaS0+U3RhdGU7CiAgICBpZigodG1wX3N0YXRlID09IEhBTF9TV1BNSV9TVEFURV9SRUFEWSkgfHwgKHRtcF9zdGF0ZSA9PSBIQUxfU1dQTUlfU1RBVEVfQlVTWV9UWCkpCiAgICB7CiAgICAgIC8qIENoZWNrIGlmIGEgbm9uLWJsb2NraW5nIHRyYW5zbWl0IHByb2Nlc3MgaXMgb25nb2luZyBvciBub3QgKi8KICAgICAgaWYodG1wX3N0YXRlID09IEhBTF9TV1BNSV9TVEFURV9SRUFEWSkKICAgICAgewogICAgICAgIGhzd3BtaS0+U3RhdGUgPSBIQUxfU1dQTUlfU1RBVEVfQlVTWV9SWDsKCiAgICAgICAgLyogRGlzYWJsZSBhbnkgcmVjZWl2ZXIgaW50ZXJydXB0cyAqLwogICAgICAgIENMRUFSX0JJVChoc3dwbWktPkluc3RhbmNlLT5JRVIsIFNXUE1JX0lUX1NSSUUgfCBTV1BNSV9JVF9SSUUgfCBTV1BNSV9JVF9SWEJFUklFIHwgU1dQTUlfSVRfUlhPVlJJRSB8IFNXUE1JX0lUX1JYQkZJRSk7CgogICAgICAgIC8qIEVuYWJsZSBTV1BNSSBwZXJpcGhlcmFsIGlmIG5vdCAqLwogICAgICAgIFNFVF9CSVQoaHN3cG1pLT5JbnN0YW5jZS0+Q1IsIFNXUE1JX0NSX1NXUEFDVCk7CiAgICAgIH0KICAgICAgZWxzZQogICAgICB7CiAgICAgICAgaHN3cG1pLT5TdGF0ZSA9IEhBTF9TV1BNSV9TVEFURV9CVVNZX1RYX1JYOwogICAgICB9CgogICAgICBwdG1wX2RhdGEgPSBwRGF0YTsKICAgICAgdG1wX3NpemUgPSBTaXplOwogICAgICBkbwogICAgICB7CiAgICAgICAgLyogV2FpdCB0aGUgUlhORSB0byByZWFkIGRhdGEgKi8KICAgICAgICBpZihIQUxfSVNfQklUX1NFVChoc3dwbWktPkluc3RhbmNlLT5JU1IsIFNXUE1JX0ZMQUdfUlhORSkpCiAgICAgICAgewogICAgICAgICAgKnB0bXBfZGF0YSA9IGhzd3BtaS0+SW5zdGFuY2UtPlJEUjsKICAgICAgICAgIHB0bXBfZGF0YSsrOwogICAgICAgICAgdG1wX3NpemUtLTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgIC8qIENoZWNrIGZvciB0aGUgVGltZW91dCAqLwogICAgICAgICAgaWYoVGltZW91dCAhPSBIQUxfTUFYX0RFTEFZKQogICAgICAgICAgewogICAgICAgICAgICBpZigoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gVGltZW91dCkgfHwgKFRpbWVvdXQgPT0gMFUpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgc3RhdHVzID0gSEFMX1RJTUVPVVQ7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0gd2hpbGUodG1wX3NpemUgIT0gMFUpOwoKICAgICAgaWYoc3RhdHVzID09IEhBTF9PSykKICAgICAgewogICAgICAgIGlmKEhBTF9JU19CSVRfU0VUKGhzd3BtaS0+SW5zdGFuY2UtPklTUiwgU1dQTUlfRkxBR19SWEJGRikpCiAgICAgICAgewogICAgICAgICAgLyogQ2xlYXIgUlhCRkYgYXQgZW5kIG9mIHJlY2VwdGlvbiAqLwogICAgICAgICAgV1JJVEVfUkVHKGhzd3BtaS0+SW5zdGFuY2UtPklDUiwgU1dQTUlfRkxBR19SWEJGRik7CiAgICAgICAgfQoKICAgICAgICAvKiBDaGVjayBpZiBhIG5vbi1ibG9ja2luZyB0cmFuc21pdCBQcm9jZXNzIGlzIG9uZ29pbmcgb3Igbm90ICovCiAgICAgICAgaWYoaHN3cG1pLT5TdGF0ZSA9PSBIQUxfU1dQTUlfU1RBVEVfQlVTWV9UWF9SWCkKICAgICAgICB7CiAgICAgICAgICBoc3dwbWktPlN0YXRlID0gSEFMX1NXUE1JX1NUQVRFX0JVU1lfVFg7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICBoc3dwbWktPlN0YXRlID0gSEFMX1NXUE1JX1NUQVRFX1JFQURZOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgZWxzZQogICAgewogICAgICBzdGF0dXMgPSBIQUxfQlVTWTsKICAgIH0KICB9CgogIGlmKChzdGF0dXMgIT0gSEFMX09LKSAmJiAoc3RhdHVzICE9IEhBTF9CVVNZKSkKICB7CiAgICBoc3dwbWktPlN0YXRlID0gSEFMX1NXUE1JX1NUQVRFX1JFQURZOwogIH0KICAvKiBQcm9jZXNzIFVubG9ja2VkICovCiAgX19IQUxfVU5MT0NLKGhzd3BtaSk7CgogIHJldHVybiBzdGF0dXM7Cn0KCi8qKgogICogQGJyaWVmICBUcmFuc21pdCBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSB3aXRoIGludGVycnVwdC4KICAqIEBwYXJhbSAgaHN3cG1pIHBvaW50ZXIgdG8gYSBTV1BNSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCiAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1dQTUkgbW9kdWxlLgogICogQHBhcmFtICBwRGF0YSBQb2ludGVyIHRvIGRhdGEgYnVmZmVyCiAgKiBAcGFyYW0gIFNpemUgQW1vdW50IG9mIGRhdGEgdG8gYmUgc2VudAogICogQHJldHZhbCBIQUwgc3RhdHVzCiAgKi8KSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NXUE1JX1RyYW5zbWl0X0lUKFNXUE1JX0hhbmRsZVR5cGVEZWYgKmhzd3BtaSwgdWludDMyX3QgKnBEYXRhLCB1aW50MTZfdCBTaXplKQp7CiAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOwogIEhBTF9TV1BNSV9TdGF0ZVR5cGVEZWYgdG1wX3N0YXRlOwoKICBpZigocERhdGEgPT0gTlVMTCApIHx8IChTaXplID09IDBVKSkKICB7CiAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOwogIH0KICBlbHNlCiAgewogICAgLyogUHJvY2VzcyBMb2NrZWQgKi8KICAgIF9fSEFMX0xPQ0soaHN3cG1pKTsKCiAgICB0bXBfc3RhdGUgPSBoc3dwbWktPlN0YXRlOwogICAgaWYoKHRtcF9zdGF0ZSA9PSBIQUxfU1dQTUlfU1RBVEVfUkVBRFkpIHx8ICh0bXBfc3RhdGUgPT0gSEFMX1NXUE1JX1NUQVRFX0JVU1lfUlgpKQogICAgewogICAgICAvKiBVcGRhdGUgaGFuZGxlICovCiAgICAgIGhzd3BtaS0+cFR4QnVmZlB0ciA9IHBEYXRhOwogICAgICBoc3dwbWktPlR4WGZlclNpemUgPSBTaXplOwogICAgICBoc3dwbWktPlR4WGZlckNvdW50ID0gU2l6ZTsKICAgICAgaHN3cG1pLT5FcnJvckNvZGUgPSBIQUxfU1dQTUlfRVJST1JfTk9ORTsKCiAgICAgIC8qIENoZWNrIGlmIGEgcmVjZWl2ZSBwcm9jZXNzIGlzIG9uZ29pbmcgb3Igbm90ICovCiAgICAgIGlmKHRtcF9zdGF0ZSA9PSBIQUxfU1dQTUlfU1RBVEVfUkVBRFkpCiAgICAgIHsKICAgICAgICBoc3dwbWktPlN0YXRlID0gSEFMX1NXUE1JX1NUQVRFX0JVU1lfVFg7CgogICAgICAgIC8qIEVuYWJsZSBTV1BNSSBwZXJpcGhlcmFsIGlmIG5vdCAqLwogICAgICAgIFNFVF9CSVQoaHN3cG1pLT5JbnN0YW5jZS0+Q1IsIFNXUE1JX0NSX1NXUEFDVCk7CiAgICAgIH0KICAgICAgZWxzZQogICAgICB7CiAgICAgICAgaHN3cG1pLT5TdGF0ZSA9IEhBTF9TV1BNSV9TVEFURV9CVVNZX1RYX1JYOwogICAgICB9CgogICAgICAvKiBFbmFibGUgdGhlIFNXUE1JIHRyYW5zbWl0IHVuZGVycnVuIGVycm9yICovCiAgICAgIF9fSEFMX1NXUE1JX0VOQUJMRV9JVChoc3dwbWksIFNXUE1JX0lUX1RYVU5SSUUpOwoKICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLwogICAgICBfX0hBTF9VTkxPQ0soaHN3cG1pKTsKCiAgICAgIC8qIEVuYWJsZSB0aGUgU1dQTUkgaW50ZXJydXB0czogICAgICAqLwogICAgICAvKiAtIFRyYW5zbWl0IGRhdGEgcmVnaXN0ZXIgZW1wdHkgICAgKi8KICAgICAgLyogLSBUcmFuc21pdCBidWZmZXIgZW1wdHkgICAgICAgICAgICovCiAgICAgIC8qIC0gVHJhbnNtaXQvUmVjZXB0aW9uIGNvbXBsZXRpb24gICAqLwogICAgICBfX0hBTF9TV1BNSV9FTkFCTEVfSVQoaHN3cG1pLCBTV1BNSV9JVF9USUUgfCBTV1BNSV9JVF9UWEJFSUUgfCBTV1BNSV9JVF9UQ0lFKTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgc3RhdHVzID0gIEhBTF9CVVNZOwoKICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLwogICAgICBfX0hBTF9VTkxPQ0soaHN3cG1pKTsKICAgIH0KICB9CgogIHJldHVybiBzdGF0dXM7Cn0KCi8qKgogICogQGJyaWVmICBSZWNlaXZlIGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlIHdpdGggaW50ZXJydXB0LgogICogQHBhcmFtICBoc3dwbWkgU1dQTUkgaGFuZGxlCiAgKiBAcGFyYW0gIHBEYXRhIFBvaW50ZXIgdG8gZGF0YSBidWZmZXIKICAqIEBwYXJhbSAgU2l6ZSBBbW91bnQgb2YgZGF0YSB0byBiZSByZWNlaXZlZAogICogQHJldHZhbCBIQUwgc3RhdHVzCiAgKi8KSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NXUE1JX1JlY2VpdmVfSVQoU1dQTUlfSGFuZGxlVHlwZURlZiAqaHN3cG1pLCB1aW50MzJfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpCnsKICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CiAgSEFMX1NXUE1JX1N0YXRlVHlwZURlZiB0bXBfc3RhdGU7CgogIGlmKChwRGF0YSA9PSBOVUxMICkgfHwgKFNpemUgPT0gMFUpKQogIHsKICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CiAgfQogIGVsc2UKICB7CiAgICAvKiBQcm9jZXNzIExvY2tlZCAqLwogICAgX19IQUxfTE9DSyhoc3dwbWkpOwoKICAgIHRtcF9zdGF0ZSA9IGhzd3BtaS0+U3RhdGU7CiAgICBpZigodG1wX3N0YXRlID09IEhBTF9TV1BNSV9TVEFURV9SRUFEWSkgfHwgKHRtcF9zdGF0ZSA9PSBIQUxfU1dQTUlfU1RBVEVfQlVTWV9UWCkpCiAgICB7CiAgICAgIC8qIFVwZGF0ZSBoYW5kbGUgKi8KICAgICAgaHN3cG1pLT5wUnhCdWZmUHRyID0gcERhdGE7CiAgICAgIGhzd3BtaS0+UnhYZmVyU2l6ZSA9IFNpemU7CiAgICAgIGhzd3BtaS0+UnhYZmVyQ291bnQgPSBTaXplOwogICAgICBoc3dwbWktPkVycm9yQ29kZSA9IEhBTF9TV1BNSV9FUlJPUl9OT05FOwoKICAgICAgLyogQ2hlY2sgaWYgYSB0cmFuc21pdCBwcm9jZXNzIGlzIG9uZ29pbmcgb3Igbm90ICovCiAgICAgIGlmKHRtcF9zdGF0ZSA9PSBIQUxfU1dQTUlfU1RBVEVfUkVBRFkpCiAgICAgIHsKICAgICAgICBoc3dwbWktPlN0YXRlID0gSEFMX1NXUE1JX1NUQVRFX0JVU1lfUlg7CgogICAgICAgIC8qIEVuYWJsZSBTV1BNSSBwZXJpcGhlcmFsIGlmIG5vdCAqLwogICAgICAgIFNFVF9CSVQoaHN3cG1pLT5JbnN0YW5jZS0+Q1IsIFNXUE1JX0NSX1NXUEFDVCk7CiAgICAgIH0KICAgICAgZWxzZQogICAgICB7CiAgICAgICAgaHN3cG1pLT5TdGF0ZSA9IEhBTF9TV1BNSV9TVEFURV9CVVNZX1RYX1JYOwogICAgICB9CgogICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCiAgICAgIF9fSEFMX1VOTE9DSyhoc3dwbWkpOwoKICAgICAgLyogRW5hYmxlIHRoZSBTV1BNSSBzbGF2ZSByZXN1bWUgKi8KICAgICAgLyogRW5hYmxlIHRoZSBTV1BNSSBEYXRhIFJlZ2lzdGVyIG5vdCBlbXB0eSBJbnRlcnJ1cHQsIHJlY2VpdmUgQ1JDIEVycm9yLCByZWNlaXZlIG92ZXJydW4gYW5kIFJ4QnVmIEludGVycnVwdCAqLwogICAgICAvKiAgRW5hYmxlIHRoZSBTV1BNSSBUcmFuc21pdC9SZWNlcHRpb24gY29tcGxldGlvbiAgICovCiAgICAgIF9fSEFMX1NXUE1JX0VOQUJMRV9JVChoc3dwbWksIFNXUE1JX0lUX1JJRSB8IFNXUE1JX0lUX1JYQkVSSUUgfCBTV1BNSV9JVF9SWE9WUklFIHwgU1dQTUlfSVRfUlhCRklFKTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgc3RhdHVzID0gSEFMX0JVU1k7CgogICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCiAgICAgIF9fSEFMX1VOTE9DSyhoc3dwbWkpOwogICAgfQogIH0KCiAgcmV0dXJuIHN0YXR1czsKfQoKLyoqCiAgKiBAYnJpZWYgIFRyYW5zbWl0IGFuIGFtb3VudCBvZiBkYXRhIGluIG5vbi1ibG9ja2luZyBtb2RlIHdpdGggRE1BIGludGVycnVwdC4KICAqIEBwYXJhbSAgaHN3cG1pIFNXUE1JIGhhbmRsZQogICogQHBhcmFtICBwRGF0YSBQb2ludGVyIHRvIGRhdGEgYnVmZmVyCiAgKiBAcGFyYW0gIFNpemUgQW1vdW50IG9mIGRhdGEgdG8gYmUgc2VudAogICogQHJldHZhbCBIQUwgc3RhdHVzCiAgKi8KSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NXUE1JX1RyYW5zbWl0X0RNQShTV1BNSV9IYW5kbGVUeXBlRGVmICpoc3dwbWksIHVpbnQzMl90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSkKewogIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKICBIQUxfU1dQTUlfU3RhdGVUeXBlRGVmIHRtcF9zdGF0ZTsKCiAgaWYoKHBEYXRhID09IE5VTEwgKSB8fCAoU2l6ZSA9PSAwVSkpCiAgewogICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKICB9CiAgZWxzZQogIHsKICAgIC8qIFByb2Nlc3MgTG9ja2VkICovCiAgICBfX0hBTF9MT0NLKGhzd3BtaSk7CgogICAgdG1wX3N0YXRlID0gaHN3cG1pLT5TdGF0ZTsKICAgIGlmKCh0bXBfc3RhdGUgPT0gSEFMX1NXUE1JX1NUQVRFX1JFQURZKSB8fCAodG1wX3N0YXRlID09IEhBTF9TV1BNSV9TVEFURV9CVVNZX1JYKSkKICAgIHsKICAgICAgLyogVXBkYXRlIGhhbmRsZSAqLwogICAgICBoc3dwbWktPnBUeEJ1ZmZQdHIgPSBwRGF0YTsKICAgICAgaHN3cG1pLT5UeFhmZXJTaXplID0gU2l6ZTsKICAgICAgaHN3cG1pLT5UeFhmZXJDb3VudCA9IFNpemU7CiAgICAgIGhzd3BtaS0+RXJyb3JDb2RlID0gSEFMX1NXUE1JX0VSUk9SX05PTkU7CgogICAgICAvKiBDaGVjayBpZiBhIHJlY2VpdmUgcHJvY2VzcyBpcyBvbmdvaW5nIG9yIG5vdCAqLwogICAgICBpZih0bXBfc3RhdGUgPT0gSEFMX1NXUE1JX1NUQVRFX1JFQURZKQogICAgICB7CiAgICAgICAgaHN3cG1pLT5TdGF0ZSA9IEhBTF9TV1BNSV9TVEFURV9CVVNZX1RYOwoKICAgICAgICAvKiBFbmFibGUgU1dQTUkgcGVyaXBoZXJhbCBpZiBub3QgKi8KICAgICAgICBTRVRfQklUKGhzd3BtaS0+SW5zdGFuY2UtPkNSLCBTV1BNSV9DUl9TV1BBQ1QpOwogICAgICB9CiAgICAgIGVsc2UKICAgICAgewogICAgICAgIGhzd3BtaS0+U3RhdGUgPSBIQUxfU1dQTUlfU1RBVEVfQlVTWV9UWF9SWDsKICAgICAgfQoKICAgICAgLyogU2V0IHRoZSBTV1BNSSBETUEgdHJhbnNmZXIgY29tcGxldGUgY2FsbGJhY2sgKi8KICAgICAgaHN3cG1pLT5oZG1hdHgtPlhmZXJDcGx0Q2FsbGJhY2sgPSBTV1BNSV9ETUFUcmFuc21pdENwbHQ7CgogICAgICAvKiBTZXQgdGhlIFNXUE1JIERNQSBIYWxmIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCiAgICAgIGhzd3BtaS0+aGRtYXR4LT5YZmVySGFsZkNwbHRDYWxsYmFjayA9IFNXUE1JX0RNQVR4SGFsZkNwbHQ7CgogICAgICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLwogICAgICBoc3dwbWktPmhkbWF0eC0+WGZlckVycm9yQ2FsbGJhY2sgPSBTV1BNSV9ETUFFcnJvcjsKCiAgICAgIC8qIEVuYWJsZSB0aGUgU1dQTUkgdHJhbnNtaXQgRE1BIGNoYW5uZWwgKi8KICAgICAgaWYoSEFMX0RNQV9TdGFydF9JVChoc3dwbWktPmhkbWF0eCwgKHVpbnQzMl90KWhzd3BtaS0+cFR4QnVmZlB0ciwgKHVpbnQzMl90KSZoc3dwbWktPkluc3RhbmNlLT5URFIsIFNpemUpICE9IEhBTF9PSykKICAgICAgewogICAgICAgIGhzd3BtaS0+U3RhdGUgPSB0bXBfc3RhdGU7ICAgIC8qIEJhY2sgdG8gcHJldmlvdXMgc3RhdGUgKi8KICAgICAgICBoc3dwbWktPkVycm9yQ29kZSA9IEhBTF9TV1BNSV9FUlJPUl9ETUE7CiAgICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOwoKICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCiAgICAgICAgX19IQUxfVU5MT0NLKGhzd3BtaSk7CiAgICAgIH0KICAgICAgZWxzZQogICAgICB7CiAgICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLwogICAgICAgIF9fSEFMX1VOTE9DSyhoc3dwbWkpOwoKICAgICAgICAvKiBFbmFibGUgdGhlIFNXUE1JIHRyYW5zbWl0IHVuZGVycnVuIGVycm9yICovCiAgICAgICAgX19IQUxfU1dQTUlfRU5BQkxFX0lUKGhzd3BtaSwgU1dQTUlfSVRfVFhVTlJJRSk7CgogICAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIHRyYW5zZmVyIGZvciB0cmFuc21pdCByZXF1ZXN0IGJ5IHNldHRpbmcgdGhlIFRYRE1BIGJpdAogICAgICAgICAgIGluIHRoZSBTV1BNSSBDUiByZWdpc3RlciAqLwogICAgICAgIFNFVF9CSVQoaHN3cG1pLT5JbnN0YW5jZS0+Q1IsIFNXUE1JX0NSX1RYRE1BKTsKICAgICAgfQogICAgfQogICAgZWxzZQogICAgewogICAgICBzdGF0dXMgPSBIQUxfQlVTWTsKCiAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KICAgICAgX19IQUxfVU5MT0NLKGhzd3BtaSk7CiAgICB9CiAgfQoKICByZXR1cm4gc3RhdHVzOwp9CgovKioKICAqIEBicmllZiAgUmVjZWl2ZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSB3aXRoIERNQSBpbnRlcnJ1cHQuCiAgKiBAcGFyYW0gIGhzd3BtaSBTV1BNSSBoYW5kbGUKICAqIEBwYXJhbSAgcERhdGEgUG9pbnRlciB0byBkYXRhIGJ1ZmZlcgogICogQHBhcmFtICBTaXplIEFtb3VudCBvZiBkYXRhIHRvIGJlIHJlY2VpdmVkCiAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAqLwpIQUxfU3RhdHVzVHlwZURlZiBIQUxfU1dQTUlfUmVjZWl2ZV9ETUEoU1dQTUlfSGFuZGxlVHlwZURlZiAqaHN3cG1pLCB1aW50MzJfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpCnsKICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CiAgSEFMX1NXUE1JX1N0YXRlVHlwZURlZiB0bXBfc3RhdGU7CgogIGlmKChwRGF0YSA9PSBOVUxMICkgfHwgKFNpemUgPT0gMFUpKQogIHsKICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CiAgfQogIGVsc2UKICB7CiAgICAvKiBQcm9jZXNzIExvY2tlZCAqLwogICAgX19IQUxfTE9DSyhoc3dwbWkpOwoKICAgIHRtcF9zdGF0ZSA9IGhzd3BtaS0+U3RhdGU7CiAgICBpZigodG1wX3N0YXRlID09IEhBTF9TV1BNSV9TVEFURV9SRUFEWSkgfHwgKHRtcF9zdGF0ZSA9PSBIQUxfU1dQTUlfU1RBVEVfQlVTWV9UWCkpCiAgICB7CiAgICAgIC8qIFVwZGF0ZSBoYW5kbGUgKi8KICAgICAgaHN3cG1pLT5wUnhCdWZmUHRyID0gcERhdGE7CiAgICAgIGhzd3BtaS0+UnhYZmVyU2l6ZSA9IFNpemU7CiAgICAgIGhzd3BtaS0+RXJyb3JDb2RlID0gSEFMX1NXUE1JX0VSUk9SX05PTkU7CgogICAgICAvKiBDaGVjayBpZiBhIHRyYW5zbWl0IHByb2Nlc3MgaXMgb25nb2luZyBvciBub3QgKi8KICAgICAgaWYodG1wX3N0YXRlID09IEhBTF9TV1BNSV9TVEFURV9SRUFEWSkKICAgICAgewogICAgICAgIGhzd3BtaS0+U3RhdGUgPSBIQUxfU1dQTUlfU1RBVEVfQlVTWV9SWDsKCiAgICAgICAgLyogRW5hYmxlIFNXUE1JIHBlcmlwaGVyYWwgaWYgbm90ICovCiAgICAgICAgU0VUX0JJVChoc3dwbWktPkluc3RhbmNlLT5DUiwgU1dQTUlfQ1JfU1dQQUNUKTsKICAgICAgfQogICAgICBlbHNlCiAgICAgIHsKICAgICAgICBoc3dwbWktPlN0YXRlID0gSEFMX1NXUE1JX1NUQVRFX0JVU1lfVFhfUlg7CiAgICAgIH0KCiAgICAgIC8qIFNldCB0aGUgU1dQTUkgRE1BIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCiAgICAgIGhzd3BtaS0+aGRtYXJ4LT5YZmVyQ3BsdENhbGxiYWNrID0gU1dQTUlfRE1BUmVjZWl2ZUNwbHQ7CgogICAgICAvKiBTZXQgdGhlIFNXUE1JIERNQSBIYWxmIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovCiAgICAgIGhzd3BtaS0+aGRtYXJ4LT5YZmVySGFsZkNwbHRDYWxsYmFjayA9IFNXUE1JX0RNQVJ4SGFsZkNwbHQ7CgogICAgICAvKiBTZXQgdGhlIERNQSBlcnJvciBjYWxsYmFjayAqLwogICAgICBoc3dwbWktPmhkbWFyeC0+WGZlckVycm9yQ2FsbGJhY2sgPSBTV1BNSV9ETUFFcnJvcjsKCiAgICAgIC8qIEVuYWJsZSB0aGUgRE1BIHJlcXVlc3QgKi8KICAgICAgaWYoSEFMX0RNQV9TdGFydF9JVChoc3dwbWktPmhkbWFyeCwgKHVpbnQzMl90KSZoc3dwbWktPkluc3RhbmNlLT5SRFIsICh1aW50MzJfdCloc3dwbWktPnBSeEJ1ZmZQdHIsIFNpemUpICE9IEhBTF9PSykKICAgICAgewogICAgICAgIGhzd3BtaS0+U3RhdGUgPSB0bXBfc3RhdGU7ICAgIC8qIEJhY2sgdG8gcHJldmlvdXMgc3RhdGUgKi8KICAgICAgICBoc3dwbWktPkVycm9yQ29kZSA9IEhBTF9TV1BNSV9FUlJPUl9ETUE7CiAgICAgICAgc3RhdHVzID0gSEFMX0VSUk9SOwoKICAgICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCiAgICAgICAgX19IQUxfVU5MT0NLKGhzd3BtaSk7CiAgICAgIH0KICAgICAgZWxzZQogICAgICB7CiAgICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLwogICAgICAgIF9fSEFMX1VOTE9DSyhoc3dwbWkpOwoKICAgICAgICAvKiBFbmFibGUgdGhlIFNXUE1JIHJlY2VpdmUgQ1JDIEVycm9yIGFuZCByZWNlaXZlIG92ZXJydW4gaW50ZXJydXB0cyAqLwogICAgICAgIF9fSEFMX1NXUE1JX0VOQUJMRV9JVChoc3dwbWksIFNXUE1JX0lUX1JYQkVSSUUgfCBTV1BNSV9JVF9SWE9WUklFKTsKCiAgICAgICAgLyogRW5hYmxlIHRoZSBETUEgdHJhbnNmZXIgZm9yIHRoZSByZWNlaXZlciByZXF1ZXN0IGJ5IHNldHRpbmcgdGhlIFJYRE1BIGJpdAogICAgICAgICAgIGluIHRoZSBTV1BNSSBDUiByZWdpc3RlciAqLwogICAgICAgIFNFVF9CSVQoaHN3cG1pLT5JbnN0YW5jZS0+Q1IsIFNXUE1JX0NSX1JYRE1BKTsKICAgICAgfQogICAgfQogICAgZWxzZQogICAgewogICAgICBzdGF0dXMgPSBIQUxfQlVTWTsKCiAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KICAgICAgX19IQUxfVU5MT0NLKGhzd3BtaSk7CiAgICB9CiAgfQoKICByZXR1cm4gc3RhdHVzOwp9CgovKioKICAqIEBicmllZiBTdG9wIGFsbCBETUEgdHJhbnNmZXJzLgogICogQHBhcmFtIGhzd3BtaSBTV1BNSSBoYW5kbGUKICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICovCkhBTF9TdGF0dXNUeXBlRGVmIEhBTF9TV1BNSV9ETUFTdG9wKFNXUE1JX0hhbmRsZVR5cGVEZWYgKmhzd3BtaSkKewogIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKCiAgLyogUHJvY2VzcyBMb2NrZWQgKi8KICBfX0hBTF9MT0NLKGhzd3BtaSk7CgogIC8qIERpc2FibGUgdGhlIFNXUE1JIFR4L1J4IERNQSByZXF1ZXN0cyAqLwogIENMRUFSX0JJVChoc3dwbWktPkluc3RhbmNlLT5DUiwgKFNXUE1JX0NSX1RYRE1BIHwgU1dQTUlfQ1JfUlhETUEpKTsKCiAgLyogQWJvcnQgdGhlIFNXUE1JIERNQSB0eCBjaGFubmVsICovCiAgaWYoaHN3cG1pLT5oZG1hdHggIT0gTlVMTCkKICB7CiAgICBpZihIQUxfRE1BX0Fib3J0KGhzd3BtaS0+aGRtYXR4KSAhPSBIQUxfT0spCiAgICB7CiAgICAgIGhzd3BtaS0+RXJyb3JDb2RlIHw9IEhBTF9TV1BNSV9FUlJPUl9ETUE7CiAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKICAgIH0KICB9CiAgLyogQWJvcnQgdGhlIFNXUE1JIERNQSByeCBjaGFubmVsICovCiAgaWYoaHN3cG1pLT5oZG1hcnggIT0gTlVMTCkKICB7CiAgICBpZihIQUxfRE1BX0Fib3J0KGhzd3BtaS0+aGRtYXJ4KSAhPSBIQUxfT0spCiAgICB7CiAgICAgIGhzd3BtaS0+RXJyb3JDb2RlIHw9IEhBTF9TV1BNSV9FUlJPUl9ETUE7CiAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKICAgIH0KICB9CgogIC8qIERpc2FibGUgU1dQTUkgaW50ZXJmYWNlICovCiAgQ0xFQVJfQklUKGhzd3BtaS0+SW5zdGFuY2UtPkNSLCBTV1BNSV9DUl9TV1BBQ1QpOwoKICBoc3dwbWktPlN0YXRlID0gSEFMX1NXUE1JX1NUQVRFX1JFQURZOwoKICAvKiBQcm9jZXNzIFVubG9ja2VkICovCiAgX19IQUxfVU5MT0NLKGhzd3BtaSk7CgogIHJldHVybiBzdGF0dXM7Cn0KCgovKioKICAqIEBicmllZiBFbmFibGUgdGhlIExvb3BiYWNrIG1vZGUuCiAgKiBAcGFyYW0gaHN3cG1pIFNXUE1JIGhhbmRsZQogICogQG5vdGUgIExvb3BiYWNrIG1vZGUgaXMgdG8gYmUgdXNlZCBvbmx5IGZvciB0ZXN0IHB1cnBvc2VzCiAgKiBAcmV0dmFsIEhBTF9PSyAvIEhBTF9CVVNZCiAgKi8KSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NXUE1JX0VuYWJsZUxvb3BiYWNrKFNXUE1JX0hhbmRsZVR5cGVEZWYgKmhzd3BtaSkKewogIEhBTF9TdGF0dXNUeXBlRGVmICBzdGF0dXMgPSBIQUxfT0s7CgogIC8qIFByb2Nlc3MgTG9ja2VkICovCiAgX19IQUxfTE9DSyhoc3dwbWkpOwoKICAvKiBNYWtlIHN1cmUgdGhlIFNXUE1JIGludGVyZmFjZSBpcyBub3QgZW5hYmxlZCB0byBzZXQgdGhlIGxvb3BiYWNrIG1vZGUgKi8KICBDTEVBUl9CSVQoaHN3cG1pLT5JbnN0YW5jZS0+Q1IsIFNXUE1JX0NSX1NXUEFDVCk7CgogIC8qIFNldCBMb29wYmFjayAqLwogIFNFVF9CSVQoaHN3cG1pLT5JbnN0YW5jZS0+Q1IsIFNXUE1JX0NSX0xQQkspOwoKICAvKiBFbmFibGUgU1dQTUkgaW50ZXJmYWNlIGluIGxvb3BiYWNrIG1vZGUgKi8KICBTRVRfQklUKGhzd3BtaS0+SW5zdGFuY2UtPkNSLCBTV1BNSV9DUl9TV1BBQ1QpOwoKICAvKiBQcm9jZXNzIFVubG9ja2VkICovCiAgX19IQUxfVU5MT0NLKGhzd3BtaSk7CgogIHJldHVybiBzdGF0dXM7Cn0KCi8qKgogICogQGJyaWVmIERpc2FibGUgdGhlIExvb3BiYWNrIG1vZGUuCiAgKiBAcGFyYW0gaHN3cG1pIFNXUE1JIGhhbmRsZQogICogQG5vdGUgIExvb3BiYWNrIG1vZGUgaXMgdG8gYmUgdXNlZCBvbmx5IGZvciB0ZXN0IHB1cnBvc2VzCiAgKiBAcmV0dmFsIEhBTF9PSyAvIEhBTF9CVVNZCiAgKi8KSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NXUE1JX0Rpc2FibGVMb29wYmFjayhTV1BNSV9IYW5kbGVUeXBlRGVmICpoc3dwbWkpCnsKICBIQUxfU3RhdHVzVHlwZURlZiAgc3RhdHVzID0gSEFMX09LOwoKICAvKiBQcm9jZXNzIExvY2tlZCAqLwogIF9fSEFMX0xPQ0soaHN3cG1pKTsKCiAgLyogTWFrZSBzdXJlIHRoZSBTV1BNSSBpbnRlcmZhY2UgaXMgbm90IGVuYWJsZWQgdG8gcmVzZXQgdGhlIGxvb3BiYWNrIG1vZGUgKi8KICBDTEVBUl9CSVQoaHN3cG1pLT5JbnN0YW5jZS0+Q1IsIFNXUE1JX0NSX1NXUEFDVCk7CgogIC8qIFJlc2V0IExvb3BiYWNrICovCiAgQ0xFQVJfQklUKGhzd3BtaS0+SW5zdGFuY2UtPkNSLCBTV1BNSV9DUl9MUEJLKTsKCiAgLyogUmUtZW5hYmxlIFNXUE1JIGludGVyZmFjZSBpbiBub3JtYWwgbW9kZSAqLwogIFNFVF9CSVQoaHN3cG1pLT5JbnN0YW5jZS0+Q1IsIFNXUE1JX0NSX1NXUEFDVCk7CgogIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KICBfX0hBTF9VTkxPQ0soaHN3cG1pKTsKCiAgcmV0dXJuIHN0YXR1czsKfQoKLyoqCiAgKiBAfQogICovCgovKiogQGRlZmdyb3VwIFNXUE1JX0V4cG9ydGVkX0dyb3VwMyBTV1BNSSBJUlEgaGFuZGxlciBhbmQgY2FsbGJhY2tzCiAqICBAYnJpZWYgIFNXUE1JICBJUlEgaGFuZGxlci4KICoKQHZlcmJhdGltCiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBTV1BNSSBJUlEgaGFuZGxlciBhbmQgY2FsbGJhY2tzICAjIyMjIwogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpbLi5dICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgU1dQTUkgSVJRIGhhbmRsZXIgYW5kIGNhbGxiYWNrIGZ1bmN0aW9ucyBjYWxsZWQgd2l0aGluCiAgICAgIHRoZSBJUlEgaGFuZGxlci4KCkBlbmR2ZXJiYXRpbQogICogQHsKICAqLwoKLyoqCiAgKiBAYnJpZWYgSGFuZGxlIFNXUE1JIGludGVycnVwdCByZXF1ZXN0LgogICogQHBhcmFtIGhzd3BtaSBTV1BNSSBoYW5kbGUKICAqIEByZXR2YWwgTm9uZQogICovCnZvaWQgSEFMX1NXUE1JX0lSUUhhbmRsZXIoU1dQTUlfSGFuZGxlVHlwZURlZiAqaHN3cG1pKQp7CiAgdWludDMyX3QgcmVnaXNyID0gUkVBRF9SRUcoaHN3cG1pLT5JbnN0YW5jZS0+SVNSKTsKICB1aW50MzJfdCByZWdpZXIgPSBSRUFEX1JFRyhoc3dwbWktPkluc3RhbmNlLT5JRVIpOwogIHVpbnQzMl90IGVycmNvZGUgPSBIQUxfU1dQTUlfRVJST1JfTk9ORTsKCiAgLyogU1dQTUkgQ1JDIGVycm9yIGludGVycnVwdCBvY2N1cnJlZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYoKChyZWdpc3IgJiBTV1BNSV9GTEFHX1JYQkVSRikgIT0gMFUpICYmICgocmVnaWVyICYgU1dQTUlfSVRfUlhCRVJJRSkgIT0gMFUpKQogIHsKICAgIC8qIERpc2FibGUgUmVjZWl2ZSBDUkMgaW50ZXJydXB0ICovCiAgICBDTEVBUl9CSVQoaHN3cG1pLT5JbnN0YW5jZS0+SUVSLCBTV1BNSV9JVF9SWEJFUklFIHwgU1dQTUlfSVRfUlhCRklFKTsKICAgIC8qIENsZWFyIFJlY2VpdmUgQ1JDIGFuZCBSZWNlaXZlIGJ1ZmZlciBmdWxsIGZsYWcgKi8KICAgIFdSSVRFX1JFRyhoc3dwbWktPkluc3RhbmNlLT5JQ1IsIFNXUE1JX0ZMQUdfUlhCRVJGIHwgU1dQTUlfRkxBR19SWEJGRik7CgogICAgZXJyY29kZSB8PSBIQUxfU1dQTUlfRVJST1JfQ1JDOwogIH0KCiAgLyogU1dQTUkgT3Zlci1SdW4gaW50ZXJydXB0IG9jY3VycmVkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBpZigoKHJlZ2lzciAmIFNXUE1JX0ZMQUdfUlhPVlJGKSAhPSAwVSkgJiYgKChyZWdpZXIgJiBTV1BNSV9JVF9SWE9WUklFKSAhPSAwVSkpCiAgewogICAgLyogRGlzYWJsZSBSZWNlaXZlIG92ZXJydW4gaW50ZXJydXB0ICovCiAgICBDTEVBUl9CSVQoaHN3cG1pLT5JbnN0YW5jZS0+SUVSLCBTV1BNSV9JVF9SWE9WUklFKTsKICAgIC8qIENsZWFyIFJlY2VpdmUgb3ZlcnJ1biBmbGFnICovCiAgICBXUklURV9SRUcoaHN3cG1pLT5JbnN0YW5jZS0+SUNSLCBTV1BNSV9GTEFHX1JYT1ZSRik7CgogICAgZXJyY29kZSB8PSBIQUxfU1dQTUlfRVJST1JfT1ZSOwogIH0KCiAgLyogU1dQTUkgVW5kZXItUnVuIGludGVycnVwdCBvY2N1cnJlZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYoKChyZWdpc3IgJiBTV1BNSV9GTEFHX1RYVU5SRikgIT0gMFUpICYmICgocmVnaWVyICYgU1dQTUlfSVRfVFhVTlJJRSkgIT0gMFUpKQogIHsKICAgIC8qIERpc2FibGUgVHJhbnNtaXQgdW5kZXIgcnVuIGludGVycnVwdCAqLwogICAgQ0xFQVJfQklUKGhzd3BtaS0+SW5zdGFuY2UtPklFUiwgU1dQTUlfSVRfVFhVTlJJRSk7CiAgICAvKiBDbGVhciBUcmFuc21pdCB1bmRlciBydW4gZmxhZyAqLwogICAgV1JJVEVfUkVHKGhzd3BtaS0+SW5zdGFuY2UtPklDUiwgU1dQTUlfRkxBR19UWFVOUkYpOwoKICAgIGVycmNvZGUgfD0gSEFMX1NXUE1JX0VSUk9SX1VEUjsKICB9CgogICAvKiBDYWxsIFNXUE1JIEVycm9yIENhbGwgYmFjayBmdW5jdGlvbiBpZiBuZWVkZWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmKGVycmNvZGUgIT0gSEFMX1NXUE1JX0VSUk9SX05PTkUpCiAgewogICAgaHN3cG1pLT5FcnJvckNvZGUgfD0gZXJyY29kZTsKCiAgICBpZigoZXJyY29kZSAmIEhBTF9TV1BNSV9FUlJPUl9VRFIpICE9IDBVKQogICAgewogICAgICAvKiBDaGVjayBUWERNQSB0cmFuc2ZlciB0byBhYm9ydCAqLwogICAgICBpZihIQUxfSVNfQklUX1NFVChoc3dwbWktPkluc3RhbmNlLT5DUiwgU1dQTUlfQ1JfVFhETUEpKQogICAgICB7CiAgICAgICAgLyogRGlzYWJsZSBETUEgVFggYXQgU1dQTUkgbGV2ZWwgKi8KICAgICAgICBDTEVBUl9CSVQoaHN3cG1pLT5JbnN0YW5jZS0+Q1IsIFNXUE1JX0NSX1RYRE1BKTsKCiAgICAgICAgLyogQWJvcnQgdGhlIFVTQVJUIERNQSBUeCBjaGFubmVsICovCiAgICAgICAgaWYoaHN3cG1pLT5oZG1hdHggIT0gTlVMTCkKICAgICAgICB7CiAgICAgICAgICAvKiBTZXQgdGhlIFNXUE1JIFR4IERNQSBBYm9ydCBjYWxsYmFjayA6CiAgICAgICAgICAgICB3aWxsIGxlYWQgdG8gY2FsbCBIQUxfU1dQTUlfRXJyb3JDYWxsYmFjaygpIGF0IGVuZCBvZiBETUEgYWJvcnQgcHJvY2VkdXJlICovCiAgICAgICAgICBoc3dwbWktPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2sgPSBTV1BNSV9ETUFBYm9ydE9uRXJyb3I7CiAgICAgICAgICAvKiBBYm9ydCBETUEgVFggKi8KICAgICAgICAgIGlmKEhBTF9ETUFfQWJvcnRfSVQoaHN3cG1pLT5oZG1hdHgpICE9IEhBTF9PSykKICAgICAgICAgIHsKICAgICAgICAgICAgLyogQ2FsbCBEaXJlY3RseSBoc3dwbWktPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2sgZnVuY3Rpb24gaW4gY2FzZSBvZiBlcnJvciAqLwogICAgICAgICAgICBoc3dwbWktPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2soaHN3cG1pLT5oZG1hdHgpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgLyogU2V0IHRoZSBTV1BNSSBzdGF0ZSByZWFkeSB0byBiZSBhYmxlIHRvIHN0YXJ0IGFnYWluIHRoZSBwcm9jZXNzICovCiAgICAgICAgICBoc3dwbWktPlN0YXRlID0gSEFMX1NXUE1JX1NUQVRFX1JFQURZOwoKI2lmIChVU0VfSEFMX1NXUE1JX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQogICAgICAgICAgaHN3cG1pLT5FcnJvckNhbGxiYWNrKGhzd3BtaSk7CiNlbHNlCiAgICAgICAgICBIQUxfU1dQTUlfRXJyb3JDYWxsYmFjayhoc3dwbWkpOwojZW5kaWYKICAgICAgICB9CiAgICAgIH0KICAgICAgZWxzZQogICAgICB7CiAgICAgICAgLyogU2V0IHRoZSBTV1BNSSBzdGF0ZSByZWFkeSB0byBiZSBhYmxlIHRvIHN0YXJ0IGFnYWluIHRoZSBwcm9jZXNzICovCiAgICAgICAgaHN3cG1pLT5TdGF0ZSA9IEhBTF9TV1BNSV9TVEFURV9SRUFEWTsKCiNpZiAoVVNFX0hBTF9TV1BNSV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKICAgICAgICBoc3dwbWktPkVycm9yQ2FsbGJhY2soaHN3cG1pKTsKI2Vsc2UKICAgICAgICBIQUxfU1dQTUlfRXJyb3JDYWxsYmFjayhoc3dwbWkpOwojZW5kaWYKICAgICAgfQogICAgfQogICAgZWxzZQogICAgewogICAgICAvKiBDaGVjayBSWERNQSB0cmFuc2ZlciB0byBhYm9ydCAqLwogICAgICBpZihIQUxfSVNfQklUX1NFVChoc3dwbWktPkluc3RhbmNlLT5DUiwgU1dQTUlfQ1JfUlhETUEpKQogICAgICB7CiAgICAgICAgLyogRGlzYWJsZSBETUEgUlggYXQgU1dQTUkgbGV2ZWwgKi8KICAgICAgICBDTEVBUl9CSVQoaHN3cG1pLT5JbnN0YW5jZS0+Q1IsIFNXUE1JX0NSX1JYRE1BKTsKCiAgICAgICAgLyogQWJvcnQgdGhlIFVTQVJUIERNQSBSeCBjaGFubmVsICovCiAgICAgICAgaWYoaHN3cG1pLT5oZG1hcnggIT0gTlVMTCkKICAgICAgICB7CiAgICAgICAgICAvKiBTZXQgdGhlIFNXUE1JIFJ4IERNQSBBYm9ydCBjYWxsYmFjayA6CiAgICAgICAgICAgICB3aWxsIGxlYWQgdG8gY2FsbCBIQUxfU1dQTUlfRXJyb3JDYWxsYmFjaygpIGF0IGVuZCBvZiBETUEgYWJvcnQgcHJvY2VkdXJlICovCiAgICAgICAgICBoc3dwbWktPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgPSBTV1BNSV9ETUFBYm9ydE9uRXJyb3I7CiAgICAgICAgICAvKiBBYm9ydCBETUEgUlggKi8KICAgICAgICAgIGlmKEhBTF9ETUFfQWJvcnRfSVQoaHN3cG1pLT5oZG1hcngpICE9IEhBTF9PSykKICAgICAgICAgIHsKICAgICAgICAgICAgLyogQ2FsbCBEaXJlY3RseSBoc3dwbWktPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2sgZnVuY3Rpb24gaW4gY2FzZSBvZiBlcnJvciAqLwogICAgICAgICAgICBoc3dwbWktPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2soaHN3cG1pLT5oZG1hcngpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgLyogU2V0IHRoZSBTV1BNSSBzdGF0ZSByZWFkeSB0byBiZSBhYmxlIHRvIHN0YXJ0IGFnYWluIHRoZSBwcm9jZXNzICovCiAgICAgICAgICBoc3dwbWktPlN0YXRlID0gSEFMX1NXUE1JX1NUQVRFX1JFQURZOwoKI2lmIChVU0VfSEFMX1NXUE1JX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQogICAgICAgICAgaHN3cG1pLT5FcnJvckNhbGxiYWNrKGhzd3BtaSk7CiNlbHNlCiAgICAgICAgICBIQUxfU1dQTUlfRXJyb3JDYWxsYmFjayhoc3dwbWkpOwojZW5kaWYKICAgICAgICB9CiAgICAgIH0KICAgICAgZWxzZQogICAgICB7CiAgICAgICAgLyogU2V0IHRoZSBTV1BNSSBzdGF0ZSByZWFkeSB0byBiZSBhYmxlIHRvIHN0YXJ0IGFnYWluIHRoZSBwcm9jZXNzICovCiAgICAgICAgaHN3cG1pLT5TdGF0ZSA9IEhBTF9TV1BNSV9TVEFURV9SRUFEWTsKCiNpZiAoVVNFX0hBTF9TV1BNSV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKICAgICAgICBoc3dwbWktPkVycm9yQ2FsbGJhY2soaHN3cG1pKTsKI2Vsc2UKICAgICAgICBIQUxfU1dQTUlfRXJyb3JDYWxsYmFjayhoc3dwbWkpOwojZW5kaWYKICAgICAgfQogICAgfQogIH0KCiAgLyogU1dQTUkgaW4gbW9kZSBSZWNlaXZlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmKCgocmVnaXNyICYgU1dQTUlfRkxBR19SWE5FKSAhPSAwVSkgJiYgKChyZWdpZXIgJiBTV1BNSV9JVF9SSUUpICAhPSAwVSkpCiAgewogICAgU1dQTUlfUmVjZWl2ZV9JVChoc3dwbWkpOwogIH0KCiAgLyogU1dQTUkgaW4gbW9kZSBUcmFuc21pdHRlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmKCgocmVnaXNyICYgU1dQTUlfRkxBR19UWEUpICE9IDBVKSAmJiAoKHJlZ2llciAmIFNXUE1JX0lUX1RJRSkgIT0gMFUpKQogIHsKICAgIFNXUE1JX1RyYW5zbWl0X0lUKGhzd3BtaSk7CiAgfQoKICAvKiBTV1BNSSBpbiBtb2RlIFRyYW5zbWl0dGVyIChUcmFuc21pdCBidWZmZXIgZW1wdHkpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgaWYoKChyZWdpc3IgJiBTV1BNSV9GTEFHX1RYQkVGKSAhPSAwVSkgJiYgKChyZWdpZXIgJiBTV1BNSV9JVF9UWEJFSUUpICE9IDBVKSkKICB7CiAgICBTV1BNSV9FbmRUcmFuc21pdF9JVChoc3dwbWkpOwogIH0KCiAgLyogU1dQTUkgaW4gbW9kZSBSZWNlaXZlciAoUmVjZWl2ZSBidWZmZXIgZnVsbCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmKCgocmVnaXNyICYgU1dQTUlfRkxBR19SWEJGRikgIT0gMFUpICYmICgocmVnaWVyICYgU1dQTUlfSVRfUlhCRklFKSAhPSAwVSkpCiAgewogICAgU1dQTUlfRW5kUmVjZWl2ZV9JVChoc3dwbWkpOwogIH0KCiAgLyogQm90aCBUcmFuc21pc3Npb24gYW5kIHJlY2VwdGlvbiBjb21wbGV0ZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGlmKCgocmVnaXNyICYgU1dQTUlfRkxBR19UQ0YpICE9IDBVKSAmJiAoKHJlZ2llciAmIFNXUE1JX0lUX1RDSUUpICE9IDBVKSkKICB7CiAgICBTV1BNSV9FbmRUcmFuc21pdFJlY2VpdmVfSVQoaHN3cG1pKTsKICB9Cn0KCi8qKgogICogQGJyaWVmIFR4IFRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjay4KICAqIEBwYXJhbSBoc3dwbWkgU1dQTUkgaGFuZGxlCiAgKiBAcmV0dmFsIE5vbmUKICAqLwpfX3dlYWsgdm9pZCBIQUxfU1dQTUlfVHhDcGx0Q2FsbGJhY2soU1dQTUlfSGFuZGxlVHlwZURlZiAqaHN3cG1pKQp7CiAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLwogIFVOVVNFRChoc3dwbWkpOwoKICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCiAgICAgICAgICAgIHRoZSBIQUxfU1dQTUlfVHhDcGx0Q2FsbGJhY2sgaXMgdG8gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQogICAqLwp9CgovKioKICAqIEBicmllZiAgVHggSGFsZiBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2suCiAgKiBAcGFyYW0gIGhzd3BtaSBTV1BNSSBoYW5kbGUKICAqIEByZXR2YWwgTm9uZQogICovCl9fd2VhayB2b2lkIEhBTF9TV1BNSV9UeEhhbGZDcGx0Q2FsbGJhY2soU1dQTUlfSGFuZGxlVHlwZURlZiAqaHN3cG1pKQp7CiAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLwogIFVOVVNFRChoc3dwbWkpOwoKICAvKiBOT1RFOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKICAgICAgICAgICB0aGUgSEFMX1NXUE1JX1R4SGFsZkNwbHRDYWxsYmFjayBpcyB0byBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCiAgICovCn0KCi8qKgogICogQGJyaWVmIFJ4IFRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjay4KICAqIEBwYXJhbSBoc3dwbWkgU1dQTUkgaGFuZGxlCiAgKiBAcmV0dmFsIE5vbmUKICAqLwpfX3dlYWsgdm9pZCBIQUxfU1dQTUlfUnhDcGx0Q2FsbGJhY2soU1dQTUlfSGFuZGxlVHlwZURlZiAqaHN3cG1pKQp7CiAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLwogIFVOVVNFRChoc3dwbWkpOwoKICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCiAgICAgICAgICAgIHRoZSBIQUxfU1dQTUlfUnhDcGx0Q2FsbGJhY2sgaXMgdG8gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQogICAqLwp9CgovKioKICAqIEBicmllZiAgUnggSGFsZiBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2suCiAgKiBAcGFyYW0gIGhzd3BtaSBTV1BNSSBoYW5kbGUKICAqIEByZXR2YWwgTm9uZQogICovCl9fd2VhayB2b2lkIEhBTF9TV1BNSV9SeEhhbGZDcGx0Q2FsbGJhY2soU1dQTUlfSGFuZGxlVHlwZURlZiAqaHN3cG1pKQp7CiAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLwogIFVOVVNFRChoc3dwbWkpOwoKICAvKiBOT1RFOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKICAgICAgICAgICB0aGUgSEFMX1NXUE1JX1J4SGFsZkNwbHRDYWxsYmFjayBpcyB0byBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCiAgICovCn0KCi8qKgogICogQGJyaWVmIFNXUE1JIGVycm9yIGNhbGxiYWNrLgogICogQHBhcmFtIGhzd3BtaSBTV1BNSSBoYW5kbGUKICAqIEByZXR2YWwgTm9uZQogICovCl9fd2VhayB2b2lkIEhBTF9TV1BNSV9FcnJvckNhbGxiYWNrKFNXUE1JX0hhbmRsZVR5cGVEZWYgKmhzd3BtaSkKewogIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KICBVTlVTRUQoaHN3cG1pKTsKCiAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAogICAgICAgICAgICB0aGUgSEFMX1NXUE1JX0Vycm9yQ2FsbGJhY2sgaXMgdG8gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQogICAqLwp9CgovKioKICAqIEB9CiAgKi8KCi8qKiBAZGVmZ3JvdXAgU1dQTUlfRXhwb3J0ZWRfR3JvdXA0IFBlcmlwaGVyYWwgQ29udHJvbCBtZXRob2RzCiAgKiAgQGJyaWVmICAgU1dQTUkgY29udHJvbCBmdW5jdGlvbnMKICAqCkB2ZXJiYXRpbQogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICAgICAgICAgICAgICAgICAgIyMjIyMgUGVyaXBoZXJhbCBDb250cm9sIG1ldGhvZHMgIyMjIyMKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIFsuLl0KICAgIFRoaXMgc3Vic2VjdGlvbiBwcm92aWRlcyBhIHNldCBvZiBmdW5jdGlvbnMgYWxsb3dpbmcgdG8gY29udHJvbCB0aGUgU1dQTUkuCiAgICAgKCspIEhBTF9TV1BNSV9HZXRTdGF0ZSgpIEFQSSBpcyBoZWxwZnVsIHRvIGNoZWNrIGluIHJ1bi10aW1lIHRoZSBzdGF0ZSBvZiB0aGUgU1dQTUkgcGVyaXBoZXJhbAogICAgICgrKSBIQUxfU1dQTUlfR2V0RXJyb3IoKSBBUEkgaXMgaGVscGZ1bCB0byBjaGVjayBpbiBydW4tdGltZSB0aGUgZXJyb3Igc3RhdGUgb2YgdGhlIFNXUE1JIHBlcmlwaGVyYWwKQGVuZHZlcmJhdGltCiAgKiBAewogICovCgovKioKICAqIEBicmllZiBSZXR1cm4gdGhlIFNXUE1JIGhhbmRsZSBzdGF0ZS4KICAqIEBwYXJhbSBoc3dwbWkgU1dQTUkgaGFuZGxlCiAgKiBAcmV0dmFsIEhBTCBzdGF0ZQogICovCkhBTF9TV1BNSV9TdGF0ZVR5cGVEZWYgSEFMX1NXUE1JX0dldFN0YXRlKFNXUE1JX0hhbmRsZVR5cGVEZWYgKmhzd3BtaSkKewogIC8qIFJldHVybiBTV1BNSSBoYW5kbGUgc3RhdGUgKi8KICByZXR1cm4gaHN3cG1pLT5TdGF0ZTsKfQoKLyoqCiogQGJyaWVmICBSZXR1cm4gdGhlIFNXUE1JIGVycm9yIGNvZGUuCiogQHBhcmFtICBoc3dwbWkgOiBwb2ludGVyIHRvIGEgU1dQTUlfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucwogICogICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFNXUE1JLgoqIEByZXR2YWwgU1dQTUkgRXJyb3IgQ29kZQoqLwp1aW50MzJfdCBIQUxfU1dQTUlfR2V0RXJyb3IoU1dQTUlfSGFuZGxlVHlwZURlZiAqaHN3cG1pKQp7CiAgcmV0dXJuIGhzd3BtaS0+RXJyb3JDb2RlOwp9CgovKioKICAqIEB9CiAgKi8KCi8qKgogICogQH0KICAqLwoKLyogUHJpdmF0ZSBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCi8qKiBAZGVmZ3JvdXAgU1dQTUlfUHJpdmF0ZV9GdW5jdGlvbnMgU1dQTUkgUHJpdmF0ZSBGdW5jdGlvbnMKICAqIEB7CiAgKi8KCi8qKgogICogQGJyaWVmIFRyYW5zbWl0IGFuIGFtb3VudCBvZiBkYXRhIGluIGludGVycnVwdCBtb2RlLgogICogQG5vdGUgIEZ1bmN0aW9uIGNhbGxlZCB1bmRlciBpbnRlcnJ1cHRpb24gb25seSwgb25jZSBpbnRlcnJ1cHRpb25zIGhhdmUgYmVlbiBlbmFibGVkIGJ5IEhBTF9TV1BNSV9UcmFuc21pdF9JVCgpCiAgKiBAcGFyYW0gIGhzd3BtaSBTV1BNSSBoYW5kbGUKICAqIEByZXR2YWwgTm9uZQogICovCnN0YXRpYyB2b2lkIFNXUE1JX1RyYW5zbWl0X0lUKFNXUE1JX0hhbmRsZVR5cGVEZWYgKmhzd3BtaSkKewogIEhBTF9TV1BNSV9TdGF0ZVR5cGVEZWYgdG1wX3N0YXRlID0gaHN3cG1pLT5TdGF0ZTsKCiAgaWYgKCh0bXBfc3RhdGUgPT0gSEFMX1NXUE1JX1NUQVRFX0JVU1lfVFgpIHx8ICh0bXBfc3RhdGUgPT0gSEFMX1NXUE1JX1NUQVRFX0JVU1lfVFhfUlgpKQogIHsKICAgIGlmKGhzd3BtaS0+VHhYZmVyQ291bnQgPT0gMFUpCiAgICB7CiAgICAgIC8qIERpc2FibGUgdGhlIFNXUE1JIFRYRSBhbmQgVW5kZXJydW4gSW50ZXJydXB0cyAqLwogICAgICBDTEVBUl9CSVQoaHN3cG1pLT5JbnN0YW5jZS0+SUVSLCAoU1dQTUlfSVRfVElFIHwgU1dQTUlfSVRfVFhVTlJJRSkpOwogICAgfQogICAgZWxzZQogICAgewogICAgICBoc3dwbWktPkluc3RhbmNlLT5URFIgPSAodWludDMyX3QpKmhzd3BtaS0+cFR4QnVmZlB0cjsKICAgICAgaHN3cG1pLT5wVHhCdWZmUHRyKys7CiAgICAgIGhzd3BtaS0+VHhYZmVyQ291bnQtLTsKICAgIH0KICB9CiAgZWxzZQogIHsKICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KICB9Cn0KCi8qKgogICogQGJyaWVmICBXcmFwcyB1cCB0cmFuc21pc3Npb24gaW4gbm9uLWJsb2NraW5nIG1vZGUuCiAgKiBAcGFyYW0gIGhzd3BtaSBTV1BNSSBoYW5kbGUKICAqIEByZXR2YWwgTm9uZQogICovCnN0YXRpYyB2b2lkIFNXUE1JX0VuZFRyYW5zbWl0X0lUKFNXUE1JX0hhbmRsZVR5cGVEZWYgKmhzd3BtaSkKewogIC8qIENsZWFyIHRoZSBTV1BNSSBUcmFuc21pdCBidWZmZXIgZW1wdHkgRmxhZyAqLwogIFdSSVRFX1JFRyhoc3dwbWktPkluc3RhbmNlLT5JQ1IsIFNXUE1JX0ZMQUdfVFhCRUYpOwogIC8qIERpc2FibGUgdGhlIGFsbCBTV1BNSSBUcmFuc21pdCBJbnRlcnJ1cHRzICAqLwogIENMRUFSX0JJVChoc3dwbWktPkluc3RhbmNlLT5JRVIsIFNXUE1JX0lUX1RJRSB8IFNXUE1JX0lUX1RYVU5SSUUgfCBTV1BNSV9JVF9UWEJFSUUpOwoKICAvKiBDaGVjayBpZiBhIHJlY2VpdmUgUHJvY2VzcyBpcyBvbmdvaW5nIG9yIG5vdCAqLwogIGlmKGhzd3BtaS0+U3RhdGUgPT0gSEFMX1NXUE1JX1NUQVRFX0JVU1lfVFhfUlgpCiAgewogICAgaHN3cG1pLT5TdGF0ZSA9IEhBTF9TV1BNSV9TVEFURV9CVVNZX1JYOwogIH0KICBlbHNlCiAgewogICAgaHN3cG1pLT5TdGF0ZSA9IEhBTF9TV1BNSV9TVEFURV9SRUFEWTsKICB9CgojaWYgKFVTRV9IQUxfU1dQTUlfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCiAgaHN3cG1pLT5UeENwbHRDYWxsYmFjayhoc3dwbWkpOwojZWxzZQogIEhBTF9TV1BNSV9UeENwbHRDYWxsYmFjayhoc3dwbWkpOwojZW5kaWYKfQoKLyoqCiAgKiBAYnJpZWYgUmVjZWl2ZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBpbnRlcnJ1cHQgbW9kZS4KICAqIEBub3RlICBGdW5jdGlvbiBjYWxsZWQgdW5kZXIgaW50ZXJydXB0aW9uIG9ubHksIG9uY2UgaW50ZXJydXB0aW9ucyBoYXZlIGJlZW4gZW5hYmxlZCBieSBIQUxfU1dQTUlfUmVjZWl2ZV9JVCgpCiAgKiBAcGFyYW0gIGhzd3BtaSBTV1BNSSBoYW5kbGUKICAqIEByZXR2YWwgTm9uZQogICovCnN0YXRpYyB2b2lkIFNXUE1JX1JlY2VpdmVfSVQoU1dQTUlfSGFuZGxlVHlwZURlZiAqaHN3cG1pKQp7CiAgSEFMX1NXUE1JX1N0YXRlVHlwZURlZiB0bXBfc3RhdGUgPSBoc3dwbWktPlN0YXRlOwoKICBpZigodG1wX3N0YXRlID09IEhBTF9TV1BNSV9TVEFURV9CVVNZX1JYKSB8fCAodG1wX3N0YXRlID09IEhBTF9TV1BNSV9TVEFURV9CVVNZX1RYX1JYKSkKICB7CiAgICAqaHN3cG1pLT5wUnhCdWZmUHRyID0gKHVpbnQzMl90KShoc3dwbWktPkluc3RhbmNlLT5SRFIpOwogICAgaHN3cG1pLT5wUnhCdWZmUHRyKys7CgogICAgLS1oc3dwbWktPlJ4WGZlckNvdW50OwogICAgaWYoaHN3cG1pLT5SeFhmZXJDb3VudCA9PSAwVSkKICAgIHsKICAgICAgLyogV2FpdCBmb3IgUlhCRkYgZmxhZyB0byB1cGRhdGUgc3RhdGUgKi8KI2lmIChVU0VfSEFMX1NXUE1JX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQogICAgICBoc3dwbWktPlJ4Q3BsdENhbGxiYWNrKGhzd3BtaSk7CiNlbHNlCiAgICAgIEhBTF9TV1BNSV9SeENwbHRDYWxsYmFjayhoc3dwbWkpOwojZW5kaWYKICAgIH0KICB9CiAgZWxzZQogIHsKICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KICB9Cn0KCi8qKgogICogQGJyaWVmICBXcmFwcyB1cCByZWNlcHRpb24gaW4gbm9uLWJsb2NraW5nIG1vZGUuCiAgKiBAcGFyYW0gIGhzd3BtaSBTV1BNSSBoYW5kbGUKICAqIEByZXR2YWwgTm9uZQogICovCnN0YXRpYyB2b2lkIFNXUE1JX0VuZFJlY2VpdmVfSVQoU1dQTUlfSGFuZGxlVHlwZURlZiAqaHN3cG1pKQp7CiAgLyogQ2xlYXIgdGhlIFNXUE1JIFJlY2VpdmUgYnVmZmVyIGZ1bGwgRmxhZyAqLwogIFdSSVRFX1JFRyhoc3dwbWktPkluc3RhbmNlLT5JQ1IsIFNXUE1JX0ZMQUdfUlhCRkYpOwogIC8qIERpc2FibGUgdGhlIGFsbCBTV1BNSSBSZWNlaXZlIEludGVycnVwdHMgICovCiAgQ0xFQVJfQklUKGhzd3BtaS0+SW5zdGFuY2UtPklFUiwgU1dQTUlfSVRfUklFIHwgU1dQTUlfSVRfUlhCRVJJRSB8IFNXUE1JX0lUX1JYT1ZSSUUgfCBTV1BNSV9JVF9SWEJGSUUpOwoKICAvKiBDaGVjayBpZiBhIHRyYW5zbWl0IFByb2Nlc3MgaXMgb25nb2luZyBvciBub3QgKi8KICBpZihoc3dwbWktPlN0YXRlID09IEhBTF9TV1BNSV9TVEFURV9CVVNZX1RYX1JYKQogIHsKICAgIGhzd3BtaS0+U3RhdGUgPSBIQUxfU1dQTUlfU1RBVEVfQlVTWV9UWDsKICB9CiAgZWxzZQogIHsKICAgIGhzd3BtaS0+U3RhdGUgPSBIQUxfU1dQTUlfU1RBVEVfUkVBRFk7CiAgfQp9CgovKioKICAqIEBicmllZiAgV3JhcHMgdXAgdHJhbnNtaXNzaW9uIGFuZCByZWNlcHRpb24gaW4gbm9uLWJsb2NraW5nIG1vZGUuCiAgKiBAcGFyYW0gIGhzd3BtaSBTV1BNSSBoYW5kbGUKICAqIEByZXR2YWwgTm9uZQogICovCnN0YXRpYyB2b2lkIFNXUE1JX0VuZFRyYW5zbWl0UmVjZWl2ZV9JVChTV1BNSV9IYW5kbGVUeXBlRGVmICpoc3dwbWkpCnsKICAvKiBDbGVhciB0aGUgU1dQTUkgVHJhbnNtaXNzaW9uIENvbXBsZXRlIEZsYWcgKi8KICBXUklURV9SRUcoaHN3cG1pLT5JbnN0YW5jZS0+SUNSLCBTV1BNSV9GTEFHX1RDRik7CiAgLyogRGlzYWJsZSB0aGUgU1dQTUkgVHJhbnNtaXNzaW9uICBDb21wbGV0ZSBJbnRlcnJ1cHQgKi8KICBDTEVBUl9CSVQoaHN3cG1pLT5JbnN0YW5jZS0+SUVSLCBTV1BNSV9JVF9UQ0lFKTsKCiAgLyogQ2hlY2sgaWYgYSByZWNlaXZlIFByb2Nlc3MgaXMgb25nb2luZyBvciBub3QgKi8KICBpZihoc3dwbWktPlN0YXRlID09IEhBTF9TV1BNSV9TVEFURV9CVVNZX1RYX1JYKQogIHsKICAgIGhzd3BtaS0+U3RhdGUgPSBIQUxfU1dQTUlfU1RBVEVfQlVTWV9SWDsKICB9CiAgZWxzZSBpZihoc3dwbWktPlN0YXRlID09IEhBTF9TV1BNSV9TVEFURV9CVVNZX1RYKQogIHsKICAgIGhzd3BtaS0+U3RhdGUgPSBIQUxfU1dQTUlfU1RBVEVfUkVBRFk7CiAgfQogIGVsc2UKICB7CiAgICAvKiBub3RoaW5nIHRvIGRvICovCiAgfQp9CgovKioKICAqIEBicmllZiBETUEgU1dQTUkgdHJhbnNtaXQgcHJvY2VzcyBjb21wbGV0ZSBjYWxsYmFjay4KICAqIEBwYXJhbSBoZG1hIERNQSBoYW5kbGUKICAqIEByZXR2YWwgTm9uZQogICovCnN0YXRpYyB2b2lkIFNXUE1JX0RNQVRyYW5zbWl0Q3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKewogIFNXUE1JX0hhbmRsZVR5cGVEZWYqIGhzd3BtaSA9ICggU1dQTUlfSGFuZGxlVHlwZURlZiogKSgoRE1BX0hhbmRsZVR5cGVEZWYqICloZG1hKS0+UGFyZW50OwogIHVpbnQzMl90IHRpY2tzdGFydDsKCiAgLyogRE1BIE5vcm1hbCBtb2RlKi8KICBpZigoaGRtYS0+SW5zdGFuY2UtPkNDUiAmIERNQV9DQ1JfQ0lSQykgPT0gMFUpCiAgewogICAgaHN3cG1pLT5UeFhmZXJDb3VudCA9IDBVOwoKICAgIC8qIERpc2FibGUgdGhlIERNQSB0cmFuc2ZlciBmb3IgdHJhbnNtaXQgcmVxdWVzdCBieSBzZXR0aW5nIHRoZSBUWERNQSBiaXQKICAgIGluIHRoZSBTV1BNSSBDUiByZWdpc3RlciAqLwogICAgQ0xFQVJfQklUKGhzd3BtaS0+SW5zdGFuY2UtPkNSLCBTV1BNSV9DUl9UWERNQSk7CgogICAgLyogSW5pdCB0aWNrc3RhcnQgZm9yIHRpbWVvdXQgbWFuYWdtZW50Ki8KICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7CgogICAgLyogV2FpdCB0aGUgVFhCRUYgKi8KICAgIGlmKFNXUE1JX1dhaXRPbkZsYWdTZXRVbnRpbFRpbWVvdXQoaHN3cG1pLCBTV1BNSV9GTEFHX1RYQkVGLCB0aWNrc3RhcnQsIFNXUE1JX1RJTUVPVVRfVkFMVUUpICE9IEhBTF9PSykKICAgIHsKICAgICAgLyogVGltZW91dCBvY2N1cnJlZCAqLwogICAgICBoc3dwbWktPkVycm9yQ29kZSB8PSBIQUxfU1dQTUlfRVJST1JfVFhCRUZfVElNRU9VVDsKCiNpZiAoVVNFX0hBTF9TV1BNSV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKICAgICAgaHN3cG1pLT5FcnJvckNhbGxiYWNrKGhzd3BtaSk7CiNlbHNlCiAgICAgIEhBTF9TV1BNSV9FcnJvckNhbGxiYWNrKGhzd3BtaSk7CiNlbmRpZgogICAgfQogICAgZWxzZQogICAgewogICAgICAvKiBObyBUaW1lb3V0ICovCiAgICAgIC8qIENoZWNrIGlmIGEgcmVjZWl2ZSBwcm9jZXNzIGlzIG9uZ29pbmcgb3Igbm90ICovCiAgICAgIGlmKGhzd3BtaS0+U3RhdGUgPT0gSEFMX1NXUE1JX1NUQVRFX0JVU1lfVFhfUlgpCiAgICAgIHsKICAgICAgICBoc3dwbWktPlN0YXRlID0gSEFMX1NXUE1JX1NUQVRFX0JVU1lfUlg7CiAgICAgIH0KICAgICAgZWxzZQogICAgICB7CiAgICAgICAgaHN3cG1pLT5TdGF0ZSA9IEhBTF9TV1BNSV9TVEFURV9SRUFEWTsKICAgICAgfQoKI2lmIChVU0VfSEFMX1NXUE1JX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQogICAgICBoc3dwbWktPlR4Q3BsdENhbGxiYWNrKGhzd3BtaSk7CiNlbHNlCiAgICAgIEhBTF9TV1BNSV9UeENwbHRDYWxsYmFjayhoc3dwbWkpOwojZW5kaWYKICAgIH0KICB9CiAgLyogRE1BIENpcmN1bGFyIG1vZGUgKi8KICBlbHNlCiAgewojaWYgKFVTRV9IQUxfU1dQTUlfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCiAgICBoc3dwbWktPlR4Q3BsdENhbGxiYWNrKGhzd3BtaSk7CiNlbHNlCiAgICBIQUxfU1dQTUlfVHhDcGx0Q2FsbGJhY2soaHN3cG1pKTsKI2VuZGlmCiAgfQp9CgovKioKICAqIEBicmllZiBETUEgU1dQTUkgdHJhbnNtaXQgcHJvY2VzcyBoYWxmIGNvbXBsZXRlIGNhbGxiYWNrLgogICogQHBhcmFtIGhkbWEgRE1BIGhhbmRsZQogICogQHJldHZhbCBOb25lCiAgKi8Kc3RhdGljIHZvaWQgU1dQTUlfRE1BVHhIYWxmQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKewogIFNXUE1JX0hhbmRsZVR5cGVEZWYqIGhzd3BtaSA9IChTV1BNSV9IYW5kbGVUeXBlRGVmKikoKERNQV9IYW5kbGVUeXBlRGVmKiloZG1hKS0+UGFyZW50OwoKI2lmIChVU0VfSEFMX1NXUE1JX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQogIGhzd3BtaS0+VHhIYWxmQ3BsdENhbGxiYWNrKGhzd3BtaSk7CiNlbHNlCiAgSEFMX1NXUE1JX1R4SGFsZkNwbHRDYWxsYmFjayhoc3dwbWkpOwojZW5kaWYKfQoKCi8qKgogICogQGJyaWVmIERNQSBTV1BNSSByZWNlaXZlIHByb2Nlc3MgY29tcGxldGUgY2FsbGJhY2suCiAgKiBAcGFyYW0gaGRtYSBETUEgaGFuZGxlCiAgKiBAcmV0dmFsIE5vbmUKICAqLwpzdGF0aWMgdm9pZCBTV1BNSV9ETUFSZWNlaXZlQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKewogIFNXUE1JX0hhbmRsZVR5cGVEZWYqIGhzd3BtaSA9ICggU1dQTUlfSGFuZGxlVHlwZURlZiogKSgoRE1BX0hhbmRsZVR5cGVEZWYqICloZG1hKS0+UGFyZW50OwoKICAvKiBETUEgTm9ybWFsIG1vZGUqLwogIGlmKChoZG1hLT5JbnN0YW5jZS0+Q0NSICYgRE1BX0NDUl9DSVJDKSA9PSAwVSkKICB7CiAgICBoc3dwbWktPlJ4WGZlckNvdW50ID0gMFU7CgogICAgLyogRGlzYWJsZSB0aGUgRE1BIHRyYW5zZmVyIGZvciB0aGUgcmVjZWl2ZXIgcmVxdWVzdCBieSBzZXR0aW5nIHRoZSBSWERNQSBiaXQKICAgIGluIHRoZSBTV1BNSSBDUiByZWdpc3RlciAqLwogICAgQ0xFQVJfQklUKGhzd3BtaS0+SW5zdGFuY2UtPkNSLCBTV1BNSV9DUl9SWERNQSk7CgogICAgLyogQ2hlY2sgaWYgYSB0cmFuc21pdCBQcm9jZXNzIGlzIG9uZ29pbmcgb3Igbm90ICovCiAgICBpZihoc3dwbWktPlN0YXRlID09IEhBTF9TV1BNSV9TVEFURV9CVVNZX1RYX1JYKQogICAgewogICAgICBoc3dwbWktPlN0YXRlID0gSEFMX1NXUE1JX1NUQVRFX0JVU1lfVFg7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgIGhzd3BtaS0+U3RhdGUgPSBIQUxfU1dQTUlfU1RBVEVfUkVBRFk7CiAgICB9CiAgfQojaWYgKFVTRV9IQUxfU1dQTUlfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCiAgaHN3cG1pLT5SeENwbHRDYWxsYmFjayhoc3dwbWkpOwojZWxzZQogIEhBTF9TV1BNSV9SeENwbHRDYWxsYmFjayhoc3dwbWkpOwojZW5kaWYKfQoKLyoqCiAgKiBAYnJpZWYgRE1BIFNXUE1JIHJlY2VpdmUgcHJvY2VzcyBoYWxmIGNvbXBsZXRlIGNhbGxiYWNrLgogICogQHBhcmFtIGhkbWEgRE1BIGhhbmRsZQogICogQHJldHZhbCBOb25lCiAgKi8Kc3RhdGljIHZvaWQgU1dQTUlfRE1BUnhIYWxmQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKewogIFNXUE1JX0hhbmRsZVR5cGVEZWYqIGhzd3BtaSA9IChTV1BNSV9IYW5kbGVUeXBlRGVmKikoKERNQV9IYW5kbGVUeXBlRGVmKiloZG1hKS0+UGFyZW50OwoKI2lmIChVU0VfSEFMX1NXUE1JX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQogIGhzd3BtaS0+UnhIYWxmQ3BsdENhbGxiYWNrKGhzd3BtaSk7CiNlbHNlCiAgSEFMX1NXUE1JX1J4SGFsZkNwbHRDYWxsYmFjayhoc3dwbWkpOwojZW5kaWYKfQoKLyoqCiAgKiBAYnJpZWYgRE1BIFNXUE1JIGNvbW11bmljYXRpb24gZXJyb3IgY2FsbGJhY2suCiAgKiBAcGFyYW0gaGRtYSBETUEgaGFuZGxlCiAgKiBAcmV0dmFsIE5vbmUKICAqLwpzdGF0aWMgdm9pZCBTV1BNSV9ETUFFcnJvcihETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkKewogIFNXUE1JX0hhbmRsZVR5cGVEZWYqIGhzd3BtaSA9ICggU1dQTUlfSGFuZGxlVHlwZURlZiogKSgoRE1BX0hhbmRsZVR5cGVEZWYqICloZG1hKS0+UGFyZW50OwoKICAvKiBVcGRhdGUgaGFuZGxlICovCiAgaHN3cG1pLT5SeFhmZXJDb3VudCA9IDBVOwogIGhzd3BtaS0+VHhYZmVyQ291bnQgPSAwVTsKICBoc3dwbWktPlN0YXRlPSBIQUxfU1dQTUlfU1RBVEVfUkVBRFk7CiAgaHN3cG1pLT5FcnJvckNvZGUgfD0gSEFMX1NXUE1JX0VSUk9SX0RNQTsKCiNpZiAoVVNFX0hBTF9TV1BNSV9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKICBoc3dwbWktPkVycm9yQ2FsbGJhY2soaHN3cG1pKTsKI2Vsc2UKICBIQUxfU1dQTUlfRXJyb3JDYWxsYmFjayhoc3dwbWkpOwojZW5kaWYKfQoKLyoqCiAgKiBAYnJpZWYgRE1BIFNXUE1JIGNvbW11bmljYXRpb24gYWJvcnQgY2FsbGJhY2suCiAgKiBAcGFyYW0gaGRtYSBETUEgaGFuZGxlCiAgKiBAcmV0dmFsIE5vbmUKICAqLwpzdGF0aWMgdm9pZCBTV1BNSV9ETUFBYm9ydE9uRXJyb3IoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpCnsKICBTV1BNSV9IYW5kbGVUeXBlRGVmKiBoc3dwbWkgPSAoIFNXUE1JX0hhbmRsZVR5cGVEZWYqICkoKERNQV9IYW5kbGVUeXBlRGVmKiApaGRtYSktPlBhcmVudDsKCiAgLyogVXBkYXRlIGhhbmRsZSAqLwogIGhzd3BtaS0+UnhYZmVyQ291bnQgPSAwVTsKICBoc3dwbWktPlR4WGZlckNvdW50ID0gMFU7CiAgaHN3cG1pLT5TdGF0ZT0gSEFMX1NXUE1JX1NUQVRFX1JFQURZOwoKI2lmIChVU0VfSEFMX1NXUE1JX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQogIGhzd3BtaS0+RXJyb3JDYWxsYmFjayhoc3dwbWkpOwojZWxzZQogIEhBTF9TV1BNSV9FcnJvckNhbGxiYWNrKGhzd3BtaSk7CiNlbmRpZgp9CgovKioKICAqIEBicmllZiAgSGFuZGxlIFNXUE1JIENvbW11bmljYXRpb24gVGltZW91dC4KICAqIEBwYXJhbSAgaHN3cG1pIFNXUE1JIGhhbmRsZQogICogQHBhcmFtICBGbGFnIHNwZWNpZmllcyB0aGUgU1dQTUkgZmxhZyB0byBjaGVjay4KICAqIEBwYXJhbSAgVGlja3N0YXJ0IFRpY2sgc3RhcnQgdmFsdWUKICAqIEBwYXJhbSAgVGltZW91dCB0aW1lb3V0IGR1cmF0aW9uLgogICogQHJldHZhbCBIQUwgc3RhdHVzCiAgKi8Kc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIFNXUE1JX1dhaXRPbkZsYWdTZXRVbnRpbFRpbWVvdXQoU1dQTUlfSGFuZGxlVHlwZURlZiAqaHN3cG1pLCB1aW50MzJfdCBGbGFnLCB1aW50MzJfdCBUaWNrc3RhcnQsIHVpbnQzMl90IFRpbWVvdXQpCnsKICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CgogIC8qIFdhaXQgdW50aWwgZmxhZyBpcyBzZXQgKi8KICB3aGlsZSghKEhBTF9JU19CSVRfU0VUKGhzd3BtaS0+SW5zdGFuY2UtPklTUiwgRmxhZykpKQogIHsKICAgIC8qIENoZWNrIGZvciB0aGUgVGltZW91dCAqLwogICAgaWYgKCgoKEhBTF9HZXRUaWNrKCkgLSBUaWNrc3RhcnQpID4gIFRpbWVvdXQpICYmIChUaW1lb3V0ICE9IEhBTF9NQVhfREVMQVkpKSB8fCAoVGltZW91dCA9PSAwVSkpCiAgICB7CiAgICAgIC8qIFNldCB0aGUgU1dQTUkgc3RhdGUgcmVhZHkgdG8gYmUgYWJsZSB0byBzdGFydCBhZ2FpbiB0aGUgcHJvY2VzcyAqLwogICAgICBoc3dwbWktPlN0YXRlID0gSEFMX1NXUE1JX1NUQVRFX1JFQURZOwoKICAgICAgc3RhdHVzID0gSEFMX1RJTUVPVVQ7CiAgICAgIGJyZWFrOwogICAgfQogIH0KCiAgcmV0dXJuIHN0YXR1czsKfQoKLyoqCiAgKiBAfQogICovCgojZW5kaWYgLyogSEFMX1NXUE1JX01PRFVMRV9FTkFCTEVEICovCgovKioKICAqIEB9CiAgKi8KCiNlbmRpZiAvKiBTV1BNSTEgKi8KCi8qKgogICogQH0KICAqLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8K