ZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvbnRmcy50eHQgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL250ZnMudHh0CmluZGV4IGY4OWI0NDAuLmVlZjRhY2EwIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL250ZnMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvbnRmcy50eHQKQEAgLTIxLDcgKzIxLDcgQEAKID09PT09PT09CiAKIExpbnV4LU5URlMgY29tZXMgd2l0aCBhIG51bWJlciBvZiB1c2VyLXNwYWNlIHByb2dyYW1zIGtub3duIGFzIG50ZnNwcm9ncy4KLVRoZXNlIGluY2x1ZGUgbWtudGZzLCBhIGZ1bGwtZmVhdHVyZWQgbnRmcyBmaWxlIHN5c3RlbSBmb3JtYXQgdXRpbGl0eSwKK1RoZXNlIGluY2x1ZGUgbWtudGZzLCBhIGZ1bGwtZmVhdHVyZWQgbnRmcyBmaWxlc3lzdGVtIGZvcm1hdCB1dGlsaXR5LAogbnRmc3VuZGVsZXRlIHVzZWQgZm9yIHJlY292ZXJpbmcgZmlsZXMgdGhhdCB3ZXJlIHVuaW50ZW50aW9uYWxseSBkZWxldGVkCiBmcm9tIGFuIE5URlMgdm9sdW1lIGFuZCBudGZzcmVzaXplIHdoaWNoIGlzIHVzZWQgdG8gcmVzaXplIGFuIE5URlMgcGFydGl0aW9uLgogU2VlIHRoZSB3ZWIgc2l0ZSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KQEAgLTE0OSw3ICsxNDksMTQgQEAKIAkJCW5hbWUsIGlmIGl0IGV4aXN0cy4gIElmIGNhc2Vfc2Vuc2l0aXZlLCB5b3Ugd2lsbCBuZWVkCiAJCQl0byBwcm92aWRlIHRoZSBjb3JyZWN0IGNhc2Ugb2YgdGhlIHNob3J0IGZpbGUgbmFtZS4KIAotZXJyb3JzPW9wdAkJV2hhdCB0byBkbyB3aGVuIGNyaXRpY2FsIGZpbGUgc3lzdGVtIGVycm9ycyBhcmUgZm91bmQuCitkaXNhYmxlX3NwYXJzZT08Qk9PTD4JSWYgZGlzYWJsZV9zcGFyc2UgaXMgc3BlY2lmaWVkLCBjcmVhdGlvbiBvZiBzcGFyc2UKKwkJCXJlZ2lvbnMsIGkuZS4gaG9sZXMsIGluc2lkZSBmaWxlcyBpcyBkaXNhYmxlZCBmb3IgdGhlCisJCQl2b2x1bWUgKGZvciB0aGUgZHVyYXRpb24gb2YgdGhpcyBtb3VudCBvbmx5KS4gIEJ5CisJCQlkZWZhdWx0LCBjcmVhdGlvbiBvZiBzcGFyc2UgcmVnaW9ucyBpcyBlbmFibGVkLCB3aGljaAorCQkJaXMgY29uc2lzdGVudCB3aXRoIHRoZSBiZWhhdmlvdXIgb2YgdHJhZGl0aW9uYWwgVW5peAorCQkJZmlsZXN5c3RlbXMuCisKK2Vycm9ycz1vcHQJCVdoYXQgdG8gZG8gd2hlbiBjcml0aWNhbCBmaWxlc3lzdGVtIGVycm9ycyBhcmUgZm91bmQuCiAJCQlGb2xsb3dpbmcgdmFsdWVzIGNhbiBiZSB1c2VkIGZvciAib3B0IjoKIAkJCSAgY29udGludWU6IERFRkFVTFQsIHRyeSB0byBjbGVhbi11cCBhcyBtdWNoIGFzCiAJCQkJICAgIHBvc3NpYmxlLCBlLmcuIG1hcmtpbmcgYSBjb3JydXB0IGlub2RlIGFzCkBAIC00MzIsNiArNDM5LDI0IEBACiAKIE5vdGUsIGEgdGVjaG5pY2FsIENoYW5nZUxvZyBhaW1lZCBhdCBrZXJuZWwgaGFja2VycyBpcyBpbiBmcy9udGZzL0NoYW5nZUxvZy4KIAorMi4xLjIzOgorCS0gU3RhbXAgdGhlIHVzZXIgc3BhY2Ugam91cm5hbCwgYWthIHRyYW5zYWN0aW9uIGxvZywgYWthICRVc25Kcm5sLCBpZgorCSAgaXQgaXMgcHJlc2VudCBhbmQgYWN0aXZlIHRodXMgdGVsbGluZyBXaW5kb3dzIGFuZCBhcHBsaWNhdGlvbnMgdXNpbmcKKwkgIHRoZSB0cmFuc2FjdGlvbiBsb2cgdGhhdCBjaGFuZ2VzIGNhbiBoYXZlIGhhcHBlbmVkIG9uIHRoZSB2b2x1bWUKKwkgIHdoaWNoIGFyZSBub3QgcmVjb3JkZWQgaW4gJFVzbkpybmwuCisJLSBEZXRlY3QgdGhlIGNhc2Ugd2hlbiBXaW5kb3dzIGhhcyBiZWVuIGhpYmVybmF0ZWQgKHN1c3BlbmRlZCB0byBkaXNrKQorCSAgYW5kIGlmIHRoaXMgaXMgdGhlIGNhc2UgZG8gbm90IGFsbG93IChyZSltb3VudGluZyByZWFkLXdyaXRlIHRvCisJICBwcmV2ZW50IGRhdGEgY29ycnVwdGlvbiB3aGVuIHlvdSBib290IGJhY2sgaW50byB0aGUgc3VzcGVuZGVkCisJICBXaW5kb3dzIHNlc3Npb24uCisJLSBJbXBsZW1lbnQgZXh0ZW5zaW9uIG9mIHJlc2lkZW50IGZpbGVzIHVzaW5nIHRoZSBub3JtYWwgZmlsZSB3cml0ZQorCSAgY29kZSBwYXRocywgaS5lLiBtb3N0IHZlcnkgc21hbGwgZmlsZXMgY2FuIGJlIGV4dGVuZGVkIHRvIGJlIGEgbGl0dGxlCisJICBiaXQgYmlnZ2VyIGJ1dCBub3QgYnkgbXVjaC4KKwktIEFkZCBuZXcgbW91bnQgb3B0aW9uICJkaXNhYmxlX3NwYXJzZSIuICAoU2VlIGxpc3Qgb2YgbW91bnQgb3B0aW9ucworCSAgYWJvdmUgZm9yIGRldGFpbHMuKQorCS0gSW1wcm92ZSBoYW5kbGluZyBvZiBudGZzIHZvbHVtZXMgd2l0aCBlcnJvcnMgYW5kIHN0cmFuZ2UgYm9vdCBzZWN0b3JzCisJICBpbiBwYXJ0aWN1bGFyLgorCS0gRml4IHZhcmlvdXMgYnVncyBpbmNsdWRpbmcgYSBuYXN0eSBkZWFkbG9jayB0aGF0IGFwcGVhcmVkIGluIHJlY2VudAorCSAga2VybmVscyAoYXJvdW5kIDIuNi4xMS0yLjYuMTIgdGltZWZyYW1lKS4KIDIuMS4yMjoKIAktIEltcHJvdmUgaGFuZGxpbmcgb2YgbnRmcyB2b2x1bWVzIHdpdGggZXJyb3JzLgogCS0gRml4IHZhcmlvdXMgYnVncyBhbmQgcmFjZSBjb25kaXRpb25zLgpkaWZmIC0tZ2l0IGEvZnMvbnRmcy9DaGFuZ2VMb2cgYi9mcy9udGZzL0NoYW5nZUxvZwppbmRleCAxZDJhZDE1Li45NzA5ZmFjIDEwMDY0NAotLS0gYS9mcy9udGZzL0NoYW5nZUxvZworKysgYi9mcy9udGZzL0NoYW5nZUxvZwpAQCAtMSwyMSArMSwxOCBAQAogVG9Eby9Ob3RlczoKIAktIEZpbmQgYW5kIGZpeCBidWdzLgotCS0gQ2hlY2twb2ludCBvciBkaXNhYmxlIHRoZSB1c2VyIHNwYWNlIGpvdXJuYWwgKCRVc25Kcm5sKS4KIAktIEluIGJldHdlZW4gbnRmc19wcmVwYXJlL2NvbW1pdF93cml0ZSwgbmVlZCBleGNsdXNpb24gYmV0d2VlbgotCSAgc2ltdWx0YW5lb3VzIGZpbGUgZXh0ZW5zaW9ucy4gTmVlZCBwZXJoYXBzIGFuIE5Jbm9SZXNpemVVbmRlcndheSgpCi0JICBmbGFnIHdoaWNoIHdlIGNhbiBzZXQgaW4gbnRmc19wcmVwYXJlX3dyaXRlKCkgYW5kIGNsZWFyIGFnYWluIGluCi0JICBudGZzX2NvbW1pdF93cml0ZSgpLiBKdXN0IGhhdmUgdG8gYmUgY2FyZWZ1bCBpbiByZWFkcGFnZS93cml0ZXBhZ2UsCi0JICBhcyB3ZWxsIGFzIGluIHRydW5jYXRlLCB0aGF0IHdlIHBsYXkgbmljZS4uLiBXZSBtaWdodCBuZWVkIHRvIGhhdmUKLQkgIGEgZGF0YV9zaXplIGZpZWxkIGluIHRoZSBudGZzX2lub2RlIHRvIHN0b3JlIHRoZSByZWFsIGF0dHJpYnV0ZQotCSAgbGVuZ3RoLiBBbHNvIG5lZWQgdG8gYmUgY2FyZWZ1bCB3aXRoIGluaXRpYWxpemVkX3NpemUgZXh0ZW50aW9uIGluCisJICBzaW11bHRhbmVvdXMgZmlsZSBleHRlbnNpb25zLiAgVGhpcyBpcyBnaXZlbiB0byB1cyBieSBob2xkaW5nIGlfc2VtCisJICBvbiB0aGUgaW5vZGUuICBUaGUgb25seSBwbGFjZXMgaW4gdGhlIGtlcm5lbCB3aGVuIGEgZmlsZSBpcyByZXNpemVkCisJICBhcmUgcHJlcGFyZS9jb21taXQgd3JpdGUgYW5kIHRydW5jYXRlIGZvciBib3RoIG9mIHdoaWNoIGlfc2VtIGlzCisJICBoZWxkLiAgSnVzdCBoYXZlIHRvIGJlIGNhcmVmdWwgaW4gcmVhZHBhZ2Uvd3JpdGVwYWdlIGFuZCBhbGwgb3RoZXIKKwkgIGhlbHBlcnMgbm90IHJ1bm5pbmcgdW5kZXIgaV9zZW0gdGhhdCB3ZSBwbGF5IG5pY2UuLi4KKwkgIEFsc28gbmVlZCB0byBiZSBjYXJlZnVsIHdpdGggaW5pdGlhbGl6ZWRfc2l6ZSBleHRlbnRpb24gaW4KIAkgIG50ZnNfcHJlcGFyZV93cml0ZS4gQmFzaWNhbGx5LCBqdXN0IGJlIF92ZXJ5XyBjYXJlZnVsIGluIHRoaXMgY29kZS4uLgotCSAgT1RPSCwgcGVyaGFwcyBpX3NlbSwgd2hpY2ggaXMgaGVsZCBhY2Nyb3NzIGdlbmVyaWNfZmlsZV93cml0ZSBpcwotCSAgc3VmZmljaWVudCBmb3Igc3luY2hyb25pc2F0aW9uIGhlcmUuIFdlIHRoZW4ganVzdCBuZWVkIHRvIG1ha2Ugc3VyZQotCSAgbnRmc19yZWFkcGFnZS93cml0ZXBhZ2UvdHJ1bmNhdGUgaW50ZXJvcGVyYXRlIHByb3Blcmx5IHdpdGggdXMuCi0JICBVUERBVEU6IFRoZSBhYm92ZSBpcyBhbGwgb2sgYXMgaXQgaXMgZHVlIHRvIGlfc2VtIGhlbGQuICBUaGUgb25seQotCSAgdGhpbmcgdGhhdCBuZWVkcyB0byBiZSBjaGVja2VkIGlzIG50ZnNfd3JpdGVwYWdlKCkgd2hpY2ggZG9lcyBub3QKLQkgIGhvbGQgaV9zZW0uICBJdCBjYW5ub3QgY2hhbmdlIGlfc2l6ZSBidXQgaXQgbmVlZHMgdG8gY29wZSB3aXRoIGEKLQkgIGNvbmN1cnJlbnQgaV9zaXplIGNoYW5nZS4KKwkgIFVQREFURTogVGhlIG9ubHkgdGhpbmdzIHRoYXQgbmVlZCB0byBiZSBjaGVja2VkIGFyZSByZWFkL3dyaXRlcGFnZQorCSAgd2hpY2ggZG8gbm90IGhvbGQgaV9zZW0uICBOb3RlIHdyaXRlcGFnZSBjYW5ub3QgY2hhbmdlIGlfc2l6ZSBidXQgaXQKKwkgIG5lZWRzIHRvIGNvcGUgd2l0aCBhIGNvbmN1cnJlbnQgaV9zaXplIGNoYW5nZSwganVzdCBsaWtlIHJlYWRwYWdlLgorCSAgQWxzbyBib3RoIG5lZWQgdG8gY29wZSB3aXRoIGNvbmN1cnJlbnQgY2hhbmdlcyB0byB0aGUgb3RoZXIgc2l6ZXMsCisJICBpLmUuIGluaXRpYWxpemVkL2FsbG9jYXRlZC9jb21wcmVzc2VkIHNpemUsIGFzIHdlbGwuCiAJLSBJbXBsZW1lbnQgbWZ0LmM6OnN5bmNfbWZ0X21pcnJvcl91bW91bnQoKS4gIFdlIGN1cnJlbnRseSB3aWxsIGp1c3QKIAkgIGxlYXZlIHRoZSB2b2x1bWUgZGlydHkgb24gdW1vdW50IGlmIHRoZSBmaW5hbCBpcHV0KHZvbC0+bWZ0X2lubykKIAkgIGNhdXNlcyBhIHdyaXRlIG9mIGFueSBtaXJyb3JlZCBtZnQgcmVjb3JkcyBkdWUgdG8gdGhlIG1mdCBtaXJyb3IKQEAgLTI1LDEyICsyMiwxNTggQEAKIAktIEVuYWJsZSB0aGUgY29kZSBmb3Igc2V0dGluZyB0aGUgTlQ0IGNvbXBhdGliaWxpdHkgZmxhZyB3aGVuIHdlIHN0YXJ0CiAJICBtYWtpbmcgTlRGUyAxLjIgc3BlY2lmaWMgbW9kaWZpY2F0aW9ucy4KIAotMi4xLjIzLVdJUAorMi4xLjIzIC0gSW1wbGVtZW50IGV4dGVuc2lvbiBvZiByZXNpZGVudCBmaWxlcyBhbmQgbWFrZSB3cml0aW5nIHNhZmUgYXMgd2VsbCBhcworCSBtYW55IGJ1ZyBmaXhlcywgY2xlYW51cHMsIGFuZCBlbmhhbmNlbWVudHMuLi4KIAogCS0gQWRkIHByaW50ayByYXRlIGxpbWl0aW5nIGZvciBudGZzX3dhcm5pbmcoKSBhbmQgbnRmc19lcnJvcigpIHdoZW4KIAkgIGNvbXBpbGVkIHdpdGhvdXQgZGVidWcuICBUaGlzIGF2b2lkcyBhIHBvc3NpYmxlIGRlbmlhbCBvZiBzZXJ2aWNlCiAJICBhdHRhY2suICBUaGFua3MgdG8gQ2FybC1EYW5pZWwgSGFpbGZpbmdlciBmcm9tIFN1U0UgZm9yIHBvaW50aW5nIHRoaXMKIAkgIG91dC4KKwktIEZpeCBjb21waWxhdGlvbiB3YXJuaW5ncyBvbiBpYTY0LiAgKFJhbmR5IER1bmxhcCkKKwktIFVzZSBpX3NpemVfe3JlYWQsd3JpdGV9KCkgaW5zdGVhZCBvZiByZWFkaW5nIGlfc2l6ZSBieSBoYW5kIGFuZCBjYWNoZQorCSAgdGhlIHZhbHVlIHdoZXJlIGFwcm9wcmlhdGUuCisJLSBBZGQgc2l6ZV9sb2NrIHRvIHRoZSBudGZzX2lub2RlIHN0cnVjdHVyZS4gIFRoaXMgaXMgYW4gcncgc3BpbmxvY2sKKwkgIGFuZCBpdCBsb2NrcyBhZ2FpbnN0IGFjY2VzcyB0byB0aGUgaW5vZGUgc2l6ZXMuICBOb3RlLCAtPnNpemVfbG9jaworCSAgaXMgYWxzbyBhY2Nlc3NlZCBmcm9tIGlycSBjb250ZXh0IHNvIHlvdSBtdXN0IHVzZSB0aGUgX2lycXNhdmUgYW5kCisJICBfaXJxcmVzdG9yZSBsb2NrIGFuZCB1bmxvY2sgZnVuY3Rpb25zLCByZXNwZWN0aXZlbHkuICBQcm90ZWN0IGFsbAorCSAgYWNjZXNzZXMgdG8gYWxsb2NhdGVkX3NpemUsIGluaXRpYWxpemVkX3NpemUsIGFuZCBjb21wcmVzc2VkX3NpemUuCisJLSBNaW5vciBvcHRpbWl6YXRpb24gdG8gZnMvbnRmcy9zdXBlci5jOjpudGZzX3N0YXRmcygpIGFuZCBpdHMgaGVscGVycy4KKwktIEltcGxlbWVudCBleHRlbnNpb24gb2YgcmVzaWRlbnQgZmlsZXMgaW4gdGhlIHJlZ3VsYXIgZmlsZSB3cml0ZSBjb2RlCisJICBwYXRocyAoZnMvbnRmcy9hb3BzLmM6Om50ZnNfe3ByZXBhcmUsY29tbWl0fV93cml0ZSgpKS4gIEF0IHByZXNlbnQKKwkgIHRoaXMgb25seSB3b3JrcyB1bnRpbCB0aGUgZGF0YSBhdHRyaWJ1dGUgYmVjb21lcyB0b28gYmlnIGZvciB0aGUgbWZ0CisJICByZWNvcmQgYWZ0ZXIgd2hpY2ggd2UgYWJvcnQgdGhlIHdyaXRlIHJldHVybmluZyAtRU9QTk9UU1VQUCBmcm9tCisJICBudGZzX3ByZXBhcmVfd3JpdGUoKS4KKwktIEFkZCBkaXNhYmxlX3NwYXJzZSBtb3VudCBvcHRpb24gdG9nZXRoZXIgd2l0aCBhIHBlciB2b2x1bWUgc3BhcnNlCisJICBlbmFibGUgYml0IHdoaWNoIGlzIHNldCBhcHByb3ByaWF0ZWx5IGFuZCBhIHBlciBpbm9kZSBzcGFyc2UgZGlzYWJsZQorCSAgYml0IHdoaWNoIGlzIHByZXNldCBvbiBzb21lIHN5c3RlbSBmaWxlIGlub2RlcyBhcyBhcHByb3ByaWF0ZS4KKwktIEVuZm9yY2UgdGhhdCBzcGFyc2Ugc3VwcG9ydCBpcyBkaXNhYmxlZCBvbiBOVEZTIHZvbHVtZXMgcHJlIDMuMC4KKwktIEZpeCBhIGJ1ZyBpbiBmcy9udGZzL3J1bmxpc3QuYzo6bnRmc19tYXBwaW5nX3BhaXJzX2RlY29tcHJlc3MoKSBpbgorCSAgdGhlIGNyZWF0aW9uIG9mIHRoZSB1bm1hcHBlZCBydW5saXN0IGVsZW1lbnQgZm9yIHRoZSBiYXNlIGF0dHJpYnV0ZQorCSAgZXh0ZW50LgorCS0gU3BsaXQgbnRmc19tYXBfcnVubGlzdCgpIGludG8gbnRmc19tYXBfcnVubGlzdCgpIGFuZCBhIG5vbi1sb2NraW5nCisJICBoZWxwZXIgbnRmc19tYXBfcnVubGlzdF9ub2xvY2soKSB3aGljaCBpcyB1c2VkIGJ5IG50ZnNfbWFwX3J1bmxpc3QoKS4KKwkgIFRoaXMgYWxsb3dzIHVzIHRvIG1hcCBydW5saXN0IGZyYWdtZW50cyB3aXRoIHRoZSBydW5saXN0IGxvY2sgYWxyZWFkeQorCSAgaGVsZCB3aXRob3V0IGhhdmluZyB0byBkcm9wIGFuZCByZWFjcXVpcmUgaXQgYXJvdW5kIHRoZSBjYWxsLiAgQWRhcHQKKwkgIGFsbCBjYWxsZXJzLgorCS0gQ2hhbmdlIG50ZnNfZmluZF92Y24oKSB0byBudGZzX2ZpbmRfdmNuX25vbG9jaygpIHdoaWNoIHRha2VzIGEgbG9ja2VkCisJICBydW5saXN0LiAgVGhpcyBhbGxvd3MgdXMgdG8gZmluZCBydW5saXN0IGVsZW1lbnRzIHdpdGggdGhlIHJ1bmxpc3QKKwkgIGxvY2sgYWxyZWFkeSBoZWxkIHdpdGhvdXQgaGF2aW5nIHRvIGRyb3AgYW5kIHJlYWNxdWlyZSBpdCBhcm91bmQgdGhlCisJICBjYWxsLiAgQWRhcHQgYWxsIGNhbGxlcnMuCisJLSBDaGFuZ2UgdGltZSB0byB1NjQgaW4gdGltZS5oOjpudGZzMnV0YygpIGFzIGl0IG90aGVyd2lzZSBnZW5lcmF0ZXMgYQorCSAgd2FybmluZyBpbiB0aGUgZG9fZGl2KCkgY2FsbCBvbiBzcGFyYzMyLiAgVGhhbmtzIHRvIE1lZWxpcyBSb29zIGZvcgorCSAgdGhlIHJlcG9ydCBhbmQgYW5hbHlzaXMgb2YgdGhlIHdhcm5pbmcuCisJLSBGaXggYSBuYXN0eSBydW5saXN0IG1lcmdlIGJ1ZyB3aGVuIG1lcmdpbmcgdHdvIGhvbGVzLgorCS0gU2V0IHRoZSBudGZzX2lub2RlLT5hbGxvY2F0ZWRfc2l6ZSB0byB0aGUgcmVhbCBhbGxvY2F0ZWQgc2l6ZSBpbiB0aGUKKwkgIG1mdCByZWNvcmQgZm9yIHJlc2lkZW50IGF0dHJpYnV0ZXMgKGZzL250ZnMvaW5vZGUuYykuCisJLSBTbWFsbCByZWFkYWJpbGl0eSBjbGVhbnVwIHRvIHVzZSAiYSIgaW5zdGVhZCBvZiAiY3R4LT5hdHRyIgorCSAgZXZlcnl3aGVyZSAoZnMvbnRmcy9pbm9kZS5jKS4KKwktIE1ha2UgZnMvbnRmcy9uYW1laS5jOjpudGZzX2dldF97cGFyZW50LGRlbnRyeX0gc3RhdGljIGFuZCBtb3ZlIHRoZQorCSAgZGVmaW5pdGlvbiBvZiBudGZzX2V4cG9ydF9vcHMgZnJvbSBmcy9udGZzL3N1cGVyLmMgdG8gbmFtZWkuYy4gIEFsc28sCisJICBkZWNsYXJlIG50ZnNfZXhwb3J0X29wcyBpbiBmcy9udGZzL250ZnMuaC4KKwktIENvcnJlY3Qgc3BhcnNlIGZpbGUgaGFuZGxpbmcuICBUaGUgY29tcHJlc3NlZCB2YWx1ZXMgbmVlZCB0byBiZQorCSAgY2hlY2tlZCBhbmQgc2V0IGluIHRoZSBudGZzIGlub2RlIGFzIGRvbmUgZm9yIGNvbXByZXNzZWQgZmlsZXMgYW5kCisJICB0aGUgY29tcHJlc3NlZCBzaXplIG5lZWRzIHRvIGJlIHVzZWQgZm9yIHZmcyBpbm9kZS0+aV9ibG9ja3MgaW5zdGVhZAorCSAgb2YgdGhlIGFsbG9jYXRlZCBzaXplLCBhZ2FpbiwgYXMgZG9uZSBmb3IgY29tcHJlc3NlZCBmaWxlcy4KKwktIEFkZCBBVF9FQSBpbiBhZGRpdGlvbiB0byBBVF9EQVRBIHRvIHdoaXRlbGlzdCBmb3IgYmVpbmcgYWxsb3dlZCB0byBiZQorCSAgbm9uLXJlc2lkZW50IGluIGZzL250ZnMvYXR0cmliLmM6Om50ZnNfYXR0cl9jYW5fYmVfbm9uX3Jlc2lkZW50KCkuCisJLSBBZGQgZnMvbnRmcy9hdHRyaWIuYzo6bnRmc19hdHRyX3Zjbl90b19sY25fbm9sb2NrKCkgdXNlZCBieSB0aGUgbmV3CisJICB3cml0ZSBjb2RlLgorCS0gRml4IGJ1ZyBpbiBmcy9udGZzL2F0dHJpYi5jOjpudGZzX2ZpbmRfdmNuX25vbG9jaygpIHdoZXJlIGFmdGVyCisJICBkcm9wcGluZyB0aGUgcmVhZCBsb2NrIGFuZCB0YWtpbmcgdGhlIHdyaXRlIGxvY2sgd2Ugd2VyZSBub3QgY2hlY2tpbmcKKwkgIHdoZXRoZXIgc29tZW9uZSBlbHNlIGRpZCBub3QgYWxyZWFkeSBkbyB0aGUgd29yayB3ZSB3YW50ZWQgdG8gZG8uCisJLSBSZW5hbWUgZnMvbnRmcy9hdHRyaWIuYzo6bnRmc19maW5kX3Zjbl9ub2xvY2soKSB0bworCSAgbnRmc19hdHRyX2ZpbmRfdmNuX25vbG9jaygpIGFuZCB1cGRhdGUgYWxsIGNhbGxlcnMuCisJLSBBZGQgZnMvbnRmcy9hdHRyaWIuW2hjXTo6bnRmc19hdHRyX21ha2Vfbm9uX3Jlc2lkZW50KCkuCisJLSBGaXggc2lnbiBvZiB2YXJpb3VzIGVycm9yIHJldHVybiB2YWx1ZXMgdG8gYmUgbmVnYXRpdmUgaW4KKwkgIGZzL250ZnMvbGNuYWxsb2MuYy4KKwktIE1vZGlmeSAtPnJlYWRwYWdlIGFuZCAtPndyaXRlcGFnZSAoZnMvbnRmcy9hb3BzLmMpIHNvIHRoZXkgZGV0ZWN0IGFuZAorCSAgaGFuZGxlIHRoZSBjYXNlIHdoZXJlIGFuIGF0dHJpYnV0ZSBpcyBjb252ZXJ0ZWQgZnJvbSByZXNpZGVudCB0bworCSAgbm9uLXJlc2lkZW50IGJ5IGEgY29uY3VycmVudCBmaWxlIHdyaXRlLgorCS0gUmVtb3ZlIGNoZWNrcyBmb3IgTlVMTCBiZWZvcmUgY2FsbGluZyBrZnJlZSgpIHNpbmNlIGtmcmVlKCkgZG9lcyB0aGUKKwkgIGNoZWNraW5nIGl0c2VsZi4gIChKZXNwZXIgSnVobCkKKwktIFNvbWUgdXRpbGl0aWVzIG1vZGlmeSB0aGUgYm9vdCBzZWN0b3IgYnV0IGRvIG5vdCB1cGRhdGUgdGhlIGNoZWNrc3VtLgorCSAgVGh1cywgcmVsYXggdGhlIGNoZWNraW5nIGluIGZzL250ZnMvc3VwZXIuYzo6aXNfYm9vdF9zZWN0b3JfbnRmcygpIHRvCisJICBvbmx5IGVtaXQgYSB3YXJuaW5nIHdoZW4gdGhlIGNoZWNrc3VtIGlzIGluY29ycmVjdCByYXRoZXIgdGhhbgorCSAgcmVmdXNpbmcgdGhlIG1vdW50LiAgVGhhbmtzIHRvIEJlcm5kIENhc2ltaXIgZm9yIHBvaW50aW5nIHRoaXMKKwkgIHByb2JsZW0gb3V0LgorCS0gVXBkYXRlIGF0dHJpYnV0ZSBkZWZpbml0aW9uIGhhbmRsaW5nLgorCS0gQWRkIE5URlNfTUFYX0NMVVNURVJfU0laRSBhbmQgTlRGU19NQVhfUEFHRVNfUEVSX0NMVVNURVIgY29uc3RhbnRzLgorCS0gVXNlIE5URlNfTUFYX0NMVVNURVJfU0laRSBpbiBzdXBlci5jIGluc3RlYWQgb2YgaGFyZCBjb2RpbmcgMHgxMDAwMC4KKwktIFVzZSBNQVhfQlVGX1BFUl9QQUdFIGluc3RlYWQgb2YgdmFyaWFibGUgc2l6ZWQgYXJyYXkgYWxsb2NhdGlvbiBmb3IKKwkgIGJldHRlciBjb2RlIGdlbmVyYXRpb24gYW5kIG9uZSBsZXNzIHNwYXJzZSB3YXJuaW5nIGluIGZzL250ZnMvYW9wcy5jLgorCS0gUmVtb3ZlIHNwdXJpb3VzIHZvaWQgcG9pbnRlciBjYXN0cyBmcm9tIGZzL250ZnMvLiAgKFBla2thIEVuYmVyZykKKwktIFVzZSBDOTkgc3R5bGUgc3RydWN0dXJlIGluaXRpYWxpemF0aW9uIGFmdGVyIG1lbW9yeSBhbGxvY2F0aW9uIHdoZXJlCisJICBwb3NzaWJsZSAoZnMvbnRmcy97YXR0cmliLmMsaW5kZXguYyxzdXBlci5jfSkuICBUaGFua3MgdG8gQWwgVmlybyBhbmQKKwkgIFBla2thIEVuYmVyZy4KKwktIFN0YW1wIHRoZSB0cmFuc2FjdGlvbiBsb2cgKCRVc25Kcm5sKSwgYWthIHVzZXIgc3BhY2Ugam91cm5hbCwgaWYgaXQKKwkgIGlzIGFjdGl2ZSBvbiB0aGUgdm9sdW1lIGFuZCB3ZSBhcmUgbW91bnRpbmcgcmVhZC13cml0ZSBvciByZW1vdW50aW5nCisJICBmcm9tIHJlYWQtb25seSB0byByZWFkLXdyaXRlLgorCS0gRml4IGEgYnVnIGluIGFkZHJlc3Mgc3BhY2Ugb3BlcmF0aW9ucyBlcnJvciByZWNvdmVyeSBjb2RlIHBhdGhzIHdoZXJlCisJICBpZiB0aGUgcnVubGlzdCB3YXMgbm90IG1hcHBlZCBhdCBhbGwgYW5kIGEgbWFwcGluZyBlcnJvciBvY2N1cmVkIHdlCisJICB3b3VsZCBsZWF2ZSB0aGUgcnVubGlzdCBsb2NrZWQgb24gZXhpdCB0byB0aGUgZnVuY3Rpb24gc28gdGhhdCB0aGUKKwkgIG5leHQgYWNjZXNzIHRvIHRoZSBzYW1lIGZpbGUgd291bGQgdHJ5IHRvIHRha2UgdGhlIGxvY2sgYW5kIGRlYWRsb2NrLgorCS0gRGV0ZWN0IHRoZSBjYXNlIHdoZW4gV2luZG93cyBoYXMgYmVlbiBzdXNwZW5kZWQgdG8gZGlzayBvbiB0aGUgdm9sdW1lCisJICB0byBiZSBtb3VudGVkIGFuZCBpZiB0aGlzIGlzIHRoZSBjYXNlIGRvIG5vdCBhbGxvdyAocmUpbW91bnRpbmcKKwkgIHJlYWQtd3JpdGUuICBUaGlzIGlzIGRvbmUgYnkgcGFyc2luZyBoaWJlcmZpbC5zeXMgaWYgcHJlc2VudC4KKwktIEZpeCBzZXZlcmFsIG9jY3VyZW5jZXMgb2YgYSBidWcgd2hlcmUgd2Ugd291bGQgcGVyZm9ybSAndmFyICYgfmNvbnN0JworCSAgd2l0aCBhIDY0LWJpdCB2YXJpYWJsZSBhbmQgYSBpbnQsIGkuZS4gMzItYml0LCBjb25zdGFudC4gIFRoaXMgY2F1c2VzCisJICB0aGUgaGlnaGVyIG9yZGVyIDMyLWJpdHMgb2YgdGhlIDY0LWJpdCB2YXJpYWJsZSB0byBiZSB6ZXJvZWQuICBUbyBmaXgKKwkgIHRoaXMgY2FzdCB0aGUgJ2NvbnN0JyB0byB0aGUgc2FtZSA2NC1iaXQgdHlwZSBhcyAndmFyJy4KKwktIENoYW5nZSB0aGUgcnVubGlzdCB0ZXJtaW5hdG9yIG9mIHRoZSBuZXdseSBhbGxvY2F0ZWQgY2x1c3RlcihzKSB0bworCSAgTENOX0VOT0VOVCBpbiBudGZzX2F0dHJfbWFrZV9ub25fcmVzaWRlbnQoKS4gIE90aGVyd2lzZSB0aGUgcnVubGlzdAorCSAgY29kZSBnZXRzIGNvbmZ1c2VkLgorCS0gQWRkIGFuIGV4dHJhIHBhcmFtZXRlciBAbGFzdF92Y24gdG8gbnRmc19nZXRfc2l6ZV9mb3JfbWFwcGluZ19wYWlycygpCisJICBhbmQgbnRmc19tYXBwaW5nX3BhaXJzX2J1aWxkKCkgdG8gYWxsb3cgdGhlIHJ1bmxpc3QgZW5jb2RpbmcgdG8gYmUKKwkgIHBhcnRpYWwgd2hpY2ggaXMgZGVzaXJhYmxlIHdoZW4gZmlsbGluZyBob2xlcyBpbiBzcGFyc2UgYXR0cmlidXRlcy4KKwkgIFVwZGF0ZSBhbGwgY2FsbGVycy4KKwktIENoYW5nZSBudGZzX21hcF9ydW5saXN0X25vbG9jaygpIHRvIG9ubHkgZGVjb21wcmVzcyB0aGUgbWFwcGluZyBwYWlycworCSAgaWYgdGhlIHJlcXVlc3RlZCB2Y24gaXMgaW5zaWRlIGl0LiAgT3RoZXJ3aXNlIHdlIGdldCBpbnRvIHByb2JsZW1zCisJICB3aGVuIHdlIHRyeSB0byBtYXAgYW4gb3V0IG9mIGJvdW5kcyB2Y24gYmVjYXVzZSB3ZSB0aGVuIHRyeSB0byBtYXAKKwkgIHRoZSBhbHJlYWR5IG1hcHBlZCBydW5saXN0IGZyYWdtZW50IHdoaWNoIGNhdXNlcworCSAgbnRmc19tYXBwaW5nX3BhaXJzX2RlY29tcHJlc3MoKSB0byBmYWlsIGFuZCByZXR1cm4gZXJyb3IuICBVcGRhdGUKKwkgIG50ZnNfYXR0cl9maW5kX3Zjbl9ub2xvY2soKSBhY2NvcmRpbmdseS4KKwktIEZpeCBhIG5hc3R5IGRlYWRsb2NrIHRoYXQgYXBwZWFyZWQgaW4gcmVjZW50IGtlcm5lbHMuCisJICBUaGUgc2l0dWF0aW9uOiBWRlMgaW5vZGUgWCBvbiBhIG1vdW50ZWQgbnRmcyB2b2x1bWUgaXMgZGlydHkuICBGb3IKKwkgIHNhbWUgaW5vZGUgWCwgdGhlIG50ZnNfaW5vZGUgaXMgZGlydHkgYW5kIHRodXMgY29ycmVzcG9uZGluZyBvbi1kaXNrCisJICBpbm9kZSwgaS5lLiBtZnQgcmVjb3JkLCB3aGljaCBpcyBpbiBhIGRpcnR5IFBBR0VfQ0FDSEVfUEFHRSBiZWxvbmdpbmcKKwkgIHRvIHRoZSB0YWJsZSBvZiBpbm9kZXMsIGkuZS4gJE1GVCwgaW5vZGUgMC4KKwkgIFdoYXQgaGFwcGVuczoKKwkgIFByb2Nlc3MgMTogc3lzX3N5bmMoKS91bW91bnQoKS93aGF0ZXZlci4uLiAgY2FsbHMKKwkgIF9fc3luY19zaW5nbGVfaW5vZGUoKSBmb3IgJE1GVCAtPiBkb193cml0ZXBhZ2VzKCkgLT4gd3JpdGVfcGFnZSBmb3IKKwkgIHRoZSBkaXJ0eSBwYWdlIGNvbnRhaW5pbmcgdGhlIG9uLWRpc2sgaW5vZGUgWCwgdGhlIHBhZ2UgaXMgbm93IGxvY2tlZAorCSAgLT4gbnRmc193cml0ZV9tc3RfYmxvY2soKSB3aGljaCBjbGVhcnMgUGFnZVVwdG9kYXRlKCkgb24gdGhlIHBhZ2UgdG8KKwkgIHByZXZlbnQgYW55b25lIGVsc2UgZ2V0dGluZyBob2xkIG9mIGl0IHdoaWxzdCBpdCBkb2VzIHRoZSB3cml0ZSBvdXQuCisJICBUaGlzIGlzIG5lY2Vzc2FyeSBhcyB0aGUgb24tZGlzayBpbm9kZSBuZWVkcyAiZml4dXBzIiBhcHBsaWVkIGJlZm9yZQorCSAgdGhlIHdyaXRlIHRvIGRpc2sgd2hpY2ggYXJlIHJlbW92ZWQgYWdhaW4gYWZ0ZXIgdGhlIHdyaXRlIGFuZAorCSAgUGFnZVVwdG9kYXRlIGlzIHRoZW4gc2V0IGFnYWluLiAgSXQgdGhlbiBhbmFseXNlcyB0aGUgcGFnZSBsb29raW5nCisJICBmb3IgZGlydHkgb24tZGlzayBpbm9kZXMgYW5kIHdoZW4gaXQgZmluZHMgb25lIGl0IGNhbGxzCisJICBudGZzX21heV93cml0ZV9tZnRfcmVjb3JkKCkgdG8gc2VlIGlmIGl0IGlzIHNhZmUgdG8gd3JpdGUgdGhpcworCSAgb24tZGlzayBpbm9kZS4gIFRoaXMgdGhlbiBjYWxscyBpbG9va3VwNSgpIHRvIGNoZWNrIGlmIHRoZQorCSAgY29ycmVzcG9uZGluZyBWRlMgaW5vZGUgaXMgaW4gaWNhY2hlKCkuICBUaGlzIGluIHR1cm4gY2FsbHMgaWZpbmQoKQorCSAgd2hpY2ggd2FpdHMgb24gdGhlIGlub2RlIGxvY2sgdmlhIHdhaXRfb25faW5vZGUgd2hpbHN0IGhvbGRpbmcgdGhlCisJICBnbG9iYWwgaW5vZGVfbG9jay4KKwkgIFByb2Nlc3MgMjogcGRmbHVzaCByZXN1bHRzIGluIGEgY2FsbCB0byBfX3N5bmNfc2luZ2xlX2lub2RlIGZvciB0aGUKKwkgIHNhbWUgVkZTIGlub2RlIFggb24gdGhlIG50ZnMgdm9sdW1lLiAgVGhpcyBsb2NrcyB0aGUgaW5vZGUgKElfTE9DSykKKwkgIHRoZW4gY2FsbHMgd3JpdGUtaW5vZGUgLT4gbnRmc193cml0ZV9pbm9kZSAtPiBtYXBfbWZ0X3JlY29yZCgpIC0+CisJICByZWFkX2NhY2hlX3BhZ2UoKSBmb3IgdGhlIHBhZ2UgKGluIHBhZ2UgY2FjaGUgb2YgdGFibGUgb2YgaW5vZGVzCisJICAkTUZULCBpbm9kZSAwKSBjb250YWluaW5nIHRoZSBvbi1kaXNrIGlub2RlLiAgVGhpcyBwYWdlIGhhcworCSAgUGFnZVVwdG9kYXRlKCkgY2xlYXIgYmVjYXVzZSBvZiBQcm9jZXNzIDEgKHNlZSBhYm92ZSkgc28KKwkgIHJlYWRfY2FjaGVfcGFnZSgpIGJsb2NrcyB3aGVuIGl0IHRyaWVzIHRvIHRha2UgdGhlIHBhZ2UgbG9jayBmb3IgdGhlCisJICBwYWdlIHNvIGl0IGNhbiBjYWxsIG50ZnNfcmVhZF9wYWdlKCkuCisJICBUaHVzIFByb2Nlc3MgMSBpcyBob2xkaW5nIHRoZSBwYWdlIGxvY2sgb24gdGhlIHBhZ2UgY29udGFpbmluZyB0aGUKKwkgIG9uLWRpc2sgaW5vZGUgWCBhbmQgaXQgaXMgd2FpdGluZyBvbiB0aGUgaW5vZGUgWCB0byBiZSB1bmxvY2tlZCBpbgorCSAgaWZpbmQoKSBzbyBpdCBjYW4gd3JpdGUgdGhlIHBhZ2Ugb3V0IGFuZCB0aGVuIHVubG9jayB0aGUgcGFnZS4KKwkgIEFuZCBQcm9jZXNzIDIgaXMgaG9sZGluZyB0aGUgaW5vZGUgbG9jayBvbiBpbm9kZSBYIGFuZCBpcyB3YWl0aW5nIGZvcgorCSAgdGhlIHBhZ2UgdG8gYmUgdW5sb2NrZWQgc28gaXQgY2FuIGNhbGwgbnRmc19yZWFkcGFnZSgpIG9yIGRpc2NvdmVyCisJICB0aGF0IFByb2Nlc3MgMSBzZXQgUGFnZVVwdG9kYXRlKCkgYWdhaW4gYW5kIHVzZSB0aGUgcGFnZS4KKwkgIFRodXMgd2UgaGF2ZSBhIGRlYWRsb2NrIGR1ZSB0byBpZmluZCgpIHdhaXRpbmcgb24gdGhlIGlub2RlIGxvY2suCisJICBUaGUgc29sdXRpb246IFRoZSBmaXggaXMgdG8gdXNlIHRoZSBuZXdseSBpbnRyb2R1Y2VkCisJICBpbG9va3VwNV9ub3dhaXQoKSB3aGljaCBkb2VzIG5vdCB3YWl0IG9uIHRoZSBpbm9kZSdzIGxvY2sgYW5kIGhlbmNlCisJICBhdm9pZHMgdGhlIGRlYWRsb2NrLiAgVGhpcyBpcyBzYWZlIGFzIHdlIGRvIG5vdCBjYXJlIGFib3V0IHRoZSBWRlMKKwkgIGlub2RlIGFuZCBvbmx5IHVzZSB0aGUgZmFjdCB0aGF0IGl0IGlzIGluIHRoZSBWRlMgaW5vZGUgY2FjaGUgYW5kIHRoZQorCSAgZmFjdCB0aGF0IHRoZSB2ZnMgYW5kIG50ZnMgaW5vZGVzIGFyZSBvbmUgc3RydWN0IGluIG1lbW9yeSB0byBmaW5kCisJICB0aGUgbnRmcyBpbm9kZSBpbiBtZW1vcnkgaWYgcHJlc2VudC4gIEFsc28sIHRoZSBudGZzIGlub2RlIGhhcyBpdHMKKwkgIG93biBsb2NraW5nIHNvIGl0IGRvZXMgbm90IG1hdHRlciBpZiB0aGUgdmZzIGlub2RlIGlzIGxvY2tlZC4KIAogMi4xLjIyIC0gTWFueSBidWcgYW5kIHJhY2UgZml4ZXMgYW5kIGVycm9yIGhhbmRsaW5nIGltcHJvdmVtZW50cy4KIApAQCAtMTAzNyw3ICsxMTgwLDcgQEAKIAktIEZ1cnRoZXIgcnVubGlzdCBtZXJnaW5nIHdvcmsuIChSaWNoYXJkIFJ1c3NvbikKIAktIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGZvciBnY2MtMi45NS4gKFJpY2hhcmQgUnVzc29uKQogCS0gVXBkYXRlIHRvIGtlcm5lbCAyLjUuNS1wcmUxIGFuZCByZWRpZmYgdGhlIG5vdyB0aW55IHBhdGNoLgotCS0gQ29udmVydCB0byBuZXcgZmlsZSBzeXN0ZW0gZGVjbGFyYXRpb24gdXNpbmcgLT5udGZzX2dldF9zYigpIGFuZAorCS0gQ29udmVydCB0byBuZXcgZmlsZXN5c3RlbSBkZWNsYXJhdGlvbiB1c2luZyAtPm50ZnNfZ2V0X3NiKCkgYW5kCiAJICByZXBsYWNpbmcgbnRmc19yZWFkX3N1cGVyKCkgd2l0aCBudGZzX2ZpbGxfc3VwZXIoKS4KIAktIFNldCBzX21heGJ5dGVzIHRvIE1BWF9MRlNfRklMRVNJWkUgdG8gYXZvaWQgcGFnZSBjYWNoZSBwYWdlIGluZGV4CiAJICBvdmVyZmxvdyBvbiAzMi1iaXQgYXJjaGl0ZWN0dXJlcy4KQEAgLTEzMzMsNyArMTQ3Niw3IEBACiAJVGhlIGRyaXZlciBpcyBub3cgYWN0dWFsbHkgdXNlZnVsISBZZXkuICgtOiBJdCB1bmRvdWJ0ZWRseSBoYXMgZ290IGJ1Z3MKIAl0aG91Z2ggYW5kIGl0IGRvZXNuJ3QgaW1wbGVtZW50IGFjY2Vzc3NpbmcgY29tcHJlc3NlZCBmaWxlcyB5ZXQuIEFsc28sCiAJYWNjZXNzaW5nIGZpbGVzIHdpdGggYXR0cmlidXRlIGxpc3QgYXR0cmlidXRlcyBpcyBub3QgaW1wbGVtZW50ZWQgeWV0Ci0JZWl0aGVyLiBCdXQgZm9yIHNtYWxsIG9yIHNpbXBsZSBmaWxlIHN5c3RlbXMgaXQgc2hvdWxkIHdvcmsgYW5kIGFsbG93CisJZWl0aGVyLiBCdXQgZm9yIHNtYWxsIG9yIHNpbXBsZSBmaWxlc3lzdGVtcyBpdCBzaG91bGQgd29yayBhbmQgYWxsb3cKIAl5b3UgdG8gbGlzdCBkaXJlY3RvcmllcywgdXNlIHN0YXQgb24gZGlyZWN0b3J5IGVudHJpZXMgYW5kIHRoZSBmaWxlCiAJc3lzdGVtLCBvcGVuLCByZWFkLCBtbWFwIGFuZCBsbHNlZWsgYXJvdW5kIGluIGZpbGVzLiBBIGJpZyBtaWxlIHN0b25lCiAJaGFzIGJlZW4gcmVhY2hlZCEKQEAgLTEzNDEsNyArMTQ4NCw3IEBACiB0bmctMC4wLjAgLSBJbml0aWFsIHZlcnNpb24gdGFnLgogCiAJSW5pdGlhbCBkcml2ZXIgaW1wbGVtZW50YXRpb24uIFRoZSBkcml2ZXIgY2FuIG1vdW50IGFuZCB1bW91bnQgc2ltcGxlCi0JTlRGUyBmaWxlIHN5c3RlbXMgKGkuZS4gb25lcyB3aXRob3V0IGF0dHJpYnV0ZSBsaXN0cyBpbiB0aGUgc3lzdGVtCisJTlRGUyBmaWxlc3lzdGVtcyAoaS5lLiBvbmVzIHdpdGhvdXQgYXR0cmlidXRlIGxpc3RzIGluIHRoZSBzeXN0ZW0KIAlmaWxlcykuIElmIHRoZSBtb3VudCBmYWlscyB0aGVyZSBtaWdodCBiZSBwcm9ibGVtcyBpbiB0aGUgZXJyb3IgaGFuZGxpbmcKIAljb2RlIHBhdGhzLCBzbyBiZSB3YXJuZWQuIE90aGVyd2lzZSBpdCBzZWVtcyB0byBiZSBsb2FkaW5nIHRoZSBzeXN0ZW0KIAlmaWxlcyBuaWNlbHkgYW5kIHRoZSBtZnQgcmVjb3JkIHJlYWQgbWFwcGluZy91bm1hcHBpbmcgc2VlbXMgdG8gYmUKZGlmZiAtLWdpdCBhL2ZzL250ZnMvTWFrZWZpbGUgYi9mcy9udGZzL01ha2VmaWxlCmluZGV4IDdiNjYzODEuLmYwODNmMjcgMTAwNjQ0Ci0tLSBhL2ZzL250ZnMvTWFrZWZpbGUKKysrIGIvZnMvbnRmcy9NYWtlZmlsZQpAQCAtNiw3ICs2LDcgQEAKIAkgICAgIGluZGV4Lm8gaW5vZGUubyBtZnQubyBtc3QubyBuYW1laS5vIHJ1bmxpc3QubyBzdXBlci5vIHN5c2N0bC5vIFwKIAkgICAgIHVuaXN0ci5vIHVwY2FzZS5vCiAKLUVYVFJBX0NGTEFHUyA9IC1ETlRGU19WRVJTSU9OPVwiMi4xLjIyXCIKK0VYVFJBX0NGTEFHUyA9IC1ETlRGU19WRVJTSU9OPVwiMi4xLjIzXCIKIAogaWZlcSAoJChDT05GSUdfTlRGU19ERUJVRykseSkKIEVYVFJBX0NGTEFHUyArPSAtRERFQlVHCkBAIC0xNSw1ICsxNSw1IEBACiBpZmVxICgkKENPTkZJR19OVEZTX1JXKSx5KQogRVhUUkFfQ0ZMQUdTICs9IC1ETlRGU19SVwogCi1udGZzLW9ianMgKz0gYml0bWFwLm8gbGNuYWxsb2MubyBsb2dmaWxlLm8gcXVvdGEubworbnRmcy1vYmpzICs9IGJpdG1hcC5vIGxjbmFsbG9jLm8gbG9nZmlsZS5vIHF1b3RhLm8gdXNuanJubC5vCiBlbmRpZgpkaWZmIC0tZ2l0IGEvZnMvbnRmcy9hb3BzLmMgYi9mcy9udGZzL2FvcHMuYwppbmRleCA0NWQ1NmU0Li4zZjQzYmZlNiAxMDA2NDQKLS0tIGEvZnMvbnRmcy9hb3BzLmMKKysrIGIvZnMvbnRmcy9hb3BzLmMKQEAgLTIsNyArMiw3IEBACiAgKiBhb3BzLmMgLSBOVEZTIGtlcm5lbCBhZGRyZXNzIHNwYWNlIG9wZXJhdGlvbnMgYW5kIHBhZ2UgY2FjaGUgaGFuZGxpbmcuCiAgKgkgICAgUGFydCBvZiB0aGUgTGludXgtTlRGUyBwcm9qZWN0LgogICoKLSAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA0IEFudG9uIEFsdGFwYXJtYWtvdgorICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDUgQW50b24gQWx0YXBhcm1ha292CiAgKiBDb3B5cmlnaHQgKGMpIDIwMDIgUmljaGFyZCBSdXNzb24KICAqCiAgKiBUaGlzIHByb2dyYW0vaW5jbHVkZSBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgpAQCAtNjYsMTkgKzY2LDIyIEBACiAJbmkgPSBOVEZTX0kocGFnZS0+bWFwcGluZy0+aG9zdCk7CiAKIAlpZiAobGlrZWx5KHVwdG9kYXRlKSkgewotCQlzNjQgZmlsZV9vZnM7CisJCXM2NCBmaWxlX29mcywgaW5pdGlhbGl6ZWRfc2l6ZTsKIAogCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKIAogCQlmaWxlX29mcyA9ICgoczY0KXBhZ2UtPmluZGV4IDw8IFBBR0VfQ0FDSEVfU0hJRlQpICsKIAkJCQliaF9vZmZzZXQoYmgpOworCQlyZWFkX2xvY2tfaXJxc2F2ZSgmbmktPnNpemVfbG9jaywgZmxhZ3MpOworCQlpbml0aWFsaXplZF9zaXplID0gbmktPmluaXRpYWxpemVkX3NpemU7CisJCXJlYWRfdW5sb2NrX2lycXJlc3RvcmUoJm5pLT5zaXplX2xvY2ssIGZsYWdzKTsKIAkJLyogQ2hlY2sgZm9yIHRoZSBjdXJyZW50IGJ1ZmZlciBoZWFkIG92ZXJmbG93aW5nLiAqLwotCQlpZiAoZmlsZV9vZnMgKyBiaC0+Yl9zaXplID4gbmktPmluaXRpYWxpemVkX3NpemUpIHsKKwkJaWYgKGZpbGVfb2ZzICsgYmgtPmJfc2l6ZSA+IGluaXRpYWxpemVkX3NpemUpIHsKIAkJCWNoYXIgKmFkZHI7CiAJCQlpbnQgb2ZzID0gMDsKIAotCQkJaWYgKGZpbGVfb2ZzIDwgbmktPmluaXRpYWxpemVkX3NpemUpCi0JCQkJb2ZzID0gbmktPmluaXRpYWxpemVkX3NpemUgLSBmaWxlX29mczsKKwkJCWlmIChmaWxlX29mcyA8IGluaXRpYWxpemVkX3NpemUpCisJCQkJb2ZzID0gaW5pdGlhbGl6ZWRfc2l6ZSAtIGZpbGVfb2ZzOwogCQkJYWRkciA9IGttYXBfYXRvbWljKHBhZ2UsIEtNX0JJT19TUkNfSVJRKTsKIAkJCW1lbXNldChhZGRyICsgYmhfb2Zmc2V0KGJoKSArIG9mcywgMCwgYmgtPmJfc2l6ZSAtIG9mcyk7CiAJCQlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKQEAgLTEzMiw3ICsxMzUsNyBAQAogCQkJCQlpICogcmVjX3NpemUpLCByZWNfc2l6ZSk7CiAJCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOwogCQlrdW5tYXBfYXRvbWljKGFkZHIsIEtNX0JJT19TUkNfSVJRKTsKLQkJaWYgKGxpa2VseSghUGFnZUVycm9yKHBhZ2UpICYmIHBhZ2VfdXB0b2RhdGUpKQorCQlpZiAobGlrZWx5KHBhZ2VfdXB0b2RhdGUgJiYgIVBhZ2VFcnJvcihwYWdlKSkpCiAJCQlTZXRQYWdlVXB0b2RhdGUocGFnZSk7CiAJfQogCXVubG9ja19wYWdlKHBhZ2UpOwpAQCAtMTY4LDYgKzE3MSw3IEBACiAJcnVubGlzdF9lbGVtZW50ICpybDsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCAqaGVhZCwgKmFycltNQVhfQlVGX1BFUl9QQUdFXTsKIAlzZWN0b3JfdCBpYmxvY2ssIGxibG9jaywgemJsb2NrOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdW5zaWduZWQgaW50IGJsb2Nrc2l6ZSwgdmNuX29mczsKIAlpbnQgaSwgbnI7CiAJdW5zaWduZWQgY2hhciBibG9ja3NpemVfYml0czsKQEAgLTE5MCw4ICsxOTQsMTAgQEAKIAl9CiAKIAlpYmxvY2sgPSAoczY0KXBhZ2UtPmluZGV4IDw8IChQQUdFX0NBQ0hFX1NISUZUIC0gYmxvY2tzaXplX2JpdHMpOworCXJlYWRfbG9ja19pcnFzYXZlKCZuaS0+c2l6ZV9sb2NrLCBmbGFncyk7CiAJbGJsb2NrID0gKG5pLT5hbGxvY2F0ZWRfc2l6ZSArIGJsb2Nrc2l6ZSAtIDEpID4+IGJsb2Nrc2l6ZV9iaXRzOwogCXpibG9jayA9IChuaS0+aW5pdGlhbGl6ZWRfc2l6ZSArIGJsb2Nrc2l6ZSAtIDEpID4+IGJsb2Nrc2l6ZV9iaXRzOworCXJlYWRfdW5sb2NrX2lycXJlc3RvcmUoJm5pLT5zaXplX2xvY2ssIGZsYWdzKTsKIAogCS8qIExvb3AgdGhyb3VnaCBhbGwgdGhlIGJ1ZmZlcnMgaW4gdGhlIHBhZ2UuICovCiAJcmwgPSBOVUxMOwpAQCAtMjU4LDcgKzI2NCw4IEBACiAJCQkJCWdvdG8gbG9ja19yZXRyeV9yZW1hcDsKIAkJCQlybCA9IE5VTEw7CiAJCQkJbGNuID0gZXJyOwotCQkJfQorCQkJfSBlbHNlIGlmICghcmwpCisJCQkJdXBfcmVhZCgmbmktPnJ1bmxpc3QubG9jayk7CiAJCQkvKiBIYXJkIGVycm9yLCB6ZXJvIG91dCByZWdpb24uICovCiAJCQliaC0+Yl9ibG9ja25yID0gLTE7CiAJCQlTZXRQYWdlRXJyb3IocGFnZSk7CkBAIC0zNDEsMTQgKzM0OCwxNSBAQAogICovCiBzdGF0aWMgaW50IG50ZnNfcmVhZHBhZ2Uoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwYWdlICpwYWdlKQogewotCWxvZmZfdCBpX3NpemU7CiAJbnRmc19pbm9kZSAqbmksICpiYXNlX25pOwogCXU4ICprYWRkcjsKIAludGZzX2F0dHJfc2VhcmNoX2N0eCAqY3R4OwogCU1GVF9SRUNPUkQgKm1yZWM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1MzIgYXR0cl9sZW47CiAJaW50IGVyciA9IDA7CiAKK3JldHJ5X3JlYWRwYWdlOgogCUJVR19PTighUGFnZUxvY2tlZChwYWdlKSk7CiAJLyoKIAkgKiBUaGlzIGNhbiBwb3RlbnRpYWxseSBoYXBwZW4gYmVjYXVzZSB3ZSBjbGVhciBQYWdlVXB0b2RhdGUoKSBkdXJpbmcKQEAgLTM4Myw5ICszOTEsOSBAQAogCSAqIEF0dHJpYnV0ZSBpcyByZXNpZGVudCwgaW1wbHlpbmcgaXQgaXMgbm90IGNvbXByZXNzZWQgb3IgZW5jcnlwdGVkLgogCSAqIFRoaXMgYWxzbyBtZWFucyB0aGUgYXR0cmlidXRlIGlzIHNtYWxsZXIgdGhhbiBhbiBtZnQgcmVjb3JkIGFuZAogCSAqIGhlbmNlIHNtYWxsZXIgdGhhbiBhIHBhZ2UsIHNvIGNhbiBzaW1wbHkgemVybyBvdXQgYW55IHBhZ2VzIHdpdGgKLQkgKiBpbmRleCBhYm92ZSAwLiAgV2UgY2FuIGFsc28gZG8gdGhpcyBpZiB0aGUgZmlsZSBzaXplIGlzIDAuCisJICogaW5kZXggYWJvdmUgMC4KIAkgKi8KLQlpZiAodW5saWtlbHkocGFnZS0+aW5kZXggPiAwIHx8ICFpX3NpemVfcmVhZChWRlNfSShuaSkpKSkgeworCWlmICh1bmxpa2VseShwYWdlLT5pbmRleCA+IDApKSB7CiAJCWthZGRyID0ga21hcF9hdG9taWMocGFnZSwgS01fVVNFUjApOwogCQltZW1zZXQoa2FkZHIsIDAsIFBBR0VfQ0FDSEVfU0laRSk7CiAJCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOwpAQCAtNDAyLDYgKzQxMCwxNCBAQAogCQllcnIgPSBQVFJfRVJSKG1yZWMpOwogCQlnb3RvIGVycl9vdXQ7CiAJfQorCS8qCisJICogSWYgYSBwYXJhbGxlbCB3cml0ZSBtYWRlIHRoZSBhdHRyaWJ1dGUgbm9uLXJlc2lkZW50LCBkcm9wIHRoZSBtZnQKKwkgKiByZWNvcmQgYW5kIHJldHJ5IHRoZSByZWFkcGFnZS4KKwkgKi8KKwlpZiAodW5saWtlbHkoTklub05vblJlc2lkZW50KG5pKSkpIHsKKwkJdW5tYXBfbWZ0X3JlY29yZChiYXNlX25pKTsKKwkJZ290byByZXRyeV9yZWFkcGFnZTsKKwl9CiAJY3R4ID0gbnRmc19hdHRyX2dldF9zZWFyY2hfY3R4KGJhc2VfbmksIG1yZWMpOwogCWlmICh1bmxpa2VseSghY3R4KSkgewogCQllcnIgPSAtRU5PTUVNOwpAQCAtNDEyLDkgKzQyOCwxMCBAQAogCWlmICh1bmxpa2VseShlcnIpKQogCQlnb3RvIHB1dF91bm1fZXJyX291dDsKIAlhdHRyX2xlbiA9IGxlMzJfdG9fY3B1KGN0eC0+YXR0ci0+ZGF0YS5yZXNpZGVudC52YWx1ZV9sZW5ndGgpOwotCWlfc2l6ZSA9IGlfc2l6ZV9yZWFkKFZGU19JKG5pKSk7Ci0JaWYgKHVubGlrZWx5KGF0dHJfbGVuID4gaV9zaXplKSkKLQkJYXR0cl9sZW4gPSBpX3NpemU7CisJcmVhZF9sb2NrX2lycXNhdmUoJm5pLT5zaXplX2xvY2ssIGZsYWdzKTsKKwlpZiAodW5saWtlbHkoYXR0cl9sZW4gPiBuaS0+aW5pdGlhbGl6ZWRfc2l6ZSkpCisJCWF0dHJfbGVuID0gbmktPmluaXRpYWxpemVkX3NpemU7CisJcmVhZF91bmxvY2tfaXJxcmVzdG9yZSgmbmktPnNpemVfbG9jaywgZmxhZ3MpOwogCWthZGRyID0ga21hcF9hdG9taWMocGFnZSwgS01fVVNFUjApOwogCS8qIENvcHkgdGhlIGRhdGEgdG8gdGhlIHBhZ2UuICovCiAJbWVtY3B5KGthZGRyLCAodTgqKWN0eC0+YXR0ciArCkBAIC00NjMsMTIgKzQ4MCwxNSBAQAogewogCVZDTiB2Y247CiAJTENOIGxjbjsKKwlzNjQgaW5pdGlhbGl6ZWRfc2l6ZTsKKwlsb2ZmX3QgaV9zaXplOwogCXNlY3Rvcl90IGJsb2NrLCBkYmxvY2ssIGlibG9jazsKIAlzdHJ1Y3QgaW5vZGUgKnZpOwogCW50ZnNfaW5vZGUgKm5pOwogCW50ZnNfdm9sdW1lICp2b2w7CiAJcnVubGlzdF9lbGVtZW50ICpybDsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCAqaGVhZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXVuc2lnbmVkIGludCBibG9ja3NpemUsIHZjbl9vZnM7CiAJaW50IGVycjsKIAlCT09MIG5lZWRfZW5kX3dyaXRlYmFjazsKQEAgLTUxMCwxMSArNTMwLDE2IEBACiAJLyogVGhlIGZpcnN0IGJsb2NrIGluIHRoZSBwYWdlLiAqLwogCWJsb2NrID0gKHM2NClwYWdlLT5pbmRleCA8PCAoUEFHRV9DQUNIRV9TSElGVCAtIGJsb2Nrc2l6ZV9iaXRzKTsKIAorCXJlYWRfbG9ja19pcnFzYXZlKCZuaS0+c2l6ZV9sb2NrLCBmbGFncyk7CisJaV9zaXplID0gaV9zaXplX3JlYWQodmkpOworCWluaXRpYWxpemVkX3NpemUgPSBuaS0+aW5pdGlhbGl6ZWRfc2l6ZTsKKwlyZWFkX3VubG9ja19pcnFyZXN0b3JlKCZuaS0+c2l6ZV9sb2NrLCBmbGFncyk7CisKIAkvKiBUaGUgZmlyc3Qgb3V0IG9mIGJvdW5kcyBibG9jayBmb3IgdGhlIGRhdGEgc2l6ZS4gKi8KLQlkYmxvY2sgPSAodmktPmlfc2l6ZSArIGJsb2Nrc2l6ZSAtIDEpID4+IGJsb2Nrc2l6ZV9iaXRzOworCWRibG9jayA9IChpX3NpemUgKyBibG9ja3NpemUgLSAxKSA+PiBibG9ja3NpemVfYml0czsKIAogCS8qIFRoZSBsYXN0IChmdWxseSBvciBwYXJ0aWFsbHkpIGluaXRpYWxpemVkIGJsb2NrLiAqLwotCWlibG9jayA9IG5pLT5pbml0aWFsaXplZF9zaXplID4+IGJsb2Nrc2l6ZV9iaXRzOworCWlibG9jayA9IGluaXRpYWxpemVkX3NpemUgPj4gYmxvY2tzaXplX2JpdHM7CiAKIAkvKgogCSAqIEJlIHZlcnkgY2FyZWZ1bC4gIFdlIGhhdmUgbm8gZXhjbHVzaW9uIGZyb20gX19zZXRfcGFnZV9kaXJ0eV9idWZmZXJzCkBAIC01NTksNyArNTg0LDcgQEAKIAogCQkvKiBNYWtlIHN1cmUgd2UgaGF2ZSBlbm91Z2ggaW5pdGlhbGl6ZWQgc2l6ZS4gKi8KIAkJaWYgKHVubGlrZWx5KChibG9jayA+PSBpYmxvY2spICYmCi0JCQkJKG5pLT5pbml0aWFsaXplZF9zaXplIDwgdmktPmlfc2l6ZSkpKSB7CisJCQkJKGluaXRpYWxpemVkX3NpemUgPCBpX3NpemUpKSkgewogCQkJLyoKIAkJCSAqIElmIHRoaXMgcGFnZSBpcyBmdWxseSBvdXRzaWRlIGluaXRpYWxpemVkIHNpemUsIHplcm8KIAkJCSAqIG91dCBhbGwgcGFnZXMgYmV0d2VlbiB0aGUgY3VycmVudCBpbml0aWFsaXplZCBzaXplCkBAIC02NjYsNyArNjkxLDggQEAKIAkJCQlnb3RvIGxvY2tfcmV0cnlfcmVtYXA7CiAJCQlybCA9IE5VTEw7CiAJCQlsY24gPSBlcnI7Ci0JCX0KKwkJfSBlbHNlIGlmICghcmwpCisJCQl1cF9yZWFkKCZuaS0+cnVubGlzdC5sb2NrKTsKIAkJLyogRmFpbGVkIHRvIG1hcCB0aGUgYnVmZmVyLCBldmVuIGFmdGVyIHJldHJ5aW5nLiAqLwogCQliaC0+Yl9ibG9ja25yID0gLTE7CiAJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byB3cml0ZSB0byBpbm9kZSAweCVseCwgIgpAQCAtODAxLDE3ICs4MjcsMTUgQEAKIAludGZzX2lub2RlICpuaSA9IE5URlNfSSh2aSk7CiAJbnRmc192b2x1bWUgKnZvbCA9IG5pLT52b2w7CiAJdTggKmthZGRyOwotCXVuc2lnbmVkIGNoYXIgYmhfc2l6ZV9iaXRzID0gdmktPmlfYmxrYml0czsKLQl1bnNpZ25lZCBpbnQgYmhfc2l6ZSA9IDEgPDwgYmhfc2l6ZV9iaXRzOwogCXVuc2lnbmVkIGludCByZWNfc2l6ZSA9IG5pLT5pdHlwZS5pbmRleC5ibG9ja19zaXplOwogCW50ZnNfaW5vZGUgKmxvY2tlZF9uaXNbUEFHRV9DQUNIRV9TSVpFIC8gcmVjX3NpemVdOwogCXN0cnVjdCBidWZmZXJfaGVhZCAqYmgsICpoZWFkLCAqdGJoLCAqcmVjX3N0YXJ0X2JoOwotCWludCBtYXhfYmhzID0gUEFHRV9DQUNIRV9TSVpFIC8gYmhfc2l6ZTsKLQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoc1ttYXhfYmhzXTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoc1tNQVhfQlVGX1BFUl9QQUdFXTsKIAlydW5saXN0X2VsZW1lbnQgKnJsOwotCWludCBpLCBucl9sb2NrZWRfbmlzLCBucl9yZWNzLCBucl9iaHMsIGJoc19wZXJfcmVjLCBlcnIsIGVycjI7Ci0JdW5zaWduZWQgcmVjX3NpemVfYml0czsKKwlpbnQgaSwgbnJfbG9ja2VkX25pcywgbnJfcmVjcywgbnJfYmhzLCBtYXhfYmhzLCBiaHNfcGVyX3JlYywgZXJyLCBlcnIyOworCXVuc2lnbmVkIGJoX3NpemUsIHJlY19zaXplX2JpdHM7CiAJQk9PTCBzeW5jLCBpc19tZnQsIHBhZ2VfaXNfZGlydHksIHJlY19pc19kaXJ0eTsKKwl1bnNpZ25lZCBjaGFyIGJoX3NpemVfYml0czsKIAogCW50ZnNfZGVidWcoIkVudGVyaW5nIGZvciBpbm9kZSAweCVseCwgYXR0cmlidXRlIHR5cGUgMHgleCwgcGFnZSBpbmRleCAiCiAJCQkiMHglbHguIiwgdmktPmlfaW5vLCBuaS0+dHlwZSwgcGFnZS0+aW5kZXgpOwpAQCAtODI2LDcgKzg1MCwxMSBAQAogCSAqLwogCUJVR19PTighKGlzX21mdCB8fCBTX0lTRElSKHZpLT5pX21vZGUpIHx8CiAJCQkoTklub0F0dHIobmkpICYmIG5pLT50eXBlID09IEFUX0lOREVYX0FMTE9DQVRJT04pKSk7CisJYmhfc2l6ZV9iaXRzID0gdmktPmlfYmxrYml0czsKKwliaF9zaXplID0gMSA8PCBiaF9zaXplX2JpdHM7CisJbWF4X2JocyA9IFBBR0VfQ0FDSEVfU0laRSAvIGJoX3NpemU7CiAJQlVHX09OKCFtYXhfYmhzKTsKKwlCVUdfT04obWF4X2JocyA+IE1BWF9CVUZfUEVSX1BBR0UpOwogCiAJLyogV2VyZSB3ZSBjYWxsZWQgZm9yIHN5bmMgcHVycG9zZXM/ICovCiAJc3luYyA9ICh3YmMtPnN5bmNfbW9kZSA9PSBXQl9TWU5DX0FMTCk7CkBAIC04NDYsNyArODc0LDcgQEAKIAkJCShQQUdFX0NBQ0hFX1NISUZUIC0gYmhfc2l6ZV9iaXRzKTsKIAogCS8qIFRoZSBmaXJzdCBvdXQgb2YgYm91bmRzIGJsb2NrIGZvciB0aGUgZGF0YSBzaXplLiAqLwotCWRibG9jayA9ICh2aS0+aV9zaXplICsgYmhfc2l6ZSAtIDEpID4+IGJoX3NpemVfYml0czsKKwlkYmxvY2sgPSAoaV9zaXplX3JlYWQodmkpICsgYmhfc2l6ZSAtIDEpID4+IGJoX3NpemVfYml0czsKIAogCXJsID0gTlVMTDsKIAllcnIgPSBlcnIyID0gbnJfYmhzID0gbnJfcmVjcyA9IG5yX2xvY2tlZF9uaXMgPSAwOwpAQCAtODU4LDYgKzg4Niw3IEBACiAJCWlmIChsaWtlbHkoYmxvY2sgPCByZWNfYmxvY2spKSB7CiAJCQlpZiAodW5saWtlbHkoYmxvY2sgPj0gZGJsb2NrKSkgewogCQkJCWNsZWFyX2J1ZmZlcl9kaXJ0eShiaCk7CisJCQkJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7CiAJCQkJY29udGludWU7CiAJCQl9CiAJCQkvKgpAQCAtOTM4LDggKzk2NywxMSBAQAogCQkJCQlpZiAoZXJyMiA9PSAtRU5PTUVNKQogCQkJCQkJcGFnZV9pc19kaXJ0eSA9IFRSVUU7CiAJCQkJCWxjbiA9IGVycjI7Ci0JCQkJfSBlbHNlCisJCQkJfSBlbHNlIHsKIAkJCQkJZXJyMiA9IC1FSU87CisJCQkJCWlmICghcmwpCisJCQkJCQl1cF9yZWFkKCZuaS0+cnVubGlzdC5sb2NrKTsKKwkJCQl9CiAJCQkJLyogSGFyZCBlcnJvci4gIEFib3J0IHdyaXRpbmcgdGhpcyByZWNvcmQuICovCiAJCQkJaWYgKCFlcnIgfHwgZXJyID09IC1FTk9NRU0pCiAJCQkJCWVyciA9IGVycjI7CkBAIC05NDksNyArOTgxLDggQEAKIAkJCQkJCSJhdHRyaWJ1dGUgdHlwZSAweCV4KSBiZWNhdXNlICIKIAkJCQkJCSJpdHMgbG9jYXRpb24gb24gZGlzayBjb3VsZCAiCiAJCQkJCQkibm90IGJlIGRldGVybWluZWQgKGVycm9yICIKLQkJCQkJCSJjb2RlICVsbGkpLiIsIChzNjQpYmxvY2sgPDwKKwkJCQkJCSJjb2RlICVsbGkpLiIsCisJCQkJCQkobG9uZyBsb25nKWJsb2NrIDw8CiAJCQkJCQliaF9zaXplX2JpdHMgPj4KIAkJCQkJCXZvbC0+bWZ0X3JlY29yZF9zaXplX2JpdHMsCiAJCQkJCQluaS0+bWZ0X25vLCBuaS0+dHlwZSwKQEAgLTEyMjMsMTkgKzEyNTYsMTcgQEAKIHN0YXRpYyBpbnQgbnRmc193cml0ZXBhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqd2JjKQogewogCWxvZmZfdCBpX3NpemU7Ci0Jc3RydWN0IGlub2RlICp2aTsKLQludGZzX2lub2RlICpuaSwgKmJhc2Vfbmk7CisJc3RydWN0IGlub2RlICp2aSA9IHBhZ2UtPm1hcHBpbmctPmhvc3Q7CisJbnRmc19pbm9kZSAqYmFzZV9uaSA9IE5VTEwsICpuaSA9IE5URlNfSSh2aSk7CiAJY2hhciAqa2FkZHI7Ci0JbnRmc19hdHRyX3NlYXJjaF9jdHggKmN0eDsKLQlNRlRfUkVDT1JEICptOworCW50ZnNfYXR0cl9zZWFyY2hfY3R4ICpjdHggPSBOVUxMOworCU1GVF9SRUNPUkQgKm0gPSBOVUxMOwogCXUzMiBhdHRyX2xlbjsKIAlpbnQgZXJyOwogCityZXRyeV93cml0ZXBhZ2U6CiAJQlVHX09OKCFQYWdlTG9ja2VkKHBhZ2UpKTsKLQotCXZpID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKIAlpX3NpemUgPSBpX3NpemVfcmVhZCh2aSk7Ci0KIAkvKiBJcyB0aGUgcGFnZSBmdWxseSBvdXRzaWRlIGlfc2l6ZT8gKHRydW5jYXRlIGluIHByb2dyZXNzKSAqLwogCWlmICh1bmxpa2VseShwYWdlLT5pbmRleCA+PSAoaV9zaXplICsgUEFHRV9DQUNIRV9TSVpFIC0gMSkgPj4KIAkJCVBBR0VfQ0FDSEVfU0hJRlQpKSB7CkBAIC0xMjQ4LDggKzEyNzksNiBAQAogCQludGZzX2RlYnVnKCJXcml0ZSBvdXRzaWRlIGlfc2l6ZSAtIHRydW5jYXRlZD8iKTsKIAkJcmV0dXJuIDA7CiAJfQotCW5pID0gTlRGU19JKHZpKTsKLQogCS8qIE5Jbm9Ob25SZXNpZGVudCgpID09IE5Jbm9JbmRleEFsbG9jUHJlc2VudCgpICovCiAJaWYgKE5Jbm9Ob25SZXNpZGVudChuaSkpIHsKIAkJLyoKQEAgLTEzMjYsNiArMTM1NSwxNCBAQAogCQljdHggPSBOVUxMOwogCQlnb3RvIGVycl9vdXQ7CiAJfQorCS8qCisJICogSWYgYSBwYXJhbGxlbCB3cml0ZSBtYWRlIHRoZSBhdHRyaWJ1dGUgbm9uLXJlc2lkZW50LCBkcm9wIHRoZSBtZnQKKwkgKiByZWNvcmQgYW5kIHJldHJ5IHRoZSB3cml0ZXBhZ2UuCisJICovCisJaWYgKHVubGlrZWx5KE5Jbm9Ob25SZXNpZGVudChuaSkpKSB7CisJCXVubWFwX21mdF9yZWNvcmQoYmFzZV9uaSk7CisJCWdvdG8gcmV0cnlfd3JpdGVwYWdlOworCX0KIAljdHggPSBudGZzX2F0dHJfZ2V0X3NlYXJjaF9jdHgoYmFzZV9uaSwgbSk7CiAJaWYgKHVubGlrZWx5KCFjdHgpKSB7CiAJCWVyciA9IC1FTk9NRU07CkBAIC0xMzY3LDE1ICsxNDA0LDEyIEBACiAJICovCiAKIAlhdHRyX2xlbiA9IGxlMzJfdG9fY3B1KGN0eC0+YXR0ci0+ZGF0YS5yZXNpZGVudC52YWx1ZV9sZW5ndGgpOwotCWlfc2l6ZSA9IGlfc2l6ZV9yZWFkKFZGU19JKG5pKSk7Ci0Ja2FkZHIgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCk7CisJaV9zaXplID0gaV9zaXplX3JlYWQodmkpOwogCWlmICh1bmxpa2VseShhdHRyX2xlbiA+IGlfc2l6ZSkpIHsKLQkJLyogWmVybyBvdXQgb2YgYm91bmRzIGFyZWEgaW4gdGhlIG1mdCByZWNvcmQuICovCi0JCW1lbXNldCgodTgqKWN0eC0+YXR0ciArIGxlMTZfdG9fY3B1KAotCQkJCWN0eC0+YXR0ci0+ZGF0YS5yZXNpZGVudC52YWx1ZV9vZmZzZXQpICsKLQkJCQlpX3NpemUsIDAsIGF0dHJfbGVuIC0gaV9zaXplKTsKIAkJYXR0cl9sZW4gPSBpX3NpemU7CisJCWN0eC0+YXR0ci0+ZGF0YS5yZXNpZGVudC52YWx1ZV9sZW5ndGggPSBjcHVfdG9fbGUzMihhdHRyX2xlbik7CiAJfQorCWthZGRyID0ga21hcF9hdG9taWMocGFnZSwgS01fVVNFUjApOwogCS8qIENvcHkgdGhlIGRhdGEgZnJvbSB0aGUgcGFnZSB0byB0aGUgbWZ0IHJlY29yZC4gKi8KIAltZW1jcHkoKHU4KiljdHgtPmF0dHIgKwogCQkJbGUxNl90b19jcHUoY3R4LT5hdHRyLT5kYXRhLnJlc2lkZW50LnZhbHVlX29mZnNldCksCkBAIC0xNDA1LDggKzE0MzksMTAgQEAKIAkJZXJyID0gMDsKIAl9IGVsc2UgewogCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiUmVzaWRlbnQgYXR0cmlidXRlIHdyaXRlIGZhaWxlZCB3aXRoICIKLQkJCQkiZXJyb3IgJWkuICBTZXR0aW5nIHBhZ2UgZXJyb3IgZmxhZy4iLCBlcnIpOworCQkJCSJlcnJvciAlaS4iLCBlcnIpOwogCQlTZXRQYWdlRXJyb3IocGFnZSk7CisJCU5Wb2xTZXRFcnJvcnMobmktPnZvbCk7CisJCW1ha2VfYmFkX2lub2RlKHZpKTsKIAl9CiAJdW5sb2NrX3BhZ2UocGFnZSk7CiAJaWYgKGN0eCkKQEAgLTE0MjUsMTIgKzE0NjEsMTUgQEAKIHsKIAlWQ04gdmNuOwogCUxDTiBsY247CisJczY0IGluaXRpYWxpemVkX3NpemU7CisJbG9mZl90IGlfc2l6ZTsKIAlzZWN0b3JfdCBibG9jaywgYWJsb2NrLCBpYmxvY2s7CiAJc3RydWN0IGlub2RlICp2aTsKIAludGZzX2lub2RlICpuaTsKIAludGZzX3ZvbHVtZSAqdm9sOwogCXJ1bmxpc3RfZWxlbWVudCAqcmw7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgKmhlYWQsICp3YWl0WzJdLCAqKndhaXRfYmggPSB3YWl0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdW5zaWduZWQgaW50IHZjbl9vZnMsIGJsb2NrX3N0YXJ0LCBibG9ja19lbmQsIGJsb2Nrc2l6ZTsKIAlpbnQgZXJyOwogCUJPT0wgaXNfcmV0cnk7CkBAIC0xNDYyLDE2ICsxNTAxLDIwIEBACiAJLyogVGhlIGZpcnN0IGJsb2NrIGluIHRoZSBwYWdlLiAqLwogCWJsb2NrID0gKHM2NClwYWdlLT5pbmRleCA8PCAoUEFHRV9DQUNIRV9TSElGVCAtIGJsb2Nrc2l6ZV9iaXRzKTsKIAorCXJlYWRfbG9ja19pcnFzYXZlKCZuaS0+c2l6ZV9sb2NrLCBmbGFncyk7CiAJLyoKLQkgKiBUaGUgZmlyc3Qgb3V0IG9mIGJvdW5kcyBibG9jayBmb3IgdGhlIGFsbG9jYXRlZCBzaXplLiBObyBuZWVkIHRvCisJICogVGhlIGZpcnN0IG91dCBvZiBib3VuZHMgYmxvY2sgZm9yIHRoZSBhbGxvY2F0ZWQgc2l6ZS4gIE5vIG5lZWQgdG8KIAkgKiByb3VuZCB1cCBhcyBhbGxvY2F0ZWRfc2l6ZSBpcyBpbiBtdWx0aXBsZXMgb2YgY2x1c3RlciBzaXplIGFuZCB0aGUKIAkgKiBtaW5pbXVtIGNsdXN0ZXIgc2l6ZSBpcyA1MTIgYnl0ZXMsIHdoaWNoIGlzIGVxdWFsIHRvIHRoZSBzbWFsbGVzdAogCSAqIGJsb2Nrc2l6ZS4KIAkgKi8KIAlhYmxvY2sgPSBuaS0+YWxsb2NhdGVkX3NpemUgPj4gYmxvY2tzaXplX2JpdHM7CisJaV9zaXplID0gaV9zaXplX3JlYWQodmkpOworCWluaXRpYWxpemVkX3NpemUgPSBuaS0+aW5pdGlhbGl6ZWRfc2l6ZTsKKwlyZWFkX3VubG9ja19pcnFyZXN0b3JlKCZuaS0+c2l6ZV9sb2NrLCBmbGFncyk7CiAKIAkvKiBUaGUgbGFzdCAoZnVsbHkgb3IgcGFydGlhbGx5KSBpbml0aWFsaXplZCBibG9jay4gKi8KLQlpYmxvY2sgPSBuaS0+aW5pdGlhbGl6ZWRfc2l6ZSA+PiBibG9ja3NpemVfYml0czsKKwlpYmxvY2sgPSBpbml0aWFsaXplZF9zaXplID4+IGJsb2Nrc2l6ZV9iaXRzOwogCiAJLyogTG9vcCB0aHJvdWdoIGFsbCB0aGUgYnVmZmVycyBpbiB0aGUgcGFnZS4gKi8KIAlibG9ja19zdGFydCA9IDA7CkBAIC0xNTE4LDcgKzE1NjEsNyBAQAogCQkgKiByZXF1ZXN0LCBpLmUuIGJsb2NrIDwgYWJsb2NrIGlzIHRydWUuCiAJCSAqLwogCQlpZiAodW5saWtlbHkoKGJsb2NrID49IGlibG9jaykgJiYKLQkJCQkobmktPmluaXRpYWxpemVkX3NpemUgPCB2aS0+aV9zaXplKSkpIHsKKwkJCQkoaW5pdGlhbGl6ZWRfc2l6ZSA8IGlfc2l6ZSkpKSB7CiAJCQkvKgogCQkJICogSWYgdGhpcyBwYWdlIGlzIGZ1bGx5IG91dHNpZGUgaW5pdGlhbGl6ZWQgc2l6ZSwgemVybwogCQkJICogb3V0IGFsbCBwYWdlcyBiZXR3ZWVuIHRoZSBjdXJyZW50IGluaXRpYWxpemVkIHNpemUKQEAgLTE2MjIsNiArMTY2NSw4IEBACiAJCQkJCQkJIm5vdCBzdXBwb3J0ZWQgeWV0LiAiCiAJCQkJCQkJIlNvcnJ5LiIpOwogCQkJCQllcnIgPSAtRU9QTk9UU1VQUDsKKwkJCQkJaWYgKCFybCkKKwkJCQkJCXVwX3JlYWQoJm5pLT5ydW5saXN0LmxvY2spOwogCQkJCQlnb3RvIGVycl9vdXQ7CiAJCQkJfSBlbHNlIGlmICghaXNfcmV0cnkgJiYKIAkJCQkJCWxjbiA9PSBMQ05fUkxfTk9UX01BUFBFRCkgewpAQCAtMTYzNiw3ICsxNjgxLDggQEAKIAkJCQkJCWdvdG8gbG9ja19yZXRyeV9yZW1hcDsKIAkJCQkJcmwgPSBOVUxMOwogCQkJCQlsY24gPSBlcnI7Ci0JCQkJfQorCQkJCX0gZWxzZSBpZiAoIXJsKQorCQkJCQl1cF9yZWFkKCZuaS0+cnVubGlzdC5sb2NrKTsKIAkJCQkvKgogCQkJCSAqIEZhaWxlZCB0byBtYXAgdGhlIGJ1ZmZlciwgZXZlbiBhZnRlcgogCQkJCSAqIHJldHJ5aW5nLgpAQCAtMTc5Nyw2ICsxODQzLDcgQEAKIAkJdW5zaWduZWQgZnJvbSwgdW5zaWduZWQgdG8pCiB7CiAJczY0IG5ld19zaXplOworCWxvZmZfdCBpX3NpemU7CiAJc3RydWN0IGlub2RlICp2aSA9IHBhZ2UtPm1hcHBpbmctPmhvc3Q7CiAJbnRmc19pbm9kZSAqYmFzZV9uaSA9IE5VTEwsICpuaSA9IE5URlNfSSh2aSk7CiAJbnRmc192b2x1bWUgKnZvbCA9IG5pLT52b2w7CkBAIC0xODY4LDE0ICsxOTE1LDggQEAKIAlCVUdfT04ocGFnZV9oYXNfYnVmZmVycyhwYWdlKSk7CiAJbmV3X3NpemUgPSAoKHM2NClwYWdlLT5pbmRleCA8PCBQQUdFX0NBQ0hFX1NISUZUKSArIHRvOwogCS8qIElmIHdlIGRvIG5vdCBuZWVkIHRvIHJlc2l6ZSB0aGUgYXR0cmlidXRlIGFsbG9jYXRpb24gd2UgYXJlIGRvbmUuICovCi0JaWYgKG5ld19zaXplIDw9IHZpLT5pX3NpemUpCisJaWYgKG5ld19zaXplIDw9IGlfc2l6ZV9yZWFkKHZpKSkKIAkJZ290byBkb25lOwotCi0JLy8gRklYTUU6IFdlIGFib3J0IGZvciBub3cgYXMgdGhpcyBjb2RlIGlzIG5vdCBzYWZlLgotCW50ZnNfZXJyb3IodmktPmlfc2IsICJDaGFuZ2luZyB0aGUgZmlsZSBzaXplIGlzIG5vdCBzdXBwb3J0ZWQgeWV0LiAgIgotCQkJIlNvcnJ5LiIpOwotCXJldHVybiAtRU9QTk9UU1VQUDsKLQogCS8qIE1hcCwgcGluLCBhbmQgbG9jayB0aGUgKGJhc2UpIG1mdCByZWNvcmQuICovCiAJaWYgKCFOSW5vQXR0cihuaSkpCiAJCWJhc2VfbmkgPSBuaTsKQEAgLTE5MDQsNyArMTk0NSwxNSBAQAogCWEgPSBjdHgtPmF0dHI7CiAJLyogVGhlIHRvdGFsIGxlbmd0aCBvZiB0aGUgYXR0cmlidXRlIHZhbHVlLiAqLwogCWF0dHJfbGVuID0gbGUzMl90b19jcHUoYS0+ZGF0YS5yZXNpZGVudC52YWx1ZV9sZW5ndGgpOwotCUJVR19PTih2aS0+aV9zaXplICE9IGF0dHJfbGVuKTsKKwkvKiBGaXggYW4gZXZlbnR1YWwgcHJldmlvdXMgZmFpbHVyZSBvZiBudGZzX2NvbW1pdF93cml0ZSgpLiAqLworCWlfc2l6ZSA9IGlfc2l6ZV9yZWFkKHZpKTsKKwlpZiAodW5saWtlbHkoYXR0cl9sZW4gPiBpX3NpemUpKSB7CisJCWF0dHJfbGVuID0gaV9zaXplOworCQlhLT5kYXRhLnJlc2lkZW50LnZhbHVlX2xlbmd0aCA9IGNwdV90b19sZTMyKGF0dHJfbGVuKTsKKwl9CisJLyogSWYgd2UgZG8gbm90IG5lZWQgdG8gcmVzaXplIHRoZSBhdHRyaWJ1dGUgYWxsb2NhdGlvbiB3ZSBhcmUgZG9uZS4gKi8KKwlpZiAobmV3X3NpemUgPD0gYXR0cl9sZW4pCisJCWdvdG8gZG9uZV91bm07CiAJLyogQ2hlY2sgaWYgbmV3IHNpemUgaXMgYWxsb3dlZCBpbiAkQXR0ckRlZi4gKi8KIAllcnIgPSBudGZzX2F0dHJfc2l6ZV9ib3VuZHNfY2hlY2sodm9sLCBuaS0+dHlwZSwgbmV3X3NpemUpOwogCWlmICh1bmxpa2VseShlcnIpKSB7CkBAIC0xOTYyLDYgKzIwMTEsNyBAQAogCX0KIAlmbHVzaF9kY2FjaGVfbWZ0X3JlY29yZF9wYWdlKGN0eC0+bnRmc19pbm8pOwogCW1hcmtfbWZ0X3JlY29yZF9kaXJ0eShjdHgtPm50ZnNfaW5vKTsKK2RvbmVfdW5tOgogCW50ZnNfYXR0cl9wdXRfc2VhcmNoX2N0eChjdHgpOwogCXVubWFwX21mdF9yZWNvcmQoYmFzZV9uaSk7CiAJLyoKQEAgLTIwNDcsNyArMjA5Nyw3IEBACiAJICogbm93IHdlIGtub3cgbnRmc19wcmVwYXJlX3dyaXRlKCkgd291bGQgaGF2ZSBmYWlsZWQgaW4gdGhlIHdyaXRlCiAJICogZXhjZWVkcyBpX3NpemUgY2FzZSwgc28gdGhpcyB3aWxsIG5ldmVyIHRyaWdnZXIgd2hpY2ggaXMgZmluZS4KIAkgKi8KLQlpZiAocG9zID4gdmktPmlfc2l6ZSkgeworCWlmIChwb3MgPiBpX3NpemVfcmVhZCh2aSkpIHsKIAkJbnRmc19lcnJvcih2aS0+aV9zYiwgIldyaXRpbmcgYmV5b25kIHRoZSBleGlzdGluZyBmaWxlIHNpemUgaXMgIgogCQkJCSJub3Qgc3VwcG9ydGVkIHlldC4gIFNvcnJ5LiIpOwogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CkBAIC0yMTgzLDkgKzIyMzMsMTMgQEAKIAl9CiAJa3VubWFwX2F0b21pYyhrYWRkciwgS01fVVNFUjApOwogCS8qIFVwZGF0ZSBpX3NpemUgaWYgbmVjZXNzYXJ5LiAqLwotCWlmICh2aS0+aV9zaXplIDwgYXR0cl9sZW4pIHsKKwlpZiAoaV9zaXplX3JlYWQodmkpIDwgYXR0cl9sZW4pIHsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCQl3cml0ZV9sb2NrX2lycXNhdmUoJm5pLT5zaXplX2xvY2ssIGZsYWdzKTsKIAkJbmktPmFsbG9jYXRlZF9zaXplID0gbmktPmluaXRpYWxpemVkX3NpemUgPSBhdHRyX2xlbjsKIAkJaV9zaXplX3dyaXRlKHZpLCBhdHRyX2xlbik7CisJCXdyaXRlX3VubG9ja19pcnFyZXN0b3JlKCZuaS0+c2l6ZV9sb2NrLCBmbGFncyk7CiAJfQogCS8qIE1hcmsgdGhlIG1mdCByZWNvcmQgZGlydHksIHNvIGl0IGdldHMgd3JpdHRlbiBiYWNrLiAqLwogCWZsdXNoX2RjYWNoZV9tZnRfcmVjb3JkX3BhZ2UoY3R4LT5udGZzX2lubyk7CmRpZmYgLS1naXQgYS9mcy9udGZzL2F0dHJpYi5jIGIvZnMvbnRmcy9hdHRyaWIuYwppbmRleCAxZmY3ZjkwLi5jZDBmOWU3IDEwMDY0NAotLS0gYS9mcy9udGZzL2F0dHJpYi5jCisrKyBiL2ZzL250ZnMvYXR0cmliLmMKQEAgLTEsNyArMSw3IEBACiAvKioKICAqIGF0dHJpYi5jIC0gTlRGUyBhdHRyaWJ1dGUgb3BlcmF0aW9ucy4gIFBhcnQgb2YgdGhlIExpbnV4LU5URlMgcHJvamVjdC4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNCBBbnRvbiBBbHRhcGFybWFrb3YKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA1IEFudG9uIEFsdGFwYXJtYWtvdgogICogQ29weXJpZ2h0IChjKSAyMDAyIFJpY2hhcmQgUnVzc29uCiAgKgogICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKQEAgLTIxLDg4ICsyMSwyMTcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zd2FwLmg+CiAKICNpbmNsdWRlICJhdHRyaWIuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogI2luY2x1ZGUgImxheW91dC5oIgorI2luY2x1ZGUgImxjbmFsbG9jLmgiCisjaW5jbHVkZSAibWFsbG9jLmgiCiAjaW5jbHVkZSAibWZ0LmgiCiAjaW5jbHVkZSAibnRmcy5oIgogI2luY2x1ZGUgInR5cGVzLmgiCiAKIC8qKgorICogbnRmc19tYXBfcnVubGlzdF9ub2xvY2sgLSBtYXAgKGEgcGFydCBvZikgYSBydW5saXN0IG9mIGFuIG50ZnMgaW5vZGUKKyAqIEBuaToJCW50ZnMgaW5vZGUgZm9yIHdoaWNoIHRvIG1hcCAocGFydCBvZikgYSBydW5saXN0CisgKiBAdmNuOgltYXAgcnVubGlzdCBwYXJ0IGNvbnRhaW5pbmcgdGhpcyB2Y24KKyAqCisgKiBNYXAgdGhlIHBhcnQgb2YgYSBydW5saXN0IGNvbnRhaW5pbmcgdGhlIEB2Y24gb2YgdGhlIG50ZnMgaW5vZGUgQG5pLgorICoKKyAqIFJldHVybiAwIG9uIHN1Y2Nlc3MgYW5kIC1lcnJubyBvbiBlcnJvci4gIFRoZXJlIGlzIG9uZSBzcGVjaWFsIGVycm9yIGNvZGUKKyAqIHdoaWNoIGlzIG5vdCBhbiBlcnJvciBhcyBzdWNoLiAgVGhpcyBpcyAtRU5PRU5ULiAgSXQgbWVhbnMgdGhhdCBAdmNuIGlzIG91dAorICogb2YgYm91bmRzIG9mIHRoZSBydW5saXN0LgorICoKKyAqIExvY2tpbmc6IC0gVGhlIHJ1bmxpc3QgbXVzdCBiZSBsb2NrZWQgZm9yIHdyaXRpbmcuCisgKgkgICAgLSBUaGlzIGZ1bmN0aW9uIG1vZGlmaWVzIHRoZSBydW5saXN0LgorICovCitpbnQgbnRmc19tYXBfcnVubGlzdF9ub2xvY2sobnRmc19pbm9kZSAqbmksIFZDTiB2Y24pCit7CisJVkNOIGVuZF92Y247CisJbnRmc19pbm9kZSAqYmFzZV9uaTsKKwlNRlRfUkVDT1JEICptOworCUFUVFJfUkVDT1JEICphOworCW50ZnNfYXR0cl9zZWFyY2hfY3R4ICpjdHg7CisJcnVubGlzdF9lbGVtZW50ICpybDsKKwlpbnQgZXJyID0gMDsKKworCW50ZnNfZGVidWcoIk1hcHBpbmcgcnVubGlzdCBwYXJ0IGNvbnRhaW5pbmcgdmNuIDB4JWxseC4iLAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyl2Y24pOworCWlmICghTklub0F0dHIobmkpKQorCQliYXNlX25pID0gbmk7CisJZWxzZQorCQliYXNlX25pID0gbmktPmV4dC5iYXNlX250ZnNfaW5vOworCW0gPSBtYXBfbWZ0X3JlY29yZChiYXNlX25pKTsKKwlpZiAoSVNfRVJSKG0pKQorCQlyZXR1cm4gUFRSX0VSUihtKTsKKwljdHggPSBudGZzX2F0dHJfZ2V0X3NlYXJjaF9jdHgoYmFzZV9uaSwgbSk7CisJaWYgKHVubGlrZWx5KCFjdHgpKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX291dDsKKwl9CisJZXJyID0gbnRmc19hdHRyX2xvb2t1cChuaS0+dHlwZSwgbmktPm5hbWUsIG5pLT5uYW1lX2xlbiwKKwkJCUNBU0VfU0VOU0lUSVZFLCB2Y24sIE5VTEwsIDAsIGN0eCk7CisJaWYgKHVubGlrZWx5KGVycikpIHsKKwkJaWYgKGVyciA9PSAtRU5PRU5UKQorCQkJZXJyID0gLUVJTzsKKwkJZ290byBlcnJfb3V0OworCX0KKwlhID0gY3R4LT5hdHRyOworCS8qCisJICogT25seSBkZWNvbXByZXNzIHRoZSBtYXBwaW5nIHBhaXJzIGlmIEB2Y24gaXMgaW5zaWRlIGl0LiAgT3RoZXJ3aXNlCisJICogd2UgZ2V0IGludG8gcHJvYmxlbXMgd2hlbiB3ZSB0cnkgdG8gbWFwIGFuIG91dCBvZiBib3VuZHMgdmNuIGJlY2F1c2UKKwkgKiB3ZSB0aGVuIHRyeSB0byBtYXAgdGhlIGFscmVhZHkgbWFwcGVkIHJ1bmxpc3QgZnJhZ21lbnQgYW5kCisJICogbnRmc19tYXBwaW5nX3BhaXJzX2RlY29tcHJlc3MoKSBmYWlscy4KKwkgKi8KKwllbmRfdmNuID0gc2xlNjRfdG9fY3B1KGEtPmRhdGEubm9uX3Jlc2lkZW50LmhpZ2hlc3RfdmNuKSArIDE7CisJaWYgKHVubGlrZWx5KCFhLT5kYXRhLm5vbl9yZXNpZGVudC5sb3dlc3RfdmNuICYmIGVuZF92Y24gPD0gMSkpCisJCWVuZF92Y24gPSBuaS0+YWxsb2NhdGVkX3NpemUgPj4gbmktPnZvbC0+Y2x1c3Rlcl9zaXplX2JpdHM7CisJaWYgKHVubGlrZWx5KHZjbiA+PSBlbmRfdmNuKSkgeworCQllcnIgPSAtRU5PRU5UOworCQlnb3RvIGVycl9vdXQ7CisJfQorCXJsID0gbnRmc19tYXBwaW5nX3BhaXJzX2RlY29tcHJlc3MobmktPnZvbCwgYSwgbmktPnJ1bmxpc3QucmwpOworCWlmIChJU19FUlIocmwpKQorCQllcnIgPSBQVFJfRVJSKHJsKTsKKwllbHNlCisJCW5pLT5ydW5saXN0LnJsID0gcmw7CitlcnJfb3V0OgorCWlmIChsaWtlbHkoY3R4KSkKKwkJbnRmc19hdHRyX3B1dF9zZWFyY2hfY3R4KGN0eCk7CisJdW5tYXBfbWZ0X3JlY29yZChiYXNlX25pKTsKKwlyZXR1cm4gZXJyOworfQorCisvKioKICAqIG50ZnNfbWFwX3J1bmxpc3QgLSBtYXAgKGEgcGFydCBvZikgYSBydW5saXN0IG9mIGFuIG50ZnMgaW5vZGUKICAqIEBuaToJCW50ZnMgaW5vZGUgZm9yIHdoaWNoIHRvIG1hcCAocGFydCBvZikgYSBydW5saXN0CiAgKiBAdmNuOgltYXAgcnVubGlzdCBwYXJ0IGNvbnRhaW5pbmcgdGhpcyB2Y24KICAqCiAgKiBNYXAgdGhlIHBhcnQgb2YgYSBydW5saXN0IGNvbnRhaW5pbmcgdGhlIEB2Y24gb2YgdGhlIG50ZnMgaW5vZGUgQG5pLgogICoKLSAqIFJldHVybiAwIG9uIHN1Y2Nlc3MgYW5kIC1lcnJubyBvbiBlcnJvci4KKyAqIFJldHVybiAwIG9uIHN1Y2Nlc3MgYW5kIC1lcnJubyBvbiBlcnJvci4gIFRoZXJlIGlzIG9uZSBzcGVjaWFsIGVycm9yIGNvZGUKKyAqIHdoaWNoIGlzIG5vdCBhbiBlcnJvciBhcyBzdWNoLiAgVGhpcyBpcyAtRU5PRU5ULiAgSXQgbWVhbnMgdGhhdCBAdmNuIGlzIG91dAorICogb2YgYm91bmRzIG9mIHRoZSBydW5saXN0LgogICoKICAqIExvY2tpbmc6IC0gVGhlIHJ1bmxpc3QgbXVzdCBiZSB1bmxvY2tlZCBvbiBlbnRyeSBhbmQgaXMgdW5sb2NrZWQgb24gcmV0dXJuLgotICoJICAgIC0gVGhpcyBmdW5jdGlvbiB0YWtlcyB0aGUgbG9jayBmb3Igd3JpdGluZyBhbmQgbW9kaWZpZXMgdGhlIHJ1bmxpc3QuCisgKgkgICAgLSBUaGlzIGZ1bmN0aW9uIHRha2VzIHRoZSBydW5saXN0IGxvY2sgZm9yIHdyaXRpbmcgYW5kIG1vZGlmaWVzIHRoZQorICoJICAgICAgcnVubGlzdC4KICAqLwogaW50IG50ZnNfbWFwX3J1bmxpc3QobnRmc19pbm9kZSAqbmksIFZDTiB2Y24pCiB7Ci0JbnRmc19pbm9kZSAqYmFzZV9uaTsKLQludGZzX2F0dHJfc2VhcmNoX2N0eCAqY3R4OwotCU1GVF9SRUNPUkQgKm1yZWM7CiAJaW50IGVyciA9IDA7CiAKLQludGZzX2RlYnVnKCJNYXBwaW5nIHJ1bmxpc3QgcGFydCBjb250YWluaW5nIHZjbiAweCVsbHguIiwKLQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpdmNuKTsKLQotCWlmICghTklub0F0dHIobmkpKQotCQliYXNlX25pID0gbmk7Ci0JZWxzZQotCQliYXNlX25pID0gbmktPmV4dC5iYXNlX250ZnNfaW5vOwotCi0JbXJlYyA9IG1hcF9tZnRfcmVjb3JkKGJhc2VfbmkpOwotCWlmIChJU19FUlIobXJlYykpCi0JCXJldHVybiBQVFJfRVJSKG1yZWMpOwotCWN0eCA9IG50ZnNfYXR0cl9nZXRfc2VhcmNoX2N0eChiYXNlX25pLCBtcmVjKTsKLQlpZiAodW5saWtlbHkoIWN0eCkpIHsKLQkJZXJyID0gLUVOT01FTTsKLQkJZ290byBlcnJfb3V0OwotCX0KLQllcnIgPSBudGZzX2F0dHJfbG9va3VwKG5pLT50eXBlLCBuaS0+bmFtZSwgbmktPm5hbWVfbGVuLAotCQkJQ0FTRV9TRU5TSVRJVkUsIHZjbiwgTlVMTCwgMCwgY3R4KTsKLQlpZiAodW5saWtlbHkoZXJyKSkKLQkJZ290byBwdXRfZXJyX291dDsKLQogCWRvd25fd3JpdGUoJm5pLT5ydW5saXN0LmxvY2spOwogCS8qIE1ha2Ugc3VyZSBzb21lb25lIGVsc2UgZGlkbid0IGRvIHRoZSB3b3JrIHdoaWxlIHdlIHdlcmUgc2xlZXBpbmcuICovCiAJaWYgKGxpa2VseShudGZzX3JsX3Zjbl90b19sY24obmktPnJ1bmxpc3QucmwsIHZjbikgPD0KLQkJCUxDTl9STF9OT1RfTUFQUEVEKSkgewotCQlydW5saXN0X2VsZW1lbnQgKnJsOwotCi0JCXJsID0gbnRmc19tYXBwaW5nX3BhaXJzX2RlY29tcHJlc3MobmktPnZvbCwgY3R4LT5hdHRyLAotCQkJCW5pLT5ydW5saXN0LnJsKTsKLQkJaWYgKElTX0VSUihybCkpCi0JCQllcnIgPSBQVFJfRVJSKHJsKTsKLQkJZWxzZQotCQkJbmktPnJ1bmxpc3QucmwgPSBybDsKLQl9CisJCQlMQ05fUkxfTk9UX01BUFBFRCkpCisJCWVyciA9IG50ZnNfbWFwX3J1bmxpc3Rfbm9sb2NrKG5pLCB2Y24pOwogCXVwX3dyaXRlKCZuaS0+cnVubGlzdC5sb2NrKTsKLQotcHV0X2Vycl9vdXQ6Ci0JbnRmc19hdHRyX3B1dF9zZWFyY2hfY3R4KGN0eCk7Ci1lcnJfb3V0OgotCXVubWFwX21mdF9yZWNvcmQoYmFzZV9uaSk7CiAJcmV0dXJuIGVycjsKIH0KIAogLyoqCi0gKiBudGZzX2ZpbmRfdmNuIC0gZmluZCBhIHZjbiBpbiB0aGUgcnVubGlzdCBkZXNjcmliZWQgYnkgYW4gbnRmcyBpbm9kZQotICogQG5pOgkJbnRmcyBpbm9kZSBkZXNjcmliaW5nIHRoZSBydW5saXN0IHRvIHNlYXJjaAotICogQHZjbjoJdmNuIHRvIGZpbmQKLSAqIEBuZWVkX3dyaXRlOglpZiBmYWxzZSwgbG9jayBmb3IgcmVhZGluZyBhbmQgaWYgdHJ1ZSwgbG9jayBmb3Igd3JpdGluZworICogbnRmc19hdHRyX3Zjbl90b19sY25fbm9sb2NrIC0gY29udmVydCBhIHZjbiBpbnRvIGEgbGNuIGdpdmVuIGFuIG50ZnMgaW5vZGUKKyAqIEBuaToJCQludGZzIGlub2RlIG9mIHRoZSBhdHRyaWJ1dGUgd2hvc2UgcnVubGlzdCB0byBzZWFyY2gKKyAqIEB2Y246CQl2Y24gdG8gY29udmVydAorICogQHdyaXRlX2xvY2tlZDoJdHJ1ZSBpZiB0aGUgcnVubGlzdCBpcyBsb2NrZWQgZm9yIHdyaXRpbmcKKyAqCisgKiBGaW5kIHRoZSB2aXJ0dWFsIGNsdXN0ZXIgbnVtYmVyIEB2Y24gaW4gdGhlIHJ1bmxpc3Qgb2YgdGhlIG50ZnMgYXR0cmlidXRlCisgKiBkZXNjcmliZWQgYnkgdGhlIG50ZnMgaW5vZGUgQG5pIGFuZCByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgbG9naWNhbCBjbHVzdGVyCisgKiBudW1iZXIgKGxjbikuCisgKgorICogSWYgdGhlIEB2Y24gaXMgbm90IG1hcHBlZCB5ZXQsIHRoZSBhdHRlbXB0IGlzIG1hZGUgdG8gbWFwIHRoZSBhdHRyaWJ1dGUKKyAqIGV4dGVudCBjb250YWluaW5nIHRoZSBAdmNuIGFuZCB0aGUgdmNuIHRvIGxjbiBjb252ZXJzaW9uIGlzIHJldHJpZWQuCisgKgorICogSWYgQHdyaXRlX2xvY2tlZCBpcyB0cnVlIHRoZSBjYWxsZXIgaGFzIGxvY2tlZCB0aGUgcnVubGlzdCBmb3Igd3JpdGluZyBhbmQKKyAqIGlmIGZhbHNlIGZvciByZWFkaW5nLgorICoKKyAqIFNpbmNlIGxjbnMgbXVzdCBiZSA+PSAwLCB3ZSB1c2UgbmVnYXRpdmUgcmV0dXJuIGNvZGVzIHdpdGggc3BlY2lhbCBtZWFuaW5nOgorICoKKyAqIFJldHVybiBjb2RlCU1lYW5pbmcgLyBEZXNjcmlwdGlvbgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiAgTENOX0hPTEUJSG9sZSAvIG5vdCBhbGxvY2F0ZWQgb24gZGlzay4KKyAqICBMQ05fRU5PRU5UCVRoZXJlIGlzIG5vIHN1Y2ggdmNuIGluIHRoZSBydW5saXN0LCBpLmUuIEB2Y24gaXMgb3V0IG9mIGJvdW5kcy4KKyAqICBMQ05fRU5PTUVNCU5vdCBlbm91Z2ggbWVtb3J5IHRvIG1hcCBydW5saXN0LgorICogIExDTl9FSU8JQ3JpdGljYWwgZXJyb3IgKHJ1bmxpc3QvZmlsZSBpcyBjb3JydXB0LCBpL28gZXJyb3IsIGV0YykuCisgKgorICogTG9ja2luZzogLSBUaGUgcnVubGlzdCBtdXN0IGJlIGxvY2tlZCBvbiBlbnRyeSBhbmQgaXMgbGVmdCBsb2NrZWQgb24gcmV0dXJuLgorICoJICAgIC0gSWYgQHdyaXRlX2xvY2tlZCBpcyBGQUxTRSwgaS5lLiB0aGUgcnVubGlzdCBpcyBsb2NrZWQgZm9yIHJlYWRpbmcsCisgKgkgICAgICB0aGUgbG9jayBtYXkgYmUgZHJvcHBlZCBpbnNpZGUgdGhlIGZ1bmN0aW9uIHNvIHlvdSBjYW5ub3QgcmVseSBvbgorICoJICAgICAgdGhlIHJ1bmxpc3Qgc3RpbGwgYmVpbmcgdGhlIHNhbWUgd2hlbiB0aGlzIGZ1bmN0aW9uIHJldHVybnMuCisgKi8KK0xDTiBudGZzX2F0dHJfdmNuX3RvX2xjbl9ub2xvY2sobnRmc19pbm9kZSAqbmksIGNvbnN0IFZDTiB2Y24sCisJCWNvbnN0IEJPT0wgd3JpdGVfbG9ja2VkKQoreworCUxDTiBsY247CisJQk9PTCBpc19yZXRyeSA9IEZBTFNFOworCisJbnRmc19kZWJ1ZygiRW50ZXJpbmcgZm9yIGlfaW5vIDB4JWx4LCB2Y24gMHglbGx4LCAlc19sb2NrZWQuIiwKKwkJCW5pLT5tZnRfbm8sICh1bnNpZ25lZCBsb25nIGxvbmcpdmNuLAorCQkJd3JpdGVfbG9ja2VkID8gIndyaXRlIiA6ICJyZWFkIik7CisJQlVHX09OKCFuaSk7CisJQlVHX09OKCFOSW5vTm9uUmVzaWRlbnQobmkpKTsKKwlCVUdfT04odmNuIDwgMCk7CityZXRyeV9yZW1hcDoKKwkvKiBDb252ZXJ0IHZjbiB0byBsY24uICBJZiB0aGF0IGZhaWxzIG1hcCB0aGUgcnVubGlzdCBhbmQgcmV0cnkgb25jZS4gKi8KKwlsY24gPSBudGZzX3JsX3Zjbl90b19sY24obmktPnJ1bmxpc3QucmwsIHZjbik7CisJaWYgKGxpa2VseShsY24gPj0gTENOX0hPTEUpKSB7CisJCW50ZnNfZGVidWcoIkRvbmUsIGxjbiAweCVsbHguIiwgKGxvbmcgbG9uZylsY24pOworCQlyZXR1cm4gbGNuOworCX0KKwlpZiAobGNuICE9IExDTl9STF9OT1RfTUFQUEVEKSB7CisJCWlmIChsY24gIT0gTENOX0VOT0VOVCkKKwkJCWxjbiA9IExDTl9FSU87CisJfSBlbHNlIGlmICghaXNfcmV0cnkpIHsKKwkJaW50IGVycjsKKworCQlpZiAoIXdyaXRlX2xvY2tlZCkgeworCQkJdXBfcmVhZCgmbmktPnJ1bmxpc3QubG9jayk7CisJCQlkb3duX3dyaXRlKCZuaS0+cnVubGlzdC5sb2NrKTsKKwkJCWlmICh1bmxpa2VseShudGZzX3JsX3Zjbl90b19sY24obmktPnJ1bmxpc3QucmwsIHZjbikgIT0KKwkJCQkJTENOX1JMX05PVF9NQVBQRUQpKSB7CisJCQkJdXBfd3JpdGUoJm5pLT5ydW5saXN0LmxvY2spOworCQkJCWRvd25fcmVhZCgmbmktPnJ1bmxpc3QubG9jayk7CisJCQkJZ290byByZXRyeV9yZW1hcDsKKwkJCX0KKwkJfQorCQllcnIgPSBudGZzX21hcF9ydW5saXN0X25vbG9jayhuaSwgdmNuKTsKKwkJaWYgKCF3cml0ZV9sb2NrZWQpIHsKKwkJCXVwX3dyaXRlKCZuaS0+cnVubGlzdC5sb2NrKTsKKwkJCWRvd25fcmVhZCgmbmktPnJ1bmxpc3QubG9jayk7CisJCX0KKwkJaWYgKGxpa2VseSghZXJyKSkgeworCQkJaXNfcmV0cnkgPSBUUlVFOworCQkJZ290byByZXRyeV9yZW1hcDsKKwkJfQorCQlpZiAoZXJyID09IC1FTk9FTlQpCisJCQlsY24gPSBMQ05fRU5PRU5UOworCQllbHNlIGlmIChlcnIgPT0gLUVOT01FTSkKKwkJCWxjbiA9IExDTl9FTk9NRU07CisJCWVsc2UKKwkJCWxjbiA9IExDTl9FSU87CisJfQorCWlmIChsY24gIT0gTENOX0VOT0VOVCkKKwkJbnRmc19lcnJvcihuaS0+dm9sLT5zYiwgIkZhaWxlZCB3aXRoIGVycm9yIGNvZGUgJWxsaS4iLAorCQkJCShsb25nIGxvbmcpbGNuKTsKKwlyZXR1cm4gbGNuOworfQorCisvKioKKyAqIG50ZnNfYXR0cl9maW5kX3Zjbl9ub2xvY2sgLSBmaW5kIGEgdmNuIGluIHRoZSBydW5saXN0IG9mIGFuIG50ZnMgaW5vZGUKKyAqIEBuaToJCQludGZzIGlub2RlIGRlc2NyaWJpbmcgdGhlIHJ1bmxpc3QgdG8gc2VhcmNoCisgKiBAdmNuOgkJdmNuIHRvIGZpbmQKKyAqIEB3cml0ZV9sb2NrZWQ6CXRydWUgaWYgdGhlIHJ1bmxpc3QgaXMgbG9ja2VkIGZvciB3cml0aW5nCiAgKgogICogRmluZCB0aGUgdmlydHVhbCBjbHVzdGVyIG51bWJlciBAdmNuIGluIHRoZSBydW5saXN0IGRlc2NyaWJlZCBieSB0aGUgbnRmcwogICogaW5vZGUgQG5pIGFuZCByZXR1cm4gdGhlIGFkZHJlc3Mgb2YgdGhlIHJ1bmxpc3QgZWxlbWVudCBjb250YWluaW5nIHRoZSBAdmNuLgotICogVGhlIHJ1bmxpc3QgaXMgbGVmdCBsb2NrZWQgYW5kIHRoZSBjYWxsZXIgaGFzIHRvIHVubG9jayBpdC4gIElmIEBuZWVkX3dyaXRlCi0gKiBpcyB0cnVlLCB0aGUgcnVubGlzdCBpcyBsb2NrZWQgZm9yIHdyaXRpbmcgYW5kIGlmIEBuZWVkX3dyaXRlIGlzIGZhbHNlLCB0aGUKLSAqIHJ1bmxpc3QgaXMgbG9ja2VkIGZvciByZWFkaW5nLiAgSW4gdGhlIGVycm9yIGNhc2UsIHRoZSBydW5saXN0IGlzIG5vdCBsZWZ0Ci0gKiBsb2NrZWQuCisgKgorICogSWYgdGhlIEB2Y24gaXMgbm90IG1hcHBlZCB5ZXQsIHRoZSBhdHRlbXB0IGlzIG1hZGUgdG8gbWFwIHRoZSBhdHRyaWJ1dGUKKyAqIGV4dGVudCBjb250YWluaW5nIHRoZSBAdmNuIGFuZCB0aGUgdmNuIHRvIGxjbiBjb252ZXJzaW9uIGlzIHJldHJpZWQuCisgKgorICogSWYgQHdyaXRlX2xvY2tlZCBpcyB0cnVlIHRoZSBjYWxsZXIgaGFzIGxvY2tlZCB0aGUgcnVubGlzdCBmb3Igd3JpdGluZyBhbmQKKyAqIGlmIGZhbHNlIGZvciByZWFkaW5nLgogICoKICAqIE5vdGUgeW91IG5lZWQgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiB0aGUgbGNuIG9mIHRoZSByZXR1cm5lZCBydW5saXN0IGVsZW1lbnQKICAqIGJlaW5nID49IDAgYW5kIExDTl9IT0xFLiAgSW4gdGhlIGxhdGVyIGNhc2UgeW91IGhhdmUgdG8gcmV0dXJuIHplcm9lcyBvbgpAQCAtMTE4LDM0ICsyNDcsMjkgQEAKICAqCS1FTk9NRU0gLSBOb3QgZW5vdWdoIG1lbW9yeSB0byBtYXAgcnVubGlzdC4KICAqCS1FSU8JLSBDcml0aWNhbCBlcnJvciAocnVubGlzdC9maWxlIGlzIGNvcnJ1cHQsIGkvbyBlcnJvciwgZXRjKS4KICAqCi0gKiBMb2NraW5nOiAtIFRoZSBydW5saXN0IG11c3QgYmUgdW5sb2NrZWQgb24gZW50cnkuCi0gKgkgICAgLSBPbiBmYWlsaW5nIHJldHVybiwgdGhlIHJ1bmxpc3QgaXMgdW5sb2NrZWQuCi0gKgkgICAgLSBPbiBzdWNjZXNzZnVsIHJldHVybiwgdGhlIHJ1bmxpc3QgaXMgbG9ja2VkLiAgSWYgQG5lZWRfd3JpdGUgdXMKLSAqCSAgICAgIHRydWUsIGl0IGlzIGxvY2tlZCBmb3Igd3JpdGluZy4gIE90aGVyd2lzZSBpcyBpcyBsb2NrZWQgZm9yCi0gKgkgICAgICByZWFkaW5nLgorICogTG9ja2luZzogLSBUaGUgcnVubGlzdCBtdXN0IGJlIGxvY2tlZCBvbiBlbnRyeSBhbmQgaXMgbGVmdCBsb2NrZWQgb24gcmV0dXJuLgorICoJICAgIC0gSWYgQHdyaXRlX2xvY2tlZCBpcyBGQUxTRSwgaS5lLiB0aGUgcnVubGlzdCBpcyBsb2NrZWQgZm9yIHJlYWRpbmcsCisgKgkgICAgICB0aGUgbG9jayBtYXkgYmUgZHJvcHBlZCBpbnNpZGUgdGhlIGZ1bmN0aW9uIHNvIHlvdSBjYW5ub3QgcmVseSBvbgorICoJICAgICAgdGhlIHJ1bmxpc3Qgc3RpbGwgYmVpbmcgdGhlIHNhbWUgd2hlbiB0aGlzIGZ1bmN0aW9uIHJldHVybnMuCiAgKi8KLXJ1bmxpc3RfZWxlbWVudCAqbnRmc19maW5kX3ZjbihudGZzX2lub2RlICpuaSwgY29uc3QgVkNOIHZjbiwKLQkJY29uc3QgQk9PTCBuZWVkX3dyaXRlKQorcnVubGlzdF9lbGVtZW50ICpudGZzX2F0dHJfZmluZF92Y25fbm9sb2NrKG50ZnNfaW5vZGUgKm5pLCBjb25zdCBWQ04gdmNuLAorCQljb25zdCBCT09MIHdyaXRlX2xvY2tlZCkKIHsKIAlydW5saXN0X2VsZW1lbnQgKnJsOwogCWludCBlcnIgPSAwOwogCUJPT0wgaXNfcmV0cnkgPSBGQUxTRTsKIAotCW50ZnNfZGVidWcoIkVudGVyaW5nIGZvciBpX2lubyAweCVseCwgdmNuIDB4JWxseCwgbG9jayBmb3IgJXNpbmcuIiwKKwludGZzX2RlYnVnKCJFbnRlcmluZyBmb3IgaV9pbm8gMHglbHgsIHZjbiAweCVsbHgsICVzX2xvY2tlZC4iLAogCQkJbmktPm1mdF9ubywgKHVuc2lnbmVkIGxvbmcgbG9uZyl2Y24sCi0JCQkhbmVlZF93cml0ZSA/ICJyZWFkIiA6ICJ3cml0Iik7CisJCQl3cml0ZV9sb2NrZWQgPyAid3JpdGUiIDogInJlYWQiKTsKIAlCVUdfT04oIW5pKTsKIAlCVUdfT04oIU5Jbm9Ob25SZXNpZGVudChuaSkpOwogCUJVR19PTih2Y24gPCAwKTsKLWxvY2tfcmV0cnlfcmVtYXA6Ci0JaWYgKCFuZWVkX3dyaXRlKQotCQlkb3duX3JlYWQoJm5pLT5ydW5saXN0LmxvY2spOwotCWVsc2UKLQkJZG93bl93cml0ZSgmbmktPnJ1bmxpc3QubG9jayk7CityZXRyeV9yZW1hcDoKIAlybCA9IG5pLT5ydW5saXN0LnJsOwogCWlmIChsaWtlbHkocmwgJiYgdmNuID49IHJsWzBdLnZjbikpIHsKIAkJd2hpbGUgKGxpa2VseShybC0+bGVuZ3RoKSkgewotCQkJaWYgKGxpa2VseSh2Y24gPCBybFsxXS52Y24pKSB7CisJCQlpZiAodW5saWtlbHkodmNuIDwgcmxbMV0udmNuKSkgewogCQkJCWlmIChsaWtlbHkocmwtPmxjbiA+PSBMQ05fSE9MRSkpIHsKIAkJCQkJbnRmc19kZWJ1ZygiRG9uZS4iKTsKIAkJCQkJcmV0dXJuIHJsOwpAQCAtMTYxLDMwICsyODUsNDEgQEAKIAkJCQllcnIgPSAtRUlPOwogCQl9CiAJfQotCWlmICghbmVlZF93cml0ZSkKLQkJdXBfcmVhZCgmbmktPnJ1bmxpc3QubG9jayk7Ci0JZWxzZQotCQl1cF93cml0ZSgmbmktPnJ1bmxpc3QubG9jayk7CiAJaWYgKCFlcnIgJiYgIWlzX3JldHJ5KSB7CiAJCS8qCiAJCSAqIFRoZSBAdmNuIGlzIGluIGFuIHVubWFwcGVkIHJlZ2lvbiwgbWFwIHRoZSBydW5saXN0IGFuZAogCQkgKiByZXRyeS4KIAkJICovCi0JCWVyciA9IG50ZnNfbWFwX3J1bmxpc3QobmksIHZjbik7CisJCWlmICghd3JpdGVfbG9ja2VkKSB7CisJCQl1cF9yZWFkKCZuaS0+cnVubGlzdC5sb2NrKTsKKwkJCWRvd25fd3JpdGUoJm5pLT5ydW5saXN0LmxvY2spOworCQkJaWYgKHVubGlrZWx5KG50ZnNfcmxfdmNuX3RvX2xjbihuaS0+cnVubGlzdC5ybCwgdmNuKSAhPQorCQkJCQlMQ05fUkxfTk9UX01BUFBFRCkpIHsKKwkJCQl1cF93cml0ZSgmbmktPnJ1bmxpc3QubG9jayk7CisJCQkJZG93bl9yZWFkKCZuaS0+cnVubGlzdC5sb2NrKTsKKwkJCQlnb3RvIHJldHJ5X3JlbWFwOworCQkJfQorCQl9CisJCWVyciA9IG50ZnNfbWFwX3J1bmxpc3Rfbm9sb2NrKG5pLCB2Y24pOworCQlpZiAoIXdyaXRlX2xvY2tlZCkgeworCQkJdXBfd3JpdGUoJm5pLT5ydW5saXN0LmxvY2spOworCQkJZG93bl9yZWFkKCZuaS0+cnVubGlzdC5sb2NrKTsKKwkJfQogCQlpZiAobGlrZWx5KCFlcnIpKSB7CiAJCQlpc19yZXRyeSA9IFRSVUU7Ci0JCQlnb3RvIGxvY2tfcmV0cnlfcmVtYXA7CisJCQlnb3RvIHJldHJ5X3JlbWFwOwogCQl9CiAJCS8qCi0JCSAqIC1FSU5WQUwgYW5kIC1FTk9FTlQgY29taW5nIGZyb20gYSBmYWlsZWQgbWFwcGluZyBhdHRlbXB0IGFyZQotCQkgKiBlcXVpdmFsZW50IHRvIGkvbyBlcnJvcnMgZm9yIHVzIGFzIHRoZXkgc2hvdWxkIG5vdCBoYXBwZW4gaW4KLQkJICogb3VyIGNvZGUgcGF0aHMuCisJCSAqIC1FSU5WQUwgY29taW5nIGZyb20gYSBmYWlsZWQgbWFwcGluZyBhdHRlbXB0IGlzIGVxdWl2YWxlbnQKKwkJICogdG8gaS9vIGVycm9yIGZvciB1cyBhcyBpdCBzaG91bGQgbm90IGhhcHBlbiBpbiBvdXIgY29kZQorCQkgKiBwYXRocy4KIAkJICovCi0JCWlmIChlcnIgPT0gLUVJTlZBTCB8fCBlcnIgPT0gLUVOT0VOVCkKKwkJaWYgKGVyciA9PSAtRUlOVkFMKQogCQkJZXJyID0gLUVJTzsKIAl9IGVsc2UgaWYgKCFlcnIpCiAJCWVyciA9IC1FSU87Ci0JbnRmc19lcnJvcihuaS0+dm9sLT5zYiwgIkZhaWxlZCB3aXRoIGVycm9yIGNvZGUgJWkuIiwgZXJyKTsKKwlpZiAoZXJyICE9IC1FTk9FTlQpCisJCW50ZnNfZXJyb3IobmktPnZvbC0+c2IsICJGYWlsZWQgd2l0aCBlcnJvciBjb2RlICVpLiIsIGVycik7CiAJcmV0dXJuIEVSUl9QVFIoZXJyKTsKIH0KIApAQCAtODcwLDE1ICsxMDA1LDE0IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgbnRmc19hdHRyX2luaXRfc2VhcmNoX2N0eChudGZzX2F0dHJfc2VhcmNoX2N0eCAqY3R4LAogCQludGZzX2lub2RlICpuaSwgTUZUX1JFQ09SRCAqbXJlYykKIHsKLQljdHgtPm1yZWMgPSBtcmVjOwotCS8qIFNhbml0eSBjaGVja3MgYXJlIHBlcmZvcm1lZCBlbHNld2hlcmUuICovCi0JY3R4LT5hdHRyID0gKEFUVFJfUkVDT1JEKikoKHU4KiltcmVjICsgbGUxNl90b19jcHUobXJlYy0+YXR0cnNfb2Zmc2V0KSk7Ci0JY3R4LT5pc19maXJzdCA9IFRSVUU7Ci0JY3R4LT5udGZzX2lubyA9IG5pOwotCWN0eC0+YWxfZW50cnkgPSBOVUxMOwotCWN0eC0+YmFzZV9udGZzX2lubyA9IE5VTEw7Ci0JY3R4LT5iYXNlX21yZWMgPSBOVUxMOwotCWN0eC0+YmFzZV9hdHRyID0gTlVMTDsKKwkqY3R4ID0gKG50ZnNfYXR0cl9zZWFyY2hfY3R4KSB7CisJCS5tcmVjID0gbXJlYywKKwkJLyogU2FuaXR5IGNoZWNrcyBhcmUgcGVyZm9ybWVkIGVsc2V3aGVyZS4gKi8KKwkJLmF0dHIgPSAoQVRUUl9SRUNPUkQqKSgodTgqKW1yZWMgKworCQkJCWxlMTZfdG9fY3B1KG1yZWMtPmF0dHJzX29mZnNldCkpLAorCQkuaXNfZmlyc3QgPSBUUlVFLAorCQkubnRmc19pbm8gPSBuaSwKKwl9OwogfQogCiAvKioKQEAgLTk0NSw2ICsxMDc5LDggQEAKIAlyZXR1cm47CiB9CiAKKyNpZmRlZiBOVEZTX1JXCisKIC8qKgogICogbnRmc19hdHRyX2ZpbmRfaW5fYXR0cmRlZiAtIGZpbmQgYW4gYXR0cmlidXRlIGluIHRoZSAkQXR0ckRlZiBzeXN0ZW0gZmlsZQogICogQHZvbDoJbnRmcyB2b2x1bWUgdG8gd2hpY2ggdGhlIGF0dHJpYnV0ZSBiZWxvbmdzCkBAIC0xMDI0LDI3ICsxMTYwLDIxIEBACiAgKiBDaGVjayB3aGV0aGVyIHRoZSBhdHRyaWJ1dGUgb2YgQHR5cGUgb24gdGhlIG50ZnMgdm9sdW1lIEB2b2wgaXMgYWxsb3dlZCB0bwogICogYmUgbm9uLXJlc2lkZW50LiAgVGhpcyBpbmZvcm1hdGlvbiBpcyBvYnRhaW5lZCBmcm9tICRBdHRyRGVmIHN5c3RlbSBmaWxlLgogICoKLSAqIFJldHVybiAwIGlmIHRoZSBhdHRyaWJ1dGUgaXMgYWxsb3dlZCB0byBiZSBub24tcmVzaWRlbnQsIC1FUEVSTSBpZiBub3QsIG9yCisgKiBSZXR1cm4gMCBpZiB0aGUgYXR0cmlidXRlIGlzIGFsbG93ZWQgdG8gYmUgbm9uLXJlc2lkZW50LCAtRVBFUk0gaWYgbm90LCBhbmQKICAqIC1FTk9FTlQgaWYgdGhlIGF0dHJpYnV0ZSBpcyBub3QgbGlzdGVkIGluICRBdHRyRGVmLgogICovCiBpbnQgbnRmc19hdHRyX2Nhbl9iZV9ub25fcmVzaWRlbnQoY29uc3QgbnRmc192b2x1bWUgKnZvbCwgY29uc3QgQVRUUl9UWVBFIHR5cGUpCiB7CiAJQVRUUl9ERUYgKmFkOwogCi0JLyoKLQkgKiAkREFUQSBpcyBhbHdheXMgYWxsb3dlZCB0byBiZSBub24tcmVzaWRlbnQgZXZlbiBpZiAkQXR0ckRlZiBkb2VzIG5vdAotCSAqIHNwZWNpZnkgdGhpcyBpbiB0aGUgZmxhZ3Mgb2YgdGhlICREQVRBIGF0dHJpYnV0ZSBkZWZpbml0aW9uIHJlY29yZC4KLQkgKi8KLQlpZiAodHlwZSA9PSBBVF9EQVRBKQotCQlyZXR1cm4gMDsKIAkvKiBGaW5kIHRoZSBhdHRyaWJ1dGUgZGVmaW5pdGlvbiByZWNvcmQgaW4gJEF0dHJEZWYuICovCiAJYWQgPSBudGZzX2F0dHJfZmluZF9pbl9hdHRyZGVmKHZvbCwgdHlwZSk7CiAJaWYgKHVubGlrZWx5KCFhZCkpCiAJCXJldHVybiAtRU5PRU5UOwogCS8qIENoZWNrIHRoZSBmbGFncyBhbmQgcmV0dXJuIHRoZSByZXN1bHQuICovCi0JaWYgKGFkLT5mbGFncyAmIENBTl9CRV9OT05fUkVTSURFTlQpCi0JCXJldHVybiAwOwotCXJldHVybiAtRVBFUk07CisJaWYgKGFkLT5mbGFncyAmIEFUVFJfREVGX1JFU0lERU5UKQorCQlyZXR1cm4gLUVQRVJNOworCXJldHVybiAwOwogfQogCiAvKioKQEAgLTEwNjcsOSArMTE5Nyw5IEBACiAgKi8KIGludCBudGZzX2F0dHJfY2FuX2JlX3Jlc2lkZW50KGNvbnN0IG50ZnNfdm9sdW1lICp2b2wsIGNvbnN0IEFUVFJfVFlQRSB0eXBlKQogewotCWlmICh0eXBlICE9IEFUX0lOREVYX0FMTE9DQVRJT04gJiYgdHlwZSAhPSBBVF9FQSkKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIC1FUEVSTTsKKwlpZiAodHlwZSA9PSBBVF9JTkRFWF9BTExPQ0FUSU9OIHx8IHR5cGUgPT0gQVRfRUEpCisJCXJldHVybiAtRVBFUk07CisJcmV0dXJuIDA7CiB9CiAKIC8qKgpAQCAtMTExNyw2ICsxMjQ3LDMyOCBAQAogfQogCiAvKioKKyAqIG50ZnNfYXR0cl9tYWtlX25vbl9yZXNpZGVudCAtIGNvbnZlcnQgYSByZXNpZGVudCB0byBhIG5vbi1yZXNpZGVudCBhdHRyaWJ1dGUKKyAqIEBuaToJCW50ZnMgaW5vZGUgZGVzY3JpYmluZyB0aGUgYXR0cmlidXRlIHRvIGNvbnZlcnQKKyAqCisgKiBDb252ZXJ0IHRoZSByZXNpZGVudCBudGZzIGF0dHJpYnV0ZSBkZXNjcmliZWQgYnkgdGhlIG50ZnMgaW5vZGUgQG5pIHRvIGEKKyAqIG5vbi1yZXNpZGVudCBvbmUuCisgKgorICogUmV0dXJuIDAgb24gc3VjY2VzcyBhbmQgLWVycm5vIG9uIGVycm9yLiAgVGhlIGZvbGxvd2luZyBlcnJvciByZXR1cm4gY29kZXMKKyAqIGFyZSBkZWZpbmVkOgorICoJLUVQRVJNCS0gVGhlIGF0dHJpYnV0ZSBpcyBub3QgYWxsb3dlZCB0byBiZSBub24tcmVzaWRlbnQuCisgKgktRU5PTUVNCS0gTm90IGVub3VnaCBtZW1vcnkuCisgKgktRU5PU1BDCS0gTm90IGVub3VnaCBkaXNrIHNwYWNlLgorICoJLUVJTlZBTAktIEF0dHJpYnV0ZSBub3QgZGVmaW5lZCBvbiB0aGUgdm9sdW1lLgorICoJLUVJTwktIEkvbyBlcnJvciBvciBvdGhlciBlcnJvci4KKyAqIE5vdGUgdGhhdCAtRU5PU1BDIGlzIGFsc28gcmV0dXJuZWQgaW4gdGhlIGNhc2UgdGhhdCB0aGVyZSBpcyBub3QgZW5vdWdoCisgKiBzcGFjZSBpbiB0aGUgbWZ0IHJlY29yZCB0byBkbyB0aGUgY29udmVyc2lvbi4gIFRoaXMgY2FuIGhhcHBlbiB3aGVuIHRoZSBtZnQKKyAqIHJlY29yZCBpcyBhbHJlYWR5IHZlcnkgZnVsbC4gIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIHRyeWluZyB0byBtYWtlCisgKiBzcGFjZSBpbiB0aGUgbWZ0IHJlY29yZCBhbmQgdHJ5aW5nIGFnYWluLiAgRklYTUU6IERvIHdlIG5lZWQgYSBzZXBhcmF0ZQorICogZXJyb3IgcmV0dXJuIGNvZGUgZm9yIHRoaXMga2luZCBvZiAtRU5PU1BDIG9yIGlzIGl0IGFsd2F5cyB3b3J0aCB0cnlpbmcKKyAqIGFnYWluIGluIGNhc2UgdGhlIGF0dHJpYnV0ZSBtYXkgdGhlbiBmaXQgaW4gYSByZXNpZGVudCBzdGF0ZSBzbyBubyBuZWVkIHRvCisgKiBtYWtlIGl0IG5vbi1yZXNpZGVudCBhdCBhbGw/ICBIby1odW0uLi4gIChBSUEpCisgKgorICogTk9URSB0byBzZWxmOiBObyBjaGFuZ2VzIGluIHRoZSBhdHRyaWJ1dGUgbGlzdCBhcmUgcmVxdWlyZWQgdG8gbW92ZSBmcm9tCisgKgkJIGEgcmVzaWRlbnQgdG8gYSBub24tcmVzaWRlbnQgYXR0cmlidXRlLgorICoKKyAqIExvY2tpbmc6IC0gVGhlIGNhbGxlciBtdXN0IGhvbGQgaV9zZW0gb24gdGhlIGlub2RlLgorICovCitpbnQgbnRmc19hdHRyX21ha2Vfbm9uX3Jlc2lkZW50KG50ZnNfaW5vZGUgKm5pKQoreworCXM2NCBuZXdfc2l6ZTsKKwlzdHJ1Y3QgaW5vZGUgKnZpID0gVkZTX0kobmkpOworCW50ZnNfdm9sdW1lICp2b2wgPSBuaS0+dm9sOworCW50ZnNfaW5vZGUgKmJhc2Vfbmk7CisJTUZUX1JFQ09SRCAqbTsKKwlBVFRSX1JFQ09SRCAqYTsKKwludGZzX2F0dHJfc2VhcmNoX2N0eCAqY3R4OworCXN0cnVjdCBwYWdlICpwYWdlOworCXJ1bmxpc3RfZWxlbWVudCAqcmw7CisJdTggKmthZGRyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IG1wX3NpemUsIG1wX29mcywgbmFtZV9vZnMsIGFyZWNfc2l6ZSwgZXJyLCBlcnIyOworCXUzMiBhdHRyX3NpemU7CisJdTggb2xkX3Jlc19hdHRyX2ZsYWdzOworCisJLyogQ2hlY2sgdGhhdCB0aGUgYXR0cmlidXRlIGlzIGFsbG93ZWQgdG8gYmUgbm9uLXJlc2lkZW50LiAqLworCWVyciA9IG50ZnNfYXR0cl9jYW5fYmVfbm9uX3Jlc2lkZW50KHZvbCwgbmktPnR5cGUpOworCWlmICh1bmxpa2VseShlcnIpKSB7CisJCWlmIChlcnIgPT0gLUVQRVJNKQorCQkJbnRmc19kZWJ1ZygiQXR0cmlidXRlIGlzIG5vdCBhbGxvd2VkIHRvIGJlICIKKwkJCQkJIm5vbi1yZXNpZGVudC4iKTsKKwkJZWxzZQorCQkJbnRmc19kZWJ1ZygiQXR0cmlidXRlIG5vdCBkZWZpbmVkIG9uIHRoZSBOVEZTICIKKwkJCQkJInZvbHVtZSEiKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJLyoKKwkgKiBUaGUgc2l6ZSBuZWVkcyB0byBiZSBhbGlnbmVkIHRvIGEgY2x1c3RlciBib3VuZGFyeSBmb3IgYWxsb2NhdGlvbgorCSAqIHB1cnBvc2VzLgorCSAqLworCW5ld19zaXplID0gKGlfc2l6ZV9yZWFkKHZpKSArIHZvbC0+Y2x1c3Rlcl9zaXplIC0gMSkgJgorCQkJfih2b2wtPmNsdXN0ZXJfc2l6ZSAtIDEpOworCWlmIChuZXdfc2l6ZSA+IDApIHsKKwkJcnVubGlzdF9lbGVtZW50ICpybDI7CisKKwkJLyoKKwkJICogV2lsbCBuZWVkIHRoZSBwYWdlIGxhdGVyIGFuZCBzaW5jZSB0aGUgcGFnZSBsb2NrIG5lc3RzCisJCSAqIG91dHNpZGUgYWxsIG50ZnMgbG9ja3MsIHdlIG5lZWQgdG8gZ2V0IHRoZSBwYWdlIG5vdy4KKwkJICovCisJCXBhZ2UgPSBmaW5kX29yX2NyZWF0ZV9wYWdlKHZpLT5pX21hcHBpbmcsIDAsCisJCQkJbWFwcGluZ19nZnBfbWFzayh2aS0+aV9tYXBwaW5nKSk7CisJCWlmICh1bmxpa2VseSghcGFnZSkpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJLyogU3RhcnQgYnkgYWxsb2NhdGluZyBjbHVzdGVycyB0byBob2xkIHRoZSBhdHRyaWJ1dGUgdmFsdWUuICovCisJCXJsID0gbnRmc19jbHVzdGVyX2FsbG9jKHZvbCwgMCwgbmV3X3NpemUgPj4KKwkJCQl2b2wtPmNsdXN0ZXJfc2l6ZV9iaXRzLCAtMSwgREFUQV9aT05FKTsKKwkJaWYgKElTX0VSUihybCkpIHsKKwkJCWVyciA9IFBUUl9FUlIocmwpOworCQkJbnRmc19kZWJ1ZygiRmFpbGVkIHRvIGFsbG9jYXRlIGNsdXN0ZXIlcywgZXJyb3IgY29kZSAiCisJCQkJCSIlaS4iLCAobmV3X3NpemUgPj4KKwkJCQkJdm9sLT5jbHVzdGVyX3NpemVfYml0cykgPiAxID8gInMiIDogIiIsCisJCQkJCWVycik7CisJCQlnb3RvIHBhZ2VfZXJyX291dDsKKwkJfQorCQkvKiBDaGFuZ2UgdGhlIHJ1bmxpc3QgdGVybWluYXRvciB0byBMQ05fRU5PRU5ULiAqLworCQlybDIgPSBybDsKKwkJd2hpbGUgKHJsMi0+bGVuZ3RoKQorCQkJcmwyKys7CisJCUJVR19PTihybDItPmxjbiAhPSBMQ05fUkxfTk9UX01BUFBFRCk7CisJCXJsMi0+bGNuID0gTENOX0VOT0VOVDsKKwl9IGVsc2UgeworCQlybCA9IE5VTEw7CisJCXBhZ2UgPSBOVUxMOworCX0KKwkvKiBEZXRlcm1pbmUgdGhlIHNpemUgb2YgdGhlIG1hcHBpbmcgcGFpcnMgYXJyYXkuICovCisJbXBfc2l6ZSA9IG50ZnNfZ2V0X3NpemVfZm9yX21hcHBpbmdfcGFpcnModm9sLCBybCwgMCwgLTEpOworCWlmICh1bmxpa2VseShtcF9zaXplIDwgMCkpIHsKKwkJZXJyID0gbXBfc2l6ZTsKKwkJbnRmc19kZWJ1ZygiRmFpbGVkIHRvIGdldCBzaXplIGZvciBtYXBwaW5nIHBhaXJzIGFycmF5LCBlcnJvciAiCisJCQkJImNvZGUgJWkuIiwgZXJyKTsKKwkJZ290byBybF9lcnJfb3V0OworCX0KKwlkb3duX3dyaXRlKCZuaS0+cnVubGlzdC5sb2NrKTsKKwlpZiAoIU5Jbm9BdHRyKG5pKSkKKwkJYmFzZV9uaSA9IG5pOworCWVsc2UKKwkJYmFzZV9uaSA9IG5pLT5leHQuYmFzZV9udGZzX2lubzsKKwltID0gbWFwX21mdF9yZWNvcmQoYmFzZV9uaSk7CisJaWYgKElTX0VSUihtKSkgeworCQllcnIgPSBQVFJfRVJSKG0pOworCQltID0gTlVMTDsKKwkJY3R4ID0gTlVMTDsKKwkJZ290byBlcnJfb3V0OworCX0KKwljdHggPSBudGZzX2F0dHJfZ2V0X3NlYXJjaF9jdHgoYmFzZV9uaSwgbSk7CisJaWYgKHVubGlrZWx5KCFjdHgpKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX291dDsKKwl9CisJZXJyID0gbnRmc19hdHRyX2xvb2t1cChuaS0+dHlwZSwgbmktPm5hbWUsIG5pLT5uYW1lX2xlbiwKKwkJCUNBU0VfU0VOU0lUSVZFLCAwLCBOVUxMLCAwLCBjdHgpOworCWlmICh1bmxpa2VseShlcnIpKSB7CisJCWlmIChlcnIgPT0gLUVOT0VOVCkKKwkJCWVyciA9IC1FSU87CisJCWdvdG8gZXJyX291dDsKKwl9CisJbSA9IGN0eC0+bXJlYzsKKwlhID0gY3R4LT5hdHRyOworCUJVR19PTihOSW5vTm9uUmVzaWRlbnQobmkpKTsKKwlCVUdfT04oYS0+bm9uX3Jlc2lkZW50KTsKKwkvKgorCSAqIENhbGN1bGF0ZSBuZXcgb2Zmc2V0cyBmb3IgdGhlIG5hbWUgYW5kIHRoZSBtYXBwaW5nIHBhaXJzIGFycmF5LgorCSAqIFdlIGFzc3VtZSB0aGUgYXR0cmlidXRlIGlzIG5vdCBjb21wcmVzc2VkIG9yIHNwYXJzZS4KKwkgKi8KKwluYW1lX29mcyA9IChvZmZzZXRvZihBVFRSX1JFQywKKwkJCWRhdGEubm9uX3Jlc2lkZW50LmNvbXByZXNzZWRfc2l6ZSkgKyA3KSAmIH43OworCW1wX29mcyA9IChuYW1lX29mcyArIGEtPm5hbWVfbGVuZ3RoICogc2l6ZW9mKG50ZnNjaGFyKSArIDcpICYgfjc7CisJLyoKKwkgKiBEZXRlcm1pbmUgdGhlIHNpemUgb2YgdGhlIHJlc2lkZW50IHBhcnQgb2YgdGhlIG5vdyBub24tcmVzaWRlbnQKKwkgKiBhdHRyaWJ1dGUgcmVjb3JkLgorCSAqLworCWFyZWNfc2l6ZSA9IChtcF9vZnMgKyBtcF9zaXplICsgNykgJiB+NzsKKwkvKgorCSAqIElmIHRoZSBwYWdlIGlzIG5vdCB1cHRvZGF0ZSBicmluZyBpdCB1cHRvZGF0ZSBieSBjb3B5aW5nIGZyb20gdGhlCisJICogYXR0cmlidXRlIHZhbHVlLgorCSAqLworCWF0dHJfc2l6ZSA9IGxlMzJfdG9fY3B1KGEtPmRhdGEucmVzaWRlbnQudmFsdWVfbGVuZ3RoKTsKKwlCVUdfT04oYXR0cl9zaXplICE9IGlfc2l6ZV9yZWFkKHZpKSk7CisJaWYgKHBhZ2UgJiYgIVBhZ2VVcHRvZGF0ZShwYWdlKSkgeworCQlrYWRkciA9IGttYXBfYXRvbWljKHBhZ2UsIEtNX1VTRVIwKTsKKwkJbWVtY3B5KGthZGRyLCAodTgqKWEgKworCQkJCWxlMTZfdG9fY3B1KGEtPmRhdGEucmVzaWRlbnQudmFsdWVfb2Zmc2V0KSwKKwkJCQlhdHRyX3NpemUpOworCQltZW1zZXQoa2FkZHIgKyBhdHRyX3NpemUsIDAsIFBBR0VfQ0FDSEVfU0laRSAtIGF0dHJfc2l6ZSk7CisJCWt1bm1hcF9hdG9taWMoa2FkZHIsIEtNX1VTRVIwKTsKKwkJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CisJCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKKwl9CisJLyogQmFja3VwIHRoZSBhdHRyaWJ1dGUgZmxhZy4gKi8KKwlvbGRfcmVzX2F0dHJfZmxhZ3MgPSBhLT5kYXRhLnJlc2lkZW50LmZsYWdzOworCS8qIFJlc2l6ZSB0aGUgcmVzaWRlbnQgcGFydCBvZiB0aGUgYXR0cmlidXRlIHJlY29yZC4gKi8KKwllcnIgPSBudGZzX2F0dHJfcmVjb3JkX3Jlc2l6ZShtLCBhLCBhcmVjX3NpemUpOworCWlmICh1bmxpa2VseShlcnIpKQorCQlnb3RvIGVycl9vdXQ7CisJLyoKKwkgKiBDb252ZXJ0IHRoZSByZXNpZGVudCBwYXJ0IG9mIHRoZSBhdHRyaWJ1dGUgcmVjb3JkIHRvIGRlc2NyaWJlIGEKKwkgKiBub24tcmVzaWRlbnQgYXR0cmlidXRlLgorCSAqLworCWEtPm5vbl9yZXNpZGVudCA9IDE7CisJLyogTW92ZSB0aGUgYXR0cmlidXRlIG5hbWUgaWYgaXQgZXhpc3RzIGFuZCB1cGRhdGUgdGhlIG9mZnNldC4gKi8KKwlpZiAoYS0+bmFtZV9sZW5ndGgpCisJCW1lbW1vdmUoKHU4KilhICsgbmFtZV9vZnMsICh1OCopYSArIGxlMTZfdG9fY3B1KGEtPm5hbWVfb2Zmc2V0KSwKKwkJCQlhLT5uYW1lX2xlbmd0aCAqIHNpemVvZihudGZzY2hhcikpOworCWEtPm5hbWVfb2Zmc2V0ID0gY3B1X3RvX2xlMTYobmFtZV9vZnMpOworCS8qCisJICogRklYTUU6IEZvciBub3cganVzdCBjbGVhciBhbGwgb2YgdGhlc2UgYXMgd2UgZG8gbm90IHN1cHBvcnQgdGhlbQorCSAqIHdoZW4gd3JpdGluZy4KKwkgKi8KKwlhLT5mbGFncyAmPSBjcHVfdG9fbGUxNigweGZmZmYgJiB+bGUxNl90b19jcHUoQVRUUl9JU19TUEFSU0UgfAorCQkJQVRUUl9JU19FTkNSWVBURUQgfCBBVFRSX0NPTVBSRVNTSU9OX01BU0spKTsKKwkvKiBTZXR1cCB0aGUgZmllbGRzIHNwZWNpZmljIHRvIG5vbi1yZXNpZGVudCBhdHRyaWJ1dGVzLiAqLworCWEtPmRhdGEubm9uX3Jlc2lkZW50Lmxvd2VzdF92Y24gPSAwOworCWEtPmRhdGEubm9uX3Jlc2lkZW50LmhpZ2hlc3RfdmNuID0gY3B1X3RvX3NsZTY0KChuZXdfc2l6ZSAtIDEpID4+CisJCQl2b2wtPmNsdXN0ZXJfc2l6ZV9iaXRzKTsKKwlhLT5kYXRhLm5vbl9yZXNpZGVudC5tYXBwaW5nX3BhaXJzX29mZnNldCA9IGNwdV90b19sZTE2KG1wX29mcyk7CisJYS0+ZGF0YS5ub25fcmVzaWRlbnQuY29tcHJlc3Npb25fdW5pdCA9IDA7CisJbWVtc2V0KCZhLT5kYXRhLm5vbl9yZXNpZGVudC5yZXNlcnZlZCwgMCwKKwkJCXNpemVvZihhLT5kYXRhLm5vbl9yZXNpZGVudC5yZXNlcnZlZCkpOworCWEtPmRhdGEubm9uX3Jlc2lkZW50LmFsbG9jYXRlZF9zaXplID0gY3B1X3RvX3NsZTY0KG5ld19zaXplKTsKKwlhLT5kYXRhLm5vbl9yZXNpZGVudC5kYXRhX3NpemUgPQorCQkJYS0+ZGF0YS5ub25fcmVzaWRlbnQuaW5pdGlhbGl6ZWRfc2l6ZSA9CisJCQljcHVfdG9fc2xlNjQoYXR0cl9zaXplKTsKKwkvKiBHZW5lcmF0ZSB0aGUgbWFwcGluZyBwYWlycyBhcnJheSBpbnRvIHRoZSBhdHRyaWJ1dGUgcmVjb3JkLiAqLworCWVyciA9IG50ZnNfbWFwcGluZ19wYWlyc19idWlsZCh2b2wsICh1OCopYSArIG1wX29mcywKKwkJCWFyZWNfc2l6ZSAtIG1wX29mcywgcmwsIDAsIC0xLCBOVUxMKTsKKwlpZiAodW5saWtlbHkoZXJyKSkgeworCQludGZzX2RlYnVnKCJGYWlsZWQgdG8gYnVpbGQgbWFwcGluZyBwYWlycywgZXJyb3IgY29kZSAlaS4iLAorCQkJCWVycik7CisJCWdvdG8gdW5kb19lcnJfb3V0OworCX0KKwkvKiBTZXR1cCB0aGUgaW4tbWVtb3J5IGF0dHJpYnV0ZSBzdHJ1Y3R1cmUgdG8gYmUgbm9uLXJlc2lkZW50LiAqLworCS8qCisJICogRklYTUU6IEZvciBub3cganVzdCBjbGVhciBhbGwgb2YgdGhlc2UgYXMgd2UgZG8gbm90IHN1cHBvcnQgdGhlbQorCSAqIHdoZW4gd3JpdGluZy4KKwkgKi8KKwlOSW5vQ2xlYXJTcGFyc2UobmkpOworCU5Jbm9DbGVhckVuY3J5cHRlZChuaSk7CisJTklub0NsZWFyQ29tcHJlc3NlZChuaSk7CisJbmktPnJ1bmxpc3QucmwgPSBybDsKKwl3cml0ZV9sb2NrX2lycXNhdmUoJm5pLT5zaXplX2xvY2ssIGZsYWdzKTsKKwluaS0+YWxsb2NhdGVkX3NpemUgPSBuZXdfc2l6ZTsKKwl3cml0ZV91bmxvY2tfaXJxcmVzdG9yZSgmbmktPnNpemVfbG9jaywgZmxhZ3MpOworCS8qCisJICogVGhpcyBuZWVkcyB0byBiZSBsYXN0IHNpbmNlIHRoZSBhZGRyZXNzIHNwYWNlIG9wZXJhdGlvbnMgLT5yZWFkcGFnZQorCSAqIGFuZCAtPndyaXRlcGFnZSBjYW4gcnVuIGNvbmN1cnJlbnRseSB3aXRoIHVzIGFzIHRoZXkgYXJlIG5vdAorCSAqIHNlcmlhbGl6ZWQgb24gaV9zZW0uICBOb3RlLCB3ZSBhcmUgbm90IGFsbG93ZWQgdG8gZmFpbCBvbmNlIHdlIGZsaXAKKwkgKiB0aGlzIHN3aXRjaCwgd2hpY2ggaXMgYW5vdGhlciByZWFzb24gdG8gZG8gdGhpcyBsYXN0LgorCSAqLworCU5Jbm9TZXROb25SZXNpZGVudChuaSk7CisJLyogTWFyayB0aGUgbWZ0IHJlY29yZCBkaXJ0eSwgc28gaXQgZ2V0cyB3cml0dGVuIGJhY2suICovCisJZmx1c2hfZGNhY2hlX21mdF9yZWNvcmRfcGFnZShjdHgtPm50ZnNfaW5vKTsKKwltYXJrX21mdF9yZWNvcmRfZGlydHkoY3R4LT5udGZzX2lubyk7CisJbnRmc19hdHRyX3B1dF9zZWFyY2hfY3R4KGN0eCk7CisJdW5tYXBfbWZ0X3JlY29yZChiYXNlX25pKTsKKwl1cF93cml0ZSgmbmktPnJ1bmxpc3QubG9jayk7CisJaWYgKHBhZ2UpIHsKKwkJc2V0X3BhZ2VfZGlydHkocGFnZSk7CisJCXVubG9ja19wYWdlKHBhZ2UpOworCQltYXJrX3BhZ2VfYWNjZXNzZWQocGFnZSk7CisJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKwl9CisJbnRmc19kZWJ1ZygiRG9uZS4iKTsKKwlyZXR1cm4gMDsKK3VuZG9fZXJyX291dDoKKwkvKiBDb252ZXJ0IHRoZSBhdHRyaWJ1dGUgYmFjayBpbnRvIGEgcmVzaWRlbnQgYXR0cmlidXRlLiAqLworCWEtPm5vbl9yZXNpZGVudCA9IDA7CisJLyogTW92ZSB0aGUgYXR0cmlidXRlIG5hbWUgaWYgaXQgZXhpc3RzIGFuZCB1cGRhdGUgdGhlIG9mZnNldC4gKi8KKwluYW1lX29mcyA9IChvZmZzZXRvZihBVFRSX1JFQ09SRCwgZGF0YS5yZXNpZGVudC5yZXNlcnZlZCkgKworCQkJc2l6ZW9mKGEtPmRhdGEucmVzaWRlbnQucmVzZXJ2ZWQpICsgNykgJiB+NzsKKwlpZiAoYS0+bmFtZV9sZW5ndGgpCisJCW1lbW1vdmUoKHU4KilhICsgbmFtZV9vZnMsICh1OCopYSArIGxlMTZfdG9fY3B1KGEtPm5hbWVfb2Zmc2V0KSwKKwkJCQlhLT5uYW1lX2xlbmd0aCAqIHNpemVvZihudGZzY2hhcikpOworCW1wX29mcyA9IChuYW1lX29mcyArIGEtPm5hbWVfbGVuZ3RoICogc2l6ZW9mKG50ZnNjaGFyKSArIDcpICYgfjc7CisJYS0+bmFtZV9vZmZzZXQgPSBjcHVfdG9fbGUxNihuYW1lX29mcyk7CisJYXJlY19zaXplID0gKG1wX29mcyArIGF0dHJfc2l6ZSArIDcpICYgfjc7CisJLyogUmVzaXplIHRoZSByZXNpZGVudCBwYXJ0IG9mIHRoZSBhdHRyaWJ1dGUgcmVjb3JkLiAqLworCWVycjIgPSBudGZzX2F0dHJfcmVjb3JkX3Jlc2l6ZShtLCBhLCBhcmVjX3NpemUpOworCWlmICh1bmxpa2VseShlcnIyKSkgeworCQkvKgorCQkgKiBUaGlzIGNhbm5vdCBoYXBwZW4gKHdlbGwgaWYgbWVtb3J5IGNvcnJ1cHRpb24gaXMgYXQgd29yayBpdAorCQkgKiBjb3VsZCBoYXBwZW4gaW4gdGhlb3J5KSwgYnV0IGRlYWwgd2l0aCBpdCBhcyB3ZWxsIGFzIHdlIGNhbi4KKwkJICogSWYgdGhlIG9sZCBzaXplIGlzIHRvbyBzbWFsbCwgdHJ1bmNhdGUgdGhlIGF0dHJpYnV0ZSwKKwkJICogb3RoZXJ3aXNlIHNpbXBseSBnaXZlIGl0IGEgbGFyZ2VyIGFsbG9jYXRlZCBzaXplLgorCQkgKiBGSVhNRTogU2hvdWxkIGNoZWNrIHdoZXRoZXIgY2hrZHNrIGNvbXBsYWlucyB3aGVuIHRoZQorCQkgKiBhbGxvY2F0ZWQgc2l6ZSBpcyBtdWNoIGJpZ2dlciB0aGFuIHRoZSByZXNpZGVudCB2YWx1ZSBzaXplLgorCQkgKi8KKwkJYXJlY19zaXplID0gbGUzMl90b19jcHUoYS0+bGVuZ3RoKTsKKwkJaWYgKChtcF9vZnMgKyBhdHRyX3NpemUpID4gYXJlY19zaXplKSB7CisJCQllcnIyID0gYXR0cl9zaXplOworCQkJYXR0cl9zaXplID0gYXJlY19zaXplIC0gbXBfb2ZzOworCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIHVuZG8gcGFydGlhbCByZXNpZGVudCAiCisJCQkJCSJ0byBub24tcmVzaWRlbnQgYXR0cmlidXRlICIKKwkJCQkJImNvbnZlcnNpb24uICBUcnVuY2F0aW5nIGlub2RlIDB4JWx4LCAiCisJCQkJCSJhdHRyaWJ1dGUgdHlwZSAweCV4IGZyb20gJWkgYnl0ZXMgdG8gIgorCQkJCQkiJWkgYnl0ZXMgdG8gbWFpbnRhaW4gbWV0YWRhdGEgIgorCQkJCQkiY29uc2lzdGVuY3kuICBUSElTIE1FQU5TIFlPVSBBUkUgIgorCQkJCQkiTE9TSU5HICVpIEJZVEVTIERBVEEgRlJPTSBUSElTICVzLiIsCisJCQkJCXZpLT5pX2lubywKKwkJCQkJKHVuc2lnbmVkKWxlMzJfdG9fY3B1KG5pLT50eXBlKSwKKwkJCQkJZXJyMiwgYXR0cl9zaXplLCBlcnIyIC0gYXR0cl9zaXplLAorCQkJCQkoKG5pLT50eXBlID09IEFUX0RBVEEpICYmCisJCQkJCSFuaS0+bmFtZV9sZW4pID8gIkZJTEUiOiAiQVRUUklCVVRFIik7CisJCQl3cml0ZV9sb2NrX2lycXNhdmUoJm5pLT5zaXplX2xvY2ssIGZsYWdzKTsKKwkJCW5pLT5pbml0aWFsaXplZF9zaXplID0gYXR0cl9zaXplOworCQkJaV9zaXplX3dyaXRlKHZpLCBhdHRyX3NpemUpOworCQkJd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJm5pLT5zaXplX2xvY2ssIGZsYWdzKTsKKwkJfQorCX0KKwkvKiBTZXR1cCB0aGUgZmllbGRzIHNwZWNpZmljIHRvIHJlc2lkZW50IGF0dHJpYnV0ZXMuICovCisJYS0+ZGF0YS5yZXNpZGVudC52YWx1ZV9sZW5ndGggPSBjcHVfdG9fbGUzMihhdHRyX3NpemUpOworCWEtPmRhdGEucmVzaWRlbnQudmFsdWVfb2Zmc2V0ID0gY3B1X3RvX2xlMTYobXBfb2ZzKTsKKwlhLT5kYXRhLnJlc2lkZW50LmZsYWdzID0gb2xkX3Jlc19hdHRyX2ZsYWdzOworCW1lbXNldCgmYS0+ZGF0YS5yZXNpZGVudC5yZXNlcnZlZCwgMCwKKwkJCXNpemVvZihhLT5kYXRhLnJlc2lkZW50LnJlc2VydmVkKSk7CisJLyogQ29weSB0aGUgZGF0YSBmcm9tIHRoZSBwYWdlIGJhY2sgdG8gdGhlIGF0dHJpYnV0ZSB2YWx1ZS4gKi8KKwlpZiAocGFnZSkgeworCQlrYWRkciA9IGttYXBfYXRvbWljKHBhZ2UsIEtNX1VTRVIwKTsKKwkJbWVtY3B5KCh1OCopYSArIG1wX29mcywga2FkZHIsIGF0dHJfc2l6ZSk7CisJCWt1bm1hcF9hdG9taWMoa2FkZHIsIEtNX1VTRVIwKTsKKwl9CisJLyogU2V0dXAgdGhlIGFsbG9jYXRlZCBzaXplIGluIHRoZSBudGZzIGlub2RlIGluIGNhc2UgaXQgY2hhbmdlZC4gKi8KKwl3cml0ZV9sb2NrX2lycXNhdmUoJm5pLT5zaXplX2xvY2ssIGZsYWdzKTsKKwluaS0+YWxsb2NhdGVkX3NpemUgPSBhcmVjX3NpemUgLSBtcF9vZnM7CisJd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJm5pLT5zaXplX2xvY2ssIGZsYWdzKTsKKwkvKiBNYXJrIHRoZSBtZnQgcmVjb3JkIGRpcnR5LCBzbyBpdCBnZXRzIHdyaXR0ZW4gYmFjay4gKi8KKwlmbHVzaF9kY2FjaGVfbWZ0X3JlY29yZF9wYWdlKGN0eC0+bnRmc19pbm8pOworCW1hcmtfbWZ0X3JlY29yZF9kaXJ0eShjdHgtPm50ZnNfaW5vKTsKK2Vycl9vdXQ6CisJaWYgKGN0eCkKKwkJbnRmc19hdHRyX3B1dF9zZWFyY2hfY3R4KGN0eCk7CisJaWYgKG0pCisJCXVubWFwX21mdF9yZWNvcmQoYmFzZV9uaSk7CisJbmktPnJ1bmxpc3QucmwgPSBOVUxMOworCXVwX3dyaXRlKCZuaS0+cnVubGlzdC5sb2NrKTsKK3JsX2Vycl9vdXQ6CisJaWYgKHJsKSB7CisJCWlmIChudGZzX2NsdXN0ZXJfZnJlZV9mcm9tX3JsKHZvbCwgcmwpIDwgMCkgeworCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIHJlbGVhc2UgYWxsb2NhdGVkICIKKwkJCQkJImNsdXN0ZXIocykgaW4gZXJyb3IgY29kZSBwYXRoLiAgUnVuICIKKwkJCQkJImNoa2RzayB0byByZWNvdmVyIHRoZSBsb3N0ICIKKwkJCQkJImNsdXN0ZXIocykuIik7CisJCQlOVm9sU2V0RXJyb3JzKHZvbCk7CisJCX0KKwkJbnRmc19mcmVlKHJsKTsKK3BhZ2VfZXJyX291dDoKKwkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKwl9CisJaWYgKGVyciA9PSAtRUlOVkFMKQorCQllcnIgPSAtRUlPOworCXJldHVybiBlcnI7Cit9CisKKy8qKgogICogbnRmc19hdHRyX3NldCAtIGZpbGwgKGEgcGFydCBvZikgYW4gYXR0cmlidXRlIHdpdGggYSBieXRlCiAgKiBAbmk6CQludGZzIGlub2RlIGRlc2NyaWJpbmcgdGhlIGF0dHJpYnV0ZSB0byBmaWxsCiAgKiBAb2ZzOglvZmZzZXQgaW5zaWRlIHRoZSBhdHRyaWJ1dGUgYXQgd2hpY2ggdG8gc3RhcnQgdG8gZmlsbApAQCAtMTEyNyw2ICsxNTc5LDEwIEBACiAgKiBieXRlIG9mZnNldCBAb2ZzIGluc2lkZSB0aGUgYXR0cmlidXRlIHdpdGggdGhlIGNvbnN0YW50IGJ5dGUgQHZhbC4KICAqCiAgKiBUaGlzIGZ1bmN0aW9uIGlzIGVmZmVjdGl2ZWx5IGxpa2UgbWVtc2V0KCkgYXBwbGllZCB0byBhbiBudGZzIGF0dHJpYnV0ZS4KKyAqIE5vdGUgdGhpZSBmdW5jdGlvbiBhY3R1YWxseSBvbmx5IG9wZXJhdGVzIG9uIHRoZSBwYWdlIGNhY2hlIHBhZ2VzIGJlbG9uZ2luZworICogdG8gdGhlIG50ZnMgYXR0cmlidXRlIGFuZCBpdCBtYXJrcyB0aGVtIGRpcnR5IGFmdGVyIGRvaW5nIHRoZSBtZW1zZXQoKS4KKyAqIFRodXMgaXQgcmVsaWVzIG9uIHRoZSB2bSBkaXJ0eSBwYWdlIHdyaXRlIGNvZGUgcGF0aHMgdG8gY2F1c2UgdGhlIG1vZGlmaWVkCisgKiBwYWdlcyB0byBiZSB3cml0dGVuIHRvIHRoZSBtZnQgcmVjb3JkL2Rpc2suCiAgKgogICogUmV0dXJuIDAgb24gc3VjY2VzcyBhbmQgLWVycm5vIG9uIGVycm9yLiAgQW4gZXJyb3IgY29kZSBvZiAtRVNQSVBFIG1lYW5zCiAgKiB0aGF0IEBvZnMgKyBAY250IHdlcmUgb3V0c2lkZSB0aGUgZW5kIG9mIHRoZSBhdHRyaWJ1dGUgYW5kIG5vIHdyaXRlIHdhcwpAQCAtMTE1NSw3ICsxNjExLDcgQEAKIAllbmQgPSBvZnMgKyBjbnQ7CiAJZW5kX29mcyA9IGVuZCAmIH5QQUdFX0NBQ0hFX01BU0s7CiAJLyogSWYgdGhlIGVuZCBpcyBvdXRzaWRlIHRoZSBpbm9kZSBzaXplIHJldHVybiAtRVNQSVBFLiAqLwotCWlmICh1bmxpa2VseShlbmQgPiBWRlNfSShuaSktPmlfc2l6ZSkpIHsKKwlpZiAodW5saWtlbHkoZW5kID4gaV9zaXplX3JlYWQoVkZTX0kobmkpKSkpIHsKIAkJbnRmc19lcnJvcih2b2wtPnNiLCAiUmVxdWVzdCBleGNlZWRzIGVuZCBvZiBhdHRyaWJ1dGUuIik7CiAJCXJldHVybiAtRVNQSVBFOwogCX0KQEAgLTEyNTYsMyArMTcxMiw1IEBACiAJbnRmc19kZWJ1ZygiRG9uZS4iKTsKIAlyZXR1cm4gMDsKIH0KKworI2VuZGlmIC8qIE5URlNfUlcgKi8KZGlmZiAtLWdpdCBhL2ZzL250ZnMvYXR0cmliLmggYi9mcy9udGZzL2F0dHJpYi5oCmluZGV4IGUwYzJjNmMuLjBlNGFjNmQgMTAwNjQ0Ci0tLSBhL2ZzL250ZnMvYXR0cmliLmgKKysrIGIvZnMvbnRmcy9hdHRyaWIuaApAQCAtMiw3ICsyLDcgQEAKICAqIGF0dHJpYi5oIC0gRGVmaW5lcyBmb3IgYXR0cmlidXRlIGhhbmRsaW5nIGluIE5URlMgTGludXgga2VybmVsIGRyaXZlci4KICAqCSAgICAgIFBhcnQgb2YgdGhlIExpbnV4LU5URlMgcHJvamVjdC4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNCBBbnRvbiBBbHRhcGFybWFrb3YKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA1IEFudG9uIEFsdGFwYXJtYWtvdgogICogQ29weXJpZ2h0IChjKSAyMDAyIFJpY2hhcmQgUnVzc29uCiAgKgogICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKQEAgLTYwLDEwICs2MCwxNCBAQAogCUFUVFJfUkVDT1JEICpiYXNlX2F0dHI7CiB9IG50ZnNfYXR0cl9zZWFyY2hfY3R4OwogCitleHRlcm4gaW50IG50ZnNfbWFwX3J1bmxpc3Rfbm9sb2NrKG50ZnNfaW5vZGUgKm5pLCBWQ04gdmNuKTsKIGV4dGVybiBpbnQgbnRmc19tYXBfcnVubGlzdChudGZzX2lub2RlICpuaSwgVkNOIHZjbik7CiAKLWV4dGVybiBydW5saXN0X2VsZW1lbnQgKm50ZnNfZmluZF92Y24obnRmc19pbm9kZSAqbmksIGNvbnN0IFZDTiB2Y24sCi0JCWNvbnN0IEJPT0wgbmVlZF93cml0ZSk7CitleHRlcm4gTENOIG50ZnNfYXR0cl92Y25fdG9fbGNuX25vbG9jayhudGZzX2lub2RlICpuaSwgY29uc3QgVkNOIHZjbiwKKwkJY29uc3QgQk9PTCB3cml0ZV9sb2NrZWQpOworCitleHRlcm4gcnVubGlzdF9lbGVtZW50ICpudGZzX2F0dHJfZmluZF92Y25fbm9sb2NrKG50ZnNfaW5vZGUgKm5pLAorCQljb25zdCBWQ04gdmNuLCBjb25zdCBCT09MIHdyaXRlX2xvY2tlZCk7CiAKIGludCBudGZzX2F0dHJfbG9va3VwKGNvbnN0IEFUVFJfVFlQRSB0eXBlLCBjb25zdCBudGZzY2hhciAqbmFtZSwKIAkJY29uc3QgdTMyIG5hbWVfbGVuLCBjb25zdCBJR05PUkVfQ0FTRV9CT09MIGljLApAQCAtODUsNiArODksOCBAQAogCQlNRlRfUkVDT1JEICptcmVjKTsKIGV4dGVybiB2b2lkIG50ZnNfYXR0cl9wdXRfc2VhcmNoX2N0eChudGZzX2F0dHJfc2VhcmNoX2N0eCAqY3R4KTsKIAorI2lmZGVmIE5URlNfUlcKKwogZXh0ZXJuIGludCBudGZzX2F0dHJfc2l6ZV9ib3VuZHNfY2hlY2soY29uc3QgbnRmc192b2x1bWUgKnZvbCwKIAkJY29uc3QgQVRUUl9UWVBFIHR5cGUsIGNvbnN0IHM2NCBzaXplKTsKIGV4dGVybiBpbnQgbnRmc19hdHRyX2Nhbl9iZV9ub25fcmVzaWRlbnQoY29uc3QgbnRmc192b2x1bWUgKnZvbCwKQEAgLTk0LDcgKzEwMCwxMSBAQAogCiBleHRlcm4gaW50IG50ZnNfYXR0cl9yZWNvcmRfcmVzaXplKE1GVF9SRUNPUkQgKm0sIEFUVFJfUkVDT1JEICphLCB1MzIgbmV3X3NpemUpOwogCitleHRlcm4gaW50IG50ZnNfYXR0cl9tYWtlX25vbl9yZXNpZGVudChudGZzX2lub2RlICpuaSk7CisKIGV4dGVybiBpbnQgbnRmc19hdHRyX3NldChudGZzX2lub2RlICpuaSwgY29uc3QgczY0IG9mcywgY29uc3QgczY0IGNudCwKIAkJY29uc3QgdTggdmFsKTsKIAorI2VuZGlmIC8qIE5URlNfUlcgKi8KKwogI2VuZGlmIC8qIF9MSU5VWF9OVEZTX0FUVFJJQl9IICovCmRpZmYgLS1naXQgYS9mcy9udGZzL2NvbXByZXNzLmMgYi9mcy9udGZzL2NvbXByZXNzLmMKaW5kZXggZWU1YWU3MC4uNmQyNjVjZiAxMDA2NDQKLS0tIGEvZnMvbnRmcy9jb21wcmVzcy5jCisrKyBiL2ZzL250ZnMvY29tcHJlc3MuYwpAQCAtOTYsMTMgKzk2LDE0IEBACiAvKioKICAqIHplcm9fcGFydGlhbF9jb21wcmVzc2VkX3BhZ2UgLSB6ZXJvIG91dCBvZiBib3VuZHMgY29tcHJlc3NlZCBwYWdlIHJlZ2lvbgogICovCi1zdGF0aWMgdm9pZCB6ZXJvX3BhcnRpYWxfY29tcHJlc3NlZF9wYWdlKG50ZnNfaW5vZGUgKm5pLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKK3N0YXRpYyB2b2lkIHplcm9fcGFydGlhbF9jb21wcmVzc2VkX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsCisJCWNvbnN0IHM2NCBpbml0aWFsaXplZF9zaXplKQogewogCXU4ICprcCA9IHBhZ2VfYWRkcmVzcyhwYWdlKTsKIAl1bnNpZ25lZCBpbnQga3Bfb2ZzOwogCiAJbnRmc19kZWJ1ZygiWmVyb2luZyBwYWdlIHJlZ2lvbiBvdXRzaWRlIGluaXRpYWxpemVkIHNpemUuIik7Ci0JaWYgKCgoczY0KXBhZ2UtPmluZGV4IDw8IFBBR0VfQ0FDSEVfU0hJRlQpID49IG5pLT5pbml0aWFsaXplZF9zaXplKSB7CisJaWYgKCgoczY0KXBhZ2UtPmluZGV4IDw8IFBBR0VfQ0FDSEVfU0hJRlQpID49IGluaXRpYWxpemVkX3NpemUpIHsKIAkJLyoKIAkJICogRklYTUU6IFVzaW5nIGNsZWFyX3BhZ2UoKSB3aWxsIGJlY29tZSB3cm9uZyB3aGVuIHdlIGdldAogCQkgKiBQQUdFX0NBQ0hFX1NJWkUgIT0gUEFHRV9TSVpFIGJ1dCBmb3Igbm93IHRoZXJlIGlzIG5vIHByb2JsZW0uCkBAIC0xMTAsNyArMTExLDcgQEAKIAkJY2xlYXJfcGFnZShrcCk7CiAJCXJldHVybjsKIAl9Ci0Ja3Bfb2ZzID0gbmktPmluaXRpYWxpemVkX3NpemUgJiB+UEFHRV9DQUNIRV9NQVNLOworCWtwX29mcyA9IGluaXRpYWxpemVkX3NpemUgJiB+UEFHRV9DQUNIRV9NQVNLOwogCW1lbXNldChrcCArIGtwX29mcywgMCwgUEFHRV9DQUNIRV9TSVpFIC0ga3Bfb2ZzKTsKIAlyZXR1cm47CiB9CkBAIC0xMTgsMTIgKzExOSwxMiBAQAogLyoqCiAgKiBoYW5kbGVfYm91bmRzX2NvbXByZXNzZWRfcGFnZSAtIHRlc3QgZm9yJmhhbmRsZSBvdXQgb2YgYm91bmRzIGNvbXByZXNzZWQgcGFnZQogICovCi1zdGF0aWMgaW5saW5lIHZvaWQgaGFuZGxlX2JvdW5kc19jb21wcmVzc2VkX3BhZ2UobnRmc19pbm9kZSAqbmksCi0JCXN0cnVjdCBwYWdlICpwYWdlKQorc3RhdGljIGlubGluZSB2b2lkIGhhbmRsZV9ib3VuZHNfY29tcHJlc3NlZF9wYWdlKHN0cnVjdCBwYWdlICpwYWdlLAorCQljb25zdCBsb2ZmX3QgaV9zaXplLCBjb25zdCBzNjQgaW5pdGlhbGl6ZWRfc2l6ZSkKIHsKLQlpZiAoKHBhZ2UtPmluZGV4ID49IChuaS0+aW5pdGlhbGl6ZWRfc2l6ZSA+PiBQQUdFX0NBQ0hFX1NISUZUKSkgJiYKLQkJCShuaS0+aW5pdGlhbGl6ZWRfc2l6ZSA8IFZGU19JKG5pKS0+aV9zaXplKSkKLQkJemVyb19wYXJ0aWFsX2NvbXByZXNzZWRfcGFnZShuaSwgcGFnZSk7CisJaWYgKChwYWdlLT5pbmRleCA+PSAoaW5pdGlhbGl6ZWRfc2l6ZSA+PiBQQUdFX0NBQ0hFX1NISUZUKSkgJiYKKwkJCShpbml0aWFsaXplZF9zaXplIDwgaV9zaXplKSkKKwkJemVyb19wYXJ0aWFsX2NvbXByZXNzZWRfcGFnZShwYWdlLCBpbml0aWFsaXplZF9zaXplKTsKIAlyZXR1cm47CiB9CiAKQEAgLTEzOCw2ICsxMzksOCBAQAogICogQHhwYWdlX2RvbmU6CQlzZXQgdG8gMSBpZiB4cGFnZSB3YXMgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSAoSU4vT1VUKQogICogQGNiX3N0YXJ0OgkJY29tcHJlc3Npb24gYmxvY2sgdG8gZGVjb21wcmVzcyAoSU4pCiAgKiBAY2Jfc2l6ZToJCXNpemUgb2YgY29tcHJlc3Npb24gYmxvY2sgQGNiX3N0YXJ0IGluIGJ5dGVzIChJTikKKyAqIEBpX3NpemU6CQlmaWxlIHNpemUgd2hlbiB3ZSBzdGFydGVkIHRoZSByZWFkIChJTikKKyAqIEBpbml0aWFsaXplZF9zaXplOglpbml0aWFsaXplZCBmaWxlIHNpemUgd2hlbiB3ZSBzdGFydGVkIHRoZSByZWFkIChJTikKICAqCiAgKiBUaGUgY2FsbGVyIG11c3QgaGF2ZSBkaXNhYmxlZCBwcmVlbXB0aW9uLiBudGZzX2RlY29tcHJlc3MoKSByZWVuYWJsZXMgaXQgd2hlbgogICogdGhlIGNyaXRpY2FsIHNlY3Rpb24gaXMgZmluaXNoZWQuCkBAIC0xNjUsNyArMTY4LDggQEAKIHN0YXRpYyBpbnQgbnRmc19kZWNvbXByZXNzKHN0cnVjdCBwYWdlICpkZXN0X3BhZ2VzW10sIGludCAqZGVzdF9pbmRleCwKIAkJaW50ICpkZXN0X29mcywgY29uc3QgaW50IGRlc3RfbWF4X2luZGV4LCBjb25zdCBpbnQgZGVzdF9tYXhfb2ZzLAogCQljb25zdCBpbnQgeHBhZ2UsIGNoYXIgKnhwYWdlX2RvbmUsIHU4ICpjb25zdCBjYl9zdGFydCwKLQkJY29uc3QgdTMyIGNiX3NpemUpCisJCWNvbnN0IHUzMiBjYl9zaXplLCBjb25zdCBsb2ZmX3QgaV9zaXplLAorCQljb25zdCBzNjQgaW5pdGlhbGl6ZWRfc2l6ZSkKIHsKIAkvKgogCSAqIFBvaW50ZXJzIGludG8gdGhlIGNvbXByZXNzZWQgZGF0YSwgaS5lLiB0aGUgY29tcHJlc3Npb24gYmxvY2sgKGNiKSwKQEAgLTIxOSw5ICsyMjMsNiBAQAogCQlzcGluX3VubG9jaygmbnRmc19jYl9sb2NrKTsKIAkJLyogU2Vjb25kIHN0YWdlOiBmaW5hbGl6ZSBjb21wbGV0ZWQgcGFnZXMuICovCiAJCWlmIChucl9jb21wbGV0ZWRfcGFnZXMgPiAwKSB7Ci0JCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IGRlc3RfcGFnZXNbY29tcGxldGVkX3BhZ2VzWzBdXTsKLQkJCW50ZnNfaW5vZGUgKm5pID0gTlRGU19JKHBhZ2UtPm1hcHBpbmctPmhvc3QpOwotCiAJCQlmb3IgKGkgPSAwOyBpIDwgbnJfY29tcGxldGVkX3BhZ2VzOyBpKyspIHsKIAkJCQlpbnQgZGkgPSBjb21wbGV0ZWRfcGFnZXNbaV07CiAKQEAgLTIzMCw3ICsyMzEsOCBAQAogCQkJCSAqIElmIHdlIGFyZSBvdXRzaWRlIHRoZSBpbml0aWFsaXplZCBzaXplLCB6ZXJvCiAJCQkJICogdGhlIG91dCBvZiBib3VuZHMgcGFnZSByYW5nZS4KIAkJCQkgKi8KLQkJCQloYW5kbGVfYm91bmRzX2NvbXByZXNzZWRfcGFnZShuaSwgZHApOworCQkJCWhhbmRsZV9ib3VuZHNfY29tcHJlc3NlZF9wYWdlKGRwLCBpX3NpemUsCisJCQkJCQlpbml0aWFsaXplZF9zaXplKTsKIAkJCQlmbHVzaF9kY2FjaGVfcGFnZShkcCk7CiAJCQkJa3VubWFwKGRwKTsKIAkJCQlTZXRQYWdlVXB0b2RhdGUoZHApOwpAQCAtNDc4LDEyICs0ODAsMTQgQEAKICAqLwogaW50IG50ZnNfcmVhZF9jb21wcmVzc2VkX2Jsb2NrKHN0cnVjdCBwYWdlICpwYWdlKQogeworCWxvZmZfdCBpX3NpemU7CisJczY0IGluaXRpYWxpemVkX3NpemU7CiAJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBwYWdlLT5tYXBwaW5nOwogCW50ZnNfaW5vZGUgKm5pID0gTlRGU19JKG1hcHBpbmctPmhvc3QpOwogCW50ZnNfdm9sdW1lICp2b2wgPSBuaS0+dm9sOwogCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSB2b2wtPnNiOwogCXJ1bmxpc3RfZWxlbWVudCAqcmw7Ci0JdW5zaWduZWQgbG9uZyBibG9ja19zaXplID0gc2ItPnNfYmxvY2tzaXplOworCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGJsb2NrX3NpemUgPSBzYi0+c19ibG9ja3NpemU7CiAJdW5zaWduZWQgY2hhciBibG9ja19zaXplX2JpdHMgPSBzYi0+c19ibG9ja3NpemVfYml0czsKIAl1OCAqY2IsICpjYl9wb3MsICpjYl9lbmQ7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICoqYmhzOwpAQCAtNTUyLDggKzU1NiwxMiBAQAogCSAqIFRoZSByZW1haW5pbmcgcGFnZXMgbmVlZCB0byBiZSBhbGxvY2F0ZWQgYW5kIGluc2VydGVkIGludG8gdGhlIHBhZ2UKIAkgKiBjYWNoZSwgYWxpZ25tZW50IGd1YXJhbnRlZXMga2VlcCBhbGwgdGhlIGJlbG93IG11Y2ggc2ltcGxlci4gKC04CiAJICovCi0JbWF4X3BhZ2UgPSAoKFZGU19JKG5pKS0+aV9zaXplICsgUEFHRV9DQUNIRV9TSVpFIC0gMSkgPj4KLQkJCVBBR0VfQ0FDSEVfU0hJRlQpIC0gb2Zmc2V0OworCXJlYWRfbG9ja19pcnFzYXZlKCZuaS0+c2l6ZV9sb2NrLCBmbGFncyk7CisJaV9zaXplID0gaV9zaXplX3JlYWQoVkZTX0kobmkpKTsKKwlpbml0aWFsaXplZF9zaXplID0gbmktPmluaXRpYWxpemVkX3NpemU7CisJcmVhZF91bmxvY2tfaXJxcmVzdG9yZSgmbmktPnNpemVfbG9jaywgZmxhZ3MpOworCW1heF9wYWdlID0gKChpX3NpemUgKyBQQUdFX0NBQ0hFX1NJWkUgLSAxKSA+PiBQQUdFX0NBQ0hFX1NISUZUKSAtCisJCQlvZmZzZXQ7CiAJaWYgKG5yX3BhZ2VzIDwgbWF4X3BhZ2UpCiAJCW1heF9wYWdlID0gbnJfcGFnZXM7CiAJZm9yIChpID0gMDsgaSA8IG1heF9wYWdlOyBpKyssIG9mZnNldCsrKSB7CkBAIC04MjQsNyArODMyLDggQEAKIAkJCQkgKiBJZiB3ZSBhcmUgb3V0c2lkZSB0aGUgaW5pdGlhbGl6ZWQgc2l6ZSwgemVybwogCQkJCSAqIHRoZSBvdXQgb2YgYm91bmRzIHBhZ2UgcmFuZ2UuCiAJCQkJICovCi0JCQkJaGFuZGxlX2JvdW5kc19jb21wcmVzc2VkX3BhZ2UobmksIHBhZ2UpOworCQkJCWhhbmRsZV9ib3VuZHNfY29tcHJlc3NlZF9wYWdlKHBhZ2UsIGlfc2l6ZSwKKwkJCQkJCWluaXRpYWxpemVkX3NpemUpOwogCQkJCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOwogCQkJCWt1bm1hcChwYWdlKTsKIAkJCQlTZXRQYWdlVXB0b2RhdGUocGFnZSk7CkBAIC04NDcsNyArODU2LDggQEAKIAkJbnRmc19kZWJ1ZygiRm91bmQgY29tcHJlc3NlZCBjb21wcmVzc2lvbiBibG9jay4iKTsKIAkJZXJyID0gbnRmc19kZWNvbXByZXNzKHBhZ2VzLCAmY3VyX3BhZ2UsICZjdXJfb2ZzLAogCQkJCWNiX21heF9wYWdlLCBjYl9tYXhfb2ZzLCB4cGFnZSwgJnhwYWdlX2RvbmUsCi0JCQkJY2JfcG9zLAljYl9zaXplIC0gKGNiX3BvcyAtIGNiKSk7CisJCQkJY2JfcG9zLAljYl9zaXplIC0gKGNiX3BvcyAtIGNiKSwgaV9zaXplLAorCQkJCWluaXRpYWxpemVkX3NpemUpOwogCQkvKgogCQkgKiBXZSBjYW4gc2xlZXAgZnJvbSBub3cgb24sIGxvY2sgYWxyZWFkeSBkcm9wcGVkIGJ5CiAJCSAqIG50ZnNfZGVjb21wcmVzcygpLgpkaWZmIC0tZ2l0IGEvZnMvbnRmcy9kZWJ1Zy5jIGIvZnMvbnRmcy9kZWJ1Zy5jCmluZGV4IDZmYjZiYjUuLjgwNzE1MGUgMTAwNjQ0Ci0tLSBhL2ZzL250ZnMvZGVidWcuYworKysgYi9mcy9udGZzL2RlYnVnLmMKQEAgLTE2NCwxNCArMTY0LDE3IEBACiAJCQlpZiAoaW5kZXggPiAtTENOX0VOT0VOVCAtIDEpCiAJCQkJaW5kZXggPSAzOwogCQkJcHJpbnRrKEtFUk5fREVCVUcgIiUtMTZMeCAlcyAlLTE2THglc1xuIiwKLQkJCQkJKHJsICsgaSktPnZjbiwgbGNuX3N0cltpbmRleF0sCi0JCQkJCShybCArIGkpLT5sZW5ndGgsIChybCArIGkpLT5sZW5ndGggPwotCQkJCQkiIiA6ICIgKHJ1bmxpc3QgZW5kKSIpOworCQkJCQkobG9uZyBsb25nKShybCArIGkpLT52Y24sIGxjbl9zdHJbaW5kZXhdLAorCQkJCQkobG9uZyBsb25nKShybCArIGkpLT5sZW5ndGgsCisJCQkJCShybCArIGkpLT5sZW5ndGggPyAiIiA6CisJCQkJCQkiIChydW5saXN0IGVuZCkiKTsKIAkJfSBlbHNlCiAJCQlwcmludGsoS0VSTl9ERUJVRyAiJS0xNkx4ICUtMTZMeCAgJS0xNkx4JXNcbiIsCi0JCQkJCShybCArIGkpLT52Y24sIChybCArIGkpLT5sY24sCi0JCQkJCShybCArIGkpLT5sZW5ndGgsIChybCArIGkpLT5sZW5ndGggPwotCQkJCQkiIiA6ICIgKHJ1bmxpc3QgZW5kKSIpOworCQkJCQkobG9uZyBsb25nKShybCArIGkpLT52Y24sCisJCQkJCShsb25nIGxvbmcpKHJsICsgaSktPmxjbiwKKwkJCQkJKGxvbmcgbG9uZykocmwgKyBpKS0+bGVuZ3RoLAorCQkJCQkocmwgKyBpKS0+bGVuZ3RoID8gIiIgOgorCQkJCQkJIiAocnVubGlzdCBlbmQpIik7CiAJCWlmICghKHJsICsgaSktPmxlbmd0aCkKIAkJCWJyZWFrOwogCX0KZGlmZiAtLWdpdCBhL2ZzL250ZnMvZGlyLmMgYi9mcy9udGZzL2Rpci5jCmluZGV4IDkzNTc3NTYuLjQ2Nzc5NDcgMTAwNjQ0Ci0tLSBhL2ZzL250ZnMvZGlyLmMKKysrIGIvZnMvbnRmcy9kaXIuYwpAQCAtMSw3ICsxLDcgQEAKIC8qKgogICogZGlyLmMgLSBOVEZTIGtlcm5lbCBkaXJlY3Rvcnkgb3BlcmF0aW9ucy4gUGFydCBvZiB0aGUgTGludXgtTlRGUyBwcm9qZWN0LgogICoKLSAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA0IEFudG9uIEFsdGFwYXJtYWtvdgorICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDUgQW50b24gQWx0YXBhcm1ha292CiAgKiBDb3B5cmlnaHQgKGMpIDIwMDIgUmljaGFyZCBSdXNzb24KICAqCiAgKiBUaGlzIHByb2dyYW0vaW5jbHVkZSBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgpAQCAtMTgzLDggKzE4Myw3IEBACiAJCQkJbmFtZS0+bGVuID0gMDsKIAkJCQkqcmVzID0gbmFtZTsKIAkJCX0gZWxzZSB7Ci0JCQkJaWYgKG5hbWUpCi0JCQkJCWtmcmVlKG5hbWUpOworCQkJCWtmcmVlKG5hbWUpOwogCQkJCSpyZXMgPSBOVUxMOwogCQkJfQogCQkJbXJlZiA9IGxlNjRfdG9fY3B1KGllLT5kYXRhLmRpci5pbmRleGVkX2ZpbGUpOwpAQCAtNDQ0LDggKzQ0Myw3IEBACiAJCQkJbmFtZS0+bGVuID0gMDsKIAkJCQkqcmVzID0gbmFtZTsKIAkJCX0gZWxzZSB7Ci0JCQkJaWYgKG5hbWUpCi0JCQkJCWtmcmVlKG5hbWUpOworCQkJCWtmcmVlKG5hbWUpOwogCQkJCSpyZXMgPSBOVUxMOwogCQkJfQogCQkJbXJlZiA9IGxlNjRfdG9fY3B1KGllLT5kYXRhLmRpci5pbmRleGVkX2ZpbGUpOwpAQCAtNjEwLDcgKzYwOCw3IEBACiAvLyBUT0RPOiAoQUlBKQogLy8gVGhlIGFsZ29yaXRobSBlbWJlZGRlZCBpbiB0aGlzIGNvZGUgd2lsbCBiZSByZXF1aXJlZCBmb3IgdGhlIHRpbWUgd2hlbiB3ZQogLy8gd2FudCB0byBzdXBwb3J0IGFkZGluZyBvZiBlbnRyaWVzIHRvIGRpcmVjdG9yaWVzLCB3aGVyZSB3ZSByZXF1aXJlIGNvcnJlY3QKLS8vIGNvbGxhdGlvbiBvZiBmaWxlIG5hbWVzIGluIG9yZGVyIG5vdCB0byBjYXVzZSBjb3JydXB0aW9uIG9mIHRoZSBmaWxlIHN5c3RlbS4KKy8vIGNvbGxhdGlvbiBvZiBmaWxlIG5hbWVzIGluIG9yZGVyIG5vdCB0byBjYXVzZSBjb3JydXB0aW9uIG9mIHRoZSBmaWxlc3lzdGVtLgogCiAvKioKICAqIG50ZnNfbG9va3VwX2lub2RlX2J5X25hbWUgLSBmaW5kIGFuIGlub2RlIGluIGEgZGlyZWN0b3J5IGdpdmVuIGl0cyBuYW1lCkBAIC0xMTAxLDcgKzEwOTksNyBAQAogc3RhdGljIGludCBudGZzX3JlYWRkaXIoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKmRpcmVudCwgZmlsbGRpcl90IGZpbGxkaXIpCiB7CiAJczY0IGlhX3BvcywgaWFfc3RhcnQsIHByZXZfaWFfcG9zLCBibXBfcG9zOwotCWxvZmZfdCBmcG9zOworCWxvZmZfdCBmcG9zLCBpX3NpemU7CiAJc3RydWN0IGlub2RlICpibXBfdmksICp2ZGlyID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7CiAJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IHZkaXItPmlfc2I7CiAJbnRmc19pbm9kZSAqbmRpciA9IE5URlNfSSh2ZGlyKTsKQEAgLTExMjIsNyArMTEyMCw4IEBACiAJCQl2ZGlyLT5pX2lubywgZnBvcyk7CiAJcmMgPSBlcnIgPSAwOwogCS8qIEFyZSB3ZSBhdCBlbmQgb2YgZGlyIHlldD8gKi8KLQlpZiAoZnBvcyA+PSB2ZGlyLT5pX3NpemUgKyB2b2wtPm1mdF9yZWNvcmRfc2l6ZSkKKwlpX3NpemUgPSBpX3NpemVfcmVhZCh2ZGlyKTsKKwlpZiAoZnBvcyA+PSBpX3NpemUgKyB2b2wtPm1mdF9yZWNvcmRfc2l6ZSkKIAkJZ290byBkb25lOwogCS8qIEVtdWxhdGUgLiBhbmQgLi4gZm9yIGFsbCBkaXJlY3Rvcmllcy4gKi8KIAlpZiAoIWZwb3MpIHsKQEAgLTEyNjQsNyArMTI2Myw3IEBACiAJYm1wX21hcHBpbmcgPSBibXBfdmktPmlfbWFwcGluZzsKIAkvKiBHZXQgdGhlIHN0YXJ0aW5nIGJpdG1hcCBiaXQgcG9zaXRpb24gYW5kIHNhbml0eSBjaGVjayBpdC4gKi8KIAlibXBfcG9zID0gaWFfcG9zID4+IG5kaXItPml0eXBlLmluZGV4LmJsb2NrX3NpemVfYml0czsKLQlpZiAodW5saWtlbHkoYm1wX3BvcyA+PiAzID49IGJtcF92aS0+aV9zaXplKSkgeworCWlmICh1bmxpa2VseShibXBfcG9zID4+IDMgPj0gaV9zaXplX3JlYWQoYm1wX3ZpKSkpIHsKIAkJbnRmc19lcnJvcihzYiwgIkN1cnJlbnQgaW5kZXggYWxsb2NhdGlvbiBwb3NpdGlvbiBleGNlZWRzICIKIAkJCQkiaW5kZXggYml0bWFwIHNpemUuIik7CiAJCWdvdG8gZXJyX291dDsKQEAgLTEzMDEsNyArMTMwMCw3IEBACiAJCQlnb3RvIGdldF9uZXh0X2JtcF9wYWdlOwogCQl9CiAJCS8qIElmIHdlIGhhdmUgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBiaXRtYXAsIHdlIGFyZSBkb25lLiAqLwotCQlpZiAodW5saWtlbHkoKChibXBfcG9zICsgY3VyX2JtcF9wb3MpID4+IDMpID49IHZkaXItPmlfc2l6ZSkpCisJCWlmICh1bmxpa2VseSgoKGJtcF9wb3MgKyBjdXJfYm1wX3BvcykgPj4gMykgPj0gaV9zaXplKSkKIAkJCWdvdG8gdW5tX0VPRDsKIAkJaWFfcG9zID0gKGJtcF9wb3MgKyBjdXJfYm1wX3BvcykgPDwKIAkJCQluZGlyLT5pdHlwZS5pbmRleC5ibG9ja19zaXplX2JpdHM7CkBAIC0xMzA5LDcgKzEzMDgsOCBAQAogCW50ZnNfZGVidWcoIkhhbmRsaW5nIGluZGV4IGJ1ZmZlciAweCVsbHguIiwKIAkJCSh1bnNpZ25lZCBsb25nIGxvbmcpYm1wX3BvcyArIGN1cl9ibXBfcG9zKTsKIAkvKiBJZiB0aGUgY3VycmVudCBpbmRleCBidWZmZXIgaXMgaW4gdGhlIHNhbWUgcGFnZSB3ZSByZXVzZSB0aGUgcGFnZS4gKi8KLQlpZiAoKHByZXZfaWFfcG9zICYgUEFHRV9DQUNIRV9NQVNLKSAhPSAoaWFfcG9zICYgUEFHRV9DQUNIRV9NQVNLKSkgeworCWlmICgocHJldl9pYV9wb3MgJiAoczY0KVBBR0VfQ0FDSEVfTUFTSykgIT0KKwkJCShpYV9wb3MgJiAoczY0KVBBR0VfQ0FDSEVfTUFTSykpIHsKIAkJcHJldl9pYV9wb3MgPSBpYV9wb3M7CiAJCWlmIChsaWtlbHkoaWFfcGFnZSAhPSBOVUxMKSkgewogCQkJdW5sb2NrX3BhZ2UoaWFfcGFnZSk7CkBAIC0xNDQxLDcgKzE0NDEsNyBAQAogCW50ZnNfdW5tYXBfcGFnZShibXBfcGFnZSk7CiBFT0Q6CiAJLyogV2UgYXJlIGZpbmlzaGVkLCBzZXQgZnBvcyB0byBFT0QuICovCi0JZnBvcyA9IHZkaXItPmlfc2l6ZSArIHZvbC0+bWZ0X3JlY29yZF9zaXplOworCWZwb3MgPSBpX3NpemUgKyB2b2wtPm1mdF9yZWNvcmRfc2l6ZTsKIGFib3J0OgogCWtmcmVlKG5hbWUpOwogZG9uZToKQEAgLTE0NjEsMTAgKzE0NjEsOCBAQAogCQl1bmxvY2tfcGFnZShpYV9wYWdlKTsKIAkJbnRmc191bm1hcF9wYWdlKGlhX3BhZ2UpOwogCX0KLQlpZiAoaXIpCi0JCWtmcmVlKGlyKTsKLQlpZiAobmFtZSkKLQkJa2ZyZWUobmFtZSk7CisJa2ZyZWUoaXIpOworCWtmcmVlKG5hbWUpOwogCWlmIChjdHgpCiAJCW50ZnNfYXR0cl9wdXRfc2VhcmNoX2N0eChjdHgpOwogCWlmIChtKQpAQCAtMTQ5NSw3ICsxNDkzLDcgQEAKIHN0YXRpYyBpbnQgbnRmc19kaXJfb3BlbihzdHJ1Y3QgaW5vZGUgKnZpLCBzdHJ1Y3QgZmlsZSAqZmlscCkKIHsKIAlpZiAoc2l6ZW9mKHVuc2lnbmVkIGxvbmcpIDwgOCkgewotCQlpZiAodmktPmlfc2l6ZSA+IE1BWF9MRlNfRklMRVNJWkUpCisJCWlmIChpX3NpemVfcmVhZCh2aSkgPiBNQVhfTEZTX0ZJTEVTSVpFKQogCQkJcmV0dXJuIC1FRkJJRzsKIAl9CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9mcy9udGZzL2ZpbGUuYyBiL2ZzL250ZnMvZmlsZS5jCmluZGV4IGRiODcxM2UuLmUwZjUzMGMgMTAwNjQ0Ci0tLSBhL2ZzL250ZnMvZmlsZS5jCisrKyBiL2ZzL250ZnMvZmlsZS5jCkBAIC00Nyw3ICs0Nyw3IEBACiBzdGF0aWMgaW50IG50ZnNfZmlsZV9vcGVuKHN0cnVjdCBpbm9kZSAqdmksIHN0cnVjdCBmaWxlICpmaWxwKQogewogCWlmIChzaXplb2YodW5zaWduZWQgbG9uZykgPCA4KSB7Ci0JCWlmICh2aS0+aV9zaXplID4gTUFYX0xGU19GSUxFU0laRSkKKwkJaWYgKGlfc2l6ZV9yZWFkKHZpKSA+IE1BWF9MRlNfRklMRVNJWkUpCiAJCQlyZXR1cm4gLUVGQklHOwogCX0KIAlyZXR1cm4gZ2VuZXJpY19maWxlX29wZW4odmksIGZpbHApOwpkaWZmIC0tZ2l0IGEvZnMvbnRmcy9pbmRleC5jIGIvZnMvbnRmcy9pbmRleC5jCmluZGV4IDcxYmQyY2QuLjExZmQ1MzAgMTAwNjQ0Ci0tLSBhL2ZzL250ZnMvaW5kZXguYworKysgYi9mcy9udGZzL2luZGV4LmMKQEAgLTEsNyArMSw3IEBACiAvKgogICogaW5kZXguYyAtIE5URlMga2VybmVsIGluZGV4IGhhbmRsaW5nLiAgUGFydCBvZiB0aGUgTGludXgtTlRGUyBwcm9qZWN0LgogICoKLSAqIENvcHlyaWdodCAoYykgMjAwNCBBbnRvbiBBbHRhcGFybWFrb3YKKyAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA1IEFudG9uIEFsdGFwYXJtYWtvdgogICoKICAqIFRoaXMgcHJvZ3JhbS9pbmNsdWRlIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKQEAgLTM5LDE4ICszOSw4IEBACiAJbnRmc19pbmRleF9jb250ZXh0ICppY3R4OwogCiAJaWN0eCA9IGttZW1fY2FjaGVfYWxsb2MobnRmc19pbmRleF9jdHhfY2FjaGUsIFNMQUJfTk9GUyk7Ci0JaWYgKGljdHgpIHsKLQkJaWN0eC0+aWR4X25pID0gaWR4X25pOwotCQlpY3R4LT5lbnRyeSA9IE5VTEw7Ci0JCWljdHgtPmRhdGEgPSBOVUxMOwotCQlpY3R4LT5kYXRhX2xlbiA9IDA7Ci0JCWljdHgtPmlzX2luX3Jvb3QgPSAwOwotCQlpY3R4LT5pciA9IE5VTEw7Ci0JCWljdHgtPmFjdHggPSBOVUxMOwotCQlpY3R4LT5iYXNlX25pID0gTlVMTDsKLQkJaWN0eC0+aWEgPSBOVUxMOwotCQlpY3R4LT5wYWdlID0gTlVMTDsKLQl9CisJaWYgKGljdHgpCisJCSppY3R4ID0gKG50ZnNfaW5kZXhfY29udGV4dCl7IC5pZHhfbmkgPSBpZHhfbmkgfTsKIAlyZXR1cm4gaWN0eDsKIH0KIApkaWZmIC0tZ2l0IGEvZnMvbnRmcy9pbm9kZS5jIGIvZnMvbnRmcy9pbm9kZS5jCmluZGV4IDMxODQwYmEuLjg4NjIxNGEgMTAwNjQ0Ci0tLSBhL2ZzL250ZnMvaW5vZGUuYworKysgYi9mcy9udGZzL2lub2RlLmMKQEAgLTEsNyArMSw3IEBACiAvKioKICAqIGlub2RlLmMgLSBOVEZTIGtlcm5lbCBpbm9kZSBoYW5kbGluZy4gUGFydCBvZiB0aGUgTGludXgtTlRGUyBwcm9qZWN0LgogICoKLSAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA0IEFudG9uIEFsdGFwYXJtYWtvdgorICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDUgQW50b24gQWx0YXBhcm1ha292CiAgKgogICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZApAQCAtMTc0LDcgKzE3NCw3IEBACiAKIAl2aSA9IGlnZXQ1X2xvY2tlZChzYiwgbWZ0X25vLCAodGVzdF90KW50ZnNfdGVzdF9pbm9kZSwKIAkJCShzZXRfdCludGZzX2luaXRfbG9ja2VkX2lub2RlLCAmbmEpOwotCWlmICghdmkpCisJaWYgKHVubGlrZWx5KCF2aSkpCiAJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCiAJZXJyID0gMDsKQEAgLTE4OCw3ICsxODgsNyBAQAogCSAqIFRoZXJlIGlzIG5vIHBvaW50IGluIGtlZXBpbmcgYmFkIGlub2RlcyBhcm91bmQgaWYgdGhlIGZhaWx1cmUgd2FzCiAJICogZHVlIHRvIEVOT01FTS4gV2Ugd2FudCB0byBiZSBhYmxlIHRvIHJldHJ5IGFnYWluIGxhdGVyLgogCSAqLwotCWlmIChlcnIgPT0gLUVOT01FTSkgeworCWlmICh1bmxpa2VseShlcnIgPT0gLUVOT01FTSkpIHsKIAkJaXB1dCh2aSk7CiAJCXZpID0gRVJSX1BUUihlcnIpOwogCX0KQEAgLTIzNSw3ICsyMzUsNyBAQAogCiAJdmkgPSBpZ2V0NV9sb2NrZWQoYmFzZV92aS0+aV9zYiwgbmEubWZ0X25vLCAodGVzdF90KW50ZnNfdGVzdF9pbm9kZSwKIAkJCShzZXRfdCludGZzX2luaXRfbG9ja2VkX2lub2RlLCAmbmEpOwotCWlmICghdmkpCisJaWYgKHVubGlrZWx5KCF2aSkpCiAJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCiAJZXJyID0gMDsKQEAgLTI1MCw3ICsyNTAsNyBAQAogCSAqIHNpbXBsaWZpZXMgdGhpbmdzIGluIHRoYXQgd2UgbmV2ZXIgbmVlZCB0byBjaGVjayBmb3IgYmFkIGF0dHJpYnV0ZQogCSAqIGlub2RlcyBlbHNld2hlcmUuCiAJICovCi0JaWYgKGVycikgeworCWlmICh1bmxpa2VseShlcnIpKSB7CiAJCWlwdXQodmkpOwogCQl2aSA9IEVSUl9QVFIoZXJyKTsKIAl9CkBAIC0yOTAsNyArMjkwLDcgQEAKIAogCXZpID0gaWdldDVfbG9ja2VkKGJhc2VfdmktPmlfc2IsIG5hLm1mdF9ubywgKHRlc3RfdCludGZzX3Rlc3RfaW5vZGUsCiAJCQkoc2V0X3QpbnRmc19pbml0X2xvY2tlZF9pbm9kZSwgJm5hKTsKLQlpZiAoIXZpKQorCWlmICh1bmxpa2VseSghdmkpKQogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAogCWVyciA9IDA7CkBAIC0zMDUsNyArMzA1LDcgQEAKIAkgKiBzaW1wbGlmaWVzIHRoaW5ncyBpbiB0aGF0IHdlIG5ldmVyIG5lZWQgdG8gY2hlY2sgZm9yIGJhZCBpbmRleAogCSAqIGlub2RlcyBlbHNld2hlcmUuCiAJICovCi0JaWYgKGVycikgeworCWlmICh1bmxpa2VseShlcnIpKSB7CiAJCWlwdXQodmkpOwogCQl2aSA9IEVSUl9QVFIoZXJyKTsKIAl9CkBAIC0zMTcsOCArMzE3LDcgQEAKIAludGZzX2lub2RlICpuaTsKIAogCW50ZnNfZGVidWcoIkVudGVyaW5nLiIpOwotCW5pID0gKG50ZnNfaW5vZGUgKilrbWVtX2NhY2hlX2FsbG9jKG50ZnNfYmlnX2lub2RlX2NhY2hlLAotCQkJU0xBQl9OT0ZTKTsKKwluaSA9IGttZW1fY2FjaGVfYWxsb2MobnRmc19iaWdfaW5vZGVfY2FjaGUsIFNMQUJfTk9GUyk7CiAJaWYgKGxpa2VseShuaSAhPSBOVUxMKSkgewogCQluaS0+c3RhdGUgPSAwOwogCQlyZXR1cm4gVkZTX0kobmkpOwpAQCAtMzQzLDcgKzM0Miw3IEBACiAJbnRmc19pbm9kZSAqbmk7CiAKIAludGZzX2RlYnVnKCJFbnRlcmluZy4iKTsKLQluaSA9IChudGZzX2lub2RlICopa21lbV9jYWNoZV9hbGxvYyhudGZzX2lub2RlX2NhY2hlLCBTTEFCX05PRlMpOworCW5pID0ga21lbV9jYWNoZV9hbGxvYyhudGZzX2lub2RlX2NhY2hlLCBTTEFCX05PRlMpOwogCWlmIChsaWtlbHkobmkgIT0gTlVMTCkpIHsKIAkJbmktPnN0YXRlID0gMDsKIAkJcmV0dXJuIG5pOwpAQCAtMzc2LDYgKzM3NSw3IEBACiB2b2lkIF9fbnRmc19pbml0X2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIG50ZnNfaW5vZGUgKm5pKQogewogCW50ZnNfZGVidWcoIkVudGVyaW5nLiIpOworCXJ3bG9ja19pbml0KCZuaS0+c2l6ZV9sb2NrKTsKIAluaS0+aW5pdGlhbGl6ZWRfc2l6ZSA9IG5pLT5hbGxvY2F0ZWRfc2l6ZSA9IDA7CiAJbmktPnNlcV9ubyA9IDA7CiAJYXRvbWljX3NldCgmbmktPmNvdW50LCAxKTsKQEAgLTUyNCw2ICs1MjQsNyBAQAogCW50ZnNfdm9sdW1lICp2b2wgPSBOVEZTX1NCKHZpLT5pX3NiKTsKIAludGZzX2lub2RlICpuaTsKIAlNRlRfUkVDT1JEICptOworCUFUVFJfUkVDT1JEICphOwogCVNUQU5EQVJEX0lORk9STUFUSU9OICpzaTsKIAludGZzX2F0dHJfc2VhcmNoX2N0eCAqY3R4OwogCWludCBlcnIgPSAwOwpAQCAtNjMyLDkgKzYzMywxMCBAQAogCQl9CiAJCWdvdG8gdW5tX2Vycl9vdXQ7CiAJfQorCWEgPSBjdHgtPmF0dHI7CiAJLyogR2V0IHRoZSBzdGFuZGFyZCBpbmZvcm1hdGlvbiBhdHRyaWJ1dGUgdmFsdWUuICovCi0Jc2kgPSAoU1RBTkRBUkRfSU5GT1JNQVRJT04qKSgoY2hhciopY3R4LT5hdHRyICsKLQkJCWxlMTZfdG9fY3B1KGN0eC0+YXR0ci0+ZGF0YS5yZXNpZGVudC52YWx1ZV9vZmZzZXQpKTsKKwlzaSA9IChTVEFOREFSRF9JTkZPUk1BVElPTiopKCh1OCopYSArCisJCQlsZTE2X3RvX2NwdShhLT5kYXRhLnJlc2lkZW50LnZhbHVlX29mZnNldCkpOwogCiAJLyogVHJhbnNmZXIgaW5mb3JtYXRpb24gZnJvbSB0aGUgc3RhbmRhcmQgaW5mb3JtYXRpb24gaW50byB2aS4gKi8KIAkvKgpAQCAtNjczLDE1ICs2NzUsMTYgQEAKIAkJCWdvdG8gc2tpcF9hdHRyX2xpc3RfbG9hZDsKIAkJbnRmc19kZWJ1ZygiQXR0cmlidXRlIGxpc3QgZm91bmQgaW4gaW5vZGUgMHglbHguIiwgdmktPmlfaW5vKTsKIAkJTklub1NldEF0dHJMaXN0KG5pKTsKLQkJaWYgKGN0eC0+YXR0ci0+ZmxhZ3MgJiBBVFRSX0lTX0VOQ1JZUFRFRCB8fAotCQkJCWN0eC0+YXR0ci0+ZmxhZ3MgJiBBVFRSX0NPTVBSRVNTSU9OX01BU0sgfHwKLQkJCQljdHgtPmF0dHItPmZsYWdzICYgQVRUUl9JU19TUEFSU0UpIHsKKwkJYSA9IGN0eC0+YXR0cjsKKwkJaWYgKGEtPmZsYWdzICYgQVRUUl9JU19FTkNSWVBURUQgfHwKKwkJCQlhLT5mbGFncyAmIEFUVFJfQ09NUFJFU1NJT05fTUFTSyB8fAorCQkJCWEtPmZsYWdzICYgQVRUUl9JU19TUEFSU0UpIHsKIAkJCW50ZnNfZXJyb3IodmktPmlfc2IsICJBdHRyaWJ1dGUgbGlzdCBhdHRyaWJ1dGUgaXMgIgogCQkJCQkiY29tcHJlc3NlZC9lbmNyeXB0ZWQvc3BhcnNlLiIpOwogCQkJZ290byB1bm1fZXJyX291dDsKIAkJfQogCQkvKiBOb3cgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgYXR0cmlidXRlIGxpc3QuICovCi0JCW5pLT5hdHRyX2xpc3Rfc2l6ZSA9ICh1MzIpbnRmc19hdHRyX3NpemUoY3R4LT5hdHRyKTsKKwkJbmktPmF0dHJfbGlzdF9zaXplID0gKHUzMiludGZzX2F0dHJfc2l6ZShhKTsKIAkJbmktPmF0dHJfbGlzdCA9IG50ZnNfbWFsbG9jX25vZnMobmktPmF0dHJfbGlzdF9zaXplKTsKIAkJaWYgKCFuaS0+YXR0cl9saXN0KSB7CiAJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gYWxsb2NhdGUgIgpAQCAtNjg5LDkgKzY5Miw5IEBACiAJCQllcnIgPSAtRU5PTUVNOwogCQkJZ290byB1bm1fZXJyX291dDsKIAkJfQotCQlpZiAoY3R4LT5hdHRyLT5ub25fcmVzaWRlbnQpIHsKKwkJaWYgKGEtPm5vbl9yZXNpZGVudCkgewogCQkJTklub1NldEF0dHJMaXN0Tm9uUmVzaWRlbnQobmkpOwotCQkJaWYgKGN0eC0+YXR0ci0+ZGF0YS5ub25fcmVzaWRlbnQubG93ZXN0X3ZjbikgeworCQkJaWYgKGEtPmRhdGEubm9uX3Jlc2lkZW50Lmxvd2VzdF92Y24pIHsKIAkJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiQXR0cmlidXRlIGxpc3QgaGFzIG5vbiAiCiAJCQkJCQkiemVybyBsb3dlc3RfdmNuLiIpOwogCQkJCWdvdG8gdW5tX2Vycl9vdXQ7CkBAIC03MDEsNyArNzA0LDcgQEAKIAkJCSAqIGV4Y2x1c2l2ZSBhY2Nlc3MgdG8gdGhlIGlub2RlIGF0IHRoaXMgdGltZS4KIAkJCSAqLwogCQkJbmktPmF0dHJfbGlzdF9ybC5ybCA9IG50ZnNfbWFwcGluZ19wYWlyc19kZWNvbXByZXNzKHZvbCwKLQkJCQkJY3R4LT5hdHRyLCBOVUxMKTsKKwkJCQkJYSwgTlVMTCk7CiAJCQlpZiAoSVNfRVJSKG5pLT5hdHRyX2xpc3RfcmwucmwpKSB7CiAJCQkJZXJyID0gUFRSX0VSUihuaS0+YXR0cl9saXN0X3JsLnJsKTsKIAkJCQluaS0+YXR0cl9saXN0X3JsLnJsID0gTlVMTDsKQEAgLTcxMiwyNyArNzE1LDI2IEBACiAJCQkvKiBOb3cgbG9hZCB0aGUgYXR0cmlidXRlIGxpc3QuICovCiAJCQlpZiAoKGVyciA9IGxvYWRfYXR0cmlidXRlX2xpc3Qodm9sLCAmbmktPmF0dHJfbGlzdF9ybCwKIAkJCQkJbmktPmF0dHJfbGlzdCwgbmktPmF0dHJfbGlzdF9zaXplLAotCQkJCQlzbGU2NF90b19jcHUoY3R4LT5hdHRyLT5kYXRhLgotCQkJCQlub25fcmVzaWRlbnQuaW5pdGlhbGl6ZWRfc2l6ZSkpKSkgeworCQkJCQlzbGU2NF90b19jcHUoYS0+ZGF0YS5ub25fcmVzaWRlbnQuCisJCQkJCWluaXRpYWxpemVkX3NpemUpKSkpIHsKIAkJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiRmFpbGVkIHRvIGxvYWQgIgogCQkJCQkJImF0dHJpYnV0ZSBsaXN0IGF0dHJpYnV0ZS4iKTsKIAkJCQlnb3RvIHVubV9lcnJfb3V0OwogCQkJfQotCQl9IGVsc2UgLyogaWYgKCFjdHguYXR0ci0+bm9uX3Jlc2lkZW50KSAqLyB7Ci0JCQlpZiAoKHU4KiljdHgtPmF0dHIgKyBsZTE2X3RvX2NwdSgKLQkJCQkJY3R4LT5hdHRyLT5kYXRhLnJlc2lkZW50LnZhbHVlX29mZnNldCkgKwotCQkJCQlsZTMyX3RvX2NwdSgKLQkJCQkJY3R4LT5hdHRyLT5kYXRhLnJlc2lkZW50LnZhbHVlX2xlbmd0aCkgPgorCQl9IGVsc2UgLyogaWYgKCFhLT5ub25fcmVzaWRlbnQpICovIHsKKwkJCWlmICgodTgqKWEgKyBsZTE2X3RvX2NwdShhLT5kYXRhLnJlc2lkZW50LnZhbHVlX29mZnNldCkKKwkJCQkJKyBsZTMyX3RvX2NwdSgKKwkJCQkJYS0+ZGF0YS5yZXNpZGVudC52YWx1ZV9sZW5ndGgpID4KIAkJCQkJKHU4KiljdHgtPm1yZWMgKyB2b2wtPm1mdF9yZWNvcmRfc2l6ZSkgewogCQkJCW50ZnNfZXJyb3IodmktPmlfc2IsICJDb3JydXB0IGF0dHJpYnV0ZSBsaXN0ICIKIAkJCQkJCSJpbiBpbm9kZS4iKTsKIAkJCQlnb3RvIHVubV9lcnJfb3V0OwogCQkJfQogCQkJLyogTm93IGNvcHkgdGhlIGF0dHJpYnV0ZSBsaXN0LiAqLwotCQkJbWVtY3B5KG5pLT5hdHRyX2xpc3QsICh1OCopY3R4LT5hdHRyICsgbGUxNl90b19jcHUoCi0JCQkJCWN0eC0+YXR0ci0+ZGF0YS5yZXNpZGVudC52YWx1ZV9vZmZzZXQpLAorCQkJbWVtY3B5KG5pLT5hdHRyX2xpc3QsICh1OCopYSArIGxlMTZfdG9fY3B1KAorCQkJCQlhLT5kYXRhLnJlc2lkZW50LnZhbHVlX29mZnNldCksCiAJCQkJCWxlMzJfdG9fY3B1KAotCQkJCQljdHgtPmF0dHItPmRhdGEucmVzaWRlbnQudmFsdWVfbGVuZ3RoKSk7CisJCQkJCWEtPmRhdGEucmVzaWRlbnQudmFsdWVfbGVuZ3RoKSk7CiAJCX0KIAl9CiBza2lwX2F0dHJfbGlzdF9sb2FkOgpAQCAtNzQxLDEwICs3NDMsMTEgQEAKIAkgKiBpbiBudGZzX2luby0+YXR0cl9saXN0IGFuZCBpdCBpcyBudGZzX2luby0+YXR0cl9saXN0X3NpemUgYnl0ZXMuCiAJICovCiAJaWYgKFNfSVNESVIodmktPmlfbW9kZSkpIHsKKwkJbG9mZl90IGJ2aV9zaXplOwogCQlzdHJ1Y3QgaW5vZGUgKmJ2aTsKIAkJbnRmc19pbm9kZSAqYm5pOwogCQlJTkRFWF9ST09UICppcjsKLQkJY2hhciAqaXJfZW5kLCAqaW5kZXhfZW5kOworCQl1OCAqaXJfZW5kLCAqaW5kZXhfZW5kOwogCiAJCS8qIEl0IGlzIGEgZGlyZWN0b3J5LCBmaW5kIGluZGV4IHJvb3QgYXR0cmlidXRlLiAqLwogCQludGZzX2F0dHJfcmVpbml0X3NlYXJjaF9jdHgoY3R4KTsKQEAgLTc2MCwxNyArNzYzLDE2IEBACiAJCQl9CiAJCQlnb3RvIHVubV9lcnJfb3V0OwogCQl9CisJCWEgPSBjdHgtPmF0dHI7CiAJCS8qIFNldCB1cCB0aGUgc3RhdGUuICovCi0JCWlmICh1bmxpa2VseShjdHgtPmF0dHItPm5vbl9yZXNpZGVudCkpIHsKKwkJaWYgKHVubGlrZWx5KGEtPm5vbl9yZXNpZGVudCkpIHsKIAkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIiRJTkRFWF9ST09UIGF0dHJpYnV0ZSBpcyBub3QgIgogCQkJCQkicmVzaWRlbnQuIik7CiAJCQlnb3RvIHVubV9lcnJfb3V0OwogCQl9CiAJCS8qIEVuc3VyZSB0aGUgYXR0cmlidXRlIG5hbWUgaXMgcGxhY2VkIGJlZm9yZSB0aGUgdmFsdWUuICovCi0JCWlmICh1bmxpa2VseShjdHgtPmF0dHItPm5hbWVfbGVuZ3RoICYmCi0JCQkJKGxlMTZfdG9fY3B1KGN0eC0+YXR0ci0+bmFtZV9vZmZzZXQpID49Ci0JCQkJbGUxNl90b19jcHUoY3R4LT5hdHRyLT5kYXRhLnJlc2lkZW50LgotCQkJCXZhbHVlX29mZnNldCkpKSkgeworCQlpZiAodW5saWtlbHkoYS0+bmFtZV9sZW5ndGggJiYgKGxlMTZfdG9fY3B1KGEtPm5hbWVfb2Zmc2V0KSA+PQorCQkJCWxlMTZfdG9fY3B1KGEtPmRhdGEucmVzaWRlbnQudmFsdWVfb2Zmc2V0KSkpKSB7CiAJCQludGZzX2Vycm9yKHZvbC0+c2IsICIkSU5ERVhfUk9PVCBhdHRyaWJ1dGUgbmFtZSBpcyAiCiAJCQkJCSJwbGFjZWQgYWZ0ZXIgdGhlIGF0dHJpYnV0ZSB2YWx1ZS4iKTsKIAkJCWdvdG8gdW5tX2Vycl9vdXQ7CkBAIC03ODEsMjggKzc4MywyNyBAQAogCQkgKiBlbmNyeXB0ZWQuIEhvd2V2ZXIgaW5kZXggcm9vdCBjYW5ub3QgYmUgYm90aCBjb21wcmVzc2VkIGFuZAogCQkgKiBlbmNyeXB0ZWQuCiAJCSAqLwotCQlpZiAoY3R4LT5hdHRyLT5mbGFncyAmIEFUVFJfQ09NUFJFU1NJT05fTUFTSykKKwkJaWYgKGEtPmZsYWdzICYgQVRUUl9DT01QUkVTU0lPTl9NQVNLKQogCQkJTklub1NldENvbXByZXNzZWQobmkpOwotCQlpZiAoY3R4LT5hdHRyLT5mbGFncyAmIEFUVFJfSVNfRU5DUllQVEVEKSB7Ci0JCQlpZiAoY3R4LT5hdHRyLT5mbGFncyAmIEFUVFJfQ09NUFJFU1NJT05fTUFTSykgeworCQlpZiAoYS0+ZmxhZ3MgJiBBVFRSX0lTX0VOQ1JZUFRFRCkgeworCQkJaWYgKGEtPmZsYWdzICYgQVRUUl9DT01QUkVTU0lPTl9NQVNLKSB7CiAJCQkJbnRmc19lcnJvcih2aS0+aV9zYiwgIkZvdW5kIGVuY3J5cHRlZCBhbmQgIgogCQkJCQkJImNvbXByZXNzZWQgYXR0cmlidXRlLiIpOwogCQkJCWdvdG8gdW5tX2Vycl9vdXQ7CiAJCQl9CiAJCQlOSW5vU2V0RW5jcnlwdGVkKG5pKTsKIAkJfQotCQlpZiAoY3R4LT5hdHRyLT5mbGFncyAmIEFUVFJfSVNfU1BBUlNFKQorCQlpZiAoYS0+ZmxhZ3MgJiBBVFRSX0lTX1NQQVJTRSkKIAkJCU5Jbm9TZXRTcGFyc2UobmkpOwotCQlpciA9IChJTkRFWF9ST09UKikoKGNoYXIqKWN0eC0+YXR0ciArIGxlMTZfdG9fY3B1KAotCQkJCWN0eC0+YXR0ci0+ZGF0YS5yZXNpZGVudC52YWx1ZV9vZmZzZXQpKTsKLQkJaXJfZW5kID0gKGNoYXIqKWlyICsgbGUzMl90b19jcHUoCi0JCQkJY3R4LT5hdHRyLT5kYXRhLnJlc2lkZW50LnZhbHVlX2xlbmd0aCk7Ci0JCWlmIChpcl9lbmQgPiAoY2hhciopY3R4LT5tcmVjICsgdm9sLT5tZnRfcmVjb3JkX3NpemUpIHsKKwkJaXIgPSAoSU5ERVhfUk9PVCopKCh1OCopYSArCisJCQkJbGUxNl90b19jcHUoYS0+ZGF0YS5yZXNpZGVudC52YWx1ZV9vZmZzZXQpKTsKKwkJaXJfZW5kID0gKHU4KilpciArIGxlMzJfdG9fY3B1KGEtPmRhdGEucmVzaWRlbnQudmFsdWVfbGVuZ3RoKTsKKwkJaWYgKGlyX2VuZCA+ICh1OCopY3R4LT5tcmVjICsgdm9sLT5tZnRfcmVjb3JkX3NpemUpIHsKIAkJCW50ZnNfZXJyb3IodmktPmlfc2IsICIkSU5ERVhfUk9PVCBhdHRyaWJ1dGUgaXMgIgogCQkJCQkiY29ycnVwdC4iKTsKIAkJCWdvdG8gdW5tX2Vycl9vdXQ7CiAJCX0KLQkJaW5kZXhfZW5kID0gKGNoYXIqKSZpci0+aW5kZXggKworCQlpbmRleF9lbmQgPSAodTgqKSZpci0+aW5kZXggKwogCQkJCWxlMzJfdG9fY3B1KGlyLT5pbmRleC5pbmRleF9sZW5ndGgpOwogCQlpZiAoaW5kZXhfZW5kID4gaXJfZW5kKSB7CiAJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiRGlyZWN0b3J5IGluZGV4IGlzIGNvcnJ1cHQuIik7CkBAIC04ODksNyArODkwLDggQEAKIAkJCQkJCSJhdHRyaWJ1dGUuIik7CiAJCQlnb3RvIHVubV9lcnJfb3V0OwogCQl9Ci0JCWlmICghY3R4LT5hdHRyLT5ub25fcmVzaWRlbnQpIHsKKwkJYSA9IGN0eC0+YXR0cjsKKwkJaWYgKCFhLT5ub25fcmVzaWRlbnQpIHsKIAkJCW50ZnNfZXJyb3IodmktPmlfc2IsICIkSU5ERVhfQUxMT0NBVElPTiBhdHRyaWJ1dGUgIgogCQkJCQkiaXMgcmVzaWRlbnQuIik7CiAJCQlnb3RvIHVubV9lcnJfb3V0OwpAQCAtODk4LDQyICs5MDAsNDAgQEAKIAkJICogRW5zdXJlIHRoZSBhdHRyaWJ1dGUgbmFtZSBpcyBwbGFjZWQgYmVmb3JlIHRoZSBtYXBwaW5nIHBhaXJzCiAJCSAqIGFycmF5LgogCQkgKi8KLQkJaWYgKHVubGlrZWx5KGN0eC0+YXR0ci0+bmFtZV9sZW5ndGggJiYKLQkJCQkobGUxNl90b19jcHUoY3R4LT5hdHRyLT5uYW1lX29mZnNldCkgPj0KLQkJCQlsZTE2X3RvX2NwdShjdHgtPmF0dHItPmRhdGEubm9uX3Jlc2lkZW50LgotCQkJCW1hcHBpbmdfcGFpcnNfb2Zmc2V0KSkpKSB7CisJCWlmICh1bmxpa2VseShhLT5uYW1lX2xlbmd0aCAmJiAobGUxNl90b19jcHUoYS0+bmFtZV9vZmZzZXQpID49CisJCQkJbGUxNl90b19jcHUoCisJCQkJYS0+ZGF0YS5ub25fcmVzaWRlbnQubWFwcGluZ19wYWlyc19vZmZzZXQpKSkpIHsKIAkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIiRJTkRFWF9BTExPQ0FUSU9OIGF0dHJpYnV0ZSBuYW1lICIKIAkJCQkJImlzIHBsYWNlZCBhZnRlciB0aGUgbWFwcGluZyBwYWlycyAiCiAJCQkJCSJhcnJheS4iKTsKIAkJCWdvdG8gdW5tX2Vycl9vdXQ7CiAJCX0KLQkJaWYgKGN0eC0+YXR0ci0+ZmxhZ3MgJiBBVFRSX0lTX0VOQ1JZUFRFRCkgeworCQlpZiAoYS0+ZmxhZ3MgJiBBVFRSX0lTX0VOQ1JZUFRFRCkgewogCQkJbnRmc19lcnJvcih2aS0+aV9zYiwgIiRJTkRFWF9BTExPQ0FUSU9OIGF0dHJpYnV0ZSAiCiAJCQkJCSJpcyBlbmNyeXB0ZWQuIik7CiAJCQlnb3RvIHVubV9lcnJfb3V0OwogCQl9Ci0JCWlmIChjdHgtPmF0dHItPmZsYWdzICYgQVRUUl9JU19TUEFSU0UpIHsKKwkJaWYgKGEtPmZsYWdzICYgQVRUUl9JU19TUEFSU0UpIHsKIAkJCW50ZnNfZXJyb3IodmktPmlfc2IsICIkSU5ERVhfQUxMT0NBVElPTiBhdHRyaWJ1dGUgIgogCQkJCQkiaXMgc3BhcnNlLiIpOwogCQkJZ290byB1bm1fZXJyX291dDsKIAkJfQotCQlpZiAoY3R4LT5hdHRyLT5mbGFncyAmIEFUVFJfQ09NUFJFU1NJT05fTUFTSykgeworCQlpZiAoYS0+ZmxhZ3MgJiBBVFRSX0NPTVBSRVNTSU9OX01BU0spIHsKIAkJCW50ZnNfZXJyb3IodmktPmlfc2IsICIkSU5ERVhfQUxMT0NBVElPTiBhdHRyaWJ1dGUgIgogCQkJCQkiaXMgY29tcHJlc3NlZC4iKTsKIAkJCWdvdG8gdW5tX2Vycl9vdXQ7CiAJCX0KLQkJaWYgKGN0eC0+YXR0ci0+ZGF0YS5ub25fcmVzaWRlbnQubG93ZXN0X3ZjbikgeworCQlpZiAoYS0+ZGF0YS5ub25fcmVzaWRlbnQubG93ZXN0X3ZjbikgewogCQkJbnRmc19lcnJvcih2aS0+aV9zYiwgIkZpcnN0IGV4dGVudCBvZiAiCiAJCQkJCSIkSU5ERVhfQUxMT0NBVElPTiBhdHRyaWJ1dGUgaGFzIG5vbiAiCiAJCQkJCSJ6ZXJvIGxvd2VzdF92Y24uIik7CiAJCQlnb3RvIHVubV9lcnJfb3V0OwogCQl9Ci0JCXZpLT5pX3NpemUgPSBzbGU2NF90b19jcHUoCi0JCQkJY3R4LT5hdHRyLT5kYXRhLm5vbl9yZXNpZGVudC5kYXRhX3NpemUpOworCQl2aS0+aV9zaXplID0gc2xlNjRfdG9fY3B1KGEtPmRhdGEubm9uX3Jlc2lkZW50LmRhdGFfc2l6ZSk7CiAJCW5pLT5pbml0aWFsaXplZF9zaXplID0gc2xlNjRfdG9fY3B1KAotCQkJCWN0eC0+YXR0ci0+ZGF0YS5ub25fcmVzaWRlbnQuaW5pdGlhbGl6ZWRfc2l6ZSk7CisJCQkJYS0+ZGF0YS5ub25fcmVzaWRlbnQuaW5pdGlhbGl6ZWRfc2l6ZSk7CiAJCW5pLT5hbGxvY2F0ZWRfc2l6ZSA9IHNsZTY0X3RvX2NwdSgKLQkJCQljdHgtPmF0dHItPmRhdGEubm9uX3Jlc2lkZW50LmFsbG9jYXRlZF9zaXplKTsKKwkJCQlhLT5kYXRhLm5vbl9yZXNpZGVudC5hbGxvY2F0ZWRfc2l6ZSk7CiAJCS8qCiAJCSAqIFdlIGFyZSBkb25lIHdpdGggdGhlIG1mdCByZWNvcmQsIHNvIHdlIHJlbGVhc2UgaXQuIE90aGVyd2lzZQogCQkgKiB3ZSB3b3VsZCBkZWFkbG9jayBpbiBudGZzX2F0dHJfaWdldCgpLgpAQCAtOTU4LDExICs5NTgsMTIgQEAKIAkJCWdvdG8gdW5tX2Vycl9vdXQ7CiAJCX0KIAkJLyogQ29uc2lzdGVuY3kgY2hlY2sgYml0bWFwIHNpemUgdnMuIGluZGV4IGFsbG9jYXRpb24gc2l6ZS4gKi8KLQkJaWYgKChidmktPmlfc2l6ZSA8PCAzKSA8ICh2aS0+aV9zaXplID4+CisJCWJ2aV9zaXplID0gaV9zaXplX3JlYWQoYnZpKTsKKwkJaWYgKChidmlfc2l6ZSA8PCAzKSA8ICh2aS0+aV9zaXplID4+CiAJCQkJbmktPml0eXBlLmluZGV4LmJsb2NrX3NpemVfYml0cykpIHsKIAkJCW50ZnNfZXJyb3IodmktPmlfc2IsICJJbmRleCBiaXRtYXAgdG9vIHNtYWxsICgweCVsbHgpICIKIAkJCQkJImZvciBpbmRleCBhbGxvY2F0aW9uICgweCVsbHgpLiIsCi0JCQkJCWJ2aS0+aV9zaXplIDw8IDMsIHZpLT5pX3NpemUpOworCQkJCQlidmlfc2l6ZSA8PCAzLCB2aS0+aV9zaXplKTsKIAkJCWdvdG8gdW5tX2Vycl9vdXQ7CiAJCX0KIHNraXBfbGFyZ2VfZGlyX3N0dWZmOgpAQCAtMTAxMCw4NyArMTAxMSw5MiBAQAogCQkJbnRmc19lcnJvcih2aS0+aV9zYiwgIiREQVRBIGF0dHJpYnV0ZSBpcyBtaXNzaW5nLiIpOwogCQkJZ290byB1bm1fZXJyX291dDsKIAkJfQorCQlhID0gY3R4LT5hdHRyOwogCQkvKiBTZXR1cCB0aGUgc3RhdGUuICovCi0JCWlmIChjdHgtPmF0dHItPm5vbl9yZXNpZGVudCkgeworCQlpZiAoYS0+bm9uX3Jlc2lkZW50KSB7CiAJCQlOSW5vU2V0Tm9uUmVzaWRlbnQobmkpOwotCQkJaWYgKGN0eC0+YXR0ci0+ZmxhZ3MgJiBBVFRSX0NPTVBSRVNTSU9OX01BU0spIHsKLQkJCQlOSW5vU2V0Q29tcHJlc3NlZChuaSk7Ci0JCQkJaWYgKHZvbC0+Y2x1c3Rlcl9zaXplID4gNDA5NikgewotCQkJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiRm91bmQgIgotCQkJCQkJImNvbXByZXNzZWQgZGF0YSBidXQgIgotCQkJCQkJImNvbXByZXNzaW9uIGlzIGRpc2FibGVkIGR1ZSAiCi0JCQkJCQkidG8gY2x1c3RlciBzaXplICglaSkgPiA0a2lCLiIsCi0JCQkJCQl2b2wtPmNsdXN0ZXJfc2l6ZSk7Ci0JCQkJCWdvdG8gdW5tX2Vycl9vdXQ7CisJCQlpZiAoYS0+ZmxhZ3MgJiAoQVRUUl9DT01QUkVTU0lPTl9NQVNLIHwKKwkJCQkJQVRUUl9JU19TUEFSU0UpKSB7CisJCQkJaWYgKGEtPmZsYWdzICYgQVRUUl9DT01QUkVTU0lPTl9NQVNLKSB7CisJCQkJCU5Jbm9TZXRDb21wcmVzc2VkKG5pKTsKKwkJCQkJaWYgKHZvbC0+Y2x1c3Rlcl9zaXplID4gNDA5NikgeworCQkJCQkJbnRmc19lcnJvcih2aS0+aV9zYiwgIkZvdW5kICIKKwkJCQkJCQkiY29tcHJlc3NlZCBkYXRhIGJ1dCAiCisJCQkJCQkJImNvbXByZXNzaW9uIGlzICIKKwkJCQkJCQkiZGlzYWJsZWQgZHVlIHRvICIKKwkJCQkJCQkiY2x1c3RlciBzaXplICglaSkgPiAiCisJCQkJCQkJIjRraUIuIiwKKwkJCQkJCQl2b2wtPmNsdXN0ZXJfc2l6ZSk7CisJCQkJCQlnb3RvIHVubV9lcnJfb3V0OworCQkJCQl9CisJCQkJCWlmICgoYS0+ZmxhZ3MgJiBBVFRSX0NPTVBSRVNTSU9OX01BU0spCisJCQkJCQkJIT0gQVRUUl9JU19DT01QUkVTU0VEKSB7CisJCQkJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiRm91bmQgIgorCQkJCQkJCSJ1bmtub3duIGNvbXByZXNzaW9uICIKKwkJCQkJCQkibWV0aG9kIG9yIGNvcnJ1cHQgIgorCQkJCQkJCSJmaWxlLiIpOworCQkJCQkJZ290byB1bm1fZXJyX291dDsKKwkJCQkJfQogCQkJCX0KLQkJCQlpZiAoKGN0eC0+YXR0ci0+ZmxhZ3MgJiBBVFRSX0NPTVBSRVNTSU9OX01BU0spCi0JCQkJCQkhPSBBVFRSX0lTX0NPTVBSRVNTRUQpIHsKLQkJCQkJbnRmc19lcnJvcih2aS0+aV9zYiwgIkZvdW5kICIKLQkJCQkJCSJ1bmtub3duIGNvbXByZXNzaW9uIG1ldGhvZCBvciAiCi0JCQkJCQkiY29ycnVwdCBmaWxlLiIpOwotCQkJCQlnb3RvIHVubV9lcnJfb3V0OwotCQkJCX0KLQkJCQluaS0+aXR5cGUuY29tcHJlc3NlZC5ibG9ja19jbHVzdGVycyA9IDFVIDw8Ci0JCQkJCQljdHgtPmF0dHItPmRhdGEubm9uX3Jlc2lkZW50LgotCQkJCQkJY29tcHJlc3Npb25fdW5pdDsKLQkJCQlpZiAoY3R4LT5hdHRyLT5kYXRhLm5vbl9yZXNpZGVudC4KLQkJCQkJCWNvbXByZXNzaW9uX3VuaXQgIT0gNCkgeworCQkJCWlmIChhLT5mbGFncyAmIEFUVFJfSVNfU1BBUlNFKQorCQkJCQlOSW5vU2V0U3BhcnNlKG5pKTsKKwkJCQlpZiAoYS0+ZGF0YS5ub25fcmVzaWRlbnQuY29tcHJlc3Npb25fdW5pdCAhPQorCQkJCQkJNCkgewogCQkJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiRm91bmQgIgogCQkJCQkJIm5vbnN0YW5kYXJkIGNvbXByZXNzaW9uIHVuaXQgIgogCQkJCQkJIigldSBpbnN0ZWFkIG9mIDQpLiAgQ2Fubm90ICIKIAkJCQkJCSJoYW5kbGUgdGhpcy4iLAotCQkJCQkJY3R4LT5hdHRyLT5kYXRhLm5vbl9yZXNpZGVudC4KKwkJCQkJCWEtPmRhdGEubm9uX3Jlc2lkZW50LgogCQkJCQkJY29tcHJlc3Npb25fdW5pdCk7CiAJCQkJCWVyciA9IC1FT1BOT1RTVVBQOwogCQkJCQlnb3RvIHVubV9lcnJfb3V0OwogCQkJCX0KKwkJCQluaS0+aXR5cGUuY29tcHJlc3NlZC5ibG9ja19jbHVzdGVycyA9IDFVIDw8CisJCQkJCQlhLT5kYXRhLm5vbl9yZXNpZGVudC4KKwkJCQkJCWNvbXByZXNzaW9uX3VuaXQ7CiAJCQkJbmktPml0eXBlLmNvbXByZXNzZWQuYmxvY2tfc2l6ZSA9IDFVIDw8ICgKLQkJCQkJCWN0eC0+YXR0ci0+ZGF0YS5ub25fcmVzaWRlbnQuCisJCQkJCQlhLT5kYXRhLm5vbl9yZXNpZGVudC4KIAkJCQkJCWNvbXByZXNzaW9uX3VuaXQgKwogCQkJCQkJdm9sLT5jbHVzdGVyX3NpemVfYml0cyk7CiAJCQkJbmktPml0eXBlLmNvbXByZXNzZWQuYmxvY2tfc2l6ZV9iaXRzID0gZmZzKAotCQkJCQluaS0+aXR5cGUuY29tcHJlc3NlZC5ibG9ja19zaXplKSAtIDE7CisJCQkJCQluaS0+aXR5cGUuY29tcHJlc3NlZC4KKwkJCQkJCWJsb2NrX3NpemUpIC0gMTsKKwkJCQluaS0+aXR5cGUuY29tcHJlc3NlZC5zaXplID0gc2xlNjRfdG9fY3B1KAorCQkJCQkJYS0+ZGF0YS5ub25fcmVzaWRlbnQuCisJCQkJCQljb21wcmVzc2VkX3NpemUpOwogCQkJfQotCQkJaWYgKGN0eC0+YXR0ci0+ZmxhZ3MgJiBBVFRSX0lTX0VOQ1JZUFRFRCkgewotCQkJCWlmIChjdHgtPmF0dHItPmZsYWdzICYgQVRUUl9DT01QUkVTU0lPTl9NQVNLKSB7CisJCQlpZiAoYS0+ZmxhZ3MgJiBBVFRSX0lTX0VOQ1JZUFRFRCkgeworCQkJCWlmIChhLT5mbGFncyAmIEFUVFJfQ09NUFJFU1NJT05fTUFTSykgewogCQkJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiRm91bmQgZW5jcnlwdGVkICIKIAkJCQkJCQkiYW5kIGNvbXByZXNzZWQgZGF0YS4iKTsKIAkJCQkJZ290byB1bm1fZXJyX291dDsKIAkJCQl9CiAJCQkJTklub1NldEVuY3J5cHRlZChuaSk7CiAJCQl9Ci0JCQlpZiAoY3R4LT5hdHRyLT5mbGFncyAmIEFUVFJfSVNfU1BBUlNFKQotCQkJCU5Jbm9TZXRTcGFyc2UobmkpOwotCQkJaWYgKGN0eC0+YXR0ci0+ZGF0YS5ub25fcmVzaWRlbnQubG93ZXN0X3ZjbikgeworCQkJaWYgKGEtPmRhdGEubm9uX3Jlc2lkZW50Lmxvd2VzdF92Y24pIHsKIAkJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiRmlyc3QgZXh0ZW50IG9mICREQVRBICIKIAkJCQkJCSJhdHRyaWJ1dGUgaGFzIG5vbiB6ZXJvICIKIAkJCQkJCSJsb3dlc3RfdmNuLiIpOwogCQkJCWdvdG8gdW5tX2Vycl9vdXQ7CiAJCQl9Ci0JCQkvKiBTZXR1cCBhbGwgdGhlIHNpemVzLiAqLwogCQkJdmktPmlfc2l6ZSA9IHNsZTY0X3RvX2NwdSgKLQkJCQkJY3R4LT5hdHRyLT5kYXRhLm5vbl9yZXNpZGVudC5kYXRhX3NpemUpOworCQkJCQlhLT5kYXRhLm5vbl9yZXNpZGVudC5kYXRhX3NpemUpOwogCQkJbmktPmluaXRpYWxpemVkX3NpemUgPSBzbGU2NF90b19jcHUoCi0JCQkJCWN0eC0+YXR0ci0+ZGF0YS5ub25fcmVzaWRlbnQuCi0JCQkJCWluaXRpYWxpemVkX3NpemUpOworCQkJCQlhLT5kYXRhLm5vbl9yZXNpZGVudC5pbml0aWFsaXplZF9zaXplKTsKIAkJCW5pLT5hbGxvY2F0ZWRfc2l6ZSA9IHNsZTY0X3RvX2NwdSgKLQkJCQkJY3R4LT5hdHRyLT5kYXRhLm5vbl9yZXNpZGVudC4KLQkJCQkJYWxsb2NhdGVkX3NpemUpOwotCQkJaWYgKE5Jbm9Db21wcmVzc2VkKG5pKSkgewotCQkJCW5pLT5pdHlwZS5jb21wcmVzc2VkLnNpemUgPSBzbGU2NF90b19jcHUoCi0JCQkJCQljdHgtPmF0dHItPmRhdGEubm9uX3Jlc2lkZW50LgotCQkJCQkJY29tcHJlc3NlZF9zaXplKTsKLQkJCX0KKwkJCQkJYS0+ZGF0YS5ub25fcmVzaWRlbnQuYWxsb2NhdGVkX3NpemUpOwogCQl9IGVsc2UgeyAvKiBSZXNpZGVudCBhdHRyaWJ1dGUuICovCi0JCQkvKgotCQkJICogTWFrZSBhbGwgc2l6ZXMgZXF1YWwgZm9yIHNpbXBsaWNpdHkgaW4gcmVhZCBjb2RlCi0JCQkgKiBwYXRocy4gRklYTUU6IE5lZWQgdG8ga2VlcCB0aGlzIGluIG1pbmQgd2hlbgotCQkJICogY29udmVydGluZyB0byBub24tcmVzaWRlbnQgYXR0cmlidXRlIGluIHdyaXRlIGNvZGUKLQkJCSAqIHBhdGguIChQcm9iYWJseSBvbmx5IGFmZmVjdHMgdHJ1bmNhdGUoKS4pCi0JCQkgKi8KLQkJCXZpLT5pX3NpemUgPSBuaS0+aW5pdGlhbGl6ZWRfc2l6ZSA9IG5pLT5hbGxvY2F0ZWRfc2l6ZSA9Ci0JCQkJCWxlMzJfdG9fY3B1KAotCQkJCQljdHgtPmF0dHItPmRhdGEucmVzaWRlbnQudmFsdWVfbGVuZ3RoKTsKKwkJCXZpLT5pX3NpemUgPSBuaS0+aW5pdGlhbGl6ZWRfc2l6ZSA9IGxlMzJfdG9fY3B1KAorCQkJCQlhLT5kYXRhLnJlc2lkZW50LnZhbHVlX2xlbmd0aCk7CisJCQluaS0+YWxsb2NhdGVkX3NpemUgPSBsZTMyX3RvX2NwdShhLT5sZW5ndGgpIC0KKwkJCQkJbGUxNl90b19jcHUoCisJCQkJCWEtPmRhdGEucmVzaWRlbnQudmFsdWVfb2Zmc2V0KTsKKwkJCWlmICh2aS0+aV9zaXplID4gbmktPmFsbG9jYXRlZF9zaXplKSB7CisJCQkJbnRmc19lcnJvcih2aS0+aV9zYiwgIlJlc2lkZW50IGRhdGEgYXR0cmlidXRlICIKKwkJCQkJCSJpcyBjb3JydXB0IChzaXplIGV4Y2VlZHMgIgorCQkJCQkJImFsbG9jYXRpb24pLiIpOworCQkJCWdvdG8gdW5tX2Vycl9vdXQ7CisJCQl9CiAJCX0KIG5vX2RhdGFfYXR0cl9zcGVjaWFsX2Nhc2U6CiAJCS8qIFdlIGFyZSBkb25lIHdpdGggdGhlIG1mdCByZWNvcmQsIHNvIHdlIHJlbGVhc2UgaXQuICovCkBAIC0xMTE3LDExICsxMTIzLDEwIEBACiAJICogc2l6ZXMgb2YgYWxsIG5vbi1yZXNpZGVudCBhdHRyaWJ1dGVzIHByZXNlbnQgdG8gZ2l2ZSB1cyB0aGUgTGludXgKIAkgKiBjb3JyZWN0IHNpemUgdGhhdCBzaG91bGQgZ28gaW50byBpX2Jsb2NrcyAoYWZ0ZXIgZGl2aXNpb24gYnkgNTEyKS4KIAkgKi8KLQlpZiAoU19JU0RJUih2aS0+aV9tb2RlKSB8fCAhTklub0NvbXByZXNzZWQobmkpKQotCQl2aS0+aV9ibG9ja3MgPSBuaS0+YWxsb2NhdGVkX3NpemUgPj4gOTsKLQllbHNlCisJaWYgKFNfSVNSRUcodmktPmlfbW9kZSkgJiYgKE5Jbm9Db21wcmVzc2VkKG5pKSB8fCBOSW5vU3BhcnNlKG5pKSkpCiAJCXZpLT5pX2Jsb2NrcyA9IG5pLT5pdHlwZS5jb21wcmVzc2VkLnNpemUgPj4gOTsKLQorCWVsc2UKKwkJdmktPmlfYmxvY2tzID0gbmktPmFsbG9jYXRlZF9zaXplID4+IDk7CiAJbnRmc19kZWJ1ZygiRG9uZS4iKTsKIAlyZXR1cm4gMDsKIApAQCAtMTE2Niw2ICsxMTcxLDcgQEAKIAludGZzX3ZvbHVtZSAqdm9sID0gTlRGU19TQih2aS0+aV9zYik7CiAJbnRmc19pbm9kZSAqbmksICpiYXNlX25pOwogCU1GVF9SRUNPUkQgKm07CisJQVRUUl9SRUNPUkQgKmE7CiAJbnRmc19hdHRyX3NlYXJjaF9jdHggKmN0eDsKIAlpbnQgZXJyID0gMDsKIApAQCAtMTIwMCwyNCArMTIwNiwyMSBAQAogCQllcnIgPSAtRU5PTUVNOwogCQlnb3RvIHVubV9lcnJfb3V0OwogCX0KLQogCS8qIEZpbmQgdGhlIGF0dHJpYnV0ZS4gKi8KIAllcnIgPSBudGZzX2F0dHJfbG9va3VwKG5pLT50eXBlLCBuaS0+bmFtZSwgbmktPm5hbWVfbGVuLAogCQkJQ0FTRV9TRU5TSVRJVkUsIDAsIE5VTEwsIDAsIGN0eCk7CiAJaWYgKHVubGlrZWx5KGVycikpCiAJCWdvdG8gdW5tX2Vycl9vdXQ7Ci0KLQlpZiAoIWN0eC0+YXR0ci0+bm9uX3Jlc2lkZW50KSB7CisJYSA9IGN0eC0+YXR0cjsKKwlpZiAoIWEtPm5vbl9yZXNpZGVudCkgewogCQkvKiBFbnN1cmUgdGhlIGF0dHJpYnV0ZSBuYW1lIGlzIHBsYWNlZCBiZWZvcmUgdGhlIHZhbHVlLiAqLwotCQlpZiAodW5saWtlbHkoY3R4LT5hdHRyLT5uYW1lX2xlbmd0aCAmJgotCQkJCShsZTE2X3RvX2NwdShjdHgtPmF0dHItPm5hbWVfb2Zmc2V0KSA+PQotCQkJCWxlMTZfdG9fY3B1KGN0eC0+YXR0ci0+ZGF0YS5yZXNpZGVudC4KLQkJCQl2YWx1ZV9vZmZzZXQpKSkpIHsKKwkJaWYgKHVubGlrZWx5KGEtPm5hbWVfbGVuZ3RoICYmIChsZTE2X3RvX2NwdShhLT5uYW1lX29mZnNldCkgPj0KKwkJCQlsZTE2X3RvX2NwdShhLT5kYXRhLnJlc2lkZW50LnZhbHVlX29mZnNldCkpKSkgewogCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiQXR0cmlidXRlIG5hbWUgaXMgcGxhY2VkIGFmdGVyICIKIAkJCQkJInRoZSBhdHRyaWJ1dGUgdmFsdWUuIik7CiAJCQlnb3RvIHVubV9lcnJfb3V0OwogCQl9Ci0JCWlmIChOSW5vTXN0UHJvdGVjdGVkKG5pKSB8fCBjdHgtPmF0dHItPmZsYWdzKSB7CisJCWlmIChOSW5vTXN0UHJvdGVjdGVkKG5pKSB8fCBhLT5mbGFncykgewogCQkJbnRmc19lcnJvcih2aS0+aV9zYiwgIkZvdW5kIG1zdCBwcm90ZWN0ZWQgYXR0cmlidXRlICIKIAkJCQkJIm9yIGF0dHJpYnV0ZSB3aXRoIG5vbi16ZXJvIGZsYWdzIGJ1dCAiCiAJCQkJCSJ0aGUgYXR0cmlidXRlIGlzIHJlc2lkZW50LiAgUGxlYXNlICIKQEAgLTEyMjUsODUgKzEyMjgsOTUgQEAKIAkJCQkJImxpbnV4LW50ZnMtZGV2QGxpc3RzLnNvdXJjZWZvcmdlLm5ldCIpOwogCQkJZ290byB1bm1fZXJyX291dDsKIAkJfQotCQkvKgotCQkgKiBSZXNpZGVudCBhdHRyaWJ1dGUuIE1ha2UgYWxsIHNpemVzIGVxdWFsIGZvciBzaW1wbGljaXR5IGluCi0JCSAqIHJlYWQgY29kZSBwYXRocy4KLQkJICovCi0JCXZpLT5pX3NpemUgPSBuaS0+aW5pdGlhbGl6ZWRfc2l6ZSA9IG5pLT5hbGxvY2F0ZWRfc2l6ZSA9Ci0JCQlsZTMyX3RvX2NwdShjdHgtPmF0dHItPmRhdGEucmVzaWRlbnQudmFsdWVfbGVuZ3RoKTsKKwkJdmktPmlfc2l6ZSA9IG5pLT5pbml0aWFsaXplZF9zaXplID0gbGUzMl90b19jcHUoCisJCQkJYS0+ZGF0YS5yZXNpZGVudC52YWx1ZV9sZW5ndGgpOworCQluaS0+YWxsb2NhdGVkX3NpemUgPSBsZTMyX3RvX2NwdShhLT5sZW5ndGgpIC0KKwkJCQlsZTE2X3RvX2NwdShhLT5kYXRhLnJlc2lkZW50LnZhbHVlX29mZnNldCk7CisJCWlmICh2aS0+aV9zaXplID4gbmktPmFsbG9jYXRlZF9zaXplKSB7CisJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiUmVzaWRlbnQgYXR0cmlidXRlIGlzIGNvcnJ1cHQgIgorCQkJCQkiKHNpemUgZXhjZWVkcyBhbGxvY2F0aW9uKS4iKTsKKwkJCWdvdG8gdW5tX2Vycl9vdXQ7CisJCX0KIAl9IGVsc2UgewogCQlOSW5vU2V0Tm9uUmVzaWRlbnQobmkpOwogCQkvKgogCQkgKiBFbnN1cmUgdGhlIGF0dHJpYnV0ZSBuYW1lIGlzIHBsYWNlZCBiZWZvcmUgdGhlIG1hcHBpbmcgcGFpcnMKIAkJICogYXJyYXkuCiAJCSAqLwotCQlpZiAodW5saWtlbHkoY3R4LT5hdHRyLT5uYW1lX2xlbmd0aCAmJgotCQkJCShsZTE2X3RvX2NwdShjdHgtPmF0dHItPm5hbWVfb2Zmc2V0KSA+PQotCQkJCWxlMTZfdG9fY3B1KGN0eC0+YXR0ci0+ZGF0YS5ub25fcmVzaWRlbnQuCi0JCQkJbWFwcGluZ19wYWlyc19vZmZzZXQpKSkpIHsKKwkJaWYgKHVubGlrZWx5KGEtPm5hbWVfbGVuZ3RoICYmIChsZTE2X3RvX2NwdShhLT5uYW1lX29mZnNldCkgPj0KKwkJCQlsZTE2X3RvX2NwdSgKKwkJCQlhLT5kYXRhLm5vbl9yZXNpZGVudC5tYXBwaW5nX3BhaXJzX29mZnNldCkpKSkgewogCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiQXR0cmlidXRlIG5hbWUgaXMgcGxhY2VkIGFmdGVyICIKIAkJCQkJInRoZSBtYXBwaW5nIHBhaXJzIGFycmF5LiIpOwogCQkJZ290byB1bm1fZXJyX291dDsKIAkJfQotCQlpZiAoY3R4LT5hdHRyLT5mbGFncyAmIEFUVFJfQ09NUFJFU1NJT05fTUFTSykgeworCQlpZiAoYS0+ZmxhZ3MgJiAoQVRUUl9DT01QUkVTU0lPTl9NQVNLIHwgQVRUUl9JU19TUEFSU0UpKSB7CisJCQlpZiAoYS0+ZmxhZ3MgJiBBVFRSX0NPTVBSRVNTSU9OX01BU0spIHsKKwkJCQlOSW5vU2V0Q29tcHJlc3NlZChuaSk7CisJCQkJaWYgKChuaS0+dHlwZSAhPSBBVF9EQVRBKSB8fCAobmktPnR5cGUgPT0KKwkJCQkJCUFUX0RBVEEgJiYgbmktPm5hbWVfbGVuKSkgeworCQkJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiRm91bmQgY29tcHJlc3NlZCAiCisJCQkJCQkJIm5vbi1kYXRhIG9yIG5hbWVkICIKKwkJCQkJCQkiZGF0YSBhdHRyaWJ1dGUuICAiCisJCQkJCQkJIlBsZWFzZSByZXBvcnQgeW91ICIKKwkJCQkJCQkic2F3IHRoaXMgbWVzc2FnZSB0byAiCisJCQkJCQkJImxpbnV4LW50ZnMtZGV2QGxpc3RzLiIKKwkJCQkJCQkic291cmNlZm9yZ2UubmV0Iik7CisJCQkJCWdvdG8gdW5tX2Vycl9vdXQ7CisJCQkJfQorCQkJCWlmICh2b2wtPmNsdXN0ZXJfc2l6ZSA+IDQwOTYpIHsKKwkJCQkJbnRmc19lcnJvcih2aS0+aV9zYiwgIkZvdW5kIGNvbXByZXNzZWQgIgorCQkJCQkJCSJhdHRyaWJ1dGUgYnV0ICIKKwkJCQkJCQkiY29tcHJlc3Npb24gaXMgIgorCQkJCQkJCSJkaXNhYmxlZCBkdWUgdG8gIgorCQkJCQkJCSJjbHVzdGVyIHNpemUgKCVpKSA+ICIKKwkJCQkJCQkiNGtpQi4iLAorCQkJCQkJCXZvbC0+Y2x1c3Rlcl9zaXplKTsKKwkJCQkJZ290byB1bm1fZXJyX291dDsKKwkJCQl9CisJCQkJaWYgKChhLT5mbGFncyAmIEFUVFJfQ09NUFJFU1NJT05fTUFTSykgIT0KKwkJCQkJCUFUVFJfSVNfQ09NUFJFU1NFRCkgeworCQkJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiRm91bmQgdW5rbm93biAiCisJCQkJCQkJImNvbXByZXNzaW9uIG1ldGhvZC4iKTsKKwkJCQkJZ290byB1bm1fZXJyX291dDsKKwkJCQl9CisJCQl9CiAJCQlpZiAoTklub01zdFByb3RlY3RlZChuaSkpIHsKIAkJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiRm91bmQgbXN0IHByb3RlY3RlZCAiCiAJCQkJCQkiYXR0cmlidXRlIGJ1dCB0aGUgYXR0cmlidXRlICIKLQkJCQkJCSJpcyBjb21wcmVzc2VkLiAgUGxlYXNlIHJlcG9ydCAiCi0JCQkJCQkieW91IHNhdyB0aGlzIG1lc3NhZ2UgdG8gIgorCQkJCQkJImlzICVzLiAgUGxlYXNlIHJlcG9ydCB5b3UgIgorCQkJCQkJInNhdyB0aGlzIG1lc3NhZ2UgdG8gIgogCQkJCQkJImxpbnV4LW50ZnMtZGV2QGxpc3RzLiIKLQkJCQkJCSJzb3VyY2Vmb3JnZS5uZXQiKTsKKwkJCQkJCSJzb3VyY2Vmb3JnZS5uZXQiLAorCQkJCQkJTklub0NvbXByZXNzZWQobmkpID8KKwkJCQkJCSJjb21wcmVzc2VkIiA6ICJzcGFyc2UiKTsKIAkJCQlnb3RvIHVubV9lcnJfb3V0OwogCQkJfQotCQkJTklub1NldENvbXByZXNzZWQobmkpOwotCQkJaWYgKChuaS0+dHlwZSAhPSBBVF9EQVRBKSB8fCAobmktPnR5cGUgPT0gQVRfREFUQSAmJgotCQkJCQluaS0+bmFtZV9sZW4pKSB7Ci0JCQkJbnRmc19lcnJvcih2aS0+aV9zYiwgIkZvdW5kIGNvbXByZXNzZWQgIgotCQkJCQkJIm5vbi1kYXRhIG9yIG5hbWVkIGRhdGEgIgotCQkJCQkJImF0dHJpYnV0ZS4gIFBsZWFzZSByZXBvcnQgIgotCQkJCQkJInlvdSBzYXcgdGhpcyBtZXNzYWdlIHRvICIKLQkJCQkJCSJsaW51eC1udGZzLWRldkBsaXN0cy4iCi0JCQkJCQkic291cmNlZm9yZ2UubmV0Iik7Ci0JCQkJZ290byB1bm1fZXJyX291dDsKLQkJCX0KLQkJCWlmICh2b2wtPmNsdXN0ZXJfc2l6ZSA+IDQwOTYpIHsKLQkJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiRm91bmQgY29tcHJlc3NlZCAiCi0JCQkJCQkiYXR0cmlidXRlIGJ1dCBjb21wcmVzc2lvbiBpcyAiCi0JCQkJCQkiZGlzYWJsZWQgZHVlIHRvIGNsdXN0ZXIgc2l6ZSAiCi0JCQkJCQkiKCVpKSA+IDRraUIuIiwKLQkJCQkJCXZvbC0+Y2x1c3Rlcl9zaXplKTsKLQkJCQlnb3RvIHVubV9lcnJfb3V0OwotCQkJfQotCQkJaWYgKChjdHgtPmF0dHItPmZsYWdzICYgQVRUUl9DT01QUkVTU0lPTl9NQVNLKQotCQkJCQkhPSBBVFRSX0lTX0NPTVBSRVNTRUQpIHsKLQkJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiRm91bmQgdW5rbm93biAiCi0JCQkJCQkiY29tcHJlc3Npb24gbWV0aG9kLiIpOwotCQkJCWdvdG8gdW5tX2Vycl9vdXQ7Ci0JCQl9Ci0JCQluaS0+aXR5cGUuY29tcHJlc3NlZC5ibG9ja19jbHVzdGVycyA9IDFVIDw8Ci0JCQkJCWN0eC0+YXR0ci0+ZGF0YS5ub25fcmVzaWRlbnQuCi0JCQkJCWNvbXByZXNzaW9uX3VuaXQ7Ci0JCQlpZiAoY3R4LT5hdHRyLT5kYXRhLm5vbl9yZXNpZGVudC5jb21wcmVzc2lvbl91bml0ICE9Ci0JCQkJCTQpIHsKKwkJCWlmIChhLT5mbGFncyAmIEFUVFJfSVNfU1BBUlNFKQorCQkJCU5Jbm9TZXRTcGFyc2UobmkpOworCQkJaWYgKGEtPmRhdGEubm9uX3Jlc2lkZW50LmNvbXByZXNzaW9uX3VuaXQgIT0gNCkgewogCQkJCW50ZnNfZXJyb3IodmktPmlfc2IsICJGb3VuZCBub25zdGFuZGFyZCAiCiAJCQkJCQkiY29tcHJlc3Npb24gdW5pdCAoJXUgaW5zdGVhZCAiCiAJCQkJCQkib2YgNCkuICBDYW5ub3QgaGFuZGxlIHRoaXMuIiwKLQkJCQkJCWN0eC0+YXR0ci0+ZGF0YS5ub25fcmVzaWRlbnQuCisJCQkJCQlhLT5kYXRhLm5vbl9yZXNpZGVudC4KIAkJCQkJCWNvbXByZXNzaW9uX3VuaXQpOwogCQkJCWVyciA9IC1FT1BOT1RTVVBQOwogCQkJCWdvdG8gdW5tX2Vycl9vdXQ7CiAJCQl9CisJCQluaS0+aXR5cGUuY29tcHJlc3NlZC5ibG9ja19jbHVzdGVycyA9IDFVIDw8CisJCQkJCWEtPmRhdGEubm9uX3Jlc2lkZW50LmNvbXByZXNzaW9uX3VuaXQ7CiAJCQluaS0+aXR5cGUuY29tcHJlc3NlZC5ibG9ja19zaXplID0gMVUgPDwgKAotCQkJCQljdHgtPmF0dHItPmRhdGEubm9uX3Jlc2lkZW50LgotCQkJCQljb21wcmVzc2lvbl91bml0ICsKKwkJCQkJYS0+ZGF0YS5ub25fcmVzaWRlbnQuY29tcHJlc3Npb25fdW5pdCArCiAJCQkJCXZvbC0+Y2x1c3Rlcl9zaXplX2JpdHMpOwogCQkJbmktPml0eXBlLmNvbXByZXNzZWQuYmxvY2tfc2l6ZV9iaXRzID0gZmZzKAotCQkJCW5pLT5pdHlwZS5jb21wcmVzc2VkLmJsb2NrX3NpemUpIC0gMTsKKwkJCQkJbmktPml0eXBlLmNvbXByZXNzZWQuYmxvY2tfc2l6ZSkgLSAxOworCQkJbmktPml0eXBlLmNvbXByZXNzZWQuc2l6ZSA9IHNsZTY0X3RvX2NwdSgKKwkJCQkJYS0+ZGF0YS5ub25fcmVzaWRlbnQuY29tcHJlc3NlZF9zaXplKTsKIAkJfQotCQlpZiAoY3R4LT5hdHRyLT5mbGFncyAmIEFUVFJfSVNfRU5DUllQVEVEKSB7Ci0JCQlpZiAoY3R4LT5hdHRyLT5mbGFncyAmIEFUVFJfQ09NUFJFU1NJT05fTUFTSykgewotCQkJCW50ZnNfZXJyb3IodmktPmlfc2IsICJGb3VuZCBlbmNyeXB0ZWQgIgotCQkJCQkJImFuZCBjb21wcmVzc2VkIGRhdGEuIik7CisJCWlmIChhLT5mbGFncyAmIEFUVFJfSVNfRU5DUllQVEVEKSB7CisJCQlpZiAoYS0+ZmxhZ3MgJiBBVFRSX0NPTVBSRVNTSU9OX01BU0spIHsKKwkJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiRm91bmQgZW5jcnlwdGVkIGFuZCAiCisJCQkJCQkiY29tcHJlc3NlZCBkYXRhLiIpOwogCQkJCWdvdG8gdW5tX2Vycl9vdXQ7CiAJCQl9CiAJCQlpZiAoTklub01zdFByb3RlY3RlZChuaSkpIHsKQEAgLTEzMTcsMzcgKzEzMzAsMTcgQEAKIAkJCX0KIAkJCU5Jbm9TZXRFbmNyeXB0ZWQobmkpOwogCQl9Ci0JCWlmIChjdHgtPmF0dHItPmZsYWdzICYgQVRUUl9JU19TUEFSU0UpIHsKLQkJCWlmIChOSW5vTXN0UHJvdGVjdGVkKG5pKSkgewotCQkJCW50ZnNfZXJyb3IodmktPmlfc2IsICJGb3VuZCBtc3QgcHJvdGVjdGVkICIKLQkJCQkJCSJhdHRyaWJ1dGUgYnV0IHRoZSBhdHRyaWJ1dGUgIgotCQkJCQkJImlzIHNwYXJzZS4gIFBsZWFzZSByZXBvcnQgIgotCQkJCQkJInlvdSBzYXcgdGhpcyBtZXNzYWdlIHRvICIKLQkJCQkJCSJsaW51eC1udGZzLWRldkBsaXN0cy4iCi0JCQkJCQkic291cmNlZm9yZ2UubmV0Iik7Ci0JCQkJZ290byB1bm1fZXJyX291dDsKLQkJCX0KLQkJCU5Jbm9TZXRTcGFyc2UobmkpOwotCQl9Ci0JCWlmIChjdHgtPmF0dHItPmRhdGEubm9uX3Jlc2lkZW50Lmxvd2VzdF92Y24pIHsKKwkJaWYgKGEtPmRhdGEubm9uX3Jlc2lkZW50Lmxvd2VzdF92Y24pIHsKIAkJCW50ZnNfZXJyb3IodmktPmlfc2IsICJGaXJzdCBleHRlbnQgb2YgYXR0cmlidXRlIGhhcyAiCiAJCQkJCSJub24temVybyBsb3dlc3RfdmNuLiIpOwogCQkJZ290byB1bm1fZXJyX291dDsKIAkJfQotCQkvKiBTZXR1cCBhbGwgdGhlIHNpemVzLiAqLwotCQl2aS0+aV9zaXplID0gc2xlNjRfdG9fY3B1KAotCQkJCWN0eC0+YXR0ci0+ZGF0YS5ub25fcmVzaWRlbnQuZGF0YV9zaXplKTsKKwkJdmktPmlfc2l6ZSA9IHNsZTY0X3RvX2NwdShhLT5kYXRhLm5vbl9yZXNpZGVudC5kYXRhX3NpemUpOwogCQluaS0+aW5pdGlhbGl6ZWRfc2l6ZSA9IHNsZTY0X3RvX2NwdSgKLQkJCQljdHgtPmF0dHItPmRhdGEubm9uX3Jlc2lkZW50LmluaXRpYWxpemVkX3NpemUpOworCQkJCWEtPmRhdGEubm9uX3Jlc2lkZW50LmluaXRpYWxpemVkX3NpemUpOwogCQluaS0+YWxsb2NhdGVkX3NpemUgPSBzbGU2NF90b19jcHUoCi0JCQkJY3R4LT5hdHRyLT5kYXRhLm5vbl9yZXNpZGVudC5hbGxvY2F0ZWRfc2l6ZSk7Ci0JCWlmIChOSW5vQ29tcHJlc3NlZChuaSkpIHsKLQkJCW5pLT5pdHlwZS5jb21wcmVzc2VkLnNpemUgPSBzbGU2NF90b19jcHUoCi0JCQkJCWN0eC0+YXR0ci0+ZGF0YS5ub25fcmVzaWRlbnQuCi0JCQkJCWNvbXByZXNzZWRfc2l6ZSk7Ci0JCX0KKwkJCQlhLT5kYXRhLm5vbl9yZXNpZGVudC5hbGxvY2F0ZWRfc2l6ZSk7CiAJfQotCiAJLyogU2V0dXAgdGhlIG9wZXJhdGlvbnMgZm9yIHRoaXMgYXR0cmlidXRlIGlub2RlLiAqLwogCXZpLT5pX29wID0gTlVMTDsKIAl2aS0+aV9mb3AgPSBOVUxMOwpAQCAtMTM1NSwxMiArMTM0OCwxMCBAQAogCQl2aS0+aV9tYXBwaW5nLT5hX29wcyA9ICZudGZzX21zdF9hb3BzOwogCWVsc2UKIAkJdmktPmlfbWFwcGluZy0+YV9vcHMgPSAmbnRmc19hb3BzOwotCi0JaWYgKCFOSW5vQ29tcHJlc3NlZChuaSkpCi0JCXZpLT5pX2Jsb2NrcyA9IG5pLT5hbGxvY2F0ZWRfc2l6ZSA+PiA5OwotCWVsc2UKKwlpZiAoTklub0NvbXByZXNzZWQobmkpIHx8IE5Jbm9TcGFyc2UobmkpKQogCQl2aS0+aV9ibG9ja3MgPSBuaS0+aXR5cGUuY29tcHJlc3NlZC5zaXplID4+IDk7Ci0KKwllbHNlCisJCXZpLT5pX2Jsb2NrcyA9IG5pLT5hbGxvY2F0ZWRfc2l6ZSA+PiA5OwogCS8qCiAJICogTWFrZSBzdXJlIHRoZSBiYXNlIGlub2RlIGRvZXNuJ3QgZ28gYXdheSBhbmQgYXR0YWNoIGl0IHRvIHRoZQogCSAqIGF0dHJpYnV0ZSBpbm9kZS4KQEAgLTE0MjksMTAgKzE0MjAsMTIgQEAKICAqLwogc3RhdGljIGludCBudGZzX3JlYWRfbG9ja2VkX2luZGV4X2lub2RlKHN0cnVjdCBpbm9kZSAqYmFzZV92aSwgc3RydWN0IGlub2RlICp2aSkKIHsKKwlsb2ZmX3QgYnZpX3NpemU7CiAJbnRmc192b2x1bWUgKnZvbCA9IE5URlNfU0IodmktPmlfc2IpOwogCW50ZnNfaW5vZGUgKm5pLCAqYmFzZV9uaSwgKmJuaTsKIAlzdHJ1Y3QgaW5vZGUgKmJ2aTsKIAlNRlRfUkVDT1JEICptOworCUFUVFJfUkVDT1JEICphOwogCW50ZnNfYXR0cl9zZWFyY2hfY3R4ICpjdHg7CiAJSU5ERVhfUk9PVCAqaXI7CiAJdTggKmlyX2VuZCwgKmluZGV4X2VuZDsKQEAgLTE0NzQsMzAgKzE0NjcsMjggQEAKIAkJCQkJIm1pc3NpbmcuIik7CiAJCWdvdG8gdW5tX2Vycl9vdXQ7CiAJfQorCWEgPSBjdHgtPmF0dHI7CiAJLyogU2V0IHVwIHRoZSBzdGF0ZS4gKi8KLQlpZiAodW5saWtlbHkoY3R4LT5hdHRyLT5ub25fcmVzaWRlbnQpKSB7CisJaWYgKHVubGlrZWx5KGEtPm5vbl9yZXNpZGVudCkpIHsKIAkJbnRmc19lcnJvcih2b2wtPnNiLCAiJElOREVYX1JPT1QgYXR0cmlidXRlIGlzIG5vdCByZXNpZGVudC4iKTsKIAkJZ290byB1bm1fZXJyX291dDsKIAl9CiAJLyogRW5zdXJlIHRoZSBhdHRyaWJ1dGUgbmFtZSBpcyBwbGFjZWQgYmVmb3JlIHRoZSB2YWx1ZS4gKi8KLQlpZiAodW5saWtlbHkoY3R4LT5hdHRyLT5uYW1lX2xlbmd0aCAmJgotCQkJKGxlMTZfdG9fY3B1KGN0eC0+YXR0ci0+bmFtZV9vZmZzZXQpID49Ci0JCQlsZTE2X3RvX2NwdShjdHgtPmF0dHItPmRhdGEucmVzaWRlbnQuCi0JCQl2YWx1ZV9vZmZzZXQpKSkpIHsKKwlpZiAodW5saWtlbHkoYS0+bmFtZV9sZW5ndGggJiYgKGxlMTZfdG9fY3B1KGEtPm5hbWVfb2Zmc2V0KSA+PQorCQkJbGUxNl90b19jcHUoYS0+ZGF0YS5yZXNpZGVudC52YWx1ZV9vZmZzZXQpKSkpIHsKIAkJbnRmc19lcnJvcih2b2wtPnNiLCAiJElOREVYX1JPT1QgYXR0cmlidXRlIG5hbWUgaXMgcGxhY2VkICIKIAkJCQkiYWZ0ZXIgdGhlIGF0dHJpYnV0ZSB2YWx1ZS4iKTsKIAkJZ290byB1bm1fZXJyX291dDsKIAl9CiAJLyogQ29tcHJlc3NlZC9lbmNyeXB0ZWQvc3BhcnNlIGluZGV4IHJvb3QgaXMgbm90IGFsbG93ZWQuICovCi0JaWYgKGN0eC0+YXR0ci0+ZmxhZ3MgJiAoQVRUUl9DT01QUkVTU0lPTl9NQVNLIHwgQVRUUl9JU19FTkNSWVBURUQgfAorCWlmIChhLT5mbGFncyAmIChBVFRSX0NPTVBSRVNTSU9OX01BU0sgfCBBVFRSX0lTX0VOQ1JZUFRFRCB8CiAJCQlBVFRSX0lTX1NQQVJTRSkpIHsKIAkJbnRmc19lcnJvcih2aS0+aV9zYiwgIkZvdW5kIGNvbXByZXNzZWQvZW5jcnlwdGVkL3NwYXJzZSBpbmRleCAiCiAJCQkJInJvb3QgYXR0cmlidXRlLiIpOwogCQlnb3RvIHVubV9lcnJfb3V0OwogCX0KLQlpciA9IChJTkRFWF9ST09UKikoKHU4KiljdHgtPmF0dHIgKwotCQkJbGUxNl90b19jcHUoY3R4LT5hdHRyLT5kYXRhLnJlc2lkZW50LnZhbHVlX29mZnNldCkpOwotCWlyX2VuZCA9ICh1OCopaXIgKyBsZTMyX3RvX2NwdShjdHgtPmF0dHItPmRhdGEucmVzaWRlbnQudmFsdWVfbGVuZ3RoKTsKKwlpciA9IChJTkRFWF9ST09UKikoKHU4KilhICsgbGUxNl90b19jcHUoYS0+ZGF0YS5yZXNpZGVudC52YWx1ZV9vZmZzZXQpKTsKKwlpcl9lbmQgPSAodTgqKWlyICsgbGUzMl90b19jcHUoYS0+ZGF0YS5yZXNpZGVudC52YWx1ZV9sZW5ndGgpOwogCWlmIChpcl9lbmQgPiAodTgqKWN0eC0+bXJlYyArIHZvbC0+bWZ0X3JlY29yZF9zaXplKSB7CiAJCW50ZnNfZXJyb3IodmktPmlfc2IsICIkSU5ERVhfUk9PVCBhdHRyaWJ1dGUgaXMgY29ycnVwdC4iKTsKIAkJZ290byB1bm1fZXJyX291dDsKQEAgLTE1NzAsNyArMTU2MSw3IEBACiAJCQkJCSIkSU5ERVhfQUxMT0NBVElPTiBhdHRyaWJ1dGUuIik7CiAJCWdvdG8gdW5tX2Vycl9vdXQ7CiAJfQotCWlmICghY3R4LT5hdHRyLT5ub25fcmVzaWRlbnQpIHsKKwlpZiAoIWEtPm5vbl9yZXNpZGVudCkgewogCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiJElOREVYX0FMTE9DQVRJT04gYXR0cmlidXRlIGlzICIKIAkJCQkicmVzaWRlbnQuIik7CiAJCWdvdG8gdW5tX2Vycl9vdXQ7CkBAIC0xNTc4LDM3ICsxNTY5LDM2IEBACiAJLyoKIAkgKiBFbnN1cmUgdGhlIGF0dHJpYnV0ZSBuYW1lIGlzIHBsYWNlZCBiZWZvcmUgdGhlIG1hcHBpbmcgcGFpcnMgYXJyYXkuCiAJICovCi0JaWYgKHVubGlrZWx5KGN0eC0+YXR0ci0+bmFtZV9sZW5ndGggJiYgKGxlMTZfdG9fY3B1KAotCQkJY3R4LT5hdHRyLT5uYW1lX29mZnNldCkgPj0gbGUxNl90b19jcHUoCi0JCQljdHgtPmF0dHItPmRhdGEubm9uX3Jlc2lkZW50Lm1hcHBpbmdfcGFpcnNfb2Zmc2V0KSkpKSB7CisJaWYgKHVubGlrZWx5KGEtPm5hbWVfbGVuZ3RoICYmIChsZTE2X3RvX2NwdShhLT5uYW1lX29mZnNldCkgPj0KKwkJCWxlMTZfdG9fY3B1KAorCQkJYS0+ZGF0YS5ub25fcmVzaWRlbnQubWFwcGluZ19wYWlyc19vZmZzZXQpKSkpIHsKIAkJbnRmc19lcnJvcih2b2wtPnNiLCAiJElOREVYX0FMTE9DQVRJT04gYXR0cmlidXRlIG5hbWUgaXMgIgogCQkJCSJwbGFjZWQgYWZ0ZXIgdGhlIG1hcHBpbmcgcGFpcnMgYXJyYXkuIik7CiAJCWdvdG8gdW5tX2Vycl9vdXQ7CiAJfQotCWlmIChjdHgtPmF0dHItPmZsYWdzICYgQVRUUl9JU19FTkNSWVBURUQpIHsKKwlpZiAoYS0+ZmxhZ3MgJiBBVFRSX0lTX0VOQ1JZUFRFRCkgewogCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiJElOREVYX0FMTE9DQVRJT04gYXR0cmlidXRlIGlzICIKIAkJCQkiZW5jcnlwdGVkLiIpOwogCQlnb3RvIHVubV9lcnJfb3V0OwogCX0KLQlpZiAoY3R4LT5hdHRyLT5mbGFncyAmIEFUVFJfSVNfU1BBUlNFKSB7CisJaWYgKGEtPmZsYWdzICYgQVRUUl9JU19TUEFSU0UpIHsKIAkJbnRmc19lcnJvcih2aS0+aV9zYiwgIiRJTkRFWF9BTExPQ0FUSU9OIGF0dHJpYnV0ZSBpcyBzcGFyc2UuIik7CiAJCWdvdG8gdW5tX2Vycl9vdXQ7CiAJfQotCWlmIChjdHgtPmF0dHItPmZsYWdzICYgQVRUUl9DT01QUkVTU0lPTl9NQVNLKSB7CisJaWYgKGEtPmZsYWdzICYgQVRUUl9DT01QUkVTU0lPTl9NQVNLKSB7CiAJCW50ZnNfZXJyb3IodmktPmlfc2IsICIkSU5ERVhfQUxMT0NBVElPTiBhdHRyaWJ1dGUgaXMgIgogCQkJCSJjb21wcmVzc2VkLiIpOwogCQlnb3RvIHVubV9lcnJfb3V0OwogCX0KLQlpZiAoY3R4LT5hdHRyLT5kYXRhLm5vbl9yZXNpZGVudC5sb3dlc3RfdmNuKSB7CisJaWYgKGEtPmRhdGEubm9uX3Jlc2lkZW50Lmxvd2VzdF92Y24pIHsKIAkJbnRmc19lcnJvcih2aS0+aV9zYiwgIkZpcnN0IGV4dGVudCBvZiAkSU5ERVhfQUxMT0NBVElPTiAiCiAJCQkJImF0dHJpYnV0ZSBoYXMgbm9uIHplcm8gbG93ZXN0X3Zjbi4iKTsKIAkJZ290byB1bm1fZXJyX291dDsKIAl9Ci0JdmktPmlfc2l6ZSA9IHNsZTY0X3RvX2NwdShjdHgtPmF0dHItPmRhdGEubm9uX3Jlc2lkZW50LmRhdGFfc2l6ZSk7CisJdmktPmlfc2l6ZSA9IHNsZTY0X3RvX2NwdShhLT5kYXRhLm5vbl9yZXNpZGVudC5kYXRhX3NpemUpOwogCW5pLT5pbml0aWFsaXplZF9zaXplID0gc2xlNjRfdG9fY3B1KAotCQkJY3R4LT5hdHRyLT5kYXRhLm5vbl9yZXNpZGVudC5pbml0aWFsaXplZF9zaXplKTsKLQluaS0+YWxsb2NhdGVkX3NpemUgPSBzbGU2NF90b19jcHUoCi0JCQljdHgtPmF0dHItPmRhdGEubm9uX3Jlc2lkZW50LmFsbG9jYXRlZF9zaXplKTsKKwkJCWEtPmRhdGEubm9uX3Jlc2lkZW50LmluaXRpYWxpemVkX3NpemUpOworCW5pLT5hbGxvY2F0ZWRfc2l6ZSA9IHNsZTY0X3RvX2NwdShhLT5kYXRhLm5vbl9yZXNpZGVudC5hbGxvY2F0ZWRfc2l6ZSk7CiAJLyoKIAkgKiBXZSBhcmUgZG9uZSB3aXRoIHRoZSBtZnQgcmVjb3JkLCBzbyB3ZSByZWxlYXNlIGl0LiAgT3RoZXJ3aXNlCiAJICogd2Ugd291bGQgZGVhZGxvY2sgaW4gbnRmc19hdHRyX2lnZXQoKS4KQEAgLTE2MzIsMTAgKzE2MjIsMTAgQEAKIAkJZ290byBpcHV0X3VubV9lcnJfb3V0OwogCX0KIAkvKiBDb25zaXN0ZW5jeSBjaGVjayBiaXRtYXAgc2l6ZSB2cy4gaW5kZXggYWxsb2NhdGlvbiBzaXplLiAqLwotCWlmICgoYnZpLT5pX3NpemUgPDwgMykgPCAodmktPmlfc2l6ZSA+PgotCQkJbmktPml0eXBlLmluZGV4LmJsb2NrX3NpemVfYml0cykpIHsKKwlidmlfc2l6ZSA9IGlfc2l6ZV9yZWFkKGJ2aSk7CisJaWYgKChidmlfc2l6ZSA8PCAzKSA8ICh2aS0+aV9zaXplID4+IG5pLT5pdHlwZS5pbmRleC5ibG9ja19zaXplX2JpdHMpKSB7CiAJCW50ZnNfZXJyb3IodmktPmlfc2IsICJJbmRleCBiaXRtYXAgdG9vIHNtYWxsICgweCVsbHgpIGZvciAiCi0JCQkJImluZGV4IGFsbG9jYXRpb24gKDB4JWxseCkuIiwgYnZpLT5pX3NpemUgPDwgMywKKwkJCQkiaW5kZXggYWxsb2NhdGlvbiAoMHglbGx4KS4iLCBidmlfc2l6ZSA8PCAzLAogCQkJCXZpLT5pX3NpemUpOwogCQlnb3RvIGlwdXRfdW5tX2Vycl9vdXQ7CiAJfQpAQCAtMTY0Niw3ICsxNjM2LDYgQEAKIAl2aS0+aV9mb3AgPSBOVUxMOwogCXZpLT5pX21hcHBpbmctPmFfb3BzID0gJm50ZnNfbXN0X2FvcHM7CiAJdmktPmlfYmxvY2tzID0gbmktPmFsbG9jYXRlZF9zaXplID4+IDk7Ci0KIAkvKgogCSAqIE1ha2Ugc3VyZSB0aGUgYmFzZSBpbm9kZSBkb2Vzbid0IGdvIGF3YXkgYW5kIGF0dGFjaCBpdCB0byB0aGUKIAkgKiBpbmRleCBpbm9kZS4KQEAgLTE3MTIsNyArMTcwMSw3IEBACiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKIAludGZzX2lub2RlICpuaTsKIAlNRlRfUkVDT1JEICptID0gTlVMTDsKLQlBVFRSX1JFQ09SRCAqYXR0cjsKKwlBVFRSX1JFQ09SRCAqYTsKIAludGZzX2F0dHJfc2VhcmNoX2N0eCAqY3R4OwogCXVuc2lnbmVkIGludCBpLCBucl9ibG9ja3M7CiAJaW50IGVycjsKQEAgLTE3MjcsMTAgKzE3MTYsMTAgQEAKIAkvKiBTZXR1cCB0aGUgZGF0YSBhdHRyaWJ1dGUuIEl0IGlzIHNwZWNpYWwgYXMgaXQgaXMgbXN0IHByb3RlY3RlZC4gKi8KIAlOSW5vU2V0Tm9uUmVzaWRlbnQobmkpOwogCU5Jbm9TZXRNc3RQcm90ZWN0ZWQobmkpOworCU5Jbm9TZXRTcGFyc2VEaXNhYmxlZChuaSk7CiAJbmktPnR5cGUgPSBBVF9EQVRBOwogCW5pLT5uYW1lID0gTlVMTDsKIAluaS0+bmFtZV9sZW4gPSAwOwotCiAJLyoKIAkgKiBUaGlzIHNldHMgdXAgb3VyIGxpdHRsZSBjaGVhdCBhbGxvd2luZyB1cyB0byByZXVzZSB0aGUgYXN5bmMgcmVhZCBpbwogCSAqIGNvbXBsZXRpb24gaGFuZGxlciBmb3IgZGlyZWN0b3JpZXMuCkBAIC0xODA4LDkgKzE3OTcsMTAgQEAKIAogCQludGZzX2RlYnVnKCJBdHRyaWJ1dGUgbGlzdCBhdHRyaWJ1dGUgZm91bmQgaW4gJE1GVC4iKTsKIAkJTklub1NldEF0dHJMaXN0KG5pKTsKLQkJaWYgKGN0eC0+YXR0ci0+ZmxhZ3MgJiBBVFRSX0lTX0VOQ1JZUFRFRCB8fAotCQkJCWN0eC0+YXR0ci0+ZmxhZ3MgJiBBVFRSX0NPTVBSRVNTSU9OX01BU0sgfHwKLQkJCQljdHgtPmF0dHItPmZsYWdzICYgQVRUUl9JU19TUEFSU0UpIHsKKwkJYSA9IGN0eC0+YXR0cjsKKwkJaWYgKGEtPmZsYWdzICYgQVRUUl9JU19FTkNSWVBURUQgfHwKKwkJCQlhLT5mbGFncyAmIEFUVFJfQ09NUFJFU1NJT05fTUFTSyB8fAorCQkJCWEtPmZsYWdzICYgQVRUUl9JU19TUEFSU0UpIHsKIAkJCW50ZnNfZXJyb3Ioc2IsICJBdHRyaWJ1dGUgbGlzdCBhdHRyaWJ1dGUgaXMgIgogCQkJCQkiY29tcHJlc3NlZC9lbmNyeXB0ZWQvc3BhcnNlLiBOb3QgIgogCQkJCQkiYWxsb3dlZC4gJE1GVCBpcyBjb3JydXB0LiBZb3Ugc2hvdWxkICIKQEAgLTE4MTgsMTYgKzE4MDgsMTYgQEAKIAkJCWdvdG8gcHV0X2Vycl9vdXQ7CiAJCX0KIAkJLyogTm93IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0LiAqLwotCQluaS0+YXR0cl9saXN0X3NpemUgPSAodTMyKW50ZnNfYXR0cl9zaXplKGN0eC0+YXR0cik7CisJCW5pLT5hdHRyX2xpc3Rfc2l6ZSA9ICh1MzIpbnRmc19hdHRyX3NpemUoYSk7CiAJCW5pLT5hdHRyX2xpc3QgPSBudGZzX21hbGxvY19ub2ZzKG5pLT5hdHRyX2xpc3Rfc2l6ZSk7CiAJCWlmICghbmktPmF0dHJfbGlzdCkgewogCQkJbnRmc19lcnJvcihzYiwgIk5vdCBlbm91Z2ggbWVtb3J5IHRvIGFsbG9jYXRlIGJ1ZmZlciAiCiAJCQkJCSJmb3IgYXR0cmlidXRlIGxpc3QuIik7CiAJCQlnb3RvIHB1dF9lcnJfb3V0OwogCQl9Ci0JCWlmIChjdHgtPmF0dHItPm5vbl9yZXNpZGVudCkgeworCQlpZiAoYS0+bm9uX3Jlc2lkZW50KSB7CiAJCQlOSW5vU2V0QXR0ckxpc3ROb25SZXNpZGVudChuaSk7Ci0JCQlpZiAoY3R4LT5hdHRyLT5kYXRhLm5vbl9yZXNpZGVudC5sb3dlc3RfdmNuKSB7CisJCQlpZiAoYS0+ZGF0YS5ub25fcmVzaWRlbnQubG93ZXN0X3ZjbikgewogCQkJCW50ZnNfZXJyb3Ioc2IsICJBdHRyaWJ1dGUgbGlzdCBoYXMgbm9uIHplcm8gIgogCQkJCQkJImxvd2VzdF92Y24uICRNRlQgaXMgY29ycnVwdC4gIgogCQkJCQkJIllvdSBzaG91bGQgcnVuIGNoa2Rzay4iKTsKQEAgLTE4MzUsNyArMTgyNSw3IEBACiAJCQl9CiAJCQkvKiBTZXR1cCB0aGUgcnVubGlzdC4gKi8KIAkJCW5pLT5hdHRyX2xpc3RfcmwucmwgPSBudGZzX21hcHBpbmdfcGFpcnNfZGVjb21wcmVzcyh2b2wsCi0JCQkJCWN0eC0+YXR0ciwgTlVMTCk7CisJCQkJCWEsIE5VTEwpOwogCQkJaWYgKElTX0VSUihuaS0+YXR0cl9saXN0X3JsLnJsKSkgewogCQkJCWVyciA9IFBUUl9FUlIobmktPmF0dHJfbGlzdF9ybC5ybCk7CiAJCQkJbmktPmF0dHJfbGlzdF9ybC5ybCA9IE5VTEw7CkBAIC0xODQ3LDcgKzE4MzcsNyBAQAogCQkJLyogTm93IGxvYWQgdGhlIGF0dHJpYnV0ZSBsaXN0LiAqLwogCQkJaWYgKChlcnIgPSBsb2FkX2F0dHJpYnV0ZV9saXN0KHZvbCwgJm5pLT5hdHRyX2xpc3RfcmwsCiAJCQkJCW5pLT5hdHRyX2xpc3QsIG5pLT5hdHRyX2xpc3Rfc2l6ZSwKLQkJCQkJc2xlNjRfdG9fY3B1KGN0eC0+YXR0ci0+ZGF0YS4KKwkJCQkJc2xlNjRfdG9fY3B1KGEtPmRhdGEuCiAJCQkJCW5vbl9yZXNpZGVudC5pbml0aWFsaXplZF9zaXplKSkpKSB7CiAJCQkJbnRmc19lcnJvcihzYiwgIkZhaWxlZCB0byBsb2FkIGF0dHJpYnV0ZSBsaXN0ICIKIAkJCQkJCSJhdHRyaWJ1dGUgd2l0aCBlcnJvciBjb2RlICVpLiIsCkBAIC0xODU1LDIwICsxODQ1LDIwIEBACiAJCQkJZ290byBwdXRfZXJyX291dDsKIAkJCX0KIAkJfSBlbHNlIC8qIGlmICghY3R4LmF0dHItPm5vbl9yZXNpZGVudCkgKi8gewotCQkJaWYgKCh1OCopY3R4LT5hdHRyICsgbGUxNl90b19jcHUoCi0JCQkJCWN0eC0+YXR0ci0+ZGF0YS5yZXNpZGVudC52YWx1ZV9vZmZzZXQpICsKKwkJCWlmICgodTgqKWEgKyBsZTE2X3RvX2NwdSgKKwkJCQkJYS0+ZGF0YS5yZXNpZGVudC52YWx1ZV9vZmZzZXQpICsKIAkJCQkJbGUzMl90b19jcHUoCi0JCQkJCWN0eC0+YXR0ci0+ZGF0YS5yZXNpZGVudC52YWx1ZV9sZW5ndGgpID4KKwkJCQkJYS0+ZGF0YS5yZXNpZGVudC52YWx1ZV9sZW5ndGgpID4KIAkJCQkJKHU4KiljdHgtPm1yZWMgKyB2b2wtPm1mdF9yZWNvcmRfc2l6ZSkgewogCQkJCW50ZnNfZXJyb3Ioc2IsICJDb3JydXB0IGF0dHJpYnV0ZSBsaXN0ICIKIAkJCQkJCSJhdHRyaWJ1dGUuIik7CiAJCQkJZ290byBwdXRfZXJyX291dDsKIAkJCX0KIAkJCS8qIE5vdyBjb3B5IHRoZSBhdHRyaWJ1dGUgbGlzdC4gKi8KLQkJCW1lbWNweShuaS0+YXR0cl9saXN0LCAodTgqKWN0eC0+YXR0ciArIGxlMTZfdG9fY3B1KAotCQkJCQljdHgtPmF0dHItPmRhdGEucmVzaWRlbnQudmFsdWVfb2Zmc2V0KSwKKwkJCW1lbWNweShuaS0+YXR0cl9saXN0LCAodTgqKWEgKyBsZTE2X3RvX2NwdSgKKwkJCQkJYS0+ZGF0YS5yZXNpZGVudC52YWx1ZV9vZmZzZXQpLAogCQkJCQlsZTMyX3RvX2NwdSgKLQkJCQkJY3R4LT5hdHRyLT5kYXRhLnJlc2lkZW50LnZhbHVlX2xlbmd0aCkpOworCQkJCQlhLT5kYXRhLnJlc2lkZW50LnZhbHVlX2xlbmd0aCkpOwogCQl9CiAJCS8qIFRoZSBhdHRyaWJ1dGUgbGlzdCBpcyBub3cgc2V0dXAgaW4gbWVtb3J5LiAqLwogCQkvKgpAQCAtMTkzNCwyNSArMTkyNCwyNSBAQAogCW50ZnNfYXR0cl9yZWluaXRfc2VhcmNoX2N0eChjdHgpOwogCiAJLyogTm93IGxvYWQgYWxsIGF0dHJpYnV0ZSBleHRlbnRzLiAqLwotCWF0dHIgPSBOVUxMOworCWEgPSBOVUxMOwogCW5leHRfdmNuID0gbGFzdF92Y24gPSBoaWdoZXN0X3ZjbiA9IDA7CiAJd2hpbGUgKCEoZXJyID0gbnRmc19hdHRyX2xvb2t1cChBVF9EQVRBLCBOVUxMLCAwLCAwLCBuZXh0X3ZjbiwgTlVMTCwgMCwKIAkJCWN0eCkpKSB7CiAJCXJ1bmxpc3RfZWxlbWVudCAqbnJsOwogCiAJCS8qIENhY2hlIHRoZSBjdXJyZW50IGF0dHJpYnV0ZS4gKi8KLQkJYXR0ciA9IGN0eC0+YXR0cjsKKwkJYSA9IGN0eC0+YXR0cjsKIAkJLyogJE1GVCBtdXN0IGJlIG5vbi1yZXNpZGVudC4gKi8KLQkJaWYgKCFhdHRyLT5ub25fcmVzaWRlbnQpIHsKKwkJaWYgKCFhLT5ub25fcmVzaWRlbnQpIHsKIAkJCW50ZnNfZXJyb3Ioc2IsICIkTUZUIG11c3QgYmUgbm9uLXJlc2lkZW50IGJ1dCBhICIKIAkJCQkJInJlc2lkZW50IGV4dGVudCB3YXMgZm91bmQuICRNRlQgaXMgIgogCQkJCQkiY29ycnVwdC4gUnVuIGNoa2Rzay4iKTsKIAkJCWdvdG8gcHV0X2Vycl9vdXQ7CiAJCX0KIAkJLyogJE1GVCBtdXN0IGJlIHVuY29tcHJlc3NlZCBhbmQgdW5lbmNyeXB0ZWQuICovCi0JCWlmIChhdHRyLT5mbGFncyAmIEFUVFJfQ09NUFJFU1NJT05fTUFTSyB8fAotCQkJCWF0dHItPmZsYWdzICYgQVRUUl9JU19FTkNSWVBURUQgfHwKLQkJCQlhdHRyLT5mbGFncyAmIEFUVFJfSVNfU1BBUlNFKSB7CisJCWlmIChhLT5mbGFncyAmIEFUVFJfQ09NUFJFU1NJT05fTUFTSyB8fAorCQkJCWEtPmZsYWdzICYgQVRUUl9JU19FTkNSWVBURUQgfHwKKwkJCQlhLT5mbGFncyAmIEFUVFJfSVNfU1BBUlNFKSB7CiAJCQludGZzX2Vycm9yKHNiLCAiJE1GVCBtdXN0IGJlIHVuY29tcHJlc3NlZCwgIgogCQkJCQkibm9uLXNwYXJzZSwgYW5kIHVuZW5jcnlwdGVkIGJ1dCBhICIKIAkJCQkJImNvbXByZXNzZWQvc3BhcnNlL2VuY3J5cHRlZCBleHRlbnQgIgpAQCAtMTk2Niw3ICsxOTU2LDcgQEAKIAkJICogYXMgd2UgaGF2ZSBleGNsdXNpdmUgYWNjZXNzIHRvIHRoZSBpbm9kZSBhdCB0aGlzIHRpbWUgYW5kIHdlCiAJCSAqIGFyZSBhIG1vdW50IGluIHByb2dyZXNzIHRhc2ssIHRvby4KIAkJICovCi0JCW5ybCA9IG50ZnNfbWFwcGluZ19wYWlyc19kZWNvbXByZXNzKHZvbCwgYXR0ciwgbmktPnJ1bmxpc3QucmwpOworCQlucmwgPSBudGZzX21hcHBpbmdfcGFpcnNfZGVjb21wcmVzcyh2b2wsIGEsIG5pLT5ydW5saXN0LnJsKTsKIAkJaWYgKElTX0VSUihucmwpKSB7CiAJCQludGZzX2Vycm9yKHNiLCAibnRmc19tYXBwaW5nX3BhaXJzX2RlY29tcHJlc3MoKSAiCiAJCQkJCSJmYWlsZWQgd2l0aCBlcnJvciBjb2RlICVsZC4gICRNRlQgaXMgIgpAQCAtMTk3Nyw3ICsxOTY3LDcgQEAKIAogCQkvKiBBcmUgd2UgaW4gdGhlIGZpcnN0IGV4dGVudD8gKi8KIAkJaWYgKCFuZXh0X3ZjbikgewotCQkJaWYgKGF0dHItPmRhdGEubm9uX3Jlc2lkZW50Lmxvd2VzdF92Y24pIHsKKwkJCWlmIChhLT5kYXRhLm5vbl9yZXNpZGVudC5sb3dlc3RfdmNuKSB7CiAJCQkJbnRmc19lcnJvcihzYiwgIkZpcnN0IGV4dGVudCBvZiAkREFUQSAiCiAJCQkJCQkiYXR0cmlidXRlIGhhcyBub24gemVybyAiCiAJCQkJCQkibG93ZXN0X3Zjbi4gJE1GVCBpcyBjb3JydXB0LiAiCkBAIC0xOTg2LDE1ICsxOTc2LDE1IEBACiAJCQl9CiAJCQkvKiBHZXQgdGhlIGxhc3QgdmNuIGluIHRoZSAkREFUQSBhdHRyaWJ1dGUuICovCiAJCQlsYXN0X3ZjbiA9IHNsZTY0X3RvX2NwdSgKLQkJCQkJYXR0ci0+ZGF0YS5ub25fcmVzaWRlbnQuYWxsb2NhdGVkX3NpemUpCisJCQkJCWEtPmRhdGEubm9uX3Jlc2lkZW50LmFsbG9jYXRlZF9zaXplKQogCQkJCQk+PiB2b2wtPmNsdXN0ZXJfc2l6ZV9iaXRzOwogCQkJLyogRmlsbCBpbiB0aGUgaW5vZGUgc2l6ZS4gKi8KIAkJCXZpLT5pX3NpemUgPSBzbGU2NF90b19jcHUoCi0JCQkJCWF0dHItPmRhdGEubm9uX3Jlc2lkZW50LmRhdGFfc2l6ZSk7Ci0JCQluaS0+aW5pdGlhbGl6ZWRfc2l6ZSA9IHNsZTY0X3RvX2NwdShhdHRyLT5kYXRhLgotCQkJCQlub25fcmVzaWRlbnQuaW5pdGlhbGl6ZWRfc2l6ZSk7CisJCQkJCWEtPmRhdGEubm9uX3Jlc2lkZW50LmRhdGFfc2l6ZSk7CisJCQluaS0+aW5pdGlhbGl6ZWRfc2l6ZSA9IHNsZTY0X3RvX2NwdSgKKwkJCQkJYS0+ZGF0YS5ub25fcmVzaWRlbnQuaW5pdGlhbGl6ZWRfc2l6ZSk7CiAJCQluaS0+YWxsb2NhdGVkX3NpemUgPSBzbGU2NF90b19jcHUoCi0JCQkJCWF0dHItPmRhdGEubm9uX3Jlc2lkZW50LmFsbG9jYXRlZF9zaXplKTsKKwkJCQkJYS0+ZGF0YS5ub25fcmVzaWRlbnQuYWxsb2NhdGVkX3NpemUpOwogCQkJLyoKIAkJCSAqIFZlcmlmeSB0aGUgbnVtYmVyIG9mIG1mdCByZWNvcmRzIGRvZXMgbm90IGV4Y2VlZAogCQkJICogMl4zMiAtIDEuCkBAIC0yMDUxLDcgKzIwNDEsNyBAQAogCQl9CiAKIAkJLyogR2V0IHRoZSBsb3dlc3QgdmNuIGZvciB0aGUgbmV4dCBleHRlbnQuICovCi0JCWhpZ2hlc3RfdmNuID0gc2xlNjRfdG9fY3B1KGF0dHItPmRhdGEubm9uX3Jlc2lkZW50LmhpZ2hlc3RfdmNuKTsKKwkJaGlnaGVzdF92Y24gPSBzbGU2NF90b19jcHUoYS0+ZGF0YS5ub25fcmVzaWRlbnQuaGlnaGVzdF92Y24pOwogCQluZXh0X3ZjbiA9IGhpZ2hlc3RfdmNuICsgMTsKIAogCQkvKiBPbmx5IG9uZSBleHRlbnQgb3IgZXJyb3IsIHdoaWNoIHdlIGNhdGNoIGJlbG93LiAqLwpAQCAtMjA2MCw3ICsyMDUwLDcgQEAKIAogCQkvKiBBdm9pZCBlbmRsZXNzIGxvb3BzIGR1ZSB0byBjb3JydXB0aW9uLiAqLwogCQlpZiAobmV4dF92Y24gPCBzbGU2NF90b19jcHUoCi0JCQkJYXR0ci0+ZGF0YS5ub25fcmVzaWRlbnQubG93ZXN0X3ZjbikpIHsKKwkJCQlhLT5kYXRhLm5vbl9yZXNpZGVudC5sb3dlc3RfdmNuKSkgewogCQkJbnRmc19lcnJvcihzYiwgIiRNRlQgaGFzIGNvcnJ1cHQgYXR0cmlidXRlIGxpc3QgIgogCQkJCQkiYXR0cmlidXRlLiBSdW4gY2hrZHNrLiIpOwogCQkJZ290byBwdXRfZXJyX291dDsKQEAgLTIwNzEsNyArMjA2MSw3IEBACiAJCQkJIiRNRlQgaXMgY29ycnVwdC4gUnVuIGNoa2Rzay4iKTsKIAkJZ290byBwdXRfZXJyX291dDsKIAl9Ci0JaWYgKCFhdHRyKSB7CisJaWYgKCFhKSB7CiAJCW50ZnNfZXJyb3Ioc2IsICIkTUZULyREQVRBIGF0dHJpYnV0ZSBub3QgZm91bmQuICRNRlQgaXMgIgogCQkJCSJjb3JydXB0LiBSdW4gY2hrZHNrLiIpOwogCQlnb3RvIHB1dF9lcnJfb3V0OwpAQCAtMjI3NSw2ICsyMjY1LDggQEAKIAkJc2VxX3ByaW50ZihzZiwgIixjYXNlX3NlbnNpdGl2ZSIpOwogCWlmIChOVm9sU2hvd1N5c3RlbUZpbGVzKHZvbCkpCiAJCXNlcV9wcmludGYoc2YsICIsc2hvd19zeXNfZmlsZXMiKTsKKwlpZiAoIU5Wb2xTcGFyc2VFbmFibGVkKHZvbCkpCisJCXNlcV9wcmludGYoc2YsICIsZGlzYWJsZV9zcGFyc2UiKTsKIAlmb3IgKGkgPSAwOyBvbl9lcnJvcnNfYXJyW2ldLnZhbDsgaSsrKSB7CiAJCWlmIChvbl9lcnJvcnNfYXJyW2ldLnZhbCAmIHZvbC0+b25fZXJyb3JzKQogCQkJc2VxX3ByaW50ZihzZiwgIixlcnJvcnM9JXMiLCBvbl9lcnJvcnNfYXJyW2ldLnN0cik7CkBAIC0yMzExLDYgKzIzMDMsNyBAQAogCW50ZnNfdm9sdW1lICp2b2wgPSBuaS0+dm9sOwogCW50ZnNfYXR0cl9zZWFyY2hfY3R4ICpjdHg7CiAJTUZUX1JFQ09SRCAqbTsKKwlBVFRSX1JFQ09SRCAqYTsKIAljb25zdCBjaGFyICp0ZSA9ICIgIExlYXZpbmcgZmlsZSBsZW5ndGggb3V0IG9mIHN5bmMgd2l0aCBpX3NpemUuIjsKIAlpbnQgZXJyOwogCkBAIC0yMzQ3LDE0ICsyMzQwLDE1IEBACiAJCQkJCXZpLT5pX2lubywgZXJyKTsKIAkJZ290byBlcnJfb3V0OwogCX0KKwlhID0gY3R4LT5hdHRyOwogCS8qIElmIHRoZSBzaXplIGhhcyBub3QgY2hhbmdlZCB0aGVyZSBpcyBub3RoaW5nIHRvIGRvLiAqLwotCWlmIChudGZzX2F0dHJfc2l6ZShjdHgtPmF0dHIpID09IGlfc2l6ZV9yZWFkKHZpKSkKKwlpZiAobnRmc19hdHRyX3NpemUoYSkgPT0gaV9zaXplX3JlYWQodmkpKQogCQlnb3RvIGRvbmU7CiAJLy8gVE9ETzogSW1wbGVtZW50IHRoZSB0cnVuY2F0ZS4uLgogCW50ZnNfZXJyb3IodmktPmlfc2IsICJJbm9kZSBzaXplIGhhcyBjaGFuZ2VkIGJ1dCB0aGlzIGlzIG5vdCAiCiAJCQkiaW1wbGVtZW50ZWQgeWV0LiAgUmVzZXR0aW5nIGlub2RlIHNpemUgdG8gb2xkIHZhbHVlLiAiCiAJCQkiIFRoaXMgaXMgbW9zdCBsaWtlbHkgYSBidWcgaW4gdGhlIG50ZnMgZHJpdmVyISIpOwotCWlfc2l6ZV93cml0ZSh2aSwgbnRmc19hdHRyX3NpemUoY3R4LT5hdHRyKSk7IAorCWlfc2l6ZV93cml0ZSh2aSwgbnRmc19hdHRyX3NpemUoYSkpOyAKIGRvbmU6CiAJbnRmc19hdHRyX3B1dF9zZWFyY2hfY3R4KGN0eCk7CiAJdW5tYXBfbWZ0X3JlY29yZChuaSk7CkBAIC0yNTE1LDE4ICsyNTA5LDE4IEBACiAJbnQgPSB1dGMybnRmcyh2aS0+aV9tdGltZSk7CiAJaWYgKHNpLT5sYXN0X2RhdGFfY2hhbmdlX3RpbWUgIT0gbnQpIHsKIAkJbnRmc19kZWJ1ZygiVXBkYXRpbmcgbXRpbWUgZm9yIGlub2RlIDB4JWx4OiBvbGQgPSAweCVsbHgsICIKLQkJCQkibmV3ID0gMHglbGx4IiwgdmktPmlfaW5vLAorCQkJCSJuZXcgPSAweCVsbHgiLCB2aS0+aV9pbm8sIChsb25nIGxvbmcpCiAJCQkJc2xlNjRfdG9fY3B1KHNpLT5sYXN0X2RhdGFfY2hhbmdlX3RpbWUpLAotCQkJCXNsZTY0X3RvX2NwdShudCkpOworCQkJCShsb25nIGxvbmcpc2xlNjRfdG9fY3B1KG50KSk7CiAJCXNpLT5sYXN0X2RhdGFfY2hhbmdlX3RpbWUgPSBudDsKIAkJbW9kaWZpZWQgPSBUUlVFOwogCX0KIAludCA9IHV0YzJudGZzKHZpLT5pX2N0aW1lKTsKIAlpZiAoc2ktPmxhc3RfbWZ0X2NoYW5nZV90aW1lICE9IG50KSB7CiAJCW50ZnNfZGVidWcoIlVwZGF0aW5nIGN0aW1lIGZvciBpbm9kZSAweCVseDogb2xkID0gMHglbGx4LCAiCi0JCQkJIm5ldyA9IDB4JWxseCIsIHZpLT5pX2lubywKKwkJCQkibmV3ID0gMHglbGx4IiwgdmktPmlfaW5vLCAobG9uZyBsb25nKQogCQkJCXNsZTY0X3RvX2NwdShzaS0+bGFzdF9tZnRfY2hhbmdlX3RpbWUpLAotCQkJCXNsZTY0X3RvX2NwdShudCkpOworCQkJCShsb25nIGxvbmcpc2xlNjRfdG9fY3B1KG50KSk7CiAJCXNpLT5sYXN0X21mdF9jaGFuZ2VfdGltZSA9IG50OwogCQltb2RpZmllZCA9IFRSVUU7CiAJfQpAQCAtMjUzNCw4ICsyNTI4LDggQEAKIAlpZiAoc2ktPmxhc3RfYWNjZXNzX3RpbWUgIT0gbnQpIHsKIAkJbnRmc19kZWJ1ZygiVXBkYXRpbmcgYXRpbWUgZm9yIGlub2RlIDB4JWx4OiBvbGQgPSAweCVsbHgsICIKIAkJCQkibmV3ID0gMHglbGx4IiwgdmktPmlfaW5vLAotCQkJCXNsZTY0X3RvX2NwdShzaS0+bGFzdF9hY2Nlc3NfdGltZSksCi0JCQkJc2xlNjRfdG9fY3B1KG50KSk7CisJCQkJKGxvbmcgbG9uZylzbGU2NF90b19jcHUoc2ktPmxhc3RfYWNjZXNzX3RpbWUpLAorCQkJCShsb25nIGxvbmcpc2xlNjRfdG9fY3B1KG50KSk7CiAJCXNpLT5sYXN0X2FjY2Vzc190aW1lID0gbnQ7CiAJCW1vZGlmaWVkID0gVFJVRTsKIAl9CmRpZmYgLS1naXQgYS9mcy9udGZzL2lub2RlLmggYi9mcy9udGZzL2lub2RlLmgKaW5kZXggOTk1ODA0NS4uM2RlNWMwMiAxMDA2NDQKLS0tIGEvZnMvbnRmcy9pbm9kZS5oCisrKyBiL2ZzL250ZnMvaW5vZGUuaApAQCAtMiw3ICsyLDcgQEAKICAqIGlub2RlLmggLSBEZWZpbmVzIGZvciBpbm9kZSBzdHJ1Y3R1cmVzIE5URlMgTGludXgga2VybmVsIGRyaXZlci4gUGFydCBvZgogICoJICAgICB0aGUgTGludXgtTlRGUyBwcm9qZWN0LgogICoKLSAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA0IEFudG9uIEFsdGFwYXJtYWtvdgorICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDUgQW50b24gQWx0YXBhcm1ha292CiAgKiBDb3B5cmlnaHQgKGMpIDIwMDIgUmljaGFyZCBSdXNzb24KICAqCiAgKiBUaGlzIHByb2dyYW0vaW5jbHVkZSBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgpAQCAtNDQsNiArNDQsNyBAQAogICogZmllbGRzIGFscmVhZHkgcHJvdmlkZWQgaW4gdGhlIFZGUyBpbm9kZS4KICAqLwogc3RydWN0IF9udGZzX2lub2RlIHsKKwlyd2xvY2tfdCBzaXplX2xvY2s7CS8qIExvY2sgc2VyaWFsaXppbmcgYWNjZXNzIHRvIGlub2RlIHNpemVzLiAqLwogCXM2NCBpbml0aWFsaXplZF9zaXplOwkvKiBDb3B5IGZyb20gdGhlIGF0dHJpYnV0ZSByZWNvcmQuICovCiAJczY0IGFsbG9jYXRlZF9zaXplOwkvKiBDb3B5IGZyb20gdGhlIGF0dHJpYnV0ZSByZWNvcmQuICovCiAJdW5zaWduZWQgbG9uZyBzdGF0ZTsJLyogTlRGUyBzcGVjaWZpYyBmbGFncyBkZXNjcmliaW5nIHRoaXMgaW5vZGUuCkBAIC0xMDksNyArMTEwLDcgQEAKIAkJCXU4IGJsb2NrX3NpemVfYml0czsgCS8qIExvZzIgb2YgdGhlIGFib3ZlLiAqLwogCQkJdTggdmNuX3NpemVfYml0czsJLyogTG9nMiBvZiB0aGUgYWJvdmUuICovCiAJCX0gaW5kZXg7Ci0JCXN0cnVjdCB7IC8qIEl0IGlzIGEgY29tcHJlc3NlZCBmaWxlIG9yIGFuIGF0dHJpYnV0ZSBpbm9kZS4gKi8KKwkJc3RydWN0IHsgLyogSXQgaXMgYSBjb21wcmVzc2VkL3NwYXJzZSBmaWxlL2F0dHJpYnV0ZSBpbm9kZS4gKi8KIAkJCXM2NCBzaXplOwkJLyogQ29weSBvZiBjb21wcmVzc2VkX3NpemUgZnJvbQogCQkJCQkJICAgJERBVEEuICovCiAJCQl1MzIgYmxvY2tfc2l6ZTsJCS8qIFNpemUgb2YgYSBjb21wcmVzc2lvbiBibG9jawpAQCAtMTY1LDYgKzE2Niw3IEBACiAJTklfU3BhcnNlLAkJLyogMTogVW5uYW1lZCBkYXRhIGF0dHIgaXMgc3BhcnNlIChmKS4KIAkJCQkgICAxOiBDcmVhdGUgc3BhcnNlIGZpbGVzIGJ5IGRlZmF1bHQgKGQpLgogCQkJCSAgIDE6IEF0dHJpYnV0ZSBpcyBzcGFyc2UgKGEpLiAqLworCU5JX1NwYXJzZURpc2FibGVkLAkvKiAxOiBNYXkgbm90IGNyZWF0ZSBzcGFyc2UgcmVnaW9ucy4gKi8KIAlOSV9UcnVuY2F0ZUZhaWxlZCwJLyogMTogTGFzdCBudGZzX3RydW5jYXRlKCkgY2FsbCBmYWlsZWQuICovCiB9IG50ZnNfaW5vZGVfc3RhdGVfYml0czsKIApAQCAtMjE3LDYgKzIxOSw3IEBACiBOSU5PX0ZOUyhDb21wcmVzc2VkKQogTklOT19GTlMoRW5jcnlwdGVkKQogTklOT19GTlMoU3BhcnNlKQorTklOT19GTlMoU3BhcnNlRGlzYWJsZWQpCiBOSU5PX0ZOUyhUcnVuY2F0ZUZhaWxlZCkKIAogLyoKZGlmZiAtLWdpdCBhL2ZzL250ZnMvbGF5b3V0LmggYi9mcy9udGZzL2xheW91dC5oCmluZGV4IDQ3YjMzODkuLjYwOWFkMTcgMTAwNjQ0Ci0tLSBhL2ZzL250ZnMvbGF5b3V0LmgKKysrIGIvZnMvbnRmcy9sYXlvdXQuaApAQCAtMiw3ICsyLDcgQEAKICAqIGxheW91dC5oIC0gQWxsIE5URlMgYXNzb2NpYXRlZCBvbi1kaXNrIHN0cnVjdHVyZXMuIFBhcnQgb2YgdGhlIExpbnV4LU5URlMKICAqCSAgICAgIHByb2plY3QuCiAgKgotICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDQgQW50b24gQWx0YXBhcm1ha292CisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNSBBbnRvbiBBbHRhcGFybWFrb3YKICAqIENvcHlyaWdodCAoYykgMjAwMiBSaWNoYXJkIFJ1c3NvbgogICoKICAqIFRoaXMgcHJvZ3JhbS9pbmNsdWRlIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCkBAIC01NDcsMjYgKzU0Nyw0NCBAQAogCUNPTExBVElPTl9OVE9GU19VTE9ORwkJPSBjb25zdF9jcHVfdG9fbGUzMigweDEwKSwKIAlDT0xMQVRJT05fTlRPRlNfU0lECQk9IGNvbnN0X2NwdV90b19sZTMyKDB4MTEpLAogCUNPTExBVElPTl9OVE9GU19TRUNVUklUWV9IQVNICT0gY29uc3RfY3B1X3RvX2xlMzIoMHgxMiksCi0JQ09MTEFUSU9OX05UT0ZTX1VMT05HUwkJPSBjb25zdF9jcHVfdG9fbGUzMigweDEzKQorCUNPTExBVElPTl9OVE9GU19VTE9OR1MJCT0gY29uc3RfY3B1X3RvX2xlMzIoMHgxMyksCiB9OwogCiB0eXBlZGVmIGxlMzIgQ09MTEFUSU9OX1JVTEU7CiAKIC8qCiAgKiBUaGUgZmxhZ3MgKDMyLWJpdCkgZGVzY3JpYmluZyBhdHRyaWJ1dGUgcHJvcGVydGllcyBpbiB0aGUgYXR0cmlidXRlCi0gKiBkZWZpbml0aW9uIHN0cnVjdHVyZS4gIEZJWE1FOiBUaGlzIGluZm9ybWF0aW9uIGlzIGZyb20gUmVnaXMncyBpbmZvcm1hdGlvbgotICogYW5kLCBhY2NvcmRpbmcgdG8gaGltLCBpdCBpcyBub3QgY2VydGFpbiBhbmQgcHJvYmFibHkgaW5jb21wbGV0ZS4KLSAqIFRoZSBJTkRFWEFCTEUgZmxhZyBpcyBmYWlybHkgY2VydGFpbmx5IGNvcnJlY3QgYXMgb25seSB0aGUgZmlsZSBuYW1lCi0gKiBhdHRyaWJ1dGUgaGFzIHRoaXMgZmxhZyBzZXQgYW5kIHRoaXMgaXMgdGhlIG9ubHkgYXR0cmlidXRlIGluZGV4ZWQgaW4gTlQ0LgorICogZGVmaW5pdGlvbiBzdHJ1Y3R1cmUuICBGSVhNRTogVGhpcyBpbmZvcm1hdGlvbiBpcyBiYXNlZCBvbiBSZWdpcydzCisgKiBpbmZvcm1hdGlvbiBhbmQsIGFjY29yZGluZyB0byBoaW0sIGl0IGlzIG5vdCBjZXJ0YWluIGFuZCBwcm9iYWJseQorICogaW5jb21wbGV0ZS4gIFRoZSBJTkRFWEFCTEUgZmxhZyBpcyBmYWlybHkgY2VydGFpbmx5IGNvcnJlY3QgYXMgb25seSB0aGUgZmlsZQorICogbmFtZSBhdHRyaWJ1dGUgaGFzIHRoaXMgZmxhZyBzZXQgYW5kIHRoaXMgaXMgdGhlIG9ubHkgYXR0cmlidXRlIGluZGV4ZWQgaW4KKyAqIE5UNC4KICAqLwogZW51bSB7Ci0JSU5ERVhBQkxFCSAgICA9IGNvbnN0X2NwdV90b19sZTMyKDB4MDIpLCAvKiBBdHRyaWJ1dGUgY2FuIGJlCi0JCQkJCQkJICBpbmRleGVkLiAqLwotCU5FRURfVE9fUkVHRU5FUkFURSAgPSBjb25zdF9jcHVfdG9fbGUzMigweDQwKSwgLyogTmVlZCB0byByZWdlbmVyYXRlCi0JCQkJCQkJICBkdXJpbmcgcmVnZW5lcmF0aW9uCi0JCQkJCQkJICBwaGFzZS4gKi8KLQlDQU5fQkVfTk9OX1JFU0lERU5UID0gY29uc3RfY3B1X3RvX2xlMzIoMHg4MCksIC8qIEF0dHJpYnV0ZSBjYW4gYmUKLQkJCQkJCQkgIG5vbi1yZXNpZGVudC4gKi8KKwlBVFRSX0RFRl9JTkRFWEFCTEUJPSBjb25zdF9jcHVfdG9fbGUzMigweDAyKSwgLyogQXR0cmlidXRlIGNhbiBiZQorCQkJCQlpbmRleGVkLiAqLworCUFUVFJfREVGX01VTFRJUExFCT0gY29uc3RfY3B1X3RvX2xlMzIoMHgwNCksIC8qIEF0dHJpYnV0ZSB0eXBlCisJCQkJCWNhbiBiZSBwcmVzZW50IG11bHRpcGxlIHRpbWVzIGluIHRoZQorCQkJCQltZnQgcmVjb3JkcyBvZiBhbiBpbm9kZS4gKi8KKwlBVFRSX0RFRl9OT1RfWkVSTwk9IGNvbnN0X2NwdV90b19sZTMyKDB4MDgpLCAvKiBBdHRyaWJ1dGUgdmFsdWUKKwkJCQkJbXVzdCBjb250YWluIGF0IGxlYXN0IG9uZSBub24temVybworCQkJCQlieXRlLiAqLworCUFUVFJfREVGX0lOREVYRURfVU5JUVVFCT0gY29uc3RfY3B1X3RvX2xlMzIoMHgxMCksIC8qIEF0dHJpYnV0ZSBtdXN0IGJlCisJCQkJCWluZGV4ZWQgYW5kIHRoZSBhdHRyaWJ1dGUgdmFsdWUgbXVzdCBiZQorCQkJCQl1bmlxdWUgZm9yIHRoZSBhdHRyaWJ1dGUgdHlwZSBpbiBhbGwgb2YKKwkJCQkJdGhlIG1mdCByZWNvcmRzIG9mIGFuIGlub2RlLiAqLworCUFUVFJfREVGX05BTUVEX1VOSVFVRQk9IGNvbnN0X2NwdV90b19sZTMyKDB4MjApLCAvKiBBdHRyaWJ1dGUgbXVzdCBiZQorCQkJCQluYW1lZCBhbmQgdGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgZm9yCisJCQkJCXRoZSBhdHRyaWJ1dGUgdHlwZSBpbiBhbGwgb2YgdGhlIG1mdAorCQkJCQlyZWNvcmRzIG9mIGFuIGlub2RlLiAqLworCUFUVFJfREVGX1JFU0lERU5UCT0gY29uc3RfY3B1X3RvX2xlMzIoMHg0MCksIC8qIEF0dHJpYnV0ZSBtdXN0IGJlCisJCQkJCXJlc2lkZW50LiAqLworCUFUVFJfREVGX0FMV0FZU19MT0cJPSBjb25zdF9jcHVfdG9fbGUzMigweDgwKSwgLyogQWx3YXlzIGxvZworCQkJCQltb2RpZmljYXRpb25zIHRvIHRoaXMgYXR0cmlidXRlLAorCQkJCQlyZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgaXMgcmVzaWRlbnQgb3IKKwkJCQkJbm9uLXJlc2lkZW50LiAgV2l0aG91dCB0aGlzLCBvbmx5IGxvZworCQkJCQltb2RpZmljYXRpb25zIGlmIHRoZSBhdHRyaWJ1dGUgaXMKKwkJCQkJcmVzaWRlbnQuICovCiB9OwogCiB0eXBlZGVmIGxlMzIgQVRUUl9ERUZfRkxBR1M7CkBAIC03NDksMTAgKzc2NywxMSBAQAogCQkJCXJlY29yZCBoZWFkZXIgYWxpZ25lZCB0byA4LWJ5dGUgYm91bmRhcnkuICovCiAvKiAzNCovCQkJdTggY29tcHJlc3Npb25fdW5pdDsgLyogVGhlIGNvbXByZXNzaW9uIHVuaXQgZXhwcmVzc2VkCiAJCQkJYXMgdGhlIGxvZyB0byB0aGUgYmFzZSAyIG9mIHRoZSBudW1iZXIgb2YKLQkJCQljbHVzdGVycyBpbiBhIGNvbXByZXNzaW9uIHVuaXQuIDAgbWVhbnMgbm90Ci0JCQkJY29tcHJlc3NlZC4gKFRoaXMgZWZmZWN0aXZlbHkgbGltaXRzIHRoZQorCQkJCWNsdXN0ZXJzIGluIGEgY29tcHJlc3Npb24gdW5pdC4gIDAgbWVhbnMgbm90CisJCQkJY29tcHJlc3NlZC4gIChUaGlzIGVmZmVjdGl2ZWx5IGxpbWl0cyB0aGUKIAkJCQljb21wcmVzc2lvbiB1bml0IHNpemUgdG8gYmUgYSBwb3dlciBvZiB0d28KLQkJCQljbHVzdGVycy4pIFdpbk5UNCBvbmx5IHVzZXMgYSB2YWx1ZSBvZiA0LiAqLworCQkJCWNsdXN0ZXJzLikgIFdpbk5UNCBvbmx5IHVzZXMgYSB2YWx1ZSBvZiA0LgorCQkJCVNwYXJzZSBmaWxlcyBhbHNvIGhhdmUgdGhpcyBzZXQgdG8gNC4gKi8KIC8qIDM1Ki8JCQl1OCByZXNlcnZlZFs1XTsJCS8qIEFsaWduIHRvIDgtYnl0ZSBib3VuZGFyeS4gKi8KIC8qIFRoZSBzaXplcyBiZWxvdyBhcmUgb25seSB1c2VkIHdoZW4gbG93ZXN0X3ZjbiBpcyB6ZXJvLCBhcyBvdGhlcndpc2UgaXQgd291bGQKICAgIGJlIGRpZmZpY3VsdCB0byBrZWVwIHRoZW0gdXAtdG8tZGF0ZS4qLwpAQCAtNzcyLDEwICs3OTEsMTAgQEAKIAkJCQlkYXRhX3NpemUuICovCiAvKiBzaXplb2YodW5jb21wcmVzc2VkIGF0dHIpID0gNjQqLwogLyogNjQqLwkJCXNsZTY0IGNvbXByZXNzZWRfc2l6ZTsJLyogQnl0ZSBzaXplIG9mIHRoZSBhdHRyaWJ1dGUKLQkJCQl2YWx1ZSBhZnRlciBjb21wcmVzc2lvbi4gT25seSBwcmVzZW50IHdoZW4KLQkJCQljb21wcmVzc2VkLiBBbHdheXMgaXMgYSBtdWx0aXBsZSBvZiB0aGUKLQkJCQljbHVzdGVyIHNpemUuIFJlcHJlc2VudHMgdGhlIGFjdHVhbCBhbW91bnQgb2YKLQkJCQlkaXNrIHNwYWNlIGJlaW5nIHVzZWQgb24gdGhlIGRpc2suICovCisJCQkJdmFsdWUgYWZ0ZXIgY29tcHJlc3Npb24uICBPbmx5IHByZXNlbnQgd2hlbgorCQkJCWNvbXByZXNzZWQgb3Igc3BhcnNlLiAgQWx3YXlzIGlzIGEgbXVsdGlwbGUgb2YKKwkJCQl0aGUgY2x1c3RlciBzaXplLiAgUmVwcmVzZW50cyB0aGUgYWN0dWFsIGFtb3VudAorCQkJCW9mIGRpc2sgc3BhY2UgYmVpbmcgdXNlZCBvbiB0aGUgZGlzay4gKi8KIC8qIHNpemVvZihjb21wcmVzc2VkIGF0dHIpID0gNzIqLwogCQl9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgbm9uX3Jlc2lkZW50OwogCX0gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSBkYXRhOwpAQCAtODM0LDcgKzg1Myw3IEBACiAJLyogTm90ZSwgdGhpcyBpcyBhIGNvcHkgb2YgdGhlIGNvcnJlc3BvbmRpbmcgYml0IGZyb20gdGhlIG1mdCByZWNvcmQsCiAJICAgdGVsbGluZyB1cyB3aGV0aGVyIHRoaXMgZmlsZSBoYXMgYSB2aWV3IGluZGV4IHByZXNlbnQgKGVnLiBvYmplY3QgaWQKIAkgICBpbmRleCwgcXVvdGEgaW5kZXgsIG9uZSBvZiB0aGUgc2VjdXJpdHkgaW5kZXhlcyBvciB0aGUgZW5jcnlwdGluZwotCSAgIGZpbGUgc3lzdGVtIHJlbGF0ZWQgaW5kZXhlcykuICovCisJICAgZmlsZXN5c3RlbSByZWxhdGVkIGluZGV4ZXMpLiAqLwogfTsKIAogdHlwZWRlZiBsZTMyIEZJTEVfQVRUUl9GTEFHUzsKQEAgLTkxNywyMCArOTM2LDEyIEBACiAJCS8qIDU2Ki8JbGU2NCBxdW90YV9jaGFyZ2VkOwkvKiBCeXRlIHNpemUgb2YgdGhlIGNoYXJnZSB0bwogCQkJCXRoZSBxdW90YSBmb3IgYWxsIHN0cmVhbXMgb2YgdGhlIGZpbGUuIE5vdGU6IElzCiAJCQkJemVybyBpZiBxdW90YXMgYXJlIGRpc2FibGVkLiAqLwotCQkvKiA2NCovCWxlNjQgdXNuOwkJLyogTGFzdCB1cGRhdGUgc2VxdWVuY2UgbnVtYmVyCi0JCQkJb2YgdGhlIGZpbGUuIFRoaXMgaXMgYSBkaXJlY3QgaW5kZXggaW50byB0aGUKLQkJCQljaGFuZ2UgKGFrYSB1c24pIGpvdXJuYWwgZmlsZS4gSXQgaXMgemVybyBpZgotCQkJCXRoZSB1c24gam91cm5hbCBpcyBkaXNhYmxlZC4KLQkJCQlOT1RFOiBUbyBkaXNhYmxlIHRoZSBqb3VybmFsIG5lZWQgdG8gZGVsZXRlCi0JCQkJdGhlIGpvdXJuYWwgZmlsZSBpdHNlbGYgYW5kIHRvIHRoZW4gd2FsayB0aGUKLQkJCQl3aG9sZSBtZnQgYW5kIHNldCBhbGwgVXNuIGVudHJpZXMgaW4gYWxsIG1mdAotCQkJCXJlY29yZHMgdG8gemVybyEgKFRoaXMgY2FuIHRha2UgYSB3aGlsZSEpCi0JCQkJVGhlIGpvdXJuYWwgaXMgRklMRV9FeHRlbmQvJFVzbkpybmwuIFdpbjJrCi0JCQkJd2lsbCByZWNyZWF0ZSB0aGUgam91cm5hbCBhbmQgaW5pdGlhdGUKLQkJCQlsb2dnaW5nIGlmIG5lY2Vzc2FyeSB3aGVuIG1vdW50aW5nIHRoZQotCQkJCXBhcnRpdGlvbi4gVGhpcywgaW4gY29udHJhc3QgdG8gZGlzYWJsaW5nIHRoZQotCQkJCWpvdXJuYWwgaXMgYSB2ZXJ5IGZhc3QgcHJvY2Vzcywgc28gdGhlIHVzZXIKLQkJCQl3b24ndCBldmVuIG5vdGljZSBpdC4gKi8KKwkJLyogNjQqLwlsZVVTTiB1c247CQkvKiBMYXN0IHVwZGF0ZSBzZXF1ZW5jZSBudW1iZXIKKwkJCQlvZiB0aGUgZmlsZS4gIFRoaXMgaXMgYSBkaXJlY3QgaW5kZXggaW50byB0aGUKKwkJCQl0cmFuc2FjdGlvbiBsb2cgZmlsZSAoJFVzbkpybmwpLiAgSXQgaXMgemVybyBpZgorCQkJCXRoZSB1c24gam91cm5hbCBpcyBkaXNhYmxlZCBvciB0aGlzIGZpbGUgaGFzCisJCQkJbm90IGJlZW4gc3ViamVjdCB0byBsb2dnaW5nIHlldC4gIFNlZSB1c25qcm5sLmgKKwkJCQlmb3IgZGV0YWlscy4gKi8KIAkJfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpIHYzOwogCS8qIHNpemVvZigpID0gNzIgYnl0ZXMgKE5URlMgMy54KSAqLwogCX0gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSB2ZXI7CkBAIC0xODkzLDcgKzE5MDQsNyBAQAogCVZPTFVNRV9GTEFHU19NQVNLCQk9IGNvbnN0X2NwdV90b19sZTE2KDB4ODAzZiksCiAKIAkvKiBUbyBtYWtlIG91ciBsaWZlIGVhc2llciB3aGVuIGNoZWNraW5nIGlmIHdlIG11c3QgbW91bnQgcmVhZC1vbmx5LiAqLwotCVZPTFVNRV9NVVNUX01PVU5UX1JPX01BU0sJPSBjb25zdF9jcHVfdG9fbGUxNigweDgwMzcpLAorCVZPTFVNRV9NVVNUX01PVU5UX1JPX01BU0sJPSBjb25zdF9jcHVfdG9fbGUxNigweDgwMjcpLAogfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpOwogCiB0eXBlZGVmIGxlMTYgVk9MVU1FX0ZMQUdTOwpkaWZmIC0tZ2l0IGEvZnMvbnRmcy9sY25hbGxvYy5jIGIvZnMvbnRmcy9sY25hbGxvYy5jCmluZGV4IDIzZmQ5MTEuLmE0YmMwNzYgMTAwNjQ0Ci0tLSBhL2ZzL250ZnMvbGNuYWxsb2MuYworKysgYi9mcy9udGZzL2xjbmFsbG9jLmMKQEAgLTEsNyArMSw3IEBACiAvKgogICogbGNuYWxsb2MuYyAtIENsdXN0ZXIgKGRlKWFsbG9jYXRpb24gY29kZS4gIFBhcnQgb2YgdGhlIExpbnV4LU5URlMgcHJvamVjdC4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgQW50b24gQWx0YXBhcm1ha292CisgKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNSBBbnRvbiBBbHRhcGFybWFrb3YKICAqCiAgKiBUaGlzIHByb2dyYW0vaW5jbHVkZSBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCkBAIC02MCw3ICs2MCw3IEBACiAJCWlmIChybC0+bGNuIDwgMCkKIAkJCWNvbnRpbnVlOwogCQllcnIgPSBudGZzX2JpdG1hcF9jbGVhcl9ydW4obGNuYm1wX3ZpLCBybC0+bGNuLCBybC0+bGVuZ3RoKTsKLQkJaWYgKHVubGlrZWx5KGVyciAmJiAoIXJldCB8fCByZXQgPT0gRU5PTUVNKSAmJiByZXQgIT0gZXJyKSkKKwkJaWYgKHVubGlrZWx5KGVyciAmJiAoIXJldCB8fCByZXQgPT0gLUVOT01FTSkgJiYgcmV0ICE9IGVycikpCiAJCQlyZXQgPSBlcnI7CiAJfQogCW50ZnNfZGVidWcoIkRvbmUuIik7CkBAIC0xNDAsNiArMTQwLDcgQEAKIAlMQ04gem9uZV9zdGFydCwgem9uZV9lbmQsIGJtcF9wb3MsIGJtcF9pbml0aWFsX3BvcywgbGFzdF9yZWFkX3BvcywgbGNuOwogCUxDTiBwcmV2X2xjbiA9IDAsIHByZXZfcnVuX2xlbiA9IDAsIG1mdF96b25lX3NpemU7CiAJczY0IGNsdXN0ZXJzOworCWxvZmZfdCBpX3NpemU7CiAJc3RydWN0IGlub2RlICpsY25ibXBfdmk7CiAJcnVubGlzdF9lbGVtZW50ICpybCA9IE5VTEw7CiAJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmc7CkBAIC0yNDksNiArMjUwLDcgQEAKIAljbHVzdGVycyA9IGNvdW50OwogCXJscG9zID0gcmxzaXplID0gMDsKIAltYXBwaW5nID0gbGNuYm1wX3ZpLT5pX21hcHBpbmc7CisJaV9zaXplID0gaV9zaXplX3JlYWQobGNuYm1wX3ZpKTsKIAl3aGlsZSAoMSkgewogCQludGZzX2RlYnVnKCJTdGFydCBvZiBvdXRlciB3aGlsZSBsb29wOiBkb25lX3pvbmVzIDB4JXgsICIKIAkJCQkic2VhcmNoX3pvbmUgJWksIHBhc3MgJWksIHpvbmVfc3RhcnQgMHglbGx4LCAiCkBAIC0yNjMsNyArMjY1LDcgQEAKIAkJbGFzdF9yZWFkX3BvcyA9IGJtcF9wb3MgPj4gMzsKIAkJbnRmc19kZWJ1ZygibGFzdF9yZWFkX3BvcyAweCVsbHguIiwKIAkJCQkodW5zaWduZWQgbG9uZyBsb25nKWxhc3RfcmVhZF9wb3MpOwotCQlpZiAobGFzdF9yZWFkX3BvcyA+IGxjbmJtcF92aS0+aV9zaXplKSB7CisJCWlmIChsYXN0X3JlYWRfcG9zID4gaV9zaXplKSB7CiAJCQludGZzX2RlYnVnKCJFbmQgb2YgYXR0cmlidXRlIHJlYWNoZWQuICAiCiAJCQkJCSJTa2lwcGluZyB0byB6b25lX3Bhc3NfZG9uZS4iKTsKIAkJCWdvdG8gem9uZV9wYXNzX2RvbmU7CkBAIC0yODcsMTEgKzI4OSwxMSBAQAogCQlidWZfc2l6ZSA9IGxhc3RfcmVhZF9wb3MgJiB+UEFHRV9DQUNIRV9NQVNLOwogCQlidWYgPSBwYWdlX2FkZHJlc3MocGFnZSkgKyBidWZfc2l6ZTsKIAkJYnVmX3NpemUgPSBQQUdFX0NBQ0hFX1NJWkUgLSBidWZfc2l6ZTsKLQkJaWYgKHVubGlrZWx5KGxhc3RfcmVhZF9wb3MgKyBidWZfc2l6ZSA+IGxjbmJtcF92aS0+aV9zaXplKSkKLQkJCWJ1Zl9zaXplID0gbGNuYm1wX3ZpLT5pX3NpemUgLSBsYXN0X3JlYWRfcG9zOworCQlpZiAodW5saWtlbHkobGFzdF9yZWFkX3BvcyArIGJ1Zl9zaXplID4gaV9zaXplKSkKKwkJCWJ1Zl9zaXplID0gaV9zaXplIC0gbGFzdF9yZWFkX3BvczsKIAkJYnVmX3NpemUgPDw9IDM7CiAJCWxjbiA9IGJtcF9wb3MgJiA3OwotCQlibXBfcG9zICY9IH43OworCQlibXBfcG9zICY9IH4oTENOKTc7CiAJCW50ZnNfZGVidWcoIkJlZm9yZSBpbm5lciB3aGlsZSBsb29wOiBidWZfc2l6ZSAlaSwgbGNuIDB4JWxseCwgIgogCQkJCSJibXBfcG9zIDB4JWxseCwgbmVlZF93cml0ZWJhY2sgJWkuIiwgYnVmX3NpemUsCiAJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylsY24sCkBAIC0zMDksNyArMzExLDcgQEAKIAkJCQkJKHVuc2lnbmVkIGludCkqYnl0ZSk7CiAJCQkvKiBTa2lwIGZ1bGwgYnl0ZXMuICovCiAJCQlpZiAoKmJ5dGUgPT0gMHhmZikgewotCQkJCWxjbiA9IChsY24gKyA4KSAmIH43OworCQkJCWxjbiA9IChsY24gKyA4KSAmIH4oTENOKTc7CiAJCQkJbnRmc19kZWJ1ZygiQ29udGludWluZyB3aGlsZSBsb29wIDEuIik7CiAJCQkJY29udGludWU7CiAJCQl9CkBAIC02OTEsNyArNjkzLDcgQEAKIAkJaWYgKHpvbmUgPT0gTUZUX1pPTkUgfHwgbWZ0X3pvbmVfc2l6ZSA8PSAwKSB7CiAJCQludGZzX2RlYnVnKCJObyBmcmVlIGNsdXN0ZXJzIGxlZnQsIGdvaW5nIHRvIG91dC4iKTsKIAkJCS8qIFJlYWxseSBubyBtb3JlIHNwYWNlIGxlZnQgb24gZGV2aWNlLiAqLwotCQkJZXJyID0gRU5PU1BDOworCQkJZXJyID0gLUVOT1NQQzsKIAkJCWdvdG8gb3V0OwogCQl9IC8qIHpvbmUgPT0gREFUQV9aT05FICYmIG1mdF96b25lX3NpemUgPiAwICovCiAJCW50ZnNfZGVidWcoIlNocmlua2luZyBtZnQgem9uZS4iKTsKQEAgLTc1NSwxMyArNzU3LDEzIEBACiAJaWYgKHJsKSB7CiAJCWludCBlcnIyOwogCi0JCWlmIChlcnIgPT0gRU5PU1BDKQorCQlpZiAoZXJyID09IC1FTk9TUEMpCiAJCQludGZzX2RlYnVnKCJOb3QgZW5vdWdoIHNwYWNlIHRvIGNvbXBsZXRlIGFsbG9jYXRpb24sICIKLQkJCQkJImVyciBFTk9TUEMsIGZpcnN0IGZyZWUgbGNuIDB4JWxseCwgIgorCQkJCQkiZXJyIC1FTk9TUEMsIGZpcnN0IGZyZWUgbGNuIDB4JWxseCwgIgogCQkJCQkiY291bGQgYWxsb2NhdGUgdXAgdG8gMHglbGx4ICIKIAkJCQkJImNsdXN0ZXJzLiIsCiAJCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpcmxbMF0ubGNuLAotCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKWNvdW50IC0gY2x1c3RlcnMpOworCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKShjb3VudCAtIGNsdXN0ZXJzKSk7CiAJCS8qIERlYWxsb2NhdGUgYWxsIGFsbG9jYXRlZCBjbHVzdGVycy4gKi8KIAkJbnRmc19kZWJ1ZygiQXR0ZW1wdGluZyByb2xsYmFjay4uLiIpOwogCQllcnIyID0gbnRmc19jbHVzdGVyX2ZyZWVfZnJvbV9ybF9ub2xvY2sodm9sLCBybCk7CkBAIC03NzMsMTAgKzc3NSwxMCBAQAogCQl9CiAJCS8qIEZyZWUgdGhlIHJ1bmxpc3QuICovCiAJCW50ZnNfZnJlZShybCk7Ci0JfSBlbHNlIGlmIChlcnIgPT0gRU5PU1BDKQotCQludGZzX2RlYnVnKCJObyBzcGFjZSBsZWZ0IGF0IGFsbCwgZXJyID0gRU5PU1BDLCAiCi0JCQkJImZpcnN0IGZyZWUgbGNuID0gMHglbGx4LiIsCi0JCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyl2b2wtPmRhdGExX3pvbmVfcG9zKTsKKwl9IGVsc2UgaWYgKGVyciA9PSAtRU5PU1BDKQorCQludGZzX2RlYnVnKCJObyBzcGFjZSBsZWZ0IGF0IGFsbCwgZXJyID0gLUVOT1NQQywgZmlyc3QgZnJlZSAiCisJCQkJImxjbiA9IDB4JWxseC4iLAorCQkJCShsb25nIGxvbmcpdm9sLT5kYXRhMV96b25lX3Bvcyk7CiAJdXBfd3JpdGUoJnZvbC0+bGNuYm1wX2xvY2spOwogCXJldHVybiBFUlJfUFRSKGVycik7CiB9CkBAIC04NDYsOCArODQ4LDggQEAKIAogCXRvdGFsX2ZyZWVkID0gcmVhbF9mcmVlZCA9IDA7CiAKLQkvKiBUaGlzIHJldHVybnMgd2l0aCBuaS0+cnVubGlzdCBsb2NrZWQgZm9yIHJlYWRpbmcgb24gc3VjY2Vzcy4gKi8KLQlybCA9IG50ZnNfZmluZF92Y24obmksIHN0YXJ0X3ZjbiwgRkFMU0UpOworCWRvd25fcmVhZCgmbmktPnJ1bmxpc3QubG9jayk7CisJcmwgPSBudGZzX2F0dHJfZmluZF92Y25fbm9sb2NrKG5pLCBzdGFydF92Y24sIEZBTFNFKTsKIAlpZiAoSVNfRVJSKHJsKSkgewogCQlpZiAoIWlzX3JvbGxiYWNrKQogCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIGZpbmQgZmlyc3QgcnVubGlzdCAiCkBAIC04NjEsNyArODYzLDcgQEAKIAkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZpcnN0IHJ1bmxpc3QgZWxlbWVudCBoYXMgIgogCQkJCQkiaW52YWxpZCBsY24sIGFib3J0aW5nLiIpOwogCQllcnIgPSAtRUlPOwotCQlnb3RvIHVubF9lcnJfb3V0OworCQlnb3RvIGVycl9vdXQ7CiAJfQogCS8qIEZpbmQgdGhlIHN0YXJ0aW5nIGNsdXN0ZXIgaW5zaWRlIHRoZSBydW4gdGhhdCBuZWVkcyBmcmVlaW5nLiAqLwogCWRlbHRhID0gc3RhcnRfdmNuIC0gcmwtPnZjbjsKQEAgLTg3OSw3ICs4ODEsNyBAQAogCQkJaWYgKCFpc19yb2xsYmFjaykKIAkJCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gY2xlYXIgZmlyc3QgcnVuICIKIAkJCQkJCSIoZXJyb3IgJWkpLCBhYm9ydGluZy4iLCBlcnIpOwotCQkJZ290byB1bmxfZXJyX291dDsKKwkJCWdvdG8gZXJyX291dDsKIAkJfQogCQkvKiBXZSBoYXZlIGZyZWVkIEB0b19mcmVlIHJlYWwgY2x1c3RlcnMuICovCiAJCXJlYWxfZnJlZWQgPSB0b19mcmVlOwpAQCAtODk5LDMwICs5MDEsMTUgQEAKIAkJaWYgKHVubGlrZWx5KHJsLT5sY24gPCBMQ05fSE9MRSkpIHsKIAkJCVZDTiB2Y247CiAKLQkJCS8qCi0JCQkgKiBBdHRlbXB0IHRvIG1hcCBydW5saXN0LCBkcm9wcGluZyBydW5saXN0IGxvY2sgZm9yCi0JCQkgKiB0aGUgZHVyYXRpb24uCi0JCQkgKi8KKwkJCS8qIEF0dGVtcHQgdG8gbWFwIHJ1bmxpc3QuICovCiAJCQl2Y24gPSBybC0+dmNuOwotCQkJdXBfcmVhZCgmbmktPnJ1bmxpc3QubG9jayk7Ci0JCQllcnIgPSBudGZzX21hcF9ydW5saXN0KG5pLCB2Y24pOwotCQkJaWYgKGVycikgewotCQkJCWlmICghaXNfcm9sbGJhY2spCi0JCQkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byBtYXAgIgotCQkJCQkJCSJydW5saXN0IGZyYWdtZW50LiIpOwotCQkJCWlmIChlcnIgPT0gLUVJTlZBTCB8fCBlcnIgPT0gLUVOT0VOVCkKLQkJCQkJZXJyID0gLUVJTzsKLQkJCQlnb3RvIGVycl9vdXQ7Ci0JCQl9Ci0JCQkvKgotCQkJICogVGhpcyByZXR1cm5zIHdpdGggbmktPnJ1bmxpc3QgbG9ja2VkIGZvciByZWFkaW5nIG9uCi0JCQkgKiBzdWNjZXNzLgotCQkJICovCi0JCQlybCA9IG50ZnNfZmluZF92Y24obmksIHZjbiwgRkFMU0UpOworCQkJcmwgPSBudGZzX2F0dHJfZmluZF92Y25fbm9sb2NrKG5pLCB2Y24sIEZBTFNFKTsKIAkJCWlmIChJU19FUlIocmwpKSB7CiAJCQkJZXJyID0gUFRSX0VSUihybCk7CiAJCQkJaWYgKCFpc19yb2xsYmFjaykKLQkJCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIGZpbmQgIgorCQkJCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gbWFwICIKKwkJCQkJCQkicnVubGlzdCBmcmFnbWVudCBvciAiCisJCQkJCQkJImZhaWxlZCB0byBmaW5kICIKIAkJCQkJCQkic3Vic2VxdWVudCBydW5saXN0ICIKIAkJCQkJCQkiZWxlbWVudC4iKTsKIAkJCQlnb3RvIGVycl9vdXQ7CkBAIC05MzUsNyArOTIyLDcgQEAKIAkJCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKQogCQkJCQkJCXJsLT5sY24pOwogCQkJCWVyciA9IC1FSU87Ci0JCQkJZ290byB1bmxfZXJyX291dDsKKwkJCQlnb3RvIGVycl9vdXQ7CiAJCQl9CiAJCX0KIAkJLyogVGhlIG51bWJlciBvZiBjbHVzdGVycyBpbiB0aGlzIHJ1biB0aGF0IG5lZWQgZnJlZWluZy4gKi8KQEAgLTk1MSw3ICs5MzgsNyBAQAogCQkJCWlmICghaXNfcm9sbGJhY2spCiAJCQkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byBjbGVhciAiCiAJCQkJCQkJInN1YnNlcXVlbnQgcnVuLiIpOwotCQkJCWdvdG8gdW5sX2Vycl9vdXQ7CisJCQkJZ290byBlcnJfb3V0OwogCQkJfQogCQkJLyogV2UgaGF2ZSBmcmVlZCBAdG9fZnJlZSByZWFsIGNsdXN0ZXJzLiAqLwogCQkJcmVhbF9mcmVlZCArPSB0b19mcmVlOwpAQCAtOTcyLDkgKzk1OSw4IEBACiAJLyogV2UgYXJlIGRvbmUuICBSZXR1cm4gdGhlIG51bWJlciBvZiBhY3R1YWxseSBmcmVlZCBjbHVzdGVycy4gKi8KIAludGZzX2RlYnVnKCJEb25lLiIpOwogCXJldHVybiByZWFsX2ZyZWVkOwotdW5sX2Vycl9vdXQ6Ci0JdXBfcmVhZCgmbmktPnJ1bmxpc3QubG9jayk7CiBlcnJfb3V0OgorCXVwX3JlYWQoJm5pLT5ydW5saXN0LmxvY2spOwogCWlmIChpc19yb2xsYmFjaykKIAkJcmV0dXJuIGVycjsKIAkvKiBJZiBubyByZWFsIGNsdXN0ZXJzIHdlcmUgZnJlZWQsIG5vIG5lZWQgdG8gcm9sbGJhY2suICovCmRpZmYgLS1naXQgYS9mcy9udGZzL2xvZ2ZpbGUuYyBiL2ZzL250ZnMvbG9nZmlsZS5jCmluZGV4IDVlMjgwYWIuLjhlZGI4ZTIgMTAwNjQ0Ci0tLSBhL2ZzL250ZnMvbG9nZmlsZS5jCisrKyBiL2ZzL250ZnMvbG9nZmlsZS5jCkBAIC0xLDcgKzEsNyBAQAogLyoKICAqIGxvZ2ZpbGUuYyAtIE5URlMga2VybmVsIGpvdXJuYWwgaGFuZGxpbmcuIFBhcnQgb2YgdGhlIExpbnV4LU5URlMgcHJvamVjdC4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNCBBbnRvbiBBbHRhcGFybWFrb3YKKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IEFudG9uIEFsdGFwYXJtYWtvdgogICoKICAqIFRoaXMgcHJvZ3JhbS9pbmNsdWRlIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKQEAgLTQxMCw3ICs0MTAsNyBAQAogfQogCiAvKioKLSAqIG50ZnNfY2tlY2tfbG9nZmlsZSAtIGNoZWNrIGluIHRoZSBqb3VybmFsIGlmIHRoZSB2b2x1bWUgaXMgY29uc2lzdGVudAorICogbnRmc19jaGVja19sb2dmaWxlIC0gY2hlY2sgdGhlIGpvdXJuYWwgZm9yIGNvbnNpc3RlbmN5CiAgKiBAbG9nX3ZpOglzdHJ1Y3QgaW5vZGUgb2YgbG9hZGVkIGpvdXJuYWwgJExvZ0ZpbGUgdG8gY2hlY2sKICAqCiAgKiBDaGVjayB0aGUgJExvZ0ZpbGUgam91cm5hbCBmb3IgY29uc2lzdGVuY3kgYW5kIHJldHVybiBUUlVFIGlmIGl0IGlzCkBAIC00NDMsNyArNDQzLDcgQEAKIAkvKiBBbiBlbXB0eSAkTG9nRmlsZSBtdXN0IGhhdmUgYmVlbiBjbGVhbiBiZWZvcmUgaXQgZ290IGVtcHRpZWQuICovCiAJaWYgKE5Wb2xMb2dGaWxlRW1wdHkodm9sKSkKIAkJZ290byBpc19lbXB0eTsKLQlzaXplID0gbG9nX3ZpLT5pX3NpemU7CisJc2l6ZSA9IGlfc2l6ZV9yZWFkKGxvZ192aSk7CiAJLyogTWFrZSBzdXJlIHRoZSBmaWxlIGRvZXNuJ3QgZXhjZWVkIHRoZSBtYXhpbXVtIGFsbG93ZWQgc2l6ZS4gKi8KIAlpZiAoc2l6ZSA+IE1heExvZ0ZpbGVTaXplKQogCQlzaXplID0gTWF4TG9nRmlsZVNpemU7CkBAIC00NjQsNyArNDY0LDcgQEAKIAkgKiBvcHRpbWl6ZSBsb2dfcGFnZV9zaXplIGFuZCBsb2dfcGFnZV9iaXRzIGludG8gY29uc3RhbnRzLgogCSAqLwogCWxvZ19wYWdlX2JpdHMgPSBnZW5lcmljX2Zmcyhsb2dfcGFnZV9zaXplKSAtIDE7Ci0Jc2l6ZSAmPSB+KGxvZ19wYWdlX3NpemUgLSAxKTsKKwlzaXplICY9IH4oczY0KShsb2dfcGFnZV9zaXplIC0gMSk7CiAJLyoKIAkgKiBFbnN1cmUgdGhlIGxvZyBmaWxlIGlzIGJpZyBlbm91Z2ggdG8gc3RvcmUgYXQgbGVhc3QgdGhlIHR3byByZXN0YXJ0CiAJICogcGFnZXMgYW5kIHRoZSBtaW5pbXVtIG51bWJlciBvZiBsb2cgcmVjb3JkIHBhZ2VzLgpAQCAtNjg5LDcgKzY4OSw4IEBACiAJaWYgKCFOVm9sTG9nRmlsZUVtcHR5KHZvbCkpIHsKIAkJaW50IGVycjsKIAkJCi0JCWVyciA9IG50ZnNfYXR0cl9zZXQoTlRGU19JKGxvZ192aSksIDAsIGxvZ192aS0+aV9zaXplLCAweGZmKTsKKwkJZXJyID0gbnRmc19hdHRyX3NldChOVEZTX0kobG9nX3ZpKSwgMCwgaV9zaXplX3JlYWQobG9nX3ZpKSwKKwkJCQkweGZmKTsKIAkJaWYgKHVubGlrZWx5KGVycikpIHsKIAkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byBmaWxsICRMb2dGaWxlIHdpdGggIgogCQkJCQkiMHhmZiBieXRlcyAoZXJyb3IgY29kZSAlaSkuIiwgZXJyKTsKZGlmZiAtLWdpdCBhL2ZzL250ZnMvbWZ0LmMgYi9mcy9udGZzL21mdC5jCmluZGV4IGRmYTg1YWMuLmFjOWZmMzkgMTAwNjQ0Ci0tLSBhL2ZzL250ZnMvbWZ0LmMKKysrIGIvZnMvbnRmcy9tZnQuYwpAQCAtMSw3ICsxLDcgQEAKIC8qKgogICogbWZ0LmMgLSBOVEZTIGtlcm5lbCBtZnQgcmVjb3JkIG9wZXJhdGlvbnMuIFBhcnQgb2YgdGhlIExpbnV4LU5URlMgcHJvamVjdC4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNCBBbnRvbiBBbHRhcGFybWFrb3YKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA1IEFudG9uIEFsdGFwYXJtYWtvdgogICogQ29weXJpZ2h0IChjKSAyMDAyIFJpY2hhcmQgUnVzc29uCiAgKgogICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKQEAgLTQ1LDYgKzQ1LDcgQEAKICAqLwogc3RhdGljIGlubGluZSBNRlRfUkVDT1JEICptYXBfbWZ0X3JlY29yZF9wYWdlKG50ZnNfaW5vZGUgKm5pKQogeworCWxvZmZfdCBpX3NpemU7CiAJbnRmc192b2x1bWUgKnZvbCA9IG5pLT52b2w7CiAJc3RydWN0IGlub2RlICptZnRfdmkgPSB2b2wtPm1mdF9pbm87CiAJc3RydWN0IHBhZ2UgKnBhZ2U7CkBAIC02MCwxMyArNjEsMTQgQEAKIAlpbmRleCA9IG5pLT5tZnRfbm8gPDwgdm9sLT5tZnRfcmVjb3JkX3NpemVfYml0cyA+PiBQQUdFX0NBQ0hFX1NISUZUOwogCW9mcyA9IChuaS0+bWZ0X25vIDw8IHZvbC0+bWZ0X3JlY29yZF9zaXplX2JpdHMpICYgflBBR0VfQ0FDSEVfTUFTSzsKIAorCWlfc2l6ZSA9IGlfc2l6ZV9yZWFkKG1mdF92aSk7CiAJLyogVGhlIG1heGltdW0gdmFsaWQgaW5kZXggaW50byB0aGUgcGFnZSBjYWNoZSBmb3IgJE1GVCdzIGRhdGEuICovCi0JZW5kX2luZGV4ID0gbWZ0X3ZpLT5pX3NpemUgPj4gUEFHRV9DQUNIRV9TSElGVDsKKwllbmRfaW5kZXggPSBpX3NpemUgPj4gUEFHRV9DQUNIRV9TSElGVDsKIAogCS8qIElmIHRoZSB3YW50ZWQgaW5kZXggaXMgb3V0IG9mIGJvdW5kcyB0aGUgbWZ0IHJlY29yZCBkb2Vzbid0IGV4aXN0LiAqLwogCWlmICh1bmxpa2VseShpbmRleCA+PSBlbmRfaW5kZXgpKSB7Ci0JCWlmIChpbmRleCA+IGVuZF9pbmRleCB8fCAobWZ0X3ZpLT5pX3NpemUgJiB+UEFHRV9DQUNIRV9NQVNLKSA8Ci0JCQkJb2ZzICsgdm9sLT5tZnRfcmVjb3JkX3NpemUpIHsKKwkJaWYgKGluZGV4ID4gZW5kX2luZGV4IHx8IChpX3NpemUgJiB+UEFHRV9DQUNIRV9NQVNLKSA8IG9mcyArCisJCQkJdm9sLT5tZnRfcmVjb3JkX3NpemUpIHsKIAkJCXBhZ2UgPSBFUlJfUFRSKC1FTk9FTlQpOwogCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiQXR0ZW10IHRvIHJlYWQgbWZ0IHJlY29yZCAweCVseCwgIgogCQkJCQkid2hpY2ggaXMgYmV5b25kIHRoZSBlbmQgb2YgdGhlIG1mdC4gICIKQEAgLTI4NSw3ICsyODcsNyBAQAogCQkJfQogCQkJdW5tYXBfbWZ0X3JlY29yZChuaSk7CiAJCQludGZzX2Vycm9yKGJhc2VfbmktPnZvbC0+c2IsICJGb3VuZCBzdGFsZSBleHRlbnQgbWZ0ICIKLQkJCQkJInJlZmVyZW5jZSEgQ29ycnVwdCBmaWxlIHN5c3RlbS4gIgorCQkJCQkicmVmZXJlbmNlISBDb3JydXB0IGZpbGVzeXN0ZW0uICIKIAkJCQkJIlJ1biBjaGtkc2suIik7CiAJCQlyZXR1cm4gRVJSX1BUUigtRUlPKTsKIAkJfQpAQCAtMzE2LDcgKzMxOCw3IEBACiAJLyogVmVyaWZ5IHRoZSBzZXF1ZW5jZSBudW1iZXIgaWYgaXQgaXMgcHJlc2VudC4gKi8KIAlpZiAoc2VxX25vICYmIChsZTE2X3RvX2NwdShtLT5zZXF1ZW5jZV9udW1iZXIpICE9IHNlcV9ubykpIHsKIAkJbnRmc19lcnJvcihiYXNlX25pLT52b2wtPnNiLCAiRm91bmQgc3RhbGUgZXh0ZW50IG1mdCAiCi0JCQkJInJlZmVyZW5jZSEgQ29ycnVwdCBmaWxlIHN5c3RlbS4gUnVuIGNoa2Rzay4iKTsKKwkJCQkicmVmZXJlbmNlISBDb3JydXB0IGZpbGVzeXN0ZW0uIFJ1biBjaGtkc2suIik7CiAJCWRlc3Ryb3lfbmkgPSBUUlVFOwogCQltID0gRVJSX1BUUigtRUlPKTsKIAkJZ290byB1bm1fZXJyX291dDsKQEAgLTk0NiwyMCArOTQ4LDIzIEBACiAJbmEubmFtZV9sZW4gPSAwOwogCW5hLnR5cGUgPSBBVF9VTlVTRUQ7CiAJLyoKLQkgKiBGb3IgaW5vZGUgMCwgaS5lLiAkTUZUIGl0c2VsZiwgd2UgY2Fubm90IHVzZSBpbG9va3VwNSgpIGZyb20gaGVyZSBvcgotCSAqIHdlIGRlYWRsb2NrIGJlY2F1c2UgdGhlIGlub2RlIGlzIGFscmVhZHkgbG9ja2VkIGJ5IHRoZSBrZXJuZWwKLQkgKiAoZnMvZnMtd3JpdGViYWNrLmM6Ol9fc3luY19zaW5nbGVfaW5vZGUoKSkgYW5kIGlsb29rdXA1KCkgd2FpdHMKLQkgKiB1bnRpbCB0aGUgaW5vZGUgaXMgdW5sb2NrZWQgYmVmb3JlIHJldHVybmluZyBpdCBhbmQgaXQgbmV2ZXIgZ2V0cwotCSAqIHVubG9ja2VkIGJlY2F1c2UgbnRmc19zaG91bGRfd3JpdGVfbWZ0X3JlY29yZCgpIG5ldmVyIHJldHVybnMuICApLToKLQkgKiBGb3J0dW5hdGVseSwgd2UgaGF2ZSBpbm9kZSAwIHBpbm5lZCBpbiBpY2FjaGUgZm9yIHRoZSBkdXJhdGlvbiBvZgotCSAqIHRoZSBtb3VudCBzbyB3ZSBjYW4gYWNjZXNzIGl0IGRpcmVjdGx5LgorCSAqIE9wdGltaXplIGlub2RlIDAsIGkuZS4gJE1GVCBpdHNlbGYsIHNpbmNlIHdlIGhhdmUgaXQgaW4gbWVtb3J5IGFuZAorCSAqIHdlIGdldCBoZXJlIGZvciBpdCByYXRoZXIgb2Z0ZW4uCiAJICovCiAJaWYgKCFtZnRfbm8pIHsKIAkJLyogQmFsYW5jZSB0aGUgYmVsb3cgaXB1dCgpLiAqLwogCQl2aSA9IGlncmFiKG1mdF92aSk7CiAJCUJVR19PTih2aSAhPSBtZnRfdmkpOwotCX0gZWxzZQotCQl2aSA9IGlsb29rdXA1KHNiLCBtZnRfbm8sICh0ZXN0X3QpbnRmc190ZXN0X2lub2RlLCAmbmEpOworCX0gZWxzZSB7CisJCS8qCisJCSAqIEhhdmUgdG8gdXNlIGlsb29rdXA1X25vd2FpdCgpIHNpbmNlIGlsb29rdXA1KCkgd2FpdHMgZm9yIHRoZQorCQkgKiBpbm9kZSBsb2NrIHdoaWNoIGNhdXNlcyBudGZzIHRvIGRlYWRsb2NrIHdoZW4gYSBjb25jdXJyZW50CisJCSAqIGlub2RlIHdyaXRlIHZpYSB0aGUgaW5vZGUgZGlydHkgY29kZSBwYXRocyBhbmQgdGhlIHBhZ2UKKwkJICogZGlydHkgY29kZSBwYXRoIG9mIHRoZSBpbm9kZSBkaXJ0eSBjb2RlIHBhdGggd2hlbiB3cml0aW5nCisJCSAqICRNRlQgb2NjdXJzLgorCQkgKi8KKwkJdmkgPSBpbG9va3VwNV9ub3dhaXQoc2IsIG1mdF9ubywgKHRlc3RfdCludGZzX3Rlc3RfaW5vZGUsICZuYSk7CisJfQogCWlmICh2aSkgewogCQludGZzX2RlYnVnKCJCYXNlIGlub2RlIDB4JWx4IGlzIGluIGljYWNoZS4iLCBtZnRfbm8pOwogCQkvKiBUaGUgaW5vZGUgaXMgaW4gaWNhY2hlLiAqLwpAQCAtMTAxNCw3ICsxMDE5LDEzIEBACiAJbmEubWZ0X25vID0gTVJFRl9MRShtLT5iYXNlX21mdF9yZWNvcmQpOwogCW50ZnNfZGVidWcoIk1mdCByZWNvcmQgMHglbHggaXMgYW4gZXh0ZW50IHJlY29yZC4gIExvb2tpbmcgZm9yIGJhc2UgIgogCQkJImlub2RlIDB4JWx4IGluIGljYWNoZS4iLCBtZnRfbm8sIG5hLm1mdF9ubyk7Ci0JdmkgPSBpbG9va3VwNShzYiwgbmEubWZ0X25vLCAodGVzdF90KW50ZnNfdGVzdF9pbm9kZSwgJm5hKTsKKwlpZiAoIW5hLm1mdF9ubykgeworCQkvKiBCYWxhbmNlIHRoZSBiZWxvdyBpcHV0KCkuICovCisJCXZpID0gaWdyYWIobWZ0X3ZpKTsKKwkJQlVHX09OKHZpICE9IG1mdF92aSk7CisJfSBlbHNlCisJCXZpID0gaWxvb2t1cDVfbm93YWl0KHNiLCBuYS5tZnRfbm8sICh0ZXN0X3QpbnRmc190ZXN0X2lub2RlLAorCQkJCSZuYSk7CiAJaWYgKCF2aSkgewogCQkvKgogCQkgKiBUaGUgYmFzZSBpbm9kZSBpcyBub3QgaW4gaWNhY2hlLCB3cml0ZSB0aGlzIGV4dGVudCBtZnQKQEAgLTExMjEsNiArMTEzMiw3IEBACiAJCW50ZnNfaW5vZGUgKmJhc2VfbmkpCiB7CiAJczY0IHBhc3NfZW5kLCBsbCwgZGF0YV9wb3MsIHBhc3Nfc3RhcnQsIG9mcywgYml0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1mdGJtcF9tYXBwaW5nOwogCXU4ICpidWYsICpieXRlOwogCXN0cnVjdCBwYWdlICpwYWdlOwpAQCAtMTEzNCw5ICsxMTQ2LDEzIEBACiAJICogU2V0IHRoZSBlbmQgb2YgdGhlIHBhc3MgbWFraW5nIHN1cmUgd2UgZG8gbm90IG92ZXJmbG93IHRoZSBtZnQKIAkgKiBiaXRtYXAuCiAJICovCisJcmVhZF9sb2NrX2lycXNhdmUoJk5URlNfSSh2b2wtPm1mdF9pbm8pLT5zaXplX2xvY2ssIGZsYWdzKTsKIAlwYXNzX2VuZCA9IE5URlNfSSh2b2wtPm1mdF9pbm8pLT5hbGxvY2F0ZWRfc2l6ZSA+PgogCQkJdm9sLT5tZnRfcmVjb3JkX3NpemVfYml0czsKKwlyZWFkX3VubG9ja19pcnFyZXN0b3JlKCZOVEZTX0kodm9sLT5tZnRfaW5vKS0+c2l6ZV9sb2NrLCBmbGFncyk7CisJcmVhZF9sb2NrX2lycXNhdmUoJk5URlNfSSh2b2wtPm1mdGJtcF9pbm8pLT5zaXplX2xvY2ssIGZsYWdzKTsKIAlsbCA9IE5URlNfSSh2b2wtPm1mdGJtcF9pbm8pLT5pbml0aWFsaXplZF9zaXplIDw8IDM7CisJcmVhZF91bmxvY2tfaXJxcmVzdG9yZSgmTlRGU19JKHZvbC0+bWZ0Ym1wX2lubyktPnNpemVfbG9jaywgZmxhZ3MpOwogCWlmIChwYXNzX2VuZCA+IGxsKQogCQlwYXNzX2VuZCA9IGxsOwogCXBhc3MgPSAxOwpAQCAtMTI2Myw2ICsxMjc5LDcgQEAKIHsKIAlMQ04gbGNuOwogCXM2NCBsbDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBwYWdlICpwYWdlOwogCW50ZnNfaW5vZGUgKm1mdF9uaSwgKm1mdGJtcF9uaTsKIAlydW5saXN0X2VsZW1lbnQgKnJsLCAqcmwyID0gTlVMTDsKQEAgLTEyODQsMTcgKzEzMDEsMjAgQEAKIAkvKgogCSAqIERldGVybWluZSB0aGUgbGFzdCBsY24gb2YgdGhlIG1mdCBiaXRtYXAuICBUaGUgYWxsb2NhdGVkIHNpemUgb2YgdGhlCiAJICogbWZ0IGJpdG1hcCBjYW5ub3QgYmUgemVybyBzbyB3ZSBhcmUgb2sgdG8gZG8gdGhpcy4KLQkgKiBudGZzX2ZpbmRfdmNuKCkgcmV0dXJucyB0aGUgcnVubGlzdCBsb2NrZWQgb24gc3VjY2Vzcy4KIAkgKi8KLQlybCA9IG50ZnNfZmluZF92Y24obWZ0Ym1wX25pLCAobWZ0Ym1wX25pLT5hbGxvY2F0ZWRfc2l6ZSAtIDEpID4+Ci0JCQl2b2wtPmNsdXN0ZXJfc2l6ZV9iaXRzLCBUUlVFKTsKKwlkb3duX3dyaXRlKCZtZnRibXBfbmktPnJ1bmxpc3QubG9jayk7CisJcmVhZF9sb2NrX2lycXNhdmUoJm1mdGJtcF9uaS0+c2l6ZV9sb2NrLCBmbGFncyk7CisJbGwgPSBtZnRibXBfbmktPmFsbG9jYXRlZF9zaXplOworCXJlYWRfdW5sb2NrX2lycXJlc3RvcmUoJm1mdGJtcF9uaS0+c2l6ZV9sb2NrLCBmbGFncyk7CisJcmwgPSBudGZzX2F0dHJfZmluZF92Y25fbm9sb2NrKG1mdGJtcF9uaSwKKwkJCShsbCAtIDEpID4+IHZvbC0+Y2x1c3Rlcl9zaXplX2JpdHMsIFRSVUUpOwogCWlmICh1bmxpa2VseShJU19FUlIocmwpIHx8ICFybC0+bGVuZ3RoIHx8IHJsLT5sY24gPCAwKSkgeworCQl1cF93cml0ZSgmbWZ0Ym1wX25pLT5ydW5saXN0LmxvY2spOwogCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gZGV0ZXJtaW5lIGxhc3QgYWxsb2NhdGVkICIKIAkJCQkiY2x1c3RlciBvZiBtZnQgYml0bWFwIGF0dHJpYnV0ZS4iKTsKLQkJaWYgKCFJU19FUlIocmwpKSB7Ci0JCQl1cF93cml0ZSgmbWZ0Ym1wX25pLT5ydW5saXN0LmxvY2spOworCQlpZiAoIUlTX0VSUihybCkpCiAJCQlyZXQgPSAtRUlPOwotCQl9IGVsc2UKKwkJZWxzZQogCQkJcmV0ID0gUFRSX0VSUihybCk7CiAJCXJldHVybiByZXQ7CiAJfQpAQCAtMTM5Niw3ICsxNDE2LDcgQEAKIAlCVUdfT04obGwgPCBybDItPnZjbik7CiAJQlVHX09OKGxsID49IHJsMi0+dmNuICsgcmwyLT5sZW5ndGgpOwogCS8qIEdldCB0aGUgc2l6ZSBmb3IgdGhlIG5ldyBtYXBwaW5nIHBhaXJzIGFycmF5IGZvciB0aGlzIGV4dGVudC4gKi8KLQltcF9zaXplID0gbnRmc19nZXRfc2l6ZV9mb3JfbWFwcGluZ19wYWlycyh2b2wsIHJsMiwgbGwpOworCW1wX3NpemUgPSBudGZzX2dldF9zaXplX2Zvcl9tYXBwaW5nX3BhaXJzKHZvbCwgcmwyLCBsbCwgLTEpOwogCWlmICh1bmxpa2VseShtcF9zaXplIDw9IDApKSB7CiAJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkdldCBzaXplIGZvciBtYXBwaW5nIHBhaXJzIGZhaWxlZCBmb3IgIgogCQkJCSJtZnQgYml0bWFwIGF0dHJpYnV0ZSBleHRlbnQuIik7CkBAIC0xNDE4LDYgKzE0MzgsOCBAQAogCQkvLyBUT0RPOiBEZWFsIHdpdGggdGhpcyBieSBtb3ZpbmcgdGhpcyBleHRlbnQgdG8gYSBuZXcgbWZ0CiAJCS8vIHJlY29yZCBvciBieSBzdGFydGluZyBhIG5ldyBleHRlbnQgaW4gYSBuZXcgbWZ0IHJlY29yZCBvciBieQogCQkvLyBtb3Zpbmcgb3RoZXIgYXR0cmlidXRlcyBvdXQgb2YgdGhpcyBtZnQgcmVjb3JkLgorCQkvLyBOb3RlOiBJdCB3aWxsIG5lZWQgdG8gYmUgYSBzcGVjaWFsIG1mdCByZWNvcmQgYW5kIGlmIG5vbmUgb2YKKwkJLy8gdGhvc2UgYXJlIGF2YWlsYWJsZSBpdCBnZXRzIHJhdGhlciBjb21wbGljYXRlZC4uLgogCQludGZzX2Vycm9yKHZvbC0+c2IsICJOb3QgZW5vdWdoIHNwYWNlIGluIHRoaXMgbWZ0IHJlY29yZCB0byAiCiAJCQkJImFjY29tb2RhdGUgZXh0ZW5kZWQgbWZ0IGJpdG1hcCBhdHRyaWJ1dGUgIgogCQkJCSJleHRlbnQuICBDYW5ub3QgaGFuZGxlIHRoaXMgeWV0LiIpOwpAQCAtMTQyOCw3ICsxNDUwLDcgQEAKIAkvKiBHZW5lcmF0ZSB0aGUgbWFwcGluZyBwYWlycyBhcnJheSBkaXJlY3RseSBpbnRvIHRoZSBhdHRyIHJlY29yZC4gKi8KIAlyZXQgPSBudGZzX21hcHBpbmdfcGFpcnNfYnVpbGQodm9sLCAodTgqKWEgKwogCQkJbGUxNl90b19jcHUoYS0+ZGF0YS5ub25fcmVzaWRlbnQubWFwcGluZ19wYWlyc19vZmZzZXQpLAotCQkJbXBfc2l6ZSwgcmwyLCBsbCwgTlVMTCk7CisJCQltcF9zaXplLCBybDIsIGxsLCAtMSwgTlVMTCk7CiAJaWYgKHVubGlrZWx5KHJldCkpIHsKIAkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIGJ1aWxkIG1hcHBpbmcgcGFpcnMgYXJyYXkgZm9yICIKIAkJCQkibWZ0IGJpdG1hcCBhdHRyaWJ1dGUuIik7CkBAIC0xNDU4LDkgKzE0ODAsMTEgQEAKIAkJfQogCQlhID0gY3R4LT5hdHRyOwogCX0KKwl3cml0ZV9sb2NrX2lycXNhdmUoJm1mdGJtcF9uaS0+c2l6ZV9sb2NrLCBmbGFncyk7CiAJbWZ0Ym1wX25pLT5hbGxvY2F0ZWRfc2l6ZSArPSB2b2wtPmNsdXN0ZXJfc2l6ZTsKIAlhLT5kYXRhLm5vbl9yZXNpZGVudC5hbGxvY2F0ZWRfc2l6ZSA9CiAJCQljcHVfdG9fc2xlNjQobWZ0Ym1wX25pLT5hbGxvY2F0ZWRfc2l6ZSk7CisJd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJm1mdGJtcF9uaS0+c2l6ZV9sb2NrLCBmbGFncyk7CiAJLyogRW5zdXJlIHRoZSBjaGFuZ2VzIG1ha2UgaXQgdG8gZGlzay4gKi8KIAlmbHVzaF9kY2FjaGVfbWZ0X3JlY29yZF9wYWdlKGN0eC0+bnRmc19pbm8pOwogCW1hcmtfbWZ0X3JlY29yZF9kaXJ0eShjdHgtPm50ZnNfaW5vKTsKQEAgLTE0NzYsNyArMTUwMCw5IEBACiAJCQkwLCBjdHgpKSB7CiAJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byBmaW5kIGxhc3QgYXR0cmlidXRlIGV4dGVudCBvZiAiCiAJCQkJIm1mdCBiaXRtYXAgYXR0cmlidXRlLiVzIiwgZXMpOworCQl3cml0ZV9sb2NrX2lycXNhdmUoJm1mdGJtcF9uaS0+c2l6ZV9sb2NrLCBmbGFncyk7CiAJCW1mdGJtcF9uaS0+YWxsb2NhdGVkX3NpemUgKz0gdm9sLT5jbHVzdGVyX3NpemU7CisJCXdyaXRlX3VubG9ja19pcnFyZXN0b3JlKCZtZnRibXBfbmktPnNpemVfbG9jaywgZmxhZ3MpOwogCQludGZzX2F0dHJfcHV0X3NlYXJjaF9jdHgoY3R4KTsKIAkJdW5tYXBfbWZ0X3JlY29yZChtZnRfbmkpOwogCQl1cF93cml0ZSgmbWZ0Ym1wX25pLT5ydW5saXN0LmxvY2spOwpAQCAtMTUxMiw3ICsxNTM4LDcgQEAKIAkJCQlhLT5kYXRhLm5vbl9yZXNpZGVudC5tYXBwaW5nX3BhaXJzX29mZnNldCksCiAJCQkJb2xkX2FsZW4gLSBsZTE2X3RvX2NwdSgKIAkJCQlhLT5kYXRhLm5vbl9yZXNpZGVudC5tYXBwaW5nX3BhaXJzX29mZnNldCksCi0JCQkJcmwyLCBsbCwgTlVMTCkpIHsKKwkJCQlybDIsIGxsLCAtMSwgTlVMTCkpIHsKIAkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byByZXN0b3JlIG1hcHBpbmcgcGFpcnMgIgogCQkJCQkiYXJyYXkuJXMiLCBlcyk7CiAJCQlOVm9sU2V0RXJyb3JzKHZvbCk7CkBAIC0xNTUwLDYgKzE1NzYsNyBAQAogc3RhdGljIGludCBudGZzX21mdF9iaXRtYXBfZXh0ZW5kX2luaXRpYWxpemVkX25vbG9jayhudGZzX3ZvbHVtZSAqdm9sKQogewogCXM2NCBvbGRfZGF0YV9zaXplLCBvbGRfaW5pdGlhbGl6ZWRfc2l6ZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBpbm9kZSAqbWZ0Ym1wX3ZpOwogCW50ZnNfaW5vZGUgKm1mdF9uaSwgKm1mdGJtcF9uaTsKIAludGZzX2F0dHJfc2VhcmNoX2N0eCAqY3R4OwpAQCAtMTU4Myw3ICsxNjEwLDggQEAKIAkJZ290byBwdXRfZXJyX291dDsKIAl9CiAJYSA9IGN0eC0+YXR0cjsKLQlvbGRfZGF0YV9zaXplID0gbWZ0Ym1wX3ZpLT5pX3NpemU7CisJd3JpdGVfbG9ja19pcnFzYXZlKCZtZnRibXBfbmktPnNpemVfbG9jaywgZmxhZ3MpOworCW9sZF9kYXRhX3NpemUgPSBpX3NpemVfcmVhZChtZnRibXBfdmkpOwogCW9sZF9pbml0aWFsaXplZF9zaXplID0gbWZ0Ym1wX25pLT5pbml0aWFsaXplZF9zaXplOwogCS8qCiAJICogV2UgY2FuIHNpbXBseSB1cGRhdGUgdGhlIGluaXRpYWxpemVkX3NpemUgYmVmb3JlIGZpbGxpbmcgdGhlIHNwYWNlCkBAIC0xNTkzLDExICsxNjIxLDEyIEBACiAJbWZ0Ym1wX25pLT5pbml0aWFsaXplZF9zaXplICs9IDg7CiAJYS0+ZGF0YS5ub25fcmVzaWRlbnQuaW5pdGlhbGl6ZWRfc2l6ZSA9CiAJCQljcHVfdG9fc2xlNjQobWZ0Ym1wX25pLT5pbml0aWFsaXplZF9zaXplKTsKLQlpZiAobWZ0Ym1wX25pLT5pbml0aWFsaXplZF9zaXplID4gbWZ0Ym1wX3ZpLT5pX3NpemUpIHsKLQkJbWZ0Ym1wX3ZpLT5pX3NpemUgPSBtZnRibXBfbmktPmluaXRpYWxpemVkX3NpemU7CisJaWYgKG1mdGJtcF9uaS0+aW5pdGlhbGl6ZWRfc2l6ZSA+IG9sZF9kYXRhX3NpemUpIHsKKwkJaV9zaXplX3dyaXRlKG1mdGJtcF92aSwgbWZ0Ym1wX25pLT5pbml0aWFsaXplZF9zaXplKTsKIAkJYS0+ZGF0YS5ub25fcmVzaWRlbnQuZGF0YV9zaXplID0KLQkJCQljcHVfdG9fc2xlNjQobWZ0Ym1wX3ZpLT5pX3NpemUpOworCQkJCWNwdV90b19zbGU2NChtZnRibXBfbmktPmluaXRpYWxpemVkX3NpemUpOwogCX0KKwl3cml0ZV91bmxvY2tfaXJxcmVzdG9yZSgmbWZ0Ym1wX25pLT5zaXplX2xvY2ssIGZsYWdzKTsKIAkvKiBFbnN1cmUgdGhlIGNoYW5nZXMgbWFrZSBpdCB0byBkaXNrLiAqLwogCWZsdXNoX2RjYWNoZV9tZnRfcmVjb3JkX3BhZ2UoY3R4LT5udGZzX2lubyk7CiAJbWFya19tZnRfcmVjb3JkX2RpcnR5KGN0eC0+bnRmc19pbm8pOwpAQCAtMTYzNiwyMiArMTY2NSwyOCBAQAogCQlnb3RvIGVycl9vdXQ7CiAJfQogCWEgPSBjdHgtPmF0dHI7CisJd3JpdGVfbG9ja19pcnFzYXZlKCZtZnRibXBfbmktPnNpemVfbG9jaywgZmxhZ3MpOwogCW1mdGJtcF9uaS0+aW5pdGlhbGl6ZWRfc2l6ZSA9IG9sZF9pbml0aWFsaXplZF9zaXplOwogCWEtPmRhdGEubm9uX3Jlc2lkZW50LmluaXRpYWxpemVkX3NpemUgPQogCQkJY3B1X3RvX3NsZTY0KG9sZF9pbml0aWFsaXplZF9zaXplKTsKLQlpZiAobWZ0Ym1wX3ZpLT5pX3NpemUgIT0gb2xkX2RhdGFfc2l6ZSkgewotCQltZnRibXBfdmktPmlfc2l6ZSA9IG9sZF9kYXRhX3NpemU7CisJaWYgKGlfc2l6ZV9yZWFkKG1mdGJtcF92aSkgIT0gb2xkX2RhdGFfc2l6ZSkgeworCQlpX3NpemVfd3JpdGUobWZ0Ym1wX3ZpLCBvbGRfZGF0YV9zaXplKTsKIAkJYS0+ZGF0YS5ub25fcmVzaWRlbnQuZGF0YV9zaXplID0gY3B1X3RvX3NsZTY0KG9sZF9kYXRhX3NpemUpOwogCX0KKwl3cml0ZV91bmxvY2tfaXJxcmVzdG9yZSgmbWZ0Ym1wX25pLT5zaXplX2xvY2ssIGZsYWdzKTsKIAlmbHVzaF9kY2FjaGVfbWZ0X3JlY29yZF9wYWdlKGN0eC0+bnRmc19pbm8pOwogCW1hcmtfbWZ0X3JlY29yZF9kaXJ0eShjdHgtPm50ZnNfaW5vKTsKIAludGZzX2F0dHJfcHV0X3NlYXJjaF9jdHgoY3R4KTsKIAl1bm1hcF9tZnRfcmVjb3JkKG1mdF9uaSk7CisjaWZkZWYgREVCVUcKKwlyZWFkX2xvY2tfaXJxc2F2ZSgmbWZ0Ym1wX25pLT5zaXplX2xvY2ssIGZsYWdzKTsKIAludGZzX2RlYnVnKCJSZXN0b3JlZCBzdGF0dXMgb2YgbWZ0Ym1wOiBhbGxvY2F0ZWRfc2l6ZSAweCVsbHgsICIKIAkJCSJkYXRhX3NpemUgMHglbGx4LCBpbml0aWFsaXplZF9zaXplIDB4JWxseC4iLAogCQkJKGxvbmcgbG9uZyltZnRibXBfbmktPmFsbG9jYXRlZF9zaXplLAotCQkJKGxvbmcgbG9uZyltZnRibXBfdmktPmlfc2l6ZSwKKwkJCShsb25nIGxvbmcpaV9zaXplX3JlYWQobWZ0Ym1wX3ZpKSwKIAkJCShsb25nIGxvbmcpbWZ0Ym1wX25pLT5pbml0aWFsaXplZF9zaXplKTsKKwlyZWFkX3VubG9ja19pcnFyZXN0b3JlKCZtZnRibXBfbmktPnNpemVfbG9jaywgZmxhZ3MpOworI2VuZGlmIC8qIERFQlVHICovCiBlcnJfb3V0OgogCXJldHVybiByZXQ7CiB9CkBAIC0xNjc5LDcgKzE3MTQsOCBAQAogewogCUxDTiBsY247CiAJVkNOIG9sZF9sYXN0X3ZjbjsKLQlzNjQgbWluX25yLCBuciwgbGwgPSAwOworCXM2NCBtaW5fbnIsIG5yLCBsbDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCW50ZnNfaW5vZGUgKm1mdF9uaTsKIAlydW5saXN0X2VsZW1lbnQgKnJsLCAqcmwyOwogCW50ZnNfYXR0cl9zZWFyY2hfY3R4ICpjdHggPSBOVUxMOwpAQCAtMTY5NSwyMyArMTczMSwyNSBAQAogCSAqIERldGVybWluZSB0aGUgcHJlZmVycmVkIGFsbG9jYXRpb24gbG9jYXRpb24sIGkuZS4gdGhlIGxhc3QgbGNuIG9mCiAJICogdGhlIG1mdCBkYXRhIGF0dHJpYnV0ZS4gIFRoZSBhbGxvY2F0ZWQgc2l6ZSBvZiB0aGUgbWZ0IGRhdGEKIAkgKiBhdHRyaWJ1dGUgY2Fubm90IGJlIHplcm8gc28gd2UgYXJlIG9rIHRvIGRvIHRoaXMuCi0JICogbnRmc19maW5kX3ZjbigpIHJldHVybnMgdGhlIHJ1bmxpc3QgbG9ja2VkIG9uIHN1Y2Nlc3MuCiAJICovCi0JcmwgPSBudGZzX2ZpbmRfdmNuKG1mdF9uaSwgKG1mdF9uaS0+YWxsb2NhdGVkX3NpemUgLSAxKSA+PgotCQkJdm9sLT5jbHVzdGVyX3NpemVfYml0cywgVFJVRSk7CisJZG93bl93cml0ZSgmbWZ0X25pLT5ydW5saXN0LmxvY2spOworCXJlYWRfbG9ja19pcnFzYXZlKCZtZnRfbmktPnNpemVfbG9jaywgZmxhZ3MpOworCWxsID0gbWZ0X25pLT5hbGxvY2F0ZWRfc2l6ZTsKKwlyZWFkX3VubG9ja19pcnFyZXN0b3JlKCZtZnRfbmktPnNpemVfbG9jaywgZmxhZ3MpOworCXJsID0gbnRmc19hdHRyX2ZpbmRfdmNuX25vbG9jayhtZnRfbmksCisJCQkobGwgLSAxKSA+PiB2b2wtPmNsdXN0ZXJfc2l6ZV9iaXRzLCBUUlVFKTsKIAlpZiAodW5saWtlbHkoSVNfRVJSKHJsKSB8fCAhcmwtPmxlbmd0aCB8fCBybC0+bGNuIDwgMCkpIHsKKwkJdXBfd3JpdGUoJm1mdF9uaS0+cnVubGlzdC5sb2NrKTsKIAkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIGRldGVybWluZSBsYXN0IGFsbG9jYXRlZCAiCiAJCQkJImNsdXN0ZXIgb2YgbWZ0IGRhdGEgYXR0cmlidXRlLiIpOwotCQlpZiAoIUlTX0VSUihybCkpIHsKLQkJCXVwX3dyaXRlKCZtZnRfbmktPnJ1bmxpc3QubG9jayk7CisJCWlmICghSVNfRVJSKHJsKSkKIAkJCXJldCA9IC1FSU87Ci0JCX0gZWxzZQorCQllbHNlCiAJCQlyZXQgPSBQVFJfRVJSKHJsKTsKIAkJcmV0dXJuIHJldDsKIAl9CiAJbGNuID0gcmwtPmxjbiArIHJsLT5sZW5ndGg7Ci0JbnRmc19kZWJ1ZygiTGFzdCBsY24gb2YgbWZ0IGRhdGEgYXR0cmlidXRlIGlzIDB4JWxseC4iLAotCQkJKGxvbmcgbG9uZylsY24pOworCW50ZnNfZGVidWcoIkxhc3QgbGNuIG9mIG1mdCBkYXRhIGF0dHJpYnV0ZSBpcyAweCVsbHguIiwgKGxvbmcgbG9uZylsY24pOwogCS8qIE1pbmltdW0gYWxsb2NhdGlvbiBpcyBvbmUgbWZ0IHJlY29yZCB3b3J0aCBvZiBjbHVzdGVycy4gKi8KIAltaW5fbnIgPSB2b2wtPm1mdF9yZWNvcmRfc2l6ZSA+PiB2b2wtPmNsdXN0ZXJfc2l6ZV9iaXRzOwogCWlmICghbWluX25yKQpAQCAtMTcyMSwxMiArMTc1OSwxMyBAQAogCWlmICghbnIpCiAJCW5yID0gbWluX25yOwogCS8qIEVuc3VyZSB3ZSBkbyBub3QgZ28gYWJvdmUgMl4zMi0xIG1mdCByZWNvcmRzLiAqLwotCWlmICh1bmxpa2VseSgobWZ0X25pLT5hbGxvY2F0ZWRfc2l6ZSArCi0JCQkobnIgPDwgdm9sLT5jbHVzdGVyX3NpemVfYml0cykpID4+CisJcmVhZF9sb2NrX2lycXNhdmUoJm1mdF9uaS0+c2l6ZV9sb2NrLCBmbGFncyk7CisJbGwgPSBtZnRfbmktPmFsbG9jYXRlZF9zaXplOworCXJlYWRfdW5sb2NrX2lycXJlc3RvcmUoJm1mdF9uaS0+c2l6ZV9sb2NrLCBmbGFncyk7CisJaWYgKHVubGlrZWx5KChsbCArIChuciA8PCB2b2wtPmNsdXN0ZXJfc2l6ZV9iaXRzKSkgPj4KIAkJCXZvbC0+bWZ0X3JlY29yZF9zaXplX2JpdHMgPj0gKDFsbCA8PCAzMikpKSB7CiAJCW5yID0gbWluX25yOwotCQlpZiAodW5saWtlbHkoKG1mdF9uaS0+YWxsb2NhdGVkX3NpemUgKwotCQkJCShuciA8PCB2b2wtPmNsdXN0ZXJfc2l6ZV9iaXRzKSkgPj4KKwkJaWYgKHVubGlrZWx5KChsbCArIChuciA8PCB2b2wtPmNsdXN0ZXJfc2l6ZV9iaXRzKSkgPj4KIAkJCQl2b2wtPm1mdF9yZWNvcmRfc2l6ZV9iaXRzID49ICgxbGwgPDwgMzIpKSkgewogCQkJbnRmc193YXJuaW5nKHZvbC0+c2IsICJDYW5ub3QgYWxsb2NhdGUgbWZ0IHJlY29yZCAiCiAJCQkJCSJiZWNhdXNlIHRoZSBtYXhpbXVtIG51bWJlciBvZiBpbm9kZXMgIgpAQCAtMTc3Miw3ICsxODExLDcgQEAKIAkJcmV0dXJuIFBUUl9FUlIocmwpOwogCX0KIAltZnRfbmktPnJ1bmxpc3QucmwgPSBybDsKLQludGZzX2RlYnVnKCJBbGxvY2F0ZWQgJWxsaSBjbHVzdGVycy4iLCBucik7CisJbnRmc19kZWJ1ZygiQWxsb2NhdGVkICVsbGkgY2x1c3RlcnMuIiwgKGxvbmcgbG9uZylucik7CiAJLyogRmluZCB0aGUgbGFzdCBydW4gaW4gdGhlIG5ldyBydW5saXN0LiAqLwogCWZvciAoOyBybFsxXS5sZW5ndGg7IHJsKyspCiAJCTsKQEAgLTE4MDgsNyArMTg0Nyw3IEBACiAJQlVHX09OKGxsIDwgcmwyLT52Y24pOwogCUJVR19PTihsbCA+PSBybDItPnZjbiArIHJsMi0+bGVuZ3RoKTsKIAkvKiBHZXQgdGhlIHNpemUgZm9yIHRoZSBuZXcgbWFwcGluZyBwYWlycyBhcnJheSBmb3IgdGhpcyBleHRlbnQuICovCi0JbXBfc2l6ZSA9IG50ZnNfZ2V0X3NpemVfZm9yX21hcHBpbmdfcGFpcnModm9sLCBybDIsIGxsKTsKKwltcF9zaXplID0gbnRmc19nZXRfc2l6ZV9mb3JfbWFwcGluZ19wYWlycyh2b2wsIHJsMiwgbGwsIC0xKTsKIAlpZiAodW5saWtlbHkobXBfc2l6ZSA8PSAwKSkgewogCQludGZzX2Vycm9yKHZvbC0+c2IsICJHZXQgc2l6ZSBmb3IgbWFwcGluZyBwYWlycyBmYWlsZWQgZm9yICIKIAkJCQkibWZ0IGRhdGEgYXR0cmlidXRlIGV4dGVudC4iKTsKQEAgLTE4MzIsNyArMTg3MSwxMSBAQAogCQkvLyBtb3Zpbmcgb3RoZXIgYXR0cmlidXRlcyBvdXQgb2YgdGhpcyBtZnQgcmVjb3JkLgogCQkvLyBOb3RlOiBVc2UgdGhlIHNwZWNpYWwgcmVzZXJ2ZWQgbWZ0IHJlY29yZHMgYW5kIGVuc3VyZSB0aGF0CiAJCS8vIHRoaXMgZXh0ZW50IGlzIG5vdCByZXF1aXJlZCB0byBmaW5kIHRoZSBtZnQgcmVjb3JkIGluCi0JCS8vIHF1ZXN0aW9uLgorCQkvLyBxdWVzdGlvbi4gIElmIG5vIGZyZWUgc3BlY2lhbCByZWNvcmRzIGxlZnQgd2Ugd291bGQgbmVlZCB0bworCQkvLyBtb3ZlIGFuIGV4aXN0aW5nIHJlY29yZCBhd2F5LCBpbnNlcnQgb3VycyBpbiBpdHMgcGxhY2UsIGFuZAorCQkvLyB0aGVuIHBsYWNlIHRoZSBtb3ZlZCByZWNvcmQgaW50byB0aGUgbmV3bHkgYWxsb2NhdGVkIHNwYWNlCisJCS8vIGFuZCB3ZSB3b3VsZCB0aGVuIG5lZWQgdG8gdXBkYXRlIGFsbCByZWZlcmVuY2VzIHRvIHRoaXMgbWZ0CisJCS8vIHJlY29yZCBhcHByb3ByaWF0ZWx5LiAgVGhpcyBpcyByYXRoZXIgY29tcGxpY2F0ZWQuLi4KIAkJbnRmc19lcnJvcih2b2wtPnNiLCAiTm90IGVub3VnaCBzcGFjZSBpbiB0aGlzIG1mdCByZWNvcmQgdG8gIgogCQkJCSJhY2NvbW9kYXRlIGV4dGVuZGVkIG1mdCBkYXRhIGF0dHJpYnV0ZSAiCiAJCQkJImV4dGVudC4gIENhbm5vdCBoYW5kbGUgdGhpcyB5ZXQuIik7CkBAIC0xODQzLDcgKzE4ODYsNyBAQAogCS8qIEdlbmVyYXRlIHRoZSBtYXBwaW5nIHBhaXJzIGFycmF5IGRpcmVjdGx5IGludG8gdGhlIGF0dHIgcmVjb3JkLiAqLwogCXJldCA9IG50ZnNfbWFwcGluZ19wYWlyc19idWlsZCh2b2wsICh1OCopYSArCiAJCQlsZTE2X3RvX2NwdShhLT5kYXRhLm5vbl9yZXNpZGVudC5tYXBwaW5nX3BhaXJzX29mZnNldCksCi0JCQltcF9zaXplLCBybDIsIGxsLCBOVUxMKTsKKwkJCW1wX3NpemUsIHJsMiwgbGwsIC0xLCBOVUxMKTsKIAlpZiAodW5saWtlbHkocmV0KSkgewogCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gYnVpbGQgbWFwcGluZyBwYWlycyBhcnJheSBvZiAiCiAJCQkJIm1mdCBkYXRhIGF0dHJpYnV0ZS4iKTsKQEAgLTE4NzUsOSArMTkxOCwxMSBAQAogCQl9CiAJCWEgPSBjdHgtPmF0dHI7CiAJfQorCXdyaXRlX2xvY2tfaXJxc2F2ZSgmbWZ0X25pLT5zaXplX2xvY2ssIGZsYWdzKTsKIAltZnRfbmktPmFsbG9jYXRlZF9zaXplICs9IG5yIDw8IHZvbC0+Y2x1c3Rlcl9zaXplX2JpdHM7CiAJYS0+ZGF0YS5ub25fcmVzaWRlbnQuYWxsb2NhdGVkX3NpemUgPQogCQkJY3B1X3RvX3NsZTY0KG1mdF9uaS0+YWxsb2NhdGVkX3NpemUpOworCXdyaXRlX3VubG9ja19pcnFyZXN0b3JlKCZtZnRfbmktPnNpemVfbG9jaywgZmxhZ3MpOwogCS8qIEVuc3VyZSB0aGUgY2hhbmdlcyBtYWtlIGl0IHRvIGRpc2suICovCiAJZmx1c2hfZGNhY2hlX21mdF9yZWNvcmRfcGFnZShjdHgtPm50ZnNfaW5vKTsKIAltYXJrX21mdF9yZWNvcmRfZGlydHkoY3R4LT5udGZzX2lubyk7CkBAIC0xODkyLDcgKzE5MzcsOSBAQAogCQkJQ0FTRV9TRU5TSVRJVkUsIHJsWzFdLnZjbiwgTlVMTCwgMCwgY3R4KSkgewogCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gZmluZCBsYXN0IGF0dHJpYnV0ZSBleHRlbnQgb2YgIgogCQkJCSJtZnQgZGF0YSBhdHRyaWJ1dGUuJXMiLCBlcyk7CisJCXdyaXRlX2xvY2tfaXJxc2F2ZSgmbWZ0X25pLT5zaXplX2xvY2ssIGZsYWdzKTsKIAkJbWZ0X25pLT5hbGxvY2F0ZWRfc2l6ZSArPSBuciA8PCB2b2wtPmNsdXN0ZXJfc2l6ZV9iaXRzOworCQl3cml0ZV91bmxvY2tfaXJxcmVzdG9yZSgmbWZ0X25pLT5zaXplX2xvY2ssIGZsYWdzKTsKIAkJbnRmc19hdHRyX3B1dF9zZWFyY2hfY3R4KGN0eCk7CiAJCXVubWFwX21mdF9yZWNvcmQobWZ0X25pKTsKIAkJdXBfd3JpdGUoJm1mdF9uaS0+cnVubGlzdC5sb2NrKTsKQEAgLTE5MjEsNyArMTk2OCw3IEBACiAJCQkJYS0+ZGF0YS5ub25fcmVzaWRlbnQubWFwcGluZ19wYWlyc19vZmZzZXQpLAogCQkJCW9sZF9hbGVuIC0gbGUxNl90b19jcHUoCiAJCQkJYS0+ZGF0YS5ub25fcmVzaWRlbnQubWFwcGluZ19wYWlyc19vZmZzZXQpLAotCQkJCXJsMiwgbGwsIE5VTEwpKSB7CisJCQkJcmwyLCBsbCwgLTEsIE5VTEwpKSB7CiAJCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gcmVzdG9yZSBtYXBwaW5nIHBhaXJzICIKIAkJCQkJImFycmF5LiVzIiwgZXMpOwogCQkJTlZvbFNldEVycm9ycyh2b2wpOwpAQCAtMTk5MSw3ICsyMDM4LDcgQEAKIAkJCQkicmVwb3J0cyB0aGlzIGFzIGNvcnJ1cHRpb24sIHBsZWFzZSBlbWFpbCAiCiAJCQkJImxpbnV4LW50ZnMtZGV2QGxpc3RzLnNvdXJjZWZvcmdlLm5ldCBzdGF0aW5nICIKIAkJCQkidGhhdCB5b3Ugc2F3IHRoaXMgbWVzc2FnZSBhbmQgdGhhdCB0aGUgIgotCQkJCSJtb2RpZmllZCBmaWxlIHN5c3RlbSBjcmVhdGVkIHdhcyBjb3JydXB0LiAgIgorCQkJCSJtb2RpZmllZCBmaWxlc3lzdGVtIGNyZWF0ZWQgd2FzIGNvcnJ1cHQuICAiCiAJCQkJIlRoYW5rIHlvdS4iKTsKIAl9CiAJLyogU2V0IHRoZSB1cGRhdGUgc2VxdWVuY2UgbnVtYmVyIHRvIDEuICovCkBAIC0yMDM2LDYgKzIwODMsNyBAQAogICovCiBzdGF0aWMgaW50IG50ZnNfbWZ0X3JlY29yZF9mb3JtYXQoY29uc3QgbnRmc192b2x1bWUgKnZvbCwgY29uc3QgczY0IG1mdF9ubykKIHsKKwlsb2ZmX3QgaV9zaXplOwogCXN0cnVjdCBpbm9kZSAqbWZ0X3ZpID0gdm9sLT5tZnRfaW5vOwogCXN0cnVjdCBwYWdlICpwYWdlOwogCU1GVF9SRUNPUkQgKm07CkBAIC0yMDUxLDEwICsyMDk5LDExIEBACiAJaW5kZXggPSBtZnRfbm8gPDwgdm9sLT5tZnRfcmVjb3JkX3NpemVfYml0cyA+PiBQQUdFX0NBQ0hFX1NISUZUOwogCW9mcyA9IChtZnRfbm8gPDwgdm9sLT5tZnRfcmVjb3JkX3NpemVfYml0cykgJiB+UEFHRV9DQUNIRV9NQVNLOwogCS8qIFRoZSBtYXhpbXVtIHZhbGlkIGluZGV4IGludG8gdGhlIHBhZ2UgY2FjaGUgZm9yICRNRlQncyBkYXRhLiAqLwotCWVuZF9pbmRleCA9IG1mdF92aS0+aV9zaXplID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CisJaV9zaXplID0gaV9zaXplX3JlYWQobWZ0X3ZpKTsKKwllbmRfaW5kZXggPSBpX3NpemUgPj4gUEFHRV9DQUNIRV9TSElGVDsKIAlpZiAodW5saWtlbHkoaW5kZXggPj0gZW5kX2luZGV4KSkgewogCQlpZiAodW5saWtlbHkoaW5kZXggPiBlbmRfaW5kZXggfHwgb2ZzICsgdm9sLT5tZnRfcmVjb3JkX3NpemUgPj0KLQkJCQkobWZ0X3ZpLT5pX3NpemUgJiB+UEFHRV9DQUNIRV9NQVNLKSkpIHsKKwkJCQkoaV9zaXplICYgflBBR0VfQ0FDSEVfTUFTSykpKSB7CiAJCQludGZzX2Vycm9yKHZvbC0+c2IsICJUcmllZCB0byBmb3JtYXQgbm9uLWV4aXN0aW5nIG1mdCAiCiAJCQkJCSJyZWNvcmQgMHglbGx4LiIsIChsb25nIGxvbmcpbWZ0X25vKTsKIAkJCXJldHVybiAtRU5PRU5UOwpAQCAtMjE4OCw2ICsyMjM3LDcgQEAKIAkJbnRmc19pbm9kZSAqYmFzZV9uaSwgTUZUX1JFQ09SRCAqKm1yZWMpCiB7CiAJczY0IGxsLCBiaXQsIG9sZF9kYXRhX2luaXRpYWxpemVkLCBvbGRfZGF0YV9zaXplOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc3RydWN0IGlub2RlICp2aTsKIAlzdHJ1Y3QgcGFnZSAqcGFnZTsKIAludGZzX2lub2RlICptZnRfbmksICptZnRibXBfbmksICpuaTsKQEAgLTIyMzcsOSArMjI4NywxMyBAQAogCSAqIHRoZSBmaXJzdCAyNCBtZnQgcmVjb3JkcyBhcyB0aGV5IGFyZSBzcGVjaWFsIGFuZCB3aGlsc3QgdGhleSBtYXkgbm90CiAJICogYmUgaW4gdXNlLCB3ZSBkbyBub3QgYWxsb2NhdGUgZnJvbSB0aGVtLgogCSAqLworCXJlYWRfbG9ja19pcnFzYXZlKCZtZnRfbmktPnNpemVfbG9jaywgZmxhZ3MpOwogCWxsID0gbWZ0X25pLT5pbml0aWFsaXplZF9zaXplID4+IHZvbC0+bWZ0X3JlY29yZF9zaXplX2JpdHM7Ci0JaWYgKG1mdGJtcF9uaS0+aW5pdGlhbGl6ZWRfc2l6ZSA8PCAzID4gbGwgJiYKLQkJCW1mdGJtcF9uaS0+aW5pdGlhbGl6ZWRfc2l6ZSA+IDMpIHsKKwlyZWFkX3VubG9ja19pcnFyZXN0b3JlKCZtZnRfbmktPnNpemVfbG9jaywgZmxhZ3MpOworCXJlYWRfbG9ja19pcnFzYXZlKCZtZnRibXBfbmktPnNpemVfbG9jaywgZmxhZ3MpOworCW9sZF9kYXRhX2luaXRpYWxpemVkID0gbWZ0Ym1wX25pLT5pbml0aWFsaXplZF9zaXplOworCXJlYWRfdW5sb2NrX2lycXJlc3RvcmUoJm1mdGJtcF9uaS0+c2l6ZV9sb2NrLCBmbGFncyk7CisJaWYgKG9sZF9kYXRhX2luaXRpYWxpemVkIDw8IDMgPiBsbCAmJiBvbGRfZGF0YV9pbml0aWFsaXplZCA+IDMpIHsKIAkJYml0ID0gbGw7CiAJCWlmIChiaXQgPCAyNCkKIAkJCWJpdCA9IDI0OwpAQCAtMjI1NCwxNSArMjMwOCwxOCBAQAogCSAqIG1mdCByZWNvcmQgdGhhdCB3ZSBjYW4gYWxsb2NhdGUuCiAJICogTm90ZTogVGhlIHNtYWxsZXN0IG1mdCByZWNvcmQgd2UgYWxsb2NhdGUgaXMgbWZ0IHJlY29yZCAyNC4KIAkgKi8KLQliaXQgPSBtZnRibXBfbmktPmluaXRpYWxpemVkX3NpemUgPDwgMzsKKwliaXQgPSBvbGRfZGF0YV9pbml0aWFsaXplZCA8PCAzOwogCWlmICh1bmxpa2VseShiaXQgPj0gKDFsbCA8PCAzMikpKQogCQlnb3RvIG1heF9lcnJfb3V0OworCXJlYWRfbG9ja19pcnFzYXZlKCZtZnRibXBfbmktPnNpemVfbG9jaywgZmxhZ3MpOworCW9sZF9kYXRhX3NpemUgPSBtZnRibXBfbmktPmFsbG9jYXRlZF9zaXplOwogCW50ZnNfZGVidWcoIlN0YXR1cyBvZiBtZnRibXAgYmVmb3JlIGV4dGVuc2lvbjogYWxsb2NhdGVkX3NpemUgMHglbGx4LCAiCiAJCQkiZGF0YV9zaXplIDB4JWxseCwgaW5pdGlhbGl6ZWRfc2l6ZSAweCVsbHguIiwKLQkJCShsb25nIGxvbmcpbWZ0Ym1wX25pLT5hbGxvY2F0ZWRfc2l6ZSwKLQkJCShsb25nIGxvbmcpdm9sLT5tZnRibXBfaW5vLT5pX3NpemUsCi0JCQkobG9uZyBsb25nKW1mdGJtcF9uaS0+aW5pdGlhbGl6ZWRfc2l6ZSk7Ci0JaWYgKG1mdGJtcF9uaS0+aW5pdGlhbGl6ZWRfc2l6ZSArIDggPiBtZnRibXBfbmktPmFsbG9jYXRlZF9zaXplKSB7CisJCQkobG9uZyBsb25nKW9sZF9kYXRhX3NpemUsCisJCQkobG9uZyBsb25nKWlfc2l6ZV9yZWFkKHZvbC0+bWZ0Ym1wX2lubyksCisJCQkobG9uZyBsb25nKW9sZF9kYXRhX2luaXRpYWxpemVkKTsKKwlyZWFkX3VubG9ja19pcnFyZXN0b3JlKCZtZnRibXBfbmktPnNpemVfbG9jaywgZmxhZ3MpOworCWlmIChvbGRfZGF0YV9pbml0aWFsaXplZCArIDggPiBvbGRfZGF0YV9zaXplKSB7CiAJCS8qIE5lZWQgdG8gZXh0ZW5kIGJpdG1hcCBieSBvbmUgbW9yZSBjbHVzdGVyLiAqLwogCQludGZzX2RlYnVnKCJtZnRibXA6IGluaXRpYWxpemVkX3NpemUgKyA4ID4gYWxsb2NhdGVkX3NpemUuIik7CiAJCWVyciA9IG50ZnNfbWZ0X2JpdG1hcF9leHRlbmRfYWxsb2NhdGlvbl9ub2xvY2sodm9sKTsKQEAgLTIyNzAsMTIgKzIzMjcsMTYgQEAKIAkJCXVwX3dyaXRlKCZ2b2wtPm1mdGJtcF9sb2NrKTsKIAkJCWdvdG8gZXJyX291dDsKIAkJfQorI2lmZGVmIERFQlVHCisJCXJlYWRfbG9ja19pcnFzYXZlKCZtZnRibXBfbmktPnNpemVfbG9jaywgZmxhZ3MpOwogCQludGZzX2RlYnVnKCJTdGF0dXMgb2YgbWZ0Ym1wIGFmdGVyIGFsbG9jYXRpb24gZXh0ZW5zaW9uOiAiCiAJCQkJImFsbG9jYXRlZF9zaXplIDB4JWxseCwgZGF0YV9zaXplIDB4JWxseCwgIgogCQkJCSJpbml0aWFsaXplZF9zaXplIDB4JWxseC4iLAogCQkJCShsb25nIGxvbmcpbWZ0Ym1wX25pLT5hbGxvY2F0ZWRfc2l6ZSwKLQkJCQkobG9uZyBsb25nKXZvbC0+bWZ0Ym1wX2luby0+aV9zaXplLAorCQkJCShsb25nIGxvbmcpaV9zaXplX3JlYWQodm9sLT5tZnRibXBfaW5vKSwKIAkJCQkobG9uZyBsb25nKW1mdGJtcF9uaS0+aW5pdGlhbGl6ZWRfc2l6ZSk7CisJCXJlYWRfdW5sb2NrX2lycXJlc3RvcmUoJm1mdGJtcF9uaS0+c2l6ZV9sb2NrLCBmbGFncyk7CisjZW5kaWYgLyogREVCVUcgKi8KIAl9CiAJLyoKIAkgKiBXZSBub3cgaGF2ZSBzdWZmaWNpZW50IGFsbG9jYXRlZCBzcGFjZSwgZXh0ZW5kIHRoZSBpbml0aWFsaXplZF9zaXplCkBAIC0yMjg3LDEyICsyMzQ4LDE2IEBACiAJCXVwX3dyaXRlKCZ2b2wtPm1mdGJtcF9sb2NrKTsKIAkJZ290byBlcnJfb3V0OwogCX0KKyNpZmRlZiBERUJVRworCXJlYWRfbG9ja19pcnFzYXZlKCZtZnRibXBfbmktPnNpemVfbG9jaywgZmxhZ3MpOwogCW50ZnNfZGVidWcoIlN0YXR1cyBvZiBtZnRibXAgYWZ0ZXIgaW5pdGlhbGl6ZWQgZXh0ZW50aW9uOiAiCiAJCQkiYWxsb2NhdGVkX3NpemUgMHglbGx4LCBkYXRhX3NpemUgMHglbGx4LCAiCiAJCQkiaW5pdGlhbGl6ZWRfc2l6ZSAweCVsbHguIiwKIAkJCShsb25nIGxvbmcpbWZ0Ym1wX25pLT5hbGxvY2F0ZWRfc2l6ZSwKLQkJCShsb25nIGxvbmcpdm9sLT5tZnRibXBfaW5vLT5pX3NpemUsCisJCQkobG9uZyBsb25nKWlfc2l6ZV9yZWFkKHZvbC0+bWZ0Ym1wX2lubyksCiAJCQkobG9uZyBsb25nKW1mdGJtcF9uaS0+aW5pdGlhbGl6ZWRfc2l6ZSk7CisJcmVhZF91bmxvY2tfaXJxcmVzdG9yZSgmbWZ0Ym1wX25pLT5zaXplX2xvY2ssIGZsYWdzKTsKKyNlbmRpZiAvKiBERUJVRyAqLwogCW50ZnNfZGVidWcoIkZvdW5kIGZyZWUgcmVjb3JkICgjMyksIGJpdCAweCVsbHguIiwgKGxvbmcgbG9uZyliaXQpOwogZm91bmRfZnJlZV9yZWM6CiAJLyogQGJpdCBpcyB0aGUgZm91bmQgZnJlZSBtZnQgcmVjb3JkLCBhbGxvY2F0ZSBpdCBpbiB0aGUgbWZ0IGJpdG1hcC4gKi8KQEAgLTIzMTQsNyArMjM3OSwxMCBAQAogCSAqIHBhcmFsbGVsIGFsbG9jYXRpb24gY291bGQgYWxsb2NhdGUgdGhlIHNhbWUgbWZ0IHJlY29yZCBhcyB0aGlzIG9uZS4KIAkgKi8KIAlsbCA9IChiaXQgKyAxKSA8PCB2b2wtPm1mdF9yZWNvcmRfc2l6ZV9iaXRzOwotCWlmIChsbCA8PSBtZnRfbmktPmluaXRpYWxpemVkX3NpemUpIHsKKwlyZWFkX2xvY2tfaXJxc2F2ZSgmbWZ0X25pLT5zaXplX2xvY2ssIGZsYWdzKTsKKwlvbGRfZGF0YV9pbml0aWFsaXplZCA9IG1mdF9uaS0+aW5pdGlhbGl6ZWRfc2l6ZTsKKwlyZWFkX3VubG9ja19pcnFyZXN0b3JlKCZtZnRfbmktPnNpemVfbG9jaywgZmxhZ3MpOworCWlmIChsbCA8PSBvbGRfZGF0YV9pbml0aWFsaXplZCkgewogCQludGZzX2RlYnVnKCJBbGxvY2F0ZWQgbWZ0IHJlY29yZCBhbHJlYWR5IGluaXRpYWxpemVkLiIpOwogCQlnb3RvIG1mdF9yZWNfYWxyZWFkeV9pbml0aWFsaXplZDsKIAl9CkBAIC0yMzI1LDI2ICsyMzkzLDMwIEBACiAJICogYWN0dWFsbHkgdHJhdmVyc2VkIG1vcmUgdGhhbiBvbmNlIHdoZW4gYSBmcmVzaGx5IGZvcm1hdHRlZCB2b2x1bWUgaXMKIAkgKiBmaXJzdCB3cml0dGVuIHRvIHNvIGl0IG9wdGltaXplcyBhd2F5IG5pY2VseSBpbiB0aGUgY29tbW9uIGNhc2UuCiAJICovCisJcmVhZF9sb2NrX2lycXNhdmUoJm1mdF9uaS0+c2l6ZV9sb2NrLCBmbGFncyk7CiAJbnRmc19kZWJ1ZygiU3RhdHVzIG9mIG1mdCBkYXRhIGJlZm9yZSBleHRlbnNpb246ICIKIAkJCSJhbGxvY2F0ZWRfc2l6ZSAweCVsbHgsIGRhdGFfc2l6ZSAweCVsbHgsICIKIAkJCSJpbml0aWFsaXplZF9zaXplIDB4JWxseC4iLAogCQkJKGxvbmcgbG9uZyltZnRfbmktPmFsbG9jYXRlZF9zaXplLAotCQkJKGxvbmcgbG9uZyl2b2wtPm1mdF9pbm8tPmlfc2l6ZSwKKwkJCShsb25nIGxvbmcpaV9zaXplX3JlYWQodm9sLT5tZnRfaW5vKSwKIAkJCShsb25nIGxvbmcpbWZ0X25pLT5pbml0aWFsaXplZF9zaXplKTsKIAl3aGlsZSAobGwgPiBtZnRfbmktPmFsbG9jYXRlZF9zaXplKSB7CisJCXJlYWRfdW5sb2NrX2lycXJlc3RvcmUoJm1mdF9uaS0+c2l6ZV9sb2NrLCBmbGFncyk7CiAJCWVyciA9IG50ZnNfbWZ0X2RhdGFfZXh0ZW5kX2FsbG9jYXRpb25fbm9sb2NrKHZvbCk7CiAJCWlmICh1bmxpa2VseShlcnIpKSB7CiAJCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gZXh0ZW5kIG1mdCBkYXRhICIKIAkJCQkJImFsbG9jYXRpb24uIik7CiAJCQlnb3RvIHVuZG9fbWZ0Ym1wX2FsbG9jX25vbG9jazsKIAkJfQorCQlyZWFkX2xvY2tfaXJxc2F2ZSgmbWZ0X25pLT5zaXplX2xvY2ssIGZsYWdzKTsKIAkJbnRmc19kZWJ1ZygiU3RhdHVzIG9mIG1mdCBkYXRhIGFmdGVyIGFsbG9jYXRpb24gZXh0ZW5zaW9uOiAiCiAJCQkJImFsbG9jYXRlZF9zaXplIDB4JWxseCwgZGF0YV9zaXplIDB4JWxseCwgIgogCQkJCSJpbml0aWFsaXplZF9zaXplIDB4JWxseC4iLAogCQkJCShsb25nIGxvbmcpbWZ0X25pLT5hbGxvY2F0ZWRfc2l6ZSwKLQkJCQkobG9uZyBsb25nKXZvbC0+bWZ0X2luby0+aV9zaXplLAorCQkJCShsb25nIGxvbmcpaV9zaXplX3JlYWQodm9sLT5tZnRfaW5vKSwKIAkJCQkobG9uZyBsb25nKW1mdF9uaS0+aW5pdGlhbGl6ZWRfc2l6ZSk7CiAJfQorCXJlYWRfdW5sb2NrX2lycXJlc3RvcmUoJm1mdF9uaS0+c2l6ZV9sb2NrLCBmbGFncyk7CiAJLyoKIAkgKiBFeHRlbmQgbWZ0IGRhdGEgaW5pdGlhbGl6ZWQgc2l6ZSAoYW5kIGRhdGEgc2l6ZSBvZiBjb3Vyc2UpIHRvIHJlYWNoCiAJICogdGhlIGFsbG9jYXRlZCBtZnQgcmVjb3JkLCBmb3JtYXR0aW5nIHRoZSBtZnQgcmVjb3JkcyBhbGxvbmcgdGhlIHdheS4KQEAgLTIzNTIsNiArMjQyNCw3IEBACiAJICogbmVlZGVkIGJ5IG50ZnNfbWZ0X3JlY29yZF9mb3JtYXQoKS4gIFdlIHdpbGwgdXBkYXRlIHRoZSBhdHRyaWJ1dGUKIAkgKiByZWNvcmQgaXRzZWxmIGluIG9uZSBmZWxsIHN3b29wIGxhdGVyIG9uLgogCSAqLworCXdyaXRlX2xvY2tfaXJxc2F2ZSgmbWZ0X25pLT5zaXplX2xvY2ssIGZsYWdzKTsKIAlvbGRfZGF0YV9pbml0aWFsaXplZCA9IG1mdF9uaS0+aW5pdGlhbGl6ZWRfc2l6ZTsKIAlvbGRfZGF0YV9zaXplID0gdm9sLT5tZnRfaW5vLT5pX3NpemU7CiAJd2hpbGUgKGxsID4gbWZ0X25pLT5pbml0aWFsaXplZF9zaXplKSB7CkBAIC0yMzYwLDggKzI0MzMsOSBAQAogCQluZXdfaW5pdGlhbGl6ZWRfc2l6ZSA9IG1mdF9uaS0+aW5pdGlhbGl6ZWRfc2l6ZSArCiAJCQkJdm9sLT5tZnRfcmVjb3JkX3NpemU7CiAJCW1mdF9ubyA9IG1mdF9uaS0+aW5pdGlhbGl6ZWRfc2l6ZSA+PiB2b2wtPm1mdF9yZWNvcmRfc2l6ZV9iaXRzOwotCQlpZiAobmV3X2luaXRpYWxpemVkX3NpemUgPiB2b2wtPm1mdF9pbm8tPmlfc2l6ZSkKLQkJCXZvbC0+bWZ0X2luby0+aV9zaXplID0gbmV3X2luaXRpYWxpemVkX3NpemU7CisJCWlmIChuZXdfaW5pdGlhbGl6ZWRfc2l6ZSA+IGlfc2l6ZV9yZWFkKHZvbC0+bWZ0X2lubykpCisJCQlpX3NpemVfd3JpdGUodm9sLT5tZnRfaW5vLCBuZXdfaW5pdGlhbGl6ZWRfc2l6ZSk7CisJCXdyaXRlX3VubG9ja19pcnFyZXN0b3JlKCZtZnRfbmktPnNpemVfbG9jaywgZmxhZ3MpOwogCQludGZzX2RlYnVnKCJJbml0aWFsaXppbmcgbWZ0IHJlY29yZCAweCVsbHguIiwKIAkJCQkobG9uZyBsb25nKW1mdF9ubyk7CiAJCWVyciA9IG50ZnNfbWZ0X3JlY29yZF9mb3JtYXQodm9sLCBtZnRfbm8pOwpAQCAtMjM2OSw4ICsyNDQzLDEwIEBACiAJCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gZm9ybWF0IG1mdCByZWNvcmQuIik7CiAJCQlnb3RvIHVuZG9fZGF0YV9pbml0OwogCQl9CisJCXdyaXRlX2xvY2tfaXJxc2F2ZSgmbWZ0X25pLT5zaXplX2xvY2ssIGZsYWdzKTsKIAkJbWZ0X25pLT5pbml0aWFsaXplZF9zaXplID0gbmV3X2luaXRpYWxpemVkX3NpemU7CiAJfQorCXdyaXRlX3VubG9ja19pcnFyZXN0b3JlKCZtZnRfbmktPnNpemVfbG9jaywgZmxhZ3MpOwogCXJlY29yZF9mb3JtYXR0ZWQgPSBUUlVFOwogCS8qIFVwZGF0ZSB0aGUgbWZ0IGRhdGEgYXR0cmlidXRlIHJlY29yZCB0byByZWZsZWN0IHRoZSBuZXcgc2l6ZXMuICovCiAJbSA9IG1hcF9tZnRfcmVjb3JkKG1mdF9uaSk7CkBAIC0yMzk2LDIyICsyNDcyLDI3IEBACiAJCWdvdG8gdW5kb19kYXRhX2luaXQ7CiAJfQogCWEgPSBjdHgtPmF0dHI7CisJcmVhZF9sb2NrX2lycXNhdmUoJm1mdF9uaS0+c2l6ZV9sb2NrLCBmbGFncyk7CiAJYS0+ZGF0YS5ub25fcmVzaWRlbnQuaW5pdGlhbGl6ZWRfc2l6ZSA9CiAJCQljcHVfdG9fc2xlNjQobWZ0X25pLT5pbml0aWFsaXplZF9zaXplKTsKLQlhLT5kYXRhLm5vbl9yZXNpZGVudC5kYXRhX3NpemUgPSBjcHVfdG9fc2xlNjQodm9sLT5tZnRfaW5vLT5pX3NpemUpOworCWEtPmRhdGEubm9uX3Jlc2lkZW50LmRhdGFfc2l6ZSA9CisJCQljcHVfdG9fc2xlNjQoaV9zaXplX3JlYWQodm9sLT5tZnRfaW5vKSk7CisJcmVhZF91bmxvY2tfaXJxcmVzdG9yZSgmbWZ0X25pLT5zaXplX2xvY2ssIGZsYWdzKTsKIAkvKiBFbnN1cmUgdGhlIGNoYW5nZXMgbWFrZSBpdCB0byBkaXNrLiAqLwogCWZsdXNoX2RjYWNoZV9tZnRfcmVjb3JkX3BhZ2UoY3R4LT5udGZzX2lubyk7CiAJbWFya19tZnRfcmVjb3JkX2RpcnR5KGN0eC0+bnRmc19pbm8pOwogCW50ZnNfYXR0cl9wdXRfc2VhcmNoX2N0eChjdHgpOwogCXVubWFwX21mdF9yZWNvcmQobWZ0X25pKTsKKwlyZWFkX2xvY2tfaXJxc2F2ZSgmbWZ0X25pLT5zaXplX2xvY2ssIGZsYWdzKTsKIAludGZzX2RlYnVnKCJTdGF0dXMgb2YgbWZ0IGRhdGEgYWZ0ZXIgbWZ0IHJlY29yZCBpbml0aWFsaXphdGlvbjogIgogCQkJImFsbG9jYXRlZF9zaXplIDB4JWxseCwgZGF0YV9zaXplIDB4JWxseCwgIgogCQkJImluaXRpYWxpemVkX3NpemUgMHglbGx4LiIsCiAJCQkobG9uZyBsb25nKW1mdF9uaS0+YWxsb2NhdGVkX3NpemUsCi0JCQkobG9uZyBsb25nKXZvbC0+bWZ0X2luby0+aV9zaXplLAorCQkJKGxvbmcgbG9uZylpX3NpemVfcmVhZCh2b2wtPm1mdF9pbm8pLAogCQkJKGxvbmcgbG9uZyltZnRfbmktPmluaXRpYWxpemVkX3NpemUpOwotCUJVR19PTih2b2wtPm1mdF9pbm8tPmlfc2l6ZSA+IG1mdF9uaS0+YWxsb2NhdGVkX3NpemUpOwotCUJVR19PTihtZnRfbmktPmluaXRpYWxpemVkX3NpemUgPiB2b2wtPm1mdF9pbm8tPmlfc2l6ZSk7CisJQlVHX09OKGlfc2l6ZV9yZWFkKHZvbC0+bWZ0X2lubykgPiBtZnRfbmktPmFsbG9jYXRlZF9zaXplKTsKKwlCVUdfT04obWZ0X25pLT5pbml0aWFsaXplZF9zaXplID4gaV9zaXplX3JlYWQodm9sLT5tZnRfaW5vKSk7CisJcmVhZF91bmxvY2tfaXJxcmVzdG9yZSgmbWZ0X25pLT5zaXplX2xvY2ssIGZsYWdzKTsKIG1mdF9yZWNfYWxyZWFkeV9pbml0aWFsaXplZDoKIAkvKgogCSAqIFdlIGNhbiBmaW5hbGx5IGRyb3AgdGhlIG1mdCBiaXRtYXAgbG9jayBhcyB0aGUgbWZ0IGRhdGEgYXR0cmlidXRlCkBAIC0yNjUyLDggKzI3MzMsMTAgQEAKIAkqbXJlYyA9IG07CiAJcmV0dXJuIG5pOwogdW5kb19kYXRhX2luaXQ6CisJd3JpdGVfbG9ja19pcnFzYXZlKCZtZnRfbmktPnNpemVfbG9jaywgZmxhZ3MpOwogCW1mdF9uaS0+aW5pdGlhbGl6ZWRfc2l6ZSA9IG9sZF9kYXRhX2luaXRpYWxpemVkOwotCXZvbC0+bWZ0X2luby0+aV9zaXplID0gb2xkX2RhdGFfc2l6ZTsKKwlpX3NpemVfd3JpdGUodm9sLT5tZnRfaW5vLCBvbGRfZGF0YV9zaXplKTsKKwl3cml0ZV91bmxvY2tfaXJxcmVzdG9yZSgmbWZ0X25pLT5zaXplX2xvY2ssIGZsYWdzKTsKIAlnb3RvIHVuZG9fbWZ0Ym1wX2FsbG9jX25vbG9jazsKIHVuZG9fbWZ0Ym1wX2FsbG9jOgogCWRvd25fd3JpdGUoJnZvbC0+bWZ0Ym1wX2xvY2spOwpkaWZmIC0tZ2l0IGEvZnMvbnRmcy9uYW1laS5jIGIvZnMvbnRmcy9uYW1laS5jCmluZGV4IDdjN2UxM2IuLjM1MWRiYzMgMTAwNjQ0Ci0tLSBhL2ZzL250ZnMvbmFtZWkuYworKysgYi9mcy9udGZzL25hbWVpLmMKQEAgLTE1Myw4ICsxNTMsNyBAQAogCQkJbnRmc19lcnJvcih2b2wtPnNiLCAibnRmc19pZ2V0KDB4JWx4KSBmYWlsZWQgd2l0aCAiCiAJCQkJCSJlcnJvciBjb2RlICVsaS4iLCBkZW50X2lubywKIAkJCQkJUFRSX0VSUihkZW50X2lub2RlKSk7Ci0JCWlmIChuYW1lKQotCQkJa2ZyZWUobmFtZSk7CisJCWtmcmVlKG5hbWUpOwogCQkvKiBSZXR1cm4gdGhlIGVycm9yIGNvZGUuICovCiAJCXJldHVybiAoc3RydWN0IGRlbnRyeSAqKWRlbnRfaW5vZGU7CiAJfQpAQCAtMzgwLDcgKzM3OSw3IEBACiAgKiBSZXR1cm4gdGhlIGRlbnRyeSBvZiB0aGUgcGFyZW50IGRpcmVjdG9yeSBvbiBzdWNjZXNzIG9yIHRoZSBlcnJvciBjb2RlIG9uCiAgKiBlcnJvciAoSVNfRVJSKCkgaXMgdHJ1ZSkuCiAgKi8KLXN0cnVjdCBkZW50cnkgKm50ZnNfZ2V0X3BhcmVudChzdHJ1Y3QgZGVudHJ5ICpjaGlsZF9kZW50KQorc3RhdGljIHN0cnVjdCBkZW50cnkgKm50ZnNfZ2V0X3BhcmVudChzdHJ1Y3QgZGVudHJ5ICpjaGlsZF9kZW50KQogewogCXN0cnVjdCBpbm9kZSAqdmkgPSBjaGlsZF9kZW50LT5kX2lub2RlOwogCW50ZnNfaW5vZGUgKm5pID0gTlRGU19JKHZpKTsKQEAgLTQ2NSw3ICs0NjQsNyBAQAogICoKICAqIFJldHVybiB0aGUgZGVudHJ5IG9uIHN1Y2Nlc3Mgb3IgdGhlIGVycm9yIGNvZGUgb24gZXJyb3IgKElTX0VSUigpIGlzIHRydWUpLgogICovCi1zdHJ1Y3QgZGVudHJ5ICpudGZzX2dldF9kZW50cnkoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqZmgpCitzdGF0aWMgc3RydWN0IGRlbnRyeSAqbnRmc19nZXRfZGVudHJ5KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHZvaWQgKmZoKQogewogCXN0cnVjdCBpbm9kZSAqdmk7CiAJc3RydWN0IGRlbnRyeSAqZGVudDsKQEAgLTQ5NiwzICs0OTUsMzAgQEAKIAludGZzX2RlYnVnKCJEb25lIGZvciBpbm9kZSAweCVseCwgZ2VuZXJhdGlvbiAweCV4LiIsIGlubywgZ2VuKTsKIAlyZXR1cm4gZGVudDsKIH0KKworLyoqCisgKiBFeHBvcnQgb3BlcmF0aW9ucyBhbGxvd2luZyBORlMgZXhwb3J0aW5nIG9mIG1vdW50ZWQgTlRGUyBwYXJ0aXRpb25zLgorICoKKyAqIFdlIHVzZSB0aGUgZGVmYXVsdCAtPmRlY29kZV9maCgpIGFuZCAtPmVuY29kZV9maCgpIGZvciBub3cuICBOb3RlIHRoYXQgdGhleQorICogdXNlIDMyIGJpdHMgdG8gc3RvcmUgdGhlIGlub2RlIG51bWJlciB3aGljaCBpcyBhbiB1bnNpZ25lZCBsb25nIHNvIG9uIDY0LWJpdAorICogYXJjaGl0ZWN0dXJlcyBpcyB1c3VhbGx5IDY0IGJpdHMgc28gaXQgd291bGQgYWxsIGZhaWwgaG9ycmlibHkgb24gaHVnZQorICogdm9sdW1lcy4gIEkgZ3Vlc3Mgd2UgbmVlZCB0byBkZWZpbmUgb3VyIG93biBlbmNvZGUgYW5kIGRlY29kZSBmaCBmdW5jdGlvbnMKKyAqIHRoYXQgc3RvcmUgNjQtYml0IGlub2RlIG51bWJlcnMgYXQgc29tZSBwb2ludCBidXQgZm9yIG5vdyB3ZSB3aWxsIGlnbm9yZSB0aGUKKyAqIHByb2JsZW0uLi4KKyAqCisgKiBXZSBhbHNvIHVzZSB0aGUgZGVmYXVsdCAtPmdldF9uYW1lKCkgaGVscGVyICh1c2VkIGJ5IC0+ZGVjb2RlX2ZoKCkgdmlhCisgKiBmcy9leHBvcnRmcy9leHBmcy5jOjpmaW5kX2V4cG9ydGVkX2RlbnRyeSgpKSBhcyB0aGF0IGlzIGNvbXBsZXRlbHkgZnMKKyAqIGluZGVwZW5kZW50LgorICoKKyAqIFRoZSBkZWZhdWx0IC0+Z2V0X3BhcmVudCgpIGp1c3QgcmV0dXJucyAtRUFDQ0VTIHNvIHdlIGhhdmUgdG8gcHJvdmlkZSBvdXIKKyAqIG93biBhbmQgdGhlIGRlZmF1bHQgLT5nZXRfZGVudHJ5KCkgaXMgaW5jb21wYXRpYmxlIHdpdGggTlRGUyBkdWUgdG8gbm90CisgKiBhbGxvd2luZyB0aGUgaW5vZGUgbnVtYmVyIDAgd2hpY2ggaXMgdXNlZCBpbiBOVEZTIGZvciB0aGUgc3lzdGVtIGZpbGUgJE1GVAorICogYW5kIGR1ZSB0byB1c2luZyBpZ2V0KCkgd2hlcmVhcyBOVEZTIG5lZWRzIG50ZnNfaWdldCgpLgorICovCitzdHJ1Y3QgZXhwb3J0X29wZXJhdGlvbnMgbnRmc19leHBvcnRfb3BzID0geworCS5nZXRfcGFyZW50CT0gbnRmc19nZXRfcGFyZW50LAkvKiBGaW5kIHRoZSBwYXJlbnQgb2YgYSBnaXZlbgorCQkJCQkJICAgZGlyZWN0b3J5LiAqLworCS5nZXRfZGVudHJ5CT0gbnRmc19nZXRfZGVudHJ5LAkvKiBGaW5kIGEgZGVudHJ5IGZvciB0aGUgaW5vZGUKKwkJCQkJCSAgIGdpdmVuIGEgZmlsZSBoYW5kbGUKKwkJCQkJCSAgIHN1Yi1mcmFnbWVudC4gKi8KK307CmRpZmYgLS1naXQgYS9mcy9udGZzL250ZnMuaCBiL2ZzL250ZnMvbnRmcy5oCmluZGV4IDcyMGZmYjcuLjQ0NmI1MDEgMTAwNjQ0Ci0tLSBhL2ZzL250ZnMvbnRmcy5oCisrKyBiL2ZzL250ZnMvbnRmcy5oCkBAIC0yLDcgKzIsNyBAQAogICogbnRmcy5oIC0gRGVmaW5lcyBmb3IgTlRGUyBMaW51eCBrZXJuZWwgZHJpdmVyLiBQYXJ0IG9mIHRoZSBMaW51eC1OVEZTCiAgKgkgICAgcHJvamVjdC4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNCBBbnRvbiBBbHRhcGFybWFrb3YKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA1IEFudG9uIEFsdGFwYXJtYWtvdgogICogQ29weXJpZ2h0IChDKSAyMDAyIFJpY2hhcmQgUnVzc29uCiAgKgogICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKQEAgLTMxLDYgKzMxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L25scy5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KIAogI2luY2x1ZGUgInR5cGVzLmgiCiAjaW5jbHVkZSAidm9sdW1lLmgiCkBAIC00MSw2ICs0Miw5IEBACiAJTlRGU19CTE9DS19TSVpFX0JJVFMJPSA5LAogCU5URlNfU0JfTUFHSUMJCT0gMHg1MzQ2NTQ0ZSwJLyogJ05URlMnICovCiAJTlRGU19NQVhfTkFNRV9MRU4JPSAyNTUsCisJTlRGU19NQVhfQVRUUl9OQU1FX0xFTgk9IDI1NSwKKwlOVEZTX01BWF9DTFVTVEVSX1NJWkUJPSA2NCAqIDEwMjQsCS8qIDY0a2lCICovCisJTlRGU19NQVhfUEFHRVNfUEVSX0NMVVNURVIgPSBOVEZTX01BWF9DTFVTVEVSX1NJWkUgLyBQQUdFX0NBQ0hFX1NJWkUsCiB9IE5URlNfQ09OU1RBTlRTOwogCiAvKiBHbG9iYWwgdmFyaWFibGVzLiAqLwpAQCAtNjUsNiArNjksOCBAQAogZXh0ZXJuIHN0cnVjdCAgZmlsZV9vcGVyYXRpb25zIG50ZnNfZW1wdHlfZmlsZV9vcHM7CiBleHRlcm4gc3RydWN0IGlub2RlX29wZXJhdGlvbnMgbnRmc19lbXB0eV9pbm9kZV9vcHM7CiAKK2V4dGVybiBzdHJ1Y3QgZXhwb3J0X29wZXJhdGlvbnMgbnRmc19leHBvcnRfb3BzOworCiAvKioKICAqIE5URlNfU0IgLSByZXR1cm4gdGhlIG50ZnMgdm9sdW1lIGdpdmVuIGEgdmZzIHN1cGVyIGJsb2NrCiAgKiBAc2I6CQlWRlMgc3VwZXIgYmxvY2sKZGlmZiAtLWdpdCBhL2ZzL250ZnMvcnVubGlzdC5jIGIvZnMvbnRmcy9ydW5saXN0LmMKaW5kZXggODQzOGZiMS4uNzU4ODU1YiAxMDA2NDQKLS0tIGEvZnMvbnRmcy9ydW5saXN0LmMKKysrIGIvZnMvbnRmcy9ydW5saXN0LmMKQEAgLTEsNyArMSw3IEBACiAvKioKICAqIHJ1bmxpc3QuYyAtIE5URlMgcnVubGlzdCBoYW5kbGluZyBjb2RlLiAgUGFydCBvZiB0aGUgTGludXgtTlRGUyBwcm9qZWN0LgogICoKLSAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA0IEFudG9uIEFsdGFwYXJtYWtvdgorICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDUgQW50b24gQWx0YXBhcm1ha292CiAgKiBDb3B5cmlnaHQgKGMpIDIwMDIgUmljaGFyZCBSdXNzb24KICAqCiAgKiBUaGlzIHByb2dyYW0vaW5jbHVkZSBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgpAQCAtNTksNyArNTksNyBAQAogICoKICAqIEFzIHRoZSBydW5saXN0cyBncm93LCBtb3JlIG1lbW9yeSB3aWxsIGJlIHJlcXVpcmVkLiAgVG8gcHJldmVudCB0aGUKICAqIGtlcm5lbCBoYXZpbmcgdG8gYWxsb2NhdGUgYW5kIHJlYWxsb2NhdGUgbGFyZ2UgbnVtYmVycyBvZiBzbWFsbCBiaXRzIG9mCi0gKiBtZW1vcnksIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBhbmQgZW50aXJlIHBhZ2Ugb2YgbWVtb3J5LgorICogbWVtb3J5LCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgYW4gZW50aXJlIHBhZ2Ugb2YgbWVtb3J5LgogICoKICAqIEl0IGlzIHVwIHRvIHRoZSBjYWxsZXIgdG8gc2VyaWFsaXplIGFjY2VzcyB0byB0aGUgcnVubGlzdCBAcmwuCiAgKgpAQCAtMTEzLDggKzExMywxMSBAQAogCUJVR19PTighZHN0KTsKIAlCVUdfT04oIXNyYyk7CiAKLQlpZiAoKGRzdC0+bGNuIDwgMCkgfHwgKHNyYy0+bGNuIDwgMCkpICAgICAvKiBBcmUgd2UgbWVyZ2luZyBob2xlcz8gKi8KKwlpZiAoKGRzdC0+bGNuIDwgMCkgfHwgKHNyYy0+bGNuIDwgMCkpIHsgICAvKiBBcmUgd2UgbWVyZ2luZyBob2xlcz8gKi8KKwkJaWYgKGRzdC0+bGNuID09IExDTl9IT0xFICYmIHNyYy0+bGNuID09IExDTl9IT0xFKQorCQkJcmV0dXJuIFRSVUU7CiAJCXJldHVybiBGQUxTRTsKKwl9CiAJaWYgKChkc3QtPmxjbiArIGRzdC0+bGVuZ3RoKSAhPSBzcmMtPmxjbikgLyogQXJlIHRoZSBydW5zIGNvbnRpZ3VvdXM/ICovCiAJCXJldHVybiBGQUxTRTsKIAlpZiAoKGRzdC0+dmNuICsgZHN0LT5sZW5ndGgpICE9IHNyYy0+dmNuKSAvKiBBcmUgdGhlIHJ1bnMgbWlzYWxpZ25lZD8gKi8KQEAgLTg1NSwzMCArODU4LDQyIEBACiAJaWYgKCFhdHRyLT5kYXRhLm5vbl9yZXNpZGVudC5sb3dlc3RfdmNuKSB7CiAJCVZDTiBtYXhfY2x1c3RlcjsKIAotCQltYXhfY2x1c3RlciA9IChzbGU2NF90b19jcHUoCisJCW1heF9jbHVzdGVyID0gKChzbGU2NF90b19jcHUoCiAJCQkJYXR0ci0+ZGF0YS5ub25fcmVzaWRlbnQuYWxsb2NhdGVkX3NpemUpICsKIAkJCQl2b2wtPmNsdXN0ZXJfc2l6ZSAtIDEpID4+Ci0JCQkJdm9sLT5jbHVzdGVyX3NpemVfYml0czsKKwkJCQl2b2wtPmNsdXN0ZXJfc2l6ZV9iaXRzKSAtIDE7CiAJCS8qCi0JCSAqIElmIHRoZXJlIGlzIGEgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBoaWdoZXN0X3ZjbiBhbmQgdGhlCi0JCSAqIGhpZ2hlc3QgY2x1c3RlciwgdGhlIHJ1bmxpc3QgaXMgZWl0aGVyIGNvcnJ1cHQgb3IsIG1vcmUKLQkJICogbGlrZWx5LCB0aGVyZSBhcmUgbW9yZSBleHRlbnRzIGZvbGxvd2luZyB0aGlzIG9uZS4KKwkJICogQSBoaWdoZXN0X3ZjbiBvZiB6ZXJvIG1lYW5zIHRoaXMgaXMgYSBzaW5nbGUgZXh0ZW50CisJCSAqIGF0dHJpYnV0ZSBzbyBzaW1wbHkgdGVybWluYXRlIHRoZSBydW5saXN0IHdpdGggTENOX0VOT0VOVCkuCiAJCSAqLwotCQlpZiAoZGVsdGF4Y24gPCAtLW1heF9jbHVzdGVyKSB7Ci0JCQludGZzX2RlYnVnKCJNb3JlIGV4dGVudHMgdG8gZm9sbG93OyBkZWx0YXhjbiA9IDB4JWxseCwgIgotCQkJCQkibWF4X2NsdXN0ZXIgPSAweCVsbHgiLAotCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKWRlbHRheGNuLAotCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKW1heF9jbHVzdGVyKTsKLQkJCXJsW3JscG9zXS52Y24gPSB2Y247Ci0JCQl2Y24gKz0gcmxbcmxwb3NdLmxlbmd0aCA9IG1heF9jbHVzdGVyIC0gZGVsdGF4Y247Ci0JCQlybFtybHBvc10ubGNuID0gTENOX1JMX05PVF9NQVBQRUQ7Ci0JCQlybHBvcysrOwotCQl9IGVsc2UgaWYgKHVubGlrZWx5KGRlbHRheGNuID4gbWF4X2NsdXN0ZXIpKSB7Ci0JCQludGZzX2Vycm9yKHZvbC0+c2IsICJDb3JydXB0IGF0dHJpYnV0ZS4gZGVsdGF4Y24gPSAiCi0JCQkJCSIweCVsbHgsIG1heF9jbHVzdGVyID0gMHglbGx4IiwKLQkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylkZWx0YXhjbiwKLQkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyltYXhfY2x1c3Rlcik7Ci0JCQlnb3RvIG1wYV9lcnI7CisJCWlmIChkZWx0YXhjbikgeworCQkJLyoKKwkJCSAqIElmIHRoZXJlIGlzIGEgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBoaWdoZXN0X3ZjbiBhbmQKKwkJCSAqIHRoZSBoaWdoZXN0IGNsdXN0ZXIsIHRoZSBydW5saXN0IGlzIGVpdGhlciBjb3JydXB0CisJCQkgKiBvciwgbW9yZSBsaWtlbHksIHRoZXJlIGFyZSBtb3JlIGV4dGVudHMgZm9sbG93aW5nCisJCQkgKiB0aGlzIG9uZS4KKwkJCSAqLworCQkJaWYgKGRlbHRheGNuIDwgbWF4X2NsdXN0ZXIpIHsKKwkJCQludGZzX2RlYnVnKCJNb3JlIGV4dGVudHMgdG8gZm9sbG93OyBkZWx0YXhjbiAiCisJCQkJCQkiPSAweCVsbHgsIG1heF9jbHVzdGVyID0gIgorCQkJCQkJIjB4JWxseCIsCisJCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKWRlbHRheGNuLAorCQkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykKKwkJCQkJCW1heF9jbHVzdGVyKTsKKwkJCQlybFtybHBvc10udmNuID0gdmNuOworCQkJCXZjbiArPSBybFtybHBvc10ubGVuZ3RoID0gbWF4X2NsdXN0ZXIgLQorCQkJCQkJZGVsdGF4Y247CisJCQkJcmxbcmxwb3NdLmxjbiA9IExDTl9STF9OT1RfTUFQUEVEOworCQkJCXJscG9zKys7CisJCQl9IGVsc2UgaWYgKHVubGlrZWx5KGRlbHRheGNuID4gbWF4X2NsdXN0ZXIpKSB7CisJCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiQ29ycnVwdCBhdHRyaWJ1dGUuICAiCisJCQkJCQkiZGVsdGF4Y24gPSAweCVsbHgsICIKKwkJCQkJCSJtYXhfY2x1c3RlciA9IDB4JWxseCIsCisJCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKWRlbHRheGNuLAorCQkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykKKwkJCQkJCW1heF9jbHVzdGVyKTsKKwkJCQlnb3RvIG1wYV9lcnI7CisJCQl9CiAJCX0KIAkJcmxbcmxwb3NdLmxjbiA9IExDTl9FTk9FTlQ7CiAJfSBlbHNlIC8qIE5vdCB0aGUgYmFzZSBleHRlbnQuIFRoZXJlIG1heSBiZSBtb3JlIGV4dGVudHMgdG8gZm9sbG93LiAqLwpAQCAtOTE4LDE3ICs5MzMsMTggQEAKICAqCiAgKiBJdCBpcyB1cCB0byB0aGUgY2FsbGVyIHRvIHNlcmlhbGl6ZSBhY2Nlc3MgdG8gdGhlIHJ1bmxpc3QgQHJsLgogICoKLSAqIFNpbmNlIGxjbnMgbXVzdCBiZSA+PSAwLCB3ZSB1c2UgbmVnYXRpdmUgcmV0dXJuIHZhbHVlcyB3aXRoIHNwZWNpYWwgbWVhbmluZzoKKyAqIFNpbmNlIGxjbnMgbXVzdCBiZSA+PSAwLCB3ZSB1c2UgbmVnYXRpdmUgcmV0dXJuIGNvZGVzIHdpdGggc3BlY2lhbCBtZWFuaW5nOgogICoKLSAqIFJldHVybiB2YWx1ZQkJCU1lYW5pbmcgLyBEZXNjcmlwdGlvbgorICogUmV0dXJuIGNvZGUJCU1lYW5pbmcgLyBEZXNjcmlwdGlvbgogICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqICAtMSA9IExDTl9IT0xFCQlIb2xlIC8gbm90IGFsbG9jYXRlZCBvbiBkaXNrLgotICogIC0yID0gTENOX1JMX05PVF9NQVBQRUQJVGhpcyBpcyBwYXJ0IG9mIHRoZSBydW5saXN0IHdoaWNoIGhhcyBub3QgYmVlbgotICoJCQkJaW5zZXJ0ZWQgaW50byB0aGUgcnVubGlzdCB5ZXQuCi0gKiAgLTMgPSBMQ05fRU5PRU5UCQlUaGVyZSBpcyBubyBzdWNoIHZjbiBpbiB0aGUgYXR0cmlidXRlLgorICogIExDTl9IT0xFCQlIb2xlIC8gbm90IGFsbG9jYXRlZCBvbiBkaXNrLgorICogIExDTl9STF9OT1RfTUFQUEVECVRoaXMgaXMgcGFydCBvZiB0aGUgcnVubGlzdCB3aGljaCBoYXMgbm90IGJlZW4KKyAqCQkJaW5zZXJ0ZWQgaW50byB0aGUgcnVubGlzdCB5ZXQuCisgKiAgTENOX0VOT0VOVAkJVGhlcmUgaXMgbm8gc3VjaCB2Y24gaW4gdGhlIGF0dHJpYnV0ZS4KICAqCiAgKiBMb2NraW5nOiAtIFRoZSBjYWxsZXIgbXVzdCBoYXZlIGxvY2tlZCB0aGUgcnVubGlzdCAoZm9yIHJlYWRpbmcgb3Igd3JpdGluZykuCi0gKgkgICAgLSBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IHRvdWNoIHRoZSBsb2NrLgorICoJICAgIC0gVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCB0b3VjaCB0aGUgbG9jaywgbm9yIGRvZXMgaXQgbW9kaWZ5IHRoZQorICoJICAgICAgcnVubGlzdC4KICAqLwogTENOIG50ZnNfcmxfdmNuX3RvX2xjbihjb25zdCBydW5saXN0X2VsZW1lbnQgKnJsLCBjb25zdCBWQ04gdmNuKQogewpAQCAtOTY0LDYgKzk4MCwzOSBAQAogCXJldHVybiBMQ05fRU5PRU5UOwogfQogCisjaWZkZWYgTlRGU19SVworCisvKioKKyAqIG50ZnNfcmxfZmluZF92Y25fbm9sb2NrIC0gZmluZCBhIHZjbiBpbiBhIHJ1bmxpc3QKKyAqIEBybDoJCXJ1bmxpc3QgdG8gc2VhcmNoCisgKiBAdmNuOgl2Y24gdG8gZmluZAorICoKKyAqIEZpbmQgdGhlIHZpcnR1YWwgY2x1c3RlciBudW1iZXIgQHZjbiBpbiB0aGUgcnVubGlzdCBAcmwgYW5kIHJldHVybiB0aGUKKyAqIGFkZHJlc3Mgb2YgdGhlIHJ1bmxpc3QgZWxlbWVudCBjb250YWluaW5nIHRoZSBAdmNuIG9uIHN1Y2Nlc3MuCisgKgorICogUmV0dXJuIE5VTEwgaWYgQHJsIGlzIE5VTEwgb3IgQHZjbiBpcyBpbiBhbiB1bm1hcHBlZCBwYXJ0L291dCBvZiBib3VuZHMgb2YKKyAqIHRoZSBydW5saXN0LgorICoKKyAqIExvY2tpbmc6IFRoZSBydW5saXN0IG11c3QgYmUgbG9ja2VkIG9uIGVudHJ5LgorICovCitydW5saXN0X2VsZW1lbnQgKm50ZnNfcmxfZmluZF92Y25fbm9sb2NrKHJ1bmxpc3RfZWxlbWVudCAqcmwsIGNvbnN0IFZDTiB2Y24pCit7CisJQlVHX09OKHZjbiA8IDApOworCWlmICh1bmxpa2VseSghcmwgfHwgdmNuIDwgcmxbMF0udmNuKSkKKwkJcmV0dXJuIE5VTEw7CisJd2hpbGUgKGxpa2VseShybC0+bGVuZ3RoKSkgeworCQlpZiAodW5saWtlbHkodmNuIDwgcmxbMV0udmNuKSkgeworCQkJaWYgKGxpa2VseShybC0+bGNuID49IExDTl9IT0xFKSkKKwkJCQlyZXR1cm4gcmw7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlybCsrOworCX0KKwlpZiAobGlrZWx5KHJsLT5sY24gPT0gTENOX0VOT0VOVCkpCisJCXJldHVybiBybDsKKwlyZXR1cm4gTlVMTDsKK30KKwogLyoqCiAgKiBudGZzX2dldF9ucl9zaWduaWZpY2FudF9ieXRlcyAtIGdldCBudW1iZXIgb2YgYnl0ZXMgbmVlZGVkIHRvIHN0b3JlIGEgbnVtYmVyCiAgKiBAbjoJCW51bWJlciBmb3Igd2hpY2ggdG8gZ2V0IHRoZSBudW1iZXIgb2YgYnl0ZXMgZm9yCkBAIC05OTksMTAgKzEwNDgsMTcgQEAKICAqIG50ZnNfZ2V0X3NpemVfZm9yX21hcHBpbmdfcGFpcnMgLSBnZXQgYnl0ZXMgbmVlZGVkIGZvciBtYXBwaW5nIHBhaXJzIGFycmF5CiAgKiBAdm9sOgludGZzIHZvbHVtZSAobmVlZGVkIGZvciB0aGUgbnRmcyB2ZXJzaW9uKQogICogQHJsOgkJbG9ja2VkIHJ1bmxpc3QgdG8gZGV0ZXJtaW5lIHRoZSBzaXplIG9mIHRoZSBtYXBwaW5nIHBhaXJzIG9mCi0gKiBAc3RhcnRfdmNuOgl2Y24gYXQgd2hpY2ggdG8gc3RhcnQgdGhlIG1hcHBpbmcgcGFpcnMgYXJyYXkKKyAqIEBmaXJzdF92Y246CWZpcnN0IHZjbiB3aGljaCB0byBpbmNsdWRlIGluIHRoZSBtYXBwaW5nIHBhaXJzIGFycmF5CisgKiBAbGFzdF92Y246CWxhc3QgdmNuIHdoaWNoIHRvIGluY2x1ZGUgaW4gdGhlIG1hcHBpbmcgcGFpcnMgYXJyYXkKICAqCiAgKiBXYWxrIHRoZSBsb2NrZWQgcnVubGlzdCBAcmwgYW5kIGNhbGN1bGF0ZSB0aGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgbWFwcGluZwotICogcGFpcnMgYXJyYXkgY29ycmVzcG9uZGluZyB0byB0aGUgcnVubGlzdCBAcmwsIHN0YXJ0aW5nIGF0IHZjbiBAc3RhcnRfdmNuLgorICogcGFpcnMgYXJyYXkgY29ycmVzcG9uZGluZyB0byB0aGUgcnVubGlzdCBAcmwsIHN0YXJ0aW5nIGF0IHZjbiBAZmlyc3RfdmNuIGFuZAorICogZmluaXNoaW5nIHdpdGggdmNuIEBsYXN0X3Zjbi4KKyAqCisgKiBBIEBsYXN0X3ZjbiBvZiAtMSBtZWFucyBlbmQgb2YgcnVubGlzdCBhbmQgaW4gdGhhdCBjYXNlIHRoZSBzaXplIG9mIHRoZQorICogbWFwcGluZyBwYWlycyBhcnJheSBjb3JyZXNwb25kaW5nIHRvIHRoZSBydW5saXN0IHN0YXJ0aW5nIGF0IHZjbiBAZmlyc3RfdmNuCisgKiBhbmQgZmluaXNoaW5nIGF0IHRoZSBlbmQgb2YgdGhlIHJ1bmxpc3QgaXMgZGV0ZXJtaW5lZC4KKyAqCiAgKiBUaGlzIGZvciBleGFtcGxlIGFsbG93cyB1cyB0byBhbGxvY2F0ZSBhIGJ1ZmZlciBvZiB0aGUgcmlnaHQgc2l6ZSB3aGVuCiAgKiBidWlsZGluZyB0aGUgbWFwcGluZyBwYWlycyBhcnJheS4KICAqCkBAIC0xMDE4LDM0ICsxMDc0LDUwIEBACiAgKgkgICAgcmVtYWlucyBsb2NrZWQgdGhyb3VnaG91dCwgYW5kIGlzIGxlZnQgbG9ja2VkIHVwb24gcmV0dXJuLgogICovCiBpbnQgbnRmc19nZXRfc2l6ZV9mb3JfbWFwcGluZ19wYWlycyhjb25zdCBudGZzX3ZvbHVtZSAqdm9sLAotCQljb25zdCBydW5saXN0X2VsZW1lbnQgKnJsLCBjb25zdCBWQ04gc3RhcnRfdmNuKQorCQljb25zdCBydW5saXN0X2VsZW1lbnQgKnJsLCBjb25zdCBWQ04gZmlyc3RfdmNuLAorCQljb25zdCBWQ04gbGFzdF92Y24pCiB7CiAJTENOIHByZXZfbGNuOwogCWludCBybHM7CisJQk9PTCB0aGVfZW5kID0gRkFMU0U7CiAKLQlCVUdfT04oc3RhcnRfdmNuIDwgMCk7CisJQlVHX09OKGZpcnN0X3ZjbiA8IDApOworCUJVR19PTihsYXN0X3ZjbiA8IC0xKTsKKwlCVUdfT04obGFzdF92Y24gPj0gMCAmJiBmaXJzdF92Y24gPiBsYXN0X3Zjbik7CiAJaWYgKCFybCkgewotCQlCVUdfT04oc3RhcnRfdmNuKTsKKwkJQlVHX09OKGZpcnN0X3Zjbik7CisJCUJVR19PTihsYXN0X3ZjbiA+IDApOwogCQlyZXR1cm4gMTsKIAl9Ci0JLyogU2tpcCB0byBydW5saXN0IGVsZW1lbnQgY29udGFpbmluZyBAc3RhcnRfdmNuLiAqLwotCXdoaWxlIChybC0+bGVuZ3RoICYmIHN0YXJ0X3ZjbiA+PSBybFsxXS52Y24pCisJLyogU2tpcCB0byBydW5saXN0IGVsZW1lbnQgY29udGFpbmluZyBAZmlyc3RfdmNuLiAqLworCXdoaWxlIChybC0+bGVuZ3RoICYmIGZpcnN0X3ZjbiA+PSBybFsxXS52Y24pCiAJCXJsKys7Ci0JaWYgKCghcmwtPmxlbmd0aCAmJiBzdGFydF92Y24gPiBybC0+dmNuKSB8fCBzdGFydF92Y24gPCBybC0+dmNuKQorCWlmICh1bmxpa2VseSgoIXJsLT5sZW5ndGggJiYgZmlyc3RfdmNuID4gcmwtPnZjbikgfHwKKwkJCWZpcnN0X3ZjbiA8IHJsLT52Y24pKQogCQlyZXR1cm4gLUVJTlZBTDsKIAlwcmV2X2xjbiA9IDA7CiAJLyogQWx3YXlzIG5lZWQgdGhlIHRlcm1pbmluZyB6ZXJvIGJ5dGUuICovCiAJcmxzID0gMTsKIAkvKiBEbyB0aGUgZmlyc3QgcGFydGlhbCBydW4gaWYgcHJlc2VudC4gKi8KLQlpZiAoc3RhcnRfdmNuID4gcmwtPnZjbikgewotCQlzNjQgZGVsdGE7CisJaWYgKGZpcnN0X3ZjbiA+IHJsLT52Y24pIHsKKwkJczY0IGRlbHRhLCBsZW5ndGggPSBybC0+bGVuZ3RoOwogCiAJCS8qIFdlIGtub3cgcmwtPmxlbmd0aCAhPSAwIGFscmVhZHkuICovCi0JCWlmIChybC0+bGVuZ3RoIDwgMCB8fCBybC0+bGNuIDwgTENOX0hPTEUpCisJCWlmICh1bmxpa2VseShsZW5ndGggPCAwIHx8IHJsLT5sY24gPCBMQ05fSE9MRSkpCiAJCQlnb3RvIGVycl9vdXQ7Ci0JCWRlbHRhID0gc3RhcnRfdmNuIC0gcmwtPnZjbjsKKwkJLyoKKwkJICogSWYgQHN0b3BfdmNuIGlzIGdpdmVuIGFuZCBmaW5pc2hlcyBpbnNpZGUgdGhpcyBydW4sIGNhcCB0aGUKKwkJICogcnVuIGxlbmd0aC4KKwkJICovCisJCWlmICh1bmxpa2VseShsYXN0X3ZjbiA+PSAwICYmIHJsWzFdLnZjbiA+IGxhc3RfdmNuKSkgeworCQkJczY0IHMxID0gbGFzdF92Y24gKyAxOworCQkJaWYgKHVubGlrZWx5KHJsWzFdLnZjbiA+IHMxKSkKKwkJCQlsZW5ndGggPSBzMSAtIHJsLT52Y247CisJCQl0aGVfZW5kID0gVFJVRTsKKwkJfQorCQlkZWx0YSA9IGZpcnN0X3ZjbiAtIHJsLT52Y247CiAJCS8qIEhlYWRlciBieXRlICsgbGVuZ3RoLiAqLwotCQlybHMgKz0gMSArIG50ZnNfZ2V0X25yX3NpZ25pZmljYW50X2J5dGVzKHJsLT5sZW5ndGggLSBkZWx0YSk7CisJCXJscyArPSAxICsgbnRmc19nZXRfbnJfc2lnbmlmaWNhbnRfYnl0ZXMobGVuZ3RoIC0gZGVsdGEpOwogCQkvKgogCQkgKiBJZiB0aGUgbG9naWNhbCBjbHVzdGVyIG51bWJlciAobGNuKSBkZW5vdGVzIGEgaG9sZSBhbmQgd2UKIAkJICogYXJlIG9uIE5URlMgMy4wKywgd2UgZG9uJ3Qgc3RvcmUgaXQgYXQgYWxsLCBpLmUuIHdlIG5lZWQKQEAgLTEwNTMsOSArMTEyNSw5IEBACiAJCSAqIE5vdGU6IHRoaXMgYXNzdW1lcyB0aGF0IG9uIE5URlMgMS4yLSwgaG9sZXMgYXJlIHN0b3JlZCB3aXRoCiAJCSAqIGFuIGxjbiBvZiAtMSBhbmQgbm90IGEgZGVsdGFfbGNuIG9mIC0xICh1bmxlc3MgYm90aCBhcmUgLTEpLgogCQkgKi8KLQkJaWYgKHJsLT5sY24gPj0gMCB8fCB2b2wtPm1ham9yX3ZlciA8IDMpIHsKKwkJaWYgKGxpa2VseShybC0+bGNuID49IDAgfHwgdm9sLT5tYWpvcl92ZXIgPCAzKSkgewogCQkJcHJldl9sY24gPSBybC0+bGNuOwotCQkJaWYgKHJsLT5sY24gPj0gMCkKKwkJCWlmIChsaWtlbHkocmwtPmxjbiA+PSAwKSkKIAkJCQlwcmV2X2xjbiArPSBkZWx0YTsKIAkJCS8qIENoYW5nZSBpbiBsY24uICovCiAJCQlybHMgKz0gbnRmc19nZXRfbnJfc2lnbmlmaWNhbnRfYnl0ZXMocHJldl9sY24pOwpAQCAtMTA2NCwxMSArMTEzNiwyMyBAQAogCQlybCsrOwogCX0KIAkvKiBEbyB0aGUgZnVsbCBydW5zLiAqLwotCWZvciAoOyBybC0+bGVuZ3RoOyBybCsrKSB7Ci0JCWlmIChybC0+bGVuZ3RoIDwgMCB8fCBybC0+bGNuIDwgTENOX0hPTEUpCisJZm9yICg7IHJsLT5sZW5ndGggJiYgIXRoZV9lbmQ7IHJsKyspIHsKKwkJczY0IGxlbmd0aCA9IHJsLT5sZW5ndGg7CisKKwkJaWYgKHVubGlrZWx5KGxlbmd0aCA8IDAgfHwgcmwtPmxjbiA8IExDTl9IT0xFKSkKIAkJCWdvdG8gZXJyX291dDsKKwkJLyoKKwkJICogSWYgQHN0b3BfdmNuIGlzIGdpdmVuIGFuZCBmaW5pc2hlcyBpbnNpZGUgdGhpcyBydW4sIGNhcCB0aGUKKwkJICogcnVuIGxlbmd0aC4KKwkJICovCisJCWlmICh1bmxpa2VseShsYXN0X3ZjbiA+PSAwICYmIHJsWzFdLnZjbiA+IGxhc3RfdmNuKSkgeworCQkJczY0IHMxID0gbGFzdF92Y24gKyAxOworCQkJaWYgKHVubGlrZWx5KHJsWzFdLnZjbiA+IHMxKSkKKwkJCQlsZW5ndGggPSBzMSAtIHJsLT52Y247CisJCQl0aGVfZW5kID0gVFJVRTsKKwkJfQogCQkvKiBIZWFkZXIgYnl0ZSArIGxlbmd0aC4gKi8KLQkJcmxzICs9IDEgKyBudGZzX2dldF9ucl9zaWduaWZpY2FudF9ieXRlcyhybC0+bGVuZ3RoKTsKKwkJcmxzICs9IDEgKyBudGZzX2dldF9ucl9zaWduaWZpY2FudF9ieXRlcyhsZW5ndGgpOwogCQkvKgogCQkgKiBJZiB0aGUgbG9naWNhbCBjbHVzdGVyIG51bWJlciAobGNuKSBkZW5vdGVzIGEgaG9sZSBhbmQgd2UKIAkJICogYXJlIG9uIE5URlMgMy4wKywgd2UgZG9uJ3Qgc3RvcmUgaXQgYXQgYWxsLCBpLmUuIHdlIG5lZWQKQEAgLTEwNzYsNyArMTE2MCw3IEBACiAJCSAqIE5vdGU6IHRoaXMgYXNzdW1lcyB0aGF0IG9uIE5URlMgMS4yLSwgaG9sZXMgYXJlIHN0b3JlZCB3aXRoCiAJCSAqIGFuIGxjbiBvZiAtMSBhbmQgbm90IGEgZGVsdGFfbGNuIG9mIC0xICh1bmxlc3MgYm90aCBhcmUgLTEpLgogCQkgKi8KLQkJaWYgKHJsLT5sY24gPj0gMCB8fCB2b2wtPm1ham9yX3ZlciA8IDMpIHsKKwkJaWYgKGxpa2VseShybC0+bGNuID49IDAgfHwgdm9sLT5tYWpvcl92ZXIgPCAzKSkgewogCQkJLyogQ2hhbmdlIGluIGxjbi4gKi8KIAkJCXJscyArPSBudGZzX2dldF9ucl9zaWduaWZpY2FudF9ieXRlcyhybC0+bGNuIC0KIAkJCQkJcHJldl9sY24pOwpAQCAtMTExOSw3ICsxMjAzLDcgQEAKIAogCWkgPSAwOwogCWRvIHsKLQkJaWYgKGRzdCA+IGRzdF9tYXgpCisJCWlmICh1bmxpa2VseShkc3QgPiBkc3RfbWF4KSkKIAkJCWdvdG8gZXJyX291dDsKIAkJKmRzdCsrID0gbCAmIDB4ZmZsbDsKIAkJbCA+Pj0gODsKQEAgLTExMjgsMTIgKzEyMTIsMTIgQEAKIAlqID0gKG4gPj4gOCAqIChpIC0gMSkpICYgMHhmZjsKIAkvKiBJZiB0aGUgc2lnbiBiaXQgaXMgd3JvbmcsIHdlIG5lZWQgYW4gZXh0cmEgYnl0ZS4gKi8KIAlpZiAobiA8IDAgJiYgaiA+PSAwKSB7Ci0JCWlmIChkc3QgPiBkc3RfbWF4KQorCQlpZiAodW5saWtlbHkoZHN0ID4gZHN0X21heCkpCiAJCQlnb3RvIGVycl9vdXQ7CiAJCWkrKzsKIAkJKmRzdCA9IChzOCktMTsKIAl9IGVsc2UgaWYgKG4gPiAwICYmIGogPCAwKSB7Ci0JCWlmIChkc3QgPiBkc3RfbWF4KQorCQlpZiAodW5saWtlbHkoZHN0ID4gZHN0X21heCkpCiAJCQlnb3RvIGVycl9vdXQ7CiAJCWkrKzsKIAkJKmRzdCA9IChzOCkwOwpAQCAtMTE0OSwxMyArMTIzMywxOCBAQAogICogQGRzdDoJZGVzdGluYXRpb24gYnVmZmVyIHRvIHdoaWNoIHRvIHdyaXRlIHRoZSBtYXBwaW5nIHBhaXJzIGFycmF5CiAgKiBAZHN0X2xlbjoJc2l6ZSBvZiBkZXN0aW5hdGlvbiBidWZmZXIgQGRzdCBpbiBieXRlcwogICogQHJsOgkJbG9ja2VkIHJ1bmxpc3QgZm9yIHdoaWNoIHRvIGJ1aWxkIHRoZSBtYXBwaW5nIHBhaXJzIGFycmF5Ci0gKiBAc3RhcnRfdmNuOgl2Y24gYXQgd2hpY2ggdG8gc3RhcnQgdGhlIG1hcHBpbmcgcGFpcnMgYXJyYXkKKyAqIEBmaXJzdF92Y246CWZpcnN0IHZjbiB3aGljaCB0byBpbmNsdWRlIGluIHRoZSBtYXBwaW5nIHBhaXJzIGFycmF5CisgKiBAbGFzdF92Y246CWxhc3QgdmNuIHdoaWNoIHRvIGluY2x1ZGUgaW4gdGhlIG1hcHBpbmcgcGFpcnMgYXJyYXkKICAqIEBzdG9wX3ZjbjoJZmlyc3QgdmNuIG91dHNpZGUgZGVzdGluYXRpb24gYnVmZmVyIG9uIHN1Y2Nlc3Mgb3IgLUVOT1NQQwogICoKICAqIENyZWF0ZSB0aGUgbWFwcGluZyBwYWlycyBhcnJheSBmcm9tIHRoZSBsb2NrZWQgcnVubGlzdCBAcmwsIHN0YXJ0aW5nIGF0IHZjbgotICogQHN0YXJ0X3ZjbiBhbmQgc2F2ZSB0aGUgYXJyYXkgaW4gQGRzdC4gIEBkc3RfbGVuIGlzIHRoZSBzaXplIG9mIEBkc3QgaW4KLSAqIGJ5dGVzIGFuZCBpdCBzaG91bGQgYmUgYXQgbGVhc3QgZXF1YWwgdG8gdGhlIHZhbHVlIG9idGFpbmVkIGJ5IGNhbGxpbmcKLSAqIG50ZnNfZ2V0X3NpemVfZm9yX21hcHBpbmdfcGFpcnMoKS4KKyAqIEBmaXJzdF92Y24gYW5kIGZpbmlzaGluZyB3aXRoIHZjbiBAbGFzdF92Y24gYW5kIHNhdmUgdGhlIGFycmF5IGluIEBkc3QuCisgKiBAZHN0X2xlbiBpcyB0aGUgc2l6ZSBvZiBAZHN0IGluIGJ5dGVzIGFuZCBpdCBzaG91bGQgYmUgYXQgbGVhc3QgZXF1YWwgdG8gdGhlCisgKiB2YWx1ZSBvYnRhaW5lZCBieSBjYWxsaW5nIG50ZnNfZ2V0X3NpemVfZm9yX21hcHBpbmdfcGFpcnMoKS4KKyAqCisgKiBBIEBsYXN0X3ZjbiBvZiAtMSBtZWFucyBlbmQgb2YgcnVubGlzdCBhbmQgaW4gdGhhdCBjYXNlIHRoZSBtYXBwaW5nIHBhaXJzCisgKiBhcnJheSBjb3JyZXNwb25kaW5nIHRvIHRoZSBydW5saXN0IHN0YXJ0aW5nIGF0IHZjbiBAZmlyc3RfdmNuIGFuZCBmaW5pc2hpbmcKKyAqIGF0IHRoZSBlbmQgb2YgdGhlIHJ1bmxpc3QgaXMgY3JlYXRlZC4KICAqCiAgKiBJZiBAcmwgaXMgTlVMTCwganVzdCB3cml0ZSBhIHNpbmdsZSB0ZXJtaW5hdG9yIGJ5dGUgdG8gQGRzdC4KICAqCkBAIC0xMTY0LDcgKzEyNTMsNyBAQAogICogYmVlbiBmaWxsZWQgd2l0aCBhbGwgdGhlIG1hcHBpbmcgcGFpcnMgdGhhdCB3aWxsIGZpdCwgdGh1cyBpdCBjYW4gYmUgdHJlYXRlZAogICogYXMgcGFydGlhbCBzdWNjZXNzLCBpbiB0aGF0IGEgbmV3IGF0dHJpYnV0ZSBleHRlbnQgbmVlZHMgdG8gYmUgY3JlYXRlZCBvcgogICogdGhlIG5leHQgZXh0ZW50IGhhcyB0byBiZSB1c2VkIGFuZCB0aGUgbWFwcGluZyBwYWlycyBidWlsZCBoYXMgdG8gYmUKLSAqIGNvbnRpbnVlZCB3aXRoIEBzdGFydF92Y24gc2V0IHRvICpAc3RvcF92Y24uCisgKiBjb250aW51ZWQgd2l0aCBAZmlyc3RfdmNuIHNldCB0byAqQHN0b3BfdmNuLgogICoKICAqIFJldHVybiAwIG9uIHN1Y2Nlc3MgYW5kIC1lcnJubyBvbiBlcnJvci4gIFRoZSBmb2xsb3dpbmcgZXJyb3IgY29kZXMgYXJlCiAgKiBkZWZpbmVkOgpAQCAtMTE3OCwyNyArMTI2NywzMiBAQAogICovCiBpbnQgbnRmc19tYXBwaW5nX3BhaXJzX2J1aWxkKGNvbnN0IG50ZnNfdm9sdW1lICp2b2wsIHM4ICpkc3QsCiAJCWNvbnN0IGludCBkc3RfbGVuLCBjb25zdCBydW5saXN0X2VsZW1lbnQgKnJsLAotCQljb25zdCBWQ04gc3RhcnRfdmNuLCBWQ04gKmNvbnN0IHN0b3BfdmNuKQorCQljb25zdCBWQ04gZmlyc3RfdmNuLCBjb25zdCBWQ04gbGFzdF92Y24sIFZDTiAqY29uc3Qgc3RvcF92Y24pCiB7CiAJTENOIHByZXZfbGNuOwogCXM4ICpkc3RfbWF4LCAqZHN0X25leHQ7CiAJaW50IGVyciA9IC1FTk9TUEM7CisJQk9PTCB0aGVfZW5kID0gRkFMU0U7CiAJczggbGVuX2xlbiwgbGNuX2xlbjsKIAotCUJVR19PTihzdGFydF92Y24gPCAwKTsKKwlCVUdfT04oZmlyc3RfdmNuIDwgMCk7CisJQlVHX09OKGxhc3RfdmNuIDwgLTEpOworCUJVR19PTihsYXN0X3ZjbiA+PSAwICYmIGZpcnN0X3ZjbiA+IGxhc3RfdmNuKTsKIAlCVUdfT04oZHN0X2xlbiA8IDEpOwogCWlmICghcmwpIHsKLQkJQlVHX09OKHN0YXJ0X3Zjbik7CisJCUJVR19PTihmaXJzdF92Y24pOworCQlCVUdfT04obGFzdF92Y24gPiAwKTsKIAkJaWYgKHN0b3BfdmNuKQogCQkJKnN0b3BfdmNuID0gMDsKIAkJLyogVGVybWluYXRvciBieXRlLiAqLwogCQkqZHN0ID0gMDsKIAkJcmV0dXJuIDA7CiAJfQotCS8qIFNraXAgdG8gcnVubGlzdCBlbGVtZW50IGNvbnRhaW5pbmcgQHN0YXJ0X3Zjbi4gKi8KLQl3aGlsZSAocmwtPmxlbmd0aCAmJiBzdGFydF92Y24gPj0gcmxbMV0udmNuKQorCS8qIFNraXAgdG8gcnVubGlzdCBlbGVtZW50IGNvbnRhaW5pbmcgQGZpcnN0X3Zjbi4gKi8KKwl3aGlsZSAocmwtPmxlbmd0aCAmJiBmaXJzdF92Y24gPj0gcmxbMV0udmNuKQogCQlybCsrOwotCWlmICgoIXJsLT5sZW5ndGggJiYgc3RhcnRfdmNuID4gcmwtPnZjbikgfHwgc3RhcnRfdmNuIDwgcmwtPnZjbikKKwlpZiAodW5saWtlbHkoKCFybC0+bGVuZ3RoICYmIGZpcnN0X3ZjbiA+IHJsLT52Y24pIHx8CisJCQlmaXJzdF92Y24gPCBybC0+dmNuKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAJLyoKIAkgKiBAZHN0X21heCBpcyB1c2VkIGZvciBib3VuZHMgY2hlY2tpbmcgaW4KQEAgLTEyMDcsMTcgKzEzMDEsMjcgQEAKIAlkc3RfbWF4ID0gZHN0ICsgZHN0X2xlbiAtIDE7CiAJcHJldl9sY24gPSAwOwogCS8qIERvIHRoZSBmaXJzdCBwYXJ0aWFsIHJ1biBpZiBwcmVzZW50LiAqLwotCWlmIChzdGFydF92Y24gPiBybC0+dmNuKSB7Ci0JCXM2NCBkZWx0YTsKKwlpZiAoZmlyc3RfdmNuID4gcmwtPnZjbikgeworCQlzNjQgZGVsdGEsIGxlbmd0aCA9IHJsLT5sZW5ndGg7CiAKIAkJLyogV2Uga25vdyBybC0+bGVuZ3RoICE9IDAgYWxyZWFkeS4gKi8KLQkJaWYgKHJsLT5sZW5ndGggPCAwIHx8IHJsLT5sY24gPCBMQ05fSE9MRSkKKwkJaWYgKHVubGlrZWx5KGxlbmd0aCA8IDAgfHwgcmwtPmxjbiA8IExDTl9IT0xFKSkKIAkJCWdvdG8gZXJyX291dDsKLQkJZGVsdGEgPSBzdGFydF92Y24gLSBybC0+dmNuOworCQkvKgorCQkgKiBJZiBAc3RvcF92Y24gaXMgZ2l2ZW4gYW5kIGZpbmlzaGVzIGluc2lkZSB0aGlzIHJ1biwgY2FwIHRoZQorCQkgKiBydW4gbGVuZ3RoLgorCQkgKi8KKwkJaWYgKHVubGlrZWx5KGxhc3RfdmNuID49IDAgJiYgcmxbMV0udmNuID4gbGFzdF92Y24pKSB7CisJCQlzNjQgczEgPSBsYXN0X3ZjbiArIDE7CisJCQlpZiAodW5saWtlbHkocmxbMV0udmNuID4gczEpKQorCQkJCWxlbmd0aCA9IHMxIC0gcmwtPnZjbjsKKwkJCXRoZV9lbmQgPSBUUlVFOworCQl9CisJCWRlbHRhID0gZmlyc3RfdmNuIC0gcmwtPnZjbjsKIAkJLyogV3JpdGUgbGVuZ3RoLiAqLwogCQlsZW5fbGVuID0gbnRmc193cml0ZV9zaWduaWZpY2FudF9ieXRlcyhkc3QgKyAxLCBkc3RfbWF4LAotCQkJCXJsLT5sZW5ndGggLSBkZWx0YSk7Ci0JCWlmIChsZW5fbGVuIDwgMCkKKwkJCQlsZW5ndGggLSBkZWx0YSk7CisJCWlmICh1bmxpa2VseShsZW5fbGVuIDwgMCkpCiAJCQlnb3RvIHNpemVfZXJyOwogCQkvKgogCQkgKiBJZiB0aGUgbG9naWNhbCBjbHVzdGVyIG51bWJlciAobGNuKSBkZW5vdGVzIGEgaG9sZSBhbmQgd2UKQEAgLTEyMjgsMTkgKzEzMzIsMTkgQEAKIAkJICogY2FzZSBvbiBOVDQuIC0gV2UgYXNzdW1lIHRoYXQgd2UganVzdCBuZWVkIHRvIHdyaXRlIHRoZSBsY24KIAkJICogY2hhbmdlIHVudGlsIHNvbWVvbmUgdGVsbHMgdXMgb3RoZXJ3aXNlLi4uIChBSUEpCiAJCSAqLwotCQlpZiAocmwtPmxjbiA+PSAwIHx8IHZvbC0+bWFqb3JfdmVyIDwgMykgeworCQlpZiAobGlrZWx5KHJsLT5sY24gPj0gMCB8fCB2b2wtPm1ham9yX3ZlciA8IDMpKSB7CiAJCQlwcmV2X2xjbiA9IHJsLT5sY247Ci0JCQlpZiAocmwtPmxjbiA+PSAwKQorCQkJaWYgKGxpa2VseShybC0+bGNuID49IDApKQogCQkJCXByZXZfbGNuICs9IGRlbHRhOwogCQkJLyogV3JpdGUgY2hhbmdlIGluIGxjbi4gKi8KIAkJCWxjbl9sZW4gPSBudGZzX3dyaXRlX3NpZ25pZmljYW50X2J5dGVzKGRzdCArIDEgKwogCQkJCQlsZW5fbGVuLCBkc3RfbWF4LCBwcmV2X2xjbik7Ci0JCQlpZiAobGNuX2xlbiA8IDApCisJCQlpZiAodW5saWtlbHkobGNuX2xlbiA8IDApKQogCQkJCWdvdG8gc2l6ZV9lcnI7CiAJCX0gZWxzZQogCQkJbGNuX2xlbiA9IDA7CiAJCWRzdF9uZXh0ID0gZHN0ICsgbGVuX2xlbiArIGxjbl9sZW4gKyAxOwotCQlpZiAoZHN0X25leHQgPiBkc3RfbWF4KQorCQlpZiAodW5saWtlbHkoZHN0X25leHQgPiBkc3RfbWF4KSkKIAkJCWdvdG8gc2l6ZV9lcnI7CiAJCS8qIFVwZGF0ZSBoZWFkZXIgYnl0ZS4gKi8KIAkJKmRzdCA9IGxjbl9sZW4gPDwgNCB8IGxlbl9sZW47CkBAIC0xMjUwLDEzICsxMzU0LDI1IEBACiAJCXJsKys7CiAJfQogCS8qIERvIHRoZSBmdWxsIHJ1bnMuICovCi0JZm9yICg7IHJsLT5sZW5ndGg7IHJsKyspIHsKLQkJaWYgKHJsLT5sZW5ndGggPCAwIHx8IHJsLT5sY24gPCBMQ05fSE9MRSkKKwlmb3IgKDsgcmwtPmxlbmd0aCAmJiAhdGhlX2VuZDsgcmwrKykgeworCQlzNjQgbGVuZ3RoID0gcmwtPmxlbmd0aDsKKworCQlpZiAodW5saWtlbHkobGVuZ3RoIDwgMCB8fCBybC0+bGNuIDwgTENOX0hPTEUpKQogCQkJZ290byBlcnJfb3V0OworCQkvKgorCQkgKiBJZiBAc3RvcF92Y24gaXMgZ2l2ZW4gYW5kIGZpbmlzaGVzIGluc2lkZSB0aGlzIHJ1biwgY2FwIHRoZQorCQkgKiBydW4gbGVuZ3RoLgorCQkgKi8KKwkJaWYgKHVubGlrZWx5KGxhc3RfdmNuID49IDAgJiYgcmxbMV0udmNuID4gbGFzdF92Y24pKSB7CisJCQlzNjQgczEgPSBsYXN0X3ZjbiArIDE7CisJCQlpZiAodW5saWtlbHkocmxbMV0udmNuID4gczEpKQorCQkJCWxlbmd0aCA9IHMxIC0gcmwtPnZjbjsKKwkJCXRoZV9lbmQgPSBUUlVFOworCQl9CiAJCS8qIFdyaXRlIGxlbmd0aC4gKi8KIAkJbGVuX2xlbiA9IG50ZnNfd3JpdGVfc2lnbmlmaWNhbnRfYnl0ZXMoZHN0ICsgMSwgZHN0X21heCwKLQkJCQlybC0+bGVuZ3RoKTsKLQkJaWYgKGxlbl9sZW4gPCAwKQorCQkJCWxlbmd0aCk7CisJCWlmICh1bmxpa2VseShsZW5fbGVuIDwgMCkpCiAJCQlnb3RvIHNpemVfZXJyOwogCQkvKgogCQkgKiBJZiB0aGUgbG9naWNhbCBjbHVzdGVyIG51bWJlciAobGNuKSBkZW5vdGVzIGEgaG9sZSBhbmQgd2UKQEAgLTEyNjcsMTcgKzEzODMsMTcgQEAKIAkJICogY2FzZSBvbiBOVDQuIC0gV2UgYXNzdW1lIHRoYXQgd2UganVzdCBuZWVkIHRvIHdyaXRlIHRoZSBsY24KIAkJICogY2hhbmdlIHVudGlsIHNvbWVvbmUgdGVsbHMgdXMgb3RoZXJ3aXNlLi4uIChBSUEpCiAJCSAqLwotCQlpZiAocmwtPmxjbiA+PSAwIHx8IHZvbC0+bWFqb3JfdmVyIDwgMykgeworCQlpZiAobGlrZWx5KHJsLT5sY24gPj0gMCB8fCB2b2wtPm1ham9yX3ZlciA8IDMpKSB7CiAJCQkvKiBXcml0ZSBjaGFuZ2UgaW4gbGNuLiAqLwogCQkJbGNuX2xlbiA9IG50ZnNfd3JpdGVfc2lnbmlmaWNhbnRfYnl0ZXMoZHN0ICsgMSArCiAJCQkJCWxlbl9sZW4sIGRzdF9tYXgsIHJsLT5sY24gLSBwcmV2X2xjbik7Ci0JCQlpZiAobGNuX2xlbiA8IDApCisJCQlpZiAodW5saWtlbHkobGNuX2xlbiA8IDApKQogCQkJCWdvdG8gc2l6ZV9lcnI7CiAJCQlwcmV2X2xjbiA9IHJsLT5sY247CiAJCX0gZWxzZQogCQkJbGNuX2xlbiA9IDA7CiAJCWRzdF9uZXh0ID0gZHN0ICsgbGVuX2xlbiArIGxjbl9sZW4gKyAxOwotCQlpZiAoZHN0X25leHQgPiBkc3RfbWF4KQorCQlpZiAodW5saWtlbHkoZHN0X25leHQgPiBkc3RfbWF4KSkKIAkJCWdvdG8gc2l6ZV9lcnI7CiAJCS8qIFVwZGF0ZSBoZWFkZXIgYnl0ZS4gKi8KIAkJKmRzdCA9IGxjbl9sZW4gPDwgNCB8IGxlbl9sZW47CkBAIC0xNDM2LDMgKzE1NTIsNSBAQAogCW50ZnNfZGVidWcoIkRvbmUuIik7CiAJcmV0dXJuIDA7CiB9CisKKyNlbmRpZiAvKiBOVEZTX1JXICovCmRpZmYgLS1naXQgYS9mcy9udGZzL3J1bmxpc3QuaCBiL2ZzL250ZnMvcnVubGlzdC5oCmluZGV4IDcxMDdmZGUuLmFhMGVlNjUgMTAwNjQ0Ci0tLSBhL2ZzL250ZnMvcnVubGlzdC5oCisrKyBiL2ZzL250ZnMvcnVubGlzdC5oCkBAIC0yLDcgKzIsNyBAQAogICogcnVubGlzdC5oIC0gRGVmaW5lcyBmb3IgcnVubGlzdCBoYW5kbGluZyBpbiBOVEZTIExpbnV4IGtlcm5lbCBkcml2ZXIuCiAgKgkgICAgICAgUGFydCBvZiB0aGUgTGludXgtTlRGUyBwcm9qZWN0LgogICoKLSAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA0IEFudG9uIEFsdGFwYXJtYWtvdgorICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDUgQW50b24gQWx0YXBhcm1ha292CiAgKiBDb3B5cmlnaHQgKGMpIDIwMDIgUmljaGFyZCBSdXNzb24KICAqCiAgKiBUaGlzIHByb2dyYW0vaW5jbHVkZSBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgpAQCAtNjYsNiArNjYsOCBAQAogCUxDTl9IT0xFCQk9IC0xLAkvKiBLZWVwIHRoaXMgYXMgaGlnaGVzdCB2YWx1ZSBvciBkaWUhICovCiAJTENOX1JMX05PVF9NQVBQRUQJPSAtMiwKIAlMQ05fRU5PRU5UCQk9IC0zLAorCUxDTl9FTk9NRU0JCT0gLTQsCisJTENOX0VJTwkJCT0gLTUsCiB9IExDTl9TUEVDSUFMX1ZBTFVFUzsKIAogZXh0ZXJuIHJ1bmxpc3RfZWxlbWVudCAqbnRmc19ydW5saXN0c19tZXJnZShydW5saXN0X2VsZW1lbnQgKmRybCwKQEAgLTc2LDE0ICs3OCwyMiBAQAogCiBleHRlcm4gTENOIG50ZnNfcmxfdmNuX3RvX2xjbihjb25zdCBydW5saXN0X2VsZW1lbnQgKnJsLCBjb25zdCBWQ04gdmNuKTsKIAorI2lmZGVmIE5URlNfUlcKKworZXh0ZXJuIHJ1bmxpc3RfZWxlbWVudCAqbnRmc19ybF9maW5kX3Zjbl9ub2xvY2socnVubGlzdF9lbGVtZW50ICpybCwKKwkJY29uc3QgVkNOIHZjbik7CisKIGV4dGVybiBpbnQgbnRmc19nZXRfc2l6ZV9mb3JfbWFwcGluZ19wYWlycyhjb25zdCBudGZzX3ZvbHVtZSAqdm9sLAotCQljb25zdCBydW5saXN0X2VsZW1lbnQgKnJsLCBjb25zdCBWQ04gc3RhcnRfdmNuKTsKKwkJY29uc3QgcnVubGlzdF9lbGVtZW50ICpybCwgY29uc3QgVkNOIGZpcnN0X3ZjbiwKKwkJY29uc3QgVkNOIGxhc3RfdmNuKTsKIAogZXh0ZXJuIGludCBudGZzX21hcHBpbmdfcGFpcnNfYnVpbGQoY29uc3QgbnRmc192b2x1bWUgKnZvbCwgczggKmRzdCwKIAkJY29uc3QgaW50IGRzdF9sZW4sIGNvbnN0IHJ1bmxpc3RfZWxlbWVudCAqcmwsCi0JCWNvbnN0IFZDTiBzdGFydF92Y24sIFZDTiAqY29uc3Qgc3RvcF92Y24pOworCQljb25zdCBWQ04gZmlyc3RfdmNuLCBjb25zdCBWQ04gbGFzdF92Y24sIFZDTiAqY29uc3Qgc3RvcF92Y24pOwogCiBleHRlcm4gaW50IG50ZnNfcmxfdHJ1bmNhdGVfbm9sb2NrKGNvbnN0IG50ZnNfdm9sdW1lICp2b2wsCiAJCXJ1bmxpc3QgKmNvbnN0IHJ1bmxpc3QsIGNvbnN0IHM2NCBuZXdfbGVuZ3RoKTsKIAorI2VuZGlmIC8qIE5URlNfUlcgKi8KKwogI2VuZGlmIC8qIF9MSU5VWF9OVEZTX1JVTkxJU1RfSCAqLwpkaWZmIC0tZ2l0IGEvZnMvbnRmcy9zdXBlci5jIGIvZnMvbnRmcy9zdXBlci5jCmluZGV4IDIxMmEzZDAuLjQxYWE4ZWIgMTAwNjQ0Ci0tLSBhL2ZzL250ZnMvc3VwZXIuYworKysgYi9mcy9udGZzL3N1cGVyLmMKQEAgLTEsNyArMSw3IEBACiAvKgogICogc3VwZXIuYyAtIE5URlMga2VybmVsIHN1cGVyIGJsb2NrIGhhbmRsaW5nLiBQYXJ0IG9mIHRoZSBMaW51eC1OVEZTIHByb2plY3QuCiAgKgotICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDQgQW50b24gQWx0YXBhcm1ha292CisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNSBBbnRvbiBBbHRhcGFybWFrb3YKICAqIENvcHlyaWdodCAoYykgMjAwMSwyMDAyIFJpY2hhcmQgUnVzc29uCiAgKgogICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKQEAgLTM0LDE0ICszNCwxNiBAQAogI2luY2x1ZGUgInN5c2N0bC5oIgogI2luY2x1ZGUgImxvZ2ZpbGUuaCIKICNpbmNsdWRlICJxdW90YS5oIgorI2luY2x1ZGUgInVzbmpybmwuaCIKICNpbmNsdWRlICJkaXIuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogI2luY2x1ZGUgImluZGV4LmgiCiAjaW5jbHVkZSAiYW9wcy5oIgorI2luY2x1ZGUgImxheW91dC5oIgogI2luY2x1ZGUgIm1hbGxvYy5oIgogI2luY2x1ZGUgIm50ZnMuaCIKIAotLyogTnVtYmVyIG9mIG1vdW50ZWQgZmlsZSBzeXN0ZW1zIHdoaWNoIGhhdmUgY29tcHJlc3Npb24gZW5hYmxlZC4gKi8KKy8qIE51bWJlciBvZiBtb3VudGVkIGZpbGVzeXN0ZW1zIHdoaWNoIGhhdmUgY29tcHJlc3Npb24gZW5hYmxlZC4gKi8KIHN0YXRpYyB1bnNpZ25lZCBsb25nIG50ZnNfbnJfY29tcHJlc3Npb25fdXNlcnM7CiAKIC8qIEEgZ2xvYmFsIGRlZmF1bHQgdXBjYXNlIHRhYmxlIGFuZCBhIGNvcnJlc3BvbmRpbmcgcmVmZXJlbmNlIGNvdW50LiAqLwpAQCAtMTAyLDcgKzEwNCw3IEBACiAJZ2lkX3QgZ2lkID0gKGdpZF90KS0xOwogCW1vZGVfdCBmbWFzayA9IChtb2RlX3QpLTEsIGRtYXNrID0gKG1vZGVfdCktMTsKIAlpbnQgbWZ0X3pvbmVfbXVsdGlwbGllciA9IC0xLCBvbl9lcnJvcnMgPSAtMTsKLQlpbnQgc2hvd19zeXNfZmlsZXMgPSAtMSwgY2FzZV9zZW5zaXRpdmUgPSAtMTsKKwlpbnQgc2hvd19zeXNfZmlsZXMgPSAtMSwgY2FzZV9zZW5zaXRpdmUgPSAtMSwgZGlzYWJsZV9zcGFyc2UgPSAtMTsKIAlzdHJ1Y3QgbmxzX3RhYmxlICpubHNfbWFwID0gTlVMTCwgKm9sZF9ubHM7CiAKIAkvKiBJIGFtIGxhenkuLi4gKC04ICovCkBAIC0xNjIsNiArMTY0LDcgQEAKIAkJZWxzZSBOVEZTX0dFVE9QVF9XSVRIX0RFRkFVTFQoInNsb3BweSIsIHNsb3BweSwgVFJVRSkKIAkJZWxzZSBOVEZTX0dFVE9QVF9CT09MKCJzaG93X3N5c19maWxlcyIsIHNob3dfc3lzX2ZpbGVzKQogCQllbHNlIE5URlNfR0VUT1BUX0JPT0woImNhc2Vfc2Vuc2l0aXZlIiwgY2FzZV9zZW5zaXRpdmUpCisJCWVsc2UgTlRGU19HRVRPUFRfQk9PTCgiZGlzYWJsZV9zcGFyc2UiLCBkaXNhYmxlX3NwYXJzZSkKIAkJZWxzZSBOVEZTX0dFVE9QVF9PUFRJT05TX0FSUkFZKCJlcnJvcnMiLCBvbl9lcnJvcnMsCiAJCQkJb25fZXJyb3JzX2FycikKIAkJZWxzZSBpZiAoIXN0cmNtcChwLCAicG9zaXgiKSB8fCAhc3RyY21wKHAsICJzaG93X2lub2RlcyIpKQpAQCAtMjkxLDYgKzI5NCwyMSBAQAogCQllbHNlCiAJCQlOVm9sQ2xlYXJDYXNlU2Vuc2l0aXZlKHZvbCk7CiAJfQorCWlmIChkaXNhYmxlX3NwYXJzZSAhPSAtMSkgeworCQlpZiAoZGlzYWJsZV9zcGFyc2UpCisJCQlOVm9sQ2xlYXJTcGFyc2VFbmFibGVkKHZvbCk7CisJCWVsc2UgeworCQkJaWYgKCFOVm9sU3BhcnNlRW5hYmxlZCh2b2wpICYmCisJCQkJCXZvbC0+bWFqb3JfdmVyICYmIHZvbC0+bWFqb3JfdmVyIDwgMykKKwkJCQludGZzX3dhcm5pbmcodm9sLT5zYiwgIk5vdCBlbmFibGluZyBzcGFyc2UgIgorCQkJCQkJInN1cHBvcnQgZHVlIHRvIE5URlMgdm9sdW1lICIKKwkJCQkJCSJ2ZXJzaW9uICVpLiVpIChuZWVkIGF0IGxlYXN0ICIKKwkJCQkJCSJ2ZXJzaW9uIDMuMCkuIiwgdm9sLT5tYWpvcl92ZXIsCisJCQkJCQl2b2wtPm1pbm9yX3Zlcik7CisJCQllbHNlCisJCQkJTlZvbFNldFNwYXJzZUVuYWJsZWQodm9sKTsKKwkJfQorCX0KIAlyZXR1cm4gVFJVRTsKIG5lZWRzX2FyZzoKIAludGZzX2Vycm9yKHZvbC0+c2IsICJUaGUgJXMgb3B0aW9uIHJlcXVpcmVzIGFuIGFyZ3VtZW50LiIsIHApOwpAQCAtNDgwLDYgKzQ5OCwxMiBAQAogCQkJTlZvbFNldEVycm9ycyh2b2wpOwogCQkJcmV0dXJuIC1FUk9GUzsKIAkJfQorCQlpZiAoIW50ZnNfc3RhbXBfdXNuanJubCh2b2wpKSB7CisJCQludGZzX2Vycm9yKHNiLCAiRmFpbGVkIHRvIHN0YW1wIHRyYW5zYXRpb24gbG9nICIKKwkJCQkJIigkVXNuSnJubCklcyIsIGVzKTsKKwkJCU5Wb2xTZXRFcnJvcnModm9sKTsKKwkJCXJldHVybiAtRVJPRlM7CisJCX0KIAl9IGVsc2UgaWYgKCEoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpICYmICgqZmxhZ3MgJiBNU19SRE9OTFkpKSB7CiAJCS8qIFJlbW91bnRpbmcgcmVhZC1vbmx5LiAqLwogCQlpZiAoIU5Wb2xFcnJvcnModm9sKSkgewpAQCAtNTE2LDE2ICs1NDAsMTkgQEAKIHsKIAkvKgogCSAqIENoZWNrIHRoYXQgY2hlY2tzdW0gPT0gc3VtIG9mIHUzMiB2YWx1ZXMgZnJvbSBiIHRvIHRoZSBjaGVja3N1bQotCSAqIGZpZWxkLiBJZiBjaGVja3N1bSBpcyB6ZXJvLCBubyBjaGVja2luZyBpcyBkb25lLgorCSAqIGZpZWxkLiAgSWYgY2hlY2tzdW0gaXMgemVybywgbm8gY2hlY2tpbmcgaXMgZG9uZS4gIFdlIHdpbGwgd29yayB3aGVuCisJICogdGhlIGNoZWNrc3VtIHRlc3QgZmFpbHMsIHNpbmNlIHNvbWUgdXRpbGl0aWVzIHVwZGF0ZSB0aGUgYm9vdCBzZWN0b3IKKwkgKiBpZ25vcmluZyB0aGUgY2hlY2tzdW0gd2hpY2ggbGVhdmVzIHRoZSBjaGVja3N1bSBvdXQtb2YtZGF0ZS4gIFdlCisJICogcmVwb3J0IGEgd2FybmluZyBpZiB0aGlzIGlzIHRoZSBjYXNlLgogCSAqLwotCWlmICgodm9pZCopYiA8ICh2b2lkKikmYi0+Y2hlY2tzdW0gJiYgYi0+Y2hlY2tzdW0pIHsKKwlpZiAoKHZvaWQqKWIgPCAodm9pZCopJmItPmNoZWNrc3VtICYmIGItPmNoZWNrc3VtICYmICFzaWxlbnQpIHsKIAkJbGUzMiAqdTsKIAkJdTMyIGk7CiAKIAkJZm9yIChpID0gMCwgdSA9IChsZTMyKiliOyB1IDwgKGxlMzIqKSgmYi0+Y2hlY2tzdW0pOyArK3UpCiAJCQlpICs9IGxlMzJfdG9fY3B1cCh1KTsKIAkJaWYgKGxlMzJfdG9fY3B1KGItPmNoZWNrc3VtKSAhPSBpKQotCQkJZ290byBub3RfbnRmczsKKwkJCW50ZnNfd2FybmluZyhzYiwgIkludmFsaWQgYm9vdCBzZWN0b3IgY2hlY2tzdW0uIik7CiAJfQogCS8qIENoZWNrIE9FTWlkZW50aWZpZXIgaXMgIk5URlMgICAgIiAqLwogCWlmIChiLT5vZW1faWQgIT0gbWFnaWNOVEZTKQpAQCAtNTQxLDkgKzU2OCw5IEBACiAJZGVmYXVsdDoKIAkJZ290byBub3RfbnRmczsKIAl9Ci0JLyogQ2hlY2sgdGhlIGNsdXN0ZXIgc2l6ZSBpcyBub3QgYWJvdmUgNjU1MzYgYnl0ZXMuICovCisJLyogQ2hlY2sgdGhlIGNsdXN0ZXIgc2l6ZSBpcyBub3QgYWJvdmUgdGhlIG1heGltdW0gKDY0a2lCKS4gKi8KIAlpZiAoKHUzMilsZTE2X3RvX2NwdShiLT5icGIuYnl0ZXNfcGVyX3NlY3RvcikgKgotCQkJYi0+YnBiLnNlY3RvcnNfcGVyX2NsdXN0ZXIgPiAweDEwMDAwKQorCQkJYi0+YnBiLnNlY3RvcnNfcGVyX2NsdXN0ZXIgPiBOVEZTX01BWF9DTFVTVEVSX1NJWkUpCiAJCWdvdG8gbm90X250ZnM7CiAJLyogQ2hlY2sgcmVzZXJ2ZWQvdW51c2VkIGZpZWxkcyBhcmUgcmVhbGx5IHplcm8uICovCiAJaWYgKGxlMTZfdG9fY3B1KGItPmJwYi5yZXNlcnZlZF9zZWN0b3JzKSB8fApAQCAtNTc1LDcgKzYwMiw3IEBACiAJICogbWFueSBCSU9TZXMgd2lsbCByZWZ1c2UgdG8gYm9vdCBmcm9tIGEgYm9vdHNlY3RvciBpZiB0aGUgbWFnaWMgaXMKIAkgKiBpbmNvcnJlY3QsIHNvIHdlIGVtaXQgYSB3YXJuaW5nLgogCSAqLwotCWlmICghc2lsZW50ICYmIGItPmVuZF9vZl9zZWN0b3JfbWFya2VyICE9IGNwdV90b19sZTE2KDB4YWE1NSkpCisJaWYgKCFzaWxlbnQgJiYgYi0+ZW5kX29mX3NlY3Rvcl9tYXJrZXIgIT0gY29uc3RfY3B1X3RvX2xlMTYoMHhhYTU1KSkKIAkJbnRmc193YXJuaW5nKHNiLCAiSW52YWxpZCBlbmQgb2Ygc2VjdG9yIG1hcmtlci4iKTsKIAlyZXR1cm4gVFJVRTsKIG5vdF9udGZzOgpAQCAtOTY3LDYgKzk5NCw3IEBACiAJdG1wX25pID0gTlRGU19JKHRtcF9pbm8pOwogCS8qIFRoZSAkTUZUTWlyciwgbGlrZSB0aGUgJE1GVCBpcyBtdWx0aSBzZWN0b3IgdHJhbnNmZXIgcHJvdGVjdGVkLiAqLwogCU5Jbm9TZXRNc3RQcm90ZWN0ZWQodG1wX25pKTsKKwlOSW5vU2V0U3BhcnNlRGlzYWJsZWQodG1wX25pKTsKIAkvKgogCSAqIFNldCB1cCBvdXIgbGl0dGxlIGNoZWF0IGFsbG93aW5nIHVzIHRvIHJldXNlIHRoZSBhc3luYyByZWFkIGlvCiAJICogY29tcGxldGlvbiBoYW5kbGVyIGZvciBkaXJlY3Rvcmllcy4KQEAgLTk5MCwxMiArMTAxOCwxMiBAQAogICovCiBzdGF0aWMgQk9PTCBjaGVja19tZnRfbWlycm9yKG50ZnNfdm9sdW1lICp2b2wpCiB7Ci0JdW5zaWduZWQgbG9uZyBpbmRleDsKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gdm9sLT5zYjsKIAludGZzX2lub2RlICptaXJyX25pOwogCXN0cnVjdCBwYWdlICptZnRfcGFnZSwgKm1pcnJfcGFnZTsKIAl1OCAqa21mdCwgKmttaXJyOwogCXJ1bmxpc3RfZWxlbWVudCAqcmwsIHJsMlsyXTsKKwlwZ29mZl90IGluZGV4OwogCWludCBtcmVjc19wZXJfcGFnZSwgaTsKIAogCW50ZnNfZGVidWcoIkVudGVyaW5nLiIpOwpAQCAtMTEyMiwxMSArMTE1MCwxMzAgQEAKIAkJLyogbnRmc19jaGVja19sb2dmaWxlKCkgd2lsbCBoYXZlIGRpc3BsYXllZCBlcnJvciBvdXRwdXQuICovCiAJCXJldHVybiBGQUxTRTsKIAl9CisJTklub1NldFNwYXJzZURpc2FibGVkKE5URlNfSSh0bXBfaW5vKSk7CiAJdm9sLT5sb2dmaWxlX2lubyA9IHRtcF9pbm87CiAJbnRmc19kZWJ1ZygiRG9uZS4iKTsKIAlyZXR1cm4gVFJVRTsKIH0KIAorI2RlZmluZSBOVEZTX0hJQkVSRklMX0hFQURFUl9TSVpFCTQwOTYKKworLyoqCisgKiBjaGVja193aW5kb3dzX2hpYmVybmF0aW9uX3N0YXR1cyAtIGNoZWNrIGlmIFdpbmRvd3MgaXMgc3VzcGVuZGVkIG9uIGEgdm9sdW1lCisgKiBAdm9sOgludGZzIHN1cGVyIGJsb2NrIG9mIGRldmljZSB0byBjaGVjaworICoKKyAqIENoZWNrIGlmIFdpbmRvd3MgaXMgaGliZXJuYXRlZCBvbiB0aGUgbnRmcyB2b2x1bWUgQHZvbC4gIFRoaXMgaXMgZG9uZSBieQorICogbG9va2luZyBmb3IgdGhlIGZpbGUgaGliZXJmaWwuc3lzIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGUgdm9sdW1lLiAgSWYKKyAqIHRoZSBmaWxlIGlzIG5vdCBwcmVzZW50IFdpbmRvd3MgaXMgZGVmaW5pdGVseSBub3Qgc3VzcGVuZGVkLgorICoKKyAqIElmIGhpYmVyZmlsLnN5cyBleGlzdHMgYW5kIGlzIGxlc3MgdGhhbiA0a2lCIGluIHNpemUgaXQgbWVhbnMgV2luZG93cyBpcworICogZGVmaW5pdGVseSBzdXNwZW5kZWQgKHRoaXMgdm9sdW1lIGlzIG5vdCB0aGUgc3lzdGVtIHZvbHVtZSkuICBDYXZlYXQ6ICBvbiBhCisgKiBzeXN0ZW0gd2l0aCBtYW55IHZvbHVtZXMgaXQgaXMgcG9zc2libGUgdGhhdCB0aGUgPCA0a2lCIGNoZWNrIGlzIGJvZ3VzIGJ1dAorICogZm9yIG5vdyB0aGlzIHNob3VsZCBkbyBmaW5lLgorICoKKyAqIElmIGhpYmVyZmlsLnN5cyBleGlzdHMgYW5kIGlzIGxhcmdlciB0aGFuIDRraUIgaW4gc2l6ZSwgd2UgbmVlZCB0byByZWFkIHRoZQorICogaGliZXJmaWwgaGVhZGVyICh3aGljaCBpcyB0aGUgZmlyc3QgNGtpQikuICBJZiB0aGlzIGJlZ2lucyB3aXRoICJoaWJyIiwKKyAqIFdpbmRvd3MgaXMgZGVmaW5pdGVseSBzdXNwZW5kZWQuICBJZiBpdCBpcyBjb21wbGV0ZWx5IGZ1bGwgb2YgemVyb2VzLAorICogV2luZG93cyBpcyBkZWZpbml0ZWx5IG5vdCBoaWJlcm5hdGVkLiAgQW55IG90aGVyIGNhc2UgaXMgdHJlYXRlZCBhcyBpZgorICogV2luZG93cyBpcyBzdXNwZW5kZWQuICBUaGlzIGNhdGVycyBmb3IgdGhlIGFib3ZlIG1lbnRpb25lZCBjYXZlYXQgb2YgYQorICogc3lzdGVtIHdpdGggbWFueSB2b2x1bWVzIHdoZXJlIG5vICJoaWJyIiBtYWdpYyB3b3VsZCBiZSBwcmVzZW50IGFuZCB0aGVyZSBpcworICogbm8gemVybyBoZWFkZXIuCisgKgorICogUmV0dXJuIDAgaWYgV2luZG93cyBpcyBub3QgaGliZXJuYXRlZCBvbiB0aGUgdm9sdW1lLCA+MCBpZiBXaW5kb3dzIGlzCisgKiBoaWJlcm5hdGVkIG9uIHRoZSB2b2x1bWUsIGFuZCAtZXJybm8gb24gZXJyb3IuCisgKi8KK3N0YXRpYyBpbnQgY2hlY2tfd2luZG93c19oaWJlcm5hdGlvbl9zdGF0dXMobnRmc192b2x1bWUgKnZvbCkKK3sKKwlNRlRfUkVGIG1yZWY7CisJc3RydWN0IGlub2RlICp2aTsKKwludGZzX2lub2RlICpuaTsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwl1MzIgKmthZGRyLCAqa2VuZDsKKwludGZzX25hbWUgKm5hbWUgPSBOVUxMOworCWludCByZXQgPSAxOworCXN0YXRpYyBjb25zdCBudGZzY2hhciBoaWJlcmZpbFsxM10gPSB7IGNvbnN0X2NwdV90b19sZTE2KCdoJyksCisJCQljb25zdF9jcHVfdG9fbGUxNignaScpLCBjb25zdF9jcHVfdG9fbGUxNignYicpLAorCQkJY29uc3RfY3B1X3RvX2xlMTYoJ2UnKSwgY29uc3RfY3B1X3RvX2xlMTYoJ3InKSwKKwkJCWNvbnN0X2NwdV90b19sZTE2KCdmJyksIGNvbnN0X2NwdV90b19sZTE2KCdpJyksCisJCQljb25zdF9jcHVfdG9fbGUxNignbCcpLCBjb25zdF9jcHVfdG9fbGUxNignLicpLAorCQkJY29uc3RfY3B1X3RvX2xlMTYoJ3MnKSwgY29uc3RfY3B1X3RvX2xlMTYoJ3knKSwKKwkJCWNvbnN0X2NwdV90b19sZTE2KCdzJyksIDAgfTsKKworCW50ZnNfZGVidWcoIkVudGVyaW5nLiIpOworCS8qCisJICogRmluZCB0aGUgaW5vZGUgbnVtYmVyIGZvciB0aGUgaGliZXJuYXRpb24gZmlsZSBieSBsb29raW5nIHVwIHRoZQorCSAqIGZpbGVuYW1lIGhpYmVyZmlsLnN5cyBpbiB0aGUgcm9vdCBkaXJlY3RvcnkuCisJICovCisJZG93bigmdm9sLT5yb290X2luby0+aV9zZW0pOworCW1yZWYgPSBudGZzX2xvb2t1cF9pbm9kZV9ieV9uYW1lKE5URlNfSSh2b2wtPnJvb3RfaW5vKSwgaGliZXJmaWwsIDEyLAorCQkJJm5hbWUpOworCXVwKCZ2b2wtPnJvb3RfaW5vLT5pX3NlbSk7CisJaWYgKElTX0VSUl9NUkVGKG1yZWYpKSB7CisJCXJldCA9IE1SRUZfRVJSKG1yZWYpOworCQkvKiBJZiB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdCwgV2luZG93cyBpcyBub3QgaGliZXJuYXRlZC4gKi8KKwkJaWYgKHJldCA9PSAtRU5PRU5UKSB7CisJCQludGZzX2RlYnVnKCJoaWJlcmZpbC5zeXMgbm90IHByZXNlbnQuICBXaW5kb3dzIGlzIG5vdCAiCisJCQkJCSJoaWJlcm5hdGVkIG9uIHRoZSB2b2x1bWUuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQkvKiBBIHJlYWwgZXJyb3Igb2NjdXJlZC4gKi8KKwkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIGZpbmQgaW5vZGUgbnVtYmVyIGZvciAiCisJCQkJImhpYmVyZmlsLnN5cy4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJLyogV2UgZG8gbm90IGNhcmUgZm9yIHRoZSB0eXBlIG9mIG1hdGNoIHRoYXQgd2FzIGZvdW5kLiAqLworCWtmcmVlKG5hbWUpOworCS8qIEdldCB0aGUgaW5vZGUuICovCisJdmkgPSBudGZzX2lnZXQodm9sLT5zYiwgTVJFRihtcmVmKSk7CisJaWYgKElTX0VSUih2aSkgfHwgaXNfYmFkX2lub2RlKHZpKSkgeworCQlpZiAoIUlTX0VSUih2aSkpCisJCQlpcHV0KHZpKTsKKwkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIGxvYWQgaGliZXJmaWwuc3lzLiIpOworCQlyZXR1cm4gSVNfRVJSKHZpKSA/IFBUUl9FUlIodmkpIDogLUVJTzsKKwl9CisJaWYgKHVubGlrZWx5KGlfc2l6ZV9yZWFkKHZpKSA8IE5URlNfSElCRVJGSUxfSEVBREVSX1NJWkUpKSB7CisJCW50ZnNfZGVidWcoImhpYmVyZmlsLnN5cyBpcyBzbWFsbGVyIHRoYW4gNGtpQiAoMHglbGx4KS4gICIKKwkJCQkiV2luZG93cyBpcyBoaWJlcm5hdGVkIG9uIHRoZSB2b2x1bWUuICBUaGlzICIKKwkJCQkiaXMgbm90IHRoZSBzeXN0ZW0gdm9sdW1lLiIsIGlfc2l6ZV9yZWFkKHZpKSk7CisJCWdvdG8gaXB1dF9vdXQ7CisJfQorCW5pID0gTlRGU19JKHZpKTsKKwlwYWdlID0gbnRmc19tYXBfcGFnZSh2aS0+aV9tYXBwaW5nLCAwKTsKKwlpZiAoSVNfRVJSKHBhZ2UpKSB7CisJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byByZWFkIGZyb20gaGliZXJmaWwuc3lzLiIpOworCQlyZXQgPSBQVFJfRVJSKHBhZ2UpOworCQlnb3RvIGlwdXRfb3V0OworCX0KKwlrYWRkciA9ICh1MzIqKXBhZ2VfYWRkcmVzcyhwYWdlKTsKKwlpZiAoKihsZTMyKilrYWRkciA9PSBjb25zdF9jcHVfdG9fbGUzMigweDcyNjI2OTY4KS8qJ2hpYnInKi8pIHsKKwkJbnRmc19kZWJ1ZygiTWFnaWMgXCJoaWJyXCIgZm91bmQgaW4gaGliZXJmaWwuc3lzLiAgV2luZG93cyBpcyAiCisJCQkJImhpYmVybmF0ZWQgb24gdGhlIHZvbHVtZS4gIFRoaXMgaXMgdGhlICIKKwkJCQkic3lzdGVtIHZvbHVtZS4iKTsKKwkJZ290byB1bm1faXB1dF9vdXQ7CisJfQorCWtlbmQgPSBrYWRkciArIE5URlNfSElCRVJGSUxfSEVBREVSX1NJWkUvc2l6ZW9mKCprYWRkcik7CisJZG8geworCQlpZiAodW5saWtlbHkoKmthZGRyKSkgeworCQkJbnRmc19kZWJ1ZygiaGliZXJmaWwuc3lzIGlzIGxhcmdlciB0aGFuIDRraUIgIgorCQkJCQkiKDB4JWxseCksIGRvZXMgbm90IGNvbnRhaW4gdGhlICIKKwkJCQkJIlwiaGliclwiIG1hZ2ljLCBhbmQgZG9lcyBub3QgaGF2ZSBhICIKKwkJCQkJInplcm8gaGVhZGVyLiAgV2luZG93cyBpcyBoaWJlcm5hdGVkICIKKwkJCQkJIm9uIHRoZSB2b2x1bWUuICBUaGlzIGlzIG5vdCB0aGUgIgorCQkJCQkic3lzdGVtIHZvbHVtZS4iLCBpX3NpemVfcmVhZCh2aSkpOworCQkJZ290byB1bm1faXB1dF9vdXQ7CisJCX0KKwl9IHdoaWxlICgrK2thZGRyIDwga2VuZCk7CisJbnRmc19kZWJ1ZygiaGliZXJmaWwuc3lzIGNvbnRhaW5zIGEgemVybyBoZWFkZXIuICBXaW5kb3dzIGlzIG5vdCAiCisJCQkiaGliZXJuYXRlZCBvbiB0aGUgdm9sdW1lLiAgVGhpcyBpcyB0aGUgc3lzdGVtICIKKwkJCSJ2b2x1bWUuIik7CisJcmV0ID0gMDsKK3VubV9pcHV0X291dDoKKwludGZzX3VubWFwX3BhZ2UocGFnZSk7CitpcHV0X291dDoKKwlpcHV0KHZpKTsKKwlyZXR1cm4gcmV0OworfQorCiAvKioKICAqIGxvYWRfYW5kX2luaXRfcXVvdGEgLSBsb2FkIGFuZCBzZXR1cCB0aGUgcXVvdGEgZmlsZSBmb3IgYSB2b2x1bWUgaWYgcHJlc2VudAogICogQHZvbDoJbnRmcyBzdXBlciBibG9jayBkZXNjcmliaW5nIGRldmljZSB3aG9zZSBxdW90YSBmaWxlIHRvIGxvYWQKQEAgLTExNzUsOCArMTMyMiw3IEBACiAJCXJldHVybiBGQUxTRTsKIAl9CiAJLyogV2UgZG8gbm90IGNhcmUgZm9yIHRoZSB0eXBlIG9mIG1hdGNoIHRoYXQgd2FzIGZvdW5kLiAqLwotCWlmIChuYW1lKQotCQlrZnJlZShuYW1lKTsKKwlrZnJlZShuYW1lKTsKIAkvKiBHZXQgdGhlIGlub2RlLiAqLwogCXRtcF9pbm8gPSBudGZzX2lnZXQodm9sLT5zYiwgTVJFRihtcmVmKSk7CiAJaWYgKElTX0VSUih0bXBfaW5vKSB8fCBpc19iYWRfaW5vZGUodG1wX2lubykpIHsKQEAgLTExOTgsNiArMTM0NCwxNjcgQEAKIH0KIAogLyoqCisgKiBsb2FkX2FuZF9pbml0X3VzbmpybmwgLSBsb2FkIGFuZCBzZXR1cCB0aGUgdHJhbnNhY3Rpb24gbG9nIGlmIHByZXNlbnQKKyAqIEB2b2w6CW50ZnMgc3VwZXIgYmxvY2sgZGVzY3JpYmluZyBkZXZpY2Ugd2hvc2UgdXNuanJubCBmaWxlIHRvIGxvYWQKKyAqCisgKiBSZXR1cm4gVFJVRSBvbiBzdWNjZXNzIG9yIEZBTFNFIG9uIGVycm9yLgorICoKKyAqIElmICRVc25Kcm5sIGlzIG5vdCBwcmVzZW50IG9yIGluIHRoZSBwcm9jZXNzIG9mIGJlaW5nIGRpc2FibGVkLCB3ZSBzZXQKKyAqIE5Wb2xVc25Kcm5sU3RhbXBlZCgpIGFuZCByZXR1cm4gc3VjY2Vzcy4KKyAqCisgKiBJZiB0aGUgJFVzbkpybmwgJERBVEEvJEogYXR0cmlidXRlIGhhcyBhIHNpemUgZXF1YWwgdG8gdGhlIGxvd2VzdCB2YWxpZCB1c24sCisgKiBpLmUuIHRyYW5zYWN0aW9uIGxvZ2dpbmcgaGFzIG9ubHkganVzdCBiZWVuIGVuYWJsZWQgb3IgdGhlIGpvdXJuYWwgaGFzIGJlZW4KKyAqIHN0YW1wZWQgYW5kIG5vdGhpbmcgaGFzIGJlZW4gbG9nZ2VkIHNpbmNlLCB3ZSBhbHNvIHNldCBOVm9sVXNuSnJubFN0YW1wZWQoKQorICogYW5kIHJldHVybiBzdWNjZXNzLgorICovCitzdGF0aWMgQk9PTCBsb2FkX2FuZF9pbml0X3VzbmpybmwobnRmc192b2x1bWUgKnZvbCkKK3sKKwlNRlRfUkVGIG1yZWY7CisJc3RydWN0IGlub2RlICp0bXBfaW5vOworCW50ZnNfaW5vZGUgKnRtcF9uaTsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwludGZzX25hbWUgKm5hbWUgPSBOVUxMOworCVVTTl9IRUFERVIgKnVoOworCXN0YXRpYyBjb25zdCBudGZzY2hhciBVc25Kcm5sWzldID0geyBjb25zdF9jcHVfdG9fbGUxNignJCcpLAorCQkJY29uc3RfY3B1X3RvX2xlMTYoJ1UnKSwgY29uc3RfY3B1X3RvX2xlMTYoJ3MnKSwKKwkJCWNvbnN0X2NwdV90b19sZTE2KCduJyksIGNvbnN0X2NwdV90b19sZTE2KCdKJyksCisJCQljb25zdF9jcHVfdG9fbGUxNigncicpLCBjb25zdF9jcHVfdG9fbGUxNignbicpLAorCQkJY29uc3RfY3B1X3RvX2xlMTYoJ2wnKSwgMCB9OworCXN0YXRpYyBudGZzY2hhciBNYXhbNV0gPSB7IGNvbnN0X2NwdV90b19sZTE2KCckJyksCisJCQljb25zdF9jcHVfdG9fbGUxNignTScpLCBjb25zdF9jcHVfdG9fbGUxNignYScpLAorCQkJY29uc3RfY3B1X3RvX2xlMTYoJ3gnKSwgMCB9OworCXN0YXRpYyBudGZzY2hhciBKWzNdID0geyBjb25zdF9jcHVfdG9fbGUxNignJCcpLAorCQkJY29uc3RfY3B1X3RvX2xlMTYoJ0onKSwgMCB9OworCisJbnRmc19kZWJ1ZygiRW50ZXJpbmcuIik7CisJLyoKKwkgKiBGaW5kIHRoZSBpbm9kZSBudW1iZXIgZm9yIHRoZSB0cmFuc2FjdGlvbiBsb2cgZmlsZSBieSBsb29raW5nIHVwIHRoZQorCSAqIGZpbGVuYW1lICRVc25Kcm5sIGluIHRoZSBleHRlbmRlZCBzeXN0ZW0gZmlsZXMgZGlyZWN0b3J5ICRFeHRlbmQuCisJICovCisJZG93bigmdm9sLT5leHRlbmRfaW5vLT5pX3NlbSk7CisJbXJlZiA9IG50ZnNfbG9va3VwX2lub2RlX2J5X25hbWUoTlRGU19JKHZvbC0+ZXh0ZW5kX2lubyksIFVzbkpybmwsIDgsCisJCQkmbmFtZSk7CisJdXAoJnZvbC0+ZXh0ZW5kX2luby0+aV9zZW0pOworCWlmIChJU19FUlJfTVJFRihtcmVmKSkgeworCQkvKgorCQkgKiBJZiB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdCwgdHJhbnNhY3Rpb24gbG9nZ2luZyBpcyBkaXNhYmxlZCwKKwkJICoganVzdCByZXR1cm4gc3VjY2Vzcy4KKwkJICovCisJCWlmIChNUkVGX0VSUihtcmVmKSA9PSAtRU5PRU5UKSB7CisJCQludGZzX2RlYnVnKCIkVXNuSnJubCBub3QgcHJlc2VudC4gIFZvbHVtZSBkb2VzIG5vdCAiCisJCQkJCSJoYXZlIHRyYW5zYWN0aW9uIGxvZ2dpbmcgZW5hYmxlZC4iKTsKK25vdF9lbmFibGVkOgorCQkJLyoKKwkJCSAqIE5vIG5lZWQgdG8gdHJ5IHRvIHN0YW1wIHRoZSB0cmFuc2FjdGlvbiBsb2cgaWYKKwkJCSAqIHRyYW5zYWN0aW9uIGxvZ2dpbmcgaXMgbm90IGVuYWJsZWQuCisJCQkgKi8KKwkJCU5Wb2xTZXRVc25Kcm5sU3RhbXBlZCh2b2wpOworCQkJcmV0dXJuIFRSVUU7CisJCX0KKwkJLyogQSByZWFsIGVycm9yIG9jY3VyZWQuICovCisJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byBmaW5kIGlub2RlIG51bWJlciBmb3IgIgorCQkJCSIkVXNuSnJubC4iKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwkvKiBXZSBkbyBub3QgY2FyZSBmb3IgdGhlIHR5cGUgb2YgbWF0Y2ggdGhhdCB3YXMgZm91bmQuICovCisJa2ZyZWUobmFtZSk7CisJLyogR2V0IHRoZSBpbm9kZS4gKi8KKwl0bXBfaW5vID0gbnRmc19pZ2V0KHZvbC0+c2IsIE1SRUYobXJlZikpOworCWlmICh1bmxpa2VseShJU19FUlIodG1wX2lubykgfHwgaXNfYmFkX2lub2RlKHRtcF9pbm8pKSkgeworCQlpZiAoIUlTX0VSUih0bXBfaW5vKSkKKwkJCWlwdXQodG1wX2lubyk7CisJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byBsb2FkICRVc25Kcm5sLiIpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCXZvbC0+dXNuanJubF9pbm8gPSB0bXBfaW5vOworCS8qCisJICogSWYgdGhlIHRyYW5zYWN0aW9uIGxvZyBpcyBpbiB0aGUgcHJvY2VzcyBvZiBiZWluZyBkZWxldGVkLCB3ZSBjYW4KKwkgKiBpZ25vcmUgaXQuCisJICovCisJaWYgKHVubGlrZWx5KHZvbC0+dm9sX2ZsYWdzICYgVk9MVU1FX0RFTEVURV9VU05fVU5ERVJXQVkpKSB7CisJCW50ZnNfZGVidWcoIiRVc25Kcm5sIGluIHRoZSBwcm9jZXNzIG9mIGJlaW5nIGRpc2FibGVkLiAgIgorCQkJCSJWb2x1bWUgZG9lcyBub3QgaGF2ZSB0cmFuc2FjdGlvbiBsb2dnaW5nICIKKwkJCQkiZW5hYmxlZC4iKTsKKwkJZ290byBub3RfZW5hYmxlZDsKKwl9CisJLyogR2V0IHRoZSAkREFUQS8kTWF4IGF0dHJpYnV0ZS4gKi8KKwl0bXBfaW5vID0gbnRmc19hdHRyX2lnZXQodm9sLT51c25qcm5sX2lubywgQVRfREFUQSwgTWF4LCA0KTsKKwlpZiAoSVNfRVJSKHRtcF9pbm8pKSB7CisJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byBsb2FkICRVc25Kcm5sLyREQVRBLyRNYXggIgorCQkJCSJhdHRyaWJ1dGUuIik7CisJCXJldHVybiBGQUxTRTsKKwl9CisJdm9sLT51c25qcm5sX21heF9pbm8gPSB0bXBfaW5vOworCWlmICh1bmxpa2VseShpX3NpemVfcmVhZCh0bXBfaW5vKSA8IHNpemVvZihVU05fSEVBREVSKSkpIHsKKwkJbnRmc19lcnJvcih2b2wtPnNiLCAiRm91bmQgY29ycnVwdCAkVXNuSnJubC8kREFUQS8kTWF4ICIKKwkJCQkiYXR0cmlidXRlIChzaXplIGlzIDB4JWxseCBidXQgc2hvdWxkIGJlIGF0ICIKKwkJCQkibGVhc3QgMHgleCBieXRlcykuIiwgaV9zaXplX3JlYWQodG1wX2lubyksCisJCQkJc2l6ZW9mKFVTTl9IRUFERVIpKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwkvKiBHZXQgdGhlICREQVRBLyRKIGF0dHJpYnV0ZS4gKi8KKwl0bXBfaW5vID0gbnRmc19hdHRyX2lnZXQodm9sLT51c25qcm5sX2lubywgQVRfREFUQSwgSiwgMik7CisJaWYgKElTX0VSUih0bXBfaW5vKSkgeworCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gbG9hZCAkVXNuSnJubC8kREFUQS8kSiAiCisJCQkJImF0dHJpYnV0ZS4iKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwl2b2wtPnVzbmpybmxfal9pbm8gPSB0bXBfaW5vOworCS8qIFZlcmlmeSAkSiBpcyBub24tcmVzaWRlbnQgYW5kIHNwYXJzZS4gKi8KKwl0bXBfbmkgPSBOVEZTX0kodm9sLT51c25qcm5sX2pfaW5vKTsKKwlpZiAodW5saWtlbHkoIU5Jbm9Ob25SZXNpZGVudCh0bXBfbmkpIHx8ICFOSW5vU3BhcnNlKHRtcF9uaSkpKSB7CisJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIiRVc25Kcm5sLyREQVRBLyRKIGF0dHJpYnV0ZSBpcyByZXNpZGVudCAiCisJCQkJImFuZC9vciBub3Qgc3BhcnNlLiIpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCS8qIFJlYWQgdGhlIFVTTl9IRUFERVIgZnJvbSAkREFUQS8kTWF4LiAqLworCXBhZ2UgPSBudGZzX21hcF9wYWdlKHZvbC0+dXNuanJubF9tYXhfaW5vLT5pX21hcHBpbmcsIDApOworCWlmIChJU19FUlIocGFnZSkpIHsKKwkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIHJlYWQgZnJvbSAkVXNuSnJubC8kREFUQS8kTWF4ICIKKwkJCQkiYXR0cmlidXRlLiIpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCXVoID0gKFVTTl9IRUFERVIqKXBhZ2VfYWRkcmVzcyhwYWdlKTsKKwkvKiBTYW5pdHkgY2hlY2sgdGhlICRNYXguICovCisJaWYgKHVubGlrZWx5KHNsZTY0X3RvX2NwdSh1aC0+YWxsb2NhdGlvbl9kZWx0YSkgPgorCQkJc2xlNjRfdG9fY3B1KHVoLT5tYXhpbXVtX3NpemUpKSkgeworCQludGZzX2Vycm9yKHZvbC0+c2IsICJBbGxvY2F0aW9uIGRlbHRhICgweCVsbHgpIGV4Y2VlZHMgIgorCQkJCSJtYXhpbXVtIHNpemUgKDB4JWxseCkuICAkVXNuSnJubCBpcyBjb3JydXB0LiIsCisJCQkJKGxvbmcgbG9uZylzbGU2NF90b19jcHUodWgtPmFsbG9jYXRpb25fZGVsdGEpLAorCQkJCShsb25nIGxvbmcpc2xlNjRfdG9fY3B1KHVoLT5tYXhpbXVtX3NpemUpKTsKKwkJbnRmc191bm1hcF9wYWdlKHBhZ2UpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCS8qCisJICogSWYgdGhlIHRyYW5zYWN0aW9uIGxvZyBoYXMgYmVlbiBzdGFtcGVkIGFuZCBub3RoaW5nIGhhcyBiZWVuIHdyaXR0ZW4KKwkgKiB0byBpdCBzaW5jZSwgd2UgZG8gbm90IG5lZWQgdG8gc3RhbXAgaXQuCisJICovCisJaWYgKHVubGlrZWx5KHNsZTY0X3RvX2NwdSh1aC0+bG93ZXN0X3ZhbGlkX3VzbikgPj0KKwkJCWlfc2l6ZV9yZWFkKHZvbC0+dXNuanJubF9qX2lubykpKSB7CisJCWlmIChsaWtlbHkoc2xlNjRfdG9fY3B1KHVoLT5sb3dlc3RfdmFsaWRfdXNuKSA9PQorCQkJCWlfc2l6ZV9yZWFkKHZvbC0+dXNuanJubF9qX2lubykpKSB7CisJCQludGZzX3VubWFwX3BhZ2UocGFnZSk7CisJCQludGZzX2RlYnVnKCIkVXNuSnJubCBpcyBlbmFibGVkIGJ1dCBub3RoaW5nIGhhcyBiZWVuICIKKwkJCQkJImxvZ2dlZCBzaW5jZSBpdCB3YXMgbGFzdCBzdGFtcGVkLiAgIgorCQkJCQkiVHJlYXRpbmcgdGhpcyBhcyBpZiB0aGUgdm9sdW1lIGRvZXMgIgorCQkJCQkibm90IGhhdmUgdHJhbnNhY3Rpb24gbG9nZ2luZyAiCisJCQkJCSJlbmFibGVkLiIpOworCQkJZ290byBub3RfZW5hYmxlZDsKKwkJfQorCQludGZzX2Vycm9yKHZvbC0+c2IsICIkVXNuSnJubCBoYXMgbG93ZXN0IHZhbGlkIHVzbiAoMHglbGx4KSAiCisJCQkJIndoaWNoIGlzIG91dCBvZiBib3VuZHMgKDB4JWxseCkuICAkVXNuSnJubCAiCisJCQkJImlzIGNvcnJ1cHQuIiwKKwkJCQkobG9uZyBsb25nKXNsZTY0X3RvX2NwdSh1aC0+bG93ZXN0X3ZhbGlkX3VzbiksCisJCQkJaV9zaXplX3JlYWQodm9sLT51c25qcm5sX2pfaW5vKSk7CisJCW50ZnNfdW5tYXBfcGFnZShwYWdlKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwludGZzX3VubWFwX3BhZ2UocGFnZSk7CisJbnRmc19kZWJ1ZygiRG9uZS4iKTsKKwlyZXR1cm4gVFJVRTsKK30KKworLyoqCiAgKiBsb2FkX2FuZF9pbml0X2F0dHJkZWYgLSBsb2FkIHRoZSBhdHRyaWJ1dGUgZGVmaW5pdGlvbnMgdGFibGUgZm9yIGEgdm9sdW1lCiAgKiBAdm9sOgludGZzIHN1cGVyIGJsb2NrIGRlc2NyaWJpbmcgZGV2aWNlIHdob3NlIGF0dHJkZWYgdG8gbG9hZAogICoKQEAgLTEyMDUsMTAgKzE1MTIsMTEgQEAKICAqLwogc3RhdGljIEJPT0wgbG9hZF9hbmRfaW5pdF9hdHRyZGVmKG50ZnNfdm9sdW1lICp2b2wpCiB7CisJbG9mZl90IGlfc2l6ZTsKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gdm9sLT5zYjsKIAlzdHJ1Y3QgaW5vZGUgKmlubzsKIAlzdHJ1Y3QgcGFnZSAqcGFnZTsKLQl1bnNpZ25lZCBsb25nIGluZGV4LCBtYXhfaW5kZXg7CisJcGdvZmZfdCBpbmRleCwgbWF4X2luZGV4OwogCXVuc2lnbmVkIGludCBzaXplOwogCiAJbnRmc19kZWJ1ZygiRW50ZXJpbmcuIik7CkBAIC0xMjE5LDE0ICsxNTI3LDE2IEBACiAJCQlpcHV0KGlubyk7CiAJCWdvdG8gZmFpbGVkOwogCX0KKwlOSW5vU2V0U3BhcnNlRGlzYWJsZWQoTlRGU19JKGlubykpOwogCS8qIFRoZSBzaXplIG9mIEZJTEVfQXR0ckRlZiBtdXN0IGJlIGFib3ZlIDAgYW5kIGZpdCBpbnNpZGUgMzEgYml0cy4gKi8KLQlpZiAoIWluby0+aV9zaXplIHx8IGluby0+aV9zaXplID4gMHg3ZmZmZmZmZikKKwlpX3NpemUgPSBpX3NpemVfcmVhZChpbm8pOworCWlmIChpX3NpemUgPD0gMCB8fCBpX3NpemUgPiAweDdmZmZmZmZmKQogCQlnb3RvIGlwdXRfZmFpbGVkOwotCXZvbC0+YXR0cmRlZiA9IChBVFRSX0RFRiopbnRmc19tYWxsb2Nfbm9mcyhpbm8tPmlfc2l6ZSk7CisJdm9sLT5hdHRyZGVmID0gKEFUVFJfREVGKiludGZzX21hbGxvY19ub2ZzKGlfc2l6ZSk7CiAJaWYgKCF2b2wtPmF0dHJkZWYpCiAJCWdvdG8gaXB1dF9mYWlsZWQ7CiAJaW5kZXggPSAwOwotCW1heF9pbmRleCA9IGluby0+aV9zaXplID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CisJbWF4X2luZGV4ID0gaV9zaXplID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CiAJc2l6ZSA9IFBBR0VfQ0FDSEVfU0laRTsKIAl3aGlsZSAoaW5kZXggPCBtYXhfaW5kZXgpIHsKIAkJLyogUmVhZCB0aGUgYXR0cmRlZiB0YWJsZSBhbmQgY29weSBpdCBpbnRvIHRoZSBsaW5lYXIgYnVmZmVyLiAqLwpAQCAtMTIzOSwxMiArMTU0OSwxMiBAQAogCQludGZzX3VubWFwX3BhZ2UocGFnZSk7CiAJfTsKIAlpZiAoc2l6ZSA9PSBQQUdFX0NBQ0hFX1NJWkUpIHsKLQkJc2l6ZSA9IGluby0+aV9zaXplICYgflBBR0VfQ0FDSEVfTUFTSzsKKwkJc2l6ZSA9IGlfc2l6ZSAmIH5QQUdFX0NBQ0hFX01BU0s7CiAJCWlmIChzaXplKQogCQkJZ290byByZWFkX3BhcnRpYWxfYXR0cmRlZl9wYWdlOwogCX0KLQl2b2wtPmF0dHJkZWZfc2l6ZSA9IGluby0+aV9zaXplOwotCW50ZnNfZGVidWcoIlJlYWQgJWxsdSBieXRlcyBmcm9tICRBdHRyRGVmLiIsIGluby0+aV9zaXplKTsKKwl2b2wtPmF0dHJkZWZfc2l6ZSA9IGlfc2l6ZTsKKwludGZzX2RlYnVnKCJSZWFkICVsbHUgYnl0ZXMgZnJvbSAkQXR0ckRlZi4iLCBpX3NpemUpOwogCWlwdXQoaW5vKTsKIAlyZXR1cm4gVFJVRTsKIGZyZWVfaXB1dF9mYWlsZWQ6CkBAIC0xMjY3LDEwICsxNTc3LDExIEBACiAgKi8KIHN0YXRpYyBCT09MIGxvYWRfYW5kX2luaXRfdXBjYXNlKG50ZnNfdm9sdW1lICp2b2wpCiB7CisJbG9mZl90IGlfc2l6ZTsKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gdm9sLT5zYjsKIAlzdHJ1Y3QgaW5vZGUgKmlubzsKIAlzdHJ1Y3QgcGFnZSAqcGFnZTsKLQl1bnNpZ25lZCBsb25nIGluZGV4LCBtYXhfaW5kZXg7CisJcGdvZmZfdCBpbmRleCwgbWF4X2luZGV4OwogCXVuc2lnbmVkIGludCBzaXplOwogCWludCBpLCBtYXg7CiAKQEAgLTEyODYsMTQgKzE1OTcsMTUgQEAKIAkgKiBUaGUgdXBjYXNlIHNpemUgbXVzdCBub3QgYmUgYWJvdmUgNjRrIFVuaWNvZGUgY2hhcmFjdGVycywgbXVzdCBub3QKIAkgKiBiZSB6ZXJvIGFuZCBtdXN0IGJlIGEgbXVsdGlwbGUgb2Ygc2l6ZW9mKG50ZnNjaGFyKS4KIAkgKi8KLQlpZiAoIWluby0+aV9zaXplIHx8IGluby0+aV9zaXplICYgKHNpemVvZihudGZzY2hhcikgLSAxKSB8fAotCQkJaW5vLT5pX3NpemUgPiA2NFVMTCAqIDEwMjQgKiBzaXplb2YobnRmc2NoYXIpKQorCWlfc2l6ZSA9IGlfc2l6ZV9yZWFkKGlubyk7CisJaWYgKCFpX3NpemUgfHwgaV9zaXplICYgKHNpemVvZihudGZzY2hhcikgLSAxKSB8fAorCQkJaV9zaXplID4gNjRVTEwgKiAxMDI0ICogc2l6ZW9mKG50ZnNjaGFyKSkKIAkJZ290byBpcHV0X3VwY2FzZV9mYWlsZWQ7Ci0Jdm9sLT51cGNhc2UgPSAobnRmc2NoYXIqKW50ZnNfbWFsbG9jX25vZnMoaW5vLT5pX3NpemUpOworCXZvbC0+dXBjYXNlID0gKG50ZnNjaGFyKiludGZzX21hbGxvY19ub2ZzKGlfc2l6ZSk7CiAJaWYgKCF2b2wtPnVwY2FzZSkKIAkJZ290byBpcHV0X3VwY2FzZV9mYWlsZWQ7CiAJaW5kZXggPSAwOwotCW1heF9pbmRleCA9IGluby0+aV9zaXplID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CisJbWF4X2luZGV4ID0gaV9zaXplID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CiAJc2l6ZSA9IFBBR0VfQ0FDSEVfU0laRTsKIAl3aGlsZSAoaW5kZXggPCBtYXhfaW5kZXgpIHsKIAkJLyogUmVhZCB0aGUgdXBjYXNlIHRhYmxlIGFuZCBjb3B5IGl0IGludG8gdGhlIGxpbmVhciBidWZmZXIuICovCkBAIC0xMzA2LDEzICsxNjE4LDEzIEBACiAJCW50ZnNfdW5tYXBfcGFnZShwYWdlKTsKIAl9OwogCWlmIChzaXplID09IFBBR0VfQ0FDSEVfU0laRSkgewotCQlzaXplID0gaW5vLT5pX3NpemUgJiB+UEFHRV9DQUNIRV9NQVNLOworCQlzaXplID0gaV9zaXplICYgflBBR0VfQ0FDSEVfTUFTSzsKIAkJaWYgKHNpemUpCiAJCQlnb3RvIHJlYWRfcGFydGlhbF91cGNhc2VfcGFnZTsKIAl9Ci0Jdm9sLT51cGNhc2VfbGVuID0gaW5vLT5pX3NpemUgPj4gVUNIQVJfVF9TSVpFX0JJVFM7CisJdm9sLT51cGNhc2VfbGVuID0gaV9zaXplID4+IFVDSEFSX1RfU0laRV9CSVRTOwogCW50ZnNfZGVidWcoIlJlYWQgJWxsdSBieXRlcyBmcm9tICRVcENhc2UgKGV4cGVjdGVkICV6dSBieXRlcykuIiwKLQkJCWluby0+aV9zaXplLCA2NCAqIDEwMjQgKiBzaXplb2YobnRmc2NoYXIpKTsKKwkJCWlfc2l6ZSwgNjQgKiAxMDI0ICogc2l6ZW9mKG50ZnNjaGFyKSk7CiAJaXB1dChpbm8pOwogCWRvd24oJm50ZnNfbG9jayk7CiAJaWYgKCFkZWZhdWx0X3VwY2FzZSkgewpAQCAtMTM3Niw2ICsxNjg4LDkgQEAKIAlNRlRfUkVDT1JEICptOwogCVZPTFVNRV9JTkZPUk1BVElPTiAqdmk7CiAJbnRmc19hdHRyX3NlYXJjaF9jdHggKmN0eDsKKyNpZmRlZiBOVEZTX1JXCisJaW50IGVycjsKKyNlbmRpZiAvKiBOVEZTX1JXICovCiAKIAludGZzX2RlYnVnKCJFbnRlcmluZy4iKTsKICNpZmRlZiBOVEZTX1JXCkBAIC0xNDM1LDcgKzE3NTAsOCBAQAogCQkJaXB1dCh2b2wtPmxjbmJtcF9pbm8pOwogCQlnb3RvIGJpdG1hcF9mYWlsZWQ7CiAJfQotCWlmICgodm9sLT5ucl9jbHVzdGVycyArIDcpID4+IDMgPiB2b2wtPmxjbmJtcF9pbm8tPmlfc2l6ZSkgeworCU5Jbm9TZXRTcGFyc2VEaXNhYmxlZChOVEZTX0kodm9sLT5sY25ibXBfaW5vKSk7CisJaWYgKCh2b2wtPm5yX2NsdXN0ZXJzICsgNykgPj4gMyA+IGlfc2l6ZV9yZWFkKHZvbC0+bGNuYm1wX2lubykpIHsKIAkJaXB1dCh2b2wtPmxjbmJtcF9pbm8pOwogYml0bWFwX2ZhaWxlZDoKIAkJbnRmc19lcnJvcihzYiwgIkZhaWxlZCB0byBsb2FkICRCaXRtYXAuIik7CkBAIC0xNDg2LDYgKzE4MDIsMTIgQEAKIAl1bm1hcF9tZnRfcmVjb3JkKE5URlNfSSh2b2wtPnZvbF9pbm8pKTsKIAlwcmludGsoS0VSTl9JTkZPICJOVEZTIHZvbHVtZSB2ZXJzaW9uICVpLiVpLlxuIiwgdm9sLT5tYWpvcl92ZXIsCiAJCQl2b2wtPm1pbm9yX3Zlcik7CisJaWYgKHZvbC0+bWFqb3JfdmVyIDwgMyAmJiBOVm9sU3BhcnNlRW5hYmxlZCh2b2wpKSB7CisJCW50ZnNfd2FybmluZyh2b2wtPnNiLCAiRGlzYWJsaW5nIHNwYXJzZSBzdXBwb3J0IGR1ZSB0byBOVEZTICIKKwkJCQkidm9sdW1lIHZlcnNpb24gJWkuJWkgKG5lZWQgYXQgbGVhc3QgdmVyc2lvbiAiCisJCQkJIjMuMCkuIiwgdm9sLT5tYWpvcl92ZXIsIHZvbC0+bWlub3JfdmVyKTsKKwkJTlZvbENsZWFyU3BhcnNlRW5hYmxlZCh2b2wpOworCX0KICNpZmRlZiBOVEZTX1JXCiAJLyogTWFrZSBzdXJlIHRoYXQgbm8gdW5zdXBwb3J0ZWQgdm9sdW1lIGZsYWdzIGFyZSBzZXQuICovCiAJaWYgKHZvbC0+dm9sX2ZsYWdzICYgVk9MVU1FX01VU1RfTU9VTlRfUk9fTUFTSykgewpAQCAtMTU0NSw2ICsxODY3LDUwIEBACiAJCS8qIFRoaXMgd2lsbCBwcmV2ZW50IGEgcmVhZC13cml0ZSByZW1vdW50LiAqLwogCQlOVm9sU2V0RXJyb3JzKHZvbCk7CiAJfQorI2VuZGlmIC8qIE5URlNfUlcgKi8KKwkvKiBHZXQgdGhlIHJvb3QgZGlyZWN0b3J5IGlub2RlIHNvIHdlIGNhbiBkbyBwYXRoIGxvb2t1cHMuICovCisJdm9sLT5yb290X2lubyA9IG50ZnNfaWdldChzYiwgRklMRV9yb290KTsKKwlpZiAoSVNfRVJSKHZvbC0+cm9vdF9pbm8pIHx8IGlzX2JhZF9pbm9kZSh2b2wtPnJvb3RfaW5vKSkgeworCQlpZiAoIUlTX0VSUih2b2wtPnJvb3RfaW5vKSkKKwkJCWlwdXQodm9sLT5yb290X2lubyk7CisJCW50ZnNfZXJyb3Ioc2IsICJGYWlsZWQgdG8gbG9hZCByb290IGRpcmVjdG9yeS4iKTsKKwkJZ290byBpcHV0X2xvZ2ZpbGVfZXJyX291dDsKKwl9CisjaWZkZWYgTlRGU19SVworCS8qCisJICogQ2hlY2sgaWYgV2luZG93cyBpcyBzdXNwZW5kZWQgdG8gZGlzayBvbiB0aGUgdGFyZ2V0IHZvbHVtZS4gIElmIGl0CisJICogaXMgaGliZXJuYXRlZCwgd2UgbXVzdCBub3Qgd3JpdGUgKmFueXRoaW5nKiB0byB0aGUgZGlzayBzbyBzZXQKKwkgKiBOVm9sRXJyb3JzKCkgd2l0aG91dCBzZXR0aW5nIHRoZSBkaXJ0eSB2b2x1bWUgZmxhZyBhbmQgbW91bnQKKwkgKiByZWFkLW9ubHkuICBUaGlzIHdpbGwgcHJldmVudCByZWFkLXdyaXRlIHJlbW91bnRpbmcgYW5kIGl0IHdpbGwgYWxzbworCSAqIHByZXZlbnQgYWxsIHdyaXRlcy4KKwkgKi8KKwllcnIgPSBjaGVja193aW5kb3dzX2hpYmVybmF0aW9uX3N0YXR1cyh2b2wpOworCWlmICh1bmxpa2VseShlcnIpKSB7CisJCXN0YXRpYyBjb25zdCBjaGFyICplczFhID0gIkZhaWxlZCB0byBkZXRlcm1pbmUgaWYgV2luZG93cyBpcyAiCisJCQkJImhpYmVybmF0ZWQiOworCQlzdGF0aWMgY29uc3QgY2hhciAqZXMxYiA9ICJXaW5kb3dzIGlzIGhpYmVybmF0ZWQiOworCQlzdGF0aWMgY29uc3QgY2hhciAqZXMyID0gIi4gIFJ1biBjaGtkc2suIjsKKwkJY29uc3QgY2hhciAqZXMxOworCisJCWVzMSA9IGVyciA8IDAgPyBlczFhIDogZXMxYjsKKwkJLyogSWYgYSByZWFkLXdyaXRlIG1vdW50LCBjb252ZXJ0IGl0IHRvIGEgcmVhZC1vbmx5IG1vdW50LiAqLworCQlpZiAoIShzYi0+c19mbGFncyAmIE1TX1JET05MWSkpIHsKKwkJCWlmICghKHZvbC0+b25fZXJyb3JzICYgKE9OX0VSUk9SU19SRU1PVU5UX1JPIHwKKwkJCQkJT05fRVJST1JTX0NPTlRJTlVFKSkpIHsKKwkJCQludGZzX2Vycm9yKHNiLCAiJXMgYW5kIG5laXRoZXIgb25fZXJyb3JzPSIKKwkJCQkJCSJjb250aW51ZSBub3Igb25fZXJyb3JzPSIKKwkJCQkJCSJyZW1vdW50LXJvIHdhcyBzcGVjaWZpZWQlcyIsCisJCQkJCQllczEsIGVzMik7CisJCQkJZ290byBpcHV0X3Jvb3RfZXJyX291dDsKKwkJCX0KKwkJCXNiLT5zX2ZsYWdzIHw9IE1TX1JET05MWSB8IE1TX05PQVRJTUUgfCBNU19OT0RJUkFUSU1FOworCQkJbnRmc19lcnJvcihzYiwgIiVzLiAgTW91bnRpbmcgcmVhZC1vbmx5JXMiLCBlczEsIGVzMik7CisJCX0gZWxzZQorCQkJbnRmc193YXJuaW5nKHNiLCAiJXMuICBXaWxsIG5vdCBiZSBhYmxlIHRvIHJlbW91bnQgIgorCQkJCQkicmVhZC13cml0ZSVzIiwgZXMxLCBlczIpOworCQkvKiBUaGlzIHdpbGwgcHJldmVudCBhIHJlYWQtd3JpdGUgcmVtb3VudC4gKi8KKwkJTlZvbFNldEVycm9ycyh2b2wpOworCX0KIAkvKiBJZiAoc3RpbGwpIGEgcmVhZC13cml0ZSBtb3VudCwgbWFyayB0aGUgdm9sdW1lIGRpcnR5LiAqLwogCWlmICghKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSAmJgogCQkJbnRmc19zZXRfdm9sdW1lX2ZsYWdzKHZvbCwgVk9MVU1FX0lTX0RJUlRZKSkgewpAQCAtMTU1OCw3ICsxOTI0LDcgQEAKIAkJCW50ZnNfZXJyb3Ioc2IsICIlcyBhbmQgbmVpdGhlciBvbl9lcnJvcnM9Y29udGludWUgbm9yICIKIAkJCQkJIm9uX2Vycm9ycz1yZW1vdW50LXJvIHdhcyBzcGVjaWZpZWQlcyIsCiAJCQkJCWVzMSwgZXMyKTsKLQkJCWdvdG8gaXB1dF9sb2dmaWxlX2Vycl9vdXQ7CisJCQlnb3RvIGlwdXRfcm9vdF9lcnJfb3V0OwogCQl9CiAJCW50ZnNfZXJyb3Ioc2IsICIlcy4gIE1vdW50aW5nIHJlYWQtb25seSVzIiwgZXMxLCBlczIpOwogCQlzYi0+c19mbGFncyB8PSBNU19SRE9OTFkgfCBNU19OT0FUSU1FIHwgTVNfTk9ESVJBVElNRTsKQEAgLTE1ODUsNyArMTk1MSw3IEBACiAJCQludGZzX2Vycm9yKHNiLCAiJXMgYW5kIG5laXRoZXIgb25fZXJyb3JzPWNvbnRpbnVlIG5vciAiCiAJCQkJCSJvbl9lcnJvcnM9cmVtb3VudC1ybyB3YXMgc3BlY2lmaWVkJXMiLAogCQkJCQllczEsIGVzMik7Ci0JCQlnb3RvIGlwdXRfbG9nZmlsZV9lcnJfb3V0OworCQkJZ290byBpcHV0X3Jvb3RfZXJyX291dDsKIAkJfQogCQludGZzX2Vycm9yKHNiLCAiJXMuICBNb3VudGluZyByZWFkLW9ubHklcyIsIGVzMSwgZXMyKTsKIAkJc2ItPnNfZmxhZ3MgfD0gTVNfUkRPTkxZIHwgTVNfTk9BVElNRSB8IE1TX05PRElSQVRJTUU7CkBAIC0xNjA0LDIzICsxOTcwLDE1IEBACiAJCQludGZzX2Vycm9yKHNiLCAiJXMgYW5kIG5laXRoZXIgb25fZXJyb3JzPWNvbnRpbnVlIG5vciAiCiAJCQkJCSJvbl9lcnJvcnM9cmVtb3VudC1ybyB3YXMgc3BlY2lmaWVkJXMiLAogCQkJCQllczEsIGVzMik7Ci0JCQlnb3RvIGlwdXRfbG9nZmlsZV9lcnJfb3V0OworCQkJZ290byBpcHV0X3Jvb3RfZXJyX291dDsKIAkJfQogCQludGZzX2Vycm9yKHNiLCAiJXMuICBNb3VudGluZyByZWFkLW9ubHklcyIsIGVzMSwgZXMyKTsKIAkJc2ItPnNfZmxhZ3MgfD0gTVNfUkRPTkxZIHwgTVNfTk9BVElNRSB8IE1TX05PRElSQVRJTUU7CiAJCU5Wb2xTZXRFcnJvcnModm9sKTsKIAl9CiAjZW5kaWYgLyogTlRGU19SVyAqLwotCS8qIEdldCB0aGUgcm9vdCBkaXJlY3RvcnkgaW5vZGUuICovCi0Jdm9sLT5yb290X2lubyA9IG50ZnNfaWdldChzYiwgRklMRV9yb290KTsKLQlpZiAoSVNfRVJSKHZvbC0+cm9vdF9pbm8pIHx8IGlzX2JhZF9pbm9kZSh2b2wtPnJvb3RfaW5vKSkgewotCQlpZiAoIUlTX0VSUih2b2wtPnJvb3RfaW5vKSkKLQkJCWlwdXQodm9sLT5yb290X2lubyk7Ci0JCW50ZnNfZXJyb3Ioc2IsICJGYWlsZWQgdG8gbG9hZCByb290IGRpcmVjdG9yeS4iKTsKLQkJZ290byBpcHV0X2xvZ2ZpbGVfZXJyX291dDsKLQl9CiAJLyogSWYgb24gTlRGUyB2ZXJzaW9ucyBiZWZvcmUgMy4wLCB3ZSBhcmUgZG9uZS4gKi8KLQlpZiAodm9sLT5tYWpvcl92ZXIgPCAzKQorCWlmICh1bmxpa2VseSh2b2wtPm1ham9yX3ZlciA8IDMpKQogCQlyZXR1cm4gVFJVRTsKIAkvKiBOVEZTIDMuMCsgc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24uICovCiAJLyogR2V0IHRoZSBzZWN1cml0eSBkZXNjcmlwdG9ycyBpbm9kZS4gKi8KQEAgLTE2MzEsNyArMTk4OSw3IEBACiAJCW50ZnNfZXJyb3Ioc2IsICJGYWlsZWQgdG8gbG9hZCAkU2VjdXJlLiIpOwogCQlnb3RvIGlwdXRfcm9vdF9lcnJfb3V0OwogCX0KLQkvLyBGSVhNRTogSW5pdGlhbGl6ZSBzZWN1cml0eS4KKwkvLyBUT0RPOiBJbml0aWFsaXplIHNlY3VyaXR5LgogCS8qIEdldCB0aGUgZXh0ZW5kZWQgc3lzdGVtIGZpbGVzJyBkaXJlY3RvcnkgaW5vZGUuICovCiAJdm9sLT5leHRlbmRfaW5vID0gbnRmc19pZ2V0KHNiLCBGSUxFX0V4dGVuZCk7CiAJaWYgKElTX0VSUih2b2wtPmV4dGVuZF9pbm8pIHx8IGlzX2JhZF9pbm9kZSh2b2wtPmV4dGVuZF9pbm8pKSB7CkBAIC0xNjgyLDEwICsyMDQwLDYwIEBACiAJCXNiLT5zX2ZsYWdzIHw9IE1TX1JET05MWSB8IE1TX05PQVRJTUUgfCBNU19OT0RJUkFUSU1FOwogCQlOVm9sU2V0RXJyb3JzKHZvbCk7CiAJfQotCS8vIFRPRE86IERlbGV0ZSBvciBjaGVja3BvaW50IHRoZSAkVXNuSnJubCBpZiBpdCBleGlzdHMuCisJLyoKKwkgKiBGaW5kIHRoZSB0cmFuc2FjdGlvbiBsb2cgZmlsZSAoJFVzbkpybmwpLCBsb2FkIGl0IGlmIHByZXNlbnQsIGNoZWNrCisJICogaXQsIGFuZCBzZXQgaXQgdXAuCisJICovCisJaWYgKCFsb2FkX2FuZF9pbml0X3Vzbmpybmwodm9sKSkgeworCQlzdGF0aWMgY29uc3QgY2hhciAqZXMxID0gIkZhaWxlZCB0byBsb2FkICRVc25Kcm5sIjsKKwkJc3RhdGljIGNvbnN0IGNoYXIgKmVzMiA9ICIuICBSdW4gY2hrZHNrLiI7CisKKwkJLyogSWYgYSByZWFkLXdyaXRlIG1vdW50LCBjb252ZXJ0IGl0IHRvIGEgcmVhZC1vbmx5IG1vdW50LiAqLworCQlpZiAoIShzYi0+c19mbGFncyAmIE1TX1JET05MWSkpIHsKKwkJCWlmICghKHZvbC0+b25fZXJyb3JzICYgKE9OX0VSUk9SU19SRU1PVU5UX1JPIHwKKwkJCQkJT05fRVJST1JTX0NPTlRJTlVFKSkpIHsKKwkJCQludGZzX2Vycm9yKHNiLCAiJXMgYW5kIG5laXRoZXIgb25fZXJyb3JzPSIKKwkJCQkJCSJjb250aW51ZSBub3Igb25fZXJyb3JzPSIKKwkJCQkJCSJyZW1vdW50LXJvIHdhcyBzcGVjaWZpZWQlcyIsCisJCQkJCQllczEsIGVzMik7CisJCQkJZ290byBpcHV0X3VzbmpybmxfZXJyX291dDsKKwkJCX0KKwkJCXNiLT5zX2ZsYWdzIHw9IE1TX1JET05MWSB8IE1TX05PQVRJTUUgfCBNU19OT0RJUkFUSU1FOworCQkJbnRmc19lcnJvcihzYiwgIiVzLiAgTW91bnRpbmcgcmVhZC1vbmx5JXMiLCBlczEsIGVzMik7CisJCX0gZWxzZQorCQkJbnRmc193YXJuaW5nKHNiLCAiJXMuICBXaWxsIG5vdCBiZSBhYmxlIHRvIHJlbW91bnQgIgorCQkJCQkicmVhZC13cml0ZSVzIiwgZXMxLCBlczIpOworCQkvKiBUaGlzIHdpbGwgcHJldmVudCBhIHJlYWQtd3JpdGUgcmVtb3VudC4gKi8KKwkJTlZvbFNldEVycm9ycyh2b2wpOworCX0KKwkvKiBJZiAoc3RpbGwpIGEgcmVhZC13cml0ZSBtb3VudCwgc3RhbXAgdGhlIHRyYW5zYWN0aW9uIGxvZy4gKi8KKwlpZiAoIShzYi0+c19mbGFncyAmIE1TX1JET05MWSkgJiYgIW50ZnNfc3RhbXBfdXNuanJubCh2b2wpKSB7CisJCXN0YXRpYyBjb25zdCBjaGFyICplczEgPSAiRmFpbGVkIHRvIHN0YW1wIHRyYW5zYWN0aW9uIGxvZyAiCisJCQkJIigkVXNuSnJubCkiOworCQlzdGF0aWMgY29uc3QgY2hhciAqZXMyID0gIi4gIFJ1biBjaGtkc2suIjsKKworCQkvKiBDb252ZXJ0IHRvIGEgcmVhZC1vbmx5IG1vdW50LiAqLworCQlpZiAoISh2b2wtPm9uX2Vycm9ycyAmIChPTl9FUlJPUlNfUkVNT1VOVF9STyB8CisJCQkJT05fRVJST1JTX0NPTlRJTlVFKSkpIHsKKwkJCW50ZnNfZXJyb3Ioc2IsICIlcyBhbmQgbmVpdGhlciBvbl9lcnJvcnM9Y29udGludWUgbm9yICIKKwkJCQkJIm9uX2Vycm9ycz1yZW1vdW50LXJvIHdhcyBzcGVjaWZpZWQlcyIsCisJCQkJCWVzMSwgZXMyKTsKKwkJCWdvdG8gaXB1dF91c25qcm5sX2Vycl9vdXQ7CisJCX0KKwkJbnRmc19lcnJvcihzYiwgIiVzLiAgTW91bnRpbmcgcmVhZC1vbmx5JXMiLCBlczEsIGVzMik7CisJCXNiLT5zX2ZsYWdzIHw9IE1TX1JET05MWSB8IE1TX05PQVRJTUUgfCBNU19OT0RJUkFUSU1FOworCQlOVm9sU2V0RXJyb3JzKHZvbCk7CisJfQogI2VuZGlmIC8qIE5URlNfUlcgKi8KIAlyZXR1cm4gVFJVRTsKICNpZmRlZiBOVEZTX1JXCitpcHV0X3VzbmpybmxfZXJyX291dDoKKwlpZiAodm9sLT51c25qcm5sX2pfaW5vKQorCQlpcHV0KHZvbC0+dXNuanJubF9qX2lubyk7CisJaWYgKHZvbC0+dXNuanJubF9tYXhfaW5vKQorCQlpcHV0KHZvbC0+dXNuanJubF9tYXhfaW5vKTsKKwlpZiAodm9sLT51c25qcm5sX2lubykKKwkJaXB1dCh2b2wtPnVzbmpybmxfaW5vKTsKIGlwdXRfcXVvdGFfZXJyX291dDoKIAlpZiAodm9sLT5xdW90YV9xX2lubykKIAkJaXB1dCh2b2wtPnF1b3RhX3FfaW5vKTsKQEAgLTE3NTksNiArMjE2NywxMiBAQAogCiAJLyogTlRGUyAzLjArIHNwZWNpZmljLiAqLwogCWlmICh2b2wtPm1ham9yX3ZlciA+PSAzKSB7CisJCWlmICh2b2wtPnVzbmpybmxfal9pbm8pCisJCQludGZzX2NvbW1pdF9pbm9kZSh2b2wtPnVzbmpybmxfal9pbm8pOworCQlpZiAodm9sLT51c25qcm5sX21heF9pbm8pCisJCQludGZzX2NvbW1pdF9pbm9kZSh2b2wtPnVzbmpybmxfbWF4X2lubyk7CisJCWlmICh2b2wtPnVzbmpybmxfaW5vKQorCQkJbnRmc19jb21taXRfaW5vZGUodm9sLT51c25qcm5sX2lubyk7CiAJCWlmICh2b2wtPnF1b3RhX3FfaW5vKQogCQkJbnRmc19jb21taXRfaW5vZGUodm9sLT5xdW90YV9xX2lubyk7CiAJCWlmICh2b2wtPnF1b3RhX2lubykKQEAgLTE4MTQsNiArMjIyOCwxOCBAQAogCS8qIE5URlMgMy4wKyBzcGVjaWZpYyBjbGVhbiB1cC4gKi8KIAlpZiAodm9sLT5tYWpvcl92ZXIgPj0gMykgewogI2lmZGVmIE5URlNfUlcKKwkJaWYgKHZvbC0+dXNuanJubF9qX2lubykgeworCQkJaXB1dCh2b2wtPnVzbmpybmxfal9pbm8pOworCQkJdm9sLT51c25qcm5sX2pfaW5vID0gTlVMTDsKKwkJfQorCQlpZiAodm9sLT51c25qcm5sX21heF9pbm8pIHsKKwkJCWlwdXQodm9sLT51c25qcm5sX21heF9pbm8pOworCQkJdm9sLT51c25qcm5sX21heF9pbm8gPSBOVUxMOworCQl9CisJCWlmICh2b2wtPnVzbmpybmxfaW5vKSB7CisJCQlpcHV0KHZvbC0+dXNuanJubF9pbm8pOworCQkJdm9sLT51c25qcm5sX2lubyA9IE5VTEw7CisJCX0KIAkJaWYgKHZvbC0+cXVvdGFfcV9pbm8pIHsKIAkJCWlwdXQodm9sLT5xdW90YV9xX2lubyk7CiAJCQl2b2wtPnF1b3RhX3FfaW5vID0gTlVMTDsKQEAgLTE5NTksOCArMjM4NSw3IEBACiAJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSB2b2wtPmxjbmJtcF9pbm8tPmlfbWFwcGluZzsKIAlmaWxsZXJfdCAqcmVhZHBhZ2UgPSAoZmlsbGVyX3QqKW1hcHBpbmctPmFfb3BzLT5yZWFkcGFnZTsKIAlzdHJ1Y3QgcGFnZSAqcGFnZTsKLQl1bnNpZ25lZCBsb25nIGluZGV4LCBtYXhfaW5kZXg7Ci0JdW5zaWduZWQgaW50IG1heF9zaXplOworCXBnb2ZmX3QgaW5kZXgsIG1heF9pbmRleDsKIAogCW50ZnNfZGVidWcoIkVudGVyaW5nLiIpOwogCS8qIFNlcmlhbGl6ZSBhY2Nlc3NlcyB0byB0aGUgY2x1c3RlciBiaXRtYXAuICovCkBAIC0xOTcyLDExICsyMzk3LDEwIEBACiAJICovCiAJbWF4X2luZGV4ID0gKCgodm9sLT5ucl9jbHVzdGVycyArIDcpID4+IDMpICsgUEFHRV9DQUNIRV9TSVpFIC0gMSkgPj4KIAkJCVBBR0VfQ0FDSEVfU0hJRlQ7Ci0JLyogVXNlIG11bHRpcGxlcyBvZiA0IGJ5dGVzLiAqLwotCW1heF9zaXplID0gUEFHRV9DQUNIRV9TSVpFID4+IDI7Ci0JbnRmc19kZWJ1ZygiUmVhZGluZyAkQml0bWFwLCBtYXhfaW5kZXggPSAweCVseCwgbWF4X3NpemUgPSAweCV4LiIsCi0JCQltYXhfaW5kZXgsIG1heF9zaXplKTsKLQlmb3IgKGluZGV4ID0gMFVMOyBpbmRleCA8IG1heF9pbmRleDsgaW5kZXgrKykgeworCS8qIFVzZSBtdWx0aXBsZXMgb2YgNCBieXRlcywgdGh1cyBtYXhfc2l6ZSBpcyBQQUdFX0NBQ0hFX1NJWkUgLyA0LiAqLworCW50ZnNfZGVidWcoIlJlYWRpbmcgJEJpdG1hcCwgbWF4X2luZGV4ID0gMHglbHgsIG1heF9zaXplID0gMHglbHguIiwKKwkJCW1heF9pbmRleCwgUEFHRV9DQUNIRV9TSVpFIC8gNCk7CisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgbWF4X2luZGV4OyBpbmRleCsrKSB7CiAJCXVuc2lnbmVkIGludCBpOwogCQkvKgogCQkgKiBSZWFkIHRoZSBwYWdlIGZyb20gcGFnZSBjYWNoZSwgZ2V0dGluZyBpdCBmcm9tIGJhY2tpbmcgc3RvcmUKQEAgLTIwMDgsNyArMjQzMiw3IEBACiAJCSAqIHRoZSByZXN1bHQgYXMgYWxsIG91dCBvZiByYW5nZSBieXRlcyBhcmUgc2V0IHRvIHplcm8gYnkKIAkJICogbnRmc19yZWFkcGFnZSgpLgogCQkgKi8KLQkgIAlmb3IgKGkgPSAwOyBpIDwgbWF4X3NpemU7IGkrKykKKwkgIAlmb3IgKGkgPSAwOyBpIDwgUEFHRV9DQUNIRV9TSVpFIC8gNDsgaSsrKQogCQkJbnJfZnJlZSAtPSAoczY0KWh3ZWlnaHQzMihrYWRkcltpXSk7CiAJCWt1bm1hcF9hdG9taWMoa2FkZHIsIEtNX1VTRVIwKTsKIAkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOwpAQCAtMjAzMSw2ICsyNDU1LDggQEAKIC8qKgogICogX19nZXRfbnJfZnJlZV9tZnRfcmVjb3JkcyAtIHJldHVybiB0aGUgbnVtYmVyIG9mIGZyZWUgaW5vZGVzIG9uIGEgdm9sdW1lCiAgKiBAdm9sOgludGZzIHZvbHVtZSBmb3Igd2hpY2ggdG8gb2J0YWluIGZyZWUgaW5vZGUgY291bnQKKyAqIEBucl9mcmVlOgludW1iZXIgb2YgbWZ0IHJlY29yZHMgaW4gZmlsZXN5c3RlbQorICogQG1heF9pbmRleDoJbWF4aW11bSBudW1iZXIgb2YgcGFnZXMgY29udGFpbmluZyBzZXQgYml0cwogICoKICAqIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIGZyZWUgbWZ0IHJlY29yZHMgKGlub2Rlcykgb24gdGhlIG1vdW50ZWQgTlRGUwogICogdm9sdW1lIEB2b2wuIFdlIGFjdHVhbGx5IGNhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIG1mdCByZWNvcmRzIGluIHVzZSBpbnN0ZWFkCkBAIC0yMDQzLDMyICsyNDY5LDIwIEBACiAgKgogICogTk9URTogQ2FsbGVyIG11c3QgaG9sZCBtZnRibXBfbG9jayByd19zZW1hcGhvcmUgZm9yIHJlYWRpbmcgb3Igd3JpdGluZy4KICAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcgX19nZXRfbnJfZnJlZV9tZnRfcmVjb3JkcyhudGZzX3ZvbHVtZSAqdm9sKQorc3RhdGljIHVuc2lnbmVkIGxvbmcgX19nZXRfbnJfZnJlZV9tZnRfcmVjb3JkcyhudGZzX3ZvbHVtZSAqdm9sLAorCQlzNjQgbnJfZnJlZSwgY29uc3QgcGdvZmZfdCBtYXhfaW5kZXgpCiB7Ci0JczY0IG5yX2ZyZWU7CiAJdTMyICprYWRkcjsKIAlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IHZvbC0+bWZ0Ym1wX2luby0+aV9tYXBwaW5nOwogCWZpbGxlcl90ICpyZWFkcGFnZSA9IChmaWxsZXJfdCopbWFwcGluZy0+YV9vcHMtPnJlYWRwYWdlOwogCXN0cnVjdCBwYWdlICpwYWdlOwotCXVuc2lnbmVkIGxvbmcgaW5kZXgsIG1heF9pbmRleDsKLQl1bnNpZ25lZCBpbnQgbWF4X3NpemU7CisJcGdvZmZfdCBpbmRleDsKIAogCW50ZnNfZGVidWcoIkVudGVyaW5nLiIpOwotCS8qIE51bWJlciBvZiBtZnQgcmVjb3JkcyBpbiBmaWxlIHN5c3RlbSAoYXQgdGhpcyBwb2ludCBpbiB0aW1lKS4gKi8KLQlucl9mcmVlID0gdm9sLT5tZnRfaW5vLT5pX3NpemUgPj4gdm9sLT5tZnRfcmVjb3JkX3NpemVfYml0czsKLQkvKgotCSAqIENvbnZlcnQgdGhlIG1heGltdW0gbnVtYmVyIG9mIHNldCBiaXRzIGludG8gYnl0ZXMgcm91bmRlZCB1cCwgdGhlbgotCSAqIGNvbnZlcnQgaW50byBtdWx0aXBsZXMgb2YgUEFHRV9DQUNIRV9TSVpFLCByb3VuZGluZyB1cCBzbyB0aGF0IGlmIHdlCi0JICogaGF2ZSBvbmUgZnVsbCBhbmQgb25lIHBhcnRpYWwgcGFnZSBtYXhfaW5kZXggPSAyLgotCSAqLwotCW1heF9pbmRleCA9ICgoKChOVEZTX0kodm9sLT5tZnRfaW5vKS0+aW5pdGlhbGl6ZWRfc2l6ZSA+PgotCQkJdm9sLT5tZnRfcmVjb3JkX3NpemVfYml0cykgKyA3KSA+PiAzKSArCi0JCQlQQUdFX0NBQ0hFX1NJWkUgLSAxKSA+PiBQQUdFX0NBQ0hFX1NISUZUOwotCS8qIFVzZSBtdWx0aXBsZXMgb2YgNCBieXRlcy4gKi8KLQltYXhfc2l6ZSA9IFBBR0VfQ0FDSEVfU0laRSA+PiAyOworCS8qIFVzZSBtdWx0aXBsZXMgb2YgNCBieXRlcywgdGh1cyBtYXhfc2l6ZSBpcyBQQUdFX0NBQ0hFX1NJWkUgLyA0LiAqLwogCW50ZnNfZGVidWcoIlJlYWRpbmcgJE1GVC8kQklUTUFQLCBtYXhfaW5kZXggPSAweCVseCwgbWF4X3NpemUgPSAiCi0JCQkiMHgleC4iLCBtYXhfaW5kZXgsIG1heF9zaXplKTsKLQlmb3IgKGluZGV4ID0gMFVMOyBpbmRleCA8IG1heF9pbmRleDsgaW5kZXgrKykgeworCQkJIjB4JWx4LiIsIG1heF9pbmRleCwgUEFHRV9DQUNIRV9TSVpFIC8gNCk7CisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgbWF4X2luZGV4OyBpbmRleCsrKSB7CiAJCXVuc2lnbmVkIGludCBpOwogCQkvKgogCQkgKiBSZWFkIHRoZSBwYWdlIGZyb20gcGFnZSBjYWNoZSwgZ2V0dGluZyBpdCBmcm9tIGJhY2tpbmcgc3RvcmUKQEAgLTIxMDAsNyArMjUxNCw3IEBACiAJCSAqIHRoZSByZXN1bHQgYXMgYWxsIG91dCBvZiByYW5nZSBieXRlcyBhcmUgc2V0IHRvIHplcm8gYnkKIAkJICogbnRmc19yZWFkcGFnZSgpLgogCQkgKi8KLQkgIAlmb3IgKGkgPSAwOyBpIDwgbWF4X3NpemU7IGkrKykKKwkgIAlmb3IgKGkgPSAwOyBpIDwgUEFHRV9DQUNIRV9TSVpFIC8gNDsgaSsrKQogCQkJbnJfZnJlZSAtPSAoczY0KWh3ZWlnaHQzMihrYWRkcltpXSk7CiAJCWt1bm1hcF9hdG9taWMoa2FkZHIsIEtNX1VTRVIwKTsKIAkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOwpAQCAtMjEzNCw4ICsyNTQ4LDExIEBACiAgKi8KIHN0YXRpYyBpbnQgbnRmc19zdGF0ZnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGtzdGF0ZnMgKnNmcykKIHsKLQludGZzX3ZvbHVtZSAqdm9sID0gTlRGU19TQihzYik7CiAJczY0IHNpemU7CisJbnRmc192b2x1bWUgKnZvbCA9IE5URlNfU0Ioc2IpOworCW50ZnNfaW5vZGUgKm1mdF9uaSA9IE5URlNfSSh2b2wtPm1mdF9pbm8pOworCXBnb2ZmX3QgbWF4X2luZGV4OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAludGZzX2RlYnVnKCJFbnRlcmluZy4iKTsKIAkvKiBUeXBlIG9mIGZpbGVzeXN0ZW0uICovCkBAIC0yMTQzLDEzICsyNTYwLDEzIEBACiAJLyogT3B0aW1hbCB0cmFuc2ZlciBibG9jayBzaXplLiAqLwogCXNmcy0+Zl9ic2l6ZSAgPSBQQUdFX0NBQ0hFX1NJWkU7CiAJLyoKLQkgKiBUb3RhbCBkYXRhIGJsb2NrcyBpbiBmaWxlIHN5c3RlbSBpbiB1bml0cyBvZiBmX2JzaXplIGFuZCBzaW5jZQorCSAqIFRvdGFsIGRhdGEgYmxvY2tzIGluIGZpbGVzeXN0ZW0gaW4gdW5pdHMgb2YgZl9ic2l6ZSBhbmQgc2luY2UKIAkgKiBpbm9kZXMgYXJlIGFsc28gc3RvcmVkIGluIGRhdGEgYmxvY3MgKCRNRlQgaXMgYSBmaWxlKSB0aGlzIGlzIGp1c3QKIAkgKiB0aGUgdG90YWwgY2x1c3RlcnMuCiAJICovCiAJc2ZzLT5mX2Jsb2NrcyA9IHZvbC0+bnJfY2x1c3RlcnMgPDwgdm9sLT5jbHVzdGVyX3NpemVfYml0cyA+PgogCQkJCVBBR0VfQ0FDSEVfU0hJRlQ7Ci0JLyogRnJlZSBkYXRhIGJsb2NrcyBpbiBmaWxlIHN5c3RlbSBpbiB1bml0cyBvZiBmX2JzaXplLiAqLworCS8qIEZyZWUgZGF0YSBibG9ja3MgaW4gZmlsZXN5c3RlbSBpbiB1bml0cyBvZiBmX2JzaXplLiAqLwogCXNpemUJICAgICAgPSBnZXRfbnJfZnJlZV9jbHVzdGVycyh2b2wpIDw8IHZvbC0+Y2x1c3Rlcl9zaXplX2JpdHMgPj4KIAkJCQlQQUdFX0NBQ0hFX1NISUZUOwogCWlmIChzaXplIDwgMExMKQpAQCAtMjE1OCwxNyArMjU3NSwyNyBAQAogCXNmcy0+Zl9iYXZhaWwgPSBzZnMtPmZfYmZyZWUgPSBzaXplOwogCS8qIFNlcmlhbGl6ZSBhY2Nlc3NlcyB0byB0aGUgaW5vZGUgYml0bWFwLiAqLwogCWRvd25fcmVhZCgmdm9sLT5tZnRibXBfbG9jayk7Ci0JLyogTnVtYmVyIG9mIGlub2RlcyBpbiBmaWxlIHN5c3RlbSAoYXQgdGhpcyBwb2ludCBpbiB0aW1lKS4gKi8KLQlzZnMtPmZfZmlsZXMgPSB2b2wtPm1mdF9pbm8tPmlfc2l6ZSA+PiB2b2wtPm1mdF9yZWNvcmRfc2l6ZV9iaXRzOworCXJlYWRfbG9ja19pcnFzYXZlKCZtZnRfbmktPnNpemVfbG9jaywgZmxhZ3MpOworCXNpemUgPSBpX3NpemVfcmVhZCh2b2wtPm1mdF9pbm8pID4+IHZvbC0+bWZ0X3JlY29yZF9zaXplX2JpdHM7CisJLyoKKwkgKiBDb252ZXJ0IHRoZSBtYXhpbXVtIG51bWJlciBvZiBzZXQgYml0cyBpbnRvIGJ5dGVzIHJvdW5kZWQgdXAsIHRoZW4KKwkgKiBjb252ZXJ0IGludG8gbXVsdGlwbGVzIG9mIFBBR0VfQ0FDSEVfU0laRSwgcm91bmRpbmcgdXAgc28gdGhhdCBpZiB3ZQorCSAqIGhhdmUgb25lIGZ1bGwgYW5kIG9uZSBwYXJ0aWFsIHBhZ2UgbWF4X2luZGV4ID0gMi4KKwkgKi8KKwltYXhfaW5kZXggPSAoKCgobWZ0X25pLT5pbml0aWFsaXplZF9zaXplID4+IHZvbC0+bWZ0X3JlY29yZF9zaXplX2JpdHMpCisJCQkrIDcpID4+IDMpICsgUEFHRV9DQUNIRV9TSVpFIC0gMSkgPj4gUEFHRV9DQUNIRV9TSElGVDsKKwlyZWFkX3VubG9ja19pcnFyZXN0b3JlKCZtZnRfbmktPnNpemVfbG9jaywgZmxhZ3MpOworCS8qIE51bWJlciBvZiBpbm9kZXMgaW4gZmlsZXN5c3RlbSAoYXQgdGhpcyBwb2ludCBpbiB0aW1lKS4gKi8KKwlzZnMtPmZfZmlsZXMgPSBzaXplOwogCS8qIEZyZWUgaW5vZGVzIGluIGZzIChiYXNlZCBvbiBjdXJyZW50IHRvdGFsIGNvdW50KS4gKi8KLQlzZnMtPmZfZmZyZWUgPSBfX2dldF9ucl9mcmVlX21mdF9yZWNvcmRzKHZvbCk7CisJc2ZzLT5mX2ZmcmVlID0gX19nZXRfbnJfZnJlZV9tZnRfcmVjb3Jkcyh2b2wsIHNpemUsIG1heF9pbmRleCk7CiAJdXBfcmVhZCgmdm9sLT5tZnRibXBfbG9jayk7CiAJLyoKIAkgKiBGaWxlIHN5c3RlbSBpZC4gVGhpcyBpcyBleHRyZW1lbHkgKm5peCBmbGF2b3VyIGRlcGVuZGVudCBhbmQgZXZlbgogCSAqIHdpdGhpbiBMaW51eCBpdHNlbGYgYWxsIGZzIGRvIHRoZWlyIG93biB0aGluZy4gSSBpbnRlcnByZXQgdGhpcyB0bwogCSAqIG1lYW4gYSB1bmlxdWUgaWQgYXNzb2NpYXRlZCB3aXRoIHRoZSBtb3VudGVkIGZzIGFuZCBub3QgdGhlIGlkCi0JICogYXNzb2NpYXRlZCB3aXRoIHRoZSBmaWxlIHN5c3RlbSBkcml2ZXIsIHRoZSBsYXR0ZXIgaXMgYWxyZWFkeSBnaXZlbgotCSAqIGJ5IHRoZSBmaWxlIHN5c3RlbSB0eXBlIGluIHNmcy0+Zl90eXBlLiBUaHVzIHdlIHVzZSB0aGUgNjQtYml0CisJICogYXNzb2NpYXRlZCB3aXRoIHRoZSBmaWxlc3lzdGVtIGRyaXZlciwgdGhlIGxhdHRlciBpcyBhbHJlYWR5IGdpdmVuCisJICogYnkgdGhlIGZpbGVzeXN0ZW0gdHlwZSBpbiBzZnMtPmZfdHlwZS4gVGh1cyB3ZSB1c2UgdGhlIDY0LWJpdAogCSAqIHZvbHVtZSBzZXJpYWwgbnVtYmVyIHNwbGl0dGluZyBpdCBpbnRvIHR3byAzMi1iaXQgcGFydHMuIFdlIGVudGVyCiAJICogdGhlIGxlYXN0IHNpZ25pZmljYW50IDMyLWJpdHMgaW4gZl9mc2lkWzBdIGFuZCB0aGUgbW9zdCBzaWduaWZpY2FudAogCSAqIDMyLWJpdHMgaW4gZl9mc2lkWzFdLgpAQCAtMjIxOSw1MyArMjY0NiwxOSBAQAogCQkJCQkJICAgcHJvYy4gKi8KIH07CiAKLQogLyoqCi0gKiBEZWNsYXJhdGlvbnMgZm9yIE5URlMgc3BlY2lmaWMgZXhwb3J0IG9wZXJhdGlvbnMgKGZzL250ZnMvbmFtZWkuYykuCi0gKi8KLWV4dGVybiBzdHJ1Y3QgZGVudHJ5ICpudGZzX2dldF9wYXJlbnQoc3RydWN0IGRlbnRyeSAqY2hpbGRfZGVudCk7Ci1leHRlcm4gc3RydWN0IGRlbnRyeSAqbnRmc19nZXRfZGVudHJ5KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHZvaWQgKmZoKTsKLQotLyoqCi0gKiBFeHBvcnQgb3BlcmF0aW9ucyBhbGxvd2luZyBORlMgZXhwb3J0aW5nIG9mIG1vdW50ZWQgTlRGUyBwYXJ0aXRpb25zLgotICoKLSAqIFdlIHVzZSB0aGUgZGVmYXVsdCAtPmRlY29kZV9maCgpIGFuZCAtPmVuY29kZV9maCgpIGZvciBub3cuICBOb3RlIHRoYXQgdGhleQotICogdXNlIDMyIGJpdHMgdG8gc3RvcmUgdGhlIGlub2RlIG51bWJlciB3aGljaCBpcyBhbiB1bnNpZ25lZCBsb25nIHNvIG9uIDY0LWJpdAotICogYXJjaGl0ZWN0dXJlcyBpcyB1c3VhbGx5IDY0IGJpdHMgc28gaXQgd291bGQgYWxsIGZhaWwgaG9ycmlibHkgb24gaHVnZQotICogdm9sdW1lcy4gIEkgZ3Vlc3Mgd2UgbmVlZCB0byBkZWZpbmUgb3VyIG93biBlbmNvZGUgYW5kIGRlY29kZSBmaCBmdW5jdGlvbnMKLSAqIHRoYXQgc3RvcmUgNjQtYml0IGlub2RlIG51bWJlcnMgYXQgc29tZSBwb2ludCBidXQgZm9yIG5vdyB3ZSB3aWxsIGlnbm9yZSB0aGUKLSAqIHByb2JsZW0uLi4KLSAqCi0gKiBXZSBhbHNvIHVzZSB0aGUgZGVmYXVsdCAtPmdldF9uYW1lKCkgaGVscGVyICh1c2VkIGJ5IC0+ZGVjb2RlX2ZoKCkgdmlhCi0gKiBmcy9leHBvcnRmcy9leHBmcy5jOjpmaW5kX2V4cG9ydGVkX2RlbnRyeSgpKSBhcyB0aGF0IGlzIGNvbXBsZXRlbHkgZnMKLSAqIGluZGVwZW5kZW50LgotICoKLSAqIFRoZSBkZWZhdWx0IC0+Z2V0X3BhcmVudCgpIGp1c3QgcmV0dXJucyAtRUFDQ0VTIHNvIHdlIGhhdmUgdG8gcHJvdmlkZSBvdXIKLSAqIG93biBhbmQgdGhlIGRlZmF1bHQgLT5nZXRfZGVudHJ5KCkgaXMgaW5jb21wYXRpYmxlIHdpdGggTlRGUyBkdWUgdG8gbm90Ci0gKiBhbGxvd2luZyB0aGUgaW5vZGUgbnVtYmVyIDAgd2hpY2ggaXMgdXNlZCBpbiBOVEZTIGZvciB0aGUgc3lzdGVtIGZpbGUgJE1GVAotICogYW5kIGR1ZSB0byB1c2luZyBpZ2V0KCkgd2hlcmVhcyBOVEZTIG5lZWRzIG50ZnNfaWdldCgpLgotICovCi1zdGF0aWMgc3RydWN0IGV4cG9ydF9vcGVyYXRpb25zIG50ZnNfZXhwb3J0X29wcyA9IHsKLQkuZ2V0X3BhcmVudAk9IG50ZnNfZ2V0X3BhcmVudCwJLyogRmluZCB0aGUgcGFyZW50IG9mIGEgZ2l2ZW4KLQkJCQkJCSAgIGRpcmVjdG9yeS4gKi8KLQkuZ2V0X2RlbnRyeQk9IG50ZnNfZ2V0X2RlbnRyeSwJLyogRmluZCBhIGRlbnRyeSBmb3IgdGhlIGlub2RlCi0JCQkJCQkgICBnaXZlbiBhIGZpbGUgaGFuZGxlCi0JCQkJCQkgICBzdWItZnJhZ21lbnQuICovCi19OwotCi0vKioKLSAqIG50ZnNfZmlsbF9zdXBlciAtIG1vdW50IGFuIG50ZnMgZmlsZXMgc3lzdGVtCi0gKiBAc2I6CQlzdXBlciBibG9jayBvZiBudGZzIGZpbGUgc3lzdGVtIHRvIG1vdW50CisgKiBudGZzX2ZpbGxfc3VwZXIgLSBtb3VudCBhbiBudGZzIGZpbGVzeXN0ZW0KKyAqIEBzYjoJCXN1cGVyIGJsb2NrIG9mIG50ZnMgZmlsZXN5c3RlbSB0byBtb3VudAogICogQG9wdDoJc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG1vdW50IG9wdGlvbnMKICAqIEBzaWxlbnQ6CXNpbGVuY2UgZXJyb3Igb3V0cHV0CiAgKgogICogbnRmc19maWxsX3N1cGVyKCkgaXMgY2FsbGVkIGJ5IHRoZSBWRlMgdG8gbW91bnQgdGhlIGRldmljZSBkZXNjcmliZWQgYnkgQHNiCi0gKiB3aXRoIHRoZSBtb3VudCBvdGlvbnMgaW4gQGRhdGEgd2l0aCB0aGUgTlRGUyBmaWxlIHN5c3RlbS4KKyAqIHdpdGggdGhlIG1vdW50IG90aW9ucyBpbiBAZGF0YSB3aXRoIHRoZSBOVEZTIGZpbGVzeXN0ZW0uCiAgKgogICogSWYgQHNpbGVudCBpcyB0cnVlLCByZW1haW4gc2lsZW50IGV2ZW4gaWYgZXJyb3JzIGFyZSBkZXRlY3RlZC4gVGhpcyBpcyB1c2VkCi0gKiBkdXJpbmcgYm9vdHVwLCB3aGVuIHRoZSBrZXJuZWwgdHJpZXMgdG8gbW91bnQgdGhlIHJvb3QgZmlsZSBzeXN0ZW0gd2l0aCBhbGwKLSAqIHJlZ2lzdGVyZWQgZmlsZSBzeXN0ZW1zIG9uZSBhZnRlciB0aGUgb3RoZXIgdW50aWwgb25lIHN1Y2NlZWRzLiBUaGlzIGltcGxpZXMKLSAqIHRoYXQgYWxsIGZpbGUgc3lzdGVtcyBleGNlcHQgdGhlIGNvcnJlY3Qgb25lIHdpbGwgcXVpdGUgY29ycmVjdGx5IGFuZAorICogZHVyaW5nIGJvb3R1cCwgd2hlbiB0aGUga2VybmVsIHRyaWVzIHRvIG1vdW50IHRoZSByb290IGZpbGVzeXN0ZW0gd2l0aCBhbGwKKyAqIHJlZ2lzdGVyZWQgZmlsZXN5c3RlbXMgb25lIGFmdGVyIHRoZSBvdGhlciB1bnRpbCBvbmUgc3VjY2VlZHMuIFRoaXMgaW1wbGllcworICogdGhhdCBhbGwgZmlsZXN5c3RlbXMgZXhjZXB0IHRoZSBjb3JyZWN0IG9uZSB3aWxsIHF1aXRlIGNvcnJlY3RseSBhbmQKICAqIGV4cGVjdGVkbHkgcmV0dXJuIGFuIGVycm9yLCBidXQgbm9ib2R5IHdhbnRzIHRvIHNlZSBlcnJvciBtZXNzYWdlcyB3aGVuIGluCiAgKiBmYWN0IHRoaXMgaXMgd2hhdCBpcyBzdXBwb3NlZCB0byBoYXBwZW4uCiAgKgpAQCAtMjI5MiwzOSArMjY4NSwyNSBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAJLyogSW5pdGlhbGl6ZSBudGZzX3ZvbHVtZSBzdHJ1Y3R1cmUuICovCi0JbWVtc2V0KHZvbCwgMCwgc2l6ZW9mKG50ZnNfdm9sdW1lKSk7Ci0Jdm9sLT5zYiA9IHNiOwotCXZvbC0+dXBjYXNlID0gTlVMTDsKLQl2b2wtPmF0dHJkZWYgPSBOVUxMOwotCXZvbC0+bWZ0X2lubyA9IE5VTEw7Ci0Jdm9sLT5tZnRibXBfaW5vID0gTlVMTDsKKwkqdm9sID0gKG50ZnNfdm9sdW1lKSB7CisJCS5zYiA9IHNiLAorCQkvKgorCQkgKiBEZWZhdWx0IGlzIGdyb3VwIGFuZCBvdGhlciBkb24ndCBoYXZlIGFueSBhY2Nlc3MgdG8gZmlsZXMgb3IKKwkJICogZGlyZWN0b3JpZXMgd2hpbGUgb3duZXIgaGFzIGZ1bGwgYWNjZXNzLiBGdXJ0aGVyLCBmaWxlcyBieQorCQkgKiBkZWZhdWx0IGFyZSBub3QgZXhlY3V0YWJsZSBidXQgZGlyZWN0b3JpZXMgYXJlIG9mIGNvdXJzZQorCQkgKiBicm93c2VhYmxlLgorCQkgKi8KKwkJLmZtYXNrID0gMDE3NywKKwkJLmRtYXNrID0gMDA3NywKKwl9OwogCWluaXRfcndzZW0oJnZvbC0+bWZ0Ym1wX2xvY2spOwotI2lmZGVmIE5URlNfUlcKLQl2b2wtPm1mdG1pcnJfaW5vID0gTlVMTDsKLQl2b2wtPmxvZ2ZpbGVfaW5vID0gTlVMTDsKLSNlbmRpZiAvKiBOVEZTX1JXICovCi0Jdm9sLT5sY25ibXBfaW5vID0gTlVMTDsKIAlpbml0X3J3c2VtKCZ2b2wtPmxjbmJtcF9sb2NrKTsKLQl2b2wtPnZvbF9pbm8gPSBOVUxMOwotCXZvbC0+cm9vdF9pbm8gPSBOVUxMOwotCXZvbC0+c2VjdXJlX2lubyA9IE5VTEw7Ci0Jdm9sLT5leHRlbmRfaW5vID0gTlVMTDsKLSNpZmRlZiBOVEZTX1JXCi0Jdm9sLT5xdW90YV9pbm8gPSBOVUxMOwotCXZvbC0+cXVvdGFfcV9pbm8gPSBOVUxMOwotI2VuZGlmIC8qIE5URlNfUlcgKi8KLQl2b2wtPm5sc19tYXAgPSBOVUxMOwotCi0JLyoKLQkgKiBEZWZhdWx0IGlzIGdyb3VwIGFuZCBvdGhlciBkb24ndCBoYXZlIGFueSBhY2Nlc3MgdG8gZmlsZXMgb3IKLQkgKiBkaXJlY3RvcmllcyB3aGlsZSBvd25lciBoYXMgZnVsbCBhY2Nlc3MuIEZ1cnRoZXIsIGZpbGVzIGJ5IGRlZmF1bHQKLQkgKiBhcmUgbm90IGV4ZWN1dGFibGUgYnV0IGRpcmVjdG9yaWVzIGFyZSBvZiBjb3Vyc2UgYnJvd3NlYWJsZS4KLQkgKi8KLQl2b2wtPmZtYXNrID0gMDE3NzsKLQl2b2wtPmRtYXNrID0gMDA3NzsKIAogCXVubG9ja19rZXJuZWwoKTsKIAorCS8qIEJ5IGRlZmF1bHQsIGVuYWJsZSBzcGFyc2Ugc3VwcG9ydC4gKi8KKwlOVm9sU2V0U3BhcnNlRW5hYmxlZCh2b2wpOworCiAJLyogSW1wb3J0YW50IHRvIGdldCB0aGUgbW91bnQgb3B0aW9ucyBkZWFsdCB3aXRoIG5vdy4gKi8KIAlpZiAoIXBhcnNlX29wdGlvbnModm9sLCAoY2hhciopb3B0KSkKIAkJZ290byBlcnJfb3V0X25vdzsKQEAgLTIzNDcsNyArMjcyNiw4IEBACiAJfQogCiAJLyogR2V0IHRoZSBzaXplIG9mIHRoZSBkZXZpY2UgaW4gdW5pdHMgb2YgTlRGU19CTE9DS19TSVpFIGJ5dGVzLiAqLwotCXZvbC0+bnJfYmxvY2tzID0gc2ItPnNfYmRldi0+YmRfaW5vZGUtPmlfc2l6ZSA+PiBOVEZTX0JMT0NLX1NJWkVfQklUUzsKKwl2b2wtPm5yX2Jsb2NrcyA9IGlfc2l6ZV9yZWFkKHNiLT5zX2JkZXYtPmJkX2lub2RlKSA+PgorCQkJTlRGU19CTE9DS19TSVpFX0JJVFM7CiAKIAkvKiBSZWFkIHRoZSBib290IHNlY3RvciBhbmQgcmV0dXJuIHVubG9ja2VkIGJ1ZmZlciBoZWFkIHRvIGl0LiAqLwogCWlmICghKGJoID0gcmVhZF9udGZzX2Jvb3Rfc2VjdG9yKHNiLCBzaWxlbnQpKSkgewpAQCAtMjQ3Niw2ICsyODU2LDE4IEBACiAJLyogTlRGUyAzLjArIHNwZWNpZmljIGNsZWFuIHVwLiAqLwogCWlmICh2b2wtPm1ham9yX3ZlciA+PSAzKSB7CiAjaWZkZWYgTlRGU19SVworCQlpZiAodm9sLT51c25qcm5sX2pfaW5vKSB7CisJCQlpcHV0KHZvbC0+dXNuanJubF9qX2lubyk7CisJCQl2b2wtPnVzbmpybmxfal9pbm8gPSBOVUxMOworCQl9CisJCWlmICh2b2wtPnVzbmpybmxfbWF4X2lubykgeworCQkJaXB1dCh2b2wtPnVzbmpybmxfbWF4X2lubyk7CisJCQl2b2wtPnVzbmpybmxfbWF4X2lubyA9IE5VTEw7CisJCX0KKwkJaWYgKHZvbC0+dXNuanJubF9pbm8pIHsKKwkJCWlwdXQodm9sLT51c25qcm5sX2lubyk7CisJCQl2b2wtPnVzbmpybmxfaW5vID0gTlVMTDsKKwkJfQogCQlpZiAodm9sLT5xdW90YV9xX2lubykgewogCQkJaXB1dCh2b2wtPnF1b3RhX3FfaW5vKTsKIAkJCXZvbC0+cXVvdGFfcV9pbm8gPSBOVUxMOwpAQCAtMjU4MSw3ICsyOTczLDcgQEAKICAqLwoga21lbV9jYWNoZV90ICpudGZzX25hbWVfY2FjaGU7CiAKLS8qIFNsYWIgY2FjaGVzIGZvciBlZmZpY2llbnQgYWxsb2NhdGlvbi9kZWFsbG9jYXRpb24gb2Ygb2YgaW5vZGVzLiAqLworLyogU2xhYiBjYWNoZXMgZm9yIGVmZmljaWVudCBhbGxvY2F0aW9uL2RlYWxsb2NhdGlvbiBvZiBpbm9kZXMuICovCiBrbWVtX2NhY2hlX3QgKm50ZnNfaW5vZGVfY2FjaGU7CiBrbWVtX2NhY2hlX3QgKm50ZnNfYmlnX2lub2RlX2NhY2hlOwogCkBAIC0yNzA1LDcgKzMwOTcsNyBAQAogCQludGZzX2RlYnVnKCJOVEZTIGRyaXZlciByZWdpc3RlcmVkIHN1Y2Nlc3NmdWxseS4iKTsKIAkJcmV0dXJuIDA7IC8qIFN1Y2Nlc3MhICovCiAJfQotCXByaW50ayhLRVJOX0NSSVQgIk5URlM6IEZhaWxlZCB0byByZWdpc3RlciBOVEZTIGZpbGUgc3lzdGVtIGRyaXZlciFcbiIpOworCXByaW50ayhLRVJOX0NSSVQgIk5URlM6IEZhaWxlZCB0byByZWdpc3RlciBOVEZTIGZpbGVzeXN0ZW0gZHJpdmVyIVxuIik7CiAKIHN5c2N0bF9lcnJfb3V0OgogCWttZW1fY2FjaGVfZGVzdHJveShudGZzX2JpZ19pbm9kZV9jYWNoZSk7CkBAIC0yNzE5LDcgKzMxMTEsNyBAQAogCWttZW1fY2FjaGVfZGVzdHJveShudGZzX2luZGV4X2N0eF9jYWNoZSk7CiBpY3R4X2Vycl9vdXQ6CiAJaWYgKCFlcnIpIHsKLQkJcHJpbnRrKEtFUk5fQ1JJVCAiTlRGUzogQWJvcnRpbmcgTlRGUyBmaWxlIHN5c3RlbSBkcml2ZXIgIgorCQlwcmludGsoS0VSTl9DUklUICJOVEZTOiBBYm9ydGluZyBOVEZTIGZpbGVzeXN0ZW0gZHJpdmVyICIKIAkJCQkicmVnaXN0cmF0aW9uLi4uXG4iKTsKIAkJZXJyID0gLUVOT01FTTsKIAl9CkBAIC0yNzU5LDcgKzMxNTEsNyBAQAogfQogCiBNT0RVTEVfQVVUSE9SKCJBbnRvbiBBbHRhcGFybWFrb3YgPGFpYTIxQGNhbnRhYi5uZXQ+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIk5URlMgMS4yLzMueCBkcml2ZXIgLSBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNCBBbnRvbiBBbHRhcGFybWFrb3YiKTsKK01PRFVMRV9ERVNDUklQVElPTigiTlRGUyAxLjIvMy54IGRyaXZlciAtIENvcHlyaWdodCAoYykgMjAwMS0yMDA1IEFudG9uIEFsdGFwYXJtYWtvdiIpOwogTU9EVUxFX1ZFUlNJT04oTlRGU19WRVJTSU9OKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKICNpZmRlZiBERUJVRwpkaWZmIC0tZ2l0IGEvZnMvbnRmcy9zeXNjdGwuYyBiL2ZzL250ZnMvc3lzY3RsLmMKaW5kZXggNzUwNjdlNC4uMWMyMzEzOCAxMDA2NDQKLS0tIGEvZnMvbnRmcy9zeXNjdGwuYworKysgYi9mcy9udGZzL3N5c2N0bC5jCkBAIC0zLDcgKzMsNyBAQAogICoJICAgICAgdGhlIExpbnV4LU5URlMgcHJvamVjdC4gQWRhcHRlZCBmcm9tIHRoZSBvbGQgTlRGUyBkcml2ZXIsCiAgKgkgICAgICBDb3B5cmlnaHQgKEMpIDE5OTcgTWFydGluIHZvbiBM9ndpcywgUulnaXMgRHVjaGVzbmUKICAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNCBBbnRvbiBBbHRhcGFybWFrb3YKKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IEFudG9uIEFsdGFwYXJtYWtvdgogICoKICAqIFRoaXMgcHJvZ3JhbS9pbmNsdWRlIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKQEAgLTY3LDcgKzY3LDcgQEAKIAkJCXJldHVybiAtRU5PTUVNOwogI2lmZGVmIENPTkZJR19QUk9DX0ZTCiAJCS8qCi0JCSAqIElmIHRoZSBwcm9jIGZpbGUgc3lzdGVtIGlzIGluIHVzZSBhbmQgd2UgYXJlIGEgbW9kdWxlLCBuZWVkCisJCSAqIElmIHRoZSBwcm9jIGZpbGVzeXN0ZW0gaXMgaW4gdXNlIGFuZCB3ZSBhcmUgYSBtb2R1bGUsIG5lZWQKIAkJICogdG8gc2V0IHRoZSBvd25lciBvZiBvdXIgcHJvYyBlbnRyeSB0byBvdXIgbW9kdWxlLiBJbiB0aGUKIAkJICogbm9uLW1vZHVsYXIgY2FzZSwgVEhJU19NT0RVTEUgaXMgTlVMTCwgc28gdGhpcyBpcyBvay4KIAkJICovCmRpZmYgLS1naXQgYS9mcy9udGZzL3RpbWUuaCBiL2ZzL250ZnMvdGltZS5oCmluZGV4IGEwOWE1MWQuLjAxMjMzOTggMTAwNjQ0Ci0tLSBhL2ZzL250ZnMvdGltZS5oCisrKyBiL2ZzL250ZnMvdGltZS5oCkBAIC0xLDcgKzEsNyBAQAogLyoKICAqIHRpbWUuaCAtIE5URlMgdGltZSBjb252ZXJzaW9uIGZ1bmN0aW9ucy4gIFBhcnQgb2YgdGhlIExpbnV4LU5URlMgcHJvamVjdC4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNCBBbnRvbiBBbHRhcGFybWFrb3YKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA1IEFudG9uIEFsdGFwYXJtYWtvdgogICoKICAqIFRoaXMgcHJvZ3JhbS9pbmNsdWRlIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKQEAgLTg3LDcgKzg3LDcgQEAKIAlzdHJ1Y3QgdGltZXNwZWMgdHM7CiAKIAkvKiBTdWJ0cmFjdCB0aGUgTlRGUyB0aW1lIG9mZnNldC4gKi8KLQlzNjQgdCA9IHNsZTY0X3RvX2NwdSh0aW1lKSAtIE5URlNfVElNRV9PRkZTRVQ7CisJdTY0IHQgPSAodTY0KShzbGU2NF90b19jcHUodGltZSkgLSBOVEZTX1RJTUVfT0ZGU0VUKTsKIAkvKgogCSAqIENvbnZlcnQgdGhlIHRpbWUgdG8gMS1zZWNvbmQgaW50ZXJ2YWxzIGFuZCB0aGUgcmVtYWluZGVyIHRvCiAJICogMS1uYW5vLXNlY29uZCBpbnRlcnZhbHMuCmRpZmYgLS1naXQgYS9mcy9udGZzL3R5cGVzLmggYi9mcy9udGZzL3R5cGVzLmgKaW5kZXggMDhhNTVhYS4uNmU0YTdlMyAxMDA2NDQKLS0tIGEvZnMvbnRmcy90eXBlcy5oCisrKyBiL2ZzL250ZnMvdHlwZXMuaApAQCAtMiw3ICsyLDcgQEAKICAqIHR5cGVzLmggLSBEZWZpbmVzIGZvciBOVEZTIExpbnV4IGtlcm5lbCBkcml2ZXIgc3BlY2lmaWMgdHlwZXMuCiAgKgkgICAgIFBhcnQgb2YgdGhlIExpbnV4LU5URlMgcHJvamVjdC4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNCBBbnRvbiBBbHRhcGFybWFrb3YKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA1IEFudG9uIEFsdGFwYXJtYWtvdgogICoKICAqIFRoaXMgcHJvZ3JhbS9pbmNsdWRlIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKQEAgLTUzLDYgKzUzLDE0IEBACiB0eXBlZGVmIHM2NCBMU047CiB0eXBlZGVmIHNsZTY0IGxlTFNOOwogCisvKgorICogVGhlIE5URlMgdHJhbnNhY3Rpb24gbG9nICRVc25Kcm5sIHVzZXMgdXNuIHdoaWNoIGFyZSBzaWduZWQgNjQtYml0IHZhbHVlcy4KKyAqIFdlIGRlZmluZSBvdXIgb3duIHR5cGUgVVNOLCB0byBhbGxvdyBmb3IgdHlwZSBjaGVja2luZyBhbmQgYmV0dGVyIGNvZGUKKyAqIHJlYWRhYmlsaXR5LgorICovCit0eXBlZGVmIHM2NCBVU047Cit0eXBlZGVmIHNsZTY0IGxlVVNOOworCiB0eXBlZGVmIGVudW0gewogCUZBTFNFID0gMCwKIAlUUlVFID0gMQpkaWZmIC0tZ2l0IGEvZnMvbnRmcy91bmlzdHIuYyBiL2ZzL250ZnMvdW5pc3RyLmMKaW5kZXggNTYwYjBlYS4uMTljNDJlMiAxMDA2NDQKLS0tIGEvZnMvbnRmcy91bmlzdHIuYworKysgYi9mcy9udGZzL3VuaXN0ci5jCkBAIC0yNjQsNyArMjY0LDcgQEAKIAogCS8qIFdlIGRvbid0IHRydXN0IG91dHNpZGUgc291cmNlcy4gKi8KIAlpZiAoaW5zKSB7Ci0JCXVjcyA9IChudGZzY2hhciopa21lbV9jYWNoZV9hbGxvYyhudGZzX25hbWVfY2FjaGUsIFNMQUJfTk9GUyk7CisJCXVjcyA9IGttZW1fY2FjaGVfYWxsb2MobnRmc19uYW1lX2NhY2hlLCBTTEFCX05PRlMpOwogCQlpZiAodWNzKSB7CiAJCQlmb3IgKGkgPSBvID0gMDsgaSA8IGluc19sZW47IGkgKz0gd2NfbGVuKSB7CiAJCQkJd2NfbGVuID0gbmxzLT5jaGFyMnVuaShpbnMgKyBpLCBpbnNfbGVuIC0gaSwKZGlmZiAtLWdpdCBhL2ZzL250ZnMvdXNuanJubC5jIGIvZnMvbnRmcy91c25qcm5sLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc3NzMyNAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL250ZnMvdXNuanJubC5jCkBAIC0wLDAgKzEsODQgQEAKKy8qCisgKiB1c25qcm5sLmggLSBOVEZTIGtlcm5lbCB0cmFuc2FjdGlvbiBsb2cgKCRVc25Kcm5sKSBoYW5kbGluZy4gIFBhcnQgb2YgdGhlCisgKgkgICAgICAgTGludXgtTlRGUyBwcm9qZWN0LgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNSBBbnRvbiBBbHRhcGFybWFrb3YKKyAqCisgKiBUaGlzIHByb2dyYW0vaW5jbHVkZSBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgKiBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0vaW5jbHVkZSBmaWxlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQorICogdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eQorICogb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0gKGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGUgTGludXgtTlRGUworICogZGlzdHJpYnV0aW9uIGluIHRoZSBmaWxlIENPUFlJTkcpOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaWZkZWYgTlRGU19SVworCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKworI2luY2x1ZGUgImFvcHMuaCIKKyNpbmNsdWRlICJkZWJ1Zy5oIgorI2luY2x1ZGUgImVuZGlhbi5oIgorI2luY2x1ZGUgInRpbWUuaCIKKyNpbmNsdWRlICJ0eXBlcy5oIgorI2luY2x1ZGUgInVzbmpybmwuaCIKKyNpbmNsdWRlICJ2b2x1bWUuaCIKKworLyoqCisgKiBudGZzX3N0YW1wX3VzbmpybmwgLSBzdGFtcCB0aGUgdHJhbnNhY3Rpb24gbG9nICgkVXNuSnJubCkgb24gYW4gbnRmcyB2b2x1bWUKKyAqIEB2b2w6CW50ZnMgdm9sdW1lIG9uIHdoaWNoIHRvIHN0YW1wIHRoZSB0cmFuc2FjdGlvbiBsb2cKKyAqCisgKiBTdGFtcCB0aGUgdHJhbnNhY3Rpb24gbG9nICgkVXNuSnJubCkgb24gdGhlIG50ZnMgdm9sdW1lIEB2b2wgYW5kIHJldHVybgorICogVFJVRSBvbiBzdWNjZXNzIGFuZCBGQUxTRSBvbiBlcnJvci4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCB0aGUgdHJhbnNhY3Rpb24gbG9nIGhhcyBhbHJlYWR5IGJlZW4gbG9hZGVkIGFuZAorICogY29uc2lzdGVuY3kgY2hlY2tlZCBieSBhIGNhbGwgdG8gZnMvbnRmcy9zdXBlci5jOjpsb2FkX2FuZF9pbml0X3VzbmpybmwoKS4KKyAqLworQk9PTCBudGZzX3N0YW1wX3VzbmpybmwobnRmc192b2x1bWUgKnZvbCkKK3sKKwludGZzX2RlYnVnKCJFbnRlcmluZy4iKTsKKwlpZiAobGlrZWx5KCFOVm9sVXNuSnJubFN0YW1wZWQodm9sKSkpIHsKKwkJc2xlNjQgc3RhbXA7CisJCXN0cnVjdCBwYWdlICpwYWdlOworCQlVU05fSEVBREVSICp1aDsKKworCQlwYWdlID0gbnRmc19tYXBfcGFnZSh2b2wtPnVzbmpybmxfbWF4X2luby0+aV9tYXBwaW5nLCAwKTsKKwkJaWYgKElTX0VSUihwYWdlKSkgeworCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIHJlYWQgZnJvbSAiCisJCQkJCSIkVXNuSnJubC8kREFUQS8kTWF4IGF0dHJpYnV0ZS4iKTsKKwkJCXJldHVybiBGQUxTRTsKKwkJfQorCQl1aCA9IChVU05fSEVBREVSKilwYWdlX2FkZHJlc3MocGFnZSk7CisJCXN0YW1wID0gZ2V0X2N1cnJlbnRfbnRmc190aW1lKCk7CisJCW50ZnNfZGVidWcoIlN0YW1waW5nIHRyYW5zYWN0aW9uIGxvZyAoJFVzbkpybmwpOiBvbGQgIgorCQkJCSJqb3VybmFsX2lkIDB4JWxseCwgb2xkIGxvd2VzdF92YWxpZF91c24gIgorCQkJCSIweCVsbHgsIG5ldyBqb3VybmFsX2lkIDB4JWxseCwgbmV3ICIKKwkJCQkibG93ZXN0X3ZhbGlkX3VzbiAweCVsbHguIiwKKwkJCQkobG9uZyBsb25nKXNsZTY0X3RvX2NwdSh1aC0+am91cm5hbF9pZCksCisJCQkJKGxvbmcgbG9uZylzbGU2NF90b19jcHUodWgtPmxvd2VzdF92YWxpZF91c24pLAorCQkJCShsb25nIGxvbmcpc2xlNjRfdG9fY3B1KHN0YW1wKSwKKwkJCQlpX3NpemVfcmVhZCh2b2wtPnVzbmpybmxfal9pbm8pKTsKKwkJdWgtPmxvd2VzdF92YWxpZF91c24gPQorCQkJCWNwdV90b19zbGU2NChpX3NpemVfcmVhZCh2b2wtPnVzbmpybmxfal9pbm8pKTsKKwkJdWgtPmpvdXJuYWxfaWQgPSBzdGFtcDsKKwkJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CisJCXNldF9wYWdlX2RpcnR5KHBhZ2UpOworCQludGZzX3VubWFwX3BhZ2UocGFnZSk7CisJCS8qIFNldCB0aGUgZmxhZyBzbyB3ZSBkbyBub3QgaGF2ZSB0byBkbyBpdCBhZ2FpbiBvbiByZW1vdW50LiAqLworCQlOVm9sU2V0VXNuSnJubFN0YW1wZWQodm9sKTsKKwl9CisJbnRmc19kZWJ1ZygiRG9uZS4iKTsKKwlyZXR1cm4gVFJVRTsKK30KKworI2VuZGlmIC8qIE5URlNfUlcgKi8KZGlmZiAtLWdpdCBhL2ZzL250ZnMvdXNuanJubC5oIGIvZnMvbnRmcy91c25qcm5sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY5ODhiMAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL250ZnMvdXNuanJubC5oCkBAIC0wLDAgKzEsMjA1IEBACisvKgorICogdXNuanJubC5oIC0gRGVmaW5lcyBmb3IgTlRGUyBrZXJuZWwgdHJhbnNhY3Rpb24gbG9nICgkVXNuSnJubCkgaGFuZGxpbmcuCisgKgkgICAgICAgUGFydCBvZiB0aGUgTGludXgtTlRGUyBwcm9qZWN0LgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNSBBbnRvbiBBbHRhcGFybWFrb3YKKyAqCisgKiBUaGlzIHByb2dyYW0vaW5jbHVkZSBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgKiBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0vaW5jbHVkZSBmaWxlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQorICogdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eQorICogb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0gKGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGUgTGludXgtTlRGUworICogZGlzdHJpYnV0aW9uIGluIHRoZSBmaWxlIENPUFlJTkcpOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaWZuZGVmIF9MSU5VWF9OVEZTX1VTTkpSTkxfSAorI2RlZmluZSBfTElOVVhfTlRGU19VU05KUk5MX0gKKworI2lmZGVmIE5URlNfUlcKKworI2luY2x1ZGUgInR5cGVzLmgiCisjaW5jbHVkZSAiZW5kaWFuLmgiCisjaW5jbHVkZSAibGF5b3V0LmgiCisjaW5jbHVkZSAidm9sdW1lLmgiCisKKy8qCisgKiBUcmFuc2FjdGlvbiBsb2cgKCRVc25Kcm5sKSBvcmdhbml6YXRpb246CisgKgorICogVGhlIHRyYW5zYWN0aW9uIGxvZyByZWNvcmRzIHdoZW5ldmVyIGEgZmlsZSBpcyBtb2RpZmllZCBpbiBhbnkgd2F5LiAgU28gZm9yCisgKiBleGFtcGxlIGl0IHdpbGwgcmVjb3JkIHRoYXQgZmlsZSAiYmxhaCIgd2FzIHdyaXR0ZW4gdG8gYXQgYSBwYXJ0aWN1bGFyIHRpbWUKKyAqIGJ1dCBub3Qgd2hhdCB3YXMgd3JpdHRlbi4gIElmIHdpbGwgcmVjb3JkIHRoYXQgYSBmaWxlIHdhcyBkZWxldGVkIG9yCisgKiBjcmVhdGVkLCB0aGF0IGEgZmlsZSB3YXMgdHJ1bmNhdGVkLCBldGMuICBTZWUgYmVsb3cgZm9yIGFsbCB0aGUgcmVhc29uCisgKiBjb2RlcyB1c2VkLgorICoKKyAqIFRoZSB0cmFuc2FjdGlvbiBsb2cgaXMgaW4gdGhlICRFeHRlbmQgZGlyZWN0b3J5IHdoaWNoIGlzIGluIHRoZSByb290CisgKiBkaXJlY3Rvcnkgb2YgZWFjaCB2b2x1bWUuICBJZiBpdCBpcyBub3QgcHJlc2VudCBpdCBtZWFucyB0cmFuc2FjdGlvbgorICogbG9nZ2luZyBpcyBkaXNhYmxlZC4gIElmIGl0IGlzIHByZXNlbnQgaXQgbWVhbnMgdHJhbnNhY3Rpb24gbG9nZ2luZyBpcworICogZWl0aGVyIGVuYWJsZWQgb3IgaW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcgZGlzYWJsZWQgaW4gd2hpY2ggY2FzZSB3ZSBjYW4KKyAqIGlnbm9yZSBpdCBhcyBpdCB3aWxsIGdvIGF3YXkgYXMgc29vbiBhcyBXaW5kb3dzIGdldHMgaXRzIGhhbmRzIG9uIGl0LgorICoKKyAqIFRvIGRldGVybWluZSB3aGV0aGVyIHRoZSB0cmFuc2FjdGlvbiBsb2dnaW5nIGlzIGVuYWJsZWQgb3IgaW4gdGhlIHByb2Nlc3MKKyAqIG9mIGJlaW5nIGRpc2FibGVkLCBuZWVkIHRvIGNoZWNrIHRoZSB2b2x1bWUgZmxhZ3MgaW4gdGhlCisgKiAkVk9MVU1FX0lORk9STUFUSU9OIGF0dHJpYnV0ZSBpbiB0aGUgJFZvbHVtZSBzeXN0ZW0gZmlsZSAod2hpY2ggaXMgcHJlc2VudAorICogaW4gdGhlIHJvb3QgZGlyZWN0b3J5IGFuZCBoYXMgYSBmaXhlZCBtZnQgcmVjb3JkIG51bWJlciwgc2VlIGxheW91dC5oKS4KKyAqIElmIHRoZSBmbGFnIFZPTFVNRV9ERUxFVEVfVVNOX1VOREVSV0FZIGlzIHNldCBpdCBtZWFucyB0aGUgdHJhbnNhY3Rpb24gbG9nCisgKiBpcyBpbiB0aGUgcHJvY2VzcyBvZiBiZWluZyBkaXNhYmxlZCBhbmQgaWYgdGhpcyBmbGFnIGlzIGNsZWFyIGl0IG1lYW5zIHRoZQorICogdHJhbnNhY3Rpb24gbG9nIGlzIGVuYWJsZWQuCisgKgorICogVGhlIHRyYW5zYWN0aW9uIGxvZyBjb25zaXN0cyBvZiB0d28gcGFydHM7IHRoZSAkREFUQS8kTWF4IGF0dHJpYnV0ZSBhcyB3ZWxsCisgKiBhcyB0aGUgJERBVEEvJEogYXR0cmlidXRlLiAgJE1heCBpcyBhIGhlYWRlciBkZXNjcmliaW5nIHRoZSB0cmFuc2FjdGlvbgorICogbG9nIHdoaWxzdCAkSiBpcyB0aGUgdHJhbnNhY3Rpb24gbG9nIGRhdGEgaXRzZWxmIGFzIGEgc2VxdWVuY2Ugb2YgdmFyaWFibGUKKyAqIHNpemVkIFVTTl9SRUNPUkRzIChzZWUgYmVsb3cgZm9yIGFsbCB0aGUgc3RydWN0dXJlcykuCisgKgorICogV2UgZG8gbm90IGNhcmUgYWJvdXQgdHJhbnNhY3Rpb24gbG9nZ2luZyBhdCB0aGlzIHBvaW50IGluIHRpbWUgYnV0IHdlIHN0aWxsCisgKiBuZWVkIHRvIGxldCB3aW5kb3dzIGtub3cgdGhhdCB0aGUgdHJhbnNhY3Rpb24gbG9nIGlzIG91dCBvZiBkYXRlLiAgVG8gZG8KKyAqIHRoaXMgd2UgbmVlZCB0byBzdGFtcCB0aGUgdHJhbnNhY3Rpb24gbG9nLiAgVGhpcyBpbnZvbHZlcyBzZXR0aW5nIHRoZQorICogbG93ZXN0X3ZhbGlkX3VzbiBmaWVsZCBpbiB0aGUgJERBVEEvJE1heCBhdHRyaWJ1dGUgdG8gdGhlIHVzbiB0byBiZSB1c2VkCisgKiBmb3IgdGhlIG5leHQgYWRkZWQgVVNOX1JFQ09SRCB0byB0aGUgJERBVEEvJEogYXR0cmlidXRlIGFzIHdlbGwgYXMKKyAqIGdlbmVyYXRpbmcgYSBuZXcgam91cm5hbF9pZCBpbiAkREFUQS8kTWF4LgorICoKKyAqIFRoZSBqb3VybmFsX2lkIGlzIGFzIG9mIHRoZSBjdXJyZW50IHZlcnNpb24gKDIuMCkgb2YgdGhlIHRyYW5zYWN0aW9uIGxvZworICogc2ltcGx5IHRoZSA2NC1iaXQgdGltZXN0YW1wIG9mIHdoZW4gdGhlIGpvdXJuYWwgd2FzIGVpdGhlciBjcmVhdGVkIG9yIGxhc3QKKyAqIHN0YW1wZWQuCisgKgorICogVG8gZGV0ZXJtaW5lIHRoZSBuZXh0IHVzbiB0aGVyZSBhcmUgdHdvIHdheXMuICBUaGUgZmlyc3QgaXMgdG8gcGFyc2UKKyAqICREQVRBLyRKIGFuZCB0byBmaW5kIHRoZSBsYXN0IFVTTl9SRUNPUkQgaW4gaXQgYW5kIHRvIGFkZCBpdHMgcmVjb3JkX2xlbmd0aAorICogdG8gaXRzIHVzbiAod2hpY2ggaXMgdGhlIGJ5dGUgb2Zmc2V0IGluIHRoZSAkREFUQS8kSiBhdHRyaWJ1dGUpLiAgVGhlCisgKiBzZWNvbmQgaXMgc2ltcGx5IHRvIHRha2UgdGhlIGRhdGEgc2l6ZSBvZiB0aGUgYXR0cmlidXRlLiAgU2luY2UgdGhlIHVzbnMKKyAqIGFyZSBzaW1wbHkgYnl0ZSBvZmZzZXRzIGludG8gJERBVEEvJEosIHRoaXMgaXMgZXhhY3RseSB0aGUgbmV4dCB1c24uICBGb3IKKyAqIG9idmlvdXMgcmVhc29ucyB3ZSB1c2UgdGhlIHNlY29uZCBtZXRob2QgYXMgaXQgaXMgbXVjaCBzaW1wbGVyIGFuZCBmYXN0ZXIuCisgKgorICogQXMgYW4gYXNpZGUsIG5vdGUgdGhhdCB0byBhY3R1YWxseSBkaXNhYmxlIHRoZSB0cmFuc2FjdGlvbiBsb2csIG9uZSB3b3VsZAorICogbmVlZCB0byBzZXQgdGhlIFZPTFVNRV9ERUxFVEVfVVNOX1VOREVSV0FZIGZsYWcgKHNlZSBhYm92ZSksIHRoZW4gZ28KKyAqIHRocm91Z2ggYWxsIHRoZSBtZnQgcmVjb3JkcyBvbiB0aGUgdm9sdW1lIGFuZCBzZXQgdGhlIHVzbiBmaWVsZCBpbiB0aGVpcgorICogJFNUQU5EQVJEX0lORk9STUFUSU9OIGF0dHJpYnV0ZSB0byB6ZXJvLiAgT25jZSB0aGF0IGlzIGRvbmUsIG9uZSB3b3VsZCBuZWVkCisgKiB0byBkZWxldGUgdGhlIHRyYW5zYWN0aW9uIGxvZyBmaWxlLCBpLmUuIFwkRXh0ZW50XCRVc25Kcm5sLCBhbmQgZmluYWxseSwKKyAqIG9uZSB3b3VsZCBuZWVkIHRvIGNsZWFyIHRoZSBWT0xVTUVfREVMRVRFX1VTTl9VTkRFUldBWSBmbGFnLgorICoKKyAqIE5vdGUgdGhhdCBpZiBhIHZvbHVtZSBpcyB1bm1vdW50ZWQgd2hpbHN0IHRoZSB0cmFuc2FjdGlvbiBsb2cgaXMgYmVpbmcKKyAqIGRpc2FibGVkLCB0aGUgcHJvY2VzcyB3aWxsIGNvbnRpbnVlIHRoZSBuZXh0IHRpbWUgdGhlIHZvbHVtZSBpcyBtb3VudGVkLgorICogVGhpcyBpcyB3aHkgd2UgY2FuIHNhZmVseSBtb3VudCByZWFkLXdyaXRlIHdoZW4gd2Ugc2VlIGEgdHJhbnNhY3Rpb24gbG9nCisgKiBpbiB0aGUgcHJvY2VzcyBvZiBiZWluZyBkZWxldGVkLgorICovCisKKy8qIFNvbWUgJFVzbkpybmwgcmVsYXRlZCBjb25zdGFudHMuICovCisjZGVmaW5lIFVzbkpybmxNYWpvclZlcgkJMgorI2RlZmluZSBVc25Kcm5sTWlub3JWZXIJCTAKKworLyoKKyAqICREQVRBLyRNYXggYXR0cmlidXRlLiAgVGhpcyBpcyAoYWx3YXlzPykgcmVzaWRlbnQgYW5kIGhhcyBhIGZpeGVkIHNpemUgb2YKKyAqIDMyIGJ5dGVzLiAgSXQgY29udGFpbnMgdGhlIGhlYWRlciBkZXNjcmliaW5nIHRoZSB0cmFuc2FjdGlvbiBsb2cuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKy8qT2ZzKi8KKy8qICAgMCovc2xlNjQgbWF4aW11bV9zaXplOwkvKiBUaGUgbWF4aW11bSBvbi1kaXNrIHNpemUgb2YgdGhlICREQVRBLyRKCisJCQkJICAgYXR0cmlidXRlLiAqLworLyogICA4Ki9zbGU2NCBhbGxvY2F0aW9uX2RlbHRhOwkvKiBOdW1iZXIgb2YgYnl0ZXMgYnkgd2hpY2ggdG8gaW5jcmVhc2UgdGhlCisJCQkJICAgc2l6ZSBvZiB0aGUgJERBVEEvJEogYXR0cmlidXRlLiAqLworLyoweDEwKi9zbGU2NCBqb3VybmFsX2lkOwkvKiBDdXJyZW50IGlkIG9mIHRoZSB0cmFuc2FjdGlvbiBsb2cuICovCisvKjB4MTgqL2xlVVNOIGxvd2VzdF92YWxpZF91c247CS8qIExvd2VzdCB2YWxpZCB1c24gaW4gJERBVEEvJEogZm9yIHRoZQorCQkJCSAgIGN1cnJlbnQgam91cm5hbF9pZC4gKi8KKy8qIHNpemVvZigpID0gMzIgKDB4MjApIGJ5dGVzICovCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgVVNOX0hFQURFUjsKKworLyoKKyAqIFJlYXNvbiBmbGFncyAoMzItYml0KS4gIEN1bXVsYXRpdmUgZmxhZ3MgZGVzY3JpYmluZyB0aGUgY2hhbmdlKHMpIHRvIHRoZQorICogZmlsZSBzaW5jZSBpdCB3YXMgbGFzdCBvcGVuZWQuICBJIHRoaW5rIHRoZSBuYW1lcyBzcGVhayBmb3IgdGhlbXNlbHZlcyBidXQKKyAqIGlmIHlvdSBkaXNhZ3JlZSBjaGVjayBvdXQgdGhlIGRlc2NyaXB0aW9ucyBpbiB0aGUgTGludXggTlRGUyBwcm9qZWN0IE5URlMKKyAqIGRvY3VtZW50YXRpb246IGh0dHA6Ly9saW51eC1udGZzLnNvdXJjZWZvcmdlLm5ldC9udGZzL2ZpbGVzL3VzbmpybmwuaHRtbAorICovCitlbnVtIHsKKwlVU05fUkVBU09OX0RBVEFfT1ZFUldSSVRFCT0gY29uc3RfY3B1X3RvX2xlMzIoMHgwMDAwMDAwMSksCisJVVNOX1JFQVNPTl9EQVRBX0VYVEVORAkJPSBjb25zdF9jcHVfdG9fbGUzMigweDAwMDAwMDAyKSwKKwlVU05fUkVBU09OX0RBVEFfVFJVTkNBVElPTgk9IGNvbnN0X2NwdV90b19sZTMyKDB4MDAwMDAwMDQpLAorCVVTTl9SRUFTT05fTkFNRURfREFUQV9PVkVSV1JJVEUJPSBjb25zdF9jcHVfdG9fbGUzMigweDAwMDAwMDEwKSwKKwlVU05fUkVBU09OX05BTUVEX0RBVEFfRVhURU5ECT0gY29uc3RfY3B1X3RvX2xlMzIoMHgwMDAwMDAyMCksCisJVVNOX1JFQVNPTl9OQU1FRF9EQVRBX1RSVU5DQVRJT049IGNvbnN0X2NwdV90b19sZTMyKDB4MDAwMDAwNDApLAorCVVTTl9SRUFTT05fRklMRV9DUkVBVEUJCT0gY29uc3RfY3B1X3RvX2xlMzIoMHgwMDAwMDEwMCksCisJVVNOX1JFQVNPTl9GSUxFX0RFTEVURQkJPSBjb25zdF9jcHVfdG9fbGUzMigweDAwMDAwMjAwKSwKKwlVU05fUkVBU09OX0VBX0NIQU5HRQkJPSBjb25zdF9jcHVfdG9fbGUzMigweDAwMDAwNDAwKSwKKwlVU05fUkVBU09OX1NFQ1VSSVRZX0NIQU5HRQk9IGNvbnN0X2NwdV90b19sZTMyKDB4MDAwMDA4MDApLAorCVVTTl9SRUFTT05fUkVOQU1FX09MRF9OQU1FCT0gY29uc3RfY3B1X3RvX2xlMzIoMHgwMDAwMTAwMCksCisJVVNOX1JFQVNPTl9SRU5BTUVfTkVXX05BTUUJPSBjb25zdF9jcHVfdG9fbGUzMigweDAwMDAyMDAwKSwKKwlVU05fUkVBU09OX0lOREVYQUJMRV9DSEFOR0UJPSBjb25zdF9jcHVfdG9fbGUzMigweDAwMDA0MDAwKSwKKwlVU05fUkVBU09OX0JBU0lDX0lORk9fQ0hBTkdFCT0gY29uc3RfY3B1X3RvX2xlMzIoMHgwMDAwODAwMCksCisJVVNOX1JFQVNPTl9IQVJEX0xJTktfQ0hBTkdFCT0gY29uc3RfY3B1X3RvX2xlMzIoMHgwMDAxMDAwMCksCisJVVNOX1JFQVNPTl9DT01QUkVTU0lPTl9DSEFOR0UJPSBjb25zdF9jcHVfdG9fbGUzMigweDAwMDIwMDAwKSwKKwlVU05fUkVBU09OX0VOQ1JZUFRJT05fQ0hBTkdFCT0gY29uc3RfY3B1X3RvX2xlMzIoMHgwMDA0MDAwMCksCisJVVNOX1JFQVNPTl9PQkpFQ1RfSURfQ0hBTkdFCT0gY29uc3RfY3B1X3RvX2xlMzIoMHgwMDA4MDAwMCksCisJVVNOX1JFQVNPTl9SRVBBUlNFX1BPSU5UX0NIQU5HRQk9IGNvbnN0X2NwdV90b19sZTMyKDB4MDAxMDAwMDApLAorCVVTTl9SRUFTT05fU1RSRUFNX0NIQU5HRQk9IGNvbnN0X2NwdV90b19sZTMyKDB4MDAyMDAwMDApLAorCVVTTl9SRUFTT05fQ0xPU0UJCT0gY29uc3RfY3B1X3RvX2xlMzIoMHg4MDAwMDAwMCksCit9OworCit0eXBlZGVmIGxlMzIgVVNOX1JFQVNPTl9GTEFHUzsKKworLyoKKyAqIFNvdXJjZSBpbmZvIGZsYWdzICgzMi1iaXQpLiAgSW5mb3JtYXRpb24gYWJvdXQgdGhlIHNvdXJjZSBvZiB0aGUgY2hhbmdlKHMpCisgKiB0byB0aGUgZmlsZS4gIEZvciBkZXRhaWxlZCBkZXNjcmlwdGlvbnMgb2Ygd2hhdCB0aGVzZSBtZWFuLCBzZWUgdGhlIExpbnV4CisgKiBOVEZTIHByb2plY3QgTlRGUyBkb2N1bWVudGF0aW9uOgorICoJaHR0cDovL2xpbnV4LW50ZnMuc291cmNlZm9yZ2UubmV0L250ZnMvZmlsZXMvdXNuanJubC5odG1sCisgKi8KK2VudW0geworCVVTTl9TT1VSQ0VfREFUQV9NQU5BR0VNRU5UCSAgPSBjb25zdF9jcHVfdG9fbGUzMigweDAwMDAwMDAxKSwKKwlVU05fU09VUkNFX0FVWElMSUFSWV9EQVRBCSAgPSBjb25zdF9jcHVfdG9fbGUzMigweDAwMDAwMDAyKSwKKwlVU05fU09VUkNFX1JFUExJQ0FUSU9OX01BTkFHRU1FTlQgPSBjb25zdF9jcHVfdG9fbGUzMigweDAwMDAwMDA0KSwKK307CisKK3R5cGVkZWYgbGUzMiBVU05fU09VUkNFX0lORk9fRkxBR1M7CisKKy8qCisgKiAkREFUQS8kSiBhdHRyaWJ1dGUuICBUaGlzIGlzIGFsd2F5cyBub24tcmVzaWRlbnQsIGlzIG1hcmtlZCBhcyBzcGFyc2UsIGFuZAorICogaXMgb2YgdmFyaWFibGVkIHNpemUuICBJdCBjb25zaXN0cyBvZiBhIHNlcXVlbmNlIG9mIHZhcmlhYmxlIHNpemUKKyAqIFVTTl9SRUNPUkRTLiAgVGhlIG1pbmltdW0gYWxsb2NhdGVkX3NpemUgaXMgYWxsb2NhdGlvbl9kZWx0YSBhcworICogc3BlY2lmaWVkIGluICREQVRBLyRNYXguICBXaGVuIHRoZSBtYXhpbXVtX3NpemUgc3BlY2lmaWVkIGluICREQVRBLyRNYXggaXMKKyAqIGV4Y2VlZGVkIGJ5IG1vcmUgdGhhbiBhbGxvY2F0aW9uX2RlbHRhIGJ5dGVzLCBhbGxvY2F0aW9uX2RlbHRhIGJ5dGVzIGFyZQorICogYWxsb2NhdGVkIGFuZCBhcHBlbmRlZCB0byB0aGUgJERBVEEvJEogYXR0cmlidXRlIGFuZCBhbiBlcXVhbCBudW1iZXIgb2YKKyAqIGJ5dGVzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGF0dHJpYnV0ZSBhcmUgZnJlZWQgYW5kIG1hZGUgc3BhcnNlLiAgTm90ZSB0aGUKKyAqIG1ha2luZyBzcGFyc2Ugb25seSBoYXBwZW5zIGF0IHZvbHVtZSBjaGVja3BvaW50cyBhbmQgaGVuY2UgdGhlIGFjdHVhbAorICogJERBVEEvJEogc2l6ZSBjYW4gZXhjZWVkIG1heGltdW1fc2l6ZSArIGFsbG9jYXRpb25fZGVsdGEgdGVtcG9yYXJpbHkuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKy8qT2ZzKi8KKy8qICAgMCovbGUzMiBsZW5ndGg7CQkvKiBCeXRlIHNpemUgb2YgdGhpcyByZWNvcmQgKDgtYnl0ZQorCQkJCSAgIGFsaWduZWQpLiAqLworLyogICA0Ki9sZTE2IG1ham9yX3ZlcjsJCS8qIE1ham9yIHZlcnNpb24gb2YgdGhlIHRyYW5zYWN0aW9uIGxvZyB1c2VkCisJCQkJICAgZm9yIHRoaXMgcmVjb3JkLiAqLworLyogICA2Ki9sZTE2IG1pbm9yX3ZlcjsJCS8qIE1pbm9yIHZlcnNpb24gb2YgdGhlIHRyYW5zYWN0aW9uIGxvZyB1c2VkCisJCQkJICAgZm9yIHRoaXMgcmVjb3JkLiAqLworLyogICA4Ki9sZU1GVF9SRUYgbWZ0X3JlZmVyZW5jZTsvKiBUaGUgbWZ0IHJlZmVyZW5jZSBvZiB0aGUgZmlsZSAob3IKKwkJCQkgICBkaXJlY3RvcnkpIGRlc2NyaWJlZCBieSB0aGlzIHJlY29yZC4gKi8KKy8qMHgxMCovbGVNRlRfUkVGIHBhcmVudF9kaXJlY3Rvcnk7LyogVGhlIG1mdCByZWZlcmVuY2Ugb2YgdGhlIHBhcmVudAorCQkJCSAgIGRpcmVjdG9yeSBvZiB0aGUgZmlsZSBkZXNjcmliZWQgYnkgdGhpcworCQkJCSAgIHJlY29yZC4gKi8KKy8qMHgxOCovbGVVU04gdXNuOwkJLyogVGhlIHVzbiBvZiB0aGlzIHJlY29yZC4gIEVxdWFscyB0aGUgb2Zmc2V0CisJCQkJICAgd2l0aGluIHRoZSAkREFUQS8kSiBhdHRyaWJ1dGUuICovCisvKjB4MjAqL3NsZTY0IHRpbWU7CQkvKiBUaW1lIHdoZW4gdGhpcyByZWNvcmQgd2FzIGNyZWF0ZWQuICovCisvKjB4MjgqL1VTTl9SRUFTT05fRkxBR1MgcmVhc29uOy8qIFJlYXNvbiBmbGFncyAoc2VlIGFib3ZlKS4gKi8KKy8qMHgyYyovVVNOX1NPVVJDRV9JTkZPX0ZMQUdTIHNvdXJjZV9pbmZvOy8qIFNvdXJjZSBpbmZvIGZsYWdzIChzZWUgYWJvdmUpLiAqLworLyoweDMwKi9sZTMyIHNlY3VyaXR5X2lkOwkvKiBGaWxlIHNlY3VyaXR5X2lkIGNvcGllZCBmcm9tCisJCQkJICAgJFNUQU5EQVJEX0lORk9STUFUSU9OLiAqLworLyoweDM0Ki9GSUxFX0FUVFJfRkxBR1MgZmlsZV9hdHRyaWJ1dGVzOwkvKiBGaWxlIGF0dHJpYnV0ZXMgY29waWVkIGZyb20KKwkJCQkgICAkU1RBTkRBUkRfSU5GT1JNQVRJT04gb3IgJEZJTEVfTkFNRSAobm90CisJCQkJICAgc3VyZSB3aGljaCkuICovCisvKjB4MzgqL2xlMTYgZmlsZV9uYW1lX3NpemU7CS8qIFNpemUgb2YgdGhlIGZpbGUgbmFtZSBpbiBieXRlcy4gKi8KKy8qMHgzYSovbGUxNiBmaWxlX25hbWVfb2Zmc2V0OwkvKiBPZmZzZXQgdG8gdGhlIGZpbGUgbmFtZSBpbiBieXRlcyBmcm9tIHRoZQorCQkJCSAgIHN0YXJ0IG9mIHRoaXMgcmVjb3JkLiAqLworLyoweDNjKi9udGZzY2hhciBmaWxlX25hbWVbMF07CS8qIFVzZSB3aGVuIGNyZWF0aW5nIG9ubHkuICBXaGVuIHJlYWRpbmcgdXNlCisJCQkJICAgZmlsZV9uYW1lX29mZnNldCB0byBkZXRlcm1pbmUgdGhlIGxvY2F0aW9uCisJCQkJICAgb2YgdGhlIG5hbWUuICovCisvKiBzaXplb2YoKSA9IDYwICgweDNjKSBieXRlcyAqLworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpIFVTTl9SRUNPUkQ7CisKK2V4dGVybiBCT09MIG50ZnNfc3RhbXBfdXNuanJubChudGZzX3ZvbHVtZSAqdm9sKTsKKworI2VuZGlmIC8qIE5URlNfUlcgKi8KKworI2VuZGlmIC8qIF9MSU5VWF9OVEZTX1VTTkpSTkxfSCAqLwpkaWZmIC0tZ2l0IGEvZnMvbnRmcy92b2x1bWUuaCBiL2ZzL250ZnMvdm9sdW1lLmgKaW5kZXggNGI5N2ZhOC4uMzc1Y2QyMCAxMDA2NDQKLS0tIGEvZnMvbnRmcy92b2x1bWUuaAorKysgYi9mcy9udGZzL3ZvbHVtZS5oCkBAIC0yLDcgKzIsNyBAQAogICogdm9sdW1lLmggLSBEZWZpbmVzIGZvciB2b2x1bWUgc3RydWN0dXJlcyBpbiBOVEZTIExpbnV4IGtlcm5lbCBkcml2ZXIuIFBhcnQKICAqCSAgICAgIG9mIHRoZSBMaW51eC1OVEZTIHByb2plY3QuCiAgKgotICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDQgQW50b24gQWx0YXBhcm1ha292CisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNSBBbnRvbiBBbHRhcGFybWFrb3YKICAqIENvcHlyaWdodCAoYykgMjAwMiBSaWNoYXJkIFJ1c3NvbgogICoKICAqIFRoaXMgcHJvZ3JhbS9pbmNsdWRlIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCkBAIC01NCw3ICs1NCw3IEBACiAJbW9kZV90IGRtYXNrOwkJCS8qIFRoZSBtYXNrIGZvciBkaXJlY3RvcnkKIAkJCQkJICAgcGVybWlzc2lvbnMuICovCiAJdTggbWZ0X3pvbmVfbXVsdGlwbGllcjsJCS8qIEluaXRpYWwgbWZ0IHpvbmUgbXVsdGlwbGllci4gKi8KLQl1OCBvbl9lcnJvcnM7CQkJLyogV2hhdCB0byBkbyBvbiBmaWxlIHN5c3RlbSBlcnJvcnMuICovCisJdTggb25fZXJyb3JzOwkJCS8qIFdoYXQgdG8gZG8gb24gZmlsZXN5c3RlbSBlcnJvcnMuICovCiAJLyogTlRGUyBib290c2VjdG9yIHByb3ZpZGVkIGluZm9ybWF0aW9uLiAqLwogCXUxNiBzZWN0b3Jfc2l6ZTsJCS8qIGluIGJ5dGVzICovCiAJdTggc2VjdG9yX3NpemVfYml0czsJCS8qIGxvZzIoc2VjdG9yX3NpemUpICovCkBAIC0xMjUsNiArMTI1LDEwIEBACiAJLyogJFF1b3RhIHN0dWZmIGlzIE5URlMzLjArIHNwZWNpZmljLiAgVW51c2VkL05VTEwgb3RoZXJ3aXNlLiAqLwogCXN0cnVjdCBpbm9kZSAqcXVvdGFfaW5vOwkvKiBUaGUgVkZTIGlub2RlIG9mICRRdW90YS4gKi8KIAlzdHJ1Y3QgaW5vZGUgKnF1b3RhX3FfaW5vOwkvKiBBdHRyaWJ1dGUgaW5vZGUgZm9yICRRdW90YS8kUS4gKi8KKwkvKiAkVXNuSnJubCBzdHVmZiBpcyBOVEZTMy4wKyBzcGVjaWZpYy4gIFVudXNlZC9OVUxMIG90aGVyd2lzZS4gKi8KKwlzdHJ1Y3QgaW5vZGUgKnVzbmpybmxfaW5vOwkvKiBUaGUgVkZTIGlub2RlIG9mICRVc25Kcm5sLiAqLworCXN0cnVjdCBpbm9kZSAqdXNuanJubF9tYXhfaW5vOwkvKiBBdHRyaWJ1dGUgaW5vZGUgZm9yICRVc25Kcm5sLyRNYXguICovCisJc3RydWN0IGlub2RlICp1c25qcm5sX2pfaW5vOwkvKiBBdHRyaWJ1dGUgaW5vZGUgZm9yICRVc25Kcm5sLyRKLiAqLwogI2VuZGlmIC8qIE5URlNfUlcgKi8KIAlzdHJ1Y3QgbmxzX3RhYmxlICpubHNfbWFwOwogfSBudGZzX3ZvbHVtZTsKQEAgLTE0MSw2ICsxNDUsOCBAQAogCQkJCSAgICAgIGZpbGUgbmFtZXMgaW4gV0lOMzIgbmFtZXNwYWNlLiAqLwogCU5WX0xvZ0ZpbGVFbXB0eSwJLyogMTogJExvZ0ZpbGUgam91cm5hbCBpcyBlbXB0eS4gKi8KIAlOVl9RdW90YU91dE9mRGF0ZSwJLyogMTogJFF1b3RhIGlzIG91dCBvZiBkYXRlLiAqLworCU5WX1VzbkpybmxTdGFtcGVkLAkvKiAxOiAkVXNuSnJubCBoYXMgYmVlbiBzdGFtcGVkLiAqLworCU5WX1NwYXJzZUVuYWJsZWQsCS8qIDE6IE1heSBjcmVhdGUgc3BhcnNlIGZpbGVzLiAqLwogfSBudGZzX3ZvbHVtZV9mbGFnczsKIAogLyoKQEAgLTE2Nyw1ICsxNzMsNyBAQAogTlZPTF9GTlMoQ2FzZVNlbnNpdGl2ZSkKIE5WT0xfRk5TKExvZ0ZpbGVFbXB0eSkKIE5WT0xfRk5TKFF1b3RhT3V0T2ZEYXRlKQorTlZPTF9GTlMoVXNuSnJubFN0YW1wZWQpCitOVk9MX0ZOUyhTcGFyc2VFbmFibGVkKQogCiAjZW5kaWYgLyogX0xJTlVYX05URlNfVk9MVU1FX0ggKi8K