LyoqDQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAqIEBmaWxlICAgIHN0bTMybDR4eF9oYWxfZG1hMmQuYw0KICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtDQogICogQHZlcnNpb24gVjEuNy4xDQogICogQGRhdGUgICAgMjEtQXByaWwtMjAxNw0KICAqIEBicmllZiAgIERNQTJEIEhBTCBtb2R1bGUgZHJpdmVyLg0KICAqICAgICAgICAgIFRoaXMgZmlsZSBwcm92aWRlcyBmaXJtd2FyZSBmdW5jdGlvbnMgdG8gbWFuYWdlIHRoZSBmb2xsb3dpbmcgDQogICogICAgICAgICAgZnVuY3Rpb25hbGl0aWVzIG9mIHRoZSBETUEyRCBwZXJpcGhlcmFsOg0KICAqICAgICAgICAgICArIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMNCiAgKiAgICAgICAgICAgKyBJTyBvcGVyYXRpb24gZnVuY3Rpb25zDQogICogICAgICAgICAgICsgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucyANCiAgKiAgICAgICAgICAgKyBQZXJpcGhlcmFsIFN0YXRlIGFuZCBFcnJvcnMgZnVuY3Rpb25zDQogICoNCiAgQHZlcmJhdGltIA0KICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCiAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIEhvdyB0byB1c2UgdGhpcyBkcml2ZXIgIyMjIyMNCiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQogICAgWy4uXQ0KICAgICAgKCMpIFByb2dyYW0gdGhlIHJlcXVpcmVkIGNvbmZpZ3VyYXRpb24gdGhyb3VnaCB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnM6ICAgDQogICAgICAgICAgdGhlIHRyYW5zZmVyIG1vZGUsIHRoZSBvdXRwdXQgY29sb3IgbW9kZSBhbmQgdGhlIG91dHB1dCBvZmZzZXQgdXNpbmcgDQogICAgICAgICAgSEFMX0RNQTJEX0luaXQoKSBmdW5jdGlvbi4NCg0KICAgICAgKCMpIFByb2dyYW0gdGhlIHJlcXVpcmVkIGNvbmZpZ3VyYXRpb24gdGhyb3VnaCB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnM6ICAgDQogICAgICAgICAgdGhlIGlucHV0IGNvbG9yIG1vZGUsIHRoZSBpbnB1dCBjb2xvciwgdGhlIGlucHV0IGFscGhhIHZhbHVlLCB0aGUgYWxwaGEgbW9kZSwNCiAgICAgICAgICB0aGUgcmVkL2JsdWUgc3dhcCBtb2RlLCB0aGUgaW52ZXJ0ZWQgYWxwaGEgbW9kZSBhbmQgdGhlIGlucHV0IG9mZnNldCB1c2luZyANCiAgICAgICAgICBIQUxfRE1BMkRfQ29uZmlnTGF5ZXIoKSBmdW5jdGlvbiBmb3IgZm9yZWdyb3VuZCBvci9hbmQgYmFja2dyb3VuZCBsYXllci4NCiAgICAgICAgICANCiAgICAgKioqIFBvbGxpbmcgbW9kZSBJTyBvcGVyYXRpb24gKioqDQogICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAgIA0KICAgIFsuLl0gICAgICAgIA0KICAgICAgICgjKSBDb25maWd1cmUgcGRhdGEgcGFyYW1ldGVyIChleHBsYWluZWQgaGVyZWFmdGVyKSwgZGVzdGluYXRpb24gYW5kIGRhdGEgbGVuZ3RoIA0KICAgICAgICAgICBhbmQgZW5hYmxlIHRoZSB0cmFuc2ZlciB1c2luZyBIQUxfRE1BMkRfU3RhcnQoKS4gDQogICAgICAgKCMpIFdhaXQgZm9yIGVuZCBvZiB0cmFuc2ZlciB1c2luZyBIQUxfRE1BMkRfUG9sbEZvclRyYW5zZmVyKCksIGF0IHRoaXMgc3RhZ2UNCiAgICAgICAgICAgdXNlciBjYW4gc3BlY2lmeSB0aGUgdmFsdWUgb2YgdGltZW91dCBhY2NvcmRpbmcgdG8gaGlzIGVuZCBhcHBsaWNhdGlvbi4NCiAgICAgICAgICAgICAgIA0KICAgICAqKiogSW50ZXJydXB0IG1vZGUgSU8gb3BlcmF0aW9uICoqKiAgICANCiAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCiAgICAgWy4uXSANCiAgICAgICAoIykgQ29uZmlndXJlIHBkYXRhIHBhcmFtZXRlciwgZGVzdGluYXRpb24gYW5kIGRhdGEgbGVuZ3RoIGFuZCBlbmFibGUgDQogICAgICAgICAgIHRoZSB0cmFuc2ZlciB1c2luZyBIQUxfRE1BMkRfU3RhcnRfSVQoKS4gDQogICAgICAgKCMpIFVzZSBIQUxfRE1BMkRfSVJRSGFuZGxlcigpIGNhbGxlZCB1bmRlciBETUEyRF9JUlFIYW5kbGVyKCkgaW50ZXJydXB0IHN1YnJvdXRpbmUuDQogICAgICAgKCMpIEF0IHRoZSBlbmQgb2YgZGF0YSB0cmFuc2ZlciBIQUxfRE1BMkRfSVJRSGFuZGxlcigpIGZ1bmN0aW9uIGlzIGV4ZWN1dGVkIGFuZCB1c2VyIGNhbiANCiAgICAgICAgICAgYWRkIGhpcyBvd24gZnVuY3Rpb24gYnkgY3VzdG9taXphdGlvbiBvZiBmdW5jdGlvbiBwb2ludGVyIFhmZXJDcGx0Q2FsbGJhY2sgKG1lbWJlciANCiAgICAgICAgICAgb2YgRE1BMkQgaGFuZGxlIHN0cnVjdHVyZSkuIA0KICAgICAgICgjKSBJbiBjYXNlIG9mIGVycm9yLCB0aGUgSEFMX0RNQTJEX0lSUUhhbmRsZXIoKSBmdW5jdGlvbiBjYWxscyB0aGUgY2FsbGJhY2sgDQogICAgICAgICAgIFhmZXJFcnJvckNhbGxiYWNrLiAgICAgICAgICAgIA0KDQogICAgICAgICAtQC0gICBJbiBSZWdpc3Rlci10by1NZW1vcnkgdHJhbnNmZXIgbW9kZSwgcGRhdGEgcGFyYW1ldGVyIGlzIHRoZSByZWdpc3Rlcg0KICAgICAgICAgICAgICAgY29sb3IsIGluIE1lbW9yeS10by1tZW1vcnkgb3IgTWVtb3J5LXRvLU1lbW9yeSB3aXRoIHBpeGVsIGZvcm1hdA0KICAgICAgICAgICAgICAgY29udmVyc2lvbiBwZGF0YSBpcyB0aGUgc291cmNlIGFkZHJlc3MuDQoNCiAgICAgICAgIC1ALSAgIENvbmZpZ3VyZSB0aGUgZm9yZWdyb3VuZCBzb3VyY2UgYWRkcmVzcywgdGhlIGJhY2tncm91bmQgc291cmNlIGFkZHJlc3MsIA0KICAgICAgICAgICAgICAgdGhlIGRlc3RpbmF0aW9uIGFuZCBkYXRhIGxlbmd0aCB0aGVuIEVuYWJsZSB0aGUgdHJhbnNmZXIgdXNpbmcgDQogICAgICAgICAgICAgICBIQUxfRE1BMkRfQmxlbmRpbmdTdGFydCgpIGluIHBvbGxpbmcgbW9kZSBhbmQgSEFMX0RNQTJEX0JsZW5kaW5nU3RhcnRfSVQoKQ0KICAgICAgICAgICAgICAgaW4gaW50ZXJydXB0IG1vZGUuDQogICAgICAgICAgICAgICANCiAgICAgICAgIC1ALSAgIEhBTF9ETUEyRF9CbGVuZGluZ1N0YXJ0KCkgYW5kIEhBTF9ETUEyRF9CbGVuZGluZ1N0YXJ0X0lUKCkgZnVuY3Rpb25zDQogICAgICAgICAgICAgICBhcmUgdXNlZCBpZiB0aGUgbWVtb3J5IHRvIG1lbW9yeSB3aXRoIGJsZW5kaW5nIHRyYW5zZmVyIG1vZGUgaXMgc2VsZWN0ZWQuDQogICAgICAgICAgICAgICAgICAgDQogICAgICAoIykgT3B0aW9uYWxseSwgY29uZmlndXJlIGFuZCBlbmFibGUgdGhlIENMVVQgdXNpbmcgSEFMX0RNQTJEX0NMVVRMb2FkKCkgaW4gcG9sbGluZw0KICAgICAgICAgIG1vZGUgb3IgSEFMX0RNQTJEX0NMVVRMb2FkX0lUKCkgaW4gaW50ZXJydXB0IG1vZGUuDQoNCiAgICAgICgjKSBPcHRpb25hbGx5LCBjb25maWd1cmUgdGhlIGxpbmUgd2F0ZXJtYXJrIGluIHVzaW5nIHRoZSBBUEkgSEFMX0RNQTJEX1Byb2dyYW1MaW5lRXZlbnQoKS4NCiAgICAgICAgICANCiAgICAgICgjKSBPcHRpb25hbGx5LCBjb25maWd1cmUgdGhlIGRlYWQgdGltZSB2YWx1ZSBpbiB0aGUgQUhCIGNsb2NrIGN5Y2xlIGluc2VydGVkIGJldHdlZW4gdHdvIA0KICAgICAgICAgIGNvbnNlY3V0aXZlIGFjY2Vzc2VzIG9uIHRoZSBBSEIgbWFzdGVyIHBvcnQgaW4gdXNpbmcgdGhlIEFQSSBIQUxfRE1BMkRfQ29uZmlnRGVhZFRpbWUoKQ0KICAgICAgICAgIGFuZCBlbmFibGUvZGlzYWJsZSB0aGUgZnVuY3Rpb25hbGl0eSAgd2l0aCB0aGUgQVBJcyBIQUxfRE1BMkRfRW5hYmxlRGVhZFRpbWUoKSBvcg0KICAgICAgICAgIEhBTF9ETUEyRF9EaXNhYmxlRGVhZFRpbWUoKS4gICAgICAgICAgDQogICANCiAgICAgICgjKSBUaGUgdHJhbnNmZXIgY2FuIGJlIHN1c3BlbmRlZCwgcmVzdW1lZCBhbmQgYWJvcnRlZCB1c2luZyB0aGUgZm9sbG93aW5nDQogICAgICAgICAgZnVuY3Rpb25zOiBIQUxfRE1BMkRfU3VzcGVuZCgpLCBIQUxfRE1BMkRfUmVzdW1lKCksIEhBTF9ETUEyRF9BYm9ydCgpLg0KICAgICAgICAgIA0KICAgICAgKCMpIFRoZSBDTFVUIGxvYWRpbmcgY2FuIGJlIHN1c3BlbmRlZCwgcmVzdW1lZCBhbmQgYWJvcnRlZCB1c2luZyB0aGUgZm9sbG93aW5nDQogICAgICAgICAgZnVuY3Rpb25zOiBIQUxfRE1BMkRfQ0xVVExvYWRpbmdfU3VzcGVuZCgpLCBIQUxfRE1BMkRfQ0xVVExvYWRpbmdfUmVzdW1lKCksIA0KICAgICAgICAgIEhBTF9ETUEyRF9DTFVUTG9hZGluZ19BYm9ydCgpLiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgKCMpIFRvIGNvbnRyb2wgdGhlIERNQTJEIHN0YXRlLCB1c2UgdGhlIGZvbGxvd2luZyBmdW5jdGlvbjogSEFMX0RNQTJEX0dldFN0YXRlKCkuICAgDQogICAgICANCiAgICAgICgjKSBUbyByZWFkIHRoZSBETUEyRCBlcnJvciBjb2RlLCB1c2UgdGhlIGZvbGxvd2luZyBmdW5jdGlvbjogSEFMX0RNQTJEX0dldEVycm9yKCkuICAgICAgICAgICAgICAgICAgICAgICAgIA0KDQogICAgICoqKiBETUEyRCBIQUwgZHJpdmVyIG1hY3JvcyBsaXN0ICoqKg0KICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gDQogICAgIFsuLl0NCiAgICAgICBCZWxvdyB0aGUgbGlzdCBvZiBtb3N0IHVzZWQgbWFjcm9zIGluIERNQTJEIEhBTCBkcml2ZXIgOg0KICAgICAgIA0KICAgICAgKCspIF9fSEFMX0RNQTJEX0VOQUJMRTogRW5hYmxlIHRoZSBETUEyRCBwZXJpcGhlcmFsLg0KICAgICAgKCspIF9fSEFMX0RNQTJEX0dFVF9GTEFHOiBHZXQgdGhlIERNQTJEIHBlbmRpbmcgZmxhZ3MuDQogICAgICAoKykgX19IQUxfRE1BMkRfQ0xFQVJfRkxBRzogQ2xlYXIgdGhlIERNQTJEIHBlbmRpbmcgZmxhZ3MuDQogICAgICAoKykgX19IQUxfRE1BMkRfRU5BQkxFX0lUOiBFbmFibGUgdGhlIHNwZWNpZmllZCBETUEyRCBpbnRlcnJ1cHRzLg0KICAgICAgKCspIF9fSEFMX0RNQTJEX0RJU0FCTEVfSVQ6IERpc2FibGUgdGhlIHNwZWNpZmllZCBETUEyRCBpbnRlcnJ1cHRzLg0KICAgICAgKCspIF9fSEFMX0RNQTJEX0dFVF9JVF9TT1VSQ0U6IENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBETUEyRCBpbnRlcnJ1cHQgaXMgZW5hYmxlZCBvciBub3QuICAgICANCiAgICAgDQogICAgIFsuLl0gDQogICAgICAoQCkgWW91IGNhbiByZWZlciB0byB0aGUgRE1BMkQgSEFMIGRyaXZlciBoZWFkZXIgZmlsZSBmb3IgbW9yZSB1c2VmdWwgbWFjcm9zDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEBlbmR2ZXJiYXRpbQ0KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAgKiBAYXR0ZW50aW9uDQogICoNCiAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ09QWVJJR0hUKGMpIDIwMTcgU1RNaWNyb2VsZWN0cm9uaWNzPC9jZW50ZXI+PC9oMj4NCiAgKg0KICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sDQogICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0Og0KICAqICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLA0KICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4NCiAgKiAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwNCiAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24NCiAgKiAgICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLg0KICAqICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTVE1pY3JvZWxlY3Ryb25pY3Mgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzDQogICogICAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUNCiAgKiAgICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KICAqDQogICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiDQogICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQ0KICAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQ0KICAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUNCiAgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTA0KICAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SDQogICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVINCiAgKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLA0KICAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFDQogICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCiAgKg0KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAgKi8gDQoNCi8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQojaW5jbHVkZSAic3RtMzJsNHh4X2hhbC5oIg0KDQojaWZkZWYgSEFMX0RNQTJEX01PRFVMRV9FTkFCTEVEDQoNCiNpZiBkZWZpbmVkKFNUTTMyTDQ5Nnh4KSB8fCBkZWZpbmVkKFNUTTMyTDRBNnh4KQ0KDQovKiogQGFkZHRvZ3JvdXAgU1RNMzJMNHh4X0hBTF9Ecml2ZXINCiAgKiBAew0KICAqLw0KDQovKiogQGRlZmdyb3VwIERNQTJEICBETUEyRA0KICAqIEBicmllZiBETUEyRCBIQUwgbW9kdWxlIGRyaXZlcg0KICAqIEB7DQogICovDQoNCi8qIFByaXZhdGUgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiBQcml2YXRlIGRlZmluZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyoqIEBkZWZncm91cCBETUEyRF9Qcml2YXRlX0NvbnN0YW50cyBETUEyRCBQcml2YXRlIENvbnN0YW50cw0KICAqIEB7DQogICovDQogIA0KLyoqIEBkZWZncm91cCBETUEyRF9UaW1lT3V0IERNQTJEIFRpbWUgT3V0IA0KICAqIEB7DQogICovICANCiNkZWZpbmUgRE1BMkRfVElNRU9VVF9BQk9SVCAgICAgICAgICAgKCh1aW50MzJfdCkxMDAwKSAgLyohPCAgMXMgICovDQojZGVmaW5lIERNQTJEX1RJTUVPVVRfU1VTUEVORCAgICAgICAgICgodWludDMyX3QpMTAwMCkgIC8qITwgIDFzICAqLw0KLyoqDQogICogQH0NCiAgKi8NCg0KLyoqIEBkZWZncm91cCBETUEyRF9TaGlmdHMgRE1BMkQgU2hpZnRzIA0KICAqIEB7DQogICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQojZGVmaW5lIERNQTJEX1BPU0lUSU9OX0ZHUEZDQ1JfQ1MgICAgICh1aW50MzJfdClQT1NJVElPTl9WQUwoRE1BMkRfRkdQRkNDUl9DUykgICAgLyohPCBSZXF1aXJlZCBsZWZ0IHNoaWZ0IHRvIHNldCBmb3JlZ3JvdW5kIENMVVQgc2l6ZSAqLw0KI2RlZmluZSBETUEyRF9QT1NJVElPTl9CR1BGQ0NSX0NTICAgICAodWludDMyX3QpUE9TSVRJT05fVkFMKERNQTJEX0JHUEZDQ1JfQ1MpICAgIC8qITwgUmVxdWlyZWQgbGVmdCBzaGlmdCB0byBzZXQgYmFja2dyb3VuZCBDTFVUIHNpemUgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KI2RlZmluZSBETUEyRF9QT1NJVElPTl9GR1BGQ0NSX0NDTSAgICAodWludDMyX3QpUE9TSVRJT05fVkFMKERNQTJEX0ZHUEZDQ1JfQ0NNKSAgIC8qITwgUmVxdWlyZWQgbGVmdCBzaGlmdCB0byBzZXQgZm9yZWdyb3VuZCBDTFVUIGNvbG9yIG1vZGUgKi8NCiNkZWZpbmUgRE1BMkRfUE9TSVRJT05fQkdQRkNDUl9DQ00gICAgKHVpbnQzMl90KVBPU0lUSU9OX1ZBTChETUEyRF9CR1BGQ0NSX0NDTSkgICAvKiE8IFJlcXVpcmVkIGxlZnQgc2hpZnQgdG8gc2V0IGJhY2tncm91bmQgQ0xVVCBjb2xvciBtb2RlICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiNkZWZpbmUgRE1BMkRfUE9TSVRJT05fT1BGQ0NSX0FJICAgICAgKHVpbnQzMl90KVBPU0lUSU9OX1ZBTChETUEyRF9PUEZDQ1JfQUkpICAgICAvKiE8IFJlcXVpcmVkIGxlZnQgc2hpZnQgdG8gc2V0IG91dHB1dCBhbHBoYSBpbnZlcnNpb24gICAgICovDQojZGVmaW5lIERNQTJEX1BPU0lUSU9OX0ZHUEZDQ1JfQUkgICAgICh1aW50MzJfdClQT1NJVElPTl9WQUwoRE1BMkRfRkdQRkNDUl9BSSkgICAgLyohPCBSZXF1aXJlZCBsZWZ0IHNoaWZ0IHRvIHNldCBmb3JlZ3JvdW5kIGFscGhhIGludmVyc2lvbiAqLyANCiNkZWZpbmUgRE1BMkRfUE9TSVRJT05fQkdQRkNDUl9BSSAgICAgKHVpbnQzMl90KVBPU0lUSU9OX1ZBTChETUEyRF9CR1BGQ0NSX0FJKSAgICAvKiE8IFJlcXVpcmVkIGxlZnQgc2hpZnQgdG8gc2V0IGJhY2tncm91bmQgYWxwaGEgaW52ZXJzaW9uICovIA0KDQojZGVmaW5lIERNQTJEX1BPU0lUSU9OX09QRkNDUl9SQlMgICAgICh1aW50MzJfdClQT1NJVElPTl9WQUwoRE1BMkRfT1BGQ0NSX1JCUykgICAgLyohPCBSZXF1aXJlZCBsZWZ0IHNoaWZ0IHRvIHNldCBvdXRwdXQgUmVkL0JsdWUgc3dhcCAgICAgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiNkZWZpbmUgRE1BMkRfUE9TSVRJT05fRkdQRkNDUl9SQlMgICAgKHVpbnQzMl90KVBPU0lUSU9OX1ZBTChETUEyRF9GR1BGQ0NSX1JCUykgICAvKiE8IFJlcXVpcmVkIGxlZnQgc2hpZnQgdG8gc2V0IGZvcmVncm91bmQgUmVkL0JsdWUgc3dhcCAqLw0KI2RlZmluZSBETUEyRF9QT1NJVElPTl9CR1BGQ0NSX1JCUyAgICAodWludDMyX3QpUE9TSVRJT05fVkFMKERNQTJEX0JHUEZDQ1JfUkJTKSAgIC8qITwgUmVxdWlyZWQgbGVmdCBzaGlmdCB0byBzZXQgYmFja2dyb3VuZCBSZWQvQmx1ZSBzd2FwICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiNkZWZpbmUgRE1BMkRfUE9TSVRJT05fQU1UQ1JfRFQgICAgICAgKHVpbnQzMl90KVBPU0lUSU9OX1ZBTChETUEyRF9BTVRDUl9EVCkgICAgICAvKiE8IFJlcXVpcmVkIGxlZnQgc2hpZnQgdG8gc2V0IGRlYWR0aW1lIHZhbHVlICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiNkZWZpbmUgRE1BMkRfUE9TSVRJT05fRkdQRkNDUl9BTSAgICAgKHVpbnQzMl90KVBPU0lUSU9OX1ZBTChETUEyRF9GR1BGQ0NSX0FNKSAgICAvKiE8IFJlcXVpcmVkIGxlZnQgc2hpZnQgdG8gc2V0IGZvcmVncm91bmQgYWxwaGEgbW9kZSAqLw0KI2RlZmluZSBETUEyRF9QT1NJVElPTl9CR1BGQ0NSX0FNICAgICAodWludDMyX3QpUE9TSVRJT05fVkFMKERNQTJEX0JHUEZDQ1JfQU0pICAgIC8qITwgUmVxdWlyZWQgbGVmdCBzaGlmdCB0byBzZXQgYmFja2dyb3VuZCBhbHBoYSBtb2RlICovDQoNCiNkZWZpbmUgRE1BMkRfUE9TSVRJT05fRkdQRkNDUl9BTFBIQSAgKHVpbnQzMl90KVBPU0lUSU9OX1ZBTChETUEyRF9GR1BGQ0NSX0FMUEhBKSAvKiE8IFJlcXVpcmVkIGxlZnQgc2hpZnQgdG8gc2V0IGZvcmVncm91bmQgYWxwaGEgdmFsdWUgKi8NCiNkZWZpbmUgRE1BMkRfUE9TSVRJT05fQkdQRkNDUl9BTFBIQSAgKHVpbnQzMl90KVBPU0lUSU9OX1ZBTChETUEyRF9CR1BGQ0NSX0FMUEhBKSAvKiE8IFJlcXVpcmVkIGxlZnQgc2hpZnQgdG8gc2V0IGJhY2tncm91bmQgYWxwaGEgdmFsdWUgKi8NCg0KI2RlZmluZSBETUEyRF9QT1NJVElPTl9OTFJfUEwgICAgICAgICAodWludDMyX3QpUE9TSVRJT05fVkFMKERNQTJEX05MUl9QTCkgICAgICAgIC8qITwgUmVxdWlyZWQgbGVmdCBzaGlmdCB0byBzZXQgcGl4ZWxzIHBlciBsaW5lcyB2YWx1ZSAqLw0KLyoqDQogICogQH0NCiAgKi8NCg0KLyoqDQogICogQH0NCiAgKi8NCg0KLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiBQcml2YXRlIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qKiBAYWRkdG9ncm91cCBETUEyRF9Qcml2YXRlX0Z1bmN0aW9ucyBETUEyRCBQcml2YXRlIEZ1bmN0aW9ucw0KICAqIEB7DQogICovDQpzdGF0aWMgdm9pZCBETUEyRF9TZXRDb25maWcoRE1BMkRfSGFuZGxlVHlwZURlZiAqaGRtYTJkLCB1aW50MzJfdCBwZGF0YSwgdWludDMyX3QgRHN0QWRkcmVzcywgdWludDMyX3QgV2lkdGgsIHVpbnQzMl90IEhlaWdodCk7DQovKioNCiAgKiBAfQ0KICAqLw0KDQovKiBQcml2YXRlIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qKiBAZGVmZ3JvdXAgRE1BMkRfRXhwb3J0ZWRfRnVuY3Rpb25zIERNQTJEIEV4cG9ydGVkIEZ1bmN0aW9ucw0KICAqIEB7DQogICovDQoNCi8qKiBAZGVmZ3JvdXAgRE1BMkRfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBJbml0aWFsaXphdGlvbiBhbmQgZGUtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zDQogKiAgQGJyaWVmICAgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zDQogKg0KQHZlcmJhdGltICAgDQogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KICAgICAgICAgICAgICAgICMjIyMjIEluaXRpYWxpemF0aW9uIGFuZCBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucyAjIyMjIw0KID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gIA0KICAgIFsuLl0gIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86DQogICAgICAoKykgSW5pdGlhbGl6ZSBhbmQgY29uZmlndXJlIHRoZSBETUEyRA0KICAgICAgKCspIERlLWluaXRpYWxpemUgdGhlIERNQTJEIA0KDQpAZW5kdmVyYmF0aW0NCiAgKiBAew0KICAqLw0KICAgIA0KLyoqDQogICogQGJyaWVmICBJbml0aWFsaXplIHRoZSBETUEyRCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZA0KICAqICAgICAgICAgcGFyYW1ldGVycyBpbiB0aGUgRE1BMkRfSW5pdFR5cGVEZWYgYW5kIGNyZWF0ZSB0aGUgYXNzb2NpYXRlZCBoYW5kbGUuDQogICogQHBhcmFtICBoZG1hMmQ6IHBvaW50ZXIgdG8gYSBETUEyRF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zDQogICogICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgRE1BMkQuDQogICogQHJldHZhbCBIQUwgc3RhdHVzDQogICovDQpIQUxfU3RhdHVzVHlwZURlZiBIQUxfRE1BMkRfSW5pdChETUEyRF9IYW5kbGVUeXBlRGVmICpoZG1hMmQpDQp7IA0KICAvKiBDaGVjayB0aGUgRE1BMkQgcGVyaXBoZXJhbCBzdGF0ZSAqLw0KICBpZihoZG1hMmQgPT0gTlVMTCkNCiAgew0KICAgICByZXR1cm4gSEFMX0VSUk9SOw0KICB9DQoNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX0RNQTJEX0FMTF9JTlNUQU5DRShoZG1hMmQtPkluc3RhbmNlKSk7DQogIGFzc2VydF9wYXJhbShJU19ETUEyRF9NT0RFKGhkbWEyZC0+SW5pdC5Nb2RlKSk7DQogIGFzc2VydF9wYXJhbShJU19ETUEyRF9DTU9ERShoZG1hMmQtPkluaXQuQ29sb3JNb2RlKSk7DQogIGFzc2VydF9wYXJhbShJU19ETUEyRF9PRkZTRVQoaGRtYTJkLT5Jbml0Lk91dHB1dE9mZnNldCkpOw0KDQogIGlmKGhkbWEyZC0+U3RhdGUgPT0gSEFMX0RNQTJEX1NUQVRFX1JFU0VUKQ0KICB7DQogICAgLyogQWxsb2NhdGUgbG9jayByZXNvdXJjZSBhbmQgaW5pdGlhbGl6ZSBpdCAqLw0KICAgIGhkbWEyZC0+TG9jayA9IEhBTF9VTkxPQ0tFRDsNCiAgICAvKiBJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgKi8NCiAgICBIQUxfRE1BMkRfTXNwSW5pdChoZG1hMmQpOw0KICB9DQogIA0KICAvKiBDaGFuZ2UgRE1BMkQgcGVyaXBoZXJhbCBzdGF0ZSAqLw0KICBoZG1hMmQtPlN0YXRlID0gSEFMX0RNQTJEX1NUQVRFX0JVU1k7ICANCg0KICAvKiBETUEyRCBDUiByZWdpc3RlciBjb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KICBNT0RJRllfUkVHKGhkbWEyZC0+SW5zdGFuY2UtPkNSLCBETUEyRF9DUl9NT0RFLCBoZG1hMmQtPkluaXQuTW9kZSk7DQoNCiAgLyogRE1BMkQgT1BGQ0NSIHJlZ2lzdGVyIGNvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiAgTU9ESUZZX1JFRyhoZG1hMmQtPkluc3RhbmNlLT5PUEZDQ1IsIERNQTJEX09QRkNDUl9DTSwgaGRtYTJkLT5Jbml0LkNvbG9yTW9kZSk7DQoNCiAgLyogRE1BMkQgT09SIHJlZ2lzdGVyIGNvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiAgTU9ESUZZX1JFRyhoZG1hMmQtPkluc3RhbmNlLT5PT1IsIERNQTJEX09PUl9MTywgaGRtYTJkLT5Jbml0Lk91dHB1dE9mZnNldCk7DQogIA0KICAvKiBETUEyRCBPUEZDQ1IgUkJTIGFuZCBBSSBmaWVsZHMgc2V0dGluZyAqLw0KICBNT0RJRllfUkVHKGhkbWEyZC0+SW5zdGFuY2UtPk9QRkNDUiwgKERNQTJEX09QRkNDUl9BSXxETUEyRF9PUEZDQ1JfUkJTKSwgXA0KICAoKGhkbWEyZC0+SW5pdC5BbHBoYUludmVydGVkIDw8IERNQTJEX1BPU0lUSU9OX09QRkNDUl9BSSl8KGhkbWEyZC0+SW5pdC5SZWRCbHVlU3dhcCA8PCBETUEyRF9QT1NJVElPTl9PUEZDQ1JfUkJTKSkpOw0KDQogIC8qIFVwZGF0ZSBlcnJvciBjb2RlICovDQogIGhkbWEyZC0+RXJyb3JDb2RlID0gSEFMX0RNQTJEX0VSUk9SX05PTkU7DQoNCiAgLyogSW5pdGlhbGl6ZSB0aGUgRE1BMkQgc3RhdGUqLw0KICBoZG1hMmQtPlN0YXRlICA9IEhBTF9ETUEyRF9TVEFURV9SRUFEWTsNCg0KICByZXR1cm4gSEFMX09LOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIERlaW5pdGlhbGl6ZXMgdGhlIERNQTJEIHBlcmlwaGVyYWwgcmVnaXN0ZXJzIHRvIHRoZWlyIGRlZmF1bHQgcmVzZXQNCiAgKiAgICAgICAgIHZhbHVlcy4NCiAgKiBAcGFyYW0gIGhkbWEyZDogcG9pbnRlciB0byBhIERNQTJEX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMNCiAgKiAgICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBETUEyRC4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCg0KSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RNQTJEX0RlSW5pdChETUEyRF9IYW5kbGVUeXBlRGVmICpoZG1hMmQpDQp7DQogIA0KICAvKiBDaGVjayB0aGUgRE1BMkQgcGVyaXBoZXJhbCBzdGF0ZSAqLw0KICBpZihoZG1hMmQgPT0gTlVMTCkNCiAgew0KICAgICByZXR1cm4gSEFMX0VSUk9SOw0KICB9DQogIA0KICAvKiBCZWZvcmUgYWJvcnRpbmcgYW55IERNQTJEIHRyYW5zZmVyIG9yIENMVVQgbG9hZGluZywgY2hlY2sNCiAgICAgZmlyc3Qgd2hldGhlciBvciBub3QgRE1BMkQgY2xvY2sgaXMgZW5hYmxlZCAqLw0KICBpZiAoX19IQUxfUkNDX0RNQTJEX0lTX0NMS19FTkFCTEVEKCkpDQogIHsNCiAgICAvKiBBYm9ydCBETUEyRCB0cmFuc2ZlciBpZiBhbnkgKi8NCiAgICBpZiAoKGhkbWEyZC0+SW5zdGFuY2UtPkNSICYgRE1BMkRfQ1JfU1RBUlQpID09IERNQTJEX0NSX1NUQVJUKQ0KICAgIHsNCiAgICAgIGlmIChIQUxfRE1BMkRfQWJvcnQoaGRtYTJkKSAhPSBIQUxfT0spDQogICAgICB7DQogICAgICAgIC8qIElzc3VlIHdoZW4gYWJvcnRpbmcgRE1BMkQgdHJhbnNmZXIgKi8gICAgICAgDQogICAgICAgIHJldHVybiBIQUxfRVJST1I7DQogICAgICB9DQogICAgfQ0KICAgIGVsc2UNCiAgICB7DQogICAgICAvKiBBYm9ydCBiYWNrZ3JvdW5kIENMVVQgbG9hZGluZyBpZiBhbnkgKi8NCiAgICAgIGlmICgoaGRtYTJkLT5JbnN0YW5jZS0+QkdQRkNDUiAmIERNQTJEX0JHUEZDQ1JfU1RBUlQpID09IERNQTJEX0JHUEZDQ1JfU1RBUlQpDQogICAgICB7ICANCiAgICAgICAgaWYgKEhBTF9ETUEyRF9DTFVUTG9hZGluZ19BYm9ydChoZG1hMmQsIDApICE9IEhBTF9PSykgICAgICAgIA0KICAgICAgICB7DQogICAgICAgICAgLyogSXNzdWUgd2hlbiBhYm9ydGluZyBiYWNrZ3JvdW5kIENMVVQgbG9hZGluZyAqLyAgICAgDQogICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgZWxzZQ0KICAgICAgew0KICAgICAgICAvKiBBYm9ydCBmb3JlZ3JvdW5kIENMVVQgbG9hZGluZyBpZiBhbnkgKi8NCiAgICAgICAgaWYgKChoZG1hMmQtPkluc3RhbmNlLT5GR1BGQ0NSICYgRE1BMkRfRkdQRkNDUl9TVEFSVCkgPT0gRE1BMkRfRkdQRkNDUl9TVEFSVCkNCiAgICAgICAgew0KICAgICAgICAgIGlmIChIQUxfRE1BMkRfQ0xVVExvYWRpbmdfQWJvcnQoaGRtYTJkLCAxKSAhPSBIQUxfT0spICANCiAgICAgICAgICB7DQogICAgICAgICAgICAvKiBJc3N1ZSB3aGVuIGFib3J0aW5nIGZvcmVncm91bmQgQ0xVVCBsb2FkaW5nICovICAgICANCiAgICAgICAgICAgIHJldHVybiBIQUxfRVJST1I7DQogICAgICAgICAgfSAgICAgICAgDQogICAgICAgIH0NCiAgICAgIH0NCiAgICB9DQogIH0NCiAgDQogIC8qIFJlc2V0IERNQTJEIGNvbnRyb2wgcmVnaXN0ZXJzKi8NCiAgaGRtYTJkLT5JbnN0YW5jZS0+Q1IgPSAwOw0KICBoZG1hMmQtPkluc3RhbmNlLT5JRkNSID0gMHgzRjsNCiAgaGRtYTJkLT5JbnN0YW5jZS0+RkdPUiA9IDA7DQogIGhkbWEyZC0+SW5zdGFuY2UtPkJHT1IgPSAwOw0KICBoZG1hMmQtPkluc3RhbmNlLT5GR1BGQ0NSID0gMDsNCiAgaGRtYTJkLT5JbnN0YW5jZS0+QkdQRkNDUiA9IDA7DQogIGhkbWEyZC0+SW5zdGFuY2UtPk9QRkNDUiA9IDA7DQoNCiAgLyogQ2Fycnkgb24gd2l0aCBkZS1pbml0aWFsaXphdGlvbiBvZiBsb3cgbGV2ZWwgaGFyZHdhcmUgKi8NCiAgSEFMX0RNQTJEX01zcERlSW5pdChoZG1hMmQpOw0KICANCiAgLyogVXBkYXRlIGVycm9yIGNvZGUgKi8NCiAgaGRtYTJkLT5FcnJvckNvZGUgPSBIQUxfRE1BMkRfRVJST1JfTk9ORTsNCiAgDQogIC8qIEluaXRpYWxpemUgdGhlIERNQTJEIHN0YXRlKi8NCiAgaGRtYTJkLT5TdGF0ZSAgPSBIQUxfRE1BMkRfU1RBVEVfUkVTRVQ7DQogIA0KICAvKiBSZWxlYXNlIExvY2sgKi8NCiAgX19IQUxfVU5MT0NLKGhkbWEyZCk7DQogIA0KICByZXR1cm4gSEFMX09LOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIEluaXRpYWxpemVzIHRoZSBETUEyRCBNU1AuDQogICogQHBhcmFtICBoZG1hMmQ6IHBvaW50ZXIgdG8gYSBETUEyRF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zDQogICogICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgRE1BMkQuDQogICogQHJldHZhbCBOb25lDQogICovDQpfX3dlYWsgdm9pZCBIQUxfRE1BMkRfTXNwSW5pdChETUEyRF9IYW5kbGVUeXBlRGVmKiBoZG1hMmQpDQp7DQogIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8NCiAgVU5VU0VEKGhkbWEyZCk7DQoNCiAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZDsgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLA0KICAgICAgICAgICAgdGhlIEhBTF9ETUEyRF9Nc3BJbml0IGNhbiBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlLg0KICAgKi8NCn0NCg0KLyoqDQogICogQGJyaWVmICBEZUluaXRpYWxpemVzIHRoZSBETUEyRCBNU1AuDQogICogQHBhcmFtICBoZG1hMmQ6IHBvaW50ZXIgdG8gYSBETUEyRF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zDQogICogICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgRE1BMkQuDQogICogQHJldHZhbCBOb25lDQogICovDQpfX3dlYWsgdm9pZCBIQUxfRE1BMkRfTXNwRGVJbml0KERNQTJEX0hhbmRsZVR5cGVEZWYqIGhkbWEyZCkNCnsNCiAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLw0KICBVTlVTRUQoaGRtYTJkKTsNCg0KICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkOyB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsDQogICAgICAgICAgICB0aGUgSEFMX0RNQTJEX01zcERlSW5pdCBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZS4NCiAgICovDQp9DQoNCi8qKg0KICAqIEB9DQogICovDQoNCg0KLyoqIEBkZWZncm91cCBETUEyRF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMNCiAqICBAYnJpZWYgICBJTyBvcGVyYXRpb24gZnVuY3Rpb25zICANCiAqDQpAdmVyYmF0aW0gICANCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQogICAgICAgICAgICAgICAgICAgICAgIyMjIyMgIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMgICMjIyMjDQogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAgDQogICAgWy4uXSAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bzoNCiAgICAgICgrKSBDb25maWd1cmUgdGhlIHBkYXRhLCBkZXN0aW5hdGlvbiBhZGRyZXNzIGFuZCBkYXRhIHNpemUgdGhlbiANCiAgICAgICAgICBzdGFydCB0aGUgRE1BMkQgdHJhbnNmZXIuDQogICAgICAoKykgQ29uZmlndXJlIHRoZSBzb3VyY2UgZm9yIGZvcmVncm91bmQgYW5kIGJhY2tncm91bmQsIGRlc3RpbmF0aW9uIGFkZHJlc3MgDQogICAgICAgICAgYW5kIGRhdGEgc2l6ZSB0aGVuIHN0YXJ0IGEgTXVsdGlCdWZmZXIgRE1BMkQgdHJhbnNmZXIuDQogICAgICAoKykgQ29uZmlndXJlIHRoZSBwZGF0YSwgZGVzdGluYXRpb24gYWRkcmVzcyBhbmQgZGF0YSBzaXplIHRoZW4gDQogICAgICAgICAgc3RhcnQgdGhlIERNQTJEIHRyYW5zZmVyIHdpdGggaW50ZXJydXB0Lg0KICAgICAgKCspIENvbmZpZ3VyZSB0aGUgc291cmNlIGZvciBmb3JlZ3JvdW5kIGFuZCBiYWNrZ3JvdW5kLCBkZXN0aW5hdGlvbiBhZGRyZXNzIA0KICAgICAgICAgIGFuZCBkYXRhIHNpemUgdGhlbiBzdGFydCBhIE11bHRpQnVmZmVyIERNQTJEIHRyYW5zZmVyIHdpdGggaW50ZXJydXB0Lg0KICAgICAgKCspIEFib3J0IERNQTJEIHRyYW5zZmVyLg0KICAgICAgKCspIFN1c3BlbmQgRE1BMkQgdHJhbnNmZXIuDQogICAgICAoKykgUmVzdW1lIERNQTJEIHRyYW5zZmVyLiANCiAgICAgICgrKSBFbmFibGUgQ0xVVCB0cmFuc2Zlci4gICAgICANCiAgICAgICgrKSBDb25maWd1cmUgQ0xVVCBsb2FkaW5nIHRoZW4gc3RhcnQgdHJhbnNmZXIgaW4gcG9sbGluZyBtb2RlLg0KICAgICAgKCspIENvbmZpZ3VyZSBDTFVUIGxvYWRpbmcgdGhlbiBzdGFydCB0cmFuc2ZlciBpbiBpbnRlcnJ1cHQgbW9kZS4NCiAgICAgICgrKSBBYm9ydCBETUEyRCBDTFVUIGxvYWRpbmcuDQogICAgICAoKykgU3VzcGVuZCBETUEyRCBDTFVUIGxvYWRpbmcuDQogICAgICAoKykgUmVzdW1lIERNQTJEIENMVVQgbG9hZGluZy4gDQogICAgICAoKykgUG9sbCBmb3IgdHJhbnNmZXIgY29tcGxldGUuDQogICAgICAoKykgaGFuZGxlIERNQTJEIGludGVycnVwdCByZXF1ZXN0Lg0KICAgICAgKCspIFRyYW5zZmVyIHdhdGVybWFyayBjYWxsYmFjay4NCiAgICAgICgrKSBDTFVUIFRyYW5zZmVyIENvbXBsZXRlIGNhbGxiYWNrLg0KICAgICAgICANCiAgICAgICAgDQpAZW5kdmVyYmF0aW0NCiAgKiBAew0KICAqLw0KDQovKioNCiAgKiBAYnJpZWYgIFN0YXJ0IHRoZSBETUEyRCBUcmFuc2Zlci4NCiAgKiBAcGFyYW0gIGhkbWEyZDogICAgIFBvaW50ZXIgdG8gYSBETUEyRF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zDQogICogICAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIERNQTJELiAgDQogICogQHBhcmFtICBwZGF0YTogICAgICBDb25maWd1cmUgdGhlIHNvdXJjZSBtZW1vcnkgQnVmZmVyIGFkZHJlc3MgaWYgDQogICogICAgICAgICAgICAgICAgICAgICBNZW1vcnktdG8tTWVtb3J5IG9yIE1lbW9yeS10by1NZW1vcnkgd2l0aCBwaXhlbCBmb3JtYXQgDQogICogICAgICAgICAgICAgICAgICAgICBjb252ZXJzaW9uIG1vZGUgaXMgc2VsZWN0ZWQsIG9yIGNvbmZpZ3VyZSANCiAgKiAgICAgICAgICAgICAgICAgICAgIHRoZSBjb2xvciB2YWx1ZSBpZiBSZWdpc3Rlci10by1NZW1vcnkgbW9kZSBpcyBzZWxlY3RlZC4NCiAgKiBAcGFyYW0gIERzdEFkZHJlc3M6IFRoZSBkZXN0aW5hdGlvbiBtZW1vcnkgQnVmZmVyIGFkZHJlc3MuDQogICogQHBhcmFtICBXaWR0aDogICAgICBUaGUgd2lkdGggb2YgZGF0YSB0byBiZSB0cmFuc2ZlcnJlZCBmcm9tIHNvdXJjZSB0byBkZXN0aW5hdGlvbiAoZXhwcmVzc2VkIGluIG51bWJlciBvZiBwaXhlbHMgcGVyIGxpbmUpLg0KICAqIEBwYXJhbSAgSGVpZ2h0OiAgICAgVGhlIGhlaWdodCBvZiBkYXRhIHRvIGJlIHRyYW5zZmVycmVkIGZyb20gc291cmNlIHRvIGRlc3RpbmF0aW9uIChleHByZXNzZWQgaW4gbnVtYmVyIG9mIGxpbmVzKS4NCiAgKiBAcmV0dmFsIEhBTCBzdGF0dXMNCiAgKi8NCkhBTF9TdGF0dXNUeXBlRGVmIEhBTF9ETUEyRF9TdGFydChETUEyRF9IYW5kbGVUeXBlRGVmICpoZG1hMmQsIHVpbnQzMl90IHBkYXRhLCB1aW50MzJfdCBEc3RBZGRyZXNzLCB1aW50MzJfdCBXaWR0aCwgIHVpbnQzMl90IEhlaWdodCkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX0RNQTJEX0xJTkUoSGVpZ2h0KSk7DQogIGFzc2VydF9wYXJhbShJU19ETUEyRF9QSVhFTChXaWR0aCkpOw0KICANCiAgLyogUHJvY2VzcyBsb2NrZWQgKi8NCiAgX19IQUxfTE9DSyhoZG1hMmQpOw0KDQogIC8qIENoYW5nZSBETUEyRCBwZXJpcGhlcmFsIHN0YXRlICovDQogIGhkbWEyZC0+U3RhdGUgPSBIQUxfRE1BMkRfU1RBVEVfQlVTWTsNCiAgDQogIC8qIENvbmZpZ3VyZSB0aGUgc291cmNlLCBkZXN0aW5hdGlvbiBhZGRyZXNzIGFuZCB0aGUgZGF0YSBzaXplICovDQogIERNQTJEX1NldENvbmZpZyhoZG1hMmQsIHBkYXRhLCBEc3RBZGRyZXNzLCBXaWR0aCwgSGVpZ2h0KTsNCg0KICAvKiBFbmFibGUgdGhlIFBlcmlwaGVyYWwgKi8NCiAgX19IQUxfRE1BMkRfRU5BQkxFKGhkbWEyZCk7DQoNCiAgcmV0dXJuIEhBTF9PSzsNCn0NCg0KLyoqDQogICogQGJyaWVmICBTdGFydCB0aGUgRE1BMkQgVHJhbnNmZXIgd2l0aCBpbnRlcnJ1cHQgZW5hYmxlZC4NCiAgKiBAcGFyYW0gIGhkbWEyZDogICAgIFBvaW50ZXIgdG8gYSBETUEyRF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zDQogICogICAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIERNQTJELiAgDQogICogQHBhcmFtICBwZGF0YTogICAgICBDb25maWd1cmUgdGhlIHNvdXJjZSBtZW1vcnkgQnVmZmVyIGFkZHJlc3MgaWYgDQogICogICAgICAgICAgICAgICAgICAgICB0aGUgTWVtb3J5LXRvLU1lbW9yeSBvciBNZW1vcnktdG8tTWVtb3J5IHdpdGggcGl4ZWwgZm9ybWF0IA0KICAqICAgICAgICAgICAgICAgICAgICAgY29udmVyc2lvbiBtb2RlIGlzIHNlbGVjdGVkLCBvciBjb25maWd1cmUgDQogICogICAgICAgICAgICAgICAgICAgICB0aGUgY29sb3IgdmFsdWUgaWYgUmVnaXN0ZXItdG8tTWVtb3J5IG1vZGUgaXMgc2VsZWN0ZWQuDQogICogQHBhcmFtICBEc3RBZGRyZXNzOiBUaGUgZGVzdGluYXRpb24gbWVtb3J5IEJ1ZmZlciBhZGRyZXNzLg0KICAqIEBwYXJhbSAgV2lkdGg6ICAgICAgVGhlIHdpZHRoIG9mIGRhdGEgdG8gYmUgdHJhbnNmZXJyZWQgZnJvbSBzb3VyY2UgdG8gZGVzdGluYXRpb24gKGV4cHJlc3NlZCBpbiBudW1iZXIgb2YgcGl4ZWxzIHBlciBsaW5lKS4NCiAgKiBAcGFyYW0gIEhlaWdodDogICAgIFRoZSBoZWlnaHQgb2YgZGF0YSB0byBiZSB0cmFuc2ZlcnJlZCBmcm9tIHNvdXJjZSB0byBkZXN0aW5hdGlvbiAoZXhwcmVzc2VkIGluIG51bWJlciBvZiBsaW5lcykuDQogICogQHJldHZhbCBIQUwgc3RhdHVzDQogICovDQpIQUxfU3RhdHVzVHlwZURlZiBIQUxfRE1BMkRfU3RhcnRfSVQoRE1BMkRfSGFuZGxlVHlwZURlZiAqaGRtYTJkLCB1aW50MzJfdCBwZGF0YSwgdWludDMyX3QgRHN0QWRkcmVzcywgdWludDMyX3QgV2lkdGgsICB1aW50MzJfdCBIZWlnaHQpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19ETUEyRF9MSU5FKEhlaWdodCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfRE1BMkRfUElYRUwoV2lkdGgpKTsNCg0KICAvKiBQcm9jZXNzIGxvY2tlZCAqLw0KICBfX0hBTF9MT0NLKGhkbWEyZCk7DQoNCiAgLyogQ2hhbmdlIERNQTJEIHBlcmlwaGVyYWwgc3RhdGUgKi8NCiAgaGRtYTJkLT5TdGF0ZSA9IEhBTF9ETUEyRF9TVEFURV9CVVNZOw0KDQogIC8qIENvbmZpZ3VyZSB0aGUgc291cmNlLCBkZXN0aW5hdGlvbiBhZGRyZXNzIGFuZCB0aGUgZGF0YSBzaXplICovDQogIERNQTJEX1NldENvbmZpZyhoZG1hMmQsIHBkYXRhLCBEc3RBZGRyZXNzLCBXaWR0aCwgSGVpZ2h0KTsNCg0KICAvKiBFbmFibGUgdGhlIHRyYW5zZmVyIGNvbXBsZXRlLCB0cmFuc2ZlciBlcnJvciBhbmQgY29uZmlndXJhdGlvbiBlcnJvciBpbnRlcnJ1cHRzICovDQogIF9fSEFMX0RNQTJEX0VOQUJMRV9JVChoZG1hMmQsIERNQTJEX0lUX1RDfERNQTJEX0lUX1RFfERNQTJEX0lUX0NFKTsNCg0KICAvKiBFbmFibGUgdGhlIFBlcmlwaGVyYWwgKi8NCiAgX19IQUxfRE1BMkRfRU5BQkxFKGhkbWEyZCk7DQoNCiAgcmV0dXJuIEhBTF9PSzsNCn0NCg0KLyoqDQogICogQGJyaWVmICBTdGFydCB0aGUgbXVsdGktc291cmNlIERNQTJEIFRyYW5zZmVyLg0KICAqIEBwYXJhbSAgaGRtYTJkOiAgICAgIFBvaW50ZXIgdG8gYSBETUEyRF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zDQogICogICAgICAgICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBETUEyRC4gIA0KICAqIEBwYXJhbSAgU3JjQWRkcmVzczE6IFRoZSBzb3VyY2UgbWVtb3J5IEJ1ZmZlciBhZGRyZXNzIGZvciB0aGUgZm9yZWdyb3VuZCBsYXllci4NCiAgKiBAcGFyYW0gIFNyY0FkZHJlc3MyOiBUaGUgc291cmNlIG1lbW9yeSBCdWZmZXIgYWRkcmVzcyBmb3IgdGhlIGJhY2tncm91bmQgbGF5ZXIuDQogICogQHBhcmFtICBEc3RBZGRyZXNzOiAgVGhlIGRlc3RpbmF0aW9uIG1lbW9yeSBCdWZmZXIgYWRkcmVzcy4NCiAgKiBAcGFyYW0gIFdpZHRoOiAgICAgICBUaGUgd2lkdGggb2YgZGF0YSB0byBiZSB0cmFuc2ZlcnJlZCBmcm9tIHNvdXJjZSB0byBkZXN0aW5hdGlvbiAoZXhwcmVzc2VkIGluIG51bWJlciBvZiBwaXhlbHMgcGVyIGxpbmUpLg0KICAqIEBwYXJhbSAgSGVpZ2h0OiAgICAgIFRoZSBoZWlnaHQgb2YgZGF0YSB0byBiZSB0cmFuc2ZlcnJlZCBmcm9tIHNvdXJjZSB0byBkZXN0aW5hdGlvbiAoZXhwcmVzc2VkIGluIG51bWJlciBvZiBsaW5lcykuDQogICogQHJldHZhbCBIQUwgc3RhdHVzDQogICovDQpIQUxfU3RhdHVzVHlwZURlZiBIQUxfRE1BMkRfQmxlbmRpbmdTdGFydChETUEyRF9IYW5kbGVUeXBlRGVmICpoZG1hMmQsIHVpbnQzMl90IFNyY0FkZHJlc3MxLCB1aW50MzJfdCAgU3JjQWRkcmVzczIsIHVpbnQzMl90IERzdEFkZHJlc3MsIHVpbnQzMl90IFdpZHRoLCAgdWludDMyX3QgSGVpZ2h0KQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfRE1BMkRfTElORShIZWlnaHQpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0RNQTJEX1BJWEVMKFdpZHRoKSk7ICANCiAgDQogIC8qIFByb2Nlc3MgbG9ja2VkICovDQogIF9fSEFMX0xPQ0soaGRtYTJkKTsNCg0KICAvKiBDaGFuZ2UgRE1BMkQgcGVyaXBoZXJhbCBzdGF0ZSAqLw0KICBoZG1hMmQtPlN0YXRlID0gSEFMX0RNQTJEX1NUQVRFX0JVU1k7IA0KDQogIC8qIENvbmZpZ3VyZSBETUEyRCBTdHJlYW0gc291cmNlMiBhZGRyZXNzICovDQogIFdSSVRFX1JFRyhoZG1hMmQtPkluc3RhbmNlLT5CR01BUiwgU3JjQWRkcmVzczIpOw0KDQogIC8qIENvbmZpZ3VyZSB0aGUgc291cmNlLCBkZXN0aW5hdGlvbiBhZGRyZXNzIGFuZCB0aGUgZGF0YSBzaXplICovDQogIERNQTJEX1NldENvbmZpZyhoZG1hMmQsIFNyY0FkZHJlc3MxLCBEc3RBZGRyZXNzLCBXaWR0aCwgSGVpZ2h0KTsNCg0KICAvKiBFbmFibGUgdGhlIFBlcmlwaGVyYWwgKi8NCiAgX19IQUxfRE1BMkRfRU5BQkxFKGhkbWEyZCk7DQoNCiAgcmV0dXJuIEhBTF9PSzsNCn0NCg0KLyoqDQogICogQGJyaWVmICBTdGFydCB0aGUgbXVsdGktc291cmNlIERNQTJEIFRyYW5zZmVyIHdpdGggaW50ZXJydXB0IGVuYWJsZWQuDQogICogQHBhcmFtICBoZG1hMmQ6ICAgICBQb2ludGVyIHRvIGEgRE1BMkRfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucw0KICAqICAgICAgICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBETUEyRC4gIA0KICAqIEBwYXJhbSAgU3JjQWRkcmVzczE6IFRoZSBzb3VyY2UgbWVtb3J5IEJ1ZmZlciBhZGRyZXNzIGZvciB0aGUgZm9yZWdyb3VuZCBsYXllci4NCiAgKiBAcGFyYW0gIFNyY0FkZHJlc3MyOiBUaGUgc291cmNlIG1lbW9yeSBCdWZmZXIgYWRkcmVzcyBmb3IgdGhlIGJhY2tncm91bmQgbGF5ZXIuDQogICogQHBhcmFtICBEc3RBZGRyZXNzOiAgVGhlIGRlc3RpbmF0aW9uIG1lbW9yeSBCdWZmZXIgYWRkcmVzcy4NCiAgKiBAcGFyYW0gIFdpZHRoOiAgICAgICBUaGUgd2lkdGggb2YgZGF0YSB0byBiZSB0cmFuc2ZlcnJlZCBmcm9tIHNvdXJjZSB0byBkZXN0aW5hdGlvbiAoZXhwcmVzc2VkIGluIG51bWJlciBvZiBwaXhlbHMgcGVyIGxpbmUpLg0KICAqIEBwYXJhbSAgSGVpZ2h0OiAgICAgIFRoZSBoZWlnaHQgb2YgZGF0YSB0byBiZSB0cmFuc2ZlcnJlZCBmcm9tIHNvdXJjZSB0byBkZXN0aW5hdGlvbiAoZXhwcmVzc2VkIGluIG51bWJlciBvZiBsaW5lcykuICAgICAgICAgDQogICogQHJldHZhbCBIQUwgc3RhdHVzDQogICovDQpIQUxfU3RhdHVzVHlwZURlZiBIQUxfRE1BMkRfQmxlbmRpbmdTdGFydF9JVChETUEyRF9IYW5kbGVUeXBlRGVmICpoZG1hMmQsIHVpbnQzMl90IFNyY0FkZHJlc3MxLCB1aW50MzJfdCAgU3JjQWRkcmVzczIsIHVpbnQzMl90IERzdEFkZHJlc3MsIHVpbnQzMl90IFdpZHRoLCAgdWludDMyX3QgSGVpZ2h0KQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfRE1BMkRfTElORShIZWlnaHQpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0RNQTJEX1BJWEVMKFdpZHRoKSk7DQogIA0KICAvKiBQcm9jZXNzIGxvY2tlZCAqLw0KICBfX0hBTF9MT0NLKGhkbWEyZCk7DQoNCiAgLyogQ2hhbmdlIERNQTJEIHBlcmlwaGVyYWwgc3RhdGUgKi8NCiAgaGRtYTJkLT5TdGF0ZSA9IEhBTF9ETUEyRF9TVEFURV9CVVNZOw0KIA0KICAvKiBDb25maWd1cmUgRE1BMkQgU3RyZWFtIHNvdXJjZTIgYWRkcmVzcyAqLw0KICBXUklURV9SRUcoaGRtYTJkLT5JbnN0YW5jZS0+QkdNQVIsIFNyY0FkZHJlc3MyKTsNCg0KICAvKiBDb25maWd1cmUgdGhlIHNvdXJjZSwgZGVzdGluYXRpb24gYWRkcmVzcyBhbmQgdGhlIGRhdGEgc2l6ZSAqLw0KICBETUEyRF9TZXRDb25maWcoaGRtYTJkLCBTcmNBZGRyZXNzMSwgRHN0QWRkcmVzcywgV2lkdGgsIEhlaWdodCk7DQogIA0KICAvKiBFbmFibGUgdGhlIHRyYW5zZmVyIGNvbXBsZXRlLCB0cmFuc2ZlciBlcnJvciBhbmQgY29uZmlndXJhdGlvbiBlcnJvciBpbnRlcnJ1cHRzICovDQogIF9fSEFMX0RNQTJEX0VOQUJMRV9JVChoZG1hMmQsIERNQTJEX0lUX1RDfERNQTJEX0lUX1RFfERNQTJEX0lUX0NFKTsNCiAgDQogIC8qIEVuYWJsZSB0aGUgUGVyaXBoZXJhbCAqLw0KICBfX0hBTF9ETUEyRF9FTkFCTEUoaGRtYTJkKTsNCg0KICByZXR1cm4gSEFMX09LOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIEFib3J0IHRoZSBETUEyRCBUcmFuc2Zlci4NCiAgKiBAcGFyYW0gIGhkbWEyZCA6IHBvaW50ZXIgdG8gYSBETUEyRF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zDQogICogICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIERNQTJELg0KICAqIEByZXR2YWwgSEFMIHN0YXR1cw0KICAqLw0KSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RNQTJEX0Fib3J0KERNQTJEX0hhbmRsZVR5cGVEZWYgKmhkbWEyZCkNCnsNCiAgdWludDMyX3QgdGlja3N0YXJ0ID0gMDsNCg0KICAvKiBBYm9ydCB0aGUgRE1BMkQgdHJhbnNmZXIgKi8NCiAgLyogU1RBUlQgYml0IGlzIHJlc2V0IHRvIG1ha2Ugc3VyZSBub3QgdG8gc2V0IGl0IGFnYWluLCBpbiB0aGUgZXZlbnQgdGhlIEhXIGNsZWFycyBpdA0KICAgICBiZXR3ZWVuIHRoZSByZWdpc3RlciByZWFkIGFuZCB0aGUgcmVnaXN0ZXIgd3JpdGUgYnkgdGhlIENQVSAod3JpdGluZyCRMJIgaGFzIG5vIA0KICAgICBlZmZlY3Qgb24gU1RBUlQgYml0dmFsdWUpLiAqLw0KICAgTU9ESUZZX1JFRyhoZG1hMmQtPkluc3RhbmNlLT5DUiwgRE1BMkRfQ1JfQUJPUlR8RE1BMkRfQ1JfU1RBUlQsIERNQTJEX0NSX0FCT1JUKTsNCg0KICAvKiBHZXQgdGljayAqLw0KICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOw0KDQogIC8qIENoZWNrIGlmIHRoZSBETUEyRCBpcyBlZmZlY3RpdmVseSBkaXNhYmxlZCAqLw0KICB3aGlsZSgoaGRtYTJkLT5JbnN0YW5jZS0+Q1IgJiBETUEyRF9DUl9TVEFSVCkgIT0gUkVTRVQpDQogIHsNCiAgICBpZigoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCApID4gRE1BMkRfVElNRU9VVF9BQk9SVCkNCiAgICB7DQogICAgICAvKiBVcGRhdGUgZXJyb3IgY29kZSAqLw0KICAgICAgaGRtYTJkLT5FcnJvckNvZGUgfD0gSEFMX0RNQTJEX0VSUk9SX1RJTUVPVVQ7DQogICAgICANCiAgICAgIC8qIENoYW5nZSB0aGUgRE1BMkQgc3RhdGUgKi8NCiAgICAgIGhkbWEyZC0+U3RhdGUgPSBIQUxfRE1BMkRfU1RBVEVfVElNRU9VVDsNCiAgICAgIA0KICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLw0KICAgICAgX19IQUxfVU5MT0NLKGhkbWEyZCk7DQogICAgICANCiAgICAgIHJldHVybiBIQUxfVElNRU9VVDsNCiAgICB9DQogIH0NCg0KICAvKiBEaXNhYmxlIHRoZSBUcmFuc2ZlciBDb21wbGV0ZSwgVHJhbnNmZXIgRXJyb3IgYW5kIENvbmZpZ3VyYXRpb24gRXJyb3IgaW50ZXJydXB0cyAqLw0KICBfX0hBTF9ETUEyRF9ESVNBQkxFX0lUKGhkbWEyZCwgRE1BMkRfSVRfVEN8RE1BMkRfSVRfVEV8RE1BMkRfSVRfQ0UpOyAgDQoNCiAgLyogQ2hhbmdlIHRoZSBETUEyRCBzdGF0ZSovDQogIGhkbWEyZC0+U3RhdGUgPSBIQUxfRE1BMkRfU1RBVEVfUkVBRFk7DQogIA0KICAvKiBQcm9jZXNzIFVubG9ja2VkICovDQogIF9fSEFMX1VOTE9DSyhoZG1hMmQpOyAgDQoNCiAgcmV0dXJuIEhBTF9PSzsNCn0NCg0KLyoqDQogICogQGJyaWVmICBTdXNwZW5kIHRoZSBETUEyRCBUcmFuc2Zlci4NCiAgKiBAcGFyYW0gIGhkbWEyZDogcG9pbnRlciB0byBhIERNQTJEX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMNCiAgKiAgICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBETUEyRC4gDQogICogQHJldHZhbCBIQUwgc3RhdHVzDQogICovDQpIQUxfU3RhdHVzVHlwZURlZiBIQUxfRE1BMkRfU3VzcGVuZChETUEyRF9IYW5kbGVUeXBlRGVmICpoZG1hMmQpDQp7DQogIHVpbnQzMl90IHRpY2tzdGFydCA9IDA7DQoNCiAgLyogU3VzcGVuZCB0aGUgRE1BMkQgdHJhbnNmZXIgKi8NCiAgLyogU1RBUlQgYml0IGlzIHJlc2V0IHRvIG1ha2Ugc3VyZSBub3QgdG8gc2V0IGl0IGFnYWluLCBpbiB0aGUgZXZlbnQgdGhlIEhXIGNsZWFycyBpdA0KICAgICBiZXR3ZWVuIHRoZSByZWdpc3RlciByZWFkIGFuZCB0aGUgcmVnaXN0ZXIgd3JpdGUgYnkgdGhlIENQVSAod3JpdGluZyCRMJIgaGFzIG5vIA0KICAgICBlZmZlY3Qgb24gU1RBUlQgYml0dmFsdWUpLiAqLw0KICBNT0RJRllfUkVHKGhkbWEyZC0+SW5zdGFuY2UtPkNSLCBETUEyRF9DUl9TVVNQfERNQTJEX0NSX1NUQVJULCBETUEyRF9DUl9TVVNQKTsNCg0KICAvKiBHZXQgdGljayAqLw0KICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOw0KDQogIC8qIENoZWNrIGlmIHRoZSBETUEyRCBpcyBlZmZlY3RpdmVseSBzdXNwZW5kZWQgKi8NCiAgd2hpbGUgKCgoaGRtYTJkLT5JbnN0YW5jZS0+Q1IgJiBETUEyRF9DUl9TVVNQKSAhPSBETUEyRF9DUl9TVVNQKSBcDQogICAgJiYgKChoZG1hMmQtPkluc3RhbmNlLT5DUiAmIERNQTJEX0NSX1NUQVJUKSA9PSBETUEyRF9DUl9TVEFSVCkpDQogIHsNCiAgICBpZigoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCApID4gRE1BMkRfVElNRU9VVF9TVVNQRU5EKQ0KICAgIHsNCiAgICAgIC8qIFVwZGF0ZSBlcnJvciBjb2RlICovDQogICAgICBoZG1hMmQtPkVycm9yQ29kZSB8PSBIQUxfRE1BMkRfRVJST1JfVElNRU9VVDsNCiAgICAgIA0KICAgICAgLyogQ2hhbmdlIHRoZSBETUEyRCBzdGF0ZSAqLw0KICAgICAgaGRtYTJkLT5TdGF0ZSA9IEhBTF9ETUEyRF9TVEFURV9USU1FT1VUOw0KICAgICAgDQogICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7DQogICAgfQ0KICB9DQogIA0KICAgLyogQ2hlY2sgd2hldGhlciBvciBub3QgYSB0cmFuc2ZlciBpcyBhY3R1YWxseSBzdXNwZW5kZWQgYW5kIGNoYW5nZSB0aGUgRE1BMkQgc3RhdGUgYWNjb3JkaW5nbHkgKi8NCiAgaWYgKChoZG1hMmQtPkluc3RhbmNlLT5DUiAmIERNQTJEX0NSX1NUQVJUKSAhPSBSRVNFVCkNCiAgeyAgICANCiAgICBoZG1hMmQtPlN0YXRlID0gSEFMX0RNQTJEX1NUQVRFX1NVU1BFTkQ7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgLyogTWFrZSBzdXJlIFNVU1AgYml0IGlzIGNsZWFyZWQgc2luY2UgaXQgaXMgbWVhbmluZ2xlc3MgDQogICAgICAgd2hlbiBubyB0cmFuZmVyIGlzIG9uLWdvaW5nICovDQogICAgQ0xFQVJfQklUKGhkbWEyZC0+SW5zdGFuY2UtPkNSLCBETUEyRF9DUl9TVVNQKTsNCiAgfQ0KDQogIHJldHVybiBIQUxfT0s7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgUmVzdW1lIHRoZSBETUEyRCBUcmFuc2Zlci4NCiAgKiBAcGFyYW0gIGhkbWEyZDogcG9pbnRlciB0byBhIERNQTJEX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMNCiAgKiAgICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBETUEyRC4gIA0KICAqIEByZXR2YWwgSEFMIHN0YXR1cw0KICAqLw0KSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RNQTJEX1Jlc3VtZShETUEyRF9IYW5kbGVUeXBlRGVmICpoZG1hMmQpDQp7DQogIC8qIENoZWNrIHRoZSBTVVNQIGFuZCBTVEFSVCBiaXRzICovDQogIGlmKChoZG1hMmQtPkluc3RhbmNlLT5DUiAmIChETUEyRF9DUl9TVVNQIHwgRE1BMkRfQ1JfU1RBUlQpKSA9PSAoRE1BMkRfQ1JfU1VTUCB8IERNQTJEX0NSX1NUQVJUKSkNCiAgew0KICAgIC8qIE9uZ29pbmcgdHJhbnNmZXIgaXMgc3VzcGVuZGVkOiBjaGFuZ2UgdGhlIERNQTJEIHN0YXRlIGJlZm9yZSByZXN1bWluZyAqLw0KICAgIGhkbWEyZC0+U3RhdGUgPSBIQUxfRE1BMkRfU1RBVEVfQlVTWTsNCiAgfQ0KDQogIC8qIFJlc3VtZSB0aGUgRE1BMkQgdHJhbnNmZXIgKi8NCiAgLyogU1RBUlQgYml0IGlzIHJlc2V0IHRvIG1ha2Ugc3VyZSBub3QgdG8gc2V0IGl0IGFnYWluLCBpbiB0aGUgZXZlbnQgdGhlIEhXIGNsZWFycyBpdA0KICAgICBiZXR3ZWVuIHRoZSByZWdpc3RlciByZWFkIGFuZCB0aGUgcmVnaXN0ZXIgd3JpdGUgYnkgdGhlIENQVSAod3JpdGluZyCRMJIgaGFzIG5vIA0KICAgICBlZmZlY3Qgb24gU1RBUlQgYml0dmFsdWUpLiAqLw0KICBDTEVBUl9CSVQoaGRtYTJkLT5JbnN0YW5jZS0+Q1IsIChETUEyRF9DUl9TVVNQfERNQTJEX0NSX1NUQVJUKSk7ICANCg0KICByZXR1cm4gSEFMX09LOw0KfQ0KDQoNCi8qKg0KICAqIEBicmllZiAgRW5hYmxlIHRoZSBETUEyRCBDTFVUIFRyYW5zZmVyLg0KICAqIEBwYXJhbSAgaGRtYTJkOiAgIFBvaW50ZXIgdG8gYSBETUEyRF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zDQogICogICAgICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBETUEyRC4NCiAgKiBAcGFyYW0gIExheWVySWR4OiBETUEyRCBMYXllciBpbmRleC4NCiAgKiAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgICAgICAgICAgICAgICAgIDAoYmFja2dyb3VuZCkgLyAxKGZvcmVncm91bmQpDQogICogQHJldHZhbCBIQUwgc3RhdHVzDQogICovDQpIQUxfU3RhdHVzVHlwZURlZiBIQUxfRE1BMkRfRW5hYmxlQ0xVVChETUEyRF9IYW5kbGVUeXBlRGVmICpoZG1hMmQsIHVpbnQzMl90IExheWVySWR4KQ0KeyAgDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19ETUEyRF9MQVlFUihMYXllcklkeCkpOw0KICANCiAgLyogUHJvY2VzcyBsb2NrZWQgKi8NCiAgX19IQUxfTE9DSyhoZG1hMmQpOw0KICANCiAgLyogQ2hhbmdlIERNQTJEIHBlcmlwaGVyYWwgc3RhdGUgKi8NCiAgaGRtYTJkLT5TdGF0ZSA9IEhBTF9ETUEyRF9TVEFURV9CVVNZOyAgDQogIA0KICBpZihMYXllcklkeCA9PSAwKQ0KICB7DQogICAgLyogRW5hYmxlIHRoZSBiYWNrZ3JvdW5kIENMVVQgbG9hZGluZyAqLw0KICAgIFNFVF9CSVQoaGRtYTJkLT5JbnN0YW5jZS0+QkdQRkNDUiwgRE1BMkRfQkdQRkNDUl9TVEFSVCk7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgLyogRW5hYmxlIHRoZSBmb3JlZ3JvdW5kIENMVVQgbG9hZGluZyAqLw0KICAgIFNFVF9CSVQoaGRtYTJkLT5JbnN0YW5jZS0+RkdQRkNDUiwgRE1BMkRfRkdQRkNDUl9TVEFSVCk7ICAgIA0KICB9DQogIA0KICByZXR1cm4gSEFMX09LOw0KfQ0KDQoNCi8qKg0KICAqIEBicmllZiAgU3RhcnQgRE1BMkQgQ0xVVCBMb2FkaW5nLg0KICAqIEBwYXJhbSAgaGRtYTJkOiAgIFBvaW50ZXIgdG8gYSBETUEyRF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zDQogICogICAgICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBETUEyRC4NCiAgKiBAcGFyYW0gIENMVVRDZmc6ICBQb2ludGVyIHRvIGEgRE1BMkRfQ0xVVENmZ1R5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMNCiAgKiAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIGNvbG9yIGxvb2sgdXAgdGFibGUuDQogICogQHBhcmFtICBMYXllcklkeDogRE1BMkQgTGF5ZXIgaW5kZXguDQogICogICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgICAgICAgICAgICAgICAwKGJhY2tncm91bmQpIC8gMShmb3JlZ3JvdW5kKQ0KICAqIEBub3RlIEludm9raW5nIHRoaXMgQVBJIGlzIHNpbWlsYXIgdG8gY2FsbGluZyBIQUxfRE1BMkRfQ29uZmlnQ0xVVCgpIHRoZW4gSEFMX0RNQTJEX0VuYWJsZUNMVVQoKS4gICAgICAgICAgICAgICAgICAgIA0KICAqIEByZXR2YWwgSEFMIHN0YXR1cw0KICAqLw0KSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RNQTJEX0NMVVRMb2FkKERNQTJEX0hhbmRsZVR5cGVEZWYgKmhkbWEyZCwgRE1BMkRfQ0xVVENmZ1R5cGVEZWYgQ0xVVENmZywgdWludDMyX3QgTGF5ZXJJZHgpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19ETUEyRF9MQVlFUihMYXllcklkeCkpOyAgIA0KICBhc3NlcnRfcGFyYW0oSVNfRE1BMkRfQ0xVVF9DTShDTFVUQ2ZnLkNMVVRDb2xvck1vZGUpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0RNQTJEX0NMVVRfU0laRShDTFVUQ2ZnLlNpemUpKTsNCiAgDQogIC8qIFByb2Nlc3MgbG9ja2VkICovDQogIF9fSEFMX0xPQ0soaGRtYTJkKTsNCiAgDQogIC8qIENoYW5nZSBETUEyRCBwZXJpcGhlcmFsIHN0YXRlICovDQogIGhkbWEyZC0+U3RhdGUgPSBIQUxfRE1BMkRfU1RBVEVfQlVTWTsgICANCiAgICANCiAgLyogQ29uZmlndXJlIHRoZSBDTFVUIG9mIHRoZSBiYWNrZ3JvdW5kIERNQTJEIGxheWVyICovDQogIGlmKExheWVySWR4ID09IDApDQogIHsNCiAgICAvKiBXcml0ZSBiYWNrZ3JvdW5kIENMVVQgbWVtb3J5IGFkZHJlc3MgKi8NCiAgICBXUklURV9SRUcoaGRtYTJkLT5JbnN0YW5jZS0+QkdDTUFSLCAodWludDMyX3QpQ0xVVENmZy5wQ0xVVCk7DQogICAgDQogICAgLyogV3JpdGUgYmFja2dyb3VuZCBDTFVUIHNpemUgYW5kIENMVVQgY29sb3IgbW9kZSAqLw0KICAgIE1PRElGWV9SRUcoaGRtYTJkLT5JbnN0YW5jZS0+QkdQRkNDUiwgKERNQTJEX0JHUEZDQ1JfQ1MgfCBETUEyRF9CR1BGQ0NSX0NDTSksIA0KICAgICAgICAgICAgKChDTFVUQ2ZnLlNpemUgPDwgRE1BMkRfUE9TSVRJT05fQkdQRkNDUl9DUykgfCAoQ0xVVENmZy5DTFVUQ29sb3JNb2RlIDw8IERNQTJEX1BPU0lUSU9OX0JHUEZDQ1JfQ0NNKSkpOw0KDQogICAgLyogRW5hYmxlIHRoZSBDTFVUIGxvYWRpbmcgZm9yIHRoZSBiYWNrZ3JvdW5kICovDQogICAgU0VUX0JJVChoZG1hMmQtPkluc3RhbmNlLT5CR1BGQ0NSLCBETUEyRF9CR1BGQ0NSX1NUQVJUKTsNCiAgfQ0KICAvKiBDb25maWd1cmUgdGhlIENMVVQgb2YgdGhlIGZvcmVncm91bmQgRE1BMkQgbGF5ZXIgKi8NCiAgZWxzZQ0KICB7DQogICAgLyogV3JpdGUgZm9yZWdyb3VuZCBDTFVUIG1lbW9yeSBhZGRyZXNzICovDQogICAgV1JJVEVfUkVHKGhkbWEyZC0+SW5zdGFuY2UtPkZHQ01BUiwgKHVpbnQzMl90KUNMVVRDZmcucENMVVQpOw0KICAgIA0KICAgIC8qIFdyaXRlIGZvcmVncm91bmQgQ0xVVCBzaXplIGFuZCBDTFVUIGNvbG9yIG1vZGUgKi8NCiAgICBNT0RJRllfUkVHKGhkbWEyZC0+SW5zdGFuY2UtPkZHUEZDQ1IsIChETUEyRF9GR1BGQ0NSX0NTIHwgRE1BMkRfRkdQRkNDUl9DQ00pLCANCiAgICAgICAgICAgICgoQ0xVVENmZy5TaXplIDw8IERNQTJEX1BPU0lUSU9OX0JHUEZDQ1JfQ1MpIHwgKENMVVRDZmcuQ0xVVENvbG9yTW9kZSA8PCBETUEyRF9QT1NJVElPTl9GR1BGQ0NSX0NDTSkpKTsgICAgICAgDQogICAgDQogLyogRW5hYmxlIHRoZSBDTFVUIGxvYWRpbmcgZm9yIHRoZSBmb3JlZ3JvdW5kICovDQogICAgU0VUX0JJVChoZG1hMmQtPkluc3RhbmNlLT5GR1BGQ0NSLCBETUEyRF9GR1BGQ0NSX1NUQVJUKTsgIA0KICB9DQogICAgDQogIHJldHVybiBIQUxfT0s7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgU3RhcnQgRE1BMkQgQ0xVVCBMb2FkaW5nIHdpdGggaW50ZXJydXB0IGVuYWJsZWQuDQogICogQHBhcmFtICBoZG1hMmQ6ICAgUG9pbnRlciB0byBhIERNQTJEX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMNCiAgKiAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIERNQTJELg0KICAqIEBwYXJhbSAgQ0xVVENmZzogIFBvaW50ZXIgdG8gYSBETUEyRF9DTFVUQ2ZnVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucw0KICAqICAgICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgY29sb3IgbG9vayB1cCB0YWJsZS4NCiAgKiBAcGFyYW0gIExheWVySWR4OiBETUEyRCBMYXllciBpbmRleC4NCiAgKiAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgICAgICAgICAgICAgICAgIDAoYmFja2dyb3VuZCkgLyAxKGZvcmVncm91bmQpDQogICogQHJldHZhbCBIQUwgc3RhdHVzDQogICovDQpIQUxfU3RhdHVzVHlwZURlZiBIQUxfRE1BMkRfQ0xVVExvYWRfSVQoRE1BMkRfSGFuZGxlVHlwZURlZiAqaGRtYTJkLCBETUEyRF9DTFVUQ2ZnVHlwZURlZiBDTFVUQ2ZnLCB1aW50MzJfdCBMYXllcklkeCkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX0RNQTJEX0xBWUVSKExheWVySWR4KSk7ICAgDQogIGFzc2VydF9wYXJhbShJU19ETUEyRF9DTFVUX0NNKENMVVRDZmcuQ0xVVENvbG9yTW9kZSkpOw0KICBhc3NlcnRfcGFyYW0oSVNfRE1BMkRfQ0xVVF9TSVpFKENMVVRDZmcuU2l6ZSkpOw0KICANCiAgLyogUHJvY2VzcyBsb2NrZWQgKi8NCiAgX19IQUxfTE9DSyhoZG1hMmQpOw0KICANCiAgLyogQ2hhbmdlIERNQTJEIHBlcmlwaGVyYWwgc3RhdGUgKi8NCiAgaGRtYTJkLT5TdGF0ZSA9IEhBTF9ETUEyRF9TVEFURV9CVVNZOyAgIA0KICAgIA0KICAvKiBDb25maWd1cmUgdGhlIENMVVQgb2YgdGhlIGJhY2tncm91bmQgRE1BMkQgbGF5ZXIgKi8NCiAgaWYoTGF5ZXJJZHggPT0gMCkNCiAgew0KICAgIC8qIFdyaXRlIGJhY2tncm91bmQgQ0xVVCBtZW1vcnkgYWRkcmVzcyAqLw0KICAgIFdSSVRFX1JFRyhoZG1hMmQtPkluc3RhbmNlLT5CR0NNQVIsICh1aW50MzJfdClDTFVUQ2ZnLnBDTFVUKTsNCiAgICANCiAgICAvKiBXcml0ZSBiYWNrZ3JvdW5kIENMVVQgc2l6ZSBhbmQgQ0xVVCBjb2xvciBtb2RlICovDQogICAgTU9ESUZZX1JFRyhoZG1hMmQtPkluc3RhbmNlLT5CR1BGQ0NSLCAoRE1BMkRfQkdQRkNDUl9DUyB8IERNQTJEX0JHUEZDQ1JfQ0NNKSwgDQogICAgICAgICAgICAoKENMVVRDZmcuU2l6ZSA8PCBETUEyRF9QT1NJVElPTl9CR1BGQ0NSX0NTKSB8IChDTFVUQ2ZnLkNMVVRDb2xvck1vZGUgPDwgRE1BMkRfUE9TSVRJT05fQkdQRkNDUl9DQ00pKSk7DQogICAgICAgICAgICANCiAgICAvKiBFbmFibGUgdGhlIENMVVQgVHJhbnNmZXIgQ29tcGxldGUsIHRyYW5zZmVyIEVycm9yLCBjb25maWd1cmF0aW9uIEVycm9yIGFuZCBDTFVUIEFjY2VzcyBFcnJvciBpbnRlcnJ1cHRzICovDQogICAgX19IQUxfRE1BMkRfRU5BQkxFX0lUKGhkbWEyZCwgRE1BMkRfSVRfQ1RDIHwgRE1BMkRfSVRfVEUgfCBETUEyRF9JVF9DRSB8RE1BMkRfSVRfQ0FFKTsgICAgICAgICAgICANCg0KICAgIC8qIEVuYWJsZSB0aGUgQ0xVVCBsb2FkaW5nIGZvciB0aGUgYmFja2dyb3VuZCAqLw0KICAgIFNFVF9CSVQoaGRtYTJkLT5JbnN0YW5jZS0+QkdQRkNDUiwgRE1BMkRfQkdQRkNDUl9TVEFSVCk7DQogIH0NCiAgLyogQ29uZmlndXJlIHRoZSBDTFVUIG9mIHRoZSBmb3JlZ3JvdW5kIERNQTJEIGxheWVyICovDQogIGVsc2UNCiAgew0KICAgIC8qIFdyaXRlIGZvcmVncm91bmQgQ0xVVCBtZW1vcnkgYWRkcmVzcyAqLw0KICAgIFdSSVRFX1JFRyhoZG1hMmQtPkluc3RhbmNlLT5GR0NNQVIsICh1aW50MzJfdClDTFVUQ2ZnLnBDTFVUKTsNCiAgICANCiAgICAvKiBXcml0ZSBmb3JlZ3JvdW5kIENMVVQgc2l6ZSBhbmQgQ0xVVCBjb2xvciBtb2RlICovDQogICAgTU9ESUZZX1JFRyhoZG1hMmQtPkluc3RhbmNlLT5GR1BGQ0NSLCAoRE1BMkRfRkdQRkNDUl9DUyB8IERNQTJEX0ZHUEZDQ1JfQ0NNKSwgDQogICAgICAgICAgICAoKENMVVRDZmcuU2l6ZSA8PCBETUEyRF9QT1NJVElPTl9CR1BGQ0NSX0NTKSB8IChDTFVUQ2ZnLkNMVVRDb2xvck1vZGUgPDwgRE1BMkRfUE9TSVRJT05fRkdQRkNDUl9DQ00pKSk7DQogICAgICAgICAgICANCiAgICAvKiBFbmFibGUgdGhlIENMVVQgVHJhbnNmZXIgQ29tcGxldGUsIHRyYW5zZmVyIEVycm9yLCBjb25maWd1cmF0aW9uIEVycm9yIGFuZCBDTFVUIEFjY2VzcyBFcnJvciBpbnRlcnJ1cHRzICovDQogICAgX19IQUxfRE1BMkRfRU5BQkxFX0lUKGhkbWEyZCwgRE1BMkRfSVRfQ1RDIHwgRE1BMkRfSVRfVEUgfCBETUEyRF9JVF9DRSB8RE1BMkRfSVRfQ0FFKTsgICAgICAgICAgICAgICAgICAgDQogICAgDQogICAgLyogRW5hYmxlIHRoZSBDTFVUIGxvYWRpbmcgZm9yIHRoZSBmb3JlZ3JvdW5kICovDQogICAgU0VUX0JJVChoZG1hMmQtPkluc3RhbmNlLT5GR1BGQ0NSLCBETUEyRF9GR1BGQ0NSX1NUQVJUKTsgIA0KICB9DQogICAgDQogIHJldHVybiBIQUxfT0s7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgQWJvcnQgdGhlIERNQTJEIENMVVQgbG9hZGluZy4NCiAgKiBAcGFyYW0gIGhkbWEyZCA6IFBvaW50ZXIgdG8gYSBETUEyRF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zDQogICogICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIERNQTJELg0KICAqIEBwYXJhbSAgTGF5ZXJJZHg6IERNQTJEIExheWVyIGluZGV4Lg0KICAqICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgICAgICAgICAgICAgICAgMChiYWNrZ3JvdW5kKSAvIDEoZm9yZWdyb3VuZCkgIA0KICAqIEByZXR2YWwgSEFMIHN0YXR1cw0KICAqLw0KSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RNQTJEX0NMVVRMb2FkaW5nX0Fib3J0KERNQTJEX0hhbmRsZVR5cGVEZWYgKmhkbWEyZCwgdWludDMyX3QgTGF5ZXJJZHgpDQp7DQogIHVpbnQzMl90IHRpY2tzdGFydCAgPSAwOw0KICBfX0lPIHVpbnQzMl90ICogcmVnID0gICYoaGRtYTJkLT5JbnN0YW5jZS0+QkdQRkNDUik7IC8qIGJ5IGRlZmF1bHQsIHBvaW50IGF0IGJhY2tncm91bmQgcmVnaXN0ZXIgKi8NCiAgdWludDMyX3QgbWFzayAgICAgICA9IERNQTJEX0JHUEZDQ1JfU1RBUlQ7ICAgICAgICAgICAvKiBieSBkZWZhdWx0LCBzZXQgdG8gYmFja2dyb3VuZCBjb25zdGFudCAgICovDQogIA0KDQogIC8qIEFib3J0IHRoZSBDTFVUIGxvYWRpbmcgKi8NCiAgU0VUX0JJVChoZG1hMmQtPkluc3RhbmNlLT5DUiwgRE1BMkRfQ1JfQUJPUlQpOw0KICANCiAgLyogSWYgZm9yZWdyb3VuZCBDTFVUIGxvYWRpbmcgaXMgY29uc2lkZXJlZCwgdXBkYXRlIGxvY2FsIHZhcmlhYmxlcyAqLyANCiAgaWYoTGF5ZXJJZHggPT0gMSkNCiAgew0KICAgIHJlZyAgPSAmKGhkbWEyZC0+SW5zdGFuY2UtPkZHUEZDQ1IpOw0KICB9DQoNCg0KICAvKiBHZXQgdGljayAqLw0KICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOw0KIA0KICAvKiBDaGVjayBpZiB0aGUgQ0xVVCBsb2FkaW5nIGlzIGFib3J0ZWQgKi8gICAgICAgICAgDQogIHdoaWxlKCgqcmVnICYgbWFzaykgIT0gUkVTRVQpDQogIHsNCiAgICBpZigoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCApID4gRE1BMkRfVElNRU9VVF9BQk9SVCkNCiAgICB7DQogICAgICAvKiBVcGRhdGUgZXJyb3IgY29kZSAqLw0KICAgICAgaGRtYTJkLT5FcnJvckNvZGUgfD0gSEFMX0RNQTJEX0VSUk9SX1RJTUVPVVQ7DQogICAgICANCiAgICAgIC8qIENoYW5nZSB0aGUgRE1BMkQgc3RhdGUgKi8NCiAgICAgIGhkbWEyZC0+U3RhdGUgPSBIQUxfRE1BMkRfU1RBVEVfVElNRU9VVDsNCiAgICAgIA0KICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLw0KICAgICAgX19IQUxfVU5MT0NLKGhkbWEyZCk7DQogICAgICANCiAgICAgIHJldHVybiBIQUxfVElNRU9VVDsNCiAgICB9DQogIH0NCg0KICAvKiBEaXNhYmxlIHRoZSBDTFVUIFRyYW5zZmVyIENvbXBsZXRlLCBUcmFuc2ZlciBFcnJvciwgQ29uZmlndXJhdGlvbiBFcnJvciBhbmQgQ0xVVCBBY2Nlc3MgRXJyb3IgaW50ZXJydXB0cyAqLw0KICBfX0hBTF9ETUEyRF9ESVNBQkxFX0lUKGhkbWEyZCwgRE1BMkRfSVRfQ1RDIHwgRE1BMkRfSVRfVEUgfCBETUEyRF9JVF9DRSB8RE1BMkRfSVRfQ0FFKTsgICAgICANCiAgIA0KICAvKiBDaGFuZ2UgdGhlIERNQTJEIHN0YXRlKi8NCiAgaGRtYTJkLT5TdGF0ZSA9IEhBTF9ETUEyRF9TVEFURV9SRUFEWTsNCiAgICAgDQogIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8NCiAgX19IQUxfVU5MT0NLKGhkbWEyZCk7DQoNCiAgcmV0dXJuIEhBTF9PSzsNCn0NCg0KLyoqDQogICogQGJyaWVmICBTdXNwZW5kIHRoZSBETUEyRCBDTFVUIGxvYWRpbmcuDQogICogQHBhcmFtICBoZG1hMmQ6IFBvaW50ZXIgdG8gYSBETUEyRF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zDQogICogICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgRE1BMkQuIA0KICAqIEBwYXJhbSAgTGF5ZXJJZHg6IERNQTJEIExheWVyIGluZGV4Lg0KICAqICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgICAgICAgICAgICAgICAgMChiYWNrZ3JvdW5kKSAvIDEoZm9yZWdyb3VuZCkgICAgDQogICogQHJldHZhbCBIQUwgc3RhdHVzDQogICovDQpIQUxfU3RhdHVzVHlwZURlZiBIQUxfRE1BMkRfQ0xVVExvYWRpbmdfU3VzcGVuZChETUEyRF9IYW5kbGVUeXBlRGVmICpoZG1hMmQsIHVpbnQzMl90IExheWVySWR4KQ0Kew0KICB1aW50MzJfdCB0aWNrc3RhcnQgPSAwOw0KICBfX0lPIHVpbnQzMl90ICogcmVnID0gICYoaGRtYTJkLT5JbnN0YW5jZS0+QkdQRkNDUik7IC8qIGJ5IGRlZmF1bHQsIHBvaW50IGF0IGJhY2tncm91bmQgcmVnaXN0ZXIgKi8NCiAgdWludDMyX3QgbWFzayAgICAgICA9IERNQTJEX0JHUEZDQ1JfU1RBUlQ7ICAgICAgICAgICAvKiBieSBkZWZhdWx0LCBzZXQgdG8gYmFja2dyb3VuZCBjb25zdGFudCAgICovDQogIA0KDQogIC8qIFN1c3BlbmQgdGhlIENMVVQgbG9hZGluZyAqLw0KICBTRVRfQklUKGhkbWEyZC0+SW5zdGFuY2UtPkNSLCBETUEyRF9DUl9TVVNQKTsgDQogIA0KICAvKiBJZiBmb3JlZ3JvdW5kIENMVVQgbG9hZGluZyBpcyBjb25zaWRlcmVkLCB1cGRhdGUgbG9jYWwgdmFyaWFibGVzICovIA0KICBpZihMYXllcklkeCA9PSAxKQ0KICB7DQogICAgcmVnICA9ICYoaGRtYTJkLT5JbnN0YW5jZS0+RkdQRkNDUik7DQogIH0gICANCg0KICAvKiBHZXQgdGljayAqLw0KICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOw0KICANCiAgLyogQ2hlY2sgaWYgdGhlIENMVVQgbG9hZGluZyBpcyBzdXNwZW5kZWQgKi8NCiAgd2hpbGUgKCgoaGRtYTJkLT5JbnN0YW5jZS0+Q1IgJiBETUEyRF9DUl9TVVNQKSAhPSBETUEyRF9DUl9TVVNQKSBcDQogICAgJiYgKCgqcmVnICYgbWFzaykgPT0gbWFzaykpDQogIHsNCiAgICBpZigoSEFMX0dldFRpY2soKSAtIHRpY2tzdGFydCApID4gRE1BMkRfVElNRU9VVF9TVVNQRU5EKQ0KICAgIHsNCiAgICAgIC8qIFVwZGF0ZSBlcnJvciBjb2RlICovDQogICAgICBoZG1hMmQtPkVycm9yQ29kZSB8PSBIQUxfRE1BMkRfRVJST1JfVElNRU9VVDsNCiAgICAgIA0KICAgICAgLyogQ2hhbmdlIHRoZSBETUEyRCBzdGF0ZSAqLw0KICAgICAgaGRtYTJkLT5TdGF0ZSA9IEhBTF9ETUEyRF9TVEFURV9USU1FT1VUOw0KICAgICAgDQogICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7DQogICAgfQ0KICB9DQogIA0KICAgLyogQ2hlY2sgd2hldGhlciBvciBub3QgYSB0cmFuc2ZlciBpcyBhY3R1YWxseSBzdXNwZW5kZWQgYW5kIGNoYW5nZSB0aGUgRE1BMkQgc3RhdGUgYWNjb3JkaW5nbHkgKi8NCiAgaWYgKCgqcmVnICYgbWFzaykgIT0gUkVTRVQpDQogIHsgICAgDQogICAgaGRtYTJkLT5TdGF0ZSA9IEhBTF9ETUEyRF9TVEFURV9TVVNQRU5EOw0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIE1ha2Ugc3VyZSBTVVNQIGJpdCBpcyBjbGVhcmVkIHNpbmNlIGl0IGlzIG1lYW5pbmdsZXNzIA0KICAgICAgIHdoZW4gbm8gdHJhbmZlciBpcyBvbi1nb2luZyAqLw0KICAgIENMRUFSX0JJVChoZG1hMmQtPkluc3RhbmNlLT5DUiwgRE1BMkRfQ1JfU1VTUCk7DQogIH0gIA0KDQogIHJldHVybiBIQUxfT0s7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgUmVzdW1lIHRoZSBETUEyRCBDTFVUIGxvYWRpbmcuDQogICogQHBhcmFtICBoZG1hMmQ6IHBvaW50ZXIgdG8gYSBETUEyRF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zDQogICogICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgRE1BMkQuIA0KICAqIEBwYXJhbSAgTGF5ZXJJZHg6IERNQTJEIExheWVyIGluZGV4Lg0KICAqICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgICAgICAgICAgICAgICAgMChiYWNrZ3JvdW5kKSAvIDEoZm9yZWdyb3VuZCkgICAgICANCiAgKiBAcmV0dmFsIEhBTCBzdGF0dXMNCiAgKi8NCkhBTF9TdGF0dXNUeXBlRGVmIEhBTF9ETUEyRF9DTFVUTG9hZGluZ19SZXN1bWUoRE1BMkRfSGFuZGxlVHlwZURlZiAqaGRtYTJkLCB1aW50MzJfdCBMYXllcklkeCkNCnsNCiAgLyogQ2hlY2sgdGhlIFNVU1AgYW5kIFNUQVJUIGJpdHMgZm9yIGJhY2tncm91bmQgb3IgZm9yZWdyb3VuZCBDTFVUIGxvYWRpbmcgKi8NCiAgaWYoTGF5ZXJJZHggPT0gMCkNCiAgeyAgDQogICAgLyogQmFja2dyb3VuZCBDTFVUIGxvYWRpbmcgc3VzcGVuc2lvbiBjaGVjayAqLw0KICAgIGlmICgoKGhkbWEyZC0+SW5zdGFuY2UtPkNSICYgRE1BMkRfQ1JfU1VTUCkgPT0gRE1BMkRfQ1JfU1VTUCkNCiAgICAgICYmICgoaGRtYTJkLT5JbnN0YW5jZS0+QkdQRkNDUiAmIERNQTJEX0JHUEZDQ1JfU1RBUlQpID09IERNQTJEX0JHUEZDQ1JfU1RBUlQpKQ0KICAgIHsNCiAgICAgIC8qIE9uZ29pbmcgQ0xVVCBsb2FkaW5nIGlzIHN1c3BlbmRlZDogY2hhbmdlIHRoZSBETUEyRCBzdGF0ZSBiZWZvcmUgcmVzdW1pbmcgKi8NCiAgICAgIGhkbWEyZC0+U3RhdGUgPSBIQUxfRE1BMkRfU1RBVEVfQlVTWTsNCiAgICB9DQogIH0NCiAgZWxzZQ0KICB7DQogICAgLyogRm9yZWdyb3VuZCBDTFVUIGxvYWRpbmcgc3VzcGVuc2lvbiBjaGVjayAqLw0KICAgIGlmICgoKGhkbWEyZC0+SW5zdGFuY2UtPkNSICYgRE1BMkRfQ1JfU1VTUCkgPT0gRE1BMkRfQ1JfU1VTUCkNCiAgICAgICYmICgoaGRtYTJkLT5JbnN0YW5jZS0+RkdQRkNDUiAmIERNQTJEX0ZHUEZDQ1JfU1RBUlQpID09IERNQTJEX0ZHUEZDQ1JfU1RBUlQpKQ0KICAgIHsNCiAgICAgIC8qIE9uZ29pbmcgQ0xVVCBsb2FkaW5nIGlzIHN1c3BlbmRlZDogY2hhbmdlIHRoZSBETUEyRCBzdGF0ZSBiZWZvcmUgcmVzdW1pbmcgKi8NCiAgICAgIGhkbWEyZC0+U3RhdGUgPSBIQUxfRE1BMkRfU1RBVEVfQlVTWTsNCiAgICB9ICANCiAgfQ0KDQogIC8qIFJlc3VtZSB0aGUgQ0xVVCBsb2FkaW5nICovDQogIENMRUFSX0JJVChoZG1hMmQtPkluc3RhbmNlLT5DUiwgRE1BMkRfQ1JfU1VTUCk7ICANCg0KICByZXR1cm4gSEFMX09LOw0KfQ0KDQoNCi8qKg0KDQogICogQGJyaWVmICBQb2xsaW5nIGZvciB0cmFuc2ZlciBjb21wbGV0ZSBvciBDTFVUIGxvYWRpbmcuDQogICogQHBhcmFtICBoZG1hMmQ6IFBvaW50ZXIgdG8gYSBETUEyRF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zDQogICogICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgRE1BMkQuIA0KICAqIEBwYXJhbSAgVGltZW91dDogVGltZW91dCBkdXJhdGlvbg0KICAqIEByZXR2YWwgSEFMIHN0YXR1cw0KICAqLw0KSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0RNQTJEX1BvbGxGb3JUcmFuc2ZlcihETUEyRF9IYW5kbGVUeXBlRGVmICpoZG1hMmQsIHVpbnQzMl90IFRpbWVvdXQpDQp7DQogIHVpbnQzMl90IHRpY2tzdGFydCA9IDA7DQogIF9fSU8gdWludDMyX3QgaXNyZmxhZ3MgPSAweDA7ICANCg0KICAvKiBQb2xsaW5nIGZvciBETUEyRCB0cmFuc2ZlciAqLw0KICBpZigoaGRtYTJkLT5JbnN0YW5jZS0+Q1IgJiBETUEyRF9DUl9TVEFSVCkgIT0gUkVTRVQpDQogIHsNCiAgIC8qIEdldCB0aWNrICovDQogICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOw0KDQogICAgd2hpbGUoX19IQUxfRE1BMkRfR0VUX0ZMQUcoaGRtYTJkLCBETUEyRF9GTEFHX1RDKSA9PSBSRVNFVCkNCiAgICB7DQogICAgICBpc3JmbGFncyA9IFJFQURfUkVHKGhkbWEyZC0+SW5zdGFuY2UtPklTUik7IA0KICAgICAgaWYgKChpc3JmbGFncyAmIChETUEyRF9GTEFHX0NFfERNQTJEX0ZMQUdfVEUpKSAhPSBSRVNFVCkNCiAgICAgIHsNCiAgICAgICAgaWYgKChpc3JmbGFncyAmIERNQTJEX0ZMQUdfQ0UpICE9IFJFU0VUKQ0KICAgICAgICB7DQogICAgICAgICAgaGRtYTJkLT5FcnJvckNvZGUgfD0gSEFMX0RNQTJEX0VSUk9SX0NFOyAgICAgICAgDQogICAgICAgIH0NCiAgICAgICAgaWYgKChpc3JmbGFncyAmIERNQTJEX0ZMQUdfVEUpICE9IFJFU0VUKSAgICAgICAgDQogICAgICAgIHsNCiAgICAgICAgICBoZG1hMmQtPkVycm9yQ29kZSB8PSBIQUxfRE1BMkRfRVJST1JfVEU7ICAgICAgICANCiAgICAgICAgfQ0KICAgICAgICAvKiBDbGVhciB0aGUgdHJhbnNmZXIgYW5kIGNvbmZpZ3VyYXRpb24gZXJyb3IgZmxhZ3MgKi8NCiAgICAgICAgX19IQUxfRE1BMkRfQ0xFQVJfRkxBRyhoZG1hMmQsIERNQTJEX0ZMQUdfQ0UgfCBETUEyRF9GTEFHX1RFKTsNCg0KICAgICAgICAvKiBDaGFuZ2UgRE1BMkQgc3RhdGUgKi8NCiAgICAgICAgaGRtYTJkLT5TdGF0ZSA9IEhBTF9ETUEyRF9TVEFURV9FUlJPUjsNCg0KICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovDQogICAgICAgIF9fSEFMX1VOTE9DSyhoZG1hMmQpOw0KICAgICAgICANCiAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsNCiAgICAgIH0NCiAgICAgIC8qIENoZWNrIGZvciB0aGUgVGltZW91dCAqLw0KICAgICAgaWYoVGltZW91dCAhPSBIQUxfTUFYX0RFTEFZKQ0KICAgICAgew0KICAgICAgICBpZigoVGltZW91dCA9PSAwKXx8KChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0ICkgPiBUaW1lb3V0KSkNCiAgICAgICAgew0KICAgICAgICAgIC8qIFVwZGF0ZSBlcnJvciBjb2RlICovDQogICAgICAgICAgaGRtYTJkLT5FcnJvckNvZGUgfD0gSEFMX0RNQTJEX0VSUk9SX1RJTUVPVVQ7DQoNCiAgICAgICAgICAvKiBDaGFuZ2UgdGhlIERNQTJEIHN0YXRlICovDQogICAgICAgICAgaGRtYTJkLT5TdGF0ZSA9IEhBTF9ETUEyRF9TVEFURV9USU1FT1VUOw0KICAgICAgICAgDQogICAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLw0KICAgICAgICAgIF9fSEFMX1VOTE9DSyhoZG1hMmQpOw0KICAgICAgICAgICANCiAgICAgICAgICByZXR1cm4gSEFMX1RJTUVPVVQ7DQogICAgICAgIH0NCiAgICAgIH0gICAgICAgIA0KICAgIH0NCiAgfQ0KICAvKiBQb2xsaW5nIGZvciBDTFVUIGxvYWRpbmcgKGZvcmVncm91bmQgb3IgYmFja2dyb3VuZCkgKi8NCiAgaWYgKCgoaGRtYTJkLT5JbnN0YW5jZS0+RkdQRkNDUiAmIERNQTJEX0ZHUEZDQ1JfU1RBUlQpICE9IFJFU0VUKSAgfHwgDQogICAgICAoKGhkbWEyZC0+SW5zdGFuY2UtPkJHUEZDQ1IgJiBETUEyRF9CR1BGQ0NSX1NUQVJUKSAhPSBSRVNFVCkpDQogIHsNCiAgICAvKiBHZXQgdGljayAqLw0KICAgIHRpY2tzdGFydCA9IEhBTF9HZXRUaWNrKCk7DQogICANCiAgICB3aGlsZShfX0hBTF9ETUEyRF9HRVRfRkxBRyhoZG1hMmQsIERNQTJEX0ZMQUdfQ1RDKSA9PSBSRVNFVCkNCiAgICB7DQogICAgICBpc3JmbGFncyA9IFJFQURfUkVHKGhkbWEyZC0+SW5zdGFuY2UtPklTUik7ICAgDQogICAgICBpZiAoKGlzcmZsYWdzICYgKERNQTJEX0ZMQUdfQ0FFfERNQTJEX0ZMQUdfQ0V8RE1BMkRfRkxBR19URSkpICE9IFJFU0VUKSAgICAgICAgDQogICAgICB7ICAgICAgDQogICAgICAgIGlmICgoaXNyZmxhZ3MgJiBETUEyRF9GTEFHX0NBRSkgIT0gUkVTRVQpDQogICAgICAgIHsNCiAgICAgICAgICBoZG1hMmQtPkVycm9yQ29kZSB8PSBIQUxfRE1BMkRfRVJST1JfQ0FFOyAgICAgICAgDQogICAgICAgIH0gICANCiAgICAgICAgaWYgKChpc3JmbGFncyAmIERNQTJEX0ZMQUdfQ0UpICE9IFJFU0VUKSAgICAgICAgICAgICANCiAgICAgICAgew0KICAgICAgICAgIGhkbWEyZC0+RXJyb3JDb2RlIHw9IEhBTF9ETUEyRF9FUlJPUl9DRTsgICAgICAgIA0KICAgICAgICB9DQogICAgICAgIGlmICgoaXNyZmxhZ3MgJiBETUEyRF9GTEFHX1RFKSAhPSBSRVNFVCkgICAgICAgIA0KICAgICAgICB7DQogICAgICAgICAgaGRtYTJkLT5FcnJvckNvZGUgfD0gSEFMX0RNQTJEX0VSUk9SX1RFOyAgICAgICAgDQogICAgICAgIH0NCiAgICAgICAgLyogQ2xlYXIgdGhlIENMVVQgQWNjZXNzIEVycm9yLCBDb25maWd1cmF0aW9uIEVycm9yIGFuZCBUcmFuc2ZlciBFcnJvciBmbGFncyAqLw0KICAgICAgICBfX0hBTF9ETUEyRF9DTEVBUl9GTEFHKGhkbWEyZCwgRE1BMkRfRkxBR19DQUUgfCBETUEyRF9GTEFHX0NFIHwgRE1BMkRfRkxBR19URSk7DQogICAgICAgIA0KICAgICAgICAvKiBDaGFuZ2UgRE1BMkQgc3RhdGUgKi8NCiAgICAgICAgaGRtYTJkLT5TdGF0ZT0gSEFMX0RNQTJEX1NUQVRFX0VSUk9SOw0KICAgICAgICANCiAgICAgICAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLw0KICAgICAgICBfX0hBTF9VTkxPQ0soaGRtYTJkKTsNCiAgICAgICAgICANCiAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsgICAgICANCiAgICAgIH0gICAgICANCiAgICAgIC8qIENoZWNrIGZvciB0aGUgVGltZW91dCAqLw0KICAgICAgaWYoVGltZW91dCAhPSBIQUxfTUFYX0RFTEFZKQ0KICAgICAgew0KICAgICAgICBpZigoVGltZW91dCA9PSAwKXx8KChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0ICkgPiBUaW1lb3V0KSkNCiAgICAgICAgew0KICAgICAgICAgIC8qIFVwZGF0ZSBlcnJvciBjb2RlICovDQogICAgICAgICAgaGRtYTJkLT5FcnJvckNvZGUgfD0gSEFMX0RNQTJEX0VSUk9SX1RJTUVPVVQ7DQogICAgDQogICAgICAgICAgLyogQ2hhbmdlIHRoZSBETUEyRCBzdGF0ZSAqLw0KICAgICAgICAgIGhkbWEyZC0+U3RhdGU9IEhBTF9ETUEyRF9TVEFURV9USU1FT1VUOw0KICAgICAgICANCiAgICAgICAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovDQogICAgICAgICAgX19IQUxfVU5MT0NLKGhkbWEyZCk7DQogICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgIHJldHVybiBIQUxfVElNRU9VVDsNCiAgICAgICAgfQ0KICAgICAgfSAgICAgIA0KICAgIH0NCiAgfQ0KDQogIC8qIENsZWFyIHRoZSB0cmFuc2ZlciBjb21wbGV0ZSBhbmQgQ0xVVCBsb2FkaW5nIGZsYWdzICovDQogIF9fSEFMX0RNQTJEX0NMRUFSX0ZMQUcoaGRtYTJkLCBETUEyRF9GTEFHX1RDfERNQTJEX0ZMQUdfQ1RDKTsNCiAgDQogIC8qIENoYW5nZSBETUEyRCBzdGF0ZSAqLw0KICBoZG1hMmQtPlN0YXRlID0gSEFMX0RNQTJEX1NUQVRFX1JFQURZOw0KICANCiAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLw0KICBfX0hBTF9VTkxPQ0soaGRtYTJkKTsNCiAgDQogIHJldHVybiBIQUxfT0s7DQp9DQovKioNCiAgKiBAYnJpZWYgIEhhbmRsZSBETUEyRCBpbnRlcnJ1cHQgcmVxdWVzdC4NCiAgKiBAcGFyYW0gIGhkbWEyZDogUG9pbnRlciB0byBhIERNQTJEX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMNCiAgKiAgICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBETUEyRC4gIA0KICAqIEByZXR2YWwgSEFMIHN0YXR1cw0KICAqLw0Kdm9pZCBIQUxfRE1BMkRfSVJRSGFuZGxlcihETUEyRF9IYW5kbGVUeXBlRGVmICpoZG1hMmQpDQp7DQogIHVpbnQzMl90IGlzcmZsYWdzID0gUkVBRF9SRUcoaGRtYTJkLT5JbnN0YW5jZS0+SVNSKTsNCiAgdWludDMyX3QgY3JmbGFncyA9IFJFQURfUkVHKGhkbWEyZC0+SW5zdGFuY2UtPkNSKTsNCiAgICAgICAgDQogIC8qIFRyYW5zZmVyIEVycm9yIEludGVycnVwdCBtYW5hZ2VtZW50ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCiAgaWYgKChpc3JmbGFncyAmIERNQTJEX0ZMQUdfVEUpICE9IFJFU0VUKQ0KICB7DQogICAgaWYgKChjcmZsYWdzICYgRE1BMkRfSVRfVEUpICE9IFJFU0VUKSAgICANCiAgICB7DQogICAgICAvKiBEaXNhYmxlIHRoZSB0cmFuc2ZlciBFcnJvciBpbnRlcnJ1cHQgKi8NCiAgICAgIF9fSEFMX0RNQTJEX0RJU0FCTEVfSVQoaGRtYTJkLCBETUEyRF9JVF9URSk7ICANCg0KICAgICAgLyogVXBkYXRlIGVycm9yIGNvZGUgKi8NCiAgICAgIGhkbWEyZC0+RXJyb3JDb2RlIHw9IEhBTF9ETUEyRF9FUlJPUl9URTsNCiAgICANCiAgICAgIC8qIENsZWFyIHRoZSB0cmFuc2ZlciBlcnJvciBmbGFnICovDQogICAgICBfX0hBTF9ETUEyRF9DTEVBUl9GTEFHKGhkbWEyZCwgRE1BMkRfRkxBR19URSk7DQoNCiAgICAgIC8qIENoYW5nZSBETUEyRCBzdGF0ZSAqLw0KICAgICAgaGRtYTJkLT5TdGF0ZSA9IEhBTF9ETUEyRF9TVEFURV9FUlJPUjsNCg0KICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLw0KICAgICAgX19IQUxfVU5MT0NLKGhkbWEyZCk7ICAgICAgIA0KICAgICAgDQogICAgICBpZihoZG1hMmQtPlhmZXJFcnJvckNhbGxiYWNrICE9IE5VTEwpDQogICAgICB7DQogICAgICAgIC8qIFRyYW5zZmVyIGVycm9yIENhbGxiYWNrICovDQogICAgICAgIGhkbWEyZC0+WGZlckVycm9yQ2FsbGJhY2soaGRtYTJkKTsNCiAgICAgIH0NCiAgICB9DQogIH0NCiAgLyogQ29uZmlndXJhdGlvbiBFcnJvciBJbnRlcnJ1cHQgbWFuYWdlbWVudCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KICBpZiAoKGlzcmZsYWdzICYgRE1BMkRfRkxBR19DRSkgIT0gUkVTRVQpDQogIHsNCiAgICBpZiAoKGNyZmxhZ3MgJiBETUEyRF9JVF9DRSkgIT0gUkVTRVQpICAgIA0KICAgIHsgIA0KICAgICAgLyogRGlzYWJsZSB0aGUgQ29uZmlndXJhdGlvbiBFcnJvciBpbnRlcnJ1cHQgKi8NCiAgICAgIF9fSEFMX0RNQTJEX0RJU0FCTEVfSVQoaGRtYTJkLCBETUEyRF9JVF9DRSk7DQogIA0KICAgICAgLyogQ2xlYXIgdGhlIENvbmZpZ3VyYXRpb24gZXJyb3IgZmxhZyAqLw0KICAgICAgX19IQUxfRE1BMkRfQ0xFQVJfRkxBRyhoZG1hMmQsIERNQTJEX0ZMQUdfQ0UpOw0KDQogICAgICAvKiBVcGRhdGUgZXJyb3IgY29kZSAqLw0KICAgICAgaGRtYTJkLT5FcnJvckNvZGUgfD0gSEFMX0RNQTJEX0VSUk9SX0NFOyAgICANCiAgICANCiAgICAgIC8qIENoYW5nZSBETUEyRCBzdGF0ZSAqLw0KICAgICAgaGRtYTJkLT5TdGF0ZSA9IEhBTF9ETUEyRF9TVEFURV9FUlJPUjsNCg0KICAgICAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLw0KICAgICAgX19IQUxfVU5MT0NLKGhkbWEyZCk7ICAgICAgIA0KICAgICAgDQogICAgICBpZihoZG1hMmQtPlhmZXJFcnJvckNhbGxiYWNrICE9IE5VTEwpDQogICAgICB7DQogICAgICAgIC8qIFRyYW5zZmVyIGVycm9yIENhbGxiYWNrICovDQogICAgICAgIGhkbWEyZC0+WGZlckVycm9yQ2FsbGJhY2soaGRtYTJkKTsNCiAgICAgIH0NCiAgICB9DQogIH0NCiAgLyogQ0xVVCBhY2Nlc3MgRXJyb3IgSW50ZXJydXB0IG1hbmFnZW1lbnQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQogIGlmICgoaXNyZmxhZ3MgJiBETUEyRF9GTEFHX0NBRSkgIT0gUkVTRVQpDQogIHsNCiAgICBpZiAoKGNyZmxhZ3MgJiBETUEyRF9JVF9DQUUpICE9IFJFU0VUKSAgICANCiAgICB7ICAgIA0KICAgICAgLyogRGlzYWJsZSB0aGUgQ0xVVCBhY2Nlc3MgZXJyb3IgaW50ZXJydXB0ICovDQogICAgICBfX0hBTF9ETUEyRF9ESVNBQkxFX0lUKGhkbWEyZCwgRE1BMkRfSVRfQ0FFKTsNCiAgDQogICAgICAvKiBDbGVhciB0aGUgQ0xVVCBhY2Nlc3MgZXJyb3IgZmxhZyAqLw0KICAgICAgX19IQUxfRE1BMkRfQ0xFQVJfRkxBRyhoZG1hMmQsIERNQTJEX0ZMQUdfQ0FFKTsNCg0KICAgICAgLyogVXBkYXRlIGVycm9yIGNvZGUgKi8NCiAgICAgIGhkbWEyZC0+RXJyb3JDb2RlIHw9IEhBTF9ETUEyRF9FUlJPUl9DQUU7ICAgIA0KICAgIA0KICAgICAgLyogQ2hhbmdlIERNQTJEIHN0YXRlICovDQogICAgICBoZG1hMmQtPlN0YXRlID0gSEFMX0RNQTJEX1NUQVRFX0VSUk9SOw0KDQogICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovDQogICAgICBfX0hBTF9VTkxPQ0soaGRtYTJkKTsgICAgICAgDQogICAgICANCiAgICAgIGlmKGhkbWEyZC0+WGZlckVycm9yQ2FsbGJhY2sgIT0gTlVMTCkNCiAgICAgIHsNCiAgICAgICAgLyogVHJhbnNmZXIgZXJyb3IgQ2FsbGJhY2sgKi8NCiAgICAgICAgaGRtYTJkLT5YZmVyRXJyb3JDYWxsYmFjayhoZG1hMmQpOw0KICAgICAgfQ0KICAgIH0NCiAgfSAgDQogIC8qIFRyYW5zZmVyIHdhdGVybWFyayBJbnRlcnJ1cHQgbWFuYWdlbWVudCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KICBpZiAoKGlzcmZsYWdzICYgRE1BMkRfRkxBR19UVykgIT0gUkVTRVQpDQogIHsNCiAgICBpZiAoKGNyZmxhZ3MgJiBETUEyRF9JVF9UVykgIT0gUkVTRVQpICAgIA0KICAgIHsgICAgDQogICAgICAvKiBEaXNhYmxlIHRoZSB0cmFuc2ZlciB3YXRlcm1hcmsgaW50ZXJydXB0ICovDQogICAgICBfX0hBTF9ETUEyRF9ESVNBQkxFX0lUKGhkbWEyZCwgRE1BMkRfSVRfVFcpOw0KICANCiAgICAgIC8qIENsZWFyIHRoZSB0cmFuc2ZlciB3YXRlcm1hcmsgZmxhZyAqLyAgDQogICAgICBfX0hBTF9ETUEyRF9DTEVBUl9GTEFHKGhkbWEyZCwgRE1BMkRfRkxBR19UVyk7DQoNCiAgICAgIC8qIFRyYW5zZmVyIHdhdGVybWFyayBDYWxsYmFjayAqLw0KICAgICAgSEFMX0RNQTJEX0xpbmVFdmVudENhbGxiYWNrKGhkbWEyZCk7DQogICAgfQ0KICB9ICANCiAgLyogVHJhbnNmZXIgQ29tcGxldGUgSW50ZXJydXB0IG1hbmFnZW1lbnQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KICBpZiAoKGlzcmZsYWdzICYgRE1BMkRfRkxBR19UQykgIT0gUkVTRVQpDQogIHsNCiAgICBpZiAoKGNyZmxhZ3MgJiBETUEyRF9JVF9UQykgIT0gUkVTRVQpICAgIA0KICAgIHsgICANCiAgICAgIC8qIERpc2FibGUgdGhlIHRyYW5zZmVyIGNvbXBsZXRlIGludGVycnVwdCAqLw0KICAgICAgX19IQUxfRE1BMkRfRElTQUJMRV9JVChoZG1hMmQsIERNQTJEX0lUX1RDKTsNCiAgDQogICAgICAvKiBDbGVhciB0aGUgdHJhbnNmZXIgY29tcGxldGUgZmxhZyAqLyAgDQogICAgICBfX0hBTF9ETUEyRF9DTEVBUl9GTEFHKGhkbWEyZCwgRE1BMkRfRkxBR19UQyk7DQoNCiAgICAgIC8qIFVwZGF0ZSBlcnJvciBjb2RlICovDQogICAgICBoZG1hMmQtPkVycm9yQ29kZSB8PSBIQUxfRE1BMkRfRVJST1JfTk9ORTsgICAgDQogICAgDQogICAgICAvKiBDaGFuZ2UgRE1BMkQgc3RhdGUgKi8NCiAgICAgIGhkbWEyZC0+U3RhdGUgPSBIQUxfRE1BMkRfU1RBVEVfUkVBRFk7DQogICAgDQogICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovDQogICAgICBfX0hBTF9VTkxPQ0soaGRtYTJkKTsgICAgICAgDQogICAgICANCiAgICAgIGlmKGhkbWEyZC0+WGZlckNwbHRDYWxsYmFjayAhPSBOVUxMKQ0KICAgICAgew0KICAgICAgICAvKiBUcmFuc2ZlciBjb21wbGV0ZSBDYWxsYmFjayAqLw0KICAgICAgICBoZG1hMmQtPlhmZXJDcGx0Q2FsbGJhY2soaGRtYTJkKTsNCiAgICAgIH0gICAgICAgICANCiAgICB9DQogIH0NCiAgLyogQ0xVVCBUcmFuc2ZlciBDb21wbGV0ZSBJbnRlcnJ1cHQgbWFuYWdlbWVudCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQogIGlmICgoaXNyZmxhZ3MgJiBETUEyRF9GTEFHX0NUQykgIT0gUkVTRVQpDQogIHsNCiAgICBpZiAoKGNyZmxhZ3MgJiBETUEyRF9JVF9DVEMpICE9IFJFU0VUKSAgICANCiAgICB7ICAgIA0KICAgICAgLyogRGlzYWJsZSB0aGUgQ0xVVCB0cmFuc2ZlciBjb21wbGV0ZSBpbnRlcnJ1cHQgKi8NCiAgICAgIF9fSEFMX0RNQTJEX0RJU0FCTEVfSVQoaGRtYTJkLCBETUEyRF9JVF9DVEMpOw0KICANCiAgICAgIC8qIENsZWFyIHRoZSBDTFVUIHRyYW5zZmVyIGNvbXBsZXRlIGZsYWcgKi8gIA0KICAgICAgX19IQUxfRE1BMkRfQ0xFQVJfRkxBRyhoZG1hMmQsIERNQTJEX0ZMQUdfQ1RDKTsNCg0KICAgICAgLyogVXBkYXRlIGVycm9yIGNvZGUgKi8NCiAgICAgIGhkbWEyZC0+RXJyb3JDb2RlIHw9IEhBTF9ETUEyRF9FUlJPUl9OT05FOyAgICANCiAgICANCiAgICAgIC8qIENoYW5nZSBETUEyRCBzdGF0ZSAqLw0KICAgICAgaGRtYTJkLT5TdGF0ZSA9IEhBTF9ETUEyRF9TVEFURV9SRUFEWTsNCiAgICANCiAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8NCiAgICAgIF9fSEFMX1VOTE9DSyhoZG1hMmQpOyAgICAgICANCiAgICAgIA0KICAgICAgLyogQ0xVVCBUcmFuc2ZlciBjb21wbGV0ZSBDYWxsYmFjayAqLw0KICAgICAgSEFMX0RNQTJEX0NMVVRMb2FkaW5nQ3BsdENhbGxiYWNrKGhkbWEyZCk7ICAgICAgICAgDQogICAgfQ0KICB9ICANCiAgDQp9DQoNCi8qKg0KICAqIEBicmllZiAgVHJhbnNmZXIgd2F0ZXJtYXJrIGNhbGxiYWNrLg0KICAqIEBwYXJhbSAgaGRtYTJkOiBwb2ludGVyIHRvIGEgRE1BMkRfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucw0KICAqICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIERNQTJELg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0KX193ZWFrIHZvaWQgSEFMX0RNQTJEX0xpbmVFdmVudENhbGxiYWNrKERNQTJEX0hhbmRsZVR5cGVEZWYgKmhkbWEyZCkNCnsNCiAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLw0KICBVTlVTRUQoaGRtYTJkKTsNCiAgDQogIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQ7IHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwNCiAgICAgICAgICAgIHRoZSBIQUxfRE1BMkRfTGluZUV2ZW50Q2FsbGJhY2sgY2FuIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUuDQogICAqLw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIENMVVQgVHJhbnNmZXIgQ29tcGxldGUgY2FsbGJhY2suDQogICogQHBhcmFtICBoZG1hMmQ6IHBvaW50ZXIgdG8gYSBETUEyRF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zDQogICogICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgRE1BMkQuDQogICogQHJldHZhbCBOb25lDQogICovDQpfX3dlYWsgdm9pZCBIQUxfRE1BMkRfQ0xVVExvYWRpbmdDcGx0Q2FsbGJhY2soRE1BMkRfSGFuZGxlVHlwZURlZiAqaGRtYTJkKQ0Kew0KICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovDQogIFVOVVNFRChoZG1hMmQpOw0KICANCiAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZDsgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLA0KICAgICAgICAgICAgdGhlIEhBTF9ETUEyRF9DTFVUTG9hZGluZ0NwbHRDYWxsYmFjayBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZS4NCiAgICovDQp9IA0KDQovKioNCiAgKiBAfQ0KICAqLw0KDQovKiogQGRlZmdyb3VwIERNQTJEX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDMgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucw0KICogIEBicmllZiAgICBQZXJpcGhlcmFsIENvbnRyb2wgZnVuY3Rpb25zIA0KICoNCkB2ZXJiYXRpbSAgIA0KID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCiAgICAgICAgICAgICAgICAgICAgIyMjIyMgUGVyaXBoZXJhbCBDb250cm9sIGZ1bmN0aW9ucyAjIyMjIw0KID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gIA0KICAgIFsuLl0gIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86DQogICAgICAoKykgQ29uZmlndXJlIHRoZSBETUEyRCBmb3JlZ3JvdW5kIG9yIGJhY2tncm91bmQgbGF5ZXIgcGFyYW1ldGVycy4NCiAgICAgICgrKSBDb25maWd1cmUgdGhlIERNQTJEIENMVVQgdHJhbnNmZXIuDQogICAgICAoKykgQ29uZmlndXJlIHRoZSBsaW5lIHdhdGVybWFyaw0KICAgICAgKCspIENvbmZpZ3VyZSB0aGUgZGVhZCB0aW1lIHZhbHVlLg0KICAgICAgKCspIEVuYWJsZSBvciBkaXNhYmxlIHRoZSBkZWFkIHRpbWUgdmFsdWUgZnVuY3Rpb25hbGl0eS4gICAgICANCiAgICAgICAgICANCg0KQGVuZHZlcmJhdGltDQogICogQHsNCiAgKi8NCg0KLyoqDQogICogQGJyaWVmICBDb25maWd1cmUgdGhlIERNQTJEIExheWVyIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkDQogICogICAgICAgICBwYXJhbWV0ZXJzIGluIHRoZSBETUEyRF9IYW5kbGVUeXBlRGVmLg0KICAqIEBwYXJhbSAgaGRtYTJkOiBQb2ludGVyIHRvIGEgRE1BMkRfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucw0KICAqICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIERNQTJELg0KICAqIEBwYXJhbSAgTGF5ZXJJZHg6IERNQTJEIExheWVyIGluZGV4Lg0KICAqICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgICAgICAgICAgICAgICAgMChiYWNrZ3JvdW5kKSAvIDEoZm9yZWdyb3VuZCkNCiAgKiBAcmV0dmFsIEhBTCBzdGF0dXMNCiAgKi8NCkhBTF9TdGF0dXNUeXBlRGVmIEhBTF9ETUEyRF9Db25maWdMYXllcihETUEyRF9IYW5kbGVUeXBlRGVmICpoZG1hMmQsIHVpbnQzMl90IExheWVySWR4KQ0KeyAgIA0KICBETUEyRF9MYXllckNmZ1R5cGVEZWYgKkxheWVyQ2ZnID0gJmhkbWEyZC0+TGF5ZXJDZmdbTGF5ZXJJZHhdOw0KICB1aW50MzJfdCB0bXAgPSAwOw0KICANCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX0RNQTJEX0xBWUVSKExheWVySWR4KSk7ICANCiAgYXNzZXJ0X3BhcmFtKElTX0RNQTJEX09GRlNFVChMYXllckNmZy0+SW5wdXRPZmZzZXQpKTsgIA0KICBpZihoZG1hMmQtPkluaXQuTW9kZSAhPSBETUEyRF9SMk0pDQogIHsgIA0KICAgIGFzc2VydF9wYXJhbShJU19ETUEyRF9JTlBVVF9DT0xPUl9NT0RFKExheWVyQ2ZnLT5JbnB1dENvbG9yTW9kZSkpOw0KICAgIGlmKGhkbWEyZC0+SW5pdC5Nb2RlICE9IERNQTJEX00yTSkNCiAgICB7DQogICAgICBhc3NlcnRfcGFyYW0oSVNfRE1BMkRfQUxQSEFfTU9ERShMYXllckNmZy0+QWxwaGFNb2RlKSk7DQogICAgfQ0KICB9DQogIGFzc2VydF9wYXJhbShJU19ETUEyRF9BTFBIQV9JTlZFUlRFRChMYXllckNmZy0+QWxwaGFJbnZlcnRlZCkpOyANCiAgYXNzZXJ0X3BhcmFtKElTX0RNQTJEX1JCX1NXQVAoTGF5ZXJDZmctPlJlZEJsdWVTd2FwKSk7ICAgICANCiAgDQogIC8qIFByb2Nlc3MgbG9ja2VkICovDQogIF9fSEFMX0xPQ0soaGRtYTJkKTsNCiAgDQogIC8qIENoYW5nZSBETUEyRCBwZXJpcGhlcmFsIHN0YXRlICovDQogIGhkbWEyZC0+U3RhdGUgPSBIQUxfRE1BMkRfU1RBVEVfQlVTWTsgICANCiAgDQogIC8qIENvbmZpZ3VyZSB0aGUgYmFja2dyb3VuZCBETUEyRCBsYXllciAqLw0KICBpZihMYXllcklkeCA9PSAwKQ0KICB7DQogICAgLyogRE1BMkQgQkdQRkNSIHJlZ2lzdGVyIGNvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KICAgIC8qIFByZXBhcmUgdGhlIHZhbHVlIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIEJHUEZDQ1IgcmVnaXN0ZXIgKi8NCiAgICBpZiAoKExheWVyQ2ZnLT5JbnB1dENvbG9yTW9kZSA9PSBETUEyRF9JTlBVVF9BNCkgfHwgKExheWVyQ2ZnLT5JbnB1dENvbG9yTW9kZSA9PSBETUEyRF9JTlBVVF9BOCkpDQogICAgew0KICAgICAgdG1wID0gKExheWVyQ2ZnLT5JbnB1dENvbG9yTW9kZSB8IChMYXllckNmZy0+QWxwaGFNb2RlIDw8IERNQTJEX1BPU0lUSU9OX0JHUEZDQ1JfQU0pIHwgKExheWVyQ2ZnLT5JbnB1dEFscGhhICYgRE1BMkRfQkdQRkNDUl9BTFBIQSkpOw0KICAgIH0NCiAgICBlbHNlDQogICAgew0KICAgICAgdG1wID0gKExheWVyQ2ZnLT5JbnB1dENvbG9yTW9kZSB8IChMYXllckNmZy0+QWxwaGFNb2RlIDw8IERNQTJEX1BPU0lUSU9OX0JHUEZDQ1JfQU0pIHwgKExheWVyQ2ZnLT5JbnB1dEFscGhhIDw8IERNQTJEX1BPU0lUSU9OX0JHUEZDQ1JfQUxQSEEpKTsNCiAgICB9DQogICAgDQogICAgLyogV3JpdGUgRE1BMkQgQkdQRkNDUiByZWdpc3RlciAqLw0KICAgIE1PRElGWV9SRUcoaGRtYTJkLT5JbnN0YW5jZS0+QkdQRkNDUiwgKERNQTJEX0JHUEZDQ1JfQ00gfCBETUEyRF9CR1BGQ0NSX0FNIHwgRE1BMkRfQkdQRkNDUl9BTFBIQSB8IERNQTJEX0JHUEZDQ1JfQUkgfCBETUEyRF9CR1BGQ0NSX1JCUyksIFwNCiAgICAgICAgICAgICAgKHRtcCB8IChMYXllckNmZy0+QWxwaGFJbnZlcnRlZCA8PCBETUEyRF9QT1NJVElPTl9CR1BGQ0NSX0FJKSB8KExheWVyQ2ZnLT5SZWRCbHVlU3dhcCA8PCBETUEyRF9QT1NJVElPTl9CR1BGQ0NSX1JCUykpKTsNCg0KICAgICAgICAgICAgICANCiAgICAvKiBETUEyRCBCR09SIHJlZ2lzdGVyIGNvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovICANCiAgICBXUklURV9SRUcoaGRtYTJkLT5JbnN0YW5jZS0+QkdPUiwgTGF5ZXJDZmctPklucHV0T2Zmc2V0KTsNCiAgICANCiAgICAvKiBETUEyRCBCR0NPTFIgcmVnaXN0ZXIgY29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8gDQogICAgaWYgKChMYXllckNmZy0+SW5wdXRDb2xvck1vZGUgPT0gRE1BMkRfSU5QVVRfQTQpIHx8IChMYXllckNmZy0+SW5wdXRDb2xvck1vZGUgPT0gRE1BMkRfSU5QVVRfQTgpKQ0KICAgIHsgICAgDQogICAgICBXUklURV9SRUcoaGRtYTJkLT5JbnN0YW5jZS0+QkdDT0xSLCBMYXllckNmZy0+SW5wdXRBbHBoYSAmIChETUEyRF9CR0NPTFJfQkxVRXxETUEyRF9CR0NPTFJfR1JFRU58RE1BMkRfQkdDT0xSX1JFRCkpOw0KICAgIH0gICAgDQogIH0NCiAgLyogQ29uZmlndXJlIHRoZSBmb3JlZ3JvdW5kIERNQTJEIGxheWVyICovDQogIGVsc2UNCiAgew0KICAgIC8qIERNQTJEIEZHUEZDUiByZWdpc3RlciBjb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8gICANCiAgICAvKiBQcmVwYXJlIHRoZSB2YWx1ZSB0byBiZSB3cml0dGVuIHRvIHRoZSBGR1BGQ0NSIHJlZ2lzdGVyICovICAgICANCiAgICBpZiAoKExheWVyQ2ZnLT5JbnB1dENvbG9yTW9kZSA9PSBETUEyRF9JTlBVVF9BNCkgfHwgKExheWVyQ2ZnLT5JbnB1dENvbG9yTW9kZSA9PSBETUEyRF9JTlBVVF9BOCkpDQogICAgew0KICAgICAgdG1wID0gKExheWVyQ2ZnLT5JbnB1dENvbG9yTW9kZSB8IChMYXllckNmZy0+QWxwaGFNb2RlIDw8IERNQTJEX1BPU0lUSU9OX0ZHUEZDQ1JfQU0pIHwgKExheWVyQ2ZnLT5JbnB1dEFscGhhICYgRE1BMkRfRkdQRkNDUl9BTFBIQSkpOw0KICAgIH0NCiAgICBlbHNlDQogICAgew0KICAgICAgdG1wID0gKExheWVyQ2ZnLT5JbnB1dENvbG9yTW9kZSB8IChMYXllckNmZy0+QWxwaGFNb2RlIDw8IERNQTJEX1BPU0lUSU9OX0ZHUEZDQ1JfQU0pIHwgKExheWVyQ2ZnLT5JbnB1dEFscGhhIDw8IERNQTJEX1BPU0lUSU9OX0ZHUEZDQ1JfQUxQSEEpKTsNCiAgICB9DQogICAgDQogICAgLyogV3JpdGUgRE1BMkQgRkdQRkNDUiByZWdpc3RlciAqLw0KICAgIE1PRElGWV9SRUcoaGRtYTJkLT5JbnN0YW5jZS0+RkdQRkNDUiwgKERNQTJEX0ZHUEZDQ1JfQ00gfCBETUEyRF9GR1BGQ0NSX0FNIHwgRE1BMkRfRkdQRkNDUl9BTFBIQSB8IERNQTJEX0ZHUEZDQ1JfQUkgfCBETUEyRF9GR1BGQ0NSX1JCUyksIFwNCiAgICAgICAgICAgICAgKHRtcCB8IChMYXllckNmZy0+QWxwaGFJbnZlcnRlZCA8PCBETUEyRF9QT1NJVElPTl9GR1BGQ0NSX0FJKSB8KExheWVyQ2ZnLT5SZWRCbHVlU3dhcCA8PCBETUEyRF9QT1NJVElPTl9GR1BGQ0NSX1JCUykpKTsNCg0KICAgIA0KICAgIC8qIERNQTJEIEZHT1IgcmVnaXN0ZXIgY29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiAgICBXUklURV9SRUcoaGRtYTJkLT5JbnN0YW5jZS0+RkdPUiwgTGF5ZXJDZmctPklucHV0T2Zmc2V0KTsgICAgICANCiAgIA0KICAgIC8qIERNQTJEIEZHQ09MUiByZWdpc3RlciBjb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyAgIA0KICAgIGlmICgoTGF5ZXJDZmctPklucHV0Q29sb3JNb2RlID09IERNQTJEX0lOUFVUX0E0KSB8fCAoTGF5ZXJDZmctPklucHV0Q29sb3JNb2RlID09IERNQTJEX0lOUFVUX0E4KSkNCiAgICB7DQogICAgICBXUklURV9SRUcoaGRtYTJkLT5JbnN0YW5jZS0+RkdDT0xSLCBMYXllckNmZy0+SW5wdXRBbHBoYSAmIChETUEyRF9GR0NPTFJfQkxVRXxETUEyRF9GR0NPTFJfR1JFRU58RE1BMkRfRkdDT0xSX1JFRCkpOyAgICAgIA0KICAgIH0gICANCiAgfSAgICANCiAgLyogSW5pdGlhbGl6ZSB0aGUgRE1BMkQgc3RhdGUqLw0KICBoZG1hMmQtPlN0YXRlID0gSEFMX0RNQTJEX1NUQVRFX1JFQURZOw0KICANCiAgLyogUHJvY2VzcyB1bmxvY2tlZCAqLw0KICBfX0hBTF9VTkxPQ0soaGRtYTJkKTsgIA0KICANCiAgcmV0dXJuIEhBTF9PSzsNCn0NCg0KLyoqDQogICogQGJyaWVmICBDb25maWd1cmUgdGhlIERNQTJEIENMVVQgVHJhbnNmZXIuDQogICogQHBhcmFtICBoZG1hMmQ6ICAgUG9pbnRlciB0byBhIERNQTJEX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMNCiAgKiAgICAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIERNQTJELg0KICAqIEBwYXJhbSAgQ0xVVENmZzogIFBvaW50ZXIgdG8gYSBETUEyRF9DTFVUQ2ZnVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucw0KICAqICAgICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgY29sb3IgbG9vayB1cCB0YWJsZS4NCiAgKiBAcGFyYW0gIExheWVySWR4OiBETUEyRCBMYXllciBpbmRleC4NCiAgKiAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgICAgICAgICAgICAgICAgIDAoYmFja2dyb3VuZCkgLyAxKGZvcmVncm91bmQpDQogICogQHJldHZhbCBIQUwgc3RhdHVzDQogICovDQpIQUxfU3RhdHVzVHlwZURlZiBIQUxfRE1BMkRfQ29uZmlnQ0xVVChETUEyRF9IYW5kbGVUeXBlRGVmICpoZG1hMmQsIERNQTJEX0NMVVRDZmdUeXBlRGVmIENMVVRDZmcsIHVpbnQzMl90IExheWVySWR4KQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfRE1BMkRfTEFZRVIoTGF5ZXJJZHgpKTsgICANCiAgYXNzZXJ0X3BhcmFtKElTX0RNQTJEX0NMVVRfQ00oQ0xVVENmZy5DTFVUQ29sb3JNb2RlKSk7DQogIGFzc2VydF9wYXJhbShJU19ETUEyRF9DTFVUX1NJWkUoQ0xVVENmZy5TaXplKSk7DQogIA0KICAvKiBQcm9jZXNzIGxvY2tlZCAqLw0KICBfX0hBTF9MT0NLKGhkbWEyZCk7DQogIA0KICAvKiBDaGFuZ2UgRE1BMkQgcGVyaXBoZXJhbCBzdGF0ZSAqLw0KICBoZG1hMmQtPlN0YXRlID0gSEFMX0RNQTJEX1NUQVRFX0JVU1k7ICAgICANCiAgDQogIC8qIENvbmZpZ3VyZSB0aGUgQ0xVVCBvZiB0aGUgYmFja2dyb3VuZCBETUEyRCBsYXllciAqLw0KICBpZihMYXllcklkeCA9PSAwKQ0KICB7DQogICAgLyogV3JpdGUgYmFja2dyb3VuZCBDTFVUIG1lbW9yeSBhZGRyZXNzICovDQogICAgV1JJVEVfUkVHKGhkbWEyZC0+SW5zdGFuY2UtPkJHQ01BUiwgKHVpbnQzMl90KUNMVVRDZmcucENMVVQpOw0KICAgICANCiAgICAvKiBXcml0ZSBiYWNrZ3JvdW5kIENMVVQgc2l6ZSBhbmQgQ0xVVCBjb2xvciBtb2RlICovDQogICAgTU9ESUZZX1JFRyhoZG1hMmQtPkluc3RhbmNlLT5CR1BGQ0NSLCAoRE1BMkRfQkdQRkNDUl9DUyB8IERNQTJEX0JHUEZDQ1JfQ0NNKSwgDQogICAgICAgICAgICAoKENMVVRDZmcuU2l6ZSA8PCBETUEyRF9QT1NJVElPTl9CR1BGQ0NSX0NTKSB8IChDTFVUQ2ZnLkNMVVRDb2xvck1vZGUgPDwgRE1BMkRfUE9TSVRJT05fQkdQRkNDUl9DQ00pKSk7ICAgICAgIA0KIH0NCiAvKiBDb25maWd1cmUgdGhlIENMVVQgb2YgdGhlIGZvcmVncm91bmQgRE1BMkQgbGF5ZXIgKi8NCiBlbHNlDQogew0KICAgLyogV3JpdGUgZm9yZWdyb3VuZCBDTFVUIG1lbW9yeSBhZGRyZXNzICovDQogICAgV1JJVEVfUkVHKGhkbWEyZC0+SW5zdGFuY2UtPkZHQ01BUiwgKHVpbnQzMl90KUNMVVRDZmcucENMVVQpOw0KICAgICANCiAgICAvKiBXcml0ZSBmb3JlZ3JvdW5kIENMVVQgc2l6ZSBhbmQgQ0xVVCBjb2xvciBtb2RlICovDQogICAgTU9ESUZZX1JFRyhoZG1hMmQtPkluc3RhbmNlLT5GR1BGQ0NSLCAoRE1BMkRfRkdQRkNDUl9DUyB8IERNQTJEX0ZHUEZDQ1JfQ0NNKSwgDQogICAgICAgICAgICAoKENMVVRDZmcuU2l6ZSA8PCBETUEyRF9QT1NJVElPTl9CR1BGQ0NSX0NTKSB8IChDTFVUQ2ZnLkNMVVRDb2xvck1vZGUgPDwgRE1BMkRfUE9TSVRJT05fRkdQRkNDUl9DQ00pKSk7ICAgICAgIA0KICB9DQogIA0KICAvKiBTZXQgdGhlIERNQTJEIHN0YXRlIHRvIFJlYWR5Ki8NCiAgaGRtYTJkLT5TdGF0ZSA9IEhBTF9ETUEyRF9TVEFURV9SRUFEWTsNCiAgDQogIC8qIFByb2Nlc3MgdW5sb2NrZWQgKi8NCiAgX19IQUxfVU5MT0NLKGhkbWEyZCk7IA0KICAgIA0KICByZXR1cm4gSEFMX09LOw0KfQ0KDQoNCi8qKg0KICAqIEBicmllZiAgQ29uZmlndXJlIHRoZSBsaW5lIHdhdGVybWFyay4NCiAgKiBAcGFyYW0gIGhkbWEyZDogUG9pbnRlciB0byBhIERNQTJEX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMNCiAgKiAgICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBETUEyRC4NCiAgKiBAcGFyYW0gIExpbmU6ICAgTGluZSBXYXRlcm1hcmsgY29uZmlndXJhdGlvbiAobWF4aW11bSAxNi1iaXQgbG9uZyB2YWx1ZSBleHBlY3RlZCkuDQogICogQG5vdGUgICBIQUxfRE1BMkRfUHJvZ3JhbUxpbmVFdmVudCgpIEFQSSBlbmFibGVzIHRoZSB0cmFuc2ZlciB3YXRlcm1hcmsgaW50ZXJydXB0Lg0KICAqIEBub3RlICAgVGhlIHRyYW5zZmVyIHdhdGVybWFyayBpbnRlcnJ1cHQgaXMgZGlzYWJsZWQgb25jZSBpdCBoYXMgb2NjdXJyZWQuDQogICogQHJldHZhbCBIQUwgc3RhdHVzDQogICovDQoNCkhBTF9TdGF0dXNUeXBlRGVmIEhBTF9ETUEyRF9Qcm9ncmFtTGluZUV2ZW50KERNQTJEX0hhbmRsZVR5cGVEZWYgKmhkbWEyZCwgdWludDMyX3QgTGluZSkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX0RNQTJEX0xJTkVXQVRFUk1BUksoTGluZSkpOw0KICANCiAgaWYgKExpbmUgPiBETUEyRF9MV1JfTFcpDQogIHsNCiAgICByZXR1cm4gSEFMX0VSUk9SOyAgDQogIH0NCiAgZWxzZQ0KICB7ICAgICAgDQogICAgLyogUHJvY2VzcyBsb2NrZWQgKi8NCiAgICBfX0hBTF9MT0NLKGhkbWEyZCk7DQogICAgDQogICAgLyogQ2hhbmdlIERNQTJEIHBlcmlwaGVyYWwgc3RhdGUgKi8NCiAgICBoZG1hMmQtPlN0YXRlID0gSEFMX0RNQTJEX1NUQVRFX0JVU1k7DQogIA0KICAgIC8qIFNldHMgdGhlIExpbmUgd2F0ZXJtYXJrIGNvbmZpZ3VyYXRpb24gKi8NCiAgICBXUklURV9SRUcoaGRtYTJkLT5JbnN0YW5jZS0+TFdSLCBMaW5lKTsNCiAgICANCiAgICAvKiBFbmFibGUgdGhlIExpbmUgaW50ZXJydXB0ICovDQogICAgX19IQUxfRE1BMkRfRU5BQkxFX0lUKGhkbWEyZCwgRE1BMkRfSVRfVFcpOw0KICAgICAgICANCiAgICAvKiBJbml0aWFsaXplIHRoZSBETUEyRCBzdGF0ZSovDQogICAgaGRtYTJkLT5TdGF0ZSA9IEhBTF9ETUEyRF9TVEFURV9SRUFEWTsNCiAgICANCiAgICAvKiBQcm9jZXNzIHVubG9ja2VkICovDQogICAgX19IQUxfVU5MT0NLKGhkbWEyZCk7ICANCiAgICANCiAgICByZXR1cm4gSEFMX09LOw0KICB9ICANCn0NCg0KLyoqDQogICogQGJyaWVmIEVuYWJsZSBETUEyRCBkZWFkIHRpbWUgZmVhdHVyZS4NCiAgKiBAcGFyYW0gaGRtYTJkOiBETUEyRCBoYW5kbGUuDQogICogQHJldHZhbCBIQUwgc3RhdHVzDQogICovDQpIQUxfU3RhdHVzVHlwZURlZiBIQUxfRE1BMkRfRW5hYmxlRGVhZFRpbWUoRE1BMkRfSGFuZGxlVHlwZURlZiAqaGRtYTJkKQ0Kew0KICAvKiBQcm9jZXNzIExvY2tlZCAqLw0KICBfX0hBTF9MT0NLKGhkbWEyZCk7DQoNCiAgaGRtYTJkLT5TdGF0ZSA9IEhBTF9ETUEyRF9TVEFURV9CVVNZOw0KDQogIC8qIFNldCBETUEyRF9BTVRDUiBFTiBiaXQgKi8NCiAgU0VUX0JJVChoZG1hMmQtPkluc3RhbmNlLT5BTVRDUiwgRE1BMkRfQU1UQ1JfRU4pOw0KDQogIGhkbWEyZC0+U3RhdGUgPSBIQUxfRE1BMkRfU1RBVEVfUkVBRFk7DQoNCiAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLw0KICBfX0hBTF9VTkxPQ0soaGRtYTJkKTsNCg0KICByZXR1cm4gSEFMX09LOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgRGlzYWJsZSBETUEyRCBkZWFkIHRpbWUgZmVhdHVyZS4NCiAgKiBAcGFyYW0gaGRtYTJkOiBETUEyRCBoYW5kbGUuDQogICogQHJldHZhbCBIQUwgc3RhdHVzDQogICovDQpIQUxfU3RhdHVzVHlwZURlZiBIQUxfRE1BMkRfRGlzYWJsZURlYWRUaW1lKERNQTJEX0hhbmRsZVR5cGVEZWYgKmhkbWEyZCkNCnsNCiAgLyogUHJvY2VzcyBMb2NrZWQgKi8NCiAgX19IQUxfTE9DSyhoZG1hMmQpOw0KDQogIGhkbWEyZC0+U3RhdGUgPSBIQUxfRE1BMkRfU1RBVEVfQlVTWTsNCg0KICAvKiBDbGVhciBETUEyRF9BTVRDUiBFTiBiaXQgKi8NCiAgQ0xFQVJfQklUKGhkbWEyZC0+SW5zdGFuY2UtPkFNVENSLCBETUEyRF9BTVRDUl9FTik7DQoNCiAgaGRtYTJkLT5TdGF0ZSA9IEhBTF9ETUEyRF9TVEFURV9SRUFEWTsNCg0KICAvKiBQcm9jZXNzIFVubG9ja2VkICovDQogIF9fSEFMX1VOTE9DSyhoZG1hMmQpOw0KDQogIHJldHVybiBIQUxfT0s7DQp9DQoNCi8qKg0KICAqIEBicmllZiBDb25maWd1cmUgZGVhZCB0aW1lLg0KICAqIEBub3RlIFRoZSBkZWFkIHRpbWUgdmFsdWUgcmVwcmVzZW50cyB0aGUgZ3VhcmFudGVlZCBtaW5pbXVtIG51bWJlciBvZiBjeWNsZXMgYmV0d2VlbiANCiAgKiAgICAgICB0d28gY29uc2VjdXRpdmUgdHJhbnNhY3Rpb25zIG9uIHRoZSBBSEIgYnVzLg0KICAqIEBwYXJhbSBoZG1hMmQ6IERNQTJEIGhhbmRsZS4NCiAgKiBAcGFyYW0gRGVhZFRpbWU6IGRlYWQgdGltZSB2YWx1ZS4NCiAgKiBAcmV0dmFsIEhBTCBzdGF0dXMNCiAgKi8NCkhBTF9TdGF0dXNUeXBlRGVmIEhBTF9ETUEyRF9Db25maWdEZWFkVGltZShETUEyRF9IYW5kbGVUeXBlRGVmICpoZG1hMmQsIHVpbnQ4X3QgRGVhZFRpbWUpDQp7DQogIC8qIFByb2Nlc3MgTG9ja2VkICovDQogIF9fSEFMX0xPQ0soaGRtYTJkKTsgIA0KICANCiAgaGRtYTJkLT5TdGF0ZSA9IEhBTF9ETUEyRF9TVEFURV9CVVNZOw0KDQogIC8qIFNldCBETUEyRF9BTVRDUiBEVCBmaWVsZCAqLw0KICBNT0RJRllfUkVHKGhkbWEyZC0+SW5zdGFuY2UtPkFNVENSLCBETUEyRF9BTVRDUl9EVCwgKCgodWludDMyX3QpIERlYWRUaW1lKSA8PCBETUEyRF9QT1NJVElPTl9BTVRDUl9EVCkpOw0KDQogIGhkbWEyZC0+U3RhdGUgPSBIQUxfRE1BMkRfU1RBVEVfUkVBRFk7DQoNCiAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLw0KICBfX0hBTF9VTkxPQ0soaGRtYTJkKTsNCg0KICByZXR1cm4gSEFMX09LOw0KfQ0KDQovKioNCiAgKiBAfQ0KICAqLw0KICANCg0KLyoqIEBkZWZncm91cCBETUEyRF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXA0IFBlcmlwaGVyYWwgU3RhdGUgYW5kIEVycm9yIGZ1bmN0aW9ucw0KICogIEBicmllZiAgICBQZXJpcGhlcmFsIFN0YXRlIGZ1bmN0aW9ucyANCiAqDQpAdmVyYmF0aW0gICANCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQogICAgICAgICAgICAgICAgICAjIyMjIyBQZXJpcGhlcmFsIFN0YXRlIGFuZCBFcnJvcnMgZnVuY3Rpb25zICMjIyMjDQogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAgDQogICAgWy4uXQ0KICAgIFRoaXMgc3Vic2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG8gOg0KICAgICAgKCspIEdldCB0aGUgRE1BMkQgc3RhdGUNCiAgICAgICgrKSBHZXQgdGhlIERNQTJEIGVycm9yIGNvZGUgIA0KDQpAZW5kdmVyYmF0aW0NCiAgKiBAew0KICAqLyANCg0KLyoqDQogICogQGJyaWVmICBSZXR1cm4gdGhlIERNQTJEIHN0YXRlDQogICogQHBhcmFtICBoZG1hMmQ6IHBvaW50ZXIgdG8gYSBETUEyRF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zDQogICogICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgRE1BMkQuICANCiAgKiBAcmV0dmFsIEhBTCBzdGF0ZQ0KICAqLw0KSEFMX0RNQTJEX1N0YXRlVHlwZURlZiBIQUxfRE1BMkRfR2V0U3RhdGUoRE1BMkRfSGFuZGxlVHlwZURlZiAqaGRtYTJkKQ0KeyAgDQogIHJldHVybiBoZG1hMmQtPlN0YXRlOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIFJldHVybiB0aGUgRE1BMkQgZXJyb3IgY29kZQ0KICAqIEBwYXJhbSAgaGRtYTJkIDogcG9pbnRlciB0byBhIERNQTJEX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMNCiAgKiAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBETUEyRC4NCiAgKiBAcmV0dmFsIERNQTJEIEVycm9yIENvZGUNCiAgKi8NCnVpbnQzMl90IEhBTF9ETUEyRF9HZXRFcnJvcihETUEyRF9IYW5kbGVUeXBlRGVmICpoZG1hMmQpDQp7DQogIHJldHVybiBoZG1hMmQtPkVycm9yQ29kZTsNCn0NCg0KLyoqDQogICogQH0NCiAgKi8NCiAgDQovKioNCiAgKiBAfQ0KICAqLyAgDQoNCg0KLyoqIEBkZWZncm91cCBETUEyRF9Qcml2YXRlX0Z1bmN0aW9ucyBETUEyRCBQcml2YXRlIEZ1bmN0aW9ucw0KICAqIEB7DQogICovDQoNCi8qKg0KICAqIEBicmllZiAgU2V0IHRoZSBETUEyRCB0cmFuc2ZlciBwYXJhbWV0ZXJzLg0KICAqIEBwYXJhbSAgaGRtYTJkOiAgICAgUG9pbnRlciB0byBhIERNQTJEX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMNCiAgKiAgICAgICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIERNQTJELiAgDQogICogQHBhcmFtICBwZGF0YTogICAgICBUaGUgc291cmNlIG1lbW9yeSBCdWZmZXIgYWRkcmVzcw0KICAqIEBwYXJhbSAgRHN0QWRkcmVzczogVGhlIGRlc3RpbmF0aW9uIG1lbW9yeSBCdWZmZXIgYWRkcmVzcw0KICAqIEBwYXJhbSAgV2lkdGg6ICAgICAgVGhlIHdpZHRoIG9mIGRhdGEgdG8gYmUgdHJhbnNmZXJyZWQgZnJvbSBzb3VyY2UgdG8gZGVzdGluYXRpb24uDQogICogQHBhcmFtICBIZWlnaHQ6ICAgICBUaGUgaGVpZ2h0IG9mIGRhdGEgdG8gYmUgdHJhbnNmZXJyZWQgZnJvbSBzb3VyY2UgdG8gZGVzdGluYXRpb24uDQogICogQHJldHZhbCBIQUwgc3RhdHVzDQogICovDQpzdGF0aWMgdm9pZCBETUEyRF9TZXRDb25maWcoRE1BMkRfSGFuZGxlVHlwZURlZiAqaGRtYTJkLCB1aW50MzJfdCBwZGF0YSwgdWludDMyX3QgRHN0QWRkcmVzcywgdWludDMyX3QgV2lkdGgsIHVpbnQzMl90IEhlaWdodCkNCnsgIA0KICB1aW50MzJfdCB0bXAgPSAwOw0KICB1aW50MzJfdCB0bXAxID0gMDsNCiAgdWludDMyX3QgdG1wMiA9IDA7DQogIHVpbnQzMl90IHRtcDMgPSAwOw0KICB1aW50MzJfdCB0bXA0ID0gMDsNCiAgICANCiAgLyogQ29uZmlndXJlIERNQTJEIGRhdGEgc2l6ZSAqLw0KICBNT0RJRllfUkVHKGhkbWEyZC0+SW5zdGFuY2UtPk5MUiwgKERNQTJEX05MUl9OTHxETUEyRF9OTFJfUEwpLCAoSGVpZ2h0fCAoV2lkdGggPDwgRE1BMkRfUE9TSVRJT05fTkxSX1BMKSkpOyANCiAgDQogIC8qIENvbmZpZ3VyZSBETUEyRCBkZXN0aW5hdGlvbiBhZGRyZXNzICovDQogIFdSSVRFX1JFRyhoZG1hMmQtPkluc3RhbmNlLT5PTUFSLCBEc3RBZGRyZXNzKTsNCiANCiAgLyogUmVnaXN0ZXIgdG8gbWVtb3J5IERNQTJEIG1vZGUgc2VsZWN0ZWQgKi8NCiAgaWYgKGhkbWEyZC0+SW5pdC5Nb2RlID09IERNQTJEX1IyTSkNCiAgeyAgICANCiAgICB0bXAxID0gcGRhdGEgJiBETUEyRF9PQ09MUl9BTFBIQV8xOw0KICAgIHRtcDIgPSBwZGF0YSAmIERNQTJEX09DT0xSX1JFRF8xOw0KICAgIHRtcDMgPSBwZGF0YSAmIERNQTJEX09DT0xSX0dSRUVOXzE7DQogICAgdG1wNCA9IHBkYXRhICYgRE1BMkRfT0NPTFJfQkxVRV8xOw0KICAgIA0KICAgIC8qIFByZXBhcmUgdGhlIHZhbHVlIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIE9DT0xSIHJlZ2lzdGVyIGFjY29yZGluZyB0byB0aGUgY29sb3IgbW9kZSAqLw0KICAgIGlmIChoZG1hMmQtPkluaXQuQ29sb3JNb2RlID09IERNQTJEX09VVFBVVF9BUkdCODg4OCkNCiAgICB7DQogICAgICB0bXAgPSAodG1wMyB8IHRtcDIgfCB0bXAxfCB0bXA0KTsNCiAgICB9DQogICAgZWxzZSBpZiAoaGRtYTJkLT5Jbml0LkNvbG9yTW9kZSA9PSBETUEyRF9PVVRQVVRfUkdCODg4KQ0KICAgIHsNCiAgICAgIHRtcCA9ICh0bXAzIHwgdG1wMiB8IHRtcDQpOyAgDQogICAgfQ0KICAgIGVsc2UgaWYgKGhkbWEyZC0+SW5pdC5Db2xvck1vZGUgPT0gRE1BMkRfT1VUUFVUX1JHQjU2NSkNCiAgICB7DQogICAgICB0bXAyID0gKHRtcDIgPj4gMTkpOw0KICAgICAgdG1wMyA9ICh0bXAzID4+IDEwKTsNCiAgICAgIHRtcDQgPSAodG1wNCA+PiAzICk7DQogICAgICB0bXAgID0gKCh0bXAzIDw8IDUpIHwgKHRtcDIgPDwgMTEpIHwgdG1wNCk7IA0KICAgIH0NCiAgICBlbHNlIGlmIChoZG1hMmQtPkluaXQuQ29sb3JNb2RlID09IERNQTJEX09VVFBVVF9BUkdCMTU1NSkNCiAgICB7IA0KICAgICAgdG1wMSA9ICh0bXAxID4+IDMxKTsNCiAgICAgIHRtcDIgPSAodG1wMiA+PiAxOSk7DQogICAgICB0bXAzID0gKHRtcDMgPj4gMTEpOw0KICAgICAgdG1wNCA9ICh0bXA0ID4+IDMgKTsgICAgICANCiAgICAgIHRtcCAgPSAoKHRtcDMgPDwgNSkgfCAodG1wMiA8PCAxMCkgfCAodG1wMSA8PCAxNSkgfCB0bXA0KTsgICAgDQogICAgfSANCiAgICBlbHNlIC8qIERoZG1hMmQtPkluaXQuQ29sb3JNb2RlID0gRE1BMkRfT1VUUFVUX0FSR0I0NDQ0ICovDQogICAgew0KICAgICAgdG1wMSA9ICh0bXAxID4+IDI4KTsNCiAgICAgIHRtcDIgPSAodG1wMiA+PiAyMCk7DQogICAgICB0bXAzID0gKHRtcDMgPj4gMTIpOw0KICAgICAgdG1wNCA9ICh0bXA0ID4+IDQgKTsNCiAgICAgIHRtcCAgPSAoKHRtcDMgPDwgNCkgfCAodG1wMiA8PCA4KSB8ICh0bXAxIDw8IDEyKSB8IHRtcDQpOw0KICAgIH0gICAgDQogICAgLyogV3JpdGUgdG8gRE1BMkQgT0NPTFIgcmVnaXN0ZXIgKi8NCiAgICBXUklURV9SRUcoaGRtYTJkLT5JbnN0YW5jZS0+T0NPTFIsIHRtcCk7ICAgIA0KICB9IA0KICBlbHNlIC8qIE0yTSwgTTJNX1BGQyBvciBNMk1fQmxlbmRpbmcgRE1BMkQgTW9kZSAqLw0KICB7DQogICAgLyogQ29uZmlndXJlIERNQTJEIHNvdXJjZSBhZGRyZXNzICovDQogIFdSSVRFX1JFRyhoZG1hMmQtPkluc3RhbmNlLT5GR01BUiwgcGRhdGEpOw0KICB9DQp9DQoNCi8qKg0KICAqIEB9DQogICovDQogIA0KLyoqDQogICogQH0NCiAgKi8NCg0KLyoqDQogICogQH0NCiAgKi8NCg0KI2VuZGlmIC8qIFNUTTMyTDQ5Nnh4IHx8IFNUTTMyTDRBNnh4ICovDQoNCiNlbmRpZiAvKiBIQUxfRE1BMkRfTU9EVUxFX0VOQUJMRUQgKi8NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8NCg==