ZGlmZiAtLWdpdCBhL2JvYXJkL2lubm9rb20vTWFrZWZpbGUgYi9ib2FyZC9pbm5va29tL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmYmU3NmIKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9pbm5va29tL01ha2VmaWxlCkBAIC0wLDAgKzEsNDcgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDAwCisjIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisjCisjIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisjIHByb2plY3QuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCisjCisKK2luY2x1ZGUgJChUT1BESVIpL2NvbmZpZy5taworCitMSUIJPSBsaWIkKEJPQVJEKS5hCisKK09CSlMJOj0gaW5ub2tvbS5vIGZsYXNoLm8KK1NPQkpTCTo9IG1lbXNldHVwLm8KKworJChMSUIpOgkkKE9CSlMpICQoU09CSlMpCisJJChBUikgY3J2ICRAICReCisKK2NsZWFuOgorCXJtIC1mICQoU09CSlMpICQoT0JKUykKKworZGlzdGNsZWFuOgljbGVhbgorCXJtIC1mICQoTElCKSBjb3JlICouYmFrIC5kZXBlbmQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisuZGVwZW5kOglNYWtlZmlsZSAkKFNPQkpTOi5vPS5TKSAkKE9CSlM6Lm89LmMpCisJCSQoQ0MpIC1NICQoQ1BQRkxBR1MpICQoU09CSlM6Lm89LlMpICQoT0JKUzoubz0uYykgPiAkQAorCistaW5jbHVkZSAuZGVwZW5kCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2JvYXJkL2lubm9rb20vY29uZmlnLm1rIGIvYm9hcmQvaW5ub2tvbS9jb25maWcubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM5ZmZmZgotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL2lubm9rb20vY29uZmlnLm1rCkBAIC0wLDAgKzEsMTYgQEAKKyMKKyMgTGludXgtS2VybmVsIGlzIGV4cGVjdGVkIHRvIGJlIGF0IGMwMDAnODAwMCwgZW50cnkgYzAwMCc4MDAwCisjCisjIHdlIGxvYWQgb3Vyc2VsZiB0byBjMTcwJzAwMDAsIHRoZSB1cHBlciAxIE1CIG9mIHNlY29uZCBiYW5rCisjCisjIGRvd25sb2FkIGFyZWFzIGlzIGM4MDAnMDAwMAorIworCisjIFRoaXMgaXMgdGhlIGFkZHJlc3Mgd2hlcmUgVS1Cb290IGxpdmVzIGluIGZsYXNoOgorI1RFWFRfQkFTRSA9IDAKKworIyBGSVhNRTogYXJtYm9vdCBkb2VzIG9ubHkgd29yayBjb3JyZWN0bHkgd2hlbiBiZWluZyBjb21waWxlZAorIyBmb3IgdGhlIGFkZHJlc3NlcyBfYWZ0ZXJfIHJlbG9jYXRpb24gdG8gUkFNISEgT3RoZXJ3aGlzZSB0aGUKKyMgLmJzcyBzZWdtZW50IGlzIGFzc3VtZWQgaW4gZmxhc2guLi4KK1RFWFRfQkFTRSA9IDB4YTFmZTAwMDAKKwpkaWZmIC0tZ2l0IGEvYm9hcmQvaW5ub2tvbS9mbGFzaC5jIGIvYm9hcmQvaW5ub2tvbS9mbGFzaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4ZTk3ZTEKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9pbm5va29tL2ZsYXNoLmMKQEAgLTAsMCArMSwzNzcgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDIKKyAqIEt5bGUgSGFycmlzLCBOZXh1cyBUZWNobm9sb2dpZXMsIEluYy4ga2hhcnJpc0BuZXh1cy10ZWNoLm5ldAorICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogU3lzZ28gUmVhbC1UaW1lIFNvbHV0aW9ucywgR21iSCA8d3d3LmVsaW5vcy5jb20+CisgKiBNYXJpdXMgR3JvZWdlciA8bWdyb2VnZXJAc3lzZ28uZGU+CisgKgorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBSb2JlcnQgU2Nod2ViZWwsIFBlbmd1dHJvbml4LCA8ci5zY2h3ZWJlbEBwZW5ndXRyb25peC5kZT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvcHhhLXJlZ3MuaD4KKworI2RlZmluZSBGTEFTSF9CQU5LX1NJWkUgMHgwMjAwMDAwMAorI2RlZmluZSBNQUlOX1NFQ1RfU0laRSAgMHg0MDAwMCAgICAgICAgIC8qIDJ4MTYgPSAyNTZrIHBlciBzZWN0b3IgKi8KKworZmxhc2hfaW5mb190ICAgIGZsYXNoX2luZm9bQ0ZHX01BWF9GTEFTSF9CQU5LU107CisKKworLyoqCisgKiBmbGFzaF9pbml0OiAtIGluaXRpYWxpemUgZGF0YSBzdHJ1Y3R1cmVzIGZvciBmbGFzaCBjaGlwcworICoKKyAqIEByZXR1cm46IHNpemUgb2YgdGhlIGZsYXNoCisgKi8KKwordWxvbmcgZmxhc2hfaW5pdCh2b2lkKQoreworCWludCBpLCBqOworCXVsb25nIHNpemUgPSAwOworCisJZm9yIChpID0gMDsgaSA8IENGR19NQVhfRkxBU0hfQkFOS1M7IGkrKykgeworCQl1bG9uZyBmbGFzaGJhc2UgPSAwOworCQlmbGFzaF9pbmZvW2ldLmZsYXNoX2lkID0KKwkgIAkJKElOVEVMX01BTlVGQUNUICYgRkxBU0hfVkVORE1BU0spIHwKKwkgIAkJKElOVEVMX0lEXzI4RjEyOEozICYgRkxBU0hfVFlQRU1BU0spOworCQlmbGFzaF9pbmZvW2ldLnNpemUgPSBGTEFTSF9CQU5LX1NJWkU7CisJCWZsYXNoX2luZm9baV0uc2VjdG9yX2NvdW50ID0gQ0ZHX01BWF9GTEFTSF9TRUNUOworCQltZW1zZXQoZmxhc2hfaW5mb1tpXS5wcm90ZWN0LCAwLCBDRkdfTUFYX0ZMQVNIX1NFQ1QpOworCisJCXN3aXRjaCAoaSkgeworCQkJY2FzZSAwOgorCQkJCWZsYXNoYmFzZSA9IFBIWVNfRkxBU0hfMTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJcGFuaWMoImNvbmZpZ3VyZWQgdG8gbWFueSBmbGFzaCBiYW5rcyFcbiIpOworCQkJCWJyZWFrOworCQl9CisJCWZvciAoaiA9IDA7IGogPCBmbGFzaF9pbmZvW2ldLnNlY3Rvcl9jb3VudDsgaisrKSB7CisJCQlmbGFzaF9pbmZvW2ldLnN0YXJ0W2pdID0gZmxhc2hiYXNlICsgaipNQUlOX1NFQ1RfU0laRTsKKwkJfQorCQlzaXplICs9IGZsYXNoX2luZm9baV0uc2l6ZTsKKwl9CisKKwkvKiBQcm90ZWN0IG1vbml0b3IgYW5kIGVudmlyb25tZW50IHNlY3RvcnMgKi8KKwlmbGFzaF9wcm90ZWN0KEZMQUdfUFJPVEVDVF9TRVQsCisJCQlDRkdfRkxBU0hfQkFTRSwKKwkJCUNGR19GTEFTSF9CQVNFICsgX2FybWJvb3RfZW5kX2RhdGEgLSBfYXJtYm9vdF9zdGFydCwKKwkJCSZmbGFzaF9pbmZvWzBdKTsKKworI2lmZGVmIENGR19FTlZfSVNfSU5fRkxBU0gKKwlmbGFzaF9wcm90ZWN0KEZMQUdfUFJPVEVDVF9TRVQsCisJCQlDRkdfRU5WX0FERFIsCisJCQlDRkdfRU5WX0FERFIgKyBDRkdfRU5WX1NJWkUgLSAxLAorCQkJJmZsYXNoX2luZm9bMF0pOworI2VuZGlmCisKKwlyZXR1cm4gc2l6ZTsKK30KKworCisvKioKKyAqIGZsYXNoX3ByaW50X2luZm86IC0gcHJpbnQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGZsYXNoIHNpdHVhdGlvbgorICoKKyAqIEBwYXJhbSBpbmZvOgorICovCisKK3ZvaWQgZmxhc2hfcHJpbnRfaW5mbyAgKGZsYXNoX2luZm9fdCAqaW5mbykKK3sKKwlpbnQgaSwgajsKKworCWZvciAoaj0wOyBqPENGR19NQVhfRkxBU0hfQkFOS1M7IGorKykgeworCisJCXN3aXRjaCAoaW5mby0+Zmxhc2hfaWQgJiBGTEFTSF9WRU5ETUFTSykgeworCisJCQljYXNlIChJTlRFTF9NQU5VRkFDVCAmIEZMQVNIX1ZFTkRNQVNLKToKKwkJCQlwcmludGYoIkludGVsOiAiKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJcHJpbnRmKCJVbmtub3duIFZlbmRvciAiKTsKKwkJCQlicmVhazsKKwkJfQorCisJCXN3aXRjaCAoaW5mby0+Zmxhc2hfaWQgJiBGTEFTSF9UWVBFTUFTSykgeworCisJCQljYXNlIChJTlRFTF9JRF8yOEYxMjhKMyAmIEZMQVNIX1RZUEVNQVNLKToKKwkJCQlwcmludGYoIjI4RjEyOEozICgxMjhNYml0KVxuIik7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXByaW50ZigiVW5rbm93biBDaGlwIFR5cGVcbiIpOworCQkJCXJldHVybjsKKwkJfQorCisJCXByaW50ZigiICBTaXplOiAlbGQgTUIgaW4gJWQgU2VjdG9yc1xuIiwKKwkJCWluZm8tPnNpemUgPj4gMjAsIGluZm8tPnNlY3Rvcl9jb3VudCk7CisKKwkJcHJpbnRmKCIgIFNlY3RvciBTdGFydCBBZGRyZXNzZXM6Iik7CisJCWZvciAoaSA9IDA7IGkgPCBpbmZvLT5zZWN0b3JfY291bnQ7IGkrKykgeworCQkJaWYgKChpICUgNSkgPT0gMCkgcHJpbnRmICgiXG4gICAiKTsKKworCQkJcHJpbnRmICgiICUwOGxYJXMiLCBpbmZvLT5zdGFydFtpXSwKKwkJCQlpbmZvLT5wcm90ZWN0W2ldID8gIiAoUk8pIiA6ICIgICAgICIpOworCQl9CisJCXByaW50ZiAoIlxuIik7CisJCWluZm8rKzsKKwl9Cit9CisKKworLyoqCisgKiBmbGFzaF9lcmFzZTogLSBlcmFzZSBmbGFzaCBzZWN0b3JzCisgKgorICovCisKK2ludCBmbGFzaF9lcmFzZShmbGFzaF9pbmZvX3QgKmluZm8sIGludCBzX2ZpcnN0LCBpbnQgc19sYXN0KQoreworCWludCBmbGFnLCBwcm90LCBzZWN0OworCWludCByYyA9IEVSUl9PSzsKKworCWlmIChpbmZvLT5mbGFzaF9pZCA9PSBGTEFTSF9VTktOT1dOKQorCQlyZXR1cm4gRVJSX1VOS05PV05fRkxBU0hfVFlQRTsKKworCWlmICgoc19maXJzdCA8IDApIHx8IChzX2ZpcnN0ID4gc19sYXN0KSkgeworCQlyZXR1cm4gRVJSX0lOVkFMOworCX0KKworCWlmICgoaW5mby0+Zmxhc2hfaWQgJiBGTEFTSF9WRU5ETUFTSykgIT0gKElOVEVMX01BTlVGQUNUICYgRkxBU0hfVkVORE1BU0spKQorCQlyZXR1cm4gRVJSX1VOS05PV05fRkxBU0hfVkVORE9SOworCisJcHJvdCA9IDA7CisJZm9yIChzZWN0PXNfZmlyc3Q7IHNlY3Q8PXNfbGFzdDsgKytzZWN0KSB7CisJCWlmIChpbmZvLT5wcm90ZWN0W3NlY3RdKSBwcm90Kys7CisJfQorCisJaWYgKHByb3QpIHJldHVybiBFUlJfUFJPVEVDVEVEOworCisJLyoKKwkgKiBEaXNhYmxlIGludGVycnVwdHMgd2hpY2ggbWlnaHQgY2F1c2UgYSB0aW1lb3V0CisJICogaGVyZS4gUmVtZW1iZXIgdGhhdCBvdXIgZXhjZXB0aW9uIHZlY3RvcnMgYXJlCisJICogYXQgYWRkcmVzcyAwIGluIHRoZSBmbGFzaCwgYW5kIHdlIGRvbid0IHdhbnQgYQorCSAqICh0aWNrZXIpIGV4Y2VwdGlvbiB0byBoYXBwZW4gd2hpbGUgdGhlIGZsYXNoCisJICogY2hpcCBpcyBpbiBwcm9ncmFtbWluZyBtb2RlLgorCSAqLworCisJZmxhZyA9IGRpc2FibGVfaW50ZXJydXB0cygpOworCisJLyogU3RhcnQgZXJhc2Ugb24gdW5wcm90ZWN0ZWQgc2VjdG9ycyAqLworCWZvciAoc2VjdCA9IHNfZmlyc3Q7IHNlY3Q8PXNfbGFzdCAmJiAhY3RybGMoKTsgc2VjdCsrKSB7CisKKwkJcHJpbnRmKCJFcmFzaW5nIHNlY3RvciAlMmQgLi4uICIsIHNlY3QpOworCisJCS8qIGFybSBzaW1wbGUsIG5vbiBpbnRlcnJ1cHQgZGVwZW5kZW50IHRpbWVyICovCisJCXJlc2V0X3RpbWVyX21hc2tlZCgpOworCisJCWlmIChpbmZvLT5wcm90ZWN0W3NlY3RdID09IDApIHsJLyogbm90IHByb3RlY3RlZCAqLworCQkJdTMyICogdm9sYXRpbGUgYWRkciA9ICh1MzIgKiB2b2xhdGlsZSkoaW5mby0+c3RhcnRbc2VjdF0pOworCisJCQkvKiBlcmFzZSBzZWN0b3I6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwkJCS8qIFRoZSBzdHJhdGEgZmxhc2hzIGFyZSBhbGlnbmVkIHNpZGUgYnkgc2lkZSBvbiAgICAqLworCQkJLyogdGhlIGRhdGEgYnVzLCBzbyB3ZSBoYXZlIHRvIHdyaXRlIHRoZSBjb21tYW5kcyAgICovCisJCQkvKiB0byBib3RoIGNoaXBzIGhlcmU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworCQkJKmFkZHIgPSAweDAwMjAwMDIwOwkvKiBlcmFzZSBzZXR1cCAqLworCQkJKmFkZHIgPSAweDAwRDAwMEQwOwkvKiBlcmFzZSBjb25maXJtICovCisKKwkJCXdoaWxlICgoKmFkZHIgJiAweDAwODAwMDgwKSAhPSAweDAwODAwMDgwKSB7CisJCQkJaWYgKGdldF90aW1lcl9tYXNrZWQoKSA+IENGR19GTEFTSF9FUkFTRV9UT1VUKSB7CisJCQkJCSphZGRyID0gMHgwMEIwMDBCMDsgLyogc3VzcGVuZCBlcmFzZSovCisJCQkJCSphZGRyID0gMHgwMEZGMDBGRjsgLyogcmVhZCBtb2RlICAgICovCisJCQkJCXJjID0gRVJSX1RJTU9VVDsKKwkJCQkJZ290byBvdXRhaGVyZTsKKwkJCQl9CisJCQl9CisKKwkJCSphZGRyID0gMHgwMDUwMDA1MDsgLyogY2xlYXIgc3RhdHVzIHJlZ2lzdGVyIGNtZC4gICAqLworCQkJKmFkZHIgPSAweDAwRkYwMEZGOyAvKiByZXNlc3QgdG8gcmVhZCBtb2RlICAgICAgICAgICovCisKKwkJfQorCisJCXByaW50Zigib2suXG4iKTsKKwl9CisKKwlpZiAoY3RybGMoKSkgcHJpbnRmKCJVc2VyIEludGVycnVwdCFcbiIpOworCisJb3V0YWhlcmU6CisKKwkvKiBhbGxvdyBmbGFzaCB0byBzZXR0bGUgLSB3YWl0IDEwIG1zICovCisJdWRlbGF5X21hc2tlZCgxMDAwMCk7CisKKwlpZiAoZmxhZykgZW5hYmxlX2ludGVycnVwdHMoKTsKKworCXJldHVybiByYzsKK30KKworCisvKioKKyAqIHdyaXRlX3dvcmQ6IC0gY29weSBtZW1vcnkgdG8gZmxhc2gKKyAqCisgKiBAcGFyYW0gaW5mbzoKKyAqIEBwYXJhbSBkZXN0OgorICogQHBhcmFtIGRhdGE6CisgKiBAcmV0dXJuOgorICovCisKK3N0YXRpYyBpbnQgd3JpdGVfd29yZCAoZmxhc2hfaW5mb190ICppbmZvLCB1bG9uZyBkZXN0LCB1c2hvcnQgZGF0YSkKK3sKKwl1c2hvcnQgKmFkZHIgPSAodXNob3J0ICopZGVzdCwgdmFsOworCWludCByYyA9IEVSUl9PSzsKKwlpbnQgZmxhZzsKKworCS8qIENoZWNrIGlmIEZsYXNoIGlzIChzdWZmaWNpZW50bHkpIGVyYXNlZCAqLworCWlmICgoKmFkZHIgJiBkYXRhKSAhPSBkYXRhKSByZXR1cm4gRVJSX05PVF9FUkFTRUQ7CisKKwkvKgorCSAqIERpc2FibGUgaW50ZXJydXB0cyB3aGljaCBtaWdodCBjYXVzZSBhIHRpbWVvdXQKKwkgKiBoZXJlLiBSZW1lbWJlciB0aGF0IG91ciBleGNlcHRpb24gdmVjdG9ycyBhcmUKKwkgKiBhdCBhZGRyZXNzIDAgaW4gdGhlIGZsYXNoLCBhbmQgd2UgZG9uJ3Qgd2FudCBhCisJICogKHRpY2tlcikgZXhjZXB0aW9uIHRvIGhhcHBlbiB3aGlsZSB0aGUgZmxhc2gKKwkgKiBjaGlwIGlzIGluIHByb2dyYW1taW5nIG1vZGUuCisJICovCisJZmxhZyA9IGRpc2FibGVfaW50ZXJydXB0cygpOworCisJLyogY2xlYXIgc3RhdHVzIHJlZ2lzdGVyIGNvbW1hbmQgKi8KKwkqYWRkciA9IDB4NTA7CisKKwkvKiBwcm9ncmFtIHNldC11cCBjb21tYW5kICovCisJKmFkZHIgPSAweDQwOworCisJLyogbGF0Y2ggYWRkcmVzcy9kYXRhICovCisJKmFkZHIgPSBkYXRhOworCisJLyogYXJtIHNpbXBsZSwgbm9uIGludGVycnVwdCBkZXBlbmRlbnQgdGltZXIgKi8KKwlyZXNldF90aW1lcl9tYXNrZWQoKTsKKworCS8qIHdhaXQgd2hpbGUgcG9sbGluZyB0aGUgc3RhdHVzIHJlZ2lzdGVyICovCisJd2hpbGUoKCh2YWwgPSAqYWRkcikgJiAweDgwKSAhPSAweDgwKSB7CisJCWlmIChnZXRfdGltZXJfbWFza2VkKCkgPiBDRkdfRkxBU0hfV1JJVEVfVE9VVCkgeworCQkJcmMgPSBFUlJfVElNT1VUOworCQkJKmFkZHIgPSAweEIwOyAvKiBzdXNwZW5kIHByb2dyYW0gY29tbWFuZCAqLworCQkJZ290byBvdXRhaGVyZTsKKwkJfQorCX0KKworCWlmKHZhbCAmIDB4MUEpIHsJLyogY2hlY2sgZm9yIGVycm9yICovCisJCXByaW50ZigiXG5GbGFzaCB3cml0ZSBlcnJvciAlMDJ4IGF0IGFkZHJlc3MgJTA4bHhcbiIsCisJCQkoaW50KXZhbCwgKHVuc2lnbmVkIGxvbmcpZGVzdCk7CisJCWlmKHZhbCAmICgxPDwzKSkgeworCQkJcHJpbnRmKCJWb2x0YWdlIHJhbmdlIGVycm9yLlxuIik7CisJCQlyYyA9IEVSUl9QUk9HX0VSUk9SOworCQkJZ290byBvdXRhaGVyZTsKKwkJfQorCQlpZih2YWwgJiAoMTw8MSkpIHsKKwkJCXByaW50ZigiRGV2aWNlIHByb3RlY3QgZXJyb3IuXG4iKTsKKwkJCXJjID0gRVJSX1BST1RFQ1RFRDsKKwkJCWdvdG8gb3V0YWhlcmU7CisJCX0KKwkJaWYodmFsICYgKDE8PDQpKSB7CisJCQlwcmludGYoIlByb2dyYW1taW5nIGVycm9yLlxuIik7CisJCQlyYyA9IEVSUl9QUk9HX0VSUk9SOworCQkJZ290byBvdXRhaGVyZTsKKwkJfQorCQlyYyA9IEVSUl9QUk9HX0VSUk9SOworCQlnb3RvIG91dGFoZXJlOworCX0KKworCW91dGFoZXJlOgorCisJKmFkZHIgPSAweEZGOyAvKiByZWFkIGFycmF5IGNvbW1hbmQgKi8KKwlpZiAoZmxhZykgZW5hYmxlX2ludGVycnVwdHMoKTsKKworCXJldHVybiByYzsKK30KKworCisvKioKKyAqIHdyaXRlX2J1ZjogLSBDb3B5IG1lbW9yeSB0byBmbGFzaC4KKyAqCisgKiBAcGFyYW0gaW5mbzoKKyAqIEBwYXJhbSBzcmM6CXNvdXJjZSBvZiBjb3B5IHRyYW5zYWN0aW9uCisgKiBAcGFyYW0gYWRkcjoJd2hlcmUgdG8gY29weSB0bworICogQHBhcmFtIGNudDogCW51bWJlciBvZiBieXRlcyB0byBjb3B5CisgKgorICogQHJldHVybgllcnJvciBjb2RlCisgKi8KKworaW50IHdyaXRlX2J1ZmYgKGZsYXNoX2luZm9fdCAqaW5mbywgdWNoYXIgKnNyYywgdWxvbmcgYWRkciwgdWxvbmcgY250KQoreworCXVsb25nIGNwLCB3cDsKKwl1c2hvcnQgZGF0YTsKKwlpbnQgbDsKKwlpbnQgaSwgcmM7CisKKwl3cCA9IChhZGRyICYgfjEpOwkvKiBnZXQgbG93ZXIgd29yZCBhbGlnbmVkIGFkZHJlc3MgKi8KKworCS8qCisJICogaGFuZGxlIHVuYWxpZ25lZCBzdGFydCBieXRlcworCSAqLworCWlmICgobCA9IGFkZHIgLSB3cCkgIT0gMCkgeworCQlkYXRhID0gMDsKKwkJZm9yIChpPTAsIGNwPXdwOyBpPGw7ICsraSwgKytjcCkgeworCQkJZGF0YSA9IChkYXRhID4+IDgpIHwgKCoodWNoYXIgKiljcCA8PCA4KTsKKwkJfQorCQlmb3IgKDsgaTwyICYmIGNudD4wOyArK2kpIHsKKwkJCWRhdGEgPSAoZGF0YSA+PiA4KSB8ICgqc3JjKysgPDwgOCk7CisJCQktLWNudDsKKwkJCSsrY3A7CisJCX0KKwkJZm9yICg7IGNudD09MCAmJiBpPDI7ICsraSwgKytjcCkgeworCQkJZGF0YSA9IChkYXRhID4+IDgpIHwgKCoodWNoYXIgKiljcCA8PCA4KTsKKwkJfQorCisJCWlmICgocmMgPSB3cml0ZV93b3JkKGluZm8sIHdwLCBkYXRhKSkgIT0gMCkgeworCQkJcmV0dXJuIChyYyk7CisJCX0KKwkJd3AgKz0gMjsKKwl9CisKKwkvKgorCSAqIGhhbmRsZSB3b3JkIGFsaWduZWQgcGFydAorCSAqLworCXdoaWxlIChjbnQgPj0gMikgeworCQkvKiBkYXRhID0gKigodnVzaG9ydCopc3JjKTsgKi8KKwkJZGF0YSA9ICooKHVzaG9ydCopc3JjKTsKKwkJaWYgKChyYyA9IHdyaXRlX3dvcmQoaW5mbywgd3AsIGRhdGEpKSAhPSAwKSB7CisJCQlyZXR1cm4gKHJjKTsKKwkJfQorCQlzcmMgKz0gMjsKKwkJd3AgICs9IDI7CisJCWNudCAtPSAyOworCX0KKworCWlmIChjbnQgPT0gMCkgcmV0dXJuIEVSUl9PSzsKKworCS8qCisJICogaGFuZGxlIHVuYWxpZ25lZCB0YWlsIGJ5dGVzCisJICovCisJZGF0YSA9IDA7CisJZm9yIChpPTAsIGNwPXdwOyBpPDIgJiYgY250PjA7ICsraSwgKytjcCkgeworCQlkYXRhID0gKGRhdGEgPj4gOCkgfCAoKnNyYysrIDw8IDgpOworCQktLWNudDsKKwl9CisJZm9yICg7IGk8MjsgKytpLCArK2NwKSB7CisJCWRhdGEgPSAoZGF0YSA+PiA4KSB8ICgqKHVjaGFyICopY3AgPDwgOCk7CisJfQorCisJcmV0dXJuIHdyaXRlX3dvcmQoaW5mbywgd3AsIGRhdGEpOworfQorCmRpZmYgLS1naXQgYS9ib2FyZC9pbm5va29tL2lubm9rb20uYyBiL2JvYXJkL2lubm9rb20vaW5ub2tvbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkMjcwMmYKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9pbm5va29tL2lubm9rb20uYwpAQCAtMCwwICsxLDEzOSBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogUm9iZXJ0IFNjaHdlYmVsLCBQZW5ndXRyb25peCwgci5zY2h3ZWJlbEBwZW5ndXRyb25peC5kZQorICogS3lsZSBIYXJyaXMsIE5leHVzIFRlY2hub2xvZ2llcywgSW5jLiwga2hhcnJpc0BuZXh1cy10ZWNoLm5ldAorICogTWFyaXVzIEdyb2VnZXIsIFN5c2dvIFJlYWwtVGltZSBTb2x1dGlvbnMgR21iSCwgbWdyb2VnZXJAc3lzZ28uZGUKKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvcHhhLXJlZ3MuaD4KKworI2lmZGVmIENPTkZJR19TSE9XX0JPT1RfUFJPR1JFU1MKKyMgZGVmaW5lIFNIT1dfQk9PVF9QUk9HUkVTUyhhcmcpICAgICAgICBzaG93X2Jvb3RfcHJvZ3Jlc3MoYXJnKQorI2Vsc2UKKyMgZGVmaW5lIFNIT1dfQk9PVF9QUk9HUkVTUyhhcmcpCisjZW5kaWYKKworLyoKKyAqIE1pc2NlbGFuZW91cyBwbGF0Zm9ybSBkZXBlbmRlbnQgaW5pdGlhbGlzYXRpb25zCisgKi8KKworCisvKioKKyAqIGJvYXJkX2luaXQ6IC0gc2V0dXAgc29tZSBkYXRhIHN0cnVjdHVyZXMKKyAqCisgKiBAcmV0dXJuOiAwIGluIGNhc2Ugb2Ygc3VjY2VzcworICovCisKK2ludCBib2FyZF9pbml0ICh2b2lkKQoreworCURFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOworCisJLyogbWVtb3J5IGFuZCBjcHUtc3BlZWQgYXJlIHNldHVwIGJlZm9yZSByZWxvY2F0aW9uICovCisJLyogc28gd2UgZG8gX25vdGhpbmdfIGhlcmUgKi8KKworCS8qIGFyY2ggbnVtYmVyIG9mIElubm9rb20gYm9hcmQgKi8KKwlnZC0+YmQtPmJpX2FyY2hfbnVtYmVyID0gMjU4OworCisJLyogYWRyZXNzIG9mIGJvb3QgcGFyYW1ldGVycyAqLworCWdkLT5iZC0+YmlfYm9vdF9wYXJhbXMgPSAweGEwMDAwMTAwOworCisJcmV0dXJuIDA7Cit9CisKKworLyoqCisgKiBkcmFtX2luaXQ6IC0gc2V0dXAgZHluYW1pYyBSQU0KKyAqCisgKiBAcmV0dXJuOiAwIGluIGNhc2Ugb2Ygc3VjY2VzcworICovCisKK2ludCBkcmFtX2luaXQgKHZvaWQpCit7CisJREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CisKKwlnZC0+YmQtPmJpX2RyYW1bMF0uc3RhcnQgPSBQSFlTX1NEUkFNXzE7CisJZ2QtPmJkLT5iaV9kcmFtWzBdLnNpemUgPSBQSFlTX1NEUkFNXzFfU0laRTsKKworCXJldHVybiAwOworfQorCisKKy8qKgorICogaW5ub2tvbV9zZXRfbGVkOiAtIHN3aXRjaCBMRURzIG9uIG9yIG9mZgorICoKKyAqIEBwYXJhbSBsZWQ6ICAgTEVEIHRvIHN3aXRjaCAoMCwxLDIpCisgKiBAcGFyYW0gc3RhdGU6IHN3aXRjaCBvbiAoMSkgb3Igb2ZmICgwKQorICovCisKK3ZvaWQgaW5ub2tvbV9zZXRfbGVkKGludCBsZWQsIGludCBzdGF0ZSkKK3sKKwlzd2l0Y2gobGVkKSB7CisvKgorCQljYXNlIDA6IGlmIChzdGF0ZT09MSkgeworCQkJCUdQQ1IwIHw9IENTQjIyNl9VU0VSX0xFRDA7CisJCQl9IGVsc2UgaWYgKHN0YXRlPT0wKSB7CisJCQkJR1BTUjAgfD0gQ1NCMjI2X1VTRVJfTEVEMDsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgMTogaWYgKHN0YXRlPT0xKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQQ1IwIHw9IENTQjIyNl9VU0VSX0xFRDE7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXRlPT0wKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQU1IwIHw9IENTQjIyNl9VU0VSX0xFRDE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworCQljYXNlIDI6IGlmIChzdGF0ZT09MSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUENSMCB8PSBDU0IyMjZfVVNFUl9MRUQyOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0ZT09MCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUFNSMCB8PSBDU0IyMjZfVVNFUl9MRUQyOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisqLworCX0KKworCXJldHVybjsKK30KKworCisvKioKKyAqIHNob3dfYm9vdF9wcm9ncmVzczogLSBpbmRpY2F0ZSBzdGF0ZSBvZiB0aGUgYm9vdCBwcm9jZXNzCisgKgorICogQHBhcmFtIHN0YXR1czogU3RhdHVzIG51bWJlciAtIHNlZSBSRUFETUUgZm9yIGRldGFpbHMuCisgKgorICogVGhlIENTQjIyNiBkb2VzIG9ubHkgaGF2ZSAzIExFRHMsIHNvIHdlIHN3aXRjaCB0aGVtIG9uIGF0IHRoZSBtb3N0CisgKiBpbXBvcnRhbnQgc3RhdGVzICgxLCA1LCAxNSkuCisgKi8KKwordm9pZCBzaG93X2Jvb3RfcHJvZ3Jlc3MgKGludCBzdGF0dXMpCit7CisJc3dpdGNoKHN0YXR1cykgeworLyoKKwkJY2FzZSAgMTogY3NiMjI2X3NldF9sZWQoMCwxKTsgYnJlYWs7CisJCWNhc2UgIDU6IGNzYjIyNl9zZXRfbGVkKDEsMSk7IGJyZWFrOworCQljYXNlIDE1OiBjc2IyMjZfc2V0X2xlZCgyLDEpOyBicmVhazsKKyovCisJfQorCisJcmV0dXJuOworfQorCmRpZmYgLS1naXQgYS9ib2FyZC9pbm5va29tL21lbXNldHVwLlMgYi9ib2FyZC9pbm5va29tL21lbXNldHVwLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdkNWVlZQotLS0gL2Rldi9udWxsCisrKyBiL2JvYXJkL2lubm9rb20vbWVtc2V0dXAuUwpAQCAtMCwwICsxLDQyOSBAQAorLyoKKyAqIE1vc3Qgb2YgdGhpcyB0YWtlbiBmcm9tIFJlZGJvb3QgaGFsX3BsYXRmb3JtX3NldHVwLmggd2l0aCBjbGVhbnVwCisgKgorICogTk9URTogSSBoYXZlbid0IGNsZWFuIHRoaXMgdXAgY29uc2lkZXJhYmx5LCBqdXN0IGVub3VnaCB0byBnZXQgaXQKKyAqIHJ1bm5pbmcuIFNlZSBoYWxfcGxhdGZvcm1fc2V0dXAuaCBmb3IgdGhlIHNvdXJjZS4gU2VlCisgKiBib2FyZC9jcmFkbGUvbWVtc2V0dXAuUyBmb3IgYW5vdGhlciBQWEEyNTAgc2V0dXAgdGhhdCBpcworICogbXVjaCBjbGVhbmVyLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDx2ZXJzaW9uLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvcHhhLXJlZ3MuaD4KKworRFJBTV9TSVpFOiAgLmxvbmcgICBDRkdfRFJBTV9TSVpFCisKKy8qIHdhaXQgZm9yIGNvcHJvY2Vzc29yIHdyaXRlIGNvbXBsZXRlICovCisgICAubWFjcm8gQ1BXQUlUIHJlZworICAgbXJjICBwMTUsMCxccmVnLGMyLGMwLDAKKyAgIG1vdiAgXHJlZyxccmVnCisgICBzdWIgIHBjLHBjLCM0CisgICAuZW5kbQorCisKKy8qCisgKiAJTWVtb3J5IHNldHVwCisgKi8KKworLmdsb2JsIG1lbXNldHVwCittZW1zZXR1cDoKKworICAgIG1vdiAgICAgIHIxMCwgbHIKKworCS8qIFNldCB1cCBHUElPIHBpbnMgZmlyc3QgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCWxkcgkJcjAsCT1HUFNSMAorCWxkcgkJcjEsCT1DRkdfR1BTUjBfVkFMCisJc3RyCQlyMSwgICBbcjBdCisKKwlsZHIJCXIwLAk9R1BTUjEKKwlsZHIJCXIxLAk9Q0ZHX0dQU1IxX1ZBTAorCXN0cgkJcjEsICAgW3IwXQorCisJbGRyCQlyMCwJPUdQU1IyCisJbGRyCQlyMSwJPUNGR19HUFNSMl9WQUwKKwlzdHIJCXIxLCAgIFtyMF0KKworCWxkcgkJcjAsCT1HUENSMAorCWxkcgkJcjEsCT1DRkdfR1BDUjBfVkFMCisJc3RyCQlyMSwgICBbcjBdCisKKwlsZHIJCXIwLAk9R1BDUjEKKwlsZHIJCXIxLAk9Q0ZHX0dQQ1IxX1ZBTAorCXN0cgkJcjEsICAgW3IwXQorCisJbGRyCQlyMCwJPUdQQ1IyCisJbGRyCQlyMSwJPUNGR19HUENSMl9WQUwKKwlzdHIJCXIxLCAgIFtyMF0KKworCWxkcgkJcjAsCT1HUERSMAorCWxkcgkJcjEsCT1DRkdfR1BEUjBfVkFMCisJc3RyCQlyMSwgICBbcjBdCisKKwlsZHIJCXIwLAk9R1BEUjEKKwlsZHIJCXIxLAk9Q0ZHX0dQRFIxX1ZBTAorCXN0cgkJcjEsICAgW3IwXQorCisJbGRyCQlyMCwJPUdQRFIyCisJbGRyCQlyMSwJPUNGR19HUERSMl9WQUwKKwlzdHIJCXIxLCAgIFtyMF0KKworCWxkcgkJcjAsCT1HQUZSMF9MCisJbGRyCQlyMSwJPUNGR19HQUZSMF9MX1ZBTAorCXN0cgkJcjEsICAgW3IwXQorCisJbGRyCQlyMCwJPUdBRlIwX1UKKwlsZHIJCXIxLAk9Q0ZHX0dBRlIwX1VfVkFMCisJc3RyCQlyMSwgICBbcjBdCisKKwlsZHIJCXIwLAk9R0FGUjFfTAorCWxkcgkJcjEsCT1DRkdfR0FGUjFfTF9WQUwKKwlzdHIJCXIxLCAgIFtyMF0KKworCWxkcgkJcjAsCT1HQUZSMV9VCisJbGRyCQlyMSwJPUNGR19HQUZSMV9VX1ZBTAorCXN0cgkJcjEsICAgW3IwXQorCisJbGRyCQlyMCwJPUdBRlIyX0wKKwlsZHIJCXIxLAk9Q0ZHX0dBRlIyX0xfVkFMCisJc3RyCQlyMSwgICBbcjBdCisKKwlsZHIJCXIwLAk9R0FGUjJfVQorCWxkcgkJcjEsCT1DRkdfR0FGUjJfVV9WQUwKKwlzdHIJCXIxLCAgIFtyMF0KKworCWxkcglyMCwJPVBTU1IJCS8qIGVuYWJsZSBHUElPIHBpbnMgKi8KKwlsZHIJCXIxLAk9Q0ZHX1BTU1JfVkFMCisJc3RyCQlyMSwgICBbcjBdCisKKy8qCWxkcglyMywJPU1TQzEJCS8gIGxvdyAtIGJhbmsgMiBMdWJib2NrIFJlZ2lzdGVycyAvIFNSQU0gKi8KKy8qCWxkcglyMiwJPUNGR19NU0MxX1ZBTAkvICBoaWdoIC0gYmFuayAzIEV0aGVybmV0IENvbnRyb2xsZXIgKi8KKy8qCXN0cglyMiwJW3IzXQkJLyAgbmVlZCB0byBzZXQgTVNDMSBiZWZvcmUgdHJ5aW5nIHRvIHdyaXRlIHRvIHRoZSBIRVggTEVEcyAqLworLyoJbGRyCXIyLAlbcjNdCQkvICBuZWVkIHRvIHJlYWQgaXQgYmFjayB0byBtYWtlIHN1cmUgdGhlIHZhbHVlIGxhdGNoZXMgKHNlZSBNU0Mgc2VjdGlvbiBvZiBtYW51YWwpICovCisvKiAqLworLyoJbGRyCXIxLAk9TEVEX0JMQU5LICovCisvKgltb3YJcjAsCSMweEZGICovCisvKglzdHIJcjAsCVtyMV0JCS8gIHR1cm4gb24gaGV4IGxlZHMgKi8KKy8qICovCisvKmxvb3A6ICovCisvKiAqLworLyogICBsZHIJcjAsID0weEIwMDcwMDAxICovCisvKiAgIGxkciAgICAJcjEsID1fTEVEICovCisvKiAgIHN0ciAgICAJcjAsIFtyMV0JCS8gIGhleCBkaXNwbGF5ICovCisKKworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwkvKiBFbmFibGUgbWVtb3J5IGludGVyZmFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCS8qIFRoZSBzZXF1ZW5jZSBiZWxvdyBpcyBiYXNlZCBvbiB0aGUgcmVjb21tZW5kZWQgaW5pdCBzdGVwcyAgICAgICAgKi8KKwkvKiBkZXRhaWxlZCBpbiB0aGUgSW50ZWwgUFhBMjUwIE9wZXJhdGluZyBTeXN0ZW1zIERldmVsb3BlcnMgR3VpZGUsICovCisJLyogQ2hhcHRlciAxMC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwkvKiBTdGVwIDE6IFdhaXQgZm9yIGF0IGxlYXN0IDIwMCBtaWNyb3NlZG9uZHMgdG8gYWxsb3cgaW50ZXJuYWwgICAgICovCisJLyogICAgICAgICBjbG9ja3MgdG8gc2V0dGxlLiBPbmx5IG5lY2Vzc2FyeSBhZnRlciBoYXJkIHJlc2V0Li4uICAgICAqLworCS8qICAgICAgICAgRklYTUU6IGNhbiBiZSBvcHRpbWl6ZWQgbGF0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwlsZHIgcjMsID1PU0NSCQkJLyogcmVzZXQgdGhlIE9TIFRpbWVyIENvdW50IHRvIHplcm8gKi8KKwltb3YgcjIsICMwCisJc3RyIHIyLCBbcjNdCisJbGRyIHI0LCA9MHgzMDAJCQkvKiByZWFsbHkgMHgyRTEgaXMgYWJvdXQgMjAwdXNlYywgICAqLworCQkJCQkvKiBzbyAweDMwMCBzaG91bGQgYmUgcGxlbnR5ICAgICAgICAqLworMToKKwlsZHIgcjIsIFtyM10KKwljbXAgcjQsIHIyCisJYmd0IDFiCisKK21lbV9pbml0OgorCisgICAgICAgIGxkciAgICAgcjEsICA9TUVNQ19CQVNFCQkvKiBnZXQgbWVtb3J5IGNvbnRyb2xsZXIgYmFzZSBhZGRyLiAqLworCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCS8qIFN0ZXAgMmE6IEluaXRpYWxpemUgQXN5bmNocm9ub3VzIHN0YXRpYyBtZW1vcnkgY29udHJvbGxlciAgICAgICAgKi8KKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwkvKiBNU0MgcmVnaXN0ZXJzOiB0aW1pbmcsIGJ1cyB3aWR0aCwgbWVtIHR5cGUgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICAgICAgLyogTVNDMDogbkNTKDAsMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICBsZHIgICAgIHIyLCAgID1DRkdfTVNDMF9WQUwKKyAgICAgICAgc3RyICAgICByMiwgICBbcjEsICNNU0MwX09GRlNFVF0KKyAgICAgICAgbGRyICAgICByMiwgICBbcjEsICNNU0MwX09GRlNFVF0JLyogcmVhZCBiYWNrIHRvIGVuc3VyZSAgICAgICovCisJCQkJCQkvKiB0aGF0IGRhdGEgbGF0Y2hlcyAgICAgICAgKi8KKyAgICAgICAgLyogTVNDMTogbkNTKDIsMykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICBsZHIgICAgIHIyLCAgPUNGR19NU0MxX1ZBTAorICAgICAgICBzdHIgICAgIHIyLCAgW3IxLCAjTVNDMV9PRkZTRVRdCisgICAgICAgIGxkciAgICAgcjIsICBbcjEsICNNU0MxX09GRlNFVF0KKworCS8qIE1TQzI6IG5DUyg0LDUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgbGRyICAgICByMiwgID1DRkdfTVNDMl9WQUwKKyAgICAgICAgc3RyICAgICByMiwgIFtyMSwgI01TQzJfT0ZGU0VUXQorICAgICAgICBsZHIgICAgIHIyLCAgW3IxLCAjTVNDMl9PRkZTRVRdCisKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJLyogU3RlcCAyYjogSW5pdGlhbGl6ZSBDYXJkIEludGVyZmFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCS8qIE1FQ1I6IE1lbW9yeSBFeHBhbnNpb24gQ2FyZCBSZWdpc3RlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgbGRyICAgICByMiwgID1DRkdfTUVDUl9WQUwKKyAgICAgICAgc3RyICAgICByMiwgIFtyMSwgI01FQ1JfT0ZGU0VUXQorCWxkcglyMiwJW3IxLCAjTUVDUl9PRkZTRVRdCisKKwkvKiBNQ01FTTA6IENhcmQgSW50ZXJmYWNlIHNsb3QgMCB0aW1pbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgIGxkciAgICAgcjIsICA9Q0ZHX01DTUVNMF9WQUwKKyAgICAgICAgc3RyICAgICByMiwgIFtyMSwgI01DTUVNMF9PRkZTRVRdCisJbGRyCXIyLAlbcjEsICNNQ01FTTBfT0ZGU0VUXQorCisgICAgICAgIC8qIE1DTUVNMTogQ2FyZCBJbnRlcmZhY2Ugc2xvdCAxIHRpbWluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgbGRyICAgICByMiwgID1DRkdfTUNNRU0xX1ZBTAorICAgICAgICBzdHIgICAgIHIyLCAgW3IxLCAjTUNNRU0xX09GRlNFVF0KKwlsZHIJcjIsCVtyMSwgI01DTUVNMV9PRkZTRVRdCisKKwkvKiBNQ0FUVDA6IENhcmQgSW50ZXJmYWNlIEF0dHJpYnV0ZSBTcGFjZSBUaW1pbmcsIHNsb3QgMCAgICAgICAgICAgICovCisgICAgICAgIGxkciAgICAgcjIsICA9Q0ZHX01DQVRUMF9WQUwKKyAgICAgICAgc3RyICAgICByMiwgIFtyMSwgI01DQVRUMF9PRkZTRVRdCisJbGRyCXIyLAlbcjEsICNNQ0FUVDBfT0ZGU0VUXQorCisJLyogTUNBVFQxOiBDYXJkIEludGVyZmFjZSBBdHRyaWJ1dGUgU3BhY2UgVGltaW5nLCBzbG90IDEgICAgICAgICAgICAqLworICAgICAgICBsZHIgICAgIHIyLCAgPUNGR19NQ0FUVDFfVkFMCisgICAgICAgIHN0ciAgICAgcjIsICBbcjEsICNNQ0FUVDFfT0ZGU0VUXQorCWxkcglyMiwJW3IxLCAjTUNBVFQxX09GRlNFVF0KKworCS8qIE1DSU8wOiBDYXJkIEludGVyZmFjZSBJL08gU3BhY2UgVGltaW5nLCBzbG90IDAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgbGRyICAgICByMiwgID1DRkdfTUNJTzBfVkFMCisgICAgICAgIHN0ciAgICAgcjIsICBbcjEsICNNQ0lPMF9PRkZTRVRdCisJbGRyCXIyLAlbcjEsICNNQ0lPMF9PRkZTRVRdCisKKwkvKiBNQ0lPMTogQ2FyZCBJbnRlcmZhY2UgSS9PIFNwYWNlIFRpbWluZywgc2xvdCAxICAgICAgICAgICAgICAgICAgICovCisgICAgICAgIGxkciAgICAgcjIsICA9Q0ZHX01DSU8xX1ZBTAorICAgICAgICBzdHIgICAgIHIyLCAgW3IxLCAjTUNJTzFfT0ZGU0VUXQorCWxkcglyMiwJW3IxLCAjTUNJTzFfT0ZGU0VUXQorCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworICAgICAgICAvKiBTdGVwIDJjOiBXcml0ZSBGTFlDTkZHICBGSVhNRTogd2hhdCdzIHRoYXQ/Pz8gICAgICAgICAgICAgICAgICAgICovCisgICAgICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworICAgICAgICAvKiBTdGVwIDJkOiBJbml0aWFsaXplIFRpbWluZyBmb3IgU3luYyBNZW1vcnkgKFNEQ0xLMCkgICAgICAgICAgICAgICovCisgICAgICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCS8qIEJlZm9yZSBhY2Nlc3NpbmcgTURSRUZSIHdlIG5lZWQgYSB2YWxpZCBEUkkgZmllbGQsIHNvIHdlIHNldCAgICAgKi8KKwkvKiB0aGlzIHRvIHBvd2VyIG9uIGRlZmF1bHRzICsgRElSIGZpZWxkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKwlsZHIJcjQsCT0weDAzY2E0ZmZmCisJc3RyCXI0LAlbcjEsICNNRFJFRlJfT0ZGU0VUXQkvKiB3cml0ZSBiYWNrIE1EUkVGUiAgICAgICAgKi8KKyAgICAgICAgbGRyICAgICByNCwJW3IxLCAjTURSRUZSX09GRlNFVF0KKworCWxkcglyNCwJPTB4MDNjYTQwMzAKKwlzdHIJcjQsCVtyMSwgI01EUkVGUl9PRkZTRVRdCS8qIHdyaXRlIGJhY2sgTURSRUZSICAgICAgICAqLworCWxkcglyNCwJW3IxLCAjTURSRUZSX09GRlNFVF0KKworICAgICAgICAvKiBOb3RlOiBwcmVzZXJ2ZSB0aGUgbWRyZWZyIHZhbHVlIGluIHI0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwkvKiBTdGVwIDM6IEluaXRpYWxpemUgU3luY2hyb25vdXMgU3RhdGljIE1lbW9yeSAoRmxhc2gvUGVyaXBoZXJhbHMpICovCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisJLyogSW5pdGlhbGl6ZSBTWENORkcgcmVnaXN0ZXIuIEFzc2VydCB0aGUgZW5hYmxlIGJpdHMgICAgICAgICAgICAgICAqLworCisJLyogV3JpdGUgU1hNUlMgdG8gY2F1c2UgYW4gTVJTIGNvbW1hbmQgdG8gYWxsIGVuYWJsZWQgYmFua3Mgb2YgICAgICAqLworCS8qIHN5bmNocm9ub3VzIHN0YXRpYyBtZW1vcnkuIE5vdGUgdGhhdCBTWExDUiBuZWVkIG5vdCBiZSB3cml0dGVuICAgKi8KKwkvKiBhdCB0aGlzIHRpbWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKwkvKiBGSVhNRTogd2UgdXNlIGFzeW5jIG1vZGUgZm9yIG5vdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKworICAgICAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisgICAgICAgIC8qIFN0ZXAgNDogSW5pdGlhbGl6ZSBTRFJBTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisJLyogU3RlcCA0YTogYXNzZXJ0IE1EUkVGUjpLMVJVTiBhbmQgTURSRUZSOksyUlVOIGFuZCBjb25maWd1cmUgICAgICAqLworCS8qICAgICAgICAgIE1EUkVGUjpLMURCMiBhbmQgTURSRUZSOksyREIyIGFzIGRlc2lyZWQuICAgICAgICAgICAgICAgKi8KKworCW9ycglyNCwJcjQsCSMoTURSRUZSX0sxUlVOfE1EUkVGUl9LMFJVTikKKworCXN0ciAgICAgcjQsICAgICBbcjEsICNNRFJFRlJfT0ZGU0VUXSAgICAvKiB3cml0ZSBiYWNrIE1EUkVGUiAgICAgICAgKi8KKwlsZHIgICAgIHI0LCAgICAgW3IxLCAjTURSRUZSX09GRlNFVF0KKworCisJLyogU3RlcCA0YjogZGUtYXNzZXJ0IE1EUkVGUjpTTEZSU0guICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisJYmljCXI0LAlyNCwJIyhNRFJFRlJfU0xGUlNIKQorCisgICAgICAgIHN0ciAgICAgcjQsICAgICBbcjEsICNNRFJFRlJfT0ZGU0VUXSAgICAvKiB3cml0ZSBiYWNrIE1EUkVGUiAgICAgICAgKi8KKyAgICAgICAgbGRyICAgICByNCwgICAgIFtyMSwgI01EUkVGUl9PRkZTRVRdCisKKworCS8qIFN0ZXAgNGM6IGFzc2VydCBNRFJFRlI6RTFQSU4gYW5kIEUwUElPICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworCW9ycglyNCwJcjQsCSMoTURSRUZSX0UxUElOfE1EUkVGUl9FMFBJTikKKworICAgICAgICBzdHIgICAgIHI0LCAgICAgW3IxLCAjTURSRUZSX09GRlNFVF0gICAgLyogd3JpdGUgYmFjayBNRFJFRlIgICAgICAgICovCisgICAgICAgIGxkciAgICAgcjQsICAgICBbcjEsICNNRFJFRlJfT0ZGU0VUXQorCisKKwkvKiBTdGVwIDRkOiB3cml0ZSBNRENORkcgd2l0aCBNRENORkc6REV4IGRlYXNzZXJ0ZWQgKHNldCB0byAwKSwgdG8gICovCisJLyogICAgICAgICAgY29uZmlndXJlIGJ1dCBub3QgZW5hYmxlIGVhY2ggU0RSQU0gcGFydGl0aW9uIHBhaXIuICAgICAqLworCisJbGRyCXI0LAk9Q0ZHX01EQ05GR19WQUwKKwliaWMJcjQsCXI0LAkjKE1EQ05GR19ERTB8TURDTkZHX0RFMSkKKworICAgICAgICBzdHIgICAgIHI0LCAgICAgW3IxLCAjTURDTkZHX09GRlNFVF0JLyogd3JpdGUgYmFjayBNRENORkcgICAgICAgICovCisgICAgICAgIGxkciAgICAgcjQsICAgICBbcjEsICNNRENORkdfT0ZGU0VUXQorCisKKwkvKiBTdGVwIDRlOiBXYWl0IGZvciB0aGUgY2xvY2sgdG8gdGhlIFNEUkFNcyB0byBzdGFiaWxpemUsICAgICAgICAgICovCisJLyogICAgICAgICAgMTAwLi4yMDAgtXNlYy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisJbGRyIHIzLCA9T1NDUgkJCS8qIHJlc2V0IHRoZSBPUyBUaW1lciBDb3VudCB0byB6ZXJvICovCisJbW92IHIyLCAjMAorCXN0ciByMiwgW3IzXQorCWxkciByNCwgPTB4MzAwCQkJLyogcmVhbGx5IDB4MkUxIGlzIGFib3V0IDIwMHVzZWMsICAgKi8KKwkJCQkJLyogc28gMHgzMDAgc2hvdWxkIGJlIHBsZW50eSAgICAgICAgKi8KKzE6CisJbGRyIHIyLCBbcjNdCisJY21wIHI0LCByMgorCWJndCAxYgorCisKKwkvKiBTdGVwIDRmOiBUcmlnZ2VyIGEgbnVtYmVyICh1c3VhbGx5IDgpIHJlZnJlc2ggY3ljbGVzIGJ5ICAgICAgICAgICovCisJLyogICAgICAgICAgYXR0ZW1wdGluZyBub24tYnVyc3QgcmVhZCBvciB3cml0ZSBhY2Nlc3NlcyB0byBkaXNhYmxlZCAqLworCS8qICAgICAgICAgIFNEUkFNLCBhcyBjb21tb25seSBzcGVjaWZpZWQgaW4gdGhlIHBvd2VyIHVwIHNlcXVlbmNlICAgKi8KKwkvKiAgICAgICAgICBkb2N1bWVudGVkIGluIFNEUkFNIGRhdGEgc2hlZXRzLiBUaGUgYWRkcmVzcyhlcykgdXNlZCAgICovCisJLyogICAgICAgICAgZm9yIHRoaXMgcHVycG9zZSBtdXN0IG5vdCBiZSBjYWNoZWFibGUuICAgICAgICAgICAgICAgICAqLworCisJbGRyCXIzLAk9Q0ZHX0RSQU1fQkFTRQorCXN0cglyMiwJW3IzXQorCXN0cglyMiwJW3IzXQorCXN0cglyMiwJW3IzXQorCXN0cglyMiwJW3IzXQorCXN0cglyMiwJW3IzXQorCXN0cglyMiwJW3IzXQorCXN0cglyMiwJW3IzXQorCXN0cglyMiwJW3IzXQorCisKKwkvKiBTdGVwIDRnOiBXcml0ZSBNRENORkcgd2l0aCBlbmFibGUgYml0cyBhc3NlcnRlZCAgICAgICAgICAgICAgICAgICovCisJLyogICAgICAgICAgKE1EQ05GRzpERXggc2V0IHRvIDEpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisJbGRyCXIzLCBbcjEsICNNRENORkdfT0ZGU0VUXQorCW9ycglyMywJcjMsCSMoTURDTkZHX0RFMHxNRENORkdfREUxKQorCXN0cglyMywgW3IxLCAjTURDTkZHX09GRlNFVF0KKworCS8qIFN0ZXAgNGg6IFdyaXRlIE1ETVJTLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICAgICAgICBsZHIgICAgIHIyLCAgPUNGR19NRE1SU19WQUwKKyAgICAgICAgc3RyICAgICByMiwgIFtyMSwgI01ETVJTX09GRlNFVF0KKworCisJLyogV2UgYXJlIGZpbmlzaGVkIHdpdGggSW50ZWwncyBtZW1vcnkgY29udHJvbGxlciBpbml0aWFsaXNhdGlvbiAgICAqLworCisKKwkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJLyogRGlzYWJsZSAobWFzaykgYWxsIGludGVycnVwdHMgYXQgaW50ZXJydXB0IGNvbnRyb2xsZXIgICAgICAgICAgICAqLworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworaW5pdGlycXM6CisKKyAgICAgICAgbW92ICAgICByMSwgIzAJCS8qIGNsZWFyIGludC4gbGV2ZWwgcmVnaXN0ZXIgKElSUSwgbm90IEZJUSkgKi8KKyAgICAgICAgbGRyICAgICByMiwgID1JQ0xSCisgICAgICAgIHN0ciAgICAgcjEsICBbcjJdCisKKyAgICAgICAgbGRyICAgICByMiwgID1JQ01SCS8qIG1hc2sgYWxsIGludGVycnVwdHMgYXQgdGhlIGNvbnRyb2xsZXIgICAgKi8KKyAgICAgICAgc3RyICAgICByMSwgIFtyMl0KKworCisgICAgICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwkvKiBDbG9jayBpbml0aWFsaXNhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworaW5pdGNsa3M6CisKKwkvKiBEaXNhYmxlIHRoZSBwZXJpcGhlcmFsIGNsb2NrcywgYW5kIHNldCB0aGUgY29yZSBjbG9jayBmcmVxdWVuY3kgICovCisJLyogKGhhcmQtY29kaW5nIGF0IDM5OC4xMk1IeiBmb3Igbm93KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisJLyogVHVybiBPZmYgQUxMIG9uLWNoaXAgcGVyaXBoZXJhbCBjbG9ja3MgZm9yIHJlLWNvbmZpZ3VyYXRpb24gICAgICAqLworCS8qIE5vdGU6IFNlZSBsYWJlbCAnRU5BQkxFQ0xLUycgZm9yIHRoZSByZS1lbmFibGluZyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgbGRyICAgICByMSwgID1DS0VOCisgICAgICAgIG1vdiAgICAgcjIsICAjMAorICAgICAgICBzdHIgICAgIHIyLCAgW3IxXQorCisKKyAgICAgICAgLyogZGVmYXVsdCB2YWx1ZSBpbiBjYXNlIG5vIHZhbGlkIHJvdGFyeSBzd2l0Y2ggc2V0dGluZyBpcyBmb3VuZCAgICAqLworICAgICAgICBsZHIgICAgIHIyLCA9KENDQ1JfTDI3fENDQ1JfTTJ8Q0NDUl9OMTApICAvKiBERUZBVUxUOiB7MjAwLzIwMC8xMDB9ICovCisKKyAgICAgICAgLyogLi4uIGFuZCB3cml0ZSB0aGUgY29yZSBjbG9jayBjb25maWcgcmVnaXN0ZXIgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICBsZHIgICAgIHIxLCAgPUNDQ1IKKyAgICAgICAgc3RyICAgICByMiwgIFtyMV0KKworCS8qIGVuYWJsZSB0aGUgMzJLaHogb3NjaWxsYXRvciBmb3IgUlRDIGFuZCBQb3dlck1hbmFnZXIgICAgICAgICAgICAgKi8KKy8qCisgICAgICAgIGxkciAgICAgcjEsICA9T1NDQworICAgICAgICBtb3YgICAgIHIyLCAgI09TQ0NfT09OCisgICAgICAgIHN0ciAgICAgcjIsICBbcjFdCisqLworCS8qIE5PVEU6ICBzcGluIGhlcmUgdW50aWwgT1NDQy5PT0sgZ2V0IHNldCwgbWVhbmluZyB0aGUgUExMICAgICAgICAgKi8KKwkvKiBoYXMgc2V0dGxlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCis2MDoKKyAgICAgICAgbGRyICAgICByMiwgW3IxXQorICAgICAgICBhbmRzICAgIHIyLCByMiwgIzEKKyAgICAgICAgYmVxICAgICA2MGIKKworCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwkvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCS8qIFNhdmUgU0RSQU0gc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwlsZHIJcjEsID1EUkFNX1NJWkUKKwlzdHIJcjgsIFtyMV0KKworCS8qIEludGVycnVwdCBpbml0OiBNYXNrIGFsbCBpbnRlcnJ1cHRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwlsZHIJcjAsID1JQ01SCQkJLyogZW5hYmxlIG5vIHNvdXJjZXMgICAgICAgICovCisJbW92CXIxLCAjMAorCXN0cglyMSwgW3IwXQorCisJLyogRklYTUUgKi8KKworI2RlZmluZSBOT0RFQlVHCisjaWZkZWYgTk9ERUJVRworCS8qRGlzYWJsZSBzb2Z0d2FyZSBhbmQgZGF0YSBicmVha3BvaW50cyAqLworCW1vdglyMCwjMAorCW1jcglwMTUsMCxyMCxjMTQsYzgsMCAgLyogaWJjcjAgKi8KKwltY3IJcDE1LDAscjAsYzE0LGM5LDAgIC8qIGliY3IxICovCisJbWNyCXAxNSwwLHIwLGMxNCxjNCwwICAvKiBkYmNvbiAqLworCisJLypFbmFibGUgYWxsIGRlYnVnIGZ1bmN0aW9uYWxpdHkgKi8KKwltb3YJcjAsIzB4ODAwMDAwMDAKKwltY3IJcDE0LDAscjAsYzEwLGMwLDAgIC8qIGRjc3IgKi8KKworI2VuZGlmCisKKyAgICAgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCS8qIEVuZCBtZW1zZXR1cCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitlbmRtZW1zZXR1cDoKKworICAgIG1vdiAgICAgcGMsIGxyCisKZGlmZiAtLWdpdCBhL2JvYXJkL2lubm9rb20vdS1ib290LmxkcyBiL2JvYXJkL2lubm9rb20vdS1ib290LmxkcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTg5YjMyCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvaW5ub2tvbS91LWJvb3QubGRzCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDAKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworT1VUUFVUX0ZPUk1BVCgiZWxmMzItbGl0dGxlYXJtIiwgImVsZjMyLWxpdHRsZWFybSIsICJlbGYzMi1saXR0bGVhcm0iKQorT1VUUFVUX0FSQ0goYXJtKQorRU5UUlkoX3N0YXJ0KQorU0VDVElPTlMKK3sKKyAgICAgICAgLiA9IDB4MDAwMDAwMDA7CisKKyAgICAgICAgLiA9IEFMSUdOKDQpOworCS50ZXh0ICAgICAgOgorCXsKKwkgIGNwdS94c2NhbGUvc3RhcnQubwkoLnRleHQpCisJICAqKC50ZXh0KQorCX0KKworICAgICAgICAuID0gQUxJR04oNCk7CisgICAgICAgIC5yb2RhdGEgOiB7ICooLnJvZGF0YSkgfQorCisgICAgICAgIC4gPSBBTElHTig0KTsKKyAgICAgICAgLmRhdGEgOiB7ICooLmRhdGEpIH0KKworICAgICAgICAuID0gQUxJR04oNCk7CisgICAgICAgIC5nb3QgOiB7ICooLmdvdCkgfQorCisJYXJtYm9vdF9lbmRfZGF0YSA9IC47CisKKyAgICAgICAgLiA9IEFMSUdOKDQpOworICAgICAgICAuYnNzIDogeyAqKC5ic3MpIH0KKworCWFybWJvb3RfZW5kID0gLjsKK30KZGlmZiAtLWdpdCBhL2JvYXJkL3IzNjBtcGkvZmxhc2guYyBiL2JvYXJkL3IzNjBtcGkvZmxhc2guYwppbmRleCA4MGJjZDI1Li5lMzhkZmNjIDEwMDY0NAotLS0gYS9ib2FyZC9yMzYwbXBpL2ZsYXNoLmMKKysrIGIvYm9hcmQvcjM2MG1waS9mbGFzaC5jCkBAIC0yNCwxMCArMjQsMTIgQEAKICAqIE1BIDAyMTExLTEzMDcgVVNBCiAgKi8KIAorLyogI2RlZmluZSBERUJVRyAqLworCiAjaW5jbHVkZSA8Y29tbW9uLmg+CiAjaW5jbHVkZSA8bXBjOHh4Lmg+CiAKLWZsYXNoX2luZm9fdAlmbGFzaF9pbmZvW0NGR19NQVhfRkxBU0hfQkFOS1NdOyAvKiBpbmZvIGZvciBGTEFTSCBjaGlwcwkqLworZmxhc2hfaW5mb190IGZsYXNoX2luZm9bQ0ZHX01BWF9GTEFTSF9CQU5LU107CS8qIGluZm8gZm9yIEZMQVNIIGNoaXBzICAgICovCiAKICNpZiBkZWZpbmVkKENGR19FTlZfSVNfSU5fRkxBU0gpCiAjIGlmbmRlZiAgQ0ZHX0VOVl9BRERSCkBAIC01Miw0NCArNTQsNDQgQEAKICNkZWZpbmUgRkxBU0hfUE9SVF9XSURUSDE2CiAKICNpZmRlZiBGTEFTSF9QT1JUX1dJRFRIMTYKLSNkZWZpbmUgRkxBU0hfUE9SVF9XSURUSAkJdXNob3J0Ci0jZGVmaW5lIEZMQVNIX1BPUlRfV0lEVEhWCQl2dV9zaG9ydAorI2RlZmluZSBGTEFTSF9QT1JUX1dJRFRICXVzaG9ydAorI2RlZmluZSBGTEFTSF9QT1JUX1dJRFRIVgl2dV9zaG9ydAogI2Vsc2UKLSNkZWZpbmUgRkxBU0hfUE9SVF9XSURUSAkJdWxvbmcKLSNkZWZpbmUgRkxBU0hfUE9SVF9XSURUSFYJCXZ1X2xvbmcKKyNkZWZpbmUgRkxBU0hfUE9SVF9XSURUSAl1bG9uZworI2RlZmluZSBGTEFTSF9QT1JUX1dJRFRIVgl2dV9sb25nCiAjZW5kaWYKIAotI2RlZmluZSBGUFcJCUZMQVNIX1BPUlRfV0lEVEgKLSNkZWZpbmUgRlBXVglGTEFTSF9QT1JUX1dJRFRIVgorI2RlZmluZSBGUFcJCQlGTEFTSF9QT1JUX1dJRFRICisjZGVmaW5lIEZQV1YJCQlGTEFTSF9QT1JUX1dJRFRIVgogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBGdW5jdGlvbnMKICAqLwotc3RhdGljIHVsb25nIGZsYXNoX2dldF9zaXplIChGUFcgKmFkZHIsIGZsYXNoX2luZm9fdCAqaW5mbyk7Ci1zdGF0aWMgaW50ICAgd3JpdGVfZGF0YSAoZmxhc2hfaW5mb190ICppbmZvLCB1bG9uZyBkZXN0LCBGUFcgZGF0YSk7Ci1zdGF0aWMgdm9pZCAgZmxhc2hfZ2V0X29mZnNldHMgKHVsb25nIGJhc2UsIGZsYXNoX2luZm9fdCAqaW5mbyk7CitzdGF0aWMgdWxvbmcgZmxhc2hfZ2V0X3NpemUgKEZQVyAqIGFkZHIsIGZsYXNoX2luZm9fdCAqIGluZm8pOworc3RhdGljIGludCB3cml0ZV9kYXRhIChmbGFzaF9pbmZvX3QgKiBpbmZvLCB1bG9uZyBkZXN0LCBGUFcgZGF0YSk7CitzdGF0aWMgdm9pZCBmbGFzaF9nZXRfb2Zmc2V0cyAodWxvbmcgYmFzZSwgZmxhc2hfaW5mb190ICogaW5mbyk7CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqLwogCiB1bnNpZ25lZCBsb25nIGZsYXNoX2luaXQgKHZvaWQpCiB7Ci0Jdm9sYXRpbGUgaW1tYXBfdCAgICAgKmltbWFwICA9IChpbW1hcF90ICopQ0ZHX0lNTVI7CisJdm9sYXRpbGUgaW1tYXBfdCAqaW1tYXAgPSAoaW1tYXBfdCAqKSBDRkdfSU1NUjsKIAl2b2xhdGlsZSBtZW1jdGw4eHhfdCAqbWVtY3RsID0gJmltbWFwLT5pbV9tZW1jdGw7CiAJdW5zaWduZWQgbG9uZyBzaXplX2IwOwogCWludCBpOwogCiAJLyogSW5pdDogbm8gRkxBU0hlcyBrbm93biAqLwotCWZvciAoaT0wOyBpPENGR19NQVhfRkxBU0hfQkFOS1M7ICsraSkgeworCWZvciAoaSA9IDA7IGkgPCBDRkdfTUFYX0ZMQVNIX0JBTktTOyArK2kpIHsKIAkJZmxhc2hfaW5mb1tpXS5mbGFzaF9pZCA9IEZMQVNIX1VOS05PV047CiAJfQogCiAJLyogU3RhdGljIEZMQVNIIEJhbmsgY29uZmlndXJhdGlvbiBoZXJlIC0gRklYTUUgWFhYICovCi0Jc2l6ZV9iMCA9IGZsYXNoX2dldF9zaXplKChGUFcgKilGTEFTSF9CQVNFMF9QUkVMSU0sICZmbGFzaF9pbmZvWzBdKTsKKwlzaXplX2IwID0gZmxhc2hfZ2V0X3NpemUgKChGUFcgKikgRkxBU0hfQkFTRTBfUFJFTElNLCAmZmxhc2hfaW5mb1swXSk7CiAKIAlpZiAoZmxhc2hfaW5mb1swXS5mbGFzaF9pZCA9PSBGTEFTSF9VTktOT1dOKSB7CiAJCXByaW50ZiAoIiMjIFVua25vd24gRkxBU0ggb24gQmFuayAwIC0gU2l6ZSA9IDB4JTA4bHggPSAlbGQgTUJcbiIsCi0JCQlzaXplX2IwLCBzaXplX2IwPDwyMCk7CisJCQlzaXplX2IwLCBzaXplX2IwIDw8IDIwKTsKIAl9CiAKIAkvKiBSZW1hcCBGTEFTSCBhY2NvcmRpbmcgdG8gcmVhbCBzaXplICovCkBAIC05NywyNCArOTksMjQgQEAKIAltZW1jdGwtPm1lbWNfYnIwID0gKENGR19GTEFTSF9CQVNFICYgQlJfQkFfTVNLKSB8IEJSX1BTXzE2IHwgQlJfTVNfR1BDTSB8IEJSX1Y7CiAKIAkvKiBSZS1kbyBzaXppbmcgdG8gZ2V0IGZ1bGwgY29ycmVjdCBpbmZvICovCi0Jc2l6ZV9iMCA9IGZsYXNoX2dldF9zaXplKChGUFcgKilDRkdfRkxBU0hfQkFTRSwgJmZsYXNoX2luZm9bMF0pOworCXNpemVfYjAgPSBmbGFzaF9nZXRfc2l6ZSAoKEZQVyAqKSBDRkdfRkxBU0hfQkFTRSwgJmZsYXNoX2luZm9bMF0pOwogCiAJZmxhc2hfZ2V0X29mZnNldHMgKENGR19GTEFTSF9CQVNFLCAmZmxhc2hfaW5mb1swXSk7CiAKICNpZiBDRkdfTU9OSVRPUl9CQVNFID49IENGR19GTEFTSF9CQVNFCiAJLyogbW9uaXRvciBwcm90ZWN0aW9uIE9OIGJ5IGRlZmF1bHQgKi8KLQkodm9pZClmbGFzaF9wcm90ZWN0KEZMQUdfUFJPVEVDVF9TRVQsCi0JCQkgICAgQ0ZHX0ZMQVNIX0JBU0UsCi0JCQkgICAgQ0ZHX0ZMQVNIX0JBU0UrQ0ZHX01PTklUT1JfTEVOLTEsCi0JCQkgICAgJmZsYXNoX2luZm9bMF0pOworCSh2b2lkKSBmbGFzaF9wcm90ZWN0IChGTEFHX1BST1RFQ1RfU0VULAorCQkJCUNGR19GTEFTSF9CQVNFLAorCQkJCUNGR19GTEFTSF9CQVNFICsgQ0ZHX01PTklUT1JfTEVOIC0gMSwKKwkJCQkmZmxhc2hfaW5mb1swXSk7CiAjZW5kaWYKIAogI2lmZGVmCUNGR19FTlZfSVNfSU5fRkxBU0gKIAkvKiBFTlYgcHJvdGVjdGlvbiBPTiBieSBkZWZhdWx0ICovCi0JZmxhc2hfcHJvdGVjdChGTEFHX1BST1RFQ1RfU0VULAotCQkgICAgICBDRkdfRU5WX0FERFIsCi0JCSAgICAgIENGR19FTlZfQUREUitDRkdfRU5WX1NJWkUtMSwKLQkJICAgICAgJmZsYXNoX2luZm9bMF0pOworCWZsYXNoX3Byb3RlY3QgKEZMQUdfUFJPVEVDVF9TRVQsCisJCQlDRkdfRU5WX0FERFIsCisJCQlDRkdfRU5WX0FERFIgKyBDRkdfRU5WX1NJWkUgLSAxLAorCQkJJmZsYXNoX2luZm9bMF0pOwogI2VuZGlmCiAKIAlmbGFzaF9pbmZvWzBdLnNpemUgPSBzaXplX2IwOwpAQCAtMTI0LDcgKzEyNiw3IEBACiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqLwotc3RhdGljIHZvaWQgZmxhc2hfZ2V0X29mZnNldHMgKHVsb25nIGJhc2UsIGZsYXNoX2luZm9fdCAqaW5mbykKK3N0YXRpYyB2b2lkIGZsYXNoX2dldF9vZmZzZXRzICh1bG9uZyBiYXNlLCBmbGFzaF9pbmZvX3QgKiBpbmZvKQogewogCWludCBpOwogCkBAIC0xNDEsNyArMTQzLDcgQEAKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICovCi12b2lkIGZsYXNoX3ByaW50X2luZm8gIChmbGFzaF9pbmZvX3QgKmluZm8pCit2b2lkIGZsYXNoX3ByaW50X2luZm8gKGZsYXNoX2luZm9fdCAqIGluZm8pCiB7CiAJaW50IGk7CiAKQEAgLTE1MSwzMSArMTUzLDM5IEBACiAJfQogCiAJc3dpdGNoIChpbmZvLT5mbGFzaF9pZCAmIEZMQVNIX1ZFTkRNQVNLKSB7Ci0JCWNhc2UgRkxBU0hfTUFOX0lOVEVMOglwcmludGYgKCJJTlRFTCAiKTsJCWJyZWFrOwotCQlkZWZhdWx0OgkJcHJpbnRmICgiVW5rbm93biBWZW5kb3IgIik7CWJyZWFrOworCWNhc2UgRkxBU0hfTUFOX0lOVEVMOgorCQlwcmludGYgKCJJTlRFTCAiKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRmICgiVW5rbm93biBWZW5kb3IgIik7CisJCWJyZWFrOwogCX0KIAogCXN3aXRjaCAoaW5mby0+Zmxhc2hfaWQgJiBGTEFTSF9UWVBFTUFTSykgewotICAgY2FzZSBGTEFTSF8yOEYzMjBKM0E6Ci0JCQkJcHJpbnRmICgiMjhGMzIwSjNBXG4iKTsgYnJlYWs7Ci0gICBjYXNlIEZMQVNIXzI4RjY0MEozQToKLQkJCQlwcmludGYgKCIyOEY2NDBKM0FcbiIpOyBicmVhazsKLSAgIGNhc2UgRkxBU0hfMjhGMTI4SjNBOgotCQkJCXByaW50ZiAoIjI4RjEyOEozQVxuIik7IGJyZWFrOwotCWRlZmF1bHQ6CQlwcmludGYgKCJVbmtub3duIENoaXAgVHlwZVxuIik7IGJyZWFrOworCWNhc2UgRkxBU0hfMjhGMzIwSjNBOgorCQlwcmludGYgKCIyOEYzMjBKM0FcbiIpOworCQlicmVhazsKKwljYXNlIEZMQVNIXzI4RjY0MEozQToKKwkJcHJpbnRmICgiMjhGNjQwSjNBXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBGTEFTSF8yOEYxMjhKM0E6CisJCXByaW50ZiAoIjI4RjEyOEozQVxuIik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ZiAoIlVua25vd24gQ2hpcCBUeXBlXG4iKTsKKwkJYnJlYWs7CiAJfQogCiAJcHJpbnRmICgiICBTaXplOiAlbGQgTUIgaW4gJWQgU2VjdG9yc1xuIiwKLQkJaW5mby0+c2l6ZSA+PiAyMCwgaW5mby0+c2VjdG9yX2NvdW50KTsKKwkJCWluZm8tPnNpemUgPj4gMjAsIGluZm8tPnNlY3Rvcl9jb3VudCk7CiAKIAlwcmludGYgKCIgIFNlY3RvciBTdGFydCBBZGRyZXNzZXM6Iik7Ci0JZm9yIChpPTA7IGk8aW5mby0+c2VjdG9yX2NvdW50OyArK2kpIHsKKwlmb3IgKGkgPSAwOyBpIDwgaW5mby0+c2VjdG9yX2NvdW50OyArK2kpIHsKIAkJaWYgKChpICUgNSkgPT0gMCkKIAkJCXByaW50ZiAoIlxuICAgIik7CiAJCXByaW50ZiAoIiAlMDhsWCVzIiwKIAkJCWluZm8tPnN0YXJ0W2ldLAotCQkJaW5mby0+cHJvdGVjdFtpXSA/ICIgKFJPKSIgOiAiICAgICAiCi0JCSk7CisJCQlpbmZvLT5wcm90ZWN0W2ldID8gIiAoUk8pIiA6ICIgICAgICIpOwogCX0KIAlwcmludGYgKCJcbiIpOwogCXJldHVybjsKQEAgLTE5Miw0OSArMjAyLDUzIEBACiAgKiBUaGUgZm9sbG93aW5nIGNvZGUgY2Fubm90IGJlIHJ1biBmcm9tIEZMQVNIIQogICovCiAKLXN0YXRpYyB1bG9uZyBmbGFzaF9nZXRfc2l6ZSAoRlBXICphZGRyLCBmbGFzaF9pbmZvX3QgKmluZm8pCitzdGF0aWMgdWxvbmcgZmxhc2hfZ2V0X3NpemUgKEZQVyAqIGFkZHIsIGZsYXNoX2luZm9fdCAqIGluZm8pCiB7CiAJRlBXIHZhbHVlOwogCiAJLyogV3JpdGUgYXV0byBzZWxlY3QgY29tbWFuZDogcmVhZCBNYW51ZmFjdHVyZXIgSUQgKi8KLQlhZGRyWzB4NTU1NV0gPSAoRlBXKTB4MDBBQTAwQUE7Ci0JYWRkclsweDJBQUFdID0gKEZQVykweDAwNTUwMDU1OwotCWFkZHJbMHg1NTU1XSA9IChGUFcpMHgwMDkwMDA5MDsKKwlhZGRyWzB4NTU1NV0gPSAoRlBXKSAweDAwQUEwMEFBOworCWFkZHJbMHgyQUFBXSA9IChGUFcpIDB4MDA1NTAwNTU7CisJYWRkclsweDU1NTVdID0gKEZQVykgMHgwMDkwMDA5MDsKIAogCXZhbHVlID0gYWRkclswXTsKIAotICAgc3dpdGNoICh2YWx1ZSkgewotICAgY2FzZSAoRlBXKUlOVEVMX01BTlVGQUNUOgotICAgICAgaW5mby0+Zmxhc2hfaWQgPSBGTEFTSF9NQU5fSU5URUw7Ci0gICAgICBicmVhazsKKwlkZWJ1ZyAoIk1hbnVmLiBJRCBAIDB4JTA4bHg6IDB4JTA4bHhcbiIsICh1bG9uZylhZGRyLCB2YWx1ZSk7CisKKwlzd2l0Y2ggKHZhbHVlKSB7CisJY2FzZSAoRlBXKSBJTlRFTF9NQU5VRkFDVDoKKwkJaW5mby0+Zmxhc2hfaWQgPSBGTEFTSF9NQU5fSU5URUw7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWluZm8tPmZsYXNoX2lkID0gRkxBU0hfVU5LTk9XTjsKIAkJaW5mby0+c2VjdG9yX2NvdW50ID0gMDsKIAkJaW5mby0+c2l6ZSA9IDA7Ci0JCWFkZHJbMF0gPSAoRlBXKTB4MDBGRjAwRkY7ICAgICAgLyogcmVzdG9yZSByZWFkIG1vZGUgKi8KLQkJcmV0dXJuICgwKTsJCQkvKiBubyBvciB1bmtub3duIGZsYXNoCSovCisJCWFkZHJbMF0gPSAoRlBXKSAweDAwRkYwMEZGOwkvKiByZXN0b3JlIHJlYWQgbW9kZSAqLworCQlyZXR1cm4gKDApOwkJCS8qIG5vIG9yIHVua25vd24gZmxhc2ggICovCiAJfQogCi0JdmFsdWUgPSBhZGRyWzFdOwkJCS8qIGRldmljZSBJRAkJKi8KKwl2YWx1ZSA9IGFkZHJbMV07CQkJLyogZGV2aWNlIElEICAgICAgICAqLwogCi0gICBzd2l0Y2ggKHZhbHVlKSB7Ci0gICBjYXNlIChGUFcpSU5URUxfSURfMjhGMzIwSjNBOgotICAgICAgaW5mby0+Zmxhc2hfaWQgKz0gRkxBU0hfMjhGMzIwSjNBOwotICAgICAgaW5mby0+c2VjdG9yX2NvdW50ID0gMzI7Ci0gICAgICBpbmZvLT5zaXplID0gMHgwMDQwMDAwMDsKLSAgICAgIGJyZWFrOyAgICAgICAgICAgIC8qID0+IDQgTUIgICAgICovCisJZGVidWcgKCJEZXZpY2UgSUQgQCAweCUwOGx4OiAweCUwOGx4XG4iLCAodWxvbmcpKCZhZGRyWzFdKSwgdmFsdWUpOwogCi0gICBjYXNlIChGUFcpSU5URUxfSURfMjhGNjQwSjNBOgotICAgICAgaW5mby0+Zmxhc2hfaWQgKz0gRkxBU0hfMjhGNjQwSjNBOwotICAgICAgaW5mby0+c2VjdG9yX2NvdW50ID0gNjQ7Ci0gICAgICBpbmZvLT5zaXplID0gMHgwMDgwMDAwMDsKLSAgICAgIGJyZWFrOyAgICAgICAgICAgIC8qID0+IDggTUIgICAgICovCisJc3dpdGNoICh2YWx1ZSkgeworCWNhc2UgKEZQVykgSU5URUxfSURfMjhGMzIwSjNBOgorCQlpbmZvLT5mbGFzaF9pZCArPSBGTEFTSF8yOEYzMjBKM0E7CisJCWluZm8tPnNlY3Rvcl9jb3VudCA9IDMyOworCQlpbmZvLT5zaXplID0gMHgwMDQwMDAwMDsKKwkJYnJlYWs7CQkJCS8qID0+IDQgTUIgICAgICovCiAKLSAgIGNhc2UgKEZQVylJTlRFTF9JRF8yOEYxMjhKM0E6Ci0gICAgICBpbmZvLT5mbGFzaF9pZCArPSBGTEFTSF8yOEYxMjhKM0E7Ci0gICAgICBpbmZvLT5zZWN0b3JfY291bnQgPSAxMjg7Ci0gICAgICBpbmZvLT5zaXplID0gMHgwMTAwMDAwMDsKLSAgICAgIGJyZWFrOyAgICAgICAgICAgIC8qID0+IDE2IE1CICAgICAqLworCWNhc2UgKEZQVykgSU5URUxfSURfMjhGNjQwSjNBOgorCQlpbmZvLT5mbGFzaF9pZCArPSBGTEFTSF8yOEY2NDBKM0E7CisJCWluZm8tPnNlY3Rvcl9jb3VudCA9IDY0OworCQlpbmZvLT5zaXplID0gMHgwMDgwMDAwMDsKKwkJYnJlYWs7CQkJCS8qID0+IDggTUIgICAgICovCisKKwljYXNlIChGUFcpIElOVEVMX0lEXzI4RjEyOEozQToKKwkJaW5mby0+Zmxhc2hfaWQgKz0gRkxBU0hfMjhGMTI4SjNBOworCQlpbmZvLT5zZWN0b3JfY291bnQgPSAxMjg7CisJCWluZm8tPnNpemUgPSAweDAxMDAwMDAwOworCQlicmVhazsJCQkJLyogPT4gMTYgTUIgICAgICovCiAKIAlkZWZhdWx0OgogCQlpbmZvLT5mbGFzaF9pZCA9IEZMQVNIX1VOS05PV047CkBAIC0yNDMsMTEgKzI1NywxMSBAQAogCiAJaWYgKGluZm8tPnNlY3Rvcl9jb3VudCA+IENGR19NQVhfRkxBU0hfU0VDVCkgewogCQlwcmludGYgKCIqKiBFUlJPUjogc2VjdG9yIGNvdW50ICVkID4gbWF4ICglZCkgKipcbiIsCi0JCQlpbmZvLT5zZWN0b3JfY291bnQsIENGR19NQVhfRkxBU0hfU0VDVCk7CisJCQkJaW5mby0+c2VjdG9yX2NvdW50LCBDRkdfTUFYX0ZMQVNIX1NFQ1QpOwogCQlpbmZvLT5zZWN0b3JfY291bnQgPSBDRkdfTUFYX0ZMQVNIX1NFQ1Q7CiAJfQogCi0JYWRkclswXSA9IChGUFcpMHgwMEZGMDBGRjsgICAgICAvKiByZXN0b3JlIHJlYWQgbW9kZSAqLworCWFkZHJbMF0gPSAoRlBXKSAweDAwRkYwMEZGOwkvKiByZXN0b3JlIHJlYWQgbW9kZSAqLwogCiAJcmV0dXJuIChpbmZvLT5zaXplKTsKIH0KQEAgLTI1Niw3ICsyNzAsNyBAQAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICovCiAKLWludAlmbGFzaF9lcmFzZSAoZmxhc2hfaW5mb190ICppbmZvLCBpbnQgc19maXJzdCwgaW50IHNfbGFzdCkKK2ludCBmbGFzaF9lcmFzZSAoZmxhc2hfaW5mb190ICogaW5mbywgaW50IHNfZmlyc3QsIGludCBzX2xhc3QpCiB7CiAJaW50IGZsYWcsIHByb3QsIHNlY3Q7CiAJdWxvbmcgdHlwZSwgc3RhcnQsIG5vdywgbGFzdDsKQEAgLTI3OSw3ICsyOTMsNyBAQAogCX0KIAogCXByb3QgPSAwOwotCWZvciAoc2VjdD1zX2ZpcnN0OyBzZWN0PD1zX2xhc3Q7ICsrc2VjdCkgeworCWZvciAoc2VjdCA9IHNfZmlyc3Q7IHNlY3QgPD0gc19sYXN0OyArK3NlY3QpIHsKIAkJaWYgKGluZm8tPnByb3RlY3Rbc2VjdF0pIHsKIAkJCXByb3QrKzsKIAkJfQpAQCAtMjkzLDQ0ICszMDcsNDQgQEAKIAl9CiAKIAlzdGFydCA9IGdldF90aW1lciAoMCk7Ci0JbGFzdCAgPSBzdGFydDsKKwlsYXN0ID0gc3RhcnQ7CiAJLyogU3RhcnQgZXJhc2Ugb24gdW5wcm90ZWN0ZWQgc2VjdG9ycyAqLwotCWZvciAoc2VjdCA9IHNfZmlyc3Q7IHNlY3Q8PXNfbGFzdDsgc2VjdCsrKSB7CisJZm9yIChzZWN0ID0gc19maXJzdDsgc2VjdCA8PSBzX2xhc3Q7IHNlY3QrKykgewogCQlpZiAoaW5mby0+cHJvdGVjdFtzZWN0XSA9PSAwKSB7CS8qIG5vdCBwcm90ZWN0ZWQgKi8KLQkJCUZQV1YgKmFkZHIgPSAoRlBXViAqKShpbmZvLT5zdGFydFtzZWN0XSk7CisJCQlGUFdWICphZGRyID0gKEZQV1YgKikgKGluZm8tPnN0YXJ0W3NlY3RdKTsKIAkJCUZQVyBzdGF0dXM7CiAKIAkJCS8qIERpc2FibGUgaW50ZXJydXB0cyB3aGljaCBtaWdodCBjYXVzZSBhIHRpbWVvdXQgaGVyZSAqLwotCQkJZmxhZyA9IGRpc2FibGVfaW50ZXJydXB0cygpOworCQkJZmxhZyA9IGRpc2FibGVfaW50ZXJydXB0cyAoKTsKIAotCQkJKmFkZHIgPSAoRlBXKTB4MDA1MDAwNTA7CS8qIGNsZWFyIHN0YXR1cyByZWdpc3RlciAqLwotCQkJKmFkZHIgPSAoRlBXKTB4MDAyMDAwMjA7CS8qIGVyYXNlIHNldHVwICovCi0JCQkqYWRkciA9IChGUFcpMHgwMEQwMDBEMDsJLyogZXJhc2UgY29uZmlybSAqLworCQkJKmFkZHIgPSAoRlBXKSAweDAwNTAwMDUwOwkvKiBjbGVhciBzdGF0dXMgcmVnaXN0ZXIgKi8KKwkJCSphZGRyID0gKEZQVykgMHgwMDIwMDAyMDsJLyogZXJhc2Ugc2V0dXAgKi8KKwkJCSphZGRyID0gKEZQVykgMHgwMEQwMDBEMDsJLyogZXJhc2UgY29uZmlybSAqLwogCiAJCQkvKiByZS1lbmFibGUgaW50ZXJydXB0cyBpZiBuZWNlc3NhcnkgKi8KIAkJCWlmIChmbGFnKQotCQkJCWVuYWJsZV9pbnRlcnJ1cHRzKCk7CisJCQkJZW5hYmxlX2ludGVycnVwdHMgKCk7CiAKIAkJCS8qIHdhaXQgYXQgbGVhc3QgODB1cyAtIGxldCdzIHdhaXQgMSBtcyAqLwogCQkJdWRlbGF5ICgxMDAwKTsKIAotCQkJd2hpbGUgKCgoc3RhdHVzID0gKmFkZHIpICYgKEZQVykweDAwODAwMDgwKSAhPSAoRlBXKTB4MDA4MDAwODApIHsKLQkJCQlpZiAoKG5vdz1nZXRfdGltZXIoc3RhcnQpKSA+IENGR19GTEFTSF9FUkFTRV9UT1VUKSB7Ci0JCQkJCXByaW50ZiAoIlRpbWVvdXRcbiIpOwotCQkJCQkqYWRkciA9IChGUFcpMHgwMEIwMDBCMDsgLyogc3VzcGVuZCBlcmFzZQkgICovCi0JCQkJCSphZGRyID0gKEZQVykweDAwRkYwMEZGOyAvKiByZXNldCB0byByZWFkIG1vZGUgKi8KLQkJCQkJcmNvZGUgPSAxOwotCQkJCQlicmVhazsKLQkJCQl9CisJCQl3aGlsZSAoKChzdGF0dXMgPSAqYWRkcikgJiAoRlBXKSAweDAwODAwMDgwKSAhPSAoRlBXKSAweDAwODAwMDgwKSB7CisJCQkgICAgaWYgKChub3cgPSBnZXRfdGltZXIgKHN0YXJ0KSkgPiBDRkdfRkxBU0hfRVJBU0VfVE9VVCkgeworCQkJCXByaW50ZiAoIlRpbWVvdXRcbiIpOworCQkJCSphZGRyID0gKEZQVykgMHgwMEIwMDBCMDsJLyogc3VzcGVuZCBlcmFzZSAgICAgKi8KKwkJCQkqYWRkciA9IChGUFcpIDB4MDBGRjAwRkY7CS8qIHJlc2V0IHRvIHJlYWQgbW9kZSAqLworCQkJCXJjb2RlID0gMTsKKwkJCQlicmVhazsKKwkJCSAgICB9CiAKLQkJCQkvKiBzaG93IHRoYXQgd2UncmUgd2FpdGluZyAqLwotCQkJaWYgKChub3cgLSBsYXN0KSA+IDEwMDApIHsJLyogZXZlcnkgc2Vjb25kICovCi0JCQkJCXB1dGMgKCcuJyk7Ci0JCQkJCWxhc3QgPSBub3c7Ci0JCQkJfQorCQkJICAgIC8qIHNob3cgdGhhdCB3ZSdyZSB3YWl0aW5nICovCisJCQkgICAgaWYgKChub3cgLSBsYXN0KSA+IDEwMDApIHsJLyogZXZlcnkgc2Vjb25kICovCisJCQkJcHV0YyAoJy4nKTsKKwkJCQlsYXN0ID0gbm93OworCQkJICAgIH0KIAkJCX0KIAotCQkJKmFkZHIgPSAoRlBXKTB4MDBGRjAwRkY7CS8qIHJlc2V0IHRvIHJlYWQgbW9kZSAqLworCQkJKmFkZHIgPSAoRlBXKSAweDAwRkYwMEZGOwkvKiByZXNldCB0byByZWFkIG1vZGUgKi8KIAkJfQogCX0KIAlwcmludGYgKCIgZG9uZVxuIik7CkBAIC0zNDUsMTUgKzM1OSwxMiBAQAogICogNCAtIEZsYXNoIG5vdCBpZGVudGlmaWVkCiAgKi8KIAotaW50IHdyaXRlX2J1ZmYgKGZsYXNoX2luZm9fdCAqaW5mbywgdWNoYXIgKnNyYywgdWxvbmcgYWRkciwgdWxvbmcgY250KQoraW50IHdyaXRlX2J1ZmYgKGZsYXNoX2luZm9fdCAqIGluZm8sIHVjaGFyICogc3JjLCB1bG9uZyBhZGRyLCB1bG9uZyBjbnQpCiB7CiAJdWxvbmcgY3AsIHdwOwogCUZQVyBkYXRhOwotI2lmIDAKLQlpbnQgY291bnQsIGksIGwsIHJjLCBwb3J0X3dpZHRoOwotI2Vsc2UKKwogCWludCBpLCBsLCByYywgcG9ydF93aWR0aDsKLSNlbmRpZgogCiAJaWYgKGluZm8tPmZsYXNoX2lkID09IEZMQVNIX1VOS05PV04pIHsKIAkJcmV0dXJuIDQ7CkBAIC0zNzIsMTkgKzM4MywxOSBAQAogCSAqLwogCWlmICgobCA9IGFkZHIgLSB3cCkgIT0gMCkgewogCQlkYXRhID0gMDsKLQkJZm9yIChpPTAsIGNwPXdwOyBpPGw7ICsraSwgKytjcCkgewotCQkJZGF0YSA9IChkYXRhIDw8IDgpIHwgKCoodWNoYXIgKiljcCk7CisJCWZvciAoaSA9IDAsIGNwID0gd3A7IGkgPCBsOyArK2ksICsrY3ApIHsKKwkJCWRhdGEgPSAoZGF0YSA8PCA4KSB8ICgqKHVjaGFyICopIGNwKTsKIAkJfQotCQlmb3IgKDsgaTxwb3J0X3dpZHRoICYmIGNudD4wOyArK2kpIHsKKwkJZm9yICg7IGkgPCBwb3J0X3dpZHRoICYmIGNudCA+IDA7ICsraSkgewogCQkJZGF0YSA9IChkYXRhIDw8IDgpIHwgKnNyYysrOwogCQkJLS1jbnQ7CiAJCQkrK2NwOwogCQl9Ci0JCWZvciAoOyBjbnQ9PTAgJiYgaTxwb3J0X3dpZHRoOyArK2ksICsrY3ApIHsKLQkJCWRhdGEgPSAoZGF0YSA8PCA4KSB8ICgqKHVjaGFyICopY3ApOworCQlmb3IgKDsgY250ID09IDAgJiYgaSA8IHBvcnRfd2lkdGg7ICsraSwgKytjcCkgeworCQkJZGF0YSA9IChkYXRhIDw8IDgpIHwgKCoodWNoYXIgKikgY3ApOwogCQl9CiAKLQkJaWYgKChyYyA9IHdyaXRlX2RhdGEoaW5mbywgd3AsIGRhdGEpKSAhPSAwKSB7CisJCWlmICgocmMgPSB3cml0ZV9kYXRhIChpbmZvLCB3cCwgZGF0YSkpICE9IDApIHsKIAkJCXJldHVybiAocmMpOwogCQl9CiAJCXdwICs9IHBvcnRfd2lkdGg7CkBAIC0zOTMsMjYgKzQwNCwxNiBAQAogCS8qCiAJICogaGFuZGxlIHdvcmQgYWxpZ25lZCBwYXJ0CiAJICovCi0jaWYgMAotCWNvdW50ID0gMDsKLSNlbmRpZgogCXdoaWxlIChjbnQgPj0gcG9ydF93aWR0aCkgewogCQlkYXRhID0gMDsKLQkJZm9yIChpPTA7IGk8cG9ydF93aWR0aDsgKytpKSB7CisJCWZvciAoaSA9IDA7IGkgPCBwb3J0X3dpZHRoOyArK2kpIHsKIAkJCWRhdGEgPSAoZGF0YSA8PCA4KSB8ICpzcmMrKzsKIAkJfQotCQlpZiAoKHJjID0gd3JpdGVfZGF0YShpbmZvLCB3cCwgZGF0YSkpICE9IDApIHsKKwkJaWYgKChyYyA9IHdyaXRlX2RhdGEgKGluZm8sIHdwLCBkYXRhKSkgIT0gMCkgewogCQkJcmV0dXJuIChyYyk7CiAJCX0KLQkJd3AgICs9IHBvcnRfd2lkdGg7CisJCXdwICs9IHBvcnRfd2lkdGg7CiAJCWNudCAtPSBwb3J0X3dpZHRoOwotI2lmIDAKLQkJaWYgKGNvdW50KysgPiAweDIwMDAwKQotCQl7Ci0JCQlwdXRjKCcuJyk7Ci0JCQljb3VudCA9IDA7Ci0JCX0KLSNlbmRpZgogCX0KIAogCWlmIChjbnQgPT0gMCkgewpAQCAtNDIzLDE1ICs0MjQsMTUgQEAKIAkgKiBoYW5kbGUgdW5hbGlnbmVkIHRhaWwgYnl0ZXMKIAkgKi8KIAlkYXRhID0gMDsKLQlmb3IgKGk9MCwgY3A9d3A7IGk8cG9ydF93aWR0aCAmJiBjbnQ+MDsgKytpLCArK2NwKSB7CisJZm9yIChpID0gMCwgY3AgPSB3cDsgaSA8IHBvcnRfd2lkdGggJiYgY250ID4gMDsgKytpLCArK2NwKSB7CiAJCWRhdGEgPSAoZGF0YSA8PCA4KSB8ICpzcmMrKzsKIAkJLS1jbnQ7CiAJfQotCWZvciAoOyBpPHBvcnRfd2lkdGg7ICsraSwgKytjcCkgewotCQlkYXRhID0gKGRhdGEgPDwgOCkgfCAoKih1Y2hhciAqKWNwKTsKKwlmb3IgKDsgaSA8IHBvcnRfd2lkdGg7ICsraSwgKytjcCkgeworCQlkYXRhID0gKGRhdGEgPDwgOCkgfCAoKih1Y2hhciAqKSBjcCk7CiAJfQogCi0JcmV0dXJuICh3cml0ZV9kYXRhKGluZm8sIHdwLCBkYXRhKSk7CisJcmV0dXJuICh3cml0ZV9kYXRhIChpbmZvLCB3cCwgZGF0YSkpOwogfQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC00NDAsMzkgKzQ0MSwzOCBAQAogICogMSAtIHdyaXRlIHRpbWVvdXQKICAqIDIgLSBGbGFzaCBub3QgZXJhc2VkCiAgKi8KLXN0YXRpYyBpbnQgd3JpdGVfZGF0YSAoZmxhc2hfaW5mb190ICppbmZvLCB1bG9uZyBkZXN0LCBGUFcgZGF0YSkKK3N0YXRpYyBpbnQgd3JpdGVfZGF0YSAoZmxhc2hfaW5mb190ICogaW5mbywgdWxvbmcgZGVzdCwgRlBXIGRhdGEpCiB7Ci0JRlBXViAqYWRkciA9IChGUFdWICopZGVzdDsKKwlGUFdWICphZGRyID0gKEZQV1YgKikgZGVzdDsKIAl1bG9uZyBzdGF0dXM7CiAJdWxvbmcgc3RhcnQ7CiAJaW50IGZsYWc7CiAKIAkvKiBDaGVjayBpZiBGbGFzaCBpcyAoc3VmZmljaWVudGx5KSBlcmFzZWQgKi8KIAlpZiAoKCphZGRyICYgZGF0YSkgIT0gZGF0YSkgewotCQlwcmludGYoIm5vdCBlcmFzZWQgYXQgJTA4bHggKCV4KVxuIiwodWxvbmcpYWRkciwqYWRkcik7CisJCXByaW50ZiAoIm5vdCBlcmFzZWQgYXQgJTA4bHggKCV4KVxuIiwgKHVsb25nKSBhZGRyLCAqYWRkcik7CiAJCXJldHVybiAoMik7CiAJfQogCS8qIERpc2FibGUgaW50ZXJydXB0cyB3aGljaCBtaWdodCBjYXVzZSBhIHRpbWVvdXQgaGVyZSAqLwotCWZsYWcgPSBkaXNhYmxlX2ludGVycnVwdHMoKTsKKwlmbGFnID0gZGlzYWJsZV9pbnRlcnJ1cHRzICgpOwogCi0JKmFkZHIgPSAoRlBXKTB4MDA0MDAwNDA7CQkvKiB3cml0ZSBzZXR1cCAqLworCSphZGRyID0gKEZQVykgMHgwMDQwMDA0MDsJLyogd3JpdGUgc2V0dXAgKi8KIAkqYWRkciA9IGRhdGE7CiAKIAkvKiByZS1lbmFibGUgaW50ZXJydXB0cyBpZiBuZWNlc3NhcnkgKi8KIAlpZiAoZmxhZykKLQkJZW5hYmxlX2ludGVycnVwdHMoKTsKKwkJZW5hYmxlX2ludGVycnVwdHMgKCk7CiAKIAlzdGFydCA9IGdldF90aW1lciAoMCk7CiAKLQl3aGlsZSAoKChzdGF0dXMgPSAqYWRkcikgJiAoRlBXKTB4MDA4MDAwODApICE9IChGUFcpMHgwMDgwMDA4MCkgewotCQlpZiAoZ2V0X3RpbWVyKHN0YXJ0KSA+IENGR19GTEFTSF9XUklURV9UT1VUKSB7Ci0JCQkqYWRkciA9IChGUFcpMHgwMEZGMDBGRjsJLyogcmVzdG9yZSByZWFkIG1vZGUgKi8KKwl3aGlsZSAoKChzdGF0dXMgPSAqYWRkcikgJiAoRlBXKSAweDAwODAwMDgwKSAhPSAoRlBXKSAweDAwODAwMDgwKSB7CisJCWlmIChnZXRfdGltZXIgKHN0YXJ0KSA+IENGR19GTEFTSF9XUklURV9UT1VUKSB7CisJCQkqYWRkciA9IChGUFcpIDB4MDBGRjAwRkY7CS8qIHJlc3RvcmUgcmVhZCBtb2RlICovCiAJCQlyZXR1cm4gKDEpOwogCQl9CiAJfQogCi0JKmFkZHIgPSAoRlBXKTB4MDBGRjAwRkY7CS8qIHJlc3RvcmUgcmVhZCBtb2RlICovCisJKmFkZHIgPSAoRlBXKSAweDAwRkYwMEZGOwkvKiByZXN0b3JlIHJlYWQgbW9kZSAqLwogCiAJcmV0dXJuICgwKTsKIH0KLQo=